diff options
1466 files changed, 150829 insertions, 68776 deletions
diff --git a/colors/icc/profiles/default_gray.icc b/colors/icc/profiles/default_gray.icc Binary files differnew file mode 100644 index 000000000..daaa7480a --- /dev/null +++ b/colors/icc/profiles/default_gray.icc diff --git a/context/data/scite/context/lexers/data/scite-context-data-bidi.lua b/context/data/scite/context/lexers/data/scite-context-data-bidi.lua new file mode 100644 index 000000000..4221dee89 --- /dev/null +++ b/context/data/scite/context/lexers/data/scite-context-data-bidi.lua @@ -0,0 +1,10357 @@ +return { + ["comment"]="generated by: mtxrun -- script interface.lua --bidi", + ["directions"]={ + [0]="bn", + "bn", + "bn", + "bn", + "bn", + "bn", + "bn", + "bn", + "bn", + "s", + "b", + "s", + "ws", + "b", + "bn", + "bn", + "bn", + "bn", + "bn", + "bn", + "bn", + "bn", + "bn", + "bn", + "bn", + "bn", + "bn", + "bn", + "b", + "b", + "b", + "s", + "ws", + "on", + "on", + "et", + "et", + "et", + "on", + "on", + "on", + "on", + "on", + "es", + "cs", + "es", + "cs", + "cs", + "en", + "en", + "en", + "en", + "en", + "en", + "en", + "en", + "en", + "en", + "cs", + "on", + "on", + "on", + "on", + "on", + "on", + [91]="on", + [92]="on", + [93]="on", + [94]="on", + [95]="on", + [96]="on", + [123]="on", + [124]="on", + [125]="on", + [126]="on", + [127]="bn", + [128]="bn", + [129]="bn", + [130]="bn", + [131]="bn", + [132]="bn", + [133]="b", + [134]="bn", + [135]="bn", + [136]="bn", + [137]="bn", + [138]="bn", + [139]="bn", + [140]="bn", + [141]="bn", + [142]="bn", + [143]="bn", + [144]="bn", + [145]="bn", + [146]="bn", + [147]="bn", + [148]="bn", + [149]="bn", + [150]="bn", + [151]="bn", + [152]="bn", + [153]="bn", + [154]="bn", + [155]="bn", + [156]="bn", + [157]="bn", + [158]="bn", + [159]="bn", + [160]="cs", + [161]="on", + [162]="et", + [163]="et", + [164]="et", + [165]="et", + [166]="on", + [167]="on", + [168]="on", + [169]="on", + [171]="on", + [172]="on", + [173]="bn", + [174]="on", + [175]="on", + [176]="et", + [177]="et", + [178]="en", + [179]="en", + [180]="on", + [182]="on", + [183]="on", + [184]="on", + [185]="en", + [187]="on", + [188]="on", + [189]="on", + [190]="on", + [191]="on", + [215]="on", + [247]="on", + [697]="on", + [698]="on", + [706]="on", + [707]="on", + [708]="on", + [709]="on", + [710]="on", + [711]="on", + [712]="on", + [713]="on", + [714]="on", + [715]="on", + [716]="on", + [717]="on", + [718]="on", + [719]="on", + [722]="on", + [723]="on", + [724]="on", + [725]="on", + [726]="on", + [727]="on", + [728]="on", + [729]="on", + [730]="on", + [731]="on", + [732]="on", + [733]="on", + [734]="on", + [735]="on", + [741]="on", + [742]="on", + [743]="on", + [744]="on", + [745]="on", + [746]="on", + [747]="on", + [748]="on", + [749]="on", + [751]="on", + [752]="on", + [753]="on", + [754]="on", + [755]="on", + [756]="on", + [757]="on", + [758]="on", + [759]="on", + [760]="on", + [761]="on", + [762]="on", + [763]="on", + [764]="on", + [765]="on", + [766]="on", + [767]="on", + [768]="nsm", + [769]="nsm", + [770]="nsm", + [771]="nsm", + [772]="nsm", + [773]="nsm", + [774]="nsm", + [775]="nsm", + [776]="nsm", + [777]="nsm", + [778]="nsm", + [779]="nsm", + [780]="nsm", + [781]="nsm", + [782]="nsm", + [783]="nsm", + [784]="nsm", + [785]="nsm", + [786]="nsm", + [787]="nsm", + [788]="nsm", + [789]="nsm", + [790]="nsm", + [791]="nsm", + [792]="nsm", + [793]="nsm", + [794]="nsm", + [795]="nsm", + [796]="nsm", + [797]="nsm", + [798]="nsm", + [799]="nsm", + [800]="nsm", + [801]="nsm", + [802]="nsm", + [803]="nsm", + [804]="nsm", + [805]="nsm", + [806]="nsm", + [807]="nsm", + [808]="nsm", + [809]="nsm", + [810]="nsm", + [811]="nsm", + [812]="nsm", + [813]="nsm", + [814]="nsm", + [815]="nsm", + [816]="nsm", + [817]="nsm", + [818]="nsm", + [819]="nsm", + [820]="nsm", + [821]="nsm", + [822]="nsm", + [823]="nsm", + [824]="nsm", + [825]="nsm", + [826]="nsm", + [827]="nsm", + [828]="nsm", + [829]="nsm", + [830]="nsm", + [831]="nsm", + [832]="nsm", + [833]="nsm", + [834]="nsm", + [835]="nsm", + [836]="nsm", + [837]="nsm", + [838]="nsm", + [839]="nsm", + [840]="nsm", + [841]="nsm", + [842]="nsm", + [843]="nsm", + [844]="nsm", + [845]="nsm", + [846]="nsm", + [847]="nsm", + [848]="nsm", + [849]="nsm", + [850]="nsm", + [851]="nsm", + [852]="nsm", + [853]="nsm", + [854]="nsm", + [855]="nsm", + [856]="nsm", + [857]="nsm", + [858]="nsm", + [859]="nsm", + [860]="nsm", + [861]="nsm", + [862]="nsm", + [863]="nsm", + [864]="nsm", + [865]="nsm", + [866]="nsm", + [867]="nsm", + [868]="nsm", + [869]="nsm", + [870]="nsm", + [871]="nsm", + [872]="nsm", + [873]="nsm", + [874]="nsm", + [875]="nsm", + [876]="nsm", + [877]="nsm", + [878]="nsm", + [879]="nsm", + [884]="on", + [885]="on", + [894]="on", + [900]="on", + [901]="on", + [903]="on", + [1014]="on", + [1155]="nsm", + [1156]="nsm", + [1157]="nsm", + [1158]="nsm", + [1159]="nsm", + [1160]="nsm", + [1161]="nsm", + [1418]="on", + [1421]="on", + [1422]="on", + [1423]="et", + [1425]="nsm", + [1426]="nsm", + [1427]="nsm", + [1428]="nsm", + [1429]="nsm", + [1430]="nsm", + [1431]="nsm", + [1432]="nsm", + [1433]="nsm", + [1434]="nsm", + [1435]="nsm", + [1436]="nsm", + [1437]="nsm", + [1438]="nsm", + [1439]="nsm", + [1440]="nsm", + [1441]="nsm", + [1442]="nsm", + [1443]="nsm", + [1444]="nsm", + [1445]="nsm", + [1446]="nsm", + [1447]="nsm", + [1448]="nsm", + [1449]="nsm", + [1450]="nsm", + [1451]="nsm", + [1452]="nsm", + [1453]="nsm", + [1454]="nsm", + [1455]="nsm", + [1456]="nsm", + [1457]="nsm", + [1458]="nsm", + [1459]="nsm", + [1460]="nsm", + [1461]="nsm", + [1462]="nsm", + [1463]="nsm", + [1464]="nsm", + [1465]="nsm", + [1466]="nsm", + [1467]="nsm", + [1468]="nsm", + [1469]="nsm", + [1470]="r", + [1471]="nsm", + [1472]="r", + [1473]="nsm", + [1474]="nsm", + [1475]="r", + [1476]="nsm", + [1477]="nsm", + [1478]="r", + [1479]="nsm", + [1488]="r", + [1489]="r", + [1490]="r", + [1491]="r", + [1492]="r", + [1493]="r", + [1494]="r", + [1495]="r", + [1496]="r", + [1497]="r", + [1498]="r", + [1499]="r", + [1500]="r", + [1501]="r", + [1502]="r", + [1503]="r", + [1504]="r", + [1505]="r", + [1506]="r", + [1507]="r", + [1508]="r", + [1509]="r", + [1510]="r", + [1511]="r", + [1512]="r", + [1513]="r", + [1514]="r", + [1520]="r", + [1521]="r", + [1522]="r", + [1523]="r", + [1524]="r", + [1536]="an", + [1537]="an", + [1538]="an", + [1539]="an", + [1540]="an", + [1541]="an", + [1542]="on", + [1543]="on", + [1544]="al", + [1545]="et", + [1546]="et", + [1547]="al", + [1548]="cs", + [1549]="al", + [1550]="on", + [1551]="on", + [1552]="nsm", + [1553]="nsm", + [1554]="nsm", + [1555]="nsm", + [1556]="nsm", + [1557]="nsm", + [1558]="nsm", + [1559]="nsm", + [1560]="nsm", + [1561]="nsm", + [1562]="nsm", + [1563]="al", + [1564]="al", + [1566]="al", + [1567]="al", + [1568]="al", + [1569]="al", + [1570]="al", + [1571]="al", + [1572]="al", + [1573]="al", + [1574]="al", + [1575]="al", + [1576]="al", + [1577]="al", + [1578]="al", + [1579]="al", + [1580]="al", + [1581]="al", + [1582]="al", + [1583]="al", + [1584]="al", + [1585]="al", + [1586]="al", + [1587]="al", + [1588]="al", + [1589]="al", + [1590]="al", + [1591]="al", + [1592]="al", + [1593]="al", + [1594]="al", + [1595]="al", + [1596]="al", + [1597]="al", + [1598]="al", + [1599]="al", + [1600]="al", + [1601]="al", + [1602]="al", + [1603]="al", + [1604]="al", + [1605]="al", + [1606]="al", + [1607]="al", + [1608]="al", + [1609]="al", + [1610]="al", + [1611]="nsm", + [1612]="nsm", + [1613]="nsm", + [1614]="nsm", + [1615]="nsm", + [1616]="nsm", + [1617]="nsm", + [1618]="nsm", + [1619]="nsm", + [1620]="nsm", + [1621]="nsm", + [1622]="nsm", + [1623]="nsm", + [1624]="nsm", + [1625]="nsm", + [1626]="nsm", + [1627]="nsm", + [1628]="nsm", + [1629]="nsm", + [1630]="nsm", + [1631]="nsm", + [1632]="an", + [1633]="an", + [1634]="an", + [1635]="an", + [1636]="an", + [1637]="an", + [1638]="an", + [1639]="an", + [1640]="an", + [1641]="an", + [1642]="et", + [1643]="an", + [1644]="an", + [1645]="al", + [1646]="al", + [1647]="al", + [1648]="nsm", + [1649]="al", + [1650]="al", + [1651]="al", + [1652]="al", + [1653]="al", + [1654]="al", + [1655]="al", + [1656]="al", + [1657]="al", + [1658]="al", + [1659]="al", + [1660]="al", + [1661]="al", + [1662]="al", + [1663]="al", + [1664]="al", + [1665]="al", + [1666]="al", + [1667]="al", + [1668]="al", + [1669]="al", + [1670]="al", + [1671]="al", + [1672]="al", + [1673]="al", + [1674]="al", + [1675]="al", + [1676]="al", + [1677]="al", + [1678]="al", + [1679]="al", + [1680]="al", + [1681]="al", + [1682]="al", + [1683]="al", + [1684]="al", + [1685]="al", + [1686]="al", + [1687]="al", + [1688]="al", + [1689]="al", + [1690]="al", + [1691]="al", + [1692]="al", + [1693]="al", + [1694]="al", + [1695]="al", + [1696]="al", + [1697]="al", + [1698]="al", + [1699]="al", + [1700]="al", + [1701]="al", + [1702]="al", + [1703]="al", + [1704]="al", + [1705]="al", + [1706]="al", + [1707]="al", + [1708]="al", + [1709]="al", + [1710]="al", + [1711]="al", + [1712]="al", + [1713]="al", + [1714]="al", + [1715]="al", + [1716]="al", + [1717]="al", + [1718]="al", + [1719]="al", + [1720]="al", + [1721]="al", + [1722]="al", + [1723]="al", + [1724]="al", + [1725]="al", + [1726]="al", + [1727]="al", + [1728]="al", + [1729]="al", + [1730]="al", + [1731]="al", + [1732]="al", + [1733]="al", + [1734]="al", + [1735]="al", + [1736]="al", + [1737]="al", + [1738]="al", + [1739]="al", + [1740]="al", + [1741]="al", + [1742]="al", + [1743]="al", + [1744]="al", + [1745]="al", + [1746]="al", + [1747]="al", + [1748]="al", + [1749]="al", + [1750]="nsm", + [1751]="nsm", + [1752]="nsm", + [1753]="nsm", + [1754]="nsm", + [1755]="nsm", + [1756]="nsm", + [1757]="an", + [1758]="on", + [1759]="nsm", + [1760]="nsm", + [1761]="nsm", + [1762]="nsm", + [1763]="nsm", + [1764]="nsm", + [1765]="al", + [1766]="al", + [1767]="nsm", + [1768]="nsm", + [1769]="on", + [1770]="nsm", + [1771]="nsm", + [1772]="nsm", + [1773]="nsm", + [1774]="al", + [1775]="al", + [1776]="en", + [1777]="en", + [1778]="en", + [1779]="en", + [1780]="en", + [1781]="en", + [1782]="en", + [1783]="en", + [1784]="en", + [1785]="en", + [1786]="al", + [1787]="al", + [1788]="al", + [1789]="al", + [1790]="al", + [1791]="al", + [1792]="al", + [1793]="al", + [1794]="al", + [1795]="al", + [1796]="al", + [1797]="al", + [1798]="al", + [1799]="al", + [1800]="al", + [1801]="al", + [1802]="al", + [1803]="al", + [1804]="al", + [1805]="al", + [1807]="al", + [1808]="al", + [1809]="nsm", + [1810]="al", + [1811]="al", + [1812]="al", + [1813]="al", + [1814]="al", + [1815]="al", + [1816]="al", + [1817]="al", + [1818]="al", + [1819]="al", + [1820]="al", + [1821]="al", + [1822]="al", + [1823]="al", + [1824]="al", + [1825]="al", + [1826]="al", + [1827]="al", + [1828]="al", + [1829]="al", + [1830]="al", + [1831]="al", + [1832]="al", + [1833]="al", + [1834]="al", + [1835]="al", + [1836]="al", + [1837]="al", + [1838]="al", + [1839]="al", + [1840]="nsm", + [1841]="nsm", + [1842]="nsm", + [1843]="nsm", + [1844]="nsm", + [1845]="nsm", + [1846]="nsm", + [1847]="nsm", + [1848]="nsm", + [1849]="nsm", + [1850]="nsm", + [1851]="nsm", + [1852]="nsm", + [1853]="nsm", + [1854]="nsm", + [1855]="nsm", + [1856]="nsm", + [1857]="nsm", + [1858]="nsm", + [1859]="nsm", + [1860]="nsm", + [1861]="nsm", + [1862]="nsm", + [1863]="nsm", + [1864]="nsm", + [1865]="nsm", + [1866]="nsm", + [1869]="al", + [1870]="al", + [1871]="al", + [1872]="al", + [1873]="al", + [1874]="al", + [1875]="al", + [1876]="al", + [1877]="al", + [1878]="al", + [1879]="al", + [1880]="al", + [1881]="al", + [1882]="al", + [1883]="al", + [1884]="al", + [1885]="al", + [1886]="al", + [1887]="al", + [1888]="al", + [1889]="al", + [1890]="al", + [1891]="al", + [1892]="al", + [1893]="al", + [1894]="al", + [1895]="al", + [1896]="al", + [1897]="al", + [1898]="al", + [1899]="al", + [1900]="al", + [1901]="al", + [1902]="al", + [1903]="al", + [1904]="al", + [1905]="al", + [1906]="al", + [1907]="al", + [1908]="al", + [1909]="al", + [1910]="al", + [1911]="al", + [1912]="al", + [1913]="al", + [1914]="al", + [1915]="al", + [1916]="al", + [1917]="al", + [1918]="al", + [1919]="al", + [1920]="al", + [1921]="al", + [1922]="al", + [1923]="al", + [1924]="al", + [1925]="al", + [1926]="al", + [1927]="al", + [1928]="al", + [1929]="al", + [1930]="al", + [1931]="al", + [1932]="al", + [1933]="al", + [1934]="al", + [1935]="al", + [1936]="al", + [1937]="al", + [1938]="al", + [1939]="al", + [1940]="al", + [1941]="al", + [1942]="al", + [1943]="al", + [1944]="al", + [1945]="al", + [1946]="al", + [1947]="al", + [1948]="al", + [1949]="al", + [1950]="al", + [1951]="al", + [1952]="al", + [1953]="al", + [1954]="al", + [1955]="al", + [1956]="al", + [1957]="al", + [1958]="nsm", + [1959]="nsm", + [1960]="nsm", + [1961]="nsm", + [1962]="nsm", + [1963]="nsm", + [1964]="nsm", + [1965]="nsm", + [1966]="nsm", + [1967]="nsm", + [1968]="nsm", + [1969]="al", + [1984]="r", + [1985]="r", + [1986]="r", + [1987]="r", + [1988]="r", + [1989]="r", + [1990]="r", + [1991]="r", + [1992]="r", + [1993]="r", + [1994]="r", + [1995]="r", + [1996]="r", + [1997]="r", + [1998]="r", + [1999]="r", + [2000]="r", + [2001]="r", + [2002]="r", + [2003]="r", + [2004]="r", + [2005]="r", + [2006]="r", + [2007]="r", + [2008]="r", + [2009]="r", + [2010]="r", + [2011]="r", + [2012]="r", + [2013]="r", + [2014]="r", + [2015]="r", + [2016]="r", + [2017]="r", + [2018]="r", + [2019]="r", + [2020]="r", + [2021]="r", + [2022]="r", + [2023]="r", + [2024]="r", + [2025]="r", + [2026]="r", + [2027]="nsm", + [2028]="nsm", + [2029]="nsm", + [2030]="nsm", + [2031]="nsm", + [2032]="nsm", + [2033]="nsm", + [2034]="nsm", + [2035]="nsm", + [2036]="r", + [2037]="r", + [2038]="on", + [2039]="on", + [2040]="on", + [2041]="on", + [2042]="r", + [2048]="r", + [2049]="r", + [2050]="r", + [2051]="r", + [2052]="r", + [2053]="r", + [2054]="r", + [2055]="r", + [2056]="r", + [2057]="r", + [2058]="r", + [2059]="r", + [2060]="r", + [2061]="r", + [2062]="r", + [2063]="r", + [2064]="r", + [2065]="r", + [2066]="r", + [2067]="r", + [2068]="r", + [2069]="r", + [2070]="nsm", + [2071]="nsm", + [2072]="nsm", + [2073]="nsm", + [2074]="r", + [2075]="nsm", + [2076]="nsm", + [2077]="nsm", + [2078]="nsm", + [2079]="nsm", + [2080]="nsm", + [2081]="nsm", + [2082]="nsm", + [2083]="nsm", + [2084]="r", + [2085]="nsm", + [2086]="nsm", + [2087]="nsm", + [2088]="r", + [2089]="nsm", + [2090]="nsm", + [2091]="nsm", + [2092]="nsm", + [2093]="nsm", + [2096]="r", + [2097]="r", + [2098]="r", + [2099]="r", + [2100]="r", + [2101]="r", + [2102]="r", + [2103]="r", + [2104]="r", + [2105]="r", + [2106]="r", + [2107]="r", + [2108]="r", + [2109]="r", + [2110]="r", + [2112]="r", + [2113]="r", + [2114]="r", + [2115]="r", + [2116]="r", + [2117]="r", + [2118]="r", + [2119]="r", + [2120]="r", + [2121]="r", + [2122]="r", + [2123]="r", + [2124]="r", + [2125]="r", + [2126]="r", + [2127]="r", + [2128]="r", + [2129]="r", + [2130]="r", + [2131]="r", + [2132]="r", + [2133]="r", + [2134]="r", + [2135]="r", + [2136]="r", + [2137]="nsm", + [2138]="nsm", + [2139]="nsm", + [2142]="r", + [2144]="al", + [2145]="al", + [2146]="al", + [2147]="al", + [2148]="al", + [2149]="al", + [2150]="al", + [2151]="al", + [2152]="al", + [2153]="al", + [2154]="al", + [2208]="al", + [2209]="al", + [2210]="al", + [2211]="al", + [2212]="al", + [2213]="al", + [2214]="al", + [2215]="al", + [2216]="al", + [2217]="al", + [2218]="al", + [2219]="al", + [2220]="al", + [2221]="al", + [2222]="al", + [2223]="al", + [2224]="al", + [2225]="al", + [2226]="al", + [2227]="al", + [2228]="al", + [2230]="al", + [2231]="al", + [2232]="al", + [2233]="al", + [2234]="al", + [2235]="al", + [2236]="al", + [2237]="al", + [2260]="nsm", + [2261]="nsm", + [2262]="nsm", + [2263]="nsm", + [2264]="nsm", + [2265]="nsm", + [2266]="nsm", + [2267]="nsm", + [2268]="nsm", + [2269]="nsm", + [2270]="nsm", + [2271]="nsm", + [2272]="nsm", + [2273]="nsm", + [2274]="an", + [2275]="nsm", + [2276]="nsm", + [2277]="nsm", + [2278]="nsm", + [2279]="nsm", + [2280]="nsm", + [2281]="nsm", + [2282]="nsm", + [2283]="nsm", + [2284]="nsm", + [2285]="nsm", + [2286]="nsm", + [2287]="nsm", + [2288]="nsm", + [2289]="nsm", + [2290]="nsm", + [2291]="nsm", + [2292]="nsm", + [2293]="nsm", + [2294]="nsm", + [2295]="nsm", + [2296]="nsm", + [2297]="nsm", + [2298]="nsm", + [2299]="nsm", + [2300]="nsm", + [2301]="nsm", + [2302]="nsm", + [2303]="nsm", + [2304]="nsm", + [2305]="nsm", + [2306]="nsm", + [2362]="nsm", + [2364]="nsm", + [2369]="nsm", + [2370]="nsm", + [2371]="nsm", + [2372]="nsm", + [2373]="nsm", + [2374]="nsm", + [2375]="nsm", + [2376]="nsm", + [2381]="nsm", + [2385]="nsm", + [2386]="nsm", + [2387]="nsm", + [2388]="nsm", + [2389]="nsm", + [2390]="nsm", + [2391]="nsm", + [2402]="nsm", + [2403]="nsm", + [2433]="nsm", + [2492]="nsm", + [2497]="nsm", + [2498]="nsm", + [2499]="nsm", + [2500]="nsm", + [2509]="nsm", + [2530]="nsm", + [2531]="nsm", + [2546]="et", + [2547]="et", + [2555]="et", + [2561]="nsm", + [2562]="nsm", + [2620]="nsm", + [2625]="nsm", + [2626]="nsm", + [2631]="nsm", + [2632]="nsm", + [2635]="nsm", + [2636]="nsm", + [2637]="nsm", + [2641]="nsm", + [2672]="nsm", + [2673]="nsm", + [2677]="nsm", + [2689]="nsm", + [2690]="nsm", + [2748]="nsm", + [2753]="nsm", + [2754]="nsm", + [2755]="nsm", + [2756]="nsm", + [2757]="nsm", + [2759]="nsm", + [2760]="nsm", + [2765]="nsm", + [2786]="nsm", + [2787]="nsm", + [2801]="et", + [2810]="nsm", + [2811]="nsm", + [2812]="nsm", + [2813]="nsm", + [2814]="nsm", + [2815]="nsm", + [2817]="nsm", + [2876]="nsm", + [2879]="nsm", + [2881]="nsm", + [2882]="nsm", + [2883]="nsm", + [2884]="nsm", + [2893]="nsm", + [2902]="nsm", + [2914]="nsm", + [2915]="nsm", + [2946]="nsm", + [3008]="nsm", + [3021]="nsm", + [3059]="on", + [3060]="on", + [3061]="on", + [3062]="on", + [3063]="on", + [3064]="on", + [3065]="et", + [3066]="on", + [3072]="nsm", + [3134]="nsm", + [3135]="nsm", + [3136]="nsm", + [3142]="nsm", + [3143]="nsm", + [3144]="nsm", + [3146]="nsm", + [3147]="nsm", + [3148]="nsm", + [3149]="nsm", + [3157]="nsm", + [3158]="nsm", + [3170]="nsm", + [3171]="nsm", + [3192]="on", + [3193]="on", + [3194]="on", + [3195]="on", + [3196]="on", + [3197]="on", + [3198]="on", + [3201]="nsm", + [3260]="nsm", + [3276]="nsm", + [3277]="nsm", + [3298]="nsm", + [3299]="nsm", + [3328]="nsm", + [3329]="nsm", + [3387]="nsm", + [3388]="nsm", + [3393]="nsm", + [3394]="nsm", + [3395]="nsm", + [3396]="nsm", + [3405]="nsm", + [3426]="nsm", + [3427]="nsm", + [3530]="nsm", + [3538]="nsm", + [3539]="nsm", + [3540]="nsm", + [3542]="nsm", + [3633]="nsm", + [3636]="nsm", + [3637]="nsm", + [3638]="nsm", + [3639]="nsm", + [3640]="nsm", + [3641]="nsm", + [3642]="nsm", + [3647]="et", + [3655]="nsm", + [3656]="nsm", + [3657]="nsm", + [3658]="nsm", + [3659]="nsm", + [3660]="nsm", + [3661]="nsm", + [3662]="nsm", + [3761]="nsm", + [3764]="nsm", + [3765]="nsm", + [3766]="nsm", + [3767]="nsm", + [3768]="nsm", + [3769]="nsm", + [3771]="nsm", + [3772]="nsm", + [3784]="nsm", + [3785]="nsm", + [3786]="nsm", + [3787]="nsm", + [3788]="nsm", + [3789]="nsm", + [3864]="nsm", + [3865]="nsm", + [3893]="nsm", + [3895]="nsm", + [3897]="nsm", + [3898]="on", + [3899]="on", + [3900]="on", + [3901]="on", + [3953]="nsm", + [3954]="nsm", + [3955]="nsm", + [3956]="nsm", + [3957]="nsm", + [3958]="nsm", + [3959]="nsm", + [3960]="nsm", + [3961]="nsm", + [3962]="nsm", + [3963]="nsm", + [3964]="nsm", + [3965]="nsm", + [3966]="nsm", + [3968]="nsm", + [3969]="nsm", + [3970]="nsm", + [3971]="nsm", + [3972]="nsm", + [3974]="nsm", + [3975]="nsm", + [3981]="nsm", + [3982]="nsm", + [3983]="nsm", + [3984]="nsm", + [3985]="nsm", + [3986]="nsm", + [3987]="nsm", + [3988]="nsm", + [3989]="nsm", + [3990]="nsm", + [3991]="nsm", + [3993]="nsm", + [3994]="nsm", + [3995]="nsm", + [3996]="nsm", + [3997]="nsm", + [3998]="nsm", + [3999]="nsm", + [4000]="nsm", + [4001]="nsm", + [4002]="nsm", + [4003]="nsm", + [4004]="nsm", + [4005]="nsm", + [4006]="nsm", + [4007]="nsm", + [4008]="nsm", + [4009]="nsm", + [4010]="nsm", + [4011]="nsm", + [4012]="nsm", + [4013]="nsm", + [4014]="nsm", + [4015]="nsm", + [4016]="nsm", + [4017]="nsm", + [4018]="nsm", + [4019]="nsm", + [4020]="nsm", + [4021]="nsm", + [4022]="nsm", + [4023]="nsm", + [4024]="nsm", + [4025]="nsm", + [4026]="nsm", + [4027]="nsm", + [4028]="nsm", + [4038]="nsm", + [4141]="nsm", + [4142]="nsm", + [4143]="nsm", + [4144]="nsm", + [4146]="nsm", + [4147]="nsm", + [4148]="nsm", + [4149]="nsm", + [4150]="nsm", + [4151]="nsm", + [4153]="nsm", + [4154]="nsm", + [4157]="nsm", + [4158]="nsm", + [4184]="nsm", + [4185]="nsm", + [4190]="nsm", + [4191]="nsm", + [4192]="nsm", + [4209]="nsm", + [4210]="nsm", + [4211]="nsm", + [4212]="nsm", + [4226]="nsm", + [4229]="nsm", + [4230]="nsm", + [4237]="nsm", + [4253]="nsm", + [4957]="nsm", + [4958]="nsm", + [4959]="nsm", + [5008]="on", + [5009]="on", + [5010]="on", + [5011]="on", + [5012]="on", + [5013]="on", + [5014]="on", + [5015]="on", + [5016]="on", + [5017]="on", + [5120]="on", + [5760]="ws", + [5787]="on", + [5788]="on", + [5906]="nsm", + [5907]="nsm", + [5908]="nsm", + [5938]="nsm", + [5939]="nsm", + [5940]="nsm", + [5970]="nsm", + [5971]="nsm", + [6002]="nsm", + [6003]="nsm", + [6068]="nsm", + [6069]="nsm", + [6071]="nsm", + [6072]="nsm", + [6073]="nsm", + [6074]="nsm", + [6075]="nsm", + [6076]="nsm", + [6077]="nsm", + [6086]="nsm", + [6089]="nsm", + [6090]="nsm", + [6091]="nsm", + [6092]="nsm", + [6093]="nsm", + [6094]="nsm", + [6095]="nsm", + [6096]="nsm", + [6097]="nsm", + [6098]="nsm", + [6099]="nsm", + [6107]="et", + [6109]="nsm", + [6128]="on", + [6129]="on", + [6130]="on", + [6131]="on", + [6132]="on", + [6133]="on", + [6134]="on", + [6135]="on", + [6136]="on", + [6137]="on", + [6144]="on", + [6145]="on", + [6146]="on", + [6147]="on", + [6148]="on", + [6149]="on", + [6150]="on", + [6151]="on", + [6152]="on", + [6153]="on", + [6154]="on", + [6155]="nsm", + [6156]="nsm", + [6157]="nsm", + [6158]="bn", + [6277]="nsm", + [6278]="nsm", + [6313]="nsm", + [6432]="nsm", + [6433]="nsm", + [6434]="nsm", + [6439]="nsm", + [6440]="nsm", + [6450]="nsm", + [6457]="nsm", + [6458]="nsm", + [6459]="nsm", + [6464]="on", + [6468]="on", + [6469]="on", + [6622]="on", + [6623]="on", + [6624]="on", + [6625]="on", + [6626]="on", + [6627]="on", + [6628]="on", + [6629]="on", + [6630]="on", + [6631]="on", + [6632]="on", + [6633]="on", + [6634]="on", + [6635]="on", + [6636]="on", + [6637]="on", + [6638]="on", + [6639]="on", + [6640]="on", + [6641]="on", + [6642]="on", + [6643]="on", + [6644]="on", + [6645]="on", + [6646]="on", + [6647]="on", + [6648]="on", + [6649]="on", + [6650]="on", + [6651]="on", + [6652]="on", + [6653]="on", + [6654]="on", + [6655]="on", + [6679]="nsm", + [6680]="nsm", + [6683]="nsm", + [6742]="nsm", + [6744]="nsm", + [6745]="nsm", + [6746]="nsm", + [6747]="nsm", + [6748]="nsm", + [6749]="nsm", + [6750]="nsm", + [6752]="nsm", + [6754]="nsm", + [6757]="nsm", + [6758]="nsm", + [6759]="nsm", + [6760]="nsm", + [6761]="nsm", + [6762]="nsm", + [6763]="nsm", + [6764]="nsm", + [6771]="nsm", + [6772]="nsm", + [6773]="nsm", + [6774]="nsm", + [6775]="nsm", + [6776]="nsm", + [6777]="nsm", + [6778]="nsm", + [6779]="nsm", + [6780]="nsm", + [6783]="nsm", + [6832]="nsm", + [6833]="nsm", + [6834]="nsm", + [6835]="nsm", + [6836]="nsm", + [6837]="nsm", + [6838]="nsm", + [6839]="nsm", + [6840]="nsm", + [6841]="nsm", + [6842]="nsm", + [6843]="nsm", + [6844]="nsm", + [6845]="nsm", + [6846]="nsm", + [6912]="nsm", + [6913]="nsm", + [6914]="nsm", + [6915]="nsm", + [6964]="nsm", + [6966]="nsm", + [6967]="nsm", + [6968]="nsm", + [6969]="nsm", + [6970]="nsm", + [6972]="nsm", + [6978]="nsm", + [7019]="nsm", + [7020]="nsm", + [7021]="nsm", + [7022]="nsm", + [7023]="nsm", + [7024]="nsm", + [7025]="nsm", + [7026]="nsm", + [7027]="nsm", + [7040]="nsm", + [7041]="nsm", + [7074]="nsm", + [7075]="nsm", + [7076]="nsm", + [7077]="nsm", + [7080]="nsm", + [7081]="nsm", + [7083]="nsm", + [7084]="nsm", + [7085]="nsm", + [7142]="nsm", + [7144]="nsm", + [7145]="nsm", + [7149]="nsm", + [7151]="nsm", + [7152]="nsm", + [7153]="nsm", + [7212]="nsm", + [7213]="nsm", + [7214]="nsm", + [7215]="nsm", + [7216]="nsm", + [7217]="nsm", + [7218]="nsm", + [7219]="nsm", + [7222]="nsm", + [7223]="nsm", + [7376]="nsm", + [7377]="nsm", + [7378]="nsm", + [7380]="nsm", + [7381]="nsm", + [7382]="nsm", + [7383]="nsm", + [7384]="nsm", + [7385]="nsm", + [7386]="nsm", + [7387]="nsm", + [7388]="nsm", + [7389]="nsm", + [7390]="nsm", + [7391]="nsm", + [7392]="nsm", + [7394]="nsm", + [7395]="nsm", + [7396]="nsm", + [7397]="nsm", + [7398]="nsm", + [7399]="nsm", + [7400]="nsm", + [7405]="nsm", + [7412]="nsm", + [7416]="nsm", + [7417]="nsm", + [7616]="nsm", + [7617]="nsm", + [7618]="nsm", + [7619]="nsm", + [7620]="nsm", + [7621]="nsm", + [7622]="nsm", + [7623]="nsm", + [7624]="nsm", + [7625]="nsm", + [7626]="nsm", + [7627]="nsm", + [7628]="nsm", + [7629]="nsm", + [7630]="nsm", + [7631]="nsm", + [7632]="nsm", + [7633]="nsm", + [7634]="nsm", + [7635]="nsm", + [7636]="nsm", + [7637]="nsm", + [7638]="nsm", + [7639]="nsm", + [7640]="nsm", + [7641]="nsm", + [7642]="nsm", + [7643]="nsm", + [7644]="nsm", + [7645]="nsm", + [7646]="nsm", + [7647]="nsm", + [7648]="nsm", + [7649]="nsm", + [7650]="nsm", + [7651]="nsm", + [7652]="nsm", + [7653]="nsm", + [7654]="nsm", + [7655]="nsm", + [7656]="nsm", + [7657]="nsm", + [7658]="nsm", + [7659]="nsm", + [7660]="nsm", + [7661]="nsm", + [7662]="nsm", + [7663]="nsm", + [7664]="nsm", + [7665]="nsm", + [7666]="nsm", + [7667]="nsm", + [7668]="nsm", + [7669]="nsm", + [7670]="nsm", + [7671]="nsm", + [7672]="nsm", + [7673]="nsm", + [7675]="nsm", + [7676]="nsm", + [7677]="nsm", + [7678]="nsm", + [7679]="nsm", + [8125]="on", + [8127]="on", + [8128]="on", + [8129]="on", + [8141]="on", + [8142]="on", + [8143]="on", + [8157]="on", + [8158]="on", + [8159]="on", + [8173]="on", + [8174]="on", + [8175]="on", + [8189]="on", + [8190]="on", + [8192]="ws", + [8193]="ws", + [8194]="ws", + [8195]="ws", + [8196]="ws", + [8197]="ws", + [8198]="ws", + [8199]="ws", + [8200]="ws", + [8201]="ws", + [8202]="ws", + [8203]="bn", + [8204]="bn", + [8205]="bn", + [8207]="r", + [8208]="on", + [8209]="on", + [8210]="on", + [8211]="on", + [8212]="on", + [8213]="on", + [8214]="on", + [8215]="on", + [8216]="on", + [8217]="on", + [8218]="on", + [8219]="on", + [8220]="on", + [8221]="on", + [8222]="on", + [8223]="on", + [8224]="on", + [8225]="on", + [8226]="on", + [8227]="on", + [8228]="on", + [8229]="on", + [8230]="on", + [8231]="on", + [8232]="ws", + [8233]="b", + [8234]="lre", + [8235]="rle", + [8236]="pdf", + [8237]="lro", + [8238]="rlo", + [8239]="cs", + [8240]="et", + [8241]="et", + [8242]="et", + [8243]="et", + [8244]="et", + [8245]="on", + [8246]="on", + [8247]="on", + [8248]="on", + [8249]="on", + [8250]="on", + [8251]="on", + [8252]="on", + [8253]="on", + [8254]="on", + [8255]="on", + [8256]="on", + [8257]="on", + [8258]="on", + [8259]="on", + [8260]="cs", + [8261]="on", + [8262]="on", + [8263]="on", + [8264]="on", + [8265]="on", + [8266]="on", + [8267]="on", + [8268]="on", + [8269]="on", + [8270]="on", + [8271]="on", + [8272]="on", + [8273]="on", + [8274]="on", + [8275]="on", + [8276]="on", + [8277]="on", + [8278]="on", + [8279]="on", + [8280]="on", + [8281]="on", + [8282]="on", + [8283]="on", + [8284]="on", + [8285]="on", + [8286]="on", + [8287]="ws", + [8288]="bn", + [8289]="bn", + [8290]="bn", + [8291]="bn", + [8292]="bn", + [8294]="lri", + [8295]="rli", + [8296]="fsi", + [8297]="pdi", + [8298]="bn", + [8299]="bn", + [8300]="bn", + [8301]="bn", + [8302]="bn", + [8303]="bn", + [8304]="en", + [8308]="en", + [8309]="en", + [8310]="en", + [8311]="en", + [8312]="en", + [8313]="en", + [8314]="es", + [8315]="es", + [8316]="on", + [8317]="on", + [8318]="on", + [8320]="en", + [8321]="en", + [8322]="en", + [8323]="en", + [8324]="en", + [8325]="en", + [8326]="en", + [8327]="en", + [8328]="en", + [8329]="en", + [8330]="es", + [8331]="es", + [8332]="on", + [8333]="on", + [8334]="on", + [8352]="et", + [8353]="et", + [8354]="et", + [8355]="et", + [8356]="et", + [8357]="et", + [8358]="et", + [8359]="et", + [8360]="et", + [8361]="et", + [8362]="et", + [8363]="et", + [8364]="et", + [8365]="et", + [8366]="et", + [8367]="et", + [8368]="et", + [8369]="et", + [8370]="et", + [8371]="et", + [8372]="et", + [8373]="et", + [8374]="et", + [8375]="et", + [8376]="et", + [8377]="et", + [8378]="et", + [8379]="et", + [8380]="et", + [8381]="et", + [8382]="et", + [8383]="et", + [8400]="nsm", + [8401]="nsm", + [8402]="nsm", + [8403]="nsm", + [8404]="nsm", + [8405]="nsm", + [8406]="nsm", + [8407]="nsm", + [8408]="nsm", + [8409]="nsm", + [8410]="nsm", + [8411]="nsm", + [8412]="nsm", + [8413]="nsm", + [8414]="nsm", + [8415]="nsm", + [8416]="nsm", + [8417]="nsm", + [8418]="nsm", + [8419]="nsm", + [8420]="nsm", + [8421]="nsm", + [8422]="nsm", + [8423]="nsm", + [8424]="nsm", + [8425]="nsm", + [8426]="nsm", + [8427]="nsm", + [8428]="nsm", + [8429]="nsm", + [8430]="nsm", + [8431]="nsm", + [8432]="nsm", + [8448]="on", + [8449]="on", + [8451]="on", + [8452]="on", + [8453]="on", + [8454]="on", + [8456]="on", + [8457]="on", + [8468]="on", + [8470]="on", + [8471]="on", + [8472]="on", + [8478]="on", + [8479]="on", + [8480]="on", + [8481]="on", + [8482]="on", + [8483]="on", + [8485]="on", + [8487]="on", + [8489]="on", + [8494]="et", + [8506]="on", + [8507]="on", + [8512]="on", + [8513]="on", + [8514]="on", + [8515]="on", + [8516]="on", + [8522]="on", + [8523]="on", + [8524]="on", + [8525]="on", + [8528]="on", + [8529]="on", + [8530]="on", + [8531]="on", + [8532]="on", + [8533]="on", + [8534]="on", + [8535]="on", + [8536]="on", + [8537]="on", + [8538]="on", + [8539]="on", + [8540]="on", + [8541]="on", + [8542]="on", + [8543]="on", + [8585]="on", + [8586]="on", + [8587]="on", + [8592]="on", + [8593]="on", + [8594]="on", + [8595]="on", + [8596]="on", + [8597]="on", + [8598]="on", + [8599]="on", + [8600]="on", + [8601]="on", + [8602]="on", + [8603]="on", + [8604]="on", + [8605]="on", + [8606]="on", + [8607]="on", + [8608]="on", + [8609]="on", + [8610]="on", + [8611]="on", + [8612]="on", + [8613]="on", + [8614]="on", + [8615]="on", + [8616]="on", + [8617]="on", + [8618]="on", + [8619]="on", + [8620]="on", + [8621]="on", + [8622]="on", + [8623]="on", + [8624]="on", + [8625]="on", + [8626]="on", + [8627]="on", + [8628]="on", + [8629]="on", + [8630]="on", + [8631]="on", + [8632]="on", + [8633]="on", + [8634]="on", + [8635]="on", + [8636]="on", + [8637]="on", + [8638]="on", + [8639]="on", + [8640]="on", + [8641]="on", + [8642]="on", + [8643]="on", + [8644]="on", + [8645]="on", + [8646]="on", + [8647]="on", + [8648]="on", + [8649]="on", + [8650]="on", + [8651]="on", + [8652]="on", + [8653]="on", + [8654]="on", + [8655]="on", + [8656]="on", + [8657]="on", + [8658]="on", + [8659]="on", + [8660]="on", + [8661]="on", + [8662]="on", + [8663]="on", + [8664]="on", + [8665]="on", + [8666]="on", + [8667]="on", + [8668]="on", + [8669]="on", + [8670]="on", + [8671]="on", + [8672]="on", + [8673]="on", + [8674]="on", + [8675]="on", + [8676]="on", + [8677]="on", + [8678]="on", + [8679]="on", + [8680]="on", + [8681]="on", + [8682]="on", + [8683]="on", + [8684]="on", + [8685]="on", + [8686]="on", + [8687]="on", + [8688]="on", + [8689]="on", + [8690]="on", + [8691]="on", + [8692]="on", + [8693]="on", + [8694]="on", + [8695]="on", + [8696]="on", + [8697]="on", + [8698]="on", + [8699]="on", + [8700]="on", + [8701]="on", + [8702]="on", + [8703]="on", + [8704]="on", + [8705]="on", + [8706]="on", + [8707]="on", + [8708]="on", + [8709]="on", + [8710]="on", + [8711]="on", + [8712]="on", + [8713]="on", + [8714]="on", + [8715]="on", + [8716]="on", + [8717]="on", + [8718]="on", + [8719]="on", + [8720]="on", + [8721]="on", + [8722]="es", + [8723]="et", + [8724]="on", + [8725]="on", + [8726]="on", + [8727]="on", + [8728]="on", + [8729]="on", + [8730]="on", + [8731]="on", + [8732]="on", + [8733]="on", + [8734]="on", + [8735]="on", + [8736]="on", + [8737]="on", + [8738]="on", + [8739]="on", + [8740]="on", + [8741]="on", + [8742]="on", + [8743]="on", + [8744]="on", + [8745]="on", + [8746]="on", + [8747]="on", + [8748]="on", + [8749]="on", + [8750]="on", + [8751]="on", + [8752]="on", + [8753]="on", + [8754]="on", + [8755]="on", + [8756]="on", + [8757]="on", + [8758]="on", + [8759]="on", + [8760]="on", + [8761]="on", + [8762]="on", + [8763]="on", + [8764]="on", + [8765]="on", + [8766]="on", + [8767]="on", + [8768]="on", + [8769]="on", + [8770]="on", + [8771]="on", + [8772]="on", + [8773]="on", + [8774]="on", + [8775]="on", + [8776]="on", + [8777]="on", + [8778]="on", + [8779]="on", + [8780]="on", + [8781]="on", + [8782]="on", + [8783]="on", + [8784]="on", + [8785]="on", + [8786]="on", + [8787]="on", + [8788]="on", + [8789]="on", + [8790]="on", + [8791]="on", + [8792]="on", + [8793]="on", + [8794]="on", + [8795]="on", + [8796]="on", + [8797]="on", + [8798]="on", + [8799]="on", + [8800]="on", + [8801]="on", + [8802]="on", + [8803]="on", + [8804]="on", + [8805]="on", + [8806]="on", + [8807]="on", + [8808]="on", + [8809]="on", + [8810]="on", + [8811]="on", + [8812]="on", + [8813]="on", + [8814]="on", + [8815]="on", + [8816]="on", + [8817]="on", + [8818]="on", + [8819]="on", + [8820]="on", + [8821]="on", + [8822]="on", + [8823]="on", + [8824]="on", + [8825]="on", + [8826]="on", + [8827]="on", + [8828]="on", + [8829]="on", + [8830]="on", + [8831]="on", + [8832]="on", + [8833]="on", + [8834]="on", + [8835]="on", + [8836]="on", + [8837]="on", + [8838]="on", + [8839]="on", + [8840]="on", + [8841]="on", + [8842]="on", + [8843]="on", + [8844]="on", + [8845]="on", + [8846]="on", + [8847]="on", + [8848]="on", + [8849]="on", + [8850]="on", + [8851]="on", + [8852]="on", + [8853]="on", + [8854]="on", + [8855]="on", + [8856]="on", + [8857]="on", + [8858]="on", + [8859]="on", + [8860]="on", + [8861]="on", + [8862]="on", + [8863]="on", + [8864]="on", + [8865]="on", + [8866]="on", + [8867]="on", + [8868]="on", + [8869]="on", + [8870]="on", + [8871]="on", + [8872]="on", + [8873]="on", + [8874]="on", + [8875]="on", + [8876]="on", + [8877]="on", + [8878]="on", + [8879]="on", + [8880]="on", + [8881]="on", + [8882]="on", + [8883]="on", + [8884]="on", + [8885]="on", + [8886]="on", + [8887]="on", + [8888]="on", + [8889]="on", + [8890]="on", + [8891]="on", + [8892]="on", + [8893]="on", + [8894]="on", + [8895]="on", + [8896]="on", + [8897]="on", + [8898]="on", + [8899]="on", + [8900]="on", + [8901]="on", + [8902]="on", + [8903]="on", + [8904]="on", + [8905]="on", + [8906]="on", + [8907]="on", + [8908]="on", + [8909]="on", + [8910]="on", + [8911]="on", + [8912]="on", + [8913]="on", + [8914]="on", + [8915]="on", + [8916]="on", + [8917]="on", + [8918]="on", + [8919]="on", + [8920]="on", + [8921]="on", + [8922]="on", + [8923]="on", + [8924]="on", + [8925]="on", + [8926]="on", + [8927]="on", + [8928]="on", + [8929]="on", + [8930]="on", + [8931]="on", + [8932]="on", + [8933]="on", + [8934]="on", + [8935]="on", + [8936]="on", + [8937]="on", + [8938]="on", + [8939]="on", + [8940]="on", + [8941]="on", + [8942]="on", + [8943]="on", + [8944]="on", + [8945]="on", + [8946]="on", + [8947]="on", + [8948]="on", + [8949]="on", + [8950]="on", + [8951]="on", + [8952]="on", + [8953]="on", + [8954]="on", + [8955]="on", + [8956]="on", + [8957]="on", + [8958]="on", + [8959]="on", + [8960]="on", + [8961]="on", + [8962]="on", + [8963]="on", + [8964]="on", + [8965]="on", + [8966]="on", + [8967]="on", + [8968]="on", + [8969]="on", + [8970]="on", + [8971]="on", + [8972]="on", + [8973]="on", + [8974]="on", + [8975]="on", + [8976]="on", + [8977]="on", + [8978]="on", + [8979]="on", + [8980]="on", + [8981]="on", + [8982]="on", + [8983]="on", + [8984]="on", + [8985]="on", + [8986]="on", + [8987]="on", + [8988]="on", + [8989]="on", + [8990]="on", + [8991]="on", + [8992]="on", + [8993]="on", + [8994]="on", + [8995]="on", + [8996]="on", + [8997]="on", + [8998]="on", + [8999]="on", + [9000]="on", + [9001]="on", + [9002]="on", + [9003]="on", + [9004]="on", + [9005]="on", + [9006]="on", + [9007]="on", + [9008]="on", + [9009]="on", + [9010]="on", + [9011]="on", + [9012]="on", + [9013]="on", + [9083]="on", + [9084]="on", + [9085]="on", + [9086]="on", + [9087]="on", + [9088]="on", + [9089]="on", + [9090]="on", + [9091]="on", + [9092]="on", + [9093]="on", + [9094]="on", + [9095]="on", + [9096]="on", + [9097]="on", + [9098]="on", + [9099]="on", + [9100]="on", + [9101]="on", + [9102]="on", + [9103]="on", + [9104]="on", + [9105]="on", + [9106]="on", + [9107]="on", + [9108]="on", + [9110]="on", + [9111]="on", + [9112]="on", + [9113]="on", + [9114]="on", + [9115]="on", + [9116]="on", + [9117]="on", + [9118]="on", + [9119]="on", + [9120]="on", + [9121]="on", + [9122]="on", + [9123]="on", + [9124]="on", + [9125]="on", + [9126]="on", + [9127]="on", + [9128]="on", + [9129]="on", + [9130]="on", + [9131]="on", + [9132]="on", + [9133]="on", + [9134]="on", + [9135]="on", + [9136]="on", + [9137]="on", + [9138]="on", + [9139]="on", + [9140]="on", + [9141]="on", + [9142]="on", + [9143]="on", + [9144]="on", + [9145]="on", + [9146]="on", + [9147]="on", + [9148]="on", + [9149]="on", + [9150]="on", + [9151]="on", + [9152]="on", + [9153]="on", + [9154]="on", + [9155]="on", + [9156]="on", + [9157]="on", + [9158]="on", + [9159]="on", + [9160]="on", + [9161]="on", + [9162]="on", + [9163]="on", + [9164]="on", + [9165]="on", + [9166]="on", + [9167]="on", + [9168]="on", + [9169]="on", + [9170]="on", + [9171]="on", + [9172]="on", + [9173]="on", + [9174]="on", + [9175]="on", + [9176]="on", + [9177]="on", + [9178]="on", + [9179]="on", + [9180]="on", + [9181]="on", + [9182]="on", + [9183]="on", + [9184]="on", + [9185]="on", + [9186]="on", + [9187]="on", + [9188]="on", + [9189]="on", + [9190]="on", + [9191]="on", + [9192]="on", + [9193]="on", + [9194]="on", + [9195]="on", + [9196]="on", + [9197]="on", + [9198]="on", + [9199]="on", + [9200]="on", + [9201]="on", + [9202]="on", + [9203]="on", + [9204]="on", + [9205]="on", + [9206]="on", + [9207]="on", + [9208]="on", + [9209]="on", + [9210]="on", + [9211]="on", + [9212]="on", + [9213]="on", + [9214]="on", + [9215]="on", + [9216]="on", + [9217]="on", + [9218]="on", + [9219]="on", + [9220]="on", + [9221]="on", + [9222]="on", + [9223]="on", + [9224]="on", + [9225]="on", + [9226]="on", + [9227]="on", + [9228]="on", + [9229]="on", + [9230]="on", + [9231]="on", + [9232]="on", + [9233]="on", + [9234]="on", + [9235]="on", + [9236]="on", + [9237]="on", + [9238]="on", + [9239]="on", + [9240]="on", + [9241]="on", + [9242]="on", + [9243]="on", + [9244]="on", + [9245]="on", + [9246]="on", + [9247]="on", + [9248]="on", + [9249]="on", + [9250]="on", + [9251]="on", + [9252]="on", + [9253]="on", + [9254]="on", + [9280]="on", + [9281]="on", + [9282]="on", + [9283]="on", + [9284]="on", + [9285]="on", + [9286]="on", + [9287]="on", + [9288]="on", + [9289]="on", + [9290]="on", + [9312]="on", + [9313]="on", + [9314]="on", + [9315]="on", + [9316]="on", + [9317]="on", + [9318]="on", + [9319]="on", + [9320]="on", + [9321]="on", + [9322]="on", + [9323]="on", + [9324]="on", + [9325]="on", + [9326]="on", + [9327]="on", + [9328]="on", + [9329]="on", + [9330]="on", + [9331]="on", + [9332]="on", + [9333]="on", + [9334]="on", + [9335]="on", + [9336]="on", + [9337]="on", + [9338]="on", + [9339]="on", + [9340]="on", + [9341]="on", + [9342]="on", + [9343]="on", + [9344]="on", + [9345]="on", + [9346]="on", + [9347]="on", + [9348]="on", + [9349]="on", + [9350]="on", + [9351]="on", + [9352]="en", + [9353]="en", + [9354]="en", + [9355]="en", + [9356]="en", + [9357]="en", + [9358]="en", + [9359]="en", + [9360]="en", + [9361]="en", + [9362]="en", + [9363]="en", + [9364]="en", + [9365]="en", + [9366]="en", + [9367]="en", + [9368]="en", + [9369]="en", + [9370]="en", + [9371]="en", + [9450]="on", + [9451]="on", + [9452]="on", + [9453]="on", + [9454]="on", + [9455]="on", + [9456]="on", + [9457]="on", + [9458]="on", + [9459]="on", + [9460]="on", + [9461]="on", + [9462]="on", + [9463]="on", + [9464]="on", + [9465]="on", + [9466]="on", + [9467]="on", + [9468]="on", + [9469]="on", + [9470]="on", + [9471]="on", + [9472]="on", + [9473]="on", + [9474]="on", + [9475]="on", + [9476]="on", + [9477]="on", + [9478]="on", + [9479]="on", + [9480]="on", + [9481]="on", + [9482]="on", + [9483]="on", + [9484]="on", + [9485]="on", + [9486]="on", + [9487]="on", + [9488]="on", + [9489]="on", + [9490]="on", + [9491]="on", + [9492]="on", + [9493]="on", + [9494]="on", + [9495]="on", + [9496]="on", + [9497]="on", + [9498]="on", + [9499]="on", + [9500]="on", + [9501]="on", + [9502]="on", + [9503]="on", + [9504]="on", + [9505]="on", + [9506]="on", + [9507]="on", + [9508]="on", + [9509]="on", + [9510]="on", + [9511]="on", + [9512]="on", + [9513]="on", + [9514]="on", + [9515]="on", + [9516]="on", + [9517]="on", + [9518]="on", + [9519]="on", + [9520]="on", + [9521]="on", + [9522]="on", + [9523]="on", + [9524]="on", + [9525]="on", + [9526]="on", + [9527]="on", + [9528]="on", + [9529]="on", + [9530]="on", + [9531]="on", + [9532]="on", + [9533]="on", + [9534]="on", + [9535]="on", + [9536]="on", + [9537]="on", + [9538]="on", + [9539]="on", + [9540]="on", + [9541]="on", + [9542]="on", + [9543]="on", + [9544]="on", + [9545]="on", + [9546]="on", + [9547]="on", + [9548]="on", + [9549]="on", + [9550]="on", + [9551]="on", + [9552]="on", + [9553]="on", + [9554]="on", + [9555]="on", + [9556]="on", + [9557]="on", + [9558]="on", + [9559]="on", + [9560]="on", + [9561]="on", + [9562]="on", + [9563]="on", + [9564]="on", + [9565]="on", + [9566]="on", + [9567]="on", + [9568]="on", + [9569]="on", + [9570]="on", + [9571]="on", + [9572]="on", + [9573]="on", + [9574]="on", + [9575]="on", + [9576]="on", + [9577]="on", + [9578]="on", + [9579]="on", + [9580]="on", + [9581]="on", + [9582]="on", + [9583]="on", + [9584]="on", + [9585]="on", + [9586]="on", + [9587]="on", + [9588]="on", + [9589]="on", + [9590]="on", + [9591]="on", + [9592]="on", + [9593]="on", + [9594]="on", + [9595]="on", + [9596]="on", + [9597]="on", + [9598]="on", + [9599]="on", + [9600]="on", + [9601]="on", + [9602]="on", + [9603]="on", + [9604]="on", + [9605]="on", + [9606]="on", + [9607]="on", + [9608]="on", + [9609]="on", + [9610]="on", + [9611]="on", + [9612]="on", + [9613]="on", + [9614]="on", + [9615]="on", + [9616]="on", + [9617]="on", + [9618]="on", + [9619]="on", + [9620]="on", + [9621]="on", + [9622]="on", + [9623]="on", + [9624]="on", + [9625]="on", + [9626]="on", + [9627]="on", + [9628]="on", + [9629]="on", + [9630]="on", + [9631]="on", + [9632]="on", + [9633]="on", + [9634]="on", + [9635]="on", + [9636]="on", + [9637]="on", + [9638]="on", + [9639]="on", + [9640]="on", + [9641]="on", + [9642]="on", + [9643]="on", + [9644]="on", + [9645]="on", + [9646]="on", + [9647]="on", + [9648]="on", + [9649]="on", + [9650]="on", + [9651]="on", + [9652]="on", + [9653]="on", + [9654]="on", + [9655]="on", + [9656]="on", + [9657]="on", + [9658]="on", + [9659]="on", + [9660]="on", + [9661]="on", + [9662]="on", + [9663]="on", + [9664]="on", + [9665]="on", + [9666]="on", + [9667]="on", + [9668]="on", + [9669]="on", + [9670]="on", + [9671]="on", + [9672]="on", + [9673]="on", + [9674]="on", + [9675]="on", + [9676]="on", + [9677]="on", + [9678]="on", + [9679]="on", + [9680]="on", + [9681]="on", + [9682]="on", + [9683]="on", + [9684]="on", + [9685]="on", + [9686]="on", + [9687]="on", + [9688]="on", + [9689]="on", + [9690]="on", + [9691]="on", + [9692]="on", + [9693]="on", + [9694]="on", + [9695]="on", + [9696]="on", + [9697]="on", + [9698]="on", + [9699]="on", + [9700]="on", + [9701]="on", + [9702]="on", + [9703]="on", + [9704]="on", + [9705]="on", + [9706]="on", + [9707]="on", + [9708]="on", + [9709]="on", + [9710]="on", + [9711]="on", + [9712]="on", + [9713]="on", + [9714]="on", + [9715]="on", + [9716]="on", + [9717]="on", + [9718]="on", + [9719]="on", + [9720]="on", + [9721]="on", + [9722]="on", + [9723]="on", + [9724]="on", + [9725]="on", + [9726]="on", + [9727]="on", + [9728]="on", + [9729]="on", + [9730]="on", + [9731]="on", + [9732]="on", + [9733]="on", + [9734]="on", + [9735]="on", + [9736]="on", + [9737]="on", + [9738]="on", + [9739]="on", + [9740]="on", + [9741]="on", + [9742]="on", + [9743]="on", + [9744]="on", + [9745]="on", + [9746]="on", + [9747]="on", + [9748]="on", + [9749]="on", + [9750]="on", + [9751]="on", + [9752]="on", + [9753]="on", + [9754]="on", + [9755]="on", + [9756]="on", + [9757]="on", + [9758]="on", + [9759]="on", + [9760]="on", + [9761]="on", + [9762]="on", + [9763]="on", + [9764]="on", + [9765]="on", + [9766]="on", + [9767]="on", + [9768]="on", + [9769]="on", + [9770]="on", + [9771]="on", + [9772]="on", + [9773]="on", + [9774]="on", + [9775]="on", + [9776]="on", + [9777]="on", + [9778]="on", + [9779]="on", + [9780]="on", + [9781]="on", + [9782]="on", + [9783]="on", + [9784]="on", + [9785]="on", + [9786]="on", + [9787]="on", + [9788]="on", + [9789]="on", + [9790]="on", + [9791]="on", + [9792]="on", + [9793]="on", + [9794]="on", + [9795]="on", + [9796]="on", + [9797]="on", + [9798]="on", + [9799]="on", + [9800]="on", + [9801]="on", + [9802]="on", + [9803]="on", + [9804]="on", + [9805]="on", + [9806]="on", + [9807]="on", + [9808]="on", + [9809]="on", + [9810]="on", + [9811]="on", + [9812]="on", + [9813]="on", + [9814]="on", + [9815]="on", + [9816]="on", + [9817]="on", + [9818]="on", + [9819]="on", + [9820]="on", + [9821]="on", + [9822]="on", + [9823]="on", + [9824]="on", + [9825]="on", + [9826]="on", + [9827]="on", + [9828]="on", + [9829]="on", + [9830]="on", + [9831]="on", + [9832]="on", + [9833]="on", + [9834]="on", + [9835]="on", + [9836]="on", + [9837]="on", + [9838]="on", + [9839]="on", + [9840]="on", + [9841]="on", + [9842]="on", + [9843]="on", + [9844]="on", + [9845]="on", + [9846]="on", + [9847]="on", + [9848]="on", + [9849]="on", + [9850]="on", + [9851]="on", + [9852]="on", + [9853]="on", + [9854]="on", + [9855]="on", + [9856]="on", + [9857]="on", + [9858]="on", + [9859]="on", + [9860]="on", + [9861]="on", + [9862]="on", + [9863]="on", + [9864]="on", + [9865]="on", + [9866]="on", + [9867]="on", + [9868]="on", + [9869]="on", + [9870]="on", + [9871]="on", + [9872]="on", + [9873]="on", + [9874]="on", + [9875]="on", + [9876]="on", + [9877]="on", + [9878]="on", + [9879]="on", + [9880]="on", + [9881]="on", + [9882]="on", + [9883]="on", + [9884]="on", + [9885]="on", + [9886]="on", + [9887]="on", + [9888]="on", + [9889]="on", + [9890]="on", + [9891]="on", + [9892]="on", + [9893]="on", + [9894]="on", + [9895]="on", + [9896]="on", + [9897]="on", + [9898]="on", + [9899]="on", + [9901]="on", + [9902]="on", + [9903]="on", + [9904]="on", + [9905]="on", + [9906]="on", + [9907]="on", + [9908]="on", + [9909]="on", + [9910]="on", + [9911]="on", + [9912]="on", + [9913]="on", + [9914]="on", + [9915]="on", + [9916]="on", + [9917]="on", + [9918]="on", + [9919]="on", + [9920]="on", + [9921]="on", + [9922]="on", + [9923]="on", + [9924]="on", + [9925]="on", + [9926]="on", + [9927]="on", + [9928]="on", + [9929]="on", + [9930]="on", + [9931]="on", + [9932]="on", + [9933]="on", + [9934]="on", + [9935]="on", + [9936]="on", + [9937]="on", + [9938]="on", + [9939]="on", + [9940]="on", + [9941]="on", + [9942]="on", + [9943]="on", + [9944]="on", + [9945]="on", + [9946]="on", + [9947]="on", + [9948]="on", + [9949]="on", + [9950]="on", + [9951]="on", + [9952]="on", + [9953]="on", + [9954]="on", + [9955]="on", + [9956]="on", + [9957]="on", + [9958]="on", + [9959]="on", + [9960]="on", + [9961]="on", + [9962]="on", + [9963]="on", + [9964]="on", + [9965]="on", + [9966]="on", + [9967]="on", + [9968]="on", + [9969]="on", + [9970]="on", + [9971]="on", + [9972]="on", + [9973]="on", + [9974]="on", + [9975]="on", + [9976]="on", + [9977]="on", + [9978]="on", + [9979]="on", + [9980]="on", + [9981]="on", + [9982]="on", + [9983]="on", + [9984]="on", + [9985]="on", + [9986]="on", + [9987]="on", + [9988]="on", + [9989]="on", + [9990]="on", + [9991]="on", + [9992]="on", + [9993]="on", + [9994]="on", + [9995]="on", + [9996]="on", + [9997]="on", + [9998]="on", + [9999]="on", + [10000]="on", + [10001]="on", + [10002]="on", + [10003]="on", + [10004]="on", + [10005]="on", + [10006]="on", + [10007]="on", + [10008]="on", + [10009]="on", + [10010]="on", + [10011]="on", + [10012]="on", + [10013]="on", + [10014]="on", + [10015]="on", + [10016]="on", + [10017]="on", + [10018]="on", + [10019]="on", + [10020]="on", + [10021]="on", + [10022]="on", + [10023]="on", + [10024]="on", + [10025]="on", + [10026]="on", + [10027]="on", + [10028]="on", + [10029]="on", + [10030]="on", + [10031]="on", + [10032]="on", + [10033]="on", + [10034]="on", + [10035]="on", + [10036]="on", + [10037]="on", + [10038]="on", + [10039]="on", + [10040]="on", + [10041]="on", + [10042]="on", + [10043]="on", + [10044]="on", + [10045]="on", + [10046]="on", + [10047]="on", + [10048]="on", + [10049]="on", + [10050]="on", + [10051]="on", + [10052]="on", + [10053]="on", + [10054]="on", + [10055]="on", + [10056]="on", + [10057]="on", + [10058]="on", + [10059]="on", + [10060]="on", + [10061]="on", + [10062]="on", + [10063]="on", + [10064]="on", + [10065]="on", + [10066]="on", + [10067]="on", + [10068]="on", + [10069]="on", + [10070]="on", + [10071]="on", + [10072]="on", + [10073]="on", + [10074]="on", + [10075]="on", + [10076]="on", + [10077]="on", + [10078]="on", + [10079]="on", + [10080]="on", + [10081]="on", + [10082]="on", + [10083]="on", + [10084]="on", + [10085]="on", + [10086]="on", + [10087]="on", + [10088]="on", + [10089]="on", + [10090]="on", + [10091]="on", + [10092]="on", + [10093]="on", + [10094]="on", + [10095]="on", + [10096]="on", + [10097]="on", + [10098]="on", + [10099]="on", + [10100]="on", + [10101]="on", + [10102]="on", + [10103]="on", + [10104]="on", + [10105]="on", + [10106]="on", + [10107]="on", + [10108]="on", + [10109]="on", + [10110]="on", + [10111]="on", + [10112]="on", + [10113]="on", + [10114]="on", + [10115]="on", + [10116]="on", + [10117]="on", + [10118]="on", + [10119]="on", + [10120]="on", + [10121]="on", + [10122]="on", + [10123]="on", + [10124]="on", + [10125]="on", + [10126]="on", + [10127]="on", + [10128]="on", + [10129]="on", + [10130]="on", + [10131]="on", + [10132]="on", + [10133]="on", + [10134]="on", + [10135]="on", + [10136]="on", + [10137]="on", + [10138]="on", + [10139]="on", + [10140]="on", + [10141]="on", + [10142]="on", + [10143]="on", + [10144]="on", + [10145]="on", + [10146]="on", + [10147]="on", + [10148]="on", + [10149]="on", + [10150]="on", + [10151]="on", + [10152]="on", + [10153]="on", + [10154]="on", + [10155]="on", + [10156]="on", + [10157]="on", + [10158]="on", + [10159]="on", + [10160]="on", + [10161]="on", + [10162]="on", + [10163]="on", + [10164]="on", + [10165]="on", + [10166]="on", + [10167]="on", + [10168]="on", + [10169]="on", + [10170]="on", + [10171]="on", + [10172]="on", + [10173]="on", + [10174]="on", + [10175]="on", + [10176]="on", + [10177]="on", + [10178]="on", + [10179]="on", + [10180]="on", + [10181]="on", + [10182]="on", + [10183]="on", + [10184]="on", + [10185]="on", + [10186]="on", + [10187]="on", + [10188]="on", + [10189]="on", + [10190]="on", + [10191]="on", + [10192]="on", + [10193]="on", + [10194]="on", + [10195]="on", + [10196]="on", + [10197]="on", + [10198]="on", + [10199]="on", + [10200]="on", + [10201]="on", + [10202]="on", + [10203]="on", + [10204]="on", + [10205]="on", + [10206]="on", + [10207]="on", + [10208]="on", + [10209]="on", + [10210]="on", + [10211]="on", + [10212]="on", + [10213]="on", + [10214]="on", + [10215]="on", + [10216]="on", + [10217]="on", + [10218]="on", + [10219]="on", + [10220]="on", + [10221]="on", + [10222]="on", + [10223]="on", + [10224]="on", + [10225]="on", + [10226]="on", + [10227]="on", + [10228]="on", + [10229]="on", + [10230]="on", + [10231]="on", + [10232]="on", + [10233]="on", + [10234]="on", + [10235]="on", + [10236]="on", + [10237]="on", + [10238]="on", + [10239]="on", + [10496]="on", + [10497]="on", + [10498]="on", + [10499]="on", + [10500]="on", + [10501]="on", + [10502]="on", + [10503]="on", + [10504]="on", + [10505]="on", + [10506]="on", + [10507]="on", + [10508]="on", + [10509]="on", + [10510]="on", + [10511]="on", + [10512]="on", + [10513]="on", + [10514]="on", + [10515]="on", + [10516]="on", + [10517]="on", + [10518]="on", + [10519]="on", + [10520]="on", + [10521]="on", + [10522]="on", + [10523]="on", + [10524]="on", + [10525]="on", + [10526]="on", + [10527]="on", + [10528]="on", + [10529]="on", + [10530]="on", + [10531]="on", + [10532]="on", + [10533]="on", + [10534]="on", + [10535]="on", + [10536]="on", + [10537]="on", + [10538]="on", + [10539]="on", + [10540]="on", + [10541]="on", + [10542]="on", + [10543]="on", + [10544]="on", + [10545]="on", + [10546]="on", + [10547]="on", + [10548]="on", + [10549]="on", + [10550]="on", + [10551]="on", + [10552]="on", + [10553]="on", + [10554]="on", + [10555]="on", + [10556]="on", + [10557]="on", + [10558]="on", + [10559]="on", + [10560]="on", + [10561]="on", + [10562]="on", + [10563]="on", + [10564]="on", + [10565]="on", + [10566]="on", + [10567]="on", + [10568]="on", + [10569]="on", + [10570]="on", + [10571]="on", + [10572]="on", + [10573]="on", + [10574]="on", + [10575]="on", + [10576]="on", + [10577]="on", + [10578]="on", + [10579]="on", + [10580]="on", + [10581]="on", + [10582]="on", + [10583]="on", + [10584]="on", + [10585]="on", + [10586]="on", + [10587]="on", + [10588]="on", + [10589]="on", + [10590]="on", + [10591]="on", + [10592]="on", + [10593]="on", + [10594]="on", + [10595]="on", + [10596]="on", + [10597]="on", + [10598]="on", + [10599]="on", + [10600]="on", + [10601]="on", + [10602]="on", + [10603]="on", + [10604]="on", + [10605]="on", + [10606]="on", + [10607]="on", + [10608]="on", + [10609]="on", + [10610]="on", + [10611]="on", + [10612]="on", + [10613]="on", + [10614]="on", + [10615]="on", + [10616]="on", + [10617]="on", + [10618]="on", + [10619]="on", + [10620]="on", + [10621]="on", + [10622]="on", + [10623]="on", + [10624]="on", + [10625]="on", + [10626]="on", + [10627]="on", + [10628]="on", + [10629]="on", + [10630]="on", + [10631]="on", + [10632]="on", + [10633]="on", + [10634]="on", + [10635]="on", + [10636]="on", + [10637]="on", + [10638]="on", + [10639]="on", + [10640]="on", + [10641]="on", + [10642]="on", + [10643]="on", + [10644]="on", + [10645]="on", + [10646]="on", + [10647]="on", + [10648]="on", + [10649]="on", + [10650]="on", + [10651]="on", + [10652]="on", + [10653]="on", + [10654]="on", + [10655]="on", + [10656]="on", + [10657]="on", + [10658]="on", + [10659]="on", + [10660]="on", + [10661]="on", + [10662]="on", + [10663]="on", + [10664]="on", + [10665]="on", + [10666]="on", + [10667]="on", + [10668]="on", + [10669]="on", + [10670]="on", + [10671]="on", + [10672]="on", + [10673]="on", + [10674]="on", + [10675]="on", + [10676]="on", + [10677]="on", + [10678]="on", + [10679]="on", + [10680]="on", + [10681]="on", + [10682]="on", + [10683]="on", + [10684]="on", + [10685]="on", + [10686]="on", + [10687]="on", + [10688]="on", + [10689]="on", + [10690]="on", + [10691]="on", + [10692]="on", + [10693]="on", + [10694]="on", + [10695]="on", + [10696]="on", + [10697]="on", + [10698]="on", + [10699]="on", + [10700]="on", + [10701]="on", + [10702]="on", + [10703]="on", + [10704]="on", + [10705]="on", + [10706]="on", + [10707]="on", + [10708]="on", + [10709]="on", + [10710]="on", + [10711]="on", + [10712]="on", + [10713]="on", + [10714]="on", + [10715]="on", + [10716]="on", + [10717]="on", + [10718]="on", + [10719]="on", + [10720]="on", + [10721]="on", + [10722]="on", + [10723]="on", + [10724]="on", + [10725]="on", + [10726]="on", + [10727]="on", + [10728]="on", + [10729]="on", + [10730]="on", + [10731]="on", + [10732]="on", + [10733]="on", + [10734]="on", + [10735]="on", + [10736]="on", + [10737]="on", + [10738]="on", + [10739]="on", + [10740]="on", + [10741]="on", + [10742]="on", + [10743]="on", + [10744]="on", + [10745]="on", + [10746]="on", + [10747]="on", + [10748]="on", + [10749]="on", + [10750]="on", + [10751]="on", + [10752]="on", + [10753]="on", + [10754]="on", + [10755]="on", + [10756]="on", + [10757]="on", + [10758]="on", + [10759]="on", + [10760]="on", + [10761]="on", + [10762]="on", + [10763]="on", + [10764]="on", + [10765]="on", + [10766]="on", + [10767]="on", + [10768]="on", + [10769]="on", + [10770]="on", + [10771]="on", + [10772]="on", + [10773]="on", + [10774]="on", + [10775]="on", + [10776]="on", + [10777]="on", + [10778]="on", + [10779]="on", + [10780]="on", + [10781]="on", + [10782]="on", + [10783]="on", + [10784]="on", + [10785]="on", + [10786]="on", + [10787]="on", + [10788]="on", + [10789]="on", + [10790]="on", + [10791]="on", + [10792]="on", + [10793]="on", + [10794]="on", + [10795]="on", + [10796]="on", + [10797]="on", + [10798]="on", + [10799]="on", + [10800]="on", + [10801]="on", + [10802]="on", + [10803]="on", + [10804]="on", + [10805]="on", + [10806]="on", + [10807]="on", + [10808]="on", + [10809]="on", + [10810]="on", + [10811]="on", + [10812]="on", + [10813]="on", + [10814]="on", + [10815]="on", + [10816]="on", + [10817]="on", + [10818]="on", + [10819]="on", + [10820]="on", + [10821]="on", + [10822]="on", + [10823]="on", + [10824]="on", + [10825]="on", + [10826]="on", + [10827]="on", + [10828]="on", + [10829]="on", + [10830]="on", + [10831]="on", + [10832]="on", + [10833]="on", + [10834]="on", + [10835]="on", + [10836]="on", + [10837]="on", + [10838]="on", + [10839]="on", + [10840]="on", + [10841]="on", + [10842]="on", + [10843]="on", + [10844]="on", + [10845]="on", + [10846]="on", + [10847]="on", + [10848]="on", + [10849]="on", + [10850]="on", + [10851]="on", + [10852]="on", + [10853]="on", + [10854]="on", + [10855]="on", + [10856]="on", + [10857]="on", + [10858]="on", + [10859]="on", + [10860]="on", + [10861]="on", + [10862]="on", + [10863]="on", + [10864]="on", + [10865]="on", + [10866]="on", + [10867]="on", + [10868]="on", + [10869]="on", + [10870]="on", + [10871]="on", + [10872]="on", + [10873]="on", + [10874]="on", + [10875]="on", + [10876]="on", + [10877]="on", + [10878]="on", + [10879]="on", + [10880]="on", + [10881]="on", + [10882]="on", + [10883]="on", + [10884]="on", + [10885]="on", + [10886]="on", + [10887]="on", + [10888]="on", + [10889]="on", + [10890]="on", + [10891]="on", + [10892]="on", + [10893]="on", + [10894]="on", + [10895]="on", + [10896]="on", + [10897]="on", + [10898]="on", + [10899]="on", + [10900]="on", + [10901]="on", + [10902]="on", + [10903]="on", + [10904]="on", + [10905]="on", + [10906]="on", + [10907]="on", + [10908]="on", + [10909]="on", + [10910]="on", + [10911]="on", + [10912]="on", + [10913]="on", + [10914]="on", + [10915]="on", + [10916]="on", + [10917]="on", + [10918]="on", + [10919]="on", + [10920]="on", + [10921]="on", + [10922]="on", + [10923]="on", + [10924]="on", + [10925]="on", + [10926]="on", + [10927]="on", + [10928]="on", + [10929]="on", + [10930]="on", + [10931]="on", + [10932]="on", + [10933]="on", + [10934]="on", + [10935]="on", + [10936]="on", + [10937]="on", + [10938]="on", + [10939]="on", + [10940]="on", + [10941]="on", + [10942]="on", + [10943]="on", + [10944]="on", + [10945]="on", + [10946]="on", + [10947]="on", + [10948]="on", + [10949]="on", + [10950]="on", + [10951]="on", + [10952]="on", + [10953]="on", + [10954]="on", + [10955]="on", + [10956]="on", + [10957]="on", + [10958]="on", + [10959]="on", + [10960]="on", + [10961]="on", + [10962]="on", + [10963]="on", + [10964]="on", + [10965]="on", + [10966]="on", + [10967]="on", + [10968]="on", + [10969]="on", + [10970]="on", + [10971]="on", + [10972]="on", + [10973]="on", + [10974]="on", + [10975]="on", + [10976]="on", + [10977]="on", + [10978]="on", + [10979]="on", + [10980]="on", + [10981]="on", + [10982]="on", + [10983]="on", + [10984]="on", + [10985]="on", + [10986]="on", + [10987]="on", + [10988]="on", + [10989]="on", + [10990]="on", + [10991]="on", + [10992]="on", + [10993]="on", + [10994]="on", + [10995]="on", + [10996]="on", + [10997]="on", + [10998]="on", + [10999]="on", + [11000]="on", + [11001]="on", + [11002]="on", + [11003]="on", + [11004]="on", + [11005]="on", + [11006]="on", + [11007]="on", + [11008]="on", + [11009]="on", + [11010]="on", + [11011]="on", + [11012]="on", + [11013]="on", + [11014]="on", + [11015]="on", + [11016]="on", + [11017]="on", + [11018]="on", + [11019]="on", + [11020]="on", + [11021]="on", + [11022]="on", + [11023]="on", + [11024]="on", + [11025]="on", + [11026]="on", + [11027]="on", + [11028]="on", + [11029]="on", + [11030]="on", + [11031]="on", + [11032]="on", + [11033]="on", + [11034]="on", + [11035]="on", + [11036]="on", + [11037]="on", + [11038]="on", + [11039]="on", + [11040]="on", + [11041]="on", + [11042]="on", + [11043]="on", + [11044]="on", + [11045]="on", + [11046]="on", + [11047]="on", + [11048]="on", + [11049]="on", + [11050]="on", + [11051]="on", + [11052]="on", + [11053]="on", + [11054]="on", + [11055]="on", + [11056]="on", + [11057]="on", + [11058]="on", + [11059]="on", + [11060]="on", + [11061]="on", + [11062]="on", + [11063]="on", + [11064]="on", + [11065]="on", + [11066]="on", + [11067]="on", + [11068]="on", + [11069]="on", + [11070]="on", + [11071]="on", + [11072]="on", + [11073]="on", + [11074]="on", + [11075]="on", + [11076]="on", + [11077]="on", + [11078]="on", + [11079]="on", + [11080]="on", + [11081]="on", + [11082]="on", + [11083]="on", + [11084]="on", + [11085]="on", + [11086]="on", + [11087]="on", + [11088]="on", + [11089]="on", + [11090]="on", + [11091]="on", + [11092]="on", + [11093]="on", + [11094]="on", + [11095]="on", + [11096]="on", + [11097]="on", + [11098]="on", + [11099]="on", + [11100]="on", + [11101]="on", + [11102]="on", + [11103]="on", + [11104]="on", + [11105]="on", + [11106]="on", + [11107]="on", + [11108]="on", + [11109]="on", + [11110]="on", + [11111]="on", + [11112]="on", + [11113]="on", + [11114]="on", + [11115]="on", + [11116]="on", + [11117]="on", + [11118]="on", + [11119]="on", + [11120]="on", + [11121]="on", + [11122]="on", + [11123]="on", + [11126]="on", + [11127]="on", + [11128]="on", + [11129]="on", + [11130]="on", + [11131]="on", + [11132]="on", + [11133]="on", + [11134]="on", + [11135]="on", + [11136]="on", + [11137]="on", + [11138]="on", + [11139]="on", + [11140]="on", + [11141]="on", + [11142]="on", + [11143]="on", + [11144]="on", + [11145]="on", + [11146]="on", + [11147]="on", + [11148]="on", + [11149]="on", + [11150]="on", + [11151]="on", + [11152]="on", + [11153]="on", + [11154]="on", + [11155]="on", + [11156]="on", + [11157]="on", + [11160]="on", + [11161]="on", + [11162]="on", + [11163]="on", + [11164]="on", + [11165]="on", + [11166]="on", + [11167]="on", + [11168]="on", + [11169]="on", + [11170]="on", + [11171]="on", + [11172]="on", + [11173]="on", + [11174]="on", + [11175]="on", + [11176]="on", + [11177]="on", + [11178]="on", + [11179]="on", + [11180]="on", + [11181]="on", + [11182]="on", + [11183]="on", + [11184]="on", + [11185]="on", + [11186]="on", + [11187]="on", + [11188]="on", + [11189]="on", + [11190]="on", + [11191]="on", + [11192]="on", + [11193]="on", + [11197]="on", + [11198]="on", + [11199]="on", + [11200]="on", + [11201]="on", + [11202]="on", + [11203]="on", + [11204]="on", + [11205]="on", + [11206]="on", + [11207]="on", + [11208]="on", + [11210]="on", + [11211]="on", + [11212]="on", + [11213]="on", + [11214]="on", + [11215]="on", + [11216]="on", + [11217]="on", + [11218]="on", + [11244]="on", + [11245]="on", + [11246]="on", + [11247]="on", + [11493]="on", + [11494]="on", + [11495]="on", + [11496]="on", + [11497]="on", + [11498]="on", + [11503]="nsm", + [11504]="nsm", + [11505]="nsm", + [11513]="on", + [11514]="on", + [11515]="on", + [11516]="on", + [11517]="on", + [11518]="on", + [11519]="on", + [11647]="nsm", + [11744]="nsm", + [11745]="nsm", + [11746]="nsm", + [11747]="nsm", + [11748]="nsm", + [11749]="nsm", + [11750]="nsm", + [11751]="nsm", + [11752]="nsm", + [11753]="nsm", + [11754]="nsm", + [11755]="nsm", + [11756]="nsm", + [11757]="nsm", + [11758]="nsm", + [11759]="nsm", + [11760]="nsm", + [11761]="nsm", + [11762]="nsm", + [11763]="nsm", + [11764]="nsm", + [11765]="nsm", + [11766]="nsm", + [11767]="nsm", + [11768]="nsm", + [11769]="nsm", + [11770]="nsm", + [11771]="nsm", + [11772]="nsm", + [11773]="nsm", + [11774]="nsm", + [11775]="nsm", + [11776]="on", + [11777]="on", + [11778]="on", + [11779]="on", + [11780]="on", + [11781]="on", + [11782]="on", + [11783]="on", + [11784]="on", + [11785]="on", + [11786]="on", + [11787]="on", + [11788]="on", + [11789]="on", + [11790]="on", + [11791]="on", + [11792]="on", + [11793]="on", + [11794]="on", + [11795]="on", + [11796]="on", + [11797]="on", + [11798]="on", + [11799]="on", + [11800]="on", + [11801]="on", + [11802]="on", + [11803]="on", + [11804]="on", + [11805]="on", + [11806]="on", + [11807]="on", + [11808]="on", + [11809]="on", + [11810]="on", + [11811]="on", + [11812]="on", + [11813]="on", + [11814]="on", + [11815]="on", + [11816]="on", + [11817]="on", + [11818]="on", + [11819]="on", + [11820]="on", + [11821]="on", + [11822]="on", + [11823]="on", + [11824]="on", + [11825]="on", + [11826]="on", + [11827]="on", + [11828]="on", + [11829]="on", + [11830]="on", + [11831]="on", + [11832]="on", + [11833]="on", + [11834]="on", + [11835]="on", + [11836]="on", + [11837]="on", + [11838]="on", + [11839]="on", + [11840]="on", + [11841]="on", + [11842]="on", + [11843]="on", + [11844]="on", + [11845]="on", + [11846]="on", + [11847]="on", + [11848]="on", + [11849]="on", + [11904]="on", + [11905]="on", + [11906]="on", + [11907]="on", + [11908]="on", + [11909]="on", + [11910]="on", + [11911]="on", + [11912]="on", + [11913]="on", + [11914]="on", + [11915]="on", + [11916]="on", + [11917]="on", + [11918]="on", + [11919]="on", + [11920]="on", + [11921]="on", + [11922]="on", + [11923]="on", + [11924]="on", + [11925]="on", + [11926]="on", + [11927]="on", + [11928]="on", + [11929]="on", + [11931]="on", + [11932]="on", + [11933]="on", + [11934]="on", + [11935]="on", + [11936]="on", + [11937]="on", + [11938]="on", + [11939]="on", + [11940]="on", + [11941]="on", + [11942]="on", + [11943]="on", + [11944]="on", + [11945]="on", + [11946]="on", + [11947]="on", + [11948]="on", + [11949]="on", + [11950]="on", + [11951]="on", + [11952]="on", + [11953]="on", + [11954]="on", + [11955]="on", + [11956]="on", + [11957]="on", + [11958]="on", + [11959]="on", + [11960]="on", + [11961]="on", + [11962]="on", + [11963]="on", + [11964]="on", + [11965]="on", + [11966]="on", + [11967]="on", + [11968]="on", + [11969]="on", + [11970]="on", + [11971]="on", + [11972]="on", + [11973]="on", + [11974]="on", + [11975]="on", + [11976]="on", + [11977]="on", + [11978]="on", + [11979]="on", + [11980]="on", + [11981]="on", + [11982]="on", + [11983]="on", + [11984]="on", + [11985]="on", + [11986]="on", + [11987]="on", + [11988]="on", + [11989]="on", + [11990]="on", + [11991]="on", + [11992]="on", + [11993]="on", + [11994]="on", + [11995]="on", + [11996]="on", + [11997]="on", + [11998]="on", + [11999]="on", + [12000]="on", + [12001]="on", + [12002]="on", + [12003]="on", + [12004]="on", + [12005]="on", + [12006]="on", + [12007]="on", + [12008]="on", + [12009]="on", + [12010]="on", + [12011]="on", + [12012]="on", + [12013]="on", + [12014]="on", + [12015]="on", + [12016]="on", + [12017]="on", + [12018]="on", + [12019]="on", + [12032]="on", + [12033]="on", + [12034]="on", + [12035]="on", + [12036]="on", + [12037]="on", + [12038]="on", + [12039]="on", + [12040]="on", + [12041]="on", + [12042]="on", + [12043]="on", + [12044]="on", + [12045]="on", + [12046]="on", + [12047]="on", + [12048]="on", + [12049]="on", + [12050]="on", + [12051]="on", + [12052]="on", + [12053]="on", + [12054]="on", + [12055]="on", + [12056]="on", + [12057]="on", + [12058]="on", + [12059]="on", + [12060]="on", + [12061]="on", + [12062]="on", + [12063]="on", + [12064]="on", + [12065]="on", + [12066]="on", + [12067]="on", + [12068]="on", + [12069]="on", + [12070]="on", + [12071]="on", + [12072]="on", + [12073]="on", + [12074]="on", + [12075]="on", + [12076]="on", + [12077]="on", + [12078]="on", + [12079]="on", + [12080]="on", + [12081]="on", + [12082]="on", + [12083]="on", + [12084]="on", + [12085]="on", + [12086]="on", + [12087]="on", + [12088]="on", + [12089]="on", + [12090]="on", + [12091]="on", + [12092]="on", + [12093]="on", + [12094]="on", + [12095]="on", + [12096]="on", + [12097]="on", + [12098]="on", + [12099]="on", + [12100]="on", + [12101]="on", + [12102]="on", + [12103]="on", + [12104]="on", + [12105]="on", + [12106]="on", + [12107]="on", + [12108]="on", + [12109]="on", + [12110]="on", + [12111]="on", + [12112]="on", + [12113]="on", + [12114]="on", + [12115]="on", + [12116]="on", + [12117]="on", + [12118]="on", + [12119]="on", + [12120]="on", + [12121]="on", + [12122]="on", + [12123]="on", + [12124]="on", + [12125]="on", + [12126]="on", + [12127]="on", + [12128]="on", + [12129]="on", + [12130]="on", + [12131]="on", + [12132]="on", + [12133]="on", + [12134]="on", + [12135]="on", + [12136]="on", + [12137]="on", + [12138]="on", + [12139]="on", + [12140]="on", + [12141]="on", + [12142]="on", + [12143]="on", + [12144]="on", + [12145]="on", + [12146]="on", + [12147]="on", + [12148]="on", + [12149]="on", + [12150]="on", + [12151]="on", + [12152]="on", + [12153]="on", + [12154]="on", + [12155]="on", + [12156]="on", + [12157]="on", + [12158]="on", + [12159]="on", + [12160]="on", + [12161]="on", + [12162]="on", + [12163]="on", + [12164]="on", + [12165]="on", + [12166]="on", + [12167]="on", + [12168]="on", + [12169]="on", + [12170]="on", + [12171]="on", + [12172]="on", + [12173]="on", + [12174]="on", + [12175]="on", + [12176]="on", + [12177]="on", + [12178]="on", + [12179]="on", + [12180]="on", + [12181]="on", + [12182]="on", + [12183]="on", + [12184]="on", + [12185]="on", + [12186]="on", + [12187]="on", + [12188]="on", + [12189]="on", + [12190]="on", + [12191]="on", + [12192]="on", + [12193]="on", + [12194]="on", + [12195]="on", + [12196]="on", + [12197]="on", + [12198]="on", + [12199]="on", + [12200]="on", + [12201]="on", + [12202]="on", + [12203]="on", + [12204]="on", + [12205]="on", + [12206]="on", + [12207]="on", + [12208]="on", + [12209]="on", + [12210]="on", + [12211]="on", + [12212]="on", + [12213]="on", + [12214]="on", + [12215]="on", + [12216]="on", + [12217]="on", + [12218]="on", + [12219]="on", + [12220]="on", + [12221]="on", + [12222]="on", + [12223]="on", + [12224]="on", + [12225]="on", + [12226]="on", + [12227]="on", + [12228]="on", + [12229]="on", + [12230]="on", + [12231]="on", + [12232]="on", + [12233]="on", + [12234]="on", + [12235]="on", + [12236]="on", + [12237]="on", + [12238]="on", + [12239]="on", + [12240]="on", + [12241]="on", + [12242]="on", + [12243]="on", + [12244]="on", + [12245]="on", + [12272]="on", + [12273]="on", + [12274]="on", + [12275]="on", + [12276]="on", + [12277]="on", + [12278]="on", + [12279]="on", + [12280]="on", + [12281]="on", + [12282]="on", + [12283]="on", + [12288]="ws", + [12289]="on", + [12290]="on", + [12291]="on", + [12292]="on", + [12296]="on", + [12297]="on", + [12298]="on", + [12299]="on", + [12300]="on", + [12301]="on", + [12302]="on", + [12303]="on", + [12304]="on", + [12305]="on", + [12306]="on", + [12307]="on", + [12308]="on", + [12309]="on", + [12310]="on", + [12311]="on", + [12312]="on", + [12313]="on", + [12314]="on", + [12315]="on", + [12316]="on", + [12317]="on", + [12318]="on", + [12319]="on", + [12320]="on", + [12330]="nsm", + [12331]="nsm", + [12332]="nsm", + [12333]="nsm", + [12336]="on", + [12342]="on", + [12343]="on", + [12349]="on", + [12350]="on", + [12351]="on", + [12441]="nsm", + [12442]="nsm", + [12443]="on", + [12444]="on", + [12448]="on", + [12539]="on", + [12736]="on", + [12737]="on", + [12738]="on", + [12739]="on", + [12740]="on", + [12741]="on", + [12742]="on", + [12743]="on", + [12744]="on", + [12745]="on", + [12746]="on", + [12747]="on", + [12748]="on", + [12749]="on", + [12750]="on", + [12751]="on", + [12752]="on", + [12753]="on", + [12754]="on", + [12755]="on", + [12756]="on", + [12757]="on", + [12758]="on", + [12759]="on", + [12760]="on", + [12761]="on", + [12762]="on", + [12763]="on", + [12764]="on", + [12765]="on", + [12766]="on", + [12767]="on", + [12768]="on", + [12769]="on", + [12770]="on", + [12771]="on", + [12829]="on", + [12830]="on", + [12880]="on", + [12881]="on", + [12882]="on", + [12883]="on", + [12884]="on", + [12885]="on", + [12886]="on", + [12887]="on", + [12888]="on", + [12889]="on", + [12890]="on", + [12891]="on", + [12892]="on", + [12893]="on", + [12894]="on", + [12895]="on", + [12924]="on", + [12925]="on", + [12926]="on", + [12977]="on", + [12978]="on", + [12979]="on", + [12980]="on", + [12981]="on", + [12982]="on", + [12983]="on", + [12984]="on", + [12985]="on", + [12986]="on", + [12987]="on", + [12988]="on", + [12989]="on", + [12990]="on", + [12991]="on", + [13004]="on", + [13005]="on", + [13006]="on", + [13007]="on", + [13175]="on", + [13176]="on", + [13177]="on", + [13178]="on", + [13278]="on", + [13279]="on", + [13311]="on", + [19904]="on", + [19905]="on", + [19906]="on", + [19907]="on", + [19908]="on", + [19909]="on", + [19910]="on", + [19911]="on", + [19912]="on", + [19913]="on", + [19914]="on", + [19915]="on", + [19916]="on", + [19917]="on", + [19918]="on", + [19919]="on", + [19920]="on", + [19921]="on", + [19922]="on", + [19923]="on", + [19924]="on", + [19925]="on", + [19926]="on", + [19927]="on", + [19928]="on", + [19929]="on", + [19930]="on", + [19931]="on", + [19932]="on", + [19933]="on", + [19934]="on", + [19935]="on", + [19936]="on", + [19937]="on", + [19938]="on", + [19939]="on", + [19940]="on", + [19941]="on", + [19942]="on", + [19943]="on", + [19944]="on", + [19945]="on", + [19946]="on", + [19947]="on", + [19948]="on", + [19949]="on", + [19950]="on", + [19951]="on", + [19952]="on", + [19953]="on", + [19954]="on", + [19955]="on", + [19956]="on", + [19957]="on", + [19958]="on", + [19959]="on", + [19960]="on", + [19961]="on", + [19962]="on", + [19963]="on", + [19964]="on", + [19965]="on", + [19966]="on", + [19967]="on", + [42128]="on", + [42129]="on", + [42130]="on", + [42131]="on", + [42132]="on", + [42133]="on", + [42134]="on", + [42135]="on", + [42136]="on", + [42137]="on", + [42138]="on", + [42139]="on", + [42140]="on", + [42141]="on", + [42142]="on", + [42143]="on", + [42144]="on", + [42145]="on", + [42146]="on", + [42147]="on", + [42148]="on", + [42149]="on", + [42150]="on", + [42151]="on", + [42152]="on", + [42153]="on", + [42154]="on", + [42155]="on", + [42156]="on", + [42157]="on", + [42158]="on", + [42159]="on", + [42160]="on", + [42161]="on", + [42162]="on", + [42163]="on", + [42164]="on", + [42165]="on", + [42166]="on", + [42167]="on", + [42168]="on", + [42169]="on", + [42170]="on", + [42171]="on", + [42172]="on", + [42173]="on", + [42174]="on", + [42175]="on", + [42176]="on", + [42177]="on", + [42178]="on", + [42179]="on", + [42180]="on", + [42181]="on", + [42182]="on", + [42509]="on", + [42510]="on", + [42511]="on", + [42607]="nsm", + [42608]="nsm", + [42609]="nsm", + [42610]="nsm", + [42611]="on", + [42612]="nsm", + [42613]="nsm", + [42614]="nsm", + [42615]="nsm", + [42616]="nsm", + [42617]="nsm", + [42618]="nsm", + [42619]="nsm", + [42620]="nsm", + [42621]="nsm", + [42622]="on", + [42623]="on", + [42654]="nsm", + [42655]="nsm", + [42736]="nsm", + [42737]="nsm", + [42752]="on", + [42753]="on", + [42754]="on", + [42755]="on", + [42756]="on", + [42757]="on", + [42758]="on", + [42759]="on", + [42760]="on", + [42761]="on", + [42762]="on", + [42763]="on", + [42764]="on", + [42765]="on", + [42766]="on", + [42767]="on", + [42768]="on", + [42769]="on", + [42770]="on", + [42771]="on", + [42772]="on", + [42773]="on", + [42774]="on", + [42775]="on", + [42776]="on", + [42777]="on", + [42778]="on", + [42779]="on", + [42780]="on", + [42781]="on", + [42782]="on", + [42783]="on", + [42784]="on", + [42785]="on", + [42888]="on", + [43010]="nsm", + [43014]="nsm", + [43019]="nsm", + [43045]="nsm", + [43046]="nsm", + [43048]="on", + [43049]="on", + [43050]="on", + [43051]="on", + [43064]="et", + [43065]="et", + [43124]="on", + [43125]="on", + [43126]="on", + [43127]="on", + [43204]="nsm", + [43205]="nsm", + [43232]="nsm", + [43233]="nsm", + [43234]="nsm", + [43235]="nsm", + [43236]="nsm", + [43237]="nsm", + [43238]="nsm", + [43239]="nsm", + [43240]="nsm", + [43241]="nsm", + [43242]="nsm", + [43243]="nsm", + [43244]="nsm", + [43245]="nsm", + [43246]="nsm", + [43247]="nsm", + [43248]="nsm", + [43249]="nsm", + [43302]="nsm", + [43303]="nsm", + [43304]="nsm", + [43305]="nsm", + [43306]="nsm", + [43307]="nsm", + [43308]="nsm", + [43309]="nsm", + [43335]="nsm", + [43336]="nsm", + [43337]="nsm", + [43338]="nsm", + [43339]="nsm", + [43340]="nsm", + [43341]="nsm", + [43342]="nsm", + [43343]="nsm", + [43344]="nsm", + [43345]="nsm", + [43392]="nsm", + [43393]="nsm", + [43394]="nsm", + [43443]="nsm", + [43446]="nsm", + [43447]="nsm", + [43448]="nsm", + [43449]="nsm", + [43452]="nsm", + [43493]="nsm", + [43561]="nsm", + [43562]="nsm", + [43563]="nsm", + [43564]="nsm", + [43565]="nsm", + [43566]="nsm", + [43569]="nsm", + [43570]="nsm", + [43573]="nsm", + [43574]="nsm", + [43587]="nsm", + [43596]="nsm", + [43644]="nsm", + [43696]="nsm", + [43698]="nsm", + [43699]="nsm", + [43700]="nsm", + [43703]="nsm", + [43704]="nsm", + [43710]="nsm", + [43711]="nsm", + [43713]="nsm", + [43756]="nsm", + [43757]="nsm", + [43766]="nsm", + [44005]="nsm", + [44008]="nsm", + [44013]="nsm", + [64285]="r", + [64286]="nsm", + [64287]="r", + [64288]="r", + [64289]="r", + [64290]="r", + [64291]="r", + [64292]="r", + [64293]="r", + [64294]="r", + [64295]="r", + [64296]="r", + [64297]="es", + [64298]="r", + [64299]="r", + [64300]="r", + [64301]="r", + [64302]="r", + [64303]="r", + [64304]="r", + [64305]="r", + [64306]="r", + [64307]="r", + [64308]="r", + [64309]="r", + [64310]="r", + [64312]="r", + [64313]="r", + [64314]="r", + [64315]="r", + [64316]="r", + [64318]="r", + [64320]="r", + [64321]="r", + [64323]="r", + [64324]="r", + [64326]="r", + [64327]="r", + [64328]="r", + [64329]="r", + [64330]="r", + [64331]="r", + [64332]="r", + [64333]="r", + [64334]="r", + [64335]="r", + [64336]="al", + [64337]="al", + [64338]="al", + [64339]="al", + [64340]="al", + [64341]="al", + [64342]="al", + [64343]="al", + [64344]="al", + [64345]="al", + [64346]="al", + [64347]="al", + [64348]="al", + [64349]="al", + [64350]="al", + [64351]="al", + [64352]="al", + [64353]="al", + [64354]="al", + [64355]="al", + [64356]="al", + [64357]="al", + [64358]="al", + [64359]="al", + [64360]="al", + [64361]="al", + [64362]="al", + [64363]="al", + [64364]="al", + [64365]="al", + [64366]="al", + [64367]="al", + [64368]="al", + [64369]="al", + [64370]="al", + [64371]="al", + [64372]="al", + [64373]="al", + [64374]="al", + [64375]="al", + [64376]="al", + [64377]="al", + [64378]="al", + [64379]="al", + [64380]="al", + [64381]="al", + [64382]="al", + [64383]="al", + [64384]="al", + [64385]="al", + [64386]="al", + [64387]="al", + [64388]="al", + [64389]="al", + [64390]="al", + [64391]="al", + [64392]="al", + [64393]="al", + [64394]="al", + [64395]="al", + [64396]="al", + [64397]="al", + [64398]="al", + [64399]="al", + [64400]="al", + [64401]="al", + [64402]="al", + [64403]="al", + [64404]="al", + [64405]="al", + [64406]="al", + [64407]="al", + [64408]="al", + [64409]="al", + [64410]="al", + [64411]="al", + [64412]="al", + [64413]="al", + [64414]="al", + [64415]="al", + [64416]="al", + [64417]="al", + [64418]="al", + [64419]="al", + [64420]="al", + [64421]="al", + [64422]="al", + [64423]="al", + [64424]="al", + [64425]="al", + [64426]="al", + [64427]="al", + [64428]="al", + [64429]="al", + [64430]="al", + [64431]="al", + [64432]="al", + [64433]="al", + [64434]="al", + [64435]="al", + [64436]="al", + [64437]="al", + [64438]="al", + [64439]="al", + [64440]="al", + [64441]="al", + [64442]="al", + [64443]="al", + [64444]="al", + [64445]="al", + [64446]="al", + [64447]="al", + [64448]="al", + [64449]="al", + [64467]="al", + [64468]="al", + [64469]="al", + [64470]="al", + [64471]="al", + [64472]="al", + [64473]="al", + [64474]="al", + [64475]="al", + [64476]="al", + [64477]="al", + [64478]="al", + [64479]="al", + [64480]="al", + [64481]="al", + [64482]="al", + [64483]="al", + [64484]="al", + [64485]="al", + [64486]="al", + [64487]="al", + [64488]="al", + [64489]="al", + [64490]="al", + [64491]="al", + [64492]="al", + [64493]="al", + [64494]="al", + [64495]="al", + [64496]="al", + [64497]="al", + [64498]="al", + [64499]="al", + [64500]="al", + [64501]="al", + [64502]="al", + [64503]="al", + [64504]="al", + [64505]="al", + [64506]="al", + [64507]="al", + [64508]="al", + [64509]="al", + [64510]="al", + [64511]="al", + [64512]="al", + [64513]="al", + [64514]="al", + [64515]="al", + [64516]="al", + [64517]="al", + [64518]="al", + [64519]="al", + [64520]="al", + [64521]="al", + [64522]="al", + [64523]="al", + [64524]="al", + [64525]="al", + [64526]="al", + [64527]="al", + [64528]="al", + [64529]="al", + [64530]="al", + [64531]="al", + [64532]="al", + [64533]="al", + [64534]="al", + [64535]="al", + [64536]="al", + [64537]="al", + [64538]="al", + [64539]="al", + [64540]="al", + [64541]="al", + [64542]="al", + [64543]="al", + [64544]="al", + [64545]="al", + [64546]="al", + [64547]="al", + [64548]="al", + [64549]="al", + [64550]="al", + [64551]="al", + [64552]="al", + [64553]="al", + [64554]="al", + [64555]="al", + [64556]="al", + [64557]="al", + [64558]="al", + [64559]="al", + [64560]="al", + [64561]="al", + [64562]="al", + [64563]="al", + [64564]="al", + [64565]="al", + [64566]="al", + [64567]="al", + [64568]="al", + [64569]="al", + [64570]="al", + [64571]="al", + [64572]="al", + [64573]="al", + [64574]="al", + [64575]="al", + [64576]="al", + [64577]="al", + [64578]="al", + [64579]="al", + [64580]="al", + [64581]="al", + [64582]="al", + [64583]="al", + [64584]="al", + [64585]="al", + [64586]="al", + [64587]="al", + [64588]="al", + [64589]="al", + [64590]="al", + [64591]="al", + [64592]="al", + [64593]="al", + [64594]="al", + [64595]="al", + [64596]="al", + [64597]="al", + [64598]="al", + [64599]="al", + [64600]="al", + [64601]="al", + [64602]="al", + [64603]="al", + [64604]="al", + [64605]="al", + [64606]="al", + [64607]="al", + [64608]="al", + [64609]="al", + [64610]="al", + [64611]="al", + [64612]="al", + [64613]="al", + [64614]="al", + [64615]="al", + [64616]="al", + [64617]="al", + [64618]="al", + [64619]="al", + [64620]="al", + [64621]="al", + [64622]="al", + [64623]="al", + [64624]="al", + [64625]="al", + [64626]="al", + [64627]="al", + [64628]="al", + [64629]="al", + [64630]="al", + [64631]="al", + [64632]="al", + [64633]="al", + [64634]="al", + [64635]="al", + [64636]="al", + [64637]="al", + [64638]="al", + [64639]="al", + [64640]="al", + [64641]="al", + [64642]="al", + [64643]="al", + [64644]="al", + [64645]="al", + [64646]="al", + [64647]="al", + [64648]="al", + [64649]="al", + [64650]="al", + [64651]="al", + [64652]="al", + [64653]="al", + [64654]="al", + [64655]="al", + [64656]="al", + [64657]="al", + [64658]="al", + [64659]="al", + [64660]="al", + [64661]="al", + [64662]="al", + [64663]="al", + [64664]="al", + [64665]="al", + [64666]="al", + [64667]="al", + [64668]="al", + [64669]="al", + [64670]="al", + [64671]="al", + [64672]="al", + [64673]="al", + [64674]="al", + [64675]="al", + [64676]="al", + [64677]="al", + [64678]="al", + [64679]="al", + [64680]="al", + [64681]="al", + [64682]="al", + [64683]="al", + [64684]="al", + [64685]="al", + [64686]="al", + [64687]="al", + [64688]="al", + [64689]="al", + [64690]="al", + [64691]="al", + [64692]="al", + [64693]="al", + [64694]="al", + [64695]="al", + [64696]="al", + [64697]="al", + [64698]="al", + [64699]="al", + [64700]="al", + [64701]="al", + [64702]="al", + [64703]="al", + [64704]="al", + [64705]="al", + [64706]="al", + [64707]="al", + [64708]="al", + [64709]="al", + [64710]="al", + [64711]="al", + [64712]="al", + [64713]="al", + [64714]="al", + [64715]="al", + [64716]="al", + [64717]="al", + [64718]="al", + [64719]="al", + [64720]="al", + [64721]="al", + [64722]="al", + [64723]="al", + [64724]="al", + [64725]="al", + [64726]="al", + [64727]="al", + [64728]="al", + [64729]="al", + [64730]="al", + [64731]="al", + [64732]="al", + [64733]="al", + [64734]="al", + [64735]="al", + [64736]="al", + [64737]="al", + [64738]="al", + [64739]="al", + [64740]="al", + [64741]="al", + [64742]="al", + [64743]="al", + [64744]="al", + [64745]="al", + [64746]="al", + [64747]="al", + [64748]="al", + [64749]="al", + [64750]="al", + [64751]="al", + [64752]="al", + [64753]="al", + [64754]="al", + [64755]="al", + [64756]="al", + [64757]="al", + [64758]="al", + [64759]="al", + [64760]="al", + [64761]="al", + [64762]="al", + [64763]="al", + [64764]="al", + [64765]="al", + [64766]="al", + [64767]="al", + [64768]="al", + [64769]="al", + [64770]="al", + [64771]="al", + [64772]="al", + [64773]="al", + [64774]="al", + [64775]="al", + [64776]="al", + [64777]="al", + [64778]="al", + [64779]="al", + [64780]="al", + [64781]="al", + [64782]="al", + [64783]="al", + [64784]="al", + [64785]="al", + [64786]="al", + [64787]="al", + [64788]="al", + [64789]="al", + [64790]="al", + [64791]="al", + [64792]="al", + [64793]="al", + [64794]="al", + [64795]="al", + [64796]="al", + [64797]="al", + [64798]="al", + [64799]="al", + [64800]="al", + [64801]="al", + [64802]="al", + [64803]="al", + [64804]="al", + [64805]="al", + [64806]="al", + [64807]="al", + [64808]="al", + [64809]="al", + [64810]="al", + [64811]="al", + [64812]="al", + [64813]="al", + [64814]="al", + [64815]="al", + [64816]="al", + [64817]="al", + [64818]="al", + [64819]="al", + [64820]="al", + [64821]="al", + [64822]="al", + [64823]="al", + [64824]="al", + [64825]="al", + [64826]="al", + [64827]="al", + [64828]="al", + [64829]="al", + [64830]="on", + [64831]="on", + [64848]="al", + [64849]="al", + [64850]="al", + [64851]="al", + [64852]="al", + [64853]="al", + [64854]="al", + [64855]="al", + [64856]="al", + [64857]="al", + [64858]="al", + [64859]="al", + [64860]="al", + [64861]="al", + [64862]="al", + [64863]="al", + [64864]="al", + [64865]="al", + [64866]="al", + [64867]="al", + [64868]="al", + [64869]="al", + [64870]="al", + [64871]="al", + [64872]="al", + [64873]="al", + [64874]="al", + [64875]="al", + [64876]="al", + [64877]="al", + [64878]="al", + [64879]="al", + [64880]="al", + [64881]="al", + [64882]="al", + [64883]="al", + [64884]="al", + [64885]="al", + [64886]="al", + [64887]="al", + [64888]="al", + [64889]="al", + [64890]="al", + [64891]="al", + [64892]="al", + [64893]="al", + [64894]="al", + [64895]="al", + [64896]="al", + [64897]="al", + [64898]="al", + [64899]="al", + [64900]="al", + [64901]="al", + [64902]="al", + [64903]="al", + [64904]="al", + [64905]="al", + [64906]="al", + [64907]="al", + [64908]="al", + [64909]="al", + [64910]="al", + [64911]="al", + [64914]="al", + [64915]="al", + [64916]="al", + [64917]="al", + [64918]="al", + [64919]="al", + [64920]="al", + [64921]="al", + [64922]="al", + [64923]="al", + [64924]="al", + [64925]="al", + [64926]="al", + [64927]="al", + [64928]="al", + [64929]="al", + [64930]="al", + [64931]="al", + [64932]="al", + [64933]="al", + [64934]="al", + [64935]="al", + [64936]="al", + [64937]="al", + [64938]="al", + [64939]="al", + [64940]="al", + [64941]="al", + [64942]="al", + [64943]="al", + [64944]="al", + [64945]="al", + [64946]="al", + [64947]="al", + [64948]="al", + [64949]="al", + [64950]="al", + [64951]="al", + [64952]="al", + [64953]="al", + [64954]="al", + [64955]="al", + [64956]="al", + [64957]="al", + [64958]="al", + [64959]="al", + [64960]="al", + [64961]="al", + [64962]="al", + [64963]="al", + [64964]="al", + [64965]="al", + [64966]="al", + [64967]="al", + [65008]="al", + [65009]="al", + [65010]="al", + [65011]="al", + [65012]="al", + [65013]="al", + [65014]="al", + [65015]="al", + [65016]="al", + [65017]="al", + [65018]="al", + [65019]="al", + [65020]="al", + [65021]="on", + [65040]="on", + [65041]="on", + [65042]="on", + [65043]="on", + [65044]="on", + [65045]="on", + [65046]="on", + [65047]="on", + [65048]="on", + [65049]="on", + [65056]="nsm", + [65057]="nsm", + [65058]="nsm", + [65059]="nsm", + [65060]="nsm", + [65061]="nsm", + [65062]="nsm", + [65063]="nsm", + [65064]="nsm", + [65065]="nsm", + [65066]="nsm", + [65067]="nsm", + [65068]="nsm", + [65069]="nsm", + [65070]="nsm", + [65071]="nsm", + [65072]="on", + [65073]="on", + [65074]="on", + [65075]="on", + [65076]="on", + [65077]="on", + [65078]="on", + [65079]="on", + [65080]="on", + [65081]="on", + [65082]="on", + [65083]="on", + [65084]="on", + [65085]="on", + [65086]="on", + [65087]="on", + [65088]="on", + [65089]="on", + [65090]="on", + [65091]="on", + [65092]="on", + [65093]="on", + [65094]="on", + [65095]="on", + [65096]="on", + [65097]="on", + [65098]="on", + [65099]="on", + [65100]="on", + [65101]="on", + [65102]="on", + [65103]="on", + [65104]="cs", + [65105]="on", + [65106]="cs", + [65108]="on", + [65109]="cs", + [65110]="on", + [65111]="on", + [65112]="on", + [65113]="on", + [65114]="on", + [65115]="on", + [65116]="on", + [65117]="on", + [65118]="on", + [65119]="et", + [65120]="on", + [65121]="on", + [65122]="es", + [65123]="es", + [65124]="on", + [65125]="on", + [65126]="on", + [65128]="on", + [65129]="et", + [65130]="et", + [65131]="on", + [65136]="al", + [65137]="al", + [65138]="al", + [65139]="al", + [65140]="al", + [65142]="al", + [65143]="al", + [65144]="al", + [65145]="al", + [65146]="al", + [65147]="al", + [65148]="al", + [65149]="al", + [65150]="al", + [65151]="al", + [65152]="al", + [65153]="al", + [65154]="al", + [65155]="al", + [65156]="al", + [65157]="al", + [65158]="al", + [65159]="al", + [65160]="al", + [65161]="al", + [65162]="al", + [65163]="al", + [65164]="al", + [65165]="al", + [65166]="al", + [65167]="al", + [65168]="al", + [65169]="al", + [65170]="al", + [65171]="al", + [65172]="al", + [65173]="al", + [65174]="al", + [65175]="al", + [65176]="al", + [65177]="al", + [65178]="al", + [65179]="al", + [65180]="al", + [65181]="al", + [65182]="al", + [65183]="al", + [65184]="al", + [65185]="al", + [65186]="al", + [65187]="al", + [65188]="al", + [65189]="al", + [65190]="al", + [65191]="al", + [65192]="al", + [65193]="al", + [65194]="al", + [65195]="al", + [65196]="al", + [65197]="al", + [65198]="al", + [65199]="al", + [65200]="al", + [65201]="al", + [65202]="al", + [65203]="al", + [65204]="al", + [65205]="al", + [65206]="al", + [65207]="al", + [65208]="al", + [65209]="al", + [65210]="al", + [65211]="al", + [65212]="al", + [65213]="al", + [65214]="al", + [65215]="al", + [65216]="al", + [65217]="al", + [65218]="al", + [65219]="al", + [65220]="al", + [65221]="al", + [65222]="al", + [65223]="al", + [65224]="al", + [65225]="al", + [65226]="al", + [65227]="al", + [65228]="al", + [65229]="al", + [65230]="al", + [65231]="al", + [65232]="al", + [65233]="al", + [65234]="al", + [65235]="al", + [65236]="al", + [65237]="al", + [65238]="al", + [65239]="al", + [65240]="al", + [65241]="al", + [65242]="al", + [65243]="al", + [65244]="al", + [65245]="al", + [65246]="al", + [65247]="al", + [65248]="al", + [65249]="al", + [65250]="al", + [65251]="al", + [65252]="al", + [65253]="al", + [65254]="al", + [65255]="al", + [65256]="al", + [65257]="al", + [65258]="al", + [65259]="al", + [65260]="al", + [65261]="al", + [65262]="al", + [65263]="al", + [65264]="al", + [65265]="al", + [65266]="al", + [65267]="al", + [65268]="al", + [65269]="al", + [65270]="al", + [65271]="al", + [65272]="al", + [65273]="al", + [65274]="al", + [65275]="al", + [65276]="al", + [65279]="bn", + [65281]="on", + [65282]="on", + [65283]="et", + [65284]="et", + [65285]="et", + [65286]="on", + [65287]="on", + [65288]="on", + [65289]="on", + [65290]="on", + [65291]="es", + [65292]="cs", + [65293]="es", + [65294]="cs", + [65295]="cs", + [65296]="en", + [65297]="en", + [65298]="en", + [65299]="en", + [65300]="en", + [65301]="en", + [65302]="en", + [65303]="en", + [65304]="en", + [65305]="en", + [65306]="cs", + [65307]="on", + [65308]="on", + [65309]="on", + [65310]="on", + [65311]="on", + [65312]="on", + [65339]="on", + [65340]="on", + [65341]="on", + [65342]="on", + [65343]="on", + [65344]="on", + [65371]="on", + [65372]="on", + [65373]="on", + [65374]="on", + [65375]="on", + [65376]="on", + [65377]="on", + [65378]="on", + [65379]="on", + [65380]="on", + [65381]="on", + [65504]="et", + [65505]="et", + [65506]="on", + [65507]="on", + [65508]="on", + [65509]="et", + [65510]="et", + [65512]="on", + [65513]="on", + [65514]="on", + [65515]="on", + [65516]="on", + [65517]="on", + [65518]="on", + [65529]="on", + [65530]="on", + [65531]="on", + [65532]="on", + [65533]="on", + [65793]="on", + [65856]="on", + [65857]="on", + [65858]="on", + [65859]="on", + [65860]="on", + [65861]="on", + [65862]="on", + [65863]="on", + [65864]="on", + [65865]="on", + [65866]="on", + [65867]="on", + [65868]="on", + [65869]="on", + [65870]="on", + [65871]="on", + [65872]="on", + [65873]="on", + [65874]="on", + [65875]="on", + [65876]="on", + [65877]="on", + [65878]="on", + [65879]="on", + [65880]="on", + [65881]="on", + [65882]="on", + [65883]="on", + [65884]="on", + [65885]="on", + [65886]="on", + [65887]="on", + [65888]="on", + [65889]="on", + [65890]="on", + [65891]="on", + [65892]="on", + [65893]="on", + [65894]="on", + [65895]="on", + [65896]="on", + [65897]="on", + [65898]="on", + [65899]="on", + [65900]="on", + [65901]="on", + [65902]="on", + [65903]="on", + [65904]="on", + [65905]="on", + [65906]="on", + [65907]="on", + [65908]="on", + [65909]="on", + [65910]="on", + [65911]="on", + [65912]="on", + [65913]="on", + [65914]="on", + [65915]="on", + [65916]="on", + [65917]="on", + [65918]="on", + [65919]="on", + [65920]="on", + [65921]="on", + [65922]="on", + [65923]="on", + [65924]="on", + [65925]="on", + [65926]="on", + [65927]="on", + [65928]="on", + [65929]="on", + [65930]="on", + [65931]="on", + [65932]="on", + [65936]="on", + [65937]="on", + [65938]="on", + [65939]="on", + [65940]="on", + [65941]="on", + [65942]="on", + [65943]="on", + [65944]="on", + [65945]="on", + [65946]="on", + [65947]="on", + [65952]="on", + [66045]="nsm", + [66272]="nsm", + [66273]="en", + [66274]="en", + [66275]="en", + [66276]="en", + [66277]="en", + [66278]="en", + [66279]="en", + [66280]="en", + [66281]="en", + [66282]="en", + [66283]="en", + [66284]="en", + [66285]="en", + [66286]="en", + [66287]="en", + [66288]="en", + [66289]="en", + [66290]="en", + [66291]="en", + [66292]="en", + [66293]="en", + [66294]="en", + [66295]="en", + [66296]="en", + [66297]="en", + [66298]="en", + [66299]="en", + [66422]="nsm", + [66423]="nsm", + [66424]="nsm", + [66425]="nsm", + [66426]="nsm", + [67584]="r", + [67585]="r", + [67586]="r", + [67587]="r", + [67588]="r", + [67589]="r", + [67592]="r", + [67594]="r", + [67595]="r", + [67596]="r", + [67597]="r", + [67598]="r", + [67599]="r", + [67600]="r", + [67601]="r", + [67602]="r", + [67603]="r", + [67604]="r", + [67605]="r", + [67606]="r", + [67607]="r", + [67608]="r", + [67609]="r", + [67610]="r", + [67611]="r", + [67612]="r", + [67613]="r", + [67614]="r", + [67615]="r", + [67616]="r", + [67617]="r", + [67618]="r", + [67619]="r", + [67620]="r", + [67621]="r", + [67622]="r", + [67623]="r", + [67624]="r", + [67625]="r", + [67626]="r", + [67627]="r", + [67628]="r", + [67629]="r", + [67630]="r", + [67631]="r", + [67632]="r", + [67633]="r", + [67634]="r", + [67635]="r", + [67636]="r", + [67637]="r", + [67639]="r", + [67640]="r", + [67644]="r", + [67647]="r", + [67648]="r", + [67649]="r", + [67650]="r", + [67651]="r", + [67652]="r", + [67653]="r", + [67654]="r", + [67655]="r", + [67656]="r", + [67657]="r", + [67658]="r", + [67659]="r", + [67660]="r", + [67661]="r", + [67662]="r", + [67663]="r", + [67664]="r", + [67665]="r", + [67666]="r", + [67667]="r", + [67668]="r", + [67669]="r", + [67671]="r", + [67672]="r", + [67673]="r", + [67674]="r", + [67675]="r", + [67676]="r", + [67677]="r", + [67678]="r", + [67679]="r", + [67680]="r", + [67681]="r", + [67682]="r", + [67683]="r", + [67684]="r", + [67685]="r", + [67686]="r", + [67687]="r", + [67688]="r", + [67689]="r", + [67690]="r", + [67691]="r", + [67692]="r", + [67693]="r", + [67694]="r", + [67695]="r", + [67696]="r", + [67697]="r", + [67698]="r", + [67699]="r", + [67700]="r", + [67701]="r", + [67702]="r", + [67703]="r", + [67704]="r", + [67705]="r", + [67706]="r", + [67707]="r", + [67708]="r", + [67709]="r", + [67710]="r", + [67711]="r", + [67712]="r", + [67713]="r", + [67714]="r", + [67715]="r", + [67716]="r", + [67717]="r", + [67718]="r", + [67719]="r", + [67720]="r", + [67721]="r", + [67722]="r", + [67723]="r", + [67724]="r", + [67725]="r", + [67726]="r", + [67727]="r", + [67728]="r", + [67729]="r", + [67730]="r", + [67731]="r", + [67732]="r", + [67733]="r", + [67734]="r", + [67735]="r", + [67736]="r", + [67737]="r", + [67738]="r", + [67739]="r", + [67740]="r", + [67741]="r", + [67742]="r", + [67751]="r", + [67752]="r", + [67753]="r", + [67754]="r", + [67755]="r", + [67756]="r", + [67757]="r", + [67758]="r", + [67759]="r", + [67808]="r", + [67809]="r", + [67810]="r", + [67811]="r", + [67812]="r", + [67813]="r", + [67814]="r", + [67815]="r", + [67816]="r", + [67817]="r", + [67818]="r", + [67819]="r", + [67820]="r", + [67821]="r", + [67822]="r", + [67823]="r", + [67824]="r", + [67825]="r", + [67826]="r", + [67828]="r", + [67829]="r", + [67835]="r", + [67836]="r", + [67837]="r", + [67838]="r", + [67839]="r", + [67840]="r", + [67841]="r", + [67842]="r", + [67843]="r", + [67844]="r", + [67845]="r", + [67846]="r", + [67847]="r", + [67848]="r", + [67849]="r", + [67850]="r", + [67851]="r", + [67852]="r", + [67853]="r", + [67854]="r", + [67855]="r", + [67856]="r", + [67857]="r", + [67858]="r", + [67859]="r", + [67860]="r", + [67861]="r", + [67862]="r", + [67863]="r", + [67864]="r", + [67865]="r", + [67866]="r", + [67867]="r", + [67871]="on", + [67872]="r", + [67873]="r", + [67874]="r", + [67875]="r", + [67876]="r", + [67877]="r", + [67878]="r", + [67879]="r", + [67880]="r", + [67881]="r", + [67882]="r", + [67883]="r", + [67884]="r", + [67885]="r", + [67886]="r", + [67887]="r", + [67888]="r", + [67889]="r", + [67890]="r", + [67891]="r", + [67892]="r", + [67893]="r", + [67894]="r", + [67895]="r", + [67896]="r", + [67897]="r", + [67903]="r", + [67968]="r", + [67969]="r", + [67970]="r", + [67971]="r", + [67972]="r", + [67973]="r", + [67974]="r", + [67975]="r", + [67976]="r", + [67977]="r", + [67978]="r", + [67979]="r", + [67980]="r", + [67981]="r", + [67982]="r", + [67983]="r", + [67984]="r", + [67985]="r", + [67986]="r", + [67987]="r", + [67988]="r", + [67989]="r", + [67990]="r", + [67991]="r", + [67992]="r", + [67993]="r", + [67994]="r", + [67995]="r", + [67996]="r", + [67997]="r", + [67998]="r", + [67999]="r", + [68000]="r", + [68001]="r", + [68002]="r", + [68003]="r", + [68004]="r", + [68005]="r", + [68006]="r", + [68007]="r", + [68008]="r", + [68009]="r", + [68010]="r", + [68011]="r", + [68012]="r", + [68013]="r", + [68014]="r", + [68015]="r", + [68016]="r", + [68017]="r", + [68018]="r", + [68019]="r", + [68020]="r", + [68021]="r", + [68022]="r", + [68023]="r", + [68028]="r", + [68029]="r", + [68030]="r", + [68031]="r", + [68032]="r", + [68033]="r", + [68034]="r", + [68035]="r", + [68036]="r", + [68037]="r", + [68038]="r", + [68039]="r", + [68040]="r", + [68041]="r", + [68042]="r", + [68043]="r", + [68044]="r", + [68045]="r", + [68046]="r", + [68047]="r", + [68050]="r", + [68051]="r", + [68052]="r", + [68053]="r", + [68054]="r", + [68055]="r", + [68056]="r", + [68057]="r", + [68058]="r", + [68059]="r", + [68060]="r", + [68061]="r", + [68062]="r", + [68063]="r", + [68064]="r", + [68065]="r", + [68066]="r", + [68067]="r", + [68068]="r", + [68069]="r", + [68070]="r", + [68071]="r", + [68072]="r", + [68073]="r", + [68074]="r", + [68075]="r", + [68076]="r", + [68077]="r", + [68078]="r", + [68079]="r", + [68080]="r", + [68081]="r", + [68082]="r", + [68083]="r", + [68084]="r", + [68085]="r", + [68086]="r", + [68087]="r", + [68088]="r", + [68089]="r", + [68090]="r", + [68091]="r", + [68092]="r", + [68093]="r", + [68094]="r", + [68095]="r", + [68096]="r", + [68097]="nsm", + [68098]="nsm", + [68099]="nsm", + [68101]="nsm", + [68102]="nsm", + [68108]="nsm", + [68109]="nsm", + [68110]="nsm", + [68111]="nsm", + [68112]="r", + [68113]="r", + [68114]="r", + [68115]="r", + [68117]="r", + [68118]="r", + [68119]="r", + [68121]="r", + [68122]="r", + [68123]="r", + [68124]="r", + [68125]="r", + [68126]="r", + [68127]="r", + [68128]="r", + [68129]="r", + [68130]="r", + [68131]="r", + [68132]="r", + [68133]="r", + [68134]="r", + [68135]="r", + [68136]="r", + [68137]="r", + [68138]="r", + [68139]="r", + [68140]="r", + [68141]="r", + [68142]="r", + [68143]="r", + [68144]="r", + [68145]="r", + [68146]="r", + [68147]="r", + [68152]="nsm", + [68153]="nsm", + [68154]="nsm", + [68159]="nsm", + [68160]="r", + [68161]="r", + [68162]="r", + [68163]="r", + [68164]="r", + [68165]="r", + [68166]="r", + [68167]="r", + [68176]="r", + [68177]="r", + [68178]="r", + [68179]="r", + [68180]="r", + [68181]="r", + [68182]="r", + [68183]="r", + [68184]="r", + [68192]="r", + [68193]="r", + [68194]="r", + [68195]="r", + [68196]="r", + [68197]="r", + [68198]="r", + [68199]="r", + [68200]="r", + [68201]="r", + [68202]="r", + [68203]="r", + [68204]="r", + [68205]="r", + [68206]="r", + [68207]="r", + [68208]="r", + [68209]="r", + [68210]="r", + [68211]="r", + [68212]="r", + [68213]="r", + [68214]="r", + [68215]="r", + [68216]="r", + [68217]="r", + [68218]="r", + [68219]="r", + [68220]="r", + [68221]="r", + [68222]="r", + [68223]="r", + [68224]="r", + [68225]="r", + [68226]="r", + [68227]="r", + [68228]="r", + [68229]="r", + [68230]="r", + [68231]="r", + [68232]="r", + [68233]="r", + [68234]="r", + [68235]="r", + [68236]="r", + [68237]="r", + [68238]="r", + [68239]="r", + [68240]="r", + [68241]="r", + [68242]="r", + [68243]="r", + [68244]="r", + [68245]="r", + [68246]="r", + [68247]="r", + [68248]="r", + [68249]="r", + [68250]="r", + [68251]="r", + [68252]="r", + [68253]="r", + [68254]="r", + [68255]="r", + [68288]="r", + [68289]="r", + [68290]="r", + [68291]="r", + [68292]="r", + [68293]="r", + [68294]="r", + [68295]="r", + [68296]="r", + [68297]="r", + [68298]="r", + [68299]="r", + [68300]="r", + [68301]="r", + [68302]="r", + [68303]="r", + [68304]="r", + [68305]="r", + [68306]="r", + [68307]="r", + [68308]="r", + [68309]="r", + [68310]="r", + [68311]="r", + [68312]="r", + [68313]="r", + [68314]="r", + [68315]="r", + [68316]="r", + [68317]="r", + [68318]="r", + [68319]="r", + [68320]="r", + [68321]="r", + [68322]="r", + [68323]="r", + [68324]="r", + [68325]="nsm", + [68326]="nsm", + [68331]="r", + [68332]="r", + [68333]="r", + [68334]="r", + [68335]="r", + [68336]="r", + [68337]="r", + [68338]="r", + [68339]="r", + [68340]="r", + [68341]="r", + [68342]="r", + [68352]="r", + [68353]="r", + [68354]="r", + [68355]="r", + [68356]="r", + [68357]="r", + [68358]="r", + [68359]="r", + [68360]="r", + [68361]="r", + [68362]="r", + [68363]="r", + [68364]="r", + [68365]="r", + [68366]="r", + [68367]="r", + [68368]="r", + [68369]="r", + [68370]="r", + [68371]="r", + [68372]="r", + [68373]="r", + [68374]="r", + [68375]="r", + [68376]="r", + [68377]="r", + [68378]="r", + [68379]="r", + [68380]="r", + [68381]="r", + [68382]="r", + [68383]="r", + [68384]="r", + [68385]="r", + [68386]="r", + [68387]="r", + [68388]="r", + [68389]="r", + [68390]="r", + [68391]="r", + [68392]="r", + [68393]="r", + [68394]="r", + [68395]="r", + [68396]="r", + [68397]="r", + [68398]="r", + [68399]="r", + [68400]="r", + [68401]="r", + [68402]="r", + [68403]="r", + [68404]="r", + [68405]="r", + [68409]="on", + [68410]="on", + [68411]="on", + [68412]="on", + [68413]="on", + [68414]="on", + [68415]="on", + [68416]="r", + [68417]="r", + [68418]="r", + [68419]="r", + [68420]="r", + [68421]="r", + [68422]="r", + [68423]="r", + [68424]="r", + [68425]="r", + [68426]="r", + [68427]="r", + [68428]="r", + [68429]="r", + [68430]="r", + [68431]="r", + [68432]="r", + [68433]="r", + [68434]="r", + [68435]="r", + [68436]="r", + [68437]="r", + [68440]="r", + [68441]="r", + [68442]="r", + [68443]="r", + [68444]="r", + [68445]="r", + [68446]="r", + [68447]="r", + [68448]="r", + [68449]="r", + [68450]="r", + [68451]="r", + [68452]="r", + [68453]="r", + [68454]="r", + [68455]="r", + [68456]="r", + [68457]="r", + [68458]="r", + [68459]="r", + [68460]="r", + [68461]="r", + [68462]="r", + [68463]="r", + [68464]="r", + [68465]="r", + [68466]="r", + [68472]="r", + [68473]="r", + [68474]="r", + [68475]="r", + [68476]="r", + [68477]="r", + [68478]="r", + [68479]="r", + [68480]="r", + [68481]="r", + [68482]="r", + [68483]="r", + [68484]="r", + [68485]="r", + [68486]="r", + [68487]="r", + [68488]="r", + [68489]="r", + [68490]="r", + [68491]="r", + [68492]="r", + [68493]="r", + [68494]="r", + [68495]="r", + [68496]="r", + [68497]="r", + [68505]="r", + [68506]="r", + [68507]="r", + [68508]="r", + [68521]="r", + [68522]="r", + [68523]="r", + [68524]="r", + [68525]="r", + [68526]="r", + [68527]="r", + [68608]="r", + [68609]="r", + [68610]="r", + [68611]="r", + [68612]="r", + [68613]="r", + [68614]="r", + [68615]="r", + [68616]="r", + [68617]="r", + [68618]="r", + [68619]="r", + [68620]="r", + [68621]="r", + [68622]="r", + [68623]="r", + [68624]="r", + [68625]="r", + [68626]="r", + [68627]="r", + [68628]="r", + [68629]="r", + [68630]="r", + [68631]="r", + [68632]="r", + [68633]="r", + [68634]="r", + [68635]="r", + [68636]="r", + [68637]="r", + [68638]="r", + [68639]="r", + [68640]="r", + [68641]="r", + [68642]="r", + [68643]="r", + [68644]="r", + [68645]="r", + [68646]="r", + [68647]="r", + [68648]="r", + [68649]="r", + [68650]="r", + [68651]="r", + [68652]="r", + [68653]="r", + [68654]="r", + [68655]="r", + [68656]="r", + [68657]="r", + [68658]="r", + [68659]="r", + [68660]="r", + [68661]="r", + [68662]="r", + [68663]="r", + [68664]="r", + [68665]="r", + [68666]="r", + [68667]="r", + [68668]="r", + [68669]="r", + [68670]="r", + [68671]="r", + [68672]="r", + [68673]="r", + [68674]="r", + [68675]="r", + [68676]="r", + [68677]="r", + [68678]="r", + [68679]="r", + [68680]="r", + [68736]="r", + [68737]="r", + [68738]="r", + [68739]="r", + [68740]="r", + [68741]="r", + [68742]="r", + [68743]="r", + [68744]="r", + [68745]="r", + [68746]="r", + [68747]="r", + [68748]="r", + [68749]="r", + [68750]="r", + [68751]="r", + [68752]="r", + [68753]="r", + [68754]="r", + [68755]="r", + [68756]="r", + [68757]="r", + [68758]="r", + [68759]="r", + [68760]="r", + [68761]="r", + [68762]="r", + [68763]="r", + [68764]="r", + [68765]="r", + [68766]="r", + [68767]="r", + [68768]="r", + [68769]="r", + [68770]="r", + [68771]="r", + [68772]="r", + [68773]="r", + [68774]="r", + [68775]="r", + [68776]="r", + [68777]="r", + [68778]="r", + [68779]="r", + [68780]="r", + [68781]="r", + [68782]="r", + [68783]="r", + [68784]="r", + [68785]="r", + [68786]="r", + [68800]="r", + [68801]="r", + [68802]="r", + [68803]="r", + [68804]="r", + [68805]="r", + [68806]="r", + [68807]="r", + [68808]="r", + [68809]="r", + [68810]="r", + [68811]="r", + [68812]="r", + [68813]="r", + [68814]="r", + [68815]="r", + [68816]="r", + [68817]="r", + [68818]="r", + [68819]="r", + [68820]="r", + [68821]="r", + [68822]="r", + [68823]="r", + [68824]="r", + [68825]="r", + [68826]="r", + [68827]="r", + [68828]="r", + [68829]="r", + [68830]="r", + [68831]="r", + [68832]="r", + [68833]="r", + [68834]="r", + [68835]="r", + [68836]="r", + [68837]="r", + [68838]="r", + [68839]="r", + [68840]="r", + [68841]="r", + [68842]="r", + [68843]="r", + [68844]="r", + [68845]="r", + [68846]="r", + [68847]="r", + [68848]="r", + [68849]="r", + [68850]="r", + [68858]="r", + [68859]="r", + [68860]="r", + [68861]="r", + [68862]="r", + [68863]="r", + [69216]="an", + [69217]="an", + [69218]="an", + [69219]="an", + [69220]="an", + [69221]="an", + [69222]="an", + [69223]="an", + [69224]="an", + [69225]="an", + [69226]="an", + [69227]="an", + [69228]="an", + [69229]="an", + [69230]="an", + [69231]="an", + [69232]="an", + [69233]="an", + [69234]="an", + [69235]="an", + [69236]="an", + [69237]="an", + [69238]="an", + [69239]="an", + [69240]="an", + [69241]="an", + [69242]="an", + [69243]="an", + [69244]="an", + [69245]="an", + [69246]="an", + [69633]="nsm", + [69688]="nsm", + [69689]="nsm", + [69690]="nsm", + [69691]="nsm", + [69692]="nsm", + [69693]="nsm", + [69694]="nsm", + [69695]="nsm", + [69696]="nsm", + [69697]="nsm", + [69698]="nsm", + [69699]="nsm", + [69700]="nsm", + [69701]="nsm", + [69702]="nsm", + [69714]="on", + [69715]="on", + [69716]="on", + [69717]="on", + [69718]="on", + [69719]="on", + [69720]="on", + [69721]="on", + [69722]="on", + [69723]="on", + [69724]="on", + [69725]="on", + [69726]="on", + [69727]="on", + [69728]="on", + [69729]="on", + [69730]="on", + [69731]="on", + [69732]="on", + [69733]="on", + [69759]="nsm", + [69760]="nsm", + [69761]="nsm", + [69811]="nsm", + [69812]="nsm", + [69813]="nsm", + [69814]="nsm", + [69817]="nsm", + [69818]="nsm", + [69888]="nsm", + [69889]="nsm", + [69890]="nsm", + [69927]="nsm", + [69928]="nsm", + [69929]="nsm", + [69930]="nsm", + [69931]="nsm", + [69933]="nsm", + [69934]="nsm", + [69935]="nsm", + [69936]="nsm", + [69937]="nsm", + [69938]="nsm", + [69939]="nsm", + [69940]="nsm", + [70003]="nsm", + [70016]="nsm", + [70017]="nsm", + [70070]="nsm", + [70071]="nsm", + [70072]="nsm", + [70073]="nsm", + [70074]="nsm", + [70075]="nsm", + [70076]="nsm", + [70077]="nsm", + [70078]="nsm", + [70090]="nsm", + [70091]="nsm", + [70092]="nsm", + [70191]="nsm", + [70192]="nsm", + [70193]="nsm", + [70196]="nsm", + [70198]="nsm", + [70199]="nsm", + [70206]="nsm", + [70367]="nsm", + [70371]="nsm", + [70372]="nsm", + [70373]="nsm", + [70374]="nsm", + [70375]="nsm", + [70376]="nsm", + [70377]="nsm", + [70378]="nsm", + [70400]="nsm", + [70401]="nsm", + [70460]="nsm", + [70464]="nsm", + [70502]="nsm", + [70503]="nsm", + [70504]="nsm", + [70505]="nsm", + [70506]="nsm", + [70507]="nsm", + [70508]="nsm", + [70512]="nsm", + [70513]="nsm", + [70514]="nsm", + [70515]="nsm", + [70516]="nsm", + [70712]="nsm", + [70713]="nsm", + [70714]="nsm", + [70715]="nsm", + [70716]="nsm", + [70717]="nsm", + [70718]="nsm", + [70719]="nsm", + [70722]="nsm", + [70723]="nsm", + [70724]="nsm", + [70726]="nsm", + [70835]="nsm", + [70836]="nsm", + [70837]="nsm", + [70838]="nsm", + [70839]="nsm", + [70840]="nsm", + [70842]="nsm", + [70847]="nsm", + [70848]="nsm", + [70850]="nsm", + [70851]="nsm", + [71090]="nsm", + [71091]="nsm", + [71092]="nsm", + [71093]="nsm", + [71100]="nsm", + [71101]="nsm", + [71103]="nsm", + [71104]="nsm", + [71132]="nsm", + [71133]="nsm", + [71219]="nsm", + [71220]="nsm", + [71221]="nsm", + [71222]="nsm", + [71223]="nsm", + [71224]="nsm", + [71225]="nsm", + [71226]="nsm", + [71229]="nsm", + [71231]="nsm", + [71232]="nsm", + [71264]="on", + [71265]="on", + [71266]="on", + [71267]="on", + [71268]="on", + [71269]="on", + [71270]="on", + [71271]="on", + [71272]="on", + [71273]="on", + [71274]="on", + [71275]="on", + [71276]="on", + [71339]="nsm", + [71341]="nsm", + [71344]="nsm", + [71345]="nsm", + [71346]="nsm", + [71347]="nsm", + [71348]="nsm", + [71349]="nsm", + [71351]="nsm", + [71453]="nsm", + [71454]="nsm", + [71455]="nsm", + [71458]="nsm", + [71459]="nsm", + [71460]="nsm", + [71461]="nsm", + [71463]="nsm", + [71464]="nsm", + [71465]="nsm", + [71466]="nsm", + [71467]="nsm", + [72193]="nsm", + [72194]="nsm", + [72195]="nsm", + [72196]="nsm", + [72197]="nsm", + [72198]="nsm", + [72201]="nsm", + [72202]="nsm", + [72243]="nsm", + [72244]="nsm", + [72245]="nsm", + [72246]="nsm", + [72247]="nsm", + [72248]="nsm", + [72251]="nsm", + [72252]="nsm", + [72253]="nsm", + [72254]="nsm", + [72263]="nsm", + [72273]="nsm", + [72274]="nsm", + [72275]="nsm", + [72276]="nsm", + [72277]="nsm", + [72278]="nsm", + [72281]="nsm", + [72282]="nsm", + [72283]="nsm", + [72330]="nsm", + [72331]="nsm", + [72332]="nsm", + [72333]="nsm", + [72334]="nsm", + [72335]="nsm", + [72336]="nsm", + [72337]="nsm", + [72338]="nsm", + [72339]="nsm", + [72340]="nsm", + [72341]="nsm", + [72342]="nsm", + [72344]="nsm", + [72345]="nsm", + [72752]="nsm", + [72753]="nsm", + [72754]="nsm", + [72755]="nsm", + [72756]="nsm", + [72757]="nsm", + [72758]="nsm", + [72760]="nsm", + [72761]="nsm", + [72762]="nsm", + [72763]="nsm", + [72764]="nsm", + [72765]="nsm", + [72850]="nsm", + [72851]="nsm", + [72852]="nsm", + [72853]="nsm", + [72854]="nsm", + [72855]="nsm", + [72856]="nsm", + [72857]="nsm", + [72858]="nsm", + [72859]="nsm", + [72860]="nsm", + [72861]="nsm", + [72862]="nsm", + [72863]="nsm", + [72864]="nsm", + [72865]="nsm", + [72866]="nsm", + [72867]="nsm", + [72868]="nsm", + [72869]="nsm", + [72870]="nsm", + [72871]="nsm", + [72874]="nsm", + [72875]="nsm", + [72876]="nsm", + [72877]="nsm", + [72878]="nsm", + [72879]="nsm", + [72880]="nsm", + [72882]="nsm", + [72883]="nsm", + [72885]="nsm", + [72886]="nsm", + [73009]="nsm", + [73010]="nsm", + [73011]="nsm", + [73012]="nsm", + [73013]="nsm", + [73014]="nsm", + [73018]="nsm", + [73020]="nsm", + [73021]="nsm", + [73023]="nsm", + [73024]="nsm", + [73025]="nsm", + [73026]="nsm", + [73027]="nsm", + [73028]="nsm", + [73029]="nsm", + [73031]="nsm", + [92912]="nsm", + [92913]="nsm", + [92914]="nsm", + [92915]="nsm", + [92916]="nsm", + [92976]="nsm", + [92977]="nsm", + [92978]="nsm", + [92979]="nsm", + [92980]="nsm", + [92981]="nsm", + [92982]="nsm", + [94095]="nsm", + [94096]="nsm", + [94097]="nsm", + [94098]="nsm", + [113821]="nsm", + [113822]="nsm", + [113824]="bn", + [113825]="bn", + [113826]="bn", + [113827]="bn", + [119143]="nsm", + [119144]="nsm", + [119145]="nsm", + [119155]="bn", + [119156]="bn", + [119157]="bn", + [119158]="bn", + [119159]="bn", + [119160]="bn", + [119161]="bn", + [119162]="bn", + [119163]="nsm", + [119164]="nsm", + [119165]="nsm", + [119166]="nsm", + [119167]="nsm", + [119168]="nsm", + [119169]="nsm", + [119170]="nsm", + [119173]="nsm", + [119174]="nsm", + [119175]="nsm", + [119176]="nsm", + [119177]="nsm", + [119178]="nsm", + [119179]="nsm", + [119210]="nsm", + [119211]="nsm", + [119212]="nsm", + [119213]="nsm", + [119296]="on", + [119297]="on", + [119298]="on", + [119299]="on", + [119300]="on", + [119301]="on", + [119302]="on", + [119303]="on", + [119304]="on", + [119305]="on", + [119306]="on", + [119307]="on", + [119308]="on", + [119309]="on", + [119310]="on", + [119311]="on", + [119312]="on", + [119313]="on", + [119314]="on", + [119315]="on", + [119316]="on", + [119317]="on", + [119318]="on", + [119319]="on", + [119320]="on", + [119321]="on", + [119322]="on", + [119323]="on", + [119324]="on", + [119325]="on", + [119326]="on", + [119327]="on", + [119328]="on", + [119329]="on", + [119330]="on", + [119331]="on", + [119332]="on", + [119333]="on", + [119334]="on", + [119335]="on", + [119336]="on", + [119337]="on", + [119338]="on", + [119339]="on", + [119340]="on", + [119341]="on", + [119342]="on", + [119343]="on", + [119344]="on", + [119345]="on", + [119346]="on", + [119347]="on", + [119348]="on", + [119349]="on", + [119350]="on", + [119351]="on", + [119352]="on", + [119353]="on", + [119354]="on", + [119355]="on", + [119356]="on", + [119357]="on", + [119358]="on", + [119359]="on", + [119360]="on", + [119361]="on", + [119362]="nsm", + [119363]="nsm", + [119364]="nsm", + [119365]="on", + [119552]="on", + [119553]="on", + [119554]="on", + [119555]="on", + [119556]="on", + [119557]="on", + [119558]="on", + [119559]="on", + [119560]="on", + [119561]="on", + [119562]="on", + [119563]="on", + [119564]="on", + [119565]="on", + [119566]="on", + [119567]="on", + [119568]="on", + [119569]="on", + [119570]="on", + [119571]="on", + [119572]="on", + [119573]="on", + [119574]="on", + [119575]="on", + [119576]="on", + [119577]="on", + [119578]="on", + [119579]="on", + [119580]="on", + [119581]="on", + [119582]="on", + [119583]="on", + [119584]="on", + [119585]="on", + [119586]="on", + [119587]="on", + [119588]="on", + [119589]="on", + [119590]="on", + [119591]="on", + [119592]="on", + [119593]="on", + [119594]="on", + [119595]="on", + [119596]="on", + [119597]="on", + [119598]="on", + [119599]="on", + [119600]="on", + [119601]="on", + [119602]="on", + [119603]="on", + [119604]="on", + [119605]="on", + [119606]="on", + [119607]="on", + [119608]="on", + [119609]="on", + [119610]="on", + [119611]="on", + [119612]="on", + [119613]="on", + [119614]="on", + [119615]="on", + [119616]="on", + [119617]="on", + [119618]="on", + [119619]="on", + [119620]="on", + [119621]="on", + [119622]="on", + [119623]="on", + [119624]="on", + [119625]="on", + [119626]="on", + [119627]="on", + [119628]="on", + [119629]="on", + [119630]="on", + [119631]="on", + [119632]="on", + [119633]="on", + [119634]="on", + [119635]="on", + [119636]="on", + [119637]="on", + [119638]="on", + [120539]="on", + [120597]="on", + [120655]="on", + [120713]="on", + [120771]="on", + [120782]="en", + [120783]="en", + [120784]="en", + [120785]="en", + [120786]="en", + [120787]="en", + [120788]="en", + [120789]="en", + [120790]="en", + [120791]="en", + [120792]="en", + [120793]="en", + [120794]="en", + [120795]="en", + [120796]="en", + [120797]="en", + [120798]="en", + [120799]="en", + [120800]="en", + [120801]="en", + [120802]="en", + [120803]="en", + [120804]="en", + [120805]="en", + [120806]="en", + [120807]="en", + [120808]="en", + [120809]="en", + [120810]="en", + [120811]="en", + [120812]="en", + [120813]="en", + [120814]="en", + [120815]="en", + [120816]="en", + [120817]="en", + [120818]="en", + [120819]="en", + [120820]="en", + [120821]="en", + [120822]="en", + [120823]="en", + [120824]="en", + [120825]="en", + [120826]="en", + [120827]="en", + [120828]="en", + [120829]="en", + [120830]="en", + [120831]="en", + [121344]="nsm", + [121345]="nsm", + [121346]="nsm", + [121347]="nsm", + [121348]="nsm", + [121349]="nsm", + [121350]="nsm", + [121351]="nsm", + [121352]="nsm", + [121353]="nsm", + [121354]="nsm", + [121355]="nsm", + [121356]="nsm", + [121357]="nsm", + [121358]="nsm", + [121359]="nsm", + [121360]="nsm", + [121361]="nsm", + [121362]="nsm", + [121363]="nsm", + [121364]="nsm", + [121365]="nsm", + [121366]="nsm", + [121367]="nsm", + [121368]="nsm", + [121369]="nsm", + [121370]="nsm", + [121371]="nsm", + [121372]="nsm", + [121373]="nsm", + [121374]="nsm", + [121375]="nsm", + [121376]="nsm", + [121377]="nsm", + [121378]="nsm", + [121379]="nsm", + [121380]="nsm", + [121381]="nsm", + [121382]="nsm", + [121383]="nsm", + [121384]="nsm", + [121385]="nsm", + [121386]="nsm", + [121387]="nsm", + [121388]="nsm", + [121389]="nsm", + [121390]="nsm", + [121391]="nsm", + [121392]="nsm", + [121393]="nsm", + [121394]="nsm", + [121395]="nsm", + [121396]="nsm", + [121397]="nsm", + [121398]="nsm", + [121403]="nsm", + [121404]="nsm", + [121405]="nsm", + [121406]="nsm", + [121407]="nsm", + [121408]="nsm", + [121409]="nsm", + [121410]="nsm", + [121411]="nsm", + [121412]="nsm", + [121413]="nsm", + [121414]="nsm", + [121415]="nsm", + [121416]="nsm", + [121417]="nsm", + [121418]="nsm", + [121419]="nsm", + [121420]="nsm", + [121421]="nsm", + [121422]="nsm", + [121423]="nsm", + [121424]="nsm", + [121425]="nsm", + [121426]="nsm", + [121427]="nsm", + [121428]="nsm", + [121429]="nsm", + [121430]="nsm", + [121431]="nsm", + [121432]="nsm", + [121433]="nsm", + [121434]="nsm", + [121435]="nsm", + [121436]="nsm", + [121437]="nsm", + [121438]="nsm", + [121439]="nsm", + [121440]="nsm", + [121441]="nsm", + [121442]="nsm", + [121443]="nsm", + [121444]="nsm", + [121445]="nsm", + [121446]="nsm", + [121447]="nsm", + [121448]="nsm", + [121449]="nsm", + [121450]="nsm", + [121451]="nsm", + [121452]="nsm", + [121461]="nsm", + [121476]="nsm", + [121499]="nsm", + [121500]="nsm", + [121501]="nsm", + [121502]="nsm", + [121503]="nsm", + [121505]="nsm", + [121506]="nsm", + [121507]="nsm", + [121508]="nsm", + [121509]="nsm", + [121510]="nsm", + [121511]="nsm", + [121512]="nsm", + [121513]="nsm", + [121514]="nsm", + [121515]="nsm", + [121516]="nsm", + [121517]="nsm", + [121518]="nsm", + [121519]="nsm", + [122880]="nsm", + [122881]="nsm", + [122882]="nsm", + [122883]="nsm", + [122884]="nsm", + [122885]="nsm", + [122886]="nsm", + [122888]="nsm", + [122889]="nsm", + [122890]="nsm", + [122891]="nsm", + [122892]="nsm", + [122893]="nsm", + [122894]="nsm", + [122895]="nsm", + [122896]="nsm", + [122897]="nsm", + [122898]="nsm", + [122899]="nsm", + [122900]="nsm", + [122901]="nsm", + [122902]="nsm", + [122903]="nsm", + [122904]="nsm", + [122907]="nsm", + [122908]="nsm", + [122909]="nsm", + [122910]="nsm", + [122911]="nsm", + [122912]="nsm", + [122913]="nsm", + [122915]="nsm", + [122916]="nsm", + [122918]="nsm", + [122919]="nsm", + [122920]="nsm", + [122921]="nsm", + [122922]="nsm", + [124928]="r", + [124929]="r", + [124930]="r", + [124931]="r", + [124932]="r", + [124933]="r", + [124934]="r", + [124935]="r", + [124936]="r", + [124937]="r", + [124938]="r", + [124939]="r", + [124940]="r", + [124941]="r", + [124942]="r", + [124943]="r", + [124944]="r", + [124945]="r", + [124946]="r", + [124947]="r", + [124948]="r", + [124949]="r", + [124950]="r", + [124951]="r", + [124952]="r", + [124953]="r", + [124954]="r", + [124955]="r", + [124956]="r", + [124957]="r", + [124958]="r", + [124959]="r", + [124960]="r", + [124961]="r", + [124962]="r", + [124963]="r", + [124964]="r", + [124965]="r", + [124966]="r", + [124967]="r", + [124968]="r", + [124969]="r", + [124970]="r", + [124971]="r", + [124972]="r", + [124973]="r", + [124974]="r", + [124975]="r", + [124976]="r", + [124977]="r", + [124978]="r", + [124979]="r", + [124980]="r", + [124981]="r", + [124982]="r", + [124983]="r", + [124984]="r", + [124985]="r", + [124986]="r", + [124987]="r", + [124988]="r", + [124989]="r", + [124990]="r", + [124991]="r", + [124992]="r", + [124993]="r", + [124994]="r", + [124995]="r", + [124996]="r", + [124997]="r", + [124998]="r", + [124999]="r", + [125000]="r", + [125001]="r", + [125002]="r", + [125003]="r", + [125004]="r", + [125005]="r", + [125006]="r", + [125007]="r", + [125008]="r", + [125009]="r", + [125010]="r", + [125011]="r", + [125012]="r", + [125013]="r", + [125014]="r", + [125015]="r", + [125016]="r", + [125017]="r", + [125018]="r", + [125019]="r", + [125020]="r", + [125021]="r", + [125022]="r", + [125023]="r", + [125024]="r", + [125025]="r", + [125026]="r", + [125027]="r", + [125028]="r", + [125029]="r", + [125030]="r", + [125031]="r", + [125032]="r", + [125033]="r", + [125034]="r", + [125035]="r", + [125036]="r", + [125037]="r", + [125038]="r", + [125039]="r", + [125040]="r", + [125041]="r", + [125042]="r", + [125043]="r", + [125044]="r", + [125045]="r", + [125046]="r", + [125047]="r", + [125048]="r", + [125049]="r", + [125050]="r", + [125051]="r", + [125052]="r", + [125053]="r", + [125054]="r", + [125055]="r", + [125056]="r", + [125057]="r", + [125058]="r", + [125059]="r", + [125060]="r", + [125061]="r", + [125062]="r", + [125063]="r", + [125064]="r", + [125065]="r", + [125066]="r", + [125067]="r", + [125068]="r", + [125069]="r", + [125070]="r", + [125071]="r", + [125072]="r", + [125073]="r", + [125074]="r", + [125075]="r", + [125076]="r", + [125077]="r", + [125078]="r", + [125079]="r", + [125080]="r", + [125081]="r", + [125082]="r", + [125083]="r", + [125084]="r", + [125085]="r", + [125086]="r", + [125087]="r", + [125088]="r", + [125089]="r", + [125090]="r", + [125091]="r", + [125092]="r", + [125093]="r", + [125094]="r", + [125095]="r", + [125096]="r", + [125097]="r", + [125098]="r", + [125099]="r", + [125100]="r", + [125101]="r", + [125102]="r", + [125103]="r", + [125104]="r", + [125105]="r", + [125106]="r", + [125107]="r", + [125108]="r", + [125109]="r", + [125110]="r", + [125111]="r", + [125112]="r", + [125113]="r", + [125114]="r", + [125115]="r", + [125116]="r", + [125117]="r", + [125118]="r", + [125119]="r", + [125120]="r", + [125121]="r", + [125122]="r", + [125123]="r", + [125124]="r", + [125127]="r", + [125128]="r", + [125129]="r", + [125130]="r", + [125131]="r", + [125132]="r", + [125133]="r", + [125134]="r", + [125135]="r", + [125136]="nsm", + [125137]="nsm", + [125138]="nsm", + [125139]="nsm", + [125140]="nsm", + [125141]="nsm", + [125142]="nsm", + [125184]="r", + [125185]="r", + [125186]="r", + [125187]="r", + [125188]="r", + [125189]="r", + [125190]="r", + [125191]="r", + [125192]="r", + [125193]="r", + [125194]="r", + [125195]="r", + [125196]="r", + [125197]="r", + [125198]="r", + [125199]="r", + [125200]="r", + [125201]="r", + [125202]="r", + [125203]="r", + [125204]="r", + [125205]="r", + [125206]="r", + [125207]="r", + [125208]="r", + [125209]="r", + [125210]="r", + [125211]="r", + [125212]="r", + [125213]="r", + [125214]="r", + [125215]="r", + [125216]="r", + [125217]="r", + [125218]="r", + [125219]="r", + [125220]="r", + [125221]="r", + [125222]="r", + [125223]="r", + [125224]="r", + [125225]="r", + [125226]="r", + [125227]="r", + [125228]="r", + [125229]="r", + [125230]="r", + [125231]="r", + [125232]="r", + [125233]="r", + [125234]="r", + [125235]="r", + [125236]="r", + [125237]="r", + [125238]="r", + [125239]="r", + [125240]="r", + [125241]="r", + [125242]="r", + [125243]="r", + [125244]="r", + [125245]="r", + [125246]="r", + [125247]="r", + [125248]="r", + [125249]="r", + [125250]="r", + [125251]="r", + [125252]="nsm", + [125253]="nsm", + [125254]="nsm", + [125255]="nsm", + [125256]="nsm", + [125257]="nsm", + [125258]="nsm", + [125264]="r", + [125265]="r", + [125266]="r", + [125267]="r", + [125268]="r", + [125269]="r", + [125270]="r", + [125271]="r", + [125272]="r", + [125273]="r", + [125278]="r", + [125279]="r", + [126464]="al", + [126465]="al", + [126466]="al", + [126467]="al", + [126469]="al", + [126470]="al", + [126471]="al", + [126472]="al", + [126473]="al", + [126474]="al", + [126475]="al", + [126476]="al", + [126477]="al", + [126478]="al", + [126479]="al", + [126480]="al", + [126481]="al", + [126482]="al", + [126483]="al", + [126484]="al", + [126485]="al", + [126486]="al", + [126487]="al", + [126488]="al", + [126489]="al", + [126490]="al", + [126491]="al", + [126492]="al", + [126493]="al", + [126494]="al", + [126495]="al", + [126497]="al", + [126498]="al", + [126500]="al", + [126503]="al", + [126505]="al", + [126506]="al", + [126507]="al", + [126508]="al", + [126509]="al", + [126510]="al", + [126511]="al", + [126512]="al", + [126513]="al", + [126514]="al", + [126516]="al", + [126517]="al", + [126518]="al", + [126519]="al", + [126521]="al", + [126523]="al", + [126530]="al", + [126535]="al", + [126537]="al", + [126539]="al", + [126541]="al", + [126542]="al", + [126543]="al", + [126545]="al", + [126546]="al", + [126548]="al", + [126551]="al", + [126553]="al", + [126555]="al", + [126557]="al", + [126559]="al", + [126561]="al", + [126562]="al", + [126564]="al", + [126567]="al", + [126568]="al", + [126569]="al", + [126570]="al", + [126572]="al", + [126573]="al", + [126574]="al", + [126575]="al", + [126576]="al", + [126577]="al", + [126578]="al", + [126580]="al", + [126581]="al", + [126582]="al", + [126583]="al", + [126585]="al", + [126586]="al", + [126587]="al", + [126588]="al", + [126590]="al", + [126592]="al", + [126593]="al", + [126594]="al", + [126595]="al", + [126596]="al", + [126597]="al", + [126598]="al", + [126599]="al", + [126600]="al", + [126601]="al", + [126603]="al", + [126604]="al", + [126605]="al", + [126606]="al", + [126607]="al", + [126608]="al", + [126609]="al", + [126610]="al", + [126611]="al", + [126612]="al", + [126613]="al", + [126614]="al", + [126615]="al", + [126616]="al", + [126617]="al", + [126618]="al", + [126619]="al", + [126625]="al", + [126626]="al", + [126627]="al", + [126629]="al", + [126630]="al", + [126631]="al", + [126632]="al", + [126633]="al", + [126635]="al", + [126636]="al", + [126637]="al", + [126638]="al", + [126639]="al", + [126640]="al", + [126641]="al", + [126642]="al", + [126643]="al", + [126644]="al", + [126645]="al", + [126646]="al", + [126647]="al", + [126648]="al", + [126649]="al", + [126650]="al", + [126651]="al", + [126704]="on", + [126705]="on", + [126976]="on", + [126977]="on", + [126978]="on", + [126979]="on", + [126980]="on", + [126981]="on", + [126982]="on", + [126983]="on", + [126984]="on", + [126985]="on", + [126986]="on", + [126987]="on", + [126988]="on", + [126989]="on", + [126990]="on", + [126991]="on", + [126992]="on", + [126993]="on", + [126994]="on", + [126995]="on", + [126996]="on", + [126997]="on", + [126998]="on", + [126999]="on", + [127000]="on", + [127001]="on", + [127002]="on", + [127003]="on", + [127004]="on", + [127005]="on", + [127006]="on", + [127007]="on", + [127008]="on", + [127009]="on", + [127010]="on", + [127011]="on", + [127012]="on", + [127013]="on", + [127014]="on", + [127015]="on", + [127016]="on", + [127017]="on", + [127018]="on", + [127019]="on", + [127024]="on", + [127025]="on", + [127026]="on", + [127027]="on", + [127028]="on", + [127029]="on", + [127030]="on", + [127031]="on", + [127032]="on", + [127033]="on", + [127034]="on", + [127035]="on", + [127036]="on", + [127037]="on", + [127038]="on", + [127039]="on", + [127040]="on", + [127041]="on", + [127042]="on", + [127043]="on", + [127044]="on", + [127045]="on", + [127046]="on", + [127047]="on", + [127048]="on", + [127049]="on", + [127050]="on", + [127051]="on", + [127052]="on", + [127053]="on", + [127054]="on", + [127055]="on", + [127056]="on", + [127057]="on", + [127058]="on", + [127059]="on", + [127060]="on", + [127061]="on", + [127062]="on", + [127063]="on", + [127064]="on", + [127065]="on", + [127066]="on", + [127067]="on", + [127068]="on", + [127069]="on", + [127070]="on", + [127071]="on", + [127072]="on", + [127073]="on", + [127074]="on", + [127075]="on", + [127076]="on", + [127077]="on", + [127078]="on", + [127079]="on", + [127080]="on", + [127081]="on", + [127082]="on", + [127083]="on", + [127084]="on", + [127085]="on", + [127086]="on", + [127087]="on", + [127088]="on", + [127089]="on", + [127090]="on", + [127091]="on", + [127092]="on", + [127093]="on", + [127094]="on", + [127095]="on", + [127096]="on", + [127097]="on", + [127098]="on", + [127099]="on", + [127100]="on", + [127101]="on", + [127102]="on", + [127103]="on", + [127104]="on", + [127105]="on", + [127106]="on", + [127107]="on", + [127108]="on", + [127109]="on", + [127110]="on", + [127111]="on", + [127112]="on", + [127113]="on", + [127114]="on", + [127115]="on", + [127116]="on", + [127117]="on", + [127118]="on", + [127119]="on", + [127120]="on", + [127121]="on", + [127122]="on", + [127123]="on", + [127136]="on", + [127137]="on", + [127138]="on", + [127139]="on", + [127140]="on", + [127141]="on", + [127142]="on", + [127143]="on", + [127144]="on", + [127145]="on", + [127146]="on", + [127147]="on", + [127148]="on", + [127149]="on", + [127150]="on", + [127153]="on", + [127154]="on", + [127155]="on", + [127156]="on", + [127157]="on", + [127158]="on", + [127159]="on", + [127160]="on", + [127161]="on", + [127162]="on", + [127163]="on", + [127164]="on", + [127165]="on", + [127166]="on", + [127167]="on", + [127169]="on", + [127170]="on", + [127171]="on", + [127172]="on", + [127173]="on", + [127174]="on", + [127175]="on", + [127176]="on", + [127177]="on", + [127178]="on", + [127179]="on", + [127180]="on", + [127181]="on", + [127182]="on", + [127183]="on", + [127185]="on", + [127186]="on", + [127187]="on", + [127188]="on", + [127189]="on", + [127190]="on", + [127191]="on", + [127192]="on", + [127193]="on", + [127194]="on", + [127195]="on", + [127196]="on", + [127197]="on", + [127198]="on", + [127199]="on", + [127200]="on", + [127201]="on", + [127202]="on", + [127203]="on", + [127204]="on", + [127205]="on", + [127206]="on", + [127207]="on", + [127208]="on", + [127209]="on", + [127210]="on", + [127211]="on", + [127212]="on", + [127213]="on", + [127214]="on", + [127215]="on", + [127216]="on", + [127217]="on", + [127218]="on", + [127219]="on", + [127220]="on", + [127221]="on", + [127232]="en", + [127233]="en", + [127234]="en", + [127235]="en", + [127236]="en", + [127237]="en", + [127238]="en", + [127239]="en", + [127240]="en", + [127241]="en", + [127242]="en", + [127243]="on", + [127244]="on", + [127338]="on", + [127339]="on", + [127584]="on", + [127585]="on", + [127586]="on", + [127587]="on", + [127588]="on", + [127589]="on", + [127744]="on", + [127745]="on", + [127746]="on", + [127747]="on", + [127748]="on", + [127749]="on", + [127750]="on", + [127751]="on", + [127752]="on", + [127753]="on", + [127754]="on", + [127755]="on", + [127756]="on", + [127757]="on", + [127758]="on", + [127759]="on", + [127760]="on", + [127761]="on", + [127762]="on", + [127763]="on", + [127764]="on", + [127765]="on", + [127766]="on", + [127767]="on", + [127768]="on", + [127769]="on", + [127770]="on", + [127771]="on", + [127772]="on", + [127773]="on", + [127774]="on", + [127775]="on", + [127776]="on", + [127777]="on", + [127778]="on", + [127779]="on", + [127780]="on", + [127781]="on", + [127782]="on", + [127783]="on", + [127784]="on", + [127785]="on", + [127786]="on", + [127787]="on", + [127788]="on", + [127789]="on", + [127790]="on", + [127791]="on", + [127792]="on", + [127793]="on", + [127794]="on", + [127795]="on", + [127796]="on", + [127797]="on", + [127798]="on", + [127799]="on", + [127800]="on", + [127801]="on", + [127802]="on", + [127803]="on", + [127804]="on", + [127805]="on", + [127806]="on", + [127807]="on", + [127808]="on", + [127809]="on", + [127810]="on", + [127811]="on", + [127812]="on", + [127813]="on", + [127814]="on", + [127815]="on", + [127816]="on", + [127817]="on", + [127818]="on", + [127819]="on", + [127820]="on", + [127821]="on", + [127822]="on", + [127823]="on", + [127824]="on", + [127825]="on", + [127826]="on", + [127827]="on", + [127828]="on", + [127829]="on", + [127830]="on", + [127831]="on", + [127832]="on", + [127833]="on", + [127834]="on", + [127835]="on", + [127836]="on", + [127837]="on", + [127838]="on", + [127839]="on", + [127840]="on", + [127841]="on", + [127842]="on", + [127843]="on", + [127844]="on", + [127845]="on", + [127846]="on", + [127847]="on", + [127848]="on", + [127849]="on", + [127850]="on", + [127851]="on", + [127852]="on", + [127853]="on", + [127854]="on", + [127855]="on", + [127856]="on", + [127857]="on", + [127858]="on", + [127859]="on", + [127860]="on", + [127861]="on", + [127862]="on", + [127863]="on", + [127864]="on", + [127865]="on", + [127866]="on", + [127867]="on", + [127868]="on", + [127869]="on", + [127870]="on", + [127871]="on", + [127872]="on", + [127873]="on", + [127874]="on", + [127875]="on", + [127876]="on", + [127877]="on", + [127878]="on", + [127879]="on", + [127880]="on", + [127881]="on", + [127882]="on", + [127883]="on", + [127884]="on", + [127885]="on", + [127886]="on", + [127887]="on", + [127888]="on", + [127889]="on", + [127890]="on", + [127891]="on", + [127892]="on", + [127893]="on", + [127894]="on", + [127895]="on", + [127896]="on", + [127897]="on", + [127898]="on", + [127899]="on", + [127900]="on", + [127901]="on", + [127902]="on", + [127903]="on", + [127904]="on", + [127905]="on", + [127906]="on", + [127907]="on", + [127908]="on", + [127909]="on", + [127910]="on", + [127911]="on", + [127912]="on", + [127913]="on", + [127914]="on", + [127915]="on", + [127916]="on", + [127917]="on", + [127918]="on", + [127919]="on", + [127920]="on", + [127921]="on", + [127922]="on", + [127923]="on", + [127924]="on", + [127925]="on", + [127926]="on", + [127927]="on", + [127928]="on", + [127929]="on", + [127930]="on", + [127931]="on", + [127932]="on", + [127933]="on", + [127934]="on", + [127935]="on", + [127936]="on", + [127937]="on", + [127938]="on", + [127939]="on", + [127940]="on", + [127941]="on", + [127942]="on", + [127943]="on", + [127944]="on", + [127945]="on", + [127946]="on", + [127947]="on", + [127948]="on", + [127949]="on", + [127950]="on", + [127951]="on", + [127952]="on", + [127953]="on", + [127954]="on", + [127955]="on", + [127956]="on", + [127957]="on", + [127958]="on", + [127959]="on", + [127960]="on", + [127961]="on", + [127962]="on", + [127963]="on", + [127964]="on", + [127965]="on", + [127966]="on", + [127967]="on", + [127968]="on", + [127969]="on", + [127970]="on", + [127971]="on", + [127972]="on", + [127973]="on", + [127974]="on", + [127975]="on", + [127976]="on", + [127977]="on", + [127978]="on", + [127979]="on", + [127980]="on", + [127981]="on", + [127982]="on", + [127983]="on", + [127984]="on", + [127985]="on", + [127986]="on", + [127987]="on", + [127988]="on", + [127989]="on", + [127990]="on", + [127991]="on", + [127992]="on", + [127993]="on", + [127994]="on", + [127995]="on", + [127996]="on", + [127997]="on", + [127998]="on", + [127999]="on", + [128000]="on", + [128001]="on", + [128002]="on", + [128003]="on", + [128004]="on", + [128005]="on", + [128006]="on", + [128007]="on", + [128008]="on", + [128009]="on", + [128010]="on", + [128011]="on", + [128012]="on", + [128013]="on", + [128014]="on", + [128015]="on", + [128016]="on", + [128017]="on", + [128018]="on", + [128019]="on", + [128020]="on", + [128021]="on", + [128022]="on", + [128023]="on", + [128024]="on", + [128025]="on", + [128026]="on", + [128027]="on", + [128028]="on", + [128029]="on", + [128030]="on", + [128031]="on", + [128032]="on", + [128033]="on", + [128034]="on", + [128035]="on", + [128036]="on", + [128037]="on", + [128038]="on", + [128039]="on", + [128040]="on", + [128041]="on", + [128042]="on", + [128043]="on", + [128044]="on", + [128045]="on", + [128046]="on", + [128047]="on", + [128048]="on", + [128049]="on", + [128050]="on", + [128051]="on", + [128052]="on", + [128053]="on", + [128054]="on", + [128055]="on", + [128056]="on", + [128057]="on", + [128058]="on", + [128059]="on", + [128060]="on", + [128061]="on", + [128062]="on", + [128063]="on", + [128064]="on", + [128065]="on", + [128066]="on", + [128067]="on", + [128068]="on", + [128069]="on", + [128070]="on", + [128071]="on", + [128072]="on", + [128073]="on", + [128074]="on", + [128075]="on", + [128076]="on", + [128077]="on", + [128078]="on", + [128079]="on", + [128080]="on", + [128081]="on", + [128082]="on", + [128083]="on", + [128084]="on", + [128085]="on", + [128086]="on", + [128087]="on", + [128088]="on", + [128089]="on", + [128090]="on", + [128091]="on", + [128092]="on", + [128093]="on", + [128094]="on", + [128095]="on", + [128096]="on", + [128097]="on", + [128098]="on", + [128099]="on", + [128100]="on", + [128101]="on", + [128102]="on", + [128103]="on", + [128104]="on", + [128105]="on", + [128106]="on", + [128107]="on", + [128108]="on", + [128109]="on", + [128110]="on", + [128111]="on", + [128112]="on", + [128113]="on", + [128114]="on", + [128115]="on", + [128116]="on", + [128117]="on", + [128118]="on", + [128119]="on", + [128120]="on", + [128121]="on", + [128122]="on", + [128123]="on", + [128124]="on", + [128125]="on", + [128126]="on", + [128127]="on", + [128128]="on", + [128129]="on", + [128130]="on", + [128131]="on", + [128132]="on", + [128133]="on", + [128134]="on", + [128135]="on", + [128136]="on", + [128137]="on", + [128138]="on", + [128139]="on", + [128140]="on", + [128141]="on", + [128142]="on", + [128143]="on", + [128144]="on", + [128145]="on", + [128146]="on", + [128147]="on", + [128148]="on", + [128149]="on", + [128150]="on", + [128151]="on", + [128152]="on", + [128153]="on", + [128154]="on", + [128155]="on", + [128156]="on", + [128157]="on", + [128158]="on", + [128159]="on", + [128160]="on", + [128161]="on", + [128162]="on", + [128163]="on", + [128164]="on", + [128165]="on", + [128166]="on", + [128167]="on", + [128168]="on", + [128169]="on", + [128170]="on", + [128171]="on", + [128172]="on", + [128173]="on", + [128174]="on", + [128175]="on", + [128176]="on", + [128177]="on", + [128178]="on", + [128179]="on", + [128180]="on", + [128181]="on", + [128182]="on", + [128183]="on", + [128184]="on", + [128185]="on", + [128186]="on", + [128187]="on", + [128188]="on", + [128189]="on", + [128190]="on", + [128191]="on", + [128192]="on", + [128193]="on", + [128194]="on", + [128195]="on", + [128196]="on", + [128197]="on", + [128198]="on", + [128199]="on", + [128200]="on", + [128201]="on", + [128202]="on", + [128203]="on", + [128204]="on", + [128205]="on", + [128206]="on", + [128207]="on", + [128208]="on", + [128209]="on", + [128210]="on", + [128211]="on", + [128212]="on", + [128213]="on", + [128214]="on", + [128215]="on", + [128216]="on", + [128217]="on", + [128218]="on", + [128219]="on", + [128220]="on", + [128221]="on", + [128222]="on", + [128223]="on", + [128224]="on", + [128225]="on", + [128226]="on", + [128227]="on", + [128228]="on", + [128229]="on", + [128230]="on", + [128231]="on", + [128232]="on", + [128233]="on", + [128234]="on", + [128235]="on", + [128236]="on", + [128237]="on", + [128238]="on", + [128239]="on", + [128240]="on", + [128241]="on", + [128242]="on", + [128243]="on", + [128244]="on", + [128245]="on", + [128246]="on", + [128247]="on", + [128248]="on", + [128249]="on", + [128250]="on", + [128251]="on", + [128252]="on", + [128253]="on", + [128254]="on", + [128255]="on", + [128256]="on", + [128257]="on", + [128258]="on", + [128259]="on", + [128260]="on", + [128261]="on", + [128262]="on", + [128263]="on", + [128264]="on", + [128265]="on", + [128266]="on", + [128267]="on", + [128268]="on", + [128269]="on", + [128270]="on", + [128271]="on", + [128272]="on", + [128273]="on", + [128274]="on", + [128275]="on", + [128276]="on", + [128277]="on", + [128278]="on", + [128279]="on", + [128280]="on", + [128281]="on", + [128282]="on", + [128283]="on", + [128284]="on", + [128285]="on", + [128286]="on", + [128287]="on", + [128288]="on", + [128289]="on", + [128290]="on", + [128291]="on", + [128292]="on", + [128293]="on", + [128294]="on", + [128295]="on", + [128296]="on", + [128297]="on", + [128298]="on", + [128299]="on", + [128300]="on", + [128301]="on", + [128302]="on", + [128303]="on", + [128304]="on", + [128305]="on", + [128306]="on", + [128307]="on", + [128308]="on", + [128309]="on", + [128310]="on", + [128311]="on", + [128312]="on", + [128313]="on", + [128314]="on", + [128315]="on", + [128316]="on", + [128317]="on", + [128318]="on", + [128319]="on", + [128320]="on", + [128321]="on", + [128322]="on", + [128323]="on", + [128324]="on", + [128325]="on", + [128326]="on", + [128327]="on", + [128328]="on", + [128329]="on", + [128330]="on", + [128331]="on", + [128332]="on", + [128333]="on", + [128334]="on", + [128335]="on", + [128336]="on", + [128337]="on", + [128338]="on", + [128339]="on", + [128340]="on", + [128341]="on", + [128342]="on", + [128343]="on", + [128344]="on", + [128345]="on", + [128346]="on", + [128347]="on", + [128348]="on", + [128349]="on", + [128350]="on", + [128351]="on", + [128352]="on", + [128353]="on", + [128354]="on", + [128355]="on", + [128356]="on", + [128357]="on", + [128358]="on", + [128359]="on", + [128360]="on", + [128361]="on", + [128362]="on", + [128363]="on", + [128364]="on", + [128365]="on", + [128366]="on", + [128367]="on", + [128368]="on", + [128369]="on", + [128370]="on", + [128371]="on", + [128372]="on", + [128373]="on", + [128374]="on", + [128375]="on", + [128376]="on", + [128377]="on", + [128378]="on", + [128379]="on", + [128380]="on", + [128381]="on", + [128382]="on", + [128383]="on", + [128384]="on", + [128385]="on", + [128386]="on", + [128387]="on", + [128388]="on", + [128389]="on", + [128390]="on", + [128391]="on", + [128392]="on", + [128393]="on", + [128394]="on", + [128395]="on", + [128396]="on", + [128397]="on", + [128398]="on", + [128399]="on", + [128400]="on", + [128401]="on", + [128402]="on", + [128403]="on", + [128404]="on", + [128405]="on", + [128406]="on", + [128407]="on", + [128408]="on", + [128409]="on", + [128410]="on", + [128411]="on", + [128412]="on", + [128413]="on", + [128414]="on", + [128415]="on", + [128416]="on", + [128417]="on", + [128418]="on", + [128419]="on", + [128420]="on", + [128421]="on", + [128422]="on", + [128423]="on", + [128424]="on", + [128425]="on", + [128426]="on", + [128427]="on", + [128428]="on", + [128429]="on", + [128430]="on", + [128431]="on", + [128432]="on", + [128433]="on", + [128434]="on", + [128435]="on", + [128436]="on", + [128437]="on", + [128438]="on", + [128439]="on", + [128440]="on", + [128441]="on", + [128442]="on", + [128443]="on", + [128444]="on", + [128445]="on", + [128446]="on", + [128447]="on", + [128448]="on", + [128449]="on", + [128450]="on", + [128451]="on", + [128452]="on", + [128453]="on", + [128454]="on", + [128455]="on", + [128456]="on", + [128457]="on", + [128458]="on", + [128459]="on", + [128460]="on", + [128461]="on", + [128462]="on", + [128463]="on", + [128464]="on", + [128465]="on", + [128466]="on", + [128467]="on", + [128468]="on", + [128469]="on", + [128470]="on", + [128471]="on", + [128472]="on", + [128473]="on", + [128474]="on", + [128475]="on", + [128476]="on", + [128477]="on", + [128478]="on", + [128479]="on", + [128480]="on", + [128481]="on", + [128482]="on", + [128483]="on", + [128484]="on", + [128485]="on", + [128486]="on", + [128487]="on", + [128488]="on", + [128489]="on", + [128490]="on", + [128491]="on", + [128492]="on", + [128493]="on", + [128494]="on", + [128495]="on", + [128496]="on", + [128497]="on", + [128498]="on", + [128499]="on", + [128500]="on", + [128501]="on", + [128502]="on", + [128503]="on", + [128504]="on", + [128505]="on", + [128506]="on", + [128507]="on", + [128508]="on", + [128509]="on", + [128510]="on", + [128511]="on", + [128512]="on", + [128513]="on", + [128514]="on", + [128515]="on", + [128516]="on", + [128517]="on", + [128518]="on", + [128519]="on", + [128520]="on", + [128521]="on", + [128522]="on", + [128523]="on", + [128524]="on", + [128525]="on", + [128526]="on", + [128527]="on", + [128528]="on", + [128529]="on", + [128530]="on", + [128531]="on", + [128532]="on", + [128533]="on", + [128534]="on", + [128535]="on", + [128536]="on", + [128537]="on", + [128538]="on", + [128539]="on", + [128540]="on", + [128541]="on", + [128542]="on", + [128543]="on", + [128544]="on", + [128545]="on", + [128546]="on", + [128547]="on", + [128548]="on", + [128549]="on", + [128550]="on", + [128551]="on", + [128552]="on", + [128553]="on", + [128554]="on", + [128555]="on", + [128556]="on", + [128557]="on", + [128558]="on", + [128559]="on", + [128560]="on", + [128561]="on", + [128562]="on", + [128563]="on", + [128564]="on", + [128565]="on", + [128566]="on", + [128567]="on", + [128568]="on", + [128569]="on", + [128570]="on", + [128571]="on", + [128572]="on", + [128573]="on", + [128574]="on", + [128575]="on", + [128576]="on", + [128577]="on", + [128578]="on", + [128579]="on", + [128580]="on", + [128581]="on", + [128582]="on", + [128583]="on", + [128584]="on", + [128585]="on", + [128586]="on", + [128587]="on", + [128588]="on", + [128589]="on", + [128590]="on", + [128591]="on", + [128592]="on", + [128593]="on", + [128594]="on", + [128595]="on", + [128596]="on", + [128597]="on", + [128598]="on", + [128599]="on", + [128600]="on", + [128601]="on", + [128602]="on", + [128603]="on", + [128604]="on", + [128605]="on", + [128606]="on", + [128607]="on", + [128608]="on", + [128609]="on", + [128610]="on", + [128611]="on", + [128612]="on", + [128613]="on", + [128614]="on", + [128615]="on", + [128616]="on", + [128617]="on", + [128618]="on", + [128619]="on", + [128620]="on", + [128621]="on", + [128622]="on", + [128623]="on", + [128624]="on", + [128625]="on", + [128626]="on", + [128627]="on", + [128628]="on", + [128629]="on", + [128630]="on", + [128631]="on", + [128632]="on", + [128633]="on", + [128634]="on", + [128635]="on", + [128636]="on", + [128637]="on", + [128638]="on", + [128639]="on", + [128640]="on", + [128641]="on", + [128642]="on", + [128643]="on", + [128644]="on", + [128645]="on", + [128646]="on", + [128647]="on", + [128648]="on", + [128649]="on", + [128650]="on", + [128651]="on", + [128652]="on", + [128653]="on", + [128654]="on", + [128655]="on", + [128656]="on", + [128657]="on", + [128658]="on", + [128659]="on", + [128660]="on", + [128661]="on", + [128662]="on", + [128663]="on", + [128664]="on", + [128665]="on", + [128666]="on", + [128667]="on", + [128668]="on", + [128669]="on", + [128670]="on", + [128671]="on", + [128672]="on", + [128673]="on", + [128674]="on", + [128675]="on", + [128676]="on", + [128677]="on", + [128678]="on", + [128679]="on", + [128680]="on", + [128681]="on", + [128682]="on", + [128683]="on", + [128684]="on", + [128685]="on", + [128686]="on", + [128687]="on", + [128688]="on", + [128689]="on", + [128690]="on", + [128691]="on", + [128692]="on", + [128693]="on", + [128694]="on", + [128695]="on", + [128696]="on", + [128697]="on", + [128698]="on", + [128699]="on", + [128700]="on", + [128701]="on", + [128702]="on", + [128703]="on", + [128704]="on", + [128705]="on", + [128706]="on", + [128707]="on", + [128708]="on", + [128709]="on", + [128710]="on", + [128711]="on", + [128712]="on", + [128713]="on", + [128714]="on", + [128715]="on", + [128716]="on", + [128717]="on", + [128718]="on", + [128719]="on", + [128720]="on", + [128721]="on", + [128722]="on", + [128723]="on", + [128724]="on", + [128736]="on", + [128737]="on", + [128738]="on", + [128739]="on", + [128740]="on", + [128741]="on", + [128742]="on", + [128743]="on", + [128744]="on", + [128745]="on", + [128746]="on", + [128747]="on", + [128748]="on", + [128752]="on", + [128753]="on", + [128754]="on", + [128755]="on", + [128756]="on", + [128757]="on", + [128758]="on", + [128759]="on", + [128760]="on", + [128768]="on", + [128769]="on", + [128770]="on", + [128771]="on", + [128772]="on", + [128773]="on", + [128774]="on", + [128775]="on", + [128776]="on", + [128777]="on", + [128778]="on", + [128779]="on", + [128780]="on", + [128781]="on", + [128782]="on", + [128783]="on", + [128784]="on", + [128785]="on", + [128786]="on", + [128787]="on", + [128788]="on", + [128789]="on", + [128790]="on", + [128791]="on", + [128792]="on", + [128793]="on", + [128794]="on", + [128795]="on", + [128796]="on", + [128797]="on", + [128798]="on", + [128799]="on", + [128800]="on", + [128801]="on", + [128802]="on", + [128803]="on", + [128804]="on", + [128805]="on", + [128806]="on", + [128807]="on", + [128808]="on", + [128809]="on", + [128810]="on", + [128811]="on", + [128812]="on", + [128813]="on", + [128814]="on", + [128815]="on", + [128816]="on", + [128817]="on", + [128818]="on", + [128819]="on", + [128820]="on", + [128821]="on", + [128822]="on", + [128823]="on", + [128824]="on", + [128825]="on", + [128826]="on", + [128827]="on", + [128828]="on", + [128829]="on", + [128830]="on", + [128831]="on", + [128832]="on", + [128833]="on", + [128834]="on", + [128835]="on", + [128836]="on", + [128837]="on", + [128838]="on", + [128839]="on", + [128840]="on", + [128841]="on", + [128842]="on", + [128843]="on", + [128844]="on", + [128845]="on", + [128846]="on", + [128847]="on", + [128848]="on", + [128849]="on", + [128850]="on", + [128851]="on", + [128852]="on", + [128853]="on", + [128854]="on", + [128855]="on", + [128856]="on", + [128857]="on", + [128858]="on", + [128859]="on", + [128860]="on", + [128861]="on", + [128862]="on", + [128863]="on", + [128864]="on", + [128865]="on", + [128866]="on", + [128867]="on", + [128868]="on", + [128869]="on", + [128870]="on", + [128871]="on", + [128872]="on", + [128873]="on", + [128874]="on", + [128875]="on", + [128876]="on", + [128877]="on", + [128878]="on", + [128879]="on", + [128880]="on", + [128881]="on", + [128882]="on", + [128883]="on", + [128896]="on", + [128897]="on", + [128898]="on", + [128899]="on", + [128900]="on", + [128901]="on", + [128902]="on", + [128903]="on", + [128904]="on", + [128905]="on", + [128906]="on", + [128907]="on", + [128908]="on", + [128909]="on", + [128910]="on", + [128911]="on", + [128912]="on", + [128913]="on", + [128914]="on", + [128915]="on", + [128916]="on", + [128917]="on", + [128918]="on", + [128919]="on", + [128920]="on", + [128921]="on", + [128922]="on", + [128923]="on", + [128924]="on", + [128925]="on", + [128926]="on", + [128927]="on", + [128928]="on", + [128929]="on", + [128930]="on", + [128931]="on", + [128932]="on", + [128933]="on", + [128934]="on", + [128935]="on", + [128936]="on", + [128937]="on", + [128938]="on", + [128939]="on", + [128940]="on", + [128941]="on", + [128942]="on", + [128943]="on", + [128944]="on", + [128945]="on", + [128946]="on", + [128947]="on", + [128948]="on", + [128949]="on", + [128950]="on", + [128951]="on", + [128952]="on", + [128953]="on", + [128954]="on", + [128955]="on", + [128956]="on", + [128957]="on", + [128958]="on", + [128959]="on", + [128960]="on", + [128961]="on", + [128962]="on", + [128963]="on", + [128964]="on", + [128965]="on", + [128966]="on", + [128967]="on", + [128968]="on", + [128969]="on", + [128970]="on", + [128971]="on", + [128972]="on", + [128973]="on", + [128974]="on", + [128975]="on", + [128976]="on", + [128977]="on", + [128978]="on", + [128979]="on", + [128980]="on", + [129024]="on", + [129025]="on", + [129026]="on", + [129027]="on", + [129028]="on", + [129029]="on", + [129030]="on", + [129031]="on", + [129032]="on", + [129033]="on", + [129034]="on", + [129035]="on", + [129040]="on", + [129041]="on", + [129042]="on", + [129043]="on", + [129044]="on", + [129045]="on", + [129046]="on", + [129047]="on", + [129048]="on", + [129049]="on", + [129050]="on", + [129051]="on", + [129052]="on", + [129053]="on", + [129054]="on", + [129055]="on", + [129056]="on", + [129057]="on", + [129058]="on", + [129059]="on", + [129060]="on", + [129061]="on", + [129062]="on", + [129063]="on", + [129064]="on", + [129065]="on", + [129066]="on", + [129067]="on", + [129068]="on", + [129069]="on", + [129070]="on", + [129071]="on", + [129072]="on", + [129073]="on", + [129074]="on", + [129075]="on", + [129076]="on", + [129077]="on", + [129078]="on", + [129079]="on", + [129080]="on", + [129081]="on", + [129082]="on", + [129083]="on", + [129084]="on", + [129085]="on", + [129086]="on", + [129087]="on", + [129088]="on", + [129089]="on", + [129090]="on", + [129091]="on", + [129092]="on", + [129093]="on", + [129094]="on", + [129095]="on", + [129104]="on", + [129105]="on", + [129106]="on", + [129107]="on", + [129108]="on", + [129109]="on", + [129110]="on", + [129111]="on", + [129112]="on", + [129113]="on", + [129120]="on", + [129121]="on", + [129122]="on", + [129123]="on", + [129124]="on", + [129125]="on", + [129126]="on", + [129127]="on", + [129128]="on", + [129129]="on", + [129130]="on", + [129131]="on", + [129132]="on", + [129133]="on", + [129134]="on", + [129135]="on", + [129136]="on", + [129137]="on", + [129138]="on", + [129139]="on", + [129140]="on", + [129141]="on", + [129142]="on", + [129143]="on", + [129144]="on", + [129145]="on", + [129146]="on", + [129147]="on", + [129148]="on", + [129149]="on", + [129150]="on", + [129151]="on", + [129152]="on", + [129153]="on", + [129154]="on", + [129155]="on", + [129156]="on", + [129157]="on", + [129158]="on", + [129159]="on", + [129168]="on", + [129169]="on", + [129170]="on", + [129171]="on", + [129172]="on", + [129173]="on", + [129174]="on", + [129175]="on", + [129176]="on", + [129177]="on", + [129178]="on", + [129179]="on", + [129180]="on", + [129181]="on", + [129182]="on", + [129183]="on", + [129184]="on", + [129185]="on", + [129186]="on", + [129187]="on", + [129188]="on", + [129189]="on", + [129190]="on", + [129191]="on", + [129192]="on", + [129193]="on", + [129194]="on", + [129195]="on", + [129196]="on", + [129197]="on", + [129280]="on", + [129281]="on", + [129282]="on", + [129283]="on", + [129284]="on", + [129285]="on", + [129286]="on", + [129287]="on", + [129288]="on", + [129289]="on", + [129290]="on", + [129291]="on", + [129296]="on", + [129297]="on", + [129298]="on", + [129299]="on", + [129300]="on", + [129301]="on", + [129302]="on", + [129303]="on", + [129304]="on", + [129305]="on", + [129306]="on", + [129307]="on", + [129308]="on", + [129309]="on", + [129310]="on", + [129311]="on", + [129312]="on", + [129313]="on", + [129314]="on", + [129315]="on", + [129316]="on", + [129317]="on", + [129318]="on", + [129319]="on", + [129320]="on", + [129321]="on", + [129322]="on", + [129323]="on", + [129324]="on", + [129325]="on", + [129326]="on", + [129327]="on", + [129328]="on", + [129329]="on", + [129330]="on", + [129331]="on", + [129332]="on", + [129333]="on", + [129334]="on", + [129335]="on", + [129336]="on", + [129337]="on", + [129338]="on", + [129339]="on", + [129340]="on", + [129341]="on", + [129342]="on", + [129344]="on", + [129345]="on", + [129346]="on", + [129347]="on", + [129348]="on", + [129349]="on", + [129350]="on", + [129351]="on", + [129352]="on", + [129353]="on", + [129354]="on", + [129355]="on", + [129356]="on", + [129360]="on", + [129361]="on", + [129362]="on", + [129363]="on", + [129364]="on", + [129365]="on", + [129366]="on", + [129367]="on", + [129368]="on", + [129369]="on", + [129370]="on", + [129371]="on", + [129372]="on", + [129373]="on", + [129374]="on", + [129375]="on", + [129376]="on", + [129377]="on", + [129378]="on", + [129379]="on", + [129380]="on", + [129381]="on", + [129382]="on", + [129383]="on", + [129384]="on", + [129385]="on", + [129386]="on", + [129387]="on", + [129408]="on", + [129409]="on", + [129410]="on", + [129411]="on", + [129412]="on", + [129413]="on", + [129414]="on", + [129415]="on", + [129416]="on", + [129417]="on", + [129418]="on", + [129419]="on", + [129420]="on", + [129421]="on", + [129422]="on", + [129423]="on", + [129424]="on", + [129425]="on", + [129426]="on", + [129427]="on", + [129428]="on", + [129429]="on", + [129430]="on", + [129431]="on", + [129472]="on", + [129488]="on", + [129489]="on", + [129490]="on", + [129491]="on", + [129492]="on", + [129493]="on", + [129494]="on", + [129495]="on", + [129496]="on", + [129497]="on", + [129498]="on", + [129499]="on", + [129500]="on", + [129501]="on", + [129502]="on", + [129503]="on", + [129504]="on", + [129505]="on", + [129506]="on", + [129507]="on", + [129508]="on", + [129509]="on", + [129510]="on", + [917505]="bn", + [917536]="bn", + [917537]="bn", + [917538]="bn", + [917539]="bn", + [917540]="bn", + [917541]="bn", + [917542]="bn", + [917543]="bn", + [917544]="bn", + [917545]="bn", + [917546]="bn", + [917547]="bn", + [917548]="bn", + [917549]="bn", + [917550]="bn", + [917551]="bn", + [917552]="bn", + [917553]="bn", + [917554]="bn", + [917555]="bn", + [917556]="bn", + [917557]="bn", + [917558]="bn", + [917559]="bn", + [917560]="bn", + [917561]="bn", + [917562]="bn", + [917563]="bn", + [917564]="bn", + [917565]="bn", + [917566]="bn", + [917567]="bn", + [917568]="bn", + [917569]="bn", + [917570]="bn", + [917571]="bn", + [917572]="bn", + [917573]="bn", + [917574]="bn", + [917575]="bn", + [917576]="bn", + [917577]="bn", + [917578]="bn", + [917579]="bn", + [917580]="bn", + [917581]="bn", + [917582]="bn", + [917583]="bn", + [917584]="bn", + [917585]="bn", + [917586]="bn", + [917587]="bn", + [917588]="bn", + [917589]="bn", + [917590]="bn", + [917591]="bn", + [917592]="bn", + [917593]="bn", + [917594]="bn", + [917595]="bn", + [917596]="bn", + [917597]="bn", + [917598]="bn", + [917599]="bn", + [917600]="bn", + [917601]="bn", + [917602]="bn", + [917603]="bn", + [917604]="bn", + [917605]="bn", + [917606]="bn", + [917607]="bn", + [917608]="bn", + [917609]="bn", + [917610]="bn", + [917611]="bn", + [917612]="bn", + [917613]="bn", + [917614]="bn", + [917615]="bn", + [917616]="bn", + [917617]="bn", + [917618]="bn", + [917619]="bn", + [917620]="bn", + [917621]="bn", + [917622]="bn", + [917623]="bn", + [917624]="bn", + [917625]="bn", + [917626]="bn", + [917627]="bn", + [917628]="bn", + [917629]="bn", + [917630]="bn", + [917631]="bn", + }, + ["mirrors"]={ + [40]=41, + [41]=40, + [60]=62, + [62]=60, + [91]=93, + [93]=91, + [123]=125, + [125]=123, + [171]=187, + [187]=171, + [3898]=3899, + [3899]=3898, + [3900]=3901, + [3901]=3900, + [5787]=5788, + [5788]=5787, + [8249]=8250, + [8250]=8249, + [8261]=8262, + [8262]=8261, + [8317]=8318, + [8318]=8317, + [8333]=8334, + [8334]=8333, + [8712]=8715, + [8713]=8716, + [8714]=8717, + [8715]=8712, + [8716]=8713, + [8717]=8714, + [8725]=10741, + [8764]=8765, + [8765]=8764, + [8771]=8909, + [8786]=8787, + [8787]=8786, + [8788]=8789, + [8789]=8788, + [8804]=8805, + [8805]=8804, + [8806]=8807, + [8807]=8806, + [8808]=8809, + [8809]=8808, + [8810]=8811, + [8811]=8810, + [8814]=8815, + [8815]=8814, + [8816]=8817, + [8817]=8816, + [8818]=8819, + [8819]=8818, + [8820]=8821, + [8821]=8820, + [8822]=8823, + [8823]=8822, + [8824]=8825, + [8825]=8824, + [8826]=8827, + [8827]=8826, + [8828]=8829, + [8829]=8828, + [8830]=8831, + [8831]=8830, + [8832]=8833, + [8833]=8832, + [8834]=8835, + [8835]=8834, + [8836]=8837, + [8837]=8836, + [8838]=8839, + [8839]=8838, + [8840]=8841, + [8841]=8840, + [8842]=8843, + [8843]=8842, + [8847]=8848, + [8848]=8847, + [8849]=8850, + [8850]=8849, + [8856]=10680, + [8866]=8867, + [8867]=8866, + [8870]=10974, + [8872]=10980, + [8873]=10979, + [8875]=10981, + [8880]=8881, + [8881]=8880, + [8882]=8883, + [8883]=8882, + [8884]=8885, + [8885]=8884, + [8886]=8887, + [8887]=8886, + [8905]=8906, + [8906]=8905, + [8907]=8908, + [8908]=8907, + [8909]=8771, + [8912]=8913, + [8913]=8912, + [8918]=8919, + [8919]=8918, + [8920]=8921, + [8921]=8920, + [8922]=8923, + [8923]=8922, + [8924]=8925, + [8925]=8924, + [8926]=8927, + [8927]=8926, + [8928]=8929, + [8929]=8928, + [8930]=8931, + [8931]=8930, + [8932]=8933, + [8933]=8932, + [8934]=8935, + [8935]=8934, + [8936]=8937, + [8937]=8936, + [8938]=8939, + [8939]=8938, + [8940]=8941, + [8941]=8940, + [8944]=8945, + [8945]=8944, + [8946]=8954, + [8947]=8955, + [8948]=8956, + [8950]=8957, + [8951]=8958, + [8954]=8946, + [8955]=8947, + [8956]=8948, + [8957]=8950, + [8958]=8951, + [8968]=8969, + [8969]=8968, + [8970]=8971, + [8971]=8970, + [9001]=9002, + [9002]=9001, + [10088]=10089, + [10089]=10088, + [10090]=10091, + [10091]=10090, + [10092]=10093, + [10093]=10092, + [10094]=10095, + [10095]=10094, + [10096]=10097, + [10097]=10096, + [10098]=10099, + [10099]=10098, + [10100]=10101, + [10101]=10100, + [10179]=10180, + [10180]=10179, + [10181]=10182, + [10182]=10181, + [10184]=10185, + [10185]=10184, + [10187]=10189, + [10189]=10187, + [10197]=10198, + [10198]=10197, + [10205]=10206, + [10206]=10205, + [10210]=10211, + [10211]=10210, + [10212]=10213, + [10213]=10212, + [10214]=10215, + [10215]=10214, + [10216]=10217, + [10217]=10216, + [10218]=10219, + [10219]=10218, + [10220]=10221, + [10221]=10220, + [10222]=10223, + [10223]=10222, + [10627]=10628, + [10628]=10627, + [10629]=10630, + [10630]=10629, + [10631]=10632, + [10632]=10631, + [10633]=10634, + [10634]=10633, + [10635]=10636, + [10636]=10635, + [10637]=10640, + [10638]=10639, + [10639]=10638, + [10640]=10637, + [10641]=10642, + [10642]=10641, + [10643]=10644, + [10644]=10643, + [10645]=10646, + [10646]=10645, + [10647]=10648, + [10648]=10647, + [10680]=8856, + [10688]=10689, + [10689]=10688, + [10692]=10693, + [10693]=10692, + [10703]=10704, + [10704]=10703, + [10705]=10706, + [10706]=10705, + [10708]=10709, + [10709]=10708, + [10712]=10713, + [10713]=10712, + [10714]=10715, + [10715]=10714, + [10741]=8725, + [10744]=10745, + [10745]=10744, + [10748]=10749, + [10749]=10748, + [10795]=10796, + [10796]=10795, + [10797]=10798, + [10798]=10797, + [10804]=10805, + [10805]=10804, + [10812]=10813, + [10813]=10812, + [10852]=10853, + [10853]=10852, + [10873]=10874, + [10874]=10873, + [10877]=10878, + [10878]=10877, + [10879]=10880, + [10880]=10879, + [10881]=10882, + [10882]=10881, + [10883]=10884, + [10884]=10883, + [10891]=10892, + [10892]=10891, + [10897]=10898, + [10898]=10897, + [10899]=10900, + [10900]=10899, + [10901]=10902, + [10902]=10901, + [10903]=10904, + [10904]=10903, + [10905]=10906, + [10906]=10905, + [10907]=10908, + [10908]=10907, + [10913]=10914, + [10914]=10913, + [10918]=10919, + [10919]=10918, + [10920]=10921, + [10921]=10920, + [10922]=10923, + [10923]=10922, + [10924]=10925, + [10925]=10924, + [10927]=10928, + [10928]=10927, + [10931]=10932, + [10932]=10931, + [10939]=10940, + [10940]=10939, + [10941]=10942, + [10942]=10941, + [10943]=10944, + [10944]=10943, + [10945]=10946, + [10946]=10945, + [10947]=10948, + [10948]=10947, + [10949]=10950, + [10950]=10949, + [10957]=10958, + [10958]=10957, + [10959]=10960, + [10960]=10959, + [10961]=10962, + [10962]=10961, + [10963]=10964, + [10964]=10963, + [10965]=10966, + [10966]=10965, + [10974]=8870, + [10979]=8873, + [10980]=8872, + [10981]=8875, + [10988]=10989, + [10989]=10988, + [10999]=11000, + [11000]=10999, + [11001]=11002, + [11002]=11001, + [11778]=11779, + [11779]=11778, + [11780]=11781, + [11781]=11780, + [11785]=11786, + [11786]=11785, + [11788]=11789, + [11789]=11788, + [11804]=11805, + [11805]=11804, + [11808]=11809, + [11809]=11808, + [11810]=11811, + [11811]=11810, + [11812]=11813, + [11813]=11812, + [11814]=11815, + [11815]=11814, + [11816]=11817, + [11817]=11816, + [12296]=12297, + [12297]=12296, + [12298]=12299, + [12299]=12298, + [12300]=12301, + [12301]=12300, + [12302]=12303, + [12303]=12302, + [12304]=12305, + [12305]=12304, + [12308]=12309, + [12309]=12308, + [12310]=12311, + [12311]=12310, + [12312]=12313, + [12313]=12312, + [12314]=12315, + [12315]=12314, + [65113]=65114, + [65114]=65113, + [65115]=65116, + [65116]=65115, + [65117]=65118, + [65118]=65117, + [65124]=65125, + [65125]=65124, + [65288]=65289, + [65289]=65288, + [65308]=65310, + [65310]=65308, + [65339]=65341, + [65341]=65339, + [65371]=65373, + [65373]=65371, + [65375]=65376, + [65376]=65375, + [65378]=65379, + [65379]=65378, + }, + ["textclasses"]={ + [40]="open", + [41]="close", + [60]="open", + [62]="close", + [91]="open", + [93]="close", + [123]="open", + [125]="close", + [171]="open", + [187]="close", + [8249]="open", + [8250]="close", + [8317]="open", + [8318]="close", + [8333]="open", + [8334]="close", + [10647]="open", + [10648]="close", + [65113]="open", + [65114]="close", + [65115]="open", + [65116]="close", + [65117]="open", + [65118]="close", + [65124]="open", + [65125]="close", + [65288]="open", + [65289]="close", + [65308]="open", + [65310]="close", + [65339]="open", + [65341]="close", + [65371]="open", + [65373]="close", + [65375]="open", + [65376]="close", + [65378]="open", + [65379]="close", + }, +} diff --git a/context/data/scite/context/lexers/data/scite-context-data-context.lua b/context/data/scite/context/lexers/data/scite-context-data-context.lua index b9a90c262..3ecca045b 100644 --- a/context/data/scite/context/lexers/data/scite-context-data-context.lua +++ b/context/data/scite/context/lexers/data/scite-context-data-context.lua @@ -1,4 +1,4 @@ return { - ["constants"]={ "zerocount", "minusone", "minustwo", "plusone", "plustwo", "plusthree", "plusfour", "plusfive", "plussix", "plusseven", "pluseight", "plusnine", "plusten", "plussixteen", "plushundred", "plustwohundred", "plusthousand", "plustenthousand", "plustwentythousand", "medcard", "maxcard", "maxcardminusone", "zeropoint", "onepoint", "halfapoint", "onebasepoint", "maxcount", "maxdimen", "scaledpoint", "thousandpoint", "points", "halfpoint", "zeroskip", "zeromuskip", "onemuskip", "pluscxxvii", "pluscxxviii", "pluscclv", "pluscclvi", "normalpagebox", "endoflinetoken", "outputnewlinechar", "emptytoks", "empty", "undefined", "voidbox", "emptybox", "emptyvbox", "emptyhbox", "bigskipamount", "medskipamount", "smallskipamount", "fmtname", "fmtversion", "texengine", "texenginename", "texengineversion", "luatexengine", "pdftexengine", "xetexengine", "unknownengine", "activecatcode", "bgroup", "egroup", "endline", "conditionaltrue", "conditionalfalse", "attributeunsetvalue", "uprotationangle", "rightrotationangle", "downrotationangle", "leftrotationangle", "inicatcodes", "ctxcatcodes", "texcatcodes", "notcatcodes", "txtcatcodes", "vrbcatcodes", "prtcatcodes", "nilcatcodes", "luacatcodes", "tpacatcodes", "tpbcatcodes", "xmlcatcodes", "ctdcatcodes", "escapecatcode", "begingroupcatcode", "endgroupcatcode", "mathshiftcatcode", "alignmentcatcode", "endoflinecatcode", "parametercatcode", "superscriptcatcode", "subscriptcatcode", "ignorecatcode", "spacecatcode", "lettercatcode", "othercatcode", "activecatcode", "commentcatcode", "invalidcatcode", "tabasciicode", "newlineasciicode", "formfeedasciicode", "endoflineasciicode", "endoffileasciicode", "spaceasciicode", "hashasciicode", "dollarasciicode", "commentasciicode", "ampersandasciicode", "colonasciicode", "backslashasciicode", "circumflexasciicode", "underscoreasciicode", "leftbraceasciicode", "barasciicode", "rightbraceasciicode", "tildeasciicode", "delasciicode", "lessthanasciicode", "morethanasciicode", "doublecommentsignal", "atsignasciicode", "exclamationmarkasciicode", "questionmarkasciicode", "doublequoteasciicode", "singlequoteasciicode", "forwardslashasciicode", "primeasciicode", "hyphenasciicode", "activemathcharcode", "activetabtoken", "activeformfeedtoken", "activeendoflinetoken", "batchmodecode", "nonstopmodecode", "scrollmodecode", "errorstopmodecode", "bottomlevelgroupcode", "simplegroupcode", "hboxgroupcode", "adjustedhboxgroupcode", "vboxgroupcode", "vtopgroupcode", "aligngroupcode", "noaligngroupcode", "outputgroupcode", "mathgroupcode", "discretionarygroupcode", "insertgroupcode", "vcentergroupcode", "mathchoicegroupcode", "semisimplegroupcode", "mathshiftgroupcode", "mathleftgroupcode", "vadjustgroupcode", "charnodecode", "hlistnodecode", "vlistnodecode", "rulenodecode", "insertnodecode", "marknodecode", "adjustnodecode", "ligaturenodecode", "discretionarynodecode", "whatsitnodecode", "mathnodecode", "gluenodecode", "kernnodecode", "penaltynodecode", "unsetnodecode", "mathsnodecode", "charifcode", "catifcode", "numifcode", "dimifcode", "oddifcode", "vmodeifcode", "hmodeifcode", "mmodeifcode", "innerifcode", "voidifcode", "hboxifcode", "vboxifcode", "xifcode", "eofifcode", "trueifcode", "falseifcode", "caseifcode", "definedifcode", "csnameifcode", "fontcharifcode", "fontslantperpoint", "fontinterwordspace", "fontinterwordstretch", "fontinterwordshrink", "fontexheight", "fontemwidth", "fontextraspace", "slantperpoint", "interwordspace", "interwordstretch", "interwordshrink", "exheight", "emwidth", "extraspace", "mathsupdisplay", "mathsupnormal", "mathsupcramped", "mathsubnormal", "mathsubcombined", "mathaxisheight", "muquad", "startmode", "stopmode", "startnotmode", "stopnotmode", "startmodeset", "stopmodeset", "doifmode", "doifelsemode", "doifmodeelse", "doifnotmode", "startmodeset", "stopmodeset", "startallmodes", "stopallmodes", "startnotallmodes", "stopnotallmodes", "doifallmodes", "doifelseallmodes", "doifallmodeselse", "doifnotallmodes", "startenvironment", "stopenvironment", "environment", "startcomponent", "stopcomponent", "component", "startproduct", "stopproduct", "product", "startproject", "stopproject", "project", "starttext", "stoptext", "startnotext", "stopnotext", "startdocument", "stopdocument", "documentvariable", "unexpandeddocumentvariable", "setupdocument", "presetdocument", "startmodule", "stopmodule", "usemodule", "usetexmodule", "useluamodule", "setupmodule", "currentmoduleparameter", "moduleparameter", "everystarttext", "everystoptext", "startTEXpage", "stopTEXpage", "enablemode", "disablemode", "preventmode", "definemode", "globalenablemode", "globaldisablemode", "globalpreventmode", "pushmode", "popmode", "typescriptone", "typescripttwo", "typescriptthree", "mathsizesuffix", "mathordcode", "mathopcode", "mathbincode", "mathrelcode", "mathopencode", "mathclosecode", "mathpunctcode", "mathalphacode", "mathinnercode", "mathnothingcode", "mathlimopcode", "mathnolopcode", "mathboxcode", "mathchoicecode", "mathaccentcode", "mathradicalcode", "constantnumber", "constantnumberargument", "constantdimen", "constantdimenargument", "constantemptyargument", "continueifinputfile", "luastringsep", "!!bs", "!!es", "lefttorightmark", "righttoleftmark", "breakablethinspace", "nobreakspace", "nonbreakablespace", "narrownobreakspace", "zerowidthnobreakspace", "ideographicspace", "ideographichalffillspace", "twoperemspace", "threeperemspace", "fourperemspace", "fiveperemspace", "sixperemspace", "figurespace", "punctuationspace", "hairspace", "zerowidthspace", "zerowidthnonjoiner", "zerowidthjoiner", "zwnj", "zwj", "optionalspace", "asciispacechar", "Ux", "eUx", "Umathaccents", "parfillleftskip", "parfillrightskip" }, - ["helpers"]={ "startsetups", "stopsetups", "startxmlsetups", "stopxmlsetups", "startluasetups", "stopluasetups", "starttexsetups", "stoptexsetups", "startrawsetups", "stoprawsetups", "startlocalsetups", "stoplocalsetups", "starttexdefinition", "stoptexdefinition", "starttexcode", "stoptexcode", "startcontextcode", "stopcontextcode", "startcontextdefinitioncode", "stopcontextdefinitioncode", "texdefinition", "doifelsesetups", "doifsetupselse", "doifsetups", "doifnotsetups", "setup", "setups", "texsetup", "xmlsetup", "luasetup", "directsetup", "fastsetup", "doifelsecommandhandler", "doifcommandhandlerelse", "doifnotcommandhandler", "doifcommandhandler", "newmode", "setmode", "resetmode", "newsystemmode", "setsystemmode", "resetsystemmode", "pushsystemmode", "popsystemmode", "booleanmodevalue", "newcount", "newdimen", "newskip", "newmuskip", "newbox", "newtoks", "newread", "newwrite", "newmarks", "newinsert", "newattribute", "newif", "newlanguage", "newfamily", "newfam", "newhelp", "then", "begcsname", "strippedcsname", "checkedstrippedcsname", "firstargumentfalse", "firstargumenttrue", "secondargumentfalse", "secondargumenttrue", "thirdargumentfalse", "thirdargumenttrue", "fourthargumentfalse", "fourthargumenttrue", "fifthargumentfalse", "fifthsargumenttrue", "sixthargumentfalse", "sixtsargumenttrue", "doglobal", "dodoglobal", "redoglobal", "resetglobal", "donothing", "dontcomplain", "forgetall", "donetrue", "donefalse", "foundtrue", "foundfalse", "inlineordisplaymath", "indisplaymath", "forcedisplaymath", "startforceddisplaymath", "stopforceddisplaymath", "reqno", "mathortext", "htdp", "unvoidbox", "hfilll", "vfilll", "mathbox", "mathlimop", "mathnolop", "mathnothing", "mathalpha", "currentcatcodetable", "defaultcatcodetable", "catcodetablename", "newcatcodetable", "startcatcodetable", "stopcatcodetable", "startextendcatcodetable", "stopextendcatcodetable", "pushcatcodetable", "popcatcodetable", "restorecatcodes", "setcatcodetable", "letcatcodecommand", "defcatcodecommand", "uedcatcodecommand", "hglue", "vglue", "hfillneg", "vfillneg", "hfilllneg", "vfilllneg", "ruledhss", "ruledhfil", "ruledhfill", "ruledhfilneg", "ruledhfillneg", "normalhfillneg", "ruledvss", "ruledvfil", "ruledvfill", "ruledvfilneg", "ruledvfillneg", "normalvfillneg", "ruledhbox", "ruledvbox", "ruledvtop", "ruledvcenter", "ruledmbox", "ruledhpack", "ruledvpack", "ruledtpack", "ruledhskip", "ruledvskip", "ruledkern", "ruledmskip", "ruledmkern", "ruledhglue", "ruledvglue", "normalhglue", "normalvglue", "ruledpenalty", "filledhboxb", "filledhboxr", "filledhboxg", "filledhboxc", "filledhboxm", "filledhboxy", "filledhboxk", "scratchcounter", "globalscratchcounter", "privatescratchcounter", "scratchdimen", "globalscratchdimen", "privatescratchdimen", "scratchskip", "globalscratchskip", "privatescratchskip", "scratchmuskip", "globalscratchmuskip", "privatescratchmuskip", "scratchtoks", "globalscratchtoks", "privatescratchtoks", "scratchbox", "globalscratchbox", "privatescratchbox", "normalbaselineskip", "normallineskip", "normallineskiplimit", "availablehsize", "localhsize", "setlocalhsize", "distributedhsize", "hsizefraction", "nextbox", "dowithnextbox", "dowithnextboxcs", "dowithnextboxcontent", "dowithnextboxcontentcs", "flushnextbox", "scratchwidth", "scratchheight", "scratchdepth", "scratchoffset", "scratchdistance", "scratchhsize", "scratchvsize", "scratchxoffset", "scratchyoffset", "scratchhoffset", "scratchvoffset", "scratchxposition", "scratchyposition", "scratchtopoffset", "scratchbottomoffset", "scratchleftoffset", "scratchrightoffset", "scratchcounterone", "scratchcountertwo", "scratchcounterthree", "scratchcounterfour", "scratchcounterfive", "scratchcountersix", "scratchdimenone", "scratchdimentwo", "scratchdimenthree", "scratchdimenfour", "scratchdimenfive", "scratchdimensix", "scratchskipone", "scratchskiptwo", "scratchskipthree", "scratchskipfour", "scratchskipfive", "scratchskipsix", "scratchmuskipone", "scratchmuskiptwo", "scratchmuskipthree", "scratchmuskipfour", "scratchmuskipfive", "scratchmuskipsix", "scratchtoksone", "scratchtokstwo", "scratchtoksthree", "scratchtoksfour", "scratchtoksfive", "scratchtokssix", "scratchboxone", "scratchboxtwo", "scratchboxthree", "scratchboxfour", "scratchboxfive", "scratchboxsix", "scratchnx", "scratchny", "scratchmx", "scratchmy", "scratchunicode", "scratchmin", "scratchmax", "scratchleftskip", "scratchrightskip", "scratchtopskip", "scratchbottomskip", "doif", "doifnot", "doifelse", "doifinset", "doifnotinset", "doifelseinset", "doifinsetelse", "doifelsenextchar", "doifnextcharelse", "doifelsenextoptional", "doifnextoptionalelse", "doifelsenextoptionalcs", "doifnextoptionalcselse", "doifelsefastoptionalcheck", "doiffastoptionalcheckelse", "doifelsenextbgroup", "doifnextbgroupelse", "doifelsenextbgroupcs", "doifnextbgroupcselse", "doifelsenextparenthesis", "doifnextparenthesiselse", "doifelseundefined", "doifundefinedelse", "doifelsedefined", "doifdefinedelse", "doifundefined", "doifdefined", "doifelsevalue", "doifvalue", "doifnotvalue", "doifnothing", "doifsomething", "doifelsenothing", "doifnothingelse", "doifelsesomething", "doifsomethingelse", "doifvaluenothing", "doifvaluesomething", "doifelsevaluenothing", "doifvaluenothingelse", "doifelsedimension", "doifdimensionelse", "doifelsenumber", "doifnumberelse", "doifnumber", "doifnotnumber", "doifelsecommon", "doifcommonelse", "doifcommon", "doifnotcommon", "doifinstring", "doifnotinstring", "doifelseinstring", "doifinstringelse", "doifelseassignment", "doifassignmentelse", "docheckassignment", "tracingall", "tracingnone", "loggingall", "removetoks", "appendtoks", "prependtoks", "appendtotoks", "prependtotoks", "to", "endgraf", "endpar", "everyendpar", "reseteverypar", "finishpar", "empty", "null", "space", "quad", "enspace", "emspace", "charspace", "nbsp", "crlf", "obeyspaces", "obeylines", "obeyedspace", "obeyedline", "obeyedtab", "obeyedpage", "normalspace", "executeifdefined", "singleexpandafter", "doubleexpandafter", "tripleexpandafter", "dontleavehmode", "removelastspace", "removeunwantedspaces", "keepunwantedspaces", "removepunctuation", "wait", "writestatus", "define", "defineexpandable", "redefine", "setmeasure", "setemeasure", "setgmeasure", "setxmeasure", "definemeasure", "freezemeasure", "measure", "measured", "installcorenamespace", "getvalue", "getuvalue", "setvalue", "setevalue", "setgvalue", "setxvalue", "letvalue", "letgvalue", "resetvalue", "undefinevalue", "ignorevalue", "setuvalue", "setuevalue", "setugvalue", "setuxvalue", "globallet", "glet", "udef", "ugdef", "uedef", "uxdef", "checked", "unique", "getparameters", "geteparameters", "getgparameters", "getxparameters", "forgetparameters", "copyparameters", "getdummyparameters", "dummyparameter", "directdummyparameter", "setdummyparameter", "letdummyparameter", "usedummystyleandcolor", "usedummystyleparameter", "usedummycolorparameter", "processcommalist", "processcommacommand", "quitcommalist", "quitprevcommalist", "processaction", "processallactions", "processfirstactioninset", "processallactionsinset", "unexpanded", "expanded", "startexpanded", "stopexpanded", "protected", "protect", "unprotect", "firstofoneargument", "firstoftwoarguments", "secondoftwoarguments", "firstofthreearguments", "secondofthreearguments", "thirdofthreearguments", "firstoffourarguments", "secondoffourarguments", "thirdoffourarguments", "fourthoffourarguments", "firstoffivearguments", "secondoffivearguments", "thirdoffivearguments", "fourthoffivearguments", "fifthoffivearguments", "firstofsixarguments", "secondofsixarguments", "thirdofsixarguments", "fourthofsixarguments", "fifthofsixarguments", "sixthofsixarguments", "firstofoneunexpanded", "firstoftwounexpanded", "secondoftwounexpanded", "firstofthreeunexpanded", "secondofthreeunexpanded", "thirdofthreeunexpanded", "gobbleoneargument", "gobbletwoarguments", "gobblethreearguments", "gobblefourarguments", "gobblefivearguments", "gobblesixarguments", "gobblesevenarguments", "gobbleeightarguments", "gobbleninearguments", "gobbletenarguments", "gobbleoneoptional", "gobbletwooptionals", "gobblethreeoptionals", "gobblefouroptionals", "gobblefiveoptionals", "dorecurse", "doloop", "exitloop", "dostepwiserecurse", "recurselevel", "recursedepth", "dofastloopcs", "dowith", "newconstant", "setnewconstant", "setconstant", "setconstantvalue", "newconditional", "settrue", "setfalse", "settruevalue", "setfalsevalue", "newmacro", "setnewmacro", "newfraction", "newsignal", "dosingleempty", "dodoubleempty", "dotripleempty", "doquadrupleempty", "doquintupleempty", "dosixtupleempty", "doseventupleempty", "dosingleargument", "dodoubleargument", "dotripleargument", "doquadrupleargument", "doquintupleargument", "dosixtupleargument", "doseventupleargument", "dosinglegroupempty", "dodoublegroupempty", "dotriplegroupempty", "doquadruplegroupempty", "doquintuplegroupempty", "permitspacesbetweengroups", "dontpermitspacesbetweengroups", "nopdfcompression", "maximumpdfcompression", "normalpdfcompression", "modulonumber", "dividenumber", "getfirstcharacter", "doifelsefirstchar", "doiffirstcharelse", "startnointerference", "stopnointerference", "twodigits", "threedigits", "leftorright", "offinterlineskip", "oninterlineskip", "nointerlineskip", "strut", "halfstrut", "quarterstrut", "depthstrut", "setstrut", "strutbox", "strutht", "strutdp", "strutwd", "struthtdp", "begstrut", "endstrut", "lineheight", "leftboundary", "rightboundary", "signalcharacter", "ordordspacing", "ordopspacing", "ordbinspacing", "ordrelspacing", "ordopenspacing", "ordclosespacing", "ordpunctspacing", "ordinnerspacing", "opordspacing", "opopspacing", "opbinspacing", "oprelspacing", "opopenspacing", "opclosespacing", "oppunctspacing", "opinnerspacing", "binordspacing", "binopspacing", "binbinspacing", "binrelspacing", "binopenspacing", "binclosespacing", "binpunctspacing", "bininnerspacing", "relordspacing", "relopspacing", "relbinspacing", "relrelspacing", "relopenspacing", "relclosespacing", "relpunctspacing", "relinnerspacing", "openordspacing", "openopspacing", "openbinspacing", "openrelspacing", "openopenspacing", "openclosespacing", "openpunctspacing", "openinnerspacing", "closeordspacing", "closeopspacing", "closebinspacing", "closerelspacing", "closeopenspacing", "closeclosespacing", "closepunctspacing", "closeinnerspacing", "punctordspacing", "punctopspacing", "punctbinspacing", "punctrelspacing", "punctopenspacing", "punctclosespacing", "punctpunctspacing", "punctinnerspacing", "innerordspacing", "inneropspacing", "innerbinspacing", "innerrelspacing", "inneropenspacing", "innerclosespacing", "innerpunctspacing", "innerinnerspacing", "normalreqno", "startimath", "stopimath", "normalstartimath", "normalstopimath", "startdmath", "stopdmath", "normalstartdmath", "normalstopdmath", "normalsuperscript", "normalsubscript", "uncramped", "cramped", "triggermathstyle", "mathstylefont", "mathsmallstylefont", "mathstyleface", "mathsmallstyleface", "mathstylecommand", "mathpalette", "mathstylehbox", "mathstylevbox", "mathstylevcenter", "mathstylevcenteredhbox", "mathstylevcenteredvbox", "mathtext", "setmathsmalltextbox", "setmathtextbox", "pushmathstyle", "popmathstyle", "triggerdisplaystyle", "triggertextstyle", "triggerscriptstyle", "triggerscriptscriptstyle", "triggeruncrampedstyle", "triggercrampedstyle", "triggersmallstyle", "triggeruncrampedsmallstyle", "triggercrampedsmallstyle", "triggerbigstyle", "triggeruncrampedbigstyle", "triggercrampedbigstyle", "luaexpr", "expelsedoif", "expdoif", "expdoifnot", "expdoifelsecommon", "expdoifcommonelse", "expdoifelseinset", "expdoifinsetelse", "ctxdirectlua", "ctxlatelua", "ctxsprint", "ctxwrite", "ctxcommand", "ctxdirectcommand", "ctxlatecommand", "ctxreport", "ctxlua", "luacode", "lateluacode", "directluacode", "registerctxluafile", "ctxloadluafile", "luaversion", "luamajorversion", "luaminorversion", "ctxluacode", "luaconditional", "luaexpanded", "startluaparameterset", "stopluaparameterset", "luaparameterset", "definenamedlua", "obeylualines", "obeyluatokens", "startluacode", "stopluacode", "startlua", "stoplua", "startctxfunction", "stopctxfunction", "ctxfunction", "startctxfunctiondefinition", "stopctxfunctiondefinition", "installctxfunction", "cldprocessfile", "cldloadfile", "cldcontext", "cldcommand", "carryoverpar", "lastlinewidth", "assumelongusagecs", "Umathbotaccent", "righttolefthbox", "lefttorighthbox", "righttoleftvbox", "lefttorightvbox", "righttoleftvtop", "lefttorightvtop", "rtlhbox", "ltrhbox", "rtlvbox", "ltrvbox", "rtlvtop", "ltrvtop", "autodirhbox", "autodirvbox", "autodirvtop", "leftorrighthbox", "leftorrightvbox", "leftorrightvtop", "lefttoright", "righttoleft", "synchronizelayoutdirection", "synchronizedisplaydirection", "synchronizeinlinedirection", "lesshyphens", "morehyphens", "nohyphens", "dohyphens", "Ucheckedstartdisplaymath", "Ucheckedstopdisplaymath", "break", "nobreak", "allowbreak", "goodbreak", "nospace", "nospacing", "dospacing", "naturalhbox", "naturalvbox", "naturalhpack", "naturalvpack", "frule", "compoundhyphenpenalty" }, + ["constants"]={ "zerocount", "minusone", "minustwo", "plusone", "plustwo", "plusthree", "plusfour", "plusfive", "plussix", "plusseven", "pluseight", "plusnine", "plusten", "plussixteen", "plushundred", "plustwohundred", "plusthousand", "plustenthousand", "plustwentythousand", "medcard", "maxcard", "maxcardminusone", "zeropoint", "onepoint", "halfapoint", "onebasepoint", "maxcount", "maxdimen", "scaledpoint", "thousandpoint", "points", "halfpoint", "zeroskip", "zeromuskip", "onemuskip", "pluscxxvii", "pluscxxviii", "pluscclv", "pluscclvi", "normalpagebox", "endoflinetoken", "outputnewlinechar", "emptytoks", "empty", "undefined", "voidbox", "emptybox", "emptyvbox", "emptyhbox", "bigskipamount", "medskipamount", "smallskipamount", "fmtname", "fmtversion", "texengine", "texenginename", "texengineversion", "texenginefunctionality", "luatexengine", "pdftexengine", "xetexengine", "unknownengine", "activecatcode", "bgroup", "egroup", "endline", "conditionaltrue", "conditionalfalse", "attributeunsetvalue", "uprotationangle", "rightrotationangle", "downrotationangle", "leftrotationangle", "inicatcodes", "ctxcatcodes", "texcatcodes", "notcatcodes", "txtcatcodes", "vrbcatcodes", "prtcatcodes", "nilcatcodes", "luacatcodes", "tpacatcodes", "tpbcatcodes", "xmlcatcodes", "ctdcatcodes", "escapecatcode", "begingroupcatcode", "endgroupcatcode", "mathshiftcatcode", "alignmentcatcode", "endoflinecatcode", "parametercatcode", "superscriptcatcode", "subscriptcatcode", "ignorecatcode", "spacecatcode", "lettercatcode", "othercatcode", "activecatcode", "commentcatcode", "invalidcatcode", "tabasciicode", "newlineasciicode", "formfeedasciicode", "endoflineasciicode", "endoffileasciicode", "spaceasciicode", "hashasciicode", "dollarasciicode", "commentasciicode", "ampersandasciicode", "colonasciicode", "backslashasciicode", "circumflexasciicode", "underscoreasciicode", "leftbraceasciicode", "barasciicode", "rightbraceasciicode", "tildeasciicode", "delasciicode", "lessthanasciicode", "morethanasciicode", "doublecommentsignal", "atsignasciicode", "exclamationmarkasciicode", "questionmarkasciicode", "doublequoteasciicode", "singlequoteasciicode", "forwardslashasciicode", "primeasciicode", "hyphenasciicode", "activemathcharcode", "activetabtoken", "activeformfeedtoken", "activeendoflinetoken", "batchmodecode", "nonstopmodecode", "scrollmodecode", "errorstopmodecode", "bottomlevelgroupcode", "simplegroupcode", "hboxgroupcode", "adjustedhboxgroupcode", "vboxgroupcode", "vtopgroupcode", "aligngroupcode", "noaligngroupcode", "outputgroupcode", "mathgroupcode", "discretionarygroupcode", "insertgroupcode", "vcentergroupcode", "mathchoicegroupcode", "semisimplegroupcode", "mathshiftgroupcode", "mathleftgroupcode", "vadjustgroupcode", "charnodecode", "hlistnodecode", "vlistnodecode", "rulenodecode", "insertnodecode", "marknodecode", "adjustnodecode", "ligaturenodecode", "discretionarynodecode", "whatsitnodecode", "mathnodecode", "gluenodecode", "kernnodecode", "penaltynodecode", "unsetnodecode", "mathsnodecode", "charifcode", "catifcode", "numifcode", "dimifcode", "oddifcode", "vmodeifcode", "hmodeifcode", "mmodeifcode", "innerifcode", "voidifcode", "hboxifcode", "vboxifcode", "xifcode", "eofifcode", "trueifcode", "falseifcode", "caseifcode", "definedifcode", "csnameifcode", "fontcharifcode", "fontslantperpoint", "fontinterwordspace", "fontinterwordstretch", "fontinterwordshrink", "fontexheight", "fontemwidth", "fontextraspace", "slantperpoint", "mathexheight", "mathemwidth", "interwordspace", "interwordstretch", "interwordshrink", "exheight", "emwidth", "extraspace", "mathsupdisplay", "mathsupnormal", "mathsupcramped", "mathsubnormal", "mathsubcombined", "mathaxisheight", "muquad", "startmode", "stopmode", "startnotmode", "stopnotmode", "startmodeset", "stopmodeset", "doifmode", "doifelsemode", "doifmodeelse", "doifnotmode", "startmodeset", "stopmodeset", "startallmodes", "stopallmodes", "startnotallmodes", "stopnotallmodes", "doifallmodes", "doifelseallmodes", "doifallmodeselse", "doifnotallmodes", "startenvironment", "stopenvironment", "environment", "startcomponent", "stopcomponent", "component", "startproduct", "stopproduct", "product", "startproject", "stopproject", "project", "starttext", "stoptext", "startnotext", "stopnotext", "startdocument", "stopdocument", "documentvariable", "unexpandeddocumentvariable", "setupdocument", "presetdocument", "startmodule", "stopmodule", "usemodule", "usetexmodule", "useluamodule", "setupmodule", "currentmoduleparameter", "moduleparameter", "everystarttext", "everystoptext", "startTEXpage", "stopTEXpage", "enablemode", "disablemode", "preventmode", "definemode", "globalenablemode", "globaldisablemode", "globalpreventmode", "pushmode", "popmode", "typescriptone", "typescripttwo", "typescriptthree", "mathsizesuffix", "mathordcode", "mathopcode", "mathbincode", "mathrelcode", "mathopencode", "mathclosecode", "mathpunctcode", "mathalphacode", "mathinnercode", "mathnothingcode", "mathlimopcode", "mathnolopcode", "mathboxcode", "mathchoicecode", "mathaccentcode", "mathradicalcode", "constantnumber", "constantnumberargument", "constantdimen", "constantdimenargument", "constantemptyargument", "continueifinputfile", "luastringsep", "!!bs", "!!es", "lefttorightmark", "righttoleftmark", "lrm", "rlm", "bidilre", "bidirle", "bidipop", "bidilro", "bidirlo", "breakablethinspace", "nobreakspace", "nonbreakablespace", "narrownobreakspace", "zerowidthnobreakspace", "ideographicspace", "ideographichalffillspace", "twoperemspace", "threeperemspace", "fourperemspace", "fiveperemspace", "sixperemspace", "figurespace", "punctuationspace", "hairspace", "enquad", "emquad", "zerowidthspace", "zerowidthnonjoiner", "zerowidthjoiner", "zwnj", "zwj", "optionalspace", "asciispacechar", "softhyphen", "Ux", "eUx", "Umathaccents", "parfillleftskip", "parfillrightskip" }, + ["helpers"]={ "startsetups", "stopsetups", "startxmlsetups", "stopxmlsetups", "startluasetups", "stopluasetups", "starttexsetups", "stoptexsetups", "startrawsetups", "stoprawsetups", "startlocalsetups", "stoplocalsetups", "starttexdefinition", "stoptexdefinition", "starttexcode", "stoptexcode", "startcontextcode", "stopcontextcode", "startcontextdefinitioncode", "stopcontextdefinitioncode", "texdefinition", "doifelsesetups", "doifsetupselse", "doifsetups", "doifnotsetups", "setup", "setups", "texsetup", "xmlsetup", "luasetup", "directsetup", "fastsetup", "doifelsecommandhandler", "doifcommandhandlerelse", "doifnotcommandhandler", "doifcommandhandler", "newmode", "setmode", "resetmode", "newsystemmode", "setsystemmode", "resetsystemmode", "pushsystemmode", "popsystemmode", "booleanmodevalue", "newcount", "newdimen", "newskip", "newmuskip", "newbox", "newtoks", "newread", "newwrite", "newmarks", "newinsert", "newattribute", "newif", "newlanguage", "newfamily", "newfam", "newhelp", "then", "begcsname", "strippedcsname", "checkedstrippedcsname", "firstargumentfalse", "firstargumenttrue", "secondargumentfalse", "secondargumenttrue", "thirdargumentfalse", "thirdargumenttrue", "fourthargumentfalse", "fourthargumenttrue", "fifthargumentfalse", "fifthsargumenttrue", "sixthargumentfalse", "sixtsargumenttrue", "doglobal", "dodoglobal", "redoglobal", "resetglobal", "donothing", "dontcomplain", "forgetall", "donetrue", "donefalse", "foundtrue", "foundfalse", "inlineordisplaymath", "indisplaymath", "forcedisplaymath", "startforceddisplaymath", "stopforceddisplaymath", "startpickupmath", "stoppickupmath", "reqno", "mathortext", "htdp", "unvoidbox", "hfilll", "vfilll", "mathbox", "mathlimop", "mathnolop", "mathnothing", "mathalpha", "currentcatcodetable", "defaultcatcodetable", "catcodetablename", "newcatcodetable", "startcatcodetable", "stopcatcodetable", "startextendcatcodetable", "stopextendcatcodetable", "pushcatcodetable", "popcatcodetable", "restorecatcodes", "setcatcodetable", "letcatcodecommand", "defcatcodecommand", "uedcatcodecommand", "hglue", "vglue", "hfillneg", "vfillneg", "hfilllneg", "vfilllneg", "ruledhss", "ruledhfil", "ruledhfill", "ruledhfilneg", "ruledhfillneg", "normalhfillneg", "ruledvss", "ruledvfil", "ruledvfill", "ruledvfilneg", "ruledvfillneg", "normalvfillneg", "ruledhbox", "ruledvbox", "ruledvtop", "ruledvcenter", "ruledmbox", "ruledhpack", "ruledvpack", "ruledtpack", "ruledhskip", "ruledvskip", "ruledkern", "ruledmskip", "ruledmkern", "ruledhglue", "ruledvglue", "normalhglue", "normalvglue", "ruledpenalty", "filledhboxb", "filledhboxr", "filledhboxg", "filledhboxc", "filledhboxm", "filledhboxy", "filledhboxk", "scratchcounter", "globalscratchcounter", "privatescratchcounter", "scratchdimen", "globalscratchdimen", "privatescratchdimen", "scratchskip", "globalscratchskip", "privatescratchskip", "scratchmuskip", "globalscratchmuskip", "privatescratchmuskip", "scratchtoks", "globalscratchtoks", "privatescratchtoks", "scratchbox", "globalscratchbox", "privatescratchbox", "normalbaselineskip", "normallineskip", "normallineskiplimit", "availablehsize", "localhsize", "setlocalhsize", "distributedhsize", "hsizefraction", "nextbox", "dowithnextbox", "dowithnextboxcs", "dowithnextboxcontent", "dowithnextboxcontentcs", "flushnextbox", "scratchwidth", "scratchheight", "scratchdepth", "scratchoffset", "scratchdistance", "scratchhsize", "scratchvsize", "scratchxoffset", "scratchyoffset", "scratchhoffset", "scratchvoffset", "scratchxposition", "scratchyposition", "scratchtopoffset", "scratchbottomoffset", "scratchleftoffset", "scratchrightoffset", "scratchcounterone", "scratchcountertwo", "scratchcounterthree", "scratchcounterfour", "scratchcounterfive", "scratchcountersix", "scratchdimenone", "scratchdimentwo", "scratchdimenthree", "scratchdimenfour", "scratchdimenfive", "scratchdimensix", "scratchskipone", "scratchskiptwo", "scratchskipthree", "scratchskipfour", "scratchskipfive", "scratchskipsix", "scratchmuskipone", "scratchmuskiptwo", "scratchmuskipthree", "scratchmuskipfour", "scratchmuskipfive", "scratchmuskipsix", "scratchtoksone", "scratchtokstwo", "scratchtoksthree", "scratchtoksfour", "scratchtoksfive", "scratchtokssix", "scratchboxone", "scratchboxtwo", "scratchboxthree", "scratchboxfour", "scratchboxfive", "scratchboxsix", "scratchnx", "scratchny", "scratchmx", "scratchmy", "scratchunicode", "scratchmin", "scratchmax", "scratchleftskip", "scratchrightskip", "scratchtopskip", "scratchbottomskip", "doif", "doifnot", "doifelse", "doifinset", "doifnotinset", "doifelseinset", "doifinsetelse", "doifelsenextchar", "doifnextcharelse", "doifelsenextoptional", "doifnextoptionalelse", "doifelsenextoptionalcs", "doifnextoptionalcselse", "doifelsefastoptionalcheck", "doiffastoptionalcheckelse", "doifelsefastoptionalcheckcs", "doiffastoptionalcheckcselse", "doifelsenextbgroup", "doifnextbgroupelse", "doifelsenextbgroupcs", "doifnextbgroupcselse", "doifelsenextparenthesis", "doifnextparenthesiselse", "doifelseundefined", "doifundefinedelse", "doifelsedefined", "doifdefinedelse", "doifundefined", "doifdefined", "doifelsevalue", "doifvalue", "doifnotvalue", "doifnothing", "doifsomething", "doifelsenothing", "doifnothingelse", "doifelsesomething", "doifsomethingelse", "doifvaluenothing", "doifvaluesomething", "doifelsevaluenothing", "doifvaluenothingelse", "doifelsedimension", "doifdimensionelse", "doifelsenumber", "doifnumberelse", "doifnumber", "doifnotnumber", "doifelsecommon", "doifcommonelse", "doifcommon", "doifnotcommon", "doifinstring", "doifnotinstring", "doifelseinstring", "doifinstringelse", "doifelseassignment", "doifassignmentelse", "docheckassignment", "doiftext", "doifelsetext", "doiftextelse", "doifnottext", "tracingall", "tracingnone", "loggingall", "removetoks", "appendtoks", "prependtoks", "appendtotoks", "prependtotoks", "to", "endgraf", "endpar", "everyendpar", "reseteverypar", "finishpar", "empty", "null", "space", "quad", "enspace", "emspace", "charspace", "nbsp", "crlf", "obeyspaces", "obeylines", "obeyedspace", "obeyedline", "obeyedtab", "obeyedpage", "normalspace", "executeifdefined", "singleexpandafter", "doubleexpandafter", "tripleexpandafter", "dontleavehmode", "removelastspace", "removeunwantedspaces", "keepunwantedspaces", "removepunctuation", "ignoreparskip", "forcestrutdepth", "wait", "writestatus", "define", "defineexpandable", "redefine", "setmeasure", "setemeasure", "setgmeasure", "setxmeasure", "definemeasure", "freezemeasure", "measure", "measured", "installcorenamespace", "getvalue", "getuvalue", "setvalue", "setevalue", "setgvalue", "setxvalue", "letvalue", "letgvalue", "resetvalue", "undefinevalue", "ignorevalue", "setuvalue", "setuevalue", "setugvalue", "setuxvalue", "globallet", "glet", "udef", "ugdef", "uedef", "uxdef", "checked", "unique", "getparameters", "geteparameters", "getgparameters", "getxparameters", "forgetparameters", "copyparameters", "getdummyparameters", "dummyparameter", "directdummyparameter", "setdummyparameter", "letdummyparameter", "usedummystyleandcolor", "usedummystyleparameter", "usedummycolorparameter", "processcommalist", "processcommacommand", "quitcommalist", "quitprevcommalist", "processaction", "processallactions", "processfirstactioninset", "processallactionsinset", "unexpanded", "expanded", "startexpanded", "stopexpanded", "protected", "protect", "unprotect", "firstofoneargument", "firstoftwoarguments", "secondoftwoarguments", "firstofthreearguments", "secondofthreearguments", "thirdofthreearguments", "firstoffourarguments", "secondoffourarguments", "thirdoffourarguments", "fourthoffourarguments", "firstoffivearguments", "secondoffivearguments", "thirdoffivearguments", "fourthoffivearguments", "fifthoffivearguments", "firstofsixarguments", "secondofsixarguments", "thirdofsixarguments", "fourthofsixarguments", "fifthofsixarguments", "sixthofsixarguments", "firstofoneunexpanded", "firstoftwounexpanded", "secondoftwounexpanded", "firstofthreeunexpanded", "secondofthreeunexpanded", "thirdofthreeunexpanded", "gobbleoneargument", "gobbletwoarguments", "gobblethreearguments", "gobblefourarguments", "gobblefivearguments", "gobblesixarguments", "gobblesevenarguments", "gobbleeightarguments", "gobbleninearguments", "gobbletenarguments", "gobbleoneoptional", "gobbletwooptionals", "gobblethreeoptionals", "gobblefouroptionals", "gobblefiveoptionals", "dorecurse", "doloop", "exitloop", "dostepwiserecurse", "recurselevel", "recursedepth", "dofastloopcs", "fastloopindex", "fastloopfinal", "dowith", "newconstant", "setnewconstant", "setconstant", "setconstantvalue", "newconditional", "settrue", "setfalse", "settruevalue", "setfalsevalue", "newmacro", "setnewmacro", "newfraction", "newsignal", "dosingleempty", "dodoubleempty", "dotripleempty", "doquadrupleempty", "doquintupleempty", "dosixtupleempty", "doseventupleempty", "dosingleargument", "dodoubleargument", "dotripleargument", "doquadrupleargument", "doquintupleargument", "dosixtupleargument", "doseventupleargument", "dosinglegroupempty", "dodoublegroupempty", "dotriplegroupempty", "doquadruplegroupempty", "doquintuplegroupempty", "permitspacesbetweengroups", "dontpermitspacesbetweengroups", "nopdfcompression", "maximumpdfcompression", "normalpdfcompression", "modulonumber", "dividenumber", "getfirstcharacter", "doifelsefirstchar", "doiffirstcharelse", "startnointerference", "stopnointerference", "twodigits", "threedigits", "leftorright", "offinterlineskip", "oninterlineskip", "nointerlineskip", "strut", "halfstrut", "quarterstrut", "depthstrut", "halflinestrut", "noheightstrut", "setstrut", "strutbox", "strutht", "strutdp", "strutwd", "struthtdp", "strutgap", "begstrut", "endstrut", "lineheight", "leftboundary", "rightboundary", "signalcharacter", "ordordspacing", "ordopspacing", "ordbinspacing", "ordrelspacing", "ordopenspacing", "ordclosespacing", "ordpunctspacing", "ordinnerspacing", "opordspacing", "opopspacing", "opbinspacing", "oprelspacing", "opopenspacing", "opclosespacing", "oppunctspacing", "opinnerspacing", "binordspacing", "binopspacing", "binbinspacing", "binrelspacing", "binopenspacing", "binclosespacing", "binpunctspacing", "bininnerspacing", "relordspacing", "relopspacing", "relbinspacing", "relrelspacing", "relopenspacing", "relclosespacing", "relpunctspacing", "relinnerspacing", "openordspacing", "openopspacing", "openbinspacing", "openrelspacing", "openopenspacing", "openclosespacing", "openpunctspacing", "openinnerspacing", "closeordspacing", "closeopspacing", "closebinspacing", "closerelspacing", "closeopenspacing", "closeclosespacing", "closepunctspacing", "closeinnerspacing", "punctordspacing", "punctopspacing", "punctbinspacing", "punctrelspacing", "punctopenspacing", "punctclosespacing", "punctpunctspacing", "punctinnerspacing", "innerordspacing", "inneropspacing", "innerbinspacing", "innerrelspacing", "inneropenspacing", "innerclosespacing", "innerpunctspacing", "innerinnerspacing", "normalreqno", "startimath", "stopimath", "normalstartimath", "normalstopimath", "startdmath", "stopdmath", "normalstartdmath", "normalstopdmath", "normalsuperscript", "normalsubscript", "normalnosuperscript", "normalnosubscript", "superscript", "subscript", "nosuperscript", "nosubscript", "uncramped", "cramped", "triggermathstyle", "mathstylefont", "mathsmallstylefont", "mathstyleface", "mathsmallstyleface", "mathstylecommand", "mathpalette", "mathstylehbox", "mathstylevbox", "mathstylevcenter", "mathstylevcenteredhbox", "mathstylevcenteredvbox", "mathtext", "setmathsmalltextbox", "setmathtextbox", "pushmathstyle", "popmathstyle", "triggerdisplaystyle", "triggertextstyle", "triggerscriptstyle", "triggerscriptscriptstyle", "triggeruncrampedstyle", "triggercrampedstyle", "triggersmallstyle", "triggeruncrampedsmallstyle", "triggercrampedsmallstyle", "triggerbigstyle", "triggeruncrampedbigstyle", "triggercrampedbigstyle", "luaexpr", "expelsedoif", "expdoif", "expdoifnot", "expdoifelsecommon", "expdoifcommonelse", "expdoifelseinset", "expdoifinsetelse", "ctxdirectlua", "ctxlatelua", "ctxsprint", "ctxwrite", "ctxcommand", "ctxdirectcommand", "ctxlatecommand", "ctxreport", "ctxlua", "luacode", "lateluacode", "directluacode", "registerctxluafile", "ctxloadluafile", "luaversion", "luamajorversion", "luaminorversion", "ctxluacode", "luaconditional", "luaexpanded", "startluaparameterset", "stopluaparameterset", "luaparameterset", "definenamedlua", "obeylualines", "obeyluatokens", "startluacode", "stopluacode", "startlua", "stoplua", "startctxfunction", "stopctxfunction", "ctxfunction", "startctxfunctiondefinition", "stopctxfunctiondefinition", "installctxfunction", "cldprocessfile", "cldloadfile", "cldcontext", "cldcommand", "carryoverpar", "lastlinewidth", "assumelongusagecs", "Umathbotaccent", "righttolefthbox", "lefttorighthbox", "righttoleftvbox", "lefttorightvbox", "righttoleftvtop", "lefttorightvtop", "rtlhbox", "ltrhbox", "rtlvbox", "ltrvbox", "rtlvtop", "ltrvtop", "autodirhbox", "autodirvbox", "autodirvtop", "leftorrighthbox", "leftorrightvbox", "leftorrightvtop", "lefttoright", "righttoleft", "checkedlefttoright", "checkedrighttoleft", "synchronizelayoutdirection", "synchronizedisplaydirection", "synchronizeinlinedirection", "dirlre", "dirrle", "dirlro", "dirrlo", "lesshyphens", "morehyphens", "nohyphens", "dohyphens", "Ucheckedstartdisplaymath", "Ucheckedstopdisplaymath", "break", "nobreak", "allowbreak", "goodbreak", "nospace", "nospacing", "dospacing", "naturalhbox", "naturalvbox", "naturalvtop", "naturalhpack", "naturalvpack", "frule", "compoundhyphenpenalty", "start", "stop" }, }
\ No newline at end of file diff --git a/context/data/scite/context/lexers/data/scite-context-data-interfaces.lua b/context/data/scite/context/lexers/data/scite-context-data-interfaces.lua index 5f4b667e2..943d6bcc1 100644 --- a/context/data/scite/context/lexers/data/scite-context-data-interfaces.lua +++ b/context/data/scite/context/lexers/data/scite-context-data-interfaces.lua @@ -1,10 +1,11 @@ return { - ["cs"]={ "AMSTEX", "AfterPar", "Alphabeticnumerals", "AmSTeX", "And", "BeforePar", "Big", "Bigg", "Biggl", "Biggm", "Biggr", "Bigl", "Bigm", "Bigr", "CONTEXT", "Caps", "Cisla", "ConTeXt", "Context", "ConvertConstantAfter", "ConvertToConstant", "ETEX", "EveryLine", "EveryPar", "GetPar", "GotoPar", "Greeknumerals", "INRSTEX", "Kap", "LAMSTEX", "LATEX", "LUAJITTEX", "LUATEX", "LaTeX", "LamSTeX", "Lua", "LuaTeX", "LuajitTeX", "MESIC", "METAFONT", "METAFUN", "METAPOST", "MKII", "MKIV", "MKIX", "MKVI", "MKXI", "MONTHLONG", "MONTHSHORT", "MPII", "MPIV", "MPVI", "MPanchor", "MPbetex", "MPc", "MPcode", "MPcolor", "MPcoloronly", "MPcolumn", "MPd", "MPdrawing", "MPfontsizehskip", "MPgetmultipars", "MPgetmultishape", "MPgetposboxes", "MPh", "MPinclusions", "MPleftskip", "MPll", "MPlr", "MPls", "MPmenubuttons", "MPn", "MPoptions", "MPoverlayanchor", "MPp", "MPpage", "MPpardata", "MPplus", "MPpos", "MPpositiongraphic", "MPposset", "MPr", "MPrawvar", "MPregion", "MPrest", "MPrightskip", "MPrs", "MPstring", "MPtext", "MPtransparency", "MPul", "MPur", "MPv", "MPvar", "MPvariable", "MPvv", "MPw", "MPwhd", "MPx", "MPxy", "MPxywhd", "MPy", "MetaFont", "MetaFun", "MetaPost", "NormalizeFontHeight", "NormalizeFontWidth", "NormalizeTextHeight", "NormalizeTextWidth", "PDFETEX", "PDFTEX", "PDFcolor", "PICTEX", "PPCHTEX", "PPCHTeX", "PRAGMA", "PiCTeX", "PointsToBigPoints", "PointsToReal", "PointsToWholeBigPoints", "PtToCm", "ReadFile", "Rimskecislice", "SLOVA", "SLOVO", "ScaledPointsToBigPoints", "ScaledPointsToWholeBigPoints", "Slova", "Slovo", "Smallcapped", "TABLE", "TEX", "TEXpage", "TaBlE", "TeX", "TheNormalizedFontSize", "TransparencyHack", "VSEDNIDEN", "VerboseNumber", "WidthSpanningText", "XETEX", "XeTeX", "Znak", "Znaky", "abjadnaivenumerals", "abjadnodotnumerals", "abjadnumerals", "activatespacehandler", "adaptcollector", "adaptfontfeature", "adaptpapersize", "addfeature", "addtoJSpreamble", "addtocommalist", "addvalue", "aftersplitstring", "aftertestandsplitstring", "aktualnicislonadpisu", "aktualnidatum", "alignmentcharacter", "allinputpaths", "alphabeticnumerals", "alwayscitation", "alwayscite", "ampersand", "anchor", "appendetoks", "appendgvalue", "appendtocommalist", "appendtoks", "appendtoksonce", "appendvalue", "apply", "applyalternativestyle", "applyprocessor", "applytocharacters", "applytofirstcharacter", "applytosplitstringchar", "applytosplitstringcharspaced", "applytosplitstringline", "applytosplitstringlinespaced", "applytosplitstringword", "applytosplitstringwordspaced", "applytowords", "arabicdecimals", "arabicexnumerals", "arabicnumerals", "arg", "asciistr", "aside", "assignalfadimension", "assigndimen", "assigndimension", "assignifempty", "assigntranslation", "assignvalue", "assignwidth", "assumelongusagecs", "astype", "attachment", "autocap", "autodirhbox", "autodirvbox", "autodirvtop", "autoinsertnextspace", "automathematics", "autosetups", "availablehsize", "averagecharwidth", "backgroundimage", "backgroundimagefill", "backgroundline", "barevnalista", "barva", "basegrid", "baselineleftbox", "baselinemiddlebox", "baselinerightbox", "bbox", "beforesplitstring", "beforetestandsplitstring", "big", "bigbodyfont", "bigg", "bigger", "biggl", "biggm", "biggr", "bigl", "bigm", "bigr", "bigskip", "binom", "bitmapimage", "blap", "bleed", "bleedheight", "bleedwidth", "blockligatures", "blockquote", "bodyfontenvironmentlist", "bodyfontsize", "bold", "boldface", "bolditalic", "boldslanted", "booleanmodevalue", "bottombox", "bottomleftbox", "bottomrightbox", "boxcursor", "boxmarker", "boxofsize", "boxreference", "bpos", "bthiddencitation", "btxabbreviatedjournal", "btxaddjournal", "btxalwayscitation", "btxauthorfield", "btxdetail", "btxdirect", "btxdoif", "btxdoifcombiinlistelse", "btxdoifelse", "btxdoifelsecombiinlist", "btxdoifelsesameasprevious", "btxdoifelsesameaspreviouschecked", "btxdoifelseuservariable", "btxdoifnot", "btxdoifsameaspreviouscheckedelse", "btxdoifsameaspreviouselse", "btxdoifuservariableelse", "btxexpandedjournal", "btxfield", "btxfieldname", "btxfieldtype", "btxfirstofrange", "btxflush", "btxflushauthor", "btxflushauthorinverted", "btxflushauthorinvertedshort", "btxflushauthorname", "btxflushauthornormal", "btxflushauthornormalshort", "btxflushsuffix", "btxfoundname", "btxfoundtype", "btxhybridcite", "btxlistcitation", "btxloadjournalist", "btxoneorrange", "btxremapauthor", "btxsavejournalist", "btxsetup", "btxsingularorplural", "btxsingularplural", "btxtextcitation", "calligraphic", "camel", "catcodetablename", "cbox", "centerbox", "centeredbox", "centerednextbox", "cernalinka", "cernelinky", "cfrac", "chardescription", "charwidthlanguage", "checkcharacteralign", "checkedchar", "checkedfiller", "checkedstrippedcsname", "checkinjector", "checknextindentation", "checknextinjector", "checkpage", "checkparameters", "checkpreviousinjector", "checksoundtrack", "checktwopassdata", "checkvariables", "chem", "chemical", "chemicalbottext", "chemicalmidtext", "chemicalsymbol", "chemicaltext", "chemicaltoptext", "chineseallnumerals", "chinesecapnumerals", "chinesenumerals", "cisla", "cislonadpisu", "cislorovnice", "cislostrany", "citace", "citation", "cite", "citovat", "clap", "classfont", "cldcommand", "cldcontext", "cldloadfile", "cldprocessfile", "cleftarrow", "collect", "collectedtext", "collectexpanded", "colorcomponents", "colored", "coloronly", "columnbreak", "combinepages", "commalistelement", "commalistsentence", "commalistsize", "comment", "comparedimension", "comparedimensioneps", "completebtxrendering", "completelist", "completelistofpublications", "completelistofsorts", "completelistofsynonyms", "completepagenumber", "completeregister", "complexorsimple", "complexorsimpleempty", "composedcollector", "composedlayer", "compresult", "constantdimen", "constantdimenargument", "constantemptyargument", "constantnumber", "constantnumberargument", "contentreference", "continuednumber", "continueifinputfile", "convertargument", "convertcommand", "convertedcounter", "converteddimen", "convertedsubcounter", "convertmonth", "convertvalue", "convertvboxtohbox", "copypages", "copyparameters", "copyposition", "countersubs", "counttoken", "counttokens", "cramped", "crampedclap", "crampedllap", "crampedrlap", "crightarrow", "crightoverleftarrow", "ctop", "ctxcommand", "ctxdirectcommand", "ctxdirectlua", "ctxfunction", "ctxlatecommand", "ctxlatelua", "ctxloadluafile", "ctxlua", "ctxluabuffer", "ctxluacode", "ctxreport", "ctxsprint", "currentassignmentlistkey", "currentassignmentlistvalue", "currentbtxuservariable", "currentcommalistitem", "currentcomponent", "currentenvironment", "currentfeaturetest", "currentinterface", "currentlanguage", "currentlistentrydestinationattribute", "currentlistentrylimitedtext", "currentlistentrynumber", "currentlistentrypagenumber", "currentlistentryreferenceattribute", "currentlistentrytitle", "currentlistentrytitlerendered", "currentlistsymbol", "currentmainlanguage", "currentmessagetext", "currentmoduleparameter", "currentoutputstream", "currentproduct", "currentproject", "currentregime", "currentregisterpageuserdata", "currentresponses", "currenttime", "currentvalue", "currentxtablecolumn", "currentxtablerow", "datasetvariable", "datum", "dayoftheweek", "dayspermonth", "dbinom", "decrement", "decrementcounter", "decrementedcounter", "decrementpagenumber", "decrementsubpagenumber", "decrementvalue", "defaultinterface", "defaultobjectpage", "defaultobjectreference", "defcatcodecommand", "defconvertedargument", "defconvertedcommand", "defconvertedvalue", "defineMPinstance", "defineTABLEsetup", "defineactivecharacter", "definealternativestyle", "defineanchor", "defineattachment", "defineattribute", "definebackground", "definebar", "definebodyfontswitch", "definebreakpoint", "definebreakpoints", "definebtx", "definebtxdataset", "definebtxregister", "definebtxrendering", "definebutton", "definecapitals", "definecharacterkerning", "definecharacterspacing", "definechemical", "definechemicals", "definechemicalsymbol", "definecollector", "definecolumnbreak", "definecombination", "definecomment", "definecomplexorsimple", "definecomplexorsimpleempty", "defineconversionset", "definecounter", "definedataset", "definedelimitedtext", "definedfont", "defineeffect", "defineexpandable", "defineexternalfigure", "definefallbackfamily", "definefieldbody", "definefieldbodyset", "definefieldcategory", "definefileconstant", "definefilefallback", "definefilesynonym", "definefiller", "definefirstline", "definefittingpage", "definefontalternative", "definefontfallback", "definefontfamily", "definefontfamilypreset", "definefontfeature", "definefontfile", "definefontsize", "definefontsolution", "defineformula", "defineformulaalternative", "defineformulaframed", "defineframedcontent", "definefrozenfont", "defineglobalcolor", "definegraphictypesynonym", "definegridsnapping", "defineheadalternative", "definehelp", "definehigh", "definehighlight", "definehspace", "definehypenationfeatures", "defineindentedtext", "defineindenting", "defineinitial", "defineinsertion", "defineinteraction", "defineinteractionbar", "defineinterfaceconstant", "defineinterfaceelement", "defineinterfacevariable", "defineinterlinespace", "defineintermediatecolor", "defineitemgroup", "defineitems", "definelabelclass", "definelayer", "definelayerpreset", "definelayout", "definelinefiller", "definelinenote", "definelinenumbering", "definelines", "definelistalternative", "definelistextra", "definelow", "definelowhigh", "definelowmidhigh", "definemarginblock", "definemargindata", "definemarker", "definemathalignment", "definemathcases", "definemathcommand", "definemathdoubleextensible", "definemathematics", "definemathextensible", "definemathfence", "definemathfraction", "definemathframed", "definemathmatrix", "definemathornament", "definemathoverextensible", "definemathovertextextensible", "definemathradical", "definemathstackers", "definemathstyle", "definemathtriplet", "definemathunderextensible", "definemathundertextextensible", "definemathunstacked", "definemeasure", "definemessageconstant", "definemixedcolumns", "definemode", "definemultitonecolor", "definenamedcolor", "definenamespace", "definenarrower", "definenote", "defineornament", "defineoutputroutine", "defineoutputroutinecommand", "definepage", "definepagebreak", "definepagechecker", "definepagegrid", "definepagegridarea", "definepagegridspan", "definepageinjection", "definepageinjectionalternative", "definepageshift", "definepagestate", "definepairedbox", "defineparagraph", "defineparallel", "defineparbuilder", "defineplacement", "definepositioning", "defineprefixset", "defineprocesscolor", "defineprocessor", "definepushbutton", "definepushsymbol", "definerenderingwindow", "defineresetset", "definescale", "definescript", "definesectionlevels", "defineselector", "defineseparatorset", "defineshift", "definesidebar", "definesort", "definespotcolor", "definestyleinstance", "definesubformula", "definesynonym", "definesystemattribute", "definesystemconstant", "definesystemvariable", "definetabulation", "definetextbackground", "definetextflow", "definetooltip", "definetransparency", "definetwopasslist", "definetype", "definetypeface", "definetypescriptprefix", "definetypescriptsynonym", "definetypesetting", "defineunit", "defineviewerlayer", "definevspace", "definevspacing", "definevspacingamount", "definextable", "definuj", "definujbarvu", "definujblok", "definujbloksekce", "definujbuffer", "definujfont", "definujformatodkazu", "definujhbox", "definujinterakcnimenu", "definujkombinovanyseznam", "definujkonverzi", "definujnadpis", "definujobrazeksymbol", "definujodkaz", "definujodstavce", "definujopis", "definujoramovani", "definujoramovanytext", "definujpaletu", "definujplvouciobjekt", "definujpodpole", "definujpole", "definujpopis", "definujpopisek", "definujprekryv", "definujprofil", "definujprogram", "definujprostredizakladnihofontu", "definujrejstrik", "definujsablonutabulky", "definujsekci", "definujseznam", "definujskupinubarev", "definujstartstop", "definujstyl", "definujstylfontu", "definujsymbol", "definujsynonumumfontu", "definujsynonyma", "definujtabelaci", "definujtext", "definujtrideni", "definujupravu", "definujvelikostpapiru", "definujvycet", "definujzakladnifont", "definujzasobnikpoli", "definujznaceni", "delimited", "delimitedtext", "delkaseznamu", "depthofstring", "depthonlybox", "depthspanningtext", "determinenoflines", "devanagarinumerals", "dfrac", "digits", "dimensiontocount", "directcolor", "directcolored", "directconvertedcounter", "directdummyparameter", "directgetboxllx", "directgetboxlly", "directhighlight", "directlocalframed", "directluacode", "directselect", "directsetbar", "directsetup", "directsymbol", "directvspacing", "dis", "disabledirectives", "disableexperiments", "disablemode", "disableoutputstream", "disableparpositions", "disableregime", "disabletrackers", "displaymath", "displaymathematics", "displaymessage", "distributedhsize", "dividedsize", "doadaptleftskip", "doadaptrightskip", "doaddfeature", "doassign", "doassignempty", "doboundtext", "docheckassignment", "docheckedpagestate", "docheckedpair", "documentvariable", "dodoubleargument", "dodoubleargumentwithset", "dodoubleempty", "dodoubleemptywithset", "dodoublegroupempty", "doeassign", "doexpandedrecurse", "dogetattribute", "dogetattributeid", "dogetcommacommandelement", "dogobbledoubleempty", "dogobblesingleempty", "doif", "doifMPgraphicelse", "doifallcommon", "doifallcommonelse", "doifalldefinedelse", "doifallmodes", "doifallmodeselse", "doifassignmentelse", "doifblackelse", "doifbothsides", "doifbothsidesoverruled", "doifboxelse", "doifbufferelse", "doifcolor", "doifcolorelse", "doifcommandhandler", "doifcommandhandlerelse", "doifcommon", "doifcommonelse", "doifcontent", "doifconversiondefinedelse", "doifconversionnumberelse", "doifcounter", "doifcounterelse", "doifcurrentfonthasfeatureelse", "doifdefined", "doifdefinedcounter", "doifdefinedcounterelse", "doifdefinedelse", "doifdimensionelse", "doifdimenstringelse", "doifdocumentargument", "doifdocumentargumentelse", "doifdocumentfilename", "doifdocumentfilenameelse", "doifdrawingblackelse", "doifelse", "doifelseMPgraphic", "doifelseallcommon", "doifelsealldefined", "doifelseallmodes", "doifelseassignment", "doifelseblack", "doifelsebox", "doifelsebuffer", "doifelsecolor", "doifelsecommandhandler", "doifelsecommon", "doifelseconversiondefined", "doifelseconversionnumber", "doifelsecounter", "doifelsecurrentfonthasfeature", "doifelsecurrentsortingused", "doifelsecurrentsynonymshown", "doifelsecurrentsynonymused", "doifelsedefined", "doifelsedefinedcounter", "doifelsedimension", "doifelsedimenstring", "doifelsedocumentargument", "doifelsedocumentfilename", "doifelsedrawingblack", "doifelseempty", "doifelseemptyvalue", "doifelseemptyvariable", "doifelseenv", "doifelsefastoptionalcheck", "doifelsefastoptionalcheckcs", "doifelsefieldbody", "doifelsefieldcategory", "doifelsefigure", "doifelsefile", "doifelsefiledefined", "doifelsefileexists", "doifelsefirstchar", "doifelseflagged", "doifelsefontchar", "doifelsefontpresent", "doifelsefontsynonym", "doifelsehasspace", "doifelsehelp", "doifelseincsname", "doifelseinelement", "doifelseinputfile", "doifelseinsertion", "doifelseinset", "doifelseinstring", "doifelseinsymbolset", "doifelseintoks", "doifelseintwopassdata", "doifelseitalic", "doifelselanguage", "doifelselayerdata", "doifelselayoutdefined", "doifelselayoutsomeline", "doifelselayouttextline", "doifelseleapyear", "doifelselist", "doifelselocation", "doifelselocfile", "doifelsemainfloatbody", "doifelsemarking", "doifelsemeaning", "doifelsemessage", "doifelsemode", "doifelsenextbgroup", "doifelsenextbgroupcs", "doifelsenextchar", "doifelsenextoptional", "doifelsenextoptionalcs", "doifelsenextparenthesis", "doifelsenonzeropositive", "doifelsenoteonsamepage", "doifelsenothing", "doifelsenumber", "doifelseobjectfound", "doifelseobjectreferencefound", "doifelseoddpage", "doifelseoddpagefloat", "doifelseoldercontext", "doifelseolderversion", "doifelseoverlapping", "doifelseoverlay", "doifelseparallel", "doifelseparentfile", "doifelsepath", "doifelsepathexists", "doifelsepatterns", "doifelseposition", "doifelsepositionaction", "doifelsepositiononpage", "doifelsepositionsonsamepage", "doifelsepositionsonthispage", "doifelsepositionsused", "doifelsereferencefound", "doifelserightpagefloat", "doifelserighttoleftinbox", "doifelsesamelinereference", "doifelsesamestring", "doifelsesetups", "doifelsesomebackground", "doifelsesomespace", "doifelsesomething", "doifelsesometoks", "doifelsestringinstring", "doifelsestructurelisthasnumber", "doifelsestructurelisthaspage", "doifelsesymboldefined", "doifelsesymbolset", "doifelsetext", "doifelsetextflow", "doifelsetextflowcollector", "doifelsetypingfile", "doifelseundefined", "doifelseurldefined", "doifelsevalue", "doifelsevaluenothing", "doifelsevariable", "doifempty", "doifemptyelse", "doifemptytoks", "doifemptyvalue", "doifemptyvalueelse", "doifemptyvariable", "doifemptyvariableelse", "doifenv", "doifenvelse", "doiffastoptionalcheckcselse", "doiffastoptionalcheckelse", "doiffieldbodyelse", "doiffieldcategoryelse", "doiffigureelse", "doiffile", "doiffiledefinedelse", "doiffileelse", "doiffileexistselse", "doiffirstcharelse", "doifflaggedelse", "doiffontcharelse", "doiffontpresentelse", "doiffontsynonymelse", "doifhasspaceelse", "doifhelpelse", "doifincsnameelse", "doifinelementelse", "doifinputfileelse", "doifinsertionelse", "doifinset", "doifinsetelse", "doifinstring", "doifinstringelse", "doifinsymbolset", "doifinsymbolsetelse", "doifintokselse", "doifintwopassdataelse", "doifitalicelse", "doiflanguageelse", "doiflayerdataelse", "doiflayoutdefinedelse", "doiflayoutsomelineelse", "doiflayouttextlineelse", "doifleapyearelse", "doiflistelse", "doiflocationelse", "doiflocfileelse", "doifmainfloatbodyelse", "doifmarkingelse", "doifmeaningelse", "doifmessageelse", "doifmode", "doifmodeelse", "doifnextbgroupcselse", "doifnextbgroupelse", "doifnextcharelse", "doifnextoptionalcselse", "doifnextoptionalelse", "doifnextparenthesiselse", "doifnonzeropositiveelse", "doifnot", "doifnotallcommon", "doifnotallmodes", "doifnotcommandhandler", "doifnotcommon", "doifnotcounter", "doifnotdocumentargument", "doifnotdocumentfilename", "doifnotempty", "doifnotemptyvalue", "doifnotemptyvariable", "doifnotenv", "doifnoteonsamepageelse", "doifnotescollected", "doifnotfile", "doifnotflagged", "doifnothing", "doifnothingelse", "doifnotinset", "doifnotinsidesplitfloat", "doifnotinstring", "doifnotmode", "doifnotnumber", "doifnotsamestring", "doifnotsetups", "doifnotvalue", "doifnotvariable", "doifnumber", "doifnumberelse", "doifobjectfoundelse", "doifobjectreferencefoundelse", "doifoddpageelse", "doifoddpagefloatelse", "doifoldercontextelse", "doifolderversionelse", "doifoverlappingelse", "doifoverlayelse", "doifparallelelse", "doifparentfileelse", "doifpathelse", "doifpathexistselse", "doifpatternselse", "doifposition", "doifpositionaction", "doifpositionactionelse", "doifpositionelse", "doifpositiononpageelse", "doifpositionsonsamepageelse", "doifpositionsonthispageelse", "doifpositionsusedelse", "doifreferencefoundelse", "doifrightpagefloatelse", "doifrighttoleftinboxelse", "doifsamelinereferenceelse", "doifsamestring", "doifsamestringelse", "doifsetups", "doifsetupselse", "doifsomebackground", "doifsomebackgroundelse", "doifsomespaceelse", "doifsomething", "doifsomethingelse", "doifsometoks", "doifsometokselse", "doifstringinstringelse", "doifstructurelisthasnumberelse", "doifstructurelisthaspageelse", "doifsymboldefinedelse", "doifsymbolsetelse", "doiftext", "doiftextelse", "doiftextflowcollectorelse", "doiftextflowelse", "doiftypingfileelse", "doifundefined", "doifundefinedcounter", "doifundefinedelse", "doifurldefinedelse", "doifvalue", "doifvalueelse", "doifvaluenothing", "doifvaluenothingelse", "doifvaluesomething", "doifvariable", "doifvariableelse", "doindentation", "dollar", "doloop", "doloopoverlist", "donothing", "dontconvertfont", "dontleavehmode", "dontpermitspacesbetweengroups", "dopositionaction", "doprocesslocalsetups", "doquadrupleargument", "doquadrupleempty", "doquadruplegroupempty", "doquintupleargument", "doquintupleempty", "doquintuplegroupempty", "dorechecknextindentation", "dorecurse", "dorepeatwithcommand", "doreplacefeature", "doresetandafffeature", "doresetattribute", "dorotatebox", "dosetattribute", "dosetleftskipadaption", "dosetrightskipadaption", "dosetupcheckedinterlinespace", "doseventupleargument", "doseventupleempty", "dosingleargument", "dosingleempty", "dosinglegroupempty", "dosixtupleargument", "dosixtupleempty", "dostepwiserecurse", "dosubtractfeature", "dotfskip", "dotoks", "dotripleargument", "dotripleargumentwithset", "dotripleempty", "dotripleemptywithset", "dotriplegroupempty", "doublebar", "doublebond", "doublebrace", "doublebracket", "doubleparent", "dowith", "dowithnextbox", "dowithnextboxcontent", "dowithnextboxcontentcs", "dowithnextboxcs", "dowithpargument", "dowithrange", "dowithwargument", "dpofstring", "dummydigit", "dummyparameter", "eTeX", "edefconvertedargument", "efcmaxheight", "efcmaxwidth", "efcminheight", "efcminwidth", "efcparameter", "effect", "elapsedseconds", "elapsedtime", "eleftarrowfill", "eleftharpoondownfill", "eleftharpoonupfill", "eleftrightarrowfill", "emphasisboldface", "emphasistypeface", "emptylines", "emspace", "enabledirectives", "enableexperiments", "enablemode", "enableoutputstream", "enableparpositions", "enableregime", "enabletrackers", "enskip", "enspace", "env", "envvar", "eoverbarfill", "eoverbracefill", "eoverbracketfill", "eoverparentfill", "epos", "equaldigits", "erightarrowfill", "erightharpoondownfill", "erightharpoonupfill", "etwoheadrightarrowfill", "eunderbarfill", "eunderbracefill", "eunderbracketfill", "eunderparentfill", "executeifdefined", "exitloop", "exitloopnow", "expandcheckedcsname", "expanded", "expandfontsynonym", "externalfigurecollectionmaxheight", "externalfigurecollectionmaxwidth", "externalfigurecollectionminheight", "externalfigurecollectionminwidth", "externalfigurecollectionparameter", "externiobraz", "fakebox", "fastdecrement", "fastincrement", "fastlocalframed", "fastscale", "fastsetup", "fastsetupwithargument", "fastsetupwithargumentswapped", "fastswitchtobodyfont", "fastsxsy", "feature", "fence", "fenced", "fetchallmarkings", "fetchallmarks", "fetchmark", "fetchmarking", "fetchonemark", "fetchonemarking", "fetchruntinecommand", "fetchtwomarkings", "fetchtwomarks", "fieldbody", "fifthoffivearguments", "fifthofsixarguments", "figurefilename", "figurefilepath", "figurefiletype", "figurefullname", "figureheight", "figurenaturalheight", "figurenaturalwidth", "figuresymbol", "figurewidth", "filename", "filledhboxb", "filledhboxc", "filledhboxg", "filledhboxk", "filledhboxm", "filledhboxr", "filledhboxy", "filler", "filterfromnext", "filterfromvalue", "filterpages", "filterreference", "findtwopassdata", "finishregisterentry", "firstcharacter", "firstcounter", "firstcountervalue", "firstoffivearguments", "firstoffourarguments", "firstofoneargument", "firstofoneunexpanded", "firstofsixarguments", "firstofthreearguments", "firstofthreeunexpanded", "firstoftwoarguments", "firstoftwounexpanded", "firstrealpage", "firstrealpagenumber", "firstsubcountervalue", "firstsubpage", "firstsubpagenumber", "firstuserpage", "firstuserpagenumber", "fitfieldframed", "fittopbaselinegrid", "flag", "floatuserdataparameter", "flushboxregister", "flushcollector", "flushlayer", "flushlocalfloats", "flushnextbox", "flushnotes", "flushoutputstream", "flushshapebox", "flushtextflow", "flushtokens", "flushtoks", "fontalternative", "fontbody", "fontchar", "fontcharbyindex", "fontclass", "fontclassname", "fontface", "fontfeaturelist", "fontsize", "fontstyle", "footnotetext", "forcecharacterstripping", "forcelocalfloats", "forgeteverypar", "forgetparameters", "formula", "foundbox", "fourthoffivearguments", "fourthoffourarguments", "fourthofsixarguments", "frac", "frameddimension", "framedparameter", "framedtext", "freezedimenmacro", "freezemeasure", "frenchspacing", "fromlinenote", "frozenhbox", "gdefconvertedargument", "gdefconvertedcommand", "getMPdrawing", "getMPlayer", "getboxllx", "getboxlly", "getbufferdata", "getcommacommandsize", "getcommalistsize", "getdayoftheweek", "getdayspermonth", "getdefinedbuffer", "getdocumentargument", "getdocumentargumentdefault", "getdocumentfilename", "getdummyparameters", "getemptyparameters", "geteparameters", "getexpandedparameters", "getfiguredimensions", "getfirstcharacter", "getfirsttwopassdata", "getfromcommacommand", "getfromcommalist", "getfromtwopassdata", "getglyphdirect", "getglyphstyled", "getgparameters", "getlasttwopassdata", "getlocalfloat", "getlocalfloats", "getmessage", "getnamedglyphdirect", "getnamedglyphstyled", "getnamedtwopassdatalist", "getnaturaldimensions", "getnoflines", "getobject", "getobjectdimensions", "getpaletsize", "getparameters", "getprivatechar", "getprivateslot", "getrandomcount", "getrandomdimen", "getrandomfloat", "getrandomnumber", "getrandomseed", "getraweparameters", "getrawgparameters", "getrawnoflines", "getrawparameters", "getrawxparameters", "getreference", "getreferenceentry", "getroundednoflines", "getsubstring", "gettwopassdata", "gettwopassdatalist", "getuvalue", "getvalue", "getvariable", "getvariabledefault", "getxparameters", "globaldisablemode", "globalenablemode", "globalletempty", "globalpopbox", "globalpopmacro", "globalpreventmode", "globalprocesscommalist", "globalpushbox", "globalpushmacro", "globalswapcounts", "globalswapdimens", "globalswapmacros", "globalundefine", "glyphfontfile", "gobbledoubleempty", "gobbleeightarguments", "gobblefivearguments", "gobblefiveoptionals", "gobblefourarguments", "gobblefouroptionals", "gobbleninearguments", "gobbleoneargument", "gobbleoneoptional", "gobblesevenarguments", "gobblesingleempty", "gobblesixarguments", "gobblespacetokens", "gobbletenarguments", "gobblethreearguments", "gobblethreeoptionals", "gobbletwoarguments", "gobbletwooptionals", "gobbleuntil", "gobbleuntilrelax", "grabbufferdata", "grabbufferdatadirect", "grabuntil", "graf", "grayvalue", "greedysplitstring", "greeknumerals", "groupedcommand", "gsetboxllx", "gsetboxlly", "gujaratinumerals", "gurmurkhinumerals", "hairspace", "halfwaybox", "handletokens", "handwritten", "hash", "hboxofvbox", "hboxreference", "hdofstring", "headhbox", "headnumbercontent", "headnumberdistance", "headnumberwidth", "headreferenceattributes", "headsetupspacing", "headtextcontent", "headtextdistance", "headtextwidth", "headvbox", "headwidth", "heightanddepthofstring", "heightofstring", "heightspanningtext", "helptext", "hglue", "hiddenbar", "hiddencitation", "hiddencite", "highlight", "highordinalstr", "hilo", "himilo", "hl", "hlavnijazyk", "hodnotabarvy", "horizontalgrowingbar", "horizontalpositionbar", "hphantom", "hpos", "hsizefraction", "hsmash", "hsmashbox", "hsmashed", "hspace", "htdpofstring", "htofstring", "hyphen", "hyphenatedcoloredword", "hyphenatedfile", "hyphenatedfilename", "hyphenatedhbox", "hyphenatedpar", "hyphenatedurl", "hyphenatedword", "ibox", "ifassignment", "iff", "ifinobject", "ifinoutputstream", "ifparameters", "iftrialtypesetting", "ignoreimplicitspaces", "ignorevalue", "immediatesavetwopassdata", "impliedby", "implies", "includemenu", "includeversioninfo", "increment", "incrementcounter", "incrementedcounter", "incrementpagenumber", "incrementsubpagenumber", "incrementvalue", "indentation", "infofont", "infofontbold", "inheritparameter", "inhibitblank", "initializeboxstack", "inlinebuffer", "inlinedbox", "inlinemath", "inlinemathematics", "inlinemessage", "inlineordisplaymath", "inlinerange", "innerflushshapebox", "input", "inputfilebarename", "inputfilename", "inputfilerealsuffix", "inputfilesuffix", "inputgivenfile", "insertpages", "instalacejazyka", "installactionhandler", "installactivecharacter", "installanddefineactivecharacter", "installattributestack", "installautocommandhandler", "installautosetuphandler", "installbasicautosetuphandler", "installbasicparameterhandler", "installbottomframerenderer", "installcommandhandler", "installcorenamespace", "installdefinehandler", "installdefinitionset", "installdefinitionsetmember", "installdirectcommandhandler", "installdirectparameterhandler", "installdirectparametersethandler", "installdirectsetuphandler", "installdirectstyleandcolorhandler", "installframedautocommandhandler", "installframedcommandhandler", "installleftframerenderer", "installnamespace", "installoutputroutine", "installpagearrangement", "installparameterhandler", "installparameterhashhandler", "installparametersethandler", "installparentinjector", "installrightframerenderer", "installrootparameterhandler", "installsetuphandler", "installsetuponlycommandhandler", "installshipoutmethod", "installsimplecommandhandler", "installsimpleframedcommandhandler", "installstyleandcolorhandler", "installswitchcommandhandler", "installswitchsetuphandler", "installtexdirective", "installtextracker", "installtopframerenderer", "installunitsseparator", "installunitsspace", "installversioninfo", "integerrounding", "interakcnilista", "interakcnitlacitka", "interaktivnimenu", "intermezzo", "intertext", "invokepageheandler", "istltdir", "istrtdir", "italic", "italicbold", "italiccorrection", "itemtag", "jazyk", "jdidolu", "jdina", "jdinabox", "jdinastranu", "jobfilename", "jobfilesuffix", "kap", "kapitola", "keeplinestogether", "keepunwantedspaces", "kerncharacters", "klonujpole", "komentar", "komponenta", "konvertujcislo", "kopirujpole", "koreancirclenumerals", "koreannumerals", "koreannumeralsc", "koreannumeralsp", "koreanparentnumerals", "korekcebilehomista", "languageCharacters", "languagecharacters", "languagecharwidth", "lastcounter", "lastcountervalue", "lastdigit", "lastlinewidth", "lastnaturalboxdp", "lastnaturalboxht", "lastnaturalboxwd", "lastpredefinedsymbol", "lastrealpage", "lastrealpagenumber", "lastsubcountervalue", "lastsubpage", "lastsubpagenumber", "lasttwodigits", "lastuserpage", "lastuserpagenumber", "lateluacode", "layeredtext", "layerheight", "layerwidth", "lazysavetaggedtwopassdata", "lazysavetwopassdata", "lbox", "left", "leftbottombox", "leftbox", "lefthbox", "leftorrighthbox", "leftorrightvbox", "leftorrightvtop", "leftskipadaption", "leftsubguillemot", "lefttopbox", "lefttorighthbox", "lefttorightvbox", "lefttorightvtop", "letbeundefined", "letcatcodecommand", "letcscsname", "letcsnamecs", "letcsnamecsname", "letdummyparameter", "letempty", "letgvalue", "letgvalueempty", "letgvalurelax", "letterampersand", "letterat", "letterbackslash", "letterbar", "letterbgroup", "letterclosebrace", "lettercolon", "letterdollar", "letterdoublequote", "letteregroup", "letterescape", "letterexclamationmark", "letterhash", "letterhat", "letterleftbrace", "letterless", "lettermore", "letteropenbrace", "letterpercent", "letterquestionmark", "letterrightbrace", "lettersinglequote", "letterslash", "letterspacing", "lettertilde", "letterunderscore", "letvalue", "letvalueempty", "letvaluerelax", "lfence", "lhbox", "limitatelines", "limitatetext", "limtatefirstline", "linespanningtext", "listcitation", "listcite", "listnamespaces", "llap", "loadanyfile", "loadanyfileonce", "loadbtxdefinitionfile", "loadbtxreplacementfile", "loadcldfile", "loadcldfileonce", "loadfontgoodies", "loadluafile", "loadluafileonce", "loadspellchecklist", "loadtexfile", "loadtexfileonce", "loadtypescriptfile", "localframed", "localframedwithsettings", "localhsize", "localpopbox", "localpopmacro", "localpushbox", "localpushmacro", "localundefine", "locatedfilepath", "locatefilepath", "locfilename", "lomihi", "lowerbox", "lowercased", "lowercasestring", "lowerleftdoubleninequote", "lowerleftsingleninequote", "lowerrightdoubleninequote", "lowerrightsingleninequote", "lrtbbox", "ltop", "luaTeX", "luacode", "luaconditional", "luaenvironment", "luaexpanded", "luafunction", "luajitTeX", "luamajorversion", "luaminorversion", "luaparameterset", "luasetup", "luaversion", "m", "mLeftarrow", "mLeftrightarrow", "mRightarrow", "makecharacteractive", "makerawcommalist", "makestrutofbox", "maoramovani", "mapfontsize", "margindata", "markcontent", "markinjector", "mat", "matematika", "math", "mathbf", "mathbi", "mathblackboard", "mathbs", "mathcommand", "mathdefault", "mathfraktur", "mathfunction", "mathit", "mathitalic", "mathop", "mathrm", "mathscript", "mathsl", "mathss", "mathtext", "mathtextbf", "mathtextbi", "mathtextbs", "mathtextit", "mathtextsl", "mathtexttf", "mathtf", "mathtriplet", "mathtt", "mathupright", "mathword", "mathwordbf", "mathwordbi", "mathwordbs", "mathwordit", "mathwordsl", "mathwordtf", "mazaramovani", "mbox", "mcframed", "md", "measure", "measured", "medskip", "medspace", "mequal", "meritko", "mesic", "message", "metaTeX", "mezera", "mfence", "mfunction", "mfunctionlabeltext", "mhbox", "mhookleftarrow", "mhookrightarrow", "middle", "middlebox", "midhbox", "minimalhbox", "mixedcaps", "mkvibuffer", "mleftarrow", "mleftharpoondown", "mleftharpoonup", "mleftrightarrow", "mleftrightharpoons", "mmapsto", "moduleparameter", "molecule", "mono", "monobold", "mononormal", "monthlong", "monthshort", "mp", "mprandomnumber", "mrel", "mrightarrow", "mrightharpoondown", "mrightharpoonup", "mrightleftharpoons", "mrightoverleftarrow", "mrizka", "mtext", "mtriplerel", "mtwoheadleftarrow", "mtwoheadrightarrow", "namedheadnumber", "namedstructureheadlocation", "namedstructureuservariable", "namedstructurevariable", "namedtaggedlabeltexts", "nastavbarvu", "nastavbarvy", "nastavbilamista", "nastavblok", "nastavbloksekce", "nastavbuffer", "nastavcernelinky", "nastavcislonadpisu", "nastavcislostrany", "nastavcislovaniodstavcu", "nastavcislovaniradku", "nastavcislovanistran", "nastavcitaci", "nastavdeleniplvoucichobjektu", "nastavdelitko", "nastavdolnitexty", "nastavhorejsek", "nastavhornitexty", "nastavinterakci", "nastavinterakcnilistu", "nastavinterakcnimenu", "nastavinterakcniobrazovku", "nastavjazyk", "nastavkapitalky", "nastavkombinovanyseznam", "nastavkomentar", "nastavkomentarstrany", "nastavmarginalnilinky", "nastavmeziradkovoumezeru", "nastavnadpis", "nastavnadpisy", "nastavodkazovani", "nastavodsazovani", "nastavodstavce", "nastavopis", "nastavoramovani", "nastavorez", "nastavotoceni", "nastavpaletu", "nastavplvouciobjekt", "nastavpodcislostrany", "nastavpole", "nastavpolozky", "nastavpopisek", "nastavpozadi", "nastavprechodstrany", "nastavpreskok", "nastavprogramy", "nastavradkovani", "nastavradky", "nastavrejstrik", "nastavsadusymbolu", "nastavseznam", "nastavsirkucary", "nastavsloupce", "nastavspodek", "nastavsynonyma", "nastavtabelaci", "nastavtabulky", "nastavtenkelinky", "nastavtext", "nastavtextovelinky", "nastavtexttexty", "nastavtextyupati", "nastavtextyzahlavi", "nastavtoleranci", "nastavtrideni", "nastavtype", "nastavumisteniprotejsku", "nastavumistovani", "nastavupati", "nastavupravu", "nastavurl", "nastavusporadani", "nastavvelikostpapiru", "nastavvsechnapole", "nastavvycty", "nastavvyplnovelinky", "nastavvyplnoveradky", "nastavvzhled", "nastavzahlavi", "nastavzakladnifont", "nastavznaceni", "nastavzuzeni", "nastrane", "naturalhbox", "naturalhpack", "naturalvbox", "naturalvcenter", "naturalvpack", "naturalvtop", "naturalwd", "negatecolorbox", "negated", "negthinspace", "nejakyradek", "nekde", "newattribute", "newcatcodetable", "newcounter", "newevery", "newfrenchspacing", "newmode", "newsignal", "newsystemmode", "nextbox", "nextboxdp", "nextboxht", "nextboxhtdp", "nextboxwd", "nextcounter", "nextcountervalue", "nextdepth", "nextparagraphs", "nextrealpage", "nextrealpagenumber", "nextsubcountervalue", "nextsubpage", "nextsubpagenumber", "nextuserpage", "nextuserpagenumber", "neznamo", "nivy", "nizky", "nobar", "nocitation", "nocite", "nodetostring", "noffigurepages", "noflines", "noflocalfloats", "noindentation", "noitem", "nokap", "nonfrenchspacing", "nonmathematics", "normal", "normalboldface", "normalframedwithsettings", "normalizebodyfontsize", "normalizedfontsize", "normalizefontdepth", "normalizefontheight", "normalizefontline", "normalizefontwidth", "normalizetextdepth", "normalizetextheight", "normalizetextline", "normalizetextwidth", "normaltypeface", "notesymbol", "ntimes", "numberofpoints", "obeydepth", "objectdepth", "objectheight", "objectmargin", "objectwidth", "obox", "obrazek", "obrazovka", "odkaz", "odkaznastranu", "odkaznatext", "odkazujici", "offset", "offsetbox", "onedigitrounding", "opis", "opissoubor", "oramovani", "oramovanytext", "ordinaldaynumber", "ordinalstr", "oref", "orez", "ornamenttext", "otocit", "outputfilename", "outputstreambox", "outputstreamcopy", "outputstreamunvbox", "outputstreamunvcopy", "over", "overbar", "overbars", "overbartext", "overbarunderbar", "overbrace", "overbracetext", "overbraceunderbrace", "overbracket", "overbrackettext", "overbracketunderbracket", "overlaybutton", "overlaycolor", "overlaydepth", "overlayfigure", "overlayheight", "overlaylinecolor", "overlaylinewidth", "overlayoffset", "overlayrollbutton", "overlaywidth", "overleftarrow", "overleftharpoondown", "overleftharpoonup", "overleftrightarrow", "overloaderror", "overparent", "overparenttext", "overparentunderparent", "overrightarrow", "overrightharpoondown", "overrightharpoonup", "overset", "overstrike", "overstrikes", "overtwoheadleftarrow", "overtwoheadrightarrow", "oznaceni", "pagearea", "pagebreak", "pagefigure", "pagegridspanwidth", "pageinjection", "pagestaterealpage", "paletsize", "pdfTeX", "pdfactualtext", "pdfbackendactualtext", "pdfbackendcurrentresources", "pdfbackendsetcatalog", "pdfbackendsetcolorspace", "pdfbackendsetextgstate", "pdfbackendsetinfo", "pdfbackendsetname", "pdfbackendsetpageattribute", "pdfbackendsetpageresource", "pdfbackendsetpagesattribute", "pdfbackendsetpattern", "pdfbackendsetshade", "pdfcolor", "pdfeTeX", "percent", "percentdimen", "permitcaretescape", "permitcircumflexescape", "permitspacesbetweengroups", "persiandecimals", "persiannumerals", "phantom", "phantombox", "pickupgroupedcommand", "pis", "placeattachments", "placebtxrendering", "placecitation", "placecomments", "placecurrentformulanumber", "placedbox", "placefloat", "placefloatwithsetups", "placeframed", "placeheadnumber", "placeheadtext", "placehelp", "placeinitial", "placelayer", "placelayeredtext", "placelistofpublications", "placelistofsorts", "placelistofsynonyms", "placelocalnotes", "placement", "placenamedfloat", "placenamedformula", "placenotes", "placepagenumber", "placepairedbox", "placeparallel", "placerawlist", "placerenderingwindow", "plnezneni", "podpodpodpodsekce", "podpodpodpodtema", "podpodpodsekce", "podpodpodtema", "podpodsekce", "podpodtema", "podsekce", "podtema", "pole", "polozka", "polozky", "popattribute", "popmacro", "popmode", "popsystemmode", "porovnejpaletu", "porovnejskupinubarev", "positionoverlay", "positionregionoverlay", "postponenotes", "pozadi", "pozice", "poznamka", "predefinedfont", "predefinefont", "predefinesymbol", "pref", "prefixedpagenumber", "prelozit", "prependetoks", "prependgvalue", "prependtocommalist", "prependtoks", "prependtoksonce", "prependvalue", "prepninazakladnifont", "presetdocument", "presetfieldsymbols", "preskoc", "pretocommalist", "prevcounter", "prevcountervalue", "preventmode", "prevrealpage", "prevrealpagenumber", "prevsubcountervalue", "prevsubpage", "prevsubpagenumber", "prevuserpage", "prevuserpagenumber", "prizpusobivepole", "prizpusobvzhled", "procent", "processMPbuffer", "processMPfigurefile", "processaction", "processallactionsinset", "processassignlist", "processassignmentcommand", "processassignmentlist", "processbetween", "processbodyfontenvironmentlist", "processcolorcomponents", "processcommacommand", "processcommalist", "processcommalistwithparameters", "processcontent", "processfile", "processfilemany", "processfilenone", "processfileonce", "processfirstactioninset", "processisolatedchars", "processisolatedwords", "processlinetablebuffer", "processlinetablefile", "processlist", "processmonth", "processranges", "processseparatedlist", "processtexbuffer", "processtokens", "processuntil", "processxtablebuffer", "processyear", "produkt", "profiledbox", "profilegivenbox", "program", "projekt", "prostredi", "pseudoMixedCapped", "pseudoSmallCapped", "pseudoSmallcapped", "pseudosmallcapped", "purenumber", "pushattribute", "pushbutton", "pushmacro", "pushmode", "pushoutputstream", "pushsystemmode", "qquad", "quad", "quads", "quitcommalist", "quitprevcommalist", "quittypescriptscanning", "raisebox", "randomizetext", "randomnumber", "rawcounter", "rawcountervalue", "rawdate", "rawdoifelseinset", "rawdoifinset", "rawdoifinsetelse", "rawgetparameters", "rawprocessaction", "rawprocesscommacommand", "rawprocesscommalist", "rawstructurelistuservariable", "rawsubcountervalue", "rbox", "readfile", "readfixfile", "readjobfile", "readlocfile", "readsetfile", "readsysfile", "readtexfile", "readxmlfile", "realSmallCapped", "realSmallcapped", "realpagenumber", "realsmallcapped", "recursedepth", "recurselevel", "recursestring", "redoconvertfont", "ref", "referenceprefix", "registerattachment", "registerctxluafile", "registerexternalfigure", "registerfontclass", "registerhyphenationexception", "registerhyphenationpattern", "registermenubuttons", "registersort", "registersynonym", "registerunit", "regular", "relatemarking", "relateparameterhandlers", "relaxvalueifundefined", "remainingcharacters", "removebottomthings", "removedepth", "removefromcommalist", "removelastskip", "removelastspace", "removemarkedcontent", "removepunctuation", "removesubstring", "removetoks", "removeunwantedspaces", "replacefeature", "replaceincommalist", "replaceword", "rescan", "rescanwithsetup", "resetMPdrawing", "resetMPenvironment", "resetMPinstance", "resetallattributes", "resetandaddfeature", "resetbar", "resetbreakpoints", "resetbuffer", "resetcharacteralign", "resetcharacterkerning", "resetcharacterspacing", "resetcharacterstripping", "resetcollector", "resetcounter", "resetdigitsmanipulation", "resetdirection", "resetfeature", "resetflag", "resetfontcolorsheme", "resetfontfallback", "resetfontsolution", "resethyphenationfeatures", "resetinjector", "resetinteractionmenu", "resetitaliccorrection", "resetlayer", "resetlocalfloats", "resetmarker", "resetmode", "resetpagenumber", "resetparallel", "resetpath", "resetpenalties", "resetprofile", "resetreference", "resetreplacement", "resetscript", "resetsetups", "resetshownsynonyms", "resetsubpagenumber", "resetsymbolset", "resetsystemmode", "resettimer", "resettrackers", "resettrialtypesetting", "resetusedsortings", "resetusedsynonyms", "resetuserpagenumber", "resetvalue", "resetvisualizers", "resetznaceni", "reshapebox", "resolvedglyphdirect", "resolvedglyphstyled", "restartcounter", "restorebox", "restorecatcodes", "restorecounter", "restorecurrentattributes", "restoreendofline", "restoreglobalbodyfont", "reusableMPgraphic", "reuseMPgraphic", "reuserandomseed", "revivefeature", "rfence", "rhbox", "right", "rightbottombox", "rightbox", "righthbox", "rightorleftpageaction", "rightskipadaption", "rightsubguillemot", "righttolefthbox", "righttoleftvbox", "righttoleftvtop", "righttopbox", "rimskecislice", "rlap", "robustaddtocommalist", "robustdoifelseinset", "robustdoifinsetelse", "robustpretocommalist", "rollbutton", "roman", "rozdelplvouciobjekt", "roztazene", "rtop", "ruledhbox", "ruledhpack", "ruledmbox", "ruledtopv", "ruledtpack", "ruledvbox", "ruledvpack", "ruledvtop", "runMPbuffer", "runninghbox", "safechar", "sans", "sansbold", "sansnormal", "sansserif", "savebox", "savebtxdataset", "savebuffer", "savecounter", "savecurrentattributes", "savenormalmeaning", "savetaggedtwopassdata", "savetwopassdata", "sbox", "schovejbloky", "sd", "secondoffivearguments", "secondoffourarguments", "secondofsixarguments", "secondofthreearguments", "secondofthreeunexpanded", "secondoftwoarguments", "secondoftwounexpanded", "sedabarva", "sekce", "select", "serializecommalist", "serializedcommalist", "serif", "serifbold", "serifnormal", "setJSpreamble", "setMPlayer", "setMPpositiongraphic", "setMPpositiongraphicrange", "setMPtext", "setMPvariable", "setMPvariables", "setbar", "setbigbodyfont", "setboxllx", "setboxlly", "setbreakpoints", "setcapstrut", "setcatcodetable", "setcharacteralign", "setcharactercasing", "setcharactercleaning", "setcharacterkerning", "setcharacterspacing", "setcharacterstripping", "setcharstrut", "setcollector", "setcolormodell", "setcounter", "setcounterown", "setcurrentfontclass", "setdataset", "setdefaultpenalties", "setdigitsmanipulation", "setdirection", "setdocumentargument", "setdocumentargumentdefault", "setdocumentfilename", "setdummyparameter", "setelementexporttag", "setemeasure", "setevalue", "setevariable", "setevariables", "setfirstline", "setflag", "setfont", "setfontcolorsheme", "setfontfeature", "setfontsolution", "setfontstrut", "setfractions", "setgmeasure", "setgvalue", "setgvariable", "setgvariables", "sethboxregister", "sethyphenatedurlafter", "sethyphenatedurlbefore", "sethyphenatedurlnormal", "sethyphenationfeatures", "setinitial", "setinjector", "setinteraction", "setinterfacecommand", "setinterfaceconstant", "setinterfaceelements", "setinterfacemessage", "setinterfacevariable", "setinternalrendering", "setitaliccorrection", "setlayer", "setlayerframed", "setlayertext", "setlinefiller", "setlocalhsize", "setmainbodyfont", "setmainparbuilder", "setmarker", "setmarking", "setmathstyle", "setmeasure", "setmessagetext", "setmode", "setnostrut", "setnote", "setnotetext", "setobject", "setoldstyle", "setpagegrid", "setpagereference", "setpagestate", "setpagestaterealpageno", "setpenalties", "setpercentdimen", "setposition", "setpositionbox", "setpositiondata", "setpositiondataplus", "setpositiononly", "setpositionplus", "setpositionstrut", "setprofile", "setrandomseed", "setreference", "setreferencedobject", "setregisterentry", "setreplacement", "setrigidcolumnbalance", "setrigidcolumnhsize", "setscript", "setsectionblock", "setsimplecolumnhsize", "setsmallbodyfont", "setsmallcaps", "setstackbox", "setstructurepageregister", "setstrut", "setsuperiors", "setsystemmode", "settabular", "settaggedmetadata", "settextcontent", "settightobject", "settightreferencedobject", "settightunreferencedobject", "settrialtypesetting", "setuevalue", "setugvalue", "setunreferencedobject", "setup", "setupMPgraphics", "setupMPinstance", "setupMPpage", "setupMPvariables", "setupTABLE", "setupTEXpage", "setupattachment", "setupbackend", "setupbar", "setupbleeding", "setupbookmark", "setupbtx", "setupbtxdataset", "setupbtxlist", "setupbtxregister", "setupbtxrendering", "setupbutton", "setupcharacterkerning", "setupcharacterspacing", "setupchemical", "setupchemicalframed", "setupcollector", "setupcolumnspan", "setupcombination", "setupcounter", "setupdataset", "setupdelimitedtext", "setupdescription", "setupdirections", "setupdocument", "setupeffect", "setupenumeration", "setupenv", "setupexport", "setupexternalfigure", "setupexternalsoundtracks", "setupfieldbody", "setupfieldcategory", "setupfieldcontentframed", "setupfieldlabelframed", "setupfieldtotalframed", "setupfiller", "setupfirstline", "setupfittingpage", "setupfloatcaption", "setupfontexpansion", "setupfontprotrusion", "setupfonts", "setupfontsolution", "setupforms", "setupformula", "setupformulaframed", "setupframedcontent", "setupframedtext", "setupglobalreferenceprefix", "setupheadalternative", "setuphelp", "setuphigh", "setuphighlight", "setuphyphenation", "setupindentedtext", "setupinitial", "setupinsertion", "setupitaliccorrection", "setupitemgroup", "setuplabel", "setuplayer", "setuplayeredtext", "setuplayouttext", "setuplinefiller", "setuplinefillers", "setuplinenote", "setuplinetable", "setuplistalternative", "setuplistextra", "setuplocalfloats", "setuplocalinterlinespace", "setuplow", "setuplowhigh", "setuplowmidhigh", "setupmarginblock", "setupmargindata", "setupmarginframed", "setupmarginrule", "setupmathalignment", "setupmathcases", "setupmathematics", "setupmathfence", "setupmathfraction", "setupmathframed", "setupmathmatrix", "setupmathornament", "setupmathradical", "setupmathstackers", "setupmathstyle", "setupmixedcolumns", "setupmodule", "setupnotation", "setupnotations", "setupnote", "setupnotes", "setupoffset", "setupoffsetbox", "setupoutputroutine", "setuppagechecker", "setuppagegrid", "setuppagegridarea", "setuppagegridareatext", "setuppagegridlines", "setuppagegridspan", "setuppagegridstart", "setuppageinjection", "setuppageinjectionalternative", "setuppageshift", "setuppagestate", "setuppairedbox", "setuppaper", "setupparagraph", "setupparagraphintro", "setupparallel", "setupperiods", "setupplacement", "setuppositionbar", "setupprocessor", "setupprofile", "setupquotation", "setuprealpagenumber", "setupreferenceformat", "setupreferenceprefix", "setupreferencestructureprefix", "setupregisters", "setuprenderingwindow", "setups", "setupscale", "setupscript", "setupscripts", "setupselector", "setupshift", "setupsidebar", "setupspellchecking", "setupstartstop", "setupstretched", "setupstruts", "setupstyle", "setupsubformula", "setuptabulation", "setuptagging", "setuptextbackground", "setuptextflow", "setuptooltip", "setupunit", "setupuserpagenumber", "setupversion", "setupviewerlayer", "setupvspacing", "setupwithargument", "setupwithargumentswapped", "setupxml", "setupxtable", "setuvalue", "setuxvalue", "setvalue", "setvariable", "setvariables", "setvboxregister", "setvisualizerfont", "setvtopregister", "setwidthof", "setxmeasure", "setxvalue", "setxvariable", "setxvariables", "sfrac", "shapedhbox", "showallmakeup", "showattributes", "showboxes", "showbtxdatasetauthors", "showbtxdatasetcompleteness", "showbtxdatasetfields", "showbtxfields", "showbtxhashedauthors", "showbtxtables", "showchardata", "showcharratio", "showcolorbar", "showcolorcomponents", "showcolorset", "showcolorstruts", "showcounter", "showdirectives", "showdirsinmargin", "showedebuginfo", "showexperiments", "showfont", "showfontdata", "showfontkerns", "showfontparameters", "showfontstrip", "showfontstyle", "showglyphs", "showgridsnapping", "showhelp", "showhyphenationtrace", "showhyphens", "showinjector", "showjustification", "showkerning", "showlayoutcomponents", "showligature", "showligatures", "showlogcategories", "showmargins", "showmessage", "showminimalbaseline", "shownextbox", "showotfcomposition", "showparentchain", "showsetupsdefinition", "showtimer", "showtokens", "showtrackers", "showvalue", "showvariable", "showwarning", "simplegroupedcommand", "singalcharacteralign", "singlebond", "sixthofsixarguments", "skryt", "slanted", "slantedbold", "slicepages", "sloupec", "slovenianNumerals", "sloveniannumerals", "small", "smallbodyfont", "smallbold", "smallbolditalic", "smallboldslanted", "smallcappedcharacters", "smallcappedromannumerals", "smaller", "smallitalicbold", "smallnormal", "smallskip", "smallslanted", "smallslantedbold", "smalltype", "smash", "smashbox", "smashboxed", "smashedhbox", "smashedvbox", "snaptogrid", "someheadnumber", "somekindoftab", "somelocalfloat", "somenamedheadnumber", "someplace", "sp", "spanishNumerals", "spanishnumerals", "speech", "splitatasterisk", "splitatcolon", "splitatcolons", "splitatcomma", "splitdfrac", "splitfilename", "splitfrac", "splitoffbase", "splitofffull", "splitoffkind", "splitoffname", "splitoffpath", "splitoffroot", "splitofftokens", "splitofftype", "splitstring", "spreadhbox", "sqrt", "stackrel", "stanovcharakteristickuseznamu", "stanovcislonadpisu", "startJScode", "startJSpreamble", "startMPclip", "startMPcode", "startMPdefinitions", "startMPdrawing", "startMPenvironment", "startMPextensions", "startMPinclusions", "startMPinitializations", "startMPpage", "startMPpositiongraphic", "startMPpositionmethod", "startMPrun", "startTABLE", "startTABLEbody", "startTABLEfoot", "startTABLEhead", "startTABLEnext", "startTC", "startTD", "startTDs", "startTEXpage", "startTH", "startTN", "startTR", "startTRs", "startTX", "startTY", "startallmodes", "startarrangedpages", "startaside", "startattachment", "startbar", "startbarva", "startbinom", "startbitmapimage", "startblockquote", "startbtxrenderingdefinitions", "startbuffer", "startbutton", "startcatcodetable", "startcharacteralign", "startcheckedfences", "startchemical", "startcitace", "startcitovat", "startcollect", "startcollecting", "startcolorintent", "startcoloronly", "startcolorset", "startcolumns", "startcolumnspan", "startcombination", "startcomment", "startcontextcode", "startcontextdefinitioncode", "startctxfunction", "startctxfunctiondefinition", "startcurrentcolor", "startcurrentlistentrywrapper", "startdbinom", "startdelimited", "startdelimitedtext", "startdfrac", "startdisplaymath", "startdmath", "startdocument", "starteffect", "startelement", "startembeddedxtable", "startendofline", "startexceptions", "startexpanded", "startexpandedcollect", "startextendedcatcodetable", "startexternalfigurecollection", "startfigure", "startfitfieldframed", "startfittingpage", "startfloatcombination", "startfont", "startfontclass", "startfontsolution", "startformula", "startformulas", "startfrac", "startframedcontent", "startframedtext", "startgraf", "startgridsnapping", "starthbox", "starthboxestohbox", "starthboxregister", "starthelptext", "starthiddenbar", "starthiding", "starthighlight", "starthyphenation", "startimath", "startindentation", "startindentedtext", "startinmframed", "startinteraction", "startinteraktivnimenu", "startinterface", "startintermezzo", "startintertext", "startitemgroup", "startjdina", "startkapitola", "startknockout", "startkomentar", "startkomponenta", "startlayout", "startlinecorrection", "startlinefiller", "startlinenumbering", "startlinetable", "startlinetablebody", "startlinetablecell", "startlinetablehead", "startlocalfootnotes", "startlocalheadsetup", "startlocallinecorrection", "startlocalnotes", "startlocalsetups", "startlua", "startluacode", "startluaparameterset", "startluasetups", "startmakeup", "startmarginalnilinka", "startmarginblock", "startmarkedcontent", "startmathmode", "startmathstyle", "startmatrices", "startmcframed", "startmdformula", "startmframed", "startmixedcolumns", "startmode", "startmodeset", "startmodule", "startmoduletestsection", "startmpformula", "startnadpis", "startnadtrzeni", "startnadtrzeno", "startnamedsection", "startnamedsubformulas", "startnarrow", "startnarrower", "startnegative", "startnicelyfilledbox", "startnobar", "startnointerference", "startnotallmodes", "startnotext", "startnotmode", "startobrazek", "startopposite", "startoramovani", "startoramovanytext", "startoutputstream", "startoverlay", "startoverprint", "startpagecomment", "startpagefigure", "startpagegrid", "startpagegridspan", "startpagelayout", "startpar", "startparagraph", "startparagraphs", "startparagraphscell", "startparbuilder", "startpath", "startplacepairedbox", "startpodpodpodpodsekce", "startpodpodpodpodtema", "startpodpodpodsekce", "startpodpodpodtema", "startpodpodsekce", "startpodpodtema", "startpodsekce", "startpodtema", "startpodtrzeni", "startpodtrzeno", "startpolozka", "startpositioning", "startpositionoverlay", "startpositive", "startpostponing", "startpozadi", "startpreskrtnuti", "startpreskrtnuto", "startprocessassignmentcommand", "startprocessassignmentlist", "startprocesscommacommand", "startprocesscommalist", "startprodukt", "startprojekt", "startprostredi", "startprotect", "startprotectedcolors", "startpublikace", "startpunctuation", "startradek", "startrandomized", "startrandomseed", "startrawsetups", "startreadingfile", "startreferenceprefix", "startregime", "startregister", "startreusableMPgraphic", "startscript", "startsdformula", "startsectionblock", "startsectionblockenvironment", "startsectionlevel", "startsekce", "startsetups", "startsfrac", "startshapebox", "startshift", "startsidebar", "startsimplecolumns", "startspecialitem", "startspeech", "startspformula", "startspread", "startstartstop", "startstaticMPfigure", "startstaticMPgraphic", "startstrictinspectnextcharacter", "startstructurepageregister", "startstrut", "startstyle", "startsubformulas", "startsubjectlevel", "startsubsentence", "startsubstack", "startsymbolset", "starttable", "starttablehead", "starttables", "starttabletail", "starttabulate", "starttabulatehead", "starttabulatetail", "starttabulka", "starttagged", "starttbinom", "starttema", "starttexcode", "starttexdefinition", "starttext", "starttextbackground", "starttextbackgroundmanual", "starttextcolor", "starttextcolorintent", "starttextflow", "starttextnapovedy", "starttextovalinka", "starttitul", "starttokens", "starttransparent", "starttypescript", "starttypescriptcollection", "startumistirovnici", "startunderdash", "startunderdashes", "startunderdot", "startunderdots", "startunderrandom", "startunderrandoms", "startunderstrike", "startunderstrikes", "startunframed", "startuniqueMPgraphic", "startuniqueMPpagegraphic", "startunpacked", "startusableMPgraphic", "startuseMPgraphic", "startusemathstyleparameter", "startusingbtxspecification", "startvbox", "startvboxregister", "startvboxtohbox", "startvboxtohboxseparator", "startviewerlayer", "startvtop", "startvtopregister", "startvycet", "startxcell", "startxcellgroup", "startxfrac", "startxgroup", "startxmldisplayverbatim", "startxmlinlineverbatim", "startxmlraw", "startxmlsetups", "startxrow", "startxrowgroup", "startxtable", "startxtablebody", "startxtablefoot", "startxtablehead", "startxtablenext", "startxxfrac", "startzhustene", "stopJScode", "stopJSpreamble", "stopMPclip", "stopMPcode", "stopMPdefinitions", "stopMPdrawing", "stopMPenvironment", "stopMPextensions", "stopMPinclusions", "stopMPinitializations", "stopMPpage", "stopMPpositiongraphic", "stopMPpositionmethod", "stopMPrun", "stopTABLE", "stopTABLEbody", "stopTABLEfoot", "stopTABLEhead", "stopTABLEnext", "stopTC", "stopTD", "stopTDs", "stopTEXpage", "stopTH", "stopTN", "stopTR", "stopTRs", "stopTX", "stopTY", "stopallmodes", "stoparrangedpages", "stopaside", "stopattachment", "stopbar", "stopbarva", "stopbinom", "stopbitmapimage", "stopblockquote", "stopbtxrenderingdefinitions", "stopbuffer", "stopbutton", "stopcatcodetable", "stopcharacteralign", "stopcheckedfences", "stopchemical", "stopcitace", "stopcitovat", "stopcollect", "stopcollecting", "stopcolorintent", "stopcoloronly", "stopcolorset", "stopcolumns", "stopcolumnspan", "stopcombination", "stopcomment", "stopcontextcode", "stopcontextdefinitioncode", "stopctxfunction", "stopctxfunctiondefinition", "stopcurrentcolor", "stopcurrentlistentrywrapper", "stopdbinom", "stopdelimited", "stopdelimitedtext", "stopdfrac", "stopdisplaymath", "stopdmath", "stopdocument", "stopeffect", "stopelement", "stopembeddedxtable", "stopendofline", "stopexceptions", "stopexpanded", "stopexpandedcollect", "stopextendedcatcodetable", "stopexternalfigurecollection", "stopfigure", "stopfitfieldframed", "stopfittingpage", "stopfloatcombination", "stopfont", "stopfontclass", "stopfontsolution", "stopformula", "stopformulas", "stopfrac", "stopframedcontent", "stopframedtext", "stopgraf", "stopgridsnapping", "stophbox", "stophboxestohbox", "stophboxregister", "stophelptext", "stophiddenbar", "stophiding", "stophighlight", "stophyphenation", "stopimath", "stopindentation", "stopindentedtext", "stopinmframed", "stopinteraction", "stopinteraktivnimenu", "stopinterface", "stopintermezzo", "stopintertext", "stopitemgroup", "stopjdina", "stopkapitola", "stopknockout", "stopkomentar", "stopkomponenta", "stoplayout", "stoplinecorrection", "stoplinefiller", "stoplinenumbering", "stoplinetable", "stoplinetablebody", "stoplinetablecell", "stoplinetablehead", "stoplocalfootnotes", "stoplocalheadsetup", "stoplocallinecorrection", "stoplocalnotes", "stoplocalsetups", "stoplua", "stopluacode", "stopluaparameterset", "stopluasetups", "stopmakeup", "stopmarginalnilinka", "stopmarginblock", "stopmarkedcontent", "stopmathmode", "stopmathstyle", "stopmatrices", "stopmcframed", "stopmdformula", "stopmframed", "stopmixedcolumns", "stopmode", "stopmodeset", "stopmodule", "stopmoduletestsection", "stopmpformula", "stopnadpis", "stopnadtrzeni", "stopnadtrzeno", "stopnamedsection", "stopnamedsubformulas", "stopnarrow", "stopnarrower", "stopnegative", "stopnicelyfilledbox", "stopnobar", "stopnointerference", "stopnotallmodes", "stopnotext", "stopnotmode", "stopobrazek", "stopopposite", "stoporamovani", "stoporamovanytext", "stopoutputstream", "stopoverlay", "stopoverprint", "stoppagecomment", "stoppagefigure", "stoppagegrid", "stoppagegridspan", "stoppagelayout", "stoppar", "stopparagraph", "stopparagraphs", "stopparagraphscell", "stopparbuilder", "stoppath", "stopplacepairedbox", "stoppodpodpodpodsekce", "stoppodpodpodpodtema", "stoppodpodpodsekce", "stoppodpodpodtema", "stoppodpodsekce", "stoppodpodtema", "stoppodsekce", "stoppodtema", "stoppodtrzeni", "stoppodtrzeno", "stoppolozka", "stoppositioning", "stoppositionoverlay", "stoppositive", "stoppostponing", "stoppozadi", "stoppreskrtnuti", "stoppreskrtnuto", "stopprocessassignmentcommand", "stopprocessassignmentlist", "stopprocesscommacommand", "stopprocesscommalist", "stopprodukt", "stopprojekt", "stopprostredi", "stopprotect", "stopprotectedcolors", "stoppublikace", "stoppunctuation", "stopradek", "stoprandomized", "stoprandomseed", "stoprawsetups", "stopreadingfile", "stopreferenceprefix", "stopregime", "stopregister", "stopreusableMPgraphic", "stopscript", "stopsdformula", "stopsectionblock", "stopsectionblockenvironment", "stopsectionlevel", "stopsekce", "stopsetups", "stopsfrac", "stopshapebox", "stopshift", "stopsidebar", "stopsimplecolumns", "stopspecialitem", "stopspeech", "stopspformula", "stopspread", "stopstartstop", "stopstaticMPfigure", "stopstaticMPgraphic", "stopstrictinspectnextcharacter", "stopstructurepageregister", "stopstrut", "stopstyle", "stopsubformulas", "stopsubjectlevel", "stopsubsentence", "stopsubstack", "stopsymbolset", "stoptable", "stoptablehead", "stoptables", "stoptabletail", "stoptabulate", "stoptabulatehead", "stoptabulatetail", "stoptabulka", "stoptagged", "stoptbinom", "stoptema", "stoptexcode", "stoptexdefinition", "stoptext", "stoptextbackground", "stoptextbackgroundmanual", "stoptextcolor", "stoptextcolorintent", "stoptextflow", "stoptextnapovedy", "stoptextovalinka", "stoptitul", "stoptokens", "stoptransparent", "stoptypescript", "stoptypescriptcollection", "stopumistirovnici", "stopunderdash", "stopunderdashes", "stopunderdot", "stopunderdots", "stopunderrandom", "stopunderrandoms", "stopunderstrike", "stopunderstrikes", "stopunframed", "stopuniqueMPgraphic", "stopuniqueMPpagegraphic", "stopunpacked", "stopusableMPgraphic", "stopuseMPgraphic", "stopusemathstyleparameter", "stopusingbtxspecification", "stopvbox", "stopvboxregister", "stopvboxtohbox", "stopvboxtohboxseparator", "stopviewerlayer", "stopvtop", "stopvtopregister", "stopvycet", "stopxcell", "stopxcellgroup", "stopxfrac", "stopxgroup", "stopxmldisplayverbatim", "stopxmlinlineverbatim", "stopxmlraw", "stopxmlsetups", "stopxrow", "stopxrowgroup", "stopxtable", "stopxtablebody", "stopxtablefoot", "stopxtablehead", "stopxtablenext", "stopxxfrac", "stopzhustene", "strana", "strictdoifelsenextoptional", "strictdoifnextoptionalelse", "stripcharacter", "strippedcsname", "stripspaces", "structurelistuservariable", "structurenumber", "structuretitle", "structureuservariable", "structurevariable", "strut", "strutdp", "strutht", "struthtdp", "struttedbox", "strutwd", "style", "styleinstance", "subpagenumber", "subsentence", "substituteincommalist", "subtractfeature", "swapcounts", "swapdimens", "swapface", "swapmacros", "swaptypeface", "switchstyleonly", "switchtocolor", "switchtointerlinespace", "symbol", "symbolreference", "synchronizeblank", "synchronizeindenting", "synchronizemarking", "synchronizeoutputstreams", "synchronizestrut", "synchronizewhitespace", "systemlog", "systemlogfirst", "systemloglast", "systemsetups", "tLeftarrow", "tLeftrightarrow", "tRightarrow", "tabulateautoline", "tabulateautorule", "tabulateline", "tabulaterule", "tabulka", "taggedctxcommand", "taggedlabeltexts", "tbinom", "tbox", "tecky", "tema", "tenkalinka", "tenkelinky", "tequal", "testandsplitstring", "testcolumn", "testfeature", "testfeatureonce", "testpage", "testpageonly", "testpagesync", "testtokens", "tex", "texdefinition", "texsetup", "textcitation", "textcite", "textcontrolspace", "textflowcollector", "textmath", "textminus", "textnapovedy", "textormathchar", "textovalinka", "textplus", "textvisiblespace", "tfrac", "thainumerals", "thefirstcharacter", "thenormalizedbodyfontsize", "theremainingcharacters", "thickspace", "thinspace", "thirdoffivearguments", "thirdoffourarguments", "thirdofsixarguments", "thirdofthreearguments", "thirdofthreeunexpanded", "thookleftarrow", "thookrightarrow", "threedigitrounding", "tibetannumerals", "tightlayer", "tinyfont", "titul", "tlacitko", "tlacitkomenu", "tlap", "tleftarrow", "tleftharpoondown", "tleftharpoonup", "tleftrightarrow", "tleftrightharpoons", "tloustkacary", "tmapsto", "tochar", "tolinenote", "topbox", "topleftbox", "toplinebox", "toprightbox", "topskippedbox", "tracecatcodetables", "tracedfontname", "traceoutputroutines", "tracepositions", "transparencycomponents", "transparent", "tref", "trel", "trightarrow", "trightharpoondown", "trightharpoonup", "trightleftharpoons", "trightoverleftarrow", "triplebond", "truefilename", "truefontname", "ttriplerel", "ttwoheadleftarrow", "ttwoheadrightarrow", "tvrdamezera", "tvrdemezery", "twodigitrounding", "tx", "txx", "typebuffer", "typedefinedbuffer", "typeface", "typescriptone", "typescriptprefix", "typescriptthree", "typescripttwo", "typesetbuffer", "typesetfile", "uconvertnumber", "uedcatcodecommand", "ukazbarvu", "ukazmrizku", "ukaznastaveni", "ukazpaletu", "ukazpodpery", "ukazpostredizakladnihofontu", "ukazramecek", "ukazsadusymbolu", "ukazskupinubarev", "ukazupravu", "ukazvytisk", "ukazvzhled", "ukazzakladnifont", "umistikombinovanyseznam", "umistilokalnipoznamkypodcarou", "umistinadsebe", "umistinamrizku", "umistipodrovnici", "umistipoznamkypodcarou", "umistirejstrik", "umistirovnici", "umistiseznam", "umistivedlesebe", "umistizalozky", "undefinevalue", "undepthed", "underbar", "underbars", "underbartext", "underbrace", "underbracetext", "underbracket", "underbrackettext", "underdash", "underdashes", "underdot", "underdots", "underleftarrow", "underleftharpoondown", "underleftharpoonup", "underleftrightarrow", "underparent", "underparenttext", "underrandom", "underrandoms", "underrightarrow", "underrightharpoondown", "underrightharpoonup", "underset", "understrike", "understrikes", "undertwoheadleftarrow", "undertwoheadrightarrow", "undoassign", "unframed", "unhhbox", "unihex", "uniqueMPgraphic", "uniqueMPpagegraphic", "unprotected", "unregisterhyphenationpattern", "unspaceafter", "unspaceargument", "unspaced", "unspacestring", "untexargument", "untexcommand", "uppercased", "uppercasestring", "upperleftdoubleninequote", "upperleftdoublesixquote", "upperleftsingleninequote", "upperleftsinglesixquote", "upperrightdoubleninequote", "upperrightdoublesixquote", "upperrightsingleninequote", "upperrightsinglesixquote", "urcicharakteristikurejstriku", "url", "useMPenvironmentbuffer", "useMPgraphic", "useMPlibrary", "useMPrun", "useMPvariables", "useblankparameter", "usebodyfont", "usebodyfontparameter", "usebtxdataset", "usebtxdefinitions", "usecolors", "usecomponent", "usedummycolorparameter", "usedummystyleandcolor", "usedummystyleparameter", "useenvironment", "useexternalrendering", "usefigurebase", "usefile", "usegridparameter", "useindentingparameter", "useindentnextparameter", "useinterlinespaceparameter", "uselanguageparameter", "useluamodule", "usemathstyleparameter", "useproduct", "useprofileparameter", "useproject", "usereferenceparameter", "userpagenumber", "usesetupsparameter", "usestaticMPfigure", "usesubpath", "usetexmodule", "usetypescript", "usetypescriptfile", "usezipfile", "utfchar", "utflower", "utfupper", "utilityregisterlength", "uzijJSscripts", "uzijURL", "uzijadresar", "uzijbloky", "uzijexternidokument", "uzijexterniobraz", "uzijexternizvuk", "uzijmodul", "uzijsymbol", "uzijurl", "vboxreference", "verbatim", "verbatimstring", "verbosenumber", "verticalgrowingbar", "verticalpositionbar", "verze", "vglue", "viewerlayer", "vl", "vlasovalinka", "vphantom", "vpos", "vradku", "vsedniden", "vsmash", "vsmashbox", "vsmashed", "vspace", "vspacing", "vyberbloky", "vycet", "vyplnenytext", "vyplnovelinky", "vyplnovyradek", "vysoky", "wdofstring", "widthofstring", "widthspanningtext", "withoutpt", "word", "words", "wordtonumber", "writedatatolist", "writestatus", "xLeftarrow", "xLeftrightarrow", "xRightarrow", "xdefconvertedargument", "xequal", "xfrac", "xhookleftarrow", "xhookrightarrow", "xleftarrow", "xleftharpoondown", "xleftharpoonup", "xleftrightarrow", "xleftrightharpoons", "xmapsto", "xmladdindex", "xmlafterdocumentsetup", "xmlaftersetup", "xmlall", "xmlappenddocumentsetup", "xmlappendsetup", "xmlapplyselectors", "xmlatt", "xmlattdef", "xmlattribute", "xmlattributedef", "xmlbadinclusions", "xmlbeforedocumentsetup", "xmlbeforesetup", "xmlchainatt", "xmlchainattdef", "xmlchecknamespace", "xmlcommand", "xmlconcat", "xmlconcatrange", "xmlcontext", "xmlcount", "xmldefaulttotext", "xmldirectives", "xmldirectivesafter", "xmldirectivesbefore", "xmldisplayverbatim", "xmldoif", "xmldoifelse", "xmldoifelseempty", "xmldoifelseselfempty", "xmldoifelsetext", "xmldoifelsevalue", "xmldoifnot", "xmldoifnotselfempty", "xmldoifnottext", "xmldoifselfempty", "xmldoiftext", "xmlelement", "xmlfilter", "xmlfirst", "xmlflush", "xmlflushcontext", "xmlflushdocumentsetups", "xmlflushlinewise", "xmlflushpure", "xmlflushspacewise", "xmlflushtext", "xmlinclude", "xmlinclusion", "xmlinclusions", "xmlinfo", "xmlinjector", "xmlinlineverbatim", "xmlinstalldirective", "xmllast", "xmllastatt", "xmllastmatch", "xmlloadbuffer", "xmlloaddata", "xmlloaddirectives", "xmlloadfile", "xmlloadonly", "xmlmain", "xmlmapvalue", "xmlname", "xmlnamespace", "xmlnonspace", "xmlpath", "xmlpos", "xmlposition", "xmlprependdocumentsetup", "xmlprependsetup", "xmlprettyprint", "xmlprocessbuffer", "xmlprocessdata", "xmlprocessfile", "xmlpure", "xmlraw", "xmlrefatt", "xmlregistereddocumentsetups", "xmlregisteredsetups", "xmlregisterns", "xmlremapname", "xmlremapnamespace", "xmlremovedocumentsetup", "xmlremovesetup", "xmlresetdocumentsetups", "xmlresetinjectors", "xmlresetsetups", "xmlsave", "xmlsetentity", "xmlsetfunction", "xmlsetinjectors", "xmlsetsetup", "xmlsetup", "xmlshow", "xmlsnippet", "xmlstrip", "xmlstripnolines", "xmlstripped", "xmlstrippednolines", "xmltag", "xmltexentity", "xmltext", "xmltobuffer", "xmltobufferverbose", "xmltofile", "xmlvalue", "xmlverbatim", "xrel", "xrightarrow", "xrightharpoondown", "xrightharpoonup", "xrightleftharpoons", "xrightoverleftarrow", "xsplitstring", "xtriplerel", "xtwoheadleftarrow", "xtwoheadrightarrow", "xxfrac", "xypos", "zachovejbloky", "zadnamezera", "zadnehorniadolniradky", "zadnezahlaviaupati", "zalozka", "zapisdoseznamu", "zapismeziseznam", "zaramovani", "zasobnikpoli", "ziskejbuffer", "ziskejznaceni", "znaceni", "znak", "znaky", "zpracujbloky", "zrcadlit", "zref" }, - ["de"]={ "AMSTEX", "AfterPar", "Alphabeticnumerals", "AmSTeX", "And", "BeforePar", "Big", "Bigg", "Biggl", "Biggm", "Biggr", "Bigl", "Bigm", "Bigr", "Buchstabe", "Buchstaben", "CONTEXT", "Caps", "ConTeXt", "Context", "ConvertConstantAfter", "ConvertToConstant", "ETEX", "EveryLine", "EveryPar", "GetPar", "GotoPar", "Greeknumerals", "INRSTEX", "Kap", "LAMSTEX", "LATEX", "LUAJITTEX", "LUATEX", "LaTeX", "LamSTeX", "Lua", "LuaTeX", "LuajitTeX", "METAFONT", "METAFUN", "METAPOST", "MKII", "MKIV", "MKIX", "MKVI", "MKXI", "MONAT", "MONTHLONG", "MONTHSHORT", "MPII", "MPIV", "MPVI", "MPanchor", "MPbetex", "MPc", "MPcode", "MPcolor", "MPcoloronly", "MPcolumn", "MPd", "MPdrawing", "MPfontsizehskip", "MPgetmultipars", "MPgetmultishape", "MPgetposboxes", "MPh", "MPinclusions", "MPleftskip", "MPll", "MPlr", "MPls", "MPmenubuttons", "MPn", "MPoptions", "MPoverlayanchor", "MPp", "MPpage", "MPpardata", "MPplus", "MPpos", "MPpositiongraphic", "MPposset", "MPr", "MPrawvar", "MPregion", "MPrest", "MPrightskip", "MPrs", "MPstring", "MPtext", "MPtransparency", "MPul", "MPur", "MPv", "MPvar", "MPvariable", "MPvv", "MPw", "MPwhd", "MPx", "MPxy", "MPxywhd", "MPy", "MetaFont", "MetaFun", "MetaPost", "NormalizeFontHeight", "NormalizeFontWidth", "NormalizeTextHeight", "NormalizeTextWidth", "PDFETEX", "PDFTEX", "PDFcolor", "PICTEX", "PPCHTEX", "PPCHTeX", "PRAGMA", "PiCTeX", "PointsToBigPoints", "PointsToReal", "PointsToWholeBigPoints", "PtToCm", "ReadFile", "Roemischezahlen", "ScaledPointsToBigPoints", "ScaledPointsToWholeBigPoints", "Smallcapped", "TABLE", "TEX", "TEXpage", "TaBlE", "TeX", "TheNormalizedFontSize", "TransparencyHack", "VerboseNumber", "WOCHENTAG", "WOERTER", "WORT", "WidthSpanningText", "Woerter", "Wort", "XETEX", "XeTeX", "Ziffern", "abbildung", "abjadnaivenumerals", "abjadnodotnumerals", "abjadnumerals", "absatz", "activatespacehandler", "adaptcollector", "adaptfontfeature", "adaptpapersize", "addfeature", "addtoJSpreamble", "addtocommalist", "addvalue", "aftersplitstring", "aftertestandsplitstring", "alignmentcharacter", "allinputpaths", "alphabeticnumerals", "alwayscitation", "alwayscite", "amgitterausrichten", "ampersand", "anchor", "appendetoks", "appendgvalue", "appendtocommalist", "appendtoks", "appendtoksonce", "appendvalue", "apply", "applyalternativestyle", "applyprocessor", "applytocharacters", "applytofirstcharacter", "applytosplitstringchar", "applytosplitstringcharspaced", "applytosplitstringline", "applytosplitstringlinespaced", "applytosplitstringword", "applytosplitstringwordspaced", "applytowords", "arabicdecimals", "arabicexnumerals", "arabicnumerals", "arg", "asciistr", "aside", "assignalfadimension", "assigndimen", "assigndimension", "assignifempty", "assigntranslation", "assignvalue", "assignwidth", "assumelongusagecs", "astype", "attachment", "aufseite", "aufzaehlung", "ausfuelltext", "ausschnitt", "autocap", "autodirhbox", "autodirvbox", "autodirvtop", "autoinsertnextspace", "automathematics", "autosetups", "availablehsize", "averagecharwidth", "backgroundimage", "backgroundimagefill", "backgroundline", "basegrid", "baselineleftbox", "baselinemiddlebox", "baselinerightbox", "bbox", "bearbeitebloecke", "beforesplitstring", "beforetestandsplitstring", "behaltebloecke", "bei", "bemerkung", "benutzeverzeichnis", "beschriftung", "bestimmekopfnummer", "bestimmelistencharakeristika", "bestimmeregistercharakteristika", "big", "bigbodyfont", "bigg", "bigger", "biggl", "biggm", "biggr", "bigl", "bigm", "bigr", "bigskip", "bildschirm", "binom", "bitmapimage", "blanko", "blap", "bleed", "bleedheight", "bleedwidth", "blockligatures", "blockquote", "bodyfontenvironmentlist", "bodyfontsize", "bold", "boldface", "bolditalic", "boldslanted", "bookmark", "booleanmodevalue", "bottombox", "bottomleftbox", "bottomrightbox", "boxcursor", "boxmarker", "boxofsize", "boxreference", "bpos", "bthiddencitation", "btxabbreviatedjournal", "btxaddjournal", "btxalwayscitation", "btxauthorfield", "btxdetail", "btxdirect", "btxdoif", "btxdoifcombiinlistelse", "btxdoifelse", "btxdoifelsecombiinlist", "btxdoifelsesameasprevious", "btxdoifelsesameaspreviouschecked", "btxdoifelseuservariable", "btxdoifnot", "btxdoifsameaspreviouscheckedelse", "btxdoifsameaspreviouselse", "btxdoifuservariableelse", "btxexpandedjournal", "btxfield", "btxfieldname", "btxfieldtype", "btxfirstofrange", "btxflush", "btxflushauthor", "btxflushauthorinverted", "btxflushauthorinvertedshort", "btxflushauthorname", "btxflushauthornormal", "btxflushauthornormalshort", "btxflushsuffix", "btxfoundname", "btxfoundtype", "btxhybridcite", "btxlistcitation", "btxloadjournalist", "btxoneorrange", "btxremapauthor", "btxsavejournalist", "btxsetup", "btxsingularorplural", "btxsingularplural", "btxtextcitation", "buchstabe", "buchstaben", "calligraphic", "camel", "catcodetablename", "cbox", "centerbox", "centeredbox", "centerednextbox", "cfrac", "chardescription", "charwidthlanguage", "checkcharacteralign", "checkedchar", "checkedfiller", "checkedstrippedcsname", "checkinjector", "checknextindentation", "checknextinjector", "checkpage", "checkparameters", "checkpreviousinjector", "checksoundtrack", "checktwopassdata", "checkvariables", "chem", "chemical", "chemicalbottext", "chemicalmidtext", "chemicalsymbol", "chemicaltext", "chemicaltoptext", "chineseallnumerals", "chinesecapnumerals", "chinesenumerals", "citation", "cite", "clap", "classfont", "cldcommand", "cldcontext", "cldloadfile", "cldprocessfile", "cleftarrow", "collect", "collectedtext", "collectexpanded", "colorcomponents", "colored", "coloronly", "columnbreak", "combinepages", "commalistelement", "commalistsentence", "commalistsize", "comment", "comparedimension", "comparedimensioneps", "completebtxrendering", "completelist", "completelistofpublications", "completelistofsorts", "completelistofsynonyms", "completepagenumber", "completeregister", "complexorsimple", "complexorsimpleempty", "composedcollector", "composedlayer", "compresult", "constantdimen", "constantdimenargument", "constantemptyargument", "constantnumber", "constantnumberargument", "contentreference", "continuednumber", "continueifinputfile", "convertargument", "convertcommand", "convertedcounter", "converteddimen", "convertedsubcounter", "convertmonth", "convertvalue", "convertvboxtohbox", "copypages", "copyparameters", "copyposition", "countersubs", "counttoken", "counttokens", "cramped", "crampedclap", "crampedllap", "crampedrlap", "crightarrow", "crightoverleftarrow", "ctop", "ctxcommand", "ctxdirectcommand", "ctxdirectlua", "ctxfunction", "ctxlatecommand", "ctxlatelua", "ctxloadluafile", "ctxlua", "ctxluabuffer", "ctxluacode", "ctxreport", "ctxsprint", "currentassignmentlistkey", "currentassignmentlistvalue", "currentbtxuservariable", "currentcommalistitem", "currentcomponent", "currentenvironment", "currentfeaturetest", "currentinterface", "currentlanguage", "currentlistentrydestinationattribute", "currentlistentrylimitedtext", "currentlistentrynumber", "currentlistentrypagenumber", "currentlistentryreferenceattribute", "currentlistentrytitle", "currentlistentrytitlerendered", "currentlistsymbol", "currentmainlanguage", "currentmessagetext", "currentmoduleparameter", "currentoutputstream", "currentproduct", "currentproject", "currentregime", "currentregisterpageuserdata", "currentresponses", "currenttime", "currentvalue", "currentxtablecolumn", "currentxtablerow", "datasetvariable", "datum", "dayoftheweek", "dayspermonth", "dbinom", "decrement", "decrementcounter", "decrementedcounter", "decrementpagenumber", "decrementsubpagenumber", "decrementvalue", "defaultinterface", "defaultobjectpage", "defaultobjectreference", "defcatcodecommand", "defconvertedargument", "defconvertedcommand", "defconvertedvalue", "defineMPinstance", "defineTABLEsetup", "defineactivecharacter", "definealternativestyle", "defineanchor", "defineattachment", "defineattribute", "definebackground", "definebar", "definebodyfontswitch", "definebreakpoint", "definebreakpoints", "definebtx", "definebtxdataset", "definebtxregister", "definebtxrendering", "definebutton", "definecapitals", "definecharacterkerning", "definecharacterspacing", "definechemical", "definechemicals", "definechemicalsymbol", "definecollector", "definecolumnbreak", "definecombination", "definecomment", "definecomplexorsimple", "definecomplexorsimpleempty", "defineconversionset", "definecounter", "definedataset", "definedelimitedtext", "definedfont", "defineeffect", "defineexpandable", "defineexternalfigure", "definefallbackfamily", "definefieldbody", "definefieldbodyset", "definefieldcategory", "definefileconstant", "definefilefallback", "definefilesynonym", "definefiller", "definefirstline", "definefittingpage", "definefontalternative", "definefontfallback", "definefontfamily", "definefontfamilypreset", "definefontfeature", "definefontfile", "definefontsize", "definefontsolution", "defineformula", "defineformulaalternative", "defineformulaframed", "defineframedcontent", "definefrozenfont", "defineglobalcolor", "definegraphictypesynonym", "definegridsnapping", "defineheadalternative", "definehelp", "definehigh", "definehighlight", "definehspace", "definehypenationfeatures", "defineindentedtext", "defineindenting", "defineinitial", "defineinsertion", "defineinteraction", "defineinteractionbar", "defineinterfaceconstant", "defineinterfaceelement", "defineinterfacevariable", "defineinterlinespace", "defineintermediatecolor", "defineitemgroup", "defineitems", "definelabelclass", "definelayer", "definelayerpreset", "definelayout", "definelinefiller", "definelinenote", "definelinenumbering", "definelines", "definelistalternative", "definelistextra", "definelow", "definelowhigh", "definelowmidhigh", "definemarginblock", "definemargindata", "definemarker", "definemathalignment", "definemathcases", "definemathcommand", "definemathdoubleextensible", "definemathematics", "definemathextensible", "definemathfence", "definemathfraction", "definemathframed", "definemathmatrix", "definemathornament", "definemathoverextensible", "definemathovertextextensible", "definemathradical", "definemathstackers", "definemathstyle", "definemathtriplet", "definemathunderextensible", "definemathundertextextensible", "definemathunstacked", "definemeasure", "definemessageconstant", "definemixedcolumns", "definemode", "definemultitonecolor", "definenamedcolor", "definenamespace", "definenarrower", "definenote", "defineornament", "defineoutputroutine", "defineoutputroutinecommand", "definepage", "definepagebreak", "definepagechecker", "definepagegrid", "definepagegridarea", "definepagegridspan", "definepageinjection", "definepageinjectionalternative", "definepageshift", "definepagestate", "definepairedbox", "defineparagraph", "defineparallel", "defineparbuilder", "defineplacement", "definepositioning", "defineprefixset", "defineprocesscolor", "defineprocessor", "definepushbutton", "definepushsymbol", "definerenderingwindow", "defineresetset", "definescale", "defineschriftsynonym", "definescript", "definesectionlevels", "defineselector", "defineseparatorset", "defineshift", "definesidebar", "definesort", "definespotcolor", "definestyleinstance", "definesubformula", "definesynonym", "definesystemattribute", "definesystemconstant", "definesystemvariable", "definetabulation", "definetextbackground", "definetextflow", "definetooltip", "definetransparency", "definetwopasslist", "definetype", "definetypeface", "definetypescriptprefix", "definetypescriptsynonym", "definetypesetting", "defineunit", "defineviewerlayer", "definevspace", "definevspacing", "definevspacingamount", "definextable", "definiereabbsymbol", "definiereabsaetze", "definiereabschnitt", "definiereabschnittsblock", "definierebeschreibung", "definierebeschriftung", "definiereblock", "definierefarbe", "definierefarbengruppe", "definierefeld", "definierefeldstapel", "definierefliesstext", "definierefliesstextumgebung", "definieregleitobjekt", "definierehbox", "definiereinteraktionsmenue", "definierekonversion", "definierelabel", "definiereliste", "definieren", "definierenummerierung", "definiereoverlay", "definierepalette", "definierepapierformat", "definiereprofil", "definiereprogramme", "definierepuffer", "definierereferenz", "definierereferenzformat", "definiereregister", "definiereschrift", "definiereschriftstil", "definieresortieren", "definierestartstop", "definierestil", "definieresubfeld", "definieresymbol", "definieresynonyme", "definieretabellenvorlage", "definieretabulator", "definieretext", "definieretippen", "definiereueberschrift", "definiereumbruch", "definiereumrahmt", "definiereumrahmtertext", "definierezusammengestellteliste", "delimited", "delimitedtext", "depthofstring", "depthonlybox", "depthspanningtext", "determinenoflines", "devanagarinumerals", "dfrac", "digits", "dimensiontocount", "directcolor", "directcolored", "directconvertedcounter", "directdummyparameter", "directgetboxllx", "directgetboxlly", "directhighlight", "directlocalframed", "directluacode", "directselect", "directsetbar", "directsetup", "directsymbol", "directvspacing", "dis", "disabledirectives", "disableexperiments", "disablemode", "disableoutputstream", "disableparpositions", "disableregime", "disabletrackers", "displaymath", "displaymathematics", "displaymessage", "distributedhsize", "dividedsize", "doadaptleftskip", "doadaptrightskip", "doaddfeature", "doassign", "doassignempty", "doboundtext", "docheckassignment", "docheckedpagestate", "docheckedpair", "documentvariable", "dodoubleargument", "dodoubleargumentwithset", "dodoubleempty", "dodoubleemptywithset", "dodoublegroupempty", "doeassign", "doexpandedrecurse", "dogetattribute", "dogetattributeid", "dogetcommacommandelement", "dogobbledoubleempty", "dogobblesingleempty", "doif", "doifMPgraphicelse", "doifallcommon", "doifallcommonelse", "doifalldefinedelse", "doifallmodes", "doifallmodeselse", "doifassignmentelse", "doifblackelse", "doifbothsides", "doifbothsidesoverruled", "doifboxelse", "doifbufferelse", "doifcolor", "doifcolorelse", "doifcommandhandler", "doifcommandhandlerelse", "doifcommon", "doifcommonelse", "doifcontent", "doifconversiondefinedelse", "doifconversionnumberelse", "doifcounter", "doifcounterelse", "doifcurrentfonthasfeatureelse", "doifdefined", "doifdefinedcounter", "doifdefinedcounterelse", "doifdefinedelse", "doifdimensionelse", "doifdimenstringelse", "doifdocumentargument", "doifdocumentargumentelse", "doifdocumentfilename", "doifdocumentfilenameelse", "doifdrawingblackelse", "doifelse", "doifelseMPgraphic", "doifelseallcommon", "doifelsealldefined", "doifelseallmodes", "doifelseassignment", "doifelseblack", "doifelsebox", "doifelsebuffer", "doifelsecolor", "doifelsecommandhandler", "doifelsecommon", "doifelseconversiondefined", "doifelseconversionnumber", "doifelsecounter", "doifelsecurrentfonthasfeature", "doifelsecurrentsortingused", "doifelsecurrentsynonymshown", "doifelsecurrentsynonymused", "doifelsedefined", "doifelsedefinedcounter", "doifelsedimension", "doifelsedimenstring", "doifelsedocumentargument", "doifelsedocumentfilename", "doifelsedrawingblack", "doifelseempty", "doifelseemptyvalue", "doifelseemptyvariable", "doifelseenv", "doifelsefastoptionalcheck", "doifelsefastoptionalcheckcs", "doifelsefieldbody", "doifelsefieldcategory", "doifelsefigure", "doifelsefile", "doifelsefiledefined", "doifelsefileexists", "doifelsefirstchar", "doifelseflagged", "doifelsefontchar", "doifelsefontpresent", "doifelsefontsynonym", "doifelsehasspace", "doifelsehelp", "doifelseincsname", "doifelseinelement", "doifelseinputfile", "doifelseinsertion", "doifelseinset", "doifelseinstring", "doifelseinsymbolset", "doifelseintoks", "doifelseintwopassdata", "doifelseitalic", "doifelselanguage", "doifelselayerdata", "doifelselayoutdefined", "doifelselayoutsomeline", "doifelselayouttextline", "doifelseleapyear", "doifelselist", "doifelselocation", "doifelselocfile", "doifelsemainfloatbody", "doifelsemarking", "doifelsemeaning", "doifelsemessage", "doifelsemode", "doifelsenextbgroup", "doifelsenextbgroupcs", "doifelsenextchar", "doifelsenextoptional", "doifelsenextoptionalcs", "doifelsenextparenthesis", "doifelsenonzeropositive", "doifelsenoteonsamepage", "doifelsenothing", "doifelsenumber", "doifelseobjectfound", "doifelseobjectreferencefound", "doifelseoddpage", "doifelseoddpagefloat", "doifelseoldercontext", "doifelseolderversion", "doifelseoverlapping", "doifelseoverlay", "doifelseparallel", "doifelseparentfile", "doifelsepath", "doifelsepathexists", "doifelsepatterns", "doifelseposition", "doifelsepositionaction", "doifelsepositiononpage", "doifelsepositionsonsamepage", "doifelsepositionsonthispage", "doifelsepositionsused", "doifelsereferencefound", "doifelserightpagefloat", "doifelserighttoleftinbox", "doifelsesamelinereference", "doifelsesamestring", "doifelsesetups", "doifelsesomebackground", "doifelsesomespace", "doifelsesomething", "doifelsesometoks", "doifelsestringinstring", "doifelsestructurelisthasnumber", "doifelsestructurelisthaspage", "doifelsesymboldefined", "doifelsesymbolset", "doifelsetext", "doifelsetextflow", "doifelsetextflowcollector", "doifelsetypingfile", "doifelseundefined", "doifelseurldefined", "doifelsevalue", "doifelsevaluenothing", "doifelsevariable", "doifempty", "doifemptyelse", "doifemptytoks", "doifemptyvalue", "doifemptyvalueelse", "doifemptyvariable", "doifemptyvariableelse", "doifenv", "doifenvelse", "doiffastoptionalcheckcselse", "doiffastoptionalcheckelse", "doiffieldbodyelse", "doiffieldcategoryelse", "doiffigureelse", "doiffile", "doiffiledefinedelse", "doiffileelse", "doiffileexistselse", "doiffirstcharelse", "doifflaggedelse", "doiffontcharelse", "doiffontpresentelse", "doiffontsynonymelse", "doifhasspaceelse", "doifhelpelse", "doifincsnameelse", "doifinelementelse", "doifinputfileelse", "doifinsertionelse", "doifinset", "doifinsetelse", "doifinstring", "doifinstringelse", "doifinsymbolset", "doifinsymbolsetelse", "doifintokselse", "doifintwopassdataelse", "doifitalicelse", "doiflanguageelse", "doiflayerdataelse", "doiflayoutdefinedelse", "doiflayoutsomelineelse", "doiflayouttextlineelse", "doifleapyearelse", "doiflistelse", "doiflocationelse", "doiflocfileelse", "doifmainfloatbodyelse", "doifmarkingelse", "doifmeaningelse", "doifmessageelse", "doifmode", "doifmodeelse", "doifnextbgroupcselse", "doifnextbgroupelse", "doifnextcharelse", "doifnextoptionalcselse", "doifnextoptionalelse", "doifnextparenthesiselse", "doifnonzeropositiveelse", "doifnot", "doifnotallcommon", "doifnotallmodes", "doifnotcommandhandler", "doifnotcommon", "doifnotcounter", "doifnotdocumentargument", "doifnotdocumentfilename", "doifnotempty", "doifnotemptyvalue", "doifnotemptyvariable", "doifnotenv", "doifnoteonsamepageelse", "doifnotescollected", "doifnotfile", "doifnotflagged", "doifnothing", "doifnothingelse", "doifnotinset", "doifnotinsidesplitfloat", "doifnotinstring", "doifnotmode", "doifnotnumber", "doifnotsamestring", "doifnotsetups", "doifnotvalue", "doifnotvariable", "doifnumber", "doifnumberelse", "doifobjectfoundelse", "doifobjectreferencefoundelse", "doifoddpageelse", "doifoddpagefloatelse", "doifoldercontextelse", "doifolderversionelse", "doifoverlappingelse", "doifoverlayelse", "doifparallelelse", "doifparentfileelse", "doifpathelse", "doifpathexistselse", "doifpatternselse", "doifposition", "doifpositionaction", "doifpositionactionelse", "doifpositionelse", "doifpositiononpageelse", "doifpositionsonsamepageelse", "doifpositionsonthispageelse", "doifpositionsusedelse", "doifreferencefoundelse", "doifrightpagefloatelse", "doifrighttoleftinboxelse", "doifsamelinereferenceelse", "doifsamestring", "doifsamestringelse", "doifsetups", "doifsetupselse", "doifsomebackground", "doifsomebackgroundelse", "doifsomespaceelse", "doifsomething", "doifsomethingelse", "doifsometoks", "doifsometokselse", "doifstringinstringelse", "doifstructurelisthasnumberelse", "doifstructurelisthaspageelse", "doifsymboldefinedelse", "doifsymbolsetelse", "doiftext", "doiftextelse", "doiftextflowcollectorelse", "doiftextflowelse", "doiftypingfileelse", "doifundefined", "doifundefinedcounter", "doifundefinedelse", "doifurldefinedelse", "doifvalue", "doifvalueelse", "doifvaluenothing", "doifvaluenothingelse", "doifvaluesomething", "doifvariable", "doifvariableelse", "doindentation", "dollar", "doloop", "doloopoverlist", "donothing", "dontconvertfont", "dontleavehmode", "dontpermitspacesbetweengroups", "dopositionaction", "doprocesslocalsetups", "doquadrupleargument", "doquadrupleempty", "doquadruplegroupempty", "doquintupleargument", "doquintupleempty", "doquintuplegroupempty", "dorechecknextindentation", "dorecurse", "dorepeatwithcommand", "doreplacefeature", "doresetandafffeature", "doresetattribute", "dorotatebox", "dosetattribute", "dosetleftskipadaption", "dosetrightskipadaption", "dosetupcheckedinterlinespace", "doseventupleargument", "doseventupleempty", "dosingleargument", "dosingleempty", "dosinglegroupempty", "dosixtupleargument", "dosixtupleempty", "dostepwiserecurse", "dosubtractfeature", "dotfskip", "dotoks", "dotripleargument", "dotripleargumentwithset", "dotripleempty", "dotripleemptywithset", "dotriplegroupempty", "doublebar", "doublebond", "doublebrace", "doublebracket", "doubleparent", "dowith", "dowithnextbox", "dowithnextboxcontent", "dowithnextboxcontentcs", "dowithnextboxcs", "dowithpargument", "dowithrange", "dowithwargument", "dpofstring", "drehen", "duennelinie", "duennerumriss", "dummydigit", "dummyparameter", "eTeX", "edefconvertedargument", "efcmaxheight", "efcmaxwidth", "efcminheight", "efcminwidth", "efcparameter", "effect", "einezeile", "elapsedseconds", "elapsedtime", "eleftarrowfill", "eleftharpoondownfill", "eleftharpoonupfill", "eleftrightarrowfill", "emphasisboldface", "emphasistypeface", "emptylines", "emspace", "enabledirectives", "enableexperiments", "enablemode", "enableoutputstream", "enableparpositions", "enableregime", "enabletrackers", "enskip", "enspace", "env", "envvar", "eoverbarfill", "eoverbracefill", "eoverbracketfill", "eoverparentfill", "epos", "equaldigits", "erightarrowfill", "erightharpoondownfill", "erightharpoonupfill", "etwoheadrightarrowfill", "eunderbarfill", "eunderbracefill", "eunderbracketfill", "eunderparentfill", "executeifdefined", "exitloop", "exitloopnow", "expandcheckedcsname", "expanded", "expandfontsynonym", "externalfigurecollectionmaxheight", "externalfigurecollectionmaxwidth", "externalfigurecollectionminheight", "externalfigurecollectionminwidth", "externalfigurecollectionparameter", "externeabbildung", "fakebox", "farbbalken", "farbe", "farbewert", "fastdecrement", "fastincrement", "fastlocalframed", "fastscale", "fastsetup", "fastsetupwithargument", "fastsetupwithargumentswapped", "fastswitchtobodyfont", "fastsxsy", "feature", "feld", "feldstapel", "fence", "fenced", "festesspatium", "fetchallmarkings", "fetchallmarks", "fetchmark", "fetchmarking", "fetchonemark", "fetchonemarking", "fetchruntinecommand", "fetchtwomarkings", "fetchtwomarks", "fieldbody", "fifthoffivearguments", "fifthofsixarguments", "figurefilename", "figurefilepath", "figurefiletype", "figurefullname", "figureheight", "figurenaturalheight", "figurenaturalwidth", "figuresymbol", "figurewidth", "filename", "filledhboxb", "filledhboxc", "filledhboxg", "filledhboxk", "filledhboxm", "filledhboxr", "filledhboxy", "filler", "filterfromnext", "filterfromvalue", "filterpages", "filterreference", "findtwopassdata", "finishregisterentry", "firstcharacter", "firstcounter", "firstcountervalue", "firstoffivearguments", "firstoffourarguments", "firstofoneargument", "firstofoneunexpanded", "firstofsixarguments", "firstofthreearguments", "firstofthreeunexpanded", "firstoftwoarguments", "firstoftwounexpanded", "firstrealpage", "firstrealpagenumber", "firstsubcountervalue", "firstsubpage", "firstsubpagenumber", "firstuserpage", "firstuserpagenumber", "fitfieldframed", "fittopbaselinegrid", "flag", "floatuserdataparameter", "flushboxregister", "flushcollector", "flushlayer", "flushlocalfloats", "flushnextbox", "flushnotes", "flushoutputstream", "flushshapebox", "flushtextflow", "flushtokens", "flushtoks", "fontalternative", "fontbody", "fontchar", "fontcharbyindex", "fontclass", "fontclassname", "fontface", "fontfeaturelist", "fontsize", "fontstyle", "footnotetext", "forcecharacterstripping", "forcelocalfloats", "forgeteverypar", "forgetparameters", "format", "formelnummer", "formula", "foundbox", "fourthoffivearguments", "fourthoffourarguments", "fourthofsixarguments", "frac", "frameddimension", "framedparameter", "framedtext", "freezedimenmacro", "freezemeasure", "frenchspacing", "fromlinenote", "frozenhbox", "gdefconvertedargument", "gdefconvertedcommand", "gefuelltesrechteck", "gefuelltezeile", "gestreckt", "getMPdrawing", "getMPlayer", "getboxllx", "getboxlly", "getbufferdata", "getcommacommandsize", "getcommalistsize", "getdayoftheweek", "getdayspermonth", "getdefinedbuffer", "getdocumentargument", "getdocumentargumentdefault", "getdocumentfilename", "getdummyparameters", "getemptyparameters", "geteparameters", "getexpandedparameters", "getfiguredimensions", "getfirstcharacter", "getfirsttwopassdata", "getfromcommacommand", "getfromcommalist", "getfromtwopassdata", "getglyphdirect", "getglyphstyled", "getgparameters", "getlasttwopassdata", "getlocalfloat", "getlocalfloats", "getmessage", "getnamedglyphdirect", "getnamedglyphstyled", "getnamedtwopassdatalist", "getnaturaldimensions", "getnoflines", "getobject", "getobjectdimensions", "getpaletsize", "getparameters", "getprivatechar", "getprivateslot", "getrandomcount", "getrandomdimen", "getrandomfloat", "getrandomnumber", "getrandomseed", "getraweparameters", "getrawgparameters", "getrawnoflines", "getrawparameters", "getrawxparameters", "getreference", "getreferenceentry", "getroundednoflines", "getsubstring", "gettwopassdata", "gettwopassdatalist", "getuvalue", "getvalue", "getvariable", "getvariabledefault", "getxparameters", "gitter", "globaldisablemode", "globalenablemode", "globalletempty", "globalpopbox", "globalpopmacro", "globalpreventmode", "globalprocesscommalist", "globalpushbox", "globalpushmacro", "globalswapcounts", "globalswapdimens", "globalswapmacros", "globalundefine", "glyphfontfile", "gobbledoubleempty", "gobbleeightarguments", "gobblefivearguments", "gobblefiveoptionals", "gobblefourarguments", "gobblefouroptionals", "gobbleninearguments", "gobbleoneargument", "gobbleoneoptional", "gobblesevenarguments", "gobblesingleempty", "gobblesixarguments", "gobblespacetokens", "gobbletenarguments", "gobblethreearguments", "gobblethreeoptionals", "gobbletwoarguments", "gobbletwooptionals", "gobbleuntil", "gobbleuntilrelax", "grabbufferdata", "grabbufferdatadirect", "grabuntil", "grafik", "graufarbe", "grayvalue", "greedysplitstring", "greeknumerals", "groupedcommand", "gsetboxllx", "gsetboxlly", "gujaratinumerals", "gurmurkhinumerals", "haarlinie", "hairspace", "halfwaybox", "handletokens", "handwritten", "hash", "hauptsprache", "hboxofvbox", "hboxreference", "hdofstring", "headhbox", "headnumbercontent", "headnumberdistance", "headnumberwidth", "headreferenceattributes", "headsetupspacing", "headtextcontent", "headtextdistance", "headtextwidth", "headvbox", "headwidth", "heightanddepthofstring", "heightofstring", "heightspanningtext", "helptext", "heutigesdatum", "heutigeskopfnummer", "hglue", "hiddenbar", "hiddencitation", "hiddencite", "highlight", "highordinalstr", "hilfetext", "hilo", "himilo", "hintergrund", "hl", "hoch", "holebeschriftung", "holepuffer", "horizontalgrowingbar", "horizontalpositionbar", "hphantom", "hpos", "hsizefraction", "hsmash", "hsmashbox", "hsmashed", "hspace", "htdpofstring", "htofstring", "hyphen", "hyphenatedcoloredword", "hyphenatedfile", "hyphenatedfilename", "hyphenatedhbox", "hyphenatedpar", "hyphenatedurl", "hyphenatedword", "ibox", "ifassignment", "iff", "ifinobject", "ifinoutputstream", "ifparameters", "iftrialtypesetting", "ignoreimplicitspaces", "ignorevalue", "immaumrise", "immediatesavetwopassdata", "impliedby", "implies", "imumriss", "in", "includemenu", "includeversioninfo", "increment", "incrementcounter", "incrementedcounter", "incrementpagenumber", "incrementsubpagenumber", "incrementvalue", "indentation", "infofont", "infofontbold", "inheritparameter", "inhibitblank", "initializeboxstack", "inlinebuffer", "inlinedbox", "inlinemath", "inlinemathematics", "inlinemessage", "inlineordisplaymath", "inlinerange", "innerflushshapebox", "input", "inputfilebarename", "inputfilename", "inputfilerealsuffix", "inputfilesuffix", "inputgivenfile", "insertpages", "installactionhandler", "installactivecharacter", "installanddefineactivecharacter", "installattributestack", "installautocommandhandler", "installautosetuphandler", "installbasicautosetuphandler", "installbasicparameterhandler", "installbottomframerenderer", "installcommandhandler", "installcorenamespace", "installdefinehandler", "installdefinitionset", "installdefinitionsetmember", "installdirectcommandhandler", "installdirectparameterhandler", "installdirectparametersethandler", "installdirectsetuphandler", "installdirectstyleandcolorhandler", "installframedautocommandhandler", "installframedcommandhandler", "installieresprache", "installleftframerenderer", "installnamespace", "installoutputroutine", "installpagearrangement", "installparameterhandler", "installparameterhashhandler", "installparametersethandler", "installparentinjector", "installrightframerenderer", "installrootparameterhandler", "installsetuphandler", "installsetuponlycommandhandler", "installshipoutmethod", "installsimplecommandhandler", "installsimpleframedcommandhandler", "installstyleandcolorhandler", "installswitchcommandhandler", "installswitchsetuphandler", "installtexdirective", "installtextracker", "installtopframerenderer", "installunitsseparator", "installunitsspace", "installversioninfo", "integerrounding", "interaktionsbalken", "interaktionsknopfe", "interaktionsmenue", "intermezzo", "intertext", "invokepageheandler", "inzeile", "irgendwo", "istltdir", "istrtdir", "italic", "italicbold", "italiccorrection", "itemtag", "jobfilename", "jobfilesuffix", "kap", "kapitel", "keeplinestogether", "keepunwantedspaces", "keinekopfundfusszeilen", "keinspatium", "keinzeilenobenundunten", "kerncharacters", "klonierefeld", "knopf", "kommentar", "komponente", "konvertierezahl", "kopfnummer", "kopierefeld", "koreancirclenumerals", "koreannumerals", "koreannumeralsc", "koreannumeralsp", "koreanparentnumerals", "korrigierezwischenraum", "languageCharacters", "languagecharacters", "languagecharwidth", "lastcounter", "lastcountervalue", "lastdigit", "lastlinewidth", "lastnaturalboxdp", "lastnaturalboxht", "lastnaturalboxwd", "lastpredefinedsymbol", "lastrealpage", "lastrealpagenumber", "lastsubcountervalue", "lastsubpage", "lastsubpagenumber", "lasttwodigits", "lastuserpage", "lastuserpagenumber", "lateluacode", "layeredtext", "layerheight", "layerwidth", "lazysavetaggedtwopassdata", "lazysavetwopassdata", "lbox", "left", "leftbottombox", "leftbox", "lefthbox", "leftorrighthbox", "leftorrightvbox", "leftorrightvtop", "leftskipadaption", "leftsubguillemot", "lefttopbox", "lefttorighthbox", "lefttorightvbox", "lefttorightvtop", "letbeundefined", "letcatcodecommand", "letcscsname", "letcsnamecs", "letcsnamecsname", "letdummyparameter", "letempty", "letgvalue", "letgvalueempty", "letgvalurelax", "letterampersand", "letterat", "letterbackslash", "letterbar", "letterbgroup", "letterclosebrace", "lettercolon", "letterdollar", "letterdoublequote", "letteregroup", "letterescape", "letterexclamationmark", "letterhash", "letterhat", "letterleftbrace", "letterless", "lettermore", "letteropenbrace", "letterpercent", "letterquestionmark", "letterrightbrace", "lettersinglequote", "letterslash", "letterspacing", "lettertilde", "letterunderscore", "letvalue", "letvalueempty", "letvaluerelax", "lfence", "lhbox", "limitatelines", "limitatetext", "limtatefirstline", "linespanningtext", "liniendicke", "listcitation", "listcite", "listenlaenge", "listnamespaces", "llap", "loadanyfile", "loadanyfileonce", "loadbtxdefinitionfile", "loadbtxreplacementfile", "loadcldfile", "loadcldfileonce", "loadfontgoodies", "loadluafile", "loadluafileonce", "loadspellchecklist", "loadtexfile", "loadtexfileonce", "loadtypescriptfile", "localframed", "localframedwithsettings", "localhsize", "localpopbox", "localpopmacro", "localpushbox", "localpushmacro", "localundefine", "locatedfilepath", "locatefilepath", "locfilename", "lomihi", "lowerbox", "lowercased", "lowercasestring", "lowerleftdoubleninequote", "lowerleftsingleninequote", "lowerrightdoubleninequote", "lowerrightsingleninequote", "lrtbbox", "ltop", "luaTeX", "luacode", "luaconditional", "luaenvironment", "luaexpanded", "luafunction", "luajitTeX", "luamajorversion", "luaminorversion", "luaparameterset", "luasetup", "luaversion", "m", "mLeftarrow", "mLeftrightarrow", "mRightarrow", "makecharacteractive", "makerawcommalist", "makestrutofbox", "mapfontsize", "margindata", "markcontent", "markinjector", "mat", "math", "mathbf", "mathbi", "mathblackboard", "mathbs", "mathcommand", "mathdefault", "mathematik", "mathfraktur", "mathfunction", "mathit", "mathitalic", "mathop", "mathrm", "mathscript", "mathsl", "mathss", "mathtext", "mathtextbf", "mathtextbi", "mathtextbs", "mathtextit", "mathtextsl", "mathtexttf", "mathtf", "mathtriplet", "mathtt", "mathupright", "mathword", "mathwordbf", "mathwordbi", "mathwordbs", "mathwordit", "mathwordsl", "mathwordtf", "maumrise", "mbox", "mcframed", "md", "measure", "measured", "medskip", "medspace", "menueknopf", "mequal", "message", "metaTeX", "mfence", "mfunction", "mfunctionlabeltext", "mhbox", "mhookleftarrow", "mhookrightarrow", "middle", "middlebox", "midhbox", "minimalhbox", "mixedcaps", "mkvibuffer", "mleftarrow", "mleftharpoondown", "mleftharpoonup", "mleftrightarrow", "mleftrightharpoons", "mmapsto", "moduleparameter", "molecule", "monat", "mono", "monobold", "mononormal", "monthlong", "monthshort", "mp", "mprandomnumber", "mrel", "mrightarrow", "mrightharpoondown", "mrightharpoonup", "mrightleftharpoons", "mrightoverleftarrow", "mtext", "mtriplerel", "mtwoheadleftarrow", "mtwoheadrightarrow", "nachunten", "namedheadnumber", "namedstructureheadlocation", "namedstructureuservariable", "namedstructurevariable", "namedtaggedlabeltexts", "naturalhbox", "naturalhpack", "naturalvbox", "naturalvcenter", "naturalvpack", "naturalvtop", "naturalwd", "negatecolorbox", "negated", "negthinspace", "newattribute", "newcatcodetable", "newcounter", "newevery", "newfrenchspacing", "newmode", "newsignal", "newsystemmode", "nextbox", "nextboxdp", "nextboxht", "nextboxhtdp", "nextboxwd", "nextcounter", "nextcountervalue", "nextdepth", "nextparagraphs", "nextrealpage", "nextrealpagenumber", "nextsubcountervalue", "nextsubpage", "nextsubpagenumber", "nextuserpage", "nextuserpagenumber", "nobar", "nocitation", "nocite", "nodetostring", "noffigurepages", "noflines", "noflocalfloats", "noindentation", "noitem", "nokap", "nonfrenchspacing", "nonmathematics", "normal", "normalboldface", "normalframedwithsettings", "normalizebodyfontsize", "normalizedfontsize", "normalizefontdepth", "normalizefontheight", "normalizefontline", "normalizefontwidth", "normalizetextdepth", "normalizetextheight", "normalizetextline", "normalizetextwidth", "normaltypeface", "notesymbol", "notiz", "ntimes", "numberofpoints", "obeydepth", "objectdepth", "objectheight", "objectmargin", "objectwidth", "obox", "offset", "offsetbox", "onedigitrounding", "ordinaldaynumber", "ordinalstr", "ornamenttext", "outputfilename", "outputstreambox", "outputstreamcopy", "outputstreamunvbox", "outputstreamunvcopy", "over", "overbar", "overbars", "overbartext", "overbarunderbar", "overbrace", "overbracetext", "overbraceunderbrace", "overbracket", "overbrackettext", "overbracketunderbracket", "overlaybutton", "overlaycolor", "overlaydepth", "overlayfigure", "overlayheight", "overlaylinecolor", "overlaylinewidth", "overlayoffset", "overlayrollbutton", "overlaywidth", "overleftarrow", "overleftharpoondown", "overleftharpoonup", "overleftrightarrow", "overloaderror", "overparent", "overparenttext", "overparentunderparent", "overrightarrow", "overrightharpoondown", "overrightharpoonup", "overset", "overstrike", "overstrikes", "overtwoheadleftarrow", "overtwoheadrightarrow", "pagearea", "pagebreak", "pagefigure", "pagegridspanwidth", "pageinjection", "pagestaterealpage", "paletsize", "passelayoutan", "passendfeld", "pdfTeX", "pdfactualtext", "pdfbackendactualtext", "pdfbackendcurrentresources", "pdfbackendsetcatalog", "pdfbackendsetcolorspace", "pdfbackendsetextgstate", "pdfbackendsetinfo", "pdfbackendsetname", "pdfbackendsetpageattribute", "pdfbackendsetpageresource", "pdfbackendsetpagesattribute", "pdfbackendsetpattern", "pdfbackendsetshade", "pdfcolor", "pdfeTeX", "percent", "percentdimen", "permitcaretescape", "permitcircumflexescape", "permitspacesbetweengroups", "persiandecimals", "persiannumerals", "phantom", "phantombox", "pickupgroupedcommand", "placeattachments", "placebtxrendering", "placecitation", "placecomments", "placecurrentformulanumber", "placedbox", "placefloat", "placefloatwithsetups", "placeframed", "placeheadnumber", "placeheadtext", "placehelp", "placeinitial", "placelayer", "placelayeredtext", "placelistofpublications", "placelistofsorts", "placelistofsynonyms", "placelocalnotes", "placement", "placenamedfloat", "placenamedformula", "placenotes", "placepagenumber", "placepairedbox", "placeparallel", "placerawlist", "placerenderingwindow", "platzierebookmarks", "platziereformel", "platzierefussnoten", "platziereliste", "platzierelokalefussnoten", "platzierenebeneinander", "platziereregister", "platziereuntereinander", "platziereunterformel", "platzierezusammengestellteliste", "popattribute", "popmacro", "popmode", "popsystemmode", "pos", "position", "positionoverlay", "positionregionoverlay", "posten", "postponenotes", "predefinedfont", "predefinefont", "predefinesymbol", "prefixedpagenumber", "prependetoks", "prependgvalue", "prependtocommalist", "prependtoks", "prependtoksonce", "prependvalue", "presetdocument", "presetfieldsymbols", "pretocommalist", "prevcounter", "prevcountervalue", "preventmode", "prevrealpage", "prevrealpagenumber", "prevsubcountervalue", "prevsubpage", "prevsubpagenumber", "prevuserpage", "prevuserpagenumber", "procent", "processMPbuffer", "processMPfigurefile", "processaction", "processallactionsinset", "processassignlist", "processassignmentcommand", "processassignmentlist", "processbetween", "processbodyfontenvironmentlist", "processcolorcomponents", "processcommacommand", "processcommalist", "processcommalistwithparameters", "processcontent", "processfile", "processfilemany", "processfilenone", "processfileonce", "processfirstactioninset", "processisolatedchars", "processisolatedwords", "processlinetablebuffer", "processlinetablefile", "processlist", "processmonth", "processranges", "processseparatedlist", "processtexbuffer", "processtokens", "processuntil", "processxtablebuffer", "processyear", "produkt", "profiledbox", "profilegivenbox", "programm", "projekt", "pseudoMixedCapped", "pseudoSmallCapped", "pseudoSmallcapped", "pseudosmallcapped", "punkt", "purenumber", "pushattribute", "pushbutton", "pushmacro", "pushmode", "pushoutputstream", "pushsystemmode", "qquad", "quad", "quads", "quitcommalist", "quitprevcommalist", "quittypescriptscanning", "raisebox", "randomizetext", "randomnumber", "rawcounter", "rawcountervalue", "rawdate", "rawdoifelseinset", "rawdoifinset", "rawdoifinsetelse", "rawgetparameters", "rawprocessaction", "rawprocesscommacommand", "rawprocesscommalist", "rawstructurelistuservariable", "rawsubcountervalue", "rbox", "readfile", "readfixfile", "readjobfile", "readlocfile", "readsetfile", "readsysfile", "readtexfile", "readxmlfile", "realSmallCapped", "realSmallcapped", "realpagenumber", "realsmallcapped", "rechteck", "rechtecke", "recursedepth", "recurselevel", "recursestring", "redoconvertfont", "ref", "referenceprefix", "referenz", "referieren", "registerattachment", "registerctxluafile", "registerexternalfigure", "registerfontclass", "registerhyphenationexception", "registerhyphenationpattern", "registermenubuttons", "registersort", "registersynonym", "registerunit", "regular", "relatemarking", "relateparameterhandlers", "relaxvalueifundefined", "remainingcharacters", "removebottomthings", "removedepth", "removefromcommalist", "removelastskip", "removelastspace", "removemarkedcontent", "removepunctuation", "removesubstring", "removetoks", "removeunwantedspaces", "replacefeature", "replaceincommalist", "replaceword", "rescan", "rescanwithsetup", "resetMPdrawing", "resetMPenvironment", "resetMPinstance", "resetallattributes", "resetandaddfeature", "resetbar", "resetbreakpoints", "resetbuffer", "resetcharacteralign", "resetcharacterkerning", "resetcharacterspacing", "resetcharacterstripping", "resetcollector", "resetcounter", "resetdigitsmanipulation", "resetdirection", "resetfeature", "resetflag", "resetfontcolorsheme", "resetfontfallback", "resetfontsolution", "resethyphenationfeatures", "resetinjector", "resetinteractionmenu", "resetitaliccorrection", "resetlayer", "resetlocalfloats", "resetmarker", "resetmode", "resetpagenumber", "resetparallel", "resetpath", "resetpenalties", "resetprofile", "resetreference", "resetreplacement", "resetscript", "resetsetups", "resetshownsynonyms", "resetsubpagenumber", "resetsymbolset", "resetsystemmode", "resettimer", "resettrackers", "resettrialtypesetting", "resetusedsortings", "resetusedsynonyms", "resetuserpagenumber", "resetvalue", "resetvisualizers", "reshapebox", "resolvedglyphdirect", "resolvedglyphstyled", "restartcounter", "restorebox", "restorecatcodes", "restorecounter", "restorecurrentattributes", "restoreendofline", "restoreglobalbodyfont", "reusableMPgraphic", "reuseMPgraphic", "reuserandomseed", "revivefeature", "rfence", "rhbox", "right", "rightbottombox", "rightbox", "righthbox", "rightorleftpageaction", "rightskipadaption", "rightsubguillemot", "righttolefthbox", "righttoleftvbox", "righttoleftvtop", "righttopbox", "rlap", "robustaddtocommalist", "robustdoifelseinset", "robustdoifinsetelse", "robustpretocommalist", "roemischezahlen", "rollbutton", "roman", "rtop", "ruecksetztenbeschriftung", "ruledhbox", "ruledhpack", "ruledmbox", "ruledtopv", "ruledtpack", "ruledvbox", "ruledvpack", "ruledvtop", "runMPbuffer", "runninghbox", "safechar", "sans", "sansbold", "sansnormal", "sansserif", "savebox", "savebtxdataset", "savebuffer", "savecounter", "savecurrentattributes", "savenormalmeaning", "savetaggedtwopassdata", "savetwopassdata", "sbox", "schreibezurliste", "schreibezwischenliste", "sd", "secondoffivearguments", "secondoffourarguments", "secondofsixarguments", "secondofthreearguments", "secondofthreeunexpanded", "secondoftwoarguments", "secondoftwounexpanded", "seite", "seitenreferenz", "seitenummer", "select", "serializecommalist", "serializedcommalist", "serif", "serifbold", "serifnormal", "setJSpreamble", "setMPlayer", "setMPpositiongraphic", "setMPpositiongraphicrange", "setMPtext", "setMPvariable", "setMPvariables", "setbar", "setbigbodyfont", "setboxllx", "setboxlly", "setbreakpoints", "setcapstrut", "setcatcodetable", "setcharacteralign", "setcharactercasing", "setcharactercleaning", "setcharacterkerning", "setcharacterspacing", "setcharacterstripping", "setcharstrut", "setcollector", "setcolormodell", "setcounter", "setcounterown", "setcurrentfontclass", "setdataset", "setdefaultpenalties", "setdigitsmanipulation", "setdirection", "setdocumentargument", "setdocumentargumentdefault", "setdocumentfilename", "setdummyparameter", "setelementexporttag", "setemeasure", "setevalue", "setevariable", "setevariables", "setfirstline", "setflag", "setfont", "setfontcolorsheme", "setfontfeature", "setfontsolution", "setfontstrut", "setfractions", "setgmeasure", "setgvalue", "setgvariable", "setgvariables", "sethboxregister", "sethyphenatedurlafter", "sethyphenatedurlbefore", "sethyphenatedurlnormal", "sethyphenationfeatures", "setinitial", "setinjector", "setinteraction", "setinterfacecommand", "setinterfaceconstant", "setinterfaceelements", "setinterfacemessage", "setinterfacevariable", "setinternalrendering", "setitaliccorrection", "setlayer", "setlayerframed", "setlayertext", "setlinefiller", "setlocalhsize", "setmainbodyfont", "setmainparbuilder", "setmarker", "setmarking", "setmathstyle", "setmeasure", "setmessagetext", "setmode", "setnostrut", "setnote", "setnotetext", "setobject", "setoldstyle", "setpagegrid", "setpagereference", "setpagestate", "setpagestaterealpageno", "setpenalties", "setpercentdimen", "setposition", "setpositionbox", "setpositiondata", "setpositiondataplus", "setpositiononly", "setpositionplus", "setpositionstrut", "setprofile", "setrandomseed", "setreference", "setreferencedobject", "setregisterentry", "setreplacement", "setrigidcolumnbalance", "setrigidcolumnhsize", "setscript", "setsectionblock", "setsimplecolumnhsize", "setsmallbodyfont", "setsmallcaps", "setstackbox", "setstructurepageregister", "setstrut", "setsuperiors", "setsystemmode", "settabular", "settaggedmetadata", "settext", "settightobject", "settightreferencedobject", "settightunreferencedobject", "settrialtypesetting", "setuevalue", "setugvalue", "setunreferencedobject", "setup", "setupMPgraphics", "setupMPinstance", "setupMPpage", "setupMPvariables", "setupTABLE", "setupTEXpage", "setupattachment", "setupbackend", "setupbar", "setupbleeding", "setupbookmark", "setupbtx", "setupbtxdataset", "setupbtxlist", "setupbtxregister", "setupbtxrendering", "setupbutton", "setupcharacterkerning", "setupcharacterspacing", "setupchemical", "setupchemicalframed", "setupcollector", "setupcolumnspan", "setupcombination", "setupcounter", "setupdataset", "setupdelimitedtext", "setupdescription", "setupdirections", "setupdocument", "setupeffect", "setupenumeration", "setupenv", "setupexport", "setupexternalfigure", "setupexternalsoundtracks", "setupfieldbody", "setupfieldcategory", "setupfieldcontentframed", "setupfieldlabelframed", "setupfieldtotalframed", "setupfiller", "setupfirstline", "setupfittingpage", "setupfloatcaption", "setupfontexpansion", "setupfontprotrusion", "setupfonts", "setupfontsolution", "setupforms", "setupformula", "setupformulaframed", "setupframedcontent", "setupframedtext", "setupglobalreferenceprefix", "setupheadalternative", "setuphelp", "setuphigh", "setuphighlight", "setuphyphenation", "setupindentedtext", "setupinitial", "setupinsertion", "setupitaliccorrection", "setupitemgroup", "setuplabel", "setuplayer", "setuplayeredtext", "setuplayouttext", "setuplinefiller", "setuplinefillers", "setuplinenote", "setuplinetable", "setuplistalternative", "setuplistextra", "setuplocalfloats", "setuplocalinterlinespace", "setuplow", "setuplowhigh", "setuplowmidhigh", "setupmarginblock", "setupmargindata", "setupmarginframed", "setupmarginrule", "setupmathalignment", "setupmathcases", "setupmathematics", "setupmathfence", "setupmathfraction", "setupmathframed", "setupmathmatrix", "setupmathornament", "setupmathradical", "setupmathstackers", "setupmathstyle", "setupmixedcolumns", "setupmodule", "setupnotation", "setupnotations", "setupnote", "setupnotes", "setupoffset", "setupoffsetbox", "setupoutputroutine", "setuppagechecker", "setuppagegrid", "setuppagegridarea", "setuppagegridareatext", "setuppagegridlines", "setuppagegridspan", "setuppagegridstart", "setuppageinjection", "setuppageinjectionalternative", "setuppageshift", "setuppagestate", "setuppairedbox", "setuppaper", "setupparagraph", "setupparagraphintro", "setupparallel", "setupperiods", "setupplacement", "setuppositionbar", "setupprocessor", "setupprofile", "setupquotation", "setuprealpagenumber", "setupreferenceformat", "setupreferenceprefix", "setupreferencestructureprefix", "setupregisters", "setuprenderingwindow", "setups", "setupscale", "setupscript", "setupscripts", "setupselector", "setupshift", "setupsidebar", "setupspellchecking", "setupstartstop", "setupstretched", "setupstruts", "setupstyle", "setupsubformula", "setuptabulation", "setuptagging", "setuptextbackground", "setuptextflow", "setuptooltip", "setupunit", "setupuserpagenumber", "setupversion", "setupviewerlayer", "setupvspacing", "setupwithargument", "setupwithargumentswapped", "setupxml", "setupxtable", "setuvalue", "setuxvalue", "setvalue", "setvariable", "setvariables", "setvboxregister", "setvisualizerfont", "setvtopregister", "setwidthof", "setxmeasure", "setxvalue", "setxvariable", "setxvariables", "sfrac", "shapedhbox", "showallmakeup", "showattributes", "showboxes", "showbtxdatasetauthors", "showbtxdatasetcompleteness", "showbtxdatasetfields", "showbtxfields", "showbtxhashedauthors", "showbtxtables", "showchardata", "showcharratio", "showcolorbar", "showcolorcomponents", "showcolorset", "showcolorstruts", "showcounter", "showdirectives", "showdirsinmargin", "showedebuginfo", "showexperiments", "showfont", "showfontdata", "showfontkerns", "showfontparameters", "showfontstrip", "showfontstyle", "showglyphs", "showgridsnapping", "showhelp", "showhyphenationtrace", "showhyphens", "showinjector", "showjustification", "showkerning", "showlayoutcomponents", "showligature", "showligatures", "showlogcategories", "showmargins", "showmessage", "showminimalbaseline", "shownextbox", "showotfcomposition", "showparentchain", "showsetupsdefinition", "showsymbolset", "showtimer", "showtokens", "showtrackers", "showvalue", "showvariable", "showwarning", "simplegroupedcommand", "singalcharacteralign", "singlebond", "sixthofsixarguments", "slanted", "slantedbold", "slicepages", "slovenianNumerals", "sloveniannumerals", "small", "smallbodyfont", "smallbold", "smallbolditalic", "smallboldslanted", "smallcappedcharacters", "smallcappedromannumerals", "smaller", "smallitalicbold", "smallnormal", "smallskip", "smallslanted", "smallslantedbold", "smalltype", "smash", "smashbox", "smashboxed", "smashedhbox", "smashedvbox", "snaptogrid", "someheadnumber", "somekindoftab", "somelocalfloat", "somenamedheadnumber", "someplace", "sp", "spalte", "spanishNumerals", "spanishnumerals", "spatium", "speech", "spiegeln", "splitatasterisk", "splitatcolon", "splitatcolons", "splitatcomma", "splitdfrac", "splitfilename", "splitfrac", "splitoffbase", "splitofffull", "splitoffkind", "splitoffname", "splitoffpath", "splitoffroot", "splitofftokens", "splitofftype", "splitstring", "sprache", "spreadhbox", "sqrt", "stackrel", "startJScode", "startJSpreamble", "startMPclip", "startMPcode", "startMPdefinitions", "startMPdrawing", "startMPenvironment", "startMPextensions", "startMPinclusions", "startMPinitializations", "startMPpage", "startMPpositiongraphic", "startMPpositionmethod", "startMPrun", "startTABLE", "startTABLEbody", "startTABLEfoot", "startTABLEhead", "startTABLEnext", "startTC", "startTD", "startTDs", "startTEXpage", "startTH", "startTN", "startTR", "startTRs", "startTX", "startTY", "startabbildung", "startabsatz", "startallmodes", "startarrangedpages", "startaside", "startattachment", "startaufzaehlung", "startbar", "startbinom", "startbitmapimage", "startblockquote", "startbtxrenderingdefinitions", "startbuffer", "startbutton", "startcatcodetable", "startcharacteralign", "startcheckedfences", "startchemical", "startcollect", "startcollecting", "startcolorintent", "startcoloronly", "startcolorset", "startcolumns", "startcolumnspan", "startcombination", "startcomment", "startcontextcode", "startcontextdefinitioncode", "startctxfunction", "startctxfunctiondefinition", "startcurrentcolor", "startcurrentlistentrywrapper", "startdbinom", "startdelimited", "startdelimitedtext", "startdfrac", "startdisplaymath", "startdmath", "startdocument", "startdurchgestrichen", "startdurchstreichen", "starteffect", "startelement", "startembeddedxtable", "startendofline", "startexceptions", "startexpanded", "startexpandedcollect", "startextendedcatcodetable", "startexternalfigurecollection", "startfarbe", "startfigure", "startfitfieldframed", "startfittingpage", "startfloatcombination", "startfont", "startfontclass", "startfontsolution", "startformula", "startformulas", "startfrac", "startframedcontent", "startframedtext", "startgrafik", "startgridsnapping", "starthbox", "starthboxestohbox", "starthboxregister", "starthelptext", "starthiddenbar", "starthiding", "starthighlight", "starthilfetext", "starthintergrund", "starthyphenation", "startimath", "startindentation", "startindentedtext", "startinmframed", "startinteraction", "startinteraktionsmenue", "startinterface", "startintermezzo", "startintertext", "startitemgroup", "startkapitel", "startkleinerdurchschuss", "startknockout", "startkommentar", "startkomponente", "startkopf", "startlayout", "startlinecorrection", "startlinefiller", "startlinenumbering", "startlinetable", "startlinetablebody", "startlinetablecell", "startlinetablehead", "startlocalfootnotes", "startlocalheadsetup", "startlocallinecorrection", "startlocalnotes", "startlocalsetups", "startlua", "startluacode", "startluaparameterset", "startluasetups", "startmakeup", "startmarginallinie", "startmarginblock", "startmarkedcontent", "startmathmode", "startmathstyle", "startmatrices", "startmcframed", "startmdformula", "startmframed", "startmixedcolumns", "startmode", "startmodeset", "startmodule", "startmoduletestsection", "startmpformula", "startnamedsection", "startnamedsubformulas", "startnarrow", "startnarrower", "startnegative", "startnicelyfilledbox", "startnobar", "startnointerference", "startnotallmodes", "startnotext", "startnotmode", "startopposite", "startoutputstream", "startoverlay", "startoverprint", "startpagecomment", "startpagefigure", "startpagegrid", "startpagegridspan", "startpagelayout", "startpar", "startparagraph", "startparagraphs", "startparagraphscell", "startparbuilder", "startpath", "startplacepairedbox", "startplatziereformel", "startpos", "startpositioning", "startpositionoverlay", "startpositive", "startpostponing", "startprocessassignmentcommand", "startprocessassignmentlist", "startprocesscommacommand", "startprocesscommalist", "startprodukt", "startprojekt", "startprotect", "startprotectedcolors", "startpublikation", "startpunctuation", "startrandomized", "startrandomseed", "startrawsetups", "startreadingfile", "startreferenceprefix", "startregime", "startregister", "startreusableMPgraphic", "startscript", "startsdformula", "startsectionblock", "startsectionblockenvironment", "startsectionlevel", "startsetups", "startsfrac", "startshapebox", "startshift", "startsidebar", "startsimplecolumns", "startspecialitem", "startspeech", "startspformula", "startspread", "startstartstop", "startstaticMPfigure", "startstaticMPgraphic", "startstrictinspectnextcharacter", "startstructurepageregister", "startstrut", "startstyle", "startsubformulas", "startsubjectlevel", "startsubsentence", "startsubstack", "startsymbolset", "starttabelle", "starttable", "starttablehead", "starttables", "starttabletail", "starttabulate", "starttabulatehead", "starttabulatetail", "starttagged", "starttbinom", "starttexcode", "starttexdefinition", "starttext", "starttextbackground", "starttextbackgroundmanual", "starttextcolor", "starttextcolorintent", "starttextflow", "starttextlinie", "startthema", "starttitel", "starttokens", "starttransparent", "starttypescript", "starttypescriptcollection", "startueberstreichen", "startueberstrichen", "startumgebung", "startumrahmt", "startumrahmtertext", "startunderdash", "startunderdashes", "startunderdot", "startunderdots", "startunderrandom", "startunderrandoms", "startunderstrike", "startunderstrikes", "startunframed", "startuniqueMPgraphic", "startuniqueMPpagegraphic", "startunpacked", "startunterabsatz", "startunterstreichen", "startunterstrichen", "startunterthema", "startunterunterabsatz", "startunterunterthema", "startunterunterunterabsatz", "startunterunterunterthema", "startunterunterunterunterabsatz", "startunterunterunterunterthema", "startusableMPgraphic", "startuseMPgraphic", "startusemathstyleparameter", "startusingbtxspecification", "startvbox", "startvboxregister", "startvboxtohbox", "startvboxtohboxseparator", "startviewerlayer", "startvtop", "startvtopregister", "startxcell", "startxcellgroup", "startxfrac", "startxgroup", "startxmldisplayverbatim", "startxmlinlineverbatim", "startxmlraw", "startxmlsetups", "startxrow", "startxrowgroup", "startxtable", "startxtablebody", "startxtablefoot", "startxtablehead", "startxtablenext", "startxxfrac", "startzeile", "startzitat", "startzitieren", "startzu", "stelleabsaetzeein", "stelleabsatznummerierungein", "stelleabschnittsblockein", "stelleanordnenein", "stelleaufzaehlungenein", "stelleausschnittein", "stellebeschriftungein", "stellebildunterschriftein", "stellebindestrichein", "stelleblankoein", "stelleblockein", "stelledrehenein", "stelleduennerumrissein", "stelleeinziehenein", "stelleengerein", "stellefarbeein", "stellefarbenein", "stellefeldein", "stellefelderin", "stellefliesstextein", "stellefusszeileein", "stellefusszeilentextein", "stellegefuelltesrechteckein", "stellegefuelltezeileein", "stellegegenueberplatzierenein", "stellegleitobjektein", "stellehintergruendeein", "stellehintergrundein", "stelleinteraktionein", "stelleinteraktionsbalkenein", "stelleinteraktionsbildschirmein", "stelleinteraktionsmenueein", "stellekommentarein", "stellekopfzahlein", "stellekopfzeileein", "stellekopfzeilentextein", "stellelayoutein", "stellelinienbreiteein", "stellelisteein", "stellemarginallinieein", "stellenobenein", "stellepaletteein", "stellepapierformatein", "stelleplatziegeteiltegleitobjekt", "stellepositionierenein", "stellepostenein", "stelleprogrammein", "stellepufferein", "stellerechteckein", "stellereferenzierenein", "stelleregisterein", "stelleseitenkommentarein", "stelleseitennummerein", "stelleseitennummeriernungein", "stelleseitenuebergangein", "stellesortierenein", "stellespaltenein", "stellespatiumein", "stellespracheein", "stellesymbolsetein", "stellesynonymein", "stelletabellenein", "stelletabulatorein", "stelletextein", "stelletextobenein", "stelletexttexteein", "stelletextumrissein", "stelletextuntenein", "stelletipein", "stelletippenein", "stelletoleranzein", "stelleueberschriftein", "stelleueberschriftenein", "stelleumbruchein", "stelleumrahmtein", "stelleuntenein", "stelleunterseitennummerein", "stelleurlein", "stelleversalienein", "stellezeilenabstandein", "stellezeilenein", "stellezeilennumerierungein", "stellezitierenein", "stellezusammengestelltelisteein", "stellezwischenraumein", "stopJScode", "stopJSpreamble", "stopMPclip", "stopMPcode", "stopMPdefinitions", "stopMPdrawing", "stopMPenvironment", "stopMPextensions", "stopMPinclusions", "stopMPinitializations", "stopMPpage", "stopMPpositiongraphic", "stopMPpositionmethod", "stopMPrun", "stopTABLE", "stopTABLEbody", "stopTABLEfoot", "stopTABLEhead", "stopTABLEnext", "stopTC", "stopTD", "stopTDs", "stopTEXpage", "stopTH", "stopTN", "stopTR", "stopTRs", "stopTX", "stopTY", "stopabbildung", "stopabsatz", "stopallmodes", "stoparrangedpages", "stopaside", "stopattachment", "stopaufzaehlung", "stopbar", "stopbinom", "stopbitmapimage", "stopblockquote", "stopbtxrenderingdefinitions", "stopbuffer", "stopbutton", "stopcatcodetable", "stopcharacteralign", "stopcheckedfences", "stopchemical", "stopcollect", "stopcollecting", "stopcolorintent", "stopcoloronly", "stopcolorset", "stopcolumns", "stopcolumnspan", "stopcombination", "stopcomment", "stopcontextcode", "stopcontextdefinitioncode", "stopctxfunction", "stopctxfunctiondefinition", "stopcurrentcolor", "stopcurrentlistentrywrapper", "stopdbinom", "stopdelimited", "stopdelimitedtext", "stopdfrac", "stopdisplaymath", "stopdmath", "stopdocument", "stopdurchgestrichen", "stopdurchstreichen", "stopeffect", "stopelement", "stopembeddedxtable", "stopendofline", "stopexceptions", "stopexpanded", "stopexpandedcollect", "stopextendedcatcodetable", "stopexternalfigurecollection", "stopfarbe", "stopfigure", "stopfitfieldframed", "stopfittingpage", "stopfloatcombination", "stopfont", "stopfontclass", "stopfontsolution", "stopformula", "stopformulas", "stopfrac", "stopframedcontent", "stopframedtext", "stopgrafik", "stopgridsnapping", "stophbox", "stophboxestohbox", "stophboxregister", "stophelptext", "stophiddenbar", "stophiding", "stophighlight", "stophilfetext", "stophintergrund", "stophyphenation", "stopimath", "stopindentation", "stopindentedtext", "stopinmframed", "stopinteraction", "stopinteraktionsmenue", "stopinterface", "stopintermezzo", "stopintertext", "stopitemgroup", "stopkapitel", "stopkleinerdurchschuss", "stopknockout", "stopkommentar", "stopkomponente", "stopkopf", "stoplayout", "stoplinecorrection", "stoplinefiller", "stoplinenumbering", "stoplinetable", "stoplinetablebody", "stoplinetablecell", "stoplinetablehead", "stoplocalfootnotes", "stoplocalheadsetup", "stoplocallinecorrection", "stoplocalnotes", "stoplocalsetups", "stoplua", "stopluacode", "stopluaparameterset", "stopluasetups", "stopmakeup", "stopmarginallinie", "stopmarginblock", "stopmarkedcontent", "stopmathmode", "stopmathstyle", "stopmatrices", "stopmcframed", "stopmdformula", "stopmframed", "stopmixedcolumns", "stopmode", "stopmodeset", "stopmodule", "stopmoduletestsection", "stopmpformula", "stopnamedsection", "stopnamedsubformulas", "stopnarrow", "stopnarrower", "stopnegative", "stopnicelyfilledbox", "stopnobar", "stopnointerference", "stopnotallmodes", "stopnotext", "stopnotmode", "stopopposite", "stopoutputstream", "stopoverlay", "stopoverprint", "stoppagecomment", "stoppagefigure", "stoppagegrid", "stoppagegridspan", "stoppagelayout", "stoppar", "stopparagraph", "stopparagraphs", "stopparagraphscell", "stopparbuilder", "stoppath", "stopplacepairedbox", "stopplatziereformel", "stoppos", "stoppositioning", "stoppositionoverlay", "stoppositive", "stoppostponing", "stopprocessassignmentcommand", "stopprocessassignmentlist", "stopprocesscommacommand", "stopprocesscommalist", "stopprodukt", "stopprojekt", "stopprotect", "stopprotectedcolors", "stoppublikation", "stoppunctuation", "stoprandomized", "stoprandomseed", "stoprawsetups", "stopreadingfile", "stopreferenceprefix", "stopregime", "stopregister", "stopreusableMPgraphic", "stopscript", "stopsdformula", "stopsectionblock", "stopsectionblockenvironment", "stopsectionlevel", "stopsetups", "stopsfrac", "stopshapebox", "stopshift", "stopsidebar", "stopsimplecolumns", "stopspecialitem", "stopspeech", "stopspformula", "stopspread", "stopstartstop", "stopstaticMPfigure", "stopstaticMPgraphic", "stopstrictinspectnextcharacter", "stopstructurepageregister", "stopstrut", "stopstyle", "stopsubformulas", "stopsubjectlevel", "stopsubsentence", "stopsubstack", "stopsymbolset", "stoptabelle", "stoptable", "stoptablehead", "stoptables", "stoptabletail", "stoptabulate", "stoptabulatehead", "stoptabulatetail", "stoptagged", "stoptbinom", "stoptexcode", "stoptexdefinition", "stoptext", "stoptextbackground", "stoptextbackgroundmanual", "stoptextcolor", "stoptextcolorintent", "stoptextflow", "stoptextlinie", "stopthema", "stoptitel", "stoptokens", "stoptransparent", "stoptypescript", "stoptypescriptcollection", "stopueberstreichen", "stopueberstrichen", "stopumgebung", "stopumrahmt", "stopumrahmtertext", "stopunderdash", "stopunderdashes", "stopunderdot", "stopunderdots", "stopunderrandom", "stopunderrandoms", "stopunderstrike", "stopunderstrikes", "stopunframed", "stopuniqueMPgraphic", "stopuniqueMPpagegraphic", "stopunpacked", "stopunterabsatz", "stopunterstreichen", "stopunterstrichen", "stopunterthema", "stopunterunterabsatz", "stopunterunterthema", "stopunterunterunterabsatz", "stopunterunterunterthema", "stopunterunterunterunterabsatz", "stopunterunterunterunterthema", "stopusableMPgraphic", "stopuseMPgraphic", "stopusemathstyleparameter", "stopusingbtxspecification", "stopvbox", "stopvboxregister", "stopvboxtohbox", "stopvboxtohboxseparator", "stopviewerlayer", "stopvtop", "stopvtopregister", "stopxcell", "stopxcellgroup", "stopxfrac", "stopxgroup", "stopxmldisplayverbatim", "stopxmlinlineverbatim", "stopxmlraw", "stopxmlsetups", "stopxrow", "stopxrowgroup", "stopxtable", "stopxtablebody", "stopxtablefoot", "stopxtablehead", "stopxtablenext", "stopxxfrac", "stopzeile", "stopzitat", "stopzitieren", "stopzu", "strictdoifelsenextoptional", "strictdoifnextoptionalelse", "stripcharacter", "strippedcsname", "stripspaces", "structurelistuservariable", "structurenumber", "structuretitle", "structureuservariable", "structurevariable", "strut", "strutdp", "strutht", "struthtdp", "struttedbox", "strutwd", "style", "styleinstance", "subpagenumber", "subsentence", "substituteincommalist", "subtractfeature", "swapcounts", "swapdimens", "swapface", "swapmacros", "swaptypeface", "switchstyleonly", "switchtocolor", "switchtointerlinespace", "symbol", "symbolreference", "synchronizeblank", "synchronizeindenting", "synchronizemarking", "synchronizeoutputstreams", "synchronizestrut", "synchronizewhitespace", "systemlog", "systemlogfirst", "systemloglast", "systemsetups", "tLeftarrow", "tLeftrightarrow", "tRightarrow", "tabelle", "tabulateautoline", "tabulateautorule", "tabulateline", "tabulaterule", "taggedctxcommand", "taggedlabeltexts", "tbinom", "tbox", "teilegleitobjekt", "tequal", "testandsplitstring", "testcolumn", "testfeature", "testfeatureonce", "testpage", "testpageonly", "testpagesync", "testtokens", "tex", "texdefinition", "texsetup", "textcitation", "textcite", "textcontrolspace", "textflowcollector", "textlinie", "textmath", "textminus", "textormathchar", "textplus", "textreferenz", "textvisiblespace", "tfrac", "thainumerals", "thefirstcharacter", "thema", "thenormalizedbodyfontsize", "theremainingcharacters", "thickspace", "thinspace", "thirdoffivearguments", "thirdoffourarguments", "thirdofsixarguments", "thirdofthreearguments", "thirdofthreeunexpanded", "thookleftarrow", "thookrightarrow", "threedigitrounding", "tibetannumerals", "tief", "tightlayer", "tiho", "tinyfont", "tip", "tippedatei", "tippen", "tippepuffer", "titel", "tlap", "tleftarrow", "tleftharpoondown", "tleftharpoonup", "tleftrightarrow", "tleftrightharpoons", "tmapsto", "tochar", "tolinenote", "topbox", "topleftbox", "toplinebox", "toprightbox", "topskippedbox", "tracecatcodetables", "tracedfontname", "traceoutputroutines", "tracepositions", "transparencycomponents", "transparent", "trel", "trightarrow", "trightharpoondown", "trightharpoonup", "trightleftharpoons", "trightoverleftarrow", "triplebond", "truefilename", "truefontname", "ttriplerel", "ttwoheadleftarrow", "ttwoheadrightarrow", "twodigitrounding", "tx", "txx", "typedefinedbuffer", "typeface", "typescriptone", "typescriptprefix", "typescriptthree", "typescripttwo", "typesetbuffer", "typesetfile", "uconvertnumber", "ueber", "uebersetzten", "uedcatcodecommand", "umgebung", "umrahmt", "umrahmtertext", "unbekant", "undefinevalue", "undepthed", "underbar", "underbars", "underbartext", "underbrace", "underbracetext", "underbracket", "underbrackettext", "underdash", "underdashes", "underdot", "underdots", "underleftarrow", "underleftharpoondown", "underleftharpoonup", "underleftrightarrow", "underparent", "underparenttext", "underrandom", "underrandoms", "underrightarrow", "underrightharpoondown", "underrightharpoonup", "underset", "understrike", "understrikes", "undertwoheadleftarrow", "undertwoheadrightarrow", "undoassign", "unframed", "unhhbox", "unihex", "uniqueMPgraphic", "uniqueMPpagegraphic", "unprotected", "unregisterhyphenationpattern", "unspaceafter", "unspaceargument", "unspaced", "unspacestring", "unterabsatz", "unterthema", "unterunterabsatz", "unterunterthema", "unterunterunterabsatz", "unterunterunterthema", "unterunterunterunterabsatz", "unterunterunterunterthema", "untexargument", "untexcommand", "uppercased", "uppercasestring", "upperleftdoubleninequote", "upperleftdoublesixquote", "upperleftsingleninequote", "upperleftsinglesixquote", "upperrightdoubleninequote", "upperrightdoublesixquote", "upperrightsingleninequote", "upperrightsinglesixquote", "url", "useMPenvironmentbuffer", "useMPgraphic", "useMPlibrary", "useMPrun", "useMPvariables", "useblankparameter", "usebodyfont", "usebodyfontparameter", "usebtxdataset", "usebtxdefinitions", "usecolors", "usecomponent", "usedummycolorparameter", "usedummystyleandcolor", "usedummystyleparameter", "useenvironment", "useexternalrendering", "usefigurebase", "usefile", "usegridparameter", "useindentingparameter", "useindentnextparameter", "useinterlinespaceparameter", "uselanguageparameter", "useluamodule", "usemathstyleparameter", "useproduct", "useprofileparameter", "useproject", "usereferenceparameter", "userpagenumber", "usesetupsparameter", "usestaticMPfigure", "usesubpath", "usetexmodule", "usetypescript", "usetypescriptfile", "usezipfile", "utfchar", "utflower", "utfupper", "utilityregisterlength", "vboxreference", "verbatim", "verbatimstring", "verbergebloecke", "verbergen", "verbosenumber", "vergleichefarbengruppe", "vergleichepalette", "version", "verticalgrowingbar", "verticalpositionbar", "verwendeJSscript", "verwendeURL", "verwendebloecke", "verwendeexteresdokument", "verwendeexterneabbildung", "verwendeexternestonstueck", "verwendemodul", "verwendesymbole", "verwendeurl", "vglue", "viewerlayer", "vl", "volleswort", "von", "vphantom", "vpos", "vsmash", "vsmashbox", "vsmashed", "vspace", "vspacing", "waehlebloeckeaus", "wdofstring", "wechselezumfliesstext", "widthofstring", "widthspanningtext", "withoutpt", "wochentag", "word", "words", "wordtonumber", "writedatatolist", "writestatus", "xLeftarrow", "xLeftrightarrow", "xRightarrow", "xdefconvertedargument", "xequal", "xfrac", "xhookleftarrow", "xhookrightarrow", "xleftarrow", "xleftharpoondown", "xleftharpoonup", "xleftrightarrow", "xleftrightharpoons", "xmapsto", "xmladdindex", "xmlafterdocumentsetup", "xmlaftersetup", "xmlall", "xmlappenddocumentsetup", "xmlappendsetup", "xmlapplyselectors", "xmlatt", "xmlattdef", "xmlattribute", "xmlattributedef", "xmlbadinclusions", "xmlbeforedocumentsetup", "xmlbeforesetup", "xmlchainatt", "xmlchainattdef", "xmlchecknamespace", "xmlcommand", "xmlconcat", "xmlconcatrange", "xmlcontext", "xmlcount", "xmldefaulttotext", "xmldirectives", "xmldirectivesafter", "xmldirectivesbefore", "xmldisplayverbatim", "xmldoif", "xmldoifelse", "xmldoifelseempty", "xmldoifelseselfempty", "xmldoifelsetext", "xmldoifelsevalue", "xmldoifnot", "xmldoifnotselfempty", "xmldoifnottext", "xmldoifselfempty", "xmldoiftext", "xmlelement", "xmlfilter", "xmlfirst", "xmlflush", "xmlflushcontext", "xmlflushdocumentsetups", "xmlflushlinewise", "xmlflushpure", "xmlflushspacewise", "xmlflushtext", "xmlinclude", "xmlinclusion", "xmlinclusions", "xmlinfo", "xmlinjector", "xmlinlineverbatim", "xmlinstalldirective", "xmllast", "xmllastatt", "xmllastmatch", "xmlloadbuffer", "xmlloaddata", "xmlloaddirectives", "xmlloadfile", "xmlloadonly", "xmlmain", "xmlmapvalue", "xmlname", "xmlnamespace", "xmlnonspace", "xmlpath", "xmlpos", "xmlposition", "xmlprependdocumentsetup", "xmlprependsetup", "xmlprettyprint", "xmlprocessbuffer", "xmlprocessdata", "xmlprocessfile", "xmlpure", "xmlraw", "xmlrefatt", "xmlregistereddocumentsetups", "xmlregisteredsetups", "xmlregisterns", "xmlremapname", "xmlremapnamespace", "xmlremovedocumentsetup", "xmlremovesetup", "xmlresetdocumentsetups", "xmlresetinjectors", "xmlresetsetups", "xmlsave", "xmlsetentity", "xmlsetfunction", "xmlsetinjectors", "xmlsetsetup", "xmlsetup", "xmlshow", "xmlsnippet", "xmlstrip", "xmlstripnolines", "xmlstripped", "xmlstrippednolines", "xmltag", "xmltexentity", "xmltext", "xmltobuffer", "xmltobufferverbose", "xmltofile", "xmlvalue", "xmlverbatim", "xrel", "xrightarrow", "xrightharpoondown", "xrightharpoonup", "xrightleftharpoons", "xrightoverleftarrow", "xsplitstring", "xtriplerel", "xtwoheadleftarrow", "xtwoheadrightarrow", "xxfrac", "xypos", "zeigedruck", "zeigeeinstellungen", "zeigefarbe", "zeigefarbengruppe", "zeigefliesstext", "zeigefliesstextumgebung", "zeigegitter", "zeigelayout", "zeigepalette", "zeigerahmen", "zeigestruts", "zeigeumbruch", "ziffern", "zitat", "zitieren", "zu", "zurbox", "zurseite" }, - ["en"]={ "AMSTEX", "AfterPar", "Alphabeticnumerals", "AmSTeX", "And", "BeforePar", "Big", "Bigg", "Biggl", "Biggm", "Biggr", "Bigl", "Bigm", "Bigr", "CONTEXT", "Cap", "Caps", "Character", "Characters", "ConTeXt", "Context", "ConvertConstantAfter", "ConvertToConstant", "ETEX", "EveryLine", "EveryPar", "GetPar", "GotoPar", "Greeknumerals", "INRSTEX", "LAMSTEX", "LATEX", "LUAJITTEX", "LUATEX", "LaTeX", "LamSTeX", "Lua", "LuaTeX", "LuajitTeX", "METAFONT", "METAFUN", "METAPOST", "MKII", "MKIV", "MKIX", "MKVI", "MKXI", "MONTH", "MONTHLONG", "MONTHSHORT", "MPII", "MPIV", "MPVI", "MPanchor", "MPbetex", "MPc", "MPcode", "MPcolor", "MPcoloronly", "MPcolumn", "MPd", "MPdrawing", "MPfontsizehskip", "MPgetmultipars", "MPgetmultishape", "MPgetposboxes", "MPh", "MPinclusions", "MPleftskip", "MPll", "MPlr", "MPls", "MPmenubuttons", "MPn", "MPoptions", "MPoverlayanchor", "MPp", "MPpage", "MPpardata", "MPplus", "MPpos", "MPpositiongraphic", "MPposset", "MPr", "MPrawvar", "MPregion", "MPrest", "MPrightskip", "MPrs", "MPstring", "MPtext", "MPtransparency", "MPul", "MPur", "MPv", "MPvar", "MPvariable", "MPvv", "MPw", "MPwhd", "MPx", "MPxy", "MPxywhd", "MPy", "MetaFont", "MetaFun", "MetaPost", "NormalizeFontHeight", "NormalizeFontWidth", "NormalizeTextHeight", "NormalizeTextWidth", "Numbers", "PDFETEX", "PDFTEX", "PDFcolor", "PICTEX", "PPCHTEX", "PPCHTeX", "PRAGMA", "PiCTeX", "PointsToBigPoints", "PointsToReal", "PointsToWholeBigPoints", "PtToCm", "ReadFile", "Romannumerals", "ScaledPointsToBigPoints", "ScaledPointsToWholeBigPoints", "Smallcapped", "TABLE", "TEX", "TEXpage", "TaBlE", "TeX", "TheNormalizedFontSize", "TransparencyHack", "VerboseNumber", "WEEKDAY", "WORD", "WORDS", "WidthSpanningText", "Word", "Words", "XETEX", "XeTeX", "abjadnaivenumerals", "abjadnodotnumerals", "abjadnumerals", "about", "activatespacehandler", "adaptcollector", "adaptfontfeature", "adaptlayout", "adaptpapersize", "addfeature", "addtoJSpreamble", "addtocommalist", "addvalue", "aftersplitstring", "aftertestandsplitstring", "alignmentcharacter", "allinputpaths", "alphabeticnumerals", "alwayscitation", "alwayscite", "ampersand", "anchor", "appendetoks", "appendgvalue", "appendtocommalist", "appendtoks", "appendtoksonce", "appendvalue", "apply", "applyalternativestyle", "applyprocessor", "applytocharacters", "applytofirstcharacter", "applytosplitstringchar", "applytosplitstringcharspaced", "applytosplitstringline", "applytosplitstringlinespaced", "applytosplitstringword", "applytosplitstringwordspaced", "applytowords", "arabicdecimals", "arabicexnumerals", "arabicnumerals", "arg", "asciistr", "aside", "assignalfadimension", "assigndimen", "assigndimension", "assignifempty", "assigntranslation", "assignvalue", "assignwidth", "assumelongusagecs", "astype", "at", "atpage", "attachment", "autocap", "autodirhbox", "autodirvbox", "autodirvtop", "autoinsertnextspace", "automathematics", "autosetups", "availablehsize", "averagecharwidth", "background", "backgroundimage", "backgroundimagefill", "backgroundline", "basegrid", "baselineleftbox", "baselinemiddlebox", "baselinerightbox", "bbox", "beforesplitstring", "beforetestandsplitstring", "big", "bigbodyfont", "bigg", "bigger", "biggl", "biggm", "biggr", "bigl", "bigm", "bigr", "bigskip", "binom", "bitmapimage", "blackrule", "blackrules", "blank", "blap", "bleed", "bleedheight", "bleedwidth", "blockligatures", "blockquote", "bodyfontenvironmentlist", "bodyfontsize", "bold", "boldface", "bolditalic", "boldslanted", "bookmark", "booleanmodevalue", "bottombox", "bottomleftbox", "bottomrightbox", "boxcursor", "boxmarker", "boxofsize", "boxreference", "bpos", "bthiddencitation", "btxabbreviatedjournal", "btxaddjournal", "btxalwayscitation", "btxauthorfield", "btxdetail", "btxdirect", "btxdoif", "btxdoifcombiinlistelse", "btxdoifelse", "btxdoifelsecombiinlist", "btxdoifelsesameasprevious", "btxdoifelsesameaspreviouschecked", "btxdoifelseuservariable", "btxdoifnot", "btxdoifsameaspreviouscheckedelse", "btxdoifsameaspreviouselse", "btxdoifuservariableelse", "btxexpandedjournal", "btxfield", "btxfieldname", "btxfieldtype", "btxfirstofrange", "btxflush", "btxflushauthor", "btxflushauthorinverted", "btxflushauthorinvertedshort", "btxflushauthorname", "btxflushauthornormal", "btxflushauthornormalshort", "btxflushsuffix", "btxfoundname", "btxfoundtype", "btxhybridcite", "btxlistcitation", "btxloadjournalist", "btxoneorrange", "btxremapauthor", "btxsavejournalist", "btxsetup", "btxsingularorplural", "btxsingularplural", "btxtextcitation", "button", "calligraphic", "camel", "cap", "catcodetablename", "cbox", "centerbox", "centeredbox", "centerednextbox", "cfrac", "chapter", "character", "characters", "chardescription", "charwidthlanguage", "checkcharacteralign", "checkedchar", "checkedfiller", "checkedstrippedcsname", "checkinjector", "checknextindentation", "checknextinjector", "checkpage", "checkparameters", "checkpreviousinjector", "checksoundtrack", "checktwopassdata", "checkvariables", "chem", "chemical", "chemicalbottext", "chemicalmidtext", "chemicalsymbol", "chemicaltext", "chemicaltoptext", "chineseallnumerals", "chinesecapnumerals", "chinesenumerals", "citation", "cite", "clap", "classfont", "cldcommand", "cldcontext", "cldloadfile", "cldprocessfile", "cleftarrow", "clip", "clonefield", "collect", "collectedtext", "collectexpanded", "color", "colorbar", "colorcomponents", "colored", "coloronly", "colorvalue", "column", "columnbreak", "combinepages", "commalistelement", "commalistsentence", "commalistsize", "comment", "comparecolorgroup", "comparedimension", "comparedimensioneps", "comparepalet", "completebtxrendering", "completelist", "completelistofpublications", "completelistofsorts", "completelistofsynonyms", "completepagenumber", "completeregister", "complexorsimple", "complexorsimpleempty", "component", "composedcollector", "composedlayer", "compresult", "constantdimen", "constantdimenargument", "constantemptyargument", "constantnumber", "constantnumberargument", "contentreference", "continuednumber", "continueifinputfile", "convertargument", "convertcommand", "convertedcounter", "converteddimen", "convertedsubcounter", "convertmonth", "convertnumber", "convertvalue", "convertvboxtohbox", "copyfield", "copypages", "copyparameters", "copyposition", "correctwhitespace", "countersubs", "counttoken", "counttokens", "cramped", "crampedclap", "crampedllap", "crampedrlap", "crightarrow", "crightoverleftarrow", "ctop", "ctxcommand", "ctxdirectcommand", "ctxdirectlua", "ctxfunction", "ctxlatecommand", "ctxlatelua", "ctxloadluafile", "ctxlua", "ctxluabuffer", "ctxluacode", "ctxreport", "ctxsprint", "currentassignmentlistkey", "currentassignmentlistvalue", "currentbtxuservariable", "currentcommalistitem", "currentcomponent", "currentdate", "currentenvironment", "currentfeaturetest", "currentheadnumber", "currentinterface", "currentlanguage", "currentlistentrydestinationattribute", "currentlistentrylimitedtext", "currentlistentrynumber", "currentlistentrypagenumber", "currentlistentryreferenceattribute", "currentlistentrytitle", "currentlistentrytitlerendered", "currentlistsymbol", "currentmainlanguage", "currentmessagetext", "currentmoduleparameter", "currentoutputstream", "currentproduct", "currentproject", "currentregime", "currentregisterpageuserdata", "currentresponses", "currenttime", "currentvalue", "currentxtablecolumn", "currentxtablerow", "datasetvariable", "date", "dayoftheweek", "dayspermonth", "dbinom", "decrement", "decrementcounter", "decrementedcounter", "decrementpagenumber", "decrementsubpagenumber", "decrementvalue", "defaultinterface", "defaultobjectpage", "defaultobjectreference", "defcatcodecommand", "defconvertedargument", "defconvertedcommand", "defconvertedvalue", "define", "defineMPinstance", "defineTABLEsetup", "defineactivecharacter", "definealternativestyle", "defineanchor", "defineattachment", "defineattribute", "definebackground", "definebar", "defineblock", "definebodyfont", "definebodyfontenvironment", "definebodyfontswitch", "definebreakpoint", "definebreakpoints", "definebtx", "definebtxdataset", "definebtxregister", "definebtxrendering", "definebuffer", "definebutton", "definecapitals", "definecharacterkerning", "definecharacterspacing", "definechemical", "definechemicals", "definechemicalsymbol", "definecollector", "definecolor", "definecolorgroup", "definecolumnbreak", "definecombination", "definecombinedlist", "definecomment", "definecomplexorsimple", "definecomplexorsimpleempty", "defineconversion", "defineconversionset", "definecounter", "definedataset", "definedelimitedtext", "definedescription", "definedfont", "defineeffect", "defineenumeration", "defineexpandable", "defineexternalfigure", "definefallbackfamily", "definefield", "definefieldbody", "definefieldbodyset", "definefieldcategory", "definefieldstack", "definefiguresymbol", "definefileconstant", "definefilefallback", "definefilesynonym", "definefiller", "definefirstline", "definefittingpage", "definefloat", "definefont", "definefontalternative", "definefontfallback", "definefontfamily", "definefontfamilypreset", "definefontfeature", "definefontfile", "definefontsize", "definefontsolution", "definefontstyle", "definefontsynonym", "defineformula", "defineformulaalternative", "defineformulaframed", "defineframed", "defineframedcontent", "defineframedtext", "definefrozenfont", "defineglobalcolor", "definegraphictypesynonym", "definegridsnapping", "definehbox", "definehead", "defineheadalternative", "definehelp", "definehigh", "definehighlight", "definehspace", "definehypenationfeatures", "defineindentedtext", "defineindenting", "defineinitial", "defineinsertion", "defineinteraction", "defineinteractionbar", "defineinteractionmenu", "defineinterfaceconstant", "defineinterfaceelement", "defineinterfacevariable", "defineinterlinespace", "defineintermediatecolor", "defineitemgroup", "defineitems", "definelabel", "definelabelclass", "definelayer", "definelayerpreset", "definelayout", "definelinefiller", "definelinenote", "definelinenumbering", "definelines", "definelist", "definelistalternative", "definelistextra", "definelow", "definelowhigh", "definelowmidhigh", "definemakeup", "definemarginblock", "definemargindata", "definemarker", "definemarking", "definemathalignment", "definemathcases", "definemathcommand", "definemathdoubleextensible", "definemathematics", "definemathextensible", "definemathfence", "definemathfraction", "definemathframed", "definemathmatrix", "definemathornament", "definemathoverextensible", "definemathovertextextensible", "definemathradical", "definemathstackers", "definemathstyle", "definemathtriplet", "definemathunderextensible", "definemathundertextextensible", "definemathunstacked", "definemeasure", "definemessageconstant", "definemixedcolumns", "definemode", "definemultitonecolor", "definenamedcolor", "definenamespace", "definenarrower", "definenote", "defineornament", "defineoutputroutine", "defineoutputroutinecommand", "defineoverlay", "definepage", "definepagebreak", "definepagechecker", "definepagegrid", "definepagegridarea", "definepagegridspan", "definepageinjection", "definepageinjectionalternative", "definepageshift", "definepagestate", "definepairedbox", "definepalet", "definepapersize", "defineparagraph", "defineparagraphs", "defineparallel", "defineparbuilder", "defineplacement", "definepositioning", "defineprefixset", "defineprocesscolor", "defineprocessor", "defineprofile", "defineprogram", "definepushbutton", "definepushsymbol", "definereference", "definereferenceformat", "defineregister", "definerenderingwindow", "defineresetset", "definescale", "definescript", "definesection", "definesectionblock", "definesectionlevels", "defineselector", "defineseparatorset", "defineshift", "definesidebar", "definesort", "definesorting", "definespotcolor", "definestartstop", "definestyle", "definestyleinstance", "definesubfield", "definesubformula", "definesymbol", "definesynonym", "definesynonyms", "definesystemattribute", "definesystemconstant", "definesystemvariable", "definetabletemplate", "definetabulate", "definetabulation", "definetext", "definetextbackground", "definetextflow", "definetooltip", "definetransparency", "definetwopasslist", "definetype", "definetypeface", "definetypescriptprefix", "definetypescriptsynonym", "definetypesetting", "definetyping", "defineunit", "defineviewerlayer", "definevspace", "definevspacing", "definevspacingamount", "definextable", "delimited", "delimitedtext", "depthofstring", "depthonlybox", "depthspanningtext", "determineheadnumber", "determinelistcharacteristics", "determinenoflines", "determineregistercharacteristics", "devanagarinumerals", "dfrac", "digits", "dimensiontocount", "directcolor", "directcolored", "directconvertedcounter", "directdummyparameter", "directgetboxllx", "directgetboxlly", "directhighlight", "directlocalframed", "directluacode", "directselect", "directsetbar", "directsetup", "directsymbol", "directvspacing", "dis", "disabledirectives", "disableexperiments", "disablemode", "disableoutputstream", "disableparpositions", "disableregime", "disabletrackers", "displaymath", "displaymathematics", "displaymessage", "distributedhsize", "dividedsize", "doadaptleftskip", "doadaptrightskip", "doaddfeature", "doassign", "doassignempty", "doboundtext", "docheckassignment", "docheckedpagestate", "docheckedpair", "documentvariable", "dodoubleargument", "dodoubleargumentwithset", "dodoubleempty", "dodoubleemptywithset", "dodoublegroupempty", "doeassign", "doexpandedrecurse", "dogetattribute", "dogetattributeid", "dogetcommacommandelement", "dogobbledoubleempty", "dogobblesingleempty", "doif", "doifMPgraphicelse", "doifallcommon", "doifallcommonelse", "doifalldefinedelse", "doifallmodes", "doifallmodeselse", "doifassignmentelse", "doifblackelse", "doifbothsides", "doifbothsidesoverruled", "doifboxelse", "doifbufferelse", "doifcolor", "doifcolorelse", "doifcommandhandler", "doifcommandhandlerelse", "doifcommon", "doifcommonelse", "doifcontent", "doifconversiondefinedelse", "doifconversionnumberelse", "doifcounter", "doifcounterelse", "doifcurrentfonthasfeatureelse", "doifdefined", "doifdefinedcounter", "doifdefinedcounterelse", "doifdefinedelse", "doifdimensionelse", "doifdimenstringelse", "doifdocumentargument", "doifdocumentargumentelse", "doifdocumentfilename", "doifdocumentfilenameelse", "doifdrawingblackelse", "doifelse", "doifelseMPgraphic", "doifelseallcommon", "doifelsealldefined", "doifelseallmodes", "doifelseassignment", "doifelseblack", "doifelsebox", "doifelsebuffer", "doifelsecolor", "doifelsecommandhandler", "doifelsecommon", "doifelseconversiondefined", "doifelseconversionnumber", "doifelsecounter", "doifelsecurrentfonthasfeature", "doifelsecurrentsortingused", "doifelsecurrentsynonymshown", "doifelsecurrentsynonymused", "doifelsedefined", "doifelsedefinedcounter", "doifelsedimension", "doifelsedimenstring", "doifelsedocumentargument", "doifelsedocumentfilename", "doifelsedrawingblack", "doifelseempty", "doifelseemptyvalue", "doifelseemptyvariable", "doifelseenv", "doifelsefastoptionalcheck", "doifelsefastoptionalcheckcs", "doifelsefieldbody", "doifelsefieldcategory", "doifelsefigure", "doifelsefile", "doifelsefiledefined", "doifelsefileexists", "doifelsefirstchar", "doifelseflagged", "doifelsefontchar", "doifelsefontpresent", "doifelsefontsynonym", "doifelsehasspace", "doifelsehelp", "doifelseincsname", "doifelseinelement", "doifelseinputfile", "doifelseinsertion", "doifelseinset", "doifelseinstring", "doifelseinsymbolset", "doifelseintoks", "doifelseintwopassdata", "doifelseitalic", "doifelselanguage", "doifelselayerdata", "doifelselayoutdefined", "doifelselayoutsomeline", "doifelselayouttextline", "doifelseleapyear", "doifelselist", "doifelselocation", "doifelselocfile", "doifelsemainfloatbody", "doifelsemarking", "doifelsemeaning", "doifelsemessage", "doifelsemode", "doifelsenextbgroup", "doifelsenextbgroupcs", "doifelsenextchar", "doifelsenextoptional", "doifelsenextoptionalcs", "doifelsenextparenthesis", "doifelsenonzeropositive", "doifelsenoteonsamepage", "doifelsenothing", "doifelsenumber", "doifelseobjectfound", "doifelseobjectreferencefound", "doifelseoddpage", "doifelseoddpagefloat", "doifelseoldercontext", "doifelseolderversion", "doifelseoverlapping", "doifelseoverlay", "doifelseparallel", "doifelseparentfile", "doifelsepath", "doifelsepathexists", "doifelsepatterns", "doifelseposition", "doifelsepositionaction", "doifelsepositiononpage", "doifelsepositionsonsamepage", "doifelsepositionsonthispage", "doifelsepositionsused", "doifelsereferencefound", "doifelserightpagefloat", "doifelserighttoleftinbox", "doifelsesamelinereference", "doifelsesamestring", "doifelsesetups", "doifelsesomebackground", "doifelsesomespace", "doifelsesomething", "doifelsesometoks", "doifelsestringinstring", "doifelsestructurelisthasnumber", "doifelsestructurelisthaspage", "doifelsesymboldefined", "doifelsesymbolset", "doifelsetext", "doifelsetextflow", "doifelsetextflowcollector", "doifelsetypingfile", "doifelseundefined", "doifelseurldefined", "doifelsevalue", "doifelsevaluenothing", "doifelsevariable", "doifempty", "doifemptyelse", "doifemptytoks", "doifemptyvalue", "doifemptyvalueelse", "doifemptyvariable", "doifemptyvariableelse", "doifenv", "doifenvelse", "doiffastoptionalcheckcselse", "doiffastoptionalcheckelse", "doiffieldbodyelse", "doiffieldcategoryelse", "doiffigureelse", "doiffile", "doiffiledefinedelse", "doiffileelse", "doiffileexistselse", "doiffirstcharelse", "doifflaggedelse", "doiffontcharelse", "doiffontpresentelse", "doiffontsynonymelse", "doifhasspaceelse", "doifhelpelse", "doifincsnameelse", "doifinelementelse", "doifinputfileelse", "doifinsertionelse", "doifinset", "doifinsetelse", "doifinstring", "doifinstringelse", "doifinsymbolset", "doifinsymbolsetelse", "doifintokselse", "doifintwopassdataelse", "doifitalicelse", "doiflanguageelse", "doiflayerdataelse", "doiflayoutdefinedelse", "doiflayoutsomelineelse", "doiflayouttextlineelse", "doifleapyearelse", "doiflistelse", "doiflocationelse", "doiflocfileelse", "doifmainfloatbodyelse", "doifmarkingelse", "doifmeaningelse", "doifmessageelse", "doifmode", "doifmodeelse", "doifnextbgroupcselse", "doifnextbgroupelse", "doifnextcharelse", "doifnextoptionalcselse", "doifnextoptionalelse", "doifnextparenthesiselse", "doifnonzeropositiveelse", "doifnot", "doifnotallcommon", "doifnotallmodes", "doifnotcommandhandler", "doifnotcommon", "doifnotcounter", "doifnotdocumentargument", "doifnotdocumentfilename", "doifnotempty", "doifnotemptyvalue", "doifnotemptyvariable", "doifnotenv", "doifnoteonsamepageelse", "doifnotescollected", "doifnotfile", "doifnotflagged", "doifnothing", "doifnothingelse", "doifnotinset", "doifnotinsidesplitfloat", "doifnotinstring", "doifnotmode", "doifnotnumber", "doifnotsamestring", "doifnotsetups", "doifnotvalue", "doifnotvariable", "doifnumber", "doifnumberelse", "doifobjectfoundelse", "doifobjectreferencefoundelse", "doifoddpageelse", "doifoddpagefloatelse", "doifoldercontextelse", "doifolderversionelse", "doifoverlappingelse", "doifoverlayelse", "doifparallelelse", "doifparentfileelse", "doifpathelse", "doifpathexistselse", "doifpatternselse", "doifposition", "doifpositionaction", "doifpositionactionelse", "doifpositionelse", "doifpositiononpageelse", "doifpositionsonsamepageelse", "doifpositionsonthispageelse", "doifpositionsusedelse", "doifreferencefoundelse", "doifrightpagefloatelse", "doifrighttoleftinboxelse", "doifsamelinereferenceelse", "doifsamestring", "doifsamestringelse", "doifsetups", "doifsetupselse", "doifsomebackground", "doifsomebackgroundelse", "doifsomespaceelse", "doifsomething", "doifsomethingelse", "doifsometoks", "doifsometokselse", "doifstringinstringelse", "doifstructurelisthasnumberelse", "doifstructurelisthaspageelse", "doifsymboldefinedelse", "doifsymbolsetelse", "doiftext", "doiftextelse", "doiftextflowcollectorelse", "doiftextflowelse", "doiftypingfileelse", "doifundefined", "doifundefinedcounter", "doifundefinedelse", "doifurldefinedelse", "doifvalue", "doifvalueelse", "doifvaluenothing", "doifvaluenothingelse", "doifvaluesomething", "doifvariable", "doifvariableelse", "doindentation", "dollar", "doloop", "doloopoverlist", "donothing", "dontconvertfont", "dontleavehmode", "dontpermitspacesbetweengroups", "dopositionaction", "doprocesslocalsetups", "doquadrupleargument", "doquadrupleempty", "doquadruplegroupempty", "doquintupleargument", "doquintupleempty", "doquintuplegroupempty", "dorechecknextindentation", "dorecurse", "dorepeatwithcommand", "doreplacefeature", "doresetandafffeature", "doresetattribute", "dorotatebox", "dosetattribute", "dosetleftskipadaption", "dosetrightskipadaption", "dosetupcheckedinterlinespace", "doseventupleargument", "doseventupleempty", "dosingleargument", "dosingleempty", "dosinglegroupempty", "dosixtupleargument", "dosixtupleempty", "dostepwiserecurse", "dosubtractfeature", "dotfskip", "dotoks", "dotripleargument", "dotripleargumentwithset", "dotripleempty", "dotripleemptywithset", "dotriplegroupempty", "doublebar", "doublebond", "doublebrace", "doublebracket", "doubleparent", "dowith", "dowithnextbox", "dowithnextboxcontent", "dowithnextboxcontentcs", "dowithnextboxcs", "dowithpargument", "dowithrange", "dowithwargument", "dpofstring", "dummydigit", "dummyparameter", "eTeX", "edefconvertedargument", "efcmaxheight", "efcmaxwidth", "efcminheight", "efcminwidth", "efcparameter", "effect", "elapsedseconds", "elapsedtime", "eleftarrowfill", "eleftharpoondownfill", "eleftharpoonupfill", "eleftrightarrowfill", "emphasisboldface", "emphasistypeface", "emptylines", "emspace", "enabledirectives", "enableexperiments", "enablemode", "enableoutputstream", "enableparpositions", "enableregime", "enabletrackers", "enskip", "enspace", "env", "environment", "envvar", "eoverbarfill", "eoverbracefill", "eoverbracketfill", "eoverparentfill", "epos", "equaldigits", "erightarrowfill", "erightharpoondownfill", "erightharpoonupfill", "etwoheadrightarrowfill", "eunderbarfill", "eunderbracefill", "eunderbracketfill", "eunderparentfill", "executeifdefined", "exitloop", "exitloopnow", "expandcheckedcsname", "expanded", "expandfontsynonym", "externalfigure", "externalfigurecollectionmaxheight", "externalfigurecollectionmaxwidth", "externalfigurecollectionminheight", "externalfigurecollectionminwidth", "externalfigurecollectionparameter", "fakebox", "fastdecrement", "fastincrement", "fastlocalframed", "fastscale", "fastsetup", "fastsetupwithargument", "fastsetupwithargumentswapped", "fastswitchtobodyfont", "fastsxsy", "feature", "fence", "fenced", "fetchallmarkings", "fetchallmarks", "fetchmark", "fetchmarking", "fetchonemark", "fetchonemarking", "fetchruntinecommand", "fetchtwomarkings", "fetchtwomarks", "field", "fieldbody", "fieldstack", "fifthoffivearguments", "fifthofsixarguments", "figure", "figurefilename", "figurefilepath", "figurefiletype", "figurefullname", "figureheight", "figurenaturalheight", "figurenaturalwidth", "figuresymbol", "figurewidth", "filename", "filledhboxb", "filledhboxc", "filledhboxg", "filledhboxk", "filledhboxm", "filledhboxr", "filledhboxy", "filler", "fillinline", "fillinrules", "fillintext", "filterfromnext", "filterfromvalue", "filterpages", "filterreference", "findtwopassdata", "finishregisterentry", "firstcharacter", "firstcounter", "firstcountervalue", "firstoffivearguments", "firstoffourarguments", "firstofoneargument", "firstofoneunexpanded", "firstofsixarguments", "firstofthreearguments", "firstofthreeunexpanded", "firstoftwoarguments", "firstoftwounexpanded", "firstrealpage", "firstrealpagenumber", "firstsubcountervalue", "firstsubpage", "firstsubpagenumber", "firstuserpage", "firstuserpagenumber", "fitfield", "fitfieldframed", "fittopbaselinegrid", "fixedspace", "fixedspaces", "flag", "floatuserdataparameter", "flushboxregister", "flushcollector", "flushlayer", "flushlocalfloats", "flushnextbox", "flushnotes", "flushoutputstream", "flushshapebox", "flushtextflow", "flushtokens", "flushtoks", "fontalternative", "fontbody", "fontchar", "fontcharbyindex", "fontclass", "fontclassname", "fontface", "fontfeaturelist", "fontsize", "fontstyle", "footnotetext", "forcecharacterstripping", "forcelocalfloats", "forgeteverypar", "forgetparameters", "formula", "formulanumber", "foundbox", "fourthoffivearguments", "fourthoffourarguments", "fourthofsixarguments", "frac", "framed", "frameddimension", "framedparameter", "framedtext", "freezedimenmacro", "freezemeasure", "frenchspacing", "from", "fromlinenote", "frozenhbox", "gdefconvertedargument", "gdefconvertedcommand", "getMPdrawing", "getMPlayer", "getboxllx", "getboxlly", "getbuffer", "getbufferdata", "getcommacommandsize", "getcommalistsize", "getdayoftheweek", "getdayspermonth", "getdefinedbuffer", "getdocumentargument", "getdocumentargumentdefault", "getdocumentfilename", "getdummyparameters", "getemptyparameters", "geteparameters", "getexpandedparameters", "getfiguredimensions", "getfirstcharacter", "getfirsttwopassdata", "getfromcommacommand", "getfromcommalist", "getfromtwopassdata", "getglyphdirect", "getglyphstyled", "getgparameters", "getlasttwopassdata", "getlocalfloat", "getlocalfloats", "getmarking", "getmessage", "getnamedglyphdirect", "getnamedglyphstyled", "getnamedtwopassdatalist", "getnaturaldimensions", "getnoflines", "getobject", "getobjectdimensions", "getpaletsize", "getparameters", "getprivatechar", "getprivateslot", "getrandomcount", "getrandomdimen", "getrandomfloat", "getrandomnumber", "getrandomseed", "getraweparameters", "getrawgparameters", "getrawnoflines", "getrawparameters", "getrawxparameters", "getreference", "getreferenceentry", "getroundednoflines", "getsubstring", "gettwopassdata", "gettwopassdatalist", "getuvalue", "getvalue", "getvariable", "getvariabledefault", "getxparameters", "globaldisablemode", "globalenablemode", "globalletempty", "globalpopbox", "globalpopmacro", "globalpreventmode", "globalprocesscommalist", "globalpushbox", "globalpushmacro", "globalswapcounts", "globalswapdimens", "globalswapmacros", "globalundefine", "glyphfontfile", "gobbledoubleempty", "gobbleeightarguments", "gobblefivearguments", "gobblefiveoptionals", "gobblefourarguments", "gobblefouroptionals", "gobbleninearguments", "gobbleoneargument", "gobbleoneoptional", "gobblesevenarguments", "gobblesingleempty", "gobblesixarguments", "gobblespacetokens", "gobbletenarguments", "gobblethreearguments", "gobblethreeoptionals", "gobbletwoarguments", "gobbletwooptionals", "gobbleuntil", "gobbleuntilrelax", "godown", "goto", "gotobox", "gotopage", "grabbufferdata", "grabbufferdatadirect", "grabuntil", "graphic", "graycolor", "grayvalue", "greedysplitstring", "greeknumerals", "grid", "groupedcommand", "gsetboxllx", "gsetboxlly", "gujaratinumerals", "gurmurkhinumerals", "hairline", "hairspace", "halfwaybox", "handletokens", "handwritten", "hash", "hboxofvbox", "hboxreference", "hdofstring", "headhbox", "headnumber", "headnumbercontent", "headnumberdistance", "headnumberwidth", "headreferenceattributes", "headsetupspacing", "headtextcontent", "headtextdistance", "headtextwidth", "headvbox", "headwidth", "heightanddepthofstring", "heightofstring", "heightspanningtext", "helptext", "hglue", "hiddenbar", "hiddencitation", "hiddencite", "hideblocks", "hiding", "high", "highlight", "highordinalstr", "hilo", "himilo", "hl", "horizontalgrowingbar", "horizontalpositionbar", "hphantom", "hpos", "hsizefraction", "hsmash", "hsmashbox", "hsmashed", "hspace", "htdpofstring", "htofstring", "hyphen", "hyphenatedcoloredword", "hyphenatedfile", "hyphenatedfilename", "hyphenatedhbox", "hyphenatedpar", "hyphenatedurl", "hyphenatedword", "ibox", "ifassignment", "iff", "ifinobject", "ifinoutputstream", "ifparameters", "iftrialtypesetting", "ignoreimplicitspaces", "ignorevalue", "immediatesavetwopassdata", "impliedby", "implies", "in", "includemenu", "includeversioninfo", "increment", "incrementcounter", "incrementedcounter", "incrementpagenumber", "incrementsubpagenumber", "incrementvalue", "indentation", "infofont", "infofontbold", "inframed", "infull", "inheritparameter", "inhibitblank", "initializeboxstack", "inline", "inlinebuffer", "inlinedbox", "inlinemath", "inlinemathematics", "inlinemessage", "inlineordisplaymath", "inlinerange", "inmaframed", "innerflushshapebox", "input", "inputfilebarename", "inputfilename", "inputfilerealsuffix", "inputfilesuffix", "inputgivenfile", "insertpages", "installactionhandler", "installactivecharacter", "installanddefineactivecharacter", "installattributestack", "installautocommandhandler", "installautosetuphandler", "installbasicautosetuphandler", "installbasicparameterhandler", "installbottomframerenderer", "installcommandhandler", "installcorenamespace", "installdefinehandler", "installdefinitionset", "installdefinitionsetmember", "installdirectcommandhandler", "installdirectparameterhandler", "installdirectparametersethandler", "installdirectsetuphandler", "installdirectstyleandcolorhandler", "installframedautocommandhandler", "installframedcommandhandler", "installlanguage", "installleftframerenderer", "installnamespace", "installoutputroutine", "installpagearrangement", "installparameterhandler", "installparameterhashhandler", "installparametersethandler", "installparentinjector", "installrightframerenderer", "installrootparameterhandler", "installsetuphandler", "installsetuponlycommandhandler", "installshipoutmethod", "installsimplecommandhandler", "installsimpleframedcommandhandler", "installstyleandcolorhandler", "installswitchcommandhandler", "installswitchsetuphandler", "installtexdirective", "installtextracker", "installtopframerenderer", "installunitsseparator", "installunitsspace", "installversioninfo", "integerrounding", "interactionbar", "interactionbuttons", "interactionmenu", "intermezzo", "intertext", "invokepageheandler", "istltdir", "istrtdir", "italic", "italicbold", "italiccorrection", "item", "itemize", "items", "itemtag", "jobfilename", "jobfilesuffix", "kap", "keepblocks", "keeplinestogether", "keepunwantedspaces", "kerncharacters", "koreancirclenumerals", "koreannumerals", "koreannumeralsc", "koreannumeralsp", "koreanparentnumerals", "language", "languageCharacters", "languagecharacters", "languagecharwidth", "lastcounter", "lastcountervalue", "lastdigit", "lastlinewidth", "lastnaturalboxdp", "lastnaturalboxht", "lastnaturalboxwd", "lastpredefinedsymbol", "lastrealpage", "lastrealpagenumber", "lastsubcountervalue", "lastsubpage", "lastsubpagenumber", "lasttwodigits", "lastuserpage", "lastuserpagenumber", "lateluacode", "layeredtext", "layerheight", "layerwidth", "lazysavetaggedtwopassdata", "lazysavetwopassdata", "lbox", "left", "leftbottombox", "leftbox", "lefthbox", "leftorrighthbox", "leftorrightvbox", "leftorrightvtop", "leftskipadaption", "leftsubguillemot", "lefttopbox", "lefttorighthbox", "lefttorightvbox", "lefttorightvtop", "letbeundefined", "letcatcodecommand", "letcscsname", "letcsnamecs", "letcsnamecsname", "letdummyparameter", "letempty", "letgvalue", "letgvalueempty", "letgvalurelax", "letterampersand", "letterat", "letterbackslash", "letterbar", "letterbgroup", "letterclosebrace", "lettercolon", "letterdollar", "letterdoublequote", "letteregroup", "letterescape", "letterexclamationmark", "letterhash", "letterhat", "letterleftbrace", "letterless", "lettermore", "letteropenbrace", "letterpercent", "letterquestionmark", "letterrightbrace", "lettersinglequote", "letterslash", "letterspacing", "lettertilde", "letterunderscore", "letvalue", "letvalueempty", "letvaluerelax", "lfence", "lhbox", "limitatelines", "limitatetext", "limtatefirstline", "linespanningtext", "linethickness", "listcitation", "listcite", "listlength", "listnamespaces", "llap", "loadanyfile", "loadanyfileonce", "loadbtxdefinitionfile", "loadbtxreplacementfile", "loadcldfile", "loadcldfileonce", "loadfontgoodies", "loadluafile", "loadluafileonce", "loadspellchecklist", "loadtexfile", "loadtexfileonce", "loadtypescriptfile", "localframed", "localframedwithsettings", "localhsize", "localpopbox", "localpopmacro", "localpushbox", "localpushmacro", "localundefine", "locatedfilepath", "locatefilepath", "locfilename", "lohi", "lomihi", "low", "lowerbox", "lowercased", "lowercasestring", "lowerleftdoubleninequote", "lowerleftsingleninequote", "lowerrightdoubleninequote", "lowerrightsingleninequote", "lrtbbox", "ltop", "luaTeX", "luacode", "luaconditional", "luaenvironment", "luaexpanded", "luafunction", "luajitTeX", "luamajorversion", "luaminorversion", "luaparameterset", "luasetup", "luaversion", "m", "mLeftarrow", "mLeftrightarrow", "mRightarrow", "maframed", "mainlanguage", "makecharacteractive", "makerawcommalist", "makestrutofbox", "mapfontsize", "margindata", "markcontent", "marking", "markinjector", "mat", "math", "mathbf", "mathbi", "mathblackboard", "mathbs", "mathcommand", "mathdefault", "mathematics", "mathfraktur", "mathfunction", "mathit", "mathitalic", "mathop", "mathrm", "mathscript", "mathsl", "mathss", "mathtext", "mathtextbf", "mathtextbi", "mathtextbs", "mathtextit", "mathtextsl", "mathtexttf", "mathtf", "mathtriplet", "mathtt", "mathupright", "mathword", "mathwordbf", "mathwordbi", "mathwordbs", "mathwordit", "mathwordsl", "mathwordtf", "mbox", "mcframed", "md", "measure", "measured", "medskip", "medspace", "menubutton", "mequal", "message", "metaTeX", "mfence", "mfunction", "mfunctionlabeltext", "mhbox", "mhookleftarrow", "mhookrightarrow", "middle", "middlebox", "midhbox", "minimalhbox", "mirror", "mixedcaps", "mkvibuffer", "mleftarrow", "mleftharpoondown", "mleftharpoonup", "mleftrightarrow", "mleftrightharpoons", "mmapsto", "moduleparameter", "molecule", "mono", "monobold", "mononormal", "month", "monthlong", "monthshort", "mp", "mprandomnumber", "mrel", "mrightarrow", "mrightharpoondown", "mrightharpoonup", "mrightleftharpoons", "mrightoverleftarrow", "mtext", "mtriplerel", "mtwoheadleftarrow", "mtwoheadrightarrow", "namedheadnumber", "namedstructureheadlocation", "namedstructureuservariable", "namedstructurevariable", "namedtaggedlabeltexts", "naturalhbox", "naturalhpack", "naturalvbox", "naturalvcenter", "naturalvpack", "naturalvtop", "naturalwd", "negatecolorbox", "negated", "negthinspace", "newattribute", "newcatcodetable", "newcounter", "newevery", "newfrenchspacing", "newmode", "newsignal", "newsystemmode", "nextbox", "nextboxdp", "nextboxht", "nextboxhtdp", "nextboxwd", "nextcounter", "nextcountervalue", "nextdepth", "nextparagraphs", "nextrealpage", "nextrealpagenumber", "nextsubcountervalue", "nextsubpage", "nextsubpagenumber", "nextuserpage", "nextuserpagenumber", "nobar", "nocap", "nocitation", "nocite", "nodetostring", "noffigurepages", "noflines", "noflocalfloats", "noheaderandfooterlines", "noindentation", "noitem", "nonfrenchspacing", "nonmathematics", "normal", "normalboldface", "normalframedwithsettings", "normalizebodyfontsize", "normalizedfontsize", "normalizefontdepth", "normalizefontheight", "normalizefontline", "normalizefontwidth", "normalizetextdepth", "normalizetextheight", "normalizetextline", "normalizetextwidth", "normaltypeface", "nospace", "note", "notesymbol", "notopandbottomlines", "ntimes", "numberofpoints", "numbers", "obeydepth", "objectdepth", "objectheight", "objectmargin", "objectwidth", "obox", "offset", "offsetbox", "onedigitrounding", "ordinaldaynumber", "ordinalstr", "ornamenttext", "outputfilename", "outputstreambox", "outputstreamcopy", "outputstreamunvbox", "outputstreamunvcopy", "over", "overbar", "overbars", "overbartext", "overbarunderbar", "overbrace", "overbracetext", "overbraceunderbrace", "overbracket", "overbrackettext", "overbracketunderbracket", "overlaybutton", "overlaycolor", "overlaydepth", "overlayfigure", "overlayheight", "overlaylinecolor", "overlaylinewidth", "overlayoffset", "overlayrollbutton", "overlaywidth", "overleftarrow", "overleftharpoondown", "overleftharpoonup", "overleftrightarrow", "overloaderror", "overparent", "overparenttext", "overparentunderparent", "overrightarrow", "overrightharpoondown", "overrightharpoonup", "overset", "overstrike", "overstrikes", "overtwoheadleftarrow", "overtwoheadrightarrow", "page", "pagearea", "pagebreak", "pagefigure", "pagegridspanwidth", "pageinjection", "pagenumber", "pagereference", "pagestaterealpage", "paletsize", "pdfTeX", "pdfactualtext", "pdfbackendactualtext", "pdfbackendcurrentresources", "pdfbackendsetcatalog", "pdfbackendsetcolorspace", "pdfbackendsetextgstate", "pdfbackendsetinfo", "pdfbackendsetname", "pdfbackendsetpageattribute", "pdfbackendsetpageresource", "pdfbackendsetpagesattribute", "pdfbackendsetpattern", "pdfbackendsetshade", "pdfcolor", "pdfeTeX", "percent", "percentdimen", "periods", "permitcaretescape", "permitcircumflexescape", "permitspacesbetweengroups", "persiandecimals", "persiannumerals", "phantom", "phantombox", "pickupgroupedcommand", "placeattachments", "placebookmarks", "placebtxrendering", "placecitation", "placecombinedlist", "placecomments", "placecurrentformulanumber", "placedbox", "placefloat", "placefloatwithsetups", "placefootnotes", "placeformula", "placeframed", "placeheadnumber", "placeheadtext", "placehelp", "placeinitial", "placelayer", "placelayeredtext", "placelist", "placelistofpublications", "placelistofsorts", "placelistofsynonyms", "placelocalfootnotes", "placelocalnotes", "placement", "placenamedfloat", "placenamedformula", "placenotes", "placeongrid", "placeontopofeachother", "placepagenumber", "placepairedbox", "placeparallel", "placerawlist", "placeregister", "placerenderingwindow", "placesidebyside", "placesubformula", "popattribute", "popmacro", "popmode", "popsystemmode", "position", "positionoverlay", "positionregionoverlay", "postponenotes", "predefinedfont", "predefinefont", "predefinesymbol", "prefixedpagenumber", "prependetoks", "prependgvalue", "prependtocommalist", "prependtoks", "prependtoksonce", "prependvalue", "presetdocument", "presetfieldsymbols", "pretocommalist", "prevcounter", "prevcountervalue", "preventmode", "prevrealpage", "prevrealpagenumber", "prevsubcountervalue", "prevsubpage", "prevsubpagenumber", "prevuserpage", "prevuserpagenumber", "procent", "processMPbuffer", "processMPfigurefile", "processaction", "processallactionsinset", "processassignlist", "processassignmentcommand", "processassignmentlist", "processbetween", "processblocks", "processbodyfontenvironmentlist", "processcolorcomponents", "processcommacommand", "processcommalist", "processcommalistwithparameters", "processcontent", "processfile", "processfilemany", "processfilenone", "processfileonce", "processfirstactioninset", "processisolatedchars", "processisolatedwords", "processlinetablebuffer", "processlinetablefile", "processlist", "processmonth", "processranges", "processseparatedlist", "processtexbuffer", "processtokens", "processuntil", "processxtablebuffer", "processyear", "product", "profiledbox", "profilegivenbox", "program", "project", "pseudoMixedCapped", "pseudoSmallCapped", "pseudoSmallcapped", "pseudosmallcapped", "purenumber", "pushattribute", "pushbutton", "pushmacro", "pushmode", "pushoutputstream", "pushsystemmode", "qquad", "quad", "quads", "quitcommalist", "quitprevcommalist", "quittypescriptscanning", "quotation", "quote", "raisebox", "randomizetext", "randomnumber", "rawcounter", "rawcountervalue", "rawdate", "rawdoifelseinset", "rawdoifinset", "rawdoifinsetelse", "rawgetparameters", "rawprocessaction", "rawprocesscommacommand", "rawprocesscommalist", "rawstructurelistuservariable", "rawsubcountervalue", "rbox", "readfile", "readfixfile", "readjobfile", "readlocfile", "readsetfile", "readsysfile", "readtexfile", "readxmlfile", "realSmallCapped", "realSmallcapped", "realpagenumber", "realsmallcapped", "recursedepth", "recurselevel", "recursestring", "redoconvertfont", "ref", "reference", "referenceprefix", "referring", "registerattachment", "registerctxluafile", "registerexternalfigure", "registerfontclass", "registerhyphenationexception", "registerhyphenationpattern", "registermenubuttons", "registersort", "registersynonym", "registerunit", "regular", "relatemarking", "relateparameterhandlers", "relaxvalueifundefined", "remainingcharacters", "remark", "removebottomthings", "removedepth", "removefromcommalist", "removelastskip", "removelastspace", "removemarkedcontent", "removepunctuation", "removesubstring", "removetoks", "removeunwantedspaces", "replacefeature", "replaceincommalist", "replaceword", "rescan", "rescanwithsetup", "resetMPdrawing", "resetMPenvironment", "resetMPinstance", "resetallattributes", "resetandaddfeature", "resetbar", "resetbreakpoints", "resetbuffer", "resetcharacteralign", "resetcharacterkerning", "resetcharacterspacing", "resetcharacterstripping", "resetcollector", "resetcounter", "resetdigitsmanipulation", "resetdirection", "resetfeature", "resetflag", "resetfontcolorsheme", "resetfontfallback", "resetfontsolution", "resethyphenationfeatures", "resetinjector", "resetinteractionmenu", "resetitaliccorrection", "resetlayer", "resetlocalfloats", "resetmarker", "resetmarking", "resetmode", "resetpagenumber", "resetparallel", "resetpath", "resetpenalties", "resetprofile", "resetreference", "resetreplacement", "resetscript", "resetsetups", "resetshownsynonyms", "resetsubpagenumber", "resetsymbolset", "resetsystemmode", "resettimer", "resettrackers", "resettrialtypesetting", "resetusedsortings", "resetusedsynonyms", "resetuserpagenumber", "resetvalue", "resetvisualizers", "reshapebox", "resolvedglyphdirect", "resolvedglyphstyled", "restartcounter", "restorebox", "restorecatcodes", "restorecounter", "restorecurrentattributes", "restoreendofline", "restoreglobalbodyfont", "reusableMPgraphic", "reuseMPgraphic", "reuserandomseed", "revivefeature", "rfence", "rhbox", "right", "rightbottombox", "rightbox", "righthbox", "rightorleftpageaction", "rightskipadaption", "rightsubguillemot", "righttolefthbox", "righttoleftvbox", "righttoleftvtop", "righttopbox", "rlap", "robustaddtocommalist", "robustdoifelseinset", "robustdoifinsetelse", "robustpretocommalist", "rollbutton", "roman", "romannumerals", "rotate", "rtop", "ruledhbox", "ruledhpack", "ruledmbox", "ruledtopv", "ruledtpack", "ruledvbox", "ruledvpack", "ruledvtop", "runMPbuffer", "runninghbox", "safechar", "sans", "sansbold", "sansnormal", "sansserif", "savebox", "savebtxdataset", "savebuffer", "savecounter", "savecurrentattributes", "savenormalmeaning", "savetaggedtwopassdata", "savetwopassdata", "sbox", "scale", "screen", "sd", "secondoffivearguments", "secondoffourarguments", "secondofsixarguments", "secondofthreearguments", "secondofthreeunexpanded", "secondoftwoarguments", "secondoftwounexpanded", "section", "select", "selectblocks", "serializecommalist", "serializedcommalist", "serif", "serifbold", "serifnormal", "setJSpreamble", "setMPlayer", "setMPpositiongraphic", "setMPpositiongraphicrange", "setMPtext", "setMPvariable", "setMPvariables", "setbar", "setbigbodyfont", "setboxllx", "setboxlly", "setbreakpoints", "setcapstrut", "setcatcodetable", "setcharacteralign", "setcharactercasing", "setcharactercleaning", "setcharacterkerning", "setcharacterspacing", "setcharacterstripping", "setcharstrut", "setcollector", "setcolormodell", "setcounter", "setcounterown", "setcurrentfontclass", "setdataset", "setdefaultpenalties", "setdigitsmanipulation", "setdirection", "setdocumentargument", "setdocumentargumentdefault", "setdocumentfilename", "setdummyparameter", "setelementexporttag", "setemeasure", "setevalue", "setevariable", "setevariables", "setfirstline", "setflag", "setfont", "setfontcolorsheme", "setfontfeature", "setfontsolution", "setfontstrut", "setfractions", "setgmeasure", "setgvalue", "setgvariable", "setgvariables", "sethboxregister", "sethyphenatedurlafter", "sethyphenatedurlbefore", "sethyphenatedurlnormal", "sethyphenationfeatures", "setinitial", "setinjector", "setinteraction", "setinterfacecommand", "setinterfaceconstant", "setinterfaceelements", "setinterfacemessage", "setinterfacevariable", "setinternalrendering", "setitaliccorrection", "setlayer", "setlayerframed", "setlayertext", "setlinefiller", "setlocalhsize", "setmainbodyfont", "setmainparbuilder", "setmarker", "setmarking", "setmathstyle", "setmeasure", "setmessagetext", "setmode", "setnostrut", "setnote", "setnotetext", "setobject", "setoldstyle", "setpagegrid", "setpagereference", "setpagestate", "setpagestaterealpageno", "setpenalties", "setpercentdimen", "setposition", "setpositionbox", "setpositiondata", "setpositiondataplus", "setpositiononly", "setpositionplus", "setpositionstrut", "setprofile", "setrandomseed", "setreference", "setreferencedobject", "setregisterentry", "setreplacement", "setrigidcolumnbalance", "setrigidcolumnhsize", "setscript", "setsectionblock", "setsimplecolumnhsize", "setsmallbodyfont", "setsmallcaps", "setstackbox", "setstructurepageregister", "setstrut", "setsuperiors", "setsystemmode", "settabular", "settaggedmetadata", "settextcontent", "settightobject", "settightreferencedobject", "settightunreferencedobject", "settrialtypesetting", "setuevalue", "setugvalue", "setunreferencedobject", "setup", "setupMPgraphics", "setupMPinstance", "setupMPpage", "setupMPvariables", "setupTABLE", "setupTEXpage", "setuparranging", "setupattachment", "setupbackend", "setupbackground", "setupbackgrounds", "setupbar", "setupblackrules", "setupblank", "setupbleeding", "setupblock", "setupbodyfont", "setupbookmark", "setupbottom", "setupbottomtexts", "setupbtx", "setupbtxdataset", "setupbtxlist", "setupbtxregister", "setupbtxrendering", "setupbuffer", "setupbutton", "setupcapitals", "setupcaption", "setupcharacterkerning", "setupcharacterspacing", "setupchemical", "setupchemicalframed", "setupclipping", "setupcollector", "setupcolor", "setupcolors", "setupcolumns", "setupcolumnspan", "setupcombination", "setupcombinedlist", "setupcomment", "setupcounter", "setupdataset", "setupdelimitedtext", "setupdescription", "setupdirections", "setupdocument", "setupeffect", "setupenumeration", "setupenv", "setupexport", "setupexternalfigure", "setupexternalsoundtracks", "setupfield", "setupfieldbody", "setupfieldcategory", "setupfieldcontentframed", "setupfieldlabelframed", "setupfields", "setupfieldtotalframed", "setupfiller", "setupfillinlines", "setupfillinrules", "setupfirstline", "setupfittingpage", "setupfloat", "setupfloatcaption", "setupfloatsplitting", "setupfontexpansion", "setupfontprotrusion", "setupfonts", "setupfontsolution", "setupfooter", "setupfootertexts", "setupforms", "setupformula", "setupformulaframed", "setupframed", "setupframedcontent", "setupframedtext", "setupglobalreferenceprefix", "setuphead", "setupheadalternative", "setupheader", "setupheadertexts", "setupheadnumber", "setupheads", "setuphelp", "setuphigh", "setuphighlight", "setuphyphenation", "setuphyphenmark", "setupindentedtext", "setupindenting", "setupinitial", "setupinsertion", "setupinteraction", "setupinteractionbar", "setupinteractionmenu", "setupinteractionscreen", "setupinterlinespace", "setupitaliccorrection", "setupitemgroup", "setupitemizations", "setupitems", "setuplabel", "setuplanguage", "setuplayer", "setuplayeredtext", "setuplayout", "setuplayouttext", "setuplinefiller", "setuplinefillers", "setuplinenote", "setuplinenumbering", "setuplines", "setuplinetable", "setuplinewidth", "setuplist", "setuplistalternative", "setuplistextra", "setuplocalfloats", "setuplocalinterlinespace", "setuplow", "setuplowhigh", "setuplowmidhigh", "setupmakeup", "setupmarginblock", "setupmargindata", "setupmarginframed", "setupmarginrule", "setupmarginrules", "setupmarking", "setupmathalignment", "setupmathcases", "setupmathematics", "setupmathfence", "setupmathfraction", "setupmathframed", "setupmathmatrix", "setupmathornament", "setupmathradical", "setupmathstackers", "setupmathstyle", "setupmixedcolumns", "setupmodule", "setupnarrower", "setupnotation", "setupnotations", "setupnote", "setupnotes", "setupoffset", "setupoffsetbox", "setupoppositeplacing", "setupoutputroutine", "setuppagechecker", "setuppagecomment", "setuppagegrid", "setuppagegridarea", "setuppagegridareatext", "setuppagegridlines", "setuppagegridspan", "setuppagegridstart", "setuppageinjection", "setuppageinjectionalternative", "setuppagenumber", "setuppagenumbering", "setuppageshift", "setuppagestate", "setuppagetransitions", "setuppairedbox", "setuppalet", "setuppaper", "setuppapersize", "setupparagraph", "setupparagraphintro", "setupparagraphnumbering", "setupparagraphs", "setupparallel", "setupperiods", "setupplacement", "setuppositionbar", "setuppositioning", "setupprocessor", "setupprofile", "setupprograms", "setupquotation", "setupquote", "setuprealpagenumber", "setupreferenceformat", "setupreferenceprefix", "setupreferencestructureprefix", "setupreferencing", "setupregister", "setupregisters", "setuprenderingwindow", "setuprotate", "setups", "setupscale", "setupscript", "setupscripts", "setupsectionblock", "setupselector", "setupshift", "setupsidebar", "setupsorting", "setupspacing", "setupspellchecking", "setupstartstop", "setupstretched", "setupstruts", "setupstyle", "setupsubformula", "setupsubpagenumber", "setupsymbolset", "setupsynonyms", "setuptables", "setuptabulate", "setuptabulation", "setuptagging", "setuptext", "setuptextbackground", "setuptextflow", "setuptextrules", "setuptexttexts", "setupthinrules", "setuptolerance", "setuptooltip", "setuptop", "setuptoptexts", "setuptype", "setuptyping", "setupunit", "setupurl", "setupuserpagenumber", "setupversion", "setupviewerlayer", "setupvspacing", "setupwhitespace", "setupwithargument", "setupwithargumentswapped", "setupxml", "setupxtable", "setuvalue", "setuxvalue", "setvalue", "setvariable", "setvariables", "setvboxregister", "setvisualizerfont", "setvtopregister", "setwidthof", "setxmeasure", "setxvalue", "setxvariable", "setxvariables", "sfrac", "shapedhbox", "showallmakeup", "showattributes", "showbodyfont", "showbodyfontenvironment", "showboxes", "showbtxdatasetauthors", "showbtxdatasetcompleteness", "showbtxdatasetfields", "showbtxfields", "showbtxhashedauthors", "showbtxtables", "showchardata", "showcharratio", "showcolor", "showcolorbar", "showcolorcomponents", "showcolorgroup", "showcolorset", "showcolorstruts", "showcounter", "showdirectives", "showdirsinmargin", "showedebuginfo", "showexperiments", "showfont", "showfontdata", "showfontkerns", "showfontparameters", "showfontstrip", "showfontstyle", "showframe", "showglyphs", "showgrid", "showgridsnapping", "showhelp", "showhyphenationtrace", "showhyphens", "showinjector", "showjustification", "showkerning", "showlayout", "showlayoutcomponents", "showligature", "showligatures", "showlogcategories", "showmakeup", "showmargins", "showmessage", "showminimalbaseline", "shownextbox", "showotfcomposition", "showpalet", "showparentchain", "showprint", "showsetups", "showsetupsdefinition", "showstruts", "showsymbolset", "showtimer", "showtokens", "showtrackers", "showvalue", "showvariable", "showwarning", "simplegroupedcommand", "singalcharacteralign", "singlebond", "sixthofsixarguments", "slanted", "slantedbold", "slicepages", "slovenianNumerals", "sloveniannumerals", "small", "smallbodyfont", "smallbold", "smallbolditalic", "smallboldslanted", "smallcappedcharacters", "smallcappedromannumerals", "smaller", "smallitalicbold", "smallnormal", "smallskip", "smallslanted", "smallslantedbold", "smalltype", "smash", "smashbox", "smashboxed", "smashedhbox", "smashedvbox", "snaptogrid", "someheadnumber", "somekindoftab", "someline", "somelocalfloat", "somenamedheadnumber", "someplace", "somewhere", "sp", "space", "spanishNumerals", "spanishnumerals", "speech", "splitatasterisk", "splitatcolon", "splitatcolons", "splitatcomma", "splitdfrac", "splitfilename", "splitfloat", "splitfrac", "splitoffbase", "splitofffull", "splitoffkind", "splitoffname", "splitoffpath", "splitoffroot", "splitofftokens", "splitofftype", "splitstring", "spreadhbox", "sqrt", "stackrel", "startJScode", "startJSpreamble", "startMPclip", "startMPcode", "startMPdefinitions", "startMPdrawing", "startMPenvironment", "startMPextensions", "startMPinclusions", "startMPinitializations", "startMPpage", "startMPpositiongraphic", "startMPpositionmethod", "startMPrun", "startTABLE", "startTABLEbody", "startTABLEfoot", "startTABLEhead", "startTABLEnext", "startTC", "startTD", "startTDs", "startTEXpage", "startTH", "startTN", "startTR", "startTRs", "startTX", "startTY", "startallmodes", "startarrangedpages", "startaside", "startattachment", "startbackground", "startbar", "startbinom", "startbitmapimage", "startblockquote", "startbtxrenderingdefinitions", "startbuffer", "startbutton", "startcatcodetable", "startchapter", "startcharacteralign", "startcheckedfences", "startchemical", "startcollect", "startcollecting", "startcolor", "startcolorintent", "startcoloronly", "startcolorset", "startcolumns", "startcolumnspan", "startcombination", "startcomment", "startcomponent", "startcontextcode", "startcontextdefinitioncode", "startctxfunction", "startctxfunctiondefinition", "startcurrentcolor", "startcurrentlistentrywrapper", "startdbinom", "startdelimited", "startdelimitedtext", "startdfrac", "startdisplaymath", "startdmath", "startdocument", "starteffect", "startelement", "startembeddedxtable", "startendofline", "startenvironment", "startexceptions", "startexpanded", "startexpandedcollect", "startextendedcatcodetable", "startexternalfigurecollection", "startfigure", "startfitfieldframed", "startfittingpage", "startfloatcombination", "startfont", "startfontclass", "startfontsolution", "startformula", "startformulas", "startfrac", "startframed", "startframedcontent", "startframedtext", "startgoto", "startgraphic", "startgridsnapping", "starthbox", "starthboxestohbox", "starthboxregister", "starthead", "starthelptext", "starthiddenbar", "starthiding", "starthighlight", "starthyphenation", "startimath", "startindentation", "startindentedtext", "startinmframed", "startinteraction", "startinteractionmenu", "startinterface", "startintermezzo", "startintertext", "startitem", "startitemgroup", "startitemize", "startknockout", "startlayout", "startline", "startlinecorrection", "startlinefiller", "startlinenumbering", "startlinetable", "startlinetablebody", "startlinetablecell", "startlinetablehead", "startlocalfootnotes", "startlocalheadsetup", "startlocallinecorrection", "startlocalnotes", "startlocalsetups", "startlua", "startluacode", "startluaparameterset", "startluasetups", "startmakeup", "startmarginblock", "startmarginrule", "startmarkedcontent", "startmathmode", "startmathstyle", "startmatrices", "startmcframed", "startmdformula", "startmframed", "startmixedcolumns", "startmode", "startmodeset", "startmodule", "startmoduletestsection", "startmpformula", "startnamedsection", "startnamedsubformulas", "startnarrow", "startnarrower", "startnegative", "startnicelyfilledbox", "startnobar", "startnointerference", "startnotallmodes", "startnotext", "startnotmode", "startopposite", "startoutputstream", "startoverbar", "startoverbars", "startoverlay", "startoverprint", "startoverstrike", "startoverstrikes", "startpacked", "startpagecomment", "startpagefigure", "startpagegrid", "startpagegridspan", "startpagelayout", "startpar", "startparagraph", "startparagraphs", "startparagraphscell", "startparbuilder", "startpath", "startplaceformula", "startplacepairedbox", "startpositioning", "startpositionoverlay", "startpositive", "startpostponing", "startprocessassignmentcommand", "startprocessassignmentlist", "startprocesscommacommand", "startprocesscommalist", "startproduct", "startproject", "startprotect", "startprotectedcolors", "startpublication", "startpunctuation", "startquotation", "startquote", "startrandomized", "startrandomseed", "startrawsetups", "startreadingfile", "startreferenceprefix", "startregime", "startregister", "startreusableMPgraphic", "startscript", "startsdformula", "startsection", "startsectionblock", "startsectionblockenvironment", "startsectionlevel", "startsetups", "startsfrac", "startshapebox", "startshift", "startsidebar", "startsimplecolumns", "startspecialitem", "startspeech", "startspformula", "startspread", "startstartstop", "startstaticMPfigure", "startstaticMPgraphic", "startstrictinspectnextcharacter", "startstructurepageregister", "startstrut", "startstyle", "startsubformulas", "startsubject", "startsubjectlevel", "startsubsection", "startsubsentence", "startsubstack", "startsubsubject", "startsubsubsection", "startsubsubsubject", "startsubsubsubsection", "startsubsubsubsubject", "startsubsubsubsubsection", "startsubsubsubsubsubject", "startsymbolset", "starttable", "starttablehead", "starttables", "starttabletail", "starttabulate", "starttabulatehead", "starttabulatetail", "starttagged", "starttbinom", "starttexcode", "starttexdefinition", "starttext", "starttextbackground", "starttextbackgroundmanual", "starttextcolor", "starttextcolorintent", "starttextflow", "starttextrule", "starttitle", "starttokens", "starttransparent", "starttypescript", "starttypescriptcollection", "startunderbar", "startunderbars", "startunderdash", "startunderdashes", "startunderdot", "startunderdots", "startunderrandom", "startunderrandoms", "startunderstrike", "startunderstrikes", "startunframed", "startuniqueMPgraphic", "startuniqueMPpagegraphic", "startunpacked", "startusableMPgraphic", "startuseMPgraphic", "startusemathstyleparameter", "startusingbtxspecification", "startvbox", "startvboxregister", "startvboxtohbox", "startvboxtohboxseparator", "startviewerlayer", "startvtop", "startvtopregister", "startxcell", "startxcellgroup", "startxfrac", "startxgroup", "startxmldisplayverbatim", "startxmlinlineverbatim", "startxmlraw", "startxmlsetups", "startxrow", "startxrowgroup", "startxtable", "startxtablebody", "startxtablefoot", "startxtablehead", "startxtablenext", "startxxfrac", "stopJScode", "stopJSpreamble", "stopMPclip", "stopMPcode", "stopMPdefinitions", "stopMPdrawing", "stopMPenvironment", "stopMPextensions", "stopMPinclusions", "stopMPinitializations", "stopMPpage", "stopMPpositiongraphic", "stopMPpositionmethod", "stopMPrun", "stopTABLE", "stopTABLEbody", "stopTABLEfoot", "stopTABLEhead", "stopTABLEnext", "stopTC", "stopTD", "stopTDs", "stopTEXpage", "stopTH", "stopTN", "stopTR", "stopTRs", "stopTX", "stopTY", "stopallmodes", "stoparrangedpages", "stopaside", "stopattachment", "stopbackground", "stopbar", "stopbinom", "stopbitmapimage", "stopblockquote", "stopbtxrenderingdefinitions", "stopbuffer", "stopbutton", "stopcatcodetable", "stopchapter", "stopcharacteralign", "stopcheckedfences", "stopchemical", "stopcollect", "stopcollecting", "stopcolor", "stopcolorintent", "stopcoloronly", "stopcolorset", "stopcolumns", "stopcolumnspan", "stopcombination", "stopcomment", "stopcomponent", "stopcontextcode", "stopcontextdefinitioncode", "stopctxfunction", "stopctxfunctiondefinition", "stopcurrentcolor", "stopcurrentlistentrywrapper", "stopdbinom", "stopdelimited", "stopdelimitedtext", "stopdfrac", "stopdisplaymath", "stopdmath", "stopdocument", "stopeffect", "stopelement", "stopembeddedxtable", "stopendofline", "stopenvironment", "stopexceptions", "stopexpanded", "stopexpandedcollect", "stopextendedcatcodetable", "stopexternalfigurecollection", "stopfigure", "stopfitfieldframed", "stopfittingpage", "stopfloatcombination", "stopfont", "stopfontclass", "stopfontsolution", "stopformula", "stopformulas", "stopfrac", "stopframed", "stopframedcontent", "stopframedtext", "stopgoto", "stopgraphic", "stopgridsnapping", "stophbox", "stophboxestohbox", "stophboxregister", "stophead", "stophelptext", "stophiddenbar", "stophiding", "stophighlight", "stophyphenation", "stopimath", "stopindentation", "stopindentedtext", "stopinmframed", "stopinteraction", "stopinteractionmenu", "stopinterface", "stopintermezzo", "stopintertext", "stopitem", "stopitemgroup", "stopitemize", "stopknockout", "stoplayout", "stopline", "stoplinecorrection", "stoplinefiller", "stoplinenumbering", "stoplinetable", "stoplinetablebody", "stoplinetablecell", "stoplinetablehead", "stoplocalfootnotes", "stoplocalheadsetup", "stoplocallinecorrection", "stoplocalnotes", "stoplocalsetups", "stoplua", "stopluacode", "stopluaparameterset", "stopluasetups", "stopmakeup", "stopmarginblock", "stopmarginrule", "stopmarkedcontent", "stopmathmode", "stopmathstyle", "stopmatrices", "stopmcframed", "stopmdformula", "stopmframed", "stopmixedcolumns", "stopmode", "stopmodeset", "stopmodule", "stopmoduletestsection", "stopmpformula", "stopnamedsection", "stopnamedsubformulas", "stopnarrow", "stopnarrower", "stopnegative", "stopnicelyfilledbox", "stopnobar", "stopnointerference", "stopnotallmodes", "stopnotext", "stopnotmode", "stopopposite", "stopoutputstream", "stopoverbar", "stopoverbars", "stopoverlay", "stopoverprint", "stopoverstrike", "stopoverstrikes", "stoppacked", "stoppagecomment", "stoppagefigure", "stoppagegrid", "stoppagegridspan", "stoppagelayout", "stoppar", "stopparagraph", "stopparagraphs", "stopparagraphscell", "stopparbuilder", "stoppath", "stopplaceformula", "stopplacepairedbox", "stoppositioning", "stoppositionoverlay", "stoppositive", "stoppostponing", "stopprocessassignmentcommand", "stopprocessassignmentlist", "stopprocesscommacommand", "stopprocesscommalist", "stopproduct", "stopproject", "stopprotect", "stopprotectedcolors", "stoppublication", "stoppunctuation", "stopquotation", "stopquote", "stoprandomized", "stoprandomseed", "stoprawsetups", "stopreadingfile", "stopreferenceprefix", "stopregime", "stopregister", "stopreusableMPgraphic", "stopscript", "stopsdformula", "stopsection", "stopsectionblock", "stopsectionblockenvironment", "stopsectionlevel", "stopsetups", "stopsfrac", "stopshapebox", "stopshift", "stopsidebar", "stopsimplecolumns", "stopspecialitem", "stopspeech", "stopspformula", "stopspread", "stopstartstop", "stopstaticMPfigure", "stopstaticMPgraphic", "stopstrictinspectnextcharacter", "stopstructurepageregister", "stopstrut", "stopstyle", "stopsubformulas", "stopsubject", "stopsubjectlevel", "stopsubsection", "stopsubsentence", "stopsubstack", "stopsubsubject", "stopsubsubsection", "stopsubsubsubject", "stopsubsubsubsection", "stopsubsubsubsubject", "stopsubsubsubsubsection", "stopsubsubsubsubsubject", "stopsymbolset", "stoptable", "stoptablehead", "stoptables", "stoptabletail", "stoptabulate", "stoptabulatehead", "stoptabulatetail", "stoptagged", "stoptbinom", "stoptexcode", "stoptexdefinition", "stoptext", "stoptextbackground", "stoptextbackgroundmanual", "stoptextcolor", "stoptextcolorintent", "stoptextflow", "stoptextrule", "stoptitle", "stoptokens", "stoptransparent", "stoptypescript", "stoptypescriptcollection", "stopunderbar", "stopunderbars", "stopunderdash", "stopunderdashes", "stopunderdot", "stopunderdots", "stopunderrandom", "stopunderrandoms", "stopunderstrike", "stopunderstrikes", "stopunframed", "stopuniqueMPgraphic", "stopuniqueMPpagegraphic", "stopunpacked", "stopusableMPgraphic", "stopuseMPgraphic", "stopusemathstyleparameter", "stopusingbtxspecification", "stopvbox", "stopvboxregister", "stopvboxtohbox", "stopvboxtohboxseparator", "stopviewerlayer", "stopvtop", "stopvtopregister", "stopxcell", "stopxcellgroup", "stopxfrac", "stopxgroup", "stopxmldisplayverbatim", "stopxmlinlineverbatim", "stopxmlraw", "stopxmlsetups", "stopxrow", "stopxrowgroup", "stopxtable", "stopxtablebody", "stopxtablefoot", "stopxtablehead", "stopxtablenext", "stopxxfrac", "stretched", "strictdoifelsenextoptional", "strictdoifnextoptionalelse", "stripcharacter", "strippedcsname", "stripspaces", "structurelistuservariable", "structurenumber", "structuretitle", "structureuservariable", "structurevariable", "strut", "strutdp", "strutht", "struthtdp", "struttedbox", "strutwd", "style", "styleinstance", "subject", "subpagenumber", "subsection", "subsentence", "substituteincommalist", "subsubject", "subsubsection", "subsubsubject", "subsubsubsection", "subsubsubsubject", "subsubsubsubsection", "subsubsubsubsubject", "subtractfeature", "swapcounts", "swapdimens", "swapface", "swapmacros", "swaptypeface", "switchstyleonly", "switchtobodyfont", "switchtocolor", "switchtointerlinespace", "symbol", "symbolreference", "synchronizeblank", "synchronizeindenting", "synchronizemarking", "synchronizeoutputstreams", "synchronizestrut", "synchronizewhitespace", "systemlog", "systemlogfirst", "systemloglast", "systemsetups", "tLeftarrow", "tLeftrightarrow", "tRightarrow", "table", "tabulateautoline", "tabulateautorule", "tabulateline", "tabulaterule", "taggedctxcommand", "taggedlabeltexts", "tbinom", "tbox", "tequal", "testandsplitstring", "testcolumn", "testfeature", "testfeatureonce", "testpage", "testpageonly", "testpagesync", "testtokens", "tex", "texdefinition", "texsetup", "textcitation", "textcite", "textcontrolspace", "textflowcollector", "textmath", "textminus", "textormathchar", "textplus", "textreference", "textrule", "textvisiblespace", "tfrac", "thainumerals", "thefirstcharacter", "thenormalizedbodyfontsize", "theremainingcharacters", "thickspace", "thinrule", "thinrules", "thinspace", "thirdoffivearguments", "thirdoffourarguments", "thirdofsixarguments", "thirdofthreearguments", "thirdofthreeunexpanded", "thookleftarrow", "thookrightarrow", "threedigitrounding", "tibetannumerals", "tightlayer", "tinyfont", "title", "tlap", "tleftarrow", "tleftharpoondown", "tleftharpoonup", "tleftrightarrow", "tleftrightharpoons", "tmapsto", "tochar", "tolinenote", "topbox", "topleftbox", "toplinebox", "toprightbox", "topskippedbox", "tracecatcodetables", "tracedfontname", "traceoutputroutines", "tracepositions", "translate", "transparencycomponents", "transparent", "trel", "trightarrow", "trightharpoondown", "trightharpoonup", "trightleftharpoons", "trightoverleftarrow", "triplebond", "truefilename", "truefontname", "ttriplerel", "ttwoheadleftarrow", "ttwoheadrightarrow", "twodigitrounding", "tx", "txx", "typ", "type", "typebuffer", "typedefinedbuffer", "typeface", "typefile", "typescriptone", "typescriptprefix", "typescriptthree", "typescripttwo", "typesetbuffer", "typesetfile", "uconvertnumber", "uedcatcodecommand", "undefinevalue", "undepthed", "underbar", "underbars", "underbartext", "underbrace", "underbracetext", "underbracket", "underbrackettext", "underdash", "underdashes", "underdot", "underdots", "underleftarrow", "underleftharpoondown", "underleftharpoonup", "underleftrightarrow", "underparent", "underparenttext", "underrandom", "underrandoms", "underrightarrow", "underrightharpoondown", "underrightharpoonup", "underset", "understrike", "understrikes", "undertwoheadleftarrow", "undertwoheadrightarrow", "undoassign", "unframed", "unhhbox", "unihex", "uniqueMPgraphic", "uniqueMPpagegraphic", "unknown", "unprotected", "unregisterhyphenationpattern", "unspaceafter", "unspaceargument", "unspaced", "unspacestring", "untexargument", "untexcommand", "uppercased", "uppercasestring", "upperleftdoubleninequote", "upperleftdoublesixquote", "upperleftsingleninequote", "upperleftsinglesixquote", "upperrightdoubleninequote", "upperrightdoublesixquote", "upperrightsingleninequote", "upperrightsinglesixquote", "url", "useJSscripts", "useMPenvironmentbuffer", "useMPgraphic", "useMPlibrary", "useMPrun", "useMPvariables", "useURL", "useblankparameter", "useblocks", "usebodyfont", "usebodyfontparameter", "usebtxdataset", "usebtxdefinitions", "usecolors", "usecomponent", "usedirectory", "usedummycolorparameter", "usedummystyleandcolor", "usedummystyleparameter", "useenvironment", "useexternaldocument", "useexternalfigure", "useexternalrendering", "useexternalsoundtrack", "usefigurebase", "usefile", "usegridparameter", "useindentingparameter", "useindentnextparameter", "useinterlinespaceparameter", "uselanguageparameter", "useluamodule", "usemathstyleparameter", "usemodule", "useproduct", "useprofileparameter", "useproject", "usereferenceparameter", "userpagenumber", "usesetupsparameter", "usestaticMPfigure", "usesubpath", "usesymbols", "usetexmodule", "usetypescript", "usetypescriptfile", "useurl", "usezipfile", "utfchar", "utflower", "utfupper", "utilityregisterlength", "vboxreference", "verbatim", "verbatimstring", "verbosenumber", "version", "verticalgrowingbar", "verticalpositionbar", "vglue", "viewerlayer", "vl", "vphantom", "vpos", "vsmash", "vsmashbox", "vsmashed", "vspace", "vspacing", "wdofstring", "weekday", "widthofstring", "widthspanningtext", "withoutpt", "word", "words", "wordtonumber", "writebetweenlist", "writedatatolist", "writestatus", "writetolist", "xLeftarrow", "xLeftrightarrow", "xRightarrow", "xdefconvertedargument", "xequal", "xfrac", "xhookleftarrow", "xhookrightarrow", "xleftarrow", "xleftharpoondown", "xleftharpoonup", "xleftrightarrow", "xleftrightharpoons", "xmapsto", "xmladdindex", "xmlafterdocumentsetup", "xmlaftersetup", "xmlall", "xmlappenddocumentsetup", "xmlappendsetup", "xmlapplyselectors", "xmlatt", "xmlattdef", "xmlattribute", "xmlattributedef", "xmlbadinclusions", "xmlbeforedocumentsetup", "xmlbeforesetup", "xmlchainatt", "xmlchainattdef", "xmlchecknamespace", "xmlcommand", "xmlconcat", "xmlconcatrange", "xmlcontext", "xmlcount", "xmldefaulttotext", "xmldirectives", "xmldirectivesafter", "xmldirectivesbefore", "xmldisplayverbatim", "xmldoif", "xmldoifelse", "xmldoifelseempty", "xmldoifelseselfempty", "xmldoifelsetext", "xmldoifelsevalue", "xmldoifnot", "xmldoifnotselfempty", "xmldoifnottext", "xmldoifselfempty", "xmldoiftext", "xmlelement", "xmlfilter", "xmlfirst", "xmlflush", "xmlflushcontext", "xmlflushdocumentsetups", "xmlflushlinewise", "xmlflushpure", "xmlflushspacewise", "xmlflushtext", "xmlinclude", "xmlinclusion", "xmlinclusions", "xmlinfo", "xmlinjector", "xmlinlineverbatim", "xmlinstalldirective", "xmllast", "xmllastatt", "xmllastmatch", "xmlloadbuffer", "xmlloaddata", "xmlloaddirectives", "xmlloadfile", "xmlloadonly", "xmlmain", "xmlmapvalue", "xmlname", "xmlnamespace", "xmlnonspace", "xmlpath", "xmlpos", "xmlposition", "xmlprependdocumentsetup", "xmlprependsetup", "xmlprettyprint", "xmlprocessbuffer", "xmlprocessdata", "xmlprocessfile", "xmlpure", "xmlraw", "xmlrefatt", "xmlregistereddocumentsetups", "xmlregisteredsetups", "xmlregisterns", "xmlremapname", "xmlremapnamespace", "xmlremovedocumentsetup", "xmlremovesetup", "xmlresetdocumentsetups", "xmlresetinjectors", "xmlresetsetups", "xmlsave", "xmlsetentity", "xmlsetfunction", "xmlsetinjectors", "xmlsetsetup", "xmlsetup", "xmlshow", "xmlsnippet", "xmlstrip", "xmlstripnolines", "xmlstripped", "xmlstrippednolines", "xmltag", "xmltexentity", "xmltext", "xmltobuffer", "xmltobufferverbose", "xmltofile", "xmlvalue", "xmlverbatim", "xrel", "xrightarrow", "xrightharpoondown", "xrightharpoonup", "xrightleftharpoons", "xrightoverleftarrow", "xsplitstring", "xtriplerel", "xtwoheadleftarrow", "xtwoheadrightarrow", "xxfrac", "xypos" }, - ["fr"]={ "AMSTEX", "AfterPar", "Alphabeticnumerals", "AmSTeX", "And", "BeforePar", "Big", "Bigg", "Biggl", "Biggm", "Biggr", "Bigl", "Bigm", "Bigr", "CONTEXT", "Cap", "Caps", "Caractere", "Caracteres", "Chiffresromains", "ConTeXt", "Context", "ConvertConstantAfter", "ConvertToConstant", "ETEX", "EveryLine", "EveryPar", "GetPar", "GotoPar", "Greeknumerals", "INRSTEX", "JOURSEMAINE", "LAMSTEX", "LATEX", "LUAJITTEX", "LUATEX", "LaTeX", "LamSTeX", "Lua", "LuaTeX", "LuajitTeX", "METAFONT", "METAFUN", "METAPOST", "MKII", "MKIV", "MKIX", "MKVI", "MKXI", "MOIS", "MONTHLONG", "MONTHSHORT", "MOT", "MOTS", "MPII", "MPIV", "MPVI", "MPanchor", "MPbetex", "MPc", "MPcode", "MPcolor", "MPcoloronly", "MPcolumn", "MPd", "MPdrawing", "MPfontsizehskip", "MPgetmultipars", "MPgetmultishape", "MPgetposboxes", "MPh", "MPinclusions", "MPleftskip", "MPll", "MPlr", "MPls", "MPmenubuttons", "MPn", "MPoptions", "MPoverlayanchor", "MPp", "MPpage", "MPpardata", "MPplus", "MPpos", "MPpositiongraphic", "MPposset", "MPr", "MPrawvar", "MPregion", "MPrest", "MPrightskip", "MPrs", "MPstring", "MPtext", "MPtransparency", "MPul", "MPur", "MPv", "MPvar", "MPvariable", "MPvv", "MPw", "MPwhd", "MPx", "MPxy", "MPxywhd", "MPy", "MetaFont", "MetaFun", "MetaPost", "Mot", "Mots", "NormalizeFontHeight", "NormalizeFontWidth", "NormalizeTextHeight", "NormalizeTextWidth", "Numeros", "PDFETEX", "PDFTEX", "PDFcolor", "PICTEX", "PPCHTEX", "PPCHTeX", "PRAGMA", "PiCTeX", "PointsToBigPoints", "PointsToReal", "PointsToWholeBigPoints", "PtToCm", "ReadFile", "ScaledPointsToBigPoints", "ScaledPointsToWholeBigPoints", "Smallcapped", "TABLE", "TEX", "TEXpage", "TaBlE", "TeX", "TheNormalizedFontSize", "TransparencyHack", "VerboseNumber", "WidthSpanningText", "XETEX", "XeTeX", "a", "abjadnaivenumerals", "abjadnodotnumerals", "abjadnumerals", "activatespacehandler", "adaptcollector", "adaptedisposition", "adaptfontfeature", "adaptpapersize", "addfeature", "addtoJSpreamble", "addtocommalist", "addvalue", "aftersplitstring", "aftertestandsplitstring", "ajustechamp", "alaligne", "alapage", "alignmentcharacter", "allinputpaths", "alphabeticnumerals", "alwayscitation", "alwayscite", "ampersand", "anchor", "appendetoks", "appendgvalue", "appendtocommalist", "appendtoks", "appendtoksonce", "appendvalue", "apply", "applyalternativestyle", "applyprocessor", "applytocharacters", "applytofirstcharacter", "applytosplitstringchar", "applytosplitstringcharspaced", "applytosplitstringline", "applytosplitstringlinespaced", "applytosplitstringword", "applytosplitstringwordspaced", "applytowords", "arabicdecimals", "arabicexnumerals", "arabicnumerals", "arg", "arriereplan", "asciistr", "aside", "assignalfadimension", "assigndimen", "assigndimension", "assignifempty", "assigntranslation", "assignvalue", "assignwidth", "assumelongusagecs", "astype", "attachment", "autocap", "autodirhbox", "autodirvbox", "autodirvtop", "autoinsertnextspace", "automathematics", "autosetups", "availablehsize", "averagecharwidth", "backgroundimage", "backgroundimagefill", "backgroundline", "baha", "barrecouleur", "barreinteraction", "bas", "basegrid", "baselineleftbox", "baselinemiddlebox", "baselinerightbox", "bbox", "beforesplitstring", "beforetestandsplitstring", "big", "bigbodyfont", "bigg", "bigger", "biggl", "biggm", "biggr", "bigl", "bigm", "bigr", "bigskip", "binom", "bitmapimage", "blap", "bleed", "bleedheight", "bleedwidth", "blockligatures", "blockquote", "bodyfontenvironmentlist", "bodyfontsize", "bold", "boldface", "bolditalic", "boldslanted", "booleanmodevalue", "bottombox", "bottomleftbox", "bottomrightbox", "bouton", "boutonmenu", "boutonsinteraction", "boxcursor", "boxmarker", "boxofsize", "boxreference", "bpos", "bthiddencitation", "btxabbreviatedjournal", "btxaddjournal", "btxalwayscitation", "btxauthorfield", "btxdetail", "btxdirect", "btxdoif", "btxdoifcombiinlistelse", "btxdoifelse", "btxdoifelsecombiinlist", "btxdoifelsesameasprevious", "btxdoifelsesameaspreviouschecked", "btxdoifelseuservariable", "btxdoifnot", "btxdoifsameaspreviouscheckedelse", "btxdoifsameaspreviouselse", "btxdoifuservariableelse", "btxexpandedjournal", "btxfield", "btxfieldname", "btxfieldtype", "btxfirstofrange", "btxflush", "btxflushauthor", "btxflushauthorinverted", "btxflushauthorinvertedshort", "btxflushauthorname", "btxflushauthornormal", "btxflushauthornormalshort", "btxflushsuffix", "btxfoundname", "btxfoundtype", "btxhybridcite", "btxlistcitation", "btxloadjournalist", "btxoneorrange", "btxremapauthor", "btxsavejournalist", "btxsetup", "btxsingularorplural", "btxsingularplural", "btxtextcitation", "cache", "cacheblocs", "calligraphic", "camel", "cap", "caractere", "caracteres", "catcodetablename", "cbox", "centerbox", "centeredbox", "centerednextbox", "cfrac", "champ", "changepolicecorps", "chapitre", "chardescription", "charwidthlanguage", "checkcharacteralign", "checkedchar", "checkedfiller", "checkedstrippedcsname", "checkinjector", "checknextindentation", "checknextinjector", "checkpage", "checkparameters", "checkpreviousinjector", "checksoundtrack", "checktwopassdata", "checkvariables", "chem", "chemical", "chemicalbottext", "chemicalmidtext", "chemicalsymbol", "chemicaltext", "chemicaltoptext", "chiffresromains", "chineseallnumerals", "chinesecapnumerals", "chinesenumerals", "citation", "cite", "citer", "clap", "classfont", "cldcommand", "cldcontext", "cldloadfile", "cldprocessfile", "cleftarrow", "clip", "clonechamp", "collect", "collectedtext", "collectexpanded", "colonne", "colorcomponents", "colored", "coloronly", "columnbreak", "combinepages", "commalistelement", "commalistsentence", "commalistsize", "comment", "commentaire", "comparedimension", "comparedimensioneps", "comparegroupecouleur", "comparepalette", "completebtxrendering", "completelist", "completelistofpublications", "completelistofsorts", "completelistofsynonyms", "completenumeropage", "completeregistre", "complexorsimple", "complexorsimpleempty", "composant", "composedcollector", "composedlayer", "compresult", "concernant", "constantdimen", "constantdimenargument", "constantemptyargument", "constantnumber", "constantnumberargument", "contentreference", "continuednumber", "continueifinputfile", "convertargument", "convertcommand", "convertedcounter", "converteddimen", "convertedsubcounter", "convertitnumero", "convertmonth", "convertvalue", "convertvboxtohbox", "copitchamp", "copypages", "copyparameters", "copyposition", "corrigeespaceblanc", "couleur", "couleurgrise", "countersubs", "counttoken", "counttokens", "cramped", "crampedclap", "crampedllap", "crampedrlap", "crightarrow", "crightoverleftarrow", "ctop", "ctxcommand", "ctxdirectcommand", "ctxdirectlua", "ctxfunction", "ctxlatecommand", "ctxlatelua", "ctxloadluafile", "ctxlua", "ctxluabuffer", "ctxluacode", "ctxreport", "ctxsprint", "currentassignmentlistkey", "currentassignmentlistvalue", "currentbtxuservariable", "currentcommalistitem", "currentcomponent", "currentenvironment", "currentfeaturetest", "currentinterface", "currentlanguage", "currentlistentrydestinationattribute", "currentlistentrylimitedtext", "currentlistentrynumber", "currentlistentrypagenumber", "currentlistentryreferenceattribute", "currentlistentrytitle", "currentlistentrytitlerendered", "currentlistsymbol", "currentmainlanguage", "currentmessagetext", "currentmoduleparameter", "currentoutputstream", "currentproduct", "currentproject", "currentregime", "currentregisterpageuserdata", "currentresponses", "currenttime", "currentvalue", "currentxtablecolumn", "currentxtablerow", "dactylographier", "dans", "datasetvariable", "date", "datecourante", "dayoftheweek", "dayspermonth", "dbinom", "de", "decrement", "decrementcounter", "decrementedcounter", "decrementpagenumber", "decrementsubpagenumber", "decrementvalue", "defaultinterface", "defaultobjectpage", "defaultobjectreference", "defcatcodecommand", "defconvertedargument", "defconvertedcommand", "defconvertedvalue", "defineMPinstance", "defineTABLEsetup", "defineactivecharacter", "definealternativestyle", "defineanchor", "defineattachment", "defineattribute", "definebackground", "definebar", "definebodyfontswitch", "definebreakpoint", "definebreakpoints", "definebtx", "definebtxdataset", "definebtxregister", "definebtxrendering", "definebutton", "definecapitals", "definecharacterkerning", "definecharacterspacing", "definechemical", "definechemicals", "definechemicalsymbol", "definecollector", "definecombination", "definecomment", "definecomplexorsimple", "definecomplexorsimpleempty", "defineconversionset", "definecounter", "definedataset", "definedelimitedtext", "definedfont", "defineeffect", "defineexpandable", "defineexternalfigure", "definefallbackfamily", "definefieldbody", "definefieldbodyset", "definefieldcategory", "definefileconstant", "definefilefallback", "definefilesynonym", "definefiller", "definefirstline", "definefittingpage", "definefontalternative", "definefontfallback", "definefontfamily", "definefontfamilypreset", "definefontfeature", "definefontfile", "definefontsize", "definefontsolution", "defineformula", "defineformulaalternative", "defineformulaframed", "defineframed", "defineframedcontent", "defineframedtext", "definefrozenfont", "defineglobalcolor", "definegraphictypesynonym", "definegridsnapping", "defineheadalternative", "definehelp", "definehigh", "definehighlight", "definehspace", "definehypenationfeatures", "defineindentedtext", "defineindenting", "defineinitial", "defineinsertion", "defineinteraction", "defineinteractionbar", "defineinterfaceconstant", "defineinterfaceelement", "defineinterfacevariable", "defineinterlinespace", "defineintermediatecolor", "defineitemgroup", "defineitems", "definelabelclass", "definelayerpreset", "definelinefiller", "definelinenote", "definelinenumbering", "definelines", "definelistalternative", "definelistextra", "definelow", "definelowhigh", "definelowmidhigh", "definemarginblock", "definemargindata", "definemarker", "definemathalignment", "definemathcases", "definemathcommand", "definemathdoubleextensible", "definemathematics", "definemathextensible", "definemathfence", "definemathfraction", "definemathframed", "definemathmatrix", "definemathornament", "definemathoverextensible", "definemathovertextextensible", "definemathradical", "definemathstackers", "definemathstyle", "definemathtriplet", "definemathunderextensible", "definemathundertextextensible", "definemathunstacked", "definemeasure", "definemessageconstant", "definemixedcolumns", "definemode", "definemultitonecolor", "definenamedcolor", "definenamespace", "definenarrower", "definenote", "defineornament", "defineoutputroutine", "defineoutputroutinecommand", "definepage", "definepagechecker", "definepagegrid", "definepagegridarea", "definepagegridspan", "definepageinjection", "definepageinjectionalternative", "definepageshift", "definepagestate", "definepairedbox", "defineparagraph", "defineparallel", "defineparbuilder", "defineplacement", "definepositioning", "defineprefixset", "defineprocesscolor", "defineprocessor", "definepushbutton", "definepushsymbol", "definerenderingwindow", "defineresetset", "definescale", "definescript", "definesectionlevels", "defineselector", "defineseparatorset", "defineshift", "definesidebar", "definesort", "definespotcolor", "definestyleinstance", "definesubformula", "definesynonym", "definesystemattribute", "definesystemconstant", "definesystemvariable", "definetabulation", "definetextbackground", "definetextflow", "definetooltip", "definetransparency", "definetwopasslist", "definetypeface", "definetypescriptprefix", "definetypescriptsynonym", "definetypesetting", "defineunit", "defineviewerlayer", "definevspace", "definevspacing", "definevspacingamount", "definextable", "definit", "definitbloc", "definitblocsection", "definitbuffer", "definitcalque", "definitchamp", "definitconversion", "definitcouleur", "definitdactylo", "definitdemarrestoppe", "definitdescription", "definitdisposition", "definitenumeration", "definitenvironnementpolicecorps", "definitetiquette", "definitflottant", "definitformatreference", "definitgroupecouleur", "definithbox", "definitliste", "definitlisteimbriquee", "definitmakeup", "definitmarquage", "definitmenuinteraction", "definitpalette", "definitparagraphes", "definitpilechamp", "definitpolice", "definitpolicecorps", "definitprofil", "definitprogramme", "definitreference", "definitregistre", "definitrevetement", "definitsautdecolonne", "definitsautdepage", "definitsection", "definitsouschamp", "definitstyle", "definitstylepolice", "definitsymbole", "definitsymbolefigure", "definitsynonymepolice", "definitsynonymes", "definittabulation", "definittaillepapier", "definittete", "definittexte", "definittrametableau", "definittri", "definittype", "definitvide", "delimited", "delimitedtext", "demarreJScode", "demarreJSpreamble", "demarreMPclip", "demarreMPcode", "demarreMPdefinitions", "demarreMPdrawing", "demarreMPenvironment", "demarreMPextensions", "demarreMPinclusions", "demarreMPinitializations", "demarreMPpage", "demarreMPpositiongraphic", "demarreMPpositionmethod", "demarreMPrun", "demarreTABLE", "demarreTABLEbody", "demarreTABLEfoot", "demarreTABLEhead", "demarreTABLEnext", "demarreTC", "demarreTD", "demarreTDs", "demarreTEXpage", "demarreTH", "demarreTN", "demarreTR", "demarreTRs", "demarreTX", "demarreTY", "demarreallmodes", "demarrearrangedpages", "demarrearriereplan", "demarreaside", "demarreattachment", "demarrebar", "demarrebinom", "demarrebitmapimage", "demarreblockquote", "demarrebtxrenderingdefinitions", "demarrebuffer", "demarrebutton", "demarrecatcodetable", "demarrechapitre", "demarrecharacteralign", "demarrecheckedfences", "demarrechemical", "demarrecitation", "demarreciter", "demarrecollect", "demarrecollecting", "demarrecolorintent", "demarrecoloronly", "demarrecolorset", "demarrecolumns", "demarrecolumnspan", "demarrecombination", "demarrecomment", "demarrecommentaire", "demarrecomposant", "demarrecontextcode", "demarrecontextdefinitioncode", "demarrecouleur", "demarrectxfunction", "demarrectxfunctiondefinition", "demarrecurrentcolor", "demarrecurrentlistentrywrapper", "demarredbinom", "demarredelimited", "demarredelimitedtext", "demarredfrac", "demarrediscours", "demarredisplaymath", "demarredmath", "demarredocument", "demarreeffect", "demarreelement", "demarreembeddedxtable", "demarreendofline", "demarreenvironement", "demarreexceptions", "demarreexpanded", "demarreexpandedcollect", "demarreextendedcatcodetable", "demarreexternalfigurecollection", "demarrefigure", "demarrefitfieldframed", "demarrefittingpage", "demarrefloatcombination", "demarrefont", "demarrefontclass", "demarrefontsolution", "demarreformula", "demarreformulas", "demarrefrac", "demarreframed", "demarreframedcontent", "demarreframedtext", "demarregraphique", "demarregridsnapping", "demarregroupe", "demarrehbox", "demarrehboxestohbox", "demarrehboxregister", "demarrehelptext", "demarrehiddenbar", "demarrehiding", "demarrehighlight", "demarrehyphenation", "demarreimath", "demarreindentation", "demarreindentedtext", "demarreinmframed", "demarreinteraction", "demarreinterface", "demarreintermezzo", "demarreintertext", "demarreitemgroup", "demarreknockout", "demarrelayout", "demarreligne", "demarreligneregleetexte", "demarrelinecorrection", "demarrelinefiller", "demarrelinenumbering", "demarrelinetable", "demarrelinetablebody", "demarrelinetablecell", "demarrelinetablehead", "demarrelister", "demarrelocalfootnotes", "demarrelocalheadsetup", "demarrelocallinecorrection", "demarrelocalnotes", "demarrelocalsetups", "demarrelua", "demarreluacode", "demarreluaparameterset", "demarreluasetups", "demarremakeup", "demarremargereglee", "demarremarginblock", "demarremarkedcontent", "demarremathmode", "demarremathstyle", "demarrematrices", "demarremcframed", "demarremdformula", "demarremenuinteraction", "demarremframed", "demarremixedcolumns", "demarremode", "demarremodeset", "demarremodule", "demarremoduletestsection", "demarrempformula", "demarrenamedsection", "demarrenamedsubformulas", "demarrenarrow", "demarrenarrower", "demarrenegative", "demarrenicelyfilledbox", "demarrenobar", "demarrenointerference", "demarrenotallmodes", "demarrenotext", "demarrenotmode", "demarreopposite", "demarreoutputstream", "demarreoverbar", "demarreoverbars", "demarreoverlay", "demarreoverprint", "demarrepagecomment", "demarrepagefigure", "demarrepagegrid", "demarrepagegridspan", "demarrepagelayout", "demarrepar", "demarreparagraph", "demarreparagraphs", "demarreparagraphscell", "demarreparbuilder", "demarrepath", "demarreplaceformule", "demarreplacepairedbox", "demarrepositioning", "demarrepositionoverlay", "demarrepositive", "demarrepostponing", "demarreprocessassignmentcommand", "demarreprocessassignmentlist", "demarreprocesscommacommand", "demarreprocesscommalist", "demarreproduit", "demarreprojet", "demarreprotect", "demarreprotectedcolors", "demarrepublication", "demarrepunctuation", "demarrerandomized", "demarrerandomseed", "demarrerawsetups", "demarrereadingfile", "demarrereferenceprefix", "demarreregime", "demarrereusableMPgraphic", "demarrescript", "demarresdformula", "demarresection", "demarresectionblock", "demarresectionblockenvironment", "demarresectionlevel", "demarresetups", "demarresfrac", "demarreshapebox", "demarreshift", "demarresidebar", "demarresimplecolumns", "demarresousligne", "demarresouslignetout", "demarresoussection", "demarresoussoussection", "demarresoussoussoussection", "demarresoussoussoussoussection", "demarresoussoussoussoussujet", "demarresoussoussoussujet", "demarresoussoussujet", "demarresoussujet", "demarrespecialitem", "demarrespeech", "demarrespformula", "demarrespread", "demarrestartstop", "demarrestaticMPfigure", "demarrestaticMPgraphic", "demarrestrictinspectnextcharacter", "demarrestrut", "demarrestyle", "demarresubformulas", "demarresubjectlevel", "demarresubsentence", "demarresubstack", "demarresujet", "demarresurligne", "demarresurlignetout", "demarresymbolset", "demarretable", "demarretableau", "demarretablehead", "demarretables", "demarretabletail", "demarretabulate", "demarretabulatehead", "demarretabulatetail", "demarretagged", "demarretbinom", "demarretete", "demarretexcode", "demarretexdefinition", "demarretext", "demarretextbackground", "demarretextbackgroundmanual", "demarretextcolor", "demarretextcolorintent", "demarretexteaide", "demarretexteencadre", "demarretextflow", "demarretitre", "demarretokens", "demarretransparent", "demarretypescript", "demarretypescriptcollection", "demarreunderdash", "demarreunderdashes", "demarreunderdot", "demarreunderdots", "demarreunderrandom", "demarreunderrandoms", "demarreunderstrike", "demarreunderstrikes", "demarreunframed", "demarreuniqueMPgraphic", "demarreuniqueMPpagegraphic", "demarreunpacked", "demarreusableMPgraphic", "demarreuseMPgraphic", "demarreusemathstyleparameter", "demarreusingbtxspecification", "demarreva", "demarrevbox", "demarrevboxregister", "demarrevboxtohbox", "demarrevboxtohboxseparator", "demarreviewerlayer", "demarrevtop", "demarrevtopregister", "demarrexcell", "demarrexcellgroup", "demarrexfrac", "demarrexgroup", "demarrexmldisplayverbatim", "demarrexmlinlineverbatim", "demarrexmlraw", "demarrexmlsetups", "demarrexrow", "demarrexrowgroup", "demarrextable", "demarrextablebody", "demarrextablefoot", "demarrextablehead", "demarrextablenext", "demarrexxfrac", "depthofstring", "depthonlybox", "depthspanningtext", "determinecaracteristiqueliste", "determinecaracteristiquesregistre", "determinenoflines", "determinenumerotete", "devanagarinumerals", "dfrac", "digits", "dimensiontocount", "directcolor", "directcolored", "directconvertedcounter", "directdummyparameter", "directgetboxllx", "directgetboxlly", "directhighlight", "directlocalframed", "directluacode", "directselect", "directsetbar", "directsetup", "directsymbol", "directvspacing", "dis", "disabledirectives", "disableexperiments", "disablemode", "disableoutputstream", "disableparpositions", "disableregime", "disabletrackers", "discours", "displaymath", "displaymathematics", "displaymessage", "distributedhsize", "dividedsize", "doadaptleftskip", "doadaptrightskip", "doaddfeature", "doassign", "doassignempty", "doboundtext", "docheckassignment", "docheckedpagestate", "docheckedpair", "documentvariable", "dodoubleargument", "dodoubleargumentwithset", "dodoubleempty", "dodoubleemptywithset", "dodoublegroupempty", "doeassign", "doexpandedrecurse", "dogetattribute", "dogetattributeid", "dogetcommacommandelement", "dogobbledoubleempty", "dogobblesingleempty", "doif", "doifMPgraphicelse", "doifallcommon", "doifallcommonelse", "doifalldefinedelse", "doifallmodes", "doifallmodeselse", "doifassignmentelse", "doifblackelse", "doifbothsides", "doifbothsidesoverruled", "doifboxelse", "doifbufferelse", "doifcolor", "doifcolorelse", "doifcommandhandler", "doifcommandhandlerelse", "doifcommon", "doifcommonelse", "doifcontent", "doifconversiondefinedelse", "doifconversionnumberelse", "doifcounter", "doifcounterelse", "doifcurrentfonthasfeatureelse", "doifdefined", "doifdefinedcounter", "doifdefinedcounterelse", "doifdefinedelse", "doifdimensionelse", "doifdimenstringelse", "doifdocumentargument", "doifdocumentargumentelse", "doifdocumentfilename", "doifdocumentfilenameelse", "doifdrawingblackelse", "doifelse", "doifelseMPgraphic", "doifelseallcommon", "doifelsealldefined", "doifelseallmodes", "doifelseassignment", "doifelseblack", "doifelsebox", "doifelsebuffer", "doifelsecolor", "doifelsecommandhandler", "doifelsecommon", "doifelseconversiondefined", "doifelseconversionnumber", "doifelsecounter", "doifelsecurrentfonthasfeature", "doifelsecurrentsortingused", "doifelsecurrentsynonymshown", "doifelsecurrentsynonymused", "doifelsedefined", "doifelsedefinedcounter", "doifelsedimension", "doifelsedimenstring", "doifelsedocumentargument", "doifelsedocumentfilename", "doifelsedrawingblack", "doifelseempty", "doifelseemptyvalue", "doifelseemptyvariable", "doifelseenv", "doifelsefastoptionalcheck", "doifelsefastoptionalcheckcs", "doifelsefieldbody", "doifelsefieldcategory", "doifelsefigure", "doifelsefile", "doifelsefiledefined", "doifelsefileexists", "doifelsefirstchar", "doifelseflagged", "doifelsefontchar", "doifelsefontpresent", "doifelsefontsynonym", "doifelsehasspace", "doifelsehelp", "doifelseincsname", "doifelseinelement", "doifelseinputfile", "doifelseinsertion", "doifelseinset", "doifelseinstring", "doifelseinsymbolset", "doifelseintoks", "doifelseintwopassdata", "doifelseitalic", "doifelselanguage", "doifelselayerdata", "doifelselayoutdefined", "doifelselayoutsomeline", "doifelselayouttextline", "doifelseleapyear", "doifelselist", "doifelselocation", "doifelselocfile", "doifelsemainfloatbody", "doifelsemarking", "doifelsemeaning", "doifelsemessage", "doifelsemode", "doifelsenextbgroup", "doifelsenextbgroupcs", "doifelsenextchar", "doifelsenextoptional", "doifelsenextoptionalcs", "doifelsenextparenthesis", "doifelsenonzeropositive", "doifelsenoteonsamepage", "doifelsenothing", "doifelsenumber", "doifelseobjectfound", "doifelseobjectreferencefound", "doifelseoddpage", "doifelseoddpagefloat", "doifelseoldercontext", "doifelseolderversion", "doifelseoverlapping", "doifelseoverlay", "doifelseparallel", "doifelseparentfile", "doifelsepath", "doifelsepathexists", "doifelsepatterns", "doifelseposition", "doifelsepositionaction", "doifelsepositiononpage", "doifelsepositionsonsamepage", "doifelsepositionsonthispage", "doifelsepositionsused", "doifelsereferencefound", "doifelserightpagefloat", "doifelserighttoleftinbox", "doifelsesamelinereference", "doifelsesamestring", "doifelsesetups", "doifelsesomebackground", "doifelsesomespace", "doifelsesomething", "doifelsesometoks", "doifelsestringinstring", "doifelsestructurelisthasnumber", "doifelsestructurelisthaspage", "doifelsesymboldefined", "doifelsesymbolset", "doifelsetext", "doifelsetextflow", "doifelsetextflowcollector", "doifelsetypingfile", "doifelseundefined", "doifelseurldefined", "doifelsevalue", "doifelsevaluenothing", "doifelsevariable", "doifempty", "doifemptyelse", "doifemptytoks", "doifemptyvalue", "doifemptyvalueelse", "doifemptyvariable", "doifemptyvariableelse", "doifenv", "doifenvelse", "doiffastoptionalcheckcselse", "doiffastoptionalcheckelse", "doiffieldbodyelse", "doiffieldcategoryelse", "doiffigureelse", "doiffile", "doiffiledefinedelse", "doiffileelse", "doiffileexistselse", "doiffirstcharelse", "doifflaggedelse", "doiffontcharelse", "doiffontpresentelse", "doiffontsynonymelse", "doifhasspaceelse", "doifhelpelse", "doifincsnameelse", "doifinelementelse", "doifinputfileelse", "doifinsertionelse", "doifinset", "doifinsetelse", "doifinstring", "doifinstringelse", "doifinsymbolset", "doifinsymbolsetelse", "doifintokselse", "doifintwopassdataelse", "doifitalicelse", "doiflanguageelse", "doiflayerdataelse", "doiflayoutdefinedelse", "doiflayoutsomelineelse", "doiflayouttextlineelse", "doifleapyearelse", "doiflistelse", "doiflocationelse", "doiflocfileelse", "doifmainfloatbodyelse", "doifmarkingelse", "doifmeaningelse", "doifmessageelse", "doifmode", "doifmodeelse", "doifnextbgroupcselse", "doifnextbgroupelse", "doifnextcharelse", "doifnextoptionalcselse", "doifnextoptionalelse", "doifnextparenthesiselse", "doifnonzeropositiveelse", "doifnot", "doifnotallcommon", "doifnotallmodes", "doifnotcommandhandler", "doifnotcommon", "doifnotcounter", "doifnotdocumentargument", "doifnotdocumentfilename", "doifnotempty", "doifnotemptyvalue", "doifnotemptyvariable", "doifnotenv", "doifnoteonsamepageelse", "doifnotescollected", "doifnotfile", "doifnotflagged", "doifnothing", "doifnothingelse", "doifnotinset", "doifnotinsidesplitfloat", "doifnotinstring", "doifnotmode", "doifnotnumber", "doifnotsamestring", "doifnotsetups", "doifnotvalue", "doifnotvariable", "doifnumber", "doifnumberelse", "doifobjectfoundelse", "doifobjectreferencefoundelse", "doifoddpageelse", "doifoddpagefloatelse", "doifoldercontextelse", "doifolderversionelse", "doifoverlappingelse", "doifoverlayelse", "doifparallelelse", "doifparentfileelse", "doifpathelse", "doifpathexistselse", "doifpatternselse", "doifposition", "doifpositionaction", "doifpositionactionelse", "doifpositionelse", "doifpositiononpageelse", "doifpositionsonsamepageelse", "doifpositionsonthispageelse", "doifpositionsusedelse", "doifreferencefoundelse", "doifrightpagefloatelse", "doifrighttoleftinboxelse", "doifsamelinereferenceelse", "doifsamestring", "doifsamestringelse", "doifsetups", "doifsetupselse", "doifsomebackground", "doifsomebackgroundelse", "doifsomespaceelse", "doifsomething", "doifsomethingelse", "doifsometoks", "doifsometokselse", "doifstringinstringelse", "doifstructurelisthasnumberelse", "doifstructurelisthaspageelse", "doifsymboldefinedelse", "doifsymbolsetelse", "doiftext", "doiftextelse", "doiftextflowcollectorelse", "doiftextflowelse", "doiftypingfileelse", "doifundefined", "doifundefinedcounter", "doifundefinedelse", "doifurldefinedelse", "doifvalue", "doifvalueelse", "doifvaluenothing", "doifvaluenothingelse", "doifvaluesomething", "doifvariable", "doifvariableelse", "doindentation", "dollar", "doloop", "doloopoverlist", "donothing", "dontconvertfont", "dontleavehmode", "dontpermitspacesbetweengroups", "dopositionaction", "doprocesslocalsetups", "doquadrupleargument", "doquadrupleempty", "doquadruplegroupempty", "doquintupleargument", "doquintupleempty", "doquintuplegroupempty", "dorechecknextindentation", "dorecurse", "dorepeatwithcommand", "doreplacefeature", "doresetandafffeature", "doresetattribute", "dorotatebox", "dosetattribute", "dosetleftskipadaption", "dosetrightskipadaption", "dosetupcheckedinterlinespace", "doseventupleargument", "doseventupleempty", "dosingleargument", "dosingleempty", "dosinglegroupempty", "dosixtupleargument", "dosixtupleempty", "dostepwiserecurse", "dosubtractfeature", "dotfskip", "dotoks", "dotripleargument", "dotripleargumentwithset", "dotripleempty", "dotripleemptywithset", "dotriplegroupempty", "doublebar", "doublebond", "doublebrace", "doublebracket", "doubleparent", "dowith", "dowithnextbox", "dowithnextboxcontent", "dowithnextboxcontentcs", "dowithnextboxcs", "dowithpargument", "dowithrange", "dowithwargument", "dpofstring", "dummydigit", "dummyparameter", "eTeX", "echelle", "ecran", "ecritdansliste", "ecritentreliste", "edefconvertedargument", "efcmaxheight", "efcmaxwidth", "efcminheight", "efcminwidth", "efcparameter", "effect", "elapsedseconds", "elapsedtime", "eleftarrowfill", "eleftharpoondownfill", "eleftharpoonupfill", "eleftrightarrowfill", "element", "elements", "emphasisboldface", "emphasistypeface", "emptylines", "emspace", "enabledirectives", "enableexperiments", "enablemode", "enableoutputstream", "enableparpositions", "enableregime", "enabletrackers", "enskip", "enspace", "env", "environement", "envvar", "eoverbarfill", "eoverbracefill", "eoverbracketfill", "eoverparentfill", "epos", "equaldigits", "erightarrowfill", "erightharpoondownfill", "erightharpoonupfill", "espace", "espacefixe", "espacesfixes", "etire", "etwoheadrightarrowfill", "eunderbarfill", "eunderbracefill", "eunderbracketfill", "eunderparentfill", "executeifdefined", "exitloop", "exitloopnow", "expandcheckedcsname", "expanded", "expandfontsynonym", "externalfigurecollectionmaxheight", "externalfigurecollectionmaxwidth", "externalfigurecollectionminheight", "externalfigurecollectionminwidth", "externalfigurecollectionparameter", "faitreference", "fakebox", "fastdecrement", "fastincrement", "fastlocalframed", "fastscale", "fastsetup", "fastsetupwithargument", "fastsetupwithargumentswapped", "fastswitchtobodyfont", "fastsxsy", "feature", "fence", "fenced", "fetchallmarkings", "fetchallmarks", "fetchmark", "fetchmarking", "fetchonemark", "fetchonemarking", "fetchruntinecommand", "fetchtwomarkings", "fetchtwomarks", "fichierdactylo", "fieldbody", "fifthoffivearguments", "fifthofsixarguments", "figure", "figureexterne", "figurefilename", "figurefilepath", "figurefiletype", "figurefullname", "figureheight", "figurenaturalheight", "figurenaturalwidth", "figuresymbol", "figurewidth", "filename", "filledhboxb", "filledhboxc", "filledhboxg", "filledhboxk", "filledhboxm", "filledhboxr", "filledhboxy", "filler", "filterfromnext", "filterfromvalue", "filterpages", "filterreference", "findtwopassdata", "finishregisterentry", "firstcharacter", "firstcounter", "firstcountervalue", "firstoffivearguments", "firstoffourarguments", "firstofoneargument", "firstofoneunexpanded", "firstofsixarguments", "firstofthreearguments", "firstofthreeunexpanded", "firstoftwoarguments", "firstoftwounexpanded", "firstrealpage", "firstrealpagenumber", "firstsubcountervalue", "firstsubpage", "firstsubpagenumber", "firstuserpage", "firstuserpagenumber", "fitfieldframed", "fittopbaselinegrid", "flag", "floatuserdataparameter", "flushboxregister", "flushcollector", "flushlayer", "flushlocalfloats", "flushnextbox", "flushnotes", "flushoutputstream", "flushshapebox", "flushtextflow", "flushtokens", "flushtoks", "fontalternative", "fontbody", "fontchar", "fontcharbyindex", "fontclass", "fontclassname", "fontface", "fontfeaturelist", "fontsize", "fontstyle", "forcecharacterstripping", "forcelocalfloats", "forgeteverypar", "forgetparameters", "formula", "foundbox", "fourthoffivearguments", "fourthoffourarguments", "fourthofsixarguments", "frac", "framed", "frameddimension", "framedparameter", "framedtext", "freezedimenmacro", "freezemeasure", "frenchspacing", "fromlinenote", "frozenhbox", "gardeblocs", "gdefconvertedargument", "gdefconvertedcommand", "getMPdrawing", "getMPlayer", "getboxllx", "getboxlly", "getbufferdata", "getcommacommandsize", "getcommalistsize", "getdayoftheweek", "getdayspermonth", "getdefinedbuffer", "getdocumentargument", "getdocumentargumentdefault", "getdocumentfilename", "getdummyparameters", "getemptyparameters", "geteparameters", "getexpandedparameters", "getfiguredimensions", "getfirstcharacter", "getfirsttwopassdata", "getfromcommacommand", "getfromcommalist", "getfromtwopassdata", "getglyphdirect", "getglyphstyled", "getgparameters", "getlasttwopassdata", "getlocalfloat", "getlocalfloats", "getmessage", "getnamedglyphdirect", "getnamedglyphstyled", "getnamedtwopassdatalist", "getnaturaldimensions", "getnoflines", "getobject", "getobjectdimensions", "getpaletsize", "getparameters", "getprivatechar", "getprivateslot", "getrandomcount", "getrandomdimen", "getrandomfloat", "getrandomnumber", "getrandomseed", "getraweparameters", "getrawgparameters", "getrawnoflines", "getrawparameters", "getrawxparameters", "getreference", "getreferenceentry", "getroundednoflines", "getsubstring", "gettwopassdata", "gettwopassdatalist", "getuvalue", "getvalue", "getvariable", "getvariabledefault", "getxparameters", "globaldisablemode", "globalenablemode", "globalletempty", "globalpopbox", "globalpopmacro", "globalpreventmode", "globalprocesscommalist", "globalpushbox", "globalpushmacro", "globalswapcounts", "globalswapdimens", "globalswapmacros", "globalundefine", "glyphfontfile", "gobbledoubleempty", "gobbleeightarguments", "gobblefivearguments", "gobblefiveoptionals", "gobblefourarguments", "gobblefouroptionals", "gobbleninearguments", "gobbleoneargument", "gobbleoneoptional", "gobblesevenarguments", "gobblesingleempty", "gobblesixarguments", "gobblespacetokens", "gobbletenarguments", "gobblethreearguments", "gobblethreeoptionals", "gobbletwoarguments", "gobbletwooptionals", "gobbleuntil", "gobbleuntilrelax", "grabbufferdata", "grabbufferdatadirect", "grabuntil", "graphique", "grayvalue", "greedysplitstring", "greeknumerals", "grille", "groupedcommand", "gsetboxllx", "gsetboxlly", "gujaratinumerals", "gurmurkhinumerals", "hairspace", "halfwaybox", "handletokens", "handwritten", "hash", "haut", "hboxofvbox", "hboxreference", "hdofstring", "headhbox", "headnumbercontent", "headnumberdistance", "headnumberwidth", "headreferenceattributes", "headsetupspacing", "headtextcontent", "headtextdistance", "headtextwidth", "headvbox", "headwidth", "heightanddepthofstring", "heightofstring", "heightspanningtext", "helptext", "hglue", "hiddenbar", "hiddencitation", "hiddencite", "highlight", "highordinalstr", "hilo", "himilo", "hl", "horizontalgrowingbar", "horizontalpositionbar", "hphantom", "hpos", "hsizefraction", "hsmash", "hsmashbox", "hsmashed", "hspace", "htdpofstring", "htofstring", "hyphen", "hyphenatedcoloredword", "hyphenatedfile", "hyphenatedfilename", "hyphenatedhbox", "hyphenatedpar", "hyphenatedurl", "hyphenatedword", "ibox", "ifassignment", "iff", "ifinobject", "ifinoutputstream", "ifparameters", "iftrialtypesetting", "ignoreimplicitspaces", "ignorevalue", "immediatesavetwopassdata", "impliedby", "implies", "includemenu", "includeversioninfo", "inconnu", "increment", "incrementcounter", "incrementedcounter", "incrementpagenumber", "incrementsubpagenumber", "incrementvalue", "indentation", "infofont", "infofontbold", "inframed", "infull", "inheritparameter", "inhibitblank", "initializeboxstack", "inlinebuffer", "inlinedbox", "inlinemath", "inlinemathematics", "inlinemessage", "inlineordisplaymath", "inlinerange", "inmframed", "innerflushshapebox", "input", "inputfilebarename", "inputfilename", "inputfilerealsuffix", "inputfilesuffix", "inputgivenfile", "insertpages", "installactionhandler", "installactivecharacter", "installanddefineactivecharacter", "installattributestack", "installautocommandhandler", "installautosetuphandler", "installbasicautosetuphandler", "installbasicparameterhandler", "installbottomframerenderer", "installcommandhandler", "installcorenamespace", "installdefinehandler", "installdefinitionset", "installdefinitionsetmember", "installdirectcommandhandler", "installdirectparameterhandler", "installdirectparametersethandler", "installdirectsetuphandler", "installdirectstyleandcolorhandler", "installelangue", "installframedautocommandhandler", "installframedcommandhandler", "installleftframerenderer", "installnamespace", "installoutputroutine", "installpagearrangement", "installparameterhandler", "installparameterhashhandler", "installparametersethandler", "installparentinjector", "installrightframerenderer", "installrootparameterhandler", "installsetuphandler", "installsetuponlycommandhandler", "installshipoutmethod", "installsimplecommandhandler", "installsimpleframedcommandhandler", "installstyleandcolorhandler", "installswitchcommandhandler", "installswitchsetuphandler", "installtexdirective", "installtextracker", "installtopframerenderer", "installunitsseparator", "installunitsspace", "installversioninfo", "integerrounding", "intermezzo", "intertext", "invokepageheandler", "istltdir", "istrtdir", "italic", "italicbold", "italiccorrection", "itemtag", "jobfilename", "jobfilesuffix", "joursemaine", "kap", "keeplinestogether", "keepunwantedspaces", "kerncharacters", "koreancirclenumerals", "koreannumerals", "koreannumeralsc", "koreannumeralsp", "koreanparentnumerals", "languageCharacters", "languagecharacters", "languagecharwidth", "langue", "langueprincipale", "largeurligne", "lastcounter", "lastcountervalue", "lastdigit", "lastlinewidth", "lastnaturalboxdp", "lastnaturalboxht", "lastnaturalboxwd", "lastpredefinedsymbol", "lastrealpage", "lastrealpagenumber", "lastsubcountervalue", "lastsubpage", "lastsubpagenumber", "lasttwodigits", "lastuserpage", "lastuserpagenumber", "lateluacode", "layeredtext", "layerheight", "layerwidth", "lazysavetaggedtwopassdata", "lazysavetwopassdata", "lbox", "left", "leftbottombox", "leftbox", "lefthbox", "leftorrighthbox", "leftorrightvbox", "leftorrightvtop", "leftskipadaption", "leftsubguillemot", "lefttopbox", "lefttorighthbox", "lefttorightvbox", "lefttorightvtop", "letbeundefined", "letcatcodecommand", "letcscsname", "letcsnamecs", "letcsnamecsname", "letdummyparameter", "letempty", "letgvalue", "letgvalueempty", "letgvalurelax", "letterampersand", "letterat", "letterbackslash", "letterbar", "letterbgroup", "letterclosebrace", "lettercolon", "letterdollar", "letterdoublequote", "letteregroup", "letterescape", "letterexclamationmark", "letterhash", "letterhat", "letterleftbrace", "letterless", "lettermore", "letteropenbrace", "letterpercent", "letterquestionmark", "letterrightbrace", "lettersinglequote", "letterslash", "letterspacing", "lettertilde", "letterunderscore", "letvalue", "letvalueempty", "letvaluerelax", "lfence", "lhbox", "ligneh", "lignenoire", "ligneregleetexte", "lignesnoires", "limitatelines", "limitatetext", "limtatefirstline", "linespanningtext", "listcitation", "listcite", "lister", "listnamespaces", "llap", "llongueurliste", "loadanyfile", "loadanyfileonce", "loadbtxdefinitionfile", "loadbtxreplacementfile", "loadcldfile", "loadcldfileonce", "loadfontgoodies", "loadluafile", "loadluafileonce", "loadspellchecklist", "loadtexfile", "loadtexfileonce", "loadtypescriptfile", "localframed", "localframedwithsettings", "localhsize", "localpopbox", "localpopmacro", "localpushbox", "localpushmacro", "localundefine", "locatedfilepath", "locatefilepath", "locfilename", "lomihi", "lowerbox", "lowercased", "lowercasestring", "lowerleftdoubleninequote", "lowerleftsingleninequote", "lowerrightdoubleninequote", "lowerrightsingleninequote", "lrtbbox", "ltop", "luaTeX", "luacode", "luaconditional", "luaenvironment", "luaexpanded", "luafunction", "luajitTeX", "luamajorversion", "luaminorversion", "luaparameterset", "luasetup", "luaversion", "m", "mLeftarrow", "mLeftrightarrow", "mRightarrow", "makecharacteractive", "makerawcommalist", "makestrutofbox", "mapfontsize", "margindata", "markcontent", "markinjector", "marquage", "marquepage", "mat", "math", "mathbf", "mathbi", "mathblackboard", "mathbs", "mathcommand", "mathdefault", "mathematique", "mathfraktur", "mathfunction", "mathit", "mathitalic", "mathop", "mathrm", "mathscript", "mathsl", "mathss", "mathtext", "mathtextbf", "mathtextbi", "mathtextbs", "mathtextit", "mathtextsl", "mathtexttf", "mathtf", "mathtriplet", "mathtt", "mathupright", "mathword", "mathwordbf", "mathwordbi", "mathwordbs", "mathwordit", "mathwordsl", "mathwordtf", "mbox", "mcframed", "md", "measure", "measured", "medskip", "medspace", "menuinteraction", "mequal", "message", "metaTeX", "mfence", "mframed", "mfunction", "mfunctionlabeltext", "mhbox", "mhookleftarrow", "mhookrightarrow", "middle", "middlebox", "midhbox", "minimalhbox", "mixedcaps", "mkvibuffer", "mleftarrow", "mleftharpoondown", "mleftharpoonup", "mleftrightarrow", "mleftrightharpoons", "mmapsto", "moduleparameter", "mois", "molecule", "mono", "monobold", "mononormal", "monthlong", "monthshort", "montrecadre", "montrecouleur", "montredisposition", "montreedition", "montreenvironnementpolicecorps", "montregrille", "montregroupecouleur", "montrejeusymboles", "montremakeup", "montrepalette", "montrepolicecorps", "montrereglages", "montrestruts", "mp", "mprandomnumber", "mrel", "mrightarrow", "mrightharpoondown", "mrightharpoonup", "mrightleftharpoons", "mrightoverleftarrow", "mtext", "mtriplerel", "mtwoheadleftarrow", "mtwoheadrightarrow", "namedheadnumber", "namedstructureheadlocation", "namedstructureuservariable", "namedstructurevariable", "namedtaggedlabeltexts", "naturalhbox", "naturalhpack", "naturalvbox", "naturalvcenter", "naturalvpack", "naturalvtop", "naturalwd", "negatecolorbox", "negated", "negthinspace", "newattribute", "newcatcodetable", "newcounter", "newevery", "newfrenchspacing", "newmode", "newsignal", "newsystemmode", "nextbox", "nextboxdp", "nextboxht", "nextboxhtdp", "nextboxwd", "nextcounter", "nextcountervalue", "nextdepth", "nextparagraphs", "nextrealpage", "nextrealpagenumber", "nextsubcountervalue", "nextsubpage", "nextsubpagenumber", "nextuserpage", "nextuserpagenumber", "nobar", "nocap", "nocitation", "nocite", "nodetostring", "noffigurepages", "noflines", "noflocalfloats", "noindentation", "noitem", "nonfrenchspacing", "nonmathematics", "normal", "normalboldface", "normalframedwithsettings", "normalizebodyfontsize", "normalizedfontsize", "normalizefontdepth", "normalizefontheight", "normalizefontline", "normalizefontwidth", "normalizetextdepth", "normalizetextheight", "normalizetextline", "normalizetextwidth", "normaltypeface", "note", "notesymbol", "ntimes", "numberofpoints", "numeroformule", "numeropage", "numeros", "numerotete", "numerotetecourant", "obeydepth", "objectdepth", "objectheight", "objectmargin", "objectwidth", "obox", "obtientmarquage", "offset", "offsetbox", "onedigitrounding", "ordinaldaynumber", "ordinalstr", "oriente", "ornamenttext", "outputfilename", "outputstreambox", "outputstreamcopy", "outputstreamunvbox", "outputstreamunvcopy", "over", "overbar", "overbars", "overbartext", "overbarunderbar", "overbrace", "overbracetext", "overbraceunderbrace", "overbracket", "overbrackettext", "overbracketunderbracket", "overlaybutton", "overlaycolor", "overlaydepth", "overlayfigure", "overlayheight", "overlaylinecolor", "overlaylinewidth", "overlayoffset", "overlayrollbutton", "overlaywidth", "overleftarrow", "overleftharpoondown", "overleftharpoonup", "overleftrightarrow", "overloaderror", "overparent", "overparenttext", "overparentunderparent", "overrightarrow", "overrightharpoondown", "overrightharpoonup", "overset", "overstrike", "overstrikes", "overtwoheadleftarrow", "overtwoheadrightarrow", "page", "pagearea", "pagebreak", "pagefigure", "pagegridspanwidth", "pageinjection", "pagestaterealpage", "paletsize", "pdfTeX", "pdfactualtext", "pdfbackendactualtext", "pdfbackendcurrentresources", "pdfbackendsetcatalog", "pdfbackendsetcolorspace", "pdfbackendsetextgstate", "pdfbackendsetinfo", "pdfbackendsetname", "pdfbackendsetpageattribute", "pdfbackendsetpageresource", "pdfbackendsetpagesattribute", "pdfbackendsetpattern", "pdfbackendsetshade", "pdfcolor", "pdfeTeX", "percent", "percentdimen", "periodes", "permitcaretescape", "permitcircumflexescape", "permitspacesbetweengroups", "persiandecimals", "persiannumerals", "phantom", "phantombox", "pickupgroupedcommand", "pilechamp", "placeattachments", "placebtxrendering", "placecitation", "placecomments", "placecoteacote", "placecurrentformulanumber", "placedbox", "placefloatwithsetups", "placeflottant", "placeformule", "placeframed", "placehelp", "placeinitial", "placelayer", "placelayeredtext", "placelesunsaudessusdesautres", "placeliste", "placelisteinmbriquee", "placelistofpublications", "placelistofsorts", "placelistofsynonyms", "placelocalnotes", "placemarquespages", "placement", "placenamedfloat", "placenamedformula", "placenotes", "placenotespdp", "placenotespdplocales", "placenumeropage", "placenumerotete", "placepairedbox", "placeparallel", "placerawlist", "placeregistre", "placerenderingwindow", "placesousformule", "placesurgrille", "placetextetete", "popattribute", "popmacro", "popmode", "popsystemmode", "position", "positionoverlay", "positionregionoverlay", "postponenotes", "predefinedfont", "predefinefont", "predefinesymbol", "prefixedpagenumber", "prendbuffer", "prependetoks", "prependgvalue", "prependtocommalist", "prependtoks", "prependtoksonce", "prependvalue", "presetdocument", "presetfieldsymbols", "pretocommalist", "prevcounter", "prevcountervalue", "preventmode", "prevrealpage", "prevrealpagenumber", "prevsubcountervalue", "prevsubpage", "prevsubpagenumber", "prevuserpage", "prevuserpagenumber", "procent", "processMPbuffer", "processMPfigurefile", "processaction", "processallactionsinset", "processassignlist", "processassignmentcommand", "processassignmentlist", "processbetween", "processbodyfontenvironmentlist", "processcolorcomponents", "processcommacommand", "processcommalist", "processcommalistwithparameters", "processcontent", "processfile", "processfilemany", "processfilenone", "processfileonce", "processfirstactioninset", "processisolatedchars", "processisolatedwords", "processlinetablebuffer", "processlinetablefile", "processlist", "processmonth", "processranges", "processseparatedlist", "processtexbuffer", "processtokens", "processuntil", "processxtablebuffer", "processyear", "produit", "profiledbox", "profilegivenbox", "programme", "projet", "pseudoMixedCapped", "pseudoSmallCapped", "pseudoSmallcapped", "pseudosmallcapped", "purenumber", "pushattribute", "pushbutton", "pushmacro", "pushmode", "pushoutputstream", "pushsystemmode", "qqpart", "qquad", "quad", "quads", "quitcommalist", "quitprevcommalist", "quittypescriptscanning", "raisebox", "randomizetext", "randomnumber", "rawcounter", "rawcountervalue", "rawdate", "rawdoifelseinset", "rawdoifinset", "rawdoifinsetelse", "rawgetparameters", "rawprocessaction", "rawprocesscommacommand", "rawprocesscommalist", "rawstructurelistuservariable", "rawsubcountervalue", "razmarquage", "rbox", "readfile", "readfixfile", "readjobfile", "readlocfile", "readsetfile", "readsysfile", "readtexfile", "readxmlfile", "realSmallCapped", "realSmallcapped", "realpagenumber", "realsmallcapped", "recursedepth", "recurselevel", "recursestring", "redoconvertfont", "ref", "reference", "referencepage", "referenceprefix", "referencetexte", "reflete", "registerattachment", "registerctxluafile", "registerexternalfigure", "registerfontclass", "registerhyphenationexception", "registerhyphenationpattern", "registermenubuttons", "registersort", "registersynonym", "registerunit", "reglearrangement", "reglearriereplan", "reglearriereplans", "reglebarreinteraction", "reglebloc", "regleblocsection", "reglebuffer", "reglecapitales", "reglechamp", "reglechamps", "regleclipping", "reglecolonnes", "reglecommentaire", "reglecommentairepage", "reglecompoetroite", "reglecomposeenalinea", "reglecouleur", "reglecouleurs", "regledactylo", "regledemarrestoppe", "regledisposition", "regleecraninteraction", "regleelements", "regleencadre", "regleentete", "regleepaisseurligne", "regleespaceblanc", "regleespacement", "regleespacementinterligne", "regleflottant", "regleformulaires", "reglegroupeselements", "regleinf", "regleinteraction", "regleintitule", "reglejeusymboles", "reglelangue", "reglelignes", "reglelignesnoires", "reglelignesreglestexte", "regleliste", "reglelisteimbriquee", "reglemakeup", "reglemargereglee", "reglemarquage", "reglemarquagehyphenation", "reglemenuinteraction", "reglenumeropage", "reglenumerotationligne", "reglenumerotationpage", "reglenumerotationparagraphe", "reglenumerotete", "regleoriente", "reglepalette", "reglepapier", "regleparagraphes", "reglepdp", "regleplacementopposition", "reglepolicecorps", "reglepositionnement", "regleprogrammes", "reglereferencage", "regleregistre", "regleremplitligne", "regleremplitlignesreglees", "regleseparationflottant", "reglesousnumeropage", "reglesup", "reglesynonymes", "regletableaux", "regletabulation", "regletaillepapier", "regletete", "regletetes", "regletexte", "regletextesentete", "regletextesinf", "regletextespdp", "regletextessup", "regletextestexte", "regletolerance", "regletraitsfins", "regletransitionspage", "regletri", "regletype", "regleurl", "regular", "relatemarking", "relateparameterhandlers", "relaxvalueifundefined", "remainingcharacters", "removebottomthings", "removedepth", "removefromcommalist", "removelastskip", "removelastspace", "removemarkedcontent", "removepunctuation", "removesubstring", "removetoks", "removeunwantedspaces", "remplitligne", "remplitlignesreglees", "remplittexte", "replacefeature", "replaceincommalist", "replaceword", "rescan", "rescanwithsetup", "resetMPdrawing", "resetMPenvironment", "resetMPinstance", "resetallattributes", "resetandaddfeature", "resetbar", "resetbreakpoints", "resetbuffer", "resetcharacteralign", "resetcharacterkerning", "resetcharacterspacing", "resetcharacterstripping", "resetcollector", "resetcounter", "resetdigitsmanipulation", "resetdirection", "resetfeature", "resetflag", "resetfontcolorsheme", "resetfontfallback", "resetfontsolution", "resethyphenationfeatures", "resetinjector", "resetinteractionmenu", "resetitaliccorrection", "resetlayer", "resetlocalfloats", "resetmarker", "resetmode", "resetpagenumber", "resetparallel", "resetpath", "resetpenalties", "resetprofile", "resetreference", "resetreplacement", "resetscript", "resetsetups", "resetshownsynonyms", "resetsubpagenumber", "resetsymbolset", "resetsystemmode", "resettimer", "resettrackers", "resettrialtypesetting", "resetusedsortings", "resetusedsynonyms", "resetuserpagenumber", "resetvalue", "resetvisualizers", "reshapebox", "resolvedglyphdirect", "resolvedglyphstyled", "restartcounter", "restorebox", "restorecatcodes", "restorecounter", "restorecurrentattributes", "restoreendofline", "restoreglobalbodyfont", "reusableMPgraphic", "reuseMPgraphic", "reuserandomseed", "revivefeature", "rfence", "rhbox", "right", "rightbottombox", "rightbox", "righthbox", "rightorleftpageaction", "rightskipadaption", "rightsubguillemot", "righttolefthbox", "righttoleftvbox", "righttoleftvtop", "righttopbox", "rlap", "robustaddtocommalist", "robustdoifelseinset", "robustdoifinsetelse", "robustpretocommalist", "rollbutton", "roman", "rtop", "ruledhbox", "ruledhpack", "ruledmbox", "ruledtopv", "ruledtpack", "ruledvbox", "ruledvpack", "ruledvtop", "runMPbuffer", "runninghbox", "safechar", "sans", "sansbold", "sansespace", "sanslignesenteteetpdp", "sanslignessupetinf", "sansnormal", "sansserif", "savebox", "savebtxdataset", "savebuffer", "savecounter", "savecurrentattributes", "savenormalmeaning", "savetaggedtwopassdata", "savetwopassdata", "sbox", "sd", "secondoffivearguments", "secondoffourarguments", "secondofsixarguments", "secondofthreearguments", "secondofthreeunexpanded", "secondoftwoarguments", "secondoftwounexpanded", "section", "select", "selectionneblocs", "separeflottant", "serializecommalist", "serializedcommalist", "serif", "serifbold", "serifnormal", "setJSpreamble", "setMPlayer", "setMPpositiongraphic", "setMPpositiongraphicrange", "setMPtext", "setMPvariable", "setMPvariables", "setbar", "setbigbodyfont", "setboxllx", "setboxlly", "setbreakpoints", "setcapstrut", "setcatcodetable", "setcharacteralign", "setcharactercasing", "setcharactercleaning", "setcharacterkerning", "setcharacterspacing", "setcharacterstripping", "setcharstrut", "setcollector", "setcolormodell", "setcounter", "setcounterown", "setcurrentfontclass", "setdataset", "setdefaultpenalties", "setdigitsmanipulation", "setdirection", "setdocumentargument", "setdocumentargumentdefault", "setdocumentfilename", "setdummyparameter", "setelementexporttag", "setemeasure", "setevalue", "setevariable", "setevariables", "setfirstline", "setflag", "setfont", "setfontcolorsheme", "setfontfeature", "setfontsolution", "setfontstrut", "setfractions", "setgmeasure", "setgvalue", "setgvariable", "setgvariables", "sethboxregister", "sethyphenatedurlafter", "sethyphenatedurlbefore", "sethyphenatedurlnormal", "sethyphenationfeatures", "setinitial", "setinjector", "setinteraction", "setinterfacecommand", "setinterfaceconstant", "setinterfaceelements", "setinterfacemessage", "setinterfacevariable", "setinternalrendering", "setitaliccorrection", "setlayer", "setlayerframed", "setlayertext", "setlinefiller", "setlocalhsize", "setmainbodyfont", "setmainparbuilder", "setmarker", "setmarking", "setmathstyle", "setmeasure", "setmessagetext", "setmode", "setnostrut", "setnote", "setnotetext", "setobject", "setoldstyle", "setpagegrid", "setpagereference", "setpagestate", "setpagestaterealpageno", "setpenalties", "setpercentdimen", "setposition", "setpositionbox", "setpositiondata", "setpositiondataplus", "setpositiononly", "setpositionplus", "setpositionstrut", "setprofile", "setrandomseed", "setreference", "setreferencedobject", "setregisterentry", "setreplacement", "setrigidcolumnbalance", "setrigidcolumnhsize", "setscript", "setsectionblock", "setsimplecolumnhsize", "setsmallbodyfont", "setsmallcaps", "setstackbox", "setstructurepageregister", "setstrut", "setsuperiors", "setsystemmode", "settabular", "settaggedmetadata", "settext", "settightobject", "settightreferencedobject", "settightunreferencedobject", "settrialtypesetting", "setuevalue", "setugvalue", "setunreferencedobject", "setup", "setupMPgraphics", "setupMPinstance", "setupMPpage", "setupMPvariables", "setupTABLE", "setupTEXpage", "setupattachment", "setupbackend", "setupbar", "setupbleeding", "setupbookmark", "setupbtx", "setupbtxdataset", "setupbtxlist", "setupbtxregister", "setupbtxrendering", "setupbutton", "setupcharacterkerning", "setupcharacterspacing", "setupchemical", "setupchemicalframed", "setupcollector", "setupcolumnspan", "setupcombination", "setupcounter", "setupdataset", "setupdelimitedtext", "setupdescription", "setupdirections", "setupdocument", "setupeffect", "setupenumeration", "setupenv", "setupexport", "setupexternalfigure", "setupexternalsoundtracks", "setupfieldbody", "setupfieldcategory", "setupfieldcontentframed", "setupfieldlabelframed", "setupfieldtotalframed", "setupfiller", "setupfirstline", "setupfittingpage", "setupfloatcaption", "setupfontexpansion", "setupfontprotrusion", "setupfonts", "setupfontsolution", "setupformula", "setupformulaframed", "setupframedcontent", "setupframedtext", "setupglobalreferenceprefix", "setupheadalternative", "setuphelp", "setuphigh", "setuphighlight", "setuphyphenation", "setupindentedtext", "setupinitial", "setupinsertion", "setupitaliccorrection", "setupitemgroup", "setuplabel", "setuplayer", "setuplayeredtext", "setuplayouttext", "setuplinefiller", "setuplinefillers", "setuplinenote", "setuplinetable", "setuplistalternative", "setuplistextra", "setuplocalfloats", "setuplocalinterlinespace", "setuplow", "setuplowhigh", "setuplowmidhigh", "setupmarginblock", "setupmargindata", "setupmarginframed", "setupmarginrule", "setupmathalignment", "setupmathcases", "setupmathematics", "setupmathfence", "setupmathfraction", "setupmathframed", "setupmathmatrix", "setupmathornament", "setupmathradical", "setupmathstackers", "setupmathstyle", "setupmixedcolumns", "setupmodule", "setupnotation", "setupnotations", "setupnote", "setupnotes", "setupoffset", "setupoffsetbox", "setupoutputroutine", "setuppagechecker", "setuppagegrid", "setuppagegridarea", "setuppagegridareatext", "setuppagegridlines", "setuppagegridspan", "setuppagegridstart", "setuppageinjection", "setuppageinjectionalternative", "setuppageshift", "setuppagestate", "setuppairedbox", "setupparagraph", "setupparagraphintro", "setupparallel", "setupperiods", "setupplacement", "setuppositionbar", "setupprocessor", "setupprofile", "setupquotation", "setuprealpagenumber", "setupreferenceformat", "setupreferenceprefix", "setupreferencestructureprefix", "setupregisters", "setuprenderingwindow", "setups", "setupscale", "setupscript", "setupscripts", "setupselector", "setupshift", "setupsidebar", "setupspellchecking", "setupstretched", "setupstruts", "setupstyle", "setupsubformula", "setuptabulation", "setuptagging", "setuptextbackground", "setuptextflow", "setuptooltip", "setupunit", "setupuserpagenumber", "setupversion", "setupviewerlayer", "setupvspacing", "setupwithargument", "setupwithargumentswapped", "setupxml", "setupxtable", "setuvalue", "setuxvalue", "setvalue", "setvariable", "setvariables", "setvboxregister", "setvisualizerfont", "setvtopregister", "setwidthof", "setxmeasure", "setxvalue", "setxvariable", "setxvariables", "sfrac", "shapedhbox", "showallmakeup", "showattributes", "showboxes", "showbtxdatasetauthors", "showbtxdatasetcompleteness", "showbtxdatasetfields", "showbtxfields", "showbtxhashedauthors", "showbtxtables", "showchardata", "showcharratio", "showcolorbar", "showcolorcomponents", "showcolorset", "showcolorstruts", "showcounter", "showdirectives", "showdirsinmargin", "showedebuginfo", "showexperiments", "showfont", "showfontdata", "showfontkerns", "showfontparameters", "showfontstrip", "showfontstyle", "showglyphs", "showgridsnapping", "showhelp", "showhyphenationtrace", "showhyphens", "showinjector", "showjustification", "showkerning", "showlayoutcomponents", "showligature", "showligatures", "showlogcategories", "showmargins", "showmessage", "showminimalbaseline", "shownextbox", "showotfcomposition", "showparentchain", "showsetupsdefinition", "showtimer", "showtokens", "showtrackers", "showvalue", "showvariable", "showwarning", "simplegroupedcommand", "singalcharacteralign", "singlebond", "sixthofsixarguments", "slanted", "slantedbold", "slicepages", "slovenianNumerals", "sloveniannumerals", "small", "smallbodyfont", "smallbold", "smallbolditalic", "smallboldslanted", "smallcappedcharacters", "smallcappedromannumerals", "smaller", "smallitalicbold", "smallnormal", "smallskip", "smallslanted", "smallslantedbold", "smalltype", "smash", "smashbox", "smashboxed", "smashedhbox", "smashedvbox", "snaptogrid", "someheadnumber", "somekindoftab", "somelocalfloat", "somenamedheadnumber", "someplace", "sousnumeropage", "soussection", "soussoussection", "soussoussoussection", "soussoussoussoussection", "soussoussoussoussujet", "soussoussoussujet", "soussoussujet", "soussujet", "sp", "spanishNumerals", "spanishnumerals", "speech", "splitatasterisk", "splitatcolon", "splitatcolons", "splitatcomma", "splitdfrac", "splitfilename", "splitfrac", "splitoffbase", "splitofffull", "splitoffkind", "splitoffname", "splitoffpath", "splitoffroot", "splitofftokens", "splitofftype", "splitstring", "spreadhbox", "sqrt", "stackrel", "startregister", "startstructurepageregister", "stoppeJScode", "stoppeJSpreamble", "stoppeMPclip", "stoppeMPcode", "stoppeMPdefinitions", "stoppeMPdrawing", "stoppeMPenvironment", "stoppeMPextensions", "stoppeMPinclusions", "stoppeMPinitializations", "stoppeMPpage", "stoppeMPpositiongraphic", "stoppeMPpositionmethod", "stoppeMPrun", "stoppeTABLE", "stoppeTABLEbody", "stoppeTABLEfoot", "stoppeTABLEhead", "stoppeTABLEnext", "stoppeTC", "stoppeTD", "stoppeTDs", "stoppeTEXpage", "stoppeTH", "stoppeTN", "stoppeTR", "stoppeTRs", "stoppeTX", "stoppeTY", "stoppeallmodes", "stoppearrangedpages", "stoppearriereplan", "stoppeaside", "stoppeattachment", "stoppebar", "stoppebinom", "stoppebitmapimage", "stoppeblockquote", "stoppebtxrenderingdefinitions", "stoppebuffer", "stoppebutton", "stoppecatcodetable", "stoppechapitre", "stoppecharacteralign", "stoppecheckedfences", "stoppechemical", "stoppecitation", "stoppeciter", "stoppecollect", "stoppecollecting", "stoppecolorintent", "stoppecoloronly", "stoppecolorset", "stoppecolumns", "stoppecolumnspan", "stoppecombination", "stoppecomment", "stoppecommentaire", "stoppecomposant", "stoppecontextcode", "stoppecontextdefinitioncode", "stoppecouleur", "stoppectxfunction", "stoppectxfunctiondefinition", "stoppecurrentcolor", "stoppecurrentlistentrywrapper", "stoppedbinom", "stoppedelimited", "stoppedelimitedtext", "stoppedfrac", "stoppediscours", "stoppedisplaymath", "stoppedmath", "stoppedocument", "stoppeeffect", "stoppeelement", "stoppeembeddedxtable", "stoppeendofline", "stoppeenvironement", "stoppeexceptions", "stoppeexpanded", "stoppeexpandedcollect", "stoppeextendedcatcodetable", "stoppeexternalfigurecollection", "stoppefigure", "stoppefitfieldframed", "stoppefittingpage", "stoppefloatcombination", "stoppefont", "stoppefontclass", "stoppefontsolution", "stoppeformula", "stoppeformulas", "stoppefrac", "stoppeframed", "stoppeframedcontent", "stoppeframedtext", "stoppegraphique", "stoppegridsnapping", "stoppegroupe", "stoppehbox", "stoppehboxestohbox", "stoppehboxregister", "stoppehelptext", "stoppehiddenbar", "stoppehiding", "stoppehighlight", "stoppehyphenation", "stoppeimath", "stoppeindentation", "stoppeindentedtext", "stoppeinmframed", "stoppeinteraction", "stoppeinterface", "stoppeintermezzo", "stoppeintertext", "stoppeitemgroup", "stoppeknockout", "stoppelayout", "stoppeligne", "stoppeligneregleetexte", "stoppelinecorrection", "stoppelinefiller", "stoppelinenumbering", "stoppelinetable", "stoppelinetablebody", "stoppelinetablecell", "stoppelinetablehead", "stoppelister", "stoppelocalfootnotes", "stoppelocalheadsetup", "stoppelocallinecorrection", "stoppelocalnotes", "stoppelocalsetups", "stoppelua", "stoppeluacode", "stoppeluaparameterset", "stoppeluasetups", "stoppemakeup", "stoppemargereglee", "stoppemarginblock", "stoppemarkedcontent", "stoppemathmode", "stoppemathstyle", "stoppematrices", "stoppemcframed", "stoppemdformula", "stoppemenuinteraction", "stoppemframed", "stoppemixedcolumns", "stoppemode", "stoppemodeset", "stoppemodule", "stoppemoduletestsection", "stoppempformula", "stoppenamedsection", "stoppenamedsubformulas", "stoppenarrow", "stoppenarrower", "stoppenegative", "stoppenicelyfilledbox", "stoppenobar", "stoppenointerference", "stoppenotallmodes", "stoppenotext", "stoppenotmode", "stoppeopposite", "stoppeoutputstream", "stoppeoverbar", "stoppeoverbars", "stoppeoverlay", "stoppeoverprint", "stoppepagecomment", "stoppepagefigure", "stoppepagegrid", "stoppepagegridspan", "stoppepagelayout", "stoppepar", "stoppeparagraph", "stoppeparagraphs", "stoppeparagraphscell", "stoppeparbuilder", "stoppepath", "stoppeplaceformule", "stoppeplacepairedbox", "stoppepositioning", "stoppepositionoverlay", "stoppepositive", "stoppepostponing", "stoppeprocessassignmentcommand", "stoppeprocessassignmentlist", "stoppeprocesscommacommand", "stoppeprocesscommalist", "stoppeproduit", "stoppeprojet", "stoppeprotect", "stoppeprotectedcolors", "stoppepublication", "stoppepunctuation", "stopperandomized", "stopperandomseed", "stopperawsetups", "stoppereadingfile", "stoppereferenceprefix", "stopperegime", "stoppereusableMPgraphic", "stoppescript", "stoppesdformula", "stoppesection", "stoppesectionblock", "stoppesectionblockenvironment", "stoppesectionlevel", "stoppesetups", "stoppesfrac", "stoppeshapebox", "stoppeshift", "stoppesidebar", "stoppesimplecolumns", "stoppesousligne", "stoppesouslignetout", "stoppesoussection", "stoppesoussoussection", "stoppesoussoussoussection", "stoppesoussoussoussoussection", "stoppesoussoussoussoussujet", "stoppesoussoussoussujet", "stoppesoussoussujet", "stoppesoussujet", "stoppespecialitem", "stoppespeech", "stoppespformula", "stoppespread", "stoppestartstop", "stoppestaticMPfigure", "stoppestaticMPgraphic", "stoppestrictinspectnextcharacter", "stoppestrut", "stoppestyle", "stoppesubformulas", "stoppesubjectlevel", "stoppesubsentence", "stoppesubstack", "stoppesujet", "stoppesurligne", "stoppesurlignetout", "stoppesymbolset", "stoppetable", "stoppetableau", "stoppetablehead", "stoppetables", "stoppetabletail", "stoppetabulate", "stoppetabulatehead", "stoppetabulatetail", "stoppetagged", "stoppetbinom", "stoppetete", "stoppetexcode", "stoppetexdefinition", "stoppetext", "stoppetextbackground", "stoppetextbackgroundmanual", "stoppetextcolor", "stoppetextcolorintent", "stoppetexteaide", "stoppetexteencadre", "stoppetextflow", "stoppetitre", "stoppetokens", "stoppetransparent", "stoppetypescript", "stoppetypescriptcollection", "stoppeunderdash", "stoppeunderdashes", "stoppeunderdot", "stoppeunderdots", "stoppeunderrandom", "stoppeunderrandoms", "stoppeunderstrike", "stoppeunderstrikes", "stoppeunframed", "stoppeuniqueMPgraphic", "stoppeuniqueMPpagegraphic", "stoppeunpacked", "stoppeusableMPgraphic", "stoppeuseMPgraphic", "stoppeusemathstyleparameter", "stoppeusingbtxspecification", "stoppeva", "stoppevbox", "stoppevboxregister", "stoppevboxtohbox", "stoppevboxtohboxseparator", "stoppeviewerlayer", "stoppevtop", "stoppevtopregister", "stoppexcell", "stoppexcellgroup", "stoppexfrac", "stoppexgroup", "stoppexmldisplayverbatim", "stoppexmlinlineverbatim", "stoppexmlraw", "stoppexmlsetups", "stoppexrow", "stoppexrowgroup", "stoppextable", "stoppextablebody", "stoppextablefoot", "stoppextablehead", "stoppextablenext", "stoppexxfrac", "stopregister", "stopstructurepageregister", "strictdoifelsenextoptional", "strictdoifnextoptionalelse", "stripcharacter", "strippedcsname", "stripspaces", "structurelistuservariable", "structurenumber", "structuretitle", "structureuservariable", "structurevariable", "strut", "strutdp", "strutht", "struthtdp", "struttedbox", "strutwd", "style", "styleinstance", "subsentence", "substituteincommalist", "subtractfeature", "sujet", "swapcounts", "swapdimens", "swapface", "swapmacros", "swaptypeface", "switchstyleonly", "switchtocolor", "switchtointerlinespace", "symbole", "symbolreference", "synchronizeblank", "synchronizeindenting", "synchronizemarking", "synchronizeoutputstreams", "synchronizestrut", "synchronizewhitespace", "systemlog", "systemlogfirst", "systemloglast", "systemsetups", "tLeftarrow", "tLeftrightarrow", "tRightarrow", "tableau", "tabulateautoline", "tabulateautorule", "tabulateline", "tabulaterule", "taggedctxcommand", "taggedlabeltexts", "tapebuffer", "tbinom", "tbox", "tequal", "testandsplitstring", "testcolumn", "testfeature", "testfeatureonce", "testpage", "testpageonly", "testpagesync", "testtokens", "tex", "texdefinition", "texsetup", "textcitation", "textcite", "textcontrolspace", "texteaide", "texteencadre", "textenotepdp", "textflowcollector", "textmath", "textminus", "textormathchar", "textplus", "textvisiblespace", "tfrac", "thainumerals", "thefirstcharacter", "thenormalizedbodyfontsize", "theremainingcharacters", "thickspace", "thinspace", "thirdoffivearguments", "thirdoffourarguments", "thirdofsixarguments", "thirdofthreearguments", "thirdofthreeunexpanded", "thookleftarrow", "thookrightarrow", "threedigitrounding", "tibetannumerals", "tightlayer", "tinyfont", "titre", "tlap", "tleftarrow", "tleftharpoondown", "tleftharpoonup", "tleftrightarrow", "tleftrightharpoons", "tmapsto", "tochar", "tolinenote", "topbox", "topleftbox", "toplinebox", "toprightbox", "topskippedbox", "tracecatcodetables", "tracedfontname", "traceoutputroutines", "tracepositions", "traduire", "traiteblocs", "traitfin", "traitsfins", "transparencycomponents", "transparent", "trel", "trightarrow", "trightharpoondown", "trightharpoonup", "trightleftharpoons", "trightoverleftarrow", "triplebond", "truefilename", "truefontname", "ttriplerel", "ttwoheadleftarrow", "ttwoheadrightarrow", "twodigitrounding", "tx", "txx", "typ", "typedefinedbuffer", "typeface", "typescriptone", "typescriptprefix", "typescriptthree", "typescripttwo", "typesetbuffer", "typesetfile", "uconvertnumber", "uedcatcodecommand", "undefinevalue", "undepthed", "underbar", "underbars", "underbartext", "underbrace", "underbracetext", "underbracket", "underbrackettext", "underdash", "underdashes", "underdot", "underdots", "underleftarrow", "underleftharpoondown", "underleftharpoonup", "underleftrightarrow", "underparent", "underparenttext", "underrandom", "underrandoms", "underrightarrow", "underrightharpoondown", "underrightharpoonup", "underset", "understrike", "understrikes", "undertwoheadleftarrow", "undertwoheadrightarrow", "undoassign", "uneligne", "unframed", "unhhbox", "unihex", "uniqueMPgraphic", "uniqueMPpagegraphic", "unprotected", "unregisterhyphenationpattern", "unspaceafter", "unspaceargument", "unspaced", "unspacestring", "untexargument", "untexcommand", "uppercased", "uppercasestring", "upperleftdoubleninequote", "upperleftdoublesixquote", "upperleftsingleninequote", "upperleftsinglesixquote", "upperrightdoubleninequote", "upperrightdoublesixquote", "upperrightsingleninequote", "upperrightsinglesixquote", "url", "useMPenvironmentbuffer", "useMPgraphic", "useMPlibrary", "useMPrun", "useMPvariables", "useblankparameter", "usebodyfont", "usebodyfontparameter", "usebtxdataset", "usebtxdefinitions", "usecolors", "usecomponent", "usedummycolorparameter", "usedummystyleandcolor", "usedummystyleparameter", "useenvironment", "useexternalrendering", "usefigurebase", "usefile", "usegridparameter", "useindentingparameter", "useindentnextparameter", "useinterlinespaceparameter", "uselanguageparameter", "useluamodule", "usemathstyleparameter", "useproduct", "useprofileparameter", "useproject", "usereferenceparameter", "userpagenumber", "usesetupsparameter", "usestaticMPfigure", "usesubpath", "usetexmodule", "usetypescript", "usetypescriptfile", "usezipfile", "utfchar", "utflower", "utfupper", "utiliseJSscripts", "utiliseURL", "utiliseblocs", "utilisechemin", "utilisedocumentexterne", "utilisefigureexterne", "utilisemodule", "utilisepsiteaudioexterne", "utilisesymboles", "utiliseurl", "utilityregisterlength", "va", "vaalaboite", "vaalapage", "vaenbas", "valeurcouleur", "vboxreference", "verbatim", "verbatimstring", "verbosenumber", "version", "verticalgrowingbar", "verticalpositionbar", "vglue", "vide", "viewerlayer", "vl", "vphantom", "vpos", "vsmash", "vsmashbox", "vsmashed", "vspace", "vspacing", "wdofstring", "widthofstring", "widthspanningtext", "withoutpt", "word", "words", "wordtonumber", "writedatatolist", "writestatus", "xLeftarrow", "xLeftrightarrow", "xRightarrow", "xdefconvertedargument", "xequal", "xfrac", "xhookleftarrow", "xhookrightarrow", "xleftarrow", "xleftharpoondown", "xleftharpoonup", "xleftrightarrow", "xleftrightharpoons", "xmapsto", "xmladdindex", "xmlafterdocumentsetup", "xmlaftersetup", "xmlall", "xmlappenddocumentsetup", "xmlappendsetup", "xmlapplyselectors", "xmlatt", "xmlattdef", "xmlattribute", "xmlattributedef", "xmlbadinclusions", "xmlbeforedocumentsetup", "xmlbeforesetup", "xmlchainatt", "xmlchainattdef", "xmlchecknamespace", "xmlcommand", "xmlconcat", "xmlconcatrange", "xmlcontext", "xmlcount", "xmldefaulttotext", "xmldirectives", "xmldirectivesafter", "xmldirectivesbefore", "xmldisplayverbatim", "xmldoif", "xmldoifelse", "xmldoifelseempty", "xmldoifelseselfempty", "xmldoifelsetext", "xmldoifelsevalue", "xmldoifnot", "xmldoifnotselfempty", "xmldoifnottext", "xmldoifselfempty", "xmldoiftext", "xmlelement", "xmlfilter", "xmlfirst", "xmlflush", "xmlflushcontext", "xmlflushdocumentsetups", "xmlflushlinewise", "xmlflushpure", "xmlflushspacewise", "xmlflushtext", "xmlinclude", "xmlinclusion", "xmlinclusions", "xmlinfo", "xmlinjector", "xmlinlineverbatim", "xmlinstalldirective", "xmllast", "xmllastatt", "xmllastmatch", "xmlloadbuffer", "xmlloaddata", "xmlloaddirectives", "xmlloadfile", "xmlloadonly", "xmlmain", "xmlmapvalue", "xmlname", "xmlnamespace", "xmlnonspace", "xmlpath", "xmlpos", "xmlposition", "xmlprependdocumentsetup", "xmlprependsetup", "xmlprettyprint", "xmlprocessbuffer", "xmlprocessdata", "xmlprocessfile", "xmlpure", "xmlraw", "xmlrefatt", "xmlregistereddocumentsetups", "xmlregisteredsetups", "xmlregisterns", "xmlremapname", "xmlremapnamespace", "xmlremovedocumentsetup", "xmlremovesetup", "xmlresetdocumentsetups", "xmlresetinjectors", "xmlresetsetups", "xmlsave", "xmlsetentity", "xmlsetfunction", "xmlsetinjectors", "xmlsetsetup", "xmlsetup", "xmlshow", "xmlsnippet", "xmlstrip", "xmlstripnolines", "xmlstripped", "xmlstrippednolines", "xmltag", "xmltexentity", "xmltext", "xmltobuffer", "xmltobufferverbose", "xmltofile", "xmlvalue", "xmlverbatim", "xrel", "xrightarrow", "xrightharpoondown", "xrightharpoonup", "xrightleftharpoons", "xrightoverleftarrow", "xsplitstring", "xtriplerel", "xtwoheadleftarrow", "xtwoheadrightarrow", "xxfrac", "xypos" }, - ["it"]={ "AMSTEX", "AfterPar", "Alphabeticnumerals", "AmSTeX", "And", "BeforePar", "Big", "Bigg", "Biggl", "Biggm", "Biggr", "Bigl", "Bigm", "Bigr", "CONTEXT", "Cap", "Caps", "ConTeXt", "Context", "ConvertConstantAfter", "ConvertToConstant", "ETEX", "EveryLine", "EveryPar", "GIORNOSETTIMANA", "GetPar", "GotoPar", "Greeknumerals", "INRSTEX", "LAMSTEX", "LATEX", "LUAJITTEX", "LUATEX", "LaTeX", "LamSTeX", "Lettera", "Lettere", "Lua", "LuaTeX", "LuajitTeX", "MESE", "METAFONT", "METAFUN", "METAPOST", "MKII", "MKIV", "MKIX", "MKVI", "MKXI", "MONTHLONG", "MONTHSHORT", "MPII", "MPIV", "MPVI", "MPanchor", "MPbetex", "MPc", "MPcode", "MPcolor", "MPcoloronly", "MPcolumn", "MPd", "MPdrawing", "MPfontsizehskip", "MPgetmultipars", "MPgetmultishape", "MPgetposboxes", "MPh", "MPinclusions", "MPleftskip", "MPll", "MPlr", "MPls", "MPmenubuttons", "MPn", "MPoptions", "MPoverlayanchor", "MPp", "MPpage", "MPpardata", "MPplus", "MPpos", "MPpositiongraphic", "MPposset", "MPr", "MPrawvar", "MPregion", "MPrest", "MPrightskip", "MPrs", "MPstring", "MPtext", "MPtransparency", "MPul", "MPur", "MPv", "MPvar", "MPvariable", "MPvv", "MPw", "MPwhd", "MPx", "MPxy", "MPxywhd", "MPy", "MetaFont", "MetaFun", "MetaPost", "NormalizeFontHeight", "NormalizeFontWidth", "NormalizeTextHeight", "NormalizeTextWidth", "Numeri", "Numeriromani", "PAROLA", "PAROLE", "PDFETEX", "PDFTEX", "PDFcolor", "PICTEX", "PPCHTEX", "PPCHTeX", "PRAGMA", "Parola", "Parole", "PiCTeX", "PointsToBigPoints", "PointsToReal", "PointsToWholeBigPoints", "PtToCm", "ReadFile", "ScaledPointsToBigPoints", "ScaledPointsToWholeBigPoints", "Smallcapped", "TABLE", "TEX", "TEXpage", "TaBlE", "TeX", "TheNormalizedFontSize", "TransparencyHack", "VerboseNumber", "WidthSpanningText", "XETEX", "XeTeX", "abjadnaivenumerals", "abjadnodotnumerals", "abjadnumerals", "activatespacehandler", "adaptcollector", "adaptfontfeature", "adaptpapersize", "adattacampo", "adattalayout", "addfeature", "addtoJSpreamble", "addtocommalist", "addvalue", "aftersplitstring", "aftertestandsplitstring", "al", "alignmentcharacter", "allinputpaths", "alphabeticnumerals", "alwayscitation", "alwayscite", "ambiente", "ampersand", "anchor", "ap", "apagina", "appendetoks", "appendgvalue", "appendtocommalist", "appendtoks", "appendtoksonce", "appendvalue", "apply", "applyalternativestyle", "applyprocessor", "applytocharacters", "applytofirstcharacter", "applytosplitstringchar", "applytosplitstringcharspaced", "applytosplitstringline", "applytosplitstringlinespaced", "applytosplitstringword", "applytosplitstringwordspaced", "applytowords", "arabicdecimals", "arabicexnumerals", "arabicnumerals", "arg", "argomento", "asciistr", "aside", "assignalfadimension", "assigndimen", "assigndimension", "assignifempty", "assigntranslation", "assignvalue", "assignwidth", "assumelongusagecs", "astype", "attachment", "autocap", "autodirhbox", "autodirvbox", "autodirvtop", "autoinsertnextspace", "automathematics", "autosetups", "availablehsize", "averagecharwidth", "backgroundimage", "backgroundimagefill", "backgroundline", "barracolori", "barrainterazione", "basegrid", "baselineleftbox", "baselinemiddlebox", "baselinerightbox", "bbox", "beforesplitstring", "beforetestandsplitstring", "big", "bigbodyfont", "bigg", "bigger", "biggl", "biggm", "biggr", "bigl", "bigm", "bigr", "bigskip", "binom", "bitmapimage", "blap", "bleed", "bleedheight", "bleedwidth", "blockligatures", "blockquote", "bodyfontenvironmentlist", "bodyfontsize", "bold", "boldface", "bolditalic", "boldslanted", "booleanmodevalue", "bottombox", "bottomleftbox", "bottomrightbox", "boxcursor", "boxmarker", "boxofsize", "boxreference", "bpos", "bthiddencitation", "btxabbreviatedjournal", "btxaddjournal", "btxalwayscitation", "btxauthorfield", "btxdetail", "btxdirect", "btxdoif", "btxdoifcombiinlistelse", "btxdoifelse", "btxdoifelsecombiinlist", "btxdoifelsesameasprevious", "btxdoifelsesameaspreviouschecked", "btxdoifelseuservariable", "btxdoifnot", "btxdoifsameaspreviouscheckedelse", "btxdoifsameaspreviouselse", "btxdoifuservariableelse", "btxexpandedjournal", "btxfield", "btxfieldname", "btxfieldtype", "btxfirstofrange", "btxflush", "btxflushauthor", "btxflushauthorinverted", "btxflushauthorinvertedshort", "btxflushauthorname", "btxflushauthornormal", "btxflushauthornormalshort", "btxflushsuffix", "btxfoundname", "btxfoundtype", "btxhybridcite", "btxlistcitation", "btxloadjournalist", "btxoneorrange", "btxremapauthor", "btxsavejournalist", "btxsetup", "btxsingularorplural", "btxsingularplural", "btxtextcitation", "calligraphic", "cambiaafontdeltesto", "camel", "campi", "cap", "capello", "capitolo", "capoverso", "catcodetablename", "cbox", "centerbox", "centeredbox", "centerednextbox", "cfrac", "chardescription", "charwidthlanguage", "checkcharacteralign", "checkedchar", "checkedfiller", "checkedstrippedcsname", "checkinjector", "checknextindentation", "checknextinjector", "checkpage", "checkparameters", "checkpreviousinjector", "checksoundtrack", "checktwopassdata", "checkvariables", "chemical", "chemicalbottext", "chemicalmidtext", "chemicalsymbol", "chemicaltext", "chemicaltoptext", "chim", "chineseallnumerals", "chinesecapnumerals", "chinesenumerals", "circondato", "citation", "citazione", "cite", "clap", "classfont", "cldcommand", "cldcontext", "cldloadfile", "cldprocessfile", "cleftarrow", "clip", "clonacampo", "collect", "collectedtext", "collectexpanded", "colonna", "colorcomponents", "colore", "colored", "coloregrigio", "coloronly", "columnbreak", "combinepages", "commalistelement", "commalistsentence", "commalistsize", "comment", "commento", "comparedimension", "comparedimensioneps", "completebtxrendering", "completelist", "completelistofpublications", "completelistofsorts", "completelistofsynonyms", "completeregister", "complexorsimple", "complexorsimpleempty", "componenet", "composedcollector", "composedlayer", "compresult", "confrontagruppocolori", "confrontatavolozza", "constantdimen", "constantdimenargument", "constantemptyargument", "constantnumber", "constantnumberargument", "contentreference", "continuednumber", "continueifinputfile", "convertargument", "convertcommand", "convertedcounter", "converteddimen", "convertedsubcounter", "convertinumero", "convertmonth", "convertvalue", "convertvboxtohbox", "copiacampo", "copypages", "copyparameters", "copyposition", "correggispaziobianco", "countersubs", "counttoken", "counttokens", "cramped", "crampedclap", "crampedllap", "crampedrlap", "crightarrow", "crightoverleftarrow", "ctop", "ctxcommand", "ctxdirectcommand", "ctxdirectlua", "ctxfunction", "ctxlatecommand", "ctxlatelua", "ctxloadluafile", "ctxlua", "ctxluabuffer", "ctxluacode", "ctxreport", "ctxsprint", "currentassignmentlistkey", "currentassignmentlistvalue", "currentbtxuservariable", "currentcommalistitem", "currentcomponent", "currentenvironment", "currentfeaturetest", "currentinterface", "currentlanguage", "currentlistentrydestinationattribute", "currentlistentrylimitedtext", "currentlistentrynumber", "currentlistentrypagenumber", "currentlistentryreferenceattribute", "currentlistentrytitle", "currentlistentrytitlerendered", "currentlistsymbol", "currentmainlanguage", "currentmessagetext", "currentmoduleparameter", "currentoutputstream", "currentproduct", "currentproject", "currentregime", "currentregisterpageuserdata", "currentresponses", "currenttime", "currentvalue", "currentxtablecolumn", "currentxtablerow", "da", "daqualcheparte", "data", "datadioggi", "datasetvariable", "dayoftheweek", "dayspermonth", "dbinom", "decrement", "decrementcounter", "decrementedcounter", "decrementpagenumber", "decrementsubpagenumber", "decrementvalue", "defaultinterface", "defaultobjectpage", "defaultobjectreference", "defcatcodecommand", "defconvertedargument", "defconvertedcommand", "defconvertedvalue", "defineMPinstance", "defineTABLEsetup", "defineactivecharacter", "definealternativestyle", "defineanchor", "defineattachment", "defineattribute", "definebackground", "definebar", "definebodyfontswitch", "definebreakpoint", "definebreakpoints", "definebtx", "definebtxdataset", "definebtxregister", "definebtxrendering", "definebutton", "definecapitals", "definecharacterkerning", "definecharacterspacing", "definechemical", "definechemicals", "definechemicalsymbol", "definecollector", "definecolumnbreak", "definecombination", "definecomment", "definecomplexorsimple", "definecomplexorsimpleempty", "defineconversionset", "definecounter", "definedataset", "definedelimitedtext", "definedfont", "defineeffect", "defineexpandable", "defineexternalfigure", "definefallbackfamily", "definefieldbody", "definefieldbodyset", "definefieldcategory", "definefileconstant", "definefilefallback", "definefilesynonym", "definefiller", "definefirstline", "definefittingpage", "definefontalternative", "definefontfallback", "definefontfamily", "definefontfamilypreset", "definefontfeature", "definefontfile", "definefontsize", "definefontsolution", "defineformula", "defineformulaalternative", "defineformulaframed", "defineframedcontent", "definefrozenfont", "defineglobalcolor", "definegraphictypesynonym", "definegridsnapping", "defineheadalternative", "definehelp", "definehigh", "definehighlight", "definehspace", "definehypenationfeatures", "defineindentedtext", "defineindenting", "defineinitial", "defineinsertion", "defineinteraction", "defineinteractionbar", "defineinterfaceconstant", "defineinterfaceelement", "defineinterfacevariable", "defineinterlinespace", "defineintermediatecolor", "defineitemgroup", "defineitems", "definelabelclass", "definelayer", "definelayerpreset", "definelinefiller", "definelinenote", "definelinenumbering", "definelines", "definelistalternative", "definelistextra", "definelow", "definelowhigh", "definelowmidhigh", "definemarginblock", "definemargindata", "definemarker", "definemathalignment", "definemathcases", "definemathcommand", "definemathdoubleextensible", "definemathematics", "definemathextensible", "definemathfence", "definemathfraction", "definemathframed", "definemathmatrix", "definemathornament", "definemathoverextensible", "definemathovertextextensible", "definemathradical", "definemathstackers", "definemathstyle", "definemathtriplet", "definemathunderextensible", "definemathundertextextensible", "definemathunstacked", "definemeasure", "definemessageconstant", "definemixedcolumns", "definemode", "definemultitonecolor", "definenamedcolor", "definenamespace", "definenarrower", "definenote", "defineornament", "defineoutputroutine", "defineoutputroutinecommand", "definepage", "definepagebreak", "definepagechecker", "definepagegrid", "definepagegridarea", "definepagegridspan", "definepageinjection", "definepageinjectionalternative", "definepageshift", "definepagestate", "definepairedbox", "defineparagraph", "defineparallel", "defineparbuilder", "defineplacement", "definepositioning", "defineprefixset", "defineprocesscolor", "defineprocessor", "definepushbutton", "definepushsymbol", "definerenderingwindow", "defineresetset", "definescale", "definescript", "definesectionlevels", "defineselector", "defineseparatorset", "defineshift", "definesidebar", "definesort", "definespotcolor", "definestyleinstance", "definesubformula", "definesynonym", "definesystemattribute", "definesystemconstant", "definesystemvariable", "definetabulation", "definetextbackground", "definetextflow", "definetooltip", "definetransparency", "definetwopasslist", "definetypeface", "definetypescriptprefix", "definetypescriptsynonym", "definetypesetting", "defineunit", "defineviewerlayer", "definevspace", "definevspacing", "definevspacingamount", "definextable", "definisci", "definisciambientefontdeltesto", "definisciblocco", "definiscibloccosezione", "definiscibuffer", "definiscicampo", "definiscicapoversi", "definiscicolore", "definisciconversione", "definiscidescrizione", "definiscidimensionicarta", "definiscielenco", "definiscielencocombinato", "definiscienumerazione", "definiscietichetta", "definiscifigurasimbolo", "definiscifont", "definiscifontdeltesto", "definisciformatoriferimento", "definiscigruppocolori", "definiscihbox", "definisciincorniciato", "definisciiniziatermina", "definiscilayout", "definiscimakeup", "definiscimarcatura", "definiscimenuinterazione", "definiscimodellotabella", "definiscioggettomobile", "definisciordinamento", "definisciprofilo", "definisciprogramma", "definisciregistro", "definisciriferimento", "definiscisezione", "definiscisimbolo", "definiscisinonimi", "definiscisinonimofont", "definiscisottocampo", "definiscisovrapposizione", "definiscistackcampi", "definiscistile", "definiscistilefont", "definiscitabulato", "definiscitavolozza", "definiscitesta", "definiscitesto", "definiscitestoincorniciato", "definiscitype", "definiscityping", "delimited", "delimitedtext", "depthofstring", "depthonlybox", "depthspanningtext", "determinacaratteristicheregistro", "determinacarattersticheelenco", "determinanumerotesta", "determinenoflines", "devanagarinumerals", "dfrac", "digits", "dimensiontocount", "directcolor", "directcolored", "directconvertedcounter", "directdummyparameter", "directgetboxllx", "directgetboxlly", "directhighlight", "directlocalframed", "directluacode", "directselect", "directsetbar", "directsetup", "directsymbol", "directvspacing", "dis", "disabledirectives", "disableexperiments", "disablemode", "disableoutputstream", "disableparpositions", "disableregime", "disabletrackers", "displaymath", "displaymathematics", "displaymessage", "distributedhsize", "dividedsize", "doadaptleftskip", "doadaptrightskip", "doaddfeature", "doassign", "doassignempty", "doboundtext", "docheckassignment", "docheckedpagestate", "docheckedpair", "documentvariable", "dodoubleargument", "dodoubleargumentwithset", "dodoubleempty", "dodoubleemptywithset", "dodoublegroupempty", "doeassign", "doexpandedrecurse", "dogetattribute", "dogetattributeid", "dogetcommacommandelement", "dogobbledoubleempty", "dogobblesingleempty", "doif", "doifMPgraphicelse", "doifallcommon", "doifallcommonelse", "doifalldefinedelse", "doifallmodes", "doifallmodeselse", "doifassignmentelse", "doifblackelse", "doifbothsides", "doifbothsidesoverruled", "doifboxelse", "doifbufferelse", "doifcolor", "doifcolorelse", "doifcommandhandler", "doifcommandhandlerelse", "doifcommon", "doifcommonelse", "doifcontent", "doifconversiondefinedelse", "doifconversionnumberelse", "doifcounter", "doifcounterelse", "doifcurrentfonthasfeatureelse", "doifdefined", "doifdefinedcounter", "doifdefinedcounterelse", "doifdefinedelse", "doifdimensionelse", "doifdimenstringelse", "doifdocumentargument", "doifdocumentargumentelse", "doifdocumentfilename", "doifdocumentfilenameelse", "doifdrawingblackelse", "doifelse", "doifelseMPgraphic", "doifelseallcommon", "doifelsealldefined", "doifelseallmodes", "doifelseassignment", "doifelseblack", "doifelsebox", "doifelsebuffer", "doifelsecolor", "doifelsecommandhandler", "doifelsecommon", "doifelseconversiondefined", "doifelseconversionnumber", "doifelsecounter", "doifelsecurrentfonthasfeature", "doifelsecurrentsortingused", "doifelsecurrentsynonymshown", "doifelsecurrentsynonymused", "doifelsedefined", "doifelsedefinedcounter", "doifelsedimension", "doifelsedimenstring", "doifelsedocumentargument", "doifelsedocumentfilename", "doifelsedrawingblack", "doifelseempty", "doifelseemptyvalue", "doifelseemptyvariable", "doifelseenv", "doifelsefastoptionalcheck", "doifelsefastoptionalcheckcs", "doifelsefieldbody", "doifelsefieldcategory", "doifelsefigure", "doifelsefile", "doifelsefiledefined", "doifelsefileexists", "doifelsefirstchar", "doifelseflagged", "doifelsefontchar", "doifelsefontpresent", "doifelsefontsynonym", "doifelsehasspace", "doifelsehelp", "doifelseincsname", "doifelseinelement", "doifelseinputfile", "doifelseinsertion", "doifelseinset", "doifelseinstring", "doifelseinsymbolset", "doifelseintoks", "doifelseintwopassdata", "doifelseitalic", "doifelselanguage", "doifelselayerdata", "doifelselayoutdefined", "doifelselayoutsomeline", "doifelselayouttextline", "doifelseleapyear", "doifelselist", "doifelselocation", "doifelselocfile", "doifelsemainfloatbody", "doifelsemarking", "doifelsemeaning", "doifelsemessage", "doifelsemode", "doifelsenextbgroup", "doifelsenextbgroupcs", "doifelsenextchar", "doifelsenextoptional", "doifelsenextoptionalcs", "doifelsenextparenthesis", "doifelsenonzeropositive", "doifelsenoteonsamepage", "doifelsenothing", "doifelsenumber", "doifelseobjectfound", "doifelseobjectreferencefound", "doifelseoddpage", "doifelseoddpagefloat", "doifelseoldercontext", "doifelseolderversion", "doifelseoverlapping", "doifelseoverlay", "doifelseparallel", "doifelseparentfile", "doifelsepath", "doifelsepathexists", "doifelsepatterns", "doifelseposition", "doifelsepositionaction", "doifelsepositiononpage", "doifelsepositionsonsamepage", "doifelsepositionsonthispage", "doifelsepositionsused", "doifelsereferencefound", "doifelserightpagefloat", "doifelserighttoleftinbox", "doifelsesamelinereference", "doifelsesamestring", "doifelsesetups", "doifelsesomebackground", "doifelsesomespace", "doifelsesomething", "doifelsesometoks", "doifelsestringinstring", "doifelsestructurelisthasnumber", "doifelsestructurelisthaspage", "doifelsesymboldefined", "doifelsesymbolset", "doifelsetext", "doifelsetextflow", "doifelsetextflowcollector", "doifelsetypingfile", "doifelseundefined", "doifelseurldefined", "doifelsevalue", "doifelsevaluenothing", "doifelsevariable", "doifempty", "doifemptyelse", "doifemptytoks", "doifemptyvalue", "doifemptyvalueelse", "doifemptyvariable", "doifemptyvariableelse", "doifenv", "doifenvelse", "doiffastoptionalcheckcselse", "doiffastoptionalcheckelse", "doiffieldbodyelse", "doiffieldcategoryelse", "doiffigureelse", "doiffile", "doiffiledefinedelse", "doiffileelse", "doiffileexistselse", "doiffirstcharelse", "doifflaggedelse", "doiffontcharelse", "doiffontpresentelse", "doiffontsynonymelse", "doifhasspaceelse", "doifhelpelse", "doifincsnameelse", "doifinelementelse", "doifinputfileelse", "doifinsertionelse", "doifinset", "doifinsetelse", "doifinstring", "doifinstringelse", "doifinsymbolset", "doifinsymbolsetelse", "doifintokselse", "doifintwopassdataelse", "doifitalicelse", "doiflanguageelse", "doiflayerdataelse", "doiflayoutdefinedelse", "doiflayoutsomelineelse", "doiflayouttextlineelse", "doifleapyearelse", "doiflistelse", "doiflocationelse", "doiflocfileelse", "doifmainfloatbodyelse", "doifmarkingelse", "doifmeaningelse", "doifmessageelse", "doifmode", "doifmodeelse", "doifnextbgroupcselse", "doifnextbgroupelse", "doifnextcharelse", "doifnextoptionalcselse", "doifnextoptionalelse", "doifnextparenthesiselse", "doifnonzeropositiveelse", "doifnot", "doifnotallcommon", "doifnotallmodes", "doifnotcommandhandler", "doifnotcommon", "doifnotcounter", "doifnotdocumentargument", "doifnotdocumentfilename", "doifnotempty", "doifnotemptyvalue", "doifnotemptyvariable", "doifnotenv", "doifnoteonsamepageelse", "doifnotescollected", "doifnotfile", "doifnotflagged", "doifnothing", "doifnothingelse", "doifnotinset", "doifnotinsidesplitfloat", "doifnotinstring", "doifnotmode", "doifnotnumber", "doifnotsamestring", "doifnotsetups", "doifnotvalue", "doifnotvariable", "doifnumber", "doifnumberelse", "doifobjectfoundelse", "doifobjectreferencefoundelse", "doifoddpageelse", "doifoddpagefloatelse", "doifoldercontextelse", "doifolderversionelse", "doifoverlappingelse", "doifoverlayelse", "doifparallelelse", "doifparentfileelse", "doifpathelse", "doifpathexistselse", "doifpatternselse", "doifposition", "doifpositionaction", "doifpositionactionelse", "doifpositionelse", "doifpositiononpageelse", "doifpositionsonsamepageelse", "doifpositionsonthispageelse", "doifpositionsusedelse", "doifreferencefoundelse", "doifrightpagefloatelse", "doifrighttoleftinboxelse", "doifsamelinereferenceelse", "doifsamestring", "doifsamestringelse", "doifsetups", "doifsetupselse", "doifsomebackground", "doifsomebackgroundelse", "doifsomespaceelse", "doifsomething", "doifsomethingelse", "doifsometoks", "doifsometokselse", "doifstringinstringelse", "doifstructurelisthasnumberelse", "doifstructurelisthaspageelse", "doifsymboldefinedelse", "doifsymbolsetelse", "doiftext", "doiftextelse", "doiftextflowcollectorelse", "doiftextflowelse", "doiftypingfileelse", "doifundefined", "doifundefinedcounter", "doifundefinedelse", "doifurldefinedelse", "doifvalue", "doifvalueelse", "doifvaluenothing", "doifvaluenothingelse", "doifvaluesomething", "doifvariable", "doifvariableelse", "doindentation", "dollar", "doloop", "doloopoverlist", "donothing", "dontconvertfont", "dontleavehmode", "dontpermitspacesbetweengroups", "dopositionaction", "doprocesslocalsetups", "doquadrupleargument", "doquadrupleempty", "doquadruplegroupempty", "doquintupleargument", "doquintupleempty", "doquintuplegroupempty", "dorechecknextindentation", "dorecurse", "dorepeatwithcommand", "doreplacefeature", "doresetandafffeature", "doresetattribute", "dorotatebox", "dosetattribute", "dosetleftskipadaption", "dosetrightskipadaption", "dosetupcheckedinterlinespace", "doseventupleargument", "doseventupleempty", "dosingleargument", "dosingleempty", "dosinglegroupempty", "dosixtupleargument", "dosixtupleempty", "dostepwiserecurse", "dosubtractfeature", "dotfskip", "dotoks", "dotripleargument", "dotripleargumentwithset", "dotripleempty", "dotripleemptywithset", "dotriplegroupempty", "doublebar", "doublebond", "doublebrace", "doublebracket", "doubleparent", "dowith", "dowithnextbox", "dowithnextboxcontent", "dowithnextboxcontentcs", "dowithnextboxcs", "dowithpargument", "dowithrange", "dowithwargument", "dpofstring", "dummydigit", "dummyparameter", "eTeX", "edefconvertedargument", "efcmaxheight", "efcmaxwidth", "efcminheight", "efcminwidth", "efcparameter", "effect", "elaborablocchi", "elapsedseconds", "elapsedtime", "eleftarrowfill", "eleftharpoondownfill", "eleftharpoonupfill", "eleftrightarrowfill", "elementi", "elemento", "elenco", "emphasisboldface", "emphasistypeface", "emptylines", "emspace", "enabledirectives", "enableexperiments", "enablemode", "enableoutputstream", "enableparpositions", "enableregime", "enabletrackers", "enskip", "enspace", "env", "envvar", "eoverbarfill", "eoverbracefill", "eoverbracketfill", "eoverparentfill", "epos", "equaldigits", "erightarrowfill", "erightharpoondownfill", "erightharpoonupfill", "etwoheadrightarrowfill", "eunderbarfill", "eunderbracefill", "eunderbracketfill", "eunderparentfill", "executeifdefined", "exitloop", "exitloopnow", "expandcheckedcsname", "expanded", "expandfontsynonym", "externalfigurecollectionmaxheight", "externalfigurecollectionmaxwidth", "externalfigurecollectionminheight", "externalfigurecollectionminwidth", "externalfigurecollectionparameter", "fakebox", "fastdecrement", "fastincrement", "fastlocalframed", "fastscale", "fastsetup", "fastsetupwithargument", "fastsetupwithargumentswapped", "fastswitchtobodyfont", "fastsxsy", "feature", "fence", "fenced", "fetchallmarkings", "fetchallmarks", "fetchmark", "fetchmarking", "fetchonemark", "fetchonemarking", "fetchruntinecommand", "fetchtwomarkings", "fetchtwomarks", "fieldbody", "fifthoffivearguments", "fifthofsixarguments", "figura", "figuraesterna", "figurefilename", "figurefilepath", "figurefiletype", "figurefullname", "figureheight", "figurenaturalheight", "figurenaturalwidth", "figuresymbol", "figurewidth", "filename", "filledhboxb", "filledhboxc", "filledhboxg", "filledhboxk", "filledhboxm", "filledhboxr", "filledhboxy", "filler", "filterfromnext", "filterfromvalue", "filterpages", "filterreference", "findtwopassdata", "finishregisterentry", "firstcharacter", "firstcounter", "firstcountervalue", "firstoffivearguments", "firstoffourarguments", "firstofoneargument", "firstofoneunexpanded", "firstofsixarguments", "firstofthreearguments", "firstofthreeunexpanded", "firstoftwoarguments", "firstoftwounexpanded", "firstrealpage", "firstrealpagenumber", "firstsubcountervalue", "firstsubpage", "firstsubpagenumber", "firstuserpage", "firstuserpagenumber", "fitfieldframed", "fittopbaselinegrid", "flag", "floatuserdataparameter", "flushboxregister", "flushcollector", "flushlayer", "flushlocalfloats", "flushnextbox", "flushnotes", "flushoutputstream", "flushshapebox", "flushtextflow", "flushtokens", "flushtoks", "fontalternative", "fontbody", "fontchar", "fontcharbyindex", "fontclass", "fontclassname", "fontface", "fontfeaturelist", "fontsize", "fontstyle", "forcecharacterstripping", "forcelocalfloats", "forgeteverypar", "forgetparameters", "formula", "foundbox", "fourthoffivearguments", "fourthoffourarguments", "fourthofsixarguments", "frac", "frameddimension", "framedparameter", "framedtext", "freezedimenmacro", "freezemeasure", "frenchspacing", "fromlinenote", "frozenhbox", "gdefconvertedargument", "gdefconvertedcommand", "getMPdrawing", "getMPlayer", "getboxllx", "getboxlly", "getbufferdata", "getcommacommandsize", "getcommalistsize", "getdayoftheweek", "getdayspermonth", "getdefinedbuffer", "getdocumentargument", "getdocumentargumentdefault", "getdocumentfilename", "getdummyparameters", "getemptyparameters", "geteparameters", "getexpandedparameters", "getfiguredimensions", "getfirstcharacter", "getfirsttwopassdata", "getfromcommacommand", "getfromcommalist", "getfromtwopassdata", "getglyphdirect", "getglyphstyled", "getgparameters", "getlasttwopassdata", "getlocalfloat", "getlocalfloats", "getmessage", "getnamedglyphdirect", "getnamedglyphstyled", "getnamedtwopassdatalist", "getnaturaldimensions", "getnoflines", "getobject", "getobjectdimensions", "getpaletsize", "getparameters", "getprivatechar", "getprivateslot", "getrandomcount", "getrandomdimen", "getrandomfloat", "getrandomnumber", "getrandomseed", "getraweparameters", "getrawgparameters", "getrawnoflines", "getrawparameters", "getrawxparameters", "getreference", "getreferenceentry", "getroundednoflines", "getsubstring", "gettwopassdata", "gettwopassdatalist", "getuvalue", "getvalue", "getvariable", "getvariabledefault", "getxparameters", "giornosettimana", "globaldisablemode", "globalenablemode", "globalletempty", "globalpopbox", "globalpopmacro", "globalpreventmode", "globalprocesscommalist", "globalpushbox", "globalpushmacro", "globalswapcounts", "globalswapdimens", "globalswapmacros", "globalundefine", "glyphfontfile", "gobbledoubleempty", "gobbleeightarguments", "gobblefivearguments", "gobblefiveoptionals", "gobblefourarguments", "gobblefouroptionals", "gobbleninearguments", "gobbleoneargument", "gobbleoneoptional", "gobblesevenarguments", "gobblesingleempty", "gobblesixarguments", "gobblespacetokens", "gobbletenarguments", "gobblethreearguments", "gobblethreeoptionals", "gobbletwoarguments", "gobbletwooptionals", "gobbleuntil", "gobbleuntilrelax", "grabbufferdata", "grabbufferdatadirect", "grabuntil", "grafico", "grayvalue", "greedysplitstring", "greeknumerals", "griglia", "groupedcommand", "gsetboxllx", "gsetboxlly", "gujaratinumerals", "gurmurkhinumerals", "hairspace", "halfwaybox", "handletokens", "handwritten", "hash", "hboxofvbox", "hboxreference", "hdofstring", "headhbox", "headnumbercontent", "headnumberdistance", "headnumberwidth", "headreferenceattributes", "headsetupspacing", "headtextcontent", "headtextdistance", "headtextwidth", "headvbox", "headwidth", "heightanddepthofstring", "heightofstring", "heightspanningtext", "helptext", "hglue", "hiddenbar", "hiddencitation", "hiddencite", "highlight", "highordinalstr", "hilo", "himilo", "hl", "horizontalgrowingbar", "horizontalpositionbar", "hphantom", "hpos", "hsizefraction", "hsmash", "hsmashbox", "hsmashed", "hspace", "htdpofstring", "htofstring", "hyphen", "hyphenatedcoloredword", "hyphenatedfile", "hyphenatedfilename", "hyphenatedhbox", "hyphenatedpar", "hyphenatedurl", "hyphenatedword", "ibox", "ifassignment", "iff", "ifinobject", "ifinoutputstream", "ifparameters", "iftrialtypesetting", "ignoreimplicitspaces", "ignorevalue", "ignoto", "immediatesavetwopassdata", "impliedby", "implies", "impostaampiezzariga", "impostabarrainterazione", "impostablocco", "impostabloccosezione", "impostabuffer", "impostacampi", "impostacampo", "impostacapoversi", "impostacaption", "impostacima", "impostaclippling", "impostacolonne", "impostacolore", "impostacolori", "impostacommento", "impostacommentopagina", "impostadimensionicarta", "impostaelementi", "impostaelencazioni", "impostaelenco", "impostaelencocombinato", "impostafondo", "impostafontdeltesto", "impostaforms", "impostaincorniciato", "impostainiziatermina", "impostainstestazione", "impostainterazione", "impostainterlinea", "impostalayout", "impostalineemargine", "impostalineenere", "impostalineeriempimento", "impostalineesottili", "impostalineetesto", "impostalingua", "impostamaiuscole", "impostamakeup", "impostamarcatura", "impostamenuinterazione", "impostamenzione", "impostanumerazionecapoversi", "impostanumerazionepagina", "impostanumerazionerighe", "impostanumeropagina", "impostanumerosottopagina", "impostanumerotesta", "impostaoggettomobile", "impostaordinamento", "impostaparranging", "impostapdp", "impostapiustretto", "impostaposizionamento", "impostaposizionamentoopposti", "impostaprogrammi", "impostaregistro", "impostarientro", "impostariferimento", "impostarighe", "impostarigheriempimento", "impostarigovuoto", "impostarotazione", "impostaschermointerazione", "impostasegnosillabazione", "impostasetsimboli", "impostasfondi", "impostasfondo", "impostasinonimi", "impostaspaziatura", "impostaspaziobianco", "impostaspezzamentooggettomobile", "impostatabelle", "impostatabulato", "impostatavolozza", "impostatesta", "impostateste", "impostatesticima", "impostatestifondo", "impostatestiintestazioni", "impostatestipdp", "impostatesto", "impostatestotesti", "impostatolleranza", "impostatransizionepagina", "impostatype", "impostatyping", "impostaurl", "in", "includemenu", "includeversioninfo", "incorniciato", "increment", "incrementcounter", "incrementedcounter", "incrementpagenumber", "incrementsubpagenumber", "incrementvalue", "indentation", "infofont", "infofontbold", "inheritparameter", "inhibitblank", "initializeboxstack", "iniziaJScode", "iniziaJSpreamble", "iniziaMPclip", "iniziaMPcode", "iniziaMPdefinitions", "iniziaMPdrawing", "iniziaMPenvironment", "iniziaMPextensions", "iniziaMPinclusions", "iniziaMPinitializations", "iniziaMPpage", "iniziaMPpositiongraphic", "iniziaMPpositionmethod", "iniziaMPrun", "iniziaTABLE", "iniziaTABLEbody", "iniziaTABLEfoot", "iniziaTABLEhead", "iniziaTABLEnext", "iniziaTC", "iniziaTD", "iniziaTDs", "iniziaTEXpage", "iniziaTH", "iniziaTN", "iniziaTR", "iniziaTRs", "iniziaTX", "iniziaTY", "iniziaallmodes", "iniziaambiente", "iniziaargomento", "iniziaarrangedpages", "iniziaaside", "iniziaattachment", "iniziabar", "iniziabinom", "iniziabitmapimage", "iniziablockquote", "iniziabtxrenderingdefinitions", "iniziabuffer", "iniziabutton", "iniziacapitolo", "iniziacapoverso", "iniziacatcodetable", "iniziacharacteralign", "iniziacheckedfences", "iniziachemical", "iniziacitazione", "iniziacollect", "iniziacollecting", "iniziacolore", "iniziacolorintent", "iniziacoloronly", "iniziacolorset", "iniziacolumns", "iniziacolumnspan", "iniziacombination", "iniziacomment", "iniziacommento", "iniziacomponenet", "iniziacontextcode", "iniziacontextdefinitioncode", "iniziactxfunction", "iniziactxfunctiondefinition", "iniziacurrentcolor", "iniziacurrentlistentrywrapper", "iniziadbinom", "iniziadelimited", "iniziadelimitedtext", "iniziadfrac", "iniziadisplaymath", "iniziadmath", "iniziadocument", "iniziaeffect", "iniziaelement", "iniziaelemento", "iniziaelenco", "iniziaembeddedxtable", "iniziaendofline", "iniziaexceptions", "iniziaexpanded", "iniziaexpandedcollect", "iniziaextendedcatcodetable", "iniziaexternalfigurecollection", "iniziafigura", "iniziafigure", "iniziafitfieldframed", "iniziafittingpage", "iniziafloatcombination", "iniziafont", "iniziafontclass", "iniziafontsolution", "iniziaformula", "iniziaformulas", "iniziafrac", "iniziaframedcontent", "iniziaframedtext", "iniziagrafico", "iniziagridsnapping", "iniziahbox", "iniziahboxestohbox", "iniziahboxregister", "iniziahelptext", "iniziahiddenbar", "iniziahiding", "iniziahighlight", "iniziahyphenation", "iniziaimath", "iniziaimpaccato", "iniziaincorniciato", "iniziaindentation", "iniziaindentedtext", "iniziainmframed", "iniziainteraction", "iniziainterface", "iniziaintermezzo", "iniziaintertext", "iniziaitemgroup", "iniziaknockout", "inizialayout", "inizialineamargine", "inizialineatesto", "inizialinecorrection", "inizialinefiller", "inizialinenumbering", "inizialinetable", "inizialinetablebody", "inizialinetablecell", "inizialinetablehead", "inizialocalfootnotes", "inizialocalheadsetup", "inizialocallinecorrection", "inizialocalnotes", "inizialocalsetups", "inizialua", "inizialuacode", "inizialuaparameterset", "inizialuasetups", "iniziamakeup", "iniziamarginblock", "iniziamarkedcontent", "iniziamathmode", "iniziamathstyle", "iniziamatrices", "iniziamcframed", "iniziamdformula", "iniziamenuinterattivo", "iniziamenzione", "iniziamettiformula", "iniziamframed", "iniziamixedcolumns", "iniziamode", "iniziamodeset", "iniziamodule", "iniziamoduletestsection", "iniziampformula", "inizianamedsection", "inizianamedsubformulas", "inizianarrow", "inizianarrower", "inizianegative", "inizianicelyfilledbox", "inizianobar", "inizianointerference", "inizianotallmodes", "inizianotext", "inizianotmode", "iniziaopposite", "iniziaoutputstream", "iniziaoverlay", "iniziaoverprint", "iniziapagecomment", "iniziapagefigure", "iniziapagegrid", "iniziapagegridspan", "iniziapagelayout", "iniziapar", "iniziaparagraph", "iniziaparagraphs", "iniziaparagraphscell", "iniziaparbuilder", "iniziapath", "iniziaplacepairedbox", "iniziapositioning", "iniziapositionoverlay", "iniziapositive", "iniziapostponing", "iniziaprocessassignmentcommand", "iniziaprocessassignmentlist", "iniziaprocesscommacommand", "iniziaprocesscommalist", "iniziaprodotto", "iniziaprogetto", "iniziaprotect", "iniziaprotectedcolors", "iniziapubblicazione", "iniziapunctuation", "iniziarandomized", "iniziarandomseed", "iniziarawsetups", "iniziareadingfile", "iniziareferenceprefix", "iniziaregime", "iniziareusableMPgraphic", "iniziariga", "iniziasbarrati", "iniziasbarrato", "iniziascript", "iniziasdformula", "iniziasectionblock", "iniziasectionblockenvironment", "iniziasectionlevel", "iniziasetups", "iniziasfondo", "iniziasfrac", "iniziashapebox", "iniziashift", "iniziasidebar", "iniziasimplecolumns", "iniziasopralinea", "iniziasopralinee", "iniziasottoargomento", "iniziasottocapoverso", "iniziasottolinea", "iniziasottolinee", "iniziasottosottoargomento", "iniziasottosottocapoverso", "iniziasottosottosottoargomento", "iniziasottosottosottocapoverso", "iniziasottosottosottosottoargomento", "iniziasottosottosottosottocapoverso", "iniziaspecialitem", "iniziaspeech", "iniziaspformula", "iniziaspread", "iniziastartstop", "iniziastaticMPfigure", "iniziastaticMPgraphic", "iniziastrictinspectnextcharacter", "iniziastrut", "iniziastyle", "iniziasubformulas", "iniziasubjectlevel", "iniziasubsentence", "iniziasubstack", "iniziasymbolset", "iniziatabella", "iniziatable", "iniziatablehead", "iniziatables", "iniziatabletail", "iniziatabulate", "iniziatabulatehead", "iniziatabulatetail", "iniziatagged", "iniziatbinom", "iniziatesta", "iniziatestoaiuto", "iniziatestoincorniciato", "iniziatexcode", "iniziatexdefinition", "iniziatext", "iniziatextbackground", "iniziatextbackgroundmanual", "iniziatextcolor", "iniziatextcolorintent", "iniziatextflow", "iniziatitolo", "iniziatokens", "iniziatransparent", "iniziatypescript", "iniziatypescriptcollection", "iniziaunderdash", "iniziaunderdashes", "iniziaunderdot", "iniziaunderdots", "iniziaunderrandom", "iniziaunderrandoms", "iniziaunderstrike", "iniziaunderstrikes", "iniziaunframed", "iniziauniqueMPgraphic", "iniziauniqueMPpagegraphic", "iniziaunpacked", "iniziausableMPgraphic", "iniziauseMPgraphic", "iniziausemathstyleparameter", "iniziausingbtxspecification", "iniziavaia", "iniziavbox", "iniziavboxregister", "iniziavboxtohbox", "iniziavboxtohboxseparator", "iniziaviewerlayer", "iniziavtop", "iniziavtopregister", "iniziaxcell", "iniziaxcellgroup", "iniziaxfrac", "iniziaxgroup", "iniziaxmldisplayverbatim", "iniziaxmlinlineverbatim", "iniziaxmlraw", "iniziaxmlsetups", "iniziaxrow", "iniziaxrowgroup", "iniziaxtable", "iniziaxtablebody", "iniziaxtablefoot", "iniziaxtablehead", "iniziaxtablenext", "iniziaxxfrac", "inlinebuffer", "inlinedbox", "inlinemath", "inlinemathematics", "inlinemessage", "inlineordisplaymath", "inlinerange", "inmaframed", "innerflushshapebox", "input", "inputfilebarename", "inputfilename", "inputfilerealsuffix", "inputfilesuffix", "inputgivenfile", "inriga", "insertpages", "installactionhandler", "installactivecharacter", "installalingua", "installanddefineactivecharacter", "installattributestack", "installautocommandhandler", "installautosetuphandler", "installbasicautosetuphandler", "installbasicparameterhandler", "installbottomframerenderer", "installcommandhandler", "installcorenamespace", "installdefinehandler", "installdefinitionset", "installdefinitionsetmember", "installdirectcommandhandler", "installdirectparameterhandler", "installdirectparametersethandler", "installdirectsetuphandler", "installdirectstyleandcolorhandler", "installframedautocommandhandler", "installframedcommandhandler", "installleftframerenderer", "installnamespace", "installoutputroutine", "installpagearrangement", "installparameterhandler", "installparameterhashhandler", "installparametersethandler", "installparentinjector", "installrightframerenderer", "installrootparameterhandler", "installsetuphandler", "installsetuponlycommandhandler", "installshipoutmethod", "installsimplecommandhandler", "installsimpleframedcommandhandler", "installstyleandcolorhandler", "installswitchcommandhandler", "installswitchsetuphandler", "installtexdirective", "installtextracker", "installtopframerenderer", "installunitsseparator", "installunitsspace", "installversioninfo", "integerrounding", "intermezzo", "intertext", "intorno", "invokepageheandler", "istltdir", "istrtdir", "italic", "italicbold", "italiccorrection", "itemtag", "jobfilename", "jobfilesuffix", "kap", "keeplinestogether", "keepunwantedspaces", "kerncharacters", "koreancirclenumerals", "koreannumerals", "koreannumeralsc", "koreannumeralsp", "koreanparentnumerals", "languageCharacters", "languagecharacters", "languagecharwidth", "lastcounter", "lastcountervalue", "lastdigit", "lastlinewidth", "lastnaturalboxdp", "lastnaturalboxht", "lastnaturalboxwd", "lastpredefinedsymbol", "lastrealpage", "lastrealpagenumber", "lastsubcountervalue", "lastsubpage", "lastsubpagenumber", "lasttwodigits", "lastuserpage", "lastuserpagenumber", "lateluacode", "layeredtext", "layerheight", "layerwidth", "lazysavetaggedtwopassdata", "lazysavetwopassdata", "lbox", "left", "leftbottombox", "leftbox", "lefthbox", "leftorrighthbox", "leftorrightvbox", "leftorrightvtop", "leftskipadaption", "leftsubguillemot", "lefttopbox", "lefttorighthbox", "lefttorightvbox", "lefttorightvtop", "letbeundefined", "letcatcodecommand", "letcscsname", "letcsnamecs", "letcsnamecsname", "letdummyparameter", "letempty", "letgvalue", "letgvalueempty", "letgvalurelax", "lettera", "letterampersand", "letterat", "letterbackslash", "letterbar", "letterbgroup", "letterclosebrace", "lettercolon", "letterdollar", "letterdoublequote", "lettere", "letteregroup", "letterescape", "letterexclamationmark", "letterhash", "letterhat", "letterleftbrace", "letterless", "lettermore", "letteropenbrace", "letterpercent", "letterquestionmark", "letterrightbrace", "lettersinglequote", "letterslash", "letterspacing", "lettertilde", "letterunderscore", "letvalue", "letvalueempty", "letvaluerelax", "lfence", "lhbox", "limitatelines", "limitatetext", "limtatefirstline", "lineanera", "lineasottile", "lineatesto", "lineenere", "lineeriempimento", "lineesottili", "linespanningtext", "lingua", "linguaprincipale", "listcitation", "listcite", "listnamespaces", "llap", "loadanyfile", "loadanyfileonce", "loadbtxdefinitionfile", "loadbtxreplacementfile", "loadcldfile", "loadcldfileonce", "loadfontgoodies", "loadluafile", "loadluafileonce", "loadspellchecklist", "loadtexfile", "loadtexfileonce", "loadtypescriptfile", "localframed", "localframedwithsettings", "localhsize", "localpopbox", "localpopmacro", "localpushbox", "localpushmacro", "localundefine", "locatedfilepath", "locatefilepath", "locfilename", "lomihi", "lowerbox", "lowercased", "lowercasestring", "lowerleftdoubleninequote", "lowerleftsingleninequote", "lowerrightdoubleninequote", "lowerrightsingleninequote", "lrtbbox", "ltop", "luaTeX", "luacode", "luaconditional", "luaenvironment", "luaexpanded", "luafunction", "luajitTeX", "luamajorversion", "luaminorversion", "luaparameterset", "luasetup", "luaversion", "lunghezzaelenco", "m", "mLeftarrow", "mLeftrightarrow", "mRightarrow", "maframed", "makecharacteractive", "makerawcommalist", "makestrutofbox", "mapfontsize", "marcatura", "margindata", "markcontent", "markinjector", "mat", "matematica", "math", "mathbf", "mathbi", "mathblackboard", "mathbs", "mathcommand", "mathdefault", "mathfraktur", "mathfunction", "mathit", "mathitalic", "mathop", "mathrm", "mathscript", "mathsl", "mathss", "mathtext", "mathtextbf", "mathtextbi", "mathtextbs", "mathtextit", "mathtextsl", "mathtexttf", "mathtf", "mathtriplet", "mathtt", "mathupright", "mathword", "mathwordbf", "mathwordbi", "mathwordbs", "mathwordit", "mathwordsl", "mathwordtf", "mbox", "mcframed", "md", "measure", "measured", "medskip", "medspace", "menuinterattivo", "menzione", "mequal", "mese", "message", "metaTeX", "mettielenco", "mettielencocombinato", "mettifiancoafianco", "mettiformula", "mettiingriglia", "mettinotepdp", "mettinotepdplocali", "mettinumeropagina", "mettiregistro", "mettisegnalibro", "mettisottoformula", "mettiunosullaltro", "mfence", "mfunction", "mfunctionlabeltext", "mhbox", "mhookleftarrow", "mhookrightarrow", "middle", "middlebox", "midhbox", "minimalhbox", "mixedcaps", "mkvibuffer", "mleftarrow", "mleftharpoondown", "mleftharpoonup", "mleftrightarrow", "mleftrightharpoons", "mmapsto", "moduleparameter", "molecule", "mono", "monobold", "mononormal", "monthlong", "monthshort", "mostraambientefontdeltesto", "mostracolore", "mostracornice", "mostrafontdeltesto", "mostragriglia", "mostragruppocolori", "mostraimpostazioni", "mostralyout", "mostramakeup", "mostrasetsimboli", "mostrastampa", "mostrastruts", "mostratavolozza", "mp", "mprandomnumber", "mrel", "mrightarrow", "mrightharpoondown", "mrightharpoonup", "mrightleftharpoons", "mrightoverleftarrow", "mtext", "mtriplerel", "mtwoheadleftarrow", "mtwoheadrightarrow", "namedheadnumber", "namedstructureheadlocation", "namedstructureuservariable", "namedstructurevariable", "namedtaggedlabeltexts", "nascondere", "nascondiblocchi", "naturalhbox", "naturalhpack", "naturalvbox", "naturalvcenter", "naturalvpack", "naturalvtop", "naturalwd", "negatecolorbox", "negated", "negthinspace", "newattribute", "newcatcodetable", "newcounter", "newevery", "newfrenchspacing", "newmode", "newsignal", "newsystemmode", "nextbox", "nextboxdp", "nextboxht", "nextboxhtdp", "nextboxwd", "nextcounter", "nextcountervalue", "nextdepth", "nextparagraphs", "nextrealpage", "nextrealpagenumber", "nextsubcountervalue", "nextsubpage", "nextsubpagenumber", "nextuserpage", "nextuserpagenumber", "nientelineecimafondo", "nientelineintestazionepdp", "nientespazio", "nobar", "nocap", "nocitation", "nocite", "nodetostring", "noffigurepages", "noflines", "noflocalfloats", "noindentation", "noitem", "nonfrenchspacing", "nonmathematics", "normal", "normalboldface", "normalframedwithsettings", "normalizebodyfontsize", "normalizedfontsize", "normalizefontdepth", "normalizefontheight", "normalizefontline", "normalizefontwidth", "normalizetextdepth", "normalizetextheight", "normalizetextline", "normalizetextwidth", "normaltypeface", "nota", "notesymbol", "ntimes", "numberofpoints", "numeri", "numeriromani", "numeroformula", "numeropagina", "numeropaginacompleto", "numerotesta", "numerotestacorrente", "obeydepth", "objectdepth", "objectheight", "objectmargin", "objectwidth", "obox", "offset", "offsetbox", "onedigitrounding", "ordinaldaynumber", "ordinalstr", "ornamenttext", "outputfilename", "outputstreambox", "outputstreamcopy", "outputstreamunvbox", "outputstreamunvcopy", "over", "overbar", "overbars", "overbartext", "overbarunderbar", "overbrace", "overbracetext", "overbraceunderbrace", "overbracket", "overbrackettext", "overbracketunderbracket", "overlaybutton", "overlaycolor", "overlaydepth", "overlayfigure", "overlayheight", "overlaylinecolor", "overlaylinewidth", "overlayoffset", "overlayrollbutton", "overlaywidth", "overleftarrow", "overleftharpoondown", "overleftharpoonup", "overleftrightarrow", "overloaderror", "overparent", "overparenttext", "overparentunderparent", "overrightarrow", "overrightharpoondown", "overrightharpoonup", "overset", "overstrike", "overstrikes", "overtwoheadleftarrow", "overtwoheadrightarrow", "pagearea", "pagebreak", "pagefigure", "pagegridspanwidth", "pageinjection", "pagestaterealpage", "pagina", "paletsize", "pdfTeX", "pdfactualtext", "pdfbackendactualtext", "pdfbackendcurrentresources", "pdfbackendsetcatalog", "pdfbackendsetcolorspace", "pdfbackendsetextgstate", "pdfbackendsetinfo", "pdfbackendsetname", "pdfbackendsetpageattribute", "pdfbackendsetpageresource", "pdfbackendsetpagesattribute", "pdfbackendsetpattern", "pdfbackendsetshade", "pdfcolor", "pdfeTeX", "ped", "pedap", "percent", "percentdimen", "perlungo", "permitcaretescape", "permitcircumflexescape", "permitspacesbetweengroups", "persiandecimals", "persiannumerals", "phantom", "phantombox", "pickupgroupedcommand", "placeattachments", "placebtxrendering", "placecitation", "placecomments", "placecurrentformulanumber", "placedbox", "placefloat", "placefloatwithsetups", "placeframed", "placehelp", "placeinitial", "placelayer", "placelayeredtext", "placelistofpublications", "placelistofsorts", "placelistofsynonyms", "placelocalnotes", "placement", "placenamedfloat", "placenamedformula", "placenotes", "placepairedbox", "placeparallel", "placerawlist", "placerenderingwindow", "popattribute", "popmacro", "popmode", "popsystemmode", "positionoverlay", "positionregionoverlay", "posizionanumerotesta", "posizionatestotesta", "posizione", "postponenotes", "predefinedfont", "predefinefont", "predefinesymbol", "prefixedpagenumber", "prendibuffer", "prendimarcatura", "prependetoks", "prependgvalue", "prependtocommalist", "prependtoks", "prependtoksonce", "prependvalue", "presetdocument", "presetfieldsymbols", "pretocommalist", "prevcounter", "prevcountervalue", "preventmode", "prevrealpage", "prevrealpagenumber", "prevsubcountervalue", "prevsubpage", "prevsubpagenumber", "prevuserpage", "prevuserpagenumber", "procent", "processMPbuffer", "processMPfigurefile", "processaction", "processallactionsinset", "processassignlist", "processassignmentcommand", "processassignmentlist", "processbetween", "processbodyfontenvironmentlist", "processcolorcomponents", "processcommacommand", "processcommalist", "processcommalistwithparameters", "processcontent", "processfile", "processfilemany", "processfilenone", "processfileonce", "processfirstactioninset", "processisolatedchars", "processisolatedwords", "processlinetablebuffer", "processlinetablefile", "processlist", "processmonth", "processranges", "processseparatedlist", "processtexbuffer", "processtokens", "processuntil", "processxtablebuffer", "processyear", "prodotto", "profiledbox", "profilegivenbox", "progetto", "programma", "pseudoMixedCapped", "pseudoSmallCapped", "pseudoSmallcapped", "pseudosmallcapped", "pulsante", "pulsantemenu", "pulsantinterazione", "punti", "purenumber", "pushattribute", "pushbutton", "pushmacro", "pushmode", "pushoutputstream", "pushsystemmode", "qquad", "quad", "quads", "qualcheriga", "quitcommalist", "quitprevcommalist", "quittypescriptscanning", "raisebox", "randomizetext", "randomnumber", "rawcounter", "rawcountervalue", "rawdate", "rawdoifelseinset", "rawdoifinset", "rawdoifinsetelse", "rawgetparameters", "rawprocessaction", "rawprocesscommacommand", "rawprocesscommalist", "rawstructurelistuservariable", "rawsubcountervalue", "rbox", "readfile", "readfixfile", "readjobfile", "readlocfile", "readsetfile", "readsysfile", "readtexfile", "readxmlfile", "realSmallCapped", "realSmallcapped", "realpagenumber", "realsmallcapped", "recursedepth", "recurselevel", "recursestring", "redoconvertfont", "referenceprefix", "referring", "registerattachment", "registerctxluafile", "registerexternalfigure", "registerfontclass", "registerhyphenationexception", "registerhyphenationpattern", "registermenubuttons", "registersort", "registersynonym", "registerunit", "regular", "reimpostamarcatura", "relatemarking", "relateparameterhandlers", "relaxvalueifundefined", "remainingcharacters", "removebottomthings", "removedepth", "removefromcommalist", "removelastskip", "removelastspace", "removemarkedcontent", "removepunctuation", "removesubstring", "removetoks", "removeunwantedspaces", "replacefeature", "replaceincommalist", "replaceword", "rescan", "rescanwithsetup", "resetMPdrawing", "resetMPenvironment", "resetMPinstance", "resetallattributes", "resetandaddfeature", "resetbar", "resetbreakpoints", "resetbuffer", "resetcharacteralign", "resetcharacterkerning", "resetcharacterspacing", "resetcharacterstripping", "resetcollector", "resetcounter", "resetdigitsmanipulation", "resetdirection", "resetfeature", "resetflag", "resetfontcolorsheme", "resetfontfallback", "resetfontsolution", "resethyphenationfeatures", "resetinjector", "resetinteractionmenu", "resetitaliccorrection", "resetlayer", "resetlocalfloats", "resetmarker", "resetmode", "resetpagenumber", "resetparallel", "resetpath", "resetpenalties", "resetprofile", "resetreference", "resetreplacement", "resetscript", "resetsetups", "resetshownsynonyms", "resetsubpagenumber", "resetsymbolset", "resetsystemmode", "resettimer", "resettrackers", "resettrialtypesetting", "resetusedsortings", "resetusedsynonyms", "resetuserpagenumber", "resetvalue", "resetvisualizers", "reshapebox", "resolvedglyphdirect", "resolvedglyphstyled", "restartcounter", "restorebox", "restorecatcodes", "restorecounter", "restorecurrentattributes", "restoreendofline", "restoreglobalbodyfont", "reusableMPgraphic", "reuseMPgraphic", "reuserandomseed", "revivefeature", "rfence", "rhbox", "rif", "riferimento", "riferimentopagina", "riferimentotesto", "riflessione", "rigariempimento", "right", "rightbottombox", "rightbox", "righthbox", "rightorleftpageaction", "rightskipadaption", "rightsubguillemot", "righttolefthbox", "righttoleftvbox", "righttoleftvtop", "righttopbox", "rigovuoto", "rlap", "robustaddtocommalist", "robustdoifelseinset", "robustdoifinsetelse", "robustpretocommalist", "rollbutton", "roman", "rtop", "ruledhbox", "ruledhpack", "ruledmbox", "ruledtopv", "ruledtpack", "ruledvbox", "ruledvpack", "ruledvtop", "runMPbuffer", "runninghbox", "ruota", "safechar", "sans", "sansbold", "sansnormal", "sansserif", "savebox", "savebtxdataset", "savebuffer", "savecounter", "savecurrentattributes", "savenormalmeaning", "savetaggedtwopassdata", "savetwopassdata", "sbox", "scala", "schermo", "scrividentroelenco", "scriviinelenco", "sd", "secondoffivearguments", "secondoffourarguments", "secondofsixarguments", "secondofthreearguments", "secondofthreeunexpanded", "secondoftwoarguments", "secondoftwounexpanded", "segnalibro", "select", "selezionablocchi", "serializecommalist", "serializedcommalist", "serif", "serifbold", "serifnormal", "setJSpreamble", "setMPlayer", "setMPpositiongraphic", "setMPpositiongraphicrange", "setMPtext", "setMPvariable", "setMPvariables", "setbar", "setbigbodyfont", "setboxllx", "setboxlly", "setbreakpoints", "setcapstrut", "setcatcodetable", "setcharacteralign", "setcharactercasing", "setcharactercleaning", "setcharacterkerning", "setcharacterspacing", "setcharacterstripping", "setcharstrut", "setcollector", "setcolormodell", "setcounter", "setcounterown", "setcurrentfontclass", "setdataset", "setdefaultpenalties", "setdigitsmanipulation", "setdirection", "setdocumentargument", "setdocumentargumentdefault", "setdocumentfilename", "setdummyparameter", "setelementexporttag", "setemeasure", "setevalue", "setevariable", "setevariables", "setfirstline", "setflag", "setfont", "setfontcolorsheme", "setfontfeature", "setfontsolution", "setfontstrut", "setfractions", "setgmeasure", "setgvalue", "setgvariable", "setgvariables", "sethboxregister", "sethyphenatedurlafter", "sethyphenatedurlbefore", "sethyphenatedurlnormal", "sethyphenationfeatures", "setinitial", "setinjector", "setinteraction", "setinterfacecommand", "setinterfaceconstant", "setinterfaceelements", "setinterfacemessage", "setinterfacevariable", "setinternalrendering", "setitaliccorrection", "setlayer", "setlayerframed", "setlayertext", "setlinefiller", "setlocalhsize", "setmainbodyfont", "setmainparbuilder", "setmarker", "setmarking", "setmathstyle", "setmeasure", "setmessagetext", "setmode", "setnostrut", "setnote", "setnotetext", "setobject", "setoldstyle", "setpagegrid", "setpagereference", "setpagestate", "setpagestaterealpageno", "setpenalties", "setpercentdimen", "setposition", "setpositionbox", "setpositiondata", "setpositiondataplus", "setpositiononly", "setpositionplus", "setpositionstrut", "setprofile", "setrandomseed", "setreference", "setreferencedobject", "setregisterentry", "setreplacement", "setrigidcolumnbalance", "setrigidcolumnhsize", "setscript", "setsectionblock", "setsimplecolumnhsize", "setsmallbodyfont", "setsmallcaps", "setstackbox", "setstructurepageregister", "setstrut", "setsuperiors", "setsystemmode", "settabular", "settaggedmetadata", "settext", "settightobject", "settightreferencedobject", "settightunreferencedobject", "settrialtypesetting", "setuevalue", "setugvalue", "setunreferencedobject", "setup", "setupMPgraphics", "setupMPinstance", "setupMPpage", "setupMPvariables", "setupTABLE", "setupTEXpage", "setupattachment", "setupbackend", "setupbar", "setupbleeding", "setupbookmark", "setupbtx", "setupbtxdataset", "setupbtxlist", "setupbtxregister", "setupbtxrendering", "setupbutton", "setupcharacterkerning", "setupcharacterspacing", "setupchemical", "setupchemicalframed", "setupcollector", "setupcolumnspan", "setupcombination", "setupcounter", "setupdataset", "setupdelimitedtext", "setupdescription", "setupdirections", "setupdocument", "setupeffect", "setupenumeration", "setupenv", "setupexport", "setupexternalfigure", "setupexternalsoundtracks", "setupfieldbody", "setupfieldcategory", "setupfieldcontentframed", "setupfieldlabelframed", "setupfieldtotalframed", "setupfiller", "setupfirstline", "setupfittingpage", "setupfloatcaption", "setupfontexpansion", "setupfontprotrusion", "setupfonts", "setupfontsolution", "setupformula", "setupformulaframed", "setupframedcontent", "setupframedtext", "setupglobalreferenceprefix", "setupheadalternative", "setuphelp", "setuphigh", "setuphighlight", "setuphyphenation", "setupindentedtext", "setupinitial", "setupinsertion", "setupitaliccorrection", "setupitemgroup", "setuplabel", "setuplayer", "setuplayeredtext", "setuplayouttext", "setuplinefiller", "setuplinefillers", "setuplinenote", "setuplinetable", "setuplistalternative", "setuplistextra", "setuplocalfloats", "setuplocalinterlinespace", "setuplow", "setuplowhigh", "setuplowmidhigh", "setupmarginblock", "setupmargindata", "setupmarginframed", "setupmarginrule", "setupmathalignment", "setupmathcases", "setupmathematics", "setupmathfence", "setupmathfraction", "setupmathframed", "setupmathmatrix", "setupmathornament", "setupmathradical", "setupmathstackers", "setupmathstyle", "setupmixedcolumns", "setupmodule", "setupnotation", "setupnotations", "setupnote", "setupnotes", "setupoffset", "setupoffsetbox", "setupoutputroutine", "setuppagechecker", "setuppagegrid", "setuppagegridarea", "setuppagegridareatext", "setuppagegridlines", "setuppagegridspan", "setuppagegridstart", "setuppageinjection", "setuppageinjectionalternative", "setuppageshift", "setuppagestate", "setuppairedbox", "setuppaper", "setupparagraph", "setupparagraphintro", "setupparallel", "setupperiods", "setupplacement", "setuppositionbar", "setupprocessor", "setupprofile", "setupquotation", "setuprealpagenumber", "setupreferenceformat", "setupreferenceprefix", "setupreferencestructureprefix", "setupregisters", "setuprenderingwindow", "setups", "setupscale", "setupscript", "setupscripts", "setupselector", "setupshift", "setupsidebar", "setupspellchecking", "setupstretched", "setupstruts", "setupstyle", "setupsubformula", "setuptabulation", "setuptagging", "setuptextbackground", "setuptextflow", "setuptooltip", "setupunit", "setupuserpagenumber", "setupversion", "setupviewerlayer", "setupvspacing", "setupwithargument", "setupwithargumentswapped", "setupxml", "setupxtable", "setuvalue", "setuxvalue", "setvalue", "setvariable", "setvariables", "setvboxregister", "setvisualizerfont", "setvtopregister", "setwidthof", "setxmeasure", "setxvalue", "setxvariable", "setxvariables", "sfondo", "sfrac", "shapedhbox", "showallmakeup", "showattributes", "showboxes", "showbtxdatasetauthors", "showbtxdatasetcompleteness", "showbtxdatasetfields", "showbtxfields", "showbtxhashedauthors", "showbtxtables", "showchardata", "showcharratio", "showcolorbar", "showcolorcomponents", "showcolorset", "showcolorstruts", "showcounter", "showdirectives", "showdirsinmargin", "showedebuginfo", "showexperiments", "showfont", "showfontdata", "showfontkerns", "showfontparameters", "showfontstrip", "showfontstyle", "showglyphs", "showgridsnapping", "showhelp", "showhyphenationtrace", "showhyphens", "showinjector", "showjustification", "showkerning", "showlayoutcomponents", "showligature", "showligatures", "showlogcategories", "showmargins", "showmessage", "showminimalbaseline", "shownextbox", "showotfcomposition", "showparentchain", "showsetupsdefinition", "showtimer", "showtokens", "showtrackers", "showvalue", "showvariable", "showwarning", "simbolo", "simplegroupedcommand", "singalcharacteralign", "singlebond", "sixthofsixarguments", "slanted", "slantedbold", "slicepages", "slovenianNumerals", "sloveniannumerals", "small", "smallbodyfont", "smallbold", "smallbolditalic", "smallboldslanted", "smallcappedcharacters", "smallcappedromannumerals", "smaller", "smallitalicbold", "smallnormal", "smallskip", "smallslanted", "smallslantedbold", "smalltype", "smash", "smashbox", "smashboxed", "smashedhbox", "smashedvbox", "snaptogrid", "someheadnumber", "somekindoftab", "somelocalfloat", "somenamedheadnumber", "someplace", "sottoargomento", "sottocapoverso", "sottosottoargomento", "sottosottocapoverso", "sottosottosottoargomento", "sottosottosottocapoverso", "sottosottosottosottoargomento", "sottosottosottosottocapoverso", "sp", "spanishNumerals", "spanishnumerals", "spazifissi", "spazio", "spaziofisso", "speech", "spessoreriga", "spezzaoggettomobile", "splitatasterisk", "splitatcolon", "splitatcolons", "splitatcomma", "splitdfrac", "splitfilename", "splitfrac", "splitoffbase", "splitofffull", "splitoffkind", "splitoffname", "splitoffpath", "splitoffroot", "splitofftokens", "splitofftype", "splitstring", "spreadhbox", "sqrt", "stackcampi", "stackrel", "startregister", "startstructurepageregister", "stirato", "stopregister", "stopstructurepageregister", "strictdoifelsenextoptional", "strictdoifnextoptionalelse", "stripcharacter", "strippedcsname", "stripspaces", "structurelistuservariable", "structurenumber", "structuretitle", "structureuservariable", "structurevariable", "strut", "strutdp", "strutht", "struthtdp", "struttedbox", "strutwd", "style", "styleinstance", "subpagenumber", "subsentence", "substituteincommalist", "subtractfeature", "swapcounts", "swapdimens", "swapface", "swapmacros", "swaptypeface", "switchstyleonly", "switchtocolor", "switchtointerlinespace", "symbolreference", "synchronizeblank", "synchronizeindenting", "synchronizemarking", "synchronizeoutputstreams", "synchronizestrut", "synchronizewhitespace", "systemlog", "systemlogfirst", "systemloglast", "systemsetups", "tLeftarrow", "tLeftrightarrow", "tRightarrow", "tabella", "tabulateautoline", "tabulateautorule", "tabulateline", "tabulaterule", "taggedctxcommand", "taggedlabeltexts", "tbinom", "tbox", "tequal", "terminaJScode", "terminaJSpreamble", "terminaMPclip", "terminaMPcode", "terminaMPdefinitions", "terminaMPdrawing", "terminaMPenvironment", "terminaMPextensions", "terminaMPinclusions", "terminaMPinitializations", "terminaMPpage", "terminaMPpositiongraphic", "terminaMPpositionmethod", "terminaMPrun", "terminaTABLE", "terminaTABLEbody", "terminaTABLEfoot", "terminaTABLEhead", "terminaTABLEnext", "terminaTC", "terminaTD", "terminaTDs", "terminaTEXpage", "terminaTH", "terminaTN", "terminaTR", "terminaTRs", "terminaTX", "terminaTY", "terminaallmodes", "terminaambiente", "terminaargomento", "terminaarrangedpages", "terminaaside", "terminaattachment", "terminabar", "terminabinom", "terminabitmapimage", "terminablockquote", "terminabtxrenderingdefinitions", "terminabuffer", "terminabutton", "terminacapitolo", "terminacapoverso", "terminacatcodetable", "terminacharacteralign", "terminacheckedfences", "terminachemical", "terminacitazione", "terminacollect", "terminacollecting", "terminacolore", "terminacolorintent", "terminacoloronly", "terminacolorset", "terminacolumns", "terminacolumnspan", "terminacombination", "terminacomment", "terminacommento", "terminacomponenet", "terminacontextcode", "terminacontextdefinitioncode", "terminactxfunction", "terminactxfunctiondefinition", "terminacurrentcolor", "terminacurrentlistentrywrapper", "terminadbinom", "terminadelimited", "terminadelimitedtext", "terminadfrac", "terminadisplaymath", "terminadmath", "terminadocument", "terminaeffect", "terminaelement", "terminaelemento", "terminaelenco", "terminaembeddedxtable", "terminaendofline", "terminaexceptions", "terminaexpanded", "terminaexpandedcollect", "terminaextendedcatcodetable", "terminaexternalfigurecollection", "terminafigura", "terminafigure", "terminafitfieldframed", "terminafittingpage", "terminafloatcombination", "terminafont", "terminafontclass", "terminafontsolution", "terminaformula", "terminaformulas", "terminafrac", "terminaframedcontent", "terminaframedtext", "terminagrafico", "terminagridsnapping", "terminahbox", "terminahboxestohbox", "terminahboxregister", "terminahelptext", "terminahiddenbar", "terminahiding", "terminahighlight", "terminahyphenation", "terminaimath", "terminaimpaccato", "terminaincorniciato", "terminaindentation", "terminaindentedtext", "terminainmframed", "terminainteraction", "terminainterface", "terminaintermezzo", "terminaintertext", "terminaitemgroup", "terminaknockout", "terminalayout", "terminalineamargine", "terminalineatesto", "terminalinecorrection", "terminalinefiller", "terminalinenumbering", "terminalinetable", "terminalinetablebody", "terminalinetablecell", "terminalinetablehead", "terminalocalfootnotes", "terminalocalheadsetup", "terminalocallinecorrection", "terminalocalnotes", "terminalocalsetups", "terminalua", "terminaluacode", "terminaluaparameterset", "terminaluasetups", "terminamakeup", "terminamarginblock", "terminamarkedcontent", "terminamathmode", "terminamathstyle", "terminamatrices", "terminamcframed", "terminamdformula", "terminamenuinterattivo", "terminamenzione", "terminamettiformula", "terminamframed", "terminamixedcolumns", "terminamode", "terminamodeset", "terminamodule", "terminamoduletestsection", "terminampformula", "terminanamedsection", "terminanamedsubformulas", "terminanarrow", "terminanarrower", "terminanegative", "terminanicelyfilledbox", "terminanobar", "terminanointerference", "terminanotallmodes", "terminanotext", "terminanotmode", "terminaopposite", "terminaoutputstream", "terminaoverlay", "terminaoverprint", "terminapagecomment", "terminapagefigure", "terminapagegrid", "terminapagegridspan", "terminapagelayout", "terminapar", "terminaparagraph", "terminaparagraphs", "terminaparagraphscell", "terminaparbuilder", "terminapath", "terminaplacepairedbox", "terminapositioning", "terminapositionoverlay", "terminapositive", "terminapostponing", "terminaprocessassignmentcommand", "terminaprocessassignmentlist", "terminaprocesscommacommand", "terminaprocesscommalist", "terminaprodotto", "terminaprogetto", "terminaprotect", "terminaprotectedcolors", "terminapubblicazione", "terminapunctuation", "terminarandomized", "terminarandomseed", "terminarawsetups", "terminareadingfile", "terminareferenceprefix", "terminaregime", "terminareusableMPgraphic", "terminariga", "terminasbarrati", "terminasbarrato", "terminascript", "terminasdformula", "terminasectionblock", "terminasectionblockenvironment", "terminasectionlevel", "terminasetups", "terminasfondo", "terminasfrac", "terminashapebox", "terminashift", "terminasidebar", "terminasimplecolumns", "terminasopralinea", "terminasopralinee", "terminasottoargomento", "terminasottocapoverso", "terminasottolinea", "terminasottolinee", "terminasottosottoargomento", "terminasottosottocapoverso", "terminasottosottosottoargomento", "terminasottosottosottocapoverso", "terminasottosottosottosottoargomento", "terminasottosottosottosottocapoverso", "terminaspecialitem", "terminaspeech", "terminaspformula", "terminaspread", "terminastartstop", "terminastaticMPfigure", "terminastaticMPgraphic", "terminastrictinspectnextcharacter", "terminastrut", "terminastyle", "terminasubformulas", "terminasubjectlevel", "terminasubsentence", "terminasubstack", "terminasymbolset", "terminatabella", "terminatable", "terminatablehead", "terminatables", "terminatabletail", "terminatabulate", "terminatabulatehead", "terminatabulatetail", "terminatagged", "terminatbinom", "terminatesta", "terminatestoaiuto", "terminatestoincorniciato", "terminatexcode", "terminatexdefinition", "terminatext", "terminatextbackground", "terminatextbackgroundmanual", "terminatextcolor", "terminatextcolorintent", "terminatextflow", "terminatitolo", "terminatokens", "terminatransparent", "terminatypescript", "terminatypescriptcollection", "terminaunderdash", "terminaunderdashes", "terminaunderdot", "terminaunderdots", "terminaunderrandom", "terminaunderrandoms", "terminaunderstrike", "terminaunderstrikes", "terminaunframed", "terminauniqueMPgraphic", "terminauniqueMPpagegraphic", "terminaunpacked", "terminausableMPgraphic", "terminauseMPgraphic", "terminausemathstyleparameter", "terminausingbtxspecification", "terminavaia", "terminavbox", "terminavboxregister", "terminavboxtohbox", "terminavboxtohboxseparator", "terminaviewerlayer", "terminavtop", "terminavtopregister", "terminaxcell", "terminaxcellgroup", "terminaxfrac", "terminaxgroup", "terminaxmldisplayverbatim", "terminaxmlinlineverbatim", "terminaxmlraw", "terminaxmlsetups", "terminaxrow", "terminaxrowgroup", "terminaxtable", "terminaxtablebody", "terminaxtablefoot", "terminaxtablehead", "terminaxtablenext", "terminaxxfrac", "testandsplitstring", "testcolumn", "testfeature", "testfeatureonce", "testoaiuto", "testoincorniciato", "testonotapdp", "testoriempimento", "testpage", "testpageonly", "testpagesync", "testtokens", "tex", "texdefinition", "texsetup", "textcitation", "textcite", "textcontrolspace", "textflowcollector", "textmath", "textminus", "textormathchar", "textplus", "textvisiblespace", "tfrac", "thainumerals", "thefirstcharacter", "thenormalizedbodyfontsize", "theremainingcharacters", "thickspace", "thinspace", "thirdoffivearguments", "thirdoffourarguments", "thirdofsixarguments", "thirdofthreearguments", "thirdofthreeunexpanded", "thookleftarrow", "thookrightarrow", "threedigitrounding", "tibetannumerals", "tieniblocchi", "tightlayer", "tinyfont", "titolo", "tlap", "tleftarrow", "tleftharpoondown", "tleftharpoonup", "tleftrightarrow", "tleftrightharpoons", "tmapsto", "tochar", "tolinenote", "topbox", "topleftbox", "toplinebox", "toprightbox", "topskippedbox", "tracecatcodetables", "tracedfontname", "traceoutputroutines", "tracepositions", "traduci", "transparencycomponents", "transparent", "trel", "trightarrow", "trightharpoondown", "trightharpoonup", "trightleftharpoons", "trightoverleftarrow", "triplebond", "truefilename", "truefontname", "ttriplerel", "ttwoheadleftarrow", "ttwoheadrightarrow", "twodigitrounding", "tx", "txx", "typ", "type", "typebuffer", "typedefinedbuffer", "typeface", "typefile", "typescriptone", "typescriptprefix", "typescriptthree", "typescripttwo", "typesetbuffer", "typesetfile", "uconvertnumber", "uedcatcodecommand", "undefinevalue", "undepthed", "underbar", "underbars", "underbartext", "underbrace", "underbracetext", "underbracket", "underbrackettext", "underdash", "underdashes", "underdot", "underdots", "underleftarrow", "underleftharpoondown", "underleftharpoonup", "underleftrightarrow", "underparent", "underparenttext", "underrandom", "underrandoms", "underrightarrow", "underrightharpoondown", "underrightharpoonup", "underset", "understrike", "understrikes", "undertwoheadleftarrow", "undertwoheadrightarrow", "undoassign", "unframed", "unhhbox", "unihex", "uniqueMPgraphic", "uniqueMPpagegraphic", "unprotected", "unregisterhyphenationpattern", "unspaceafter", "unspaceargument", "unspaced", "unspacestring", "untexargument", "untexcommand", "uppercased", "uppercasestring", "upperleftdoubleninequote", "upperleftdoublesixquote", "upperleftsingleninequote", "upperleftsinglesixquote", "upperrightdoubleninequote", "upperrightdoublesixquote", "upperrightsingleninequote", "upperrightsinglesixquote", "url", "usaJSscripts", "usaURL", "usablocco", "usacartella", "usacolonnasonoraesterna", "usadocumentoesterno", "usafiguraesterna", "usamodulo", "usasimboli", "usaurl", "useMPenvironmentbuffer", "useMPgraphic", "useMPlibrary", "useMPrun", "useMPvariables", "useblankparameter", "usebodyfont", "usebodyfontparameter", "usebtxdataset", "usebtxdefinitions", "usecolors", "usecomponent", "usedummycolorparameter", "usedummystyleandcolor", "usedummystyleparameter", "useenvironment", "useexternalrendering", "usefigurebase", "usefile", "usegridparameter", "useindentingparameter", "useindentnextparameter", "useinterlinespaceparameter", "uselanguageparameter", "useluamodule", "usemathstyleparameter", "useproduct", "useprofileparameter", "useproject", "usereferenceparameter", "userpagenumber", "usesetupsparameter", "usestaticMPfigure", "usesubpath", "usetexmodule", "usetypescript", "usetypescriptfile", "usezipfile", "utfchar", "utflower", "utfupper", "utilityregisterlength", "vaia", "vaiabox", "vaiapagina", "vaigiu", "valorecolore", "vboxreference", "verbatim", "verbatimstring", "verbosenumber", "versione", "verticalgrowingbar", "verticalpositionbar", "vglue", "viewerlayer", "vl", "vphantom", "vpos", "vsmash", "vsmashbox", "vsmashed", "vspace", "vspacing", "wdofstring", "widthofstring", "widthspanningtext", "withoutpt", "word", "words", "wordtonumber", "writedatatolist", "writestatus", "xLeftarrow", "xLeftrightarrow", "xRightarrow", "xdefconvertedargument", "xequal", "xfrac", "xhookleftarrow", "xhookrightarrow", "xleftarrow", "xleftharpoondown", "xleftharpoonup", "xleftrightarrow", "xleftrightharpoons", "xmapsto", "xmladdindex", "xmlafterdocumentsetup", "xmlaftersetup", "xmlall", "xmlappenddocumentsetup", "xmlappendsetup", "xmlapplyselectors", "xmlatt", "xmlattdef", "xmlattribute", "xmlattributedef", "xmlbadinclusions", "xmlbeforedocumentsetup", "xmlbeforesetup", "xmlchainatt", "xmlchainattdef", "xmlchecknamespace", "xmlcommand", "xmlconcat", "xmlconcatrange", "xmlcontext", "xmlcount", "xmldefaulttotext", "xmldirectives", "xmldirectivesafter", "xmldirectivesbefore", "xmldisplayverbatim", "xmldoif", "xmldoifelse", "xmldoifelseempty", "xmldoifelseselfempty", "xmldoifelsetext", "xmldoifelsevalue", "xmldoifnot", "xmldoifnotselfempty", "xmldoifnottext", "xmldoifselfempty", "xmldoiftext", "xmlelement", "xmlfilter", "xmlfirst", "xmlflush", "xmlflushcontext", "xmlflushdocumentsetups", "xmlflushlinewise", "xmlflushpure", "xmlflushspacewise", "xmlflushtext", "xmlinclude", "xmlinclusion", "xmlinclusions", "xmlinfo", "xmlinjector", "xmlinlineverbatim", "xmlinstalldirective", "xmllast", "xmllastatt", "xmllastmatch", "xmlloadbuffer", "xmlloaddata", "xmlloaddirectives", "xmlloadfile", "xmlloadonly", "xmlmain", "xmlmapvalue", "xmlname", "xmlnamespace", "xmlnonspace", "xmlpath", "xmlpos", "xmlposition", "xmlprependdocumentsetup", "xmlprependsetup", "xmlprettyprint", "xmlprocessbuffer", "xmlprocessdata", "xmlprocessfile", "xmlpure", "xmlraw", "xmlrefatt", "xmlregistereddocumentsetups", "xmlregisteredsetups", "xmlregisterns", "xmlremapname", "xmlremapnamespace", "xmlremovedocumentsetup", "xmlremovesetup", "xmlresetdocumentsetups", "xmlresetinjectors", "xmlresetsetups", "xmlsave", "xmlsetentity", "xmlsetfunction", "xmlsetinjectors", "xmlsetsetup", "xmlsetup", "xmlshow", "xmlsnippet", "xmlstrip", "xmlstripnolines", "xmlstripped", "xmlstrippednolines", "xmltag", "xmltexentity", "xmltext", "xmltobuffer", "xmltobufferverbose", "xmltofile", "xmlvalue", "xmlverbatim", "xrel", "xrightarrow", "xrightharpoondown", "xrightharpoonup", "xrightleftharpoons", "xrightoverleftarrow", "xsplitstring", "xtriplerel", "xtwoheadleftarrow", "xtwoheadrightarrow", "xxfrac", "xypos" }, - ["nl"]={ "AMSTEX", "AfterPar", "Alphabeticnumerals", "AmSTeX", "And", "BeforePar", "Big", "Bigg", "Biggl", "Biggm", "Biggr", "Bigl", "Bigm", "Bigr", "CONTEXT", "Caps", "Cijfers", "ConTeXt", "Context", "ConvertConstantAfter", "ConvertToConstant", "ETEX", "EveryLine", "EveryPar", "GetPar", "GotoPar", "Greeknumerals", "INRSTEX", "Kap", "LAMSTEX", "LATEX", "LUAJITTEX", "LUATEX", "LaTeX", "LamSTeX", "Letter", "Letters", "Lua", "LuaTeX", "LuajitTeX", "MAAND", "METAFONT", "METAFUN", "METAPOST", "MKII", "MKIV", "MKIX", "MKVI", "MKXI", "MONTHLONG", "MONTHSHORT", "MPII", "MPIV", "MPVI", "MPanchor", "MPbetex", "MPc", "MPcode", "MPcolor", "MPcoloronly", "MPcolumn", "MPd", "MPdrawing", "MPfontsizehskip", "MPgetmultipars", "MPgetmultishape", "MPgetposboxes", "MPh", "MPinclusions", "MPleftskip", "MPll", "MPlr", "MPls", "MPmenubuttons", "MPn", "MPoptions", "MPoverlayanchor", "MPp", "MPpage", "MPpardata", "MPplus", "MPpos", "MPpositiongraphic", "MPposset", "MPr", "MPrawvar", "MPregion", "MPrest", "MPrightskip", "MPrs", "MPstring", "MPtext", "MPtransparency", "MPul", "MPur", "MPv", "MPvar", "MPvariable", "MPvv", "MPw", "MPwhd", "MPx", "MPxy", "MPxywhd", "MPy", "MetaFont", "MetaFun", "MetaPost", "NormalizeFontHeight", "NormalizeFontWidth", "NormalizeTextHeight", "NormalizeTextWidth", "PDFETEX", "PDFTEX", "PDFcolor", "PICTEX", "PPCHTEX", "PPCHTeX", "PRAGMA", "PiCTeX", "PointsToBigPoints", "PointsToReal", "PointsToWholeBigPoints", "PtToCm", "ReadFile", "Romeins", "ScaledPointsToBigPoints", "ScaledPointsToWholeBigPoints", "Smallcapped", "TABLE", "TEX", "TEXpage", "TaBlE", "TeX", "TheNormalizedFontSize", "TransparencyHack", "VerboseNumber", "WEEKDAG", "WOORD", "WOORDEN", "WidthSpanningText", "Woord", "Woorden", "XETEX", "XeTeX", "aanhangsel", "abjadnaivenumerals", "abjadnodotnumerals", "abjadnumerals", "about", "achtergrond", "activatespacehandler", "adaptcollector", "adaptfontfeature", "adaptpapersize", "addfeature", "addtoJSpreamble", "addtocommalist", "addvalue", "aftersplitstring", "aftertestandsplitstring", "alignmentcharacter", "allinputpaths", "alphabeticnumerals", "alwayscitation", "alwayscite", "ampersand", "anchor", "appendetoks", "appendgvalue", "appendtocommalist", "appendtoks", "appendtoksonce", "appendvalue", "apply", "applyalternativestyle", "applyprocessor", "applytocharacters", "applytofirstcharacter", "applytosplitstringchar", "applytosplitstringcharspaced", "applytosplitstringline", "applytosplitstringlinespaced", "applytosplitstringword", "applytosplitstringwordspaced", "applytowords", "arabicdecimals", "arabicexnumerals", "arabicnumerals", "arg", "asciistr", "aside", "assignalfadimension", "assigndimen", "assigndimension", "assignifempty", "assigntranslation", "assignvalue", "assignwidth", "assumelongusagecs", "astype", "attachment", "autocap", "autodirhbox", "autodirvbox", "autodirvtop", "autoinsertnextspace", "automathematics", "autosetups", "availablehsize", "averagecharwidth", "backgroundimage", "backgroundimagefill", "backgroundline", "basegrid", "baselineleftbox", "baselinemiddlebox", "baselinerightbox", "bbox", "beforesplitstring", "beforetestandsplitstring", "bepaalkopnummer", "bepaallijstkenmerken", "bepaalregisterkenmerken", "bewaarbuffer", "big", "bigbodyfont", "bigg", "bigger", "biggl", "biggm", "biggr", "bigl", "bigm", "bigr", "bigskip", "binom", "bitmapimage", "blanko", "blap", "bleed", "bleedheight", "bleedwidth", "blockligatures", "blockquote", "blokcitaat", "blokje", "blokjes", "bodyfontenvironmentlist", "bodyfontsize", "bold", "boldface", "bolditalic", "boldslanted", "bookmark", "booleanmodevalue", "bottombox", "bottomleftbox", "bottomrightbox", "boxcursor", "boxmarker", "boxofsize", "boxreference", "bpos", "bthiddencitation", "btxabbreviatedjournal", "btxaddjournal", "btxalwayscitation", "btxauthorfield", "btxdetail", "btxdirect", "btxdoif", "btxdoifcombiinlistelse", "btxdoifelse", "btxdoifelsecombiinlist", "btxdoifelsesameasprevious", "btxdoifelsesameaspreviouschecked", "btxdoifelseuservariable", "btxdoifnot", "btxdoifsameaspreviouscheckedelse", "btxdoifsameaspreviouselse", "btxdoifuservariableelse", "btxexpandedjournal", "btxfield", "btxfieldname", "btxfieldtype", "btxfirstofrange", "btxflush", "btxflushauthor", "btxflushauthorinverted", "btxflushauthorinvertedshort", "btxflushauthorname", "btxflushauthornormal", "btxflushauthornormalshort", "btxflushsuffix", "btxfoundname", "btxfoundtype", "btxhybridcite", "btxlistcitation", "btxloadjournalist", "btxoneorrange", "btxremapauthor", "btxsavejournalist", "btxsetup", "btxsingularorplural", "btxsingularplural", "btxtextcitation", "button", "calligraphic", "camel", "catcodetablename", "cbox", "centerbox", "centeredbox", "centerednextbox", "cfrac", "chardescription", "charwidthlanguage", "checkcharacteralign", "checkedchar", "checkedfiller", "checkedstrippedcsname", "checkinjector", "checknextindentation", "checknextinjector", "checkpage", "checkparameters", "checkpreviousinjector", "checksoundtrack", "checktwopassdata", "checkvariables", "chem", "chemical", "chemicalbottext", "chemicalmidtext", "chemicalsymbol", "chemicaltext", "chemicaltoptext", "chineseallnumerals", "chinesecapnumerals", "chinesenumerals", "cijfers", "citaat", "citation", "cite", "citeer", "clap", "classfont", "cldcommand", "cldcontext", "cldloadfile", "cldprocessfile", "cleftarrow", "clip", "collect", "collectedtext", "collectexpanded", "colorcomponents", "colored", "coloronly", "columnbreak", "combinepages", "commalistelement", "commalistsentence", "commalistsize", "comment", "commentaar", "comparedimension", "comparedimensioneps", "completebtxrendering", "completelist", "completelistofpublications", "completelistofsorts", "completelistofsynonyms", "complexorsimple", "complexorsimpleempty", "composedcollector", "composedlayer", "compresult", "constantdimen", "constantdimenargument", "constantemptyargument", "constantnumber", "constantnumberargument", "contentreference", "continuednumber", "continueifinputfile", "convertargument", "convertcommand", "convertedcounter", "converteddimen", "convertedsubcounter", "converteernummer", "convertmonth", "convertvalue", "convertvboxtohbox", "copieerveld", "copypages", "copyparameters", "copyposition", "corrigeerwitruimte", "countersubs", "counttoken", "counttokens", "cramped", "crampedclap", "crampedllap", "crampedrlap", "crightarrow", "crightoverleftarrow", "ctop", "ctxcommand", "ctxdirectcommand", "ctxdirectlua", "ctxfunction", "ctxlatecommand", "ctxlatelua", "ctxloadluafile", "ctxlua", "ctxluabuffer", "ctxluacode", "ctxreport", "ctxsprint", "currentassignmentlistkey", "currentassignmentlistvalue", "currentbtxuservariable", "currentcommalistitem", "currentcomponent", "currentenvironment", "currentfeaturetest", "currentinterface", "currentlanguage", "currentlistentrydestinationattribute", "currentlistentrylimitedtext", "currentlistentrynumber", "currentlistentrypagenumber", "currentlistentryreferenceattribute", "currentlistentrytitle", "currentlistentrytitlerendered", "currentlistsymbol", "currentmainlanguage", "currentmessagetext", "currentmoduleparameter", "currentoutputstream", "currentproduct", "currentproject", "currentregime", "currentregisterpageuserdata", "currentresponses", "currenttime", "currentvalue", "currentxtablecolumn", "currentxtablerow", "datasetvariable", "datum", "dayoftheweek", "dayspermonth", "dbinom", "decrement", "decrementcounter", "decrementedcounter", "decrementpagenumber", "decrementsubpagenumber", "decrementvalue", "defaultinterface", "defaultobjectpage", "defaultobjectreference", "defcatcodecommand", "defconvertedargument", "defconvertedcommand", "defconvertedvalue", "defineMPinstance", "defineTABLEsetup", "defineactivecharacter", "definealternativestyle", "defineanchor", "defineattachment", "defineattribute", "definebackground", "definebar", "definebodyfontswitch", "definebreakpoint", "definebreakpoints", "definebtx", "definebtxdataset", "definebtxregister", "definebtxrendering", "definebutton", "definecapitals", "definecharacterkerning", "definecharacterspacing", "definechemical", "definechemicals", "definechemicalsymbol", "definecollector", "definecomment", "definecomplexorsimple", "definecomplexorsimpleempty", "defineconversionset", "definecounter", "definedataset", "definedelimitedtext", "definedfont", "defineeffect", "defineexpandable", "defineexternalfigure", "definefallbackfamily", "definefieldbody", "definefieldbodyset", "definefieldcategory", "definefileconstant", "definefilefallback", "definefilesynonym", "definefiller", "definefirstline", "definefittingpage", "definefontalternative", "definefontfallback", "definefontfamily", "definefontfamilypreset", "definefontfeature", "definefontfile", "definefontsize", "definefontsolution", "defineformula", "defineformulaalternative", "defineformulaframed", "defineframedcontent", "definefrozenfont", "defineglobalcolor", "definegraphictypesynonym", "definegridsnapping", "defineheadalternative", "definehelp", "definehigh", "definehighlight", "definehspace", "definehypenationfeatures", "defineindenting", "defineinitial", "defineinsertion", "defineinteraction", "defineinteractionbar", "defineinterfaceconstant", "defineinterfaceelement", "defineinterfacevariable", "defineinterlinespace", "defineintermediatecolor", "defineitems", "definelabelclass", "definelayerpreset", "definelinefiller", "definelinenote", "definelinenumbering", "definelines", "definelistalternative", "definelistextra", "definelow", "definelowhigh", "definelowmidhigh", "definemarginblock", "definemargindata", "definemarker", "definemathcases", "definemathcommand", "definemathdoubleextensible", "definemathematics", "definemathextensible", "definemathfence", "definemathfraction", "definemathframed", "definemathmatrix", "definemathornament", "definemathoverextensible", "definemathovertextextensible", "definemathradical", "definemathstackers", "definemathstyle", "definemathtriplet", "definemathunderextensible", "definemathundertextextensible", "definemathunstacked", "definemeasure", "definemessageconstant", "definemixedcolumns", "definemode", "definemultitonecolor", "definenamedcolor", "definenamespace", "definenarrower", "definenote", "defineornament", "defineoutputroutine", "defineoutputroutinecommand", "definepage", "definepagechecker", "definepagegrid", "definepagegridarea", "definepagegridspan", "definepageinjection", "definepageinjectionalternative", "definepageshift", "definepagestate", "definepairedbox", "defineparagraph", "defineparallel", "defineparbuilder", "definepositioning", "defineprefixset", "defineprocesscolor", "defineprocessor", "definepushbutton", "definepushsymbol", "definerenderingwindow", "defineresetset", "definescale", "definescript", "definesectionlevels", "defineselector", "defineseparatorset", "defineshift", "definesidebar", "definesort", "definespotcolor", "definestyleinstance", "definesubformula", "definesynonym", "definesystemattribute", "definesystemconstant", "definesystemvariable", "definetabulation", "definetextflow", "definetooltip", "definetransparency", "definetwopasslist", "definetypeface", "definetypescriptprefix", "definetypescriptsynonym", "definetypesetting", "defineunit", "defineviewerlayer", "definevspace", "definevspacing", "definevspacingamount", "definextable", "definieer", "definieeralineas", "definieerblok", "definieerbuffer", "definieercombinatie", "definieerconversie", "definieerfiguursymbool", "definieerfont", "definieerfontstijl", "definieerfontsynoniem", "definieerhbox", "definieeringesprongentext", "definieerinteractiemenu", "definieeritemgroep", "definieerkadertekst", "definieerkleur", "definieerkleurgroep", "definieerkolomovergang", "definieerkop", "definieerkorps", "definieerkorpsomgeving", "definieerlayer", "definieerlayout", "definieerletter", "definieerlijst", "definieermarkering", "definieeromlijnd", "definieeropmaak", "definieeroverlay", "definieerpaginaovergang", "definieerpalet", "definieerpapierformaat", "definieerplaats", "definieerplaatsblok", "definieerprofiel", "definieerprogramma", "definieerreferentie", "definieerreferentieformaat", "definieerregister", "definieersamengesteldelijst", "definieersectie", "definieersectieblok", "definieersorteren", "definieerstartstop", "definieersubveld", "definieersymbool", "definieersynoniemen", "definieertabelvorm", "definieertabulatie", "definieertekst", "definieertekstachtergrond", "definieertype", "definieertypen", "definieerveld", "definieerveldstapel", "definieerwiskundeuitlijnen", "delimited", "delimitedtext", "depthofstring", "depthonlybox", "depthspanningtext", "determinenoflines", "devanagarinumerals", "dfrac", "digits", "dimensiontocount", "directcolor", "directcolored", "directconvertedcounter", "directdummyparameter", "directgetboxllx", "directgetboxlly", "directhighlight", "directlocalframed", "directluacode", "directselect", "directsetbar", "directsetup", "directsymbol", "directvspacing", "dis", "disabledirectives", "disableexperiments", "disablemode", "disableoutputstream", "disableparpositions", "disableregime", "disabletrackers", "displaymath", "displaymathematics", "displaymessage", "distributedhsize", "dividedsize", "doadaptleftskip", "doadaptrightskip", "doaddfeature", "doassign", "doassignempty", "doboundtext", "docheckassignment", "docheckedpagestate", "docheckedpair", "documentvariable", "dodoubleargument", "dodoubleargumentwithset", "dodoubleempty", "dodoubleemptywithset", "dodoublegroupempty", "doeassign", "doexpandedrecurse", "dogetattribute", "dogetattributeid", "dogetcommacommandelement", "dogobbledoubleempty", "dogobblesingleempty", "doif", "doifMPgraphicelse", "doifallcommon", "doifallcommonelse", "doifalldefinedelse", "doifallmodes", "doifallmodeselse", "doifassignmentelse", "doifblackelse", "doifbothsides", "doifbothsidesoverruled", "doifboxelse", "doifbufferelse", "doifcolor", "doifcolorelse", "doifcommandhandler", "doifcommandhandlerelse", "doifcommon", "doifcommonelse", "doifcontent", "doifconversiondefinedelse", "doifconversionnumberelse", "doifcounter", "doifcounterelse", "doifcurrentfonthasfeatureelse", "doifdefined", "doifdefinedcounter", "doifdefinedcounterelse", "doifdefinedelse", "doifdimensionelse", "doifdimenstringelse", "doifdocumentargument", "doifdocumentargumentelse", "doifdocumentfilename", "doifdocumentfilenameelse", "doifdrawingblackelse", "doifelse", "doifelseMPgraphic", "doifelseallcommon", "doifelsealldefined", "doifelseallmodes", "doifelseassignment", "doifelseblack", "doifelsebox", "doifelsebuffer", "doifelsecolor", "doifelsecommandhandler", "doifelsecommon", "doifelseconversiondefined", "doifelseconversionnumber", "doifelsecounter", "doifelsecurrentfonthasfeature", "doifelsecurrentsortingused", "doifelsecurrentsynonymshown", "doifelsecurrentsynonymused", "doifelsedefined", "doifelsedefinedcounter", "doifelsedimension", "doifelsedimenstring", "doifelsedocumentargument", "doifelsedocumentfilename", "doifelsedrawingblack", "doifelseempty", "doifelseemptyvalue", "doifelseemptyvariable", "doifelseenv", "doifelsefastoptionalcheck", "doifelsefastoptionalcheckcs", "doifelsefieldbody", "doifelsefieldcategory", "doifelsefigure", "doifelsefile", "doifelsefiledefined", "doifelsefileexists", "doifelsefirstchar", "doifelseflagged", "doifelsefontchar", "doifelsefontpresent", "doifelsefontsynonym", "doifelsehasspace", "doifelsehelp", "doifelseincsname", "doifelseinelement", "doifelseinputfile", "doifelseinsertion", "doifelseinset", "doifelseinstring", "doifelseinsymbolset", "doifelseintoks", "doifelseintwopassdata", "doifelseitalic", "doifelselanguage", "doifelselayerdata", "doifelselayoutdefined", "doifelselayoutsomeline", "doifelselayouttextline", "doifelseleapyear", "doifelselist", "doifelselocation", "doifelselocfile", "doifelsemainfloatbody", "doifelsemarking", "doifelsemeaning", "doifelsemessage", "doifelsemode", "doifelsenextbgroup", "doifelsenextbgroupcs", "doifelsenextchar", "doifelsenextoptional", "doifelsenextoptionalcs", "doifelsenextparenthesis", "doifelsenonzeropositive", "doifelsenoteonsamepage", "doifelsenothing", "doifelsenumber", "doifelseobjectfound", "doifelseobjectreferencefound", "doifelseoddpage", "doifelseoddpagefloat", "doifelseoldercontext", "doifelseolderversion", "doifelseoverlapping", "doifelseoverlay", "doifelseparallel", "doifelseparentfile", "doifelsepath", "doifelsepathexists", "doifelsepatterns", "doifelseposition", "doifelsepositionaction", "doifelsepositiononpage", "doifelsepositionsonsamepage", "doifelsepositionsonthispage", "doifelsepositionsused", "doifelsereferencefound", "doifelserightpagefloat", "doifelserighttoleftinbox", "doifelsesamelinereference", "doifelsesamestring", "doifelsesetups", "doifelsesomebackground", "doifelsesomespace", "doifelsesomething", "doifelsesometoks", "doifelsestringinstring", "doifelsestructurelisthasnumber", "doifelsestructurelisthaspage", "doifelsesymboldefined", "doifelsesymbolset", "doifelsetext", "doifelsetextflow", "doifelsetextflowcollector", "doifelsetypingfile", "doifelseundefined", "doifelseurldefined", "doifelsevalue", "doifelsevaluenothing", "doifelsevariable", "doifempty", "doifemptyelse", "doifemptytoks", "doifemptyvalue", "doifemptyvalueelse", "doifemptyvariable", "doifemptyvariableelse", "doifenv", "doifenvelse", "doiffastoptionalcheckcselse", "doiffastoptionalcheckelse", "doiffieldbodyelse", "doiffieldcategoryelse", "doiffigureelse", "doiffile", "doiffiledefinedelse", "doiffileelse", "doiffileexistselse", "doiffirstcharelse", "doifflaggedelse", "doiffontcharelse", "doiffontpresentelse", "doiffontsynonymelse", "doifhasspaceelse", "doifhelpelse", "doifincsnameelse", "doifinelementelse", "doifinputfileelse", "doifinsertionelse", "doifinset", "doifinsetelse", "doifinstring", "doifinstringelse", "doifinsymbolset", "doifinsymbolsetelse", "doifintokselse", "doifintwopassdataelse", "doifitalicelse", "doiflanguageelse", "doiflayerdataelse", "doiflayoutdefinedelse", "doiflayoutsomelineelse", "doiflayouttextlineelse", "doifleapyearelse", "doiflistelse", "doiflocationelse", "doiflocfileelse", "doifmainfloatbodyelse", "doifmarkingelse", "doifmeaningelse", "doifmessageelse", "doifmode", "doifmodeelse", "doifnextbgroupcselse", "doifnextbgroupelse", "doifnextcharelse", "doifnextoptionalcselse", "doifnextoptionalelse", "doifnextparenthesiselse", "doifnonzeropositiveelse", "doifnot", "doifnotallcommon", "doifnotallmodes", "doifnotcommandhandler", "doifnotcommon", "doifnotcounter", "doifnotdocumentargument", "doifnotdocumentfilename", "doifnotempty", "doifnotemptyvalue", "doifnotemptyvariable", "doifnotenv", "doifnoteonsamepageelse", "doifnotescollected", "doifnotfile", "doifnotflagged", "doifnothing", "doifnothingelse", "doifnotinset", "doifnotinsidesplitfloat", "doifnotinstring", "doifnotmode", "doifnotnumber", "doifnotsamestring", "doifnotsetups", "doifnotvalue", "doifnotvariable", "doifnumber", "doifnumberelse", "doifobjectfoundelse", "doifobjectreferencefoundelse", "doifoddpageelse", "doifoddpagefloatelse", "doifoldercontextelse", "doifolderversionelse", "doifoverlappingelse", "doifoverlayelse", "doifparallelelse", "doifparentfileelse", "doifpathelse", "doifpathexistselse", "doifpatternselse", "doifposition", "doifpositionaction", "doifpositionactionelse", "doifpositionelse", "doifpositiononpageelse", "doifpositionsonsamepageelse", "doifpositionsonthispageelse", "doifpositionsusedelse", "doifreferencefoundelse", "doifrightpagefloatelse", "doifrighttoleftinboxelse", "doifsamelinereferenceelse", "doifsamestring", "doifsamestringelse", "doifsetups", "doifsetupselse", "doifsomebackground", "doifsomebackgroundelse", "doifsomespaceelse", "doifsomething", "doifsomethingelse", "doifsometoks", "doifsometokselse", "doifstringinstringelse", "doifstructurelisthasnumberelse", "doifstructurelisthaspageelse", "doifsymboldefinedelse", "doifsymbolsetelse", "doiftext", "doiftextelse", "doiftextflowcollectorelse", "doiftextflowelse", "doiftypingfileelse", "doifundefined", "doifundefinedcounter", "doifundefinedelse", "doifurldefinedelse", "doifvalue", "doifvalueelse", "doifvaluenothing", "doifvaluenothingelse", "doifvaluesomething", "doifvariable", "doifvariableelse", "doindentation", "dollar", "doloop", "doloopoverlist", "donothing", "dontconvertfont", "dontleavehmode", "dontpermitspacesbetweengroups", "doordefinieren", "doorlabelen", "doornummeren", "dopositionaction", "doprocesslocalsetups", "doquadrupleargument", "doquadrupleempty", "doquadruplegroupempty", "doquintupleargument", "doquintupleempty", "doquintuplegroupempty", "dorechecknextindentation", "dorecurse", "dorepeatwithcommand", "doreplacefeature", "doresetandafffeature", "doresetattribute", "dorotatebox", "dosetattribute", "dosetleftskipadaption", "dosetrightskipadaption", "dosetupcheckedinterlinespace", "doseventupleargument", "doseventupleempty", "dosingleargument", "dosingleempty", "dosinglegroupempty", "dosixtupleargument", "dosixtupleempty", "dostepwiserecurse", "dosubtractfeature", "dotfskip", "dotoks", "dotripleargument", "dotripleargumentwithset", "dotripleempty", "dotripleemptywithset", "dotriplegroupempty", "doublebar", "doublebond", "doublebrace", "doublebracket", "doubleparent", "dowith", "dowithnextbox", "dowithnextboxcontent", "dowithnextboxcontentcs", "dowithnextboxcs", "dowithpargument", "dowithrange", "dowithwargument", "dpofstring", "dummydigit", "dummyparameter", "dunnelijn", "dunnelijnen", "eTeX", "edefconvertedargument", "eenregel", "efcmaxheight", "efcmaxwidth", "efcminheight", "efcminwidth", "efcparameter", "effect", "elapsedseconds", "elapsedtime", "eleftarrowfill", "eleftharpoondownfill", "eleftharpoonupfill", "eleftrightarrowfill", "emphasisboldface", "emphasistypeface", "emspace", "enabledirectives", "enableexperiments", "enablemode", "enableoutputstream", "enableparpositions", "enableregime", "enabletrackers", "enskip", "enspace", "env", "envvar", "eoverbarfill", "eoverbracefill", "eoverbracketfill", "eoverparentfill", "epos", "equaldigits", "ergens", "erightarrowfill", "erightharpoondownfill", "erightharpoonupfill", "etwoheadrightarrowfill", "eunderbarfill", "eunderbracefill", "eunderbracketfill", "eunderparentfill", "executeifdefined", "exitloop", "exitloopnow", "expandcheckedcsname", "expanded", "expandfontsynonym", "externalfigurecollectionmaxheight", "externalfigurecollectionmaxwidth", "externalfigurecollectionminheight", "externalfigurecollectionminwidth", "externalfigurecollectionparameter", "externfiguur", "fakebox", "fastdecrement", "fastincrement", "fastlocalframed", "fastscale", "fastsetup", "fastsetupwithargument", "fastsetupwithargumentswapped", "fastswitchtobodyfont", "fastsxsy", "feature", "fence", "fenced", "fetchallmarkings", "fetchallmarks", "fetchmark", "fetchmarking", "fetchonemark", "fetchonemarking", "fetchruntinecommand", "fetchtwomarkings", "fetchtwomarks", "fieldbody", "fifthoffivearguments", "fifthofsixarguments", "figurefilename", "figurefilepath", "figurefiletype", "figurefullname", "figureheight", "figurenaturalheight", "figurenaturalwidth", "figuresymbol", "figurewidth", "figuur", "filename", "filledhboxb", "filledhboxc", "filledhboxg", "filledhboxk", "filledhboxm", "filledhboxr", "filledhboxy", "filler", "filterfromnext", "filterfromvalue", "filterpages", "filterreference", "findtwopassdata", "finishregisterentry", "firstcharacter", "firstcounter", "firstcountervalue", "firstoffivearguments", "firstoffourarguments", "firstofoneargument", "firstofoneunexpanded", "firstofsixarguments", "firstofthreearguments", "firstofthreeunexpanded", "firstoftwoarguments", "firstoftwounexpanded", "firstrealpage", "firstrealpagenumber", "firstsubcountervalue", "firstsubpage", "firstsubpagenumber", "firstuserpage", "firstuserpagenumber", "fitfieldframed", "fittopbaselinegrid", "flag", "floatuserdataparameter", "flushboxregister", "flushcollector", "flushlayer", "flushlocalfloats", "flushnextbox", "flushnotes", "flushoutputstream", "flushshapebox", "flushtextflow", "flushtokens", "flushtoks", "fontalternative", "fontbody", "fontchar", "fontcharbyindex", "fontclass", "fontclassname", "fontface", "fontfeaturelist", "fontsize", "fontstyle", "forcecharacterstripping", "forcelocalfloats", "forgeteverypar", "forgetparameters", "formula", "formulenummer", "foundbox", "fourthoffivearguments", "fourthoffourarguments", "fourthofsixarguments", "frac", "frameddimension", "framedparameter", "framedtext", "freezedimenmacro", "freezemeasure", "frenchspacing", "fromlinenote", "frozenhbox", "gdefconvertedargument", "gdefconvertedcommand", "gebruikJSscripts", "gebruikURL", "gebruikblokken", "gebruikexterndocument", "gebruikexternfiguur", "gebruikexterngeluidsfragment", "gebruikmodule", "gebruikpad", "gebruiksymbolen", "gebruiktypescript", "gebruiktypescriptfile", "gebruikurl", "geenbovenenonderregels", "geenhoofdenvoetregels", "geenspatie", "getMPdrawing", "getMPlayer", "getboxllx", "getboxlly", "getbufferdata", "getcommacommandsize", "getcommalistsize", "getdayoftheweek", "getdayspermonth", "getdefinedbuffer", "getdocumentargument", "getdocumentargumentdefault", "getdocumentfilename", "getdummyparameters", "getemptyparameters", "geteparameters", "getexpandedparameters", "getfiguredimensions", "getfirstcharacter", "getfirsttwopassdata", "getfromcommacommand", "getfromcommalist", "getfromtwopassdata", "getglyphdirect", "getglyphstyled", "getgparameters", "getlasttwopassdata", "getlocalfloat", "getlocalfloats", "getmessage", "getnamedglyphdirect", "getnamedglyphstyled", "getnamedtwopassdatalist", "getnaturaldimensions", "getnoflines", "getobject", "getobjectdimensions", "getpaletsize", "getparameters", "getprivatechar", "getprivateslot", "getrandomcount", "getrandomdimen", "getrandomfloat", "getrandomnumber", "getrandomseed", "getraweparameters", "getrawgparameters", "getrawnoflines", "getrawparameters", "getrawxparameters", "getreference", "getreferenceentry", "getroundednoflines", "getsubstring", "gettwopassdata", "gettwopassdatalist", "getuvalue", "getvalue", "getvariable", "getvariabledefault", "getxparameters", "globaldisablemode", "globalenablemode", "globalletempty", "globalpopbox", "globalpopmacro", "globalpreventmode", "globalprocesscommalist", "globalpushbox", "globalpushmacro", "globalswapcounts", "globalswapdimens", "globalswapmacros", "globalundefine", "glyphfontfile", "gobbledoubleempty", "gobbleeightarguments", "gobblefivearguments", "gobblefiveoptionals", "gobblefourarguments", "gobblefouroptionals", "gobbleninearguments", "gobbleoneargument", "gobbleoneoptional", "gobblesevenarguments", "gobblesingleempty", "gobblesixarguments", "gobblespacetokens", "gobbletenarguments", "gobblethreearguments", "gobblethreeoptionals", "gobbletwoarguments", "gobbletwooptionals", "gobbleuntil", "gobbleuntilrelax", "grabbufferdata", "grabbufferdatadirect", "grabuntil", "grafiek", "grayvalue", "greedysplitstring", "greeknumerals", "grijskleur", "groupedcommand", "gsetboxllx", "gsetboxlly", "gujaratinumerals", "gurmurkhinumerals", "haalbuffer", "haalmarkering", "haarlijn", "hairspace", "halfwaybox", "handhaafblokken", "handletokens", "handwritten", "hash", "hboxofvbox", "hboxreference", "hdofstring", "headhbox", "headnumbercontent", "headnumberdistance", "headnumberwidth", "headreferenceattributes", "headsetupspacing", "headtextcontent", "headtextdistance", "headtextwidth", "headvbox", "headwidth", "heightanddepthofstring", "heightofstring", "heightspanningtext", "helptekst", "helptext", "hglue", "hiddenbar", "hiddencitation", "hiddencite", "highlight", "highordinalstr", "hilo", "himilo", "hl", "hoofdstuk", "hoofdtaal", "hoog", "horizontalgrowingbar", "horizontalpositionbar", "hphantom", "hpos", "hsizefraction", "hsmash", "hsmashbox", "hsmashed", "hspace", "htdpofstring", "htofstring", "huidigedatum", "huidigekopnummer", "hyphen", "hyphenatedcoloredword", "hyphenatedfile", "hyphenatedfilename", "hyphenatedhbox", "hyphenatedpar", "hyphenatedurl", "hyphenatedword", "ibox", "ifassignment", "iff", "ifinobject", "ifinoutputstream", "ifparameters", "iftrialtypesetting", "ignoreimplicitspaces", "ignorevalue", "immediatesavetwopassdata", "impliedby", "implies", "in", "includemenu", "includeversioninfo", "increment", "incrementcounter", "incrementedcounter", "incrementpagenumber", "incrementsubpagenumber", "incrementvalue", "indentation", "infofont", "infofontbold", "inheritparameter", "inhibitblank", "initializeboxstack", "inlijnd", "inlinebuffer", "inlinedbox", "inlinemath", "inlinemathematics", "inlinemessage", "inlineordisplaymath", "inlinerange", "innerflushshapebox", "input", "inputfilebarename", "inputfilename", "inputfilerealsuffix", "inputfilesuffix", "inputgivenfile", "inregel", "insertpages", "installactionhandler", "installactivecharacter", "installanddefineactivecharacter", "installattributestack", "installautocommandhandler", "installautosetuphandler", "installbasicautosetuphandler", "installbasicparameterhandler", "installbottomframerenderer", "installcommandhandler", "installcorenamespace", "installdefinehandler", "installdefinitionset", "installdefinitionsetmember", "installdirectcommandhandler", "installdirectparameterhandler", "installdirectparametersethandler", "installdirectsetuphandler", "installdirectstyleandcolorhandler", "installeertaal", "installframedautocommandhandler", "installframedcommandhandler", "installleftframerenderer", "installnamespace", "installoutputroutine", "installpagearrangement", "installparameterhandler", "installparameterhashhandler", "installparametersethandler", "installparentinjector", "installrightframerenderer", "installrootparameterhandler", "installsetuphandler", "installsetuponlycommandhandler", "installshipoutmethod", "installsimplecommandhandler", "installsimpleframedcommandhandler", "installstyleandcolorhandler", "installswitchcommandhandler", "installswitchsetuphandler", "installtexdirective", "installtextracker", "installtopframerenderer", "installunitsseparator", "installunitsspace", "installversioninfo", "integerrounding", "interactiebalk", "interactiebuttons", "interactiemenu", "intermezzo", "intertext", "invokepageheandler", "invullijnen", "invulregel", "invultekst", "inwilijnd", "istltdir", "istrtdir", "italic", "italicbold", "italiccorrection", "items", "itemtag", "jobfilename", "jobfilesuffix", "kadertekst", "kap", "keeplinestogether", "keepunwantedspaces", "kerncharacters", "kleur", "kleurenbalk", "kleurwaarde", "kloonveld", "kolom", "kopnummer", "koreancirclenumerals", "koreannumerals", "koreannumeralsc", "koreannumeralsp", "koreanparentnumerals", "laag", "laho", "languageCharacters", "languagecharacters", "languagecharwidth", "lastcounter", "lastcountervalue", "lastdigit", "lastlinewidth", "lastnaturalboxdp", "lastnaturalboxht", "lastnaturalboxwd", "lastpredefinedsymbol", "lastrealpage", "lastrealpagenumber", "lastsubcountervalue", "lastsubpage", "lastsubpagenumber", "lasttwodigits", "lastuserpage", "lastuserpagenumber", "lateluacode", "layeredtext", "layerheight", "layerwidth", "lazysavetaggedtwopassdata", "lazysavetwopassdata", "lbox", "left", "leftbottombox", "leftbox", "lefthbox", "leftorrighthbox", "leftorrightvbox", "leftorrightvtop", "leftskipadaption", "leftsubguillemot", "lefttopbox", "lefttorighthbox", "lefttorightvbox", "lefttorightvtop", "legeregels", "letbeundefined", "letcatcodecommand", "letcscsname", "letcsnamecs", "letcsnamecsname", "letdummyparameter", "letempty", "letgvalue", "letgvalueempty", "letgvalurelax", "letter", "letterampersand", "letterat", "letterbackslash", "letterbar", "letterbgroup", "letterclosebrace", "lettercolon", "letterdollar", "letterdoublequote", "letteregroup", "letterescape", "letterexclamationmark", "letterhash", "letterhat", "letterleftbrace", "letterless", "lettermore", "letteropenbrace", "letterpercent", "letterquestionmark", "letterrightbrace", "letters", "lettersinglequote", "letterslash", "letterspacing", "lettertilde", "letterunderscore", "letvalue", "letvalueempty", "letvaluerelax", "lfence", "lhbox", "lijndikte", "lijstlengte", "limitatelines", "limitatetext", "limtatefirstline", "linespanningtext", "listcitation", "listcite", "listnamespaces", "llap", "loadanyfile", "loadanyfileonce", "loadbtxdefinitionfile", "loadbtxreplacementfile", "loadcldfile", "loadcldfileonce", "loadfontgoodies", "loadluafile", "loadluafileonce", "loadspellchecklist", "loadtexfile", "loadtexfileonce", "loadtypescriptfile", "localframed", "localframedwithsettings", "localhsize", "localpopbox", "localpopmacro", "localpushbox", "localpushmacro", "localundefine", "locatedfilepath", "locatefilepath", "locfilename", "lomihi", "lowerbox", "lowercased", "lowercasestring", "lowerleftdoubleninequote", "lowerleftsingleninequote", "lowerrightdoubleninequote", "lowerrightsingleninequote", "lrtbbox", "ltop", "luaTeX", "luacode", "luaconditional", "luaenvironment", "luaexpanded", "luafunction", "luajitTeX", "luamajorversion", "luaminorversion", "luaparameterset", "luasetup", "luaversion", "m", "mLeftarrow", "mLeftrightarrow", "mRightarrow", "maand", "makecharacteractive", "makerawcommalist", "makestrutofbox", "mapfontsize", "margindata", "markcontent", "markeer", "markinjector", "mat", "math", "mathbf", "mathbi", "mathblackboard", "mathbs", "mathcommand", "mathdefault", "mathfraktur", "mathfunction", "mathit", "mathitalic", "mathop", "mathrm", "mathscript", "mathsl", "mathss", "mathtext", "mathtextbf", "mathtextbi", "mathtextbs", "mathtextit", "mathtextsl", "mathtexttf", "mathtf", "mathtriplet", "mathtt", "mathupright", "mathword", "mathwordbf", "mathwordbi", "mathwordbs", "mathwordit", "mathwordsl", "mathwordtf", "mbox", "mcframed", "md", "measure", "measured", "medskip", "medspace", "menubutton", "mequal", "message", "metaTeX", "mfence", "mfunction", "mfunctionlabeltext", "mhbox", "mhookleftarrow", "mhookrightarrow", "middle", "middlebox", "midhbox", "minimalhbox", "mixedcaps", "mkvibuffer", "mleftarrow", "mleftharpoondown", "mleftharpoonup", "mleftrightarrow", "mleftrightharpoons", "mmapsto", "moduleparameter", "molecule", "mono", "monobold", "mononormal", "monthlong", "monthshort", "mp", "mprandomnumber", "mrel", "mrightarrow", "mrightharpoondown", "mrightharpoonup", "mrightleftharpoons", "mrightoverleftarrow", "mtext", "mtriplerel", "mtwoheadleftarrow", "mtwoheadrightarrow", "naar", "naarbox", "naarpagina", "namedheadnumber", "namedstructureheadlocation", "namedstructureuservariable", "namedstructurevariable", "namedtaggedlabeltexts", "naturalhbox", "naturalhpack", "naturalvbox", "naturalvcenter", "naturalvpack", "naturalvtop", "naturalwd", "negatecolorbox", "negated", "negthinspace", "newattribute", "newcatcodetable", "newcounter", "newevery", "newfrenchspacing", "newmode", "newsignal", "newsystemmode", "nextbox", "nextboxdp", "nextboxht", "nextboxhtdp", "nextboxwd", "nextcounter", "nextcountervalue", "nextdepth", "nextparagraphs", "nextrealpage", "nextrealpagenumber", "nextsubcountervalue", "nextsubpage", "nextsubpagenumber", "nextuserpage", "nextuserpagenumber", "nobar", "nocitation", "nocite", "nodetostring", "noffigurepages", "noflines", "noflocalfloats", "noindentation", "noitem", "nokap", "nonfrenchspacing", "nonmathematics", "noot", "normal", "normalboldface", "normalframedwithsettings", "normalizebodyfontsize", "normalizedfontsize", "normalizefontdepth", "normalizefontheight", "normalizefontline", "normalizefontwidth", "normalizetextdepth", "normalizetextheight", "normalizetextline", "normalizetextwidth", "normaltypeface", "notesymbol", "ntimes", "numberofpoints", "obeydepth", "objectdepth", "objectheight", "objectmargin", "objectwidth", "obox", "offset", "offsetbox", "omgeving", "omlaag", "omlijnd", "onbekend", "onderdeel", "onderwerp", "onedigitrounding", "op", "oppagina", "opsomming", "ordinaldaynumber", "ordinalstr", "ornamenttext", "outputfilename", "outputstreambox", "outputstreamcopy", "outputstreamunvbox", "outputstreamunvcopy", "over", "overbar", "overbars", "overbartext", "overbarunderbar", "overbrace", "overbracetext", "overbraceunderbrace", "overbracket", "overbrackettext", "overbracketunderbracket", "overlaybutton", "overlaycolor", "overlaydepth", "overlayfigure", "overlayheight", "overlaylinecolor", "overlaylinewidth", "overlayoffset", "overlayrollbutton", "overlaywidth", "overleftarrow", "overleftharpoondown", "overleftharpoonup", "overleftrightarrow", "overloaderror", "overparent", "overparenttext", "overparentunderparent", "overrightarrow", "overrightharpoondown", "overrightharpoonup", "overset", "overstrike", "overstrikes", "overtwoheadleftarrow", "overtwoheadrightarrow", "pagearea", "pagebreak", "pagefigure", "pagegridspanwidth", "pageinjection", "pagestaterealpage", "pagina", "paginanummer", "paginareferentie", "paletsize", "paragraaf", "paslayoutaan", "passendveld", "pdfTeX", "pdfactualtext", "pdfbackendactualtext", "pdfbackendcurrentresources", "pdfbackendsetcatalog", "pdfbackendsetcolorspace", "pdfbackendsetextgstate", "pdfbackendsetinfo", "pdfbackendsetname", "pdfbackendsetpageattribute", "pdfbackendsetpageresource", "pdfbackendsetpagesattribute", "pdfbackendsetpattern", "pdfbackendsetshade", "pdfcolor", "pdfeTeX", "percent", "percentdimen", "permitcaretescape", "permitcircumflexescape", "permitspacesbetweengroups", "persiandecimals", "persiannumerals", "phantom", "phantombox", "pickupgroupedcommand", "plaatsbookmarks", "plaatsformule", "plaatskopnummer", "plaatskoptekst", "plaatslijst", "plaatslijstmetsynoniemen", "plaatslokalevoetnoten", "plaatsnaastelkaar", "plaatsonderelkaar", "plaatsopgrid", "plaatspaginanummer", "plaatsplaatsblok", "plaatsregister", "plaatsruwelijst", "plaatssamengesteldelijst", "plaatssubformule", "plaatsvoetnoten", "placeattachments", "placebtxrendering", "placecitation", "placecomments", "placecurrentformulanumber", "placedbox", "placefloatwithsetups", "placeframed", "placehelp", "placeinitial", "placelayer", "placelayeredtext", "placelistofpublications", "placelistofsorts", "placelocalnotes", "placement", "placenamedfloat", "placenamedformula", "placenotes", "placepairedbox", "placeparallel", "placerenderingwindow", "popattribute", "popmacro", "popmode", "popsystemmode", "positioneer", "positionoverlay", "positionregionoverlay", "postponenotes", "predefinedfont", "predefinefont", "predefinesymbol", "prefixedpagenumber", "prependetoks", "prependgvalue", "prependtocommalist", "prependtoks", "prependtoksonce", "prependvalue", "presetdocument", "presetfieldsymbols", "pretocommalist", "prevcounter", "prevcountervalue", "preventmode", "prevrealpage", "prevrealpagenumber", "prevsubcountervalue", "prevsubpage", "prevsubpagenumber", "prevuserpage", "prevuserpagenumber", "procent", "processMPbuffer", "processMPfigurefile", "processaction", "processallactionsinset", "processassignlist", "processassignmentcommand", "processassignmentlist", "processbetween", "processbodyfontenvironmentlist", "processcolorcomponents", "processcommacommand", "processcommalist", "processcommalistwithparameters", "processcontent", "processfile", "processfilemany", "processfilenone", "processfileonce", "processfirstactioninset", "processisolatedchars", "processisolatedwords", "processlinetablebuffer", "processlinetablefile", "processlist", "processmonth", "processranges", "processseparatedlist", "processtexbuffer", "processtokens", "processuntil", "processxtablebuffer", "processyear", "produkt", "profiledbox", "profilegivenbox", "programma", "projekt", "pseudoMixedCapped", "pseudoSmallCapped", "pseudoSmallcapped", "pseudosmallcapped", "punten", "purenumber", "pushattribute", "pushbutton", "pushmacro", "pushmode", "pushoutputstream", "pushsystemmode", "qquad", "quad", "quads", "quitcommalist", "quitprevcommalist", "quittypescriptscanning", "raisebox", "randomizetext", "randomnumber", "rawcounter", "rawcountervalue", "rawdate", "rawdoifelseinset", "rawdoifinset", "rawdoifinsetelse", "rawgetparameters", "rawprocessaction", "rawprocesscommacommand", "rawprocesscommalist", "rawstructurelistuservariable", "rawsubcountervalue", "rbox", "readfile", "readfixfile", "readjobfile", "readlocfile", "readsetfile", "readsysfile", "readtexfile", "readxmlfile", "realSmallCapped", "realSmallcapped", "realpagenumber", "realsmallcapped", "recursedepth", "recurselevel", "recursestring", "redoconvertfont", "ref", "refereer", "referenceprefix", "referentie", "registerattachment", "registerctxluafile", "registerexternalfigure", "registerfontclass", "registerhyphenationexception", "registerhyphenationpattern", "registermenubuttons", "registersort", "registersynonym", "registerunit", "regular", "relatemarking", "relateparameterhandlers", "relaxvalueifundefined", "remainingcharacters", "removebottomthings", "removedepth", "removefromcommalist", "removelastskip", "removelastspace", "removemarkedcontent", "removepunctuation", "removesubstring", "removetoks", "removeunwantedspaces", "replacefeature", "replaceincommalist", "replaceword", "rescan", "rescanwithsetup", "resetMPdrawing", "resetMPenvironment", "resetMPinstance", "resetallattributes", "resetandaddfeature", "resetbar", "resetbreakpoints", "resetbuffer", "resetcharacteralign", "resetcharacterkerning", "resetcharacterspacing", "resetcharacterstripping", "resetcollector", "resetcounter", "resetdigitsmanipulation", "resetdirection", "resetfeature", "resetflag", "resetfontcolorsheme", "resetfontfallback", "resetfontsolution", "resethyphenationfeatures", "resetinjector", "resetinteractionmenu", "resetitaliccorrection", "resetlayer", "resetlocalfloats", "resetmarker", "resetmarkering", "resetmode", "resetpagenumber", "resetparallel", "resetpath", "resetpenalties", "resetprofile", "resetreference", "resetreplacement", "resetscript", "resetsetups", "resetshownsynonyms", "resetsubpagenumber", "resetsymbolset", "resetsystemmode", "resettimer", "resettrackers", "resettrialtypesetting", "resetusedsortings", "resetusedsynonyms", "resetuserpagenumber", "resetvalue", "resetvisualizers", "reshapebox", "resolvedglyphdirect", "resolvedglyphstyled", "restartcounter", "restorebox", "restorecatcodes", "restorecounter", "restorecurrentattributes", "restoreendofline", "restoreglobalbodyfont", "reusableMPgraphic", "reuseMPgraphic", "reuserandomseed", "revivefeature", "rfence", "rhbox", "right", "rightbottombox", "rightbox", "righthbox", "rightorleftpageaction", "rightskipadaption", "rightsubguillemot", "righttolefthbox", "righttoleftvbox", "righttoleftvtop", "righttopbox", "rlap", "robustaddtocommalist", "robustdoifelseinset", "robustdoifinsetelse", "robustpretocommalist", "rollbutton", "roman", "romeins", "rooster", "roteer", "rtop", "ruledhbox", "ruledhpack", "ruledmbox", "ruledtopv", "ruledtpack", "ruledvbox", "ruledvpack", "ruledvtop", "runMPbuffer", "runninghbox", "safechar", "sans", "sansbold", "sansnormal", "sansserif", "savebox", "savebtxdataset", "savecounter", "savecurrentattributes", "savenormalmeaning", "savetaggedtwopassdata", "savetwopassdata", "sbox", "schaal", "scherm", "schrijfnaarlijst", "schrijftussenlijst", "sd", "secondoffivearguments", "secondoffourarguments", "secondofsixarguments", "secondofthreearguments", "secondofthreeunexpanded", "secondoftwoarguments", "secondoftwounexpanded", "select", "selecteerblokken", "serializecommalist", "serializedcommalist", "serif", "serifbold", "serifnormal", "setJSpreamble", "setMPlayer", "setMPpositiongraphic", "setMPpositiongraphicrange", "setMPtext", "setMPvariable", "setMPvariables", "setbar", "setbigbodyfont", "setboxllx", "setboxlly", "setbreakpoints", "setcapstrut", "setcatcodetable", "setcharacteralign", "setcharactercasing", "setcharactercleaning", "setcharacterkerning", "setcharacterspacing", "setcharacterstripping", "setcharstrut", "setcollector", "setcolormodell", "setcounter", "setcounterown", "setcurrentfontclass", "setdataset", "setdefaultpenalties", "setdigitsmanipulation", "setdirection", "setdocumentargument", "setdocumentargumentdefault", "setdocumentfilename", "setdummyparameter", "setelementexporttag", "setemeasure", "setevalue", "setevariable", "setevariables", "setfirstline", "setflag", "setfont", "setfontcolorsheme", "setfontfeature", "setfontsolution", "setfontstrut", "setfractions", "setgmeasure", "setgvalue", "setgvariable", "setgvariables", "sethboxregister", "sethyphenatedurlafter", "sethyphenatedurlbefore", "sethyphenatedurlnormal", "sethyphenationfeatures", "setinitial", "setinjector", "setinteraction", "setinterfacecommand", "setinterfaceconstant", "setinterfaceelements", "setinterfacemessage", "setinterfacevariable", "setinternalrendering", "setitaliccorrection", "setlayer", "setlayerframed", "setlayertext", "setlinefiller", "setlocalhsize", "setmainbodyfont", "setmainparbuilder", "setmarker", "setmarking", "setmathstyle", "setmeasure", "setmessagetext", "setmode", "setnostrut", "setnote", "setnotetext", "setobject", "setoldstyle", "setpagegrid", "setpagereference", "setpagestate", "setpagestaterealpageno", "setpenalties", "setpercentdimen", "setposition", "setpositionbox", "setpositiondata", "setpositiondataplus", "setpositiononly", "setpositionplus", "setpositionstrut", "setprofile", "setrandomseed", "setreference", "setreferencedobject", "setregisterentry", "setreplacement", "setrigidcolumnbalance", "setrigidcolumnhsize", "setscript", "setsectionblock", "setsimplecolumnhsize", "setsmallbodyfont", "setsmallcaps", "setstackbox", "setstructurepageregister", "setstrut", "setsuperiors", "setsystemmode", "settabular", "settaggedmetadata", "settightobject", "settightreferencedobject", "settightunreferencedobject", "settrialtypesetting", "setuevalue", "setugvalue", "setunreferencedobject", "setup", "setupMPgraphics", "setupMPinstance", "setupMPpage", "setupMPvariables", "setupTABLE", "setupTEXpage", "setupattachment", "setupbackend", "setupbar", "setupbleeding", "setupbookmark", "setupbtx", "setupbtxdataset", "setupbtxlist", "setupbtxregister", "setupbtxrendering", "setupbutton", "setupcharacterkerning", "setupcharacterspacing", "setupchemical", "setupchemicalframed", "setupcollector", "setupcolumnspan", "setupcombination", "setupcounter", "setupdataset", "setupdelimitedtext", "setupdirections", "setupdocument", "setupeffect", "setupenv", "setupexport", "setupexternalfigure", "setupexternalsoundtracks", "setupfieldbody", "setupfieldcategory", "setupfieldcontentframed", "setupfieldlabelframed", "setupfieldtotalframed", "setupfiller", "setupfirstline", "setupfittingpage", "setupfloatcaption", "setupfontexpansion", "setupfontprotrusion", "setupfonts", "setupfontsolution", "setupformulaframed", "setupframedcontent", "setupglobalreferenceprefix", "setupheadalternative", "setuphelp", "setuphigh", "setuphighlight", "setuphyphenation", "setupinitial", "setupinsertion", "setupitaliccorrection", "setuplabel", "setuplayer", "setuplayeredtext", "setuplayouttext", "setuplinefiller", "setuplinefillers", "setuplinenote", "setuplinetable", "setuplistalternative", "setuplistextra", "setuplocalfloats", "setuplocalinterlinespace", "setuplow", "setuplowhigh", "setuplowmidhigh", "setupmarginframed", "setupmarginrule", "setupmathcases", "setupmathematics", "setupmathfence", "setupmathfraction", "setupmathframed", "setupmathmatrix", "setupmathornament", "setupmathradical", "setupmathstackers", "setupmathstyle", "setupmixedcolumns", "setupmodule", "setupnotation", "setupnotations", "setupnote", "setupnotes", "setupoffset", "setupoffsetbox", "setupoutputroutine", "setuppagechecker", "setuppagegrid", "setuppagegridarea", "setuppagegridareatext", "setuppagegridlines", "setuppagegridspan", "setuppagegridstart", "setuppageinjection", "setuppageinjectionalternative", "setuppageshift", "setuppagestate", "setuppairedbox", "setupparagraph", "setupparagraphintro", "setupparallel", "setupperiods", "setuppositionbar", "setupprocessor", "setupprofile", "setupquotation", "setuprealpagenumber", "setupreferenceformat", "setupreferenceprefix", "setupreferencestructureprefix", "setupregisters", "setuprenderingwindow", "setups", "setupscale", "setupscript", "setupscripts", "setupselector", "setupshift", "setupsidebar", "setupspellchecking", "setupstretched", "setupstruts", "setupstyle", "setupsubformula", "setuptabulation", "setuptagging", "setuptextflow", "setuptooltip", "setupunit", "setupuserpagenumber", "setupversion", "setupviewerlayer", "setupvspacing", "setupwithargument", "setupwithargumentswapped", "setupxml", "setupxtable", "setuvalue", "setuxvalue", "setvalue", "setvariable", "setvariables", "setvboxregister", "setvisualizerfont", "setvtopregister", "setwidthof", "setxmeasure", "setxvalue", "setxvariable", "setxvariables", "sfrac", "shapedhbox", "showallmakeup", "showattributes", "showboxes", "showbtxdatasetauthors", "showbtxdatasetcompleteness", "showbtxdatasetfields", "showbtxfields", "showbtxhashedauthors", "showbtxtables", "showchardata", "showcharratio", "showcolorbar", "showcolorcomponents", "showcolorset", "showcolorstruts", "showcounter", "showdirectives", "showdirsinmargin", "showedebuginfo", "showexperiments", "showfont", "showfontdata", "showfontkerns", "showfontparameters", "showfontstrip", "showfontstyle", "showglyphs", "showgridsnapping", "showhelp", "showhyphenationtrace", "showhyphens", "showinjector", "showjustification", "showkerning", "showlayoutcomponents", "showligature", "showligatures", "showlogcategories", "showmargins", "showmessage", "showminimalbaseline", "shownextbox", "showotfcomposition", "showparentchain", "showsetupsdefinition", "showtimer", "showtokens", "showtrackers", "showvalue", "showvariable", "showwarning", "simplegroupedcommand", "singalcharacteralign", "singlebond", "sixthofsixarguments", "slanted", "slantedbold", "slicepages", "slovenianNumerals", "sloveniannumerals", "small", "smallbodyfont", "smallbold", "smallbolditalic", "smallboldslanted", "smallcappedcharacters", "smallcappedromannumerals", "smaller", "smallitalicbold", "smallnormal", "smallskip", "smallslanted", "smallslantedbold", "smalltype", "smash", "smashbox", "smashboxed", "smashedhbox", "smashedvbox", "snaptogrid", "som", "someheadnumber", "somekindoftab", "somelocalfloat", "somenamedheadnumber", "someplace", "sp", "spanishNumerals", "spanishnumerals", "spatie", "speech", "spiegel", "splitatasterisk", "splitatcolon", "splitatcolons", "splitatcomma", "splitdfrac", "splitfilename", "splitfrac", "splitoffbase", "splitofffull", "splitoffkind", "splitoffname", "splitoffpath", "splitoffroot", "splitofftokens", "splitofftype", "splitsplaatsblok", "splitstring", "spraak", "spreadhbox", "sqrt", "stackrel", "startJScode", "startJSpreamble", "startMPclip", "startMPcode", "startMPdefinitions", "startMPdrawing", "startMPenvironment", "startMPextensions", "startMPinclusions", "startMPinitializations", "startMPpage", "startMPpositiongraphic", "startMPpositionmethod", "startMPrun", "startTABLE", "startTABLEbody", "startTABLEfoot", "startTABLEhead", "startTABLEnext", "startTC", "startTD", "startTDs", "startTEXpage", "startTH", "startTN", "startTR", "startTRs", "startTX", "startTY", "startaanhangsel", "startachtergrond", "startallmodes", "startarrangedpages", "startaside", "startattachment", "startbar", "startbinom", "startbitmapimage", "startblockquote", "startblokcitaat", "startbtxrenderingdefinitions", "startbuffer", "startbutton", "startcatcodetable", "startcharacteralign", "startcheckedfences", "startchemical", "startcitaat", "startciteer", "startcollect", "startcollecting", "startcolorintent", "startcoloronly", "startcolorset", "startcolumns", "startcolumnspan", "startcombination", "startcomment", "startcommentaar", "startcontextcode", "startcontextdefinitioncode", "startctxfunction", "startctxfunctiondefinition", "startcurrentcolor", "startcurrentlistentrywrapper", "startdbinom", "startdelimited", "startdelimitedtext", "startdfrac", "startdisplaymath", "startdmath", "startdocument", "startdoorstreep", "startdoorstrepen", "starteffect", "startelement", "startembeddedxtable", "startendofline", "startexceptions", "startexpanded", "startexpandedcollect", "startextendedcatcodetable", "startexternalfigurecollection", "startfigure", "startfiguur", "startfitfieldframed", "startfittingpage", "startfloatcombination", "startfont", "startfontclass", "startfontsolution", "startformula", "startformulas", "startfrac", "startframedcontent", "startframedtext", "startgrafiek", "startgridsnapping", "starthbox", "starthboxestohbox", "starthboxregister", "starthelptekst", "starthelptext", "starthiddenbar", "starthiding", "starthighlight", "starthoofdstuk", "starthyphenation", "startimath", "startindentation", "startindentedtext", "startinmframed", "startinteractiemenu", "startinteraction", "startinterface", "startintermezzo", "startintertext", "startitemgroup", "startkadertekst", "startkantlijn", "startkleur", "startknockout", "startkop", "startlayout", "startlinefiller", "startlinenumbering", "startlinetable", "startlinetablebody", "startlinetablecell", "startlinetablehead", "startlocalheadsetup", "startlocallinecorrection", "startlocalnotes", "startlocalsetups", "startlokalevoetnoten", "startlua", "startluacode", "startluaparameterset", "startluasetups", "startmakeup", "startmargeblok", "startmarkedcontent", "startmathmode", "startmathstyle", "startmatrices", "startmcframed", "startmdformula", "startmframed", "startmixedcolumns", "startmode", "startmodeset", "startmodule", "startmoduletestsection", "startmpformula", "startnaar", "startnamedsection", "startnamedsubformulas", "startnarrow", "startnarrower", "startnegative", "startnicelyfilledbox", "startnobar", "startnointerference", "startnotallmodes", "startnotext", "startnotmode", "startomgeving", "startomlijnd", "startonderdeel", "startonderstreep", "startonderstrepen", "startonderwerp", "startopelkaar", "startopposite", "startopsomming", "startoutputstream", "startoverlay", "startoverprint", "startoverstreep", "startoverstrepen", "startpagecomment", "startpagefigure", "startpagegrid", "startpagegridspan", "startpagelayout", "startpar", "startparagraaf", "startparagraph", "startparagraphs", "startparagraphscell", "startparbuilder", "startpath", "startplaatsformule", "startplacepairedbox", "startpositioning", "startpositionoverlay", "startpositive", "startpostponing", "startprocessassignmentcommand", "startprocessassignmentlist", "startprocesscommacommand", "startprocesscommalist", "startprodukt", "startprojekt", "startprotect", "startprotectedcolors", "startpublicatie", "startpunctuation", "startrandomized", "startrandomseed", "startrawsetups", "startreadingfile", "startreferenceprefix", "startregel", "startregelcorrectie", "startregime", "startregister", "startreusableMPgraphic", "startscript", "startsdformula", "startsectionblock", "startsectionblockenvironment", "startsectionlevel", "startsetups", "startsfrac", "startshapebox", "startshift", "startsidebar", "startsimplecolumns", "startsom", "startspecialitem", "startspeech", "startspformula", "startspraak", "startspread", "startstartstop", "startstaticMPfigure", "startstaticMPgraphic", "startstrictinspectnextcharacter", "startstructurepageregister", "startstrut", "startstyle", "startsubformulas", "startsubjectlevel", "startsubonderwerp", "startsubparagraaf", "startsubsentence", "startsubstack", "startsubsubonderwerp", "startsubsubparagraaf", "startsubsubsubonderwerp", "startsubsubsubparagraaf", "startsubsubsubsubonderwerp", "startsubsubsubsubparagraaf", "startsymbolset", "starttabel", "starttable", "starttablehead", "starttables", "starttabletail", "starttabulate", "starttabulatehead", "starttabulatetail", "starttagged", "starttbinom", "starttekstachtergrond", "starttekstlijn", "starttexcode", "starttexdefinition", "starttext", "starttextbackgroundmanual", "starttextcolor", "starttextcolorintent", "starttextflow", "starttitel", "starttokens", "starttransparent", "starttypescript", "starttypescriptcollection", "startunderdash", "startunderdashes", "startunderdot", "startunderdots", "startunderrandom", "startunderrandoms", "startunderstrike", "startunderstrikes", "startunframed", "startuniqueMPgraphic", "startuniqueMPpagegraphic", "startunpacked", "startusableMPgraphic", "startuseMPgraphic", "startusemathstyleparameter", "startusingbtxspecification", "startvbox", "startvboxregister", "startvboxtohbox", "startvboxtohboxseparator", "startviewerlayer", "startvtop", "startvtopregister", "startxcell", "startxcellgroup", "startxfrac", "startxgroup", "startxmldisplayverbatim", "startxmlinlineverbatim", "startxmlraw", "startxmlsetups", "startxrow", "startxrowgroup", "startxtable", "startxtablebody", "startxtablefoot", "startxtablehead", "startxtablenext", "startxxfrac", "stelachtergrondenin", "stelachtergrondin", "stelalineasin", "stelarrangerenin", "stelblankoin", "stelblokin", "stelblokjesin", "stelblokkopjein", "stelbovenin", "stelboventekstenin", "stelbufferin", "stelciterenin", "stelclipin", "stelcommentaarin", "steldoordefinierenin", "steldoornummerenin", "steldunnelijnenin", "stelformulein", "stelformulierenin", "stelhoofdin", "stelhoofdtekstenin", "stelingesprongentextin", "stelinmargein", "stelinspringenin", "stelinteractiebalkin", "stelinteractiein", "stelinteractiemenuin", "stelinteractieschermin", "stelinterliniein", "stelinvullijnenin", "stelinvulregelsin", "stelitemgroepin", "stelitemsin", "stelkadertekstin", "stelkantlijnin", "stelkapitalenin", "stelkleurenin", "stelkleurin", "stelkolommenin", "stelkopin", "stelkopnummerin", "stelkoppeltekenin", "stelkoppenin", "stelkorpsin", "stellayoutin", "stellijndiktein", "stellijstin", "stelmargeblokkenin", "stelmarkeringin", "stelnaastplaatsenin", "stelomlijndin", "stelonderin", "stelondertekstenin", "stelopmaakin", "stelopsommingenin", "stelpaginacommentaarin", "stelpaginanummerin", "stelpaginanummeringin", "stelpaginaovergangenin", "stelpaletin", "stelpapierformaatin", "stelpapierin", "stelparagraafnummerenin", "stelplaatsblokin", "stelplaatsbloksplitsenin", "stelplaatsin", "stelpositionerenin", "stelprogrammasin", "stelrefererenin", "stelregelnummerenin", "stelregelsin", "stelregisterin", "stelroterenin", "stelsamengesteldelijstin", "stelsectieblokin", "stelsmallerin", "stelsorterenin", "stelspatieringin", "stelstartstopin", "stelsubpaginanummerin", "stelsymboolsetin", "stelsynoniemenin", "steltaalin", "steltabellenin", "steltabulatiein", "steltekstachtergrondin", "steltekstin", "steltekstinhoudin", "steltekstlijnenin", "stelteksttekstenin", "steltolerantiein", "steltypein", "steltypenin", "stelurlin", "stelveldenin", "stelveldin", "stelvoetin", "stelvoettekstenin", "stelwiskundeuitlijnenin", "stelwitruimtein", "stopJScode", "stopJSpreamble", "stopMPclip", "stopMPcode", "stopMPdefinitions", "stopMPdrawing", "stopMPenvironment", "stopMPextensions", "stopMPinclusions", "stopMPinitializations", "stopMPpage", "stopMPpositiongraphic", "stopMPpositionmethod", "stopMPrun", "stopTABLE", "stopTABLEbody", "stopTABLEfoot", "stopTABLEhead", "stopTABLEnext", "stopTC", "stopTD", "stopTDs", "stopTEXpage", "stopTH", "stopTN", "stopTR", "stopTRs", "stopTX", "stopTY", "stopaanhangsel", "stopachtergrond", "stopallmodes", "stoparrangedpages", "stopaside", "stopattachment", "stopbar", "stopbinom", "stopbitmapimage", "stopblockquote", "stopblokcitaat", "stopbtxrenderingdefinitions", "stopbuffer", "stopbutton", "stopcatcodetable", "stopcharacteralign", "stopcheckedfences", "stopchemical", "stopcitaat", "stopciteer", "stopcollect", "stopcollecting", "stopcolorintent", "stopcoloronly", "stopcolorset", "stopcolumns", "stopcolumnspan", "stopcombination", "stopcomment", "stopcommentaar", "stopcontextcode", "stopcontextdefinitioncode", "stopctxfunction", "stopctxfunctiondefinition", "stopcurrentcolor", "stopcurrentlistentrywrapper", "stopdbinom", "stopdelimited", "stopdelimitedtext", "stopdfrac", "stopdisplaymath", "stopdmath", "stopdocument", "stopdoorstreep", "stopdoorstrepen", "stopeffect", "stopelement", "stopembeddedxtable", "stopendofline", "stopexceptions", "stopexpanded", "stopexpandedcollect", "stopextendedcatcodetable", "stopexternalfigurecollection", "stopfigure", "stopfiguur", "stopfitfieldframed", "stopfittingpage", "stopfloatcombination", "stopfont", "stopfontclass", "stopfontsolution", "stopformula", "stopformulas", "stopfrac", "stopframedcontent", "stopframedtext", "stopgrafiek", "stopgridsnapping", "stophbox", "stophboxestohbox", "stophboxregister", "stophelptekst", "stophelptext", "stophiddenbar", "stophiding", "stophighlight", "stophoofdstuk", "stophyphenation", "stopimath", "stopindentation", "stopindentedtext", "stopinmframed", "stopinteractiemenu", "stopinteraction", "stopinterface", "stopintermezzo", "stopintertext", "stopitemgroup", "stopkadertekst", "stopkantlijn", "stopkleur", "stopknockout", "stopkop", "stoplayout", "stoplinefiller", "stoplinenumbering", "stoplinetable", "stoplinetablebody", "stoplinetablecell", "stoplinetablehead", "stoplocalheadsetup", "stoplocallinecorrection", "stoplocalnotes", "stoplocalsetups", "stoplokalevoetnoten", "stoplua", "stopluacode", "stopluaparameterset", "stopluasetups", "stopmakeup", "stopmargeblok", "stopmarkedcontent", "stopmathmode", "stopmathstyle", "stopmatrices", "stopmcframed", "stopmdformula", "stopmframed", "stopmixedcolumns", "stopmode", "stopmodeset", "stopmodule", "stopmoduletestsection", "stopmpformula", "stopnaar", "stopnamedsection", "stopnamedsubformulas", "stopnarrow", "stopnarrower", "stopnegative", "stopnicelyfilledbox", "stopnobar", "stopnointerference", "stopnotallmodes", "stopnotext", "stopnotmode", "stopomgeving", "stopomlijnd", "stoponderdeel", "stoponderstreep", "stoponderstrepen", "stoponderwerp", "stopopelkaar", "stopopposite", "stopopsomming", "stopoutputstream", "stopoverlay", "stopoverprint", "stopoverstreep", "stopoverstrepen", "stoppagecomment", "stoppagefigure", "stoppagegrid", "stoppagegridspan", "stoppagelayout", "stoppar", "stopparagraaf", "stopparagraph", "stopparagraphs", "stopparagraphscell", "stopparbuilder", "stoppath", "stopplaatsformule", "stopplacepairedbox", "stoppositioning", "stoppositionoverlay", "stoppositive", "stoppostponing", "stopprocessassignmentcommand", "stopprocessassignmentlist", "stopprocesscommacommand", "stopprocesscommalist", "stopprodukt", "stopprojekt", "stopprotect", "stopprotectedcolors", "stoppublicatie", "stoppunctuation", "stoprandomized", "stoprandomseed", "stoprawsetups", "stopreadingfile", "stopreferenceprefix", "stopregel", "stopregelcorrectie", "stopregime", "stopregister", "stopreusableMPgraphic", "stopscript", "stopsdformula", "stopsectionblock", "stopsectionblockenvironment", "stopsectionlevel", "stopsetups", "stopsfrac", "stopshapebox", "stopshift", "stopsidebar", "stopsimplecolumns", "stopsom", "stopspecialitem", "stopspeech", "stopspformula", "stopspraak", "stopspread", "stopstartstop", "stopstaticMPfigure", "stopstaticMPgraphic", "stopstrictinspectnextcharacter", "stopstructurepageregister", "stopstrut", "stopstyle", "stopsubformulas", "stopsubjectlevel", "stopsubonderwerp", "stopsubparagraaf", "stopsubsentence", "stopsubstack", "stopsubsubonderwerp", "stopsubsubparagraaf", "stopsubsubsubonderwerp", "stopsubsubsubparagraaf", "stopsubsubsubsubonderwerp", "stopsubsubsubsubparagraaf", "stopsymbolset", "stoptabel", "stoptable", "stoptablehead", "stoptables", "stoptabletail", "stoptabulate", "stoptabulatehead", "stoptabulatetail", "stoptagged", "stoptbinom", "stoptekstachtergrond", "stoptekstlijn", "stoptexcode", "stoptexdefinition", "stoptext", "stoptextbackgroundmanual", "stoptextcolor", "stoptextcolorintent", "stoptextflow", "stoptitel", "stoptokens", "stoptransparent", "stoptypescript", "stoptypescriptcollection", "stopunderdash", "stopunderdashes", "stopunderdot", "stopunderdots", "stopunderrandom", "stopunderrandoms", "stopunderstrike", "stopunderstrikes", "stopunframed", "stopuniqueMPgraphic", "stopuniqueMPpagegraphic", "stopunpacked", "stopusableMPgraphic", "stopuseMPgraphic", "stopusemathstyleparameter", "stopusingbtxspecification", "stopvbox", "stopvboxregister", "stopvboxtohbox", "stopvboxtohboxseparator", "stopviewerlayer", "stopvtop", "stopvtopregister", "stopxcell", "stopxcellgroup", "stopxfrac", "stopxgroup", "stopxmldisplayverbatim", "stopxmlinlineverbatim", "stopxmlraw", "stopxmlsetups", "stopxrow", "stopxrowgroup", "stopxtable", "stopxtablebody", "stopxtablefoot", "stopxtablehead", "stopxtablenext", "stopxxfrac", "strictdoifelsenextoptional", "strictdoifnextoptionalelse", "stripcharacter", "strippedcsname", "stripspaces", "structurelistuservariable", "structurenumber", "structuretitle", "structureuservariable", "structurevariable", "strut", "strutdp", "strutht", "struthtdp", "struttedbox", "strutwd", "style", "styleinstance", "subonderwerp", "subpaginanummer", "subparagraaf", "subsentence", "substituteincommalist", "subsubonderwerp", "subsubparagraaf", "subsubsubonderwerp", "subsubsubparagraaf", "subsubsubsubonderwerp", "subsubsubsubparagraaf", "subtractfeature", "swapcounts", "swapdimens", "swapface", "swapmacros", "swaptypeface", "switchnaarkorps", "switchstyleonly", "switchtocolor", "switchtointerlinespace", "symbolreference", "symbool", "synchronizeblank", "synchronizeindenting", "synchronizemarking", "synchronizeoutputstreams", "synchronizestrut", "synchronizewhitespace", "systemlog", "systemlogfirst", "systemloglast", "systemsetups", "tLeftarrow", "tLeftrightarrow", "tRightarrow", "taal", "tabel", "tabulateautoline", "tabulateautorule", "tabulateline", "tabulaterule", "taggedctxcommand", "taggedlabeltexts", "tbinom", "tbox", "tekstlijn", "tekstreferentie", "tequal", "testandsplitstring", "testfeature", "testfeatureonce", "testkolom", "testpageonly", "testpagesync", "testpagina", "testtokens", "tex", "texdefinition", "texsetup", "textcitation", "textcite", "textcontrolspace", "textflowcollector", "textmath", "textminus", "textormathchar", "textplus", "textvisiblespace", "tfrac", "thainumerals", "thefirstcharacter", "thenormalizedbodyfontsize", "theremainingcharacters", "thickspace", "thinspace", "thirdoffivearguments", "thirdoffourarguments", "thirdofsixarguments", "thirdofthreearguments", "thirdofthreeunexpanded", "thookleftarrow", "thookrightarrow", "threedigitrounding", "tibetannumerals", "tightlayer", "tinyfont", "titel", "tlap", "tleftarrow", "tleftharpoondown", "tleftharpoonup", "tleftrightarrow", "tleftrightharpoons", "tmapsto", "tochar", "toelichting", "tolinenote", "toongrid", "tooninstellingen", "toonkader", "toonkleur", "toonkleurgroep", "toonkorps", "toonkorpsomgeving", "toonlayout", "toonopmaak", "toonpalet", "toonprint", "toonstruts", "toonsymboolset", "topbox", "topleftbox", "toplinebox", "toprightbox", "topskippedbox", "tracecatcodetables", "tracedfontname", "traceoutputroutines", "tracepositions", "transparencycomponents", "transparent", "trel", "trightarrow", "trightharpoondown", "trightharpoonup", "trightleftharpoons", "trightoverleftarrow", "triplebond", "truefilename", "truefontname", "ttriplerel", "ttwoheadleftarrow", "ttwoheadrightarrow", "twodigitrounding", "tx", "txx", "typ", "type", "typebuffer", "typedefinedbuffer", "typeface", "typefile", "typescriptone", "typescriptprefix", "typescriptthree", "typescripttwo", "typesetbuffer", "typesetfile", "uconvertnumber", "uedcatcodecommand", "uit", "uitgerekt", "undefinevalue", "undepthed", "underbar", "underbars", "underbartext", "underbrace", "underbracetext", "underbracket", "underbrackettext", "underdash", "underdashes", "underdot", "underdots", "underleftarrow", "underleftharpoondown", "underleftharpoonup", "underleftrightarrow", "underparent", "underparenttext", "underrandom", "underrandoms", "underrightarrow", "underrightharpoondown", "underrightharpoonup", "underset", "understrike", "understrikes", "undertwoheadleftarrow", "undertwoheadrightarrow", "undoassign", "unframed", "unhhbox", "unihex", "uniqueMPgraphic", "uniqueMPpagegraphic", "unprotected", "unregisterhyphenationpattern", "unspaceafter", "unspaceargument", "unspaced", "unspacestring", "untexargument", "untexcommand", "uppercased", "uppercasestring", "upperleftdoubleninequote", "upperleftdoublesixquote", "upperleftsingleninequote", "upperleftsinglesixquote", "upperrightdoubleninequote", "upperrightdoublesixquote", "upperrightsingleninequote", "upperrightsinglesixquote", "url", "useMPenvironmentbuffer", "useMPgraphic", "useMPlibrary", "useMPrun", "useMPvariables", "useblankparameter", "usebodyfont", "usebodyfontparameter", "usebtxdataset", "usebtxdefinitions", "usecolors", "usecomponent", "usedummycolorparameter", "usedummystyleandcolor", "usedummystyleparameter", "useenvironment", "useexternalrendering", "usefigurebase", "usefile", "usegridparameter", "useindentingparameter", "useindentnextparameter", "useinterlinespaceparameter", "uselanguageparameter", "useluamodule", "usemathstyleparameter", "useproduct", "useprofileparameter", "useproject", "usereferenceparameter", "userpagenumber", "usesetupsparameter", "usestaticMPfigure", "usesubpath", "usetexmodule", "usezipfile", "utfchar", "utflower", "utfupper", "utilityregisterlength", "vastespatie", "vastespaties", "vboxreference", "veld", "veldstapel", "verbatim", "verbatimstring", "verbergblokken", "verbergen", "verbosenumber", "vergelijkkleurgroep", "vergelijkpalet", "versie", "vertaal", "verticalgrowingbar", "verticalpositionbar", "verwerkblokken", "vglue", "viewerlayer", "vl", "voetnoottekst", "volledigepaginanummer", "volledigregister", "voluit", "vphantom", "vpos", "vsmash", "vsmashbox", "vsmashed", "vspace", "vspacing", "wdofstring", "weekdag", "widthofstring", "widthspanningtext", "wilijnd", "wiskunde", "withoutpt", "word", "words", "wordtonumber", "writedatatolist", "writestatus", "xLeftarrow", "xLeftrightarrow", "xRightarrow", "xdefconvertedargument", "xequal", "xfrac", "xhookleftarrow", "xhookrightarrow", "xleftarrow", "xleftharpoondown", "xleftharpoonup", "xleftrightarrow", "xleftrightharpoons", "xmapsto", "xmladdindex", "xmlafterdocumentsetup", "xmlaftersetup", "xmlall", "xmlappenddocumentsetup", "xmlappendsetup", "xmlapplyselectors", "xmlatt", "xmlattdef", "xmlattribute", "xmlattributedef", "xmlbadinclusions", "xmlbeforedocumentsetup", "xmlbeforesetup", "xmlchainatt", "xmlchainattdef", "xmlchecknamespace", "xmlcommand", "xmlconcat", "xmlconcatrange", "xmlcontext", "xmlcount", "xmldefaulttotext", "xmldirectives", "xmldirectivesafter", "xmldirectivesbefore", "xmldisplayverbatim", "xmldoif", "xmldoifelse", "xmldoifelseempty", "xmldoifelseselfempty", "xmldoifelsetext", "xmldoifelsevalue", "xmldoifnot", "xmldoifnotselfempty", "xmldoifnottext", "xmldoifselfempty", "xmldoiftext", "xmlelement", "xmlfilter", "xmlfirst", "xmlflush", "xmlflushcontext", "xmlflushdocumentsetups", "xmlflushlinewise", "xmlflushpure", "xmlflushspacewise", "xmlflushtext", "xmlinclude", "xmlinclusion", "xmlinclusions", "xmlinfo", "xmlinjector", "xmlinlineverbatim", "xmlinstalldirective", "xmllast", "xmllastatt", "xmllastmatch", "xmlloadbuffer", "xmlloaddata", "xmlloaddirectives", "xmlloadfile", "xmlloadonly", "xmlmain", "xmlmapvalue", "xmlname", "xmlnamespace", "xmlnonspace", "xmlpath", "xmlpos", "xmlposition", "xmlprependdocumentsetup", "xmlprependsetup", "xmlprettyprint", "xmlprocessbuffer", "xmlprocessdata", "xmlprocessfile", "xmlpure", "xmlraw", "xmlrefatt", "xmlregistereddocumentsetups", "xmlregisteredsetups", "xmlregisterns", "xmlremapname", "xmlremapnamespace", "xmlremovedocumentsetup", "xmlremovesetup", "xmlresetdocumentsetups", "xmlresetinjectors", "xmlresetsetups", "xmlsave", "xmlsetentity", "xmlsetfunction", "xmlsetinjectors", "xmlsetsetup", "xmlsetup", "xmlshow", "xmlsnippet", "xmlstrip", "xmlstripnolines", "xmlstripped", "xmlstrippednolines", "xmltag", "xmltexentity", "xmltext", "xmltobuffer", "xmltobufferverbose", "xmltofile", "xmlvalue", "xmlverbatim", "xrel", "xrightarrow", "xrightharpoondown", "xrightharpoonup", "xrightleftharpoons", "xrightoverleftarrow", "xsplitstring", "xtriplerel", "xtwoheadleftarrow", "xtwoheadrightarrow", "xxfrac", "xypos" }, - ["pe"]={ "AMSTEX", "AfterPar", "Alphabeticnumerals", "AmSTeX", "And", "BeforePar", "Big", "Bigg", "Biggl", "Biggm", "Biggr", "Bigl", "Bigm", "Bigr", "CONTEXT", "Cap", "Caps", "Character", "Characters", "ConTeXt", "Context", "ConvertConstantAfter", "ConvertToConstant", "ETEX", "EveryLine", "EveryPar", "GetPar", "GotoPar", "Greeknumerals", "INRSTEX", "LAMSTEX", "LATEX", "LUAJITTEX", "LUATEX", "LaTeX", "LamSTeX", "Lua", "LuaTeX", "LuajitTeX", "METAFONT", "METAFUN", "METAPOST", "MKII", "MKIV", "MKIX", "MKVI", "MKXI", "MONTH", "MONTHLONG", "MONTHSHORT", "MPII", "MPIV", "MPVI", "MPanchor", "MPbetex", "MPc", "MPcode", "MPcolor", "MPcoloronly", "MPcolumn", "MPd", "MPdrawing", "MPfontsizehskip", "MPgetmultipars", "MPgetmultishape", "MPgetposboxes", "MPh", "MPinclusions", "MPleftskip", "MPll", "MPlr", "MPls", "MPmenubuttons", "MPn", "MPoptions", "MPoverlayanchor", "MPp", "MPpage", "MPpardata", "MPplus", "MPpos", "MPpositiongraphic", "MPposset", "MPr", "MPrawvar", "MPregion", "MPrest", "MPrightskip", "MPrs", "MPstring", "MPtext", "MPtransparency", "MPul", "MPur", "MPv", "MPvar", "MPvariable", "MPvv", "MPw", "MPwhd", "MPx", "MPxy", "MPxywhd", "MPy", "MetaFont", "MetaFun", "MetaPost", "NormalizeFontHeight", "NormalizeFontWidth", "NormalizeTextHeight", "NormalizeTextWidth", "Numbers", "PDFETEX", "PDFTEX", "PDFcolor", "PICTEX", "PPCHTEX", "PPCHTeX", "PRAGMA", "PiCTeX", "PointsToBigPoints", "PointsToReal", "PointsToWholeBigPoints", "PtToCm", "ReadFile", "Romannumerals", "ScaledPointsToBigPoints", "ScaledPointsToWholeBigPoints", "Smallcapped", "TABLE", "TEX", "TEXpage", "TaBlE", "TeX", "TheNormalizedFontSize", "TransparencyHack", "VerboseNumber", "WEEKDAY", "WORD", "WORDS", "WidthSpanningText", "Word", "Words", "XETEX", "XeTeX", "abjadnaivenumerals", "abjadnodotnumerals", "abjadnumerals", "activatespacehandler", "adaptcollector", "adaptfontfeature", "adaptpapersize", "addfeature", "addtoJSpreamble", "addtocommalist", "addvalue", "aftersplitstring", "aftertestandsplitstring", "alignmentcharacter", "allinputpaths", "alphabeticnumerals", "alwayscitation", "alwayscite", "ampersand", "anchor", "appendetoks", "appendgvalue", "appendtocommalist", "appendtoks", "appendtoksonce", "appendvalue", "apply", "applyalternativestyle", "applyprocessor", "applytocharacters", "applytofirstcharacter", "applytosplitstringchar", "applytosplitstringcharspaced", "applytosplitstringline", "applytosplitstringlinespaced", "applytosplitstringword", "applytosplitstringwordspaced", "applytowords", "arabicdecimals", "arabicexnumerals", "arabicnumerals", "asciistr", "aside", "assignalfadimension", "assigndimen", "assigndimension", "assignifempty", "assigntranslation", "assignvalue", "assignwidth", "assumelongusagecs", "astype", "attachment", "autocap", "autodirhbox", "autodirvbox", "autodirvtop", "autoinsertnextspace", "automathematics", "autosetups", "availablehsize", "averagecharwidth", "backgroundimage", "backgroundimagefill", "backgroundline", "basegrid", "baselineleftbox", "baselinemiddlebox", "baselinerightbox", "bbox", "beforesplitstring", "beforetestandsplitstring", "big", "bigbodyfont", "bigg", "bigger", "biggl", "biggm", "biggr", "bigl", "bigm", "bigr", "bigskip", "binom", "bitmapimage", "blap", "bleed", "bleedheight", "bleedwidth", "blockligatures", "blockquote", "bodyfontenvironmentlist", "bodyfontsize", "bold", "boldface", "bolditalic", "boldslanted", "booleanmodevalue", "bottombox", "bottomleftbox", "bottomrightbox", "boxcursor", "boxmarker", "boxofsize", "boxreference", "bpos", "bthiddencitation", "btxabbreviatedjournal", "btxaddjournal", "btxalwayscitation", "btxauthorfield", "btxdetail", "btxdirect", "btxdoif", "btxdoifcombiinlistelse", "btxdoifelse", "btxdoifelsecombiinlist", "btxdoifelsesameasprevious", "btxdoifelsesameaspreviouschecked", "btxdoifelseuservariable", "btxdoifnot", "btxdoifsameaspreviouscheckedelse", "btxdoifsameaspreviouselse", "btxdoifuservariableelse", "btxexpandedjournal", "btxfield", "btxfieldname", "btxfieldtype", "btxfirstofrange", "btxflush", "btxflushauthor", "btxflushauthorinverted", "btxflushauthorinvertedshort", "btxflushauthorname", "btxflushauthornormal", "btxflushauthornormalshort", "btxflushsuffix", "btxfoundname", "btxfoundtype", "btxhybridcite", "btxlistcitation", "btxloadjournalist", "btxoneorrange", "btxremapauthor", "btxsavejournalist", "btxsetup", "btxsingularorplural", "btxsingularplural", "btxtextcitation", "calligraphic", "camel", "cap", "catcodetablename", "cbox", "centerbox", "centeredbox", "centerednextbox", "cfrac", "chardescription", "charwidthlanguage", "checkcharacteralign", "checkedchar", "checkedfiller", "checkedstrippedcsname", "checkinjector", "checknextindentation", "checknextinjector", "checkpage", "checkparameters", "checkpreviousinjector", "checksoundtrack", "checktwopassdata", "checkvariables", "chem", "chemical", "chemicalbottext", "chemicalmidtext", "chemicalsymbol", "chemicaltext", "chemicaltoptext", "chineseallnumerals", "chinesecapnumerals", "chinesenumerals", "citation", "cite", "clap", "classfont", "cldcommand", "cldcontext", "cldloadfile", "cldprocessfile", "cleftarrow", "collect", "collectedtext", "collectexpanded", "colorcomponents", "colored", "coloronly", "columnbreak", "combinepages", "commalistelement", "commalistsentence", "commalistsize", "comment", "comparedimension", "comparedimensioneps", "completebtxrendering", "completelist", "completelistofpublications", "completelistofsorts", "completelistofsynonyms", "complexorsimple", "complexorsimpleempty", "composedcollector", "composedlayer", "compresult", "constantdimen", "constantdimenargument", "constantemptyargument", "constantnumber", "constantnumberargument", "contentreference", "continuednumber", "continueifinputfile", "convertargument", "convertcommand", "convertedcounter", "converteddimen", "convertedsubcounter", "convertmonth", "convertvalue", "convertvboxtohbox", "copypages", "copyparameters", "copyposition", "countersubs", "counttoken", "counttokens", "cramped", "crampedclap", "crampedllap", "crampedrlap", "crightarrow", "crightoverleftarrow", "ctop", "ctxcommand", "ctxdirectcommand", "ctxdirectlua", "ctxfunction", "ctxlatecommand", "ctxlatelua", "ctxloadluafile", "ctxlua", "ctxluabuffer", "ctxluacode", "ctxreport", "ctxsprint", "currentassignmentlistkey", "currentassignmentlistvalue", "currentbtxuservariable", "currentcommalistitem", "currentcomponent", "currentenvironment", "currentfeaturetest", "currentinterface", "currentlanguage", "currentlistentrydestinationattribute", "currentlistentrylimitedtext", "currentlistentrynumber", "currentlistentrypagenumber", "currentlistentryreferenceattribute", "currentlistentrytitle", "currentlistentrytitlerendered", "currentlistsymbol", "currentmainlanguage", "currentmessagetext", "currentmoduleparameter", "currentoutputstream", "currentproduct", "currentproject", "currentregime", "currentregisterpageuserdata", "currentresponses", "currenttime", "currentvalue", "currentxtablecolumn", "currentxtablerow", "datasetvariable", "dayoftheweek", "dayspermonth", "dbinom", "decrement", "decrementcounter", "decrementedcounter", "decrementpagenumber", "decrementsubpagenumber", "decrementvalue", "defaultinterface", "defaultobjectpage", "defaultobjectreference", "defcatcodecommand", "defconvertedargument", "defconvertedcommand", "defconvertedvalue", "defineMPinstance", "defineTABLEsetup", "defineactivecharacter", "definealternativestyle", "defineanchor", "defineattachment", "defineattribute", "definebackground", "definebar", "definebodyfontswitch", "definebreakpoint", "definebreakpoints", "definebtx", "definebtxdataset", "definebtxregister", "definebtxrendering", "definebutton", "definecapitals", "definecharacterkerning", "definecharacterspacing", "definechemical", "definechemicals", "definechemicalsymbol", "definecollector", "definecomment", "definecomplexorsimple", "definecomplexorsimpleempty", "defineconversionset", "definecounter", "definedataset", "definedelimitedtext", "definedfont", "defineeffect", "defineexpandable", "defineexternalfigure", "definefallbackfamily", "definefieldbody", "definefieldbodyset", "definefieldcategory", "definefileconstant", "definefilefallback", "definefilesynonym", "definefiller", "definefirstline", "definefittingpage", "definefontalternative", "definefontfallback", "definefontfamily", "definefontfamilypreset", "definefontfeature", "definefontfile", "definefontsize", "definefontsolution", "defineformula", "defineformulaalternative", "defineformulaframed", "defineframedcontent", "definefrozenfont", "defineglobalcolor", "definegraphictypesynonym", "definegridsnapping", "defineheadalternative", "definehelp", "definehigh", "definehighlight", "definehspace", "definehypenationfeatures", "defineindentedtext", "defineindenting", "defineinitial", "defineinsertion", "defineinteraction", "defineinteractionbar", "defineinterfaceconstant", "defineinterfaceelement", "defineinterfacevariable", "defineinterlinespace", "defineintermediatecolor", "defineitems", "definelabelclass", "definelayerpreset", "definelinefiller", "definelinenote", "definelinenumbering", "definelines", "definelistalternative", "definelistextra", "definelow", "definelowhigh", "definelowmidhigh", "definemarginblock", "definemargindata", "definemarker", "definemathcases", "definemathcommand", "definemathdoubleextensible", "definemathematics", "definemathextensible", "definemathfence", "definemathfraction", "definemathframed", "definemathmatrix", "definemathornament", "definemathoverextensible", "definemathovertextextensible", "definemathradical", "definemathstackers", "definemathstyle", "definemathtriplet", "definemathunderextensible", "definemathundertextextensible", "definemathunstacked", "definemeasure", "definemessageconstant", "definemixedcolumns", "definemode", "definemultitonecolor", "definenamedcolor", "definenamespace", "definenarrower", "definenote", "defineornament", "defineoutputroutine", "defineoutputroutinecommand", "definepage", "definepagechecker", "definepagegrid", "definepagegridarea", "definepagegridspan", "definepageinjection", "definepageinjectionalternative", "definepageshift", "definepagestate", "definepairedbox", "defineparagraph", "defineparallel", "defineparbuilder", "definepositioning", "defineprefixset", "defineprocesscolor", "defineprocessor", "definepushbutton", "definepushsymbol", "definerenderingwindow", "defineresetset", "definescale", "definescript", "definesectionlevels", "defineselector", "defineseparatorset", "defineshift", "definesidebar", "definesort", "definespotcolor", "definestyleinstance", "definesubformula", "definesynonym", "definesystemattribute", "definesystemconstant", "definesystemvariable", "definetabulation", "definetextbackground", "definetextflow", "definetooltip", "definetransparency", "definetwopasslist", "definetypeface", "definetypescriptprefix", "definetypescriptsynonym", "definetypesetting", "defineunit", "defineviewerlayer", "definevspace", "definevspacing", "definevspacingamount", "definextable", "delimited", "delimitedtext", "depthofstring", "depthonlybox", "depthspanningtext", "determinenoflines", "devanagarinumerals", "dfrac", "digits", "dimensiontocount", "directcolor", "directcolored", "directconvertedcounter", "directdummyparameter", "directgetboxllx", "directgetboxlly", "directhighlight", "directlocalframed", "directluacode", "directselect", "directsetbar", "directsetup", "directsymbol", "directvspacing", "dis", "disabledirectives", "disableexperiments", "disablemode", "disableoutputstream", "disableparpositions", "disableregime", "disabletrackers", "displaymath", "displaymathematics", "displaymessage", "distributedhsize", "dividedsize", "doadaptleftskip", "doadaptrightskip", "doaddfeature", "doassign", "doassignempty", "doboundtext", "docheckassignment", "docheckedpagestate", "docheckedpair", "documentvariable", "dodoubleargument", "dodoubleargumentwithset", "dodoubleempty", "dodoubleemptywithset", "dodoublegroupempty", "doeassign", "doexpandedrecurse", "dogetattribute", "dogetattributeid", "dogetcommacommandelement", "dogobbledoubleempty", "dogobblesingleempty", "doif", "doifMPgraphicelse", "doifallcommon", "doifallcommonelse", "doifalldefinedelse", "doifallmodes", "doifallmodeselse", "doifassignmentelse", "doifblackelse", "doifbothsides", "doifbothsidesoverruled", "doifboxelse", "doifbufferelse", "doifcolor", "doifcolorelse", "doifcommandhandler", "doifcommandhandlerelse", "doifcommon", "doifcommonelse", "doifcontent", "doifconversiondefinedelse", "doifconversionnumberelse", "doifcounter", "doifcounterelse", "doifcurrentfonthasfeatureelse", "doifdefined", "doifdefinedcounter", "doifdefinedcounterelse", "doifdefinedelse", "doifdimensionelse", "doifdimenstringelse", "doifdocumentargument", "doifdocumentargumentelse", "doifdocumentfilename", "doifdocumentfilenameelse", "doifdrawingblackelse", "doifelse", "doifelseMPgraphic", "doifelseallcommon", "doifelsealldefined", "doifelseallmodes", "doifelseassignment", "doifelseblack", "doifelsebox", "doifelsebuffer", "doifelsecolor", "doifelsecommandhandler", "doifelsecommon", "doifelseconversiondefined", "doifelseconversionnumber", "doifelsecounter", "doifelsecurrentfonthasfeature", "doifelsecurrentsortingused", "doifelsecurrentsynonymshown", "doifelsecurrentsynonymused", "doifelsedefined", "doifelsedefinedcounter", "doifelsedimension", "doifelsedimenstring", "doifelsedocumentargument", "doifelsedocumentfilename", "doifelsedrawingblack", "doifelseempty", "doifelseemptyvalue", "doifelseemptyvariable", "doifelseenv", "doifelsefastoptionalcheck", "doifelsefastoptionalcheckcs", "doifelsefieldbody", "doifelsefieldcategory", "doifelsefigure", "doifelsefile", "doifelsefiledefined", "doifelsefileexists", "doifelsefirstchar", "doifelseflagged", "doifelsefontchar", "doifelsefontpresent", "doifelsefontsynonym", "doifelsehasspace", "doifelsehelp", "doifelseincsname", "doifelseinelement", "doifelseinputfile", "doifelseinsertion", "doifelseinset", "doifelseinstring", "doifelseinsymbolset", "doifelseintoks", "doifelseintwopassdata", "doifelseitalic", "doifelselanguage", "doifelselayerdata", "doifelselayoutdefined", "doifelselayoutsomeline", "doifelselayouttextline", "doifelseleapyear", "doifelselist", "doifelselocation", "doifelselocfile", "doifelsemainfloatbody", "doifelsemarking", "doifelsemeaning", "doifelsemessage", "doifelsemode", "doifelsenextbgroup", "doifelsenextbgroupcs", "doifelsenextchar", "doifelsenextoptional", "doifelsenextoptionalcs", "doifelsenextparenthesis", "doifelsenonzeropositive", "doifelsenoteonsamepage", "doifelsenothing", "doifelsenumber", "doifelseobjectfound", "doifelseobjectreferencefound", "doifelseoddpage", "doifelseoddpagefloat", "doifelseoldercontext", "doifelseolderversion", "doifelseoverlapping", "doifelseoverlay", "doifelseparallel", "doifelseparentfile", "doifelsepath", "doifelsepathexists", "doifelsepatterns", "doifelseposition", "doifelsepositionaction", "doifelsepositiononpage", "doifelsepositionsonsamepage", "doifelsepositionsonthispage", "doifelsepositionsused", "doifelsereferencefound", "doifelserightpagefloat", "doifelserighttoleftinbox", "doifelsesamelinereference", "doifelsesamestring", "doifelsesetups", "doifelsesomebackground", "doifelsesomespace", "doifelsesomething", "doifelsesometoks", "doifelsestringinstring", "doifelsestructurelisthasnumber", "doifelsestructurelisthaspage", "doifelsesymboldefined", "doifelsesymbolset", "doifelsetext", "doifelsetextflow", "doifelsetextflowcollector", "doifelsetypingfile", "doifelseundefined", "doifelseurldefined", "doifelsevalue", "doifelsevaluenothing", "doifelsevariable", "doifempty", "doifemptyelse", "doifemptytoks", "doifemptyvalue", "doifemptyvalueelse", "doifemptyvariable", "doifemptyvariableelse", "doifenv", "doifenvelse", "doiffastoptionalcheckcselse", "doiffastoptionalcheckelse", "doiffieldbodyelse", "doiffieldcategoryelse", "doiffigureelse", "doiffile", "doiffiledefinedelse", "doiffileelse", "doiffileexistselse", "doiffirstcharelse", "doifflaggedelse", "doiffontcharelse", "doiffontpresentelse", "doiffontsynonymelse", "doifhasspaceelse", "doifhelpelse", "doifincsnameelse", "doifinelementelse", "doifinputfileelse", "doifinsertionelse", "doifinset", "doifinsetelse", "doifinstring", "doifinstringelse", "doifinsymbolset", "doifinsymbolsetelse", "doifintokselse", "doifintwopassdataelse", "doifitalicelse", "doiflanguageelse", "doiflayerdataelse", "doiflayoutdefinedelse", "doiflayoutsomelineelse", "doiflayouttextlineelse", "doifleapyearelse", "doiflistelse", "doiflocationelse", "doiflocfileelse", "doifmainfloatbodyelse", "doifmarkingelse", "doifmeaningelse", "doifmessageelse", "doifmode", "doifmodeelse", "doifnextbgroupcselse", "doifnextbgroupelse", "doifnextcharelse", "doifnextoptionalcselse", "doifnextoptionalelse", "doifnextparenthesiselse", "doifnonzeropositiveelse", "doifnot", "doifnotallcommon", "doifnotallmodes", "doifnotcommandhandler", "doifnotcommon", "doifnotcounter", "doifnotdocumentargument", "doifnotdocumentfilename", "doifnotempty", "doifnotemptyvalue", "doifnotemptyvariable", "doifnotenv", "doifnoteonsamepageelse", "doifnotescollected", "doifnotfile", "doifnotflagged", "doifnothing", "doifnothingelse", "doifnotinset", "doifnotinsidesplitfloat", "doifnotinstring", "doifnotmode", "doifnotnumber", "doifnotsamestring", "doifnotsetups", "doifnotvalue", "doifnotvariable", "doifnumber", "doifnumberelse", "doifobjectfoundelse", "doifobjectreferencefoundelse", "doifoddpageelse", "doifoddpagefloatelse", "doifoldercontextelse", "doifolderversionelse", "doifoverlappingelse", "doifoverlayelse", "doifparallelelse", "doifparentfileelse", "doifpathelse", "doifpathexistselse", "doifpatternselse", "doifposition", "doifpositionaction", "doifpositionactionelse", "doifpositionelse", "doifpositiononpageelse", "doifpositionsonsamepageelse", "doifpositionsonthispageelse", "doifpositionsusedelse", "doifreferencefoundelse", "doifrightpagefloatelse", "doifrighttoleftinboxelse", "doifsamelinereferenceelse", "doifsamestring", "doifsamestringelse", "doifsetups", "doifsetupselse", "doifsomebackground", "doifsomebackgroundelse", "doifsomespaceelse", "doifsomething", "doifsomethingelse", "doifsometoks", "doifsometokselse", "doifstringinstringelse", "doifstructurelisthasnumberelse", "doifstructurelisthaspageelse", "doifsymboldefinedelse", "doifsymbolsetelse", "doiftext", "doiftextelse", "doiftextflowcollectorelse", "doiftextflowelse", "doiftypingfileelse", "doifundefined", "doifundefinedcounter", "doifundefinedelse", "doifurldefinedelse", "doifvalue", "doifvalueelse", "doifvaluenothing", "doifvaluenothingelse", "doifvaluesomething", "doifvariable", "doifvariableelse", "doindentation", "dollar", "doloop", "doloopoverlist", "donothing", "dontconvertfont", "dontleavehmode", "dontpermitspacesbetweengroups", "dopositionaction", "doprocesslocalsetups", "doquadrupleargument", "doquadrupleempty", "doquadruplegroupempty", "doquintupleargument", "doquintupleempty", "doquintuplegroupempty", "dorechecknextindentation", "dorecurse", "dorepeatwithcommand", "doreplacefeature", "doresetandafffeature", "doresetattribute", "dorotatebox", "dosetattribute", "dosetleftskipadaption", "dosetrightskipadaption", "dosetupcheckedinterlinespace", "doseventupleargument", "doseventupleempty", "dosingleargument", "dosingleempty", "dosinglegroupempty", "dosixtupleargument", "dosixtupleempty", "dostepwiserecurse", "dosubtractfeature", "dotfskip", "dotoks", "dotripleargument", "dotripleargumentwithset", "dotripleempty", "dotripleemptywithset", "dotriplegroupempty", "doublebar", "doublebond", "doublebrace", "doublebracket", "doubleparent", "dowith", "dowithnextbox", "dowithnextboxcontent", "dowithnextboxcontentcs", "dowithnextboxcs", "dowithpargument", "dowithrange", "dowithwargument", "dpofstring", "dummydigit", "dummyparameter", "eTeX", "edefconvertedargument", "efcmaxheight", "efcmaxwidth", "efcminheight", "efcminwidth", "efcparameter", "effect", "elapsedseconds", "elapsedtime", "eleftarrowfill", "eleftharpoondownfill", "eleftharpoonupfill", "eleftrightarrowfill", "emphasisboldface", "emphasistypeface", "emspace", "enabledirectives", "enableexperiments", "enablemode", "enableoutputstream", "enableparpositions", "enableregime", "enabletrackers", "enskip", "enspace", "env", "envvar", "eoverbarfill", "eoverbracefill", "eoverbracketfill", "eoverparentfill", "epos", "equaldigits", "erightarrowfill", "erightharpoondownfill", "erightharpoonupfill", "etwoheadrightarrowfill", "eunderbarfill", "eunderbracefill", "eunderbracketfill", "eunderparentfill", "executeifdefined", "exitloop", "exitloopnow", "expandcheckedcsname", "expanded", "expandfontsynonym", "externalfigurecollectionmaxheight", "externalfigurecollectionmaxwidth", "externalfigurecollectionminheight", "externalfigurecollectionminwidth", "externalfigurecollectionparameter", "fakebox", "fastdecrement", "fastincrement", "fastlocalframed", "fastscale", "fastsetup", "fastsetupwithargument", "fastsetupwithargumentswapped", "fastswitchtobodyfont", "fastsxsy", "feature", "fence", "fenced", "fetchallmarkings", "fetchallmarks", "fetchmark", "fetchmarking", "fetchonemark", "fetchonemarking", "fetchruntinecommand", "fetchtwomarkings", "fetchtwomarks", "fieldbody", "fifthoffivearguments", "fifthofsixarguments", "figurefilename", "figurefilepath", "figurefiletype", "figurefullname", "figureheight", "figurenaturalheight", "figurenaturalwidth", "figuresymbol", "figurewidth", "filename", "filledhboxb", "filledhboxc", "filledhboxg", "filledhboxk", "filledhboxm", "filledhboxr", "filledhboxy", "filler", "filterfromnext", "filterfromvalue", "filterpages", "filterreference", "findtwopassdata", "finishregisterentry", "firstcharacter", "firstcounter", "firstcountervalue", "firstoffivearguments", "firstoffourarguments", "firstofoneargument", "firstofoneunexpanded", "firstofsixarguments", "firstofthreearguments", "firstofthreeunexpanded", "firstoftwoarguments", "firstoftwounexpanded", "firstrealpage", "firstrealpagenumber", "firstsubcountervalue", "firstsubpage", "firstsubpagenumber", "firstuserpage", "firstuserpagenumber", "fitfieldframed", "fittopbaselinegrid", "flag", "floatuserdataparameter", "flushboxregister", "flushcollector", "flushlayer", "flushlocalfloats", "flushnextbox", "flushnotes", "flushoutputstream", "flushshapebox", "flushtextflow", "flushtokens", "flushtoks", "fontalternative", "fontbody", "fontchar", "fontcharbyindex", "fontclass", "fontclassname", "fontface", "fontfeaturelist", "fontsize", "fontstyle", "forcecharacterstripping", "forcelocalfloats", "forgeteverypar", "forgetparameters", "formula", "foundbox", "fourthoffivearguments", "fourthoffourarguments", "fourthofsixarguments", "frac", "frameddimension", "framedparameter", "framedtext", "freezedimenmacro", "freezemeasure", "frenchspacing", "fromlinenote", "frozenhbox", "gdefconvertedargument", "gdefconvertedcommand", "getMPdrawing", "getMPlayer", "getboxllx", "getboxlly", "getbufferdata", "getcommacommandsize", "getcommalistsize", "getdayoftheweek", "getdayspermonth", "getdefinedbuffer", "getdocumentargument", "getdocumentargumentdefault", "getdocumentfilename", "getdummyparameters", "getemptyparameters", "geteparameters", "getexpandedparameters", "getfiguredimensions", "getfirstcharacter", "getfirsttwopassdata", "getfromcommacommand", "getfromcommalist", "getfromtwopassdata", "getglyphdirect", "getglyphstyled", "getgparameters", "getlasttwopassdata", "getlocalfloat", "getlocalfloats", "getmessage", "getnamedglyphdirect", "getnamedglyphstyled", "getnamedtwopassdatalist", "getnaturaldimensions", "getnoflines", "getobject", "getobjectdimensions", "getpaletsize", "getparameters", "getprivatechar", "getprivateslot", "getrandomcount", "getrandomdimen", "getrandomfloat", "getrandomnumber", "getrandomseed", "getraweparameters", "getrawgparameters", "getrawnoflines", "getrawparameters", "getrawxparameters", "getreference", "getreferenceentry", "getroundednoflines", "getsubstring", "gettwopassdata", "gettwopassdatalist", "getuvalue", "getvalue", "getvariable", "getvariabledefault", "getxparameters", "globaldisablemode", "globalenablemode", "globalletempty", "globalpopbox", "globalpopmacro", "globalpreventmode", "globalprocesscommalist", "globalpushbox", "globalpushmacro", "globalswapcounts", "globalswapdimens", "globalswapmacros", "globalundefine", "glyphfontfile", "gobbledoubleempty", "gobbleeightarguments", "gobblefivearguments", "gobblefiveoptionals", "gobblefourarguments", "gobblefouroptionals", "gobbleninearguments", "gobbleoneargument", "gobbleoneoptional", "gobblesevenarguments", "gobblesingleempty", "gobblesixarguments", "gobblespacetokens", "gobbletenarguments", "gobblethreearguments", "gobblethreeoptionals", "gobbletwoarguments", "gobbletwooptionals", "gobbleuntil", "gobbleuntilrelax", "grabbufferdata", "grabbufferdatadirect", "grabuntil", "grayvalue", "greedysplitstring", "greeknumerals", "groupedcommand", "gsetboxllx", "gsetboxlly", "gujaratinumerals", "gurmurkhinumerals", "hairspace", "halfwaybox", "handletokens", "handwritten", "hash", "hboxofvbox", "hboxreference", "hdofstring", "headhbox", "headnumbercontent", "headnumberdistance", "headnumberwidth", "headreferenceattributes", "headsetupspacing", "headtextcontent", "headtextdistance", "headtextwidth", "headvbox", "headwidth", "heightanddepthofstring", "heightofstring", "heightspanningtext", "helptext", "hglue", "hiddenbar", "hiddencitation", "hiddencite", "highlight", "highordinalstr", "hilo", "himilo", "horizontalgrowingbar", "horizontalpositionbar", "hphantom", "hpos", "hsizefraction", "hsmash", "hsmashbox", "hsmashed", "hspace", "htdpofstring", "htofstring", "hyphen", "hyphenatedcoloredword", "hyphenatedfile", "hyphenatedfilename", "hyphenatedhbox", "hyphenatedpar", "hyphenatedurl", "hyphenatedword", "ibox", "ifassignment", "iff", "ifinobject", "ifinoutputstream", "ifparameters", "iftrialtypesetting", "ignoreimplicitspaces", "ignorevalue", "immediatesavetwopassdata", "impliedby", "implies", "includemenu", "includeversioninfo", "increment", "incrementcounter", "incrementedcounter", "incrementpagenumber", "incrementsubpagenumber", "incrementvalue", "indentation", "infofont", "infofontbold", "inheritparameter", "inhibitblank", "initializeboxstack", "inlinebuffer", "inlinedbox", "inlinemath", "inlinemathematics", "inlinemessage", "inlineordisplaymath", "inlinerange", "inmframed", "innerflushshapebox", "input", "inputfilebarename", "inputfilename", "inputfilerealsuffix", "inputfilesuffix", "inputgivenfile", "insertpages", "installactionhandler", "installactivecharacter", "installanddefineactivecharacter", "installattributestack", "installautocommandhandler", "installautosetuphandler", "installbasicautosetuphandler", "installbasicparameterhandler", "installbottomframerenderer", "installcommandhandler", "installcorenamespace", "installdefinehandler", "installdefinitionset", "installdefinitionsetmember", "installdirectcommandhandler", "installdirectparameterhandler", "installdirectparametersethandler", "installdirectsetuphandler", "installdirectstyleandcolorhandler", "installframedautocommandhandler", "installframedcommandhandler", "installleftframerenderer", "installnamespace", "installoutputroutine", "installpagearrangement", "installparameterhandler", "installparameterhashhandler", "installparametersethandler", "installparentinjector", "installrightframerenderer", "installrootparameterhandler", "installsetuphandler", "installsetuponlycommandhandler", "installshipoutmethod", "installsimplecommandhandler", "installsimpleframedcommandhandler", "installstyleandcolorhandler", "installswitchcommandhandler", "installswitchsetuphandler", "installtexdirective", "installtextracker", "installtopframerenderer", "installunitsseparator", "installunitsspace", "installversioninfo", "integerrounding", "intertext", "invokepageheandler", "istltdir", "istrtdir", "italic", "italicbold", "italiccorrection", "itemtag", "jobfilename", "jobfilesuffix", "kap", "keeplinestogether", "keepunwantedspaces", "kerncharacters", "koreancirclenumerals", "koreannumerals", "koreannumeralsc", "koreannumeralsp", "koreanparentnumerals", "languageCharacters", "languagecharacters", "languagecharwidth", "lastcounter", "lastcountervalue", "lastdigit", "lastlinewidth", "lastnaturalboxdp", "lastnaturalboxht", "lastnaturalboxwd", "lastpredefinedsymbol", "lastrealpage", "lastrealpagenumber", "lastsubcountervalue", "lastsubpage", "lastsubpagenumber", "lasttwodigits", "lastuserpage", "lastuserpagenumber", "lateluacode", "layeredtext", "layerheight", "layerwidth", "lazysavetaggedtwopassdata", "lazysavetwopassdata", "lbox", "left", "leftbottombox", "leftbox", "lefthbox", "leftorrighthbox", "leftorrightvbox", "leftorrightvtop", "leftskipadaption", "leftsubguillemot", "lefttopbox", "lefttorighthbox", "lefttorightvbox", "lefttorightvtop", "letbeundefined", "letcatcodecommand", "letcscsname", "letcsnamecs", "letcsnamecsname", "letdummyparameter", "letempty", "letgvalue", "letgvalueempty", "letgvalurelax", "letterampersand", "letterat", "letterbackslash", "letterbar", "letterbgroup", "letterclosebrace", "lettercolon", "letterdollar", "letterdoublequote", "letteregroup", "letterescape", "letterexclamationmark", "letterhash", "letterhat", "letterleftbrace", "letterless", "lettermore", "letteropenbrace", "letterpercent", "letterquestionmark", "letterrightbrace", "lettersinglequote", "letterslash", "letterspacing", "lettertilde", "letterunderscore", "letvalue", "letvalueempty", "letvaluerelax", "lfence", "lhbox", "limitatelines", "limitatetext", "limtatefirstline", "linespanningtext", "listcitation", "listcite", "listnamespaces", "llap", "loadanyfile", "loadanyfileonce", "loadbtxdefinitionfile", "loadbtxreplacementfile", "loadcldfile", "loadcldfileonce", "loadfontgoodies", "loadluafile", "loadluafileonce", "loadspellchecklist", "loadtexfile", "loadtexfileonce", "loadtypescriptfile", "localframed", "localframedwithsettings", "localhsize", "localpopbox", "localpopmacro", "localpushbox", "localpushmacro", "localundefine", "locatedfilepath", "locatefilepath", "locfilename", "lomihi", "lowerbox", "lowercased", "lowercasestring", "lowerleftdoubleninequote", "lowerleftsingleninequote", "lowerrightdoubleninequote", "lowerrightsingleninequote", "lrtbbox", "ltop", "luaTeX", "luacode", "luaconditional", "luaenvironment", "luaexpanded", "luafunction", "luajitTeX", "luamajorversion", "luaminorversion", "luaparameterset", "luasetup", "luaversion", "m", "mLeftarrow", "mLeftrightarrow", "mRightarrow", "makecharacteractive", "makerawcommalist", "makestrutofbox", "mapfontsize", "margindata", "markcontent", "markinjector", "mat", "math", "mathbf", "mathbi", "mathblackboard", "mathbs", "mathcommand", "mathdefault", "mathfraktur", "mathfunction", "mathit", "mathitalic", "mathop", "mathrm", "mathscript", "mathsl", "mathss", "mathtext", "mathtextbf", "mathtextbi", "mathtextbs", "mathtextit", "mathtextsl", "mathtexttf", "mathtf", "mathtriplet", "mathtt", "mathupright", "mathword", "mathwordbf", "mathwordbi", "mathwordbs", "mathwordit", "mathwordsl", "mathwordtf", "mbox", "mcframed", "md", "measure", "measured", "medskip", "medspace", "mequal", "message", "metaTeX", "mfence", "mframed", "mfunction", "mfunctionlabeltext", "mhbox", "mhookleftarrow", "mhookrightarrow", "middle", "middlebox", "midhbox", "minimalhbox", "mixedcaps", "mkvibuffer", "mleftarrow", "mleftharpoondown", "mleftharpoonup", "mleftrightarrow", "mleftrightharpoons", "mmapsto", "moduleparameter", "molecule", "mono", "monobold", "mononormal", "monthlong", "monthshort", "mp", "mprandomnumber", "mrel", "mrightarrow", "mrightharpoondown", "mrightharpoonup", "mrightleftharpoons", "mrightoverleftarrow", "mtext", "mtriplerel", "mtwoheadleftarrow", "mtwoheadrightarrow", "namedheadnumber", "namedstructureheadlocation", "namedstructureuservariable", "namedstructurevariable", "namedtaggedlabeltexts", "naturalhbox", "naturalhpack", "naturalvbox", "naturalvcenter", "naturalvpack", "naturalvtop", "naturalwd", "negatecolorbox", "negated", "negthinspace", "newattribute", "newcatcodetable", "newcounter", "newevery", "newfrenchspacing", "newmode", "newsignal", "newsystemmode", "nextbox", "nextboxdp", "nextboxht", "nextboxhtdp", "nextboxwd", "nextcounter", "nextcountervalue", "nextdepth", "nextparagraphs", "nextrealpage", "nextrealpagenumber", "nextsubcountervalue", "nextsubpage", "nextsubpagenumber", "nextuserpage", "nextuserpagenumber", "nobar", "nocitation", "nocite", "nodetostring", "noffigurepages", "noflines", "noflocalfloats", "noindentation", "noitem", "nonfrenchspacing", "nonmathematics", "normal", "normalboldface", "normalframedwithsettings", "normalizebodyfontsize", "normalizedfontsize", "normalizefontdepth", "normalizefontheight", "normalizefontline", "normalizefontwidth", "normalizetextdepth", "normalizetextheight", "normalizetextline", "normalizetextwidth", "normaltypeface", "notesymbol", "ntimes", "numberofpoints", "obeydepth", "objectdepth", "objectheight", "objectmargin", "objectwidth", "obox", "offset", "offsetbox", "onedigitrounding", "ordinaldaynumber", "ordinalstr", "ornamenttext", "outputfilename", "outputstreambox", "outputstreamcopy", "outputstreamunvbox", "outputstreamunvcopy", "over", "overbar", "overbars", "overbartext", "overbarunderbar", "overbrace", "overbracetext", "overbraceunderbrace", "overbracket", "overbrackettext", "overbracketunderbracket", "overlaybutton", "overlaycolor", "overlaydepth", "overlayfigure", "overlayheight", "overlaylinecolor", "overlaylinewidth", "overlayoffset", "overlayrollbutton", "overlaywidth", "overleftarrow", "overleftharpoondown", "overleftharpoonup", "overleftrightarrow", "overloaderror", "overparent", "overparenttext", "overparentunderparent", "overrightarrow", "overrightharpoondown", "overrightharpoonup", "overset", "overstrike", "overstrikes", "overtwoheadleftarrow", "overtwoheadrightarrow", "pagearea", "pagebreak", "pagefigure", "pagegridspanwidth", "pageinjection", "pagestaterealpage", "paletsize", "pdfTeX", "pdfactualtext", "pdfbackendactualtext", "pdfbackendcurrentresources", "pdfbackendsetcatalog", "pdfbackendsetcolorspace", "pdfbackendsetextgstate", "pdfbackendsetinfo", "pdfbackendsetname", "pdfbackendsetpageattribute", "pdfbackendsetpageresource", "pdfbackendsetpagesattribute", "pdfbackendsetpattern", "pdfbackendsetshade", "pdfcolor", "pdfeTeX", "percent", "percentdimen", "permitcaretescape", "permitcircumflexescape", "permitspacesbetweengroups", "persiandecimals", "persiannumerals", "phantom", "phantombox", "pickupgroupedcommand", "placeattachments", "placebtxrendering", "placecitation", "placecomments", "placecurrentformulanumber", "placedbox", "placefloatwithsetups", "placeframed", "placehelp", "placeinitial", "placelayer", "placelayeredtext", "placelistofpublications", "placelistofsorts", "placelistofsynonyms", "placelocalnotes", "placement", "placenamedfloat", "placenamedformula", "placenotes", "placepairedbox", "placeparallel", "placerenderingwindow", "popattribute", "popmacro", "popmode", "popsystemmode", "positionoverlay", "positionregionoverlay", "postponenotes", "predefinedfont", "predefinefont", "predefinesymbol", "prefixedpagenumber", "prependetoks", "prependgvalue", "prependtocommalist", "prependtoks", "prependtoksonce", "prependvalue", "presetdocument", "presetfieldsymbols", "pretocommalist", "prevcounter", "prevcountervalue", "preventmode", "prevrealpage", "prevrealpagenumber", "prevsubcountervalue", "prevsubpage", "prevsubpagenumber", "prevuserpage", "prevuserpagenumber", "procent", "processMPbuffer", "processMPfigurefile", "processaction", "processallactionsinset", "processassignlist", "processassignmentcommand", "processassignmentlist", "processbetween", "processbodyfontenvironmentlist", "processcolorcomponents", "processcommacommand", "processcommalist", "processcommalistwithparameters", "processcontent", "processfile", "processfilemany", "processfilenone", "processfileonce", "processfirstactioninset", "processisolatedchars", "processisolatedwords", "processlinetablebuffer", "processlinetablefile", "processlist", "processmonth", "processranges", "processseparatedlist", "processtexbuffer", "processtokens", "processuntil", "processxtablebuffer", "processyear", "profiledbox", "profilegivenbox", "pseudoMixedCapped", "pseudoSmallCapped", "pseudoSmallcapped", "pseudosmallcapped", "purenumber", "pushattribute", "pushbutton", "pushmacro", "pushmode", "pushoutputstream", "pushsystemmode", "qquad", "quad", "quads", "quitcommalist", "quitprevcommalist", "quittypescriptscanning", "raisebox", "randomizetext", "randomnumber", "rawcounter", "rawcountervalue", "rawdate", "rawdoifelseinset", "rawdoifinset", "rawdoifinsetelse", "rawgetparameters", "rawprocessaction", "rawprocesscommacommand", "rawprocesscommalist", "rawstructurelistuservariable", "rawsubcountervalue", "rbox", "readfile", "readfixfile", "readjobfile", "readlocfile", "readsetfile", "readsysfile", "readtexfile", "readxmlfile", "realSmallCapped", "realSmallcapped", "realpagenumber", "realsmallcapped", "recursedepth", "recurselevel", "recursestring", "redoconvertfont", "referenceprefix", "registerattachment", "registerctxluafile", "registerexternalfigure", "registerfontclass", "registerhyphenationexception", "registerhyphenationpattern", "registermenubuttons", "registersort", "registersynonym", "registerunit", "regular", "relatemarking", "relateparameterhandlers", "relaxvalueifundefined", "remainingcharacters", "removebottomthings", "removedepth", "removefromcommalist", "removelastskip", "removelastspace", "removemarkedcontent", "removepunctuation", "removesubstring", "removetoks", "removeunwantedspaces", "replacefeature", "replaceincommalist", "replaceword", "rescan", "rescanwithsetup", "resetMPdrawing", "resetMPenvironment", "resetMPinstance", "resetallattributes", "resetandaddfeature", "resetbar", "resetbreakpoints", "resetbuffer", "resetcharacteralign", "resetcharacterkerning", "resetcharacterspacing", "resetcharacterstripping", "resetcollector", "resetcounter", "resetdigitsmanipulation", "resetdirection", "resetfeature", "resetflag", "resetfontcolorsheme", "resetfontfallback", "resetfontsolution", "resethyphenationfeatures", "resetinjector", "resetinteractionmenu", "resetitaliccorrection", "resetlayer", "resetlocalfloats", "resetmarker", "resetmode", "resetpagenumber", "resetparallel", "resetpath", "resetpenalties", "resetprofile", "resetreference", "resetreplacement", "resetscript", "resetsetups", "resetshownsynonyms", "resetsubpagenumber", "resetsymbolset", "resetsystemmode", "resettimer", "resettrackers", "resettrialtypesetting", "resetusedsortings", "resetusedsynonyms", "resetuserpagenumber", "resetvalue", "resetvisualizers", "reshapebox", "resolvedglyphdirect", "resolvedglyphstyled", "restartcounter", "restorebox", "restorecatcodes", "restorecounter", "restorecurrentattributes", "restoreendofline", "restoreglobalbodyfont", "reusableMPgraphic", "reuseMPgraphic", "reuserandomseed", "revivefeature", "rfence", "rhbox", "right", "rightbottombox", "rightbox", "righthbox", "rightorleftpageaction", "rightskipadaption", "rightsubguillemot", "righttolefthbox", "righttoleftvbox", "righttoleftvtop", "righttopbox", "rlap", "robustaddtocommalist", "robustdoifelseinset", "robustdoifinsetelse", "robustpretocommalist", "rollbutton", "roman", "rtop", "ruledhbox", "ruledhpack", "ruledmbox", "ruledtopv", "ruledtpack", "ruledvbox", "ruledvpack", "ruledvtop", "runMPbuffer", "runninghbox", "safechar", "sans", "sansbold", "sansnormal", "sansserif", "savebox", "savebtxdataset", "savebuffer", "savecounter", "savecurrentattributes", "savenormalmeaning", "savetaggedtwopassdata", "savetwopassdata", "sbox", "sd", "secondoffivearguments", "secondoffourarguments", "secondofsixarguments", "secondofthreearguments", "secondofthreeunexpanded", "secondoftwoarguments", "secondoftwounexpanded", "select", "serializecommalist", "serializedcommalist", "serif", "serifbold", "serifnormal", "setJSpreamble", "setMPlayer", "setMPpositiongraphic", "setMPpositiongraphicrange", "setMPtext", "setMPvariable", "setMPvariables", "setbar", "setbigbodyfont", "setboxllx", "setboxlly", "setbreakpoints", "setcapstrut", "setcatcodetable", "setcharacteralign", "setcharactercasing", "setcharactercleaning", "setcharacterkerning", "setcharacterspacing", "setcharacterstripping", "setcharstrut", "setcollector", "setcolormodell", "setcounter", "setcounterown", "setcurrentfontclass", "setdataset", "setdefaultpenalties", "setdigitsmanipulation", "setdirection", "setdocumentargument", "setdocumentargumentdefault", "setdocumentfilename", "setdummyparameter", "setelementexporttag", "setemeasure", "setevalue", "setevariable", "setevariables", "setfirstline", "setflag", "setfont", "setfontcolorsheme", "setfontfeature", "setfontsolution", "setfontstrut", "setfractions", "setgmeasure", "setgvalue", "setgvariable", "setgvariables", "sethboxregister", "sethyphenatedurlafter", "sethyphenatedurlbefore", "sethyphenatedurlnormal", "sethyphenationfeatures", "setinitial", "setinjector", "setinteraction", "setinterfacecommand", "setinterfaceconstant", "setinterfaceelements", "setinterfacemessage", "setinterfacevariable", "setinternalrendering", "setitaliccorrection", "setlayer", "setlayerframed", "setlayertext", "setlinefiller", "setlocalhsize", "setmainbodyfont", "setmainparbuilder", "setmarker", "setmarking", "setmathstyle", "setmeasure", "setmessagetext", "setmode", "setnostrut", "setnote", "setnotetext", "setobject", "setoldstyle", "setpagegrid", "setpagereference", "setpagestate", "setpagestaterealpageno", "setpenalties", "setpercentdimen", "setposition", "setpositionbox", "setpositiondata", "setpositiondataplus", "setpositiononly", "setpositionplus", "setpositionstrut", "setprofile", "setrandomseed", "setreference", "setreferencedobject", "setregisterentry", "setreplacement", "setrigidcolumnbalance", "setrigidcolumnhsize", "setscript", "setsectionblock", "setsimplecolumnhsize", "setsmallbodyfont", "setsmallcaps", "setstackbox", "setstructurepageregister", "setstrut", "setsuperiors", "setsystemmode", "settabular", "settaggedmetadata", "settightobject", "settightreferencedobject", "settightunreferencedobject", "settrialtypesetting", "setuevalue", "setugvalue", "setunreferencedobject", "setup", "setupMPgraphics", "setupMPinstance", "setupMPpage", "setupMPvariables", "setupTABLE", "setupTEXpage", "setupattachment", "setupbackend", "setupbar", "setupbleeding", "setupbookmark", "setupbtx", "setupbtxdataset", "setupbtxlist", "setupbtxregister", "setupbtxrendering", "setupbutton", "setupcapitals", "setupcharacterkerning", "setupcharacterspacing", "setupchemical", "setupchemicalframed", "setupcollector", "setupcolumnspan", "setupcombination", "setupcounter", "setupdataset", "setupdelimitedtext", "setupdescription", "setupdirections", "setupdocument", "setupeffect", "setupenumeration", "setupenv", "setupexport", "setupexternalfigure", "setupexternalsoundtracks", "setupfieldbody", "setupfieldcategory", "setupfieldcontentframed", "setupfieldlabelframed", "setupfieldtotalframed", "setupfiller", "setupfirstline", "setupfittingpage", "setupfloatcaption", "setupfontexpansion", "setupfontprotrusion", "setupfonts", "setupfontsolution", "setupformula", "setupformulaframed", "setupframedcontent", "setupframedtext", "setupglobalreferenceprefix", "setupheadalternative", "setuphelp", "setuphigh", "setuphighlight", "setuphyphenation", "setupindentedtext", "setupinitial", "setupinsertion", "setupitaliccorrection", "setuplabel", "setuplayer", "setuplayeredtext", "setuplayouttext", "setuplinefiller", "setuplinefillers", "setuplinenote", "setuplinetable", "setuplistalternative", "setuplistextra", "setuplocalfloats", "setuplocalinterlinespace", "setuplow", "setuplowhigh", "setuplowmidhigh", "setupmarginblock", "setupmargindata", "setupmarginframed", "setupmarginrule", "setupmathcases", "setupmathematics", "setupmathfence", "setupmathfraction", "setupmathframed", "setupmathmatrix", "setupmathornament", "setupmathradical", "setupmathstackers", "setupmathstyle", "setupmixedcolumns", "setupmodule", "setupnotation", "setupnotations", "setupnote", "setupnotes", "setupoffset", "setupoffsetbox", "setupoutputroutine", "setuppagechecker", "setuppagegrid", "setuppagegridarea", "setuppagegridareatext", "setuppagegridlines", "setuppagegridspan", "setuppagegridstart", "setuppageinjection", "setuppageinjectionalternative", "setuppageshift", "setuppagestate", "setuppairedbox", "setupparagraph", "setupparagraphintro", "setupparallel", "setupperiods", "setuppositionbar", "setupprocessor", "setupprofile", "setupquotation", "setuprealpagenumber", "setupreferenceformat", "setupreferenceprefix", "setupreferencestructureprefix", "setupregisters", "setuprenderingwindow", "setups", "setupscale", "setupscript", "setupscripts", "setupselector", "setupshift", "setupsidebar", "setupspellchecking", "setupstretched", "setupstruts", "setupstyle", "setupsubformula", "setuptabulation", "setuptagging", "setuptextbackground", "setuptextflow", "setuptooltip", "setupunit", "setupurl", "setupuserpagenumber", "setupversion", "setupviewerlayer", "setupvspacing", "setupwithargument", "setupwithargumentswapped", "setupxml", "setupxtable", "setuvalue", "setuxvalue", "setvalue", "setvariable", "setvariables", "setvboxregister", "setvisualizerfont", "setvtopregister", "setwidthof", "setxmeasure", "setxvalue", "setxvariable", "setxvariables", "sfrac", "shapedhbox", "showallmakeup", "showattributes", "showboxes", "showbtxdatasetauthors", "showbtxdatasetcompleteness", "showbtxdatasetfields", "showbtxfields", "showbtxhashedauthors", "showbtxtables", "showchardata", "showcharratio", "showcolorbar", "showcolorcomponents", "showcolorset", "showcolorstruts", "showcounter", "showdirectives", "showdirsinmargin", "showedebuginfo", "showexperiments", "showfont", "showfontdata", "showfontkerns", "showfontparameters", "showfontstrip", "showfontstyle", "showglyphs", "showgridsnapping", "showhelp", "showhyphenationtrace", "showhyphens", "showinjector", "showjustification", "showkerning", "showlayoutcomponents", "showligature", "showligatures", "showlogcategories", "showmargins", "showmessage", "showminimalbaseline", "shownextbox", "showotfcomposition", "showparentchain", "showsetupsdefinition", "showtimer", "showtokens", "showtrackers", "showvalue", "showvariable", "showwarning", "simplegroupedcommand", "singalcharacteralign", "singlebond", "sixthofsixarguments", "slanted", "slantedbold", "slicepages", "slovenianNumerals", "sloveniannumerals", "small", "smallbodyfont", "smallbold", "smallbolditalic", "smallboldslanted", "smallcappedcharacters", "smallcappedromannumerals", "smaller", "smallitalicbold", "smallnormal", "smallskip", "smallslanted", "smallslantedbold", "smalltype", "smash", "smashbox", "smashboxed", "smashedhbox", "smashedvbox", "snaptogrid", "someheadnumber", "somekindoftab", "somelocalfloat", "somenamedheadnumber", "someplace", "sp", "spanishNumerals", "spanishnumerals", "speech", "splitatasterisk", "splitatcolon", "splitatcolons", "splitatcomma", "splitdfrac", "splitfilename", "splitfrac", "splitoffbase", "splitofffull", "splitoffkind", "splitoffname", "splitoffpath", "splitoffroot", "splitofftokens", "splitofftype", "splitstring", "spreadhbox", "sqrt", "stackrel", "startregister", "startstructurepageregister", "stopregister", "stopstructurepageregister", "strictdoifelsenextoptional", "strictdoifnextoptionalelse", "stripcharacter", "strippedcsname", "stripspaces", "structurelistuservariable", "structurenumber", "structuretitle", "structureuservariable", "structurevariable", "strut", "strutdp", "strutht", "struthtdp", "struttedbox", "strutwd", "style", "styleinstance", "subsentence", "substituteincommalist", "subtractfeature", "swapcounts", "swapdimens", "swapface", "swapmacros", "swaptypeface", "switchstyleonly", "switchtocolor", "switchtointerlinespace", "symbolreference", "synchronizeblank", "synchronizeindenting", "synchronizemarking", "synchronizeoutputstreams", "synchronizestrut", "synchronizewhitespace", "systemlog", "systemlogfirst", "systemloglast", "systemsetups", "tLeftarrow", "tLeftrightarrow", "tRightarrow", "tabulateautoline", "tabulateautorule", "tabulateline", "tabulaterule", "taggedctxcommand", "taggedlabeltexts", "tbinom", "tbox", "tequal", "testandsplitstring", "testfeature", "testfeatureonce", "testpageonly", "testpagesync", "testtokens", "texdefinition", "texsetup", "textcitation", "textcite", "textcontrolspace", "textflowcollector", "textmath", "textminus", "textormathchar", "textplus", "textvisiblespace", "tfrac", "thainumerals", "thefirstcharacter", "thenormalizedbodyfontsize", "theremainingcharacters", "thickspace", "thinspace", "thirdoffivearguments", "thirdoffourarguments", "thirdofsixarguments", "thirdofthreearguments", "thirdofthreeunexpanded", "thookleftarrow", "thookrightarrow", "threedigitrounding", "tibetannumerals", "tightlayer", "tinyfont", "tlap", "tleftarrow", "tleftharpoondown", "tleftharpoonup", "tleftrightarrow", "tleftrightharpoons", "tmapsto", "tochar", "tolinenote", "topbox", "topleftbox", "toplinebox", "toprightbox", "topskippedbox", "tracecatcodetables", "tracedfontname", "traceoutputroutines", "tracepositions", "transparencycomponents", "transparent", "trel", "trightarrow", "trightharpoondown", "trightharpoonup", "trightleftharpoons", "trightoverleftarrow", "triplebond", "truefilename", "truefontname", "ttriplerel", "ttwoheadleftarrow", "ttwoheadrightarrow", "twodigitrounding", "tx", "txx", "typ", "typedefinedbuffer", "typeface", "typescriptone", "typescriptprefix", "typescriptthree", "typescripttwo", "typesetbuffer", "typesetfile", "uconvertnumber", "uedcatcodecommand", "undefinevalue", "undepthed", "underbar", "underbars", "underbartext", "underbrace", "underbracetext", "underbracket", "underbrackettext", "underdash", "underdashes", "underdot", "underdots", "underleftarrow", "underleftharpoondown", "underleftharpoonup", "underleftrightarrow", "underparent", "underparenttext", "underrandom", "underrandoms", "underrightarrow", "underrightharpoondown", "underrightharpoonup", "underset", "understrike", "understrikes", "undertwoheadleftarrow", "undertwoheadrightarrow", "undoassign", "unframed", "unhhbox", "unihex", "uniqueMPgraphic", "uniqueMPpagegraphic", "unprotected", "unregisterhyphenationpattern", "unspaceafter", "unspaceargument", "unspaced", "unspacestring", "untexargument", "untexcommand", "uppercased", "uppercasestring", "upperleftdoubleninequote", "upperleftdoublesixquote", "upperleftsingleninequote", "upperleftsinglesixquote", "upperrightdoubleninequote", "upperrightdoublesixquote", "upperrightsingleninequote", "upperrightsinglesixquote", "url", "useJSscripts", "useMPenvironmentbuffer", "useMPgraphic", "useMPlibrary", "useMPrun", "useMPvariables", "useURL", "useblankparameter", "usebodyfont", "usebodyfontparameter", "usebtxdataset", "usebtxdefinitions", "usecolors", "usecomponent", "usedummycolorparameter", "usedummystyleandcolor", "usedummystyleparameter", "useenvironment", "useexternalrendering", "usefigurebase", "usefile", "usegridparameter", "useindentingparameter", "useindentnextparameter", "useinterlinespaceparameter", "uselanguageparameter", "useluamodule", "usemathstyleparameter", "useproduct", "useprofileparameter", "useproject", "usereferenceparameter", "userpagenumber", "usesetupsparameter", "usestaticMPfigure", "usesubpath", "usetexmodule", "useurl", "usezipfile", "utfchar", "utflower", "utfupper", "utilityregisterlength", "vboxreference", "verbatim", "verbatimstring", "verbosenumber", "verticalgrowingbar", "verticalpositionbar", "vglue", "viewerlayer", "vphantom", "vpos", "vsmash", "vsmashbox", "vsmashed", "vspace", "vspacing", "wdofstring", "widthofstring", "widthspanningtext", "withoutpt", "word", "words", "wordtonumber", "writedatatolist", "writestatus", "xLeftarrow", "xLeftrightarrow", "xRightarrow", "xdefconvertedargument", "xequal", "xfrac", "xhookleftarrow", "xhookrightarrow", "xleftarrow", "xleftharpoondown", "xleftharpoonup", "xleftrightarrow", "xleftrightharpoons", "xmapsto", "xmladdindex", "xmlafterdocumentsetup", "xmlaftersetup", "xmlall", "xmlappenddocumentsetup", "xmlappendsetup", "xmlapplyselectors", "xmlatt", "xmlattdef", "xmlattribute", "xmlattributedef", "xmlbadinclusions", "xmlbeforedocumentsetup", "xmlbeforesetup", "xmlchainatt", "xmlchainattdef", "xmlchecknamespace", "xmlcommand", "xmlconcat", "xmlconcatrange", "xmlcontext", "xmlcount", "xmldefaulttotext", "xmldirectives", "xmldirectivesafter", "xmldirectivesbefore", "xmldisplayverbatim", "xmldoif", "xmldoifelse", "xmldoifelseempty", "xmldoifelseselfempty", "xmldoifelsetext", "xmldoifelsevalue", "xmldoifnot", "xmldoifnotselfempty", "xmldoifnottext", "xmldoifselfempty", "xmldoiftext", "xmlelement", "xmlfilter", "xmlfirst", "xmlflush", "xmlflushcontext", "xmlflushdocumentsetups", "xmlflushlinewise", "xmlflushpure", "xmlflushspacewise", "xmlflushtext", "xmlinclude", "xmlinclusion", "xmlinclusions", "xmlinfo", "xmlinjector", "xmlinlineverbatim", "xmlinstalldirective", "xmllast", "xmllastatt", "xmllastmatch", "xmlloadbuffer", "xmlloaddata", "xmlloaddirectives", "xmlloadfile", "xmlloadonly", "xmlmain", "xmlmapvalue", "xmlname", "xmlnamespace", "xmlnonspace", "xmlpath", "xmlpos", "xmlposition", "xmlprependdocumentsetup", "xmlprependsetup", "xmlprettyprint", "xmlprocessbuffer", "xmlprocessdata", "xmlprocessfile", "xmlpure", "xmlraw", "xmlrefatt", "xmlregistereddocumentsetups", "xmlregisteredsetups", "xmlregisterns", "xmlremapname", "xmlremapnamespace", "xmlremovedocumentsetup", "xmlremovesetup", "xmlresetdocumentsetups", "xmlresetinjectors", "xmlresetsetups", "xmlsave", "xmlsetentity", "xmlsetfunction", "xmlsetinjectors", "xmlsetsetup", "xmlsetup", "xmlshow", "xmlsnippet", "xmlstrip", "xmlstripnolines", "xmlstripped", "xmlstrippednolines", "xmltag", "xmltexentity", "xmltext", "xmltobuffer", "xmltobufferverbose", "xmltofile", "xmlvalue", "xmlverbatim", "xrel", "xrightarrow", "xrightharpoondown", "xrightharpoonup", "xrightleftharpoons", "xrightoverleftarrow", "xsplitstring", "xtriplerel", "xtwoheadleftarrow", "xtwoheadrightarrow", "xxfrac", "xypos", "آیتم", "آیتمها", "آیتمبندی", "آینه", "از", "استفادهبلوکها", "استفادهدستخطتایپ", "استفادهشکلخارجی", "استفادهقطعهموزیکخارجی", "استفادهمدول", "استفادهمسیر", "استفادهنمادها", "استفادهنوشتارخارجی", "استفادهپروندهدستخطتایپ", "اعدادلاتین", "افزودن", "انتخاببلوکها", "بارگذاریآرایش", "بارگذاریآیتمها", "بارگذاریارجاع", "بارگذاریاندازهبرگ", "بارگذاریباریکتر", "بارگذاریبافر", "بارگذاریبالا", "بارگذاریبردباری", "بارگذاریبرنامهها", "بارگذاریبرگ", "بارگذاریبلوک", "بارگذاریبلوکبخش", "بارگذاریتایپ", "بارگذاریتایپکردن", "بارگذاریترتیب", "بارگذاریتنظیمریاضی", "بارگذاریتهبرگ", "بارگذاریتورفتگی", "بارگذاریتوضیح", "بارگذاریتوضیحصفحه", "بارگذاریثبت", "بارگذاریجانشانی", "بارگذاریجدولها", "بارگذاریجدولبندی", "بارگذاریخالی", "بارگذاریخطها", "بارگذاریخطهایحاشیه", "بارگذاریخطهایسیاه", "بارگذاریخطهایمتن", "بارگذاریخطهاینازک", "بارگذاریدرجدرخطها", "بارگذاریدرجمخالف", "بارگذاریدوران", "بارگذاریرنگ", "بارگذاریرنگها", "بارگذاریزبان", "بارگذاریستونها", "بارگذاریسر", "بارگذاریسربرگ", "بارگذاریسرها", "بارگذاریشرح", "بارگذاریشروعپایان", "بارگذاریشمارهزیرصفحه", "بارگذاریشمارهسر", "بارگذاریشمارهصفحه", "بارگذاریشمارهگذاریصفحه", "بارگذاریشمارهگذاریپاراگراف", "بارگذاریشمارهگذاریخط", "بارگذاریشناور", "بارگذاریشکافتنشناورها", "بارگذاریطرح", "بارگذاریطرحبندی", "بارگذاریعرضخط", "بارگذاریفاصلهبینخط", "بارگذاریفضایسفید", "بارگذاریفضاگذاری", "بارگذاریقالبی", "بارگذاریقلممتن", "بارگذاریلوح", "بارگذاریلیست", "بارگذاریلیستترکیبی", "بارگذاریمترادفها", "بارگذاریمتن", "بارگذاریمتنهایبالا", "بارگذاریمتنسربرگ", "بارگذاریمتنمتنها", "بارگذاریمتنپانوشت", "بارگذاریمتنپایین", "بارگذاریمجموعهنماد", "بارگذاریمنویپانل", "بارگذاریمکانگذاری", "بارگذاریمیدان", "بارگذاریمیدانها", "بارگذاریمیلهپانل", "بارگذارینشانهشکستن", "بارگذارینشانهگذاری", "بارگذارینقل", "بارگذاریپاراگرافها", "بارگذاریپانل", "بارگذاریپایین", "بارگذاریپردهپانل", "بارگذاریپرکردنخطها", "بارگذاریپسزمینه", "بارگذاریپسزمینهها", "بارگذاریچیدن", "بارگذاریگذارصفحه", "بارگذاریگروههایآیتم", "بارگذاریگروهآیتم", "بازنشانینشانهگذاری", "بخش", "بدونخطبالاوپایین", "بدونخطسروتهبرگ", "بدونفضا", "برنامه", "بروبه", "بروبهجعبه", "بروبهصفحه", "بروپایین", "بلند", "بلوکهایپردازش", "بلوکهاپنهان", "بنویسبینلیست", "بنویسدرلیست", "تاریخ", "تاریخجاری", "تایپ", "تایپبافر", "تایپپرونده", "ترجمه", "تعریف", "تعریفآرایش", "تعریفالگویجدول", "تعریفاندازهبرگ", "تعریفبافر", "تعریفبخش", "تعریفبرنامه", "تعریفبرچسب", "تعریفبلوک", "تعریفبلوکبخش", "تعریفتایپ", "تعریفتایپکردن", "تعریفتبدیل", "تعریفترتیب", "تعریفترکیب", "تعریفتنظیمریاضی", "تعریفتودهمیدان", "تعریفثبت", "تعریفجانشانی", "تعریفجدولبندی", "تعریفجعبهافقی", "تعریفرنگ", "تعریفزیرمیدان", "تعریفسبک", "تعریفسبکقلم", "تعریفسر", "تعریفشرح", "تعریفشروعپایان", "تعریفشمارهبندی", "تعریفشمایلمرجع", "تعریفشناور", "تعریفشکستنستون", "تعریفشکستصفحه", "تعریفطرحبندی", "تعریفقالبی", "تعریفقلم", "تعریفقلممتن", "تعریفلایه", "تعریفلوح", "تعریفلیست", "تعریفلیستترکیبی", "تعریفمترادفها", "تعریفمترادفقلم", "تعریفمتن", "تعریفمتنقالبی", "تعریفمحیطقلمبدنه", "تعریفمرجع", "تعریفمنویپانل", "تعریفمیدان", "تعریفنشانهگذاری", "تعریفنماد", "تعریفنمادشکل", "تعریفپاراگرافها", "تعریفپروفایل", "تعریفپوشش", "تعریفگروهآیتم", "تعریفگروهرنگ", "تعیینشمارهسر", "تعیینمحتوایمتن", "تعیینمشخصاتثبت", "تعیینمشخصاتلیست", "تغییربهقلمبدنه", "تنظیمطرحبندی", "توجه", "توری", "توضیح", "تولید", "تک", "ثبتکامل", "جدول", "حرف", "حرفها", "حفظبلوکها", "خالی", "خطهایسیاه", "خطهاینازک", "خطهاخالی", "خطسیاه", "خطمتن", "خطمو", "خطنازک", "خا", "خع", "در", "درجثبت", "درجدرخط", "درجدرخطها", "درجدرمتن", "درجدربالاییکدیگر", "درجدرتوری", "درجزیرفرمول", "درجشمارهسر", "درجشمارهصفحه", "درجشناور", "درجفرمول", "درجلیست", "درجلیستخام", "درجلیستمختلط", "درجمتنسر", "درجپانوشتها", "درجپانوشتهایموضعی", "درجچوبخط", "درجکناربهکنار", "درخط", "درصفحه", "درقالبی", "درمورد", "درون", "درپر", "دریافتبافر", "دریافتنشانه", "دوران", "دکمه", "دکمهمنو", "دکمهپانل", "رج", "رنگ", "رنگخاکستری", "روزهفته", "ریاضی", "زبان", "زباناصلی", "زیربخش", "زیرزیربخش", "زیرزیرزیربخش", "زیرزیرزیرزیربخش", "زیرزیرزیرزیرموضوع", "زیرزیرزیرموضوع", "زیرزیرموضوع", "زیرموضوع", "ستون", "ستونامتحان", "سخنرانی", "سرپوشکوچکنه", "شروعJScode", "شروعJSpreamble", "شروعMPclip", "شروعMPcode", "شروعMPdefinitions", "شروعMPdrawing", "شروعMPenvironment", "شروعMPextensions", "شروعMPinclusions", "شروعMPinitializations", "شروعMPpage", "شروعMPpositiongraphic", "شروعMPpositionmethod", "شروعMPrun", "شروعTABLE", "شروعTABLEbody", "شروعTABLEfoot", "شروعTABLEhead", "شروعTABLEnext", "شروعTC", "شروعTD", "شروعTDs", "شروعTEXpage", "شروعTH", "شروعTN", "شروعTR", "شروعTRs", "شروعTX", "شروعTY", "شروعallmodes", "شروعarrangedpages", "شروعaside", "شروعattachment", "شروعbar", "شروعbinom", "شروعbitmapimage", "شروعblockquote", "شروعbtxrenderingdefinitions", "شروعbuffer", "شروعbutton", "شروعcatcodetable", "شروعcharacteralign", "شروعcheckedfences", "شروعchemical", "شروعcollect", "شروعcollecting", "شروعcolorintent", "شروعcoloronly", "شروعcolorset", "شروعcolumns", "شروعcolumnspan", "شروعcombination", "شروعcomment", "شروعcontextcode", "شروعcontextdefinitioncode", "شروعctxfunction", "شروعctxfunctiondefinition", "شروعcurrentcolor", "شروعcurrentlistentrywrapper", "شروعdbinom", "شروعdelimited", "شروعdelimitedtext", "شروعdfrac", "شروعdisplaymath", "شروعdmath", "شروعdocument", "شروعeffect", "شروعelement", "شروعembeddedxtable", "شروعendofline", "شروعexceptions", "شروعexpanded", "شروعexpandedcollect", "شروعextendedcatcodetable", "شروعexternalfigurecollection", "شروعfigure", "شروعfitfieldframed", "شروعfittingpage", "شروعfloatcombination", "شروعfont", "شروعfontclass", "شروعfontsolution", "شروعformula", "شروعformulas", "شروعfrac", "شروعframedcontent", "شروعframedtext", "شروعgridsnapping", "شروعhbox", "شروعhboxestohbox", "شروعhboxregister", "شروعhelptext", "شروعhiddenbar", "شروعhiding", "شروعhighlight", "شروعhyphenation", "شروعimath", "شروعindentation", "شروعindentedtext", "شروعinmframed", "شروعinteraction", "شروعinterface", "شروعintertext", "شروعitemgroup", "شروعknockout", "شروعlayout", "شروعlinecorrection", "شروعlinefiller", "شروعlinenumbering", "شروعlinetable", "شروعlinetablebody", "شروعlinetablecell", "شروعlinetablehead", "شروعlocalfootnotes", "شروعlocalheadsetup", "شروعlocallinecorrection", "شروعlocalnotes", "شروعlocalsetups", "شروعlua", "شروعluacode", "شروعluaparameterset", "شروعluasetups", "شروعmakeup", "شروعmarginblock", "شروعmarkedcontent", "شروعmathmode", "شروعmathstyle", "شروعmatrices", "شروعmcframed", "شروعmdformula", "شروعmframed", "شروعmixedcolumns", "شروعmode", "شروعmodeset", "شروعmodule", "شروعmoduletestsection", "شروعmpformula", "شروعnamedsection", "شروعnamedsubformulas", "شروعnarrow", "شروعnarrower", "شروعnegative", "شروعnicelyfilledbox", "شروعnobar", "شروعnointerference", "شروعnotallmodes", "شروعnotext", "شروعnotmode", "شروعopposite", "شروعoutputstream", "شروعoverlay", "شروعoverprint", "شروعpagecomment", "شروعpagefigure", "شروعpagegrid", "شروعpagegridspan", "شروعpagelayout", "شروعpar", "شروعparagraph", "شروعparagraphs", "شروعparagraphscell", "شروعparbuilder", "شروعpath", "شروعplacepairedbox", "شروعpositioning", "شروعpositionoverlay", "شروعpositive", "شروعpostponing", "شروعprocessassignmentcommand", "شروعprocessassignmentlist", "شروعprocesscommacommand", "شروعprocesscommalist", "شروعprotect", "شروعprotectedcolors", "شروعpunctuation", "شروعrandomized", "شروعrandomseed", "شروعrawsetups", "شروعreadingfile", "شروعreferenceprefix", "شروعregime", "شروعreusableMPgraphic", "شروعscript", "شروعsdformula", "شروعsectionblock", "شروعsectionblockenvironment", "شروعsectionlevel", "شروعsetups", "شروعsfrac", "شروعshapebox", "شروعshift", "شروعsidebar", "شروعsimplecolumns", "شروعspecialitem", "شروعspeech", "شروعspformula", "شروعspread", "شروعstartstop", "شروعstaticMPfigure", "شروعstaticMPgraphic", "شروعstrictinspectnextcharacter", "شروعstrut", "شروعstyle", "شروعsubformulas", "شروعsubjectlevel", "شروعsubsentence", "شروعsubstack", "شروعsymbolset", "شروعtable", "شروعtablehead", "شروعtables", "شروعtabletail", "شروعtabulate", "شروعtabulatehead", "شروعtabulatetail", "شروعtagged", "شروعtbinom", "شروعtexcode", "شروعtexdefinition", "شروعtext", "شروعtextbackground", "شروعtextbackgroundmanual", "شروعtextcolor", "شروعtextcolorintent", "شروعtextflow", "شروعtokens", "شروعtransparent", "شروعtypescript", "شروعtypescriptcollection", "شروعunderdash", "شروعunderdashes", "شروعunderdot", "شروعunderdots", "شروعunderrandom", "شروعunderrandoms", "شروعunderstrike", "شروعunderstrikes", "شروعunframed", "شروعuniqueMPgraphic", "شروعuniqueMPpagegraphic", "شروعunpacked", "شروعusableMPgraphic", "شروعuseMPgraphic", "شروعusemathstyleparameter", "شروعusingbtxspecification", "شروعvbox", "شروعvboxregister", "شروعvboxtohbox", "شروعvboxtohboxseparator", "شروعviewerlayer", "شروعvtop", "شروعvtopregister", "شروعxcell", "شروعxcellgroup", "شروعxfrac", "شروعxgroup", "شروعxmldisplayverbatim", "شروعxmlinlineverbatim", "شروعxmlraw", "شروعxmlsetups", "شروعxrow", "شروعxrowgroup", "شروعxtable", "شروعxtablebody", "شروعxtablefoot", "شروعxtablehead", "شروعxtablenext", "شروعxxfrac", "شروعآیتم", "شروعآیتمبندی", "شروعبخش", "شروعبروبه", "شروعتوضیح", "شروعتولید", "شروعجدول", "شروعخطحاشیه", "شروعخطزدن", "شروعخطزدنها", "شروعخطمتن", "شروعدرجفرمول", "شروعرنگ", "شروعزیربخش", "شروعزیرزیربخش", "شروعزیرزیرزیربخش", "شروعزیرزیرزیرزیربخش", "شروعزیرزیرزیرزیرموضوع", "شروعزیرزیرزیرموضوع", "شروعزیرزیرموضوع", "شروعزیرموضوع", "شروعسخنرانی", "شروعسر", "شروعشکل", "شروععنوان", "شروعفشرده", "شروعفصل", "شروعقالبی", "شروعمتنقالبی", "شروعمتنکمکی", "شروعمحیط", "شروعمنویپانل", "شروعموضوع", "شروعمولفه", "شروعمیانپرده", "شروعمیلهرو", "شروعمیلهزیر", "شروعمیلههارو", "شروعمیلههایزیر", "شروعنشر", "شروعنقل", "شروعنقلبلوک", "شروعنقلقول", "شروعپروژه", "شروعپسزمینه", "شروعگرافیک", "شروعخط", "شمارهزیرصفحه", "شمارهسر", "شمارهسرجاری", "شمارهصفحه", "شمارهصفحهکامل", "شمارهفرمول", "شمارهمبدل", "شمارهها", "شکافتنشناور", "شکل", "شکلخارجی", "صفحه", "صفحهتست", "طوللیست", "عرضخط", "عنوان", "فصل", "فضا", "فضاهایثابت", "فضایثابت", "فضایسفیدصحیح", "قالبی", "لوحمقایسه", "ماه", "متنقالبی", "متنپانوشت", "متنکمکی", "محیط", "مراجعه", "مرجع", "مرجعصفحه", "مرجعمتن", "مقایسهگروهرنگ", "مقداررنگ", "مقیاس", "منویپانل", "موضوع", "مولفه", "مکان", "میانپرده", "میدان", "میدانشبیهسازی", "میدانپشته", "میدانکپی", "میلهرنگ", "میلهپانل", "ناشناس", "نسخه", "نشانهگذاری", "نصبزبان", "نقطهها", "نقل", "نقلبلوک", "نقلقول", "نماد", "نمایشآرایش", "نمایشبارگذاریها", "نمایشبستها", "نمایشتوری", "نمایشرنگ", "نمایشطرحبندی", "نمایشقالب", "نمایشقلمبدنه", "نمایشلوح", "نمایشمجموعهعلامت", "نمایشمحیطقلمبدنه", "نمایشچاپ", "نمایشگروهرنگ", "پابا", "پایانJScode", "پایانJSpreamble", "پایانMPclip", "پایانMPcode", "پایانMPdefinitions", "پایانMPdrawing", "پایانMPenvironment", "پایانMPextensions", "پایانMPinclusions", "پایانMPinitializations", "پایانMPpage", "پایانMPpositiongraphic", "پایانMPpositionmethod", "پایانMPrun", "پایانTABLE", "پایانTABLEbody", "پایانTABLEfoot", "پایانTABLEhead", "پایانTABLEnext", "پایانTC", "پایانTD", "پایانTDs", "پایانTEXpage", "پایانTH", "پایانTN", "پایانTR", "پایانTRs", "پایانTX", "پایانTY", "پایانallmodes", "پایانarrangedpages", "پایانaside", "پایانattachment", "پایانbar", "پایانbinom", "پایانbitmapimage", "پایانblockquote", "پایانbtxrenderingdefinitions", "پایانbuffer", "پایانbutton", "پایانcatcodetable", "پایانcharacteralign", "پایانcheckedfences", "پایانchemical", "پایانcollect", "پایانcollecting", "پایانcolorintent", "پایانcoloronly", "پایانcolorset", "پایانcolumns", "پایانcolumnspan", "پایانcombination", "پایانcomment", "پایانcontextcode", "پایانcontextdefinitioncode", "پایانctxfunction", "پایانctxfunctiondefinition", "پایانcurrentcolor", "پایانcurrentlistentrywrapper", "پایانdbinom", "پایانdelimited", "پایانdelimitedtext", "پایانdfrac", "پایانdisplaymath", "پایانdmath", "پایانdocument", "پایانeffect", "پایانelement", "پایانembeddedxtable", "پایانendofline", "پایانexceptions", "پایانexpanded", "پایانexpandedcollect", "پایانextendedcatcodetable", "پایانexternalfigurecollection", "پایانfigure", "پایانfitfieldframed", "پایانfittingpage", "پایانfloatcombination", "پایانfont", "پایانfontclass", "پایانfontsolution", "پایانformula", "پایانformulas", "پایانfrac", "پایانframedcontent", "پایانframedtext", "پایانgridsnapping", "پایانhbox", "پایانhboxestohbox", "پایانhboxregister", "پایانhelptext", "پایانhiddenbar", "پایانhiding", "پایانhighlight", "پایانhyphenation", "پایانimath", "پایانindentation", "پایانindentedtext", "پایانinmframed", "پایانinteraction", "پایانinterface", "پایانintertext", "پایانitemgroup", "پایانknockout", "پایانlayout", "پایانlinecorrection", "پایانlinefiller", "پایانlinenumbering", "پایانlinetable", "پایانlinetablebody", "پایانlinetablecell", "پایانlinetablehead", "پایانlocalfootnotes", "پایانlocalheadsetup", "پایانlocallinecorrection", "پایانlocalnotes", "پایانlocalsetups", "پایانlua", "پایانluacode", "پایانluaparameterset", "پایانluasetups", "پایانmakeup", "پایانmarginblock", "پایانmarkedcontent", "پایانmathmode", "پایانmathstyle", "پایانmatrices", "پایانmcframed", "پایانmdformula", "پایانmframed", "پایانmixedcolumns", "پایانmode", "پایانmodeset", "پایانmodule", "پایانmoduletestsection", "پایانmpformula", "پایانnamedsection", "پایانnamedsubformulas", "پایانnarrow", "پایانnarrower", "پایانnegative", "پایانnicelyfilledbox", "پایانnobar", "پایانnointerference", "پایانnotallmodes", "پایانnotext", "پایانnotmode", "پایانopposite", "پایانoutputstream", "پایانoverlay", "پایانoverprint", "پایانpagecomment", "پایانpagefigure", "پایانpagegrid", "پایانpagegridspan", "پایانpagelayout", "پایانpar", "پایانparagraph", "پایانparagraphs", "پایانparagraphscell", "پایانparbuilder", "پایانpath", "پایانplacepairedbox", "پایانpositioning", "پایانpositionoverlay", "پایانpositive", "پایانpostponing", "پایانprocessassignmentcommand", "پایانprocessassignmentlist", "پایانprocesscommacommand", "پایانprocesscommalist", "پایانprotect", "پایانprotectedcolors", "پایانpunctuation", "پایانrandomized", "پایانrandomseed", "پایانrawsetups", "پایانreadingfile", "پایانreferenceprefix", "پایانregime", "پایانreusableMPgraphic", "پایانscript", "پایانsdformula", "پایانsectionblock", "پایانsectionblockenvironment", "پایانsectionlevel", "پایانsetups", "پایانsfrac", "پایانshapebox", "پایانshift", "پایانsidebar", "پایانsimplecolumns", "پایانspecialitem", "پایانspeech", "پایانspformula", "پایانspread", "پایانstartstop", "پایانstaticMPfigure", "پایانstaticMPgraphic", "پایانstrictinspectnextcharacter", "پایانstrut", "پایانstyle", "پایانsubformulas", "پایانsubjectlevel", "پایانsubsentence", "پایانsubstack", "پایانsymbolset", "پایانtable", "پایانtablehead", "پایانtables", "پایانtabletail", "پایانtabulate", "پایانtabulatehead", "پایانtabulatetail", "پایانtagged", "پایانtbinom", "پایانtexcode", "پایانtexdefinition", "پایانtext", "پایانtextbackground", "پایانtextbackgroundmanual", "پایانtextcolor", "پایانtextcolorintent", "پایانtextflow", "پایانtokens", "پایانtransparent", "پایانtypescript", "پایانtypescriptcollection", "پایانunderdash", "پایانunderdashes", "پایانunderdot", "پایانunderdots", "پایانunderrandom", "پایانunderrandoms", "پایانunderstrike", "پایانunderstrikes", "پایانunframed", "پایانuniqueMPgraphic", "پایانuniqueMPpagegraphic", "پایانunpacked", "پایانusableMPgraphic", "پایانuseMPgraphic", "پایانusemathstyleparameter", "پایانusingbtxspecification", "پایانvbox", "پایانvboxregister", "پایانvboxtohbox", "پایانvboxtohboxseparator", "پایانviewerlayer", "پایانvtop", "پایانvtopregister", "پایانxcell", "پایانxcellgroup", "پایانxfrac", "پایانxgroup", "پایانxmldisplayverbatim", "پایانxmlinlineverbatim", "پایانxmlraw", "پایانxmlsetups", "پایانxrow", "پایانxrowgroup", "پایانxtable", "پایانxtablebody", "پایانxtablefoot", "پایانxtablehead", "پایانxtablenext", "پایانxxfrac", "پایانآیتم", "پایانآیتمبندی", "پایانبخش", "پایانبروبه", "پایانتوضیح", "پایانتولید", "پایانجدول", "پایانخطحاشیه", "پایانخطزدن", "پایانخطزدنها", "پایانخطمتن", "پایاندرجفرمول", "پایانرنگ", "پایانزیربخش", "پایانزیرزیربخش", "پایانزیرزیرزیربخش", "پایانزیرزیرزیرزیربخش", "پایانزیرزیرزیرزیرموضوع", "پایانزیرزیرزیرموضوع", "پایانزیرزیرموضوع", "پایانزیرموضوع", "پایانسخنرانی", "پایانسر", "پایانشکل", "پایانعنوان", "پایانفشرده", "پایانفصل", "پایانقالبی", "پایانمتنقالبی", "پایانمتنکمکی", "پایانمحیط", "پایانمنویپانل", "پایانموضوع", "پایانمولفه", "پایانمیانپرده", "پایانمیلهرو", "پایانمیلهزیر", "پایانمیلههارو", "پایانمیلههایزیر", "پایاننشر", "پایاننقل", "پایاننقلبلوک", "پایاننقلقول", "پایانپروژه", "پایانپسزمینه", "پایانگرافیک", "پایانخط", "پایین", "پرده", "پروژه", "پرکردنمیدان", "پسزمینه", "پنهانکردن", "چوبخط", "کشیده", "گرافیک", "گیره", "یادداشت", "یکجا", "یکخط" }, - ["ro"]={ "AMSTEX", "AfterPar", "Alphabeticnumerals", "AmSTeX", "And", "BeforePar", "Big", "Bigg", "Biggl", "Biggm", "Biggr", "Bigl", "Bigm", "Bigr", "CONTEXT", "CUVANT", "CUVINTE", "Caps", "ConTeXt", "Context", "ConvertConstantAfter", "ConvertToConstant", "Cuvant", "Cuvinte", "ETEX", "EveryLine", "EveryPar", "GetPar", "GotoPar", "Greeknumerals", "INRSTEX", "Kap", "LAMSTEX", "LATEX", "LUAJITTEX", "LUATEX", "LUNA", "LaTeX", "LamSTeX", "Litera", "Litere", "Lua", "LuaTeX", "LuajitTeX", "METAFONT", "METAFUN", "METAPOST", "MKII", "MKIV", "MKIX", "MKVI", "MKXI", "MONTHLONG", "MONTHSHORT", "MPII", "MPIV", "MPVI", "MPanchor", "MPbetex", "MPc", "MPcode", "MPcolor", "MPcoloronly", "MPcolumn", "MPd", "MPdrawing", "MPfontsizehskip", "MPgetmultipars", "MPgetmultishape", "MPgetposboxes", "MPh", "MPinclusions", "MPleftskip", "MPll", "MPlr", "MPls", "MPmenubuttons", "MPn", "MPoptions", "MPoverlayanchor", "MPp", "MPpage", "MPpardata", "MPplus", "MPpos", "MPpositiongraphic", "MPposset", "MPr", "MPrawvar", "MPregion", "MPrest", "MPrightskip", "MPrs", "MPstring", "MPtext", "MPtransparency", "MPul", "MPur", "MPv", "MPvar", "MPvariable", "MPvv", "MPw", "MPwhd", "MPx", "MPxy", "MPxywhd", "MPy", "MetaFont", "MetaFun", "MetaPost", "NormalizeFontHeight", "NormalizeFontWidth", "NormalizeTextHeight", "NormalizeTextWidth", "Numere", "Numereromane", "PDFETEX", "PDFTEX", "PDFcolor", "PICTEX", "PPCHTEX", "PPCHTeX", "PRAGMA", "PiCTeX", "PointsToBigPoints", "PointsToReal", "PointsToWholeBigPoints", "PtToCm", "ReadFile", "ScaledPointsToBigPoints", "ScaledPointsToWholeBigPoints", "Smallcapped", "TABLE", "TEX", "TEXpage", "TaBlE", "TeX", "TheNormalizedFontSize", "TransparencyHack", "VerboseNumber", "WidthSpanningText", "XETEX", "XeTeX", "ZIDINSAPTAMANA", "abjadnaivenumerals", "abjadnodotnumerals", "abjadnumerals", "activatespacehandler", "adaptcollector", "adapteazaaspect", "adaptfontfeature", "adaptpapersize", "addfeature", "addtoJSpreamble", "addtocommalist", "addvalue", "adubuffer", "adumarcaje", "afiseazaaspect", "afiseazaculoare", "afiseazafonttext", "afiseazagrid", "afiseazagrupculoare", "afiseazamakeup", "afiseazamediufonttext", "afiseazapaleta", "afiseazarama", "afiseazasetari", "afiseazasetsimboluri", "afiseazastruts", "afiseazatiparire", "aftersplitstring", "aftertestandsplitstring", "alignmentcharacter", "allinputpaths", "alphabeticnumerals", "alwayscitation", "alwayscite", "ampersand", "anchor", "appendetoks", "appendgvalue", "appendtocommalist", "appendtoks", "appendtoksonce", "appendvalue", "apply", "applyalternativestyle", "applyprocessor", "applytocharacters", "applytofirstcharacter", "applytosplitstringchar", "applytosplitstringcharspaced", "applytosplitstringline", "applytosplitstringlinespaced", "applytosplitstringword", "applytosplitstringwordspaced", "applytowords", "arabicdecimals", "arabicexnumerals", "arabicnumerals", "arg", "asciistr", "ascundeblocuri", "ascundere", "aside", "assignalfadimension", "assigndimen", "assigndimension", "assignifempty", "assigntranslation", "assignvalue", "assignwidth", "assumelongusagecs", "astype", "attachment", "autocap", "autodirhbox", "autodirvbox", "autodirvtop", "autoinsertnextspace", "automathematics", "autosetups", "availablehsize", "averagecharwidth", "backgroundimage", "backgroundimagefill", "backgroundline", "baraculoare", "barainteractiune", "basegrid", "baselineleftbox", "baselinemiddlebox", "baselinerightbox", "bbox", "beforesplitstring", "beforetestandsplitstring", "big", "bigbodyfont", "bigg", "bigger", "biggl", "biggm", "biggr", "bigl", "bigm", "bigr", "bigskip", "binom", "bitmapimage", "blanc", "blap", "bleed", "bleedheight", "bleedwidth", "blockligatures", "blockquote", "bodyfontenvironmentlist", "bodyfontsize", "bold", "boldface", "bolditalic", "boldslanted", "booleanmodevalue", "bottombox", "bottomleftbox", "bottomrightbox", "boxcursor", "boxmarker", "boxofsize", "boxreference", "bpos", "bthiddencitation", "btxabbreviatedjournal", "btxaddjournal", "btxalwayscitation", "btxauthorfield", "btxdetail", "btxdirect", "btxdoif", "btxdoifcombiinlistelse", "btxdoifelse", "btxdoifelsecombiinlist", "btxdoifelsesameasprevious", "btxdoifelsesameaspreviouschecked", "btxdoifelseuservariable", "btxdoifnot", "btxdoifsameaspreviouscheckedelse", "btxdoifsameaspreviouselse", "btxdoifuservariableelse", "btxexpandedjournal", "btxfield", "btxfieldname", "btxfieldtype", "btxfirstofrange", "btxflush", "btxflushauthor", "btxflushauthorinverted", "btxflushauthorinvertedshort", "btxflushauthorname", "btxflushauthornormal", "btxflushauthornormalshort", "btxflushsuffix", "btxfoundname", "btxfoundtype", "btxhybridcite", "btxlistcitation", "btxloadjournalist", "btxoneorrange", "btxremapauthor", "btxsavejournalist", "btxsetup", "btxsingularorplural", "btxsingularplural", "btxtextcitation", "butoaneinteractiune", "buton", "butonmeniu", "calligraphic", "camel", "camp", "capitol", "catcodetablename", "cbox", "centerbox", "centeredbox", "centerednextbox", "cfrac", "chardescription", "charwidthlanguage", "checkcharacteralign", "checkedchar", "checkedfiller", "checkedstrippedcsname", "checkinjector", "checknextindentation", "checknextinjector", "checkpage", "checkparameters", "checkpreviousinjector", "checksoundtrack", "checktwopassdata", "checkvariables", "chem", "chemical", "chemicalbottext", "chemicalmidtext", "chemicalsymbol", "chemicaltext", "chemicaltoptext", "chineseallnumerals", "chinesecapnumerals", "chinesenumerals", "citat", "citation", "cite", "clap", "classfont", "cldcommand", "cldcontext", "cldloadfile", "cldprocessfile", "cleftarrow", "clip", "cloneazacamp", "collect", "collectedtext", "collectexpanded", "coloana", "colorcomponents", "colored", "coloronly", "columnbreak", "combinepages", "comentariu", "commalistelement", "commalistsentence", "commalistsize", "comment", "comparagrupculoare", "comparapaleta", "comparedimension", "comparedimensioneps", "completeazanumarpagina", "completebtxrendering", "completelist", "completelistofpublications", "completelistofsorts", "completelistofsynonyms", "completeregister", "complexorsimple", "complexorsimpleempty", "componenta", "composedcollector", "composedlayer", "compresult", "constantdimen", "constantdimenargument", "constantemptyargument", "constantnumber", "constantnumberargument", "contentreference", "continuednumber", "continueifinputfile", "convertargument", "convertcommand", "convertedcounter", "converteddimen", "convertedsubcounter", "convertestenumar", "convertmonth", "convertvalue", "convertvboxtohbox", "copiazacamp", "copypages", "copyparameters", "copyposition", "corecteazaspatiualb", "countersubs", "counttoken", "counttokens", "cramped", "crampedclap", "crampedllap", "crampedrlap", "crightarrow", "crightoverleftarrow", "ctop", "ctxcommand", "ctxdirectcommand", "ctxdirectlua", "ctxfunction", "ctxlatecommand", "ctxlatelua", "ctxloadluafile", "ctxlua", "ctxluabuffer", "ctxluacode", "ctxreport", "ctxsprint", "culoare", "culoaregri", "currentassignmentlistkey", "currentassignmentlistvalue", "currentbtxuservariable", "currentcommalistitem", "currentcomponent", "currentenvironment", "currentfeaturetest", "currentinterface", "currentlanguage", "currentlistentrydestinationattribute", "currentlistentrylimitedtext", "currentlistentrynumber", "currentlistentrypagenumber", "currentlistentryreferenceattribute", "currentlistentrytitle", "currentlistentrytitlerendered", "currentlistsymbol", "currentmainlanguage", "currentmessagetext", "currentmoduleparameter", "currentoutputstream", "currentproduct", "currentproject", "currentregime", "currentregisterpageuserdata", "currentresponses", "currenttime", "currentvalue", "currentxtablecolumn", "currentxtablerow", "data", "datacurenta", "datasetvariable", "dayoftheweek", "dayspermonth", "dbinom", "decrement", "decrementcounter", "decrementedcounter", "decrementpagenumber", "decrementsubpagenumber", "decrementvalue", "defaultinterface", "defaultobjectpage", "defaultobjectreference", "defcatcodecommand", "defconvertedargument", "defconvertedcommand", "defconvertedvalue", "defineMPinstance", "defineTABLEsetup", "defineactivecharacter", "definealternativestyle", "defineanchor", "defineattachment", "defineattribute", "definebackground", "definebar", "definebodyfontswitch", "definebreakpoint", "definebreakpoints", "definebtx", "definebtxdataset", "definebtxregister", "definebtxrendering", "definebutton", "definecapitals", "definecharacterkerning", "definecharacterspacing", "definechemical", "definechemicals", "definechemicalsymbol", "definecollector", "definecolumnbreak", "definecombination", "definecomment", "definecomplexorsimple", "definecomplexorsimpleempty", "defineconversionset", "definecounter", "definedataset", "definedelimitedtext", "definedfont", "defineeffect", "defineexpandable", "defineexternalfigure", "definefallbackfamily", "definefieldbody", "definefieldbodyset", "definefieldcategory", "definefileconstant", "definefilefallback", "definefilesynonym", "definefiller", "definefirstline", "definefittingpage", "definefontalternative", "definefontfallback", "definefontfamily", "definefontfamilypreset", "definefontfeature", "definefontfile", "definefontsize", "definefontsolution", "defineformula", "defineformulaalternative", "defineformulaframed", "defineframedcontent", "definefrozenfont", "defineglobalcolor", "definegraphictypesynonym", "definegridsnapping", "defineheadalternative", "definehelp", "definehigh", "definehighlight", "definehspace", "definehypenationfeatures", "defineindentedtext", "defineindenting", "defineinitial", "defineinsertion", "defineinteraction", "defineinteractionbar", "defineinterfaceconstant", "defineinterfaceelement", "defineinterfacevariable", "defineinterlinespace", "defineintermediatecolor", "defineitemgroup", "defineitems", "definelabelclass", "definelayer", "definelayerpreset", "definelayout", "definelinefiller", "definelinenote", "definelinenumbering", "definelines", "definelistalternative", "definelistextra", "definelow", "definelowhigh", "definelowmidhigh", "definemarginblock", "definemargindata", "definemarker", "definemathalignment", "definemathcases", "definemathcommand", "definemathdoubleextensible", "definemathematics", "definemathextensible", "definemathfence", "definemathfraction", "definemathframed", "definemathmatrix", "definemathornament", "definemathoverextensible", "definemathovertextextensible", "definemathradical", "definemathstackers", "definemathstyle", "definemathtriplet", "definemathunderextensible", "definemathundertextextensible", "definemathunstacked", "definemeasure", "definemessageconstant", "definemixedcolumns", "definemode", "definemultitonecolor", "definenamedcolor", "definenamespace", "definenarrower", "definenote", "defineornament", "defineoutputroutine", "defineoutputroutinecommand", "definepage", "definepagebreak", "definepagechecker", "definepagegrid", "definepagegridarea", "definepagegridspan", "definepageinjection", "definepageinjectionalternative", "definepageshift", "definepagestate", "definepairedbox", "defineparagraph", "defineparallel", "defineparbuilder", "defineplacement", "definepositioning", "defineprefixset", "defineprocesscolor", "defineprocessor", "definepushbutton", "definepushsymbol", "definerenderingwindow", "defineresetset", "definescale", "definescript", "definesectionlevels", "defineselector", "defineseparatorset", "defineshift", "definesidebar", "definesort", "definespotcolor", "defineste", "definesteantet", "definestebloc", "definesteblocsectiune", "definestebuffer", "definestecamp", "definesteconversie", "definesteculoare", "definestedescriere", "definestedimensiunehartie", "definesteenumerare", "definesteeticheta", "definestefloat", "definestefont", "definestefonttext", "definesteformatreferinte", "definestegrupculori", "definestehbox", "definesteinconjurare", "definestelista", "definestelistacombinata", "definestemakeup", "definestemarcaje", "definestemediulfonttext", "definestemeniuinteractiune", "definesteoverlay", "definestepaleta", "definesteparagraf", "definesteprofil", "definesteprogram", "definestereferinte", "definesteregistru", "definestesablontabel", "definestesectiune", "definestesimbol", "definestesimbolfigura", "definestesinonim", "definestesinonimfont", "definestesortare", "definestestartstop", "definestestil", "definestestilfont", "definestestivacampuri", "definestesubcamp", "definestetabulatori", "definestetext", "definestetextinconjurat", "definestetyping", "definestyleinstance", "definesubformula", "definesynonym", "definesystemattribute", "definesystemconstant", "definesystemvariable", "definetabulation", "definetextbackground", "definetextflow", "definetooltip", "definetransparency", "definetwopasslist", "definetype", "definetypeface", "definetypescriptprefix", "definetypescriptsynonym", "definetypesetting", "defineunit", "defineviewerlayer", "definevspace", "definevspacing", "definevspacingamount", "definextable", "delimited", "delimitedtext", "depthofstring", "depthonlybox", "depthspanningtext", "despre", "determinacaracteristicilelistei", "determinacaracteristiciregistru", "determinanumartitlu", "determinenoflines", "devanagarinumerals", "dfrac", "digits", "dimensiontocount", "din", "directcolor", "directcolored", "directconvertedcounter", "directdummyparameter", "directgetboxllx", "directgetboxlly", "directhighlight", "directlocalframed", "directluacode", "directselect", "directsetbar", "directsetup", "directsymbol", "directvspacing", "dis", "disabledirectives", "disableexperiments", "disablemode", "disableoutputstream", "disableparpositions", "disableregime", "disabletrackers", "displaymath", "displaymathematics", "displaymessage", "distributedhsize", "dividedsize", "doadaptleftskip", "doadaptrightskip", "doaddfeature", "doassign", "doassignempty", "doboundtext", "docheckassignment", "docheckedpagestate", "docheckedpair", "documentvariable", "dodoubleargument", "dodoubleargumentwithset", "dodoubleempty", "dodoubleemptywithset", "dodoublegroupempty", "doeassign", "doexpandedrecurse", "dogetattribute", "dogetattributeid", "dogetcommacommandelement", "dogobbledoubleempty", "dogobblesingleempty", "doif", "doifMPgraphicelse", "doifallcommon", "doifallcommonelse", "doifalldefinedelse", "doifallmodes", "doifallmodeselse", "doifassignmentelse", "doifblackelse", "doifbothsides", "doifbothsidesoverruled", "doifboxelse", "doifbufferelse", "doifcolor", "doifcolorelse", "doifcommandhandler", "doifcommandhandlerelse", "doifcommon", "doifcommonelse", "doifcontent", "doifconversiondefinedelse", "doifconversionnumberelse", "doifcounter", "doifcounterelse", "doifcurrentfonthasfeatureelse", "doifdefined", "doifdefinedcounter", "doifdefinedcounterelse", "doifdefinedelse", "doifdimensionelse", "doifdimenstringelse", "doifdocumentargument", "doifdocumentargumentelse", "doifdocumentfilename", "doifdocumentfilenameelse", "doifdrawingblackelse", "doifelse", "doifelseMPgraphic", "doifelseallcommon", "doifelsealldefined", "doifelseallmodes", "doifelseassignment", "doifelseblack", "doifelsebox", "doifelsebuffer", "doifelsecolor", "doifelsecommandhandler", "doifelsecommon", "doifelseconversiondefined", "doifelseconversionnumber", "doifelsecounter", "doifelsecurrentfonthasfeature", "doifelsecurrentsortingused", "doifelsecurrentsynonymshown", "doifelsecurrentsynonymused", "doifelsedefined", "doifelsedefinedcounter", "doifelsedimension", "doifelsedimenstring", "doifelsedocumentargument", "doifelsedocumentfilename", "doifelsedrawingblack", "doifelseempty", "doifelseemptyvalue", "doifelseemptyvariable", "doifelseenv", "doifelsefastoptionalcheck", "doifelsefastoptionalcheckcs", "doifelsefieldbody", "doifelsefieldcategory", "doifelsefigure", "doifelsefile", "doifelsefiledefined", "doifelsefileexists", "doifelsefirstchar", "doifelseflagged", "doifelsefontchar", "doifelsefontpresent", "doifelsefontsynonym", "doifelsehasspace", "doifelsehelp", "doifelseincsname", "doifelseinelement", "doifelseinputfile", "doifelseinsertion", "doifelseinset", "doifelseinstring", "doifelseinsymbolset", "doifelseintoks", "doifelseintwopassdata", "doifelseitalic", "doifelselanguage", "doifelselayerdata", "doifelselayoutdefined", "doifelselayoutsomeline", "doifelselayouttextline", "doifelseleapyear", "doifelselist", "doifelselocation", "doifelselocfile", "doifelsemainfloatbody", "doifelsemarking", "doifelsemeaning", "doifelsemessage", "doifelsemode", "doifelsenextbgroup", "doifelsenextbgroupcs", "doifelsenextchar", "doifelsenextoptional", "doifelsenextoptionalcs", "doifelsenextparenthesis", "doifelsenonzeropositive", "doifelsenoteonsamepage", "doifelsenothing", "doifelsenumber", "doifelseobjectfound", "doifelseobjectreferencefound", "doifelseoddpage", "doifelseoddpagefloat", "doifelseoldercontext", "doifelseolderversion", "doifelseoverlapping", "doifelseoverlay", "doifelseparallel", "doifelseparentfile", "doifelsepath", "doifelsepathexists", "doifelsepatterns", "doifelseposition", "doifelsepositionaction", "doifelsepositiononpage", "doifelsepositionsonsamepage", "doifelsepositionsonthispage", "doifelsepositionsused", "doifelsereferencefound", "doifelserightpagefloat", "doifelserighttoleftinbox", "doifelsesamelinereference", "doifelsesamestring", "doifelsesetups", "doifelsesomebackground", "doifelsesomespace", "doifelsesomething", "doifelsesometoks", "doifelsestringinstring", "doifelsestructurelisthasnumber", "doifelsestructurelisthaspage", "doifelsesymboldefined", "doifelsesymbolset", "doifelsetext", "doifelsetextflow", "doifelsetextflowcollector", "doifelsetypingfile", "doifelseundefined", "doifelseurldefined", "doifelsevalue", "doifelsevaluenothing", "doifelsevariable", "doifempty", "doifemptyelse", "doifemptytoks", "doifemptyvalue", "doifemptyvalueelse", "doifemptyvariable", "doifemptyvariableelse", "doifenv", "doifenvelse", "doiffastoptionalcheckcselse", "doiffastoptionalcheckelse", "doiffieldbodyelse", "doiffieldcategoryelse", "doiffigureelse", "doiffile", "doiffiledefinedelse", "doiffileelse", "doiffileexistselse", "doiffirstcharelse", "doifflaggedelse", "doiffontcharelse", "doiffontpresentelse", "doiffontsynonymelse", "doifhasspaceelse", "doifhelpelse", "doifincsnameelse", "doifinelementelse", "doifinputfileelse", "doifinsertionelse", "doifinset", "doifinsetelse", "doifinstring", "doifinstringelse", "doifinsymbolset", "doifinsymbolsetelse", "doifintokselse", "doifintwopassdataelse", "doifitalicelse", "doiflanguageelse", "doiflayerdataelse", "doiflayoutdefinedelse", "doiflayoutsomelineelse", "doiflayouttextlineelse", "doifleapyearelse", "doiflistelse", "doiflocationelse", "doiflocfileelse", "doifmainfloatbodyelse", "doifmarkingelse", "doifmeaningelse", "doifmessageelse", "doifmode", "doifmodeelse", "doifnextbgroupcselse", "doifnextbgroupelse", "doifnextcharelse", "doifnextoptionalcselse", "doifnextoptionalelse", "doifnextparenthesiselse", "doifnonzeropositiveelse", "doifnot", "doifnotallcommon", "doifnotallmodes", "doifnotcommandhandler", "doifnotcommon", "doifnotcounter", "doifnotdocumentargument", "doifnotdocumentfilename", "doifnotempty", "doifnotemptyvalue", "doifnotemptyvariable", "doifnotenv", "doifnoteonsamepageelse", "doifnotescollected", "doifnotfile", "doifnotflagged", "doifnothing", "doifnothingelse", "doifnotinset", "doifnotinsidesplitfloat", "doifnotinstring", "doifnotmode", "doifnotnumber", "doifnotsamestring", "doifnotsetups", "doifnotvalue", "doifnotvariable", "doifnumber", "doifnumberelse", "doifobjectfoundelse", "doifobjectreferencefoundelse", "doifoddpageelse", "doifoddpagefloatelse", "doifoldercontextelse", "doifolderversionelse", "doifoverlappingelse", "doifoverlayelse", "doifparallelelse", "doifparentfileelse", "doifpathelse", "doifpathexistselse", "doifpatternselse", "doifposition", "doifpositionaction", "doifpositionactionelse", "doifpositionelse", "doifpositiononpageelse", "doifpositionsonsamepageelse", "doifpositionsonthispageelse", "doifpositionsusedelse", "doifreferencefoundelse", "doifrightpagefloatelse", "doifrighttoleftinboxelse", "doifsamelinereferenceelse", "doifsamestring", "doifsamestringelse", "doifsetups", "doifsetupselse", "doifsomebackground", "doifsomebackgroundelse", "doifsomespaceelse", "doifsomething", "doifsomethingelse", "doifsometoks", "doifsometokselse", "doifstringinstringelse", "doifstructurelisthasnumberelse", "doifstructurelisthaspageelse", "doifsymboldefinedelse", "doifsymbolsetelse", "doiftext", "doiftextelse", "doiftextflowcollectorelse", "doiftextflowelse", "doiftypingfileelse", "doifundefined", "doifundefinedcounter", "doifundefinedelse", "doifurldefinedelse", "doifvalue", "doifvalueelse", "doifvaluenothing", "doifvaluenothingelse", "doifvaluesomething", "doifvariable", "doifvariableelse", "doindentation", "dollar", "doloop", "doloopoverlist", "donothing", "dontconvertfont", "dontleavehmode", "dontpermitspacesbetweengroups", "dopositionaction", "doprocesslocalsetups", "doquadrupleargument", "doquadrupleempty", "doquadruplegroupempty", "doquintupleargument", "doquintupleempty", "doquintuplegroupempty", "dorechecknextindentation", "dorecurse", "dorepeatwithcommand", "doreplacefeature", "doresetandafffeature", "doresetattribute", "dorotatebox", "dosetattribute", "dosetleftskipadaption", "dosetrightskipadaption", "dosetupcheckedinterlinespace", "doseventupleargument", "doseventupleempty", "dosingleargument", "dosingleempty", "dosinglegroupempty", "dosixtupleargument", "dosixtupleempty", "dostepwiserecurse", "dosubtractfeature", "dotfskip", "dotoks", "dotripleargument", "dotripleargumentwithset", "dotripleempty", "dotripleemptywithset", "dotriplegroupempty", "doublebar", "doublebond", "doublebrace", "doublebracket", "doubleparent", "dowith", "dowithnextbox", "dowithnextboxcontent", "dowithnextboxcontentcs", "dowithnextboxcs", "dowithpargument", "dowithrange", "dowithwargument", "dpofstring", "dummydigit", "dummyparameter", "dute", "dutebox", "dutepagina", "eTeX", "ecran", "edefconvertedargument", "efcmaxheight", "efcmaxwidth", "efcminheight", "efcminwidth", "efcparameter", "effect", "elapsedseconds", "elapsedtime", "eleftarrowfill", "eleftharpoondownfill", "eleftharpoonupfill", "eleftrightarrowfill", "element", "emphasisboldface", "emphasistypeface", "emptylines", "emspace", "enabledirectives", "enableexperiments", "enablemode", "enableoutputstream", "enableparpositions", "enableregime", "enabletrackers", "enskip", "enspace", "enumerare", "env", "envvar", "eoverbarfill", "eoverbracefill", "eoverbracketfill", "eoverparentfill", "epos", "equaldigits", "erightarrowfill", "erightharpoondownfill", "erightharpoonupfill", "etwoheadrightarrowfill", "eunderbarfill", "eunderbracefill", "eunderbracketfill", "eunderparentfill", "executeifdefined", "exitloop", "exitloopnow", "expandcheckedcsname", "expanded", "expandfontsynonym", "externalfigurecollectionmaxheight", "externalfigurecollectionmaxwidth", "externalfigurecollectionminheight", "externalfigurecollectionminwidth", "externalfigurecollectionparameter", "fakebox", "faraliniiantetsisubsol", "faraliniisussijos", "faraspatiu", "fastdecrement", "fastincrement", "fastlocalframed", "fastscale", "fastsetup", "fastsetupwithargument", "fastsetupwithargumentswapped", "fastswitchtobodyfont", "fastsxsy", "feature", "fence", "fenced", "fetchallmarkings", "fetchallmarks", "fetchmark", "fetchmarking", "fetchonemark", "fetchonemarking", "fetchruntinecommand", "fetchtwomarkings", "fetchtwomarks", "fieldbody", "fifthoffivearguments", "fifthofsixarguments", "figura", "figuraexterna", "figurefilename", "figurefilepath", "figurefiletype", "figurefullname", "figureheight", "figurenaturalheight", "figurenaturalwidth", "figuresymbol", "figurewidth", "filename", "filledhboxb", "filledhboxc", "filledhboxg", "filledhboxk", "filledhboxm", "filledhboxr", "filledhboxy", "filler", "filterfromnext", "filterfromvalue", "filterpages", "filterreference", "findtwopassdata", "finishregisterentry", "firdepar", "firstcharacter", "firstcounter", "firstcountervalue", "firstoffivearguments", "firstoffourarguments", "firstofoneargument", "firstofoneunexpanded", "firstofsixarguments", "firstofthreearguments", "firstofthreeunexpanded", "firstoftwoarguments", "firstoftwounexpanded", "firstrealpage", "firstrealpagenumber", "firstsubcountervalue", "firstsubpage", "firstsubpagenumber", "firstuserpage", "firstuserpagenumber", "fitfieldframed", "fittopbaselinegrid", "flag", "floatuserdataparameter", "flushboxregister", "flushcollector", "flushlayer", "flushlocalfloats", "flushnextbox", "flushnotes", "flushoutputstream", "flushshapebox", "flushtextflow", "flushtokens", "flushtoks", "folosesteURL", "folosestebloc", "folosestedirector", "folosestedocumentextern", "folosestefiguraexterna", "folosestemodul", "folosestemuzicaexterna", "folosestescriptJS", "folosestesimboluri", "folosesteurl", "fontalternative", "fontbody", "fontchar", "fontcharbyindex", "fontclass", "fontclassname", "fontface", "fontfeaturelist", "fontsize", "fontstyle", "footnotetext", "forcecharacterstripping", "forcelocalfloats", "forgeteverypar", "forgetparameters", "formula", "foundbox", "fourthoffivearguments", "fourthoffourarguments", "fourthofsixarguments", "frac", "framed", "frameddimension", "framedparameter", "framedtext", "freezedimenmacro", "freezemeasure", "frenchspacing", "fromlinenote", "frozenhbox", "fundal", "gdefconvertedargument", "gdefconvertedcommand", "getMPdrawing", "getMPlayer", "getboxllx", "getboxlly", "getbufferdata", "getcommacommandsize", "getcommalistsize", "getdayoftheweek", "getdayspermonth", "getdefinedbuffer", "getdocumentargument", "getdocumentargumentdefault", "getdocumentfilename", "getdummyparameters", "getemptyparameters", "geteparameters", "getexpandedparameters", "getfiguredimensions", "getfirstcharacter", "getfirsttwopassdata", "getfromcommacommand", "getfromcommalist", "getfromtwopassdata", "getglyphdirect", "getglyphstyled", "getgparameters", "getlasttwopassdata", "getlocalfloat", "getlocalfloats", "getmessage", "getnamedglyphdirect", "getnamedglyphstyled", "getnamedtwopassdatalist", "getnaturaldimensions", "getnoflines", "getobject", "getobjectdimensions", "getpaletsize", "getparameters", "getprivatechar", "getprivateslot", "getrandomcount", "getrandomdimen", "getrandomfloat", "getrandomnumber", "getrandomseed", "getraweparameters", "getrawgparameters", "getrawnoflines", "getrawparameters", "getrawxparameters", "getreference", "getreferenceentry", "getroundednoflines", "getsubstring", "gettwopassdata", "gettwopassdatalist", "getuvalue", "getvalue", "getvariable", "getvariabledefault", "getxparameters", "globaldisablemode", "globalenablemode", "globalletempty", "globalpopbox", "globalpopmacro", "globalpreventmode", "globalprocesscommalist", "globalpushbox", "globalpushmacro", "globalswapcounts", "globalswapdimens", "globalswapmacros", "globalundefine", "glyphfontfile", "gobbledoubleempty", "gobbleeightarguments", "gobblefivearguments", "gobblefiveoptionals", "gobblefourarguments", "gobblefouroptionals", "gobbleninearguments", "gobbleoneargument", "gobbleoneoptional", "gobblesevenarguments", "gobblesingleempty", "gobblesixarguments", "gobblespacetokens", "gobbletenarguments", "gobblethreearguments", "gobblethreeoptionals", "gobbletwoarguments", "gobbletwooptionals", "gobbleuntil", "gobbleuntilrelax", "grabbufferdata", "grabbufferdatadirect", "grabuntil", "graficul", "grayvalue", "greedysplitstring", "greeknumerals", "grid", "grosimelinie", "groupedcommand", "gsetboxllx", "gsetboxlly", "gujaratinumerals", "gurmurkhinumerals", "hairspace", "halfwaybox", "handletokens", "handwritten", "hash", "hboxofvbox", "hboxreference", "hdofstring", "headhbox", "headnumbercontent", "headnumberdistance", "headnumberwidth", "headreferenceattributes", "headsetupspacing", "headtextcontent", "headtextdistance", "headtextwidth", "headvbox", "headwidth", "heightanddepthofstring", "heightofstring", "heightspanningtext", "helptext", "hglue", "hiddenbar", "hiddencitation", "hiddencite", "highlight", "highordinalstr", "hilo", "himilo", "hl", "horizontalgrowingbar", "horizontalpositionbar", "hphantom", "hpos", "hsizefraction", "hsmash", "hsmashbox", "hsmashed", "hspace", "htdpofstring", "htofstring", "hyphen", "hyphenatedcoloredword", "hyphenatedfile", "hyphenatedfilename", "hyphenatedhbox", "hyphenatedpar", "hyphenatedurl", "hyphenatedword", "ibox", "ifassignment", "iff", "ifinobject", "ifinoutputstream", "ifparameters", "iftrialtypesetting", "ignoreimplicitspaces", "ignorevalue", "immediatesavetwopassdata", "impartefloat", "impliedby", "implies", "in", "inalt", "includemenu", "includeversioninfo", "increment", "incrementcounter", "incrementedcounter", "incrementpagenumber", "incrementsubpagenumber", "incrementvalue", "indentation", "infofont", "infofontbold", "inframed", "inheritparameter", "inhibitblank", "initializeboxstack", "injos", "inlinebuffer", "inlinedbox", "inlinemath", "inlinemathematics", "inlinemessage", "inlineordisplaymath", "inlinerange", "inlinie", "inmaframed", "innerflushshapebox", "input", "inputfilebarename", "inputfilename", "inputfilerealsuffix", "inputfilesuffix", "inputgivenfile", "insertpages", "instalarelimba", "installactionhandler", "installactivecharacter", "installanddefineactivecharacter", "installattributestack", "installautocommandhandler", "installautosetuphandler", "installbasicautosetuphandler", "installbasicparameterhandler", "installbottomframerenderer", "installcommandhandler", "installcorenamespace", "installdefinehandler", "installdefinitionset", "installdefinitionsetmember", "installdirectcommandhandler", "installdirectparameterhandler", "installdirectparametersethandler", "installdirectsetuphandler", "installdirectstyleandcolorhandler", "installframedautocommandhandler", "installframedcommandhandler", "installleftframerenderer", "installnamespace", "installoutputroutine", "installpagearrangement", "installparameterhandler", "installparameterhashhandler", "installparametersethandler", "installparentinjector", "installrightframerenderer", "installrootparameterhandler", "installsetuphandler", "installsetuponlycommandhandler", "installshipoutmethod", "installsimplecommandhandler", "installsimpleframedcommandhandler", "installstyleandcolorhandler", "installswitchcommandhandler", "installswitchsetuphandler", "installtexdirective", "installtextracker", "installtopframerenderer", "installunitsseparator", "installunitsspace", "installversioninfo", "integerrounding", "intermezzo", "intertext", "intins", "invokepageheandler", "istltdir", "istrtdir", "italic", "italicbold", "italiccorrection", "itemtag", "jobfilename", "jobfilesuffix", "jos", "jossus", "kap", "keeplinestogether", "keepunwantedspaces", "kerncharacters", "koreancirclenumerals", "koreannumerals", "koreannumeralsc", "koreannumeralsp", "koreanparentnumerals", "la", "languageCharacters", "languagecharacters", "languagecharwidth", "lapagina", "lastcounter", "lastcountervalue", "lastdigit", "lastlinewidth", "lastnaturalboxdp", "lastnaturalboxht", "lastnaturalboxwd", "lastpredefinedsymbol", "lastrealpage", "lastrealpagenumber", "lastsubcountervalue", "lastsubpage", "lastsubpagenumber", "lasttwodigits", "lastuserpage", "lastuserpagenumber", "lateluacode", "layeredtext", "layerheight", "layerwidth", "lazysavetaggedtwopassdata", "lazysavetwopassdata", "lbox", "left", "leftbottombox", "leftbox", "lefthbox", "leftorrighthbox", "leftorrightvbox", "leftorrightvtop", "leftskipadaption", "leftsubguillemot", "lefttopbox", "lefttorighthbox", "lefttorightvbox", "lefttorightvtop", "letbeundefined", "letcatcodecommand", "letcscsname", "letcsnamecs", "letcsnamecsname", "letdummyparameter", "letempty", "letgvalue", "letgvalueempty", "letgvalurelax", "letterampersand", "letterat", "letterbackslash", "letterbar", "letterbgroup", "letterclosebrace", "lettercolon", "letterdollar", "letterdoublequote", "letteregroup", "letterescape", "letterexclamationmark", "letterhash", "letterhat", "letterleftbrace", "letterless", "lettermore", "letteropenbrace", "letterpercent", "letterquestionmark", "letterrightbrace", "lettersinglequote", "letterslash", "letterspacing", "lettertilde", "letterunderscore", "letvalue", "letvalueempty", "letvaluerelax", "lfence", "lhbox", "limba", "limbaprincipala", "limitatelines", "limitatetext", "limtatefirstline", "linespanningtext", "linieneagra", "liniesubtire", "linieumplere", "liniinegre", "liniisubtiri", "listcitation", "listcite", "listnamespaces", "litera", "litere", "llap", "loadanyfile", "loadanyfileonce", "loadbtxdefinitionfile", "loadbtxreplacementfile", "loadcldfile", "loadcldfileonce", "loadfontgoodies", "loadluafile", "loadluafileonce", "loadspellchecklist", "loadtexfile", "loadtexfileonce", "loadtypescriptfile", "localframed", "localframedwithsettings", "localhsize", "localpopbox", "localpopmacro", "localpushbox", "localpushmacro", "localundefine", "locatedfilepath", "locatefilepath", "locfilename", "lomihi", "lowerbox", "lowercased", "lowercasestring", "lowerleftdoubleninequote", "lowerleftsingleninequote", "lowerrightdoubleninequote", "lowerrightsingleninequote", "lrtbbox", "ltop", "luaTeX", "luacode", "luaconditional", "luaenvironment", "luaexpanded", "luafunction", "luajitTeX", "luamajorversion", "luaminorversion", "luaparameterset", "luasetup", "luaversion", "luna", "lungimelista", "m", "mLeftarrow", "mLeftrightarrow", "mRightarrow", "maframed", "makecharacteractive", "makerawcommalist", "makestrutofbox", "mapfontsize", "marcaje", "margindata", "markcontent", "markinjector", "mat", "matematica", "math", "mathbf", "mathbi", "mathblackboard", "mathbs", "mathcommand", "mathdefault", "mathfraktur", "mathfunction", "mathit", "mathitalic", "mathop", "mathrm", "mathscript", "mathsl", "mathss", "mathtext", "mathtextbf", "mathtextbi", "mathtextbs", "mathtextit", "mathtextsl", "mathtexttf", "mathtf", "mathtriplet", "mathtt", "mathupright", "mathword", "mathwordbf", "mathwordbi", "mathwordbs", "mathwordit", "mathwordsl", "mathwordtf", "mbox", "mcframed", "md", "measure", "measured", "mediu", "medskip", "medspace", "meniuinteractiune", "mequal", "message", "metaTeX", "mfence", "mfunction", "mfunctionlabeltext", "mhbox", "mhookleftarrow", "mhookrightarrow", "middle", "middlebox", "midhbox", "minicitat", "minimalhbox", "mixedcaps", "mkvibuffer", "mleftarrow", "mleftharpoondown", "mleftharpoonup", "mleftrightarrow", "mleftrightharpoons", "mmapsto", "moduleparameter", "molecule", "mono", "monobold", "mononormal", "monthlong", "monthshort", "mp", "mprandomnumber", "mrel", "mrightarrow", "mrightharpoondown", "mrightharpoonup", "mrightleftharpoons", "mrightoverleftarrow", "mtext", "mtriplerel", "mtwoheadleftarrow", "mtwoheadrightarrow", "namedheadnumber", "namedstructureheadlocation", "namedstructureuservariable", "namedstructurevariable", "namedtaggedlabeltexts", "naturalhbox", "naturalhpack", "naturalvbox", "naturalvcenter", "naturalvpack", "naturalvtop", "naturalwd", "necunoscut", "negatecolorbox", "negated", "negthinspace", "newattribute", "newcatcodetable", "newcounter", "newevery", "newfrenchspacing", "newmode", "newsignal", "newsystemmode", "nextbox", "nextboxdp", "nextboxht", "nextboxhtdp", "nextboxwd", "nextcounter", "nextcountervalue", "nextdepth", "nextparagraphs", "nextrealpage", "nextrealpagenumber", "nextsubcountervalue", "nextsubpage", "nextsubpagenumber", "nextuserpage", "nextuserpagenumber", "nobar", "nocitation", "nocite", "nodetostring", "noffigurepages", "noflines", "noflocalfloats", "noindentation", "noitem", "nokap", "nonfrenchspacing", "nonmathematics", "normal", "normalboldface", "normalframedwithsettings", "normalizebodyfontsize", "normalizedfontsize", "normalizefontdepth", "normalizefontheight", "normalizefontline", "normalizefontwidth", "normalizetextdepth", "normalizetextheight", "normalizetextline", "normalizetextwidth", "normaltypeface", "nota", "notesymbol", "ntimes", "numarformula", "numarpagina", "numartitlu", "numartitlucurent", "numberofpoints", "numere", "numereromane", "obeydepth", "objectdepth", "objectheight", "objectmargin", "objectwidth", "obox", "offset", "offsetbox", "olinie", "onedigitrounding", "ordinaldaynumber", "ordinalstr", "ornamenttext", "outputfilename", "outputstreambox", "outputstreamcopy", "outputstreamunvbox", "outputstreamunvcopy", "over", "overbar", "overbars", "overbartext", "overbarunderbar", "overbrace", "overbracetext", "overbraceunderbrace", "overbracket", "overbrackettext", "overbracketunderbracket", "overlaybutton", "overlaycolor", "overlaydepth", "overlayfigure", "overlayheight", "overlaylinecolor", "overlaylinewidth", "overlayoffset", "overlayrollbutton", "overlaywidth", "overleftarrow", "overleftharpoondown", "overleftharpoonup", "overleftrightarrow", "overloaderror", "overparent", "overparenttext", "overparentunderparent", "overrightarrow", "overrightharpoondown", "overrightharpoonup", "overset", "overstrike", "overstrikes", "overtwoheadleftarrow", "overtwoheadrightarrow", "pagearea", "pagebreak", "pagefigure", "pagegridspanwidth", "pageinjection", "pagestaterealpage", "pagina", "paletsize", "pastreazablocuri", "pdfTeX", "pdfactualtext", "pdfbackendactualtext", "pdfbackendcurrentresources", "pdfbackendsetcatalog", "pdfbackendsetcolorspace", "pdfbackendsetextgstate", "pdfbackendsetinfo", "pdfbackendsetname", "pdfbackendsetpageattribute", "pdfbackendsetpageresource", "pdfbackendsetpagesattribute", "pdfbackendsetpattern", "pdfbackendsetshade", "pdfcolor", "pdfeTeX", "pelung", "percent", "percentdimen", "permitcaretescape", "permitcircumflexescape", "permitspacesbetweengroups", "persiandecimals", "persiannumerals", "phantom", "phantombox", "pickupgroupedcommand", "placeattachments", "placebtxrendering", "placecitation", "placecomments", "placecurrentformulanumber", "placedbox", "placefloat", "placefloatwithsetups", "placeframed", "placeheadnumber", "placeheadtext", "placehelp", "placeinitial", "placelayer", "placelayeredtext", "placelistofpublications", "placelistofsorts", "placelistofsynonyms", "placelocalnotes", "placement", "placenamedfloat", "placenamedformula", "placenotes", "placepairedbox", "placeparallel", "placerawlist", "placerenderingwindow", "plaseazapegrid", "plaseazasemnecarte", "popattribute", "popmacro", "popmode", "popsystemmode", "positionoverlay", "positionregionoverlay", "postponenotes", "potrivestecamp", "pozitie", "predefinedfont", "predefinefont", "predefinesymbol", "prefixedpagenumber", "prependetoks", "prependgvalue", "prependtocommalist", "prependtoks", "prependtoksonce", "prependvalue", "presetdocument", "presetfieldsymbols", "pretocommalist", "prevcounter", "prevcountervalue", "preventmode", "prevrealpage", "prevrealpagenumber", "prevsubcountervalue", "prevsubpage", "prevsubpagenumber", "prevuserpage", "prevuserpagenumber", "procent", "proceseazabloc", "processMPbuffer", "processMPfigurefile", "processaction", "processallactionsinset", "processassignlist", "processassignmentcommand", "processassignmentlist", "processbetween", "processbodyfontenvironmentlist", "processcolorcomponents", "processcommacommand", "processcommalist", "processcommalistwithparameters", "processcontent", "processfile", "processfilemany", "processfilenone", "processfileonce", "processfirstactioninset", "processisolatedchars", "processisolatedwords", "processlinetablebuffer", "processlinetablefile", "processlist", "processmonth", "processranges", "processseparatedlist", "processtexbuffer", "processtokens", "processuntil", "processxtablebuffer", "processyear", "produs", "profiledbox", "profilegivenbox", "program", "proiect", "pseudoMixedCapped", "pseudoSmallCapped", "pseudoSmallcapped", "pseudosmallcapped", "puncte", "punedeasuprafiecareia", "punefatainfata", "puneformula", "punelista", "punelistacombinata", "punenotesubsol", "punenotesubsollocale", "punenumarpagina", "puneregistru", "punesubformula", "purenumber", "pushattribute", "pushbutton", "pushmacro", "pushmode", "pushoutputstream", "pushsystemmode", "qquad", "quad", "quads", "quitcommalist", "quitprevcommalist", "quittypescriptscanning", "raisebox", "randomizetext", "randomnumber", "rawcounter", "rawcountervalue", "rawdate", "rawdoifelseinset", "rawdoifinset", "rawdoifinsetelse", "rawgetparameters", "rawprocessaction", "rawprocesscommacommand", "rawprocesscommalist", "rawstructurelistuservariable", "rawsubcountervalue", "rbox", "readfile", "readfixfile", "readjobfile", "readlocfile", "readsetfile", "readsysfile", "readtexfile", "readxmlfile", "realSmallCapped", "realSmallcapped", "realpagenumber", "realsmallcapped", "recursedepth", "recurselevel", "recursestring", "redoconvertfont", "ref", "referenceprefix", "referinta", "referintapagina", "referintatext", "referring", "reflexie", "registerattachment", "registerctxluafile", "registerexternalfigure", "registerfontclass", "registerhyphenationexception", "registerhyphenationpattern", "registermenubuttons", "registersort", "registersynonym", "registerunit", "regular", "relatemarking", "relateparameterhandlers", "relaxvalueifundefined", "remainingcharacters", "remarca", "removebottomthings", "removedepth", "removefromcommalist", "removelastskip", "removelastspace", "removemarkedcontent", "removepunctuation", "removesubstring", "removetoks", "removeunwantedspaces", "replacefeature", "replaceincommalist", "replaceword", "rescan", "rescanwithsetup", "resetMPdrawing", "resetMPenvironment", "resetMPinstance", "resetallattributes", "resetandaddfeature", "resetbar", "resetbreakpoints", "resetbuffer", "resetcharacteralign", "resetcharacterkerning", "resetcharacterspacing", "resetcharacterstripping", "resetcollector", "resetcounter", "resetdigitsmanipulation", "resetdirection", "reseteazamarcaje", "resetfeature", "resetflag", "resetfontcolorsheme", "resetfontfallback", "resetfontsolution", "resethyphenationfeatures", "resetinjector", "resetinteractionmenu", "resetitaliccorrection", "resetlayer", "resetlocalfloats", "resetmarker", "resetmode", "resetpagenumber", "resetparallel", "resetpath", "resetpenalties", "resetprofile", "resetreference", "resetreplacement", "resetscript", "resetsetups", "resetshownsynonyms", "resetsubpagenumber", "resetsymbolset", "resetsystemmode", "resettimer", "resettrackers", "resettrialtypesetting", "resetusedsortings", "resetusedsynonyms", "resetuserpagenumber", "resetvalue", "resetvisualizers", "reshapebox", "resolvedglyphdirect", "resolvedglyphstyled", "restartcounter", "restorebox", "restorecatcodes", "restorecounter", "restorecurrentattributes", "restoreendofline", "restoreglobalbodyfont", "reusableMPgraphic", "reuseMPgraphic", "reuserandomseed", "revivefeature", "rfence", "rhbox", "right", "rightbottombox", "rightbox", "righthbox", "rightorleftpageaction", "rightskipadaption", "rightsubguillemot", "righttolefthbox", "righttoleftvbox", "righttoleftvtop", "righttopbox", "riglatext", "rigleumplere", "rlap", "robustaddtocommalist", "robustdoifelseinset", "robustdoifinsetelse", "robustpretocommalist", "rollbutton", "roman", "roteste", "rtop", "ruledhbox", "ruledhpack", "ruledmbox", "ruledtopv", "ruledtpack", "ruledvbox", "ruledvpack", "ruledvtop", "runMPbuffer", "runninghbox", "safechar", "sans", "sansbold", "sansnormal", "sansserif", "savebox", "savebtxdataset", "savebuffer", "savecounter", "savecurrentattributes", "savenormalmeaning", "savetaggedtwopassdata", "savetwopassdata", "sbox", "scala", "scriebuffer", "scrieinlista", "scrieintreliste", "sd", "secondoffivearguments", "secondoffourarguments", "secondofsixarguments", "secondofthreearguments", "secondofthreeunexpanded", "secondoftwoarguments", "secondoftwounexpanded", "sectiune", "select", "selecteazablocuri", "semncarte", "serializecommalist", "serializedcommalist", "serif", "serifbold", "serifnormal", "setJSpreamble", "setMPlayer", "setMPpositiongraphic", "setMPpositiongraphicrange", "setMPtext", "setMPvariable", "setMPvariables", "setareitemization", "setarelimba", "setarepozitie", "setbar", "setbigbodyfont", "setboxllx", "setboxlly", "setbreakpoints", "setcapstrut", "setcatcodetable", "setcharacteralign", "setcharactercasing", "setcharactercleaning", "setcharacterkerning", "setcharacterspacing", "setcharacterstripping", "setcharstrut", "setcollector", "setcolormodell", "setcounter", "setcounterown", "setcurrentfontclass", "setdataset", "setdefaultpenalties", "setdigitsmanipulation", "setdirection", "setdocumentargument", "setdocumentargumentdefault", "setdocumentfilename", "setdummyparameter", "seteazaaliniat", "seteazaantet", "seteazaaranjareapag", "seteazaaspect", "seteazabarainteractiune", "seteazablanc", "seteazabloc", "seteazablocsectiune", "seteazabuffer", "seteazacamp", "seteazacampuri", "seteazaclipping", "seteazacoloane", "seteazacomentariu", "seteazacomentariupagina", "seteazaculoare", "seteazaculori", "seteazadimensiunihartie", "seteazaecraninteractiune", "seteazaelemente", "seteazafloat", "seteazafonttext", "seteazaformulare", "seteazafundal", "seteazafundaluri", "seteazagrosimelinie", "seteazaimpartireafloat", "seteazainconjurat", "seteazaingust", "seteazainteractiunea", "seteazajos", "seteazalegenda", "seteazaliniesilabe", "seteazaliniesubtire", "seteazalinii", "seteazaliniimargine", "seteazaliniinegre", "seteazaliniiumplere", "seteazalista", "seteazalistacombinata", "seteazamajuscule", "seteazamakeup", "seteazamarcaje", "seteazameniuinteractiune", "seteazaminicitat", "seteazanumarpagina", "seteazanumarsubpagina", "seteazanumartitlu", "seteazanumerotarelinii", "seteazanumerotarepagina", "seteazanumerotareparagrafe", "seteazapaleta", "seteazaparagrafe", "seteazaplasareaopozita", "seteazaprograme", "seteazareferinte", "seteazaregistru", "seteazarigletext", "seteazarigleumplere", "seteazarotare", "seteazasimbol", "seteazasinonime", "seteazasortare", "seteazaspatiu", "seteazaspatiualb", "seteazaspatiuinterliniar", "seteazasubsol", "seteazasus", "seteazatabele", "seteazatabulatori", "seteazatext", "seteazatexteantet", "seteazatextejos", "seteazatextesubsol", "seteazatextesus", "seteazatextetext", "seteazatitlu", "seteazatitluri", "seteazatoleranta", "seteazatranzitiepagina", "seteazatype", "seteazatyping", "seteazaurl", "setelementexporttag", "setemeasure", "setevalue", "setevariable", "setevariables", "setfirstline", "setflag", "setfont", "setfontcolorsheme", "setfontfeature", "setfontsolution", "setfontstrut", "setfractions", "setgmeasure", "setgvalue", "setgvariable", "setgvariables", "sethboxregister", "sethyphenatedurlafter", "sethyphenatedurlbefore", "sethyphenatedurlnormal", "sethyphenationfeatures", "setinitial", "setinjector", "setinteraction", "setinterfacecommand", "setinterfaceconstant", "setinterfaceelements", "setinterfacemessage", "setinterfacevariable", "setinternalrendering", "setitaliccorrection", "setlayer", "setlayerframed", "setlayertext", "setlinefiller", "setlocalhsize", "setmainbodyfont", "setmainparbuilder", "setmarker", "setmarking", "setmathstyle", "setmeasure", "setmessagetext", "setmode", "setnostrut", "setnote", "setnotetext", "setobject", "setoldstyle", "setpagegrid", "setpagereference", "setpagestate", "setpagestaterealpageno", "setpenalties", "setpercentdimen", "setposition", "setpositionbox", "setpositiondata", "setpositiondataplus", "setpositiononly", "setpositionplus", "setpositionstrut", "setprofile", "setrandomseed", "setreference", "setreferencedobject", "setregisterentry", "setreplacement", "setrigidcolumnbalance", "setrigidcolumnhsize", "setscript", "setsectionblock", "setsimplecolumnhsize", "setsmallbodyfont", "setsmallcaps", "setstackbox", "setstructurepageregister", "setstrut", "setsuperiors", "setsystemmode", "settabular", "settaggedmetadata", "settextcontent", "settightobject", "settightreferencedobject", "settightunreferencedobject", "settrialtypesetting", "setuevalue", "setugvalue", "setunreferencedobject", "setup", "setupMPgraphics", "setupMPinstance", "setupMPpage", "setupMPvariables", "setupTABLE", "setupTEXpage", "setupattachment", "setupbackend", "setupbar", "setupbleeding", "setupbookmark", "setupbtx", "setupbtxdataset", "setupbtxlist", "setupbtxregister", "setupbtxrendering", "setupbutton", "setupcharacterkerning", "setupcharacterspacing", "setupchemical", "setupchemicalframed", "setupcollector", "setupcolumnspan", "setupcombination", "setupcounter", "setupdataset", "setupdelimitedtext", "setupdescription", "setupdirections", "setupdocument", "setupeffect", "setupenumeration", "setupenv", "setupexport", "setupexternalfigure", "setupexternalsoundtracks", "setupfieldbody", "setupfieldcategory", "setupfieldcontentframed", "setupfieldlabelframed", "setupfieldtotalframed", "setupfiller", "setupfirstline", "setupfittingpage", "setupfloatcaption", "setupfontexpansion", "setupfontprotrusion", "setupfonts", "setupfontsolution", "setupformula", "setupformulaframed", "setupframedcontent", "setupframedtext", "setupglobalreferenceprefix", "setupheadalternative", "setuphelp", "setuphigh", "setuphighlight", "setuphyphenation", "setupindentedtext", "setupinitial", "setupinsertion", "setupitaliccorrection", "setupitemgroup", "setuplabel", "setuplayer", "setuplayeredtext", "setuplayouttext", "setuplinefiller", "setuplinefillers", "setuplinenote", "setuplinetable", "setuplistalternative", "setuplistextra", "setuplocalfloats", "setuplocalinterlinespace", "setuplow", "setuplowhigh", "setuplowmidhigh", "setupmarginblock", "setupmargindata", "setupmarginframed", "setupmarginrule", "setupmathalignment", "setupmathcases", "setupmathematics", "setupmathfence", "setupmathfraction", "setupmathframed", "setupmathmatrix", "setupmathornament", "setupmathradical", "setupmathstackers", "setupmathstyle", "setupmixedcolumns", "setupmodule", "setupnotation", "setupnotations", "setupnote", "setupnotes", "setupoffset", "setupoffsetbox", "setupoutputroutine", "setuppagechecker", "setuppagegrid", "setuppagegridarea", "setuppagegridareatext", "setuppagegridlines", "setuppagegridspan", "setuppagegridstart", "setuppageinjection", "setuppageinjectionalternative", "setuppageshift", "setuppagestate", "setuppairedbox", "setuppaper", "setupparagraph", "setupparagraphintro", "setupparallel", "setupperiods", "setupplacement", "setuppositionbar", "setupprocessor", "setupprofile", "setupquotation", "setuprealpagenumber", "setupreferenceformat", "setupreferenceprefix", "setupreferencestructureprefix", "setupregisters", "setuprenderingwindow", "setups", "setupscale", "setupscript", "setupscripts", "setupselector", "setupshift", "setupsidebar", "setupspellchecking", "setupstartstop", "setupstretched", "setupstruts", "setupstyle", "setupsubformula", "setuptabulation", "setuptagging", "setuptextbackground", "setuptextflow", "setuptooltip", "setupunit", "setupuserpagenumber", "setupversion", "setupviewerlayer", "setupvspacing", "setupwithargument", "setupwithargumentswapped", "setupxml", "setupxtable", "setuvalue", "setuxvalue", "setvalue", "setvariable", "setvariables", "setvboxregister", "setvisualizerfont", "setvtopregister", "setwidthof", "setxmeasure", "setxvalue", "setxvariable", "setxvariables", "sfrac", "shapedhbox", "showallmakeup", "showattributes", "showboxes", "showbtxdatasetauthors", "showbtxdatasetcompleteness", "showbtxdatasetfields", "showbtxfields", "showbtxhashedauthors", "showbtxtables", "showchardata", "showcharratio", "showcolorbar", "showcolorcomponents", "showcolorset", "showcolorstruts", "showcounter", "showdirectives", "showdirsinmargin", "showedebuginfo", "showexperiments", "showfont", "showfontdata", "showfontkerns", "showfontparameters", "showfontstrip", "showfontstyle", "showglyphs", "showgridsnapping", "showhelp", "showhyphenationtrace", "showhyphens", "showinjector", "showjustification", "showkerning", "showlayoutcomponents", "showligature", "showligatures", "showlogcategories", "showmargins", "showmessage", "showminimalbaseline", "shownextbox", "showotfcomposition", "showparentchain", "showsetupsdefinition", "showtimer", "showtokens", "showtrackers", "showvalue", "showvariable", "showwarning", "simbol", "simplegroupedcommand", "singalcharacteralign", "singlebond", "sixthofsixarguments", "slanted", "slantedbold", "slicepages", "slovenianNumerals", "sloveniannumerals", "small", "smallbodyfont", "smallbold", "smallbolditalic", "smallboldslanted", "smallcappedcharacters", "smallcappedromannumerals", "smaller", "smallitalicbold", "smallnormal", "smallskip", "smallslanted", "smallslantedbold", "smalltype", "smash", "smashbox", "smashboxed", "smashedhbox", "smashedvbox", "snaptogrid", "someheadnumber", "somekindoftab", "somelocalfloat", "somenamedheadnumber", "someplace", "sp", "spanishNumerals", "spanishnumerals", "spatiifixate", "spatiu", "spatiufixat", "speech", "splitatasterisk", "splitatcolon", "splitatcolons", "splitatcomma", "splitdfrac", "splitfilename", "splitfrac", "splitoffbase", "splitofffull", "splitoffkind", "splitoffname", "splitoffpath", "splitoffroot", "splitofftokens", "splitofftype", "splitstring", "spreadhbox", "sqrt", "stackrel", "startJScode", "startJSpreamble", "startMPclip", "startMPcode", "startMPdefinitions", "startMPdrawing", "startMPenvironment", "startMPextensions", "startMPinclusions", "startMPinitializations", "startMPpage", "startMPpositiongraphic", "startMPpositionmethod", "startMPrun", "startTABLE", "startTABLEbody", "startTABLEfoot", "startTABLEhead", "startTABLEnext", "startTC", "startTD", "startTDs", "startTEXpage", "startTH", "startTN", "startTR", "startTRs", "startTX", "startTY", "startallmodes", "startarrangedpages", "startaside", "startattachment", "startbar", "startbarasus", "startbinom", "startbitmapimage", "startblockquote", "startbtxrenderingdefinitions", "startbuffer", "startbutton", "startcapitol", "startcatcodetable", "startcharacteralign", "startcheckedfences", "startchemical", "startcitat", "startcollect", "startcollecting", "startcolorintent", "startcoloronly", "startcolorset", "startcolumns", "startcolumnspan", "startcombination", "startcomentariu", "startcomment", "startcomponenta", "startcontextcode", "startcontextdefinitioncode", "startctxfunction", "startctxfunctiondefinition", "startculoare", "startcurrentcolor", "startcurrentlistentrywrapper", "startdbinom", "startdelimited", "startdelimitedtext", "startdfrac", "startdisplaymath", "startdmath", "startdocument", "startdute", "starteffect", "startelement", "startembeddedxtable", "startendofline", "startenumerare", "startexceptions", "startexpanded", "startexpandedcollect", "startextendedcatcodetable", "startexternalfigurecollection", "startfigura", "startfigure", "startfitfieldframed", "startfittingpage", "startfloatcombination", "startfont", "startfontclass", "startfontsolution", "startformula", "startformulas", "startfrac", "startframed", "startframedcontent", "startframedtext", "startfundal", "startgraficul", "startgridsnapping", "starthbox", "starthboxestohbox", "starthboxregister", "starthelptext", "starthiddenbar", "starthiding", "starthighlight", "starthyphenation", "startimath", "startimpachetat", "startindentation", "startindentedtext", "startinmframed", "startinteraction", "startinterface", "startintermezzo", "startintertext", "startitemgroup", "startknockout", "startlayout", "startlinecorrection", "startlinefiller", "startlinenumbering", "startlinetable", "startlinetablebody", "startlinetablecell", "startlinetablehead", "startlinie", "startliniemargine", "startliniepeste", "startliniipeste", "startlocalfootnotes", "startlocalheadsetup", "startlocallinecorrection", "startlocalnotes", "startlocalsetups", "startlua", "startluacode", "startluaparameterset", "startluasetups", "startmakeup", "startmarginblock", "startmarkedcontent", "startmathmode", "startmathstyle", "startmatrices", "startmcframed", "startmdformula", "startmediu", "startmeniuinteractiune", "startmframed", "startminicitat", "startmixedcolumns", "startmode", "startmodeset", "startmodule", "startmoduletestsection", "startmpformula", "startnamedsection", "startnamedsubformulas", "startnarrow", "startnarrower", "startnegative", "startnicelyfilledbox", "startnobar", "startnointerference", "startnotallmodes", "startnotext", "startnotmode", "startopposite", "startoutputstream", "startoverlay", "startoverprint", "startpagecomment", "startpagefigure", "startpagegrid", "startpagegridspan", "startpagelayout", "startpar", "startparagraph", "startparagraphs", "startparagraphscell", "startparbuilder", "startpath", "startplacepairedbox", "startpositioning", "startpositionoverlay", "startpositive", "startpostponing", "startprocessassignmentcommand", "startprocessassignmentlist", "startprocesscommacommand", "startprocesscommalist", "startprodus", "startproiect", "startprotect", "startprotectedcolors", "startpublicatie", "startpunctuation", "startpuneformula", "startrandomized", "startrandomseed", "startrawsetups", "startreadingfile", "startreferenceprefix", "startregime", "startregister", "startreusableMPgraphic", "startriglatext", "startscript", "startsdformula", "startsectionblock", "startsectionblockenvironment", "startsectionlevel", "startsectiune", "startsetups", "startsfrac", "startshapebox", "startshift", "startsidebar", "startsimplecolumns", "startspecialitem", "startspeech", "startspformula", "startspread", "startstartstop", "startstaticMPfigure", "startstaticMPgraphic", "startstrictinspectnextcharacter", "startstructurepageregister", "startstrut", "startstyle", "startsubformulas", "startsubiect", "startsubjectlevel", "startsublinie", "startsublinii", "startsubsectiune", "startsubsentence", "startsubstack", "startsubsubiect", "startsubsubsectiune", "startsubsubsubiect", "startsubsubsubsectiune", "startsubsubsubsubiect", "startsubsubsubsubsectiune", "startsubsubsubsubsubiect", "startsupralinie", "startsymbolset", "starttabelul", "starttable", "starttablehead", "starttables", "starttabletail", "starttabulate", "starttabulatehead", "starttabulatetail", "starttagged", "starttbinom", "starttexcode", "starttexdefinition", "starttext", "starttextajutator", "starttextbackground", "starttextbackgroundmanual", "starttextcolor", "starttextcolorintent", "starttextflow", "starttextinconjurat", "starttitlu", "starttokens", "starttransparent", "starttypescript", "starttypescriptcollection", "startunderdash", "startunderdashes", "startunderdot", "startunderdots", "startunderrandom", "startunderrandoms", "startunderstrike", "startunderstrikes", "startunframed", "startuniqueMPgraphic", "startuniqueMPpagegraphic", "startunpacked", "startusableMPgraphic", "startuseMPgraphic", "startusemathstyleparameter", "startusingbtxspecification", "startvbox", "startvboxregister", "startvboxtohbox", "startvboxtohboxseparator", "startviewerlayer", "startvtop", "startvtopregister", "startxcell", "startxcellgroup", "startxfrac", "startxgroup", "startxmldisplayverbatim", "startxmlinlineverbatim", "startxmlraw", "startxmlsetups", "startxrow", "startxrowgroup", "startxtable", "startxtablebody", "startxtablefoot", "startxtablehead", "startxtablenext", "startxxfrac", "stivacampuri", "stopJScode", "stopJSpreamble", "stopMPclip", "stopMPcode", "stopMPdefinitions", "stopMPdrawing", "stopMPenvironment", "stopMPextensions", "stopMPinclusions", "stopMPinitializations", "stopMPpage", "stopMPpositiongraphic", "stopMPpositionmethod", "stopMPrun", "stopTABLE", "stopTABLEbody", "stopTABLEfoot", "stopTABLEhead", "stopTABLEnext", "stopTC", "stopTD", "stopTDs", "stopTEXpage", "stopTH", "stopTN", "stopTR", "stopTRs", "stopTX", "stopTY", "stopallmodes", "stoparrangedpages", "stopaside", "stopattachment", "stopbar", "stopbarasus", "stopbinom", "stopbitmapimage", "stopblockquote", "stopbtxrenderingdefinitions", "stopbuffer", "stopbutton", "stopcapitol", "stopcatcodetable", "stopcharacteralign", "stopcheckedfences", "stopchemical", "stopcitat", "stopcollect", "stopcollecting", "stopcolorintent", "stopcoloronly", "stopcolorset", "stopcolumns", "stopcolumnspan", "stopcombination", "stopcomentariu", "stopcomment", "stopcomponenta", "stopcontextcode", "stopcontextdefinitioncode", "stopctxfunction", "stopctxfunctiondefinition", "stopculoare", "stopcurrentcolor", "stopcurrentlistentrywrapper", "stopdbinom", "stopdelimited", "stopdelimitedtext", "stopdfrac", "stopdisplaymath", "stopdmath", "stopdocument", "stopdute", "stopeffect", "stopelement", "stopembeddedxtable", "stopendofline", "stopenumerare", "stopexceptions", "stopexpanded", "stopexpandedcollect", "stopextendedcatcodetable", "stopexternalfigurecollection", "stopfigura", "stopfigure", "stopfitfieldframed", "stopfittingpage", "stopfloatcombination", "stopfont", "stopfontclass", "stopfontsolution", "stopformula", "stopformulas", "stopfrac", "stopframed", "stopframedcontent", "stopframedtext", "stopfundal", "stopgraficul", "stopgridsnapping", "stophbox", "stophboxestohbox", "stophboxregister", "stophelptext", "stophiddenbar", "stophiding", "stophighlight", "stophyphenation", "stopimath", "stopimpachetat", "stopindentation", "stopindentedtext", "stopinmframed", "stopinteraction", "stopinterface", "stopintermezzo", "stopintertext", "stopitemgroup", "stopknockout", "stoplayout", "stoplinecorrection", "stoplinefiller", "stoplinenumbering", "stoplinetable", "stoplinetablebody", "stoplinetablecell", "stoplinetablehead", "stoplinie", "stopliniemargine", "stopliniepeste", "stopliniipeste", "stoplocalfootnotes", "stoplocalheadsetup", "stoplocallinecorrection", "stoplocalnotes", "stoplocalsetups", "stoplua", "stopluacode", "stopluaparameterset", "stopluasetups", "stopmakeup", "stopmarginblock", "stopmarkedcontent", "stopmathmode", "stopmathstyle", "stopmatrices", "stopmcframed", "stopmdformula", "stopmediu", "stopmeniuinteractiune", "stopmframed", "stopminicitat", "stopmixedcolumns", "stopmode", "stopmodeset", "stopmodule", "stopmoduletestsection", "stopmpformula", "stopnamedsection", "stopnamedsubformulas", "stopnarrow", "stopnarrower", "stopnegative", "stopnicelyfilledbox", "stopnobar", "stopnointerference", "stopnotallmodes", "stopnotext", "stopnotmode", "stopopposite", "stopoutputstream", "stopoverlay", "stopoverprint", "stoppagecomment", "stoppagefigure", "stoppagegrid", "stoppagegridspan", "stoppagelayout", "stoppar", "stopparagraph", "stopparagraphs", "stopparagraphscell", "stopparbuilder", "stoppath", "stopplacepairedbox", "stoppositioning", "stoppositionoverlay", "stoppositive", "stoppostponing", "stopprocessassignmentcommand", "stopprocessassignmentlist", "stopprocesscommacommand", "stopprocesscommalist", "stopprodus", "stopproiect", "stopprotect", "stopprotectedcolors", "stoppublicatie", "stoppunctuation", "stoppuneformula", "stoprandomized", "stoprandomseed", "stoprawsetups", "stopreadingfile", "stopreferenceprefix", "stopregime", "stopregister", "stopreusableMPgraphic", "stopriglatext", "stopscript", "stopsdformula", "stopsectionblock", "stopsectionblockenvironment", "stopsectionlevel", "stopsectiune", "stopsetups", "stopsfrac", "stopshapebox", "stopshift", "stopsidebar", "stopsimplecolumns", "stopspecialitem", "stopspeech", "stopspformula", "stopspread", "stopstartstop", "stopstaticMPfigure", "stopstaticMPgraphic", "stopstrictinspectnextcharacter", "stopstructurepageregister", "stopstrut", "stopstyle", "stopsubformulas", "stopsubiect", "stopsubjectlevel", "stopsublinie", "stopsublinii", "stopsubsectiune", "stopsubsentence", "stopsubstack", "stopsubsubiect", "stopsubsubsectiune", "stopsubsubsubiect", "stopsubsubsubsectiune", "stopsubsubsubsubiect", "stopsubsubsubsubsectiune", "stopsubsubsubsubsubiect", "stopsupralinie", "stopsymbolset", "stoptabelul", "stoptable", "stoptablehead", "stoptables", "stoptabletail", "stoptabulate", "stoptabulatehead", "stoptabulatetail", "stoptagged", "stoptbinom", "stoptexcode", "stoptexdefinition", "stoptext", "stoptextajutator", "stoptextbackground", "stoptextbackgroundmanual", "stoptextcolor", "stoptextcolorintent", "stoptextflow", "stoptextinconjurat", "stoptitlu", "stoptokens", "stoptransparent", "stoptypescript", "stoptypescriptcollection", "stopunderdash", "stopunderdashes", "stopunderdot", "stopunderdots", "stopunderrandom", "stopunderrandoms", "stopunderstrike", "stopunderstrikes", "stopunframed", "stopuniqueMPgraphic", "stopuniqueMPpagegraphic", "stopunpacked", "stopusableMPgraphic", "stopuseMPgraphic", "stopusemathstyleparameter", "stopusingbtxspecification", "stopvbox", "stopvboxregister", "stopvboxtohbox", "stopvboxtohboxseparator", "stopviewerlayer", "stopvtop", "stopvtopregister", "stopxcell", "stopxcellgroup", "stopxfrac", "stopxgroup", "stopxmldisplayverbatim", "stopxmlinlineverbatim", "stopxmlraw", "stopxmlsetups", "stopxrow", "stopxrowgroup", "stopxtable", "stopxtablebody", "stopxtablefoot", "stopxtablehead", "stopxtablenext", "stopxxfrac", "strictdoifelsenextoptional", "strictdoifnextoptionalelse", "stripcharacter", "strippedcsname", "stripspaces", "structurelistuservariable", "structurenumber", "structuretitle", "structureuservariable", "structurevariable", "strut", "strutdp", "strutht", "struthtdp", "struttedbox", "strutwd", "style", "styleinstance", "subiect", "subpagenumber", "subsectiune", "subsentence", "substituteincommalist", "subsubiect", "subsubsectiune", "subsubsubiect", "subsubsubsectiune", "subsubsubsubiect", "subsubsubsubsectiune", "subsubsubsubsubiect", "subtractfeature", "swapcounts", "swapdimens", "swapface", "swapmacros", "swaptypeface", "switchstyleonly", "switchtocolor", "switchtointerlinespace", "symbolreference", "synchronizeblank", "synchronizeindenting", "synchronizemarking", "synchronizeoutputstreams", "synchronizestrut", "synchronizewhitespace", "systemlog", "systemlogfirst", "systemloglast", "systemsetups", "tLeftarrow", "tLeftrightarrow", "tRightarrow", "tabelul", "tabulateautoline", "tabulateautorule", "tabulateline", "tabulaterule", "taggedctxcommand", "taggedlabeltexts", "tbinom", "tbox", "tequal", "testandsplitstring", "testcolumn", "testfeature", "testfeatureonce", "testpage", "testpageonly", "testpagesync", "testtokens", "tex", "texdefinition", "texsetup", "textajutator", "textcitation", "textcite", "textcontrolspace", "textflowcollector", "textinconjurat", "textmath", "textminus", "textormathchar", "textplus", "textumplere", "textvisiblespace", "tfrac", "thainumerals", "thefirstcharacter", "thenormalizedbodyfontsize", "theremainingcharacters", "thickspace", "thinspace", "thirdoffivearguments", "thirdoffourarguments", "thirdofsixarguments", "thirdofthreearguments", "thirdofthreeunexpanded", "thookleftarrow", "thookrightarrow", "threedigitrounding", "tibetannumerals", "tightlayer", "tinyfont", "titlu", "tlap", "tleftarrow", "tleftharpoondown", "tleftharpoonup", "tleftrightarrow", "tleftrightharpoons", "tmapsto", "tochar", "tolinenote", "topbox", "topleftbox", "toplinebox", "toprightbox", "topskippedbox", "tracecatcodetables", "tracedfontname", "traceoutputroutines", "tracepositions", "traduce", "transparencycomponents", "transparent", "trecilafonttext", "trel", "trightarrow", "trightharpoondown", "trightharpoonup", "trightleftharpoons", "trightoverleftarrow", "triplebond", "truefilename", "truefontname", "ttriplerel", "ttwoheadleftarrow", "ttwoheadrightarrow", "twodigitrounding", "tx", "txx", "typ", "type", "typedefinedbuffer", "typeface", "typefile", "typescriptone", "typescriptprefix", "typescriptthree", "typescripttwo", "typesetbuffer", "typesetfile", "uconvertnumber", "uedcatcodecommand", "undefinevalue", "undepthed", "underbar", "underbars", "underbartext", "underbrace", "underbracetext", "underbracket", "underbrackettext", "underdash", "underdashes", "underdot", "underdots", "underleftarrow", "underleftharpoondown", "underleftharpoonup", "underleftrightarrow", "underparent", "underparenttext", "underrandom", "underrandoms", "underrightarrow", "underrightharpoondown", "underrightharpoonup", "underset", "understrike", "understrikes", "undertwoheadleftarrow", "undertwoheadrightarrow", "undeva", "undoassign", "unframed", "unhhbox", "unihex", "uniqueMPgraphic", "uniqueMPpagegraphic", "unprotected", "unregisterhyphenationpattern", "unspaceafter", "unspaceargument", "unspaced", "unspacestring", "untexargument", "untexcommand", "uppercased", "uppercasestring", "upperleftdoubleninequote", "upperleftdoublesixquote", "upperleftsingleninequote", "upperleftsinglesixquote", "upperrightdoubleninequote", "upperrightdoublesixquote", "upperrightsingleninequote", "upperrightsinglesixquote", "url", "useMPenvironmentbuffer", "useMPgraphic", "useMPlibrary", "useMPrun", "useMPvariables", "useblankparameter", "usebodyfont", "usebodyfontparameter", "usebtxdataset", "usebtxdefinitions", "usecolors", "usecomponent", "usedummycolorparameter", "usedummystyleandcolor", "usedummystyleparameter", "useenvironment", "useexternalrendering", "usefigurebase", "usefile", "usegridparameter", "useindentingparameter", "useindentnextparameter", "useinterlinespaceparameter", "uselanguageparameter", "useluamodule", "usemathstyleparameter", "useproduct", "useprofileparameter", "useproject", "usereferenceparameter", "userpagenumber", "usesetupsparameter", "usestaticMPfigure", "usesubpath", "usetexmodule", "usetypescript", "usetypescriptfile", "usezipfile", "utfchar", "utflower", "utfupper", "utilityregisterlength", "valoareculoare", "vboxreference", "verbatim", "verbatimstring", "verbosenumber", "versiune", "verticalgrowingbar", "verticalpositionbar", "vglue", "viewerlayer", "vl", "vphantom", "vpos", "vsmash", "vsmashbox", "vsmashed", "vspace", "vspacing", "wdofstring", "widthofstring", "widthspanningtext", "withoutpt", "word", "words", "wordtonumber", "writedatatolist", "writestatus", "xLeftarrow", "xLeftrightarrow", "xRightarrow", "xdefconvertedargument", "xequal", "xfrac", "xhookleftarrow", "xhookrightarrow", "xleftarrow", "xleftharpoondown", "xleftharpoonup", "xleftrightarrow", "xleftrightharpoons", "xmapsto", "xmladdindex", "xmlafterdocumentsetup", "xmlaftersetup", "xmlall", "xmlappenddocumentsetup", "xmlappendsetup", "xmlapplyselectors", "xmlatt", "xmlattdef", "xmlattribute", "xmlattributedef", "xmlbadinclusions", "xmlbeforedocumentsetup", "xmlbeforesetup", "xmlchainatt", "xmlchainattdef", "xmlchecknamespace", "xmlcommand", "xmlconcat", "xmlconcatrange", "xmlcontext", "xmlcount", "xmldefaulttotext", "xmldirectives", "xmldirectivesafter", "xmldirectivesbefore", "xmldisplayverbatim", "xmldoif", "xmldoifelse", "xmldoifelseempty", "xmldoifelseselfempty", "xmldoifelsetext", "xmldoifelsevalue", "xmldoifnot", "xmldoifnotselfempty", "xmldoifnottext", "xmldoifselfempty", "xmldoiftext", "xmlelement", "xmlfilter", "xmlfirst", "xmlflush", "xmlflushcontext", "xmlflushdocumentsetups", "xmlflushlinewise", "xmlflushpure", "xmlflushspacewise", "xmlflushtext", "xmlinclude", "xmlinclusion", "xmlinclusions", "xmlinfo", "xmlinjector", "xmlinlineverbatim", "xmlinstalldirective", "xmllast", "xmllastatt", "xmllastmatch", "xmlloadbuffer", "xmlloaddata", "xmlloaddirectives", "xmlloadfile", "xmlloadonly", "xmlmain", "xmlmapvalue", "xmlname", "xmlnamespace", "xmlnonspace", "xmlpath", "xmlpos", "xmlposition", "xmlprependdocumentsetup", "xmlprependsetup", "xmlprettyprint", "xmlprocessbuffer", "xmlprocessdata", "xmlprocessfile", "xmlpure", "xmlraw", "xmlrefatt", "xmlregistereddocumentsetups", "xmlregisteredsetups", "xmlregisterns", "xmlremapname", "xmlremapnamespace", "xmlremovedocumentsetup", "xmlremovesetup", "xmlresetdocumentsetups", "xmlresetinjectors", "xmlresetsetups", "xmlsave", "xmlsetentity", "xmlsetfunction", "xmlsetinjectors", "xmlsetsetup", "xmlsetup", "xmlshow", "xmlsnippet", "xmlstrip", "xmlstripnolines", "xmlstripped", "xmlstrippednolines", "xmltag", "xmltexentity", "xmltext", "xmltobuffer", "xmltobufferverbose", "xmltofile", "xmlvalue", "xmlverbatim", "xrel", "xrightarrow", "xrightharpoondown", "xrightharpoonup", "xrightleftharpoons", "xrightoverleftarrow", "xsplitstring", "xtriplerel", "xtwoheadleftarrow", "xtwoheadrightarrow", "xxfrac", "xypos", "zidinsaptamana" }, + ["common"]={ "AEacute", "AEligature", "AEmacron", "AMSTEX", "Aacute", "Abreve", "Abreveacute", "Abrevedotbelow", "Abrevegrave", "Abrevehook", "Abrevetilde", "Acaron", "Acircumflex", "Acircumflexacute", "Acircumflexdotbelow", "Acircumflexgrave", "Acircumflexhook", "Acircumflextilde", "Adiaeresis", "Adiaeresismacron", "Adotaccent", "Adotaccentmacron", "Adotbelow", "Adoublegrave", "AfterPar", "Agrave", "Ahook", "Ainvertedbreve", "Alpha", "Alphabeticnumerals", "AmSTeX", "Amacron", "And", "Angstrom", "Aogonek", "Aring", "Aringacute", "Arrowvert", "Astroke", "Atilde", "BeforePar", "Beta", "Bhook", "Big", "Bigg", "Biggl", "Biggm", "Biggr", "Bigl", "Bigm", "Bigr", "Box", "Bumpeq", "CONTEXT", "Cacute", "Cap", "Caps", "Ccaron", "Ccedilla", "Ccircumflex", "Cdotaccent", "Character", "Characters", "Chi", "Chook", "ConTeXt", "Context", "ConvertConstantAfter", "ConvertToConstant", "Cstroke", "Cup", "DZcaronligature", "DZligature", "Dafrican", "Dcaron", "Ddownarrow", "Delta", "Dhook", "Doteq", "Downarrow", "Dstroke", "Dzcaronligature", "Dzligature", "ETEX", "Eacute", "Ebreve", "Ecaron", "Ecedilla", "Ecircumflex", "Ecircumflexacute", "Ecircumflexdotbelow", "Ecircumflexgrave", "Ecircumflexhook", "Ecircumflextilde", "Ediaeresis", "Edotaccent", "Edotbelow", "Edoublegrave", "Egrave", "Ehook", "Einvertedbreve", "Emacron", "Eogonek", "Epsilon", "Eta", "Eth", "Etilde", "Eulerconst", "EveryLine", "EveryPar", "Fhook", "Finv", "Gacute", "Game", "Gamma", "Gbreve", "Gcaron", "Gcircumflex", "Gcommaaccent", "Gdotaccent", "GetPar", "Ghook", "GotoPar", "Greeknumerals", "Gstroke", "Hat", "Hcaron", "Hcircumflex", "Hstroke", "IJligature", "INRSTEX", "Iacute", "Ibreve", "Icaron", "Icircumflex", "Idiaeresis", "Idotaccent", "Idotbelow", "Idoublegrave", "Igrave", "Ihook", "Iinvertedbreve", "Im", "Imacron", "Iogonek", "Iota", "Istroke", "Itilde", "Jcircumflex", "Join", "Kappa", "Kcaron", "Kcommaaccent", "Khook", "LAMSTEX", "LATEX", "LJligature", "LUAJITTEX", "LUATEX", "LaTeX", "Lacute", "LamSTeX", "Lambda", "Lbar", "Lcaron", "Lcommaaccent", "Ldotmiddle", "Ldsh", "Leftarrow", "Leftrightarrow", "Ljligature", "Lleftarrow", "Longleftarrow", "Longleftrightarrow", "Longmapsfrom", "Longmapsto", "Longrightarrow", "Lsh", "Lstroke", "Lua", "LuaTeX", "LuajitTeX", "METAFONT", "METAFUN", "METAPOST", "MKII", "MKIV", "MKIX", "MKVI", "MKXI", "MONTH", "MONTHLONG", "MONTHSHORT", "MPII", "MPIV", "MPVI", "MPanchor", "MPbetex", "MPc", "MPcode", "MPcolor", "MPcoloronly", "MPcolumn", "MPd", "MPdrawing", "MPfontsizehskip", "MPgetmultipars", "MPgetmultishape", "MPgetposboxes", "MPh", "MPinclusions", "MPleftskip", "MPll", "MPlr", "MPls", "MPmenubuttons", "MPn", "MPoptions", "MPoverlayanchor", "MPp", "MPpage", "MPpardata", "MPplus", "MPpos", "MPpositiongraphic", "MPposset", "MPr", "MPrawvar", "MPregion", "MPrest", "MPrightskip", "MPrs", "MPstring", "MPtext", "MPtransparency", "MPul", "MPur", "MPv", "MPvar", "MPvariable", "MPvv", "MPw", "MPwhd", "MPx", "MPxy", "MPxywhd", "MPy", "Mapsfrom", "Mapsto", "MetaFont", "MetaFun", "MetaPost", "Mu", "NJligature", "Nacute", "Ncaron", "Ncommaaccent", "Nearrow", "Neng", "Ngrave", "Njligature", "NormalizeFontHeight", "NormalizeFontWidth", "NormalizeTextHeight", "NormalizeTextWidth", "Ntilde", "Nu", "Numbers", "Nwarrow", "OEligature", "Oacute", "Obreve", "Ocaron", "Ocircumflex", "Ocircumflexacute", "Ocircumflexdotbelow", "Ocircumflexgrave", "Ocircumflexhook", "Ocircumflextilde", "Odiaeresis", "Odiaeresismacron", "Odotaccent", "Odotaccentmacron", "Odotbelow", "Odoublegrave", "Ograve", "Ohook", "Ohorn", "Ohornacute", "Ohorndotbelow", "Ohorngrave", "Ohornhook", "Ohorntilde", "Ohungarumlaut", "Oinvertedbreve", "Omacron", "Omega", "Omicron", "Oogonek", "Oogonekmacron", "Ostroke", "Ostrokeacute", "Otilde", "Otildemacron", "P", "PDFETEX", "PDFTEX", "PDFcolor", "PICTEX", "PPCHTEX", "PPCHTeX", "PRAGMA", "Phi", "Phook", "Pi", "PiCTeX", "Plankconst", "PointsToBigPoints", "PointsToReal", "PointsToWholeBigPoints", "PropertyLine", "Psi", "PtToCm", "Racute", "Rcaron", "Rcommaaccent", "Rdoublegrave", "Rdsh", "Re", "ReadFile", "Relbar", "Rho", "Rightarrow", "Rinvertedbreve", "Romannumerals", "Rrightarrow", "Rsh", "S", "Sacute", "ScaledPointsToBigPoints", "ScaledPointsToWholeBigPoints", "Scaron", "Scedilla", "Schwa", "Scircumflex", "Scommaaccent", "Searrow", "Sigma", "Smallcapped", "Subset", "Supset", "Swarrow", "TABLE", "TEX", "TaBlE", "Tau", "Tcaron", "Tcedilla", "Tcommaaccent", "TeX", "TheNormalizedFontSize", "Theta", "Thook", "Thorn", "TransparencyHack", "Tstroke", "Uacute", "Ubreve", "Ucaron", "Ucircumflex", "Udiaeresis", "Udiaeresisacute", "Udiaeresiscaron", "Udiaeresisgrave", "Udiaeresismacron", "Udotbelow", "Udoublegrave", "Ugrave", "Uhook", "Uhorn", "Uhornacute", "Uhorndotbelow", "Uhorngrave", "Uhornhook", "Uhorntilde", "Uhungarumlaut", "Uinvertedbreve", "Umacron", "Uogonek", "Uparrow", "Updownarrow", "Upsilon", "Uring", "Utilde", "Uuparrow", "VDash", "Vdash", "VerboseNumber", "Vert", "Vvdash", "WEEKDAY", "WORD", "WORDS", "Wcircumflex", "WidthSpanningText", "Word", "Words", "XETEX", "XeTeX", "Xi", "Yacute", "Ycircumflex", "Ydiaeresis", "Ydotbelow", "Ygrave", "Yhook", "Ymacron", "Ytilde", "Zacute", "Zcaron", "Zdotaccent", "Zeta", "Zhook", "Zstroke", "aacute", "abbreviation", "abjadnaivenumerals", "abjadnodotnumerals", "abjadnumerals", "about", "abreve", "abreveacute", "abrevedotbelow", "abrevegrave", "abrevehook", "abrevetilde", "acaron", "acircumflex", "acircumflexacute", "acircumflexdotbelow", "acircumflexgrave", "acircumflexhook", "acircumflextilde", "activatespacehandler", "actuarial", "acute", "acwopencirclearrow", "adaptcollector", "adaptfontfeature", "adaptlayout", "adaptpapersize", "addfeature", "addfontpath", "addtoJSpreamble", "addtocommalist", "addvalue", "adiaeresis", "adiaeresismacron", "adotaccent", "adotaccentmacron", "adotbelow", "adoublegrave", "aeacute", "aeligature", "aemacron", "afghanicurrency", "aftersplitstring", "aftertestandsplitstring", "agrave", "ahook", "ainvertedbreve", "aleph", "alignbottom", "aligned", "alignedbox", "alignedline", "alignhere", "alignmentcharacter", "allinputpaths", "alpha", "alphabeticnumerals", "alwayscitation", "alwayscite", "amacron", "amalg", "ampersand", "anchor", "angle", "aogonek", "appendetoks", "appendgvalue", "appendtocommalist", "appendtoks", "appendtoksonce", "appendvalue", "apply", "applyalternativestyle", "applyprocessor", "applytocharacters", "applytofirstcharacter", "applytosplitstringchar", "applytosplitstringcharspaced", "applytosplitstringline", "applytosplitstringlinespaced", "applytosplitstringword", "applytosplitstringwordspaced", "applytowords", "approx", "approxEq", "approxeq", "approxnEq", "arabicakbar", "arabicalayhe", "arabicallah", "arabicallallahou", "arabicasterisk", "arabicbasmalah", "arabiccomma", "arabiccuberoot", "arabicdateseparator", "arabicdecimals", "arabicdisputedendofayah", "arabicendofayah", "arabicexnumerals", "arabicfootnotemarker", "arabicfourthroot", "arabichighain", "arabichighalayheassallam", "arabichigheqala", "arabichighesala", "arabichighfootnotemarker", "arabichighjeem", "arabichighlamalef", "arabichighmadda", "arabichighmeemlong", "arabichighmeemshort", "arabichighnisf", "arabichighnoon", "arabichighnoonkasra", "arabichighqaf", "arabichighqif", "arabichighradiallahouanhu", "arabichighrahmatullahalayhe", "arabichighrubc", "arabichighsad", "arabichighsajda", "arabichighsakta", "arabichighsallallahou", "arabichighseen", "arabichighsmallsafha", "arabichightah", "arabichightakhallus", "arabichighthalatha", "arabichighwaqf", "arabichighyeh", "arabichighzain", "arabicjallajalalouhou", "arabiclettermark", "arabiclowmeemlong", "arabiclownoonkasra", "arabiclowseen", "arabicmisra", "arabicmuhammad", "arabicnumber", "arabicnumberabove", "arabicnumerals", "arabicparenleft", "arabicparenright", "arabicpercent", "arabicperiod", "arabicpermille", "arabicpertenthousand", "arabicpoeticverse", "arabicqala", "arabicquestion", "arabicrasoul", "arabicray", "arabicrialsign", "arabicsafha", "arabicsajdah", "arabicsalla", "arabicsamvat", "arabicsanah", "arabicsemicolon", "arabicshighthreedots", "arabicslcm", "arabicstartofrubc", "arabictripledot", "arabicvowelwaw", "arabicvowelyeh", "arabicwasallam", "arg", "aring", "aringacute", "arrowvert", "asciistr", "aside", "assignalfadimension", "assigndimen", "assigndimension", "assignifempty", "assigntranslation", "assignvalue", "assignwidth", "assumelongusagecs", "ast", "astype", "asymp", "at", "atilde", "atleftmargin", "atpage", "atrightmargin", "attachment", "autocap", "autodirhbox", "autodirvbox", "autodirvtop", "autoinsertnextspace", "autointegral", "automathematics", "autosetups", "availablehsize", "averagecharwidth", "backepsilon", "background", "backgroundimage", "backgroundimagefill", "backgroundline", "backprime", "backsim", "backslash", "bar", "barleftarrow", "barleftarrowrightarrowbar", "barovernorthwestarrow", "barwedge", "basegrid", "baselinebottom", "baselineleftbox", "baselinemiddlebox", "baselinerightbox", "bbordermatrix", "bbox", "because", "beforesplitstring", "beforetestandsplitstring", "beta", "beth", "between", "bhook", "big", "bigbodyfont", "bigcap", "bigcirc", "bigcircle", "bigcup", "bigdiamond", "bigg", "bigger", "biggl", "biggm", "biggr", "bigl", "bigm", "bigodot", "bigoplus", "bigotimes", "bigr", "bigskip", "bigsqcap", "bigsqcup", "bigsquare", "bigstar", "bigtimes", "bigtriangledown", "bigtriangleup", "bigudot", "biguplus", "bigvee", "bigwedge", "binom", "bitmapimage", "blacklozenge", "blackrule", "blackrules", "blacksquare", "blacktriangle", "blacktriangledown", "blacktriangleleft", "blacktriangleright", "blank", "blap", "bleed", "bleedheight", "bleedwidth", "blockligatures", "blockquote", "blocksynctexfile", "bodyfontenvironmentlist", "bodyfontsize", "bold", "boldface", "bolditalic", "boldslanted", "bookmark", "booleanmodevalue", "bordermatrix", "bot", "bottombox", "bottomleftbox", "bottomrightbox", "bowtie", "boxcursor", "boxdot", "boxmarker", "boxminus", "boxofsize", "boxplus", "boxreference", "boxtimes", "bpos", "breakablethinspace", "breakhere", "breve", "bstroke", "btxabbreviatedjournal", "btxaddjournal", "btxalwayscitation", "btxauthorfield", "btxdetail", "btxdirect", "btxdoif", "btxdoifcombiinlistelse", "btxdoifelse", "btxdoifelsecombiinlist", "btxdoifelsesameasprevious", "btxdoifelsesameaspreviouschecked", "btxdoifelseuservariable", "btxdoifnot", "btxdoifsameaspreviouscheckedelse", "btxdoifsameaspreviouselse", "btxdoifuservariableelse", "btxexpandedjournal", "btxfield", "btxfieldname", "btxfieldtype", "btxfirstofrange", "btxflush", "btxflushauthor", "btxflushauthorinverted", "btxflushauthorinvertedshort", "btxflushauthorname", "btxflushauthornormal", "btxflushauthornormalshort", "btxflushsuffix", "btxfoundname", "btxfoundtype", "btxhiddencitation", "btxhybridcite", "btxlabellanguage", "btxlabeltext", "btxlistcitation", "btxloadjournalist", "btxoneorrange", "btxremapauthor", "btxsavejournalist", "btxsetup", "btxsingularorplural", "btxsingularplural", "btxtextcitation", "buildmathaccent", "buildtextaccent", "buildtextbottomcomma", "buildtextbottomdot", "buildtextcedilla", "buildtextgrave", "buildtextmacron", "buildtextognek", "bullet", "button", "cacute", "calligraphic", "camel", "cap", "carriagereturn", "catcodetablename", "cbox", "ccaron", "ccedilla", "ccircumflex", "ccurl", "cdot", "cdotaccent", "cdotp", "cdots", "centeraligned", "centerbox", "centerdot", "centeredbox", "centeredlastline", "centerednextbox", "centerline", "cfrac", "chapter", "character", "characters", "chardescription", "charwidthlanguage", "check", "checkcharacteralign", "checkedchar", "checkedfiller", "checkedstrippedcsname", "checkinjector", "checkmark", "checknextindentation", "checknextinjector", "checkpage", "checkparameters", "checkpreviousinjector", "checksoundtrack", "checktwopassdata", "checkvariables", "chem", "chemical", "chemicalbottext", "chemicalmidtext", "chemicalsymbol", "chemicaltext", "chemicaltoptext", "chi", "chineseallnumerals", "chinesecapnumerals", "chinesenumerals", "chook", "circ", "circeq", "circlearrowleft", "circlearrowright", "circledR", "circledS", "circledast", "circledcirc", "circleddash", "circledequals", "circleonrightarrow", "citation", "cite", "clap", "classfont", "cldcommand", "cldcontext", "cldloadfile", "cldprocessfile", "cleftarrow", "clip", "clonefield", "clubsuit", "collect", "collectedtext", "collectexpanded", "colon", "coloncolonequals", "colonequals", "color", "colorbar", "colorcomponents", "colored", "coloronly", "colorvalue", "column", "columnbreak", "combinepages", "commalistelement", "commalistsentence", "commalistsize", "comment", "comparecolorgroup", "comparedimension", "comparedimensioneps", "comparepalet", "complement", "completebtxrendering", "completecontent", "completeindex", "completelist", "completelistofabbreviations", "completelistofchemicals", "completelistoffigures", "completelistofgraphics", "completelistofintermezzi", "completelistoflogos", "completelistofpublications", "completelistofsorts", "completelistofsynonyms", "completelistoftables", "completepagenumber", "completeregister", "complexes", "complexorsimple", "complexorsimpleempty", "component", "composedcollector", "composedlayer", "compresult", "cong", "constantdimen", "constantdimenargument", "constantemptyargument", "constantnumber", "constantnumberargument", "contentreference", "continuednumber", "continueifinputfile", "convertargument", "convertcommand", "convertedcounter", "converteddimen", "convertedsubcounter", "convertmonth", "convertnumber", "convertvalue", "convertvboxtohbox", "coprod", "copyboxfromcache", "copybtxlabeltext", "copyfield", "copyheadtext", "copylabeltext", "copymathlabeltext", "copyoperatortext", "copypages", "copyparameters", "copyposition", "copyprefixtext", "copyright", "copysuffixtext", "copytaglabeltext", "copyunittext", "correctwhitespace", "countersubs", "counttoken", "counttokens", "cramped", "crampedclap", "crampedllap", "crampedrlap", "crightarrow", "crightoverleftarrow", "cstroke", "ctop", "ctxcommand", "ctxdirectcommand", "ctxdirectlua", "ctxfunction", "ctxlatecommand", "ctxlatelua", "ctxloadluafile", "ctxlua", "ctxluabuffer", "ctxluacode", "ctxreport", "ctxsprint", "cup", "curlyeqprec", "curlyeqsucc", "curlyvee", "curlywedge", "currentassignmentlistkey", "currentassignmentlistvalue", "currentbtxuservariable", "currentcommalistitem", "currentcomponent", "currentdate", "currentenvironment", "currentfeaturetest", "currentheadnumber", "currentinterface", "currentlanguage", "currentlistentrydestinationattribute", "currentlistentrylimitedtext", "currentlistentrynumber", "currentlistentrypagenumber", "currentlistentryreferenceattribute", "currentlistentrytitle", "currentlistentrytitlerendered", "currentlistsymbol", "currentmainlanguage", "currentmessagetext", "currentmoduleparameter", "currentoutputstream", "currentproduct", "currentproject", "currentregime", "currentregisterpageuserdata", "currentresponses", "currenttime", "currentvalue", "currentxtablecolumn", "currentxtablerow", "curvearrowleft", "curvearrowright", "cwopencirclearrow", "cyrillicA", "cyrillicAE", "cyrillicAbreve", "cyrillicAdiaeresis", "cyrillicB", "cyrillicBIGYUS", "cyrillicBIGYUSiotified", "cyrillicC", "cyrillicCH", "cyrillicCHEDC", "cyrillicCHEDCabkhasian", "cyrillicCHEabkhasian", "cyrillicCHEdiaeresis", "cyrillicCHEkhakassian", "cyrillicCHEvertstroke", "cyrillicD", "cyrillicDASIAPNEUMATA", "cyrillicDJE", "cyrillicDZE", "cyrillicDZEabkhasian", "cyrillicDZHE", "cyrillicE", "cyrillicELtail", "cyrillicEMtail", "cyrillicENDC", "cyrillicENGHE", "cyrillicENhook", "cyrillicENtail", "cyrillicEREV", "cyrillicERY", "cyrillicERtick", "cyrillicEbreve", "cyrillicEdiaeresis", "cyrillicEgrave", "cyrillicEiotified", "cyrillicF", "cyrillicFITA", "cyrillicG", "cyrillicGHEmidhook", "cyrillicGHEstroke", "cyrillicGHEupturn", "cyrillicGJE", "cyrillicH", "cyrillicHA", "cyrillicHADC", "cyrillicHRDSN", "cyrillicI", "cyrillicIE", "cyrillicII", "cyrillicISHRT", "cyrillicISHRTtail", "cyrillicIZHITSA", "cyrillicIZHITSAdoublegrave", "cyrillicIdiaeresis", "cyrillicIgrave", "cyrillicImacron", "cyrillicJE", "cyrillicK", "cyrillicKADC", "cyrillicKAbashkir", "cyrillicKAhook", "cyrillicKAstroke", "cyrillicKAvertstroke", "cyrillicKJE", "cyrillicKOPPA", "cyrillicKSI", "cyrillicL", "cyrillicLITTLEYUS", "cyrillicLITTLEYUSiotified", "cyrillicLJE", "cyrillicM", "cyrillicN", "cyrillicNJE", "cyrillicO", "cyrillicOMEGA", "cyrillicOMEGAround", "cyrillicOMEGAtitlo", "cyrillicOT", "cyrillicObarred", "cyrillicObarreddiaeresis", "cyrillicOdiaeresis", "cyrillicP", "cyrillicPALATALIZATION", "cyrillicPALOCHKA", "cyrillicPEmidhook", "cyrillicPSI", "cyrillicPSILIPNEUMATA", "cyrillicR", "cyrillicS", "cyrillicSCHWA", "cyrillicSCHWAdiaeresis", "cyrillicSDSC", "cyrillicSEMISOFT", "cyrillicSFTSN", "cyrillicSH", "cyrillicSHCH", "cyrillicSHHA", "cyrillicT", "cyrillicTEDC", "cyrillicTETSE", "cyrillicTITLO", "cyrillicTSHE", "cyrillicU", "cyrillicUK", "cyrillicUSHRT", "cyrillicUdiaeresis", "cyrillicUdoubleacute", "cyrillicUmacron", "cyrillicV", "cyrillicYA", "cyrillicYAT", "cyrillicYERUdiaeresis", "cyrillicYI", "cyrillicYO", "cyrillicYU", "cyrillicYstr", "cyrillicYstrstroke", "cyrillicZ", "cyrillicZDSC", "cyrillicZEdiaeresis", "cyrillicZH", "cyrillicZHEbreve", "cyrillicZHEdescender", "cyrillicZHEdiaeresis", "cyrillica", "cyrillicabreve", "cyrillicadiaeresis", "cyrillicae", "cyrillicb", "cyrillicbigyus", "cyrillicbigyusiotified", "cyrillicc", "cyrillicch", "cyrilliccheabkhasian", "cyrillicchedc", "cyrillicchedcabkhasian", "cyrillicchediaeresis", "cyrillicchekhakassian", "cyrillicchevertstroke", "cyrillicd", "cyrillicdje", "cyrillicdze", "cyrillicdzeabkhasian", "cyrillicdzhe", "cyrillice", "cyrillicebreve", "cyrillicediaeresis", "cyrillicegrave", "cyrilliceiotified", "cyrilliceltail", "cyrillicemtail", "cyrillicendc", "cyrillicenghe", "cyrillicenhook", "cyrillicentail", "cyrillicerev", "cyrillicertick", "cyrillicery", "cyrillicf", "cyrillicfita", "cyrillicg", "cyrillicghemidhook", "cyrillicghestroke", "cyrillicgheupturn", "cyrillicgje", "cyrillich", "cyrillicha", "cyrillichadc", "cyrillichrdsn", "cyrillici", "cyrillicidiaeresis", "cyrillicie", "cyrillicigrave", "cyrillicii", "cyrillicimacron", "cyrillicishrt", "cyrillicishrttail", "cyrillicizhitsa", "cyrillicizhitsadoublegrave", "cyrillicje", "cyrillick", "cyrillickabashkir", "cyrillickadc", "cyrillickahook", "cyrillickastroke", "cyrillickavertstroke", "cyrillickje", "cyrillickoppa", "cyrillicksi", "cyrillicl", "cyrilliclittleyus", "cyrilliclittleyusiotified", "cyrilliclje", "cyrillicm", "cyrillicn", "cyrillicnje", "cyrillico", "cyrillicobarred", "cyrillicobarreddiaeresis", "cyrillicodiaeresis", "cyrillicomega", "cyrillicomegaround", "cyrillicomegatitlo", "cyrillicot", "cyrillicp", "cyrillicpemidhook", "cyrillicpsi", "cyrillicr", "cyrillics", "cyrillicschwa", "cyrillicschwadiaeresis", "cyrillicsdsc", "cyrillicsemisoft", "cyrillicsftsn", "cyrillicsh", "cyrillicshch", "cyrillicshha", "cyrillict", "cyrillictedc", "cyrillictetse", "cyrillictshe", "cyrillicu", "cyrillicudiaeresis", "cyrillicudoubleacute", "cyrillicuk", "cyrillicumacron", "cyrillicushrt", "cyrillicv", "cyrillicya", "cyrillicyat", "cyrillicyerudiaeresis", "cyrillicyi", "cyrillicyo", "cyrillicystr", "cyrillicystrstroke", "cyrillicyu", "cyrillicz", "cyrilliczdsc", "cyrilliczediaeresis", "cyrilliczh", "cyrilliczhebreve", "cyrilliczhedescender", "cyrilliczhediaeresis", "d", "dag", "dagger", "daleth", "dasharrow", "dashedleftarrow", "dashedrightarrow", "dashv", "datasetvariable", "date", "dayoftheweek", "dayspermonth", "dbinom", "dcaron", "dcurl", "ddag", "ddagger", "dddot", "ddot", "ddots", "decrement", "decrementcounter", "decrementedcounter", "decrementpagenumber", "decrementsubpagenumber", "decrementvalue", "defaultinterface", "defaultobjectpage", "defaultobjectreference", "defcatcodecommand", "defconvertedargument", "defconvertedcommand", "defconvertedvalue", "define", "defineMPinstance", "defineTABLEsetup", "defineaccent", "defineactivecharacter", "definealternativestyle", "defineanchor", "defineattachment", "defineattribute", "definebackground", "definebar", "defineblock", "definebodyfont", "definebodyfontenvironment", "definebodyfontswitch", "definebreakpoint", "definebreakpoints", "definebtx", "definebtxdataset", "definebtxregister", "definebtxrendering", "definebuffer", "definebutton", "definecapitals", "definecharacter", "definecharacterkerning", "definecharacterspacing", "definechemical", "definechemicals", "definechemicalsymbol", "definecollector", "definecolor", "definecolorgroup", "definecolumnbreak", "definecombination", "definecombinedlist", "definecommand", "definecomment", "definecomplexorsimple", "definecomplexorsimpleempty", "defineconversion", "defineconversionset", "definecounter", "definedataset", "definedelimitedtext", "definedeq", "definedescription", "definedfont", "defineeffect", "defineenumeration", "defineexpandable", "defineexternalfigure", "definefallbackfamily", "definefield", "definefieldbody", "definefieldbodyset", "definefieldcategory", "definefieldstack", "definefiguresymbol", "definefileconstant", "definefilefallback", "definefilesynonym", "definefiller", "definefirstline", "definefittingpage", "definefloat", "definefont", "definefontalternative", "definefontfallback", "definefontfamily", "definefontfamilypreset", "definefontfeature", "definefontfile", "definefontsize", "definefontsolution", "definefontstyle", "definefontsynonym", "defineformula", "defineformulaalternative", "defineformulaframed", "defineframed", "defineframedcontent", "defineframedtable", "defineframedtext", "definefrozenfont", "defineglobalcolor", "definegraphictypesynonym", "definegridsnapping", "definehbox", "definehead", "defineheadalternative", "definehelp", "definehigh", "definehighlight", "definehspace", "definehypenationfeatures", "defineindentedtext", "defineindenting", "defineinitial", "defineinsertion", "defineinteraction", "defineinteractionbar", "defineinteractionmenu", "defineinterfaceconstant", "defineinterfaceelement", "defineinterfacevariable", "defineinterlinespace", "defineintermediatecolor", "defineitemgroup", "defineitems", "definelabel", "definelabelclass", "definelayer", "definelayerpreset", "definelayout", "definelinefiller", "definelinenote", "definelinenumbering", "definelines", "definelist", "definelistalternative", "definelistextra", "definelow", "definelowhigh", "definelowmidhigh", "definemakeup", "definemarginblock", "definemargindata", "definemarker", "definemarking", "definemathaccent", "definemathalignment", "definemathcases", "definemathcommand", "definemathdouble", "definemathdoubleextensible", "definemathematics", "definemathextensible", "definemathfence", "definemathfraction", "definemathframed", "definemathmatrix", "definemathornament", "definemathover", "definemathoverextensible", "definemathovertextextensible", "definemathradical", "definemathstackers", "definemathstyle", "definemathtriplet", "definemathunder", "definemathunderextensible", "definemathundertextextensible", "definemathunstacked", "definemeasure", "definemessageconstant", "definemixedcolumns", "definemode", "definemultitonecolor", "definenamedcolor", "definenamespace", "definenarrower", "definenote", "defineornament", "defineoutputroutine", "defineoutputroutinecommand", "defineoverlay", "definepage", "definepagebreak", "definepagechecker", "definepagegrid", "definepagegridarea", "definepagegridspan", "definepageinjection", "definepageinjectionalternative", "definepageshift", "definepagestate", "definepairedbox", "definepalet", "definepapersize", "defineparagraph", "defineparagraphs", "defineparallel", "defineparbuilder", "defineplacement", "definepositioning", "defineprefixset", "defineprocesscolor", "defineprocessor", "defineprofile", "defineprogram", "definepushbutton", "definepushsymbol", "definereference", "definereferenceformat", "defineregister", "definerenderingwindow", "defineresetset", "definescale", "definescript", "definesection", "definesectionblock", "definesectionlevels", "defineselector", "defineseparatorset", "defineshift", "definesidebar", "definesort", "definesorting", "definespotcolor", "definestartstop", "definestyle", "definestyleinstance", "definesubfield", "definesubformula", "definesymbol", "definesynonym", "definesynonyms", "definesystemattribute", "definesystemconstant", "definesystemvariable", "definetabletemplate", "definetabulate", "definetabulation", "definetext", "definetextbackground", "definetextflow", "definetooltip", "definetransparency", "definetwopasslist", "definetype", "definetypeface", "definetypescriptprefix", "definetypescriptsynonym", "definetypesetting", "definetyping", "defineunit", "defineviewerlayer", "definevspace", "definevspacing", "definevspacingamount", "definextable", "delimited", "delimitedtext", "delta", "depthofstring", "depthonlybox", "depthspanningtext", "depthstrut", "determineheadnumber", "determinelistcharacteristics", "determinenoflines", "determineregistercharacteristics", "devanagarinumerals", "dfrac", "dhook", "diameter", "diamond", "diamondsuit", "differentialD", "differentiald", "digamma", "digits", "dimensiontocount", "directboxfromcache", "directcolor", "directcolored", "directconvertedcounter", "directcopyboxfromcache", "directdummyparameter", "directgetboxllx", "directgetboxlly", "directhighlight", "directlocalframed", "directluacode", "directselect", "directsetbar", "directsetup", "directsymbol", "directvspacing", "dis", "disabledirectives", "disableexperiments", "disablemode", "disableoutputstream", "disableparpositions", "disableregime", "disabletrackers", "displaymath", "displaymathematics", "displaymessage", "distributedhsize", "div", "dividedsize", "divideontimes", "divides", "doadaptleftskip", "doadaptrightskip", "doaddfeature", "doassign", "doassignempty", "doboundtext", "docheckassignment", "docheckedpagestate", "docheckedpair", "documentvariable", "dodoubleargument", "dodoubleargumentwithset", "dodoubleempty", "dodoubleemptywithset", "dodoublegroupempty", "doeassign", "doexpandedrecurse", "dofastloopcs", "dogetattribute", "dogetattributeid", "dogetcommacommandelement", "dogobbledoubleempty", "dogobblesingleempty", "doif", "doifMPgraphicelse", "doifallcommon", "doifallcommonelse", "doifalldefinedelse", "doifallmodes", "doifallmodeselse", "doifassignmentelse", "doifblackelse", "doifbothsides", "doifbothsidesoverruled", "doifboxelse", "doifbufferelse", "doifcolor", "doifcolorelse", "doifcommandhandler", "doifcommandhandlerelse", "doifcommon", "doifcommonelse", "doifcontent", "doifconversiondefinedelse", "doifconversionnumberelse", "doifcounter", "doifcounterelse", "doifcurrentfonthasfeatureelse", "doifdefined", "doifdefinedcounter", "doifdefinedcounterelse", "doifdefinedelse", "doifdimensionelse", "doifdimenstringelse", "doifdocumentargument", "doifdocumentargumentelse", "doifdocumentfilename", "doifdocumentfilenameelse", "doifdrawingblackelse", "doifelse", "doifelseMPgraphic", "doifelseallcommon", "doifelsealldefined", "doifelseallmodes", "doifelseassignment", "doifelseblack", "doifelsebox", "doifelseboxincache", "doifelsebuffer", "doifelsecolor", "doifelsecommandhandler", "doifelsecommon", "doifelseconversiondefined", "doifelseconversionnumber", "doifelsecounter", "doifelsecurrentfonthasfeature", "doifelsecurrentsortingused", "doifelsecurrentsynonymshown", "doifelsecurrentsynonymused", "doifelsedefined", "doifelsedefinedcounter", "doifelsedimension", "doifelsedimenstring", "doifelsedocumentargument", "doifelsedocumentfilename", "doifelsedrawingblack", "doifelseempty", "doifelseemptyvalue", "doifelseemptyvariable", "doifelseenv", "doifelsefastoptionalcheck", "doifelsefastoptionalcheckcs", "doifelsefieldbody", "doifelsefieldcategory", "doifelsefigure", "doifelsefile", "doifelsefiledefined", "doifelsefileexists", "doifelsefirstchar", "doifelseflagged", "doifelsefontchar", "doifelsefontpresent", "doifelsefontsynonym", "doifelsehasspace", "doifelsehelp", "doifelseincsname", "doifelseinelement", "doifelseinputfile", "doifelseinsertion", "doifelseinset", "doifelseinstring", "doifelseinsymbolset", "doifelseintoks", "doifelseintwopassdata", "doifelseitalic", "doifelselanguage", "doifelselayerdata", "doifelselayoutdefined", "doifelselayoutsomeline", "doifelselayouttextline", "doifelseleapyear", "doifelselist", "doifelselocation", "doifelselocfile", "doifelsemainfloatbody", "doifelsemarkedpage", "doifelsemarking", "doifelsemeaning", "doifelsemessage", "doifelsemode", "doifelsenextbgroup", "doifelsenextbgroupcs", "doifelsenextchar", "doifelsenextoptional", "doifelsenextoptionalcs", "doifelsenextparenthesis", "doifelsenonzeropositive", "doifelsenoteonsamepage", "doifelsenothing", "doifelsenumber", "doifelseobjectfound", "doifelseobjectreferencefound", "doifelseoddpage", "doifelseoddpagefloat", "doifelseoldercontext", "doifelseolderversion", "doifelseoverlapping", "doifelseoverlay", "doifelseparallel", "doifelseparentfile", "doifelsepath", "doifelsepathexists", "doifelsepatterns", "doifelseposition", "doifelsepositionaction", "doifelsepositiononpage", "doifelsepositionsonsamepage", "doifelsepositionsonthispage", "doifelsepositionsused", "doifelsereferencefound", "doifelserightpagefloat", "doifelserighttoleftinbox", "doifelsesamelinereference", "doifelsesamestring", "doifelsesetups", "doifelsesomebackground", "doifelsesomespace", "doifelsesomething", "doifelsesometoks", "doifelsestringinstring", "doifelsestructurelisthasnumber", "doifelsestructurelisthaspage", "doifelsesymboldefined", "doifelsesymbolset", "doifelsetext", "doifelsetextflow", "doifelsetextflowcollector", "doifelsetopofpage", "doifelsetypingfile", "doifelseundefined", "doifelseurldefined", "doifelsevalue", "doifelsevaluenothing", "doifelsevariable", "doifempty", "doifemptyelse", "doifemptytoks", "doifemptyvalue", "doifemptyvalueelse", "doifemptyvariable", "doifemptyvariableelse", "doifenv", "doifenvelse", "doiffastoptionalcheckcselse", "doiffastoptionalcheckelse", "doiffieldbodyelse", "doiffieldcategoryelse", "doiffigureelse", "doiffile", "doiffiledefinedelse", "doiffileelse", "doiffileexistselse", "doiffirstcharelse", "doifflaggedelse", "doiffontcharelse", "doiffontpresentelse", "doiffontsynonymelse", "doifhasspaceelse", "doifhelpelse", "doifincsnameelse", "doifinelementelse", "doifinputfileelse", "doifinsertionelse", "doifinset", "doifinsetelse", "doifinstring", "doifinstringelse", "doifinsymbolset", "doifinsymbolsetelse", "doifintokselse", "doifintwopassdataelse", "doifitalicelse", "doiflanguageelse", "doiflayerdataelse", "doiflayoutdefinedelse", "doiflayoutsomelineelse", "doiflayouttextlineelse", "doifleapyearelse", "doiflistelse", "doiflocationelse", "doiflocfileelse", "doifmainfloatbodyelse", "doifmarkingelse", "doifmeaningelse", "doifmessageelse", "doifmode", "doifmodeelse", "doifnextbgroupcselse", "doifnextbgroupelse", "doifnextcharelse", "doifnextoptionalcselse", "doifnextoptionalelse", "doifnextparenthesiselse", "doifnonzeropositiveelse", "doifnot", "doifnotallcommon", "doifnotallmodes", "doifnotcommandhandler", "doifnotcommon", "doifnotcounter", "doifnotdocumentargument", "doifnotdocumentfilename", "doifnotempty", "doifnotemptyvalue", "doifnotemptyvariable", "doifnotenv", "doifnoteonsamepageelse", "doifnotescollected", "doifnotfile", "doifnotflagged", "doifnothing", "doifnothingelse", "doifnotinset", "doifnotinsidesplitfloat", "doifnotinstring", "doifnotmode", "doifnotnumber", "doifnotsamestring", "doifnotsetups", "doifnotvalue", "doifnotvariable", "doifnumber", "doifnumberelse", "doifobjectfoundelse", "doifobjectreferencefoundelse", "doifoddpageelse", "doifoddpagefloatelse", "doifoldercontextelse", "doifolderversionelse", "doifoverlappingelse", "doifoverlayelse", "doifparallelelse", "doifparentfileelse", "doifpathelse", "doifpathexistselse", "doifpatternselse", "doifposition", "doifpositionaction", "doifpositionactionelse", "doifpositionelse", "doifpositiononpageelse", "doifpositionsonsamepageelse", "doifpositionsonthispageelse", "doifpositionsusedelse", "doifreferencefoundelse", "doifrightpagefloatelse", "doifrighttoleftinboxelse", "doifsamelinereferenceelse", "doifsamestring", "doifsamestringelse", "doifsetups", "doifsetupselse", "doifsomebackground", "doifsomebackgroundelse", "doifsomespaceelse", "doifsomething", "doifsomethingelse", "doifsometoks", "doifsometokselse", "doifstringinstringelse", "doifstructurelisthasnumberelse", "doifstructurelisthaspageelse", "doifsymboldefinedelse", "doifsymbolsetelse", "doiftext", "doiftextelse", "doiftextflowcollectorelse", "doiftextflowelse", "doiftopofpageelse", "doiftypingfileelse", "doifundefined", "doifundefinedcounter", "doifundefinedelse", "doifurldefinedelse", "doifvalue", "doifvalueelse", "doifvaluenothing", "doifvaluenothingelse", "doifvaluesomething", "doifvariable", "doifvariableelse", "doindentation", "dollar", "doloop", "doloopoverlist", "donothing", "dontconvertfont", "dontleavehmode", "dontpermitspacesbetweengroups", "dopositionaction", "doprocesslocalsetups", "doquadrupleargument", "doquadrupleempty", "doquadruplegroupempty", "doquintupleargument", "doquintupleempty", "doquintuplegroupempty", "dorechecknextindentation", "dorecurse", "dorepeatwithcommand", "doreplacefeature", "doresetandafffeature", "doresetattribute", "dorotatebox", "dosetattribute", "dosetleftskipadaption", "dosetrightskipadaption", "dosetupcheckedinterlinespace", "doseventupleargument", "doseventupleempty", "dosingleargument", "dosingleempty", "dosinglegroupempty", "dosixtupleargument", "dosixtupleempty", "dostepwiserecurse", "dosubtractfeature", "dot", "doteq", "doteqdot", "dotfskip", "dotlessI", "dotlessJ", "dotlessi", "dotlessj", "dotlessjstroke", "dotminus", "dotoks", "dotplus", "dotripleargument", "dotripleargumentwithset", "dotripleempty", "dotripleemptywithset", "dotriplegroupempty", "dots", "dottedrightarrow", "doublebar", "doublebond", "doublebrace", "doublebracket", "doublecap", "doublecup", "doubleparent", "doubleprime", "doubleverticalbar", "dowith", "dowithnextbox", "dowithnextboxcontent", "dowithnextboxcontentcs", "dowithnextboxcs", "dowithpargument", "dowithrange", "dowithwargument", "downarrow", "downdasharrow", "downdownarrows", "downharpoonleft", "downharpoonright", "downuparrows", "downwhitearrow", "downzigzagarrow", "dpofstring", "dstroke", "dtail", "dummydigit", "dummyparameter", "dzcaronligature", "dzligature", "eTeX", "eacute", "ebreve", "ecaron", "ecedilla", "ecircumflex", "ecircumflexacute", "ecircumflexdotbelow", "ecircumflexgrave", "ecircumflexhook", "ecircumflextilde", "edefconvertedargument", "ediaeresis", "edotaccent", "edotbelow", "edoublegrave", "efcmaxheight", "efcmaxwidth", "efcminheight", "efcminwidth", "efcparameter", "effect", "egrave", "ehook", "einvertedbreve", "elapsedseconds", "elapsedtime", "eleftarrowfill", "eleftharpoondownfill", "eleftharpoonupfill", "eleftrightarrowfill", "ell", "em", "emacron", "emdash", "emphasisboldface", "emphasistypeface", "emptylines", "emptyset", "emquad", "emspace", "enabledirectives", "enableexperiments", "enablemode", "enableoutputstream", "enableparpositions", "enableregime", "enabletrackers", "endash", "endnote", "enquad", "enskip", "enspace", "env", "environment", "envvar", "eogonek", "eoverbarfill", "eoverbracefill", "eoverbracketfill", "eoverparentfill", "epos", "epsilon", "eq", "eqcirc", "eqeq", "eqeqeq", "eqgtr", "eqless", "eqsim", "eqslantgtr", "eqslantless", "equaldigits", "equalscolon", "equiv", "erightarrowfill", "erightharpoondownfill", "erightharpoonupfill", "eta", "eth", "ethiopic", "etilde", "etwoheadrightarrowfill", "eunderbarfill", "eunderbracefill", "eunderbracketfill", "eunderparentfill", "exclamdown", "executeifdefined", "exists", "exitloop", "exitloopnow", "expandcheckedcsname", "expanded", "expandfontsynonym", "expdoif", "expdoifcommonelse", "expdoifelse", "expdoifelsecommon", "expdoifelseinset", "expdoifinsetelse", "expdoifnot", "exponentiale", "externalfigure", "externalfigurecollectionmaxheight", "externalfigurecollectionmaxwidth", "externalfigurecollectionminheight", "externalfigurecollectionminwidth", "externalfigurecollectionparameter", "fakebox", "fallingdotseq", "fastdecrement", "fastincrement", "fastlocalframed", "fastloopfinal", "fastloopindex", "fastscale", "fastsetup", "fastsetupwithargument", "fastsetupwithargumentswapped", "fastswitchtobodyfont", "fastsxsy", "feature", "fence", "fenced", "fetchallmarkings", "fetchallmarks", "fetchmark", "fetchmarking", "fetchonemark", "fetchonemarking", "fetchruntinecommand", "fetchtwomarkings", "fetchtwomarks", "ffiligature", "ffligature", "fflligature", "fhook", "field", "fieldbody", "fieldstack", "fifthoffivearguments", "fifthofsixarguments", "figurefilename", "figurefilepath", "figurefiletype", "figurefullname", "figureheight", "figurenaturalheight", "figurenaturalwidth", "figurespace", "figuresymbol", "figurewidth", "filename", "filigature", "filledhboxb", "filledhboxc", "filledhboxg", "filledhboxk", "filledhboxm", "filledhboxr", "filledhboxy", "filler", "fillinline", "fillinrules", "fillintext", "filterfromnext", "filterfromvalue", "filterpages", "filterreference", "findtwopassdata", "finishregisterentry", "firstcharacter", "firstcounter", "firstcountervalue", "firstoffivearguments", "firstoffourarguments", "firstofoneargument", "firstofoneunexpanded", "firstofsixarguments", "firstofthreearguments", "firstofthreeunexpanded", "firstoftwoarguments", "firstoftwounexpanded", "firstrealpage", "firstrealpagenumber", "firstsubcountervalue", "firstsubpage", "firstsubpagenumber", "firstuserpage", "firstuserpagenumber", "fitfield", "fitfieldframed", "fittopbaselinegrid", "fiveeighths", "fivesixths", "fixedspace", "fixedspaces", "flag", "flat", "flligature", "floatuserdataparameter", "flushbox", "flushboxregister", "flushcollector", "flushedrightlastline", "flushlayer", "flushlocalfloats", "flushnextbox", "flushnotes", "flushoutputstream", "flushshapebox", "flushtextflow", "flushtokens", "flushtoks", "fontalternative", "fontbody", "fontchar", "fontcharbyindex", "fontclass", "fontclassname", "fontface", "fontfeaturelist", "fontsize", "fontstyle", "footnote", "footnotetext", "forall", "forcecharacterstripping", "forcelocalfloats", "forgeteverypar", "forgetparameters", "forgetragged", "formula", "formulanumber", "foundbox", "fourfifths", "fourperemspace", "fourthoffivearguments", "fourthoffourarguments", "fourthofsixarguments", "frac", "framed", "frameddimension", "framedparameter", "framedtext", "freezedimenmacro", "freezemeasure", "frenchspacing", "from", "fromlinenote", "frown", "frozenhbox", "frule", "gacute", "gamma", "gbreve", "gcaron", "gcircumflex", "gcommaaccent", "gdefconvertedargument", "gdefconvertedcommand", "gdotaccent", "ge", "geq", "geqq", "geqslant", "getMPdrawing", "getMPlayer", "getboxfromcache", "getboxllx", "getboxlly", "getbuffer", "getbufferdata", "getcommacommandsize", "getcommalistsize", "getdayoftheweek", "getdayspermonth", "getdefinedbuffer", "getdocumentargument", "getdocumentargumentdefault", "getdocumentfilename", "getdummyparameters", "getemptyparameters", "geteparameters", "getexpandedparameters", "getfiguredimensions", "getfirstcharacter", "getfirsttwopassdata", "getfromcommacommand", "getfromcommalist", "getfromtwopassdata", "getglyphdirect", "getglyphstyled", "getgparameters", "getlasttwopassdata", "getlocalfloat", "getlocalfloats", "getmarking", "getmessage", "getnamedglyphdirect", "getnamedglyphstyled", "getnamedtwopassdatalist", "getnaturaldimensions", "getnoflines", "getobject", "getobjectdimensions", "getpaletsize", "getparameters", "getprivatechar", "getprivateslot", "getrandomcount", "getrandomdimen", "getrandomfloat", "getrandomnumber", "getrandomseed", "getraweparameters", "getrawgparameters", "getrawnoflines", "getrawparameters", "getrawxparameters", "getreference", "getreferenceentry", "getroundednoflines", "gets", "getsubstring", "gettwopassdata", "gettwopassdatalist", "getuvalue", "getvalue", "getvariable", "getvariabledefault", "getxparameters", "gg", "ggg", "gggtr", "gimel", "globaldisablemode", "globalenablemode", "globalletempty", "globalpopbox", "globalpopmacro", "globalpreventmode", "globalprocesscommalist", "globalpushbox", "globalpushmacro", "globalswapcounts", "globalswapdimens", "globalswapmacros", "globalundefine", "glyphfontfile", "gnapprox", "gneqq", "gnsim", "gobbledoubleempty", "gobbleeightarguments", "gobblefivearguments", "gobblefiveoptionals", "gobblefourarguments", "gobblefouroptionals", "gobbleninearguments", "gobbleoneargument", "gobbleoneoptional", "gobblesevenarguments", "gobblesingleempty", "gobblesixarguments", "gobblespacetokens", "gobbletenarguments", "gobblethreearguments", "gobblethreeoptionals", "gobbletwoarguments", "gobbletwooptionals", "gobbleuntil", "gobbleuntilrelax", "godown", "goto", "gotobox", "gotopage", "grabbufferdata", "grabbufferdatadirect", "grabuntil", "grave", "graycolor", "grayvalue", "greedysplitstring", "greekAlpha", "greekAlphadasia", "greekAlphadasiaperispomeni", "greekAlphadasiatonos", "greekAlphadasiavaria", "greekAlphaiotasub", "greekAlphaiotasubdasia", "greekAlphaiotasubdasiaperispomeni", "greekAlphaiotasubdasiatonos", "greekAlphaiotasubdasiavaria", "greekAlphaiotasubpsili", "greekAlphaiotasubpsiliperispomeni", "greekAlphaiotasubpsilitonos", "greekAlphaiotasubpsilivaria", "greekAlphamacron", "greekAlphapsili", "greekAlphapsiliperispomeni", "greekAlphapsilitonos", "greekAlphapsilivaria", "greekAlphatonos", "greekAlphavaria", "greekAlphavrachy", "greekBeta", "greekChi", "greekCoronis", "greekDelta", "greekEpsilon", "greekEpsilondasia", "greekEpsilondasiatonos", "greekEpsilondasiavaria", "greekEpsilonpsili", "greekEpsilonpsilitonos", "greekEpsilonpsilivaria", "greekEpsilontonos", "greekEpsilonvaria", "greekEta", "greekEtadasia", "greekEtadasiaperispomeni", "greekEtadasiatonos", "greekEtadasiavaria", "greekEtaiotasub", "greekEtaiotasubdasia", "greekEtaiotasubdasiaperispomeni", "greekEtaiotasubdasiatonos", "greekEtaiotasubdasiavaria", "greekEtaiotasubpsili", "greekEtaiotasubpsiliperispomeni", "greekEtaiotasubpsilitonos", "greekEtaiotasubpsilivaria", "greekEtapsili", "greekEtapsiliperispomeni", "greekEtapsilitonos", "greekEtapsilivaria", "greekEtatonos", "greekEtavaria", "greekGamma", "greekIota", "greekIotadasia", "greekIotadasiaperispomeni", "greekIotadasiatonos", "greekIotadasiavaria", "greekIotadialytika", "greekIotamacron", "greekIotapsili", "greekIotapsiliperispomeni", "greekIotapsilitonos", "greekIotapsilivaria", "greekIotatonos", "greekIotavaria", "greekIotavrachy", "greekKappa", "greekLambda", "greekMu", "greekNu", "greekOmega", "greekOmegadasia", "greekOmegadasiaperispomeni", "greekOmegadasiatonos", "greekOmegadasiavaria", "greekOmegaiotasub", "greekOmegaiotasubdasia", "greekOmegaiotasubdasiaperispomeni", "greekOmegaiotasubdasiatonos", "greekOmegaiotasubdasiavaria", "greekOmegaiotasubpsili", "greekOmegaiotasubpsiliperispomeni", "greekOmegaiotasubpsilitonos", "greekOmegaiotasubpsilivaria", "greekOmegapsili", "greekOmegapsiliperispomeni", "greekOmegapsilitonos", "greekOmegapsilivaria", "greekOmegatonos", "greekOmegavaria", "greekOmicron", "greekOmicrondasia", "greekOmicrondasiatonos", "greekOmicrondasiavaria", "greekOmicronpsili", "greekOmicronpsilitonos", "greekOmicronpsilivaria", "greekOmicrontonos", "greekOmicronvaria", "greekPhi", "greekPi", "greekPsi", "greekRho", "greekRhodasia", "greekSigma", "greekSigmalunate", "greekTau", "greekTheta", "greekUpsilon", "greekUpsilondasia", "greekUpsilondasiaperispomeni", "greekUpsilondasiatonos", "greekUpsilondasiavaria", "greekUpsilondialytika", "greekUpsilonmacron", "greekUpsilontonos", "greekUpsilonvaria", "greekUpsilonvrachy", "greekXi", "greekZeta", "greekalpha", "greekalphadasia", "greekalphadasiaperispomeni", "greekalphadasiatonos", "greekalphadasiavaria", "greekalphaiotasub", "greekalphaiotasubdasia", "greekalphaiotasubdasiaperispomeni", "greekalphaiotasubdasiatonos", "greekalphaiotasubdasiavaria", "greekalphaiotasubperispomeni", "greekalphaiotasubpsili", "greekalphaiotasubpsiliperispomeni", "greekalphaiotasubpsilitonos", "greekalphaiotasubpsilivaria", "greekalphaiotasubtonos", "greekalphaiotasubvaria", "greekalphamacron", "greekalphaoxia", "greekalphaperispomeni", "greekalphapsili", "greekalphapsiliperispomeni", "greekalphapsilitonos", "greekalphapsilivaria", "greekalphatonos", "greekalphavaria", "greekalphavrachy", "greekbeta", "greekchi", "greekdasia", "greekdasiaperispomeni", "greekdasiatonos", "greekdasiavaria", "greekdelta", "greekdialytikaperispomeni", "greekdialytikatonos", "greekdialytikavaria", "greekdigamma", "greekepsilon", "greekepsilonalt", "greekepsilondasia", "greekepsilondasiatonos", "greekepsilondasiavaria", "greekepsilonoxia", "greekepsilonpsili", "greekepsilonpsilitonos", "greekepsilonpsilivaria", "greekepsilontonos", "greekepsilonvaria", "greeketa", "greeketadasia", "greeketadasiaperispomeni", "greeketadasiatonos", "greeketadasiavaria", "greeketaiotasub", "greeketaiotasubdasia", "greeketaiotasubdasiaperispomeni", "greeketaiotasubdasiatonos", "greeketaiotasubdasiavaria", "greeketaiotasubperispomeni", "greeketaiotasubpsili", "greeketaiotasubpsiliperispomeni", "greeketaiotasubpsilitonos", "greeketaiotasubpsilivaria", "greeketaiotasubtonos", "greeketaiotasubvaria", "greeketaoxia", "greeketaperispomeni", "greeketapsili", "greeketapsiliperispomeni", "greeketapsilitonos", "greeketapsilivaria", "greeketatonos", "greeketavaria", "greekfinalsigma", "greekgamma", "greekiota", "greekiotadasia", "greekiotadasiaperispomeni", "greekiotadasiatonos", "greekiotadasiavaria", "greekiotadialytika", "greekiotadialytikaperispomeni", "greekiotadialytikatonos", "greekiotadialytikavaria", "greekiotamacron", "greekiotaoxia", "greekiotaperispomeni", "greekiotapsili", "greekiotapsiliperispomeni", "greekiotapsilitonos", "greekiotapsilivaria", "greekiotatonos", "greekiotavaria", "greekiotavrachy", "greekkappa", "greekkoppa", "greeklambda", "greekmu", "greeknu", "greeknumerals", "greeknumkoppa", "greekomega", "greekomegadasia", "greekomegadasiaperispomeni", "greekomegadasiatonos", "greekomegadasiavaria", "greekomegaiotasub", "greekomegaiotasubdasia", "greekomegaiotasubdasiaperispomeni", "greekomegaiotasubdasiatonos", "greekomegaiotasubdasiavaria", "greekomegaiotasubperispomeni", "greekomegaiotasubpsili", "greekomegaiotasubpsiliperispomeni", "greekomegaiotasubpsilitonos", "greekomegaiotasubpsilivaria", "greekomegaiotasubtonos", "greekomegaiotasubvaria", "greekomegaoxia", "greekomegaperispomeni", "greekomegapsili", "greekomegapsiliperispomeni", "greekomegapsilitonos", "greekomegapsilivaria", "greekomegatonos", "greekomegavaria", "greekomicron", "greekomicrondasia", "greekomicrondasiatonos", "greekomicrondasiavaria", "greekomicronoxia", "greekomicronpsili", "greekomicronpsilitonos", "greekomicronpsilivaria", "greekomicrontonos", "greekomicronvaria", "greekoxia", "greekperispomeni", "greekphi", "greekphialt", "greekpi", "greekpialt", "greekprosgegrammeni", "greekpsi", "greekpsili", "greekpsiliperispomeni", "greekpsilitonos", "greekpsilivaria", "greekrho", "greekrhoalt", "greekrhodasia", "greekrhopsili", "greeksampi", "greeksigma", "greeksigmalunate", "greekstigma", "greektau", "greektheta", "greekthetaalt", "greektonos", "greekupsilon", "greekupsilondasia", "greekupsilondasiaperispomeni", "greekupsilondasiatonos", "greekupsilondasiavaria", "greekupsilondiaeresis", "greekupsilondialytikaperispomeni", "greekupsilondialytikatonos", "greekupsilondialytikavaria", "greekupsilonmacron", "greekupsilonoxia", "greekupsilonperispomeni", "greekupsilonpsili", "greekupsilonpsiliperispomeni", "greekupsilonpsilitonos", "greekupsilonpsilivaria", "greekupsilontonos", "greekupsilonvaria", "greekupsilonvrachy", "greekvaria", "greekxi", "greekzeta", "grid", "groupedcommand", "gsetboxllx", "gsetboxlly", "gstroke", "gt", "gtrapprox", "gtrdot", "gtreqless", "gtreqqless", "gtrless", "gtrsim", "guilsingleleft", "guilsingleright", "gujaratinumerals", "gurmurkhinumerals", "hairline", "hairspace", "halflinestrut", "halfstrut", "halfwaybox", "handletokens", "handwritten", "hangul", "hanzi", "hash", "hat", "hbar", "hboxofvbox", "hboxreference", "hcaron", "hcircumflex", "hdofstring", "headhbox", "headlanguage", "headnumber", "headnumbercontent", "headnumberdistance", "headnumberwidth", "headreferenceattributes", "headsetupspacing", "headtext", "headtextcontent", "headtextdistance", "headtexts", "headtextwidth", "headvbox", "headwidth", "heartsuit", "hebrewAlef", "hebrewAyin", "hebrewBet", "hebrewDalet", "hebrewGimel", "hebrewHe", "hebrewHet", "hebrewKaf", "hebrewKaffinal", "hebrewLamed", "hebrewMem", "hebrewMemfinal", "hebrewNun", "hebrewNunfinal", "hebrewPe", "hebrewPefinal", "hebrewQof", "hebrewResh", "hebrewSamekh", "hebrewShin", "hebrewTav", "hebrewTet", "hebrewTsadi", "hebrewTsadifinal", "hebrewVav", "hebrewYod", "hebrewZayin", "heightanddepthofstring", "heightofstring", "heightspanningtext", "helptext", "hglue", "hiddenbar", "hiddencitation", "hiddencite", "hideblocks", "high", "highlight", "highordinalstr", "hilo", "himilo", "hl", "hookleftarrow", "hookrightarrow", "horizontalgrowingbar", "horizontalpositionbar", "hphantom", "hpos", "hsizefraction", "hslash", "hsmash", "hsmashbox", "hsmashed", "hspace", "hstroke", "htdpofstring", "htofstring", "hyphen", "hyphenatedcoloredword", "hyphenatedfile", "hyphenatedfilename", "hyphenatedhbox", "hyphenatedpar", "hyphenatedurl", "hyphenatedword", "iacute", "ibox", "ibreve", "icaron", "icircumflex", "ideographichalffillspace", "ideographicspace", "idiaeresis", "idotaccent", "idotbelow", "idoublegrave", "ifassignment", "iff", "ifinobject", "ifinoutputstream", "ifparameters", "iftrialtypesetting", "ignoreimplicitspaces", "ignorevalue", "igrave", "ihook", "iiiint", "iiiintop", "iiint", "iiintop", "iint", "iintop", "iinvertedbreve", "ijligature", "imacron", "imaginaryi", "imaginaryj", "imath", "immediatesavetwopassdata", "impliedby", "implies", "imply", "in", "includemenu", "includeversioninfo", "increment", "incrementcounter", "incrementedcounter", "incrementpagenumber", "incrementsubpagenumber", "incrementvalue", "indentation", "index", "infofont", "infofontbold", "inframed", "infty", "infull", "inheritparameter", "inhibitblank", "ininner", "ininneredge", "ininnermargin", "initializeboxstack", "inleft", "inleftedge", "inleftmargin", "inline", "inlinebuffer", "inlinedbox", "inlinemath", "inlinemathematics", "inlinemessage", "inlineordisplaymath", "inlineprettyprintbuffer", "inlinerange", "inmargin", "inmframed", "innerflushshapebox", "inother", "inouter", "inouteredge", "inoutermargin", "input", "inputfilebarename", "inputfilename", "inputfilerealsuffix", "inputfilesuffix", "inputgivenfile", "inright", "inrightedge", "inrightmargin", "insertpages", "installactionhandler", "installactivecharacter", "installanddefineactivecharacter", "installattributestack", "installautocommandhandler", "installautosetuphandler", "installbasicautosetuphandler", "installbasicparameterhandler", "installbottomframerenderer", "installcommandhandler", "installcorenamespace", "installdefinehandler", "installdefinitionset", "installdefinitionsetmember", "installdirectcommandhandler", "installdirectparameterhandler", "installdirectparametersethandler", "installdirectsetuphandler", "installdirectstyleandcolorhandler", "installframedautocommandhandler", "installframedcommandhandler", "installlanguage", "installleftframerenderer", "installnamespace", "installoutputroutine", "installpagearrangement", "installparameterhandler", "installparameterhashhandler", "installparametersethandler", "installparentinjector", "installrightframerenderer", "installrootparameterhandler", "installsetuphandler", "installsetuponlycommandhandler", "installshipoutmethod", "installsimplecommandhandler", "installsimpleframedcommandhandler", "installstyleandcolorhandler", "installswitchcommandhandler", "installswitchsetuphandler", "installtexdirective", "installtextracker", "installtopframerenderer", "installunitsseparator", "installunitsspace", "installversioninfo", "int", "intclockwise", "integerrounding", "integers", "interactionbar", "interactionbuttons", "interactionmenu", "intercal", "intertext", "intop", "invisibletimes", "invokepageheandler", "iogonek", "iota", "istltdir", "istrtdir", "italic", "italicbold", "italiccorrection", "italicface", "item", "items", "itemtag", "itilde", "jcaron", "jcircumflex", "jmath", "jobfilename", "jobfilesuffix", "kap", "kappa", "kcaron", "kcommaaccent", "keepblocks", "keeplinestogether", "keepunwantedspaces", "kerncharacters", "khook", "kkra", "koreancirclenumerals", "koreannumerals", "koreannumeralsc", "koreannumeralsp", "koreanparentnumerals", "lVert", "labellanguage", "labeltext", "labeltexts", "lacute", "lambda", "lambdabar", "land", "langle", "language", "languageCharacters", "languagecharacters", "languagecharwidth", "lastcounter", "lastcountervalue", "lastdigit", "lastlinewidth", "lastnaturalboxdp", "lastnaturalboxht", "lastnaturalboxwd", "lastpredefinedsymbol", "lastrealpage", "lastrealpagenumber", "lastsubcountervalue", "lastsubpage", "lastsubpagenumber", "lasttwodigits", "lastuserpage", "lastuserpagenumber", "lateluacode", "latin", "layeredtext", "layerheight", "layerwidth", "lazysavetaggedtwopassdata", "lazysavetwopassdata", "lbar", "lbox", "lbrace", "lbracket", "lcaron", "lceil", "lcommaaccent", "lcurl", "ldotmiddle", "ldotp", "ldots", "le", "leadsto", "left", "leftaligned", "leftarrow", "leftarrowtail", "leftarrowtriangle", "leftbottombox", "leftbox", "leftdasharrow", "leftguillemot", "leftharpoondown", "leftharpoonup", "lefthbox", "leftheadtext", "leftlabeltext", "leftleftarrows", "leftline", "leftmathlabeltext", "leftorrighthbox", "leftorrightvbox", "leftorrightvtop", "leftrightarrow", "leftrightarrows", "leftrightarrowtriangle", "leftrightharpoons", "leftrightsquigarrow", "leftskipadaption", "leftsquigarrow", "leftsubguillemot", "leftthreetimes", "lefttopbox", "lefttoright", "lefttorighthbox", "lefttorightvbox", "lefttorightvtop", "leftwavearrow", "leftwhitearrow", "leq", "leqq", "leqslant", "lessapprox", "lessdot", "lesseqgtr", "lesseqqgtr", "lessgtr", "lesssim", "letbeundefined", "letcatcodecommand", "letcscsname", "letcsnamecs", "letcsnamecsname", "letdummyparameter", "letempty", "letgvalue", "letgvalueempty", "letgvalurelax", "letterampersand", "letterat", "letterbackslash", "letterbar", "letterbgroup", "letterclosebrace", "lettercolon", "letterdollar", "letterdoublequote", "letteregroup", "letterescape", "letterexclamationmark", "letterhash", "letterhat", "letterleftbrace", "letterleftbracket", "letterleftparenthesis", "letterless", "lettermore", "letteropenbrace", "letterpercent", "letterquestionmark", "letterrightbrace", "letterrightbracket", "letterrightparenthesis", "lettersinglequote", "letterslash", "letterspacing", "lettertilde", "letterunderscore", "letvalue", "letvalueempty", "letvaluerelax", "lfence", "lfloor", "lgroup", "lhbox", "lhooknwarrow", "lhooksearrow", "limitatefirstline", "limitatelines", "limitatetext", "line", "linefeed", "linenote", "linespanningtext", "linethickness", "linterval", "listcitation", "listcite", "listlength", "listnamespaces", "ljligature", "ll", "llangle", "llap", "llbracket", "llcorner", "lll", "llless", "lmoustache", "lnapprox", "lneq", "lneqq", "lnot", "lnsim", "loadanyfile", "loadanyfileonce", "loadbtxdefinitionfile", "loadbtxreplacementfile", "loadcldfile", "loadcldfileonce", "loadfontgoodies", "loadluafile", "loadluafileonce", "loadspellchecklist", "loadtexfile", "loadtexfileonce", "loadtypescriptfile", "localframed", "localframedwithsettings", "localhsize", "localpopbox", "localpopmacro", "localpushbox", "localpushmacro", "localundefine", "locatedfilepath", "locatefilepath", "locfilename", "logo", "lohi", "lointerval", "lomihi", "longleftarrow", "longleftrightarrow", "longmapsfrom", "longmapsto", "longrightarrow", "longrightsquigarrow", "looparrowleft", "looparrowright", "lor", "low", "lowerbox", "lowercased", "lowercasestring", "lowerleftdoubleninequote", "lowerleftsingleninequote", "lowerrightdoubleninequote", "lowerrightsingleninequote", "lozenge", "lparent", "lrcorner", "lrointerval", "lrtbbox", "lstroke", "lt", "ltimes", "ltop", "luaTeX", "luacode", "luaconditional", "luaenvironment", "luaexpanded", "luaexpr", "luafunction", "luajitTeX", "luamajorversion", "luaminorversion", "luaparameterset", "luasetup", "luaversion", "lvert", "m", "mLeftarrow", "mLeftrightarrow", "mRightarrow", "mainlanguage", "makecharacteractive", "makerawcommalist", "makestrutofbox", "maltese", "mapfontsize", "mapsdown", "mapsfrom", "mapsto", "mapsup", "margindata", "margintext", "markcontent", "marking", "markinjector", "markpage", "mat", "math", "mathampersand", "mathbf", "mathbi", "mathblackboard", "mathbs", "mathdefault", "mathdollar", "mathdouble", "mathematics", "mathfraktur", "mathfunction", "mathhash", "mathhyphen", "mathit", "mathitalic", "mathlabellanguage", "mathlabeltext", "mathlabeltexts", "mathop", "mathover", "mathpercent", "mathrm", "mathscript", "mathsl", "mathss", "mathtext", "mathtextbf", "mathtextbi", "mathtextbs", "mathtextit", "mathtextsl", "mathtexttf", "mathtf", "mathtriplet", "mathtt", "mathunder", "mathupright", "mathword", "mathwordbf", "mathwordbi", "mathwordbs", "mathwordit", "mathwordsl", "mathwordtf", "maxaligned", "mbox", "mcframed", "measure", "measured", "measuredangle", "measuredeq", "medskip", "medspace", "menubutton", "mequal", "message", "metaTeX", "mfence", "mframed", "mfunction", "mfunctionlabeltext", "mhbox", "mho", "mhookleftarrow", "mhookrightarrow", "mid", "midaligned", "middle", "middlealigned", "middlebox", "midhbox", "midsubsentence", "minimalhbox", "minus", "minuscolon", "mirror", "mixedcaps", "mkvibuffer", "mleftarrow", "mleftharpoondown", "mleftharpoonup", "mleftrightarrow", "mleftrightharpoons", "mmapsto", "models", "moduleparameter", "molecule", "mono", "monobold", "mononormal", "month", "monthlong", "monthshort", "mp", "mprandomnumber", "mrel", "mrightarrow", "mrightharpoondown", "mrightharpoonup", "mrightleftharpoons", "mrightoverleftarrow", "mtext", "mtriplerel", "mtwoheadleftarrow", "mtwoheadrightarrow", "mu", "multimap", "nHdownarrow", "nHuparrow", "nLeftarrow", "nLeftrightarrow", "nRightarrow", "nVDash", "nVdash", "nVleftarrow", "nVleftrightarrow", "nVrightarrow", "nabla", "nacute", "namedheadnumber", "namedstructureheadlocation", "namedstructureuservariable", "namedstructurevariable", "namedtaggedlabeltexts", "napostrophe", "napprox", "napproxEq", "narrownobreakspace", "nasymp", "natural", "naturalhbox", "naturalhpack", "naturalnumbers", "naturalvbox", "naturalvcenter", "naturalvpack", "naturalvtop", "naturalwd", "ncaron", "ncommaaccent", "ncong", "ncurl", "ndivides", "ne", "nearrow", "neg", "negatecolorbox", "negated", "negativesign", "negthinspace", "neng", "neq", "nequiv", "neswarrow", "newattribute", "newcatcodetable", "newcounter", "newevery", "newfrenchspacing", "newmode", "newsignal", "newsystemmode", "nexists", "nextbox", "nextboxdp", "nextboxht", "nextboxhtdp", "nextboxwd", "nextcounter", "nextcountervalue", "nextdepth", "nextparagraphs", "nextrealpage", "nextrealpagenumber", "nextsubcountervalue", "nextsubpage", "nextsubpagenumber", "nextuserpage", "nextuserpagenumber", "ngeq", "ngrave", "ngtr", "ngtrless", "ngtrsim", "ni", "nihongo", "nin", "njligature", "nleftarrow", "nleftrightarrow", "nleq", "nless", "nlessgtr", "nlesssim", "nmid", "nni", "nobar", "nobreakspace", "nocap", "nocitation", "nocite", "nodetostring", "noffigurepages", "noflines", "noflocalfloats", "noheaderandfooterlines", "noheightstrut", "noindentation", "noitem", "nonfrenchspacing", "nonmathematics", "normal", "normalboldface", "normalframedwithsettings", "normalitalicface", "normalizebodyfontsize", "normalizedfontsize", "normalizefontdepth", "normalizefontheight", "normalizefontline", "normalizefontwidth", "normalizetextdepth", "normalizetextheight", "normalizetextline", "normalizetextwidth", "normalslantedface", "normaltypeface", "nospace", "not", "note", "notesymbol", "notin", "notopandbottomlines", "notragged", "nowns", "nparallel", "nprec", "npreccurlyeq", "nrightarrow", "nsim", "nsimeq", "nsqsubseteq", "nsqsupseteq", "nsubset", "nsubseteq", "nsucc", "nsucccurlyeq", "nsupset", "nsupseteq", "ntilde", "ntimes", "ntriangleleft", "ntrianglelefteq", "ntriangleright", "ntrianglerighteq", "nu", "numberofpoints", "numbers", "nvDash", "nvdash", "nvleftarrow", "nvleftrightarrow", "nvrightarrow", "nwarrow", "nwsearrow", "oacute", "obeydepth", "objectdepth", "objectheight", "objectmargin", "objectwidth", "obox", "obreve", "ocaron", "ocircumflex", "ocircumflexacute", "ocircumflexdotbelow", "ocircumflexgrave", "ocircumflexhook", "ocircumflextilde", "odiaeresis", "odiaeresismacron", "odot", "odotaccent", "odotaccentmacron", "odotbelow", "odoublegrave", "oeligature", "offset", "offsetbox", "ograve", "ohm", "ohook", "ohorn", "ohornacute", "ohorndotbelow", "ohorngrave", "ohornhook", "ohorntilde", "ohungarumlaut", "oiiint", "oiint", "oint", "ointclockwise", "ointctrclockwise", "oinvertedbreve", "omacron", "omega", "omicron", "ominus", "onedigitrounding", "oneeighth", "onefifth", "onehalf", "onequarter", "onesixth", "onesuperior", "onethird", "oogonek", "oogonekmacron", "operatorlanguage", "operatortext", "oplus", "ordfeminine", "ordinaldaynumber", "ordinalstr", "ordmasculine", "ornamenttext", "oslash", "ostroke", "ostrokeacute", "otilde", "otildemacron", "otimes", "outputfilename", "outputstreambox", "outputstreamcopy", "outputstreamunvbox", "outputstreamunvcopy", "over", "overbar", "overbars", "overbarunderbar", "overbrace", "overbraceunderbrace", "overbracket", "overbracketunderbracket", "overlaybutton", "overlaycolor", "overlaydepth", "overlayfigure", "overlayheight", "overlaylinecolor", "overlaylinewidth", "overlayoffset", "overlayrollbutton", "overlaywidth", "overleftarrow", "overloaderror", "overparent", "overparentunderparent", "overrightarrow", "overset", "overstrike", "overstrikes", "owns", "page", "pagearea", "pagebreak", "pagefigure", "pagegridspanwidth", "pageinjection", "pagenumber", "pagereference", "pagestaterealpage", "paletsize", "paragraphmark", "parallel", "part", "partial", "pdfTeX", "pdfactualtext", "pdfbackendactualtext", "pdfbackendcurrentresources", "pdfbackendsetcatalog", "pdfbackendsetcolorspace", "pdfbackendsetextgstate", "pdfbackendsetinfo", "pdfbackendsetname", "pdfbackendsetpageattribute", "pdfbackendsetpageresource", "pdfbackendsetpagesattribute", "pdfbackendsetpattern", "pdfbackendsetshade", "pdfcolor", "pdfeTeX", "percent", "percentdimen", "periodcentered", "periods", "permitcaretescape", "permitcircumflexescape", "permitspacesbetweengroups", "perp", "persiandecimals", "persiandecimalseparator", "persiannumerals", "persianthousandsseparator", "perthousand", "phantom", "phantombox", "phi", "phook", "pi", "pickupgroupedcommand", "pitchfork", "placeattachments", "placebookmarks", "placebtxrendering", "placechemical", "placecitation", "placecombinedlist", "placecomments", "placecontent", "placecurrentformulanumber", "placedbox", "placefigure", "placefloat", "placefloatwithsetups", "placefootnotes", "placeformula", "placeframed", "placegraphic", "placeheadnumber", "placeheadtext", "placehelp", "placeindex", "placeinitial", "placeintermezzo", "placelayer", "placelayeredtext", "placelegend", "placelist", "placelistofabbreviations", "placelistofchemicals", "placelistoffigures", "placelistofgraphics", "placelistofintermezzi", "placelistoflogos", "placelistofpublications", "placelistofsorts", "placelistofsynonyms", "placelistoftables", "placelocalfootnotes", "placelocalnotes", "placement", "placenamedfloat", "placenamedformula", "placenotes", "placeongrid", "placeontopofeachother", "placepagenumber", "placepairedbox", "placeparallel", "placerawlist", "placeregister", "placerenderingwindow", "placesidebyside", "placesubformula", "placetable", "pm", "popattribute", "popmacro", "popmode", "popsystemmode", "position", "positionoverlay", "positionregionoverlay", "positivesign", "postponenotes", "prec", "precapprox", "preccurlyeq", "preceq", "preceqq", "precnapprox", "precneq", "precneqq", "precnsim", "precsim", "predefinedfont", "predefinefont", "predefinesymbol", "prefixedpagenumber", "prefixlanguage", "prefixtext", "prependetoks", "prependgvalue", "prependtocommalist", "prependtoks", "prependtoksonce", "prependvalue", "presetbtxlabeltext", "presetdocument", "presetfieldsymbols", "presetheadtext", "presetlabeltext", "presetmathlabeltext", "presetoperatortext", "presetprefixtext", "presetsuffixtext", "presettaglabeltext", "presetunittext", "pretocommalist", "prettyprintbuffer", "prevcounter", "prevcountervalue", "preventmode", "prevrealpage", "prevrealpagenumber", "prevsubcountervalue", "prevsubpage", "prevsubpagenumber", "prevuserpage", "prevuserpagenumber", "prime", "primes", "procent", "processMPbuffer", "processMPfigurefile", "processaction", "processallactionsinset", "processassignlist", "processassignmentcommand", "processassignmentlist", "processbetween", "processblocks", "processbodyfontenvironmentlist", "processcolorcomponents", "processcommacommand", "processcommalist", "processcommalistwithparameters", "processcontent", "processfile", "processfilemany", "processfilenone", "processfileonce", "processfirstactioninset", "processisolatedchars", "processisolatedwords", "processlinetablebuffer", "processlinetablefile", "processlist", "processmonth", "processranges", "processseparatedlist", "processtexbuffer", "processtokens", "processuntil", "processxtablebuffer", "processyear", "prod", "product", "profiledbox", "profilegivenbox", "program", "project", "propto", "pseudoMixedCapped", "pseudoSmallCapped", "pseudoSmallcapped", "pseudosmallcapped", "psi", "punctuationspace", "purenumber", "pushattribute", "pushbutton", "pushmacro", "pushmode", "pushoutputstream", "pushsystemmode", "putboxincache", "putnextboxincache", "qquad", "quad", "quadrupleprime", "quads", "quarterstrut", "questiondown", "questionedeq", "quitcommalist", "quitprevcommalist", "quittypescriptscanning", "quotation", "quote", "quotedbl", "quotedblbase", "quotedblleft", "quotedblright", "quoteleft", "quoteright", "quotesingle", "quotesinglebase", "rVert", "racute", "raggedbottom", "raggedcenter", "raggedleft", "raggedright", "raggedwidecenter", "raisebox", "randomizetext", "randomnumber", "rangle", "rationals", "rawcounter", "rawcountervalue", "rawdate", "rawdoifelseinset", "rawdoifinset", "rawdoifinsetelse", "rawgetparameters", "rawprocessaction", "rawprocesscommacommand", "rawprocesscommalist", "rawstructurelistuservariable", "rawsubcountervalue", "rbox", "rbrace", "rbracket", "rcaron", "rceil", "rcommaaccent", "rdoublegrave", "readfile", "readfixfile", "readjobfile", "readlocfile", "readsetfile", "readsysfile", "readtexfile", "readxmlfile", "realSmallCapped", "realSmallcapped", "realpagenumber", "reals", "realsmallcapped", "recursedepth", "recurselevel", "recursestring", "redoconvertfont", "ref", "reference", "referenceprefix", "referring", "registerattachment", "registerctxluafile", "registered", "registerexternalfigure", "registerfontclass", "registerhyphenationexception", "registerhyphenationpattern", "registermenubuttons", "registersort", "registersynonym", "registerunit", "regular", "relatemarking", "relateparameterhandlers", "relaxvalueifundefined", "relbar", "remainingcharacters", "remark", "removebottomthings", "removedepth", "removefromcommalist", "removelastskip", "removelastspace", "removemarkedcontent", "removepunctuation", "removesubstring", "removetoks", "removeunwantedspaces", "replacefeature", "replaceincommalist", "replaceword", "rescan", "rescanwithsetup", "resetMPdrawing", "resetMPenvironment", "resetMPinstance", "resetallattributes", "resetandaddfeature", "resetbar", "resetboxesincache", "resetbreakpoints", "resetbuffer", "resetcharacteralign", "resetcharacterkerning", "resetcharacterspacing", "resetcharacterstripping", "resetcollector", "resetcounter", "resetdigitsmanipulation", "resetdirection", "resetfeature", "resetflag", "resetfontcolorsheme", "resetfontfallback", "resetfontsolution", "resethyphenationfeatures", "resetinjector", "resetinteractionmenu", "resetitaliccorrection", "resetlayer", "resetlocalfloats", "resetmarker", "resetmarking", "resetmode", "resetpagenumber", "resetparallel", "resetpath", "resetpenalties", "resetprofile", "resetrecurselevel", "resetreference", "resetreplacement", "resetscript", "resetsetups", "resetshownsynonyms", "resetsubpagenumber", "resetsymbolset", "resetsystemmode", "resettimer", "resettrackers", "resettrialtypesetting", "resetusedsortings", "resetusedsynonyms", "resetuserpagenumber", "resetvalue", "resetvisualizers", "reshapebox", "resolvedglyphdirect", "resolvedglyphstyled", "restartcounter", "restorebox", "restorecatcodes", "restorecounter", "restorecurrentattributes", "restoreendofline", "restoreglobalbodyfont", "restriction", "reusableMPgraphic", "reuseMPgraphic", "reuserandomseed", "reverseddoubleprime", "reversedprime", "reversedtripleprime", "revivefeature", "rfence", "rfloor", "rgroup", "rhbox", "rho", "rhooknearrow", "rhookswarrow", "right", "rightaligned", "rightangle", "rightarrow", "rightarrowbar", "rightarrowtail", "rightarrowtriangle", "rightbottombox", "rightbox", "rightdasharrow", "rightguillemot", "rightharpoondown", "rightharpoonup", "righthbox", "rightheadtext", "rightlabeltext", "rightleftarrows", "rightleftharpoons", "rightline", "rightmathlabeltext", "rightorleftpageaction", "rightrightarrows", "rightskipadaption", "rightsquigarrow", "rightsubguillemot", "rightthreearrows", "rightthreetimes", "righttoleft", "righttolefthbox", "righttoleftvbox", "righttoleftvtop", "righttopbox", "rightwavearrow", "rightwhitearrow", "ring", "rinterval", "rinvertedbreve", "risingdotseq", "rlap", "rlointerval", "rmoustache", "rneq", "robustaddtocommalist", "robustdoifelseinset", "robustdoifinsetelse", "robustpretocommalist", "rointerval", "rollbutton", "roman", "romanC", "romanD", "romanI", "romanII", "romanIII", "romanIV", "romanIX", "romanL", "romanM", "romanV", "romanVI", "romanVII", "romanVIII", "romanX", "romanXI", "romanXII", "romanc", "romand", "romani", "romanii", "romaniii", "romaniv", "romanix", "romanl", "romanm", "romannumerals", "romanv", "romanvi", "romanvii", "romanviii", "romanx", "romanxi", "romanxii", "rootradical", "rotate", "rparent", "rrangle", "rrbracket", "rrointerval", "rtimes", "rtop", "ruledhbox", "ruledhpack", "ruledmbox", "ruledtopv", "ruledtpack", "ruledvbox", "ruledvpack", "ruledvtop", "runMPbuffer", "runninghbox", "rvert", "sacute", "safechar", "samplefile", "sans", "sansbold", "sansnormal", "sansserif", "savebox", "savebtxdataset", "savebuffer", "savecounter", "savecurrentattributes", "savenormalmeaning", "savetaggedtwopassdata", "savetwopassdata", "sbox", "scale", "scaron", "scedilla", "schwa", "schwahook", "scircumflex", "scommaaccent", "screen", "searrow", "secondoffivearguments", "secondoffourarguments", "secondofsixarguments", "secondofthreearguments", "secondofthreeunexpanded", "secondoftwoarguments", "secondoftwounexpanded", "section", "sectionmark", "seeindex", "select", "selectblocks", "serializecommalist", "serializedcommalist", "serif", "serifbold", "serifnormal", "setJSpreamble", "setMPlayer", "setMPpositiongraphic", "setMPpositiongraphicrange", "setMPtext", "setMPvariable", "setMPvariables", "setbar", "setbigbodyfont", "setboxllx", "setboxlly", "setbreakpoints", "setcapstrut", "setcatcodetable", "setcharacteralign", "setcharactercasing", "setcharactercleaning", "setcharacterkerning", "setcharacterspacing", "setcharacterstripping", "setcharstrut", "setcollector", "setcolormodell", "setcounter", "setcounterown", "setcurrentfontclass", "setdataset", "setdefaultpenalties", "setdigitsmanipulation", "setdirection", "setdocumentargument", "setdocumentargumentdefault", "setdocumentfilename", "setdummyparameter", "setelementexporttag", "setemeasure", "setevalue", "setevariable", "setevariables", "setfirstline", "setflag", "setfont", "setfontcolorsheme", "setfontfeature", "setfontsolution", "setfontstrut", "setgmeasure", "setgvalue", "setgvariable", "setgvariables", "sethboxregister", "sethyphenatedurlafter", "sethyphenatedurlbefore", "sethyphenatedurlnormal", "sethyphenationfeatures", "setinitial", "setinjector", "setinteraction", "setinterfacecommand", "setinterfaceconstant", "setinterfaceelement", "setinterfacemessage", "setinterfacevariable", "setinternalrendering", "setitaliccorrection", "setlayer", "setlayerframed", "setlayertext", "setlinefiller", "setlocalhsize", "setmainbodyfont", "setmainparbuilder", "setmarker", "setmarking", "setmathstyle", "setmeasure", "setmessagetext", "setminus", "setmode", "setnostrut", "setnote", "setnotetext", "setobject", "setoldstyle", "setpagegrid", "setpagereference", "setpagestate", "setpagestaterealpageno", "setpenalties", "setpercentdimen", "setposition", "setpositionbox", "setpositiondata", "setpositiondataplus", "setpositiononly", "setpositionplus", "setpositionstrut", "setprofile", "setrandomseed", "setreference", "setreferencedobject", "setregisterentry", "setreplacement", "setrigidcolumnbalance", "setrigidcolumnhsize", "setscript", "setsectionblock", "setsimplecolumnhsize", "setsmallbodyfont", "setsmallcaps", "setstackbox", "setstructurepageregister", "setstrut", "setsuperiors", "setsystemmode", "settabular", "settaggedmetadata", "settextcontent", "settightobject", "settightreferencedobject", "settightunreferencedobject", "settrialtypesetting", "setuevalue", "setugvalue", "setunreferencedobject", "setup", "setupMPgraphics", "setupMPinstance", "setupMPpage", "setupMPvariables", "setupTABLE", "setupTEXpage", "setupalign", "setupalternativestyles", "setuparranging", "setupattachment", "setupattachments", "setupbackend", "setupbackground", "setupbackgrounds", "setupbar", "setupbars", "setupblackrules", "setupblank", "setupbleeding", "setupblock", "setupbodyfont", "setupbookmark", "setupbottom", "setupbottomtexts", "setupbtx", "setupbtxdataset", "setupbtxlabeltext", "setupbtxlist", "setupbtxregister", "setupbtxrendering", "setupbuffer", "setupbutton", "setupcapitals", "setupcaption", "setupcaptions", "setupcharacterkerning", "setupcharacterspacing", "setupchemical", "setupchemicalframed", "setupclipping", "setupcollector", "setupcolor", "setupcolors", "setupcolumns", "setupcolumnspan", "setupcombination", "setupcombinedlist", "setupcomment", "setupcontent", "setupcounter", "setupdataset", "setupdelimitedtext", "setupdescription", "setupdirections", "setupdocument", "setupeffect", "setupenumeration", "setupenumerations", "setupenv", "setupexport", "setupexternalfigure", "setupexternalsoundtracks", "setupfield", "setupfieldbody", "setupfieldcategory", "setupfieldcontentframed", "setupfieldlabelframed", "setupfields", "setupfieldtotalframed", "setupfiller", "setupfillinlines", "setupfillinrules", "setupfirstline", "setupfittingpage", "setupfloat", "setupfloatcaption", "setupfloats", "setupfloatsplitting", "setupfontexpansion", "setupfontprotrusion", "setupfonts", "setupfontsolution", "setupfooter", "setupfootertexts", "setupforms", "setupformula", "setupformulae", "setupformulaframed", "setupframed", "setupframedcontent", "setupframedtable", "setupframedtablecolumn", "setupframedtablerow", "setupframedtext", "setupframedtexts", "setupglobalreferenceprefix", "setuphead", "setupheadalternative", "setupheader", "setupheadertexts", "setupheadnumber", "setupheads", "setupheadtext", "setuphelp", "setuphigh", "setuphighlight", "setuphyphenation", "setuphyphenmark", "setupindentedtext", "setupindenting", "setupindex", "setupinitial", "setupinsertion", "setupinteraction", "setupinteractionbar", "setupinteractionmenu", "setupinteractionscreen", "setupinterlinespace", "setupitaliccorrection", "setupitemgroup", "setupitemizations", "setupitemize", "setupitems", "setuplabel", "setuplabeltext", "setuplanguage", "setuplayer", "setuplayeredtext", "setuplayout", "setuplayouttext", "setuplegend", "setuplinefiller", "setuplinefillers", "setuplinenote", "setuplinenumbering", "setuplines", "setuplinetable", "setuplinewidth", "setuplist", "setuplistalternative", "setuplistextra", "setuplocalfloats", "setuplocalinterlinespace", "setuplow", "setuplowhigh", "setuplowmidhigh", "setupmakeup", "setupmarginblock", "setupmargindata", "setupmarginframed", "setupmarginrule", "setupmarginrules", "setupmarking", "setupmathalignment", "setupmathcases", "setupmathematics", "setupmathfence", "setupmathfraction", "setupmathfractions", "setupmathframed", "setupmathlabeltext", "setupmathmatrix", "setupmathornament", "setupmathradical", "setupmathstackers", "setupmathstyle", "setupmixedcolumns", "setupmodule", "setupnarrower", "setupnotation", "setupnotations", "setupnote", "setupnotes", "setupoffset", "setupoffsetbox", "setupoperatortext", "setupoppositeplacing", "setupoutputroutine", "setuppagechecker", "setuppagecomment", "setuppagegrid", "setuppagegridarea", "setuppagegridareatext", "setuppagegridlines", "setuppagegridspan", "setuppagegridstart", "setuppageinjection", "setuppageinjectionalternative", "setuppagenumber", "setuppagenumbering", "setuppageshift", "setuppagestate", "setuppagetransitions", "setuppairedbox", "setuppalet", "setuppaper", "setuppapersize", "setupparagraph", "setupparagraphintro", "setupparagraphnumbering", "setupparagraphs", "setupparallel", "setupperiods", "setupplacement", "setuppositionbar", "setuppositioning", "setupprefixtext", "setupprocessor", "setupprofile", "setupprograms", "setupquotation", "setupquote", "setuprealpagenumber", "setupreferenceformat", "setupreferenceprefix", "setupreferencestructureprefix", "setupreferencing", "setupregister", "setupregisters", "setuprenderingwindow", "setuprotate", "setups", "setupscale", "setupscript", "setupscripts", "setupsectionblock", "setupselector", "setupshift", "setupsidebar", "setupsorting", "setupspacing", "setupspellchecking", "setupstartstop", "setupstretched", "setupstruts", "setupstyle", "setupsubformula", "setupsubformulas", "setupsubpagenumber", "setupsuffixtext", "setupsymbolset", "setupsynctex", "setupsynonyms", "setuptables", "setuptabulate", "setuptabulation", "setuptagging", "setuptaglabeltext", "setuptext", "setuptextbackground", "setuptextflow", "setuptextrules", "setuptexttexts", "setupthinrules", "setuptolerance", "setuptooltip", "setuptop", "setuptoptexts", "setuptype", "setuptyping", "setupunit", "setupunittext", "setupurl", "setupuserpagenumber", "setupversion", "setupviewerlayer", "setupvspacing", "setupwhitespace", "setupwithargument", "setupwithargumentswapped", "setupxml", "setupxtable", "setuvalue", "setuxvalue", "setvalue", "setvariable", "setvariables", "setvboxregister", "setvisualizerfont", "setvtopregister", "setwidthof", "setxmeasure", "setxvalue", "setxvariable", "setxvariables", "seveneighths", "sfrac", "shapedhbox", "sharp", "shiftdown", "shiftup", "showallmakeup", "showattributes", "showbodyfont", "showbodyfontenvironment", "showboxes", "showbtxdatasetauthors", "showbtxdatasetcompleteness", "showbtxdatasetfields", "showbtxfields", "showbtxhashedauthors", "showbtxtables", "showchardata", "showcharratio", "showcolor", "showcolorbar", "showcolorcomponents", "showcolorgroup", "showcolorset", "showcolorstruts", "showcounter", "showdirectives", "showdirsinmargin", "showedebuginfo", "showexperiments", "showfont", "showfontdata", "showfontitalics", "showfontkerns", "showfontparameters", "showfontstrip", "showfontstyle", "showframe", "showglyphs", "showgrid", "showgridsnapping", "showhelp", "showhyphenationtrace", "showhyphens", "showinjector", "showjustification", "showkerning", "showlayout", "showlayoutcomponents", "showligature", "showligatures", "showlogcategories", "showmakeup", "showmargins", "showmessage", "showminimalbaseline", "shownextbox", "showotfcomposition", "showpalet", "showparentchain", "showprint", "showsetups", "showsetupsdefinition", "showstruts", "showsymbolset", "showtimer", "showtokens", "showtrackers", "showvalue", "showvariable", "showwarning", "sigma", "sim", "simeq", "simplealignedbox", "simplealignedboxplus", "simplealignedspreadbox", "simplegroupedcommand", "simplereversealignedbox", "simplereversealignedboxplus", "singalcharacteralign", "singlebond", "singleverticalbar", "sixperemspace", "sixthofsixarguments", "slanted", "slantedbold", "slantedface", "slash", "slicepages", "slong", "slovenianNumerals", "sloveniannumerals", "small", "smallbodyfont", "smallbold", "smallbolditalic", "smallboldslanted", "smallcappedcharacters", "smallcappedromannumerals", "smaller", "smallitalicbold", "smallnormal", "smallskip", "smallslanted", "smallslantedbold", "smalltype", "smash", "smashbox", "smashboxed", "smashedhbox", "smashedvbox", "smile", "snaptogrid", "softhyphen", "solidus", "someheadnumber", "somekindoftab", "someline", "somelocalfloat", "somenamedheadnumber", "someplace", "somewhere", "space", "spadesuit", "spanishNumerals", "spanishnumerals", "speech", "sphericalangle", "splitatasterisk", "splitatcolon", "splitatcolons", "splitatcomma", "splitatperiod", "splitdfrac", "splitfilename", "splitfloat", "splitfrac", "splitoffbase", "splitofffull", "splitoffkind", "splitoffname", "splitoffpath", "splitoffroot", "splitofftokens", "splitofftype", "splitstring", "spreadhbox", "sqcap", "sqcup", "sqrt", "sqsubset", "sqsubseteq", "sqsubsetneq", "sqsupset", "sqsupseteq", "sqsupsetneq", "square", "squaredots", "ssharp", "stackrel", "star", "stareq", "startJScode", "startJSpreamble", "startLUA", "startMP", "startMPclip", "startMPcode", "startMPdefinitions", "startMPdrawing", "startMPenvironment", "startMPextensions", "startMPinclusions", "startMPinitializations", "startMPpage", "startMPpositiongraphic", "startMPpositionmethod", "startMPrun", "startPARSEDXML", "startTABLE", "startTABLEbody", "startTABLEfoot", "startTABLEhead", "startTABLEnext", "startTC", "startTD", "startTDs", "startTEX", "startTEXpage", "startTH", "startTN", "startTR", "startTRs", "startTX", "startTY", "startXML", "startalign", "startalignment", "startallmodes", "startappendices", "startarrangedpages", "startaside", "startattachment", "startbackground", "startbackmatter", "startbar", "startbbordermatrix", "startbitmapimage", "startblockquote", "startbodymatter", "startbordermatrix", "startboxedcolumns", "startbtxlabeltext", "startbtxrenderingdefinitions", "startbuffer", "startcases", "startcatcodetable", "startcenteraligned", "startchapter", "startcharacteralign", "startcheckedfences", "startchemical", "startchemicaltext", "startcollect", "startcollecting", "startcolor", "startcolorintent", "startcoloronly", "startcolorset", "startcolumns", "startcolumnspan", "startcombination", "startcomment", "startcomponent", "startcontextcode", "startcontextdefinitioncode", "startctxfunction", "startctxfunctiondefinition", "startcurrentcolor", "startcurrentlistentrywrapper", "startdelimited", "startdelimitedtext", "startdisplaymath", "startdmath", "startdocument", "starteffect", "startelement", "startembeddedxtable", "startendnote", "startendofline", "startenvironment", "startexceptions", "startexpanded", "startexpandedcollect", "startextendedcatcodetable", "startexternalfigurecollection", "startfact", "startfigure", "startfiguretext", "startfittingpage", "startfixed", "startfloatcombination", "startfont", "startfontclass", "startfontsolution", "startfootnote", "startformula", "startformulas", "startframed", "startframedcell", "startframedcontent", "startframedrow", "startframedtable", "startframedtext", "startfrontmatter", "startgoto", "startgraphictext", "startgridsnapping", "starthanging", "starthbox", "starthboxestohbox", "starthboxregister", "starthead", "startheadtext", "starthelptext", "starthiding", "starthighlight", "starthyphenation", "startimath", "startindentation", "startindentedtext", "startinteraction", "startinteractionmenu", "startinterface", "startintermezzotext", "startintertext", "startitem", "startitemgroup", "startitemgroupcolumns", "startitemize", "startknockout", "startlabeltext", "startlayout", "startleftaligned", "startlegend", "startline", "startlinealignment", "startlinecorrection", "startlinefiller", "startlinenote", "startlinenumbering", "startlines", "startlinetable", "startlinetablebody", "startlinetablecell", "startlinetablehead", "startlocalfootnotes", "startlocalheadsetup", "startlocallinecorrection", "startlocalnotes", "startlocalsetups", "startlua", "startluacode", "startluaparameterset", "startluasetups", "startmakeup", "startmarginblock", "startmarginrule", "startmarkedcontent", "startmathalignment", "startmathcases", "startmathlabeltext", "startmathmatrix", "startmathmode", "startmathstyle", "startmatrices", "startmatrix", "startmaxaligned", "startmdformula", "startmidaligned", "startmiddlealigned", "startmiddlemakeup", "startmixedcolumns", "startmode", "startmodeset", "startmodule", "startmoduletestsection", "startmpformula", "startnamedsection", "startnamedsubformulas", "startnarrow", "startnarrower", "startnegative", "startnicelyfilledbox", "startnointerference", "startnotallmodes", "startnotext", "startnotmode", "startoperatortext", "startopposite", "startoutputstream", "startoverlay", "startoverprint", "startpacked", "startpagecomment", "startpagefigure", "startpagegrid", "startpagegridspan", "startpagelayout", "startpagemakeup", "startpar", "startparagraph", "startparagraphs", "startparagraphscell", "startparbuilder", "startpart", "startpath", "startplacechemical", "startplacefigure", "startplacefloat", "startplaceformula", "startplacegraphic", "startplaceintermezzo", "startplacelegend", "startplacepairedbox", "startplacetable", "startpositioning", "startpositionoverlay", "startpositive", "startpostponing", "startprefixtext", "startprocessassignmentcommand", "startprocessassignmentlist", "startprocesscommacommand", "startprocesscommalist", "startproduct", "startproject", "startprotect", "startprotectedcolors", "startpublication", "startpunctuation", "startquotation", "startquote", "startrandomized", "startrandomseed", "startrawsetups", "startreadingfile", "startreferenceprefix", "startregime", "startregister", "startreusableMPgraphic", "startrightaligned", "startscript", "startsdformula", "startsection", "startsectionblock", "startsectionblockenvironment", "startsectionlevel", "startsetups", "startshapebox", "startshift", "startsidebar", "startsimplecolumns", "startspecialitem", "startspeech", "startspformula", "startsplitformula", "startspread", "startstandardmakeup", "startstartstop", "startstaticMPfigure", "startstaticMPgraphic", "startstrictinspectnextcharacter", "startstructurepageregister", "startstrut", "startstyle", "startsubformulas", "startsubject", "startsubjectlevel", "startsubsection", "startsubsentence", "startsubstack", "startsubsubject", "startsubsubsection", "startsubsubsubject", "startsubsubsubsection", "startsubsubsubsubject", "startsubsubsubsubsection", "startsubsubsubsubsubject", "startsuffixtext", "startsymbolset", "starttable", "starttablehead", "starttables", "starttabletail", "starttabletext", "starttabulate", "starttabulatehead", "starttabulatetail", "starttagged", "starttaglabeltext", "starttexcode", "starttexdefinition", "starttext", "starttextbackground", "starttextbackgroundmanual", "starttextcolor", "starttextcolorintent", "starttextflow", "starttextmakeup", "starttextrule", "starttitle", "starttokens", "starttransparent", "starttypescript", "starttypescriptcollection", "starttyping", "startuniqueMPgraphic", "startuniqueMPpagegraphic", "startunittext", "startunpacked", "startusableMPgraphic", "startuseMPgraphic", "startusemathstyleparameter", "startusingbtxspecification", "startvbox", "startvboxregister", "startvboxtohbox", "startvboxtohboxseparator", "startviewerlayer", "startvtop", "startvtopregister", "startxcell", "startxcellgroup", "startxgroup", "startxmldisplayverbatim", "startxmlinlineverbatim", "startxmlraw", "startxmlsetups", "startxrow", "startxrowgroup", "startxtable", "startxtablebody", "startxtablefoot", "startxtablehead", "startxtablenext", "stligature", "stopJScode", "stopJSpreamble", "stopLUA", "stopMP", "stopMPclip", "stopMPcode", "stopMPdefinitions", "stopMPdrawing", "stopMPenvironment", "stopMPextensions", "stopMPinclusions", "stopMPinitializations", "stopMPpage", "stopMPpositiongraphic", "stopMPpositionmethod", "stopMPrun", "stopPARSEDXML", "stopTABLE", "stopTABLEbody", "stopTABLEfoot", "stopTABLEhead", "stopTABLEnext", "stopTC", "stopTD", "stopTDs", "stopTEX", "stopTEXpage", "stopTH", "stopTN", "stopTR", "stopTRs", "stopTX", "stopTY", "stopXML", "stopalign", "stopalignment", "stopallmodes", "stopappendices", "stoparrangedpages", "stopaside", "stopattachment", "stopbackground", "stopbackmatter", "stopbar", "stopbbordermatrix", "stopbitmapimage", "stopblockquote", "stopbodymatter", "stopbordermatrix", "stopboxedcolumns", "stopbtxlabeltext", "stopbtxrenderingdefinitions", "stopbuffer", "stopcases", "stopcatcodetable", "stopcenteraligned", "stopchapter", "stopcharacteralign", "stopcheckedfences", "stopchemical", "stopchemicaltext", "stopcollect", "stopcollecting", "stopcolor", "stopcolorintent", "stopcoloronly", "stopcolorset", "stopcolumns", "stopcolumnspan", "stopcombination", "stopcomment", "stopcomponent", "stopcontextcode", "stopcontextdefinitioncode", "stopctxfunction", "stopctxfunctiondefinition", "stopcurrentcolor", "stopcurrentlistentrywrapper", "stopdelimited", "stopdelimitedtext", "stopdisplaymath", "stopdmath", "stopdocument", "stopeffect", "stopelement", "stopembeddedxtable", "stopendnote", "stopendofline", "stopenvironment", "stopexceptions", "stopexpanded", "stopexpandedcollect", "stopextendedcatcodetable", "stopexternalfigurecollection", "stopfact", "stopfigure", "stopfiguretext", "stopfittingpage", "stopfixed", "stopfloatcombination", "stopfont", "stopfontclass", "stopfontsolution", "stopfootnote", "stopformula", "stopformulas", "stopframed", "stopframedcell", "stopframedcontent", "stopframedrow", "stopframedtable", "stopframedtext", "stopfrontmatter", "stopgoto", "stopgraphictext", "stopgridsnapping", "stophanging", "stophbox", "stophboxestohbox", "stophboxregister", "stophead", "stopheadtext", "stophelptext", "stophiding", "stophighlight", "stophyphenation", "stopimath", "stopindentation", "stopindentedtext", "stopinteraction", "stopinteractionmenu", "stopinterface", "stopintermezzotext", "stopintertext", "stopitem", "stopitemgroup", "stopitemgroupcolumns", "stopitemize", "stopknockout", "stoplabeltext", "stoplayout", "stopleftaligned", "stoplegend", "stopline", "stoplinealignment", "stoplinecorrection", "stoplinefiller", "stoplinenote", "stoplinenumbering", "stoplines", "stoplinetable", "stoplinetablebody", "stoplinetablecell", "stoplinetablehead", "stoplocalfootnotes", "stoplocalheadsetup", "stoplocallinecorrection", "stoplocalnotes", "stoplocalsetups", "stoplua", "stopluacode", "stopluaparameterset", "stopluasetups", "stopmakeup", "stopmarginblock", "stopmarginrule", "stopmarkedcontent", "stopmathalignment", "stopmathcases", "stopmathlabeltext", "stopmathmatrix", "stopmathmode", "stopmathstyle", "stopmatrices", "stopmatrix", "stopmaxaligned", "stopmdformula", "stopmidaligned", "stopmiddlealigned", "stopmiddlemakeup", "stopmixedcolumns", "stopmode", "stopmodeset", "stopmodule", "stopmoduletestsection", "stopmpformula", "stopnamedsection", "stopnamedsubformulas", "stopnarrow", "stopnarrower", "stopnegative", "stopnicelyfilledbox", "stopnointerference", "stopnotallmodes", "stopnotext", "stopnotmode", "stopoperatortext", "stopopposite", "stopoutputstream", "stopoverlay", "stopoverprint", "stoppacked", "stoppagecomment", "stoppagefigure", "stoppagegrid", "stoppagegridspan", "stoppagelayout", "stoppagemakeup", "stoppar", "stopparagraph", "stopparagraphs", "stopparagraphscell", "stopparbuilder", "stoppart", "stoppath", "stopplacechemical", "stopplacefigure", "stopplacefloat", "stopplaceformula", "stopplacegraphic", "stopplaceintermezzo", "stopplacelegend", "stopplacepairedbox", "stopplacetable", "stoppositioning", "stoppositionoverlay", "stoppositive", "stoppostponing", "stopprefixtext", "stopprocessassignmentcommand", "stopprocessassignmentlist", "stopprocesscommacommand", "stopprocesscommalist", "stopproduct", "stopproject", "stopprotect", "stopprotectedcolors", "stoppublication", "stoppunctuation", "stopquotation", "stopquote", "stoprandomized", "stoprandomseed", "stoprawsetups", "stopreadingfile", "stopreferenceprefix", "stopregime", "stopregister", "stopreusableMPgraphic", "stoprightaligned", "stopscript", "stopsdformula", "stopsection", "stopsectionblock", "stopsectionblockenvironment", "stopsectionlevel", "stopsetups", "stopshapebox", "stopshift", "stopsidebar", "stopsimplecolumns", "stopspecialitem", "stopspeech", "stopspformula", "stopsplitformula", "stopspread", "stopstandardmakeup", "stopstartstop", "stopstaticMPfigure", "stopstaticMPgraphic", "stopstrictinspectnextcharacter", "stopstructurepageregister", "stopstrut", "stopstyle", "stopsubformulas", "stopsubject", "stopsubjectlevel", "stopsubsection", "stopsubsentence", "stopsubstack", "stopsubsubject", "stopsubsubsection", "stopsubsubsubject", "stopsubsubsubsection", "stopsubsubsubsubject", "stopsubsubsubsubsection", "stopsubsubsubsubsubject", "stopsuffixtext", "stopsymbolset", "stoptable", "stoptablehead", "stoptables", "stoptabletail", "stoptabletext", "stoptabulate", "stoptabulatehead", "stoptabulatetail", "stoptagged", "stoptaglabeltext", "stoptexcode", "stoptexdefinition", "stoptext", "stoptextbackground", "stoptextbackgroundmanual", "stoptextcolor", "stoptextcolorintent", "stoptextflow", "stoptextmakeup", "stoptextrule", "stoptitle", "stoptokens", "stoptransparent", "stoptypescript", "stoptypescriptcollection", "stoptyping", "stopuniqueMPgraphic", "stopuniqueMPpagegraphic", "stopunittext", "stopunpacked", "stopusableMPgraphic", "stopuseMPgraphic", "stopusemathstyleparameter", "stopusingbtxspecification", "stopvbox", "stopvboxregister", "stopvboxtohbox", "stopvboxtohboxseparator", "stopviewerlayer", "stopvtop", "stopvtopregister", "stopxcell", "stopxcellgroup", "stopxgroup", "stopxmldisplayverbatim", "stopxmlinlineverbatim", "stopxmlraw", "stopxmlsetups", "stopxrow", "stopxrowgroup", "stopxtable", "stopxtablebody", "stopxtablefoot", "stopxtablehead", "stopxtablenext", "stretched", "strictdoifelsenextoptional", "strictdoifnextoptionalelse", "stripcharacter", "strippedcsname", "stripspaces", "structurelistuservariable", "structurenumber", "structuretitle", "structureuservariable", "structurevariable", "strut", "strutdp", "strutgap", "strutht", "struthtdp", "struttedbox", "strutwd", "style", "styleinstance", "subject", "subpagenumber", "subsection", "subsentence", "subset", "subseteq", "subseteqq", "subsetneq", "subsetneqq", "substituteincommalist", "subsubject", "subsubsection", "subsubsubject", "subsubsubsection", "subsubsubsubject", "subsubsubsubsection", "subsubsubsubsubject", "subtractfeature", "succ", "succapprox", "succcurlyeq", "succeq", "succeqq", "succnapprox", "succneq", "succneqq", "succnsim", "succsim", "suffixlanguage", "suffixtext", "sum", "supset", "supseteq", "supseteqq", "supsetneq", "supsetneqq", "surd", "surdradical", "swapcounts", "swapdimens", "swapface", "swapmacros", "swaptypeface", "swarrow", "switchstyleonly", "switchtobodyfont", "switchtocolor", "switchtointerlinespace", "symbol", "symbolreference", "synchronizeblank", "synchronizeindenting", "synchronizemarking", "synchronizeoutputstreams", "synchronizestrut", "synchronizewhitespace", "synctexblockfilename", "synctexresetfilename", "synctexsetfilename", "systemlog", "systemlogfirst", "systemloglast", "systemsetups", "tLeftarrow", "tLeftrightarrow", "tRightarrow", "tabulateautoline", "tabulateautorule", "tabulateline", "tabulaterule", "taggedctxcommand", "taggedlabeltexts", "taglabellanguage", "taglabeltext", "tau", "tbinom", "tbox", "tcaron", "tcedilla", "tcommaaccent", "tcurl", "tequal", "test", "testandsplitstring", "testcolumn", "testfeature", "testfeatureonce", "testpage", "testpageonly", "testpagesync", "testtokens", "tex", "texdefinition", "texsetup", "textAngstrom", "textacute", "textampersand", "textasciicircum", "textasciitilde", "textat", "textbackslash", "textbar", "textbottomcomma", "textbottomdot", "textbraceleft", "textbraceright", "textbreve", "textbrokenbar", "textbullet", "textcaron", "textcedilla", "textcelsius", "textcent", "textcircledP", "textcircumflex", "textcitation", "textcite", "textcomma", "textcontrolspace", "textcurrency", "textdag", "textddag", "textdegree", "textdiaeresis", "textdiv", "textdollar", "textdong", "textdotaccent", "textellipsis", "texteuro", "textflowcollector", "textfraction", "textgrave", "texthash", "texthorizontalbar", "texthungarumlaut", "texthyphen", "textkelvin", "textlognot", "textmacron", "textmath", "textmho", "textminus", "textmu", "textmultiply", "textnumero", "textogonek", "textohm", "textormathchar", "textounce", "textpercent", "textperiod", "textplus", "textpm", "textreference", "textring", "textrule", "textslash", "textsterling", "texttilde", "textunderscore", "textvisiblespace", "textyen", "thai", "thainumerals", "thefirstcharacter", "thenormalizedbodyfontsize", "therefore", "theremainingcharacters", "theta", "thickspace", "thinrule", "thinrules", "thinspace", "thirdoffivearguments", "thirdoffourarguments", "thirdofsixarguments", "thirdofthreearguments", "thirdofthreeunexpanded", "thook", "thookleftarrow", "thookrightarrow", "thorn", "threedigitrounding", "threeeighths", "threefifths", "threeperemspace", "threequarter", "threesuperior", "tibetannumerals", "tightlayer", "tilde", "times", "tinyfont", "title", "tlap", "tleftarrow", "tleftharpoondown", "tleftharpoonup", "tleftrightarrow", "tleftrightharpoons", "tmapsto", "to", "tochar", "tolinenote", "tooltip", "top", "topbox", "topleftbox", "toplinebox", "toprightbox", "topskippedbox", "tracecatcodetables", "tracedfontname", "traceoutputroutines", "tracepositions", "trademark", "translate", "transparencycomponents", "transparent", "trel", "triangle", "triangledown", "triangleleft", "triangleq", "triangleright", "trightarrow", "trightharpoondown", "trightharpoonup", "trightleftharpoons", "trightoverleftarrow", "triplebond", "tripleprime", "tripleverticalbar", "truefilename", "truefontname", "tstroke", "ttraggedright", "ttriplerel", "ttwoheadleftarrow", "ttwoheadrightarrow", "turnediota", "twodigitrounding", "twofifths", "twoheaddownarrow", "twoheadleftarrow", "twoheadrightarrow", "twoheadrightarrowtail", "twoheaduparrow", "twosuperior", "twothirds", "tx", "txx", "typ", "type", "typebuffer", "typedefinedbuffer", "typeface", "typefile", "typeinlinebuffer", "typescriptone", "typescriptprefix", "typescriptthree", "typescripttwo", "typesetbuffer", "typesetfile", "uacute", "ubreve", "ucaron", "ucircumflex", "uconvertnumber", "udiaeresis", "udiaeresisacute", "udiaeresiscaron", "udiaeresisgrave", "udiaeresismacron", "udotbelow", "udots", "udoublegrave", "uedcatcodecommand", "ugrave", "uhook", "uhorn", "uhornacute", "uhorndotbelow", "uhorngrave", "uhornhook", "uhorntilde", "uhungarumlaut", "uinvertedbreve", "ulcorner", "umacron", "undefinevalue", "undepthed", "underbar", "underbars", "underbrace", "underbracket", "underdash", "underdashes", "underdot", "underdots", "underleftarrow", "underparent", "underrandom", "underrandoms", "underrightarrow", "underset", "understrike", "understrikes", "undoassign", "unexpandeddocumentvariable", "unframed", "unhhbox", "unihex", "uniqueMPgraphic", "uniqueMPpagegraphic", "unit", "unitlanguage", "unitshigh", "unitslow", "unittext", "unknown", "unprotected", "unregisterhyphenationpattern", "unspaceafter", "unspaceargument", "unspaced", "unspacestring", "untexargument", "untexcommand", "uogonek", "upand", "uparrow", "updasharrow", "updownarrow", "updownarrowbar", "updownarrows", "upharpoonleft", "upharpoonright", "uplus", "uppercased", "uppercasestring", "upperleftdoubleninequote", "upperleftdoublesixquote", "upperleftsingleninequote", "upperleftsinglesixquote", "upperrightdoubleninequote", "upperrightdoublesixquote", "upperrightsingleninequote", "upperrightsinglesixquote", "upsilon", "upuparrows", "upwhitearrow", "urcorner", "uring", "url", "useJSscripts", "useMPenvironmentbuffer", "useMPgraphic", "useMPlibrary", "useMPrun", "useMPvariables", "useURL", "usealignparameter", "useblankparameter", "useblocks", "usebodyfont", "usebodyfontparameter", "usebtxdataset", "usebtxdefinitions", "usecitation", "usecolors", "usecomponent", "usedirectory", "usedummycolorparameter", "usedummystyleandcolor", "usedummystyleparameter", "useenvironment", "useexternaldocument", "useexternalfigure", "useexternalrendering", "useexternalsoundtrack", "usefigurebase", "usefile", "usegridparameter", "useindentingparameter", "useindentnextparameter", "useinterlinespaceparameter", "uselanguageparameter", "useluamodule", "usemathstyleparameter", "usemodule", "useproduct", "useprofileparameter", "useproject", "usereferenceparameter", "userpagenumber", "usesetupsparameter", "usestaticMPfigure", "usesubpath", "usesymbols", "usetexmodule", "usetypescript", "usetypescriptfile", "useurl", "usezipfile", "utfchar", "utflower", "utfupper", "utilde", "utilityregisterlength", "vDash", "varTheta", "varepsilon", "varkappa", "varnothing", "varphi", "varpi", "varrho", "varsigma", "vartheta", "vboxreference", "vdash", "vdots", "vec", "vee", "veebar", "veeeq", "verbatim", "verbatimstring", "verbosenumber", "version", "vert", "verticalgrowingbar", "verticalpositionbar", "veryraggedcenter", "veryraggedleft", "veryraggedright", "vglue", "viewerlayer", "vl", "vphantom", "vpos", "vsmash", "vsmashbox", "vsmashed", "vspace", "vspacing", "wcircumflex", "wdofstring", "wedge", "wedgeeq", "weekday", "whitearrowupfrombar", "widehat", "widetilde", "widthofstring", "widthspanningtext", "withoutpt", "word", "wordright", "words", "wordtonumber", "wp", "wr", "writebetweenlist", "writedatatolist", "writestatus", "writetolist", "xLeftarrow", "xLeftrightarrow", "xRightarrow", "xdefconvertedargument", "xequal", "xfrac", "xhookleftarrow", "xhookrightarrow", "xi", "xleftarrow", "xleftharpoondown", "xleftharpoonup", "xleftrightarrow", "xleftrightharpoons", "xmapsto", "xmladdindex", "xmlafterdocumentsetup", "xmlaftersetup", "xmlall", "xmlappenddocumentsetup", "xmlappendsetup", "xmlapplyselectors", "xmlatt", "xmlattdef", "xmlattribute", "xmlattributedef", "xmlbadinclusions", "xmlbeforedocumentsetup", "xmlbeforesetup", "xmlchainatt", "xmlchainattdef", "xmlchecknamespace", "xmlcommand", "xmlconcat", "xmlconcatrange", "xmlcontext", "xmlcount", "xmldefaulttotext", "xmldirectives", "xmldirectivesafter", "xmldirectivesbefore", "xmldisplayverbatim", "xmldoif", "xmldoifelse", "xmldoifelseempty", "xmldoifelseselfempty", "xmldoifelsetext", "xmldoifelsevalue", "xmldoifnot", "xmldoifnotselfempty", "xmldoifnottext", "xmldoifselfempty", "xmldoiftext", "xmlelement", "xmlfilter", "xmlfirst", "xmlflush", "xmlflushcontext", "xmlflushdocumentsetups", "xmlflushlinewise", "xmlflushpure", "xmlflushspacewise", "xmlflushtext", "xmlinclude", "xmlinclusion", "xmlinclusions", "xmlinfo", "xmlinjector", "xmlinlineprettyprint", "xmlinlineprettyprinttext", "xmlinlineverbatim", "xmlinstalldirective", "xmllast", "xmllastatt", "xmllastmatch", "xmllastpar", "xmlloadbuffer", "xmlloaddata", "xmlloaddirectives", "xmlloadfile", "xmlloadonly", "xmlmain", "xmlmapvalue", "xmlname", "xmlnamespace", "xmlnonspace", "xmlpar", "xmlparam", "xmlpath", "xmlpos", "xmlposition", "xmlprependdocumentsetup", "xmlprependsetup", "xmlprettyprint", "xmlprettyprinttext", "xmlprocessbuffer", "xmlprocessdata", "xmlprocessfile", "xmlpure", "xmlraw", "xmlrefatt", "xmlregistereddocumentsetups", "xmlregisteredsetups", "xmlregisterns", "xmlremapname", "xmlremapnamespace", "xmlremovedocumentsetup", "xmlremovesetup", "xmlresetdocumentsetups", "xmlresetinjectors", "xmlresetsetups", "xmlsave", "xmlsetatt", "xmlsetattribute", "xmlsetentity", "xmlsetfunction", "xmlsetinjectors", "xmlsetpar", "xmlsetparam", "xmlsetsetup", "xmlsetup", "xmlshow", "xmlsnippet", "xmlstrip", "xmlstripnolines", "xmlstripped", "xmlstrippednolines", "xmltag", "xmltexentity", "xmltext", "xmltobuffer", "xmltobufferverbose", "xmltofile", "xmlvalue", "xmlverbatim", "xrel", "xrightarrow", "xrightharpoondown", "xrightharpoonup", "xrightleftharpoons", "xrightoverleftarrow", "xsplitstring", "xtriplerel", "xtwoheadleftarrow", "xtwoheadrightarrow", "xxfrac", "xypos", "yacute", "ycircumflex", "ydiaeresis", "ydotbelow", "yen", "ygrave", "yhook", "ymacron", "ytilde", "zacute", "zcaron", "zdotaccent", "zerowidthnobreakspace", "zerowidthspace", "zeta", "zhook", "zstroke", "zwj", "zwnj" }, + ["cs"]={ "Cisla", "Kap", "MESIC", "Rimskecislice", "SLOVA", "SLOVO", "Slova", "Slovo", "VSEDNIDEN", "Znak", "Znaky", "aktualnicislonadpisu", "aktualnidatum", "barevnalista", "barva", "cernalinka", "cernelinky", "cisla", "cislonadpisu", "cislorovnice", "cislostrany", "datum", "definuj", "definujakcent", "definujbarvu", "definujblok", "definujbloksekce", "definujbuffer", "definujfont", "definujformatodkazu", "definujhbox", "definujinterakcnimenu", "definujkombinovanyseznam", "definujkonverzi", "definujnadpis", "definujobrazeksymbol", "definujodkaz", "definujodstavce", "definujopis", "definujoramovani", "definujoramovanytext", "definujpaletu", "definujplvouciobjekt", "definujpodpole", "definujpole", "definujpopis", "definujpopisek", "definujprekryv", "definujprikaz", "definujprofil", "definujprogram", "definujprostredizakladnihofontu", "definujrejstrik", "definujsablonutabulky", "definujsekci", "definujseznam", "definujskupinubarev", "definujstartstop", "definujstyl", "definujstylfontu", "definujsymbol", "definujsynonumumfontu", "definujsynonyma", "definujtabelaci", "definujtext", "definujtrideni", "definujupravu", "definujvelikostpapiru", "definujvycet", "definujzakladnifont", "definujzasobnikpoli", "definujznaceni", "definujznak", "delkaseznamu", "externiobraz", "hlavnijazyk", "hodnotabarvy", "instalacejazyka", "interakcnilista", "interakcnitlacitka", "interaktivnimenu", "jazyk", "jdidolu", "jdina", "jdinabox", "jdinastranu", "klonujpole", "komponenta", "konvertujcislo", "kopirujpole", "korekcebilehomista", "matematika", "meritko", "mesic", "mezera", "mrizka", "nastavbarvu", "nastavbarvy", "nastavbilamista", "nastavblok", "nastavbloksekce", "nastavbuffer", "nastavcernelinky", "nastavcislonadpisu", "nastavcislostrany", "nastavcislovaniodstavcu", "nastavcislovaniradku", "nastavcislovanistran", "nastavcitaci", "nastavdeleniplvoucichobjektu", "nastavdelitko", "nastavdolnitexty", "nastavhorejsek", "nastavhornitexty", "nastavinterakci", "nastavinterakcnilistu", "nastavinterakcnimenu", "nastavinterakcniobrazovku", "nastavjazyk", "nastavkapitalky", "nastavkombinovanyseznam", "nastavkomentar", "nastavkomentarstrany", "nastavmarginalnilinky", "nastavmeziradkovoumezeru", "nastavnadpis", "nastavnadpisy", "nastavodkazovani", "nastavodsazovani", "nastavodstavce", "nastavopis", "nastavoramovanetexty", "nastavoramovani", "nastavorez", "nastavotoceni", "nastavpaletu", "nastavplvouciobjekt", "nastavplvouciobjekty", "nastavpodcislostrany", "nastavpole", "nastavpolozky", "nastavpopisek", "nastavpopisky", "nastavpozadi", "nastavprechodstrany", "nastavpreskok", "nastavprogramy", "nastavradkovani", "nastavradky", "nastavrejstrik", "nastavrovnice", "nastavsadusymbolu", "nastavseznam", "nastavsirkucary", "nastavsloupce", "nastavspodek", "nastavsynonyma", "nastavtabelaci", "nastavtabulky", "nastavtenkelinky", "nastavtext", "nastavtextovelinky", "nastavtexttexty", "nastavtextyupati", "nastavtextyzahlavi", "nastavtoleranci", "nastavtrideni", "nastavtype", "nastavumisteniprotejsku", "nastavumistovani", "nastavupati", "nastavupravu", "nastavurl", "nastavusporadani", "nastavvelikostpapiru", "nastavvsechnapole", "nastavvycty", "nastavvyplnovelinky", "nastavvyplnoveradky", "nastavvzhled", "nastavzahlavi", "nastavzakladnifont", "nastavzarovnani", "nastavznaceni", "nastavzuzeni", "nastrane", "nejakyradek", "nekde", "neznamo", "nivy", "nizky", "nokap", "obrazovka", "odkaz", "odkaznastranu", "odkaznatext", "odkazujici", "opis", "opissoubor", "oramovani", "oref", "orez", "otocit", "oznaceni", "pis", "plnezneni", "pole", "polozka", "polozky", "porovnejpaletu", "porovnejskupinubarev", "pozadi", "pozice", "poznamka", "pref", "prelozit", "prepninazakladnifont", "preskoc", "prizpusobivepole", "prizpusobvzhled", "produkt", "projekt", "prostredi", "resetznaceni", "rimskecislice", "rozdelplvouciobjekt", "roztazene", "schovejbloky", "sedabarva", "sloupec", "slovovpravo", "stanovcharakteristickuseznamu", "stanovcislonadpisu", "startbarva", "startinteraktivnimenu", "startjdina", "startkomponenta", "startmarginalnilinka", "startnadpis", "startoramovani", "startpolozka", "startpozadi", "startprodukt", "startprojekt", "startprostredi", "startpublikace", "startradek", "starttextovalinka", "startumistirovnici", "startzarovnanonastred", "startzarovnanovlevo", "startzarovnanovpravo", "startzhustene", "stopbarva", "stopinteraktivnimenu", "stopjdina", "stopkomponenta", "stopmarginalnilinka", "stopnadpis", "stoporamovani", "stoppolozka", "stoppozadi", "stopprodukt", "stopprojekt", "stopprostredi", "stoppublikace", "stopradek", "stoptextovalinka", "stopumistirovnici", "stopzarovnanonastred", "stopzarovnanovlevo", "stopzarovnanovpravo", "stopzhustene", "strana", "tecky", "tenkalinka", "tenkelinky", "textovalinka", "tlacitko", "tlacitkomenu", "tloustkacary", "tref", "tvrdamezera", "tvrdemezery", "ukazbarvu", "ukazmrizku", "ukaznastaveni", "ukazpaletu", "ukazpodpery", "ukazpostredizakladnihofontu", "ukazramecek", "ukazsadusymbolu", "ukazskupinubarev", "ukazupravu", "ukazvytisk", "ukazvzhled", "ukazzakladnifont", "umistikombinovanyseznam", "umistilokalnipoznamkypodcarou", "umistinadsebe", "umistinamrizku", "umistipodrovnici", "umistipoznamkypodcarou", "umistirejstrik", "umistirovnici", "umistiseznam", "umistivedlesebe", "umistizalozky", "urcicharakteristikurejstriku", "uzijJSscripts", "uzijURL", "uzijadresar", "uzijbloky", "uzijexternidokument", "uzijexterniobraz", "uzijexternizvuk", "uzijmodul", "uzijsymbol", "uzijurl", "verze", "vlasovalinka", "vradku", "vsedniden", "vyberbloky", "vyplnenytext", "vyplnovelinky", "vyplnovyradek", "vysoky", "zachovejbloky", "zadnamezera", "zadnehorniadolniradky", "zadnezahlaviaupati", "zalozka", "zapisdoseznamu", "zapismeziseznam", "zaramovani", "zarovnanonastred", "zarovnanovlevo", "zarovnanovpravo", "zasobnikpoli", "ziskejbuffer", "ziskejznaceni", "znaceni", "znak", "znaky", "zpracujbloky", "zrcadlit", "zref" }, + ["de"]={ "Buchstabe", "Buchstaben", "Kap", "MONAT", "Roemischezahlen", "WOCHENTAG", "WOERTER", "WORT", "Woerter", "Wort", "Ziffern", "amgitterausrichten", "aufseite", "ausfuelltext", "ausschnitt", "bearbeitebloecke", "behaltebloecke", "bei", "bemerkung", "benutzeverzeichnis", "beschriftung", "bestimmekopfnummer", "bestimmelistencharakeristika", "bestimmeregistercharakteristika", "bildschirm", "blanko", "buchstabe", "buchstaben", "datum", "defineschriftsynonym", "definiereabbsymbol", "definiereabsaetze", "definiereabschnitt", "definiereabschnittsblock", "definiereakzent", "definierebefehl", "definierebeschreibung", "definierebeschriftung", "definiereblock", "definierefarbe", "definierefarbengruppe", "definierefeld", "definierefeldstapel", "definierefliesstext", "definierefliesstextumgebung", "definieregleitobjekt", "definierehbox", "definiereinteraktionsmenue", "definierekonversion", "definierelabel", "definiereliste", "definieren", "definierenummerierung", "definiereoverlay", "definierepalette", "definierepapierformat", "definiereprofil", "definiereprogramme", "definierepuffer", "definierereferenz", "definierereferenzformat", "definiereregister", "definiereschrift", "definiereschriftstil", "definieresortieren", "definierestartstop", "definierestil", "definieresubfeld", "definieresymbol", "definieresynonyme", "definieretabellenvorlage", "definieretabulator", "definieretext", "definieretippen", "definiereueberschrift", "definiereumbruch", "definiereumrahmt", "definiereumrahmtertext", "definierezeichen", "definierezusammengestellteliste", "drehen", "duennelinie", "duennerumriss", "einezeile", "externeabbildung", "farbbalken", "farbe", "farbewert", "feld", "feldstapel", "festesspatium", "format", "formelnummer", "gefuelltesrechteck", "gefuelltezeile", "gestreckt", "gitter", "graufarbe", "haarlinie", "hauptsprache", "heutigesdatum", "heutigeskopfnummer", "hintergrund", "hoch", "holebeschriftung", "holepuffer", "imumriss", "installieresprache", "interaktionsbalken", "interaktionsknopfe", "interaktionsmenue", "inzeile", "irgendwo", "keinekopfundfusszeilen", "keinspatium", "keinzeilenobenundunten", "klonierefeld", "knopf", "komponente", "konvertierezahl", "kopfnummer", "kopierefeld", "korrigierezwischenraum", "liniendicke", "linksbuendig", "listenlaenge", "mathematik", "menueknopf", "monat", "nachunten", "nokap", "notiz", "passelayoutan", "passendfeld", "platzierebookmarks", "platziereformel", "platzierefussnoten", "platziereliste", "platzierelokalefussnoten", "platzierenebeneinander", "platziereregister", "platziereuntereinander", "platziereunterformel", "platzierezusammengestellteliste", "pos", "posten", "produkt", "programm", "projekt", "punkt", "rechteck", "rechtecke", "rechtsbuendig", "referenz", "referieren", "roemischezahlen", "ruecksetztenbeschriftung", "schreibezurliste", "schreibezwischenliste", "seite", "seitenreferenz", "seitenummer", "settext", "spalte", "spatium", "spiegeln", "sprache", "startfarbe", "starthintergrund", "startinteraktionsmenue", "startkleinerdurchschuss", "startkomponente", "startkopf", "startlinksbuendig", "startmarginallinie", "startplatziereformel", "startpos", "startprodukt", "startprojekt", "startpublikation", "startrechtsbuendig", "starttextlinie", "startumgebung", "startumrahmt", "startzeile", "startzentriert", "startzu", "stelleabsaetzeein", "stelleabsatznummerierungein", "stelleabschnittsblockein", "stelleanordnenein", "stelleaufzaehlungenein", "stelleausrichtungein", "stelleausschnittein", "stellebeschreibungein", "stellebeschriftungein", "stellebilderunterschriftein", "stellebildunterschriftein", "stellebindestrichein", "stelleblankoein", "stelleblockein", "stelledrehenein", "stelleduennerumrissein", "stelleeinziehenein", "stelleengerein", "stellefarbeein", "stellefarbenein", "stellefeldein", "stellefelderin", "stellefliesstextein", "stelleformelnein", "stellefusszeileein", "stellefusszeilentextein", "stellegefuelltesrechteckein", "stellegefuelltezeileein", "stellegegenueberplatzierenein", "stellegleitobjekteein", "stellegleitobjektein", "stellehintergruendeein", "stellehintergrundein", "stelleinteraktionein", "stelleinteraktionsbalkenein", "stelleinteraktionsbildschirmein", "stelleinteraktionsmenueein", "stellekommentarein", "stellekopfzahlein", "stellekopfzeileein", "stellekopfzeilentextein", "stellelayoutein", "stellelinienbreiteein", "stellelisteein", "stellemarginallinieein", "stellenobenein", "stellepaletteein", "stellepapierformatein", "stelleplatziegeteiltegleitobjekt", "stellepositionierenein", "stellepostenein", "stelleprogrammein", "stellepufferein", "stellerechteckein", "stellereferenzierenein", "stelleregisterein", "stelleseitenkommentarein", "stelleseitennummerein", "stelleseitennummeriernungein", "stelleseitenuebergangein", "stellesortierenein", "stellespaltenein", "stellespatiumein", "stellespracheein", "stellesymbolsetein", "stellesynonymein", "stelletabellenein", "stelletabulatorein", "stelletextein", "stelletextobenein", "stelletexttexteein", "stelletextumrissein", "stelletextuntenein", "stelletipein", "stelletippenein", "stelletoleranzein", "stelleueberschriftein", "stelleueberschriftenein", "stelleumbruchein", "stelleumrahmtein", "stelleumrahmtetexteein", "stelleuntenein", "stelleunterseitennummerein", "stelleurlein", "stelleversalienein", "stellezeilenabstandein", "stellezeilenein", "stellezeilennumerierungein", "stellezitierenein", "stellezusammengestelltelisteein", "stellezwischenraumein", "stopfarbe", "stophintergrund", "stopinteraktionsmenue", "stopkleinerdurchschuss", "stopkomponente", "stopkopf", "stoplinksbuendig", "stopmarginallinie", "stopplatziereformel", "stoppos", "stopprodukt", "stopprojekt", "stoppublikation", "stoprechtsbuendig", "stoptextlinie", "stopumgebung", "stopumrahmt", "stopzeile", "stopzentriert", "stopzu", "teilegleitobjekt", "textlinie", "textreferenz", "tief", "tiho", "tip", "tippedatei", "tippen", "tippepuffer", "ueber", "uebersetzten", "umgebung", "umrahmt", "unbekant", "verbergebloecke", "vergleichefarbengruppe", "vergleichepalette", "verwendeJSscript", "verwendeURL", "verwendebloecke", "verwendeexteresdokument", "verwendeexterneabbildung", "verwendeexternestonstueck", "verwendemodul", "verwendesymbole", "verwendeurl", "volleswort", "von", "waehlebloeckeaus", "wechselezumfliesstext", "wochentag", "wortrechts", "zeigedruck", "zeigeeinstellungen", "zeigefarbe", "zeigefarbengruppe", "zeigefliesstext", "zeigefliesstextumgebung", "zeigegitter", "zeigelayout", "zeigepalette", "zeigerahmen", "zeigestruts", "zeigeumbruch", "zentriert", "ziffern", "zu", "zurbox", "zurseite" }, + ["en"]={}, + ["fr"]={ "Caractere", "Caracteres", "Chiffresromains", "JOURSEMAINE", "MOIS", "MOT", "MOTS", "Mot", "Mots", "Numeros", "a", "adaptedisposition", "ajustechamp", "alaligne", "alapage", "aligneadroite", "aligneagauche", "aligneaumilieu", "arriereplan", "baha", "barrecouleur", "barreinteraction", "bas", "bouton", "boutonmenu", "boutonsinteraction", "cacheblocs", "caractere", "caracteres", "champ", "changepolicecorps", "chiffresromains", "clonechamp", "colonne", "commentaire", "comparegroupecouleur", "comparepalette", "completenumeropage", "completeregistre", "composant", "concernant", "convertitnumero", "copitchamp", "corrigeespaceblanc", "couleur", "couleurgrise", "dactylographier", "dans", "datecourante", "de", "definicaractere", "definit", "definitaccent", "definitbloc", "definitblocsection", "definitbuffer", "definitcalque", "definitchamp", "definitcommande", "definitconversion", "definitcouleur", "definitdactylo", "definitdemarrestoppe", "definitdescription", "definitdisposition", "definitenumeration", "definitenvironnementpolicecorps", "definitetiquette", "definitflottant", "definitformatreference", "definitgroupecouleur", "definithbox", "definitliste", "definitlisteimbriquee", "definitmakeup", "definitmarquage", "definitmenuinteraction", "definitpalette", "definitparagraphes", "definitpilechamp", "definitpolice", "definitpolicecorps", "definitprofil", "definitprogramme", "definitreference", "definitregistre", "definitrevetement", "definitsautdecolonne", "definitsautdepage", "definitsection", "definitsouschamp", "definitstyle", "definitstylepolice", "definitsymbole", "definitsymbolefigure", "definitsynonymepolice", "definitsynonymes", "definittabulation", "definittaillepapier", "definittete", "definittexte", "definittrametableau", "definittri", "definittype", "definitvide", "demarreJScode", "demarreJSpreamble", "demarreLUA", "demarreMP", "demarreMPclip", "demarreMPcode", "demarreMPdefinitions", "demarreMPdrawing", "demarreMPenvironment", "demarreMPextensions", "demarreMPinclusions", "demarreMPinitializations", "demarreMPpage", "demarreMPpositiongraphic", "demarreMPpositionmethod", "demarreMPrun", "demarrePARSEDXML", "demarreTABLE", "demarreTABLEbody", "demarreTABLEfoot", "demarreTABLEhead", "demarreTABLEnext", "demarreTC", "demarreTD", "demarreTDs", "demarreTEX", "demarreTEXpage", "demarreTH", "demarreTN", "demarreTR", "demarreTRs", "demarreTX", "demarreTY", "demarreXML", "demarrealign", "demarrealigneadroite", "demarrealigneagauche", "demarrealigneaumilieu", "demarrealignment", "demarreallmodes", "demarreappendices", "demarrearrangedpages", "demarrearriereplan", "demarreaside", "demarreattachment", "demarrebackmatter", "demarrebar", "demarrebbordermatrix", "demarrebitmapimage", "demarreblockquote", "demarrebodymatter", "demarrebordermatrix", "demarreboxedcolumns", "demarrebtxlabeltext", "demarrebtxrenderingdefinitions", "demarrebuffer", "demarrecases", "demarrecatcodetable", "demarrecenteraligned", "demarrechapter", "demarrecharacteralign", "demarrecheckedfences", "demarrechemical", "demarrechemicaltext", "demarreciter", "demarrecollect", "demarrecollecting", "demarrecolorintent", "demarrecoloronly", "demarrecolorset", "demarrecolumns", "demarrecolumnspan", "demarrecombination", "demarrecomment", "demarrecomposant", "demarrecontextcode", "demarrecontextdefinitioncode", "demarrecouleur", "demarrectxfunction", "demarrectxfunctiondefinition", "demarrecurrentcolor", "demarrecurrentlistentrywrapper", "demarredelimited", "demarredelimitedtext", "demarredisplaymath", "demarredmath", "demarredocument", "demarreeffect", "demarreelement", "demarreembeddedxtable", "demarreendnote", "demarreendofline", "demarreenvironement", "demarreexceptions", "demarreexpanded", "demarreexpandedcollect", "demarreextendedcatcodetable", "demarreexternalfigurecollection", "demarrefact", "demarrefigure", "demarrefiguretext", "demarrefittingpage", "demarrefixed", "demarrefloatcombination", "demarrefont", "demarrefontclass", "demarrefontsolution", "demarrefootnote", "demarreformula", "demarreformulas", "demarreframed", "demarreframedcell", "demarreframedcontent", "demarreframedrow", "demarreframedtable", "demarreframedtext", "demarrefrontmatter", "demarregraphictext", "demarregridsnapping", "demarregroupe", "demarrehanging", "demarrehbox", "demarrehboxestohbox", "demarrehboxregister", "demarreheadtext", "demarrehelptext", "demarrehiding", "demarrehighlight", "demarrehyphenation", "demarreimath", "demarreindentation", "demarreindentedtext", "demarreinteraction", "demarreinterface", "demarreintermezzotext", "demarreintertext", "demarreitemgroup", "demarreitemgroupcolumns", "demarreitemize", "demarreknockout", "demarrelabeltext", "demarrelayout", "demarrelegend", "demarreligne", "demarreligneregleetexte", "demarrelinealignment", "demarrelinecorrection", "demarrelinefiller", "demarrelinenumbering", "demarrelines", "demarrelinetable", "demarrelinetablebody", "demarrelinetablecell", "demarrelinetablehead", "demarrelocalfootnotes", "demarrelocalheadsetup", "demarrelocallinecorrection", "demarrelocalnotes", "demarrelocalsetups", "demarrelua", "demarreluacode", "demarreluaparameterset", "demarreluasetups", "demarremakeup", "demarremargereglee", "demarremarginblock", "demarremarkedcontent", "demarremathalignment", "demarremathcases", "demarremathlabeltext", "demarremathmatrix", "demarremathmode", "demarremathstyle", "demarrematrices", "demarrematrix", "demarremaxaligned", "demarremdformula", "demarremenuinteraction", "demarremiddlealigned", "demarremiddlemakeup", "demarremixedcolumns", "demarremode", "demarremodeset", "demarremodule", "demarremoduletestsection", "demarrempformula", "demarrenamedsection", "demarrenamedsubformulas", "demarrenarrow", "demarrenarrower", "demarrenegative", "demarrenicelyfilledbox", "demarrenointerference", "demarrenotallmodes", "demarrenotext", "demarrenotmode", "demarreoperatortext", "demarreopposite", "demarreoutputstream", "demarreoverlay", "demarreoverprint", "demarrepagecomment", "demarrepagefigure", "demarrepagegrid", "demarrepagegridspan", "demarrepagelayout", "demarrepagemakeup", "demarrepar", "demarreparagraph", "demarreparagraphs", "demarreparagraphscell", "demarreparbuilder", "demarrepart", "demarrepath", "demarreplacechemical", "demarreplacefigure", "demarreplaceflottant", "demarreplaceformule", "demarreplacegraphic", "demarreplaceintermezzo", "demarreplacelegend", "demarreplacepairedbox", "demarreplacetable", "demarrepositioning", "demarrepositionoverlay", "demarrepositive", "demarrepostponing", "demarreprefixtext", "demarreprocessassignmentcommand", "demarreprocessassignmentlist", "demarreprocesscommacommand", "demarreprocesscommalist", "demarreproduit", "demarreprojet", "demarreprotect", "demarreprotectedcolors", "demarrepublication", "demarrepunctuation", "demarrequotation", "demarrequote", "demarrerandomized", "demarrerandomseed", "demarrerawsetups", "demarrereadingfile", "demarrereferenceprefix", "demarreregime", "demarrereusableMPgraphic", "demarrescript", "demarresdformula", "demarresection", "demarresectionblock", "demarresectionblockenvironment", "demarresectionlevel", "demarresetups", "demarreshapebox", "demarreshift", "demarresidebar", "demarresimplecolumns", "demarrespecialitem", "demarrespeech", "demarrespformula", "demarresplitformula", "demarrespread", "demarrestandardmakeup", "demarrestartstop", "demarrestaticMPfigure", "demarrestaticMPgraphic", "demarrestrictinspectnextcharacter", "demarrestrut", "demarrestyle", "demarresubformulas", "demarresubject", "demarresubjectlevel", "demarresubsection", "demarresubsentence", "demarresubstack", "demarresubsubject", "demarresubsubsection", "demarresubsubsubject", "demarresubsubsubsection", "demarresubsubsubsubject", "demarresubsubsubsubsection", "demarresubsubsubsubsubject", "demarresuffixtext", "demarresymbolset", "demarretable", "demarretablehead", "demarretables", "demarretabletail", "demarretabletext", "demarretabulate", "demarretabulatehead", "demarretabulatetail", "demarretagged", "demarretaglabeltext", "demarretete", "demarretexcode", "demarretexdefinition", "demarretext", "demarretextbackground", "demarretextbackgroundmanual", "demarretextcolor", "demarretextcolorintent", "demarretextflow", "demarretextmakeup", "demarretitle", "demarretokens", "demarretransparent", "demarretypescript", "demarretypescriptcollection", "demarretyping", "demarreuniqueMPgraphic", "demarreuniqueMPpagegraphic", "demarreunittext", "demarreunpacked", "demarreusableMPgraphic", "demarreuseMPgraphic", "demarreusemathstyleparameter", "demarreusingbtxspecification", "demarreva", "demarrevbox", "demarrevboxregister", "demarrevboxtohbox", "demarrevboxtohboxseparator", "demarreviewerlayer", "demarrevtop", "demarrevtopregister", "demarrexcell", "demarrexcellgroup", "demarrexgroup", "demarrexmldisplayverbatim", "demarrexmlinlineverbatim", "demarrexmlraw", "demarrexmlsetups", "demarrexrow", "demarrexrowgroup", "demarrextable", "demarrextablebody", "demarrextablefoot", "demarrextablehead", "demarrextablenext", "determinecaracteristiqueliste", "determinecaracteristiquesregistre", "determinenumerotete", "echelle", "ecran", "ecritdansliste", "ecritentreliste", "element", "elements", "environement", "espace", "espacefixe", "espacesfixes", "etire", "faitreference", "fichierdactylo", "figureexterne", "gardeblocs", "grille", "haut", "inconnu", "installelangue", "joursemaine", "langue", "langueprincipale", "largeurligne", "ligneh", "lignenoire", "ligneregleetexte", "lignesnoires", "llongueurliste", "marquage", "marquepage", "mathematique", "menuinteraction", "mois", "montrecadre", "montrecouleur", "montredisposition", "montreedition", "montreenvironnementpolicecorps", "montregrille", "montregroupecouleur", "montrejeusymboles", "montremakeup", "montrepalette", "montrepolicecorps", "montrereglages", "montrestruts", "motdroit", "numeroformule", "numeropage", "numeros", "numerotete", "numerotetecourant", "obtientmarquage", "oriente", "periodes", "pilechamp", "placecoteacote", "placeflottant", "placeformule", "placelesunsaudessusdesautres", "placeliste", "placelisteinmbriquee", "placemarquespages", "placenotespdp", "placenotespdplocales", "placenumeropage", "placenumerotete", "placeregistre", "placesousformule", "placesurgrille", "placetextetete", "prendbuffer", "produit", "programme", "projet", "qqpart", "razmarquage", "referencepage", "referencetexte", "reflete", "reglealignement", "reglearrangement", "reglearriereplan", "reglearriereplans", "reglebarreinteraction", "reglebloc", "regleblocsection", "reglebuffer", "reglecapitales", "reglechamp", "reglechamps", "regleclipping", "reglecolonnes", "reglecommentaire", "reglecommentairepage", "reglecompoetroite", "reglecomposeenalinea", "reglecouleur", "reglecouleurs", "regledactylo", "regledemarrestoppe", "regledisposition", "regleecraninteraction", "regleelements", "regleencadre", "regleentete", "regleenumerations", "regleepaisseurligne", "regleespaceblanc", "regleespacement", "regleespacementinterligne", "regleflottant", "regleflottants", "regleformulaires", "regleformules", "reglegroupeselements", "regleinf", "regleinteraction", "regleintitule", "regleintitules", "reglejeusymboles", "reglelangue", "reglelignes", "reglelignesnoires", "reglelignesreglestexte", "regleliste", "reglelisteimbriquee", "reglemakeup", "reglemargereglee", "reglemarquage", "reglemarquagehyphenation", "reglemenuinteraction", "reglenumeropage", "reglenumerotationligne", "reglenumerotationpage", "reglenumerotationparagraphe", "reglenumerotete", "regleoriente", "reglepalette", "reglepapier", "regleparagraphes", "reglepdp", "regleplacementopposition", "reglepolicecorps", "reglepositionnement", "regleprogrammes", "reglereferencage", "regleregistre", "regleremplitligne", "regleremplitlignesreglees", "regleseparationflottant", "reglesousnumeropage", "reglesup", "reglesynonymes", "regletableaux", "regletabulation", "regletaillepapier", "regletete", "regletetes", "regletexte", "regletextesentete", "regletextesinf", "regletextespdp", "regletextessup", "regletextestexte", "regletolerance", "regletraitsfins", "regletransitionspage", "regletri", "regletype", "regleurl", "remplitligne", "remplitlignesreglees", "remplittexte", "sansespace", "sanslignesenteteetpdp", "sanslignessupetinf", "selectionneblocs", "separeflottant", "settext", "sousnumeropage", "stoppeJScode", "stoppeJSpreamble", "stoppeLUA", "stoppeMP", "stoppeMPclip", "stoppeMPcode", "stoppeMPdefinitions", "stoppeMPdrawing", "stoppeMPenvironment", "stoppeMPextensions", "stoppeMPinclusions", "stoppeMPinitializations", "stoppeMPpage", "stoppeMPpositiongraphic", "stoppeMPpositionmethod", "stoppeMPrun", "stoppePARSEDXML", "stoppeTABLE", "stoppeTABLEbody", "stoppeTABLEfoot", "stoppeTABLEhead", "stoppeTABLEnext", "stoppeTC", "stoppeTD", "stoppeTDs", "stoppeTEX", "stoppeTEXpage", "stoppeTH", "stoppeTN", "stoppeTR", "stoppeTRs", "stoppeTX", "stoppeTY", "stoppeXML", "stoppealign", "stoppealigneadroite", "stoppealigneagauche", "stoppealigneaumilieu", "stoppealignment", "stoppeallmodes", "stoppeappendices", "stoppearrangedpages", "stoppearriereplan", "stoppeaside", "stoppeattachment", "stoppebackmatter", "stoppebar", "stoppebbordermatrix", "stoppebitmapimage", "stoppeblockquote", "stoppebodymatter", "stoppebordermatrix", "stoppeboxedcolumns", "stoppebtxlabeltext", "stoppebtxrenderingdefinitions", "stoppebuffer", "stoppecases", "stoppecatcodetable", "stoppecenteraligned", "stoppechapter", "stoppecharacteralign", "stoppecheckedfences", "stoppechemical", "stoppechemicaltext", "stoppecollect", "stoppecollecting", "stoppecolorintent", "stoppecoloronly", "stoppecolorset", "stoppecolumns", "stoppecolumnspan", "stoppecombination", "stoppecomment", "stoppecomposant", "stoppecontextcode", "stoppecontextdefinitioncode", "stoppecouleur", "stoppectxfunction", "stoppectxfunctiondefinition", "stoppecurrentcolor", "stoppecurrentlistentrywrapper", "stoppedelimited", "stoppedelimitedtext", "stoppedisplaymath", "stoppedmath", "stoppedocument", "stoppeeffect", "stoppeelement", "stoppeembeddedxtable", "stoppeendnote", "stoppeendofline", "stoppeenvironement", "stoppeexceptions", "stoppeexpanded", "stoppeexpandedcollect", "stoppeextendedcatcodetable", "stoppeexternalfigurecollection", "stoppefact", "stoppefigure", "stoppefiguretext", "stoppefittingpage", "stoppefixed", "stoppefloatcombination", "stoppefont", "stoppefontclass", "stoppefontsolution", "stoppefootnote", "stoppeformula", "stoppeformulas", "stoppeframed", "stoppeframedcell", "stoppeframedcontent", "stoppeframedrow", "stoppeframedtable", "stoppeframedtext", "stoppefrontmatter", "stoppegraphictext", "stoppegridsnapping", "stoppegroupe", "stoppehanging", "stoppehbox", "stoppehboxestohbox", "stoppehboxregister", "stoppeheadtext", "stoppehelptext", "stoppehiding", "stoppehighlight", "stoppehyphenation", "stoppeimath", "stoppeindentation", "stoppeindentedtext", "stoppeinteraction", "stoppeinterface", "stoppeintermezzotext", "stoppeintertext", "stoppeitemgroup", "stoppeitemgroupcolumns", "stoppeitemize", "stoppeknockout", "stoppelabeltext", "stoppelayout", "stoppelegend", "stoppeligne", "stoppeligneregleetexte", "stoppelinealignment", "stoppelinecorrection", "stoppelinefiller", "stoppelinenumbering", "stoppelines", "stoppelinetable", "stoppelinetablebody", "stoppelinetablecell", "stoppelinetablehead", "stoppelocalfootnotes", "stoppelocalheadsetup", "stoppelocallinecorrection", "stoppelocalnotes", "stoppelocalsetups", "stoppelua", "stoppeluacode", "stoppeluaparameterset", "stoppeluasetups", "stoppemakeup", "stoppemargereglee", "stoppemarginblock", "stoppemarkedcontent", "stoppemathalignment", "stoppemathcases", "stoppemathlabeltext", "stoppemathmatrix", "stoppemathmode", "stoppemathstyle", "stoppematrices", "stoppematrix", "stoppemaxaligned", "stoppemdformula", "stoppemenuinteraction", "stoppemiddlealigned", "stoppemiddlemakeup", "stoppemixedcolumns", "stoppemode", "stoppemodeset", "stoppemodule", "stoppemoduletestsection", "stoppempformula", "stoppenamedsection", "stoppenamedsubformulas", "stoppenarrow", "stoppenarrower", "stoppenegative", "stoppenicelyfilledbox", "stoppenointerference", "stoppenotallmodes", "stoppenotext", "stoppenotmode", "stoppeoperatortext", "stoppeopposite", "stoppeoutputstream", "stoppeoverlay", "stoppeoverprint", "stoppepagecomment", "stoppepagefigure", "stoppepagegrid", "stoppepagegridspan", "stoppepagelayout", "stoppepagemakeup", "stoppepar", "stoppeparagraph", "stoppeparagraphs", "stoppeparagraphscell", "stoppeparbuilder", "stoppepart", "stoppepath", "stoppeplacechemical", "stoppeplacefigure", "stoppeplaceflottant", "stoppeplaceformule", "stoppeplacegraphic", "stoppeplaceintermezzo", "stoppeplacelegend", "stoppeplacepairedbox", "stoppeplacetable", "stoppepositioning", "stoppepositionoverlay", "stoppepositive", "stoppepostponing", "stoppeprefixtext", "stoppeprocessassignmentcommand", "stoppeprocessassignmentlist", "stoppeprocesscommacommand", "stoppeprocesscommalist", "stoppeproduit", "stoppeprojet", "stoppeprotect", "stoppeprotectedcolors", "stoppepublication", "stoppepunctuation", "stoppequotation", "stoppequote", "stopperandomized", "stopperandomseed", "stopperawsetups", "stoppereadingfile", "stoppereferenceprefix", "stopperegime", "stoppereusableMPgraphic", "stoppescript", "stoppesdformula", "stoppesection", "stoppesectionblock", "stoppesectionblockenvironment", "stoppesectionlevel", "stoppesetups", "stoppeshapebox", "stoppeshift", "stoppesidebar", "stoppesimplecolumns", "stoppespecialitem", "stoppespeech", "stoppespformula", "stoppesplitformula", "stoppespread", "stoppestandardmakeup", "stoppestartstop", "stoppestaticMPfigure", "stoppestaticMPgraphic", "stoppestrictinspectnextcharacter", "stoppestrut", "stoppestyle", "stoppesubformulas", "stoppesubject", "stoppesubjectlevel", "stoppesubsection", "stoppesubsentence", "stoppesubstack", "stoppesubsubject", "stoppesubsubsection", "stoppesubsubsubject", "stoppesubsubsubsection", "stoppesubsubsubsubject", "stoppesubsubsubsubsection", "stoppesubsubsubsubsubject", "stoppesuffixtext", "stoppesymbolset", "stoppetable", "stoppetablehead", "stoppetables", "stoppetabletail", "stoppetabletext", "stoppetabulate", "stoppetabulatehead", "stoppetabulatetail", "stoppetagged", "stoppetaglabeltext", "stoppetete", "stoppetexcode", "stoppetexdefinition", "stoppetext", "stoppetextbackground", "stoppetextbackgroundmanual", "stoppetextcolor", "stoppetextcolorintent", "stoppetextflow", "stoppetextmakeup", "stoppetitle", "stoppetokens", "stoppetransparent", "stoppetypescript", "stoppetypescriptcollection", "stoppetyping", "stoppeuniqueMPgraphic", "stoppeuniqueMPpagegraphic", "stoppeunittext", "stoppeunpacked", "stoppeusableMPgraphic", "stoppeuseMPgraphic", "stoppeusemathstyleparameter", "stoppeusingbtxspecification", "stoppeva", "stoppevbox", "stoppevboxregister", "stoppevboxtohbox", "stoppevboxtohboxseparator", "stoppeviewerlayer", "stoppevtop", "stoppevtopregister", "stoppexcell", "stoppexcellgroup", "stoppexgroup", "stoppexmldisplayverbatim", "stoppexmlinlineverbatim", "stoppexmlraw", "stoppexmlsetups", "stoppexrow", "stoppexrowgroup", "stoppextable", "stoppextablebody", "stoppextablefoot", "stoppextablehead", "stoppextablenext", "symbole", "tapebuffer", "textenotepdp", "traduire", "traiteblocs", "traitfin", "traitsfins", "uneligne", "utiliseJSscripts", "utiliseURL", "utiliseblocs", "utilisechemin", "utilisedocumentexterne", "utilisefigureexterne", "utilisemodule", "utilisepsiteaudioexterne", "utilisesymboles", "utiliseurl", "va", "vaalaboite", "vaalapage", "vaenbas", "valeurcouleur", "vide" }, + ["it"]={ "GIORNOSETTIMANA", "Lettera", "Lettere", "MESE", "Numeri", "Numeriromani", "PAROLA", "PAROLE", "Parola", "Parole", "adattacampo", "adattalayout", "al", "allineacentro", "allineadestra", "allineasinistra", "ambiente", "ap", "apagina", "barracolori", "barrainterazione", "cambiaafontdeltesto", "campi", "capello", "chim", "circondato", "clonacampo", "colonna", "colore", "coloregrigio", "commento", "componenet", "confrontagruppocolori", "confrontatavolozza", "convertinumero", "copiacampo", "correggispaziobianco", "da", "daqualcheparte", "data", "datadioggi", "definisci", "definisciaccento", "definisciambientefontdeltesto", "definisciblocco", "definiscibloccosezione", "definiscibuffer", "definiscicampo", "definiscicapoversi", "definiscicarattere", "definiscicolore", "definiscicomando", "definisciconversione", "definiscidescrizione", "definiscidimensionicarta", "definiscielenco", "definiscielencocombinato", "definiscienumerazione", "definiscietichetta", "definiscifigurasimbolo", "definiscifont", "definiscifontdeltesto", "definisciformatoriferimento", "definiscigruppocolori", "definiscihbox", "definisciincorniciato", "definisciiniziatermina", "definiscilayout", "definiscimakeup", "definiscimarcatura", "definiscimenuinterazione", "definiscimodellotabella", "definiscioggettomobile", "definisciordinamento", "definisciprofilo", "definisciprogramma", "definisciregistro", "definisciriferimento", "definiscisezione", "definiscisimbolo", "definiscisinonimi", "definiscisinonimofont", "definiscisottocampo", "definiscisovrapposizione", "definiscistackcampi", "definiscistile", "definiscistilefont", "definiscitabulato", "definiscitavolozza", "definiscitesta", "definiscitesto", "definiscitestoincorniciato", "definiscitype", "definiscityping", "determinacaratteristicheregistro", "determinacarattersticheelenco", "determinanumerotesta", "elaborablocchi", "elementi", "elemento", "figuraesterna", "giornosettimana", "griglia", "ignoto", "impostaallineamento", "impostaampiezzariga", "impostabarrainterazione", "impostablocco", "impostabloccosezione", "impostabuffer", "impostacampi", "impostacampo", "impostacapoversi", "impostacaption", "impostacaptions", "impostacima", "impostaclippling", "impostacolonne", "impostacolore", "impostacolori", "impostacommento", "impostacommentopagina", "impostadimensionicarta", "impostaelementi", "impostaelencazioni", "impostaelenco", "impostaelencocombinato", "impostaenumerazioni", "impostafondo", "impostafontdeltesto", "impostaforms", "impostaformule", "impostaincorniciato", "impostainiziatermina", "impostainstestazione", "impostainterazione", "impostainterlinea", "impostalayout", "impostalineemargine", "impostalineenere", "impostalineeriempimento", "impostalineesottili", "impostalineetesto", "impostalingua", "impostamaiuscole", "impostamakeup", "impostamarcatura", "impostamenuinterazione", "impostamenzione", "impostanumerazionecapoversi", "impostanumerazionepagina", "impostanumerazionerighe", "impostanumeropagina", "impostanumerosottopagina", "impostanumerotesta", "impostaoggettimobili", "impostaoggettomobile", "impostaordinamento", "impostaparranging", "impostapdp", "impostapiustretto", "impostaposizionamento", "impostaposizionamentoopposti", "impostaprogrammi", "impostaregistro", "impostarientro", "impostariferimento", "impostarighe", "impostarigheriempimento", "impostarigovuoto", "impostarotazione", "impostaschermointerazione", "impostasegnosillabazione", "impostasetsimboli", "impostasfondi", "impostasfondo", "impostasinonimi", "impostaspaziatura", "impostaspaziobianco", "impostaspezzamentooggettomobile", "impostatabelle", "impostatabulato", "impostatavolozza", "impostatesta", "impostateste", "impostatesticima", "impostatestifondo", "impostatestiincorniciati", "impostatestiintestazioni", "impostatestipdp", "impostatesto", "impostatestotesti", "impostatolleranza", "impostatransizionepagina", "impostatype", "impostatyping", "impostaurl", "incorniciato", "iniziaJScode", "iniziaJSpreamble", "iniziaLUA", "iniziaMP", "iniziaMPclip", "iniziaMPcode", "iniziaMPdefinitions", "iniziaMPdrawing", "iniziaMPenvironment", "iniziaMPextensions", "iniziaMPinclusions", "iniziaMPinitializations", "iniziaMPpage", "iniziaMPpositiongraphic", "iniziaMPpositionmethod", "iniziaMPrun", "iniziaPARSEDXML", "iniziaTABLE", "iniziaTABLEbody", "iniziaTABLEfoot", "iniziaTABLEhead", "iniziaTABLEnext", "iniziaTC", "iniziaTD", "iniziaTDs", "iniziaTEX", "iniziaTEXpage", "iniziaTH", "iniziaTN", "iniziaTR", "iniziaTRs", "iniziaTX", "iniziaTY", "iniziaXML", "iniziaalign", "iniziaalignment", "iniziaallineacentro", "iniziaallineadestra", "iniziaallineasinistra", "iniziaallmodes", "iniziaambiente", "iniziaappendices", "iniziaarrangedpages", "iniziaaside", "iniziaattachment", "iniziabackmatter", "iniziabar", "iniziabbordermatrix", "iniziabitmapimage", "iniziablockquote", "iniziabodymatter", "iniziabordermatrix", "iniziaboxedcolumns", "iniziabtxlabeltext", "iniziabtxrenderingdefinitions", "iniziabuffer", "iniziacases", "iniziacatcodetable", "iniziacenteraligned", "iniziachapter", "iniziacharacteralign", "iniziacheckedfences", "iniziachemical", "iniziachemicaltext", "iniziacollect", "iniziacollecting", "iniziacolore", "iniziacolorintent", "iniziacoloronly", "iniziacolorset", "iniziacolumns", "iniziacolumnspan", "iniziacombination", "iniziacomment", "iniziacomponenet", "iniziacontextcode", "iniziacontextdefinitioncode", "iniziactxfunction", "iniziactxfunctiondefinition", "iniziacurrentcolor", "iniziacurrentlistentrywrapper", "iniziadelimited", "iniziadelimitedtext", "iniziadisplaymath", "iniziadmath", "iniziadocument", "iniziaeffect", "iniziaelement", "iniziaelemento", "iniziaembeddedxtable", "iniziaendnote", "iniziaendofline", "iniziaexceptions", "iniziaexpanded", "iniziaexpandedcollect", "iniziaextendedcatcodetable", "iniziaexternalfigurecollection", "iniziafact", "iniziafigure", "iniziafiguretext", "iniziafittingpage", "iniziafixed", "iniziafloatcombination", "iniziafont", "iniziafontclass", "iniziafontsolution", "iniziafootnote", "iniziaformula", "iniziaformulas", "iniziaframedcell", "iniziaframedcontent", "iniziaframedrow", "iniziaframedtable", "iniziaframedtext", "iniziafrontmatter", "iniziagraphictext", "iniziagridsnapping", "iniziahanging", "iniziahbox", "iniziahboxestohbox", "iniziahboxregister", "iniziaheadtext", "iniziahelptext", "iniziahiding", "iniziahighlight", "iniziahyphenation", "iniziaimath", "iniziaimpaccato", "iniziaincorniciato", "iniziaindentation", "iniziaindentedtext", "iniziainteraction", "iniziainterface", "iniziaintermezzotext", "iniziaintertext", "iniziaitemgroup", "iniziaitemgroupcolumns", "iniziaitemize", "iniziaknockout", "inizialabeltext", "inizialayout", "inizialegend", "inizialinealignment", "inizialineamargine", "inizialineatesto", "inizialinecorrection", "inizialinefiller", "inizialinenumbering", "inizialines", "inizialinetable", "inizialinetablebody", "inizialinetablecell", "inizialinetablehead", "inizialocalfootnotes", "inizialocalheadsetup", "inizialocallinecorrection", "inizialocalnotes", "inizialocalsetups", "inizialua", "inizialuacode", "inizialuaparameterset", "inizialuasetups", "iniziamakeup", "iniziamarginblock", "iniziamarkedcontent", "iniziamathalignment", "iniziamathcases", "iniziamathlabeltext", "iniziamathmatrix", "iniziamathmode", "iniziamathstyle", "iniziamatrices", "iniziamatrix", "iniziamaxaligned", "iniziamdformula", "iniziamenuinterattivo", "iniziamettiformula", "iniziamiddlealigned", "iniziamiddlemakeup", "iniziamixedcolumns", "iniziamode", "iniziamodeset", "iniziamodule", "iniziamoduletestsection", "iniziampformula", "inizianamedsection", "inizianamedsubformulas", "inizianarrow", "inizianarrower", "inizianegative", "inizianicelyfilledbox", "inizianointerference", "inizianotallmodes", "inizianotext", "inizianotmode", "iniziaoperatortext", "iniziaopposite", "iniziaoutputstream", "iniziaoverlay", "iniziaoverprint", "iniziapagecomment", "iniziapagefigure", "iniziapagegrid", "iniziapagegridspan", "iniziapagelayout", "iniziapagemakeup", "iniziapar", "iniziaparagraph", "iniziaparagraphs", "iniziaparagraphscell", "iniziaparbuilder", "iniziapart", "iniziapath", "iniziaplacechemical", "iniziaplacefigure", "iniziaplacefloat", "iniziaplacegraphic", "iniziaplaceintermezzo", "iniziaplacelegend", "iniziaplacepairedbox", "iniziaplacetable", "iniziapositioning", "iniziapositionoverlay", "iniziapositive", "iniziapostponing", "iniziaprefixtext", "iniziaprocessassignmentcommand", "iniziaprocessassignmentlist", "iniziaprocesscommacommand", "iniziaprocesscommalist", "iniziaprodotto", "iniziaprogetto", "iniziaprotect", "iniziaprotectedcolors", "iniziapubblicazione", "iniziapunctuation", "iniziaquotation", "iniziaquote", "iniziarandomized", "iniziarandomseed", "iniziarawsetups", "iniziareadingfile", "iniziareferenceprefix", "iniziaregime", "iniziareusableMPgraphic", "iniziariga", "iniziascript", "iniziasdformula", "iniziasection", "iniziasectionblock", "iniziasectionblockenvironment", "iniziasectionlevel", "iniziasetups", "iniziasfondo", "iniziashapebox", "iniziashift", "iniziasidebar", "iniziasimplecolumns", "iniziaspecialitem", "iniziaspeech", "iniziaspformula", "iniziasplitformula", "iniziaspread", "iniziastandardmakeup", "iniziastartstop", "iniziastaticMPfigure", "iniziastaticMPgraphic", "iniziastrictinspectnextcharacter", "iniziastrut", "iniziastyle", "iniziasubformulas", "iniziasubject", "iniziasubjectlevel", "iniziasubsection", "iniziasubsentence", "iniziasubstack", "iniziasubsubject", "iniziasubsubsection", "iniziasubsubsubject", "iniziasubsubsubsection", "iniziasubsubsubsubject", "iniziasubsubsubsubsection", "iniziasubsubsubsubsubject", "iniziasuffixtext", "iniziasymbolset", "iniziatable", "iniziatablehead", "iniziatables", "iniziatabletail", "iniziatabletext", "iniziatabulate", "iniziatabulatehead", "iniziatabulatetail", "iniziatagged", "iniziataglabeltext", "iniziatesta", "iniziatexcode", "iniziatexdefinition", "iniziatext", "iniziatextbackground", "iniziatextbackgroundmanual", "iniziatextcolor", "iniziatextcolorintent", "iniziatextflow", "iniziatextmakeup", "iniziatitle", "iniziatokens", "iniziatransparent", "iniziatypescript", "iniziatypescriptcollection", "iniziatyping", "iniziauniqueMPgraphic", "iniziauniqueMPpagegraphic", "iniziaunittext", "iniziaunpacked", "iniziausableMPgraphic", "iniziauseMPgraphic", "iniziausemathstyleparameter", "iniziausingbtxspecification", "iniziavaia", "iniziavbox", "iniziavboxregister", "iniziavboxtohbox", "iniziavboxtohboxseparator", "iniziaviewerlayer", "iniziavtop", "iniziavtopregister", "iniziaxcell", "iniziaxcellgroup", "iniziaxgroup", "iniziaxmldisplayverbatim", "iniziaxmlinlineverbatim", "iniziaxmlraw", "iniziaxmlsetups", "iniziaxrow", "iniziaxrowgroup", "iniziaxtable", "iniziaxtablebody", "iniziaxtablefoot", "iniziaxtablehead", "iniziaxtablenext", "inriga", "installalingua", "intorno", "lettera", "lettere", "lineanera", "lineasottile", "lineatesto", "lineenere", "lineeriempimento", "lineesottili", "lingua", "linguaprincipale", "lunghezzaelenco", "marcatura", "matematica", "menuinterattivo", "mese", "mettielenco", "mettielencocombinato", "mettifiancoafianco", "mettiformula", "mettiingriglia", "mettinotepdp", "mettinotepdplocali", "mettinumeropagina", "mettiregistro", "mettisegnalibro", "mettisottoformula", "mettiunosullaltro", "mostraambientefontdeltesto", "mostracolore", "mostracornice", "mostrafontdeltesto", "mostragriglia", "mostragruppocolori", "mostraimpostazioni", "mostralyout", "mostramakeup", "mostrasetsimboli", "mostrastampa", "mostrastruts", "mostratavolozza", "nascondiblocchi", "nientelineecimafondo", "nientelineintestazionepdp", "nientespazio", "nota", "numeri", "numeriromani", "numeroformula", "numeropagina", "numeropaginacompleto", "numerotesta", "numerotestacorrente", "pagina", "paroladestra", "ped", "pedap", "perlungo", "posizionanumerotesta", "posizionatestotesta", "posizione", "prendibuffer", "prendimarcatura", "prodotto", "progetto", "programma", "pulsante", "pulsantemenu", "pulsantinterazione", "punti", "qualcheriga", "reimpostamarcatura", "rif", "riferimento", "riferimentopagina", "riferimentotesto", "riflessione", "rigariempimento", "rigovuoto", "ruota", "scala", "schermo", "scrividentroelenco", "scriviinelenco", "segnalibro", "selezionablocchi", "settext", "sfondo", "simbolo", "spazifissi", "spazio", "spaziofisso", "spessoreriga", "spezzaoggettomobile", "stackcampi", "stirato", "terminaJScode", "terminaJSpreamble", "terminaLUA", "terminaMP", "terminaMPclip", "terminaMPcode", "terminaMPdefinitions", "terminaMPdrawing", "terminaMPenvironment", "terminaMPextensions", "terminaMPinclusions", "terminaMPinitializations", "terminaMPpage", "terminaMPpositiongraphic", "terminaMPpositionmethod", "terminaMPrun", "terminaPARSEDXML", "terminaTABLE", "terminaTABLEbody", "terminaTABLEfoot", "terminaTABLEhead", "terminaTABLEnext", "terminaTC", "terminaTD", "terminaTDs", "terminaTEX", "terminaTEXpage", "terminaTH", "terminaTN", "terminaTR", "terminaTRs", "terminaTX", "terminaTY", "terminaXML", "terminaalign", "terminaalignment", "terminaallineacentro", "terminaallineadestra", "terminaallineasinistra", "terminaallmodes", "terminaambiente", "terminaappendices", "terminaarrangedpages", "terminaaside", "terminaattachment", "terminabackmatter", "terminabar", "terminabbordermatrix", "terminabitmapimage", "terminablockquote", "terminabodymatter", "terminabordermatrix", "terminaboxedcolumns", "terminabtxlabeltext", "terminabtxrenderingdefinitions", "terminabuffer", "terminacases", "terminacatcodetable", "terminacenteraligned", "terminachapter", "terminacharacteralign", "terminacheckedfences", "terminachemical", "terminachemicaltext", "terminacollect", "terminacollecting", "terminacolore", "terminacolorintent", "terminacoloronly", "terminacolorset", "terminacolumns", "terminacolumnspan", "terminacombination", "terminacomment", "terminacomponenet", "terminacontextcode", "terminacontextdefinitioncode", "terminactxfunction", "terminactxfunctiondefinition", "terminacurrentcolor", "terminacurrentlistentrywrapper", "terminadelimited", "terminadelimitedtext", "terminadisplaymath", "terminadmath", "terminadocument", "terminaeffect", "terminaelement", "terminaelemento", "terminaembeddedxtable", "terminaendnote", "terminaendofline", "terminaexceptions", "terminaexpanded", "terminaexpandedcollect", "terminaextendedcatcodetable", "terminaexternalfigurecollection", "terminafact", "terminafigure", "terminafiguretext", "terminafittingpage", "terminafixed", "terminafloatcombination", "terminafont", "terminafontclass", "terminafontsolution", "terminafootnote", "terminaformula", "terminaformulas", "terminaframedcell", "terminaframedcontent", "terminaframedrow", "terminaframedtable", "terminaframedtext", "terminafrontmatter", "terminagraphictext", "terminagridsnapping", "terminahanging", "terminahbox", "terminahboxestohbox", "terminahboxregister", "terminaheadtext", "terminahelptext", "terminahiding", "terminahighlight", "terminahyphenation", "terminaimath", "terminaimpaccato", "terminaincorniciato", "terminaindentation", "terminaindentedtext", "terminainteraction", "terminainterface", "terminaintermezzotext", "terminaintertext", "terminaitemgroup", "terminaitemgroupcolumns", "terminaitemize", "terminaknockout", "terminalabeltext", "terminalayout", "terminalegend", "terminalinealignment", "terminalineamargine", "terminalineatesto", "terminalinecorrection", "terminalinefiller", "terminalinenumbering", "terminalines", "terminalinetable", "terminalinetablebody", "terminalinetablecell", "terminalinetablehead", "terminalocalfootnotes", "terminalocalheadsetup", "terminalocallinecorrection", "terminalocalnotes", "terminalocalsetups", "terminalua", "terminaluacode", "terminaluaparameterset", "terminaluasetups", "terminamakeup", "terminamarginblock", "terminamarkedcontent", "terminamathalignment", "terminamathcases", "terminamathlabeltext", "terminamathmatrix", "terminamathmode", "terminamathstyle", "terminamatrices", "terminamatrix", "terminamaxaligned", "terminamdformula", "terminamenuinterattivo", "terminamettiformula", "terminamiddlealigned", "terminamiddlemakeup", "terminamixedcolumns", "terminamode", "terminamodeset", "terminamodule", "terminamoduletestsection", "terminampformula", "terminanamedsection", "terminanamedsubformulas", "terminanarrow", "terminanarrower", "terminanegative", "terminanicelyfilledbox", "terminanointerference", "terminanotallmodes", "terminanotext", "terminanotmode", "terminaoperatortext", "terminaopposite", "terminaoutputstream", "terminaoverlay", "terminaoverprint", "terminapagecomment", "terminapagefigure", "terminapagegrid", "terminapagegridspan", "terminapagelayout", "terminapagemakeup", "terminapar", "terminaparagraph", "terminaparagraphs", "terminaparagraphscell", "terminaparbuilder", "terminapart", "terminapath", "terminaplacechemical", "terminaplacefigure", "terminaplacefloat", "terminaplacegraphic", "terminaplaceintermezzo", "terminaplacelegend", "terminaplacepairedbox", "terminaplacetable", "terminapositioning", "terminapositionoverlay", "terminapositive", "terminapostponing", "terminaprefixtext", "terminaprocessassignmentcommand", "terminaprocessassignmentlist", "terminaprocesscommacommand", "terminaprocesscommalist", "terminaprodotto", "terminaprogetto", "terminaprotect", "terminaprotectedcolors", "terminapubblicazione", "terminapunctuation", "terminaquotation", "terminaquote", "terminarandomized", "terminarandomseed", "terminarawsetups", "terminareadingfile", "terminareferenceprefix", "terminaregime", "terminareusableMPgraphic", "terminariga", "terminascript", "terminasdformula", "terminasection", "terminasectionblock", "terminasectionblockenvironment", "terminasectionlevel", "terminasetups", "terminasfondo", "terminashapebox", "terminashift", "terminasidebar", "terminasimplecolumns", "terminaspecialitem", "terminaspeech", "terminaspformula", "terminasplitformula", "terminaspread", "terminastandardmakeup", "terminastartstop", "terminastaticMPfigure", "terminastaticMPgraphic", "terminastrictinspectnextcharacter", "terminastrut", "terminastyle", "terminasubformulas", "terminasubject", "terminasubjectlevel", "terminasubsection", "terminasubsentence", "terminasubstack", "terminasubsubject", "terminasubsubsection", "terminasubsubsubject", "terminasubsubsubsection", "terminasubsubsubsubject", "terminasubsubsubsubsection", "terminasubsubsubsubsubject", "terminasuffixtext", "terminasymbolset", "terminatable", "terminatablehead", "terminatables", "terminatabletail", "terminatabletext", "terminatabulate", "terminatabulatehead", "terminatabulatetail", "terminatagged", "terminataglabeltext", "terminatesta", "terminatexcode", "terminatexdefinition", "terminatext", "terminatextbackground", "terminatextbackgroundmanual", "terminatextcolor", "terminatextcolorintent", "terminatextflow", "terminatextmakeup", "terminatitle", "terminatokens", "terminatransparent", "terminatypescript", "terminatypescriptcollection", "terminatyping", "terminauniqueMPgraphic", "terminauniqueMPpagegraphic", "terminaunittext", "terminaunpacked", "terminausableMPgraphic", "terminauseMPgraphic", "terminausemathstyleparameter", "terminausingbtxspecification", "terminavaia", "terminavbox", "terminavboxregister", "terminavboxtohbox", "terminavboxtohboxseparator", "terminaviewerlayer", "terminavtop", "terminavtopregister", "terminaxcell", "terminaxcellgroup", "terminaxgroup", "terminaxmldisplayverbatim", "terminaxmlinlineverbatim", "terminaxmlraw", "terminaxmlsetups", "terminaxrow", "terminaxrowgroup", "terminaxtable", "terminaxtablebody", "terminaxtablefoot", "terminaxtablehead", "terminaxtablenext", "testonotapdp", "testoriempimento", "tieniblocchi", "traduci", "usaJSscripts", "usaURL", "usablocco", "usacartella", "usacolonnasonoraesterna", "usadocumentoesterno", "usafiguraesterna", "usamodulo", "usasimboli", "usaurl", "vaia", "vaiabox", "vaiapagina", "vaigiu", "valorecolore", "versione" }, + ["nl"]={ "Cijfers", "Kap", "Letter", "Letters", "MAAND", "Romeins", "WEEKDAG", "WOORD", "WOORDEN", "Woord", "Woorden", "achtergrond", "bepaalkopnummer", "bepaallijstkenmerken", "bepaalregisterkenmerken", "bewaarbuffer", "blanko", "blokje", "blokjes", "cijfers", "converteernummer", "copieerveld", "corrigeerwitruimte", "datum", "definieer", "definieeraccent", "definieeralineas", "definieerblok", "definieerbuffer", "definieercombinatie", "definieercommando", "definieerconversie", "definieerfiguursymbool", "definieerfont", "definieerfontstijl", "definieerfontsynoniem", "definieerhbox", "definieeringesprongentext", "definieerinteractiemenu", "definieeritemgroep", "definieerkadertekst", "definieerkarakter", "definieerkleur", "definieerkleurgroep", "definieerkolomovergang", "definieerkop", "definieerkorps", "definieerkorpsomgeving", "definieerlayer", "definieerlayout", "definieerletter", "definieerlijst", "definieermarkering", "definieeromlijnd", "definieeropmaak", "definieeroverlay", "definieerpaginaovergang", "definieerpalet", "definieerpapierformaat", "definieerplaats", "definieerplaatsblok", "definieerprofiel", "definieerprogramma", "definieerreferentie", "definieerreferentieformaat", "definieerregister", "definieersamengesteldelijst", "definieersectie", "definieersectieblok", "definieersorteren", "definieerstartstop", "definieersubveld", "definieersymbool", "definieersynoniemen", "definieertabelvorm", "definieertabulatie", "definieertekst", "definieertekstachtergrond", "definieertype", "definieertypen", "definieerveld", "definieerveldstapel", "definieerwiskundeuitlijnen", "doordefinieren", "doorlabelen", "doornummeren", "dunnelijn", "dunnelijnen", "eenregel", "ergens", "externfiguur", "formulenummer", "gebruikJSscripts", "gebruikURL", "gebruikblokken", "gebruikexterndocument", "gebruikexternfiguur", "gebruikexterngeluidsfragment", "gebruikmodule", "gebruikpad", "gebruiksymbolen", "gebruiktypescript", "gebruiktypescriptfile", "gebruikurl", "geenbovenenonderregels", "geenhoofdenvoetregels", "geenspatie", "grijskleur", "haalbuffer", "haalmarkering", "haarlijn", "handhaafblokken", "hoofdtaal", "hoog", "huidigedatum", "huidigekopnummer", "inlijnd", "inregel", "installeertaal", "interactiebalk", "interactiebuttons", "interactiemenu", "invullijnen", "invulregel", "invultekst", "kleur", "kleurenbalk", "kleurwaarde", "kloonveld", "kolom", "kopnummer", "laag", "laho", "legeregels", "letter", "letters", "lijndikte", "lijstlengte", "maand", "markeer", "naar", "naarbox", "naarpagina", "nokap", "noot", "omgeving", "omlaag", "omlijnd", "onbekend", "onderdeel", "op", "oppagina", "pagina", "paginanummer", "paginareferentie", "paslayoutaan", "passendveld", "plaatsbookmarks", "plaatsformule", "plaatskopnummer", "plaatskoptekst", "plaatslijst", "plaatslijstmetsynoniemen", "plaatslokalevoetnoten", "plaatsnaastelkaar", "plaatsonderelkaar", "plaatsopgrid", "plaatspaginanummer", "plaatsplaatsblok", "plaatsregister", "plaatsruwelijst", "plaatssamengesteldelijst", "plaatssubformule", "plaatsvoetnoten", "positioneer", "produkt", "programma", "projekt", "punten", "refereer", "referentie", "regellinks", "regelmidden", "regelrechts", "resetmarkering", "romeins", "rooster", "roteer", "schaal", "scherm", "schrijfnaarlijst", "schrijftussenlijst", "selecteerblokken", "som", "spatie", "spiegel", "splitsplaatsblok", "startachtergrond", "startinteractiemenu", "startkantlijn", "startkleur", "startkop", "startlokalevoetnoten", "startmargeblok", "startnaar", "startomgeving", "startomlijnd", "startonderdeel", "startopelkaar", "startplaatsformule", "startplaatsplaatsblok", "startprodukt", "startprojekt", "startpublicatie", "startregel", "startregelcorrectie", "startregellinks", "startregelmidden", "startregelrechts", "startsom", "starttekstachtergrond", "starttekstlijn", "startuitlijnen", "stelachtergrondenin", "stelachtergrondin", "stelalineasin", "stelarrangerenin", "stelblankoin", "stelblokin", "stelblokjesin", "stelblokkopjein", "stelblokkopjesin", "stelbovenin", "stelboventekstenin", "stelbufferin", "stelciterenin", "stelclipin", "stelcommentaarin", "steldoordefinierenin", "steldoornummerenin", "steldunnelijnenin", "stelformulein", "stelformulesin", "stelformulierenin", "stelhoofdin", "stelhoofdtekstenin", "stelingesprongentextin", "stelinmargein", "stelinspringenin", "stelinteractiebalkin", "stelinteractiein", "stelinteractiemenuin", "stelinteractieschermin", "stelinterliniein", "stelinvullijnenin", "stelinvulregelsin", "stelitemgroepin", "stelitemsin", "stelkadertekstenin", "stelkadertekstin", "stelkantlijnin", "stelkapitalenin", "stelkleurenin", "stelkleurin", "stelkolommenin", "stelkopin", "stelkopnummerin", "stelkoppeltekenin", "stelkoppenin", "stelkorpsin", "stellayoutin", "stellijndiktein", "stellijstin", "stelmargeblokkenin", "stelmarkeringin", "stelnaastplaatsenin", "stelomlijndin", "stelonderin", "stelondertekstenin", "stelopmaakin", "stelopsommingenin", "stelpaginacommentaarin", "stelpaginanummerin", "stelpaginanummeringin", "stelpaginaovergangenin", "stelpaletin", "stelpapierformaatin", "stelpapierin", "stelparagraafnummerenin", "stelplaatsblokin", "stelplaatsblokkenin", "stelplaatsbloksplitsenin", "stelplaatsin", "stelpositionerenin", "stelprogrammasin", "stelrefererenin", "stelregelnummerenin", "stelregelsin", "stelregisterin", "stelroterenin", "stelsamengesteldelijstin", "stelsectieblokin", "stelsmallerin", "stelsorterenin", "stelspatieringin", "stelstartstopin", "stelsubpaginanummerin", "stelsymboolsetin", "stelsynoniemenin", "steltaalin", "steltabellenin", "steltabulatiein", "steltekstachtergrondin", "steltekstin", "steltekstinhoudin", "steltekstlijnenin", "stelteksttekstenin", "steltolerantiein", "steltypein", "steltypenin", "steluitlijnenin", "stelurlin", "stelveldenin", "stelveldin", "stelvoetin", "stelvoettekstenin", "stelwiskundeuitlijnenin", "stelwitruimtein", "stopachtergrond", "stopinteractiemenu", "stopkantlijn", "stopkleur", "stopkop", "stoplokalevoetnoten", "stopmargeblok", "stopnaar", "stopomgeving", "stopomlijnd", "stoponderdeel", "stopopelkaar", "stopplaatsformule", "stopplaatsplaatsblok", "stopprodukt", "stopprojekt", "stoppublicatie", "stopregel", "stopregelcorrectie", "stopregellinks", "stopregelmidden", "stopregelrechts", "stopsom", "stoptekstachtergrond", "stoptekstlijn", "stopuitlijnen", "subpaginanummer", "switchnaarkorps", "symbool", "taal", "tekstlijn", "tekstreferentie", "testkolom", "testpagina", "toelichting", "toongrid", "tooninstellingen", "toonkader", "toonkleur", "toonkleurgroep", "toonkorps", "toonkorpsomgeving", "toonlayout", "toonopmaak", "toonpalet", "toonprint", "toonstruts", "toonsymboolset", "uit", "uitgerekt", "vastespatie", "vastespaties", "veld", "veldstapel", "verbergblokken", "vergelijkkleurgroep", "vergelijkpalet", "versie", "vertaal", "verwerkblokken", "voetnoottekst", "volledigepaginanummer", "volledigregister", "voluit", "weekdag", "wiskunde", "woordrechts" }, + ["pe"]={ "آیتم", "آیتمها", "آینه", "از", "استفادهبلوکها", "استفادهدستخطتایپ", "استفادهشکلخارجی", "استفادهقطعهموزیکخارجی", "استفادهمدول", "استفادهمسیر", "استفادهنمادها", "استفادهنوشتارخارجی", "استفادهپروندهدستخطتایپ", "اعدادلاتین", "افزودن", "انتخاببلوکها", "بارگذاریآرایش", "بارگذاریآیتمها", "بارگذاریارجاع", "بارگذاریاندازهبرگ", "بارگذاریباریکتر", "بارگذاریبافر", "بارگذاریبالا", "بارگذاریبردباری", "بارگذاریبرنامهها", "بارگذاریبرگ", "بارگذاریبلوک", "بارگذاریبلوکبخش", "بارگذاریتایپ", "بارگذاریتایپکردن", "بارگذاریترتیب", "بارگذاریتنظیم", "بارگذاریتنظیمریاضی", "بارگذاریتهبرگ", "بارگذاریتورفتگی", "بارگذاریتوضیح", "بارگذاریتوضیحصفحه", "بارگذاریثبت", "بارگذاریجانشانی", "بارگذاریجدولها", "بارگذاریجدولبندی", "بارگذاریخالی", "بارگذاریخطها", "بارگذاریخطهایحاشیه", "بارگذاریخطهایسیاه", "بارگذاریخطهایمتن", "بارگذاریخطهاینازک", "بارگذاریدرجدرخطها", "بارگذاریدرجمخالف", "بارگذاریدوران", "بارگذاریرنگ", "بارگذاریرنگها", "بارگذاریزبان", "بارگذاریستونها", "بارگذاریسر", "بارگذاریسربرگ", "بارگذاریسرها", "بارگذاریشرح", "بارگذاریشرحها", "بارگذاریشروعپایان", "بارگذاریشمارهزیرصفحه", "بارگذاریشمارهسر", "بارگذاریشمارهصفحه", "بارگذاریشمارهگذاریها", "بارگذاریشمارهگذاریصفحه", "بارگذاریشمارهگذاریپاراگراف", "بارگذاریشمارهگذاریخط", "بارگذاریشناور", "بارگذاریشناورها", "بارگذاریشکافتنشناورها", "بارگذاریطرح", "بارگذاریطرحبندی", "بارگذاریعرضخط", "بارگذاریفاصلهبینخط", "بارگذاریفرمولها", "بارگذاریفضایسفید", "بارگذاریفضاگذاری", "بارگذاریقالبی", "بارگذاریقلممتن", "بارگذاریلوح", "بارگذاریلیست", "بارگذاریلیستترکیبی", "بارگذاریمترادفها", "بارگذاریمتن", "بارگذاریمتنهایبالا", "بارگذاریمتنسربرگ", "بارگذاریمتنقالبی", "بارگذاریمتنمتنها", "بارگذاریمتنپانوشت", "بارگذاریمتنپایین", "بارگذاریمجموعهنماد", "بارگذاریمنویپانل", "بارگذاریمکانگذاری", "بارگذاریمیدان", "بارگذاریمیدانها", "بارگذاریمیلهپانل", "بارگذارینشانهشکستن", "بارگذارینشانهگذاری", "بارگذارینقل", "بارگذاریپاراگرافها", "بارگذاریپانل", "بارگذاریپایین", "بارگذاریپردهپانل", "بارگذاریپرکردنخطها", "بارگذاریپسزمینه", "بارگذاریپسزمینهها", "بارگذاریچیدن", "بارگذاریگذارصفحه", "بارگذاریگروههایآیتم", "بارگذاریگروهآیتم", "بازنشانینشانهگذاری", "بدونخطبالاوپایین", "بدونخطسروتهبرگ", "بدونفضا", "برنامه", "بروبه", "بروبهجعبه", "بروبهصفحه", "بروپایین", "بلند", "بلوکهایپردازش", "بلوکهاپنهان", "بنویسبینلیست", "بنویسدرلیست", "تاریخ", "تاریخجاری", "تایپ", "تایپبافر", "تایپپرونده", "ترجمه", "تعریف", "تعریفآرایش", "تعریفالگویجدول", "تعریفاندازهبرگ", "تعریفبافر", "تعریفبخش", "تعریفبرنامه", "تعریفبرچسب", "تعریفبلوک", "تعریفبلوکبخش", "تعریفتایپ", "تعریفتایپکردن", "تعریفتبدیل", "تعریفترتیب", "تعریفترکیب", "تعریفتنظیمریاضی", "تعریفتودهمیدان", "تعریفثبت", "تعریفجانشانی", "تعریفجدولبندی", "تعریفجعبهافقی", "تعریفحرف", "تعریفرنگ", "تعریفزیرمیدان", "تعریفسبک", "تعریفسبکقلم", "تعریفسر", "تعریفشرح", "تعریفشروعپایان", "تعریفشمارهبندی", "تعریفشمایلمرجع", "تعریفشناور", "تعریفشکستنستون", "تعریفشکستصفحه", "تعریفطرحبندی", "تعریففرمان", "تعریفقالبی", "تعریفقلم", "تعریفقلممتن", "تعریفلایه", "تعریفلهجه", "تعریفلوح", "تعریفلیست", "تعریفلیستترکیبی", "تعریفمترادفها", "تعریفمترادفقلم", "تعریفمتن", "تعریفمتنقالبی", "تعریفمحیطقلمبدنه", "تعریفمرجع", "تعریفمنویپانل", "تعریفمیدان", "تعریفنشانهگذاری", "تعریفنماد", "تعریفنمادشکل", "تعریفپاراگرافها", "تعریفپروفایل", "تعریفپوشش", "تعریفگروهآیتم", "تعریفگروهرنگ", "تعیینشمارهسر", "تعیینمحتوایمتن", "تعیینمشخصاتثبت", "تعیینمشخصاتلیست", "تغییربهقلمبدنه", "تنظیمراست", "تنظیمطرحبندی", "تنظیموسط", "توجه", "توری", "تولید", "تک", "ثبتکامل", "حرف", "حرفها", "حفظبلوکها", "خالی", "خطهایسیاه", "خطهاینازک", "خطهاخالی", "خطسیاه", "خطمتن", "خطمو", "خطنازک", "خا", "خع", "در", "درجثبت", "درجدرخط", "درجدرخطها", "درجدرمتن", "درجدربالاییکدیگر", "درجدرتوری", "درجزیرفرمول", "درجشمارهسر", "درجشمارهصفحه", "درجشناور", "درجفرمول", "درجلیست", "درجلیستخام", "درجلیستمختلط", "درجمتنسر", "درجپانوشتها", "درجپانوشتهایموضعی", "درجچوبخط", "درجکناربهکنار", "درخط", "درصفحه", "درقالبی", "درمورد", "درون", "درپر", "دریافتبافر", "دریافتنشانه", "دوران", "دکمه", "دکمهمنو", "دکمهپانل", "رج", "رنگ", "رنگخاکستری", "روزهفته", "ریاضی", "زبان", "زباناصلی", "ستون", "ستونامتحان", "سرپوشکوچکنه", "شروعJScode", "شروعJSpreamble", "شروعLUA", "شروعMP", "شروعMPclip", "شروعMPcode", "شروعMPdefinitions", "شروعMPdrawing", "شروعMPenvironment", "شروعMPextensions", "شروعMPinclusions", "شروعMPinitializations", "شروعMPpage", "شروعMPpositiongraphic", "شروعMPpositionmethod", "شروعMPrun", "شروعPARSEDXML", "شروعTABLE", "شروعTABLEbody", "شروعTABLEfoot", "شروعTABLEhead", "شروعTABLEnext", "شروعTC", "شروعTD", "شروعTDs", "شروعTEX", "شروعTEXpage", "شروعTH", "شروعTN", "شروعTR", "شروعTRs", "شروعTX", "شروعTY", "شروعXML", "شروعalign", "شروعalignment", "شروعallmodes", "شروعappendices", "شروعarrangedpages", "شروعaside", "شروعattachment", "شروعbackmatter", "شروعbar", "شروعbbordermatrix", "شروعbitmapimage", "شروعblockquote", "شروعbodymatter", "شروعbordermatrix", "شروعboxedcolumns", "شروعbtxlabeltext", "شروعbtxrenderingdefinitions", "شروعbuffer", "شروعcases", "شروعcatcodetable", "شروعcenteraligned", "شروعchapter", "شروعcharacteralign", "شروعcheckedfences", "شروعchemical", "شروعchemicaltext", "شروعcollect", "شروعcollecting", "شروعcolorintent", "شروعcoloronly", "شروعcolorset", "شروعcolumns", "شروعcolumnspan", "شروعcombination", "شروعcomment", "شروعcontextcode", "شروعcontextdefinitioncode", "شروعctxfunction", "شروعctxfunctiondefinition", "شروعcurrentcolor", "شروعcurrentlistentrywrapper", "شروعdelimited", "شروعdelimitedtext", "شروعdisplaymath", "شروعdmath", "شروعdocument", "شروعeffect", "شروعelement", "شروعembeddedxtable", "شروعendnote", "شروعendofline", "شروعexceptions", "شروعexpanded", "شروعexpandedcollect", "شروعextendedcatcodetable", "شروعexternalfigurecollection", "شروعfact", "شروعfigure", "شروعfiguretext", "شروعfittingpage", "شروعfixed", "شروعfloatcombination", "شروعfont", "شروعfontclass", "شروعfontsolution", "شروعfootnote", "شروعformula", "شروعformulas", "شروعframedcell", "شروعframedcontent", "شروعframedrow", "شروعframedtable", "شروعframedtext", "شروعfrontmatter", "شروعgraphictext", "شروعgridsnapping", "شروعhanging", "شروعhbox", "شروعhboxestohbox", "شروعhboxregister", "شروعheadtext", "شروعhelptext", "شروعhiding", "شروعhighlight", "شروعhyphenation", "شروعimath", "شروعindentation", "شروعindentedtext", "شروعinteraction", "شروعinterface", "شروعintermezzotext", "شروعintertext", "شروعitemgroup", "شروعitemgroupcolumns", "شروعitemize", "شروعknockout", "شروعlabeltext", "شروعlayout", "شروعlegend", "شروعlinealignment", "شروعlinecorrection", "شروعlinefiller", "شروعlinenumbering", "شروعlines", "شروعlinetable", "شروعlinetablebody", "شروعlinetablecell", "شروعlinetablehead", "شروعlocalfootnotes", "شروعlocalheadsetup", "شروعlocallinecorrection", "شروعlocalnotes", "شروعlocalsetups", "شروعlua", "شروعluacode", "شروعluaparameterset", "شروعluasetups", "شروعmakeup", "شروعmarginblock", "شروعmarkedcontent", "شروعmathalignment", "شروعmathcases", "شروعmathlabeltext", "شروعmathmatrix", "شروعmathmode", "شروعmathstyle", "شروعmatrices", "شروعmatrix", "شروعmaxaligned", "شروعmdformula", "شروعmiddlealigned", "شروعmiddlemakeup", "شروعmixedcolumns", "شروعmode", "شروعmodeset", "شروعmodule", "شروعmoduletestsection", "شروعmpformula", "شروعnamedsection", "شروعnamedsubformulas", "شروعnarrow", "شروعnarrower", "شروعnegative", "شروعnicelyfilledbox", "شروعnointerference", "شروعnotallmodes", "شروعnotext", "شروعnotmode", "شروعoperatortext", "شروعopposite", "شروعoutputstream", "شروعoverlay", "شروعoverprint", "شروعpagecomment", "شروعpagefigure", "شروعpagegrid", "شروعpagegridspan", "شروعpagelayout", "شروعpagemakeup", "شروعpar", "شروعparagraph", "شروعparagraphs", "شروعparagraphscell", "شروعparbuilder", "شروعpart", "شروعpath", "شروعplacechemical", "شروعplacefigure", "شروعplacegraphic", "شروعplaceintermezzo", "شروعplacelegend", "شروعplacepairedbox", "شروعplacetable", "شروعpositioning", "شروعpositionoverlay", "شروعpositive", "شروعpostponing", "شروعprefixtext", "شروعprocessassignmentcommand", "شروعprocessassignmentlist", "شروعprocesscommacommand", "شروعprocesscommalist", "شروعprotect", "شروعprotectedcolors", "شروعpunctuation", "شروعquotation", "شروعquote", "شروعrandomized", "شروعrandomseed", "شروعrawsetups", "شروعreadingfile", "شروعreferenceprefix", "شروعregime", "شروعreusableMPgraphic", "شروعscript", "شروعsdformula", "شروعsection", "شروعsectionblock", "شروعsectionblockenvironment", "شروعsectionlevel", "شروعsetups", "شروعshapebox", "شروعshift", "شروعsidebar", "شروعsimplecolumns", "شروعspecialitem", "شروعspeech", "شروعspformula", "شروعsplitformula", "شروعspread", "شروعstandardmakeup", "شروعstartstop", "شروعstaticMPfigure", "شروعstaticMPgraphic", "شروعstrictinspectnextcharacter", "شروعstrut", "شروعstyle", "شروعsubformulas", "شروعsubject", "شروعsubjectlevel", "شروعsubsection", "شروعsubsentence", "شروعsubstack", "شروعsubsubject", "شروعsubsubsection", "شروعsubsubsubject", "شروعsubsubsubsection", "شروعsubsubsubsubject", "شروعsubsubsubsubsection", "شروعsubsubsubsubsubject", "شروعsuffixtext", "شروعsymbolset", "شروعtable", "شروعtablehead", "شروعtables", "شروعtabletail", "شروعtabletext", "شروعtabulate", "شروعtabulatehead", "شروعtabulatetail", "شروعtagged", "شروعtaglabeltext", "شروعtexcode", "شروعtexdefinition", "شروعtext", "شروعtextbackground", "شروعtextbackgroundmanual", "شروعtextcolor", "شروعtextcolorintent", "شروعtextflow", "شروعtextmakeup", "شروعtitle", "شروعtokens", "شروعtransparent", "شروعtypescript", "شروعtypescriptcollection", "شروعtyping", "شروعuniqueMPgraphic", "شروعuniqueMPpagegraphic", "شروعunittext", "شروعunpacked", "شروعusableMPgraphic", "شروعuseMPgraphic", "شروعusemathstyleparameter", "شروعusingbtxspecification", "شروعvbox", "شروعvboxregister", "شروعvboxtohbox", "شروعvboxtohboxseparator", "شروعviewerlayer", "شروعvtop", "شروعvtopregister", "شروعxcell", "شروعxcellgroup", "شروعxgroup", "شروعxmldisplayverbatim", "شروعxmlinlineverbatim", "شروعxmlraw", "شروعxmlsetups", "شروعxrow", "شروعxrowgroup", "شروعxtable", "شروعxtablebody", "شروعxtablefoot", "شروعxtablehead", "شروعxtablenext", "شروعآیتم", "شروعبروبه", "شروعتنظیمراست", "شروعتنظیموسط", "شروعتولید", "شروعخطحاشیه", "شروعخطمتن", "شروعدرجشناور", "شروعدرجفرمول", "شروعرنگ", "شروعسر", "شروعفشرده", "شروعقالبی", "شروعمحیط", "شروعمنویپانل", "شروعمولفه", "شروعنشر", "شروعپروژه", "شروعپسزمینه", "شروعچپچین", "شروعخط", "شمارهزیرصفحه", "شمارهسر", "شمارهسرجاری", "شمارهصفحه", "شمارهصفحهکامل", "شمارهفرمول", "شمارهمبدل", "شمارهها", "شکافتنشناور", "شکلخارجی", "صفحه", "صفحهتست", "طوللیست", "عرضخط", "فضا", "فضاهایثابت", "فضایثابت", "فضایسفیدصحیح", "قالبی", "لوحمقایسه", "ماه", "متنپانوشت", "محیط", "مراجعه", "مرجع", "مرجعصفحه", "مرجعمتن", "مقایسهگروهرنگ", "مقداررنگ", "مقیاس", "منویپانل", "مولفه", "مکان", "میدان", "میدانشبیهسازی", "میدانپشته", "میدانکپی", "میلهرنگ", "میلهپانل", "ناشناس", "نسخه", "نشانهگذاری", "نصبزبان", "نقطهها", "نماد", "نمایشآرایش", "نمایشبارگذاریها", "نمایشبستها", "نمایشتوری", "نمایشرنگ", "نمایشطرحبندی", "نمایشقالب", "نمایشقلمبدنه", "نمایشلوح", "نمایشمجموعهعلامت", "نمایشمحیطقلمبدنه", "نمایشچاپ", "نمایشگروهرنگ", "پابا", "پایانJScode", "پایانJSpreamble", "پایانLUA", "پایانMP", "پایانMPclip", "پایانMPcode", "پایانMPdefinitions", "پایانMPdrawing", "پایانMPenvironment", "پایانMPextensions", "پایانMPinclusions", "پایانMPinitializations", "پایانMPpage", "پایانMPpositiongraphic", "پایانMPpositionmethod", "پایانMPrun", "پایانPARSEDXML", "پایانTABLE", "پایانTABLEbody", "پایانTABLEfoot", "پایانTABLEhead", "پایانTABLEnext", "پایانTC", "پایانTD", "پایانTDs", "پایانTEX", "پایانTEXpage", "پایانTH", "پایانTN", "پایانTR", "پایانTRs", "پایانTX", "پایانTY", "پایانXML", "پایانalign", "پایانalignment", "پایانallmodes", "پایانappendices", "پایانarrangedpages", "پایانaside", "پایانattachment", "پایانbackmatter", "پایانbar", "پایانbbordermatrix", "پایانbitmapimage", "پایانblockquote", "پایانbodymatter", "پایانbordermatrix", "پایانboxedcolumns", "پایانbtxlabeltext", "پایانbtxrenderingdefinitions", "پایانbuffer", "پایانcases", "پایانcatcodetable", "پایانcenteraligned", "پایانchapter", "پایانcharacteralign", "پایانcheckedfences", "پایانchemical", "پایانchemicaltext", "پایانcollect", "پایانcollecting", "پایانcolorintent", "پایانcoloronly", "پایانcolorset", "پایانcolumns", "پایانcolumnspan", "پایانcombination", "پایانcomment", "پایانcontextcode", "پایانcontextdefinitioncode", "پایانctxfunction", "پایانctxfunctiondefinition", "پایانcurrentcolor", "پایانcurrentlistentrywrapper", "پایانdelimited", "پایانdelimitedtext", "پایانdisplaymath", "پایانdmath", "پایانdocument", "پایانeffect", "پایانelement", "پایانembeddedxtable", "پایانendnote", "پایانendofline", "پایانexceptions", "پایانexpanded", "پایانexpandedcollect", "پایانextendedcatcodetable", "پایانexternalfigurecollection", "پایانfact", "پایانfigure", "پایانfiguretext", "پایانfittingpage", "پایانfixed", "پایانfloatcombination", "پایانfont", "پایانfontclass", "پایانfontsolution", "پایانfootnote", "پایانformula", "پایانformulas", "پایانframedcell", "پایانframedcontent", "پایانframedrow", "پایانframedtable", "پایانframedtext", "پایانfrontmatter", "پایانgraphictext", "پایانgridsnapping", "پایانhanging", "پایانhbox", "پایانhboxestohbox", "پایانhboxregister", "پایانheadtext", "پایانhelptext", "پایانhiding", "پایانhighlight", "پایانhyphenation", "پایانimath", "پایانindentation", "پایانindentedtext", "پایانinteraction", "پایانinterface", "پایانintermezzotext", "پایانintertext", "پایانitemgroup", "پایانitemgroupcolumns", "پایانitemize", "پایانknockout", "پایانlabeltext", "پایانlayout", "پایانlegend", "پایانlinealignment", "پایانlinecorrection", "پایانlinefiller", "پایانlinenumbering", "پایانlines", "پایانlinetable", "پایانlinetablebody", "پایانlinetablecell", "پایانlinetablehead", "پایانlocalfootnotes", "پایانlocalheadsetup", "پایانlocallinecorrection", "پایانlocalnotes", "پایانlocalsetups", "پایانlua", "پایانluacode", "پایانluaparameterset", "پایانluasetups", "پایانmakeup", "پایانmarginblock", "پایانmarkedcontent", "پایانmathalignment", "پایانmathcases", "پایانmathlabeltext", "پایانmathmatrix", "پایانmathmode", "پایانmathstyle", "پایانmatrices", "پایانmatrix", "پایانmaxaligned", "پایانmdformula", "پایانmiddlealigned", "پایانmiddlemakeup", "پایانmixedcolumns", "پایانmode", "پایانmodeset", "پایانmodule", "پایانmoduletestsection", "پایانmpformula", "پایانnamedsection", "پایانnamedsubformulas", "پایانnarrow", "پایانnarrower", "پایانnegative", "پایانnicelyfilledbox", "پایانnointerference", "پایانnotallmodes", "پایانnotext", "پایانnotmode", "پایانoperatortext", "پایانopposite", "پایانoutputstream", "پایانoverlay", "پایانoverprint", "پایانpagecomment", "پایانpagefigure", "پایانpagegrid", "پایانpagegridspan", "پایانpagelayout", "پایانpagemakeup", "پایانpar", "پایانparagraph", "پایانparagraphs", "پایانparagraphscell", "پایانparbuilder", "پایانpart", "پایانpath", "پایانplacechemical", "پایانplacefigure", "پایانplacegraphic", "پایانplaceintermezzo", "پایانplacelegend", "پایانplacepairedbox", "پایانplacetable", "پایانpositioning", "پایانpositionoverlay", "پایانpositive", "پایانpostponing", "پایانprefixtext", "پایانprocessassignmentcommand", "پایانprocessassignmentlist", "پایانprocesscommacommand", "پایانprocesscommalist", "پایانprotect", "پایانprotectedcolors", "پایانpunctuation", "پایانquotation", "پایانquote", "پایانrandomized", "پایانrandomseed", "پایانrawsetups", "پایانreadingfile", "پایانreferenceprefix", "پایانregime", "پایانreusableMPgraphic", "پایانscript", "پایانsdformula", "پایانsection", "پایانsectionblock", "پایانsectionblockenvironment", "پایانsectionlevel", "پایانsetups", "پایانshapebox", "پایانshift", "پایانsidebar", "پایانsimplecolumns", "پایانspecialitem", "پایانspeech", "پایانspformula", "پایانsplitformula", "پایانspread", "پایانstandardmakeup", "پایانstartstop", "پایانstaticMPfigure", "پایانstaticMPgraphic", "پایانstrictinspectnextcharacter", "پایانstrut", "پایانstyle", "پایانsubformulas", "پایانsubject", "پایانsubjectlevel", "پایانsubsection", "پایانsubsentence", "پایانsubstack", "پایانsubsubject", "پایانsubsubsection", "پایانsubsubsubject", "پایانsubsubsubsection", "پایانsubsubsubsubject", "پایانsubsubsubsubsection", "پایانsubsubsubsubsubject", "پایانsuffixtext", "پایانsymbolset", "پایانtable", "پایانtablehead", "پایانtables", "پایانtabletail", "پایانtabletext", "پایانtabulate", "پایانtabulatehead", "پایانtabulatetail", "پایانtagged", "پایانtaglabeltext", "پایانtexcode", "پایانtexdefinition", "پایانtext", "پایانtextbackground", "پایانtextbackgroundmanual", "پایانtextcolor", "پایانtextcolorintent", "پایانtextflow", "پایانtextmakeup", "پایانtitle", "پایانtokens", "پایانtransparent", "پایانtypescript", "پایانtypescriptcollection", "پایانtyping", "پایانuniqueMPgraphic", "پایانuniqueMPpagegraphic", "پایانunittext", "پایانunpacked", "پایانusableMPgraphic", "پایانuseMPgraphic", "پایانusemathstyleparameter", "پایانusingbtxspecification", "پایانvbox", "پایانvboxregister", "پایانvboxtohbox", "پایانvboxtohboxseparator", "پایانviewerlayer", "پایانvtop", "پایانvtopregister", "پایانxcell", "پایانxcellgroup", "پایانxgroup", "پایانxmldisplayverbatim", "پایانxmlinlineverbatim", "پایانxmlraw", "پایانxmlsetups", "پایانxrow", "پایانxrowgroup", "پایانxtable", "پایانxtablebody", "پایانxtablefoot", "پایانxtablehead", "پایانxtablenext", "پایانآیتم", "پایانبروبه", "پایانتنظیمراست", "پایانتنظیموسط", "پایانتولید", "پایانخطحاشیه", "پایانخطمتن", "پایاندرجشناور", "پایاندرجفرمول", "پایانرنگ", "پایانسر", "پایانفشرده", "پایانقالبی", "پایانمحیط", "پایانمنویپانل", "پایانمولفه", "پایاننشر", "پایانپروژه", "پایانپسزمینه", "پایانچپچین", "پایانخط", "پایین", "پرده", "پروژه", "پرکردنمیدان", "پسزمینه", "چوبخط", "چپچین", "کشیده", "کلمهراست", "گیره", "یادداشت", "یکجا", "یکخط" }, + ["ro"]={ "CUVANT", "CUVINTE", "Cuvant", "Cuvinte", "Kap", "LUNA", "Litera", "Litere", "Numere", "Numereromane", "ZIDINSAPTAMANA", "adapteazaaspect", "adubuffer", "adumarcaje", "afiseazaaspect", "afiseazaculoare", "afiseazafonttext", "afiseazagrid", "afiseazagrupculoare", "afiseazamakeup", "afiseazamediufonttext", "afiseazapaleta", "afiseazarama", "afiseazasetari", "afiseazasetsimboluri", "afiseazastruts", "afiseazatiparire", "aliniatcentru", "aliniatdreapta", "aliniatstanga", "ascundeblocuri", "baraculoare", "barainteractiune", "blanc", "butoaneinteractiune", "buton", "butonmeniu", "camp", "cloneazacamp", "coloana", "comparagrupculoare", "comparapaleta", "completeazanumarpagina", "componenta", "convertestenumar", "copiazacamp", "corecteazaspatiualb", "culoare", "culoaregri", "cuvantdreapta", "data", "datacurenta", "defineste", "definesteaccent", "definesteantet", "definestebloc", "definesteblocsectiune", "definestebuffer", "definestecamp", "definestecaracter", "definestecomanda", "definesteconversie", "definesteculoare", "definestedescriere", "definestedimensiunehartie", "definesteenumerare", "definesteeticheta", "definestefloat", "definestefont", "definestefonttext", "definesteformatreferinte", "definestegrupculori", "definestehbox", "definesteinconjurare", "definestelista", "definestelistacombinata", "definestemakeup", "definestemarcaje", "definestemediulfonttext", "definestemeniuinteractiune", "definesteoverlay", "definestepaleta", "definesteparagraf", "definesteprofil", "definesteprogram", "definestereferinte", "definesteregistru", "definestesablontabel", "definestesectiune", "definestesimbol", "definestesimbolfigura", "definestesinonim", "definestesinonimfont", "definestesortare", "definestestartstop", "definestestil", "definestestilfont", "definestestivacampuri", "definestesubcamp", "definestetabulatori", "definestetext", "definestetexteinconjurate", "definestetextinconjurat", "definestetyping", "despre", "determinacaracteristicilelistei", "determinacaracteristiciregistru", "determinanumartitlu", "din", "dute", "dutebox", "dutepagina", "ecran", "element", "faraliniiantetsisubsol", "faraliniisussijos", "faraspatiu", "figuraexterna", "firdepar", "folosesteURL", "folosestebloc", "folosestedirector", "folosestedocumentextern", "folosestefiguraexterna", "folosestemodul", "folosestemuzicaexterna", "folosestescriptJS", "folosestesimboluri", "folosesteurl", "fundal", "grosimelinie", "impartefloat", "inalt", "injos", "inlinie", "instalarelimba", "intins", "jos", "jossus", "la", "lapagina", "limba", "limbaprincipala", "linieneagra", "liniesubtire", "linieumplere", "liniinegre", "liniisubtiri", "litera", "litere", "luna", "lungimelista", "marcaje", "matematica", "mediu", "meniuinteractiune", "necunoscut", "nokap", "nota", "numarformula", "numarpagina", "numartitlu", "numartitlucurent", "numere", "numereromane", "olinie", "pagina", "pastreazablocuri", "pelung", "plaseazapegrid", "plaseazasemnecarte", "potrivestecamp", "pozitie", "proceseazabloc", "produs", "proiect", "puncte", "punedeasuprafiecareia", "punefatainfata", "puneformula", "punelista", "punelistacombinata", "punenotesubsol", "punenotesubsollocale", "punenumarpagina", "puneregistru", "punesubformula", "referinta", "referintapagina", "referintatext", "reflexie", "remarca", "reseteazamarcaje", "riglatext", "rigleumplere", "roteste", "scala", "scriebuffer", "scrieinlista", "scrieintreliste", "selecteazablocuri", "semncarte", "setareitemization", "setarelimba", "setarepozitie", "seteazaaliniat", "seteazaalinierea", "seteazaantet", "seteazaaranjareapag", "seteazaaspect", "seteazabarainteractiune", "seteazablanc", "seteazabloc", "seteazablocsectiune", "seteazabuffer", "seteazacamp", "seteazacampuri", "seteazaclipping", "seteazacoloane", "seteazacomentariu", "seteazacomentariupagina", "seteazaculoare", "seteazaculori", "seteazadimensiunihartie", "seteazaecraninteractiune", "seteazaelemente", "seteazaenumerare", "seteazafloat", "seteazafloats", "seteazafonttext", "seteazaformulare", "seteazaformule", "seteazafundal", "seteazafundaluri", "seteazagrosimelinie", "seteazaimpartireafloat", "seteazainconjurat", "seteazaingust", "seteazainteractiunea", "seteazajos", "seteazalegenda", "seteazalegendele", "seteazaliniesilabe", "seteazaliniesubtire", "seteazalinii", "seteazaliniimargine", "seteazaliniinegre", "seteazaliniiumplere", "seteazalista", "seteazalistacombinata", "seteazamajuscule", "seteazamakeup", "seteazamarcaje", "seteazameniuinteractiune", "seteazaminicitat", "seteazanumarpagina", "seteazanumarsubpagina", "seteazanumartitlu", "seteazanumerotarelinii", "seteazanumerotarepagina", "seteazanumerotareparagrafe", "seteazapaleta", "seteazaparagrafe", "seteazaplasareaopozita", "seteazaprograme", "seteazareferinte", "seteazaregistru", "seteazarigletext", "seteazarigleumplere", "seteazarotare", "seteazasimbol", "seteazasinonime", "seteazasortare", "seteazaspatiu", "seteazaspatiualb", "seteazaspatiuinterliniar", "seteazasubsol", "seteazasus", "seteazatabele", "seteazatabulatori", "seteazatext", "seteazatexteantet", "seteazatextejos", "seteazatextesubsol", "seteazatextesus", "seteazatextetext", "seteazatitlu", "seteazatitluri", "seteazatoleranta", "seteazatranzitiepagina", "seteazatype", "seteazatyping", "seteazaurl", "simbol", "spatiifixate", "spatiu", "spatiufixat", "startaliniatcentru", "startaliniatdreapta", "startaliniatstanga", "startcomponenta", "startculoare", "startdute", "startfundal", "startimpachetat", "startlinie", "startliniemargine", "startmediu", "startmeniuinteractiune", "startprodus", "startproiect", "startpublicatie", "startpuneformula", "startriglatext", "starttitlu", "stivacampuri", "stopaliniatcentru", "stopaliniatdreapta", "stopaliniatstanga", "stopcomponenta", "stopculoare", "stopdute", "stopfundal", "stopimpachetat", "stoplinie", "stopliniemargine", "stopmediu", "stopmeniuinteractiune", "stopprodus", "stopproiect", "stoppublicatie", "stoppuneformula", "stopriglatext", "stoptitlu", "textumplere", "traduce", "trecilafonttext", "undeva", "valoareculoare", "versiune", "zidinsaptamana" }, }
\ No newline at end of file diff --git a/context/data/scite/context/lexers/data/scite-context-data-metafun.lua b/context/data/scite/context/lexers/data/scite-context-data-metafun.lua index 5c061e039..b577c8aee 100644 --- a/context/data/scite/context/lexers/data/scite-context-data-metafun.lua +++ b/context/data/scite/context/lexers/data/scite-context-data-metafun.lua @@ -1,4 +1,4 @@ return { - ["commands"]={ "loadmodule", "dispose", "nothing", "transparency", "tolist", "topath", "tocycle", "sqr", "log", "ln", "exp", "inv", "pow", "pi", "radian", "tand", "cotd", "sin", "cos", "tan", "cot", "atan", "asin", "acos", "invsin", "invcos", "invtan", "acosh", "asinh", "sinh", "cosh", "zmod", "paired", "tripled", "unitcircle", "fulldiamond", "unitdiamond", "fullsquare", "unittriangle", "fulltriangle", "llcircle", "lrcircle", "urcircle", "ulcircle", "tcircle", "bcircle", "lcircle", "rcircle", "lltriangle", "lrtriangle", "urtriangle", "ultriangle", "uptriangle", "downtriangle", "lefttriangle", "righttriangle", "triangle", "smoothed", "cornered", "superellipsed", "randomized", "randomizedcontrols", "squeezed", "enlonged", "shortened", "punked", "curved", "unspiked", "simplified", "blownup", "stretched", "enlarged", "leftenlarged", "topenlarged", "rightenlarged", "bottomenlarged", "crossed", "laddered", "randomshifted", "interpolated", "paralleled", "cutends", "peepholed", "llenlarged", "lrenlarged", "urenlarged", "ulenlarged", "llmoved", "lrmoved", "urmoved", "ulmoved", "rightarrow", "leftarrow", "centerarrow", "boundingbox", "innerboundingbox", "outerboundingbox", "pushboundingbox", "popboundingbox", "boundingradius", "boundingcircle", "boundingpoint", "crossingunder", "insideof", "outsideof", "bottomboundary", "leftboundary", "topboundary", "rightboundary", "xsized", "ysized", "xysized", "sized", "xyscaled", "intersection_point", "intersection_found", "penpoint", "bbwidth", "bbheight", "withshade", "withcircularshade", "withlinearshade", "defineshade", "shaded", "shadedinto", "withshadecolors", "withshadedomain", "withshademethod", "withshadefactor", "withshadevector", "withshadecenter", "withshadedirection", "withshaderadius", "withshadetransform", "withshadestep", "withshadefraction", "cmyk", "spotcolor", "multitonecolor", "namedcolor", "drawfill", "undrawfill", "inverted", "uncolored", "softened", "grayed", "greyed", "onlayer", "along", "graphictext", "loadfigure", "externalfigure", "figure", "register", "outlinetext", "checkedbounds", "checkbounds", "strut", "rule", "withmask", "bitmapimage", "colordecimals", "ddecimal", "dddecimal", "ddddecimal", "colordecimalslist", "textext", "thetextext", "rawtextext", "textextoffset", "texbox", "thetexbox", "rawtexbox", "verbatim", "thelabel", "label", "autoalign", "transparent", "withtransparency", "property", "properties", "withproperties", "asgroup", "infont", "space", "crlf", "dquote", "percent", "SPACE", "CRLF", "DQUOTE", "PERCENT", "grayscale", "greyscale", "withgray", "withgrey", "colorpart", "colorlike", "readfile", "clearxy", "unitvector", "center", "epsed", "anchored", "originpath", "infinite", "break", "xstretched", "ystretched", "snapped", "pathconnectors", "function", "constructedfunction", "constructedpath", "constructedpairs", "straightfunction", "straightpath", "straightpairs", "curvedfunction", "curvedpath", "curvedpairs", "evenly", "oddly", "condition", "pushcurrentpicture", "popcurrentpicture", "arrowpath", "resetarrows", "tensecircle", "roundedsquare", "colortype", "whitecolor", "blackcolor", "basiccolors", "complementary", "complemented", "resolvedcolor", "normalfill", "normaldraw", "visualizepaths", "detailpaths", "naturalizepaths", "drawboundary", "drawwholepath", "drawpathonly", "visualizeddraw", "visualizedfill", "detaileddraw", "draworigin", "drawboundingbox", "drawpath", "drawpoint", "drawpoints", "drawcontrolpoints", "drawcontrollines", "drawpointlabels", "drawlineoptions", "drawpointoptions", "drawcontroloptions", "drawlabeloptions", "draworiginoptions", "drawboundoptions", "drawpathoptions", "resetdrawoptions", "undashed", "pencilled", "decorated", "redecorated", "undecorated", "passvariable", "passarrayvariable", "tostring", "topair", "format", "formatted", "quotation", "quote", "startpassingvariable", "stoppassingvariable", "eofill", "eoclip", "nofill", "fillup", "eofillup", "area", "addbackground", "shadedup", "shadeddown", "shadedleft", "shadedright", "sortlist", "copylist", "shapedlist", "listtocurves", "listtolines", "listsize", "listlast", "uniquelist", "circularpath", "squarepath", "linearpath" }, - ["internals"]={ "nocolormodel", "greycolormodel", "graycolormodel", "rgbcolormodel", "cmykcolormodel", "shadefactor", "textextoffset", "normaltransparent", "multiplytransparent", "screentransparent", "overlaytransparent", "softlighttransparent", "hardlighttransparent", "colordodgetransparent", "colorburntransparent", "darkentransparent", "lightentransparent", "differencetransparent", "exclusiontransparent", "huetransparent", "saturationtransparent", "colortransparent", "luminositytransparent", "ahvariant", "ahdimple", "ahfactor", "metapostversion", "maxdimensions", "drawoptionsfactor", "dq", "sq", "crossingscale", "crossingoption" }, + ["commands"]={ "loadfile", "loadimage", "loadmodule", "dispose", "nothing", "transparency", "tolist", "topath", "tocycle", "sqr", "log", "ln", "exp", "inv", "pow", "pi", "radian", "tand", "cotd", "sin", "cos", "tan", "cot", "atan", "asin", "acos", "invsin", "invcos", "invtan", "acosh", "asinh", "sinh", "cosh", "tanh", "zmod", "paired", "tripled", "unitcircle", "fulldiamond", "unitdiamond", "fullsquare", "unittriangle", "fulltriangle", "llcircle", "lrcircle", "urcircle", "ulcircle", "tcircle", "bcircle", "lcircle", "rcircle", "lltriangle", "lrtriangle", "urtriangle", "ultriangle", "uptriangle", "downtriangle", "lefttriangle", "righttriangle", "triangle", "smoothed", "cornered", "superellipsed", "randomized", "randomizedcontrols", "squeezed", "enlonged", "shortened", "punked", "curved", "unspiked", "simplified", "blownup", "stretched", "enlarged", "leftenlarged", "topenlarged", "rightenlarged", "bottomenlarged", "crossed", "laddered", "randomshifted", "interpolated", "perpendicular", "paralleled", "cutends", "peepholed", "llenlarged", "lrenlarged", "urenlarged", "ulenlarged", "llmoved", "lrmoved", "urmoved", "ulmoved", "rightarrow", "leftarrow", "centerarrow", "drawdoublearrows", "boundingbox", "innerboundingbox", "outerboundingbox", "pushboundingbox", "popboundingbox", "boundingradius", "boundingcircle", "boundingpoint", "crossingunder", "insideof", "outsideof", "bottomboundary", "leftboundary", "topboundary", "rightboundary", "xsized", "ysized", "xysized", "sized", "xyscaled", "intersection_point", "intersection_found", "penpoint", "bbwidth", "bbheight", "withshade", "withcircularshade", "withlinearshade", "defineshade", "shaded", "shadedinto", "withshadecolors", "withshadedomain", "withshademethod", "withshadefactor", "withshadevector", "withshadecenter", "withshadedirection", "withshaderadius", "withshadetransform", "withshadestep", "withshadefraction", "cmyk", "spotcolor", "multitonecolor", "namedcolor", "drawfill", "undrawfill", "inverted", "uncolored", "softened", "grayed", "greyed", "onlayer", "along", "graphictext", "loadfigure", "externalfigure", "figure", "register", "outlinetext", "checkedbounds", "checkbounds", "strut", "rule", "withmask", "bitmapimage", "colordecimals", "ddecimal", "dddecimal", "ddddecimal", "colordecimalslist", "textext", "thetextext", "rawtextext", "textextoffset", "texbox", "thetexbox", "rawtexbox", "istextext", "verbatim", "thelabel", "label", "autoalign", "transparent", "withtransparency", "property", "properties", "withproperties", "asgroup", "infont", "space", "crlf", "dquote", "percent", "SPACE", "CRLF", "DQUOTE", "PERCENT", "grayscale", "greyscale", "withgray", "withgrey", "colorpart", "colorlike", "readfile", "clearxy", "unitvector", "center", "epsed", "anchored", "originpath", "infinite", "break", "xstretched", "ystretched", "snapped", "pathconnectors", "function", "constructedfunction", "constructedpath", "constructedpairs", "straightfunction", "straightpath", "straightpairs", "curvedfunction", "curvedpath", "curvedpairs", "evenly", "oddly", "condition", "pushcurrentpicture", "popcurrentpicture", "arrowpath", "resetarrows", "tensecircle", "roundedsquare", "colortype", "whitecolor", "blackcolor", "basiccolors", "complementary", "complemented", "resolvedcolor", "normalfill", "normaldraw", "visualizepaths", "detailpaths", "naturalizepaths", "drawboundary", "drawwholepath", "drawpathonly", "visualizeddraw", "visualizedfill", "detaileddraw", "draworigin", "drawboundingbox", "drawpath", "drawpoint", "drawpoints", "drawcontrolpoints", "drawcontrollines", "drawpointlabels", "drawlineoptions", "drawpointoptions", "drawcontroloptions", "drawlabeloptions", "draworiginoptions", "drawboundoptions", "drawpathoptions", "resetdrawoptions", "undashed", "pencilled", "decorated", "redecorated", "undecorated", "passvariable", "passarrayvariable", "tostring", "topair", "format", "formatted", "quotation", "quote", "startpassingvariable", "stoppassingvariable", "eofill", "eoclip", "nofill", "fillup", "eofillup", "area", "addbackground", "shadedup", "shadeddown", "shadedleft", "shadedright", "sortlist", "copylist", "shapedlist", "listtocurves", "listtolines", "listsize", "listlast", "uniquelist", "circularpath", "squarepath", "linearpath" }, + ["internals"]={ "nocolormodel", "greycolormodel", "graycolormodel", "rgbcolormodel", "cmykcolormodel", "shadefactor", "textextoffset", "normaltransparent", "multiplytransparent", "screentransparent", "overlaytransparent", "softlighttransparent", "hardlighttransparent", "colordodgetransparent", "colorburntransparent", "darkentransparent", "lightentransparent", "differencetransparent", "exclusiontransparent", "huetransparent", "saturationtransparent", "colortransparent", "luminositytransparent", "ahvariant", "ahdimple", "ahfactor", "ahscale", "metapostversion", "maxdimensions", "drawoptionsfactor", "dq", "sq", "crossingscale", "crossingoption" }, }
\ No newline at end of file diff --git a/context/data/scite/context/lexers/data/scite-context-data-tex.lua b/context/data/scite/context/lexers/data/scite-context-data-tex.lua index 3d2e60ea4..c0bce17d4 100644 --- a/context/data/scite/context/lexers/data/scite-context-data-tex.lua +++ b/context/data/scite/context/lexers/data/scite-context-data-tex.lua @@ -1,9 +1,9 @@ return { - ["aleph"]={ "AlephVersion", "Alephminorversion", "Alephrevision", "Alephversion", "Omegaminorversion", "Omegarevision", "Omegaversion", "boxdir", "pagebottomoffset", "pagerightoffset" }, + ["aleph"]={ "Alephminorversion", "Alephrevision", "Alephversion" }, ["etex"]={ "botmarks", "clubpenalties", "currentgrouplevel", "currentgrouptype", "currentifbranch", "currentiflevel", "currentiftype", "detokenize", "dimexpr", "displaywidowpenalties", "eTeXVersion", "eTeXminorversion", "eTeXrevision", "eTeXversion", "everyeof", "firstmarks", "fontchardp", "fontcharht", "fontcharic", "fontcharwd", "glueexpr", "glueshrink", "glueshrinkorder", "gluestretch", "gluestretchorder", "gluetomu", "ifcsname", "ifdefined", "iffontchar", "interactionmode", "interlinepenalties", "lastlinefit", "lastnodetype", "marks", "muexpr", "mutoglue", "numexpr", "pagediscards", "parshapedimen", "parshapeindent", "parshapelength", "predisplaydirection", "protected", "readline", "savinghyphcodes", "savingvdiscards", "scantokens", "showgroups", "showifs", "showtokens", "splitbotmarks", "splitdiscards", "splitfirstmarks", "topmarks", "tracingassigns", "tracinggroups", "tracingifs", "tracingnesting", "tracingscantokens", "unexpanded", "unless", "widowpenalties" }, - ["luatex"]={ "Uchar", "Udelcode", "Udelcodenum", "Udelimiter", "Udelimiterover", "Udelimiterunder", "Uhextensible", "Uleft", "Umathaccent", "Umathaxis", "Umathbinbinspacing", "Umathbinclosespacing", "Umathbininnerspacing", "Umathbinopenspacing", "Umathbinopspacing", "Umathbinordspacing", "Umathbinpunctspacing", "Umathbinrelspacing", "Umathchar", "Umathcharclass", "Umathchardef", "Umathcharfam", "Umathcharnum", "Umathcharnumdef", "Umathcharslot", "Umathclosebinspacing", "Umathcloseclosespacing", "Umathcloseinnerspacing", "Umathcloseopenspacing", "Umathcloseopspacing", "Umathcloseordspacing", "Umathclosepunctspacing", "Umathcloserelspacing", "Umathcode", "Umathcodenum", "Umathcodenumdef", "Umathconnectoroverlapmin", "Umathfractiondelsize", "Umathfractiondenomdown", "Umathfractiondenomvgap", "Umathfractionnumup", "Umathfractionnumvgap", "Umathfractionrule", "Umathinnerbinspacing", "Umathinnerclosespacing", "Umathinnerinnerspacing", "Umathinneropenspacing", "Umathinneropspacing", "Umathinnerordspacing", "Umathinnerpunctspacing", "Umathinnerrelspacing", "Umathlimitabovebgap", "Umathlimitabovekern", "Umathlimitabovevgap", "Umathlimitbelowbgap", "Umathlimitbelowkern", "Umathlimitbelowvgap", "Umathopbinspacing", "Umathopclosespacing", "Umathopenbinspacing", "Umathopenclosespacing", "Umathopeninnerspacing", "Umathopenopenspacing", "Umathopenopspacing", "Umathopenordspacing", "Umathopenpunctspacing", "Umathopenrelspacing", "Umathoperatorsize", "Umathopinnerspacing", "Umathopopenspacing", "Umathopopspacing", "Umathopordspacing", "Umathoppunctspacing", "Umathoprelspacing", "Umathordbinspacing", "Umathordclosespacing", "Umathordinnerspacing", "Umathordopenspacing", "Umathordopspacing", "Umathordordspacing", "Umathordpunctspacing", "Umathordrelspacing", "Umathoverbarkern", "Umathoverbarrule", "Umathoverbarvgap", "Umathoverdelimiterbgap", "Umathoverdelimitervgap", "Umathpunctbinspacing", "Umathpunctclosespacing", "Umathpunctinnerspacing", "Umathpunctopenspacing", "Umathpunctopspacing", "Umathpunctordspacing", "Umathpunctpunctspacing", "Umathpunctrelspacing", "Umathquad", "Umathradicaldegreeafter", "Umathradicaldegreebefore", "Umathradicaldegreeraise", "Umathradicalkern", "Umathradicalrule", "Umathradicalvgap", "Umathrelbinspacing", "Umathrelclosespacing", "Umathrelinnerspacing", "Umathrelopenspacing", "Umathrelopspacing", "Umathrelordspacing", "Umathrelpunctspacing", "Umathrelrelspacing", "Umathskewedfractionhgap", "Umathskewedfractionvgap", "Umathspaceafterscript", "Umathstackdenomdown", "Umathstacknumup", "Umathstackvgap", "Umathsubshiftdown", "Umathsubshiftdrop", "Umathsubsupshiftdown", "Umathsubsupvgap", "Umathsubtopmax", "Umathsupbottommin", "Umathsupshiftdrop", "Umathsupshiftup", "Umathsupsubbottommax", "Umathunderbarkern", "Umathunderbarrule", "Umathunderbarvgap", "Umathunderdelimiterbgap", "Umathunderdelimitervgap", "Umathnolimitsupfactor", "Umathnolimitsubfactor", "Umiddle", "Uoverdelimiter", "Uradical", "Uright", "Uroot", "Uskewed", "Uskewedwithdelims", "Ustack", "Ustartdisplaymath", "Ustartmath", "Ustopdisplaymath", "Ustopmath", "Usubscript", "Usuperscript", "Uunderdelimiter", "Uvextensible", "adjustspacing", "alignmark", "aligntab", "attribute", "attributedef", "hyphenpenaltymode", "automatichyphenmode", "automatichyphenpenalty", "automaticdiscretionary", "explicithyphenpenalty", "explicitdiscretionary", "bodydir", "boundary", "boxdir", "catcodetable", "clearmarks", "copyfont", "crampeddisplaystyle", "crampedscriptscriptstyle", "crampedscriptstyle", "crampedtextstyle", "draftmode", "dviextension", "dvifeedback", "dvivariable", "efcode", "hjcode", "firstvalidlanguage", "fontid", "formatname", "gleaders", "hyphenationmin", "hyphenationbounds", "ifabsdim", "ifabsnum", "ifprimitive", "ignoreligaturesinfont", "initcatcodetable", "insertht", "lastsavedboxresourceindex", "lastsavedimageresourceindex", "lastsavedimageresourcepages", "lastxpos", "lastypos", "latelua", "leftghost", "leftmarginkern", "letcharcode", "letterspacefont", "linedir", "localbrokenpenalty", "localinterlinepenalty", "localleftbox", "localrightbox", "lpcode", "luaescapestring", "luatexbanner", "luatexrevision", "luatexversion", "luafunction", "mathdir", "mathdisplayskipmode", "matheqnogapstep", "mathitalicsmode", "mathnolimitsmode", "mathoption", "mathscriptsmode", "mathstyle", "mathsurroundskip", "mathsurroundmode", "mathrulesmode", "mathrulesfam", "noboundary", "nokerns", "nohrule", "noligs", "nospaces", "novrule", "normaldeviate", "outputbox", "outputmode", "pagedir", "pageheight", "pagebottomoffset", "pageleftoffset", "pagerightoffset", "pagetopoffset", "pagewidth", "pardir", "pdfextension", "pdffeedback", "pdfvariable", "postexhyphenchar", "posthyphenchar", "predisplaygapfactor", "preexhyphenchar", "prehyphenchar", "primitive", "protrudechars", "protrusionboundary", "pxdimen", "randomseed", "rightghost", "rightmarginkern", "rpcode", "saveboxresource", "savecatcodetable", "saveimageresource", "savepos", "scantextokens", "setfontid", "setrandomseed", "shapemode", "suppressfontnotfounderror", "suppressifcsnameerror", "suppresslongerror", "suppressoutererror", "suppressmathparerror", "synctex", "tagcode", "textdir", "tracingfonts", "uniformdeviate", "useboxresource", "useimageresource", "wordboundary", "vpack", "hpack", "tpack", "csstring", "begincsname", "lastnamedcs", "toksapp", "tokspre", "etoksapp", "etokspre" }, - ["omega"]={ "OmegaVersion", "bodydir", "chardp", "charht", "charit", "charwd", "leftghost", "localbrokenpenalty", "localinterlinepenalty", "localleftbox", "localrightbox", "mathdir", "odelcode", "odelimiter", "omathaccent", "omathchar", "omathchardef", "omathcode", "oradical", "pagedir", "pageheight", "pagewidth", "pardir", "rightghost", "textdir" }, - ["pdftex"]={ "efcode", "expanded", "ifincsname", "ifpdfabsdim", "ifpdfabsnum", "ifpdfprimitive", "leftmarginkern", "letterspacefont", "lpcode", "pdfadjustspacing", "pdfannot", "pdfcatalog", "pdfcolorstack", "pdfcolorstackinit", "pdfcompresslevel", "pdfcopyfont", "pdfcreationdate", "pdfdecimaldigits", "pdfdest", "pdfdestmargin", "pdfdraftmode", "pdfeachlineheight", "pdfeachlinedepth", "pdfendlink", "pdfendthread", "pdffirstlineheight", "pdffontattr", "pdffontexpand", "pdffontname", "pdffontobjnum", "pdffontsize", "pdfxformmargin", "pdfgamma", "pdfgentounicode", "pdfglyphtounicode", "pdfhorigin", "pdfignoreddimen", "pdfimageapplygamma", "pdfimagegamma", "pdfimagehicolor", "pdfimageresolution", "pdfincludechars", "pdfinclusioncopyfonts", "pdfignoreunknownimages", "pdfinclusionerrorlevel", "pdfignoreunknownimages", "pdfinfo", "pdfinfoomitdate", "pdftrailerid", "pdfinsertht", "pdflastannot", "pdflastlinedepth", "pdflastlink", "pdflastobj", "pdflastxform", "pdflastximage", "pdflastximagepages", "pdflastxpos", "pdflastypos", "pdflinkmargin", "pdfliteral", "pdfmapfile", "pdfmapline", "pdfminorversion", "pdfnames", "pdfnoligatures", "pdfnormaldeviate", "pdfobj", "pdfobjcompresslevel", "pdfoutline", "pdfoutput", "pdfpageattr", "pdfpagebox", "pdfpageheight", "pdfpageref", "pdfpageresources", "pdfpagesattr", "pdfpagewidth", "pdfpkmode", "pdfpkresolution", "pdfpkfixeddpi", "pdfprimitive", "pdfprotrudechars", "pdfpxdimen", "pdfrandomseed", "pdfrefobj", "pdfrefxform", "pdfrefximage", "pdfreplacefont", "pdfrestore", "pdfretval", "pdfsave", "pdfsavepos", "pdfsetmatrix", "pdfsetrandomseed", "pdfstartlink", "pdfstartthread", "pdftexbanner", "pdftexrevision", "pdftexversion", "pdfsuppressptexinfo", "pdfsuppressoptionalinfo", "pdfthread", "pdfthreadmargin", "pdftracingfonts", "pdftrailer", "pdfuniformdeviate", "pdfuniqueresname", "pdfvorigin", "pdfxform", "pdfxformattr", "pdfxformname", "pdfxformresources", "pdfximage", "quitvmode", "rightmarginkern", "rpcode", "tagcode" }, - ["tex"]={ "-", "/", "AlephVersion", "Alephminorversion", "Alephrevision", "Alephversion", "OmegaVersion", "Omegaminorversion", "Omegarevision", "Omegaversion", "Udelcode", "Udelcodenum", "Udelimiter", "Udelimiterover", "Udelimiterunder", "Uhextensible", "Uleft", "Umathaccent", "Umathaxis", "Umathbinbinspacing", "Umathbinclosespacing", "Umathbininnerspacing", "Umathbinopenspacing", "Umathbinopspacing", "Umathbinordspacing", "Umathbinpunctspacing", "Umathbinrelspacing", "Umathchar", "Umathcharclass", "Umathchardef", "Umathcharfam", "Umathcharnum", "Umathcharnumdef", "Umathcharslot", "Umathclosebinspacing", "Umathcloseclosespacing", "Umathcloseinnerspacing", "Umathcloseopenspacing", "Umathcloseopspacing", "Umathcloseordspacing", "Umathclosepunctspacing", "Umathcloserelspacing", "Umathcode", "Umathcodenum", "Umathcodenumdef", "Umathconnectoroverlapmin", "Umathfractiondelsize", "Umathfractiondenomdown", "Umathfractiondenomvgap", "Umathfractionnumup", "Umathfractionnumvgap", "Umathfractionrule", "Umathinnerbinspacing", "Umathinnerclosespacing", "Umathinnerinnerspacing", "Umathinneropenspacing", "Umathinneropspacing", "Umathinnerordspacing", "Umathinnerpunctspacing", "Umathinnerrelspacing", "Umathlimitabovebgap", "Umathlimitabovekern", "Umathlimitabovevgap", "Umathlimitbelowbgap", "Umathlimitbelowkern", "Umathlimitbelowvgap", "Umathopbinspacing", "Umathopclosespacing", "Umathopenbinspacing", "Umathopenclosespacing", "Umathopeninnerspacing", "Umathopenopenspacing", "Umathopenopspacing", "Umathopenordspacing", "Umathopenpunctspacing", "Umathopenrelspacing", "Umathoperatorsize", "Umathopinnerspacing", "Umathopopenspacing", "Umathopopspacing", "Umathopordspacing", "Umathoppunctspacing", "Umathoprelspacing", "Umathordbinspacing", "Umathordclosespacing", "Umathordinnerspacing", "Umathordopenspacing", "Umathordopspacing", "Umathordordspacing", "Umathordpunctspacing", "Umathordrelspacing", "Umathoverbarkern", "Umathoverbarrule", "Umathoverbarvgap", "Umathoverdelimiterbgap", "Umathoverdelimitervgap", "Umathpunctbinspacing", "Umathpunctclosespacing", "Umathpunctinnerspacing", "Umathpunctopenspacing", "Umathpunctopspacing", "Umathpunctordspacing", "Umathpunctpunctspacing", "Umathpunctrelspacing", "Umathquad", "Umathradicaldegreeafter", "Umathradicaldegreebefore", "Umathradicaldegreeraise", "Umathradicalkern", "Umathradicalrule", "Umathradicalvgap", "Umathrelbinspacing", "Umathrelclosespacing", "Umathrelinnerspacing", "Umathrelopenspacing", "Umathrelopspacing", "Umathrelordspacing", "Umathrelpunctspacing", "Umathrelrelspacing", "Umathskewedfractionhgap", "Umathskewedfractionvgap", "Umathspaceafterscript", "Umathstackdenomdown", "Umathstacknumup", "Umathstackvgap", "Umathsubshiftdown", "Umathsubshiftdrop", "Umathsubsupshiftdown", "Umathsubsupvgap", "Umathsubtopmax", "Umathsupbottommin", "Umathsupshiftdrop", "Umathsupshiftup", "Umathsupsubbottommax", "Umathunderbarkern", "Umathunderbarrule", "Umathunderbarvgap", "Umathunderdelimiterbgap", "Umathunderdelimitervgap", "Umathnolimitsupfactor", "Umathnolimitsubfactor", "Umiddle", "Uoverdelimiter", "Uradical", "Uright", "Uroot", "Uskewed", "Uskewedwithdelims", "Ustack", "Ustartdisplaymath", "Ustartmath", "Ustopdisplaymath", "Ustopmath", "Usubscript", "Usuperscript", "Uunderdelimiter", "Uvextensible", "above", "abovedisplayshortskip", "abovedisplayskip", "abovewithdelims", "accent", "adjdemerits", "advance", "afterassignment", "aftergroup", "alignmark", "aligntab", "atop", "atopwithdelims", "attribute", "attributedef", "hyphenpenaltymode", "automatichyphenmode", "automatichyphenpenalty", "automaticdiscretionary", "explicithyphenpenalty", "explicitdiscretionary", "badness", "baselineskip", "batchmode", "begingroup", "belowdisplayshortskip", "belowdisplayskip", "binoppenalty", "bodydir", "botmark", "botmarks", "boundary", "box", "boxdir", "boxmaxdepth", "brokenpenalty", "catcode", "catcodetable", "char", "chardef", "cleaders", "clearmarks", "closein", "closeout", "clubpenalties", "clubpenalty", "copy", "copyfont", "count", "countdef", "cr", "crampeddisplaystyle", "crampedscriptscriptstyle", "crampedscriptstyle", "crampedtextstyle", "crcr", "csname", "currentgrouplevel", "currentgrouptype", "currentifbranch", "currentiflevel", "currentiftype", "day", "deadcycles", "def", "defaulthyphenchar", "defaultskewchar", "delcode", "delimiter", "delimiterfactor", "delimitershortfall", "detokenize", "dimen", "dimendef", "dimexpr", "directlua", "discretionary", "displayindent", "displaylimits", "displaystyle", "displaywidowpenalties", "displaywidowpenalty", "displaywidth", "divide", "doublehyphendemerits", "dp", "dump", "dviextension", "dvifeedback", "dvivariable", "eTeXVersion", "eTeXminorversion", "eTeXrevision", "eTeXversion", "edef", "efcode", "hjcode", "else", "emergencystretch", "end", "endcsname", "endgroup", "endinput", "endlinechar", "eqno", "errhelp", "errmessage", "errorcontextlines", "errorstopmode", "escapechar", "everycr", "everydisplay", "everyeof", "everyhbox", "everyjob", "everymath", "everypar", "everyvbox", "exhyphenchar", "exhyphenpenalty", "expandafter", "expanded", "expandglyphsinfont", "fam", "fi", "finalhyphendemerits", "firstmark", "firstmarks", "floatingpenalty", "font", "fontchardp", "fontcharht", "fontcharic", "fontcharwd", "fontdimen", "firstvalidlanguage", "fontid", "fontname", "formatname", "futurelet", "gdef", "gleaders", "global", "globaldefs", "glueexpr", "glueshrink", "glueshrinkorder", "gluestretch", "gluestretchorder", "gluetomu", "halign", "hangafter", "hangindent", "hbadness", "hbox", "hfil", "hfill", "hfilneg", "hfuzz", "hoffset", "holdinginserts", "hrule", "hsize", "hskip", "hss", "ht", "hyphenation", "hyphenchar", "hyphenpenalty", "hyphenationmin", "hyphenationbounds", "if", "ifabsdim", "ifabsnum", "ifcase", "ifcat", "ifcsname", "ifdefined", "ifdim", "ifeof", "iffalse", "iffontchar", "ifhbox", "ifhmode", "ifincsname", "ifinner", "ifmmode", "ifnum", "ifodd", "ifpdfabsdim", "ifpdfabsnum", "ifpdfprimitive", "ifprimitive", "iftrue", "ifvbox", "ifvmode", "ifvoid", "ifx", "ignoreligaturesinfont", "ignorespaces", "immediate", "indent", "initcatcodetable", "input", "inputlineno", "insert", "insertpenalties", "interactionmode", "interlinepenalties", "interlinepenalty", "jobname", "kern", "language", "lastbox", "lastkern", "lastlinefit", "lastnodetype", "lastpenalty", "lastsavedboxresourceindex", "lastsavedimageresourceindex", "lastsavedimageresourcepages", "lastskip", "lastxpos", "lastypos", "latelua", "lccode", "leaders", "left", "leftghost", "lefthyphenmin", "leftmarginkern", "leftskip", "leqno", "let", "letcharcode", "letterspacefont", "limits", "linedir", "linepenalty", "lineskip", "lineskiplimit", "localbrokenpenalty", "localinterlinepenalty", "localleftbox", "localrightbox", "long", "looseness", "lower", "lowercase", "lpcode", "luaescapestring", "luatexbanner", "luatexrevision", "luatexversion", "mag", "mark", "marks", "mathaccent", "mathbin", "mathchar", "mathchardef", "mathchoice", "mathclose", "mathcode", "mathdir", "mathdisplayskipmode", "matheqnogapstep", "mathinner", "mathitalicsmode", "mathnolimitsmode", "mathop", "mathopen", "mathoption", "mathord", "mathpunct", "mathrel", "mathrulesmode", "mathrulesfam", "mathscriptsmode", "mathstyle", "mathsurroundskip", "mathsurroundmode", "mathsurround", "maxdeadcycles", "maxdepth", "meaning", "medmuskip", "message", "middle", "mkern", "month", "moveleft", "moveright", "mskip", "muexpr", "multiply", "muskip", "muskipdef", "mutoglue", "newlinechar", "noalign", "noboundary", "noexpand", "noindent", "nokerns", "nohrule", "noligs", "nospaces", "novrule", "nolimits", "nolocaldirs", "nolocalwhatsits", "nonscript", "nonstopmode", "normaldeviate", "nulldelimiterspace", "nullfont", "number", "numexpr", "odelcode", "odelimiter", "omathaccent", "omathchar", "omathchardef", "omathcode", "omit", "openin", "openout", "or", "oradical", "outer", "output", "outputbox", "outputpenalty", "over", "overfullrule", "overline", "overwithdelims", "pagebottomoffset", "pagedepth", "pagedir", "pagediscards", "pagefilllstretch", "pagefillstretch", "pagefilstretch", "pagegoal", "pageheight", "pageleftoffset", "pagerightoffset", "pageshrink", "pagestretch", "pagetopoffset", "pagetotal", "pagewidth", "par", "pardir", "parfillskip", "parindent", "parshape", "parshapedimen", "parshapeindent", "parshapelength", "parskip", "patterns", "pausing", "pdfadjustspacing", "pdfannot", "pdfcatalog", "pdfcolorstack", "pdfcolorstackinit", "pdfcompresslevel", "pdfcopyfont", "pdfcreationdate", "pdfdecimaldigits", "pdfdest", "pdfdestmargin", "pdfdraftmode", "pdfeachlineheight", "pdfeachlinedepth", "pdfendlink", "pdfendthread", "pdfextension", "pdfvariable", "pdffirstlineheight", "pdffontattr", "pdffontexpand", "pdffontname", "pdffontobjnum", "pdffontsize", "pdfxformmargin", "pdfgamma", "pdfgentounicode", "pdfglyphtounicode", "pdfhorigin", "pdfignoreddimen", "pdfimageaddfilename", "pdfimageapplygamma", "pdfimagegamma", "pdfimagehicolor", "pdfimageresolution", "pdfincludechars", "pdfinclusioncopyfonts", "pdfinclusionerrorlevel", "pdfignoreunknownimages", "pdfinfo", "pdfinfoomitdate", "pdftrailerid", "pdfinsertht", "pdflastannot", "pdflastlinedepth", "pdflastlink", "pdflastobj", "pdflastxform", "pdflastximage", "pdflastximagepages", "pdflastxpos", "pdflastypos", "pdflinkmargin", "pdfliteral", "pdfmapfile", "pdfmapline", "pdfminorversion", "pdfnames", "pdfnoligatures", "pdfnormaldeviate", "pdfobj", "pdfobjcompresslevel", "pdfoutline", "pdfoutput", "pdfpageattr", "pdfpagebox", "pdfpageheight", "pdfpageref", "pdfpageresources", "pdfpagesattr", "pdfpagewidth", "pdfpkmode", "pdfpkresolution", "pdfpkfixeddpi", "pdfprimitive", "pdfprotrudechars", "pdfpxdimen", "pdfrandomseed", "pdfrefobj", "pdfrefxform", "pdfrefximage", "pdfreplacefont", "pdfrestore", "pdfretval", "pdfsave", "pdfsavepos", "pdfsetmatrix", "pdfsetrandomseed", "pdfstartlink", "pdfstartthread", "pdftexbanner", "pdftexrevision", "pdftexversion", "pdfsuppressptexinfo", "pdfsuppressoptionalinfo", "pdfthread", "pdfthreadmargin", "pdftracingfonts", "pdftrailer", "pdfuniformdeviate", "pdfuniqueresname", "pdfvorigin", "pdfxform", "pdfxformattr", "pdfxformname", "pdfxformresources", "pdfximage", "penalty", "postdisplaypenalty", "postexhyphenchar", "posthyphenchar", "predisplaydirection", "predisplaygapfactor", "predisplaypenalty", "predisplaysize", "preexhyphenchar", "prehyphenchar", "pretolerance", "prevdepth", "prevgraf", "primitive", "protected", "protrudechars", "protrusionboundary", "pxdimen", "quitvmode", "radical", "raise", "randomseed", "read", "readline", "relax", "relpenalty", "right", "rightghost", "righthyphenmin", "rightmarginkern", "rightskip", "romannumeral", "rpcode", "saveboxresource", "saveimageresource", "savepos", "savecatcodetable", "savinghyphcodes", "savingvdiscards", "scantextokens", "scantokens", "scriptfont", "scriptscriptfont", "scriptscriptstyle", "scriptspace", "scriptstyle", "scrollmode", "setbox", "setfontid", "setlanguage", "setrandomseed", "shapemode", "sfcode", "shipout", "show", "showbox", "showboxbreadth", "showboxdepth", "showgroups", "showifs", "showlists", "showthe", "showtokens", "skewchar", "skip", "skipdef", "spacefactor", "spaceskip", "span", "special", "splitbotmark", "splitbotmarks", "splitdiscards", "splitfirstmark", "splitfirstmarks", "splitmaxdepth", "splittopskip", "string", "suppressfontnotfounderror", "suppressifcsnameerror", "suppresslongerror", "suppressoutererror", "suppressmathparerror", "synctex", "tabskip", "tagcode", "textdir", "textfont", "textstyle", "the", "thickmuskip", "thinmuskip", "time", "toks", "toksdef", "tolerance", "topmark", "topmarks", "topskip", "tracingassigns", "tracingcommands", "tracingfonts", "tracinggroups", "tracingifs", "tracinglostchars", "tracingmacros", "tracingnesting", "tracingonline", "tracingoutput", "tracingpages", "tracingparagraphs", "tracingrestores", "tracingscantokens", "tracingstats", "uccode", "uchyph", "underline", "unexpanded", "unhbox", "unhcopy", "uniformdeviate", "unkern", "unless", "unpenalty", "unskip", "unvbox", "unvcopy", "uppercase", "useboxresource", "useimageresource", "vadjust", "valign", "vbadness", "vbox", "vcenter", "vfil", "vfill", "vfilneg", "vfuzz", "voffset", "vrule", "vsize", "vskip", "vsplit", "vss", "vtop", "wd", "widowpenalties", "widowpenalty", "wordboundary", "write", "xdef", "xleaders", "xspaceskip", "year", "vpack", "hpack", "tpack", "csstring", "begincsname", "lastnamedcs", "toksapp", "tokspre", "etoksapp", "etokspre" }, + ["luatex"]={ "Uchar", "Udelcode", "Udelcodenum", "Udelimiter", "Udelimiterover", "Udelimiterunder", "Uhextensible", "Umathaccent", "Umathaxis", "Umathbinbinspacing", "Umathbinclosespacing", "Umathbininnerspacing", "Umathbinopenspacing", "Umathbinopspacing", "Umathbinordspacing", "Umathbinpunctspacing", "Umathbinrelspacing", "Umathchar", "Umathcharclass", "Umathchardef", "Umathcharfam", "Umathcharnum", "Umathcharnumdef", "Umathcharslot", "Umathclosebinspacing", "Umathcloseclosespacing", "Umathcloseinnerspacing", "Umathcloseopenspacing", "Umathcloseopspacing", "Umathcloseordspacing", "Umathclosepunctspacing", "Umathcloserelspacing", "Umathcode", "Umathcodenum", "Umathconnectoroverlapmin", "Umathfractiondelsize", "Umathfractiondenomdown", "Umathfractiondenomvgap", "Umathfractionnumup", "Umathfractionnumvgap", "Umathfractionrule", "Umathinnerbinspacing", "Umathinnerclosespacing", "Umathinnerinnerspacing", "Umathinneropenspacing", "Umathinneropspacing", "Umathinnerordspacing", "Umathinnerpunctspacing", "Umathinnerrelspacing", "Umathlimitabovebgap", "Umathlimitabovekern", "Umathlimitabovevgap", "Umathlimitbelowbgap", "Umathlimitbelowkern", "Umathlimitbelowvgap", "Umathnolimitsubfactor", "Umathnolimitsupfactor", "Umathopbinspacing", "Umathopclosespacing", "Umathopenbinspacing", "Umathopenclosespacing", "Umathopeninnerspacing", "Umathopenopenspacing", "Umathopenopspacing", "Umathopenordspacing", "Umathopenpunctspacing", "Umathopenrelspacing", "Umathoperatorsize", "Umathopinnerspacing", "Umathopopenspacing", "Umathopopspacing", "Umathopordspacing", "Umathoppunctspacing", "Umathoprelspacing", "Umathordbinspacing", "Umathordclosespacing", "Umathordinnerspacing", "Umathordopenspacing", "Umathordopspacing", "Umathordordspacing", "Umathordpunctspacing", "Umathordrelspacing", "Umathoverbarkern", "Umathoverbarrule", "Umathoverbarvgap", "Umathoverdelimiterbgap", "Umathoverdelimitervgap", "Umathpunctbinspacing", "Umathpunctclosespacing", "Umathpunctinnerspacing", "Umathpunctopenspacing", "Umathpunctopspacing", "Umathpunctordspacing", "Umathpunctpunctspacing", "Umathpunctrelspacing", "Umathquad", "Umathradicaldegreeafter", "Umathradicaldegreebefore", "Umathradicaldegreeraise", "Umathradicalkern", "Umathradicalrule", "Umathradicalvgap", "Umathrelbinspacing", "Umathrelclosespacing", "Umathrelinnerspacing", "Umathrelopenspacing", "Umathrelopspacing", "Umathrelordspacing", "Umathrelpunctspacing", "Umathrelrelspacing", "Umathskewedfractionhgap", "Umathskewedfractionvgap", "Umathspaceafterscript", "Umathstackdenomdown", "Umathstacknumup", "Umathstackvgap", "Umathsubshiftdown", "Umathsubshiftdrop", "Umathsubsupshiftdown", "Umathsubsupvgap", "Umathsubtopmax", "Umathsupbottommin", "Umathsupshiftdrop", "Umathsupshiftup", "Umathsupsubbottommax", "Umathunderbarkern", "Umathunderbarrule", "Umathunderbarvgap", "Umathunderdelimiterbgap", "Umathunderdelimitervgap", "Unosubscript", "Unosuperscript", "Uoverdelimiter", "Uradical", "Uroot", "Uskewed", "Uskewedwithdelims", "Ustack", "Ustartdisplaymath", "Ustartmath", "Ustopdisplaymath", "Ustopmath", "Usubscript", "Usuperscript", "Uunderdelimiter", "Uvextensible", "adjustspacing", "alignmark", "aligntab", "attribute", "attributedef", "automaticdiscretionary", "automatichyphenmode", "automatichyphenpenalty", "begincsname", "bodydir", "bodydirection", "boxdir", "boxdirection", "breakafterdirmode", "catcodetable", "clearmarks", "copyfont", "compoundhyphenmode", "crampeddisplaystyle", "crampedscriptscriptstyle", "crampedscriptstyle", "crampedtextstyle", "draftmode", "dviextension", "dvifeedback", "dvivariable", "efcode", "etoksapp", "etokspre", "expanded", "expandglyphsinfont", "explicitdiscretionary", "explicithyphenpenalty", "fontid", "formatname", "gleaders", "hjcode", "hyphenationbounds", "hyphenationmin", "hyphenpenaltymode", "ifabsdim", "ifabsnum", "ifincsname", "ifprimitive", "ignoreligaturesinfont", "initcatcodetable", "insertht", "lastnamedcs", "lastsavedboxresourceindex", "lastsavedimageresourceindex", "lastsavedimageresourcepages", "lastxpos", "lastypos", "latelua", "leftghost", "leftmarginkern", "letcharcode", "letterspacefont", "linedir", "linedirection", "localbrokenpenalty", "localinterlinepenalty", "localleftbox", "localrightbox", "lpcode", "luaescapestring", "luafunction", "luatexbanner", "luatexrevision", "luatexversion", "mathdelimitersmode", "mathdir", "mathdirection", "mathdisplayskipmode", "matheqnogapstep", "mathitalicsmode", "mathnolimitsmode", "mathoption", "mathpenaltiesmode", "mathrulesfam", "mathrulesmode", "mathscriptsmode", "mathscriptboxmode", "mathstyle", "mathsurroundmode", "mathsurroundskip", "nohrule", "nokerns", "noligs", "normaldeviate", "nospaces", "novrule", "outputbox", "outputmode", "pagebottomoffset", "pagedir", "pagedirection", "pageheight", "pageleftoffset", "pagerightoffset", "pagetopoffset", "pagewidth", "pardir", "pardirection", "pdfextension", "pdffeedback", "pdfvariable", "postexhyphenchar", "posthyphenchar", "prebinoppenalty", "predisplaygapfactor", "preexhyphenchar", "prehyphenchar", "prerelpenalty", "primitive", "protrudechars", "pxdimen", "quitvmode", "randomseed", "rightghost", "rightmarginkern", "rpcode", "saveboxresource", "savecatcodetable", "saveimageresource", "savepos", "scantextokens", "setfontid", "setrandomseed", "shapemode", "suppressfontnotfounderror", "suppressifcsnameerror", "suppresslongerror", "suppressmathparerror", "suppressoutererror", "suppressprimitiveerror", "synctex", "tagcode", "textdir", "textdirection", "toksapp", "tokspre", "tracingfonts", "uniformdeviate", "useboxresource", "useimageresource" }, + ["omega"]={ "Omegaminorversion", "Omegarevision", "Omegaversion" }, + ["pdftex"]={ "ifpdfabsdim", "ifpdfabsnum", "ifpdfprimitive", "pdfadjustspacing", "pdfannot", "pdfcatalog", "pdfcolorstack", "pdfcolorstackinit", "pdfcompresslevel", "pdfcopyfont", "pdfcreationdate", "pdfdecimaldigits", "pdfdest", "pdfdestmargin", "pdfdraftmode", "pdfeachlinedepth", "pdfeachlineheight", "pdfendlink", "pdfendthread", "pdffirstlineheight", "pdffontattr", "pdffontexpand", "pdffontname", "pdffontobjnum", "pdffontsize", "pdfgamma", "pdfgentounicode", "pdfglyphtounicode", "pdfhorigin", "pdfignoreddimen", "pdfignoreunknownimages", "pdfimageaddfilename", "pdfimageapplygamma", "pdfimagegamma", "pdfimagehicolor", "pdfimageresolution", "pdfincludechars", "pdfinclusioncopyfonts", "pdfinclusionerrorlevel", "pdfinfo", "pdfinfoomitdate", "pdfinsertht", "pdflastannot", "pdflastlinedepth", "pdflastlink", "pdflastobj", "pdflastxform", "pdflastximage", "pdflastximagepages", "pdflastxpos", "pdflastypos", "pdflinkmargin", "pdfliteral", "pdfmapfile", "pdfmapline", "pdfmajorversion", "pdfminorversion", "pdfnames", "pdfnoligatures", "pdfnormaldeviate", "pdfobj", "pdfobjcompresslevel", "pdfoutline", "pdfoutput", "pdfpageattr", "pdfpagebox", "pdfpageheight", "pdfpageref", "pdfpageresources", "pdfpagesattr", "pdfpagewidth", "pdfpkfixeddpi", "pdfpkmode", "pdfpkresolution", "pdfprimitive", "pdfprotrudechars", "pdfpxdimen", "pdfrandomseed", "pdfrefobj", "pdfrefxform", "pdfrefximage", "pdfreplacefont", "pdfrestore", "pdfretval", "pdfsave", "pdfsavepos", "pdfsetmatrix", "pdfsetrandomseed", "pdfstartlink", "pdfstartthread", "pdfsuppressoptionalinfo", "pdfsuppressptexinfo", "pdftexbanner", "pdftexrevision", "pdftexversion", "pdfthread", "pdfthreadmargin", "pdftracingfonts", "pdftrailer", "pdftrailerid", "pdfuniformdeviate", "pdfuniqueresname", "pdfvorigin", "pdfxform", "pdfxformattr", "pdfxformmargin", "pdfxformname", "pdfxformresources", "pdfximage" }, + ["tex"]={ " ", "-", "/", "Uleft", "Umiddle", "Uright", "above", "abovedisplayshortskip", "abovedisplayskip", "abovewithdelims", "accent", "adjdemerits", "advance", "afterassignment", "aftergroup", "atop", "atopwithdelims", "badness", "baselineskip", "batchmode", "begingroup", "belowdisplayshortskip", "belowdisplayskip", "binoppenalty", "botmark", "boundary", "box", "boxmaxdepth", "brokenpenalty", "catcode", "char", "chardef", "cleaders", "closein", "closeout", "clubpenalty", "copy", "count", "countdef", "cr", "crcr", "csname", "csstring", "day", "deadcycles", "def", "defaulthyphenchar", "defaultskewchar", "delcode", "delimiter", "delimiterfactor", "delimitershortfall", "dimen", "dimendef", "directlua", "discretionary", "displayindent", "displaylimits", "displaystyle", "displaywidowpenalty", "displaywidth", "divide", "doublehyphendemerits", "dp", "dump", "edef", "else", "emergencystretch", "end", "endcsname", "endgroup", "endinput", "endlinechar", "eqno", "errhelp", "errmessage", "errorcontextlines", "errorstopmode", "escapechar", "everycr", "everydisplay", "everyhbox", "everyjob", "everymath", "everypar", "everyvbox", "exhyphenchar", "exhyphenpenalty", "expandafter", "fam", "fi", "finalhyphendemerits", "firstmark", "firstvalidlanguage", "floatingpenalty", "font", "fontdimen", "fontname", "futurelet", "gdef", "global", "globaldefs", "halign", "hangafter", "hangindent", "hbadness", "hbox", "hfil", "hfill", "hfilneg", "hfuzz", "hoffset", "holdinginserts", "hpack", "hrule", "hsize", "hskip", "hss", "ht", "hyphenation", "hyphenchar", "hyphenpenalty", "if", "ifcase", "ifcat", "ifdim", "ifeof", "iffalse", "ifhbox", "ifhmode", "ifinner", "ifmmode", "ifnum", "ifodd", "iftrue", "ifvbox", "ifvmode", "ifvoid", "ifx", "ignorespaces", "immediate", "indent", "input", "inputlineno", "insert", "insertpenalties", "interlinepenalty", "jobname", "kern", "language", "lastbox", "lastkern", "lastpenalty", "lastskip", "lccode", "leaders", "left", "lefthyphenmin", "leftskip", "leqno", "let", "limits", "linepenalty", "lineskip", "lineskiplimit", "long", "looseness", "lower", "lowercase", "mag", "mark", "mathaccent", "mathbin", "mathchar", "mathchardef", "mathchoice", "mathclose", "mathcode", "mathinner", "mathop", "mathopen", "mathord", "mathpunct", "mathrel", "mathsurround", "maxdeadcycles", "maxdepth", "meaning", "medmuskip", "message", "middle", "mkern", "month", "moveleft", "moveright", "mskip", "multiply", "muskip", "muskipdef", "newlinechar", "noalign", "noboundary", "noexpand", "noindent", "nolimits", "nonscript", "nonstopmode", "nulldelimiterspace", "nullfont", "number", "omit", "openin", "openout", "or", "outer", "output", "outputpenalty", "over", "overfullrule", "overline", "overwithdelims", "pagedepth", "pagefilllstretch", "pagefillstretch", "pagefilstretch", "pagegoal", "pageshrink", "pagestretch", "pagetotal", "par", "parfillskip", "parindent", "parshape", "parskip", "patterns", "pausing", "penalty", "postdisplaypenalty", "predisplaypenalty", "predisplaysize", "pretolerance", "prevdepth", "prevgraf", "protrusionboundary", "radical", "raise", "read", "relax", "relpenalty", "right", "righthyphenmin", "rightskip", "romannumeral", "scriptfont", "scriptscriptfont", "scriptscriptstyle", "scriptspace", "scriptstyle", "scrollmode", "setbox", "setlanguage", "sfcode", "shipout", "show", "showbox", "showboxbreadth", "showboxdepth", "showlists", "showthe", "skewchar", "skip", "skipdef", "spacefactor", "spaceskip", "span", "special", "splitbotmark", "splitfirstmark", "splitmaxdepth", "splittopskip", "string", "tabskip", "textfont", "textstyle", "the", "thickmuskip", "thinmuskip", "time", "toks", "toksdef", "tolerance", "topmark", "topskip", "tpack", "tracingcommands", "tracinglostchars", "tracingmacros", "tracingonline", "tracingoutput", "tracingpages", "tracingparagraphs", "tracingrestores", "tracingstats", "uccode", "uchyph", "underline", "unhbox", "unhcopy", "unkern", "unpenalty", "unskip", "unvbox", "unvcopy", "uppercase", "vadjust", "valign", "vbadness", "vbox", "vcenter", "vfil", "vfill", "vfilneg", "vfuzz", "voffset", "vpack", "vrule", "vsize", "vskip", "vsplit", "vss", "vtop", "wd", "widowpenalty", "wordboundary", "write", "xdef", "xleaders", "xspaceskip", "year" }, ["xetex"]={ "XeTeXversion" }, }
\ No newline at end of file diff --git a/context/data/scite/context/lexers/scite-context-lexer-lua.lua b/context/data/scite/context/lexers/scite-context-lexer-lua.lua index d35ad5b15..ba14f5206 100644 --- a/context/data/scite/context/lexers/scite-context-lexer-lua.lua +++ b/context/data/scite/context/lexers/scite-context-lexer-lua.lua @@ -46,7 +46,7 @@ local functions = { "pcall", "print", "rawequal", "rawget", "rawset", "require", "setmetatable", "tonumber", "tostring", "type", "unpack", "xpcall", "select", - "string", "table", "coroutine", "debug", "file", "io", "lpeg", "math", "os", "package", "bit32", + "string", "table", "coroutine", "debug", "file", "io", "lpeg", "math", "os", "package", "bit32", "utf8", } local constants = { diff --git a/context/data/scite/context/lexers/scite-context-lexer-tex.lua b/context/data/scite/context/lexers/scite-context-lexer-tex.lua index 4787263a3..2c2421d2f 100644 --- a/context/data/scite/context/lexers/scite-context-lexer-tex.lua +++ b/context/data/scite/context/lexers/scite-context-lexer-tex.lua @@ -57,24 +57,36 @@ do -- todo: only once, store in global local definitions = context.loaddefinitions("scite-context-data-interfaces") if definitions then - local list = { } + local used = { } for interface, list in next, definitions do - list[#list+1] = interface - local c = { } - for i=1,#list do - c[list[i]] = true - end - if interface ~= "en" then + if interface ~= "common" then + used[#used+1] = interface + local c = { } + -- these are shared + local list = definitions.common + if list then + for i=1,#list do + c[list[i]] = true + end + end + -- normally this one is empty list = definitions.en if list then for i=1,#list do c[list[i]] = true end end + -- these are interface specific + if interface ~= "en" then + for i=1,#list do + c[list[i]] = true + end + end + commands[interface] = c end - commands[interface] = c end - inform("context user interfaces '%s' supported",table.concat(list," ")) + table.sort(used) + inform("context user interfaces '%s' supported",table.concat(used," ")) end local definitions = context.loaddefinitions("scite-context-data-context") @@ -222,10 +234,12 @@ local p_comment = commentline ----- p_helper = backslash * exact_match(helpers) ----- p_primitive = backslash * exact_match(primitives) -local p_command = backslash * lexer.helpers.utfchartabletopattern(currentcommands) * #(1-cstoken) -local p_constant = backslash * lexer.helpers.utfchartabletopattern(constants) * #(1-cstoken) -local p_helper = backslash * lexer.helpers.utfchartabletopattern(helpers) * #(1-cstoken) -local p_primitive = backslash * lexer.helpers.utfchartabletopattern(primitives) * #(1-cstoken) +local p_csdone = #(1-cstoken) + P(-1) + +local p_command = backslash * lexer.helpers.utfchartabletopattern(currentcommands) * p_csdone +local p_constant = backslash * lexer.helpers.utfchartabletopattern(constants) * p_csdone +local p_helper = backslash * lexer.helpers.utfchartabletopattern(helpers) * p_csdone +local p_primitive = backslash * lexer.helpers.utfchartabletopattern(primitives) * p_csdone local p_ifprimitive = P("\\if") * cstoken^1 local p_csname = backslash * (cstoken^1 + P(1)) @@ -403,7 +417,7 @@ local luaenvironment = P("lua") * (P("setups") + P("code") + P(true)) local inlinelua = P("\\") * ( P("ctx") * (P("lua") + P("command") + P("late") * (P("lua") + P("command")) + P("function")) + P("cld") * (P("command") + P("context")) - + P("luaexpr") + + P("lua") * (P("expr") + P("script") + P("thread")) + (P("direct") + P("late")) * P("lua") ) @@ -448,12 +462,17 @@ local stopmetafuncode = token("embedded", stopmetafun) local callers = token("embedded", P("\\") * metafuncall) * metafunarguments + token("embedded", P("\\") * luacall) -lexer.embed_lexer(contextlexer, cldlexer, startluacode, stopluacode) lexer.embed_lexer(contextlexer, mpslexer, startmetafuncode, stopmetafuncode) +lexer.embed_lexer(contextlexer, cldlexer, startluacode, stopluacode) + +-- preamble is inefficient as it probably gets called each time (so some day I really need to +-- patch the plugin) + +contextlexer._preamble = preamble contextlexer._rules = { { "whitespace", spacing }, - { "preamble", preamble }, + -- { "preamble", preamble }, { "word", word }, { "text", text }, -- non words { "comment", comment }, @@ -461,10 +480,10 @@ contextlexer._rules = { -- { "subsystem", subsystem }, { "callers", callers }, { "subsystem", subsystem }, + { "ifprimitive", ifprimitive }, { "helper", helper }, { "command", command }, { "primitive", primitive }, - { "ifprimitive", ifprimitive }, -- { "subsystem", subsystem }, { "reserved", reserved }, { "csname", csname }, @@ -492,10 +511,10 @@ if web then { "comment", comment }, { "constant", constant }, { "callers", callers }, + { "ifprimitive", ifprimitive }, { "helper", helper }, { "command", command }, { "primitive", primitive }, - { "ifprimitive", ifprimitive }, { "reserved", reserved }, { "csname", csname }, { "grouping", grouping }, @@ -516,10 +535,10 @@ else { "comment", comment }, { "constant", constant }, { "callers", callers }, + { "ifprimitive", ifprimitive }, { "helper", helper }, { "command", command }, { "primitive", primitive }, - { "ifprimitive", ifprimitive }, { "reserved", reserved }, { "csname", csname }, { "grouping", grouping }, diff --git a/context/data/scite/context/lexers/scite-context-lexer.lua b/context/data/scite/context/lexers/scite-context-lexer.lua index af21461b9..fc16e261a 100644 --- a/context/data/scite/context/lexers/scite-context-lexer.lua +++ b/context/data/scite/context/lexers/scite-context-lexer.lua @@ -19,6 +19,10 @@ local inspect = false -- can save some 15% (maybe easier on scintilla) -- local log = true -- local trace = true +-- local f = io.open("e:/tmp/lexers.log","w") +-- print = function(...) +-- f:write(...,"\n") +-- end -- GET GOING -- @@ -292,7 +296,7 @@ local inspect = false -- can save some 15% (maybe easier on scintilla) local lpeg = require("lpeg") local global = _G -local find, gmatch, match, lower, upper, gsub, sub, format = string.find, string.gmatch, string.match, string.lower, string.upper, string.gsub, string.sub, string.format +local find, gmatch, match, lower, upper, gsub, sub, format, byte = string.find, string.gmatch, string.match, string.lower, string.upper, string.gsub, string.sub, string.format, string.byte local concat, sort = table.concat, table.sort local type, next, setmetatable, rawset, tonumber, tostring = type, next, setmetatable, rawset, tonumber, tostring local R, P, S, V, C, Cp, Cs, Ct, Cmt, Cc, Cf, Cg, Carg = lpeg.R, lpeg.P, lpeg.S, lpeg.V, lpeg.C, lpeg.Cp, lpeg.Cs, lpeg.Ct, lpeg.Cmt, lpeg.Cc, lpeg.Cf, lpeg.Cg, lpeg.Carg @@ -1034,7 +1038,12 @@ end -- }, -- } -local lists = { } +local lists = { } +local disabled = false + +function context.disablewordcheck() + disabled = true +end function context.setwordlist(tag,limit) -- returns hash (lowercase keys and original values) if not tag or tag == "" then @@ -1454,25 +1463,30 @@ local function add_lexer(grammar, lexer) -- mostly the same as the original end local function build_grammar(lexer,initial_rule) -- same as the original - local children = lexer._CHILDREN + local children = lexer._CHILDREN local lexer_name = lexer._NAME + local preamble = lexer._preamble if children then if not initial_rule then initial_rule = lexer_name end - local grammar = { initial_rule } + grammar = { initial_rule } add_lexer(grammar, lexer) lexer._INITIALRULE = initial_rule - lexer._GRAMMAR = Ct(P(grammar)) + grammar = Ct(P(grammar)) if trace then report("building grammar for '%s' with whitespace '%s'and %s children",lexer_name,lexer.whitespace or "?",#children) end else - lexer._GRAMMAR = Ct(join_tokens(lexer)^0) + grammar = Ct(join_tokens(lexer)^0) if trace then report("building grammar for '%s' with whitespace '%s'",lexer_name,lexer.whitespace or "?") end end + if preamble then + grammar = preamble^-1 * grammar + end + lexer._GRAMMAR = grammar end -- So far. We need these local functions in the next one. @@ -1618,6 +1632,27 @@ function context.lex(lexer,text,init_style) report("lexing '%s' with initial style '%s' and %s children",lexer._NAME,#lexer._CHILDREN or 0,init_style) end return matched(lexer,grammar,text) +-- local result = matched(lexer,grammar,text) +-- local fil = io.open("e:/tmp/foo.log","w") +-- local len = #text +-- local old = 1 +-- local txt = false +-- for i=1,#result,2 do +-- local tag = result[i] +-- local pos = result[i+1] +-- if nxt and tag == "text" then +-- local wrd = sub(text,old,pos-1) +-- fil:write(tag,"\t",wrd,"\n") +-- if txt then +-- result[i] = "internal" +-- txt = false +-- else +-- txt = true +-- end +-- end +-- old = pos +-- end +-- fil:close() else if trace then report("lexing '%s' with initial style '%s'",lexer._NAME,init_style) @@ -1855,9 +1890,11 @@ function context.loadlexer(filename,namespace) add_style(lexer, token, style) end end - for i=1,#_r do - local rule = _r[i] - add_rule(lexer, rule[1], rule[2]) + if _r then + for i=1,#_r do + local rule = _r[i] + add_rule(lexer, rule[1], rule[2]) + end end build_grammar(lexer) end @@ -2084,10 +2121,20 @@ do -- return make(tree) -- end - helpers.utfcharpattern = P(1) * R("\128\191")^0 -- unchecked but fast + local utf8next = R("\128\191") + local utf8one = R("\000\127") + local utf8two = R("\194\223") * utf8next + local utf8three = R("\224\239") * utf8next * utf8next + local utf8four = R("\240\244") * utf8next * utf8next * utf8next + + helpers.utfcharpattern = P(1) * utf8next^0 -- unchecked but fast + helpers.utfbytepattern = utf8one / byte + + utf8two / function(s) local c1, c2 = byte(s,1,2) return c1 * 64 + c2 - 12416 end + + utf8three / function(s) local c1, c2, c3 = byte(s,1,3) return (c1 * 64 + c2) * 64 + c3 - 925824 end + + utf8four / function(s) local c1, c2, c3, c4 = byte(s,1,4) return ((c1 * 64 + c2) * 64 + c3) * 64 + c4 - 63447168 end - local p_false = P(false) - local p_true = P(true) + local p_false = P(false) + local p_true = P(true) local function make(t) local function making(t) diff --git a/context/data/scite/context/scite-context-data-context.properties b/context/data/scite/context/scite-context-data-context.properties index 1d091746b..acc704051 100644 --- a/context/data/scite/context/scite-context-data-context.properties +++ b/context/data/scite/context/scite-context-data-context.properties @@ -10,63 +10,65 @@ onemuskip pluscxxvii pluscxxviii pluscclv pluscclvi \ normalpagebox endoflinetoken outputnewlinechar emptytoks empty \ undefined voidbox emptybox emptyvbox emptyhbox \ bigskipamount medskipamount smallskipamount fmtname fmtversion \ -texengine texenginename texengineversion luatexengine pdftexengine \ -xetexengine unknownengine activecatcode bgroup egroup \ -endline conditionaltrue conditionalfalse attributeunsetvalue uprotationangle \ -rightrotationangle downrotationangle leftrotationangle inicatcodes ctxcatcodes \ -texcatcodes notcatcodes txtcatcodes vrbcatcodes prtcatcodes \ -nilcatcodes luacatcodes tpacatcodes tpbcatcodes xmlcatcodes \ -ctdcatcodes escapecatcode begingroupcatcode endgroupcatcode mathshiftcatcode \ -alignmentcatcode endoflinecatcode parametercatcode superscriptcatcode subscriptcatcode \ -ignorecatcode spacecatcode lettercatcode othercatcode activecatcode \ -commentcatcode invalidcatcode tabasciicode newlineasciicode formfeedasciicode \ -endoflineasciicode endoffileasciicode spaceasciicode hashasciicode dollarasciicode \ -commentasciicode ampersandasciicode colonasciicode backslashasciicode circumflexasciicode \ -underscoreasciicode leftbraceasciicode barasciicode rightbraceasciicode tildeasciicode \ -delasciicode lessthanasciicode morethanasciicode doublecommentsignal atsignasciicode \ -exclamationmarkasciicode questionmarkasciicode doublequoteasciicode singlequoteasciicode forwardslashasciicode \ -primeasciicode hyphenasciicode activemathcharcode activetabtoken activeformfeedtoken \ -activeendoflinetoken batchmodecode nonstopmodecode scrollmodecode errorstopmodecode \ -bottomlevelgroupcode simplegroupcode hboxgroupcode adjustedhboxgroupcode vboxgroupcode \ -vtopgroupcode aligngroupcode noaligngroupcode outputgroupcode mathgroupcode \ -discretionarygroupcode insertgroupcode vcentergroupcode mathchoicegroupcode semisimplegroupcode \ -mathshiftgroupcode mathleftgroupcode vadjustgroupcode charnodecode hlistnodecode \ -vlistnodecode rulenodecode insertnodecode marknodecode adjustnodecode \ -ligaturenodecode discretionarynodecode whatsitnodecode mathnodecode gluenodecode \ -kernnodecode penaltynodecode unsetnodecode mathsnodecode charifcode \ -catifcode numifcode dimifcode oddifcode vmodeifcode \ -hmodeifcode mmodeifcode innerifcode voidifcode hboxifcode \ -vboxifcode xifcode eofifcode trueifcode falseifcode \ -caseifcode definedifcode csnameifcode fontcharifcode fontslantperpoint \ -fontinterwordspace fontinterwordstretch fontinterwordshrink fontexheight fontemwidth \ -fontextraspace slantperpoint interwordspace interwordstretch interwordshrink \ -exheight emwidth extraspace mathsupdisplay mathsupnormal \ -mathsupcramped mathsubnormal mathsubcombined mathaxisheight muquad \ -startmode stopmode startnotmode stopnotmode startmodeset \ -stopmodeset doifmode doifelsemode doifmodeelse doifnotmode \ -startmodeset stopmodeset startallmodes stopallmodes startnotallmodes \ -stopnotallmodes doifallmodes doifelseallmodes doifallmodeselse doifnotallmodes \ -startenvironment stopenvironment environment startcomponent stopcomponent \ -component startproduct stopproduct product startproject \ -stopproject project starttext stoptext startnotext \ -stopnotext startdocument stopdocument documentvariable unexpandeddocumentvariable \ -setupdocument presetdocument startmodule stopmodule usemodule \ -usetexmodule useluamodule setupmodule currentmoduleparameter moduleparameter \ -everystarttext everystoptext startTEXpage stopTEXpage enablemode \ -disablemode preventmode definemode globalenablemode globaldisablemode \ -globalpreventmode pushmode popmode typescriptone typescripttwo \ -typescriptthree mathsizesuffix mathordcode mathopcode mathbincode \ -mathrelcode mathopencode mathclosecode mathpunctcode mathalphacode \ -mathinnercode mathnothingcode mathlimopcode mathnolopcode mathboxcode \ -mathchoicecode mathaccentcode mathradicalcode constantnumber constantnumberargument \ -constantdimen constantdimenargument constantemptyargument continueifinputfile luastringsep \ -!!bs !!es lefttorightmark righttoleftmark breakablethinspace \ +texengine texenginename texengineversion texenginefunctionality luatexengine \ +pdftexengine xetexengine unknownengine activecatcode bgroup \ +egroup endline conditionaltrue conditionalfalse attributeunsetvalue \ +uprotationangle rightrotationangle downrotationangle leftrotationangle inicatcodes \ +ctxcatcodes texcatcodes notcatcodes txtcatcodes vrbcatcodes \ +prtcatcodes nilcatcodes luacatcodes tpacatcodes tpbcatcodes \ +xmlcatcodes ctdcatcodes escapecatcode begingroupcatcode endgroupcatcode \ +mathshiftcatcode alignmentcatcode endoflinecatcode parametercatcode superscriptcatcode \ +subscriptcatcode ignorecatcode spacecatcode lettercatcode othercatcode \ +activecatcode commentcatcode invalidcatcode tabasciicode newlineasciicode \ +formfeedasciicode endoflineasciicode endoffileasciicode spaceasciicode hashasciicode \ +dollarasciicode commentasciicode ampersandasciicode colonasciicode backslashasciicode \ +circumflexasciicode underscoreasciicode leftbraceasciicode barasciicode rightbraceasciicode \ +tildeasciicode delasciicode lessthanasciicode morethanasciicode doublecommentsignal \ +atsignasciicode exclamationmarkasciicode questionmarkasciicode doublequoteasciicode singlequoteasciicode \ +forwardslashasciicode primeasciicode hyphenasciicode activemathcharcode activetabtoken \ +activeformfeedtoken activeendoflinetoken batchmodecode nonstopmodecode scrollmodecode \ +errorstopmodecode bottomlevelgroupcode simplegroupcode hboxgroupcode adjustedhboxgroupcode \ +vboxgroupcode vtopgroupcode aligngroupcode noaligngroupcode outputgroupcode \ +mathgroupcode discretionarygroupcode insertgroupcode vcentergroupcode mathchoicegroupcode \ +semisimplegroupcode mathshiftgroupcode mathleftgroupcode vadjustgroupcode charnodecode \ +hlistnodecode vlistnodecode rulenodecode insertnodecode marknodecode \ +adjustnodecode ligaturenodecode discretionarynodecode whatsitnodecode mathnodecode \ +gluenodecode kernnodecode penaltynodecode unsetnodecode mathsnodecode \ +charifcode catifcode numifcode dimifcode oddifcode \ +vmodeifcode hmodeifcode mmodeifcode innerifcode voidifcode \ +hboxifcode vboxifcode xifcode eofifcode trueifcode \ +falseifcode caseifcode definedifcode csnameifcode fontcharifcode \ +fontslantperpoint fontinterwordspace fontinterwordstretch fontinterwordshrink fontexheight \ +fontemwidth fontextraspace slantperpoint mathexheight mathemwidth \ +interwordspace interwordstretch interwordshrink exheight emwidth \ +extraspace mathsupdisplay mathsupnormal mathsupcramped mathsubnormal \ +mathsubcombined mathaxisheight muquad startmode stopmode \ +startnotmode stopnotmode startmodeset stopmodeset doifmode \ +doifelsemode doifmodeelse doifnotmode startmodeset stopmodeset \ +startallmodes stopallmodes startnotallmodes stopnotallmodes doifallmodes \ +doifelseallmodes doifallmodeselse doifnotallmodes startenvironment stopenvironment \ +environment startcomponent stopcomponent component startproduct \ +stopproduct product startproject stopproject project \ +starttext stoptext startnotext stopnotext startdocument \ +stopdocument documentvariable unexpandeddocumentvariable setupdocument presetdocument \ +startmodule stopmodule usemodule usetexmodule useluamodule \ +setupmodule currentmoduleparameter moduleparameter everystarttext everystoptext \ +startTEXpage stopTEXpage enablemode disablemode preventmode \ +definemode globalenablemode globaldisablemode globalpreventmode pushmode \ +popmode typescriptone typescripttwo typescriptthree mathsizesuffix \ +mathordcode mathopcode mathbincode mathrelcode mathopencode \ +mathclosecode mathpunctcode mathalphacode mathinnercode mathnothingcode \ +mathlimopcode mathnolopcode mathboxcode mathchoicecode mathaccentcode \ +mathradicalcode constantnumber constantnumberargument constantdimen constantdimenargument \ +constantemptyargument continueifinputfile luastringsep !!bs !!es \ +lefttorightmark righttoleftmark lrm rlm bidilre \ +bidirle bidipop bidilro bidirlo breakablethinspace \ nobreakspace nonbreakablespace narrownobreakspace zerowidthnobreakspace ideographicspace \ ideographichalffillspace twoperemspace threeperemspace fourperemspace fiveperemspace \ -sixperemspace figurespace punctuationspace hairspace zerowidthspace \ -zerowidthnonjoiner zerowidthjoiner zwnj zwj optionalspace \ -asciispacechar Ux eUx Umathaccents parfillleftskip \ -parfillrightskip +sixperemspace figurespace punctuationspace hairspace enquad \ +emquad zerowidthspace zerowidthnonjoiner zerowidthjoiner zwnj \ +zwj optionalspace asciispacechar softhyphen Ux \ +eUx Umathaccents parfillleftskip parfillrightskip keywordclass.context.helpers=\ startsetups stopsetups startxmlsetups stopxmlsetups \ @@ -87,59 +89,61 @@ thirdargumentfalse thirdargumenttrue fourthargumentfalse fourthargumenttrue fift fifthsargumenttrue sixthargumentfalse sixtsargumenttrue doglobal dodoglobal \ redoglobal resetglobal donothing dontcomplain forgetall \ donetrue donefalse foundtrue foundfalse inlineordisplaymath \ -indisplaymath forcedisplaymath startforceddisplaymath stopforceddisplaymath reqno \ -mathortext htdp unvoidbox hfilll vfilll \ -mathbox mathlimop mathnolop mathnothing mathalpha \ -currentcatcodetable defaultcatcodetable catcodetablename newcatcodetable startcatcodetable \ -stopcatcodetable startextendcatcodetable stopextendcatcodetable pushcatcodetable popcatcodetable \ -restorecatcodes setcatcodetable letcatcodecommand defcatcodecommand uedcatcodecommand \ -hglue vglue hfillneg vfillneg hfilllneg \ -vfilllneg ruledhss ruledhfil ruledhfill ruledhfilneg \ -ruledhfillneg normalhfillneg ruledvss ruledvfil ruledvfill \ -ruledvfilneg ruledvfillneg normalvfillneg ruledhbox ruledvbox \ -ruledvtop ruledvcenter ruledmbox ruledhpack ruledvpack \ -ruledtpack ruledhskip ruledvskip ruledkern ruledmskip \ -ruledmkern ruledhglue ruledvglue normalhglue normalvglue \ -ruledpenalty filledhboxb filledhboxr filledhboxg filledhboxc \ -filledhboxm filledhboxy filledhboxk scratchcounter globalscratchcounter \ -privatescratchcounter scratchdimen globalscratchdimen privatescratchdimen scratchskip \ -globalscratchskip privatescratchskip scratchmuskip globalscratchmuskip privatescratchmuskip \ -scratchtoks globalscratchtoks privatescratchtoks scratchbox globalscratchbox \ -privatescratchbox normalbaselineskip normallineskip normallineskiplimit availablehsize \ -localhsize setlocalhsize distributedhsize hsizefraction nextbox \ -dowithnextbox dowithnextboxcs dowithnextboxcontent dowithnextboxcontentcs flushnextbox \ -scratchwidth scratchheight scratchdepth scratchoffset scratchdistance \ -scratchhsize scratchvsize scratchxoffset scratchyoffset scratchhoffset \ -scratchvoffset scratchxposition scratchyposition scratchtopoffset scratchbottomoffset \ -scratchleftoffset scratchrightoffset scratchcounterone scratchcountertwo scratchcounterthree \ -scratchcounterfour scratchcounterfive scratchcountersix scratchdimenone scratchdimentwo \ -scratchdimenthree scratchdimenfour scratchdimenfive scratchdimensix scratchskipone \ -scratchskiptwo scratchskipthree scratchskipfour scratchskipfive scratchskipsix \ -scratchmuskipone scratchmuskiptwo scratchmuskipthree scratchmuskipfour scratchmuskipfive \ -scratchmuskipsix scratchtoksone scratchtokstwo scratchtoksthree scratchtoksfour \ -scratchtoksfive scratchtokssix scratchboxone scratchboxtwo scratchboxthree \ -scratchboxfour scratchboxfive scratchboxsix scratchnx scratchny \ -scratchmx scratchmy scratchunicode scratchmin scratchmax \ -scratchleftskip scratchrightskip scratchtopskip scratchbottomskip doif \ -doifnot doifelse doifinset doifnotinset doifelseinset \ -doifinsetelse doifelsenextchar doifnextcharelse doifelsenextoptional doifnextoptionalelse \ -doifelsenextoptionalcs doifnextoptionalcselse doifelsefastoptionalcheck doiffastoptionalcheckelse doifelsenextbgroup \ -doifnextbgroupelse doifelsenextbgroupcs doifnextbgroupcselse doifelsenextparenthesis doifnextparenthesiselse \ -doifelseundefined doifundefinedelse doifelsedefined doifdefinedelse doifundefined \ -doifdefined doifelsevalue doifvalue doifnotvalue doifnothing \ -doifsomething doifelsenothing doifnothingelse doifelsesomething doifsomethingelse \ -doifvaluenothing doifvaluesomething doifelsevaluenothing doifvaluenothingelse doifelsedimension \ -doifdimensionelse doifelsenumber doifnumberelse doifnumber doifnotnumber \ -doifelsecommon doifcommonelse doifcommon doifnotcommon doifinstring \ -doifnotinstring doifelseinstring doifinstringelse doifelseassignment doifassignmentelse \ -docheckassignment tracingall tracingnone loggingall removetoks \ -appendtoks prependtoks appendtotoks prependtotoks to \ -endgraf endpar everyendpar reseteverypar finishpar \ -empty null space quad enspace \ -emspace charspace nbsp crlf obeyspaces \ -obeylines obeyedspace obeyedline obeyedtab obeyedpage \ -normalspace executeifdefined singleexpandafter doubleexpandafter tripleexpandafter \ -dontleavehmode removelastspace removeunwantedspaces keepunwantedspaces removepunctuation \ +indisplaymath forcedisplaymath startforceddisplaymath stopforceddisplaymath startpickupmath \ +stoppickupmath reqno mathortext htdp unvoidbox \ +hfilll vfilll mathbox mathlimop mathnolop \ +mathnothing mathalpha currentcatcodetable defaultcatcodetable catcodetablename \ +newcatcodetable startcatcodetable stopcatcodetable startextendcatcodetable stopextendcatcodetable \ +pushcatcodetable popcatcodetable restorecatcodes setcatcodetable letcatcodecommand \ +defcatcodecommand uedcatcodecommand hglue vglue hfillneg \ +vfillneg hfilllneg vfilllneg ruledhss ruledhfil \ +ruledhfill ruledhfilneg ruledhfillneg normalhfillneg ruledvss \ +ruledvfil ruledvfill ruledvfilneg ruledvfillneg normalvfillneg \ +ruledhbox ruledvbox ruledvtop ruledvcenter ruledmbox \ +ruledhpack ruledvpack ruledtpack ruledhskip ruledvskip \ +ruledkern ruledmskip ruledmkern ruledhglue ruledvglue \ +normalhglue normalvglue ruledpenalty filledhboxb filledhboxr \ +filledhboxg filledhboxc filledhboxm filledhboxy filledhboxk \ +scratchcounter globalscratchcounter privatescratchcounter scratchdimen globalscratchdimen \ +privatescratchdimen scratchskip globalscratchskip privatescratchskip scratchmuskip \ +globalscratchmuskip privatescratchmuskip scratchtoks globalscratchtoks privatescratchtoks \ +scratchbox globalscratchbox privatescratchbox normalbaselineskip normallineskip \ +normallineskiplimit availablehsize localhsize setlocalhsize distributedhsize \ +hsizefraction nextbox dowithnextbox dowithnextboxcs dowithnextboxcontent \ +dowithnextboxcontentcs flushnextbox scratchwidth scratchheight scratchdepth \ +scratchoffset scratchdistance scratchhsize scratchvsize scratchxoffset \ +scratchyoffset scratchhoffset scratchvoffset scratchxposition scratchyposition \ +scratchtopoffset scratchbottomoffset scratchleftoffset scratchrightoffset scratchcounterone \ +scratchcountertwo scratchcounterthree scratchcounterfour scratchcounterfive scratchcountersix \ +scratchdimenone scratchdimentwo scratchdimenthree scratchdimenfour scratchdimenfive \ +scratchdimensix scratchskipone scratchskiptwo scratchskipthree scratchskipfour \ +scratchskipfive scratchskipsix scratchmuskipone scratchmuskiptwo scratchmuskipthree \ +scratchmuskipfour scratchmuskipfive scratchmuskipsix scratchtoksone scratchtokstwo \ +scratchtoksthree scratchtoksfour scratchtoksfive scratchtokssix scratchboxone \ +scratchboxtwo scratchboxthree scratchboxfour scratchboxfive scratchboxsix \ +scratchnx scratchny scratchmx scratchmy scratchunicode \ +scratchmin scratchmax scratchleftskip scratchrightskip scratchtopskip \ +scratchbottomskip doif doifnot doifelse doifinset \ +doifnotinset doifelseinset doifinsetelse doifelsenextchar doifnextcharelse \ +doifelsenextoptional doifnextoptionalelse doifelsenextoptionalcs doifnextoptionalcselse doifelsefastoptionalcheck \ +doiffastoptionalcheckelse doifelsefastoptionalcheckcs doiffastoptionalcheckcselse doifelsenextbgroup doifnextbgroupelse \ +doifelsenextbgroupcs doifnextbgroupcselse doifelsenextparenthesis doifnextparenthesiselse doifelseundefined \ +doifundefinedelse doifelsedefined doifdefinedelse doifundefined doifdefined \ +doifelsevalue doifvalue doifnotvalue doifnothing doifsomething \ +doifelsenothing doifnothingelse doifelsesomething doifsomethingelse doifvaluenothing \ +doifvaluesomething doifelsevaluenothing doifvaluenothingelse doifelsedimension doifdimensionelse \ +doifelsenumber doifnumberelse doifnumber doifnotnumber doifelsecommon \ +doifcommonelse doifcommon doifnotcommon doifinstring doifnotinstring \ +doifelseinstring doifinstringelse doifelseassignment doifassignmentelse docheckassignment \ +doiftext doifelsetext doiftextelse doifnottext tracingall \ +tracingnone loggingall removetoks appendtoks prependtoks \ +appendtotoks prependtotoks to endgraf endpar \ +everyendpar reseteverypar finishpar empty null \ +space quad enspace emspace charspace \ +nbsp crlf obeyspaces obeylines obeyedspace \ +obeyedline obeyedtab obeyedpage normalspace executeifdefined \ +singleexpandafter doubleexpandafter tripleexpandafter dontleavehmode removelastspace \ +removeunwantedspaces keepunwantedspaces removepunctuation ignoreparskip forcestrutdepth \ wait writestatus define defineexpandable redefine \ setmeasure setemeasure setgmeasure setxmeasure definemeasure \ freezemeasure measure measured installcorenamespace getvalue \ @@ -163,19 +167,20 @@ gobblethreearguments gobblefourarguments gobblefivearguments gobblesixarguments gobbleeightarguments gobbleninearguments gobbletenarguments gobbleoneoptional gobbletwooptionals \ gobblethreeoptionals gobblefouroptionals gobblefiveoptionals dorecurse doloop \ exitloop dostepwiserecurse recurselevel recursedepth dofastloopcs \ -dowith newconstant setnewconstant setconstant setconstantvalue \ -newconditional settrue setfalse settruevalue setfalsevalue \ -newmacro setnewmacro newfraction newsignal dosingleempty \ -dodoubleempty dotripleempty doquadrupleempty doquintupleempty dosixtupleempty \ -doseventupleempty dosingleargument dodoubleargument dotripleargument doquadrupleargument \ -doquintupleargument dosixtupleargument doseventupleargument dosinglegroupempty dodoublegroupempty \ -dotriplegroupempty doquadruplegroupempty doquintuplegroupempty permitspacesbetweengroups dontpermitspacesbetweengroups \ -nopdfcompression maximumpdfcompression normalpdfcompression modulonumber dividenumber \ -getfirstcharacter doifelsefirstchar doiffirstcharelse startnointerference stopnointerference \ -twodigits threedigits leftorright offinterlineskip oninterlineskip \ -nointerlineskip strut halfstrut quarterstrut depthstrut \ -setstrut strutbox strutht strutdp strutwd \ -struthtdp begstrut endstrut lineheight leftboundary \ +fastloopindex fastloopfinal dowith newconstant setnewconstant \ +setconstant setconstantvalue newconditional settrue setfalse \ +settruevalue setfalsevalue newmacro setnewmacro newfraction \ +newsignal dosingleempty dodoubleempty dotripleempty doquadrupleempty \ +doquintupleempty dosixtupleempty doseventupleempty dosingleargument dodoubleargument \ +dotripleargument doquadrupleargument doquintupleargument dosixtupleargument doseventupleargument \ +dosinglegroupempty dodoublegroupempty dotriplegroupempty doquadruplegroupempty doquintuplegroupempty \ +permitspacesbetweengroups dontpermitspacesbetweengroups nopdfcompression maximumpdfcompression normalpdfcompression \ +modulonumber dividenumber getfirstcharacter doifelsefirstchar doiffirstcharelse \ +startnointerference stopnointerference twodigits threedigits leftorright \ +offinterlineskip oninterlineskip nointerlineskip strut halfstrut \ +quarterstrut depthstrut halflinestrut noheightstrut setstrut \ +strutbox strutht strutdp strutwd struthtdp \ +strutgap begstrut endstrut lineheight leftboundary \ rightboundary signalcharacter ordordspacing ordopspacing ordbinspacing \ ordrelspacing ordopenspacing ordclosespacing ordpunctspacing ordinnerspacing \ opordspacing opopspacing opbinspacing oprelspacing opopenspacing \ @@ -191,30 +196,33 @@ punctclosespacing punctpunctspacing punctinnerspacing innerordspacing inneropspa innerbinspacing innerrelspacing inneropenspacing innerclosespacing innerpunctspacing \ innerinnerspacing normalreqno startimath stopimath normalstartimath \ normalstopimath startdmath stopdmath normalstartdmath normalstopdmath \ -normalsuperscript normalsubscript uncramped cramped triggermathstyle \ -mathstylefont mathsmallstylefont mathstyleface mathsmallstyleface mathstylecommand \ -mathpalette mathstylehbox mathstylevbox mathstylevcenter mathstylevcenteredhbox \ -mathstylevcenteredvbox mathtext setmathsmalltextbox setmathtextbox pushmathstyle \ -popmathstyle triggerdisplaystyle triggertextstyle triggerscriptstyle triggerscriptscriptstyle \ -triggeruncrampedstyle triggercrampedstyle triggersmallstyle triggeruncrampedsmallstyle triggercrampedsmallstyle \ -triggerbigstyle triggeruncrampedbigstyle triggercrampedbigstyle luaexpr expelsedoif \ -expdoif expdoifnot expdoifelsecommon expdoifcommonelse expdoifelseinset \ -expdoifinsetelse ctxdirectlua ctxlatelua ctxsprint ctxwrite \ -ctxcommand ctxdirectcommand ctxlatecommand ctxreport ctxlua \ -luacode lateluacode directluacode registerctxluafile ctxloadluafile \ -luaversion luamajorversion luaminorversion ctxluacode luaconditional \ -luaexpanded startluaparameterset stopluaparameterset luaparameterset definenamedlua \ -obeylualines obeyluatokens startluacode stopluacode startlua \ -stoplua startctxfunction stopctxfunction ctxfunction startctxfunctiondefinition \ -stopctxfunctiondefinition installctxfunction cldprocessfile cldloadfile cldcontext \ -cldcommand carryoverpar lastlinewidth assumelongusagecs Umathbotaccent \ -righttolefthbox lefttorighthbox righttoleftvbox lefttorightvbox righttoleftvtop \ -lefttorightvtop rtlhbox ltrhbox rtlvbox ltrvbox \ -rtlvtop ltrvtop autodirhbox autodirvbox autodirvtop \ -leftorrighthbox leftorrightvbox leftorrightvtop lefttoright righttoleft \ -synchronizelayoutdirection synchronizedisplaydirection synchronizeinlinedirection lesshyphens morehyphens \ -nohyphens dohyphens Ucheckedstartdisplaymath Ucheckedstopdisplaymath break \ -nobreak allowbreak goodbreak nospace nospacing \ -dospacing naturalhbox naturalvbox naturalhpack naturalvpack \ -frule compoundhyphenpenalty +normalsuperscript normalsubscript normalnosuperscript normalnosubscript superscript \ +subscript nosuperscript nosubscript uncramped cramped \ +triggermathstyle mathstylefont mathsmallstylefont mathstyleface mathsmallstyleface \ +mathstylecommand mathpalette mathstylehbox mathstylevbox mathstylevcenter \ +mathstylevcenteredhbox mathstylevcenteredvbox mathtext setmathsmalltextbox setmathtextbox \ +pushmathstyle popmathstyle triggerdisplaystyle triggertextstyle triggerscriptstyle \ +triggerscriptscriptstyle triggeruncrampedstyle triggercrampedstyle triggersmallstyle triggeruncrampedsmallstyle \ +triggercrampedsmallstyle triggerbigstyle triggeruncrampedbigstyle triggercrampedbigstyle luaexpr \ +expelsedoif expdoif expdoifnot expdoifelsecommon expdoifcommonelse \ +expdoifelseinset expdoifinsetelse ctxdirectlua ctxlatelua ctxsprint \ +ctxwrite ctxcommand ctxdirectcommand ctxlatecommand ctxreport \ +ctxlua luacode lateluacode directluacode registerctxluafile \ +ctxloadluafile luaversion luamajorversion luaminorversion ctxluacode \ +luaconditional luaexpanded startluaparameterset stopluaparameterset luaparameterset \ +definenamedlua obeylualines obeyluatokens startluacode stopluacode \ +startlua stoplua startctxfunction stopctxfunction ctxfunction \ +startctxfunctiondefinition stopctxfunctiondefinition installctxfunction cldprocessfile cldloadfile \ +cldcontext cldcommand carryoverpar lastlinewidth assumelongusagecs \ +Umathbotaccent righttolefthbox lefttorighthbox righttoleftvbox lefttorightvbox \ +righttoleftvtop lefttorightvtop rtlhbox ltrhbox rtlvbox \ +ltrvbox rtlvtop ltrvtop autodirhbox autodirvbox \ +autodirvtop leftorrighthbox leftorrightvbox leftorrightvtop lefttoright \ +righttoleft checkedlefttoright checkedrighttoleft synchronizelayoutdirection synchronizedisplaydirection \ +synchronizeinlinedirection dirlre dirrle dirlro dirrlo \ +lesshyphens morehyphens nohyphens dohyphens Ucheckedstartdisplaymath \ +Ucheckedstopdisplaymath break nobreak allowbreak goodbreak \ +nospace nospacing dospacing naturalhbox naturalvbox \ +naturalvtop naturalhpack naturalvpack frule compoundhyphenpenalty \ +start stop diff --git a/context/data/scite/context/scite-context-data-interfaces.properties b/context/data/scite/context/scite-context-data-interfaces.properties index 6eba6e0cd..f1d5344ff 100644 --- a/context/data/scite/context/scite-context-data-interfaces.properties +++ b/context/data/scite/context/scite-context-data-interfaces.properties @@ -1,186 +1,355 @@ -keywordclass.context.cs=\ -AMSTEX AfterPar Alphabeticnumerals AmSTeX \ -And BeforePar Big Bigg Biggl \ -Biggm Biggr Bigl Bigm Bigr \ -CONTEXT Caps Cisla ConTeXt Context \ -ConvertConstantAfter ConvertToConstant ETEX EveryLine EveryPar \ -GetPar GotoPar Greeknumerals INRSTEX Kap \ -LAMSTEX LATEX LUAJITTEX LUATEX LaTeX \ -LamSTeX Lua LuaTeX LuajitTeX MESIC \ -METAFONT METAFUN METAPOST MKII MKIV \ -MKIX MKVI MKXI MONTHLONG MONTHSHORT \ -MPII MPIV MPVI MPanchor MPbetex \ -MPc MPcode MPcolor MPcoloronly MPcolumn \ -MPd MPdrawing MPfontsizehskip MPgetmultipars MPgetmultishape \ -MPgetposboxes MPh MPinclusions MPleftskip MPll \ -MPlr MPls MPmenubuttons MPn MPoptions \ -MPoverlayanchor MPp MPpage MPpardata MPplus \ -MPpos MPpositiongraphic MPposset MPr MPrawvar \ -MPregion MPrest MPrightskip MPrs MPstring \ -MPtext MPtransparency MPul MPur MPv \ -MPvar MPvariable MPvv MPw MPwhd \ -MPx MPxy MPxywhd MPy MetaFont \ -MetaFun MetaPost NormalizeFontHeight NormalizeFontWidth NormalizeTextHeight \ -NormalizeTextWidth PDFETEX PDFTEX PDFcolor PICTEX \ -PPCHTEX PPCHTeX PRAGMA PiCTeX PointsToBigPoints \ -PointsToReal PointsToWholeBigPoints PtToCm ReadFile Rimskecislice \ -SLOVA SLOVO ScaledPointsToBigPoints ScaledPointsToWholeBigPoints Slova \ -Slovo Smallcapped TABLE TEX TEXpage \ -TaBlE TeX TheNormalizedFontSize TransparencyHack VSEDNIDEN \ -VerboseNumber WidthSpanningText XETEX XeTeX Znak \ -Znaky abjadnaivenumerals abjadnodotnumerals abjadnumerals activatespacehandler \ -adaptcollector adaptfontfeature adaptpapersize addfeature addtoJSpreamble \ -addtocommalist addvalue aftersplitstring aftertestandsplitstring aktualnicislonadpisu \ -aktualnidatum alignmentcharacter allinputpaths alphabeticnumerals alwayscitation \ -alwayscite ampersand anchor appendetoks appendgvalue \ -appendtocommalist appendtoks appendtoksonce appendvalue apply \ -applyalternativestyle applyprocessor applytocharacters applytofirstcharacter applytosplitstringchar \ -applytosplitstringcharspaced applytosplitstringline applytosplitstringlinespaced applytosplitstringword applytosplitstringwordspaced \ -applytowords arabicdecimals arabicexnumerals arabicnumerals arg \ -asciistr aside assignalfadimension assigndimen assigndimension \ -assignifempty assigntranslation assignvalue assignwidth assumelongusagecs \ -astype attachment autocap autodirhbox autodirvbox \ -autodirvtop autoinsertnextspace automathematics autosetups availablehsize \ -averagecharwidth backgroundimage backgroundimagefill backgroundline barevnalista \ -barva basegrid baselineleftbox baselinemiddlebox baselinerightbox \ -bbox beforesplitstring beforetestandsplitstring big bigbodyfont \ -bigg bigger biggl biggm biggr \ -bigl bigm bigr bigskip binom \ -bitmapimage blap bleed bleedheight bleedwidth \ -blockligatures blockquote bodyfontenvironmentlist bodyfontsize bold \ -boldface bolditalic boldslanted booleanmodevalue bottombox \ -bottomleftbox bottomrightbox boxcursor boxmarker boxofsize \ -boxreference bpos bthiddencitation btxabbreviatedjournal btxaddjournal \ -btxalwayscitation btxauthorfield btxdetail btxdirect btxdoif \ -btxdoifcombiinlistelse btxdoifelse btxdoifelsecombiinlist btxdoifelsesameasprevious btxdoifelsesameaspreviouschecked \ -btxdoifelseuservariable btxdoifnot btxdoifsameaspreviouscheckedelse btxdoifsameaspreviouselse btxdoifuservariableelse \ -btxexpandedjournal btxfield btxfieldname btxfieldtype btxfirstofrange \ -btxflush btxflushauthor btxflushauthorinverted btxflushauthorinvertedshort btxflushauthorname \ -btxflushauthornormal btxflushauthornormalshort btxflushsuffix btxfoundname btxfoundtype \ -btxhybridcite btxlistcitation btxloadjournalist btxoneorrange btxremapauthor \ -btxsavejournalist btxsetup btxsingularorplural btxsingularplural btxtextcitation \ -calligraphic camel catcodetablename cbox centerbox \ -centeredbox centerednextbox cernalinka cernelinky cfrac \ -chardescription charwidthlanguage checkcharacteralign checkedchar checkedfiller \ -checkedstrippedcsname checkinjector checknextindentation checknextinjector checkpage \ +keywordclass.context.common=\ +AEacute AEligature AEmacron AMSTEX \ +Aacute Abreve Abreveacute Abrevedotbelow Abrevegrave \ +Abrevehook Abrevetilde Acaron Acircumflex Acircumflexacute \ +Acircumflexdotbelow Acircumflexgrave Acircumflexhook Acircumflextilde Adiaeresis \ +Adiaeresismacron Adotaccent Adotaccentmacron Adotbelow Adoublegrave \ +AfterPar Agrave Ahook Ainvertedbreve Alpha \ +Alphabeticnumerals AmSTeX Amacron And Angstrom \ +Aogonek Aring Aringacute Arrowvert Astroke \ +Atilde BeforePar Beta Bhook Big \ +Bigg Biggl Biggm Biggr Bigl \ +Bigm Bigr Box Bumpeq CONTEXT \ +Cacute Cap Caps Ccaron Ccedilla \ +Ccircumflex Cdotaccent Character Characters Chi \ +Chook ConTeXt Context ConvertConstantAfter ConvertToConstant \ +Cstroke Cup DZcaronligature DZligature Dafrican \ +Dcaron Ddownarrow Delta Dhook Doteq \ +Downarrow Dstroke Dzcaronligature Dzligature ETEX \ +Eacute Ebreve Ecaron Ecedilla Ecircumflex \ +Ecircumflexacute Ecircumflexdotbelow Ecircumflexgrave Ecircumflexhook Ecircumflextilde \ +Ediaeresis Edotaccent Edotbelow Edoublegrave Egrave \ +Ehook Einvertedbreve Emacron Eogonek Epsilon \ +Eta Eth Etilde Eulerconst EveryLine \ +EveryPar Fhook Finv Gacute Game \ +Gamma Gbreve Gcaron Gcircumflex Gcommaaccent \ +Gdotaccent GetPar Ghook GotoPar Greeknumerals \ +Gstroke Hat Hcaron Hcircumflex Hstroke \ +IJligature INRSTEX Iacute Ibreve Icaron \ +Icircumflex Idiaeresis Idotaccent Idotbelow Idoublegrave \ +Igrave Ihook Iinvertedbreve Im Imacron \ +Iogonek Iota Istroke Itilde Jcircumflex \ +Join Kappa Kcaron Kcommaaccent Khook \ +LAMSTEX LATEX LJligature LUAJITTEX LUATEX \ +LaTeX Lacute LamSTeX Lambda Lbar \ +Lcaron Lcommaaccent Ldotmiddle Ldsh Leftarrow \ +Leftrightarrow Ljligature Lleftarrow Longleftarrow Longleftrightarrow \ +Longmapsfrom Longmapsto Longrightarrow Lsh Lstroke \ +Lua LuaTeX LuajitTeX METAFONT METAFUN \ +METAPOST MKII MKIV MKIX MKVI \ +MKXI MONTH MONTHLONG MONTHSHORT MPII \ +MPIV MPVI MPanchor MPbetex MPc \ +MPcode MPcolor MPcoloronly MPcolumn MPd \ +MPdrawing MPfontsizehskip MPgetmultipars MPgetmultishape MPgetposboxes \ +MPh MPinclusions MPleftskip MPll MPlr \ +MPls MPmenubuttons MPn MPoptions MPoverlayanchor \ +MPp MPpage MPpardata MPplus MPpos \ +MPpositiongraphic MPposset MPr MPrawvar MPregion \ +MPrest MPrightskip MPrs MPstring MPtext \ +MPtransparency MPul MPur MPv MPvar \ +MPvariable MPvv MPw MPwhd MPx \ +MPxy MPxywhd MPy Mapsfrom Mapsto \ +MetaFont MetaFun MetaPost Mu NJligature \ +Nacute Ncaron Ncommaaccent Nearrow Neng \ +Ngrave Njligature NormalizeFontHeight NormalizeFontWidth NormalizeTextHeight \ +NormalizeTextWidth Ntilde Nu Numbers Nwarrow \ +OEligature Oacute Obreve Ocaron Ocircumflex \ +Ocircumflexacute Ocircumflexdotbelow Ocircumflexgrave Ocircumflexhook Ocircumflextilde \ +Odiaeresis Odiaeresismacron Odotaccent Odotaccentmacron Odotbelow \ +Odoublegrave Ograve Ohook Ohorn Ohornacute \ +Ohorndotbelow Ohorngrave Ohornhook Ohorntilde Ohungarumlaut \ +Oinvertedbreve Omacron Omega Omicron Oogonek \ +Oogonekmacron Ostroke Ostrokeacute Otilde Otildemacron \ +P PDFETEX PDFTEX PDFcolor PICTEX \ +PPCHTEX PPCHTeX PRAGMA Phi Phook \ +Pi PiCTeX Plankconst PointsToBigPoints PointsToReal \ +PointsToWholeBigPoints PropertyLine Psi PtToCm Racute \ +Rcaron Rcommaaccent Rdoublegrave Rdsh Re \ +ReadFile Relbar Rho Rightarrow Rinvertedbreve \ +Romannumerals Rrightarrow Rsh S Sacute \ +ScaledPointsToBigPoints ScaledPointsToWholeBigPoints Scaron Scedilla Schwa \ +Scircumflex Scommaaccent Searrow Sigma Smallcapped \ +Subset Supset Swarrow TABLE TEX \ +TaBlE Tau Tcaron Tcedilla Tcommaaccent \ +TeX TheNormalizedFontSize Theta Thook Thorn \ +TransparencyHack Tstroke Uacute Ubreve Ucaron \ +Ucircumflex Udiaeresis Udiaeresisacute Udiaeresiscaron Udiaeresisgrave \ +Udiaeresismacron Udotbelow Udoublegrave Ugrave Uhook \ +Uhorn Uhornacute Uhorndotbelow Uhorngrave Uhornhook \ +Uhorntilde Uhungarumlaut Uinvertedbreve Umacron Uogonek \ +Uparrow Updownarrow Upsilon Uring Utilde \ +Uuparrow VDash Vdash VerboseNumber Vert \ +Vvdash WEEKDAY WORD WORDS Wcircumflex \ +WidthSpanningText Word Words XETEX XeTeX \ +Xi Yacute Ycircumflex Ydiaeresis Ydotbelow \ +Ygrave Yhook Ymacron Ytilde Zacute \ +Zcaron Zdotaccent Zeta Zhook Zstroke \ +aacute abbreviation abjadnaivenumerals abjadnodotnumerals abjadnumerals \ +about abreve abreveacute abrevedotbelow abrevegrave \ +abrevehook abrevetilde acaron acircumflex acircumflexacute \ +acircumflexdotbelow acircumflexgrave acircumflexhook acircumflextilde activatespacehandler \ +actuarial acute acwopencirclearrow adaptcollector adaptfontfeature \ +adaptlayout adaptpapersize addfeature addfontpath addtoJSpreamble \ +addtocommalist addvalue adiaeresis adiaeresismacron adotaccent \ +adotaccentmacron adotbelow adoublegrave aeacute aeligature \ +aemacron afghanicurrency aftersplitstring aftertestandsplitstring agrave \ +ahook ainvertedbreve aleph alignbottom aligned \ +alignedbox alignedline alignhere alignmentcharacter allinputpaths \ +alpha alphabeticnumerals alwayscitation alwayscite amacron \ +amalg ampersand anchor angle aogonek \ +appendetoks appendgvalue appendtocommalist appendtoks appendtoksonce \ +appendvalue apply applyalternativestyle applyprocessor applytocharacters \ +applytofirstcharacter applytosplitstringchar applytosplitstringcharspaced applytosplitstringline applytosplitstringlinespaced \ +applytosplitstringword applytosplitstringwordspaced applytowords approx approxEq \ +approxeq approxnEq arabicakbar arabicalayhe arabicallah \ +arabicallallahou arabicasterisk arabicbasmalah arabiccomma arabiccuberoot \ +arabicdateseparator arabicdecimals arabicdisputedendofayah arabicendofayah arabicexnumerals \ +arabicfootnotemarker arabicfourthroot arabichighain arabichighalayheassallam arabichigheqala \ +arabichighesala arabichighfootnotemarker arabichighjeem arabichighlamalef arabichighmadda \ +arabichighmeemlong arabichighmeemshort arabichighnisf arabichighnoon arabichighnoonkasra \ +arabichighqaf arabichighqif arabichighradiallahouanhu arabichighrahmatullahalayhe arabichighrubc \ +arabichighsad arabichighsajda arabichighsakta arabichighsallallahou arabichighseen \ +arabichighsmallsafha arabichightah arabichightakhallus arabichighthalatha arabichighwaqf \ +arabichighyeh arabichighzain arabicjallajalalouhou arabiclettermark arabiclowmeemlong \ +arabiclownoonkasra arabiclowseen arabicmisra arabicmuhammad arabicnumber \ +arabicnumberabove arabicnumerals arabicparenleft arabicparenright arabicpercent \ +arabicperiod arabicpermille arabicpertenthousand arabicpoeticverse arabicqala \ +arabicquestion arabicrasoul arabicray arabicrialsign arabicsafha \ +arabicsajdah arabicsalla arabicsamvat arabicsanah arabicsemicolon \ +arabicshighthreedots arabicslcm arabicstartofrubc arabictripledot arabicvowelwaw \ +arabicvowelyeh arabicwasallam arg aring aringacute \ +arrowvert asciistr aside assignalfadimension assigndimen \ +assigndimension assignifempty assigntranslation assignvalue assignwidth \ +assumelongusagecs ast astype asymp at \ +atilde atleftmargin atpage atrightmargin attachment \ +autocap autodirhbox autodirvbox autodirvtop autoinsertnextspace \ +autointegral automathematics autosetups availablehsize averagecharwidth \ +backepsilon background backgroundimage backgroundimagefill backgroundline \ +backprime backsim backslash bar barleftarrow \ +barleftarrowrightarrowbar barovernorthwestarrow barwedge basegrid baselinebottom \ +baselineleftbox baselinemiddlebox baselinerightbox bbordermatrix bbox \ +because beforesplitstring beforetestandsplitstring beta beth \ +between bhook big bigbodyfont bigcap \ +bigcirc bigcircle bigcup bigdiamond bigg \ +bigger biggl biggm biggr bigl \ +bigm bigodot bigoplus bigotimes bigr \ +bigskip bigsqcap bigsqcup bigsquare bigstar \ +bigtimes bigtriangledown bigtriangleup bigudot biguplus \ +bigvee bigwedge binom bitmapimage blacklozenge \ +blackrule blackrules blacksquare blacktriangle blacktriangledown \ +blacktriangleleft blacktriangleright blank blap bleed \ +bleedheight bleedwidth blockligatures blockquote blocksynctexfile \ +bodyfontenvironmentlist bodyfontsize bold boldface bolditalic \ +boldslanted bookmark booleanmodevalue bordermatrix bot \ +bottombox bottomleftbox bottomrightbox bowtie boxcursor \ +boxdot boxmarker boxminus boxofsize boxplus \ +boxreference boxtimes bpos breakablethinspace breakhere \ +breve bstroke btxabbreviatedjournal btxaddjournal btxalwayscitation \ +btxauthorfield btxdetail btxdirect btxdoif btxdoifcombiinlistelse \ +btxdoifelse btxdoifelsecombiinlist btxdoifelsesameasprevious btxdoifelsesameaspreviouschecked btxdoifelseuservariable \ +btxdoifnot btxdoifsameaspreviouscheckedelse btxdoifsameaspreviouselse btxdoifuservariableelse btxexpandedjournal \ +btxfield btxfieldname btxfieldtype btxfirstofrange btxflush \ +btxflushauthor btxflushauthorinverted btxflushauthorinvertedshort btxflushauthorname btxflushauthornormal \ +btxflushauthornormalshort btxflushsuffix btxfoundname btxfoundtype btxhiddencitation \ +btxhybridcite btxlabellanguage btxlabeltext btxlistcitation btxloadjournalist \ +btxoneorrange btxremapauthor btxsavejournalist btxsetup btxsingularorplural \ +btxsingularplural btxtextcitation buildmathaccent buildtextaccent buildtextbottomcomma \ +buildtextbottomdot buildtextcedilla buildtextgrave buildtextmacron buildtextognek \ +bullet button cacute calligraphic camel \ +cap carriagereturn catcodetablename cbox ccaron \ +ccedilla ccircumflex ccurl cdot cdotaccent \ +cdotp cdots centeraligned centerbox centerdot \ +centeredbox centeredlastline centerednextbox centerline cfrac \ +chapter character characters chardescription charwidthlanguage \ +check checkcharacteralign checkedchar checkedfiller checkedstrippedcsname \ +checkinjector checkmark checknextindentation checknextinjector checkpage \ checkparameters checkpreviousinjector checksoundtrack checktwopassdata checkvariables \ chem chemical chemicalbottext chemicalmidtext chemicalsymbol \ -chemicaltext chemicaltoptext chineseallnumerals chinesecapnumerals chinesenumerals \ -cisla cislonadpisu cislorovnice cislostrany citace \ -citation cite citovat clap classfont \ -cldcommand cldcontext cldloadfile cldprocessfile cleftarrow \ -collect collectedtext collectexpanded colorcomponents colored \ -coloronly columnbreak combinepages commalistelement commalistsentence \ -commalistsize comment comparedimension comparedimensioneps completebtxrendering \ -completelist completelistofpublications completelistofsorts completelistofsynonyms completepagenumber \ -completeregister complexorsimple complexorsimpleempty composedcollector composedlayer \ -compresult constantdimen constantdimenargument constantemptyargument constantnumber \ -constantnumberargument contentreference continuednumber continueifinputfile convertargument \ -convertcommand convertedcounter converteddimen convertedsubcounter convertmonth \ -convertvalue convertvboxtohbox copypages copyparameters copyposition \ -countersubs counttoken counttokens cramped crampedclap \ -crampedllap crampedrlap crightarrow crightoverleftarrow ctop \ -ctxcommand ctxdirectcommand ctxdirectlua ctxfunction ctxlatecommand \ -ctxlatelua ctxloadluafile ctxlua ctxluabuffer ctxluacode \ -ctxreport ctxsprint currentassignmentlistkey currentassignmentlistvalue currentbtxuservariable \ -currentcommalistitem currentcomponent currentenvironment currentfeaturetest currentinterface \ +chemicaltext chemicaltoptext chi chineseallnumerals chinesecapnumerals \ +chinesenumerals chook circ circeq circlearrowleft \ +circlearrowright circledR circledS circledast circledcirc \ +circleddash circledequals circleonrightarrow citation cite \ +clap classfont cldcommand cldcontext cldloadfile \ +cldprocessfile cleftarrow clip clonefield clubsuit \ +collect collectedtext collectexpanded colon coloncolonequals \ +colonequals color colorbar colorcomponents colored \ +coloronly colorvalue column columnbreak combinepages \ +commalistelement commalistsentence commalistsize comment comparecolorgroup \ +comparedimension comparedimensioneps comparepalet complement completebtxrendering \ +completecontent completeindex completelist completelistofabbreviations completelistofchemicals \ +completelistoffigures completelistofgraphics completelistofintermezzi completelistoflogos completelistofpublications \ +completelistofsorts completelistofsynonyms completelistoftables completepagenumber completeregister \ +complexes complexorsimple complexorsimpleempty component composedcollector \ +composedlayer compresult cong constantdimen constantdimenargument \ +constantemptyargument constantnumber constantnumberargument contentreference continuednumber \ +continueifinputfile convertargument convertcommand convertedcounter converteddimen \ +convertedsubcounter convertmonth convertnumber convertvalue convertvboxtohbox \ +coprod copyboxfromcache copybtxlabeltext copyfield copyheadtext \ +copylabeltext copymathlabeltext copyoperatortext copypages copyparameters \ +copyposition copyprefixtext copyright copysuffixtext copytaglabeltext \ +copyunittext correctwhitespace countersubs counttoken counttokens \ +cramped crampedclap crampedllap crampedrlap crightarrow \ +crightoverleftarrow cstroke ctop ctxcommand ctxdirectcommand \ +ctxdirectlua ctxfunction ctxlatecommand ctxlatelua ctxloadluafile \ +ctxlua ctxluabuffer ctxluacode ctxreport ctxsprint \ +cup curlyeqprec curlyeqsucc curlyvee curlywedge \ +currentassignmentlistkey currentassignmentlistvalue currentbtxuservariable currentcommalistitem currentcomponent \ +currentdate currentenvironment currentfeaturetest currentheadnumber currentinterface \ currentlanguage currentlistentrydestinationattribute currentlistentrylimitedtext currentlistentrynumber currentlistentrypagenumber \ currentlistentryreferenceattribute currentlistentrytitle currentlistentrytitlerendered currentlistsymbol currentmainlanguage \ currentmessagetext currentmoduleparameter currentoutputstream currentproduct currentproject \ currentregime currentregisterpageuserdata currentresponses currenttime currentvalue \ -currentxtablecolumn currentxtablerow datasetvariable datum dayoftheweek \ -dayspermonth dbinom decrement decrementcounter decrementedcounter \ -decrementpagenumber decrementsubpagenumber decrementvalue defaultinterface defaultobjectpage \ -defaultobjectreference defcatcodecommand defconvertedargument defconvertedcommand defconvertedvalue \ -defineMPinstance defineTABLEsetup defineactivecharacter definealternativestyle defineanchor \ -defineattachment defineattribute definebackground definebar definebodyfontswitch \ -definebreakpoint definebreakpoints definebtx definebtxdataset definebtxregister \ -definebtxrendering definebutton definecapitals definecharacterkerning definecharacterspacing \ -definechemical definechemicals definechemicalsymbol definecollector definecolumnbreak \ -definecombination definecomment definecomplexorsimple definecomplexorsimpleempty defineconversionset \ -definecounter definedataset definedelimitedtext definedfont defineeffect \ -defineexpandable defineexternalfigure definefallbackfamily definefieldbody definefieldbodyset \ -definefieldcategory definefileconstant definefilefallback definefilesynonym definefiller \ -definefirstline definefittingpage definefontalternative definefontfallback definefontfamily \ -definefontfamilypreset definefontfeature definefontfile definefontsize definefontsolution \ -defineformula defineformulaalternative defineformulaframed defineframedcontent definefrozenfont \ -defineglobalcolor definegraphictypesynonym definegridsnapping defineheadalternative definehelp \ -definehigh definehighlight definehspace definehypenationfeatures defineindentedtext \ -defineindenting defineinitial defineinsertion defineinteraction defineinteractionbar \ -defineinterfaceconstant defineinterfaceelement defineinterfacevariable defineinterlinespace defineintermediatecolor \ -defineitemgroup defineitems definelabelclass definelayer definelayerpreset \ +currentxtablecolumn currentxtablerow curvearrowleft curvearrowright cwopencirclearrow \ +cyrillicA cyrillicAE cyrillicAbreve cyrillicAdiaeresis cyrillicB \ +cyrillicBIGYUS cyrillicBIGYUSiotified cyrillicC cyrillicCH cyrillicCHEDC \ +cyrillicCHEDCabkhasian cyrillicCHEabkhasian cyrillicCHEdiaeresis cyrillicCHEkhakassian cyrillicCHEvertstroke \ +cyrillicD cyrillicDASIAPNEUMATA cyrillicDJE cyrillicDZE cyrillicDZEabkhasian \ +cyrillicDZHE cyrillicE cyrillicELtail cyrillicEMtail cyrillicENDC \ +cyrillicENGHE cyrillicENhook cyrillicENtail cyrillicEREV cyrillicERY \ +cyrillicERtick cyrillicEbreve cyrillicEdiaeresis cyrillicEgrave cyrillicEiotified \ +cyrillicF cyrillicFITA cyrillicG cyrillicGHEmidhook cyrillicGHEstroke \ +cyrillicGHEupturn cyrillicGJE cyrillicH cyrillicHA cyrillicHADC \ +cyrillicHRDSN cyrillicI cyrillicIE cyrillicII cyrillicISHRT \ +cyrillicISHRTtail cyrillicIZHITSA cyrillicIZHITSAdoublegrave cyrillicIdiaeresis cyrillicIgrave \ +cyrillicImacron cyrillicJE cyrillicK cyrillicKADC cyrillicKAbashkir \ +cyrillicKAhook cyrillicKAstroke cyrillicKAvertstroke cyrillicKJE cyrillicKOPPA \ +cyrillicKSI cyrillicL cyrillicLITTLEYUS cyrillicLITTLEYUSiotified cyrillicLJE \ +cyrillicM cyrillicN cyrillicNJE cyrillicO cyrillicOMEGA \ +cyrillicOMEGAround cyrillicOMEGAtitlo cyrillicOT cyrillicObarred cyrillicObarreddiaeresis \ +cyrillicOdiaeresis cyrillicP cyrillicPALATALIZATION cyrillicPALOCHKA cyrillicPEmidhook \ +cyrillicPSI cyrillicPSILIPNEUMATA cyrillicR cyrillicS cyrillicSCHWA \ +cyrillicSCHWAdiaeresis cyrillicSDSC cyrillicSEMISOFT cyrillicSFTSN cyrillicSH \ +cyrillicSHCH cyrillicSHHA cyrillicT cyrillicTEDC cyrillicTETSE \ +cyrillicTITLO cyrillicTSHE cyrillicU cyrillicUK cyrillicUSHRT \ +cyrillicUdiaeresis cyrillicUdoubleacute cyrillicUmacron cyrillicV cyrillicYA \ +cyrillicYAT cyrillicYERUdiaeresis cyrillicYI cyrillicYO cyrillicYU \ +cyrillicYstr cyrillicYstrstroke cyrillicZ cyrillicZDSC cyrillicZEdiaeresis \ +cyrillicZH cyrillicZHEbreve cyrillicZHEdescender cyrillicZHEdiaeresis cyrillica \ +cyrillicabreve cyrillicadiaeresis cyrillicae cyrillicb cyrillicbigyus \ +cyrillicbigyusiotified cyrillicc cyrillicch cyrilliccheabkhasian cyrillicchedc \ +cyrillicchedcabkhasian cyrillicchediaeresis cyrillicchekhakassian cyrillicchevertstroke cyrillicd \ +cyrillicdje cyrillicdze cyrillicdzeabkhasian cyrillicdzhe cyrillice \ +cyrillicebreve cyrillicediaeresis cyrillicegrave cyrilliceiotified cyrilliceltail \ +cyrillicemtail cyrillicendc cyrillicenghe cyrillicenhook cyrillicentail \ +cyrillicerev cyrillicertick cyrillicery cyrillicf cyrillicfita \ +cyrillicg cyrillicghemidhook cyrillicghestroke cyrillicgheupturn cyrillicgje \ +cyrillich cyrillicha cyrillichadc cyrillichrdsn cyrillici \ +cyrillicidiaeresis cyrillicie cyrillicigrave cyrillicii cyrillicimacron \ +cyrillicishrt cyrillicishrttail cyrillicizhitsa cyrillicizhitsadoublegrave cyrillicje \ +cyrillick cyrillickabashkir cyrillickadc cyrillickahook cyrillickastroke \ +cyrillickavertstroke cyrillickje cyrillickoppa cyrillicksi cyrillicl \ +cyrilliclittleyus cyrilliclittleyusiotified cyrilliclje cyrillicm cyrillicn \ +cyrillicnje cyrillico cyrillicobarred cyrillicobarreddiaeresis cyrillicodiaeresis \ +cyrillicomega cyrillicomegaround cyrillicomegatitlo cyrillicot cyrillicp \ +cyrillicpemidhook cyrillicpsi cyrillicr cyrillics cyrillicschwa \ +cyrillicschwadiaeresis cyrillicsdsc cyrillicsemisoft cyrillicsftsn cyrillicsh \ +cyrillicshch cyrillicshha cyrillict cyrillictedc cyrillictetse \ +cyrillictshe cyrillicu cyrillicudiaeresis cyrillicudoubleacute cyrillicuk \ +cyrillicumacron cyrillicushrt cyrillicv cyrillicya cyrillicyat \ +cyrillicyerudiaeresis cyrillicyi cyrillicyo cyrillicystr cyrillicystrstroke \ +cyrillicyu cyrillicz cyrilliczdsc cyrilliczediaeresis cyrilliczh \ +cyrilliczhebreve cyrilliczhedescender cyrilliczhediaeresis d dag \ +dagger daleth dasharrow dashedleftarrow dashedrightarrow \ +dashv datasetvariable date dayoftheweek dayspermonth \ +dbinom dcaron dcurl ddag ddagger \ +dddot ddot ddots decrement decrementcounter \ +decrementedcounter decrementpagenumber decrementsubpagenumber decrementvalue defaultinterface \ +defaultobjectpage defaultobjectreference defcatcodecommand defconvertedargument defconvertedcommand \ +defconvertedvalue define defineMPinstance defineTABLEsetup defineaccent \ +defineactivecharacter definealternativestyle defineanchor defineattachment defineattribute \ +definebackground definebar defineblock definebodyfont definebodyfontenvironment \ +definebodyfontswitch definebreakpoint definebreakpoints definebtx definebtxdataset \ +definebtxregister definebtxrendering definebuffer definebutton definecapitals \ +definecharacter definecharacterkerning definecharacterspacing definechemical definechemicals \ +definechemicalsymbol definecollector definecolor definecolorgroup definecolumnbreak \ +definecombination definecombinedlist definecommand definecomment definecomplexorsimple \ +definecomplexorsimpleempty defineconversion defineconversionset definecounter definedataset \ +definedelimitedtext definedeq definedescription definedfont defineeffect \ +defineenumeration defineexpandable defineexternalfigure definefallbackfamily definefield \ +definefieldbody definefieldbodyset definefieldcategory definefieldstack definefiguresymbol \ +definefileconstant definefilefallback definefilesynonym definefiller definefirstline \ +definefittingpage definefloat definefont definefontalternative definefontfallback \ +definefontfamily definefontfamilypreset definefontfeature definefontfile definefontsize \ +definefontsolution definefontstyle definefontsynonym defineformula defineformulaalternative \ +defineformulaframed defineframed defineframedcontent defineframedtable defineframedtext \ +definefrozenfont defineglobalcolor definegraphictypesynonym definegridsnapping definehbox \ +definehead defineheadalternative definehelp definehigh definehighlight \ +definehspace definehypenationfeatures defineindentedtext defineindenting defineinitial \ +defineinsertion defineinteraction defineinteractionbar defineinteractionmenu defineinterfaceconstant \ +defineinterfaceelement defineinterfacevariable defineinterlinespace defineintermediatecolor defineitemgroup \ +defineitems definelabel definelabelclass definelayer definelayerpreset \ definelayout definelinefiller definelinenote definelinenumbering definelines \ -definelistalternative definelistextra definelow definelowhigh definelowmidhigh \ -definemarginblock definemargindata definemarker definemathalignment definemathcases \ -definemathcommand definemathdoubleextensible definemathematics definemathextensible definemathfence \ -definemathfraction definemathframed definemathmatrix definemathornament definemathoverextensible \ -definemathovertextextensible definemathradical definemathstackers definemathstyle definemathtriplet \ -definemathunderextensible definemathundertextextensible definemathunstacked definemeasure definemessageconstant \ -definemixedcolumns definemode definemultitonecolor definenamedcolor definenamespace \ -definenarrower definenote defineornament defineoutputroutine defineoutputroutinecommand \ -definepage definepagebreak definepagechecker definepagegrid definepagegridarea \ -definepagegridspan definepageinjection definepageinjectionalternative definepageshift definepagestate \ -definepairedbox defineparagraph defineparallel defineparbuilder defineplacement \ -definepositioning defineprefixset defineprocesscolor defineprocessor definepushbutton \ -definepushsymbol definerenderingwindow defineresetset definescale definescript \ -definesectionlevels defineselector defineseparatorset defineshift definesidebar \ -definesort definespotcolor definestyleinstance definesubformula definesynonym \ -definesystemattribute definesystemconstant definesystemvariable definetabulation definetextbackground \ -definetextflow definetooltip definetransparency definetwopasslist definetype \ -definetypeface definetypescriptprefix definetypescriptsynonym definetypesetting defineunit \ -defineviewerlayer definevspace definevspacing definevspacingamount definextable \ -definuj definujbarvu definujblok definujbloksekce definujbuffer \ -definujfont definujformatodkazu definujhbox definujinterakcnimenu definujkombinovanyseznam \ -definujkonverzi definujnadpis definujobrazeksymbol definujodkaz definujodstavce \ -definujopis definujoramovani definujoramovanytext definujpaletu definujplvouciobjekt \ -definujpodpole definujpole definujpopis definujpopisek definujprekryv \ -definujprofil definujprogram definujprostredizakladnihofontu definujrejstrik definujsablonutabulky \ -definujsekci definujseznam definujskupinubarev definujstartstop definujstyl \ -definujstylfontu definujsymbol definujsynonumumfontu definujsynonyma definujtabelaci \ -definujtext definujtrideni definujupravu definujvelikostpapiru definujvycet \ -definujzakladnifont definujzasobnikpoli definujznaceni delimited delimitedtext \ -delkaseznamu depthofstring depthonlybox depthspanningtext determinenoflines \ -devanagarinumerals dfrac digits dimensiontocount directcolor \ -directcolored directconvertedcounter directdummyparameter directgetboxllx directgetboxlly \ -directhighlight directlocalframed directluacode directselect directsetbar \ -directsetup directsymbol directvspacing dis disabledirectives \ -disableexperiments disablemode disableoutputstream disableparpositions disableregime \ -disabletrackers displaymath displaymathematics displaymessage distributedhsize \ -dividedsize doadaptleftskip doadaptrightskip doaddfeature doassign \ -doassignempty doboundtext docheckassignment docheckedpagestate docheckedpair \ -documentvariable dodoubleargument dodoubleargumentwithset dodoubleempty dodoubleemptywithset \ -dodoublegroupempty doeassign doexpandedrecurse dogetattribute dogetattributeid \ -dogetcommacommandelement dogobbledoubleempty dogobblesingleempty doif doifMPgraphicelse \ -doifallcommon doifallcommonelse doifalldefinedelse doifallmodes doifallmodeselse \ -doifassignmentelse doifblackelse doifbothsides doifbothsidesoverruled doifboxelse \ -doifbufferelse doifcolor doifcolorelse doifcommandhandler doifcommandhandlerelse \ -doifcommon doifcommonelse doifcontent doifconversiondefinedelse doifconversionnumberelse \ -doifcounter doifcounterelse doifcurrentfonthasfeatureelse doifdefined doifdefinedcounter \ -doifdefinedcounterelse doifdefinedelse doifdimensionelse doifdimenstringelse doifdocumentargument \ -doifdocumentargumentelse doifdocumentfilename doifdocumentfilenameelse doifdrawingblackelse doifelse \ -doifelseMPgraphic doifelseallcommon doifelsealldefined doifelseallmodes doifelseassignment \ -doifelseblack doifelsebox doifelsebuffer doifelsecolor doifelsecommandhandler \ -doifelsecommon doifelseconversiondefined doifelseconversionnumber doifelsecounter doifelsecurrentfonthasfeature \ -doifelsecurrentsortingused doifelsecurrentsynonymshown doifelsecurrentsynonymused doifelsedefined doifelsedefinedcounter \ -doifelsedimension doifelsedimenstring doifelsedocumentargument doifelsedocumentfilename doifelsedrawingblack \ -doifelseempty doifelseemptyvalue doifelseemptyvariable doifelseenv doifelsefastoptionalcheck \ -doifelsefastoptionalcheckcs doifelsefieldbody doifelsefieldcategory doifelsefigure doifelsefile \ -doifelsefiledefined doifelsefileexists doifelsefirstchar doifelseflagged doifelsefontchar \ -doifelsefontpresent doifelsefontsynonym doifelsehasspace doifelsehelp doifelseincsname \ -doifelseinelement doifelseinputfile doifelseinsertion doifelseinset doifelseinstring \ -doifelseinsymbolset doifelseintoks doifelseintwopassdata doifelseitalic doifelselanguage \ -doifelselayerdata doifelselayoutdefined doifelselayoutsomeline doifelselayouttextline doifelseleapyear \ -doifelselist doifelselocation doifelselocfile doifelsemainfloatbody doifelsemarking \ -doifelsemeaning doifelsemessage doifelsemode doifelsenextbgroup doifelsenextbgroupcs \ -doifelsenextchar doifelsenextoptional doifelsenextoptionalcs doifelsenextparenthesis doifelsenonzeropositive \ -doifelsenoteonsamepage doifelsenothing doifelsenumber doifelseobjectfound doifelseobjectreferencefound \ -doifelseoddpage doifelseoddpagefloat doifelseoldercontext doifelseolderversion doifelseoverlapping \ -doifelseoverlay doifelseparallel doifelseparentfile doifelsepath doifelsepathexists \ -doifelsepatterns doifelseposition doifelsepositionaction doifelsepositiononpage doifelsepositionsonsamepage \ -doifelsepositionsonthispage doifelsepositionsused doifelsereferencefound doifelserightpagefloat doifelserighttoleftinbox \ -doifelsesamelinereference doifelsesamestring doifelsesetups doifelsesomebackground doifelsesomespace \ -doifelsesomething doifelsesometoks doifelsestringinstring doifelsestructurelisthasnumber doifelsestructurelisthaspage \ -doifelsesymboldefined doifelsesymbolset doifelsetext doifelsetextflow doifelsetextflowcollector \ +definelist definelistalternative definelistextra definelow definelowhigh \ +definelowmidhigh definemakeup definemarginblock definemargindata definemarker \ +definemarking definemathaccent definemathalignment definemathcases definemathcommand \ +definemathdouble definemathdoubleextensible definemathematics definemathextensible definemathfence \ +definemathfraction definemathframed definemathmatrix definemathornament definemathover \ +definemathoverextensible definemathovertextextensible definemathradical definemathstackers definemathstyle \ +definemathtriplet definemathunder definemathunderextensible definemathundertextextensible definemathunstacked \ +definemeasure definemessageconstant definemixedcolumns definemode definemultitonecolor \ +definenamedcolor definenamespace definenarrower definenote defineornament \ +defineoutputroutine defineoutputroutinecommand defineoverlay definepage definepagebreak \ +definepagechecker definepagegrid definepagegridarea definepagegridspan definepageinjection \ +definepageinjectionalternative definepageshift definepagestate definepairedbox definepalet \ +definepapersize defineparagraph defineparagraphs defineparallel defineparbuilder \ +defineplacement definepositioning defineprefixset defineprocesscolor defineprocessor \ +defineprofile defineprogram definepushbutton definepushsymbol definereference \ +definereferenceformat defineregister definerenderingwindow defineresetset definescale \ +definescript definesection definesectionblock definesectionlevels defineselector \ +defineseparatorset defineshift definesidebar definesort definesorting \ +definespotcolor definestartstop definestyle definestyleinstance definesubfield \ +definesubformula definesymbol definesynonym definesynonyms definesystemattribute \ +definesystemconstant definesystemvariable definetabletemplate definetabulate definetabulation \ +definetext definetextbackground definetextflow definetooltip definetransparency \ +definetwopasslist definetype definetypeface definetypescriptprefix definetypescriptsynonym \ +definetypesetting definetyping defineunit defineviewerlayer definevspace \ +definevspacing definevspacingamount definextable delimited delimitedtext \ +delta depthofstring depthonlybox depthspanningtext depthstrut \ +determineheadnumber determinelistcharacteristics determinenoflines determineregistercharacteristics devanagarinumerals \ +dfrac dhook diameter diamond diamondsuit \ +differentialD differentiald digamma digits dimensiontocount \ +directboxfromcache directcolor directcolored directconvertedcounter directcopyboxfromcache \ +directdummyparameter directgetboxllx directgetboxlly directhighlight directlocalframed \ +directluacode directselect directsetbar directsetup directsymbol \ +directvspacing dis disabledirectives disableexperiments disablemode \ +disableoutputstream disableparpositions disableregime disabletrackers displaymath \ +displaymathematics displaymessage distributedhsize div dividedsize \ +divideontimes divides doadaptleftskip doadaptrightskip doaddfeature \ +doassign doassignempty doboundtext docheckassignment docheckedpagestate \ +docheckedpair documentvariable dodoubleargument dodoubleargumentwithset dodoubleempty \ +dodoubleemptywithset dodoublegroupempty doeassign doexpandedrecurse dofastloopcs \ +dogetattribute dogetattributeid dogetcommacommandelement dogobbledoubleempty dogobblesingleempty \ +doif doifMPgraphicelse doifallcommon doifallcommonelse doifalldefinedelse \ +doifallmodes doifallmodeselse doifassignmentelse doifblackelse doifbothsides \ +doifbothsidesoverruled doifboxelse doifbufferelse doifcolor doifcolorelse \ +doifcommandhandler doifcommandhandlerelse doifcommon doifcommonelse doifcontent \ +doifconversiondefinedelse doifconversionnumberelse doifcounter doifcounterelse doifcurrentfonthasfeatureelse \ +doifdefined doifdefinedcounter doifdefinedcounterelse doifdefinedelse doifdimensionelse \ +doifdimenstringelse doifdocumentargument doifdocumentargumentelse doifdocumentfilename doifdocumentfilenameelse \ +doifdrawingblackelse doifelse doifelseMPgraphic doifelseallcommon doifelsealldefined \ +doifelseallmodes doifelseassignment doifelseblack doifelsebox doifelseboxincache \ +doifelsebuffer doifelsecolor doifelsecommandhandler doifelsecommon doifelseconversiondefined \ +doifelseconversionnumber doifelsecounter doifelsecurrentfonthasfeature doifelsecurrentsortingused doifelsecurrentsynonymshown \ +doifelsecurrentsynonymused doifelsedefined doifelsedefinedcounter doifelsedimension doifelsedimenstring \ +doifelsedocumentargument doifelsedocumentfilename doifelsedrawingblack doifelseempty doifelseemptyvalue \ +doifelseemptyvariable doifelseenv doifelsefastoptionalcheck doifelsefastoptionalcheckcs doifelsefieldbody \ +doifelsefieldcategory doifelsefigure doifelsefile doifelsefiledefined doifelsefileexists \ +doifelsefirstchar doifelseflagged doifelsefontchar doifelsefontpresent doifelsefontsynonym \ +doifelsehasspace doifelsehelp doifelseincsname doifelseinelement doifelseinputfile \ +doifelseinsertion doifelseinset doifelseinstring doifelseinsymbolset doifelseintoks \ +doifelseintwopassdata doifelseitalic doifelselanguage doifelselayerdata doifelselayoutdefined \ +doifelselayoutsomeline doifelselayouttextline doifelseleapyear doifelselist doifelselocation \ +doifelselocfile doifelsemainfloatbody doifelsemarkedpage doifelsemarking doifelsemeaning \ +doifelsemessage doifelsemode doifelsenextbgroup doifelsenextbgroupcs doifelsenextchar \ +doifelsenextoptional doifelsenextoptionalcs doifelsenextparenthesis doifelsenonzeropositive doifelsenoteonsamepage \ +doifelsenothing doifelsenumber doifelseobjectfound doifelseobjectreferencefound doifelseoddpage \ +doifelseoddpagefloat doifelseoldercontext doifelseolderversion doifelseoverlapping doifelseoverlay \ +doifelseparallel doifelseparentfile doifelsepath doifelsepathexists doifelsepatterns \ +doifelseposition doifelsepositionaction doifelsepositiononpage doifelsepositionsonsamepage doifelsepositionsonthispage \ +doifelsepositionsused doifelsereferencefound doifelserightpagefloat doifelserighttoleftinbox doifelsesamelinereference \ +doifelsesamestring doifelsesetups doifelsesomebackground doifelsesomespace doifelsesomething \ +doifelsesometoks doifelsestringinstring doifelsestructurelisthasnumber doifelsestructurelisthaspage doifelsesymboldefined \ +doifelsesymbolset doifelsetext doifelsetextflow doifelsetextflowcollector doifelsetopofpage \ doifelsetypingfile doifelseundefined doifelseurldefined doifelsevalue doifelsevaluenothing \ doifelsevariable doifempty doifemptyelse doifemptytoks doifemptyvalue \ doifemptyvalueelse doifemptyvariable doifemptyvariableelse doifenv doifenvelse \ @@ -209,1674 +378,205 @@ doifsamestring doifsamestringelse doifsetups doifsetupselse doifsomebackground \ doifsomebackgroundelse doifsomespaceelse doifsomething doifsomethingelse doifsometoks \ doifsometokselse doifstringinstringelse doifstructurelisthasnumberelse doifstructurelisthaspageelse doifsymboldefinedelse \ doifsymbolsetelse doiftext doiftextelse doiftextflowcollectorelse doiftextflowelse \ -doiftypingfileelse doifundefined doifundefinedcounter doifundefinedelse doifurldefinedelse \ -doifvalue doifvalueelse doifvaluenothing doifvaluenothingelse doifvaluesomething \ -doifvariable doifvariableelse doindentation dollar doloop \ -doloopoverlist donothing dontconvertfont dontleavehmode dontpermitspacesbetweengroups \ -dopositionaction doprocesslocalsetups doquadrupleargument doquadrupleempty doquadruplegroupempty \ -doquintupleargument doquintupleempty doquintuplegroupempty dorechecknextindentation dorecurse \ -dorepeatwithcommand doreplacefeature doresetandafffeature doresetattribute dorotatebox \ -dosetattribute dosetleftskipadaption dosetrightskipadaption dosetupcheckedinterlinespace doseventupleargument \ -doseventupleempty dosingleargument dosingleempty dosinglegroupempty dosixtupleargument \ -dosixtupleempty dostepwiserecurse dosubtractfeature dotfskip dotoks \ -dotripleargument dotripleargumentwithset dotripleempty dotripleemptywithset dotriplegroupempty \ -doublebar doublebond doublebrace doublebracket doubleparent \ -dowith dowithnextbox dowithnextboxcontent dowithnextboxcontentcs dowithnextboxcs \ -dowithpargument dowithrange dowithwargument dpofstring dummydigit \ -dummyparameter eTeX edefconvertedargument efcmaxheight efcmaxwidth \ -efcminheight efcminwidth efcparameter effect elapsedseconds \ -elapsedtime eleftarrowfill eleftharpoondownfill eleftharpoonupfill eleftrightarrowfill \ -emphasisboldface emphasistypeface emptylines emspace enabledirectives \ -enableexperiments enablemode enableoutputstream enableparpositions enableregime \ -enabletrackers enskip enspace env envvar \ -eoverbarfill eoverbracefill eoverbracketfill eoverparentfill epos \ -equaldigits erightarrowfill erightharpoondownfill erightharpoonupfill etwoheadrightarrowfill \ -eunderbarfill eunderbracefill eunderbracketfill eunderparentfill executeifdefined \ +doiftopofpageelse doiftypingfileelse doifundefined doifundefinedcounter doifundefinedelse \ +doifurldefinedelse doifvalue doifvalueelse doifvaluenothing doifvaluenothingelse \ +doifvaluesomething doifvariable doifvariableelse doindentation dollar \ +doloop doloopoverlist donothing dontconvertfont dontleavehmode \ +dontpermitspacesbetweengroups dopositionaction doprocesslocalsetups doquadrupleargument doquadrupleempty \ +doquadruplegroupempty doquintupleargument doquintupleempty doquintuplegroupempty dorechecknextindentation \ +dorecurse dorepeatwithcommand doreplacefeature doresetandafffeature doresetattribute \ +dorotatebox dosetattribute dosetleftskipadaption dosetrightskipadaption dosetupcheckedinterlinespace \ +doseventupleargument doseventupleempty dosingleargument dosingleempty dosinglegroupempty \ +dosixtupleargument dosixtupleempty dostepwiserecurse dosubtractfeature dot \ +doteq doteqdot dotfskip dotlessI dotlessJ \ +dotlessi dotlessj dotlessjstroke dotminus dotoks \ +dotplus dotripleargument dotripleargumentwithset dotripleempty dotripleemptywithset \ +dotriplegroupempty dots dottedrightarrow doublebar doublebond \ +doublebrace doublebracket doublecap doublecup doubleparent \ +doubleprime doubleverticalbar dowith dowithnextbox dowithnextboxcontent \ +dowithnextboxcontentcs dowithnextboxcs dowithpargument dowithrange dowithwargument \ +downarrow downdasharrow downdownarrows downharpoonleft downharpoonright \ +downuparrows downwhitearrow downzigzagarrow dpofstring dstroke \ +dtail dummydigit dummyparameter dzcaronligature dzligature \ +eTeX eacute ebreve ecaron ecedilla \ +ecircumflex ecircumflexacute ecircumflexdotbelow ecircumflexgrave ecircumflexhook \ +ecircumflextilde edefconvertedargument ediaeresis edotaccent edotbelow \ +edoublegrave efcmaxheight efcmaxwidth efcminheight efcminwidth \ +efcparameter effect egrave ehook einvertedbreve \ +elapsedseconds elapsedtime eleftarrowfill eleftharpoondownfill eleftharpoonupfill \ +eleftrightarrowfill ell em emacron emdash \ +emphasisboldface emphasistypeface emptylines emptyset emquad \ +emspace enabledirectives enableexperiments enablemode enableoutputstream \ +enableparpositions enableregime enabletrackers endash endnote \ +enquad enskip enspace env environment \ +envvar eogonek eoverbarfill eoverbracefill eoverbracketfill \ +eoverparentfill epos epsilon eq eqcirc \ +eqeq eqeqeq eqgtr eqless eqsim \ +eqslantgtr eqslantless equaldigits equalscolon equiv \ +erightarrowfill erightharpoondownfill erightharpoonupfill eta eth \ +ethiopic etilde etwoheadrightarrowfill eunderbarfill eunderbracefill \ +eunderbracketfill eunderparentfill exclamdown executeifdefined exists \ exitloop exitloopnow expandcheckedcsname expanded expandfontsynonym \ -externalfigurecollectionmaxheight externalfigurecollectionmaxwidth externalfigurecollectionminheight externalfigurecollectionminwidth externalfigurecollectionparameter \ -externiobraz fakebox fastdecrement fastincrement fastlocalframed \ -fastscale fastsetup fastsetupwithargument fastsetupwithargumentswapped fastswitchtobodyfont \ -fastsxsy feature fence fenced fetchallmarkings \ -fetchallmarks fetchmark fetchmarking fetchonemark fetchonemarking \ -fetchruntinecommand fetchtwomarkings fetchtwomarks fieldbody fifthoffivearguments \ -fifthofsixarguments figurefilename figurefilepath figurefiletype figurefullname \ -figureheight figurenaturalheight figurenaturalwidth figuresymbol figurewidth \ -filename filledhboxb filledhboxc filledhboxg filledhboxk \ -filledhboxm filledhboxr filledhboxy filler filterfromnext \ -filterfromvalue filterpages filterreference findtwopassdata finishregisterentry \ -firstcharacter firstcounter firstcountervalue firstoffivearguments firstoffourarguments \ -firstofoneargument firstofoneunexpanded firstofsixarguments firstofthreearguments firstofthreeunexpanded \ -firstoftwoarguments firstoftwounexpanded firstrealpage firstrealpagenumber firstsubcountervalue \ -firstsubpage firstsubpagenumber firstuserpage firstuserpagenumber fitfieldframed \ -fittopbaselinegrid flag floatuserdataparameter flushboxregister flushcollector \ -flushlayer flushlocalfloats flushnextbox flushnotes flushoutputstream \ -flushshapebox flushtextflow flushtokens flushtoks fontalternative \ -fontbody fontchar fontcharbyindex fontclass fontclassname \ -fontface fontfeaturelist fontsize fontstyle footnotetext \ -forcecharacterstripping forcelocalfloats forgeteverypar forgetparameters formula \ -foundbox fourthoffivearguments fourthoffourarguments fourthofsixarguments frac \ -frameddimension framedparameter framedtext freezedimenmacro freezemeasure \ -frenchspacing fromlinenote frozenhbox gdefconvertedargument gdefconvertedcommand \ -getMPdrawing getMPlayer getboxllx getboxlly getbufferdata \ -getcommacommandsize getcommalistsize getdayoftheweek getdayspermonth getdefinedbuffer \ -getdocumentargument getdocumentargumentdefault getdocumentfilename getdummyparameters getemptyparameters \ -geteparameters getexpandedparameters getfiguredimensions getfirstcharacter getfirsttwopassdata \ -getfromcommacommand getfromcommalist getfromtwopassdata getglyphdirect getglyphstyled \ -getgparameters getlasttwopassdata getlocalfloat getlocalfloats getmessage \ +expdoif expdoifcommonelse expdoifelse expdoifelsecommon expdoifelseinset \ +expdoifinsetelse expdoifnot exponentiale externalfigure externalfigurecollectionmaxheight \ +externalfigurecollectionmaxwidth externalfigurecollectionminheight externalfigurecollectionminwidth externalfigurecollectionparameter fakebox \ +fallingdotseq fastdecrement fastincrement fastlocalframed fastloopfinal \ +fastloopindex fastscale fastsetup fastsetupwithargument fastsetupwithargumentswapped \ +fastswitchtobodyfont fastsxsy feature fence fenced \ +fetchallmarkings fetchallmarks fetchmark fetchmarking fetchonemark \ +fetchonemarking fetchruntinecommand fetchtwomarkings fetchtwomarks ffiligature \ +ffligature fflligature fhook field fieldbody \ +fieldstack fifthoffivearguments fifthofsixarguments figurefilename figurefilepath \ +figurefiletype figurefullname figureheight figurenaturalheight figurenaturalwidth \ +figurespace figuresymbol figurewidth filename filigature \ +filledhboxb filledhboxc filledhboxg filledhboxk filledhboxm \ +filledhboxr filledhboxy filler fillinline fillinrules \ +fillintext filterfromnext filterfromvalue filterpages filterreference \ +findtwopassdata finishregisterentry firstcharacter firstcounter firstcountervalue \ +firstoffivearguments firstoffourarguments firstofoneargument firstofoneunexpanded firstofsixarguments \ +firstofthreearguments firstofthreeunexpanded firstoftwoarguments firstoftwounexpanded firstrealpage \ +firstrealpagenumber firstsubcountervalue firstsubpage firstsubpagenumber firstuserpage \ +firstuserpagenumber fitfield fitfieldframed fittopbaselinegrid fiveeighths \ +fivesixths fixedspace fixedspaces flag flat \ +flligature floatuserdataparameter flushbox flushboxregister flushcollector \ +flushedrightlastline flushlayer flushlocalfloats flushnextbox flushnotes \ +flushoutputstream flushshapebox flushtextflow flushtokens flushtoks \ +fontalternative fontbody fontchar fontcharbyindex fontclass \ +fontclassname fontface fontfeaturelist fontsize fontstyle \ +footnote footnotetext forall forcecharacterstripping forcelocalfloats \ +forgeteverypar forgetparameters forgetragged formula formulanumber \ +foundbox fourfifths fourperemspace fourthoffivearguments fourthoffourarguments \ +fourthofsixarguments frac framed frameddimension framedparameter \ +framedtext freezedimenmacro freezemeasure frenchspacing from \ +fromlinenote frown frozenhbox frule gacute \ +gamma gbreve gcaron gcircumflex gcommaaccent \ +gdefconvertedargument gdefconvertedcommand gdotaccent ge geq \ +geqq geqslant getMPdrawing getMPlayer getboxfromcache \ +getboxllx getboxlly getbuffer getbufferdata getcommacommandsize \ +getcommalistsize getdayoftheweek getdayspermonth getdefinedbuffer getdocumentargument \ +getdocumentargumentdefault getdocumentfilename getdummyparameters getemptyparameters geteparameters \ +getexpandedparameters getfiguredimensions getfirstcharacter getfirsttwopassdata getfromcommacommand \ +getfromcommalist getfromtwopassdata getglyphdirect getglyphstyled getgparameters \ +getlasttwopassdata getlocalfloat getlocalfloats getmarking getmessage \ getnamedglyphdirect getnamedglyphstyled getnamedtwopassdatalist getnaturaldimensions getnoflines \ getobject getobjectdimensions getpaletsize getparameters getprivatechar \ getprivateslot getrandomcount getrandomdimen getrandomfloat getrandomnumber \ getrandomseed getraweparameters getrawgparameters getrawnoflines getrawparameters \ -getrawxparameters getreference getreferenceentry getroundednoflines getsubstring \ -gettwopassdata gettwopassdatalist getuvalue getvalue getvariable \ -getvariabledefault getxparameters globaldisablemode globalenablemode globalletempty \ +getrawxparameters getreference getreferenceentry getroundednoflines gets \ +getsubstring gettwopassdata gettwopassdatalist getuvalue getvalue \ +getvariable getvariabledefault getxparameters gg ggg \ +gggtr gimel globaldisablemode globalenablemode globalletempty \ globalpopbox globalpopmacro globalpreventmode globalprocesscommalist globalpushbox \ globalpushmacro globalswapcounts globalswapdimens globalswapmacros globalundefine \ -glyphfontfile gobbledoubleempty gobbleeightarguments gobblefivearguments gobblefiveoptionals \ -gobblefourarguments gobblefouroptionals gobbleninearguments gobbleoneargument gobbleoneoptional \ -gobblesevenarguments gobblesingleempty gobblesixarguments gobblespacetokens gobbletenarguments \ -gobblethreearguments gobblethreeoptionals gobbletwoarguments gobbletwooptionals gobbleuntil \ -gobbleuntilrelax grabbufferdata grabbufferdatadirect grabuntil graf \ -grayvalue greedysplitstring greeknumerals groupedcommand gsetboxllx \ -gsetboxlly gujaratinumerals gurmurkhinumerals hairspace halfwaybox \ -handletokens handwritten hash hboxofvbox hboxreference \ -hdofstring headhbox headnumbercontent headnumberdistance headnumberwidth \ -headreferenceattributes headsetupspacing headtextcontent headtextdistance headtextwidth \ -headvbox headwidth heightanddepthofstring heightofstring heightspanningtext \ -helptext hglue hiddenbar hiddencitation hiddencite \ -highlight highordinalstr hilo himilo hl \ -hlavnijazyk hodnotabarvy horizontalgrowingbar horizontalpositionbar hphantom \ -hpos hsizefraction hsmash hsmashbox hsmashed \ -hspace htdpofstring htofstring hyphen hyphenatedcoloredword \ -hyphenatedfile hyphenatedfilename hyphenatedhbox hyphenatedpar hyphenatedurl \ -hyphenatedword ibox ifassignment iff ifinobject \ -ifinoutputstream ifparameters iftrialtypesetting ignoreimplicitspaces ignorevalue \ -immediatesavetwopassdata impliedby implies includemenu includeversioninfo \ -increment incrementcounter incrementedcounter incrementpagenumber incrementsubpagenumber \ -incrementvalue indentation infofont infofontbold inheritparameter \ -inhibitblank initializeboxstack inlinebuffer inlinedbox inlinemath \ -inlinemathematics inlinemessage inlineordisplaymath inlinerange innerflushshapebox \ -input inputfilebarename inputfilename inputfilerealsuffix inputfilesuffix \ -inputgivenfile insertpages instalacejazyka installactionhandler installactivecharacter \ -installanddefineactivecharacter installattributestack installautocommandhandler installautosetuphandler installbasicautosetuphandler \ -installbasicparameterhandler installbottomframerenderer installcommandhandler installcorenamespace installdefinehandler \ -installdefinitionset installdefinitionsetmember installdirectcommandhandler installdirectparameterhandler installdirectparametersethandler \ -installdirectsetuphandler installdirectstyleandcolorhandler installframedautocommandhandler installframedcommandhandler installleftframerenderer \ -installnamespace installoutputroutine installpagearrangement installparameterhandler installparameterhashhandler \ -installparametersethandler installparentinjector installrightframerenderer installrootparameterhandler installsetuphandler \ -installsetuponlycommandhandler installshipoutmethod installsimplecommandhandler installsimpleframedcommandhandler installstyleandcolorhandler \ -installswitchcommandhandler installswitchsetuphandler installtexdirective installtextracker installtopframerenderer \ -installunitsseparator installunitsspace installversioninfo integerrounding interakcnilista \ -interakcnitlacitka interaktivnimenu intermezzo intertext invokepageheandler \ -istltdir istrtdir italic italicbold italiccorrection \ -itemtag jazyk jdidolu jdina jdinabox \ -jdinastranu jobfilename jobfilesuffix kap kapitola \ -keeplinestogether keepunwantedspaces kerncharacters klonujpole komentar \ -komponenta konvertujcislo kopirujpole koreancirclenumerals koreannumerals \ -koreannumeralsc koreannumeralsp koreanparentnumerals korekcebilehomista languageCharacters \ -languagecharacters languagecharwidth lastcounter lastcountervalue lastdigit \ -lastlinewidth lastnaturalboxdp lastnaturalboxht lastnaturalboxwd lastpredefinedsymbol \ -lastrealpage lastrealpagenumber lastsubcountervalue lastsubpage lastsubpagenumber \ -lasttwodigits lastuserpage lastuserpagenumber lateluacode layeredtext \ -layerheight layerwidth lazysavetaggedtwopassdata lazysavetwopassdata lbox \ -left leftbottombox leftbox lefthbox leftorrighthbox \ -leftorrightvbox leftorrightvtop leftskipadaption leftsubguillemot lefttopbox \ -lefttorighthbox lefttorightvbox lefttorightvtop letbeundefined letcatcodecommand \ -letcscsname letcsnamecs letcsnamecsname letdummyparameter letempty \ -letgvalue letgvalueempty letgvalurelax letterampersand letterat \ -letterbackslash letterbar letterbgroup letterclosebrace lettercolon \ -letterdollar letterdoublequote letteregroup letterescape letterexclamationmark \ -letterhash letterhat letterleftbrace letterless lettermore \ -letteropenbrace letterpercent letterquestionmark letterrightbrace lettersinglequote \ -letterslash letterspacing lettertilde letterunderscore letvalue \ -letvalueempty letvaluerelax lfence lhbox limitatelines \ -limitatetext limtatefirstline linespanningtext listcitation listcite \ -listnamespaces llap loadanyfile loadanyfileonce loadbtxdefinitionfile \ -loadbtxreplacementfile loadcldfile loadcldfileonce loadfontgoodies loadluafile \ -loadluafileonce loadspellchecklist loadtexfile loadtexfileonce loadtypescriptfile \ -localframed localframedwithsettings localhsize localpopbox localpopmacro \ -localpushbox localpushmacro localundefine locatedfilepath locatefilepath \ -locfilename lomihi lowerbox lowercased lowercasestring \ -lowerleftdoubleninequote lowerleftsingleninequote lowerrightdoubleninequote lowerrightsingleninequote lrtbbox \ -ltop luaTeX luacode luaconditional luaenvironment \ -luaexpanded luafunction luajitTeX luamajorversion luaminorversion \ -luaparameterset luasetup luaversion m mLeftarrow \ -mLeftrightarrow mRightarrow makecharacteractive makerawcommalist makestrutofbox \ -maoramovani mapfontsize margindata markcontent markinjector \ -mat matematika math mathbf mathbi \ -mathblackboard mathbs mathcommand mathdefault mathfraktur \ -mathfunction mathit mathitalic mathop mathrm \ -mathscript mathsl mathss mathtext mathtextbf \ -mathtextbi mathtextbs mathtextit mathtextsl mathtexttf \ -mathtf mathtriplet mathtt mathupright mathword \ -mathwordbf mathwordbi mathwordbs mathwordit mathwordsl \ -mathwordtf mazaramovani mbox mcframed md \ -measure measured medskip medspace mequal \ -meritko mesic message metaTeX mezera \ -mfence mfunction mfunctionlabeltext mhbox mhookleftarrow \ -mhookrightarrow middle middlebox midhbox minimalhbox \ -mixedcaps mkvibuffer mleftarrow mleftharpoondown mleftharpoonup \ -mleftrightarrow mleftrightharpoons mmapsto moduleparameter molecule \ -mono monobold mononormal monthlong monthshort \ -mp mprandomnumber mrel mrightarrow mrightharpoondown \ -mrightharpoonup mrightleftharpoons mrightoverleftarrow mrizka mtext \ -mtriplerel mtwoheadleftarrow mtwoheadrightarrow namedheadnumber namedstructureheadlocation \ -namedstructureuservariable namedstructurevariable namedtaggedlabeltexts nastavbarvu nastavbarvy \ -nastavbilamista nastavblok nastavbloksekce nastavbuffer nastavcernelinky \ -nastavcislonadpisu nastavcislostrany nastavcislovaniodstavcu nastavcislovaniradku nastavcislovanistran \ -nastavcitaci nastavdeleniplvoucichobjektu nastavdelitko nastavdolnitexty nastavhorejsek \ -nastavhornitexty nastavinterakci nastavinterakcnilistu nastavinterakcnimenu nastavinterakcniobrazovku \ -nastavjazyk nastavkapitalky nastavkombinovanyseznam nastavkomentar nastavkomentarstrany \ -nastavmarginalnilinky nastavmeziradkovoumezeru nastavnadpis nastavnadpisy nastavodkazovani \ -nastavodsazovani nastavodstavce nastavopis nastavoramovani nastavorez \ -nastavotoceni nastavpaletu nastavplvouciobjekt nastavpodcislostrany nastavpole \ -nastavpolozky nastavpopisek nastavpozadi nastavprechodstrany nastavpreskok \ -nastavprogramy nastavradkovani nastavradky nastavrejstrik nastavsadusymbolu \ -nastavseznam nastavsirkucary nastavsloupce nastavspodek nastavsynonyma \ -nastavtabelaci nastavtabulky nastavtenkelinky nastavtext nastavtextovelinky \ -nastavtexttexty nastavtextyupati nastavtextyzahlavi nastavtoleranci nastavtrideni \ -nastavtype nastavumisteniprotejsku nastavumistovani nastavupati nastavupravu \ -nastavurl nastavusporadani nastavvelikostpapiru nastavvsechnapole nastavvycty \ -nastavvyplnovelinky nastavvyplnoveradky nastavvzhled nastavzahlavi nastavzakladnifont \ -nastavznaceni nastavzuzeni nastrane naturalhbox naturalhpack \ -naturalvbox naturalvcenter naturalvpack naturalvtop naturalwd \ -negatecolorbox negated negthinspace nejakyradek nekde \ -newattribute newcatcodetable newcounter newevery newfrenchspacing \ -newmode newsignal newsystemmode nextbox nextboxdp \ -nextboxht nextboxhtdp nextboxwd nextcounter nextcountervalue \ -nextdepth nextparagraphs nextrealpage nextrealpagenumber nextsubcountervalue \ -nextsubpage nextsubpagenumber nextuserpage nextuserpagenumber neznamo \ -nivy nizky nobar nocitation nocite \ -nodetostring noffigurepages noflines noflocalfloats noindentation \ -noitem nokap nonfrenchspacing nonmathematics normal \ -normalboldface normalframedwithsettings normalizebodyfontsize normalizedfontsize normalizefontdepth \ -normalizefontheight normalizefontline normalizefontwidth normalizetextdepth normalizetextheight \ -normalizetextline normalizetextwidth normaltypeface notesymbol ntimes \ -numberofpoints obeydepth objectdepth objectheight objectmargin \ -objectwidth obox obrazek obrazovka odkaz \ -odkaznastranu odkaznatext odkazujici offset offsetbox \ -onedigitrounding opis opissoubor oramovani oramovanytext \ -ordinaldaynumber ordinalstr oref orez ornamenttext \ -otocit outputfilename outputstreambox outputstreamcopy outputstreamunvbox \ -outputstreamunvcopy over overbar overbars overbartext \ -overbarunderbar overbrace overbracetext overbraceunderbrace overbracket \ -overbrackettext overbracketunderbracket overlaybutton overlaycolor overlaydepth \ -overlayfigure overlayheight overlaylinecolor overlaylinewidth overlayoffset \ -overlayrollbutton overlaywidth overleftarrow overleftharpoondown overleftharpoonup \ -overleftrightarrow overloaderror overparent overparenttext overparentunderparent \ -overrightarrow overrightharpoondown overrightharpoonup overset overstrike \ -overstrikes overtwoheadleftarrow overtwoheadrightarrow oznaceni pagearea \ -pagebreak pagefigure pagegridspanwidth pageinjection pagestaterealpage \ -paletsize pdfTeX pdfactualtext pdfbackendactualtext pdfbackendcurrentresources \ -pdfbackendsetcatalog pdfbackendsetcolorspace pdfbackendsetextgstate pdfbackendsetinfo pdfbackendsetname \ -pdfbackendsetpageattribute pdfbackendsetpageresource pdfbackendsetpagesattribute pdfbackendsetpattern pdfbackendsetshade \ -pdfcolor pdfeTeX percent percentdimen permitcaretescape \ -permitcircumflexescape permitspacesbetweengroups persiandecimals persiannumerals phantom \ -phantombox pickupgroupedcommand pis placeattachments placebtxrendering \ -placecitation placecomments placecurrentformulanumber placedbox placefloat \ -placefloatwithsetups placeframed placeheadnumber placeheadtext placehelp \ -placeinitial placelayer placelayeredtext placelistofpublications placelistofsorts \ -placelistofsynonyms placelocalnotes placement placenamedfloat placenamedformula \ -placenotes placepagenumber placepairedbox placeparallel placerawlist \ -placerenderingwindow plnezneni podpodpodpodsekce podpodpodpodtema podpodpodsekce \ -podpodpodtema podpodsekce podpodtema podsekce podtema \ -pole polozka polozky popattribute popmacro \ -popmode popsystemmode porovnejpaletu porovnejskupinubarev positionoverlay \ -positionregionoverlay postponenotes pozadi pozice poznamka \ -predefinedfont predefinefont predefinesymbol pref prefixedpagenumber \ -prelozit prependetoks prependgvalue prependtocommalist prependtoks \ -prependtoksonce prependvalue prepninazakladnifont presetdocument presetfieldsymbols \ -preskoc pretocommalist prevcounter prevcountervalue preventmode \ -prevrealpage prevrealpagenumber prevsubcountervalue prevsubpage prevsubpagenumber \ -prevuserpage prevuserpagenumber prizpusobivepole prizpusobvzhled procent \ -processMPbuffer processMPfigurefile processaction processallactionsinset processassignlist \ -processassignmentcommand processassignmentlist processbetween processbodyfontenvironmentlist processcolorcomponents \ -processcommacommand processcommalist processcommalistwithparameters processcontent processfile \ -processfilemany processfilenone processfileonce processfirstactioninset processisolatedchars \ -processisolatedwords processlinetablebuffer processlinetablefile processlist processmonth \ -processranges processseparatedlist processtexbuffer processtokens processuntil \ -processxtablebuffer processyear produkt profiledbox profilegivenbox \ -program projekt prostredi pseudoMixedCapped pseudoSmallCapped \ -pseudoSmallcapped pseudosmallcapped purenumber pushattribute pushbutton \ -pushmacro pushmode pushoutputstream pushsystemmode qquad \ -quad quads quitcommalist quitprevcommalist quittypescriptscanning \ -raisebox randomizetext randomnumber rawcounter rawcountervalue \ -rawdate rawdoifelseinset rawdoifinset rawdoifinsetelse rawgetparameters \ -rawprocessaction rawprocesscommacommand rawprocesscommalist rawstructurelistuservariable rawsubcountervalue \ -rbox readfile readfixfile readjobfile readlocfile \ -readsetfile readsysfile readtexfile readxmlfile realSmallCapped \ -realSmallcapped realpagenumber realsmallcapped recursedepth recurselevel \ -recursestring redoconvertfont ref referenceprefix registerattachment \ -registerctxluafile registerexternalfigure registerfontclass registerhyphenationexception registerhyphenationpattern \ -registermenubuttons registersort registersynonym registerunit regular \ -relatemarking relateparameterhandlers relaxvalueifundefined remainingcharacters removebottomthings \ -removedepth removefromcommalist removelastskip removelastspace removemarkedcontent \ -removepunctuation removesubstring removetoks removeunwantedspaces replacefeature \ -replaceincommalist replaceword rescan rescanwithsetup resetMPdrawing \ -resetMPenvironment resetMPinstance resetallattributes resetandaddfeature resetbar \ -resetbreakpoints resetbuffer resetcharacteralign resetcharacterkerning resetcharacterspacing \ -resetcharacterstripping resetcollector resetcounter resetdigitsmanipulation resetdirection \ -resetfeature resetflag resetfontcolorsheme resetfontfallback resetfontsolution \ -resethyphenationfeatures resetinjector resetinteractionmenu resetitaliccorrection resetlayer \ -resetlocalfloats resetmarker resetmode resetpagenumber resetparallel \ -resetpath resetpenalties resetprofile resetreference resetreplacement \ -resetscript resetsetups resetshownsynonyms resetsubpagenumber resetsymbolset \ -resetsystemmode resettimer resettrackers resettrialtypesetting resetusedsortings \ -resetusedsynonyms resetuserpagenumber resetvalue resetvisualizers resetznaceni \ -reshapebox resolvedglyphdirect resolvedglyphstyled restartcounter restorebox \ -restorecatcodes restorecounter restorecurrentattributes restoreendofline restoreglobalbodyfont \ -reusableMPgraphic reuseMPgraphic reuserandomseed revivefeature rfence \ -rhbox right rightbottombox rightbox righthbox \ -rightorleftpageaction rightskipadaption rightsubguillemot righttolefthbox righttoleftvbox \ -righttoleftvtop righttopbox rimskecislice rlap robustaddtocommalist \ -robustdoifelseinset robustdoifinsetelse robustpretocommalist rollbutton roman \ -rozdelplvouciobjekt roztazene rtop ruledhbox ruledhpack \ -ruledmbox ruledtopv ruledtpack ruledvbox ruledvpack \ -ruledvtop runMPbuffer runninghbox safechar sans \ -sansbold sansnormal sansserif savebox savebtxdataset \ -savebuffer savecounter savecurrentattributes savenormalmeaning savetaggedtwopassdata \ -savetwopassdata sbox schovejbloky sd secondoffivearguments \ -secondoffourarguments secondofsixarguments secondofthreearguments secondofthreeunexpanded secondoftwoarguments \ -secondoftwounexpanded sedabarva sekce select serializecommalist \ -serializedcommalist serif serifbold serifnormal setJSpreamble \ -setMPlayer setMPpositiongraphic setMPpositiongraphicrange setMPtext setMPvariable \ -setMPvariables setbar setbigbodyfont setboxllx setboxlly \ -setbreakpoints setcapstrut setcatcodetable setcharacteralign setcharactercasing \ -setcharactercleaning setcharacterkerning setcharacterspacing setcharacterstripping setcharstrut \ -setcollector setcolormodell setcounter setcounterown setcurrentfontclass \ -setdataset setdefaultpenalties setdigitsmanipulation setdirection setdocumentargument \ -setdocumentargumentdefault setdocumentfilename setdummyparameter setelementexporttag setemeasure \ -setevalue setevariable setevariables setfirstline setflag \ -setfont setfontcolorsheme setfontfeature setfontsolution setfontstrut \ -setfractions setgmeasure setgvalue setgvariable setgvariables \ -sethboxregister sethyphenatedurlafter sethyphenatedurlbefore sethyphenatedurlnormal sethyphenationfeatures \ -setinitial setinjector setinteraction setinterfacecommand setinterfaceconstant \ -setinterfaceelements setinterfacemessage setinterfacevariable setinternalrendering setitaliccorrection \ -setlayer setlayerframed setlayertext setlinefiller setlocalhsize \ -setmainbodyfont setmainparbuilder setmarker setmarking setmathstyle \ -setmeasure setmessagetext setmode setnostrut setnote \ -setnotetext setobject setoldstyle setpagegrid setpagereference \ -setpagestate setpagestaterealpageno setpenalties setpercentdimen setposition \ -setpositionbox setpositiondata setpositiondataplus setpositiononly setpositionplus \ -setpositionstrut setprofile setrandomseed setreference setreferencedobject \ -setregisterentry setreplacement setrigidcolumnbalance setrigidcolumnhsize setscript \ -setsectionblock setsimplecolumnhsize setsmallbodyfont setsmallcaps setstackbox \ -setstructurepageregister setstrut setsuperiors setsystemmode settabular \ -settaggedmetadata settextcontent settightobject settightreferencedobject settightunreferencedobject \ -settrialtypesetting setuevalue setugvalue setunreferencedobject setup \ -setupMPgraphics setupMPinstance setupMPpage setupMPvariables setupTABLE \ -setupTEXpage setupattachment setupbackend setupbar setupbleeding \ -setupbookmark setupbtx setupbtxdataset setupbtxlist setupbtxregister \ -setupbtxrendering setupbutton setupcharacterkerning setupcharacterspacing setupchemical \ -setupchemicalframed setupcollector setupcolumnspan setupcombination setupcounter \ -setupdataset setupdelimitedtext setupdescription setupdirections setupdocument \ -setupeffect setupenumeration setupenv setupexport setupexternalfigure \ -setupexternalsoundtracks setupfieldbody setupfieldcategory setupfieldcontentframed setupfieldlabelframed \ -setupfieldtotalframed setupfiller setupfirstline setupfittingpage setupfloatcaption \ -setupfontexpansion setupfontprotrusion setupfonts setupfontsolution setupforms \ -setupformula setupformulaframed setupframedcontent setupframedtext setupglobalreferenceprefix \ -setupheadalternative setuphelp setuphigh setuphighlight setuphyphenation \ -setupindentedtext setupinitial setupinsertion setupitaliccorrection setupitemgroup \ -setuplabel setuplayer setuplayeredtext setuplayouttext setuplinefiller \ -setuplinefillers setuplinenote setuplinetable setuplistalternative setuplistextra \ -setuplocalfloats setuplocalinterlinespace setuplow setuplowhigh setuplowmidhigh \ -setupmarginblock setupmargindata setupmarginframed setupmarginrule setupmathalignment \ -setupmathcases setupmathematics setupmathfence setupmathfraction setupmathframed \ -setupmathmatrix setupmathornament setupmathradical setupmathstackers setupmathstyle \ -setupmixedcolumns setupmodule setupnotation setupnotations setupnote \ -setupnotes setupoffset setupoffsetbox setupoutputroutine setuppagechecker \ -setuppagegrid setuppagegridarea setuppagegridareatext setuppagegridlines setuppagegridspan \ -setuppagegridstart setuppageinjection setuppageinjectionalternative setuppageshift setuppagestate \ -setuppairedbox setuppaper setupparagraph setupparagraphintro setupparallel \ -setupperiods setupplacement setuppositionbar setupprocessor setupprofile \ -setupquotation setuprealpagenumber setupreferenceformat setupreferenceprefix setupreferencestructureprefix \ -setupregisters setuprenderingwindow setups setupscale setupscript \ -setupscripts setupselector setupshift setupsidebar setupspellchecking \ -setupstartstop setupstretched setupstruts setupstyle setupsubformula \ -setuptabulation setuptagging setuptextbackground setuptextflow setuptooltip \ -setupunit setupuserpagenumber setupversion setupviewerlayer setupvspacing \ -setupwithargument setupwithargumentswapped setupxml setupxtable setuvalue \ -setuxvalue setvalue setvariable setvariables setvboxregister \ -setvisualizerfont setvtopregister setwidthof setxmeasure setxvalue \ -setxvariable setxvariables sfrac shapedhbox showallmakeup \ -showattributes showboxes showbtxdatasetauthors showbtxdatasetcompleteness showbtxdatasetfields \ -showbtxfields showbtxhashedauthors showbtxtables showchardata showcharratio \ -showcolorbar showcolorcomponents showcolorset showcolorstruts showcounter \ -showdirectives showdirsinmargin showedebuginfo showexperiments showfont \ -showfontdata showfontkerns showfontparameters showfontstrip showfontstyle \ -showglyphs showgridsnapping showhelp showhyphenationtrace showhyphens \ -showinjector showjustification showkerning showlayoutcomponents showligature \ -showligatures showlogcategories showmargins showmessage showminimalbaseline \ -shownextbox showotfcomposition showparentchain showsetupsdefinition showtimer \ -showtokens showtrackers showvalue showvariable showwarning \ -simplegroupedcommand singalcharacteralign singlebond sixthofsixarguments skryt \ -slanted slantedbold slicepages sloupec slovenianNumerals \ -sloveniannumerals small smallbodyfont smallbold smallbolditalic \ -smallboldslanted smallcappedcharacters smallcappedromannumerals smaller smallitalicbold \ -smallnormal smallskip smallslanted smallslantedbold smalltype \ -smash smashbox smashboxed smashedhbox smashedvbox \ -snaptogrid someheadnumber somekindoftab somelocalfloat somenamedheadnumber \ -someplace sp spanishNumerals spanishnumerals speech \ -splitatasterisk splitatcolon splitatcolons splitatcomma splitdfrac \ -splitfilename splitfrac splitoffbase splitofffull splitoffkind \ -splitoffname splitoffpath splitoffroot splitofftokens splitofftype \ -splitstring spreadhbox sqrt stackrel stanovcharakteristickuseznamu \ -stanovcislonadpisu startJScode startJSpreamble startMPclip startMPcode \ -startMPdefinitions startMPdrawing startMPenvironment startMPextensions startMPinclusions \ -startMPinitializations startMPpage startMPpositiongraphic startMPpositionmethod startMPrun \ -startTABLE startTABLEbody startTABLEfoot startTABLEhead startTABLEnext \ -startTC startTD startTDs startTEXpage startTH \ -startTN startTR startTRs startTX startTY \ -startallmodes startarrangedpages startaside startattachment startbar \ -startbarva startbinom startbitmapimage startblockquote startbtxrenderingdefinitions \ -startbuffer startbutton startcatcodetable startcharacteralign startcheckedfences \ -startchemical startcitace startcitovat startcollect startcollecting \ -startcolorintent startcoloronly startcolorset startcolumns startcolumnspan \ -startcombination startcomment startcontextcode startcontextdefinitioncode startctxfunction \ -startctxfunctiondefinition startcurrentcolor startcurrentlistentrywrapper startdbinom startdelimited \ -startdelimitedtext startdfrac startdisplaymath startdmath startdocument \ -starteffect startelement startembeddedxtable startendofline startexceptions \ -startexpanded startexpandedcollect startextendedcatcodetable startexternalfigurecollection startfigure \ -startfitfieldframed startfittingpage startfloatcombination startfont startfontclass \ -startfontsolution startformula startformulas startfrac startframedcontent \ -startframedtext startgraf startgridsnapping starthbox starthboxestohbox \ -starthboxregister starthelptext starthiddenbar starthiding starthighlight \ -starthyphenation startimath startindentation startindentedtext startinmframed \ -startinteraction startinteraktivnimenu startinterface startintermezzo startintertext \ -startitemgroup startjdina startkapitola startknockout startkomentar \ -startkomponenta startlayout startlinecorrection startlinefiller startlinenumbering \ -startlinetable startlinetablebody startlinetablecell startlinetablehead startlocalfootnotes \ -startlocalheadsetup startlocallinecorrection startlocalnotes startlocalsetups startlua \ -startluacode startluaparameterset startluasetups startmakeup startmarginalnilinka \ -startmarginblock startmarkedcontent startmathmode startmathstyle startmatrices \ -startmcframed startmdformula startmframed startmixedcolumns startmode \ -startmodeset startmodule startmoduletestsection startmpformula startnadpis \ -startnadtrzeni startnadtrzeno startnamedsection startnamedsubformulas startnarrow \ -startnarrower startnegative startnicelyfilledbox startnobar startnointerference \ -startnotallmodes startnotext startnotmode startobrazek startopposite \ -startoramovani startoramovanytext startoutputstream startoverlay startoverprint \ -startpagecomment startpagefigure startpagegrid startpagegridspan startpagelayout \ -startpar startparagraph startparagraphs startparagraphscell startparbuilder \ -startpath startplacepairedbox startpodpodpodpodsekce startpodpodpodpodtema startpodpodpodsekce \ -startpodpodpodtema startpodpodsekce startpodpodtema startpodsekce startpodtema \ -startpodtrzeni startpodtrzeno startpolozka startpositioning startpositionoverlay \ -startpositive startpostponing startpozadi startpreskrtnuti startpreskrtnuto \ -startprocessassignmentcommand startprocessassignmentlist startprocesscommacommand startprocesscommalist startprodukt \ -startprojekt startprostredi startprotect startprotectedcolors startpublikace \ -startpunctuation startradek startrandomized startrandomseed startrawsetups \ -startreadingfile startreferenceprefix startregime startregister startreusableMPgraphic \ -startscript startsdformula startsectionblock startsectionblockenvironment startsectionlevel \ -startsekce startsetups startsfrac startshapebox startshift \ -startsidebar startsimplecolumns startspecialitem startspeech startspformula \ -startspread startstartstop startstaticMPfigure startstaticMPgraphic startstrictinspectnextcharacter \ -startstructurepageregister startstrut startstyle startsubformulas startsubjectlevel \ -startsubsentence startsubstack startsymbolset starttable starttablehead \ -starttables starttabletail starttabulate starttabulatehead starttabulatetail \ -starttabulka starttagged starttbinom starttema starttexcode \ -starttexdefinition starttext starttextbackground starttextbackgroundmanual starttextcolor \ -starttextcolorintent starttextflow starttextnapovedy starttextovalinka starttitul \ -starttokens starttransparent starttypescript starttypescriptcollection startumistirovnici \ -startunderdash startunderdashes startunderdot startunderdots startunderrandom \ -startunderrandoms startunderstrike startunderstrikes startunframed startuniqueMPgraphic \ -startuniqueMPpagegraphic startunpacked startusableMPgraphic startuseMPgraphic startusemathstyleparameter \ -startusingbtxspecification startvbox startvboxregister startvboxtohbox startvboxtohboxseparator \ -startviewerlayer startvtop startvtopregister startvycet startxcell \ -startxcellgroup startxfrac startxgroup startxmldisplayverbatim startxmlinlineverbatim \ -startxmlraw startxmlsetups startxrow startxrowgroup startxtable \ -startxtablebody startxtablefoot startxtablehead startxtablenext startxxfrac \ -startzhustene stopJScode stopJSpreamble stopMPclip stopMPcode \ -stopMPdefinitions stopMPdrawing stopMPenvironment stopMPextensions stopMPinclusions \ -stopMPinitializations stopMPpage stopMPpositiongraphic stopMPpositionmethod stopMPrun \ -stopTABLE stopTABLEbody stopTABLEfoot stopTABLEhead stopTABLEnext \ -stopTC stopTD stopTDs stopTEXpage stopTH \ -stopTN stopTR stopTRs stopTX stopTY \ -stopallmodes stoparrangedpages stopaside stopattachment stopbar \ -stopbarva stopbinom stopbitmapimage stopblockquote stopbtxrenderingdefinitions \ -stopbuffer stopbutton stopcatcodetable stopcharacteralign stopcheckedfences \ -stopchemical stopcitace stopcitovat stopcollect stopcollecting \ -stopcolorintent stopcoloronly stopcolorset stopcolumns stopcolumnspan \ -stopcombination stopcomment stopcontextcode stopcontextdefinitioncode stopctxfunction \ -stopctxfunctiondefinition stopcurrentcolor stopcurrentlistentrywrapper stopdbinom stopdelimited \ -stopdelimitedtext stopdfrac stopdisplaymath stopdmath stopdocument \ -stopeffect stopelement stopembeddedxtable stopendofline stopexceptions \ -stopexpanded stopexpandedcollect stopextendedcatcodetable stopexternalfigurecollection stopfigure \ -stopfitfieldframed stopfittingpage stopfloatcombination stopfont stopfontclass \ -stopfontsolution stopformula stopformulas stopfrac stopframedcontent \ -stopframedtext stopgraf stopgridsnapping stophbox stophboxestohbox \ -stophboxregister stophelptext stophiddenbar stophiding stophighlight \ -stophyphenation stopimath stopindentation stopindentedtext stopinmframed \ -stopinteraction stopinteraktivnimenu stopinterface stopintermezzo stopintertext \ -stopitemgroup stopjdina stopkapitola stopknockout stopkomentar \ -stopkomponenta stoplayout stoplinecorrection stoplinefiller stoplinenumbering \ -stoplinetable stoplinetablebody stoplinetablecell stoplinetablehead stoplocalfootnotes \ -stoplocalheadsetup stoplocallinecorrection stoplocalnotes stoplocalsetups stoplua \ -stopluacode stopluaparameterset stopluasetups stopmakeup stopmarginalnilinka \ -stopmarginblock stopmarkedcontent stopmathmode stopmathstyle stopmatrices \ -stopmcframed stopmdformula stopmframed stopmixedcolumns stopmode \ -stopmodeset stopmodule stopmoduletestsection stopmpformula stopnadpis \ -stopnadtrzeni stopnadtrzeno stopnamedsection stopnamedsubformulas stopnarrow \ -stopnarrower stopnegative stopnicelyfilledbox stopnobar stopnointerference \ -stopnotallmodes stopnotext stopnotmode stopobrazek stopopposite \ -stoporamovani stoporamovanytext stopoutputstream stopoverlay stopoverprint \ -stoppagecomment stoppagefigure stoppagegrid stoppagegridspan stoppagelayout \ -stoppar stopparagraph stopparagraphs stopparagraphscell stopparbuilder \ -stoppath stopplacepairedbox stoppodpodpodpodsekce stoppodpodpodpodtema stoppodpodpodsekce \ -stoppodpodpodtema stoppodpodsekce stoppodpodtema stoppodsekce stoppodtema \ -stoppodtrzeni stoppodtrzeno stoppolozka stoppositioning stoppositionoverlay \ -stoppositive stoppostponing stoppozadi stoppreskrtnuti stoppreskrtnuto \ -stopprocessassignmentcommand stopprocessassignmentlist stopprocesscommacommand stopprocesscommalist stopprodukt \ -stopprojekt stopprostredi stopprotect stopprotectedcolors stoppublikace \ -stoppunctuation stopradek stoprandomized stoprandomseed stoprawsetups \ -stopreadingfile stopreferenceprefix stopregime stopregister stopreusableMPgraphic \ -stopscript stopsdformula stopsectionblock stopsectionblockenvironment stopsectionlevel \ -stopsekce stopsetups stopsfrac stopshapebox stopshift \ -stopsidebar stopsimplecolumns stopspecialitem stopspeech stopspformula \ -stopspread stopstartstop stopstaticMPfigure stopstaticMPgraphic stopstrictinspectnextcharacter \ -stopstructurepageregister stopstrut stopstyle stopsubformulas stopsubjectlevel \ -stopsubsentence stopsubstack stopsymbolset stoptable stoptablehead \ -stoptables stoptabletail stoptabulate stoptabulatehead stoptabulatetail \ -stoptabulka stoptagged stoptbinom stoptema stoptexcode \ -stoptexdefinition stoptext stoptextbackground stoptextbackgroundmanual stoptextcolor \ -stoptextcolorintent stoptextflow stoptextnapovedy stoptextovalinka stoptitul \ -stoptokens stoptransparent stoptypescript stoptypescriptcollection stopumistirovnici \ -stopunderdash stopunderdashes stopunderdot stopunderdots stopunderrandom \ -stopunderrandoms stopunderstrike stopunderstrikes stopunframed stopuniqueMPgraphic \ -stopuniqueMPpagegraphic stopunpacked stopusableMPgraphic stopuseMPgraphic stopusemathstyleparameter \ -stopusingbtxspecification stopvbox stopvboxregister stopvboxtohbox stopvboxtohboxseparator \ -stopviewerlayer stopvtop stopvtopregister stopvycet stopxcell \ -stopxcellgroup stopxfrac stopxgroup stopxmldisplayverbatim stopxmlinlineverbatim \ -stopxmlraw stopxmlsetups stopxrow stopxrowgroup stopxtable \ -stopxtablebody stopxtablefoot stopxtablehead stopxtablenext stopxxfrac \ -stopzhustene strana strictdoifelsenextoptional strictdoifnextoptionalelse stripcharacter \ -strippedcsname stripspaces structurelistuservariable structurenumber structuretitle \ -structureuservariable structurevariable strut strutdp strutht \ -struthtdp struttedbox strutwd style styleinstance \ -subpagenumber subsentence substituteincommalist subtractfeature swapcounts \ -swapdimens swapface swapmacros swaptypeface switchstyleonly \ -switchtocolor switchtointerlinespace symbol symbolreference synchronizeblank \ -synchronizeindenting synchronizemarking synchronizeoutputstreams synchronizestrut synchronizewhitespace \ -systemlog systemlogfirst systemloglast systemsetups tLeftarrow \ -tLeftrightarrow tRightarrow tabulateautoline tabulateautorule tabulateline \ -tabulaterule tabulka taggedctxcommand taggedlabeltexts tbinom \ -tbox tecky tema tenkalinka tenkelinky \ -tequal testandsplitstring testcolumn testfeature testfeatureonce \ -testpage testpageonly testpagesync testtokens tex \ -texdefinition texsetup textcitation textcite textcontrolspace \ -textflowcollector textmath textminus textnapovedy textormathchar \ -textovalinka textplus textvisiblespace tfrac thainumerals \ -thefirstcharacter thenormalizedbodyfontsize theremainingcharacters thickspace thinspace \ -thirdoffivearguments thirdoffourarguments thirdofsixarguments thirdofthreearguments thirdofthreeunexpanded \ -thookleftarrow thookrightarrow threedigitrounding tibetannumerals tightlayer \ -tinyfont titul tlacitko tlacitkomenu tlap \ -tleftarrow tleftharpoondown tleftharpoonup tleftrightarrow tleftrightharpoons \ -tloustkacary tmapsto tochar tolinenote topbox \ -topleftbox toplinebox toprightbox topskippedbox tracecatcodetables \ -tracedfontname traceoutputroutines tracepositions transparencycomponents transparent \ -tref trel trightarrow trightharpoondown trightharpoonup \ -trightleftharpoons trightoverleftarrow triplebond truefilename truefontname \ -ttriplerel ttwoheadleftarrow ttwoheadrightarrow tvrdamezera tvrdemezery \ -twodigitrounding tx txx typebuffer typedefinedbuffer \ -typeface typescriptone typescriptprefix typescriptthree typescripttwo \ -typesetbuffer typesetfile uconvertnumber uedcatcodecommand ukazbarvu \ -ukazmrizku ukaznastaveni ukazpaletu ukazpodpery ukazpostredizakladnihofontu \ -ukazramecek ukazsadusymbolu ukazskupinubarev ukazupravu ukazvytisk \ -ukazvzhled ukazzakladnifont umistikombinovanyseznam umistilokalnipoznamkypodcarou umistinadsebe \ -umistinamrizku umistipodrovnici umistipoznamkypodcarou umistirejstrik umistirovnici \ -umistiseznam umistivedlesebe umistizalozky undefinevalue undepthed \ -underbar underbars underbartext underbrace underbracetext \ -underbracket underbrackettext underdash underdashes underdot \ -underdots underleftarrow underleftharpoondown underleftharpoonup underleftrightarrow \ -underparent underparenttext underrandom underrandoms underrightarrow \ -underrightharpoondown underrightharpoonup underset understrike understrikes \ -undertwoheadleftarrow undertwoheadrightarrow undoassign unframed unhhbox \ -unihex uniqueMPgraphic uniqueMPpagegraphic unprotected unregisterhyphenationpattern \ -unspaceafter unspaceargument unspaced unspacestring untexargument \ -untexcommand uppercased uppercasestring upperleftdoubleninequote upperleftdoublesixquote \ -upperleftsingleninequote upperleftsinglesixquote upperrightdoubleninequote upperrightdoublesixquote upperrightsingleninequote \ -upperrightsinglesixquote urcicharakteristikurejstriku url useMPenvironmentbuffer useMPgraphic \ -useMPlibrary useMPrun useMPvariables useblankparameter usebodyfont \ -usebodyfontparameter usebtxdataset usebtxdefinitions usecolors usecomponent \ -usedummycolorparameter usedummystyleandcolor usedummystyleparameter useenvironment useexternalrendering \ -usefigurebase usefile usegridparameter useindentingparameter useindentnextparameter \ -useinterlinespaceparameter uselanguageparameter useluamodule usemathstyleparameter useproduct \ -useprofileparameter useproject usereferenceparameter userpagenumber usesetupsparameter \ -usestaticMPfigure usesubpath usetexmodule usetypescript usetypescriptfile \ -usezipfile utfchar utflower utfupper utilityregisterlength \ -uzijJSscripts uzijURL uzijadresar uzijbloky uzijexternidokument \ -uzijexterniobraz uzijexternizvuk uzijmodul uzijsymbol uzijurl \ -vboxreference verbatim verbatimstring verbosenumber verticalgrowingbar \ -verticalpositionbar verze vglue viewerlayer vl \ -vlasovalinka vphantom vpos vradku vsedniden \ -vsmash vsmashbox vsmashed vspace vspacing \ -vyberbloky vycet vyplnenytext vyplnovelinky vyplnovyradek \ -vysoky wdofstring widthofstring widthspanningtext withoutpt \ -word words wordtonumber writedatatolist writestatus \ -xLeftarrow xLeftrightarrow xRightarrow xdefconvertedargument xequal \ -xfrac xhookleftarrow xhookrightarrow xleftarrow xleftharpoondown \ -xleftharpoonup xleftrightarrow xleftrightharpoons xmapsto xmladdindex \ -xmlafterdocumentsetup xmlaftersetup xmlall xmlappenddocumentsetup xmlappendsetup \ -xmlapplyselectors xmlatt xmlattdef xmlattribute xmlattributedef \ -xmlbadinclusions xmlbeforedocumentsetup xmlbeforesetup xmlchainatt xmlchainattdef \ -xmlchecknamespace xmlcommand xmlconcat xmlconcatrange xmlcontext \ -xmlcount xmldefaulttotext xmldirectives xmldirectivesafter xmldirectivesbefore \ -xmldisplayverbatim xmldoif xmldoifelse xmldoifelseempty xmldoifelseselfempty \ -xmldoifelsetext xmldoifelsevalue xmldoifnot xmldoifnotselfempty xmldoifnottext \ -xmldoifselfempty xmldoiftext xmlelement xmlfilter xmlfirst \ -xmlflush xmlflushcontext xmlflushdocumentsetups xmlflushlinewise xmlflushpure \ -xmlflushspacewise xmlflushtext xmlinclude xmlinclusion xmlinclusions \ -xmlinfo xmlinjector xmlinlineverbatim xmlinstalldirective xmllast \ -xmllastatt xmllastmatch xmlloadbuffer xmlloaddata xmlloaddirectives \ -xmlloadfile xmlloadonly xmlmain xmlmapvalue xmlname \ -xmlnamespace xmlnonspace xmlpath xmlpos xmlposition \ -xmlprependdocumentsetup xmlprependsetup xmlprettyprint xmlprocessbuffer xmlprocessdata \ -xmlprocessfile xmlpure xmlraw xmlrefatt xmlregistereddocumentsetups \ -xmlregisteredsetups xmlregisterns xmlremapname xmlremapnamespace xmlremovedocumentsetup \ -xmlremovesetup xmlresetdocumentsetups xmlresetinjectors xmlresetsetups xmlsave \ -xmlsetentity xmlsetfunction xmlsetinjectors xmlsetsetup xmlsetup \ -xmlshow xmlsnippet xmlstrip xmlstripnolines xmlstripped \ -xmlstrippednolines xmltag xmltexentity xmltext xmltobuffer \ -xmltobufferverbose xmltofile xmlvalue xmlverbatim xrel \ -xrightarrow xrightharpoondown xrightharpoonup xrightleftharpoons xrightoverleftarrow \ -xsplitstring xtriplerel xtwoheadleftarrow xtwoheadrightarrow xxfrac \ -xypos zachovejbloky zadnamezera zadnehorniadolniradky zadnezahlaviaupati \ -zalozka zapisdoseznamu zapismeziseznam zaramovani zasobnikpoli \ -ziskejbuffer ziskejznaceni znaceni znak znaky \ -zpracujbloky zrcadlit zref - -keywordclass.context.de=\ -AMSTEX AfterPar Alphabeticnumerals AmSTeX \ -And BeforePar Big Bigg Biggl \ -Biggm Biggr Bigl Bigm Bigr \ -Buchstabe Buchstaben CONTEXT Caps ConTeXt \ -Context ConvertConstantAfter ConvertToConstant ETEX EveryLine \ -EveryPar GetPar GotoPar Greeknumerals INRSTEX \ -Kap LAMSTEX LATEX LUAJITTEX LUATEX \ -LaTeX LamSTeX Lua LuaTeX LuajitTeX \ -METAFONT METAFUN METAPOST MKII MKIV \ -MKIX MKVI MKXI MONAT MONTHLONG \ -MONTHSHORT MPII MPIV MPVI MPanchor \ -MPbetex MPc MPcode MPcolor MPcoloronly \ -MPcolumn MPd MPdrawing MPfontsizehskip MPgetmultipars \ -MPgetmultishape MPgetposboxes MPh MPinclusions MPleftskip \ -MPll MPlr MPls MPmenubuttons MPn \ -MPoptions MPoverlayanchor MPp MPpage MPpardata \ -MPplus MPpos MPpositiongraphic MPposset MPr \ -MPrawvar MPregion MPrest MPrightskip MPrs \ -MPstring MPtext MPtransparency MPul MPur \ -MPv MPvar MPvariable MPvv MPw \ -MPwhd MPx MPxy MPxywhd MPy \ -MetaFont MetaFun MetaPost NormalizeFontHeight NormalizeFontWidth \ -NormalizeTextHeight NormalizeTextWidth PDFETEX PDFTEX PDFcolor \ -PICTEX PPCHTEX PPCHTeX PRAGMA PiCTeX \ -PointsToBigPoints PointsToReal PointsToWholeBigPoints PtToCm ReadFile \ -Roemischezahlen ScaledPointsToBigPoints ScaledPointsToWholeBigPoints Smallcapped TABLE \ -TEX TEXpage TaBlE TeX TheNormalizedFontSize \ -TransparencyHack VerboseNumber WOCHENTAG WOERTER WORT \ -WidthSpanningText Woerter Wort XETEX XeTeX \ -Ziffern abbildung abjadnaivenumerals abjadnodotnumerals abjadnumerals \ -absatz activatespacehandler adaptcollector adaptfontfeature adaptpapersize \ -addfeature addtoJSpreamble addtocommalist addvalue aftersplitstring \ -aftertestandsplitstring alignmentcharacter allinputpaths alphabeticnumerals alwayscitation \ -alwayscite amgitterausrichten ampersand anchor appendetoks \ -appendgvalue appendtocommalist appendtoks appendtoksonce appendvalue \ -apply applyalternativestyle applyprocessor applytocharacters applytofirstcharacter \ -applytosplitstringchar applytosplitstringcharspaced applytosplitstringline applytosplitstringlinespaced applytosplitstringword \ -applytosplitstringwordspaced applytowords arabicdecimals arabicexnumerals arabicnumerals \ -arg asciistr aside assignalfadimension assigndimen \ -assigndimension assignifempty assigntranslation assignvalue assignwidth \ -assumelongusagecs astype attachment aufseite aufzaehlung \ -ausfuelltext ausschnitt autocap autodirhbox autodirvbox \ -autodirvtop autoinsertnextspace automathematics autosetups availablehsize \ -averagecharwidth backgroundimage backgroundimagefill backgroundline basegrid \ -baselineleftbox baselinemiddlebox baselinerightbox bbox bearbeitebloecke \ -beforesplitstring beforetestandsplitstring behaltebloecke bei bemerkung \ -benutzeverzeichnis beschriftung bestimmekopfnummer bestimmelistencharakeristika bestimmeregistercharakteristika \ -big bigbodyfont bigg bigger biggl \ -biggm biggr bigl bigm bigr \ -bigskip bildschirm binom bitmapimage blanko \ -blap bleed bleedheight bleedwidth blockligatures \ -blockquote bodyfontenvironmentlist bodyfontsize bold boldface \ -bolditalic boldslanted bookmark booleanmodevalue bottombox \ -bottomleftbox bottomrightbox boxcursor boxmarker boxofsize \ -boxreference bpos bthiddencitation btxabbreviatedjournal btxaddjournal \ -btxalwayscitation btxauthorfield btxdetail btxdirect btxdoif \ -btxdoifcombiinlistelse btxdoifelse btxdoifelsecombiinlist btxdoifelsesameasprevious btxdoifelsesameaspreviouschecked \ -btxdoifelseuservariable btxdoifnot btxdoifsameaspreviouscheckedelse btxdoifsameaspreviouselse btxdoifuservariableelse \ -btxexpandedjournal btxfield btxfieldname btxfieldtype btxfirstofrange \ -btxflush btxflushauthor btxflushauthorinverted btxflushauthorinvertedshort btxflushauthorname \ -btxflushauthornormal btxflushauthornormalshort btxflushsuffix btxfoundname btxfoundtype \ -btxhybridcite btxlistcitation btxloadjournalist btxoneorrange btxremapauthor \ -btxsavejournalist btxsetup btxsingularorplural btxsingularplural btxtextcitation \ -buchstabe buchstaben calligraphic camel catcodetablename \ -cbox centerbox centeredbox centerednextbox cfrac \ -chardescription charwidthlanguage checkcharacteralign checkedchar checkedfiller \ -checkedstrippedcsname checkinjector checknextindentation checknextinjector checkpage \ -checkparameters checkpreviousinjector checksoundtrack checktwopassdata checkvariables \ -chem chemical chemicalbottext chemicalmidtext chemicalsymbol \ -chemicaltext chemicaltoptext chineseallnumerals chinesecapnumerals chinesenumerals \ -citation cite clap classfont cldcommand \ -cldcontext cldloadfile cldprocessfile cleftarrow collect \ -collectedtext collectexpanded colorcomponents colored coloronly \ -columnbreak combinepages commalistelement commalistsentence commalistsize \ -comment comparedimension comparedimensioneps completebtxrendering completelist \ -completelistofpublications completelistofsorts completelistofsynonyms completepagenumber completeregister \ -complexorsimple complexorsimpleempty composedcollector composedlayer compresult \ -constantdimen constantdimenargument constantemptyargument constantnumber constantnumberargument \ -contentreference continuednumber continueifinputfile convertargument convertcommand \ -convertedcounter converteddimen convertedsubcounter convertmonth convertvalue \ -convertvboxtohbox copypages copyparameters copyposition countersubs \ -counttoken counttokens cramped crampedclap crampedllap \ -crampedrlap crightarrow crightoverleftarrow ctop ctxcommand \ -ctxdirectcommand ctxdirectlua ctxfunction ctxlatecommand ctxlatelua \ -ctxloadluafile ctxlua ctxluabuffer ctxluacode ctxreport \ -ctxsprint currentassignmentlistkey currentassignmentlistvalue currentbtxuservariable currentcommalistitem \ -currentcomponent currentenvironment currentfeaturetest currentinterface currentlanguage \ -currentlistentrydestinationattribute currentlistentrylimitedtext currentlistentrynumber currentlistentrypagenumber currentlistentryreferenceattribute \ -currentlistentrytitle currentlistentrytitlerendered currentlistsymbol currentmainlanguage currentmessagetext \ -currentmoduleparameter currentoutputstream currentproduct currentproject currentregime \ -currentregisterpageuserdata currentresponses currenttime currentvalue currentxtablecolumn \ -currentxtablerow datasetvariable datum dayoftheweek dayspermonth \ -dbinom decrement decrementcounter decrementedcounter decrementpagenumber \ -decrementsubpagenumber decrementvalue defaultinterface defaultobjectpage defaultobjectreference \ -defcatcodecommand defconvertedargument defconvertedcommand defconvertedvalue defineMPinstance \ -defineTABLEsetup defineactivecharacter definealternativestyle defineanchor defineattachment \ -defineattribute definebackground definebar definebodyfontswitch definebreakpoint \ -definebreakpoints definebtx definebtxdataset definebtxregister definebtxrendering \ -definebutton definecapitals definecharacterkerning definecharacterspacing definechemical \ -definechemicals definechemicalsymbol definecollector definecolumnbreak definecombination \ -definecomment definecomplexorsimple definecomplexorsimpleempty defineconversionset definecounter \ -definedataset definedelimitedtext definedfont defineeffect defineexpandable \ -defineexternalfigure definefallbackfamily definefieldbody definefieldbodyset definefieldcategory \ -definefileconstant definefilefallback definefilesynonym definefiller definefirstline \ -definefittingpage definefontalternative definefontfallback definefontfamily definefontfamilypreset \ -definefontfeature definefontfile definefontsize definefontsolution defineformula \ -defineformulaalternative defineformulaframed defineframedcontent definefrozenfont defineglobalcolor \ -definegraphictypesynonym definegridsnapping defineheadalternative definehelp definehigh \ -definehighlight definehspace definehypenationfeatures defineindentedtext defineindenting \ -defineinitial defineinsertion defineinteraction defineinteractionbar defineinterfaceconstant \ -defineinterfaceelement defineinterfacevariable defineinterlinespace defineintermediatecolor defineitemgroup \ -defineitems definelabelclass definelayer definelayerpreset definelayout \ -definelinefiller definelinenote definelinenumbering definelines definelistalternative \ -definelistextra definelow definelowhigh definelowmidhigh definemarginblock \ -definemargindata definemarker definemathalignment definemathcases definemathcommand \ -definemathdoubleextensible definemathematics definemathextensible definemathfence definemathfraction \ -definemathframed definemathmatrix definemathornament definemathoverextensible definemathovertextextensible \ -definemathradical definemathstackers definemathstyle definemathtriplet definemathunderextensible \ -definemathundertextextensible definemathunstacked definemeasure definemessageconstant definemixedcolumns \ -definemode definemultitonecolor definenamedcolor definenamespace definenarrower \ -definenote defineornament defineoutputroutine defineoutputroutinecommand definepage \ -definepagebreak definepagechecker definepagegrid definepagegridarea definepagegridspan \ -definepageinjection definepageinjectionalternative definepageshift definepagestate definepairedbox \ -defineparagraph defineparallel defineparbuilder defineplacement definepositioning \ -defineprefixset defineprocesscolor defineprocessor definepushbutton definepushsymbol \ -definerenderingwindow defineresetset definescale defineschriftsynonym definescript \ -definesectionlevels defineselector defineseparatorset defineshift definesidebar \ -definesort definespotcolor definestyleinstance definesubformula definesynonym \ -definesystemattribute definesystemconstant definesystemvariable definetabulation definetextbackground \ -definetextflow definetooltip definetransparency definetwopasslist definetype \ -definetypeface definetypescriptprefix definetypescriptsynonym definetypesetting defineunit \ -defineviewerlayer definevspace definevspacing definevspacingamount definextable \ -definiereabbsymbol definiereabsaetze definiereabschnitt definiereabschnittsblock definierebeschreibung \ -definierebeschriftung definiereblock definierefarbe definierefarbengruppe definierefeld \ -definierefeldstapel definierefliesstext definierefliesstextumgebung definieregleitobjekt definierehbox \ -definiereinteraktionsmenue definierekonversion definierelabel definiereliste definieren \ -definierenummerierung definiereoverlay definierepalette definierepapierformat definiereprofil \ -definiereprogramme definierepuffer definierereferenz definierereferenzformat definiereregister \ -definiereschrift definiereschriftstil definieresortieren definierestartstop definierestil \ -definieresubfeld definieresymbol definieresynonyme definieretabellenvorlage definieretabulator \ -definieretext definieretippen definiereueberschrift definiereumbruch definiereumrahmt \ -definiereumrahmtertext definierezusammengestellteliste delimited delimitedtext depthofstring \ -depthonlybox depthspanningtext determinenoflines devanagarinumerals dfrac \ -digits dimensiontocount directcolor directcolored directconvertedcounter \ -directdummyparameter directgetboxllx directgetboxlly directhighlight directlocalframed \ -directluacode directselect directsetbar directsetup directsymbol \ -directvspacing dis disabledirectives disableexperiments disablemode \ -disableoutputstream disableparpositions disableregime disabletrackers displaymath \ -displaymathematics displaymessage distributedhsize dividedsize doadaptleftskip \ -doadaptrightskip doaddfeature doassign doassignempty doboundtext \ -docheckassignment docheckedpagestate docheckedpair documentvariable dodoubleargument \ -dodoubleargumentwithset dodoubleempty dodoubleemptywithset dodoublegroupempty doeassign \ -doexpandedrecurse dogetattribute dogetattributeid dogetcommacommandelement dogobbledoubleempty \ -dogobblesingleempty doif doifMPgraphicelse doifallcommon doifallcommonelse \ -doifalldefinedelse doifallmodes doifallmodeselse doifassignmentelse doifblackelse \ -doifbothsides doifbothsidesoverruled doifboxelse doifbufferelse doifcolor \ -doifcolorelse doifcommandhandler doifcommandhandlerelse doifcommon doifcommonelse \ -doifcontent doifconversiondefinedelse doifconversionnumberelse doifcounter doifcounterelse \ -doifcurrentfonthasfeatureelse doifdefined doifdefinedcounter doifdefinedcounterelse doifdefinedelse \ -doifdimensionelse doifdimenstringelse doifdocumentargument doifdocumentargumentelse doifdocumentfilename \ -doifdocumentfilenameelse doifdrawingblackelse doifelse doifelseMPgraphic doifelseallcommon \ -doifelsealldefined doifelseallmodes doifelseassignment doifelseblack doifelsebox \ -doifelsebuffer doifelsecolor doifelsecommandhandler doifelsecommon doifelseconversiondefined \ -doifelseconversionnumber doifelsecounter doifelsecurrentfonthasfeature doifelsecurrentsortingused doifelsecurrentsynonymshown \ -doifelsecurrentsynonymused doifelsedefined doifelsedefinedcounter doifelsedimension doifelsedimenstring \ -doifelsedocumentargument doifelsedocumentfilename doifelsedrawingblack doifelseempty doifelseemptyvalue \ -doifelseemptyvariable doifelseenv doifelsefastoptionalcheck doifelsefastoptionalcheckcs doifelsefieldbody \ -doifelsefieldcategory doifelsefigure doifelsefile doifelsefiledefined doifelsefileexists \ -doifelsefirstchar doifelseflagged doifelsefontchar doifelsefontpresent doifelsefontsynonym \ -doifelsehasspace doifelsehelp doifelseincsname doifelseinelement doifelseinputfile \ -doifelseinsertion doifelseinset doifelseinstring doifelseinsymbolset doifelseintoks \ -doifelseintwopassdata doifelseitalic doifelselanguage doifelselayerdata doifelselayoutdefined \ -doifelselayoutsomeline doifelselayouttextline doifelseleapyear doifelselist doifelselocation \ -doifelselocfile doifelsemainfloatbody doifelsemarking doifelsemeaning doifelsemessage \ -doifelsemode doifelsenextbgroup doifelsenextbgroupcs doifelsenextchar doifelsenextoptional \ -doifelsenextoptionalcs doifelsenextparenthesis doifelsenonzeropositive doifelsenoteonsamepage doifelsenothing \ -doifelsenumber doifelseobjectfound doifelseobjectreferencefound doifelseoddpage doifelseoddpagefloat \ -doifelseoldercontext doifelseolderversion doifelseoverlapping doifelseoverlay doifelseparallel \ -doifelseparentfile doifelsepath doifelsepathexists doifelsepatterns doifelseposition \ -doifelsepositionaction doifelsepositiononpage doifelsepositionsonsamepage doifelsepositionsonthispage doifelsepositionsused \ -doifelsereferencefound doifelserightpagefloat doifelserighttoleftinbox doifelsesamelinereference doifelsesamestring \ -doifelsesetups doifelsesomebackground doifelsesomespace doifelsesomething doifelsesometoks \ -doifelsestringinstring doifelsestructurelisthasnumber doifelsestructurelisthaspage doifelsesymboldefined doifelsesymbolset \ -doifelsetext doifelsetextflow doifelsetextflowcollector doifelsetypingfile doifelseundefined \ -doifelseurldefined doifelsevalue doifelsevaluenothing doifelsevariable doifempty \ -doifemptyelse doifemptytoks doifemptyvalue doifemptyvalueelse doifemptyvariable \ -doifemptyvariableelse doifenv doifenvelse doiffastoptionalcheckcselse doiffastoptionalcheckelse \ -doiffieldbodyelse doiffieldcategoryelse doiffigureelse doiffile doiffiledefinedelse \ -doiffileelse doiffileexistselse doiffirstcharelse doifflaggedelse doiffontcharelse \ -doiffontpresentelse doiffontsynonymelse doifhasspaceelse doifhelpelse doifincsnameelse \ -doifinelementelse doifinputfileelse doifinsertionelse doifinset doifinsetelse \ -doifinstring doifinstringelse doifinsymbolset doifinsymbolsetelse doifintokselse \ -doifintwopassdataelse doifitalicelse doiflanguageelse doiflayerdataelse doiflayoutdefinedelse \ -doiflayoutsomelineelse doiflayouttextlineelse doifleapyearelse doiflistelse doiflocationelse \ -doiflocfileelse doifmainfloatbodyelse doifmarkingelse doifmeaningelse doifmessageelse \ -doifmode doifmodeelse doifnextbgroupcselse doifnextbgroupelse doifnextcharelse \ -doifnextoptionalcselse doifnextoptionalelse doifnextparenthesiselse doifnonzeropositiveelse doifnot \ -doifnotallcommon doifnotallmodes doifnotcommandhandler doifnotcommon doifnotcounter \ -doifnotdocumentargument doifnotdocumentfilename doifnotempty doifnotemptyvalue doifnotemptyvariable \ -doifnotenv doifnoteonsamepageelse doifnotescollected doifnotfile doifnotflagged \ -doifnothing doifnothingelse doifnotinset doifnotinsidesplitfloat doifnotinstring \ -doifnotmode doifnotnumber doifnotsamestring doifnotsetups doifnotvalue \ -doifnotvariable doifnumber doifnumberelse doifobjectfoundelse doifobjectreferencefoundelse \ -doifoddpageelse doifoddpagefloatelse doifoldercontextelse doifolderversionelse doifoverlappingelse \ -doifoverlayelse doifparallelelse doifparentfileelse doifpathelse doifpathexistselse \ -doifpatternselse doifposition doifpositionaction doifpositionactionelse doifpositionelse \ -doifpositiononpageelse doifpositionsonsamepageelse doifpositionsonthispageelse doifpositionsusedelse doifreferencefoundelse \ -doifrightpagefloatelse doifrighttoleftinboxelse doifsamelinereferenceelse doifsamestring doifsamestringelse \ -doifsetups doifsetupselse doifsomebackground doifsomebackgroundelse doifsomespaceelse \ -doifsomething doifsomethingelse doifsometoks doifsometokselse doifstringinstringelse \ -doifstructurelisthasnumberelse doifstructurelisthaspageelse doifsymboldefinedelse doifsymbolsetelse doiftext \ -doiftextelse doiftextflowcollectorelse doiftextflowelse doiftypingfileelse doifundefined \ -doifundefinedcounter doifundefinedelse doifurldefinedelse doifvalue doifvalueelse \ -doifvaluenothing doifvaluenothingelse doifvaluesomething doifvariable doifvariableelse \ -doindentation dollar doloop doloopoverlist donothing \ -dontconvertfont dontleavehmode dontpermitspacesbetweengroups dopositionaction doprocesslocalsetups \ -doquadrupleargument doquadrupleempty doquadruplegroupempty doquintupleargument doquintupleempty \ -doquintuplegroupempty dorechecknextindentation dorecurse dorepeatwithcommand doreplacefeature \ -doresetandafffeature doresetattribute dorotatebox dosetattribute dosetleftskipadaption \ -dosetrightskipadaption dosetupcheckedinterlinespace doseventupleargument doseventupleempty dosingleargument \ -dosingleempty dosinglegroupempty dosixtupleargument dosixtupleempty dostepwiserecurse \ -dosubtractfeature dotfskip dotoks dotripleargument dotripleargumentwithset \ -dotripleempty dotripleemptywithset dotriplegroupempty doublebar doublebond \ -doublebrace doublebracket doubleparent dowith dowithnextbox \ -dowithnextboxcontent dowithnextboxcontentcs dowithnextboxcs dowithpargument dowithrange \ -dowithwargument dpofstring drehen duennelinie duennerumriss \ -dummydigit dummyparameter eTeX edefconvertedargument efcmaxheight \ -efcmaxwidth efcminheight efcminwidth efcparameter effect \ -einezeile elapsedseconds elapsedtime eleftarrowfill eleftharpoondownfill \ -eleftharpoonupfill eleftrightarrowfill emphasisboldface emphasistypeface emptylines \ -emspace enabledirectives enableexperiments enablemode enableoutputstream \ -enableparpositions enableregime enabletrackers enskip enspace \ -env envvar eoverbarfill eoverbracefill eoverbracketfill \ -eoverparentfill epos equaldigits erightarrowfill erightharpoondownfill \ -erightharpoonupfill etwoheadrightarrowfill eunderbarfill eunderbracefill eunderbracketfill \ -eunderparentfill executeifdefined exitloop exitloopnow expandcheckedcsname \ -expanded expandfontsynonym externalfigurecollectionmaxheight externalfigurecollectionmaxwidth externalfigurecollectionminheight \ -externalfigurecollectionminwidth externalfigurecollectionparameter externeabbildung fakebox farbbalken \ -farbe farbewert fastdecrement fastincrement fastlocalframed \ -fastscale fastsetup fastsetupwithargument fastsetupwithargumentswapped fastswitchtobodyfont \ -fastsxsy feature feld feldstapel fence \ -fenced festesspatium fetchallmarkings fetchallmarks fetchmark \ -fetchmarking fetchonemark fetchonemarking fetchruntinecommand fetchtwomarkings \ -fetchtwomarks fieldbody fifthoffivearguments fifthofsixarguments figurefilename \ -figurefilepath figurefiletype figurefullname figureheight figurenaturalheight \ -figurenaturalwidth figuresymbol figurewidth filename filledhboxb \ -filledhboxc filledhboxg filledhboxk filledhboxm filledhboxr \ -filledhboxy filler filterfromnext filterfromvalue filterpages \ -filterreference findtwopassdata finishregisterentry firstcharacter firstcounter \ -firstcountervalue firstoffivearguments firstoffourarguments firstofoneargument firstofoneunexpanded \ -firstofsixarguments firstofthreearguments firstofthreeunexpanded firstoftwoarguments firstoftwounexpanded \ -firstrealpage firstrealpagenumber firstsubcountervalue firstsubpage firstsubpagenumber \ -firstuserpage firstuserpagenumber fitfieldframed fittopbaselinegrid flag \ -floatuserdataparameter flushboxregister flushcollector flushlayer flushlocalfloats \ -flushnextbox flushnotes flushoutputstream flushshapebox flushtextflow \ -flushtokens flushtoks fontalternative fontbody fontchar \ -fontcharbyindex fontclass fontclassname fontface fontfeaturelist \ -fontsize fontstyle footnotetext forcecharacterstripping forcelocalfloats \ -forgeteverypar forgetparameters format formelnummer formula \ -foundbox fourthoffivearguments fourthoffourarguments fourthofsixarguments frac \ -frameddimension framedparameter framedtext freezedimenmacro freezemeasure \ -frenchspacing fromlinenote frozenhbox gdefconvertedargument gdefconvertedcommand \ -gefuelltesrechteck gefuelltezeile gestreckt getMPdrawing getMPlayer \ -getboxllx getboxlly getbufferdata getcommacommandsize getcommalistsize \ -getdayoftheweek getdayspermonth getdefinedbuffer getdocumentargument getdocumentargumentdefault \ -getdocumentfilename getdummyparameters getemptyparameters geteparameters getexpandedparameters \ -getfiguredimensions getfirstcharacter getfirsttwopassdata getfromcommacommand getfromcommalist \ -getfromtwopassdata getglyphdirect getglyphstyled getgparameters getlasttwopassdata \ -getlocalfloat getlocalfloats getmessage getnamedglyphdirect getnamedglyphstyled \ -getnamedtwopassdatalist getnaturaldimensions getnoflines getobject getobjectdimensions \ -getpaletsize getparameters getprivatechar getprivateslot getrandomcount \ -getrandomdimen getrandomfloat getrandomnumber getrandomseed getraweparameters \ -getrawgparameters getrawnoflines getrawparameters getrawxparameters getreference \ -getreferenceentry getroundednoflines getsubstring gettwopassdata gettwopassdatalist \ -getuvalue getvalue getvariable getvariabledefault getxparameters \ -gitter globaldisablemode globalenablemode globalletempty globalpopbox \ -globalpopmacro globalpreventmode globalprocesscommalist globalpushbox globalpushmacro \ -globalswapcounts globalswapdimens globalswapmacros globalundefine glyphfontfile \ -gobbledoubleempty gobbleeightarguments gobblefivearguments gobblefiveoptionals gobblefourarguments \ -gobblefouroptionals gobbleninearguments gobbleoneargument gobbleoneoptional gobblesevenarguments \ -gobblesingleempty gobblesixarguments gobblespacetokens gobbletenarguments gobblethreearguments \ -gobblethreeoptionals gobbletwoarguments gobbletwooptionals gobbleuntil gobbleuntilrelax \ -grabbufferdata grabbufferdatadirect grabuntil grafik graufarbe \ -grayvalue greedysplitstring greeknumerals groupedcommand gsetboxllx \ -gsetboxlly gujaratinumerals gurmurkhinumerals haarlinie hairspace \ -halfwaybox handletokens handwritten hash hauptsprache \ -hboxofvbox hboxreference hdofstring headhbox headnumbercontent \ -headnumberdistance headnumberwidth headreferenceattributes headsetupspacing headtextcontent \ -headtextdistance headtextwidth headvbox headwidth heightanddepthofstring \ -heightofstring heightspanningtext helptext heutigesdatum heutigeskopfnummer \ -hglue hiddenbar hiddencitation hiddencite highlight \ -highordinalstr hilfetext hilo himilo hintergrund \ -hl hoch holebeschriftung holepuffer horizontalgrowingbar \ -horizontalpositionbar hphantom hpos hsizefraction hsmash \ -hsmashbox hsmashed hspace htdpofstring htofstring \ -hyphen hyphenatedcoloredword hyphenatedfile hyphenatedfilename hyphenatedhbox \ -hyphenatedpar hyphenatedurl hyphenatedword ibox ifassignment \ -iff ifinobject ifinoutputstream ifparameters iftrialtypesetting \ -ignoreimplicitspaces ignorevalue immaumrise immediatesavetwopassdata impliedby \ -implies imumriss in includemenu includeversioninfo \ -increment incrementcounter incrementedcounter incrementpagenumber incrementsubpagenumber \ -incrementvalue indentation infofont infofontbold inheritparameter \ -inhibitblank initializeboxstack inlinebuffer inlinedbox inlinemath \ -inlinemathematics inlinemessage inlineordisplaymath inlinerange innerflushshapebox \ -input inputfilebarename inputfilename inputfilerealsuffix inputfilesuffix \ -inputgivenfile insertpages installactionhandler installactivecharacter installanddefineactivecharacter \ -installattributestack installautocommandhandler installautosetuphandler installbasicautosetuphandler installbasicparameterhandler \ -installbottomframerenderer installcommandhandler installcorenamespace installdefinehandler installdefinitionset \ -installdefinitionsetmember installdirectcommandhandler installdirectparameterhandler installdirectparametersethandler installdirectsetuphandler \ -installdirectstyleandcolorhandler installframedautocommandhandler installframedcommandhandler installieresprache installleftframerenderer \ -installnamespace installoutputroutine installpagearrangement installparameterhandler installparameterhashhandler \ -installparametersethandler installparentinjector installrightframerenderer installrootparameterhandler installsetuphandler \ -installsetuponlycommandhandler installshipoutmethod installsimplecommandhandler installsimpleframedcommandhandler installstyleandcolorhandler \ -installswitchcommandhandler installswitchsetuphandler installtexdirective installtextracker installtopframerenderer \ -installunitsseparator installunitsspace installversioninfo integerrounding interaktionsbalken \ -interaktionsknopfe interaktionsmenue intermezzo intertext invokepageheandler \ -inzeile irgendwo istltdir istrtdir italic \ -italicbold italiccorrection itemtag jobfilename jobfilesuffix \ -kap kapitel keeplinestogether keepunwantedspaces keinekopfundfusszeilen \ -keinspatium keinzeilenobenundunten kerncharacters klonierefeld knopf \ -kommentar komponente konvertierezahl kopfnummer kopierefeld \ -koreancirclenumerals koreannumerals koreannumeralsc koreannumeralsp koreanparentnumerals \ -korrigierezwischenraum languageCharacters languagecharacters languagecharwidth lastcounter \ -lastcountervalue lastdigit lastlinewidth lastnaturalboxdp lastnaturalboxht \ -lastnaturalboxwd lastpredefinedsymbol lastrealpage lastrealpagenumber lastsubcountervalue \ -lastsubpage lastsubpagenumber lasttwodigits lastuserpage lastuserpagenumber \ -lateluacode layeredtext layerheight layerwidth lazysavetaggedtwopassdata \ -lazysavetwopassdata lbox left leftbottombox leftbox \ -lefthbox leftorrighthbox leftorrightvbox leftorrightvtop leftskipadaption \ -leftsubguillemot lefttopbox lefttorighthbox lefttorightvbox lefttorightvtop \ -letbeundefined letcatcodecommand letcscsname letcsnamecs letcsnamecsname \ -letdummyparameter letempty letgvalue letgvalueempty letgvalurelax \ -letterampersand letterat letterbackslash letterbar letterbgroup \ -letterclosebrace lettercolon letterdollar letterdoublequote letteregroup \ -letterescape letterexclamationmark letterhash letterhat letterleftbrace \ -letterless lettermore letteropenbrace letterpercent letterquestionmark \ -letterrightbrace lettersinglequote letterslash letterspacing lettertilde \ -letterunderscore letvalue letvalueempty letvaluerelax lfence \ -lhbox limitatelines limitatetext limtatefirstline linespanningtext \ -liniendicke listcitation listcite listenlaenge listnamespaces \ -llap loadanyfile loadanyfileonce loadbtxdefinitionfile loadbtxreplacementfile \ -loadcldfile loadcldfileonce loadfontgoodies loadluafile loadluafileonce \ -loadspellchecklist loadtexfile loadtexfileonce loadtypescriptfile localframed \ -localframedwithsettings localhsize localpopbox localpopmacro localpushbox \ -localpushmacro localundefine locatedfilepath locatefilepath locfilename \ -lomihi lowerbox lowercased lowercasestring lowerleftdoubleninequote \ -lowerleftsingleninequote lowerrightdoubleninequote lowerrightsingleninequote lrtbbox ltop \ -luaTeX luacode luaconditional luaenvironment luaexpanded \ -luafunction luajitTeX luamajorversion luaminorversion luaparameterset \ -luasetup luaversion m mLeftarrow mLeftrightarrow \ -mRightarrow makecharacteractive makerawcommalist makestrutofbox mapfontsize \ -margindata markcontent markinjector mat math \ -mathbf mathbi mathblackboard mathbs mathcommand \ -mathdefault mathematik mathfraktur mathfunction mathit \ -mathitalic mathop mathrm mathscript mathsl \ -mathss mathtext mathtextbf mathtextbi mathtextbs \ -mathtextit mathtextsl mathtexttf mathtf mathtriplet \ -mathtt mathupright mathword mathwordbf mathwordbi \ -mathwordbs mathwordit mathwordsl mathwordtf maumrise \ -mbox mcframed md measure measured \ -medskip medspace menueknopf mequal message \ -metaTeX mfence mfunction mfunctionlabeltext mhbox \ -mhookleftarrow mhookrightarrow middle middlebox midhbox \ -minimalhbox mixedcaps mkvibuffer mleftarrow mleftharpoondown \ -mleftharpoonup mleftrightarrow mleftrightharpoons mmapsto moduleparameter \ -molecule monat mono monobold mononormal \ -monthlong monthshort mp mprandomnumber mrel \ -mrightarrow mrightharpoondown mrightharpoonup mrightleftharpoons mrightoverleftarrow \ -mtext mtriplerel mtwoheadleftarrow mtwoheadrightarrow nachunten \ -namedheadnumber namedstructureheadlocation namedstructureuservariable namedstructurevariable namedtaggedlabeltexts \ -naturalhbox naturalhpack naturalvbox naturalvcenter naturalvpack \ -naturalvtop naturalwd negatecolorbox negated negthinspace \ -newattribute newcatcodetable newcounter newevery newfrenchspacing \ -newmode newsignal newsystemmode nextbox nextboxdp \ -nextboxht nextboxhtdp nextboxwd nextcounter nextcountervalue \ -nextdepth nextparagraphs nextrealpage nextrealpagenumber nextsubcountervalue \ -nextsubpage nextsubpagenumber nextuserpage nextuserpagenumber nobar \ -nocitation nocite nodetostring noffigurepages noflines \ -noflocalfloats noindentation noitem nokap nonfrenchspacing \ -nonmathematics normal normalboldface normalframedwithsettings normalizebodyfontsize \ -normalizedfontsize normalizefontdepth normalizefontheight normalizefontline normalizefontwidth \ -normalizetextdepth normalizetextheight normalizetextline normalizetextwidth normaltypeface \ -notesymbol notiz ntimes numberofpoints obeydepth \ -objectdepth objectheight objectmargin objectwidth obox \ -offset offsetbox onedigitrounding ordinaldaynumber ordinalstr \ -ornamenttext outputfilename outputstreambox outputstreamcopy outputstreamunvbox \ -outputstreamunvcopy over overbar overbars overbartext \ -overbarunderbar overbrace overbracetext overbraceunderbrace overbracket \ -overbrackettext overbracketunderbracket overlaybutton overlaycolor overlaydepth \ -overlayfigure overlayheight overlaylinecolor overlaylinewidth overlayoffset \ -overlayrollbutton overlaywidth overleftarrow overleftharpoondown overleftharpoonup \ -overleftrightarrow overloaderror overparent overparenttext overparentunderparent \ -overrightarrow overrightharpoondown overrightharpoonup overset overstrike \ -overstrikes overtwoheadleftarrow overtwoheadrightarrow pagearea pagebreak \ -pagefigure pagegridspanwidth pageinjection pagestaterealpage paletsize \ -passelayoutan passendfeld pdfTeX pdfactualtext pdfbackendactualtext \ -pdfbackendcurrentresources pdfbackendsetcatalog pdfbackendsetcolorspace pdfbackendsetextgstate pdfbackendsetinfo \ -pdfbackendsetname pdfbackendsetpageattribute pdfbackendsetpageresource pdfbackendsetpagesattribute pdfbackendsetpattern \ -pdfbackendsetshade pdfcolor pdfeTeX percent percentdimen \ -permitcaretescape permitcircumflexescape permitspacesbetweengroups persiandecimals persiannumerals \ -phantom phantombox pickupgroupedcommand placeattachments placebtxrendering \ -placecitation placecomments placecurrentformulanumber placedbox placefloat \ -placefloatwithsetups placeframed placeheadnumber placeheadtext placehelp \ -placeinitial placelayer placelayeredtext placelistofpublications placelistofsorts \ -placelistofsynonyms placelocalnotes placement placenamedfloat placenamedformula \ -placenotes placepagenumber placepairedbox placeparallel placerawlist \ -placerenderingwindow platzierebookmarks platziereformel platzierefussnoten platziereliste \ -platzierelokalefussnoten platzierenebeneinander platziereregister platziereuntereinander platziereunterformel \ -platzierezusammengestellteliste popattribute popmacro popmode popsystemmode \ -pos position positionoverlay positionregionoverlay posten \ -postponenotes predefinedfont predefinefont predefinesymbol prefixedpagenumber \ -prependetoks prependgvalue prependtocommalist prependtoks prependtoksonce \ -prependvalue presetdocument presetfieldsymbols pretocommalist prevcounter \ -prevcountervalue preventmode prevrealpage prevrealpagenumber prevsubcountervalue \ -prevsubpage prevsubpagenumber prevuserpage prevuserpagenumber procent \ -processMPbuffer processMPfigurefile processaction processallactionsinset processassignlist \ -processassignmentcommand processassignmentlist processbetween processbodyfontenvironmentlist processcolorcomponents \ -processcommacommand processcommalist processcommalistwithparameters processcontent processfile \ -processfilemany processfilenone processfileonce processfirstactioninset processisolatedchars \ -processisolatedwords processlinetablebuffer processlinetablefile processlist processmonth \ -processranges processseparatedlist processtexbuffer processtokens processuntil \ -processxtablebuffer processyear produkt profiledbox profilegivenbox \ -programm projekt pseudoMixedCapped pseudoSmallCapped pseudoSmallcapped \ -pseudosmallcapped punkt purenumber pushattribute pushbutton \ -pushmacro pushmode pushoutputstream pushsystemmode qquad \ -quad quads quitcommalist quitprevcommalist quittypescriptscanning \ -raisebox randomizetext randomnumber rawcounter rawcountervalue \ -rawdate rawdoifelseinset rawdoifinset rawdoifinsetelse rawgetparameters \ -rawprocessaction rawprocesscommacommand rawprocesscommalist rawstructurelistuservariable rawsubcountervalue \ -rbox readfile readfixfile readjobfile readlocfile \ -readsetfile readsysfile readtexfile readxmlfile realSmallCapped \ -realSmallcapped realpagenumber realsmallcapped rechteck rechtecke \ -recursedepth recurselevel recursestring redoconvertfont ref \ -referenceprefix referenz referieren registerattachment registerctxluafile \ -registerexternalfigure registerfontclass registerhyphenationexception registerhyphenationpattern registermenubuttons \ -registersort registersynonym registerunit regular relatemarking \ -relateparameterhandlers relaxvalueifundefined remainingcharacters removebottomthings removedepth \ -removefromcommalist removelastskip removelastspace removemarkedcontent removepunctuation \ -removesubstring removetoks removeunwantedspaces replacefeature replaceincommalist \ -replaceword rescan rescanwithsetup resetMPdrawing resetMPenvironment \ -resetMPinstance resetallattributes resetandaddfeature resetbar resetbreakpoints \ -resetbuffer resetcharacteralign resetcharacterkerning resetcharacterspacing resetcharacterstripping \ -resetcollector resetcounter resetdigitsmanipulation resetdirection resetfeature \ -resetflag resetfontcolorsheme resetfontfallback resetfontsolution resethyphenationfeatures \ -resetinjector resetinteractionmenu resetitaliccorrection resetlayer resetlocalfloats \ -resetmarker resetmode resetpagenumber resetparallel resetpath \ -resetpenalties resetprofile resetreference resetreplacement resetscript \ -resetsetups resetshownsynonyms resetsubpagenumber resetsymbolset resetsystemmode \ -resettimer resettrackers resettrialtypesetting resetusedsortings resetusedsynonyms \ -resetuserpagenumber resetvalue resetvisualizers reshapebox resolvedglyphdirect \ -resolvedglyphstyled restartcounter restorebox restorecatcodes restorecounter \ -restorecurrentattributes restoreendofline restoreglobalbodyfont reusableMPgraphic reuseMPgraphic \ -reuserandomseed revivefeature rfence rhbox right \ -rightbottombox rightbox righthbox rightorleftpageaction rightskipadaption \ -rightsubguillemot righttolefthbox righttoleftvbox righttoleftvtop righttopbox \ -rlap robustaddtocommalist robustdoifelseinset robustdoifinsetelse robustpretocommalist \ -roemischezahlen rollbutton roman rtop ruecksetztenbeschriftung \ -ruledhbox ruledhpack ruledmbox ruledtopv ruledtpack \ -ruledvbox ruledvpack ruledvtop runMPbuffer runninghbox \ -safechar sans sansbold sansnormal sansserif \ -savebox savebtxdataset savebuffer savecounter savecurrentattributes \ -savenormalmeaning savetaggedtwopassdata savetwopassdata sbox schreibezurliste \ -schreibezwischenliste sd secondoffivearguments secondoffourarguments secondofsixarguments \ -secondofthreearguments secondofthreeunexpanded secondoftwoarguments secondoftwounexpanded seite \ -seitenreferenz seitenummer select serializecommalist serializedcommalist \ -serif serifbold serifnormal setJSpreamble setMPlayer \ -setMPpositiongraphic setMPpositiongraphicrange setMPtext setMPvariable setMPvariables \ -setbar setbigbodyfont setboxllx setboxlly setbreakpoints \ -setcapstrut setcatcodetable setcharacteralign setcharactercasing setcharactercleaning \ -setcharacterkerning setcharacterspacing setcharacterstripping setcharstrut setcollector \ -setcolormodell setcounter setcounterown setcurrentfontclass setdataset \ -setdefaultpenalties setdigitsmanipulation setdirection setdocumentargument setdocumentargumentdefault \ -setdocumentfilename setdummyparameter setelementexporttag setemeasure setevalue \ -setevariable setevariables setfirstline setflag setfont \ -setfontcolorsheme setfontfeature setfontsolution setfontstrut setfractions \ -setgmeasure setgvalue setgvariable setgvariables sethboxregister \ -sethyphenatedurlafter sethyphenatedurlbefore sethyphenatedurlnormal sethyphenationfeatures setinitial \ -setinjector setinteraction setinterfacecommand setinterfaceconstant setinterfaceelements \ -setinterfacemessage setinterfacevariable setinternalrendering setitaliccorrection setlayer \ -setlayerframed setlayertext setlinefiller setlocalhsize setmainbodyfont \ -setmainparbuilder setmarker setmarking setmathstyle setmeasure \ -setmessagetext setmode setnostrut setnote setnotetext \ -setobject setoldstyle setpagegrid setpagereference setpagestate \ -setpagestaterealpageno setpenalties setpercentdimen setposition setpositionbox \ -setpositiondata setpositiondataplus setpositiononly setpositionplus setpositionstrut \ -setprofile setrandomseed setreference setreferencedobject setregisterentry \ -setreplacement setrigidcolumnbalance setrigidcolumnhsize setscript setsectionblock \ -setsimplecolumnhsize setsmallbodyfont setsmallcaps setstackbox setstructurepageregister \ -setstrut setsuperiors setsystemmode settabular settaggedmetadata \ -settext settightobject settightreferencedobject settightunreferencedobject settrialtypesetting \ -setuevalue setugvalue setunreferencedobject setup setupMPgraphics \ -setupMPinstance setupMPpage setupMPvariables setupTABLE setupTEXpage \ -setupattachment setupbackend setupbar setupbleeding setupbookmark \ -setupbtx setupbtxdataset setupbtxlist setupbtxregister setupbtxrendering \ -setupbutton setupcharacterkerning setupcharacterspacing setupchemical setupchemicalframed \ -setupcollector setupcolumnspan setupcombination setupcounter setupdataset \ -setupdelimitedtext setupdescription setupdirections setupdocument setupeffect \ -setupenumeration setupenv setupexport setupexternalfigure setupexternalsoundtracks \ -setupfieldbody setupfieldcategory setupfieldcontentframed setupfieldlabelframed setupfieldtotalframed \ -setupfiller setupfirstline setupfittingpage setupfloatcaption setupfontexpansion \ -setupfontprotrusion setupfonts setupfontsolution setupforms setupformula \ -setupformulaframed setupframedcontent setupframedtext setupglobalreferenceprefix setupheadalternative \ -setuphelp setuphigh setuphighlight setuphyphenation setupindentedtext \ -setupinitial setupinsertion setupitaliccorrection setupitemgroup setuplabel \ -setuplayer setuplayeredtext setuplayouttext setuplinefiller setuplinefillers \ -setuplinenote setuplinetable setuplistalternative setuplistextra setuplocalfloats \ -setuplocalinterlinespace setuplow setuplowhigh setuplowmidhigh setupmarginblock \ -setupmargindata setupmarginframed setupmarginrule setupmathalignment setupmathcases \ -setupmathematics setupmathfence setupmathfraction setupmathframed setupmathmatrix \ -setupmathornament setupmathradical setupmathstackers setupmathstyle setupmixedcolumns \ -setupmodule setupnotation setupnotations setupnote setupnotes \ -setupoffset setupoffsetbox setupoutputroutine setuppagechecker setuppagegrid \ -setuppagegridarea setuppagegridareatext setuppagegridlines setuppagegridspan setuppagegridstart \ -setuppageinjection setuppageinjectionalternative setuppageshift setuppagestate setuppairedbox \ -setuppaper setupparagraph setupparagraphintro setupparallel setupperiods \ -setupplacement setuppositionbar setupprocessor setupprofile setupquotation \ -setuprealpagenumber setupreferenceformat setupreferenceprefix setupreferencestructureprefix setupregisters \ -setuprenderingwindow setups setupscale setupscript setupscripts \ -setupselector setupshift setupsidebar setupspellchecking setupstartstop \ -setupstretched setupstruts setupstyle setupsubformula setuptabulation \ -setuptagging setuptextbackground setuptextflow setuptooltip setupunit \ -setupuserpagenumber setupversion setupviewerlayer setupvspacing setupwithargument \ -setupwithargumentswapped setupxml setupxtable setuvalue setuxvalue \ -setvalue setvariable setvariables setvboxregister setvisualizerfont \ -setvtopregister setwidthof setxmeasure setxvalue setxvariable \ -setxvariables sfrac shapedhbox showallmakeup showattributes \ -showboxes showbtxdatasetauthors showbtxdatasetcompleteness showbtxdatasetfields showbtxfields \ -showbtxhashedauthors showbtxtables showchardata showcharratio showcolorbar \ -showcolorcomponents showcolorset showcolorstruts showcounter showdirectives \ -showdirsinmargin showedebuginfo showexperiments showfont showfontdata \ -showfontkerns showfontparameters showfontstrip showfontstyle showglyphs \ -showgridsnapping showhelp showhyphenationtrace showhyphens showinjector \ -showjustification showkerning showlayoutcomponents showligature showligatures \ -showlogcategories showmargins showmessage showminimalbaseline shownextbox \ -showotfcomposition showparentchain showsetupsdefinition showsymbolset showtimer \ -showtokens showtrackers showvalue showvariable showwarning \ -simplegroupedcommand singalcharacteralign singlebond sixthofsixarguments slanted \ -slantedbold slicepages slovenianNumerals sloveniannumerals small \ -smallbodyfont smallbold smallbolditalic smallboldslanted smallcappedcharacters \ -smallcappedromannumerals smaller smallitalicbold smallnormal smallskip \ -smallslanted smallslantedbold smalltype smash smashbox \ -smashboxed smashedhbox smashedvbox snaptogrid someheadnumber \ -somekindoftab somelocalfloat somenamedheadnumber someplace sp \ -spalte spanishNumerals spanishnumerals spatium speech \ -spiegeln splitatasterisk splitatcolon splitatcolons splitatcomma \ -splitdfrac splitfilename splitfrac splitoffbase splitofffull \ -splitoffkind splitoffname splitoffpath splitoffroot splitofftokens \ -splitofftype splitstring sprache spreadhbox sqrt \ -stackrel startJScode startJSpreamble startMPclip startMPcode \ -startMPdefinitions startMPdrawing startMPenvironment startMPextensions startMPinclusions \ -startMPinitializations startMPpage startMPpositiongraphic startMPpositionmethod startMPrun \ -startTABLE startTABLEbody startTABLEfoot startTABLEhead startTABLEnext \ -startTC startTD startTDs startTEXpage startTH \ -startTN startTR startTRs startTX startTY \ -startabbildung startabsatz startallmodes startarrangedpages startaside \ -startattachment startaufzaehlung startbar startbinom startbitmapimage \ -startblockquote startbtxrenderingdefinitions startbuffer startbutton startcatcodetable \ -startcharacteralign startcheckedfences startchemical startcollect startcollecting \ -startcolorintent startcoloronly startcolorset startcolumns startcolumnspan \ -startcombination startcomment startcontextcode startcontextdefinitioncode startctxfunction \ -startctxfunctiondefinition startcurrentcolor startcurrentlistentrywrapper startdbinom startdelimited \ -startdelimitedtext startdfrac startdisplaymath startdmath startdocument \ -startdurchgestrichen startdurchstreichen starteffect startelement startembeddedxtable \ -startendofline startexceptions startexpanded startexpandedcollect startextendedcatcodetable \ -startexternalfigurecollection startfarbe startfigure startfitfieldframed startfittingpage \ -startfloatcombination startfont startfontclass startfontsolution startformula \ -startformulas startfrac startframedcontent startframedtext startgrafik \ -startgridsnapping starthbox starthboxestohbox starthboxregister starthelptext \ -starthiddenbar starthiding starthighlight starthilfetext starthintergrund \ -starthyphenation startimath startindentation startindentedtext startinmframed \ -startinteraction startinteraktionsmenue startinterface startintermezzo startintertext \ -startitemgroup startkapitel startkleinerdurchschuss startknockout startkommentar \ -startkomponente startkopf startlayout startlinecorrection startlinefiller \ -startlinenumbering startlinetable startlinetablebody startlinetablecell startlinetablehead \ -startlocalfootnotes startlocalheadsetup startlocallinecorrection startlocalnotes startlocalsetups \ -startlua startluacode startluaparameterset startluasetups startmakeup \ -startmarginallinie startmarginblock startmarkedcontent startmathmode startmathstyle \ -startmatrices startmcframed startmdformula startmframed startmixedcolumns \ -startmode startmodeset startmodule startmoduletestsection startmpformula \ -startnamedsection startnamedsubformulas startnarrow startnarrower startnegative \ -startnicelyfilledbox startnobar startnointerference startnotallmodes startnotext \ -startnotmode startopposite startoutputstream startoverlay startoverprint \ -startpagecomment startpagefigure startpagegrid startpagegridspan startpagelayout \ -startpar startparagraph startparagraphs startparagraphscell startparbuilder \ -startpath startplacepairedbox startplatziereformel startpos startpositioning \ -startpositionoverlay startpositive startpostponing startprocessassignmentcommand startprocessassignmentlist \ -startprocesscommacommand startprocesscommalist startprodukt startprojekt startprotect \ -startprotectedcolors startpublikation startpunctuation startrandomized startrandomseed \ -startrawsetups startreadingfile startreferenceprefix startregime startregister \ -startreusableMPgraphic startscript startsdformula startsectionblock startsectionblockenvironment \ -startsectionlevel startsetups startsfrac startshapebox startshift \ -startsidebar startsimplecolumns startspecialitem startspeech startspformula \ -startspread startstartstop startstaticMPfigure startstaticMPgraphic startstrictinspectnextcharacter \ -startstructurepageregister startstrut startstyle startsubformulas startsubjectlevel \ -startsubsentence startsubstack startsymbolset starttabelle starttable \ -starttablehead starttables starttabletail starttabulate starttabulatehead \ -starttabulatetail starttagged starttbinom starttexcode starttexdefinition \ -starttext starttextbackground starttextbackgroundmanual starttextcolor starttextcolorintent \ -starttextflow starttextlinie startthema starttitel starttokens \ -starttransparent starttypescript starttypescriptcollection startueberstreichen startueberstrichen \ -startumgebung startumrahmt startumrahmtertext startunderdash startunderdashes \ -startunderdot startunderdots startunderrandom startunderrandoms startunderstrike \ -startunderstrikes startunframed startuniqueMPgraphic startuniqueMPpagegraphic startunpacked \ -startunterabsatz startunterstreichen startunterstrichen startunterthema startunterunterabsatz \ -startunterunterthema startunterunterunterabsatz startunterunterunterthema startunterunterunterunterabsatz startunterunterunterunterthema \ -startusableMPgraphic startuseMPgraphic startusemathstyleparameter startusingbtxspecification startvbox \ -startvboxregister startvboxtohbox startvboxtohboxseparator startviewerlayer startvtop \ -startvtopregister startxcell startxcellgroup startxfrac startxgroup \ -startxmldisplayverbatim startxmlinlineverbatim startxmlraw startxmlsetups startxrow \ -startxrowgroup startxtable startxtablebody startxtablefoot startxtablehead \ -startxtablenext startxxfrac startzeile startzitat startzitieren \ -startzu stelleabsaetzeein stelleabsatznummerierungein stelleabschnittsblockein stelleanordnenein \ -stelleaufzaehlungenein stelleausschnittein stellebeschriftungein stellebildunterschriftein stellebindestrichein \ -stelleblankoein stelleblockein stelledrehenein stelleduennerumrissein stelleeinziehenein \ -stelleengerein stellefarbeein stellefarbenein stellefeldein stellefelderin \ -stellefliesstextein stellefusszeileein stellefusszeilentextein stellegefuelltesrechteckein stellegefuelltezeileein \ -stellegegenueberplatzierenein stellegleitobjektein stellehintergruendeein stellehintergrundein stelleinteraktionein \ -stelleinteraktionsbalkenein stelleinteraktionsbildschirmein stelleinteraktionsmenueein stellekommentarein stellekopfzahlein \ -stellekopfzeileein stellekopfzeilentextein stellelayoutein stellelinienbreiteein stellelisteein \ -stellemarginallinieein stellenobenein stellepaletteein stellepapierformatein stelleplatziegeteiltegleitobjekt \ -stellepositionierenein stellepostenein stelleprogrammein stellepufferein stellerechteckein \ -stellereferenzierenein stelleregisterein stelleseitenkommentarein stelleseitennummerein stelleseitennummeriernungein \ -stelleseitenuebergangein stellesortierenein stellespaltenein stellespatiumein stellespracheein \ -stellesymbolsetein stellesynonymein stelletabellenein stelletabulatorein stelletextein \ -stelletextobenein stelletexttexteein stelletextumrissein stelletextuntenein stelletipein \ -stelletippenein stelletoleranzein stelleueberschriftein stelleueberschriftenein stelleumbruchein \ -stelleumrahmtein stelleuntenein stelleunterseitennummerein stelleurlein stelleversalienein \ -stellezeilenabstandein stellezeilenein stellezeilennumerierungein stellezitierenein stellezusammengestelltelisteein \ -stellezwischenraumein stopJScode stopJSpreamble stopMPclip stopMPcode \ -stopMPdefinitions stopMPdrawing stopMPenvironment stopMPextensions stopMPinclusions \ -stopMPinitializations stopMPpage stopMPpositiongraphic stopMPpositionmethod stopMPrun \ -stopTABLE stopTABLEbody stopTABLEfoot stopTABLEhead stopTABLEnext \ -stopTC stopTD stopTDs stopTEXpage stopTH \ -stopTN stopTR stopTRs stopTX stopTY \ -stopabbildung stopabsatz stopallmodes stoparrangedpages stopaside \ -stopattachment stopaufzaehlung stopbar stopbinom stopbitmapimage \ -stopblockquote stopbtxrenderingdefinitions stopbuffer stopbutton stopcatcodetable \ -stopcharacteralign stopcheckedfences stopchemical stopcollect stopcollecting \ -stopcolorintent stopcoloronly stopcolorset stopcolumns stopcolumnspan \ -stopcombination stopcomment stopcontextcode stopcontextdefinitioncode stopctxfunction \ -stopctxfunctiondefinition stopcurrentcolor stopcurrentlistentrywrapper stopdbinom stopdelimited \ -stopdelimitedtext stopdfrac stopdisplaymath stopdmath stopdocument \ -stopdurchgestrichen stopdurchstreichen stopeffect stopelement stopembeddedxtable \ -stopendofline stopexceptions stopexpanded stopexpandedcollect stopextendedcatcodetable \ -stopexternalfigurecollection stopfarbe stopfigure stopfitfieldframed stopfittingpage \ -stopfloatcombination stopfont stopfontclass stopfontsolution stopformula \ -stopformulas stopfrac stopframedcontent stopframedtext stopgrafik \ -stopgridsnapping stophbox stophboxestohbox stophboxregister stophelptext \ -stophiddenbar stophiding stophighlight stophilfetext stophintergrund \ -stophyphenation stopimath stopindentation stopindentedtext stopinmframed \ -stopinteraction stopinteraktionsmenue stopinterface stopintermezzo stopintertext \ -stopitemgroup stopkapitel stopkleinerdurchschuss stopknockout stopkommentar \ -stopkomponente stopkopf stoplayout stoplinecorrection stoplinefiller \ -stoplinenumbering stoplinetable stoplinetablebody stoplinetablecell stoplinetablehead \ -stoplocalfootnotes stoplocalheadsetup stoplocallinecorrection stoplocalnotes stoplocalsetups \ -stoplua stopluacode stopluaparameterset stopluasetups stopmakeup \ -stopmarginallinie stopmarginblock stopmarkedcontent stopmathmode stopmathstyle \ -stopmatrices stopmcframed stopmdformula stopmframed stopmixedcolumns \ -stopmode stopmodeset stopmodule stopmoduletestsection stopmpformula \ -stopnamedsection stopnamedsubformulas stopnarrow stopnarrower stopnegative \ -stopnicelyfilledbox stopnobar stopnointerference stopnotallmodes stopnotext \ -stopnotmode stopopposite stopoutputstream stopoverlay stopoverprint \ -stoppagecomment stoppagefigure stoppagegrid stoppagegridspan stoppagelayout \ -stoppar stopparagraph stopparagraphs stopparagraphscell stopparbuilder \ -stoppath stopplacepairedbox stopplatziereformel stoppos stoppositioning \ -stoppositionoverlay stoppositive stoppostponing stopprocessassignmentcommand stopprocessassignmentlist \ -stopprocesscommacommand stopprocesscommalist stopprodukt stopprojekt stopprotect \ -stopprotectedcolors stoppublikation stoppunctuation stoprandomized stoprandomseed \ -stoprawsetups stopreadingfile stopreferenceprefix stopregime stopregister \ -stopreusableMPgraphic stopscript stopsdformula stopsectionblock stopsectionblockenvironment \ -stopsectionlevel stopsetups stopsfrac stopshapebox stopshift \ -stopsidebar stopsimplecolumns stopspecialitem stopspeech stopspformula \ -stopspread stopstartstop stopstaticMPfigure stopstaticMPgraphic stopstrictinspectnextcharacter \ -stopstructurepageregister stopstrut stopstyle stopsubformulas stopsubjectlevel \ -stopsubsentence stopsubstack stopsymbolset stoptabelle stoptable \ -stoptablehead stoptables stoptabletail stoptabulate stoptabulatehead \ -stoptabulatetail stoptagged stoptbinom stoptexcode stoptexdefinition \ -stoptext stoptextbackground stoptextbackgroundmanual stoptextcolor stoptextcolorintent \ -stoptextflow stoptextlinie stopthema stoptitel stoptokens \ -stoptransparent stoptypescript stoptypescriptcollection stopueberstreichen stopueberstrichen \ -stopumgebung stopumrahmt stopumrahmtertext stopunderdash stopunderdashes \ -stopunderdot stopunderdots stopunderrandom stopunderrandoms stopunderstrike \ -stopunderstrikes stopunframed stopuniqueMPgraphic stopuniqueMPpagegraphic stopunpacked \ -stopunterabsatz stopunterstreichen stopunterstrichen stopunterthema stopunterunterabsatz \ -stopunterunterthema stopunterunterunterabsatz stopunterunterunterthema stopunterunterunterunterabsatz stopunterunterunterunterthema \ -stopusableMPgraphic stopuseMPgraphic stopusemathstyleparameter stopusingbtxspecification stopvbox \ -stopvboxregister stopvboxtohbox stopvboxtohboxseparator stopviewerlayer stopvtop \ -stopvtopregister stopxcell stopxcellgroup stopxfrac stopxgroup \ -stopxmldisplayverbatim stopxmlinlineverbatim stopxmlraw stopxmlsetups stopxrow \ -stopxrowgroup stopxtable stopxtablebody stopxtablefoot stopxtablehead \ -stopxtablenext stopxxfrac stopzeile stopzitat stopzitieren \ -stopzu strictdoifelsenextoptional strictdoifnextoptionalelse stripcharacter strippedcsname \ -stripspaces structurelistuservariable structurenumber structuretitle structureuservariable \ -structurevariable strut strutdp strutht struthtdp \ -struttedbox strutwd style styleinstance subpagenumber \ -subsentence substituteincommalist subtractfeature swapcounts swapdimens \ -swapface swapmacros swaptypeface switchstyleonly switchtocolor \ -switchtointerlinespace symbol symbolreference synchronizeblank synchronizeindenting \ -synchronizemarking synchronizeoutputstreams synchronizestrut synchronizewhitespace systemlog \ -systemlogfirst systemloglast systemsetups tLeftarrow tLeftrightarrow \ -tRightarrow tabelle tabulateautoline tabulateautorule tabulateline \ -tabulaterule taggedctxcommand taggedlabeltexts tbinom tbox \ -teilegleitobjekt tequal testandsplitstring testcolumn testfeature \ -testfeatureonce testpage testpageonly testpagesync testtokens \ -tex texdefinition texsetup textcitation textcite \ -textcontrolspace textflowcollector textlinie textmath textminus \ -textormathchar textplus textreferenz textvisiblespace tfrac \ -thainumerals thefirstcharacter thema thenormalizedbodyfontsize theremainingcharacters \ -thickspace thinspace thirdoffivearguments thirdoffourarguments thirdofsixarguments \ -thirdofthreearguments thirdofthreeunexpanded thookleftarrow thookrightarrow threedigitrounding \ -tibetannumerals tief tightlayer tiho tinyfont \ -tip tippedatei tippen tippepuffer titel \ -tlap tleftarrow tleftharpoondown tleftharpoonup tleftrightarrow \ -tleftrightharpoons tmapsto tochar tolinenote topbox \ -topleftbox toplinebox toprightbox topskippedbox tracecatcodetables \ -tracedfontname traceoutputroutines tracepositions transparencycomponents transparent \ -trel trightarrow trightharpoondown trightharpoonup trightleftharpoons \ -trightoverleftarrow triplebond truefilename truefontname ttriplerel \ -ttwoheadleftarrow ttwoheadrightarrow twodigitrounding tx txx \ -typedefinedbuffer typeface typescriptone typescriptprefix typescriptthree \ -typescripttwo typesetbuffer typesetfile uconvertnumber ueber \ -uebersetzten uedcatcodecommand umgebung umrahmt umrahmtertext \ -unbekant undefinevalue undepthed underbar underbars \ -underbartext underbrace underbracetext underbracket underbrackettext \ -underdash underdashes underdot underdots underleftarrow \ -underleftharpoondown underleftharpoonup underleftrightarrow underparent underparenttext \ -underrandom underrandoms underrightarrow underrightharpoondown underrightharpoonup \ -underset understrike understrikes undertwoheadleftarrow undertwoheadrightarrow \ -undoassign unframed unhhbox unihex uniqueMPgraphic \ -uniqueMPpagegraphic unprotected unregisterhyphenationpattern unspaceafter unspaceargument \ -unspaced unspacestring unterabsatz unterthema unterunterabsatz \ -unterunterthema unterunterunterabsatz unterunterunterthema unterunterunterunterabsatz unterunterunterunterthema \ -untexargument untexcommand uppercased uppercasestring upperleftdoubleninequote \ -upperleftdoublesixquote upperleftsingleninequote upperleftsinglesixquote upperrightdoubleninequote upperrightdoublesixquote \ -upperrightsingleninequote upperrightsinglesixquote url useMPenvironmentbuffer useMPgraphic \ -useMPlibrary useMPrun useMPvariables useblankparameter usebodyfont \ -usebodyfontparameter usebtxdataset usebtxdefinitions usecolors usecomponent \ -usedummycolorparameter usedummystyleandcolor usedummystyleparameter useenvironment useexternalrendering \ -usefigurebase usefile usegridparameter useindentingparameter useindentnextparameter \ -useinterlinespaceparameter uselanguageparameter useluamodule usemathstyleparameter useproduct \ -useprofileparameter useproject usereferenceparameter userpagenumber usesetupsparameter \ -usestaticMPfigure usesubpath usetexmodule usetypescript usetypescriptfile \ -usezipfile utfchar utflower utfupper utilityregisterlength \ -vboxreference verbatim verbatimstring verbergebloecke verbergen \ -verbosenumber vergleichefarbengruppe vergleichepalette version verticalgrowingbar \ -verticalpositionbar verwendeJSscript verwendeURL verwendebloecke verwendeexteresdokument \ -verwendeexterneabbildung verwendeexternestonstueck verwendemodul verwendesymbole verwendeurl \ -vglue viewerlayer vl volleswort von \ -vphantom vpos vsmash vsmashbox vsmashed \ -vspace vspacing waehlebloeckeaus wdofstring wechselezumfliesstext \ -widthofstring widthspanningtext withoutpt wochentag word \ -words wordtonumber writedatatolist writestatus xLeftarrow \ -xLeftrightarrow xRightarrow xdefconvertedargument xequal xfrac \ -xhookleftarrow xhookrightarrow xleftarrow xleftharpoondown xleftharpoonup \ -xleftrightarrow xleftrightharpoons xmapsto xmladdindex xmlafterdocumentsetup \ -xmlaftersetup xmlall xmlappenddocumentsetup xmlappendsetup xmlapplyselectors \ -xmlatt xmlattdef xmlattribute xmlattributedef xmlbadinclusions \ -xmlbeforedocumentsetup xmlbeforesetup xmlchainatt xmlchainattdef xmlchecknamespace \ -xmlcommand xmlconcat xmlconcatrange xmlcontext xmlcount \ -xmldefaulttotext xmldirectives xmldirectivesafter xmldirectivesbefore xmldisplayverbatim \ -xmldoif xmldoifelse xmldoifelseempty xmldoifelseselfempty xmldoifelsetext \ -xmldoifelsevalue xmldoifnot xmldoifnotselfempty xmldoifnottext xmldoifselfempty \ -xmldoiftext xmlelement xmlfilter xmlfirst xmlflush \ -xmlflushcontext xmlflushdocumentsetups xmlflushlinewise xmlflushpure xmlflushspacewise \ -xmlflushtext xmlinclude xmlinclusion xmlinclusions xmlinfo \ -xmlinjector xmlinlineverbatim xmlinstalldirective xmllast xmllastatt \ -xmllastmatch xmlloadbuffer xmlloaddata xmlloaddirectives xmlloadfile \ -xmlloadonly xmlmain xmlmapvalue xmlname xmlnamespace \ -xmlnonspace xmlpath xmlpos xmlposition xmlprependdocumentsetup \ -xmlprependsetup xmlprettyprint xmlprocessbuffer xmlprocessdata xmlprocessfile \ -xmlpure xmlraw xmlrefatt xmlregistereddocumentsetups xmlregisteredsetups \ -xmlregisterns xmlremapname xmlremapnamespace xmlremovedocumentsetup xmlremovesetup \ -xmlresetdocumentsetups xmlresetinjectors xmlresetsetups xmlsave xmlsetentity \ -xmlsetfunction xmlsetinjectors xmlsetsetup xmlsetup xmlshow \ -xmlsnippet xmlstrip xmlstripnolines xmlstripped xmlstrippednolines \ -xmltag xmltexentity xmltext xmltobuffer xmltobufferverbose \ -xmltofile xmlvalue xmlverbatim xrel xrightarrow \ -xrightharpoondown xrightharpoonup xrightleftharpoons xrightoverleftarrow xsplitstring \ -xtriplerel xtwoheadleftarrow xtwoheadrightarrow xxfrac xypos \ -zeigedruck zeigeeinstellungen zeigefarbe zeigefarbengruppe zeigefliesstext \ -zeigefliesstextumgebung zeigegitter zeigelayout zeigepalette zeigerahmen \ -zeigestruts zeigeumbruch ziffern zitat zitieren \ -zu zurbox zurseite - -keywordclass.context.en=\ -AMSTEX AfterPar Alphabeticnumerals AmSTeX \ -And BeforePar Big Bigg Biggl \ -Biggm Biggr Bigl Bigm Bigr \ -CONTEXT Cap Caps Character Characters \ -ConTeXt Context ConvertConstantAfter ConvertToConstant ETEX \ -EveryLine EveryPar GetPar GotoPar Greeknumerals \ -INRSTEX LAMSTEX LATEX LUAJITTEX LUATEX \ -LaTeX LamSTeX Lua LuaTeX LuajitTeX \ -METAFONT METAFUN METAPOST MKII MKIV \ -MKIX MKVI MKXI MONTH MONTHLONG \ -MONTHSHORT MPII MPIV MPVI MPanchor \ -MPbetex MPc MPcode MPcolor MPcoloronly \ -MPcolumn MPd MPdrawing MPfontsizehskip MPgetmultipars \ -MPgetmultishape MPgetposboxes MPh MPinclusions MPleftskip \ -MPll MPlr MPls MPmenubuttons MPn \ -MPoptions MPoverlayanchor MPp MPpage MPpardata \ -MPplus MPpos MPpositiongraphic MPposset MPr \ -MPrawvar MPregion MPrest MPrightskip MPrs \ -MPstring MPtext MPtransparency MPul MPur \ -MPv MPvar MPvariable MPvv MPw \ -MPwhd MPx MPxy MPxywhd MPy \ -MetaFont MetaFun MetaPost NormalizeFontHeight NormalizeFontWidth \ -NormalizeTextHeight NormalizeTextWidth Numbers PDFETEX PDFTEX \ -PDFcolor PICTEX PPCHTEX PPCHTeX PRAGMA \ -PiCTeX PointsToBigPoints PointsToReal PointsToWholeBigPoints PtToCm \ -ReadFile Romannumerals ScaledPointsToBigPoints ScaledPointsToWholeBigPoints Smallcapped \ -TABLE TEX TEXpage TaBlE TeX \ -TheNormalizedFontSize TransparencyHack VerboseNumber WEEKDAY WORD \ -WORDS WidthSpanningText Word Words XETEX \ -XeTeX abjadnaivenumerals abjadnodotnumerals abjadnumerals about \ -activatespacehandler adaptcollector adaptfontfeature adaptlayout adaptpapersize \ -addfeature addtoJSpreamble addtocommalist addvalue aftersplitstring \ -aftertestandsplitstring alignmentcharacter allinputpaths alphabeticnumerals alwayscitation \ -alwayscite ampersand anchor appendetoks appendgvalue \ -appendtocommalist appendtoks appendtoksonce appendvalue apply \ -applyalternativestyle applyprocessor applytocharacters applytofirstcharacter applytosplitstringchar \ -applytosplitstringcharspaced applytosplitstringline applytosplitstringlinespaced applytosplitstringword applytosplitstringwordspaced \ -applytowords arabicdecimals arabicexnumerals arabicnumerals arg \ -asciistr aside assignalfadimension assigndimen assigndimension \ -assignifempty assigntranslation assignvalue assignwidth assumelongusagecs \ -astype at atpage attachment autocap \ -autodirhbox autodirvbox autodirvtop autoinsertnextspace automathematics \ -autosetups availablehsize averagecharwidth background backgroundimage \ -backgroundimagefill backgroundline basegrid baselineleftbox baselinemiddlebox \ -baselinerightbox bbox beforesplitstring beforetestandsplitstring big \ -bigbodyfont bigg bigger biggl biggm \ -biggr bigl bigm bigr bigskip \ -binom bitmapimage blackrule blackrules blank \ -blap bleed bleedheight bleedwidth blockligatures \ -blockquote bodyfontenvironmentlist bodyfontsize bold boldface \ -bolditalic boldslanted bookmark booleanmodevalue bottombox \ -bottomleftbox bottomrightbox boxcursor boxmarker boxofsize \ -boxreference bpos bthiddencitation btxabbreviatedjournal btxaddjournal \ -btxalwayscitation btxauthorfield btxdetail btxdirect btxdoif \ -btxdoifcombiinlistelse btxdoifelse btxdoifelsecombiinlist btxdoifelsesameasprevious btxdoifelsesameaspreviouschecked \ -btxdoifelseuservariable btxdoifnot btxdoifsameaspreviouscheckedelse btxdoifsameaspreviouselse btxdoifuservariableelse \ -btxexpandedjournal btxfield btxfieldname btxfieldtype btxfirstofrange \ -btxflush btxflushauthor btxflushauthorinverted btxflushauthorinvertedshort btxflushauthorname \ -btxflushauthornormal btxflushauthornormalshort btxflushsuffix btxfoundname btxfoundtype \ -btxhybridcite btxlistcitation btxloadjournalist btxoneorrange btxremapauthor \ -btxsavejournalist btxsetup btxsingularorplural btxsingularplural btxtextcitation \ -button calligraphic camel cap catcodetablename \ -cbox centerbox centeredbox centerednextbox cfrac \ -chapter character characters chardescription charwidthlanguage \ -checkcharacteralign checkedchar checkedfiller checkedstrippedcsname checkinjector \ -checknextindentation checknextinjector checkpage checkparameters checkpreviousinjector \ -checksoundtrack checktwopassdata checkvariables chem chemical \ -chemicalbottext chemicalmidtext chemicalsymbol chemicaltext chemicaltoptext \ -chineseallnumerals chinesecapnumerals chinesenumerals citation cite \ -clap classfont cldcommand cldcontext cldloadfile \ -cldprocessfile cleftarrow clip clonefield collect \ -collectedtext collectexpanded color colorbar colorcomponents \ -colored coloronly colorvalue column columnbreak \ -combinepages commalistelement commalistsentence commalistsize comment \ -comparecolorgroup comparedimension comparedimensioneps comparepalet completebtxrendering \ -completelist completelistofpublications completelistofsorts completelistofsynonyms completepagenumber \ -completeregister complexorsimple complexorsimpleempty component composedcollector \ -composedlayer compresult constantdimen constantdimenargument constantemptyargument \ -constantnumber constantnumberargument contentreference continuednumber continueifinputfile \ -convertargument convertcommand convertedcounter converteddimen convertedsubcounter \ -convertmonth convertnumber convertvalue convertvboxtohbox copyfield \ -copypages copyparameters copyposition correctwhitespace countersubs \ -counttoken counttokens cramped crampedclap crampedllap \ -crampedrlap crightarrow crightoverleftarrow ctop ctxcommand \ -ctxdirectcommand ctxdirectlua ctxfunction ctxlatecommand ctxlatelua \ -ctxloadluafile ctxlua ctxluabuffer ctxluacode ctxreport \ -ctxsprint currentassignmentlistkey currentassignmentlistvalue currentbtxuservariable currentcommalistitem \ -currentcomponent currentdate currentenvironment currentfeaturetest currentheadnumber \ -currentinterface currentlanguage currentlistentrydestinationattribute currentlistentrylimitedtext currentlistentrynumber \ -currentlistentrypagenumber currentlistentryreferenceattribute currentlistentrytitle currentlistentrytitlerendered currentlistsymbol \ -currentmainlanguage currentmessagetext currentmoduleparameter currentoutputstream currentproduct \ -currentproject currentregime currentregisterpageuserdata currentresponses currenttime \ -currentvalue currentxtablecolumn currentxtablerow datasetvariable date \ -dayoftheweek dayspermonth dbinom decrement decrementcounter \ -decrementedcounter decrementpagenumber decrementsubpagenumber decrementvalue defaultinterface \ -defaultobjectpage defaultobjectreference defcatcodecommand defconvertedargument defconvertedcommand \ -defconvertedvalue define defineMPinstance defineTABLEsetup defineactivecharacter \ -definealternativestyle defineanchor defineattachment defineattribute definebackground \ -definebar defineblock definebodyfont definebodyfontenvironment definebodyfontswitch \ -definebreakpoint definebreakpoints definebtx definebtxdataset definebtxregister \ -definebtxrendering definebuffer definebutton definecapitals definecharacterkerning \ -definecharacterspacing definechemical definechemicals definechemicalsymbol definecollector \ -definecolor definecolorgroup definecolumnbreak definecombination definecombinedlist \ -definecomment definecomplexorsimple definecomplexorsimpleempty defineconversion defineconversionset \ -definecounter definedataset definedelimitedtext definedescription definedfont \ -defineeffect defineenumeration defineexpandable defineexternalfigure definefallbackfamily \ -definefield definefieldbody definefieldbodyset definefieldcategory definefieldstack \ -definefiguresymbol definefileconstant definefilefallback definefilesynonym definefiller \ -definefirstline definefittingpage definefloat definefont definefontalternative \ -definefontfallback definefontfamily definefontfamilypreset definefontfeature definefontfile \ -definefontsize definefontsolution definefontstyle definefontsynonym defineformula \ -defineformulaalternative defineformulaframed defineframed defineframedcontent defineframedtext \ -definefrozenfont defineglobalcolor definegraphictypesynonym definegridsnapping definehbox \ -definehead defineheadalternative definehelp definehigh definehighlight \ -definehspace definehypenationfeatures defineindentedtext defineindenting defineinitial \ -defineinsertion defineinteraction defineinteractionbar defineinteractionmenu defineinterfaceconstant \ -defineinterfaceelement defineinterfacevariable defineinterlinespace defineintermediatecolor defineitemgroup \ -defineitems definelabel definelabelclass definelayer definelayerpreset \ -definelayout definelinefiller definelinenote definelinenumbering definelines \ -definelist definelistalternative definelistextra definelow definelowhigh \ -definelowmidhigh definemakeup definemarginblock definemargindata definemarker \ -definemarking definemathalignment definemathcases definemathcommand definemathdoubleextensible \ -definemathematics definemathextensible definemathfence definemathfraction definemathframed \ -definemathmatrix definemathornament definemathoverextensible definemathovertextextensible definemathradical \ -definemathstackers definemathstyle definemathtriplet definemathunderextensible definemathundertextextensible \ -definemathunstacked definemeasure definemessageconstant definemixedcolumns definemode \ -definemultitonecolor definenamedcolor definenamespace definenarrower definenote \ -defineornament defineoutputroutine defineoutputroutinecommand defineoverlay definepage \ -definepagebreak definepagechecker definepagegrid definepagegridarea definepagegridspan \ -definepageinjection definepageinjectionalternative definepageshift definepagestate definepairedbox \ -definepalet definepapersize defineparagraph defineparagraphs defineparallel \ -defineparbuilder defineplacement definepositioning defineprefixset defineprocesscolor \ -defineprocessor defineprofile defineprogram definepushbutton definepushsymbol \ -definereference definereferenceformat defineregister definerenderingwindow defineresetset \ -definescale definescript definesection definesectionblock definesectionlevels \ -defineselector defineseparatorset defineshift definesidebar definesort \ -definesorting definespotcolor definestartstop definestyle definestyleinstance \ -definesubfield definesubformula definesymbol definesynonym definesynonyms \ -definesystemattribute definesystemconstant definesystemvariable definetabletemplate definetabulate \ -definetabulation definetext definetextbackground definetextflow definetooltip \ -definetransparency definetwopasslist definetype definetypeface definetypescriptprefix \ -definetypescriptsynonym definetypesetting definetyping defineunit defineviewerlayer \ -definevspace definevspacing definevspacingamount definextable delimited \ -delimitedtext depthofstring depthonlybox depthspanningtext determineheadnumber \ -determinelistcharacteristics determinenoflines determineregistercharacteristics devanagarinumerals dfrac \ -digits dimensiontocount directcolor directcolored directconvertedcounter \ -directdummyparameter directgetboxllx directgetboxlly directhighlight directlocalframed \ -directluacode directselect directsetbar directsetup directsymbol \ -directvspacing dis disabledirectives disableexperiments disablemode \ -disableoutputstream disableparpositions disableregime disabletrackers displaymath \ -displaymathematics displaymessage distributedhsize dividedsize doadaptleftskip \ -doadaptrightskip doaddfeature doassign doassignempty doboundtext \ -docheckassignment docheckedpagestate docheckedpair documentvariable dodoubleargument \ -dodoubleargumentwithset dodoubleempty dodoubleemptywithset dodoublegroupempty doeassign \ -doexpandedrecurse dogetattribute dogetattributeid dogetcommacommandelement dogobbledoubleempty \ -dogobblesingleempty doif doifMPgraphicelse doifallcommon doifallcommonelse \ -doifalldefinedelse doifallmodes doifallmodeselse doifassignmentelse doifblackelse \ -doifbothsides doifbothsidesoverruled doifboxelse doifbufferelse doifcolor \ -doifcolorelse doifcommandhandler doifcommandhandlerelse doifcommon doifcommonelse \ -doifcontent doifconversiondefinedelse doifconversionnumberelse doifcounter doifcounterelse \ -doifcurrentfonthasfeatureelse doifdefined doifdefinedcounter doifdefinedcounterelse doifdefinedelse \ -doifdimensionelse doifdimenstringelse doifdocumentargument doifdocumentargumentelse doifdocumentfilename \ -doifdocumentfilenameelse doifdrawingblackelse doifelse doifelseMPgraphic doifelseallcommon \ -doifelsealldefined doifelseallmodes doifelseassignment doifelseblack doifelsebox \ -doifelsebuffer doifelsecolor doifelsecommandhandler doifelsecommon doifelseconversiondefined \ -doifelseconversionnumber doifelsecounter doifelsecurrentfonthasfeature doifelsecurrentsortingused doifelsecurrentsynonymshown \ -doifelsecurrentsynonymused doifelsedefined doifelsedefinedcounter doifelsedimension doifelsedimenstring \ -doifelsedocumentargument doifelsedocumentfilename doifelsedrawingblack doifelseempty doifelseemptyvalue \ -doifelseemptyvariable doifelseenv doifelsefastoptionalcheck doifelsefastoptionalcheckcs doifelsefieldbody \ -doifelsefieldcategory doifelsefigure doifelsefile doifelsefiledefined doifelsefileexists \ -doifelsefirstchar doifelseflagged doifelsefontchar doifelsefontpresent doifelsefontsynonym \ -doifelsehasspace doifelsehelp doifelseincsname doifelseinelement doifelseinputfile \ -doifelseinsertion doifelseinset doifelseinstring doifelseinsymbolset doifelseintoks \ -doifelseintwopassdata doifelseitalic doifelselanguage doifelselayerdata doifelselayoutdefined \ -doifelselayoutsomeline doifelselayouttextline doifelseleapyear doifelselist doifelselocation \ -doifelselocfile doifelsemainfloatbody doifelsemarking doifelsemeaning doifelsemessage \ -doifelsemode doifelsenextbgroup doifelsenextbgroupcs doifelsenextchar doifelsenextoptional \ -doifelsenextoptionalcs doifelsenextparenthesis doifelsenonzeropositive doifelsenoteonsamepage doifelsenothing \ -doifelsenumber doifelseobjectfound doifelseobjectreferencefound doifelseoddpage doifelseoddpagefloat \ -doifelseoldercontext doifelseolderversion doifelseoverlapping doifelseoverlay doifelseparallel \ -doifelseparentfile doifelsepath doifelsepathexists doifelsepatterns doifelseposition \ -doifelsepositionaction doifelsepositiononpage doifelsepositionsonsamepage doifelsepositionsonthispage doifelsepositionsused \ -doifelsereferencefound doifelserightpagefloat doifelserighttoleftinbox doifelsesamelinereference doifelsesamestring \ -doifelsesetups doifelsesomebackground doifelsesomespace doifelsesomething doifelsesometoks \ -doifelsestringinstring doifelsestructurelisthasnumber doifelsestructurelisthaspage doifelsesymboldefined doifelsesymbolset \ -doifelsetext doifelsetextflow doifelsetextflowcollector doifelsetypingfile doifelseundefined \ -doifelseurldefined doifelsevalue doifelsevaluenothing doifelsevariable doifempty \ -doifemptyelse doifemptytoks doifemptyvalue doifemptyvalueelse doifemptyvariable \ -doifemptyvariableelse doifenv doifenvelse doiffastoptionalcheckcselse doiffastoptionalcheckelse \ -doiffieldbodyelse doiffieldcategoryelse doiffigureelse doiffile doiffiledefinedelse \ -doiffileelse doiffileexistselse doiffirstcharelse doifflaggedelse doiffontcharelse \ -doiffontpresentelse doiffontsynonymelse doifhasspaceelse doifhelpelse doifincsnameelse \ -doifinelementelse doifinputfileelse doifinsertionelse doifinset doifinsetelse \ -doifinstring doifinstringelse doifinsymbolset doifinsymbolsetelse doifintokselse \ -doifintwopassdataelse doifitalicelse doiflanguageelse doiflayerdataelse doiflayoutdefinedelse \ -doiflayoutsomelineelse doiflayouttextlineelse doifleapyearelse doiflistelse doiflocationelse \ -doiflocfileelse doifmainfloatbodyelse doifmarkingelse doifmeaningelse doifmessageelse \ -doifmode doifmodeelse doifnextbgroupcselse doifnextbgroupelse doifnextcharelse \ -doifnextoptionalcselse doifnextoptionalelse doifnextparenthesiselse doifnonzeropositiveelse doifnot \ -doifnotallcommon doifnotallmodes doifnotcommandhandler doifnotcommon doifnotcounter \ -doifnotdocumentargument doifnotdocumentfilename doifnotempty doifnotemptyvalue doifnotemptyvariable \ -doifnotenv doifnoteonsamepageelse doifnotescollected doifnotfile doifnotflagged \ -doifnothing doifnothingelse doifnotinset doifnotinsidesplitfloat doifnotinstring \ -doifnotmode doifnotnumber doifnotsamestring doifnotsetups doifnotvalue \ -doifnotvariable doifnumber doifnumberelse doifobjectfoundelse doifobjectreferencefoundelse \ -doifoddpageelse doifoddpagefloatelse doifoldercontextelse doifolderversionelse doifoverlappingelse \ -doifoverlayelse doifparallelelse doifparentfileelse doifpathelse doifpathexistselse \ -doifpatternselse doifposition doifpositionaction doifpositionactionelse doifpositionelse \ -doifpositiononpageelse doifpositionsonsamepageelse doifpositionsonthispageelse doifpositionsusedelse doifreferencefoundelse \ -doifrightpagefloatelse doifrighttoleftinboxelse doifsamelinereferenceelse doifsamestring doifsamestringelse \ -doifsetups doifsetupselse doifsomebackground doifsomebackgroundelse doifsomespaceelse \ -doifsomething doifsomethingelse doifsometoks doifsometokselse doifstringinstringelse \ -doifstructurelisthasnumberelse doifstructurelisthaspageelse doifsymboldefinedelse doifsymbolsetelse doiftext \ -doiftextelse doiftextflowcollectorelse doiftextflowelse doiftypingfileelse doifundefined \ -doifundefinedcounter doifundefinedelse doifurldefinedelse doifvalue doifvalueelse \ -doifvaluenothing doifvaluenothingelse doifvaluesomething doifvariable doifvariableelse \ -doindentation dollar doloop doloopoverlist donothing \ -dontconvertfont dontleavehmode dontpermitspacesbetweengroups dopositionaction doprocesslocalsetups \ -doquadrupleargument doquadrupleempty doquadruplegroupempty doquintupleargument doquintupleempty \ -doquintuplegroupempty dorechecknextindentation dorecurse dorepeatwithcommand doreplacefeature \ -doresetandafffeature doresetattribute dorotatebox dosetattribute dosetleftskipadaption \ -dosetrightskipadaption dosetupcheckedinterlinespace doseventupleargument doseventupleempty dosingleargument \ -dosingleempty dosinglegroupempty dosixtupleargument dosixtupleempty dostepwiserecurse \ -dosubtractfeature dotfskip dotoks dotripleargument dotripleargumentwithset \ -dotripleempty dotripleemptywithset dotriplegroupempty doublebar doublebond \ -doublebrace doublebracket doubleparent dowith dowithnextbox \ -dowithnextboxcontent dowithnextboxcontentcs dowithnextboxcs dowithpargument dowithrange \ -dowithwargument dpofstring dummydigit dummyparameter eTeX \ -edefconvertedargument efcmaxheight efcmaxwidth efcminheight efcminwidth \ -efcparameter effect elapsedseconds elapsedtime eleftarrowfill \ -eleftharpoondownfill eleftharpoonupfill eleftrightarrowfill emphasisboldface emphasistypeface \ -emptylines emspace enabledirectives enableexperiments enablemode \ -enableoutputstream enableparpositions enableregime enabletrackers enskip \ -enspace env environment envvar eoverbarfill \ -eoverbracefill eoverbracketfill eoverparentfill epos equaldigits \ -erightarrowfill erightharpoondownfill erightharpoonupfill etwoheadrightarrowfill eunderbarfill \ -eunderbracefill eunderbracketfill eunderparentfill executeifdefined exitloop \ -exitloopnow expandcheckedcsname expanded expandfontsynonym externalfigure \ -externalfigurecollectionmaxheight externalfigurecollectionmaxwidth externalfigurecollectionminheight externalfigurecollectionminwidth externalfigurecollectionparameter \ -fakebox fastdecrement fastincrement fastlocalframed fastscale \ -fastsetup fastsetupwithargument fastsetupwithargumentswapped fastswitchtobodyfont fastsxsy \ -feature fence fenced fetchallmarkings fetchallmarks \ -fetchmark fetchmarking fetchonemark fetchonemarking fetchruntinecommand \ -fetchtwomarkings fetchtwomarks field fieldbody fieldstack \ -fifthoffivearguments fifthofsixarguments figure figurefilename figurefilepath \ -figurefiletype figurefullname figureheight figurenaturalheight figurenaturalwidth \ -figuresymbol figurewidth filename filledhboxb filledhboxc \ -filledhboxg filledhboxk filledhboxm filledhboxr filledhboxy \ -filler fillinline fillinrules fillintext filterfromnext \ -filterfromvalue filterpages filterreference findtwopassdata finishregisterentry \ -firstcharacter firstcounter firstcountervalue firstoffivearguments firstoffourarguments \ -firstofoneargument firstofoneunexpanded firstofsixarguments firstofthreearguments firstofthreeunexpanded \ -firstoftwoarguments firstoftwounexpanded firstrealpage firstrealpagenumber firstsubcountervalue \ -firstsubpage firstsubpagenumber firstuserpage firstuserpagenumber fitfield \ -fitfieldframed fittopbaselinegrid fixedspace fixedspaces flag \ -floatuserdataparameter flushboxregister flushcollector flushlayer flushlocalfloats \ -flushnextbox flushnotes flushoutputstream flushshapebox flushtextflow \ -flushtokens flushtoks fontalternative fontbody fontchar \ -fontcharbyindex fontclass fontclassname fontface fontfeaturelist \ -fontsize fontstyle footnotetext forcecharacterstripping forcelocalfloats \ -forgeteverypar forgetparameters formula formulanumber foundbox \ -fourthoffivearguments fourthoffourarguments fourthofsixarguments frac framed \ -frameddimension framedparameter framedtext freezedimenmacro freezemeasure \ -frenchspacing from fromlinenote frozenhbox gdefconvertedargument \ -gdefconvertedcommand getMPdrawing getMPlayer getboxllx getboxlly \ -getbuffer getbufferdata getcommacommandsize getcommalistsize getdayoftheweek \ -getdayspermonth getdefinedbuffer getdocumentargument getdocumentargumentdefault getdocumentfilename \ -getdummyparameters getemptyparameters geteparameters getexpandedparameters getfiguredimensions \ -getfirstcharacter getfirsttwopassdata getfromcommacommand getfromcommalist getfromtwopassdata \ -getglyphdirect getglyphstyled getgparameters getlasttwopassdata getlocalfloat \ -getlocalfloats getmarking getmessage getnamedglyphdirect getnamedglyphstyled \ -getnamedtwopassdatalist getnaturaldimensions getnoflines getobject getobjectdimensions \ -getpaletsize getparameters getprivatechar getprivateslot getrandomcount \ -getrandomdimen getrandomfloat getrandomnumber getrandomseed getraweparameters \ -getrawgparameters getrawnoflines getrawparameters getrawxparameters getreference \ -getreferenceentry getroundednoflines getsubstring gettwopassdata gettwopassdatalist \ -getuvalue getvalue getvariable getvariabledefault getxparameters \ -globaldisablemode globalenablemode globalletempty globalpopbox globalpopmacro \ -globalpreventmode globalprocesscommalist globalpushbox globalpushmacro globalswapcounts \ -globalswapdimens globalswapmacros globalundefine glyphfontfile gobbledoubleempty \ +glyphfontfile gnapprox gneqq gnsim gobbledoubleempty \ gobbleeightarguments gobblefivearguments gobblefiveoptionals gobblefourarguments gobblefouroptionals \ gobbleninearguments gobbleoneargument gobbleoneoptional gobblesevenarguments gobblesingleempty \ gobblesixarguments gobblespacetokens gobbletenarguments gobblethreearguments gobblethreeoptionals \ gobbletwoarguments gobbletwooptionals gobbleuntil gobbleuntilrelax godown \ goto gotobox gotopage grabbufferdata grabbufferdatadirect \ -grabuntil graphic graycolor grayvalue greedysplitstring \ -greeknumerals grid groupedcommand gsetboxllx gsetboxlly \ -gujaratinumerals gurmurkhinumerals hairline hairspace halfwaybox \ -handletokens handwritten hash hboxofvbox hboxreference \ -hdofstring headhbox headnumber headnumbercontent headnumberdistance \ -headnumberwidth headreferenceattributes headsetupspacing headtextcontent headtextdistance \ -headtextwidth headvbox headwidth heightanddepthofstring heightofstring \ +grabuntil grave graycolor grayvalue greedysplitstring \ +greekAlpha greekAlphadasia greekAlphadasiaperispomeni greekAlphadasiatonos greekAlphadasiavaria \ +greekAlphaiotasub greekAlphaiotasubdasia greekAlphaiotasubdasiaperispomeni greekAlphaiotasubdasiatonos greekAlphaiotasubdasiavaria \ +greekAlphaiotasubpsili greekAlphaiotasubpsiliperispomeni greekAlphaiotasubpsilitonos greekAlphaiotasubpsilivaria greekAlphamacron \ +greekAlphapsili greekAlphapsiliperispomeni greekAlphapsilitonos greekAlphapsilivaria greekAlphatonos \ +greekAlphavaria greekAlphavrachy greekBeta greekChi greekCoronis \ +greekDelta greekEpsilon greekEpsilondasia greekEpsilondasiatonos greekEpsilondasiavaria \ +greekEpsilonpsili greekEpsilonpsilitonos greekEpsilonpsilivaria greekEpsilontonos greekEpsilonvaria \ +greekEta greekEtadasia greekEtadasiaperispomeni greekEtadasiatonos greekEtadasiavaria \ +greekEtaiotasub greekEtaiotasubdasia greekEtaiotasubdasiaperispomeni greekEtaiotasubdasiatonos greekEtaiotasubdasiavaria \ +greekEtaiotasubpsili greekEtaiotasubpsiliperispomeni greekEtaiotasubpsilitonos greekEtaiotasubpsilivaria greekEtapsili \ +greekEtapsiliperispomeni greekEtapsilitonos greekEtapsilivaria greekEtatonos greekEtavaria \ +greekGamma greekIota greekIotadasia greekIotadasiaperispomeni greekIotadasiatonos \ +greekIotadasiavaria greekIotadialytika greekIotamacron greekIotapsili greekIotapsiliperispomeni \ +greekIotapsilitonos greekIotapsilivaria greekIotatonos greekIotavaria greekIotavrachy \ +greekKappa greekLambda greekMu greekNu greekOmega \ +greekOmegadasia greekOmegadasiaperispomeni greekOmegadasiatonos greekOmegadasiavaria greekOmegaiotasub \ +greekOmegaiotasubdasia greekOmegaiotasubdasiaperispomeni greekOmegaiotasubdasiatonos greekOmegaiotasubdasiavaria greekOmegaiotasubpsili \ +greekOmegaiotasubpsiliperispomeni greekOmegaiotasubpsilitonos greekOmegaiotasubpsilivaria greekOmegapsili greekOmegapsiliperispomeni \ +greekOmegapsilitonos greekOmegapsilivaria greekOmegatonos greekOmegavaria greekOmicron \ +greekOmicrondasia greekOmicrondasiatonos greekOmicrondasiavaria greekOmicronpsili greekOmicronpsilitonos \ +greekOmicronpsilivaria greekOmicrontonos greekOmicronvaria greekPhi greekPi \ +greekPsi greekRho greekRhodasia greekSigma greekSigmalunate \ +greekTau greekTheta greekUpsilon greekUpsilondasia greekUpsilondasiaperispomeni \ +greekUpsilondasiatonos greekUpsilondasiavaria greekUpsilondialytika greekUpsilonmacron greekUpsilontonos \ +greekUpsilonvaria greekUpsilonvrachy greekXi greekZeta greekalpha \ +greekalphadasia greekalphadasiaperispomeni greekalphadasiatonos greekalphadasiavaria greekalphaiotasub \ +greekalphaiotasubdasia greekalphaiotasubdasiaperispomeni greekalphaiotasubdasiatonos greekalphaiotasubdasiavaria greekalphaiotasubperispomeni \ +greekalphaiotasubpsili greekalphaiotasubpsiliperispomeni greekalphaiotasubpsilitonos greekalphaiotasubpsilivaria greekalphaiotasubtonos \ +greekalphaiotasubvaria greekalphamacron greekalphaoxia greekalphaperispomeni greekalphapsili \ +greekalphapsiliperispomeni greekalphapsilitonos greekalphapsilivaria greekalphatonos greekalphavaria \ +greekalphavrachy greekbeta greekchi greekdasia greekdasiaperispomeni \ +greekdasiatonos greekdasiavaria greekdelta greekdialytikaperispomeni greekdialytikatonos \ +greekdialytikavaria greekdigamma greekepsilon greekepsilonalt greekepsilondasia \ +greekepsilondasiatonos greekepsilondasiavaria greekepsilonoxia greekepsilonpsili greekepsilonpsilitonos \ +greekepsilonpsilivaria greekepsilontonos greekepsilonvaria greeketa greeketadasia \ +greeketadasiaperispomeni greeketadasiatonos greeketadasiavaria greeketaiotasub greeketaiotasubdasia \ +greeketaiotasubdasiaperispomeni greeketaiotasubdasiatonos greeketaiotasubdasiavaria greeketaiotasubperispomeni greeketaiotasubpsili \ +greeketaiotasubpsiliperispomeni greeketaiotasubpsilitonos greeketaiotasubpsilivaria greeketaiotasubtonos greeketaiotasubvaria \ +greeketaoxia greeketaperispomeni greeketapsili greeketapsiliperispomeni greeketapsilitonos \ +greeketapsilivaria greeketatonos greeketavaria greekfinalsigma greekgamma \ +greekiota greekiotadasia greekiotadasiaperispomeni greekiotadasiatonos greekiotadasiavaria \ +greekiotadialytika greekiotadialytikaperispomeni greekiotadialytikatonos greekiotadialytikavaria greekiotamacron \ +greekiotaoxia greekiotaperispomeni greekiotapsili greekiotapsiliperispomeni greekiotapsilitonos \ +greekiotapsilivaria greekiotatonos greekiotavaria greekiotavrachy greekkappa \ +greekkoppa greeklambda greekmu greeknu greeknumerals \ +greeknumkoppa greekomega greekomegadasia greekomegadasiaperispomeni greekomegadasiatonos \ +greekomegadasiavaria greekomegaiotasub greekomegaiotasubdasia greekomegaiotasubdasiaperispomeni greekomegaiotasubdasiatonos \ +greekomegaiotasubdasiavaria greekomegaiotasubperispomeni greekomegaiotasubpsili greekomegaiotasubpsiliperispomeni greekomegaiotasubpsilitonos \ +greekomegaiotasubpsilivaria greekomegaiotasubtonos greekomegaiotasubvaria greekomegaoxia greekomegaperispomeni \ +greekomegapsili greekomegapsiliperispomeni greekomegapsilitonos greekomegapsilivaria greekomegatonos \ +greekomegavaria greekomicron greekomicrondasia greekomicrondasiatonos greekomicrondasiavaria \ +greekomicronoxia greekomicronpsili greekomicronpsilitonos greekomicronpsilivaria greekomicrontonos \ +greekomicronvaria greekoxia greekperispomeni greekphi greekphialt \ +greekpi greekpialt greekprosgegrammeni greekpsi greekpsili \ +greekpsiliperispomeni greekpsilitonos greekpsilivaria greekrho greekrhoalt \ +greekrhodasia greekrhopsili greeksampi greeksigma greeksigmalunate \ +greekstigma greektau greektheta greekthetaalt greektonos \ +greekupsilon greekupsilondasia greekupsilondasiaperispomeni greekupsilondasiatonos greekupsilondasiavaria \ +greekupsilondiaeresis greekupsilondialytikaperispomeni greekupsilondialytikatonos greekupsilondialytikavaria greekupsilonmacron \ +greekupsilonoxia greekupsilonperispomeni greekupsilonpsili greekupsilonpsiliperispomeni greekupsilonpsilitonos \ +greekupsilonpsilivaria greekupsilontonos greekupsilonvaria greekupsilonvrachy greekvaria \ +greekxi greekzeta grid groupedcommand gsetboxllx \ +gsetboxlly gstroke gt gtrapprox gtrdot \ +gtreqless gtreqqless gtrless gtrsim guilsingleleft \ +guilsingleright gujaratinumerals gurmurkhinumerals hairline hairspace \ +halflinestrut halfstrut halfwaybox handletokens handwritten \ +hangul hanzi hash hat hbar \ +hboxofvbox hboxreference hcaron hcircumflex hdofstring \ +headhbox headlanguage headnumber headnumbercontent headnumberdistance \ +headnumberwidth headreferenceattributes headsetupspacing headtext headtextcontent \ +headtextdistance headtexts headtextwidth headvbox headwidth \ +heartsuit hebrewAlef hebrewAyin hebrewBet hebrewDalet \ +hebrewGimel hebrewHe hebrewHet hebrewKaf hebrewKaffinal \ +hebrewLamed hebrewMem hebrewMemfinal hebrewNun hebrewNunfinal \ +hebrewPe hebrewPefinal hebrewQof hebrewResh hebrewSamekh \ +hebrewShin hebrewTav hebrewTet hebrewTsadi hebrewTsadifinal \ +hebrewVav hebrewYod hebrewZayin heightanddepthofstring heightofstring \ heightspanningtext helptext hglue hiddenbar hiddencitation \ -hiddencite hideblocks hiding high highlight \ -highordinalstr hilo himilo hl horizontalgrowingbar \ -horizontalpositionbar hphantom hpos hsizefraction hsmash \ -hsmashbox hsmashed hspace htdpofstring htofstring \ -hyphen hyphenatedcoloredword hyphenatedfile hyphenatedfilename hyphenatedhbox \ -hyphenatedpar hyphenatedurl hyphenatedword ibox ifassignment \ -iff ifinobject ifinoutputstream ifparameters iftrialtypesetting \ -ignoreimplicitspaces ignorevalue immediatesavetwopassdata impliedby implies \ -in includemenu includeversioninfo increment incrementcounter \ -incrementedcounter incrementpagenumber incrementsubpagenumber incrementvalue indentation \ -infofont infofontbold inframed infull inheritparameter \ -inhibitblank initializeboxstack inline inlinebuffer inlinedbox \ -inlinemath inlinemathematics inlinemessage inlineordisplaymath inlinerange \ -inmaframed innerflushshapebox input inputfilebarename inputfilename \ -inputfilerealsuffix inputfilesuffix inputgivenfile insertpages installactionhandler \ +hiddencite hideblocks high highlight highordinalstr \ +hilo himilo hl hookleftarrow hookrightarrow \ +horizontalgrowingbar horizontalpositionbar hphantom hpos hsizefraction \ +hslash hsmash hsmashbox hsmashed hspace \ +hstroke htdpofstring htofstring hyphen hyphenatedcoloredword \ +hyphenatedfile hyphenatedfilename hyphenatedhbox hyphenatedpar hyphenatedurl \ +hyphenatedword iacute ibox ibreve icaron \ +icircumflex ideographichalffillspace ideographicspace idiaeresis idotaccent \ +idotbelow idoublegrave ifassignment iff ifinobject \ +ifinoutputstream ifparameters iftrialtypesetting ignoreimplicitspaces ignorevalue \ +igrave ihook iiiint iiiintop iiint \ +iiintop iint iintop iinvertedbreve ijligature \ +imacron imaginaryi imaginaryj imath immediatesavetwopassdata \ +impliedby implies imply in includemenu \ +includeversioninfo increment incrementcounter incrementedcounter incrementpagenumber \ +incrementsubpagenumber incrementvalue indentation index infofont \ +infofontbold inframed infty infull inheritparameter \ +inhibitblank ininner ininneredge ininnermargin initializeboxstack \ +inleft inleftedge inleftmargin inline inlinebuffer \ +inlinedbox inlinemath inlinemathematics inlinemessage inlineordisplaymath \ +inlineprettyprintbuffer inlinerange inmargin inmframed innerflushshapebox \ +inother inouter inouteredge inoutermargin input \ +inputfilebarename inputfilename inputfilerealsuffix inputfilesuffix inputgivenfile \ +inright inrightedge inrightmargin insertpages installactionhandler \ installactivecharacter installanddefineactivecharacter installattributestack installautocommandhandler installautosetuphandler \ installbasicautosetuphandler installbasicparameterhandler installbottomframerenderer installcommandhandler installcorenamespace \ installdefinehandler installdefinitionset installdefinitionsetmember installdirectcommandhandler installdirectparameterhandler \ @@ -1886,240 +586,338 @@ installparameterhandler installparameterhashhandler installparametersethandler i installrootparameterhandler installsetuphandler installsetuponlycommandhandler installshipoutmethod installsimplecommandhandler \ installsimpleframedcommandhandler installstyleandcolorhandler installswitchcommandhandler installswitchsetuphandler installtexdirective \ installtextracker installtopframerenderer installunitsseparator installunitsspace installversioninfo \ -integerrounding interactionbar interactionbuttons interactionmenu intermezzo \ -intertext invokepageheandler istltdir istrtdir italic \ -italicbold italiccorrection item itemize items \ -itemtag jobfilename jobfilesuffix kap keepblocks \ -keeplinestogether keepunwantedspaces kerncharacters koreancirclenumerals koreannumerals \ -koreannumeralsc koreannumeralsp koreanparentnumerals language languageCharacters \ +int intclockwise integerrounding integers interactionbar \ +interactionbuttons interactionmenu intercal intertext intop \ +invisibletimes invokepageheandler iogonek iota istltdir \ +istrtdir italic italicbold italiccorrection italicface \ +item items itemtag itilde jcaron \ +jcircumflex jmath jobfilename jobfilesuffix kap \ +kappa kcaron kcommaaccent keepblocks keeplinestogether \ +keepunwantedspaces kerncharacters khook kkra koreancirclenumerals \ +koreannumerals koreannumeralsc koreannumeralsp koreanparentnumerals lVert \ +labellanguage labeltext labeltexts lacute lambda \ +lambdabar land langle language languageCharacters \ languagecharacters languagecharwidth lastcounter lastcountervalue lastdigit \ lastlinewidth lastnaturalboxdp lastnaturalboxht lastnaturalboxwd lastpredefinedsymbol \ lastrealpage lastrealpagenumber lastsubcountervalue lastsubpage lastsubpagenumber \ -lasttwodigits lastuserpage lastuserpagenumber lateluacode layeredtext \ -layerheight layerwidth lazysavetaggedtwopassdata lazysavetwopassdata lbox \ -left leftbottombox leftbox lefthbox leftorrighthbox \ -leftorrightvbox leftorrightvtop leftskipadaption leftsubguillemot lefttopbox \ -lefttorighthbox lefttorightvbox lefttorightvtop letbeundefined letcatcodecommand \ +lasttwodigits lastuserpage lastuserpagenumber lateluacode latin \ +layeredtext layerheight layerwidth lazysavetaggedtwopassdata lazysavetwopassdata \ +lbar lbox lbrace lbracket lcaron \ +lceil lcommaaccent lcurl ldotmiddle ldotp \ +ldots le leadsto left leftaligned \ +leftarrow leftarrowtail leftarrowtriangle leftbottombox leftbox \ +leftdasharrow leftguillemot leftharpoondown leftharpoonup lefthbox \ +leftheadtext leftlabeltext leftleftarrows leftline leftmathlabeltext \ +leftorrighthbox leftorrightvbox leftorrightvtop leftrightarrow leftrightarrows \ +leftrightarrowtriangle leftrightharpoons leftrightsquigarrow leftskipadaption leftsquigarrow \ +leftsubguillemot leftthreetimes lefttopbox lefttoright lefttorighthbox \ +lefttorightvbox lefttorightvtop leftwavearrow leftwhitearrow leq \ +leqq leqslant lessapprox lessdot lesseqgtr \ +lesseqqgtr lessgtr lesssim letbeundefined letcatcodecommand \ letcscsname letcsnamecs letcsnamecsname letdummyparameter letempty \ letgvalue letgvalueempty letgvalurelax letterampersand letterat \ letterbackslash letterbar letterbgroup letterclosebrace lettercolon \ letterdollar letterdoublequote letteregroup letterescape letterexclamationmark \ -letterhash letterhat letterleftbrace letterless lettermore \ -letteropenbrace letterpercent letterquestionmark letterrightbrace lettersinglequote \ -letterslash letterspacing lettertilde letterunderscore letvalue \ -letvalueempty letvaluerelax lfence lhbox limitatelines \ -limitatetext limtatefirstline linespanningtext linethickness listcitation \ -listcite listlength listnamespaces llap loadanyfile \ +letterhash letterhat letterleftbrace letterleftbracket letterleftparenthesis \ +letterless lettermore letteropenbrace letterpercent letterquestionmark \ +letterrightbrace letterrightbracket letterrightparenthesis lettersinglequote letterslash \ +letterspacing lettertilde letterunderscore letvalue letvalueempty \ +letvaluerelax lfence lfloor lgroup lhbox \ +lhooknwarrow lhooksearrow limitatefirstline limitatelines limitatetext \ +line linefeed linenote linespanningtext linethickness \ +linterval listcitation listcite listlength listnamespaces \ +ljligature ll llangle llap llbracket \ +llcorner lll llless lmoustache lnapprox \ +lneq lneqq lnot lnsim loadanyfile \ loadanyfileonce loadbtxdefinitionfile loadbtxreplacementfile loadcldfile loadcldfileonce \ loadfontgoodies loadluafile loadluafileonce loadspellchecklist loadtexfile \ loadtexfileonce loadtypescriptfile localframed localframedwithsettings localhsize \ localpopbox localpopmacro localpushbox localpushmacro localundefine \ -locatedfilepath locatefilepath locfilename lohi lomihi \ -low lowerbox lowercased lowercasestring lowerleftdoubleninequote \ -lowerleftsingleninequote lowerrightdoubleninequote lowerrightsingleninequote lrtbbox ltop \ -luaTeX luacode luaconditional luaenvironment luaexpanded \ -luafunction luajitTeX luamajorversion luaminorversion luaparameterset \ -luasetup luaversion m mLeftarrow mLeftrightarrow \ -mRightarrow maframed mainlanguage makecharacteractive makerawcommalist \ -makestrutofbox mapfontsize margindata markcontent marking \ -markinjector mat math mathbf mathbi \ -mathblackboard mathbs mathcommand mathdefault mathematics \ -mathfraktur mathfunction mathit mathitalic mathop \ +locatedfilepath locatefilepath locfilename logo lohi \ +lointerval lomihi longleftarrow longleftrightarrow longmapsfrom \ +longmapsto longrightarrow longrightsquigarrow looparrowleft looparrowright \ +lor low lowerbox lowercased lowercasestring \ +lowerleftdoubleninequote lowerleftsingleninequote lowerrightdoubleninequote lowerrightsingleninequote lozenge \ +lparent lrcorner lrointerval lrtbbox lstroke \ +lt ltimes ltop luaTeX luacode \ +luaconditional luaenvironment luaexpanded luaexpr luafunction \ +luajitTeX luamajorversion luaminorversion luaparameterset luasetup \ +luaversion lvert m mLeftarrow mLeftrightarrow \ +mRightarrow mainlanguage makecharacteractive makerawcommalist makestrutofbox \ +maltese mapfontsize mapsdown mapsfrom mapsto \ +mapsup margindata margintext markcontent marking \ +markinjector markpage mat math mathampersand \ +mathbf mathbi mathblackboard mathbs mathdefault \ +mathdollar mathdouble mathematics mathfraktur mathfunction \ +mathhash mathhyphen mathit mathitalic mathlabellanguage \ +mathlabeltext mathlabeltexts mathop mathover mathpercent \ mathrm mathscript mathsl mathss mathtext \ mathtextbf mathtextbi mathtextbs mathtextit mathtextsl \ -mathtexttf mathtf mathtriplet mathtt mathupright \ -mathword mathwordbf mathwordbi mathwordbs mathwordit \ -mathwordsl mathwordtf mbox mcframed md \ -measure measured medskip medspace menubutton \ -mequal message metaTeX mfence mfunction \ -mfunctionlabeltext mhbox mhookleftarrow mhookrightarrow middle \ -middlebox midhbox minimalhbox mirror mixedcaps \ -mkvibuffer mleftarrow mleftharpoondown mleftharpoonup mleftrightarrow \ -mleftrightharpoons mmapsto moduleparameter molecule mono \ -monobold mononormal month monthlong monthshort \ -mp mprandomnumber mrel mrightarrow mrightharpoondown \ -mrightharpoonup mrightleftharpoons mrightoverleftarrow mtext mtriplerel \ -mtwoheadleftarrow mtwoheadrightarrow namedheadnumber namedstructureheadlocation namedstructureuservariable \ -namedstructurevariable namedtaggedlabeltexts naturalhbox naturalhpack naturalvbox \ -naturalvcenter naturalvpack naturalvtop naturalwd negatecolorbox \ -negated negthinspace newattribute newcatcodetable newcounter \ -newevery newfrenchspacing newmode newsignal newsystemmode \ -nextbox nextboxdp nextboxht nextboxhtdp nextboxwd \ -nextcounter nextcountervalue nextdepth nextparagraphs nextrealpage \ -nextrealpagenumber nextsubcountervalue nextsubpage nextsubpagenumber nextuserpage \ -nextuserpagenumber nobar nocap nocitation nocite \ +mathtexttf mathtf mathtriplet mathtt mathunder \ +mathupright mathword mathwordbf mathwordbi mathwordbs \ +mathwordit mathwordsl mathwordtf maxaligned mbox \ +mcframed measure measured measuredangle measuredeq \ +medskip medspace menubutton mequal message \ +metaTeX mfence mframed mfunction mfunctionlabeltext \ +mhbox mho mhookleftarrow mhookrightarrow mid \ +midaligned middle middlealigned middlebox midhbox \ +midsubsentence minimalhbox minus minuscolon mirror \ +mixedcaps mkvibuffer mleftarrow mleftharpoondown mleftharpoonup \ +mleftrightarrow mleftrightharpoons mmapsto models moduleparameter \ +molecule mono monobold mononormal month \ +monthlong monthshort mp mprandomnumber mrel \ +mrightarrow mrightharpoondown mrightharpoonup mrightleftharpoons mrightoverleftarrow \ +mtext mtriplerel mtwoheadleftarrow mtwoheadrightarrow mu \ +multimap nHdownarrow nHuparrow nLeftarrow nLeftrightarrow \ +nRightarrow nVDash nVdash nVleftarrow nVleftrightarrow \ +nVrightarrow nabla nacute namedheadnumber namedstructureheadlocation \ +namedstructureuservariable namedstructurevariable namedtaggedlabeltexts napostrophe napprox \ +napproxEq narrownobreakspace nasymp natural naturalhbox \ +naturalhpack naturalnumbers naturalvbox naturalvcenter naturalvpack \ +naturalvtop naturalwd ncaron ncommaaccent ncong \ +ncurl ndivides ne nearrow neg \ +negatecolorbox negated negativesign negthinspace neng \ +neq nequiv neswarrow newattribute newcatcodetable \ +newcounter newevery newfrenchspacing newmode newsignal \ +newsystemmode nexists nextbox nextboxdp nextboxht \ +nextboxhtdp nextboxwd nextcounter nextcountervalue nextdepth \ +nextparagraphs nextrealpage nextrealpagenumber nextsubcountervalue nextsubpage \ +nextsubpagenumber nextuserpage nextuserpagenumber ngeq ngrave \ +ngtr ngtrless ngtrsim ni nihongo \ +nin njligature nleftarrow nleftrightarrow nleq \ +nless nlessgtr nlesssim nmid nni \ +nobar nobreakspace nocap nocitation nocite \ nodetostring noffigurepages noflines noflocalfloats noheaderandfooterlines \ -noindentation noitem nonfrenchspacing nonmathematics normal \ -normalboldface normalframedwithsettings normalizebodyfontsize normalizedfontsize normalizefontdepth \ -normalizefontheight normalizefontline normalizefontwidth normalizetextdepth normalizetextheight \ -normalizetextline normalizetextwidth normaltypeface nospace note \ -notesymbol notopandbottomlines ntimes numberofpoints numbers \ +noheightstrut noindentation noitem nonfrenchspacing nonmathematics \ +normal normalboldface normalframedwithsettings normalitalicface normalizebodyfontsize \ +normalizedfontsize normalizefontdepth normalizefontheight normalizefontline normalizefontwidth \ +normalizetextdepth normalizetextheight normalizetextline normalizetextwidth normalslantedface \ +normaltypeface nospace not note notesymbol \ +notin notopandbottomlines notragged nowns nparallel \ +nprec npreccurlyeq nrightarrow nsim nsimeq \ +nsqsubseteq nsqsupseteq nsubset nsubseteq nsucc \ +nsucccurlyeq nsupset nsupseteq ntilde ntimes \ +ntriangleleft ntrianglelefteq ntriangleright ntrianglerighteq nu \ +numberofpoints numbers nvDash nvdash nvleftarrow \ +nvleftrightarrow nvrightarrow nwarrow nwsearrow oacute \ obeydepth objectdepth objectheight objectmargin objectwidth \ -obox offset offsetbox onedigitrounding ordinaldaynumber \ -ordinalstr ornamenttext outputfilename outputstreambox outputstreamcopy \ -outputstreamunvbox outputstreamunvcopy over overbar overbars \ -overbartext overbarunderbar overbrace overbracetext overbraceunderbrace \ -overbracket overbrackettext overbracketunderbracket overlaybutton overlaycolor \ -overlaydepth overlayfigure overlayheight overlaylinecolor overlaylinewidth \ -overlayoffset overlayrollbutton overlaywidth overleftarrow overleftharpoondown \ -overleftharpoonup overleftrightarrow overloaderror overparent overparenttext \ -overparentunderparent overrightarrow overrightharpoondown overrightharpoonup overset \ -overstrike overstrikes overtwoheadleftarrow overtwoheadrightarrow page \ -pagearea pagebreak pagefigure pagegridspanwidth pageinjection \ -pagenumber pagereference pagestaterealpage paletsize pdfTeX \ +obox obreve ocaron ocircumflex ocircumflexacute \ +ocircumflexdotbelow ocircumflexgrave ocircumflexhook ocircumflextilde odiaeresis \ +odiaeresismacron odot odotaccent odotaccentmacron odotbelow \ +odoublegrave oeligature offset offsetbox ograve \ +ohm ohook ohorn ohornacute ohorndotbelow \ +ohorngrave ohornhook ohorntilde ohungarumlaut oiiint \ +oiint oint ointclockwise ointctrclockwise oinvertedbreve \ +omacron omega omicron ominus onedigitrounding \ +oneeighth onefifth onehalf onequarter onesixth \ +onesuperior onethird oogonek oogonekmacron operatorlanguage \ +operatortext oplus ordfeminine ordinaldaynumber ordinalstr \ +ordmasculine ornamenttext oslash ostroke ostrokeacute \ +otilde otildemacron otimes outputfilename outputstreambox \ +outputstreamcopy outputstreamunvbox outputstreamunvcopy over overbar \ +overbars overbarunderbar overbrace overbraceunderbrace overbracket \ +overbracketunderbracket overlaybutton overlaycolor overlaydepth overlayfigure \ +overlayheight overlaylinecolor overlaylinewidth overlayoffset overlayrollbutton \ +overlaywidth overleftarrow overloaderror overparent overparentunderparent \ +overrightarrow overset overstrike overstrikes owns \ +page pagearea pagebreak pagefigure pagegridspanwidth \ +pageinjection pagenumber pagereference pagestaterealpage paletsize \ +paragraphmark parallel part partial pdfTeX \ pdfactualtext pdfbackendactualtext pdfbackendcurrentresources pdfbackendsetcatalog pdfbackendsetcolorspace \ pdfbackendsetextgstate pdfbackendsetinfo pdfbackendsetname pdfbackendsetpageattribute pdfbackendsetpageresource \ pdfbackendsetpagesattribute pdfbackendsetpattern pdfbackendsetshade pdfcolor pdfeTeX \ -percent percentdimen periods permitcaretescape permitcircumflexescape \ -permitspacesbetweengroups persiandecimals persiannumerals phantom phantombox \ -pickupgroupedcommand placeattachments placebookmarks placebtxrendering placecitation \ -placecombinedlist placecomments placecurrentformulanumber placedbox placefloat \ -placefloatwithsetups placefootnotes placeformula placeframed placeheadnumber \ -placeheadtext placehelp placeinitial placelayer placelayeredtext \ -placelist placelistofpublications placelistofsorts placelistofsynonyms placelocalfootnotes \ -placelocalnotes placement placenamedfloat placenamedformula placenotes \ -placeongrid placeontopofeachother placepagenumber placepairedbox placeparallel \ -placerawlist placeregister placerenderingwindow placesidebyside placesubformula \ +percent percentdimen periodcentered periods permitcaretescape \ +permitcircumflexescape permitspacesbetweengroups perp persiandecimals persiandecimalseparator \ +persiannumerals persianthousandsseparator perthousand phantom phantombox \ +phi phook pi pickupgroupedcommand pitchfork \ +placeattachments placebookmarks placebtxrendering placechemical placecitation \ +placecombinedlist placecomments placecontent placecurrentformulanumber placedbox \ +placefigure placefloat placefloatwithsetups placefootnotes placeformula \ +placeframed placegraphic placeheadnumber placeheadtext placehelp \ +placeindex placeinitial placeintermezzo placelayer placelayeredtext \ +placelegend placelist placelistofabbreviations placelistofchemicals placelistoffigures \ +placelistofgraphics placelistofintermezzi placelistoflogos placelistofpublications placelistofsorts \ +placelistofsynonyms placelistoftables placelocalfootnotes placelocalnotes placement \ +placenamedfloat placenamedformula placenotes placeongrid placeontopofeachother \ +placepagenumber placepairedbox placeparallel placerawlist placeregister \ +placerenderingwindow placesidebyside placesubformula placetable pm \ popattribute popmacro popmode popsystemmode position \ -positionoverlay positionregionoverlay postponenotes predefinedfont predefinefont \ -predefinesymbol prefixedpagenumber prependetoks prependgvalue prependtocommalist \ -prependtoks prependtoksonce prependvalue presetdocument presetfieldsymbols \ -pretocommalist prevcounter prevcountervalue preventmode prevrealpage \ -prevrealpagenumber prevsubcountervalue prevsubpage prevsubpagenumber prevuserpage \ -prevuserpagenumber procent processMPbuffer processMPfigurefile processaction \ +positionoverlay positionregionoverlay positivesign postponenotes prec \ +precapprox preccurlyeq preceq preceqq precnapprox \ +precneq precneqq precnsim precsim predefinedfont \ +predefinefont predefinesymbol prefixedpagenumber prefixlanguage prefixtext \ +prependetoks prependgvalue prependtocommalist prependtoks prependtoksonce \ +prependvalue presetbtxlabeltext presetdocument presetfieldsymbols presetheadtext \ +presetlabeltext presetmathlabeltext presetoperatortext presetprefixtext presetsuffixtext \ +presettaglabeltext presetunittext pretocommalist prettyprintbuffer prevcounter \ +prevcountervalue preventmode prevrealpage prevrealpagenumber prevsubcountervalue \ +prevsubpage prevsubpagenumber prevuserpage prevuserpagenumber prime \ +primes procent processMPbuffer processMPfigurefile processaction \ processallactionsinset processassignlist processassignmentcommand processassignmentlist processbetween \ processblocks processbodyfontenvironmentlist processcolorcomponents processcommacommand processcommalist \ processcommalistwithparameters processcontent processfile processfilemany processfilenone \ processfileonce processfirstactioninset processisolatedchars processisolatedwords processlinetablebuffer \ processlinetablefile processlist processmonth processranges processseparatedlist \ processtexbuffer processtokens processuntil processxtablebuffer processyear \ -product profiledbox profilegivenbox program project \ -pseudoMixedCapped pseudoSmallCapped pseudoSmallcapped pseudosmallcapped purenumber \ -pushattribute pushbutton pushmacro pushmode pushoutputstream \ -pushsystemmode qquad quad quads quitcommalist \ -quitprevcommalist quittypescriptscanning quotation quote raisebox \ -randomizetext randomnumber rawcounter rawcountervalue rawdate \ -rawdoifelseinset rawdoifinset rawdoifinsetelse rawgetparameters rawprocessaction \ -rawprocesscommacommand rawprocesscommalist rawstructurelistuservariable rawsubcountervalue rbox \ -readfile readfixfile readjobfile readlocfile readsetfile \ -readsysfile readtexfile readxmlfile realSmallCapped realSmallcapped \ -realpagenumber realsmallcapped recursedepth recurselevel recursestring \ -redoconvertfont ref reference referenceprefix referring \ -registerattachment registerctxluafile registerexternalfigure registerfontclass registerhyphenationexception \ +prod product profiledbox profilegivenbox program \ +project propto pseudoMixedCapped pseudoSmallCapped pseudoSmallcapped \ +pseudosmallcapped psi punctuationspace purenumber pushattribute \ +pushbutton pushmacro pushmode pushoutputstream pushsystemmode \ +putboxincache putnextboxincache qquad quad quadrupleprime \ +quads quarterstrut questiondown questionedeq quitcommalist \ +quitprevcommalist quittypescriptscanning quotation quote quotedbl \ +quotedblbase quotedblleft quotedblright quoteleft quoteright \ +quotesingle quotesinglebase rVert racute raggedbottom \ +raggedcenter raggedleft raggedright raggedwidecenter raisebox \ +randomizetext randomnumber rangle rationals rawcounter \ +rawcountervalue rawdate rawdoifelseinset rawdoifinset rawdoifinsetelse \ +rawgetparameters rawprocessaction rawprocesscommacommand rawprocesscommalist rawstructurelistuservariable \ +rawsubcountervalue rbox rbrace rbracket rcaron \ +rceil rcommaaccent rdoublegrave readfile readfixfile \ +readjobfile readlocfile readsetfile readsysfile readtexfile \ +readxmlfile realSmallCapped realSmallcapped realpagenumber reals \ +realsmallcapped recursedepth recurselevel recursestring redoconvertfont \ +ref reference referenceprefix referring registerattachment \ +registerctxluafile registered registerexternalfigure registerfontclass registerhyphenationexception \ registerhyphenationpattern registermenubuttons registersort registersynonym registerunit \ -regular relatemarking relateparameterhandlers relaxvalueifundefined remainingcharacters \ -remark removebottomthings removedepth removefromcommalist removelastskip \ -removelastspace removemarkedcontent removepunctuation removesubstring removetoks \ -removeunwantedspaces replacefeature replaceincommalist replaceword rescan \ -rescanwithsetup resetMPdrawing resetMPenvironment resetMPinstance resetallattributes \ -resetandaddfeature resetbar resetbreakpoints resetbuffer resetcharacteralign \ -resetcharacterkerning resetcharacterspacing resetcharacterstripping resetcollector resetcounter \ -resetdigitsmanipulation resetdirection resetfeature resetflag resetfontcolorsheme \ -resetfontfallback resetfontsolution resethyphenationfeatures resetinjector resetinteractionmenu \ -resetitaliccorrection resetlayer resetlocalfloats resetmarker resetmarking \ -resetmode resetpagenumber resetparallel resetpath resetpenalties \ -resetprofile resetreference resetreplacement resetscript resetsetups \ -resetshownsynonyms resetsubpagenumber resetsymbolset resetsystemmode resettimer \ -resettrackers resettrialtypesetting resetusedsortings resetusedsynonyms resetuserpagenumber \ -resetvalue resetvisualizers reshapebox resolvedglyphdirect resolvedglyphstyled \ -restartcounter restorebox restorecatcodes restorecounter restorecurrentattributes \ -restoreendofline restoreglobalbodyfont reusableMPgraphic reuseMPgraphic reuserandomseed \ -revivefeature rfence rhbox right rightbottombox \ -rightbox righthbox rightorleftpageaction rightskipadaption rightsubguillemot \ -righttolefthbox righttoleftvbox righttoleftvtop righttopbox rlap \ -robustaddtocommalist robustdoifelseinset robustdoifinsetelse robustpretocommalist rollbutton \ -roman romannumerals rotate rtop ruledhbox \ -ruledhpack ruledmbox ruledtopv ruledtpack ruledvbox \ -ruledvpack ruledvtop runMPbuffer runninghbox safechar \ -sans sansbold sansnormal sansserif savebox \ -savebtxdataset savebuffer savecounter savecurrentattributes savenormalmeaning \ -savetaggedtwopassdata savetwopassdata sbox scale screen \ -sd secondoffivearguments secondoffourarguments secondofsixarguments secondofthreearguments \ -secondofthreeunexpanded secondoftwoarguments secondoftwounexpanded section select \ -selectblocks serializecommalist serializedcommalist serif serifbold \ -serifnormal setJSpreamble setMPlayer setMPpositiongraphic setMPpositiongraphicrange \ -setMPtext setMPvariable setMPvariables setbar setbigbodyfont \ -setboxllx setboxlly setbreakpoints setcapstrut setcatcodetable \ -setcharacteralign setcharactercasing setcharactercleaning setcharacterkerning setcharacterspacing \ -setcharacterstripping setcharstrut setcollector setcolormodell setcounter \ -setcounterown setcurrentfontclass setdataset setdefaultpenalties setdigitsmanipulation \ -setdirection setdocumentargument setdocumentargumentdefault setdocumentfilename setdummyparameter \ -setelementexporttag setemeasure setevalue setevariable setevariables \ -setfirstline setflag setfont setfontcolorsheme setfontfeature \ -setfontsolution setfontstrut setfractions setgmeasure setgvalue \ -setgvariable setgvariables sethboxregister sethyphenatedurlafter sethyphenatedurlbefore \ -sethyphenatedurlnormal sethyphenationfeatures setinitial setinjector setinteraction \ -setinterfacecommand setinterfaceconstant setinterfaceelements setinterfacemessage setinterfacevariable \ -setinternalrendering setitaliccorrection setlayer setlayerframed setlayertext \ -setlinefiller setlocalhsize setmainbodyfont setmainparbuilder setmarker \ -setmarking setmathstyle setmeasure setmessagetext setmode \ -setnostrut setnote setnotetext setobject setoldstyle \ -setpagegrid setpagereference setpagestate setpagestaterealpageno setpenalties \ -setpercentdimen setposition setpositionbox setpositiondata setpositiondataplus \ -setpositiononly setpositionplus setpositionstrut setprofile setrandomseed \ -setreference setreferencedobject setregisterentry setreplacement setrigidcolumnbalance \ -setrigidcolumnhsize setscript setsectionblock setsimplecolumnhsize setsmallbodyfont \ -setsmallcaps setstackbox setstructurepageregister setstrut setsuperiors \ -setsystemmode settabular settaggedmetadata settextcontent settightobject \ -settightreferencedobject settightunreferencedobject settrialtypesetting setuevalue setugvalue \ -setunreferencedobject setup setupMPgraphics setupMPinstance setupMPpage \ -setupMPvariables setupTABLE setupTEXpage setuparranging setupattachment \ -setupbackend setupbackground setupbackgrounds setupbar setupblackrules \ -setupblank setupbleeding setupblock setupbodyfont setupbookmark \ -setupbottom setupbottomtexts setupbtx setupbtxdataset setupbtxlist \ -setupbtxregister setupbtxrendering setupbuffer setupbutton setupcapitals \ -setupcaption setupcharacterkerning setupcharacterspacing setupchemical setupchemicalframed \ -setupclipping setupcollector setupcolor setupcolors setupcolumns \ -setupcolumnspan setupcombination setupcombinedlist setupcomment setupcounter \ -setupdataset setupdelimitedtext setupdescription setupdirections setupdocument \ -setupeffect setupenumeration setupenv setupexport setupexternalfigure \ +regular relatemarking relateparameterhandlers relaxvalueifundefined relbar \ +remainingcharacters remark removebottomthings removedepth removefromcommalist \ +removelastskip removelastspace removemarkedcontent removepunctuation removesubstring \ +removetoks removeunwantedspaces replacefeature replaceincommalist replaceword \ +rescan rescanwithsetup resetMPdrawing resetMPenvironment resetMPinstance \ +resetallattributes resetandaddfeature resetbar resetboxesincache resetbreakpoints \ +resetbuffer resetcharacteralign resetcharacterkerning resetcharacterspacing resetcharacterstripping \ +resetcollector resetcounter resetdigitsmanipulation resetdirection resetfeature \ +resetflag resetfontcolorsheme resetfontfallback resetfontsolution resethyphenationfeatures \ +resetinjector resetinteractionmenu resetitaliccorrection resetlayer resetlocalfloats \ +resetmarker resetmarking resetmode resetpagenumber resetparallel \ +resetpath resetpenalties resetprofile resetrecurselevel resetreference \ +resetreplacement resetscript resetsetups resetshownsynonyms resetsubpagenumber \ +resetsymbolset resetsystemmode resettimer resettrackers resettrialtypesetting \ +resetusedsortings resetusedsynonyms resetuserpagenumber resetvalue resetvisualizers \ +reshapebox resolvedglyphdirect resolvedglyphstyled restartcounter restorebox \ +restorecatcodes restorecounter restorecurrentattributes restoreendofline restoreglobalbodyfont \ +restriction reusableMPgraphic reuseMPgraphic reuserandomseed reverseddoubleprime \ +reversedprime reversedtripleprime revivefeature rfence rfloor \ +rgroup rhbox rho rhooknearrow rhookswarrow \ +right rightaligned rightangle rightarrow rightarrowbar \ +rightarrowtail rightarrowtriangle rightbottombox rightbox rightdasharrow \ +rightguillemot rightharpoondown rightharpoonup righthbox rightheadtext \ +rightlabeltext rightleftarrows rightleftharpoons rightline rightmathlabeltext \ +rightorleftpageaction rightrightarrows rightskipadaption rightsquigarrow rightsubguillemot \ +rightthreearrows rightthreetimes righttoleft righttolefthbox righttoleftvbox \ +righttoleftvtop righttopbox rightwavearrow rightwhitearrow ring \ +rinterval rinvertedbreve risingdotseq rlap rlointerval \ +rmoustache rneq robustaddtocommalist robustdoifelseinset robustdoifinsetelse \ +robustpretocommalist rointerval rollbutton roman romanC \ +romanD romanI romanII romanIII romanIV \ +romanIX romanL romanM romanV romanVI \ +romanVII romanVIII romanX romanXI romanXII \ +romanc romand romani romanii romaniii \ +romaniv romanix romanl romanm romannumerals \ +romanv romanvi romanvii romanviii romanx \ +romanxi romanxii rootradical rotate rparent \ +rrangle rrbracket rrointerval rtimes rtop \ +ruledhbox ruledhpack ruledmbox ruledtopv ruledtpack \ +ruledvbox ruledvpack ruledvtop runMPbuffer runninghbox \ +rvert sacute safechar samplefile sans \ +sansbold sansnormal sansserif savebox savebtxdataset \ +savebuffer savecounter savecurrentattributes savenormalmeaning savetaggedtwopassdata \ +savetwopassdata sbox scale scaron scedilla \ +schwa schwahook scircumflex scommaaccent screen \ +searrow secondoffivearguments secondoffourarguments secondofsixarguments secondofthreearguments \ +secondofthreeunexpanded secondoftwoarguments secondoftwounexpanded section sectionmark \ +seeindex select selectblocks serializecommalist serializedcommalist \ +serif serifbold serifnormal setJSpreamble setMPlayer \ +setMPpositiongraphic setMPpositiongraphicrange setMPtext setMPvariable setMPvariables \ +setbar setbigbodyfont setboxllx setboxlly setbreakpoints \ +setcapstrut setcatcodetable setcharacteralign setcharactercasing setcharactercleaning \ +setcharacterkerning setcharacterspacing setcharacterstripping setcharstrut setcollector \ +setcolormodell setcounter setcounterown setcurrentfontclass setdataset \ +setdefaultpenalties setdigitsmanipulation setdirection setdocumentargument setdocumentargumentdefault \ +setdocumentfilename setdummyparameter setelementexporttag setemeasure setevalue \ +setevariable setevariables setfirstline setflag setfont \ +setfontcolorsheme setfontfeature setfontsolution setfontstrut setgmeasure \ +setgvalue setgvariable setgvariables sethboxregister sethyphenatedurlafter \ +sethyphenatedurlbefore sethyphenatedurlnormal sethyphenationfeatures setinitial setinjector \ +setinteraction setinterfacecommand setinterfaceconstant setinterfaceelement setinterfacemessage \ +setinterfacevariable setinternalrendering setitaliccorrection setlayer setlayerframed \ +setlayertext setlinefiller setlocalhsize setmainbodyfont setmainparbuilder \ +setmarker setmarking setmathstyle setmeasure setmessagetext \ +setminus setmode setnostrut setnote setnotetext \ +setobject setoldstyle setpagegrid setpagereference setpagestate \ +setpagestaterealpageno setpenalties setpercentdimen setposition setpositionbox \ +setpositiondata setpositiondataplus setpositiononly setpositionplus setpositionstrut \ +setprofile setrandomseed setreference setreferencedobject setregisterentry \ +setreplacement setrigidcolumnbalance setrigidcolumnhsize setscript setsectionblock \ +setsimplecolumnhsize setsmallbodyfont setsmallcaps setstackbox setstructurepageregister \ +setstrut setsuperiors setsystemmode settabular settaggedmetadata \ +settextcontent settightobject settightreferencedobject settightunreferencedobject settrialtypesetting \ +setuevalue setugvalue setunreferencedobject setup setupMPgraphics \ +setupMPinstance setupMPpage setupMPvariables setupTABLE setupTEXpage \ +setupalign setupalternativestyles setuparranging setupattachment setupattachments \ +setupbackend setupbackground setupbackgrounds setupbar setupbars \ +setupblackrules setupblank setupbleeding setupblock setupbodyfont \ +setupbookmark setupbottom setupbottomtexts setupbtx setupbtxdataset \ +setupbtxlabeltext setupbtxlist setupbtxregister setupbtxrendering setupbuffer \ +setupbutton setupcapitals setupcaption setupcaptions setupcharacterkerning \ +setupcharacterspacing setupchemical setupchemicalframed setupclipping setupcollector \ +setupcolor setupcolors setupcolumns setupcolumnspan setupcombination \ +setupcombinedlist setupcomment setupcontent setupcounter setupdataset \ +setupdelimitedtext setupdescription setupdirections setupdocument setupeffect \ +setupenumeration setupenumerations setupenv setupexport setupexternalfigure \ setupexternalsoundtracks setupfield setupfieldbody setupfieldcategory setupfieldcontentframed \ setupfieldlabelframed setupfields setupfieldtotalframed setupfiller setupfillinlines \ setupfillinrules setupfirstline setupfittingpage setupfloat setupfloatcaption \ -setupfloatsplitting setupfontexpansion setupfontprotrusion setupfonts setupfontsolution \ -setupfooter setupfootertexts setupforms setupformula setupformulaframed \ -setupframed setupframedcontent setupframedtext setupglobalreferenceprefix setuphead \ -setupheadalternative setupheader setupheadertexts setupheadnumber setupheads \ -setuphelp setuphigh setuphighlight setuphyphenation setuphyphenmark \ -setupindentedtext setupindenting setupinitial setupinsertion setupinteraction \ -setupinteractionbar setupinteractionmenu setupinteractionscreen setupinterlinespace setupitaliccorrection \ -setupitemgroup setupitemizations setupitems setuplabel setuplanguage \ -setuplayer setuplayeredtext setuplayout setuplayouttext setuplinefiller \ -setuplinefillers setuplinenote setuplinenumbering setuplines setuplinetable \ -setuplinewidth setuplist setuplistalternative setuplistextra setuplocalfloats \ -setuplocalinterlinespace setuplow setuplowhigh setuplowmidhigh setupmakeup \ -setupmarginblock setupmargindata setupmarginframed setupmarginrule setupmarginrules \ -setupmarking setupmathalignment setupmathcases setupmathematics setupmathfence \ -setupmathfraction setupmathframed setupmathmatrix setupmathornament setupmathradical \ -setupmathstackers setupmathstyle setupmixedcolumns setupmodule setupnarrower \ -setupnotation setupnotations setupnote setupnotes setupoffset \ -setupoffsetbox setupoppositeplacing setupoutputroutine setuppagechecker setuppagecomment \ -setuppagegrid setuppagegridarea setuppagegridareatext setuppagegridlines setuppagegridspan \ -setuppagegridstart setuppageinjection setuppageinjectionalternative setuppagenumber setuppagenumbering \ -setuppageshift setuppagestate setuppagetransitions setuppairedbox setuppalet \ -setuppaper setuppapersize setupparagraph setupparagraphintro setupparagraphnumbering \ -setupparagraphs setupparallel setupperiods setupplacement setuppositionbar \ -setuppositioning setupprocessor setupprofile setupprograms setupquotation \ +setupfloats setupfloatsplitting setupfontexpansion setupfontprotrusion setupfonts \ +setupfontsolution setupfooter setupfootertexts setupforms setupformula \ +setupformulae setupformulaframed setupframed setupframedcontent setupframedtable \ +setupframedtablecolumn setupframedtablerow setupframedtext setupframedtexts setupglobalreferenceprefix \ +setuphead setupheadalternative setupheader setupheadertexts setupheadnumber \ +setupheads setupheadtext setuphelp setuphigh setuphighlight \ +setuphyphenation setuphyphenmark setupindentedtext setupindenting setupindex \ +setupinitial setupinsertion setupinteraction setupinteractionbar setupinteractionmenu \ +setupinteractionscreen setupinterlinespace setupitaliccorrection setupitemgroup setupitemizations \ +setupitemize setupitems setuplabel setuplabeltext setuplanguage \ +setuplayer setuplayeredtext setuplayout setuplayouttext setuplegend \ +setuplinefiller setuplinefillers setuplinenote setuplinenumbering setuplines \ +setuplinetable setuplinewidth setuplist setuplistalternative setuplistextra \ +setuplocalfloats setuplocalinterlinespace setuplow setuplowhigh setuplowmidhigh \ +setupmakeup setupmarginblock setupmargindata setupmarginframed setupmarginrule \ +setupmarginrules setupmarking setupmathalignment setupmathcases setupmathematics \ +setupmathfence setupmathfraction setupmathfractions setupmathframed setupmathlabeltext \ +setupmathmatrix setupmathornament setupmathradical setupmathstackers setupmathstyle \ +setupmixedcolumns setupmodule setupnarrower setupnotation setupnotations \ +setupnote setupnotes setupoffset setupoffsetbox setupoperatortext \ +setupoppositeplacing setupoutputroutine setuppagechecker setuppagecomment setuppagegrid \ +setuppagegridarea setuppagegridareatext setuppagegridlines setuppagegridspan setuppagegridstart \ +setuppageinjection setuppageinjectionalternative setuppagenumber setuppagenumbering setuppageshift \ +setuppagestate setuppagetransitions setuppairedbox setuppalet setuppaper \ +setuppapersize setupparagraph setupparagraphintro setupparagraphnumbering setupparagraphs \ +setupparallel setupperiods setupplacement setuppositionbar setuppositioning \ +setupprefixtext setupprocessor setupprofile setupprograms setupquotation \ setupquote setuprealpagenumber setupreferenceformat setupreferenceprefix setupreferencestructureprefix \ setupreferencing setupregister setupregisters setuprenderingwindow setuprotate \ setups setupscale setupscript setupscripts setupsectionblock \ setupselector setupshift setupsidebar setupsorting setupspacing \ setupspellchecking setupstartstop setupstretched setupstruts setupstyle \ -setupsubformula setupsubpagenumber setupsymbolset setupsynonyms setuptables \ -setuptabulate setuptabulation setuptagging setuptext setuptextbackground \ -setuptextflow setuptextrules setuptexttexts setupthinrules setuptolerance \ -setuptooltip setuptop setuptoptexts setuptype setuptyping \ -setupunit setupurl setupuserpagenumber setupversion setupviewerlayer \ +setupsubformula setupsubformulas setupsubpagenumber setupsuffixtext setupsymbolset \ +setupsynctex setupsynonyms setuptables setuptabulate setuptabulation \ +setuptagging setuptaglabeltext setuptext setuptextbackground setuptextflow \ +setuptextrules setuptexttexts setupthinrules setuptolerance setuptooltip \ +setuptop setuptoptexts setuptype setuptyping setupunit \ +setupunittext setupurl setupuserpagenumber setupversion setupviewerlayer \ setupvspacing setupwhitespace setupwithargument setupwithargumentswapped setupxml \ setupxtable setuvalue setuxvalue setvalue setvariable \ setvariables setvboxregister setvisualizerfont setvtopregister setwidthof \ -setxmeasure setxvalue setxvariable setxvariables sfrac \ -shapedhbox showallmakeup showattributes showbodyfont showbodyfontenvironment \ -showboxes showbtxdatasetauthors showbtxdatasetcompleteness showbtxdatasetfields showbtxfields \ -showbtxhashedauthors showbtxtables showchardata showcharratio showcolor \ -showcolorbar showcolorcomponents showcolorgroup showcolorset showcolorstruts \ -showcounter showdirectives showdirsinmargin showedebuginfo showexperiments \ -showfont showfontdata showfontkerns showfontparameters showfontstrip \ +setxmeasure setxvalue setxvariable setxvariables seveneighths \ +sfrac shapedhbox sharp shiftdown shiftup \ +showallmakeup showattributes showbodyfont showbodyfontenvironment showboxes \ +showbtxdatasetauthors showbtxdatasetcompleteness showbtxdatasetfields showbtxfields showbtxhashedauthors \ +showbtxtables showchardata showcharratio showcolor showcolorbar \ +showcolorcomponents showcolorgroup showcolorset showcolorstruts showcounter \ +showdirectives showdirsinmargin showedebuginfo showexperiments showfont \ +showfontdata showfontitalics showfontkerns showfontparameters showfontstrip \ showfontstyle showframe showglyphs showgrid showgridsnapping \ showhelp showhyphenationtrace showhyphens showinjector showjustification \ showkerning showlayout showlayoutcomponents showligature showligatures \ @@ -2127,188 +925,241 @@ showlogcategories showmakeup showmargins showmessage showminimalbaseline \ shownextbox showotfcomposition showpalet showparentchain showprint \ showsetups showsetupsdefinition showstruts showsymbolset showtimer \ showtokens showtrackers showvalue showvariable showwarning \ -simplegroupedcommand singalcharacteralign singlebond sixthofsixarguments slanted \ -slantedbold slicepages slovenianNumerals sloveniannumerals small \ -smallbodyfont smallbold smallbolditalic smallboldslanted smallcappedcharacters \ -smallcappedromannumerals smaller smallitalicbold smallnormal smallskip \ -smallslanted smallslantedbold smalltype smash smashbox \ -smashboxed smashedhbox smashedvbox snaptogrid someheadnumber \ -somekindoftab someline somelocalfloat somenamedheadnumber someplace \ -somewhere sp space spanishNumerals spanishnumerals \ -speech splitatasterisk splitatcolon splitatcolons splitatcomma \ -splitdfrac splitfilename splitfloat splitfrac splitoffbase \ -splitofffull splitoffkind splitoffname splitoffpath splitoffroot \ -splitofftokens splitofftype splitstring spreadhbox sqrt \ -stackrel startJScode startJSpreamble startMPclip startMPcode \ -startMPdefinitions startMPdrawing startMPenvironment startMPextensions startMPinclusions \ -startMPinitializations startMPpage startMPpositiongraphic startMPpositionmethod startMPrun \ -startTABLE startTABLEbody startTABLEfoot startTABLEhead startTABLEnext \ -startTC startTD startTDs startTEXpage startTH \ +sigma sim simeq simplealignedbox simplealignedboxplus \ +simplealignedspreadbox simplegroupedcommand simplereversealignedbox simplereversealignedboxplus singalcharacteralign \ +singlebond singleverticalbar sixperemspace sixthofsixarguments slanted \ +slantedbold slantedface slash slicepages slong \ +slovenianNumerals sloveniannumerals small smallbodyfont smallbold \ +smallbolditalic smallboldslanted smallcappedcharacters smallcappedromannumerals smaller \ +smallitalicbold smallnormal smallskip smallslanted smallslantedbold \ +smalltype smash smashbox smashboxed smashedhbox \ +smashedvbox smile snaptogrid softhyphen solidus \ +someheadnumber somekindoftab someline somelocalfloat somenamedheadnumber \ +someplace somewhere space spadesuit spanishNumerals \ +spanishnumerals speech sphericalangle splitatasterisk splitatcolon \ +splitatcolons splitatcomma splitatperiod splitdfrac splitfilename \ +splitfloat splitfrac splitoffbase splitofffull splitoffkind \ +splitoffname splitoffpath splitoffroot splitofftokens splitofftype \ +splitstring spreadhbox sqcap sqcup sqrt \ +sqsubset sqsubseteq sqsubsetneq sqsupset sqsupseteq \ +sqsupsetneq square squaredots ssharp stackrel \ +star stareq startJScode startJSpreamble startLUA \ +startMP startMPclip startMPcode startMPdefinitions startMPdrawing \ +startMPenvironment startMPextensions startMPinclusions startMPinitializations startMPpage \ +startMPpositiongraphic startMPpositionmethod startMPrun startPARSEDXML startTABLE \ +startTABLEbody startTABLEfoot startTABLEhead startTABLEnext startTC \ +startTD startTDs startTEX startTEXpage startTH \ startTN startTR startTRs startTX startTY \ -startallmodes startarrangedpages startaside startattachment startbackground \ -startbar startbinom startbitmapimage startblockquote startbtxrenderingdefinitions \ -startbuffer startbutton startcatcodetable startchapter startcharacteralign \ -startcheckedfences startchemical startcollect startcollecting startcolor \ -startcolorintent startcoloronly startcolorset startcolumns startcolumnspan \ -startcombination startcomment startcomponent startcontextcode startcontextdefinitioncode \ -startctxfunction startctxfunctiondefinition startcurrentcolor startcurrentlistentrywrapper startdbinom \ -startdelimited startdelimitedtext startdfrac startdisplaymath startdmath \ -startdocument starteffect startelement startembeddedxtable startendofline \ +startXML startalign startalignment startallmodes startappendices \ +startarrangedpages startaside startattachment startbackground startbackmatter \ +startbar startbbordermatrix startbitmapimage startblockquote startbodymatter \ +startbordermatrix startboxedcolumns startbtxlabeltext startbtxrenderingdefinitions startbuffer \ +startcases startcatcodetable startcenteraligned startchapter startcharacteralign \ +startcheckedfences startchemical startchemicaltext startcollect startcollecting \ +startcolor startcolorintent startcoloronly startcolorset startcolumns \ +startcolumnspan startcombination startcomment startcomponent startcontextcode \ +startcontextdefinitioncode startctxfunction startctxfunctiondefinition startcurrentcolor startcurrentlistentrywrapper \ +startdelimited startdelimitedtext startdisplaymath startdmath startdocument \ +starteffect startelement startembeddedxtable startendnote startendofline \ startenvironment startexceptions startexpanded startexpandedcollect startextendedcatcodetable \ -startexternalfigurecollection startfigure startfitfieldframed startfittingpage startfloatcombination \ -startfont startfontclass startfontsolution startformula startformulas \ -startfrac startframed startframedcontent startframedtext startgoto \ -startgraphic startgridsnapping starthbox starthboxestohbox starthboxregister \ -starthead starthelptext starthiddenbar starthiding starthighlight \ -starthyphenation startimath startindentation startindentedtext startinmframed \ -startinteraction startinteractionmenu startinterface startintermezzo startintertext \ -startitem startitemgroup startitemize startknockout startlayout \ -startline startlinecorrection startlinefiller startlinenumbering startlinetable \ -startlinetablebody startlinetablecell startlinetablehead startlocalfootnotes startlocalheadsetup \ -startlocallinecorrection startlocalnotes startlocalsetups startlua startluacode \ -startluaparameterset startluasetups startmakeup startmarginblock startmarginrule \ -startmarkedcontent startmathmode startmathstyle startmatrices startmcframed \ -startmdformula startmframed startmixedcolumns startmode startmodeset \ +startexternalfigurecollection startfact startfigure startfiguretext startfittingpage \ +startfixed startfloatcombination startfont startfontclass startfontsolution \ +startfootnote startformula startformulas startframed startframedcell \ +startframedcontent startframedrow startframedtable startframedtext startfrontmatter \ +startgoto startgraphictext startgridsnapping starthanging starthbox \ +starthboxestohbox starthboxregister starthead startheadtext starthelptext \ +starthiding starthighlight starthyphenation startimath startindentation \ +startindentedtext startinteraction startinteractionmenu startinterface startintermezzotext \ +startintertext startitem startitemgroup startitemgroupcolumns startitemize \ +startknockout startlabeltext startlayout startleftaligned startlegend \ +startline startlinealignment startlinecorrection startlinefiller startlinenote \ +startlinenumbering startlines startlinetable startlinetablebody startlinetablecell \ +startlinetablehead startlocalfootnotes startlocalheadsetup startlocallinecorrection startlocalnotes \ +startlocalsetups startlua startluacode startluaparameterset startluasetups \ +startmakeup startmarginblock startmarginrule startmarkedcontent startmathalignment \ +startmathcases startmathlabeltext startmathmatrix startmathmode startmathstyle \ +startmatrices startmatrix startmaxaligned startmdformula startmidaligned \ +startmiddlealigned startmiddlemakeup startmixedcolumns startmode startmodeset \ startmodule startmoduletestsection startmpformula startnamedsection startnamedsubformulas \ -startnarrow startnarrower startnegative startnicelyfilledbox startnobar \ -startnointerference startnotallmodes startnotext startnotmode startopposite \ -startoutputstream startoverbar startoverbars startoverlay startoverprint \ -startoverstrike startoverstrikes startpacked startpagecomment startpagefigure \ -startpagegrid startpagegridspan startpagelayout startpar startparagraph \ -startparagraphs startparagraphscell startparbuilder startpath startplaceformula \ -startplacepairedbox startpositioning startpositionoverlay startpositive startpostponing \ -startprocessassignmentcommand startprocessassignmentlist startprocesscommacommand startprocesscommalist startproduct \ -startproject startprotect startprotectedcolors startpublication startpunctuation \ -startquotation startquote startrandomized startrandomseed startrawsetups \ -startreadingfile startreferenceprefix startregime startregister startreusableMPgraphic \ -startscript startsdformula startsection startsectionblock startsectionblockenvironment \ -startsectionlevel startsetups startsfrac startshapebox startshift \ -startsidebar startsimplecolumns startspecialitem startspeech startspformula \ -startspread startstartstop startstaticMPfigure startstaticMPgraphic startstrictinspectnextcharacter \ -startstructurepageregister startstrut startstyle startsubformulas startsubject \ -startsubjectlevel startsubsection startsubsentence startsubstack startsubsubject \ -startsubsubsection startsubsubsubject startsubsubsubsection startsubsubsubsubject startsubsubsubsubsection \ -startsubsubsubsubsubject startsymbolset starttable starttablehead starttables \ -starttabletail starttabulate starttabulatehead starttabulatetail starttagged \ -starttbinom starttexcode starttexdefinition starttext starttextbackground \ -starttextbackgroundmanual starttextcolor starttextcolorintent starttextflow starttextrule \ -starttitle starttokens starttransparent starttypescript starttypescriptcollection \ -startunderbar startunderbars startunderdash startunderdashes startunderdot \ -startunderdots startunderrandom startunderrandoms startunderstrike startunderstrikes \ -startunframed startuniqueMPgraphic startuniqueMPpagegraphic startunpacked startusableMPgraphic \ -startuseMPgraphic startusemathstyleparameter startusingbtxspecification startvbox startvboxregister \ -startvboxtohbox startvboxtohboxseparator startviewerlayer startvtop startvtopregister \ -startxcell startxcellgroup startxfrac startxgroup startxmldisplayverbatim \ -startxmlinlineverbatim startxmlraw startxmlsetups startxrow startxrowgroup \ -startxtable startxtablebody startxtablefoot startxtablehead startxtablenext \ -startxxfrac stopJScode stopJSpreamble stopMPclip stopMPcode \ -stopMPdefinitions stopMPdrawing stopMPenvironment stopMPextensions stopMPinclusions \ -stopMPinitializations stopMPpage stopMPpositiongraphic stopMPpositionmethod stopMPrun \ -stopTABLE stopTABLEbody stopTABLEfoot stopTABLEhead stopTABLEnext \ -stopTC stopTD stopTDs stopTEXpage stopTH \ +startnarrow startnarrower startnegative startnicelyfilledbox startnointerference \ +startnotallmodes startnotext startnotmode startoperatortext startopposite \ +startoutputstream startoverlay startoverprint startpacked startpagecomment \ +startpagefigure startpagegrid startpagegridspan startpagelayout startpagemakeup \ +startpar startparagraph startparagraphs startparagraphscell startparbuilder \ +startpart startpath startplacechemical startplacefigure startplacefloat \ +startplaceformula startplacegraphic startplaceintermezzo startplacelegend startplacepairedbox \ +startplacetable startpositioning startpositionoverlay startpositive startpostponing \ +startprefixtext startprocessassignmentcommand startprocessassignmentlist startprocesscommacommand startprocesscommalist \ +startproduct startproject startprotect startprotectedcolors startpublication \ +startpunctuation startquotation startquote startrandomized startrandomseed \ +startrawsetups startreadingfile startreferenceprefix startregime startregister \ +startreusableMPgraphic startrightaligned startscript startsdformula startsection \ +startsectionblock startsectionblockenvironment startsectionlevel startsetups startshapebox \ +startshift startsidebar startsimplecolumns startspecialitem startspeech \ +startspformula startsplitformula startspread startstandardmakeup startstartstop \ +startstaticMPfigure startstaticMPgraphic startstrictinspectnextcharacter startstructurepageregister startstrut \ +startstyle startsubformulas startsubject startsubjectlevel startsubsection \ +startsubsentence startsubstack startsubsubject startsubsubsection startsubsubsubject \ +startsubsubsubsection startsubsubsubsubject startsubsubsubsubsection startsubsubsubsubsubject startsuffixtext \ +startsymbolset starttable starttablehead starttables starttabletail \ +starttabletext starttabulate starttabulatehead starttabulatetail starttagged \ +starttaglabeltext starttexcode starttexdefinition starttext starttextbackground \ +starttextbackgroundmanual starttextcolor starttextcolorintent starttextflow starttextmakeup \ +starttextrule starttitle starttokens starttransparent starttypescript \ +starttypescriptcollection starttyping startuniqueMPgraphic startuniqueMPpagegraphic startunittext \ +startunpacked startusableMPgraphic startuseMPgraphic startusemathstyleparameter startusingbtxspecification \ +startvbox startvboxregister startvboxtohbox startvboxtohboxseparator startviewerlayer \ +startvtop startvtopregister startxcell startxcellgroup startxgroup \ +startxmldisplayverbatim startxmlinlineverbatim startxmlraw startxmlsetups startxrow \ +startxrowgroup startxtable startxtablebody startxtablefoot startxtablehead \ +startxtablenext stligature stopJScode stopJSpreamble stopLUA \ +stopMP stopMPclip stopMPcode stopMPdefinitions stopMPdrawing \ +stopMPenvironment stopMPextensions stopMPinclusions stopMPinitializations stopMPpage \ +stopMPpositiongraphic stopMPpositionmethod stopMPrun stopPARSEDXML stopTABLE \ +stopTABLEbody stopTABLEfoot stopTABLEhead stopTABLEnext stopTC \ +stopTD stopTDs stopTEX stopTEXpage stopTH \ stopTN stopTR stopTRs stopTX stopTY \ -stopallmodes stoparrangedpages stopaside stopattachment stopbackground \ -stopbar stopbinom stopbitmapimage stopblockquote stopbtxrenderingdefinitions \ -stopbuffer stopbutton stopcatcodetable stopchapter stopcharacteralign \ -stopcheckedfences stopchemical stopcollect stopcollecting stopcolor \ -stopcolorintent stopcoloronly stopcolorset stopcolumns stopcolumnspan \ -stopcombination stopcomment stopcomponent stopcontextcode stopcontextdefinitioncode \ -stopctxfunction stopctxfunctiondefinition stopcurrentcolor stopcurrentlistentrywrapper stopdbinom \ -stopdelimited stopdelimitedtext stopdfrac stopdisplaymath stopdmath \ -stopdocument stopeffect stopelement stopembeddedxtable stopendofline \ +stopXML stopalign stopalignment stopallmodes stopappendices \ +stoparrangedpages stopaside stopattachment stopbackground stopbackmatter \ +stopbar stopbbordermatrix stopbitmapimage stopblockquote stopbodymatter \ +stopbordermatrix stopboxedcolumns stopbtxlabeltext stopbtxrenderingdefinitions stopbuffer \ +stopcases stopcatcodetable stopcenteraligned stopchapter stopcharacteralign \ +stopcheckedfences stopchemical stopchemicaltext stopcollect stopcollecting \ +stopcolor stopcolorintent stopcoloronly stopcolorset stopcolumns \ +stopcolumnspan stopcombination stopcomment stopcomponent stopcontextcode \ +stopcontextdefinitioncode stopctxfunction stopctxfunctiondefinition stopcurrentcolor stopcurrentlistentrywrapper \ +stopdelimited stopdelimitedtext stopdisplaymath stopdmath stopdocument \ +stopeffect stopelement stopembeddedxtable stopendnote stopendofline \ stopenvironment stopexceptions stopexpanded stopexpandedcollect stopextendedcatcodetable \ -stopexternalfigurecollection stopfigure stopfitfieldframed stopfittingpage stopfloatcombination \ -stopfont stopfontclass stopfontsolution stopformula stopformulas \ -stopfrac stopframed stopframedcontent stopframedtext stopgoto \ -stopgraphic stopgridsnapping stophbox stophboxestohbox stophboxregister \ -stophead stophelptext stophiddenbar stophiding stophighlight \ -stophyphenation stopimath stopindentation stopindentedtext stopinmframed \ -stopinteraction stopinteractionmenu stopinterface stopintermezzo stopintertext \ -stopitem stopitemgroup stopitemize stopknockout stoplayout \ -stopline stoplinecorrection stoplinefiller stoplinenumbering stoplinetable \ -stoplinetablebody stoplinetablecell stoplinetablehead stoplocalfootnotes stoplocalheadsetup \ -stoplocallinecorrection stoplocalnotes stoplocalsetups stoplua stopluacode \ -stopluaparameterset stopluasetups stopmakeup stopmarginblock stopmarginrule \ -stopmarkedcontent stopmathmode stopmathstyle stopmatrices stopmcframed \ -stopmdformula stopmframed stopmixedcolumns stopmode stopmodeset \ +stopexternalfigurecollection stopfact stopfigure stopfiguretext stopfittingpage \ +stopfixed stopfloatcombination stopfont stopfontclass stopfontsolution \ +stopfootnote stopformula stopformulas stopframed stopframedcell \ +stopframedcontent stopframedrow stopframedtable stopframedtext stopfrontmatter \ +stopgoto stopgraphictext stopgridsnapping stophanging stophbox \ +stophboxestohbox stophboxregister stophead stopheadtext stophelptext \ +stophiding stophighlight stophyphenation stopimath stopindentation \ +stopindentedtext stopinteraction stopinteractionmenu stopinterface stopintermezzotext \ +stopintertext stopitem stopitemgroup stopitemgroupcolumns stopitemize \ +stopknockout stoplabeltext stoplayout stopleftaligned stoplegend \ +stopline stoplinealignment stoplinecorrection stoplinefiller stoplinenote \ +stoplinenumbering stoplines stoplinetable stoplinetablebody stoplinetablecell \ +stoplinetablehead stoplocalfootnotes stoplocalheadsetup stoplocallinecorrection stoplocalnotes \ +stoplocalsetups stoplua stopluacode stopluaparameterset stopluasetups \ +stopmakeup stopmarginblock stopmarginrule stopmarkedcontent stopmathalignment \ +stopmathcases stopmathlabeltext stopmathmatrix stopmathmode stopmathstyle \ +stopmatrices stopmatrix stopmaxaligned stopmdformula stopmidaligned \ +stopmiddlealigned stopmiddlemakeup stopmixedcolumns stopmode stopmodeset \ stopmodule stopmoduletestsection stopmpformula stopnamedsection stopnamedsubformulas \ -stopnarrow stopnarrower stopnegative stopnicelyfilledbox stopnobar \ -stopnointerference stopnotallmodes stopnotext stopnotmode stopopposite \ -stopoutputstream stopoverbar stopoverbars stopoverlay stopoverprint \ -stopoverstrike stopoverstrikes stoppacked stoppagecomment stoppagefigure \ -stoppagegrid stoppagegridspan stoppagelayout stoppar stopparagraph \ -stopparagraphs stopparagraphscell stopparbuilder stoppath stopplaceformula \ -stopplacepairedbox stoppositioning stoppositionoverlay stoppositive stoppostponing \ -stopprocessassignmentcommand stopprocessassignmentlist stopprocesscommacommand stopprocesscommalist stopproduct \ -stopproject stopprotect stopprotectedcolors stoppublication stoppunctuation \ -stopquotation stopquote stoprandomized stoprandomseed stoprawsetups \ -stopreadingfile stopreferenceprefix stopregime stopregister stopreusableMPgraphic \ -stopscript stopsdformula stopsection stopsectionblock stopsectionblockenvironment \ -stopsectionlevel stopsetups stopsfrac stopshapebox stopshift \ -stopsidebar stopsimplecolumns stopspecialitem stopspeech stopspformula \ -stopspread stopstartstop stopstaticMPfigure stopstaticMPgraphic stopstrictinspectnextcharacter \ -stopstructurepageregister stopstrut stopstyle stopsubformulas stopsubject \ -stopsubjectlevel stopsubsection stopsubsentence stopsubstack stopsubsubject \ -stopsubsubsection stopsubsubsubject stopsubsubsubsection stopsubsubsubsubject stopsubsubsubsubsection \ -stopsubsubsubsubsubject stopsymbolset stoptable stoptablehead stoptables \ -stoptabletail stoptabulate stoptabulatehead stoptabulatetail stoptagged \ -stoptbinom stoptexcode stoptexdefinition stoptext stoptextbackground \ -stoptextbackgroundmanual stoptextcolor stoptextcolorintent stoptextflow stoptextrule \ -stoptitle stoptokens stoptransparent stoptypescript stoptypescriptcollection \ -stopunderbar stopunderbars stopunderdash stopunderdashes stopunderdot \ -stopunderdots stopunderrandom stopunderrandoms stopunderstrike stopunderstrikes \ -stopunframed stopuniqueMPgraphic stopuniqueMPpagegraphic stopunpacked stopusableMPgraphic \ -stopuseMPgraphic stopusemathstyleparameter stopusingbtxspecification stopvbox stopvboxregister \ -stopvboxtohbox stopvboxtohboxseparator stopviewerlayer stopvtop stopvtopregister \ -stopxcell stopxcellgroup stopxfrac stopxgroup stopxmldisplayverbatim \ -stopxmlinlineverbatim stopxmlraw stopxmlsetups stopxrow stopxrowgroup \ -stopxtable stopxtablebody stopxtablefoot stopxtablehead stopxtablenext \ -stopxxfrac stretched strictdoifelsenextoptional strictdoifnextoptionalelse stripcharacter \ +stopnarrow stopnarrower stopnegative stopnicelyfilledbox stopnointerference \ +stopnotallmodes stopnotext stopnotmode stopoperatortext stopopposite \ +stopoutputstream stopoverlay stopoverprint stoppacked stoppagecomment \ +stoppagefigure stoppagegrid stoppagegridspan stoppagelayout stoppagemakeup \ +stoppar stopparagraph stopparagraphs stopparagraphscell stopparbuilder \ +stoppart stoppath stopplacechemical stopplacefigure stopplacefloat \ +stopplaceformula stopplacegraphic stopplaceintermezzo stopplacelegend stopplacepairedbox \ +stopplacetable stoppositioning stoppositionoverlay stoppositive stoppostponing \ +stopprefixtext stopprocessassignmentcommand stopprocessassignmentlist stopprocesscommacommand stopprocesscommalist \ +stopproduct stopproject stopprotect stopprotectedcolors stoppublication \ +stoppunctuation stopquotation stopquote stoprandomized stoprandomseed \ +stoprawsetups stopreadingfile stopreferenceprefix stopregime stopregister \ +stopreusableMPgraphic stoprightaligned stopscript stopsdformula stopsection \ +stopsectionblock stopsectionblockenvironment stopsectionlevel stopsetups stopshapebox \ +stopshift stopsidebar stopsimplecolumns stopspecialitem stopspeech \ +stopspformula stopsplitformula stopspread stopstandardmakeup stopstartstop \ +stopstaticMPfigure stopstaticMPgraphic stopstrictinspectnextcharacter stopstructurepageregister stopstrut \ +stopstyle stopsubformulas stopsubject stopsubjectlevel stopsubsection \ +stopsubsentence stopsubstack stopsubsubject stopsubsubsection stopsubsubsubject \ +stopsubsubsubsection stopsubsubsubsubject stopsubsubsubsubsection stopsubsubsubsubsubject stopsuffixtext \ +stopsymbolset stoptable stoptablehead stoptables stoptabletail \ +stoptabletext stoptabulate stoptabulatehead stoptabulatetail stoptagged \ +stoptaglabeltext stoptexcode stoptexdefinition stoptext stoptextbackground \ +stoptextbackgroundmanual stoptextcolor stoptextcolorintent stoptextflow stoptextmakeup \ +stoptextrule stoptitle stoptokens stoptransparent stoptypescript \ +stoptypescriptcollection stoptyping stopuniqueMPgraphic stopuniqueMPpagegraphic stopunittext \ +stopunpacked stopusableMPgraphic stopuseMPgraphic stopusemathstyleparameter stopusingbtxspecification \ +stopvbox stopvboxregister stopvboxtohbox stopvboxtohboxseparator stopviewerlayer \ +stopvtop stopvtopregister stopxcell stopxcellgroup stopxgroup \ +stopxmldisplayverbatim stopxmlinlineverbatim stopxmlraw stopxmlsetups stopxrow \ +stopxrowgroup stopxtable stopxtablebody stopxtablefoot stopxtablehead \ +stopxtablenext stretched strictdoifelsenextoptional strictdoifnextoptionalelse stripcharacter \ strippedcsname stripspaces structurelistuservariable structurenumber structuretitle \ -structureuservariable structurevariable strut strutdp strutht \ -struthtdp struttedbox strutwd style styleinstance \ -subject subpagenumber subsection subsentence substituteincommalist \ -subsubject subsubsection subsubsubject subsubsubsection subsubsubsubject \ -subsubsubsubsection subsubsubsubsubject subtractfeature swapcounts swapdimens \ -swapface swapmacros swaptypeface switchstyleonly switchtobodyfont \ -switchtocolor switchtointerlinespace symbol symbolreference synchronizeblank \ -synchronizeindenting synchronizemarking synchronizeoutputstreams synchronizestrut synchronizewhitespace \ +structureuservariable structurevariable strut strutdp strutgap \ +strutht struthtdp struttedbox strutwd style \ +styleinstance subject subpagenumber subsection subsentence \ +subset subseteq subseteqq subsetneq subsetneqq \ +substituteincommalist subsubject subsubsection subsubsubject subsubsubsection \ +subsubsubsubject subsubsubsubsection subsubsubsubsubject subtractfeature succ \ +succapprox succcurlyeq succeq succeqq succnapprox \ +succneq succneqq succnsim succsim suffixlanguage \ +suffixtext sum supset supseteq supseteqq \ +supsetneq supsetneqq surd surdradical swapcounts \ +swapdimens swapface swapmacros swaptypeface swarrow \ +switchstyleonly switchtobodyfont switchtocolor switchtointerlinespace symbol \ +symbolreference synchronizeblank synchronizeindenting synchronizemarking synchronizeoutputstreams \ +synchronizestrut synchronizewhitespace synctexblockfilename synctexresetfilename synctexsetfilename \ systemlog systemlogfirst systemloglast systemsetups tLeftarrow \ -tLeftrightarrow tRightarrow table tabulateautoline tabulateautorule \ -tabulateline tabulaterule taggedctxcommand taggedlabeltexts tbinom \ -tbox tequal testandsplitstring testcolumn testfeature \ -testfeatureonce testpage testpageonly testpagesync testtokens \ -tex texdefinition texsetup textcitation textcite \ -textcontrolspace textflowcollector textmath textminus textormathchar \ -textplus textreference textrule textvisiblespace tfrac \ -thainumerals thefirstcharacter thenormalizedbodyfontsize theremainingcharacters thickspace \ -thinrule thinrules thinspace thirdoffivearguments thirdoffourarguments \ -thirdofsixarguments thirdofthreearguments thirdofthreeunexpanded thookleftarrow thookrightarrow \ -threedigitrounding tibetannumerals tightlayer tinyfont title \ -tlap tleftarrow tleftharpoondown tleftharpoonup tleftrightarrow \ -tleftrightharpoons tmapsto tochar tolinenote topbox \ -topleftbox toplinebox toprightbox topskippedbox tracecatcodetables \ -tracedfontname traceoutputroutines tracepositions translate transparencycomponents \ -transparent trel trightarrow trightharpoondown trightharpoonup \ -trightleftharpoons trightoverleftarrow triplebond truefilename truefontname \ -ttriplerel ttwoheadleftarrow ttwoheadrightarrow twodigitrounding tx \ -txx typ type typebuffer typedefinedbuffer \ -typeface typefile typescriptone typescriptprefix typescriptthree \ -typescripttwo typesetbuffer typesetfile uconvertnumber uedcatcodecommand \ -undefinevalue undepthed underbar underbars underbartext \ -underbrace underbracetext underbracket underbrackettext underdash \ -underdashes underdot underdots underleftarrow underleftharpoondown \ -underleftharpoonup underleftrightarrow underparent underparenttext underrandom \ -underrandoms underrightarrow underrightharpoondown underrightharpoonup underset \ -understrike understrikes undertwoheadleftarrow undertwoheadrightarrow undoassign \ -unframed unhhbox unihex uniqueMPgraphic uniqueMPpagegraphic \ -unknown unprotected unregisterhyphenationpattern unspaceafter unspaceargument \ -unspaced unspacestring untexargument untexcommand uppercased \ -uppercasestring upperleftdoubleninequote upperleftdoublesixquote upperleftsingleninequote upperleftsinglesixquote \ -upperrightdoubleninequote upperrightdoublesixquote upperrightsingleninequote upperrightsinglesixquote url \ -useJSscripts useMPenvironmentbuffer useMPgraphic useMPlibrary useMPrun \ -useMPvariables useURL useblankparameter useblocks usebodyfont \ -usebodyfontparameter usebtxdataset usebtxdefinitions usecolors usecomponent \ +tLeftrightarrow tRightarrow tabulateautoline tabulateautorule tabulateline \ +tabulaterule taggedctxcommand taggedlabeltexts taglabellanguage taglabeltext \ +tau tbinom tbox tcaron tcedilla \ +tcommaaccent tcurl tequal test testandsplitstring \ +testcolumn testfeature testfeatureonce testpage testpageonly \ +testpagesync testtokens tex texdefinition texsetup \ +textAngstrom textacute textampersand textasciicircum textasciitilde \ +textat textbackslash textbar textbottomcomma textbottomdot \ +textbraceleft textbraceright textbreve textbrokenbar textbullet \ +textcaron textcedilla textcelsius textcent textcircledP \ +textcircumflex textcitation textcite textcomma textcontrolspace \ +textcurrency textdag textddag textdegree textdiaeresis \ +textdiv textdollar textdong textdotaccent textellipsis \ +texteuro textflowcollector textfraction textgrave texthash \ +texthorizontalbar texthungarumlaut texthyphen textkelvin textlognot \ +textmacron textmath textmho textminus textmu \ +textmultiply textnumero textogonek textohm textormathchar \ +textounce textpercent textperiod textplus textpm \ +textreference textring textrule textslash textsterling \ +texttilde textunderscore textvisiblespace textyen thai \ +thainumerals thefirstcharacter thenormalizedbodyfontsize therefore theremainingcharacters \ +theta thickspace thinrule thinrules thinspace \ +thirdoffivearguments thirdoffourarguments thirdofsixarguments thirdofthreearguments thirdofthreeunexpanded \ +thook thookleftarrow thookrightarrow thorn threedigitrounding \ +threeeighths threefifths threeperemspace threequarter threesuperior \ +tibetannumerals tightlayer tilde times tinyfont \ +title tlap tleftarrow tleftharpoondown tleftharpoonup \ +tleftrightarrow tleftrightharpoons tmapsto to tochar \ +tolinenote tooltip top topbox topleftbox \ +toplinebox toprightbox topskippedbox tracecatcodetables tracedfontname \ +traceoutputroutines tracepositions trademark translate transparencycomponents \ +transparent trel triangle triangledown triangleleft \ +triangleq triangleright trightarrow trightharpoondown trightharpoonup \ +trightleftharpoons trightoverleftarrow triplebond tripleprime tripleverticalbar \ +truefilename truefontname tstroke ttraggedright ttriplerel \ +ttwoheadleftarrow ttwoheadrightarrow turnediota twodigitrounding twofifths \ +twoheaddownarrow twoheadleftarrow twoheadrightarrow twoheadrightarrowtail twoheaduparrow \ +twosuperior twothirds tx txx typ \ +type typebuffer typedefinedbuffer typeface typefile \ +typeinlinebuffer typescriptone typescriptprefix typescriptthree typescripttwo \ +typesetbuffer typesetfile uacute ubreve ucaron \ +ucircumflex uconvertnumber udiaeresis udiaeresisacute udiaeresiscaron \ +udiaeresisgrave udiaeresismacron udotbelow udots udoublegrave \ +uedcatcodecommand ugrave uhook uhorn uhornacute \ +uhorndotbelow uhorngrave uhornhook uhorntilde uhungarumlaut \ +uinvertedbreve ulcorner umacron undefinevalue undepthed \ +underbar underbars underbrace underbracket underdash \ +underdashes underdot underdots underleftarrow underparent \ +underrandom underrandoms underrightarrow underset understrike \ +understrikes undoassign unexpandeddocumentvariable unframed unhhbox \ +unihex uniqueMPgraphic uniqueMPpagegraphic unit unitlanguage \ +unitshigh unitslow unittext unknown unprotected \ +unregisterhyphenationpattern unspaceafter unspaceargument unspaced unspacestring \ +untexargument untexcommand uogonek upand uparrow \ +updasharrow updownarrow updownarrowbar updownarrows upharpoonleft \ +upharpoonright uplus uppercased uppercasestring upperleftdoubleninequote \ +upperleftdoublesixquote upperleftsingleninequote upperleftsinglesixquote upperrightdoubleninequote upperrightdoublesixquote \ +upperrightsingleninequote upperrightsinglesixquote upsilon upuparrows upwhitearrow \ +urcorner uring url useJSscripts useMPenvironmentbuffer \ +useMPgraphic useMPlibrary useMPrun useMPvariables useURL \ +usealignparameter useblankparameter useblocks usebodyfont usebodyfontparameter \ +usebtxdataset usebtxdefinitions usecitation usecolors usecomponent \ usedirectory usedummycolorparameter usedummystyleandcolor usedummystyleparameter useenvironment \ useexternaldocument useexternalfigure useexternalrendering useexternalsoundtrack usefigurebase \ usefile usegridparameter useindentingparameter useindentnextparameter useinterlinespaceparameter \ @@ -2316,553 +1167,315 @@ uselanguageparameter useluamodule usemathstyleparameter usemodule useproduct \ useprofileparameter useproject usereferenceparameter userpagenumber usesetupsparameter \ usestaticMPfigure usesubpath usesymbols usetexmodule usetypescript \ usetypescriptfile useurl usezipfile utfchar utflower \ -utfupper utilityregisterlength vboxreference verbatim verbatimstring \ -verbosenumber version verticalgrowingbar verticalpositionbar vglue \ -viewerlayer vl vphantom vpos vsmash \ -vsmashbox vsmashed vspace vspacing wdofstring \ -weekday widthofstring widthspanningtext withoutpt word \ -words wordtonumber writebetweenlist writedatatolist writestatus \ +utfupper utilde utilityregisterlength vDash varTheta \ +varepsilon varkappa varnothing varphi varpi \ +varrho varsigma vartheta vboxreference vdash \ +vdots vec vee veebar veeeq \ +verbatim verbatimstring verbosenumber version vert \ +verticalgrowingbar verticalpositionbar veryraggedcenter veryraggedleft veryraggedright \ +vglue viewerlayer vl vphantom vpos \ +vsmash vsmashbox vsmashed vspace vspacing \ +wcircumflex wdofstring wedge wedgeeq weekday \ +whitearrowupfrombar widehat widetilde widthofstring widthspanningtext \ +withoutpt word wordright words wordtonumber \ +wp wr writebetweenlist writedatatolist writestatus \ writetolist xLeftarrow xLeftrightarrow xRightarrow xdefconvertedargument \ -xequal xfrac xhookleftarrow xhookrightarrow xleftarrow \ -xleftharpoondown xleftharpoonup xleftrightarrow xleftrightharpoons xmapsto \ -xmladdindex xmlafterdocumentsetup xmlaftersetup xmlall xmlappenddocumentsetup \ -xmlappendsetup xmlapplyselectors xmlatt xmlattdef xmlattribute \ -xmlattributedef xmlbadinclusions xmlbeforedocumentsetup xmlbeforesetup xmlchainatt \ -xmlchainattdef xmlchecknamespace xmlcommand xmlconcat xmlconcatrange \ -xmlcontext xmlcount xmldefaulttotext xmldirectives xmldirectivesafter \ -xmldirectivesbefore xmldisplayverbatim xmldoif xmldoifelse xmldoifelseempty \ -xmldoifelseselfempty xmldoifelsetext xmldoifelsevalue xmldoifnot xmldoifnotselfempty \ -xmldoifnottext xmldoifselfempty xmldoiftext xmlelement xmlfilter \ -xmlfirst xmlflush xmlflushcontext xmlflushdocumentsetups xmlflushlinewise \ -xmlflushpure xmlflushspacewise xmlflushtext xmlinclude xmlinclusion \ -xmlinclusions xmlinfo xmlinjector xmlinlineverbatim xmlinstalldirective \ -xmllast xmllastatt xmllastmatch xmlloadbuffer xmlloaddata \ -xmlloaddirectives xmlloadfile xmlloadonly xmlmain xmlmapvalue \ -xmlname xmlnamespace xmlnonspace xmlpath xmlpos \ -xmlposition xmlprependdocumentsetup xmlprependsetup xmlprettyprint xmlprocessbuffer \ -xmlprocessdata xmlprocessfile xmlpure xmlraw xmlrefatt \ -xmlregistereddocumentsetups xmlregisteredsetups xmlregisterns xmlremapname xmlremapnamespace \ -xmlremovedocumentsetup xmlremovesetup xmlresetdocumentsetups xmlresetinjectors xmlresetsetups \ -xmlsave xmlsetentity xmlsetfunction xmlsetinjectors xmlsetsetup \ -xmlsetup xmlshow xmlsnippet xmlstrip xmlstripnolines \ -xmlstripped xmlstrippednolines xmltag xmltexentity xmltext \ -xmltobuffer xmltobufferverbose xmltofile xmlvalue xmlverbatim \ -xrel xrightarrow xrightharpoondown xrightharpoonup xrightleftharpoons \ -xrightoverleftarrow xsplitstring xtriplerel xtwoheadleftarrow xtwoheadrightarrow \ -xxfrac xypos +xequal xfrac xhookleftarrow xhookrightarrow xi \ +xleftarrow xleftharpoondown xleftharpoonup xleftrightarrow xleftrightharpoons \ +xmapsto xmladdindex xmlafterdocumentsetup xmlaftersetup xmlall \ +xmlappenddocumentsetup xmlappendsetup xmlapplyselectors xmlatt xmlattdef \ +xmlattribute xmlattributedef xmlbadinclusions xmlbeforedocumentsetup xmlbeforesetup \ +xmlchainatt xmlchainattdef xmlchecknamespace xmlcommand xmlconcat \ +xmlconcatrange xmlcontext xmlcount xmldefaulttotext xmldirectives \ +xmldirectivesafter xmldirectivesbefore xmldisplayverbatim xmldoif xmldoifelse \ +xmldoifelseempty xmldoifelseselfempty xmldoifelsetext xmldoifelsevalue xmldoifnot \ +xmldoifnotselfempty xmldoifnottext xmldoifselfempty xmldoiftext xmlelement \ +xmlfilter xmlfirst xmlflush xmlflushcontext xmlflushdocumentsetups \ +xmlflushlinewise xmlflushpure xmlflushspacewise xmlflushtext xmlinclude \ +xmlinclusion xmlinclusions xmlinfo xmlinjector xmlinlineprettyprint \ +xmlinlineprettyprinttext xmlinlineverbatim xmlinstalldirective xmllast xmllastatt \ +xmllastmatch xmllastpar xmlloadbuffer xmlloaddata xmlloaddirectives \ +xmlloadfile xmlloadonly xmlmain xmlmapvalue xmlname \ +xmlnamespace xmlnonspace xmlpar xmlparam xmlpath \ +xmlpos xmlposition xmlprependdocumentsetup xmlprependsetup xmlprettyprint \ +xmlprettyprinttext xmlprocessbuffer xmlprocessdata xmlprocessfile xmlpure \ +xmlraw xmlrefatt xmlregistereddocumentsetups xmlregisteredsetups xmlregisterns \ +xmlremapname xmlremapnamespace xmlremovedocumentsetup xmlremovesetup xmlresetdocumentsetups \ +xmlresetinjectors xmlresetsetups xmlsave xmlsetatt xmlsetattribute \ +xmlsetentity xmlsetfunction xmlsetinjectors xmlsetpar xmlsetparam \ +xmlsetsetup xmlsetup xmlshow xmlsnippet xmlstrip \ +xmlstripnolines xmlstripped xmlstrippednolines xmltag xmltexentity \ +xmltext xmltobuffer xmltobufferverbose xmltofile xmlvalue \ +xmlverbatim xrel xrightarrow xrightharpoondown xrightharpoonup \ +xrightleftharpoons xrightoverleftarrow xsplitstring xtriplerel xtwoheadleftarrow \ +xtwoheadrightarrow xxfrac xypos yacute ycircumflex \ +ydiaeresis ydotbelow yen ygrave yhook \ +ymacron ytilde zacute zcaron zdotaccent \ +zerowidthnobreakspace zerowidthspace zeta zhook zstroke \ +zwj zwnj + +keywordclass.context.cs=\ +Cisla Kap MESIC Rimskecislice \ +SLOVA SLOVO Slova Slovo VSEDNIDEN \ +Znak Znaky aktualnicislonadpisu aktualnidatum barevnalista \ +barva cernalinka cernelinky cisla cislonadpisu \ +cislorovnice cislostrany datum definuj definujakcent \ +definujbarvu definujblok definujbloksekce definujbuffer definujfont \ +definujformatodkazu definujhbox definujinterakcnimenu definujkombinovanyseznam definujkonverzi \ +definujnadpis definujobrazeksymbol definujodkaz definujodstavce definujopis \ +definujoramovani definujoramovanytext definujpaletu definujplvouciobjekt definujpodpole \ +definujpole definujpopis definujpopisek definujprekryv definujprikaz \ +definujprofil definujprogram definujprostredizakladnihofontu definujrejstrik definujsablonutabulky \ +definujsekci definujseznam definujskupinubarev definujstartstop definujstyl \ +definujstylfontu definujsymbol definujsynonumumfontu definujsynonyma definujtabelaci \ +definujtext definujtrideni definujupravu definujvelikostpapiru definujvycet \ +definujzakladnifont definujzasobnikpoli definujznaceni definujznak delkaseznamu \ +externiobraz hlavnijazyk hodnotabarvy instalacejazyka interakcnilista \ +interakcnitlacitka interaktivnimenu jazyk jdidolu jdina \ +jdinabox jdinastranu klonujpole komponenta konvertujcislo \ +kopirujpole korekcebilehomista matematika meritko mesic \ +mezera mrizka nastavbarvu nastavbarvy nastavbilamista \ +nastavblok nastavbloksekce nastavbuffer nastavcernelinky nastavcislonadpisu \ +nastavcislostrany nastavcislovaniodstavcu nastavcislovaniradku nastavcislovanistran nastavcitaci \ +nastavdeleniplvoucichobjektu nastavdelitko nastavdolnitexty nastavhorejsek nastavhornitexty \ +nastavinterakci nastavinterakcnilistu nastavinterakcnimenu nastavinterakcniobrazovku nastavjazyk \ +nastavkapitalky nastavkombinovanyseznam nastavkomentar nastavkomentarstrany nastavmarginalnilinky \ +nastavmeziradkovoumezeru nastavnadpis nastavnadpisy nastavodkazovani nastavodsazovani \ +nastavodstavce nastavopis nastavoramovanetexty nastavoramovani nastavorez \ +nastavotoceni nastavpaletu nastavplvouciobjekt nastavplvouciobjekty nastavpodcislostrany \ +nastavpole nastavpolozky nastavpopisek nastavpopisky nastavpozadi \ +nastavprechodstrany nastavpreskok nastavprogramy nastavradkovani nastavradky \ +nastavrejstrik nastavrovnice nastavsadusymbolu nastavseznam nastavsirkucary \ +nastavsloupce nastavspodek nastavsynonyma nastavtabelaci nastavtabulky \ +nastavtenkelinky nastavtext nastavtextovelinky nastavtexttexty nastavtextyupati \ +nastavtextyzahlavi nastavtoleranci nastavtrideni nastavtype nastavumisteniprotejsku \ +nastavumistovani nastavupati nastavupravu nastavurl nastavusporadani \ +nastavvelikostpapiru nastavvsechnapole nastavvycty nastavvyplnovelinky nastavvyplnoveradky \ +nastavvzhled nastavzahlavi nastavzakladnifont nastavzarovnani nastavznaceni \ +nastavzuzeni nastrane nejakyradek nekde neznamo \ +nivy nizky nokap obrazovka odkaz \ +odkaznastranu odkaznatext odkazujici opis opissoubor \ +oramovani oref orez otocit oznaceni \ +pis plnezneni pole polozka polozky \ +porovnejpaletu porovnejskupinubarev pozadi pozice poznamka \ +pref prelozit prepninazakladnifont preskoc prizpusobivepole \ +prizpusobvzhled produkt projekt prostredi resetznaceni \ +rimskecislice rozdelplvouciobjekt roztazene schovejbloky sedabarva \ +sloupec slovovpravo stanovcharakteristickuseznamu stanovcislonadpisu startbarva \ +startinteraktivnimenu startjdina startkomponenta startmarginalnilinka startnadpis \ +startoramovani startpolozka startpozadi startprodukt startprojekt \ +startprostredi startpublikace startradek starttextovalinka startumistirovnici \ +startzarovnanonastred startzarovnanovlevo startzarovnanovpravo startzhustene stopbarva \ +stopinteraktivnimenu stopjdina stopkomponenta stopmarginalnilinka stopnadpis \ +stoporamovani stoppolozka stoppozadi stopprodukt stopprojekt \ +stopprostredi stoppublikace stopradek stoptextovalinka stopumistirovnici \ +stopzarovnanonastred stopzarovnanovlevo stopzarovnanovpravo stopzhustene strana \ +tecky tenkalinka tenkelinky textovalinka tlacitko \ +tlacitkomenu tloustkacary tref tvrdamezera tvrdemezery \ +ukazbarvu ukazmrizku ukaznastaveni ukazpaletu ukazpodpery \ +ukazpostredizakladnihofontu ukazramecek ukazsadusymbolu ukazskupinubarev ukazupravu \ +ukazvytisk ukazvzhled ukazzakladnifont umistikombinovanyseznam umistilokalnipoznamkypodcarou \ +umistinadsebe umistinamrizku umistipodrovnici umistipoznamkypodcarou umistirejstrik \ +umistirovnici umistiseznam umistivedlesebe umistizalozky urcicharakteristikurejstriku \ +uzijJSscripts uzijURL uzijadresar uzijbloky uzijexternidokument \ +uzijexterniobraz uzijexternizvuk uzijmodul uzijsymbol uzijurl \ +verze vlasovalinka vradku vsedniden vyberbloky \ +vyplnenytext vyplnovelinky vyplnovyradek vysoky zachovejbloky \ +zadnamezera zadnehorniadolniradky zadnezahlaviaupati zalozka zapisdoseznamu \ +zapismeziseznam zaramovani zarovnanonastred zarovnanovlevo zarovnanovpravo \ +zasobnikpoli ziskejbuffer ziskejznaceni znaceni znak \ +znaky zpracujbloky zrcadlit zref + +keywordclass.context.de=\ +Buchstabe Buchstaben Kap MONAT \ +Roemischezahlen WOCHENTAG WOERTER WORT Woerter \ +Wort Ziffern amgitterausrichten aufseite ausfuelltext \ +ausschnitt bearbeitebloecke behaltebloecke bei bemerkung \ +benutzeverzeichnis beschriftung bestimmekopfnummer bestimmelistencharakeristika bestimmeregistercharakteristika \ +bildschirm blanko buchstabe buchstaben datum \ +defineschriftsynonym definiereabbsymbol definiereabsaetze definiereabschnitt definiereabschnittsblock \ +definiereakzent definierebefehl definierebeschreibung definierebeschriftung definiereblock \ +definierefarbe definierefarbengruppe definierefeld definierefeldstapel definierefliesstext \ +definierefliesstextumgebung definieregleitobjekt definierehbox definiereinteraktionsmenue definierekonversion \ +definierelabel definiereliste definieren definierenummerierung definiereoverlay \ +definierepalette definierepapierformat definiereprofil definiereprogramme definierepuffer \ +definierereferenz definierereferenzformat definiereregister definiereschrift definiereschriftstil \ +definieresortieren definierestartstop definierestil definieresubfeld definieresymbol \ +definieresynonyme definieretabellenvorlage definieretabulator definieretext definieretippen \ +definiereueberschrift definiereumbruch definiereumrahmt definiereumrahmtertext definierezeichen \ +definierezusammengestellteliste drehen duennelinie duennerumriss einezeile \ +externeabbildung farbbalken farbe farbewert feld \ +feldstapel festesspatium format formelnummer gefuelltesrechteck \ +gefuelltezeile gestreckt gitter graufarbe haarlinie \ +hauptsprache heutigesdatum heutigeskopfnummer hintergrund hoch \ +holebeschriftung holepuffer imumriss installieresprache interaktionsbalken \ +interaktionsknopfe interaktionsmenue inzeile irgendwo keinekopfundfusszeilen \ +keinspatium keinzeilenobenundunten klonierefeld knopf komponente \ +konvertierezahl kopfnummer kopierefeld korrigierezwischenraum liniendicke \ +linksbuendig listenlaenge mathematik menueknopf monat \ +nachunten nokap notiz passelayoutan passendfeld \ +platzierebookmarks platziereformel platzierefussnoten platziereliste platzierelokalefussnoten \ +platzierenebeneinander platziereregister platziereuntereinander platziereunterformel platzierezusammengestellteliste \ +pos posten produkt programm projekt \ +punkt rechteck rechtecke rechtsbuendig referenz \ +referieren roemischezahlen ruecksetztenbeschriftung schreibezurliste schreibezwischenliste \ +seite seitenreferenz seitenummer settext spalte \ +spatium spiegeln sprache startfarbe starthintergrund \ +startinteraktionsmenue startkleinerdurchschuss startkomponente startkopf startlinksbuendig \ +startmarginallinie startplatziereformel startpos startprodukt startprojekt \ +startpublikation startrechtsbuendig starttextlinie startumgebung startumrahmt \ +startzeile startzentriert startzu stelleabsaetzeein stelleabsatznummerierungein \ +stelleabschnittsblockein stelleanordnenein stelleaufzaehlungenein stelleausrichtungein stelleausschnittein \ +stellebeschreibungein stellebeschriftungein stellebilderunterschriftein stellebildunterschriftein stellebindestrichein \ +stelleblankoein stelleblockein stelledrehenein stelleduennerumrissein stelleeinziehenein \ +stelleengerein stellefarbeein stellefarbenein stellefeldein stellefelderin \ +stellefliesstextein stelleformelnein stellefusszeileein stellefusszeilentextein stellegefuelltesrechteckein \ +stellegefuelltezeileein stellegegenueberplatzierenein stellegleitobjekteein stellegleitobjektein stellehintergruendeein \ +stellehintergrundein stelleinteraktionein stelleinteraktionsbalkenein stelleinteraktionsbildschirmein stelleinteraktionsmenueein \ +stellekommentarein stellekopfzahlein stellekopfzeileein stellekopfzeilentextein stellelayoutein \ +stellelinienbreiteein stellelisteein stellemarginallinieein stellenobenein stellepaletteein \ +stellepapierformatein stelleplatziegeteiltegleitobjekt stellepositionierenein stellepostenein stelleprogrammein \ +stellepufferein stellerechteckein stellereferenzierenein stelleregisterein stelleseitenkommentarein \ +stelleseitennummerein stelleseitennummeriernungein stelleseitenuebergangein stellesortierenein stellespaltenein \ +stellespatiumein stellespracheein stellesymbolsetein stellesynonymein stelletabellenein \ +stelletabulatorein stelletextein stelletextobenein stelletexttexteein stelletextumrissein \ +stelletextuntenein stelletipein stelletippenein stelletoleranzein stelleueberschriftein \ +stelleueberschriftenein stelleumbruchein stelleumrahmtein stelleumrahmtetexteein stelleuntenein \ +stelleunterseitennummerein stelleurlein stelleversalienein stellezeilenabstandein stellezeilenein \ +stellezeilennumerierungein stellezitierenein stellezusammengestelltelisteein stellezwischenraumein stopfarbe \ +stophintergrund stopinteraktionsmenue stopkleinerdurchschuss stopkomponente stopkopf \ +stoplinksbuendig stopmarginallinie stopplatziereformel stoppos stopprodukt \ +stopprojekt stoppublikation stoprechtsbuendig stoptextlinie stopumgebung \ +stopumrahmt stopzeile stopzentriert stopzu teilegleitobjekt \ +textlinie textreferenz tief tiho tip \ +tippedatei tippen tippepuffer ueber uebersetzten \ +umgebung umrahmt unbekant verbergebloecke vergleichefarbengruppe \ +vergleichepalette verwendeJSscript verwendeURL verwendebloecke verwendeexteresdokument \ +verwendeexterneabbildung verwendeexternestonstueck verwendemodul verwendesymbole verwendeurl \ +volleswort von waehlebloeckeaus wechselezumfliesstext wochentag \ +wortrechts zeigedruck zeigeeinstellungen zeigefarbe zeigefarbengruppe \ +zeigefliesstext zeigefliesstextumgebung zeigegitter zeigelayout zeigepalette \ +zeigerahmen zeigestruts zeigeumbruch zentriert ziffern \ +zu zurbox zurseite + +keywordclass.context.en=\ + keywordclass.context.fr=\ -AMSTEX AfterPar Alphabeticnumerals AmSTeX \ -And BeforePar Big Bigg Biggl \ -Biggm Biggr Bigl Bigm Bigr \ -CONTEXT Cap Caps Caractere Caracteres \ -Chiffresromains ConTeXt Context ConvertConstantAfter ConvertToConstant \ -ETEX EveryLine EveryPar GetPar GotoPar \ -Greeknumerals INRSTEX JOURSEMAINE LAMSTEX LATEX \ -LUAJITTEX LUATEX LaTeX LamSTeX Lua \ -LuaTeX LuajitTeX METAFONT METAFUN METAPOST \ -MKII MKIV MKIX MKVI MKXI \ -MOIS MONTHLONG MONTHSHORT MOT MOTS \ -MPII MPIV MPVI MPanchor MPbetex \ -MPc MPcode MPcolor MPcoloronly MPcolumn \ -MPd MPdrawing MPfontsizehskip MPgetmultipars MPgetmultishape \ -MPgetposboxes MPh MPinclusions MPleftskip MPll \ -MPlr MPls MPmenubuttons MPn MPoptions \ -MPoverlayanchor MPp MPpage MPpardata MPplus \ -MPpos MPpositiongraphic MPposset MPr MPrawvar \ -MPregion MPrest MPrightskip MPrs MPstring \ -MPtext MPtransparency MPul MPur MPv \ -MPvar MPvariable MPvv MPw MPwhd \ -MPx MPxy MPxywhd MPy MetaFont \ -MetaFun MetaPost Mot Mots NormalizeFontHeight \ -NormalizeFontWidth NormalizeTextHeight NormalizeTextWidth Numeros PDFETEX \ -PDFTEX PDFcolor PICTEX PPCHTEX PPCHTeX \ -PRAGMA PiCTeX PointsToBigPoints PointsToReal PointsToWholeBigPoints \ -PtToCm ReadFile ScaledPointsToBigPoints ScaledPointsToWholeBigPoints Smallcapped \ -TABLE TEX TEXpage TaBlE TeX \ -TheNormalizedFontSize TransparencyHack VerboseNumber WidthSpanningText XETEX \ -XeTeX a abjadnaivenumerals abjadnodotnumerals abjadnumerals \ -activatespacehandler adaptcollector adaptedisposition adaptfontfeature adaptpapersize \ -addfeature addtoJSpreamble addtocommalist addvalue aftersplitstring \ -aftertestandsplitstring ajustechamp alaligne alapage alignmentcharacter \ -allinputpaths alphabeticnumerals alwayscitation alwayscite ampersand \ -anchor appendetoks appendgvalue appendtocommalist appendtoks \ -appendtoksonce appendvalue apply applyalternativestyle applyprocessor \ -applytocharacters applytofirstcharacter applytosplitstringchar applytosplitstringcharspaced applytosplitstringline \ -applytosplitstringlinespaced applytosplitstringword applytosplitstringwordspaced applytowords arabicdecimals \ -arabicexnumerals arabicnumerals arg arriereplan asciistr \ -aside assignalfadimension assigndimen assigndimension assignifempty \ -assigntranslation assignvalue assignwidth assumelongusagecs astype \ -attachment autocap autodirhbox autodirvbox autodirvtop \ -autoinsertnextspace automathematics autosetups availablehsize averagecharwidth \ -backgroundimage backgroundimagefill backgroundline baha barrecouleur \ -barreinteraction bas basegrid baselineleftbox baselinemiddlebox \ -baselinerightbox bbox beforesplitstring beforetestandsplitstring big \ -bigbodyfont bigg bigger biggl biggm \ -biggr bigl bigm bigr bigskip \ -binom bitmapimage blap bleed bleedheight \ -bleedwidth blockligatures blockquote bodyfontenvironmentlist bodyfontsize \ -bold boldface bolditalic boldslanted booleanmodevalue \ -bottombox bottomleftbox bottomrightbox bouton boutonmenu \ -boutonsinteraction boxcursor boxmarker boxofsize boxreference \ -bpos bthiddencitation btxabbreviatedjournal btxaddjournal btxalwayscitation \ -btxauthorfield btxdetail btxdirect btxdoif btxdoifcombiinlistelse \ -btxdoifelse btxdoifelsecombiinlist btxdoifelsesameasprevious btxdoifelsesameaspreviouschecked btxdoifelseuservariable \ -btxdoifnot btxdoifsameaspreviouscheckedelse btxdoifsameaspreviouselse btxdoifuservariableelse btxexpandedjournal \ -btxfield btxfieldname btxfieldtype btxfirstofrange btxflush \ -btxflushauthor btxflushauthorinverted btxflushauthorinvertedshort btxflushauthorname btxflushauthornormal \ -btxflushauthornormalshort btxflushsuffix btxfoundname btxfoundtype btxhybridcite \ -btxlistcitation btxloadjournalist btxoneorrange btxremapauthor btxsavejournalist \ -btxsetup btxsingularorplural btxsingularplural btxtextcitation cache \ -cacheblocs calligraphic camel cap caractere \ -caracteres catcodetablename cbox centerbox centeredbox \ -centerednextbox cfrac champ changepolicecorps chapitre \ -chardescription charwidthlanguage checkcharacteralign checkedchar checkedfiller \ -checkedstrippedcsname checkinjector checknextindentation checknextinjector checkpage \ -checkparameters checkpreviousinjector checksoundtrack checktwopassdata checkvariables \ -chem chemical chemicalbottext chemicalmidtext chemicalsymbol \ -chemicaltext chemicaltoptext chiffresromains chineseallnumerals chinesecapnumerals \ -chinesenumerals citation cite citer clap \ -classfont cldcommand cldcontext cldloadfile cldprocessfile \ -cleftarrow clip clonechamp collect collectedtext \ -collectexpanded colonne colorcomponents colored coloronly \ -columnbreak combinepages commalistelement commalistsentence commalistsize \ -comment commentaire comparedimension comparedimensioneps comparegroupecouleur \ -comparepalette completebtxrendering completelist completelistofpublications completelistofsorts \ -completelistofsynonyms completenumeropage completeregistre complexorsimple complexorsimpleempty \ -composant composedcollector composedlayer compresult concernant \ -constantdimen constantdimenargument constantemptyargument constantnumber constantnumberargument \ -contentreference continuednumber continueifinputfile convertargument convertcommand \ -convertedcounter converteddimen convertedsubcounter convertitnumero convertmonth \ -convertvalue convertvboxtohbox copitchamp copypages copyparameters \ -copyposition corrigeespaceblanc couleur couleurgrise countersubs \ -counttoken counttokens cramped crampedclap crampedllap \ -crampedrlap crightarrow crightoverleftarrow ctop ctxcommand \ -ctxdirectcommand ctxdirectlua ctxfunction ctxlatecommand ctxlatelua \ -ctxloadluafile ctxlua ctxluabuffer ctxluacode ctxreport \ -ctxsprint currentassignmentlistkey currentassignmentlistvalue currentbtxuservariable currentcommalistitem \ -currentcomponent currentenvironment currentfeaturetest currentinterface currentlanguage \ -currentlistentrydestinationattribute currentlistentrylimitedtext currentlistentrynumber currentlistentrypagenumber currentlistentryreferenceattribute \ -currentlistentrytitle currentlistentrytitlerendered currentlistsymbol currentmainlanguage currentmessagetext \ -currentmoduleparameter currentoutputstream currentproduct currentproject currentregime \ -currentregisterpageuserdata currentresponses currenttime currentvalue currentxtablecolumn \ -currentxtablerow dactylographier dans datasetvariable date \ -datecourante dayoftheweek dayspermonth dbinom de \ -decrement decrementcounter decrementedcounter decrementpagenumber decrementsubpagenumber \ -decrementvalue defaultinterface defaultobjectpage defaultobjectreference defcatcodecommand \ -defconvertedargument defconvertedcommand defconvertedvalue defineMPinstance defineTABLEsetup \ -defineactivecharacter definealternativestyle defineanchor defineattachment defineattribute \ -definebackground definebar definebodyfontswitch definebreakpoint definebreakpoints \ -definebtx definebtxdataset definebtxregister definebtxrendering definebutton \ -definecapitals definecharacterkerning definecharacterspacing definechemical definechemicals \ -definechemicalsymbol definecollector definecombination definecomment definecomplexorsimple \ -definecomplexorsimpleempty defineconversionset definecounter definedataset definedelimitedtext \ -definedfont defineeffect defineexpandable defineexternalfigure definefallbackfamily \ -definefieldbody definefieldbodyset definefieldcategory definefileconstant definefilefallback \ -definefilesynonym definefiller definefirstline definefittingpage definefontalternative \ -definefontfallback definefontfamily definefontfamilypreset definefontfeature definefontfile \ -definefontsize definefontsolution defineformula defineformulaalternative defineformulaframed \ -defineframed defineframedcontent defineframedtext definefrozenfont defineglobalcolor \ -definegraphictypesynonym definegridsnapping defineheadalternative definehelp definehigh \ -definehighlight definehspace definehypenationfeatures defineindentedtext defineindenting \ -defineinitial defineinsertion defineinteraction defineinteractionbar defineinterfaceconstant \ -defineinterfaceelement defineinterfacevariable defineinterlinespace defineintermediatecolor defineitemgroup \ -defineitems definelabelclass definelayerpreset definelinefiller definelinenote \ -definelinenumbering definelines definelistalternative definelistextra definelow \ -definelowhigh definelowmidhigh definemarginblock definemargindata definemarker \ -definemathalignment definemathcases definemathcommand definemathdoubleextensible definemathematics \ -definemathextensible definemathfence definemathfraction definemathframed definemathmatrix \ -definemathornament definemathoverextensible definemathovertextextensible definemathradical definemathstackers \ -definemathstyle definemathtriplet definemathunderextensible definemathundertextextensible definemathunstacked \ -definemeasure definemessageconstant definemixedcolumns definemode definemultitonecolor \ -definenamedcolor definenamespace definenarrower definenote defineornament \ -defineoutputroutine defineoutputroutinecommand definepage definepagechecker definepagegrid \ -definepagegridarea definepagegridspan definepageinjection definepageinjectionalternative definepageshift \ -definepagestate definepairedbox defineparagraph defineparallel defineparbuilder \ -defineplacement definepositioning defineprefixset defineprocesscolor defineprocessor \ -definepushbutton definepushsymbol definerenderingwindow defineresetset definescale \ -definescript definesectionlevels defineselector defineseparatorset defineshift \ -definesidebar definesort definespotcolor definestyleinstance definesubformula \ -definesynonym definesystemattribute definesystemconstant definesystemvariable definetabulation \ -definetextbackground definetextflow definetooltip definetransparency definetwopasslist \ -definetypeface definetypescriptprefix definetypescriptsynonym definetypesetting defineunit \ -defineviewerlayer definevspace definevspacing definevspacingamount definextable \ -definit definitbloc definitblocsection definitbuffer definitcalque \ -definitchamp definitconversion definitcouleur definitdactylo definitdemarrestoppe \ -definitdescription definitdisposition definitenumeration definitenvironnementpolicecorps definitetiquette \ -definitflottant definitformatreference definitgroupecouleur definithbox definitliste \ -definitlisteimbriquee definitmakeup definitmarquage definitmenuinteraction definitpalette \ -definitparagraphes definitpilechamp definitpolice definitpolicecorps definitprofil \ -definitprogramme definitreference definitregistre definitrevetement definitsautdecolonne \ -definitsautdepage definitsection definitsouschamp definitstyle definitstylepolice \ -definitsymbole definitsymbolefigure definitsynonymepolice definitsynonymes definittabulation \ -definittaillepapier definittete definittexte definittrametableau definittri \ -definittype definitvide delimited delimitedtext demarreJScode \ -demarreJSpreamble demarreMPclip demarreMPcode demarreMPdefinitions demarreMPdrawing \ -demarreMPenvironment demarreMPextensions demarreMPinclusions demarreMPinitializations demarreMPpage \ -demarreMPpositiongraphic demarreMPpositionmethod demarreMPrun demarreTABLE demarreTABLEbody \ +Caractere Caracteres Chiffresromains JOURSEMAINE \ +MOIS MOT MOTS Mot Mots \ +Numeros a adaptedisposition ajustechamp alaligne \ +alapage aligneadroite aligneagauche aligneaumilieu arriereplan \ +baha barrecouleur barreinteraction bas bouton \ +boutonmenu boutonsinteraction cacheblocs caractere caracteres \ +champ changepolicecorps chiffresromains clonechamp colonne \ +commentaire comparegroupecouleur comparepalette completenumeropage completeregistre \ +composant concernant convertitnumero copitchamp corrigeespaceblanc \ +couleur couleurgrise dactylographier dans datecourante \ +de definicaractere definit definitaccent definitbloc \ +definitblocsection definitbuffer definitcalque definitchamp definitcommande \ +definitconversion definitcouleur definitdactylo definitdemarrestoppe definitdescription \ +definitdisposition definitenumeration definitenvironnementpolicecorps definitetiquette definitflottant \ +definitformatreference definitgroupecouleur definithbox definitliste definitlisteimbriquee \ +definitmakeup definitmarquage definitmenuinteraction definitpalette definitparagraphes \ +definitpilechamp definitpolice definitpolicecorps definitprofil definitprogramme \ +definitreference definitregistre definitrevetement definitsautdecolonne definitsautdepage \ +definitsection definitsouschamp definitstyle definitstylepolice definitsymbole \ +definitsymbolefigure definitsynonymepolice definitsynonymes definittabulation definittaillepapier \ +definittete definittexte definittrametableau definittri definittype \ +definitvide demarreJScode demarreJSpreamble demarreLUA demarreMP \ +demarreMPclip demarreMPcode demarreMPdefinitions demarreMPdrawing demarreMPenvironment \ +demarreMPextensions demarreMPinclusions demarreMPinitializations demarreMPpage demarreMPpositiongraphic \ +demarreMPpositionmethod demarreMPrun demarrePARSEDXML demarreTABLE demarreTABLEbody \ demarreTABLEfoot demarreTABLEhead demarreTABLEnext demarreTC demarreTD \ -demarreTDs demarreTEXpage demarreTH demarreTN demarreTR \ -demarreTRs demarreTX demarreTY demarreallmodes demarrearrangedpages \ -demarrearriereplan demarreaside demarreattachment demarrebar demarrebinom \ -demarrebitmapimage demarreblockquote demarrebtxrenderingdefinitions demarrebuffer demarrebutton \ -demarrecatcodetable demarrechapitre demarrecharacteralign demarrecheckedfences demarrechemical \ -demarrecitation demarreciter demarrecollect demarrecollecting demarrecolorintent \ -demarrecoloronly demarrecolorset demarrecolumns demarrecolumnspan demarrecombination \ -demarrecomment demarrecommentaire demarrecomposant demarrecontextcode demarrecontextdefinitioncode \ -demarrecouleur demarrectxfunction demarrectxfunctiondefinition demarrecurrentcolor demarrecurrentlistentrywrapper \ -demarredbinom demarredelimited demarredelimitedtext demarredfrac demarrediscours \ +demarreTDs demarreTEX demarreTEXpage demarreTH demarreTN \ +demarreTR demarreTRs demarreTX demarreTY demarreXML \ +demarrealign demarrealigneadroite demarrealigneagauche demarrealigneaumilieu demarrealignment \ +demarreallmodes demarreappendices demarrearrangedpages demarrearriereplan demarreaside \ +demarreattachment demarrebackmatter demarrebar demarrebbordermatrix demarrebitmapimage \ +demarreblockquote demarrebodymatter demarrebordermatrix demarreboxedcolumns demarrebtxlabeltext \ +demarrebtxrenderingdefinitions demarrebuffer demarrecases demarrecatcodetable demarrecenteraligned \ +demarrechapter demarrecharacteralign demarrecheckedfences demarrechemical demarrechemicaltext \ +demarreciter demarrecollect demarrecollecting demarrecolorintent demarrecoloronly \ +demarrecolorset demarrecolumns demarrecolumnspan demarrecombination demarrecomment \ +demarrecomposant demarrecontextcode demarrecontextdefinitioncode demarrecouleur demarrectxfunction \ +demarrectxfunctiondefinition demarrecurrentcolor demarrecurrentlistentrywrapper demarredelimited demarredelimitedtext \ demarredisplaymath demarredmath demarredocument demarreeffect demarreelement \ -demarreembeddedxtable demarreendofline demarreenvironement demarreexceptions demarreexpanded \ -demarreexpandedcollect demarreextendedcatcodetable demarreexternalfigurecollection demarrefigure demarrefitfieldframed \ -demarrefittingpage demarrefloatcombination demarrefont demarrefontclass demarrefontsolution \ -demarreformula demarreformulas demarrefrac demarreframed demarreframedcontent \ -demarreframedtext demarregraphique demarregridsnapping demarregroupe demarrehbox \ -demarrehboxestohbox demarrehboxregister demarrehelptext demarrehiddenbar demarrehiding \ -demarrehighlight demarrehyphenation demarreimath demarreindentation demarreindentedtext \ -demarreinmframed demarreinteraction demarreinterface demarreintermezzo demarreintertext \ -demarreitemgroup demarreknockout demarrelayout demarreligne demarreligneregleetexte \ -demarrelinecorrection demarrelinefiller demarrelinenumbering demarrelinetable demarrelinetablebody \ -demarrelinetablecell demarrelinetablehead demarrelister demarrelocalfootnotes demarrelocalheadsetup \ -demarrelocallinecorrection demarrelocalnotes demarrelocalsetups demarrelua demarreluacode \ -demarreluaparameterset demarreluasetups demarremakeup demarremargereglee demarremarginblock \ -demarremarkedcontent demarremathmode demarremathstyle demarrematrices demarremcframed \ -demarremdformula demarremenuinteraction demarremframed demarremixedcolumns demarremode \ -demarremodeset demarremodule demarremoduletestsection demarrempformula demarrenamedsection \ -demarrenamedsubformulas demarrenarrow demarrenarrower demarrenegative demarrenicelyfilledbox \ -demarrenobar demarrenointerference demarrenotallmodes demarrenotext demarrenotmode \ -demarreopposite demarreoutputstream demarreoverbar demarreoverbars demarreoverlay \ -demarreoverprint demarrepagecomment demarrepagefigure demarrepagegrid demarrepagegridspan \ -demarrepagelayout demarrepar demarreparagraph demarreparagraphs demarreparagraphscell \ -demarreparbuilder demarrepath demarreplaceformule demarreplacepairedbox demarrepositioning \ -demarrepositionoverlay demarrepositive demarrepostponing demarreprocessassignmentcommand demarreprocessassignmentlist \ -demarreprocesscommacommand demarreprocesscommalist demarreproduit demarreprojet demarreprotect \ -demarreprotectedcolors demarrepublication demarrepunctuation demarrerandomized demarrerandomseed \ -demarrerawsetups demarrereadingfile demarrereferenceprefix demarreregime demarrereusableMPgraphic \ -demarrescript demarresdformula demarresection demarresectionblock demarresectionblockenvironment \ -demarresectionlevel demarresetups demarresfrac demarreshapebox demarreshift \ -demarresidebar demarresimplecolumns demarresousligne demarresouslignetout demarresoussection \ -demarresoussoussection demarresoussoussoussection demarresoussoussoussoussection demarresoussoussoussoussujet demarresoussoussoussujet \ -demarresoussoussujet demarresoussujet demarrespecialitem demarrespeech demarrespformula \ -demarrespread demarrestartstop demarrestaticMPfigure demarrestaticMPgraphic demarrestrictinspectnextcharacter \ -demarrestrut demarrestyle demarresubformulas demarresubjectlevel demarresubsentence \ -demarresubstack demarresujet demarresurligne demarresurlignetout demarresymbolset \ -demarretable demarretableau demarretablehead demarretables demarretabletail \ -demarretabulate demarretabulatehead demarretabulatetail demarretagged demarretbinom \ -demarretete demarretexcode demarretexdefinition demarretext demarretextbackground \ -demarretextbackgroundmanual demarretextcolor demarretextcolorintent demarretexteaide demarretexteencadre \ -demarretextflow demarretitre demarretokens demarretransparent demarretypescript \ -demarretypescriptcollection demarreunderdash demarreunderdashes demarreunderdot demarreunderdots \ -demarreunderrandom demarreunderrandoms demarreunderstrike demarreunderstrikes demarreunframed \ -demarreuniqueMPgraphic demarreuniqueMPpagegraphic demarreunpacked demarreusableMPgraphic demarreuseMPgraphic \ -demarreusemathstyleparameter demarreusingbtxspecification demarreva demarrevbox demarrevboxregister \ -demarrevboxtohbox demarrevboxtohboxseparator demarreviewerlayer demarrevtop demarrevtopregister \ -demarrexcell demarrexcellgroup demarrexfrac demarrexgroup demarrexmldisplayverbatim \ -demarrexmlinlineverbatim demarrexmlraw demarrexmlsetups demarrexrow demarrexrowgroup \ -demarrextable demarrextablebody demarrextablefoot demarrextablehead demarrextablenext \ -demarrexxfrac depthofstring depthonlybox depthspanningtext determinecaracteristiqueliste \ -determinecaracteristiquesregistre determinenoflines determinenumerotete devanagarinumerals dfrac \ -digits dimensiontocount directcolor directcolored directconvertedcounter \ -directdummyparameter directgetboxllx directgetboxlly directhighlight directlocalframed \ -directluacode directselect directsetbar directsetup directsymbol \ -directvspacing dis disabledirectives disableexperiments disablemode \ -disableoutputstream disableparpositions disableregime disabletrackers discours \ -displaymath displaymathematics displaymessage distributedhsize dividedsize \ -doadaptleftskip doadaptrightskip doaddfeature doassign doassignempty \ -doboundtext docheckassignment docheckedpagestate docheckedpair documentvariable \ -dodoubleargument dodoubleargumentwithset dodoubleempty dodoubleemptywithset dodoublegroupempty \ -doeassign doexpandedrecurse dogetattribute dogetattributeid dogetcommacommandelement \ -dogobbledoubleempty dogobblesingleempty doif doifMPgraphicelse doifallcommon \ -doifallcommonelse doifalldefinedelse doifallmodes doifallmodeselse doifassignmentelse \ -doifblackelse doifbothsides doifbothsidesoverruled doifboxelse doifbufferelse \ -doifcolor doifcolorelse doifcommandhandler doifcommandhandlerelse doifcommon \ -doifcommonelse doifcontent doifconversiondefinedelse doifconversionnumberelse doifcounter \ -doifcounterelse doifcurrentfonthasfeatureelse doifdefined doifdefinedcounter doifdefinedcounterelse \ -doifdefinedelse doifdimensionelse doifdimenstringelse doifdocumentargument doifdocumentargumentelse \ -doifdocumentfilename doifdocumentfilenameelse doifdrawingblackelse doifelse doifelseMPgraphic \ -doifelseallcommon doifelsealldefined doifelseallmodes doifelseassignment doifelseblack \ -doifelsebox doifelsebuffer doifelsecolor doifelsecommandhandler doifelsecommon \ -doifelseconversiondefined doifelseconversionnumber doifelsecounter doifelsecurrentfonthasfeature doifelsecurrentsortingused \ -doifelsecurrentsynonymshown doifelsecurrentsynonymused doifelsedefined doifelsedefinedcounter doifelsedimension \ -doifelsedimenstring doifelsedocumentargument doifelsedocumentfilename doifelsedrawingblack doifelseempty \ -doifelseemptyvalue doifelseemptyvariable doifelseenv doifelsefastoptionalcheck doifelsefastoptionalcheckcs \ -doifelsefieldbody doifelsefieldcategory doifelsefigure doifelsefile doifelsefiledefined \ -doifelsefileexists doifelsefirstchar doifelseflagged doifelsefontchar doifelsefontpresent \ -doifelsefontsynonym doifelsehasspace doifelsehelp doifelseincsname doifelseinelement \ -doifelseinputfile doifelseinsertion doifelseinset doifelseinstring doifelseinsymbolset \ -doifelseintoks doifelseintwopassdata doifelseitalic doifelselanguage doifelselayerdata \ -doifelselayoutdefined doifelselayoutsomeline doifelselayouttextline doifelseleapyear doifelselist \ -doifelselocation doifelselocfile doifelsemainfloatbody doifelsemarking doifelsemeaning \ -doifelsemessage doifelsemode doifelsenextbgroup doifelsenextbgroupcs doifelsenextchar \ -doifelsenextoptional doifelsenextoptionalcs doifelsenextparenthesis doifelsenonzeropositive doifelsenoteonsamepage \ -doifelsenothing doifelsenumber doifelseobjectfound doifelseobjectreferencefound doifelseoddpage \ -doifelseoddpagefloat doifelseoldercontext doifelseolderversion doifelseoverlapping doifelseoverlay \ -doifelseparallel doifelseparentfile doifelsepath doifelsepathexists doifelsepatterns \ -doifelseposition doifelsepositionaction doifelsepositiononpage doifelsepositionsonsamepage doifelsepositionsonthispage \ -doifelsepositionsused doifelsereferencefound doifelserightpagefloat doifelserighttoleftinbox doifelsesamelinereference \ -doifelsesamestring doifelsesetups doifelsesomebackground doifelsesomespace doifelsesomething \ -doifelsesometoks doifelsestringinstring doifelsestructurelisthasnumber doifelsestructurelisthaspage doifelsesymboldefined \ -doifelsesymbolset doifelsetext doifelsetextflow doifelsetextflowcollector doifelsetypingfile \ -doifelseundefined doifelseurldefined doifelsevalue doifelsevaluenothing doifelsevariable \ -doifempty doifemptyelse doifemptytoks doifemptyvalue doifemptyvalueelse \ -doifemptyvariable doifemptyvariableelse doifenv doifenvelse doiffastoptionalcheckcselse \ -doiffastoptionalcheckelse doiffieldbodyelse doiffieldcategoryelse doiffigureelse doiffile \ -doiffiledefinedelse doiffileelse doiffileexistselse doiffirstcharelse doifflaggedelse \ -doiffontcharelse doiffontpresentelse doiffontsynonymelse doifhasspaceelse doifhelpelse \ -doifincsnameelse doifinelementelse doifinputfileelse doifinsertionelse doifinset \ -doifinsetelse doifinstring doifinstringelse doifinsymbolset doifinsymbolsetelse \ -doifintokselse doifintwopassdataelse doifitalicelse doiflanguageelse doiflayerdataelse \ -doiflayoutdefinedelse doiflayoutsomelineelse doiflayouttextlineelse doifleapyearelse doiflistelse \ -doiflocationelse doiflocfileelse doifmainfloatbodyelse doifmarkingelse doifmeaningelse \ -doifmessageelse doifmode doifmodeelse doifnextbgroupcselse doifnextbgroupelse \ -doifnextcharelse doifnextoptionalcselse doifnextoptionalelse doifnextparenthesiselse doifnonzeropositiveelse \ -doifnot doifnotallcommon doifnotallmodes doifnotcommandhandler doifnotcommon \ -doifnotcounter doifnotdocumentargument doifnotdocumentfilename doifnotempty doifnotemptyvalue \ -doifnotemptyvariable doifnotenv doifnoteonsamepageelse doifnotescollected doifnotfile \ -doifnotflagged doifnothing doifnothingelse doifnotinset doifnotinsidesplitfloat \ -doifnotinstring doifnotmode doifnotnumber doifnotsamestring doifnotsetups \ -doifnotvalue doifnotvariable doifnumber doifnumberelse doifobjectfoundelse \ -doifobjectreferencefoundelse doifoddpageelse doifoddpagefloatelse doifoldercontextelse doifolderversionelse \ -doifoverlappingelse doifoverlayelse doifparallelelse doifparentfileelse doifpathelse \ -doifpathexistselse doifpatternselse doifposition doifpositionaction doifpositionactionelse \ -doifpositionelse doifpositiononpageelse doifpositionsonsamepageelse doifpositionsonthispageelse doifpositionsusedelse \ -doifreferencefoundelse doifrightpagefloatelse doifrighttoleftinboxelse doifsamelinereferenceelse doifsamestring \ -doifsamestringelse doifsetups doifsetupselse doifsomebackground doifsomebackgroundelse \ -doifsomespaceelse doifsomething doifsomethingelse doifsometoks doifsometokselse \ -doifstringinstringelse doifstructurelisthasnumberelse doifstructurelisthaspageelse doifsymboldefinedelse doifsymbolsetelse \ -doiftext doiftextelse doiftextflowcollectorelse doiftextflowelse doiftypingfileelse \ -doifundefined doifundefinedcounter doifundefinedelse doifurldefinedelse doifvalue \ -doifvalueelse doifvaluenothing doifvaluenothingelse doifvaluesomething doifvariable \ -doifvariableelse doindentation dollar doloop doloopoverlist \ -donothing dontconvertfont dontleavehmode dontpermitspacesbetweengroups dopositionaction \ -doprocesslocalsetups doquadrupleargument doquadrupleempty doquadruplegroupempty doquintupleargument \ -doquintupleempty doquintuplegroupempty dorechecknextindentation dorecurse dorepeatwithcommand \ -doreplacefeature doresetandafffeature doresetattribute dorotatebox dosetattribute \ -dosetleftskipadaption dosetrightskipadaption dosetupcheckedinterlinespace doseventupleargument doseventupleempty \ -dosingleargument dosingleempty dosinglegroupempty dosixtupleargument dosixtupleempty \ -dostepwiserecurse dosubtractfeature dotfskip dotoks dotripleargument \ -dotripleargumentwithset dotripleempty dotripleemptywithset dotriplegroupempty doublebar \ -doublebond doublebrace doublebracket doubleparent dowith \ -dowithnextbox dowithnextboxcontent dowithnextboxcontentcs dowithnextboxcs dowithpargument \ -dowithrange dowithwargument dpofstring dummydigit dummyparameter \ -eTeX echelle ecran ecritdansliste ecritentreliste \ -edefconvertedargument efcmaxheight efcmaxwidth efcminheight efcminwidth \ -efcparameter effect elapsedseconds elapsedtime eleftarrowfill \ -eleftharpoondownfill eleftharpoonupfill eleftrightarrowfill element elements \ -emphasisboldface emphasistypeface emptylines emspace enabledirectives \ -enableexperiments enablemode enableoutputstream enableparpositions enableregime \ -enabletrackers enskip enspace env environement \ -envvar eoverbarfill eoverbracefill eoverbracketfill eoverparentfill \ -epos equaldigits erightarrowfill erightharpoondownfill erightharpoonupfill \ -espace espacefixe espacesfixes etire etwoheadrightarrowfill \ -eunderbarfill eunderbracefill eunderbracketfill eunderparentfill executeifdefined \ -exitloop exitloopnow expandcheckedcsname expanded expandfontsynonym \ -externalfigurecollectionmaxheight externalfigurecollectionmaxwidth externalfigurecollectionminheight externalfigurecollectionminwidth externalfigurecollectionparameter \ -faitreference fakebox fastdecrement fastincrement fastlocalframed \ -fastscale fastsetup fastsetupwithargument fastsetupwithargumentswapped fastswitchtobodyfont \ -fastsxsy feature fence fenced fetchallmarkings \ -fetchallmarks fetchmark fetchmarking fetchonemark fetchonemarking \ -fetchruntinecommand fetchtwomarkings fetchtwomarks fichierdactylo fieldbody \ -fifthoffivearguments fifthofsixarguments figure figureexterne figurefilename \ -figurefilepath figurefiletype figurefullname figureheight figurenaturalheight \ -figurenaturalwidth figuresymbol figurewidth filename filledhboxb \ -filledhboxc filledhboxg filledhboxk filledhboxm filledhboxr \ -filledhboxy filler filterfromnext filterfromvalue filterpages \ -filterreference findtwopassdata finishregisterentry firstcharacter firstcounter \ -firstcountervalue firstoffivearguments firstoffourarguments firstofoneargument firstofoneunexpanded \ -firstofsixarguments firstofthreearguments firstofthreeunexpanded firstoftwoarguments firstoftwounexpanded \ -firstrealpage firstrealpagenumber firstsubcountervalue firstsubpage firstsubpagenumber \ -firstuserpage firstuserpagenumber fitfieldframed fittopbaselinegrid flag \ -floatuserdataparameter flushboxregister flushcollector flushlayer flushlocalfloats \ -flushnextbox flushnotes flushoutputstream flushshapebox flushtextflow \ -flushtokens flushtoks fontalternative fontbody fontchar \ -fontcharbyindex fontclass fontclassname fontface fontfeaturelist \ -fontsize fontstyle forcecharacterstripping forcelocalfloats forgeteverypar \ -forgetparameters formula foundbox fourthoffivearguments fourthoffourarguments \ -fourthofsixarguments frac framed frameddimension framedparameter \ -framedtext freezedimenmacro freezemeasure frenchspacing fromlinenote \ -frozenhbox gardeblocs gdefconvertedargument gdefconvertedcommand getMPdrawing \ -getMPlayer getboxllx getboxlly getbufferdata getcommacommandsize \ -getcommalistsize getdayoftheweek getdayspermonth getdefinedbuffer getdocumentargument \ -getdocumentargumentdefault getdocumentfilename getdummyparameters getemptyparameters geteparameters \ -getexpandedparameters getfiguredimensions getfirstcharacter getfirsttwopassdata getfromcommacommand \ -getfromcommalist getfromtwopassdata getglyphdirect getglyphstyled getgparameters \ -getlasttwopassdata getlocalfloat getlocalfloats getmessage getnamedglyphdirect \ -getnamedglyphstyled getnamedtwopassdatalist getnaturaldimensions getnoflines getobject \ -getobjectdimensions getpaletsize getparameters getprivatechar getprivateslot \ -getrandomcount getrandomdimen getrandomfloat getrandomnumber getrandomseed \ -getraweparameters getrawgparameters getrawnoflines getrawparameters getrawxparameters \ -getreference getreferenceentry getroundednoflines getsubstring gettwopassdata \ -gettwopassdatalist getuvalue getvalue getvariable getvariabledefault \ -getxparameters globaldisablemode globalenablemode globalletempty globalpopbox \ -globalpopmacro globalpreventmode globalprocesscommalist globalpushbox globalpushmacro \ -globalswapcounts globalswapdimens globalswapmacros globalundefine glyphfontfile \ -gobbledoubleempty gobbleeightarguments gobblefivearguments gobblefiveoptionals gobblefourarguments \ -gobblefouroptionals gobbleninearguments gobbleoneargument gobbleoneoptional gobblesevenarguments \ -gobblesingleempty gobblesixarguments gobblespacetokens gobbletenarguments gobblethreearguments \ -gobblethreeoptionals gobbletwoarguments gobbletwooptionals gobbleuntil gobbleuntilrelax \ -grabbufferdata grabbufferdatadirect grabuntil graphique grayvalue \ -greedysplitstring greeknumerals grille groupedcommand gsetboxllx \ -gsetboxlly gujaratinumerals gurmurkhinumerals hairspace halfwaybox \ -handletokens handwritten hash haut hboxofvbox \ -hboxreference hdofstring headhbox headnumbercontent headnumberdistance \ -headnumberwidth headreferenceattributes headsetupspacing headtextcontent headtextdistance \ -headtextwidth headvbox headwidth heightanddepthofstring heightofstring \ -heightspanningtext helptext hglue hiddenbar hiddencitation \ -hiddencite highlight highordinalstr hilo himilo \ -hl horizontalgrowingbar horizontalpositionbar hphantom hpos \ -hsizefraction hsmash hsmashbox hsmashed hspace \ -htdpofstring htofstring hyphen hyphenatedcoloredword hyphenatedfile \ -hyphenatedfilename hyphenatedhbox hyphenatedpar hyphenatedurl hyphenatedword \ -ibox ifassignment iff ifinobject ifinoutputstream \ -ifparameters iftrialtypesetting ignoreimplicitspaces ignorevalue immediatesavetwopassdata \ -impliedby implies includemenu includeversioninfo inconnu \ -increment incrementcounter incrementedcounter incrementpagenumber incrementsubpagenumber \ -incrementvalue indentation infofont infofontbold inframed \ -infull inheritparameter inhibitblank initializeboxstack inlinebuffer \ -inlinedbox inlinemath inlinemathematics inlinemessage inlineordisplaymath \ -inlinerange inmframed innerflushshapebox input inputfilebarename \ -inputfilename inputfilerealsuffix inputfilesuffix inputgivenfile insertpages \ -installactionhandler installactivecharacter installanddefineactivecharacter installattributestack installautocommandhandler \ -installautosetuphandler installbasicautosetuphandler installbasicparameterhandler installbottomframerenderer installcommandhandler \ -installcorenamespace installdefinehandler installdefinitionset installdefinitionsetmember installdirectcommandhandler \ -installdirectparameterhandler installdirectparametersethandler installdirectsetuphandler installdirectstyleandcolorhandler installelangue \ -installframedautocommandhandler installframedcommandhandler installleftframerenderer installnamespace installoutputroutine \ -installpagearrangement installparameterhandler installparameterhashhandler installparametersethandler installparentinjector \ -installrightframerenderer installrootparameterhandler installsetuphandler installsetuponlycommandhandler installshipoutmethod \ -installsimplecommandhandler installsimpleframedcommandhandler installstyleandcolorhandler installswitchcommandhandler installswitchsetuphandler \ -installtexdirective installtextracker installtopframerenderer installunitsseparator installunitsspace \ -installversioninfo integerrounding intermezzo intertext invokepageheandler \ -istltdir istrtdir italic italicbold italiccorrection \ -itemtag jobfilename jobfilesuffix joursemaine kap \ -keeplinestogether keepunwantedspaces kerncharacters koreancirclenumerals koreannumerals \ -koreannumeralsc koreannumeralsp koreanparentnumerals languageCharacters languagecharacters \ -languagecharwidth langue langueprincipale largeurligne lastcounter \ -lastcountervalue lastdigit lastlinewidth lastnaturalboxdp lastnaturalboxht \ -lastnaturalboxwd lastpredefinedsymbol lastrealpage lastrealpagenumber lastsubcountervalue \ -lastsubpage lastsubpagenumber lasttwodigits lastuserpage lastuserpagenumber \ -lateluacode layeredtext layerheight layerwidth lazysavetaggedtwopassdata \ -lazysavetwopassdata lbox left leftbottombox leftbox \ -lefthbox leftorrighthbox leftorrightvbox leftorrightvtop leftskipadaption \ -leftsubguillemot lefttopbox lefttorighthbox lefttorightvbox lefttorightvtop \ -letbeundefined letcatcodecommand letcscsname letcsnamecs letcsnamecsname \ -letdummyparameter letempty letgvalue letgvalueempty letgvalurelax \ -letterampersand letterat letterbackslash letterbar letterbgroup \ -letterclosebrace lettercolon letterdollar letterdoublequote letteregroup \ -letterescape letterexclamationmark letterhash letterhat letterleftbrace \ -letterless lettermore letteropenbrace letterpercent letterquestionmark \ -letterrightbrace lettersinglequote letterslash letterspacing lettertilde \ -letterunderscore letvalue letvalueempty letvaluerelax lfence \ -lhbox ligneh lignenoire ligneregleetexte lignesnoires \ -limitatelines limitatetext limtatefirstline linespanningtext listcitation \ -listcite lister listnamespaces llap llongueurliste \ -loadanyfile loadanyfileonce loadbtxdefinitionfile loadbtxreplacementfile loadcldfile \ -loadcldfileonce loadfontgoodies loadluafile loadluafileonce loadspellchecklist \ -loadtexfile loadtexfileonce loadtypescriptfile localframed localframedwithsettings \ -localhsize localpopbox localpopmacro localpushbox localpushmacro \ -localundefine locatedfilepath locatefilepath locfilename lomihi \ -lowerbox lowercased lowercasestring lowerleftdoubleninequote lowerleftsingleninequote \ -lowerrightdoubleninequote lowerrightsingleninequote lrtbbox ltop luaTeX \ -luacode luaconditional luaenvironment luaexpanded luafunction \ -luajitTeX luamajorversion luaminorversion luaparameterset luasetup \ -luaversion m mLeftarrow mLeftrightarrow mRightarrow \ -makecharacteractive makerawcommalist makestrutofbox mapfontsize margindata \ -markcontent markinjector marquage marquepage mat \ -math mathbf mathbi mathblackboard mathbs \ -mathcommand mathdefault mathematique mathfraktur mathfunction \ -mathit mathitalic mathop mathrm mathscript \ -mathsl mathss mathtext mathtextbf mathtextbi \ -mathtextbs mathtextit mathtextsl mathtexttf mathtf \ -mathtriplet mathtt mathupright mathword mathwordbf \ -mathwordbi mathwordbs mathwordit mathwordsl mathwordtf \ -mbox mcframed md measure measured \ -medskip medspace menuinteraction mequal message \ -metaTeX mfence mframed mfunction mfunctionlabeltext \ -mhbox mhookleftarrow mhookrightarrow middle middlebox \ -midhbox minimalhbox mixedcaps mkvibuffer mleftarrow \ -mleftharpoondown mleftharpoonup mleftrightarrow mleftrightharpoons mmapsto \ -moduleparameter mois molecule mono monobold \ -mononormal monthlong monthshort montrecadre montrecouleur \ +demarreembeddedxtable demarreendnote demarreendofline demarreenvironement demarreexceptions \ +demarreexpanded demarreexpandedcollect demarreextendedcatcodetable demarreexternalfigurecollection demarrefact \ +demarrefigure demarrefiguretext demarrefittingpage demarrefixed demarrefloatcombination \ +demarrefont demarrefontclass demarrefontsolution demarrefootnote demarreformula \ +demarreformulas demarreframed demarreframedcell demarreframedcontent demarreframedrow \ +demarreframedtable demarreframedtext demarrefrontmatter demarregraphictext demarregridsnapping \ +demarregroupe demarrehanging demarrehbox demarrehboxestohbox demarrehboxregister \ +demarreheadtext demarrehelptext demarrehiding demarrehighlight demarrehyphenation \ +demarreimath demarreindentation demarreindentedtext demarreinteraction demarreinterface \ +demarreintermezzotext demarreintertext demarreitemgroup demarreitemgroupcolumns demarreitemize \ +demarreknockout demarrelabeltext demarrelayout demarrelegend demarreligne \ +demarreligneregleetexte demarrelinealignment demarrelinecorrection demarrelinefiller demarrelinenumbering \ +demarrelines demarrelinetable demarrelinetablebody demarrelinetablecell demarrelinetablehead \ +demarrelocalfootnotes demarrelocalheadsetup demarrelocallinecorrection demarrelocalnotes demarrelocalsetups \ +demarrelua demarreluacode demarreluaparameterset demarreluasetups demarremakeup \ +demarremargereglee demarremarginblock demarremarkedcontent demarremathalignment demarremathcases \ +demarremathlabeltext demarremathmatrix demarremathmode demarremathstyle demarrematrices \ +demarrematrix demarremaxaligned demarremdformula demarremenuinteraction demarremiddlealigned \ +demarremiddlemakeup demarremixedcolumns demarremode demarremodeset demarremodule \ +demarremoduletestsection demarrempformula demarrenamedsection demarrenamedsubformulas demarrenarrow \ +demarrenarrower demarrenegative demarrenicelyfilledbox demarrenointerference demarrenotallmodes \ +demarrenotext demarrenotmode demarreoperatortext demarreopposite demarreoutputstream \ +demarreoverlay demarreoverprint demarrepagecomment demarrepagefigure demarrepagegrid \ +demarrepagegridspan demarrepagelayout demarrepagemakeup demarrepar demarreparagraph \ +demarreparagraphs demarreparagraphscell demarreparbuilder demarrepart demarrepath \ +demarreplacechemical demarreplacefigure demarreplaceflottant demarreplaceformule demarreplacegraphic \ +demarreplaceintermezzo demarreplacelegend demarreplacepairedbox demarreplacetable demarrepositioning \ +demarrepositionoverlay demarrepositive demarrepostponing demarreprefixtext demarreprocessassignmentcommand \ +demarreprocessassignmentlist demarreprocesscommacommand demarreprocesscommalist demarreproduit demarreprojet \ +demarreprotect demarreprotectedcolors demarrepublication demarrepunctuation demarrequotation \ +demarrequote demarrerandomized demarrerandomseed demarrerawsetups demarrereadingfile \ +demarrereferenceprefix demarreregime demarrereusableMPgraphic demarrescript demarresdformula \ +demarresection demarresectionblock demarresectionblockenvironment demarresectionlevel demarresetups \ +demarreshapebox demarreshift demarresidebar demarresimplecolumns demarrespecialitem \ +demarrespeech demarrespformula demarresplitformula demarrespread demarrestandardmakeup \ +demarrestartstop demarrestaticMPfigure demarrestaticMPgraphic demarrestrictinspectnextcharacter demarrestrut \ +demarrestyle demarresubformulas demarresubject demarresubjectlevel demarresubsection \ +demarresubsentence demarresubstack demarresubsubject demarresubsubsection demarresubsubsubject \ +demarresubsubsubsection demarresubsubsubsubject demarresubsubsubsubsection demarresubsubsubsubsubject demarresuffixtext \ +demarresymbolset demarretable demarretablehead demarretables demarretabletail \ +demarretabletext demarretabulate demarretabulatehead demarretabulatetail demarretagged \ +demarretaglabeltext demarretete demarretexcode demarretexdefinition demarretext \ +demarretextbackground demarretextbackgroundmanual demarretextcolor demarretextcolorintent demarretextflow \ +demarretextmakeup demarretitle demarretokens demarretransparent demarretypescript \ +demarretypescriptcollection demarretyping demarreuniqueMPgraphic demarreuniqueMPpagegraphic demarreunittext \ +demarreunpacked demarreusableMPgraphic demarreuseMPgraphic demarreusemathstyleparameter demarreusingbtxspecification \ +demarreva demarrevbox demarrevboxregister demarrevboxtohbox demarrevboxtohboxseparator \ +demarreviewerlayer demarrevtop demarrevtopregister demarrexcell demarrexcellgroup \ +demarrexgroup demarrexmldisplayverbatim demarrexmlinlineverbatim demarrexmlraw demarrexmlsetups \ +demarrexrow demarrexrowgroup demarrextable demarrextablebody demarrextablefoot \ +demarrextablehead demarrextablenext determinecaracteristiqueliste determinecaracteristiquesregistre determinenumerotete \ +echelle ecran ecritdansliste ecritentreliste element \ +elements environement espace espacefixe espacesfixes \ +etire faitreference fichierdactylo figureexterne gardeblocs \ +grille haut inconnu installelangue joursemaine \ +langue langueprincipale largeurligne ligneh lignenoire \ +ligneregleetexte lignesnoires llongueurliste marquage marquepage \ +mathematique menuinteraction mois montrecadre montrecouleur \ montredisposition montreedition montreenvironnementpolicecorps montregrille montregroupecouleur \ montrejeusymboles montremakeup montrepalette montrepolicecorps montrereglages \ -montrestruts mp mprandomnumber mrel mrightarrow \ -mrightharpoondown mrightharpoonup mrightleftharpoons mrightoverleftarrow mtext \ -mtriplerel mtwoheadleftarrow mtwoheadrightarrow namedheadnumber namedstructureheadlocation \ -namedstructureuservariable namedstructurevariable namedtaggedlabeltexts naturalhbox naturalhpack \ -naturalvbox naturalvcenter naturalvpack naturalvtop naturalwd \ -negatecolorbox negated negthinspace newattribute newcatcodetable \ -newcounter newevery newfrenchspacing newmode newsignal \ -newsystemmode nextbox nextboxdp nextboxht nextboxhtdp \ -nextboxwd nextcounter nextcountervalue nextdepth nextparagraphs \ -nextrealpage nextrealpagenumber nextsubcountervalue nextsubpage nextsubpagenumber \ -nextuserpage nextuserpagenumber nobar nocap nocitation \ -nocite nodetostring noffigurepages noflines noflocalfloats \ -noindentation noitem nonfrenchspacing nonmathematics normal \ -normalboldface normalframedwithsettings normalizebodyfontsize normalizedfontsize normalizefontdepth \ -normalizefontheight normalizefontline normalizefontwidth normalizetextdepth normalizetextheight \ -normalizetextline normalizetextwidth normaltypeface note notesymbol \ -ntimes numberofpoints numeroformule numeropage numeros \ -numerotete numerotetecourant obeydepth objectdepth objectheight \ -objectmargin objectwidth obox obtientmarquage offset \ -offsetbox onedigitrounding ordinaldaynumber ordinalstr oriente \ -ornamenttext outputfilename outputstreambox outputstreamcopy outputstreamunvbox \ -outputstreamunvcopy over overbar overbars overbartext \ -overbarunderbar overbrace overbracetext overbraceunderbrace overbracket \ -overbrackettext overbracketunderbracket overlaybutton overlaycolor overlaydepth \ -overlayfigure overlayheight overlaylinecolor overlaylinewidth overlayoffset \ -overlayrollbutton overlaywidth overleftarrow overleftharpoondown overleftharpoonup \ -overleftrightarrow overloaderror overparent overparenttext overparentunderparent \ -overrightarrow overrightharpoondown overrightharpoonup overset overstrike \ -overstrikes overtwoheadleftarrow overtwoheadrightarrow page pagearea \ -pagebreak pagefigure pagegridspanwidth pageinjection pagestaterealpage \ -paletsize pdfTeX pdfactualtext pdfbackendactualtext pdfbackendcurrentresources \ -pdfbackendsetcatalog pdfbackendsetcolorspace pdfbackendsetextgstate pdfbackendsetinfo pdfbackendsetname \ -pdfbackendsetpageattribute pdfbackendsetpageresource pdfbackendsetpagesattribute pdfbackendsetpattern pdfbackendsetshade \ -pdfcolor pdfeTeX percent percentdimen periodes \ -permitcaretescape permitcircumflexescape permitspacesbetweengroups persiandecimals persiannumerals \ -phantom phantombox pickupgroupedcommand pilechamp placeattachments \ -placebtxrendering placecitation placecomments placecoteacote placecurrentformulanumber \ -placedbox placefloatwithsetups placeflottant placeformule placeframed \ -placehelp placeinitial placelayer placelayeredtext placelesunsaudessusdesautres \ -placeliste placelisteinmbriquee placelistofpublications placelistofsorts placelistofsynonyms \ -placelocalnotes placemarquespages placement placenamedfloat placenamedformula \ -placenotes placenotespdp placenotespdplocales placenumeropage placenumerotete \ -placepairedbox placeparallel placerawlist placeregistre placerenderingwindow \ -placesousformule placesurgrille placetextetete popattribute popmacro \ -popmode popsystemmode position positionoverlay positionregionoverlay \ -postponenotes predefinedfont predefinefont predefinesymbol prefixedpagenumber \ -prendbuffer prependetoks prependgvalue prependtocommalist prependtoks \ -prependtoksonce prependvalue presetdocument presetfieldsymbols pretocommalist \ -prevcounter prevcountervalue preventmode prevrealpage prevrealpagenumber \ -prevsubcountervalue prevsubpage prevsubpagenumber prevuserpage prevuserpagenumber \ -procent processMPbuffer processMPfigurefile processaction processallactionsinset \ -processassignlist processassignmentcommand processassignmentlist processbetween processbodyfontenvironmentlist \ -processcolorcomponents processcommacommand processcommalist processcommalistwithparameters processcontent \ -processfile processfilemany processfilenone processfileonce processfirstactioninset \ -processisolatedchars processisolatedwords processlinetablebuffer processlinetablefile processlist \ -processmonth processranges processseparatedlist processtexbuffer processtokens \ -processuntil processxtablebuffer processyear produit profiledbox \ -profilegivenbox programme projet pseudoMixedCapped pseudoSmallCapped \ -pseudoSmallcapped pseudosmallcapped purenumber pushattribute pushbutton \ -pushmacro pushmode pushoutputstream pushsystemmode qqpart \ -qquad quad quads quitcommalist quitprevcommalist \ -quittypescriptscanning raisebox randomizetext randomnumber rawcounter \ -rawcountervalue rawdate rawdoifelseinset rawdoifinset rawdoifinsetelse \ -rawgetparameters rawprocessaction rawprocesscommacommand rawprocesscommalist rawstructurelistuservariable \ -rawsubcountervalue razmarquage rbox readfile readfixfile \ -readjobfile readlocfile readsetfile readsysfile readtexfile \ -readxmlfile realSmallCapped realSmallcapped realpagenumber realsmallcapped \ -recursedepth recurselevel recursestring redoconvertfont ref \ -reference referencepage referenceprefix referencetexte reflete \ -registerattachment registerctxluafile registerexternalfigure registerfontclass registerhyphenationexception \ -registerhyphenationpattern registermenubuttons registersort registersynonym registerunit \ -reglearrangement reglearriereplan reglearriereplans reglebarreinteraction reglebloc \ -regleblocsection reglebuffer reglecapitales reglechamp reglechamps \ -regleclipping reglecolonnes reglecommentaire reglecommentairepage reglecompoetroite \ -reglecomposeenalinea reglecouleur reglecouleurs regledactylo regledemarrestoppe \ -regledisposition regleecraninteraction regleelements regleencadre regleentete \ -regleepaisseurligne regleespaceblanc regleespacement regleespacementinterligne regleflottant \ -regleformulaires reglegroupeselements regleinf regleinteraction regleintitule \ +montrestruts motdroit numeroformule numeropage numeros \ +numerotete numerotetecourant obtientmarquage oriente periodes \ +pilechamp placecoteacote placeflottant placeformule placelesunsaudessusdesautres \ +placeliste placelisteinmbriquee placemarquespages placenotespdp placenotespdplocales \ +placenumeropage placenumerotete placeregistre placesousformule placesurgrille \ +placetextetete prendbuffer produit programme projet \ +qqpart razmarquage referencepage referencetexte reflete \ +reglealignement reglearrangement reglearriereplan reglearriereplans reglebarreinteraction \ +reglebloc regleblocsection reglebuffer reglecapitales reglechamp \ +reglechamps regleclipping reglecolonnes reglecommentaire reglecommentairepage \ +reglecompoetroite reglecomposeenalinea reglecouleur reglecouleurs regledactylo \ +regledemarrestoppe regledisposition regleecraninteraction regleelements regleencadre \ +regleentete regleenumerations regleepaisseurligne regleespaceblanc regleespacement \ +regleespacementinterligne regleflottant regleflottants regleformulaires regleformules \ +reglegroupeselements regleinf regleinteraction regleintitule regleintitules \ reglejeusymboles reglelangue reglelignes reglelignesnoires reglelignesreglestexte \ regleliste reglelisteimbriquee reglemakeup reglemargereglee reglemarquage \ reglemarquagehyphenation reglemenuinteraction reglenumeropage reglenumerotationligne reglenumerotationpage \ @@ -2873,2471 +1486,408 @@ regleseparationflottant reglesousnumeropage reglesup reglesynonymes regletableau regletabulation regletaillepapier regletete regletetes regletexte \ regletextesentete regletextesinf regletextespdp regletextessup regletextestexte \ regletolerance regletraitsfins regletransitionspage regletri regletype \ -regleurl regular relatemarking relateparameterhandlers relaxvalueifundefined \ -remainingcharacters removebottomthings removedepth removefromcommalist removelastskip \ -removelastspace removemarkedcontent removepunctuation removesubstring removetoks \ -removeunwantedspaces remplitligne remplitlignesreglees remplittexte replacefeature \ -replaceincommalist replaceword rescan rescanwithsetup resetMPdrawing \ -resetMPenvironment resetMPinstance resetallattributes resetandaddfeature resetbar \ -resetbreakpoints resetbuffer resetcharacteralign resetcharacterkerning resetcharacterspacing \ -resetcharacterstripping resetcollector resetcounter resetdigitsmanipulation resetdirection \ -resetfeature resetflag resetfontcolorsheme resetfontfallback resetfontsolution \ -resethyphenationfeatures resetinjector resetinteractionmenu resetitaliccorrection resetlayer \ -resetlocalfloats resetmarker resetmode resetpagenumber resetparallel \ -resetpath resetpenalties resetprofile resetreference resetreplacement \ -resetscript resetsetups resetshownsynonyms resetsubpagenumber resetsymbolset \ -resetsystemmode resettimer resettrackers resettrialtypesetting resetusedsortings \ -resetusedsynonyms resetuserpagenumber resetvalue resetvisualizers reshapebox \ -resolvedglyphdirect resolvedglyphstyled restartcounter restorebox restorecatcodes \ -restorecounter restorecurrentattributes restoreendofline restoreglobalbodyfont reusableMPgraphic \ -reuseMPgraphic reuserandomseed revivefeature rfence rhbox \ -right rightbottombox rightbox righthbox rightorleftpageaction \ -rightskipadaption rightsubguillemot righttolefthbox righttoleftvbox righttoleftvtop \ -righttopbox rlap robustaddtocommalist robustdoifelseinset robustdoifinsetelse \ -robustpretocommalist rollbutton roman rtop ruledhbox \ -ruledhpack ruledmbox ruledtopv ruledtpack ruledvbox \ -ruledvpack ruledvtop runMPbuffer runninghbox safechar \ -sans sansbold sansespace sanslignesenteteetpdp sanslignessupetinf \ -sansnormal sansserif savebox savebtxdataset savebuffer \ -savecounter savecurrentattributes savenormalmeaning savetaggedtwopassdata savetwopassdata \ -sbox sd secondoffivearguments secondoffourarguments secondofsixarguments \ -secondofthreearguments secondofthreeunexpanded secondoftwoarguments secondoftwounexpanded section \ -select selectionneblocs separeflottant serializecommalist serializedcommalist \ -serif serifbold serifnormal setJSpreamble setMPlayer \ -setMPpositiongraphic setMPpositiongraphicrange setMPtext setMPvariable setMPvariables \ -setbar setbigbodyfont setboxllx setboxlly setbreakpoints \ -setcapstrut setcatcodetable setcharacteralign setcharactercasing setcharactercleaning \ -setcharacterkerning setcharacterspacing setcharacterstripping setcharstrut setcollector \ -setcolormodell setcounter setcounterown setcurrentfontclass setdataset \ -setdefaultpenalties setdigitsmanipulation setdirection setdocumentargument setdocumentargumentdefault \ -setdocumentfilename setdummyparameter setelementexporttag setemeasure setevalue \ -setevariable setevariables setfirstline setflag setfont \ -setfontcolorsheme setfontfeature setfontsolution setfontstrut setfractions \ -setgmeasure setgvalue setgvariable setgvariables sethboxregister \ -sethyphenatedurlafter sethyphenatedurlbefore sethyphenatedurlnormal sethyphenationfeatures setinitial \ -setinjector setinteraction setinterfacecommand setinterfaceconstant setinterfaceelements \ -setinterfacemessage setinterfacevariable setinternalrendering setitaliccorrection setlayer \ -setlayerframed setlayertext setlinefiller setlocalhsize setmainbodyfont \ -setmainparbuilder setmarker setmarking setmathstyle setmeasure \ -setmessagetext setmode setnostrut setnote setnotetext \ -setobject setoldstyle setpagegrid setpagereference setpagestate \ -setpagestaterealpageno setpenalties setpercentdimen setposition setpositionbox \ -setpositiondata setpositiondataplus setpositiononly setpositionplus setpositionstrut \ -setprofile setrandomseed setreference setreferencedobject setregisterentry \ -setreplacement setrigidcolumnbalance setrigidcolumnhsize setscript setsectionblock \ -setsimplecolumnhsize setsmallbodyfont setsmallcaps setstackbox setstructurepageregister \ -setstrut setsuperiors setsystemmode settabular settaggedmetadata \ -settext settightobject settightreferencedobject settightunreferencedobject settrialtypesetting \ -setuevalue setugvalue setunreferencedobject setup setupMPgraphics \ -setupMPinstance setupMPpage setupMPvariables setupTABLE setupTEXpage \ -setupattachment setupbackend setupbar setupbleeding setupbookmark \ -setupbtx setupbtxdataset setupbtxlist setupbtxregister setupbtxrendering \ -setupbutton setupcharacterkerning setupcharacterspacing setupchemical setupchemicalframed \ -setupcollector setupcolumnspan setupcombination setupcounter setupdataset \ -setupdelimitedtext setupdescription setupdirections setupdocument setupeffect \ -setupenumeration setupenv setupexport setupexternalfigure setupexternalsoundtracks \ -setupfieldbody setupfieldcategory setupfieldcontentframed setupfieldlabelframed setupfieldtotalframed \ -setupfiller setupfirstline setupfittingpage setupfloatcaption setupfontexpansion \ -setupfontprotrusion setupfonts setupfontsolution setupformula setupformulaframed \ -setupframedcontent setupframedtext setupglobalreferenceprefix setupheadalternative setuphelp \ -setuphigh setuphighlight setuphyphenation setupindentedtext setupinitial \ -setupinsertion setupitaliccorrection setupitemgroup setuplabel setuplayer \ -setuplayeredtext setuplayouttext setuplinefiller setuplinefillers setuplinenote \ -setuplinetable setuplistalternative setuplistextra setuplocalfloats setuplocalinterlinespace \ -setuplow setuplowhigh setuplowmidhigh setupmarginblock setupmargindata \ -setupmarginframed setupmarginrule setupmathalignment setupmathcases setupmathematics \ -setupmathfence setupmathfraction setupmathframed setupmathmatrix setupmathornament \ -setupmathradical setupmathstackers setupmathstyle setupmixedcolumns setupmodule \ -setupnotation setupnotations setupnote setupnotes setupoffset \ -setupoffsetbox setupoutputroutine setuppagechecker setuppagegrid setuppagegridarea \ -setuppagegridareatext setuppagegridlines setuppagegridspan setuppagegridstart setuppageinjection \ -setuppageinjectionalternative setuppageshift setuppagestate setuppairedbox setupparagraph \ -setupparagraphintro setupparallel setupperiods setupplacement setuppositionbar \ -setupprocessor setupprofile setupquotation setuprealpagenumber setupreferenceformat \ -setupreferenceprefix setupreferencestructureprefix setupregisters setuprenderingwindow setups \ -setupscale setupscript setupscripts setupselector setupshift \ -setupsidebar setupspellchecking setupstretched setupstruts setupstyle \ -setupsubformula setuptabulation setuptagging setuptextbackground setuptextflow \ -setuptooltip setupunit setupuserpagenumber setupversion setupviewerlayer \ -setupvspacing setupwithargument setupwithargumentswapped setupxml setupxtable \ -setuvalue setuxvalue setvalue setvariable setvariables \ -setvboxregister setvisualizerfont setvtopregister setwidthof setxmeasure \ -setxvalue setxvariable setxvariables sfrac shapedhbox \ -showallmakeup showattributes showboxes showbtxdatasetauthors showbtxdatasetcompleteness \ -showbtxdatasetfields showbtxfields showbtxhashedauthors showbtxtables showchardata \ -showcharratio showcolorbar showcolorcomponents showcolorset showcolorstruts \ -showcounter showdirectives showdirsinmargin showedebuginfo showexperiments \ -showfont showfontdata showfontkerns showfontparameters showfontstrip \ -showfontstyle showglyphs showgridsnapping showhelp showhyphenationtrace \ -showhyphens showinjector showjustification showkerning showlayoutcomponents \ -showligature showligatures showlogcategories showmargins showmessage \ -showminimalbaseline shownextbox showotfcomposition showparentchain showsetupsdefinition \ -showtimer showtokens showtrackers showvalue showvariable \ -showwarning simplegroupedcommand singalcharacteralign singlebond sixthofsixarguments \ -slanted slantedbold slicepages slovenianNumerals sloveniannumerals \ -small smallbodyfont smallbold smallbolditalic smallboldslanted \ -smallcappedcharacters smallcappedromannumerals smaller smallitalicbold smallnormal \ -smallskip smallslanted smallslantedbold smalltype smash \ -smashbox smashboxed smashedhbox smashedvbox snaptogrid \ -someheadnumber somekindoftab somelocalfloat somenamedheadnumber someplace \ -sousnumeropage soussection soussoussection soussoussoussection soussoussoussoussection \ -soussoussoussoussujet soussoussoussujet soussoussujet soussujet sp \ -spanishNumerals spanishnumerals speech splitatasterisk splitatcolon \ -splitatcolons splitatcomma splitdfrac splitfilename splitfrac \ -splitoffbase splitofffull splitoffkind splitoffname splitoffpath \ -splitoffroot splitofftokens splitofftype splitstring spreadhbox \ -sqrt stackrel startregister startstructurepageregister stoppeJScode \ -stoppeJSpreamble stoppeMPclip stoppeMPcode stoppeMPdefinitions stoppeMPdrawing \ -stoppeMPenvironment stoppeMPextensions stoppeMPinclusions stoppeMPinitializations stoppeMPpage \ -stoppeMPpositiongraphic stoppeMPpositionmethod stoppeMPrun stoppeTABLE stoppeTABLEbody \ +regleurl remplitligne remplitlignesreglees remplittexte sansespace \ +sanslignesenteteetpdp sanslignessupetinf selectionneblocs separeflottant settext \ +sousnumeropage stoppeJScode stoppeJSpreamble stoppeLUA stoppeMP \ +stoppeMPclip stoppeMPcode stoppeMPdefinitions stoppeMPdrawing stoppeMPenvironment \ +stoppeMPextensions stoppeMPinclusions stoppeMPinitializations stoppeMPpage stoppeMPpositiongraphic \ +stoppeMPpositionmethod stoppeMPrun stoppePARSEDXML stoppeTABLE stoppeTABLEbody \ stoppeTABLEfoot stoppeTABLEhead stoppeTABLEnext stoppeTC stoppeTD \ -stoppeTDs stoppeTEXpage stoppeTH stoppeTN stoppeTR \ -stoppeTRs stoppeTX stoppeTY stoppeallmodes stoppearrangedpages \ -stoppearriereplan stoppeaside stoppeattachment stoppebar stoppebinom \ -stoppebitmapimage stoppeblockquote stoppebtxrenderingdefinitions stoppebuffer stoppebutton \ -stoppecatcodetable stoppechapitre stoppecharacteralign stoppecheckedfences stoppechemical \ -stoppecitation stoppeciter stoppecollect stoppecollecting stoppecolorintent \ -stoppecoloronly stoppecolorset stoppecolumns stoppecolumnspan stoppecombination \ -stoppecomment stoppecommentaire stoppecomposant stoppecontextcode stoppecontextdefinitioncode \ -stoppecouleur stoppectxfunction stoppectxfunctiondefinition stoppecurrentcolor stoppecurrentlistentrywrapper \ -stoppedbinom stoppedelimited stoppedelimitedtext stoppedfrac stoppediscours \ -stoppedisplaymath stoppedmath stoppedocument stoppeeffect stoppeelement \ -stoppeembeddedxtable stoppeendofline stoppeenvironement stoppeexceptions stoppeexpanded \ -stoppeexpandedcollect stoppeextendedcatcodetable stoppeexternalfigurecollection stoppefigure stoppefitfieldframed \ -stoppefittingpage stoppefloatcombination stoppefont stoppefontclass stoppefontsolution \ -stoppeformula stoppeformulas stoppefrac stoppeframed stoppeframedcontent \ -stoppeframedtext stoppegraphique stoppegridsnapping stoppegroupe stoppehbox \ -stoppehboxestohbox stoppehboxregister stoppehelptext stoppehiddenbar stoppehiding \ -stoppehighlight stoppehyphenation stoppeimath stoppeindentation stoppeindentedtext \ -stoppeinmframed stoppeinteraction stoppeinterface stoppeintermezzo stoppeintertext \ -stoppeitemgroup stoppeknockout stoppelayout stoppeligne stoppeligneregleetexte \ -stoppelinecorrection stoppelinefiller stoppelinenumbering stoppelinetable stoppelinetablebody \ -stoppelinetablecell stoppelinetablehead stoppelister stoppelocalfootnotes stoppelocalheadsetup \ -stoppelocallinecorrection stoppelocalnotes stoppelocalsetups stoppelua stoppeluacode \ -stoppeluaparameterset stoppeluasetups stoppemakeup stoppemargereglee stoppemarginblock \ -stoppemarkedcontent stoppemathmode stoppemathstyle stoppematrices stoppemcframed \ -stoppemdformula stoppemenuinteraction stoppemframed stoppemixedcolumns stoppemode \ -stoppemodeset stoppemodule stoppemoduletestsection stoppempformula stoppenamedsection \ -stoppenamedsubformulas stoppenarrow stoppenarrower stoppenegative stoppenicelyfilledbox \ -stoppenobar stoppenointerference stoppenotallmodes stoppenotext stoppenotmode \ -stoppeopposite stoppeoutputstream stoppeoverbar stoppeoverbars stoppeoverlay \ +stoppeTDs stoppeTEX stoppeTEXpage stoppeTH stoppeTN \ +stoppeTR stoppeTRs stoppeTX stoppeTY stoppeXML \ +stoppealign stoppealigneadroite stoppealigneagauche stoppealigneaumilieu stoppealignment \ +stoppeallmodes stoppeappendices stoppearrangedpages stoppearriereplan stoppeaside \ +stoppeattachment stoppebackmatter stoppebar stoppebbordermatrix stoppebitmapimage \ +stoppeblockquote stoppebodymatter stoppebordermatrix stoppeboxedcolumns stoppebtxlabeltext \ +stoppebtxrenderingdefinitions stoppebuffer stoppecases stoppecatcodetable stoppecenteraligned \ +stoppechapter stoppecharacteralign stoppecheckedfences stoppechemical stoppechemicaltext \ +stoppecollect stoppecollecting stoppecolorintent stoppecoloronly stoppecolorset \ +stoppecolumns stoppecolumnspan stoppecombination stoppecomment stoppecomposant \ +stoppecontextcode stoppecontextdefinitioncode stoppecouleur stoppectxfunction stoppectxfunctiondefinition \ +stoppecurrentcolor stoppecurrentlistentrywrapper stoppedelimited stoppedelimitedtext stoppedisplaymath \ +stoppedmath stoppedocument stoppeeffect stoppeelement stoppeembeddedxtable \ +stoppeendnote stoppeendofline stoppeenvironement stoppeexceptions stoppeexpanded \ +stoppeexpandedcollect stoppeextendedcatcodetable stoppeexternalfigurecollection stoppefact stoppefigure \ +stoppefiguretext stoppefittingpage stoppefixed stoppefloatcombination stoppefont \ +stoppefontclass stoppefontsolution stoppefootnote stoppeformula stoppeformulas \ +stoppeframed stoppeframedcell stoppeframedcontent stoppeframedrow stoppeframedtable \ +stoppeframedtext stoppefrontmatter stoppegraphictext stoppegridsnapping stoppegroupe \ +stoppehanging stoppehbox stoppehboxestohbox stoppehboxregister stoppeheadtext \ +stoppehelptext stoppehiding stoppehighlight stoppehyphenation stoppeimath \ +stoppeindentation stoppeindentedtext stoppeinteraction stoppeinterface stoppeintermezzotext \ +stoppeintertext stoppeitemgroup stoppeitemgroupcolumns stoppeitemize stoppeknockout \ +stoppelabeltext stoppelayout stoppelegend stoppeligne stoppeligneregleetexte \ +stoppelinealignment stoppelinecorrection stoppelinefiller stoppelinenumbering stoppelines \ +stoppelinetable stoppelinetablebody stoppelinetablecell stoppelinetablehead stoppelocalfootnotes \ +stoppelocalheadsetup stoppelocallinecorrection stoppelocalnotes stoppelocalsetups stoppelua \ +stoppeluacode stoppeluaparameterset stoppeluasetups stoppemakeup stoppemargereglee \ +stoppemarginblock stoppemarkedcontent stoppemathalignment stoppemathcases stoppemathlabeltext \ +stoppemathmatrix stoppemathmode stoppemathstyle stoppematrices stoppematrix \ +stoppemaxaligned stoppemdformula stoppemenuinteraction stoppemiddlealigned stoppemiddlemakeup \ +stoppemixedcolumns stoppemode stoppemodeset stoppemodule stoppemoduletestsection \ +stoppempformula stoppenamedsection stoppenamedsubformulas stoppenarrow stoppenarrower \ +stoppenegative stoppenicelyfilledbox stoppenointerference stoppenotallmodes stoppenotext \ +stoppenotmode stoppeoperatortext stoppeopposite stoppeoutputstream stoppeoverlay \ stoppeoverprint stoppepagecomment stoppepagefigure stoppepagegrid stoppepagegridspan \ -stoppepagelayout stoppepar stoppeparagraph stoppeparagraphs stoppeparagraphscell \ -stoppeparbuilder stoppepath stoppeplaceformule stoppeplacepairedbox stoppepositioning \ -stoppepositionoverlay stoppepositive stoppepostponing stoppeprocessassignmentcommand stoppeprocessassignmentlist \ +stoppepagelayout stoppepagemakeup stoppepar stoppeparagraph stoppeparagraphs \ +stoppeparagraphscell stoppeparbuilder stoppepart stoppepath stoppeplacechemical \ +stoppeplacefigure stoppeplaceflottant stoppeplaceformule stoppeplacegraphic stoppeplaceintermezzo \ +stoppeplacelegend stoppeplacepairedbox stoppeplacetable stoppepositioning stoppepositionoverlay \ +stoppepositive stoppepostponing stoppeprefixtext stoppeprocessassignmentcommand stoppeprocessassignmentlist \ stoppeprocesscommacommand stoppeprocesscommalist stoppeproduit stoppeprojet stoppeprotect \ -stoppeprotectedcolors stoppepublication stoppepunctuation stopperandomized stopperandomseed \ -stopperawsetups stoppereadingfile stoppereferenceprefix stopperegime stoppereusableMPgraphic \ -stoppescript stoppesdformula stoppesection stoppesectionblock stoppesectionblockenvironment \ -stoppesectionlevel stoppesetups stoppesfrac stoppeshapebox stoppeshift \ -stoppesidebar stoppesimplecolumns stoppesousligne stoppesouslignetout stoppesoussection \ -stoppesoussoussection stoppesoussoussoussection stoppesoussoussoussoussection stoppesoussoussoussoussujet stoppesoussoussoussujet \ -stoppesoussoussujet stoppesoussujet stoppespecialitem stoppespeech stoppespformula \ -stoppespread stoppestartstop stoppestaticMPfigure stoppestaticMPgraphic stoppestrictinspectnextcharacter \ -stoppestrut stoppestyle stoppesubformulas stoppesubjectlevel stoppesubsentence \ -stoppesubstack stoppesujet stoppesurligne stoppesurlignetout stoppesymbolset \ -stoppetable stoppetableau stoppetablehead stoppetables stoppetabletail \ -stoppetabulate stoppetabulatehead stoppetabulatetail stoppetagged stoppetbinom \ +stoppeprotectedcolors stoppepublication stoppepunctuation stoppequotation stoppequote \ +stopperandomized stopperandomseed stopperawsetups stoppereadingfile stoppereferenceprefix \ +stopperegime stoppereusableMPgraphic stoppescript stoppesdformula stoppesection \ +stoppesectionblock stoppesectionblockenvironment stoppesectionlevel stoppesetups stoppeshapebox \ +stoppeshift stoppesidebar stoppesimplecolumns stoppespecialitem stoppespeech \ +stoppespformula stoppesplitformula stoppespread stoppestandardmakeup stoppestartstop \ +stoppestaticMPfigure stoppestaticMPgraphic stoppestrictinspectnextcharacter stoppestrut stoppestyle \ +stoppesubformulas stoppesubject stoppesubjectlevel stoppesubsection stoppesubsentence \ +stoppesubstack stoppesubsubject stoppesubsubsection stoppesubsubsubject stoppesubsubsubsection \ +stoppesubsubsubsubject stoppesubsubsubsubsection stoppesubsubsubsubsubject stoppesuffixtext stoppesymbolset \ +stoppetable stoppetablehead stoppetables stoppetabletail stoppetabletext \ +stoppetabulate stoppetabulatehead stoppetabulatetail stoppetagged stoppetaglabeltext \ stoppetete stoppetexcode stoppetexdefinition stoppetext stoppetextbackground \ -stoppetextbackgroundmanual stoppetextcolor stoppetextcolorintent stoppetexteaide stoppetexteencadre \ -stoppetextflow stoppetitre stoppetokens stoppetransparent stoppetypescript \ -stoppetypescriptcollection stoppeunderdash stoppeunderdashes stoppeunderdot stoppeunderdots \ -stoppeunderrandom stoppeunderrandoms stoppeunderstrike stoppeunderstrikes stoppeunframed \ -stoppeuniqueMPgraphic stoppeuniqueMPpagegraphic stoppeunpacked stoppeusableMPgraphic stoppeuseMPgraphic \ -stoppeusemathstyleparameter stoppeusingbtxspecification stoppeva stoppevbox stoppevboxregister \ -stoppevboxtohbox stoppevboxtohboxseparator stoppeviewerlayer stoppevtop stoppevtopregister \ -stoppexcell stoppexcellgroup stoppexfrac stoppexgroup stoppexmldisplayverbatim \ -stoppexmlinlineverbatim stoppexmlraw stoppexmlsetups stoppexrow stoppexrowgroup \ -stoppextable stoppextablebody stoppextablefoot stoppextablehead stoppextablenext \ -stoppexxfrac stopregister stopstructurepageregister strictdoifelsenextoptional strictdoifnextoptionalelse \ -stripcharacter strippedcsname stripspaces structurelistuservariable structurenumber \ -structuretitle structureuservariable structurevariable strut strutdp \ -strutht struthtdp struttedbox strutwd style \ -styleinstance subsentence substituteincommalist subtractfeature sujet \ -swapcounts swapdimens swapface swapmacros swaptypeface \ -switchstyleonly switchtocolor switchtointerlinespace symbole symbolreference \ -synchronizeblank synchronizeindenting synchronizemarking synchronizeoutputstreams synchronizestrut \ -synchronizewhitespace systemlog systemlogfirst systemloglast systemsetups \ -tLeftarrow tLeftrightarrow tRightarrow tableau tabulateautoline \ -tabulateautorule tabulateline tabulaterule taggedctxcommand taggedlabeltexts \ -tapebuffer tbinom tbox tequal testandsplitstring \ -testcolumn testfeature testfeatureonce testpage testpageonly \ -testpagesync testtokens tex texdefinition texsetup \ -textcitation textcite textcontrolspace texteaide texteencadre \ -textenotepdp textflowcollector textmath textminus textormathchar \ -textplus textvisiblespace tfrac thainumerals thefirstcharacter \ -thenormalizedbodyfontsize theremainingcharacters thickspace thinspace thirdoffivearguments \ -thirdoffourarguments thirdofsixarguments thirdofthreearguments thirdofthreeunexpanded thookleftarrow \ -thookrightarrow threedigitrounding tibetannumerals tightlayer tinyfont \ -titre tlap tleftarrow tleftharpoondown tleftharpoonup \ -tleftrightarrow tleftrightharpoons tmapsto tochar tolinenote \ -topbox topleftbox toplinebox toprightbox topskippedbox \ -tracecatcodetables tracedfontname traceoutputroutines tracepositions traduire \ -traiteblocs traitfin traitsfins transparencycomponents transparent \ -trel trightarrow trightharpoondown trightharpoonup trightleftharpoons \ -trightoverleftarrow triplebond truefilename truefontname ttriplerel \ -ttwoheadleftarrow ttwoheadrightarrow twodigitrounding tx txx \ -typ typedefinedbuffer typeface typescriptone typescriptprefix \ -typescriptthree typescripttwo typesetbuffer typesetfile uconvertnumber \ -uedcatcodecommand undefinevalue undepthed underbar underbars \ -underbartext underbrace underbracetext underbracket underbrackettext \ -underdash underdashes underdot underdots underleftarrow \ -underleftharpoondown underleftharpoonup underleftrightarrow underparent underparenttext \ -underrandom underrandoms underrightarrow underrightharpoondown underrightharpoonup \ -underset understrike understrikes undertwoheadleftarrow undertwoheadrightarrow \ -undoassign uneligne unframed unhhbox unihex \ -uniqueMPgraphic uniqueMPpagegraphic unprotected unregisterhyphenationpattern unspaceafter \ -unspaceargument unspaced unspacestring untexargument untexcommand \ -uppercased uppercasestring upperleftdoubleninequote upperleftdoublesixquote upperleftsingleninequote \ -upperleftsinglesixquote upperrightdoubleninequote upperrightdoublesixquote upperrightsingleninequote upperrightsinglesixquote \ -url useMPenvironmentbuffer useMPgraphic useMPlibrary useMPrun \ -useMPvariables useblankparameter usebodyfont usebodyfontparameter usebtxdataset \ -usebtxdefinitions usecolors usecomponent usedummycolorparameter usedummystyleandcolor \ -usedummystyleparameter useenvironment useexternalrendering usefigurebase usefile \ -usegridparameter useindentingparameter useindentnextparameter useinterlinespaceparameter uselanguageparameter \ -useluamodule usemathstyleparameter useproduct useprofileparameter useproject \ -usereferenceparameter userpagenumber usesetupsparameter usestaticMPfigure usesubpath \ -usetexmodule usetypescript usetypescriptfile usezipfile utfchar \ -utflower utfupper utiliseJSscripts utiliseURL utiliseblocs \ -utilisechemin utilisedocumentexterne utilisefigureexterne utilisemodule utilisepsiteaudioexterne \ -utilisesymboles utiliseurl utilityregisterlength va vaalaboite \ -vaalapage vaenbas valeurcouleur vboxreference verbatim \ -verbatimstring verbosenumber version verticalgrowingbar verticalpositionbar \ -vglue vide viewerlayer vl vphantom \ -vpos vsmash vsmashbox vsmashed vspace \ -vspacing wdofstring widthofstring widthspanningtext withoutpt \ -word words wordtonumber writedatatolist writestatus \ -xLeftarrow xLeftrightarrow xRightarrow xdefconvertedargument xequal \ -xfrac xhookleftarrow xhookrightarrow xleftarrow xleftharpoondown \ -xleftharpoonup xleftrightarrow xleftrightharpoons xmapsto xmladdindex \ -xmlafterdocumentsetup xmlaftersetup xmlall xmlappenddocumentsetup xmlappendsetup \ -xmlapplyselectors xmlatt xmlattdef xmlattribute xmlattributedef \ -xmlbadinclusions xmlbeforedocumentsetup xmlbeforesetup xmlchainatt xmlchainattdef \ -xmlchecknamespace xmlcommand xmlconcat xmlconcatrange xmlcontext \ -xmlcount xmldefaulttotext xmldirectives xmldirectivesafter xmldirectivesbefore \ -xmldisplayverbatim xmldoif xmldoifelse xmldoifelseempty xmldoifelseselfempty \ -xmldoifelsetext xmldoifelsevalue xmldoifnot xmldoifnotselfempty xmldoifnottext \ -xmldoifselfempty xmldoiftext xmlelement xmlfilter xmlfirst \ -xmlflush xmlflushcontext xmlflushdocumentsetups xmlflushlinewise xmlflushpure \ -xmlflushspacewise xmlflushtext xmlinclude xmlinclusion xmlinclusions \ -xmlinfo xmlinjector xmlinlineverbatim xmlinstalldirective xmllast \ -xmllastatt xmllastmatch xmlloadbuffer xmlloaddata xmlloaddirectives \ -xmlloadfile xmlloadonly xmlmain xmlmapvalue xmlname \ -xmlnamespace xmlnonspace xmlpath xmlpos xmlposition \ -xmlprependdocumentsetup xmlprependsetup xmlprettyprint xmlprocessbuffer xmlprocessdata \ -xmlprocessfile xmlpure xmlraw xmlrefatt xmlregistereddocumentsetups \ -xmlregisteredsetups xmlregisterns xmlremapname xmlremapnamespace xmlremovedocumentsetup \ -xmlremovesetup xmlresetdocumentsetups xmlresetinjectors xmlresetsetups xmlsave \ -xmlsetentity xmlsetfunction xmlsetinjectors xmlsetsetup xmlsetup \ -xmlshow xmlsnippet xmlstrip xmlstripnolines xmlstripped \ -xmlstrippednolines xmltag xmltexentity xmltext xmltobuffer \ -xmltobufferverbose xmltofile xmlvalue xmlverbatim xrel \ -xrightarrow xrightharpoondown xrightharpoonup xrightleftharpoons xrightoverleftarrow \ -xsplitstring xtriplerel xtwoheadleftarrow xtwoheadrightarrow xxfrac \ -xypos +stoppetextbackgroundmanual stoppetextcolor stoppetextcolorintent stoppetextflow stoppetextmakeup \ +stoppetitle stoppetokens stoppetransparent stoppetypescript stoppetypescriptcollection \ +stoppetyping stoppeuniqueMPgraphic stoppeuniqueMPpagegraphic stoppeunittext stoppeunpacked \ +stoppeusableMPgraphic stoppeuseMPgraphic stoppeusemathstyleparameter stoppeusingbtxspecification stoppeva \ +stoppevbox stoppevboxregister stoppevboxtohbox stoppevboxtohboxseparator stoppeviewerlayer \ +stoppevtop stoppevtopregister stoppexcell stoppexcellgroup stoppexgroup \ +stoppexmldisplayverbatim stoppexmlinlineverbatim stoppexmlraw stoppexmlsetups stoppexrow \ +stoppexrowgroup stoppextable stoppextablebody stoppextablefoot stoppextablehead \ +stoppextablenext symbole tapebuffer textenotepdp traduire \ +traiteblocs traitfin traitsfins uneligne utiliseJSscripts \ +utiliseURL utiliseblocs utilisechemin utilisedocumentexterne utilisefigureexterne \ +utilisemodule utilisepsiteaudioexterne utilisesymboles utiliseurl va \ +vaalaboite vaalapage vaenbas valeurcouleur vide keywordclass.context.it=\ -AMSTEX AfterPar Alphabeticnumerals AmSTeX \ -And BeforePar Big Bigg Biggl \ -Biggm Biggr Bigl Bigm Bigr \ -CONTEXT Cap Caps ConTeXt Context \ -ConvertConstantAfter ConvertToConstant ETEX EveryLine EveryPar \ -GIORNOSETTIMANA GetPar GotoPar Greeknumerals INRSTEX \ -LAMSTEX LATEX LUAJITTEX LUATEX LaTeX \ -LamSTeX Lettera Lettere Lua LuaTeX \ -LuajitTeX MESE METAFONT METAFUN METAPOST \ -MKII MKIV MKIX MKVI MKXI \ -MONTHLONG MONTHSHORT MPII MPIV MPVI \ -MPanchor MPbetex MPc MPcode MPcolor \ -MPcoloronly MPcolumn MPd MPdrawing MPfontsizehskip \ -MPgetmultipars MPgetmultishape MPgetposboxes MPh MPinclusions \ -MPleftskip MPll MPlr MPls MPmenubuttons \ -MPn MPoptions MPoverlayanchor MPp MPpage \ -MPpardata MPplus MPpos MPpositiongraphic MPposset \ -MPr MPrawvar MPregion MPrest MPrightskip \ -MPrs MPstring MPtext MPtransparency MPul \ -MPur MPv MPvar MPvariable MPvv \ -MPw MPwhd MPx MPxy MPxywhd \ -MPy MetaFont MetaFun MetaPost NormalizeFontHeight \ -NormalizeFontWidth NormalizeTextHeight NormalizeTextWidth Numeri Numeriromani \ -PAROLA PAROLE PDFETEX PDFTEX PDFcolor \ -PICTEX PPCHTEX PPCHTeX PRAGMA Parola \ -Parole PiCTeX PointsToBigPoints PointsToReal PointsToWholeBigPoints \ -PtToCm ReadFile ScaledPointsToBigPoints ScaledPointsToWholeBigPoints Smallcapped \ -TABLE TEX TEXpage TaBlE TeX \ -TheNormalizedFontSize TransparencyHack VerboseNumber WidthSpanningText XETEX \ -XeTeX abjadnaivenumerals abjadnodotnumerals abjadnumerals activatespacehandler \ -adaptcollector adaptfontfeature adaptpapersize adattacampo adattalayout \ -addfeature addtoJSpreamble addtocommalist addvalue aftersplitstring \ -aftertestandsplitstring al alignmentcharacter allinputpaths alphabeticnumerals \ -alwayscitation alwayscite ambiente ampersand anchor \ -ap apagina appendetoks appendgvalue appendtocommalist \ -appendtoks appendtoksonce appendvalue apply applyalternativestyle \ -applyprocessor applytocharacters applytofirstcharacter applytosplitstringchar applytosplitstringcharspaced \ -applytosplitstringline applytosplitstringlinespaced applytosplitstringword applytosplitstringwordspaced applytowords \ -arabicdecimals arabicexnumerals arabicnumerals arg argomento \ -asciistr aside assignalfadimension assigndimen assigndimension \ -assignifempty assigntranslation assignvalue assignwidth assumelongusagecs \ -astype attachment autocap autodirhbox autodirvbox \ -autodirvtop autoinsertnextspace automathematics autosetups availablehsize \ -averagecharwidth backgroundimage backgroundimagefill backgroundline barracolori \ -barrainterazione basegrid baselineleftbox baselinemiddlebox baselinerightbox \ -bbox beforesplitstring beforetestandsplitstring big bigbodyfont \ -bigg bigger biggl biggm biggr \ -bigl bigm bigr bigskip binom \ -bitmapimage blap bleed bleedheight bleedwidth \ -blockligatures blockquote bodyfontenvironmentlist bodyfontsize bold \ -boldface bolditalic boldslanted booleanmodevalue bottombox \ -bottomleftbox bottomrightbox boxcursor boxmarker boxofsize \ -boxreference bpos bthiddencitation btxabbreviatedjournal btxaddjournal \ -btxalwayscitation btxauthorfield btxdetail btxdirect btxdoif \ -btxdoifcombiinlistelse btxdoifelse btxdoifelsecombiinlist btxdoifelsesameasprevious btxdoifelsesameaspreviouschecked \ -btxdoifelseuservariable btxdoifnot btxdoifsameaspreviouscheckedelse btxdoifsameaspreviouselse btxdoifuservariableelse \ -btxexpandedjournal btxfield btxfieldname btxfieldtype btxfirstofrange \ -btxflush btxflushauthor btxflushauthorinverted btxflushauthorinvertedshort btxflushauthorname \ -btxflushauthornormal btxflushauthornormalshort btxflushsuffix btxfoundname btxfoundtype \ -btxhybridcite btxlistcitation btxloadjournalist btxoneorrange btxremapauthor \ -btxsavejournalist btxsetup btxsingularorplural btxsingularplural btxtextcitation \ -calligraphic cambiaafontdeltesto camel campi cap \ -capello capitolo capoverso catcodetablename cbox \ -centerbox centeredbox centerednextbox cfrac chardescription \ -charwidthlanguage checkcharacteralign checkedchar checkedfiller checkedstrippedcsname \ -checkinjector checknextindentation checknextinjector checkpage checkparameters \ -checkpreviousinjector checksoundtrack checktwopassdata checkvariables chemical \ -chemicalbottext chemicalmidtext chemicalsymbol chemicaltext chemicaltoptext \ -chim chineseallnumerals chinesecapnumerals chinesenumerals circondato \ -citation citazione cite clap classfont \ -cldcommand cldcontext cldloadfile cldprocessfile cleftarrow \ -clip clonacampo collect collectedtext collectexpanded \ -colonna colorcomponents colore colored coloregrigio \ -coloronly columnbreak combinepages commalistelement commalistsentence \ -commalistsize comment commento comparedimension comparedimensioneps \ -completebtxrendering completelist completelistofpublications completelistofsorts completelistofsynonyms \ -completeregister complexorsimple complexorsimpleempty componenet composedcollector \ -composedlayer compresult confrontagruppocolori confrontatavolozza constantdimen \ -constantdimenargument constantemptyargument constantnumber constantnumberargument contentreference \ -continuednumber continueifinputfile convertargument convertcommand convertedcounter \ -converteddimen convertedsubcounter convertinumero convertmonth convertvalue \ -convertvboxtohbox copiacampo copypages copyparameters copyposition \ -correggispaziobianco countersubs counttoken counttokens cramped \ -crampedclap crampedllap crampedrlap crightarrow crightoverleftarrow \ -ctop ctxcommand ctxdirectcommand ctxdirectlua ctxfunction \ -ctxlatecommand ctxlatelua ctxloadluafile ctxlua ctxluabuffer \ -ctxluacode ctxreport ctxsprint currentassignmentlistkey currentassignmentlistvalue \ -currentbtxuservariable currentcommalistitem currentcomponent currentenvironment currentfeaturetest \ -currentinterface currentlanguage currentlistentrydestinationattribute currentlistentrylimitedtext currentlistentrynumber \ -currentlistentrypagenumber currentlistentryreferenceattribute currentlistentrytitle currentlistentrytitlerendered currentlistsymbol \ -currentmainlanguage currentmessagetext currentmoduleparameter currentoutputstream currentproduct \ -currentproject currentregime currentregisterpageuserdata currentresponses currenttime \ -currentvalue currentxtablecolumn currentxtablerow da daqualcheparte \ -data datadioggi datasetvariable dayoftheweek dayspermonth \ -dbinom decrement decrementcounter decrementedcounter decrementpagenumber \ -decrementsubpagenumber decrementvalue defaultinterface defaultobjectpage defaultobjectreference \ -defcatcodecommand defconvertedargument defconvertedcommand defconvertedvalue defineMPinstance \ -defineTABLEsetup defineactivecharacter definealternativestyle defineanchor defineattachment \ -defineattribute definebackground definebar definebodyfontswitch definebreakpoint \ -definebreakpoints definebtx definebtxdataset definebtxregister definebtxrendering \ -definebutton definecapitals definecharacterkerning definecharacterspacing definechemical \ -definechemicals definechemicalsymbol definecollector definecolumnbreak definecombination \ -definecomment definecomplexorsimple definecomplexorsimpleempty defineconversionset definecounter \ -definedataset definedelimitedtext definedfont defineeffect defineexpandable \ -defineexternalfigure definefallbackfamily definefieldbody definefieldbodyset definefieldcategory \ -definefileconstant definefilefallback definefilesynonym definefiller definefirstline \ -definefittingpage definefontalternative definefontfallback definefontfamily definefontfamilypreset \ -definefontfeature definefontfile definefontsize definefontsolution defineformula \ -defineformulaalternative defineformulaframed defineframedcontent definefrozenfont defineglobalcolor \ -definegraphictypesynonym definegridsnapping defineheadalternative definehelp definehigh \ -definehighlight definehspace definehypenationfeatures defineindentedtext defineindenting \ -defineinitial defineinsertion defineinteraction defineinteractionbar defineinterfaceconstant \ -defineinterfaceelement defineinterfacevariable defineinterlinespace defineintermediatecolor defineitemgroup \ -defineitems definelabelclass definelayer definelayerpreset definelinefiller \ -definelinenote definelinenumbering definelines definelistalternative definelistextra \ -definelow definelowhigh definelowmidhigh definemarginblock definemargindata \ -definemarker definemathalignment definemathcases definemathcommand definemathdoubleextensible \ -definemathematics definemathextensible definemathfence definemathfraction definemathframed \ -definemathmatrix definemathornament definemathoverextensible definemathovertextextensible definemathradical \ -definemathstackers definemathstyle definemathtriplet definemathunderextensible definemathundertextextensible \ -definemathunstacked definemeasure definemessageconstant definemixedcolumns definemode \ -definemultitonecolor definenamedcolor definenamespace definenarrower definenote \ -defineornament defineoutputroutine defineoutputroutinecommand definepage definepagebreak \ -definepagechecker definepagegrid definepagegridarea definepagegridspan definepageinjection \ -definepageinjectionalternative definepageshift definepagestate definepairedbox defineparagraph \ -defineparallel defineparbuilder defineplacement definepositioning defineprefixset \ -defineprocesscolor defineprocessor definepushbutton definepushsymbol definerenderingwindow \ -defineresetset definescale definescript definesectionlevels defineselector \ -defineseparatorset defineshift definesidebar definesort definespotcolor \ -definestyleinstance definesubformula definesynonym definesystemattribute definesystemconstant \ -definesystemvariable definetabulation definetextbackground definetextflow definetooltip \ -definetransparency definetwopasslist definetypeface definetypescriptprefix definetypescriptsynonym \ -definetypesetting defineunit defineviewerlayer definevspace definevspacing \ -definevspacingamount definextable definisci definisciambientefontdeltesto definisciblocco \ -definiscibloccosezione definiscibuffer definiscicampo definiscicapoversi definiscicolore \ -definisciconversione definiscidescrizione definiscidimensionicarta definiscielenco definiscielencocombinato \ -definiscienumerazione definiscietichetta definiscifigurasimbolo definiscifont definiscifontdeltesto \ -definisciformatoriferimento definiscigruppocolori definiscihbox definisciincorniciato definisciiniziatermina \ -definiscilayout definiscimakeup definiscimarcatura definiscimenuinterazione definiscimodellotabella \ -definiscioggettomobile definisciordinamento definisciprofilo definisciprogramma definisciregistro \ -definisciriferimento definiscisezione definiscisimbolo definiscisinonimi definiscisinonimofont \ -definiscisottocampo definiscisovrapposizione definiscistackcampi definiscistile definiscistilefont \ -definiscitabulato definiscitavolozza definiscitesta definiscitesto definiscitestoincorniciato \ -definiscitype definiscityping delimited delimitedtext depthofstring \ -depthonlybox depthspanningtext determinacaratteristicheregistro determinacarattersticheelenco determinanumerotesta \ -determinenoflines devanagarinumerals dfrac digits dimensiontocount \ -directcolor directcolored directconvertedcounter directdummyparameter directgetboxllx \ -directgetboxlly directhighlight directlocalframed directluacode directselect \ -directsetbar directsetup directsymbol directvspacing dis \ -disabledirectives disableexperiments disablemode disableoutputstream disableparpositions \ -disableregime disabletrackers displaymath displaymathematics displaymessage \ -distributedhsize dividedsize doadaptleftskip doadaptrightskip doaddfeature \ -doassign doassignempty doboundtext docheckassignment docheckedpagestate \ -docheckedpair documentvariable dodoubleargument dodoubleargumentwithset dodoubleempty \ -dodoubleemptywithset dodoublegroupempty doeassign doexpandedrecurse dogetattribute \ -dogetattributeid dogetcommacommandelement dogobbledoubleempty dogobblesingleempty doif \ -doifMPgraphicelse doifallcommon doifallcommonelse doifalldefinedelse doifallmodes \ -doifallmodeselse doifassignmentelse doifblackelse doifbothsides doifbothsidesoverruled \ -doifboxelse doifbufferelse doifcolor doifcolorelse doifcommandhandler \ -doifcommandhandlerelse doifcommon doifcommonelse doifcontent doifconversiondefinedelse \ -doifconversionnumberelse doifcounter doifcounterelse doifcurrentfonthasfeatureelse doifdefined \ -doifdefinedcounter doifdefinedcounterelse doifdefinedelse doifdimensionelse doifdimenstringelse \ -doifdocumentargument doifdocumentargumentelse doifdocumentfilename doifdocumentfilenameelse doifdrawingblackelse \ -doifelse doifelseMPgraphic doifelseallcommon doifelsealldefined doifelseallmodes \ -doifelseassignment doifelseblack doifelsebox doifelsebuffer doifelsecolor \ -doifelsecommandhandler doifelsecommon doifelseconversiondefined doifelseconversionnumber doifelsecounter \ -doifelsecurrentfonthasfeature doifelsecurrentsortingused doifelsecurrentsynonymshown doifelsecurrentsynonymused doifelsedefined \ -doifelsedefinedcounter doifelsedimension doifelsedimenstring doifelsedocumentargument doifelsedocumentfilename \ -doifelsedrawingblack doifelseempty doifelseemptyvalue doifelseemptyvariable doifelseenv \ -doifelsefastoptionalcheck doifelsefastoptionalcheckcs doifelsefieldbody doifelsefieldcategory doifelsefigure \ -doifelsefile doifelsefiledefined doifelsefileexists doifelsefirstchar doifelseflagged \ -doifelsefontchar doifelsefontpresent doifelsefontsynonym doifelsehasspace doifelsehelp \ -doifelseincsname doifelseinelement doifelseinputfile doifelseinsertion doifelseinset \ -doifelseinstring doifelseinsymbolset doifelseintoks doifelseintwopassdata doifelseitalic \ -doifelselanguage doifelselayerdata doifelselayoutdefined doifelselayoutsomeline doifelselayouttextline \ -doifelseleapyear doifelselist doifelselocation doifelselocfile doifelsemainfloatbody \ -doifelsemarking doifelsemeaning doifelsemessage doifelsemode doifelsenextbgroup \ -doifelsenextbgroupcs doifelsenextchar doifelsenextoptional doifelsenextoptionalcs doifelsenextparenthesis \ -doifelsenonzeropositive doifelsenoteonsamepage doifelsenothing doifelsenumber doifelseobjectfound \ -doifelseobjectreferencefound doifelseoddpage doifelseoddpagefloat doifelseoldercontext doifelseolderversion \ -doifelseoverlapping doifelseoverlay doifelseparallel doifelseparentfile doifelsepath \ -doifelsepathexists doifelsepatterns doifelseposition doifelsepositionaction doifelsepositiononpage \ -doifelsepositionsonsamepage doifelsepositionsonthispage doifelsepositionsused doifelsereferencefound doifelserightpagefloat \ -doifelserighttoleftinbox doifelsesamelinereference doifelsesamestring doifelsesetups doifelsesomebackground \ -doifelsesomespace doifelsesomething doifelsesometoks doifelsestringinstring doifelsestructurelisthasnumber \ -doifelsestructurelisthaspage doifelsesymboldefined doifelsesymbolset doifelsetext doifelsetextflow \ -doifelsetextflowcollector doifelsetypingfile doifelseundefined doifelseurldefined doifelsevalue \ -doifelsevaluenothing doifelsevariable doifempty doifemptyelse doifemptytoks \ -doifemptyvalue doifemptyvalueelse doifemptyvariable doifemptyvariableelse doifenv \ -doifenvelse doiffastoptionalcheckcselse doiffastoptionalcheckelse doiffieldbodyelse doiffieldcategoryelse \ -doiffigureelse doiffile doiffiledefinedelse doiffileelse doiffileexistselse \ -doiffirstcharelse doifflaggedelse doiffontcharelse doiffontpresentelse doiffontsynonymelse \ -doifhasspaceelse doifhelpelse doifincsnameelse doifinelementelse doifinputfileelse \ -doifinsertionelse doifinset doifinsetelse doifinstring doifinstringelse \ -doifinsymbolset doifinsymbolsetelse doifintokselse doifintwopassdataelse doifitalicelse \ -doiflanguageelse doiflayerdataelse doiflayoutdefinedelse doiflayoutsomelineelse doiflayouttextlineelse \ -doifleapyearelse doiflistelse doiflocationelse doiflocfileelse doifmainfloatbodyelse \ -doifmarkingelse doifmeaningelse doifmessageelse doifmode doifmodeelse \ -doifnextbgroupcselse doifnextbgroupelse doifnextcharelse doifnextoptionalcselse doifnextoptionalelse \ -doifnextparenthesiselse doifnonzeropositiveelse doifnot doifnotallcommon doifnotallmodes \ -doifnotcommandhandler doifnotcommon doifnotcounter doifnotdocumentargument doifnotdocumentfilename \ -doifnotempty doifnotemptyvalue doifnotemptyvariable doifnotenv doifnoteonsamepageelse \ -doifnotescollected doifnotfile doifnotflagged doifnothing doifnothingelse \ -doifnotinset doifnotinsidesplitfloat doifnotinstring doifnotmode doifnotnumber \ -doifnotsamestring doifnotsetups doifnotvalue doifnotvariable doifnumber \ -doifnumberelse doifobjectfoundelse doifobjectreferencefoundelse doifoddpageelse doifoddpagefloatelse \ -doifoldercontextelse doifolderversionelse doifoverlappingelse doifoverlayelse doifparallelelse \ -doifparentfileelse doifpathelse doifpathexistselse doifpatternselse doifposition \ -doifpositionaction doifpositionactionelse doifpositionelse doifpositiononpageelse doifpositionsonsamepageelse \ -doifpositionsonthispageelse doifpositionsusedelse doifreferencefoundelse doifrightpagefloatelse doifrighttoleftinboxelse \ -doifsamelinereferenceelse doifsamestring doifsamestringelse doifsetups doifsetupselse \ -doifsomebackground doifsomebackgroundelse doifsomespaceelse doifsomething doifsomethingelse \ -doifsometoks doifsometokselse doifstringinstringelse doifstructurelisthasnumberelse doifstructurelisthaspageelse \ -doifsymboldefinedelse doifsymbolsetelse doiftext doiftextelse doiftextflowcollectorelse \ -doiftextflowelse doiftypingfileelse doifundefined doifundefinedcounter doifundefinedelse \ -doifurldefinedelse doifvalue doifvalueelse doifvaluenothing doifvaluenothingelse \ -doifvaluesomething doifvariable doifvariableelse doindentation dollar \ -doloop doloopoverlist donothing dontconvertfont dontleavehmode \ -dontpermitspacesbetweengroups dopositionaction doprocesslocalsetups doquadrupleargument doquadrupleempty \ -doquadruplegroupempty doquintupleargument doquintupleempty doquintuplegroupempty dorechecknextindentation \ -dorecurse dorepeatwithcommand doreplacefeature doresetandafffeature doresetattribute \ -dorotatebox dosetattribute dosetleftskipadaption dosetrightskipadaption dosetupcheckedinterlinespace \ -doseventupleargument doseventupleempty dosingleargument dosingleempty dosinglegroupempty \ -dosixtupleargument dosixtupleempty dostepwiserecurse dosubtractfeature dotfskip \ -dotoks dotripleargument dotripleargumentwithset dotripleempty dotripleemptywithset \ -dotriplegroupempty doublebar doublebond doublebrace doublebracket \ -doubleparent dowith dowithnextbox dowithnextboxcontent dowithnextboxcontentcs \ -dowithnextboxcs dowithpargument dowithrange dowithwargument dpofstring \ -dummydigit dummyparameter eTeX edefconvertedargument efcmaxheight \ -efcmaxwidth efcminheight efcminwidth efcparameter effect \ -elaborablocchi elapsedseconds elapsedtime eleftarrowfill eleftharpoondownfill \ -eleftharpoonupfill eleftrightarrowfill elementi elemento elenco \ -emphasisboldface emphasistypeface emptylines emspace enabledirectives \ -enableexperiments enablemode enableoutputstream enableparpositions enableregime \ -enabletrackers enskip enspace env envvar \ -eoverbarfill eoverbracefill eoverbracketfill eoverparentfill epos \ -equaldigits erightarrowfill erightharpoondownfill erightharpoonupfill etwoheadrightarrowfill \ -eunderbarfill eunderbracefill eunderbracketfill eunderparentfill executeifdefined \ -exitloop exitloopnow expandcheckedcsname expanded expandfontsynonym \ -externalfigurecollectionmaxheight externalfigurecollectionmaxwidth externalfigurecollectionminheight externalfigurecollectionminwidth externalfigurecollectionparameter \ -fakebox fastdecrement fastincrement fastlocalframed fastscale \ -fastsetup fastsetupwithargument fastsetupwithargumentswapped fastswitchtobodyfont fastsxsy \ -feature fence fenced fetchallmarkings fetchallmarks \ -fetchmark fetchmarking fetchonemark fetchonemarking fetchruntinecommand \ -fetchtwomarkings fetchtwomarks fieldbody fifthoffivearguments fifthofsixarguments \ -figura figuraesterna figurefilename figurefilepath figurefiletype \ -figurefullname figureheight figurenaturalheight figurenaturalwidth figuresymbol \ -figurewidth filename filledhboxb filledhboxc filledhboxg \ -filledhboxk filledhboxm filledhboxr filledhboxy filler \ -filterfromnext filterfromvalue filterpages filterreference findtwopassdata \ -finishregisterentry firstcharacter firstcounter firstcountervalue firstoffivearguments \ -firstoffourarguments firstofoneargument firstofoneunexpanded firstofsixarguments firstofthreearguments \ -firstofthreeunexpanded firstoftwoarguments firstoftwounexpanded firstrealpage firstrealpagenumber \ -firstsubcountervalue firstsubpage firstsubpagenumber firstuserpage firstuserpagenumber \ -fitfieldframed fittopbaselinegrid flag floatuserdataparameter flushboxregister \ -flushcollector flushlayer flushlocalfloats flushnextbox flushnotes \ -flushoutputstream flushshapebox flushtextflow flushtokens flushtoks \ -fontalternative fontbody fontchar fontcharbyindex fontclass \ -fontclassname fontface fontfeaturelist fontsize fontstyle \ -forcecharacterstripping forcelocalfloats forgeteverypar forgetparameters formula \ -foundbox fourthoffivearguments fourthoffourarguments fourthofsixarguments frac \ -frameddimension framedparameter framedtext freezedimenmacro freezemeasure \ -frenchspacing fromlinenote frozenhbox gdefconvertedargument gdefconvertedcommand \ -getMPdrawing getMPlayer getboxllx getboxlly getbufferdata \ -getcommacommandsize getcommalistsize getdayoftheweek getdayspermonth getdefinedbuffer \ -getdocumentargument getdocumentargumentdefault getdocumentfilename getdummyparameters getemptyparameters \ -geteparameters getexpandedparameters getfiguredimensions getfirstcharacter getfirsttwopassdata \ -getfromcommacommand getfromcommalist getfromtwopassdata getglyphdirect getglyphstyled \ -getgparameters getlasttwopassdata getlocalfloat getlocalfloats getmessage \ -getnamedglyphdirect getnamedglyphstyled getnamedtwopassdatalist getnaturaldimensions getnoflines \ -getobject getobjectdimensions getpaletsize getparameters getprivatechar \ -getprivateslot getrandomcount getrandomdimen getrandomfloat getrandomnumber \ -getrandomseed getraweparameters getrawgparameters getrawnoflines getrawparameters \ -getrawxparameters getreference getreferenceentry getroundednoflines getsubstring \ -gettwopassdata gettwopassdatalist getuvalue getvalue getvariable \ -getvariabledefault getxparameters giornosettimana globaldisablemode globalenablemode \ -globalletempty globalpopbox globalpopmacro globalpreventmode globalprocesscommalist \ -globalpushbox globalpushmacro globalswapcounts globalswapdimens globalswapmacros \ -globalundefine glyphfontfile gobbledoubleempty gobbleeightarguments gobblefivearguments \ -gobblefiveoptionals gobblefourarguments gobblefouroptionals gobbleninearguments gobbleoneargument \ -gobbleoneoptional gobblesevenarguments gobblesingleempty gobblesixarguments gobblespacetokens \ -gobbletenarguments gobblethreearguments gobblethreeoptionals gobbletwoarguments gobbletwooptionals \ -gobbleuntil gobbleuntilrelax grabbufferdata grabbufferdatadirect grabuntil \ -grafico grayvalue greedysplitstring greeknumerals griglia \ -groupedcommand gsetboxllx gsetboxlly gujaratinumerals gurmurkhinumerals \ -hairspace halfwaybox handletokens handwritten hash \ -hboxofvbox hboxreference hdofstring headhbox headnumbercontent \ -headnumberdistance headnumberwidth headreferenceattributes headsetupspacing headtextcontent \ -headtextdistance headtextwidth headvbox headwidth heightanddepthofstring \ -heightofstring heightspanningtext helptext hglue hiddenbar \ -hiddencitation hiddencite highlight highordinalstr hilo \ -himilo hl horizontalgrowingbar horizontalpositionbar hphantom \ -hpos hsizefraction hsmash hsmashbox hsmashed \ -hspace htdpofstring htofstring hyphen hyphenatedcoloredword \ -hyphenatedfile hyphenatedfilename hyphenatedhbox hyphenatedpar hyphenatedurl \ -hyphenatedword ibox ifassignment iff ifinobject \ -ifinoutputstream ifparameters iftrialtypesetting ignoreimplicitspaces ignorevalue \ -ignoto immediatesavetwopassdata impliedby implies impostaampiezzariga \ -impostabarrainterazione impostablocco impostabloccosezione impostabuffer impostacampi \ -impostacampo impostacapoversi impostacaption impostacima impostaclippling \ -impostacolonne impostacolore impostacolori impostacommento impostacommentopagina \ -impostadimensionicarta impostaelementi impostaelencazioni impostaelenco impostaelencocombinato \ -impostafondo impostafontdeltesto impostaforms impostaincorniciato impostainiziatermina \ +GIORNOSETTIMANA Lettera Lettere MESE \ +Numeri Numeriromani PAROLA PAROLE Parola \ +Parole adattacampo adattalayout al allineacentro \ +allineadestra allineasinistra ambiente ap apagina \ +barracolori barrainterazione cambiaafontdeltesto campi capello \ +chim circondato clonacampo colonna colore \ +coloregrigio commento componenet confrontagruppocolori confrontatavolozza \ +convertinumero copiacampo correggispaziobianco da daqualcheparte \ +data datadioggi definisci definisciaccento definisciambientefontdeltesto \ +definisciblocco definiscibloccosezione definiscibuffer definiscicampo definiscicapoversi \ +definiscicarattere definiscicolore definiscicomando definisciconversione definiscidescrizione \ +definiscidimensionicarta definiscielenco definiscielencocombinato definiscienumerazione definiscietichetta \ +definiscifigurasimbolo definiscifont definiscifontdeltesto definisciformatoriferimento definiscigruppocolori \ +definiscihbox definisciincorniciato definisciiniziatermina definiscilayout definiscimakeup \ +definiscimarcatura definiscimenuinterazione definiscimodellotabella definiscioggettomobile definisciordinamento \ +definisciprofilo definisciprogramma definisciregistro definisciriferimento definiscisezione \ +definiscisimbolo definiscisinonimi definiscisinonimofont definiscisottocampo definiscisovrapposizione \ +definiscistackcampi definiscistile definiscistilefont definiscitabulato definiscitavolozza \ +definiscitesta definiscitesto definiscitestoincorniciato definiscitype definiscityping \ +determinacaratteristicheregistro determinacarattersticheelenco determinanumerotesta elaborablocchi elementi \ +elemento figuraesterna giornosettimana griglia ignoto \ +impostaallineamento impostaampiezzariga impostabarrainterazione impostablocco impostabloccosezione \ +impostabuffer impostacampi impostacampo impostacapoversi impostacaption \ +impostacaptions impostacima impostaclippling impostacolonne impostacolore \ +impostacolori impostacommento impostacommentopagina impostadimensionicarta impostaelementi \ +impostaelencazioni impostaelenco impostaelencocombinato impostaenumerazioni impostafondo \ +impostafontdeltesto impostaforms impostaformule impostaincorniciato impostainiziatermina \ impostainstestazione impostainterazione impostainterlinea impostalayout impostalineemargine \ impostalineenere impostalineeriempimento impostalineesottili impostalineetesto impostalingua \ impostamaiuscole impostamakeup impostamarcatura impostamenuinterazione impostamenzione \ impostanumerazionecapoversi impostanumerazionepagina impostanumerazionerighe impostanumeropagina impostanumerosottopagina \ -impostanumerotesta impostaoggettomobile impostaordinamento impostaparranging impostapdp \ -impostapiustretto impostaposizionamento impostaposizionamentoopposti impostaprogrammi impostaregistro \ -impostarientro impostariferimento impostarighe impostarigheriempimento impostarigovuoto \ -impostarotazione impostaschermointerazione impostasegnosillabazione impostasetsimboli impostasfondi \ -impostasfondo impostasinonimi impostaspaziatura impostaspaziobianco impostaspezzamentooggettomobile \ -impostatabelle impostatabulato impostatavolozza impostatesta impostateste \ -impostatesticima impostatestifondo impostatestiintestazioni impostatestipdp impostatesto \ -impostatestotesti impostatolleranza impostatransizionepagina impostatype impostatyping \ -impostaurl in includemenu includeversioninfo incorniciato \ -increment incrementcounter incrementedcounter incrementpagenumber incrementsubpagenumber \ -incrementvalue indentation infofont infofontbold inheritparameter \ -inhibitblank initializeboxstack iniziaJScode iniziaJSpreamble iniziaMPclip \ -iniziaMPcode iniziaMPdefinitions iniziaMPdrawing iniziaMPenvironment iniziaMPextensions \ -iniziaMPinclusions iniziaMPinitializations iniziaMPpage iniziaMPpositiongraphic iniziaMPpositionmethod \ -iniziaMPrun iniziaTABLE iniziaTABLEbody iniziaTABLEfoot iniziaTABLEhead \ -iniziaTABLEnext iniziaTC iniziaTD iniziaTDs iniziaTEXpage \ -iniziaTH iniziaTN iniziaTR iniziaTRs iniziaTX \ -iniziaTY iniziaallmodes iniziaambiente iniziaargomento iniziaarrangedpages \ -iniziaaside iniziaattachment iniziabar iniziabinom iniziabitmapimage \ -iniziablockquote iniziabtxrenderingdefinitions iniziabuffer iniziabutton iniziacapitolo \ -iniziacapoverso iniziacatcodetable iniziacharacteralign iniziacheckedfences iniziachemical \ -iniziacitazione iniziacollect iniziacollecting iniziacolore iniziacolorintent \ -iniziacoloronly iniziacolorset iniziacolumns iniziacolumnspan iniziacombination \ -iniziacomment iniziacommento iniziacomponenet iniziacontextcode iniziacontextdefinitioncode \ -iniziactxfunction iniziactxfunctiondefinition iniziacurrentcolor iniziacurrentlistentrywrapper iniziadbinom \ -iniziadelimited iniziadelimitedtext iniziadfrac iniziadisplaymath iniziadmath \ -iniziadocument iniziaeffect iniziaelement iniziaelemento iniziaelenco \ -iniziaembeddedxtable iniziaendofline iniziaexceptions iniziaexpanded iniziaexpandedcollect \ -iniziaextendedcatcodetable iniziaexternalfigurecollection iniziafigura iniziafigure iniziafitfieldframed \ -iniziafittingpage iniziafloatcombination iniziafont iniziafontclass iniziafontsolution \ -iniziaformula iniziaformulas iniziafrac iniziaframedcontent iniziaframedtext \ -iniziagrafico iniziagridsnapping iniziahbox iniziahboxestohbox iniziahboxregister \ -iniziahelptext iniziahiddenbar iniziahiding iniziahighlight iniziahyphenation \ +impostanumerotesta impostaoggettimobili impostaoggettomobile impostaordinamento impostaparranging \ +impostapdp impostapiustretto impostaposizionamento impostaposizionamentoopposti impostaprogrammi \ +impostaregistro impostarientro impostariferimento impostarighe impostarigheriempimento \ +impostarigovuoto impostarotazione impostaschermointerazione impostasegnosillabazione impostasetsimboli \ +impostasfondi impostasfondo impostasinonimi impostaspaziatura impostaspaziobianco \ +impostaspezzamentooggettomobile impostatabelle impostatabulato impostatavolozza impostatesta \ +impostateste impostatesticima impostatestifondo impostatestiincorniciati impostatestiintestazioni \ +impostatestipdp impostatesto impostatestotesti impostatolleranza impostatransizionepagina \ +impostatype impostatyping impostaurl incorniciato iniziaJScode \ +iniziaJSpreamble iniziaLUA iniziaMP iniziaMPclip iniziaMPcode \ +iniziaMPdefinitions iniziaMPdrawing iniziaMPenvironment iniziaMPextensions iniziaMPinclusions \ +iniziaMPinitializations iniziaMPpage iniziaMPpositiongraphic iniziaMPpositionmethod iniziaMPrun \ +iniziaPARSEDXML iniziaTABLE iniziaTABLEbody iniziaTABLEfoot iniziaTABLEhead \ +iniziaTABLEnext iniziaTC iniziaTD iniziaTDs iniziaTEX \ +iniziaTEXpage iniziaTH iniziaTN iniziaTR iniziaTRs \ +iniziaTX iniziaTY iniziaXML iniziaalign iniziaalignment \ +iniziaallineacentro iniziaallineadestra iniziaallineasinistra iniziaallmodes iniziaambiente \ +iniziaappendices iniziaarrangedpages iniziaaside iniziaattachment iniziabackmatter \ +iniziabar iniziabbordermatrix iniziabitmapimage iniziablockquote iniziabodymatter \ +iniziabordermatrix iniziaboxedcolumns iniziabtxlabeltext iniziabtxrenderingdefinitions iniziabuffer \ +iniziacases iniziacatcodetable iniziacenteraligned iniziachapter iniziacharacteralign \ +iniziacheckedfences iniziachemical iniziachemicaltext iniziacollect iniziacollecting \ +iniziacolore iniziacolorintent iniziacoloronly iniziacolorset iniziacolumns \ +iniziacolumnspan iniziacombination iniziacomment iniziacomponenet iniziacontextcode \ +iniziacontextdefinitioncode iniziactxfunction iniziactxfunctiondefinition iniziacurrentcolor iniziacurrentlistentrywrapper \ +iniziadelimited iniziadelimitedtext iniziadisplaymath iniziadmath iniziadocument \ +iniziaeffect iniziaelement iniziaelemento iniziaembeddedxtable iniziaendnote \ +iniziaendofline iniziaexceptions iniziaexpanded iniziaexpandedcollect iniziaextendedcatcodetable \ +iniziaexternalfigurecollection iniziafact iniziafigure iniziafiguretext iniziafittingpage \ +iniziafixed iniziafloatcombination iniziafont iniziafontclass iniziafontsolution \ +iniziafootnote iniziaformula iniziaformulas iniziaframedcell iniziaframedcontent \ +iniziaframedrow iniziaframedtable iniziaframedtext iniziafrontmatter iniziagraphictext \ +iniziagridsnapping iniziahanging iniziahbox iniziahboxestohbox iniziahboxregister \ +iniziaheadtext iniziahelptext iniziahiding iniziahighlight iniziahyphenation \ iniziaimath iniziaimpaccato iniziaincorniciato iniziaindentation iniziaindentedtext \ -iniziainmframed iniziainteraction iniziainterface iniziaintermezzo iniziaintertext \ -iniziaitemgroup iniziaknockout inizialayout inizialineamargine inizialineatesto \ -inizialinecorrection inizialinefiller inizialinenumbering inizialinetable inizialinetablebody \ +iniziainteraction iniziainterface iniziaintermezzotext iniziaintertext iniziaitemgroup \ +iniziaitemgroupcolumns iniziaitemize iniziaknockout inizialabeltext inizialayout \ +inizialegend inizialinealignment inizialineamargine inizialineatesto inizialinecorrection \ +inizialinefiller inizialinenumbering inizialines inizialinetable inizialinetablebody \ inizialinetablecell inizialinetablehead inizialocalfootnotes inizialocalheadsetup inizialocallinecorrection \ inizialocalnotes inizialocalsetups inizialua inizialuacode inizialuaparameterset \ -inizialuasetups iniziamakeup iniziamarginblock iniziamarkedcontent iniziamathmode \ -iniziamathstyle iniziamatrices iniziamcframed iniziamdformula iniziamenuinterattivo \ -iniziamenzione iniziamettiformula iniziamframed iniziamixedcolumns iniziamode \ +inizialuasetups iniziamakeup iniziamarginblock iniziamarkedcontent iniziamathalignment \ +iniziamathcases iniziamathlabeltext iniziamathmatrix iniziamathmode iniziamathstyle \ +iniziamatrices iniziamatrix iniziamaxaligned iniziamdformula iniziamenuinterattivo \ +iniziamettiformula iniziamiddlealigned iniziamiddlemakeup iniziamixedcolumns iniziamode \ iniziamodeset iniziamodule iniziamoduletestsection iniziampformula inizianamedsection \ inizianamedsubformulas inizianarrow inizianarrower inizianegative inizianicelyfilledbox \ -inizianobar inizianointerference inizianotallmodes inizianotext inizianotmode \ +inizianointerference inizianotallmodes inizianotext inizianotmode iniziaoperatortext \ iniziaopposite iniziaoutputstream iniziaoverlay iniziaoverprint iniziapagecomment \ -iniziapagefigure iniziapagegrid iniziapagegridspan iniziapagelayout iniziapar \ -iniziaparagraph iniziaparagraphs iniziaparagraphscell iniziaparbuilder iniziapath \ -iniziaplacepairedbox iniziapositioning iniziapositionoverlay iniziapositive iniziapostponing \ +iniziapagefigure iniziapagegrid iniziapagegridspan iniziapagelayout iniziapagemakeup \ +iniziapar iniziaparagraph iniziaparagraphs iniziaparagraphscell iniziaparbuilder \ +iniziapart iniziapath iniziaplacechemical iniziaplacefigure iniziaplacefloat \ +iniziaplacegraphic iniziaplaceintermezzo iniziaplacelegend iniziaplacepairedbox iniziaplacetable \ +iniziapositioning iniziapositionoverlay iniziapositive iniziapostponing iniziaprefixtext \ iniziaprocessassignmentcommand iniziaprocessassignmentlist iniziaprocesscommacommand iniziaprocesscommalist iniziaprodotto \ iniziaprogetto iniziaprotect iniziaprotectedcolors iniziapubblicazione iniziapunctuation \ -iniziarandomized iniziarandomseed iniziarawsetups iniziareadingfile iniziareferenceprefix \ -iniziaregime iniziareusableMPgraphic iniziariga iniziasbarrati iniziasbarrato \ -iniziascript iniziasdformula iniziasectionblock iniziasectionblockenvironment iniziasectionlevel \ -iniziasetups iniziasfondo iniziasfrac iniziashapebox iniziashift \ -iniziasidebar iniziasimplecolumns iniziasopralinea iniziasopralinee iniziasottoargomento \ -iniziasottocapoverso iniziasottolinea iniziasottolinee iniziasottosottoargomento iniziasottosottocapoverso \ -iniziasottosottosottoargomento iniziasottosottosottocapoverso iniziasottosottosottosottoargomento iniziasottosottosottosottocapoverso iniziaspecialitem \ -iniziaspeech iniziaspformula iniziaspread iniziastartstop iniziastaticMPfigure \ +iniziaquotation iniziaquote iniziarandomized iniziarandomseed iniziarawsetups \ +iniziareadingfile iniziareferenceprefix iniziaregime iniziareusableMPgraphic iniziariga \ +iniziascript iniziasdformula iniziasection iniziasectionblock iniziasectionblockenvironment \ +iniziasectionlevel iniziasetups iniziasfondo iniziashapebox iniziashift \ +iniziasidebar iniziasimplecolumns iniziaspecialitem iniziaspeech iniziaspformula \ +iniziasplitformula iniziaspread iniziastandardmakeup iniziastartstop iniziastaticMPfigure \ iniziastaticMPgraphic iniziastrictinspectnextcharacter iniziastrut iniziastyle iniziasubformulas \ -iniziasubjectlevel iniziasubsentence iniziasubstack iniziasymbolset iniziatabella \ -iniziatable iniziatablehead iniziatables iniziatabletail iniziatabulate \ -iniziatabulatehead iniziatabulatetail iniziatagged iniziatbinom iniziatesta \ -iniziatestoaiuto iniziatestoincorniciato iniziatexcode iniziatexdefinition iniziatext \ -iniziatextbackground iniziatextbackgroundmanual iniziatextcolor iniziatextcolorintent iniziatextflow \ -iniziatitolo iniziatokens iniziatransparent iniziatypescript iniziatypescriptcollection \ -iniziaunderdash iniziaunderdashes iniziaunderdot iniziaunderdots iniziaunderrandom \ -iniziaunderrandoms iniziaunderstrike iniziaunderstrikes iniziaunframed iniziauniqueMPgraphic \ -iniziauniqueMPpagegraphic iniziaunpacked iniziausableMPgraphic iniziauseMPgraphic iniziausemathstyleparameter \ -iniziausingbtxspecification iniziavaia iniziavbox iniziavboxregister iniziavboxtohbox \ -iniziavboxtohboxseparator iniziaviewerlayer iniziavtop iniziavtopregister iniziaxcell \ -iniziaxcellgroup iniziaxfrac iniziaxgroup iniziaxmldisplayverbatim iniziaxmlinlineverbatim \ -iniziaxmlraw iniziaxmlsetups iniziaxrow iniziaxrowgroup iniziaxtable \ -iniziaxtablebody iniziaxtablefoot iniziaxtablehead iniziaxtablenext iniziaxxfrac \ -inlinebuffer inlinedbox inlinemath inlinemathematics inlinemessage \ -inlineordisplaymath inlinerange inmaframed innerflushshapebox input \ -inputfilebarename inputfilename inputfilerealsuffix inputfilesuffix inputgivenfile \ -inriga insertpages installactionhandler installactivecharacter installalingua \ -installanddefineactivecharacter installattributestack installautocommandhandler installautosetuphandler installbasicautosetuphandler \ -installbasicparameterhandler installbottomframerenderer installcommandhandler installcorenamespace installdefinehandler \ -installdefinitionset installdefinitionsetmember installdirectcommandhandler installdirectparameterhandler installdirectparametersethandler \ -installdirectsetuphandler installdirectstyleandcolorhandler installframedautocommandhandler installframedcommandhandler installleftframerenderer \ -installnamespace installoutputroutine installpagearrangement installparameterhandler installparameterhashhandler \ -installparametersethandler installparentinjector installrightframerenderer installrootparameterhandler installsetuphandler \ -installsetuponlycommandhandler installshipoutmethod installsimplecommandhandler installsimpleframedcommandhandler installstyleandcolorhandler \ -installswitchcommandhandler installswitchsetuphandler installtexdirective installtextracker installtopframerenderer \ -installunitsseparator installunitsspace installversioninfo integerrounding intermezzo \ -intertext intorno invokepageheandler istltdir istrtdir \ -italic italicbold italiccorrection itemtag jobfilename \ -jobfilesuffix kap keeplinestogether keepunwantedspaces kerncharacters \ -koreancirclenumerals koreannumerals koreannumeralsc koreannumeralsp koreanparentnumerals \ -languageCharacters languagecharacters languagecharwidth lastcounter lastcountervalue \ -lastdigit lastlinewidth lastnaturalboxdp lastnaturalboxht lastnaturalboxwd \ -lastpredefinedsymbol lastrealpage lastrealpagenumber lastsubcountervalue lastsubpage \ -lastsubpagenumber lasttwodigits lastuserpage lastuserpagenumber lateluacode \ -layeredtext layerheight layerwidth lazysavetaggedtwopassdata lazysavetwopassdata \ -lbox left leftbottombox leftbox lefthbox \ -leftorrighthbox leftorrightvbox leftorrightvtop leftskipadaption leftsubguillemot \ -lefttopbox lefttorighthbox lefttorightvbox lefttorightvtop letbeundefined \ -letcatcodecommand letcscsname letcsnamecs letcsnamecsname letdummyparameter \ -letempty letgvalue letgvalueempty letgvalurelax lettera \ -letterampersand letterat letterbackslash letterbar letterbgroup \ -letterclosebrace lettercolon letterdollar letterdoublequote lettere \ -letteregroup letterescape letterexclamationmark letterhash letterhat \ -letterleftbrace letterless lettermore letteropenbrace letterpercent \ -letterquestionmark letterrightbrace lettersinglequote letterslash letterspacing \ -lettertilde letterunderscore letvalue letvalueempty letvaluerelax \ -lfence lhbox limitatelines limitatetext limtatefirstline \ +iniziasubject iniziasubjectlevel iniziasubsection iniziasubsentence iniziasubstack \ +iniziasubsubject iniziasubsubsection iniziasubsubsubject iniziasubsubsubsection iniziasubsubsubsubject \ +iniziasubsubsubsubsection iniziasubsubsubsubsubject iniziasuffixtext iniziasymbolset iniziatable \ +iniziatablehead iniziatables iniziatabletail iniziatabletext iniziatabulate \ +iniziatabulatehead iniziatabulatetail iniziatagged iniziataglabeltext iniziatesta \ +iniziatexcode iniziatexdefinition iniziatext iniziatextbackground iniziatextbackgroundmanual \ +iniziatextcolor iniziatextcolorintent iniziatextflow iniziatextmakeup iniziatitle \ +iniziatokens iniziatransparent iniziatypescript iniziatypescriptcollection iniziatyping \ +iniziauniqueMPgraphic iniziauniqueMPpagegraphic iniziaunittext iniziaunpacked iniziausableMPgraphic \ +iniziauseMPgraphic iniziausemathstyleparameter iniziausingbtxspecification iniziavaia iniziavbox \ +iniziavboxregister iniziavboxtohbox iniziavboxtohboxseparator iniziaviewerlayer iniziavtop \ +iniziavtopregister iniziaxcell iniziaxcellgroup iniziaxgroup iniziaxmldisplayverbatim \ +iniziaxmlinlineverbatim iniziaxmlraw iniziaxmlsetups iniziaxrow iniziaxrowgroup \ +iniziaxtable iniziaxtablebody iniziaxtablefoot iniziaxtablehead iniziaxtablenext \ +inriga installalingua intorno lettera lettere \ lineanera lineasottile lineatesto lineenere lineeriempimento \ -lineesottili linespanningtext lingua linguaprincipale listcitation \ -listcite listnamespaces llap loadanyfile loadanyfileonce \ -loadbtxdefinitionfile loadbtxreplacementfile loadcldfile loadcldfileonce loadfontgoodies \ -loadluafile loadluafileonce loadspellchecklist loadtexfile loadtexfileonce \ -loadtypescriptfile localframed localframedwithsettings localhsize localpopbox \ -localpopmacro localpushbox localpushmacro localundefine locatedfilepath \ -locatefilepath locfilename lomihi lowerbox lowercased \ -lowercasestring lowerleftdoubleninequote lowerleftsingleninequote lowerrightdoubleninequote lowerrightsingleninequote \ -lrtbbox ltop luaTeX luacode luaconditional \ -luaenvironment luaexpanded luafunction luajitTeX luamajorversion \ -luaminorversion luaparameterset luasetup luaversion lunghezzaelenco \ -m mLeftarrow mLeftrightarrow mRightarrow maframed \ -makecharacteractive makerawcommalist makestrutofbox mapfontsize marcatura \ -margindata markcontent markinjector mat matematica \ -math mathbf mathbi mathblackboard mathbs \ -mathcommand mathdefault mathfraktur mathfunction mathit \ -mathitalic mathop mathrm mathscript mathsl \ -mathss mathtext mathtextbf mathtextbi mathtextbs \ -mathtextit mathtextsl mathtexttf mathtf mathtriplet \ -mathtt mathupright mathword mathwordbf mathwordbi \ -mathwordbs mathwordit mathwordsl mathwordtf mbox \ -mcframed md measure measured medskip \ -medspace menuinterattivo menzione mequal mese \ -message metaTeX mettielenco mettielencocombinato mettifiancoafianco \ -mettiformula mettiingriglia mettinotepdp mettinotepdplocali mettinumeropagina \ -mettiregistro mettisegnalibro mettisottoformula mettiunosullaltro mfence \ -mfunction mfunctionlabeltext mhbox mhookleftarrow mhookrightarrow \ -middle middlebox midhbox minimalhbox mixedcaps \ -mkvibuffer mleftarrow mleftharpoondown mleftharpoonup mleftrightarrow \ -mleftrightharpoons mmapsto moduleparameter molecule mono \ -monobold mononormal monthlong monthshort mostraambientefontdeltesto \ -mostracolore mostracornice mostrafontdeltesto mostragriglia mostragruppocolori \ -mostraimpostazioni mostralyout mostramakeup mostrasetsimboli mostrastampa \ -mostrastruts mostratavolozza mp mprandomnumber mrel \ -mrightarrow mrightharpoondown mrightharpoonup mrightleftharpoons mrightoverleftarrow \ -mtext mtriplerel mtwoheadleftarrow mtwoheadrightarrow namedheadnumber \ -namedstructureheadlocation namedstructureuservariable namedstructurevariable namedtaggedlabeltexts nascondere \ -nascondiblocchi naturalhbox naturalhpack naturalvbox naturalvcenter \ -naturalvpack naturalvtop naturalwd negatecolorbox negated \ -negthinspace newattribute newcatcodetable newcounter newevery \ -newfrenchspacing newmode newsignal newsystemmode nextbox \ -nextboxdp nextboxht nextboxhtdp nextboxwd nextcounter \ -nextcountervalue nextdepth nextparagraphs nextrealpage nextrealpagenumber \ -nextsubcountervalue nextsubpage nextsubpagenumber nextuserpage nextuserpagenumber \ -nientelineecimafondo nientelineintestazionepdp nientespazio nobar nocap \ -nocitation nocite nodetostring noffigurepages noflines \ -noflocalfloats noindentation noitem nonfrenchspacing nonmathematics \ -normal normalboldface normalframedwithsettings normalizebodyfontsize normalizedfontsize \ -normalizefontdepth normalizefontheight normalizefontline normalizefontwidth normalizetextdepth \ -normalizetextheight normalizetextline normalizetextwidth normaltypeface nota \ -notesymbol ntimes numberofpoints numeri numeriromani \ +lineesottili lingua linguaprincipale lunghezzaelenco marcatura \ +matematica menuinterattivo mese mettielenco mettielencocombinato \ +mettifiancoafianco mettiformula mettiingriglia mettinotepdp mettinotepdplocali \ +mettinumeropagina mettiregistro mettisegnalibro mettisottoformula mettiunosullaltro \ +mostraambientefontdeltesto mostracolore mostracornice mostrafontdeltesto mostragriglia \ +mostragruppocolori mostraimpostazioni mostralyout mostramakeup mostrasetsimboli \ +mostrastampa mostrastruts mostratavolozza nascondiblocchi nientelineecimafondo \ +nientelineintestazionepdp nientespazio nota numeri numeriromani \ numeroformula numeropagina numeropaginacompleto numerotesta numerotestacorrente \ -obeydepth objectdepth objectheight objectmargin objectwidth \ -obox offset offsetbox onedigitrounding ordinaldaynumber \ -ordinalstr ornamenttext outputfilename outputstreambox outputstreamcopy \ -outputstreamunvbox outputstreamunvcopy over overbar overbars \ -overbartext overbarunderbar overbrace overbracetext overbraceunderbrace \ -overbracket overbrackettext overbracketunderbracket overlaybutton overlaycolor \ -overlaydepth overlayfigure overlayheight overlaylinecolor overlaylinewidth \ -overlayoffset overlayrollbutton overlaywidth overleftarrow overleftharpoondown \ -overleftharpoonup overleftrightarrow overloaderror overparent overparenttext \ -overparentunderparent overrightarrow overrightharpoondown overrightharpoonup overset \ -overstrike overstrikes overtwoheadleftarrow overtwoheadrightarrow pagearea \ -pagebreak pagefigure pagegridspanwidth pageinjection pagestaterealpage \ -pagina paletsize pdfTeX pdfactualtext pdfbackendactualtext \ -pdfbackendcurrentresources pdfbackendsetcatalog pdfbackendsetcolorspace pdfbackendsetextgstate pdfbackendsetinfo \ -pdfbackendsetname pdfbackendsetpageattribute pdfbackendsetpageresource pdfbackendsetpagesattribute pdfbackendsetpattern \ -pdfbackendsetshade pdfcolor pdfeTeX ped pedap \ -percent percentdimen perlungo permitcaretescape permitcircumflexescape \ -permitspacesbetweengroups persiandecimals persiannumerals phantom phantombox \ -pickupgroupedcommand placeattachments placebtxrendering placecitation placecomments \ -placecurrentformulanumber placedbox placefloat placefloatwithsetups placeframed \ -placehelp placeinitial placelayer placelayeredtext placelistofpublications \ -placelistofsorts placelistofsynonyms placelocalnotes placement placenamedfloat \ -placenamedformula placenotes placepairedbox placeparallel placerawlist \ -placerenderingwindow popattribute popmacro popmode popsystemmode \ -positionoverlay positionregionoverlay posizionanumerotesta posizionatestotesta posizione \ -postponenotes predefinedfont predefinefont predefinesymbol prefixedpagenumber \ -prendibuffer prendimarcatura prependetoks prependgvalue prependtocommalist \ -prependtoks prependtoksonce prependvalue presetdocument presetfieldsymbols \ -pretocommalist prevcounter prevcountervalue preventmode prevrealpage \ -prevrealpagenumber prevsubcountervalue prevsubpage prevsubpagenumber prevuserpage \ -prevuserpagenumber procent processMPbuffer processMPfigurefile processaction \ -processallactionsinset processassignlist processassignmentcommand processassignmentlist processbetween \ -processbodyfontenvironmentlist processcolorcomponents processcommacommand processcommalist processcommalistwithparameters \ -processcontent processfile processfilemany processfilenone processfileonce \ -processfirstactioninset processisolatedchars processisolatedwords processlinetablebuffer processlinetablefile \ -processlist processmonth processranges processseparatedlist processtexbuffer \ -processtokens processuntil processxtablebuffer processyear prodotto \ -profiledbox profilegivenbox progetto programma pseudoMixedCapped \ -pseudoSmallCapped pseudoSmallcapped pseudosmallcapped pulsante pulsantemenu \ -pulsantinterazione punti purenumber pushattribute pushbutton \ -pushmacro pushmode pushoutputstream pushsystemmode qquad \ -quad quads qualcheriga quitcommalist quitprevcommalist \ -quittypescriptscanning raisebox randomizetext randomnumber rawcounter \ -rawcountervalue rawdate rawdoifelseinset rawdoifinset rawdoifinsetelse \ -rawgetparameters rawprocessaction rawprocesscommacommand rawprocesscommalist rawstructurelistuservariable \ -rawsubcountervalue rbox readfile readfixfile readjobfile \ -readlocfile readsetfile readsysfile readtexfile readxmlfile \ -realSmallCapped realSmallcapped realpagenumber realsmallcapped recursedepth \ -recurselevel recursestring redoconvertfont referenceprefix referring \ -registerattachment registerctxluafile registerexternalfigure registerfontclass registerhyphenationexception \ -registerhyphenationpattern registermenubuttons registersort registersynonym registerunit \ -regular reimpostamarcatura relatemarking relateparameterhandlers relaxvalueifundefined \ -remainingcharacters removebottomthings removedepth removefromcommalist removelastskip \ -removelastspace removemarkedcontent removepunctuation removesubstring removetoks \ -removeunwantedspaces replacefeature replaceincommalist replaceword rescan \ -rescanwithsetup resetMPdrawing resetMPenvironment resetMPinstance resetallattributes \ -resetandaddfeature resetbar resetbreakpoints resetbuffer resetcharacteralign \ -resetcharacterkerning resetcharacterspacing resetcharacterstripping resetcollector resetcounter \ -resetdigitsmanipulation resetdirection resetfeature resetflag resetfontcolorsheme \ -resetfontfallback resetfontsolution resethyphenationfeatures resetinjector resetinteractionmenu \ -resetitaliccorrection resetlayer resetlocalfloats resetmarker resetmode \ -resetpagenumber resetparallel resetpath resetpenalties resetprofile \ -resetreference resetreplacement resetscript resetsetups resetshownsynonyms \ -resetsubpagenumber resetsymbolset resetsystemmode resettimer resettrackers \ -resettrialtypesetting resetusedsortings resetusedsynonyms resetuserpagenumber resetvalue \ -resetvisualizers reshapebox resolvedglyphdirect resolvedglyphstyled restartcounter \ -restorebox restorecatcodes restorecounter restorecurrentattributes restoreendofline \ -restoreglobalbodyfont reusableMPgraphic reuseMPgraphic reuserandomseed revivefeature \ -rfence rhbox rif riferimento riferimentopagina \ -riferimentotesto riflessione rigariempimento right rightbottombox \ -rightbox righthbox rightorleftpageaction rightskipadaption rightsubguillemot \ -righttolefthbox righttoleftvbox righttoleftvtop righttopbox rigovuoto \ -rlap robustaddtocommalist robustdoifelseinset robustdoifinsetelse robustpretocommalist \ -rollbutton roman rtop ruledhbox ruledhpack \ -ruledmbox ruledtopv ruledtpack ruledvbox ruledvpack \ -ruledvtop runMPbuffer runninghbox ruota safechar \ -sans sansbold sansnormal sansserif savebox \ -savebtxdataset savebuffer savecounter savecurrentattributes savenormalmeaning \ -savetaggedtwopassdata savetwopassdata sbox scala schermo \ -scrividentroelenco scriviinelenco sd secondoffivearguments secondoffourarguments \ -secondofsixarguments secondofthreearguments secondofthreeunexpanded secondoftwoarguments secondoftwounexpanded \ -segnalibro select selezionablocchi serializecommalist serializedcommalist \ -serif serifbold serifnormal setJSpreamble setMPlayer \ -setMPpositiongraphic setMPpositiongraphicrange setMPtext setMPvariable setMPvariables \ -setbar setbigbodyfont setboxllx setboxlly setbreakpoints \ -setcapstrut setcatcodetable setcharacteralign setcharactercasing setcharactercleaning \ -setcharacterkerning setcharacterspacing setcharacterstripping setcharstrut setcollector \ -setcolormodell setcounter setcounterown setcurrentfontclass setdataset \ -setdefaultpenalties setdigitsmanipulation setdirection setdocumentargument setdocumentargumentdefault \ -setdocumentfilename setdummyparameter setelementexporttag setemeasure setevalue \ -setevariable setevariables setfirstline setflag setfont \ -setfontcolorsheme setfontfeature setfontsolution setfontstrut setfractions \ -setgmeasure setgvalue setgvariable setgvariables sethboxregister \ -sethyphenatedurlafter sethyphenatedurlbefore sethyphenatedurlnormal sethyphenationfeatures setinitial \ -setinjector setinteraction setinterfacecommand setinterfaceconstant setinterfaceelements \ -setinterfacemessage setinterfacevariable setinternalrendering setitaliccorrection setlayer \ -setlayerframed setlayertext setlinefiller setlocalhsize setmainbodyfont \ -setmainparbuilder setmarker setmarking setmathstyle setmeasure \ -setmessagetext setmode setnostrut setnote setnotetext \ -setobject setoldstyle setpagegrid setpagereference setpagestate \ -setpagestaterealpageno setpenalties setpercentdimen setposition setpositionbox \ -setpositiondata setpositiondataplus setpositiononly setpositionplus setpositionstrut \ -setprofile setrandomseed setreference setreferencedobject setregisterentry \ -setreplacement setrigidcolumnbalance setrigidcolumnhsize setscript setsectionblock \ -setsimplecolumnhsize setsmallbodyfont setsmallcaps setstackbox setstructurepageregister \ -setstrut setsuperiors setsystemmode settabular settaggedmetadata \ -settext settightobject settightreferencedobject settightunreferencedobject settrialtypesetting \ -setuevalue setugvalue setunreferencedobject setup setupMPgraphics \ -setupMPinstance setupMPpage setupMPvariables setupTABLE setupTEXpage \ -setupattachment setupbackend setupbar setupbleeding setupbookmark \ -setupbtx setupbtxdataset setupbtxlist setupbtxregister setupbtxrendering \ -setupbutton setupcharacterkerning setupcharacterspacing setupchemical setupchemicalframed \ -setupcollector setupcolumnspan setupcombination setupcounter setupdataset \ -setupdelimitedtext setupdescription setupdirections setupdocument setupeffect \ -setupenumeration setupenv setupexport setupexternalfigure setupexternalsoundtracks \ -setupfieldbody setupfieldcategory setupfieldcontentframed setupfieldlabelframed setupfieldtotalframed \ -setupfiller setupfirstline setupfittingpage setupfloatcaption setupfontexpansion \ -setupfontprotrusion setupfonts setupfontsolution setupformula setupformulaframed \ -setupframedcontent setupframedtext setupglobalreferenceprefix setupheadalternative setuphelp \ -setuphigh setuphighlight setuphyphenation setupindentedtext setupinitial \ -setupinsertion setupitaliccorrection setupitemgroup setuplabel setuplayer \ -setuplayeredtext setuplayouttext setuplinefiller setuplinefillers setuplinenote \ -setuplinetable setuplistalternative setuplistextra setuplocalfloats setuplocalinterlinespace \ -setuplow setuplowhigh setuplowmidhigh setupmarginblock setupmargindata \ -setupmarginframed setupmarginrule setupmathalignment setupmathcases setupmathematics \ -setupmathfence setupmathfraction setupmathframed setupmathmatrix setupmathornament \ -setupmathradical setupmathstackers setupmathstyle setupmixedcolumns setupmodule \ -setupnotation setupnotations setupnote setupnotes setupoffset \ -setupoffsetbox setupoutputroutine setuppagechecker setuppagegrid setuppagegridarea \ -setuppagegridareatext setuppagegridlines setuppagegridspan setuppagegridstart setuppageinjection \ -setuppageinjectionalternative setuppageshift setuppagestate setuppairedbox setuppaper \ -setupparagraph setupparagraphintro setupparallel setupperiods setupplacement \ -setuppositionbar setupprocessor setupprofile setupquotation setuprealpagenumber \ -setupreferenceformat setupreferenceprefix setupreferencestructureprefix setupregisters setuprenderingwindow \ -setups setupscale setupscript setupscripts setupselector \ -setupshift setupsidebar setupspellchecking setupstretched setupstruts \ -setupstyle setupsubformula setuptabulation setuptagging setuptextbackground \ -setuptextflow setuptooltip setupunit setupuserpagenumber setupversion \ -setupviewerlayer setupvspacing setupwithargument setupwithargumentswapped setupxml \ -setupxtable setuvalue setuxvalue setvalue setvariable \ -setvariables setvboxregister setvisualizerfont setvtopregister setwidthof \ -setxmeasure setxvalue setxvariable setxvariables sfondo \ -sfrac shapedhbox showallmakeup showattributes showboxes \ -showbtxdatasetauthors showbtxdatasetcompleteness showbtxdatasetfields showbtxfields showbtxhashedauthors \ -showbtxtables showchardata showcharratio showcolorbar showcolorcomponents \ -showcolorset showcolorstruts showcounter showdirectives showdirsinmargin \ -showedebuginfo showexperiments showfont showfontdata showfontkerns \ -showfontparameters showfontstrip showfontstyle showglyphs showgridsnapping \ -showhelp showhyphenationtrace showhyphens showinjector showjustification \ -showkerning showlayoutcomponents showligature showligatures showlogcategories \ -showmargins showmessage showminimalbaseline shownextbox showotfcomposition \ -showparentchain showsetupsdefinition showtimer showtokens showtrackers \ -showvalue showvariable showwarning simbolo simplegroupedcommand \ -singalcharacteralign singlebond sixthofsixarguments slanted slantedbold \ -slicepages slovenianNumerals sloveniannumerals small smallbodyfont \ -smallbold smallbolditalic smallboldslanted smallcappedcharacters smallcappedromannumerals \ -smaller smallitalicbold smallnormal smallskip smallslanted \ -smallslantedbold smalltype smash smashbox smashboxed \ -smashedhbox smashedvbox snaptogrid someheadnumber somekindoftab \ -somelocalfloat somenamedheadnumber someplace sottoargomento sottocapoverso \ -sottosottoargomento sottosottocapoverso sottosottosottoargomento sottosottosottocapoverso sottosottosottosottoargomento \ -sottosottosottosottocapoverso sp spanishNumerals spanishnumerals spazifissi \ -spazio spaziofisso speech spessoreriga spezzaoggettomobile \ -splitatasterisk splitatcolon splitatcolons splitatcomma splitdfrac \ -splitfilename splitfrac splitoffbase splitofffull splitoffkind \ -splitoffname splitoffpath splitoffroot splitofftokens splitofftype \ -splitstring spreadhbox sqrt stackcampi stackrel \ -startregister startstructurepageregister stirato stopregister stopstructurepageregister \ -strictdoifelsenextoptional strictdoifnextoptionalelse stripcharacter strippedcsname stripspaces \ -structurelistuservariable structurenumber structuretitle structureuservariable structurevariable \ -strut strutdp strutht struthtdp struttedbox \ -strutwd style styleinstance subpagenumber subsentence \ -substituteincommalist subtractfeature swapcounts swapdimens swapface \ -swapmacros swaptypeface switchstyleonly switchtocolor switchtointerlinespace \ -symbolreference synchronizeblank synchronizeindenting synchronizemarking synchronizeoutputstreams \ -synchronizestrut synchronizewhitespace systemlog systemlogfirst systemloglast \ -systemsetups tLeftarrow tLeftrightarrow tRightarrow tabella \ -tabulateautoline tabulateautorule tabulateline tabulaterule taggedctxcommand \ -taggedlabeltexts tbinom tbox tequal terminaJScode \ -terminaJSpreamble terminaMPclip terminaMPcode terminaMPdefinitions terminaMPdrawing \ -terminaMPenvironment terminaMPextensions terminaMPinclusions terminaMPinitializations terminaMPpage \ -terminaMPpositiongraphic terminaMPpositionmethod terminaMPrun terminaTABLE terminaTABLEbody \ -terminaTABLEfoot terminaTABLEhead terminaTABLEnext terminaTC terminaTD \ -terminaTDs terminaTEXpage terminaTH terminaTN terminaTR \ -terminaTRs terminaTX terminaTY terminaallmodes terminaambiente \ -terminaargomento terminaarrangedpages terminaaside terminaattachment terminabar \ -terminabinom terminabitmapimage terminablockquote terminabtxrenderingdefinitions terminabuffer \ -terminabutton terminacapitolo terminacapoverso terminacatcodetable terminacharacteralign \ -terminacheckedfences terminachemical terminacitazione terminacollect terminacollecting \ -terminacolore terminacolorintent terminacoloronly terminacolorset terminacolumns \ -terminacolumnspan terminacombination terminacomment terminacommento terminacomponenet \ -terminacontextcode terminacontextdefinitioncode terminactxfunction terminactxfunctiondefinition terminacurrentcolor \ -terminacurrentlistentrywrapper terminadbinom terminadelimited terminadelimitedtext terminadfrac \ -terminadisplaymath terminadmath terminadocument terminaeffect terminaelement \ -terminaelemento terminaelenco terminaembeddedxtable terminaendofline terminaexceptions \ -terminaexpanded terminaexpandedcollect terminaextendedcatcodetable terminaexternalfigurecollection terminafigura \ -terminafigure terminafitfieldframed terminafittingpage terminafloatcombination terminafont \ -terminafontclass terminafontsolution terminaformula terminaformulas terminafrac \ -terminaframedcontent terminaframedtext terminagrafico terminagridsnapping terminahbox \ -terminahboxestohbox terminahboxregister terminahelptext terminahiddenbar terminahiding \ -terminahighlight terminahyphenation terminaimath terminaimpaccato terminaincorniciato \ -terminaindentation terminaindentedtext terminainmframed terminainteraction terminainterface \ -terminaintermezzo terminaintertext terminaitemgroup terminaknockout terminalayout \ -terminalineamargine terminalineatesto terminalinecorrection terminalinefiller terminalinenumbering \ -terminalinetable terminalinetablebody terminalinetablecell terminalinetablehead terminalocalfootnotes \ -terminalocalheadsetup terminalocallinecorrection terminalocalnotes terminalocalsetups terminalua \ -terminaluacode terminaluaparameterset terminaluasetups terminamakeup terminamarginblock \ -terminamarkedcontent terminamathmode terminamathstyle terminamatrices terminamcframed \ -terminamdformula terminamenuinterattivo terminamenzione terminamettiformula terminamframed \ -terminamixedcolumns terminamode terminamodeset terminamodule terminamoduletestsection \ -terminampformula terminanamedsection terminanamedsubformulas terminanarrow terminanarrower \ -terminanegative terminanicelyfilledbox terminanobar terminanointerference terminanotallmodes \ -terminanotext terminanotmode terminaopposite terminaoutputstream terminaoverlay \ -terminaoverprint terminapagecomment terminapagefigure terminapagegrid terminapagegridspan \ -terminapagelayout terminapar terminaparagraph terminaparagraphs terminaparagraphscell \ -terminaparbuilder terminapath terminaplacepairedbox terminapositioning terminapositionoverlay \ -terminapositive terminapostponing terminaprocessassignmentcommand terminaprocessassignmentlist terminaprocesscommacommand \ -terminaprocesscommalist terminaprodotto terminaprogetto terminaprotect terminaprotectedcolors \ -terminapubblicazione terminapunctuation terminarandomized terminarandomseed terminarawsetups \ -terminareadingfile terminareferenceprefix terminaregime terminareusableMPgraphic terminariga \ -terminasbarrati terminasbarrato terminascript terminasdformula terminasectionblock \ -terminasectionblockenvironment terminasectionlevel terminasetups terminasfondo terminasfrac \ -terminashapebox terminashift terminasidebar terminasimplecolumns terminasopralinea \ -terminasopralinee terminasottoargomento terminasottocapoverso terminasottolinea terminasottolinee \ -terminasottosottoargomento terminasottosottocapoverso terminasottosottosottoargomento terminasottosottosottocapoverso terminasottosottosottosottoargomento \ -terminasottosottosottosottocapoverso terminaspecialitem terminaspeech terminaspformula terminaspread \ -terminastartstop terminastaticMPfigure terminastaticMPgraphic terminastrictinspectnextcharacter terminastrut \ -terminastyle terminasubformulas terminasubjectlevel terminasubsentence terminasubstack \ -terminasymbolset terminatabella terminatable terminatablehead terminatables \ -terminatabletail terminatabulate terminatabulatehead terminatabulatetail terminatagged \ -terminatbinom terminatesta terminatestoaiuto terminatestoincorniciato terminatexcode \ +pagina paroladestra ped pedap perlungo \ +posizionanumerotesta posizionatestotesta posizione prendibuffer prendimarcatura \ +prodotto progetto programma pulsante pulsantemenu \ +pulsantinterazione punti qualcheriga reimpostamarcatura rif \ +riferimento riferimentopagina riferimentotesto riflessione rigariempimento \ +rigovuoto ruota scala schermo scrividentroelenco \ +scriviinelenco segnalibro selezionablocchi settext sfondo \ +simbolo spazifissi spazio spaziofisso spessoreriga \ +spezzaoggettomobile stackcampi stirato terminaJScode terminaJSpreamble \ +terminaLUA terminaMP terminaMPclip terminaMPcode terminaMPdefinitions \ +terminaMPdrawing terminaMPenvironment terminaMPextensions terminaMPinclusions terminaMPinitializations \ +terminaMPpage terminaMPpositiongraphic terminaMPpositionmethod terminaMPrun terminaPARSEDXML \ +terminaTABLE terminaTABLEbody terminaTABLEfoot terminaTABLEhead terminaTABLEnext \ +terminaTC terminaTD terminaTDs terminaTEX terminaTEXpage \ +terminaTH terminaTN terminaTR terminaTRs terminaTX \ +terminaTY terminaXML terminaalign terminaalignment terminaallineacentro \ +terminaallineadestra terminaallineasinistra terminaallmodes terminaambiente terminaappendices \ +terminaarrangedpages terminaaside terminaattachment terminabackmatter terminabar \ +terminabbordermatrix terminabitmapimage terminablockquote terminabodymatter terminabordermatrix \ +terminaboxedcolumns terminabtxlabeltext terminabtxrenderingdefinitions terminabuffer terminacases \ +terminacatcodetable terminacenteraligned terminachapter terminacharacteralign terminacheckedfences \ +terminachemical terminachemicaltext terminacollect terminacollecting terminacolore \ +terminacolorintent terminacoloronly terminacolorset terminacolumns terminacolumnspan \ +terminacombination terminacomment terminacomponenet terminacontextcode terminacontextdefinitioncode \ +terminactxfunction terminactxfunctiondefinition terminacurrentcolor terminacurrentlistentrywrapper terminadelimited \ +terminadelimitedtext terminadisplaymath terminadmath terminadocument terminaeffect \ +terminaelement terminaelemento terminaembeddedxtable terminaendnote terminaendofline \ +terminaexceptions terminaexpanded terminaexpandedcollect terminaextendedcatcodetable terminaexternalfigurecollection \ +terminafact terminafigure terminafiguretext terminafittingpage terminafixed \ +terminafloatcombination terminafont terminafontclass terminafontsolution terminafootnote \ +terminaformula terminaformulas terminaframedcell terminaframedcontent terminaframedrow \ +terminaframedtable terminaframedtext terminafrontmatter terminagraphictext terminagridsnapping \ +terminahanging terminahbox terminahboxestohbox terminahboxregister terminaheadtext \ +terminahelptext terminahiding terminahighlight terminahyphenation terminaimath \ +terminaimpaccato terminaincorniciato terminaindentation terminaindentedtext terminainteraction \ +terminainterface terminaintermezzotext terminaintertext terminaitemgroup terminaitemgroupcolumns \ +terminaitemize terminaknockout terminalabeltext terminalayout terminalegend \ +terminalinealignment terminalineamargine terminalineatesto terminalinecorrection terminalinefiller \ +terminalinenumbering terminalines terminalinetable terminalinetablebody terminalinetablecell \ +terminalinetablehead terminalocalfootnotes terminalocalheadsetup terminalocallinecorrection terminalocalnotes \ +terminalocalsetups terminalua terminaluacode terminaluaparameterset terminaluasetups \ +terminamakeup terminamarginblock terminamarkedcontent terminamathalignment terminamathcases \ +terminamathlabeltext terminamathmatrix terminamathmode terminamathstyle terminamatrices \ +terminamatrix terminamaxaligned terminamdformula terminamenuinterattivo terminamettiformula \ +terminamiddlealigned terminamiddlemakeup terminamixedcolumns terminamode terminamodeset \ +terminamodule terminamoduletestsection terminampformula terminanamedsection terminanamedsubformulas \ +terminanarrow terminanarrower terminanegative terminanicelyfilledbox terminanointerference \ +terminanotallmodes terminanotext terminanotmode terminaoperatortext terminaopposite \ +terminaoutputstream terminaoverlay terminaoverprint terminapagecomment terminapagefigure \ +terminapagegrid terminapagegridspan terminapagelayout terminapagemakeup terminapar \ +terminaparagraph terminaparagraphs terminaparagraphscell terminaparbuilder terminapart \ +terminapath terminaplacechemical terminaplacefigure terminaplacefloat terminaplacegraphic \ +terminaplaceintermezzo terminaplacelegend terminaplacepairedbox terminaplacetable terminapositioning \ +terminapositionoverlay terminapositive terminapostponing terminaprefixtext terminaprocessassignmentcommand \ +terminaprocessassignmentlist terminaprocesscommacommand terminaprocesscommalist terminaprodotto terminaprogetto \ +terminaprotect terminaprotectedcolors terminapubblicazione terminapunctuation terminaquotation \ +terminaquote terminarandomized terminarandomseed terminarawsetups terminareadingfile \ +terminareferenceprefix terminaregime terminareusableMPgraphic terminariga terminascript \ +terminasdformula terminasection terminasectionblock terminasectionblockenvironment terminasectionlevel \ +terminasetups terminasfondo terminashapebox terminashift terminasidebar \ +terminasimplecolumns terminaspecialitem terminaspeech terminaspformula terminasplitformula \ +terminaspread terminastandardmakeup terminastartstop terminastaticMPfigure terminastaticMPgraphic \ +terminastrictinspectnextcharacter terminastrut terminastyle terminasubformulas terminasubject \ +terminasubjectlevel terminasubsection terminasubsentence terminasubstack terminasubsubject \ +terminasubsubsection terminasubsubsubject terminasubsubsubsection terminasubsubsubsubject terminasubsubsubsubsection \ +terminasubsubsubsubsubject terminasuffixtext terminasymbolset terminatable terminatablehead \ +terminatables terminatabletail terminatabletext terminatabulate terminatabulatehead \ +terminatabulatetail terminatagged terminataglabeltext terminatesta terminatexcode \ terminatexdefinition terminatext terminatextbackground terminatextbackgroundmanual terminatextcolor \ -terminatextcolorintent terminatextflow terminatitolo terminatokens terminatransparent \ -terminatypescript terminatypescriptcollection terminaunderdash terminaunderdashes terminaunderdot \ -terminaunderdots terminaunderrandom terminaunderrandoms terminaunderstrike terminaunderstrikes \ -terminaunframed terminauniqueMPgraphic terminauniqueMPpagegraphic terminaunpacked terminausableMPgraphic \ -terminauseMPgraphic terminausemathstyleparameter terminausingbtxspecification terminavaia terminavbox \ -terminavboxregister terminavboxtohbox terminavboxtohboxseparator terminaviewerlayer terminavtop \ -terminavtopregister terminaxcell terminaxcellgroup terminaxfrac terminaxgroup \ -terminaxmldisplayverbatim terminaxmlinlineverbatim terminaxmlraw terminaxmlsetups terminaxrow \ -terminaxrowgroup terminaxtable terminaxtablebody terminaxtablefoot terminaxtablehead \ -terminaxtablenext terminaxxfrac testandsplitstring testcolumn testfeature \ -testfeatureonce testoaiuto testoincorniciato testonotapdp testoriempimento \ -testpage testpageonly testpagesync testtokens tex \ -texdefinition texsetup textcitation textcite textcontrolspace \ -textflowcollector textmath textminus textormathchar textplus \ -textvisiblespace tfrac thainumerals thefirstcharacter thenormalizedbodyfontsize \ -theremainingcharacters thickspace thinspace thirdoffivearguments thirdoffourarguments \ -thirdofsixarguments thirdofthreearguments thirdofthreeunexpanded thookleftarrow thookrightarrow \ -threedigitrounding tibetannumerals tieniblocchi tightlayer tinyfont \ -titolo tlap tleftarrow tleftharpoondown tleftharpoonup \ -tleftrightarrow tleftrightharpoons tmapsto tochar tolinenote \ -topbox topleftbox toplinebox toprightbox topskippedbox \ -tracecatcodetables tracedfontname traceoutputroutines tracepositions traduci \ -transparencycomponents transparent trel trightarrow trightharpoondown \ -trightharpoonup trightleftharpoons trightoverleftarrow triplebond truefilename \ -truefontname ttriplerel ttwoheadleftarrow ttwoheadrightarrow twodigitrounding \ -tx txx typ type typebuffer \ -typedefinedbuffer typeface typefile typescriptone typescriptprefix \ -typescriptthree typescripttwo typesetbuffer typesetfile uconvertnumber \ -uedcatcodecommand undefinevalue undepthed underbar underbars \ -underbartext underbrace underbracetext underbracket underbrackettext \ -underdash underdashes underdot underdots underleftarrow \ -underleftharpoondown underleftharpoonup underleftrightarrow underparent underparenttext \ -underrandom underrandoms underrightarrow underrightharpoondown underrightharpoonup \ -underset understrike understrikes undertwoheadleftarrow undertwoheadrightarrow \ -undoassign unframed unhhbox unihex uniqueMPgraphic \ -uniqueMPpagegraphic unprotected unregisterhyphenationpattern unspaceafter unspaceargument \ -unspaced unspacestring untexargument untexcommand uppercased \ -uppercasestring upperleftdoubleninequote upperleftdoublesixquote upperleftsingleninequote upperleftsinglesixquote \ -upperrightdoubleninequote upperrightdoublesixquote upperrightsingleninequote upperrightsinglesixquote url \ -usaJSscripts usaURL usablocco usacartella usacolonnasonoraesterna \ -usadocumentoesterno usafiguraesterna usamodulo usasimboli usaurl \ -useMPenvironmentbuffer useMPgraphic useMPlibrary useMPrun useMPvariables \ -useblankparameter usebodyfont usebodyfontparameter usebtxdataset usebtxdefinitions \ -usecolors usecomponent usedummycolorparameter usedummystyleandcolor usedummystyleparameter \ -useenvironment useexternalrendering usefigurebase usefile usegridparameter \ -useindentingparameter useindentnextparameter useinterlinespaceparameter uselanguageparameter useluamodule \ -usemathstyleparameter useproduct useprofileparameter useproject usereferenceparameter \ -userpagenumber usesetupsparameter usestaticMPfigure usesubpath usetexmodule \ -usetypescript usetypescriptfile usezipfile utfchar utflower \ -utfupper utilityregisterlength vaia vaiabox vaiapagina \ -vaigiu valorecolore vboxreference verbatim verbatimstring \ -verbosenumber versione verticalgrowingbar verticalpositionbar vglue \ -viewerlayer vl vphantom vpos vsmash \ -vsmashbox vsmashed vspace vspacing wdofstring \ -widthofstring widthspanningtext withoutpt word words \ -wordtonumber writedatatolist writestatus xLeftarrow xLeftrightarrow \ -xRightarrow xdefconvertedargument xequal xfrac xhookleftarrow \ -xhookrightarrow xleftarrow xleftharpoondown xleftharpoonup xleftrightarrow \ -xleftrightharpoons xmapsto xmladdindex xmlafterdocumentsetup xmlaftersetup \ -xmlall xmlappenddocumentsetup xmlappendsetup xmlapplyselectors xmlatt \ -xmlattdef xmlattribute xmlattributedef xmlbadinclusions xmlbeforedocumentsetup \ -xmlbeforesetup xmlchainatt xmlchainattdef xmlchecknamespace xmlcommand \ -xmlconcat xmlconcatrange xmlcontext xmlcount xmldefaulttotext \ -xmldirectives xmldirectivesafter xmldirectivesbefore xmldisplayverbatim xmldoif \ -xmldoifelse xmldoifelseempty xmldoifelseselfempty xmldoifelsetext xmldoifelsevalue \ -xmldoifnot xmldoifnotselfempty xmldoifnottext xmldoifselfempty xmldoiftext \ -xmlelement xmlfilter xmlfirst xmlflush xmlflushcontext \ -xmlflushdocumentsetups xmlflushlinewise xmlflushpure xmlflushspacewise xmlflushtext \ -xmlinclude xmlinclusion xmlinclusions xmlinfo xmlinjector \ -xmlinlineverbatim xmlinstalldirective xmllast xmllastatt xmllastmatch \ -xmlloadbuffer xmlloaddata xmlloaddirectives xmlloadfile xmlloadonly \ -xmlmain xmlmapvalue xmlname xmlnamespace xmlnonspace \ -xmlpath xmlpos xmlposition xmlprependdocumentsetup xmlprependsetup \ -xmlprettyprint xmlprocessbuffer xmlprocessdata xmlprocessfile xmlpure \ -xmlraw xmlrefatt xmlregistereddocumentsetups xmlregisteredsetups xmlregisterns \ -xmlremapname xmlremapnamespace xmlremovedocumentsetup xmlremovesetup xmlresetdocumentsetups \ -xmlresetinjectors xmlresetsetups xmlsave xmlsetentity xmlsetfunction \ -xmlsetinjectors xmlsetsetup xmlsetup xmlshow xmlsnippet \ -xmlstrip xmlstripnolines xmlstripped xmlstrippednolines xmltag \ -xmltexentity xmltext xmltobuffer xmltobufferverbose xmltofile \ -xmlvalue xmlverbatim xrel xrightarrow xrightharpoondown \ -xrightharpoonup xrightleftharpoons xrightoverleftarrow xsplitstring xtriplerel \ -xtwoheadleftarrow xtwoheadrightarrow xxfrac xypos +terminatextcolorintent terminatextflow terminatextmakeup terminatitle terminatokens \ +terminatransparent terminatypescript terminatypescriptcollection terminatyping terminauniqueMPgraphic \ +terminauniqueMPpagegraphic terminaunittext terminaunpacked terminausableMPgraphic terminauseMPgraphic \ +terminausemathstyleparameter terminausingbtxspecification terminavaia terminavbox terminavboxregister \ +terminavboxtohbox terminavboxtohboxseparator terminaviewerlayer terminavtop terminavtopregister \ +terminaxcell terminaxcellgroup terminaxgroup terminaxmldisplayverbatim terminaxmlinlineverbatim \ +terminaxmlraw terminaxmlsetups terminaxrow terminaxrowgroup terminaxtable \ +terminaxtablebody terminaxtablefoot terminaxtablehead terminaxtablenext testonotapdp \ +testoriempimento tieniblocchi traduci usaJSscripts usaURL \ +usablocco usacartella usacolonnasonoraesterna usadocumentoesterno usafiguraesterna \ +usamodulo usasimboli usaurl vaia vaiabox \ +vaiapagina vaigiu valorecolore versione keywordclass.context.nl=\ -AMSTEX AfterPar Alphabeticnumerals AmSTeX \ -And BeforePar Big Bigg Biggl \ -Biggm Biggr Bigl Bigm Bigr \ -CONTEXT Caps Cijfers ConTeXt Context \ -ConvertConstantAfter ConvertToConstant ETEX EveryLine EveryPar \ -GetPar GotoPar Greeknumerals INRSTEX Kap \ -LAMSTEX LATEX LUAJITTEX LUATEX LaTeX \ -LamSTeX Letter Letters Lua LuaTeX \ -LuajitTeX MAAND METAFONT METAFUN METAPOST \ -MKII MKIV MKIX MKVI MKXI \ -MONTHLONG MONTHSHORT MPII MPIV MPVI \ -MPanchor MPbetex MPc MPcode MPcolor \ -MPcoloronly MPcolumn MPd MPdrawing MPfontsizehskip \ -MPgetmultipars MPgetmultishape MPgetposboxes MPh MPinclusions \ -MPleftskip MPll MPlr MPls MPmenubuttons \ -MPn MPoptions MPoverlayanchor MPp MPpage \ -MPpardata MPplus MPpos MPpositiongraphic MPposset \ -MPr MPrawvar MPregion MPrest MPrightskip \ -MPrs MPstring MPtext MPtransparency MPul \ -MPur MPv MPvar MPvariable MPvv \ -MPw MPwhd MPx MPxy MPxywhd \ -MPy MetaFont MetaFun MetaPost NormalizeFontHeight \ -NormalizeFontWidth NormalizeTextHeight NormalizeTextWidth PDFETEX PDFTEX \ -PDFcolor PICTEX PPCHTEX PPCHTeX PRAGMA \ -PiCTeX PointsToBigPoints PointsToReal PointsToWholeBigPoints PtToCm \ -ReadFile Romeins ScaledPointsToBigPoints ScaledPointsToWholeBigPoints Smallcapped \ -TABLE TEX TEXpage TaBlE TeX \ -TheNormalizedFontSize TransparencyHack VerboseNumber WEEKDAG WOORD \ -WOORDEN WidthSpanningText Woord Woorden XETEX \ -XeTeX aanhangsel abjadnaivenumerals abjadnodotnumerals abjadnumerals \ -about achtergrond activatespacehandler adaptcollector adaptfontfeature \ -adaptpapersize addfeature addtoJSpreamble addtocommalist addvalue \ -aftersplitstring aftertestandsplitstring alignmentcharacter allinputpaths alphabeticnumerals \ -alwayscitation alwayscite ampersand anchor appendetoks \ -appendgvalue appendtocommalist appendtoks appendtoksonce appendvalue \ -apply applyalternativestyle applyprocessor applytocharacters applytofirstcharacter \ -applytosplitstringchar applytosplitstringcharspaced applytosplitstringline applytosplitstringlinespaced applytosplitstringword \ -applytosplitstringwordspaced applytowords arabicdecimals arabicexnumerals arabicnumerals \ -arg asciistr aside assignalfadimension assigndimen \ -assigndimension assignifempty assigntranslation assignvalue assignwidth \ -assumelongusagecs astype attachment autocap autodirhbox \ -autodirvbox autodirvtop autoinsertnextspace automathematics autosetups \ -availablehsize averagecharwidth backgroundimage backgroundimagefill backgroundline \ -basegrid baselineleftbox baselinemiddlebox baselinerightbox bbox \ -beforesplitstring beforetestandsplitstring bepaalkopnummer bepaallijstkenmerken bepaalregisterkenmerken \ -bewaarbuffer big bigbodyfont bigg bigger \ -biggl biggm biggr bigl bigm \ -bigr bigskip binom bitmapimage blanko \ -blap bleed bleedheight bleedwidth blockligatures \ -blockquote blokcitaat blokje blokjes bodyfontenvironmentlist \ -bodyfontsize bold boldface bolditalic boldslanted \ -bookmark booleanmodevalue bottombox bottomleftbox bottomrightbox \ -boxcursor boxmarker boxofsize boxreference bpos \ -bthiddencitation btxabbreviatedjournal btxaddjournal btxalwayscitation btxauthorfield \ -btxdetail btxdirect btxdoif btxdoifcombiinlistelse btxdoifelse \ -btxdoifelsecombiinlist btxdoifelsesameasprevious btxdoifelsesameaspreviouschecked btxdoifelseuservariable btxdoifnot \ -btxdoifsameaspreviouscheckedelse btxdoifsameaspreviouselse btxdoifuservariableelse btxexpandedjournal btxfield \ -btxfieldname btxfieldtype btxfirstofrange btxflush btxflushauthor \ -btxflushauthorinverted btxflushauthorinvertedshort btxflushauthorname btxflushauthornormal btxflushauthornormalshort \ -btxflushsuffix btxfoundname btxfoundtype btxhybridcite btxlistcitation \ -btxloadjournalist btxoneorrange btxremapauthor btxsavejournalist btxsetup \ -btxsingularorplural btxsingularplural btxtextcitation button calligraphic \ -camel catcodetablename cbox centerbox centeredbox \ -centerednextbox cfrac chardescription charwidthlanguage checkcharacteralign \ -checkedchar checkedfiller checkedstrippedcsname checkinjector checknextindentation \ -checknextinjector checkpage checkparameters checkpreviousinjector checksoundtrack \ -checktwopassdata checkvariables chem chemical chemicalbottext \ -chemicalmidtext chemicalsymbol chemicaltext chemicaltoptext chineseallnumerals \ -chinesecapnumerals chinesenumerals cijfers citaat citation \ -cite citeer clap classfont cldcommand \ -cldcontext cldloadfile cldprocessfile cleftarrow clip \ -collect collectedtext collectexpanded colorcomponents colored \ -coloronly columnbreak combinepages commalistelement commalistsentence \ -commalistsize comment commentaar comparedimension comparedimensioneps \ -completebtxrendering completelist completelistofpublications completelistofsorts completelistofsynonyms \ -complexorsimple complexorsimpleempty composedcollector composedlayer compresult \ -constantdimen constantdimenargument constantemptyargument constantnumber constantnumberargument \ -contentreference continuednumber continueifinputfile convertargument convertcommand \ -convertedcounter converteddimen convertedsubcounter converteernummer convertmonth \ -convertvalue convertvboxtohbox copieerveld copypages copyparameters \ -copyposition corrigeerwitruimte countersubs counttoken counttokens \ -cramped crampedclap crampedllap crampedrlap crightarrow \ -crightoverleftarrow ctop ctxcommand ctxdirectcommand ctxdirectlua \ -ctxfunction ctxlatecommand ctxlatelua ctxloadluafile ctxlua \ -ctxluabuffer ctxluacode ctxreport ctxsprint currentassignmentlistkey \ -currentassignmentlistvalue currentbtxuservariable currentcommalistitem currentcomponent currentenvironment \ -currentfeaturetest currentinterface currentlanguage currentlistentrydestinationattribute currentlistentrylimitedtext \ -currentlistentrynumber currentlistentrypagenumber currentlistentryreferenceattribute currentlistentrytitle currentlistentrytitlerendered \ -currentlistsymbol currentmainlanguage currentmessagetext currentmoduleparameter currentoutputstream \ -currentproduct currentproject currentregime currentregisterpageuserdata currentresponses \ -currenttime currentvalue currentxtablecolumn currentxtablerow datasetvariable \ -datum dayoftheweek dayspermonth dbinom decrement \ -decrementcounter decrementedcounter decrementpagenumber decrementsubpagenumber decrementvalue \ -defaultinterface defaultobjectpage defaultobjectreference defcatcodecommand defconvertedargument \ -defconvertedcommand defconvertedvalue defineMPinstance defineTABLEsetup defineactivecharacter \ -definealternativestyle defineanchor defineattachment defineattribute definebackground \ -definebar definebodyfontswitch definebreakpoint definebreakpoints definebtx \ -definebtxdataset definebtxregister definebtxrendering definebutton definecapitals \ -definecharacterkerning definecharacterspacing definechemical definechemicals definechemicalsymbol \ -definecollector definecomment definecomplexorsimple definecomplexorsimpleempty defineconversionset \ -definecounter definedataset definedelimitedtext definedfont defineeffect \ -defineexpandable defineexternalfigure definefallbackfamily definefieldbody definefieldbodyset \ -definefieldcategory definefileconstant definefilefallback definefilesynonym definefiller \ -definefirstline definefittingpage definefontalternative definefontfallback definefontfamily \ -definefontfamilypreset definefontfeature definefontfile definefontsize definefontsolution \ -defineformula defineformulaalternative defineformulaframed defineframedcontent definefrozenfont \ -defineglobalcolor definegraphictypesynonym definegridsnapping defineheadalternative definehelp \ -definehigh definehighlight definehspace definehypenationfeatures defineindenting \ -defineinitial defineinsertion defineinteraction defineinteractionbar defineinterfaceconstant \ -defineinterfaceelement defineinterfacevariable defineinterlinespace defineintermediatecolor defineitems \ -definelabelclass definelayerpreset definelinefiller definelinenote definelinenumbering \ -definelines definelistalternative definelistextra definelow definelowhigh \ -definelowmidhigh definemarginblock definemargindata definemarker definemathcases \ -definemathcommand definemathdoubleextensible definemathematics definemathextensible definemathfence \ -definemathfraction definemathframed definemathmatrix definemathornament definemathoverextensible \ -definemathovertextextensible definemathradical definemathstackers definemathstyle definemathtriplet \ -definemathunderextensible definemathundertextextensible definemathunstacked definemeasure definemessageconstant \ -definemixedcolumns definemode definemultitonecolor definenamedcolor definenamespace \ -definenarrower definenote defineornament defineoutputroutine defineoutputroutinecommand \ -definepage definepagechecker definepagegrid definepagegridarea definepagegridspan \ -definepageinjection definepageinjectionalternative definepageshift definepagestate definepairedbox \ -defineparagraph defineparallel defineparbuilder definepositioning defineprefixset \ -defineprocesscolor defineprocessor definepushbutton definepushsymbol definerenderingwindow \ -defineresetset definescale definescript definesectionlevels defineselector \ -defineseparatorset defineshift definesidebar definesort definespotcolor \ -definestyleinstance definesubformula definesynonym definesystemattribute definesystemconstant \ -definesystemvariable definetabulation definetextflow definetooltip definetransparency \ -definetwopasslist definetypeface definetypescriptprefix definetypescriptsynonym definetypesetting \ -defineunit defineviewerlayer definevspace definevspacing definevspacingamount \ -definextable definieer definieeralineas definieerblok definieerbuffer \ -definieercombinatie definieerconversie definieerfiguursymbool definieerfont definieerfontstijl \ -definieerfontsynoniem definieerhbox definieeringesprongentext definieerinteractiemenu definieeritemgroep \ -definieerkadertekst definieerkleur definieerkleurgroep definieerkolomovergang definieerkop \ -definieerkorps definieerkorpsomgeving definieerlayer definieerlayout definieerletter \ -definieerlijst definieermarkering definieeromlijnd definieeropmaak definieeroverlay \ -definieerpaginaovergang definieerpalet definieerpapierformaat definieerplaats definieerplaatsblok \ -definieerprofiel definieerprogramma definieerreferentie definieerreferentieformaat definieerregister \ -definieersamengesteldelijst definieersectie definieersectieblok definieersorteren definieerstartstop \ -definieersubveld definieersymbool definieersynoniemen definieertabelvorm definieertabulatie \ -definieertekst definieertekstachtergrond definieertype definieertypen definieerveld \ -definieerveldstapel definieerwiskundeuitlijnen delimited delimitedtext depthofstring \ -depthonlybox depthspanningtext determinenoflines devanagarinumerals dfrac \ -digits dimensiontocount directcolor directcolored directconvertedcounter \ -directdummyparameter directgetboxllx directgetboxlly directhighlight directlocalframed \ -directluacode directselect directsetbar directsetup directsymbol \ -directvspacing dis disabledirectives disableexperiments disablemode \ -disableoutputstream disableparpositions disableregime disabletrackers displaymath \ -displaymathematics displaymessage distributedhsize dividedsize doadaptleftskip \ -doadaptrightskip doaddfeature doassign doassignempty doboundtext \ -docheckassignment docheckedpagestate docheckedpair documentvariable dodoubleargument \ -dodoubleargumentwithset dodoubleempty dodoubleemptywithset dodoublegroupempty doeassign \ -doexpandedrecurse dogetattribute dogetattributeid dogetcommacommandelement dogobbledoubleempty \ -dogobblesingleempty doif doifMPgraphicelse doifallcommon doifallcommonelse \ -doifalldefinedelse doifallmodes doifallmodeselse doifassignmentelse doifblackelse \ -doifbothsides doifbothsidesoverruled doifboxelse doifbufferelse doifcolor \ -doifcolorelse doifcommandhandler doifcommandhandlerelse doifcommon doifcommonelse \ -doifcontent doifconversiondefinedelse doifconversionnumberelse doifcounter doifcounterelse \ -doifcurrentfonthasfeatureelse doifdefined doifdefinedcounter doifdefinedcounterelse doifdefinedelse \ -doifdimensionelse doifdimenstringelse doifdocumentargument doifdocumentargumentelse doifdocumentfilename \ -doifdocumentfilenameelse doifdrawingblackelse doifelse doifelseMPgraphic doifelseallcommon \ -doifelsealldefined doifelseallmodes doifelseassignment doifelseblack doifelsebox \ -doifelsebuffer doifelsecolor doifelsecommandhandler doifelsecommon doifelseconversiondefined \ -doifelseconversionnumber doifelsecounter doifelsecurrentfonthasfeature doifelsecurrentsortingused doifelsecurrentsynonymshown \ -doifelsecurrentsynonymused doifelsedefined doifelsedefinedcounter doifelsedimension doifelsedimenstring \ -doifelsedocumentargument doifelsedocumentfilename doifelsedrawingblack doifelseempty doifelseemptyvalue \ -doifelseemptyvariable doifelseenv doifelsefastoptionalcheck doifelsefastoptionalcheckcs doifelsefieldbody \ -doifelsefieldcategory doifelsefigure doifelsefile doifelsefiledefined doifelsefileexists \ -doifelsefirstchar doifelseflagged doifelsefontchar doifelsefontpresent doifelsefontsynonym \ -doifelsehasspace doifelsehelp doifelseincsname doifelseinelement doifelseinputfile \ -doifelseinsertion doifelseinset doifelseinstring doifelseinsymbolset doifelseintoks \ -doifelseintwopassdata doifelseitalic doifelselanguage doifelselayerdata doifelselayoutdefined \ -doifelselayoutsomeline doifelselayouttextline doifelseleapyear doifelselist doifelselocation \ -doifelselocfile doifelsemainfloatbody doifelsemarking doifelsemeaning doifelsemessage \ -doifelsemode doifelsenextbgroup doifelsenextbgroupcs doifelsenextchar doifelsenextoptional \ -doifelsenextoptionalcs doifelsenextparenthesis doifelsenonzeropositive doifelsenoteonsamepage doifelsenothing \ -doifelsenumber doifelseobjectfound doifelseobjectreferencefound doifelseoddpage doifelseoddpagefloat \ -doifelseoldercontext doifelseolderversion doifelseoverlapping doifelseoverlay doifelseparallel \ -doifelseparentfile doifelsepath doifelsepathexists doifelsepatterns doifelseposition \ -doifelsepositionaction doifelsepositiononpage doifelsepositionsonsamepage doifelsepositionsonthispage doifelsepositionsused \ -doifelsereferencefound doifelserightpagefloat doifelserighttoleftinbox doifelsesamelinereference doifelsesamestring \ -doifelsesetups doifelsesomebackground doifelsesomespace doifelsesomething doifelsesometoks \ -doifelsestringinstring doifelsestructurelisthasnumber doifelsestructurelisthaspage doifelsesymboldefined doifelsesymbolset \ -doifelsetext doifelsetextflow doifelsetextflowcollector doifelsetypingfile doifelseundefined \ -doifelseurldefined doifelsevalue doifelsevaluenothing doifelsevariable doifempty \ -doifemptyelse doifemptytoks doifemptyvalue doifemptyvalueelse doifemptyvariable \ -doifemptyvariableelse doifenv doifenvelse doiffastoptionalcheckcselse doiffastoptionalcheckelse \ -doiffieldbodyelse doiffieldcategoryelse doiffigureelse doiffile doiffiledefinedelse \ -doiffileelse doiffileexistselse doiffirstcharelse doifflaggedelse doiffontcharelse \ -doiffontpresentelse doiffontsynonymelse doifhasspaceelse doifhelpelse doifincsnameelse \ -doifinelementelse doifinputfileelse doifinsertionelse doifinset doifinsetelse \ -doifinstring doifinstringelse doifinsymbolset doifinsymbolsetelse doifintokselse \ -doifintwopassdataelse doifitalicelse doiflanguageelse doiflayerdataelse doiflayoutdefinedelse \ -doiflayoutsomelineelse doiflayouttextlineelse doifleapyearelse doiflistelse doiflocationelse \ -doiflocfileelse doifmainfloatbodyelse doifmarkingelse doifmeaningelse doifmessageelse \ -doifmode doifmodeelse doifnextbgroupcselse doifnextbgroupelse doifnextcharelse \ -doifnextoptionalcselse doifnextoptionalelse doifnextparenthesiselse doifnonzeropositiveelse doifnot \ -doifnotallcommon doifnotallmodes doifnotcommandhandler doifnotcommon doifnotcounter \ -doifnotdocumentargument doifnotdocumentfilename doifnotempty doifnotemptyvalue doifnotemptyvariable \ -doifnotenv doifnoteonsamepageelse doifnotescollected doifnotfile doifnotflagged \ -doifnothing doifnothingelse doifnotinset doifnotinsidesplitfloat doifnotinstring \ -doifnotmode doifnotnumber doifnotsamestring doifnotsetups doifnotvalue \ -doifnotvariable doifnumber doifnumberelse doifobjectfoundelse doifobjectreferencefoundelse \ -doifoddpageelse doifoddpagefloatelse doifoldercontextelse doifolderversionelse doifoverlappingelse \ -doifoverlayelse doifparallelelse doifparentfileelse doifpathelse doifpathexistselse \ -doifpatternselse doifposition doifpositionaction doifpositionactionelse doifpositionelse \ -doifpositiononpageelse doifpositionsonsamepageelse doifpositionsonthispageelse doifpositionsusedelse doifreferencefoundelse \ -doifrightpagefloatelse doifrighttoleftinboxelse doifsamelinereferenceelse doifsamestring doifsamestringelse \ -doifsetups doifsetupselse doifsomebackground doifsomebackgroundelse doifsomespaceelse \ -doifsomething doifsomethingelse doifsometoks doifsometokselse doifstringinstringelse \ -doifstructurelisthasnumberelse doifstructurelisthaspageelse doifsymboldefinedelse doifsymbolsetelse doiftext \ -doiftextelse doiftextflowcollectorelse doiftextflowelse doiftypingfileelse doifundefined \ -doifundefinedcounter doifundefinedelse doifurldefinedelse doifvalue doifvalueelse \ -doifvaluenothing doifvaluenothingelse doifvaluesomething doifvariable doifvariableelse \ -doindentation dollar doloop doloopoverlist donothing \ -dontconvertfont dontleavehmode dontpermitspacesbetweengroups doordefinieren doorlabelen \ -doornummeren dopositionaction doprocesslocalsetups doquadrupleargument doquadrupleempty \ -doquadruplegroupempty doquintupleargument doquintupleempty doquintuplegroupempty dorechecknextindentation \ -dorecurse dorepeatwithcommand doreplacefeature doresetandafffeature doresetattribute \ -dorotatebox dosetattribute dosetleftskipadaption dosetrightskipadaption dosetupcheckedinterlinespace \ -doseventupleargument doseventupleempty dosingleargument dosingleempty dosinglegroupempty \ -dosixtupleargument dosixtupleempty dostepwiserecurse dosubtractfeature dotfskip \ -dotoks dotripleargument dotripleargumentwithset dotripleempty dotripleemptywithset \ -dotriplegroupempty doublebar doublebond doublebrace doublebracket \ -doubleparent dowith dowithnextbox dowithnextboxcontent dowithnextboxcontentcs \ -dowithnextboxcs dowithpargument dowithrange dowithwargument dpofstring \ -dummydigit dummyparameter dunnelijn dunnelijnen eTeX \ -edefconvertedargument eenregel efcmaxheight efcmaxwidth efcminheight \ -efcminwidth efcparameter effect elapsedseconds elapsedtime \ -eleftarrowfill eleftharpoondownfill eleftharpoonupfill eleftrightarrowfill emphasisboldface \ -emphasistypeface emspace enabledirectives enableexperiments enablemode \ -enableoutputstream enableparpositions enableregime enabletrackers enskip \ -enspace env envvar eoverbarfill eoverbracefill \ -eoverbracketfill eoverparentfill epos equaldigits ergens \ -erightarrowfill erightharpoondownfill erightharpoonupfill etwoheadrightarrowfill eunderbarfill \ -eunderbracefill eunderbracketfill eunderparentfill executeifdefined exitloop \ -exitloopnow expandcheckedcsname expanded expandfontsynonym externalfigurecollectionmaxheight \ -externalfigurecollectionmaxwidth externalfigurecollectionminheight externalfigurecollectionminwidth externalfigurecollectionparameter externfiguur \ -fakebox fastdecrement fastincrement fastlocalframed fastscale \ -fastsetup fastsetupwithargument fastsetupwithargumentswapped fastswitchtobodyfont fastsxsy \ -feature fence fenced fetchallmarkings fetchallmarks \ -fetchmark fetchmarking fetchonemark fetchonemarking fetchruntinecommand \ -fetchtwomarkings fetchtwomarks fieldbody fifthoffivearguments fifthofsixarguments \ -figurefilename figurefilepath figurefiletype figurefullname figureheight \ -figurenaturalheight figurenaturalwidth figuresymbol figurewidth figuur \ -filename filledhboxb filledhboxc filledhboxg filledhboxk \ -filledhboxm filledhboxr filledhboxy filler filterfromnext \ -filterfromvalue filterpages filterreference findtwopassdata finishregisterentry \ -firstcharacter firstcounter firstcountervalue firstoffivearguments firstoffourarguments \ -firstofoneargument firstofoneunexpanded firstofsixarguments firstofthreearguments firstofthreeunexpanded \ -firstoftwoarguments firstoftwounexpanded firstrealpage firstrealpagenumber firstsubcountervalue \ -firstsubpage firstsubpagenumber firstuserpage firstuserpagenumber fitfieldframed \ -fittopbaselinegrid flag floatuserdataparameter flushboxregister flushcollector \ -flushlayer flushlocalfloats flushnextbox flushnotes flushoutputstream \ -flushshapebox flushtextflow flushtokens flushtoks fontalternative \ -fontbody fontchar fontcharbyindex fontclass fontclassname \ -fontface fontfeaturelist fontsize fontstyle forcecharacterstripping \ -forcelocalfloats forgeteverypar forgetparameters formula formulenummer \ -foundbox fourthoffivearguments fourthoffourarguments fourthofsixarguments frac \ -frameddimension framedparameter framedtext freezedimenmacro freezemeasure \ -frenchspacing fromlinenote frozenhbox gdefconvertedargument gdefconvertedcommand \ -gebruikJSscripts gebruikURL gebruikblokken gebruikexterndocument gebruikexternfiguur \ -gebruikexterngeluidsfragment gebruikmodule gebruikpad gebruiksymbolen gebruiktypescript \ -gebruiktypescriptfile gebruikurl geenbovenenonderregels geenhoofdenvoetregels geenspatie \ -getMPdrawing getMPlayer getboxllx getboxlly getbufferdata \ -getcommacommandsize getcommalistsize getdayoftheweek getdayspermonth getdefinedbuffer \ -getdocumentargument getdocumentargumentdefault getdocumentfilename getdummyparameters getemptyparameters \ -geteparameters getexpandedparameters getfiguredimensions getfirstcharacter getfirsttwopassdata \ -getfromcommacommand getfromcommalist getfromtwopassdata getglyphdirect getglyphstyled \ -getgparameters getlasttwopassdata getlocalfloat getlocalfloats getmessage \ -getnamedglyphdirect getnamedglyphstyled getnamedtwopassdatalist getnaturaldimensions getnoflines \ -getobject getobjectdimensions getpaletsize getparameters getprivatechar \ -getprivateslot getrandomcount getrandomdimen getrandomfloat getrandomnumber \ -getrandomseed getraweparameters getrawgparameters getrawnoflines getrawparameters \ -getrawxparameters getreference getreferenceentry getroundednoflines getsubstring \ -gettwopassdata gettwopassdatalist getuvalue getvalue getvariable \ -getvariabledefault getxparameters globaldisablemode globalenablemode globalletempty \ -globalpopbox globalpopmacro globalpreventmode globalprocesscommalist globalpushbox \ -globalpushmacro globalswapcounts globalswapdimens globalswapmacros globalundefine \ -glyphfontfile gobbledoubleempty gobbleeightarguments gobblefivearguments gobblefiveoptionals \ -gobblefourarguments gobblefouroptionals gobbleninearguments gobbleoneargument gobbleoneoptional \ -gobblesevenarguments gobblesingleempty gobblesixarguments gobblespacetokens gobbletenarguments \ -gobblethreearguments gobblethreeoptionals gobbletwoarguments gobbletwooptionals gobbleuntil \ -gobbleuntilrelax grabbufferdata grabbufferdatadirect grabuntil grafiek \ -grayvalue greedysplitstring greeknumerals grijskleur groupedcommand \ -gsetboxllx gsetboxlly gujaratinumerals gurmurkhinumerals haalbuffer \ -haalmarkering haarlijn hairspace halfwaybox handhaafblokken \ -handletokens handwritten hash hboxofvbox hboxreference \ -hdofstring headhbox headnumbercontent headnumberdistance headnumberwidth \ -headreferenceattributes headsetupspacing headtextcontent headtextdistance headtextwidth \ -headvbox headwidth heightanddepthofstring heightofstring heightspanningtext \ -helptekst helptext hglue hiddenbar hiddencitation \ -hiddencite highlight highordinalstr hilo himilo \ -hl hoofdstuk hoofdtaal hoog horizontalgrowingbar \ -horizontalpositionbar hphantom hpos hsizefraction hsmash \ -hsmashbox hsmashed hspace htdpofstring htofstring \ -huidigedatum huidigekopnummer hyphen hyphenatedcoloredword hyphenatedfile \ -hyphenatedfilename hyphenatedhbox hyphenatedpar hyphenatedurl hyphenatedword \ -ibox ifassignment iff ifinobject ifinoutputstream \ -ifparameters iftrialtypesetting ignoreimplicitspaces ignorevalue immediatesavetwopassdata \ -impliedby implies in includemenu includeversioninfo \ -increment incrementcounter incrementedcounter incrementpagenumber incrementsubpagenumber \ -incrementvalue indentation infofont infofontbold inheritparameter \ -inhibitblank initializeboxstack inlijnd inlinebuffer inlinedbox \ -inlinemath inlinemathematics inlinemessage inlineordisplaymath inlinerange \ -innerflushshapebox input inputfilebarename inputfilename inputfilerealsuffix \ -inputfilesuffix inputgivenfile inregel insertpages installactionhandler \ -installactivecharacter installanddefineactivecharacter installattributestack installautocommandhandler installautosetuphandler \ -installbasicautosetuphandler installbasicparameterhandler installbottomframerenderer installcommandhandler installcorenamespace \ -installdefinehandler installdefinitionset installdefinitionsetmember installdirectcommandhandler installdirectparameterhandler \ -installdirectparametersethandler installdirectsetuphandler installdirectstyleandcolorhandler installeertaal installframedautocommandhandler \ -installframedcommandhandler installleftframerenderer installnamespace installoutputroutine installpagearrangement \ -installparameterhandler installparameterhashhandler installparametersethandler installparentinjector installrightframerenderer \ -installrootparameterhandler installsetuphandler installsetuponlycommandhandler installshipoutmethod installsimplecommandhandler \ -installsimpleframedcommandhandler installstyleandcolorhandler installswitchcommandhandler installswitchsetuphandler installtexdirective \ -installtextracker installtopframerenderer installunitsseparator installunitsspace installversioninfo \ -integerrounding interactiebalk interactiebuttons interactiemenu intermezzo \ -intertext invokepageheandler invullijnen invulregel invultekst \ -inwilijnd istltdir istrtdir italic italicbold \ -italiccorrection items itemtag jobfilename jobfilesuffix \ -kadertekst kap keeplinestogether keepunwantedspaces kerncharacters \ -kleur kleurenbalk kleurwaarde kloonveld kolom \ -kopnummer koreancirclenumerals koreannumerals koreannumeralsc koreannumeralsp \ -koreanparentnumerals laag laho languageCharacters languagecharacters \ -languagecharwidth lastcounter lastcountervalue lastdigit lastlinewidth \ -lastnaturalboxdp lastnaturalboxht lastnaturalboxwd lastpredefinedsymbol lastrealpage \ -lastrealpagenumber lastsubcountervalue lastsubpage lastsubpagenumber lasttwodigits \ -lastuserpage lastuserpagenumber lateluacode layeredtext layerheight \ -layerwidth lazysavetaggedtwopassdata lazysavetwopassdata lbox left \ -leftbottombox leftbox lefthbox leftorrighthbox leftorrightvbox \ -leftorrightvtop leftskipadaption leftsubguillemot lefttopbox lefttorighthbox \ -lefttorightvbox lefttorightvtop legeregels letbeundefined letcatcodecommand \ -letcscsname letcsnamecs letcsnamecsname letdummyparameter letempty \ -letgvalue letgvalueempty letgvalurelax letter letterampersand \ -letterat letterbackslash letterbar letterbgroup letterclosebrace \ -lettercolon letterdollar letterdoublequote letteregroup letterescape \ -letterexclamationmark letterhash letterhat letterleftbrace letterless \ -lettermore letteropenbrace letterpercent letterquestionmark letterrightbrace \ -letters lettersinglequote letterslash letterspacing lettertilde \ -letterunderscore letvalue letvalueempty letvaluerelax lfence \ -lhbox lijndikte lijstlengte limitatelines limitatetext \ -limtatefirstline linespanningtext listcitation listcite listnamespaces \ -llap loadanyfile loadanyfileonce loadbtxdefinitionfile loadbtxreplacementfile \ -loadcldfile loadcldfileonce loadfontgoodies loadluafile loadluafileonce \ -loadspellchecklist loadtexfile loadtexfileonce loadtypescriptfile localframed \ -localframedwithsettings localhsize localpopbox localpopmacro localpushbox \ -localpushmacro localundefine locatedfilepath locatefilepath locfilename \ -lomihi lowerbox lowercased lowercasestring lowerleftdoubleninequote \ -lowerleftsingleninequote lowerrightdoubleninequote lowerrightsingleninequote lrtbbox ltop \ -luaTeX luacode luaconditional luaenvironment luaexpanded \ -luafunction luajitTeX luamajorversion luaminorversion luaparameterset \ -luasetup luaversion m mLeftarrow mLeftrightarrow \ -mRightarrow maand makecharacteractive makerawcommalist makestrutofbox \ -mapfontsize margindata markcontent markeer markinjector \ -mat math mathbf mathbi mathblackboard \ -mathbs mathcommand mathdefault mathfraktur mathfunction \ -mathit mathitalic mathop mathrm mathscript \ -mathsl mathss mathtext mathtextbf mathtextbi \ -mathtextbs mathtextit mathtextsl mathtexttf mathtf \ -mathtriplet mathtt mathupright mathword mathwordbf \ -mathwordbi mathwordbs mathwordit mathwordsl mathwordtf \ -mbox mcframed md measure measured \ -medskip medspace menubutton mequal message \ -metaTeX mfence mfunction mfunctionlabeltext mhbox \ -mhookleftarrow mhookrightarrow middle middlebox midhbox \ -minimalhbox mixedcaps mkvibuffer mleftarrow mleftharpoondown \ -mleftharpoonup mleftrightarrow mleftrightharpoons mmapsto moduleparameter \ -molecule mono monobold mononormal monthlong \ -monthshort mp mprandomnumber mrel mrightarrow \ -mrightharpoondown mrightharpoonup mrightleftharpoons mrightoverleftarrow mtext \ -mtriplerel mtwoheadleftarrow mtwoheadrightarrow naar naarbox \ -naarpagina namedheadnumber namedstructureheadlocation namedstructureuservariable namedstructurevariable \ -namedtaggedlabeltexts naturalhbox naturalhpack naturalvbox naturalvcenter \ -naturalvpack naturalvtop naturalwd negatecolorbox negated \ -negthinspace newattribute newcatcodetable newcounter newevery \ -newfrenchspacing newmode newsignal newsystemmode nextbox \ -nextboxdp nextboxht nextboxhtdp nextboxwd nextcounter \ -nextcountervalue nextdepth nextparagraphs nextrealpage nextrealpagenumber \ -nextsubcountervalue nextsubpage nextsubpagenumber nextuserpage nextuserpagenumber \ -nobar nocitation nocite nodetostring noffigurepages \ -noflines noflocalfloats noindentation noitem nokap \ -nonfrenchspacing nonmathematics noot normal normalboldface \ -normalframedwithsettings normalizebodyfontsize normalizedfontsize normalizefontdepth normalizefontheight \ -normalizefontline normalizefontwidth normalizetextdepth normalizetextheight normalizetextline \ -normalizetextwidth normaltypeface notesymbol ntimes numberofpoints \ -obeydepth objectdepth objectheight objectmargin objectwidth \ -obox offset offsetbox omgeving omlaag \ -omlijnd onbekend onderdeel onderwerp onedigitrounding \ -op oppagina opsomming ordinaldaynumber ordinalstr \ -ornamenttext outputfilename outputstreambox outputstreamcopy outputstreamunvbox \ -outputstreamunvcopy over overbar overbars overbartext \ -overbarunderbar overbrace overbracetext overbraceunderbrace overbracket \ -overbrackettext overbracketunderbracket overlaybutton overlaycolor overlaydepth \ -overlayfigure overlayheight overlaylinecolor overlaylinewidth overlayoffset \ -overlayrollbutton overlaywidth overleftarrow overleftharpoondown overleftharpoonup \ -overleftrightarrow overloaderror overparent overparenttext overparentunderparent \ -overrightarrow overrightharpoondown overrightharpoonup overset overstrike \ -overstrikes overtwoheadleftarrow overtwoheadrightarrow pagearea pagebreak \ -pagefigure pagegridspanwidth pageinjection pagestaterealpage pagina \ -paginanummer paginareferentie paletsize paragraaf paslayoutaan \ -passendveld pdfTeX pdfactualtext pdfbackendactualtext pdfbackendcurrentresources \ -pdfbackendsetcatalog pdfbackendsetcolorspace pdfbackendsetextgstate pdfbackendsetinfo pdfbackendsetname \ -pdfbackendsetpageattribute pdfbackendsetpageresource pdfbackendsetpagesattribute pdfbackendsetpattern pdfbackendsetshade \ -pdfcolor pdfeTeX percent percentdimen permitcaretescape \ -permitcircumflexescape permitspacesbetweengroups persiandecimals persiannumerals phantom \ -phantombox pickupgroupedcommand plaatsbookmarks plaatsformule plaatskopnummer \ -plaatskoptekst plaatslijst plaatslijstmetsynoniemen plaatslokalevoetnoten plaatsnaastelkaar \ -plaatsonderelkaar plaatsopgrid plaatspaginanummer plaatsplaatsblok plaatsregister \ -plaatsruwelijst plaatssamengesteldelijst plaatssubformule plaatsvoetnoten placeattachments \ -placebtxrendering placecitation placecomments placecurrentformulanumber placedbox \ -placefloatwithsetups placeframed placehelp placeinitial placelayer \ -placelayeredtext placelistofpublications placelistofsorts placelocalnotes placement \ -placenamedfloat placenamedformula placenotes placepairedbox placeparallel \ -placerenderingwindow popattribute popmacro popmode popsystemmode \ -positioneer positionoverlay positionregionoverlay postponenotes predefinedfont \ -predefinefont predefinesymbol prefixedpagenumber prependetoks prependgvalue \ -prependtocommalist prependtoks prependtoksonce prependvalue presetdocument \ -presetfieldsymbols pretocommalist prevcounter prevcountervalue preventmode \ -prevrealpage prevrealpagenumber prevsubcountervalue prevsubpage prevsubpagenumber \ -prevuserpage prevuserpagenumber procent processMPbuffer processMPfigurefile \ -processaction processallactionsinset processassignlist processassignmentcommand processassignmentlist \ -processbetween processbodyfontenvironmentlist processcolorcomponents processcommacommand processcommalist \ -processcommalistwithparameters processcontent processfile processfilemany processfilenone \ -processfileonce processfirstactioninset processisolatedchars processisolatedwords processlinetablebuffer \ -processlinetablefile processlist processmonth processranges processseparatedlist \ -processtexbuffer processtokens processuntil processxtablebuffer processyear \ -produkt profiledbox profilegivenbox programma projekt \ -pseudoMixedCapped pseudoSmallCapped pseudoSmallcapped pseudosmallcapped punten \ -purenumber pushattribute pushbutton pushmacro pushmode \ -pushoutputstream pushsystemmode qquad quad quads \ -quitcommalist quitprevcommalist quittypescriptscanning raisebox randomizetext \ -randomnumber rawcounter rawcountervalue rawdate rawdoifelseinset \ -rawdoifinset rawdoifinsetelse rawgetparameters rawprocessaction rawprocesscommacommand \ -rawprocesscommalist rawstructurelistuservariable rawsubcountervalue rbox readfile \ -readfixfile readjobfile readlocfile readsetfile readsysfile \ -readtexfile readxmlfile realSmallCapped realSmallcapped realpagenumber \ -realsmallcapped recursedepth recurselevel recursestring redoconvertfont \ -ref refereer referenceprefix referentie registerattachment \ -registerctxluafile registerexternalfigure registerfontclass registerhyphenationexception registerhyphenationpattern \ -registermenubuttons registersort registersynonym registerunit regular \ -relatemarking relateparameterhandlers relaxvalueifundefined remainingcharacters removebottomthings \ -removedepth removefromcommalist removelastskip removelastspace removemarkedcontent \ -removepunctuation removesubstring removetoks removeunwantedspaces replacefeature \ -replaceincommalist replaceword rescan rescanwithsetup resetMPdrawing \ -resetMPenvironment resetMPinstance resetallattributes resetandaddfeature resetbar \ -resetbreakpoints resetbuffer resetcharacteralign resetcharacterkerning resetcharacterspacing \ -resetcharacterstripping resetcollector resetcounter resetdigitsmanipulation resetdirection \ -resetfeature resetflag resetfontcolorsheme resetfontfallback resetfontsolution \ -resethyphenationfeatures resetinjector resetinteractionmenu resetitaliccorrection resetlayer \ -resetlocalfloats resetmarker resetmarkering resetmode resetpagenumber \ -resetparallel resetpath resetpenalties resetprofile resetreference \ -resetreplacement resetscript resetsetups resetshownsynonyms resetsubpagenumber \ -resetsymbolset resetsystemmode resettimer resettrackers resettrialtypesetting \ -resetusedsortings resetusedsynonyms resetuserpagenumber resetvalue resetvisualizers \ -reshapebox resolvedglyphdirect resolvedglyphstyled restartcounter restorebox \ -restorecatcodes restorecounter restorecurrentattributes restoreendofline restoreglobalbodyfont \ -reusableMPgraphic reuseMPgraphic reuserandomseed revivefeature rfence \ -rhbox right rightbottombox rightbox righthbox \ -rightorleftpageaction rightskipadaption rightsubguillemot righttolefthbox righttoleftvbox \ -righttoleftvtop righttopbox rlap robustaddtocommalist robustdoifelseinset \ -robustdoifinsetelse robustpretocommalist rollbutton roman romeins \ -rooster roteer rtop ruledhbox ruledhpack \ -ruledmbox ruledtopv ruledtpack ruledvbox ruledvpack \ -ruledvtop runMPbuffer runninghbox safechar sans \ -sansbold sansnormal sansserif savebox savebtxdataset \ -savecounter savecurrentattributes savenormalmeaning savetaggedtwopassdata savetwopassdata \ -sbox schaal scherm schrijfnaarlijst schrijftussenlijst \ -sd secondoffivearguments secondoffourarguments secondofsixarguments secondofthreearguments \ -secondofthreeunexpanded secondoftwoarguments secondoftwounexpanded select selecteerblokken \ -serializecommalist serializedcommalist serif serifbold serifnormal \ -setJSpreamble setMPlayer setMPpositiongraphic setMPpositiongraphicrange setMPtext \ -setMPvariable setMPvariables setbar setbigbodyfont setboxllx \ -setboxlly setbreakpoints setcapstrut setcatcodetable setcharacteralign \ -setcharactercasing setcharactercleaning setcharacterkerning setcharacterspacing setcharacterstripping \ -setcharstrut setcollector setcolormodell setcounter setcounterown \ -setcurrentfontclass setdataset setdefaultpenalties setdigitsmanipulation setdirection \ -setdocumentargument setdocumentargumentdefault setdocumentfilename setdummyparameter setelementexporttag \ -setemeasure setevalue setevariable setevariables setfirstline \ -setflag setfont setfontcolorsheme setfontfeature setfontsolution \ -setfontstrut setfractions setgmeasure setgvalue setgvariable \ -setgvariables sethboxregister sethyphenatedurlafter sethyphenatedurlbefore sethyphenatedurlnormal \ -sethyphenationfeatures setinitial setinjector setinteraction setinterfacecommand \ -setinterfaceconstant setinterfaceelements setinterfacemessage setinterfacevariable setinternalrendering \ -setitaliccorrection setlayer setlayerframed setlayertext setlinefiller \ -setlocalhsize setmainbodyfont setmainparbuilder setmarker setmarking \ -setmathstyle setmeasure setmessagetext setmode setnostrut \ -setnote setnotetext setobject setoldstyle setpagegrid \ -setpagereference setpagestate setpagestaterealpageno setpenalties setpercentdimen \ -setposition setpositionbox setpositiondata setpositiondataplus setpositiononly \ -setpositionplus setpositionstrut setprofile setrandomseed setreference \ -setreferencedobject setregisterentry setreplacement setrigidcolumnbalance setrigidcolumnhsize \ -setscript setsectionblock setsimplecolumnhsize setsmallbodyfont setsmallcaps \ -setstackbox setstructurepageregister setstrut setsuperiors setsystemmode \ -settabular settaggedmetadata settightobject settightreferencedobject settightunreferencedobject \ -settrialtypesetting setuevalue setugvalue setunreferencedobject setup \ -setupMPgraphics setupMPinstance setupMPpage setupMPvariables setupTABLE \ -setupTEXpage setupattachment setupbackend setupbar setupbleeding \ -setupbookmark setupbtx setupbtxdataset setupbtxlist setupbtxregister \ -setupbtxrendering setupbutton setupcharacterkerning setupcharacterspacing setupchemical \ -setupchemicalframed setupcollector setupcolumnspan setupcombination setupcounter \ -setupdataset setupdelimitedtext setupdirections setupdocument setupeffect \ -setupenv setupexport setupexternalfigure setupexternalsoundtracks setupfieldbody \ -setupfieldcategory setupfieldcontentframed setupfieldlabelframed setupfieldtotalframed setupfiller \ -setupfirstline setupfittingpage setupfloatcaption setupfontexpansion setupfontprotrusion \ -setupfonts setupfontsolution setupformulaframed setupframedcontent setupglobalreferenceprefix \ -setupheadalternative setuphelp setuphigh setuphighlight setuphyphenation \ -setupinitial setupinsertion setupitaliccorrection setuplabel setuplayer \ -setuplayeredtext setuplayouttext setuplinefiller setuplinefillers setuplinenote \ -setuplinetable setuplistalternative setuplistextra setuplocalfloats setuplocalinterlinespace \ -setuplow setuplowhigh setuplowmidhigh setupmarginframed setupmarginrule \ -setupmathcases setupmathematics setupmathfence setupmathfraction setupmathframed \ -setupmathmatrix setupmathornament setupmathradical setupmathstackers setupmathstyle \ -setupmixedcolumns setupmodule setupnotation setupnotations setupnote \ -setupnotes setupoffset setupoffsetbox setupoutputroutine setuppagechecker \ -setuppagegrid setuppagegridarea setuppagegridareatext setuppagegridlines setuppagegridspan \ -setuppagegridstart setuppageinjection setuppageinjectionalternative setuppageshift setuppagestate \ -setuppairedbox setupparagraph setupparagraphintro setupparallel setupperiods \ -setuppositionbar setupprocessor setupprofile setupquotation setuprealpagenumber \ -setupreferenceformat setupreferenceprefix setupreferencestructureprefix setupregisters setuprenderingwindow \ -setups setupscale setupscript setupscripts setupselector \ -setupshift setupsidebar setupspellchecking setupstretched setupstruts \ -setupstyle setupsubformula setuptabulation setuptagging setuptextflow \ -setuptooltip setupunit setupuserpagenumber setupversion setupviewerlayer \ -setupvspacing setupwithargument setupwithargumentswapped setupxml setupxtable \ -setuvalue setuxvalue setvalue setvariable setvariables \ -setvboxregister setvisualizerfont setvtopregister setwidthof setxmeasure \ -setxvalue setxvariable setxvariables sfrac shapedhbox \ -showallmakeup showattributes showboxes showbtxdatasetauthors showbtxdatasetcompleteness \ -showbtxdatasetfields showbtxfields showbtxhashedauthors showbtxtables showchardata \ -showcharratio showcolorbar showcolorcomponents showcolorset showcolorstruts \ -showcounter showdirectives showdirsinmargin showedebuginfo showexperiments \ -showfont showfontdata showfontkerns showfontparameters showfontstrip \ -showfontstyle showglyphs showgridsnapping showhelp showhyphenationtrace \ -showhyphens showinjector showjustification showkerning showlayoutcomponents \ -showligature showligatures showlogcategories showmargins showmessage \ -showminimalbaseline shownextbox showotfcomposition showparentchain showsetupsdefinition \ -showtimer showtokens showtrackers showvalue showvariable \ -showwarning simplegroupedcommand singalcharacteralign singlebond sixthofsixarguments \ -slanted slantedbold slicepages slovenianNumerals sloveniannumerals \ -small smallbodyfont smallbold smallbolditalic smallboldslanted \ -smallcappedcharacters smallcappedromannumerals smaller smallitalicbold smallnormal \ -smallskip smallslanted smallslantedbold smalltype smash \ -smashbox smashboxed smashedhbox smashedvbox snaptogrid \ -som someheadnumber somekindoftab somelocalfloat somenamedheadnumber \ -someplace sp spanishNumerals spanishnumerals spatie \ -speech spiegel splitatasterisk splitatcolon splitatcolons \ -splitatcomma splitdfrac splitfilename splitfrac splitoffbase \ -splitofffull splitoffkind splitoffname splitoffpath splitoffroot \ -splitofftokens splitofftype splitsplaatsblok splitstring spraak \ -spreadhbox sqrt stackrel startJScode startJSpreamble \ -startMPclip startMPcode startMPdefinitions startMPdrawing startMPenvironment \ -startMPextensions startMPinclusions startMPinitializations startMPpage startMPpositiongraphic \ -startMPpositionmethod startMPrun startTABLE startTABLEbody startTABLEfoot \ -startTABLEhead startTABLEnext startTC startTD startTDs \ -startTEXpage startTH startTN startTR startTRs \ -startTX startTY startaanhangsel startachtergrond startallmodes \ -startarrangedpages startaside startattachment startbar startbinom \ -startbitmapimage startblockquote startblokcitaat startbtxrenderingdefinitions startbuffer \ -startbutton startcatcodetable startcharacteralign startcheckedfences startchemical \ -startcitaat startciteer startcollect startcollecting startcolorintent \ -startcoloronly startcolorset startcolumns startcolumnspan startcombination \ -startcomment startcommentaar startcontextcode startcontextdefinitioncode startctxfunction \ -startctxfunctiondefinition startcurrentcolor startcurrentlistentrywrapper startdbinom startdelimited \ -startdelimitedtext startdfrac startdisplaymath startdmath startdocument \ -startdoorstreep startdoorstrepen starteffect startelement startembeddedxtable \ -startendofline startexceptions startexpanded startexpandedcollect startextendedcatcodetable \ -startexternalfigurecollection startfigure startfiguur startfitfieldframed startfittingpage \ -startfloatcombination startfont startfontclass startfontsolution startformula \ -startformulas startfrac startframedcontent startframedtext startgrafiek \ -startgridsnapping starthbox starthboxestohbox starthboxregister starthelptekst \ -starthelptext starthiddenbar starthiding starthighlight starthoofdstuk \ -starthyphenation startimath startindentation startindentedtext startinmframed \ -startinteractiemenu startinteraction startinterface startintermezzo startintertext \ -startitemgroup startkadertekst startkantlijn startkleur startknockout \ -startkop startlayout startlinefiller startlinenumbering startlinetable \ -startlinetablebody startlinetablecell startlinetablehead startlocalheadsetup startlocallinecorrection \ -startlocalnotes startlocalsetups startlokalevoetnoten startlua startluacode \ -startluaparameterset startluasetups startmakeup startmargeblok startmarkedcontent \ -startmathmode startmathstyle startmatrices startmcframed startmdformula \ -startmframed startmixedcolumns startmode startmodeset startmodule \ -startmoduletestsection startmpformula startnaar startnamedsection startnamedsubformulas \ -startnarrow startnarrower startnegative startnicelyfilledbox startnobar \ -startnointerference startnotallmodes startnotext startnotmode startomgeving \ -startomlijnd startonderdeel startonderstreep startonderstrepen startonderwerp \ -startopelkaar startopposite startopsomming startoutputstream startoverlay \ -startoverprint startoverstreep startoverstrepen startpagecomment startpagefigure \ -startpagegrid startpagegridspan startpagelayout startpar startparagraaf \ -startparagraph startparagraphs startparagraphscell startparbuilder startpath \ -startplaatsformule startplacepairedbox startpositioning startpositionoverlay startpositive \ -startpostponing startprocessassignmentcommand startprocessassignmentlist startprocesscommacommand startprocesscommalist \ -startprodukt startprojekt startprotect startprotectedcolors startpublicatie \ -startpunctuation startrandomized startrandomseed startrawsetups startreadingfile \ -startreferenceprefix startregel startregelcorrectie startregime startregister \ -startreusableMPgraphic startscript startsdformula startsectionblock startsectionblockenvironment \ -startsectionlevel startsetups startsfrac startshapebox startshift \ -startsidebar startsimplecolumns startsom startspecialitem startspeech \ -startspformula startspraak startspread startstartstop startstaticMPfigure \ -startstaticMPgraphic startstrictinspectnextcharacter startstructurepageregister startstrut startstyle \ -startsubformulas startsubjectlevel startsubonderwerp startsubparagraaf startsubsentence \ -startsubstack startsubsubonderwerp startsubsubparagraaf startsubsubsubonderwerp startsubsubsubparagraaf \ -startsubsubsubsubonderwerp startsubsubsubsubparagraaf startsymbolset starttabel starttable \ -starttablehead starttables starttabletail starttabulate starttabulatehead \ -starttabulatetail starttagged starttbinom starttekstachtergrond starttekstlijn \ -starttexcode starttexdefinition starttext starttextbackgroundmanual starttextcolor \ -starttextcolorintent starttextflow starttitel starttokens starttransparent \ -starttypescript starttypescriptcollection startunderdash startunderdashes startunderdot \ -startunderdots startunderrandom startunderrandoms startunderstrike startunderstrikes \ -startunframed startuniqueMPgraphic startuniqueMPpagegraphic startunpacked startusableMPgraphic \ -startuseMPgraphic startusemathstyleparameter startusingbtxspecification startvbox startvboxregister \ -startvboxtohbox startvboxtohboxseparator startviewerlayer startvtop startvtopregister \ -startxcell startxcellgroup startxfrac startxgroup startxmldisplayverbatim \ -startxmlinlineverbatim startxmlraw startxmlsetups startxrow startxrowgroup \ -startxtable startxtablebody startxtablefoot startxtablehead startxtablenext \ -startxxfrac stelachtergrondenin stelachtergrondin stelalineasin stelarrangerenin \ -stelblankoin stelblokin stelblokjesin stelblokkopjein stelbovenin \ -stelboventekstenin stelbufferin stelciterenin stelclipin stelcommentaarin \ -steldoordefinierenin steldoornummerenin steldunnelijnenin stelformulein stelformulierenin \ +Cijfers Kap Letter Letters \ +MAAND Romeins WEEKDAG WOORD WOORDEN \ +Woord Woorden achtergrond bepaalkopnummer bepaallijstkenmerken \ +bepaalregisterkenmerken bewaarbuffer blanko blokje blokjes \ +cijfers converteernummer copieerveld corrigeerwitruimte datum \ +definieer definieeraccent definieeralineas definieerblok definieerbuffer \ +definieercombinatie definieercommando definieerconversie definieerfiguursymbool definieerfont \ +definieerfontstijl definieerfontsynoniem definieerhbox definieeringesprongentext definieerinteractiemenu \ +definieeritemgroep definieerkadertekst definieerkarakter definieerkleur definieerkleurgroep \ +definieerkolomovergang definieerkop definieerkorps definieerkorpsomgeving definieerlayer \ +definieerlayout definieerletter definieerlijst definieermarkering definieeromlijnd \ +definieeropmaak definieeroverlay definieerpaginaovergang definieerpalet definieerpapierformaat \ +definieerplaats definieerplaatsblok definieerprofiel definieerprogramma definieerreferentie \ +definieerreferentieformaat definieerregister definieersamengesteldelijst definieersectie definieersectieblok \ +definieersorteren definieerstartstop definieersubveld definieersymbool definieersynoniemen \ +definieertabelvorm definieertabulatie definieertekst definieertekstachtergrond definieertype \ +definieertypen definieerveld definieerveldstapel definieerwiskundeuitlijnen doordefinieren \ +doorlabelen doornummeren dunnelijn dunnelijnen eenregel \ +ergens externfiguur formulenummer gebruikJSscripts gebruikURL \ +gebruikblokken gebruikexterndocument gebruikexternfiguur gebruikexterngeluidsfragment gebruikmodule \ +gebruikpad gebruiksymbolen gebruiktypescript gebruiktypescriptfile gebruikurl \ +geenbovenenonderregels geenhoofdenvoetregels geenspatie grijskleur haalbuffer \ +haalmarkering haarlijn handhaafblokken hoofdtaal hoog \ +huidigedatum huidigekopnummer inlijnd inregel installeertaal \ +interactiebalk interactiebuttons interactiemenu invullijnen invulregel \ +invultekst kleur kleurenbalk kleurwaarde kloonveld \ +kolom kopnummer laag laho legeregels \ +letter letters lijndikte lijstlengte maand \ +markeer naar naarbox naarpagina nokap \ +noot omgeving omlaag omlijnd onbekend \ +onderdeel op oppagina pagina paginanummer \ +paginareferentie paslayoutaan passendveld plaatsbookmarks plaatsformule \ +plaatskopnummer plaatskoptekst plaatslijst plaatslijstmetsynoniemen plaatslokalevoetnoten \ +plaatsnaastelkaar plaatsonderelkaar plaatsopgrid plaatspaginanummer plaatsplaatsblok \ +plaatsregister plaatsruwelijst plaatssamengesteldelijst plaatssubformule plaatsvoetnoten \ +positioneer produkt programma projekt punten \ +refereer referentie regellinks regelmidden regelrechts \ +resetmarkering romeins rooster roteer schaal \ +scherm schrijfnaarlijst schrijftussenlijst selecteerblokken som \ +spatie spiegel splitsplaatsblok startachtergrond startinteractiemenu \ +startkantlijn startkleur startkop startlokalevoetnoten startmargeblok \ +startnaar startomgeving startomlijnd startonderdeel startopelkaar \ +startplaatsformule startplaatsplaatsblok startprodukt startprojekt startpublicatie \ +startregel startregelcorrectie startregellinks startregelmidden startregelrechts \ +startsom starttekstachtergrond starttekstlijn startuitlijnen stelachtergrondenin \ +stelachtergrondin stelalineasin stelarrangerenin stelblankoin stelblokin \ +stelblokjesin stelblokkopjein stelblokkopjesin stelbovenin stelboventekstenin \ +stelbufferin stelciterenin stelclipin stelcommentaarin steldoordefinierenin \ +steldoornummerenin steldunnelijnenin stelformulein stelformulesin stelformulierenin \ stelhoofdin stelhoofdtekstenin stelingesprongentextin stelinmargein stelinspringenin \ stelinteractiebalkin stelinteractiein stelinteractiemenuin stelinteractieschermin stelinterliniein \ -stelinvullijnenin stelinvulregelsin stelitemgroepin stelitemsin stelkadertekstin \ -stelkantlijnin stelkapitalenin stelkleurenin stelkleurin stelkolommenin \ -stelkopin stelkopnummerin stelkoppeltekenin stelkoppenin stelkorpsin \ -stellayoutin stellijndiktein stellijstin stelmargeblokkenin stelmarkeringin \ -stelnaastplaatsenin stelomlijndin stelonderin stelondertekstenin stelopmaakin \ -stelopsommingenin stelpaginacommentaarin stelpaginanummerin stelpaginanummeringin stelpaginaovergangenin \ -stelpaletin stelpapierformaatin stelpapierin stelparagraafnummerenin stelplaatsblokin \ -stelplaatsbloksplitsenin stelplaatsin stelpositionerenin stelprogrammasin stelrefererenin \ -stelregelnummerenin stelregelsin stelregisterin stelroterenin stelsamengesteldelijstin \ -stelsectieblokin stelsmallerin stelsorterenin stelspatieringin stelstartstopin \ -stelsubpaginanummerin stelsymboolsetin stelsynoniemenin steltaalin steltabellenin \ -steltabulatiein steltekstachtergrondin steltekstin steltekstinhoudin steltekstlijnenin \ -stelteksttekstenin steltolerantiein steltypein steltypenin stelurlin \ -stelveldenin stelveldin stelvoetin stelvoettekstenin stelwiskundeuitlijnenin \ -stelwitruimtein stopJScode stopJSpreamble stopMPclip stopMPcode \ -stopMPdefinitions stopMPdrawing stopMPenvironment stopMPextensions stopMPinclusions \ -stopMPinitializations stopMPpage stopMPpositiongraphic stopMPpositionmethod stopMPrun \ -stopTABLE stopTABLEbody stopTABLEfoot stopTABLEhead stopTABLEnext \ -stopTC stopTD stopTDs stopTEXpage stopTH \ -stopTN stopTR stopTRs stopTX stopTY \ -stopaanhangsel stopachtergrond stopallmodes stoparrangedpages stopaside \ -stopattachment stopbar stopbinom stopbitmapimage stopblockquote \ -stopblokcitaat stopbtxrenderingdefinitions stopbuffer stopbutton stopcatcodetable \ -stopcharacteralign stopcheckedfences stopchemical stopcitaat stopciteer \ -stopcollect stopcollecting stopcolorintent stopcoloronly stopcolorset \ -stopcolumns stopcolumnspan stopcombination stopcomment stopcommentaar \ -stopcontextcode stopcontextdefinitioncode stopctxfunction stopctxfunctiondefinition stopcurrentcolor \ -stopcurrentlistentrywrapper stopdbinom stopdelimited stopdelimitedtext stopdfrac \ -stopdisplaymath stopdmath stopdocument stopdoorstreep stopdoorstrepen \ -stopeffect stopelement stopembeddedxtable stopendofline stopexceptions \ -stopexpanded stopexpandedcollect stopextendedcatcodetable stopexternalfigurecollection stopfigure \ -stopfiguur stopfitfieldframed stopfittingpage stopfloatcombination stopfont \ -stopfontclass stopfontsolution stopformula stopformulas stopfrac \ -stopframedcontent stopframedtext stopgrafiek stopgridsnapping stophbox \ -stophboxestohbox stophboxregister stophelptekst stophelptext stophiddenbar \ -stophiding stophighlight stophoofdstuk stophyphenation stopimath \ -stopindentation stopindentedtext stopinmframed stopinteractiemenu stopinteraction \ -stopinterface stopintermezzo stopintertext stopitemgroup stopkadertekst \ -stopkantlijn stopkleur stopknockout stopkop stoplayout \ -stoplinefiller stoplinenumbering stoplinetable stoplinetablebody stoplinetablecell \ -stoplinetablehead stoplocalheadsetup stoplocallinecorrection stoplocalnotes stoplocalsetups \ -stoplokalevoetnoten stoplua stopluacode stopluaparameterset stopluasetups \ -stopmakeup stopmargeblok stopmarkedcontent stopmathmode stopmathstyle \ -stopmatrices stopmcframed stopmdformula stopmframed stopmixedcolumns \ -stopmode stopmodeset stopmodule stopmoduletestsection stopmpformula \ -stopnaar stopnamedsection stopnamedsubformulas stopnarrow stopnarrower \ -stopnegative stopnicelyfilledbox stopnobar stopnointerference stopnotallmodes \ -stopnotext stopnotmode stopomgeving stopomlijnd stoponderdeel \ -stoponderstreep stoponderstrepen stoponderwerp stopopelkaar stopopposite \ -stopopsomming stopoutputstream stopoverlay stopoverprint stopoverstreep \ -stopoverstrepen stoppagecomment stoppagefigure stoppagegrid stoppagegridspan \ -stoppagelayout stoppar stopparagraaf stopparagraph stopparagraphs \ -stopparagraphscell stopparbuilder stoppath stopplaatsformule stopplacepairedbox \ -stoppositioning stoppositionoverlay stoppositive stoppostponing stopprocessassignmentcommand \ -stopprocessassignmentlist stopprocesscommacommand stopprocesscommalist stopprodukt stopprojekt \ -stopprotect stopprotectedcolors stoppublicatie stoppunctuation stoprandomized \ -stoprandomseed stoprawsetups stopreadingfile stopreferenceprefix stopregel \ -stopregelcorrectie stopregime stopregister stopreusableMPgraphic stopscript \ -stopsdformula stopsectionblock stopsectionblockenvironment stopsectionlevel stopsetups \ -stopsfrac stopshapebox stopshift stopsidebar stopsimplecolumns \ -stopsom stopspecialitem stopspeech stopspformula stopspraak \ -stopspread stopstartstop stopstaticMPfigure stopstaticMPgraphic stopstrictinspectnextcharacter \ -stopstructurepageregister stopstrut stopstyle stopsubformulas stopsubjectlevel \ -stopsubonderwerp stopsubparagraaf stopsubsentence stopsubstack stopsubsubonderwerp \ -stopsubsubparagraaf stopsubsubsubonderwerp stopsubsubsubparagraaf stopsubsubsubsubonderwerp stopsubsubsubsubparagraaf \ -stopsymbolset stoptabel stoptable stoptablehead stoptables \ -stoptabletail stoptabulate stoptabulatehead stoptabulatetail stoptagged \ -stoptbinom stoptekstachtergrond stoptekstlijn stoptexcode stoptexdefinition \ -stoptext stoptextbackgroundmanual stoptextcolor stoptextcolorintent stoptextflow \ -stoptitel stoptokens stoptransparent stoptypescript stoptypescriptcollection \ -stopunderdash stopunderdashes stopunderdot stopunderdots stopunderrandom \ -stopunderrandoms stopunderstrike stopunderstrikes stopunframed stopuniqueMPgraphic \ -stopuniqueMPpagegraphic stopunpacked stopusableMPgraphic stopuseMPgraphic stopusemathstyleparameter \ -stopusingbtxspecification stopvbox stopvboxregister stopvboxtohbox stopvboxtohboxseparator \ -stopviewerlayer stopvtop stopvtopregister stopxcell stopxcellgroup \ -stopxfrac stopxgroup stopxmldisplayverbatim stopxmlinlineverbatim stopxmlraw \ -stopxmlsetups stopxrow stopxrowgroup stopxtable stopxtablebody \ -stopxtablefoot stopxtablehead stopxtablenext stopxxfrac strictdoifelsenextoptional \ -strictdoifnextoptionalelse stripcharacter strippedcsname stripspaces structurelistuservariable \ -structurenumber structuretitle structureuservariable structurevariable strut \ -strutdp strutht struthtdp struttedbox strutwd \ -style styleinstance subonderwerp subpaginanummer subparagraaf \ -subsentence substituteincommalist subsubonderwerp subsubparagraaf subsubsubonderwerp \ -subsubsubparagraaf subsubsubsubonderwerp subsubsubsubparagraaf subtractfeature swapcounts \ -swapdimens swapface swapmacros swaptypeface switchnaarkorps \ -switchstyleonly switchtocolor switchtointerlinespace symbolreference symbool \ -synchronizeblank synchronizeindenting synchronizemarking synchronizeoutputstreams synchronizestrut \ -synchronizewhitespace systemlog systemlogfirst systemloglast systemsetups \ -tLeftarrow tLeftrightarrow tRightarrow taal tabel \ -tabulateautoline tabulateautorule tabulateline tabulaterule taggedctxcommand \ -taggedlabeltexts tbinom tbox tekstlijn tekstreferentie \ -tequal testandsplitstring testfeature testfeatureonce testkolom \ -testpageonly testpagesync testpagina testtokens tex \ -texdefinition texsetup textcitation textcite textcontrolspace \ -textflowcollector textmath textminus textormathchar textplus \ -textvisiblespace tfrac thainumerals thefirstcharacter thenormalizedbodyfontsize \ -theremainingcharacters thickspace thinspace thirdoffivearguments thirdoffourarguments \ -thirdofsixarguments thirdofthreearguments thirdofthreeunexpanded thookleftarrow thookrightarrow \ -threedigitrounding tibetannumerals tightlayer tinyfont titel \ -tlap tleftarrow tleftharpoondown tleftharpoonup tleftrightarrow \ -tleftrightharpoons tmapsto tochar toelichting tolinenote \ -toongrid tooninstellingen toonkader toonkleur toonkleurgroep \ -toonkorps toonkorpsomgeving toonlayout toonopmaak toonpalet \ -toonprint toonstruts toonsymboolset topbox topleftbox \ -toplinebox toprightbox topskippedbox tracecatcodetables tracedfontname \ -traceoutputroutines tracepositions transparencycomponents transparent trel \ -trightarrow trightharpoondown trightharpoonup trightleftharpoons trightoverleftarrow \ -triplebond truefilename truefontname ttriplerel ttwoheadleftarrow \ -ttwoheadrightarrow twodigitrounding tx txx typ \ -type typebuffer typedefinedbuffer typeface typefile \ -typescriptone typescriptprefix typescriptthree typescripttwo typesetbuffer \ -typesetfile uconvertnumber uedcatcodecommand uit uitgerekt \ -undefinevalue undepthed underbar underbars underbartext \ -underbrace underbracetext underbracket underbrackettext underdash \ -underdashes underdot underdots underleftarrow underleftharpoondown \ -underleftharpoonup underleftrightarrow underparent underparenttext underrandom \ -underrandoms underrightarrow underrightharpoondown underrightharpoonup underset \ -understrike understrikes undertwoheadleftarrow undertwoheadrightarrow undoassign \ -unframed unhhbox unihex uniqueMPgraphic uniqueMPpagegraphic \ -unprotected unregisterhyphenationpattern unspaceafter unspaceargument unspaced \ -unspacestring untexargument untexcommand uppercased uppercasestring \ -upperleftdoubleninequote upperleftdoublesixquote upperleftsingleninequote upperleftsinglesixquote upperrightdoubleninequote \ -upperrightdoublesixquote upperrightsingleninequote upperrightsinglesixquote url useMPenvironmentbuffer \ -useMPgraphic useMPlibrary useMPrun useMPvariables useblankparameter \ -usebodyfont usebodyfontparameter usebtxdataset usebtxdefinitions usecolors \ -usecomponent usedummycolorparameter usedummystyleandcolor usedummystyleparameter useenvironment \ -useexternalrendering usefigurebase usefile usegridparameter useindentingparameter \ -useindentnextparameter useinterlinespaceparameter uselanguageparameter useluamodule usemathstyleparameter \ -useproduct useprofileparameter useproject usereferenceparameter userpagenumber \ -usesetupsparameter usestaticMPfigure usesubpath usetexmodule usezipfile \ -utfchar utflower utfupper utilityregisterlength vastespatie \ -vastespaties vboxreference veld veldstapel verbatim \ -verbatimstring verbergblokken verbergen verbosenumber vergelijkkleurgroep \ -vergelijkpalet versie vertaal verticalgrowingbar verticalpositionbar \ -verwerkblokken vglue viewerlayer vl voetnoottekst \ -volledigepaginanummer volledigregister voluit vphantom vpos \ -vsmash vsmashbox vsmashed vspace vspacing \ -wdofstring weekdag widthofstring widthspanningtext wilijnd \ -wiskunde withoutpt word words wordtonumber \ -writedatatolist writestatus xLeftarrow xLeftrightarrow xRightarrow \ -xdefconvertedargument xequal xfrac xhookleftarrow xhookrightarrow \ -xleftarrow xleftharpoondown xleftharpoonup xleftrightarrow xleftrightharpoons \ -xmapsto xmladdindex xmlafterdocumentsetup xmlaftersetup xmlall \ -xmlappenddocumentsetup xmlappendsetup xmlapplyselectors xmlatt xmlattdef \ -xmlattribute xmlattributedef xmlbadinclusions xmlbeforedocumentsetup xmlbeforesetup \ -xmlchainatt xmlchainattdef xmlchecknamespace xmlcommand xmlconcat \ -xmlconcatrange xmlcontext xmlcount xmldefaulttotext xmldirectives \ -xmldirectivesafter xmldirectivesbefore xmldisplayverbatim xmldoif xmldoifelse \ -xmldoifelseempty xmldoifelseselfempty xmldoifelsetext xmldoifelsevalue xmldoifnot \ -xmldoifnotselfempty xmldoifnottext xmldoifselfempty xmldoiftext xmlelement \ -xmlfilter xmlfirst xmlflush xmlflushcontext xmlflushdocumentsetups \ -xmlflushlinewise xmlflushpure xmlflushspacewise xmlflushtext xmlinclude \ -xmlinclusion xmlinclusions xmlinfo xmlinjector xmlinlineverbatim \ -xmlinstalldirective xmllast xmllastatt xmllastmatch xmlloadbuffer \ -xmlloaddata xmlloaddirectives xmlloadfile xmlloadonly xmlmain \ -xmlmapvalue xmlname xmlnamespace xmlnonspace xmlpath \ -xmlpos xmlposition xmlprependdocumentsetup xmlprependsetup xmlprettyprint \ -xmlprocessbuffer xmlprocessdata xmlprocessfile xmlpure xmlraw \ -xmlrefatt xmlregistereddocumentsetups xmlregisteredsetups xmlregisterns xmlremapname \ -xmlremapnamespace xmlremovedocumentsetup xmlremovesetup xmlresetdocumentsetups xmlresetinjectors \ -xmlresetsetups xmlsave xmlsetentity xmlsetfunction xmlsetinjectors \ -xmlsetsetup xmlsetup xmlshow xmlsnippet xmlstrip \ -xmlstripnolines xmlstripped xmlstrippednolines xmltag xmltexentity \ -xmltext xmltobuffer xmltobufferverbose xmltofile xmlvalue \ -xmlverbatim xrel xrightarrow xrightharpoondown xrightharpoonup \ -xrightleftharpoons xrightoverleftarrow xsplitstring xtriplerel xtwoheadleftarrow \ -xtwoheadrightarrow xxfrac xypos +stelinvullijnenin stelinvulregelsin stelitemgroepin stelitemsin stelkadertekstenin \ +stelkadertekstin stelkantlijnin stelkapitalenin stelkleurenin stelkleurin \ +stelkolommenin stelkopin stelkopnummerin stelkoppeltekenin stelkoppenin \ +stelkorpsin stellayoutin stellijndiktein stellijstin stelmargeblokkenin \ +stelmarkeringin stelnaastplaatsenin stelomlijndin stelonderin stelondertekstenin \ +stelopmaakin stelopsommingenin stelpaginacommentaarin stelpaginanummerin stelpaginanummeringin \ +stelpaginaovergangenin stelpaletin stelpapierformaatin stelpapierin stelparagraafnummerenin \ +stelplaatsblokin stelplaatsblokkenin stelplaatsbloksplitsenin stelplaatsin stelpositionerenin \ +stelprogrammasin stelrefererenin stelregelnummerenin stelregelsin stelregisterin \ +stelroterenin stelsamengesteldelijstin stelsectieblokin stelsmallerin stelsorterenin \ +stelspatieringin stelstartstopin stelsubpaginanummerin stelsymboolsetin stelsynoniemenin \ +steltaalin steltabellenin steltabulatiein steltekstachtergrondin steltekstin \ +steltekstinhoudin steltekstlijnenin stelteksttekstenin steltolerantiein steltypein \ +steltypenin steluitlijnenin stelurlin stelveldenin stelveldin \ +stelvoetin stelvoettekstenin stelwiskundeuitlijnenin stelwitruimtein stopachtergrond \ +stopinteractiemenu stopkantlijn stopkleur stopkop stoplokalevoetnoten \ +stopmargeblok stopnaar stopomgeving stopomlijnd stoponderdeel \ +stopopelkaar stopplaatsformule stopplaatsplaatsblok stopprodukt stopprojekt \ +stoppublicatie stopregel stopregelcorrectie stopregellinks stopregelmidden \ +stopregelrechts stopsom stoptekstachtergrond stoptekstlijn stopuitlijnen \ +subpaginanummer switchnaarkorps symbool taal tekstlijn \ +tekstreferentie testkolom testpagina toelichting toongrid \ +tooninstellingen toonkader toonkleur toonkleurgroep toonkorps \ +toonkorpsomgeving toonlayout toonopmaak toonpalet toonprint \ +toonstruts toonsymboolset uit uitgerekt vastespatie \ +vastespaties veld veldstapel verbergblokken vergelijkkleurgroep \ +vergelijkpalet versie vertaal verwerkblokken voetnoottekst \ +volledigepaginanummer volledigregister voluit weekdag wiskunde \ +woordrechts keywordclass.context.pe=\ -AMSTEX AfterPar Alphabeticnumerals AmSTeX \ -And BeforePar Big Bigg Biggl \ -Biggm Biggr Bigl Bigm Bigr \ -CONTEXT Cap Caps Character Characters \ -ConTeXt Context ConvertConstantAfter ConvertToConstant ETEX \ -EveryLine EveryPar GetPar GotoPar Greeknumerals \ -INRSTEX LAMSTEX LATEX LUAJITTEX LUATEX \ -LaTeX LamSTeX Lua LuaTeX LuajitTeX \ -METAFONT METAFUN METAPOST MKII MKIV \ -MKIX MKVI MKXI MONTH MONTHLONG \ -MONTHSHORT MPII MPIV MPVI MPanchor \ -MPbetex MPc MPcode MPcolor MPcoloronly \ -MPcolumn MPd MPdrawing MPfontsizehskip MPgetmultipars \ -MPgetmultishape MPgetposboxes MPh MPinclusions MPleftskip \ -MPll MPlr MPls MPmenubuttons MPn \ -MPoptions MPoverlayanchor MPp MPpage MPpardata \ -MPplus MPpos MPpositiongraphic MPposset MPr \ -MPrawvar MPregion MPrest MPrightskip MPrs \ -MPstring MPtext MPtransparency MPul MPur \ -MPv MPvar MPvariable MPvv MPw \ -MPwhd MPx MPxy MPxywhd MPy \ -MetaFont MetaFun MetaPost NormalizeFontHeight NormalizeFontWidth \ -NormalizeTextHeight NormalizeTextWidth Numbers PDFETEX PDFTEX \ -PDFcolor PICTEX PPCHTEX PPCHTeX PRAGMA \ -PiCTeX PointsToBigPoints PointsToReal PointsToWholeBigPoints PtToCm \ -ReadFile Romannumerals ScaledPointsToBigPoints ScaledPointsToWholeBigPoints Smallcapped \ -TABLE TEX TEXpage TaBlE TeX \ -TheNormalizedFontSize TransparencyHack VerboseNumber WEEKDAY WORD \ -WORDS WidthSpanningText Word Words XETEX \ -XeTeX abjadnaivenumerals abjadnodotnumerals abjadnumerals activatespacehandler \ -adaptcollector adaptfontfeature adaptpapersize addfeature addtoJSpreamble \ -addtocommalist addvalue aftersplitstring aftertestandsplitstring alignmentcharacter \ -allinputpaths alphabeticnumerals alwayscitation alwayscite ampersand \ -anchor appendetoks appendgvalue appendtocommalist appendtoks \ -appendtoksonce appendvalue apply applyalternativestyle applyprocessor \ -applytocharacters applytofirstcharacter applytosplitstringchar applytosplitstringcharspaced applytosplitstringline \ -applytosplitstringlinespaced applytosplitstringword applytosplitstringwordspaced applytowords arabicdecimals \ -arabicexnumerals arabicnumerals asciistr aside assignalfadimension \ -assigndimen assigndimension assignifempty assigntranslation assignvalue \ -assignwidth assumelongusagecs astype attachment autocap \ -autodirhbox autodirvbox autodirvtop autoinsertnextspace automathematics \ -autosetups availablehsize averagecharwidth backgroundimage backgroundimagefill \ -backgroundline basegrid baselineleftbox baselinemiddlebox baselinerightbox \ -bbox beforesplitstring beforetestandsplitstring big bigbodyfont \ -bigg bigger biggl biggm biggr \ -bigl bigm bigr bigskip binom \ -bitmapimage blap bleed bleedheight bleedwidth \ -blockligatures blockquote bodyfontenvironmentlist bodyfontsize bold \ -boldface bolditalic boldslanted booleanmodevalue bottombox \ -bottomleftbox bottomrightbox boxcursor boxmarker boxofsize \ -boxreference bpos bthiddencitation btxabbreviatedjournal btxaddjournal \ -btxalwayscitation btxauthorfield btxdetail btxdirect btxdoif \ -btxdoifcombiinlistelse btxdoifelse btxdoifelsecombiinlist btxdoifelsesameasprevious btxdoifelsesameaspreviouschecked \ -btxdoifelseuservariable btxdoifnot btxdoifsameaspreviouscheckedelse btxdoifsameaspreviouselse btxdoifuservariableelse \ -btxexpandedjournal btxfield btxfieldname btxfieldtype btxfirstofrange \ -btxflush btxflushauthor btxflushauthorinverted btxflushauthorinvertedshort btxflushauthorname \ -btxflushauthornormal btxflushauthornormalshort btxflushsuffix btxfoundname btxfoundtype \ -btxhybridcite btxlistcitation btxloadjournalist btxoneorrange btxremapauthor \ -btxsavejournalist btxsetup btxsingularorplural btxsingularplural btxtextcitation \ -calligraphic camel cap catcodetablename cbox \ -centerbox centeredbox centerednextbox cfrac chardescription \ -charwidthlanguage checkcharacteralign checkedchar checkedfiller checkedstrippedcsname \ -checkinjector checknextindentation checknextinjector checkpage checkparameters \ -checkpreviousinjector checksoundtrack checktwopassdata checkvariables chem \ -chemical chemicalbottext chemicalmidtext chemicalsymbol chemicaltext \ -chemicaltoptext chineseallnumerals chinesecapnumerals chinesenumerals citation \ -cite clap classfont cldcommand cldcontext \ -cldloadfile cldprocessfile cleftarrow collect collectedtext \ -collectexpanded colorcomponents colored coloronly columnbreak \ -combinepages commalistelement commalistsentence commalistsize comment \ -comparedimension comparedimensioneps completebtxrendering completelist completelistofpublications \ -completelistofsorts completelistofsynonyms complexorsimple complexorsimpleempty composedcollector \ -composedlayer compresult constantdimen constantdimenargument constantemptyargument \ -constantnumber constantnumberargument contentreference continuednumber continueifinputfile \ -convertargument convertcommand convertedcounter converteddimen convertedsubcounter \ -convertmonth convertvalue convertvboxtohbox copypages copyparameters \ -copyposition countersubs counttoken counttokens cramped \ -crampedclap crampedllap crampedrlap crightarrow crightoverleftarrow \ -ctop ctxcommand ctxdirectcommand ctxdirectlua ctxfunction \ -ctxlatecommand ctxlatelua ctxloadluafile ctxlua ctxluabuffer \ -ctxluacode ctxreport ctxsprint currentassignmentlistkey currentassignmentlistvalue \ -currentbtxuservariable currentcommalistitem currentcomponent currentenvironment currentfeaturetest \ -currentinterface currentlanguage currentlistentrydestinationattribute currentlistentrylimitedtext currentlistentrynumber \ -currentlistentrypagenumber currentlistentryreferenceattribute currentlistentrytitle currentlistentrytitlerendered currentlistsymbol \ -currentmainlanguage currentmessagetext currentmoduleparameter currentoutputstream currentproduct \ -currentproject currentregime currentregisterpageuserdata currentresponses currenttime \ -currentvalue currentxtablecolumn currentxtablerow datasetvariable dayoftheweek \ -dayspermonth dbinom decrement decrementcounter decrementedcounter \ -decrementpagenumber decrementsubpagenumber decrementvalue defaultinterface defaultobjectpage \ -defaultobjectreference defcatcodecommand defconvertedargument defconvertedcommand defconvertedvalue \ -defineMPinstance defineTABLEsetup defineactivecharacter definealternativestyle defineanchor \ -defineattachment defineattribute definebackground definebar definebodyfontswitch \ -definebreakpoint definebreakpoints definebtx definebtxdataset definebtxregister \ -definebtxrendering definebutton definecapitals definecharacterkerning definecharacterspacing \ -definechemical definechemicals definechemicalsymbol definecollector definecomment \ -definecomplexorsimple definecomplexorsimpleempty defineconversionset definecounter definedataset \ -definedelimitedtext definedfont defineeffect defineexpandable defineexternalfigure \ -definefallbackfamily definefieldbody definefieldbodyset definefieldcategory definefileconstant \ -definefilefallback definefilesynonym definefiller definefirstline definefittingpage \ -definefontalternative definefontfallback definefontfamily definefontfamilypreset definefontfeature \ -definefontfile definefontsize definefontsolution defineformula defineformulaalternative \ -defineformulaframed defineframedcontent definefrozenfont defineglobalcolor definegraphictypesynonym \ -definegridsnapping defineheadalternative definehelp definehigh definehighlight \ -definehspace definehypenationfeatures defineindentedtext defineindenting defineinitial \ -defineinsertion defineinteraction defineinteractionbar defineinterfaceconstant defineinterfaceelement \ -defineinterfacevariable defineinterlinespace defineintermediatecolor defineitems definelabelclass \ -definelayerpreset definelinefiller definelinenote definelinenumbering definelines \ -definelistalternative definelistextra definelow definelowhigh definelowmidhigh \ -definemarginblock definemargindata definemarker definemathcases definemathcommand \ -definemathdoubleextensible definemathematics definemathextensible definemathfence definemathfraction \ -definemathframed definemathmatrix definemathornament definemathoverextensible definemathovertextextensible \ -definemathradical definemathstackers definemathstyle definemathtriplet definemathunderextensible \ -definemathundertextextensible definemathunstacked definemeasure definemessageconstant definemixedcolumns \ -definemode definemultitonecolor definenamedcolor definenamespace definenarrower \ -definenote defineornament defineoutputroutine defineoutputroutinecommand definepage \ -definepagechecker definepagegrid definepagegridarea definepagegridspan definepageinjection \ -definepageinjectionalternative definepageshift definepagestate definepairedbox defineparagraph \ -defineparallel defineparbuilder definepositioning defineprefixset defineprocesscolor \ -defineprocessor definepushbutton definepushsymbol definerenderingwindow defineresetset \ -definescale definescript definesectionlevels defineselector defineseparatorset \ -defineshift definesidebar definesort definespotcolor definestyleinstance \ -definesubformula definesynonym definesystemattribute definesystemconstant definesystemvariable \ -definetabulation definetextbackground definetextflow definetooltip definetransparency \ -definetwopasslist definetypeface definetypescriptprefix definetypescriptsynonym definetypesetting \ -defineunit defineviewerlayer definevspace definevspacing definevspacingamount \ -definextable delimited delimitedtext depthofstring depthonlybox \ -depthspanningtext determinenoflines devanagarinumerals dfrac digits \ -dimensiontocount directcolor directcolored directconvertedcounter directdummyparameter \ -directgetboxllx directgetboxlly directhighlight directlocalframed directluacode \ -directselect directsetbar directsetup directsymbol directvspacing \ -dis disabledirectives disableexperiments disablemode disableoutputstream \ -disableparpositions disableregime disabletrackers displaymath displaymathematics \ -displaymessage distributedhsize dividedsize doadaptleftskip doadaptrightskip \ -doaddfeature doassign doassignempty doboundtext docheckassignment \ -docheckedpagestate docheckedpair documentvariable dodoubleargument dodoubleargumentwithset \ -dodoubleempty dodoubleemptywithset dodoublegroupempty doeassign doexpandedrecurse \ -dogetattribute dogetattributeid dogetcommacommandelement dogobbledoubleempty dogobblesingleempty \ -doif doifMPgraphicelse doifallcommon doifallcommonelse doifalldefinedelse \ -doifallmodes doifallmodeselse doifassignmentelse doifblackelse doifbothsides \ -doifbothsidesoverruled doifboxelse doifbufferelse doifcolor doifcolorelse \ -doifcommandhandler doifcommandhandlerelse doifcommon doifcommonelse doifcontent \ -doifconversiondefinedelse doifconversionnumberelse doifcounter doifcounterelse doifcurrentfonthasfeatureelse \ -doifdefined doifdefinedcounter doifdefinedcounterelse doifdefinedelse doifdimensionelse \ -doifdimenstringelse doifdocumentargument doifdocumentargumentelse doifdocumentfilename doifdocumentfilenameelse \ -doifdrawingblackelse doifelse doifelseMPgraphic doifelseallcommon doifelsealldefined \ -doifelseallmodes doifelseassignment doifelseblack doifelsebox doifelsebuffer \ -doifelsecolor doifelsecommandhandler doifelsecommon doifelseconversiondefined doifelseconversionnumber \ -doifelsecounter doifelsecurrentfonthasfeature doifelsecurrentsortingused doifelsecurrentsynonymshown doifelsecurrentsynonymused \ -doifelsedefined doifelsedefinedcounter doifelsedimension doifelsedimenstring doifelsedocumentargument \ -doifelsedocumentfilename doifelsedrawingblack doifelseempty doifelseemptyvalue doifelseemptyvariable \ -doifelseenv doifelsefastoptionalcheck doifelsefastoptionalcheckcs doifelsefieldbody doifelsefieldcategory \ -doifelsefigure doifelsefile doifelsefiledefined doifelsefileexists doifelsefirstchar \ -doifelseflagged doifelsefontchar doifelsefontpresent doifelsefontsynonym doifelsehasspace \ -doifelsehelp doifelseincsname doifelseinelement doifelseinputfile doifelseinsertion \ -doifelseinset doifelseinstring doifelseinsymbolset doifelseintoks doifelseintwopassdata \ -doifelseitalic doifelselanguage doifelselayerdata doifelselayoutdefined doifelselayoutsomeline \ -doifelselayouttextline doifelseleapyear doifelselist doifelselocation doifelselocfile \ -doifelsemainfloatbody doifelsemarking doifelsemeaning doifelsemessage doifelsemode \ -doifelsenextbgroup doifelsenextbgroupcs doifelsenextchar doifelsenextoptional doifelsenextoptionalcs \ -doifelsenextparenthesis doifelsenonzeropositive doifelsenoteonsamepage doifelsenothing doifelsenumber \ -doifelseobjectfound doifelseobjectreferencefound doifelseoddpage doifelseoddpagefloat doifelseoldercontext \ -doifelseolderversion doifelseoverlapping doifelseoverlay doifelseparallel doifelseparentfile \ -doifelsepath doifelsepathexists doifelsepatterns doifelseposition doifelsepositionaction \ -doifelsepositiononpage doifelsepositionsonsamepage doifelsepositionsonthispage doifelsepositionsused doifelsereferencefound \ -doifelserightpagefloat doifelserighttoleftinbox doifelsesamelinereference doifelsesamestring doifelsesetups \ -doifelsesomebackground doifelsesomespace doifelsesomething doifelsesometoks doifelsestringinstring \ -doifelsestructurelisthasnumber doifelsestructurelisthaspage doifelsesymboldefined doifelsesymbolset doifelsetext \ -doifelsetextflow doifelsetextflowcollector doifelsetypingfile doifelseundefined doifelseurldefined \ -doifelsevalue doifelsevaluenothing doifelsevariable doifempty doifemptyelse \ -doifemptytoks doifemptyvalue doifemptyvalueelse doifemptyvariable doifemptyvariableelse \ -doifenv doifenvelse doiffastoptionalcheckcselse doiffastoptionalcheckelse doiffieldbodyelse \ -doiffieldcategoryelse doiffigureelse doiffile doiffiledefinedelse doiffileelse \ -doiffileexistselse doiffirstcharelse doifflaggedelse doiffontcharelse doiffontpresentelse \ -doiffontsynonymelse doifhasspaceelse doifhelpelse doifincsnameelse doifinelementelse \ -doifinputfileelse doifinsertionelse doifinset doifinsetelse doifinstring \ -doifinstringelse doifinsymbolset doifinsymbolsetelse doifintokselse doifintwopassdataelse \ -doifitalicelse doiflanguageelse doiflayerdataelse doiflayoutdefinedelse doiflayoutsomelineelse \ -doiflayouttextlineelse doifleapyearelse doiflistelse doiflocationelse doiflocfileelse \ -doifmainfloatbodyelse doifmarkingelse doifmeaningelse doifmessageelse doifmode \ -doifmodeelse doifnextbgroupcselse doifnextbgroupelse doifnextcharelse doifnextoptionalcselse \ -doifnextoptionalelse doifnextparenthesiselse doifnonzeropositiveelse doifnot doifnotallcommon \ -doifnotallmodes doifnotcommandhandler doifnotcommon doifnotcounter doifnotdocumentargument \ -doifnotdocumentfilename doifnotempty doifnotemptyvalue doifnotemptyvariable doifnotenv \ -doifnoteonsamepageelse doifnotescollected doifnotfile doifnotflagged doifnothing \ -doifnothingelse doifnotinset doifnotinsidesplitfloat doifnotinstring doifnotmode \ -doifnotnumber doifnotsamestring doifnotsetups doifnotvalue doifnotvariable \ -doifnumber doifnumberelse doifobjectfoundelse doifobjectreferencefoundelse doifoddpageelse \ -doifoddpagefloatelse doifoldercontextelse doifolderversionelse doifoverlappingelse doifoverlayelse \ -doifparallelelse doifparentfileelse doifpathelse doifpathexistselse doifpatternselse \ -doifposition doifpositionaction doifpositionactionelse doifpositionelse doifpositiononpageelse \ -doifpositionsonsamepageelse doifpositionsonthispageelse doifpositionsusedelse doifreferencefoundelse doifrightpagefloatelse \ -doifrighttoleftinboxelse doifsamelinereferenceelse doifsamestring doifsamestringelse doifsetups \ -doifsetupselse doifsomebackground doifsomebackgroundelse doifsomespaceelse doifsomething \ -doifsomethingelse doifsometoks doifsometokselse doifstringinstringelse doifstructurelisthasnumberelse \ -doifstructurelisthaspageelse doifsymboldefinedelse doifsymbolsetelse doiftext doiftextelse \ -doiftextflowcollectorelse doiftextflowelse doiftypingfileelse doifundefined doifundefinedcounter \ -doifundefinedelse doifurldefinedelse doifvalue doifvalueelse doifvaluenothing \ -doifvaluenothingelse doifvaluesomething doifvariable doifvariableelse doindentation \ -dollar doloop doloopoverlist donothing dontconvertfont \ -dontleavehmode dontpermitspacesbetweengroups dopositionaction doprocesslocalsetups doquadrupleargument \ -doquadrupleempty doquadruplegroupempty doquintupleargument doquintupleempty doquintuplegroupempty \ -dorechecknextindentation dorecurse dorepeatwithcommand doreplacefeature doresetandafffeature \ -doresetattribute dorotatebox dosetattribute dosetleftskipadaption dosetrightskipadaption \ -dosetupcheckedinterlinespace doseventupleargument doseventupleempty dosingleargument dosingleempty \ -dosinglegroupempty dosixtupleargument dosixtupleempty dostepwiserecurse dosubtractfeature \ -dotfskip dotoks dotripleargument dotripleargumentwithset dotripleempty \ -dotripleemptywithset dotriplegroupempty doublebar doublebond doublebrace \ -doublebracket doubleparent dowith dowithnextbox dowithnextboxcontent \ -dowithnextboxcontentcs dowithnextboxcs dowithpargument dowithrange dowithwargument \ -dpofstring dummydigit dummyparameter eTeX edefconvertedargument \ -efcmaxheight efcmaxwidth efcminheight efcminwidth efcparameter \ -effect elapsedseconds elapsedtime eleftarrowfill eleftharpoondownfill \ -eleftharpoonupfill eleftrightarrowfill emphasisboldface emphasistypeface emspace \ -enabledirectives enableexperiments enablemode enableoutputstream enableparpositions \ -enableregime enabletrackers enskip enspace env \ -envvar eoverbarfill eoverbracefill eoverbracketfill eoverparentfill \ -epos equaldigits erightarrowfill erightharpoondownfill erightharpoonupfill \ -etwoheadrightarrowfill eunderbarfill eunderbracefill eunderbracketfill eunderparentfill \ -executeifdefined exitloop exitloopnow expandcheckedcsname expanded \ -expandfontsynonym externalfigurecollectionmaxheight externalfigurecollectionmaxwidth externalfigurecollectionminheight externalfigurecollectionminwidth \ -externalfigurecollectionparameter fakebox fastdecrement fastincrement fastlocalframed \ -fastscale fastsetup fastsetupwithargument fastsetupwithargumentswapped fastswitchtobodyfont \ -fastsxsy feature fence fenced fetchallmarkings \ -fetchallmarks fetchmark fetchmarking fetchonemark fetchonemarking \ -fetchruntinecommand fetchtwomarkings fetchtwomarks fieldbody fifthoffivearguments \ -fifthofsixarguments figurefilename figurefilepath figurefiletype figurefullname \ -figureheight figurenaturalheight figurenaturalwidth figuresymbol figurewidth \ -filename filledhboxb filledhboxc filledhboxg filledhboxk \ -filledhboxm filledhboxr filledhboxy filler filterfromnext \ -filterfromvalue filterpages filterreference findtwopassdata finishregisterentry \ -firstcharacter firstcounter firstcountervalue firstoffivearguments firstoffourarguments \ -firstofoneargument firstofoneunexpanded firstofsixarguments firstofthreearguments firstofthreeunexpanded \ -firstoftwoarguments firstoftwounexpanded firstrealpage firstrealpagenumber firstsubcountervalue \ -firstsubpage firstsubpagenumber firstuserpage firstuserpagenumber fitfieldframed \ -fittopbaselinegrid flag floatuserdataparameter flushboxregister flushcollector \ -flushlayer flushlocalfloats flushnextbox flushnotes flushoutputstream \ -flushshapebox flushtextflow flushtokens flushtoks fontalternative \ -fontbody fontchar fontcharbyindex fontclass fontclassname \ -fontface fontfeaturelist fontsize fontstyle forcecharacterstripping \ -forcelocalfloats forgeteverypar forgetparameters formula foundbox \ -fourthoffivearguments fourthoffourarguments fourthofsixarguments frac frameddimension \ -framedparameter framedtext freezedimenmacro freezemeasure frenchspacing \ -fromlinenote frozenhbox gdefconvertedargument gdefconvertedcommand getMPdrawing \ -getMPlayer getboxllx getboxlly getbufferdata getcommacommandsize \ -getcommalistsize getdayoftheweek getdayspermonth getdefinedbuffer getdocumentargument \ -getdocumentargumentdefault getdocumentfilename getdummyparameters getemptyparameters geteparameters \ -getexpandedparameters getfiguredimensions getfirstcharacter getfirsttwopassdata getfromcommacommand \ -getfromcommalist getfromtwopassdata getglyphdirect getglyphstyled getgparameters \ -getlasttwopassdata getlocalfloat getlocalfloats getmessage getnamedglyphdirect \ -getnamedglyphstyled getnamedtwopassdatalist getnaturaldimensions getnoflines getobject \ -getobjectdimensions getpaletsize getparameters getprivatechar getprivateslot \ -getrandomcount getrandomdimen getrandomfloat getrandomnumber getrandomseed \ -getraweparameters getrawgparameters getrawnoflines getrawparameters getrawxparameters \ -getreference getreferenceentry getroundednoflines getsubstring gettwopassdata \ -gettwopassdatalist getuvalue getvalue getvariable getvariabledefault \ -getxparameters globaldisablemode globalenablemode globalletempty globalpopbox \ -globalpopmacro globalpreventmode globalprocesscommalist globalpushbox globalpushmacro \ -globalswapcounts globalswapdimens globalswapmacros globalundefine glyphfontfile \ -gobbledoubleempty gobbleeightarguments gobblefivearguments gobblefiveoptionals gobblefourarguments \ -gobblefouroptionals gobbleninearguments gobbleoneargument gobbleoneoptional gobblesevenarguments \ -gobblesingleempty gobblesixarguments gobblespacetokens gobbletenarguments gobblethreearguments \ -gobblethreeoptionals gobbletwoarguments gobbletwooptionals gobbleuntil gobbleuntilrelax \ -grabbufferdata grabbufferdatadirect grabuntil grayvalue greedysplitstring \ -greeknumerals groupedcommand gsetboxllx gsetboxlly gujaratinumerals \ -gurmurkhinumerals hairspace halfwaybox handletokens handwritten \ -hash hboxofvbox hboxreference hdofstring headhbox \ -headnumbercontent headnumberdistance headnumberwidth headreferenceattributes headsetupspacing \ -headtextcontent headtextdistance headtextwidth headvbox headwidth \ -heightanddepthofstring heightofstring heightspanningtext helptext hglue \ -hiddenbar hiddencitation hiddencite highlight highordinalstr \ -hilo himilo horizontalgrowingbar horizontalpositionbar hphantom \ -hpos hsizefraction hsmash hsmashbox hsmashed \ -hspace htdpofstring htofstring hyphen hyphenatedcoloredword \ -hyphenatedfile hyphenatedfilename hyphenatedhbox hyphenatedpar hyphenatedurl \ -hyphenatedword ibox ifassignment iff ifinobject \ -ifinoutputstream ifparameters iftrialtypesetting ignoreimplicitspaces ignorevalue \ -immediatesavetwopassdata impliedby implies includemenu includeversioninfo \ -increment incrementcounter incrementedcounter incrementpagenumber incrementsubpagenumber \ -incrementvalue indentation infofont infofontbold inheritparameter \ -inhibitblank initializeboxstack inlinebuffer inlinedbox inlinemath \ -inlinemathematics inlinemessage inlineordisplaymath inlinerange inmframed \ -innerflushshapebox input inputfilebarename inputfilename inputfilerealsuffix \ -inputfilesuffix inputgivenfile insertpages installactionhandler installactivecharacter \ -installanddefineactivecharacter installattributestack installautocommandhandler installautosetuphandler installbasicautosetuphandler \ -installbasicparameterhandler installbottomframerenderer installcommandhandler installcorenamespace installdefinehandler \ -installdefinitionset installdefinitionsetmember installdirectcommandhandler installdirectparameterhandler installdirectparametersethandler \ -installdirectsetuphandler installdirectstyleandcolorhandler installframedautocommandhandler installframedcommandhandler installleftframerenderer \ -installnamespace installoutputroutine installpagearrangement installparameterhandler installparameterhashhandler \ -installparametersethandler installparentinjector installrightframerenderer installrootparameterhandler installsetuphandler \ -installsetuponlycommandhandler installshipoutmethod installsimplecommandhandler installsimpleframedcommandhandler installstyleandcolorhandler \ -installswitchcommandhandler installswitchsetuphandler installtexdirective installtextracker installtopframerenderer \ -installunitsseparator installunitsspace installversioninfo integerrounding intertext \ -invokepageheandler istltdir istrtdir italic italicbold \ -italiccorrection itemtag jobfilename jobfilesuffix kap \ -keeplinestogether keepunwantedspaces kerncharacters koreancirclenumerals koreannumerals \ -koreannumeralsc koreannumeralsp koreanparentnumerals languageCharacters languagecharacters \ -languagecharwidth lastcounter lastcountervalue lastdigit lastlinewidth \ -lastnaturalboxdp lastnaturalboxht lastnaturalboxwd lastpredefinedsymbol lastrealpage \ -lastrealpagenumber lastsubcountervalue lastsubpage lastsubpagenumber lasttwodigits \ -lastuserpage lastuserpagenumber lateluacode layeredtext layerheight \ -layerwidth lazysavetaggedtwopassdata lazysavetwopassdata lbox left \ -leftbottombox leftbox lefthbox leftorrighthbox leftorrightvbox \ -leftorrightvtop leftskipadaption leftsubguillemot lefttopbox lefttorighthbox \ -lefttorightvbox lefttorightvtop letbeundefined letcatcodecommand letcscsname \ -letcsnamecs letcsnamecsname letdummyparameter letempty letgvalue \ -letgvalueempty letgvalurelax letterampersand letterat letterbackslash \ -letterbar letterbgroup letterclosebrace lettercolon letterdollar \ -letterdoublequote letteregroup letterescape letterexclamationmark letterhash \ -letterhat letterleftbrace letterless lettermore letteropenbrace \ -letterpercent letterquestionmark letterrightbrace lettersinglequote letterslash \ -letterspacing lettertilde letterunderscore letvalue letvalueempty \ -letvaluerelax lfence lhbox limitatelines limitatetext \ -limtatefirstline linespanningtext listcitation listcite listnamespaces \ -llap loadanyfile loadanyfileonce loadbtxdefinitionfile loadbtxreplacementfile \ -loadcldfile loadcldfileonce loadfontgoodies loadluafile loadluafileonce \ -loadspellchecklist loadtexfile loadtexfileonce loadtypescriptfile localframed \ -localframedwithsettings localhsize localpopbox localpopmacro localpushbox \ -localpushmacro localundefine locatedfilepath locatefilepath locfilename \ -lomihi lowerbox lowercased lowercasestring lowerleftdoubleninequote \ -lowerleftsingleninequote lowerrightdoubleninequote lowerrightsingleninequote lrtbbox ltop \ -luaTeX luacode luaconditional luaenvironment luaexpanded \ -luafunction luajitTeX luamajorversion luaminorversion luaparameterset \ -luasetup luaversion m mLeftarrow mLeftrightarrow \ -mRightarrow makecharacteractive makerawcommalist makestrutofbox mapfontsize \ -margindata markcontent markinjector mat math \ -mathbf mathbi mathblackboard mathbs mathcommand \ -mathdefault mathfraktur mathfunction mathit mathitalic \ -mathop mathrm mathscript mathsl mathss \ -mathtext mathtextbf mathtextbi mathtextbs mathtextit \ -mathtextsl mathtexttf mathtf mathtriplet mathtt \ -mathupright mathword mathwordbf mathwordbi mathwordbs \ -mathwordit mathwordsl mathwordtf mbox mcframed \ -md measure measured medskip medspace \ -mequal message metaTeX mfence mframed \ -mfunction mfunctionlabeltext mhbox mhookleftarrow mhookrightarrow \ -middle middlebox midhbox minimalhbox mixedcaps \ -mkvibuffer mleftarrow mleftharpoondown mleftharpoonup mleftrightarrow \ -mleftrightharpoons mmapsto moduleparameter molecule mono \ -monobold mononormal monthlong monthshort mp \ -mprandomnumber mrel mrightarrow mrightharpoondown mrightharpoonup \ -mrightleftharpoons mrightoverleftarrow mtext mtriplerel mtwoheadleftarrow \ -mtwoheadrightarrow namedheadnumber namedstructureheadlocation namedstructureuservariable namedstructurevariable \ -namedtaggedlabeltexts naturalhbox naturalhpack naturalvbox naturalvcenter \ -naturalvpack naturalvtop naturalwd negatecolorbox negated \ -negthinspace newattribute newcatcodetable newcounter newevery \ -newfrenchspacing newmode newsignal newsystemmode nextbox \ -nextboxdp nextboxht nextboxhtdp nextboxwd nextcounter \ -nextcountervalue nextdepth nextparagraphs nextrealpage nextrealpagenumber \ -nextsubcountervalue nextsubpage nextsubpagenumber nextuserpage nextuserpagenumber \ -nobar nocitation nocite nodetostring noffigurepages \ -noflines noflocalfloats noindentation noitem nonfrenchspacing \ -nonmathematics normal normalboldface normalframedwithsettings normalizebodyfontsize \ -normalizedfontsize normalizefontdepth normalizefontheight normalizefontline normalizefontwidth \ -normalizetextdepth normalizetextheight normalizetextline normalizetextwidth normaltypeface \ -notesymbol ntimes numberofpoints obeydepth objectdepth \ -objectheight objectmargin objectwidth obox offset \ -offsetbox onedigitrounding ordinaldaynumber ordinalstr ornamenttext \ -outputfilename outputstreambox outputstreamcopy outputstreamunvbox outputstreamunvcopy \ -over overbar overbars overbartext overbarunderbar \ -overbrace overbracetext overbraceunderbrace overbracket overbrackettext \ -overbracketunderbracket overlaybutton overlaycolor overlaydepth overlayfigure \ -overlayheight overlaylinecolor overlaylinewidth overlayoffset overlayrollbutton \ -overlaywidth overleftarrow overleftharpoondown overleftharpoonup overleftrightarrow \ -overloaderror overparent overparenttext overparentunderparent overrightarrow \ -overrightharpoondown overrightharpoonup overset overstrike overstrikes \ -overtwoheadleftarrow overtwoheadrightarrow pagearea pagebreak pagefigure \ -pagegridspanwidth pageinjection pagestaterealpage paletsize pdfTeX \ -pdfactualtext pdfbackendactualtext pdfbackendcurrentresources pdfbackendsetcatalog pdfbackendsetcolorspace \ -pdfbackendsetextgstate pdfbackendsetinfo pdfbackendsetname pdfbackendsetpageattribute pdfbackendsetpageresource \ -pdfbackendsetpagesattribute pdfbackendsetpattern pdfbackendsetshade pdfcolor pdfeTeX \ -percent percentdimen permitcaretescape permitcircumflexescape permitspacesbetweengroups \ -persiandecimals persiannumerals phantom phantombox pickupgroupedcommand \ -placeattachments placebtxrendering placecitation placecomments placecurrentformulanumber \ -placedbox placefloatwithsetups placeframed placehelp placeinitial \ -placelayer placelayeredtext placelistofpublications placelistofsorts placelistofsynonyms \ -placelocalnotes placement placenamedfloat placenamedformula placenotes \ -placepairedbox placeparallel placerenderingwindow popattribute popmacro \ -popmode popsystemmode positionoverlay positionregionoverlay postponenotes \ -predefinedfont predefinefont predefinesymbol prefixedpagenumber prependetoks \ -prependgvalue prependtocommalist prependtoks prependtoksonce prependvalue \ -presetdocument presetfieldsymbols pretocommalist prevcounter prevcountervalue \ -preventmode prevrealpage prevrealpagenumber prevsubcountervalue prevsubpage \ -prevsubpagenumber prevuserpage prevuserpagenumber procent processMPbuffer \ -processMPfigurefile processaction processallactionsinset processassignlist processassignmentcommand \ -processassignmentlist processbetween processbodyfontenvironmentlist processcolorcomponents processcommacommand \ -processcommalist processcommalistwithparameters processcontent processfile processfilemany \ -processfilenone processfileonce processfirstactioninset processisolatedchars processisolatedwords \ -processlinetablebuffer processlinetablefile processlist processmonth processranges \ -processseparatedlist processtexbuffer processtokens processuntil processxtablebuffer \ -processyear profiledbox profilegivenbox pseudoMixedCapped pseudoSmallCapped \ -pseudoSmallcapped pseudosmallcapped purenumber pushattribute pushbutton \ -pushmacro pushmode pushoutputstream pushsystemmode qquad \ -quad quads quitcommalist quitprevcommalist quittypescriptscanning \ -raisebox randomizetext randomnumber rawcounter rawcountervalue \ -rawdate rawdoifelseinset rawdoifinset rawdoifinsetelse rawgetparameters \ -rawprocessaction rawprocesscommacommand rawprocesscommalist rawstructurelistuservariable rawsubcountervalue \ -rbox readfile readfixfile readjobfile readlocfile \ -readsetfile readsysfile readtexfile readxmlfile realSmallCapped \ -realSmallcapped realpagenumber realsmallcapped recursedepth recurselevel \ -recursestring redoconvertfont referenceprefix registerattachment registerctxluafile \ -registerexternalfigure registerfontclass registerhyphenationexception registerhyphenationpattern registermenubuttons \ -registersort registersynonym registerunit regular relatemarking \ -relateparameterhandlers relaxvalueifundefined remainingcharacters removebottomthings removedepth \ -removefromcommalist removelastskip removelastspace removemarkedcontent removepunctuation \ -removesubstring removetoks removeunwantedspaces replacefeature replaceincommalist \ -replaceword rescan rescanwithsetup resetMPdrawing resetMPenvironment \ -resetMPinstance resetallattributes resetandaddfeature resetbar resetbreakpoints \ -resetbuffer resetcharacteralign resetcharacterkerning resetcharacterspacing resetcharacterstripping \ -resetcollector resetcounter resetdigitsmanipulation resetdirection resetfeature \ -resetflag resetfontcolorsheme resetfontfallback resetfontsolution resethyphenationfeatures \ -resetinjector resetinteractionmenu resetitaliccorrection resetlayer resetlocalfloats \ -resetmarker resetmode resetpagenumber resetparallel resetpath \ -resetpenalties resetprofile resetreference resetreplacement resetscript \ -resetsetups resetshownsynonyms resetsubpagenumber resetsymbolset resetsystemmode \ -resettimer resettrackers resettrialtypesetting resetusedsortings resetusedsynonyms \ -resetuserpagenumber resetvalue resetvisualizers reshapebox resolvedglyphdirect \ -resolvedglyphstyled restartcounter restorebox restorecatcodes restorecounter \ -restorecurrentattributes restoreendofline restoreglobalbodyfont reusableMPgraphic reuseMPgraphic \ -reuserandomseed revivefeature rfence rhbox right \ -rightbottombox rightbox righthbox rightorleftpageaction rightskipadaption \ -rightsubguillemot righttolefthbox righttoleftvbox righttoleftvtop righttopbox \ -rlap robustaddtocommalist robustdoifelseinset robustdoifinsetelse robustpretocommalist \ -rollbutton roman rtop ruledhbox ruledhpack \ -ruledmbox ruledtopv ruledtpack ruledvbox ruledvpack \ -ruledvtop runMPbuffer runninghbox safechar sans \ -sansbold sansnormal sansserif savebox savebtxdataset \ -savebuffer savecounter savecurrentattributes savenormalmeaning savetaggedtwopassdata \ -savetwopassdata sbox sd secondoffivearguments secondoffourarguments \ -secondofsixarguments secondofthreearguments secondofthreeunexpanded secondoftwoarguments secondoftwounexpanded \ -select serializecommalist serializedcommalist serif serifbold \ -serifnormal setJSpreamble setMPlayer setMPpositiongraphic setMPpositiongraphicrange \ -setMPtext setMPvariable setMPvariables setbar setbigbodyfont \ -setboxllx setboxlly setbreakpoints setcapstrut setcatcodetable \ -setcharacteralign setcharactercasing setcharactercleaning setcharacterkerning setcharacterspacing \ -setcharacterstripping setcharstrut setcollector setcolormodell setcounter \ -setcounterown setcurrentfontclass setdataset setdefaultpenalties setdigitsmanipulation \ -setdirection setdocumentargument setdocumentargumentdefault setdocumentfilename setdummyparameter \ -setelementexporttag setemeasure setevalue setevariable setevariables \ -setfirstline setflag setfont setfontcolorsheme setfontfeature \ -setfontsolution setfontstrut setfractions setgmeasure setgvalue \ -setgvariable setgvariables sethboxregister sethyphenatedurlafter sethyphenatedurlbefore \ -sethyphenatedurlnormal sethyphenationfeatures setinitial setinjector setinteraction \ -setinterfacecommand setinterfaceconstant setinterfaceelements setinterfacemessage setinterfacevariable \ -setinternalrendering setitaliccorrection setlayer setlayerframed setlayertext \ -setlinefiller setlocalhsize setmainbodyfont setmainparbuilder setmarker \ -setmarking setmathstyle setmeasure setmessagetext setmode \ -setnostrut setnote setnotetext setobject setoldstyle \ -setpagegrid setpagereference setpagestate setpagestaterealpageno setpenalties \ -setpercentdimen setposition setpositionbox setpositiondata setpositiondataplus \ -setpositiononly setpositionplus setpositionstrut setprofile setrandomseed \ -setreference setreferencedobject setregisterentry setreplacement setrigidcolumnbalance \ -setrigidcolumnhsize setscript setsectionblock setsimplecolumnhsize setsmallbodyfont \ -setsmallcaps setstackbox setstructurepageregister setstrut setsuperiors \ -setsystemmode settabular settaggedmetadata settightobject settightreferencedobject \ -settightunreferencedobject settrialtypesetting setuevalue setugvalue setunreferencedobject \ -setup setupMPgraphics setupMPinstance setupMPpage setupMPvariables \ -setupTABLE setupTEXpage setupattachment setupbackend setupbar \ -setupbleeding setupbookmark setupbtx setupbtxdataset setupbtxlist \ -setupbtxregister setupbtxrendering setupbutton setupcapitals setupcharacterkerning \ -setupcharacterspacing setupchemical setupchemicalframed setupcollector setupcolumnspan \ -setupcombination setupcounter setupdataset setupdelimitedtext setupdescription \ -setupdirections setupdocument setupeffect setupenumeration setupenv \ -setupexport setupexternalfigure setupexternalsoundtracks setupfieldbody setupfieldcategory \ -setupfieldcontentframed setupfieldlabelframed setupfieldtotalframed setupfiller setupfirstline \ -setupfittingpage setupfloatcaption setupfontexpansion setupfontprotrusion setupfonts \ -setupfontsolution setupformula setupformulaframed setupframedcontent setupframedtext \ -setupglobalreferenceprefix setupheadalternative setuphelp setuphigh setuphighlight \ -setuphyphenation setupindentedtext setupinitial setupinsertion setupitaliccorrection \ -setuplabel setuplayer setuplayeredtext setuplayouttext setuplinefiller \ -setuplinefillers setuplinenote setuplinetable setuplistalternative setuplistextra \ -setuplocalfloats setuplocalinterlinespace setuplow setuplowhigh setuplowmidhigh \ -setupmarginblock setupmargindata setupmarginframed setupmarginrule setupmathcases \ -setupmathematics setupmathfence setupmathfraction setupmathframed setupmathmatrix \ -setupmathornament setupmathradical setupmathstackers setupmathstyle setupmixedcolumns \ -setupmodule setupnotation setupnotations setupnote setupnotes \ -setupoffset setupoffsetbox setupoutputroutine setuppagechecker setuppagegrid \ -setuppagegridarea setuppagegridareatext setuppagegridlines setuppagegridspan setuppagegridstart \ -setuppageinjection setuppageinjectionalternative setuppageshift setuppagestate setuppairedbox \ -setupparagraph setupparagraphintro setupparallel setupperiods setuppositionbar \ -setupprocessor setupprofile setupquotation setuprealpagenumber setupreferenceformat \ -setupreferenceprefix setupreferencestructureprefix setupregisters setuprenderingwindow setups \ -setupscale setupscript setupscripts setupselector setupshift \ -setupsidebar setupspellchecking setupstretched setupstruts setupstyle \ -setupsubformula setuptabulation setuptagging setuptextbackground setuptextflow \ -setuptooltip setupunit setupurl setupuserpagenumber setupversion \ -setupviewerlayer setupvspacing setupwithargument setupwithargumentswapped setupxml \ -setupxtable setuvalue setuxvalue setvalue setvariable \ -setvariables setvboxregister setvisualizerfont setvtopregister setwidthof \ -setxmeasure setxvalue setxvariable setxvariables sfrac \ -shapedhbox showallmakeup showattributes showboxes showbtxdatasetauthors \ -showbtxdatasetcompleteness showbtxdatasetfields showbtxfields showbtxhashedauthors showbtxtables \ -showchardata showcharratio showcolorbar showcolorcomponents showcolorset \ -showcolorstruts showcounter showdirectives showdirsinmargin showedebuginfo \ -showexperiments showfont showfontdata showfontkerns showfontparameters \ -showfontstrip showfontstyle showglyphs showgridsnapping showhelp \ -showhyphenationtrace showhyphens showinjector showjustification showkerning \ -showlayoutcomponents showligature showligatures showlogcategories showmargins \ -showmessage showminimalbaseline shownextbox showotfcomposition showparentchain \ -showsetupsdefinition showtimer showtokens showtrackers showvalue \ -showvariable showwarning simplegroupedcommand singalcharacteralign singlebond \ -sixthofsixarguments slanted slantedbold slicepages slovenianNumerals \ -sloveniannumerals small smallbodyfont smallbold smallbolditalic \ -smallboldslanted smallcappedcharacters smallcappedromannumerals smaller smallitalicbold \ -smallnormal smallskip smallslanted smallslantedbold smalltype \ -smash smashbox smashboxed smashedhbox smashedvbox \ -snaptogrid someheadnumber somekindoftab somelocalfloat somenamedheadnumber \ -someplace sp spanishNumerals spanishnumerals speech \ -splitatasterisk splitatcolon splitatcolons splitatcomma splitdfrac \ -splitfilename splitfrac splitoffbase splitofffull splitoffkind \ -splitoffname splitoffpath splitoffroot splitofftokens splitofftype \ -splitstring spreadhbox sqrt stackrel startregister \ -startstructurepageregister stopregister stopstructurepageregister strictdoifelsenextoptional strictdoifnextoptionalelse \ -stripcharacter strippedcsname stripspaces structurelistuservariable structurenumber \ -structuretitle structureuservariable structurevariable strut strutdp \ -strutht struthtdp struttedbox strutwd style \ -styleinstance subsentence substituteincommalist subtractfeature swapcounts \ -swapdimens swapface swapmacros swaptypeface switchstyleonly \ -switchtocolor switchtointerlinespace symbolreference synchronizeblank synchronizeindenting \ -synchronizemarking synchronizeoutputstreams synchronizestrut synchronizewhitespace systemlog \ -systemlogfirst systemloglast systemsetups tLeftarrow tLeftrightarrow \ -tRightarrow tabulateautoline tabulateautorule tabulateline tabulaterule \ -taggedctxcommand taggedlabeltexts tbinom tbox tequal \ -testandsplitstring testfeature testfeatureonce testpageonly testpagesync \ -testtokens texdefinition texsetup textcitation textcite \ -textcontrolspace textflowcollector textmath textminus textormathchar \ -textplus textvisiblespace tfrac thainumerals thefirstcharacter \ -thenormalizedbodyfontsize theremainingcharacters thickspace thinspace thirdoffivearguments \ -thirdoffourarguments thirdofsixarguments thirdofthreearguments thirdofthreeunexpanded thookleftarrow \ -thookrightarrow threedigitrounding tibetannumerals tightlayer tinyfont \ -tlap tleftarrow tleftharpoondown tleftharpoonup tleftrightarrow \ -tleftrightharpoons tmapsto tochar tolinenote topbox \ -topleftbox toplinebox toprightbox topskippedbox tracecatcodetables \ -tracedfontname traceoutputroutines tracepositions transparencycomponents transparent \ -trel trightarrow trightharpoondown trightharpoonup trightleftharpoons \ -trightoverleftarrow triplebond truefilename truefontname ttriplerel \ -ttwoheadleftarrow ttwoheadrightarrow twodigitrounding tx txx \ -typ typedefinedbuffer typeface typescriptone typescriptprefix \ -typescriptthree typescripttwo typesetbuffer typesetfile uconvertnumber \ -uedcatcodecommand undefinevalue undepthed underbar underbars \ -underbartext underbrace underbracetext underbracket underbrackettext \ -underdash underdashes underdot underdots underleftarrow \ -underleftharpoondown underleftharpoonup underleftrightarrow underparent underparenttext \ -underrandom underrandoms underrightarrow underrightharpoondown underrightharpoonup \ -underset understrike understrikes undertwoheadleftarrow undertwoheadrightarrow \ -undoassign unframed unhhbox unihex uniqueMPgraphic \ -uniqueMPpagegraphic unprotected unregisterhyphenationpattern unspaceafter unspaceargument \ -unspaced unspacestring untexargument untexcommand uppercased \ -uppercasestring upperleftdoubleninequote upperleftdoublesixquote upperleftsingleninequote upperleftsinglesixquote \ -upperrightdoubleninequote upperrightdoublesixquote upperrightsingleninequote upperrightsinglesixquote url \ -useJSscripts useMPenvironmentbuffer useMPgraphic useMPlibrary useMPrun \ -useMPvariables useURL useblankparameter usebodyfont usebodyfontparameter \ -usebtxdataset usebtxdefinitions usecolors usecomponent usedummycolorparameter \ -usedummystyleandcolor usedummystyleparameter useenvironment useexternalrendering usefigurebase \ -usefile usegridparameter useindentingparameter useindentnextparameter useinterlinespaceparameter \ -uselanguageparameter useluamodule usemathstyleparameter useproduct useprofileparameter \ -useproject usereferenceparameter userpagenumber usesetupsparameter usestaticMPfigure \ -usesubpath usetexmodule useurl usezipfile utfchar \ -utflower utfupper utilityregisterlength vboxreference verbatim \ -verbatimstring verbosenumber verticalgrowingbar verticalpositionbar vglue \ -viewerlayer vphantom vpos vsmash vsmashbox \ -vsmashed vspace vspacing wdofstring widthofstring \ -widthspanningtext withoutpt word words wordtonumber \ -writedatatolist writestatus xLeftarrow xLeftrightarrow xRightarrow \ -xdefconvertedargument xequal xfrac xhookleftarrow xhookrightarrow \ -xleftarrow xleftharpoondown xleftharpoonup xleftrightarrow xleftrightharpoons \ -xmapsto xmladdindex xmlafterdocumentsetup xmlaftersetup xmlall \ -xmlappenddocumentsetup xmlappendsetup xmlapplyselectors xmlatt xmlattdef \ -xmlattribute xmlattributedef xmlbadinclusions xmlbeforedocumentsetup xmlbeforesetup \ -xmlchainatt xmlchainattdef xmlchecknamespace xmlcommand xmlconcat \ -xmlconcatrange xmlcontext xmlcount xmldefaulttotext xmldirectives \ -xmldirectivesafter xmldirectivesbefore xmldisplayverbatim xmldoif xmldoifelse \ -xmldoifelseempty xmldoifelseselfempty xmldoifelsetext xmldoifelsevalue xmldoifnot \ -xmldoifnotselfempty xmldoifnottext xmldoifselfempty xmldoiftext xmlelement \ -xmlfilter xmlfirst xmlflush xmlflushcontext xmlflushdocumentsetups \ -xmlflushlinewise xmlflushpure xmlflushspacewise xmlflushtext xmlinclude \ -xmlinclusion xmlinclusions xmlinfo xmlinjector xmlinlineverbatim \ -xmlinstalldirective xmllast xmllastatt xmllastmatch xmlloadbuffer \ -xmlloaddata xmlloaddirectives xmlloadfile xmlloadonly xmlmain \ -xmlmapvalue xmlname xmlnamespace xmlnonspace xmlpath \ -xmlpos xmlposition xmlprependdocumentsetup xmlprependsetup xmlprettyprint \ -xmlprocessbuffer xmlprocessdata xmlprocessfile xmlpure xmlraw \ -xmlrefatt xmlregistereddocumentsetups xmlregisteredsetups xmlregisterns xmlremapname \ -xmlremapnamespace xmlremovedocumentsetup xmlremovesetup xmlresetdocumentsetups xmlresetinjectors \ -xmlresetsetups xmlsave xmlsetentity xmlsetfunction xmlsetinjectors \ -xmlsetsetup xmlsetup xmlshow xmlsnippet xmlstrip \ -xmlstripnolines xmlstripped xmlstrippednolines xmltag xmltexentity \ -xmltext xmltobuffer xmltobufferverbose xmltofile xmlvalue \ -xmlverbatim xrel xrightarrow xrightharpoondown xrightharpoonup \ -xrightleftharpoons xrightoverleftarrow xsplitstring xtriplerel xtwoheadleftarrow \ -xtwoheadrightarrow xxfrac xypos آیتم آیتمها \ -آیتمبندی آینه از استفادهبلوکها استفادهدستخطتایپ \ -استفادهشکلخارجی استفادهقطعهموزیکخارجی استفادهمدول استفادهمسیر استفادهنمادها \ -استفادهنوشتارخارجی استفادهپروندهدستخطتایپ اعدادلاتین افزودن انتخاببلوکها \ -بارگذاریآرایش بارگذاریآیتمها بارگذاریارجاع بارگذاریاندازهبرگ بارگذاریباریکتر \ -بارگذاریبافر بارگذاریبالا بارگذاریبردباری بارگذاریبرنامهها بارگذاریبرگ \ -بارگذاریبلوک بارگذاریبلوکبخش بارگذاریتایپ بارگذاریتایپکردن بارگذاریترتیب \ -بارگذاریتنظیمریاضی بارگذاریتهبرگ بارگذاریتورفتگی بارگذاریتوضیح بارگذاریتوضیحصفحه \ -بارگذاریثبت بارگذاریجانشانی بارگذاریجدولها بارگذاریجدولبندی بارگذاریخالی \ -بارگذاریخطها بارگذاریخطهایحاشیه بارگذاریخطهایسیاه بارگذاریخطهایمتن بارگذاریخطهاینازک \ -بارگذاریدرجدرخطها بارگذاریدرجمخالف بارگذاریدوران بارگذاریرنگ بارگذاریرنگها \ -بارگذاریزبان بارگذاریستونها بارگذاریسر بارگذاریسربرگ بارگذاریسرها \ -بارگذاریشرح بارگذاریشروعپایان بارگذاریشمارهزیرصفحه بارگذاریشمارهسر بارگذاریشمارهصفحه \ -بارگذاریشمارهگذاریصفحه بارگذاریشمارهگذاریپاراگراف بارگذاریشمارهگذاریخط بارگذاریشناور بارگذاریشکافتنشناورها \ -بارگذاریطرح بارگذاریطرحبندی بارگذاریعرضخط بارگذاریفاصلهبینخط بارگذاریفضایسفید \ -بارگذاریفضاگذاری بارگذاریقالبی بارگذاریقلممتن بارگذاریلوح بارگذاریلیست \ -بارگذاریلیستترکیبی بارگذاریمترادفها بارگذاریمتن بارگذاریمتنهایبالا بارگذاریمتنسربرگ \ -بارگذاریمتنمتنها بارگذاریمتنپانوشت بارگذاریمتنپایین بارگذاریمجموعهنماد بارگذاریمنویپانل \ -بارگذاریمکانگذاری بارگذاریمیدان بارگذاریمیدانها بارگذاریمیلهپانل بارگذارینشانهشکستن \ -بارگذارینشانهگذاری بارگذارینقل بارگذاریپاراگرافها بارگذاریپانل بارگذاریپایین \ -بارگذاریپردهپانل بارگذاریپرکردنخطها بارگذاریپسزمینه بارگذاریپسزمینهها بارگذاریچیدن \ -بارگذاریگذارصفحه بارگذاریگروههایآیتم بارگذاریگروهآیتم بازنشانینشانهگذاری بخش \ -بدونخطبالاوپایین بدونخطسروتهبرگ بدونفضا برنامه بروبه \ -بروبهجعبه بروبهصفحه بروپایین بلند بلوکهایپردازش \ -بلوکهاپنهان بنویسبینلیست بنویسدرلیست تاریخ تاریخجاری \ -تایپ تایپبافر تایپپرونده ترجمه تعریف \ -تعریفآرایش تعریفالگویجدول تعریفاندازهبرگ تعریفبافر تعریفبخش \ -تعریفبرنامه تعریفبرچسب تعریفبلوک تعریفبلوکبخش تعریفتایپ \ -تعریفتایپکردن تعریفتبدیل تعریفترتیب تعریفترکیب تعریفتنظیمریاضی \ -تعریفتودهمیدان تعریفثبت تعریفجانشانی تعریفجدولبندی تعریفجعبهافقی \ -تعریفرنگ تعریفزیرمیدان تعریفسبک تعریفسبکقلم تعریفسر \ -تعریفشرح تعریفشروعپایان تعریفشمارهبندی تعریفشمایلمرجع تعریفشناور \ -تعریفشکستنستون تعریفشکستصفحه تعریفطرحبندی تعریفقالبی تعریفقلم \ -تعریفقلممتن تعریفلایه تعریفلوح تعریفلیست تعریفلیستترکیبی \ +آیتم آیتمها آینه از \ +استفادهبلوکها استفادهدستخطتایپ استفادهشکلخارجی استفادهقطعهموزیکخارجی استفادهمدول \ +استفادهمسیر استفادهنمادها استفادهنوشتارخارجی استفادهپروندهدستخطتایپ اعدادلاتین \ +افزودن انتخاببلوکها بارگذاریآرایش بارگذاریآیتمها بارگذاریارجاع \ +بارگذاریاندازهبرگ بارگذاریباریکتر بارگذاریبافر بارگذاریبالا بارگذاریبردباری \ +بارگذاریبرنامهها بارگذاریبرگ بارگذاریبلوک بارگذاریبلوکبخش بارگذاریتایپ \ +بارگذاریتایپکردن بارگذاریترتیب بارگذاریتنظیم بارگذاریتنظیمریاضی بارگذاریتهبرگ \ +بارگذاریتورفتگی بارگذاریتوضیح بارگذاریتوضیحصفحه بارگذاریثبت بارگذاریجانشانی \ +بارگذاریجدولها بارگذاریجدولبندی بارگذاریخالی بارگذاریخطها بارگذاریخطهایحاشیه \ +بارگذاریخطهایسیاه بارگذاریخطهایمتن بارگذاریخطهاینازک بارگذاریدرجدرخطها بارگذاریدرجمخالف \ +بارگذاریدوران بارگذاریرنگ بارگذاریرنگها بارگذاریزبان بارگذاریستونها \ +بارگذاریسر بارگذاریسربرگ بارگذاریسرها بارگذاریشرح بارگذاریشرحها \ +بارگذاریشروعپایان بارگذاریشمارهزیرصفحه بارگذاریشمارهسر بارگذاریشمارهصفحه بارگذاریشمارهگذاریها \ +بارگذاریشمارهگذاریصفحه بارگذاریشمارهگذاریپاراگراف بارگذاریشمارهگذاریخط بارگذاریشناور بارگذاریشناورها \ +بارگذاریشکافتنشناورها بارگذاریطرح بارگذاریطرحبندی بارگذاریعرضخط بارگذاریفاصلهبینخط \ +بارگذاریفرمولها بارگذاریفضایسفید بارگذاریفضاگذاری بارگذاریقالبی بارگذاریقلممتن \ +بارگذاریلوح بارگذاریلیست بارگذاریلیستترکیبی بارگذاریمترادفها بارگذاریمتن \ +بارگذاریمتنهایبالا بارگذاریمتنسربرگ بارگذاریمتنقالبی بارگذاریمتنمتنها بارگذاریمتنپانوشت \ +بارگذاریمتنپایین بارگذاریمجموعهنماد بارگذاریمنویپانل بارگذاریمکانگذاری بارگذاریمیدان \ +بارگذاریمیدانها بارگذاریمیلهپانل بارگذارینشانهشکستن بارگذارینشانهگذاری بارگذارینقل \ +بارگذاریپاراگرافها بارگذاریپانل بارگذاریپایین بارگذاریپردهپانل بارگذاریپرکردنخطها \ +بارگذاریپسزمینه بارگذاریپسزمینهها بارگذاریچیدن بارگذاریگذارصفحه بارگذاریگروههایآیتم \ +بارگذاریگروهآیتم بازنشانینشانهگذاری بدونخطبالاوپایین بدونخطسروتهبرگ بدونفضا \ +برنامه بروبه بروبهجعبه بروبهصفحه بروپایین \ +بلند بلوکهایپردازش بلوکهاپنهان بنویسبینلیست بنویسدرلیست \ +تاریخ تاریخجاری تایپ تایپبافر تایپپرونده \ +ترجمه تعریف تعریفآرایش تعریفالگویجدول تعریفاندازهبرگ \ +تعریفبافر تعریفبخش تعریفبرنامه تعریفبرچسب تعریفبلوک \ +تعریفبلوکبخش تعریفتایپ تعریفتایپکردن تعریفتبدیل تعریفترتیب \ +تعریفترکیب تعریفتنظیمریاضی تعریفتودهمیدان تعریفثبت تعریفجانشانی \ +تعریفجدولبندی تعریفجعبهافقی تعریفحرف تعریفرنگ تعریفزیرمیدان \ +تعریفسبک تعریفسبکقلم تعریفسر تعریفشرح تعریفشروعپایان \ +تعریفشمارهبندی تعریفشمایلمرجع تعریفشناور تعریفشکستنستون تعریفشکستصفحه \ +تعریفطرحبندی تعریففرمان تعریفقالبی تعریفقلم تعریفقلممتن \ +تعریفلایه تعریفلهجه تعریفلوح تعریفلیست تعریفلیستترکیبی \ تعریفمترادفها تعریفمترادفقلم تعریفمتن تعریفمتنقالبی تعریفمحیطقلمبدنه \ تعریفمرجع تعریفمنویپانل تعریفمیدان تعریفنشانهگذاری تعریفنماد \ تعریفنمادشکل تعریفپاراگرافها تعریفپروفایل تعریفپوشش تعریفگروهآیتم \ تعریفگروهرنگ تعیینشمارهسر تعیینمحتوایمتن تعیینمشخصاتثبت تعیینمشخصاتلیست \ -تغییربهقلمبدنه تنظیمطرحبندی توجه توری توضیح \ -تولید تک ثبتکامل جدول حرف \ +تغییربهقلمبدنه تنظیمراست تنظیمطرحبندی تنظیموسط توجه \ +توری تولید تک ثبتکامل حرف \ حرفها حفظبلوکها خالی خطهایسیاه خطهاینازک \ خطهاخالی خطسیاه خطمتن خطمو خطنازک \ خا خع در درجثبت درجدرخط \ @@ -5348,641 +1898,209 @@ xtwoheadrightarrow xxfrac xypos آیتم آیتمها \ درمورد درون درپر دریافتبافر دریافتنشانه \ دوران دکمه دکمهمنو دکمهپانل رج \ رنگ رنگخاکستری روزهفته ریاضی زبان \ -زباناصلی زیربخش زیرزیربخش زیرزیرزیربخش زیرزیرزیرزیربخش \ -زیرزیرزیرزیرموضوع زیرزیرزیرموضوع زیرزیرموضوع زیرموضوع ستون \ -ستونامتحان سخنرانی سرپوشکوچکنه شروعJScode شروعJSpreamble \ -شروعMPclip شروعMPcode شروعMPdefinitions شروعMPdrawing شروعMPenvironment \ -شروعMPextensions شروعMPinclusions شروعMPinitializations شروعMPpage شروعMPpositiongraphic \ -شروعMPpositionmethod شروعMPrun شروعTABLE شروعTABLEbody شروعTABLEfoot \ -شروعTABLEhead شروعTABLEnext شروعTC شروعTD شروعTDs \ +زباناصلی ستون ستونامتحان سرپوشکوچکنه شروعJScode \ +شروعJSpreamble شروعLUA شروعMP شروعMPclip شروعMPcode \ +شروعMPdefinitions شروعMPdrawing شروعMPenvironment شروعMPextensions شروعMPinclusions \ +شروعMPinitializations شروعMPpage شروعMPpositiongraphic شروعMPpositionmethod شروعMPrun \ +شروعPARSEDXML شروعTABLE شروعTABLEbody شروعTABLEfoot شروعTABLEhead \ +شروعTABLEnext شروعTC شروعTD شروعTDs شروعTEX \ شروعTEXpage شروعTH شروعTN شروعTR شروعTRs \ -شروعTX شروعTY شروعallmodes شروعarrangedpages شروعaside \ -شروعattachment شروعbar شروعbinom شروعbitmapimage شروعblockquote \ -شروعbtxrenderingdefinitions شروعbuffer شروعbutton شروعcatcodetable شروعcharacteralign \ -شروعcheckedfences شروعchemical شروعcollect شروعcollecting شروعcolorintent \ -شروعcoloronly شروعcolorset شروعcolumns شروعcolumnspan شروعcombination \ -شروعcomment شروعcontextcode شروعcontextdefinitioncode شروعctxfunction شروعctxfunctiondefinition \ -شروعcurrentcolor شروعcurrentlistentrywrapper شروعdbinom شروعdelimited شروعdelimitedtext \ -شروعdfrac شروعdisplaymath شروعdmath شروعdocument شروعeffect \ -شروعelement شروعembeddedxtable شروعendofline شروعexceptions شروعexpanded \ -شروعexpandedcollect شروعextendedcatcodetable شروعexternalfigurecollection شروعfigure شروعfitfieldframed \ -شروعfittingpage شروعfloatcombination شروعfont شروعfontclass شروعfontsolution \ -شروعformula شروعformulas شروعfrac شروعframedcontent شروعframedtext \ -شروعgridsnapping شروعhbox شروعhboxestohbox شروعhboxregister شروعhelptext \ -شروعhiddenbar شروعhiding شروعhighlight شروعhyphenation شروعimath \ -شروعindentation شروعindentedtext شروعinmframed شروعinteraction شروعinterface \ -شروعintertext شروعitemgroup شروعknockout شروعlayout شروعlinecorrection \ -شروعlinefiller شروعlinenumbering شروعlinetable شروعlinetablebody شروعlinetablecell \ +شروعTX شروعTY شروعXML شروعalign شروعalignment \ +شروعallmodes شروعappendices شروعarrangedpages شروعaside شروعattachment \ +شروعbackmatter شروعbar شروعbbordermatrix شروعbitmapimage شروعblockquote \ +شروعbodymatter شروعbordermatrix شروعboxedcolumns شروعbtxlabeltext شروعbtxrenderingdefinitions \ +شروعbuffer شروعcases شروعcatcodetable شروعcenteraligned شروعchapter \ +شروعcharacteralign شروعcheckedfences شروعchemical شروعchemicaltext شروعcollect \ +شروعcollecting شروعcolorintent شروعcoloronly شروعcolorset شروعcolumns \ +شروعcolumnspan شروعcombination شروعcomment شروعcontextcode شروعcontextdefinitioncode \ +شروعctxfunction شروعctxfunctiondefinition شروعcurrentcolor شروعcurrentlistentrywrapper شروعdelimited \ +شروعdelimitedtext شروعdisplaymath شروعdmath شروعdocument شروعeffect \ +شروعelement شروعembeddedxtable شروعendnote شروعendofline شروعexceptions \ +شروعexpanded شروعexpandedcollect شروعextendedcatcodetable شروعexternalfigurecollection شروعfact \ +شروعfigure شروعfiguretext شروعfittingpage شروعfixed شروعfloatcombination \ +شروعfont شروعfontclass شروعfontsolution شروعfootnote شروعformula \ +شروعformulas شروعframedcell شروعframedcontent شروعframedrow شروعframedtable \ +شروعframedtext شروعfrontmatter شروعgraphictext شروعgridsnapping شروعhanging \ +شروعhbox شروعhboxestohbox شروعhboxregister شروعheadtext شروعhelptext \ +شروعhiding شروعhighlight شروعhyphenation شروعimath شروعindentation \ +شروعindentedtext شروعinteraction شروعinterface شروعintermezzotext شروعintertext \ +شروعitemgroup شروعitemgroupcolumns شروعitemize شروعknockout شروعlabeltext \ +شروعlayout شروعlegend شروعlinealignment شروعlinecorrection شروعlinefiller \ +شروعlinenumbering شروعlines شروعlinetable شروعlinetablebody شروعlinetablecell \ شروعlinetablehead شروعlocalfootnotes شروعlocalheadsetup شروعlocallinecorrection شروعlocalnotes \ شروعlocalsetups شروعlua شروعluacode شروعluaparameterset شروعluasetups \ -شروعmakeup شروعmarginblock شروعmarkedcontent شروعmathmode شروعmathstyle \ -شروعmatrices شروعmcframed شروعmdformula شروعmframed شروعmixedcolumns \ -شروعmode شروعmodeset شروعmodule شروعmoduletestsection شروعmpformula \ -شروعnamedsection شروعnamedsubformulas شروعnarrow شروعnarrower شروعnegative \ -شروعnicelyfilledbox شروعnobar شروعnointerference شروعnotallmodes شروعnotext \ -شروعnotmode شروعopposite شروعoutputstream شروعoverlay شروعoverprint \ -شروعpagecomment شروعpagefigure شروعpagegrid شروعpagegridspan شروعpagelayout \ -شروعpar شروعparagraph شروعparagraphs شروعparagraphscell شروعparbuilder \ -شروعpath شروعplacepairedbox شروعpositioning شروعpositionoverlay شروعpositive \ -شروعpostponing شروعprocessassignmentcommand شروعprocessassignmentlist شروعprocesscommacommand شروعprocesscommalist \ -شروعprotect شروعprotectedcolors شروعpunctuation شروعrandomized شروعrandomseed \ -شروعrawsetups شروعreadingfile شروعreferenceprefix شروعregime شروعreusableMPgraphic \ -شروعscript شروعsdformula شروعsectionblock شروعsectionblockenvironment شروعsectionlevel \ -شروعsetups شروعsfrac شروعshapebox شروعshift شروعsidebar \ -شروعsimplecolumns شروعspecialitem شروعspeech شروعspformula شروعspread \ -شروعstartstop شروعstaticMPfigure شروعstaticMPgraphic شروعstrictinspectnextcharacter شروعstrut \ -شروعstyle شروعsubformulas شروعsubjectlevel شروعsubsentence شروعsubstack \ -شروعsymbolset شروعtable شروعtablehead شروعtables شروعtabletail \ -شروعtabulate شروعtabulatehead شروعtabulatetail شروعtagged شروعtbinom \ +شروعmakeup شروعmarginblock شروعmarkedcontent شروعmathalignment شروعmathcases \ +شروعmathlabeltext شروعmathmatrix شروعmathmode شروعmathstyle شروعmatrices \ +شروعmatrix شروعmaxaligned شروعmdformula شروعmiddlealigned شروعmiddlemakeup \ +شروعmixedcolumns شروعmode شروعmodeset شروعmodule شروعmoduletestsection \ +شروعmpformula شروعnamedsection شروعnamedsubformulas شروعnarrow شروعnarrower \ +شروعnegative شروعnicelyfilledbox شروعnointerference شروعnotallmodes شروعnotext \ +شروعnotmode شروعoperatortext شروعopposite شروعoutputstream شروعoverlay \ +شروعoverprint شروعpagecomment شروعpagefigure شروعpagegrid شروعpagegridspan \ +شروعpagelayout شروعpagemakeup شروعpar شروعparagraph شروعparagraphs \ +شروعparagraphscell شروعparbuilder شروعpart شروعpath شروعplacechemical \ +شروعplacefigure شروعplacegraphic شروعplaceintermezzo شروعplacelegend شروعplacepairedbox \ +شروعplacetable شروعpositioning شروعpositionoverlay شروعpositive شروعpostponing \ +شروعprefixtext شروعprocessassignmentcommand شروعprocessassignmentlist شروعprocesscommacommand شروعprocesscommalist \ +شروعprotect شروعprotectedcolors شروعpunctuation شروعquotation شروعquote \ +شروعrandomized شروعrandomseed شروعrawsetups شروعreadingfile شروعreferenceprefix \ +شروعregime شروعreusableMPgraphic شروعscript شروعsdformula شروعsection \ +شروعsectionblock شروعsectionblockenvironment شروعsectionlevel شروعsetups شروعshapebox \ +شروعshift شروعsidebar شروعsimplecolumns شروعspecialitem شروعspeech \ +شروعspformula شروعsplitformula شروعspread شروعstandardmakeup شروعstartstop \ +شروعstaticMPfigure شروعstaticMPgraphic شروعstrictinspectnextcharacter شروعstrut شروعstyle \ +شروعsubformulas شروعsubject شروعsubjectlevel شروعsubsection شروعsubsentence \ +شروعsubstack شروعsubsubject شروعsubsubsection شروعsubsubsubject شروعsubsubsubsection \ +شروعsubsubsubsubject شروعsubsubsubsubsection شروعsubsubsubsubsubject شروعsuffixtext شروعsymbolset \ +شروعtable شروعtablehead شروعtables شروعtabletail شروعtabletext \ +شروعtabulate شروعtabulatehead شروعtabulatetail شروعtagged شروعtaglabeltext \ شروعtexcode شروعtexdefinition شروعtext شروعtextbackground شروعtextbackgroundmanual \ -شروعtextcolor شروعtextcolorintent شروعtextflow شروعtokens شروعtransparent \ -شروعtypescript شروعtypescriptcollection شروعunderdash شروعunderdashes شروعunderdot \ -شروعunderdots شروعunderrandom شروعunderrandoms شروعunderstrike شروعunderstrikes \ -شروعunframed شروعuniqueMPgraphic شروعuniqueMPpagegraphic شروعunpacked شروعusableMPgraphic \ +شروعtextcolor شروعtextcolorintent شروعtextflow شروعtextmakeup شروعtitle \ +شروعtokens شروعtransparent شروعtypescript شروعtypescriptcollection شروعtyping \ +شروعuniqueMPgraphic شروعuniqueMPpagegraphic شروعunittext شروعunpacked شروعusableMPgraphic \ شروعuseMPgraphic شروعusemathstyleparameter شروعusingbtxspecification شروعvbox شروعvboxregister \ شروعvboxtohbox شروعvboxtohboxseparator شروعviewerlayer شروعvtop شروعvtopregister \ -شروعxcell شروعxcellgroup شروعxfrac شروعxgroup شروعxmldisplayverbatim \ -شروعxmlinlineverbatim شروعxmlraw شروعxmlsetups شروعxrow شروعxrowgroup \ -شروعxtable شروعxtablebody شروعxtablefoot شروعxtablehead شروعxtablenext \ -شروعxxfrac شروعآیتم شروعآیتمبندی شروعبخش شروعبروبه \ -شروعتوضیح شروعتولید شروعجدول شروعخطحاشیه شروعخطزدن \ -شروعخطزدنها شروعخطمتن شروعدرجفرمول شروعرنگ شروعزیربخش \ -شروعزیرزیربخش شروعزیرزیرزیربخش شروعزیرزیرزیرزیربخش شروعزیرزیرزیرزیرموضوع شروعزیرزیرزیرموضوع \ -شروعزیرزیرموضوع شروعزیرموضوع شروعسخنرانی شروعسر شروعشکل \ -شروععنوان شروعفشرده شروعفصل شروعقالبی شروعمتنقالبی \ -شروعمتنکمکی شروعمحیط شروعمنویپانل شروعموضوع شروعمولفه \ -شروعمیانپرده شروعمیلهرو شروعمیلهزیر شروعمیلههارو شروعمیلههایزیر \ -شروعنشر شروعنقل شروعنقلبلوک شروعنقلقول شروعپروژه \ -شروعپسزمینه شروعگرافیک شروعخط شمارهزیرصفحه شمارهسر \ -شمارهسرجاری شمارهصفحه شمارهصفحهکامل شمارهفرمول شمارهمبدل \ -شمارهها شکافتنشناور شکل شکلخارجی صفحه \ -صفحهتست طوللیست عرضخط عنوان فصل \ -فضا فضاهایثابت فضایثابت فضایسفیدصحیح قالبی \ -لوحمقایسه ماه متنقالبی متنپانوشت متنکمکی \ -محیط مراجعه مرجع مرجعصفحه مرجعمتن \ -مقایسهگروهرنگ مقداررنگ مقیاس منویپانل موضوع \ -مولفه مکان میانپرده میدان میدانشبیهسازی \ +شروعxcell شروعxcellgroup شروعxgroup شروعxmldisplayverbatim شروعxmlinlineverbatim \ +شروعxmlraw شروعxmlsetups شروعxrow شروعxrowgroup شروعxtable \ +شروعxtablebody شروعxtablefoot شروعxtablehead شروعxtablenext شروعآیتم \ +شروعبروبه شروعتنظیمراست شروعتنظیموسط شروعتولید شروعخطحاشیه \ +شروعخطمتن شروعدرجشناور شروعدرجفرمول شروعرنگ شروعسر \ +شروعفشرده شروعقالبی شروعمحیط شروعمنویپانل شروعمولفه \ +شروعنشر شروعپروژه شروعپسزمینه شروعچپچین شروعخط \ +شمارهزیرصفحه شمارهسر شمارهسرجاری شمارهصفحه شمارهصفحهکامل \ +شمارهفرمول شمارهمبدل شمارهها شکافتنشناور شکلخارجی \ +صفحه صفحهتست طوللیست عرضخط فضا \ +فضاهایثابت فضایثابت فضایسفیدصحیح قالبی لوحمقایسه \ +ماه متنپانوشت محیط مراجعه مرجع \ +مرجعصفحه مرجعمتن مقایسهگروهرنگ مقداررنگ مقیاس \ +منویپانل مولفه مکان میدان میدانشبیهسازی \ میدانپشته میدانکپی میلهرنگ میلهپانل ناشناس \ -نسخه نشانهگذاری نصبزبان نقطهها نقل \ -نقلبلوک نقلقول نماد نمایشآرایش نمایشبارگذاریها \ -نمایشبستها نمایشتوری نمایشرنگ نمایشطرحبندی نمایشقالب \ -نمایشقلمبدنه نمایشلوح نمایشمجموعهعلامت نمایشمحیطقلمبدنه نمایشچاپ \ -نمایشگروهرنگ پابا پایانJScode پایانJSpreamble پایانMPclip \ -پایانMPcode پایانMPdefinitions پایانMPdrawing پایانMPenvironment پایانMPextensions \ -پایانMPinclusions پایانMPinitializations پایانMPpage پایانMPpositiongraphic پایانMPpositionmethod \ -پایانMPrun پایانTABLE پایانTABLEbody پایانTABLEfoot پایانTABLEhead \ -پایانTABLEnext پایانTC پایانTD پایانTDs پایانTEXpage \ -پایانTH پایانTN پایانTR پایانTRs پایانTX \ -پایانTY پایانallmodes پایانarrangedpages پایانaside پایانattachment \ -پایانbar پایانbinom پایانbitmapimage پایانblockquote پایانbtxrenderingdefinitions \ -پایانbuffer پایانbutton پایانcatcodetable پایانcharacteralign پایانcheckedfences \ -پایانchemical پایانcollect پایانcollecting پایانcolorintent پایانcoloronly \ -پایانcolorset پایانcolumns پایانcolumnspan پایانcombination پایانcomment \ -پایانcontextcode پایانcontextdefinitioncode پایانctxfunction پایانctxfunctiondefinition پایانcurrentcolor \ -پایانcurrentlistentrywrapper پایانdbinom پایانdelimited پایانdelimitedtext پایانdfrac \ -پایانdisplaymath پایانdmath پایانdocument پایانeffect پایانelement \ -پایانembeddedxtable پایانendofline پایانexceptions پایانexpanded پایانexpandedcollect \ -پایانextendedcatcodetable پایانexternalfigurecollection پایانfigure پایانfitfieldframed پایانfittingpage \ -پایانfloatcombination پایانfont پایانfontclass پایانfontsolution پایانformula \ -پایانformulas پایانfrac پایانframedcontent پایانframedtext پایانgridsnapping \ -پایانhbox پایانhboxestohbox پایانhboxregister پایانhelptext پایانhiddenbar \ +نسخه نشانهگذاری نصبزبان نقطهها نماد \ +نمایشآرایش نمایشبارگذاریها نمایشبستها نمایشتوری نمایشرنگ \ +نمایشطرحبندی نمایشقالب نمایشقلمبدنه نمایشلوح نمایشمجموعهعلامت \ +نمایشمحیطقلمبدنه نمایشچاپ نمایشگروهرنگ پابا پایانJScode \ +پایانJSpreamble پایانLUA پایانMP پایانMPclip پایانMPcode \ +پایانMPdefinitions پایانMPdrawing پایانMPenvironment پایانMPextensions پایانMPinclusions \ +پایانMPinitializations پایانMPpage پایانMPpositiongraphic پایانMPpositionmethod پایانMPrun \ +پایانPARSEDXML پایانTABLE پایانTABLEbody پایانTABLEfoot پایانTABLEhead \ +پایانTABLEnext پایانTC پایانTD پایانTDs پایانTEX \ +پایانTEXpage پایانTH پایانTN پایانTR پایانTRs \ +پایانTX پایانTY پایانXML پایانalign پایانalignment \ +پایانallmodes پایانappendices پایانarrangedpages پایانaside پایانattachment \ +پایانbackmatter پایانbar پایانbbordermatrix پایانbitmapimage پایانblockquote \ +پایانbodymatter پایانbordermatrix پایانboxedcolumns پایانbtxlabeltext پایانbtxrenderingdefinitions \ +پایانbuffer پایانcases پایانcatcodetable پایانcenteraligned پایانchapter \ +پایانcharacteralign پایانcheckedfences پایانchemical پایانchemicaltext پایانcollect \ +پایانcollecting پایانcolorintent پایانcoloronly پایانcolorset پایانcolumns \ +پایانcolumnspan پایانcombination پایانcomment پایانcontextcode پایانcontextdefinitioncode \ +پایانctxfunction پایانctxfunctiondefinition پایانcurrentcolor پایانcurrentlistentrywrapper پایانdelimited \ +پایانdelimitedtext پایانdisplaymath پایانdmath پایانdocument پایانeffect \ +پایانelement پایانembeddedxtable پایانendnote پایانendofline پایانexceptions \ +پایانexpanded پایانexpandedcollect پایانextendedcatcodetable پایانexternalfigurecollection پایانfact \ +پایانfigure پایانfiguretext پایانfittingpage پایانfixed پایانfloatcombination \ +پایانfont پایانfontclass پایانfontsolution پایانfootnote پایانformula \ +پایانformulas پایانframedcell پایانframedcontent پایانframedrow پایانframedtable \ +پایانframedtext پایانfrontmatter پایانgraphictext پایانgridsnapping پایانhanging \ +پایانhbox پایانhboxestohbox پایانhboxregister پایانheadtext پایانhelptext \ پایانhiding پایانhighlight پایانhyphenation پایانimath پایانindentation \ -پایانindentedtext پایانinmframed پایانinteraction پایانinterface پایانintertext \ -پایانitemgroup پایانknockout پایانlayout پایانlinecorrection پایانlinefiller \ -پایانlinenumbering پایانlinetable پایانlinetablebody پایانlinetablecell پایانlinetablehead \ -پایانlocalfootnotes پایانlocalheadsetup پایانlocallinecorrection پایانlocalnotes پایانlocalsetups \ -پایانlua پایانluacode پایانluaparameterset پایانluasetups پایانmakeup \ -پایانmarginblock پایانmarkedcontent پایانmathmode پایانmathstyle پایانmatrices \ -پایانmcframed پایانmdformula پایانmframed پایانmixedcolumns پایانmode \ -پایانmodeset پایانmodule پایانmoduletestsection پایانmpformula پایانnamedsection \ -پایانnamedsubformulas پایانnarrow پایانnarrower پایانnegative پایانnicelyfilledbox \ -پایانnobar پایانnointerference پایانnotallmodes پایانnotext پایانnotmode \ -پایانopposite پایانoutputstream پایانoverlay پایانoverprint پایانpagecomment \ -پایانpagefigure پایانpagegrid پایانpagegridspan پایانpagelayout پایانpar \ -پایانparagraph پایانparagraphs پایانparagraphscell پایانparbuilder پایانpath \ -پایانplacepairedbox پایانpositioning پایانpositionoverlay پایانpositive پایانpostponing \ -پایانprocessassignmentcommand پایانprocessassignmentlist پایانprocesscommacommand پایانprocesscommalist پایانprotect \ -پایانprotectedcolors پایانpunctuation پایانrandomized پایانrandomseed پایانrawsetups \ -پایانreadingfile پایانreferenceprefix پایانregime پایانreusableMPgraphic پایانscript \ -پایانsdformula پایانsectionblock پایانsectionblockenvironment پایانsectionlevel پایانsetups \ -پایانsfrac پایانshapebox پایانshift پایانsidebar پایانsimplecolumns \ -پایانspecialitem پایانspeech پایانspformula پایانspread پایانstartstop \ +پایانindentedtext پایانinteraction پایانinterface پایانintermezzotext پایانintertext \ +پایانitemgroup پایانitemgroupcolumns پایانitemize پایانknockout پایانlabeltext \ +پایانlayout پایانlegend پایانlinealignment پایانlinecorrection پایانlinefiller \ +پایانlinenumbering پایانlines پایانlinetable پایانlinetablebody پایانlinetablecell \ +پایانlinetablehead پایانlocalfootnotes پایانlocalheadsetup پایانlocallinecorrection پایانlocalnotes \ +پایانlocalsetups پایانlua پایانluacode پایانluaparameterset پایانluasetups \ +پایانmakeup پایانmarginblock پایانmarkedcontent پایانmathalignment پایانmathcases \ +پایانmathlabeltext پایانmathmatrix پایانmathmode پایانmathstyle پایانmatrices \ +پایانmatrix پایانmaxaligned پایانmdformula پایانmiddlealigned پایانmiddlemakeup \ +پایانmixedcolumns پایانmode پایانmodeset پایانmodule پایانmoduletestsection \ +پایانmpformula پایانnamedsection پایانnamedsubformulas پایانnarrow پایانnarrower \ +پایانnegative پایانnicelyfilledbox پایانnointerference پایانnotallmodes پایانnotext \ +پایانnotmode پایانoperatortext پایانopposite پایانoutputstream پایانoverlay \ +پایانoverprint پایانpagecomment پایانpagefigure پایانpagegrid پایانpagegridspan \ +پایانpagelayout پایانpagemakeup پایانpar پایانparagraph پایانparagraphs \ +پایانparagraphscell پایانparbuilder پایانpart پایانpath پایانplacechemical \ +پایانplacefigure پایانplacegraphic پایانplaceintermezzo پایانplacelegend پایانplacepairedbox \ +پایانplacetable پایانpositioning پایانpositionoverlay پایانpositive پایانpostponing \ +پایانprefixtext پایانprocessassignmentcommand پایانprocessassignmentlist پایانprocesscommacommand پایانprocesscommalist \ +پایانprotect پایانprotectedcolors پایانpunctuation پایانquotation پایانquote \ +پایانrandomized پایانrandomseed پایانrawsetups پایانreadingfile پایانreferenceprefix \ +پایانregime پایانreusableMPgraphic پایانscript پایانsdformula پایانsection \ +پایانsectionblock پایانsectionblockenvironment پایانsectionlevel پایانsetups پایانshapebox \ +پایانshift پایانsidebar پایانsimplecolumns پایانspecialitem پایانspeech \ +پایانspformula پایانsplitformula پایانspread پایانstandardmakeup پایانstartstop \ پایانstaticMPfigure پایانstaticMPgraphic پایانstrictinspectnextcharacter پایانstrut پایانstyle \ -پایانsubformulas پایانsubjectlevel پایانsubsentence پایانsubstack پایانsymbolset \ -پایانtable پایانtablehead پایانtables پایانtabletail پایانtabulate \ -پایانtabulatehead پایانtabulatetail پایانtagged پایانtbinom پایانtexcode \ -پایانtexdefinition پایانtext پایانtextbackground پایانtextbackgroundmanual پایانtextcolor \ -پایانtextcolorintent پایانtextflow پایانtokens پایانtransparent پایانtypescript \ -پایانtypescriptcollection پایانunderdash پایانunderdashes پایانunderdot پایانunderdots \ -پایانunderrandom پایانunderrandoms پایانunderstrike پایانunderstrikes پایانunframed \ -پایانuniqueMPgraphic پایانuniqueMPpagegraphic پایانunpacked پایانusableMPgraphic پایانuseMPgraphic \ -پایانusemathstyleparameter پایانusingbtxspecification پایانvbox پایانvboxregister پایانvboxtohbox \ -پایانvboxtohboxseparator پایانviewerlayer پایانvtop پایانvtopregister پایانxcell \ -پایانxcellgroup پایانxfrac پایانxgroup پایانxmldisplayverbatim پایانxmlinlineverbatim \ +پایانsubformulas پایانsubject پایانsubjectlevel پایانsubsection پایانsubsentence \ +پایانsubstack پایانsubsubject پایانsubsubsection پایانsubsubsubject پایانsubsubsubsection \ +پایانsubsubsubsubject پایانsubsubsubsubsection پایانsubsubsubsubsubject پایانsuffixtext پایانsymbolset \ +پایانtable پایانtablehead پایانtables پایانtabletail پایانtabletext \ +پایانtabulate پایانtabulatehead پایانtabulatetail پایانtagged پایانtaglabeltext \ +پایانtexcode پایانtexdefinition پایانtext پایانtextbackground پایانtextbackgroundmanual \ +پایانtextcolor پایانtextcolorintent پایانtextflow پایانtextmakeup پایانtitle \ +پایانtokens پایانtransparent پایانtypescript پایانtypescriptcollection پایانtyping \ +پایانuniqueMPgraphic پایانuniqueMPpagegraphic پایانunittext پایانunpacked پایانusableMPgraphic \ +پایانuseMPgraphic پایانusemathstyleparameter پایانusingbtxspecification پایانvbox پایانvboxregister \ +پایانvboxtohbox پایانvboxtohboxseparator پایانviewerlayer پایانvtop پایانvtopregister \ +پایانxcell پایانxcellgroup پایانxgroup پایانxmldisplayverbatim پایانxmlinlineverbatim \ پایانxmlraw پایانxmlsetups پایانxrow پایانxrowgroup پایانxtable \ -پایانxtablebody پایانxtablefoot پایانxtablehead پایانxtablenext پایانxxfrac \ -پایانآیتم پایانآیتمبندی پایانبخش پایانبروبه پایانتوضیح \ -پایانتولید پایانجدول پایانخطحاشیه پایانخطزدن پایانخطزدنها \ -پایانخطمتن پایاندرجفرمول پایانرنگ پایانزیربخش پایانزیرزیربخش \ -پایانزیرزیرزیربخش پایانزیرزیرزیرزیربخش پایانزیرزیرزیرزیرموضوع پایانزیرزیرزیرموضوع پایانزیرزیرموضوع \ -پایانزیرموضوع پایانسخنرانی پایانسر پایانشکل پایانعنوان \ -پایانفشرده پایانفصل پایانقالبی پایانمتنقالبی پایانمتنکمکی \ -پایانمحیط پایانمنویپانل پایانموضوع پایانمولفه پایانمیانپرده \ -پایانمیلهرو پایانمیلهزیر پایانمیلههارو پایانمیلههایزیر پایاننشر \ -پایاننقل پایاننقلبلوک پایاننقلقول پایانپروژه پایانپسزمینه \ -پایانگرافیک پایانخط پایین پرده پروژه \ -پرکردنمیدان پسزمینه پنهانکردن چوبخط کشیده \ -گرافیک گیره یادداشت یکجا یکخط +پایانxtablebody پایانxtablefoot پایانxtablehead پایانxtablenext پایانآیتم \ +پایانبروبه پایانتنظیمراست پایانتنظیموسط پایانتولید پایانخطحاشیه \ +پایانخطمتن پایاندرجشناور پایاندرجفرمول پایانرنگ پایانسر \ +پایانفشرده پایانقالبی پایانمحیط پایانمنویپانل پایانمولفه \ +پایاننشر پایانپروژه پایانپسزمینه پایانچپچین پایانخط \ +پایین پرده پروژه پرکردنمیدان پسزمینه \ +چوبخط چپچین کشیده کلمهراست گیره \ +یادداشت یکجا یکخط keywordclass.context.ro=\ -AMSTEX AfterPar Alphabeticnumerals AmSTeX \ -And BeforePar Big Bigg Biggl \ -Biggm Biggr Bigl Bigm Bigr \ -CONTEXT CUVANT CUVINTE Caps ConTeXt \ -Context ConvertConstantAfter ConvertToConstant Cuvant Cuvinte \ -ETEX EveryLine EveryPar GetPar GotoPar \ -Greeknumerals INRSTEX Kap LAMSTEX LATEX \ -LUAJITTEX LUATEX LUNA LaTeX LamSTeX \ -Litera Litere Lua LuaTeX LuajitTeX \ -METAFONT METAFUN METAPOST MKII MKIV \ -MKIX MKVI MKXI MONTHLONG MONTHSHORT \ -MPII MPIV MPVI MPanchor MPbetex \ -MPc MPcode MPcolor MPcoloronly MPcolumn \ -MPd MPdrawing MPfontsizehskip MPgetmultipars MPgetmultishape \ -MPgetposboxes MPh MPinclusions MPleftskip MPll \ -MPlr MPls MPmenubuttons MPn MPoptions \ -MPoverlayanchor MPp MPpage MPpardata MPplus \ -MPpos MPpositiongraphic MPposset MPr MPrawvar \ -MPregion MPrest MPrightskip MPrs MPstring \ -MPtext MPtransparency MPul MPur MPv \ -MPvar MPvariable MPvv MPw MPwhd \ -MPx MPxy MPxywhd MPy MetaFont \ -MetaFun MetaPost NormalizeFontHeight NormalizeFontWidth NormalizeTextHeight \ -NormalizeTextWidth Numere Numereromane PDFETEX PDFTEX \ -PDFcolor PICTEX PPCHTEX PPCHTeX PRAGMA \ -PiCTeX PointsToBigPoints PointsToReal PointsToWholeBigPoints PtToCm \ -ReadFile ScaledPointsToBigPoints ScaledPointsToWholeBigPoints Smallcapped TABLE \ -TEX TEXpage TaBlE TeX TheNormalizedFontSize \ -TransparencyHack VerboseNumber WidthSpanningText XETEX XeTeX \ -ZIDINSAPTAMANA abjadnaivenumerals abjadnodotnumerals abjadnumerals activatespacehandler \ -adaptcollector adapteazaaspect adaptfontfeature adaptpapersize addfeature \ -addtoJSpreamble addtocommalist addvalue adubuffer adumarcaje \ +CUVANT CUVINTE Cuvant Cuvinte \ +Kap LUNA Litera Litere Numere \ +Numereromane ZIDINSAPTAMANA adapteazaaspect adubuffer adumarcaje \ afiseazaaspect afiseazaculoare afiseazafonttext afiseazagrid afiseazagrupculoare \ afiseazamakeup afiseazamediufonttext afiseazapaleta afiseazarama afiseazasetari \ -afiseazasetsimboluri afiseazastruts afiseazatiparire aftersplitstring aftertestandsplitstring \ -alignmentcharacter allinputpaths alphabeticnumerals alwayscitation alwayscite \ -ampersand anchor appendetoks appendgvalue appendtocommalist \ -appendtoks appendtoksonce appendvalue apply applyalternativestyle \ -applyprocessor applytocharacters applytofirstcharacter applytosplitstringchar applytosplitstringcharspaced \ -applytosplitstringline applytosplitstringlinespaced applytosplitstringword applytosplitstringwordspaced applytowords \ -arabicdecimals arabicexnumerals arabicnumerals arg asciistr \ -ascundeblocuri ascundere aside assignalfadimension assigndimen \ -assigndimension assignifempty assigntranslation assignvalue assignwidth \ -assumelongusagecs astype attachment autocap autodirhbox \ -autodirvbox autodirvtop autoinsertnextspace automathematics autosetups \ -availablehsize averagecharwidth backgroundimage backgroundimagefill backgroundline \ -baraculoare barainteractiune basegrid baselineleftbox baselinemiddlebox \ -baselinerightbox bbox beforesplitstring beforetestandsplitstring big \ -bigbodyfont bigg bigger biggl biggm \ -biggr bigl bigm bigr bigskip \ -binom bitmapimage blanc blap bleed \ -bleedheight bleedwidth blockligatures blockquote bodyfontenvironmentlist \ -bodyfontsize bold boldface bolditalic boldslanted \ -booleanmodevalue bottombox bottomleftbox bottomrightbox boxcursor \ -boxmarker boxofsize boxreference bpos bthiddencitation \ -btxabbreviatedjournal btxaddjournal btxalwayscitation btxauthorfield btxdetail \ -btxdirect btxdoif btxdoifcombiinlistelse btxdoifelse btxdoifelsecombiinlist \ -btxdoifelsesameasprevious btxdoifelsesameaspreviouschecked btxdoifelseuservariable btxdoifnot btxdoifsameaspreviouscheckedelse \ -btxdoifsameaspreviouselse btxdoifuservariableelse btxexpandedjournal btxfield btxfieldname \ -btxfieldtype btxfirstofrange btxflush btxflushauthor btxflushauthorinverted \ -btxflushauthorinvertedshort btxflushauthorname btxflushauthornormal btxflushauthornormalshort btxflushsuffix \ -btxfoundname btxfoundtype btxhybridcite btxlistcitation btxloadjournalist \ -btxoneorrange btxremapauthor btxsavejournalist btxsetup btxsingularorplural \ -btxsingularplural btxtextcitation butoaneinteractiune buton butonmeniu \ -calligraphic camel camp capitol catcodetablename \ -cbox centerbox centeredbox centerednextbox cfrac \ -chardescription charwidthlanguage checkcharacteralign checkedchar checkedfiller \ -checkedstrippedcsname checkinjector checknextindentation checknextinjector checkpage \ -checkparameters checkpreviousinjector checksoundtrack checktwopassdata checkvariables \ -chem chemical chemicalbottext chemicalmidtext chemicalsymbol \ -chemicaltext chemicaltoptext chineseallnumerals chinesecapnumerals chinesenumerals \ -citat citation cite clap classfont \ -cldcommand cldcontext cldloadfile cldprocessfile cleftarrow \ -clip cloneazacamp collect collectedtext collectexpanded \ -coloana colorcomponents colored coloronly columnbreak \ -combinepages comentariu commalistelement commalistsentence commalistsize \ -comment comparagrupculoare comparapaleta comparedimension comparedimensioneps \ -completeazanumarpagina completebtxrendering completelist completelistofpublications completelistofsorts \ -completelistofsynonyms completeregister complexorsimple complexorsimpleempty componenta \ -composedcollector composedlayer compresult constantdimen constantdimenargument \ -constantemptyargument constantnumber constantnumberargument contentreference continuednumber \ -continueifinputfile convertargument convertcommand convertedcounter converteddimen \ -convertedsubcounter convertestenumar convertmonth convertvalue convertvboxtohbox \ -copiazacamp copypages copyparameters copyposition corecteazaspatiualb \ -countersubs counttoken counttokens cramped crampedclap \ -crampedllap crampedrlap crightarrow crightoverleftarrow ctop \ -ctxcommand ctxdirectcommand ctxdirectlua ctxfunction ctxlatecommand \ -ctxlatelua ctxloadluafile ctxlua ctxluabuffer ctxluacode \ -ctxreport ctxsprint culoare culoaregri currentassignmentlistkey \ -currentassignmentlistvalue currentbtxuservariable currentcommalistitem currentcomponent currentenvironment \ -currentfeaturetest currentinterface currentlanguage currentlistentrydestinationattribute currentlistentrylimitedtext \ -currentlistentrynumber currentlistentrypagenumber currentlistentryreferenceattribute currentlistentrytitle currentlistentrytitlerendered \ -currentlistsymbol currentmainlanguage currentmessagetext currentmoduleparameter currentoutputstream \ -currentproduct currentproject currentregime currentregisterpageuserdata currentresponses \ -currenttime currentvalue currentxtablecolumn currentxtablerow data \ -datacurenta datasetvariable dayoftheweek dayspermonth dbinom \ -decrement decrementcounter decrementedcounter decrementpagenumber decrementsubpagenumber \ -decrementvalue defaultinterface defaultobjectpage defaultobjectreference defcatcodecommand \ -defconvertedargument defconvertedcommand defconvertedvalue defineMPinstance defineTABLEsetup \ -defineactivecharacter definealternativestyle defineanchor defineattachment defineattribute \ -definebackground definebar definebodyfontswitch definebreakpoint definebreakpoints \ -definebtx definebtxdataset definebtxregister definebtxrendering definebutton \ -definecapitals definecharacterkerning definecharacterspacing definechemical definechemicals \ -definechemicalsymbol definecollector definecolumnbreak definecombination definecomment \ -definecomplexorsimple definecomplexorsimpleempty defineconversionset definecounter definedataset \ -definedelimitedtext definedfont defineeffect defineexpandable defineexternalfigure \ -definefallbackfamily definefieldbody definefieldbodyset definefieldcategory definefileconstant \ -definefilefallback definefilesynonym definefiller definefirstline definefittingpage \ -definefontalternative definefontfallback definefontfamily definefontfamilypreset definefontfeature \ -definefontfile definefontsize definefontsolution defineformula defineformulaalternative \ -defineformulaframed defineframedcontent definefrozenfont defineglobalcolor definegraphictypesynonym \ -definegridsnapping defineheadalternative definehelp definehigh definehighlight \ -definehspace definehypenationfeatures defineindentedtext defineindenting defineinitial \ -defineinsertion defineinteraction defineinteractionbar defineinterfaceconstant defineinterfaceelement \ -defineinterfacevariable defineinterlinespace defineintermediatecolor defineitemgroup defineitems \ -definelabelclass definelayer definelayerpreset definelayout definelinefiller \ -definelinenote definelinenumbering definelines definelistalternative definelistextra \ -definelow definelowhigh definelowmidhigh definemarginblock definemargindata \ -definemarker definemathalignment definemathcases definemathcommand definemathdoubleextensible \ -definemathematics definemathextensible definemathfence definemathfraction definemathframed \ -definemathmatrix definemathornament definemathoverextensible definemathovertextextensible definemathradical \ -definemathstackers definemathstyle definemathtriplet definemathunderextensible definemathundertextextensible \ -definemathunstacked definemeasure definemessageconstant definemixedcolumns definemode \ -definemultitonecolor definenamedcolor definenamespace definenarrower definenote \ -defineornament defineoutputroutine defineoutputroutinecommand definepage definepagebreak \ -definepagechecker definepagegrid definepagegridarea definepagegridspan definepageinjection \ -definepageinjectionalternative definepageshift definepagestate definepairedbox defineparagraph \ -defineparallel defineparbuilder defineplacement definepositioning defineprefixset \ -defineprocesscolor defineprocessor definepushbutton definepushsymbol definerenderingwindow \ -defineresetset definescale definescript definesectionlevels defineselector \ -defineseparatorset defineshift definesidebar definesort definespotcolor \ -defineste definesteantet definestebloc definesteblocsectiune definestebuffer \ -definestecamp definesteconversie definesteculoare definestedescriere definestedimensiunehartie \ -definesteenumerare definesteeticheta definestefloat definestefont definestefonttext \ -definesteformatreferinte definestegrupculori definestehbox definesteinconjurare definestelista \ -definestelistacombinata definestemakeup definestemarcaje definestemediulfonttext definestemeniuinteractiune \ -definesteoverlay definestepaleta definesteparagraf definesteprofil definesteprogram \ -definestereferinte definesteregistru definestesablontabel definestesectiune definestesimbol \ -definestesimbolfigura definestesinonim definestesinonimfont definestesortare definestestartstop \ -definestestil definestestilfont definestestivacampuri definestesubcamp definestetabulatori \ -definestetext definestetextinconjurat definestetyping definestyleinstance definesubformula \ -definesynonym definesystemattribute definesystemconstant definesystemvariable definetabulation \ -definetextbackground definetextflow definetooltip definetransparency definetwopasslist \ -definetype definetypeface definetypescriptprefix definetypescriptsynonym definetypesetting \ -defineunit defineviewerlayer definevspace definevspacing definevspacingamount \ -definextable delimited delimitedtext depthofstring depthonlybox \ -depthspanningtext despre determinacaracteristicilelistei determinacaracteristiciregistru determinanumartitlu \ -determinenoflines devanagarinumerals dfrac digits dimensiontocount \ -din directcolor directcolored directconvertedcounter directdummyparameter \ -directgetboxllx directgetboxlly directhighlight directlocalframed directluacode \ -directselect directsetbar directsetup directsymbol directvspacing \ -dis disabledirectives disableexperiments disablemode disableoutputstream \ -disableparpositions disableregime disabletrackers displaymath displaymathematics \ -displaymessage distributedhsize dividedsize doadaptleftskip doadaptrightskip \ -doaddfeature doassign doassignempty doboundtext docheckassignment \ -docheckedpagestate docheckedpair documentvariable dodoubleargument dodoubleargumentwithset \ -dodoubleempty dodoubleemptywithset dodoublegroupempty doeassign doexpandedrecurse \ -dogetattribute dogetattributeid dogetcommacommandelement dogobbledoubleempty dogobblesingleempty \ -doif doifMPgraphicelse doifallcommon doifallcommonelse doifalldefinedelse \ -doifallmodes doifallmodeselse doifassignmentelse doifblackelse doifbothsides \ -doifbothsidesoverruled doifboxelse doifbufferelse doifcolor doifcolorelse \ -doifcommandhandler doifcommandhandlerelse doifcommon doifcommonelse doifcontent \ -doifconversiondefinedelse doifconversionnumberelse doifcounter doifcounterelse doifcurrentfonthasfeatureelse \ -doifdefined doifdefinedcounter doifdefinedcounterelse doifdefinedelse doifdimensionelse \ -doifdimenstringelse doifdocumentargument doifdocumentargumentelse doifdocumentfilename doifdocumentfilenameelse \ -doifdrawingblackelse doifelse doifelseMPgraphic doifelseallcommon doifelsealldefined \ -doifelseallmodes doifelseassignment doifelseblack doifelsebox doifelsebuffer \ -doifelsecolor doifelsecommandhandler doifelsecommon doifelseconversiondefined doifelseconversionnumber \ -doifelsecounter doifelsecurrentfonthasfeature doifelsecurrentsortingused doifelsecurrentsynonymshown doifelsecurrentsynonymused \ -doifelsedefined doifelsedefinedcounter doifelsedimension doifelsedimenstring doifelsedocumentargument \ -doifelsedocumentfilename doifelsedrawingblack doifelseempty doifelseemptyvalue doifelseemptyvariable \ -doifelseenv doifelsefastoptionalcheck doifelsefastoptionalcheckcs doifelsefieldbody doifelsefieldcategory \ -doifelsefigure doifelsefile doifelsefiledefined doifelsefileexists doifelsefirstchar \ -doifelseflagged doifelsefontchar doifelsefontpresent doifelsefontsynonym doifelsehasspace \ -doifelsehelp doifelseincsname doifelseinelement doifelseinputfile doifelseinsertion \ -doifelseinset doifelseinstring doifelseinsymbolset doifelseintoks doifelseintwopassdata \ -doifelseitalic doifelselanguage doifelselayerdata doifelselayoutdefined doifelselayoutsomeline \ -doifelselayouttextline doifelseleapyear doifelselist doifelselocation doifelselocfile \ -doifelsemainfloatbody doifelsemarking doifelsemeaning doifelsemessage doifelsemode \ -doifelsenextbgroup doifelsenextbgroupcs doifelsenextchar doifelsenextoptional doifelsenextoptionalcs \ -doifelsenextparenthesis doifelsenonzeropositive doifelsenoteonsamepage doifelsenothing doifelsenumber \ -doifelseobjectfound doifelseobjectreferencefound doifelseoddpage doifelseoddpagefloat doifelseoldercontext \ -doifelseolderversion doifelseoverlapping doifelseoverlay doifelseparallel doifelseparentfile \ -doifelsepath doifelsepathexists doifelsepatterns doifelseposition doifelsepositionaction \ -doifelsepositiononpage doifelsepositionsonsamepage doifelsepositionsonthispage doifelsepositionsused doifelsereferencefound \ -doifelserightpagefloat doifelserighttoleftinbox doifelsesamelinereference doifelsesamestring doifelsesetups \ -doifelsesomebackground doifelsesomespace doifelsesomething doifelsesometoks doifelsestringinstring \ -doifelsestructurelisthasnumber doifelsestructurelisthaspage doifelsesymboldefined doifelsesymbolset doifelsetext \ -doifelsetextflow doifelsetextflowcollector doifelsetypingfile doifelseundefined doifelseurldefined \ -doifelsevalue doifelsevaluenothing doifelsevariable doifempty doifemptyelse \ -doifemptytoks doifemptyvalue doifemptyvalueelse doifemptyvariable doifemptyvariableelse \ -doifenv doifenvelse doiffastoptionalcheckcselse doiffastoptionalcheckelse doiffieldbodyelse \ -doiffieldcategoryelse doiffigureelse doiffile doiffiledefinedelse doiffileelse \ -doiffileexistselse doiffirstcharelse doifflaggedelse doiffontcharelse doiffontpresentelse \ -doiffontsynonymelse doifhasspaceelse doifhelpelse doifincsnameelse doifinelementelse \ -doifinputfileelse doifinsertionelse doifinset doifinsetelse doifinstring \ -doifinstringelse doifinsymbolset doifinsymbolsetelse doifintokselse doifintwopassdataelse \ -doifitalicelse doiflanguageelse doiflayerdataelse doiflayoutdefinedelse doiflayoutsomelineelse \ -doiflayouttextlineelse doifleapyearelse doiflistelse doiflocationelse doiflocfileelse \ -doifmainfloatbodyelse doifmarkingelse doifmeaningelse doifmessageelse doifmode \ -doifmodeelse doifnextbgroupcselse doifnextbgroupelse doifnextcharelse doifnextoptionalcselse \ -doifnextoptionalelse doifnextparenthesiselse doifnonzeropositiveelse doifnot doifnotallcommon \ -doifnotallmodes doifnotcommandhandler doifnotcommon doifnotcounter doifnotdocumentargument \ -doifnotdocumentfilename doifnotempty doifnotemptyvalue doifnotemptyvariable doifnotenv \ -doifnoteonsamepageelse doifnotescollected doifnotfile doifnotflagged doifnothing \ -doifnothingelse doifnotinset doifnotinsidesplitfloat doifnotinstring doifnotmode \ -doifnotnumber doifnotsamestring doifnotsetups doifnotvalue doifnotvariable \ -doifnumber doifnumberelse doifobjectfoundelse doifobjectreferencefoundelse doifoddpageelse \ -doifoddpagefloatelse doifoldercontextelse doifolderversionelse doifoverlappingelse doifoverlayelse \ -doifparallelelse doifparentfileelse doifpathelse doifpathexistselse doifpatternselse \ -doifposition doifpositionaction doifpositionactionelse doifpositionelse doifpositiononpageelse \ -doifpositionsonsamepageelse doifpositionsonthispageelse doifpositionsusedelse doifreferencefoundelse doifrightpagefloatelse \ -doifrighttoleftinboxelse doifsamelinereferenceelse doifsamestring doifsamestringelse doifsetups \ -doifsetupselse doifsomebackground doifsomebackgroundelse doifsomespaceelse doifsomething \ -doifsomethingelse doifsometoks doifsometokselse doifstringinstringelse doifstructurelisthasnumberelse \ -doifstructurelisthaspageelse doifsymboldefinedelse doifsymbolsetelse doiftext doiftextelse \ -doiftextflowcollectorelse doiftextflowelse doiftypingfileelse doifundefined doifundefinedcounter \ -doifundefinedelse doifurldefinedelse doifvalue doifvalueelse doifvaluenothing \ -doifvaluenothingelse doifvaluesomething doifvariable doifvariableelse doindentation \ -dollar doloop doloopoverlist donothing dontconvertfont \ -dontleavehmode dontpermitspacesbetweengroups dopositionaction doprocesslocalsetups doquadrupleargument \ -doquadrupleempty doquadruplegroupempty doquintupleargument doquintupleempty doquintuplegroupempty \ -dorechecknextindentation dorecurse dorepeatwithcommand doreplacefeature doresetandafffeature \ -doresetattribute dorotatebox dosetattribute dosetleftskipadaption dosetrightskipadaption \ -dosetupcheckedinterlinespace doseventupleargument doseventupleempty dosingleargument dosingleempty \ -dosinglegroupempty dosixtupleargument dosixtupleempty dostepwiserecurse dosubtractfeature \ -dotfskip dotoks dotripleargument dotripleargumentwithset dotripleempty \ -dotripleemptywithset dotriplegroupempty doublebar doublebond doublebrace \ -doublebracket doubleparent dowith dowithnextbox dowithnextboxcontent \ -dowithnextboxcontentcs dowithnextboxcs dowithpargument dowithrange dowithwargument \ -dpofstring dummydigit dummyparameter dute dutebox \ -dutepagina eTeX ecran edefconvertedargument efcmaxheight \ -efcmaxwidth efcminheight efcminwidth efcparameter effect \ -elapsedseconds elapsedtime eleftarrowfill eleftharpoondownfill eleftharpoonupfill \ -eleftrightarrowfill element emphasisboldface emphasistypeface emptylines \ -emspace enabledirectives enableexperiments enablemode enableoutputstream \ -enableparpositions enableregime enabletrackers enskip enspace \ -enumerare env envvar eoverbarfill eoverbracefill \ -eoverbracketfill eoverparentfill epos equaldigits erightarrowfill \ -erightharpoondownfill erightharpoonupfill etwoheadrightarrowfill eunderbarfill eunderbracefill \ -eunderbracketfill eunderparentfill executeifdefined exitloop exitloopnow \ -expandcheckedcsname expanded expandfontsynonym externalfigurecollectionmaxheight externalfigurecollectionmaxwidth \ -externalfigurecollectionminheight externalfigurecollectionminwidth externalfigurecollectionparameter fakebox faraliniiantetsisubsol \ -faraliniisussijos faraspatiu fastdecrement fastincrement fastlocalframed \ -fastscale fastsetup fastsetupwithargument fastsetupwithargumentswapped fastswitchtobodyfont \ -fastsxsy feature fence fenced fetchallmarkings \ -fetchallmarks fetchmark fetchmarking fetchonemark fetchonemarking \ -fetchruntinecommand fetchtwomarkings fetchtwomarks fieldbody fifthoffivearguments \ -fifthofsixarguments figura figuraexterna figurefilename figurefilepath \ -figurefiletype figurefullname figureheight figurenaturalheight figurenaturalwidth \ -figuresymbol figurewidth filename filledhboxb filledhboxc \ -filledhboxg filledhboxk filledhboxm filledhboxr filledhboxy \ -filler filterfromnext filterfromvalue filterpages filterreference \ -findtwopassdata finishregisterentry firdepar firstcharacter firstcounter \ -firstcountervalue firstoffivearguments firstoffourarguments firstofoneargument firstofoneunexpanded \ -firstofsixarguments firstofthreearguments firstofthreeunexpanded firstoftwoarguments firstoftwounexpanded \ -firstrealpage firstrealpagenumber firstsubcountervalue firstsubpage firstsubpagenumber \ -firstuserpage firstuserpagenumber fitfieldframed fittopbaselinegrid flag \ -floatuserdataparameter flushboxregister flushcollector flushlayer flushlocalfloats \ -flushnextbox flushnotes flushoutputstream flushshapebox flushtextflow \ -flushtokens flushtoks folosesteURL folosestebloc folosestedirector \ -folosestedocumentextern folosestefiguraexterna folosestemodul folosestemuzicaexterna folosestescriptJS \ -folosestesimboluri folosesteurl fontalternative fontbody fontchar \ -fontcharbyindex fontclass fontclassname fontface fontfeaturelist \ -fontsize fontstyle footnotetext forcecharacterstripping forcelocalfloats \ -forgeteverypar forgetparameters formula foundbox fourthoffivearguments \ -fourthoffourarguments fourthofsixarguments frac framed frameddimension \ -framedparameter framedtext freezedimenmacro freezemeasure frenchspacing \ -fromlinenote frozenhbox fundal gdefconvertedargument gdefconvertedcommand \ -getMPdrawing getMPlayer getboxllx getboxlly getbufferdata \ -getcommacommandsize getcommalistsize getdayoftheweek getdayspermonth getdefinedbuffer \ -getdocumentargument getdocumentargumentdefault getdocumentfilename getdummyparameters getemptyparameters \ -geteparameters getexpandedparameters getfiguredimensions getfirstcharacter getfirsttwopassdata \ -getfromcommacommand getfromcommalist getfromtwopassdata getglyphdirect getglyphstyled \ -getgparameters getlasttwopassdata getlocalfloat getlocalfloats getmessage \ -getnamedglyphdirect getnamedglyphstyled getnamedtwopassdatalist getnaturaldimensions getnoflines \ -getobject getobjectdimensions getpaletsize getparameters getprivatechar \ -getprivateslot getrandomcount getrandomdimen getrandomfloat getrandomnumber \ -getrandomseed getraweparameters getrawgparameters getrawnoflines getrawparameters \ -getrawxparameters getreference getreferenceentry getroundednoflines getsubstring \ -gettwopassdata gettwopassdatalist getuvalue getvalue getvariable \ -getvariabledefault getxparameters globaldisablemode globalenablemode globalletempty \ -globalpopbox globalpopmacro globalpreventmode globalprocesscommalist globalpushbox \ -globalpushmacro globalswapcounts globalswapdimens globalswapmacros globalundefine \ -glyphfontfile gobbledoubleempty gobbleeightarguments gobblefivearguments gobblefiveoptionals \ -gobblefourarguments gobblefouroptionals gobbleninearguments gobbleoneargument gobbleoneoptional \ -gobblesevenarguments gobblesingleempty gobblesixarguments gobblespacetokens gobbletenarguments \ -gobblethreearguments gobblethreeoptionals gobbletwoarguments gobbletwooptionals gobbleuntil \ -gobbleuntilrelax grabbufferdata grabbufferdatadirect grabuntil graficul \ -grayvalue greedysplitstring greeknumerals grid grosimelinie \ -groupedcommand gsetboxllx gsetboxlly gujaratinumerals gurmurkhinumerals \ -hairspace halfwaybox handletokens handwritten hash \ -hboxofvbox hboxreference hdofstring headhbox headnumbercontent \ -headnumberdistance headnumberwidth headreferenceattributes headsetupspacing headtextcontent \ -headtextdistance headtextwidth headvbox headwidth heightanddepthofstring \ -heightofstring heightspanningtext helptext hglue hiddenbar \ -hiddencitation hiddencite highlight highordinalstr hilo \ -himilo hl horizontalgrowingbar horizontalpositionbar hphantom \ -hpos hsizefraction hsmash hsmashbox hsmashed \ -hspace htdpofstring htofstring hyphen hyphenatedcoloredword \ -hyphenatedfile hyphenatedfilename hyphenatedhbox hyphenatedpar hyphenatedurl \ -hyphenatedword ibox ifassignment iff ifinobject \ -ifinoutputstream ifparameters iftrialtypesetting ignoreimplicitspaces ignorevalue \ -immediatesavetwopassdata impartefloat impliedby implies in \ -inalt includemenu includeversioninfo increment incrementcounter \ -incrementedcounter incrementpagenumber incrementsubpagenumber incrementvalue indentation \ -infofont infofontbold inframed inheritparameter inhibitblank \ -initializeboxstack injos inlinebuffer inlinedbox inlinemath \ -inlinemathematics inlinemessage inlineordisplaymath inlinerange inlinie \ -inmaframed innerflushshapebox input inputfilebarename inputfilename \ -inputfilerealsuffix inputfilesuffix inputgivenfile insertpages instalarelimba \ -installactionhandler installactivecharacter installanddefineactivecharacter installattributestack installautocommandhandler \ -installautosetuphandler installbasicautosetuphandler installbasicparameterhandler installbottomframerenderer installcommandhandler \ -installcorenamespace installdefinehandler installdefinitionset installdefinitionsetmember installdirectcommandhandler \ -installdirectparameterhandler installdirectparametersethandler installdirectsetuphandler installdirectstyleandcolorhandler installframedautocommandhandler \ -installframedcommandhandler installleftframerenderer installnamespace installoutputroutine installpagearrangement \ -installparameterhandler installparameterhashhandler installparametersethandler installparentinjector installrightframerenderer \ -installrootparameterhandler installsetuphandler installsetuponlycommandhandler installshipoutmethod installsimplecommandhandler \ -installsimpleframedcommandhandler installstyleandcolorhandler installswitchcommandhandler installswitchsetuphandler installtexdirective \ -installtextracker installtopframerenderer installunitsseparator installunitsspace installversioninfo \ -integerrounding intermezzo intertext intins invokepageheandler \ -istltdir istrtdir italic italicbold italiccorrection \ -itemtag jobfilename jobfilesuffix jos jossus \ -kap keeplinestogether keepunwantedspaces kerncharacters koreancirclenumerals \ -koreannumerals koreannumeralsc koreannumeralsp koreanparentnumerals la \ -languageCharacters languagecharacters languagecharwidth lapagina lastcounter \ -lastcountervalue lastdigit lastlinewidth lastnaturalboxdp lastnaturalboxht \ -lastnaturalboxwd lastpredefinedsymbol lastrealpage lastrealpagenumber lastsubcountervalue \ -lastsubpage lastsubpagenumber lasttwodigits lastuserpage lastuserpagenumber \ -lateluacode layeredtext layerheight layerwidth lazysavetaggedtwopassdata \ -lazysavetwopassdata lbox left leftbottombox leftbox \ -lefthbox leftorrighthbox leftorrightvbox leftorrightvtop leftskipadaption \ -leftsubguillemot lefttopbox lefttorighthbox lefttorightvbox lefttorightvtop \ -letbeundefined letcatcodecommand letcscsname letcsnamecs letcsnamecsname \ -letdummyparameter letempty letgvalue letgvalueempty letgvalurelax \ -letterampersand letterat letterbackslash letterbar letterbgroup \ -letterclosebrace lettercolon letterdollar letterdoublequote letteregroup \ -letterescape letterexclamationmark letterhash letterhat letterleftbrace \ -letterless lettermore letteropenbrace letterpercent letterquestionmark \ -letterrightbrace lettersinglequote letterslash letterspacing lettertilde \ -letterunderscore letvalue letvalueempty letvaluerelax lfence \ -lhbox limba limbaprincipala limitatelines limitatetext \ -limtatefirstline linespanningtext linieneagra liniesubtire linieumplere \ -liniinegre liniisubtiri listcitation listcite listnamespaces \ -litera litere llap loadanyfile loadanyfileonce \ -loadbtxdefinitionfile loadbtxreplacementfile loadcldfile loadcldfileonce loadfontgoodies \ -loadluafile loadluafileonce loadspellchecklist loadtexfile loadtexfileonce \ -loadtypescriptfile localframed localframedwithsettings localhsize localpopbox \ -localpopmacro localpushbox localpushmacro localundefine locatedfilepath \ -locatefilepath locfilename lomihi lowerbox lowercased \ -lowercasestring lowerleftdoubleninequote lowerleftsingleninequote lowerrightdoubleninequote lowerrightsingleninequote \ -lrtbbox ltop luaTeX luacode luaconditional \ -luaenvironment luaexpanded luafunction luajitTeX luamajorversion \ -luaminorversion luaparameterset luasetup luaversion luna \ -lungimelista m mLeftarrow mLeftrightarrow mRightarrow \ -maframed makecharacteractive makerawcommalist makestrutofbox mapfontsize \ -marcaje margindata markcontent markinjector mat \ -matematica math mathbf mathbi mathblackboard \ -mathbs mathcommand mathdefault mathfraktur mathfunction \ -mathit mathitalic mathop mathrm mathscript \ -mathsl mathss mathtext mathtextbf mathtextbi \ -mathtextbs mathtextit mathtextsl mathtexttf mathtf \ -mathtriplet mathtt mathupright mathword mathwordbf \ -mathwordbi mathwordbs mathwordit mathwordsl mathwordtf \ -mbox mcframed md measure measured \ -mediu medskip medspace meniuinteractiune mequal \ -message metaTeX mfence mfunction mfunctionlabeltext \ -mhbox mhookleftarrow mhookrightarrow middle middlebox \ -midhbox minicitat minimalhbox mixedcaps mkvibuffer \ -mleftarrow mleftharpoondown mleftharpoonup mleftrightarrow mleftrightharpoons \ -mmapsto moduleparameter molecule mono monobold \ -mononormal monthlong monthshort mp mprandomnumber \ -mrel mrightarrow mrightharpoondown mrightharpoonup mrightleftharpoons \ -mrightoverleftarrow mtext mtriplerel mtwoheadleftarrow mtwoheadrightarrow \ -namedheadnumber namedstructureheadlocation namedstructureuservariable namedstructurevariable namedtaggedlabeltexts \ -naturalhbox naturalhpack naturalvbox naturalvcenter naturalvpack \ -naturalvtop naturalwd necunoscut negatecolorbox negated \ -negthinspace newattribute newcatcodetable newcounter newevery \ -newfrenchspacing newmode newsignal newsystemmode nextbox \ -nextboxdp nextboxht nextboxhtdp nextboxwd nextcounter \ -nextcountervalue nextdepth nextparagraphs nextrealpage nextrealpagenumber \ -nextsubcountervalue nextsubpage nextsubpagenumber nextuserpage nextuserpagenumber \ -nobar nocitation nocite nodetostring noffigurepages \ -noflines noflocalfloats noindentation noitem nokap \ -nonfrenchspacing nonmathematics normal normalboldface normalframedwithsettings \ -normalizebodyfontsize normalizedfontsize normalizefontdepth normalizefontheight normalizefontline \ -normalizefontwidth normalizetextdepth normalizetextheight normalizetextline normalizetextwidth \ -normaltypeface nota notesymbol ntimes numarformula \ -numarpagina numartitlu numartitlucurent numberofpoints numere \ -numereromane obeydepth objectdepth objectheight objectmargin \ -objectwidth obox offset offsetbox olinie \ -onedigitrounding ordinaldaynumber ordinalstr ornamenttext outputfilename \ -outputstreambox outputstreamcopy outputstreamunvbox outputstreamunvcopy over \ -overbar overbars overbartext overbarunderbar overbrace \ -overbracetext overbraceunderbrace overbracket overbrackettext overbracketunderbracket \ -overlaybutton overlaycolor overlaydepth overlayfigure overlayheight \ -overlaylinecolor overlaylinewidth overlayoffset overlayrollbutton overlaywidth \ -overleftarrow overleftharpoondown overleftharpoonup overleftrightarrow overloaderror \ -overparent overparenttext overparentunderparent overrightarrow overrightharpoondown \ -overrightharpoonup overset overstrike overstrikes overtwoheadleftarrow \ -overtwoheadrightarrow pagearea pagebreak pagefigure pagegridspanwidth \ -pageinjection pagestaterealpage pagina paletsize pastreazablocuri \ -pdfTeX pdfactualtext pdfbackendactualtext pdfbackendcurrentresources pdfbackendsetcatalog \ -pdfbackendsetcolorspace pdfbackendsetextgstate pdfbackendsetinfo pdfbackendsetname pdfbackendsetpageattribute \ -pdfbackendsetpageresource pdfbackendsetpagesattribute pdfbackendsetpattern pdfbackendsetshade pdfcolor \ -pdfeTeX pelung percent percentdimen permitcaretescape \ -permitcircumflexescape permitspacesbetweengroups persiandecimals persiannumerals phantom \ -phantombox pickupgroupedcommand placeattachments placebtxrendering placecitation \ -placecomments placecurrentformulanumber placedbox placefloat placefloatwithsetups \ -placeframed placeheadnumber placeheadtext placehelp placeinitial \ -placelayer placelayeredtext placelistofpublications placelistofsorts placelistofsynonyms \ -placelocalnotes placement placenamedfloat placenamedformula placenotes \ -placepairedbox placeparallel placerawlist placerenderingwindow plaseazapegrid \ -plaseazasemnecarte popattribute popmacro popmode popsystemmode \ -positionoverlay positionregionoverlay postponenotes potrivestecamp pozitie \ -predefinedfont predefinefont predefinesymbol prefixedpagenumber prependetoks \ -prependgvalue prependtocommalist prependtoks prependtoksonce prependvalue \ -presetdocument presetfieldsymbols pretocommalist prevcounter prevcountervalue \ -preventmode prevrealpage prevrealpagenumber prevsubcountervalue prevsubpage \ -prevsubpagenumber prevuserpage prevuserpagenumber procent proceseazabloc \ -processMPbuffer processMPfigurefile processaction processallactionsinset processassignlist \ -processassignmentcommand processassignmentlist processbetween processbodyfontenvironmentlist processcolorcomponents \ -processcommacommand processcommalist processcommalistwithparameters processcontent processfile \ -processfilemany processfilenone processfileonce processfirstactioninset processisolatedchars \ -processisolatedwords processlinetablebuffer processlinetablefile processlist processmonth \ -processranges processseparatedlist processtexbuffer processtokens processuntil \ -processxtablebuffer processyear produs profiledbox profilegivenbox \ -program proiect pseudoMixedCapped pseudoSmallCapped pseudoSmallcapped \ -pseudosmallcapped puncte punedeasuprafiecareia punefatainfata puneformula \ -punelista punelistacombinata punenotesubsol punenotesubsollocale punenumarpagina \ -puneregistru punesubformula purenumber pushattribute pushbutton \ -pushmacro pushmode pushoutputstream pushsystemmode qquad \ -quad quads quitcommalist quitprevcommalist quittypescriptscanning \ -raisebox randomizetext randomnumber rawcounter rawcountervalue \ -rawdate rawdoifelseinset rawdoifinset rawdoifinsetelse rawgetparameters \ -rawprocessaction rawprocesscommacommand rawprocesscommalist rawstructurelistuservariable rawsubcountervalue \ -rbox readfile readfixfile readjobfile readlocfile \ -readsetfile readsysfile readtexfile readxmlfile realSmallCapped \ -realSmallcapped realpagenumber realsmallcapped recursedepth recurselevel \ -recursestring redoconvertfont ref referenceprefix referinta \ -referintapagina referintatext referring reflexie registerattachment \ -registerctxluafile registerexternalfigure registerfontclass registerhyphenationexception registerhyphenationpattern \ -registermenubuttons registersort registersynonym registerunit regular \ -relatemarking relateparameterhandlers relaxvalueifundefined remainingcharacters remarca \ -removebottomthings removedepth removefromcommalist removelastskip removelastspace \ -removemarkedcontent removepunctuation removesubstring removetoks removeunwantedspaces \ -replacefeature replaceincommalist replaceword rescan rescanwithsetup \ -resetMPdrawing resetMPenvironment resetMPinstance resetallattributes resetandaddfeature \ -resetbar resetbreakpoints resetbuffer resetcharacteralign resetcharacterkerning \ -resetcharacterspacing resetcharacterstripping resetcollector resetcounter resetdigitsmanipulation \ -resetdirection reseteazamarcaje resetfeature resetflag resetfontcolorsheme \ -resetfontfallback resetfontsolution resethyphenationfeatures resetinjector resetinteractionmenu \ -resetitaliccorrection resetlayer resetlocalfloats resetmarker resetmode \ -resetpagenumber resetparallel resetpath resetpenalties resetprofile \ -resetreference resetreplacement resetscript resetsetups resetshownsynonyms \ -resetsubpagenumber resetsymbolset resetsystemmode resettimer resettrackers \ -resettrialtypesetting resetusedsortings resetusedsynonyms resetuserpagenumber resetvalue \ -resetvisualizers reshapebox resolvedglyphdirect resolvedglyphstyled restartcounter \ -restorebox restorecatcodes restorecounter restorecurrentattributes restoreendofline \ -restoreglobalbodyfont reusableMPgraphic reuseMPgraphic reuserandomseed revivefeature \ -rfence rhbox right rightbottombox rightbox \ -righthbox rightorleftpageaction rightskipadaption rightsubguillemot righttolefthbox \ -righttoleftvbox righttoleftvtop righttopbox riglatext rigleumplere \ -rlap robustaddtocommalist robustdoifelseinset robustdoifinsetelse robustpretocommalist \ -rollbutton roman roteste rtop ruledhbox \ -ruledhpack ruledmbox ruledtopv ruledtpack ruledvbox \ -ruledvpack ruledvtop runMPbuffer runninghbox safechar \ -sans sansbold sansnormal sansserif savebox \ -savebtxdataset savebuffer savecounter savecurrentattributes savenormalmeaning \ -savetaggedtwopassdata savetwopassdata sbox scala scriebuffer \ -scrieinlista scrieintreliste sd secondoffivearguments secondoffourarguments \ -secondofsixarguments secondofthreearguments secondofthreeunexpanded secondoftwoarguments secondoftwounexpanded \ -sectiune select selecteazablocuri semncarte serializecommalist \ -serializedcommalist serif serifbold serifnormal setJSpreamble \ -setMPlayer setMPpositiongraphic setMPpositiongraphicrange setMPtext setMPvariable \ -setMPvariables setareitemization setarelimba setarepozitie setbar \ -setbigbodyfont setboxllx setboxlly setbreakpoints setcapstrut \ -setcatcodetable setcharacteralign setcharactercasing setcharactercleaning setcharacterkerning \ -setcharacterspacing setcharacterstripping setcharstrut setcollector setcolormodell \ -setcounter setcounterown setcurrentfontclass setdataset setdefaultpenalties \ -setdigitsmanipulation setdirection setdocumentargument setdocumentargumentdefault setdocumentfilename \ -setdummyparameter seteazaaliniat seteazaantet seteazaaranjareapag seteazaaspect \ -seteazabarainteractiune seteazablanc seteazabloc seteazablocsectiune seteazabuffer \ -seteazacamp seteazacampuri seteazaclipping seteazacoloane seteazacomentariu \ -seteazacomentariupagina seteazaculoare seteazaculori seteazadimensiunihartie seteazaecraninteractiune \ -seteazaelemente seteazafloat seteazafonttext seteazaformulare seteazafundal \ -seteazafundaluri seteazagrosimelinie seteazaimpartireafloat seteazainconjurat seteazaingust \ -seteazainteractiunea seteazajos seteazalegenda seteazaliniesilabe seteazaliniesubtire \ +afiseazasetsimboluri afiseazastruts afiseazatiparire aliniatcentru aliniatdreapta \ +aliniatstanga ascundeblocuri baraculoare barainteractiune blanc \ +butoaneinteractiune buton butonmeniu camp cloneazacamp \ +coloana comparagrupculoare comparapaleta completeazanumarpagina componenta \ +convertestenumar copiazacamp corecteazaspatiualb culoare culoaregri \ +cuvantdreapta data datacurenta defineste definesteaccent \ +definesteantet definestebloc definesteblocsectiune definestebuffer definestecamp \ +definestecaracter definestecomanda definesteconversie definesteculoare definestedescriere \ +definestedimensiunehartie definesteenumerare definesteeticheta definestefloat definestefont \ +definestefonttext definesteformatreferinte definestegrupculori definestehbox definesteinconjurare \ +definestelista definestelistacombinata definestemakeup definestemarcaje definestemediulfonttext \ +definestemeniuinteractiune definesteoverlay definestepaleta definesteparagraf definesteprofil \ +definesteprogram definestereferinte definesteregistru definestesablontabel definestesectiune \ +definestesimbol definestesimbolfigura definestesinonim definestesinonimfont definestesortare \ +definestestartstop definestestil definestestilfont definestestivacampuri definestesubcamp \ +definestetabulatori definestetext definestetexteinconjurate definestetextinconjurat definestetyping \ +despre determinacaracteristicilelistei determinacaracteristiciregistru determinanumartitlu din \ +dute dutebox dutepagina ecran element \ +faraliniiantetsisubsol faraliniisussijos faraspatiu figuraexterna firdepar \ +folosesteURL folosestebloc folosestedirector folosestedocumentextern folosestefiguraexterna \ +folosestemodul folosestemuzicaexterna folosestescriptJS folosestesimboluri folosesteurl \ +fundal grosimelinie impartefloat inalt injos \ +inlinie instalarelimba intins jos jossus \ +la lapagina limba limbaprincipala linieneagra \ +liniesubtire linieumplere liniinegre liniisubtiri litera \ +litere luna lungimelista marcaje matematica \ +mediu meniuinteractiune necunoscut nokap nota \ +numarformula numarpagina numartitlu numartitlucurent numere \ +numereromane olinie pagina pastreazablocuri pelung \ +plaseazapegrid plaseazasemnecarte potrivestecamp pozitie proceseazabloc \ +produs proiect puncte punedeasuprafiecareia punefatainfata \ +puneformula punelista punelistacombinata punenotesubsol punenotesubsollocale \ +punenumarpagina puneregistru punesubformula referinta referintapagina \ +referintatext reflexie remarca reseteazamarcaje riglatext \ +rigleumplere roteste scala scriebuffer scrieinlista \ +scrieintreliste selecteazablocuri semncarte setareitemization setarelimba \ +setarepozitie seteazaaliniat seteazaalinierea seteazaantet seteazaaranjareapag \ +seteazaaspect seteazabarainteractiune seteazablanc seteazabloc seteazablocsectiune \ +seteazabuffer seteazacamp seteazacampuri seteazaclipping seteazacoloane \ +seteazacomentariu seteazacomentariupagina seteazaculoare seteazaculori seteazadimensiunihartie \ +seteazaecraninteractiune seteazaelemente seteazaenumerare seteazafloat seteazafloats \ +seteazafonttext seteazaformulare seteazaformule seteazafundal seteazafundaluri \ +seteazagrosimelinie seteazaimpartireafloat seteazainconjurat seteazaingust seteazainteractiunea \ +seteazajos seteazalegenda seteazalegendele seteazaliniesilabe seteazaliniesubtire \ seteazalinii seteazaliniimargine seteazaliniinegre seteazaliniiumplere seteazalista \ seteazalistacombinata seteazamajuscule seteazamakeup seteazamarcaje seteazameniuinteractiune \ seteazaminicitat seteazanumarpagina seteazanumarsubpagina seteazanumartitlu seteazanumerotarelinii \ @@ -5992,289 +2110,15 @@ seteazarotare seteazasimbol seteazasinonime seteazasortare seteazaspatiu \ seteazaspatiualb seteazaspatiuinterliniar seteazasubsol seteazasus seteazatabele \ seteazatabulatori seteazatext seteazatexteantet seteazatextejos seteazatextesubsol \ seteazatextesus seteazatextetext seteazatitlu seteazatitluri seteazatoleranta \ -seteazatranzitiepagina seteazatype seteazatyping seteazaurl setelementexporttag \ -setemeasure setevalue setevariable setevariables setfirstline \ -setflag setfont setfontcolorsheme setfontfeature setfontsolution \ -setfontstrut setfractions setgmeasure setgvalue setgvariable \ -setgvariables sethboxregister sethyphenatedurlafter sethyphenatedurlbefore sethyphenatedurlnormal \ -sethyphenationfeatures setinitial setinjector setinteraction setinterfacecommand \ -setinterfaceconstant setinterfaceelements setinterfacemessage setinterfacevariable setinternalrendering \ -setitaliccorrection setlayer setlayerframed setlayertext setlinefiller \ -setlocalhsize setmainbodyfont setmainparbuilder setmarker setmarking \ -setmathstyle setmeasure setmessagetext setmode setnostrut \ -setnote setnotetext setobject setoldstyle setpagegrid \ -setpagereference setpagestate setpagestaterealpageno setpenalties setpercentdimen \ -setposition setpositionbox setpositiondata setpositiondataplus setpositiononly \ -setpositionplus setpositionstrut setprofile setrandomseed setreference \ -setreferencedobject setregisterentry setreplacement setrigidcolumnbalance setrigidcolumnhsize \ -setscript setsectionblock setsimplecolumnhsize setsmallbodyfont setsmallcaps \ -setstackbox setstructurepageregister setstrut setsuperiors setsystemmode \ -settabular settaggedmetadata settextcontent settightobject settightreferencedobject \ -settightunreferencedobject settrialtypesetting setuevalue setugvalue setunreferencedobject \ -setup setupMPgraphics setupMPinstance setupMPpage setupMPvariables \ -setupTABLE setupTEXpage setupattachment setupbackend setupbar \ -setupbleeding setupbookmark setupbtx setupbtxdataset setupbtxlist \ -setupbtxregister setupbtxrendering setupbutton setupcharacterkerning setupcharacterspacing \ -setupchemical setupchemicalframed setupcollector setupcolumnspan setupcombination \ -setupcounter setupdataset setupdelimitedtext setupdescription setupdirections \ -setupdocument setupeffect setupenumeration setupenv setupexport \ -setupexternalfigure setupexternalsoundtracks setupfieldbody setupfieldcategory setupfieldcontentframed \ -setupfieldlabelframed setupfieldtotalframed setupfiller setupfirstline setupfittingpage \ -setupfloatcaption setupfontexpansion setupfontprotrusion setupfonts setupfontsolution \ -setupformula setupformulaframed setupframedcontent setupframedtext setupglobalreferenceprefix \ -setupheadalternative setuphelp setuphigh setuphighlight setuphyphenation \ -setupindentedtext setupinitial setupinsertion setupitaliccorrection setupitemgroup \ -setuplabel setuplayer setuplayeredtext setuplayouttext setuplinefiller \ -setuplinefillers setuplinenote setuplinetable setuplistalternative setuplistextra \ -setuplocalfloats setuplocalinterlinespace setuplow setuplowhigh setuplowmidhigh \ -setupmarginblock setupmargindata setupmarginframed setupmarginrule setupmathalignment \ -setupmathcases setupmathematics setupmathfence setupmathfraction setupmathframed \ -setupmathmatrix setupmathornament setupmathradical setupmathstackers setupmathstyle \ -setupmixedcolumns setupmodule setupnotation setupnotations setupnote \ -setupnotes setupoffset setupoffsetbox setupoutputroutine setuppagechecker \ -setuppagegrid setuppagegridarea setuppagegridareatext setuppagegridlines setuppagegridspan \ -setuppagegridstart setuppageinjection setuppageinjectionalternative setuppageshift setuppagestate \ -setuppairedbox setuppaper setupparagraph setupparagraphintro setupparallel \ -setupperiods setupplacement setuppositionbar setupprocessor setupprofile \ -setupquotation setuprealpagenumber setupreferenceformat setupreferenceprefix setupreferencestructureprefix \ -setupregisters setuprenderingwindow setups setupscale setupscript \ -setupscripts setupselector setupshift setupsidebar setupspellchecking \ -setupstartstop setupstretched setupstruts setupstyle setupsubformula \ -setuptabulation setuptagging setuptextbackground setuptextflow setuptooltip \ -setupunit setupuserpagenumber setupversion setupviewerlayer setupvspacing \ -setupwithargument setupwithargumentswapped setupxml setupxtable setuvalue \ -setuxvalue setvalue setvariable setvariables setvboxregister \ -setvisualizerfont setvtopregister setwidthof setxmeasure setxvalue \ -setxvariable setxvariables sfrac shapedhbox showallmakeup \ -showattributes showboxes showbtxdatasetauthors showbtxdatasetcompleteness showbtxdatasetfields \ -showbtxfields showbtxhashedauthors showbtxtables showchardata showcharratio \ -showcolorbar showcolorcomponents showcolorset showcolorstruts showcounter \ -showdirectives showdirsinmargin showedebuginfo showexperiments showfont \ -showfontdata showfontkerns showfontparameters showfontstrip showfontstyle \ -showglyphs showgridsnapping showhelp showhyphenationtrace showhyphens \ -showinjector showjustification showkerning showlayoutcomponents showligature \ -showligatures showlogcategories showmargins showmessage showminimalbaseline \ -shownextbox showotfcomposition showparentchain showsetupsdefinition showtimer \ -showtokens showtrackers showvalue showvariable showwarning \ -simbol simplegroupedcommand singalcharacteralign singlebond sixthofsixarguments \ -slanted slantedbold slicepages slovenianNumerals sloveniannumerals \ -small smallbodyfont smallbold smallbolditalic smallboldslanted \ -smallcappedcharacters smallcappedromannumerals smaller smallitalicbold smallnormal \ -smallskip smallslanted smallslantedbold smalltype smash \ -smashbox smashboxed smashedhbox smashedvbox snaptogrid \ -someheadnumber somekindoftab somelocalfloat somenamedheadnumber someplace \ -sp spanishNumerals spanishnumerals spatiifixate spatiu \ -spatiufixat speech splitatasterisk splitatcolon splitatcolons \ -splitatcomma splitdfrac splitfilename splitfrac splitoffbase \ -splitofffull splitoffkind splitoffname splitoffpath splitoffroot \ -splitofftokens splitofftype splitstring spreadhbox sqrt \ -stackrel startJScode startJSpreamble startMPclip startMPcode \ -startMPdefinitions startMPdrawing startMPenvironment startMPextensions startMPinclusions \ -startMPinitializations startMPpage startMPpositiongraphic startMPpositionmethod startMPrun \ -startTABLE startTABLEbody startTABLEfoot startTABLEhead startTABLEnext \ -startTC startTD startTDs startTEXpage startTH \ -startTN startTR startTRs startTX startTY \ -startallmodes startarrangedpages startaside startattachment startbar \ -startbarasus startbinom startbitmapimage startblockquote startbtxrenderingdefinitions \ -startbuffer startbutton startcapitol startcatcodetable startcharacteralign \ -startcheckedfences startchemical startcitat startcollect startcollecting \ -startcolorintent startcoloronly startcolorset startcolumns startcolumnspan \ -startcombination startcomentariu startcomment startcomponenta startcontextcode \ -startcontextdefinitioncode startctxfunction startctxfunctiondefinition startculoare startcurrentcolor \ -startcurrentlistentrywrapper startdbinom startdelimited startdelimitedtext startdfrac \ -startdisplaymath startdmath startdocument startdute starteffect \ -startelement startembeddedxtable startendofline startenumerare startexceptions \ -startexpanded startexpandedcollect startextendedcatcodetable startexternalfigurecollection startfigura \ -startfigure startfitfieldframed startfittingpage startfloatcombination startfont \ -startfontclass startfontsolution startformula startformulas startfrac \ -startframed startframedcontent startframedtext startfundal startgraficul \ -startgridsnapping starthbox starthboxestohbox starthboxregister starthelptext \ -starthiddenbar starthiding starthighlight starthyphenation startimath \ -startimpachetat startindentation startindentedtext startinmframed startinteraction \ -startinterface startintermezzo startintertext startitemgroup startknockout \ -startlayout startlinecorrection startlinefiller startlinenumbering startlinetable \ -startlinetablebody startlinetablecell startlinetablehead startlinie startliniemargine \ -startliniepeste startliniipeste startlocalfootnotes startlocalheadsetup startlocallinecorrection \ -startlocalnotes startlocalsetups startlua startluacode startluaparameterset \ -startluasetups startmakeup startmarginblock startmarkedcontent startmathmode \ -startmathstyle startmatrices startmcframed startmdformula startmediu \ -startmeniuinteractiune startmframed startminicitat startmixedcolumns startmode \ -startmodeset startmodule startmoduletestsection startmpformula startnamedsection \ -startnamedsubformulas startnarrow startnarrower startnegative startnicelyfilledbox \ -startnobar startnointerference startnotallmodes startnotext startnotmode \ -startopposite startoutputstream startoverlay startoverprint startpagecomment \ -startpagefigure startpagegrid startpagegridspan startpagelayout startpar \ -startparagraph startparagraphs startparagraphscell startparbuilder startpath \ -startplacepairedbox startpositioning startpositionoverlay startpositive startpostponing \ -startprocessassignmentcommand startprocessassignmentlist startprocesscommacommand startprocesscommalist startprodus \ -startproiect startprotect startprotectedcolors startpublicatie startpunctuation \ -startpuneformula startrandomized startrandomseed startrawsetups startreadingfile \ -startreferenceprefix startregime startregister startreusableMPgraphic startriglatext \ -startscript startsdformula startsectionblock startsectionblockenvironment startsectionlevel \ -startsectiune startsetups startsfrac startshapebox startshift \ -startsidebar startsimplecolumns startspecialitem startspeech startspformula \ -startspread startstartstop startstaticMPfigure startstaticMPgraphic startstrictinspectnextcharacter \ -startstructurepageregister startstrut startstyle startsubformulas startsubiect \ -startsubjectlevel startsublinie startsublinii startsubsectiune startsubsentence \ -startsubstack startsubsubiect startsubsubsectiune startsubsubsubiect startsubsubsubsectiune \ -startsubsubsubsubiect startsubsubsubsubsectiune startsubsubsubsubsubiect startsupralinie startsymbolset \ -starttabelul starttable starttablehead starttables starttabletail \ -starttabulate starttabulatehead starttabulatetail starttagged starttbinom \ -starttexcode starttexdefinition starttext starttextajutator starttextbackground \ -starttextbackgroundmanual starttextcolor starttextcolorintent starttextflow starttextinconjurat \ -starttitlu starttokens starttransparent starttypescript starttypescriptcollection \ -startunderdash startunderdashes startunderdot startunderdots startunderrandom \ -startunderrandoms startunderstrike startunderstrikes startunframed startuniqueMPgraphic \ -startuniqueMPpagegraphic startunpacked startusableMPgraphic startuseMPgraphic startusemathstyleparameter \ -startusingbtxspecification startvbox startvboxregister startvboxtohbox startvboxtohboxseparator \ -startviewerlayer startvtop startvtopregister startxcell startxcellgroup \ -startxfrac startxgroup startxmldisplayverbatim startxmlinlineverbatim startxmlraw \ -startxmlsetups startxrow startxrowgroup startxtable startxtablebody \ -startxtablefoot startxtablehead startxtablenext startxxfrac stivacampuri \ -stopJScode stopJSpreamble stopMPclip stopMPcode stopMPdefinitions \ -stopMPdrawing stopMPenvironment stopMPextensions stopMPinclusions stopMPinitializations \ -stopMPpage stopMPpositiongraphic stopMPpositionmethod stopMPrun stopTABLE \ -stopTABLEbody stopTABLEfoot stopTABLEhead stopTABLEnext stopTC \ -stopTD stopTDs stopTEXpage stopTH stopTN \ -stopTR stopTRs stopTX stopTY stopallmodes \ -stoparrangedpages stopaside stopattachment stopbar stopbarasus \ -stopbinom stopbitmapimage stopblockquote stopbtxrenderingdefinitions stopbuffer \ -stopbutton stopcapitol stopcatcodetable stopcharacteralign stopcheckedfences \ -stopchemical stopcitat stopcollect stopcollecting stopcolorintent \ -stopcoloronly stopcolorset stopcolumns stopcolumnspan stopcombination \ -stopcomentariu stopcomment stopcomponenta stopcontextcode stopcontextdefinitioncode \ -stopctxfunction stopctxfunctiondefinition stopculoare stopcurrentcolor stopcurrentlistentrywrapper \ -stopdbinom stopdelimited stopdelimitedtext stopdfrac stopdisplaymath \ -stopdmath stopdocument stopdute stopeffect stopelement \ -stopembeddedxtable stopendofline stopenumerare stopexceptions stopexpanded \ -stopexpandedcollect stopextendedcatcodetable stopexternalfigurecollection stopfigura stopfigure \ -stopfitfieldframed stopfittingpage stopfloatcombination stopfont stopfontclass \ -stopfontsolution stopformula stopformulas stopfrac stopframed \ -stopframedcontent stopframedtext stopfundal stopgraficul stopgridsnapping \ -stophbox stophboxestohbox stophboxregister stophelptext stophiddenbar \ -stophiding stophighlight stophyphenation stopimath stopimpachetat \ -stopindentation stopindentedtext stopinmframed stopinteraction stopinterface \ -stopintermezzo stopintertext stopitemgroup stopknockout stoplayout \ -stoplinecorrection stoplinefiller stoplinenumbering stoplinetable stoplinetablebody \ -stoplinetablecell stoplinetablehead stoplinie stopliniemargine stopliniepeste \ -stopliniipeste stoplocalfootnotes stoplocalheadsetup stoplocallinecorrection stoplocalnotes \ -stoplocalsetups stoplua stopluacode stopluaparameterset stopluasetups \ -stopmakeup stopmarginblock stopmarkedcontent stopmathmode stopmathstyle \ -stopmatrices stopmcframed stopmdformula stopmediu stopmeniuinteractiune \ -stopmframed stopminicitat stopmixedcolumns stopmode stopmodeset \ -stopmodule stopmoduletestsection stopmpformula stopnamedsection stopnamedsubformulas \ -stopnarrow stopnarrower stopnegative stopnicelyfilledbox stopnobar \ -stopnointerference stopnotallmodes stopnotext stopnotmode stopopposite \ -stopoutputstream stopoverlay stopoverprint stoppagecomment stoppagefigure \ -stoppagegrid stoppagegridspan stoppagelayout stoppar stopparagraph \ -stopparagraphs stopparagraphscell stopparbuilder stoppath stopplacepairedbox \ -stoppositioning stoppositionoverlay stoppositive stoppostponing stopprocessassignmentcommand \ -stopprocessassignmentlist stopprocesscommacommand stopprocesscommalist stopprodus stopproiect \ -stopprotect stopprotectedcolors stoppublicatie stoppunctuation stoppuneformula \ -stoprandomized stoprandomseed stoprawsetups stopreadingfile stopreferenceprefix \ -stopregime stopregister stopreusableMPgraphic stopriglatext stopscript \ -stopsdformula stopsectionblock stopsectionblockenvironment stopsectionlevel stopsectiune \ -stopsetups stopsfrac stopshapebox stopshift stopsidebar \ -stopsimplecolumns stopspecialitem stopspeech stopspformula stopspread \ -stopstartstop stopstaticMPfigure stopstaticMPgraphic stopstrictinspectnextcharacter stopstructurepageregister \ -stopstrut stopstyle stopsubformulas stopsubiect stopsubjectlevel \ -stopsublinie stopsublinii stopsubsectiune stopsubsentence stopsubstack \ -stopsubsubiect stopsubsubsectiune stopsubsubsubiect stopsubsubsubsectiune stopsubsubsubsubiect \ -stopsubsubsubsubsectiune stopsubsubsubsubsubiect stopsupralinie stopsymbolset stoptabelul \ -stoptable stoptablehead stoptables stoptabletail stoptabulate \ -stoptabulatehead stoptabulatetail stoptagged stoptbinom stoptexcode \ -stoptexdefinition stoptext stoptextajutator stoptextbackground stoptextbackgroundmanual \ -stoptextcolor stoptextcolorintent stoptextflow stoptextinconjurat stoptitlu \ -stoptokens stoptransparent stoptypescript stoptypescriptcollection stopunderdash \ -stopunderdashes stopunderdot stopunderdots stopunderrandom stopunderrandoms \ -stopunderstrike stopunderstrikes stopunframed stopuniqueMPgraphic stopuniqueMPpagegraphic \ -stopunpacked stopusableMPgraphic stopuseMPgraphic stopusemathstyleparameter stopusingbtxspecification \ -stopvbox stopvboxregister stopvboxtohbox stopvboxtohboxseparator stopviewerlayer \ -stopvtop stopvtopregister stopxcell stopxcellgroup stopxfrac \ -stopxgroup stopxmldisplayverbatim stopxmlinlineverbatim stopxmlraw stopxmlsetups \ -stopxrow stopxrowgroup stopxtable stopxtablebody stopxtablefoot \ -stopxtablehead stopxtablenext stopxxfrac strictdoifelsenextoptional strictdoifnextoptionalelse \ -stripcharacter strippedcsname stripspaces structurelistuservariable structurenumber \ -structuretitle structureuservariable structurevariable strut strutdp \ -strutht struthtdp struttedbox strutwd style \ -styleinstance subiect subpagenumber subsectiune subsentence \ -substituteincommalist subsubiect subsubsectiune subsubsubiect subsubsubsectiune \ -subsubsubsubiect subsubsubsubsectiune subsubsubsubsubiect subtractfeature swapcounts \ -swapdimens swapface swapmacros swaptypeface switchstyleonly \ -switchtocolor switchtointerlinespace symbolreference synchronizeblank synchronizeindenting \ -synchronizemarking synchronizeoutputstreams synchronizestrut synchronizewhitespace systemlog \ -systemlogfirst systemloglast systemsetups tLeftarrow tLeftrightarrow \ -tRightarrow tabelul tabulateautoline tabulateautorule tabulateline \ -tabulaterule taggedctxcommand taggedlabeltexts tbinom tbox \ -tequal testandsplitstring testcolumn testfeature testfeatureonce \ -testpage testpageonly testpagesync testtokens tex \ -texdefinition texsetup textajutator textcitation textcite \ -textcontrolspace textflowcollector textinconjurat textmath textminus \ -textormathchar textplus textumplere textvisiblespace tfrac \ -thainumerals thefirstcharacter thenormalizedbodyfontsize theremainingcharacters thickspace \ -thinspace thirdoffivearguments thirdoffourarguments thirdofsixarguments thirdofthreearguments \ -thirdofthreeunexpanded thookleftarrow thookrightarrow threedigitrounding tibetannumerals \ -tightlayer tinyfont titlu tlap tleftarrow \ -tleftharpoondown tleftharpoonup tleftrightarrow tleftrightharpoons tmapsto \ -tochar tolinenote topbox topleftbox toplinebox \ -toprightbox topskippedbox tracecatcodetables tracedfontname traceoutputroutines \ -tracepositions traduce transparencycomponents transparent trecilafonttext \ -trel trightarrow trightharpoondown trightharpoonup trightleftharpoons \ -trightoverleftarrow triplebond truefilename truefontname ttriplerel \ -ttwoheadleftarrow ttwoheadrightarrow twodigitrounding tx txx \ -typ type typedefinedbuffer typeface typefile \ -typescriptone typescriptprefix typescriptthree typescripttwo typesetbuffer \ -typesetfile uconvertnumber uedcatcodecommand undefinevalue undepthed \ -underbar underbars underbartext underbrace underbracetext \ -underbracket underbrackettext underdash underdashes underdot \ -underdots underleftarrow underleftharpoondown underleftharpoonup underleftrightarrow \ -underparent underparenttext underrandom underrandoms underrightarrow \ -underrightharpoondown underrightharpoonup underset understrike understrikes \ -undertwoheadleftarrow undertwoheadrightarrow undeva undoassign unframed \ -unhhbox unihex uniqueMPgraphic uniqueMPpagegraphic unprotected \ -unregisterhyphenationpattern unspaceafter unspaceargument unspaced unspacestring \ -untexargument untexcommand uppercased uppercasestring upperleftdoubleninequote \ -upperleftdoublesixquote upperleftsingleninequote upperleftsinglesixquote upperrightdoubleninequote upperrightdoublesixquote \ -upperrightsingleninequote upperrightsinglesixquote url useMPenvironmentbuffer useMPgraphic \ -useMPlibrary useMPrun useMPvariables useblankparameter usebodyfont \ -usebodyfontparameter usebtxdataset usebtxdefinitions usecolors usecomponent \ -usedummycolorparameter usedummystyleandcolor usedummystyleparameter useenvironment useexternalrendering \ -usefigurebase usefile usegridparameter useindentingparameter useindentnextparameter \ -useinterlinespaceparameter uselanguageparameter useluamodule usemathstyleparameter useproduct \ -useprofileparameter useproject usereferenceparameter userpagenumber usesetupsparameter \ -usestaticMPfigure usesubpath usetexmodule usetypescript usetypescriptfile \ -usezipfile utfchar utflower utfupper utilityregisterlength \ -valoareculoare vboxreference verbatim verbatimstring verbosenumber \ -versiune verticalgrowingbar verticalpositionbar vglue viewerlayer \ -vl vphantom vpos vsmash vsmashbox \ -vsmashed vspace vspacing wdofstring widthofstring \ -widthspanningtext withoutpt word words wordtonumber \ -writedatatolist writestatus xLeftarrow xLeftrightarrow xRightarrow \ -xdefconvertedargument xequal xfrac xhookleftarrow xhookrightarrow \ -xleftarrow xleftharpoondown xleftharpoonup xleftrightarrow xleftrightharpoons \ -xmapsto xmladdindex xmlafterdocumentsetup xmlaftersetup xmlall \ -xmlappenddocumentsetup xmlappendsetup xmlapplyselectors xmlatt xmlattdef \ -xmlattribute xmlattributedef xmlbadinclusions xmlbeforedocumentsetup xmlbeforesetup \ -xmlchainatt xmlchainattdef xmlchecknamespace xmlcommand xmlconcat \ -xmlconcatrange xmlcontext xmlcount xmldefaulttotext xmldirectives \ -xmldirectivesafter xmldirectivesbefore xmldisplayverbatim xmldoif xmldoifelse \ -xmldoifelseempty xmldoifelseselfempty xmldoifelsetext xmldoifelsevalue xmldoifnot \ -xmldoifnotselfempty xmldoifnottext xmldoifselfempty xmldoiftext xmlelement \ -xmlfilter xmlfirst xmlflush xmlflushcontext xmlflushdocumentsetups \ -xmlflushlinewise xmlflushpure xmlflushspacewise xmlflushtext xmlinclude \ -xmlinclusion xmlinclusions xmlinfo xmlinjector xmlinlineverbatim \ -xmlinstalldirective xmllast xmllastatt xmllastmatch xmlloadbuffer \ -xmlloaddata xmlloaddirectives xmlloadfile xmlloadonly xmlmain \ -xmlmapvalue xmlname xmlnamespace xmlnonspace xmlpath \ -xmlpos xmlposition xmlprependdocumentsetup xmlprependsetup xmlprettyprint \ -xmlprocessbuffer xmlprocessdata xmlprocessfile xmlpure xmlraw \ -xmlrefatt xmlregistereddocumentsetups xmlregisteredsetups xmlregisterns xmlremapname \ -xmlremapnamespace xmlremovedocumentsetup xmlremovesetup xmlresetdocumentsetups xmlresetinjectors \ -xmlresetsetups xmlsave xmlsetentity xmlsetfunction xmlsetinjectors \ -xmlsetsetup xmlsetup xmlshow xmlsnippet xmlstrip \ -xmlstripnolines xmlstripped xmlstrippednolines xmltag xmltexentity \ -xmltext xmltobuffer xmltobufferverbose xmltofile xmlvalue \ -xmlverbatim xrel xrightarrow xrightharpoondown xrightharpoonup \ -xrightleftharpoons xrightoverleftarrow xsplitstring xtriplerel xtwoheadleftarrow \ -xtwoheadrightarrow xxfrac xypos zidinsaptamana +seteazatranzitiepagina seteazatype seteazatyping seteazaurl simbol \ +spatiifixate spatiu spatiufixat startaliniatcentru startaliniatdreapta \ +startaliniatstanga startcomponenta startculoare startdute startfundal \ +startimpachetat startlinie startliniemargine startmediu startmeniuinteractiune \ +startprodus startproiect startpublicatie startpuneformula startriglatext \ +starttitlu stivacampuri stopaliniatcentru stopaliniatdreapta stopaliniatstanga \ +stopcomponenta stopculoare stopdute stopfundal stopimpachetat \ +stoplinie stopliniemargine stopmediu stopmeniuinteractiune stopprodus \ +stopproiect stoppublicatie stoppuneformula stopriglatext stoptitlu \ +textumplere traduce trecilafonttext undeva valoareculoare \ +versiune zidinsaptamana diff --git a/context/data/scite/context/scite-context-data-metafun.properties b/context/data/scite/context/scite-context-data-metafun.properties index e2ec4c467..e83313132 100644 --- a/context/data/scite/context/scite-context-data-metafun.properties +++ b/context/data/scite/context/scite-context-data-metafun.properties @@ -1,23 +1,24 @@ keywordclass.metafun.commands=\ -loadmodule dispose nothing transparency \ -tolist topath tocycle sqr log \ -ln exp inv pow pi \ -radian tand cotd sin cos \ -tan cot atan asin acos \ -invsin invcos invtan acosh asinh \ -sinh cosh zmod paired tripled \ -unitcircle fulldiamond unitdiamond fullsquare unittriangle \ -fulltriangle llcircle lrcircle urcircle ulcircle \ -tcircle bcircle lcircle rcircle lltriangle \ -lrtriangle urtriangle ultriangle uptriangle downtriangle \ -lefttriangle righttriangle triangle smoothed cornered \ -superellipsed randomized randomizedcontrols squeezed enlonged \ -shortened punked curved unspiked simplified \ -blownup stretched enlarged leftenlarged topenlarged \ -rightenlarged bottomenlarged crossed laddered randomshifted \ -interpolated paralleled cutends peepholed llenlarged \ -lrenlarged urenlarged ulenlarged llmoved lrmoved \ -urmoved ulmoved rightarrow leftarrow centerarrow \ +loadfile loadimage loadmodule dispose \ +nothing transparency tolist topath tocycle \ +sqr log ln exp inv \ +pow pi radian tand cotd \ +sin cos tan cot atan \ +asin acos invsin invcos invtan \ +acosh asinh sinh cosh tanh \ +zmod paired tripled unitcircle fulldiamond \ +unitdiamond fullsquare unittriangle fulltriangle llcircle \ +lrcircle urcircle ulcircle tcircle bcircle \ +lcircle rcircle lltriangle lrtriangle urtriangle \ +ultriangle uptriangle downtriangle lefttriangle righttriangle \ +triangle smoothed cornered superellipsed randomized \ +randomizedcontrols squeezed enlonged shortened punked \ +curved unspiked simplified blownup stretched \ +enlarged leftenlarged topenlarged rightenlarged bottomenlarged \ +crossed laddered randomshifted interpolated perpendicular \ +paralleled cutends peepholed llenlarged lrenlarged \ +urenlarged ulenlarged llmoved lrmoved urmoved \ +ulmoved rightarrow leftarrow centerarrow drawdoublearrows \ boundingbox innerboundingbox outerboundingbox pushboundingbox popboundingbox \ boundingradius boundingcircle boundingpoint crossingunder insideof \ outsideof bottomboundary leftboundary topboundary rightboundary \ @@ -33,33 +34,33 @@ graphictext loadfigure externalfigure figure register \ outlinetext checkedbounds checkbounds strut rule \ withmask bitmapimage colordecimals ddecimal dddecimal \ ddddecimal colordecimalslist textext thetextext rawtextext \ -textextoffset texbox thetexbox rawtexbox verbatim \ -thelabel label autoalign transparent withtransparency \ -property properties withproperties asgroup infont \ -space crlf dquote percent SPACE \ -CRLF DQUOTE PERCENT grayscale greyscale \ -withgray withgrey colorpart colorlike readfile \ -clearxy unitvector center epsed anchored \ -originpath infinite break xstretched ystretched \ -snapped pathconnectors function constructedfunction constructedpath \ -constructedpairs straightfunction straightpath straightpairs curvedfunction \ -curvedpath curvedpairs evenly oddly condition \ -pushcurrentpicture popcurrentpicture arrowpath resetarrows tensecircle \ -roundedsquare colortype whitecolor blackcolor basiccolors \ -complementary complemented resolvedcolor normalfill normaldraw \ -visualizepaths detailpaths naturalizepaths drawboundary drawwholepath \ -drawpathonly visualizeddraw visualizedfill detaileddraw draworigin \ -drawboundingbox drawpath drawpoint drawpoints drawcontrolpoints \ -drawcontrollines drawpointlabels drawlineoptions drawpointoptions drawcontroloptions \ -drawlabeloptions draworiginoptions drawboundoptions drawpathoptions resetdrawoptions \ -undashed pencilled decorated redecorated undecorated \ -passvariable passarrayvariable tostring topair format \ -formatted quotation quote startpassingvariable stoppassingvariable \ -eofill eoclip nofill fillup eofillup \ -area addbackground shadedup shadeddown shadedleft \ -shadedright sortlist copylist shapedlist listtocurves \ -listtolines listsize listlast uniquelist circularpath \ -squarepath linearpath +textextoffset texbox thetexbox rawtexbox istextext \ +verbatim thelabel label autoalign transparent \ +withtransparency property properties withproperties asgroup \ +infont space crlf dquote percent \ +SPACE CRLF DQUOTE PERCENT grayscale \ +greyscale withgray withgrey colorpart colorlike \ +readfile clearxy unitvector center epsed \ +anchored originpath infinite break xstretched \ +ystretched snapped pathconnectors function constructedfunction \ +constructedpath constructedpairs straightfunction straightpath straightpairs \ +curvedfunction curvedpath curvedpairs evenly oddly \ +condition pushcurrentpicture popcurrentpicture arrowpath resetarrows \ +tensecircle roundedsquare colortype whitecolor blackcolor \ +basiccolors complementary complemented resolvedcolor normalfill \ +normaldraw visualizepaths detailpaths naturalizepaths drawboundary \ +drawwholepath drawpathonly visualizeddraw visualizedfill detaileddraw \ +draworigin drawboundingbox drawpath drawpoint drawpoints \ +drawcontrolpoints drawcontrollines drawpointlabels drawlineoptions drawpointoptions \ +drawcontroloptions drawlabeloptions draworiginoptions drawboundoptions drawpathoptions \ +resetdrawoptions undashed pencilled decorated redecorated \ +undecorated passvariable passarrayvariable tostring topair \ +format formatted quotation quote startpassingvariable \ +stoppassingvariable eofill eoclip nofill fillup \ +eofillup area addbackground shadedup shadeddown \ +shadedleft shadedright sortlist copylist shapedlist \ +listtocurves listtolines listsize listlast uniquelist \ +circularpath squarepath linearpath keywordclass.metafun.internals=\ nocolormodel greycolormodel graycolormodel rgbcolormodel \ @@ -67,6 +68,6 @@ cmykcolormodel shadefactor textextoffset normaltransparent multiplytransparent \ screentransparent overlaytransparent softlighttransparent hardlighttransparent colordodgetransparent \ colorburntransparent darkentransparent lightentransparent differencetransparent exclusiontransparent \ huetransparent saturationtransparent colortransparent luminositytransparent ahvariant \ -ahdimple ahfactor metapostversion maxdimensions drawoptionsfactor \ -dq sq crossingscale crossingoption +ahdimple ahfactor ahscale metapostversion maxdimensions \ +drawoptionsfactor dq sq crossingscale crossingoption diff --git a/context/data/scite/context/scite-context-data-tex.properties b/context/data/scite/context/scite-context-data-tex.properties index af7216f46..ece23c77b 100644 --- a/context/data/scite/context/scite-context-data-tex.properties +++ b/context/data/scite/context/scite-context-data-tex.properties @@ -1,7 +1,5 @@ keywordclass.tex.aleph=\ -AlephVersion Alephminorversion Alephrevision Alephversion \ -Omegaminorversion Omegarevision Omegaversion boxdir pagebottomoffset \ -pagerightoffset +Alephminorversion Alephrevision Alephversion keywordclass.tex.etex=\ botmarks clubpenalties currentgrouplevel currentgrouptype \ @@ -20,17 +18,17 @@ unexpanded unless widowpenalties keywordclass.tex.luatex=\ Uchar Udelcode Udelcodenum Udelimiter \ -Udelimiterover Udelimiterunder Uhextensible Uleft Umathaccent \ -Umathaxis Umathbinbinspacing Umathbinclosespacing Umathbininnerspacing Umathbinopenspacing \ -Umathbinopspacing Umathbinordspacing Umathbinpunctspacing Umathbinrelspacing Umathchar \ -Umathcharclass Umathchardef Umathcharfam Umathcharnum Umathcharnumdef \ -Umathcharslot Umathclosebinspacing Umathcloseclosespacing Umathcloseinnerspacing Umathcloseopenspacing \ -Umathcloseopspacing Umathcloseordspacing Umathclosepunctspacing Umathcloserelspacing Umathcode \ -Umathcodenum Umathcodenumdef Umathconnectoroverlapmin Umathfractiondelsize Umathfractiondenomdown \ -Umathfractiondenomvgap Umathfractionnumup Umathfractionnumvgap Umathfractionrule Umathinnerbinspacing \ -Umathinnerclosespacing Umathinnerinnerspacing Umathinneropenspacing Umathinneropspacing Umathinnerordspacing \ -Umathinnerpunctspacing Umathinnerrelspacing Umathlimitabovebgap Umathlimitabovekern Umathlimitabovevgap \ -Umathlimitbelowbgap Umathlimitbelowkern Umathlimitbelowvgap Umathopbinspacing Umathopclosespacing \ +Udelimiterover Udelimiterunder Uhextensible Umathaccent Umathaxis \ +Umathbinbinspacing Umathbinclosespacing Umathbininnerspacing Umathbinopenspacing Umathbinopspacing \ +Umathbinordspacing Umathbinpunctspacing Umathbinrelspacing Umathchar Umathcharclass \ +Umathchardef Umathcharfam Umathcharnum Umathcharnumdef Umathcharslot \ +Umathclosebinspacing Umathcloseclosespacing Umathcloseinnerspacing Umathcloseopenspacing Umathcloseopspacing \ +Umathcloseordspacing Umathclosepunctspacing Umathcloserelspacing Umathcode Umathcodenum \ +Umathconnectoroverlapmin Umathfractiondelsize Umathfractiondenomdown Umathfractiondenomvgap Umathfractionnumup \ +Umathfractionnumvgap Umathfractionrule Umathinnerbinspacing Umathinnerclosespacing Umathinnerinnerspacing \ +Umathinneropenspacing Umathinneropspacing Umathinnerordspacing Umathinnerpunctspacing Umathinnerrelspacing \ +Umathlimitabovebgap Umathlimitabovekern Umathlimitabovevgap Umathlimitbelowbgap Umathlimitbelowkern \ +Umathlimitbelowvgap Umathnolimitsubfactor Umathnolimitsupfactor Umathopbinspacing Umathopclosespacing \ Umathopenbinspacing Umathopenclosespacing Umathopeninnerspacing Umathopenopenspacing Umathopenopspacing \ Umathopenordspacing Umathopenpunctspacing Umathopenrelspacing Umathoperatorsize Umathopinnerspacing \ Umathopopenspacing Umathopopspacing Umathopordspacing Umathoppunctspacing Umathoprelspacing \ @@ -45,232 +43,136 @@ Umathrelrelspacing Umathskewedfractionhgap Umathskewedfractionvgap Umathspaceaft Umathstacknumup Umathstackvgap Umathsubshiftdown Umathsubshiftdrop Umathsubsupshiftdown \ Umathsubsupvgap Umathsubtopmax Umathsupbottommin Umathsupshiftdrop Umathsupshiftup \ Umathsupsubbottommax Umathunderbarkern Umathunderbarrule Umathunderbarvgap Umathunderdelimiterbgap \ -Umathunderdelimitervgap Umathnolimitsupfactor Umathnolimitsubfactor Umiddle Uoverdelimiter \ -Uradical Uright Uroot Uskewed Uskewedwithdelims \ -Ustack Ustartdisplaymath Ustartmath Ustopdisplaymath Ustopmath \ -Usubscript Usuperscript Uunderdelimiter Uvextensible adjustspacing \ -alignmark aligntab attribute attributedef hyphenpenaltymode \ -automatichyphenmode automatichyphenpenalty automaticdiscretionary explicithyphenpenalty explicitdiscretionary \ -bodydir boundary boxdir catcodetable clearmarks \ -copyfont crampeddisplaystyle crampedscriptscriptstyle crampedscriptstyle crampedtextstyle \ -draftmode dviextension dvifeedback dvivariable efcode \ -hjcode firstvalidlanguage fontid formatname gleaders \ -hyphenationmin hyphenationbounds ifabsdim ifabsnum ifprimitive \ -ignoreligaturesinfont initcatcodetable insertht lastsavedboxresourceindex lastsavedimageresourceindex \ -lastsavedimageresourcepages lastxpos lastypos latelua leftghost \ -leftmarginkern letcharcode letterspacefont linedir localbrokenpenalty \ -localinterlinepenalty localleftbox localrightbox lpcode luaescapestring \ -luatexbanner luatexrevision luatexversion luafunction mathdir \ +Umathunderdelimitervgap Unosubscript Unosuperscript Uoverdelimiter Uradical \ +Uroot Uskewed Uskewedwithdelims Ustack Ustartdisplaymath \ +Ustartmath Ustopdisplaymath Ustopmath Usubscript Usuperscript \ +Uunderdelimiter Uvextensible adjustspacing alignmark aligntab \ +attribute attributedef automaticdiscretionary automatichyphenmode automatichyphenpenalty \ +begincsname bodydir bodydirection boxdir boxdirection \ +breakafterdirmode catcodetable clearmarks copyfont compoundhyphenmode \ +crampeddisplaystyle crampedscriptscriptstyle crampedscriptstyle crampedtextstyle draftmode \ +dviextension dvifeedback dvivariable efcode etoksapp \ +etokspre expanded expandglyphsinfont explicitdiscretionary explicithyphenpenalty \ +fontid formatname gleaders hjcode hyphenationbounds \ +hyphenationmin hyphenpenaltymode ifabsdim ifabsnum ifincsname \ +ifprimitive ignoreligaturesinfont initcatcodetable insertht lastnamedcs \ +lastsavedboxresourceindex lastsavedimageresourceindex lastsavedimageresourcepages lastxpos lastypos \ +latelua leftghost leftmarginkern letcharcode letterspacefont \ +linedir linedirection localbrokenpenalty localinterlinepenalty localleftbox \ +localrightbox lpcode luaescapestring luafunction luatexbanner \ +luatexrevision luatexversion mathdelimitersmode mathdir mathdirection \ mathdisplayskipmode matheqnogapstep mathitalicsmode mathnolimitsmode mathoption \ -mathscriptsmode mathstyle mathsurroundskip mathsurroundmode mathrulesmode \ -mathrulesfam noboundary nokerns nohrule noligs \ -nospaces novrule normaldeviate outputbox outputmode \ -pagedir pageheight pagebottomoffset pageleftoffset pagerightoffset \ -pagetopoffset pagewidth pardir pdfextension pdffeedback \ -pdfvariable postexhyphenchar posthyphenchar predisplaygapfactor preexhyphenchar \ -prehyphenchar primitive protrudechars protrusionboundary pxdimen \ +mathpenaltiesmode mathrulesfam mathrulesmode mathscriptsmode mathscriptboxmode \ +mathstyle mathsurroundmode mathsurroundskip nohrule nokerns \ +noligs normaldeviate nospaces novrule outputbox \ +outputmode pagebottomoffset pagedir pagedirection pageheight \ +pageleftoffset pagerightoffset pagetopoffset pagewidth pardir \ +pardirection pdfextension pdffeedback pdfvariable postexhyphenchar \ +posthyphenchar prebinoppenalty predisplaygapfactor preexhyphenchar prehyphenchar \ +prerelpenalty primitive protrudechars pxdimen quitvmode \ randomseed rightghost rightmarginkern rpcode saveboxresource \ savecatcodetable saveimageresource savepos scantextokens setfontid \ setrandomseed shapemode suppressfontnotfounderror suppressifcsnameerror suppresslongerror \ -suppressoutererror suppressmathparerror synctex tagcode textdir \ -tracingfonts uniformdeviate useboxresource useimageresource wordboundary \ -vpack hpack tpack csstring begincsname \ -lastnamedcs toksapp tokspre etoksapp etokspre +suppressmathparerror suppressoutererror suppressprimitiveerror synctex tagcode \ +textdir textdirection toksapp tokspre tracingfonts \ +uniformdeviate useboxresource useimageresource keywordclass.tex.omega=\ -OmegaVersion bodydir chardp charht \ -charit charwd leftghost localbrokenpenalty localinterlinepenalty \ -localleftbox localrightbox mathdir odelcode odelimiter \ -omathaccent omathchar omathchardef omathcode oradical \ -pagedir pageheight pagewidth pardir rightghost \ -textdir +Omegaminorversion Omegarevision Omegaversion keywordclass.tex.pdftex=\ -efcode expanded ifincsname ifpdfabsdim \ -ifpdfabsnum ifpdfprimitive leftmarginkern letterspacefont lpcode \ -pdfadjustspacing pdfannot pdfcatalog pdfcolorstack pdfcolorstackinit \ -pdfcompresslevel pdfcopyfont pdfcreationdate pdfdecimaldigits pdfdest \ -pdfdestmargin pdfdraftmode pdfeachlineheight pdfeachlinedepth pdfendlink \ -pdfendthread pdffirstlineheight pdffontattr pdffontexpand pdffontname \ -pdffontobjnum pdffontsize pdfxformmargin pdfgamma pdfgentounicode \ -pdfglyphtounicode pdfhorigin pdfignoreddimen pdfimageapplygamma pdfimagegamma \ -pdfimagehicolor pdfimageresolution pdfincludechars pdfinclusioncopyfonts pdfignoreunknownimages \ -pdfinclusionerrorlevel pdfignoreunknownimages pdfinfo pdfinfoomitdate pdftrailerid \ -pdfinsertht pdflastannot pdflastlinedepth pdflastlink pdflastobj \ -pdflastxform pdflastximage pdflastximagepages pdflastxpos pdflastypos \ -pdflinkmargin pdfliteral pdfmapfile pdfmapline pdfminorversion \ -pdfnames pdfnoligatures pdfnormaldeviate pdfobj pdfobjcompresslevel \ -pdfoutline pdfoutput pdfpageattr pdfpagebox pdfpageheight \ -pdfpageref pdfpageresources pdfpagesattr pdfpagewidth pdfpkmode \ -pdfpkresolution pdfpkfixeddpi pdfprimitive pdfprotrudechars pdfpxdimen \ -pdfrandomseed pdfrefobj pdfrefxform pdfrefximage pdfreplacefont \ -pdfrestore pdfretval pdfsave pdfsavepos pdfsetmatrix \ -pdfsetrandomseed pdfstartlink pdfstartthread pdftexbanner pdftexrevision \ -pdftexversion pdfsuppressptexinfo pdfsuppressoptionalinfo pdfthread pdfthreadmargin \ -pdftracingfonts pdftrailer pdfuniformdeviate pdfuniqueresname pdfvorigin \ -pdfxform pdfxformattr pdfxformname pdfxformresources pdfximage \ -quitvmode rightmarginkern rpcode tagcode +ifpdfabsdim ifpdfabsnum ifpdfprimitive pdfadjustspacing \ +pdfannot pdfcatalog pdfcolorstack pdfcolorstackinit pdfcompresslevel \ +pdfcopyfont pdfcreationdate pdfdecimaldigits pdfdest pdfdestmargin \ +pdfdraftmode pdfeachlinedepth pdfeachlineheight pdfendlink pdfendthread \ +pdffirstlineheight pdffontattr pdffontexpand pdffontname pdffontobjnum \ +pdffontsize pdfgamma pdfgentounicode pdfglyphtounicode pdfhorigin \ +pdfignoreddimen pdfignoreunknownimages pdfimageaddfilename pdfimageapplygamma pdfimagegamma \ +pdfimagehicolor pdfimageresolution pdfincludechars pdfinclusioncopyfonts pdfinclusionerrorlevel \ +pdfinfo pdfinfoomitdate pdfinsertht pdflastannot pdflastlinedepth \ +pdflastlink pdflastobj pdflastxform pdflastximage pdflastximagepages \ +pdflastxpos pdflastypos pdflinkmargin pdfliteral pdfmapfile \ +pdfmapline pdfmajorversion pdfminorversion pdfnames pdfnoligatures \ +pdfnormaldeviate pdfobj pdfobjcompresslevel pdfoutline pdfoutput \ +pdfpageattr pdfpagebox pdfpageheight pdfpageref pdfpageresources \ +pdfpagesattr pdfpagewidth pdfpkfixeddpi pdfpkmode pdfpkresolution \ +pdfprimitive pdfprotrudechars pdfpxdimen pdfrandomseed pdfrefobj \ +pdfrefxform pdfrefximage pdfreplacefont pdfrestore pdfretval \ +pdfsave pdfsavepos pdfsetmatrix pdfsetrandomseed pdfstartlink \ +pdfstartthread pdfsuppressoptionalinfo pdfsuppressptexinfo pdftexbanner pdftexrevision \ +pdftexversion pdfthread pdfthreadmargin pdftracingfonts pdftrailer \ +pdftrailerid pdfuniformdeviate pdfuniqueresname pdfvorigin pdfxform \ +pdfxformattr pdfxformmargin pdfxformname pdfxformresources pdfximage keywordclass.tex.tex=\ -- / AlephVersion Alephminorversion \ -Alephrevision Alephversion OmegaVersion Omegaminorversion Omegarevision \ -Omegaversion Udelcode Udelcodenum Udelimiter Udelimiterover \ -Udelimiterunder Uhextensible Uleft Umathaccent Umathaxis \ -Umathbinbinspacing Umathbinclosespacing Umathbininnerspacing Umathbinopenspacing Umathbinopspacing \ -Umathbinordspacing Umathbinpunctspacing Umathbinrelspacing Umathchar Umathcharclass \ -Umathchardef Umathcharfam Umathcharnum Umathcharnumdef Umathcharslot \ -Umathclosebinspacing Umathcloseclosespacing Umathcloseinnerspacing Umathcloseopenspacing Umathcloseopspacing \ -Umathcloseordspacing Umathclosepunctspacing Umathcloserelspacing Umathcode Umathcodenum \ -Umathcodenumdef Umathconnectoroverlapmin Umathfractiondelsize Umathfractiondenomdown Umathfractiondenomvgap \ -Umathfractionnumup Umathfractionnumvgap Umathfractionrule Umathinnerbinspacing Umathinnerclosespacing \ -Umathinnerinnerspacing Umathinneropenspacing Umathinneropspacing Umathinnerordspacing Umathinnerpunctspacing \ -Umathinnerrelspacing Umathlimitabovebgap Umathlimitabovekern Umathlimitabovevgap Umathlimitbelowbgap \ -Umathlimitbelowkern Umathlimitbelowvgap Umathopbinspacing Umathopclosespacing Umathopenbinspacing \ -Umathopenclosespacing Umathopeninnerspacing Umathopenopenspacing Umathopenopspacing Umathopenordspacing \ -Umathopenpunctspacing Umathopenrelspacing Umathoperatorsize Umathopinnerspacing Umathopopenspacing \ -Umathopopspacing Umathopordspacing Umathoppunctspacing Umathoprelspacing Umathordbinspacing \ -Umathordclosespacing Umathordinnerspacing Umathordopenspacing Umathordopspacing Umathordordspacing \ -Umathordpunctspacing Umathordrelspacing Umathoverbarkern Umathoverbarrule Umathoverbarvgap \ -Umathoverdelimiterbgap Umathoverdelimitervgap Umathpunctbinspacing Umathpunctclosespacing Umathpunctinnerspacing \ -Umathpunctopenspacing Umathpunctopspacing Umathpunctordspacing Umathpunctpunctspacing Umathpunctrelspacing \ -Umathquad Umathradicaldegreeafter Umathradicaldegreebefore Umathradicaldegreeraise Umathradicalkern \ -Umathradicalrule Umathradicalvgap Umathrelbinspacing Umathrelclosespacing Umathrelinnerspacing \ -Umathrelopenspacing Umathrelopspacing Umathrelordspacing Umathrelpunctspacing Umathrelrelspacing \ -Umathskewedfractionhgap Umathskewedfractionvgap Umathspaceafterscript Umathstackdenomdown Umathstacknumup \ -Umathstackvgap Umathsubshiftdown Umathsubshiftdrop Umathsubsupshiftdown Umathsubsupvgap \ -Umathsubtopmax Umathsupbottommin Umathsupshiftdrop Umathsupshiftup Umathsupsubbottommax \ -Umathunderbarkern Umathunderbarrule Umathunderbarvgap Umathunderdelimiterbgap Umathunderdelimitervgap \ -Umathnolimitsupfactor Umathnolimitsubfactor Umiddle Uoverdelimiter Uradical \ -Uright Uroot Uskewed Uskewedwithdelims Ustack \ -Ustartdisplaymath Ustartmath Ustopdisplaymath Ustopmath Usubscript \ -Usuperscript Uunderdelimiter Uvextensible above abovedisplayshortskip \ -abovedisplayskip abovewithdelims accent adjdemerits advance \ -afterassignment aftergroup alignmark aligntab atop \ -atopwithdelims attribute attributedef hyphenpenaltymode automatichyphenmode \ -automatichyphenpenalty automaticdiscretionary explicithyphenpenalty explicitdiscretionary badness \ -baselineskip batchmode begingroup belowdisplayshortskip belowdisplayskip \ -binoppenalty bodydir botmark botmarks boundary \ -box boxdir boxmaxdepth brokenpenalty catcode \ -catcodetable char chardef cleaders clearmarks \ -closein closeout clubpenalties clubpenalty copy \ -copyfont count countdef cr crampeddisplaystyle \ -crampedscriptscriptstyle crampedscriptstyle crampedtextstyle crcr csname \ -currentgrouplevel currentgrouptype currentifbranch currentiflevel currentiftype \ -day deadcycles def defaulthyphenchar defaultskewchar \ -delcode delimiter delimiterfactor delimitershortfall detokenize \ -dimen dimendef dimexpr directlua discretionary \ -displayindent displaylimits displaystyle displaywidowpenalties displaywidowpenalty \ -displaywidth divide doublehyphendemerits dp dump \ -dviextension dvifeedback dvivariable eTeXVersion eTeXminorversion \ -eTeXrevision eTeXversion edef efcode hjcode \ -else emergencystretch end endcsname endgroup \ -endinput endlinechar eqno errhelp errmessage \ -errorcontextlines errorstopmode escapechar everycr everydisplay \ -everyeof everyhbox everyjob everymath everypar \ -everyvbox exhyphenchar exhyphenpenalty expandafter expanded \ -expandglyphsinfont fam fi finalhyphendemerits firstmark \ -firstmarks floatingpenalty font fontchardp fontcharht \ -fontcharic fontcharwd fontdimen firstvalidlanguage fontid \ -fontname formatname futurelet gdef gleaders \ -global globaldefs glueexpr glueshrink glueshrinkorder \ -gluestretch gluestretchorder gluetomu halign hangafter \ + - / Uleft \ +Umiddle Uright above abovedisplayshortskip abovedisplayskip \ +abovewithdelims accent adjdemerits advance afterassignment \ +aftergroup atop atopwithdelims badness baselineskip \ +batchmode begingroup belowdisplayshortskip belowdisplayskip binoppenalty \ +botmark boundary box boxmaxdepth brokenpenalty \ +catcode char chardef cleaders closein \ +closeout clubpenalty copy count countdef \ +cr crcr csname csstring day \ +deadcycles def defaulthyphenchar defaultskewchar delcode \ +delimiter delimiterfactor delimitershortfall dimen dimendef \ +directlua discretionary displayindent displaylimits displaystyle \ +displaywidowpenalty displaywidth divide doublehyphendemerits dp \ +dump edef else emergencystretch end \ +endcsname endgroup endinput endlinechar eqno \ +errhelp errmessage errorcontextlines errorstopmode escapechar \ +everycr everydisplay everyhbox everyjob everymath \ +everypar everyvbox exhyphenchar exhyphenpenalty expandafter \ +fam fi finalhyphendemerits firstmark firstvalidlanguage \ +floatingpenalty font fontdimen fontname futurelet \ +gdef global globaldefs halign hangafter \ hangindent hbadness hbox hfil hfill \ -hfilneg hfuzz hoffset holdinginserts hrule \ -hsize hskip hss ht hyphenation \ -hyphenchar hyphenpenalty hyphenationmin hyphenationbounds if \ -ifabsdim ifabsnum ifcase ifcat ifcsname \ -ifdefined ifdim ifeof iffalse iffontchar \ -ifhbox ifhmode ifincsname ifinner ifmmode \ -ifnum ifodd ifpdfabsdim ifpdfabsnum ifpdfprimitive \ -ifprimitive iftrue ifvbox ifvmode ifvoid \ -ifx ignoreligaturesinfont ignorespaces immediate indent \ -initcatcodetable input inputlineno insert insertpenalties \ -interactionmode interlinepenalties interlinepenalty jobname kern \ -language lastbox lastkern lastlinefit lastnodetype \ -lastpenalty lastsavedboxresourceindex lastsavedimageresourceindex lastsavedimageresourcepages lastskip \ -lastxpos lastypos latelua lccode leaders \ -left leftghost lefthyphenmin leftmarginkern leftskip \ -leqno let letcharcode letterspacefont limits \ -linedir linepenalty lineskip lineskiplimit localbrokenpenalty \ -localinterlinepenalty localleftbox localrightbox long looseness \ -lower lowercase lpcode luaescapestring luatexbanner \ -luatexrevision luatexversion mag mark marks \ -mathaccent mathbin mathchar mathchardef mathchoice \ -mathclose mathcode mathdir mathdisplayskipmode matheqnogapstep \ -mathinner mathitalicsmode mathnolimitsmode mathop mathopen \ -mathoption mathord mathpunct mathrel mathrulesmode \ -mathrulesfam mathscriptsmode mathstyle mathsurroundskip mathsurroundmode \ +hfilneg hfuzz hoffset holdinginserts hpack \ +hrule hsize hskip hss ht \ +hyphenation hyphenchar hyphenpenalty if ifcase \ +ifcat ifdim ifeof iffalse ifhbox \ +ifhmode ifinner ifmmode ifnum ifodd \ +iftrue ifvbox ifvmode ifvoid ifx \ +ignorespaces immediate indent input inputlineno \ +insert insertpenalties interlinepenalty jobname kern \ +language lastbox lastkern lastpenalty lastskip \ +lccode leaders left lefthyphenmin leftskip \ +leqno let limits linepenalty lineskip \ +lineskiplimit long looseness lower lowercase \ +mag mark mathaccent mathbin mathchar \ +mathchardef mathchoice mathclose mathcode mathinner \ +mathop mathopen mathord mathpunct mathrel \ mathsurround maxdeadcycles maxdepth meaning medmuskip \ message middle mkern month moveleft \ -moveright mskip muexpr multiply muskip \ -muskipdef mutoglue newlinechar noalign noboundary \ -noexpand noindent nokerns nohrule noligs \ -nospaces novrule nolimits nolocaldirs nolocalwhatsits \ -nonscript nonstopmode normaldeviate nulldelimiterspace nullfont \ -number numexpr odelcode odelimiter omathaccent \ -omathchar omathchardef omathcode omit openin \ -openout or oradical outer output \ -outputbox outputpenalty over overfullrule overline \ -overwithdelims pagebottomoffset pagedepth pagedir pagediscards \ -pagefilllstretch pagefillstretch pagefilstretch pagegoal pageheight \ -pageleftoffset pagerightoffset pageshrink pagestretch pagetopoffset \ -pagetotal pagewidth par pardir parfillskip \ -parindent parshape parshapedimen parshapeindent parshapelength \ -parskip patterns pausing pdfadjustspacing pdfannot \ -pdfcatalog pdfcolorstack pdfcolorstackinit pdfcompresslevel pdfcopyfont \ -pdfcreationdate pdfdecimaldigits pdfdest pdfdestmargin pdfdraftmode \ -pdfeachlineheight pdfeachlinedepth pdfendlink pdfendthread pdfextension \ -pdfvariable pdffirstlineheight pdffontattr pdffontexpand pdffontname \ -pdffontobjnum pdffontsize pdfxformmargin pdfgamma pdfgentounicode \ -pdfglyphtounicode pdfhorigin pdfignoreddimen pdfimageaddfilename pdfimageapplygamma \ -pdfimagegamma pdfimagehicolor pdfimageresolution pdfincludechars pdfinclusioncopyfonts \ -pdfinclusionerrorlevel pdfignoreunknownimages pdfinfo pdfinfoomitdate pdftrailerid \ -pdfinsertht pdflastannot pdflastlinedepth pdflastlink pdflastobj \ -pdflastxform pdflastximage pdflastximagepages pdflastxpos pdflastypos \ -pdflinkmargin pdfliteral pdfmapfile pdfmapline pdfminorversion \ -pdfnames pdfnoligatures pdfnormaldeviate pdfobj pdfobjcompresslevel \ -pdfoutline pdfoutput pdfpageattr pdfpagebox pdfpageheight \ -pdfpageref pdfpageresources pdfpagesattr pdfpagewidth pdfpkmode \ -pdfpkresolution pdfpkfixeddpi pdfprimitive pdfprotrudechars pdfpxdimen \ -pdfrandomseed pdfrefobj pdfrefxform pdfrefximage pdfreplacefont \ -pdfrestore pdfretval pdfsave pdfsavepos pdfsetmatrix \ -pdfsetrandomseed pdfstartlink pdfstartthread pdftexbanner pdftexrevision \ -pdftexversion pdfsuppressptexinfo pdfsuppressoptionalinfo pdfthread pdfthreadmargin \ -pdftracingfonts pdftrailer pdfuniformdeviate pdfuniqueresname pdfvorigin \ -pdfxform pdfxformattr pdfxformname pdfxformresources pdfximage \ -penalty postdisplaypenalty postexhyphenchar posthyphenchar predisplaydirection \ -predisplaygapfactor predisplaypenalty predisplaysize preexhyphenchar prehyphenchar \ -pretolerance prevdepth prevgraf primitive protected \ -protrudechars protrusionboundary pxdimen quitvmode radical \ -raise randomseed read readline relax \ -relpenalty right rightghost righthyphenmin rightmarginkern \ -rightskip romannumeral rpcode saveboxresource saveimageresource \ -savepos savecatcodetable savinghyphcodes savingvdiscards scantextokens \ -scantokens scriptfont scriptscriptfont scriptscriptstyle scriptspace \ -scriptstyle scrollmode setbox setfontid setlanguage \ -setrandomseed shapemode sfcode shipout show \ -showbox showboxbreadth showboxdepth showgroups showifs \ -showlists showthe showtokens skewchar skip \ -skipdef spacefactor spaceskip span special \ -splitbotmark splitbotmarks splitdiscards splitfirstmark splitfirstmarks \ -splitmaxdepth splittopskip string suppressfontnotfounderror suppressifcsnameerror \ -suppresslongerror suppressoutererror suppressmathparerror synctex tabskip \ -tagcode textdir textfont textstyle the \ -thickmuskip thinmuskip time toks toksdef \ -tolerance topmark topmarks topskip tracingassigns \ -tracingcommands tracingfonts tracinggroups tracingifs tracinglostchars \ -tracingmacros tracingnesting tracingonline tracingoutput tracingpages \ -tracingparagraphs tracingrestores tracingscantokens tracingstats uccode \ -uchyph underline unexpanded unhbox unhcopy \ -uniformdeviate unkern unless unpenalty unskip \ -unvbox unvcopy uppercase useboxresource useimageresource \ +moveright mskip multiply muskip muskipdef \ +newlinechar noalign noboundary noexpand noindent \ +nolimits nonscript nonstopmode nulldelimiterspace nullfont \ +number omit openin openout or \ +outer output outputpenalty over overfullrule \ +overline overwithdelims pagedepth pagefilllstretch pagefillstretch \ +pagefilstretch pagegoal pageshrink pagestretch pagetotal \ +par parfillskip parindent parshape parskip \ +patterns pausing penalty postdisplaypenalty predisplaypenalty \ +predisplaysize pretolerance prevdepth prevgraf protrusionboundary \ +radical raise read relax relpenalty \ +right righthyphenmin rightskip romannumeral scriptfont \ +scriptscriptfont scriptscriptstyle scriptspace scriptstyle scrollmode \ +setbox setlanguage sfcode shipout show \ +showbox showboxbreadth showboxdepth showlists showthe \ +skewchar skip skipdef spacefactor spaceskip \ +span special splitbotmark splitfirstmark splitmaxdepth \ +splittopskip string tabskip textfont textstyle \ +the thickmuskip thinmuskip time toks \ +toksdef tolerance topmark topskip tpack \ +tracingcommands tracinglostchars tracingmacros tracingonline tracingoutput \ +tracingpages tracingparagraphs tracingrestores tracingstats uccode \ +uchyph underline unhbox unhcopy unkern \ +unpenalty unskip unvbox unvcopy uppercase \ vadjust valign vbadness vbox vcenter \ vfil vfill vfilneg vfuzz voffset \ -vrule vsize vskip vsplit vss \ -vtop wd widowpenalties widowpenalty wordboundary \ -write xdef xleaders xspaceskip year \ -vpack hpack tpack csstring begincsname \ -lastnamedcs toksapp tokspre etoksapp etokspre +vpack vrule vsize vskip vsplit \ +vss vtop wd widowpenalty wordboundary \ +write xdef xleaders xspaceskip year keywordclass.tex.xetex=\ XeTeXversion diff --git a/context/data/scite/context/scite-context.properties b/context/data/scite/context/scite-context.properties index b639ce7f8..e6ee79050 100644 --- a/context/data/scite/context/scite-context.properties +++ b/context/data/scite/context/scite-context.properties @@ -232,20 +232,24 @@ command.0.$(file.patterns.example)=$(name.example.xmlcheck) $(FileNameExt) command.name.1.$(file.patterns.context)=Process TeX file command.name.1.$(file.patterns.metafun)=Process METAPOST File command.name.1.$(file.patterns.example)=Process XML File +command.name.1.$(file.patterns.lua)=Process Lua File command.1.$(file.patterns.context)=$(name.context.run) $(FileNameExt) command.1.$(file.patterns.metafun)=$(name.context.run) $(FileNameExt) --metapost command.1.$(file.patterns.example)=$(name.context.run) $(FileNameExt) --xml +command.1.$(file.patterns.lua)=$(name.context.mtxrunjit) --script "$(FileNameExt)" command.1.subsystem.$(file.patterns.context)=1 command.1.subsystem.$(file.patterns.metafun)=1 command.1.subsystem.$(file.patterns.example)=1 +command.1.subsystem.$(file.patterns.lua)=1 command.name.29.*=Run with jit command.subsystem.29.*=1 command.29.$(file.patterns.context)=$(name.context.runjit) $(FileNameExt) command.29.$(file.patterns.metafun)=$(name.context.runjit) $(FileNameExt) --metapost -command.29.$(file.patterns.exmaple)=$(name.context.runjit) $(FileNameExt) --xml +command.29.$(file.patterns.example)=$(name.context.runjit) $(FileNameExt) --xml +command.29.$(file.patterns.lua)=$(name.context.mtxrunjit) --script "$(FileNameExt)" command.groupundo.29.*=yes command.save.before.29.*=2 command.shortcut.29.*=Alt+F12 @@ -316,11 +320,13 @@ command.7=$(name.context.run) --extra=listing --pretty command.7.$(file.patterns.context)=$(name.context.run) --extra=listing --pretty --result=$(FileName) $(FileNameExt) command.7.$(file.patterns.metafun)=$(name.context.run) --extra=listing --pretty --result=$(FileName) $(FileNameExt) command.7.$(file.patterns.example)=$(name.context.run) --extra=listing --pretty --result=$(FileName) $(FileNameExt) +command.7.$(file.patterns.lua)=$(name.context.run) --extra=listing --pretty --result=$(FileName) $(FileNameExt) command.7.subsystem=1 command.7.subsystem.$(file.patterns.context)=1 command.7.subsystem.$(file.patterns.metafun)=1 command.7.subsystem.$(file.patterns.example)=1 +command.7.subsystem.$(file.patterns.lua)=1 # 10: arranging diff --git a/context/data/scite/context/scite-ctx-bidi.lua b/context/data/scite/context/scite-ctx-bidi.lua new file mode 100644 index 000000000..ab64da70d --- /dev/null +++ b/context/data/scite/context/scite-ctx-bidi.lua @@ -0,0 +1,536 @@ +if not modules then modules = { } end modules ['scite-ctx-bidi'] = { + version = 1.001, + comment = "companion to scite-ctx.lua", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files", + comment = "Unicode bidi (sort of) variant c", +} + +-- Partial comment from typo-duc.lua: +-- +-- This is a follow up on typo-dua which itself is a follow up on t-bidi by Khaled Hosny which +-- in turn is based on minibidi.c from Arabeyes. This is a further optimizations, as well as +-- an update on some recent unicode bidi developments. There is (and will) also be more control +-- added. As a consequence this module is somewhat slower than its precursor which itself is +-- slower than the one-pass bidi handler. This is also a playground and I might add some plugin +-- support. However, in the meantime performance got a bit better and this third variant is again +-- some 10% faster than the second variant. +-- +-- ... some patches and updates applied +-- ... some code can be removed +-- ... has to be kept in sync with context +-- ... mtxrun --script interface +-- +-- ... this feature is more fun than useful +-- ... this way we can use it to check what scite / uniscribe sees (as scintila is weak on +-- bidi selection) + +local setmetatable = setmetatable + +local data = require("context.lexers.data.scite-context-data-bidi") + +local directiondata = data.directions +local mirrordata = data.mirrors +local textclassdata = data.textclasses + +-- setmetatable(directiondata,{ __index = function(t,k) local v = "l" t[k] = v return v end }) + +local maximum_stack = 0xFF -- unicode: 60, will be jumped to 125, we don't care too much +local analyze_fences = false + +local whitespace = { + lre = true, + rle = true, + lro = true, + rlo = true, + pdf = true, + bn = true, + ws = true, +} + +local b_s_ws_on = { + b = true, + s = true, + ws = true, + on = true +} + +local mt_space = { __index = { char = 0x0020, direction = "ws", original = "ws", level = 0 } } +----- mt_lre = { __index = { char = 0x202A, direction = "lre", original = "lre", level = 0 } } +----- mt_rle = { __index = { char = 0x202B, direction = "rle", original = "rle", level = 0 } } +----- mt_pdf = { __index = { char = 0x202C, direction = "pdf", original = "pdf", level = 0 } } +----- mt_object = { __index = { char = 0xFFFC, direction = "on", original = "on", level = 0 } } + +local stack = { } -- shared + +setmetatable(stack, { __index = function(t,k) local v = { } t[k] = v return v end }) + +local function build_list(list) + -- P1 + local size = #list + for i=1,size do + local chr = list[i] + if chr == " " then + list[i] = setmetatable({ },mt_space) + else + local dir = directiondata[chr] or "l" + list[i] = { char = chr, direction = dir, original = dir, level = 0 } + end + end + return list, size +end + +local function resolve_fences(list,size,start,limit) + -- N0: funny effects, not always better, so it's an option + local nofstack = 0 + for i=start,limit do + local entry = list[i] + if entry.direction == "on" then + local char = entry.char + local mirror = mirrordata[char] + if mirror then + local class = textclassdata[char] + entry.mirror = mirror + entry.class = class + if class == "open" then + nofstack = nofstack + 1 + local stacktop = stack[nofstack] + stacktop[1] = mirror + stacktop[2] = i + stacktop[3] = false -- not used + elseif nofstack == 0 then + -- skip + elseif class == "close" then + while nofstack > 0 do + local stacktop = stack[nofstack] + if stacktop[1] == char then + local open = stacktop[2] + local close = i + list[open ].paired = close + list[close].paired = open + break + else + -- do we mirror or not + end + nofstack = nofstack - 1 + end + end + end + end + end +end + +local function get_baselevel(list,size,direction) + if direction == "TRT" then + return 1, "TRT", true + elseif direction == "TLT" then + return 0, "TLT", true + end + -- P2, P3: + for i=1,size do + local entry = list[i] + local direction = entry.direction + if direction == "r" or direction == "al" then -- and an ? + return 1, "TRT", true + elseif direction == "l" then + return 0, "TLT", true + end + end + return 0, "TLT", false +end + +local function resolve_explicit(list,size,baselevel) +-- if list.rle or list.lre or list.rlo or list.lro then + -- X1 + local level = baselevel + local override = "on" + local nofstack = 0 + for i=1,size do + local entry = list[i] + local direction = entry.direction + -- X2 + if direction == "rle" then + if nofstack < maximum_stack then + nofstack = nofstack + 1 + local stacktop = stack[nofstack] + stacktop[1] = level + stacktop[2] = override + level = level + (level % 2 == 1 and 2 or 1) -- least_greater_odd(level) + override = "on" + entry.level = level + entry.direction = "bn" + entry.remove = true + end + -- X3 + elseif direction == "lre" then + if nofstack < maximum_stack then + nofstack = nofstack + 1 + local stacktop = stack[nofstack] + stacktop[1] = level + stacktop[2] = override + level = level + (level % 2 == 1 and 1 or 2) -- least_greater_even(level) + override = "on" + entry.level = level + entry.direction = "bn" + entry.remove = true + end + -- X4 + elseif direction == "rlo" then + if nofstack < maximum_stack then + nofstack = nofstack + 1 + local stacktop = stack[nofstack] + stacktop[1] = level + stacktop[2] = override + level = level + (level % 2 == 1 and 2 or 1) -- least_greater_odd(level) + override = "r" + entry.level = level + entry.direction = "bn" + entry.remove = true + end + -- X5 + elseif direction == "lro" then + if nofstack < maximum_stack then + nofstack = nofstack + 1 + local stacktop = stack[nofstack] + stacktop[1] = level + stacktop[2] = override + level = level + (level % 2 == 1 and 1 or 2) -- least_greater_even(level) + override = "l" + entry.level = level + entry.direction = "bn" + entry.remove = true + end + -- X7 + elseif direction == "pdf" then + if nofstack < maximum_stack then + local stacktop = stack[nofstack] + level = stacktop[1] + override = stacktop[2] + nofstack = nofstack - 1 + entry.level = level + entry.direction = "bn" + entry.remove = true + end + -- X6 + else + entry.level = level + if override ~= "on" then + entry.direction = override + end + end + end +-- else +-- for i=1,size do +-- list[i].level = baselevel +-- end +-- end + -- X8 (reset states and overrides after paragraph) +end + +local function resolve_weak(list,size,start,limit,orderbefore,orderafter) + -- W1: non spacing marks get the direction of the previous character +-- if list.nsm then + for i=start,limit do + local entry = list[i] + if entry.direction == "nsm" then + if i == start then + entry.direction = orderbefore + else + entry.direction = list[i-1].direction + end + end + end +-- end + -- W2: mess with numbers and arabic +-- if list.en then + for i=start,limit do + local entry = list[i] + if entry.direction == "en" then + for j=i-1,start,-1 do + local prev = list[j] + local direction = prev.direction + if direction == "al" then + entry.direction = "an" + break + elseif direction == "r" or direction == "l" then + break + end + end + end + end +-- end + -- W3 +-- if list.al then + for i=start,limit do + local entry = list[i] + if entry.direction == "al" then + entry.direction = "r" + end + end +-- end + -- W4: make separators number +-- if list.es or list.cs then + -- skip +-- if false then + if false then + for i=start+1,limit-1 do + local entry = list[i] + local direction = entry.direction + if direction == "es" then + if list[i-1].direction == "en" and list[i+1].direction == "en" then + entry.direction = "en" + end + elseif direction == "cs" then + local prevdirection = list[i-1].direction + if prevdirection == "en" then + if list[i+1].direction == "en" then + entry.direction = "en" + end + elseif prevdirection == "an" and list[i+1].direction == "an" then + entry.direction = "an" + end + end + end + else -- only more efficient when we have es/cs + local runner = start + 2 + local before = list[start] + local entry = list[start + 1] + local after = list[runner] + while after do + local direction = entry.direction + if direction == "es" then + if before and before.direction == "en" and after.direction == "en" then + entry.direction = "en" + end + elseif direction == "cs" then + local prevdirection = before and before.direction + if prevdirection == "en" then + if after.direction == "en" then + entry.direction = "en" + end + elseif prevdirection == "an" and after.direction == "an" then + entry.direction = "an" + end + end + before = current + current = after + after = list[runner] + runner = runner + 1 + end + end +-- end + -- W5 +-- if list.et then + local i = start + while i <= limit do + if list[i].direction == "et" then + local runstart = i + local runlimit = runstart + for i=runstart,limit do + if list[i].direction == "et" then + runlimit = i + else + break + end + end + local rundirection = runstart == start and sor or list[runstart-1].direction + if rundirection ~= "en" then + rundirection = runlimit == limit and orderafter or list[runlimit+1].direction + end + if rundirection == "en" then + for j=runstart,runlimit do + list[j].direction = "en" + end + end + i = runlimit + end + i = i + 1 + end +-- end + -- W6 +-- if list.es or list.cs or list.et then + for i=start,limit do + local entry = list[i] + local direction = entry.direction + if direction == "es" or direction == "et" or direction == "cs" then + entry.direction = "on" + end + end +-- end + -- W7 + for i=start,limit do + local entry = list[i] + if entry.direction == "en" then + local prev_strong = orderbefore + for j=i-1,start,-1 do + local direction = list[j].direction + if direction == "l" or direction == "r" then + prev_strong = direction + break + end + end + if prev_strong == "l" then + entry.direction = "l" + end + end + end +end + +local function resolve_neutral(list,size,start,limit,orderbefore,orderafter) + -- N1, N2 + for i=start,limit do + local entry = list[i] + if b_s_ws_on[entry.direction] then + -- this needs checking + local leading_direction, trailing_direction, resolved_direction + local runstart = i + local runlimit = runstart + for j=runstart+1,limit do + if b_s_ws_on[list[j].direction] then + runlimit = j + else + break + end + end + if runstart == start then + leading_direction = orderbefore + else + leading_direction = list[runstart-1].direction + if leading_direction == "en" or leading_direction == "an" then + leading_direction = "r" + end + end + if runlimit == limit then + trailing_direction = orderafter + else + trailing_direction = list[runlimit+1].direction + if trailing_direction == "en" or trailing_direction == "an" then + trailing_direction = "r" + end + end + if leading_direction == trailing_direction then + -- N1 + resolved_direction = leading_direction + else + -- N2 / does the weird period + resolved_direction = entry.level % 2 == 1 and "r" or "l" + end + for j=runstart,runlimit do + list[j].direction = resolved_direction + end + i = runlimit + end + i = i + 1 + end +end + +local function resolve_implicit(list,size,start,limit,orderbefore,orderafter,baselevel) + for i=start,limit do + local entry = list[i] + local level = entry.level + local direction = entry.direction + if level % 2 ~= 1 then -- even + -- I1 + if direction == "r" then + entry.level = level + 1 + elseif direction == "an" or direction == "en" then + entry.level = level + 2 + end + else + -- I2 + if direction == "l" or direction == "en" or direction == "an" then + entry.level = level + 1 + end + end + end +end + +local function resolve_levels(list,size,baselevel,analyze_fences) + -- X10 + local start = 1 + while start < size do + local level = list[start].level + local limit = start + 1 + while limit < size and list[limit].level == level do + limit = limit + 1 + end + local prev_level = start == 1 and baselevel or list[start-1].level + local next_level = limit == size and baselevel or list[limit+1].level + local orderbefore = (level > prev_level and level or prev_level) % 2 == 1 and "r" or "l" + local orderafter = (level > next_level and level or next_level) % 2 == 1 and "r" or "l" + -- W1 .. W7 + resolve_weak(list,size,start,limit,orderbefore,orderafter) + -- N0 + if analyze_fences then + resolve_fences(list,size,start,limit) + end + -- N1 .. N2 + resolve_neutral(list,size,start,limit,orderbefore,orderafter) + -- I1 .. I2 + resolve_implicit(list,size,start,limit,orderbefore,orderafter,baselevel) + start = limit + end + -- L1 + for i=1,size do + local entry = list[i] + local direction = entry.original + -- (1) + if direction == "s" or direction == "b" then + entry.level = baselevel + -- (2) + for j=i-1,1,-1 do + local entry = list[j] + if whitespace[entry.original] then + entry.level = baselevel + else + break + end + end + end + end + -- (3) + for i=size,1,-1 do + local entry = list[i] + if whitespace[entry.original] then + entry.level = baselevel + else + break + end + end + -- L4 + if analyze_fences then + for i=1,size do + local entry = list[i] + if entry.level % 2 == 1 then + if entry.mirror and not entry.paired then + entry.mirror = false + end + elseif entry.mirror then + entry.mirror = false + end + end + else + for i=1,size do + local entry = list[i] + if entry.level % 2 == 1 then + local mirror = mirrordata[entry.char] + if mirror then + entry.mirror = mirror + end + end + end + end +end + +local function process(head,direction) + local list, size = build_list(head) + local baselevel = get_baselevel(list,size,direction) + resolve_explicit(list,size,baselevel) + resolve_levels(list,size,baselevel,analyze_fences) + return list, size +end + +return { + process = process, +} diff --git a/context/data/scite/context/scite-ctx.lua b/context/data/scite/context/scite-ctx.lua index 809f36041..f2f33ecbb 100644 --- a/context/data/scite/context/scite-ctx.lua +++ b/context/data/scite/context/scite-ctx.lua @@ -75,17 +75,89 @@ props = props or { } -- setmetatable(props,{ __index = function(k,v) props[k] = local byte, lower, upper, gsub, sub, find, rep, match, gmatch, format, char = string.byte, string.lower, string.upper, string.gsub, string.sub, string.find, string.rep, string.match, string.gmatch, string.format, string.char local sort, concat = table.sort, table.concat -local crlf = "\n" +-- helpers : utf -if not trace then - trace = print +local magicstring = rep("<ctx-crlf/>", 2) + +local l2 = char(0xC0) +local l3 = char(0xE0) +local l4 = char(0xF0) + +local function utflen(str) + local n = 0 + local l = 0 + for s in gmatch(str,".") do + if l > 0 then + l = l - 1 + else + n = n + 1 + if s >= l4 then + l = 3 + elseif s >= l3 then + l = 2 + elseif s >= l2 then + l = 1 + end + end + end + return n +end + +-- helpers: system + +function io.exists(filename) + local ok, result, message = pcall(io.open,filename) + if result then + io.close(result) + return true + else + return false + end end -function traceln(str) - trace(str .. crlf) - io.flush() +function os.envvar(str) + local s = os.getenv(str) + if s ~= '' then + return s + end + s = os.getenv(upper(str)) + if s ~= '' then + return s + end + s = os.getenv(lower(str)) + if s ~= '' then + return s + end end +-- helpers: reporting + +local crlf = "\n" +local report = nil +local trace = trace + +if trace then + report = function(fmt,...) + if fmt then + trace(format(fmt,...)) + end + trace(crlf) + io.flush() + end +else + trace = print + report = function(fmt,...) + if fmt then + trace(format(fmt,...)) + else + trace("") + end + io.flush() + end +end + +-- helpers: whatever (old code, we should use our libs) + local function grab(str,delimiter) local list = { } for snippet in gmatch(str,delimiter) do @@ -116,32 +188,7 @@ local function alphasort(list,i) end end -function io.exists(filename) - local ok, result, message = pcall(io.open,filename) - if result then - io.close(result) - return true - else - return false - end -end - -function os.envvar(str) - local s = os.getenv(str) - if s ~= '' then - return s - end - s = os.getenv(upper(str)) - if s ~= '' then - return s - end - s = os.getenv(lower(str)) - if s ~= '' then - return s - end -end - --- support functions, maybe editor namespace +-- helpers: editor -- function column_of_position(position) -- local line = editor:LineFromPosition(position) @@ -223,7 +270,7 @@ function get_dir_list(mask) os.execute(cmd) f = io.open(tmpfile) end - local files = {} + local files = { } if not f then -- path check added return files end @@ -234,27 +281,76 @@ function get_dir_list(mask) return files end +--helpers : utf from editor + +local cat -- has to be set to editor.CharAt + +local function toutfcode(pos) -- if needed we can cache + local c1 = cat[pos] + if c1 < 0 then + c1 = 256 + c1 + end + if c1 < 128 then + return c1, 1 + end + if c1 < 224 then + local c2 = cat[pos+1] + if c2 < 0 then + c2 = 256 + c2 + end + return c1 * 64 + c2 - 12416, 2 + end + if c1 < 240 then + local c2 = cat[pos+1] + local c3 = cat[pos+2] + if c2 < 0 then + c2 = 256 + c2 + end + if c3 < 0 then + c3 = 256 + c3 + end + return (c1 * 64 + c2) * 64 + c3 - 925824, 3 + end + if c1 < 245 then + local c2 = cat[pos+1] + local c3 = cat[pos+2] + local c4 = cat[pos+3] + if c2 < 0 then + c2 = 256 + c2 + end + if c3 < 0 then + c3 = 256 + c3 + end + if c4 < 0 then + c4 = 256 + c4 + end + return ((c1 * 64 + c2) * 64 + c3) * 64 + c4 - 63447168, 4 + end +end + -- banner do - local wordpath = props['ctx.spellcheck.wordpath'] + print("Some CTX extensions:") - if wordpath and wordpath ~= "" then - print("loading scite-ctx.lua definition file\n") - print("- see scite-ctx.properties for configuring info\n") - print("- ctx.spellcheck.wordpath set to " .. wordpath) - if find(lower(wordpath),"ctxspellpath") then - if os.getenv('ctxspellpath') then - print("- ctxspellpath set to " .. os.getenv('CTXSPELLPATH')) - else - print("- 'ctxspellpath is not set") - end - print("- ctx.spellcheck.wordpath expands to " .. expand(wordpath)) - end - else - print("- 'ctxspellpath is not set") - end + -- local wordpath = props['ctx.spellcheck.wordpath'] + -- + -- if wordpath and wordpath ~= "" then + -- print("loading scite-ctx.lua definition file\n") + -- print("- see scite-ctx.properties for configuring info\n") + -- print("- ctx.spellcheck.wordpath set to " .. wordpath) + -- if find(lower(wordpath),"ctxspellpath") then + -- if os.getenv('ctxspellpath') then + -- print("- ctxspellpath set to " .. os.getenv('CTXSPELLPATH')) + -- else + -- print("- 'ctxspellpath is not set") + -- end + -- print("- ctx.spellcheck.wordpath expands to " .. expand(wordpath)) + -- end + -- else + -- print("- 'ctxspellpath is not set") + -- end local wraplength = props['ctx.wraptext.length'] @@ -274,8 +370,8 @@ do end print("\n- recognized first lines:\n") - print("xml <?xml version='1.0' language='nl'") - print("tex % language=nl") + print("xml <?xml version='1.0' language='..'") + print("tex % language=..") end @@ -283,32 +379,6 @@ end -- written while listening to Talk Talk -local magicstring = rep("<ctx-crlf/>", 2) - -local l2 = char(0xC0) -local l3 = char(0xE0) -local l4 = char(0xF0) - -local function utflen(str) - local n = 0 - local l = 0 - for s in gmatch(str,".") do - if l > 0 then - l = l - 1 - else - n = n + 1 - if s >= l4 then - l = 3 - elseif s >= l3 then - l = 2 - elseif s >= l2 then - l = 1 - end - end - end - return n -end - function wrap_text() -- We always go to the end of a line, so in fact some of @@ -546,201 +616,369 @@ end -- Jagged Little Pill and Tori Amos' Beekeeper after -- reinstalling my good old ATH-7 -local language = props["ctx.spellcheck.language"] -local wordsize = props["ctx.spellcheck.wordsize"] -local wordpath = props["ctx.spellcheck.wordpath"] - -if language == '' then language = 'uk' end -if wordsize == '' then wordsize = 4 else wordsize = tonumber(wordsize) end - -local wordfile = "" -local wordlist = {} -local worddone = 0 - --- we use wordlist as a hash so that we can add entries without the --- need to sort and also use a fast (built in) search - --- function kpsewhich_file(filename,filetype,progname) --- local progflag, typeflag = '', '' --- local tempname = os.tmpname() --- if progname then --- progflag = " --progname=" .. progname .. " " +-- local language = props["ctx.spellcheck.language"] +-- local wordsize = props["ctx.spellcheck.wordsize"] +-- local wordpath = props["ctx.spellcheck.wordpath"] +-- +-- if language == '' then language = 'uk' end +-- if wordsize == '' then wordsize = 4 else wordsize = tonumber(wordsize) end +-- +-- local wordfile = "" +-- local wordlist = { } +-- local worddone = 0 +-- +-- -- we use wordlist as a hash so that we can add entries without the +-- -- need to sort and also use a fast (built in) search +-- +-- function check_text() -- obsolete, replaced by lexer +-- +-- local dlanguage = props["ctx.spellcheck.language"] +-- local dwordsize = props["ctx.spellcheck.wordsize"] +-- local dwordpath = props["ctx.spellcheck.wordpath"] +-- +-- if dlanguage ~= '' then dlanguage = tostring(language) end +-- if dwordsize ~= '' then dwordsize = tonumber(wordsize) end +-- +-- local firstline, skipfirst = editor:GetLine(0), false +-- local filetype, wordskip, wordgood = getfiletype(), '', '' +-- +-- if filetype == 'tex' then +-- wordskip = "\\" +-- elseif filetype == 'xml' then +-- wordskip = "<" +-- wordgood = ">" -- end --- if filetype then --- typeflag = " --format=" .. filetype .. " " +-- +-- if props["ctx.spellcheck.language"] == 'auto' then +-- if filetype == 'tex' then +-- -- % version =1.0 language=uk +-- firstline = gsub(firstline,"^%%%s*",'') +-- firstline = gsub(firstline,"%s*$",'') +-- for key, val in gmatch(firstline,"(%w+)=(%w+)") do +-- if key == "language" then +-- language = val +-- report("auto document language '%s' (%s)",language,"tex") +-- end +-- end +-- skipfirst = true +-- elseif filetype == 'xml' then +-- -- <?xml version='1.0' language='uk' ?> +-- firstline = gsub(firstline,"^%<%?xml%s*", '') +-- firstline = gsub(firstline,"%s*%?%>%s*$", '') +-- for key, val in gmatch(firstline,"(%w+)=[\"\'](.-)[\"\']") do +-- if key == "language" then +-- language = val +-- report("auto document language '%s' (%s)",language."xml") +-- end +-- end +-- skipfirst = true +-- end -- end --- local command = "kpsewhich" .. progflag .. typeflag .. " " .. filename .. " > " .. tempname --- os.execute(command) --- for line in io.lines(tempname) do --- return gsub(line, "\s*$", '') +-- +-- local fname = props["ctx.spellcheck.wordfile." .. language] +-- local fsize = props["ctx.spellcheck.wordsize." .. language] +-- +-- if fsize ~= '' then wordsize = tonumber(fsize) end +-- +-- if fname ~= '' and fname ~= wordfile then +-- wordfile, worddone, wordlist = fname, 0, { } +-- for filename in gmatch(wordfile,"[^%,]+") do +-- if wordpath ~= '' then +-- filename = expand(wordpath) .. '/' .. filename +-- end +-- if io.exists(filename) then +-- report("loading " .. filename) +-- for line in io.lines(filename) do +-- if not find(line,"^[%#-]") then +-- str = gsub(line,"%s*$", '') +-- rawset(wordlist,str,true) +-- worddone = worddone + 1 +-- end +-- end +-- else +-- report("unknown file '%s'",filename) +-- end +-- end +-- report("%i words loaded",worddone) -- end +-- +-- reset_text() +-- +-- if worddone == 0 then +-- report("no (valid) language or wordfile specified") +-- else +-- report("start checking") +-- if wordskip ~= '' then +-- report("ignoring %s ... %s",wordskip,wordgood) +-- end +-- local i, j, lastpos, startpos, endpos, snippet, len, first = 0, 0, -1, 0, 0, '', 0, 0 +-- local ok, skip, ch = false, false, '' +-- if skipfirst then first = #firstline end +-- for k = first, editor.TextLength do +-- ch = editor:textrange(k,k+1) +-- if wordgood ~= '' and ch == wordgood then +-- skip = false +-- elseif ch == wordskip then +-- skip = true +-- end +-- if find(ch,"%w") and not find(ch,"%d") then +-- if not skip then +-- if ok then +-- endpos = k +-- else +-- startpos = k +-- endpos = k +-- ok = true +-- end +-- end +-- elseif ok and not skip then +-- len = endpos - startpos + 1 +-- if len >= wordsize then +-- snippet = editor:textrange(startpos,endpos+1) +-- i = i + 1 +-- if wordlist[snippet] or wordlist[lower(snippet)] then +-- j = j + 1 +-- else +-- editor:StartStyling(startpos,INDICS_MASK) +-- editor:SetStyling(len,INDIC2_MASK) -- INDIC0_MASK+2 +-- end +-- end +-- ok = false +-- elseif wordgood == '' then +-- skip = (ch == wordskip) +-- end +-- end +-- report("%i words checked, %i errors found",i,i-j) +-- end +-- +-- end +-- +-- function reset_text() +-- editor:StartStyling(0,INDICS_MASK) +-- editor:SetStyling(editor.TextLength,INDIC_PLAIN) -- end -function check_text() -- obsolete, replaced by lexer - - local dlanguage = props["ctx.spellcheck.language"] - local dwordsize = props["ctx.spellcheck.wordsize"] - local dwordpath = props["ctx.spellcheck.wordpath"] +function add_text() - if dlanguage ~= '' then dlanguage = tostring(language) end - if dwordsize ~= '' then dwordsize = tonumber(wordsize) end + local startposition = editor.SelectionStart + local endposition = editor.SelectionEnd - local firstline, skipfirst = editor:GetLine(0), false - local filetype, wordskip, wordgood = getfiletype(), '', '' + if startposition == endposition then return end - if filetype == 'tex' then - wordskip = "\\" - elseif filetype == 'xml' then - wordskip = "<" - wordgood = ">" - end + local selection = gsub(editor:GetSelText(), "%s*$", '') - if props["ctx.spellcheck.language"] == 'auto' then - if filetype == 'tex' then - -- % version =1.0 language=uk - firstline = gsub(firstline,"^%%%s*",'') - firstline = gsub(firstline,"%s*$",'') - for key, val in gmatch(firstline,"(%w+)=(%w+)") do - if key == "language" then - language = val - traceln("auto document language " .. "'" .. language .. "' (tex)") - end - end - skipfirst = true - elseif filetype == 'xml' then - -- <?xml version='1.0' language='uk' ?> - firstline = gsub(firstline,"^%<%?xml%s*", '') - firstline = gsub(firstline,"%s*%?%>%s*$", '') - for key, val in gmatch(firstline,"(%w+)=[\"\'](.-)[\"\']") do - if key == "language" then - language = val - traceln("auto document language " .. "'" .. language .. "' (xml)") - end - end - skipfirst = true + local n, sum = 0, 0 + for s in gmatch(selection,"[%d%.%,]+") do + s = gsub(s,",",".") + local m = tonumber(s) + if m then + n = n + 1 + sum = sum + m + report("%4i : %s",n,m) end end + if n > 0 then + report() + report("sum : %s",sum) + else + report("no numbers selected") + end - local fname = props["ctx.spellcheck.wordfile." .. language] - local fsize = props["ctx.spellcheck.wordsize." .. language] +end - if fsize ~= '' then wordsize = tonumber(fsize) end +-- test + +local bidi = nil +local dirty = { } + +local mapping = { + l = 0, -- "Left-to-Right", + lre = 7, -- "Left-to-Right Embedding", + lro = 7, -- "Left-to-Right Override", + r = 2, -- "Right-to-Left", + al = 3, -- "Right-to-Left Arabic", + rle = 7, -- "Right-to-Left Embedding", + rlo = 7, -- "Right-to-Left Override", + pdf = 7, -- "Pop Directional Format", + en = 4, -- "European Number", + es = 4, -- "European Number Separator", + et = 4, -- "European Number Terminator", + an = 5, -- "Arabic Number", + cs = 6, -- "Common Number Separator", + nsm = 6, -- "Non-Spacing Mark", + bn = 7, -- "Boundary Neutral", + b = 0, -- "Paragraph Separator", + s = 7, -- "Segment Separator", + ws = 0, -- "Whitespace", + on = 7, -- "Other Neutrals", +} - if fname ~= '' and fname ~= wordfile then - wordfile, worddone, wordlist = fname, 0, {} - for filename in gmatch(wordfile,"[^%,]+") do - if wordpath ~= '' then - filename = expand(wordpath) .. '/' .. filename - end - if io.exists(filename) then - traceln("loading " .. filename) - for line in io.lines(filename) do - if not find(line,"^[%#-]") then - str = gsub(line,"%s*$", '') - rawset(wordlist,str,true) - worddone = worddone + 1 - end - end - else - traceln("unknown file '" .. filename .."'") - end - end - traceln(worddone .. " words loaded") - end +-- todo: take from scite-context-theme.lua + +local colors = { -- b g r + [0] = 0x000000, -- black + [1] = 0x00007F, -- red + [2] = 0x007F00, -- green + [3] = 0x7F0000, -- blue + [4] = 0x7F7F00, -- cyan + [5] = 0x7F007F, -- magenta + [6] = 0x007F7F, -- yellow + [7] = 0x007FB0, -- orange + [8] = 0x4F4F4F, -- dark +} - reset_text() +-- in principle, when we could inject some funny symbol that is nto part of the +-- stream and/or use a different extra styling for each snippet then selection +-- would work and rendering would look better too ... one problem is that a font +-- rendering can collapse characters due to font features - if worddone == 0 then - traceln("no (valid) language or wordfile specified") - else - traceln("start checking") - if wordskip ~= '' then - traceln("ignoring " .. wordskip .. "..." .. wordgood) - end - local i, j, lastpos, startpos, endpos, snippet, len, first = 0, 0, -1, 0, 0, '', 0, 0 - local ok, skip, ch = false, false, '' - if skipfirst then first = #firstline end - for k = first, editor.TextLength do - ch = editor:textrange(k,k+1) - if wordgood ~= '' and ch == wordgood then - skip = false - elseif ch == wordskip then - skip = true - end - if find(ch,"%w") and not find(ch,"%d") then - if not skip then - if ok then - endpos = k - else - startpos = k - endpos = k - ok = true - end - end - elseif ok and not skip then - len = endpos - startpos + 1 - if len >= wordsize then - snippet = editor:textrange(startpos,endpos+1) - i = i + 1 - if wordlist[snippet] or wordlist[lower(snippet)] then - j = j + 1 - else - editor:StartStyling(startpos,INDICS_MASK) - editor:SetStyling(len,INDIC2_MASK) -- INDIC0_MASK+2 - end - end - ok = false - elseif wordgood == '' then - skip = (ch == wordskip) - end - end - traceln(i .. " words checked, " .. (i-j) .. " errors") +-- function OnChar(c) +-- +-- cat = editor.CharAt +-- +-- editor.CodePage = SC_CP_UTF8 +-- editor.Lexer = SCLEX_CONTAINER +-- +-- if not bidi then +-- bidi = require("context.scite-ctx-bidi") +-- end +-- +-- local line = editor:LineFromPosition(editor.CurrentPos) +-- local str = editor:GetLine(line) +-- local len = #str +-- local bol = editor:PositionFromLine(line) +-- +-- local t = { } +-- local a = { } +-- local n = 0 +-- local i = 0 +-- +-- local v +-- while i < len do +-- n = n + 1 +-- v, s = toutfcode(i) +-- t[n] = v +-- a[n] = s +-- i = i + s +-- end +-- +-- local t = bidi.process(t) +-- +-- local defaultcolor = mapping.l +-- local mirrorcolor = 1 +-- +-- local lastcolor = -1 +-- local runlength = 0 +-- +-- editor:StartStyling(bol,INDICS_MASK) +-- for i=1,n do +-- local ti = t[i] +-- local direction = ti.direction +-- local mirror = t[i].mirror +-- local color = (mirror and mirrorcolor) or (direction and mapping[direction]) or defaultcolor +-- if color == lastcolor then +-- runlength = runlength + a[i] +-- else +-- if runlength > 0 then +-- editor:SetStyling(runlength,INDIC_STRIKE) +-- end +-- lastcolor = color +-- runlength = a[i] +-- end +-- end +-- if runlength > 0 then +-- editor:SetStyling(runlength,INDIC_STRIKE) +-- end +-- editor:SetStyling(2,31) +-- +-- dirty[props.FileNameExt] = true +-- +-- end + +function show_bidi() + + cat = editor.CharAt + + editor.CodePage = SC_CP_UTF8 + editor.Lexer = SCLEX_CONTAINER + + for i=1,#colors do -- 0,#colors + editor.StyleFore[i] = colors[i] end -end + if not bidi then + bidi = require("context.scite-ctx-bidi") + end -function reset_text() - editor:StartStyling(0,INDICS_MASK) - editor:SetStyling(editor.TextLength,INDIC_PLAIN) -end + local len = editor.TextLength + local str = editor:textrange(0,len-1) -function add_text() + local t = { } + local a = { } + local n = 0 + local i = 0 + + local v + while i < len do + n = n + 1 + v, s = toutfcode(i) + t[n] = v + a[n] = s + i = i + s + end - local startposition = editor.SelectionStart - local endposition = editor.SelectionEnd + local t = bidi.process(t) - if startposition == endposition then return end + editor:StartStyling(0,31) - local selection = gsub(editor:GetSelText(), "%s*$", '') + local defaultcolor = mapping.l + local mirrorcolor = 1 - local n, sum = 0, 0 - for s in gmatch(selection,"[%d%.%,]+") do - s = gsub(s,",",".") - local m = tonumber(s) - if m then - n = n + 1 - sum = sum + m - traceln(format("%4i : %s",n,m)) + if false then + for i=1,n do + local direction = t[i].direction + local color = direction and (mapping[direction] or 0) or defaultcolor + editor:SetStyling(a[i],color) end - end - if n > 0 then - traceln("") - traceln(format("sum : %s",sum)) else - traceln("no numbers selected") + local lastcolor = -1 + local runlength = 0 + for i=1,n do + local ti = t[i] + local direction = ti.direction + local mirror = t[i].mirror + local color = (mirror and mirrorcolor) or (direction and mapping[direction]) or defaultcolor + if color == lastcolor then + runlength = runlength + a[i] + else + if runlength > 0 then + editor:SetStyling(runlength,lastcolor) + end + lastcolor = color + runlength = a[i] + end + end + if runlength > 0 then + editor:SetStyling(runlength,lastcolor) + end end + editor:SetStyling(2,31) +-- editor:StartStyling(0,31) + + dirty[props.FileNameExt] = true + end -- menu -local menuactions = {} -local menufunctions = {} +local menuactions = { } +local menufunctions = { } function UserListShow(menutrigger, menulist) - local menuentries = {} + local menuentries = { } local list = grab(menulist,"[^%|]+") - menuactions = {} + menuactions = { } for i=1, #list do if list[i] ~= '' then for key, val in gmatch(list[i],"%s*(.+)=(.+)%s*") do @@ -751,7 +989,7 @@ function UserListShow(menutrigger, menulist) end local menustring = concat(menuentries,'|') if menustring == "" then - traceln("There are no templates defined for this file type.") + report("there are no templates defined for this file type") else editor.AutoCSeparator = byte('|') editor:UserListShow(menutrigger,menustring) @@ -793,9 +1031,9 @@ local ctx_template_paths = { "./ctx-templates", "../ctx-templates", "../../ctx-t local ctx_auto_templates = false local ctx_template_list = "" -local ctx_path_list = {} -local ctx_path_done = {} -local ctx_path_name = {} +local ctx_path_list = { } +local ctx_path_done = { } +local ctx_path_name = { } function ctx_list_loaded(path) return ctx_path_list[path] and #ctx_path_list[path] > 0 @@ -861,7 +1099,6 @@ function insert_template(templatelist) end end - -- ctx.template.[whatever].[filetype] -- ctx.template.[whatever].data.[filetype] -- ctx.template.[whatever].file.[filetype] @@ -1398,8 +1635,8 @@ local usedlists = { } local function make_strip() - local used = usedlists[enabled] - local lists = used.lists + local used = usedlists[enabled] + local lists = used.lists local alphabet = lists[used.current] local selector = "(hide)(" .. concat(used.selector,")(") .. ")" local alphabet = "(" .. used.current .. ":)(" .. concat(alphabet,")(") .. ")" @@ -1446,11 +1683,22 @@ end -- parsing function OnOpen(filename) - -- print("opening: " .. filename .. " (size: " .. editor.TextLength .. ")") +-- report("opening '%s' of %i bytes",filename,editor.TextLength) editor:Colourise(0,editor.TextLength) end + +function OnSwitchFile(filename) + if dirty[props.FileNameExt] then +-- report("switching '%s' of %i bytes",filename,editor.TextLength) + editor:Colourise(0,editor.TextLength) + dirty[props.FileNameExt] = false + end +end + -- Last time I checked the source the output pane errorlist lexer was still -- hardcoded and could not be turned off ... alas. -- output.Lexer = 0 + +-- SCI_SETBIDIRECTIONAL = SC_BIDIRECTIONAL_R2L diff --git a/context/data/scite/context/scite-ctx.properties b/context/data/scite/context/scite-ctx.properties index 4430060f7..bcd939594 100644 --- a/context/data/scite/context/scite-ctx.properties +++ b/context/data/scite/context/scite-ctx.properties @@ -28,8 +28,7 @@ ctx.menulist.default=\ unwrap=unwrap_text|\ sort=sort_text|\ add=add_text|\ - check=check_text|\ - reset=reset_text|\ + bidi=show_bidi|\ strip=toggle_strip ctx.menulist.context=\ @@ -40,8 +39,7 @@ ctx.menulist.context=\ quote=quote_text|\ compound=compound_text|\ add=add_text|\ - check=check_text|\ - reset=reset_text|\ + bidi=show_bidi|\ strip=toggle_strip ctx.menulist.example=\ @@ -53,8 +51,7 @@ ctx.menulist.example=\ quote=quote_text|\ compound=compound_text|\ add=add_text|\ - check=check_text|\ - reset=reset_text|\ + bidi=show_bidi|\ strip=toggle_strip ctx.menulist.cweb=\ @@ -85,7 +82,7 @@ ctx.spellcheck.wordsize.nl=4 ctx.helpinfo=\ Shift + F11 pop up menu with ctx options|\ |\ - Ctrl + B check spelling|\ + Ctrl + B show bidi|\ Ctrl + M wrap text (auto indent)|\ Ctrl + R reset spelling results|\ Ctrl + I insert template|\ @@ -125,7 +122,7 @@ command.groupundo.21.$(file.patterns.cpp)=yes command.save.before.21.$(file.patterns.cpp)=2 command.shortcut.21.$(file.patterns.cpp)=Shift+F11 -command.name.21.$(file.patterns.lua)=C Action List +command.name.21.$(file.patterns.lua)=Lua Action List command.subsystem.21.$(file.patterns.lua)=3 command.21.$(file.patterns.lua)=show_menu $(ctx.menulist.lua) command.groupundo.21.$(file.patterns.lua)=yes @@ -139,9 +136,9 @@ command.shortcut.21.$(file.patterns.lua)=Shift+F11 #~ command.save.before.21.*=2 #~ command.shortcut.21.*=Shift+F11 -command.name.22.*=CTX Check Text +command.name.22.*=CTX Show Bidi command.subsystem.22.*=3 -command.22.*=check_text +command.22.*=show_bidi command.groupundo.22.*=yes command.save.before.22.*=2 command.shortcut.22.*=Ctrl+B @@ -153,13 +150,6 @@ command.groupundo.23.*=yes command.save.before.23.*=2 command.shortcut.23.*=Ctrl+M -command.name.24.*=CTX Reset Text -command.subsystem.24.*=3 -command.24.*=reset_text -command.groupundo.24.*=yes -command.save.before.24.*=2 -command.shortcut.24.*=Ctrl+R - command.name.25.*=CTX Template command.subsystem.25.*=3 command.save.before.25.*=2 diff --git a/context/data/textadept/context/data/scite-context-data-context.lua b/context/data/textadept/context/data/scite-context-data-context.lua index b9a90c262..3ecca045b 100644 --- a/context/data/textadept/context/data/scite-context-data-context.lua +++ b/context/data/textadept/context/data/scite-context-data-context.lua @@ -1,4 +1,4 @@ return { - ["constants"]={ "zerocount", "minusone", "minustwo", "plusone", "plustwo", "plusthree", "plusfour", "plusfive", "plussix", "plusseven", "pluseight", "plusnine", "plusten", "plussixteen", "plushundred", "plustwohundred", "plusthousand", "plustenthousand", "plustwentythousand", "medcard", "maxcard", "maxcardminusone", "zeropoint", "onepoint", "halfapoint", "onebasepoint", "maxcount", "maxdimen", "scaledpoint", "thousandpoint", "points", "halfpoint", "zeroskip", "zeromuskip", "onemuskip", "pluscxxvii", "pluscxxviii", "pluscclv", "pluscclvi", "normalpagebox", "endoflinetoken", "outputnewlinechar", "emptytoks", "empty", "undefined", "voidbox", "emptybox", "emptyvbox", "emptyhbox", "bigskipamount", "medskipamount", "smallskipamount", "fmtname", "fmtversion", "texengine", "texenginename", "texengineversion", "luatexengine", "pdftexengine", "xetexengine", "unknownengine", "activecatcode", "bgroup", "egroup", "endline", "conditionaltrue", "conditionalfalse", "attributeunsetvalue", "uprotationangle", "rightrotationangle", "downrotationangle", "leftrotationangle", "inicatcodes", "ctxcatcodes", "texcatcodes", "notcatcodes", "txtcatcodes", "vrbcatcodes", "prtcatcodes", "nilcatcodes", "luacatcodes", "tpacatcodes", "tpbcatcodes", "xmlcatcodes", "ctdcatcodes", "escapecatcode", "begingroupcatcode", "endgroupcatcode", "mathshiftcatcode", "alignmentcatcode", "endoflinecatcode", "parametercatcode", "superscriptcatcode", "subscriptcatcode", "ignorecatcode", "spacecatcode", "lettercatcode", "othercatcode", "activecatcode", "commentcatcode", "invalidcatcode", "tabasciicode", "newlineasciicode", "formfeedasciicode", "endoflineasciicode", "endoffileasciicode", "spaceasciicode", "hashasciicode", "dollarasciicode", "commentasciicode", "ampersandasciicode", "colonasciicode", "backslashasciicode", "circumflexasciicode", "underscoreasciicode", "leftbraceasciicode", "barasciicode", "rightbraceasciicode", "tildeasciicode", "delasciicode", "lessthanasciicode", "morethanasciicode", "doublecommentsignal", "atsignasciicode", "exclamationmarkasciicode", "questionmarkasciicode", "doublequoteasciicode", "singlequoteasciicode", "forwardslashasciicode", "primeasciicode", "hyphenasciicode", "activemathcharcode", "activetabtoken", "activeformfeedtoken", "activeendoflinetoken", "batchmodecode", "nonstopmodecode", "scrollmodecode", "errorstopmodecode", "bottomlevelgroupcode", "simplegroupcode", "hboxgroupcode", "adjustedhboxgroupcode", "vboxgroupcode", "vtopgroupcode", "aligngroupcode", "noaligngroupcode", "outputgroupcode", "mathgroupcode", "discretionarygroupcode", "insertgroupcode", "vcentergroupcode", "mathchoicegroupcode", "semisimplegroupcode", "mathshiftgroupcode", "mathleftgroupcode", "vadjustgroupcode", "charnodecode", "hlistnodecode", "vlistnodecode", "rulenodecode", "insertnodecode", "marknodecode", "adjustnodecode", "ligaturenodecode", "discretionarynodecode", "whatsitnodecode", "mathnodecode", "gluenodecode", "kernnodecode", "penaltynodecode", "unsetnodecode", "mathsnodecode", "charifcode", "catifcode", "numifcode", "dimifcode", "oddifcode", "vmodeifcode", "hmodeifcode", "mmodeifcode", "innerifcode", "voidifcode", "hboxifcode", "vboxifcode", "xifcode", "eofifcode", "trueifcode", "falseifcode", "caseifcode", "definedifcode", "csnameifcode", "fontcharifcode", "fontslantperpoint", "fontinterwordspace", "fontinterwordstretch", "fontinterwordshrink", "fontexheight", "fontemwidth", "fontextraspace", "slantperpoint", "interwordspace", "interwordstretch", "interwordshrink", "exheight", "emwidth", "extraspace", "mathsupdisplay", "mathsupnormal", "mathsupcramped", "mathsubnormal", "mathsubcombined", "mathaxisheight", "muquad", "startmode", "stopmode", "startnotmode", "stopnotmode", "startmodeset", "stopmodeset", "doifmode", "doifelsemode", "doifmodeelse", "doifnotmode", "startmodeset", "stopmodeset", "startallmodes", "stopallmodes", "startnotallmodes", "stopnotallmodes", "doifallmodes", "doifelseallmodes", "doifallmodeselse", "doifnotallmodes", "startenvironment", "stopenvironment", "environment", "startcomponent", "stopcomponent", "component", "startproduct", "stopproduct", "product", "startproject", "stopproject", "project", "starttext", "stoptext", "startnotext", "stopnotext", "startdocument", "stopdocument", "documentvariable", "unexpandeddocumentvariable", "setupdocument", "presetdocument", "startmodule", "stopmodule", "usemodule", "usetexmodule", "useluamodule", "setupmodule", "currentmoduleparameter", "moduleparameter", "everystarttext", "everystoptext", "startTEXpage", "stopTEXpage", "enablemode", "disablemode", "preventmode", "definemode", "globalenablemode", "globaldisablemode", "globalpreventmode", "pushmode", "popmode", "typescriptone", "typescripttwo", "typescriptthree", "mathsizesuffix", "mathordcode", "mathopcode", "mathbincode", "mathrelcode", "mathopencode", "mathclosecode", "mathpunctcode", "mathalphacode", "mathinnercode", "mathnothingcode", "mathlimopcode", "mathnolopcode", "mathboxcode", "mathchoicecode", "mathaccentcode", "mathradicalcode", "constantnumber", "constantnumberargument", "constantdimen", "constantdimenargument", "constantemptyargument", "continueifinputfile", "luastringsep", "!!bs", "!!es", "lefttorightmark", "righttoleftmark", "breakablethinspace", "nobreakspace", "nonbreakablespace", "narrownobreakspace", "zerowidthnobreakspace", "ideographicspace", "ideographichalffillspace", "twoperemspace", "threeperemspace", "fourperemspace", "fiveperemspace", "sixperemspace", "figurespace", "punctuationspace", "hairspace", "zerowidthspace", "zerowidthnonjoiner", "zerowidthjoiner", "zwnj", "zwj", "optionalspace", "asciispacechar", "Ux", "eUx", "Umathaccents", "parfillleftskip", "parfillrightskip" }, - ["helpers"]={ "startsetups", "stopsetups", "startxmlsetups", "stopxmlsetups", "startluasetups", "stopluasetups", "starttexsetups", "stoptexsetups", "startrawsetups", "stoprawsetups", "startlocalsetups", "stoplocalsetups", "starttexdefinition", "stoptexdefinition", "starttexcode", "stoptexcode", "startcontextcode", "stopcontextcode", "startcontextdefinitioncode", "stopcontextdefinitioncode", "texdefinition", "doifelsesetups", "doifsetupselse", "doifsetups", "doifnotsetups", "setup", "setups", "texsetup", "xmlsetup", "luasetup", "directsetup", "fastsetup", "doifelsecommandhandler", "doifcommandhandlerelse", "doifnotcommandhandler", "doifcommandhandler", "newmode", "setmode", "resetmode", "newsystemmode", "setsystemmode", "resetsystemmode", "pushsystemmode", "popsystemmode", "booleanmodevalue", "newcount", "newdimen", "newskip", "newmuskip", "newbox", "newtoks", "newread", "newwrite", "newmarks", "newinsert", "newattribute", "newif", "newlanguage", "newfamily", "newfam", "newhelp", "then", "begcsname", "strippedcsname", "checkedstrippedcsname", "firstargumentfalse", "firstargumenttrue", "secondargumentfalse", "secondargumenttrue", "thirdargumentfalse", "thirdargumenttrue", "fourthargumentfalse", "fourthargumenttrue", "fifthargumentfalse", "fifthsargumenttrue", "sixthargumentfalse", "sixtsargumenttrue", "doglobal", "dodoglobal", "redoglobal", "resetglobal", "donothing", "dontcomplain", "forgetall", "donetrue", "donefalse", "foundtrue", "foundfalse", "inlineordisplaymath", "indisplaymath", "forcedisplaymath", "startforceddisplaymath", "stopforceddisplaymath", "reqno", "mathortext", "htdp", "unvoidbox", "hfilll", "vfilll", "mathbox", "mathlimop", "mathnolop", "mathnothing", "mathalpha", "currentcatcodetable", "defaultcatcodetable", "catcodetablename", "newcatcodetable", "startcatcodetable", "stopcatcodetable", "startextendcatcodetable", "stopextendcatcodetable", "pushcatcodetable", "popcatcodetable", "restorecatcodes", "setcatcodetable", "letcatcodecommand", "defcatcodecommand", "uedcatcodecommand", "hglue", "vglue", "hfillneg", "vfillneg", "hfilllneg", "vfilllneg", "ruledhss", "ruledhfil", "ruledhfill", "ruledhfilneg", "ruledhfillneg", "normalhfillneg", "ruledvss", "ruledvfil", "ruledvfill", "ruledvfilneg", "ruledvfillneg", "normalvfillneg", "ruledhbox", "ruledvbox", "ruledvtop", "ruledvcenter", "ruledmbox", "ruledhpack", "ruledvpack", "ruledtpack", "ruledhskip", "ruledvskip", "ruledkern", "ruledmskip", "ruledmkern", "ruledhglue", "ruledvglue", "normalhglue", "normalvglue", "ruledpenalty", "filledhboxb", "filledhboxr", "filledhboxg", "filledhboxc", "filledhboxm", "filledhboxy", "filledhboxk", "scratchcounter", "globalscratchcounter", "privatescratchcounter", "scratchdimen", "globalscratchdimen", "privatescratchdimen", "scratchskip", "globalscratchskip", "privatescratchskip", "scratchmuskip", "globalscratchmuskip", "privatescratchmuskip", "scratchtoks", "globalscratchtoks", "privatescratchtoks", "scratchbox", "globalscratchbox", "privatescratchbox", "normalbaselineskip", "normallineskip", "normallineskiplimit", "availablehsize", "localhsize", "setlocalhsize", "distributedhsize", "hsizefraction", "nextbox", "dowithnextbox", "dowithnextboxcs", "dowithnextboxcontent", "dowithnextboxcontentcs", "flushnextbox", "scratchwidth", "scratchheight", "scratchdepth", "scratchoffset", "scratchdistance", "scratchhsize", "scratchvsize", "scratchxoffset", "scratchyoffset", "scratchhoffset", "scratchvoffset", "scratchxposition", "scratchyposition", "scratchtopoffset", "scratchbottomoffset", "scratchleftoffset", "scratchrightoffset", "scratchcounterone", "scratchcountertwo", "scratchcounterthree", "scratchcounterfour", "scratchcounterfive", "scratchcountersix", "scratchdimenone", "scratchdimentwo", "scratchdimenthree", "scratchdimenfour", "scratchdimenfive", "scratchdimensix", "scratchskipone", "scratchskiptwo", "scratchskipthree", "scratchskipfour", "scratchskipfive", "scratchskipsix", "scratchmuskipone", "scratchmuskiptwo", "scratchmuskipthree", "scratchmuskipfour", "scratchmuskipfive", "scratchmuskipsix", "scratchtoksone", "scratchtokstwo", "scratchtoksthree", "scratchtoksfour", "scratchtoksfive", "scratchtokssix", "scratchboxone", "scratchboxtwo", "scratchboxthree", "scratchboxfour", "scratchboxfive", "scratchboxsix", "scratchnx", "scratchny", "scratchmx", "scratchmy", "scratchunicode", "scratchmin", "scratchmax", "scratchleftskip", "scratchrightskip", "scratchtopskip", "scratchbottomskip", "doif", "doifnot", "doifelse", "doifinset", "doifnotinset", "doifelseinset", "doifinsetelse", "doifelsenextchar", "doifnextcharelse", "doifelsenextoptional", "doifnextoptionalelse", "doifelsenextoptionalcs", "doifnextoptionalcselse", "doifelsefastoptionalcheck", "doiffastoptionalcheckelse", "doifelsenextbgroup", "doifnextbgroupelse", "doifelsenextbgroupcs", "doifnextbgroupcselse", "doifelsenextparenthesis", "doifnextparenthesiselse", "doifelseundefined", "doifundefinedelse", "doifelsedefined", "doifdefinedelse", "doifundefined", "doifdefined", "doifelsevalue", "doifvalue", "doifnotvalue", "doifnothing", "doifsomething", "doifelsenothing", "doifnothingelse", "doifelsesomething", "doifsomethingelse", "doifvaluenothing", "doifvaluesomething", "doifelsevaluenothing", "doifvaluenothingelse", "doifelsedimension", "doifdimensionelse", "doifelsenumber", "doifnumberelse", "doifnumber", "doifnotnumber", "doifelsecommon", "doifcommonelse", "doifcommon", "doifnotcommon", "doifinstring", "doifnotinstring", "doifelseinstring", "doifinstringelse", "doifelseassignment", "doifassignmentelse", "docheckassignment", "tracingall", "tracingnone", "loggingall", "removetoks", "appendtoks", "prependtoks", "appendtotoks", "prependtotoks", "to", "endgraf", "endpar", "everyendpar", "reseteverypar", "finishpar", "empty", "null", "space", "quad", "enspace", "emspace", "charspace", "nbsp", "crlf", "obeyspaces", "obeylines", "obeyedspace", "obeyedline", "obeyedtab", "obeyedpage", "normalspace", "executeifdefined", "singleexpandafter", "doubleexpandafter", "tripleexpandafter", "dontleavehmode", "removelastspace", "removeunwantedspaces", "keepunwantedspaces", "removepunctuation", "wait", "writestatus", "define", "defineexpandable", "redefine", "setmeasure", "setemeasure", "setgmeasure", "setxmeasure", "definemeasure", "freezemeasure", "measure", "measured", "installcorenamespace", "getvalue", "getuvalue", "setvalue", "setevalue", "setgvalue", "setxvalue", "letvalue", "letgvalue", "resetvalue", "undefinevalue", "ignorevalue", "setuvalue", "setuevalue", "setugvalue", "setuxvalue", "globallet", "glet", "udef", "ugdef", "uedef", "uxdef", "checked", "unique", "getparameters", "geteparameters", "getgparameters", "getxparameters", "forgetparameters", "copyparameters", "getdummyparameters", "dummyparameter", "directdummyparameter", "setdummyparameter", "letdummyparameter", "usedummystyleandcolor", "usedummystyleparameter", "usedummycolorparameter", "processcommalist", "processcommacommand", "quitcommalist", "quitprevcommalist", "processaction", "processallactions", "processfirstactioninset", "processallactionsinset", "unexpanded", "expanded", "startexpanded", "stopexpanded", "protected", "protect", "unprotect", "firstofoneargument", "firstoftwoarguments", "secondoftwoarguments", "firstofthreearguments", "secondofthreearguments", "thirdofthreearguments", "firstoffourarguments", "secondoffourarguments", "thirdoffourarguments", "fourthoffourarguments", "firstoffivearguments", "secondoffivearguments", "thirdoffivearguments", "fourthoffivearguments", "fifthoffivearguments", "firstofsixarguments", "secondofsixarguments", "thirdofsixarguments", "fourthofsixarguments", "fifthofsixarguments", "sixthofsixarguments", "firstofoneunexpanded", "firstoftwounexpanded", "secondoftwounexpanded", "firstofthreeunexpanded", "secondofthreeunexpanded", "thirdofthreeunexpanded", "gobbleoneargument", "gobbletwoarguments", "gobblethreearguments", "gobblefourarguments", "gobblefivearguments", "gobblesixarguments", "gobblesevenarguments", "gobbleeightarguments", "gobbleninearguments", "gobbletenarguments", "gobbleoneoptional", "gobbletwooptionals", "gobblethreeoptionals", "gobblefouroptionals", "gobblefiveoptionals", "dorecurse", "doloop", "exitloop", "dostepwiserecurse", "recurselevel", "recursedepth", "dofastloopcs", "dowith", "newconstant", "setnewconstant", "setconstant", "setconstantvalue", "newconditional", "settrue", "setfalse", "settruevalue", "setfalsevalue", "newmacro", "setnewmacro", "newfraction", "newsignal", "dosingleempty", "dodoubleempty", "dotripleempty", "doquadrupleempty", "doquintupleempty", "dosixtupleempty", "doseventupleempty", "dosingleargument", "dodoubleargument", "dotripleargument", "doquadrupleargument", "doquintupleargument", "dosixtupleargument", "doseventupleargument", "dosinglegroupempty", "dodoublegroupempty", "dotriplegroupempty", "doquadruplegroupempty", "doquintuplegroupempty", "permitspacesbetweengroups", "dontpermitspacesbetweengroups", "nopdfcompression", "maximumpdfcompression", "normalpdfcompression", "modulonumber", "dividenumber", "getfirstcharacter", "doifelsefirstchar", "doiffirstcharelse", "startnointerference", "stopnointerference", "twodigits", "threedigits", "leftorright", "offinterlineskip", "oninterlineskip", "nointerlineskip", "strut", "halfstrut", "quarterstrut", "depthstrut", "setstrut", "strutbox", "strutht", "strutdp", "strutwd", "struthtdp", "begstrut", "endstrut", "lineheight", "leftboundary", "rightboundary", "signalcharacter", "ordordspacing", "ordopspacing", "ordbinspacing", "ordrelspacing", "ordopenspacing", "ordclosespacing", "ordpunctspacing", "ordinnerspacing", "opordspacing", "opopspacing", "opbinspacing", "oprelspacing", "opopenspacing", "opclosespacing", "oppunctspacing", "opinnerspacing", "binordspacing", "binopspacing", "binbinspacing", "binrelspacing", "binopenspacing", "binclosespacing", "binpunctspacing", "bininnerspacing", "relordspacing", "relopspacing", "relbinspacing", "relrelspacing", "relopenspacing", "relclosespacing", "relpunctspacing", "relinnerspacing", "openordspacing", "openopspacing", "openbinspacing", "openrelspacing", "openopenspacing", "openclosespacing", "openpunctspacing", "openinnerspacing", "closeordspacing", "closeopspacing", "closebinspacing", "closerelspacing", "closeopenspacing", "closeclosespacing", "closepunctspacing", "closeinnerspacing", "punctordspacing", "punctopspacing", "punctbinspacing", "punctrelspacing", "punctopenspacing", "punctclosespacing", "punctpunctspacing", "punctinnerspacing", "innerordspacing", "inneropspacing", "innerbinspacing", "innerrelspacing", "inneropenspacing", "innerclosespacing", "innerpunctspacing", "innerinnerspacing", "normalreqno", "startimath", "stopimath", "normalstartimath", "normalstopimath", "startdmath", "stopdmath", "normalstartdmath", "normalstopdmath", "normalsuperscript", "normalsubscript", "uncramped", "cramped", "triggermathstyle", "mathstylefont", "mathsmallstylefont", "mathstyleface", "mathsmallstyleface", "mathstylecommand", "mathpalette", "mathstylehbox", "mathstylevbox", "mathstylevcenter", "mathstylevcenteredhbox", "mathstylevcenteredvbox", "mathtext", "setmathsmalltextbox", "setmathtextbox", "pushmathstyle", "popmathstyle", "triggerdisplaystyle", "triggertextstyle", "triggerscriptstyle", "triggerscriptscriptstyle", "triggeruncrampedstyle", "triggercrampedstyle", "triggersmallstyle", "triggeruncrampedsmallstyle", "triggercrampedsmallstyle", "triggerbigstyle", "triggeruncrampedbigstyle", "triggercrampedbigstyle", "luaexpr", "expelsedoif", "expdoif", "expdoifnot", "expdoifelsecommon", "expdoifcommonelse", "expdoifelseinset", "expdoifinsetelse", "ctxdirectlua", "ctxlatelua", "ctxsprint", "ctxwrite", "ctxcommand", "ctxdirectcommand", "ctxlatecommand", "ctxreport", "ctxlua", "luacode", "lateluacode", "directluacode", "registerctxluafile", "ctxloadluafile", "luaversion", "luamajorversion", "luaminorversion", "ctxluacode", "luaconditional", "luaexpanded", "startluaparameterset", "stopluaparameterset", "luaparameterset", "definenamedlua", "obeylualines", "obeyluatokens", "startluacode", "stopluacode", "startlua", "stoplua", "startctxfunction", "stopctxfunction", "ctxfunction", "startctxfunctiondefinition", "stopctxfunctiondefinition", "installctxfunction", "cldprocessfile", "cldloadfile", "cldcontext", "cldcommand", "carryoverpar", "lastlinewidth", "assumelongusagecs", "Umathbotaccent", "righttolefthbox", "lefttorighthbox", "righttoleftvbox", "lefttorightvbox", "righttoleftvtop", "lefttorightvtop", "rtlhbox", "ltrhbox", "rtlvbox", "ltrvbox", "rtlvtop", "ltrvtop", "autodirhbox", "autodirvbox", "autodirvtop", "leftorrighthbox", "leftorrightvbox", "leftorrightvtop", "lefttoright", "righttoleft", "synchronizelayoutdirection", "synchronizedisplaydirection", "synchronizeinlinedirection", "lesshyphens", "morehyphens", "nohyphens", "dohyphens", "Ucheckedstartdisplaymath", "Ucheckedstopdisplaymath", "break", "nobreak", "allowbreak", "goodbreak", "nospace", "nospacing", "dospacing", "naturalhbox", "naturalvbox", "naturalhpack", "naturalvpack", "frule", "compoundhyphenpenalty" }, + ["constants"]={ "zerocount", "minusone", "minustwo", "plusone", "plustwo", "plusthree", "plusfour", "plusfive", "plussix", "plusseven", "pluseight", "plusnine", "plusten", "plussixteen", "plushundred", "plustwohundred", "plusthousand", "plustenthousand", "plustwentythousand", "medcard", "maxcard", "maxcardminusone", "zeropoint", "onepoint", "halfapoint", "onebasepoint", "maxcount", "maxdimen", "scaledpoint", "thousandpoint", "points", "halfpoint", "zeroskip", "zeromuskip", "onemuskip", "pluscxxvii", "pluscxxviii", "pluscclv", "pluscclvi", "normalpagebox", "endoflinetoken", "outputnewlinechar", "emptytoks", "empty", "undefined", "voidbox", "emptybox", "emptyvbox", "emptyhbox", "bigskipamount", "medskipamount", "smallskipamount", "fmtname", "fmtversion", "texengine", "texenginename", "texengineversion", "texenginefunctionality", "luatexengine", "pdftexengine", "xetexengine", "unknownengine", "activecatcode", "bgroup", "egroup", "endline", "conditionaltrue", "conditionalfalse", "attributeunsetvalue", "uprotationangle", "rightrotationangle", "downrotationangle", "leftrotationangle", "inicatcodes", "ctxcatcodes", "texcatcodes", "notcatcodes", "txtcatcodes", "vrbcatcodes", "prtcatcodes", "nilcatcodes", "luacatcodes", "tpacatcodes", "tpbcatcodes", "xmlcatcodes", "ctdcatcodes", "escapecatcode", "begingroupcatcode", "endgroupcatcode", "mathshiftcatcode", "alignmentcatcode", "endoflinecatcode", "parametercatcode", "superscriptcatcode", "subscriptcatcode", "ignorecatcode", "spacecatcode", "lettercatcode", "othercatcode", "activecatcode", "commentcatcode", "invalidcatcode", "tabasciicode", "newlineasciicode", "formfeedasciicode", "endoflineasciicode", "endoffileasciicode", "spaceasciicode", "hashasciicode", "dollarasciicode", "commentasciicode", "ampersandasciicode", "colonasciicode", "backslashasciicode", "circumflexasciicode", "underscoreasciicode", "leftbraceasciicode", "barasciicode", "rightbraceasciicode", "tildeasciicode", "delasciicode", "lessthanasciicode", "morethanasciicode", "doublecommentsignal", "atsignasciicode", "exclamationmarkasciicode", "questionmarkasciicode", "doublequoteasciicode", "singlequoteasciicode", "forwardslashasciicode", "primeasciicode", "hyphenasciicode", "activemathcharcode", "activetabtoken", "activeformfeedtoken", "activeendoflinetoken", "batchmodecode", "nonstopmodecode", "scrollmodecode", "errorstopmodecode", "bottomlevelgroupcode", "simplegroupcode", "hboxgroupcode", "adjustedhboxgroupcode", "vboxgroupcode", "vtopgroupcode", "aligngroupcode", "noaligngroupcode", "outputgroupcode", "mathgroupcode", "discretionarygroupcode", "insertgroupcode", "vcentergroupcode", "mathchoicegroupcode", "semisimplegroupcode", "mathshiftgroupcode", "mathleftgroupcode", "vadjustgroupcode", "charnodecode", "hlistnodecode", "vlistnodecode", "rulenodecode", "insertnodecode", "marknodecode", "adjustnodecode", "ligaturenodecode", "discretionarynodecode", "whatsitnodecode", "mathnodecode", "gluenodecode", "kernnodecode", "penaltynodecode", "unsetnodecode", "mathsnodecode", "charifcode", "catifcode", "numifcode", "dimifcode", "oddifcode", "vmodeifcode", "hmodeifcode", "mmodeifcode", "innerifcode", "voidifcode", "hboxifcode", "vboxifcode", "xifcode", "eofifcode", "trueifcode", "falseifcode", "caseifcode", "definedifcode", "csnameifcode", "fontcharifcode", "fontslantperpoint", "fontinterwordspace", "fontinterwordstretch", "fontinterwordshrink", "fontexheight", "fontemwidth", "fontextraspace", "slantperpoint", "mathexheight", "mathemwidth", "interwordspace", "interwordstretch", "interwordshrink", "exheight", "emwidth", "extraspace", "mathsupdisplay", "mathsupnormal", "mathsupcramped", "mathsubnormal", "mathsubcombined", "mathaxisheight", "muquad", "startmode", "stopmode", "startnotmode", "stopnotmode", "startmodeset", "stopmodeset", "doifmode", "doifelsemode", "doifmodeelse", "doifnotmode", "startmodeset", "stopmodeset", "startallmodes", "stopallmodes", "startnotallmodes", "stopnotallmodes", "doifallmodes", "doifelseallmodes", "doifallmodeselse", "doifnotallmodes", "startenvironment", "stopenvironment", "environment", "startcomponent", "stopcomponent", "component", "startproduct", "stopproduct", "product", "startproject", "stopproject", "project", "starttext", "stoptext", "startnotext", "stopnotext", "startdocument", "stopdocument", "documentvariable", "unexpandeddocumentvariable", "setupdocument", "presetdocument", "startmodule", "stopmodule", "usemodule", "usetexmodule", "useluamodule", "setupmodule", "currentmoduleparameter", "moduleparameter", "everystarttext", "everystoptext", "startTEXpage", "stopTEXpage", "enablemode", "disablemode", "preventmode", "definemode", "globalenablemode", "globaldisablemode", "globalpreventmode", "pushmode", "popmode", "typescriptone", "typescripttwo", "typescriptthree", "mathsizesuffix", "mathordcode", "mathopcode", "mathbincode", "mathrelcode", "mathopencode", "mathclosecode", "mathpunctcode", "mathalphacode", "mathinnercode", "mathnothingcode", "mathlimopcode", "mathnolopcode", "mathboxcode", "mathchoicecode", "mathaccentcode", "mathradicalcode", "constantnumber", "constantnumberargument", "constantdimen", "constantdimenargument", "constantemptyargument", "continueifinputfile", "luastringsep", "!!bs", "!!es", "lefttorightmark", "righttoleftmark", "lrm", "rlm", "bidilre", "bidirle", "bidipop", "bidilro", "bidirlo", "breakablethinspace", "nobreakspace", "nonbreakablespace", "narrownobreakspace", "zerowidthnobreakspace", "ideographicspace", "ideographichalffillspace", "twoperemspace", "threeperemspace", "fourperemspace", "fiveperemspace", "sixperemspace", "figurespace", "punctuationspace", "hairspace", "enquad", "emquad", "zerowidthspace", "zerowidthnonjoiner", "zerowidthjoiner", "zwnj", "zwj", "optionalspace", "asciispacechar", "softhyphen", "Ux", "eUx", "Umathaccents", "parfillleftskip", "parfillrightskip" }, + ["helpers"]={ "startsetups", "stopsetups", "startxmlsetups", "stopxmlsetups", "startluasetups", "stopluasetups", "starttexsetups", "stoptexsetups", "startrawsetups", "stoprawsetups", "startlocalsetups", "stoplocalsetups", "starttexdefinition", "stoptexdefinition", "starttexcode", "stoptexcode", "startcontextcode", "stopcontextcode", "startcontextdefinitioncode", "stopcontextdefinitioncode", "texdefinition", "doifelsesetups", "doifsetupselse", "doifsetups", "doifnotsetups", "setup", "setups", "texsetup", "xmlsetup", "luasetup", "directsetup", "fastsetup", "doifelsecommandhandler", "doifcommandhandlerelse", "doifnotcommandhandler", "doifcommandhandler", "newmode", "setmode", "resetmode", "newsystemmode", "setsystemmode", "resetsystemmode", "pushsystemmode", "popsystemmode", "booleanmodevalue", "newcount", "newdimen", "newskip", "newmuskip", "newbox", "newtoks", "newread", "newwrite", "newmarks", "newinsert", "newattribute", "newif", "newlanguage", "newfamily", "newfam", "newhelp", "then", "begcsname", "strippedcsname", "checkedstrippedcsname", "firstargumentfalse", "firstargumenttrue", "secondargumentfalse", "secondargumenttrue", "thirdargumentfalse", "thirdargumenttrue", "fourthargumentfalse", "fourthargumenttrue", "fifthargumentfalse", "fifthsargumenttrue", "sixthargumentfalse", "sixtsargumenttrue", "doglobal", "dodoglobal", "redoglobal", "resetglobal", "donothing", "dontcomplain", "forgetall", "donetrue", "donefalse", "foundtrue", "foundfalse", "inlineordisplaymath", "indisplaymath", "forcedisplaymath", "startforceddisplaymath", "stopforceddisplaymath", "startpickupmath", "stoppickupmath", "reqno", "mathortext", "htdp", "unvoidbox", "hfilll", "vfilll", "mathbox", "mathlimop", "mathnolop", "mathnothing", "mathalpha", "currentcatcodetable", "defaultcatcodetable", "catcodetablename", "newcatcodetable", "startcatcodetable", "stopcatcodetable", "startextendcatcodetable", "stopextendcatcodetable", "pushcatcodetable", "popcatcodetable", "restorecatcodes", "setcatcodetable", "letcatcodecommand", "defcatcodecommand", "uedcatcodecommand", "hglue", "vglue", "hfillneg", "vfillneg", "hfilllneg", "vfilllneg", "ruledhss", "ruledhfil", "ruledhfill", "ruledhfilneg", "ruledhfillneg", "normalhfillneg", "ruledvss", "ruledvfil", "ruledvfill", "ruledvfilneg", "ruledvfillneg", "normalvfillneg", "ruledhbox", "ruledvbox", "ruledvtop", "ruledvcenter", "ruledmbox", "ruledhpack", "ruledvpack", "ruledtpack", "ruledhskip", "ruledvskip", "ruledkern", "ruledmskip", "ruledmkern", "ruledhglue", "ruledvglue", "normalhglue", "normalvglue", "ruledpenalty", "filledhboxb", "filledhboxr", "filledhboxg", "filledhboxc", "filledhboxm", "filledhboxy", "filledhboxk", "scratchcounter", "globalscratchcounter", "privatescratchcounter", "scratchdimen", "globalscratchdimen", "privatescratchdimen", "scratchskip", "globalscratchskip", "privatescratchskip", "scratchmuskip", "globalscratchmuskip", "privatescratchmuskip", "scratchtoks", "globalscratchtoks", "privatescratchtoks", "scratchbox", "globalscratchbox", "privatescratchbox", "normalbaselineskip", "normallineskip", "normallineskiplimit", "availablehsize", "localhsize", "setlocalhsize", "distributedhsize", "hsizefraction", "nextbox", "dowithnextbox", "dowithnextboxcs", "dowithnextboxcontent", "dowithnextboxcontentcs", "flushnextbox", "scratchwidth", "scratchheight", "scratchdepth", "scratchoffset", "scratchdistance", "scratchhsize", "scratchvsize", "scratchxoffset", "scratchyoffset", "scratchhoffset", "scratchvoffset", "scratchxposition", "scratchyposition", "scratchtopoffset", "scratchbottomoffset", "scratchleftoffset", "scratchrightoffset", "scratchcounterone", "scratchcountertwo", "scratchcounterthree", "scratchcounterfour", "scratchcounterfive", "scratchcountersix", "scratchdimenone", "scratchdimentwo", "scratchdimenthree", "scratchdimenfour", "scratchdimenfive", "scratchdimensix", "scratchskipone", "scratchskiptwo", "scratchskipthree", "scratchskipfour", "scratchskipfive", "scratchskipsix", "scratchmuskipone", "scratchmuskiptwo", "scratchmuskipthree", "scratchmuskipfour", "scratchmuskipfive", "scratchmuskipsix", "scratchtoksone", "scratchtokstwo", "scratchtoksthree", "scratchtoksfour", "scratchtoksfive", "scratchtokssix", "scratchboxone", "scratchboxtwo", "scratchboxthree", "scratchboxfour", "scratchboxfive", "scratchboxsix", "scratchnx", "scratchny", "scratchmx", "scratchmy", "scratchunicode", "scratchmin", "scratchmax", "scratchleftskip", "scratchrightskip", "scratchtopskip", "scratchbottomskip", "doif", "doifnot", "doifelse", "doifinset", "doifnotinset", "doifelseinset", "doifinsetelse", "doifelsenextchar", "doifnextcharelse", "doifelsenextoptional", "doifnextoptionalelse", "doifelsenextoptionalcs", "doifnextoptionalcselse", "doifelsefastoptionalcheck", "doiffastoptionalcheckelse", "doifelsefastoptionalcheckcs", "doiffastoptionalcheckcselse", "doifelsenextbgroup", "doifnextbgroupelse", "doifelsenextbgroupcs", "doifnextbgroupcselse", "doifelsenextparenthesis", "doifnextparenthesiselse", "doifelseundefined", "doifundefinedelse", "doifelsedefined", "doifdefinedelse", "doifundefined", "doifdefined", "doifelsevalue", "doifvalue", "doifnotvalue", "doifnothing", "doifsomething", "doifelsenothing", "doifnothingelse", "doifelsesomething", "doifsomethingelse", "doifvaluenothing", "doifvaluesomething", "doifelsevaluenothing", "doifvaluenothingelse", "doifelsedimension", "doifdimensionelse", "doifelsenumber", "doifnumberelse", "doifnumber", "doifnotnumber", "doifelsecommon", "doifcommonelse", "doifcommon", "doifnotcommon", "doifinstring", "doifnotinstring", "doifelseinstring", "doifinstringelse", "doifelseassignment", "doifassignmentelse", "docheckassignment", "doiftext", "doifelsetext", "doiftextelse", "doifnottext", "tracingall", "tracingnone", "loggingall", "removetoks", "appendtoks", "prependtoks", "appendtotoks", "prependtotoks", "to", "endgraf", "endpar", "everyendpar", "reseteverypar", "finishpar", "empty", "null", "space", "quad", "enspace", "emspace", "charspace", "nbsp", "crlf", "obeyspaces", "obeylines", "obeyedspace", "obeyedline", "obeyedtab", "obeyedpage", "normalspace", "executeifdefined", "singleexpandafter", "doubleexpandafter", "tripleexpandafter", "dontleavehmode", "removelastspace", "removeunwantedspaces", "keepunwantedspaces", "removepunctuation", "ignoreparskip", "forcestrutdepth", "wait", "writestatus", "define", "defineexpandable", "redefine", "setmeasure", "setemeasure", "setgmeasure", "setxmeasure", "definemeasure", "freezemeasure", "measure", "measured", "installcorenamespace", "getvalue", "getuvalue", "setvalue", "setevalue", "setgvalue", "setxvalue", "letvalue", "letgvalue", "resetvalue", "undefinevalue", "ignorevalue", "setuvalue", "setuevalue", "setugvalue", "setuxvalue", "globallet", "glet", "udef", "ugdef", "uedef", "uxdef", "checked", "unique", "getparameters", "geteparameters", "getgparameters", "getxparameters", "forgetparameters", "copyparameters", "getdummyparameters", "dummyparameter", "directdummyparameter", "setdummyparameter", "letdummyparameter", "usedummystyleandcolor", "usedummystyleparameter", "usedummycolorparameter", "processcommalist", "processcommacommand", "quitcommalist", "quitprevcommalist", "processaction", "processallactions", "processfirstactioninset", "processallactionsinset", "unexpanded", "expanded", "startexpanded", "stopexpanded", "protected", "protect", "unprotect", "firstofoneargument", "firstoftwoarguments", "secondoftwoarguments", "firstofthreearguments", "secondofthreearguments", "thirdofthreearguments", "firstoffourarguments", "secondoffourarguments", "thirdoffourarguments", "fourthoffourarguments", "firstoffivearguments", "secondoffivearguments", "thirdoffivearguments", "fourthoffivearguments", "fifthoffivearguments", "firstofsixarguments", "secondofsixarguments", "thirdofsixarguments", "fourthofsixarguments", "fifthofsixarguments", "sixthofsixarguments", "firstofoneunexpanded", "firstoftwounexpanded", "secondoftwounexpanded", "firstofthreeunexpanded", "secondofthreeunexpanded", "thirdofthreeunexpanded", "gobbleoneargument", "gobbletwoarguments", "gobblethreearguments", "gobblefourarguments", "gobblefivearguments", "gobblesixarguments", "gobblesevenarguments", "gobbleeightarguments", "gobbleninearguments", "gobbletenarguments", "gobbleoneoptional", "gobbletwooptionals", "gobblethreeoptionals", "gobblefouroptionals", "gobblefiveoptionals", "dorecurse", "doloop", "exitloop", "dostepwiserecurse", "recurselevel", "recursedepth", "dofastloopcs", "fastloopindex", "fastloopfinal", "dowith", "newconstant", "setnewconstant", "setconstant", "setconstantvalue", "newconditional", "settrue", "setfalse", "settruevalue", "setfalsevalue", "newmacro", "setnewmacro", "newfraction", "newsignal", "dosingleempty", "dodoubleempty", "dotripleempty", "doquadrupleempty", "doquintupleempty", "dosixtupleempty", "doseventupleempty", "dosingleargument", "dodoubleargument", "dotripleargument", "doquadrupleargument", "doquintupleargument", "dosixtupleargument", "doseventupleargument", "dosinglegroupempty", "dodoublegroupempty", "dotriplegroupempty", "doquadruplegroupempty", "doquintuplegroupempty", "permitspacesbetweengroups", "dontpermitspacesbetweengroups", "nopdfcompression", "maximumpdfcompression", "normalpdfcompression", "modulonumber", "dividenumber", "getfirstcharacter", "doifelsefirstchar", "doiffirstcharelse", "startnointerference", "stopnointerference", "twodigits", "threedigits", "leftorright", "offinterlineskip", "oninterlineskip", "nointerlineskip", "strut", "halfstrut", "quarterstrut", "depthstrut", "halflinestrut", "noheightstrut", "setstrut", "strutbox", "strutht", "strutdp", "strutwd", "struthtdp", "strutgap", "begstrut", "endstrut", "lineheight", "leftboundary", "rightboundary", "signalcharacter", "ordordspacing", "ordopspacing", "ordbinspacing", "ordrelspacing", "ordopenspacing", "ordclosespacing", "ordpunctspacing", "ordinnerspacing", "opordspacing", "opopspacing", "opbinspacing", "oprelspacing", "opopenspacing", "opclosespacing", "oppunctspacing", "opinnerspacing", "binordspacing", "binopspacing", "binbinspacing", "binrelspacing", "binopenspacing", "binclosespacing", "binpunctspacing", "bininnerspacing", "relordspacing", "relopspacing", "relbinspacing", "relrelspacing", "relopenspacing", "relclosespacing", "relpunctspacing", "relinnerspacing", "openordspacing", "openopspacing", "openbinspacing", "openrelspacing", "openopenspacing", "openclosespacing", "openpunctspacing", "openinnerspacing", "closeordspacing", "closeopspacing", "closebinspacing", "closerelspacing", "closeopenspacing", "closeclosespacing", "closepunctspacing", "closeinnerspacing", "punctordspacing", "punctopspacing", "punctbinspacing", "punctrelspacing", "punctopenspacing", "punctclosespacing", "punctpunctspacing", "punctinnerspacing", "innerordspacing", "inneropspacing", "innerbinspacing", "innerrelspacing", "inneropenspacing", "innerclosespacing", "innerpunctspacing", "innerinnerspacing", "normalreqno", "startimath", "stopimath", "normalstartimath", "normalstopimath", "startdmath", "stopdmath", "normalstartdmath", "normalstopdmath", "normalsuperscript", "normalsubscript", "normalnosuperscript", "normalnosubscript", "superscript", "subscript", "nosuperscript", "nosubscript", "uncramped", "cramped", "triggermathstyle", "mathstylefont", "mathsmallstylefont", "mathstyleface", "mathsmallstyleface", "mathstylecommand", "mathpalette", "mathstylehbox", "mathstylevbox", "mathstylevcenter", "mathstylevcenteredhbox", "mathstylevcenteredvbox", "mathtext", "setmathsmalltextbox", "setmathtextbox", "pushmathstyle", "popmathstyle", "triggerdisplaystyle", "triggertextstyle", "triggerscriptstyle", "triggerscriptscriptstyle", "triggeruncrampedstyle", "triggercrampedstyle", "triggersmallstyle", "triggeruncrampedsmallstyle", "triggercrampedsmallstyle", "triggerbigstyle", "triggeruncrampedbigstyle", "triggercrampedbigstyle", "luaexpr", "expelsedoif", "expdoif", "expdoifnot", "expdoifelsecommon", "expdoifcommonelse", "expdoifelseinset", "expdoifinsetelse", "ctxdirectlua", "ctxlatelua", "ctxsprint", "ctxwrite", "ctxcommand", "ctxdirectcommand", "ctxlatecommand", "ctxreport", "ctxlua", "luacode", "lateluacode", "directluacode", "registerctxluafile", "ctxloadluafile", "luaversion", "luamajorversion", "luaminorversion", "ctxluacode", "luaconditional", "luaexpanded", "startluaparameterset", "stopluaparameterset", "luaparameterset", "definenamedlua", "obeylualines", "obeyluatokens", "startluacode", "stopluacode", "startlua", "stoplua", "startctxfunction", "stopctxfunction", "ctxfunction", "startctxfunctiondefinition", "stopctxfunctiondefinition", "installctxfunction", "cldprocessfile", "cldloadfile", "cldcontext", "cldcommand", "carryoverpar", "lastlinewidth", "assumelongusagecs", "Umathbotaccent", "righttolefthbox", "lefttorighthbox", "righttoleftvbox", "lefttorightvbox", "righttoleftvtop", "lefttorightvtop", "rtlhbox", "ltrhbox", "rtlvbox", "ltrvbox", "rtlvtop", "ltrvtop", "autodirhbox", "autodirvbox", "autodirvtop", "leftorrighthbox", "leftorrightvbox", "leftorrightvtop", "lefttoright", "righttoleft", "checkedlefttoright", "checkedrighttoleft", "synchronizelayoutdirection", "synchronizedisplaydirection", "synchronizeinlinedirection", "dirlre", "dirrle", "dirlro", "dirrlo", "lesshyphens", "morehyphens", "nohyphens", "dohyphens", "Ucheckedstartdisplaymath", "Ucheckedstopdisplaymath", "break", "nobreak", "allowbreak", "goodbreak", "nospace", "nospacing", "dospacing", "naturalhbox", "naturalvbox", "naturalvtop", "naturalhpack", "naturalvpack", "frule", "compoundhyphenpenalty", "start", "stop" }, }
\ No newline at end of file diff --git a/context/data/textadept/context/data/scite-context-data-interfaces.lua b/context/data/textadept/context/data/scite-context-data-interfaces.lua index 5f4b667e2..943d6bcc1 100644 --- a/context/data/textadept/context/data/scite-context-data-interfaces.lua +++ b/context/data/textadept/context/data/scite-context-data-interfaces.lua @@ -1,10 +1,11 @@ return { - ["cs"]={ "AMSTEX", "AfterPar", "Alphabeticnumerals", "AmSTeX", "And", "BeforePar", "Big", "Bigg", "Biggl", "Biggm", "Biggr", "Bigl", "Bigm", "Bigr", "CONTEXT", "Caps", "Cisla", "ConTeXt", "Context", "ConvertConstantAfter", "ConvertToConstant", "ETEX", "EveryLine", "EveryPar", "GetPar", "GotoPar", "Greeknumerals", "INRSTEX", "Kap", "LAMSTEX", "LATEX", "LUAJITTEX", "LUATEX", "LaTeX", "LamSTeX", "Lua", "LuaTeX", "LuajitTeX", "MESIC", "METAFONT", "METAFUN", "METAPOST", "MKII", "MKIV", "MKIX", "MKVI", "MKXI", "MONTHLONG", "MONTHSHORT", "MPII", "MPIV", "MPVI", "MPanchor", "MPbetex", "MPc", "MPcode", "MPcolor", "MPcoloronly", "MPcolumn", "MPd", "MPdrawing", "MPfontsizehskip", "MPgetmultipars", "MPgetmultishape", "MPgetposboxes", "MPh", "MPinclusions", "MPleftskip", "MPll", "MPlr", "MPls", "MPmenubuttons", "MPn", "MPoptions", "MPoverlayanchor", "MPp", "MPpage", "MPpardata", "MPplus", "MPpos", "MPpositiongraphic", "MPposset", "MPr", "MPrawvar", "MPregion", "MPrest", "MPrightskip", "MPrs", "MPstring", "MPtext", "MPtransparency", "MPul", "MPur", "MPv", "MPvar", "MPvariable", "MPvv", "MPw", "MPwhd", "MPx", "MPxy", "MPxywhd", "MPy", "MetaFont", "MetaFun", "MetaPost", "NormalizeFontHeight", "NormalizeFontWidth", "NormalizeTextHeight", "NormalizeTextWidth", "PDFETEX", "PDFTEX", "PDFcolor", "PICTEX", "PPCHTEX", "PPCHTeX", "PRAGMA", "PiCTeX", "PointsToBigPoints", "PointsToReal", "PointsToWholeBigPoints", "PtToCm", "ReadFile", "Rimskecislice", "SLOVA", "SLOVO", "ScaledPointsToBigPoints", "ScaledPointsToWholeBigPoints", "Slova", "Slovo", "Smallcapped", "TABLE", "TEX", "TEXpage", "TaBlE", "TeX", "TheNormalizedFontSize", "TransparencyHack", "VSEDNIDEN", "VerboseNumber", "WidthSpanningText", "XETEX", "XeTeX", "Znak", "Znaky", "abjadnaivenumerals", "abjadnodotnumerals", "abjadnumerals", "activatespacehandler", "adaptcollector", "adaptfontfeature", "adaptpapersize", "addfeature", "addtoJSpreamble", "addtocommalist", "addvalue", "aftersplitstring", "aftertestandsplitstring", "aktualnicislonadpisu", "aktualnidatum", "alignmentcharacter", "allinputpaths", "alphabeticnumerals", "alwayscitation", "alwayscite", "ampersand", "anchor", "appendetoks", "appendgvalue", "appendtocommalist", "appendtoks", "appendtoksonce", "appendvalue", "apply", "applyalternativestyle", "applyprocessor", "applytocharacters", "applytofirstcharacter", "applytosplitstringchar", "applytosplitstringcharspaced", "applytosplitstringline", "applytosplitstringlinespaced", "applytosplitstringword", "applytosplitstringwordspaced", "applytowords", "arabicdecimals", "arabicexnumerals", "arabicnumerals", "arg", "asciistr", "aside", "assignalfadimension", "assigndimen", "assigndimension", "assignifempty", "assigntranslation", "assignvalue", "assignwidth", "assumelongusagecs", "astype", "attachment", "autocap", "autodirhbox", "autodirvbox", "autodirvtop", "autoinsertnextspace", "automathematics", "autosetups", "availablehsize", "averagecharwidth", "backgroundimage", "backgroundimagefill", "backgroundline", "barevnalista", "barva", "basegrid", "baselineleftbox", "baselinemiddlebox", "baselinerightbox", "bbox", "beforesplitstring", "beforetestandsplitstring", "big", "bigbodyfont", "bigg", "bigger", "biggl", "biggm", "biggr", "bigl", "bigm", "bigr", "bigskip", "binom", "bitmapimage", "blap", "bleed", "bleedheight", "bleedwidth", "blockligatures", "blockquote", "bodyfontenvironmentlist", "bodyfontsize", "bold", "boldface", "bolditalic", "boldslanted", "booleanmodevalue", "bottombox", "bottomleftbox", "bottomrightbox", "boxcursor", "boxmarker", "boxofsize", "boxreference", "bpos", "bthiddencitation", "btxabbreviatedjournal", "btxaddjournal", "btxalwayscitation", "btxauthorfield", "btxdetail", "btxdirect", "btxdoif", "btxdoifcombiinlistelse", "btxdoifelse", "btxdoifelsecombiinlist", "btxdoifelsesameasprevious", "btxdoifelsesameaspreviouschecked", "btxdoifelseuservariable", "btxdoifnot", "btxdoifsameaspreviouscheckedelse", "btxdoifsameaspreviouselse", "btxdoifuservariableelse", "btxexpandedjournal", "btxfield", "btxfieldname", "btxfieldtype", "btxfirstofrange", "btxflush", "btxflushauthor", "btxflushauthorinverted", "btxflushauthorinvertedshort", "btxflushauthorname", "btxflushauthornormal", "btxflushauthornormalshort", "btxflushsuffix", "btxfoundname", "btxfoundtype", "btxhybridcite", "btxlistcitation", "btxloadjournalist", "btxoneorrange", "btxremapauthor", "btxsavejournalist", "btxsetup", "btxsingularorplural", "btxsingularplural", "btxtextcitation", "calligraphic", "camel", "catcodetablename", "cbox", "centerbox", "centeredbox", "centerednextbox", "cernalinka", "cernelinky", "cfrac", "chardescription", "charwidthlanguage", "checkcharacteralign", "checkedchar", "checkedfiller", "checkedstrippedcsname", "checkinjector", "checknextindentation", "checknextinjector", "checkpage", "checkparameters", "checkpreviousinjector", "checksoundtrack", "checktwopassdata", "checkvariables", "chem", "chemical", "chemicalbottext", "chemicalmidtext", "chemicalsymbol", "chemicaltext", "chemicaltoptext", "chineseallnumerals", "chinesecapnumerals", "chinesenumerals", "cisla", "cislonadpisu", "cislorovnice", "cislostrany", "citace", "citation", "cite", "citovat", "clap", "classfont", "cldcommand", "cldcontext", "cldloadfile", "cldprocessfile", "cleftarrow", "collect", "collectedtext", "collectexpanded", "colorcomponents", "colored", "coloronly", "columnbreak", "combinepages", "commalistelement", "commalistsentence", "commalistsize", "comment", "comparedimension", "comparedimensioneps", "completebtxrendering", "completelist", "completelistofpublications", "completelistofsorts", "completelistofsynonyms", "completepagenumber", "completeregister", "complexorsimple", "complexorsimpleempty", "composedcollector", "composedlayer", "compresult", "constantdimen", "constantdimenargument", "constantemptyargument", "constantnumber", "constantnumberargument", "contentreference", "continuednumber", "continueifinputfile", "convertargument", "convertcommand", "convertedcounter", "converteddimen", "convertedsubcounter", "convertmonth", "convertvalue", "convertvboxtohbox", "copypages", "copyparameters", "copyposition", "countersubs", "counttoken", "counttokens", "cramped", "crampedclap", "crampedllap", "crampedrlap", "crightarrow", "crightoverleftarrow", "ctop", "ctxcommand", "ctxdirectcommand", "ctxdirectlua", "ctxfunction", "ctxlatecommand", "ctxlatelua", "ctxloadluafile", "ctxlua", "ctxluabuffer", "ctxluacode", "ctxreport", "ctxsprint", "currentassignmentlistkey", "currentassignmentlistvalue", "currentbtxuservariable", "currentcommalistitem", "currentcomponent", "currentenvironment", "currentfeaturetest", "currentinterface", "currentlanguage", "currentlistentrydestinationattribute", "currentlistentrylimitedtext", "currentlistentrynumber", "currentlistentrypagenumber", "currentlistentryreferenceattribute", "currentlistentrytitle", "currentlistentrytitlerendered", "currentlistsymbol", "currentmainlanguage", "currentmessagetext", "currentmoduleparameter", "currentoutputstream", "currentproduct", "currentproject", "currentregime", "currentregisterpageuserdata", "currentresponses", "currenttime", "currentvalue", "currentxtablecolumn", "currentxtablerow", "datasetvariable", "datum", "dayoftheweek", "dayspermonth", "dbinom", "decrement", "decrementcounter", "decrementedcounter", "decrementpagenumber", "decrementsubpagenumber", "decrementvalue", "defaultinterface", "defaultobjectpage", "defaultobjectreference", "defcatcodecommand", "defconvertedargument", "defconvertedcommand", "defconvertedvalue", "defineMPinstance", "defineTABLEsetup", "defineactivecharacter", "definealternativestyle", "defineanchor", "defineattachment", "defineattribute", "definebackground", "definebar", "definebodyfontswitch", "definebreakpoint", "definebreakpoints", "definebtx", "definebtxdataset", "definebtxregister", "definebtxrendering", "definebutton", "definecapitals", "definecharacterkerning", "definecharacterspacing", "definechemical", "definechemicals", "definechemicalsymbol", "definecollector", "definecolumnbreak", "definecombination", "definecomment", "definecomplexorsimple", "definecomplexorsimpleempty", "defineconversionset", "definecounter", "definedataset", "definedelimitedtext", "definedfont", "defineeffect", "defineexpandable", "defineexternalfigure", "definefallbackfamily", "definefieldbody", "definefieldbodyset", "definefieldcategory", "definefileconstant", "definefilefallback", "definefilesynonym", "definefiller", "definefirstline", "definefittingpage", "definefontalternative", "definefontfallback", "definefontfamily", "definefontfamilypreset", "definefontfeature", "definefontfile", "definefontsize", "definefontsolution", "defineformula", "defineformulaalternative", "defineformulaframed", "defineframedcontent", "definefrozenfont", "defineglobalcolor", "definegraphictypesynonym", "definegridsnapping", "defineheadalternative", "definehelp", "definehigh", "definehighlight", "definehspace", "definehypenationfeatures", "defineindentedtext", "defineindenting", "defineinitial", "defineinsertion", "defineinteraction", "defineinteractionbar", "defineinterfaceconstant", "defineinterfaceelement", "defineinterfacevariable", "defineinterlinespace", "defineintermediatecolor", "defineitemgroup", "defineitems", "definelabelclass", "definelayer", "definelayerpreset", "definelayout", "definelinefiller", "definelinenote", "definelinenumbering", "definelines", "definelistalternative", "definelistextra", "definelow", "definelowhigh", "definelowmidhigh", "definemarginblock", "definemargindata", "definemarker", "definemathalignment", "definemathcases", "definemathcommand", "definemathdoubleextensible", "definemathematics", "definemathextensible", "definemathfence", "definemathfraction", "definemathframed", "definemathmatrix", "definemathornament", "definemathoverextensible", "definemathovertextextensible", "definemathradical", "definemathstackers", "definemathstyle", "definemathtriplet", "definemathunderextensible", "definemathundertextextensible", "definemathunstacked", "definemeasure", "definemessageconstant", "definemixedcolumns", "definemode", "definemultitonecolor", "definenamedcolor", "definenamespace", "definenarrower", "definenote", "defineornament", "defineoutputroutine", "defineoutputroutinecommand", "definepage", "definepagebreak", "definepagechecker", "definepagegrid", "definepagegridarea", "definepagegridspan", "definepageinjection", "definepageinjectionalternative", "definepageshift", "definepagestate", "definepairedbox", "defineparagraph", "defineparallel", "defineparbuilder", "defineplacement", "definepositioning", "defineprefixset", "defineprocesscolor", "defineprocessor", "definepushbutton", "definepushsymbol", "definerenderingwindow", "defineresetset", "definescale", "definescript", "definesectionlevels", "defineselector", "defineseparatorset", "defineshift", "definesidebar", "definesort", "definespotcolor", "definestyleinstance", "definesubformula", "definesynonym", "definesystemattribute", "definesystemconstant", "definesystemvariable", "definetabulation", "definetextbackground", "definetextflow", "definetooltip", "definetransparency", "definetwopasslist", "definetype", "definetypeface", "definetypescriptprefix", "definetypescriptsynonym", "definetypesetting", "defineunit", "defineviewerlayer", "definevspace", "definevspacing", "definevspacingamount", "definextable", "definuj", "definujbarvu", "definujblok", "definujbloksekce", "definujbuffer", "definujfont", "definujformatodkazu", "definujhbox", "definujinterakcnimenu", "definujkombinovanyseznam", "definujkonverzi", "definujnadpis", "definujobrazeksymbol", "definujodkaz", "definujodstavce", "definujopis", "definujoramovani", "definujoramovanytext", "definujpaletu", "definujplvouciobjekt", "definujpodpole", "definujpole", "definujpopis", "definujpopisek", "definujprekryv", "definujprofil", "definujprogram", "definujprostredizakladnihofontu", "definujrejstrik", "definujsablonutabulky", "definujsekci", "definujseznam", "definujskupinubarev", "definujstartstop", "definujstyl", "definujstylfontu", "definujsymbol", "definujsynonumumfontu", "definujsynonyma", "definujtabelaci", "definujtext", "definujtrideni", "definujupravu", "definujvelikostpapiru", "definujvycet", "definujzakladnifont", "definujzasobnikpoli", "definujznaceni", "delimited", "delimitedtext", "delkaseznamu", "depthofstring", "depthonlybox", "depthspanningtext", "determinenoflines", "devanagarinumerals", "dfrac", "digits", "dimensiontocount", "directcolor", "directcolored", "directconvertedcounter", "directdummyparameter", "directgetboxllx", "directgetboxlly", "directhighlight", "directlocalframed", "directluacode", "directselect", "directsetbar", "directsetup", "directsymbol", "directvspacing", "dis", "disabledirectives", "disableexperiments", "disablemode", "disableoutputstream", "disableparpositions", "disableregime", "disabletrackers", "displaymath", "displaymathematics", "displaymessage", "distributedhsize", "dividedsize", "doadaptleftskip", "doadaptrightskip", "doaddfeature", "doassign", "doassignempty", "doboundtext", "docheckassignment", "docheckedpagestate", "docheckedpair", "documentvariable", "dodoubleargument", "dodoubleargumentwithset", "dodoubleempty", "dodoubleemptywithset", "dodoublegroupempty", "doeassign", "doexpandedrecurse", "dogetattribute", "dogetattributeid", "dogetcommacommandelement", "dogobbledoubleempty", "dogobblesingleempty", "doif", "doifMPgraphicelse", "doifallcommon", "doifallcommonelse", "doifalldefinedelse", "doifallmodes", "doifallmodeselse", "doifassignmentelse", "doifblackelse", "doifbothsides", "doifbothsidesoverruled", "doifboxelse", "doifbufferelse", "doifcolor", "doifcolorelse", "doifcommandhandler", "doifcommandhandlerelse", "doifcommon", "doifcommonelse", "doifcontent", "doifconversiondefinedelse", "doifconversionnumberelse", "doifcounter", "doifcounterelse", "doifcurrentfonthasfeatureelse", "doifdefined", "doifdefinedcounter", "doifdefinedcounterelse", "doifdefinedelse", "doifdimensionelse", "doifdimenstringelse", "doifdocumentargument", "doifdocumentargumentelse", "doifdocumentfilename", "doifdocumentfilenameelse", "doifdrawingblackelse", "doifelse", "doifelseMPgraphic", "doifelseallcommon", "doifelsealldefined", "doifelseallmodes", "doifelseassignment", "doifelseblack", "doifelsebox", "doifelsebuffer", "doifelsecolor", "doifelsecommandhandler", "doifelsecommon", "doifelseconversiondefined", "doifelseconversionnumber", "doifelsecounter", "doifelsecurrentfonthasfeature", "doifelsecurrentsortingused", "doifelsecurrentsynonymshown", "doifelsecurrentsynonymused", "doifelsedefined", "doifelsedefinedcounter", "doifelsedimension", "doifelsedimenstring", "doifelsedocumentargument", "doifelsedocumentfilename", "doifelsedrawingblack", "doifelseempty", "doifelseemptyvalue", "doifelseemptyvariable", "doifelseenv", "doifelsefastoptionalcheck", "doifelsefastoptionalcheckcs", "doifelsefieldbody", "doifelsefieldcategory", "doifelsefigure", "doifelsefile", "doifelsefiledefined", "doifelsefileexists", "doifelsefirstchar", "doifelseflagged", "doifelsefontchar", "doifelsefontpresent", "doifelsefontsynonym", "doifelsehasspace", "doifelsehelp", "doifelseincsname", "doifelseinelement", "doifelseinputfile", "doifelseinsertion", "doifelseinset", "doifelseinstring", "doifelseinsymbolset", "doifelseintoks", "doifelseintwopassdata", "doifelseitalic", "doifelselanguage", "doifelselayerdata", "doifelselayoutdefined", "doifelselayoutsomeline", "doifelselayouttextline", "doifelseleapyear", "doifelselist", "doifelselocation", "doifelselocfile", "doifelsemainfloatbody", "doifelsemarking", "doifelsemeaning", "doifelsemessage", "doifelsemode", "doifelsenextbgroup", "doifelsenextbgroupcs", "doifelsenextchar", "doifelsenextoptional", "doifelsenextoptionalcs", "doifelsenextparenthesis", "doifelsenonzeropositive", "doifelsenoteonsamepage", "doifelsenothing", "doifelsenumber", "doifelseobjectfound", "doifelseobjectreferencefound", "doifelseoddpage", "doifelseoddpagefloat", "doifelseoldercontext", "doifelseolderversion", "doifelseoverlapping", "doifelseoverlay", "doifelseparallel", "doifelseparentfile", "doifelsepath", "doifelsepathexists", "doifelsepatterns", "doifelseposition", "doifelsepositionaction", "doifelsepositiononpage", "doifelsepositionsonsamepage", "doifelsepositionsonthispage", "doifelsepositionsused", "doifelsereferencefound", "doifelserightpagefloat", "doifelserighttoleftinbox", "doifelsesamelinereference", "doifelsesamestring", "doifelsesetups", "doifelsesomebackground", "doifelsesomespace", "doifelsesomething", "doifelsesometoks", "doifelsestringinstring", "doifelsestructurelisthasnumber", "doifelsestructurelisthaspage", "doifelsesymboldefined", "doifelsesymbolset", "doifelsetext", "doifelsetextflow", "doifelsetextflowcollector", "doifelsetypingfile", "doifelseundefined", "doifelseurldefined", "doifelsevalue", "doifelsevaluenothing", "doifelsevariable", "doifempty", "doifemptyelse", "doifemptytoks", "doifemptyvalue", "doifemptyvalueelse", "doifemptyvariable", "doifemptyvariableelse", "doifenv", "doifenvelse", "doiffastoptionalcheckcselse", "doiffastoptionalcheckelse", "doiffieldbodyelse", "doiffieldcategoryelse", "doiffigureelse", "doiffile", "doiffiledefinedelse", "doiffileelse", "doiffileexistselse", "doiffirstcharelse", "doifflaggedelse", "doiffontcharelse", "doiffontpresentelse", "doiffontsynonymelse", "doifhasspaceelse", "doifhelpelse", "doifincsnameelse", "doifinelementelse", "doifinputfileelse", "doifinsertionelse", "doifinset", "doifinsetelse", "doifinstring", "doifinstringelse", "doifinsymbolset", "doifinsymbolsetelse", "doifintokselse", "doifintwopassdataelse", "doifitalicelse", "doiflanguageelse", "doiflayerdataelse", "doiflayoutdefinedelse", "doiflayoutsomelineelse", "doiflayouttextlineelse", "doifleapyearelse", "doiflistelse", "doiflocationelse", "doiflocfileelse", "doifmainfloatbodyelse", "doifmarkingelse", "doifmeaningelse", "doifmessageelse", "doifmode", "doifmodeelse", "doifnextbgroupcselse", "doifnextbgroupelse", "doifnextcharelse", "doifnextoptionalcselse", "doifnextoptionalelse", "doifnextparenthesiselse", "doifnonzeropositiveelse", "doifnot", "doifnotallcommon", "doifnotallmodes", "doifnotcommandhandler", "doifnotcommon", "doifnotcounter", "doifnotdocumentargument", "doifnotdocumentfilename", "doifnotempty", "doifnotemptyvalue", "doifnotemptyvariable", "doifnotenv", "doifnoteonsamepageelse", "doifnotescollected", "doifnotfile", "doifnotflagged", "doifnothing", "doifnothingelse", "doifnotinset", "doifnotinsidesplitfloat", "doifnotinstring", "doifnotmode", "doifnotnumber", "doifnotsamestring", "doifnotsetups", "doifnotvalue", "doifnotvariable", "doifnumber", "doifnumberelse", "doifobjectfoundelse", "doifobjectreferencefoundelse", "doifoddpageelse", "doifoddpagefloatelse", "doifoldercontextelse", "doifolderversionelse", "doifoverlappingelse", "doifoverlayelse", "doifparallelelse", "doifparentfileelse", "doifpathelse", "doifpathexistselse", "doifpatternselse", "doifposition", "doifpositionaction", "doifpositionactionelse", "doifpositionelse", "doifpositiononpageelse", "doifpositionsonsamepageelse", "doifpositionsonthispageelse", "doifpositionsusedelse", "doifreferencefoundelse", "doifrightpagefloatelse", "doifrighttoleftinboxelse", "doifsamelinereferenceelse", "doifsamestring", "doifsamestringelse", "doifsetups", "doifsetupselse", "doifsomebackground", "doifsomebackgroundelse", "doifsomespaceelse", "doifsomething", "doifsomethingelse", "doifsometoks", "doifsometokselse", "doifstringinstringelse", "doifstructurelisthasnumberelse", "doifstructurelisthaspageelse", "doifsymboldefinedelse", "doifsymbolsetelse", "doiftext", "doiftextelse", "doiftextflowcollectorelse", "doiftextflowelse", "doiftypingfileelse", "doifundefined", "doifundefinedcounter", "doifundefinedelse", "doifurldefinedelse", "doifvalue", "doifvalueelse", "doifvaluenothing", "doifvaluenothingelse", "doifvaluesomething", "doifvariable", "doifvariableelse", "doindentation", "dollar", "doloop", "doloopoverlist", "donothing", "dontconvertfont", "dontleavehmode", "dontpermitspacesbetweengroups", "dopositionaction", "doprocesslocalsetups", "doquadrupleargument", "doquadrupleempty", "doquadruplegroupempty", "doquintupleargument", "doquintupleempty", "doquintuplegroupempty", "dorechecknextindentation", "dorecurse", "dorepeatwithcommand", "doreplacefeature", "doresetandafffeature", "doresetattribute", "dorotatebox", "dosetattribute", "dosetleftskipadaption", "dosetrightskipadaption", "dosetupcheckedinterlinespace", "doseventupleargument", "doseventupleempty", "dosingleargument", "dosingleempty", "dosinglegroupempty", "dosixtupleargument", "dosixtupleempty", "dostepwiserecurse", "dosubtractfeature", "dotfskip", "dotoks", "dotripleargument", "dotripleargumentwithset", "dotripleempty", "dotripleemptywithset", "dotriplegroupempty", "doublebar", "doublebond", "doublebrace", "doublebracket", "doubleparent", "dowith", "dowithnextbox", "dowithnextboxcontent", "dowithnextboxcontentcs", "dowithnextboxcs", "dowithpargument", "dowithrange", "dowithwargument", "dpofstring", "dummydigit", "dummyparameter", "eTeX", "edefconvertedargument", "efcmaxheight", "efcmaxwidth", "efcminheight", "efcminwidth", "efcparameter", "effect", "elapsedseconds", "elapsedtime", "eleftarrowfill", "eleftharpoondownfill", "eleftharpoonupfill", "eleftrightarrowfill", "emphasisboldface", "emphasistypeface", "emptylines", "emspace", "enabledirectives", "enableexperiments", "enablemode", "enableoutputstream", "enableparpositions", "enableregime", "enabletrackers", "enskip", "enspace", "env", "envvar", "eoverbarfill", "eoverbracefill", "eoverbracketfill", "eoverparentfill", "epos", "equaldigits", "erightarrowfill", "erightharpoondownfill", "erightharpoonupfill", "etwoheadrightarrowfill", "eunderbarfill", "eunderbracefill", "eunderbracketfill", "eunderparentfill", "executeifdefined", "exitloop", "exitloopnow", "expandcheckedcsname", "expanded", "expandfontsynonym", "externalfigurecollectionmaxheight", "externalfigurecollectionmaxwidth", "externalfigurecollectionminheight", "externalfigurecollectionminwidth", "externalfigurecollectionparameter", "externiobraz", "fakebox", "fastdecrement", "fastincrement", "fastlocalframed", "fastscale", "fastsetup", "fastsetupwithargument", "fastsetupwithargumentswapped", "fastswitchtobodyfont", "fastsxsy", "feature", "fence", "fenced", "fetchallmarkings", "fetchallmarks", "fetchmark", "fetchmarking", "fetchonemark", "fetchonemarking", "fetchruntinecommand", "fetchtwomarkings", "fetchtwomarks", "fieldbody", "fifthoffivearguments", "fifthofsixarguments", "figurefilename", "figurefilepath", "figurefiletype", "figurefullname", "figureheight", "figurenaturalheight", "figurenaturalwidth", "figuresymbol", "figurewidth", "filename", "filledhboxb", "filledhboxc", "filledhboxg", "filledhboxk", "filledhboxm", "filledhboxr", "filledhboxy", "filler", "filterfromnext", "filterfromvalue", "filterpages", "filterreference", "findtwopassdata", "finishregisterentry", "firstcharacter", "firstcounter", "firstcountervalue", "firstoffivearguments", "firstoffourarguments", "firstofoneargument", "firstofoneunexpanded", "firstofsixarguments", "firstofthreearguments", "firstofthreeunexpanded", "firstoftwoarguments", "firstoftwounexpanded", "firstrealpage", "firstrealpagenumber", "firstsubcountervalue", "firstsubpage", "firstsubpagenumber", "firstuserpage", "firstuserpagenumber", "fitfieldframed", "fittopbaselinegrid", "flag", "floatuserdataparameter", "flushboxregister", "flushcollector", "flushlayer", "flushlocalfloats", "flushnextbox", "flushnotes", "flushoutputstream", "flushshapebox", "flushtextflow", "flushtokens", "flushtoks", "fontalternative", "fontbody", "fontchar", "fontcharbyindex", "fontclass", "fontclassname", "fontface", "fontfeaturelist", "fontsize", "fontstyle", "footnotetext", "forcecharacterstripping", "forcelocalfloats", "forgeteverypar", "forgetparameters", "formula", "foundbox", "fourthoffivearguments", "fourthoffourarguments", "fourthofsixarguments", "frac", "frameddimension", "framedparameter", "framedtext", "freezedimenmacro", "freezemeasure", "frenchspacing", "fromlinenote", "frozenhbox", "gdefconvertedargument", "gdefconvertedcommand", "getMPdrawing", "getMPlayer", "getboxllx", "getboxlly", "getbufferdata", "getcommacommandsize", "getcommalistsize", "getdayoftheweek", "getdayspermonth", "getdefinedbuffer", "getdocumentargument", "getdocumentargumentdefault", "getdocumentfilename", "getdummyparameters", "getemptyparameters", "geteparameters", "getexpandedparameters", "getfiguredimensions", "getfirstcharacter", "getfirsttwopassdata", "getfromcommacommand", "getfromcommalist", "getfromtwopassdata", "getglyphdirect", "getglyphstyled", "getgparameters", "getlasttwopassdata", "getlocalfloat", "getlocalfloats", "getmessage", "getnamedglyphdirect", "getnamedglyphstyled", "getnamedtwopassdatalist", "getnaturaldimensions", "getnoflines", "getobject", "getobjectdimensions", "getpaletsize", "getparameters", "getprivatechar", "getprivateslot", "getrandomcount", "getrandomdimen", "getrandomfloat", "getrandomnumber", "getrandomseed", "getraweparameters", "getrawgparameters", "getrawnoflines", "getrawparameters", "getrawxparameters", "getreference", "getreferenceentry", "getroundednoflines", "getsubstring", "gettwopassdata", "gettwopassdatalist", "getuvalue", "getvalue", "getvariable", "getvariabledefault", "getxparameters", "globaldisablemode", "globalenablemode", "globalletempty", "globalpopbox", "globalpopmacro", "globalpreventmode", "globalprocesscommalist", "globalpushbox", "globalpushmacro", "globalswapcounts", "globalswapdimens", "globalswapmacros", "globalundefine", "glyphfontfile", "gobbledoubleempty", "gobbleeightarguments", "gobblefivearguments", "gobblefiveoptionals", "gobblefourarguments", "gobblefouroptionals", "gobbleninearguments", "gobbleoneargument", "gobbleoneoptional", "gobblesevenarguments", "gobblesingleempty", "gobblesixarguments", "gobblespacetokens", "gobbletenarguments", "gobblethreearguments", "gobblethreeoptionals", "gobbletwoarguments", "gobbletwooptionals", "gobbleuntil", "gobbleuntilrelax", "grabbufferdata", "grabbufferdatadirect", "grabuntil", "graf", "grayvalue", "greedysplitstring", "greeknumerals", "groupedcommand", "gsetboxllx", "gsetboxlly", "gujaratinumerals", "gurmurkhinumerals", "hairspace", "halfwaybox", "handletokens", "handwritten", "hash", "hboxofvbox", "hboxreference", "hdofstring", "headhbox", "headnumbercontent", "headnumberdistance", "headnumberwidth", "headreferenceattributes", "headsetupspacing", "headtextcontent", "headtextdistance", "headtextwidth", "headvbox", "headwidth", "heightanddepthofstring", "heightofstring", "heightspanningtext", "helptext", "hglue", "hiddenbar", "hiddencitation", "hiddencite", "highlight", "highordinalstr", "hilo", "himilo", "hl", "hlavnijazyk", "hodnotabarvy", "horizontalgrowingbar", "horizontalpositionbar", "hphantom", "hpos", "hsizefraction", "hsmash", "hsmashbox", "hsmashed", "hspace", "htdpofstring", "htofstring", "hyphen", "hyphenatedcoloredword", "hyphenatedfile", "hyphenatedfilename", "hyphenatedhbox", "hyphenatedpar", "hyphenatedurl", "hyphenatedword", "ibox", "ifassignment", "iff", "ifinobject", "ifinoutputstream", "ifparameters", "iftrialtypesetting", "ignoreimplicitspaces", "ignorevalue", "immediatesavetwopassdata", "impliedby", "implies", "includemenu", "includeversioninfo", "increment", "incrementcounter", "incrementedcounter", "incrementpagenumber", "incrementsubpagenumber", "incrementvalue", "indentation", "infofont", "infofontbold", "inheritparameter", "inhibitblank", "initializeboxstack", "inlinebuffer", "inlinedbox", "inlinemath", "inlinemathematics", "inlinemessage", "inlineordisplaymath", "inlinerange", "innerflushshapebox", "input", "inputfilebarename", "inputfilename", "inputfilerealsuffix", "inputfilesuffix", "inputgivenfile", "insertpages", "instalacejazyka", "installactionhandler", "installactivecharacter", "installanddefineactivecharacter", "installattributestack", "installautocommandhandler", "installautosetuphandler", "installbasicautosetuphandler", "installbasicparameterhandler", "installbottomframerenderer", "installcommandhandler", "installcorenamespace", "installdefinehandler", "installdefinitionset", "installdefinitionsetmember", "installdirectcommandhandler", "installdirectparameterhandler", "installdirectparametersethandler", "installdirectsetuphandler", "installdirectstyleandcolorhandler", "installframedautocommandhandler", "installframedcommandhandler", "installleftframerenderer", "installnamespace", "installoutputroutine", "installpagearrangement", "installparameterhandler", "installparameterhashhandler", "installparametersethandler", "installparentinjector", "installrightframerenderer", "installrootparameterhandler", "installsetuphandler", "installsetuponlycommandhandler", "installshipoutmethod", "installsimplecommandhandler", "installsimpleframedcommandhandler", "installstyleandcolorhandler", "installswitchcommandhandler", "installswitchsetuphandler", "installtexdirective", "installtextracker", "installtopframerenderer", "installunitsseparator", "installunitsspace", "installversioninfo", "integerrounding", "interakcnilista", "interakcnitlacitka", "interaktivnimenu", "intermezzo", "intertext", "invokepageheandler", "istltdir", "istrtdir", "italic", "italicbold", "italiccorrection", "itemtag", "jazyk", "jdidolu", "jdina", "jdinabox", "jdinastranu", "jobfilename", "jobfilesuffix", "kap", "kapitola", "keeplinestogether", "keepunwantedspaces", "kerncharacters", "klonujpole", "komentar", "komponenta", "konvertujcislo", "kopirujpole", "koreancirclenumerals", "koreannumerals", "koreannumeralsc", "koreannumeralsp", "koreanparentnumerals", "korekcebilehomista", "languageCharacters", "languagecharacters", "languagecharwidth", "lastcounter", "lastcountervalue", "lastdigit", "lastlinewidth", "lastnaturalboxdp", "lastnaturalboxht", "lastnaturalboxwd", "lastpredefinedsymbol", "lastrealpage", "lastrealpagenumber", "lastsubcountervalue", "lastsubpage", "lastsubpagenumber", "lasttwodigits", "lastuserpage", "lastuserpagenumber", "lateluacode", "layeredtext", "layerheight", "layerwidth", "lazysavetaggedtwopassdata", "lazysavetwopassdata", "lbox", "left", "leftbottombox", "leftbox", "lefthbox", "leftorrighthbox", "leftorrightvbox", "leftorrightvtop", "leftskipadaption", "leftsubguillemot", "lefttopbox", "lefttorighthbox", "lefttorightvbox", "lefttorightvtop", "letbeundefined", "letcatcodecommand", "letcscsname", "letcsnamecs", "letcsnamecsname", "letdummyparameter", "letempty", "letgvalue", "letgvalueempty", "letgvalurelax", "letterampersand", "letterat", "letterbackslash", "letterbar", "letterbgroup", "letterclosebrace", "lettercolon", "letterdollar", "letterdoublequote", "letteregroup", "letterescape", "letterexclamationmark", "letterhash", "letterhat", "letterleftbrace", "letterless", "lettermore", "letteropenbrace", "letterpercent", "letterquestionmark", "letterrightbrace", "lettersinglequote", "letterslash", "letterspacing", "lettertilde", "letterunderscore", "letvalue", "letvalueempty", "letvaluerelax", "lfence", "lhbox", "limitatelines", "limitatetext", "limtatefirstline", "linespanningtext", "listcitation", "listcite", "listnamespaces", "llap", "loadanyfile", "loadanyfileonce", "loadbtxdefinitionfile", "loadbtxreplacementfile", "loadcldfile", "loadcldfileonce", "loadfontgoodies", "loadluafile", "loadluafileonce", "loadspellchecklist", "loadtexfile", "loadtexfileonce", "loadtypescriptfile", "localframed", "localframedwithsettings", "localhsize", "localpopbox", "localpopmacro", "localpushbox", "localpushmacro", "localundefine", "locatedfilepath", "locatefilepath", "locfilename", "lomihi", "lowerbox", "lowercased", "lowercasestring", "lowerleftdoubleninequote", "lowerleftsingleninequote", "lowerrightdoubleninequote", "lowerrightsingleninequote", "lrtbbox", "ltop", "luaTeX", "luacode", "luaconditional", "luaenvironment", "luaexpanded", "luafunction", "luajitTeX", "luamajorversion", "luaminorversion", "luaparameterset", "luasetup", "luaversion", "m", "mLeftarrow", "mLeftrightarrow", "mRightarrow", "makecharacteractive", "makerawcommalist", "makestrutofbox", "maoramovani", "mapfontsize", "margindata", "markcontent", "markinjector", "mat", "matematika", "math", "mathbf", "mathbi", "mathblackboard", "mathbs", "mathcommand", "mathdefault", "mathfraktur", "mathfunction", "mathit", "mathitalic", "mathop", "mathrm", "mathscript", "mathsl", "mathss", "mathtext", "mathtextbf", "mathtextbi", "mathtextbs", "mathtextit", "mathtextsl", "mathtexttf", "mathtf", "mathtriplet", "mathtt", "mathupright", "mathword", "mathwordbf", "mathwordbi", "mathwordbs", "mathwordit", "mathwordsl", "mathwordtf", "mazaramovani", "mbox", "mcframed", "md", "measure", "measured", "medskip", "medspace", "mequal", "meritko", "mesic", "message", "metaTeX", "mezera", "mfence", "mfunction", "mfunctionlabeltext", "mhbox", "mhookleftarrow", "mhookrightarrow", "middle", "middlebox", "midhbox", "minimalhbox", "mixedcaps", "mkvibuffer", "mleftarrow", "mleftharpoondown", "mleftharpoonup", "mleftrightarrow", "mleftrightharpoons", "mmapsto", "moduleparameter", "molecule", "mono", "monobold", "mononormal", "monthlong", "monthshort", "mp", "mprandomnumber", "mrel", "mrightarrow", "mrightharpoondown", "mrightharpoonup", "mrightleftharpoons", "mrightoverleftarrow", "mrizka", "mtext", "mtriplerel", "mtwoheadleftarrow", "mtwoheadrightarrow", "namedheadnumber", "namedstructureheadlocation", "namedstructureuservariable", "namedstructurevariable", "namedtaggedlabeltexts", "nastavbarvu", "nastavbarvy", "nastavbilamista", "nastavblok", "nastavbloksekce", "nastavbuffer", "nastavcernelinky", "nastavcislonadpisu", "nastavcislostrany", "nastavcislovaniodstavcu", "nastavcislovaniradku", "nastavcislovanistran", "nastavcitaci", "nastavdeleniplvoucichobjektu", "nastavdelitko", "nastavdolnitexty", "nastavhorejsek", "nastavhornitexty", "nastavinterakci", "nastavinterakcnilistu", "nastavinterakcnimenu", "nastavinterakcniobrazovku", "nastavjazyk", "nastavkapitalky", "nastavkombinovanyseznam", "nastavkomentar", "nastavkomentarstrany", "nastavmarginalnilinky", "nastavmeziradkovoumezeru", "nastavnadpis", "nastavnadpisy", "nastavodkazovani", "nastavodsazovani", "nastavodstavce", "nastavopis", "nastavoramovani", "nastavorez", "nastavotoceni", "nastavpaletu", "nastavplvouciobjekt", "nastavpodcislostrany", "nastavpole", "nastavpolozky", "nastavpopisek", "nastavpozadi", "nastavprechodstrany", "nastavpreskok", "nastavprogramy", "nastavradkovani", "nastavradky", "nastavrejstrik", "nastavsadusymbolu", "nastavseznam", "nastavsirkucary", "nastavsloupce", "nastavspodek", "nastavsynonyma", "nastavtabelaci", "nastavtabulky", "nastavtenkelinky", "nastavtext", "nastavtextovelinky", "nastavtexttexty", "nastavtextyupati", "nastavtextyzahlavi", "nastavtoleranci", "nastavtrideni", "nastavtype", "nastavumisteniprotejsku", "nastavumistovani", "nastavupati", "nastavupravu", "nastavurl", "nastavusporadani", "nastavvelikostpapiru", "nastavvsechnapole", "nastavvycty", "nastavvyplnovelinky", "nastavvyplnoveradky", "nastavvzhled", "nastavzahlavi", "nastavzakladnifont", "nastavznaceni", "nastavzuzeni", "nastrane", "naturalhbox", "naturalhpack", "naturalvbox", "naturalvcenter", "naturalvpack", "naturalvtop", "naturalwd", "negatecolorbox", "negated", "negthinspace", "nejakyradek", "nekde", "newattribute", "newcatcodetable", "newcounter", "newevery", "newfrenchspacing", "newmode", "newsignal", "newsystemmode", "nextbox", "nextboxdp", "nextboxht", "nextboxhtdp", "nextboxwd", "nextcounter", "nextcountervalue", "nextdepth", "nextparagraphs", "nextrealpage", "nextrealpagenumber", "nextsubcountervalue", "nextsubpage", "nextsubpagenumber", "nextuserpage", "nextuserpagenumber", "neznamo", "nivy", "nizky", "nobar", "nocitation", "nocite", "nodetostring", "noffigurepages", "noflines", "noflocalfloats", "noindentation", "noitem", "nokap", "nonfrenchspacing", "nonmathematics", "normal", "normalboldface", "normalframedwithsettings", "normalizebodyfontsize", "normalizedfontsize", "normalizefontdepth", "normalizefontheight", "normalizefontline", "normalizefontwidth", "normalizetextdepth", "normalizetextheight", "normalizetextline", "normalizetextwidth", "normaltypeface", "notesymbol", "ntimes", "numberofpoints", "obeydepth", "objectdepth", "objectheight", "objectmargin", "objectwidth", "obox", "obrazek", "obrazovka", "odkaz", "odkaznastranu", "odkaznatext", "odkazujici", "offset", "offsetbox", "onedigitrounding", "opis", "opissoubor", "oramovani", "oramovanytext", "ordinaldaynumber", "ordinalstr", "oref", "orez", "ornamenttext", "otocit", "outputfilename", "outputstreambox", "outputstreamcopy", "outputstreamunvbox", "outputstreamunvcopy", "over", "overbar", "overbars", "overbartext", "overbarunderbar", "overbrace", "overbracetext", "overbraceunderbrace", "overbracket", "overbrackettext", "overbracketunderbracket", "overlaybutton", "overlaycolor", "overlaydepth", "overlayfigure", "overlayheight", "overlaylinecolor", "overlaylinewidth", "overlayoffset", "overlayrollbutton", "overlaywidth", "overleftarrow", "overleftharpoondown", "overleftharpoonup", "overleftrightarrow", "overloaderror", "overparent", "overparenttext", "overparentunderparent", "overrightarrow", "overrightharpoondown", "overrightharpoonup", "overset", "overstrike", "overstrikes", "overtwoheadleftarrow", "overtwoheadrightarrow", "oznaceni", "pagearea", "pagebreak", "pagefigure", "pagegridspanwidth", "pageinjection", "pagestaterealpage", "paletsize", "pdfTeX", "pdfactualtext", "pdfbackendactualtext", "pdfbackendcurrentresources", "pdfbackendsetcatalog", "pdfbackendsetcolorspace", "pdfbackendsetextgstate", "pdfbackendsetinfo", "pdfbackendsetname", "pdfbackendsetpageattribute", "pdfbackendsetpageresource", "pdfbackendsetpagesattribute", "pdfbackendsetpattern", "pdfbackendsetshade", "pdfcolor", "pdfeTeX", "percent", "percentdimen", "permitcaretescape", "permitcircumflexescape", "permitspacesbetweengroups", "persiandecimals", "persiannumerals", "phantom", "phantombox", "pickupgroupedcommand", "pis", "placeattachments", "placebtxrendering", "placecitation", "placecomments", "placecurrentformulanumber", "placedbox", "placefloat", "placefloatwithsetups", "placeframed", "placeheadnumber", "placeheadtext", "placehelp", "placeinitial", "placelayer", "placelayeredtext", "placelistofpublications", "placelistofsorts", "placelistofsynonyms", "placelocalnotes", "placement", "placenamedfloat", "placenamedformula", "placenotes", "placepagenumber", "placepairedbox", "placeparallel", "placerawlist", "placerenderingwindow", "plnezneni", "podpodpodpodsekce", "podpodpodpodtema", "podpodpodsekce", "podpodpodtema", "podpodsekce", "podpodtema", "podsekce", "podtema", "pole", "polozka", "polozky", "popattribute", "popmacro", "popmode", "popsystemmode", "porovnejpaletu", "porovnejskupinubarev", "positionoverlay", "positionregionoverlay", "postponenotes", "pozadi", "pozice", "poznamka", "predefinedfont", "predefinefont", "predefinesymbol", "pref", "prefixedpagenumber", "prelozit", "prependetoks", "prependgvalue", "prependtocommalist", "prependtoks", "prependtoksonce", "prependvalue", "prepninazakladnifont", "presetdocument", "presetfieldsymbols", "preskoc", "pretocommalist", "prevcounter", "prevcountervalue", "preventmode", "prevrealpage", "prevrealpagenumber", "prevsubcountervalue", "prevsubpage", "prevsubpagenumber", "prevuserpage", "prevuserpagenumber", "prizpusobivepole", "prizpusobvzhled", "procent", "processMPbuffer", "processMPfigurefile", "processaction", "processallactionsinset", "processassignlist", "processassignmentcommand", "processassignmentlist", "processbetween", "processbodyfontenvironmentlist", "processcolorcomponents", "processcommacommand", "processcommalist", "processcommalistwithparameters", "processcontent", "processfile", "processfilemany", "processfilenone", "processfileonce", "processfirstactioninset", "processisolatedchars", "processisolatedwords", "processlinetablebuffer", "processlinetablefile", "processlist", "processmonth", "processranges", "processseparatedlist", "processtexbuffer", "processtokens", "processuntil", "processxtablebuffer", "processyear", "produkt", "profiledbox", "profilegivenbox", "program", "projekt", "prostredi", "pseudoMixedCapped", "pseudoSmallCapped", "pseudoSmallcapped", "pseudosmallcapped", "purenumber", "pushattribute", "pushbutton", "pushmacro", "pushmode", "pushoutputstream", "pushsystemmode", "qquad", "quad", "quads", "quitcommalist", "quitprevcommalist", "quittypescriptscanning", "raisebox", "randomizetext", "randomnumber", "rawcounter", "rawcountervalue", "rawdate", "rawdoifelseinset", "rawdoifinset", "rawdoifinsetelse", "rawgetparameters", "rawprocessaction", "rawprocesscommacommand", "rawprocesscommalist", "rawstructurelistuservariable", "rawsubcountervalue", "rbox", "readfile", "readfixfile", "readjobfile", "readlocfile", "readsetfile", "readsysfile", "readtexfile", "readxmlfile", "realSmallCapped", "realSmallcapped", "realpagenumber", "realsmallcapped", "recursedepth", "recurselevel", "recursestring", "redoconvertfont", "ref", "referenceprefix", "registerattachment", "registerctxluafile", "registerexternalfigure", "registerfontclass", "registerhyphenationexception", "registerhyphenationpattern", "registermenubuttons", "registersort", "registersynonym", "registerunit", "regular", "relatemarking", "relateparameterhandlers", "relaxvalueifundefined", "remainingcharacters", "removebottomthings", "removedepth", "removefromcommalist", "removelastskip", "removelastspace", "removemarkedcontent", "removepunctuation", "removesubstring", "removetoks", "removeunwantedspaces", "replacefeature", "replaceincommalist", "replaceword", "rescan", "rescanwithsetup", "resetMPdrawing", "resetMPenvironment", "resetMPinstance", "resetallattributes", "resetandaddfeature", "resetbar", "resetbreakpoints", "resetbuffer", "resetcharacteralign", "resetcharacterkerning", "resetcharacterspacing", "resetcharacterstripping", "resetcollector", "resetcounter", "resetdigitsmanipulation", "resetdirection", "resetfeature", "resetflag", "resetfontcolorsheme", "resetfontfallback", "resetfontsolution", "resethyphenationfeatures", "resetinjector", "resetinteractionmenu", "resetitaliccorrection", "resetlayer", "resetlocalfloats", "resetmarker", "resetmode", "resetpagenumber", "resetparallel", "resetpath", "resetpenalties", "resetprofile", "resetreference", "resetreplacement", "resetscript", "resetsetups", "resetshownsynonyms", "resetsubpagenumber", "resetsymbolset", "resetsystemmode", "resettimer", "resettrackers", "resettrialtypesetting", "resetusedsortings", "resetusedsynonyms", "resetuserpagenumber", "resetvalue", "resetvisualizers", "resetznaceni", "reshapebox", "resolvedglyphdirect", "resolvedglyphstyled", "restartcounter", "restorebox", "restorecatcodes", "restorecounter", "restorecurrentattributes", "restoreendofline", "restoreglobalbodyfont", "reusableMPgraphic", "reuseMPgraphic", "reuserandomseed", "revivefeature", "rfence", "rhbox", "right", "rightbottombox", "rightbox", "righthbox", "rightorleftpageaction", "rightskipadaption", "rightsubguillemot", "righttolefthbox", "righttoleftvbox", "righttoleftvtop", "righttopbox", "rimskecislice", "rlap", "robustaddtocommalist", "robustdoifelseinset", "robustdoifinsetelse", "robustpretocommalist", "rollbutton", "roman", "rozdelplvouciobjekt", "roztazene", "rtop", "ruledhbox", "ruledhpack", "ruledmbox", "ruledtopv", "ruledtpack", "ruledvbox", "ruledvpack", "ruledvtop", "runMPbuffer", "runninghbox", "safechar", "sans", "sansbold", "sansnormal", "sansserif", "savebox", "savebtxdataset", "savebuffer", "savecounter", "savecurrentattributes", "savenormalmeaning", "savetaggedtwopassdata", "savetwopassdata", "sbox", "schovejbloky", "sd", "secondoffivearguments", "secondoffourarguments", "secondofsixarguments", "secondofthreearguments", "secondofthreeunexpanded", "secondoftwoarguments", "secondoftwounexpanded", "sedabarva", "sekce", "select", "serializecommalist", "serializedcommalist", "serif", "serifbold", "serifnormal", "setJSpreamble", "setMPlayer", "setMPpositiongraphic", "setMPpositiongraphicrange", "setMPtext", "setMPvariable", "setMPvariables", "setbar", "setbigbodyfont", "setboxllx", "setboxlly", "setbreakpoints", "setcapstrut", "setcatcodetable", "setcharacteralign", "setcharactercasing", "setcharactercleaning", "setcharacterkerning", "setcharacterspacing", "setcharacterstripping", "setcharstrut", "setcollector", "setcolormodell", "setcounter", "setcounterown", "setcurrentfontclass", "setdataset", "setdefaultpenalties", "setdigitsmanipulation", "setdirection", "setdocumentargument", "setdocumentargumentdefault", "setdocumentfilename", "setdummyparameter", "setelementexporttag", "setemeasure", "setevalue", "setevariable", "setevariables", "setfirstline", "setflag", "setfont", "setfontcolorsheme", "setfontfeature", "setfontsolution", "setfontstrut", "setfractions", "setgmeasure", "setgvalue", "setgvariable", "setgvariables", "sethboxregister", "sethyphenatedurlafter", "sethyphenatedurlbefore", "sethyphenatedurlnormal", "sethyphenationfeatures", "setinitial", "setinjector", "setinteraction", "setinterfacecommand", "setinterfaceconstant", "setinterfaceelements", "setinterfacemessage", "setinterfacevariable", "setinternalrendering", "setitaliccorrection", "setlayer", "setlayerframed", "setlayertext", "setlinefiller", "setlocalhsize", "setmainbodyfont", "setmainparbuilder", "setmarker", "setmarking", "setmathstyle", "setmeasure", "setmessagetext", "setmode", "setnostrut", "setnote", "setnotetext", "setobject", "setoldstyle", "setpagegrid", "setpagereference", "setpagestate", "setpagestaterealpageno", "setpenalties", "setpercentdimen", "setposition", "setpositionbox", "setpositiondata", "setpositiondataplus", "setpositiononly", "setpositionplus", "setpositionstrut", "setprofile", "setrandomseed", "setreference", "setreferencedobject", "setregisterentry", "setreplacement", "setrigidcolumnbalance", "setrigidcolumnhsize", "setscript", "setsectionblock", "setsimplecolumnhsize", "setsmallbodyfont", "setsmallcaps", "setstackbox", "setstructurepageregister", "setstrut", "setsuperiors", "setsystemmode", "settabular", "settaggedmetadata", "settextcontent", "settightobject", "settightreferencedobject", "settightunreferencedobject", "settrialtypesetting", "setuevalue", "setugvalue", "setunreferencedobject", "setup", "setupMPgraphics", "setupMPinstance", "setupMPpage", "setupMPvariables", "setupTABLE", "setupTEXpage", "setupattachment", "setupbackend", "setupbar", "setupbleeding", "setupbookmark", "setupbtx", "setupbtxdataset", "setupbtxlist", "setupbtxregister", "setupbtxrendering", "setupbutton", "setupcharacterkerning", "setupcharacterspacing", "setupchemical", "setupchemicalframed", "setupcollector", "setupcolumnspan", "setupcombination", "setupcounter", "setupdataset", "setupdelimitedtext", "setupdescription", "setupdirections", "setupdocument", "setupeffect", "setupenumeration", "setupenv", "setupexport", "setupexternalfigure", "setupexternalsoundtracks", "setupfieldbody", "setupfieldcategory", "setupfieldcontentframed", "setupfieldlabelframed", "setupfieldtotalframed", "setupfiller", "setupfirstline", "setupfittingpage", "setupfloatcaption", "setupfontexpansion", "setupfontprotrusion", "setupfonts", "setupfontsolution", "setupforms", "setupformula", "setupformulaframed", "setupframedcontent", "setupframedtext", "setupglobalreferenceprefix", "setupheadalternative", "setuphelp", "setuphigh", "setuphighlight", "setuphyphenation", "setupindentedtext", "setupinitial", "setupinsertion", "setupitaliccorrection", "setupitemgroup", "setuplabel", "setuplayer", "setuplayeredtext", "setuplayouttext", "setuplinefiller", "setuplinefillers", "setuplinenote", "setuplinetable", "setuplistalternative", "setuplistextra", "setuplocalfloats", "setuplocalinterlinespace", "setuplow", "setuplowhigh", "setuplowmidhigh", "setupmarginblock", "setupmargindata", "setupmarginframed", "setupmarginrule", "setupmathalignment", "setupmathcases", "setupmathematics", "setupmathfence", "setupmathfraction", "setupmathframed", "setupmathmatrix", "setupmathornament", "setupmathradical", "setupmathstackers", "setupmathstyle", "setupmixedcolumns", "setupmodule", "setupnotation", "setupnotations", "setupnote", "setupnotes", "setupoffset", "setupoffsetbox", "setupoutputroutine", "setuppagechecker", "setuppagegrid", "setuppagegridarea", "setuppagegridareatext", "setuppagegridlines", "setuppagegridspan", "setuppagegridstart", "setuppageinjection", "setuppageinjectionalternative", "setuppageshift", "setuppagestate", "setuppairedbox", "setuppaper", "setupparagraph", "setupparagraphintro", "setupparallel", "setupperiods", "setupplacement", "setuppositionbar", "setupprocessor", "setupprofile", "setupquotation", "setuprealpagenumber", "setupreferenceformat", "setupreferenceprefix", "setupreferencestructureprefix", "setupregisters", "setuprenderingwindow", "setups", "setupscale", "setupscript", "setupscripts", "setupselector", "setupshift", "setupsidebar", "setupspellchecking", "setupstartstop", "setupstretched", "setupstruts", "setupstyle", "setupsubformula", "setuptabulation", "setuptagging", "setuptextbackground", "setuptextflow", "setuptooltip", "setupunit", "setupuserpagenumber", "setupversion", "setupviewerlayer", "setupvspacing", "setupwithargument", "setupwithargumentswapped", "setupxml", "setupxtable", "setuvalue", "setuxvalue", "setvalue", "setvariable", "setvariables", "setvboxregister", "setvisualizerfont", "setvtopregister", "setwidthof", "setxmeasure", "setxvalue", "setxvariable", "setxvariables", "sfrac", "shapedhbox", "showallmakeup", "showattributes", "showboxes", "showbtxdatasetauthors", "showbtxdatasetcompleteness", "showbtxdatasetfields", "showbtxfields", "showbtxhashedauthors", "showbtxtables", "showchardata", "showcharratio", "showcolorbar", "showcolorcomponents", "showcolorset", "showcolorstruts", "showcounter", "showdirectives", "showdirsinmargin", "showedebuginfo", "showexperiments", "showfont", "showfontdata", "showfontkerns", "showfontparameters", "showfontstrip", "showfontstyle", "showglyphs", "showgridsnapping", "showhelp", "showhyphenationtrace", "showhyphens", "showinjector", "showjustification", "showkerning", "showlayoutcomponents", "showligature", "showligatures", "showlogcategories", "showmargins", "showmessage", "showminimalbaseline", "shownextbox", "showotfcomposition", "showparentchain", "showsetupsdefinition", "showtimer", "showtokens", "showtrackers", "showvalue", "showvariable", "showwarning", "simplegroupedcommand", "singalcharacteralign", "singlebond", "sixthofsixarguments", "skryt", "slanted", "slantedbold", "slicepages", "sloupec", "slovenianNumerals", "sloveniannumerals", "small", "smallbodyfont", "smallbold", "smallbolditalic", "smallboldslanted", "smallcappedcharacters", "smallcappedromannumerals", "smaller", "smallitalicbold", "smallnormal", "smallskip", "smallslanted", "smallslantedbold", "smalltype", "smash", "smashbox", "smashboxed", "smashedhbox", "smashedvbox", "snaptogrid", "someheadnumber", "somekindoftab", "somelocalfloat", "somenamedheadnumber", "someplace", "sp", "spanishNumerals", "spanishnumerals", "speech", "splitatasterisk", "splitatcolon", "splitatcolons", "splitatcomma", "splitdfrac", "splitfilename", "splitfrac", "splitoffbase", "splitofffull", "splitoffkind", "splitoffname", "splitoffpath", "splitoffroot", "splitofftokens", "splitofftype", "splitstring", "spreadhbox", "sqrt", "stackrel", "stanovcharakteristickuseznamu", "stanovcislonadpisu", "startJScode", "startJSpreamble", "startMPclip", "startMPcode", "startMPdefinitions", "startMPdrawing", "startMPenvironment", "startMPextensions", "startMPinclusions", "startMPinitializations", "startMPpage", "startMPpositiongraphic", "startMPpositionmethod", "startMPrun", "startTABLE", "startTABLEbody", "startTABLEfoot", "startTABLEhead", "startTABLEnext", "startTC", "startTD", "startTDs", "startTEXpage", "startTH", "startTN", "startTR", "startTRs", "startTX", "startTY", "startallmodes", "startarrangedpages", "startaside", "startattachment", "startbar", "startbarva", "startbinom", "startbitmapimage", "startblockquote", "startbtxrenderingdefinitions", "startbuffer", "startbutton", "startcatcodetable", "startcharacteralign", "startcheckedfences", "startchemical", "startcitace", "startcitovat", "startcollect", "startcollecting", "startcolorintent", "startcoloronly", "startcolorset", "startcolumns", "startcolumnspan", "startcombination", "startcomment", "startcontextcode", "startcontextdefinitioncode", "startctxfunction", "startctxfunctiondefinition", "startcurrentcolor", "startcurrentlistentrywrapper", "startdbinom", "startdelimited", "startdelimitedtext", "startdfrac", "startdisplaymath", "startdmath", "startdocument", "starteffect", "startelement", "startembeddedxtable", "startendofline", "startexceptions", "startexpanded", "startexpandedcollect", "startextendedcatcodetable", "startexternalfigurecollection", "startfigure", "startfitfieldframed", "startfittingpage", "startfloatcombination", "startfont", "startfontclass", "startfontsolution", "startformula", "startformulas", "startfrac", "startframedcontent", "startframedtext", "startgraf", "startgridsnapping", "starthbox", "starthboxestohbox", "starthboxregister", "starthelptext", "starthiddenbar", "starthiding", "starthighlight", "starthyphenation", "startimath", "startindentation", "startindentedtext", "startinmframed", "startinteraction", "startinteraktivnimenu", "startinterface", "startintermezzo", "startintertext", "startitemgroup", "startjdina", "startkapitola", "startknockout", "startkomentar", "startkomponenta", "startlayout", "startlinecorrection", "startlinefiller", "startlinenumbering", "startlinetable", "startlinetablebody", "startlinetablecell", "startlinetablehead", "startlocalfootnotes", "startlocalheadsetup", "startlocallinecorrection", "startlocalnotes", "startlocalsetups", "startlua", "startluacode", "startluaparameterset", "startluasetups", "startmakeup", "startmarginalnilinka", "startmarginblock", "startmarkedcontent", "startmathmode", "startmathstyle", "startmatrices", "startmcframed", "startmdformula", "startmframed", "startmixedcolumns", "startmode", "startmodeset", "startmodule", "startmoduletestsection", "startmpformula", "startnadpis", "startnadtrzeni", "startnadtrzeno", "startnamedsection", "startnamedsubformulas", "startnarrow", "startnarrower", "startnegative", "startnicelyfilledbox", "startnobar", "startnointerference", "startnotallmodes", "startnotext", "startnotmode", "startobrazek", "startopposite", "startoramovani", "startoramovanytext", "startoutputstream", "startoverlay", "startoverprint", "startpagecomment", "startpagefigure", "startpagegrid", "startpagegridspan", "startpagelayout", "startpar", "startparagraph", "startparagraphs", "startparagraphscell", "startparbuilder", "startpath", "startplacepairedbox", "startpodpodpodpodsekce", "startpodpodpodpodtema", "startpodpodpodsekce", "startpodpodpodtema", "startpodpodsekce", "startpodpodtema", "startpodsekce", "startpodtema", "startpodtrzeni", "startpodtrzeno", "startpolozka", "startpositioning", "startpositionoverlay", "startpositive", "startpostponing", "startpozadi", "startpreskrtnuti", "startpreskrtnuto", "startprocessassignmentcommand", "startprocessassignmentlist", "startprocesscommacommand", "startprocesscommalist", "startprodukt", "startprojekt", "startprostredi", "startprotect", "startprotectedcolors", "startpublikace", "startpunctuation", "startradek", "startrandomized", "startrandomseed", "startrawsetups", "startreadingfile", "startreferenceprefix", "startregime", "startregister", "startreusableMPgraphic", "startscript", "startsdformula", "startsectionblock", "startsectionblockenvironment", "startsectionlevel", "startsekce", "startsetups", "startsfrac", "startshapebox", "startshift", "startsidebar", "startsimplecolumns", "startspecialitem", "startspeech", "startspformula", "startspread", "startstartstop", "startstaticMPfigure", "startstaticMPgraphic", "startstrictinspectnextcharacter", "startstructurepageregister", "startstrut", "startstyle", "startsubformulas", "startsubjectlevel", "startsubsentence", "startsubstack", "startsymbolset", "starttable", "starttablehead", "starttables", "starttabletail", "starttabulate", "starttabulatehead", "starttabulatetail", "starttabulka", "starttagged", "starttbinom", "starttema", "starttexcode", "starttexdefinition", "starttext", "starttextbackground", "starttextbackgroundmanual", "starttextcolor", "starttextcolorintent", "starttextflow", "starttextnapovedy", "starttextovalinka", "starttitul", "starttokens", "starttransparent", "starttypescript", "starttypescriptcollection", "startumistirovnici", "startunderdash", "startunderdashes", "startunderdot", "startunderdots", "startunderrandom", "startunderrandoms", "startunderstrike", "startunderstrikes", "startunframed", "startuniqueMPgraphic", "startuniqueMPpagegraphic", "startunpacked", "startusableMPgraphic", "startuseMPgraphic", "startusemathstyleparameter", "startusingbtxspecification", "startvbox", "startvboxregister", "startvboxtohbox", "startvboxtohboxseparator", "startviewerlayer", "startvtop", "startvtopregister", "startvycet", "startxcell", "startxcellgroup", "startxfrac", "startxgroup", "startxmldisplayverbatim", "startxmlinlineverbatim", "startxmlraw", "startxmlsetups", "startxrow", "startxrowgroup", "startxtable", "startxtablebody", "startxtablefoot", "startxtablehead", "startxtablenext", "startxxfrac", "startzhustene", "stopJScode", "stopJSpreamble", "stopMPclip", "stopMPcode", "stopMPdefinitions", "stopMPdrawing", "stopMPenvironment", "stopMPextensions", "stopMPinclusions", "stopMPinitializations", "stopMPpage", "stopMPpositiongraphic", "stopMPpositionmethod", "stopMPrun", "stopTABLE", "stopTABLEbody", "stopTABLEfoot", "stopTABLEhead", "stopTABLEnext", "stopTC", "stopTD", "stopTDs", "stopTEXpage", "stopTH", "stopTN", "stopTR", "stopTRs", "stopTX", "stopTY", "stopallmodes", "stoparrangedpages", "stopaside", "stopattachment", "stopbar", "stopbarva", "stopbinom", "stopbitmapimage", "stopblockquote", "stopbtxrenderingdefinitions", "stopbuffer", "stopbutton", "stopcatcodetable", "stopcharacteralign", "stopcheckedfences", "stopchemical", "stopcitace", "stopcitovat", "stopcollect", "stopcollecting", "stopcolorintent", "stopcoloronly", "stopcolorset", "stopcolumns", "stopcolumnspan", "stopcombination", "stopcomment", "stopcontextcode", "stopcontextdefinitioncode", "stopctxfunction", "stopctxfunctiondefinition", "stopcurrentcolor", "stopcurrentlistentrywrapper", "stopdbinom", "stopdelimited", "stopdelimitedtext", "stopdfrac", "stopdisplaymath", "stopdmath", "stopdocument", "stopeffect", "stopelement", "stopembeddedxtable", "stopendofline", "stopexceptions", "stopexpanded", "stopexpandedcollect", "stopextendedcatcodetable", "stopexternalfigurecollection", "stopfigure", "stopfitfieldframed", "stopfittingpage", "stopfloatcombination", "stopfont", "stopfontclass", "stopfontsolution", "stopformula", "stopformulas", "stopfrac", "stopframedcontent", "stopframedtext", "stopgraf", "stopgridsnapping", "stophbox", "stophboxestohbox", "stophboxregister", "stophelptext", "stophiddenbar", "stophiding", "stophighlight", "stophyphenation", "stopimath", "stopindentation", "stopindentedtext", "stopinmframed", "stopinteraction", "stopinteraktivnimenu", "stopinterface", "stopintermezzo", "stopintertext", "stopitemgroup", "stopjdina", "stopkapitola", "stopknockout", "stopkomentar", "stopkomponenta", "stoplayout", "stoplinecorrection", "stoplinefiller", "stoplinenumbering", "stoplinetable", "stoplinetablebody", "stoplinetablecell", "stoplinetablehead", "stoplocalfootnotes", "stoplocalheadsetup", "stoplocallinecorrection", "stoplocalnotes", "stoplocalsetups", "stoplua", "stopluacode", "stopluaparameterset", "stopluasetups", "stopmakeup", "stopmarginalnilinka", "stopmarginblock", "stopmarkedcontent", "stopmathmode", "stopmathstyle", "stopmatrices", "stopmcframed", "stopmdformula", "stopmframed", "stopmixedcolumns", "stopmode", "stopmodeset", "stopmodule", "stopmoduletestsection", "stopmpformula", "stopnadpis", "stopnadtrzeni", "stopnadtrzeno", "stopnamedsection", "stopnamedsubformulas", "stopnarrow", "stopnarrower", "stopnegative", "stopnicelyfilledbox", "stopnobar", "stopnointerference", "stopnotallmodes", "stopnotext", "stopnotmode", "stopobrazek", "stopopposite", "stoporamovani", "stoporamovanytext", "stopoutputstream", "stopoverlay", "stopoverprint", "stoppagecomment", "stoppagefigure", "stoppagegrid", "stoppagegridspan", "stoppagelayout", "stoppar", "stopparagraph", "stopparagraphs", "stopparagraphscell", "stopparbuilder", "stoppath", "stopplacepairedbox", "stoppodpodpodpodsekce", "stoppodpodpodpodtema", "stoppodpodpodsekce", "stoppodpodpodtema", "stoppodpodsekce", "stoppodpodtema", "stoppodsekce", "stoppodtema", "stoppodtrzeni", "stoppodtrzeno", "stoppolozka", "stoppositioning", "stoppositionoverlay", "stoppositive", "stoppostponing", "stoppozadi", "stoppreskrtnuti", "stoppreskrtnuto", "stopprocessassignmentcommand", "stopprocessassignmentlist", "stopprocesscommacommand", "stopprocesscommalist", "stopprodukt", "stopprojekt", "stopprostredi", "stopprotect", "stopprotectedcolors", "stoppublikace", "stoppunctuation", "stopradek", "stoprandomized", "stoprandomseed", "stoprawsetups", "stopreadingfile", "stopreferenceprefix", "stopregime", "stopregister", "stopreusableMPgraphic", "stopscript", "stopsdformula", "stopsectionblock", "stopsectionblockenvironment", "stopsectionlevel", "stopsekce", "stopsetups", "stopsfrac", "stopshapebox", "stopshift", "stopsidebar", "stopsimplecolumns", "stopspecialitem", "stopspeech", "stopspformula", "stopspread", "stopstartstop", "stopstaticMPfigure", "stopstaticMPgraphic", "stopstrictinspectnextcharacter", "stopstructurepageregister", "stopstrut", "stopstyle", "stopsubformulas", "stopsubjectlevel", "stopsubsentence", "stopsubstack", "stopsymbolset", "stoptable", "stoptablehead", "stoptables", "stoptabletail", "stoptabulate", "stoptabulatehead", "stoptabulatetail", "stoptabulka", "stoptagged", "stoptbinom", "stoptema", "stoptexcode", "stoptexdefinition", "stoptext", "stoptextbackground", "stoptextbackgroundmanual", "stoptextcolor", "stoptextcolorintent", "stoptextflow", "stoptextnapovedy", "stoptextovalinka", "stoptitul", "stoptokens", "stoptransparent", "stoptypescript", "stoptypescriptcollection", "stopumistirovnici", "stopunderdash", "stopunderdashes", "stopunderdot", "stopunderdots", "stopunderrandom", "stopunderrandoms", "stopunderstrike", "stopunderstrikes", "stopunframed", "stopuniqueMPgraphic", "stopuniqueMPpagegraphic", "stopunpacked", "stopusableMPgraphic", "stopuseMPgraphic", "stopusemathstyleparameter", "stopusingbtxspecification", "stopvbox", "stopvboxregister", "stopvboxtohbox", "stopvboxtohboxseparator", "stopviewerlayer", "stopvtop", "stopvtopregister", "stopvycet", "stopxcell", "stopxcellgroup", "stopxfrac", "stopxgroup", "stopxmldisplayverbatim", "stopxmlinlineverbatim", "stopxmlraw", "stopxmlsetups", "stopxrow", "stopxrowgroup", "stopxtable", "stopxtablebody", "stopxtablefoot", "stopxtablehead", "stopxtablenext", "stopxxfrac", "stopzhustene", "strana", "strictdoifelsenextoptional", "strictdoifnextoptionalelse", "stripcharacter", "strippedcsname", "stripspaces", "structurelistuservariable", "structurenumber", "structuretitle", "structureuservariable", "structurevariable", "strut", "strutdp", "strutht", "struthtdp", "struttedbox", "strutwd", "style", "styleinstance", "subpagenumber", "subsentence", "substituteincommalist", "subtractfeature", "swapcounts", "swapdimens", "swapface", "swapmacros", "swaptypeface", "switchstyleonly", "switchtocolor", "switchtointerlinespace", "symbol", "symbolreference", "synchronizeblank", "synchronizeindenting", "synchronizemarking", "synchronizeoutputstreams", "synchronizestrut", "synchronizewhitespace", "systemlog", "systemlogfirst", "systemloglast", "systemsetups", "tLeftarrow", "tLeftrightarrow", "tRightarrow", "tabulateautoline", "tabulateautorule", "tabulateline", "tabulaterule", "tabulka", "taggedctxcommand", "taggedlabeltexts", "tbinom", "tbox", "tecky", "tema", "tenkalinka", "tenkelinky", "tequal", "testandsplitstring", "testcolumn", "testfeature", "testfeatureonce", "testpage", "testpageonly", "testpagesync", "testtokens", "tex", "texdefinition", "texsetup", "textcitation", "textcite", "textcontrolspace", "textflowcollector", "textmath", "textminus", "textnapovedy", "textormathchar", "textovalinka", "textplus", "textvisiblespace", "tfrac", "thainumerals", "thefirstcharacter", "thenormalizedbodyfontsize", "theremainingcharacters", "thickspace", "thinspace", "thirdoffivearguments", "thirdoffourarguments", "thirdofsixarguments", "thirdofthreearguments", "thirdofthreeunexpanded", "thookleftarrow", "thookrightarrow", "threedigitrounding", "tibetannumerals", "tightlayer", "tinyfont", "titul", "tlacitko", "tlacitkomenu", "tlap", "tleftarrow", "tleftharpoondown", "tleftharpoonup", "tleftrightarrow", "tleftrightharpoons", "tloustkacary", "tmapsto", "tochar", "tolinenote", "topbox", "topleftbox", "toplinebox", "toprightbox", "topskippedbox", "tracecatcodetables", "tracedfontname", "traceoutputroutines", "tracepositions", "transparencycomponents", "transparent", "tref", "trel", "trightarrow", "trightharpoondown", "trightharpoonup", "trightleftharpoons", "trightoverleftarrow", "triplebond", "truefilename", "truefontname", "ttriplerel", "ttwoheadleftarrow", "ttwoheadrightarrow", "tvrdamezera", "tvrdemezery", "twodigitrounding", "tx", "txx", "typebuffer", "typedefinedbuffer", "typeface", "typescriptone", "typescriptprefix", "typescriptthree", "typescripttwo", "typesetbuffer", "typesetfile", "uconvertnumber", "uedcatcodecommand", "ukazbarvu", "ukazmrizku", "ukaznastaveni", "ukazpaletu", "ukazpodpery", "ukazpostredizakladnihofontu", "ukazramecek", "ukazsadusymbolu", "ukazskupinubarev", "ukazupravu", "ukazvytisk", "ukazvzhled", "ukazzakladnifont", "umistikombinovanyseznam", "umistilokalnipoznamkypodcarou", "umistinadsebe", "umistinamrizku", "umistipodrovnici", "umistipoznamkypodcarou", "umistirejstrik", "umistirovnici", "umistiseznam", "umistivedlesebe", "umistizalozky", "undefinevalue", "undepthed", "underbar", "underbars", "underbartext", "underbrace", "underbracetext", "underbracket", "underbrackettext", "underdash", "underdashes", "underdot", "underdots", "underleftarrow", "underleftharpoondown", "underleftharpoonup", "underleftrightarrow", "underparent", "underparenttext", "underrandom", "underrandoms", "underrightarrow", "underrightharpoondown", "underrightharpoonup", "underset", "understrike", "understrikes", "undertwoheadleftarrow", "undertwoheadrightarrow", "undoassign", "unframed", "unhhbox", "unihex", "uniqueMPgraphic", "uniqueMPpagegraphic", "unprotected", "unregisterhyphenationpattern", "unspaceafter", "unspaceargument", "unspaced", "unspacestring", "untexargument", "untexcommand", "uppercased", "uppercasestring", "upperleftdoubleninequote", "upperleftdoublesixquote", "upperleftsingleninequote", "upperleftsinglesixquote", "upperrightdoubleninequote", "upperrightdoublesixquote", "upperrightsingleninequote", "upperrightsinglesixquote", "urcicharakteristikurejstriku", "url", "useMPenvironmentbuffer", "useMPgraphic", "useMPlibrary", "useMPrun", "useMPvariables", "useblankparameter", "usebodyfont", "usebodyfontparameter", "usebtxdataset", "usebtxdefinitions", "usecolors", "usecomponent", "usedummycolorparameter", "usedummystyleandcolor", "usedummystyleparameter", "useenvironment", "useexternalrendering", "usefigurebase", "usefile", "usegridparameter", "useindentingparameter", "useindentnextparameter", "useinterlinespaceparameter", "uselanguageparameter", "useluamodule", "usemathstyleparameter", "useproduct", "useprofileparameter", "useproject", "usereferenceparameter", "userpagenumber", "usesetupsparameter", "usestaticMPfigure", "usesubpath", "usetexmodule", "usetypescript", "usetypescriptfile", "usezipfile", "utfchar", "utflower", "utfupper", "utilityregisterlength", "uzijJSscripts", "uzijURL", "uzijadresar", "uzijbloky", "uzijexternidokument", "uzijexterniobraz", "uzijexternizvuk", "uzijmodul", "uzijsymbol", "uzijurl", "vboxreference", "verbatim", "verbatimstring", "verbosenumber", "verticalgrowingbar", "verticalpositionbar", "verze", "vglue", "viewerlayer", "vl", "vlasovalinka", "vphantom", "vpos", "vradku", "vsedniden", "vsmash", "vsmashbox", "vsmashed", "vspace", "vspacing", "vyberbloky", "vycet", "vyplnenytext", "vyplnovelinky", "vyplnovyradek", "vysoky", "wdofstring", "widthofstring", "widthspanningtext", "withoutpt", "word", "words", "wordtonumber", "writedatatolist", "writestatus", "xLeftarrow", "xLeftrightarrow", "xRightarrow", "xdefconvertedargument", "xequal", "xfrac", "xhookleftarrow", "xhookrightarrow", "xleftarrow", "xleftharpoondown", "xleftharpoonup", "xleftrightarrow", "xleftrightharpoons", "xmapsto", "xmladdindex", "xmlafterdocumentsetup", "xmlaftersetup", "xmlall", "xmlappenddocumentsetup", "xmlappendsetup", "xmlapplyselectors", "xmlatt", "xmlattdef", "xmlattribute", "xmlattributedef", "xmlbadinclusions", "xmlbeforedocumentsetup", "xmlbeforesetup", "xmlchainatt", "xmlchainattdef", "xmlchecknamespace", "xmlcommand", "xmlconcat", "xmlconcatrange", "xmlcontext", "xmlcount", "xmldefaulttotext", "xmldirectives", "xmldirectivesafter", "xmldirectivesbefore", "xmldisplayverbatim", "xmldoif", "xmldoifelse", "xmldoifelseempty", "xmldoifelseselfempty", "xmldoifelsetext", "xmldoifelsevalue", "xmldoifnot", "xmldoifnotselfempty", "xmldoifnottext", "xmldoifselfempty", "xmldoiftext", "xmlelement", "xmlfilter", "xmlfirst", "xmlflush", "xmlflushcontext", "xmlflushdocumentsetups", "xmlflushlinewise", "xmlflushpure", "xmlflushspacewise", "xmlflushtext", "xmlinclude", "xmlinclusion", "xmlinclusions", "xmlinfo", "xmlinjector", "xmlinlineverbatim", "xmlinstalldirective", "xmllast", "xmllastatt", "xmllastmatch", "xmlloadbuffer", "xmlloaddata", "xmlloaddirectives", "xmlloadfile", "xmlloadonly", "xmlmain", "xmlmapvalue", "xmlname", "xmlnamespace", "xmlnonspace", "xmlpath", "xmlpos", "xmlposition", "xmlprependdocumentsetup", "xmlprependsetup", "xmlprettyprint", "xmlprocessbuffer", "xmlprocessdata", "xmlprocessfile", "xmlpure", "xmlraw", "xmlrefatt", "xmlregistereddocumentsetups", "xmlregisteredsetups", "xmlregisterns", "xmlremapname", "xmlremapnamespace", "xmlremovedocumentsetup", "xmlremovesetup", "xmlresetdocumentsetups", "xmlresetinjectors", "xmlresetsetups", "xmlsave", "xmlsetentity", "xmlsetfunction", "xmlsetinjectors", "xmlsetsetup", "xmlsetup", "xmlshow", "xmlsnippet", "xmlstrip", "xmlstripnolines", "xmlstripped", "xmlstrippednolines", "xmltag", "xmltexentity", "xmltext", "xmltobuffer", "xmltobufferverbose", "xmltofile", "xmlvalue", "xmlverbatim", "xrel", "xrightarrow", "xrightharpoondown", "xrightharpoonup", "xrightleftharpoons", "xrightoverleftarrow", "xsplitstring", "xtriplerel", "xtwoheadleftarrow", "xtwoheadrightarrow", "xxfrac", "xypos", "zachovejbloky", "zadnamezera", "zadnehorniadolniradky", "zadnezahlaviaupati", "zalozka", "zapisdoseznamu", "zapismeziseznam", "zaramovani", "zasobnikpoli", "ziskejbuffer", "ziskejznaceni", "znaceni", "znak", "znaky", "zpracujbloky", "zrcadlit", "zref" }, - ["de"]={ "AMSTEX", "AfterPar", "Alphabeticnumerals", "AmSTeX", "And", "BeforePar", "Big", "Bigg", "Biggl", "Biggm", "Biggr", "Bigl", "Bigm", "Bigr", "Buchstabe", "Buchstaben", "CONTEXT", "Caps", "ConTeXt", "Context", "ConvertConstantAfter", "ConvertToConstant", "ETEX", "EveryLine", "EveryPar", "GetPar", "GotoPar", "Greeknumerals", "INRSTEX", "Kap", "LAMSTEX", "LATEX", "LUAJITTEX", "LUATEX", "LaTeX", "LamSTeX", "Lua", "LuaTeX", "LuajitTeX", "METAFONT", "METAFUN", "METAPOST", "MKII", "MKIV", "MKIX", "MKVI", "MKXI", "MONAT", "MONTHLONG", "MONTHSHORT", "MPII", "MPIV", "MPVI", "MPanchor", "MPbetex", "MPc", "MPcode", "MPcolor", "MPcoloronly", "MPcolumn", "MPd", "MPdrawing", "MPfontsizehskip", "MPgetmultipars", "MPgetmultishape", "MPgetposboxes", "MPh", "MPinclusions", "MPleftskip", "MPll", "MPlr", "MPls", "MPmenubuttons", "MPn", "MPoptions", "MPoverlayanchor", "MPp", "MPpage", "MPpardata", "MPplus", "MPpos", "MPpositiongraphic", "MPposset", "MPr", "MPrawvar", "MPregion", "MPrest", "MPrightskip", "MPrs", "MPstring", "MPtext", "MPtransparency", "MPul", "MPur", "MPv", "MPvar", "MPvariable", "MPvv", "MPw", "MPwhd", "MPx", "MPxy", "MPxywhd", "MPy", "MetaFont", "MetaFun", "MetaPost", "NormalizeFontHeight", "NormalizeFontWidth", "NormalizeTextHeight", "NormalizeTextWidth", "PDFETEX", "PDFTEX", "PDFcolor", "PICTEX", "PPCHTEX", "PPCHTeX", "PRAGMA", "PiCTeX", "PointsToBigPoints", "PointsToReal", "PointsToWholeBigPoints", "PtToCm", "ReadFile", "Roemischezahlen", "ScaledPointsToBigPoints", "ScaledPointsToWholeBigPoints", "Smallcapped", "TABLE", "TEX", "TEXpage", "TaBlE", "TeX", "TheNormalizedFontSize", "TransparencyHack", "VerboseNumber", "WOCHENTAG", "WOERTER", "WORT", "WidthSpanningText", "Woerter", "Wort", "XETEX", "XeTeX", "Ziffern", "abbildung", "abjadnaivenumerals", "abjadnodotnumerals", "abjadnumerals", "absatz", "activatespacehandler", "adaptcollector", "adaptfontfeature", "adaptpapersize", "addfeature", "addtoJSpreamble", "addtocommalist", "addvalue", "aftersplitstring", "aftertestandsplitstring", "alignmentcharacter", "allinputpaths", "alphabeticnumerals", "alwayscitation", "alwayscite", "amgitterausrichten", "ampersand", "anchor", "appendetoks", "appendgvalue", "appendtocommalist", "appendtoks", "appendtoksonce", "appendvalue", "apply", "applyalternativestyle", "applyprocessor", "applytocharacters", "applytofirstcharacter", "applytosplitstringchar", "applytosplitstringcharspaced", "applytosplitstringline", "applytosplitstringlinespaced", "applytosplitstringword", "applytosplitstringwordspaced", "applytowords", "arabicdecimals", "arabicexnumerals", "arabicnumerals", "arg", "asciistr", "aside", "assignalfadimension", "assigndimen", "assigndimension", "assignifempty", "assigntranslation", "assignvalue", "assignwidth", "assumelongusagecs", "astype", "attachment", "aufseite", "aufzaehlung", "ausfuelltext", "ausschnitt", "autocap", "autodirhbox", "autodirvbox", "autodirvtop", "autoinsertnextspace", "automathematics", "autosetups", "availablehsize", "averagecharwidth", "backgroundimage", "backgroundimagefill", "backgroundline", "basegrid", "baselineleftbox", "baselinemiddlebox", "baselinerightbox", "bbox", "bearbeitebloecke", "beforesplitstring", "beforetestandsplitstring", "behaltebloecke", "bei", "bemerkung", "benutzeverzeichnis", "beschriftung", "bestimmekopfnummer", "bestimmelistencharakeristika", "bestimmeregistercharakteristika", "big", "bigbodyfont", "bigg", "bigger", "biggl", "biggm", "biggr", "bigl", "bigm", "bigr", "bigskip", "bildschirm", "binom", "bitmapimage", "blanko", "blap", "bleed", "bleedheight", "bleedwidth", "blockligatures", "blockquote", "bodyfontenvironmentlist", "bodyfontsize", "bold", "boldface", "bolditalic", "boldslanted", "bookmark", "booleanmodevalue", "bottombox", "bottomleftbox", "bottomrightbox", "boxcursor", "boxmarker", "boxofsize", "boxreference", "bpos", "bthiddencitation", "btxabbreviatedjournal", "btxaddjournal", "btxalwayscitation", "btxauthorfield", "btxdetail", "btxdirect", "btxdoif", "btxdoifcombiinlistelse", "btxdoifelse", "btxdoifelsecombiinlist", "btxdoifelsesameasprevious", "btxdoifelsesameaspreviouschecked", "btxdoifelseuservariable", "btxdoifnot", "btxdoifsameaspreviouscheckedelse", "btxdoifsameaspreviouselse", "btxdoifuservariableelse", "btxexpandedjournal", "btxfield", "btxfieldname", "btxfieldtype", "btxfirstofrange", "btxflush", "btxflushauthor", "btxflushauthorinverted", "btxflushauthorinvertedshort", "btxflushauthorname", "btxflushauthornormal", "btxflushauthornormalshort", "btxflushsuffix", "btxfoundname", "btxfoundtype", "btxhybridcite", "btxlistcitation", "btxloadjournalist", "btxoneorrange", "btxremapauthor", "btxsavejournalist", "btxsetup", "btxsingularorplural", "btxsingularplural", "btxtextcitation", "buchstabe", "buchstaben", "calligraphic", "camel", "catcodetablename", "cbox", "centerbox", "centeredbox", "centerednextbox", "cfrac", "chardescription", "charwidthlanguage", "checkcharacteralign", "checkedchar", "checkedfiller", "checkedstrippedcsname", "checkinjector", "checknextindentation", "checknextinjector", "checkpage", "checkparameters", "checkpreviousinjector", "checksoundtrack", "checktwopassdata", "checkvariables", "chem", "chemical", "chemicalbottext", "chemicalmidtext", "chemicalsymbol", "chemicaltext", "chemicaltoptext", "chineseallnumerals", "chinesecapnumerals", "chinesenumerals", "citation", "cite", "clap", "classfont", "cldcommand", "cldcontext", "cldloadfile", "cldprocessfile", "cleftarrow", "collect", "collectedtext", "collectexpanded", "colorcomponents", "colored", "coloronly", "columnbreak", "combinepages", "commalistelement", "commalistsentence", "commalistsize", "comment", "comparedimension", "comparedimensioneps", "completebtxrendering", "completelist", "completelistofpublications", "completelistofsorts", "completelistofsynonyms", "completepagenumber", "completeregister", "complexorsimple", "complexorsimpleempty", "composedcollector", "composedlayer", "compresult", "constantdimen", "constantdimenargument", "constantemptyargument", "constantnumber", "constantnumberargument", "contentreference", "continuednumber", "continueifinputfile", "convertargument", "convertcommand", "convertedcounter", "converteddimen", "convertedsubcounter", "convertmonth", "convertvalue", "convertvboxtohbox", "copypages", "copyparameters", "copyposition", "countersubs", "counttoken", "counttokens", "cramped", "crampedclap", "crampedllap", "crampedrlap", "crightarrow", "crightoverleftarrow", "ctop", "ctxcommand", "ctxdirectcommand", "ctxdirectlua", "ctxfunction", "ctxlatecommand", "ctxlatelua", "ctxloadluafile", "ctxlua", "ctxluabuffer", "ctxluacode", "ctxreport", "ctxsprint", "currentassignmentlistkey", "currentassignmentlistvalue", "currentbtxuservariable", "currentcommalistitem", "currentcomponent", "currentenvironment", "currentfeaturetest", "currentinterface", "currentlanguage", "currentlistentrydestinationattribute", "currentlistentrylimitedtext", "currentlistentrynumber", "currentlistentrypagenumber", "currentlistentryreferenceattribute", "currentlistentrytitle", "currentlistentrytitlerendered", "currentlistsymbol", "currentmainlanguage", "currentmessagetext", "currentmoduleparameter", "currentoutputstream", "currentproduct", "currentproject", "currentregime", "currentregisterpageuserdata", "currentresponses", "currenttime", "currentvalue", "currentxtablecolumn", "currentxtablerow", "datasetvariable", "datum", "dayoftheweek", "dayspermonth", "dbinom", "decrement", "decrementcounter", "decrementedcounter", "decrementpagenumber", "decrementsubpagenumber", "decrementvalue", "defaultinterface", "defaultobjectpage", "defaultobjectreference", "defcatcodecommand", "defconvertedargument", "defconvertedcommand", "defconvertedvalue", "defineMPinstance", "defineTABLEsetup", "defineactivecharacter", "definealternativestyle", "defineanchor", "defineattachment", "defineattribute", "definebackground", "definebar", "definebodyfontswitch", "definebreakpoint", "definebreakpoints", "definebtx", "definebtxdataset", "definebtxregister", "definebtxrendering", "definebutton", "definecapitals", "definecharacterkerning", "definecharacterspacing", "definechemical", "definechemicals", "definechemicalsymbol", "definecollector", "definecolumnbreak", "definecombination", "definecomment", "definecomplexorsimple", "definecomplexorsimpleempty", "defineconversionset", "definecounter", "definedataset", "definedelimitedtext", "definedfont", "defineeffect", "defineexpandable", "defineexternalfigure", "definefallbackfamily", "definefieldbody", "definefieldbodyset", "definefieldcategory", "definefileconstant", "definefilefallback", "definefilesynonym", "definefiller", "definefirstline", "definefittingpage", "definefontalternative", "definefontfallback", "definefontfamily", "definefontfamilypreset", "definefontfeature", "definefontfile", "definefontsize", "definefontsolution", "defineformula", "defineformulaalternative", "defineformulaframed", "defineframedcontent", "definefrozenfont", "defineglobalcolor", "definegraphictypesynonym", "definegridsnapping", "defineheadalternative", "definehelp", "definehigh", "definehighlight", "definehspace", "definehypenationfeatures", "defineindentedtext", "defineindenting", "defineinitial", "defineinsertion", "defineinteraction", "defineinteractionbar", "defineinterfaceconstant", "defineinterfaceelement", "defineinterfacevariable", "defineinterlinespace", "defineintermediatecolor", "defineitemgroup", "defineitems", "definelabelclass", "definelayer", "definelayerpreset", "definelayout", "definelinefiller", "definelinenote", "definelinenumbering", "definelines", "definelistalternative", "definelistextra", "definelow", "definelowhigh", "definelowmidhigh", "definemarginblock", "definemargindata", "definemarker", "definemathalignment", "definemathcases", "definemathcommand", "definemathdoubleextensible", "definemathematics", "definemathextensible", "definemathfence", "definemathfraction", "definemathframed", "definemathmatrix", "definemathornament", "definemathoverextensible", "definemathovertextextensible", "definemathradical", "definemathstackers", "definemathstyle", "definemathtriplet", "definemathunderextensible", "definemathundertextextensible", "definemathunstacked", "definemeasure", "definemessageconstant", "definemixedcolumns", "definemode", "definemultitonecolor", "definenamedcolor", "definenamespace", "definenarrower", "definenote", "defineornament", "defineoutputroutine", "defineoutputroutinecommand", "definepage", "definepagebreak", "definepagechecker", "definepagegrid", "definepagegridarea", "definepagegridspan", "definepageinjection", "definepageinjectionalternative", "definepageshift", "definepagestate", "definepairedbox", "defineparagraph", "defineparallel", "defineparbuilder", "defineplacement", "definepositioning", "defineprefixset", "defineprocesscolor", "defineprocessor", "definepushbutton", "definepushsymbol", "definerenderingwindow", "defineresetset", "definescale", "defineschriftsynonym", "definescript", "definesectionlevels", "defineselector", "defineseparatorset", "defineshift", "definesidebar", "definesort", "definespotcolor", "definestyleinstance", "definesubformula", "definesynonym", "definesystemattribute", "definesystemconstant", "definesystemvariable", "definetabulation", "definetextbackground", "definetextflow", "definetooltip", "definetransparency", "definetwopasslist", "definetype", "definetypeface", "definetypescriptprefix", "definetypescriptsynonym", "definetypesetting", "defineunit", "defineviewerlayer", "definevspace", "definevspacing", "definevspacingamount", "definextable", "definiereabbsymbol", "definiereabsaetze", "definiereabschnitt", "definiereabschnittsblock", "definierebeschreibung", "definierebeschriftung", "definiereblock", "definierefarbe", "definierefarbengruppe", "definierefeld", "definierefeldstapel", "definierefliesstext", "definierefliesstextumgebung", "definieregleitobjekt", "definierehbox", "definiereinteraktionsmenue", "definierekonversion", "definierelabel", "definiereliste", "definieren", "definierenummerierung", "definiereoverlay", "definierepalette", "definierepapierformat", "definiereprofil", "definiereprogramme", "definierepuffer", "definierereferenz", "definierereferenzformat", "definiereregister", "definiereschrift", "definiereschriftstil", "definieresortieren", "definierestartstop", "definierestil", "definieresubfeld", "definieresymbol", "definieresynonyme", "definieretabellenvorlage", "definieretabulator", "definieretext", "definieretippen", "definiereueberschrift", "definiereumbruch", "definiereumrahmt", "definiereumrahmtertext", "definierezusammengestellteliste", "delimited", "delimitedtext", "depthofstring", "depthonlybox", "depthspanningtext", "determinenoflines", "devanagarinumerals", "dfrac", "digits", "dimensiontocount", "directcolor", "directcolored", "directconvertedcounter", "directdummyparameter", "directgetboxllx", "directgetboxlly", "directhighlight", "directlocalframed", "directluacode", "directselect", "directsetbar", "directsetup", "directsymbol", "directvspacing", "dis", "disabledirectives", "disableexperiments", "disablemode", "disableoutputstream", "disableparpositions", "disableregime", "disabletrackers", "displaymath", "displaymathematics", "displaymessage", "distributedhsize", "dividedsize", "doadaptleftskip", "doadaptrightskip", "doaddfeature", "doassign", "doassignempty", "doboundtext", "docheckassignment", "docheckedpagestate", "docheckedpair", "documentvariable", "dodoubleargument", "dodoubleargumentwithset", "dodoubleempty", "dodoubleemptywithset", "dodoublegroupempty", "doeassign", "doexpandedrecurse", "dogetattribute", "dogetattributeid", "dogetcommacommandelement", "dogobbledoubleempty", "dogobblesingleempty", "doif", "doifMPgraphicelse", "doifallcommon", "doifallcommonelse", "doifalldefinedelse", "doifallmodes", "doifallmodeselse", "doifassignmentelse", "doifblackelse", "doifbothsides", "doifbothsidesoverruled", "doifboxelse", "doifbufferelse", "doifcolor", "doifcolorelse", "doifcommandhandler", "doifcommandhandlerelse", "doifcommon", "doifcommonelse", "doifcontent", "doifconversiondefinedelse", "doifconversionnumberelse", "doifcounter", "doifcounterelse", "doifcurrentfonthasfeatureelse", "doifdefined", "doifdefinedcounter", "doifdefinedcounterelse", "doifdefinedelse", "doifdimensionelse", "doifdimenstringelse", "doifdocumentargument", "doifdocumentargumentelse", "doifdocumentfilename", "doifdocumentfilenameelse", "doifdrawingblackelse", "doifelse", "doifelseMPgraphic", "doifelseallcommon", "doifelsealldefined", "doifelseallmodes", "doifelseassignment", "doifelseblack", "doifelsebox", "doifelsebuffer", "doifelsecolor", "doifelsecommandhandler", "doifelsecommon", "doifelseconversiondefined", "doifelseconversionnumber", "doifelsecounter", "doifelsecurrentfonthasfeature", "doifelsecurrentsortingused", "doifelsecurrentsynonymshown", "doifelsecurrentsynonymused", "doifelsedefined", "doifelsedefinedcounter", "doifelsedimension", "doifelsedimenstring", "doifelsedocumentargument", "doifelsedocumentfilename", "doifelsedrawingblack", "doifelseempty", "doifelseemptyvalue", "doifelseemptyvariable", "doifelseenv", "doifelsefastoptionalcheck", "doifelsefastoptionalcheckcs", "doifelsefieldbody", "doifelsefieldcategory", "doifelsefigure", "doifelsefile", "doifelsefiledefined", "doifelsefileexists", "doifelsefirstchar", "doifelseflagged", "doifelsefontchar", "doifelsefontpresent", "doifelsefontsynonym", "doifelsehasspace", "doifelsehelp", "doifelseincsname", "doifelseinelement", "doifelseinputfile", "doifelseinsertion", "doifelseinset", "doifelseinstring", "doifelseinsymbolset", "doifelseintoks", "doifelseintwopassdata", "doifelseitalic", "doifelselanguage", "doifelselayerdata", "doifelselayoutdefined", "doifelselayoutsomeline", "doifelselayouttextline", "doifelseleapyear", "doifelselist", "doifelselocation", "doifelselocfile", "doifelsemainfloatbody", "doifelsemarking", "doifelsemeaning", "doifelsemessage", "doifelsemode", "doifelsenextbgroup", "doifelsenextbgroupcs", "doifelsenextchar", "doifelsenextoptional", "doifelsenextoptionalcs", "doifelsenextparenthesis", "doifelsenonzeropositive", "doifelsenoteonsamepage", "doifelsenothing", "doifelsenumber", "doifelseobjectfound", "doifelseobjectreferencefound", "doifelseoddpage", "doifelseoddpagefloat", "doifelseoldercontext", "doifelseolderversion", "doifelseoverlapping", "doifelseoverlay", "doifelseparallel", "doifelseparentfile", "doifelsepath", "doifelsepathexists", "doifelsepatterns", "doifelseposition", "doifelsepositionaction", "doifelsepositiononpage", "doifelsepositionsonsamepage", "doifelsepositionsonthispage", "doifelsepositionsused", "doifelsereferencefound", "doifelserightpagefloat", "doifelserighttoleftinbox", "doifelsesamelinereference", "doifelsesamestring", "doifelsesetups", "doifelsesomebackground", "doifelsesomespace", "doifelsesomething", "doifelsesometoks", "doifelsestringinstring", "doifelsestructurelisthasnumber", "doifelsestructurelisthaspage", "doifelsesymboldefined", "doifelsesymbolset", "doifelsetext", "doifelsetextflow", "doifelsetextflowcollector", "doifelsetypingfile", "doifelseundefined", "doifelseurldefined", "doifelsevalue", "doifelsevaluenothing", "doifelsevariable", "doifempty", "doifemptyelse", "doifemptytoks", "doifemptyvalue", "doifemptyvalueelse", "doifemptyvariable", "doifemptyvariableelse", "doifenv", "doifenvelse", "doiffastoptionalcheckcselse", "doiffastoptionalcheckelse", "doiffieldbodyelse", "doiffieldcategoryelse", "doiffigureelse", "doiffile", "doiffiledefinedelse", "doiffileelse", "doiffileexistselse", "doiffirstcharelse", "doifflaggedelse", "doiffontcharelse", "doiffontpresentelse", "doiffontsynonymelse", "doifhasspaceelse", "doifhelpelse", "doifincsnameelse", "doifinelementelse", "doifinputfileelse", "doifinsertionelse", "doifinset", "doifinsetelse", "doifinstring", "doifinstringelse", "doifinsymbolset", "doifinsymbolsetelse", "doifintokselse", "doifintwopassdataelse", "doifitalicelse", "doiflanguageelse", "doiflayerdataelse", "doiflayoutdefinedelse", "doiflayoutsomelineelse", "doiflayouttextlineelse", "doifleapyearelse", "doiflistelse", "doiflocationelse", "doiflocfileelse", "doifmainfloatbodyelse", "doifmarkingelse", "doifmeaningelse", "doifmessageelse", "doifmode", "doifmodeelse", "doifnextbgroupcselse", "doifnextbgroupelse", "doifnextcharelse", "doifnextoptionalcselse", "doifnextoptionalelse", "doifnextparenthesiselse", "doifnonzeropositiveelse", "doifnot", "doifnotallcommon", "doifnotallmodes", "doifnotcommandhandler", "doifnotcommon", "doifnotcounter", "doifnotdocumentargument", "doifnotdocumentfilename", "doifnotempty", "doifnotemptyvalue", "doifnotemptyvariable", "doifnotenv", "doifnoteonsamepageelse", "doifnotescollected", "doifnotfile", "doifnotflagged", "doifnothing", "doifnothingelse", "doifnotinset", "doifnotinsidesplitfloat", "doifnotinstring", "doifnotmode", "doifnotnumber", "doifnotsamestring", "doifnotsetups", "doifnotvalue", "doifnotvariable", "doifnumber", "doifnumberelse", "doifobjectfoundelse", "doifobjectreferencefoundelse", "doifoddpageelse", "doifoddpagefloatelse", "doifoldercontextelse", "doifolderversionelse", "doifoverlappingelse", "doifoverlayelse", "doifparallelelse", "doifparentfileelse", "doifpathelse", "doifpathexistselse", "doifpatternselse", "doifposition", "doifpositionaction", "doifpositionactionelse", "doifpositionelse", "doifpositiononpageelse", "doifpositionsonsamepageelse", "doifpositionsonthispageelse", "doifpositionsusedelse", "doifreferencefoundelse", "doifrightpagefloatelse", "doifrighttoleftinboxelse", "doifsamelinereferenceelse", "doifsamestring", "doifsamestringelse", "doifsetups", "doifsetupselse", "doifsomebackground", "doifsomebackgroundelse", "doifsomespaceelse", "doifsomething", "doifsomethingelse", "doifsometoks", "doifsometokselse", "doifstringinstringelse", "doifstructurelisthasnumberelse", "doifstructurelisthaspageelse", "doifsymboldefinedelse", "doifsymbolsetelse", "doiftext", "doiftextelse", "doiftextflowcollectorelse", "doiftextflowelse", "doiftypingfileelse", "doifundefined", "doifundefinedcounter", "doifundefinedelse", "doifurldefinedelse", "doifvalue", "doifvalueelse", "doifvaluenothing", "doifvaluenothingelse", "doifvaluesomething", "doifvariable", "doifvariableelse", "doindentation", "dollar", "doloop", "doloopoverlist", "donothing", "dontconvertfont", "dontleavehmode", "dontpermitspacesbetweengroups", "dopositionaction", "doprocesslocalsetups", "doquadrupleargument", "doquadrupleempty", "doquadruplegroupempty", "doquintupleargument", "doquintupleempty", "doquintuplegroupempty", "dorechecknextindentation", "dorecurse", "dorepeatwithcommand", "doreplacefeature", "doresetandafffeature", "doresetattribute", "dorotatebox", "dosetattribute", "dosetleftskipadaption", "dosetrightskipadaption", "dosetupcheckedinterlinespace", "doseventupleargument", "doseventupleempty", "dosingleargument", "dosingleempty", "dosinglegroupempty", "dosixtupleargument", "dosixtupleempty", "dostepwiserecurse", "dosubtractfeature", "dotfskip", "dotoks", "dotripleargument", "dotripleargumentwithset", "dotripleempty", "dotripleemptywithset", "dotriplegroupempty", "doublebar", "doublebond", "doublebrace", "doublebracket", "doubleparent", "dowith", "dowithnextbox", "dowithnextboxcontent", "dowithnextboxcontentcs", "dowithnextboxcs", "dowithpargument", "dowithrange", "dowithwargument", "dpofstring", "drehen", "duennelinie", "duennerumriss", "dummydigit", "dummyparameter", "eTeX", "edefconvertedargument", "efcmaxheight", "efcmaxwidth", "efcminheight", "efcminwidth", "efcparameter", "effect", "einezeile", "elapsedseconds", "elapsedtime", "eleftarrowfill", "eleftharpoondownfill", "eleftharpoonupfill", "eleftrightarrowfill", "emphasisboldface", "emphasistypeface", "emptylines", "emspace", "enabledirectives", "enableexperiments", "enablemode", "enableoutputstream", "enableparpositions", "enableregime", "enabletrackers", "enskip", "enspace", "env", "envvar", "eoverbarfill", "eoverbracefill", "eoverbracketfill", "eoverparentfill", "epos", "equaldigits", "erightarrowfill", "erightharpoondownfill", "erightharpoonupfill", "etwoheadrightarrowfill", "eunderbarfill", "eunderbracefill", "eunderbracketfill", "eunderparentfill", "executeifdefined", "exitloop", "exitloopnow", "expandcheckedcsname", "expanded", "expandfontsynonym", "externalfigurecollectionmaxheight", "externalfigurecollectionmaxwidth", "externalfigurecollectionminheight", "externalfigurecollectionminwidth", "externalfigurecollectionparameter", "externeabbildung", "fakebox", "farbbalken", "farbe", "farbewert", "fastdecrement", "fastincrement", "fastlocalframed", "fastscale", "fastsetup", "fastsetupwithargument", "fastsetupwithargumentswapped", "fastswitchtobodyfont", "fastsxsy", "feature", "feld", "feldstapel", "fence", "fenced", "festesspatium", "fetchallmarkings", "fetchallmarks", "fetchmark", "fetchmarking", "fetchonemark", "fetchonemarking", "fetchruntinecommand", "fetchtwomarkings", "fetchtwomarks", "fieldbody", "fifthoffivearguments", "fifthofsixarguments", "figurefilename", "figurefilepath", "figurefiletype", "figurefullname", "figureheight", "figurenaturalheight", "figurenaturalwidth", "figuresymbol", "figurewidth", "filename", "filledhboxb", "filledhboxc", "filledhboxg", "filledhboxk", "filledhboxm", "filledhboxr", "filledhboxy", "filler", "filterfromnext", "filterfromvalue", "filterpages", "filterreference", "findtwopassdata", "finishregisterentry", "firstcharacter", "firstcounter", "firstcountervalue", "firstoffivearguments", "firstoffourarguments", "firstofoneargument", "firstofoneunexpanded", "firstofsixarguments", "firstofthreearguments", "firstofthreeunexpanded", "firstoftwoarguments", "firstoftwounexpanded", "firstrealpage", "firstrealpagenumber", "firstsubcountervalue", "firstsubpage", "firstsubpagenumber", "firstuserpage", "firstuserpagenumber", "fitfieldframed", "fittopbaselinegrid", "flag", "floatuserdataparameter", "flushboxregister", "flushcollector", "flushlayer", "flushlocalfloats", "flushnextbox", "flushnotes", "flushoutputstream", "flushshapebox", "flushtextflow", "flushtokens", "flushtoks", "fontalternative", "fontbody", "fontchar", "fontcharbyindex", "fontclass", "fontclassname", "fontface", "fontfeaturelist", "fontsize", "fontstyle", "footnotetext", "forcecharacterstripping", "forcelocalfloats", "forgeteverypar", "forgetparameters", "format", "formelnummer", "formula", "foundbox", "fourthoffivearguments", "fourthoffourarguments", "fourthofsixarguments", "frac", "frameddimension", "framedparameter", "framedtext", "freezedimenmacro", "freezemeasure", "frenchspacing", "fromlinenote", "frozenhbox", "gdefconvertedargument", "gdefconvertedcommand", "gefuelltesrechteck", "gefuelltezeile", "gestreckt", "getMPdrawing", "getMPlayer", "getboxllx", "getboxlly", "getbufferdata", "getcommacommandsize", "getcommalistsize", "getdayoftheweek", "getdayspermonth", "getdefinedbuffer", "getdocumentargument", "getdocumentargumentdefault", "getdocumentfilename", "getdummyparameters", "getemptyparameters", "geteparameters", "getexpandedparameters", "getfiguredimensions", "getfirstcharacter", "getfirsttwopassdata", "getfromcommacommand", "getfromcommalist", "getfromtwopassdata", "getglyphdirect", "getglyphstyled", "getgparameters", "getlasttwopassdata", "getlocalfloat", "getlocalfloats", "getmessage", "getnamedglyphdirect", "getnamedglyphstyled", "getnamedtwopassdatalist", "getnaturaldimensions", "getnoflines", "getobject", "getobjectdimensions", "getpaletsize", "getparameters", "getprivatechar", "getprivateslot", "getrandomcount", "getrandomdimen", "getrandomfloat", "getrandomnumber", "getrandomseed", "getraweparameters", "getrawgparameters", "getrawnoflines", "getrawparameters", "getrawxparameters", "getreference", "getreferenceentry", "getroundednoflines", "getsubstring", "gettwopassdata", "gettwopassdatalist", "getuvalue", "getvalue", "getvariable", "getvariabledefault", "getxparameters", "gitter", "globaldisablemode", "globalenablemode", "globalletempty", "globalpopbox", "globalpopmacro", "globalpreventmode", "globalprocesscommalist", "globalpushbox", "globalpushmacro", "globalswapcounts", "globalswapdimens", "globalswapmacros", "globalundefine", "glyphfontfile", "gobbledoubleempty", "gobbleeightarguments", "gobblefivearguments", "gobblefiveoptionals", "gobblefourarguments", "gobblefouroptionals", "gobbleninearguments", "gobbleoneargument", "gobbleoneoptional", "gobblesevenarguments", "gobblesingleempty", "gobblesixarguments", "gobblespacetokens", "gobbletenarguments", "gobblethreearguments", "gobblethreeoptionals", "gobbletwoarguments", "gobbletwooptionals", "gobbleuntil", "gobbleuntilrelax", "grabbufferdata", "grabbufferdatadirect", "grabuntil", "grafik", "graufarbe", "grayvalue", "greedysplitstring", "greeknumerals", "groupedcommand", "gsetboxllx", "gsetboxlly", "gujaratinumerals", "gurmurkhinumerals", "haarlinie", "hairspace", "halfwaybox", "handletokens", "handwritten", "hash", "hauptsprache", "hboxofvbox", "hboxreference", "hdofstring", "headhbox", "headnumbercontent", "headnumberdistance", "headnumberwidth", "headreferenceattributes", "headsetupspacing", "headtextcontent", "headtextdistance", "headtextwidth", "headvbox", "headwidth", "heightanddepthofstring", "heightofstring", "heightspanningtext", "helptext", "heutigesdatum", "heutigeskopfnummer", "hglue", "hiddenbar", "hiddencitation", "hiddencite", "highlight", "highordinalstr", "hilfetext", "hilo", "himilo", "hintergrund", "hl", "hoch", "holebeschriftung", "holepuffer", "horizontalgrowingbar", "horizontalpositionbar", "hphantom", "hpos", "hsizefraction", "hsmash", "hsmashbox", "hsmashed", "hspace", "htdpofstring", "htofstring", "hyphen", "hyphenatedcoloredword", "hyphenatedfile", "hyphenatedfilename", "hyphenatedhbox", "hyphenatedpar", "hyphenatedurl", "hyphenatedword", "ibox", "ifassignment", "iff", "ifinobject", "ifinoutputstream", "ifparameters", "iftrialtypesetting", "ignoreimplicitspaces", "ignorevalue", "immaumrise", "immediatesavetwopassdata", "impliedby", "implies", "imumriss", "in", "includemenu", "includeversioninfo", "increment", "incrementcounter", "incrementedcounter", "incrementpagenumber", "incrementsubpagenumber", "incrementvalue", "indentation", "infofont", "infofontbold", "inheritparameter", "inhibitblank", "initializeboxstack", "inlinebuffer", "inlinedbox", "inlinemath", "inlinemathematics", "inlinemessage", "inlineordisplaymath", "inlinerange", "innerflushshapebox", "input", "inputfilebarename", "inputfilename", "inputfilerealsuffix", "inputfilesuffix", "inputgivenfile", "insertpages", "installactionhandler", "installactivecharacter", "installanddefineactivecharacter", "installattributestack", "installautocommandhandler", "installautosetuphandler", "installbasicautosetuphandler", "installbasicparameterhandler", "installbottomframerenderer", "installcommandhandler", "installcorenamespace", "installdefinehandler", "installdefinitionset", "installdefinitionsetmember", "installdirectcommandhandler", "installdirectparameterhandler", "installdirectparametersethandler", "installdirectsetuphandler", "installdirectstyleandcolorhandler", "installframedautocommandhandler", "installframedcommandhandler", "installieresprache", "installleftframerenderer", "installnamespace", "installoutputroutine", "installpagearrangement", "installparameterhandler", "installparameterhashhandler", "installparametersethandler", "installparentinjector", "installrightframerenderer", "installrootparameterhandler", "installsetuphandler", "installsetuponlycommandhandler", "installshipoutmethod", "installsimplecommandhandler", "installsimpleframedcommandhandler", "installstyleandcolorhandler", "installswitchcommandhandler", "installswitchsetuphandler", "installtexdirective", "installtextracker", "installtopframerenderer", "installunitsseparator", "installunitsspace", "installversioninfo", "integerrounding", "interaktionsbalken", "interaktionsknopfe", "interaktionsmenue", "intermezzo", "intertext", "invokepageheandler", "inzeile", "irgendwo", "istltdir", "istrtdir", "italic", "italicbold", "italiccorrection", "itemtag", "jobfilename", "jobfilesuffix", "kap", "kapitel", "keeplinestogether", "keepunwantedspaces", "keinekopfundfusszeilen", "keinspatium", "keinzeilenobenundunten", "kerncharacters", "klonierefeld", "knopf", "kommentar", "komponente", "konvertierezahl", "kopfnummer", "kopierefeld", "koreancirclenumerals", "koreannumerals", "koreannumeralsc", "koreannumeralsp", "koreanparentnumerals", "korrigierezwischenraum", "languageCharacters", "languagecharacters", "languagecharwidth", "lastcounter", "lastcountervalue", "lastdigit", "lastlinewidth", "lastnaturalboxdp", "lastnaturalboxht", "lastnaturalboxwd", "lastpredefinedsymbol", "lastrealpage", "lastrealpagenumber", "lastsubcountervalue", "lastsubpage", "lastsubpagenumber", "lasttwodigits", "lastuserpage", "lastuserpagenumber", "lateluacode", "layeredtext", "layerheight", "layerwidth", "lazysavetaggedtwopassdata", "lazysavetwopassdata", "lbox", "left", "leftbottombox", "leftbox", "lefthbox", "leftorrighthbox", "leftorrightvbox", "leftorrightvtop", "leftskipadaption", "leftsubguillemot", "lefttopbox", "lefttorighthbox", "lefttorightvbox", "lefttorightvtop", "letbeundefined", "letcatcodecommand", "letcscsname", "letcsnamecs", "letcsnamecsname", "letdummyparameter", "letempty", "letgvalue", "letgvalueempty", "letgvalurelax", "letterampersand", "letterat", "letterbackslash", "letterbar", "letterbgroup", "letterclosebrace", "lettercolon", "letterdollar", "letterdoublequote", "letteregroup", "letterescape", "letterexclamationmark", "letterhash", "letterhat", "letterleftbrace", "letterless", "lettermore", "letteropenbrace", "letterpercent", "letterquestionmark", "letterrightbrace", "lettersinglequote", "letterslash", "letterspacing", "lettertilde", "letterunderscore", "letvalue", "letvalueempty", "letvaluerelax", "lfence", "lhbox", "limitatelines", "limitatetext", "limtatefirstline", "linespanningtext", "liniendicke", "listcitation", "listcite", "listenlaenge", "listnamespaces", "llap", "loadanyfile", "loadanyfileonce", "loadbtxdefinitionfile", "loadbtxreplacementfile", "loadcldfile", "loadcldfileonce", "loadfontgoodies", "loadluafile", "loadluafileonce", "loadspellchecklist", "loadtexfile", "loadtexfileonce", "loadtypescriptfile", "localframed", "localframedwithsettings", "localhsize", "localpopbox", "localpopmacro", "localpushbox", "localpushmacro", "localundefine", "locatedfilepath", "locatefilepath", "locfilename", "lomihi", "lowerbox", "lowercased", "lowercasestring", "lowerleftdoubleninequote", "lowerleftsingleninequote", "lowerrightdoubleninequote", "lowerrightsingleninequote", "lrtbbox", "ltop", "luaTeX", "luacode", "luaconditional", "luaenvironment", "luaexpanded", "luafunction", "luajitTeX", "luamajorversion", "luaminorversion", "luaparameterset", "luasetup", "luaversion", "m", "mLeftarrow", "mLeftrightarrow", "mRightarrow", "makecharacteractive", "makerawcommalist", "makestrutofbox", "mapfontsize", "margindata", "markcontent", "markinjector", "mat", "math", "mathbf", "mathbi", "mathblackboard", "mathbs", "mathcommand", "mathdefault", "mathematik", "mathfraktur", "mathfunction", "mathit", "mathitalic", "mathop", "mathrm", "mathscript", "mathsl", "mathss", "mathtext", "mathtextbf", "mathtextbi", "mathtextbs", "mathtextit", "mathtextsl", "mathtexttf", "mathtf", "mathtriplet", "mathtt", "mathupright", "mathword", "mathwordbf", "mathwordbi", "mathwordbs", "mathwordit", "mathwordsl", "mathwordtf", "maumrise", "mbox", "mcframed", "md", "measure", "measured", "medskip", "medspace", "menueknopf", "mequal", "message", "metaTeX", "mfence", "mfunction", "mfunctionlabeltext", "mhbox", "mhookleftarrow", "mhookrightarrow", "middle", "middlebox", "midhbox", "minimalhbox", "mixedcaps", "mkvibuffer", "mleftarrow", "mleftharpoondown", "mleftharpoonup", "mleftrightarrow", "mleftrightharpoons", "mmapsto", "moduleparameter", "molecule", "monat", "mono", "monobold", "mononormal", "monthlong", "monthshort", "mp", "mprandomnumber", "mrel", "mrightarrow", "mrightharpoondown", "mrightharpoonup", "mrightleftharpoons", "mrightoverleftarrow", "mtext", "mtriplerel", "mtwoheadleftarrow", "mtwoheadrightarrow", "nachunten", "namedheadnumber", "namedstructureheadlocation", "namedstructureuservariable", "namedstructurevariable", "namedtaggedlabeltexts", "naturalhbox", "naturalhpack", "naturalvbox", "naturalvcenter", "naturalvpack", "naturalvtop", "naturalwd", "negatecolorbox", "negated", "negthinspace", "newattribute", "newcatcodetable", "newcounter", "newevery", "newfrenchspacing", "newmode", "newsignal", "newsystemmode", "nextbox", "nextboxdp", "nextboxht", "nextboxhtdp", "nextboxwd", "nextcounter", "nextcountervalue", "nextdepth", "nextparagraphs", "nextrealpage", "nextrealpagenumber", "nextsubcountervalue", "nextsubpage", "nextsubpagenumber", "nextuserpage", "nextuserpagenumber", "nobar", "nocitation", "nocite", "nodetostring", "noffigurepages", "noflines", "noflocalfloats", "noindentation", "noitem", "nokap", "nonfrenchspacing", "nonmathematics", "normal", "normalboldface", "normalframedwithsettings", "normalizebodyfontsize", "normalizedfontsize", "normalizefontdepth", "normalizefontheight", "normalizefontline", "normalizefontwidth", "normalizetextdepth", "normalizetextheight", "normalizetextline", "normalizetextwidth", "normaltypeface", "notesymbol", "notiz", "ntimes", "numberofpoints", "obeydepth", "objectdepth", "objectheight", "objectmargin", "objectwidth", "obox", "offset", "offsetbox", "onedigitrounding", "ordinaldaynumber", "ordinalstr", "ornamenttext", "outputfilename", "outputstreambox", "outputstreamcopy", "outputstreamunvbox", "outputstreamunvcopy", "over", "overbar", "overbars", "overbartext", "overbarunderbar", "overbrace", "overbracetext", "overbraceunderbrace", "overbracket", "overbrackettext", "overbracketunderbracket", "overlaybutton", "overlaycolor", "overlaydepth", "overlayfigure", "overlayheight", "overlaylinecolor", "overlaylinewidth", "overlayoffset", "overlayrollbutton", "overlaywidth", "overleftarrow", "overleftharpoondown", "overleftharpoonup", "overleftrightarrow", "overloaderror", "overparent", "overparenttext", "overparentunderparent", "overrightarrow", "overrightharpoondown", "overrightharpoonup", "overset", "overstrike", "overstrikes", "overtwoheadleftarrow", "overtwoheadrightarrow", "pagearea", "pagebreak", "pagefigure", "pagegridspanwidth", "pageinjection", "pagestaterealpage", "paletsize", "passelayoutan", "passendfeld", "pdfTeX", "pdfactualtext", "pdfbackendactualtext", "pdfbackendcurrentresources", "pdfbackendsetcatalog", "pdfbackendsetcolorspace", "pdfbackendsetextgstate", "pdfbackendsetinfo", "pdfbackendsetname", "pdfbackendsetpageattribute", "pdfbackendsetpageresource", "pdfbackendsetpagesattribute", "pdfbackendsetpattern", "pdfbackendsetshade", "pdfcolor", "pdfeTeX", "percent", "percentdimen", "permitcaretescape", "permitcircumflexescape", "permitspacesbetweengroups", "persiandecimals", "persiannumerals", "phantom", "phantombox", "pickupgroupedcommand", "placeattachments", "placebtxrendering", "placecitation", "placecomments", "placecurrentformulanumber", "placedbox", "placefloat", "placefloatwithsetups", "placeframed", "placeheadnumber", "placeheadtext", "placehelp", "placeinitial", "placelayer", "placelayeredtext", "placelistofpublications", "placelistofsorts", "placelistofsynonyms", "placelocalnotes", "placement", "placenamedfloat", "placenamedformula", "placenotes", "placepagenumber", "placepairedbox", "placeparallel", "placerawlist", "placerenderingwindow", "platzierebookmarks", "platziereformel", "platzierefussnoten", "platziereliste", "platzierelokalefussnoten", "platzierenebeneinander", "platziereregister", "platziereuntereinander", "platziereunterformel", "platzierezusammengestellteliste", "popattribute", "popmacro", "popmode", "popsystemmode", "pos", "position", "positionoverlay", "positionregionoverlay", "posten", "postponenotes", "predefinedfont", "predefinefont", "predefinesymbol", "prefixedpagenumber", "prependetoks", "prependgvalue", "prependtocommalist", "prependtoks", "prependtoksonce", "prependvalue", "presetdocument", "presetfieldsymbols", "pretocommalist", "prevcounter", "prevcountervalue", "preventmode", "prevrealpage", "prevrealpagenumber", "prevsubcountervalue", "prevsubpage", "prevsubpagenumber", "prevuserpage", "prevuserpagenumber", "procent", "processMPbuffer", "processMPfigurefile", "processaction", "processallactionsinset", "processassignlist", "processassignmentcommand", "processassignmentlist", "processbetween", "processbodyfontenvironmentlist", "processcolorcomponents", "processcommacommand", "processcommalist", "processcommalistwithparameters", "processcontent", "processfile", "processfilemany", "processfilenone", "processfileonce", "processfirstactioninset", "processisolatedchars", "processisolatedwords", "processlinetablebuffer", "processlinetablefile", "processlist", "processmonth", "processranges", "processseparatedlist", "processtexbuffer", "processtokens", "processuntil", "processxtablebuffer", "processyear", "produkt", "profiledbox", "profilegivenbox", "programm", "projekt", "pseudoMixedCapped", "pseudoSmallCapped", "pseudoSmallcapped", "pseudosmallcapped", "punkt", "purenumber", "pushattribute", "pushbutton", "pushmacro", "pushmode", "pushoutputstream", "pushsystemmode", "qquad", "quad", "quads", "quitcommalist", "quitprevcommalist", "quittypescriptscanning", "raisebox", "randomizetext", "randomnumber", "rawcounter", "rawcountervalue", "rawdate", "rawdoifelseinset", "rawdoifinset", "rawdoifinsetelse", "rawgetparameters", "rawprocessaction", "rawprocesscommacommand", "rawprocesscommalist", "rawstructurelistuservariable", "rawsubcountervalue", "rbox", "readfile", "readfixfile", "readjobfile", "readlocfile", "readsetfile", "readsysfile", "readtexfile", "readxmlfile", "realSmallCapped", "realSmallcapped", "realpagenumber", "realsmallcapped", "rechteck", "rechtecke", "recursedepth", "recurselevel", "recursestring", "redoconvertfont", "ref", "referenceprefix", "referenz", "referieren", "registerattachment", "registerctxluafile", "registerexternalfigure", "registerfontclass", "registerhyphenationexception", "registerhyphenationpattern", "registermenubuttons", "registersort", "registersynonym", "registerunit", "regular", "relatemarking", "relateparameterhandlers", "relaxvalueifundefined", "remainingcharacters", "removebottomthings", "removedepth", "removefromcommalist", "removelastskip", "removelastspace", "removemarkedcontent", "removepunctuation", "removesubstring", "removetoks", "removeunwantedspaces", "replacefeature", "replaceincommalist", "replaceword", "rescan", "rescanwithsetup", "resetMPdrawing", "resetMPenvironment", "resetMPinstance", "resetallattributes", "resetandaddfeature", "resetbar", "resetbreakpoints", "resetbuffer", "resetcharacteralign", "resetcharacterkerning", "resetcharacterspacing", "resetcharacterstripping", "resetcollector", "resetcounter", "resetdigitsmanipulation", "resetdirection", "resetfeature", "resetflag", "resetfontcolorsheme", "resetfontfallback", "resetfontsolution", "resethyphenationfeatures", "resetinjector", "resetinteractionmenu", "resetitaliccorrection", "resetlayer", "resetlocalfloats", "resetmarker", "resetmode", "resetpagenumber", "resetparallel", "resetpath", "resetpenalties", "resetprofile", "resetreference", "resetreplacement", "resetscript", "resetsetups", "resetshownsynonyms", "resetsubpagenumber", "resetsymbolset", "resetsystemmode", "resettimer", "resettrackers", "resettrialtypesetting", "resetusedsortings", "resetusedsynonyms", "resetuserpagenumber", "resetvalue", "resetvisualizers", "reshapebox", "resolvedglyphdirect", "resolvedglyphstyled", "restartcounter", "restorebox", "restorecatcodes", "restorecounter", "restorecurrentattributes", "restoreendofline", "restoreglobalbodyfont", "reusableMPgraphic", "reuseMPgraphic", "reuserandomseed", "revivefeature", "rfence", "rhbox", "right", "rightbottombox", "rightbox", "righthbox", "rightorleftpageaction", "rightskipadaption", "rightsubguillemot", "righttolefthbox", "righttoleftvbox", "righttoleftvtop", "righttopbox", "rlap", "robustaddtocommalist", "robustdoifelseinset", "robustdoifinsetelse", "robustpretocommalist", "roemischezahlen", "rollbutton", "roman", "rtop", "ruecksetztenbeschriftung", "ruledhbox", "ruledhpack", "ruledmbox", "ruledtopv", "ruledtpack", "ruledvbox", "ruledvpack", "ruledvtop", "runMPbuffer", "runninghbox", "safechar", "sans", "sansbold", "sansnormal", "sansserif", "savebox", "savebtxdataset", "savebuffer", "savecounter", "savecurrentattributes", "savenormalmeaning", "savetaggedtwopassdata", "savetwopassdata", "sbox", "schreibezurliste", "schreibezwischenliste", "sd", "secondoffivearguments", "secondoffourarguments", "secondofsixarguments", "secondofthreearguments", "secondofthreeunexpanded", "secondoftwoarguments", "secondoftwounexpanded", "seite", "seitenreferenz", "seitenummer", "select", "serializecommalist", "serializedcommalist", "serif", "serifbold", "serifnormal", "setJSpreamble", "setMPlayer", "setMPpositiongraphic", "setMPpositiongraphicrange", "setMPtext", "setMPvariable", "setMPvariables", "setbar", "setbigbodyfont", "setboxllx", "setboxlly", "setbreakpoints", "setcapstrut", "setcatcodetable", "setcharacteralign", "setcharactercasing", "setcharactercleaning", "setcharacterkerning", "setcharacterspacing", "setcharacterstripping", "setcharstrut", "setcollector", "setcolormodell", "setcounter", "setcounterown", "setcurrentfontclass", "setdataset", "setdefaultpenalties", "setdigitsmanipulation", "setdirection", "setdocumentargument", "setdocumentargumentdefault", "setdocumentfilename", "setdummyparameter", "setelementexporttag", "setemeasure", "setevalue", "setevariable", "setevariables", "setfirstline", "setflag", "setfont", "setfontcolorsheme", "setfontfeature", "setfontsolution", "setfontstrut", "setfractions", "setgmeasure", "setgvalue", "setgvariable", "setgvariables", "sethboxregister", "sethyphenatedurlafter", "sethyphenatedurlbefore", "sethyphenatedurlnormal", "sethyphenationfeatures", "setinitial", "setinjector", "setinteraction", "setinterfacecommand", "setinterfaceconstant", "setinterfaceelements", "setinterfacemessage", "setinterfacevariable", "setinternalrendering", "setitaliccorrection", "setlayer", "setlayerframed", "setlayertext", "setlinefiller", "setlocalhsize", "setmainbodyfont", "setmainparbuilder", "setmarker", "setmarking", "setmathstyle", "setmeasure", "setmessagetext", "setmode", "setnostrut", "setnote", "setnotetext", "setobject", "setoldstyle", "setpagegrid", "setpagereference", "setpagestate", "setpagestaterealpageno", "setpenalties", "setpercentdimen", "setposition", "setpositionbox", "setpositiondata", "setpositiondataplus", "setpositiononly", "setpositionplus", "setpositionstrut", "setprofile", "setrandomseed", "setreference", "setreferencedobject", "setregisterentry", "setreplacement", "setrigidcolumnbalance", "setrigidcolumnhsize", "setscript", "setsectionblock", "setsimplecolumnhsize", "setsmallbodyfont", "setsmallcaps", "setstackbox", "setstructurepageregister", "setstrut", "setsuperiors", "setsystemmode", "settabular", "settaggedmetadata", "settext", "settightobject", "settightreferencedobject", "settightunreferencedobject", "settrialtypesetting", "setuevalue", "setugvalue", "setunreferencedobject", "setup", "setupMPgraphics", "setupMPinstance", "setupMPpage", "setupMPvariables", "setupTABLE", "setupTEXpage", "setupattachment", "setupbackend", "setupbar", "setupbleeding", "setupbookmark", "setupbtx", "setupbtxdataset", "setupbtxlist", "setupbtxregister", "setupbtxrendering", "setupbutton", "setupcharacterkerning", "setupcharacterspacing", "setupchemical", "setupchemicalframed", "setupcollector", "setupcolumnspan", "setupcombination", "setupcounter", "setupdataset", "setupdelimitedtext", "setupdescription", "setupdirections", "setupdocument", "setupeffect", "setupenumeration", "setupenv", "setupexport", "setupexternalfigure", "setupexternalsoundtracks", "setupfieldbody", "setupfieldcategory", "setupfieldcontentframed", "setupfieldlabelframed", "setupfieldtotalframed", "setupfiller", "setupfirstline", "setupfittingpage", "setupfloatcaption", "setupfontexpansion", "setupfontprotrusion", "setupfonts", "setupfontsolution", "setupforms", "setupformula", "setupformulaframed", "setupframedcontent", "setupframedtext", "setupglobalreferenceprefix", "setupheadalternative", "setuphelp", "setuphigh", "setuphighlight", "setuphyphenation", "setupindentedtext", "setupinitial", "setupinsertion", "setupitaliccorrection", "setupitemgroup", "setuplabel", "setuplayer", "setuplayeredtext", "setuplayouttext", "setuplinefiller", "setuplinefillers", "setuplinenote", "setuplinetable", "setuplistalternative", "setuplistextra", "setuplocalfloats", "setuplocalinterlinespace", "setuplow", "setuplowhigh", "setuplowmidhigh", "setupmarginblock", "setupmargindata", "setupmarginframed", "setupmarginrule", "setupmathalignment", "setupmathcases", "setupmathematics", "setupmathfence", "setupmathfraction", "setupmathframed", "setupmathmatrix", "setupmathornament", "setupmathradical", "setupmathstackers", "setupmathstyle", "setupmixedcolumns", "setupmodule", "setupnotation", "setupnotations", "setupnote", "setupnotes", "setupoffset", "setupoffsetbox", "setupoutputroutine", "setuppagechecker", "setuppagegrid", "setuppagegridarea", "setuppagegridareatext", "setuppagegridlines", "setuppagegridspan", "setuppagegridstart", "setuppageinjection", "setuppageinjectionalternative", "setuppageshift", "setuppagestate", "setuppairedbox", "setuppaper", "setupparagraph", "setupparagraphintro", "setupparallel", "setupperiods", "setupplacement", "setuppositionbar", "setupprocessor", "setupprofile", "setupquotation", "setuprealpagenumber", "setupreferenceformat", "setupreferenceprefix", "setupreferencestructureprefix", "setupregisters", "setuprenderingwindow", "setups", "setupscale", "setupscript", "setupscripts", "setupselector", "setupshift", "setupsidebar", "setupspellchecking", "setupstartstop", "setupstretched", "setupstruts", "setupstyle", "setupsubformula", "setuptabulation", "setuptagging", "setuptextbackground", "setuptextflow", "setuptooltip", "setupunit", "setupuserpagenumber", "setupversion", "setupviewerlayer", "setupvspacing", "setupwithargument", "setupwithargumentswapped", "setupxml", "setupxtable", "setuvalue", "setuxvalue", "setvalue", "setvariable", "setvariables", "setvboxregister", "setvisualizerfont", "setvtopregister", "setwidthof", "setxmeasure", "setxvalue", "setxvariable", "setxvariables", "sfrac", "shapedhbox", "showallmakeup", "showattributes", "showboxes", "showbtxdatasetauthors", "showbtxdatasetcompleteness", "showbtxdatasetfields", "showbtxfields", "showbtxhashedauthors", "showbtxtables", "showchardata", "showcharratio", "showcolorbar", "showcolorcomponents", "showcolorset", "showcolorstruts", "showcounter", "showdirectives", "showdirsinmargin", "showedebuginfo", "showexperiments", "showfont", "showfontdata", "showfontkerns", "showfontparameters", "showfontstrip", "showfontstyle", "showglyphs", "showgridsnapping", "showhelp", "showhyphenationtrace", "showhyphens", "showinjector", "showjustification", "showkerning", "showlayoutcomponents", "showligature", "showligatures", "showlogcategories", "showmargins", "showmessage", "showminimalbaseline", "shownextbox", "showotfcomposition", "showparentchain", "showsetupsdefinition", "showsymbolset", "showtimer", "showtokens", "showtrackers", "showvalue", "showvariable", "showwarning", "simplegroupedcommand", "singalcharacteralign", "singlebond", "sixthofsixarguments", "slanted", "slantedbold", "slicepages", "slovenianNumerals", "sloveniannumerals", "small", "smallbodyfont", "smallbold", "smallbolditalic", "smallboldslanted", "smallcappedcharacters", "smallcappedromannumerals", "smaller", "smallitalicbold", "smallnormal", "smallskip", "smallslanted", "smallslantedbold", "smalltype", "smash", "smashbox", "smashboxed", "smashedhbox", "smashedvbox", "snaptogrid", "someheadnumber", "somekindoftab", "somelocalfloat", "somenamedheadnumber", "someplace", "sp", "spalte", "spanishNumerals", "spanishnumerals", "spatium", "speech", "spiegeln", "splitatasterisk", "splitatcolon", "splitatcolons", "splitatcomma", "splitdfrac", "splitfilename", "splitfrac", "splitoffbase", "splitofffull", "splitoffkind", "splitoffname", "splitoffpath", "splitoffroot", "splitofftokens", "splitofftype", "splitstring", "sprache", "spreadhbox", "sqrt", "stackrel", "startJScode", "startJSpreamble", "startMPclip", "startMPcode", "startMPdefinitions", "startMPdrawing", "startMPenvironment", "startMPextensions", "startMPinclusions", "startMPinitializations", "startMPpage", "startMPpositiongraphic", "startMPpositionmethod", "startMPrun", "startTABLE", "startTABLEbody", "startTABLEfoot", "startTABLEhead", "startTABLEnext", "startTC", "startTD", "startTDs", "startTEXpage", "startTH", "startTN", "startTR", "startTRs", "startTX", "startTY", "startabbildung", "startabsatz", "startallmodes", "startarrangedpages", "startaside", "startattachment", "startaufzaehlung", "startbar", "startbinom", "startbitmapimage", "startblockquote", "startbtxrenderingdefinitions", "startbuffer", "startbutton", "startcatcodetable", "startcharacteralign", "startcheckedfences", "startchemical", "startcollect", "startcollecting", "startcolorintent", "startcoloronly", "startcolorset", "startcolumns", "startcolumnspan", "startcombination", "startcomment", "startcontextcode", "startcontextdefinitioncode", "startctxfunction", "startctxfunctiondefinition", "startcurrentcolor", "startcurrentlistentrywrapper", "startdbinom", "startdelimited", "startdelimitedtext", "startdfrac", "startdisplaymath", "startdmath", "startdocument", "startdurchgestrichen", "startdurchstreichen", "starteffect", "startelement", "startembeddedxtable", "startendofline", "startexceptions", "startexpanded", "startexpandedcollect", "startextendedcatcodetable", "startexternalfigurecollection", "startfarbe", "startfigure", "startfitfieldframed", "startfittingpage", "startfloatcombination", "startfont", "startfontclass", "startfontsolution", "startformula", "startformulas", "startfrac", "startframedcontent", "startframedtext", "startgrafik", "startgridsnapping", "starthbox", "starthboxestohbox", "starthboxregister", "starthelptext", "starthiddenbar", "starthiding", "starthighlight", "starthilfetext", "starthintergrund", "starthyphenation", "startimath", "startindentation", "startindentedtext", "startinmframed", "startinteraction", "startinteraktionsmenue", "startinterface", "startintermezzo", "startintertext", "startitemgroup", "startkapitel", "startkleinerdurchschuss", "startknockout", "startkommentar", "startkomponente", "startkopf", "startlayout", "startlinecorrection", "startlinefiller", "startlinenumbering", "startlinetable", "startlinetablebody", "startlinetablecell", "startlinetablehead", "startlocalfootnotes", "startlocalheadsetup", "startlocallinecorrection", "startlocalnotes", "startlocalsetups", "startlua", "startluacode", "startluaparameterset", "startluasetups", "startmakeup", "startmarginallinie", "startmarginblock", "startmarkedcontent", "startmathmode", "startmathstyle", "startmatrices", "startmcframed", "startmdformula", "startmframed", "startmixedcolumns", "startmode", "startmodeset", "startmodule", "startmoduletestsection", "startmpformula", "startnamedsection", "startnamedsubformulas", "startnarrow", "startnarrower", "startnegative", "startnicelyfilledbox", "startnobar", "startnointerference", "startnotallmodes", "startnotext", "startnotmode", "startopposite", "startoutputstream", "startoverlay", "startoverprint", "startpagecomment", "startpagefigure", "startpagegrid", "startpagegridspan", "startpagelayout", "startpar", "startparagraph", "startparagraphs", "startparagraphscell", "startparbuilder", "startpath", "startplacepairedbox", "startplatziereformel", "startpos", "startpositioning", "startpositionoverlay", "startpositive", "startpostponing", "startprocessassignmentcommand", "startprocessassignmentlist", "startprocesscommacommand", "startprocesscommalist", "startprodukt", "startprojekt", "startprotect", "startprotectedcolors", "startpublikation", "startpunctuation", "startrandomized", "startrandomseed", "startrawsetups", "startreadingfile", "startreferenceprefix", "startregime", "startregister", "startreusableMPgraphic", "startscript", "startsdformula", "startsectionblock", "startsectionblockenvironment", "startsectionlevel", "startsetups", "startsfrac", "startshapebox", "startshift", "startsidebar", "startsimplecolumns", "startspecialitem", "startspeech", "startspformula", "startspread", "startstartstop", "startstaticMPfigure", "startstaticMPgraphic", "startstrictinspectnextcharacter", "startstructurepageregister", "startstrut", "startstyle", "startsubformulas", "startsubjectlevel", "startsubsentence", "startsubstack", "startsymbolset", "starttabelle", "starttable", "starttablehead", "starttables", "starttabletail", "starttabulate", "starttabulatehead", "starttabulatetail", "starttagged", "starttbinom", "starttexcode", "starttexdefinition", "starttext", "starttextbackground", "starttextbackgroundmanual", "starttextcolor", "starttextcolorintent", "starttextflow", "starttextlinie", "startthema", "starttitel", "starttokens", "starttransparent", "starttypescript", "starttypescriptcollection", "startueberstreichen", "startueberstrichen", "startumgebung", "startumrahmt", "startumrahmtertext", "startunderdash", "startunderdashes", "startunderdot", "startunderdots", "startunderrandom", "startunderrandoms", "startunderstrike", "startunderstrikes", "startunframed", "startuniqueMPgraphic", "startuniqueMPpagegraphic", "startunpacked", "startunterabsatz", "startunterstreichen", "startunterstrichen", "startunterthema", "startunterunterabsatz", "startunterunterthema", "startunterunterunterabsatz", "startunterunterunterthema", "startunterunterunterunterabsatz", "startunterunterunterunterthema", "startusableMPgraphic", "startuseMPgraphic", "startusemathstyleparameter", "startusingbtxspecification", "startvbox", "startvboxregister", "startvboxtohbox", "startvboxtohboxseparator", "startviewerlayer", "startvtop", "startvtopregister", "startxcell", "startxcellgroup", "startxfrac", "startxgroup", "startxmldisplayverbatim", "startxmlinlineverbatim", "startxmlraw", "startxmlsetups", "startxrow", "startxrowgroup", "startxtable", "startxtablebody", "startxtablefoot", "startxtablehead", "startxtablenext", "startxxfrac", "startzeile", "startzitat", "startzitieren", "startzu", "stelleabsaetzeein", "stelleabsatznummerierungein", "stelleabschnittsblockein", "stelleanordnenein", "stelleaufzaehlungenein", "stelleausschnittein", "stellebeschriftungein", "stellebildunterschriftein", "stellebindestrichein", "stelleblankoein", "stelleblockein", "stelledrehenein", "stelleduennerumrissein", "stelleeinziehenein", "stelleengerein", "stellefarbeein", "stellefarbenein", "stellefeldein", "stellefelderin", "stellefliesstextein", "stellefusszeileein", "stellefusszeilentextein", "stellegefuelltesrechteckein", "stellegefuelltezeileein", "stellegegenueberplatzierenein", "stellegleitobjektein", "stellehintergruendeein", "stellehintergrundein", "stelleinteraktionein", "stelleinteraktionsbalkenein", "stelleinteraktionsbildschirmein", "stelleinteraktionsmenueein", "stellekommentarein", "stellekopfzahlein", "stellekopfzeileein", "stellekopfzeilentextein", "stellelayoutein", "stellelinienbreiteein", "stellelisteein", "stellemarginallinieein", "stellenobenein", "stellepaletteein", "stellepapierformatein", "stelleplatziegeteiltegleitobjekt", "stellepositionierenein", "stellepostenein", "stelleprogrammein", "stellepufferein", "stellerechteckein", "stellereferenzierenein", "stelleregisterein", "stelleseitenkommentarein", "stelleseitennummerein", "stelleseitennummeriernungein", "stelleseitenuebergangein", "stellesortierenein", "stellespaltenein", "stellespatiumein", "stellespracheein", "stellesymbolsetein", "stellesynonymein", "stelletabellenein", "stelletabulatorein", "stelletextein", "stelletextobenein", "stelletexttexteein", "stelletextumrissein", "stelletextuntenein", "stelletipein", "stelletippenein", "stelletoleranzein", "stelleueberschriftein", "stelleueberschriftenein", "stelleumbruchein", "stelleumrahmtein", "stelleuntenein", "stelleunterseitennummerein", "stelleurlein", "stelleversalienein", "stellezeilenabstandein", "stellezeilenein", "stellezeilennumerierungein", "stellezitierenein", "stellezusammengestelltelisteein", "stellezwischenraumein", "stopJScode", "stopJSpreamble", "stopMPclip", "stopMPcode", "stopMPdefinitions", "stopMPdrawing", "stopMPenvironment", "stopMPextensions", "stopMPinclusions", "stopMPinitializations", "stopMPpage", "stopMPpositiongraphic", "stopMPpositionmethod", "stopMPrun", "stopTABLE", "stopTABLEbody", "stopTABLEfoot", "stopTABLEhead", "stopTABLEnext", "stopTC", "stopTD", "stopTDs", "stopTEXpage", "stopTH", "stopTN", "stopTR", "stopTRs", "stopTX", "stopTY", "stopabbildung", "stopabsatz", "stopallmodes", "stoparrangedpages", "stopaside", "stopattachment", "stopaufzaehlung", "stopbar", "stopbinom", "stopbitmapimage", "stopblockquote", "stopbtxrenderingdefinitions", "stopbuffer", "stopbutton", "stopcatcodetable", "stopcharacteralign", "stopcheckedfences", "stopchemical", "stopcollect", "stopcollecting", "stopcolorintent", "stopcoloronly", "stopcolorset", "stopcolumns", "stopcolumnspan", "stopcombination", "stopcomment", "stopcontextcode", "stopcontextdefinitioncode", "stopctxfunction", "stopctxfunctiondefinition", "stopcurrentcolor", "stopcurrentlistentrywrapper", "stopdbinom", "stopdelimited", "stopdelimitedtext", "stopdfrac", "stopdisplaymath", "stopdmath", "stopdocument", "stopdurchgestrichen", "stopdurchstreichen", "stopeffect", "stopelement", "stopembeddedxtable", "stopendofline", "stopexceptions", "stopexpanded", "stopexpandedcollect", "stopextendedcatcodetable", "stopexternalfigurecollection", "stopfarbe", "stopfigure", "stopfitfieldframed", "stopfittingpage", "stopfloatcombination", "stopfont", "stopfontclass", "stopfontsolution", "stopformula", "stopformulas", "stopfrac", "stopframedcontent", "stopframedtext", "stopgrafik", "stopgridsnapping", "stophbox", "stophboxestohbox", "stophboxregister", "stophelptext", "stophiddenbar", "stophiding", "stophighlight", "stophilfetext", "stophintergrund", "stophyphenation", "stopimath", "stopindentation", "stopindentedtext", "stopinmframed", "stopinteraction", "stopinteraktionsmenue", "stopinterface", "stopintermezzo", "stopintertext", "stopitemgroup", "stopkapitel", "stopkleinerdurchschuss", "stopknockout", "stopkommentar", "stopkomponente", "stopkopf", "stoplayout", "stoplinecorrection", "stoplinefiller", "stoplinenumbering", "stoplinetable", "stoplinetablebody", "stoplinetablecell", "stoplinetablehead", "stoplocalfootnotes", "stoplocalheadsetup", "stoplocallinecorrection", "stoplocalnotes", "stoplocalsetups", "stoplua", "stopluacode", "stopluaparameterset", "stopluasetups", "stopmakeup", "stopmarginallinie", "stopmarginblock", "stopmarkedcontent", "stopmathmode", "stopmathstyle", "stopmatrices", "stopmcframed", "stopmdformula", "stopmframed", "stopmixedcolumns", "stopmode", "stopmodeset", "stopmodule", "stopmoduletestsection", "stopmpformula", "stopnamedsection", "stopnamedsubformulas", "stopnarrow", "stopnarrower", "stopnegative", "stopnicelyfilledbox", "stopnobar", "stopnointerference", "stopnotallmodes", "stopnotext", "stopnotmode", "stopopposite", "stopoutputstream", "stopoverlay", "stopoverprint", "stoppagecomment", "stoppagefigure", "stoppagegrid", "stoppagegridspan", "stoppagelayout", "stoppar", "stopparagraph", "stopparagraphs", "stopparagraphscell", "stopparbuilder", "stoppath", "stopplacepairedbox", "stopplatziereformel", "stoppos", "stoppositioning", "stoppositionoverlay", "stoppositive", "stoppostponing", "stopprocessassignmentcommand", "stopprocessassignmentlist", "stopprocesscommacommand", "stopprocesscommalist", "stopprodukt", "stopprojekt", "stopprotect", "stopprotectedcolors", "stoppublikation", "stoppunctuation", "stoprandomized", "stoprandomseed", "stoprawsetups", "stopreadingfile", "stopreferenceprefix", "stopregime", "stopregister", "stopreusableMPgraphic", "stopscript", "stopsdformula", "stopsectionblock", "stopsectionblockenvironment", "stopsectionlevel", "stopsetups", "stopsfrac", "stopshapebox", "stopshift", "stopsidebar", "stopsimplecolumns", "stopspecialitem", "stopspeech", "stopspformula", "stopspread", "stopstartstop", "stopstaticMPfigure", "stopstaticMPgraphic", "stopstrictinspectnextcharacter", "stopstructurepageregister", "stopstrut", "stopstyle", "stopsubformulas", "stopsubjectlevel", "stopsubsentence", "stopsubstack", "stopsymbolset", "stoptabelle", "stoptable", "stoptablehead", "stoptables", "stoptabletail", "stoptabulate", "stoptabulatehead", "stoptabulatetail", "stoptagged", "stoptbinom", "stoptexcode", "stoptexdefinition", "stoptext", "stoptextbackground", "stoptextbackgroundmanual", "stoptextcolor", "stoptextcolorintent", "stoptextflow", "stoptextlinie", "stopthema", "stoptitel", "stoptokens", "stoptransparent", "stoptypescript", "stoptypescriptcollection", "stopueberstreichen", "stopueberstrichen", "stopumgebung", "stopumrahmt", "stopumrahmtertext", "stopunderdash", "stopunderdashes", "stopunderdot", "stopunderdots", "stopunderrandom", "stopunderrandoms", "stopunderstrike", "stopunderstrikes", "stopunframed", "stopuniqueMPgraphic", "stopuniqueMPpagegraphic", "stopunpacked", "stopunterabsatz", "stopunterstreichen", "stopunterstrichen", "stopunterthema", "stopunterunterabsatz", "stopunterunterthema", "stopunterunterunterabsatz", "stopunterunterunterthema", "stopunterunterunterunterabsatz", "stopunterunterunterunterthema", "stopusableMPgraphic", "stopuseMPgraphic", "stopusemathstyleparameter", "stopusingbtxspecification", "stopvbox", "stopvboxregister", "stopvboxtohbox", "stopvboxtohboxseparator", "stopviewerlayer", "stopvtop", "stopvtopregister", "stopxcell", "stopxcellgroup", "stopxfrac", "stopxgroup", "stopxmldisplayverbatim", "stopxmlinlineverbatim", "stopxmlraw", "stopxmlsetups", "stopxrow", "stopxrowgroup", "stopxtable", "stopxtablebody", "stopxtablefoot", "stopxtablehead", "stopxtablenext", "stopxxfrac", "stopzeile", "stopzitat", "stopzitieren", "stopzu", "strictdoifelsenextoptional", "strictdoifnextoptionalelse", "stripcharacter", "strippedcsname", "stripspaces", "structurelistuservariable", "structurenumber", "structuretitle", "structureuservariable", "structurevariable", "strut", "strutdp", "strutht", "struthtdp", "struttedbox", "strutwd", "style", "styleinstance", "subpagenumber", "subsentence", "substituteincommalist", "subtractfeature", "swapcounts", "swapdimens", "swapface", "swapmacros", "swaptypeface", "switchstyleonly", "switchtocolor", "switchtointerlinespace", "symbol", "symbolreference", "synchronizeblank", "synchronizeindenting", "synchronizemarking", "synchronizeoutputstreams", "synchronizestrut", "synchronizewhitespace", "systemlog", "systemlogfirst", "systemloglast", "systemsetups", "tLeftarrow", "tLeftrightarrow", "tRightarrow", "tabelle", "tabulateautoline", "tabulateautorule", "tabulateline", "tabulaterule", "taggedctxcommand", "taggedlabeltexts", "tbinom", "tbox", "teilegleitobjekt", "tequal", "testandsplitstring", "testcolumn", "testfeature", "testfeatureonce", "testpage", "testpageonly", "testpagesync", "testtokens", "tex", "texdefinition", "texsetup", "textcitation", "textcite", "textcontrolspace", "textflowcollector", "textlinie", "textmath", "textminus", "textormathchar", "textplus", "textreferenz", "textvisiblespace", "tfrac", "thainumerals", "thefirstcharacter", "thema", "thenormalizedbodyfontsize", "theremainingcharacters", "thickspace", "thinspace", "thirdoffivearguments", "thirdoffourarguments", "thirdofsixarguments", "thirdofthreearguments", "thirdofthreeunexpanded", "thookleftarrow", "thookrightarrow", "threedigitrounding", "tibetannumerals", "tief", "tightlayer", "tiho", "tinyfont", "tip", "tippedatei", "tippen", "tippepuffer", "titel", "tlap", "tleftarrow", "tleftharpoondown", "tleftharpoonup", "tleftrightarrow", "tleftrightharpoons", "tmapsto", "tochar", "tolinenote", "topbox", "topleftbox", "toplinebox", "toprightbox", "topskippedbox", "tracecatcodetables", "tracedfontname", "traceoutputroutines", "tracepositions", "transparencycomponents", "transparent", "trel", "trightarrow", "trightharpoondown", "trightharpoonup", "trightleftharpoons", "trightoverleftarrow", "triplebond", "truefilename", "truefontname", "ttriplerel", "ttwoheadleftarrow", "ttwoheadrightarrow", "twodigitrounding", "tx", "txx", "typedefinedbuffer", "typeface", "typescriptone", "typescriptprefix", "typescriptthree", "typescripttwo", "typesetbuffer", "typesetfile", "uconvertnumber", "ueber", "uebersetzten", "uedcatcodecommand", "umgebung", "umrahmt", "umrahmtertext", "unbekant", "undefinevalue", "undepthed", "underbar", "underbars", "underbartext", "underbrace", "underbracetext", "underbracket", "underbrackettext", "underdash", "underdashes", "underdot", "underdots", "underleftarrow", "underleftharpoondown", "underleftharpoonup", "underleftrightarrow", "underparent", "underparenttext", "underrandom", "underrandoms", "underrightarrow", "underrightharpoondown", "underrightharpoonup", "underset", "understrike", "understrikes", "undertwoheadleftarrow", "undertwoheadrightarrow", "undoassign", "unframed", "unhhbox", "unihex", "uniqueMPgraphic", "uniqueMPpagegraphic", "unprotected", "unregisterhyphenationpattern", "unspaceafter", "unspaceargument", "unspaced", "unspacestring", "unterabsatz", "unterthema", "unterunterabsatz", "unterunterthema", "unterunterunterabsatz", "unterunterunterthema", "unterunterunterunterabsatz", "unterunterunterunterthema", "untexargument", "untexcommand", "uppercased", "uppercasestring", "upperleftdoubleninequote", "upperleftdoublesixquote", "upperleftsingleninequote", "upperleftsinglesixquote", "upperrightdoubleninequote", "upperrightdoublesixquote", "upperrightsingleninequote", "upperrightsinglesixquote", "url", "useMPenvironmentbuffer", "useMPgraphic", "useMPlibrary", "useMPrun", "useMPvariables", "useblankparameter", "usebodyfont", "usebodyfontparameter", "usebtxdataset", "usebtxdefinitions", "usecolors", "usecomponent", "usedummycolorparameter", "usedummystyleandcolor", "usedummystyleparameter", "useenvironment", "useexternalrendering", "usefigurebase", "usefile", "usegridparameter", "useindentingparameter", "useindentnextparameter", "useinterlinespaceparameter", "uselanguageparameter", "useluamodule", "usemathstyleparameter", "useproduct", "useprofileparameter", "useproject", "usereferenceparameter", "userpagenumber", "usesetupsparameter", "usestaticMPfigure", "usesubpath", "usetexmodule", "usetypescript", "usetypescriptfile", "usezipfile", "utfchar", "utflower", "utfupper", "utilityregisterlength", "vboxreference", "verbatim", "verbatimstring", "verbergebloecke", "verbergen", "verbosenumber", "vergleichefarbengruppe", "vergleichepalette", "version", "verticalgrowingbar", "verticalpositionbar", "verwendeJSscript", "verwendeURL", "verwendebloecke", "verwendeexteresdokument", "verwendeexterneabbildung", "verwendeexternestonstueck", "verwendemodul", "verwendesymbole", "verwendeurl", "vglue", "viewerlayer", "vl", "volleswort", "von", "vphantom", "vpos", "vsmash", "vsmashbox", "vsmashed", "vspace", "vspacing", "waehlebloeckeaus", "wdofstring", "wechselezumfliesstext", "widthofstring", "widthspanningtext", "withoutpt", "wochentag", "word", "words", "wordtonumber", "writedatatolist", "writestatus", "xLeftarrow", "xLeftrightarrow", "xRightarrow", "xdefconvertedargument", "xequal", "xfrac", "xhookleftarrow", "xhookrightarrow", "xleftarrow", "xleftharpoondown", "xleftharpoonup", "xleftrightarrow", "xleftrightharpoons", "xmapsto", "xmladdindex", "xmlafterdocumentsetup", "xmlaftersetup", "xmlall", "xmlappenddocumentsetup", "xmlappendsetup", "xmlapplyselectors", "xmlatt", "xmlattdef", "xmlattribute", "xmlattributedef", "xmlbadinclusions", "xmlbeforedocumentsetup", "xmlbeforesetup", "xmlchainatt", "xmlchainattdef", "xmlchecknamespace", "xmlcommand", "xmlconcat", "xmlconcatrange", "xmlcontext", "xmlcount", "xmldefaulttotext", "xmldirectives", "xmldirectivesafter", "xmldirectivesbefore", "xmldisplayverbatim", "xmldoif", "xmldoifelse", "xmldoifelseempty", "xmldoifelseselfempty", "xmldoifelsetext", "xmldoifelsevalue", "xmldoifnot", "xmldoifnotselfempty", "xmldoifnottext", "xmldoifselfempty", "xmldoiftext", "xmlelement", "xmlfilter", "xmlfirst", "xmlflush", "xmlflushcontext", "xmlflushdocumentsetups", "xmlflushlinewise", "xmlflushpure", "xmlflushspacewise", "xmlflushtext", "xmlinclude", "xmlinclusion", "xmlinclusions", "xmlinfo", "xmlinjector", "xmlinlineverbatim", "xmlinstalldirective", "xmllast", "xmllastatt", "xmllastmatch", "xmlloadbuffer", "xmlloaddata", "xmlloaddirectives", "xmlloadfile", "xmlloadonly", "xmlmain", "xmlmapvalue", "xmlname", "xmlnamespace", "xmlnonspace", "xmlpath", "xmlpos", "xmlposition", "xmlprependdocumentsetup", "xmlprependsetup", "xmlprettyprint", "xmlprocessbuffer", "xmlprocessdata", "xmlprocessfile", "xmlpure", "xmlraw", "xmlrefatt", "xmlregistereddocumentsetups", "xmlregisteredsetups", "xmlregisterns", "xmlremapname", "xmlremapnamespace", "xmlremovedocumentsetup", "xmlremovesetup", "xmlresetdocumentsetups", "xmlresetinjectors", "xmlresetsetups", "xmlsave", "xmlsetentity", "xmlsetfunction", "xmlsetinjectors", "xmlsetsetup", "xmlsetup", "xmlshow", "xmlsnippet", "xmlstrip", "xmlstripnolines", "xmlstripped", "xmlstrippednolines", "xmltag", "xmltexentity", "xmltext", "xmltobuffer", "xmltobufferverbose", "xmltofile", "xmlvalue", "xmlverbatim", "xrel", "xrightarrow", "xrightharpoondown", "xrightharpoonup", "xrightleftharpoons", "xrightoverleftarrow", "xsplitstring", "xtriplerel", "xtwoheadleftarrow", "xtwoheadrightarrow", "xxfrac", "xypos", "zeigedruck", "zeigeeinstellungen", "zeigefarbe", "zeigefarbengruppe", "zeigefliesstext", "zeigefliesstextumgebung", "zeigegitter", "zeigelayout", "zeigepalette", "zeigerahmen", "zeigestruts", "zeigeumbruch", "ziffern", "zitat", "zitieren", "zu", "zurbox", "zurseite" }, - ["en"]={ "AMSTEX", "AfterPar", "Alphabeticnumerals", "AmSTeX", "And", "BeforePar", "Big", "Bigg", "Biggl", "Biggm", "Biggr", "Bigl", "Bigm", "Bigr", "CONTEXT", "Cap", "Caps", "Character", "Characters", "ConTeXt", "Context", "ConvertConstantAfter", "ConvertToConstant", "ETEX", "EveryLine", "EveryPar", "GetPar", "GotoPar", "Greeknumerals", "INRSTEX", "LAMSTEX", "LATEX", "LUAJITTEX", "LUATEX", "LaTeX", "LamSTeX", "Lua", "LuaTeX", "LuajitTeX", "METAFONT", "METAFUN", "METAPOST", "MKII", "MKIV", "MKIX", "MKVI", "MKXI", "MONTH", "MONTHLONG", "MONTHSHORT", "MPII", "MPIV", "MPVI", "MPanchor", "MPbetex", "MPc", "MPcode", "MPcolor", "MPcoloronly", "MPcolumn", "MPd", "MPdrawing", "MPfontsizehskip", "MPgetmultipars", "MPgetmultishape", "MPgetposboxes", "MPh", "MPinclusions", "MPleftskip", "MPll", "MPlr", "MPls", "MPmenubuttons", "MPn", "MPoptions", "MPoverlayanchor", "MPp", "MPpage", "MPpardata", "MPplus", "MPpos", "MPpositiongraphic", "MPposset", "MPr", "MPrawvar", "MPregion", "MPrest", "MPrightskip", "MPrs", "MPstring", "MPtext", "MPtransparency", "MPul", "MPur", "MPv", "MPvar", "MPvariable", "MPvv", "MPw", "MPwhd", "MPx", "MPxy", "MPxywhd", "MPy", "MetaFont", "MetaFun", "MetaPost", "NormalizeFontHeight", "NormalizeFontWidth", "NormalizeTextHeight", "NormalizeTextWidth", "Numbers", "PDFETEX", "PDFTEX", "PDFcolor", "PICTEX", "PPCHTEX", "PPCHTeX", "PRAGMA", "PiCTeX", "PointsToBigPoints", "PointsToReal", "PointsToWholeBigPoints", "PtToCm", "ReadFile", "Romannumerals", "ScaledPointsToBigPoints", "ScaledPointsToWholeBigPoints", "Smallcapped", "TABLE", "TEX", "TEXpage", "TaBlE", "TeX", "TheNormalizedFontSize", "TransparencyHack", "VerboseNumber", "WEEKDAY", "WORD", "WORDS", "WidthSpanningText", "Word", "Words", "XETEX", "XeTeX", "abjadnaivenumerals", "abjadnodotnumerals", "abjadnumerals", "about", "activatespacehandler", "adaptcollector", "adaptfontfeature", "adaptlayout", "adaptpapersize", "addfeature", "addtoJSpreamble", "addtocommalist", "addvalue", "aftersplitstring", "aftertestandsplitstring", "alignmentcharacter", "allinputpaths", "alphabeticnumerals", "alwayscitation", "alwayscite", "ampersand", "anchor", "appendetoks", "appendgvalue", "appendtocommalist", "appendtoks", "appendtoksonce", "appendvalue", "apply", "applyalternativestyle", "applyprocessor", "applytocharacters", "applytofirstcharacter", "applytosplitstringchar", "applytosplitstringcharspaced", "applytosplitstringline", "applytosplitstringlinespaced", "applytosplitstringword", "applytosplitstringwordspaced", "applytowords", "arabicdecimals", "arabicexnumerals", "arabicnumerals", "arg", "asciistr", "aside", "assignalfadimension", "assigndimen", "assigndimension", "assignifempty", "assigntranslation", "assignvalue", "assignwidth", "assumelongusagecs", "astype", "at", "atpage", "attachment", "autocap", "autodirhbox", "autodirvbox", "autodirvtop", "autoinsertnextspace", "automathematics", "autosetups", "availablehsize", "averagecharwidth", "background", "backgroundimage", "backgroundimagefill", "backgroundline", "basegrid", "baselineleftbox", "baselinemiddlebox", "baselinerightbox", "bbox", "beforesplitstring", "beforetestandsplitstring", "big", "bigbodyfont", "bigg", "bigger", "biggl", "biggm", "biggr", "bigl", "bigm", "bigr", "bigskip", "binom", "bitmapimage", "blackrule", "blackrules", "blank", "blap", "bleed", "bleedheight", "bleedwidth", "blockligatures", "blockquote", "bodyfontenvironmentlist", "bodyfontsize", "bold", "boldface", "bolditalic", "boldslanted", "bookmark", "booleanmodevalue", "bottombox", "bottomleftbox", "bottomrightbox", "boxcursor", "boxmarker", "boxofsize", "boxreference", "bpos", "bthiddencitation", "btxabbreviatedjournal", "btxaddjournal", "btxalwayscitation", "btxauthorfield", "btxdetail", "btxdirect", "btxdoif", "btxdoifcombiinlistelse", "btxdoifelse", "btxdoifelsecombiinlist", "btxdoifelsesameasprevious", "btxdoifelsesameaspreviouschecked", "btxdoifelseuservariable", "btxdoifnot", "btxdoifsameaspreviouscheckedelse", "btxdoifsameaspreviouselse", "btxdoifuservariableelse", "btxexpandedjournal", "btxfield", "btxfieldname", "btxfieldtype", "btxfirstofrange", "btxflush", "btxflushauthor", "btxflushauthorinverted", "btxflushauthorinvertedshort", "btxflushauthorname", "btxflushauthornormal", "btxflushauthornormalshort", "btxflushsuffix", "btxfoundname", "btxfoundtype", "btxhybridcite", "btxlistcitation", "btxloadjournalist", "btxoneorrange", "btxremapauthor", "btxsavejournalist", "btxsetup", "btxsingularorplural", "btxsingularplural", "btxtextcitation", "button", "calligraphic", "camel", "cap", "catcodetablename", "cbox", "centerbox", "centeredbox", "centerednextbox", "cfrac", "chapter", "character", "characters", "chardescription", "charwidthlanguage", "checkcharacteralign", "checkedchar", "checkedfiller", "checkedstrippedcsname", "checkinjector", "checknextindentation", "checknextinjector", "checkpage", "checkparameters", "checkpreviousinjector", "checksoundtrack", "checktwopassdata", "checkvariables", "chem", "chemical", "chemicalbottext", "chemicalmidtext", "chemicalsymbol", "chemicaltext", "chemicaltoptext", "chineseallnumerals", "chinesecapnumerals", "chinesenumerals", "citation", "cite", "clap", "classfont", "cldcommand", "cldcontext", "cldloadfile", "cldprocessfile", "cleftarrow", "clip", "clonefield", "collect", "collectedtext", "collectexpanded", "color", "colorbar", "colorcomponents", "colored", "coloronly", "colorvalue", "column", "columnbreak", "combinepages", "commalistelement", "commalistsentence", "commalistsize", "comment", "comparecolorgroup", "comparedimension", "comparedimensioneps", "comparepalet", "completebtxrendering", "completelist", "completelistofpublications", "completelistofsorts", "completelistofsynonyms", "completepagenumber", "completeregister", "complexorsimple", "complexorsimpleempty", "component", "composedcollector", "composedlayer", "compresult", "constantdimen", "constantdimenargument", "constantemptyargument", "constantnumber", "constantnumberargument", "contentreference", "continuednumber", "continueifinputfile", "convertargument", "convertcommand", "convertedcounter", "converteddimen", "convertedsubcounter", "convertmonth", "convertnumber", "convertvalue", "convertvboxtohbox", "copyfield", "copypages", "copyparameters", "copyposition", "correctwhitespace", "countersubs", "counttoken", "counttokens", "cramped", "crampedclap", "crampedllap", "crampedrlap", "crightarrow", "crightoverleftarrow", "ctop", "ctxcommand", "ctxdirectcommand", "ctxdirectlua", "ctxfunction", "ctxlatecommand", "ctxlatelua", "ctxloadluafile", "ctxlua", "ctxluabuffer", "ctxluacode", "ctxreport", "ctxsprint", "currentassignmentlistkey", "currentassignmentlistvalue", "currentbtxuservariable", "currentcommalistitem", "currentcomponent", "currentdate", "currentenvironment", "currentfeaturetest", "currentheadnumber", "currentinterface", "currentlanguage", "currentlistentrydestinationattribute", "currentlistentrylimitedtext", "currentlistentrynumber", "currentlistentrypagenumber", "currentlistentryreferenceattribute", "currentlistentrytitle", "currentlistentrytitlerendered", "currentlistsymbol", "currentmainlanguage", "currentmessagetext", "currentmoduleparameter", "currentoutputstream", "currentproduct", "currentproject", "currentregime", "currentregisterpageuserdata", "currentresponses", "currenttime", "currentvalue", "currentxtablecolumn", "currentxtablerow", "datasetvariable", "date", "dayoftheweek", "dayspermonth", "dbinom", "decrement", "decrementcounter", "decrementedcounter", "decrementpagenumber", "decrementsubpagenumber", "decrementvalue", "defaultinterface", "defaultobjectpage", "defaultobjectreference", "defcatcodecommand", "defconvertedargument", "defconvertedcommand", "defconvertedvalue", "define", "defineMPinstance", "defineTABLEsetup", "defineactivecharacter", "definealternativestyle", "defineanchor", "defineattachment", "defineattribute", "definebackground", "definebar", "defineblock", "definebodyfont", "definebodyfontenvironment", "definebodyfontswitch", "definebreakpoint", "definebreakpoints", "definebtx", "definebtxdataset", "definebtxregister", "definebtxrendering", "definebuffer", "definebutton", "definecapitals", "definecharacterkerning", "definecharacterspacing", "definechemical", "definechemicals", "definechemicalsymbol", "definecollector", "definecolor", "definecolorgroup", "definecolumnbreak", "definecombination", "definecombinedlist", "definecomment", "definecomplexorsimple", "definecomplexorsimpleempty", "defineconversion", "defineconversionset", "definecounter", "definedataset", "definedelimitedtext", "definedescription", "definedfont", "defineeffect", "defineenumeration", "defineexpandable", "defineexternalfigure", "definefallbackfamily", "definefield", "definefieldbody", "definefieldbodyset", "definefieldcategory", "definefieldstack", "definefiguresymbol", "definefileconstant", "definefilefallback", "definefilesynonym", "definefiller", "definefirstline", "definefittingpage", "definefloat", "definefont", "definefontalternative", "definefontfallback", "definefontfamily", "definefontfamilypreset", "definefontfeature", "definefontfile", "definefontsize", "definefontsolution", "definefontstyle", "definefontsynonym", "defineformula", "defineformulaalternative", "defineformulaframed", "defineframed", "defineframedcontent", "defineframedtext", "definefrozenfont", "defineglobalcolor", "definegraphictypesynonym", "definegridsnapping", "definehbox", "definehead", "defineheadalternative", "definehelp", "definehigh", "definehighlight", "definehspace", "definehypenationfeatures", "defineindentedtext", "defineindenting", "defineinitial", "defineinsertion", "defineinteraction", "defineinteractionbar", "defineinteractionmenu", "defineinterfaceconstant", "defineinterfaceelement", "defineinterfacevariable", "defineinterlinespace", "defineintermediatecolor", "defineitemgroup", "defineitems", "definelabel", "definelabelclass", "definelayer", "definelayerpreset", "definelayout", "definelinefiller", "definelinenote", "definelinenumbering", "definelines", "definelist", "definelistalternative", "definelistextra", "definelow", "definelowhigh", "definelowmidhigh", "definemakeup", "definemarginblock", "definemargindata", "definemarker", "definemarking", "definemathalignment", "definemathcases", "definemathcommand", "definemathdoubleextensible", "definemathematics", "definemathextensible", "definemathfence", "definemathfraction", "definemathframed", "definemathmatrix", "definemathornament", "definemathoverextensible", "definemathovertextextensible", "definemathradical", "definemathstackers", "definemathstyle", "definemathtriplet", "definemathunderextensible", "definemathundertextextensible", "definemathunstacked", "definemeasure", "definemessageconstant", "definemixedcolumns", "definemode", "definemultitonecolor", "definenamedcolor", "definenamespace", "definenarrower", "definenote", "defineornament", "defineoutputroutine", "defineoutputroutinecommand", "defineoverlay", "definepage", "definepagebreak", "definepagechecker", "definepagegrid", "definepagegridarea", "definepagegridspan", "definepageinjection", "definepageinjectionalternative", "definepageshift", "definepagestate", "definepairedbox", "definepalet", "definepapersize", "defineparagraph", "defineparagraphs", "defineparallel", "defineparbuilder", "defineplacement", "definepositioning", "defineprefixset", "defineprocesscolor", "defineprocessor", "defineprofile", "defineprogram", "definepushbutton", "definepushsymbol", "definereference", "definereferenceformat", "defineregister", "definerenderingwindow", "defineresetset", "definescale", "definescript", "definesection", "definesectionblock", "definesectionlevels", "defineselector", "defineseparatorset", "defineshift", "definesidebar", "definesort", "definesorting", "definespotcolor", "definestartstop", "definestyle", "definestyleinstance", "definesubfield", "definesubformula", "definesymbol", "definesynonym", "definesynonyms", "definesystemattribute", "definesystemconstant", "definesystemvariable", "definetabletemplate", "definetabulate", "definetabulation", "definetext", "definetextbackground", "definetextflow", "definetooltip", "definetransparency", "definetwopasslist", "definetype", "definetypeface", "definetypescriptprefix", "definetypescriptsynonym", "definetypesetting", "definetyping", "defineunit", "defineviewerlayer", "definevspace", "definevspacing", "definevspacingamount", "definextable", "delimited", "delimitedtext", "depthofstring", "depthonlybox", "depthspanningtext", "determineheadnumber", "determinelistcharacteristics", "determinenoflines", "determineregistercharacteristics", "devanagarinumerals", "dfrac", "digits", "dimensiontocount", "directcolor", "directcolored", "directconvertedcounter", "directdummyparameter", "directgetboxllx", "directgetboxlly", "directhighlight", "directlocalframed", "directluacode", "directselect", "directsetbar", "directsetup", "directsymbol", "directvspacing", "dis", "disabledirectives", "disableexperiments", "disablemode", "disableoutputstream", "disableparpositions", "disableregime", "disabletrackers", "displaymath", "displaymathematics", "displaymessage", "distributedhsize", "dividedsize", "doadaptleftskip", "doadaptrightskip", "doaddfeature", "doassign", "doassignempty", "doboundtext", "docheckassignment", "docheckedpagestate", "docheckedpair", "documentvariable", "dodoubleargument", "dodoubleargumentwithset", "dodoubleempty", "dodoubleemptywithset", "dodoublegroupempty", "doeassign", "doexpandedrecurse", "dogetattribute", "dogetattributeid", "dogetcommacommandelement", "dogobbledoubleempty", "dogobblesingleempty", "doif", "doifMPgraphicelse", "doifallcommon", "doifallcommonelse", "doifalldefinedelse", "doifallmodes", "doifallmodeselse", "doifassignmentelse", "doifblackelse", "doifbothsides", "doifbothsidesoverruled", "doifboxelse", "doifbufferelse", "doifcolor", "doifcolorelse", "doifcommandhandler", "doifcommandhandlerelse", "doifcommon", "doifcommonelse", "doifcontent", "doifconversiondefinedelse", "doifconversionnumberelse", "doifcounter", "doifcounterelse", "doifcurrentfonthasfeatureelse", "doifdefined", "doifdefinedcounter", "doifdefinedcounterelse", "doifdefinedelse", "doifdimensionelse", "doifdimenstringelse", "doifdocumentargument", "doifdocumentargumentelse", "doifdocumentfilename", "doifdocumentfilenameelse", "doifdrawingblackelse", "doifelse", "doifelseMPgraphic", "doifelseallcommon", "doifelsealldefined", "doifelseallmodes", "doifelseassignment", "doifelseblack", "doifelsebox", "doifelsebuffer", "doifelsecolor", "doifelsecommandhandler", "doifelsecommon", "doifelseconversiondefined", "doifelseconversionnumber", "doifelsecounter", "doifelsecurrentfonthasfeature", "doifelsecurrentsortingused", "doifelsecurrentsynonymshown", "doifelsecurrentsynonymused", "doifelsedefined", "doifelsedefinedcounter", "doifelsedimension", "doifelsedimenstring", "doifelsedocumentargument", "doifelsedocumentfilename", "doifelsedrawingblack", "doifelseempty", "doifelseemptyvalue", "doifelseemptyvariable", "doifelseenv", "doifelsefastoptionalcheck", "doifelsefastoptionalcheckcs", "doifelsefieldbody", "doifelsefieldcategory", "doifelsefigure", "doifelsefile", "doifelsefiledefined", "doifelsefileexists", "doifelsefirstchar", "doifelseflagged", "doifelsefontchar", "doifelsefontpresent", "doifelsefontsynonym", "doifelsehasspace", "doifelsehelp", "doifelseincsname", "doifelseinelement", "doifelseinputfile", "doifelseinsertion", "doifelseinset", "doifelseinstring", "doifelseinsymbolset", "doifelseintoks", "doifelseintwopassdata", "doifelseitalic", "doifelselanguage", "doifelselayerdata", "doifelselayoutdefined", "doifelselayoutsomeline", "doifelselayouttextline", "doifelseleapyear", "doifelselist", "doifelselocation", "doifelselocfile", "doifelsemainfloatbody", "doifelsemarking", "doifelsemeaning", "doifelsemessage", "doifelsemode", "doifelsenextbgroup", "doifelsenextbgroupcs", "doifelsenextchar", "doifelsenextoptional", "doifelsenextoptionalcs", "doifelsenextparenthesis", "doifelsenonzeropositive", "doifelsenoteonsamepage", "doifelsenothing", "doifelsenumber", "doifelseobjectfound", "doifelseobjectreferencefound", "doifelseoddpage", "doifelseoddpagefloat", "doifelseoldercontext", "doifelseolderversion", "doifelseoverlapping", "doifelseoverlay", "doifelseparallel", "doifelseparentfile", "doifelsepath", "doifelsepathexists", "doifelsepatterns", "doifelseposition", "doifelsepositionaction", "doifelsepositiononpage", "doifelsepositionsonsamepage", "doifelsepositionsonthispage", "doifelsepositionsused", "doifelsereferencefound", "doifelserightpagefloat", "doifelserighttoleftinbox", "doifelsesamelinereference", "doifelsesamestring", "doifelsesetups", "doifelsesomebackground", "doifelsesomespace", "doifelsesomething", "doifelsesometoks", "doifelsestringinstring", "doifelsestructurelisthasnumber", "doifelsestructurelisthaspage", "doifelsesymboldefined", "doifelsesymbolset", "doifelsetext", "doifelsetextflow", "doifelsetextflowcollector", "doifelsetypingfile", "doifelseundefined", "doifelseurldefined", "doifelsevalue", "doifelsevaluenothing", "doifelsevariable", "doifempty", "doifemptyelse", "doifemptytoks", "doifemptyvalue", "doifemptyvalueelse", "doifemptyvariable", "doifemptyvariableelse", "doifenv", "doifenvelse", "doiffastoptionalcheckcselse", "doiffastoptionalcheckelse", "doiffieldbodyelse", "doiffieldcategoryelse", "doiffigureelse", "doiffile", "doiffiledefinedelse", "doiffileelse", "doiffileexistselse", "doiffirstcharelse", "doifflaggedelse", "doiffontcharelse", "doiffontpresentelse", "doiffontsynonymelse", "doifhasspaceelse", "doifhelpelse", "doifincsnameelse", "doifinelementelse", "doifinputfileelse", "doifinsertionelse", "doifinset", "doifinsetelse", "doifinstring", "doifinstringelse", "doifinsymbolset", "doifinsymbolsetelse", "doifintokselse", "doifintwopassdataelse", "doifitalicelse", "doiflanguageelse", "doiflayerdataelse", "doiflayoutdefinedelse", "doiflayoutsomelineelse", "doiflayouttextlineelse", "doifleapyearelse", "doiflistelse", "doiflocationelse", "doiflocfileelse", "doifmainfloatbodyelse", "doifmarkingelse", "doifmeaningelse", "doifmessageelse", "doifmode", "doifmodeelse", "doifnextbgroupcselse", "doifnextbgroupelse", "doifnextcharelse", "doifnextoptionalcselse", "doifnextoptionalelse", "doifnextparenthesiselse", "doifnonzeropositiveelse", "doifnot", "doifnotallcommon", "doifnotallmodes", "doifnotcommandhandler", "doifnotcommon", "doifnotcounter", "doifnotdocumentargument", "doifnotdocumentfilename", "doifnotempty", "doifnotemptyvalue", "doifnotemptyvariable", "doifnotenv", "doifnoteonsamepageelse", "doifnotescollected", "doifnotfile", "doifnotflagged", "doifnothing", "doifnothingelse", "doifnotinset", "doifnotinsidesplitfloat", "doifnotinstring", "doifnotmode", "doifnotnumber", "doifnotsamestring", "doifnotsetups", "doifnotvalue", "doifnotvariable", "doifnumber", "doifnumberelse", "doifobjectfoundelse", "doifobjectreferencefoundelse", "doifoddpageelse", "doifoddpagefloatelse", "doifoldercontextelse", "doifolderversionelse", "doifoverlappingelse", "doifoverlayelse", "doifparallelelse", "doifparentfileelse", "doifpathelse", "doifpathexistselse", "doifpatternselse", "doifposition", "doifpositionaction", "doifpositionactionelse", "doifpositionelse", "doifpositiononpageelse", "doifpositionsonsamepageelse", "doifpositionsonthispageelse", "doifpositionsusedelse", "doifreferencefoundelse", "doifrightpagefloatelse", "doifrighttoleftinboxelse", "doifsamelinereferenceelse", "doifsamestring", "doifsamestringelse", "doifsetups", "doifsetupselse", "doifsomebackground", "doifsomebackgroundelse", "doifsomespaceelse", "doifsomething", "doifsomethingelse", "doifsometoks", "doifsometokselse", "doifstringinstringelse", "doifstructurelisthasnumberelse", "doifstructurelisthaspageelse", "doifsymboldefinedelse", "doifsymbolsetelse", "doiftext", "doiftextelse", "doiftextflowcollectorelse", "doiftextflowelse", "doiftypingfileelse", "doifundefined", "doifundefinedcounter", "doifundefinedelse", "doifurldefinedelse", "doifvalue", "doifvalueelse", "doifvaluenothing", "doifvaluenothingelse", "doifvaluesomething", "doifvariable", "doifvariableelse", "doindentation", "dollar", "doloop", "doloopoverlist", "donothing", "dontconvertfont", "dontleavehmode", "dontpermitspacesbetweengroups", "dopositionaction", "doprocesslocalsetups", "doquadrupleargument", "doquadrupleempty", "doquadruplegroupempty", "doquintupleargument", "doquintupleempty", "doquintuplegroupempty", "dorechecknextindentation", "dorecurse", "dorepeatwithcommand", "doreplacefeature", "doresetandafffeature", "doresetattribute", "dorotatebox", "dosetattribute", "dosetleftskipadaption", "dosetrightskipadaption", "dosetupcheckedinterlinespace", "doseventupleargument", "doseventupleempty", "dosingleargument", "dosingleempty", "dosinglegroupempty", "dosixtupleargument", "dosixtupleempty", "dostepwiserecurse", "dosubtractfeature", "dotfskip", "dotoks", "dotripleargument", "dotripleargumentwithset", "dotripleempty", "dotripleemptywithset", "dotriplegroupempty", "doublebar", "doublebond", "doublebrace", "doublebracket", "doubleparent", "dowith", "dowithnextbox", "dowithnextboxcontent", "dowithnextboxcontentcs", "dowithnextboxcs", "dowithpargument", "dowithrange", "dowithwargument", "dpofstring", "dummydigit", "dummyparameter", "eTeX", "edefconvertedargument", "efcmaxheight", "efcmaxwidth", "efcminheight", "efcminwidth", "efcparameter", "effect", "elapsedseconds", "elapsedtime", "eleftarrowfill", "eleftharpoondownfill", "eleftharpoonupfill", "eleftrightarrowfill", "emphasisboldface", "emphasistypeface", "emptylines", "emspace", "enabledirectives", "enableexperiments", "enablemode", "enableoutputstream", "enableparpositions", "enableregime", "enabletrackers", "enskip", "enspace", "env", "environment", "envvar", "eoverbarfill", "eoverbracefill", "eoverbracketfill", "eoverparentfill", "epos", "equaldigits", "erightarrowfill", "erightharpoondownfill", "erightharpoonupfill", "etwoheadrightarrowfill", "eunderbarfill", "eunderbracefill", "eunderbracketfill", "eunderparentfill", "executeifdefined", "exitloop", "exitloopnow", "expandcheckedcsname", "expanded", "expandfontsynonym", "externalfigure", "externalfigurecollectionmaxheight", "externalfigurecollectionmaxwidth", "externalfigurecollectionminheight", "externalfigurecollectionminwidth", "externalfigurecollectionparameter", "fakebox", "fastdecrement", "fastincrement", "fastlocalframed", "fastscale", "fastsetup", "fastsetupwithargument", "fastsetupwithargumentswapped", "fastswitchtobodyfont", "fastsxsy", "feature", "fence", "fenced", "fetchallmarkings", "fetchallmarks", "fetchmark", "fetchmarking", "fetchonemark", "fetchonemarking", "fetchruntinecommand", "fetchtwomarkings", "fetchtwomarks", "field", "fieldbody", "fieldstack", "fifthoffivearguments", "fifthofsixarguments", "figure", "figurefilename", "figurefilepath", "figurefiletype", "figurefullname", "figureheight", "figurenaturalheight", "figurenaturalwidth", "figuresymbol", "figurewidth", "filename", "filledhboxb", "filledhboxc", "filledhboxg", "filledhboxk", "filledhboxm", "filledhboxr", "filledhboxy", "filler", "fillinline", "fillinrules", "fillintext", "filterfromnext", "filterfromvalue", "filterpages", "filterreference", "findtwopassdata", "finishregisterentry", "firstcharacter", "firstcounter", "firstcountervalue", "firstoffivearguments", "firstoffourarguments", "firstofoneargument", "firstofoneunexpanded", "firstofsixarguments", "firstofthreearguments", "firstofthreeunexpanded", "firstoftwoarguments", "firstoftwounexpanded", "firstrealpage", "firstrealpagenumber", "firstsubcountervalue", "firstsubpage", "firstsubpagenumber", "firstuserpage", "firstuserpagenumber", "fitfield", "fitfieldframed", "fittopbaselinegrid", "fixedspace", "fixedspaces", "flag", "floatuserdataparameter", "flushboxregister", "flushcollector", "flushlayer", "flushlocalfloats", "flushnextbox", "flushnotes", "flushoutputstream", "flushshapebox", "flushtextflow", "flushtokens", "flushtoks", "fontalternative", "fontbody", "fontchar", "fontcharbyindex", "fontclass", "fontclassname", "fontface", "fontfeaturelist", "fontsize", "fontstyle", "footnotetext", "forcecharacterstripping", "forcelocalfloats", "forgeteverypar", "forgetparameters", "formula", "formulanumber", "foundbox", "fourthoffivearguments", "fourthoffourarguments", "fourthofsixarguments", "frac", "framed", "frameddimension", "framedparameter", "framedtext", "freezedimenmacro", "freezemeasure", "frenchspacing", "from", "fromlinenote", "frozenhbox", "gdefconvertedargument", "gdefconvertedcommand", "getMPdrawing", "getMPlayer", "getboxllx", "getboxlly", "getbuffer", "getbufferdata", "getcommacommandsize", "getcommalistsize", "getdayoftheweek", "getdayspermonth", "getdefinedbuffer", "getdocumentargument", "getdocumentargumentdefault", "getdocumentfilename", "getdummyparameters", "getemptyparameters", "geteparameters", "getexpandedparameters", "getfiguredimensions", "getfirstcharacter", "getfirsttwopassdata", "getfromcommacommand", "getfromcommalist", "getfromtwopassdata", "getglyphdirect", "getglyphstyled", "getgparameters", "getlasttwopassdata", "getlocalfloat", "getlocalfloats", "getmarking", "getmessage", "getnamedglyphdirect", "getnamedglyphstyled", "getnamedtwopassdatalist", "getnaturaldimensions", "getnoflines", "getobject", "getobjectdimensions", "getpaletsize", "getparameters", "getprivatechar", "getprivateslot", "getrandomcount", "getrandomdimen", "getrandomfloat", "getrandomnumber", "getrandomseed", "getraweparameters", "getrawgparameters", "getrawnoflines", "getrawparameters", "getrawxparameters", "getreference", "getreferenceentry", "getroundednoflines", "getsubstring", "gettwopassdata", "gettwopassdatalist", "getuvalue", "getvalue", "getvariable", "getvariabledefault", "getxparameters", "globaldisablemode", "globalenablemode", "globalletempty", "globalpopbox", "globalpopmacro", "globalpreventmode", "globalprocesscommalist", "globalpushbox", "globalpushmacro", "globalswapcounts", "globalswapdimens", "globalswapmacros", "globalundefine", "glyphfontfile", "gobbledoubleempty", "gobbleeightarguments", "gobblefivearguments", "gobblefiveoptionals", "gobblefourarguments", "gobblefouroptionals", "gobbleninearguments", "gobbleoneargument", "gobbleoneoptional", "gobblesevenarguments", "gobblesingleempty", "gobblesixarguments", "gobblespacetokens", "gobbletenarguments", "gobblethreearguments", "gobblethreeoptionals", "gobbletwoarguments", "gobbletwooptionals", "gobbleuntil", "gobbleuntilrelax", "godown", "goto", "gotobox", "gotopage", "grabbufferdata", "grabbufferdatadirect", "grabuntil", "graphic", "graycolor", "grayvalue", "greedysplitstring", "greeknumerals", "grid", "groupedcommand", "gsetboxllx", "gsetboxlly", "gujaratinumerals", "gurmurkhinumerals", "hairline", "hairspace", "halfwaybox", "handletokens", "handwritten", "hash", "hboxofvbox", "hboxreference", "hdofstring", "headhbox", "headnumber", "headnumbercontent", "headnumberdistance", "headnumberwidth", "headreferenceattributes", "headsetupspacing", "headtextcontent", "headtextdistance", "headtextwidth", "headvbox", "headwidth", "heightanddepthofstring", "heightofstring", "heightspanningtext", "helptext", "hglue", "hiddenbar", "hiddencitation", "hiddencite", "hideblocks", "hiding", "high", "highlight", "highordinalstr", "hilo", "himilo", "hl", "horizontalgrowingbar", "horizontalpositionbar", "hphantom", "hpos", "hsizefraction", "hsmash", "hsmashbox", "hsmashed", "hspace", "htdpofstring", "htofstring", "hyphen", "hyphenatedcoloredword", "hyphenatedfile", "hyphenatedfilename", "hyphenatedhbox", "hyphenatedpar", "hyphenatedurl", "hyphenatedword", "ibox", "ifassignment", "iff", "ifinobject", "ifinoutputstream", "ifparameters", "iftrialtypesetting", "ignoreimplicitspaces", "ignorevalue", "immediatesavetwopassdata", "impliedby", "implies", "in", "includemenu", "includeversioninfo", "increment", "incrementcounter", "incrementedcounter", "incrementpagenumber", "incrementsubpagenumber", "incrementvalue", "indentation", "infofont", "infofontbold", "inframed", "infull", "inheritparameter", "inhibitblank", "initializeboxstack", "inline", "inlinebuffer", "inlinedbox", "inlinemath", "inlinemathematics", "inlinemessage", "inlineordisplaymath", "inlinerange", "inmaframed", "innerflushshapebox", "input", "inputfilebarename", "inputfilename", "inputfilerealsuffix", "inputfilesuffix", "inputgivenfile", "insertpages", "installactionhandler", "installactivecharacter", "installanddefineactivecharacter", "installattributestack", "installautocommandhandler", "installautosetuphandler", "installbasicautosetuphandler", "installbasicparameterhandler", "installbottomframerenderer", "installcommandhandler", "installcorenamespace", "installdefinehandler", "installdefinitionset", "installdefinitionsetmember", "installdirectcommandhandler", "installdirectparameterhandler", "installdirectparametersethandler", "installdirectsetuphandler", "installdirectstyleandcolorhandler", "installframedautocommandhandler", "installframedcommandhandler", "installlanguage", "installleftframerenderer", "installnamespace", "installoutputroutine", "installpagearrangement", "installparameterhandler", "installparameterhashhandler", "installparametersethandler", "installparentinjector", "installrightframerenderer", "installrootparameterhandler", "installsetuphandler", "installsetuponlycommandhandler", "installshipoutmethod", "installsimplecommandhandler", "installsimpleframedcommandhandler", "installstyleandcolorhandler", "installswitchcommandhandler", "installswitchsetuphandler", "installtexdirective", "installtextracker", "installtopframerenderer", "installunitsseparator", "installunitsspace", "installversioninfo", "integerrounding", "interactionbar", "interactionbuttons", "interactionmenu", "intermezzo", "intertext", "invokepageheandler", "istltdir", "istrtdir", "italic", "italicbold", "italiccorrection", "item", "itemize", "items", "itemtag", "jobfilename", "jobfilesuffix", "kap", "keepblocks", "keeplinestogether", "keepunwantedspaces", "kerncharacters", "koreancirclenumerals", "koreannumerals", "koreannumeralsc", "koreannumeralsp", "koreanparentnumerals", "language", "languageCharacters", "languagecharacters", "languagecharwidth", "lastcounter", "lastcountervalue", "lastdigit", "lastlinewidth", "lastnaturalboxdp", "lastnaturalboxht", "lastnaturalboxwd", "lastpredefinedsymbol", "lastrealpage", "lastrealpagenumber", "lastsubcountervalue", "lastsubpage", "lastsubpagenumber", "lasttwodigits", "lastuserpage", "lastuserpagenumber", "lateluacode", "layeredtext", "layerheight", "layerwidth", "lazysavetaggedtwopassdata", "lazysavetwopassdata", "lbox", "left", "leftbottombox", "leftbox", "lefthbox", "leftorrighthbox", "leftorrightvbox", "leftorrightvtop", "leftskipadaption", "leftsubguillemot", "lefttopbox", "lefttorighthbox", "lefttorightvbox", "lefttorightvtop", "letbeundefined", "letcatcodecommand", "letcscsname", "letcsnamecs", "letcsnamecsname", "letdummyparameter", "letempty", "letgvalue", "letgvalueempty", "letgvalurelax", "letterampersand", "letterat", "letterbackslash", "letterbar", "letterbgroup", "letterclosebrace", "lettercolon", "letterdollar", "letterdoublequote", "letteregroup", "letterescape", "letterexclamationmark", "letterhash", "letterhat", "letterleftbrace", "letterless", "lettermore", "letteropenbrace", "letterpercent", "letterquestionmark", "letterrightbrace", "lettersinglequote", "letterslash", "letterspacing", "lettertilde", "letterunderscore", "letvalue", "letvalueempty", "letvaluerelax", "lfence", "lhbox", "limitatelines", "limitatetext", "limtatefirstline", "linespanningtext", "linethickness", "listcitation", "listcite", "listlength", "listnamespaces", "llap", "loadanyfile", "loadanyfileonce", "loadbtxdefinitionfile", "loadbtxreplacementfile", "loadcldfile", "loadcldfileonce", "loadfontgoodies", "loadluafile", "loadluafileonce", "loadspellchecklist", "loadtexfile", "loadtexfileonce", "loadtypescriptfile", "localframed", "localframedwithsettings", "localhsize", "localpopbox", "localpopmacro", "localpushbox", "localpushmacro", "localundefine", "locatedfilepath", "locatefilepath", "locfilename", "lohi", "lomihi", "low", "lowerbox", "lowercased", "lowercasestring", "lowerleftdoubleninequote", "lowerleftsingleninequote", "lowerrightdoubleninequote", "lowerrightsingleninequote", "lrtbbox", "ltop", "luaTeX", "luacode", "luaconditional", "luaenvironment", "luaexpanded", "luafunction", "luajitTeX", "luamajorversion", "luaminorversion", "luaparameterset", "luasetup", "luaversion", "m", "mLeftarrow", "mLeftrightarrow", "mRightarrow", "maframed", "mainlanguage", "makecharacteractive", "makerawcommalist", "makestrutofbox", "mapfontsize", "margindata", "markcontent", "marking", "markinjector", "mat", "math", "mathbf", "mathbi", "mathblackboard", "mathbs", "mathcommand", "mathdefault", "mathematics", "mathfraktur", "mathfunction", "mathit", "mathitalic", "mathop", "mathrm", "mathscript", "mathsl", "mathss", "mathtext", "mathtextbf", "mathtextbi", "mathtextbs", "mathtextit", "mathtextsl", "mathtexttf", "mathtf", "mathtriplet", "mathtt", "mathupright", "mathword", "mathwordbf", "mathwordbi", "mathwordbs", "mathwordit", "mathwordsl", "mathwordtf", "mbox", "mcframed", "md", "measure", "measured", "medskip", "medspace", "menubutton", "mequal", "message", "metaTeX", "mfence", "mfunction", "mfunctionlabeltext", "mhbox", "mhookleftarrow", "mhookrightarrow", "middle", "middlebox", "midhbox", "minimalhbox", "mirror", "mixedcaps", "mkvibuffer", "mleftarrow", "mleftharpoondown", "mleftharpoonup", "mleftrightarrow", "mleftrightharpoons", "mmapsto", "moduleparameter", "molecule", "mono", "monobold", "mononormal", "month", "monthlong", "monthshort", "mp", "mprandomnumber", "mrel", "mrightarrow", "mrightharpoondown", "mrightharpoonup", "mrightleftharpoons", "mrightoverleftarrow", "mtext", "mtriplerel", "mtwoheadleftarrow", "mtwoheadrightarrow", "namedheadnumber", "namedstructureheadlocation", "namedstructureuservariable", "namedstructurevariable", "namedtaggedlabeltexts", "naturalhbox", "naturalhpack", "naturalvbox", "naturalvcenter", "naturalvpack", "naturalvtop", "naturalwd", "negatecolorbox", "negated", "negthinspace", "newattribute", "newcatcodetable", "newcounter", "newevery", "newfrenchspacing", "newmode", "newsignal", "newsystemmode", "nextbox", "nextboxdp", "nextboxht", "nextboxhtdp", "nextboxwd", "nextcounter", "nextcountervalue", "nextdepth", "nextparagraphs", "nextrealpage", "nextrealpagenumber", "nextsubcountervalue", "nextsubpage", "nextsubpagenumber", "nextuserpage", "nextuserpagenumber", "nobar", "nocap", "nocitation", "nocite", "nodetostring", "noffigurepages", "noflines", "noflocalfloats", "noheaderandfooterlines", "noindentation", "noitem", "nonfrenchspacing", "nonmathematics", "normal", "normalboldface", "normalframedwithsettings", "normalizebodyfontsize", "normalizedfontsize", "normalizefontdepth", "normalizefontheight", "normalizefontline", "normalizefontwidth", "normalizetextdepth", "normalizetextheight", "normalizetextline", "normalizetextwidth", "normaltypeface", "nospace", "note", "notesymbol", "notopandbottomlines", "ntimes", "numberofpoints", "numbers", "obeydepth", "objectdepth", "objectheight", "objectmargin", "objectwidth", "obox", "offset", "offsetbox", "onedigitrounding", "ordinaldaynumber", "ordinalstr", "ornamenttext", "outputfilename", "outputstreambox", "outputstreamcopy", "outputstreamunvbox", "outputstreamunvcopy", "over", "overbar", "overbars", "overbartext", "overbarunderbar", "overbrace", "overbracetext", "overbraceunderbrace", "overbracket", "overbrackettext", "overbracketunderbracket", "overlaybutton", "overlaycolor", "overlaydepth", "overlayfigure", "overlayheight", "overlaylinecolor", "overlaylinewidth", "overlayoffset", "overlayrollbutton", "overlaywidth", "overleftarrow", "overleftharpoondown", "overleftharpoonup", "overleftrightarrow", "overloaderror", "overparent", "overparenttext", "overparentunderparent", "overrightarrow", "overrightharpoondown", "overrightharpoonup", "overset", "overstrike", "overstrikes", "overtwoheadleftarrow", "overtwoheadrightarrow", "page", "pagearea", "pagebreak", "pagefigure", "pagegridspanwidth", "pageinjection", "pagenumber", "pagereference", "pagestaterealpage", "paletsize", "pdfTeX", "pdfactualtext", "pdfbackendactualtext", "pdfbackendcurrentresources", "pdfbackendsetcatalog", "pdfbackendsetcolorspace", "pdfbackendsetextgstate", "pdfbackendsetinfo", "pdfbackendsetname", "pdfbackendsetpageattribute", "pdfbackendsetpageresource", "pdfbackendsetpagesattribute", "pdfbackendsetpattern", "pdfbackendsetshade", "pdfcolor", "pdfeTeX", "percent", "percentdimen", "periods", "permitcaretescape", "permitcircumflexescape", "permitspacesbetweengroups", "persiandecimals", "persiannumerals", "phantom", "phantombox", "pickupgroupedcommand", "placeattachments", "placebookmarks", "placebtxrendering", "placecitation", "placecombinedlist", "placecomments", "placecurrentformulanumber", "placedbox", "placefloat", "placefloatwithsetups", "placefootnotes", "placeformula", "placeframed", "placeheadnumber", "placeheadtext", "placehelp", "placeinitial", "placelayer", "placelayeredtext", "placelist", "placelistofpublications", "placelistofsorts", "placelistofsynonyms", "placelocalfootnotes", "placelocalnotes", "placement", "placenamedfloat", "placenamedformula", "placenotes", "placeongrid", "placeontopofeachother", "placepagenumber", "placepairedbox", "placeparallel", "placerawlist", "placeregister", "placerenderingwindow", "placesidebyside", "placesubformula", "popattribute", "popmacro", "popmode", "popsystemmode", "position", "positionoverlay", "positionregionoverlay", "postponenotes", "predefinedfont", "predefinefont", "predefinesymbol", "prefixedpagenumber", "prependetoks", "prependgvalue", "prependtocommalist", "prependtoks", "prependtoksonce", "prependvalue", "presetdocument", "presetfieldsymbols", "pretocommalist", "prevcounter", "prevcountervalue", "preventmode", "prevrealpage", "prevrealpagenumber", "prevsubcountervalue", "prevsubpage", "prevsubpagenumber", "prevuserpage", "prevuserpagenumber", "procent", "processMPbuffer", "processMPfigurefile", "processaction", "processallactionsinset", "processassignlist", "processassignmentcommand", "processassignmentlist", "processbetween", "processblocks", "processbodyfontenvironmentlist", "processcolorcomponents", "processcommacommand", "processcommalist", "processcommalistwithparameters", "processcontent", "processfile", "processfilemany", "processfilenone", "processfileonce", "processfirstactioninset", "processisolatedchars", "processisolatedwords", "processlinetablebuffer", "processlinetablefile", "processlist", "processmonth", "processranges", "processseparatedlist", "processtexbuffer", "processtokens", "processuntil", "processxtablebuffer", "processyear", "product", "profiledbox", "profilegivenbox", "program", "project", "pseudoMixedCapped", "pseudoSmallCapped", "pseudoSmallcapped", "pseudosmallcapped", "purenumber", "pushattribute", "pushbutton", "pushmacro", "pushmode", "pushoutputstream", "pushsystemmode", "qquad", "quad", "quads", "quitcommalist", "quitprevcommalist", "quittypescriptscanning", "quotation", "quote", "raisebox", "randomizetext", "randomnumber", "rawcounter", "rawcountervalue", "rawdate", "rawdoifelseinset", "rawdoifinset", "rawdoifinsetelse", "rawgetparameters", "rawprocessaction", "rawprocesscommacommand", "rawprocesscommalist", "rawstructurelistuservariable", "rawsubcountervalue", "rbox", "readfile", "readfixfile", "readjobfile", "readlocfile", "readsetfile", "readsysfile", "readtexfile", "readxmlfile", "realSmallCapped", "realSmallcapped", "realpagenumber", "realsmallcapped", "recursedepth", "recurselevel", "recursestring", "redoconvertfont", "ref", "reference", "referenceprefix", "referring", "registerattachment", "registerctxluafile", "registerexternalfigure", "registerfontclass", "registerhyphenationexception", "registerhyphenationpattern", "registermenubuttons", "registersort", "registersynonym", "registerunit", "regular", "relatemarking", "relateparameterhandlers", "relaxvalueifundefined", "remainingcharacters", "remark", "removebottomthings", "removedepth", "removefromcommalist", "removelastskip", "removelastspace", "removemarkedcontent", "removepunctuation", "removesubstring", "removetoks", "removeunwantedspaces", "replacefeature", "replaceincommalist", "replaceword", "rescan", "rescanwithsetup", "resetMPdrawing", "resetMPenvironment", "resetMPinstance", "resetallattributes", "resetandaddfeature", "resetbar", "resetbreakpoints", "resetbuffer", "resetcharacteralign", "resetcharacterkerning", "resetcharacterspacing", "resetcharacterstripping", "resetcollector", "resetcounter", "resetdigitsmanipulation", "resetdirection", "resetfeature", "resetflag", "resetfontcolorsheme", "resetfontfallback", "resetfontsolution", "resethyphenationfeatures", "resetinjector", "resetinteractionmenu", "resetitaliccorrection", "resetlayer", "resetlocalfloats", "resetmarker", "resetmarking", "resetmode", "resetpagenumber", "resetparallel", "resetpath", "resetpenalties", "resetprofile", "resetreference", "resetreplacement", "resetscript", "resetsetups", "resetshownsynonyms", "resetsubpagenumber", "resetsymbolset", "resetsystemmode", "resettimer", "resettrackers", "resettrialtypesetting", "resetusedsortings", "resetusedsynonyms", "resetuserpagenumber", "resetvalue", "resetvisualizers", "reshapebox", "resolvedglyphdirect", "resolvedglyphstyled", "restartcounter", "restorebox", "restorecatcodes", "restorecounter", "restorecurrentattributes", "restoreendofline", "restoreglobalbodyfont", "reusableMPgraphic", "reuseMPgraphic", "reuserandomseed", "revivefeature", "rfence", "rhbox", "right", "rightbottombox", "rightbox", "righthbox", "rightorleftpageaction", "rightskipadaption", "rightsubguillemot", "righttolefthbox", "righttoleftvbox", "righttoleftvtop", "righttopbox", "rlap", "robustaddtocommalist", "robustdoifelseinset", "robustdoifinsetelse", "robustpretocommalist", "rollbutton", "roman", "romannumerals", "rotate", "rtop", "ruledhbox", "ruledhpack", "ruledmbox", "ruledtopv", "ruledtpack", "ruledvbox", "ruledvpack", "ruledvtop", "runMPbuffer", "runninghbox", "safechar", "sans", "sansbold", "sansnormal", "sansserif", "savebox", "savebtxdataset", "savebuffer", "savecounter", "savecurrentattributes", "savenormalmeaning", "savetaggedtwopassdata", "savetwopassdata", "sbox", "scale", "screen", "sd", "secondoffivearguments", "secondoffourarguments", "secondofsixarguments", "secondofthreearguments", "secondofthreeunexpanded", "secondoftwoarguments", "secondoftwounexpanded", "section", "select", "selectblocks", "serializecommalist", "serializedcommalist", "serif", "serifbold", "serifnormal", "setJSpreamble", "setMPlayer", "setMPpositiongraphic", "setMPpositiongraphicrange", "setMPtext", "setMPvariable", "setMPvariables", "setbar", "setbigbodyfont", "setboxllx", "setboxlly", "setbreakpoints", "setcapstrut", "setcatcodetable", "setcharacteralign", "setcharactercasing", "setcharactercleaning", "setcharacterkerning", "setcharacterspacing", "setcharacterstripping", "setcharstrut", "setcollector", "setcolormodell", "setcounter", "setcounterown", "setcurrentfontclass", "setdataset", "setdefaultpenalties", "setdigitsmanipulation", "setdirection", "setdocumentargument", "setdocumentargumentdefault", "setdocumentfilename", "setdummyparameter", "setelementexporttag", "setemeasure", "setevalue", "setevariable", "setevariables", "setfirstline", "setflag", "setfont", "setfontcolorsheme", "setfontfeature", "setfontsolution", "setfontstrut", "setfractions", "setgmeasure", "setgvalue", "setgvariable", "setgvariables", "sethboxregister", "sethyphenatedurlafter", "sethyphenatedurlbefore", "sethyphenatedurlnormal", "sethyphenationfeatures", "setinitial", "setinjector", "setinteraction", "setinterfacecommand", "setinterfaceconstant", "setinterfaceelements", "setinterfacemessage", "setinterfacevariable", "setinternalrendering", "setitaliccorrection", "setlayer", "setlayerframed", "setlayertext", "setlinefiller", "setlocalhsize", "setmainbodyfont", "setmainparbuilder", "setmarker", "setmarking", "setmathstyle", "setmeasure", "setmessagetext", "setmode", "setnostrut", "setnote", "setnotetext", "setobject", "setoldstyle", "setpagegrid", "setpagereference", "setpagestate", "setpagestaterealpageno", "setpenalties", "setpercentdimen", "setposition", "setpositionbox", "setpositiondata", "setpositiondataplus", "setpositiononly", "setpositionplus", "setpositionstrut", "setprofile", "setrandomseed", "setreference", "setreferencedobject", "setregisterentry", "setreplacement", "setrigidcolumnbalance", "setrigidcolumnhsize", "setscript", "setsectionblock", "setsimplecolumnhsize", "setsmallbodyfont", "setsmallcaps", "setstackbox", "setstructurepageregister", "setstrut", "setsuperiors", "setsystemmode", "settabular", "settaggedmetadata", "settextcontent", "settightobject", "settightreferencedobject", "settightunreferencedobject", "settrialtypesetting", "setuevalue", "setugvalue", "setunreferencedobject", "setup", "setupMPgraphics", "setupMPinstance", "setupMPpage", "setupMPvariables", "setupTABLE", "setupTEXpage", "setuparranging", "setupattachment", "setupbackend", "setupbackground", "setupbackgrounds", "setupbar", "setupblackrules", "setupblank", "setupbleeding", "setupblock", "setupbodyfont", "setupbookmark", "setupbottom", "setupbottomtexts", "setupbtx", "setupbtxdataset", "setupbtxlist", "setupbtxregister", "setupbtxrendering", "setupbuffer", "setupbutton", "setupcapitals", "setupcaption", "setupcharacterkerning", "setupcharacterspacing", "setupchemical", "setupchemicalframed", "setupclipping", "setupcollector", "setupcolor", "setupcolors", "setupcolumns", "setupcolumnspan", "setupcombination", "setupcombinedlist", "setupcomment", "setupcounter", "setupdataset", "setupdelimitedtext", "setupdescription", "setupdirections", "setupdocument", "setupeffect", "setupenumeration", "setupenv", "setupexport", "setupexternalfigure", "setupexternalsoundtracks", "setupfield", "setupfieldbody", "setupfieldcategory", "setupfieldcontentframed", "setupfieldlabelframed", "setupfields", "setupfieldtotalframed", "setupfiller", "setupfillinlines", "setupfillinrules", "setupfirstline", "setupfittingpage", "setupfloat", "setupfloatcaption", "setupfloatsplitting", "setupfontexpansion", "setupfontprotrusion", "setupfonts", "setupfontsolution", "setupfooter", "setupfootertexts", "setupforms", "setupformula", "setupformulaframed", "setupframed", "setupframedcontent", "setupframedtext", "setupglobalreferenceprefix", "setuphead", "setupheadalternative", "setupheader", "setupheadertexts", "setupheadnumber", "setupheads", "setuphelp", "setuphigh", "setuphighlight", "setuphyphenation", "setuphyphenmark", "setupindentedtext", "setupindenting", "setupinitial", "setupinsertion", "setupinteraction", "setupinteractionbar", "setupinteractionmenu", "setupinteractionscreen", "setupinterlinespace", "setupitaliccorrection", "setupitemgroup", "setupitemizations", "setupitems", "setuplabel", "setuplanguage", "setuplayer", "setuplayeredtext", "setuplayout", "setuplayouttext", "setuplinefiller", "setuplinefillers", "setuplinenote", "setuplinenumbering", "setuplines", "setuplinetable", "setuplinewidth", "setuplist", "setuplistalternative", "setuplistextra", "setuplocalfloats", "setuplocalinterlinespace", "setuplow", "setuplowhigh", "setuplowmidhigh", "setupmakeup", "setupmarginblock", "setupmargindata", "setupmarginframed", "setupmarginrule", "setupmarginrules", "setupmarking", "setupmathalignment", "setupmathcases", "setupmathematics", "setupmathfence", "setupmathfraction", "setupmathframed", "setupmathmatrix", "setupmathornament", "setupmathradical", "setupmathstackers", "setupmathstyle", "setupmixedcolumns", "setupmodule", "setupnarrower", "setupnotation", "setupnotations", "setupnote", "setupnotes", "setupoffset", "setupoffsetbox", "setupoppositeplacing", "setupoutputroutine", "setuppagechecker", "setuppagecomment", "setuppagegrid", "setuppagegridarea", "setuppagegridareatext", "setuppagegridlines", "setuppagegridspan", "setuppagegridstart", "setuppageinjection", "setuppageinjectionalternative", "setuppagenumber", "setuppagenumbering", "setuppageshift", "setuppagestate", "setuppagetransitions", "setuppairedbox", "setuppalet", "setuppaper", "setuppapersize", "setupparagraph", "setupparagraphintro", "setupparagraphnumbering", "setupparagraphs", "setupparallel", "setupperiods", "setupplacement", "setuppositionbar", "setuppositioning", "setupprocessor", "setupprofile", "setupprograms", "setupquotation", "setupquote", "setuprealpagenumber", "setupreferenceformat", "setupreferenceprefix", "setupreferencestructureprefix", "setupreferencing", "setupregister", "setupregisters", "setuprenderingwindow", "setuprotate", "setups", "setupscale", "setupscript", "setupscripts", "setupsectionblock", "setupselector", "setupshift", "setupsidebar", "setupsorting", "setupspacing", "setupspellchecking", "setupstartstop", "setupstretched", "setupstruts", "setupstyle", "setupsubformula", "setupsubpagenumber", "setupsymbolset", "setupsynonyms", "setuptables", "setuptabulate", "setuptabulation", "setuptagging", "setuptext", "setuptextbackground", "setuptextflow", "setuptextrules", "setuptexttexts", "setupthinrules", "setuptolerance", "setuptooltip", "setuptop", "setuptoptexts", "setuptype", "setuptyping", "setupunit", "setupurl", "setupuserpagenumber", "setupversion", "setupviewerlayer", "setupvspacing", "setupwhitespace", "setupwithargument", "setupwithargumentswapped", "setupxml", "setupxtable", "setuvalue", "setuxvalue", "setvalue", "setvariable", "setvariables", "setvboxregister", "setvisualizerfont", "setvtopregister", "setwidthof", "setxmeasure", "setxvalue", "setxvariable", "setxvariables", "sfrac", "shapedhbox", "showallmakeup", "showattributes", "showbodyfont", "showbodyfontenvironment", "showboxes", "showbtxdatasetauthors", "showbtxdatasetcompleteness", "showbtxdatasetfields", "showbtxfields", "showbtxhashedauthors", "showbtxtables", "showchardata", "showcharratio", "showcolor", "showcolorbar", "showcolorcomponents", "showcolorgroup", "showcolorset", "showcolorstruts", "showcounter", "showdirectives", "showdirsinmargin", "showedebuginfo", "showexperiments", "showfont", "showfontdata", "showfontkerns", "showfontparameters", "showfontstrip", "showfontstyle", "showframe", "showglyphs", "showgrid", "showgridsnapping", "showhelp", "showhyphenationtrace", "showhyphens", "showinjector", "showjustification", "showkerning", "showlayout", "showlayoutcomponents", "showligature", "showligatures", "showlogcategories", "showmakeup", "showmargins", "showmessage", "showminimalbaseline", "shownextbox", "showotfcomposition", "showpalet", "showparentchain", "showprint", "showsetups", "showsetupsdefinition", "showstruts", "showsymbolset", "showtimer", "showtokens", "showtrackers", "showvalue", "showvariable", "showwarning", "simplegroupedcommand", "singalcharacteralign", "singlebond", "sixthofsixarguments", "slanted", "slantedbold", "slicepages", "slovenianNumerals", "sloveniannumerals", "small", "smallbodyfont", "smallbold", "smallbolditalic", "smallboldslanted", "smallcappedcharacters", "smallcappedromannumerals", "smaller", "smallitalicbold", "smallnormal", "smallskip", "smallslanted", "smallslantedbold", "smalltype", "smash", "smashbox", "smashboxed", "smashedhbox", "smashedvbox", "snaptogrid", "someheadnumber", "somekindoftab", "someline", "somelocalfloat", "somenamedheadnumber", "someplace", "somewhere", "sp", "space", "spanishNumerals", "spanishnumerals", "speech", "splitatasterisk", "splitatcolon", "splitatcolons", "splitatcomma", "splitdfrac", "splitfilename", "splitfloat", "splitfrac", "splitoffbase", "splitofffull", "splitoffkind", "splitoffname", "splitoffpath", "splitoffroot", "splitofftokens", "splitofftype", "splitstring", "spreadhbox", "sqrt", "stackrel", "startJScode", "startJSpreamble", "startMPclip", "startMPcode", "startMPdefinitions", "startMPdrawing", "startMPenvironment", "startMPextensions", "startMPinclusions", "startMPinitializations", "startMPpage", "startMPpositiongraphic", "startMPpositionmethod", "startMPrun", "startTABLE", "startTABLEbody", "startTABLEfoot", "startTABLEhead", "startTABLEnext", "startTC", "startTD", "startTDs", "startTEXpage", "startTH", "startTN", "startTR", "startTRs", "startTX", "startTY", "startallmodes", "startarrangedpages", "startaside", "startattachment", "startbackground", "startbar", "startbinom", "startbitmapimage", "startblockquote", "startbtxrenderingdefinitions", "startbuffer", "startbutton", "startcatcodetable", "startchapter", "startcharacteralign", "startcheckedfences", "startchemical", "startcollect", "startcollecting", "startcolor", "startcolorintent", "startcoloronly", "startcolorset", "startcolumns", "startcolumnspan", "startcombination", "startcomment", "startcomponent", "startcontextcode", "startcontextdefinitioncode", "startctxfunction", "startctxfunctiondefinition", "startcurrentcolor", "startcurrentlistentrywrapper", "startdbinom", "startdelimited", "startdelimitedtext", "startdfrac", "startdisplaymath", "startdmath", "startdocument", "starteffect", "startelement", "startembeddedxtable", "startendofline", "startenvironment", "startexceptions", "startexpanded", "startexpandedcollect", "startextendedcatcodetable", "startexternalfigurecollection", "startfigure", "startfitfieldframed", "startfittingpage", "startfloatcombination", "startfont", "startfontclass", "startfontsolution", "startformula", "startformulas", "startfrac", "startframed", "startframedcontent", "startframedtext", "startgoto", "startgraphic", "startgridsnapping", "starthbox", "starthboxestohbox", "starthboxregister", "starthead", "starthelptext", "starthiddenbar", "starthiding", "starthighlight", "starthyphenation", "startimath", "startindentation", "startindentedtext", "startinmframed", "startinteraction", "startinteractionmenu", "startinterface", "startintermezzo", "startintertext", "startitem", "startitemgroup", "startitemize", "startknockout", "startlayout", "startline", "startlinecorrection", "startlinefiller", "startlinenumbering", "startlinetable", "startlinetablebody", "startlinetablecell", "startlinetablehead", "startlocalfootnotes", "startlocalheadsetup", "startlocallinecorrection", "startlocalnotes", "startlocalsetups", "startlua", "startluacode", "startluaparameterset", "startluasetups", "startmakeup", "startmarginblock", "startmarginrule", "startmarkedcontent", "startmathmode", "startmathstyle", "startmatrices", "startmcframed", "startmdformula", "startmframed", "startmixedcolumns", "startmode", "startmodeset", "startmodule", "startmoduletestsection", "startmpformula", "startnamedsection", "startnamedsubformulas", "startnarrow", "startnarrower", "startnegative", "startnicelyfilledbox", "startnobar", "startnointerference", "startnotallmodes", "startnotext", "startnotmode", "startopposite", "startoutputstream", "startoverbar", "startoverbars", "startoverlay", "startoverprint", "startoverstrike", "startoverstrikes", "startpacked", "startpagecomment", "startpagefigure", "startpagegrid", "startpagegridspan", "startpagelayout", "startpar", "startparagraph", "startparagraphs", "startparagraphscell", "startparbuilder", "startpath", "startplaceformula", "startplacepairedbox", "startpositioning", "startpositionoverlay", "startpositive", "startpostponing", "startprocessassignmentcommand", "startprocessassignmentlist", "startprocesscommacommand", "startprocesscommalist", "startproduct", "startproject", "startprotect", "startprotectedcolors", "startpublication", "startpunctuation", "startquotation", "startquote", "startrandomized", "startrandomseed", "startrawsetups", "startreadingfile", "startreferenceprefix", "startregime", "startregister", "startreusableMPgraphic", "startscript", "startsdformula", "startsection", "startsectionblock", "startsectionblockenvironment", "startsectionlevel", "startsetups", "startsfrac", "startshapebox", "startshift", "startsidebar", "startsimplecolumns", "startspecialitem", "startspeech", "startspformula", "startspread", "startstartstop", "startstaticMPfigure", "startstaticMPgraphic", "startstrictinspectnextcharacter", "startstructurepageregister", "startstrut", "startstyle", "startsubformulas", "startsubject", "startsubjectlevel", "startsubsection", "startsubsentence", "startsubstack", "startsubsubject", "startsubsubsection", "startsubsubsubject", "startsubsubsubsection", "startsubsubsubsubject", "startsubsubsubsubsection", "startsubsubsubsubsubject", "startsymbolset", "starttable", "starttablehead", "starttables", "starttabletail", "starttabulate", "starttabulatehead", "starttabulatetail", "starttagged", "starttbinom", "starttexcode", "starttexdefinition", "starttext", "starttextbackground", "starttextbackgroundmanual", "starttextcolor", "starttextcolorintent", "starttextflow", "starttextrule", "starttitle", "starttokens", "starttransparent", "starttypescript", "starttypescriptcollection", "startunderbar", "startunderbars", "startunderdash", "startunderdashes", "startunderdot", "startunderdots", "startunderrandom", "startunderrandoms", "startunderstrike", "startunderstrikes", "startunframed", "startuniqueMPgraphic", "startuniqueMPpagegraphic", "startunpacked", "startusableMPgraphic", "startuseMPgraphic", "startusemathstyleparameter", "startusingbtxspecification", "startvbox", "startvboxregister", "startvboxtohbox", "startvboxtohboxseparator", "startviewerlayer", "startvtop", "startvtopregister", "startxcell", "startxcellgroup", "startxfrac", "startxgroup", "startxmldisplayverbatim", "startxmlinlineverbatim", "startxmlraw", "startxmlsetups", "startxrow", "startxrowgroup", "startxtable", "startxtablebody", "startxtablefoot", "startxtablehead", "startxtablenext", "startxxfrac", "stopJScode", "stopJSpreamble", "stopMPclip", "stopMPcode", "stopMPdefinitions", "stopMPdrawing", "stopMPenvironment", "stopMPextensions", "stopMPinclusions", "stopMPinitializations", "stopMPpage", "stopMPpositiongraphic", "stopMPpositionmethod", "stopMPrun", "stopTABLE", "stopTABLEbody", "stopTABLEfoot", "stopTABLEhead", "stopTABLEnext", "stopTC", "stopTD", "stopTDs", "stopTEXpage", "stopTH", "stopTN", "stopTR", "stopTRs", "stopTX", "stopTY", "stopallmodes", "stoparrangedpages", "stopaside", "stopattachment", "stopbackground", "stopbar", "stopbinom", "stopbitmapimage", "stopblockquote", "stopbtxrenderingdefinitions", "stopbuffer", "stopbutton", "stopcatcodetable", "stopchapter", "stopcharacteralign", "stopcheckedfences", "stopchemical", "stopcollect", "stopcollecting", "stopcolor", "stopcolorintent", "stopcoloronly", "stopcolorset", "stopcolumns", "stopcolumnspan", "stopcombination", "stopcomment", "stopcomponent", "stopcontextcode", "stopcontextdefinitioncode", "stopctxfunction", "stopctxfunctiondefinition", "stopcurrentcolor", "stopcurrentlistentrywrapper", "stopdbinom", "stopdelimited", "stopdelimitedtext", "stopdfrac", "stopdisplaymath", "stopdmath", "stopdocument", "stopeffect", "stopelement", "stopembeddedxtable", "stopendofline", "stopenvironment", "stopexceptions", "stopexpanded", "stopexpandedcollect", "stopextendedcatcodetable", "stopexternalfigurecollection", "stopfigure", "stopfitfieldframed", "stopfittingpage", "stopfloatcombination", "stopfont", "stopfontclass", "stopfontsolution", "stopformula", "stopformulas", "stopfrac", "stopframed", "stopframedcontent", "stopframedtext", "stopgoto", "stopgraphic", "stopgridsnapping", "stophbox", "stophboxestohbox", "stophboxregister", "stophead", "stophelptext", "stophiddenbar", "stophiding", "stophighlight", "stophyphenation", "stopimath", "stopindentation", "stopindentedtext", "stopinmframed", "stopinteraction", "stopinteractionmenu", "stopinterface", "stopintermezzo", "stopintertext", "stopitem", "stopitemgroup", "stopitemize", "stopknockout", "stoplayout", "stopline", "stoplinecorrection", "stoplinefiller", "stoplinenumbering", "stoplinetable", "stoplinetablebody", "stoplinetablecell", "stoplinetablehead", "stoplocalfootnotes", "stoplocalheadsetup", "stoplocallinecorrection", "stoplocalnotes", "stoplocalsetups", "stoplua", "stopluacode", "stopluaparameterset", "stopluasetups", "stopmakeup", "stopmarginblock", "stopmarginrule", "stopmarkedcontent", "stopmathmode", "stopmathstyle", "stopmatrices", "stopmcframed", "stopmdformula", "stopmframed", "stopmixedcolumns", "stopmode", "stopmodeset", "stopmodule", "stopmoduletestsection", "stopmpformula", "stopnamedsection", "stopnamedsubformulas", "stopnarrow", "stopnarrower", "stopnegative", "stopnicelyfilledbox", "stopnobar", "stopnointerference", "stopnotallmodes", "stopnotext", "stopnotmode", "stopopposite", "stopoutputstream", "stopoverbar", "stopoverbars", "stopoverlay", "stopoverprint", "stopoverstrike", "stopoverstrikes", "stoppacked", "stoppagecomment", "stoppagefigure", "stoppagegrid", "stoppagegridspan", "stoppagelayout", "stoppar", "stopparagraph", "stopparagraphs", "stopparagraphscell", "stopparbuilder", "stoppath", "stopplaceformula", "stopplacepairedbox", "stoppositioning", "stoppositionoverlay", "stoppositive", "stoppostponing", "stopprocessassignmentcommand", "stopprocessassignmentlist", "stopprocesscommacommand", "stopprocesscommalist", "stopproduct", "stopproject", "stopprotect", "stopprotectedcolors", "stoppublication", "stoppunctuation", "stopquotation", "stopquote", "stoprandomized", "stoprandomseed", "stoprawsetups", "stopreadingfile", "stopreferenceprefix", "stopregime", "stopregister", "stopreusableMPgraphic", "stopscript", "stopsdformula", "stopsection", "stopsectionblock", "stopsectionblockenvironment", "stopsectionlevel", "stopsetups", "stopsfrac", "stopshapebox", "stopshift", "stopsidebar", "stopsimplecolumns", "stopspecialitem", "stopspeech", "stopspformula", "stopspread", "stopstartstop", "stopstaticMPfigure", "stopstaticMPgraphic", "stopstrictinspectnextcharacter", "stopstructurepageregister", "stopstrut", "stopstyle", "stopsubformulas", "stopsubject", "stopsubjectlevel", "stopsubsection", "stopsubsentence", "stopsubstack", "stopsubsubject", "stopsubsubsection", "stopsubsubsubject", "stopsubsubsubsection", "stopsubsubsubsubject", "stopsubsubsubsubsection", "stopsubsubsubsubsubject", "stopsymbolset", "stoptable", "stoptablehead", "stoptables", "stoptabletail", "stoptabulate", "stoptabulatehead", "stoptabulatetail", "stoptagged", "stoptbinom", "stoptexcode", "stoptexdefinition", "stoptext", "stoptextbackground", "stoptextbackgroundmanual", "stoptextcolor", "stoptextcolorintent", "stoptextflow", "stoptextrule", "stoptitle", "stoptokens", "stoptransparent", "stoptypescript", "stoptypescriptcollection", "stopunderbar", "stopunderbars", "stopunderdash", "stopunderdashes", "stopunderdot", "stopunderdots", "stopunderrandom", "stopunderrandoms", "stopunderstrike", "stopunderstrikes", "stopunframed", "stopuniqueMPgraphic", "stopuniqueMPpagegraphic", "stopunpacked", "stopusableMPgraphic", "stopuseMPgraphic", "stopusemathstyleparameter", "stopusingbtxspecification", "stopvbox", "stopvboxregister", "stopvboxtohbox", "stopvboxtohboxseparator", "stopviewerlayer", "stopvtop", "stopvtopregister", "stopxcell", "stopxcellgroup", "stopxfrac", "stopxgroup", "stopxmldisplayverbatim", "stopxmlinlineverbatim", "stopxmlraw", "stopxmlsetups", "stopxrow", "stopxrowgroup", "stopxtable", "stopxtablebody", "stopxtablefoot", "stopxtablehead", "stopxtablenext", "stopxxfrac", "stretched", "strictdoifelsenextoptional", "strictdoifnextoptionalelse", "stripcharacter", "strippedcsname", "stripspaces", "structurelistuservariable", "structurenumber", "structuretitle", "structureuservariable", "structurevariable", "strut", "strutdp", "strutht", "struthtdp", "struttedbox", "strutwd", "style", "styleinstance", "subject", "subpagenumber", "subsection", "subsentence", "substituteincommalist", "subsubject", "subsubsection", "subsubsubject", "subsubsubsection", "subsubsubsubject", "subsubsubsubsection", "subsubsubsubsubject", "subtractfeature", "swapcounts", "swapdimens", "swapface", "swapmacros", "swaptypeface", "switchstyleonly", "switchtobodyfont", "switchtocolor", "switchtointerlinespace", "symbol", "symbolreference", "synchronizeblank", "synchronizeindenting", "synchronizemarking", "synchronizeoutputstreams", "synchronizestrut", "synchronizewhitespace", "systemlog", "systemlogfirst", "systemloglast", "systemsetups", "tLeftarrow", "tLeftrightarrow", "tRightarrow", "table", "tabulateautoline", "tabulateautorule", "tabulateline", "tabulaterule", "taggedctxcommand", "taggedlabeltexts", "tbinom", "tbox", "tequal", "testandsplitstring", "testcolumn", "testfeature", "testfeatureonce", "testpage", "testpageonly", "testpagesync", "testtokens", "tex", "texdefinition", "texsetup", "textcitation", "textcite", "textcontrolspace", "textflowcollector", "textmath", "textminus", "textormathchar", "textplus", "textreference", "textrule", "textvisiblespace", "tfrac", "thainumerals", "thefirstcharacter", "thenormalizedbodyfontsize", "theremainingcharacters", "thickspace", "thinrule", "thinrules", "thinspace", "thirdoffivearguments", "thirdoffourarguments", "thirdofsixarguments", "thirdofthreearguments", "thirdofthreeunexpanded", "thookleftarrow", "thookrightarrow", "threedigitrounding", "tibetannumerals", "tightlayer", "tinyfont", "title", "tlap", "tleftarrow", "tleftharpoondown", "tleftharpoonup", "tleftrightarrow", "tleftrightharpoons", "tmapsto", "tochar", "tolinenote", "topbox", "topleftbox", "toplinebox", "toprightbox", "topskippedbox", "tracecatcodetables", "tracedfontname", "traceoutputroutines", "tracepositions", "translate", "transparencycomponents", "transparent", "trel", "trightarrow", "trightharpoondown", "trightharpoonup", "trightleftharpoons", "trightoverleftarrow", "triplebond", "truefilename", "truefontname", "ttriplerel", "ttwoheadleftarrow", "ttwoheadrightarrow", "twodigitrounding", "tx", "txx", "typ", "type", "typebuffer", "typedefinedbuffer", "typeface", "typefile", "typescriptone", "typescriptprefix", "typescriptthree", "typescripttwo", "typesetbuffer", "typesetfile", "uconvertnumber", "uedcatcodecommand", "undefinevalue", "undepthed", "underbar", "underbars", "underbartext", "underbrace", "underbracetext", "underbracket", "underbrackettext", "underdash", "underdashes", "underdot", "underdots", "underleftarrow", "underleftharpoondown", "underleftharpoonup", "underleftrightarrow", "underparent", "underparenttext", "underrandom", "underrandoms", "underrightarrow", "underrightharpoondown", "underrightharpoonup", "underset", "understrike", "understrikes", "undertwoheadleftarrow", "undertwoheadrightarrow", "undoassign", "unframed", "unhhbox", "unihex", "uniqueMPgraphic", "uniqueMPpagegraphic", "unknown", "unprotected", "unregisterhyphenationpattern", "unspaceafter", "unspaceargument", "unspaced", "unspacestring", "untexargument", "untexcommand", "uppercased", "uppercasestring", "upperleftdoubleninequote", "upperleftdoublesixquote", "upperleftsingleninequote", "upperleftsinglesixquote", "upperrightdoubleninequote", "upperrightdoublesixquote", "upperrightsingleninequote", "upperrightsinglesixquote", "url", "useJSscripts", "useMPenvironmentbuffer", "useMPgraphic", "useMPlibrary", "useMPrun", "useMPvariables", "useURL", "useblankparameter", "useblocks", "usebodyfont", "usebodyfontparameter", "usebtxdataset", "usebtxdefinitions", "usecolors", "usecomponent", "usedirectory", "usedummycolorparameter", "usedummystyleandcolor", "usedummystyleparameter", "useenvironment", "useexternaldocument", "useexternalfigure", "useexternalrendering", "useexternalsoundtrack", "usefigurebase", "usefile", "usegridparameter", "useindentingparameter", "useindentnextparameter", "useinterlinespaceparameter", "uselanguageparameter", "useluamodule", "usemathstyleparameter", "usemodule", "useproduct", "useprofileparameter", "useproject", "usereferenceparameter", "userpagenumber", "usesetupsparameter", "usestaticMPfigure", "usesubpath", "usesymbols", "usetexmodule", "usetypescript", "usetypescriptfile", "useurl", "usezipfile", "utfchar", "utflower", "utfupper", "utilityregisterlength", "vboxreference", "verbatim", "verbatimstring", "verbosenumber", "version", "verticalgrowingbar", "verticalpositionbar", "vglue", "viewerlayer", "vl", "vphantom", "vpos", "vsmash", "vsmashbox", "vsmashed", "vspace", "vspacing", "wdofstring", "weekday", "widthofstring", "widthspanningtext", "withoutpt", "word", "words", "wordtonumber", "writebetweenlist", "writedatatolist", "writestatus", "writetolist", "xLeftarrow", "xLeftrightarrow", "xRightarrow", "xdefconvertedargument", "xequal", "xfrac", "xhookleftarrow", "xhookrightarrow", "xleftarrow", "xleftharpoondown", "xleftharpoonup", "xleftrightarrow", "xleftrightharpoons", "xmapsto", "xmladdindex", "xmlafterdocumentsetup", "xmlaftersetup", "xmlall", "xmlappenddocumentsetup", "xmlappendsetup", "xmlapplyselectors", "xmlatt", "xmlattdef", "xmlattribute", "xmlattributedef", "xmlbadinclusions", "xmlbeforedocumentsetup", "xmlbeforesetup", "xmlchainatt", "xmlchainattdef", "xmlchecknamespace", "xmlcommand", "xmlconcat", "xmlconcatrange", "xmlcontext", "xmlcount", "xmldefaulttotext", "xmldirectives", "xmldirectivesafter", "xmldirectivesbefore", "xmldisplayverbatim", "xmldoif", "xmldoifelse", "xmldoifelseempty", "xmldoifelseselfempty", "xmldoifelsetext", "xmldoifelsevalue", "xmldoifnot", "xmldoifnotselfempty", "xmldoifnottext", "xmldoifselfempty", "xmldoiftext", "xmlelement", "xmlfilter", "xmlfirst", "xmlflush", "xmlflushcontext", "xmlflushdocumentsetups", "xmlflushlinewise", "xmlflushpure", "xmlflushspacewise", "xmlflushtext", "xmlinclude", "xmlinclusion", "xmlinclusions", "xmlinfo", "xmlinjector", "xmlinlineverbatim", "xmlinstalldirective", "xmllast", "xmllastatt", "xmllastmatch", "xmlloadbuffer", "xmlloaddata", "xmlloaddirectives", "xmlloadfile", "xmlloadonly", "xmlmain", "xmlmapvalue", "xmlname", "xmlnamespace", "xmlnonspace", "xmlpath", "xmlpos", "xmlposition", "xmlprependdocumentsetup", "xmlprependsetup", "xmlprettyprint", "xmlprocessbuffer", "xmlprocessdata", "xmlprocessfile", "xmlpure", "xmlraw", "xmlrefatt", "xmlregistereddocumentsetups", "xmlregisteredsetups", "xmlregisterns", "xmlremapname", "xmlremapnamespace", "xmlremovedocumentsetup", "xmlremovesetup", "xmlresetdocumentsetups", "xmlresetinjectors", "xmlresetsetups", "xmlsave", "xmlsetentity", "xmlsetfunction", "xmlsetinjectors", "xmlsetsetup", "xmlsetup", "xmlshow", "xmlsnippet", "xmlstrip", "xmlstripnolines", "xmlstripped", "xmlstrippednolines", "xmltag", "xmltexentity", "xmltext", "xmltobuffer", "xmltobufferverbose", "xmltofile", "xmlvalue", "xmlverbatim", "xrel", "xrightarrow", "xrightharpoondown", "xrightharpoonup", "xrightleftharpoons", "xrightoverleftarrow", "xsplitstring", "xtriplerel", "xtwoheadleftarrow", "xtwoheadrightarrow", "xxfrac", "xypos" }, - ["fr"]={ "AMSTEX", "AfterPar", "Alphabeticnumerals", "AmSTeX", "And", "BeforePar", "Big", "Bigg", "Biggl", "Biggm", "Biggr", "Bigl", "Bigm", "Bigr", "CONTEXT", "Cap", "Caps", "Caractere", "Caracteres", "Chiffresromains", "ConTeXt", "Context", "ConvertConstantAfter", "ConvertToConstant", "ETEX", "EveryLine", "EveryPar", "GetPar", "GotoPar", "Greeknumerals", "INRSTEX", "JOURSEMAINE", "LAMSTEX", "LATEX", "LUAJITTEX", "LUATEX", "LaTeX", "LamSTeX", "Lua", "LuaTeX", "LuajitTeX", "METAFONT", "METAFUN", "METAPOST", "MKII", "MKIV", "MKIX", "MKVI", "MKXI", "MOIS", "MONTHLONG", "MONTHSHORT", "MOT", "MOTS", "MPII", "MPIV", "MPVI", "MPanchor", "MPbetex", "MPc", "MPcode", "MPcolor", "MPcoloronly", "MPcolumn", "MPd", "MPdrawing", "MPfontsizehskip", "MPgetmultipars", "MPgetmultishape", "MPgetposboxes", "MPh", "MPinclusions", "MPleftskip", "MPll", "MPlr", "MPls", "MPmenubuttons", "MPn", "MPoptions", "MPoverlayanchor", "MPp", "MPpage", "MPpardata", "MPplus", "MPpos", "MPpositiongraphic", "MPposset", "MPr", "MPrawvar", "MPregion", "MPrest", "MPrightskip", "MPrs", "MPstring", "MPtext", "MPtransparency", "MPul", "MPur", "MPv", "MPvar", "MPvariable", "MPvv", "MPw", "MPwhd", "MPx", "MPxy", "MPxywhd", "MPy", "MetaFont", "MetaFun", "MetaPost", "Mot", "Mots", "NormalizeFontHeight", "NormalizeFontWidth", "NormalizeTextHeight", "NormalizeTextWidth", "Numeros", "PDFETEX", "PDFTEX", "PDFcolor", "PICTEX", "PPCHTEX", "PPCHTeX", "PRAGMA", "PiCTeX", "PointsToBigPoints", "PointsToReal", "PointsToWholeBigPoints", "PtToCm", "ReadFile", "ScaledPointsToBigPoints", "ScaledPointsToWholeBigPoints", "Smallcapped", "TABLE", "TEX", "TEXpage", "TaBlE", "TeX", "TheNormalizedFontSize", "TransparencyHack", "VerboseNumber", "WidthSpanningText", "XETEX", "XeTeX", "a", "abjadnaivenumerals", "abjadnodotnumerals", "abjadnumerals", "activatespacehandler", "adaptcollector", "adaptedisposition", "adaptfontfeature", "adaptpapersize", "addfeature", "addtoJSpreamble", "addtocommalist", "addvalue", "aftersplitstring", "aftertestandsplitstring", "ajustechamp", "alaligne", "alapage", "alignmentcharacter", "allinputpaths", "alphabeticnumerals", "alwayscitation", "alwayscite", "ampersand", "anchor", "appendetoks", "appendgvalue", "appendtocommalist", "appendtoks", "appendtoksonce", "appendvalue", "apply", "applyalternativestyle", "applyprocessor", "applytocharacters", "applytofirstcharacter", "applytosplitstringchar", "applytosplitstringcharspaced", "applytosplitstringline", "applytosplitstringlinespaced", "applytosplitstringword", "applytosplitstringwordspaced", "applytowords", "arabicdecimals", "arabicexnumerals", "arabicnumerals", "arg", "arriereplan", "asciistr", "aside", "assignalfadimension", "assigndimen", "assigndimension", "assignifempty", "assigntranslation", "assignvalue", "assignwidth", "assumelongusagecs", "astype", "attachment", "autocap", "autodirhbox", "autodirvbox", "autodirvtop", "autoinsertnextspace", "automathematics", "autosetups", "availablehsize", "averagecharwidth", "backgroundimage", "backgroundimagefill", "backgroundline", "baha", "barrecouleur", "barreinteraction", "bas", "basegrid", "baselineleftbox", "baselinemiddlebox", "baselinerightbox", "bbox", "beforesplitstring", "beforetestandsplitstring", "big", "bigbodyfont", "bigg", "bigger", "biggl", "biggm", "biggr", "bigl", "bigm", "bigr", "bigskip", "binom", "bitmapimage", "blap", "bleed", "bleedheight", "bleedwidth", "blockligatures", "blockquote", "bodyfontenvironmentlist", "bodyfontsize", "bold", "boldface", "bolditalic", "boldslanted", "booleanmodevalue", "bottombox", "bottomleftbox", "bottomrightbox", "bouton", "boutonmenu", "boutonsinteraction", "boxcursor", "boxmarker", "boxofsize", "boxreference", "bpos", "bthiddencitation", "btxabbreviatedjournal", "btxaddjournal", "btxalwayscitation", "btxauthorfield", "btxdetail", "btxdirect", "btxdoif", "btxdoifcombiinlistelse", "btxdoifelse", "btxdoifelsecombiinlist", "btxdoifelsesameasprevious", "btxdoifelsesameaspreviouschecked", "btxdoifelseuservariable", "btxdoifnot", "btxdoifsameaspreviouscheckedelse", "btxdoifsameaspreviouselse", "btxdoifuservariableelse", "btxexpandedjournal", "btxfield", "btxfieldname", "btxfieldtype", "btxfirstofrange", "btxflush", "btxflushauthor", "btxflushauthorinverted", "btxflushauthorinvertedshort", "btxflushauthorname", "btxflushauthornormal", "btxflushauthornormalshort", "btxflushsuffix", "btxfoundname", "btxfoundtype", "btxhybridcite", "btxlistcitation", "btxloadjournalist", "btxoneorrange", "btxremapauthor", "btxsavejournalist", "btxsetup", "btxsingularorplural", "btxsingularplural", "btxtextcitation", "cache", "cacheblocs", "calligraphic", "camel", "cap", "caractere", "caracteres", "catcodetablename", "cbox", "centerbox", "centeredbox", "centerednextbox", "cfrac", "champ", "changepolicecorps", "chapitre", "chardescription", "charwidthlanguage", "checkcharacteralign", "checkedchar", "checkedfiller", "checkedstrippedcsname", "checkinjector", "checknextindentation", "checknextinjector", "checkpage", "checkparameters", "checkpreviousinjector", "checksoundtrack", "checktwopassdata", "checkvariables", "chem", "chemical", "chemicalbottext", "chemicalmidtext", "chemicalsymbol", "chemicaltext", "chemicaltoptext", "chiffresromains", "chineseallnumerals", "chinesecapnumerals", "chinesenumerals", "citation", "cite", "citer", "clap", "classfont", "cldcommand", "cldcontext", "cldloadfile", "cldprocessfile", "cleftarrow", "clip", "clonechamp", "collect", "collectedtext", "collectexpanded", "colonne", "colorcomponents", "colored", "coloronly", "columnbreak", "combinepages", "commalistelement", "commalistsentence", "commalistsize", "comment", "commentaire", "comparedimension", "comparedimensioneps", "comparegroupecouleur", "comparepalette", "completebtxrendering", "completelist", "completelistofpublications", "completelistofsorts", "completelistofsynonyms", "completenumeropage", "completeregistre", "complexorsimple", "complexorsimpleempty", "composant", "composedcollector", "composedlayer", "compresult", "concernant", "constantdimen", "constantdimenargument", "constantemptyargument", "constantnumber", "constantnumberargument", "contentreference", "continuednumber", "continueifinputfile", "convertargument", "convertcommand", "convertedcounter", "converteddimen", "convertedsubcounter", "convertitnumero", "convertmonth", "convertvalue", "convertvboxtohbox", "copitchamp", "copypages", "copyparameters", "copyposition", "corrigeespaceblanc", "couleur", "couleurgrise", "countersubs", "counttoken", "counttokens", "cramped", "crampedclap", "crampedllap", "crampedrlap", "crightarrow", "crightoverleftarrow", "ctop", "ctxcommand", "ctxdirectcommand", "ctxdirectlua", "ctxfunction", "ctxlatecommand", "ctxlatelua", "ctxloadluafile", "ctxlua", "ctxluabuffer", "ctxluacode", "ctxreport", "ctxsprint", "currentassignmentlistkey", "currentassignmentlistvalue", "currentbtxuservariable", "currentcommalistitem", "currentcomponent", "currentenvironment", "currentfeaturetest", "currentinterface", "currentlanguage", "currentlistentrydestinationattribute", "currentlistentrylimitedtext", "currentlistentrynumber", "currentlistentrypagenumber", "currentlistentryreferenceattribute", "currentlistentrytitle", "currentlistentrytitlerendered", "currentlistsymbol", "currentmainlanguage", "currentmessagetext", "currentmoduleparameter", "currentoutputstream", "currentproduct", "currentproject", "currentregime", "currentregisterpageuserdata", "currentresponses", "currenttime", "currentvalue", "currentxtablecolumn", "currentxtablerow", "dactylographier", "dans", "datasetvariable", "date", "datecourante", "dayoftheweek", "dayspermonth", "dbinom", "de", "decrement", "decrementcounter", "decrementedcounter", "decrementpagenumber", "decrementsubpagenumber", "decrementvalue", "defaultinterface", "defaultobjectpage", "defaultobjectreference", "defcatcodecommand", "defconvertedargument", "defconvertedcommand", "defconvertedvalue", "defineMPinstance", "defineTABLEsetup", "defineactivecharacter", "definealternativestyle", "defineanchor", "defineattachment", "defineattribute", "definebackground", "definebar", "definebodyfontswitch", "definebreakpoint", "definebreakpoints", "definebtx", "definebtxdataset", "definebtxregister", "definebtxrendering", "definebutton", "definecapitals", "definecharacterkerning", "definecharacterspacing", "definechemical", "definechemicals", "definechemicalsymbol", "definecollector", "definecombination", "definecomment", "definecomplexorsimple", "definecomplexorsimpleempty", "defineconversionset", "definecounter", "definedataset", "definedelimitedtext", "definedfont", "defineeffect", "defineexpandable", "defineexternalfigure", "definefallbackfamily", "definefieldbody", "definefieldbodyset", "definefieldcategory", "definefileconstant", "definefilefallback", "definefilesynonym", "definefiller", "definefirstline", "definefittingpage", "definefontalternative", "definefontfallback", "definefontfamily", "definefontfamilypreset", "definefontfeature", "definefontfile", "definefontsize", "definefontsolution", "defineformula", "defineformulaalternative", "defineformulaframed", "defineframed", "defineframedcontent", "defineframedtext", "definefrozenfont", "defineglobalcolor", "definegraphictypesynonym", "definegridsnapping", "defineheadalternative", "definehelp", "definehigh", "definehighlight", "definehspace", "definehypenationfeatures", "defineindentedtext", "defineindenting", "defineinitial", "defineinsertion", "defineinteraction", "defineinteractionbar", "defineinterfaceconstant", "defineinterfaceelement", "defineinterfacevariable", "defineinterlinespace", "defineintermediatecolor", "defineitemgroup", "defineitems", "definelabelclass", "definelayerpreset", "definelinefiller", "definelinenote", "definelinenumbering", "definelines", "definelistalternative", "definelistextra", "definelow", "definelowhigh", "definelowmidhigh", "definemarginblock", "definemargindata", "definemarker", "definemathalignment", "definemathcases", "definemathcommand", "definemathdoubleextensible", "definemathematics", "definemathextensible", "definemathfence", "definemathfraction", "definemathframed", "definemathmatrix", "definemathornament", "definemathoverextensible", "definemathovertextextensible", "definemathradical", "definemathstackers", "definemathstyle", "definemathtriplet", "definemathunderextensible", "definemathundertextextensible", "definemathunstacked", "definemeasure", "definemessageconstant", "definemixedcolumns", "definemode", "definemultitonecolor", "definenamedcolor", "definenamespace", "definenarrower", "definenote", "defineornament", "defineoutputroutine", "defineoutputroutinecommand", "definepage", "definepagechecker", "definepagegrid", "definepagegridarea", "definepagegridspan", "definepageinjection", "definepageinjectionalternative", "definepageshift", "definepagestate", "definepairedbox", "defineparagraph", "defineparallel", "defineparbuilder", "defineplacement", "definepositioning", "defineprefixset", "defineprocesscolor", "defineprocessor", "definepushbutton", "definepushsymbol", "definerenderingwindow", "defineresetset", "definescale", "definescript", "definesectionlevels", "defineselector", "defineseparatorset", "defineshift", "definesidebar", "definesort", "definespotcolor", "definestyleinstance", "definesubformula", "definesynonym", "definesystemattribute", "definesystemconstant", "definesystemvariable", "definetabulation", "definetextbackground", "definetextflow", "definetooltip", "definetransparency", "definetwopasslist", "definetypeface", "definetypescriptprefix", "definetypescriptsynonym", "definetypesetting", "defineunit", "defineviewerlayer", "definevspace", "definevspacing", "definevspacingamount", "definextable", "definit", "definitbloc", "definitblocsection", "definitbuffer", "definitcalque", "definitchamp", "definitconversion", "definitcouleur", "definitdactylo", "definitdemarrestoppe", "definitdescription", "definitdisposition", "definitenumeration", "definitenvironnementpolicecorps", "definitetiquette", "definitflottant", "definitformatreference", "definitgroupecouleur", "definithbox", "definitliste", "definitlisteimbriquee", "definitmakeup", "definitmarquage", "definitmenuinteraction", "definitpalette", "definitparagraphes", "definitpilechamp", "definitpolice", "definitpolicecorps", "definitprofil", "definitprogramme", "definitreference", "definitregistre", "definitrevetement", "definitsautdecolonne", "definitsautdepage", "definitsection", "definitsouschamp", "definitstyle", "definitstylepolice", "definitsymbole", "definitsymbolefigure", "definitsynonymepolice", "definitsynonymes", "definittabulation", "definittaillepapier", "definittete", "definittexte", "definittrametableau", "definittri", "definittype", "definitvide", "delimited", "delimitedtext", "demarreJScode", "demarreJSpreamble", "demarreMPclip", "demarreMPcode", "demarreMPdefinitions", "demarreMPdrawing", "demarreMPenvironment", "demarreMPextensions", "demarreMPinclusions", "demarreMPinitializations", "demarreMPpage", "demarreMPpositiongraphic", "demarreMPpositionmethod", "demarreMPrun", "demarreTABLE", "demarreTABLEbody", "demarreTABLEfoot", "demarreTABLEhead", "demarreTABLEnext", "demarreTC", "demarreTD", "demarreTDs", "demarreTEXpage", "demarreTH", "demarreTN", "demarreTR", "demarreTRs", "demarreTX", "demarreTY", "demarreallmodes", "demarrearrangedpages", "demarrearriereplan", "demarreaside", "demarreattachment", "demarrebar", "demarrebinom", "demarrebitmapimage", "demarreblockquote", "demarrebtxrenderingdefinitions", "demarrebuffer", "demarrebutton", "demarrecatcodetable", "demarrechapitre", "demarrecharacteralign", "demarrecheckedfences", "demarrechemical", "demarrecitation", "demarreciter", "demarrecollect", "demarrecollecting", "demarrecolorintent", "demarrecoloronly", "demarrecolorset", "demarrecolumns", "demarrecolumnspan", "demarrecombination", "demarrecomment", "demarrecommentaire", "demarrecomposant", "demarrecontextcode", "demarrecontextdefinitioncode", "demarrecouleur", "demarrectxfunction", "demarrectxfunctiondefinition", "demarrecurrentcolor", "demarrecurrentlistentrywrapper", "demarredbinom", "demarredelimited", "demarredelimitedtext", "demarredfrac", "demarrediscours", "demarredisplaymath", "demarredmath", "demarredocument", "demarreeffect", "demarreelement", "demarreembeddedxtable", "demarreendofline", "demarreenvironement", "demarreexceptions", "demarreexpanded", "demarreexpandedcollect", "demarreextendedcatcodetable", "demarreexternalfigurecollection", "demarrefigure", "demarrefitfieldframed", "demarrefittingpage", "demarrefloatcombination", "demarrefont", "demarrefontclass", "demarrefontsolution", "demarreformula", "demarreformulas", "demarrefrac", "demarreframed", "demarreframedcontent", "demarreframedtext", "demarregraphique", "demarregridsnapping", "demarregroupe", "demarrehbox", "demarrehboxestohbox", "demarrehboxregister", "demarrehelptext", "demarrehiddenbar", "demarrehiding", "demarrehighlight", "demarrehyphenation", "demarreimath", "demarreindentation", "demarreindentedtext", "demarreinmframed", "demarreinteraction", "demarreinterface", "demarreintermezzo", "demarreintertext", "demarreitemgroup", "demarreknockout", "demarrelayout", "demarreligne", "demarreligneregleetexte", "demarrelinecorrection", "demarrelinefiller", "demarrelinenumbering", "demarrelinetable", "demarrelinetablebody", "demarrelinetablecell", "demarrelinetablehead", "demarrelister", "demarrelocalfootnotes", "demarrelocalheadsetup", "demarrelocallinecorrection", "demarrelocalnotes", "demarrelocalsetups", "demarrelua", "demarreluacode", "demarreluaparameterset", "demarreluasetups", "demarremakeup", "demarremargereglee", "demarremarginblock", "demarremarkedcontent", "demarremathmode", "demarremathstyle", "demarrematrices", "demarremcframed", "demarremdformula", "demarremenuinteraction", "demarremframed", "demarremixedcolumns", "demarremode", "demarremodeset", "demarremodule", "demarremoduletestsection", "demarrempformula", "demarrenamedsection", "demarrenamedsubformulas", "demarrenarrow", "demarrenarrower", "demarrenegative", "demarrenicelyfilledbox", "demarrenobar", "demarrenointerference", "demarrenotallmodes", "demarrenotext", "demarrenotmode", "demarreopposite", "demarreoutputstream", "demarreoverbar", "demarreoverbars", "demarreoverlay", "demarreoverprint", "demarrepagecomment", "demarrepagefigure", "demarrepagegrid", "demarrepagegridspan", "demarrepagelayout", "demarrepar", "demarreparagraph", "demarreparagraphs", "demarreparagraphscell", "demarreparbuilder", "demarrepath", "demarreplaceformule", "demarreplacepairedbox", "demarrepositioning", "demarrepositionoverlay", "demarrepositive", "demarrepostponing", "demarreprocessassignmentcommand", "demarreprocessassignmentlist", "demarreprocesscommacommand", "demarreprocesscommalist", "demarreproduit", "demarreprojet", "demarreprotect", "demarreprotectedcolors", "demarrepublication", "demarrepunctuation", "demarrerandomized", "demarrerandomseed", "demarrerawsetups", "demarrereadingfile", "demarrereferenceprefix", "demarreregime", "demarrereusableMPgraphic", "demarrescript", "demarresdformula", "demarresection", "demarresectionblock", "demarresectionblockenvironment", "demarresectionlevel", "demarresetups", "demarresfrac", "demarreshapebox", "demarreshift", "demarresidebar", "demarresimplecolumns", "demarresousligne", "demarresouslignetout", "demarresoussection", "demarresoussoussection", "demarresoussoussoussection", "demarresoussoussoussoussection", "demarresoussoussoussoussujet", "demarresoussoussoussujet", "demarresoussoussujet", "demarresoussujet", "demarrespecialitem", "demarrespeech", "demarrespformula", "demarrespread", "demarrestartstop", "demarrestaticMPfigure", "demarrestaticMPgraphic", "demarrestrictinspectnextcharacter", "demarrestrut", "demarrestyle", "demarresubformulas", "demarresubjectlevel", "demarresubsentence", "demarresubstack", "demarresujet", "demarresurligne", "demarresurlignetout", "demarresymbolset", "demarretable", "demarretableau", "demarretablehead", "demarretables", "demarretabletail", "demarretabulate", "demarretabulatehead", "demarretabulatetail", "demarretagged", "demarretbinom", "demarretete", "demarretexcode", "demarretexdefinition", "demarretext", "demarretextbackground", "demarretextbackgroundmanual", "demarretextcolor", "demarretextcolorintent", "demarretexteaide", "demarretexteencadre", "demarretextflow", "demarretitre", "demarretokens", "demarretransparent", "demarretypescript", "demarretypescriptcollection", "demarreunderdash", "demarreunderdashes", "demarreunderdot", "demarreunderdots", "demarreunderrandom", "demarreunderrandoms", "demarreunderstrike", "demarreunderstrikes", "demarreunframed", "demarreuniqueMPgraphic", "demarreuniqueMPpagegraphic", "demarreunpacked", "demarreusableMPgraphic", "demarreuseMPgraphic", "demarreusemathstyleparameter", "demarreusingbtxspecification", "demarreva", "demarrevbox", "demarrevboxregister", "demarrevboxtohbox", "demarrevboxtohboxseparator", "demarreviewerlayer", "demarrevtop", "demarrevtopregister", "demarrexcell", "demarrexcellgroup", "demarrexfrac", "demarrexgroup", "demarrexmldisplayverbatim", "demarrexmlinlineverbatim", "demarrexmlraw", "demarrexmlsetups", "demarrexrow", "demarrexrowgroup", "demarrextable", "demarrextablebody", "demarrextablefoot", "demarrextablehead", "demarrextablenext", "demarrexxfrac", "depthofstring", "depthonlybox", "depthspanningtext", "determinecaracteristiqueliste", "determinecaracteristiquesregistre", "determinenoflines", "determinenumerotete", "devanagarinumerals", "dfrac", "digits", "dimensiontocount", "directcolor", "directcolored", "directconvertedcounter", "directdummyparameter", "directgetboxllx", "directgetboxlly", "directhighlight", "directlocalframed", "directluacode", "directselect", "directsetbar", "directsetup", "directsymbol", "directvspacing", "dis", "disabledirectives", "disableexperiments", "disablemode", "disableoutputstream", "disableparpositions", "disableregime", "disabletrackers", "discours", "displaymath", "displaymathematics", "displaymessage", "distributedhsize", "dividedsize", "doadaptleftskip", "doadaptrightskip", "doaddfeature", "doassign", "doassignempty", "doboundtext", "docheckassignment", "docheckedpagestate", "docheckedpair", "documentvariable", "dodoubleargument", "dodoubleargumentwithset", "dodoubleempty", "dodoubleemptywithset", "dodoublegroupempty", "doeassign", "doexpandedrecurse", "dogetattribute", "dogetattributeid", "dogetcommacommandelement", "dogobbledoubleempty", "dogobblesingleempty", "doif", "doifMPgraphicelse", "doifallcommon", "doifallcommonelse", "doifalldefinedelse", "doifallmodes", "doifallmodeselse", "doifassignmentelse", "doifblackelse", "doifbothsides", "doifbothsidesoverruled", "doifboxelse", "doifbufferelse", "doifcolor", "doifcolorelse", "doifcommandhandler", "doifcommandhandlerelse", "doifcommon", "doifcommonelse", "doifcontent", "doifconversiondefinedelse", "doifconversionnumberelse", "doifcounter", "doifcounterelse", "doifcurrentfonthasfeatureelse", "doifdefined", "doifdefinedcounter", "doifdefinedcounterelse", "doifdefinedelse", "doifdimensionelse", "doifdimenstringelse", "doifdocumentargument", "doifdocumentargumentelse", "doifdocumentfilename", "doifdocumentfilenameelse", "doifdrawingblackelse", "doifelse", "doifelseMPgraphic", "doifelseallcommon", "doifelsealldefined", "doifelseallmodes", "doifelseassignment", "doifelseblack", "doifelsebox", "doifelsebuffer", "doifelsecolor", "doifelsecommandhandler", "doifelsecommon", "doifelseconversiondefined", "doifelseconversionnumber", "doifelsecounter", "doifelsecurrentfonthasfeature", "doifelsecurrentsortingused", "doifelsecurrentsynonymshown", "doifelsecurrentsynonymused", "doifelsedefined", "doifelsedefinedcounter", "doifelsedimension", "doifelsedimenstring", "doifelsedocumentargument", "doifelsedocumentfilename", "doifelsedrawingblack", "doifelseempty", "doifelseemptyvalue", "doifelseemptyvariable", "doifelseenv", "doifelsefastoptionalcheck", "doifelsefastoptionalcheckcs", "doifelsefieldbody", "doifelsefieldcategory", "doifelsefigure", "doifelsefile", "doifelsefiledefined", "doifelsefileexists", "doifelsefirstchar", "doifelseflagged", "doifelsefontchar", "doifelsefontpresent", "doifelsefontsynonym", "doifelsehasspace", "doifelsehelp", "doifelseincsname", "doifelseinelement", "doifelseinputfile", "doifelseinsertion", "doifelseinset", "doifelseinstring", "doifelseinsymbolset", "doifelseintoks", "doifelseintwopassdata", "doifelseitalic", "doifelselanguage", "doifelselayerdata", "doifelselayoutdefined", "doifelselayoutsomeline", "doifelselayouttextline", "doifelseleapyear", "doifelselist", "doifelselocation", "doifelselocfile", "doifelsemainfloatbody", "doifelsemarking", "doifelsemeaning", "doifelsemessage", "doifelsemode", "doifelsenextbgroup", "doifelsenextbgroupcs", "doifelsenextchar", "doifelsenextoptional", "doifelsenextoptionalcs", "doifelsenextparenthesis", "doifelsenonzeropositive", "doifelsenoteonsamepage", "doifelsenothing", "doifelsenumber", "doifelseobjectfound", "doifelseobjectreferencefound", "doifelseoddpage", "doifelseoddpagefloat", "doifelseoldercontext", "doifelseolderversion", "doifelseoverlapping", "doifelseoverlay", "doifelseparallel", "doifelseparentfile", "doifelsepath", "doifelsepathexists", "doifelsepatterns", "doifelseposition", "doifelsepositionaction", "doifelsepositiononpage", "doifelsepositionsonsamepage", "doifelsepositionsonthispage", "doifelsepositionsused", "doifelsereferencefound", "doifelserightpagefloat", "doifelserighttoleftinbox", "doifelsesamelinereference", "doifelsesamestring", "doifelsesetups", "doifelsesomebackground", "doifelsesomespace", "doifelsesomething", "doifelsesometoks", "doifelsestringinstring", "doifelsestructurelisthasnumber", "doifelsestructurelisthaspage", "doifelsesymboldefined", "doifelsesymbolset", "doifelsetext", "doifelsetextflow", "doifelsetextflowcollector", "doifelsetypingfile", "doifelseundefined", "doifelseurldefined", "doifelsevalue", "doifelsevaluenothing", "doifelsevariable", "doifempty", "doifemptyelse", "doifemptytoks", "doifemptyvalue", "doifemptyvalueelse", "doifemptyvariable", "doifemptyvariableelse", "doifenv", "doifenvelse", "doiffastoptionalcheckcselse", "doiffastoptionalcheckelse", "doiffieldbodyelse", "doiffieldcategoryelse", "doiffigureelse", "doiffile", "doiffiledefinedelse", "doiffileelse", "doiffileexistselse", "doiffirstcharelse", "doifflaggedelse", "doiffontcharelse", "doiffontpresentelse", "doiffontsynonymelse", "doifhasspaceelse", "doifhelpelse", "doifincsnameelse", "doifinelementelse", "doifinputfileelse", "doifinsertionelse", "doifinset", "doifinsetelse", "doifinstring", "doifinstringelse", "doifinsymbolset", "doifinsymbolsetelse", "doifintokselse", "doifintwopassdataelse", "doifitalicelse", "doiflanguageelse", "doiflayerdataelse", "doiflayoutdefinedelse", "doiflayoutsomelineelse", "doiflayouttextlineelse", "doifleapyearelse", "doiflistelse", "doiflocationelse", "doiflocfileelse", "doifmainfloatbodyelse", "doifmarkingelse", "doifmeaningelse", "doifmessageelse", "doifmode", "doifmodeelse", "doifnextbgroupcselse", "doifnextbgroupelse", "doifnextcharelse", "doifnextoptionalcselse", "doifnextoptionalelse", "doifnextparenthesiselse", "doifnonzeropositiveelse", "doifnot", "doifnotallcommon", "doifnotallmodes", "doifnotcommandhandler", "doifnotcommon", "doifnotcounter", "doifnotdocumentargument", "doifnotdocumentfilename", "doifnotempty", "doifnotemptyvalue", "doifnotemptyvariable", "doifnotenv", "doifnoteonsamepageelse", "doifnotescollected", "doifnotfile", "doifnotflagged", "doifnothing", "doifnothingelse", "doifnotinset", "doifnotinsidesplitfloat", "doifnotinstring", "doifnotmode", "doifnotnumber", "doifnotsamestring", "doifnotsetups", "doifnotvalue", "doifnotvariable", "doifnumber", "doifnumberelse", "doifobjectfoundelse", "doifobjectreferencefoundelse", "doifoddpageelse", "doifoddpagefloatelse", "doifoldercontextelse", "doifolderversionelse", "doifoverlappingelse", "doifoverlayelse", "doifparallelelse", "doifparentfileelse", "doifpathelse", "doifpathexistselse", "doifpatternselse", "doifposition", "doifpositionaction", "doifpositionactionelse", "doifpositionelse", "doifpositiononpageelse", "doifpositionsonsamepageelse", "doifpositionsonthispageelse", "doifpositionsusedelse", "doifreferencefoundelse", "doifrightpagefloatelse", "doifrighttoleftinboxelse", "doifsamelinereferenceelse", "doifsamestring", "doifsamestringelse", "doifsetups", "doifsetupselse", "doifsomebackground", "doifsomebackgroundelse", "doifsomespaceelse", "doifsomething", "doifsomethingelse", "doifsometoks", "doifsometokselse", "doifstringinstringelse", "doifstructurelisthasnumberelse", "doifstructurelisthaspageelse", "doifsymboldefinedelse", "doifsymbolsetelse", "doiftext", "doiftextelse", "doiftextflowcollectorelse", "doiftextflowelse", "doiftypingfileelse", "doifundefined", "doifundefinedcounter", "doifundefinedelse", "doifurldefinedelse", "doifvalue", "doifvalueelse", "doifvaluenothing", "doifvaluenothingelse", "doifvaluesomething", "doifvariable", "doifvariableelse", "doindentation", "dollar", "doloop", "doloopoverlist", "donothing", "dontconvertfont", "dontleavehmode", "dontpermitspacesbetweengroups", "dopositionaction", "doprocesslocalsetups", "doquadrupleargument", "doquadrupleempty", "doquadruplegroupempty", "doquintupleargument", "doquintupleempty", "doquintuplegroupempty", "dorechecknextindentation", "dorecurse", "dorepeatwithcommand", "doreplacefeature", "doresetandafffeature", "doresetattribute", "dorotatebox", "dosetattribute", "dosetleftskipadaption", "dosetrightskipadaption", "dosetupcheckedinterlinespace", "doseventupleargument", "doseventupleempty", "dosingleargument", "dosingleempty", "dosinglegroupempty", "dosixtupleargument", "dosixtupleempty", "dostepwiserecurse", "dosubtractfeature", "dotfskip", "dotoks", "dotripleargument", "dotripleargumentwithset", "dotripleempty", "dotripleemptywithset", "dotriplegroupempty", "doublebar", "doublebond", "doublebrace", "doublebracket", "doubleparent", "dowith", "dowithnextbox", "dowithnextboxcontent", "dowithnextboxcontentcs", "dowithnextboxcs", "dowithpargument", "dowithrange", "dowithwargument", "dpofstring", "dummydigit", "dummyparameter", "eTeX", "echelle", "ecran", "ecritdansliste", "ecritentreliste", "edefconvertedargument", "efcmaxheight", "efcmaxwidth", "efcminheight", "efcminwidth", "efcparameter", "effect", "elapsedseconds", "elapsedtime", "eleftarrowfill", "eleftharpoondownfill", "eleftharpoonupfill", "eleftrightarrowfill", "element", "elements", "emphasisboldface", "emphasistypeface", "emptylines", "emspace", "enabledirectives", "enableexperiments", "enablemode", "enableoutputstream", "enableparpositions", "enableregime", "enabletrackers", "enskip", "enspace", "env", "environement", "envvar", "eoverbarfill", "eoverbracefill", "eoverbracketfill", "eoverparentfill", "epos", "equaldigits", "erightarrowfill", "erightharpoondownfill", "erightharpoonupfill", "espace", "espacefixe", "espacesfixes", "etire", "etwoheadrightarrowfill", "eunderbarfill", "eunderbracefill", "eunderbracketfill", "eunderparentfill", "executeifdefined", "exitloop", "exitloopnow", "expandcheckedcsname", "expanded", "expandfontsynonym", "externalfigurecollectionmaxheight", "externalfigurecollectionmaxwidth", "externalfigurecollectionminheight", "externalfigurecollectionminwidth", "externalfigurecollectionparameter", "faitreference", "fakebox", "fastdecrement", "fastincrement", "fastlocalframed", "fastscale", "fastsetup", "fastsetupwithargument", "fastsetupwithargumentswapped", "fastswitchtobodyfont", "fastsxsy", "feature", "fence", "fenced", "fetchallmarkings", "fetchallmarks", "fetchmark", "fetchmarking", "fetchonemark", "fetchonemarking", "fetchruntinecommand", "fetchtwomarkings", "fetchtwomarks", "fichierdactylo", "fieldbody", "fifthoffivearguments", "fifthofsixarguments", "figure", "figureexterne", "figurefilename", "figurefilepath", "figurefiletype", "figurefullname", "figureheight", "figurenaturalheight", "figurenaturalwidth", "figuresymbol", "figurewidth", "filename", "filledhboxb", "filledhboxc", "filledhboxg", "filledhboxk", "filledhboxm", "filledhboxr", "filledhboxy", "filler", "filterfromnext", "filterfromvalue", "filterpages", "filterreference", "findtwopassdata", "finishregisterentry", "firstcharacter", "firstcounter", "firstcountervalue", "firstoffivearguments", "firstoffourarguments", "firstofoneargument", "firstofoneunexpanded", "firstofsixarguments", "firstofthreearguments", "firstofthreeunexpanded", "firstoftwoarguments", "firstoftwounexpanded", "firstrealpage", "firstrealpagenumber", "firstsubcountervalue", "firstsubpage", "firstsubpagenumber", "firstuserpage", "firstuserpagenumber", "fitfieldframed", "fittopbaselinegrid", "flag", "floatuserdataparameter", "flushboxregister", "flushcollector", "flushlayer", "flushlocalfloats", "flushnextbox", "flushnotes", "flushoutputstream", "flushshapebox", "flushtextflow", "flushtokens", "flushtoks", "fontalternative", "fontbody", "fontchar", "fontcharbyindex", "fontclass", "fontclassname", "fontface", "fontfeaturelist", "fontsize", "fontstyle", "forcecharacterstripping", "forcelocalfloats", "forgeteverypar", "forgetparameters", "formula", "foundbox", "fourthoffivearguments", "fourthoffourarguments", "fourthofsixarguments", "frac", "framed", "frameddimension", "framedparameter", "framedtext", "freezedimenmacro", "freezemeasure", "frenchspacing", "fromlinenote", "frozenhbox", "gardeblocs", "gdefconvertedargument", "gdefconvertedcommand", "getMPdrawing", "getMPlayer", "getboxllx", "getboxlly", "getbufferdata", "getcommacommandsize", "getcommalistsize", "getdayoftheweek", "getdayspermonth", "getdefinedbuffer", "getdocumentargument", "getdocumentargumentdefault", "getdocumentfilename", "getdummyparameters", "getemptyparameters", "geteparameters", "getexpandedparameters", "getfiguredimensions", "getfirstcharacter", "getfirsttwopassdata", "getfromcommacommand", "getfromcommalist", "getfromtwopassdata", "getglyphdirect", "getglyphstyled", "getgparameters", "getlasttwopassdata", "getlocalfloat", "getlocalfloats", "getmessage", "getnamedglyphdirect", "getnamedglyphstyled", "getnamedtwopassdatalist", "getnaturaldimensions", "getnoflines", "getobject", "getobjectdimensions", "getpaletsize", "getparameters", "getprivatechar", "getprivateslot", "getrandomcount", "getrandomdimen", "getrandomfloat", "getrandomnumber", "getrandomseed", "getraweparameters", "getrawgparameters", "getrawnoflines", "getrawparameters", "getrawxparameters", "getreference", "getreferenceentry", "getroundednoflines", "getsubstring", "gettwopassdata", "gettwopassdatalist", "getuvalue", "getvalue", "getvariable", "getvariabledefault", "getxparameters", "globaldisablemode", "globalenablemode", "globalletempty", "globalpopbox", "globalpopmacro", "globalpreventmode", "globalprocesscommalist", "globalpushbox", "globalpushmacro", "globalswapcounts", "globalswapdimens", "globalswapmacros", "globalundefine", "glyphfontfile", "gobbledoubleempty", "gobbleeightarguments", "gobblefivearguments", "gobblefiveoptionals", "gobblefourarguments", "gobblefouroptionals", "gobbleninearguments", "gobbleoneargument", "gobbleoneoptional", "gobblesevenarguments", "gobblesingleempty", "gobblesixarguments", "gobblespacetokens", "gobbletenarguments", "gobblethreearguments", "gobblethreeoptionals", "gobbletwoarguments", "gobbletwooptionals", "gobbleuntil", "gobbleuntilrelax", "grabbufferdata", "grabbufferdatadirect", "grabuntil", "graphique", "grayvalue", "greedysplitstring", "greeknumerals", "grille", "groupedcommand", "gsetboxllx", "gsetboxlly", "gujaratinumerals", "gurmurkhinumerals", "hairspace", "halfwaybox", "handletokens", "handwritten", "hash", "haut", "hboxofvbox", "hboxreference", "hdofstring", "headhbox", "headnumbercontent", "headnumberdistance", "headnumberwidth", "headreferenceattributes", "headsetupspacing", "headtextcontent", "headtextdistance", "headtextwidth", "headvbox", "headwidth", "heightanddepthofstring", "heightofstring", "heightspanningtext", "helptext", "hglue", "hiddenbar", "hiddencitation", "hiddencite", "highlight", "highordinalstr", "hilo", "himilo", "hl", "horizontalgrowingbar", "horizontalpositionbar", "hphantom", "hpos", "hsizefraction", "hsmash", "hsmashbox", "hsmashed", "hspace", "htdpofstring", "htofstring", "hyphen", "hyphenatedcoloredword", "hyphenatedfile", "hyphenatedfilename", "hyphenatedhbox", "hyphenatedpar", "hyphenatedurl", "hyphenatedword", "ibox", "ifassignment", "iff", "ifinobject", "ifinoutputstream", "ifparameters", "iftrialtypesetting", "ignoreimplicitspaces", "ignorevalue", "immediatesavetwopassdata", "impliedby", "implies", "includemenu", "includeversioninfo", "inconnu", "increment", "incrementcounter", "incrementedcounter", "incrementpagenumber", "incrementsubpagenumber", "incrementvalue", "indentation", "infofont", "infofontbold", "inframed", "infull", "inheritparameter", "inhibitblank", "initializeboxstack", "inlinebuffer", "inlinedbox", "inlinemath", "inlinemathematics", "inlinemessage", "inlineordisplaymath", "inlinerange", "inmframed", "innerflushshapebox", "input", "inputfilebarename", "inputfilename", "inputfilerealsuffix", "inputfilesuffix", "inputgivenfile", "insertpages", "installactionhandler", "installactivecharacter", "installanddefineactivecharacter", "installattributestack", "installautocommandhandler", "installautosetuphandler", "installbasicautosetuphandler", "installbasicparameterhandler", "installbottomframerenderer", "installcommandhandler", "installcorenamespace", "installdefinehandler", "installdefinitionset", "installdefinitionsetmember", "installdirectcommandhandler", "installdirectparameterhandler", "installdirectparametersethandler", "installdirectsetuphandler", "installdirectstyleandcolorhandler", "installelangue", "installframedautocommandhandler", "installframedcommandhandler", "installleftframerenderer", "installnamespace", "installoutputroutine", "installpagearrangement", "installparameterhandler", "installparameterhashhandler", "installparametersethandler", "installparentinjector", "installrightframerenderer", "installrootparameterhandler", "installsetuphandler", "installsetuponlycommandhandler", "installshipoutmethod", "installsimplecommandhandler", "installsimpleframedcommandhandler", "installstyleandcolorhandler", "installswitchcommandhandler", "installswitchsetuphandler", "installtexdirective", "installtextracker", "installtopframerenderer", "installunitsseparator", "installunitsspace", "installversioninfo", "integerrounding", "intermezzo", "intertext", "invokepageheandler", "istltdir", "istrtdir", "italic", "italicbold", "italiccorrection", "itemtag", "jobfilename", "jobfilesuffix", "joursemaine", "kap", "keeplinestogether", "keepunwantedspaces", "kerncharacters", "koreancirclenumerals", "koreannumerals", "koreannumeralsc", "koreannumeralsp", "koreanparentnumerals", "languageCharacters", "languagecharacters", "languagecharwidth", "langue", "langueprincipale", "largeurligne", "lastcounter", "lastcountervalue", "lastdigit", "lastlinewidth", "lastnaturalboxdp", "lastnaturalboxht", "lastnaturalboxwd", "lastpredefinedsymbol", "lastrealpage", "lastrealpagenumber", "lastsubcountervalue", "lastsubpage", "lastsubpagenumber", "lasttwodigits", "lastuserpage", "lastuserpagenumber", "lateluacode", "layeredtext", "layerheight", "layerwidth", "lazysavetaggedtwopassdata", "lazysavetwopassdata", "lbox", "left", "leftbottombox", "leftbox", "lefthbox", "leftorrighthbox", "leftorrightvbox", "leftorrightvtop", "leftskipadaption", "leftsubguillemot", "lefttopbox", "lefttorighthbox", "lefttorightvbox", "lefttorightvtop", "letbeundefined", "letcatcodecommand", "letcscsname", "letcsnamecs", "letcsnamecsname", "letdummyparameter", "letempty", "letgvalue", "letgvalueempty", "letgvalurelax", "letterampersand", "letterat", "letterbackslash", "letterbar", "letterbgroup", "letterclosebrace", "lettercolon", "letterdollar", "letterdoublequote", "letteregroup", "letterescape", "letterexclamationmark", "letterhash", "letterhat", "letterleftbrace", "letterless", "lettermore", "letteropenbrace", "letterpercent", "letterquestionmark", "letterrightbrace", "lettersinglequote", "letterslash", "letterspacing", "lettertilde", "letterunderscore", "letvalue", "letvalueempty", "letvaluerelax", "lfence", "lhbox", "ligneh", "lignenoire", "ligneregleetexte", "lignesnoires", "limitatelines", "limitatetext", "limtatefirstline", "linespanningtext", "listcitation", "listcite", "lister", "listnamespaces", "llap", "llongueurliste", "loadanyfile", "loadanyfileonce", "loadbtxdefinitionfile", "loadbtxreplacementfile", "loadcldfile", "loadcldfileonce", "loadfontgoodies", "loadluafile", "loadluafileonce", "loadspellchecklist", "loadtexfile", "loadtexfileonce", "loadtypescriptfile", "localframed", "localframedwithsettings", "localhsize", "localpopbox", "localpopmacro", "localpushbox", "localpushmacro", "localundefine", "locatedfilepath", "locatefilepath", "locfilename", "lomihi", "lowerbox", "lowercased", "lowercasestring", "lowerleftdoubleninequote", "lowerleftsingleninequote", "lowerrightdoubleninequote", "lowerrightsingleninequote", "lrtbbox", "ltop", "luaTeX", "luacode", "luaconditional", "luaenvironment", "luaexpanded", "luafunction", "luajitTeX", "luamajorversion", "luaminorversion", "luaparameterset", "luasetup", "luaversion", "m", "mLeftarrow", "mLeftrightarrow", "mRightarrow", "makecharacteractive", "makerawcommalist", "makestrutofbox", "mapfontsize", "margindata", "markcontent", "markinjector", "marquage", "marquepage", "mat", "math", "mathbf", "mathbi", "mathblackboard", "mathbs", "mathcommand", "mathdefault", "mathematique", "mathfraktur", "mathfunction", "mathit", "mathitalic", "mathop", "mathrm", "mathscript", "mathsl", "mathss", "mathtext", "mathtextbf", "mathtextbi", "mathtextbs", "mathtextit", "mathtextsl", "mathtexttf", "mathtf", "mathtriplet", "mathtt", "mathupright", "mathword", "mathwordbf", "mathwordbi", "mathwordbs", "mathwordit", "mathwordsl", "mathwordtf", "mbox", "mcframed", "md", "measure", "measured", "medskip", "medspace", "menuinteraction", "mequal", "message", "metaTeX", "mfence", "mframed", "mfunction", "mfunctionlabeltext", "mhbox", "mhookleftarrow", "mhookrightarrow", "middle", "middlebox", "midhbox", "minimalhbox", "mixedcaps", "mkvibuffer", "mleftarrow", "mleftharpoondown", "mleftharpoonup", "mleftrightarrow", "mleftrightharpoons", "mmapsto", "moduleparameter", "mois", "molecule", "mono", "monobold", "mononormal", "monthlong", "monthshort", "montrecadre", "montrecouleur", "montredisposition", "montreedition", "montreenvironnementpolicecorps", "montregrille", "montregroupecouleur", "montrejeusymboles", "montremakeup", "montrepalette", "montrepolicecorps", "montrereglages", "montrestruts", "mp", "mprandomnumber", "mrel", "mrightarrow", "mrightharpoondown", "mrightharpoonup", "mrightleftharpoons", "mrightoverleftarrow", "mtext", "mtriplerel", "mtwoheadleftarrow", "mtwoheadrightarrow", "namedheadnumber", "namedstructureheadlocation", "namedstructureuservariable", "namedstructurevariable", "namedtaggedlabeltexts", "naturalhbox", "naturalhpack", "naturalvbox", "naturalvcenter", "naturalvpack", "naturalvtop", "naturalwd", "negatecolorbox", "negated", "negthinspace", "newattribute", "newcatcodetable", "newcounter", "newevery", "newfrenchspacing", "newmode", "newsignal", "newsystemmode", "nextbox", "nextboxdp", "nextboxht", "nextboxhtdp", "nextboxwd", "nextcounter", "nextcountervalue", "nextdepth", "nextparagraphs", "nextrealpage", "nextrealpagenumber", "nextsubcountervalue", "nextsubpage", "nextsubpagenumber", "nextuserpage", "nextuserpagenumber", "nobar", "nocap", "nocitation", "nocite", "nodetostring", "noffigurepages", "noflines", "noflocalfloats", "noindentation", "noitem", "nonfrenchspacing", "nonmathematics", "normal", "normalboldface", "normalframedwithsettings", "normalizebodyfontsize", "normalizedfontsize", "normalizefontdepth", "normalizefontheight", "normalizefontline", "normalizefontwidth", "normalizetextdepth", "normalizetextheight", "normalizetextline", "normalizetextwidth", "normaltypeface", "note", "notesymbol", "ntimes", "numberofpoints", "numeroformule", "numeropage", "numeros", "numerotete", "numerotetecourant", "obeydepth", "objectdepth", "objectheight", "objectmargin", "objectwidth", "obox", "obtientmarquage", "offset", "offsetbox", "onedigitrounding", "ordinaldaynumber", "ordinalstr", "oriente", "ornamenttext", "outputfilename", "outputstreambox", "outputstreamcopy", "outputstreamunvbox", "outputstreamunvcopy", "over", "overbar", "overbars", "overbartext", "overbarunderbar", "overbrace", "overbracetext", "overbraceunderbrace", "overbracket", "overbrackettext", "overbracketunderbracket", "overlaybutton", "overlaycolor", "overlaydepth", "overlayfigure", "overlayheight", "overlaylinecolor", "overlaylinewidth", "overlayoffset", "overlayrollbutton", "overlaywidth", "overleftarrow", "overleftharpoondown", "overleftharpoonup", "overleftrightarrow", "overloaderror", "overparent", "overparenttext", "overparentunderparent", "overrightarrow", "overrightharpoondown", "overrightharpoonup", "overset", "overstrike", "overstrikes", "overtwoheadleftarrow", "overtwoheadrightarrow", "page", "pagearea", "pagebreak", "pagefigure", "pagegridspanwidth", "pageinjection", "pagestaterealpage", "paletsize", "pdfTeX", "pdfactualtext", "pdfbackendactualtext", "pdfbackendcurrentresources", "pdfbackendsetcatalog", "pdfbackendsetcolorspace", "pdfbackendsetextgstate", "pdfbackendsetinfo", "pdfbackendsetname", "pdfbackendsetpageattribute", "pdfbackendsetpageresource", "pdfbackendsetpagesattribute", "pdfbackendsetpattern", "pdfbackendsetshade", "pdfcolor", "pdfeTeX", "percent", "percentdimen", "periodes", "permitcaretescape", "permitcircumflexescape", "permitspacesbetweengroups", "persiandecimals", "persiannumerals", "phantom", "phantombox", "pickupgroupedcommand", "pilechamp", "placeattachments", "placebtxrendering", "placecitation", "placecomments", "placecoteacote", "placecurrentformulanumber", "placedbox", "placefloatwithsetups", "placeflottant", "placeformule", "placeframed", "placehelp", "placeinitial", "placelayer", "placelayeredtext", "placelesunsaudessusdesautres", "placeliste", "placelisteinmbriquee", "placelistofpublications", "placelistofsorts", "placelistofsynonyms", "placelocalnotes", "placemarquespages", "placement", "placenamedfloat", "placenamedformula", "placenotes", "placenotespdp", "placenotespdplocales", "placenumeropage", "placenumerotete", "placepairedbox", "placeparallel", "placerawlist", "placeregistre", "placerenderingwindow", "placesousformule", "placesurgrille", "placetextetete", "popattribute", "popmacro", "popmode", "popsystemmode", "position", "positionoverlay", "positionregionoverlay", "postponenotes", "predefinedfont", "predefinefont", "predefinesymbol", "prefixedpagenumber", "prendbuffer", "prependetoks", "prependgvalue", "prependtocommalist", "prependtoks", "prependtoksonce", "prependvalue", "presetdocument", "presetfieldsymbols", "pretocommalist", "prevcounter", "prevcountervalue", "preventmode", "prevrealpage", "prevrealpagenumber", "prevsubcountervalue", "prevsubpage", "prevsubpagenumber", "prevuserpage", "prevuserpagenumber", "procent", "processMPbuffer", "processMPfigurefile", "processaction", "processallactionsinset", "processassignlist", "processassignmentcommand", "processassignmentlist", "processbetween", "processbodyfontenvironmentlist", "processcolorcomponents", "processcommacommand", "processcommalist", "processcommalistwithparameters", "processcontent", "processfile", "processfilemany", "processfilenone", "processfileonce", "processfirstactioninset", "processisolatedchars", "processisolatedwords", "processlinetablebuffer", "processlinetablefile", "processlist", "processmonth", "processranges", "processseparatedlist", "processtexbuffer", "processtokens", "processuntil", "processxtablebuffer", "processyear", "produit", "profiledbox", "profilegivenbox", "programme", "projet", "pseudoMixedCapped", "pseudoSmallCapped", "pseudoSmallcapped", "pseudosmallcapped", "purenumber", "pushattribute", "pushbutton", "pushmacro", "pushmode", "pushoutputstream", "pushsystemmode", "qqpart", "qquad", "quad", "quads", "quitcommalist", "quitprevcommalist", "quittypescriptscanning", "raisebox", "randomizetext", "randomnumber", "rawcounter", "rawcountervalue", "rawdate", "rawdoifelseinset", "rawdoifinset", "rawdoifinsetelse", "rawgetparameters", "rawprocessaction", "rawprocesscommacommand", "rawprocesscommalist", "rawstructurelistuservariable", "rawsubcountervalue", "razmarquage", "rbox", "readfile", "readfixfile", "readjobfile", "readlocfile", "readsetfile", "readsysfile", "readtexfile", "readxmlfile", "realSmallCapped", "realSmallcapped", "realpagenumber", "realsmallcapped", "recursedepth", "recurselevel", "recursestring", "redoconvertfont", "ref", "reference", "referencepage", "referenceprefix", "referencetexte", "reflete", "registerattachment", "registerctxluafile", "registerexternalfigure", "registerfontclass", "registerhyphenationexception", "registerhyphenationpattern", "registermenubuttons", "registersort", "registersynonym", "registerunit", "reglearrangement", "reglearriereplan", "reglearriereplans", "reglebarreinteraction", "reglebloc", "regleblocsection", "reglebuffer", "reglecapitales", "reglechamp", "reglechamps", "regleclipping", "reglecolonnes", "reglecommentaire", "reglecommentairepage", "reglecompoetroite", "reglecomposeenalinea", "reglecouleur", "reglecouleurs", "regledactylo", "regledemarrestoppe", "regledisposition", "regleecraninteraction", "regleelements", "regleencadre", "regleentete", "regleepaisseurligne", "regleespaceblanc", "regleespacement", "regleespacementinterligne", "regleflottant", "regleformulaires", "reglegroupeselements", "regleinf", "regleinteraction", "regleintitule", "reglejeusymboles", "reglelangue", "reglelignes", "reglelignesnoires", "reglelignesreglestexte", "regleliste", "reglelisteimbriquee", "reglemakeup", "reglemargereglee", "reglemarquage", "reglemarquagehyphenation", "reglemenuinteraction", "reglenumeropage", "reglenumerotationligne", "reglenumerotationpage", "reglenumerotationparagraphe", "reglenumerotete", "regleoriente", "reglepalette", "reglepapier", "regleparagraphes", "reglepdp", "regleplacementopposition", "reglepolicecorps", "reglepositionnement", "regleprogrammes", "reglereferencage", "regleregistre", "regleremplitligne", "regleremplitlignesreglees", "regleseparationflottant", "reglesousnumeropage", "reglesup", "reglesynonymes", "regletableaux", "regletabulation", "regletaillepapier", "regletete", "regletetes", "regletexte", "regletextesentete", "regletextesinf", "regletextespdp", "regletextessup", "regletextestexte", "regletolerance", "regletraitsfins", "regletransitionspage", "regletri", "regletype", "regleurl", "regular", "relatemarking", "relateparameterhandlers", "relaxvalueifundefined", "remainingcharacters", "removebottomthings", "removedepth", "removefromcommalist", "removelastskip", "removelastspace", "removemarkedcontent", "removepunctuation", "removesubstring", "removetoks", "removeunwantedspaces", "remplitligne", "remplitlignesreglees", "remplittexte", "replacefeature", "replaceincommalist", "replaceword", "rescan", "rescanwithsetup", "resetMPdrawing", "resetMPenvironment", "resetMPinstance", "resetallattributes", "resetandaddfeature", "resetbar", "resetbreakpoints", "resetbuffer", "resetcharacteralign", "resetcharacterkerning", "resetcharacterspacing", "resetcharacterstripping", "resetcollector", "resetcounter", "resetdigitsmanipulation", "resetdirection", "resetfeature", "resetflag", "resetfontcolorsheme", "resetfontfallback", "resetfontsolution", "resethyphenationfeatures", "resetinjector", "resetinteractionmenu", "resetitaliccorrection", "resetlayer", "resetlocalfloats", "resetmarker", "resetmode", "resetpagenumber", "resetparallel", "resetpath", "resetpenalties", "resetprofile", "resetreference", "resetreplacement", "resetscript", "resetsetups", "resetshownsynonyms", "resetsubpagenumber", "resetsymbolset", "resetsystemmode", "resettimer", "resettrackers", "resettrialtypesetting", "resetusedsortings", "resetusedsynonyms", "resetuserpagenumber", "resetvalue", "resetvisualizers", "reshapebox", "resolvedglyphdirect", "resolvedglyphstyled", "restartcounter", "restorebox", "restorecatcodes", "restorecounter", "restorecurrentattributes", "restoreendofline", "restoreglobalbodyfont", "reusableMPgraphic", "reuseMPgraphic", "reuserandomseed", "revivefeature", "rfence", "rhbox", "right", "rightbottombox", "rightbox", "righthbox", "rightorleftpageaction", "rightskipadaption", "rightsubguillemot", "righttolefthbox", "righttoleftvbox", "righttoleftvtop", "righttopbox", "rlap", "robustaddtocommalist", "robustdoifelseinset", "robustdoifinsetelse", "robustpretocommalist", "rollbutton", "roman", "rtop", "ruledhbox", "ruledhpack", "ruledmbox", "ruledtopv", "ruledtpack", "ruledvbox", "ruledvpack", "ruledvtop", "runMPbuffer", "runninghbox", "safechar", "sans", "sansbold", "sansespace", "sanslignesenteteetpdp", "sanslignessupetinf", "sansnormal", "sansserif", "savebox", "savebtxdataset", "savebuffer", "savecounter", "savecurrentattributes", "savenormalmeaning", "savetaggedtwopassdata", "savetwopassdata", "sbox", "sd", "secondoffivearguments", "secondoffourarguments", "secondofsixarguments", "secondofthreearguments", "secondofthreeunexpanded", "secondoftwoarguments", "secondoftwounexpanded", "section", "select", "selectionneblocs", "separeflottant", "serializecommalist", "serializedcommalist", "serif", "serifbold", "serifnormal", "setJSpreamble", "setMPlayer", "setMPpositiongraphic", "setMPpositiongraphicrange", "setMPtext", "setMPvariable", "setMPvariables", "setbar", "setbigbodyfont", "setboxllx", "setboxlly", "setbreakpoints", "setcapstrut", "setcatcodetable", "setcharacteralign", "setcharactercasing", "setcharactercleaning", "setcharacterkerning", "setcharacterspacing", "setcharacterstripping", "setcharstrut", "setcollector", "setcolormodell", "setcounter", "setcounterown", "setcurrentfontclass", "setdataset", "setdefaultpenalties", "setdigitsmanipulation", "setdirection", "setdocumentargument", "setdocumentargumentdefault", "setdocumentfilename", "setdummyparameter", "setelementexporttag", "setemeasure", "setevalue", "setevariable", "setevariables", "setfirstline", "setflag", "setfont", "setfontcolorsheme", "setfontfeature", "setfontsolution", "setfontstrut", "setfractions", "setgmeasure", "setgvalue", "setgvariable", "setgvariables", "sethboxregister", "sethyphenatedurlafter", "sethyphenatedurlbefore", "sethyphenatedurlnormal", "sethyphenationfeatures", "setinitial", "setinjector", "setinteraction", "setinterfacecommand", "setinterfaceconstant", "setinterfaceelements", "setinterfacemessage", "setinterfacevariable", "setinternalrendering", "setitaliccorrection", "setlayer", "setlayerframed", "setlayertext", "setlinefiller", "setlocalhsize", "setmainbodyfont", "setmainparbuilder", "setmarker", "setmarking", "setmathstyle", "setmeasure", "setmessagetext", "setmode", "setnostrut", "setnote", "setnotetext", "setobject", "setoldstyle", "setpagegrid", "setpagereference", "setpagestate", "setpagestaterealpageno", "setpenalties", "setpercentdimen", "setposition", "setpositionbox", "setpositiondata", "setpositiondataplus", "setpositiononly", "setpositionplus", "setpositionstrut", "setprofile", "setrandomseed", "setreference", "setreferencedobject", "setregisterentry", "setreplacement", "setrigidcolumnbalance", "setrigidcolumnhsize", "setscript", "setsectionblock", "setsimplecolumnhsize", "setsmallbodyfont", "setsmallcaps", "setstackbox", "setstructurepageregister", "setstrut", "setsuperiors", "setsystemmode", "settabular", "settaggedmetadata", "settext", "settightobject", "settightreferencedobject", "settightunreferencedobject", "settrialtypesetting", "setuevalue", "setugvalue", "setunreferencedobject", "setup", "setupMPgraphics", "setupMPinstance", "setupMPpage", "setupMPvariables", "setupTABLE", "setupTEXpage", "setupattachment", "setupbackend", "setupbar", "setupbleeding", "setupbookmark", "setupbtx", "setupbtxdataset", "setupbtxlist", "setupbtxregister", "setupbtxrendering", "setupbutton", "setupcharacterkerning", "setupcharacterspacing", "setupchemical", "setupchemicalframed", "setupcollector", "setupcolumnspan", "setupcombination", "setupcounter", "setupdataset", "setupdelimitedtext", "setupdescription", "setupdirections", "setupdocument", "setupeffect", "setupenumeration", "setupenv", "setupexport", "setupexternalfigure", "setupexternalsoundtracks", "setupfieldbody", "setupfieldcategory", "setupfieldcontentframed", "setupfieldlabelframed", "setupfieldtotalframed", "setupfiller", "setupfirstline", "setupfittingpage", "setupfloatcaption", "setupfontexpansion", "setupfontprotrusion", "setupfonts", "setupfontsolution", "setupformula", "setupformulaframed", "setupframedcontent", "setupframedtext", "setupglobalreferenceprefix", "setupheadalternative", "setuphelp", "setuphigh", "setuphighlight", "setuphyphenation", "setupindentedtext", "setupinitial", "setupinsertion", "setupitaliccorrection", "setupitemgroup", "setuplabel", "setuplayer", "setuplayeredtext", "setuplayouttext", "setuplinefiller", "setuplinefillers", "setuplinenote", "setuplinetable", "setuplistalternative", "setuplistextra", "setuplocalfloats", "setuplocalinterlinespace", "setuplow", "setuplowhigh", "setuplowmidhigh", "setupmarginblock", "setupmargindata", "setupmarginframed", "setupmarginrule", "setupmathalignment", "setupmathcases", "setupmathematics", "setupmathfence", "setupmathfraction", "setupmathframed", "setupmathmatrix", "setupmathornament", "setupmathradical", "setupmathstackers", "setupmathstyle", "setupmixedcolumns", "setupmodule", "setupnotation", "setupnotations", "setupnote", "setupnotes", "setupoffset", "setupoffsetbox", "setupoutputroutine", "setuppagechecker", "setuppagegrid", "setuppagegridarea", "setuppagegridareatext", "setuppagegridlines", "setuppagegridspan", "setuppagegridstart", "setuppageinjection", "setuppageinjectionalternative", "setuppageshift", "setuppagestate", "setuppairedbox", "setupparagraph", "setupparagraphintro", "setupparallel", "setupperiods", "setupplacement", "setuppositionbar", "setupprocessor", "setupprofile", "setupquotation", "setuprealpagenumber", "setupreferenceformat", "setupreferenceprefix", "setupreferencestructureprefix", "setupregisters", "setuprenderingwindow", "setups", "setupscale", "setupscript", "setupscripts", "setupselector", "setupshift", "setupsidebar", "setupspellchecking", "setupstretched", "setupstruts", "setupstyle", "setupsubformula", "setuptabulation", "setuptagging", "setuptextbackground", "setuptextflow", "setuptooltip", "setupunit", "setupuserpagenumber", "setupversion", "setupviewerlayer", "setupvspacing", "setupwithargument", "setupwithargumentswapped", "setupxml", "setupxtable", "setuvalue", "setuxvalue", "setvalue", "setvariable", "setvariables", "setvboxregister", "setvisualizerfont", "setvtopregister", "setwidthof", "setxmeasure", "setxvalue", "setxvariable", "setxvariables", "sfrac", "shapedhbox", "showallmakeup", "showattributes", "showboxes", "showbtxdatasetauthors", "showbtxdatasetcompleteness", "showbtxdatasetfields", "showbtxfields", "showbtxhashedauthors", "showbtxtables", "showchardata", "showcharratio", "showcolorbar", "showcolorcomponents", "showcolorset", "showcolorstruts", "showcounter", "showdirectives", "showdirsinmargin", "showedebuginfo", "showexperiments", "showfont", "showfontdata", "showfontkerns", "showfontparameters", "showfontstrip", "showfontstyle", "showglyphs", "showgridsnapping", "showhelp", "showhyphenationtrace", "showhyphens", "showinjector", "showjustification", "showkerning", "showlayoutcomponents", "showligature", "showligatures", "showlogcategories", "showmargins", "showmessage", "showminimalbaseline", "shownextbox", "showotfcomposition", "showparentchain", "showsetupsdefinition", "showtimer", "showtokens", "showtrackers", "showvalue", "showvariable", "showwarning", "simplegroupedcommand", "singalcharacteralign", "singlebond", "sixthofsixarguments", "slanted", "slantedbold", "slicepages", "slovenianNumerals", "sloveniannumerals", "small", "smallbodyfont", "smallbold", "smallbolditalic", "smallboldslanted", "smallcappedcharacters", "smallcappedromannumerals", "smaller", "smallitalicbold", "smallnormal", "smallskip", "smallslanted", "smallslantedbold", "smalltype", "smash", "smashbox", "smashboxed", "smashedhbox", "smashedvbox", "snaptogrid", "someheadnumber", "somekindoftab", "somelocalfloat", "somenamedheadnumber", "someplace", "sousnumeropage", "soussection", "soussoussection", "soussoussoussection", "soussoussoussoussection", "soussoussoussoussujet", "soussoussoussujet", "soussoussujet", "soussujet", "sp", "spanishNumerals", "spanishnumerals", "speech", "splitatasterisk", "splitatcolon", "splitatcolons", "splitatcomma", "splitdfrac", "splitfilename", "splitfrac", "splitoffbase", "splitofffull", "splitoffkind", "splitoffname", "splitoffpath", "splitoffroot", "splitofftokens", "splitofftype", "splitstring", "spreadhbox", "sqrt", "stackrel", "startregister", "startstructurepageregister", "stoppeJScode", "stoppeJSpreamble", "stoppeMPclip", "stoppeMPcode", "stoppeMPdefinitions", "stoppeMPdrawing", "stoppeMPenvironment", "stoppeMPextensions", "stoppeMPinclusions", "stoppeMPinitializations", "stoppeMPpage", "stoppeMPpositiongraphic", "stoppeMPpositionmethod", "stoppeMPrun", "stoppeTABLE", "stoppeTABLEbody", "stoppeTABLEfoot", "stoppeTABLEhead", "stoppeTABLEnext", "stoppeTC", "stoppeTD", "stoppeTDs", "stoppeTEXpage", "stoppeTH", "stoppeTN", "stoppeTR", "stoppeTRs", "stoppeTX", "stoppeTY", "stoppeallmodes", "stoppearrangedpages", "stoppearriereplan", "stoppeaside", "stoppeattachment", "stoppebar", "stoppebinom", "stoppebitmapimage", "stoppeblockquote", "stoppebtxrenderingdefinitions", "stoppebuffer", "stoppebutton", "stoppecatcodetable", "stoppechapitre", "stoppecharacteralign", "stoppecheckedfences", "stoppechemical", "stoppecitation", "stoppeciter", "stoppecollect", "stoppecollecting", "stoppecolorintent", "stoppecoloronly", "stoppecolorset", "stoppecolumns", "stoppecolumnspan", "stoppecombination", "stoppecomment", "stoppecommentaire", "stoppecomposant", "stoppecontextcode", "stoppecontextdefinitioncode", "stoppecouleur", "stoppectxfunction", "stoppectxfunctiondefinition", "stoppecurrentcolor", "stoppecurrentlistentrywrapper", "stoppedbinom", "stoppedelimited", "stoppedelimitedtext", "stoppedfrac", "stoppediscours", "stoppedisplaymath", "stoppedmath", "stoppedocument", "stoppeeffect", "stoppeelement", "stoppeembeddedxtable", "stoppeendofline", "stoppeenvironement", "stoppeexceptions", "stoppeexpanded", "stoppeexpandedcollect", "stoppeextendedcatcodetable", "stoppeexternalfigurecollection", "stoppefigure", "stoppefitfieldframed", "stoppefittingpage", "stoppefloatcombination", "stoppefont", "stoppefontclass", "stoppefontsolution", "stoppeformula", "stoppeformulas", "stoppefrac", "stoppeframed", "stoppeframedcontent", "stoppeframedtext", "stoppegraphique", "stoppegridsnapping", "stoppegroupe", "stoppehbox", "stoppehboxestohbox", "stoppehboxregister", "stoppehelptext", "stoppehiddenbar", "stoppehiding", "stoppehighlight", "stoppehyphenation", "stoppeimath", "stoppeindentation", "stoppeindentedtext", "stoppeinmframed", "stoppeinteraction", "stoppeinterface", "stoppeintermezzo", "stoppeintertext", "stoppeitemgroup", "stoppeknockout", "stoppelayout", "stoppeligne", "stoppeligneregleetexte", "stoppelinecorrection", "stoppelinefiller", "stoppelinenumbering", "stoppelinetable", "stoppelinetablebody", "stoppelinetablecell", "stoppelinetablehead", "stoppelister", "stoppelocalfootnotes", "stoppelocalheadsetup", "stoppelocallinecorrection", "stoppelocalnotes", "stoppelocalsetups", "stoppelua", "stoppeluacode", "stoppeluaparameterset", "stoppeluasetups", "stoppemakeup", "stoppemargereglee", "stoppemarginblock", "stoppemarkedcontent", "stoppemathmode", "stoppemathstyle", "stoppematrices", "stoppemcframed", "stoppemdformula", "stoppemenuinteraction", "stoppemframed", "stoppemixedcolumns", "stoppemode", "stoppemodeset", "stoppemodule", "stoppemoduletestsection", "stoppempformula", "stoppenamedsection", "stoppenamedsubformulas", "stoppenarrow", "stoppenarrower", "stoppenegative", "stoppenicelyfilledbox", "stoppenobar", "stoppenointerference", "stoppenotallmodes", "stoppenotext", "stoppenotmode", "stoppeopposite", "stoppeoutputstream", "stoppeoverbar", "stoppeoverbars", "stoppeoverlay", "stoppeoverprint", "stoppepagecomment", "stoppepagefigure", "stoppepagegrid", "stoppepagegridspan", "stoppepagelayout", "stoppepar", "stoppeparagraph", "stoppeparagraphs", "stoppeparagraphscell", "stoppeparbuilder", "stoppepath", "stoppeplaceformule", "stoppeplacepairedbox", "stoppepositioning", "stoppepositionoverlay", "stoppepositive", "stoppepostponing", "stoppeprocessassignmentcommand", "stoppeprocessassignmentlist", "stoppeprocesscommacommand", "stoppeprocesscommalist", "stoppeproduit", "stoppeprojet", "stoppeprotect", "stoppeprotectedcolors", "stoppepublication", "stoppepunctuation", "stopperandomized", "stopperandomseed", "stopperawsetups", "stoppereadingfile", "stoppereferenceprefix", "stopperegime", "stoppereusableMPgraphic", "stoppescript", "stoppesdformula", "stoppesection", "stoppesectionblock", "stoppesectionblockenvironment", "stoppesectionlevel", "stoppesetups", "stoppesfrac", "stoppeshapebox", "stoppeshift", "stoppesidebar", "stoppesimplecolumns", "stoppesousligne", "stoppesouslignetout", "stoppesoussection", "stoppesoussoussection", "stoppesoussoussoussection", "stoppesoussoussoussoussection", "stoppesoussoussoussoussujet", "stoppesoussoussoussujet", "stoppesoussoussujet", "stoppesoussujet", "stoppespecialitem", "stoppespeech", "stoppespformula", "stoppespread", "stoppestartstop", "stoppestaticMPfigure", "stoppestaticMPgraphic", "stoppestrictinspectnextcharacter", "stoppestrut", "stoppestyle", "stoppesubformulas", "stoppesubjectlevel", "stoppesubsentence", "stoppesubstack", "stoppesujet", "stoppesurligne", "stoppesurlignetout", "stoppesymbolset", "stoppetable", "stoppetableau", "stoppetablehead", "stoppetables", "stoppetabletail", "stoppetabulate", "stoppetabulatehead", "stoppetabulatetail", "stoppetagged", "stoppetbinom", "stoppetete", "stoppetexcode", "stoppetexdefinition", "stoppetext", "stoppetextbackground", "stoppetextbackgroundmanual", "stoppetextcolor", "stoppetextcolorintent", "stoppetexteaide", "stoppetexteencadre", "stoppetextflow", "stoppetitre", "stoppetokens", "stoppetransparent", "stoppetypescript", "stoppetypescriptcollection", "stoppeunderdash", "stoppeunderdashes", "stoppeunderdot", "stoppeunderdots", "stoppeunderrandom", "stoppeunderrandoms", "stoppeunderstrike", "stoppeunderstrikes", "stoppeunframed", "stoppeuniqueMPgraphic", "stoppeuniqueMPpagegraphic", "stoppeunpacked", "stoppeusableMPgraphic", "stoppeuseMPgraphic", "stoppeusemathstyleparameter", "stoppeusingbtxspecification", "stoppeva", "stoppevbox", "stoppevboxregister", "stoppevboxtohbox", "stoppevboxtohboxseparator", "stoppeviewerlayer", "stoppevtop", "stoppevtopregister", "stoppexcell", "stoppexcellgroup", "stoppexfrac", "stoppexgroup", "stoppexmldisplayverbatim", "stoppexmlinlineverbatim", "stoppexmlraw", "stoppexmlsetups", "stoppexrow", "stoppexrowgroup", "stoppextable", "stoppextablebody", "stoppextablefoot", "stoppextablehead", "stoppextablenext", "stoppexxfrac", "stopregister", "stopstructurepageregister", "strictdoifelsenextoptional", "strictdoifnextoptionalelse", "stripcharacter", "strippedcsname", "stripspaces", "structurelistuservariable", "structurenumber", "structuretitle", "structureuservariable", "structurevariable", "strut", "strutdp", "strutht", "struthtdp", "struttedbox", "strutwd", "style", "styleinstance", "subsentence", "substituteincommalist", "subtractfeature", "sujet", "swapcounts", "swapdimens", "swapface", "swapmacros", "swaptypeface", "switchstyleonly", "switchtocolor", "switchtointerlinespace", "symbole", "symbolreference", "synchronizeblank", "synchronizeindenting", "synchronizemarking", "synchronizeoutputstreams", "synchronizestrut", "synchronizewhitespace", "systemlog", "systemlogfirst", "systemloglast", "systemsetups", "tLeftarrow", "tLeftrightarrow", "tRightarrow", "tableau", "tabulateautoline", "tabulateautorule", "tabulateline", "tabulaterule", "taggedctxcommand", "taggedlabeltexts", "tapebuffer", "tbinom", "tbox", "tequal", "testandsplitstring", "testcolumn", "testfeature", "testfeatureonce", "testpage", "testpageonly", "testpagesync", "testtokens", "tex", "texdefinition", "texsetup", "textcitation", "textcite", "textcontrolspace", "texteaide", "texteencadre", "textenotepdp", "textflowcollector", "textmath", "textminus", "textormathchar", "textplus", "textvisiblespace", "tfrac", "thainumerals", "thefirstcharacter", "thenormalizedbodyfontsize", "theremainingcharacters", "thickspace", "thinspace", "thirdoffivearguments", "thirdoffourarguments", "thirdofsixarguments", "thirdofthreearguments", "thirdofthreeunexpanded", "thookleftarrow", "thookrightarrow", "threedigitrounding", "tibetannumerals", "tightlayer", "tinyfont", "titre", "tlap", "tleftarrow", "tleftharpoondown", "tleftharpoonup", "tleftrightarrow", "tleftrightharpoons", "tmapsto", "tochar", "tolinenote", "topbox", "topleftbox", "toplinebox", "toprightbox", "topskippedbox", "tracecatcodetables", "tracedfontname", "traceoutputroutines", "tracepositions", "traduire", "traiteblocs", "traitfin", "traitsfins", "transparencycomponents", "transparent", "trel", "trightarrow", "trightharpoondown", "trightharpoonup", "trightleftharpoons", "trightoverleftarrow", "triplebond", "truefilename", "truefontname", "ttriplerel", "ttwoheadleftarrow", "ttwoheadrightarrow", "twodigitrounding", "tx", "txx", "typ", "typedefinedbuffer", "typeface", "typescriptone", "typescriptprefix", "typescriptthree", "typescripttwo", "typesetbuffer", "typesetfile", "uconvertnumber", "uedcatcodecommand", "undefinevalue", "undepthed", "underbar", "underbars", "underbartext", "underbrace", "underbracetext", "underbracket", "underbrackettext", "underdash", "underdashes", "underdot", "underdots", "underleftarrow", "underleftharpoondown", "underleftharpoonup", "underleftrightarrow", "underparent", "underparenttext", "underrandom", "underrandoms", "underrightarrow", "underrightharpoondown", "underrightharpoonup", "underset", "understrike", "understrikes", "undertwoheadleftarrow", "undertwoheadrightarrow", "undoassign", "uneligne", "unframed", "unhhbox", "unihex", "uniqueMPgraphic", "uniqueMPpagegraphic", "unprotected", "unregisterhyphenationpattern", "unspaceafter", "unspaceargument", "unspaced", "unspacestring", "untexargument", "untexcommand", "uppercased", "uppercasestring", "upperleftdoubleninequote", "upperleftdoublesixquote", "upperleftsingleninequote", "upperleftsinglesixquote", "upperrightdoubleninequote", "upperrightdoublesixquote", "upperrightsingleninequote", "upperrightsinglesixquote", "url", "useMPenvironmentbuffer", "useMPgraphic", "useMPlibrary", "useMPrun", "useMPvariables", "useblankparameter", "usebodyfont", "usebodyfontparameter", "usebtxdataset", "usebtxdefinitions", "usecolors", "usecomponent", "usedummycolorparameter", "usedummystyleandcolor", "usedummystyleparameter", "useenvironment", "useexternalrendering", "usefigurebase", "usefile", "usegridparameter", "useindentingparameter", "useindentnextparameter", "useinterlinespaceparameter", "uselanguageparameter", "useluamodule", "usemathstyleparameter", "useproduct", "useprofileparameter", "useproject", "usereferenceparameter", "userpagenumber", "usesetupsparameter", "usestaticMPfigure", "usesubpath", "usetexmodule", "usetypescript", "usetypescriptfile", "usezipfile", "utfchar", "utflower", "utfupper", "utiliseJSscripts", "utiliseURL", "utiliseblocs", "utilisechemin", "utilisedocumentexterne", "utilisefigureexterne", "utilisemodule", "utilisepsiteaudioexterne", "utilisesymboles", "utiliseurl", "utilityregisterlength", "va", "vaalaboite", "vaalapage", "vaenbas", "valeurcouleur", "vboxreference", "verbatim", "verbatimstring", "verbosenumber", "version", "verticalgrowingbar", "verticalpositionbar", "vglue", "vide", "viewerlayer", "vl", "vphantom", "vpos", "vsmash", "vsmashbox", "vsmashed", "vspace", "vspacing", "wdofstring", "widthofstring", "widthspanningtext", "withoutpt", "word", "words", "wordtonumber", "writedatatolist", "writestatus", "xLeftarrow", "xLeftrightarrow", "xRightarrow", "xdefconvertedargument", "xequal", "xfrac", "xhookleftarrow", "xhookrightarrow", "xleftarrow", "xleftharpoondown", "xleftharpoonup", "xleftrightarrow", "xleftrightharpoons", "xmapsto", "xmladdindex", "xmlafterdocumentsetup", "xmlaftersetup", "xmlall", "xmlappenddocumentsetup", "xmlappendsetup", "xmlapplyselectors", "xmlatt", "xmlattdef", "xmlattribute", "xmlattributedef", "xmlbadinclusions", "xmlbeforedocumentsetup", "xmlbeforesetup", "xmlchainatt", "xmlchainattdef", "xmlchecknamespace", "xmlcommand", "xmlconcat", "xmlconcatrange", "xmlcontext", "xmlcount", "xmldefaulttotext", "xmldirectives", "xmldirectivesafter", "xmldirectivesbefore", "xmldisplayverbatim", "xmldoif", "xmldoifelse", "xmldoifelseempty", "xmldoifelseselfempty", "xmldoifelsetext", "xmldoifelsevalue", "xmldoifnot", "xmldoifnotselfempty", "xmldoifnottext", "xmldoifselfempty", "xmldoiftext", "xmlelement", "xmlfilter", "xmlfirst", "xmlflush", "xmlflushcontext", "xmlflushdocumentsetups", "xmlflushlinewise", "xmlflushpure", "xmlflushspacewise", "xmlflushtext", "xmlinclude", "xmlinclusion", "xmlinclusions", "xmlinfo", "xmlinjector", "xmlinlineverbatim", "xmlinstalldirective", "xmllast", "xmllastatt", "xmllastmatch", "xmlloadbuffer", "xmlloaddata", "xmlloaddirectives", "xmlloadfile", "xmlloadonly", "xmlmain", "xmlmapvalue", "xmlname", "xmlnamespace", "xmlnonspace", "xmlpath", "xmlpos", "xmlposition", "xmlprependdocumentsetup", "xmlprependsetup", "xmlprettyprint", "xmlprocessbuffer", "xmlprocessdata", "xmlprocessfile", "xmlpure", "xmlraw", "xmlrefatt", "xmlregistereddocumentsetups", "xmlregisteredsetups", "xmlregisterns", "xmlremapname", "xmlremapnamespace", "xmlremovedocumentsetup", "xmlremovesetup", "xmlresetdocumentsetups", "xmlresetinjectors", "xmlresetsetups", "xmlsave", "xmlsetentity", "xmlsetfunction", "xmlsetinjectors", "xmlsetsetup", "xmlsetup", "xmlshow", "xmlsnippet", "xmlstrip", "xmlstripnolines", "xmlstripped", "xmlstrippednolines", "xmltag", "xmltexentity", "xmltext", "xmltobuffer", "xmltobufferverbose", "xmltofile", "xmlvalue", "xmlverbatim", "xrel", "xrightarrow", "xrightharpoondown", "xrightharpoonup", "xrightleftharpoons", "xrightoverleftarrow", "xsplitstring", "xtriplerel", "xtwoheadleftarrow", "xtwoheadrightarrow", "xxfrac", "xypos" }, - ["it"]={ "AMSTEX", "AfterPar", "Alphabeticnumerals", "AmSTeX", "And", "BeforePar", "Big", "Bigg", "Biggl", "Biggm", "Biggr", "Bigl", "Bigm", "Bigr", "CONTEXT", "Cap", "Caps", "ConTeXt", "Context", "ConvertConstantAfter", "ConvertToConstant", "ETEX", "EveryLine", "EveryPar", "GIORNOSETTIMANA", "GetPar", "GotoPar", "Greeknumerals", "INRSTEX", "LAMSTEX", "LATEX", "LUAJITTEX", "LUATEX", "LaTeX", "LamSTeX", "Lettera", "Lettere", "Lua", "LuaTeX", "LuajitTeX", "MESE", "METAFONT", "METAFUN", "METAPOST", "MKII", "MKIV", "MKIX", "MKVI", "MKXI", "MONTHLONG", "MONTHSHORT", "MPII", "MPIV", "MPVI", "MPanchor", "MPbetex", "MPc", "MPcode", "MPcolor", "MPcoloronly", "MPcolumn", "MPd", "MPdrawing", "MPfontsizehskip", "MPgetmultipars", "MPgetmultishape", "MPgetposboxes", "MPh", "MPinclusions", "MPleftskip", "MPll", "MPlr", "MPls", "MPmenubuttons", "MPn", "MPoptions", "MPoverlayanchor", "MPp", "MPpage", "MPpardata", "MPplus", "MPpos", "MPpositiongraphic", "MPposset", "MPr", "MPrawvar", "MPregion", "MPrest", "MPrightskip", "MPrs", "MPstring", "MPtext", "MPtransparency", "MPul", "MPur", "MPv", "MPvar", "MPvariable", "MPvv", "MPw", "MPwhd", "MPx", "MPxy", "MPxywhd", "MPy", "MetaFont", "MetaFun", "MetaPost", "NormalizeFontHeight", "NormalizeFontWidth", "NormalizeTextHeight", "NormalizeTextWidth", "Numeri", "Numeriromani", "PAROLA", "PAROLE", "PDFETEX", "PDFTEX", "PDFcolor", "PICTEX", "PPCHTEX", "PPCHTeX", "PRAGMA", "Parola", "Parole", "PiCTeX", "PointsToBigPoints", "PointsToReal", "PointsToWholeBigPoints", "PtToCm", "ReadFile", "ScaledPointsToBigPoints", "ScaledPointsToWholeBigPoints", "Smallcapped", "TABLE", "TEX", "TEXpage", "TaBlE", "TeX", "TheNormalizedFontSize", "TransparencyHack", "VerboseNumber", "WidthSpanningText", "XETEX", "XeTeX", "abjadnaivenumerals", "abjadnodotnumerals", "abjadnumerals", "activatespacehandler", "adaptcollector", "adaptfontfeature", "adaptpapersize", "adattacampo", "adattalayout", "addfeature", "addtoJSpreamble", "addtocommalist", "addvalue", "aftersplitstring", "aftertestandsplitstring", "al", "alignmentcharacter", "allinputpaths", "alphabeticnumerals", "alwayscitation", "alwayscite", "ambiente", "ampersand", "anchor", "ap", "apagina", "appendetoks", "appendgvalue", "appendtocommalist", "appendtoks", "appendtoksonce", "appendvalue", "apply", "applyalternativestyle", "applyprocessor", "applytocharacters", "applytofirstcharacter", "applytosplitstringchar", "applytosplitstringcharspaced", "applytosplitstringline", "applytosplitstringlinespaced", "applytosplitstringword", "applytosplitstringwordspaced", "applytowords", "arabicdecimals", "arabicexnumerals", "arabicnumerals", "arg", "argomento", "asciistr", "aside", "assignalfadimension", "assigndimen", "assigndimension", "assignifempty", "assigntranslation", "assignvalue", "assignwidth", "assumelongusagecs", "astype", "attachment", "autocap", "autodirhbox", "autodirvbox", "autodirvtop", "autoinsertnextspace", "automathematics", "autosetups", "availablehsize", "averagecharwidth", "backgroundimage", "backgroundimagefill", "backgroundline", "barracolori", "barrainterazione", "basegrid", "baselineleftbox", "baselinemiddlebox", "baselinerightbox", "bbox", "beforesplitstring", "beforetestandsplitstring", "big", "bigbodyfont", "bigg", "bigger", "biggl", "biggm", "biggr", "bigl", "bigm", "bigr", "bigskip", "binom", "bitmapimage", "blap", "bleed", "bleedheight", "bleedwidth", "blockligatures", "blockquote", "bodyfontenvironmentlist", "bodyfontsize", "bold", "boldface", "bolditalic", "boldslanted", "booleanmodevalue", "bottombox", "bottomleftbox", "bottomrightbox", "boxcursor", "boxmarker", "boxofsize", "boxreference", "bpos", "bthiddencitation", "btxabbreviatedjournal", "btxaddjournal", "btxalwayscitation", "btxauthorfield", "btxdetail", "btxdirect", "btxdoif", "btxdoifcombiinlistelse", "btxdoifelse", "btxdoifelsecombiinlist", "btxdoifelsesameasprevious", "btxdoifelsesameaspreviouschecked", "btxdoifelseuservariable", "btxdoifnot", "btxdoifsameaspreviouscheckedelse", "btxdoifsameaspreviouselse", "btxdoifuservariableelse", "btxexpandedjournal", "btxfield", "btxfieldname", "btxfieldtype", "btxfirstofrange", "btxflush", "btxflushauthor", "btxflushauthorinverted", "btxflushauthorinvertedshort", "btxflushauthorname", "btxflushauthornormal", "btxflushauthornormalshort", "btxflushsuffix", "btxfoundname", "btxfoundtype", "btxhybridcite", "btxlistcitation", "btxloadjournalist", "btxoneorrange", "btxremapauthor", "btxsavejournalist", "btxsetup", "btxsingularorplural", "btxsingularplural", "btxtextcitation", "calligraphic", "cambiaafontdeltesto", "camel", "campi", "cap", "capello", "capitolo", "capoverso", "catcodetablename", "cbox", "centerbox", "centeredbox", "centerednextbox", "cfrac", "chardescription", "charwidthlanguage", "checkcharacteralign", "checkedchar", "checkedfiller", "checkedstrippedcsname", "checkinjector", "checknextindentation", "checknextinjector", "checkpage", "checkparameters", "checkpreviousinjector", "checksoundtrack", "checktwopassdata", "checkvariables", "chemical", "chemicalbottext", "chemicalmidtext", "chemicalsymbol", "chemicaltext", "chemicaltoptext", "chim", "chineseallnumerals", "chinesecapnumerals", "chinesenumerals", "circondato", "citation", "citazione", "cite", "clap", "classfont", "cldcommand", "cldcontext", "cldloadfile", "cldprocessfile", "cleftarrow", "clip", "clonacampo", "collect", "collectedtext", "collectexpanded", "colonna", "colorcomponents", "colore", "colored", "coloregrigio", "coloronly", "columnbreak", "combinepages", "commalistelement", "commalistsentence", "commalistsize", "comment", "commento", "comparedimension", "comparedimensioneps", "completebtxrendering", "completelist", "completelistofpublications", "completelistofsorts", "completelistofsynonyms", "completeregister", "complexorsimple", "complexorsimpleempty", "componenet", "composedcollector", "composedlayer", "compresult", "confrontagruppocolori", "confrontatavolozza", "constantdimen", "constantdimenargument", "constantemptyargument", "constantnumber", "constantnumberargument", "contentreference", "continuednumber", "continueifinputfile", "convertargument", "convertcommand", "convertedcounter", "converteddimen", "convertedsubcounter", "convertinumero", "convertmonth", "convertvalue", "convertvboxtohbox", "copiacampo", "copypages", "copyparameters", "copyposition", "correggispaziobianco", "countersubs", "counttoken", "counttokens", "cramped", "crampedclap", "crampedllap", "crampedrlap", "crightarrow", "crightoverleftarrow", "ctop", "ctxcommand", "ctxdirectcommand", "ctxdirectlua", "ctxfunction", "ctxlatecommand", "ctxlatelua", "ctxloadluafile", "ctxlua", "ctxluabuffer", "ctxluacode", "ctxreport", "ctxsprint", "currentassignmentlistkey", "currentassignmentlistvalue", "currentbtxuservariable", "currentcommalistitem", "currentcomponent", "currentenvironment", "currentfeaturetest", "currentinterface", "currentlanguage", "currentlistentrydestinationattribute", "currentlistentrylimitedtext", "currentlistentrynumber", "currentlistentrypagenumber", "currentlistentryreferenceattribute", "currentlistentrytitle", "currentlistentrytitlerendered", "currentlistsymbol", "currentmainlanguage", "currentmessagetext", "currentmoduleparameter", "currentoutputstream", "currentproduct", "currentproject", "currentregime", "currentregisterpageuserdata", "currentresponses", "currenttime", "currentvalue", "currentxtablecolumn", "currentxtablerow", "da", "daqualcheparte", "data", "datadioggi", "datasetvariable", "dayoftheweek", "dayspermonth", "dbinom", "decrement", "decrementcounter", "decrementedcounter", "decrementpagenumber", "decrementsubpagenumber", "decrementvalue", "defaultinterface", "defaultobjectpage", "defaultobjectreference", "defcatcodecommand", "defconvertedargument", "defconvertedcommand", "defconvertedvalue", "defineMPinstance", "defineTABLEsetup", "defineactivecharacter", "definealternativestyle", "defineanchor", "defineattachment", "defineattribute", "definebackground", "definebar", "definebodyfontswitch", "definebreakpoint", "definebreakpoints", "definebtx", "definebtxdataset", "definebtxregister", "definebtxrendering", "definebutton", "definecapitals", "definecharacterkerning", "definecharacterspacing", "definechemical", "definechemicals", "definechemicalsymbol", "definecollector", "definecolumnbreak", "definecombination", "definecomment", "definecomplexorsimple", "definecomplexorsimpleempty", "defineconversionset", "definecounter", "definedataset", "definedelimitedtext", "definedfont", "defineeffect", "defineexpandable", "defineexternalfigure", "definefallbackfamily", "definefieldbody", "definefieldbodyset", "definefieldcategory", "definefileconstant", "definefilefallback", "definefilesynonym", "definefiller", "definefirstline", "definefittingpage", "definefontalternative", "definefontfallback", "definefontfamily", "definefontfamilypreset", "definefontfeature", "definefontfile", "definefontsize", "definefontsolution", "defineformula", "defineformulaalternative", "defineformulaframed", "defineframedcontent", "definefrozenfont", "defineglobalcolor", "definegraphictypesynonym", "definegridsnapping", "defineheadalternative", "definehelp", "definehigh", "definehighlight", "definehspace", "definehypenationfeatures", "defineindentedtext", "defineindenting", "defineinitial", "defineinsertion", "defineinteraction", "defineinteractionbar", "defineinterfaceconstant", "defineinterfaceelement", "defineinterfacevariable", "defineinterlinespace", "defineintermediatecolor", "defineitemgroup", "defineitems", "definelabelclass", "definelayer", "definelayerpreset", "definelinefiller", "definelinenote", "definelinenumbering", "definelines", "definelistalternative", "definelistextra", "definelow", "definelowhigh", "definelowmidhigh", "definemarginblock", "definemargindata", "definemarker", "definemathalignment", "definemathcases", "definemathcommand", "definemathdoubleextensible", "definemathematics", "definemathextensible", "definemathfence", "definemathfraction", "definemathframed", "definemathmatrix", "definemathornament", "definemathoverextensible", "definemathovertextextensible", "definemathradical", "definemathstackers", "definemathstyle", "definemathtriplet", "definemathunderextensible", "definemathundertextextensible", "definemathunstacked", "definemeasure", "definemessageconstant", "definemixedcolumns", "definemode", "definemultitonecolor", "definenamedcolor", "definenamespace", "definenarrower", "definenote", "defineornament", "defineoutputroutine", "defineoutputroutinecommand", "definepage", "definepagebreak", "definepagechecker", "definepagegrid", "definepagegridarea", "definepagegridspan", "definepageinjection", "definepageinjectionalternative", "definepageshift", "definepagestate", "definepairedbox", "defineparagraph", "defineparallel", "defineparbuilder", "defineplacement", "definepositioning", "defineprefixset", "defineprocesscolor", "defineprocessor", "definepushbutton", "definepushsymbol", "definerenderingwindow", "defineresetset", "definescale", "definescript", "definesectionlevels", "defineselector", "defineseparatorset", "defineshift", "definesidebar", "definesort", "definespotcolor", "definestyleinstance", "definesubformula", "definesynonym", "definesystemattribute", "definesystemconstant", "definesystemvariable", "definetabulation", "definetextbackground", "definetextflow", "definetooltip", "definetransparency", "definetwopasslist", "definetypeface", "definetypescriptprefix", "definetypescriptsynonym", "definetypesetting", "defineunit", "defineviewerlayer", "definevspace", "definevspacing", "definevspacingamount", "definextable", "definisci", "definisciambientefontdeltesto", "definisciblocco", "definiscibloccosezione", "definiscibuffer", "definiscicampo", "definiscicapoversi", "definiscicolore", "definisciconversione", "definiscidescrizione", "definiscidimensionicarta", "definiscielenco", "definiscielencocombinato", "definiscienumerazione", "definiscietichetta", "definiscifigurasimbolo", "definiscifont", "definiscifontdeltesto", "definisciformatoriferimento", "definiscigruppocolori", "definiscihbox", "definisciincorniciato", "definisciiniziatermina", "definiscilayout", "definiscimakeup", "definiscimarcatura", "definiscimenuinterazione", "definiscimodellotabella", "definiscioggettomobile", "definisciordinamento", "definisciprofilo", "definisciprogramma", "definisciregistro", "definisciriferimento", "definiscisezione", "definiscisimbolo", "definiscisinonimi", "definiscisinonimofont", "definiscisottocampo", "definiscisovrapposizione", "definiscistackcampi", "definiscistile", "definiscistilefont", "definiscitabulato", "definiscitavolozza", "definiscitesta", "definiscitesto", "definiscitestoincorniciato", "definiscitype", "definiscityping", "delimited", "delimitedtext", "depthofstring", "depthonlybox", "depthspanningtext", "determinacaratteristicheregistro", "determinacarattersticheelenco", "determinanumerotesta", "determinenoflines", "devanagarinumerals", "dfrac", "digits", "dimensiontocount", "directcolor", "directcolored", "directconvertedcounter", "directdummyparameter", "directgetboxllx", "directgetboxlly", "directhighlight", "directlocalframed", "directluacode", "directselect", "directsetbar", "directsetup", "directsymbol", "directvspacing", "dis", "disabledirectives", "disableexperiments", "disablemode", "disableoutputstream", "disableparpositions", "disableregime", "disabletrackers", "displaymath", "displaymathematics", "displaymessage", "distributedhsize", "dividedsize", "doadaptleftskip", "doadaptrightskip", "doaddfeature", "doassign", "doassignempty", "doboundtext", "docheckassignment", "docheckedpagestate", "docheckedpair", "documentvariable", "dodoubleargument", "dodoubleargumentwithset", "dodoubleempty", "dodoubleemptywithset", "dodoublegroupempty", "doeassign", "doexpandedrecurse", "dogetattribute", "dogetattributeid", "dogetcommacommandelement", "dogobbledoubleempty", "dogobblesingleempty", "doif", "doifMPgraphicelse", "doifallcommon", "doifallcommonelse", "doifalldefinedelse", "doifallmodes", "doifallmodeselse", "doifassignmentelse", "doifblackelse", "doifbothsides", "doifbothsidesoverruled", "doifboxelse", "doifbufferelse", "doifcolor", "doifcolorelse", "doifcommandhandler", "doifcommandhandlerelse", "doifcommon", "doifcommonelse", "doifcontent", "doifconversiondefinedelse", "doifconversionnumberelse", "doifcounter", "doifcounterelse", "doifcurrentfonthasfeatureelse", "doifdefined", "doifdefinedcounter", "doifdefinedcounterelse", "doifdefinedelse", "doifdimensionelse", "doifdimenstringelse", "doifdocumentargument", "doifdocumentargumentelse", "doifdocumentfilename", "doifdocumentfilenameelse", "doifdrawingblackelse", "doifelse", "doifelseMPgraphic", "doifelseallcommon", "doifelsealldefined", "doifelseallmodes", "doifelseassignment", "doifelseblack", "doifelsebox", "doifelsebuffer", "doifelsecolor", "doifelsecommandhandler", "doifelsecommon", "doifelseconversiondefined", "doifelseconversionnumber", "doifelsecounter", "doifelsecurrentfonthasfeature", "doifelsecurrentsortingused", "doifelsecurrentsynonymshown", "doifelsecurrentsynonymused", "doifelsedefined", "doifelsedefinedcounter", "doifelsedimension", "doifelsedimenstring", "doifelsedocumentargument", "doifelsedocumentfilename", "doifelsedrawingblack", "doifelseempty", "doifelseemptyvalue", "doifelseemptyvariable", "doifelseenv", "doifelsefastoptionalcheck", "doifelsefastoptionalcheckcs", "doifelsefieldbody", "doifelsefieldcategory", "doifelsefigure", "doifelsefile", "doifelsefiledefined", "doifelsefileexists", "doifelsefirstchar", "doifelseflagged", "doifelsefontchar", "doifelsefontpresent", "doifelsefontsynonym", "doifelsehasspace", "doifelsehelp", "doifelseincsname", "doifelseinelement", "doifelseinputfile", "doifelseinsertion", "doifelseinset", "doifelseinstring", "doifelseinsymbolset", "doifelseintoks", "doifelseintwopassdata", "doifelseitalic", "doifelselanguage", "doifelselayerdata", "doifelselayoutdefined", "doifelselayoutsomeline", "doifelselayouttextline", "doifelseleapyear", "doifelselist", "doifelselocation", "doifelselocfile", "doifelsemainfloatbody", "doifelsemarking", "doifelsemeaning", "doifelsemessage", "doifelsemode", "doifelsenextbgroup", "doifelsenextbgroupcs", "doifelsenextchar", "doifelsenextoptional", "doifelsenextoptionalcs", "doifelsenextparenthesis", "doifelsenonzeropositive", "doifelsenoteonsamepage", "doifelsenothing", "doifelsenumber", "doifelseobjectfound", "doifelseobjectreferencefound", "doifelseoddpage", "doifelseoddpagefloat", "doifelseoldercontext", "doifelseolderversion", "doifelseoverlapping", "doifelseoverlay", "doifelseparallel", "doifelseparentfile", "doifelsepath", "doifelsepathexists", "doifelsepatterns", "doifelseposition", "doifelsepositionaction", "doifelsepositiononpage", "doifelsepositionsonsamepage", "doifelsepositionsonthispage", "doifelsepositionsused", "doifelsereferencefound", "doifelserightpagefloat", "doifelserighttoleftinbox", "doifelsesamelinereference", "doifelsesamestring", "doifelsesetups", "doifelsesomebackground", "doifelsesomespace", "doifelsesomething", "doifelsesometoks", "doifelsestringinstring", "doifelsestructurelisthasnumber", "doifelsestructurelisthaspage", "doifelsesymboldefined", "doifelsesymbolset", "doifelsetext", "doifelsetextflow", "doifelsetextflowcollector", "doifelsetypingfile", "doifelseundefined", "doifelseurldefined", "doifelsevalue", "doifelsevaluenothing", "doifelsevariable", "doifempty", "doifemptyelse", "doifemptytoks", "doifemptyvalue", "doifemptyvalueelse", "doifemptyvariable", "doifemptyvariableelse", "doifenv", "doifenvelse", "doiffastoptionalcheckcselse", "doiffastoptionalcheckelse", "doiffieldbodyelse", "doiffieldcategoryelse", "doiffigureelse", "doiffile", "doiffiledefinedelse", "doiffileelse", "doiffileexistselse", "doiffirstcharelse", "doifflaggedelse", "doiffontcharelse", "doiffontpresentelse", "doiffontsynonymelse", "doifhasspaceelse", "doifhelpelse", "doifincsnameelse", "doifinelementelse", "doifinputfileelse", "doifinsertionelse", "doifinset", "doifinsetelse", "doifinstring", "doifinstringelse", "doifinsymbolset", "doifinsymbolsetelse", "doifintokselse", "doifintwopassdataelse", "doifitalicelse", "doiflanguageelse", "doiflayerdataelse", "doiflayoutdefinedelse", "doiflayoutsomelineelse", "doiflayouttextlineelse", "doifleapyearelse", "doiflistelse", "doiflocationelse", "doiflocfileelse", "doifmainfloatbodyelse", "doifmarkingelse", "doifmeaningelse", "doifmessageelse", "doifmode", "doifmodeelse", "doifnextbgroupcselse", "doifnextbgroupelse", "doifnextcharelse", "doifnextoptionalcselse", "doifnextoptionalelse", "doifnextparenthesiselse", "doifnonzeropositiveelse", "doifnot", "doifnotallcommon", "doifnotallmodes", "doifnotcommandhandler", "doifnotcommon", "doifnotcounter", "doifnotdocumentargument", "doifnotdocumentfilename", "doifnotempty", "doifnotemptyvalue", "doifnotemptyvariable", "doifnotenv", "doifnoteonsamepageelse", "doifnotescollected", "doifnotfile", "doifnotflagged", "doifnothing", "doifnothingelse", "doifnotinset", "doifnotinsidesplitfloat", "doifnotinstring", "doifnotmode", "doifnotnumber", "doifnotsamestring", "doifnotsetups", "doifnotvalue", "doifnotvariable", "doifnumber", "doifnumberelse", "doifobjectfoundelse", "doifobjectreferencefoundelse", "doifoddpageelse", "doifoddpagefloatelse", "doifoldercontextelse", "doifolderversionelse", "doifoverlappingelse", "doifoverlayelse", "doifparallelelse", "doifparentfileelse", "doifpathelse", "doifpathexistselse", "doifpatternselse", "doifposition", "doifpositionaction", "doifpositionactionelse", "doifpositionelse", "doifpositiononpageelse", "doifpositionsonsamepageelse", "doifpositionsonthispageelse", "doifpositionsusedelse", "doifreferencefoundelse", "doifrightpagefloatelse", "doifrighttoleftinboxelse", "doifsamelinereferenceelse", "doifsamestring", "doifsamestringelse", "doifsetups", "doifsetupselse", "doifsomebackground", "doifsomebackgroundelse", "doifsomespaceelse", "doifsomething", "doifsomethingelse", "doifsometoks", "doifsometokselse", "doifstringinstringelse", "doifstructurelisthasnumberelse", "doifstructurelisthaspageelse", "doifsymboldefinedelse", "doifsymbolsetelse", "doiftext", "doiftextelse", "doiftextflowcollectorelse", "doiftextflowelse", "doiftypingfileelse", "doifundefined", "doifundefinedcounter", "doifundefinedelse", "doifurldefinedelse", "doifvalue", "doifvalueelse", "doifvaluenothing", "doifvaluenothingelse", "doifvaluesomething", "doifvariable", "doifvariableelse", "doindentation", "dollar", "doloop", "doloopoverlist", "donothing", "dontconvertfont", "dontleavehmode", "dontpermitspacesbetweengroups", "dopositionaction", "doprocesslocalsetups", "doquadrupleargument", "doquadrupleempty", "doquadruplegroupempty", "doquintupleargument", "doquintupleempty", "doquintuplegroupempty", "dorechecknextindentation", "dorecurse", "dorepeatwithcommand", "doreplacefeature", "doresetandafffeature", "doresetattribute", "dorotatebox", "dosetattribute", "dosetleftskipadaption", "dosetrightskipadaption", "dosetupcheckedinterlinespace", "doseventupleargument", "doseventupleempty", "dosingleargument", "dosingleempty", "dosinglegroupempty", "dosixtupleargument", "dosixtupleempty", "dostepwiserecurse", "dosubtractfeature", "dotfskip", "dotoks", "dotripleargument", "dotripleargumentwithset", "dotripleempty", "dotripleemptywithset", "dotriplegroupempty", "doublebar", "doublebond", "doublebrace", "doublebracket", "doubleparent", "dowith", "dowithnextbox", "dowithnextboxcontent", "dowithnextboxcontentcs", "dowithnextboxcs", "dowithpargument", "dowithrange", "dowithwargument", "dpofstring", "dummydigit", "dummyparameter", "eTeX", "edefconvertedargument", "efcmaxheight", "efcmaxwidth", "efcminheight", "efcminwidth", "efcparameter", "effect", "elaborablocchi", "elapsedseconds", "elapsedtime", "eleftarrowfill", "eleftharpoondownfill", "eleftharpoonupfill", "eleftrightarrowfill", "elementi", "elemento", "elenco", "emphasisboldface", "emphasistypeface", "emptylines", "emspace", "enabledirectives", "enableexperiments", "enablemode", "enableoutputstream", "enableparpositions", "enableregime", "enabletrackers", "enskip", "enspace", "env", "envvar", "eoverbarfill", "eoverbracefill", "eoverbracketfill", "eoverparentfill", "epos", "equaldigits", "erightarrowfill", "erightharpoondownfill", "erightharpoonupfill", "etwoheadrightarrowfill", "eunderbarfill", "eunderbracefill", "eunderbracketfill", "eunderparentfill", "executeifdefined", "exitloop", "exitloopnow", "expandcheckedcsname", "expanded", "expandfontsynonym", "externalfigurecollectionmaxheight", "externalfigurecollectionmaxwidth", "externalfigurecollectionminheight", "externalfigurecollectionminwidth", "externalfigurecollectionparameter", "fakebox", "fastdecrement", "fastincrement", "fastlocalframed", "fastscale", "fastsetup", "fastsetupwithargument", "fastsetupwithargumentswapped", "fastswitchtobodyfont", "fastsxsy", "feature", "fence", "fenced", "fetchallmarkings", "fetchallmarks", "fetchmark", "fetchmarking", "fetchonemark", "fetchonemarking", "fetchruntinecommand", "fetchtwomarkings", "fetchtwomarks", "fieldbody", "fifthoffivearguments", "fifthofsixarguments", "figura", "figuraesterna", "figurefilename", "figurefilepath", "figurefiletype", "figurefullname", "figureheight", "figurenaturalheight", "figurenaturalwidth", "figuresymbol", "figurewidth", "filename", "filledhboxb", "filledhboxc", "filledhboxg", "filledhboxk", "filledhboxm", "filledhboxr", "filledhboxy", "filler", "filterfromnext", "filterfromvalue", "filterpages", "filterreference", "findtwopassdata", "finishregisterentry", "firstcharacter", "firstcounter", "firstcountervalue", "firstoffivearguments", "firstoffourarguments", "firstofoneargument", "firstofoneunexpanded", "firstofsixarguments", "firstofthreearguments", "firstofthreeunexpanded", "firstoftwoarguments", "firstoftwounexpanded", "firstrealpage", "firstrealpagenumber", "firstsubcountervalue", "firstsubpage", "firstsubpagenumber", "firstuserpage", "firstuserpagenumber", "fitfieldframed", "fittopbaselinegrid", "flag", "floatuserdataparameter", "flushboxregister", "flushcollector", "flushlayer", "flushlocalfloats", "flushnextbox", "flushnotes", "flushoutputstream", "flushshapebox", "flushtextflow", "flushtokens", "flushtoks", "fontalternative", "fontbody", "fontchar", "fontcharbyindex", "fontclass", "fontclassname", "fontface", "fontfeaturelist", "fontsize", "fontstyle", "forcecharacterstripping", "forcelocalfloats", "forgeteverypar", "forgetparameters", "formula", "foundbox", "fourthoffivearguments", "fourthoffourarguments", "fourthofsixarguments", "frac", "frameddimension", "framedparameter", "framedtext", "freezedimenmacro", "freezemeasure", "frenchspacing", "fromlinenote", "frozenhbox", "gdefconvertedargument", "gdefconvertedcommand", "getMPdrawing", "getMPlayer", "getboxllx", "getboxlly", "getbufferdata", "getcommacommandsize", "getcommalistsize", "getdayoftheweek", "getdayspermonth", "getdefinedbuffer", "getdocumentargument", "getdocumentargumentdefault", "getdocumentfilename", "getdummyparameters", "getemptyparameters", "geteparameters", "getexpandedparameters", "getfiguredimensions", "getfirstcharacter", "getfirsttwopassdata", "getfromcommacommand", "getfromcommalist", "getfromtwopassdata", "getglyphdirect", "getglyphstyled", "getgparameters", "getlasttwopassdata", "getlocalfloat", "getlocalfloats", "getmessage", "getnamedglyphdirect", "getnamedglyphstyled", "getnamedtwopassdatalist", "getnaturaldimensions", "getnoflines", "getobject", "getobjectdimensions", "getpaletsize", "getparameters", "getprivatechar", "getprivateslot", "getrandomcount", "getrandomdimen", "getrandomfloat", "getrandomnumber", "getrandomseed", "getraweparameters", "getrawgparameters", "getrawnoflines", "getrawparameters", "getrawxparameters", "getreference", "getreferenceentry", "getroundednoflines", "getsubstring", "gettwopassdata", "gettwopassdatalist", "getuvalue", "getvalue", "getvariable", "getvariabledefault", "getxparameters", "giornosettimana", "globaldisablemode", "globalenablemode", "globalletempty", "globalpopbox", "globalpopmacro", "globalpreventmode", "globalprocesscommalist", "globalpushbox", "globalpushmacro", "globalswapcounts", "globalswapdimens", "globalswapmacros", "globalundefine", "glyphfontfile", "gobbledoubleempty", "gobbleeightarguments", "gobblefivearguments", "gobblefiveoptionals", "gobblefourarguments", "gobblefouroptionals", "gobbleninearguments", "gobbleoneargument", "gobbleoneoptional", "gobblesevenarguments", "gobblesingleempty", "gobblesixarguments", "gobblespacetokens", "gobbletenarguments", "gobblethreearguments", "gobblethreeoptionals", "gobbletwoarguments", "gobbletwooptionals", "gobbleuntil", "gobbleuntilrelax", "grabbufferdata", "grabbufferdatadirect", "grabuntil", "grafico", "grayvalue", "greedysplitstring", "greeknumerals", "griglia", "groupedcommand", "gsetboxllx", "gsetboxlly", "gujaratinumerals", "gurmurkhinumerals", "hairspace", "halfwaybox", "handletokens", "handwritten", "hash", "hboxofvbox", "hboxreference", "hdofstring", "headhbox", "headnumbercontent", "headnumberdistance", "headnumberwidth", "headreferenceattributes", "headsetupspacing", "headtextcontent", "headtextdistance", "headtextwidth", "headvbox", "headwidth", "heightanddepthofstring", "heightofstring", "heightspanningtext", "helptext", "hglue", "hiddenbar", "hiddencitation", "hiddencite", "highlight", "highordinalstr", "hilo", "himilo", "hl", "horizontalgrowingbar", "horizontalpositionbar", "hphantom", "hpos", "hsizefraction", "hsmash", "hsmashbox", "hsmashed", "hspace", "htdpofstring", "htofstring", "hyphen", "hyphenatedcoloredword", "hyphenatedfile", "hyphenatedfilename", "hyphenatedhbox", "hyphenatedpar", "hyphenatedurl", "hyphenatedword", "ibox", "ifassignment", "iff", "ifinobject", "ifinoutputstream", "ifparameters", "iftrialtypesetting", "ignoreimplicitspaces", "ignorevalue", "ignoto", "immediatesavetwopassdata", "impliedby", "implies", "impostaampiezzariga", "impostabarrainterazione", "impostablocco", "impostabloccosezione", "impostabuffer", "impostacampi", "impostacampo", "impostacapoversi", "impostacaption", "impostacima", "impostaclippling", "impostacolonne", "impostacolore", "impostacolori", "impostacommento", "impostacommentopagina", "impostadimensionicarta", "impostaelementi", "impostaelencazioni", "impostaelenco", "impostaelencocombinato", "impostafondo", "impostafontdeltesto", "impostaforms", "impostaincorniciato", "impostainiziatermina", "impostainstestazione", "impostainterazione", "impostainterlinea", "impostalayout", "impostalineemargine", "impostalineenere", "impostalineeriempimento", "impostalineesottili", "impostalineetesto", "impostalingua", "impostamaiuscole", "impostamakeup", "impostamarcatura", "impostamenuinterazione", "impostamenzione", "impostanumerazionecapoversi", "impostanumerazionepagina", "impostanumerazionerighe", "impostanumeropagina", "impostanumerosottopagina", "impostanumerotesta", "impostaoggettomobile", "impostaordinamento", "impostaparranging", "impostapdp", "impostapiustretto", "impostaposizionamento", "impostaposizionamentoopposti", "impostaprogrammi", "impostaregistro", "impostarientro", "impostariferimento", "impostarighe", "impostarigheriempimento", "impostarigovuoto", "impostarotazione", "impostaschermointerazione", "impostasegnosillabazione", "impostasetsimboli", "impostasfondi", "impostasfondo", "impostasinonimi", "impostaspaziatura", "impostaspaziobianco", "impostaspezzamentooggettomobile", "impostatabelle", "impostatabulato", "impostatavolozza", "impostatesta", "impostateste", "impostatesticima", "impostatestifondo", "impostatestiintestazioni", "impostatestipdp", "impostatesto", "impostatestotesti", "impostatolleranza", "impostatransizionepagina", "impostatype", "impostatyping", "impostaurl", "in", "includemenu", "includeversioninfo", "incorniciato", "increment", "incrementcounter", "incrementedcounter", "incrementpagenumber", "incrementsubpagenumber", "incrementvalue", "indentation", "infofont", "infofontbold", "inheritparameter", "inhibitblank", "initializeboxstack", "iniziaJScode", "iniziaJSpreamble", "iniziaMPclip", "iniziaMPcode", "iniziaMPdefinitions", "iniziaMPdrawing", "iniziaMPenvironment", "iniziaMPextensions", "iniziaMPinclusions", "iniziaMPinitializations", "iniziaMPpage", "iniziaMPpositiongraphic", "iniziaMPpositionmethod", "iniziaMPrun", "iniziaTABLE", "iniziaTABLEbody", "iniziaTABLEfoot", "iniziaTABLEhead", "iniziaTABLEnext", "iniziaTC", "iniziaTD", "iniziaTDs", "iniziaTEXpage", "iniziaTH", "iniziaTN", "iniziaTR", "iniziaTRs", "iniziaTX", "iniziaTY", "iniziaallmodes", "iniziaambiente", "iniziaargomento", "iniziaarrangedpages", "iniziaaside", "iniziaattachment", "iniziabar", "iniziabinom", "iniziabitmapimage", "iniziablockquote", "iniziabtxrenderingdefinitions", "iniziabuffer", "iniziabutton", "iniziacapitolo", "iniziacapoverso", "iniziacatcodetable", "iniziacharacteralign", "iniziacheckedfences", "iniziachemical", "iniziacitazione", "iniziacollect", "iniziacollecting", "iniziacolore", "iniziacolorintent", "iniziacoloronly", "iniziacolorset", "iniziacolumns", "iniziacolumnspan", "iniziacombination", "iniziacomment", "iniziacommento", "iniziacomponenet", "iniziacontextcode", "iniziacontextdefinitioncode", "iniziactxfunction", "iniziactxfunctiondefinition", "iniziacurrentcolor", "iniziacurrentlistentrywrapper", "iniziadbinom", "iniziadelimited", "iniziadelimitedtext", "iniziadfrac", "iniziadisplaymath", "iniziadmath", "iniziadocument", "iniziaeffect", "iniziaelement", "iniziaelemento", "iniziaelenco", "iniziaembeddedxtable", "iniziaendofline", "iniziaexceptions", "iniziaexpanded", "iniziaexpandedcollect", "iniziaextendedcatcodetable", "iniziaexternalfigurecollection", "iniziafigura", "iniziafigure", "iniziafitfieldframed", "iniziafittingpage", "iniziafloatcombination", "iniziafont", "iniziafontclass", "iniziafontsolution", "iniziaformula", "iniziaformulas", "iniziafrac", "iniziaframedcontent", "iniziaframedtext", "iniziagrafico", "iniziagridsnapping", "iniziahbox", "iniziahboxestohbox", "iniziahboxregister", "iniziahelptext", "iniziahiddenbar", "iniziahiding", "iniziahighlight", "iniziahyphenation", "iniziaimath", "iniziaimpaccato", "iniziaincorniciato", "iniziaindentation", "iniziaindentedtext", "iniziainmframed", "iniziainteraction", "iniziainterface", "iniziaintermezzo", "iniziaintertext", "iniziaitemgroup", "iniziaknockout", "inizialayout", "inizialineamargine", "inizialineatesto", "inizialinecorrection", "inizialinefiller", "inizialinenumbering", "inizialinetable", "inizialinetablebody", "inizialinetablecell", "inizialinetablehead", "inizialocalfootnotes", "inizialocalheadsetup", "inizialocallinecorrection", "inizialocalnotes", "inizialocalsetups", "inizialua", "inizialuacode", "inizialuaparameterset", "inizialuasetups", "iniziamakeup", "iniziamarginblock", "iniziamarkedcontent", "iniziamathmode", "iniziamathstyle", "iniziamatrices", "iniziamcframed", "iniziamdformula", "iniziamenuinterattivo", "iniziamenzione", "iniziamettiformula", "iniziamframed", "iniziamixedcolumns", "iniziamode", "iniziamodeset", "iniziamodule", "iniziamoduletestsection", "iniziampformula", "inizianamedsection", "inizianamedsubformulas", "inizianarrow", "inizianarrower", "inizianegative", "inizianicelyfilledbox", "inizianobar", "inizianointerference", "inizianotallmodes", "inizianotext", "inizianotmode", "iniziaopposite", "iniziaoutputstream", "iniziaoverlay", "iniziaoverprint", "iniziapagecomment", "iniziapagefigure", "iniziapagegrid", "iniziapagegridspan", "iniziapagelayout", "iniziapar", "iniziaparagraph", "iniziaparagraphs", "iniziaparagraphscell", "iniziaparbuilder", "iniziapath", "iniziaplacepairedbox", "iniziapositioning", "iniziapositionoverlay", "iniziapositive", "iniziapostponing", "iniziaprocessassignmentcommand", "iniziaprocessassignmentlist", "iniziaprocesscommacommand", "iniziaprocesscommalist", "iniziaprodotto", "iniziaprogetto", "iniziaprotect", "iniziaprotectedcolors", "iniziapubblicazione", "iniziapunctuation", "iniziarandomized", "iniziarandomseed", "iniziarawsetups", "iniziareadingfile", "iniziareferenceprefix", "iniziaregime", "iniziareusableMPgraphic", "iniziariga", "iniziasbarrati", "iniziasbarrato", "iniziascript", "iniziasdformula", "iniziasectionblock", "iniziasectionblockenvironment", "iniziasectionlevel", "iniziasetups", "iniziasfondo", "iniziasfrac", "iniziashapebox", "iniziashift", "iniziasidebar", "iniziasimplecolumns", "iniziasopralinea", "iniziasopralinee", "iniziasottoargomento", "iniziasottocapoverso", "iniziasottolinea", "iniziasottolinee", "iniziasottosottoargomento", "iniziasottosottocapoverso", "iniziasottosottosottoargomento", "iniziasottosottosottocapoverso", "iniziasottosottosottosottoargomento", "iniziasottosottosottosottocapoverso", "iniziaspecialitem", "iniziaspeech", "iniziaspformula", "iniziaspread", "iniziastartstop", "iniziastaticMPfigure", "iniziastaticMPgraphic", "iniziastrictinspectnextcharacter", "iniziastrut", "iniziastyle", "iniziasubformulas", "iniziasubjectlevel", "iniziasubsentence", "iniziasubstack", "iniziasymbolset", "iniziatabella", "iniziatable", "iniziatablehead", "iniziatables", "iniziatabletail", "iniziatabulate", "iniziatabulatehead", "iniziatabulatetail", "iniziatagged", "iniziatbinom", "iniziatesta", "iniziatestoaiuto", "iniziatestoincorniciato", "iniziatexcode", "iniziatexdefinition", "iniziatext", "iniziatextbackground", "iniziatextbackgroundmanual", "iniziatextcolor", "iniziatextcolorintent", "iniziatextflow", "iniziatitolo", "iniziatokens", "iniziatransparent", "iniziatypescript", "iniziatypescriptcollection", "iniziaunderdash", "iniziaunderdashes", "iniziaunderdot", "iniziaunderdots", "iniziaunderrandom", "iniziaunderrandoms", "iniziaunderstrike", "iniziaunderstrikes", "iniziaunframed", "iniziauniqueMPgraphic", "iniziauniqueMPpagegraphic", "iniziaunpacked", "iniziausableMPgraphic", "iniziauseMPgraphic", "iniziausemathstyleparameter", "iniziausingbtxspecification", "iniziavaia", "iniziavbox", "iniziavboxregister", "iniziavboxtohbox", "iniziavboxtohboxseparator", "iniziaviewerlayer", "iniziavtop", "iniziavtopregister", "iniziaxcell", "iniziaxcellgroup", "iniziaxfrac", "iniziaxgroup", "iniziaxmldisplayverbatim", "iniziaxmlinlineverbatim", "iniziaxmlraw", "iniziaxmlsetups", "iniziaxrow", "iniziaxrowgroup", "iniziaxtable", "iniziaxtablebody", "iniziaxtablefoot", "iniziaxtablehead", "iniziaxtablenext", "iniziaxxfrac", "inlinebuffer", "inlinedbox", "inlinemath", "inlinemathematics", "inlinemessage", "inlineordisplaymath", "inlinerange", "inmaframed", "innerflushshapebox", "input", "inputfilebarename", "inputfilename", "inputfilerealsuffix", "inputfilesuffix", "inputgivenfile", "inriga", "insertpages", "installactionhandler", "installactivecharacter", "installalingua", "installanddefineactivecharacter", "installattributestack", "installautocommandhandler", "installautosetuphandler", "installbasicautosetuphandler", "installbasicparameterhandler", "installbottomframerenderer", "installcommandhandler", "installcorenamespace", "installdefinehandler", "installdefinitionset", "installdefinitionsetmember", "installdirectcommandhandler", "installdirectparameterhandler", "installdirectparametersethandler", "installdirectsetuphandler", "installdirectstyleandcolorhandler", "installframedautocommandhandler", "installframedcommandhandler", "installleftframerenderer", "installnamespace", "installoutputroutine", "installpagearrangement", "installparameterhandler", "installparameterhashhandler", "installparametersethandler", "installparentinjector", "installrightframerenderer", "installrootparameterhandler", "installsetuphandler", "installsetuponlycommandhandler", "installshipoutmethod", "installsimplecommandhandler", "installsimpleframedcommandhandler", "installstyleandcolorhandler", "installswitchcommandhandler", "installswitchsetuphandler", "installtexdirective", "installtextracker", "installtopframerenderer", "installunitsseparator", "installunitsspace", "installversioninfo", "integerrounding", "intermezzo", "intertext", "intorno", "invokepageheandler", "istltdir", "istrtdir", "italic", "italicbold", "italiccorrection", "itemtag", "jobfilename", "jobfilesuffix", "kap", "keeplinestogether", "keepunwantedspaces", "kerncharacters", "koreancirclenumerals", "koreannumerals", "koreannumeralsc", "koreannumeralsp", "koreanparentnumerals", "languageCharacters", "languagecharacters", "languagecharwidth", "lastcounter", "lastcountervalue", "lastdigit", "lastlinewidth", "lastnaturalboxdp", "lastnaturalboxht", "lastnaturalboxwd", "lastpredefinedsymbol", "lastrealpage", "lastrealpagenumber", "lastsubcountervalue", "lastsubpage", "lastsubpagenumber", "lasttwodigits", "lastuserpage", "lastuserpagenumber", "lateluacode", "layeredtext", "layerheight", "layerwidth", "lazysavetaggedtwopassdata", "lazysavetwopassdata", "lbox", "left", "leftbottombox", "leftbox", "lefthbox", "leftorrighthbox", "leftorrightvbox", "leftorrightvtop", "leftskipadaption", "leftsubguillemot", "lefttopbox", "lefttorighthbox", "lefttorightvbox", "lefttorightvtop", "letbeundefined", "letcatcodecommand", "letcscsname", "letcsnamecs", "letcsnamecsname", "letdummyparameter", "letempty", "letgvalue", "letgvalueempty", "letgvalurelax", "lettera", "letterampersand", "letterat", "letterbackslash", "letterbar", "letterbgroup", "letterclosebrace", "lettercolon", "letterdollar", "letterdoublequote", "lettere", "letteregroup", "letterescape", "letterexclamationmark", "letterhash", "letterhat", "letterleftbrace", "letterless", "lettermore", "letteropenbrace", "letterpercent", "letterquestionmark", "letterrightbrace", "lettersinglequote", "letterslash", "letterspacing", "lettertilde", "letterunderscore", "letvalue", "letvalueempty", "letvaluerelax", "lfence", "lhbox", "limitatelines", "limitatetext", "limtatefirstline", "lineanera", "lineasottile", "lineatesto", "lineenere", "lineeriempimento", "lineesottili", "linespanningtext", "lingua", "linguaprincipale", "listcitation", "listcite", "listnamespaces", "llap", "loadanyfile", "loadanyfileonce", "loadbtxdefinitionfile", "loadbtxreplacementfile", "loadcldfile", "loadcldfileonce", "loadfontgoodies", "loadluafile", "loadluafileonce", "loadspellchecklist", "loadtexfile", "loadtexfileonce", "loadtypescriptfile", "localframed", "localframedwithsettings", "localhsize", "localpopbox", "localpopmacro", "localpushbox", "localpushmacro", "localundefine", "locatedfilepath", "locatefilepath", "locfilename", "lomihi", "lowerbox", "lowercased", "lowercasestring", "lowerleftdoubleninequote", "lowerleftsingleninequote", "lowerrightdoubleninequote", "lowerrightsingleninequote", "lrtbbox", "ltop", "luaTeX", "luacode", "luaconditional", "luaenvironment", "luaexpanded", "luafunction", "luajitTeX", "luamajorversion", "luaminorversion", "luaparameterset", "luasetup", "luaversion", "lunghezzaelenco", "m", "mLeftarrow", "mLeftrightarrow", "mRightarrow", "maframed", "makecharacteractive", "makerawcommalist", "makestrutofbox", "mapfontsize", "marcatura", "margindata", "markcontent", "markinjector", "mat", "matematica", "math", "mathbf", "mathbi", "mathblackboard", "mathbs", "mathcommand", "mathdefault", "mathfraktur", "mathfunction", "mathit", "mathitalic", "mathop", "mathrm", "mathscript", "mathsl", "mathss", "mathtext", "mathtextbf", "mathtextbi", "mathtextbs", "mathtextit", "mathtextsl", "mathtexttf", "mathtf", "mathtriplet", "mathtt", "mathupright", "mathword", "mathwordbf", "mathwordbi", "mathwordbs", "mathwordit", "mathwordsl", "mathwordtf", "mbox", "mcframed", "md", "measure", "measured", "medskip", "medspace", "menuinterattivo", "menzione", "mequal", "mese", "message", "metaTeX", "mettielenco", "mettielencocombinato", "mettifiancoafianco", "mettiformula", "mettiingriglia", "mettinotepdp", "mettinotepdplocali", "mettinumeropagina", "mettiregistro", "mettisegnalibro", "mettisottoformula", "mettiunosullaltro", "mfence", "mfunction", "mfunctionlabeltext", "mhbox", "mhookleftarrow", "mhookrightarrow", "middle", "middlebox", "midhbox", "minimalhbox", "mixedcaps", "mkvibuffer", "mleftarrow", "mleftharpoondown", "mleftharpoonup", "mleftrightarrow", "mleftrightharpoons", "mmapsto", "moduleparameter", "molecule", "mono", "monobold", "mononormal", "monthlong", "monthshort", "mostraambientefontdeltesto", "mostracolore", "mostracornice", "mostrafontdeltesto", "mostragriglia", "mostragruppocolori", "mostraimpostazioni", "mostralyout", "mostramakeup", "mostrasetsimboli", "mostrastampa", "mostrastruts", "mostratavolozza", "mp", "mprandomnumber", "mrel", "mrightarrow", "mrightharpoondown", "mrightharpoonup", "mrightleftharpoons", "mrightoverleftarrow", "mtext", "mtriplerel", "mtwoheadleftarrow", "mtwoheadrightarrow", "namedheadnumber", "namedstructureheadlocation", "namedstructureuservariable", "namedstructurevariable", "namedtaggedlabeltexts", "nascondere", "nascondiblocchi", "naturalhbox", "naturalhpack", "naturalvbox", "naturalvcenter", "naturalvpack", "naturalvtop", "naturalwd", "negatecolorbox", "negated", "negthinspace", "newattribute", "newcatcodetable", "newcounter", "newevery", "newfrenchspacing", "newmode", "newsignal", "newsystemmode", "nextbox", "nextboxdp", "nextboxht", "nextboxhtdp", "nextboxwd", "nextcounter", "nextcountervalue", "nextdepth", "nextparagraphs", "nextrealpage", "nextrealpagenumber", "nextsubcountervalue", "nextsubpage", "nextsubpagenumber", "nextuserpage", "nextuserpagenumber", "nientelineecimafondo", "nientelineintestazionepdp", "nientespazio", "nobar", "nocap", "nocitation", "nocite", "nodetostring", "noffigurepages", "noflines", "noflocalfloats", "noindentation", "noitem", "nonfrenchspacing", "nonmathematics", "normal", "normalboldface", "normalframedwithsettings", "normalizebodyfontsize", "normalizedfontsize", "normalizefontdepth", "normalizefontheight", "normalizefontline", "normalizefontwidth", "normalizetextdepth", "normalizetextheight", "normalizetextline", "normalizetextwidth", "normaltypeface", "nota", "notesymbol", "ntimes", "numberofpoints", "numeri", "numeriromani", "numeroformula", "numeropagina", "numeropaginacompleto", "numerotesta", "numerotestacorrente", "obeydepth", "objectdepth", "objectheight", "objectmargin", "objectwidth", "obox", "offset", "offsetbox", "onedigitrounding", "ordinaldaynumber", "ordinalstr", "ornamenttext", "outputfilename", "outputstreambox", "outputstreamcopy", "outputstreamunvbox", "outputstreamunvcopy", "over", "overbar", "overbars", "overbartext", "overbarunderbar", "overbrace", "overbracetext", "overbraceunderbrace", "overbracket", "overbrackettext", "overbracketunderbracket", "overlaybutton", "overlaycolor", "overlaydepth", "overlayfigure", "overlayheight", "overlaylinecolor", "overlaylinewidth", "overlayoffset", "overlayrollbutton", "overlaywidth", "overleftarrow", "overleftharpoondown", "overleftharpoonup", "overleftrightarrow", "overloaderror", "overparent", "overparenttext", "overparentunderparent", "overrightarrow", "overrightharpoondown", "overrightharpoonup", "overset", "overstrike", "overstrikes", "overtwoheadleftarrow", "overtwoheadrightarrow", "pagearea", "pagebreak", "pagefigure", "pagegridspanwidth", "pageinjection", "pagestaterealpage", "pagina", "paletsize", "pdfTeX", "pdfactualtext", "pdfbackendactualtext", "pdfbackendcurrentresources", "pdfbackendsetcatalog", "pdfbackendsetcolorspace", "pdfbackendsetextgstate", "pdfbackendsetinfo", "pdfbackendsetname", "pdfbackendsetpageattribute", "pdfbackendsetpageresource", "pdfbackendsetpagesattribute", "pdfbackendsetpattern", "pdfbackendsetshade", "pdfcolor", "pdfeTeX", "ped", "pedap", "percent", "percentdimen", "perlungo", "permitcaretescape", "permitcircumflexescape", "permitspacesbetweengroups", "persiandecimals", "persiannumerals", "phantom", "phantombox", "pickupgroupedcommand", "placeattachments", "placebtxrendering", "placecitation", "placecomments", "placecurrentformulanumber", "placedbox", "placefloat", "placefloatwithsetups", "placeframed", "placehelp", "placeinitial", "placelayer", "placelayeredtext", "placelistofpublications", "placelistofsorts", "placelistofsynonyms", "placelocalnotes", "placement", "placenamedfloat", "placenamedformula", "placenotes", "placepairedbox", "placeparallel", "placerawlist", "placerenderingwindow", "popattribute", "popmacro", "popmode", "popsystemmode", "positionoverlay", "positionregionoverlay", "posizionanumerotesta", "posizionatestotesta", "posizione", "postponenotes", "predefinedfont", "predefinefont", "predefinesymbol", "prefixedpagenumber", "prendibuffer", "prendimarcatura", "prependetoks", "prependgvalue", "prependtocommalist", "prependtoks", "prependtoksonce", "prependvalue", "presetdocument", "presetfieldsymbols", "pretocommalist", "prevcounter", "prevcountervalue", "preventmode", "prevrealpage", "prevrealpagenumber", "prevsubcountervalue", "prevsubpage", "prevsubpagenumber", "prevuserpage", "prevuserpagenumber", "procent", "processMPbuffer", "processMPfigurefile", "processaction", "processallactionsinset", "processassignlist", "processassignmentcommand", "processassignmentlist", "processbetween", "processbodyfontenvironmentlist", "processcolorcomponents", "processcommacommand", "processcommalist", "processcommalistwithparameters", "processcontent", "processfile", "processfilemany", "processfilenone", "processfileonce", "processfirstactioninset", "processisolatedchars", "processisolatedwords", "processlinetablebuffer", "processlinetablefile", "processlist", "processmonth", "processranges", "processseparatedlist", "processtexbuffer", "processtokens", "processuntil", "processxtablebuffer", "processyear", "prodotto", "profiledbox", "profilegivenbox", "progetto", "programma", "pseudoMixedCapped", "pseudoSmallCapped", "pseudoSmallcapped", "pseudosmallcapped", "pulsante", "pulsantemenu", "pulsantinterazione", "punti", "purenumber", "pushattribute", "pushbutton", "pushmacro", "pushmode", "pushoutputstream", "pushsystemmode", "qquad", "quad", "quads", "qualcheriga", "quitcommalist", "quitprevcommalist", "quittypescriptscanning", "raisebox", "randomizetext", "randomnumber", "rawcounter", "rawcountervalue", "rawdate", "rawdoifelseinset", "rawdoifinset", "rawdoifinsetelse", "rawgetparameters", "rawprocessaction", "rawprocesscommacommand", "rawprocesscommalist", "rawstructurelistuservariable", "rawsubcountervalue", "rbox", "readfile", "readfixfile", "readjobfile", "readlocfile", "readsetfile", "readsysfile", "readtexfile", "readxmlfile", "realSmallCapped", "realSmallcapped", "realpagenumber", "realsmallcapped", "recursedepth", "recurselevel", "recursestring", "redoconvertfont", "referenceprefix", "referring", "registerattachment", "registerctxluafile", "registerexternalfigure", "registerfontclass", "registerhyphenationexception", "registerhyphenationpattern", "registermenubuttons", "registersort", "registersynonym", "registerunit", "regular", "reimpostamarcatura", "relatemarking", "relateparameterhandlers", "relaxvalueifundefined", "remainingcharacters", "removebottomthings", "removedepth", "removefromcommalist", "removelastskip", "removelastspace", "removemarkedcontent", "removepunctuation", "removesubstring", "removetoks", "removeunwantedspaces", "replacefeature", "replaceincommalist", "replaceword", "rescan", "rescanwithsetup", "resetMPdrawing", "resetMPenvironment", "resetMPinstance", "resetallattributes", "resetandaddfeature", "resetbar", "resetbreakpoints", "resetbuffer", "resetcharacteralign", "resetcharacterkerning", "resetcharacterspacing", "resetcharacterstripping", "resetcollector", "resetcounter", "resetdigitsmanipulation", "resetdirection", "resetfeature", "resetflag", "resetfontcolorsheme", "resetfontfallback", "resetfontsolution", "resethyphenationfeatures", "resetinjector", "resetinteractionmenu", "resetitaliccorrection", "resetlayer", "resetlocalfloats", "resetmarker", "resetmode", "resetpagenumber", "resetparallel", "resetpath", "resetpenalties", "resetprofile", "resetreference", "resetreplacement", "resetscript", "resetsetups", "resetshownsynonyms", "resetsubpagenumber", "resetsymbolset", "resetsystemmode", "resettimer", "resettrackers", "resettrialtypesetting", "resetusedsortings", "resetusedsynonyms", "resetuserpagenumber", "resetvalue", "resetvisualizers", "reshapebox", "resolvedglyphdirect", "resolvedglyphstyled", "restartcounter", "restorebox", "restorecatcodes", "restorecounter", "restorecurrentattributes", "restoreendofline", "restoreglobalbodyfont", "reusableMPgraphic", "reuseMPgraphic", "reuserandomseed", "revivefeature", "rfence", "rhbox", "rif", "riferimento", "riferimentopagina", "riferimentotesto", "riflessione", "rigariempimento", "right", "rightbottombox", "rightbox", "righthbox", "rightorleftpageaction", "rightskipadaption", "rightsubguillemot", "righttolefthbox", "righttoleftvbox", "righttoleftvtop", "righttopbox", "rigovuoto", "rlap", "robustaddtocommalist", "robustdoifelseinset", "robustdoifinsetelse", "robustpretocommalist", "rollbutton", "roman", "rtop", "ruledhbox", "ruledhpack", "ruledmbox", "ruledtopv", "ruledtpack", "ruledvbox", "ruledvpack", "ruledvtop", "runMPbuffer", "runninghbox", "ruota", "safechar", "sans", "sansbold", "sansnormal", "sansserif", "savebox", "savebtxdataset", "savebuffer", "savecounter", "savecurrentattributes", "savenormalmeaning", "savetaggedtwopassdata", "savetwopassdata", "sbox", "scala", "schermo", "scrividentroelenco", "scriviinelenco", "sd", "secondoffivearguments", "secondoffourarguments", "secondofsixarguments", "secondofthreearguments", "secondofthreeunexpanded", "secondoftwoarguments", "secondoftwounexpanded", "segnalibro", "select", "selezionablocchi", "serializecommalist", "serializedcommalist", "serif", "serifbold", "serifnormal", "setJSpreamble", "setMPlayer", "setMPpositiongraphic", "setMPpositiongraphicrange", "setMPtext", "setMPvariable", "setMPvariables", "setbar", "setbigbodyfont", "setboxllx", "setboxlly", "setbreakpoints", "setcapstrut", "setcatcodetable", "setcharacteralign", "setcharactercasing", "setcharactercleaning", "setcharacterkerning", "setcharacterspacing", "setcharacterstripping", "setcharstrut", "setcollector", "setcolormodell", "setcounter", "setcounterown", "setcurrentfontclass", "setdataset", "setdefaultpenalties", "setdigitsmanipulation", "setdirection", "setdocumentargument", "setdocumentargumentdefault", "setdocumentfilename", "setdummyparameter", "setelementexporttag", "setemeasure", "setevalue", "setevariable", "setevariables", "setfirstline", "setflag", "setfont", "setfontcolorsheme", "setfontfeature", "setfontsolution", "setfontstrut", "setfractions", "setgmeasure", "setgvalue", "setgvariable", "setgvariables", "sethboxregister", "sethyphenatedurlafter", "sethyphenatedurlbefore", "sethyphenatedurlnormal", "sethyphenationfeatures", "setinitial", "setinjector", "setinteraction", "setinterfacecommand", "setinterfaceconstant", "setinterfaceelements", "setinterfacemessage", "setinterfacevariable", "setinternalrendering", "setitaliccorrection", "setlayer", "setlayerframed", "setlayertext", "setlinefiller", "setlocalhsize", "setmainbodyfont", "setmainparbuilder", "setmarker", "setmarking", "setmathstyle", "setmeasure", "setmessagetext", "setmode", "setnostrut", "setnote", "setnotetext", "setobject", "setoldstyle", "setpagegrid", "setpagereference", "setpagestate", "setpagestaterealpageno", "setpenalties", "setpercentdimen", "setposition", "setpositionbox", "setpositiondata", "setpositiondataplus", "setpositiononly", "setpositionplus", "setpositionstrut", "setprofile", "setrandomseed", "setreference", "setreferencedobject", "setregisterentry", "setreplacement", "setrigidcolumnbalance", "setrigidcolumnhsize", "setscript", "setsectionblock", "setsimplecolumnhsize", "setsmallbodyfont", "setsmallcaps", "setstackbox", "setstructurepageregister", "setstrut", "setsuperiors", "setsystemmode", "settabular", "settaggedmetadata", "settext", "settightobject", "settightreferencedobject", "settightunreferencedobject", "settrialtypesetting", "setuevalue", "setugvalue", "setunreferencedobject", "setup", "setupMPgraphics", "setupMPinstance", "setupMPpage", "setupMPvariables", "setupTABLE", "setupTEXpage", "setupattachment", "setupbackend", "setupbar", "setupbleeding", "setupbookmark", "setupbtx", "setupbtxdataset", "setupbtxlist", "setupbtxregister", "setupbtxrendering", "setupbutton", "setupcharacterkerning", "setupcharacterspacing", "setupchemical", "setupchemicalframed", "setupcollector", "setupcolumnspan", "setupcombination", "setupcounter", "setupdataset", "setupdelimitedtext", "setupdescription", "setupdirections", "setupdocument", "setupeffect", "setupenumeration", "setupenv", "setupexport", "setupexternalfigure", "setupexternalsoundtracks", "setupfieldbody", "setupfieldcategory", "setupfieldcontentframed", "setupfieldlabelframed", "setupfieldtotalframed", "setupfiller", "setupfirstline", "setupfittingpage", "setupfloatcaption", "setupfontexpansion", "setupfontprotrusion", "setupfonts", "setupfontsolution", "setupformula", "setupformulaframed", "setupframedcontent", "setupframedtext", "setupglobalreferenceprefix", "setupheadalternative", "setuphelp", "setuphigh", "setuphighlight", "setuphyphenation", "setupindentedtext", "setupinitial", "setupinsertion", "setupitaliccorrection", "setupitemgroup", "setuplabel", "setuplayer", "setuplayeredtext", "setuplayouttext", "setuplinefiller", "setuplinefillers", "setuplinenote", "setuplinetable", "setuplistalternative", "setuplistextra", "setuplocalfloats", "setuplocalinterlinespace", "setuplow", "setuplowhigh", "setuplowmidhigh", "setupmarginblock", "setupmargindata", "setupmarginframed", "setupmarginrule", "setupmathalignment", "setupmathcases", "setupmathematics", "setupmathfence", "setupmathfraction", "setupmathframed", "setupmathmatrix", "setupmathornament", "setupmathradical", "setupmathstackers", "setupmathstyle", "setupmixedcolumns", "setupmodule", "setupnotation", "setupnotations", "setupnote", "setupnotes", "setupoffset", "setupoffsetbox", "setupoutputroutine", "setuppagechecker", "setuppagegrid", "setuppagegridarea", "setuppagegridareatext", "setuppagegridlines", "setuppagegridspan", "setuppagegridstart", "setuppageinjection", "setuppageinjectionalternative", "setuppageshift", "setuppagestate", "setuppairedbox", "setuppaper", "setupparagraph", "setupparagraphintro", "setupparallel", "setupperiods", "setupplacement", "setuppositionbar", "setupprocessor", "setupprofile", "setupquotation", "setuprealpagenumber", "setupreferenceformat", "setupreferenceprefix", "setupreferencestructureprefix", "setupregisters", "setuprenderingwindow", "setups", "setupscale", "setupscript", "setupscripts", "setupselector", "setupshift", "setupsidebar", "setupspellchecking", "setupstretched", "setupstruts", "setupstyle", "setupsubformula", "setuptabulation", "setuptagging", "setuptextbackground", "setuptextflow", "setuptooltip", "setupunit", "setupuserpagenumber", "setupversion", "setupviewerlayer", "setupvspacing", "setupwithargument", "setupwithargumentswapped", "setupxml", "setupxtable", "setuvalue", "setuxvalue", "setvalue", "setvariable", "setvariables", "setvboxregister", "setvisualizerfont", "setvtopregister", "setwidthof", "setxmeasure", "setxvalue", "setxvariable", "setxvariables", "sfondo", "sfrac", "shapedhbox", "showallmakeup", "showattributes", "showboxes", "showbtxdatasetauthors", "showbtxdatasetcompleteness", "showbtxdatasetfields", "showbtxfields", "showbtxhashedauthors", "showbtxtables", "showchardata", "showcharratio", "showcolorbar", "showcolorcomponents", "showcolorset", "showcolorstruts", "showcounter", "showdirectives", "showdirsinmargin", "showedebuginfo", "showexperiments", "showfont", "showfontdata", "showfontkerns", "showfontparameters", "showfontstrip", "showfontstyle", "showglyphs", "showgridsnapping", "showhelp", "showhyphenationtrace", "showhyphens", "showinjector", "showjustification", "showkerning", "showlayoutcomponents", "showligature", "showligatures", "showlogcategories", "showmargins", "showmessage", "showminimalbaseline", "shownextbox", "showotfcomposition", "showparentchain", "showsetupsdefinition", "showtimer", "showtokens", "showtrackers", "showvalue", "showvariable", "showwarning", "simbolo", "simplegroupedcommand", "singalcharacteralign", "singlebond", "sixthofsixarguments", "slanted", "slantedbold", "slicepages", "slovenianNumerals", "sloveniannumerals", "small", "smallbodyfont", "smallbold", "smallbolditalic", "smallboldslanted", "smallcappedcharacters", "smallcappedromannumerals", "smaller", "smallitalicbold", "smallnormal", "smallskip", "smallslanted", "smallslantedbold", "smalltype", "smash", "smashbox", "smashboxed", "smashedhbox", "smashedvbox", "snaptogrid", "someheadnumber", "somekindoftab", "somelocalfloat", "somenamedheadnumber", "someplace", "sottoargomento", "sottocapoverso", "sottosottoargomento", "sottosottocapoverso", "sottosottosottoargomento", "sottosottosottocapoverso", "sottosottosottosottoargomento", "sottosottosottosottocapoverso", "sp", "spanishNumerals", "spanishnumerals", "spazifissi", "spazio", "spaziofisso", "speech", "spessoreriga", "spezzaoggettomobile", "splitatasterisk", "splitatcolon", "splitatcolons", "splitatcomma", "splitdfrac", "splitfilename", "splitfrac", "splitoffbase", "splitofffull", "splitoffkind", "splitoffname", "splitoffpath", "splitoffroot", "splitofftokens", "splitofftype", "splitstring", "spreadhbox", "sqrt", "stackcampi", "stackrel", "startregister", "startstructurepageregister", "stirato", "stopregister", "stopstructurepageregister", "strictdoifelsenextoptional", "strictdoifnextoptionalelse", "stripcharacter", "strippedcsname", "stripspaces", "structurelistuservariable", "structurenumber", "structuretitle", "structureuservariable", "structurevariable", "strut", "strutdp", "strutht", "struthtdp", "struttedbox", "strutwd", "style", "styleinstance", "subpagenumber", "subsentence", "substituteincommalist", "subtractfeature", "swapcounts", "swapdimens", "swapface", "swapmacros", "swaptypeface", "switchstyleonly", "switchtocolor", "switchtointerlinespace", "symbolreference", "synchronizeblank", "synchronizeindenting", "synchronizemarking", "synchronizeoutputstreams", "synchronizestrut", "synchronizewhitespace", "systemlog", "systemlogfirst", "systemloglast", "systemsetups", "tLeftarrow", "tLeftrightarrow", "tRightarrow", "tabella", "tabulateautoline", "tabulateautorule", "tabulateline", "tabulaterule", "taggedctxcommand", "taggedlabeltexts", "tbinom", "tbox", "tequal", "terminaJScode", "terminaJSpreamble", "terminaMPclip", "terminaMPcode", "terminaMPdefinitions", "terminaMPdrawing", "terminaMPenvironment", "terminaMPextensions", "terminaMPinclusions", "terminaMPinitializations", "terminaMPpage", "terminaMPpositiongraphic", "terminaMPpositionmethod", "terminaMPrun", "terminaTABLE", "terminaTABLEbody", "terminaTABLEfoot", "terminaTABLEhead", "terminaTABLEnext", "terminaTC", "terminaTD", "terminaTDs", "terminaTEXpage", "terminaTH", "terminaTN", "terminaTR", "terminaTRs", "terminaTX", "terminaTY", "terminaallmodes", "terminaambiente", "terminaargomento", "terminaarrangedpages", "terminaaside", "terminaattachment", "terminabar", "terminabinom", "terminabitmapimage", "terminablockquote", "terminabtxrenderingdefinitions", "terminabuffer", "terminabutton", "terminacapitolo", "terminacapoverso", "terminacatcodetable", "terminacharacteralign", "terminacheckedfences", "terminachemical", "terminacitazione", "terminacollect", "terminacollecting", "terminacolore", "terminacolorintent", "terminacoloronly", "terminacolorset", "terminacolumns", "terminacolumnspan", "terminacombination", "terminacomment", "terminacommento", "terminacomponenet", "terminacontextcode", "terminacontextdefinitioncode", "terminactxfunction", "terminactxfunctiondefinition", "terminacurrentcolor", "terminacurrentlistentrywrapper", "terminadbinom", "terminadelimited", "terminadelimitedtext", "terminadfrac", "terminadisplaymath", "terminadmath", "terminadocument", "terminaeffect", "terminaelement", "terminaelemento", "terminaelenco", "terminaembeddedxtable", "terminaendofline", "terminaexceptions", "terminaexpanded", "terminaexpandedcollect", "terminaextendedcatcodetable", "terminaexternalfigurecollection", "terminafigura", "terminafigure", "terminafitfieldframed", "terminafittingpage", "terminafloatcombination", "terminafont", "terminafontclass", "terminafontsolution", "terminaformula", "terminaformulas", "terminafrac", "terminaframedcontent", "terminaframedtext", "terminagrafico", "terminagridsnapping", "terminahbox", "terminahboxestohbox", "terminahboxregister", "terminahelptext", "terminahiddenbar", "terminahiding", "terminahighlight", "terminahyphenation", "terminaimath", "terminaimpaccato", "terminaincorniciato", "terminaindentation", "terminaindentedtext", "terminainmframed", "terminainteraction", "terminainterface", "terminaintermezzo", "terminaintertext", "terminaitemgroup", "terminaknockout", "terminalayout", "terminalineamargine", "terminalineatesto", "terminalinecorrection", "terminalinefiller", "terminalinenumbering", "terminalinetable", "terminalinetablebody", "terminalinetablecell", "terminalinetablehead", "terminalocalfootnotes", "terminalocalheadsetup", "terminalocallinecorrection", "terminalocalnotes", "terminalocalsetups", "terminalua", "terminaluacode", "terminaluaparameterset", "terminaluasetups", "terminamakeup", "terminamarginblock", "terminamarkedcontent", "terminamathmode", "terminamathstyle", "terminamatrices", "terminamcframed", "terminamdformula", "terminamenuinterattivo", "terminamenzione", "terminamettiformula", "terminamframed", "terminamixedcolumns", "terminamode", "terminamodeset", "terminamodule", "terminamoduletestsection", "terminampformula", "terminanamedsection", "terminanamedsubformulas", "terminanarrow", "terminanarrower", "terminanegative", "terminanicelyfilledbox", "terminanobar", "terminanointerference", "terminanotallmodes", "terminanotext", "terminanotmode", "terminaopposite", "terminaoutputstream", "terminaoverlay", "terminaoverprint", "terminapagecomment", "terminapagefigure", "terminapagegrid", "terminapagegridspan", "terminapagelayout", "terminapar", "terminaparagraph", "terminaparagraphs", "terminaparagraphscell", "terminaparbuilder", "terminapath", "terminaplacepairedbox", "terminapositioning", "terminapositionoverlay", "terminapositive", "terminapostponing", "terminaprocessassignmentcommand", "terminaprocessassignmentlist", "terminaprocesscommacommand", "terminaprocesscommalist", "terminaprodotto", "terminaprogetto", "terminaprotect", "terminaprotectedcolors", "terminapubblicazione", "terminapunctuation", "terminarandomized", "terminarandomseed", "terminarawsetups", "terminareadingfile", "terminareferenceprefix", "terminaregime", "terminareusableMPgraphic", "terminariga", "terminasbarrati", "terminasbarrato", "terminascript", "terminasdformula", "terminasectionblock", "terminasectionblockenvironment", "terminasectionlevel", "terminasetups", "terminasfondo", "terminasfrac", "terminashapebox", "terminashift", "terminasidebar", "terminasimplecolumns", "terminasopralinea", "terminasopralinee", "terminasottoargomento", "terminasottocapoverso", "terminasottolinea", "terminasottolinee", "terminasottosottoargomento", "terminasottosottocapoverso", "terminasottosottosottoargomento", "terminasottosottosottocapoverso", "terminasottosottosottosottoargomento", "terminasottosottosottosottocapoverso", "terminaspecialitem", "terminaspeech", "terminaspformula", "terminaspread", "terminastartstop", "terminastaticMPfigure", "terminastaticMPgraphic", "terminastrictinspectnextcharacter", "terminastrut", "terminastyle", "terminasubformulas", "terminasubjectlevel", "terminasubsentence", "terminasubstack", "terminasymbolset", "terminatabella", "terminatable", "terminatablehead", "terminatables", "terminatabletail", "terminatabulate", "terminatabulatehead", "terminatabulatetail", "terminatagged", "terminatbinom", "terminatesta", "terminatestoaiuto", "terminatestoincorniciato", "terminatexcode", "terminatexdefinition", "terminatext", "terminatextbackground", "terminatextbackgroundmanual", "terminatextcolor", "terminatextcolorintent", "terminatextflow", "terminatitolo", "terminatokens", "terminatransparent", "terminatypescript", "terminatypescriptcollection", "terminaunderdash", "terminaunderdashes", "terminaunderdot", "terminaunderdots", "terminaunderrandom", "terminaunderrandoms", "terminaunderstrike", "terminaunderstrikes", "terminaunframed", "terminauniqueMPgraphic", "terminauniqueMPpagegraphic", "terminaunpacked", "terminausableMPgraphic", "terminauseMPgraphic", "terminausemathstyleparameter", "terminausingbtxspecification", "terminavaia", "terminavbox", "terminavboxregister", "terminavboxtohbox", "terminavboxtohboxseparator", "terminaviewerlayer", "terminavtop", "terminavtopregister", "terminaxcell", "terminaxcellgroup", "terminaxfrac", "terminaxgroup", "terminaxmldisplayverbatim", "terminaxmlinlineverbatim", "terminaxmlraw", "terminaxmlsetups", "terminaxrow", "terminaxrowgroup", "terminaxtable", "terminaxtablebody", "terminaxtablefoot", "terminaxtablehead", "terminaxtablenext", "terminaxxfrac", "testandsplitstring", "testcolumn", "testfeature", "testfeatureonce", "testoaiuto", "testoincorniciato", "testonotapdp", "testoriempimento", "testpage", "testpageonly", "testpagesync", "testtokens", "tex", "texdefinition", "texsetup", "textcitation", "textcite", "textcontrolspace", "textflowcollector", "textmath", "textminus", "textormathchar", "textplus", "textvisiblespace", "tfrac", "thainumerals", "thefirstcharacter", "thenormalizedbodyfontsize", "theremainingcharacters", "thickspace", "thinspace", "thirdoffivearguments", "thirdoffourarguments", "thirdofsixarguments", "thirdofthreearguments", "thirdofthreeunexpanded", "thookleftarrow", "thookrightarrow", "threedigitrounding", "tibetannumerals", "tieniblocchi", "tightlayer", "tinyfont", "titolo", "tlap", "tleftarrow", "tleftharpoondown", "tleftharpoonup", "tleftrightarrow", "tleftrightharpoons", "tmapsto", "tochar", "tolinenote", "topbox", "topleftbox", "toplinebox", "toprightbox", "topskippedbox", "tracecatcodetables", "tracedfontname", "traceoutputroutines", "tracepositions", "traduci", "transparencycomponents", "transparent", "trel", "trightarrow", "trightharpoondown", "trightharpoonup", "trightleftharpoons", "trightoverleftarrow", "triplebond", "truefilename", "truefontname", "ttriplerel", "ttwoheadleftarrow", "ttwoheadrightarrow", "twodigitrounding", "tx", "txx", "typ", "type", "typebuffer", "typedefinedbuffer", "typeface", "typefile", "typescriptone", "typescriptprefix", "typescriptthree", "typescripttwo", "typesetbuffer", "typesetfile", "uconvertnumber", "uedcatcodecommand", "undefinevalue", "undepthed", "underbar", "underbars", "underbartext", "underbrace", "underbracetext", "underbracket", "underbrackettext", "underdash", "underdashes", "underdot", "underdots", "underleftarrow", "underleftharpoondown", "underleftharpoonup", "underleftrightarrow", "underparent", "underparenttext", "underrandom", "underrandoms", "underrightarrow", "underrightharpoondown", "underrightharpoonup", "underset", "understrike", "understrikes", "undertwoheadleftarrow", "undertwoheadrightarrow", "undoassign", "unframed", "unhhbox", "unihex", "uniqueMPgraphic", "uniqueMPpagegraphic", "unprotected", "unregisterhyphenationpattern", "unspaceafter", "unspaceargument", "unspaced", "unspacestring", "untexargument", "untexcommand", "uppercased", "uppercasestring", "upperleftdoubleninequote", "upperleftdoublesixquote", "upperleftsingleninequote", "upperleftsinglesixquote", "upperrightdoubleninequote", "upperrightdoublesixquote", "upperrightsingleninequote", "upperrightsinglesixquote", "url", "usaJSscripts", "usaURL", "usablocco", "usacartella", "usacolonnasonoraesterna", "usadocumentoesterno", "usafiguraesterna", "usamodulo", "usasimboli", "usaurl", "useMPenvironmentbuffer", "useMPgraphic", "useMPlibrary", "useMPrun", "useMPvariables", "useblankparameter", "usebodyfont", "usebodyfontparameter", "usebtxdataset", "usebtxdefinitions", "usecolors", "usecomponent", "usedummycolorparameter", "usedummystyleandcolor", "usedummystyleparameter", "useenvironment", "useexternalrendering", "usefigurebase", "usefile", "usegridparameter", "useindentingparameter", "useindentnextparameter", "useinterlinespaceparameter", "uselanguageparameter", "useluamodule", "usemathstyleparameter", "useproduct", "useprofileparameter", "useproject", "usereferenceparameter", "userpagenumber", "usesetupsparameter", "usestaticMPfigure", "usesubpath", "usetexmodule", "usetypescript", "usetypescriptfile", "usezipfile", "utfchar", "utflower", "utfupper", "utilityregisterlength", "vaia", "vaiabox", "vaiapagina", "vaigiu", "valorecolore", "vboxreference", "verbatim", "verbatimstring", "verbosenumber", "versione", "verticalgrowingbar", "verticalpositionbar", "vglue", "viewerlayer", "vl", "vphantom", "vpos", "vsmash", "vsmashbox", "vsmashed", "vspace", "vspacing", "wdofstring", "widthofstring", "widthspanningtext", "withoutpt", "word", "words", "wordtonumber", "writedatatolist", "writestatus", "xLeftarrow", "xLeftrightarrow", "xRightarrow", "xdefconvertedargument", "xequal", "xfrac", "xhookleftarrow", "xhookrightarrow", "xleftarrow", "xleftharpoondown", "xleftharpoonup", "xleftrightarrow", "xleftrightharpoons", "xmapsto", "xmladdindex", "xmlafterdocumentsetup", "xmlaftersetup", "xmlall", "xmlappenddocumentsetup", "xmlappendsetup", "xmlapplyselectors", "xmlatt", "xmlattdef", "xmlattribute", "xmlattributedef", "xmlbadinclusions", "xmlbeforedocumentsetup", "xmlbeforesetup", "xmlchainatt", "xmlchainattdef", "xmlchecknamespace", "xmlcommand", "xmlconcat", "xmlconcatrange", "xmlcontext", "xmlcount", "xmldefaulttotext", "xmldirectives", "xmldirectivesafter", "xmldirectivesbefore", "xmldisplayverbatim", "xmldoif", "xmldoifelse", "xmldoifelseempty", "xmldoifelseselfempty", "xmldoifelsetext", "xmldoifelsevalue", "xmldoifnot", "xmldoifnotselfempty", "xmldoifnottext", "xmldoifselfempty", "xmldoiftext", "xmlelement", "xmlfilter", "xmlfirst", "xmlflush", "xmlflushcontext", "xmlflushdocumentsetups", "xmlflushlinewise", "xmlflushpure", "xmlflushspacewise", "xmlflushtext", "xmlinclude", "xmlinclusion", "xmlinclusions", "xmlinfo", "xmlinjector", "xmlinlineverbatim", "xmlinstalldirective", "xmllast", "xmllastatt", "xmllastmatch", "xmlloadbuffer", "xmlloaddata", "xmlloaddirectives", "xmlloadfile", "xmlloadonly", "xmlmain", "xmlmapvalue", "xmlname", "xmlnamespace", "xmlnonspace", "xmlpath", "xmlpos", "xmlposition", "xmlprependdocumentsetup", "xmlprependsetup", "xmlprettyprint", "xmlprocessbuffer", "xmlprocessdata", "xmlprocessfile", "xmlpure", "xmlraw", "xmlrefatt", "xmlregistereddocumentsetups", "xmlregisteredsetups", "xmlregisterns", "xmlremapname", "xmlremapnamespace", "xmlremovedocumentsetup", "xmlremovesetup", "xmlresetdocumentsetups", "xmlresetinjectors", "xmlresetsetups", "xmlsave", "xmlsetentity", "xmlsetfunction", "xmlsetinjectors", "xmlsetsetup", "xmlsetup", "xmlshow", "xmlsnippet", "xmlstrip", "xmlstripnolines", "xmlstripped", "xmlstrippednolines", "xmltag", "xmltexentity", "xmltext", "xmltobuffer", "xmltobufferverbose", "xmltofile", "xmlvalue", "xmlverbatim", "xrel", "xrightarrow", "xrightharpoondown", "xrightharpoonup", "xrightleftharpoons", "xrightoverleftarrow", "xsplitstring", "xtriplerel", "xtwoheadleftarrow", "xtwoheadrightarrow", "xxfrac", "xypos" }, - ["nl"]={ "AMSTEX", "AfterPar", "Alphabeticnumerals", "AmSTeX", "And", "BeforePar", "Big", "Bigg", "Biggl", "Biggm", "Biggr", "Bigl", "Bigm", "Bigr", "CONTEXT", "Caps", "Cijfers", "ConTeXt", "Context", "ConvertConstantAfter", "ConvertToConstant", "ETEX", "EveryLine", "EveryPar", "GetPar", "GotoPar", "Greeknumerals", "INRSTEX", "Kap", "LAMSTEX", "LATEX", "LUAJITTEX", "LUATEX", "LaTeX", "LamSTeX", "Letter", "Letters", "Lua", "LuaTeX", "LuajitTeX", "MAAND", "METAFONT", "METAFUN", "METAPOST", "MKII", "MKIV", "MKIX", "MKVI", "MKXI", "MONTHLONG", "MONTHSHORT", "MPII", "MPIV", "MPVI", "MPanchor", "MPbetex", "MPc", "MPcode", "MPcolor", "MPcoloronly", "MPcolumn", "MPd", "MPdrawing", "MPfontsizehskip", "MPgetmultipars", "MPgetmultishape", "MPgetposboxes", "MPh", "MPinclusions", "MPleftskip", "MPll", "MPlr", "MPls", "MPmenubuttons", "MPn", "MPoptions", "MPoverlayanchor", "MPp", "MPpage", "MPpardata", "MPplus", "MPpos", "MPpositiongraphic", "MPposset", "MPr", "MPrawvar", "MPregion", "MPrest", "MPrightskip", "MPrs", "MPstring", "MPtext", "MPtransparency", "MPul", "MPur", "MPv", "MPvar", "MPvariable", "MPvv", "MPw", "MPwhd", "MPx", "MPxy", "MPxywhd", "MPy", "MetaFont", "MetaFun", "MetaPost", "NormalizeFontHeight", "NormalizeFontWidth", "NormalizeTextHeight", "NormalizeTextWidth", "PDFETEX", "PDFTEX", "PDFcolor", "PICTEX", "PPCHTEX", "PPCHTeX", "PRAGMA", "PiCTeX", "PointsToBigPoints", "PointsToReal", "PointsToWholeBigPoints", "PtToCm", "ReadFile", "Romeins", "ScaledPointsToBigPoints", "ScaledPointsToWholeBigPoints", "Smallcapped", "TABLE", "TEX", "TEXpage", "TaBlE", "TeX", "TheNormalizedFontSize", "TransparencyHack", "VerboseNumber", "WEEKDAG", "WOORD", "WOORDEN", "WidthSpanningText", "Woord", "Woorden", "XETEX", "XeTeX", "aanhangsel", "abjadnaivenumerals", "abjadnodotnumerals", "abjadnumerals", "about", "achtergrond", "activatespacehandler", "adaptcollector", "adaptfontfeature", "adaptpapersize", "addfeature", "addtoJSpreamble", "addtocommalist", "addvalue", "aftersplitstring", "aftertestandsplitstring", "alignmentcharacter", "allinputpaths", "alphabeticnumerals", "alwayscitation", "alwayscite", "ampersand", "anchor", "appendetoks", "appendgvalue", "appendtocommalist", "appendtoks", "appendtoksonce", "appendvalue", "apply", "applyalternativestyle", "applyprocessor", "applytocharacters", "applytofirstcharacter", "applytosplitstringchar", "applytosplitstringcharspaced", "applytosplitstringline", "applytosplitstringlinespaced", "applytosplitstringword", "applytosplitstringwordspaced", "applytowords", "arabicdecimals", "arabicexnumerals", "arabicnumerals", "arg", "asciistr", "aside", "assignalfadimension", "assigndimen", "assigndimension", "assignifempty", "assigntranslation", "assignvalue", "assignwidth", "assumelongusagecs", "astype", "attachment", "autocap", "autodirhbox", "autodirvbox", "autodirvtop", "autoinsertnextspace", "automathematics", "autosetups", "availablehsize", "averagecharwidth", "backgroundimage", "backgroundimagefill", "backgroundline", "basegrid", "baselineleftbox", "baselinemiddlebox", "baselinerightbox", "bbox", "beforesplitstring", "beforetestandsplitstring", "bepaalkopnummer", "bepaallijstkenmerken", "bepaalregisterkenmerken", "bewaarbuffer", "big", "bigbodyfont", "bigg", "bigger", "biggl", "biggm", "biggr", "bigl", "bigm", "bigr", "bigskip", "binom", "bitmapimage", "blanko", "blap", "bleed", "bleedheight", "bleedwidth", "blockligatures", "blockquote", "blokcitaat", "blokje", "blokjes", "bodyfontenvironmentlist", "bodyfontsize", "bold", "boldface", "bolditalic", "boldslanted", "bookmark", "booleanmodevalue", "bottombox", "bottomleftbox", "bottomrightbox", "boxcursor", "boxmarker", "boxofsize", "boxreference", "bpos", "bthiddencitation", "btxabbreviatedjournal", "btxaddjournal", "btxalwayscitation", "btxauthorfield", "btxdetail", "btxdirect", "btxdoif", "btxdoifcombiinlistelse", "btxdoifelse", "btxdoifelsecombiinlist", "btxdoifelsesameasprevious", "btxdoifelsesameaspreviouschecked", "btxdoifelseuservariable", "btxdoifnot", "btxdoifsameaspreviouscheckedelse", "btxdoifsameaspreviouselse", "btxdoifuservariableelse", "btxexpandedjournal", "btxfield", "btxfieldname", "btxfieldtype", "btxfirstofrange", "btxflush", "btxflushauthor", "btxflushauthorinverted", "btxflushauthorinvertedshort", "btxflushauthorname", "btxflushauthornormal", "btxflushauthornormalshort", "btxflushsuffix", "btxfoundname", "btxfoundtype", "btxhybridcite", "btxlistcitation", "btxloadjournalist", "btxoneorrange", "btxremapauthor", "btxsavejournalist", "btxsetup", "btxsingularorplural", "btxsingularplural", "btxtextcitation", "button", "calligraphic", "camel", "catcodetablename", "cbox", "centerbox", "centeredbox", "centerednextbox", "cfrac", "chardescription", "charwidthlanguage", "checkcharacteralign", "checkedchar", "checkedfiller", "checkedstrippedcsname", "checkinjector", "checknextindentation", "checknextinjector", "checkpage", "checkparameters", "checkpreviousinjector", "checksoundtrack", "checktwopassdata", "checkvariables", "chem", "chemical", "chemicalbottext", "chemicalmidtext", "chemicalsymbol", "chemicaltext", "chemicaltoptext", "chineseallnumerals", "chinesecapnumerals", "chinesenumerals", "cijfers", "citaat", "citation", "cite", "citeer", "clap", "classfont", "cldcommand", "cldcontext", "cldloadfile", "cldprocessfile", "cleftarrow", "clip", "collect", "collectedtext", "collectexpanded", "colorcomponents", "colored", "coloronly", "columnbreak", "combinepages", "commalistelement", "commalistsentence", "commalistsize", "comment", "commentaar", "comparedimension", "comparedimensioneps", "completebtxrendering", "completelist", "completelistofpublications", "completelistofsorts", "completelistofsynonyms", "complexorsimple", "complexorsimpleempty", "composedcollector", "composedlayer", "compresult", "constantdimen", "constantdimenargument", "constantemptyargument", "constantnumber", "constantnumberargument", "contentreference", "continuednumber", "continueifinputfile", "convertargument", "convertcommand", "convertedcounter", "converteddimen", "convertedsubcounter", "converteernummer", "convertmonth", "convertvalue", "convertvboxtohbox", "copieerveld", "copypages", "copyparameters", "copyposition", "corrigeerwitruimte", "countersubs", "counttoken", "counttokens", "cramped", "crampedclap", "crampedllap", "crampedrlap", "crightarrow", "crightoverleftarrow", "ctop", "ctxcommand", "ctxdirectcommand", "ctxdirectlua", "ctxfunction", "ctxlatecommand", "ctxlatelua", "ctxloadluafile", "ctxlua", "ctxluabuffer", "ctxluacode", "ctxreport", "ctxsprint", "currentassignmentlistkey", "currentassignmentlistvalue", "currentbtxuservariable", "currentcommalistitem", "currentcomponent", "currentenvironment", "currentfeaturetest", "currentinterface", "currentlanguage", "currentlistentrydestinationattribute", "currentlistentrylimitedtext", "currentlistentrynumber", "currentlistentrypagenumber", "currentlistentryreferenceattribute", "currentlistentrytitle", "currentlistentrytitlerendered", "currentlistsymbol", "currentmainlanguage", "currentmessagetext", "currentmoduleparameter", "currentoutputstream", "currentproduct", "currentproject", "currentregime", "currentregisterpageuserdata", "currentresponses", "currenttime", "currentvalue", "currentxtablecolumn", "currentxtablerow", "datasetvariable", "datum", "dayoftheweek", "dayspermonth", "dbinom", "decrement", "decrementcounter", "decrementedcounter", "decrementpagenumber", "decrementsubpagenumber", "decrementvalue", "defaultinterface", "defaultobjectpage", "defaultobjectreference", "defcatcodecommand", "defconvertedargument", "defconvertedcommand", "defconvertedvalue", "defineMPinstance", "defineTABLEsetup", "defineactivecharacter", "definealternativestyle", "defineanchor", "defineattachment", "defineattribute", "definebackground", "definebar", "definebodyfontswitch", "definebreakpoint", "definebreakpoints", "definebtx", "definebtxdataset", "definebtxregister", "definebtxrendering", "definebutton", "definecapitals", "definecharacterkerning", "definecharacterspacing", "definechemical", "definechemicals", "definechemicalsymbol", "definecollector", "definecomment", "definecomplexorsimple", "definecomplexorsimpleempty", "defineconversionset", "definecounter", "definedataset", "definedelimitedtext", "definedfont", "defineeffect", "defineexpandable", "defineexternalfigure", "definefallbackfamily", "definefieldbody", "definefieldbodyset", "definefieldcategory", "definefileconstant", "definefilefallback", "definefilesynonym", "definefiller", "definefirstline", "definefittingpage", "definefontalternative", "definefontfallback", "definefontfamily", "definefontfamilypreset", "definefontfeature", "definefontfile", "definefontsize", "definefontsolution", "defineformula", "defineformulaalternative", "defineformulaframed", "defineframedcontent", "definefrozenfont", "defineglobalcolor", "definegraphictypesynonym", "definegridsnapping", "defineheadalternative", "definehelp", "definehigh", "definehighlight", "definehspace", "definehypenationfeatures", "defineindenting", "defineinitial", "defineinsertion", "defineinteraction", "defineinteractionbar", "defineinterfaceconstant", "defineinterfaceelement", "defineinterfacevariable", "defineinterlinespace", "defineintermediatecolor", "defineitems", "definelabelclass", "definelayerpreset", "definelinefiller", "definelinenote", "definelinenumbering", "definelines", "definelistalternative", "definelistextra", "definelow", "definelowhigh", "definelowmidhigh", "definemarginblock", "definemargindata", "definemarker", "definemathcases", "definemathcommand", "definemathdoubleextensible", "definemathematics", "definemathextensible", "definemathfence", "definemathfraction", "definemathframed", "definemathmatrix", "definemathornament", "definemathoverextensible", "definemathovertextextensible", "definemathradical", "definemathstackers", "definemathstyle", "definemathtriplet", "definemathunderextensible", "definemathundertextextensible", "definemathunstacked", "definemeasure", "definemessageconstant", "definemixedcolumns", "definemode", "definemultitonecolor", "definenamedcolor", "definenamespace", "definenarrower", "definenote", "defineornament", "defineoutputroutine", "defineoutputroutinecommand", "definepage", "definepagechecker", "definepagegrid", "definepagegridarea", "definepagegridspan", "definepageinjection", "definepageinjectionalternative", "definepageshift", "definepagestate", "definepairedbox", "defineparagraph", "defineparallel", "defineparbuilder", "definepositioning", "defineprefixset", "defineprocesscolor", "defineprocessor", "definepushbutton", "definepushsymbol", "definerenderingwindow", "defineresetset", "definescale", "definescript", "definesectionlevels", "defineselector", "defineseparatorset", "defineshift", "definesidebar", "definesort", "definespotcolor", "definestyleinstance", "definesubformula", "definesynonym", "definesystemattribute", "definesystemconstant", "definesystemvariable", "definetabulation", "definetextflow", "definetooltip", "definetransparency", "definetwopasslist", "definetypeface", "definetypescriptprefix", "definetypescriptsynonym", "definetypesetting", "defineunit", "defineviewerlayer", "definevspace", "definevspacing", "definevspacingamount", "definextable", "definieer", "definieeralineas", "definieerblok", "definieerbuffer", "definieercombinatie", "definieerconversie", "definieerfiguursymbool", "definieerfont", "definieerfontstijl", "definieerfontsynoniem", "definieerhbox", "definieeringesprongentext", "definieerinteractiemenu", "definieeritemgroep", "definieerkadertekst", "definieerkleur", "definieerkleurgroep", "definieerkolomovergang", "definieerkop", "definieerkorps", "definieerkorpsomgeving", "definieerlayer", "definieerlayout", "definieerletter", "definieerlijst", "definieermarkering", "definieeromlijnd", "definieeropmaak", "definieeroverlay", "definieerpaginaovergang", "definieerpalet", "definieerpapierformaat", "definieerplaats", "definieerplaatsblok", "definieerprofiel", "definieerprogramma", "definieerreferentie", "definieerreferentieformaat", "definieerregister", "definieersamengesteldelijst", "definieersectie", "definieersectieblok", "definieersorteren", "definieerstartstop", "definieersubveld", "definieersymbool", "definieersynoniemen", "definieertabelvorm", "definieertabulatie", "definieertekst", "definieertekstachtergrond", "definieertype", "definieertypen", "definieerveld", "definieerveldstapel", "definieerwiskundeuitlijnen", "delimited", "delimitedtext", "depthofstring", "depthonlybox", "depthspanningtext", "determinenoflines", "devanagarinumerals", "dfrac", "digits", "dimensiontocount", "directcolor", "directcolored", "directconvertedcounter", "directdummyparameter", "directgetboxllx", "directgetboxlly", "directhighlight", "directlocalframed", "directluacode", "directselect", "directsetbar", "directsetup", "directsymbol", "directvspacing", "dis", "disabledirectives", "disableexperiments", "disablemode", "disableoutputstream", "disableparpositions", "disableregime", "disabletrackers", "displaymath", "displaymathematics", "displaymessage", "distributedhsize", "dividedsize", "doadaptleftskip", "doadaptrightskip", "doaddfeature", "doassign", "doassignempty", "doboundtext", "docheckassignment", "docheckedpagestate", "docheckedpair", "documentvariable", "dodoubleargument", "dodoubleargumentwithset", "dodoubleempty", "dodoubleemptywithset", "dodoublegroupempty", "doeassign", "doexpandedrecurse", "dogetattribute", "dogetattributeid", "dogetcommacommandelement", "dogobbledoubleempty", "dogobblesingleempty", "doif", "doifMPgraphicelse", "doifallcommon", "doifallcommonelse", "doifalldefinedelse", "doifallmodes", "doifallmodeselse", "doifassignmentelse", "doifblackelse", "doifbothsides", "doifbothsidesoverruled", "doifboxelse", "doifbufferelse", "doifcolor", "doifcolorelse", "doifcommandhandler", "doifcommandhandlerelse", "doifcommon", "doifcommonelse", "doifcontent", "doifconversiondefinedelse", "doifconversionnumberelse", "doifcounter", "doifcounterelse", "doifcurrentfonthasfeatureelse", "doifdefined", "doifdefinedcounter", "doifdefinedcounterelse", "doifdefinedelse", "doifdimensionelse", "doifdimenstringelse", "doifdocumentargument", "doifdocumentargumentelse", "doifdocumentfilename", "doifdocumentfilenameelse", "doifdrawingblackelse", "doifelse", "doifelseMPgraphic", "doifelseallcommon", "doifelsealldefined", "doifelseallmodes", "doifelseassignment", "doifelseblack", "doifelsebox", "doifelsebuffer", "doifelsecolor", "doifelsecommandhandler", "doifelsecommon", "doifelseconversiondefined", "doifelseconversionnumber", "doifelsecounter", "doifelsecurrentfonthasfeature", "doifelsecurrentsortingused", "doifelsecurrentsynonymshown", "doifelsecurrentsynonymused", "doifelsedefined", "doifelsedefinedcounter", "doifelsedimension", "doifelsedimenstring", "doifelsedocumentargument", "doifelsedocumentfilename", "doifelsedrawingblack", "doifelseempty", "doifelseemptyvalue", "doifelseemptyvariable", "doifelseenv", "doifelsefastoptionalcheck", "doifelsefastoptionalcheckcs", "doifelsefieldbody", "doifelsefieldcategory", "doifelsefigure", "doifelsefile", "doifelsefiledefined", "doifelsefileexists", "doifelsefirstchar", "doifelseflagged", "doifelsefontchar", "doifelsefontpresent", "doifelsefontsynonym", "doifelsehasspace", "doifelsehelp", "doifelseincsname", "doifelseinelement", "doifelseinputfile", "doifelseinsertion", "doifelseinset", "doifelseinstring", "doifelseinsymbolset", "doifelseintoks", "doifelseintwopassdata", "doifelseitalic", "doifelselanguage", "doifelselayerdata", "doifelselayoutdefined", "doifelselayoutsomeline", "doifelselayouttextline", "doifelseleapyear", "doifelselist", "doifelselocation", "doifelselocfile", "doifelsemainfloatbody", "doifelsemarking", "doifelsemeaning", "doifelsemessage", "doifelsemode", "doifelsenextbgroup", "doifelsenextbgroupcs", "doifelsenextchar", "doifelsenextoptional", "doifelsenextoptionalcs", "doifelsenextparenthesis", "doifelsenonzeropositive", "doifelsenoteonsamepage", "doifelsenothing", "doifelsenumber", "doifelseobjectfound", "doifelseobjectreferencefound", "doifelseoddpage", "doifelseoddpagefloat", "doifelseoldercontext", "doifelseolderversion", "doifelseoverlapping", "doifelseoverlay", "doifelseparallel", "doifelseparentfile", "doifelsepath", "doifelsepathexists", "doifelsepatterns", "doifelseposition", "doifelsepositionaction", "doifelsepositiononpage", "doifelsepositionsonsamepage", "doifelsepositionsonthispage", "doifelsepositionsused", "doifelsereferencefound", "doifelserightpagefloat", "doifelserighttoleftinbox", "doifelsesamelinereference", "doifelsesamestring", "doifelsesetups", "doifelsesomebackground", "doifelsesomespace", "doifelsesomething", "doifelsesometoks", "doifelsestringinstring", "doifelsestructurelisthasnumber", "doifelsestructurelisthaspage", "doifelsesymboldefined", "doifelsesymbolset", "doifelsetext", "doifelsetextflow", "doifelsetextflowcollector", "doifelsetypingfile", "doifelseundefined", "doifelseurldefined", "doifelsevalue", "doifelsevaluenothing", "doifelsevariable", "doifempty", "doifemptyelse", "doifemptytoks", "doifemptyvalue", "doifemptyvalueelse", "doifemptyvariable", "doifemptyvariableelse", "doifenv", "doifenvelse", "doiffastoptionalcheckcselse", "doiffastoptionalcheckelse", "doiffieldbodyelse", "doiffieldcategoryelse", "doiffigureelse", "doiffile", "doiffiledefinedelse", "doiffileelse", "doiffileexistselse", "doiffirstcharelse", "doifflaggedelse", "doiffontcharelse", "doiffontpresentelse", "doiffontsynonymelse", "doifhasspaceelse", "doifhelpelse", "doifincsnameelse", "doifinelementelse", "doifinputfileelse", "doifinsertionelse", "doifinset", "doifinsetelse", "doifinstring", "doifinstringelse", "doifinsymbolset", "doifinsymbolsetelse", "doifintokselse", "doifintwopassdataelse", "doifitalicelse", "doiflanguageelse", "doiflayerdataelse", "doiflayoutdefinedelse", "doiflayoutsomelineelse", "doiflayouttextlineelse", "doifleapyearelse", "doiflistelse", "doiflocationelse", "doiflocfileelse", "doifmainfloatbodyelse", "doifmarkingelse", "doifmeaningelse", "doifmessageelse", "doifmode", "doifmodeelse", "doifnextbgroupcselse", "doifnextbgroupelse", "doifnextcharelse", "doifnextoptionalcselse", "doifnextoptionalelse", "doifnextparenthesiselse", "doifnonzeropositiveelse", "doifnot", "doifnotallcommon", "doifnotallmodes", "doifnotcommandhandler", "doifnotcommon", "doifnotcounter", "doifnotdocumentargument", "doifnotdocumentfilename", "doifnotempty", "doifnotemptyvalue", "doifnotemptyvariable", "doifnotenv", "doifnoteonsamepageelse", "doifnotescollected", "doifnotfile", "doifnotflagged", "doifnothing", "doifnothingelse", "doifnotinset", "doifnotinsidesplitfloat", "doifnotinstring", "doifnotmode", "doifnotnumber", "doifnotsamestring", "doifnotsetups", "doifnotvalue", "doifnotvariable", "doifnumber", "doifnumberelse", "doifobjectfoundelse", "doifobjectreferencefoundelse", "doifoddpageelse", "doifoddpagefloatelse", "doifoldercontextelse", "doifolderversionelse", "doifoverlappingelse", "doifoverlayelse", "doifparallelelse", "doifparentfileelse", "doifpathelse", "doifpathexistselse", "doifpatternselse", "doifposition", "doifpositionaction", "doifpositionactionelse", "doifpositionelse", "doifpositiononpageelse", "doifpositionsonsamepageelse", "doifpositionsonthispageelse", "doifpositionsusedelse", "doifreferencefoundelse", "doifrightpagefloatelse", "doifrighttoleftinboxelse", "doifsamelinereferenceelse", "doifsamestring", "doifsamestringelse", "doifsetups", "doifsetupselse", "doifsomebackground", "doifsomebackgroundelse", "doifsomespaceelse", "doifsomething", "doifsomethingelse", "doifsometoks", "doifsometokselse", "doifstringinstringelse", "doifstructurelisthasnumberelse", "doifstructurelisthaspageelse", "doifsymboldefinedelse", "doifsymbolsetelse", "doiftext", "doiftextelse", "doiftextflowcollectorelse", "doiftextflowelse", "doiftypingfileelse", "doifundefined", "doifundefinedcounter", "doifundefinedelse", "doifurldefinedelse", "doifvalue", "doifvalueelse", "doifvaluenothing", "doifvaluenothingelse", "doifvaluesomething", "doifvariable", "doifvariableelse", "doindentation", "dollar", "doloop", "doloopoverlist", "donothing", "dontconvertfont", "dontleavehmode", "dontpermitspacesbetweengroups", "doordefinieren", "doorlabelen", "doornummeren", "dopositionaction", "doprocesslocalsetups", "doquadrupleargument", "doquadrupleempty", "doquadruplegroupempty", "doquintupleargument", "doquintupleempty", "doquintuplegroupempty", "dorechecknextindentation", "dorecurse", "dorepeatwithcommand", "doreplacefeature", "doresetandafffeature", "doresetattribute", "dorotatebox", "dosetattribute", "dosetleftskipadaption", "dosetrightskipadaption", "dosetupcheckedinterlinespace", "doseventupleargument", "doseventupleempty", "dosingleargument", "dosingleempty", "dosinglegroupempty", "dosixtupleargument", "dosixtupleempty", "dostepwiserecurse", "dosubtractfeature", "dotfskip", "dotoks", "dotripleargument", "dotripleargumentwithset", "dotripleempty", "dotripleemptywithset", "dotriplegroupempty", "doublebar", "doublebond", "doublebrace", "doublebracket", "doubleparent", "dowith", "dowithnextbox", "dowithnextboxcontent", "dowithnextboxcontentcs", "dowithnextboxcs", "dowithpargument", "dowithrange", "dowithwargument", "dpofstring", "dummydigit", "dummyparameter", "dunnelijn", "dunnelijnen", "eTeX", "edefconvertedargument", "eenregel", "efcmaxheight", "efcmaxwidth", "efcminheight", "efcminwidth", "efcparameter", "effect", "elapsedseconds", "elapsedtime", "eleftarrowfill", "eleftharpoondownfill", "eleftharpoonupfill", "eleftrightarrowfill", "emphasisboldface", "emphasistypeface", "emspace", "enabledirectives", "enableexperiments", "enablemode", "enableoutputstream", "enableparpositions", "enableregime", "enabletrackers", "enskip", "enspace", "env", "envvar", "eoverbarfill", "eoverbracefill", "eoverbracketfill", "eoverparentfill", "epos", "equaldigits", "ergens", "erightarrowfill", "erightharpoondownfill", "erightharpoonupfill", "etwoheadrightarrowfill", "eunderbarfill", "eunderbracefill", "eunderbracketfill", "eunderparentfill", "executeifdefined", "exitloop", "exitloopnow", "expandcheckedcsname", "expanded", "expandfontsynonym", "externalfigurecollectionmaxheight", "externalfigurecollectionmaxwidth", "externalfigurecollectionminheight", "externalfigurecollectionminwidth", "externalfigurecollectionparameter", "externfiguur", "fakebox", "fastdecrement", "fastincrement", "fastlocalframed", "fastscale", "fastsetup", "fastsetupwithargument", "fastsetupwithargumentswapped", "fastswitchtobodyfont", "fastsxsy", "feature", "fence", "fenced", "fetchallmarkings", "fetchallmarks", "fetchmark", "fetchmarking", "fetchonemark", "fetchonemarking", "fetchruntinecommand", "fetchtwomarkings", "fetchtwomarks", "fieldbody", "fifthoffivearguments", "fifthofsixarguments", "figurefilename", "figurefilepath", "figurefiletype", "figurefullname", "figureheight", "figurenaturalheight", "figurenaturalwidth", "figuresymbol", "figurewidth", "figuur", "filename", "filledhboxb", "filledhboxc", "filledhboxg", "filledhboxk", "filledhboxm", "filledhboxr", "filledhboxy", "filler", "filterfromnext", "filterfromvalue", "filterpages", "filterreference", "findtwopassdata", "finishregisterentry", "firstcharacter", "firstcounter", "firstcountervalue", "firstoffivearguments", "firstoffourarguments", "firstofoneargument", "firstofoneunexpanded", "firstofsixarguments", "firstofthreearguments", "firstofthreeunexpanded", "firstoftwoarguments", "firstoftwounexpanded", "firstrealpage", "firstrealpagenumber", "firstsubcountervalue", "firstsubpage", "firstsubpagenumber", "firstuserpage", "firstuserpagenumber", "fitfieldframed", "fittopbaselinegrid", "flag", "floatuserdataparameter", "flushboxregister", "flushcollector", "flushlayer", "flushlocalfloats", "flushnextbox", "flushnotes", "flushoutputstream", "flushshapebox", "flushtextflow", "flushtokens", "flushtoks", "fontalternative", "fontbody", "fontchar", "fontcharbyindex", "fontclass", "fontclassname", "fontface", "fontfeaturelist", "fontsize", "fontstyle", "forcecharacterstripping", "forcelocalfloats", "forgeteverypar", "forgetparameters", "formula", "formulenummer", "foundbox", "fourthoffivearguments", "fourthoffourarguments", "fourthofsixarguments", "frac", "frameddimension", "framedparameter", "framedtext", "freezedimenmacro", "freezemeasure", "frenchspacing", "fromlinenote", "frozenhbox", "gdefconvertedargument", "gdefconvertedcommand", "gebruikJSscripts", "gebruikURL", "gebruikblokken", "gebruikexterndocument", "gebruikexternfiguur", "gebruikexterngeluidsfragment", "gebruikmodule", "gebruikpad", "gebruiksymbolen", "gebruiktypescript", "gebruiktypescriptfile", "gebruikurl", "geenbovenenonderregels", "geenhoofdenvoetregels", "geenspatie", "getMPdrawing", "getMPlayer", "getboxllx", "getboxlly", "getbufferdata", "getcommacommandsize", "getcommalistsize", "getdayoftheweek", "getdayspermonth", "getdefinedbuffer", "getdocumentargument", "getdocumentargumentdefault", "getdocumentfilename", "getdummyparameters", "getemptyparameters", "geteparameters", "getexpandedparameters", "getfiguredimensions", "getfirstcharacter", "getfirsttwopassdata", "getfromcommacommand", "getfromcommalist", "getfromtwopassdata", "getglyphdirect", "getglyphstyled", "getgparameters", "getlasttwopassdata", "getlocalfloat", "getlocalfloats", "getmessage", "getnamedglyphdirect", "getnamedglyphstyled", "getnamedtwopassdatalist", "getnaturaldimensions", "getnoflines", "getobject", "getobjectdimensions", "getpaletsize", "getparameters", "getprivatechar", "getprivateslot", "getrandomcount", "getrandomdimen", "getrandomfloat", "getrandomnumber", "getrandomseed", "getraweparameters", "getrawgparameters", "getrawnoflines", "getrawparameters", "getrawxparameters", "getreference", "getreferenceentry", "getroundednoflines", "getsubstring", "gettwopassdata", "gettwopassdatalist", "getuvalue", "getvalue", "getvariable", "getvariabledefault", "getxparameters", "globaldisablemode", "globalenablemode", "globalletempty", "globalpopbox", "globalpopmacro", "globalpreventmode", "globalprocesscommalist", "globalpushbox", "globalpushmacro", "globalswapcounts", "globalswapdimens", "globalswapmacros", "globalundefine", "glyphfontfile", "gobbledoubleempty", "gobbleeightarguments", "gobblefivearguments", "gobblefiveoptionals", "gobblefourarguments", "gobblefouroptionals", "gobbleninearguments", "gobbleoneargument", "gobbleoneoptional", "gobblesevenarguments", "gobblesingleempty", "gobblesixarguments", "gobblespacetokens", "gobbletenarguments", "gobblethreearguments", "gobblethreeoptionals", "gobbletwoarguments", "gobbletwooptionals", "gobbleuntil", "gobbleuntilrelax", "grabbufferdata", "grabbufferdatadirect", "grabuntil", "grafiek", "grayvalue", "greedysplitstring", "greeknumerals", "grijskleur", "groupedcommand", "gsetboxllx", "gsetboxlly", "gujaratinumerals", "gurmurkhinumerals", "haalbuffer", "haalmarkering", "haarlijn", "hairspace", "halfwaybox", "handhaafblokken", "handletokens", "handwritten", "hash", "hboxofvbox", "hboxreference", "hdofstring", "headhbox", "headnumbercontent", "headnumberdistance", "headnumberwidth", "headreferenceattributes", "headsetupspacing", "headtextcontent", "headtextdistance", "headtextwidth", "headvbox", "headwidth", "heightanddepthofstring", "heightofstring", "heightspanningtext", "helptekst", "helptext", "hglue", "hiddenbar", "hiddencitation", "hiddencite", "highlight", "highordinalstr", "hilo", "himilo", "hl", "hoofdstuk", "hoofdtaal", "hoog", "horizontalgrowingbar", "horizontalpositionbar", "hphantom", "hpos", "hsizefraction", "hsmash", "hsmashbox", "hsmashed", "hspace", "htdpofstring", "htofstring", "huidigedatum", "huidigekopnummer", "hyphen", "hyphenatedcoloredword", "hyphenatedfile", "hyphenatedfilename", "hyphenatedhbox", "hyphenatedpar", "hyphenatedurl", "hyphenatedword", "ibox", "ifassignment", "iff", "ifinobject", "ifinoutputstream", "ifparameters", "iftrialtypesetting", "ignoreimplicitspaces", "ignorevalue", "immediatesavetwopassdata", "impliedby", "implies", "in", "includemenu", "includeversioninfo", "increment", "incrementcounter", "incrementedcounter", "incrementpagenumber", "incrementsubpagenumber", "incrementvalue", "indentation", "infofont", "infofontbold", "inheritparameter", "inhibitblank", "initializeboxstack", "inlijnd", "inlinebuffer", "inlinedbox", "inlinemath", "inlinemathematics", "inlinemessage", "inlineordisplaymath", "inlinerange", "innerflushshapebox", "input", "inputfilebarename", "inputfilename", "inputfilerealsuffix", "inputfilesuffix", "inputgivenfile", "inregel", "insertpages", "installactionhandler", "installactivecharacter", "installanddefineactivecharacter", "installattributestack", "installautocommandhandler", "installautosetuphandler", "installbasicautosetuphandler", "installbasicparameterhandler", "installbottomframerenderer", "installcommandhandler", "installcorenamespace", "installdefinehandler", "installdefinitionset", "installdefinitionsetmember", "installdirectcommandhandler", "installdirectparameterhandler", "installdirectparametersethandler", "installdirectsetuphandler", "installdirectstyleandcolorhandler", "installeertaal", "installframedautocommandhandler", "installframedcommandhandler", "installleftframerenderer", "installnamespace", "installoutputroutine", "installpagearrangement", "installparameterhandler", "installparameterhashhandler", "installparametersethandler", "installparentinjector", "installrightframerenderer", "installrootparameterhandler", "installsetuphandler", "installsetuponlycommandhandler", "installshipoutmethod", "installsimplecommandhandler", "installsimpleframedcommandhandler", "installstyleandcolorhandler", "installswitchcommandhandler", "installswitchsetuphandler", "installtexdirective", "installtextracker", "installtopframerenderer", "installunitsseparator", "installunitsspace", "installversioninfo", "integerrounding", "interactiebalk", "interactiebuttons", "interactiemenu", "intermezzo", "intertext", "invokepageheandler", "invullijnen", "invulregel", "invultekst", "inwilijnd", "istltdir", "istrtdir", "italic", "italicbold", "italiccorrection", "items", "itemtag", "jobfilename", "jobfilesuffix", "kadertekst", "kap", "keeplinestogether", "keepunwantedspaces", "kerncharacters", "kleur", "kleurenbalk", "kleurwaarde", "kloonveld", "kolom", "kopnummer", "koreancirclenumerals", "koreannumerals", "koreannumeralsc", "koreannumeralsp", "koreanparentnumerals", "laag", "laho", "languageCharacters", "languagecharacters", "languagecharwidth", "lastcounter", "lastcountervalue", "lastdigit", "lastlinewidth", "lastnaturalboxdp", "lastnaturalboxht", "lastnaturalboxwd", "lastpredefinedsymbol", "lastrealpage", "lastrealpagenumber", "lastsubcountervalue", "lastsubpage", "lastsubpagenumber", "lasttwodigits", "lastuserpage", "lastuserpagenumber", "lateluacode", "layeredtext", "layerheight", "layerwidth", "lazysavetaggedtwopassdata", "lazysavetwopassdata", "lbox", "left", "leftbottombox", "leftbox", "lefthbox", "leftorrighthbox", "leftorrightvbox", "leftorrightvtop", "leftskipadaption", "leftsubguillemot", "lefttopbox", "lefttorighthbox", "lefttorightvbox", "lefttorightvtop", "legeregels", "letbeundefined", "letcatcodecommand", "letcscsname", "letcsnamecs", "letcsnamecsname", "letdummyparameter", "letempty", "letgvalue", "letgvalueempty", "letgvalurelax", "letter", "letterampersand", "letterat", "letterbackslash", "letterbar", "letterbgroup", "letterclosebrace", "lettercolon", "letterdollar", "letterdoublequote", "letteregroup", "letterescape", "letterexclamationmark", "letterhash", "letterhat", "letterleftbrace", "letterless", "lettermore", "letteropenbrace", "letterpercent", "letterquestionmark", "letterrightbrace", "letters", "lettersinglequote", "letterslash", "letterspacing", "lettertilde", "letterunderscore", "letvalue", "letvalueempty", "letvaluerelax", "lfence", "lhbox", "lijndikte", "lijstlengte", "limitatelines", "limitatetext", "limtatefirstline", "linespanningtext", "listcitation", "listcite", "listnamespaces", "llap", "loadanyfile", "loadanyfileonce", "loadbtxdefinitionfile", "loadbtxreplacementfile", "loadcldfile", "loadcldfileonce", "loadfontgoodies", "loadluafile", "loadluafileonce", "loadspellchecklist", "loadtexfile", "loadtexfileonce", "loadtypescriptfile", "localframed", "localframedwithsettings", "localhsize", "localpopbox", "localpopmacro", "localpushbox", "localpushmacro", "localundefine", "locatedfilepath", "locatefilepath", "locfilename", "lomihi", "lowerbox", "lowercased", "lowercasestring", "lowerleftdoubleninequote", "lowerleftsingleninequote", "lowerrightdoubleninequote", "lowerrightsingleninequote", "lrtbbox", "ltop", "luaTeX", "luacode", "luaconditional", "luaenvironment", "luaexpanded", "luafunction", "luajitTeX", "luamajorversion", "luaminorversion", "luaparameterset", "luasetup", "luaversion", "m", "mLeftarrow", "mLeftrightarrow", "mRightarrow", "maand", "makecharacteractive", "makerawcommalist", "makestrutofbox", "mapfontsize", "margindata", "markcontent", "markeer", "markinjector", "mat", "math", "mathbf", "mathbi", "mathblackboard", "mathbs", "mathcommand", "mathdefault", "mathfraktur", "mathfunction", "mathit", "mathitalic", "mathop", "mathrm", "mathscript", "mathsl", "mathss", "mathtext", "mathtextbf", "mathtextbi", "mathtextbs", "mathtextit", "mathtextsl", "mathtexttf", "mathtf", "mathtriplet", "mathtt", "mathupright", "mathword", "mathwordbf", "mathwordbi", "mathwordbs", "mathwordit", "mathwordsl", "mathwordtf", "mbox", "mcframed", "md", "measure", "measured", "medskip", "medspace", "menubutton", "mequal", "message", "metaTeX", "mfence", "mfunction", "mfunctionlabeltext", "mhbox", "mhookleftarrow", "mhookrightarrow", "middle", "middlebox", "midhbox", "minimalhbox", "mixedcaps", "mkvibuffer", "mleftarrow", "mleftharpoondown", "mleftharpoonup", "mleftrightarrow", "mleftrightharpoons", "mmapsto", "moduleparameter", "molecule", "mono", "monobold", "mononormal", "monthlong", "monthshort", "mp", "mprandomnumber", "mrel", "mrightarrow", "mrightharpoondown", "mrightharpoonup", "mrightleftharpoons", "mrightoverleftarrow", "mtext", "mtriplerel", "mtwoheadleftarrow", "mtwoheadrightarrow", "naar", "naarbox", "naarpagina", "namedheadnumber", "namedstructureheadlocation", "namedstructureuservariable", "namedstructurevariable", "namedtaggedlabeltexts", "naturalhbox", "naturalhpack", "naturalvbox", "naturalvcenter", "naturalvpack", "naturalvtop", "naturalwd", "negatecolorbox", "negated", "negthinspace", "newattribute", "newcatcodetable", "newcounter", "newevery", "newfrenchspacing", "newmode", "newsignal", "newsystemmode", "nextbox", "nextboxdp", "nextboxht", "nextboxhtdp", "nextboxwd", "nextcounter", "nextcountervalue", "nextdepth", "nextparagraphs", "nextrealpage", "nextrealpagenumber", "nextsubcountervalue", "nextsubpage", "nextsubpagenumber", "nextuserpage", "nextuserpagenumber", "nobar", "nocitation", "nocite", "nodetostring", "noffigurepages", "noflines", "noflocalfloats", "noindentation", "noitem", "nokap", "nonfrenchspacing", "nonmathematics", "noot", "normal", "normalboldface", "normalframedwithsettings", "normalizebodyfontsize", "normalizedfontsize", "normalizefontdepth", "normalizefontheight", "normalizefontline", "normalizefontwidth", "normalizetextdepth", "normalizetextheight", "normalizetextline", "normalizetextwidth", "normaltypeface", "notesymbol", "ntimes", "numberofpoints", "obeydepth", "objectdepth", "objectheight", "objectmargin", "objectwidth", "obox", "offset", "offsetbox", "omgeving", "omlaag", "omlijnd", "onbekend", "onderdeel", "onderwerp", "onedigitrounding", "op", "oppagina", "opsomming", "ordinaldaynumber", "ordinalstr", "ornamenttext", "outputfilename", "outputstreambox", "outputstreamcopy", "outputstreamunvbox", "outputstreamunvcopy", "over", "overbar", "overbars", "overbartext", "overbarunderbar", "overbrace", "overbracetext", "overbraceunderbrace", "overbracket", "overbrackettext", "overbracketunderbracket", "overlaybutton", "overlaycolor", "overlaydepth", "overlayfigure", "overlayheight", "overlaylinecolor", "overlaylinewidth", "overlayoffset", "overlayrollbutton", "overlaywidth", "overleftarrow", "overleftharpoondown", "overleftharpoonup", "overleftrightarrow", "overloaderror", "overparent", "overparenttext", "overparentunderparent", "overrightarrow", "overrightharpoondown", "overrightharpoonup", "overset", "overstrike", "overstrikes", "overtwoheadleftarrow", "overtwoheadrightarrow", "pagearea", "pagebreak", "pagefigure", "pagegridspanwidth", "pageinjection", "pagestaterealpage", "pagina", "paginanummer", "paginareferentie", "paletsize", "paragraaf", "paslayoutaan", "passendveld", "pdfTeX", "pdfactualtext", "pdfbackendactualtext", "pdfbackendcurrentresources", "pdfbackendsetcatalog", "pdfbackendsetcolorspace", "pdfbackendsetextgstate", "pdfbackendsetinfo", "pdfbackendsetname", "pdfbackendsetpageattribute", "pdfbackendsetpageresource", "pdfbackendsetpagesattribute", "pdfbackendsetpattern", "pdfbackendsetshade", "pdfcolor", "pdfeTeX", "percent", "percentdimen", "permitcaretescape", "permitcircumflexescape", "permitspacesbetweengroups", "persiandecimals", "persiannumerals", "phantom", "phantombox", "pickupgroupedcommand", "plaatsbookmarks", "plaatsformule", "plaatskopnummer", "plaatskoptekst", "plaatslijst", "plaatslijstmetsynoniemen", "plaatslokalevoetnoten", "plaatsnaastelkaar", "plaatsonderelkaar", "plaatsopgrid", "plaatspaginanummer", "plaatsplaatsblok", "plaatsregister", "plaatsruwelijst", "plaatssamengesteldelijst", "plaatssubformule", "plaatsvoetnoten", "placeattachments", "placebtxrendering", "placecitation", "placecomments", "placecurrentformulanumber", "placedbox", "placefloatwithsetups", "placeframed", "placehelp", "placeinitial", "placelayer", "placelayeredtext", "placelistofpublications", "placelistofsorts", "placelocalnotes", "placement", "placenamedfloat", "placenamedformula", "placenotes", "placepairedbox", "placeparallel", "placerenderingwindow", "popattribute", "popmacro", "popmode", "popsystemmode", "positioneer", "positionoverlay", "positionregionoverlay", "postponenotes", "predefinedfont", "predefinefont", "predefinesymbol", "prefixedpagenumber", "prependetoks", "prependgvalue", "prependtocommalist", "prependtoks", "prependtoksonce", "prependvalue", "presetdocument", "presetfieldsymbols", "pretocommalist", "prevcounter", "prevcountervalue", "preventmode", "prevrealpage", "prevrealpagenumber", "prevsubcountervalue", "prevsubpage", "prevsubpagenumber", "prevuserpage", "prevuserpagenumber", "procent", "processMPbuffer", "processMPfigurefile", "processaction", "processallactionsinset", "processassignlist", "processassignmentcommand", "processassignmentlist", "processbetween", "processbodyfontenvironmentlist", "processcolorcomponents", "processcommacommand", "processcommalist", "processcommalistwithparameters", "processcontent", "processfile", "processfilemany", "processfilenone", "processfileonce", "processfirstactioninset", "processisolatedchars", "processisolatedwords", "processlinetablebuffer", "processlinetablefile", "processlist", "processmonth", "processranges", "processseparatedlist", "processtexbuffer", "processtokens", "processuntil", "processxtablebuffer", "processyear", "produkt", "profiledbox", "profilegivenbox", "programma", "projekt", "pseudoMixedCapped", "pseudoSmallCapped", "pseudoSmallcapped", "pseudosmallcapped", "punten", "purenumber", "pushattribute", "pushbutton", "pushmacro", "pushmode", "pushoutputstream", "pushsystemmode", "qquad", "quad", "quads", "quitcommalist", "quitprevcommalist", "quittypescriptscanning", "raisebox", "randomizetext", "randomnumber", "rawcounter", "rawcountervalue", "rawdate", "rawdoifelseinset", "rawdoifinset", "rawdoifinsetelse", "rawgetparameters", "rawprocessaction", "rawprocesscommacommand", "rawprocesscommalist", "rawstructurelistuservariable", "rawsubcountervalue", "rbox", "readfile", "readfixfile", "readjobfile", "readlocfile", "readsetfile", "readsysfile", "readtexfile", "readxmlfile", "realSmallCapped", "realSmallcapped", "realpagenumber", "realsmallcapped", "recursedepth", "recurselevel", "recursestring", "redoconvertfont", "ref", "refereer", "referenceprefix", "referentie", "registerattachment", "registerctxluafile", "registerexternalfigure", "registerfontclass", "registerhyphenationexception", "registerhyphenationpattern", "registermenubuttons", "registersort", "registersynonym", "registerunit", "regular", "relatemarking", "relateparameterhandlers", "relaxvalueifundefined", "remainingcharacters", "removebottomthings", "removedepth", "removefromcommalist", "removelastskip", "removelastspace", "removemarkedcontent", "removepunctuation", "removesubstring", "removetoks", "removeunwantedspaces", "replacefeature", "replaceincommalist", "replaceword", "rescan", "rescanwithsetup", "resetMPdrawing", "resetMPenvironment", "resetMPinstance", "resetallattributes", "resetandaddfeature", "resetbar", "resetbreakpoints", "resetbuffer", "resetcharacteralign", "resetcharacterkerning", "resetcharacterspacing", "resetcharacterstripping", "resetcollector", "resetcounter", "resetdigitsmanipulation", "resetdirection", "resetfeature", "resetflag", "resetfontcolorsheme", "resetfontfallback", "resetfontsolution", "resethyphenationfeatures", "resetinjector", "resetinteractionmenu", "resetitaliccorrection", "resetlayer", "resetlocalfloats", "resetmarker", "resetmarkering", "resetmode", "resetpagenumber", "resetparallel", "resetpath", "resetpenalties", "resetprofile", "resetreference", "resetreplacement", "resetscript", "resetsetups", "resetshownsynonyms", "resetsubpagenumber", "resetsymbolset", "resetsystemmode", "resettimer", "resettrackers", "resettrialtypesetting", "resetusedsortings", "resetusedsynonyms", "resetuserpagenumber", "resetvalue", "resetvisualizers", "reshapebox", "resolvedglyphdirect", "resolvedglyphstyled", "restartcounter", "restorebox", "restorecatcodes", "restorecounter", "restorecurrentattributes", "restoreendofline", "restoreglobalbodyfont", "reusableMPgraphic", "reuseMPgraphic", "reuserandomseed", "revivefeature", "rfence", "rhbox", "right", "rightbottombox", "rightbox", "righthbox", "rightorleftpageaction", "rightskipadaption", "rightsubguillemot", "righttolefthbox", "righttoleftvbox", "righttoleftvtop", "righttopbox", "rlap", "robustaddtocommalist", "robustdoifelseinset", "robustdoifinsetelse", "robustpretocommalist", "rollbutton", "roman", "romeins", "rooster", "roteer", "rtop", "ruledhbox", "ruledhpack", "ruledmbox", "ruledtopv", "ruledtpack", "ruledvbox", "ruledvpack", "ruledvtop", "runMPbuffer", "runninghbox", "safechar", "sans", "sansbold", "sansnormal", "sansserif", "savebox", "savebtxdataset", "savecounter", "savecurrentattributes", "savenormalmeaning", "savetaggedtwopassdata", "savetwopassdata", "sbox", "schaal", "scherm", "schrijfnaarlijst", "schrijftussenlijst", "sd", "secondoffivearguments", "secondoffourarguments", "secondofsixarguments", "secondofthreearguments", "secondofthreeunexpanded", "secondoftwoarguments", "secondoftwounexpanded", "select", "selecteerblokken", "serializecommalist", "serializedcommalist", "serif", "serifbold", "serifnormal", "setJSpreamble", "setMPlayer", "setMPpositiongraphic", "setMPpositiongraphicrange", "setMPtext", "setMPvariable", "setMPvariables", "setbar", "setbigbodyfont", "setboxllx", "setboxlly", "setbreakpoints", "setcapstrut", "setcatcodetable", "setcharacteralign", "setcharactercasing", "setcharactercleaning", "setcharacterkerning", "setcharacterspacing", "setcharacterstripping", "setcharstrut", "setcollector", "setcolormodell", "setcounter", "setcounterown", "setcurrentfontclass", "setdataset", "setdefaultpenalties", "setdigitsmanipulation", "setdirection", "setdocumentargument", "setdocumentargumentdefault", "setdocumentfilename", "setdummyparameter", "setelementexporttag", "setemeasure", "setevalue", "setevariable", "setevariables", "setfirstline", "setflag", "setfont", "setfontcolorsheme", "setfontfeature", "setfontsolution", "setfontstrut", "setfractions", "setgmeasure", "setgvalue", "setgvariable", "setgvariables", "sethboxregister", "sethyphenatedurlafter", "sethyphenatedurlbefore", "sethyphenatedurlnormal", "sethyphenationfeatures", "setinitial", "setinjector", "setinteraction", "setinterfacecommand", "setinterfaceconstant", "setinterfaceelements", "setinterfacemessage", "setinterfacevariable", "setinternalrendering", "setitaliccorrection", "setlayer", "setlayerframed", "setlayertext", "setlinefiller", "setlocalhsize", "setmainbodyfont", "setmainparbuilder", "setmarker", "setmarking", "setmathstyle", "setmeasure", "setmessagetext", "setmode", "setnostrut", "setnote", "setnotetext", "setobject", "setoldstyle", "setpagegrid", "setpagereference", "setpagestate", "setpagestaterealpageno", "setpenalties", "setpercentdimen", "setposition", "setpositionbox", "setpositiondata", "setpositiondataplus", "setpositiononly", "setpositionplus", "setpositionstrut", "setprofile", "setrandomseed", "setreference", "setreferencedobject", "setregisterentry", "setreplacement", "setrigidcolumnbalance", "setrigidcolumnhsize", "setscript", "setsectionblock", "setsimplecolumnhsize", "setsmallbodyfont", "setsmallcaps", "setstackbox", "setstructurepageregister", "setstrut", "setsuperiors", "setsystemmode", "settabular", "settaggedmetadata", "settightobject", "settightreferencedobject", "settightunreferencedobject", "settrialtypesetting", "setuevalue", "setugvalue", "setunreferencedobject", "setup", "setupMPgraphics", "setupMPinstance", "setupMPpage", "setupMPvariables", "setupTABLE", "setupTEXpage", "setupattachment", "setupbackend", "setupbar", "setupbleeding", "setupbookmark", "setupbtx", "setupbtxdataset", "setupbtxlist", "setupbtxregister", "setupbtxrendering", "setupbutton", "setupcharacterkerning", "setupcharacterspacing", "setupchemical", "setupchemicalframed", "setupcollector", "setupcolumnspan", "setupcombination", "setupcounter", "setupdataset", "setupdelimitedtext", "setupdirections", "setupdocument", "setupeffect", "setupenv", "setupexport", "setupexternalfigure", "setupexternalsoundtracks", "setupfieldbody", "setupfieldcategory", "setupfieldcontentframed", "setupfieldlabelframed", "setupfieldtotalframed", "setupfiller", "setupfirstline", "setupfittingpage", "setupfloatcaption", "setupfontexpansion", "setupfontprotrusion", "setupfonts", "setupfontsolution", "setupformulaframed", "setupframedcontent", "setupglobalreferenceprefix", "setupheadalternative", "setuphelp", "setuphigh", "setuphighlight", "setuphyphenation", "setupinitial", "setupinsertion", "setupitaliccorrection", "setuplabel", "setuplayer", "setuplayeredtext", "setuplayouttext", "setuplinefiller", "setuplinefillers", "setuplinenote", "setuplinetable", "setuplistalternative", "setuplistextra", "setuplocalfloats", "setuplocalinterlinespace", "setuplow", "setuplowhigh", "setuplowmidhigh", "setupmarginframed", "setupmarginrule", "setupmathcases", "setupmathematics", "setupmathfence", "setupmathfraction", "setupmathframed", "setupmathmatrix", "setupmathornament", "setupmathradical", "setupmathstackers", "setupmathstyle", "setupmixedcolumns", "setupmodule", "setupnotation", "setupnotations", "setupnote", "setupnotes", "setupoffset", "setupoffsetbox", "setupoutputroutine", "setuppagechecker", "setuppagegrid", "setuppagegridarea", "setuppagegridareatext", "setuppagegridlines", "setuppagegridspan", "setuppagegridstart", "setuppageinjection", "setuppageinjectionalternative", "setuppageshift", "setuppagestate", "setuppairedbox", "setupparagraph", "setupparagraphintro", "setupparallel", "setupperiods", "setuppositionbar", "setupprocessor", "setupprofile", "setupquotation", "setuprealpagenumber", "setupreferenceformat", "setupreferenceprefix", "setupreferencestructureprefix", "setupregisters", "setuprenderingwindow", "setups", "setupscale", "setupscript", "setupscripts", "setupselector", "setupshift", "setupsidebar", "setupspellchecking", "setupstretched", "setupstruts", "setupstyle", "setupsubformula", "setuptabulation", "setuptagging", "setuptextflow", "setuptooltip", "setupunit", "setupuserpagenumber", "setupversion", "setupviewerlayer", "setupvspacing", "setupwithargument", "setupwithargumentswapped", "setupxml", "setupxtable", "setuvalue", "setuxvalue", "setvalue", "setvariable", "setvariables", "setvboxregister", "setvisualizerfont", "setvtopregister", "setwidthof", "setxmeasure", "setxvalue", "setxvariable", "setxvariables", "sfrac", "shapedhbox", "showallmakeup", "showattributes", "showboxes", "showbtxdatasetauthors", "showbtxdatasetcompleteness", "showbtxdatasetfields", "showbtxfields", "showbtxhashedauthors", "showbtxtables", "showchardata", "showcharratio", "showcolorbar", "showcolorcomponents", "showcolorset", "showcolorstruts", "showcounter", "showdirectives", "showdirsinmargin", "showedebuginfo", "showexperiments", "showfont", "showfontdata", "showfontkerns", "showfontparameters", "showfontstrip", "showfontstyle", "showglyphs", "showgridsnapping", "showhelp", "showhyphenationtrace", "showhyphens", "showinjector", "showjustification", "showkerning", "showlayoutcomponents", "showligature", "showligatures", "showlogcategories", "showmargins", "showmessage", "showminimalbaseline", "shownextbox", "showotfcomposition", "showparentchain", "showsetupsdefinition", "showtimer", "showtokens", "showtrackers", "showvalue", "showvariable", "showwarning", "simplegroupedcommand", "singalcharacteralign", "singlebond", "sixthofsixarguments", "slanted", "slantedbold", "slicepages", "slovenianNumerals", "sloveniannumerals", "small", "smallbodyfont", "smallbold", "smallbolditalic", "smallboldslanted", "smallcappedcharacters", "smallcappedromannumerals", "smaller", "smallitalicbold", "smallnormal", "smallskip", "smallslanted", "smallslantedbold", "smalltype", "smash", "smashbox", "smashboxed", "smashedhbox", "smashedvbox", "snaptogrid", "som", "someheadnumber", "somekindoftab", "somelocalfloat", "somenamedheadnumber", "someplace", "sp", "spanishNumerals", "spanishnumerals", "spatie", "speech", "spiegel", "splitatasterisk", "splitatcolon", "splitatcolons", "splitatcomma", "splitdfrac", "splitfilename", "splitfrac", "splitoffbase", "splitofffull", "splitoffkind", "splitoffname", "splitoffpath", "splitoffroot", "splitofftokens", "splitofftype", "splitsplaatsblok", "splitstring", "spraak", "spreadhbox", "sqrt", "stackrel", "startJScode", "startJSpreamble", "startMPclip", "startMPcode", "startMPdefinitions", "startMPdrawing", "startMPenvironment", "startMPextensions", "startMPinclusions", "startMPinitializations", "startMPpage", "startMPpositiongraphic", "startMPpositionmethod", "startMPrun", "startTABLE", "startTABLEbody", "startTABLEfoot", "startTABLEhead", "startTABLEnext", "startTC", "startTD", "startTDs", "startTEXpage", "startTH", "startTN", "startTR", "startTRs", "startTX", "startTY", "startaanhangsel", "startachtergrond", "startallmodes", "startarrangedpages", "startaside", "startattachment", "startbar", "startbinom", "startbitmapimage", "startblockquote", "startblokcitaat", "startbtxrenderingdefinitions", "startbuffer", "startbutton", "startcatcodetable", "startcharacteralign", "startcheckedfences", "startchemical", "startcitaat", "startciteer", "startcollect", "startcollecting", "startcolorintent", "startcoloronly", "startcolorset", "startcolumns", "startcolumnspan", "startcombination", "startcomment", "startcommentaar", "startcontextcode", "startcontextdefinitioncode", "startctxfunction", "startctxfunctiondefinition", "startcurrentcolor", "startcurrentlistentrywrapper", "startdbinom", "startdelimited", "startdelimitedtext", "startdfrac", "startdisplaymath", "startdmath", "startdocument", "startdoorstreep", "startdoorstrepen", "starteffect", "startelement", "startembeddedxtable", "startendofline", "startexceptions", "startexpanded", "startexpandedcollect", "startextendedcatcodetable", "startexternalfigurecollection", "startfigure", "startfiguur", "startfitfieldframed", "startfittingpage", "startfloatcombination", "startfont", "startfontclass", "startfontsolution", "startformula", "startformulas", "startfrac", "startframedcontent", "startframedtext", "startgrafiek", "startgridsnapping", "starthbox", "starthboxestohbox", "starthboxregister", "starthelptekst", "starthelptext", "starthiddenbar", "starthiding", "starthighlight", "starthoofdstuk", "starthyphenation", "startimath", "startindentation", "startindentedtext", "startinmframed", "startinteractiemenu", "startinteraction", "startinterface", "startintermezzo", "startintertext", "startitemgroup", "startkadertekst", "startkantlijn", "startkleur", "startknockout", "startkop", "startlayout", "startlinefiller", "startlinenumbering", "startlinetable", "startlinetablebody", "startlinetablecell", "startlinetablehead", "startlocalheadsetup", "startlocallinecorrection", "startlocalnotes", "startlocalsetups", "startlokalevoetnoten", "startlua", "startluacode", "startluaparameterset", "startluasetups", "startmakeup", "startmargeblok", "startmarkedcontent", "startmathmode", "startmathstyle", "startmatrices", "startmcframed", "startmdformula", "startmframed", "startmixedcolumns", "startmode", "startmodeset", "startmodule", "startmoduletestsection", "startmpformula", "startnaar", "startnamedsection", "startnamedsubformulas", "startnarrow", "startnarrower", "startnegative", "startnicelyfilledbox", "startnobar", "startnointerference", "startnotallmodes", "startnotext", "startnotmode", "startomgeving", "startomlijnd", "startonderdeel", "startonderstreep", "startonderstrepen", "startonderwerp", "startopelkaar", "startopposite", "startopsomming", "startoutputstream", "startoverlay", "startoverprint", "startoverstreep", "startoverstrepen", "startpagecomment", "startpagefigure", "startpagegrid", "startpagegridspan", "startpagelayout", "startpar", "startparagraaf", "startparagraph", "startparagraphs", "startparagraphscell", "startparbuilder", "startpath", "startplaatsformule", "startplacepairedbox", "startpositioning", "startpositionoverlay", "startpositive", "startpostponing", "startprocessassignmentcommand", "startprocessassignmentlist", "startprocesscommacommand", "startprocesscommalist", "startprodukt", "startprojekt", "startprotect", "startprotectedcolors", "startpublicatie", "startpunctuation", "startrandomized", "startrandomseed", "startrawsetups", "startreadingfile", "startreferenceprefix", "startregel", "startregelcorrectie", "startregime", "startregister", "startreusableMPgraphic", "startscript", "startsdformula", "startsectionblock", "startsectionblockenvironment", "startsectionlevel", "startsetups", "startsfrac", "startshapebox", "startshift", "startsidebar", "startsimplecolumns", "startsom", "startspecialitem", "startspeech", "startspformula", "startspraak", "startspread", "startstartstop", "startstaticMPfigure", "startstaticMPgraphic", "startstrictinspectnextcharacter", "startstructurepageregister", "startstrut", "startstyle", "startsubformulas", "startsubjectlevel", "startsubonderwerp", "startsubparagraaf", "startsubsentence", "startsubstack", "startsubsubonderwerp", "startsubsubparagraaf", "startsubsubsubonderwerp", "startsubsubsubparagraaf", "startsubsubsubsubonderwerp", "startsubsubsubsubparagraaf", "startsymbolset", "starttabel", "starttable", "starttablehead", "starttables", "starttabletail", "starttabulate", "starttabulatehead", "starttabulatetail", "starttagged", "starttbinom", "starttekstachtergrond", "starttekstlijn", "starttexcode", "starttexdefinition", "starttext", "starttextbackgroundmanual", "starttextcolor", "starttextcolorintent", "starttextflow", "starttitel", "starttokens", "starttransparent", "starttypescript", "starttypescriptcollection", "startunderdash", "startunderdashes", "startunderdot", "startunderdots", "startunderrandom", "startunderrandoms", "startunderstrike", "startunderstrikes", "startunframed", "startuniqueMPgraphic", "startuniqueMPpagegraphic", "startunpacked", "startusableMPgraphic", "startuseMPgraphic", "startusemathstyleparameter", "startusingbtxspecification", "startvbox", "startvboxregister", "startvboxtohbox", "startvboxtohboxseparator", "startviewerlayer", "startvtop", "startvtopregister", "startxcell", "startxcellgroup", "startxfrac", "startxgroup", "startxmldisplayverbatim", "startxmlinlineverbatim", "startxmlraw", "startxmlsetups", "startxrow", "startxrowgroup", "startxtable", "startxtablebody", "startxtablefoot", "startxtablehead", "startxtablenext", "startxxfrac", "stelachtergrondenin", "stelachtergrondin", "stelalineasin", "stelarrangerenin", "stelblankoin", "stelblokin", "stelblokjesin", "stelblokkopjein", "stelbovenin", "stelboventekstenin", "stelbufferin", "stelciterenin", "stelclipin", "stelcommentaarin", "steldoordefinierenin", "steldoornummerenin", "steldunnelijnenin", "stelformulein", "stelformulierenin", "stelhoofdin", "stelhoofdtekstenin", "stelingesprongentextin", "stelinmargein", "stelinspringenin", "stelinteractiebalkin", "stelinteractiein", "stelinteractiemenuin", "stelinteractieschermin", "stelinterliniein", "stelinvullijnenin", "stelinvulregelsin", "stelitemgroepin", "stelitemsin", "stelkadertekstin", "stelkantlijnin", "stelkapitalenin", "stelkleurenin", "stelkleurin", "stelkolommenin", "stelkopin", "stelkopnummerin", "stelkoppeltekenin", "stelkoppenin", "stelkorpsin", "stellayoutin", "stellijndiktein", "stellijstin", "stelmargeblokkenin", "stelmarkeringin", "stelnaastplaatsenin", "stelomlijndin", "stelonderin", "stelondertekstenin", "stelopmaakin", "stelopsommingenin", "stelpaginacommentaarin", "stelpaginanummerin", "stelpaginanummeringin", "stelpaginaovergangenin", "stelpaletin", "stelpapierformaatin", "stelpapierin", "stelparagraafnummerenin", "stelplaatsblokin", "stelplaatsbloksplitsenin", "stelplaatsin", "stelpositionerenin", "stelprogrammasin", "stelrefererenin", "stelregelnummerenin", "stelregelsin", "stelregisterin", "stelroterenin", "stelsamengesteldelijstin", "stelsectieblokin", "stelsmallerin", "stelsorterenin", "stelspatieringin", "stelstartstopin", "stelsubpaginanummerin", "stelsymboolsetin", "stelsynoniemenin", "steltaalin", "steltabellenin", "steltabulatiein", "steltekstachtergrondin", "steltekstin", "steltekstinhoudin", "steltekstlijnenin", "stelteksttekstenin", "steltolerantiein", "steltypein", "steltypenin", "stelurlin", "stelveldenin", "stelveldin", "stelvoetin", "stelvoettekstenin", "stelwiskundeuitlijnenin", "stelwitruimtein", "stopJScode", "stopJSpreamble", "stopMPclip", "stopMPcode", "stopMPdefinitions", "stopMPdrawing", "stopMPenvironment", "stopMPextensions", "stopMPinclusions", "stopMPinitializations", "stopMPpage", "stopMPpositiongraphic", "stopMPpositionmethod", "stopMPrun", "stopTABLE", "stopTABLEbody", "stopTABLEfoot", "stopTABLEhead", "stopTABLEnext", "stopTC", "stopTD", "stopTDs", "stopTEXpage", "stopTH", "stopTN", "stopTR", "stopTRs", "stopTX", "stopTY", "stopaanhangsel", "stopachtergrond", "stopallmodes", "stoparrangedpages", "stopaside", "stopattachment", "stopbar", "stopbinom", "stopbitmapimage", "stopblockquote", "stopblokcitaat", "stopbtxrenderingdefinitions", "stopbuffer", "stopbutton", "stopcatcodetable", "stopcharacteralign", "stopcheckedfences", "stopchemical", "stopcitaat", "stopciteer", "stopcollect", "stopcollecting", "stopcolorintent", "stopcoloronly", "stopcolorset", "stopcolumns", "stopcolumnspan", "stopcombination", "stopcomment", "stopcommentaar", "stopcontextcode", "stopcontextdefinitioncode", "stopctxfunction", "stopctxfunctiondefinition", "stopcurrentcolor", "stopcurrentlistentrywrapper", "stopdbinom", "stopdelimited", "stopdelimitedtext", "stopdfrac", "stopdisplaymath", "stopdmath", "stopdocument", "stopdoorstreep", "stopdoorstrepen", "stopeffect", "stopelement", "stopembeddedxtable", "stopendofline", "stopexceptions", "stopexpanded", "stopexpandedcollect", "stopextendedcatcodetable", "stopexternalfigurecollection", "stopfigure", "stopfiguur", "stopfitfieldframed", "stopfittingpage", "stopfloatcombination", "stopfont", "stopfontclass", "stopfontsolution", "stopformula", "stopformulas", "stopfrac", "stopframedcontent", "stopframedtext", "stopgrafiek", "stopgridsnapping", "stophbox", "stophboxestohbox", "stophboxregister", "stophelptekst", "stophelptext", "stophiddenbar", "stophiding", "stophighlight", "stophoofdstuk", "stophyphenation", "stopimath", "stopindentation", "stopindentedtext", "stopinmframed", "stopinteractiemenu", "stopinteraction", "stopinterface", "stopintermezzo", "stopintertext", "stopitemgroup", "stopkadertekst", "stopkantlijn", "stopkleur", "stopknockout", "stopkop", "stoplayout", "stoplinefiller", "stoplinenumbering", "stoplinetable", "stoplinetablebody", "stoplinetablecell", "stoplinetablehead", "stoplocalheadsetup", "stoplocallinecorrection", "stoplocalnotes", "stoplocalsetups", "stoplokalevoetnoten", "stoplua", "stopluacode", "stopluaparameterset", "stopluasetups", "stopmakeup", "stopmargeblok", "stopmarkedcontent", "stopmathmode", "stopmathstyle", "stopmatrices", "stopmcframed", "stopmdformula", "stopmframed", "stopmixedcolumns", "stopmode", "stopmodeset", "stopmodule", "stopmoduletestsection", "stopmpformula", "stopnaar", "stopnamedsection", "stopnamedsubformulas", "stopnarrow", "stopnarrower", "stopnegative", "stopnicelyfilledbox", "stopnobar", "stopnointerference", "stopnotallmodes", "stopnotext", "stopnotmode", "stopomgeving", "stopomlijnd", "stoponderdeel", "stoponderstreep", "stoponderstrepen", "stoponderwerp", "stopopelkaar", "stopopposite", "stopopsomming", "stopoutputstream", "stopoverlay", "stopoverprint", "stopoverstreep", "stopoverstrepen", "stoppagecomment", "stoppagefigure", "stoppagegrid", "stoppagegridspan", "stoppagelayout", "stoppar", "stopparagraaf", "stopparagraph", "stopparagraphs", "stopparagraphscell", "stopparbuilder", "stoppath", "stopplaatsformule", "stopplacepairedbox", "stoppositioning", "stoppositionoverlay", "stoppositive", "stoppostponing", "stopprocessassignmentcommand", "stopprocessassignmentlist", "stopprocesscommacommand", "stopprocesscommalist", "stopprodukt", "stopprojekt", "stopprotect", "stopprotectedcolors", "stoppublicatie", "stoppunctuation", "stoprandomized", "stoprandomseed", "stoprawsetups", "stopreadingfile", "stopreferenceprefix", "stopregel", "stopregelcorrectie", "stopregime", "stopregister", "stopreusableMPgraphic", "stopscript", "stopsdformula", "stopsectionblock", "stopsectionblockenvironment", "stopsectionlevel", "stopsetups", "stopsfrac", "stopshapebox", "stopshift", "stopsidebar", "stopsimplecolumns", "stopsom", "stopspecialitem", "stopspeech", "stopspformula", "stopspraak", "stopspread", "stopstartstop", "stopstaticMPfigure", "stopstaticMPgraphic", "stopstrictinspectnextcharacter", "stopstructurepageregister", "stopstrut", "stopstyle", "stopsubformulas", "stopsubjectlevel", "stopsubonderwerp", "stopsubparagraaf", "stopsubsentence", "stopsubstack", "stopsubsubonderwerp", "stopsubsubparagraaf", "stopsubsubsubonderwerp", "stopsubsubsubparagraaf", "stopsubsubsubsubonderwerp", "stopsubsubsubsubparagraaf", "stopsymbolset", "stoptabel", "stoptable", "stoptablehead", "stoptables", "stoptabletail", "stoptabulate", "stoptabulatehead", "stoptabulatetail", "stoptagged", "stoptbinom", "stoptekstachtergrond", "stoptekstlijn", "stoptexcode", "stoptexdefinition", "stoptext", "stoptextbackgroundmanual", "stoptextcolor", "stoptextcolorintent", "stoptextflow", "stoptitel", "stoptokens", "stoptransparent", "stoptypescript", "stoptypescriptcollection", "stopunderdash", "stopunderdashes", "stopunderdot", "stopunderdots", "stopunderrandom", "stopunderrandoms", "stopunderstrike", "stopunderstrikes", "stopunframed", "stopuniqueMPgraphic", "stopuniqueMPpagegraphic", "stopunpacked", "stopusableMPgraphic", "stopuseMPgraphic", "stopusemathstyleparameter", "stopusingbtxspecification", "stopvbox", "stopvboxregister", "stopvboxtohbox", "stopvboxtohboxseparator", "stopviewerlayer", "stopvtop", "stopvtopregister", "stopxcell", "stopxcellgroup", "stopxfrac", "stopxgroup", "stopxmldisplayverbatim", "stopxmlinlineverbatim", "stopxmlraw", "stopxmlsetups", "stopxrow", "stopxrowgroup", "stopxtable", "stopxtablebody", "stopxtablefoot", "stopxtablehead", "stopxtablenext", "stopxxfrac", "strictdoifelsenextoptional", "strictdoifnextoptionalelse", "stripcharacter", "strippedcsname", "stripspaces", "structurelistuservariable", "structurenumber", "structuretitle", "structureuservariable", "structurevariable", "strut", "strutdp", "strutht", "struthtdp", "struttedbox", "strutwd", "style", "styleinstance", "subonderwerp", "subpaginanummer", "subparagraaf", "subsentence", "substituteincommalist", "subsubonderwerp", "subsubparagraaf", "subsubsubonderwerp", "subsubsubparagraaf", "subsubsubsubonderwerp", "subsubsubsubparagraaf", "subtractfeature", "swapcounts", "swapdimens", "swapface", "swapmacros", "swaptypeface", "switchnaarkorps", "switchstyleonly", "switchtocolor", "switchtointerlinespace", "symbolreference", "symbool", "synchronizeblank", "synchronizeindenting", "synchronizemarking", "synchronizeoutputstreams", "synchronizestrut", "synchronizewhitespace", "systemlog", "systemlogfirst", "systemloglast", "systemsetups", "tLeftarrow", "tLeftrightarrow", "tRightarrow", "taal", "tabel", "tabulateautoline", "tabulateautorule", "tabulateline", "tabulaterule", "taggedctxcommand", "taggedlabeltexts", "tbinom", "tbox", "tekstlijn", "tekstreferentie", "tequal", "testandsplitstring", "testfeature", "testfeatureonce", "testkolom", "testpageonly", "testpagesync", "testpagina", "testtokens", "tex", "texdefinition", "texsetup", "textcitation", "textcite", "textcontrolspace", "textflowcollector", "textmath", "textminus", "textormathchar", "textplus", "textvisiblespace", "tfrac", "thainumerals", "thefirstcharacter", "thenormalizedbodyfontsize", "theremainingcharacters", "thickspace", "thinspace", "thirdoffivearguments", "thirdoffourarguments", "thirdofsixarguments", "thirdofthreearguments", "thirdofthreeunexpanded", "thookleftarrow", "thookrightarrow", "threedigitrounding", "tibetannumerals", "tightlayer", "tinyfont", "titel", "tlap", "tleftarrow", "tleftharpoondown", "tleftharpoonup", "tleftrightarrow", "tleftrightharpoons", "tmapsto", "tochar", "toelichting", "tolinenote", "toongrid", "tooninstellingen", "toonkader", "toonkleur", "toonkleurgroep", "toonkorps", "toonkorpsomgeving", "toonlayout", "toonopmaak", "toonpalet", "toonprint", "toonstruts", "toonsymboolset", "topbox", "topleftbox", "toplinebox", "toprightbox", "topskippedbox", "tracecatcodetables", "tracedfontname", "traceoutputroutines", "tracepositions", "transparencycomponents", "transparent", "trel", "trightarrow", "trightharpoondown", "trightharpoonup", "trightleftharpoons", "trightoverleftarrow", "triplebond", "truefilename", "truefontname", "ttriplerel", "ttwoheadleftarrow", "ttwoheadrightarrow", "twodigitrounding", "tx", "txx", "typ", "type", "typebuffer", "typedefinedbuffer", "typeface", "typefile", "typescriptone", "typescriptprefix", "typescriptthree", "typescripttwo", "typesetbuffer", "typesetfile", "uconvertnumber", "uedcatcodecommand", "uit", "uitgerekt", "undefinevalue", "undepthed", "underbar", "underbars", "underbartext", "underbrace", "underbracetext", "underbracket", "underbrackettext", "underdash", "underdashes", "underdot", "underdots", "underleftarrow", "underleftharpoondown", "underleftharpoonup", "underleftrightarrow", "underparent", "underparenttext", "underrandom", "underrandoms", "underrightarrow", "underrightharpoondown", "underrightharpoonup", "underset", "understrike", "understrikes", "undertwoheadleftarrow", "undertwoheadrightarrow", "undoassign", "unframed", "unhhbox", "unihex", "uniqueMPgraphic", "uniqueMPpagegraphic", "unprotected", "unregisterhyphenationpattern", "unspaceafter", "unspaceargument", "unspaced", "unspacestring", "untexargument", "untexcommand", "uppercased", "uppercasestring", "upperleftdoubleninequote", "upperleftdoublesixquote", "upperleftsingleninequote", "upperleftsinglesixquote", "upperrightdoubleninequote", "upperrightdoublesixquote", "upperrightsingleninequote", "upperrightsinglesixquote", "url", "useMPenvironmentbuffer", "useMPgraphic", "useMPlibrary", "useMPrun", "useMPvariables", "useblankparameter", "usebodyfont", "usebodyfontparameter", "usebtxdataset", "usebtxdefinitions", "usecolors", "usecomponent", "usedummycolorparameter", "usedummystyleandcolor", "usedummystyleparameter", "useenvironment", "useexternalrendering", "usefigurebase", "usefile", "usegridparameter", "useindentingparameter", "useindentnextparameter", "useinterlinespaceparameter", "uselanguageparameter", "useluamodule", "usemathstyleparameter", "useproduct", "useprofileparameter", "useproject", "usereferenceparameter", "userpagenumber", "usesetupsparameter", "usestaticMPfigure", "usesubpath", "usetexmodule", "usezipfile", "utfchar", "utflower", "utfupper", "utilityregisterlength", "vastespatie", "vastespaties", "vboxreference", "veld", "veldstapel", "verbatim", "verbatimstring", "verbergblokken", "verbergen", "verbosenumber", "vergelijkkleurgroep", "vergelijkpalet", "versie", "vertaal", "verticalgrowingbar", "verticalpositionbar", "verwerkblokken", "vglue", "viewerlayer", "vl", "voetnoottekst", "volledigepaginanummer", "volledigregister", "voluit", "vphantom", "vpos", "vsmash", "vsmashbox", "vsmashed", "vspace", "vspacing", "wdofstring", "weekdag", "widthofstring", "widthspanningtext", "wilijnd", "wiskunde", "withoutpt", "word", "words", "wordtonumber", "writedatatolist", "writestatus", "xLeftarrow", "xLeftrightarrow", "xRightarrow", "xdefconvertedargument", "xequal", "xfrac", "xhookleftarrow", "xhookrightarrow", "xleftarrow", "xleftharpoondown", "xleftharpoonup", "xleftrightarrow", "xleftrightharpoons", "xmapsto", "xmladdindex", "xmlafterdocumentsetup", "xmlaftersetup", "xmlall", "xmlappenddocumentsetup", "xmlappendsetup", "xmlapplyselectors", "xmlatt", "xmlattdef", "xmlattribute", "xmlattributedef", "xmlbadinclusions", "xmlbeforedocumentsetup", "xmlbeforesetup", "xmlchainatt", "xmlchainattdef", "xmlchecknamespace", "xmlcommand", "xmlconcat", "xmlconcatrange", "xmlcontext", "xmlcount", "xmldefaulttotext", "xmldirectives", "xmldirectivesafter", "xmldirectivesbefore", "xmldisplayverbatim", "xmldoif", "xmldoifelse", "xmldoifelseempty", "xmldoifelseselfempty", "xmldoifelsetext", "xmldoifelsevalue", "xmldoifnot", "xmldoifnotselfempty", "xmldoifnottext", "xmldoifselfempty", "xmldoiftext", "xmlelement", "xmlfilter", "xmlfirst", "xmlflush", "xmlflushcontext", "xmlflushdocumentsetups", "xmlflushlinewise", "xmlflushpure", "xmlflushspacewise", "xmlflushtext", "xmlinclude", "xmlinclusion", "xmlinclusions", "xmlinfo", "xmlinjector", "xmlinlineverbatim", "xmlinstalldirective", "xmllast", "xmllastatt", "xmllastmatch", "xmlloadbuffer", "xmlloaddata", "xmlloaddirectives", "xmlloadfile", "xmlloadonly", "xmlmain", "xmlmapvalue", "xmlname", "xmlnamespace", "xmlnonspace", "xmlpath", "xmlpos", "xmlposition", "xmlprependdocumentsetup", "xmlprependsetup", "xmlprettyprint", "xmlprocessbuffer", "xmlprocessdata", "xmlprocessfile", "xmlpure", "xmlraw", "xmlrefatt", "xmlregistereddocumentsetups", "xmlregisteredsetups", "xmlregisterns", "xmlremapname", "xmlremapnamespace", "xmlremovedocumentsetup", "xmlremovesetup", "xmlresetdocumentsetups", "xmlresetinjectors", "xmlresetsetups", "xmlsave", "xmlsetentity", "xmlsetfunction", "xmlsetinjectors", "xmlsetsetup", "xmlsetup", "xmlshow", "xmlsnippet", "xmlstrip", "xmlstripnolines", "xmlstripped", "xmlstrippednolines", "xmltag", "xmltexentity", "xmltext", "xmltobuffer", "xmltobufferverbose", "xmltofile", "xmlvalue", "xmlverbatim", "xrel", "xrightarrow", "xrightharpoondown", "xrightharpoonup", "xrightleftharpoons", "xrightoverleftarrow", "xsplitstring", "xtriplerel", "xtwoheadleftarrow", "xtwoheadrightarrow", "xxfrac", "xypos" }, - ["pe"]={ "AMSTEX", "AfterPar", "Alphabeticnumerals", "AmSTeX", "And", "BeforePar", "Big", "Bigg", "Biggl", "Biggm", "Biggr", "Bigl", "Bigm", "Bigr", "CONTEXT", "Cap", "Caps", "Character", "Characters", "ConTeXt", "Context", "ConvertConstantAfter", "ConvertToConstant", "ETEX", "EveryLine", "EveryPar", "GetPar", "GotoPar", "Greeknumerals", "INRSTEX", "LAMSTEX", "LATEX", "LUAJITTEX", "LUATEX", "LaTeX", "LamSTeX", "Lua", "LuaTeX", "LuajitTeX", "METAFONT", "METAFUN", "METAPOST", "MKII", "MKIV", "MKIX", "MKVI", "MKXI", "MONTH", "MONTHLONG", "MONTHSHORT", "MPII", "MPIV", "MPVI", "MPanchor", "MPbetex", "MPc", "MPcode", "MPcolor", "MPcoloronly", "MPcolumn", "MPd", "MPdrawing", "MPfontsizehskip", "MPgetmultipars", "MPgetmultishape", "MPgetposboxes", "MPh", "MPinclusions", "MPleftskip", "MPll", "MPlr", "MPls", "MPmenubuttons", "MPn", "MPoptions", "MPoverlayanchor", "MPp", "MPpage", "MPpardata", "MPplus", "MPpos", "MPpositiongraphic", "MPposset", "MPr", "MPrawvar", "MPregion", "MPrest", "MPrightskip", "MPrs", "MPstring", "MPtext", "MPtransparency", "MPul", "MPur", "MPv", "MPvar", "MPvariable", "MPvv", "MPw", "MPwhd", "MPx", "MPxy", "MPxywhd", "MPy", "MetaFont", "MetaFun", "MetaPost", "NormalizeFontHeight", "NormalizeFontWidth", "NormalizeTextHeight", "NormalizeTextWidth", "Numbers", "PDFETEX", "PDFTEX", "PDFcolor", "PICTEX", "PPCHTEX", "PPCHTeX", "PRAGMA", "PiCTeX", "PointsToBigPoints", "PointsToReal", "PointsToWholeBigPoints", "PtToCm", "ReadFile", "Romannumerals", "ScaledPointsToBigPoints", "ScaledPointsToWholeBigPoints", "Smallcapped", "TABLE", "TEX", "TEXpage", "TaBlE", "TeX", "TheNormalizedFontSize", "TransparencyHack", "VerboseNumber", "WEEKDAY", "WORD", "WORDS", "WidthSpanningText", "Word", "Words", "XETEX", "XeTeX", "abjadnaivenumerals", "abjadnodotnumerals", "abjadnumerals", "activatespacehandler", "adaptcollector", "adaptfontfeature", "adaptpapersize", "addfeature", "addtoJSpreamble", "addtocommalist", "addvalue", "aftersplitstring", "aftertestandsplitstring", "alignmentcharacter", "allinputpaths", "alphabeticnumerals", "alwayscitation", "alwayscite", "ampersand", "anchor", "appendetoks", "appendgvalue", "appendtocommalist", "appendtoks", "appendtoksonce", "appendvalue", "apply", "applyalternativestyle", "applyprocessor", "applytocharacters", "applytofirstcharacter", "applytosplitstringchar", "applytosplitstringcharspaced", "applytosplitstringline", "applytosplitstringlinespaced", "applytosplitstringword", "applytosplitstringwordspaced", "applytowords", "arabicdecimals", "arabicexnumerals", "arabicnumerals", "asciistr", "aside", "assignalfadimension", "assigndimen", "assigndimension", "assignifempty", "assigntranslation", "assignvalue", "assignwidth", "assumelongusagecs", "astype", "attachment", "autocap", "autodirhbox", "autodirvbox", "autodirvtop", "autoinsertnextspace", "automathematics", "autosetups", "availablehsize", "averagecharwidth", "backgroundimage", "backgroundimagefill", "backgroundline", "basegrid", "baselineleftbox", "baselinemiddlebox", "baselinerightbox", "bbox", "beforesplitstring", "beforetestandsplitstring", "big", "bigbodyfont", "bigg", "bigger", "biggl", "biggm", "biggr", "bigl", "bigm", "bigr", "bigskip", "binom", "bitmapimage", "blap", "bleed", "bleedheight", "bleedwidth", "blockligatures", "blockquote", "bodyfontenvironmentlist", "bodyfontsize", "bold", "boldface", "bolditalic", "boldslanted", "booleanmodevalue", "bottombox", "bottomleftbox", "bottomrightbox", "boxcursor", "boxmarker", "boxofsize", "boxreference", "bpos", "bthiddencitation", "btxabbreviatedjournal", "btxaddjournal", "btxalwayscitation", "btxauthorfield", "btxdetail", "btxdirect", "btxdoif", "btxdoifcombiinlistelse", "btxdoifelse", "btxdoifelsecombiinlist", "btxdoifelsesameasprevious", "btxdoifelsesameaspreviouschecked", "btxdoifelseuservariable", "btxdoifnot", "btxdoifsameaspreviouscheckedelse", "btxdoifsameaspreviouselse", "btxdoifuservariableelse", "btxexpandedjournal", "btxfield", "btxfieldname", "btxfieldtype", "btxfirstofrange", "btxflush", "btxflushauthor", "btxflushauthorinverted", "btxflushauthorinvertedshort", "btxflushauthorname", "btxflushauthornormal", "btxflushauthornormalshort", "btxflushsuffix", "btxfoundname", "btxfoundtype", "btxhybridcite", "btxlistcitation", "btxloadjournalist", "btxoneorrange", "btxremapauthor", "btxsavejournalist", "btxsetup", "btxsingularorplural", "btxsingularplural", "btxtextcitation", "calligraphic", "camel", "cap", "catcodetablename", "cbox", "centerbox", "centeredbox", "centerednextbox", "cfrac", "chardescription", "charwidthlanguage", "checkcharacteralign", "checkedchar", "checkedfiller", "checkedstrippedcsname", "checkinjector", "checknextindentation", "checknextinjector", "checkpage", "checkparameters", "checkpreviousinjector", "checksoundtrack", "checktwopassdata", "checkvariables", "chem", "chemical", "chemicalbottext", "chemicalmidtext", "chemicalsymbol", "chemicaltext", "chemicaltoptext", "chineseallnumerals", "chinesecapnumerals", "chinesenumerals", "citation", "cite", "clap", "classfont", "cldcommand", "cldcontext", "cldloadfile", "cldprocessfile", "cleftarrow", "collect", "collectedtext", "collectexpanded", "colorcomponents", "colored", "coloronly", "columnbreak", "combinepages", "commalistelement", "commalistsentence", "commalistsize", "comment", "comparedimension", "comparedimensioneps", "completebtxrendering", "completelist", "completelistofpublications", "completelistofsorts", "completelistofsynonyms", "complexorsimple", "complexorsimpleempty", "composedcollector", "composedlayer", "compresult", "constantdimen", "constantdimenargument", "constantemptyargument", "constantnumber", "constantnumberargument", "contentreference", "continuednumber", "continueifinputfile", "convertargument", "convertcommand", "convertedcounter", "converteddimen", "convertedsubcounter", "convertmonth", "convertvalue", "convertvboxtohbox", "copypages", "copyparameters", "copyposition", "countersubs", "counttoken", "counttokens", "cramped", "crampedclap", "crampedllap", "crampedrlap", "crightarrow", "crightoverleftarrow", "ctop", "ctxcommand", "ctxdirectcommand", "ctxdirectlua", "ctxfunction", "ctxlatecommand", "ctxlatelua", "ctxloadluafile", "ctxlua", "ctxluabuffer", "ctxluacode", "ctxreport", "ctxsprint", "currentassignmentlistkey", "currentassignmentlistvalue", "currentbtxuservariable", "currentcommalistitem", "currentcomponent", "currentenvironment", "currentfeaturetest", "currentinterface", "currentlanguage", "currentlistentrydestinationattribute", "currentlistentrylimitedtext", "currentlistentrynumber", "currentlistentrypagenumber", "currentlistentryreferenceattribute", "currentlistentrytitle", "currentlistentrytitlerendered", "currentlistsymbol", "currentmainlanguage", "currentmessagetext", "currentmoduleparameter", "currentoutputstream", "currentproduct", "currentproject", "currentregime", "currentregisterpageuserdata", "currentresponses", "currenttime", "currentvalue", "currentxtablecolumn", "currentxtablerow", "datasetvariable", "dayoftheweek", "dayspermonth", "dbinom", "decrement", "decrementcounter", "decrementedcounter", "decrementpagenumber", "decrementsubpagenumber", "decrementvalue", "defaultinterface", "defaultobjectpage", "defaultobjectreference", "defcatcodecommand", "defconvertedargument", "defconvertedcommand", "defconvertedvalue", "defineMPinstance", "defineTABLEsetup", "defineactivecharacter", "definealternativestyle", "defineanchor", "defineattachment", "defineattribute", "definebackground", "definebar", "definebodyfontswitch", "definebreakpoint", "definebreakpoints", "definebtx", "definebtxdataset", "definebtxregister", "definebtxrendering", "definebutton", "definecapitals", "definecharacterkerning", "definecharacterspacing", "definechemical", "definechemicals", "definechemicalsymbol", "definecollector", "definecomment", "definecomplexorsimple", "definecomplexorsimpleempty", "defineconversionset", "definecounter", "definedataset", "definedelimitedtext", "definedfont", "defineeffect", "defineexpandable", "defineexternalfigure", "definefallbackfamily", "definefieldbody", "definefieldbodyset", "definefieldcategory", "definefileconstant", "definefilefallback", "definefilesynonym", "definefiller", "definefirstline", "definefittingpage", "definefontalternative", "definefontfallback", "definefontfamily", "definefontfamilypreset", "definefontfeature", "definefontfile", "definefontsize", "definefontsolution", "defineformula", "defineformulaalternative", "defineformulaframed", "defineframedcontent", "definefrozenfont", "defineglobalcolor", "definegraphictypesynonym", "definegridsnapping", "defineheadalternative", "definehelp", "definehigh", "definehighlight", "definehspace", "definehypenationfeatures", "defineindentedtext", "defineindenting", "defineinitial", "defineinsertion", "defineinteraction", "defineinteractionbar", "defineinterfaceconstant", "defineinterfaceelement", "defineinterfacevariable", "defineinterlinespace", "defineintermediatecolor", "defineitems", "definelabelclass", "definelayerpreset", "definelinefiller", "definelinenote", "definelinenumbering", "definelines", "definelistalternative", "definelistextra", "definelow", "definelowhigh", "definelowmidhigh", "definemarginblock", "definemargindata", "definemarker", "definemathcases", "definemathcommand", "definemathdoubleextensible", "definemathematics", "definemathextensible", "definemathfence", "definemathfraction", "definemathframed", "definemathmatrix", "definemathornament", "definemathoverextensible", "definemathovertextextensible", "definemathradical", "definemathstackers", "definemathstyle", "definemathtriplet", "definemathunderextensible", "definemathundertextextensible", "definemathunstacked", "definemeasure", "definemessageconstant", "definemixedcolumns", "definemode", "definemultitonecolor", "definenamedcolor", "definenamespace", "definenarrower", "definenote", "defineornament", "defineoutputroutine", "defineoutputroutinecommand", "definepage", "definepagechecker", "definepagegrid", "definepagegridarea", "definepagegridspan", "definepageinjection", "definepageinjectionalternative", "definepageshift", "definepagestate", "definepairedbox", "defineparagraph", "defineparallel", "defineparbuilder", "definepositioning", "defineprefixset", "defineprocesscolor", "defineprocessor", "definepushbutton", "definepushsymbol", "definerenderingwindow", "defineresetset", "definescale", "definescript", "definesectionlevels", "defineselector", "defineseparatorset", "defineshift", "definesidebar", "definesort", "definespotcolor", "definestyleinstance", "definesubformula", "definesynonym", "definesystemattribute", "definesystemconstant", "definesystemvariable", "definetabulation", "definetextbackground", "definetextflow", "definetooltip", "definetransparency", "definetwopasslist", "definetypeface", "definetypescriptprefix", "definetypescriptsynonym", "definetypesetting", "defineunit", "defineviewerlayer", "definevspace", "definevspacing", "definevspacingamount", "definextable", "delimited", "delimitedtext", "depthofstring", "depthonlybox", "depthspanningtext", "determinenoflines", "devanagarinumerals", "dfrac", "digits", "dimensiontocount", "directcolor", "directcolored", "directconvertedcounter", "directdummyparameter", "directgetboxllx", "directgetboxlly", "directhighlight", "directlocalframed", "directluacode", "directselect", "directsetbar", "directsetup", "directsymbol", "directvspacing", "dis", "disabledirectives", "disableexperiments", "disablemode", "disableoutputstream", "disableparpositions", "disableregime", "disabletrackers", "displaymath", "displaymathematics", "displaymessage", "distributedhsize", "dividedsize", "doadaptleftskip", "doadaptrightskip", "doaddfeature", "doassign", "doassignempty", "doboundtext", "docheckassignment", "docheckedpagestate", "docheckedpair", "documentvariable", "dodoubleargument", "dodoubleargumentwithset", "dodoubleempty", "dodoubleemptywithset", "dodoublegroupempty", "doeassign", "doexpandedrecurse", "dogetattribute", "dogetattributeid", "dogetcommacommandelement", "dogobbledoubleempty", "dogobblesingleempty", "doif", "doifMPgraphicelse", "doifallcommon", "doifallcommonelse", "doifalldefinedelse", "doifallmodes", "doifallmodeselse", "doifassignmentelse", "doifblackelse", "doifbothsides", "doifbothsidesoverruled", "doifboxelse", "doifbufferelse", "doifcolor", "doifcolorelse", "doifcommandhandler", "doifcommandhandlerelse", "doifcommon", "doifcommonelse", "doifcontent", "doifconversiondefinedelse", "doifconversionnumberelse", "doifcounter", "doifcounterelse", "doifcurrentfonthasfeatureelse", "doifdefined", "doifdefinedcounter", "doifdefinedcounterelse", "doifdefinedelse", "doifdimensionelse", "doifdimenstringelse", "doifdocumentargument", "doifdocumentargumentelse", "doifdocumentfilename", "doifdocumentfilenameelse", "doifdrawingblackelse", "doifelse", "doifelseMPgraphic", "doifelseallcommon", "doifelsealldefined", "doifelseallmodes", "doifelseassignment", "doifelseblack", "doifelsebox", "doifelsebuffer", "doifelsecolor", "doifelsecommandhandler", "doifelsecommon", "doifelseconversiondefined", "doifelseconversionnumber", "doifelsecounter", "doifelsecurrentfonthasfeature", "doifelsecurrentsortingused", "doifelsecurrentsynonymshown", "doifelsecurrentsynonymused", "doifelsedefined", "doifelsedefinedcounter", "doifelsedimension", "doifelsedimenstring", "doifelsedocumentargument", "doifelsedocumentfilename", "doifelsedrawingblack", "doifelseempty", "doifelseemptyvalue", "doifelseemptyvariable", "doifelseenv", "doifelsefastoptionalcheck", "doifelsefastoptionalcheckcs", "doifelsefieldbody", "doifelsefieldcategory", "doifelsefigure", "doifelsefile", "doifelsefiledefined", "doifelsefileexists", "doifelsefirstchar", "doifelseflagged", "doifelsefontchar", "doifelsefontpresent", "doifelsefontsynonym", "doifelsehasspace", "doifelsehelp", "doifelseincsname", "doifelseinelement", "doifelseinputfile", "doifelseinsertion", "doifelseinset", "doifelseinstring", "doifelseinsymbolset", "doifelseintoks", "doifelseintwopassdata", "doifelseitalic", "doifelselanguage", "doifelselayerdata", "doifelselayoutdefined", "doifelselayoutsomeline", "doifelselayouttextline", "doifelseleapyear", "doifelselist", "doifelselocation", "doifelselocfile", "doifelsemainfloatbody", "doifelsemarking", "doifelsemeaning", "doifelsemessage", "doifelsemode", "doifelsenextbgroup", "doifelsenextbgroupcs", "doifelsenextchar", "doifelsenextoptional", "doifelsenextoptionalcs", "doifelsenextparenthesis", "doifelsenonzeropositive", "doifelsenoteonsamepage", "doifelsenothing", "doifelsenumber", "doifelseobjectfound", "doifelseobjectreferencefound", "doifelseoddpage", "doifelseoddpagefloat", "doifelseoldercontext", "doifelseolderversion", "doifelseoverlapping", "doifelseoverlay", "doifelseparallel", "doifelseparentfile", "doifelsepath", "doifelsepathexists", "doifelsepatterns", "doifelseposition", "doifelsepositionaction", "doifelsepositiononpage", "doifelsepositionsonsamepage", "doifelsepositionsonthispage", "doifelsepositionsused", "doifelsereferencefound", "doifelserightpagefloat", "doifelserighttoleftinbox", "doifelsesamelinereference", "doifelsesamestring", "doifelsesetups", "doifelsesomebackground", "doifelsesomespace", "doifelsesomething", "doifelsesometoks", "doifelsestringinstring", "doifelsestructurelisthasnumber", "doifelsestructurelisthaspage", "doifelsesymboldefined", "doifelsesymbolset", "doifelsetext", "doifelsetextflow", "doifelsetextflowcollector", "doifelsetypingfile", "doifelseundefined", "doifelseurldefined", "doifelsevalue", "doifelsevaluenothing", "doifelsevariable", "doifempty", "doifemptyelse", "doifemptytoks", "doifemptyvalue", "doifemptyvalueelse", "doifemptyvariable", "doifemptyvariableelse", "doifenv", "doifenvelse", "doiffastoptionalcheckcselse", "doiffastoptionalcheckelse", "doiffieldbodyelse", "doiffieldcategoryelse", "doiffigureelse", "doiffile", "doiffiledefinedelse", "doiffileelse", "doiffileexistselse", "doiffirstcharelse", "doifflaggedelse", "doiffontcharelse", "doiffontpresentelse", "doiffontsynonymelse", "doifhasspaceelse", "doifhelpelse", "doifincsnameelse", "doifinelementelse", "doifinputfileelse", "doifinsertionelse", "doifinset", "doifinsetelse", "doifinstring", "doifinstringelse", "doifinsymbolset", "doifinsymbolsetelse", "doifintokselse", "doifintwopassdataelse", "doifitalicelse", "doiflanguageelse", "doiflayerdataelse", "doiflayoutdefinedelse", "doiflayoutsomelineelse", "doiflayouttextlineelse", "doifleapyearelse", "doiflistelse", "doiflocationelse", "doiflocfileelse", "doifmainfloatbodyelse", "doifmarkingelse", "doifmeaningelse", "doifmessageelse", "doifmode", "doifmodeelse", "doifnextbgroupcselse", "doifnextbgroupelse", "doifnextcharelse", "doifnextoptionalcselse", "doifnextoptionalelse", "doifnextparenthesiselse", "doifnonzeropositiveelse", "doifnot", "doifnotallcommon", "doifnotallmodes", "doifnotcommandhandler", "doifnotcommon", "doifnotcounter", "doifnotdocumentargument", "doifnotdocumentfilename", "doifnotempty", "doifnotemptyvalue", "doifnotemptyvariable", "doifnotenv", "doifnoteonsamepageelse", "doifnotescollected", "doifnotfile", "doifnotflagged", "doifnothing", "doifnothingelse", "doifnotinset", "doifnotinsidesplitfloat", "doifnotinstring", "doifnotmode", "doifnotnumber", "doifnotsamestring", "doifnotsetups", "doifnotvalue", "doifnotvariable", "doifnumber", "doifnumberelse", "doifobjectfoundelse", "doifobjectreferencefoundelse", "doifoddpageelse", "doifoddpagefloatelse", "doifoldercontextelse", "doifolderversionelse", "doifoverlappingelse", "doifoverlayelse", "doifparallelelse", "doifparentfileelse", "doifpathelse", "doifpathexistselse", "doifpatternselse", "doifposition", "doifpositionaction", "doifpositionactionelse", "doifpositionelse", "doifpositiononpageelse", "doifpositionsonsamepageelse", "doifpositionsonthispageelse", "doifpositionsusedelse", "doifreferencefoundelse", "doifrightpagefloatelse", "doifrighttoleftinboxelse", "doifsamelinereferenceelse", "doifsamestring", "doifsamestringelse", "doifsetups", "doifsetupselse", "doifsomebackground", "doifsomebackgroundelse", "doifsomespaceelse", "doifsomething", "doifsomethingelse", "doifsometoks", "doifsometokselse", "doifstringinstringelse", "doifstructurelisthasnumberelse", "doifstructurelisthaspageelse", "doifsymboldefinedelse", "doifsymbolsetelse", "doiftext", "doiftextelse", "doiftextflowcollectorelse", "doiftextflowelse", "doiftypingfileelse", "doifundefined", "doifundefinedcounter", "doifundefinedelse", "doifurldefinedelse", "doifvalue", "doifvalueelse", "doifvaluenothing", "doifvaluenothingelse", "doifvaluesomething", "doifvariable", "doifvariableelse", "doindentation", "dollar", "doloop", "doloopoverlist", "donothing", "dontconvertfont", "dontleavehmode", "dontpermitspacesbetweengroups", "dopositionaction", "doprocesslocalsetups", "doquadrupleargument", "doquadrupleempty", "doquadruplegroupempty", "doquintupleargument", "doquintupleempty", "doquintuplegroupempty", "dorechecknextindentation", "dorecurse", "dorepeatwithcommand", "doreplacefeature", "doresetandafffeature", "doresetattribute", "dorotatebox", "dosetattribute", "dosetleftskipadaption", "dosetrightskipadaption", "dosetupcheckedinterlinespace", "doseventupleargument", "doseventupleempty", "dosingleargument", "dosingleempty", "dosinglegroupempty", "dosixtupleargument", "dosixtupleempty", "dostepwiserecurse", "dosubtractfeature", "dotfskip", "dotoks", "dotripleargument", "dotripleargumentwithset", "dotripleempty", "dotripleemptywithset", "dotriplegroupempty", "doublebar", "doublebond", "doublebrace", "doublebracket", "doubleparent", "dowith", "dowithnextbox", "dowithnextboxcontent", "dowithnextboxcontentcs", "dowithnextboxcs", "dowithpargument", "dowithrange", "dowithwargument", "dpofstring", "dummydigit", "dummyparameter", "eTeX", "edefconvertedargument", "efcmaxheight", "efcmaxwidth", "efcminheight", "efcminwidth", "efcparameter", "effect", "elapsedseconds", "elapsedtime", "eleftarrowfill", "eleftharpoondownfill", "eleftharpoonupfill", "eleftrightarrowfill", "emphasisboldface", "emphasistypeface", "emspace", "enabledirectives", "enableexperiments", "enablemode", "enableoutputstream", "enableparpositions", "enableregime", "enabletrackers", "enskip", "enspace", "env", "envvar", "eoverbarfill", "eoverbracefill", "eoverbracketfill", "eoverparentfill", "epos", "equaldigits", "erightarrowfill", "erightharpoondownfill", "erightharpoonupfill", "etwoheadrightarrowfill", "eunderbarfill", "eunderbracefill", "eunderbracketfill", "eunderparentfill", "executeifdefined", "exitloop", "exitloopnow", "expandcheckedcsname", "expanded", "expandfontsynonym", "externalfigurecollectionmaxheight", "externalfigurecollectionmaxwidth", "externalfigurecollectionminheight", "externalfigurecollectionminwidth", "externalfigurecollectionparameter", "fakebox", "fastdecrement", "fastincrement", "fastlocalframed", "fastscale", "fastsetup", "fastsetupwithargument", "fastsetupwithargumentswapped", "fastswitchtobodyfont", "fastsxsy", "feature", "fence", "fenced", "fetchallmarkings", "fetchallmarks", "fetchmark", "fetchmarking", "fetchonemark", "fetchonemarking", "fetchruntinecommand", "fetchtwomarkings", "fetchtwomarks", "fieldbody", "fifthoffivearguments", "fifthofsixarguments", "figurefilename", "figurefilepath", "figurefiletype", "figurefullname", "figureheight", "figurenaturalheight", "figurenaturalwidth", "figuresymbol", "figurewidth", "filename", "filledhboxb", "filledhboxc", "filledhboxg", "filledhboxk", "filledhboxm", "filledhboxr", "filledhboxy", "filler", "filterfromnext", "filterfromvalue", "filterpages", "filterreference", "findtwopassdata", "finishregisterentry", "firstcharacter", "firstcounter", "firstcountervalue", "firstoffivearguments", "firstoffourarguments", "firstofoneargument", "firstofoneunexpanded", "firstofsixarguments", "firstofthreearguments", "firstofthreeunexpanded", "firstoftwoarguments", "firstoftwounexpanded", "firstrealpage", "firstrealpagenumber", "firstsubcountervalue", "firstsubpage", "firstsubpagenumber", "firstuserpage", "firstuserpagenumber", "fitfieldframed", "fittopbaselinegrid", "flag", "floatuserdataparameter", "flushboxregister", "flushcollector", "flushlayer", "flushlocalfloats", "flushnextbox", "flushnotes", "flushoutputstream", "flushshapebox", "flushtextflow", "flushtokens", "flushtoks", "fontalternative", "fontbody", "fontchar", "fontcharbyindex", "fontclass", "fontclassname", "fontface", "fontfeaturelist", "fontsize", "fontstyle", "forcecharacterstripping", "forcelocalfloats", "forgeteverypar", "forgetparameters", "formula", "foundbox", "fourthoffivearguments", "fourthoffourarguments", "fourthofsixarguments", "frac", "frameddimension", "framedparameter", "framedtext", "freezedimenmacro", "freezemeasure", "frenchspacing", "fromlinenote", "frozenhbox", "gdefconvertedargument", "gdefconvertedcommand", "getMPdrawing", "getMPlayer", "getboxllx", "getboxlly", "getbufferdata", "getcommacommandsize", "getcommalistsize", "getdayoftheweek", "getdayspermonth", "getdefinedbuffer", "getdocumentargument", "getdocumentargumentdefault", "getdocumentfilename", "getdummyparameters", "getemptyparameters", "geteparameters", "getexpandedparameters", "getfiguredimensions", "getfirstcharacter", "getfirsttwopassdata", "getfromcommacommand", "getfromcommalist", "getfromtwopassdata", "getglyphdirect", "getglyphstyled", "getgparameters", "getlasttwopassdata", "getlocalfloat", "getlocalfloats", "getmessage", "getnamedglyphdirect", "getnamedglyphstyled", "getnamedtwopassdatalist", "getnaturaldimensions", "getnoflines", "getobject", "getobjectdimensions", "getpaletsize", "getparameters", "getprivatechar", "getprivateslot", "getrandomcount", "getrandomdimen", "getrandomfloat", "getrandomnumber", "getrandomseed", "getraweparameters", "getrawgparameters", "getrawnoflines", "getrawparameters", "getrawxparameters", "getreference", "getreferenceentry", "getroundednoflines", "getsubstring", "gettwopassdata", "gettwopassdatalist", "getuvalue", "getvalue", "getvariable", "getvariabledefault", "getxparameters", "globaldisablemode", "globalenablemode", "globalletempty", "globalpopbox", "globalpopmacro", "globalpreventmode", "globalprocesscommalist", "globalpushbox", "globalpushmacro", "globalswapcounts", "globalswapdimens", "globalswapmacros", "globalundefine", "glyphfontfile", "gobbledoubleempty", "gobbleeightarguments", "gobblefivearguments", "gobblefiveoptionals", "gobblefourarguments", "gobblefouroptionals", "gobbleninearguments", "gobbleoneargument", "gobbleoneoptional", "gobblesevenarguments", "gobblesingleempty", "gobblesixarguments", "gobblespacetokens", "gobbletenarguments", "gobblethreearguments", "gobblethreeoptionals", "gobbletwoarguments", "gobbletwooptionals", "gobbleuntil", "gobbleuntilrelax", "grabbufferdata", "grabbufferdatadirect", "grabuntil", "grayvalue", "greedysplitstring", "greeknumerals", "groupedcommand", "gsetboxllx", "gsetboxlly", "gujaratinumerals", "gurmurkhinumerals", "hairspace", "halfwaybox", "handletokens", "handwritten", "hash", "hboxofvbox", "hboxreference", "hdofstring", "headhbox", "headnumbercontent", "headnumberdistance", "headnumberwidth", "headreferenceattributes", "headsetupspacing", "headtextcontent", "headtextdistance", "headtextwidth", "headvbox", "headwidth", "heightanddepthofstring", "heightofstring", "heightspanningtext", "helptext", "hglue", "hiddenbar", "hiddencitation", "hiddencite", "highlight", "highordinalstr", "hilo", "himilo", "horizontalgrowingbar", "horizontalpositionbar", "hphantom", "hpos", "hsizefraction", "hsmash", "hsmashbox", "hsmashed", "hspace", "htdpofstring", "htofstring", "hyphen", "hyphenatedcoloredword", "hyphenatedfile", "hyphenatedfilename", "hyphenatedhbox", "hyphenatedpar", "hyphenatedurl", "hyphenatedword", "ibox", "ifassignment", "iff", "ifinobject", "ifinoutputstream", "ifparameters", "iftrialtypesetting", "ignoreimplicitspaces", "ignorevalue", "immediatesavetwopassdata", "impliedby", "implies", "includemenu", "includeversioninfo", "increment", "incrementcounter", "incrementedcounter", "incrementpagenumber", "incrementsubpagenumber", "incrementvalue", "indentation", "infofont", "infofontbold", "inheritparameter", "inhibitblank", "initializeboxstack", "inlinebuffer", "inlinedbox", "inlinemath", "inlinemathematics", "inlinemessage", "inlineordisplaymath", "inlinerange", "inmframed", "innerflushshapebox", "input", "inputfilebarename", "inputfilename", "inputfilerealsuffix", "inputfilesuffix", "inputgivenfile", "insertpages", "installactionhandler", "installactivecharacter", "installanddefineactivecharacter", "installattributestack", "installautocommandhandler", "installautosetuphandler", "installbasicautosetuphandler", "installbasicparameterhandler", "installbottomframerenderer", "installcommandhandler", "installcorenamespace", "installdefinehandler", "installdefinitionset", "installdefinitionsetmember", "installdirectcommandhandler", "installdirectparameterhandler", "installdirectparametersethandler", "installdirectsetuphandler", "installdirectstyleandcolorhandler", "installframedautocommandhandler", "installframedcommandhandler", "installleftframerenderer", "installnamespace", "installoutputroutine", "installpagearrangement", "installparameterhandler", "installparameterhashhandler", "installparametersethandler", "installparentinjector", "installrightframerenderer", "installrootparameterhandler", "installsetuphandler", "installsetuponlycommandhandler", "installshipoutmethod", "installsimplecommandhandler", "installsimpleframedcommandhandler", "installstyleandcolorhandler", "installswitchcommandhandler", "installswitchsetuphandler", "installtexdirective", "installtextracker", "installtopframerenderer", "installunitsseparator", "installunitsspace", "installversioninfo", "integerrounding", "intertext", "invokepageheandler", "istltdir", "istrtdir", "italic", "italicbold", "italiccorrection", "itemtag", "jobfilename", "jobfilesuffix", "kap", "keeplinestogether", "keepunwantedspaces", "kerncharacters", "koreancirclenumerals", "koreannumerals", "koreannumeralsc", "koreannumeralsp", "koreanparentnumerals", "languageCharacters", "languagecharacters", "languagecharwidth", "lastcounter", "lastcountervalue", "lastdigit", "lastlinewidth", "lastnaturalboxdp", "lastnaturalboxht", "lastnaturalboxwd", "lastpredefinedsymbol", "lastrealpage", "lastrealpagenumber", "lastsubcountervalue", "lastsubpage", "lastsubpagenumber", "lasttwodigits", "lastuserpage", "lastuserpagenumber", "lateluacode", "layeredtext", "layerheight", "layerwidth", "lazysavetaggedtwopassdata", "lazysavetwopassdata", "lbox", "left", "leftbottombox", "leftbox", "lefthbox", "leftorrighthbox", "leftorrightvbox", "leftorrightvtop", "leftskipadaption", "leftsubguillemot", "lefttopbox", "lefttorighthbox", "lefttorightvbox", "lefttorightvtop", "letbeundefined", "letcatcodecommand", "letcscsname", "letcsnamecs", "letcsnamecsname", "letdummyparameter", "letempty", "letgvalue", "letgvalueempty", "letgvalurelax", "letterampersand", "letterat", "letterbackslash", "letterbar", "letterbgroup", "letterclosebrace", "lettercolon", "letterdollar", "letterdoublequote", "letteregroup", "letterescape", "letterexclamationmark", "letterhash", "letterhat", "letterleftbrace", "letterless", "lettermore", "letteropenbrace", "letterpercent", "letterquestionmark", "letterrightbrace", "lettersinglequote", "letterslash", "letterspacing", "lettertilde", "letterunderscore", "letvalue", "letvalueempty", "letvaluerelax", "lfence", "lhbox", "limitatelines", "limitatetext", "limtatefirstline", "linespanningtext", "listcitation", "listcite", "listnamespaces", "llap", "loadanyfile", "loadanyfileonce", "loadbtxdefinitionfile", "loadbtxreplacementfile", "loadcldfile", "loadcldfileonce", "loadfontgoodies", "loadluafile", "loadluafileonce", "loadspellchecklist", "loadtexfile", "loadtexfileonce", "loadtypescriptfile", "localframed", "localframedwithsettings", "localhsize", "localpopbox", "localpopmacro", "localpushbox", "localpushmacro", "localundefine", "locatedfilepath", "locatefilepath", "locfilename", "lomihi", "lowerbox", "lowercased", "lowercasestring", "lowerleftdoubleninequote", "lowerleftsingleninequote", "lowerrightdoubleninequote", "lowerrightsingleninequote", "lrtbbox", "ltop", "luaTeX", "luacode", "luaconditional", "luaenvironment", "luaexpanded", "luafunction", "luajitTeX", "luamajorversion", "luaminorversion", "luaparameterset", "luasetup", "luaversion", "m", "mLeftarrow", "mLeftrightarrow", "mRightarrow", "makecharacteractive", "makerawcommalist", "makestrutofbox", "mapfontsize", "margindata", "markcontent", "markinjector", "mat", "math", "mathbf", "mathbi", "mathblackboard", "mathbs", "mathcommand", "mathdefault", "mathfraktur", "mathfunction", "mathit", "mathitalic", "mathop", "mathrm", "mathscript", "mathsl", "mathss", "mathtext", "mathtextbf", "mathtextbi", "mathtextbs", "mathtextit", "mathtextsl", "mathtexttf", "mathtf", "mathtriplet", "mathtt", "mathupright", "mathword", "mathwordbf", "mathwordbi", "mathwordbs", "mathwordit", "mathwordsl", "mathwordtf", "mbox", "mcframed", "md", "measure", "measured", "medskip", "medspace", "mequal", "message", "metaTeX", "mfence", "mframed", "mfunction", "mfunctionlabeltext", "mhbox", "mhookleftarrow", "mhookrightarrow", "middle", "middlebox", "midhbox", "minimalhbox", "mixedcaps", "mkvibuffer", "mleftarrow", "mleftharpoondown", "mleftharpoonup", "mleftrightarrow", "mleftrightharpoons", "mmapsto", "moduleparameter", "molecule", "mono", "monobold", "mononormal", "monthlong", "monthshort", "mp", "mprandomnumber", "mrel", "mrightarrow", "mrightharpoondown", "mrightharpoonup", "mrightleftharpoons", "mrightoverleftarrow", "mtext", "mtriplerel", "mtwoheadleftarrow", "mtwoheadrightarrow", "namedheadnumber", "namedstructureheadlocation", "namedstructureuservariable", "namedstructurevariable", "namedtaggedlabeltexts", "naturalhbox", "naturalhpack", "naturalvbox", "naturalvcenter", "naturalvpack", "naturalvtop", "naturalwd", "negatecolorbox", "negated", "negthinspace", "newattribute", "newcatcodetable", "newcounter", "newevery", "newfrenchspacing", "newmode", "newsignal", "newsystemmode", "nextbox", "nextboxdp", "nextboxht", "nextboxhtdp", "nextboxwd", "nextcounter", "nextcountervalue", "nextdepth", "nextparagraphs", "nextrealpage", "nextrealpagenumber", "nextsubcountervalue", "nextsubpage", "nextsubpagenumber", "nextuserpage", "nextuserpagenumber", "nobar", "nocitation", "nocite", "nodetostring", "noffigurepages", "noflines", "noflocalfloats", "noindentation", "noitem", "nonfrenchspacing", "nonmathematics", "normal", "normalboldface", "normalframedwithsettings", "normalizebodyfontsize", "normalizedfontsize", "normalizefontdepth", "normalizefontheight", "normalizefontline", "normalizefontwidth", "normalizetextdepth", "normalizetextheight", "normalizetextline", "normalizetextwidth", "normaltypeface", "notesymbol", "ntimes", "numberofpoints", "obeydepth", "objectdepth", "objectheight", "objectmargin", "objectwidth", "obox", "offset", "offsetbox", "onedigitrounding", "ordinaldaynumber", "ordinalstr", "ornamenttext", "outputfilename", "outputstreambox", "outputstreamcopy", "outputstreamunvbox", "outputstreamunvcopy", "over", "overbar", "overbars", "overbartext", "overbarunderbar", "overbrace", "overbracetext", "overbraceunderbrace", "overbracket", "overbrackettext", "overbracketunderbracket", "overlaybutton", "overlaycolor", "overlaydepth", "overlayfigure", "overlayheight", "overlaylinecolor", "overlaylinewidth", "overlayoffset", "overlayrollbutton", "overlaywidth", "overleftarrow", "overleftharpoondown", "overleftharpoonup", "overleftrightarrow", "overloaderror", "overparent", "overparenttext", "overparentunderparent", "overrightarrow", "overrightharpoondown", "overrightharpoonup", "overset", "overstrike", "overstrikes", "overtwoheadleftarrow", "overtwoheadrightarrow", "pagearea", "pagebreak", "pagefigure", "pagegridspanwidth", "pageinjection", "pagestaterealpage", "paletsize", "pdfTeX", "pdfactualtext", "pdfbackendactualtext", "pdfbackendcurrentresources", "pdfbackendsetcatalog", "pdfbackendsetcolorspace", "pdfbackendsetextgstate", "pdfbackendsetinfo", "pdfbackendsetname", "pdfbackendsetpageattribute", "pdfbackendsetpageresource", "pdfbackendsetpagesattribute", "pdfbackendsetpattern", "pdfbackendsetshade", "pdfcolor", "pdfeTeX", "percent", "percentdimen", "permitcaretescape", "permitcircumflexescape", "permitspacesbetweengroups", "persiandecimals", "persiannumerals", "phantom", "phantombox", "pickupgroupedcommand", "placeattachments", "placebtxrendering", "placecitation", "placecomments", "placecurrentformulanumber", "placedbox", "placefloatwithsetups", "placeframed", "placehelp", "placeinitial", "placelayer", "placelayeredtext", "placelistofpublications", "placelistofsorts", "placelistofsynonyms", "placelocalnotes", "placement", "placenamedfloat", "placenamedformula", "placenotes", "placepairedbox", "placeparallel", "placerenderingwindow", "popattribute", "popmacro", "popmode", "popsystemmode", "positionoverlay", "positionregionoverlay", "postponenotes", "predefinedfont", "predefinefont", "predefinesymbol", "prefixedpagenumber", "prependetoks", "prependgvalue", "prependtocommalist", "prependtoks", "prependtoksonce", "prependvalue", "presetdocument", "presetfieldsymbols", "pretocommalist", "prevcounter", "prevcountervalue", "preventmode", "prevrealpage", "prevrealpagenumber", "prevsubcountervalue", "prevsubpage", "prevsubpagenumber", "prevuserpage", "prevuserpagenumber", "procent", "processMPbuffer", "processMPfigurefile", "processaction", "processallactionsinset", "processassignlist", "processassignmentcommand", "processassignmentlist", "processbetween", "processbodyfontenvironmentlist", "processcolorcomponents", "processcommacommand", "processcommalist", "processcommalistwithparameters", "processcontent", "processfile", "processfilemany", "processfilenone", "processfileonce", "processfirstactioninset", "processisolatedchars", "processisolatedwords", "processlinetablebuffer", "processlinetablefile", "processlist", "processmonth", "processranges", "processseparatedlist", "processtexbuffer", "processtokens", "processuntil", "processxtablebuffer", "processyear", "profiledbox", "profilegivenbox", "pseudoMixedCapped", "pseudoSmallCapped", "pseudoSmallcapped", "pseudosmallcapped", "purenumber", "pushattribute", "pushbutton", "pushmacro", "pushmode", "pushoutputstream", "pushsystemmode", "qquad", "quad", "quads", "quitcommalist", "quitprevcommalist", "quittypescriptscanning", "raisebox", "randomizetext", "randomnumber", "rawcounter", "rawcountervalue", "rawdate", "rawdoifelseinset", "rawdoifinset", "rawdoifinsetelse", "rawgetparameters", "rawprocessaction", "rawprocesscommacommand", "rawprocesscommalist", "rawstructurelistuservariable", "rawsubcountervalue", "rbox", "readfile", "readfixfile", "readjobfile", "readlocfile", "readsetfile", "readsysfile", "readtexfile", "readxmlfile", "realSmallCapped", "realSmallcapped", "realpagenumber", "realsmallcapped", "recursedepth", "recurselevel", "recursestring", "redoconvertfont", "referenceprefix", "registerattachment", "registerctxluafile", "registerexternalfigure", "registerfontclass", "registerhyphenationexception", "registerhyphenationpattern", "registermenubuttons", "registersort", "registersynonym", "registerunit", "regular", "relatemarking", "relateparameterhandlers", "relaxvalueifundefined", "remainingcharacters", "removebottomthings", "removedepth", "removefromcommalist", "removelastskip", "removelastspace", "removemarkedcontent", "removepunctuation", "removesubstring", "removetoks", "removeunwantedspaces", "replacefeature", "replaceincommalist", "replaceword", "rescan", "rescanwithsetup", "resetMPdrawing", "resetMPenvironment", "resetMPinstance", "resetallattributes", "resetandaddfeature", "resetbar", "resetbreakpoints", "resetbuffer", "resetcharacteralign", "resetcharacterkerning", "resetcharacterspacing", "resetcharacterstripping", "resetcollector", "resetcounter", "resetdigitsmanipulation", "resetdirection", "resetfeature", "resetflag", "resetfontcolorsheme", "resetfontfallback", "resetfontsolution", "resethyphenationfeatures", "resetinjector", "resetinteractionmenu", "resetitaliccorrection", "resetlayer", "resetlocalfloats", "resetmarker", "resetmode", "resetpagenumber", "resetparallel", "resetpath", "resetpenalties", "resetprofile", "resetreference", "resetreplacement", "resetscript", "resetsetups", "resetshownsynonyms", "resetsubpagenumber", "resetsymbolset", "resetsystemmode", "resettimer", "resettrackers", "resettrialtypesetting", "resetusedsortings", "resetusedsynonyms", "resetuserpagenumber", "resetvalue", "resetvisualizers", "reshapebox", "resolvedglyphdirect", "resolvedglyphstyled", "restartcounter", "restorebox", "restorecatcodes", "restorecounter", "restorecurrentattributes", "restoreendofline", "restoreglobalbodyfont", "reusableMPgraphic", "reuseMPgraphic", "reuserandomseed", "revivefeature", "rfence", "rhbox", "right", "rightbottombox", "rightbox", "righthbox", "rightorleftpageaction", "rightskipadaption", "rightsubguillemot", "righttolefthbox", "righttoleftvbox", "righttoleftvtop", "righttopbox", "rlap", "robustaddtocommalist", "robustdoifelseinset", "robustdoifinsetelse", "robustpretocommalist", "rollbutton", "roman", "rtop", "ruledhbox", "ruledhpack", "ruledmbox", "ruledtopv", "ruledtpack", "ruledvbox", "ruledvpack", "ruledvtop", "runMPbuffer", "runninghbox", "safechar", "sans", "sansbold", "sansnormal", "sansserif", "savebox", "savebtxdataset", "savebuffer", "savecounter", "savecurrentattributes", "savenormalmeaning", "savetaggedtwopassdata", "savetwopassdata", "sbox", "sd", "secondoffivearguments", "secondoffourarguments", "secondofsixarguments", "secondofthreearguments", "secondofthreeunexpanded", "secondoftwoarguments", "secondoftwounexpanded", "select", "serializecommalist", "serializedcommalist", "serif", "serifbold", "serifnormal", "setJSpreamble", "setMPlayer", "setMPpositiongraphic", "setMPpositiongraphicrange", "setMPtext", "setMPvariable", "setMPvariables", "setbar", "setbigbodyfont", "setboxllx", "setboxlly", "setbreakpoints", "setcapstrut", "setcatcodetable", "setcharacteralign", "setcharactercasing", "setcharactercleaning", "setcharacterkerning", "setcharacterspacing", "setcharacterstripping", "setcharstrut", "setcollector", "setcolormodell", "setcounter", "setcounterown", "setcurrentfontclass", "setdataset", "setdefaultpenalties", "setdigitsmanipulation", "setdirection", "setdocumentargument", "setdocumentargumentdefault", "setdocumentfilename", "setdummyparameter", "setelementexporttag", "setemeasure", "setevalue", "setevariable", "setevariables", "setfirstline", "setflag", "setfont", "setfontcolorsheme", "setfontfeature", "setfontsolution", "setfontstrut", "setfractions", "setgmeasure", "setgvalue", "setgvariable", "setgvariables", "sethboxregister", "sethyphenatedurlafter", "sethyphenatedurlbefore", "sethyphenatedurlnormal", "sethyphenationfeatures", "setinitial", "setinjector", "setinteraction", "setinterfacecommand", "setinterfaceconstant", "setinterfaceelements", "setinterfacemessage", "setinterfacevariable", "setinternalrendering", "setitaliccorrection", "setlayer", "setlayerframed", "setlayertext", "setlinefiller", "setlocalhsize", "setmainbodyfont", "setmainparbuilder", "setmarker", "setmarking", "setmathstyle", "setmeasure", "setmessagetext", "setmode", "setnostrut", "setnote", "setnotetext", "setobject", "setoldstyle", "setpagegrid", "setpagereference", "setpagestate", "setpagestaterealpageno", "setpenalties", "setpercentdimen", "setposition", "setpositionbox", "setpositiondata", "setpositiondataplus", "setpositiononly", "setpositionplus", "setpositionstrut", "setprofile", "setrandomseed", "setreference", "setreferencedobject", "setregisterentry", "setreplacement", "setrigidcolumnbalance", "setrigidcolumnhsize", "setscript", "setsectionblock", "setsimplecolumnhsize", "setsmallbodyfont", "setsmallcaps", "setstackbox", "setstructurepageregister", "setstrut", "setsuperiors", "setsystemmode", "settabular", "settaggedmetadata", "settightobject", "settightreferencedobject", "settightunreferencedobject", "settrialtypesetting", "setuevalue", "setugvalue", "setunreferencedobject", "setup", "setupMPgraphics", "setupMPinstance", "setupMPpage", "setupMPvariables", "setupTABLE", "setupTEXpage", "setupattachment", "setupbackend", "setupbar", "setupbleeding", "setupbookmark", "setupbtx", "setupbtxdataset", "setupbtxlist", "setupbtxregister", "setupbtxrendering", "setupbutton", "setupcapitals", "setupcharacterkerning", "setupcharacterspacing", "setupchemical", "setupchemicalframed", "setupcollector", "setupcolumnspan", "setupcombination", "setupcounter", "setupdataset", "setupdelimitedtext", "setupdescription", "setupdirections", "setupdocument", "setupeffect", "setupenumeration", "setupenv", "setupexport", "setupexternalfigure", "setupexternalsoundtracks", "setupfieldbody", "setupfieldcategory", "setupfieldcontentframed", "setupfieldlabelframed", "setupfieldtotalframed", "setupfiller", "setupfirstline", "setupfittingpage", "setupfloatcaption", "setupfontexpansion", "setupfontprotrusion", "setupfonts", "setupfontsolution", "setupformula", "setupformulaframed", "setupframedcontent", "setupframedtext", "setupglobalreferenceprefix", "setupheadalternative", "setuphelp", "setuphigh", "setuphighlight", "setuphyphenation", "setupindentedtext", "setupinitial", "setupinsertion", "setupitaliccorrection", "setuplabel", "setuplayer", "setuplayeredtext", "setuplayouttext", "setuplinefiller", "setuplinefillers", "setuplinenote", "setuplinetable", "setuplistalternative", "setuplistextra", "setuplocalfloats", "setuplocalinterlinespace", "setuplow", "setuplowhigh", "setuplowmidhigh", "setupmarginblock", "setupmargindata", "setupmarginframed", "setupmarginrule", "setupmathcases", "setupmathematics", "setupmathfence", "setupmathfraction", "setupmathframed", "setupmathmatrix", "setupmathornament", "setupmathradical", "setupmathstackers", "setupmathstyle", "setupmixedcolumns", "setupmodule", "setupnotation", "setupnotations", "setupnote", "setupnotes", "setupoffset", "setupoffsetbox", "setupoutputroutine", "setuppagechecker", "setuppagegrid", "setuppagegridarea", "setuppagegridareatext", "setuppagegridlines", "setuppagegridspan", "setuppagegridstart", "setuppageinjection", "setuppageinjectionalternative", "setuppageshift", "setuppagestate", "setuppairedbox", "setupparagraph", "setupparagraphintro", "setupparallel", "setupperiods", "setuppositionbar", "setupprocessor", "setupprofile", "setupquotation", "setuprealpagenumber", "setupreferenceformat", "setupreferenceprefix", "setupreferencestructureprefix", "setupregisters", "setuprenderingwindow", "setups", "setupscale", "setupscript", "setupscripts", "setupselector", "setupshift", "setupsidebar", "setupspellchecking", "setupstretched", "setupstruts", "setupstyle", "setupsubformula", "setuptabulation", "setuptagging", "setuptextbackground", "setuptextflow", "setuptooltip", "setupunit", "setupurl", "setupuserpagenumber", "setupversion", "setupviewerlayer", "setupvspacing", "setupwithargument", "setupwithargumentswapped", "setupxml", "setupxtable", "setuvalue", "setuxvalue", "setvalue", "setvariable", "setvariables", "setvboxregister", "setvisualizerfont", "setvtopregister", "setwidthof", "setxmeasure", "setxvalue", "setxvariable", "setxvariables", "sfrac", "shapedhbox", "showallmakeup", "showattributes", "showboxes", "showbtxdatasetauthors", "showbtxdatasetcompleteness", "showbtxdatasetfields", "showbtxfields", "showbtxhashedauthors", "showbtxtables", "showchardata", "showcharratio", "showcolorbar", "showcolorcomponents", "showcolorset", "showcolorstruts", "showcounter", "showdirectives", "showdirsinmargin", "showedebuginfo", "showexperiments", "showfont", "showfontdata", "showfontkerns", "showfontparameters", "showfontstrip", "showfontstyle", "showglyphs", "showgridsnapping", "showhelp", "showhyphenationtrace", "showhyphens", "showinjector", "showjustification", "showkerning", "showlayoutcomponents", "showligature", "showligatures", "showlogcategories", "showmargins", "showmessage", "showminimalbaseline", "shownextbox", "showotfcomposition", "showparentchain", "showsetupsdefinition", "showtimer", "showtokens", "showtrackers", "showvalue", "showvariable", "showwarning", "simplegroupedcommand", "singalcharacteralign", "singlebond", "sixthofsixarguments", "slanted", "slantedbold", "slicepages", "slovenianNumerals", "sloveniannumerals", "small", "smallbodyfont", "smallbold", "smallbolditalic", "smallboldslanted", "smallcappedcharacters", "smallcappedromannumerals", "smaller", "smallitalicbold", "smallnormal", "smallskip", "smallslanted", "smallslantedbold", "smalltype", "smash", "smashbox", "smashboxed", "smashedhbox", "smashedvbox", "snaptogrid", "someheadnumber", "somekindoftab", "somelocalfloat", "somenamedheadnumber", "someplace", "sp", "spanishNumerals", "spanishnumerals", "speech", "splitatasterisk", "splitatcolon", "splitatcolons", "splitatcomma", "splitdfrac", "splitfilename", "splitfrac", "splitoffbase", "splitofffull", "splitoffkind", "splitoffname", "splitoffpath", "splitoffroot", "splitofftokens", "splitofftype", "splitstring", "spreadhbox", "sqrt", "stackrel", "startregister", "startstructurepageregister", "stopregister", "stopstructurepageregister", "strictdoifelsenextoptional", "strictdoifnextoptionalelse", "stripcharacter", "strippedcsname", "stripspaces", "structurelistuservariable", "structurenumber", "structuretitle", "structureuservariable", "structurevariable", "strut", "strutdp", "strutht", "struthtdp", "struttedbox", "strutwd", "style", "styleinstance", "subsentence", "substituteincommalist", "subtractfeature", "swapcounts", "swapdimens", "swapface", "swapmacros", "swaptypeface", "switchstyleonly", "switchtocolor", "switchtointerlinespace", "symbolreference", "synchronizeblank", "synchronizeindenting", "synchronizemarking", "synchronizeoutputstreams", "synchronizestrut", "synchronizewhitespace", "systemlog", "systemlogfirst", "systemloglast", "systemsetups", "tLeftarrow", "tLeftrightarrow", "tRightarrow", "tabulateautoline", "tabulateautorule", "tabulateline", "tabulaterule", "taggedctxcommand", "taggedlabeltexts", "tbinom", "tbox", "tequal", "testandsplitstring", "testfeature", "testfeatureonce", "testpageonly", "testpagesync", "testtokens", "texdefinition", "texsetup", "textcitation", "textcite", "textcontrolspace", "textflowcollector", "textmath", "textminus", "textormathchar", "textplus", "textvisiblespace", "tfrac", "thainumerals", "thefirstcharacter", "thenormalizedbodyfontsize", "theremainingcharacters", "thickspace", "thinspace", "thirdoffivearguments", "thirdoffourarguments", "thirdofsixarguments", "thirdofthreearguments", "thirdofthreeunexpanded", "thookleftarrow", "thookrightarrow", "threedigitrounding", "tibetannumerals", "tightlayer", "tinyfont", "tlap", "tleftarrow", "tleftharpoondown", "tleftharpoonup", "tleftrightarrow", "tleftrightharpoons", "tmapsto", "tochar", "tolinenote", "topbox", "topleftbox", "toplinebox", "toprightbox", "topskippedbox", "tracecatcodetables", "tracedfontname", "traceoutputroutines", "tracepositions", "transparencycomponents", "transparent", "trel", "trightarrow", "trightharpoondown", "trightharpoonup", "trightleftharpoons", "trightoverleftarrow", "triplebond", "truefilename", "truefontname", "ttriplerel", "ttwoheadleftarrow", "ttwoheadrightarrow", "twodigitrounding", "tx", "txx", "typ", "typedefinedbuffer", "typeface", "typescriptone", "typescriptprefix", "typescriptthree", "typescripttwo", "typesetbuffer", "typesetfile", "uconvertnumber", "uedcatcodecommand", "undefinevalue", "undepthed", "underbar", "underbars", "underbartext", "underbrace", "underbracetext", "underbracket", "underbrackettext", "underdash", "underdashes", "underdot", "underdots", "underleftarrow", "underleftharpoondown", "underleftharpoonup", "underleftrightarrow", "underparent", "underparenttext", "underrandom", "underrandoms", "underrightarrow", "underrightharpoondown", "underrightharpoonup", "underset", "understrike", "understrikes", "undertwoheadleftarrow", "undertwoheadrightarrow", "undoassign", "unframed", "unhhbox", "unihex", "uniqueMPgraphic", "uniqueMPpagegraphic", "unprotected", "unregisterhyphenationpattern", "unspaceafter", "unspaceargument", "unspaced", "unspacestring", "untexargument", "untexcommand", "uppercased", "uppercasestring", "upperleftdoubleninequote", "upperleftdoublesixquote", "upperleftsingleninequote", "upperleftsinglesixquote", "upperrightdoubleninequote", "upperrightdoublesixquote", "upperrightsingleninequote", "upperrightsinglesixquote", "url", "useJSscripts", "useMPenvironmentbuffer", "useMPgraphic", "useMPlibrary", "useMPrun", "useMPvariables", "useURL", "useblankparameter", "usebodyfont", "usebodyfontparameter", "usebtxdataset", "usebtxdefinitions", "usecolors", "usecomponent", "usedummycolorparameter", "usedummystyleandcolor", "usedummystyleparameter", "useenvironment", "useexternalrendering", "usefigurebase", "usefile", "usegridparameter", "useindentingparameter", "useindentnextparameter", "useinterlinespaceparameter", "uselanguageparameter", "useluamodule", "usemathstyleparameter", "useproduct", "useprofileparameter", "useproject", "usereferenceparameter", "userpagenumber", "usesetupsparameter", "usestaticMPfigure", "usesubpath", "usetexmodule", "useurl", "usezipfile", "utfchar", "utflower", "utfupper", "utilityregisterlength", "vboxreference", "verbatim", "verbatimstring", "verbosenumber", "verticalgrowingbar", "verticalpositionbar", "vglue", "viewerlayer", "vphantom", "vpos", "vsmash", "vsmashbox", "vsmashed", "vspace", "vspacing", "wdofstring", "widthofstring", "widthspanningtext", "withoutpt", "word", "words", "wordtonumber", "writedatatolist", "writestatus", "xLeftarrow", "xLeftrightarrow", "xRightarrow", "xdefconvertedargument", "xequal", "xfrac", "xhookleftarrow", "xhookrightarrow", "xleftarrow", "xleftharpoondown", "xleftharpoonup", "xleftrightarrow", "xleftrightharpoons", "xmapsto", "xmladdindex", "xmlafterdocumentsetup", "xmlaftersetup", "xmlall", "xmlappenddocumentsetup", "xmlappendsetup", "xmlapplyselectors", "xmlatt", "xmlattdef", "xmlattribute", "xmlattributedef", "xmlbadinclusions", "xmlbeforedocumentsetup", "xmlbeforesetup", "xmlchainatt", "xmlchainattdef", "xmlchecknamespace", "xmlcommand", "xmlconcat", "xmlconcatrange", "xmlcontext", "xmlcount", "xmldefaulttotext", "xmldirectives", "xmldirectivesafter", "xmldirectivesbefore", "xmldisplayverbatim", "xmldoif", "xmldoifelse", "xmldoifelseempty", "xmldoifelseselfempty", "xmldoifelsetext", "xmldoifelsevalue", "xmldoifnot", "xmldoifnotselfempty", "xmldoifnottext", "xmldoifselfempty", "xmldoiftext", "xmlelement", "xmlfilter", "xmlfirst", "xmlflush", "xmlflushcontext", "xmlflushdocumentsetups", "xmlflushlinewise", "xmlflushpure", "xmlflushspacewise", "xmlflushtext", "xmlinclude", "xmlinclusion", "xmlinclusions", "xmlinfo", "xmlinjector", "xmlinlineverbatim", "xmlinstalldirective", "xmllast", "xmllastatt", "xmllastmatch", "xmlloadbuffer", "xmlloaddata", "xmlloaddirectives", "xmlloadfile", "xmlloadonly", "xmlmain", "xmlmapvalue", "xmlname", "xmlnamespace", "xmlnonspace", "xmlpath", "xmlpos", "xmlposition", "xmlprependdocumentsetup", "xmlprependsetup", "xmlprettyprint", "xmlprocessbuffer", "xmlprocessdata", "xmlprocessfile", "xmlpure", "xmlraw", "xmlrefatt", "xmlregistereddocumentsetups", "xmlregisteredsetups", "xmlregisterns", "xmlremapname", "xmlremapnamespace", "xmlremovedocumentsetup", "xmlremovesetup", "xmlresetdocumentsetups", "xmlresetinjectors", "xmlresetsetups", "xmlsave", "xmlsetentity", "xmlsetfunction", "xmlsetinjectors", "xmlsetsetup", "xmlsetup", "xmlshow", "xmlsnippet", "xmlstrip", "xmlstripnolines", "xmlstripped", "xmlstrippednolines", "xmltag", "xmltexentity", "xmltext", "xmltobuffer", "xmltobufferverbose", "xmltofile", "xmlvalue", "xmlverbatim", "xrel", "xrightarrow", "xrightharpoondown", "xrightharpoonup", "xrightleftharpoons", "xrightoverleftarrow", "xsplitstring", "xtriplerel", "xtwoheadleftarrow", "xtwoheadrightarrow", "xxfrac", "xypos", "آیتم", "آیتمها", "آیتمبندی", "آینه", "از", "استفادهبلوکها", "استفادهدستخطتایپ", "استفادهشکلخارجی", "استفادهقطعهموزیکخارجی", "استفادهمدول", "استفادهمسیر", "استفادهنمادها", "استفادهنوشتارخارجی", "استفادهپروندهدستخطتایپ", "اعدادلاتین", "افزودن", "انتخاببلوکها", "بارگذاریآرایش", "بارگذاریآیتمها", "بارگذاریارجاع", "بارگذاریاندازهبرگ", "بارگذاریباریکتر", "بارگذاریبافر", "بارگذاریبالا", "بارگذاریبردباری", "بارگذاریبرنامهها", "بارگذاریبرگ", "بارگذاریبلوک", "بارگذاریبلوکبخش", "بارگذاریتایپ", "بارگذاریتایپکردن", "بارگذاریترتیب", "بارگذاریتنظیمریاضی", "بارگذاریتهبرگ", "بارگذاریتورفتگی", "بارگذاریتوضیح", "بارگذاریتوضیحصفحه", "بارگذاریثبت", "بارگذاریجانشانی", "بارگذاریجدولها", "بارگذاریجدولبندی", "بارگذاریخالی", "بارگذاریخطها", "بارگذاریخطهایحاشیه", "بارگذاریخطهایسیاه", "بارگذاریخطهایمتن", "بارگذاریخطهاینازک", "بارگذاریدرجدرخطها", "بارگذاریدرجمخالف", "بارگذاریدوران", "بارگذاریرنگ", "بارگذاریرنگها", "بارگذاریزبان", "بارگذاریستونها", "بارگذاریسر", "بارگذاریسربرگ", "بارگذاریسرها", "بارگذاریشرح", "بارگذاریشروعپایان", "بارگذاریشمارهزیرصفحه", "بارگذاریشمارهسر", "بارگذاریشمارهصفحه", "بارگذاریشمارهگذاریصفحه", "بارگذاریشمارهگذاریپاراگراف", "بارگذاریشمارهگذاریخط", "بارگذاریشناور", "بارگذاریشکافتنشناورها", "بارگذاریطرح", "بارگذاریطرحبندی", "بارگذاریعرضخط", "بارگذاریفاصلهبینخط", "بارگذاریفضایسفید", "بارگذاریفضاگذاری", "بارگذاریقالبی", "بارگذاریقلممتن", "بارگذاریلوح", "بارگذاریلیست", "بارگذاریلیستترکیبی", "بارگذاریمترادفها", "بارگذاریمتن", "بارگذاریمتنهایبالا", "بارگذاریمتنسربرگ", "بارگذاریمتنمتنها", "بارگذاریمتنپانوشت", "بارگذاریمتنپایین", "بارگذاریمجموعهنماد", "بارگذاریمنویپانل", "بارگذاریمکانگذاری", "بارگذاریمیدان", "بارگذاریمیدانها", "بارگذاریمیلهپانل", "بارگذارینشانهشکستن", "بارگذارینشانهگذاری", "بارگذارینقل", "بارگذاریپاراگرافها", "بارگذاریپانل", "بارگذاریپایین", "بارگذاریپردهپانل", "بارگذاریپرکردنخطها", "بارگذاریپسزمینه", "بارگذاریپسزمینهها", "بارگذاریچیدن", "بارگذاریگذارصفحه", "بارگذاریگروههایآیتم", "بارگذاریگروهآیتم", "بازنشانینشانهگذاری", "بخش", "بدونخطبالاوپایین", "بدونخطسروتهبرگ", "بدونفضا", "برنامه", "بروبه", "بروبهجعبه", "بروبهصفحه", "بروپایین", "بلند", "بلوکهایپردازش", "بلوکهاپنهان", "بنویسبینلیست", "بنویسدرلیست", "تاریخ", "تاریخجاری", "تایپ", "تایپبافر", "تایپپرونده", "ترجمه", "تعریف", "تعریفآرایش", "تعریفالگویجدول", "تعریفاندازهبرگ", "تعریفبافر", "تعریفبخش", "تعریفبرنامه", "تعریفبرچسب", "تعریفبلوک", "تعریفبلوکبخش", "تعریفتایپ", "تعریفتایپکردن", "تعریفتبدیل", "تعریفترتیب", "تعریفترکیب", "تعریفتنظیمریاضی", "تعریفتودهمیدان", "تعریفثبت", "تعریفجانشانی", "تعریفجدولبندی", "تعریفجعبهافقی", "تعریفرنگ", "تعریفزیرمیدان", "تعریفسبک", "تعریفسبکقلم", "تعریفسر", "تعریفشرح", "تعریفشروعپایان", "تعریفشمارهبندی", "تعریفشمایلمرجع", "تعریفشناور", "تعریفشکستنستون", "تعریفشکستصفحه", "تعریفطرحبندی", "تعریفقالبی", "تعریفقلم", "تعریفقلممتن", "تعریفلایه", "تعریفلوح", "تعریفلیست", "تعریفلیستترکیبی", "تعریفمترادفها", "تعریفمترادفقلم", "تعریفمتن", "تعریفمتنقالبی", "تعریفمحیطقلمبدنه", "تعریفمرجع", "تعریفمنویپانل", "تعریفمیدان", "تعریفنشانهگذاری", "تعریفنماد", "تعریفنمادشکل", "تعریفپاراگرافها", "تعریفپروفایل", "تعریفپوشش", "تعریفگروهآیتم", "تعریفگروهرنگ", "تعیینشمارهسر", "تعیینمحتوایمتن", "تعیینمشخصاتثبت", "تعیینمشخصاتلیست", "تغییربهقلمبدنه", "تنظیمطرحبندی", "توجه", "توری", "توضیح", "تولید", "تک", "ثبتکامل", "جدول", "حرف", "حرفها", "حفظبلوکها", "خالی", "خطهایسیاه", "خطهاینازک", "خطهاخالی", "خطسیاه", "خطمتن", "خطمو", "خطنازک", "خا", "خع", "در", "درجثبت", "درجدرخط", "درجدرخطها", "درجدرمتن", "درجدربالاییکدیگر", "درجدرتوری", "درجزیرفرمول", "درجشمارهسر", "درجشمارهصفحه", "درجشناور", "درجفرمول", "درجلیست", "درجلیستخام", "درجلیستمختلط", "درجمتنسر", "درجپانوشتها", "درجپانوشتهایموضعی", "درجچوبخط", "درجکناربهکنار", "درخط", "درصفحه", "درقالبی", "درمورد", "درون", "درپر", "دریافتبافر", "دریافتنشانه", "دوران", "دکمه", "دکمهمنو", "دکمهپانل", "رج", "رنگ", "رنگخاکستری", "روزهفته", "ریاضی", "زبان", "زباناصلی", "زیربخش", "زیرزیربخش", "زیرزیرزیربخش", "زیرزیرزیرزیربخش", "زیرزیرزیرزیرموضوع", "زیرزیرزیرموضوع", "زیرزیرموضوع", "زیرموضوع", "ستون", "ستونامتحان", "سخنرانی", "سرپوشکوچکنه", "شروعJScode", "شروعJSpreamble", "شروعMPclip", "شروعMPcode", "شروعMPdefinitions", "شروعMPdrawing", "شروعMPenvironment", "شروعMPextensions", "شروعMPinclusions", "شروعMPinitializations", "شروعMPpage", "شروعMPpositiongraphic", "شروعMPpositionmethod", "شروعMPrun", "شروعTABLE", "شروعTABLEbody", "شروعTABLEfoot", "شروعTABLEhead", "شروعTABLEnext", "شروعTC", "شروعTD", "شروعTDs", "شروعTEXpage", "شروعTH", "شروعTN", "شروعTR", "شروعTRs", "شروعTX", "شروعTY", "شروعallmodes", "شروعarrangedpages", "شروعaside", "شروعattachment", "شروعbar", "شروعbinom", "شروعbitmapimage", "شروعblockquote", "شروعbtxrenderingdefinitions", "شروعbuffer", "شروعbutton", "شروعcatcodetable", "شروعcharacteralign", "شروعcheckedfences", "شروعchemical", "شروعcollect", "شروعcollecting", "شروعcolorintent", "شروعcoloronly", "شروعcolorset", "شروعcolumns", "شروعcolumnspan", "شروعcombination", "شروعcomment", "شروعcontextcode", "شروعcontextdefinitioncode", "شروعctxfunction", "شروعctxfunctiondefinition", "شروعcurrentcolor", "شروعcurrentlistentrywrapper", "شروعdbinom", "شروعdelimited", "شروعdelimitedtext", "شروعdfrac", "شروعdisplaymath", "شروعdmath", "شروعdocument", "شروعeffect", "شروعelement", "شروعembeddedxtable", "شروعendofline", "شروعexceptions", "شروعexpanded", "شروعexpandedcollect", "شروعextendedcatcodetable", "شروعexternalfigurecollection", "شروعfigure", "شروعfitfieldframed", "شروعfittingpage", "شروعfloatcombination", "شروعfont", "شروعfontclass", "شروعfontsolution", "شروعformula", "شروعformulas", "شروعfrac", "شروعframedcontent", "شروعframedtext", "شروعgridsnapping", "شروعhbox", "شروعhboxestohbox", "شروعhboxregister", "شروعhelptext", "شروعhiddenbar", "شروعhiding", "شروعhighlight", "شروعhyphenation", "شروعimath", "شروعindentation", "شروعindentedtext", "شروعinmframed", "شروعinteraction", "شروعinterface", "شروعintertext", "شروعitemgroup", "شروعknockout", "شروعlayout", "شروعlinecorrection", "شروعlinefiller", "شروعlinenumbering", "شروعlinetable", "شروعlinetablebody", "شروعlinetablecell", "شروعlinetablehead", "شروعlocalfootnotes", "شروعlocalheadsetup", "شروعlocallinecorrection", "شروعlocalnotes", "شروعlocalsetups", "شروعlua", "شروعluacode", "شروعluaparameterset", "شروعluasetups", "شروعmakeup", "شروعmarginblock", "شروعmarkedcontent", "شروعmathmode", "شروعmathstyle", "شروعmatrices", "شروعmcframed", "شروعmdformula", "شروعmframed", "شروعmixedcolumns", "شروعmode", "شروعmodeset", "شروعmodule", "شروعmoduletestsection", "شروعmpformula", "شروعnamedsection", "شروعnamedsubformulas", "شروعnarrow", "شروعnarrower", "شروعnegative", "شروعnicelyfilledbox", "شروعnobar", "شروعnointerference", "شروعnotallmodes", "شروعnotext", "شروعnotmode", "شروعopposite", "شروعoutputstream", "شروعoverlay", "شروعoverprint", "شروعpagecomment", "شروعpagefigure", "شروعpagegrid", "شروعpagegridspan", "شروعpagelayout", "شروعpar", "شروعparagraph", "شروعparagraphs", "شروعparagraphscell", "شروعparbuilder", "شروعpath", "شروعplacepairedbox", "شروعpositioning", "شروعpositionoverlay", "شروعpositive", "شروعpostponing", "شروعprocessassignmentcommand", "شروعprocessassignmentlist", "شروعprocesscommacommand", "شروعprocesscommalist", "شروعprotect", "شروعprotectedcolors", "شروعpunctuation", "شروعrandomized", "شروعrandomseed", "شروعrawsetups", "شروعreadingfile", "شروعreferenceprefix", "شروعregime", "شروعreusableMPgraphic", "شروعscript", "شروعsdformula", "شروعsectionblock", "شروعsectionblockenvironment", "شروعsectionlevel", "شروعsetups", "شروعsfrac", "شروعshapebox", "شروعshift", "شروعsidebar", "شروعsimplecolumns", "شروعspecialitem", "شروعspeech", "شروعspformula", "شروعspread", "شروعstartstop", "شروعstaticMPfigure", "شروعstaticMPgraphic", "شروعstrictinspectnextcharacter", "شروعstrut", "شروعstyle", "شروعsubformulas", "شروعsubjectlevel", "شروعsubsentence", "شروعsubstack", "شروعsymbolset", "شروعtable", "شروعtablehead", "شروعtables", "شروعtabletail", "شروعtabulate", "شروعtabulatehead", "شروعtabulatetail", "شروعtagged", "شروعtbinom", "شروعtexcode", "شروعtexdefinition", "شروعtext", "شروعtextbackground", "شروعtextbackgroundmanual", "شروعtextcolor", "شروعtextcolorintent", "شروعtextflow", "شروعtokens", "شروعtransparent", "شروعtypescript", "شروعtypescriptcollection", "شروعunderdash", "شروعunderdashes", "شروعunderdot", "شروعunderdots", "شروعunderrandom", "شروعunderrandoms", "شروعunderstrike", "شروعunderstrikes", "شروعunframed", "شروعuniqueMPgraphic", "شروعuniqueMPpagegraphic", "شروعunpacked", "شروعusableMPgraphic", "شروعuseMPgraphic", "شروعusemathstyleparameter", "شروعusingbtxspecification", "شروعvbox", "شروعvboxregister", "شروعvboxtohbox", "شروعvboxtohboxseparator", "شروعviewerlayer", "شروعvtop", "شروعvtopregister", "شروعxcell", "شروعxcellgroup", "شروعxfrac", "شروعxgroup", "شروعxmldisplayverbatim", "شروعxmlinlineverbatim", "شروعxmlraw", "شروعxmlsetups", "شروعxrow", "شروعxrowgroup", "شروعxtable", "شروعxtablebody", "شروعxtablefoot", "شروعxtablehead", "شروعxtablenext", "شروعxxfrac", "شروعآیتم", "شروعآیتمبندی", "شروعبخش", "شروعبروبه", "شروعتوضیح", "شروعتولید", "شروعجدول", "شروعخطحاشیه", "شروعخطزدن", "شروعخطزدنها", "شروعخطمتن", "شروعدرجفرمول", "شروعرنگ", "شروعزیربخش", "شروعزیرزیربخش", "شروعزیرزیرزیربخش", "شروعزیرزیرزیرزیربخش", "شروعزیرزیرزیرزیرموضوع", "شروعزیرزیرزیرموضوع", "شروعزیرزیرموضوع", "شروعزیرموضوع", "شروعسخنرانی", "شروعسر", "شروعشکل", "شروععنوان", "شروعفشرده", "شروعفصل", "شروعقالبی", "شروعمتنقالبی", "شروعمتنکمکی", "شروعمحیط", "شروعمنویپانل", "شروعموضوع", "شروعمولفه", "شروعمیانپرده", "شروعمیلهرو", "شروعمیلهزیر", "شروعمیلههارو", "شروعمیلههایزیر", "شروعنشر", "شروعنقل", "شروعنقلبلوک", "شروعنقلقول", "شروعپروژه", "شروعپسزمینه", "شروعگرافیک", "شروعخط", "شمارهزیرصفحه", "شمارهسر", "شمارهسرجاری", "شمارهصفحه", "شمارهصفحهکامل", "شمارهفرمول", "شمارهمبدل", "شمارهها", "شکافتنشناور", "شکل", "شکلخارجی", "صفحه", "صفحهتست", "طوللیست", "عرضخط", "عنوان", "فصل", "فضا", "فضاهایثابت", "فضایثابت", "فضایسفیدصحیح", "قالبی", "لوحمقایسه", "ماه", "متنقالبی", "متنپانوشت", "متنکمکی", "محیط", "مراجعه", "مرجع", "مرجعصفحه", "مرجعمتن", "مقایسهگروهرنگ", "مقداررنگ", "مقیاس", "منویپانل", "موضوع", "مولفه", "مکان", "میانپرده", "میدان", "میدانشبیهسازی", "میدانپشته", "میدانکپی", "میلهرنگ", "میلهپانل", "ناشناس", "نسخه", "نشانهگذاری", "نصبزبان", "نقطهها", "نقل", "نقلبلوک", "نقلقول", "نماد", "نمایشآرایش", "نمایشبارگذاریها", "نمایشبستها", "نمایشتوری", "نمایشرنگ", "نمایشطرحبندی", "نمایشقالب", "نمایشقلمبدنه", "نمایشلوح", "نمایشمجموعهعلامت", "نمایشمحیطقلمبدنه", "نمایشچاپ", "نمایشگروهرنگ", "پابا", "پایانJScode", "پایانJSpreamble", "پایانMPclip", "پایانMPcode", "پایانMPdefinitions", "پایانMPdrawing", "پایانMPenvironment", "پایانMPextensions", "پایانMPinclusions", "پایانMPinitializations", "پایانMPpage", "پایانMPpositiongraphic", "پایانMPpositionmethod", "پایانMPrun", "پایانTABLE", "پایانTABLEbody", "پایانTABLEfoot", "پایانTABLEhead", "پایانTABLEnext", "پایانTC", "پایانTD", "پایانTDs", "پایانTEXpage", "پایانTH", "پایانTN", "پایانTR", "پایانTRs", "پایانTX", "پایانTY", "پایانallmodes", "پایانarrangedpages", "پایانaside", "پایانattachment", "پایانbar", "پایانbinom", "پایانbitmapimage", "پایانblockquote", "پایانbtxrenderingdefinitions", "پایانbuffer", "پایانbutton", "پایانcatcodetable", "پایانcharacteralign", "پایانcheckedfences", "پایانchemical", "پایانcollect", "پایانcollecting", "پایانcolorintent", "پایانcoloronly", "پایانcolorset", "پایانcolumns", "پایانcolumnspan", "پایانcombination", "پایانcomment", "پایانcontextcode", "پایانcontextdefinitioncode", "پایانctxfunction", "پایانctxfunctiondefinition", "پایانcurrentcolor", "پایانcurrentlistentrywrapper", "پایانdbinom", "پایانdelimited", "پایانdelimitedtext", "پایانdfrac", "پایانdisplaymath", "پایانdmath", "پایانdocument", "پایانeffect", "پایانelement", "پایانembeddedxtable", "پایانendofline", "پایانexceptions", "پایانexpanded", "پایانexpandedcollect", "پایانextendedcatcodetable", "پایانexternalfigurecollection", "پایانfigure", "پایانfitfieldframed", "پایانfittingpage", "پایانfloatcombination", "پایانfont", "پایانfontclass", "پایانfontsolution", "پایانformula", "پایانformulas", "پایانfrac", "پایانframedcontent", "پایانframedtext", "پایانgridsnapping", "پایانhbox", "پایانhboxestohbox", "پایانhboxregister", "پایانhelptext", "پایانhiddenbar", "پایانhiding", "پایانhighlight", "پایانhyphenation", "پایانimath", "پایانindentation", "پایانindentedtext", "پایانinmframed", "پایانinteraction", "پایانinterface", "پایانintertext", "پایانitemgroup", "پایانknockout", "پایانlayout", "پایانlinecorrection", "پایانlinefiller", "پایانlinenumbering", "پایانlinetable", "پایانlinetablebody", "پایانlinetablecell", "پایانlinetablehead", "پایانlocalfootnotes", "پایانlocalheadsetup", "پایانlocallinecorrection", "پایانlocalnotes", "پایانlocalsetups", "پایانlua", "پایانluacode", "پایانluaparameterset", "پایانluasetups", "پایانmakeup", "پایانmarginblock", "پایانmarkedcontent", "پایانmathmode", "پایانmathstyle", "پایانmatrices", "پایانmcframed", "پایانmdformula", "پایانmframed", "پایانmixedcolumns", "پایانmode", "پایانmodeset", "پایانmodule", "پایانmoduletestsection", "پایانmpformula", "پایانnamedsection", "پایانnamedsubformulas", "پایانnarrow", "پایانnarrower", "پایانnegative", "پایانnicelyfilledbox", "پایانnobar", "پایانnointerference", "پایانnotallmodes", "پایانnotext", "پایانnotmode", "پایانopposite", "پایانoutputstream", "پایانoverlay", "پایانoverprint", "پایانpagecomment", "پایانpagefigure", "پایانpagegrid", "پایانpagegridspan", "پایانpagelayout", "پایانpar", "پایانparagraph", "پایانparagraphs", "پایانparagraphscell", "پایانparbuilder", "پایانpath", "پایانplacepairedbox", "پایانpositioning", "پایانpositionoverlay", "پایانpositive", "پایانpostponing", "پایانprocessassignmentcommand", "پایانprocessassignmentlist", "پایانprocesscommacommand", "پایانprocesscommalist", "پایانprotect", "پایانprotectedcolors", "پایانpunctuation", "پایانrandomized", "پایانrandomseed", "پایانrawsetups", "پایانreadingfile", "پایانreferenceprefix", "پایانregime", "پایانreusableMPgraphic", "پایانscript", "پایانsdformula", "پایانsectionblock", "پایانsectionblockenvironment", "پایانsectionlevel", "پایانsetups", "پایانsfrac", "پایانshapebox", "پایانshift", "پایانsidebar", "پایانsimplecolumns", "پایانspecialitem", "پایانspeech", "پایانspformula", "پایانspread", "پایانstartstop", "پایانstaticMPfigure", "پایانstaticMPgraphic", "پایانstrictinspectnextcharacter", "پایانstrut", "پایانstyle", "پایانsubformulas", "پایانsubjectlevel", "پایانsubsentence", "پایانsubstack", "پایانsymbolset", "پایانtable", "پایانtablehead", "پایانtables", "پایانtabletail", "پایانtabulate", "پایانtabulatehead", "پایانtabulatetail", "پایانtagged", "پایانtbinom", "پایانtexcode", "پایانtexdefinition", "پایانtext", "پایانtextbackground", "پایانtextbackgroundmanual", "پایانtextcolor", "پایانtextcolorintent", "پایانtextflow", "پایانtokens", "پایانtransparent", "پایانtypescript", "پایانtypescriptcollection", "پایانunderdash", "پایانunderdashes", "پایانunderdot", "پایانunderdots", "پایانunderrandom", "پایانunderrandoms", "پایانunderstrike", "پایانunderstrikes", "پایانunframed", "پایانuniqueMPgraphic", "پایانuniqueMPpagegraphic", "پایانunpacked", "پایانusableMPgraphic", "پایانuseMPgraphic", "پایانusemathstyleparameter", "پایانusingbtxspecification", "پایانvbox", "پایانvboxregister", "پایانvboxtohbox", "پایانvboxtohboxseparator", "پایانviewerlayer", "پایانvtop", "پایانvtopregister", "پایانxcell", "پایانxcellgroup", "پایانxfrac", "پایانxgroup", "پایانxmldisplayverbatim", "پایانxmlinlineverbatim", "پایانxmlraw", "پایانxmlsetups", "پایانxrow", "پایانxrowgroup", "پایانxtable", "پایانxtablebody", "پایانxtablefoot", "پایانxtablehead", "پایانxtablenext", "پایانxxfrac", "پایانآیتم", "پایانآیتمبندی", "پایانبخش", "پایانبروبه", "پایانتوضیح", "پایانتولید", "پایانجدول", "پایانخطحاشیه", "پایانخطزدن", "پایانخطزدنها", "پایانخطمتن", "پایاندرجفرمول", "پایانرنگ", "پایانزیربخش", "پایانزیرزیربخش", "پایانزیرزیرزیربخش", "پایانزیرزیرزیرزیربخش", "پایانزیرزیرزیرزیرموضوع", "پایانزیرزیرزیرموضوع", "پایانزیرزیرموضوع", "پایانزیرموضوع", "پایانسخنرانی", "پایانسر", "پایانشکل", "پایانعنوان", "پایانفشرده", "پایانفصل", "پایانقالبی", "پایانمتنقالبی", "پایانمتنکمکی", "پایانمحیط", "پایانمنویپانل", "پایانموضوع", "پایانمولفه", "پایانمیانپرده", "پایانمیلهرو", "پایانمیلهزیر", "پایانمیلههارو", "پایانمیلههایزیر", "پایاننشر", "پایاننقل", "پایاننقلبلوک", "پایاننقلقول", "پایانپروژه", "پایانپسزمینه", "پایانگرافیک", "پایانخط", "پایین", "پرده", "پروژه", "پرکردنمیدان", "پسزمینه", "پنهانکردن", "چوبخط", "کشیده", "گرافیک", "گیره", "یادداشت", "یکجا", "یکخط" }, - ["ro"]={ "AMSTEX", "AfterPar", "Alphabeticnumerals", "AmSTeX", "And", "BeforePar", "Big", "Bigg", "Biggl", "Biggm", "Biggr", "Bigl", "Bigm", "Bigr", "CONTEXT", "CUVANT", "CUVINTE", "Caps", "ConTeXt", "Context", "ConvertConstantAfter", "ConvertToConstant", "Cuvant", "Cuvinte", "ETEX", "EveryLine", "EveryPar", "GetPar", "GotoPar", "Greeknumerals", "INRSTEX", "Kap", "LAMSTEX", "LATEX", "LUAJITTEX", "LUATEX", "LUNA", "LaTeX", "LamSTeX", "Litera", "Litere", "Lua", "LuaTeX", "LuajitTeX", "METAFONT", "METAFUN", "METAPOST", "MKII", "MKIV", "MKIX", "MKVI", "MKXI", "MONTHLONG", "MONTHSHORT", "MPII", "MPIV", "MPVI", "MPanchor", "MPbetex", "MPc", "MPcode", "MPcolor", "MPcoloronly", "MPcolumn", "MPd", "MPdrawing", "MPfontsizehskip", "MPgetmultipars", "MPgetmultishape", "MPgetposboxes", "MPh", "MPinclusions", "MPleftskip", "MPll", "MPlr", "MPls", "MPmenubuttons", "MPn", "MPoptions", "MPoverlayanchor", "MPp", "MPpage", "MPpardata", "MPplus", "MPpos", "MPpositiongraphic", "MPposset", "MPr", "MPrawvar", "MPregion", "MPrest", "MPrightskip", "MPrs", "MPstring", "MPtext", "MPtransparency", "MPul", "MPur", "MPv", "MPvar", "MPvariable", "MPvv", "MPw", "MPwhd", "MPx", "MPxy", "MPxywhd", "MPy", "MetaFont", "MetaFun", "MetaPost", "NormalizeFontHeight", "NormalizeFontWidth", "NormalizeTextHeight", "NormalizeTextWidth", "Numere", "Numereromane", "PDFETEX", "PDFTEX", "PDFcolor", "PICTEX", "PPCHTEX", "PPCHTeX", "PRAGMA", "PiCTeX", "PointsToBigPoints", "PointsToReal", "PointsToWholeBigPoints", "PtToCm", "ReadFile", "ScaledPointsToBigPoints", "ScaledPointsToWholeBigPoints", "Smallcapped", "TABLE", "TEX", "TEXpage", "TaBlE", "TeX", "TheNormalizedFontSize", "TransparencyHack", "VerboseNumber", "WidthSpanningText", "XETEX", "XeTeX", "ZIDINSAPTAMANA", "abjadnaivenumerals", "abjadnodotnumerals", "abjadnumerals", "activatespacehandler", "adaptcollector", "adapteazaaspect", "adaptfontfeature", "adaptpapersize", "addfeature", "addtoJSpreamble", "addtocommalist", "addvalue", "adubuffer", "adumarcaje", "afiseazaaspect", "afiseazaculoare", "afiseazafonttext", "afiseazagrid", "afiseazagrupculoare", "afiseazamakeup", "afiseazamediufonttext", "afiseazapaleta", "afiseazarama", "afiseazasetari", "afiseazasetsimboluri", "afiseazastruts", "afiseazatiparire", "aftersplitstring", "aftertestandsplitstring", "alignmentcharacter", "allinputpaths", "alphabeticnumerals", "alwayscitation", "alwayscite", "ampersand", "anchor", "appendetoks", "appendgvalue", "appendtocommalist", "appendtoks", "appendtoksonce", "appendvalue", "apply", "applyalternativestyle", "applyprocessor", "applytocharacters", "applytofirstcharacter", "applytosplitstringchar", "applytosplitstringcharspaced", "applytosplitstringline", "applytosplitstringlinespaced", "applytosplitstringword", "applytosplitstringwordspaced", "applytowords", "arabicdecimals", "arabicexnumerals", "arabicnumerals", "arg", "asciistr", "ascundeblocuri", "ascundere", "aside", "assignalfadimension", "assigndimen", "assigndimension", "assignifempty", "assigntranslation", "assignvalue", "assignwidth", "assumelongusagecs", "astype", "attachment", "autocap", "autodirhbox", "autodirvbox", "autodirvtop", "autoinsertnextspace", "automathematics", "autosetups", "availablehsize", "averagecharwidth", "backgroundimage", "backgroundimagefill", "backgroundline", "baraculoare", "barainteractiune", "basegrid", "baselineleftbox", "baselinemiddlebox", "baselinerightbox", "bbox", "beforesplitstring", "beforetestandsplitstring", "big", "bigbodyfont", "bigg", "bigger", "biggl", "biggm", "biggr", "bigl", "bigm", "bigr", "bigskip", "binom", "bitmapimage", "blanc", "blap", "bleed", "bleedheight", "bleedwidth", "blockligatures", "blockquote", "bodyfontenvironmentlist", "bodyfontsize", "bold", "boldface", "bolditalic", "boldslanted", "booleanmodevalue", "bottombox", "bottomleftbox", "bottomrightbox", "boxcursor", "boxmarker", "boxofsize", "boxreference", "bpos", "bthiddencitation", "btxabbreviatedjournal", "btxaddjournal", "btxalwayscitation", "btxauthorfield", "btxdetail", "btxdirect", "btxdoif", "btxdoifcombiinlistelse", "btxdoifelse", "btxdoifelsecombiinlist", "btxdoifelsesameasprevious", "btxdoifelsesameaspreviouschecked", "btxdoifelseuservariable", "btxdoifnot", "btxdoifsameaspreviouscheckedelse", "btxdoifsameaspreviouselse", "btxdoifuservariableelse", "btxexpandedjournal", "btxfield", "btxfieldname", "btxfieldtype", "btxfirstofrange", "btxflush", "btxflushauthor", "btxflushauthorinverted", "btxflushauthorinvertedshort", "btxflushauthorname", "btxflushauthornormal", "btxflushauthornormalshort", "btxflushsuffix", "btxfoundname", "btxfoundtype", "btxhybridcite", "btxlistcitation", "btxloadjournalist", "btxoneorrange", "btxremapauthor", "btxsavejournalist", "btxsetup", "btxsingularorplural", "btxsingularplural", "btxtextcitation", "butoaneinteractiune", "buton", "butonmeniu", "calligraphic", "camel", "camp", "capitol", "catcodetablename", "cbox", "centerbox", "centeredbox", "centerednextbox", "cfrac", "chardescription", "charwidthlanguage", "checkcharacteralign", "checkedchar", "checkedfiller", "checkedstrippedcsname", "checkinjector", "checknextindentation", "checknextinjector", "checkpage", "checkparameters", "checkpreviousinjector", "checksoundtrack", "checktwopassdata", "checkvariables", "chem", "chemical", "chemicalbottext", "chemicalmidtext", "chemicalsymbol", "chemicaltext", "chemicaltoptext", "chineseallnumerals", "chinesecapnumerals", "chinesenumerals", "citat", "citation", "cite", "clap", "classfont", "cldcommand", "cldcontext", "cldloadfile", "cldprocessfile", "cleftarrow", "clip", "cloneazacamp", "collect", "collectedtext", "collectexpanded", "coloana", "colorcomponents", "colored", "coloronly", "columnbreak", "combinepages", "comentariu", "commalistelement", "commalistsentence", "commalistsize", "comment", "comparagrupculoare", "comparapaleta", "comparedimension", "comparedimensioneps", "completeazanumarpagina", "completebtxrendering", "completelist", "completelistofpublications", "completelistofsorts", "completelistofsynonyms", "completeregister", "complexorsimple", "complexorsimpleempty", "componenta", "composedcollector", "composedlayer", "compresult", "constantdimen", "constantdimenargument", "constantemptyargument", "constantnumber", "constantnumberargument", "contentreference", "continuednumber", "continueifinputfile", "convertargument", "convertcommand", "convertedcounter", "converteddimen", "convertedsubcounter", "convertestenumar", "convertmonth", "convertvalue", "convertvboxtohbox", "copiazacamp", "copypages", "copyparameters", "copyposition", "corecteazaspatiualb", "countersubs", "counttoken", "counttokens", "cramped", "crampedclap", "crampedllap", "crampedrlap", "crightarrow", "crightoverleftarrow", "ctop", "ctxcommand", "ctxdirectcommand", "ctxdirectlua", "ctxfunction", "ctxlatecommand", "ctxlatelua", "ctxloadluafile", "ctxlua", "ctxluabuffer", "ctxluacode", "ctxreport", "ctxsprint", "culoare", "culoaregri", "currentassignmentlistkey", "currentassignmentlistvalue", "currentbtxuservariable", "currentcommalistitem", "currentcomponent", "currentenvironment", "currentfeaturetest", "currentinterface", "currentlanguage", "currentlistentrydestinationattribute", "currentlistentrylimitedtext", "currentlistentrynumber", "currentlistentrypagenumber", "currentlistentryreferenceattribute", "currentlistentrytitle", "currentlistentrytitlerendered", "currentlistsymbol", "currentmainlanguage", "currentmessagetext", "currentmoduleparameter", "currentoutputstream", "currentproduct", "currentproject", "currentregime", "currentregisterpageuserdata", "currentresponses", "currenttime", "currentvalue", "currentxtablecolumn", "currentxtablerow", "data", "datacurenta", "datasetvariable", "dayoftheweek", "dayspermonth", "dbinom", "decrement", "decrementcounter", "decrementedcounter", "decrementpagenumber", "decrementsubpagenumber", "decrementvalue", "defaultinterface", "defaultobjectpage", "defaultobjectreference", "defcatcodecommand", "defconvertedargument", "defconvertedcommand", "defconvertedvalue", "defineMPinstance", "defineTABLEsetup", "defineactivecharacter", "definealternativestyle", "defineanchor", "defineattachment", "defineattribute", "definebackground", "definebar", "definebodyfontswitch", "definebreakpoint", "definebreakpoints", "definebtx", "definebtxdataset", "definebtxregister", "definebtxrendering", "definebutton", "definecapitals", "definecharacterkerning", "definecharacterspacing", "definechemical", "definechemicals", "definechemicalsymbol", "definecollector", "definecolumnbreak", "definecombination", "definecomment", "definecomplexorsimple", "definecomplexorsimpleempty", "defineconversionset", "definecounter", "definedataset", "definedelimitedtext", "definedfont", "defineeffect", "defineexpandable", "defineexternalfigure", "definefallbackfamily", "definefieldbody", "definefieldbodyset", "definefieldcategory", "definefileconstant", "definefilefallback", "definefilesynonym", "definefiller", "definefirstline", "definefittingpage", "definefontalternative", "definefontfallback", "definefontfamily", "definefontfamilypreset", "definefontfeature", "definefontfile", "definefontsize", "definefontsolution", "defineformula", "defineformulaalternative", "defineformulaframed", "defineframedcontent", "definefrozenfont", "defineglobalcolor", "definegraphictypesynonym", "definegridsnapping", "defineheadalternative", "definehelp", "definehigh", "definehighlight", "definehspace", "definehypenationfeatures", "defineindentedtext", "defineindenting", "defineinitial", "defineinsertion", "defineinteraction", "defineinteractionbar", "defineinterfaceconstant", "defineinterfaceelement", "defineinterfacevariable", "defineinterlinespace", "defineintermediatecolor", "defineitemgroup", "defineitems", "definelabelclass", "definelayer", "definelayerpreset", "definelayout", "definelinefiller", "definelinenote", "definelinenumbering", "definelines", "definelistalternative", "definelistextra", "definelow", "definelowhigh", "definelowmidhigh", "definemarginblock", "definemargindata", "definemarker", "definemathalignment", "definemathcases", "definemathcommand", "definemathdoubleextensible", "definemathematics", "definemathextensible", "definemathfence", "definemathfraction", "definemathframed", "definemathmatrix", "definemathornament", "definemathoverextensible", "definemathovertextextensible", "definemathradical", "definemathstackers", "definemathstyle", "definemathtriplet", "definemathunderextensible", "definemathundertextextensible", "definemathunstacked", "definemeasure", "definemessageconstant", "definemixedcolumns", "definemode", "definemultitonecolor", "definenamedcolor", "definenamespace", "definenarrower", "definenote", "defineornament", "defineoutputroutine", "defineoutputroutinecommand", "definepage", "definepagebreak", "definepagechecker", "definepagegrid", "definepagegridarea", "definepagegridspan", "definepageinjection", "definepageinjectionalternative", "definepageshift", "definepagestate", "definepairedbox", "defineparagraph", "defineparallel", "defineparbuilder", "defineplacement", "definepositioning", "defineprefixset", "defineprocesscolor", "defineprocessor", "definepushbutton", "definepushsymbol", "definerenderingwindow", "defineresetset", "definescale", "definescript", "definesectionlevels", "defineselector", "defineseparatorset", "defineshift", "definesidebar", "definesort", "definespotcolor", "defineste", "definesteantet", "definestebloc", "definesteblocsectiune", "definestebuffer", "definestecamp", "definesteconversie", "definesteculoare", "definestedescriere", "definestedimensiunehartie", "definesteenumerare", "definesteeticheta", "definestefloat", "definestefont", "definestefonttext", "definesteformatreferinte", "definestegrupculori", "definestehbox", "definesteinconjurare", "definestelista", "definestelistacombinata", "definestemakeup", "definestemarcaje", "definestemediulfonttext", "definestemeniuinteractiune", "definesteoverlay", "definestepaleta", "definesteparagraf", "definesteprofil", "definesteprogram", "definestereferinte", "definesteregistru", "definestesablontabel", "definestesectiune", "definestesimbol", "definestesimbolfigura", "definestesinonim", "definestesinonimfont", "definestesortare", "definestestartstop", "definestestil", "definestestilfont", "definestestivacampuri", "definestesubcamp", "definestetabulatori", "definestetext", "definestetextinconjurat", "definestetyping", "definestyleinstance", "definesubformula", "definesynonym", "definesystemattribute", "definesystemconstant", "definesystemvariable", "definetabulation", "definetextbackground", "definetextflow", "definetooltip", "definetransparency", "definetwopasslist", "definetype", "definetypeface", "definetypescriptprefix", "definetypescriptsynonym", "definetypesetting", "defineunit", "defineviewerlayer", "definevspace", "definevspacing", "definevspacingamount", "definextable", "delimited", "delimitedtext", "depthofstring", "depthonlybox", "depthspanningtext", "despre", "determinacaracteristicilelistei", "determinacaracteristiciregistru", "determinanumartitlu", "determinenoflines", "devanagarinumerals", "dfrac", "digits", "dimensiontocount", "din", "directcolor", "directcolored", "directconvertedcounter", "directdummyparameter", "directgetboxllx", "directgetboxlly", "directhighlight", "directlocalframed", "directluacode", "directselect", "directsetbar", "directsetup", "directsymbol", "directvspacing", "dis", "disabledirectives", "disableexperiments", "disablemode", "disableoutputstream", "disableparpositions", "disableregime", "disabletrackers", "displaymath", "displaymathematics", "displaymessage", "distributedhsize", "dividedsize", "doadaptleftskip", "doadaptrightskip", "doaddfeature", "doassign", "doassignempty", "doboundtext", "docheckassignment", "docheckedpagestate", "docheckedpair", "documentvariable", "dodoubleargument", "dodoubleargumentwithset", "dodoubleempty", "dodoubleemptywithset", "dodoublegroupempty", "doeassign", "doexpandedrecurse", "dogetattribute", "dogetattributeid", "dogetcommacommandelement", "dogobbledoubleempty", "dogobblesingleempty", "doif", "doifMPgraphicelse", "doifallcommon", "doifallcommonelse", "doifalldefinedelse", "doifallmodes", "doifallmodeselse", "doifassignmentelse", "doifblackelse", "doifbothsides", "doifbothsidesoverruled", "doifboxelse", "doifbufferelse", "doifcolor", "doifcolorelse", "doifcommandhandler", "doifcommandhandlerelse", "doifcommon", "doifcommonelse", "doifcontent", "doifconversiondefinedelse", "doifconversionnumberelse", "doifcounter", "doifcounterelse", "doifcurrentfonthasfeatureelse", "doifdefined", "doifdefinedcounter", "doifdefinedcounterelse", "doifdefinedelse", "doifdimensionelse", "doifdimenstringelse", "doifdocumentargument", "doifdocumentargumentelse", "doifdocumentfilename", "doifdocumentfilenameelse", "doifdrawingblackelse", "doifelse", "doifelseMPgraphic", "doifelseallcommon", "doifelsealldefined", "doifelseallmodes", "doifelseassignment", "doifelseblack", "doifelsebox", "doifelsebuffer", "doifelsecolor", "doifelsecommandhandler", "doifelsecommon", "doifelseconversiondefined", "doifelseconversionnumber", "doifelsecounter", "doifelsecurrentfonthasfeature", "doifelsecurrentsortingused", "doifelsecurrentsynonymshown", "doifelsecurrentsynonymused", "doifelsedefined", "doifelsedefinedcounter", "doifelsedimension", "doifelsedimenstring", "doifelsedocumentargument", "doifelsedocumentfilename", "doifelsedrawingblack", "doifelseempty", "doifelseemptyvalue", "doifelseemptyvariable", "doifelseenv", "doifelsefastoptionalcheck", "doifelsefastoptionalcheckcs", "doifelsefieldbody", "doifelsefieldcategory", "doifelsefigure", "doifelsefile", "doifelsefiledefined", "doifelsefileexists", "doifelsefirstchar", "doifelseflagged", "doifelsefontchar", "doifelsefontpresent", "doifelsefontsynonym", "doifelsehasspace", "doifelsehelp", "doifelseincsname", "doifelseinelement", "doifelseinputfile", "doifelseinsertion", "doifelseinset", "doifelseinstring", "doifelseinsymbolset", "doifelseintoks", "doifelseintwopassdata", "doifelseitalic", "doifelselanguage", "doifelselayerdata", "doifelselayoutdefined", "doifelselayoutsomeline", "doifelselayouttextline", "doifelseleapyear", "doifelselist", "doifelselocation", "doifelselocfile", "doifelsemainfloatbody", "doifelsemarking", "doifelsemeaning", "doifelsemessage", "doifelsemode", "doifelsenextbgroup", "doifelsenextbgroupcs", "doifelsenextchar", "doifelsenextoptional", "doifelsenextoptionalcs", "doifelsenextparenthesis", "doifelsenonzeropositive", "doifelsenoteonsamepage", "doifelsenothing", "doifelsenumber", "doifelseobjectfound", "doifelseobjectreferencefound", "doifelseoddpage", "doifelseoddpagefloat", "doifelseoldercontext", "doifelseolderversion", "doifelseoverlapping", "doifelseoverlay", "doifelseparallel", "doifelseparentfile", "doifelsepath", "doifelsepathexists", "doifelsepatterns", "doifelseposition", "doifelsepositionaction", "doifelsepositiononpage", "doifelsepositionsonsamepage", "doifelsepositionsonthispage", "doifelsepositionsused", "doifelsereferencefound", "doifelserightpagefloat", "doifelserighttoleftinbox", "doifelsesamelinereference", "doifelsesamestring", "doifelsesetups", "doifelsesomebackground", "doifelsesomespace", "doifelsesomething", "doifelsesometoks", "doifelsestringinstring", "doifelsestructurelisthasnumber", "doifelsestructurelisthaspage", "doifelsesymboldefined", "doifelsesymbolset", "doifelsetext", "doifelsetextflow", "doifelsetextflowcollector", "doifelsetypingfile", "doifelseundefined", "doifelseurldefined", "doifelsevalue", "doifelsevaluenothing", "doifelsevariable", "doifempty", "doifemptyelse", "doifemptytoks", "doifemptyvalue", "doifemptyvalueelse", "doifemptyvariable", "doifemptyvariableelse", "doifenv", "doifenvelse", "doiffastoptionalcheckcselse", "doiffastoptionalcheckelse", "doiffieldbodyelse", "doiffieldcategoryelse", "doiffigureelse", "doiffile", "doiffiledefinedelse", "doiffileelse", "doiffileexistselse", "doiffirstcharelse", "doifflaggedelse", "doiffontcharelse", "doiffontpresentelse", "doiffontsynonymelse", "doifhasspaceelse", "doifhelpelse", "doifincsnameelse", "doifinelementelse", "doifinputfileelse", "doifinsertionelse", "doifinset", "doifinsetelse", "doifinstring", "doifinstringelse", "doifinsymbolset", "doifinsymbolsetelse", "doifintokselse", "doifintwopassdataelse", "doifitalicelse", "doiflanguageelse", "doiflayerdataelse", "doiflayoutdefinedelse", "doiflayoutsomelineelse", "doiflayouttextlineelse", "doifleapyearelse", "doiflistelse", "doiflocationelse", "doiflocfileelse", "doifmainfloatbodyelse", "doifmarkingelse", "doifmeaningelse", "doifmessageelse", "doifmode", "doifmodeelse", "doifnextbgroupcselse", "doifnextbgroupelse", "doifnextcharelse", "doifnextoptionalcselse", "doifnextoptionalelse", "doifnextparenthesiselse", "doifnonzeropositiveelse", "doifnot", "doifnotallcommon", "doifnotallmodes", "doifnotcommandhandler", "doifnotcommon", "doifnotcounter", "doifnotdocumentargument", "doifnotdocumentfilename", "doifnotempty", "doifnotemptyvalue", "doifnotemptyvariable", "doifnotenv", "doifnoteonsamepageelse", "doifnotescollected", "doifnotfile", "doifnotflagged", "doifnothing", "doifnothingelse", "doifnotinset", "doifnotinsidesplitfloat", "doifnotinstring", "doifnotmode", "doifnotnumber", "doifnotsamestring", "doifnotsetups", "doifnotvalue", "doifnotvariable", "doifnumber", "doifnumberelse", "doifobjectfoundelse", "doifobjectreferencefoundelse", "doifoddpageelse", "doifoddpagefloatelse", "doifoldercontextelse", "doifolderversionelse", "doifoverlappingelse", "doifoverlayelse", "doifparallelelse", "doifparentfileelse", "doifpathelse", "doifpathexistselse", "doifpatternselse", "doifposition", "doifpositionaction", "doifpositionactionelse", "doifpositionelse", "doifpositiononpageelse", "doifpositionsonsamepageelse", "doifpositionsonthispageelse", "doifpositionsusedelse", "doifreferencefoundelse", "doifrightpagefloatelse", "doifrighttoleftinboxelse", "doifsamelinereferenceelse", "doifsamestring", "doifsamestringelse", "doifsetups", "doifsetupselse", "doifsomebackground", "doifsomebackgroundelse", "doifsomespaceelse", "doifsomething", "doifsomethingelse", "doifsometoks", "doifsometokselse", "doifstringinstringelse", "doifstructurelisthasnumberelse", "doifstructurelisthaspageelse", "doifsymboldefinedelse", "doifsymbolsetelse", "doiftext", "doiftextelse", "doiftextflowcollectorelse", "doiftextflowelse", "doiftypingfileelse", "doifundefined", "doifundefinedcounter", "doifundefinedelse", "doifurldefinedelse", "doifvalue", "doifvalueelse", "doifvaluenothing", "doifvaluenothingelse", "doifvaluesomething", "doifvariable", "doifvariableelse", "doindentation", "dollar", "doloop", "doloopoverlist", "donothing", "dontconvertfont", "dontleavehmode", "dontpermitspacesbetweengroups", "dopositionaction", "doprocesslocalsetups", "doquadrupleargument", "doquadrupleempty", "doquadruplegroupempty", "doquintupleargument", "doquintupleempty", "doquintuplegroupempty", "dorechecknextindentation", "dorecurse", "dorepeatwithcommand", "doreplacefeature", "doresetandafffeature", "doresetattribute", "dorotatebox", "dosetattribute", "dosetleftskipadaption", "dosetrightskipadaption", "dosetupcheckedinterlinespace", "doseventupleargument", "doseventupleempty", "dosingleargument", "dosingleempty", "dosinglegroupempty", "dosixtupleargument", "dosixtupleempty", "dostepwiserecurse", "dosubtractfeature", "dotfskip", "dotoks", "dotripleargument", "dotripleargumentwithset", "dotripleempty", "dotripleemptywithset", "dotriplegroupempty", "doublebar", "doublebond", "doublebrace", "doublebracket", "doubleparent", "dowith", "dowithnextbox", "dowithnextboxcontent", "dowithnextboxcontentcs", "dowithnextboxcs", "dowithpargument", "dowithrange", "dowithwargument", "dpofstring", "dummydigit", "dummyparameter", "dute", "dutebox", "dutepagina", "eTeX", "ecran", "edefconvertedargument", "efcmaxheight", "efcmaxwidth", "efcminheight", "efcminwidth", "efcparameter", "effect", "elapsedseconds", "elapsedtime", "eleftarrowfill", "eleftharpoondownfill", "eleftharpoonupfill", "eleftrightarrowfill", "element", "emphasisboldface", "emphasistypeface", "emptylines", "emspace", "enabledirectives", "enableexperiments", "enablemode", "enableoutputstream", "enableparpositions", "enableregime", "enabletrackers", "enskip", "enspace", "enumerare", "env", "envvar", "eoverbarfill", "eoverbracefill", "eoverbracketfill", "eoverparentfill", "epos", "equaldigits", "erightarrowfill", "erightharpoondownfill", "erightharpoonupfill", "etwoheadrightarrowfill", "eunderbarfill", "eunderbracefill", "eunderbracketfill", "eunderparentfill", "executeifdefined", "exitloop", "exitloopnow", "expandcheckedcsname", "expanded", "expandfontsynonym", "externalfigurecollectionmaxheight", "externalfigurecollectionmaxwidth", "externalfigurecollectionminheight", "externalfigurecollectionminwidth", "externalfigurecollectionparameter", "fakebox", "faraliniiantetsisubsol", "faraliniisussijos", "faraspatiu", "fastdecrement", "fastincrement", "fastlocalframed", "fastscale", "fastsetup", "fastsetupwithargument", "fastsetupwithargumentswapped", "fastswitchtobodyfont", "fastsxsy", "feature", "fence", "fenced", "fetchallmarkings", "fetchallmarks", "fetchmark", "fetchmarking", "fetchonemark", "fetchonemarking", "fetchruntinecommand", "fetchtwomarkings", "fetchtwomarks", "fieldbody", "fifthoffivearguments", "fifthofsixarguments", "figura", "figuraexterna", "figurefilename", "figurefilepath", "figurefiletype", "figurefullname", "figureheight", "figurenaturalheight", "figurenaturalwidth", "figuresymbol", "figurewidth", "filename", "filledhboxb", "filledhboxc", "filledhboxg", "filledhboxk", "filledhboxm", "filledhboxr", "filledhboxy", "filler", "filterfromnext", "filterfromvalue", "filterpages", "filterreference", "findtwopassdata", "finishregisterentry", "firdepar", "firstcharacter", "firstcounter", "firstcountervalue", "firstoffivearguments", "firstoffourarguments", "firstofoneargument", "firstofoneunexpanded", "firstofsixarguments", "firstofthreearguments", "firstofthreeunexpanded", "firstoftwoarguments", "firstoftwounexpanded", "firstrealpage", "firstrealpagenumber", "firstsubcountervalue", "firstsubpage", "firstsubpagenumber", "firstuserpage", "firstuserpagenumber", "fitfieldframed", "fittopbaselinegrid", "flag", "floatuserdataparameter", "flushboxregister", "flushcollector", "flushlayer", "flushlocalfloats", "flushnextbox", "flushnotes", "flushoutputstream", "flushshapebox", "flushtextflow", "flushtokens", "flushtoks", "folosesteURL", "folosestebloc", "folosestedirector", "folosestedocumentextern", "folosestefiguraexterna", "folosestemodul", "folosestemuzicaexterna", "folosestescriptJS", "folosestesimboluri", "folosesteurl", "fontalternative", "fontbody", "fontchar", "fontcharbyindex", "fontclass", "fontclassname", "fontface", "fontfeaturelist", "fontsize", "fontstyle", "footnotetext", "forcecharacterstripping", "forcelocalfloats", "forgeteverypar", "forgetparameters", "formula", "foundbox", "fourthoffivearguments", "fourthoffourarguments", "fourthofsixarguments", "frac", "framed", "frameddimension", "framedparameter", "framedtext", "freezedimenmacro", "freezemeasure", "frenchspacing", "fromlinenote", "frozenhbox", "fundal", "gdefconvertedargument", "gdefconvertedcommand", "getMPdrawing", "getMPlayer", "getboxllx", "getboxlly", "getbufferdata", "getcommacommandsize", "getcommalistsize", "getdayoftheweek", "getdayspermonth", "getdefinedbuffer", "getdocumentargument", "getdocumentargumentdefault", "getdocumentfilename", "getdummyparameters", "getemptyparameters", "geteparameters", "getexpandedparameters", "getfiguredimensions", "getfirstcharacter", "getfirsttwopassdata", "getfromcommacommand", "getfromcommalist", "getfromtwopassdata", "getglyphdirect", "getglyphstyled", "getgparameters", "getlasttwopassdata", "getlocalfloat", "getlocalfloats", "getmessage", "getnamedglyphdirect", "getnamedglyphstyled", "getnamedtwopassdatalist", "getnaturaldimensions", "getnoflines", "getobject", "getobjectdimensions", "getpaletsize", "getparameters", "getprivatechar", "getprivateslot", "getrandomcount", "getrandomdimen", "getrandomfloat", "getrandomnumber", "getrandomseed", "getraweparameters", "getrawgparameters", "getrawnoflines", "getrawparameters", "getrawxparameters", "getreference", "getreferenceentry", "getroundednoflines", "getsubstring", "gettwopassdata", "gettwopassdatalist", "getuvalue", "getvalue", "getvariable", "getvariabledefault", "getxparameters", "globaldisablemode", "globalenablemode", "globalletempty", "globalpopbox", "globalpopmacro", "globalpreventmode", "globalprocesscommalist", "globalpushbox", "globalpushmacro", "globalswapcounts", "globalswapdimens", "globalswapmacros", "globalundefine", "glyphfontfile", "gobbledoubleempty", "gobbleeightarguments", "gobblefivearguments", "gobblefiveoptionals", "gobblefourarguments", "gobblefouroptionals", "gobbleninearguments", "gobbleoneargument", "gobbleoneoptional", "gobblesevenarguments", "gobblesingleempty", "gobblesixarguments", "gobblespacetokens", "gobbletenarguments", "gobblethreearguments", "gobblethreeoptionals", "gobbletwoarguments", "gobbletwooptionals", "gobbleuntil", "gobbleuntilrelax", "grabbufferdata", "grabbufferdatadirect", "grabuntil", "graficul", "grayvalue", "greedysplitstring", "greeknumerals", "grid", "grosimelinie", "groupedcommand", "gsetboxllx", "gsetboxlly", "gujaratinumerals", "gurmurkhinumerals", "hairspace", "halfwaybox", "handletokens", "handwritten", "hash", "hboxofvbox", "hboxreference", "hdofstring", "headhbox", "headnumbercontent", "headnumberdistance", "headnumberwidth", "headreferenceattributes", "headsetupspacing", "headtextcontent", "headtextdistance", "headtextwidth", "headvbox", "headwidth", "heightanddepthofstring", "heightofstring", "heightspanningtext", "helptext", "hglue", "hiddenbar", "hiddencitation", "hiddencite", "highlight", "highordinalstr", "hilo", "himilo", "hl", "horizontalgrowingbar", "horizontalpositionbar", "hphantom", "hpos", "hsizefraction", "hsmash", "hsmashbox", "hsmashed", "hspace", "htdpofstring", "htofstring", "hyphen", "hyphenatedcoloredword", "hyphenatedfile", "hyphenatedfilename", "hyphenatedhbox", "hyphenatedpar", "hyphenatedurl", "hyphenatedword", "ibox", "ifassignment", "iff", "ifinobject", "ifinoutputstream", "ifparameters", "iftrialtypesetting", "ignoreimplicitspaces", "ignorevalue", "immediatesavetwopassdata", "impartefloat", "impliedby", "implies", "in", "inalt", "includemenu", "includeversioninfo", "increment", "incrementcounter", "incrementedcounter", "incrementpagenumber", "incrementsubpagenumber", "incrementvalue", "indentation", "infofont", "infofontbold", "inframed", "inheritparameter", "inhibitblank", "initializeboxstack", "injos", "inlinebuffer", "inlinedbox", "inlinemath", "inlinemathematics", "inlinemessage", "inlineordisplaymath", "inlinerange", "inlinie", "inmaframed", "innerflushshapebox", "input", "inputfilebarename", "inputfilename", "inputfilerealsuffix", "inputfilesuffix", "inputgivenfile", "insertpages", "instalarelimba", "installactionhandler", "installactivecharacter", "installanddefineactivecharacter", "installattributestack", "installautocommandhandler", "installautosetuphandler", "installbasicautosetuphandler", "installbasicparameterhandler", "installbottomframerenderer", "installcommandhandler", "installcorenamespace", "installdefinehandler", "installdefinitionset", "installdefinitionsetmember", "installdirectcommandhandler", "installdirectparameterhandler", "installdirectparametersethandler", "installdirectsetuphandler", "installdirectstyleandcolorhandler", "installframedautocommandhandler", "installframedcommandhandler", "installleftframerenderer", "installnamespace", "installoutputroutine", "installpagearrangement", "installparameterhandler", "installparameterhashhandler", "installparametersethandler", "installparentinjector", "installrightframerenderer", "installrootparameterhandler", "installsetuphandler", "installsetuponlycommandhandler", "installshipoutmethod", "installsimplecommandhandler", "installsimpleframedcommandhandler", "installstyleandcolorhandler", "installswitchcommandhandler", "installswitchsetuphandler", "installtexdirective", "installtextracker", "installtopframerenderer", "installunitsseparator", "installunitsspace", "installversioninfo", "integerrounding", "intermezzo", "intertext", "intins", "invokepageheandler", "istltdir", "istrtdir", "italic", "italicbold", "italiccorrection", "itemtag", "jobfilename", "jobfilesuffix", "jos", "jossus", "kap", "keeplinestogether", "keepunwantedspaces", "kerncharacters", "koreancirclenumerals", "koreannumerals", "koreannumeralsc", "koreannumeralsp", "koreanparentnumerals", "la", "languageCharacters", "languagecharacters", "languagecharwidth", "lapagina", "lastcounter", "lastcountervalue", "lastdigit", "lastlinewidth", "lastnaturalboxdp", "lastnaturalboxht", "lastnaturalboxwd", "lastpredefinedsymbol", "lastrealpage", "lastrealpagenumber", "lastsubcountervalue", "lastsubpage", "lastsubpagenumber", "lasttwodigits", "lastuserpage", "lastuserpagenumber", "lateluacode", "layeredtext", "layerheight", "layerwidth", "lazysavetaggedtwopassdata", "lazysavetwopassdata", "lbox", "left", "leftbottombox", "leftbox", "lefthbox", "leftorrighthbox", "leftorrightvbox", "leftorrightvtop", "leftskipadaption", "leftsubguillemot", "lefttopbox", "lefttorighthbox", "lefttorightvbox", "lefttorightvtop", "letbeundefined", "letcatcodecommand", "letcscsname", "letcsnamecs", "letcsnamecsname", "letdummyparameter", "letempty", "letgvalue", "letgvalueempty", "letgvalurelax", "letterampersand", "letterat", "letterbackslash", "letterbar", "letterbgroup", "letterclosebrace", "lettercolon", "letterdollar", "letterdoublequote", "letteregroup", "letterescape", "letterexclamationmark", "letterhash", "letterhat", "letterleftbrace", "letterless", "lettermore", "letteropenbrace", "letterpercent", "letterquestionmark", "letterrightbrace", "lettersinglequote", "letterslash", "letterspacing", "lettertilde", "letterunderscore", "letvalue", "letvalueempty", "letvaluerelax", "lfence", "lhbox", "limba", "limbaprincipala", "limitatelines", "limitatetext", "limtatefirstline", "linespanningtext", "linieneagra", "liniesubtire", "linieumplere", "liniinegre", "liniisubtiri", "listcitation", "listcite", "listnamespaces", "litera", "litere", "llap", "loadanyfile", "loadanyfileonce", "loadbtxdefinitionfile", "loadbtxreplacementfile", "loadcldfile", "loadcldfileonce", "loadfontgoodies", "loadluafile", "loadluafileonce", "loadspellchecklist", "loadtexfile", "loadtexfileonce", "loadtypescriptfile", "localframed", "localframedwithsettings", "localhsize", "localpopbox", "localpopmacro", "localpushbox", "localpushmacro", "localundefine", "locatedfilepath", "locatefilepath", "locfilename", "lomihi", "lowerbox", "lowercased", "lowercasestring", "lowerleftdoubleninequote", "lowerleftsingleninequote", "lowerrightdoubleninequote", "lowerrightsingleninequote", "lrtbbox", "ltop", "luaTeX", "luacode", "luaconditional", "luaenvironment", "luaexpanded", "luafunction", "luajitTeX", "luamajorversion", "luaminorversion", "luaparameterset", "luasetup", "luaversion", "luna", "lungimelista", "m", "mLeftarrow", "mLeftrightarrow", "mRightarrow", "maframed", "makecharacteractive", "makerawcommalist", "makestrutofbox", "mapfontsize", "marcaje", "margindata", "markcontent", "markinjector", "mat", "matematica", "math", "mathbf", "mathbi", "mathblackboard", "mathbs", "mathcommand", "mathdefault", "mathfraktur", "mathfunction", "mathit", "mathitalic", "mathop", "mathrm", "mathscript", "mathsl", "mathss", "mathtext", "mathtextbf", "mathtextbi", "mathtextbs", "mathtextit", "mathtextsl", "mathtexttf", "mathtf", "mathtriplet", "mathtt", "mathupright", "mathword", "mathwordbf", "mathwordbi", "mathwordbs", "mathwordit", "mathwordsl", "mathwordtf", "mbox", "mcframed", "md", "measure", "measured", "mediu", "medskip", "medspace", "meniuinteractiune", "mequal", "message", "metaTeX", "mfence", "mfunction", "mfunctionlabeltext", "mhbox", "mhookleftarrow", "mhookrightarrow", "middle", "middlebox", "midhbox", "minicitat", "minimalhbox", "mixedcaps", "mkvibuffer", "mleftarrow", "mleftharpoondown", "mleftharpoonup", "mleftrightarrow", "mleftrightharpoons", "mmapsto", "moduleparameter", "molecule", "mono", "monobold", "mononormal", "monthlong", "monthshort", "mp", "mprandomnumber", "mrel", "mrightarrow", "mrightharpoondown", "mrightharpoonup", "mrightleftharpoons", "mrightoverleftarrow", "mtext", "mtriplerel", "mtwoheadleftarrow", "mtwoheadrightarrow", "namedheadnumber", "namedstructureheadlocation", "namedstructureuservariable", "namedstructurevariable", "namedtaggedlabeltexts", "naturalhbox", "naturalhpack", "naturalvbox", "naturalvcenter", "naturalvpack", "naturalvtop", "naturalwd", "necunoscut", "negatecolorbox", "negated", "negthinspace", "newattribute", "newcatcodetable", "newcounter", "newevery", "newfrenchspacing", "newmode", "newsignal", "newsystemmode", "nextbox", "nextboxdp", "nextboxht", "nextboxhtdp", "nextboxwd", "nextcounter", "nextcountervalue", "nextdepth", "nextparagraphs", "nextrealpage", "nextrealpagenumber", "nextsubcountervalue", "nextsubpage", "nextsubpagenumber", "nextuserpage", "nextuserpagenumber", "nobar", "nocitation", "nocite", "nodetostring", "noffigurepages", "noflines", "noflocalfloats", "noindentation", "noitem", "nokap", "nonfrenchspacing", "nonmathematics", "normal", "normalboldface", "normalframedwithsettings", "normalizebodyfontsize", "normalizedfontsize", "normalizefontdepth", "normalizefontheight", "normalizefontline", "normalizefontwidth", "normalizetextdepth", "normalizetextheight", "normalizetextline", "normalizetextwidth", "normaltypeface", "nota", "notesymbol", "ntimes", "numarformula", "numarpagina", "numartitlu", "numartitlucurent", "numberofpoints", "numere", "numereromane", "obeydepth", "objectdepth", "objectheight", "objectmargin", "objectwidth", "obox", "offset", "offsetbox", "olinie", "onedigitrounding", "ordinaldaynumber", "ordinalstr", "ornamenttext", "outputfilename", "outputstreambox", "outputstreamcopy", "outputstreamunvbox", "outputstreamunvcopy", "over", "overbar", "overbars", "overbartext", "overbarunderbar", "overbrace", "overbracetext", "overbraceunderbrace", "overbracket", "overbrackettext", "overbracketunderbracket", "overlaybutton", "overlaycolor", "overlaydepth", "overlayfigure", "overlayheight", "overlaylinecolor", "overlaylinewidth", "overlayoffset", "overlayrollbutton", "overlaywidth", "overleftarrow", "overleftharpoondown", "overleftharpoonup", "overleftrightarrow", "overloaderror", "overparent", "overparenttext", "overparentunderparent", "overrightarrow", "overrightharpoondown", "overrightharpoonup", "overset", "overstrike", "overstrikes", "overtwoheadleftarrow", "overtwoheadrightarrow", "pagearea", "pagebreak", "pagefigure", "pagegridspanwidth", "pageinjection", "pagestaterealpage", "pagina", "paletsize", "pastreazablocuri", "pdfTeX", "pdfactualtext", "pdfbackendactualtext", "pdfbackendcurrentresources", "pdfbackendsetcatalog", "pdfbackendsetcolorspace", "pdfbackendsetextgstate", "pdfbackendsetinfo", "pdfbackendsetname", "pdfbackendsetpageattribute", "pdfbackendsetpageresource", "pdfbackendsetpagesattribute", "pdfbackendsetpattern", "pdfbackendsetshade", "pdfcolor", "pdfeTeX", "pelung", "percent", "percentdimen", "permitcaretescape", "permitcircumflexescape", "permitspacesbetweengroups", "persiandecimals", "persiannumerals", "phantom", "phantombox", "pickupgroupedcommand", "placeattachments", "placebtxrendering", "placecitation", "placecomments", "placecurrentformulanumber", "placedbox", "placefloat", "placefloatwithsetups", "placeframed", "placeheadnumber", "placeheadtext", "placehelp", "placeinitial", "placelayer", "placelayeredtext", "placelistofpublications", "placelistofsorts", "placelistofsynonyms", "placelocalnotes", "placement", "placenamedfloat", "placenamedformula", "placenotes", "placepairedbox", "placeparallel", "placerawlist", "placerenderingwindow", "plaseazapegrid", "plaseazasemnecarte", "popattribute", "popmacro", "popmode", "popsystemmode", "positionoverlay", "positionregionoverlay", "postponenotes", "potrivestecamp", "pozitie", "predefinedfont", "predefinefont", "predefinesymbol", "prefixedpagenumber", "prependetoks", "prependgvalue", "prependtocommalist", "prependtoks", "prependtoksonce", "prependvalue", "presetdocument", "presetfieldsymbols", "pretocommalist", "prevcounter", "prevcountervalue", "preventmode", "prevrealpage", "prevrealpagenumber", "prevsubcountervalue", "prevsubpage", "prevsubpagenumber", "prevuserpage", "prevuserpagenumber", "procent", "proceseazabloc", "processMPbuffer", "processMPfigurefile", "processaction", "processallactionsinset", "processassignlist", "processassignmentcommand", "processassignmentlist", "processbetween", "processbodyfontenvironmentlist", "processcolorcomponents", "processcommacommand", "processcommalist", "processcommalistwithparameters", "processcontent", "processfile", "processfilemany", "processfilenone", "processfileonce", "processfirstactioninset", "processisolatedchars", "processisolatedwords", "processlinetablebuffer", "processlinetablefile", "processlist", "processmonth", "processranges", "processseparatedlist", "processtexbuffer", "processtokens", "processuntil", "processxtablebuffer", "processyear", "produs", "profiledbox", "profilegivenbox", "program", "proiect", "pseudoMixedCapped", "pseudoSmallCapped", "pseudoSmallcapped", "pseudosmallcapped", "puncte", "punedeasuprafiecareia", "punefatainfata", "puneformula", "punelista", "punelistacombinata", "punenotesubsol", "punenotesubsollocale", "punenumarpagina", "puneregistru", "punesubformula", "purenumber", "pushattribute", "pushbutton", "pushmacro", "pushmode", "pushoutputstream", "pushsystemmode", "qquad", "quad", "quads", "quitcommalist", "quitprevcommalist", "quittypescriptscanning", "raisebox", "randomizetext", "randomnumber", "rawcounter", "rawcountervalue", "rawdate", "rawdoifelseinset", "rawdoifinset", "rawdoifinsetelse", "rawgetparameters", "rawprocessaction", "rawprocesscommacommand", "rawprocesscommalist", "rawstructurelistuservariable", "rawsubcountervalue", "rbox", "readfile", "readfixfile", "readjobfile", "readlocfile", "readsetfile", "readsysfile", "readtexfile", "readxmlfile", "realSmallCapped", "realSmallcapped", "realpagenumber", "realsmallcapped", "recursedepth", "recurselevel", "recursestring", "redoconvertfont", "ref", "referenceprefix", "referinta", "referintapagina", "referintatext", "referring", "reflexie", "registerattachment", "registerctxluafile", "registerexternalfigure", "registerfontclass", "registerhyphenationexception", "registerhyphenationpattern", "registermenubuttons", "registersort", "registersynonym", "registerunit", "regular", "relatemarking", "relateparameterhandlers", "relaxvalueifundefined", "remainingcharacters", "remarca", "removebottomthings", "removedepth", "removefromcommalist", "removelastskip", "removelastspace", "removemarkedcontent", "removepunctuation", "removesubstring", "removetoks", "removeunwantedspaces", "replacefeature", "replaceincommalist", "replaceword", "rescan", "rescanwithsetup", "resetMPdrawing", "resetMPenvironment", "resetMPinstance", "resetallattributes", "resetandaddfeature", "resetbar", "resetbreakpoints", "resetbuffer", "resetcharacteralign", "resetcharacterkerning", "resetcharacterspacing", "resetcharacterstripping", "resetcollector", "resetcounter", "resetdigitsmanipulation", "resetdirection", "reseteazamarcaje", "resetfeature", "resetflag", "resetfontcolorsheme", "resetfontfallback", "resetfontsolution", "resethyphenationfeatures", "resetinjector", "resetinteractionmenu", "resetitaliccorrection", "resetlayer", "resetlocalfloats", "resetmarker", "resetmode", "resetpagenumber", "resetparallel", "resetpath", "resetpenalties", "resetprofile", "resetreference", "resetreplacement", "resetscript", "resetsetups", "resetshownsynonyms", "resetsubpagenumber", "resetsymbolset", "resetsystemmode", "resettimer", "resettrackers", "resettrialtypesetting", "resetusedsortings", "resetusedsynonyms", "resetuserpagenumber", "resetvalue", "resetvisualizers", "reshapebox", "resolvedglyphdirect", "resolvedglyphstyled", "restartcounter", "restorebox", "restorecatcodes", "restorecounter", "restorecurrentattributes", "restoreendofline", "restoreglobalbodyfont", "reusableMPgraphic", "reuseMPgraphic", "reuserandomseed", "revivefeature", "rfence", "rhbox", "right", "rightbottombox", "rightbox", "righthbox", "rightorleftpageaction", "rightskipadaption", "rightsubguillemot", "righttolefthbox", "righttoleftvbox", "righttoleftvtop", "righttopbox", "riglatext", "rigleumplere", "rlap", "robustaddtocommalist", "robustdoifelseinset", "robustdoifinsetelse", "robustpretocommalist", "rollbutton", "roman", "roteste", "rtop", "ruledhbox", "ruledhpack", "ruledmbox", "ruledtopv", "ruledtpack", "ruledvbox", "ruledvpack", "ruledvtop", "runMPbuffer", "runninghbox", "safechar", "sans", "sansbold", "sansnormal", "sansserif", "savebox", "savebtxdataset", "savebuffer", "savecounter", "savecurrentattributes", "savenormalmeaning", "savetaggedtwopassdata", "savetwopassdata", "sbox", "scala", "scriebuffer", "scrieinlista", "scrieintreliste", "sd", "secondoffivearguments", "secondoffourarguments", "secondofsixarguments", "secondofthreearguments", "secondofthreeunexpanded", "secondoftwoarguments", "secondoftwounexpanded", "sectiune", "select", "selecteazablocuri", "semncarte", "serializecommalist", "serializedcommalist", "serif", "serifbold", "serifnormal", "setJSpreamble", "setMPlayer", "setMPpositiongraphic", "setMPpositiongraphicrange", "setMPtext", "setMPvariable", "setMPvariables", "setareitemization", "setarelimba", "setarepozitie", "setbar", "setbigbodyfont", "setboxllx", "setboxlly", "setbreakpoints", "setcapstrut", "setcatcodetable", "setcharacteralign", "setcharactercasing", "setcharactercleaning", "setcharacterkerning", "setcharacterspacing", "setcharacterstripping", "setcharstrut", "setcollector", "setcolormodell", "setcounter", "setcounterown", "setcurrentfontclass", "setdataset", "setdefaultpenalties", "setdigitsmanipulation", "setdirection", "setdocumentargument", "setdocumentargumentdefault", "setdocumentfilename", "setdummyparameter", "seteazaaliniat", "seteazaantet", "seteazaaranjareapag", "seteazaaspect", "seteazabarainteractiune", "seteazablanc", "seteazabloc", "seteazablocsectiune", "seteazabuffer", "seteazacamp", "seteazacampuri", "seteazaclipping", "seteazacoloane", "seteazacomentariu", "seteazacomentariupagina", "seteazaculoare", "seteazaculori", "seteazadimensiunihartie", "seteazaecraninteractiune", "seteazaelemente", "seteazafloat", "seteazafonttext", "seteazaformulare", "seteazafundal", "seteazafundaluri", "seteazagrosimelinie", "seteazaimpartireafloat", "seteazainconjurat", "seteazaingust", "seteazainteractiunea", "seteazajos", "seteazalegenda", "seteazaliniesilabe", "seteazaliniesubtire", "seteazalinii", "seteazaliniimargine", "seteazaliniinegre", "seteazaliniiumplere", "seteazalista", "seteazalistacombinata", "seteazamajuscule", "seteazamakeup", "seteazamarcaje", "seteazameniuinteractiune", "seteazaminicitat", "seteazanumarpagina", "seteazanumarsubpagina", "seteazanumartitlu", "seteazanumerotarelinii", "seteazanumerotarepagina", "seteazanumerotareparagrafe", "seteazapaleta", "seteazaparagrafe", "seteazaplasareaopozita", "seteazaprograme", "seteazareferinte", "seteazaregistru", "seteazarigletext", "seteazarigleumplere", "seteazarotare", "seteazasimbol", "seteazasinonime", "seteazasortare", "seteazaspatiu", "seteazaspatiualb", "seteazaspatiuinterliniar", "seteazasubsol", "seteazasus", "seteazatabele", "seteazatabulatori", "seteazatext", "seteazatexteantet", "seteazatextejos", "seteazatextesubsol", "seteazatextesus", "seteazatextetext", "seteazatitlu", "seteazatitluri", "seteazatoleranta", "seteazatranzitiepagina", "seteazatype", "seteazatyping", "seteazaurl", "setelementexporttag", "setemeasure", "setevalue", "setevariable", "setevariables", "setfirstline", "setflag", "setfont", "setfontcolorsheme", "setfontfeature", "setfontsolution", "setfontstrut", "setfractions", "setgmeasure", "setgvalue", "setgvariable", "setgvariables", "sethboxregister", "sethyphenatedurlafter", "sethyphenatedurlbefore", "sethyphenatedurlnormal", "sethyphenationfeatures", "setinitial", "setinjector", "setinteraction", "setinterfacecommand", "setinterfaceconstant", "setinterfaceelements", "setinterfacemessage", "setinterfacevariable", "setinternalrendering", "setitaliccorrection", "setlayer", "setlayerframed", "setlayertext", "setlinefiller", "setlocalhsize", "setmainbodyfont", "setmainparbuilder", "setmarker", "setmarking", "setmathstyle", "setmeasure", "setmessagetext", "setmode", "setnostrut", "setnote", "setnotetext", "setobject", "setoldstyle", "setpagegrid", "setpagereference", "setpagestate", "setpagestaterealpageno", "setpenalties", "setpercentdimen", "setposition", "setpositionbox", "setpositiondata", "setpositiondataplus", "setpositiononly", "setpositionplus", "setpositionstrut", "setprofile", "setrandomseed", "setreference", "setreferencedobject", "setregisterentry", "setreplacement", "setrigidcolumnbalance", "setrigidcolumnhsize", "setscript", "setsectionblock", "setsimplecolumnhsize", "setsmallbodyfont", "setsmallcaps", "setstackbox", "setstructurepageregister", "setstrut", "setsuperiors", "setsystemmode", "settabular", "settaggedmetadata", "settextcontent", "settightobject", "settightreferencedobject", "settightunreferencedobject", "settrialtypesetting", "setuevalue", "setugvalue", "setunreferencedobject", "setup", "setupMPgraphics", "setupMPinstance", "setupMPpage", "setupMPvariables", "setupTABLE", "setupTEXpage", "setupattachment", "setupbackend", "setupbar", "setupbleeding", "setupbookmark", "setupbtx", "setupbtxdataset", "setupbtxlist", "setupbtxregister", "setupbtxrendering", "setupbutton", "setupcharacterkerning", "setupcharacterspacing", "setupchemical", "setupchemicalframed", "setupcollector", "setupcolumnspan", "setupcombination", "setupcounter", "setupdataset", "setupdelimitedtext", "setupdescription", "setupdirections", "setupdocument", "setupeffect", "setupenumeration", "setupenv", "setupexport", "setupexternalfigure", "setupexternalsoundtracks", "setupfieldbody", "setupfieldcategory", "setupfieldcontentframed", "setupfieldlabelframed", "setupfieldtotalframed", "setupfiller", "setupfirstline", "setupfittingpage", "setupfloatcaption", "setupfontexpansion", "setupfontprotrusion", "setupfonts", "setupfontsolution", "setupformula", "setupformulaframed", "setupframedcontent", "setupframedtext", "setupglobalreferenceprefix", "setupheadalternative", "setuphelp", "setuphigh", "setuphighlight", "setuphyphenation", "setupindentedtext", "setupinitial", "setupinsertion", "setupitaliccorrection", "setupitemgroup", "setuplabel", "setuplayer", "setuplayeredtext", "setuplayouttext", "setuplinefiller", "setuplinefillers", "setuplinenote", "setuplinetable", "setuplistalternative", "setuplistextra", "setuplocalfloats", "setuplocalinterlinespace", "setuplow", "setuplowhigh", "setuplowmidhigh", "setupmarginblock", "setupmargindata", "setupmarginframed", "setupmarginrule", "setupmathalignment", "setupmathcases", "setupmathematics", "setupmathfence", "setupmathfraction", "setupmathframed", "setupmathmatrix", "setupmathornament", "setupmathradical", "setupmathstackers", "setupmathstyle", "setupmixedcolumns", "setupmodule", "setupnotation", "setupnotations", "setupnote", "setupnotes", "setupoffset", "setupoffsetbox", "setupoutputroutine", "setuppagechecker", "setuppagegrid", "setuppagegridarea", "setuppagegridareatext", "setuppagegridlines", "setuppagegridspan", "setuppagegridstart", "setuppageinjection", "setuppageinjectionalternative", "setuppageshift", "setuppagestate", "setuppairedbox", "setuppaper", "setupparagraph", "setupparagraphintro", "setupparallel", "setupperiods", "setupplacement", "setuppositionbar", "setupprocessor", "setupprofile", "setupquotation", "setuprealpagenumber", "setupreferenceformat", "setupreferenceprefix", "setupreferencestructureprefix", "setupregisters", "setuprenderingwindow", "setups", "setupscale", "setupscript", "setupscripts", "setupselector", "setupshift", "setupsidebar", "setupspellchecking", "setupstartstop", "setupstretched", "setupstruts", "setupstyle", "setupsubformula", "setuptabulation", "setuptagging", "setuptextbackground", "setuptextflow", "setuptooltip", "setupunit", "setupuserpagenumber", "setupversion", "setupviewerlayer", "setupvspacing", "setupwithargument", "setupwithargumentswapped", "setupxml", "setupxtable", "setuvalue", "setuxvalue", "setvalue", "setvariable", "setvariables", "setvboxregister", "setvisualizerfont", "setvtopregister", "setwidthof", "setxmeasure", "setxvalue", "setxvariable", "setxvariables", "sfrac", "shapedhbox", "showallmakeup", "showattributes", "showboxes", "showbtxdatasetauthors", "showbtxdatasetcompleteness", "showbtxdatasetfields", "showbtxfields", "showbtxhashedauthors", "showbtxtables", "showchardata", "showcharratio", "showcolorbar", "showcolorcomponents", "showcolorset", "showcolorstruts", "showcounter", "showdirectives", "showdirsinmargin", "showedebuginfo", "showexperiments", "showfont", "showfontdata", "showfontkerns", "showfontparameters", "showfontstrip", "showfontstyle", "showglyphs", "showgridsnapping", "showhelp", "showhyphenationtrace", "showhyphens", "showinjector", "showjustification", "showkerning", "showlayoutcomponents", "showligature", "showligatures", "showlogcategories", "showmargins", "showmessage", "showminimalbaseline", "shownextbox", "showotfcomposition", "showparentchain", "showsetupsdefinition", "showtimer", "showtokens", "showtrackers", "showvalue", "showvariable", "showwarning", "simbol", "simplegroupedcommand", "singalcharacteralign", "singlebond", "sixthofsixarguments", "slanted", "slantedbold", "slicepages", "slovenianNumerals", "sloveniannumerals", "small", "smallbodyfont", "smallbold", "smallbolditalic", "smallboldslanted", "smallcappedcharacters", "smallcappedromannumerals", "smaller", "smallitalicbold", "smallnormal", "smallskip", "smallslanted", "smallslantedbold", "smalltype", "smash", "smashbox", "smashboxed", "smashedhbox", "smashedvbox", "snaptogrid", "someheadnumber", "somekindoftab", "somelocalfloat", "somenamedheadnumber", "someplace", "sp", "spanishNumerals", "spanishnumerals", "spatiifixate", "spatiu", "spatiufixat", "speech", "splitatasterisk", "splitatcolon", "splitatcolons", "splitatcomma", "splitdfrac", "splitfilename", "splitfrac", "splitoffbase", "splitofffull", "splitoffkind", "splitoffname", "splitoffpath", "splitoffroot", "splitofftokens", "splitofftype", "splitstring", "spreadhbox", "sqrt", "stackrel", "startJScode", "startJSpreamble", "startMPclip", "startMPcode", "startMPdefinitions", "startMPdrawing", "startMPenvironment", "startMPextensions", "startMPinclusions", "startMPinitializations", "startMPpage", "startMPpositiongraphic", "startMPpositionmethod", "startMPrun", "startTABLE", "startTABLEbody", "startTABLEfoot", "startTABLEhead", "startTABLEnext", "startTC", "startTD", "startTDs", "startTEXpage", "startTH", "startTN", "startTR", "startTRs", "startTX", "startTY", "startallmodes", "startarrangedpages", "startaside", "startattachment", "startbar", "startbarasus", "startbinom", "startbitmapimage", "startblockquote", "startbtxrenderingdefinitions", "startbuffer", "startbutton", "startcapitol", "startcatcodetable", "startcharacteralign", "startcheckedfences", "startchemical", "startcitat", "startcollect", "startcollecting", "startcolorintent", "startcoloronly", "startcolorset", "startcolumns", "startcolumnspan", "startcombination", "startcomentariu", "startcomment", "startcomponenta", "startcontextcode", "startcontextdefinitioncode", "startctxfunction", "startctxfunctiondefinition", "startculoare", "startcurrentcolor", "startcurrentlistentrywrapper", "startdbinom", "startdelimited", "startdelimitedtext", "startdfrac", "startdisplaymath", "startdmath", "startdocument", "startdute", "starteffect", "startelement", "startembeddedxtable", "startendofline", "startenumerare", "startexceptions", "startexpanded", "startexpandedcollect", "startextendedcatcodetable", "startexternalfigurecollection", "startfigura", "startfigure", "startfitfieldframed", "startfittingpage", "startfloatcombination", "startfont", "startfontclass", "startfontsolution", "startformula", "startformulas", "startfrac", "startframed", "startframedcontent", "startframedtext", "startfundal", "startgraficul", "startgridsnapping", "starthbox", "starthboxestohbox", "starthboxregister", "starthelptext", "starthiddenbar", "starthiding", "starthighlight", "starthyphenation", "startimath", "startimpachetat", "startindentation", "startindentedtext", "startinmframed", "startinteraction", "startinterface", "startintermezzo", "startintertext", "startitemgroup", "startknockout", "startlayout", "startlinecorrection", "startlinefiller", "startlinenumbering", "startlinetable", "startlinetablebody", "startlinetablecell", "startlinetablehead", "startlinie", "startliniemargine", "startliniepeste", "startliniipeste", "startlocalfootnotes", "startlocalheadsetup", "startlocallinecorrection", "startlocalnotes", "startlocalsetups", "startlua", "startluacode", "startluaparameterset", "startluasetups", "startmakeup", "startmarginblock", "startmarkedcontent", "startmathmode", "startmathstyle", "startmatrices", "startmcframed", "startmdformula", "startmediu", "startmeniuinteractiune", "startmframed", "startminicitat", "startmixedcolumns", "startmode", "startmodeset", "startmodule", "startmoduletestsection", "startmpformula", "startnamedsection", "startnamedsubformulas", "startnarrow", "startnarrower", "startnegative", "startnicelyfilledbox", "startnobar", "startnointerference", "startnotallmodes", "startnotext", "startnotmode", "startopposite", "startoutputstream", "startoverlay", "startoverprint", "startpagecomment", "startpagefigure", "startpagegrid", "startpagegridspan", "startpagelayout", "startpar", "startparagraph", "startparagraphs", "startparagraphscell", "startparbuilder", "startpath", "startplacepairedbox", "startpositioning", "startpositionoverlay", "startpositive", "startpostponing", "startprocessassignmentcommand", "startprocessassignmentlist", "startprocesscommacommand", "startprocesscommalist", "startprodus", "startproiect", "startprotect", "startprotectedcolors", "startpublicatie", "startpunctuation", "startpuneformula", "startrandomized", "startrandomseed", "startrawsetups", "startreadingfile", "startreferenceprefix", "startregime", "startregister", "startreusableMPgraphic", "startriglatext", "startscript", "startsdformula", "startsectionblock", "startsectionblockenvironment", "startsectionlevel", "startsectiune", "startsetups", "startsfrac", "startshapebox", "startshift", "startsidebar", "startsimplecolumns", "startspecialitem", "startspeech", "startspformula", "startspread", "startstartstop", "startstaticMPfigure", "startstaticMPgraphic", "startstrictinspectnextcharacter", "startstructurepageregister", "startstrut", "startstyle", "startsubformulas", "startsubiect", "startsubjectlevel", "startsublinie", "startsublinii", "startsubsectiune", "startsubsentence", "startsubstack", "startsubsubiect", "startsubsubsectiune", "startsubsubsubiect", "startsubsubsubsectiune", "startsubsubsubsubiect", "startsubsubsubsubsectiune", "startsubsubsubsubsubiect", "startsupralinie", "startsymbolset", "starttabelul", "starttable", "starttablehead", "starttables", "starttabletail", "starttabulate", "starttabulatehead", "starttabulatetail", "starttagged", "starttbinom", "starttexcode", "starttexdefinition", "starttext", "starttextajutator", "starttextbackground", "starttextbackgroundmanual", "starttextcolor", "starttextcolorintent", "starttextflow", "starttextinconjurat", "starttitlu", "starttokens", "starttransparent", "starttypescript", "starttypescriptcollection", "startunderdash", "startunderdashes", "startunderdot", "startunderdots", "startunderrandom", "startunderrandoms", "startunderstrike", "startunderstrikes", "startunframed", "startuniqueMPgraphic", "startuniqueMPpagegraphic", "startunpacked", "startusableMPgraphic", "startuseMPgraphic", "startusemathstyleparameter", "startusingbtxspecification", "startvbox", "startvboxregister", "startvboxtohbox", "startvboxtohboxseparator", "startviewerlayer", "startvtop", "startvtopregister", "startxcell", "startxcellgroup", "startxfrac", "startxgroup", "startxmldisplayverbatim", "startxmlinlineverbatim", "startxmlraw", "startxmlsetups", "startxrow", "startxrowgroup", "startxtable", "startxtablebody", "startxtablefoot", "startxtablehead", "startxtablenext", "startxxfrac", "stivacampuri", "stopJScode", "stopJSpreamble", "stopMPclip", "stopMPcode", "stopMPdefinitions", "stopMPdrawing", "stopMPenvironment", "stopMPextensions", "stopMPinclusions", "stopMPinitializations", "stopMPpage", "stopMPpositiongraphic", "stopMPpositionmethod", "stopMPrun", "stopTABLE", "stopTABLEbody", "stopTABLEfoot", "stopTABLEhead", "stopTABLEnext", "stopTC", "stopTD", "stopTDs", "stopTEXpage", "stopTH", "stopTN", "stopTR", "stopTRs", "stopTX", "stopTY", "stopallmodes", "stoparrangedpages", "stopaside", "stopattachment", "stopbar", "stopbarasus", "stopbinom", "stopbitmapimage", "stopblockquote", "stopbtxrenderingdefinitions", "stopbuffer", "stopbutton", "stopcapitol", "stopcatcodetable", "stopcharacteralign", "stopcheckedfences", "stopchemical", "stopcitat", "stopcollect", "stopcollecting", "stopcolorintent", "stopcoloronly", "stopcolorset", "stopcolumns", "stopcolumnspan", "stopcombination", "stopcomentariu", "stopcomment", "stopcomponenta", "stopcontextcode", "stopcontextdefinitioncode", "stopctxfunction", "stopctxfunctiondefinition", "stopculoare", "stopcurrentcolor", "stopcurrentlistentrywrapper", "stopdbinom", "stopdelimited", "stopdelimitedtext", "stopdfrac", "stopdisplaymath", "stopdmath", "stopdocument", "stopdute", "stopeffect", "stopelement", "stopembeddedxtable", "stopendofline", "stopenumerare", "stopexceptions", "stopexpanded", "stopexpandedcollect", "stopextendedcatcodetable", "stopexternalfigurecollection", "stopfigura", "stopfigure", "stopfitfieldframed", "stopfittingpage", "stopfloatcombination", "stopfont", "stopfontclass", "stopfontsolution", "stopformula", "stopformulas", "stopfrac", "stopframed", "stopframedcontent", "stopframedtext", "stopfundal", "stopgraficul", "stopgridsnapping", "stophbox", "stophboxestohbox", "stophboxregister", "stophelptext", "stophiddenbar", "stophiding", "stophighlight", "stophyphenation", "stopimath", "stopimpachetat", "stopindentation", "stopindentedtext", "stopinmframed", "stopinteraction", "stopinterface", "stopintermezzo", "stopintertext", "stopitemgroup", "stopknockout", "stoplayout", "stoplinecorrection", "stoplinefiller", "stoplinenumbering", "stoplinetable", "stoplinetablebody", "stoplinetablecell", "stoplinetablehead", "stoplinie", "stopliniemargine", "stopliniepeste", "stopliniipeste", "stoplocalfootnotes", "stoplocalheadsetup", "stoplocallinecorrection", "stoplocalnotes", "stoplocalsetups", "stoplua", "stopluacode", "stopluaparameterset", "stopluasetups", "stopmakeup", "stopmarginblock", "stopmarkedcontent", "stopmathmode", "stopmathstyle", "stopmatrices", "stopmcframed", "stopmdformula", "stopmediu", "stopmeniuinteractiune", "stopmframed", "stopminicitat", "stopmixedcolumns", "stopmode", "stopmodeset", "stopmodule", "stopmoduletestsection", "stopmpformula", "stopnamedsection", "stopnamedsubformulas", "stopnarrow", "stopnarrower", "stopnegative", "stopnicelyfilledbox", "stopnobar", "stopnointerference", "stopnotallmodes", "stopnotext", "stopnotmode", "stopopposite", "stopoutputstream", "stopoverlay", "stopoverprint", "stoppagecomment", "stoppagefigure", "stoppagegrid", "stoppagegridspan", "stoppagelayout", "stoppar", "stopparagraph", "stopparagraphs", "stopparagraphscell", "stopparbuilder", "stoppath", "stopplacepairedbox", "stoppositioning", "stoppositionoverlay", "stoppositive", "stoppostponing", "stopprocessassignmentcommand", "stopprocessassignmentlist", "stopprocesscommacommand", "stopprocesscommalist", "stopprodus", "stopproiect", "stopprotect", "stopprotectedcolors", "stoppublicatie", "stoppunctuation", "stoppuneformula", "stoprandomized", "stoprandomseed", "stoprawsetups", "stopreadingfile", "stopreferenceprefix", "stopregime", "stopregister", "stopreusableMPgraphic", "stopriglatext", "stopscript", "stopsdformula", "stopsectionblock", "stopsectionblockenvironment", "stopsectionlevel", "stopsectiune", "stopsetups", "stopsfrac", "stopshapebox", "stopshift", "stopsidebar", "stopsimplecolumns", "stopspecialitem", "stopspeech", "stopspformula", "stopspread", "stopstartstop", "stopstaticMPfigure", "stopstaticMPgraphic", "stopstrictinspectnextcharacter", "stopstructurepageregister", "stopstrut", "stopstyle", "stopsubformulas", "stopsubiect", "stopsubjectlevel", "stopsublinie", "stopsublinii", "stopsubsectiune", "stopsubsentence", "stopsubstack", "stopsubsubiect", "stopsubsubsectiune", "stopsubsubsubiect", "stopsubsubsubsectiune", "stopsubsubsubsubiect", "stopsubsubsubsubsectiune", "stopsubsubsubsubsubiect", "stopsupralinie", "stopsymbolset", "stoptabelul", "stoptable", "stoptablehead", "stoptables", "stoptabletail", "stoptabulate", "stoptabulatehead", "stoptabulatetail", "stoptagged", "stoptbinom", "stoptexcode", "stoptexdefinition", "stoptext", "stoptextajutator", "stoptextbackground", "stoptextbackgroundmanual", "stoptextcolor", "stoptextcolorintent", "stoptextflow", "stoptextinconjurat", "stoptitlu", "stoptokens", "stoptransparent", "stoptypescript", "stoptypescriptcollection", "stopunderdash", "stopunderdashes", "stopunderdot", "stopunderdots", "stopunderrandom", "stopunderrandoms", "stopunderstrike", "stopunderstrikes", "stopunframed", "stopuniqueMPgraphic", "stopuniqueMPpagegraphic", "stopunpacked", "stopusableMPgraphic", "stopuseMPgraphic", "stopusemathstyleparameter", "stopusingbtxspecification", "stopvbox", "stopvboxregister", "stopvboxtohbox", "stopvboxtohboxseparator", "stopviewerlayer", "stopvtop", "stopvtopregister", "stopxcell", "stopxcellgroup", "stopxfrac", "stopxgroup", "stopxmldisplayverbatim", "stopxmlinlineverbatim", "stopxmlraw", "stopxmlsetups", "stopxrow", "stopxrowgroup", "stopxtable", "stopxtablebody", "stopxtablefoot", "stopxtablehead", "stopxtablenext", "stopxxfrac", "strictdoifelsenextoptional", "strictdoifnextoptionalelse", "stripcharacter", "strippedcsname", "stripspaces", "structurelistuservariable", "structurenumber", "structuretitle", "structureuservariable", "structurevariable", "strut", "strutdp", "strutht", "struthtdp", "struttedbox", "strutwd", "style", "styleinstance", "subiect", "subpagenumber", "subsectiune", "subsentence", "substituteincommalist", "subsubiect", "subsubsectiune", "subsubsubiect", "subsubsubsectiune", "subsubsubsubiect", "subsubsubsubsectiune", "subsubsubsubsubiect", "subtractfeature", "swapcounts", "swapdimens", "swapface", "swapmacros", "swaptypeface", "switchstyleonly", "switchtocolor", "switchtointerlinespace", "symbolreference", "synchronizeblank", "synchronizeindenting", "synchronizemarking", "synchronizeoutputstreams", "synchronizestrut", "synchronizewhitespace", "systemlog", "systemlogfirst", "systemloglast", "systemsetups", "tLeftarrow", "tLeftrightarrow", "tRightarrow", "tabelul", "tabulateautoline", "tabulateautorule", "tabulateline", "tabulaterule", "taggedctxcommand", "taggedlabeltexts", "tbinom", "tbox", "tequal", "testandsplitstring", "testcolumn", "testfeature", "testfeatureonce", "testpage", "testpageonly", "testpagesync", "testtokens", "tex", "texdefinition", "texsetup", "textajutator", "textcitation", "textcite", "textcontrolspace", "textflowcollector", "textinconjurat", "textmath", "textminus", "textormathchar", "textplus", "textumplere", "textvisiblespace", "tfrac", "thainumerals", "thefirstcharacter", "thenormalizedbodyfontsize", "theremainingcharacters", "thickspace", "thinspace", "thirdoffivearguments", "thirdoffourarguments", "thirdofsixarguments", "thirdofthreearguments", "thirdofthreeunexpanded", "thookleftarrow", "thookrightarrow", "threedigitrounding", "tibetannumerals", "tightlayer", "tinyfont", "titlu", "tlap", "tleftarrow", "tleftharpoondown", "tleftharpoonup", "tleftrightarrow", "tleftrightharpoons", "tmapsto", "tochar", "tolinenote", "topbox", "topleftbox", "toplinebox", "toprightbox", "topskippedbox", "tracecatcodetables", "tracedfontname", "traceoutputroutines", "tracepositions", "traduce", "transparencycomponents", "transparent", "trecilafonttext", "trel", "trightarrow", "trightharpoondown", "trightharpoonup", "trightleftharpoons", "trightoverleftarrow", "triplebond", "truefilename", "truefontname", "ttriplerel", "ttwoheadleftarrow", "ttwoheadrightarrow", "twodigitrounding", "tx", "txx", "typ", "type", "typedefinedbuffer", "typeface", "typefile", "typescriptone", "typescriptprefix", "typescriptthree", "typescripttwo", "typesetbuffer", "typesetfile", "uconvertnumber", "uedcatcodecommand", "undefinevalue", "undepthed", "underbar", "underbars", "underbartext", "underbrace", "underbracetext", "underbracket", "underbrackettext", "underdash", "underdashes", "underdot", "underdots", "underleftarrow", "underleftharpoondown", "underleftharpoonup", "underleftrightarrow", "underparent", "underparenttext", "underrandom", "underrandoms", "underrightarrow", "underrightharpoondown", "underrightharpoonup", "underset", "understrike", "understrikes", "undertwoheadleftarrow", "undertwoheadrightarrow", "undeva", "undoassign", "unframed", "unhhbox", "unihex", "uniqueMPgraphic", "uniqueMPpagegraphic", "unprotected", "unregisterhyphenationpattern", "unspaceafter", "unspaceargument", "unspaced", "unspacestring", "untexargument", "untexcommand", "uppercased", "uppercasestring", "upperleftdoubleninequote", "upperleftdoublesixquote", "upperleftsingleninequote", "upperleftsinglesixquote", "upperrightdoubleninequote", "upperrightdoublesixquote", "upperrightsingleninequote", "upperrightsinglesixquote", "url", "useMPenvironmentbuffer", "useMPgraphic", "useMPlibrary", "useMPrun", "useMPvariables", "useblankparameter", "usebodyfont", "usebodyfontparameter", "usebtxdataset", "usebtxdefinitions", "usecolors", "usecomponent", "usedummycolorparameter", "usedummystyleandcolor", "usedummystyleparameter", "useenvironment", "useexternalrendering", "usefigurebase", "usefile", "usegridparameter", "useindentingparameter", "useindentnextparameter", "useinterlinespaceparameter", "uselanguageparameter", "useluamodule", "usemathstyleparameter", "useproduct", "useprofileparameter", "useproject", "usereferenceparameter", "userpagenumber", "usesetupsparameter", "usestaticMPfigure", "usesubpath", "usetexmodule", "usetypescript", "usetypescriptfile", "usezipfile", "utfchar", "utflower", "utfupper", "utilityregisterlength", "valoareculoare", "vboxreference", "verbatim", "verbatimstring", "verbosenumber", "versiune", "verticalgrowingbar", "verticalpositionbar", "vglue", "viewerlayer", "vl", "vphantom", "vpos", "vsmash", "vsmashbox", "vsmashed", "vspace", "vspacing", "wdofstring", "widthofstring", "widthspanningtext", "withoutpt", "word", "words", "wordtonumber", "writedatatolist", "writestatus", "xLeftarrow", "xLeftrightarrow", "xRightarrow", "xdefconvertedargument", "xequal", "xfrac", "xhookleftarrow", "xhookrightarrow", "xleftarrow", "xleftharpoondown", "xleftharpoonup", "xleftrightarrow", "xleftrightharpoons", "xmapsto", "xmladdindex", "xmlafterdocumentsetup", "xmlaftersetup", "xmlall", "xmlappenddocumentsetup", "xmlappendsetup", "xmlapplyselectors", "xmlatt", "xmlattdef", "xmlattribute", "xmlattributedef", "xmlbadinclusions", "xmlbeforedocumentsetup", "xmlbeforesetup", "xmlchainatt", "xmlchainattdef", "xmlchecknamespace", "xmlcommand", "xmlconcat", "xmlconcatrange", "xmlcontext", "xmlcount", "xmldefaulttotext", "xmldirectives", "xmldirectivesafter", "xmldirectivesbefore", "xmldisplayverbatim", "xmldoif", "xmldoifelse", "xmldoifelseempty", "xmldoifelseselfempty", "xmldoifelsetext", "xmldoifelsevalue", "xmldoifnot", "xmldoifnotselfempty", "xmldoifnottext", "xmldoifselfempty", "xmldoiftext", "xmlelement", "xmlfilter", "xmlfirst", "xmlflush", "xmlflushcontext", "xmlflushdocumentsetups", "xmlflushlinewise", "xmlflushpure", "xmlflushspacewise", "xmlflushtext", "xmlinclude", "xmlinclusion", "xmlinclusions", "xmlinfo", "xmlinjector", "xmlinlineverbatim", "xmlinstalldirective", "xmllast", "xmllastatt", "xmllastmatch", "xmlloadbuffer", "xmlloaddata", "xmlloaddirectives", "xmlloadfile", "xmlloadonly", "xmlmain", "xmlmapvalue", "xmlname", "xmlnamespace", "xmlnonspace", "xmlpath", "xmlpos", "xmlposition", "xmlprependdocumentsetup", "xmlprependsetup", "xmlprettyprint", "xmlprocessbuffer", "xmlprocessdata", "xmlprocessfile", "xmlpure", "xmlraw", "xmlrefatt", "xmlregistereddocumentsetups", "xmlregisteredsetups", "xmlregisterns", "xmlremapname", "xmlremapnamespace", "xmlremovedocumentsetup", "xmlremovesetup", "xmlresetdocumentsetups", "xmlresetinjectors", "xmlresetsetups", "xmlsave", "xmlsetentity", "xmlsetfunction", "xmlsetinjectors", "xmlsetsetup", "xmlsetup", "xmlshow", "xmlsnippet", "xmlstrip", "xmlstripnolines", "xmlstripped", "xmlstrippednolines", "xmltag", "xmltexentity", "xmltext", "xmltobuffer", "xmltobufferverbose", "xmltofile", "xmlvalue", "xmlverbatim", "xrel", "xrightarrow", "xrightharpoondown", "xrightharpoonup", "xrightleftharpoons", "xrightoverleftarrow", "xsplitstring", "xtriplerel", "xtwoheadleftarrow", "xtwoheadrightarrow", "xxfrac", "xypos", "zidinsaptamana" }, + ["common"]={ "AEacute", "AEligature", "AEmacron", "AMSTEX", "Aacute", "Abreve", "Abreveacute", "Abrevedotbelow", "Abrevegrave", "Abrevehook", "Abrevetilde", "Acaron", "Acircumflex", "Acircumflexacute", "Acircumflexdotbelow", "Acircumflexgrave", "Acircumflexhook", "Acircumflextilde", "Adiaeresis", "Adiaeresismacron", "Adotaccent", "Adotaccentmacron", "Adotbelow", "Adoublegrave", "AfterPar", "Agrave", "Ahook", "Ainvertedbreve", "Alpha", "Alphabeticnumerals", "AmSTeX", "Amacron", "And", "Angstrom", "Aogonek", "Aring", "Aringacute", "Arrowvert", "Astroke", "Atilde", "BeforePar", "Beta", "Bhook", "Big", "Bigg", "Biggl", "Biggm", "Biggr", "Bigl", "Bigm", "Bigr", "Box", "Bumpeq", "CONTEXT", "Cacute", "Cap", "Caps", "Ccaron", "Ccedilla", "Ccircumflex", "Cdotaccent", "Character", "Characters", "Chi", "Chook", "ConTeXt", "Context", "ConvertConstantAfter", "ConvertToConstant", "Cstroke", "Cup", "DZcaronligature", "DZligature", "Dafrican", "Dcaron", "Ddownarrow", "Delta", "Dhook", "Doteq", "Downarrow", "Dstroke", "Dzcaronligature", "Dzligature", "ETEX", "Eacute", "Ebreve", "Ecaron", "Ecedilla", "Ecircumflex", "Ecircumflexacute", "Ecircumflexdotbelow", "Ecircumflexgrave", "Ecircumflexhook", "Ecircumflextilde", "Ediaeresis", "Edotaccent", "Edotbelow", "Edoublegrave", "Egrave", "Ehook", "Einvertedbreve", "Emacron", "Eogonek", "Epsilon", "Eta", "Eth", "Etilde", "Eulerconst", "EveryLine", "EveryPar", "Fhook", "Finv", "Gacute", "Game", "Gamma", "Gbreve", "Gcaron", "Gcircumflex", "Gcommaaccent", "Gdotaccent", "GetPar", "Ghook", "GotoPar", "Greeknumerals", "Gstroke", "Hat", "Hcaron", "Hcircumflex", "Hstroke", "IJligature", "INRSTEX", "Iacute", "Ibreve", "Icaron", "Icircumflex", "Idiaeresis", "Idotaccent", "Idotbelow", "Idoublegrave", "Igrave", "Ihook", "Iinvertedbreve", "Im", "Imacron", "Iogonek", "Iota", "Istroke", "Itilde", "Jcircumflex", "Join", "Kappa", "Kcaron", "Kcommaaccent", "Khook", "LAMSTEX", "LATEX", "LJligature", "LUAJITTEX", "LUATEX", "LaTeX", "Lacute", "LamSTeX", "Lambda", "Lbar", "Lcaron", "Lcommaaccent", "Ldotmiddle", "Ldsh", "Leftarrow", "Leftrightarrow", "Ljligature", "Lleftarrow", "Longleftarrow", "Longleftrightarrow", "Longmapsfrom", "Longmapsto", "Longrightarrow", "Lsh", "Lstroke", "Lua", "LuaTeX", "LuajitTeX", "METAFONT", "METAFUN", "METAPOST", "MKII", "MKIV", "MKIX", "MKVI", "MKXI", "MONTH", "MONTHLONG", "MONTHSHORT", "MPII", "MPIV", "MPVI", "MPanchor", "MPbetex", "MPc", "MPcode", "MPcolor", "MPcoloronly", "MPcolumn", "MPd", "MPdrawing", "MPfontsizehskip", "MPgetmultipars", "MPgetmultishape", "MPgetposboxes", "MPh", "MPinclusions", "MPleftskip", "MPll", "MPlr", "MPls", "MPmenubuttons", "MPn", "MPoptions", "MPoverlayanchor", "MPp", "MPpage", "MPpardata", "MPplus", "MPpos", "MPpositiongraphic", "MPposset", "MPr", "MPrawvar", "MPregion", "MPrest", "MPrightskip", "MPrs", "MPstring", "MPtext", "MPtransparency", "MPul", "MPur", "MPv", "MPvar", "MPvariable", "MPvv", "MPw", "MPwhd", "MPx", "MPxy", "MPxywhd", "MPy", "Mapsfrom", "Mapsto", "MetaFont", "MetaFun", "MetaPost", "Mu", "NJligature", "Nacute", "Ncaron", "Ncommaaccent", "Nearrow", "Neng", "Ngrave", "Njligature", "NormalizeFontHeight", "NormalizeFontWidth", "NormalizeTextHeight", "NormalizeTextWidth", "Ntilde", "Nu", "Numbers", "Nwarrow", "OEligature", "Oacute", "Obreve", "Ocaron", "Ocircumflex", "Ocircumflexacute", "Ocircumflexdotbelow", "Ocircumflexgrave", "Ocircumflexhook", "Ocircumflextilde", "Odiaeresis", "Odiaeresismacron", "Odotaccent", "Odotaccentmacron", "Odotbelow", "Odoublegrave", "Ograve", "Ohook", "Ohorn", "Ohornacute", "Ohorndotbelow", "Ohorngrave", "Ohornhook", "Ohorntilde", "Ohungarumlaut", "Oinvertedbreve", "Omacron", "Omega", "Omicron", "Oogonek", "Oogonekmacron", "Ostroke", "Ostrokeacute", "Otilde", "Otildemacron", "P", "PDFETEX", "PDFTEX", "PDFcolor", "PICTEX", "PPCHTEX", "PPCHTeX", "PRAGMA", "Phi", "Phook", "Pi", "PiCTeX", "Plankconst", "PointsToBigPoints", "PointsToReal", "PointsToWholeBigPoints", "PropertyLine", "Psi", "PtToCm", "Racute", "Rcaron", "Rcommaaccent", "Rdoublegrave", "Rdsh", "Re", "ReadFile", "Relbar", "Rho", "Rightarrow", "Rinvertedbreve", "Romannumerals", "Rrightarrow", "Rsh", "S", "Sacute", "ScaledPointsToBigPoints", "ScaledPointsToWholeBigPoints", "Scaron", "Scedilla", "Schwa", "Scircumflex", "Scommaaccent", "Searrow", "Sigma", "Smallcapped", "Subset", "Supset", "Swarrow", "TABLE", "TEX", "TaBlE", "Tau", "Tcaron", "Tcedilla", "Tcommaaccent", "TeX", "TheNormalizedFontSize", "Theta", "Thook", "Thorn", "TransparencyHack", "Tstroke", "Uacute", "Ubreve", "Ucaron", "Ucircumflex", "Udiaeresis", "Udiaeresisacute", "Udiaeresiscaron", "Udiaeresisgrave", "Udiaeresismacron", "Udotbelow", "Udoublegrave", "Ugrave", "Uhook", "Uhorn", "Uhornacute", "Uhorndotbelow", "Uhorngrave", "Uhornhook", "Uhorntilde", "Uhungarumlaut", "Uinvertedbreve", "Umacron", "Uogonek", "Uparrow", "Updownarrow", "Upsilon", "Uring", "Utilde", "Uuparrow", "VDash", "Vdash", "VerboseNumber", "Vert", "Vvdash", "WEEKDAY", "WORD", "WORDS", "Wcircumflex", "WidthSpanningText", "Word", "Words", "XETEX", "XeTeX", "Xi", "Yacute", "Ycircumflex", "Ydiaeresis", "Ydotbelow", "Ygrave", "Yhook", "Ymacron", "Ytilde", "Zacute", "Zcaron", "Zdotaccent", "Zeta", "Zhook", "Zstroke", "aacute", "abbreviation", "abjadnaivenumerals", "abjadnodotnumerals", "abjadnumerals", "about", "abreve", "abreveacute", "abrevedotbelow", "abrevegrave", "abrevehook", "abrevetilde", "acaron", "acircumflex", "acircumflexacute", "acircumflexdotbelow", "acircumflexgrave", "acircumflexhook", "acircumflextilde", "activatespacehandler", "actuarial", "acute", "acwopencirclearrow", "adaptcollector", "adaptfontfeature", "adaptlayout", "adaptpapersize", "addfeature", "addfontpath", "addtoJSpreamble", "addtocommalist", "addvalue", "adiaeresis", "adiaeresismacron", "adotaccent", "adotaccentmacron", "adotbelow", "adoublegrave", "aeacute", "aeligature", "aemacron", "afghanicurrency", "aftersplitstring", "aftertestandsplitstring", "agrave", "ahook", "ainvertedbreve", "aleph", "alignbottom", "aligned", "alignedbox", "alignedline", "alignhere", "alignmentcharacter", "allinputpaths", "alpha", "alphabeticnumerals", "alwayscitation", "alwayscite", "amacron", "amalg", "ampersand", "anchor", "angle", "aogonek", "appendetoks", "appendgvalue", "appendtocommalist", "appendtoks", "appendtoksonce", "appendvalue", "apply", "applyalternativestyle", "applyprocessor", "applytocharacters", "applytofirstcharacter", "applytosplitstringchar", "applytosplitstringcharspaced", "applytosplitstringline", "applytosplitstringlinespaced", "applytosplitstringword", "applytosplitstringwordspaced", "applytowords", "approx", "approxEq", "approxeq", "approxnEq", "arabicakbar", "arabicalayhe", "arabicallah", "arabicallallahou", "arabicasterisk", "arabicbasmalah", "arabiccomma", "arabiccuberoot", "arabicdateseparator", "arabicdecimals", "arabicdisputedendofayah", "arabicendofayah", "arabicexnumerals", "arabicfootnotemarker", "arabicfourthroot", "arabichighain", "arabichighalayheassallam", "arabichigheqala", "arabichighesala", "arabichighfootnotemarker", "arabichighjeem", "arabichighlamalef", "arabichighmadda", "arabichighmeemlong", "arabichighmeemshort", "arabichighnisf", "arabichighnoon", "arabichighnoonkasra", "arabichighqaf", "arabichighqif", "arabichighradiallahouanhu", "arabichighrahmatullahalayhe", "arabichighrubc", "arabichighsad", "arabichighsajda", "arabichighsakta", "arabichighsallallahou", "arabichighseen", "arabichighsmallsafha", "arabichightah", "arabichightakhallus", "arabichighthalatha", "arabichighwaqf", "arabichighyeh", "arabichighzain", "arabicjallajalalouhou", "arabiclettermark", "arabiclowmeemlong", "arabiclownoonkasra", "arabiclowseen", "arabicmisra", "arabicmuhammad", "arabicnumber", "arabicnumberabove", "arabicnumerals", "arabicparenleft", "arabicparenright", "arabicpercent", "arabicperiod", "arabicpermille", "arabicpertenthousand", "arabicpoeticverse", "arabicqala", "arabicquestion", "arabicrasoul", "arabicray", "arabicrialsign", "arabicsafha", "arabicsajdah", "arabicsalla", "arabicsamvat", "arabicsanah", "arabicsemicolon", "arabicshighthreedots", "arabicslcm", "arabicstartofrubc", "arabictripledot", "arabicvowelwaw", "arabicvowelyeh", "arabicwasallam", "arg", "aring", "aringacute", "arrowvert", "asciistr", "aside", "assignalfadimension", "assigndimen", "assigndimension", "assignifempty", "assigntranslation", "assignvalue", "assignwidth", "assumelongusagecs", "ast", "astype", "asymp", "at", "atilde", "atleftmargin", "atpage", "atrightmargin", "attachment", "autocap", "autodirhbox", "autodirvbox", "autodirvtop", "autoinsertnextspace", "autointegral", "automathematics", "autosetups", "availablehsize", "averagecharwidth", "backepsilon", "background", "backgroundimage", "backgroundimagefill", "backgroundline", "backprime", "backsim", "backslash", "bar", "barleftarrow", "barleftarrowrightarrowbar", "barovernorthwestarrow", "barwedge", "basegrid", "baselinebottom", "baselineleftbox", "baselinemiddlebox", "baselinerightbox", "bbordermatrix", "bbox", "because", "beforesplitstring", "beforetestandsplitstring", "beta", "beth", "between", "bhook", "big", "bigbodyfont", "bigcap", "bigcirc", "bigcircle", "bigcup", "bigdiamond", "bigg", "bigger", "biggl", "biggm", "biggr", "bigl", "bigm", "bigodot", "bigoplus", "bigotimes", "bigr", "bigskip", "bigsqcap", "bigsqcup", "bigsquare", "bigstar", "bigtimes", "bigtriangledown", "bigtriangleup", "bigudot", "biguplus", "bigvee", "bigwedge", "binom", "bitmapimage", "blacklozenge", "blackrule", "blackrules", "blacksquare", "blacktriangle", "blacktriangledown", "blacktriangleleft", "blacktriangleright", "blank", "blap", "bleed", "bleedheight", "bleedwidth", "blockligatures", "blockquote", "blocksynctexfile", "bodyfontenvironmentlist", "bodyfontsize", "bold", "boldface", "bolditalic", "boldslanted", "bookmark", "booleanmodevalue", "bordermatrix", "bot", "bottombox", "bottomleftbox", "bottomrightbox", "bowtie", "boxcursor", "boxdot", "boxmarker", "boxminus", "boxofsize", "boxplus", "boxreference", "boxtimes", "bpos", "breakablethinspace", "breakhere", "breve", "bstroke", "btxabbreviatedjournal", "btxaddjournal", "btxalwayscitation", "btxauthorfield", "btxdetail", "btxdirect", "btxdoif", "btxdoifcombiinlistelse", "btxdoifelse", "btxdoifelsecombiinlist", "btxdoifelsesameasprevious", "btxdoifelsesameaspreviouschecked", "btxdoifelseuservariable", "btxdoifnot", "btxdoifsameaspreviouscheckedelse", "btxdoifsameaspreviouselse", "btxdoifuservariableelse", "btxexpandedjournal", "btxfield", "btxfieldname", "btxfieldtype", "btxfirstofrange", "btxflush", "btxflushauthor", "btxflushauthorinverted", "btxflushauthorinvertedshort", "btxflushauthorname", "btxflushauthornormal", "btxflushauthornormalshort", "btxflushsuffix", "btxfoundname", "btxfoundtype", "btxhiddencitation", "btxhybridcite", "btxlabellanguage", "btxlabeltext", "btxlistcitation", "btxloadjournalist", "btxoneorrange", "btxremapauthor", "btxsavejournalist", "btxsetup", "btxsingularorplural", "btxsingularplural", "btxtextcitation", "buildmathaccent", "buildtextaccent", "buildtextbottomcomma", "buildtextbottomdot", "buildtextcedilla", "buildtextgrave", "buildtextmacron", "buildtextognek", "bullet", "button", "cacute", "calligraphic", "camel", "cap", "carriagereturn", "catcodetablename", "cbox", "ccaron", "ccedilla", "ccircumflex", "ccurl", "cdot", "cdotaccent", "cdotp", "cdots", "centeraligned", "centerbox", "centerdot", "centeredbox", "centeredlastline", "centerednextbox", "centerline", "cfrac", "chapter", "character", "characters", "chardescription", "charwidthlanguage", "check", "checkcharacteralign", "checkedchar", "checkedfiller", "checkedstrippedcsname", "checkinjector", "checkmark", "checknextindentation", "checknextinjector", "checkpage", "checkparameters", "checkpreviousinjector", "checksoundtrack", "checktwopassdata", "checkvariables", "chem", "chemical", "chemicalbottext", "chemicalmidtext", "chemicalsymbol", "chemicaltext", "chemicaltoptext", "chi", "chineseallnumerals", "chinesecapnumerals", "chinesenumerals", "chook", "circ", "circeq", "circlearrowleft", "circlearrowright", "circledR", "circledS", "circledast", "circledcirc", "circleddash", "circledequals", "circleonrightarrow", "citation", "cite", "clap", "classfont", "cldcommand", "cldcontext", "cldloadfile", "cldprocessfile", "cleftarrow", "clip", "clonefield", "clubsuit", "collect", "collectedtext", "collectexpanded", "colon", "coloncolonequals", "colonequals", "color", "colorbar", "colorcomponents", "colored", "coloronly", "colorvalue", "column", "columnbreak", "combinepages", "commalistelement", "commalistsentence", "commalistsize", "comment", "comparecolorgroup", "comparedimension", "comparedimensioneps", "comparepalet", "complement", "completebtxrendering", "completecontent", "completeindex", "completelist", "completelistofabbreviations", "completelistofchemicals", "completelistoffigures", "completelistofgraphics", "completelistofintermezzi", "completelistoflogos", "completelistofpublications", "completelistofsorts", "completelistofsynonyms", "completelistoftables", "completepagenumber", "completeregister", "complexes", "complexorsimple", "complexorsimpleempty", "component", "composedcollector", "composedlayer", "compresult", "cong", "constantdimen", "constantdimenargument", "constantemptyargument", "constantnumber", "constantnumberargument", "contentreference", "continuednumber", "continueifinputfile", "convertargument", "convertcommand", "convertedcounter", "converteddimen", "convertedsubcounter", "convertmonth", "convertnumber", "convertvalue", "convertvboxtohbox", "coprod", "copyboxfromcache", "copybtxlabeltext", "copyfield", "copyheadtext", "copylabeltext", "copymathlabeltext", "copyoperatortext", "copypages", "copyparameters", "copyposition", "copyprefixtext", "copyright", "copysuffixtext", "copytaglabeltext", "copyunittext", "correctwhitespace", "countersubs", "counttoken", "counttokens", "cramped", "crampedclap", "crampedllap", "crampedrlap", "crightarrow", "crightoverleftarrow", "cstroke", "ctop", "ctxcommand", "ctxdirectcommand", "ctxdirectlua", "ctxfunction", "ctxlatecommand", "ctxlatelua", "ctxloadluafile", "ctxlua", "ctxluabuffer", "ctxluacode", "ctxreport", "ctxsprint", "cup", "curlyeqprec", "curlyeqsucc", "curlyvee", "curlywedge", "currentassignmentlistkey", "currentassignmentlistvalue", "currentbtxuservariable", "currentcommalistitem", "currentcomponent", "currentdate", "currentenvironment", "currentfeaturetest", "currentheadnumber", "currentinterface", "currentlanguage", "currentlistentrydestinationattribute", "currentlistentrylimitedtext", "currentlistentrynumber", "currentlistentrypagenumber", "currentlistentryreferenceattribute", "currentlistentrytitle", "currentlistentrytitlerendered", "currentlistsymbol", "currentmainlanguage", "currentmessagetext", "currentmoduleparameter", "currentoutputstream", "currentproduct", "currentproject", "currentregime", "currentregisterpageuserdata", "currentresponses", "currenttime", "currentvalue", "currentxtablecolumn", "currentxtablerow", "curvearrowleft", "curvearrowright", "cwopencirclearrow", "cyrillicA", "cyrillicAE", "cyrillicAbreve", "cyrillicAdiaeresis", "cyrillicB", "cyrillicBIGYUS", "cyrillicBIGYUSiotified", "cyrillicC", "cyrillicCH", "cyrillicCHEDC", "cyrillicCHEDCabkhasian", "cyrillicCHEabkhasian", "cyrillicCHEdiaeresis", "cyrillicCHEkhakassian", "cyrillicCHEvertstroke", "cyrillicD", "cyrillicDASIAPNEUMATA", "cyrillicDJE", "cyrillicDZE", "cyrillicDZEabkhasian", "cyrillicDZHE", "cyrillicE", "cyrillicELtail", "cyrillicEMtail", "cyrillicENDC", "cyrillicENGHE", "cyrillicENhook", "cyrillicENtail", "cyrillicEREV", "cyrillicERY", "cyrillicERtick", "cyrillicEbreve", "cyrillicEdiaeresis", "cyrillicEgrave", "cyrillicEiotified", "cyrillicF", "cyrillicFITA", "cyrillicG", "cyrillicGHEmidhook", "cyrillicGHEstroke", "cyrillicGHEupturn", "cyrillicGJE", "cyrillicH", "cyrillicHA", "cyrillicHADC", "cyrillicHRDSN", "cyrillicI", "cyrillicIE", "cyrillicII", "cyrillicISHRT", "cyrillicISHRTtail", "cyrillicIZHITSA", "cyrillicIZHITSAdoublegrave", "cyrillicIdiaeresis", "cyrillicIgrave", "cyrillicImacron", "cyrillicJE", "cyrillicK", "cyrillicKADC", "cyrillicKAbashkir", "cyrillicKAhook", "cyrillicKAstroke", "cyrillicKAvertstroke", "cyrillicKJE", "cyrillicKOPPA", "cyrillicKSI", "cyrillicL", "cyrillicLITTLEYUS", "cyrillicLITTLEYUSiotified", "cyrillicLJE", "cyrillicM", "cyrillicN", "cyrillicNJE", "cyrillicO", "cyrillicOMEGA", "cyrillicOMEGAround", "cyrillicOMEGAtitlo", "cyrillicOT", "cyrillicObarred", "cyrillicObarreddiaeresis", "cyrillicOdiaeresis", "cyrillicP", "cyrillicPALATALIZATION", "cyrillicPALOCHKA", "cyrillicPEmidhook", "cyrillicPSI", "cyrillicPSILIPNEUMATA", "cyrillicR", "cyrillicS", "cyrillicSCHWA", "cyrillicSCHWAdiaeresis", "cyrillicSDSC", "cyrillicSEMISOFT", "cyrillicSFTSN", "cyrillicSH", "cyrillicSHCH", "cyrillicSHHA", "cyrillicT", "cyrillicTEDC", "cyrillicTETSE", "cyrillicTITLO", "cyrillicTSHE", "cyrillicU", "cyrillicUK", "cyrillicUSHRT", "cyrillicUdiaeresis", "cyrillicUdoubleacute", "cyrillicUmacron", "cyrillicV", "cyrillicYA", "cyrillicYAT", "cyrillicYERUdiaeresis", "cyrillicYI", "cyrillicYO", "cyrillicYU", "cyrillicYstr", "cyrillicYstrstroke", "cyrillicZ", "cyrillicZDSC", "cyrillicZEdiaeresis", "cyrillicZH", "cyrillicZHEbreve", "cyrillicZHEdescender", "cyrillicZHEdiaeresis", "cyrillica", "cyrillicabreve", "cyrillicadiaeresis", "cyrillicae", "cyrillicb", "cyrillicbigyus", "cyrillicbigyusiotified", "cyrillicc", "cyrillicch", "cyrilliccheabkhasian", "cyrillicchedc", "cyrillicchedcabkhasian", "cyrillicchediaeresis", "cyrillicchekhakassian", "cyrillicchevertstroke", "cyrillicd", "cyrillicdje", "cyrillicdze", "cyrillicdzeabkhasian", "cyrillicdzhe", "cyrillice", "cyrillicebreve", "cyrillicediaeresis", "cyrillicegrave", "cyrilliceiotified", "cyrilliceltail", "cyrillicemtail", "cyrillicendc", "cyrillicenghe", "cyrillicenhook", "cyrillicentail", "cyrillicerev", "cyrillicertick", "cyrillicery", "cyrillicf", "cyrillicfita", "cyrillicg", "cyrillicghemidhook", "cyrillicghestroke", "cyrillicgheupturn", "cyrillicgje", "cyrillich", "cyrillicha", "cyrillichadc", "cyrillichrdsn", "cyrillici", "cyrillicidiaeresis", "cyrillicie", "cyrillicigrave", "cyrillicii", "cyrillicimacron", "cyrillicishrt", "cyrillicishrttail", "cyrillicizhitsa", "cyrillicizhitsadoublegrave", "cyrillicje", "cyrillick", "cyrillickabashkir", "cyrillickadc", "cyrillickahook", "cyrillickastroke", "cyrillickavertstroke", "cyrillickje", "cyrillickoppa", "cyrillicksi", "cyrillicl", "cyrilliclittleyus", "cyrilliclittleyusiotified", "cyrilliclje", "cyrillicm", "cyrillicn", "cyrillicnje", "cyrillico", "cyrillicobarred", "cyrillicobarreddiaeresis", "cyrillicodiaeresis", "cyrillicomega", "cyrillicomegaround", "cyrillicomegatitlo", "cyrillicot", "cyrillicp", "cyrillicpemidhook", "cyrillicpsi", "cyrillicr", "cyrillics", "cyrillicschwa", "cyrillicschwadiaeresis", "cyrillicsdsc", "cyrillicsemisoft", "cyrillicsftsn", "cyrillicsh", "cyrillicshch", "cyrillicshha", "cyrillict", "cyrillictedc", "cyrillictetse", "cyrillictshe", "cyrillicu", "cyrillicudiaeresis", "cyrillicudoubleacute", "cyrillicuk", "cyrillicumacron", "cyrillicushrt", "cyrillicv", "cyrillicya", "cyrillicyat", "cyrillicyerudiaeresis", "cyrillicyi", "cyrillicyo", "cyrillicystr", "cyrillicystrstroke", "cyrillicyu", "cyrillicz", "cyrilliczdsc", "cyrilliczediaeresis", "cyrilliczh", "cyrilliczhebreve", "cyrilliczhedescender", "cyrilliczhediaeresis", "d", "dag", "dagger", "daleth", "dasharrow", "dashedleftarrow", "dashedrightarrow", "dashv", "datasetvariable", "date", "dayoftheweek", "dayspermonth", "dbinom", "dcaron", "dcurl", "ddag", "ddagger", "dddot", "ddot", "ddots", "decrement", "decrementcounter", "decrementedcounter", "decrementpagenumber", "decrementsubpagenumber", "decrementvalue", "defaultinterface", "defaultobjectpage", "defaultobjectreference", "defcatcodecommand", "defconvertedargument", "defconvertedcommand", "defconvertedvalue", "define", "defineMPinstance", "defineTABLEsetup", "defineaccent", "defineactivecharacter", "definealternativestyle", "defineanchor", "defineattachment", "defineattribute", "definebackground", "definebar", "defineblock", "definebodyfont", "definebodyfontenvironment", "definebodyfontswitch", "definebreakpoint", "definebreakpoints", "definebtx", "definebtxdataset", "definebtxregister", "definebtxrendering", "definebuffer", "definebutton", "definecapitals", "definecharacter", "definecharacterkerning", "definecharacterspacing", "definechemical", "definechemicals", "definechemicalsymbol", "definecollector", "definecolor", "definecolorgroup", "definecolumnbreak", "definecombination", "definecombinedlist", "definecommand", "definecomment", "definecomplexorsimple", "definecomplexorsimpleempty", "defineconversion", "defineconversionset", "definecounter", "definedataset", "definedelimitedtext", "definedeq", "definedescription", "definedfont", "defineeffect", "defineenumeration", "defineexpandable", "defineexternalfigure", "definefallbackfamily", "definefield", "definefieldbody", "definefieldbodyset", "definefieldcategory", "definefieldstack", "definefiguresymbol", "definefileconstant", "definefilefallback", "definefilesynonym", "definefiller", "definefirstline", "definefittingpage", "definefloat", "definefont", "definefontalternative", "definefontfallback", "definefontfamily", "definefontfamilypreset", "definefontfeature", "definefontfile", "definefontsize", "definefontsolution", "definefontstyle", "definefontsynonym", "defineformula", "defineformulaalternative", "defineformulaframed", "defineframed", "defineframedcontent", "defineframedtable", "defineframedtext", "definefrozenfont", "defineglobalcolor", "definegraphictypesynonym", "definegridsnapping", "definehbox", "definehead", "defineheadalternative", "definehelp", "definehigh", "definehighlight", "definehspace", "definehypenationfeatures", "defineindentedtext", "defineindenting", "defineinitial", "defineinsertion", "defineinteraction", "defineinteractionbar", "defineinteractionmenu", "defineinterfaceconstant", "defineinterfaceelement", "defineinterfacevariable", "defineinterlinespace", "defineintermediatecolor", "defineitemgroup", "defineitems", "definelabel", "definelabelclass", "definelayer", "definelayerpreset", "definelayout", "definelinefiller", "definelinenote", "definelinenumbering", "definelines", "definelist", "definelistalternative", "definelistextra", "definelow", "definelowhigh", "definelowmidhigh", "definemakeup", "definemarginblock", "definemargindata", "definemarker", "definemarking", "definemathaccent", "definemathalignment", "definemathcases", "definemathcommand", "definemathdouble", "definemathdoubleextensible", "definemathematics", "definemathextensible", "definemathfence", "definemathfraction", "definemathframed", "definemathmatrix", "definemathornament", "definemathover", "definemathoverextensible", "definemathovertextextensible", "definemathradical", "definemathstackers", "definemathstyle", "definemathtriplet", "definemathunder", "definemathunderextensible", "definemathundertextextensible", "definemathunstacked", "definemeasure", "definemessageconstant", "definemixedcolumns", "definemode", "definemultitonecolor", "definenamedcolor", "definenamespace", "definenarrower", "definenote", "defineornament", "defineoutputroutine", "defineoutputroutinecommand", "defineoverlay", "definepage", "definepagebreak", "definepagechecker", "definepagegrid", "definepagegridarea", "definepagegridspan", "definepageinjection", "definepageinjectionalternative", "definepageshift", "definepagestate", "definepairedbox", "definepalet", "definepapersize", "defineparagraph", "defineparagraphs", "defineparallel", "defineparbuilder", "defineplacement", "definepositioning", "defineprefixset", "defineprocesscolor", "defineprocessor", "defineprofile", "defineprogram", "definepushbutton", "definepushsymbol", "definereference", "definereferenceformat", "defineregister", "definerenderingwindow", "defineresetset", "definescale", "definescript", "definesection", "definesectionblock", "definesectionlevels", "defineselector", "defineseparatorset", "defineshift", "definesidebar", "definesort", "definesorting", "definespotcolor", "definestartstop", "definestyle", "definestyleinstance", "definesubfield", "definesubformula", "definesymbol", "definesynonym", "definesynonyms", "definesystemattribute", "definesystemconstant", "definesystemvariable", "definetabletemplate", "definetabulate", "definetabulation", "definetext", "definetextbackground", "definetextflow", "definetooltip", "definetransparency", "definetwopasslist", "definetype", "definetypeface", "definetypescriptprefix", "definetypescriptsynonym", "definetypesetting", "definetyping", "defineunit", "defineviewerlayer", "definevspace", "definevspacing", "definevspacingamount", "definextable", "delimited", "delimitedtext", "delta", "depthofstring", "depthonlybox", "depthspanningtext", "depthstrut", "determineheadnumber", "determinelistcharacteristics", "determinenoflines", "determineregistercharacteristics", "devanagarinumerals", "dfrac", "dhook", "diameter", "diamond", "diamondsuit", "differentialD", "differentiald", "digamma", "digits", "dimensiontocount", "directboxfromcache", "directcolor", "directcolored", "directconvertedcounter", "directcopyboxfromcache", "directdummyparameter", "directgetboxllx", "directgetboxlly", "directhighlight", "directlocalframed", "directluacode", "directselect", "directsetbar", "directsetup", "directsymbol", "directvspacing", "dis", "disabledirectives", "disableexperiments", "disablemode", "disableoutputstream", "disableparpositions", "disableregime", "disabletrackers", "displaymath", "displaymathematics", "displaymessage", "distributedhsize", "div", "dividedsize", "divideontimes", "divides", "doadaptleftskip", "doadaptrightskip", "doaddfeature", "doassign", "doassignempty", "doboundtext", "docheckassignment", "docheckedpagestate", "docheckedpair", "documentvariable", "dodoubleargument", "dodoubleargumentwithset", "dodoubleempty", "dodoubleemptywithset", "dodoublegroupempty", "doeassign", "doexpandedrecurse", "dofastloopcs", "dogetattribute", "dogetattributeid", "dogetcommacommandelement", "dogobbledoubleempty", "dogobblesingleempty", "doif", "doifMPgraphicelse", "doifallcommon", "doifallcommonelse", "doifalldefinedelse", "doifallmodes", "doifallmodeselse", "doifassignmentelse", "doifblackelse", "doifbothsides", "doifbothsidesoverruled", "doifboxelse", "doifbufferelse", "doifcolor", "doifcolorelse", "doifcommandhandler", "doifcommandhandlerelse", "doifcommon", "doifcommonelse", "doifcontent", "doifconversiondefinedelse", "doifconversionnumberelse", "doifcounter", "doifcounterelse", "doifcurrentfonthasfeatureelse", "doifdefined", "doifdefinedcounter", "doifdefinedcounterelse", "doifdefinedelse", "doifdimensionelse", "doifdimenstringelse", "doifdocumentargument", "doifdocumentargumentelse", "doifdocumentfilename", "doifdocumentfilenameelse", "doifdrawingblackelse", "doifelse", "doifelseMPgraphic", "doifelseallcommon", "doifelsealldefined", "doifelseallmodes", "doifelseassignment", "doifelseblack", "doifelsebox", "doifelseboxincache", "doifelsebuffer", "doifelsecolor", "doifelsecommandhandler", "doifelsecommon", "doifelseconversiondefined", "doifelseconversionnumber", "doifelsecounter", "doifelsecurrentfonthasfeature", "doifelsecurrentsortingused", "doifelsecurrentsynonymshown", "doifelsecurrentsynonymused", "doifelsedefined", "doifelsedefinedcounter", "doifelsedimension", "doifelsedimenstring", "doifelsedocumentargument", "doifelsedocumentfilename", "doifelsedrawingblack", "doifelseempty", "doifelseemptyvalue", "doifelseemptyvariable", "doifelseenv", "doifelsefastoptionalcheck", "doifelsefastoptionalcheckcs", "doifelsefieldbody", "doifelsefieldcategory", "doifelsefigure", "doifelsefile", "doifelsefiledefined", "doifelsefileexists", "doifelsefirstchar", "doifelseflagged", "doifelsefontchar", "doifelsefontpresent", "doifelsefontsynonym", "doifelsehasspace", "doifelsehelp", "doifelseincsname", "doifelseinelement", "doifelseinputfile", "doifelseinsertion", "doifelseinset", "doifelseinstring", "doifelseinsymbolset", "doifelseintoks", "doifelseintwopassdata", "doifelseitalic", "doifelselanguage", "doifelselayerdata", "doifelselayoutdefined", "doifelselayoutsomeline", "doifelselayouttextline", "doifelseleapyear", "doifelselist", "doifelselocation", "doifelselocfile", "doifelsemainfloatbody", "doifelsemarkedpage", "doifelsemarking", "doifelsemeaning", "doifelsemessage", "doifelsemode", "doifelsenextbgroup", "doifelsenextbgroupcs", "doifelsenextchar", "doifelsenextoptional", "doifelsenextoptionalcs", "doifelsenextparenthesis", "doifelsenonzeropositive", "doifelsenoteonsamepage", "doifelsenothing", "doifelsenumber", "doifelseobjectfound", "doifelseobjectreferencefound", "doifelseoddpage", "doifelseoddpagefloat", "doifelseoldercontext", "doifelseolderversion", "doifelseoverlapping", "doifelseoverlay", "doifelseparallel", "doifelseparentfile", "doifelsepath", "doifelsepathexists", "doifelsepatterns", "doifelseposition", "doifelsepositionaction", "doifelsepositiononpage", "doifelsepositionsonsamepage", "doifelsepositionsonthispage", "doifelsepositionsused", "doifelsereferencefound", "doifelserightpagefloat", "doifelserighttoleftinbox", "doifelsesamelinereference", "doifelsesamestring", "doifelsesetups", "doifelsesomebackground", "doifelsesomespace", "doifelsesomething", "doifelsesometoks", "doifelsestringinstring", "doifelsestructurelisthasnumber", "doifelsestructurelisthaspage", "doifelsesymboldefined", "doifelsesymbolset", "doifelsetext", "doifelsetextflow", "doifelsetextflowcollector", "doifelsetopofpage", "doifelsetypingfile", "doifelseundefined", "doifelseurldefined", "doifelsevalue", "doifelsevaluenothing", "doifelsevariable", "doifempty", "doifemptyelse", "doifemptytoks", "doifemptyvalue", "doifemptyvalueelse", "doifemptyvariable", "doifemptyvariableelse", "doifenv", "doifenvelse", "doiffastoptionalcheckcselse", "doiffastoptionalcheckelse", "doiffieldbodyelse", "doiffieldcategoryelse", "doiffigureelse", "doiffile", "doiffiledefinedelse", "doiffileelse", "doiffileexistselse", "doiffirstcharelse", "doifflaggedelse", "doiffontcharelse", "doiffontpresentelse", "doiffontsynonymelse", "doifhasspaceelse", "doifhelpelse", "doifincsnameelse", "doifinelementelse", "doifinputfileelse", "doifinsertionelse", "doifinset", "doifinsetelse", "doifinstring", "doifinstringelse", "doifinsymbolset", "doifinsymbolsetelse", "doifintokselse", "doifintwopassdataelse", "doifitalicelse", "doiflanguageelse", "doiflayerdataelse", "doiflayoutdefinedelse", "doiflayoutsomelineelse", "doiflayouttextlineelse", "doifleapyearelse", "doiflistelse", "doiflocationelse", "doiflocfileelse", "doifmainfloatbodyelse", "doifmarkingelse", "doifmeaningelse", "doifmessageelse", "doifmode", "doifmodeelse", "doifnextbgroupcselse", "doifnextbgroupelse", "doifnextcharelse", "doifnextoptionalcselse", "doifnextoptionalelse", "doifnextparenthesiselse", "doifnonzeropositiveelse", "doifnot", "doifnotallcommon", "doifnotallmodes", "doifnotcommandhandler", "doifnotcommon", "doifnotcounter", "doifnotdocumentargument", "doifnotdocumentfilename", "doifnotempty", "doifnotemptyvalue", "doifnotemptyvariable", "doifnotenv", "doifnoteonsamepageelse", "doifnotescollected", "doifnotfile", "doifnotflagged", "doifnothing", "doifnothingelse", "doifnotinset", "doifnotinsidesplitfloat", "doifnotinstring", "doifnotmode", "doifnotnumber", "doifnotsamestring", "doifnotsetups", "doifnotvalue", "doifnotvariable", "doifnumber", "doifnumberelse", "doifobjectfoundelse", "doifobjectreferencefoundelse", "doifoddpageelse", "doifoddpagefloatelse", "doifoldercontextelse", "doifolderversionelse", "doifoverlappingelse", "doifoverlayelse", "doifparallelelse", "doifparentfileelse", "doifpathelse", "doifpathexistselse", "doifpatternselse", "doifposition", "doifpositionaction", "doifpositionactionelse", "doifpositionelse", "doifpositiononpageelse", "doifpositionsonsamepageelse", "doifpositionsonthispageelse", "doifpositionsusedelse", "doifreferencefoundelse", "doifrightpagefloatelse", "doifrighttoleftinboxelse", "doifsamelinereferenceelse", "doifsamestring", "doifsamestringelse", "doifsetups", "doifsetupselse", "doifsomebackground", "doifsomebackgroundelse", "doifsomespaceelse", "doifsomething", "doifsomethingelse", "doifsometoks", "doifsometokselse", "doifstringinstringelse", "doifstructurelisthasnumberelse", "doifstructurelisthaspageelse", "doifsymboldefinedelse", "doifsymbolsetelse", "doiftext", "doiftextelse", "doiftextflowcollectorelse", "doiftextflowelse", "doiftopofpageelse", "doiftypingfileelse", "doifundefined", "doifundefinedcounter", "doifundefinedelse", "doifurldefinedelse", "doifvalue", "doifvalueelse", "doifvaluenothing", "doifvaluenothingelse", "doifvaluesomething", "doifvariable", "doifvariableelse", "doindentation", "dollar", "doloop", "doloopoverlist", "donothing", "dontconvertfont", "dontleavehmode", "dontpermitspacesbetweengroups", "dopositionaction", "doprocesslocalsetups", "doquadrupleargument", "doquadrupleempty", "doquadruplegroupempty", "doquintupleargument", "doquintupleempty", "doquintuplegroupempty", "dorechecknextindentation", "dorecurse", "dorepeatwithcommand", "doreplacefeature", "doresetandafffeature", "doresetattribute", "dorotatebox", "dosetattribute", "dosetleftskipadaption", "dosetrightskipadaption", "dosetupcheckedinterlinespace", "doseventupleargument", "doseventupleempty", "dosingleargument", "dosingleempty", "dosinglegroupempty", "dosixtupleargument", "dosixtupleempty", "dostepwiserecurse", "dosubtractfeature", "dot", "doteq", "doteqdot", "dotfskip", "dotlessI", "dotlessJ", "dotlessi", "dotlessj", "dotlessjstroke", "dotminus", "dotoks", "dotplus", "dotripleargument", "dotripleargumentwithset", "dotripleempty", "dotripleemptywithset", "dotriplegroupempty", "dots", "dottedrightarrow", "doublebar", "doublebond", "doublebrace", "doublebracket", "doublecap", "doublecup", "doubleparent", "doubleprime", "doubleverticalbar", "dowith", "dowithnextbox", "dowithnextboxcontent", "dowithnextboxcontentcs", "dowithnextboxcs", "dowithpargument", "dowithrange", "dowithwargument", "downarrow", "downdasharrow", "downdownarrows", "downharpoonleft", "downharpoonright", "downuparrows", "downwhitearrow", "downzigzagarrow", "dpofstring", "dstroke", "dtail", "dummydigit", "dummyparameter", "dzcaronligature", "dzligature", "eTeX", "eacute", "ebreve", "ecaron", "ecedilla", "ecircumflex", "ecircumflexacute", "ecircumflexdotbelow", "ecircumflexgrave", "ecircumflexhook", "ecircumflextilde", "edefconvertedargument", "ediaeresis", "edotaccent", "edotbelow", "edoublegrave", "efcmaxheight", "efcmaxwidth", "efcminheight", "efcminwidth", "efcparameter", "effect", "egrave", "ehook", "einvertedbreve", "elapsedseconds", "elapsedtime", "eleftarrowfill", "eleftharpoondownfill", "eleftharpoonupfill", "eleftrightarrowfill", "ell", "em", "emacron", "emdash", "emphasisboldface", "emphasistypeface", "emptylines", "emptyset", "emquad", "emspace", "enabledirectives", "enableexperiments", "enablemode", "enableoutputstream", "enableparpositions", "enableregime", "enabletrackers", "endash", "endnote", "enquad", "enskip", "enspace", "env", "environment", "envvar", "eogonek", "eoverbarfill", "eoverbracefill", "eoverbracketfill", "eoverparentfill", "epos", "epsilon", "eq", "eqcirc", "eqeq", "eqeqeq", "eqgtr", "eqless", "eqsim", "eqslantgtr", "eqslantless", "equaldigits", "equalscolon", "equiv", "erightarrowfill", "erightharpoondownfill", "erightharpoonupfill", "eta", "eth", "ethiopic", "etilde", "etwoheadrightarrowfill", "eunderbarfill", "eunderbracefill", "eunderbracketfill", "eunderparentfill", "exclamdown", "executeifdefined", "exists", "exitloop", "exitloopnow", "expandcheckedcsname", "expanded", "expandfontsynonym", "expdoif", "expdoifcommonelse", "expdoifelse", "expdoifelsecommon", "expdoifelseinset", "expdoifinsetelse", "expdoifnot", "exponentiale", "externalfigure", "externalfigurecollectionmaxheight", "externalfigurecollectionmaxwidth", "externalfigurecollectionminheight", "externalfigurecollectionminwidth", "externalfigurecollectionparameter", "fakebox", "fallingdotseq", "fastdecrement", "fastincrement", "fastlocalframed", "fastloopfinal", "fastloopindex", "fastscale", "fastsetup", "fastsetupwithargument", "fastsetupwithargumentswapped", "fastswitchtobodyfont", "fastsxsy", "feature", "fence", "fenced", "fetchallmarkings", "fetchallmarks", "fetchmark", "fetchmarking", "fetchonemark", "fetchonemarking", "fetchruntinecommand", "fetchtwomarkings", "fetchtwomarks", "ffiligature", "ffligature", "fflligature", "fhook", "field", "fieldbody", "fieldstack", "fifthoffivearguments", "fifthofsixarguments", "figurefilename", "figurefilepath", "figurefiletype", "figurefullname", "figureheight", "figurenaturalheight", "figurenaturalwidth", "figurespace", "figuresymbol", "figurewidth", "filename", "filigature", "filledhboxb", "filledhboxc", "filledhboxg", "filledhboxk", "filledhboxm", "filledhboxr", "filledhboxy", "filler", "fillinline", "fillinrules", "fillintext", "filterfromnext", "filterfromvalue", "filterpages", "filterreference", "findtwopassdata", "finishregisterentry", "firstcharacter", "firstcounter", "firstcountervalue", "firstoffivearguments", "firstoffourarguments", "firstofoneargument", "firstofoneunexpanded", "firstofsixarguments", "firstofthreearguments", "firstofthreeunexpanded", "firstoftwoarguments", "firstoftwounexpanded", "firstrealpage", "firstrealpagenumber", "firstsubcountervalue", "firstsubpage", "firstsubpagenumber", "firstuserpage", "firstuserpagenumber", "fitfield", "fitfieldframed", "fittopbaselinegrid", "fiveeighths", "fivesixths", "fixedspace", "fixedspaces", "flag", "flat", "flligature", "floatuserdataparameter", "flushbox", "flushboxregister", "flushcollector", "flushedrightlastline", "flushlayer", "flushlocalfloats", "flushnextbox", "flushnotes", "flushoutputstream", "flushshapebox", "flushtextflow", "flushtokens", "flushtoks", "fontalternative", "fontbody", "fontchar", "fontcharbyindex", "fontclass", "fontclassname", "fontface", "fontfeaturelist", "fontsize", "fontstyle", "footnote", "footnotetext", "forall", "forcecharacterstripping", "forcelocalfloats", "forgeteverypar", "forgetparameters", "forgetragged", "formula", "formulanumber", "foundbox", "fourfifths", "fourperemspace", "fourthoffivearguments", "fourthoffourarguments", "fourthofsixarguments", "frac", "framed", "frameddimension", "framedparameter", "framedtext", "freezedimenmacro", "freezemeasure", "frenchspacing", "from", "fromlinenote", "frown", "frozenhbox", "frule", "gacute", "gamma", "gbreve", "gcaron", "gcircumflex", "gcommaaccent", "gdefconvertedargument", "gdefconvertedcommand", "gdotaccent", "ge", "geq", "geqq", "geqslant", "getMPdrawing", "getMPlayer", "getboxfromcache", "getboxllx", "getboxlly", "getbuffer", "getbufferdata", "getcommacommandsize", "getcommalistsize", "getdayoftheweek", "getdayspermonth", "getdefinedbuffer", "getdocumentargument", "getdocumentargumentdefault", "getdocumentfilename", "getdummyparameters", "getemptyparameters", "geteparameters", "getexpandedparameters", "getfiguredimensions", "getfirstcharacter", "getfirsttwopassdata", "getfromcommacommand", "getfromcommalist", "getfromtwopassdata", "getglyphdirect", "getglyphstyled", "getgparameters", "getlasttwopassdata", "getlocalfloat", "getlocalfloats", "getmarking", "getmessage", "getnamedglyphdirect", "getnamedglyphstyled", "getnamedtwopassdatalist", "getnaturaldimensions", "getnoflines", "getobject", "getobjectdimensions", "getpaletsize", "getparameters", "getprivatechar", "getprivateslot", "getrandomcount", "getrandomdimen", "getrandomfloat", "getrandomnumber", "getrandomseed", "getraweparameters", "getrawgparameters", "getrawnoflines", "getrawparameters", "getrawxparameters", "getreference", "getreferenceentry", "getroundednoflines", "gets", "getsubstring", "gettwopassdata", "gettwopassdatalist", "getuvalue", "getvalue", "getvariable", "getvariabledefault", "getxparameters", "gg", "ggg", "gggtr", "gimel", "globaldisablemode", "globalenablemode", "globalletempty", "globalpopbox", "globalpopmacro", "globalpreventmode", "globalprocesscommalist", "globalpushbox", "globalpushmacro", "globalswapcounts", "globalswapdimens", "globalswapmacros", "globalundefine", "glyphfontfile", "gnapprox", "gneqq", "gnsim", "gobbledoubleempty", "gobbleeightarguments", "gobblefivearguments", "gobblefiveoptionals", "gobblefourarguments", "gobblefouroptionals", "gobbleninearguments", "gobbleoneargument", "gobbleoneoptional", "gobblesevenarguments", "gobblesingleempty", "gobblesixarguments", "gobblespacetokens", "gobbletenarguments", "gobblethreearguments", "gobblethreeoptionals", "gobbletwoarguments", "gobbletwooptionals", "gobbleuntil", "gobbleuntilrelax", "godown", "goto", "gotobox", "gotopage", "grabbufferdata", "grabbufferdatadirect", "grabuntil", "grave", "graycolor", "grayvalue", "greedysplitstring", "greekAlpha", "greekAlphadasia", "greekAlphadasiaperispomeni", "greekAlphadasiatonos", "greekAlphadasiavaria", "greekAlphaiotasub", "greekAlphaiotasubdasia", "greekAlphaiotasubdasiaperispomeni", "greekAlphaiotasubdasiatonos", "greekAlphaiotasubdasiavaria", "greekAlphaiotasubpsili", "greekAlphaiotasubpsiliperispomeni", "greekAlphaiotasubpsilitonos", "greekAlphaiotasubpsilivaria", "greekAlphamacron", "greekAlphapsili", "greekAlphapsiliperispomeni", "greekAlphapsilitonos", "greekAlphapsilivaria", "greekAlphatonos", "greekAlphavaria", "greekAlphavrachy", "greekBeta", "greekChi", "greekCoronis", "greekDelta", "greekEpsilon", "greekEpsilondasia", "greekEpsilondasiatonos", "greekEpsilondasiavaria", "greekEpsilonpsili", "greekEpsilonpsilitonos", "greekEpsilonpsilivaria", "greekEpsilontonos", "greekEpsilonvaria", "greekEta", "greekEtadasia", "greekEtadasiaperispomeni", "greekEtadasiatonos", "greekEtadasiavaria", "greekEtaiotasub", "greekEtaiotasubdasia", "greekEtaiotasubdasiaperispomeni", "greekEtaiotasubdasiatonos", "greekEtaiotasubdasiavaria", "greekEtaiotasubpsili", "greekEtaiotasubpsiliperispomeni", "greekEtaiotasubpsilitonos", "greekEtaiotasubpsilivaria", "greekEtapsili", "greekEtapsiliperispomeni", "greekEtapsilitonos", "greekEtapsilivaria", "greekEtatonos", "greekEtavaria", "greekGamma", "greekIota", "greekIotadasia", "greekIotadasiaperispomeni", "greekIotadasiatonos", "greekIotadasiavaria", "greekIotadialytika", "greekIotamacron", "greekIotapsili", "greekIotapsiliperispomeni", "greekIotapsilitonos", "greekIotapsilivaria", "greekIotatonos", "greekIotavaria", "greekIotavrachy", "greekKappa", "greekLambda", "greekMu", "greekNu", "greekOmega", "greekOmegadasia", "greekOmegadasiaperispomeni", "greekOmegadasiatonos", "greekOmegadasiavaria", "greekOmegaiotasub", "greekOmegaiotasubdasia", "greekOmegaiotasubdasiaperispomeni", "greekOmegaiotasubdasiatonos", "greekOmegaiotasubdasiavaria", "greekOmegaiotasubpsili", "greekOmegaiotasubpsiliperispomeni", "greekOmegaiotasubpsilitonos", "greekOmegaiotasubpsilivaria", "greekOmegapsili", "greekOmegapsiliperispomeni", "greekOmegapsilitonos", "greekOmegapsilivaria", "greekOmegatonos", "greekOmegavaria", "greekOmicron", "greekOmicrondasia", "greekOmicrondasiatonos", "greekOmicrondasiavaria", "greekOmicronpsili", "greekOmicronpsilitonos", "greekOmicronpsilivaria", "greekOmicrontonos", "greekOmicronvaria", "greekPhi", "greekPi", "greekPsi", "greekRho", "greekRhodasia", "greekSigma", "greekSigmalunate", "greekTau", "greekTheta", "greekUpsilon", "greekUpsilondasia", "greekUpsilondasiaperispomeni", "greekUpsilondasiatonos", "greekUpsilondasiavaria", "greekUpsilondialytika", "greekUpsilonmacron", "greekUpsilontonos", "greekUpsilonvaria", "greekUpsilonvrachy", "greekXi", "greekZeta", "greekalpha", "greekalphadasia", "greekalphadasiaperispomeni", "greekalphadasiatonos", "greekalphadasiavaria", "greekalphaiotasub", "greekalphaiotasubdasia", "greekalphaiotasubdasiaperispomeni", "greekalphaiotasubdasiatonos", "greekalphaiotasubdasiavaria", "greekalphaiotasubperispomeni", "greekalphaiotasubpsili", "greekalphaiotasubpsiliperispomeni", "greekalphaiotasubpsilitonos", "greekalphaiotasubpsilivaria", "greekalphaiotasubtonos", "greekalphaiotasubvaria", "greekalphamacron", "greekalphaoxia", "greekalphaperispomeni", "greekalphapsili", "greekalphapsiliperispomeni", "greekalphapsilitonos", "greekalphapsilivaria", "greekalphatonos", "greekalphavaria", "greekalphavrachy", "greekbeta", "greekchi", "greekdasia", "greekdasiaperispomeni", "greekdasiatonos", "greekdasiavaria", "greekdelta", "greekdialytikaperispomeni", "greekdialytikatonos", "greekdialytikavaria", "greekdigamma", "greekepsilon", "greekepsilonalt", "greekepsilondasia", "greekepsilondasiatonos", "greekepsilondasiavaria", "greekepsilonoxia", "greekepsilonpsili", "greekepsilonpsilitonos", "greekepsilonpsilivaria", "greekepsilontonos", "greekepsilonvaria", "greeketa", "greeketadasia", "greeketadasiaperispomeni", "greeketadasiatonos", "greeketadasiavaria", "greeketaiotasub", "greeketaiotasubdasia", "greeketaiotasubdasiaperispomeni", "greeketaiotasubdasiatonos", "greeketaiotasubdasiavaria", "greeketaiotasubperispomeni", "greeketaiotasubpsili", "greeketaiotasubpsiliperispomeni", "greeketaiotasubpsilitonos", "greeketaiotasubpsilivaria", "greeketaiotasubtonos", "greeketaiotasubvaria", "greeketaoxia", "greeketaperispomeni", "greeketapsili", "greeketapsiliperispomeni", "greeketapsilitonos", "greeketapsilivaria", "greeketatonos", "greeketavaria", "greekfinalsigma", "greekgamma", "greekiota", "greekiotadasia", "greekiotadasiaperispomeni", "greekiotadasiatonos", "greekiotadasiavaria", "greekiotadialytika", "greekiotadialytikaperispomeni", "greekiotadialytikatonos", "greekiotadialytikavaria", "greekiotamacron", "greekiotaoxia", "greekiotaperispomeni", "greekiotapsili", "greekiotapsiliperispomeni", "greekiotapsilitonos", "greekiotapsilivaria", "greekiotatonos", "greekiotavaria", "greekiotavrachy", "greekkappa", "greekkoppa", "greeklambda", "greekmu", "greeknu", "greeknumerals", "greeknumkoppa", "greekomega", "greekomegadasia", "greekomegadasiaperispomeni", "greekomegadasiatonos", "greekomegadasiavaria", "greekomegaiotasub", "greekomegaiotasubdasia", "greekomegaiotasubdasiaperispomeni", "greekomegaiotasubdasiatonos", "greekomegaiotasubdasiavaria", "greekomegaiotasubperispomeni", "greekomegaiotasubpsili", "greekomegaiotasubpsiliperispomeni", "greekomegaiotasubpsilitonos", "greekomegaiotasubpsilivaria", "greekomegaiotasubtonos", "greekomegaiotasubvaria", "greekomegaoxia", "greekomegaperispomeni", "greekomegapsili", "greekomegapsiliperispomeni", "greekomegapsilitonos", "greekomegapsilivaria", "greekomegatonos", "greekomegavaria", "greekomicron", "greekomicrondasia", "greekomicrondasiatonos", "greekomicrondasiavaria", "greekomicronoxia", "greekomicronpsili", "greekomicronpsilitonos", "greekomicronpsilivaria", "greekomicrontonos", "greekomicronvaria", "greekoxia", "greekperispomeni", "greekphi", "greekphialt", "greekpi", "greekpialt", "greekprosgegrammeni", "greekpsi", "greekpsili", "greekpsiliperispomeni", "greekpsilitonos", "greekpsilivaria", "greekrho", "greekrhoalt", "greekrhodasia", "greekrhopsili", "greeksampi", "greeksigma", "greeksigmalunate", "greekstigma", "greektau", "greektheta", "greekthetaalt", "greektonos", "greekupsilon", "greekupsilondasia", "greekupsilondasiaperispomeni", "greekupsilondasiatonos", "greekupsilondasiavaria", "greekupsilondiaeresis", "greekupsilondialytikaperispomeni", "greekupsilondialytikatonos", "greekupsilondialytikavaria", "greekupsilonmacron", "greekupsilonoxia", "greekupsilonperispomeni", "greekupsilonpsili", "greekupsilonpsiliperispomeni", "greekupsilonpsilitonos", "greekupsilonpsilivaria", "greekupsilontonos", "greekupsilonvaria", "greekupsilonvrachy", "greekvaria", "greekxi", "greekzeta", "grid", "groupedcommand", "gsetboxllx", "gsetboxlly", "gstroke", "gt", "gtrapprox", "gtrdot", "gtreqless", "gtreqqless", "gtrless", "gtrsim", "guilsingleleft", "guilsingleright", "gujaratinumerals", "gurmurkhinumerals", "hairline", "hairspace", "halflinestrut", "halfstrut", "halfwaybox", "handletokens", "handwritten", "hangul", "hanzi", "hash", "hat", "hbar", "hboxofvbox", "hboxreference", "hcaron", "hcircumflex", "hdofstring", "headhbox", "headlanguage", "headnumber", "headnumbercontent", "headnumberdistance", "headnumberwidth", "headreferenceattributes", "headsetupspacing", "headtext", "headtextcontent", "headtextdistance", "headtexts", "headtextwidth", "headvbox", "headwidth", "heartsuit", "hebrewAlef", "hebrewAyin", "hebrewBet", "hebrewDalet", "hebrewGimel", "hebrewHe", "hebrewHet", "hebrewKaf", "hebrewKaffinal", "hebrewLamed", "hebrewMem", "hebrewMemfinal", "hebrewNun", "hebrewNunfinal", "hebrewPe", "hebrewPefinal", "hebrewQof", "hebrewResh", "hebrewSamekh", "hebrewShin", "hebrewTav", "hebrewTet", "hebrewTsadi", "hebrewTsadifinal", "hebrewVav", "hebrewYod", "hebrewZayin", "heightanddepthofstring", "heightofstring", "heightspanningtext", "helptext", "hglue", "hiddenbar", "hiddencitation", "hiddencite", "hideblocks", "high", "highlight", "highordinalstr", "hilo", "himilo", "hl", "hookleftarrow", "hookrightarrow", "horizontalgrowingbar", "horizontalpositionbar", "hphantom", "hpos", "hsizefraction", "hslash", "hsmash", "hsmashbox", "hsmashed", "hspace", "hstroke", "htdpofstring", "htofstring", "hyphen", "hyphenatedcoloredword", "hyphenatedfile", "hyphenatedfilename", "hyphenatedhbox", "hyphenatedpar", "hyphenatedurl", "hyphenatedword", "iacute", "ibox", "ibreve", "icaron", "icircumflex", "ideographichalffillspace", "ideographicspace", "idiaeresis", "idotaccent", "idotbelow", "idoublegrave", "ifassignment", "iff", "ifinobject", "ifinoutputstream", "ifparameters", "iftrialtypesetting", "ignoreimplicitspaces", "ignorevalue", "igrave", "ihook", "iiiint", "iiiintop", "iiint", "iiintop", "iint", "iintop", "iinvertedbreve", "ijligature", "imacron", "imaginaryi", "imaginaryj", "imath", "immediatesavetwopassdata", "impliedby", "implies", "imply", "in", "includemenu", "includeversioninfo", "increment", "incrementcounter", "incrementedcounter", "incrementpagenumber", "incrementsubpagenumber", "incrementvalue", "indentation", "index", "infofont", "infofontbold", "inframed", "infty", "infull", "inheritparameter", "inhibitblank", "ininner", "ininneredge", "ininnermargin", "initializeboxstack", "inleft", "inleftedge", "inleftmargin", "inline", "inlinebuffer", "inlinedbox", "inlinemath", "inlinemathematics", "inlinemessage", "inlineordisplaymath", "inlineprettyprintbuffer", "inlinerange", "inmargin", "inmframed", "innerflushshapebox", "inother", "inouter", "inouteredge", "inoutermargin", "input", "inputfilebarename", "inputfilename", "inputfilerealsuffix", "inputfilesuffix", "inputgivenfile", "inright", "inrightedge", "inrightmargin", "insertpages", "installactionhandler", "installactivecharacter", "installanddefineactivecharacter", "installattributestack", "installautocommandhandler", "installautosetuphandler", "installbasicautosetuphandler", "installbasicparameterhandler", "installbottomframerenderer", "installcommandhandler", "installcorenamespace", "installdefinehandler", "installdefinitionset", "installdefinitionsetmember", "installdirectcommandhandler", "installdirectparameterhandler", "installdirectparametersethandler", "installdirectsetuphandler", "installdirectstyleandcolorhandler", "installframedautocommandhandler", "installframedcommandhandler", "installlanguage", "installleftframerenderer", "installnamespace", "installoutputroutine", "installpagearrangement", "installparameterhandler", "installparameterhashhandler", "installparametersethandler", "installparentinjector", "installrightframerenderer", "installrootparameterhandler", "installsetuphandler", "installsetuponlycommandhandler", "installshipoutmethod", "installsimplecommandhandler", "installsimpleframedcommandhandler", "installstyleandcolorhandler", "installswitchcommandhandler", "installswitchsetuphandler", "installtexdirective", "installtextracker", "installtopframerenderer", "installunitsseparator", "installunitsspace", "installversioninfo", "int", "intclockwise", "integerrounding", "integers", "interactionbar", "interactionbuttons", "interactionmenu", "intercal", "intertext", "intop", "invisibletimes", "invokepageheandler", "iogonek", "iota", "istltdir", "istrtdir", "italic", "italicbold", "italiccorrection", "italicface", "item", "items", "itemtag", "itilde", "jcaron", "jcircumflex", "jmath", "jobfilename", "jobfilesuffix", "kap", "kappa", "kcaron", "kcommaaccent", "keepblocks", "keeplinestogether", "keepunwantedspaces", "kerncharacters", "khook", "kkra", "koreancirclenumerals", "koreannumerals", "koreannumeralsc", "koreannumeralsp", "koreanparentnumerals", "lVert", "labellanguage", "labeltext", "labeltexts", "lacute", "lambda", "lambdabar", "land", "langle", "language", "languageCharacters", "languagecharacters", "languagecharwidth", "lastcounter", "lastcountervalue", "lastdigit", "lastlinewidth", "lastnaturalboxdp", "lastnaturalboxht", "lastnaturalboxwd", "lastpredefinedsymbol", "lastrealpage", "lastrealpagenumber", "lastsubcountervalue", "lastsubpage", "lastsubpagenumber", "lasttwodigits", "lastuserpage", "lastuserpagenumber", "lateluacode", "latin", "layeredtext", "layerheight", "layerwidth", "lazysavetaggedtwopassdata", "lazysavetwopassdata", "lbar", "lbox", "lbrace", "lbracket", "lcaron", "lceil", "lcommaaccent", "lcurl", "ldotmiddle", "ldotp", "ldots", "le", "leadsto", "left", "leftaligned", "leftarrow", "leftarrowtail", "leftarrowtriangle", "leftbottombox", "leftbox", "leftdasharrow", "leftguillemot", "leftharpoondown", "leftharpoonup", "lefthbox", "leftheadtext", "leftlabeltext", "leftleftarrows", "leftline", "leftmathlabeltext", "leftorrighthbox", "leftorrightvbox", "leftorrightvtop", "leftrightarrow", "leftrightarrows", "leftrightarrowtriangle", "leftrightharpoons", "leftrightsquigarrow", "leftskipadaption", "leftsquigarrow", "leftsubguillemot", "leftthreetimes", "lefttopbox", "lefttoright", "lefttorighthbox", "lefttorightvbox", "lefttorightvtop", "leftwavearrow", "leftwhitearrow", "leq", "leqq", "leqslant", "lessapprox", "lessdot", "lesseqgtr", "lesseqqgtr", "lessgtr", "lesssim", "letbeundefined", "letcatcodecommand", "letcscsname", "letcsnamecs", "letcsnamecsname", "letdummyparameter", "letempty", "letgvalue", "letgvalueempty", "letgvalurelax", "letterampersand", "letterat", "letterbackslash", "letterbar", "letterbgroup", "letterclosebrace", "lettercolon", "letterdollar", "letterdoublequote", "letteregroup", "letterescape", "letterexclamationmark", "letterhash", "letterhat", "letterleftbrace", "letterleftbracket", "letterleftparenthesis", "letterless", "lettermore", "letteropenbrace", "letterpercent", "letterquestionmark", "letterrightbrace", "letterrightbracket", "letterrightparenthesis", "lettersinglequote", "letterslash", "letterspacing", "lettertilde", "letterunderscore", "letvalue", "letvalueempty", "letvaluerelax", "lfence", "lfloor", "lgroup", "lhbox", "lhooknwarrow", "lhooksearrow", "limitatefirstline", "limitatelines", "limitatetext", "line", "linefeed", "linenote", "linespanningtext", "linethickness", "linterval", "listcitation", "listcite", "listlength", "listnamespaces", "ljligature", "ll", "llangle", "llap", "llbracket", "llcorner", "lll", "llless", "lmoustache", "lnapprox", "lneq", "lneqq", "lnot", "lnsim", "loadanyfile", "loadanyfileonce", "loadbtxdefinitionfile", "loadbtxreplacementfile", "loadcldfile", "loadcldfileonce", "loadfontgoodies", "loadluafile", "loadluafileonce", "loadspellchecklist", "loadtexfile", "loadtexfileonce", "loadtypescriptfile", "localframed", "localframedwithsettings", "localhsize", "localpopbox", "localpopmacro", "localpushbox", "localpushmacro", "localundefine", "locatedfilepath", "locatefilepath", "locfilename", "logo", "lohi", "lointerval", "lomihi", "longleftarrow", "longleftrightarrow", "longmapsfrom", "longmapsto", "longrightarrow", "longrightsquigarrow", "looparrowleft", "looparrowright", "lor", "low", "lowerbox", "lowercased", "lowercasestring", "lowerleftdoubleninequote", "lowerleftsingleninequote", "lowerrightdoubleninequote", "lowerrightsingleninequote", "lozenge", "lparent", "lrcorner", "lrointerval", "lrtbbox", "lstroke", "lt", "ltimes", "ltop", "luaTeX", "luacode", "luaconditional", "luaenvironment", "luaexpanded", "luaexpr", "luafunction", "luajitTeX", "luamajorversion", "luaminorversion", "luaparameterset", "luasetup", "luaversion", "lvert", "m", "mLeftarrow", "mLeftrightarrow", "mRightarrow", "mainlanguage", "makecharacteractive", "makerawcommalist", "makestrutofbox", "maltese", "mapfontsize", "mapsdown", "mapsfrom", "mapsto", "mapsup", "margindata", "margintext", "markcontent", "marking", "markinjector", "markpage", "mat", "math", "mathampersand", "mathbf", "mathbi", "mathblackboard", "mathbs", "mathdefault", "mathdollar", "mathdouble", "mathematics", "mathfraktur", "mathfunction", "mathhash", "mathhyphen", "mathit", "mathitalic", "mathlabellanguage", "mathlabeltext", "mathlabeltexts", "mathop", "mathover", "mathpercent", "mathrm", "mathscript", "mathsl", "mathss", "mathtext", "mathtextbf", "mathtextbi", "mathtextbs", "mathtextit", "mathtextsl", "mathtexttf", "mathtf", "mathtriplet", "mathtt", "mathunder", "mathupright", "mathword", "mathwordbf", "mathwordbi", "mathwordbs", "mathwordit", "mathwordsl", "mathwordtf", "maxaligned", "mbox", "mcframed", "measure", "measured", "measuredangle", "measuredeq", "medskip", "medspace", "menubutton", "mequal", "message", "metaTeX", "mfence", "mframed", "mfunction", "mfunctionlabeltext", "mhbox", "mho", "mhookleftarrow", "mhookrightarrow", "mid", "midaligned", "middle", "middlealigned", "middlebox", "midhbox", "midsubsentence", "minimalhbox", "minus", "minuscolon", "mirror", "mixedcaps", "mkvibuffer", "mleftarrow", "mleftharpoondown", "mleftharpoonup", "mleftrightarrow", "mleftrightharpoons", "mmapsto", "models", "moduleparameter", "molecule", "mono", "monobold", "mononormal", "month", "monthlong", "monthshort", "mp", "mprandomnumber", "mrel", "mrightarrow", "mrightharpoondown", "mrightharpoonup", "mrightleftharpoons", "mrightoverleftarrow", "mtext", "mtriplerel", "mtwoheadleftarrow", "mtwoheadrightarrow", "mu", "multimap", "nHdownarrow", "nHuparrow", "nLeftarrow", "nLeftrightarrow", "nRightarrow", "nVDash", "nVdash", "nVleftarrow", "nVleftrightarrow", "nVrightarrow", "nabla", "nacute", "namedheadnumber", "namedstructureheadlocation", "namedstructureuservariable", "namedstructurevariable", "namedtaggedlabeltexts", "napostrophe", "napprox", "napproxEq", "narrownobreakspace", "nasymp", "natural", "naturalhbox", "naturalhpack", "naturalnumbers", "naturalvbox", "naturalvcenter", "naturalvpack", "naturalvtop", "naturalwd", "ncaron", "ncommaaccent", "ncong", "ncurl", "ndivides", "ne", "nearrow", "neg", "negatecolorbox", "negated", "negativesign", "negthinspace", "neng", "neq", "nequiv", "neswarrow", "newattribute", "newcatcodetable", "newcounter", "newevery", "newfrenchspacing", "newmode", "newsignal", "newsystemmode", "nexists", "nextbox", "nextboxdp", "nextboxht", "nextboxhtdp", "nextboxwd", "nextcounter", "nextcountervalue", "nextdepth", "nextparagraphs", "nextrealpage", "nextrealpagenumber", "nextsubcountervalue", "nextsubpage", "nextsubpagenumber", "nextuserpage", "nextuserpagenumber", "ngeq", "ngrave", "ngtr", "ngtrless", "ngtrsim", "ni", "nihongo", "nin", "njligature", "nleftarrow", "nleftrightarrow", "nleq", "nless", "nlessgtr", "nlesssim", "nmid", "nni", "nobar", "nobreakspace", "nocap", "nocitation", "nocite", "nodetostring", "noffigurepages", "noflines", "noflocalfloats", "noheaderandfooterlines", "noheightstrut", "noindentation", "noitem", "nonfrenchspacing", "nonmathematics", "normal", "normalboldface", "normalframedwithsettings", "normalitalicface", "normalizebodyfontsize", "normalizedfontsize", "normalizefontdepth", "normalizefontheight", "normalizefontline", "normalizefontwidth", "normalizetextdepth", "normalizetextheight", "normalizetextline", "normalizetextwidth", "normalslantedface", "normaltypeface", "nospace", "not", "note", "notesymbol", "notin", "notopandbottomlines", "notragged", "nowns", "nparallel", "nprec", "npreccurlyeq", "nrightarrow", "nsim", "nsimeq", "nsqsubseteq", "nsqsupseteq", "nsubset", "nsubseteq", "nsucc", "nsucccurlyeq", "nsupset", "nsupseteq", "ntilde", "ntimes", "ntriangleleft", "ntrianglelefteq", "ntriangleright", "ntrianglerighteq", "nu", "numberofpoints", "numbers", "nvDash", "nvdash", "nvleftarrow", "nvleftrightarrow", "nvrightarrow", "nwarrow", "nwsearrow", "oacute", "obeydepth", "objectdepth", "objectheight", "objectmargin", "objectwidth", "obox", "obreve", "ocaron", "ocircumflex", "ocircumflexacute", "ocircumflexdotbelow", "ocircumflexgrave", "ocircumflexhook", "ocircumflextilde", "odiaeresis", "odiaeresismacron", "odot", "odotaccent", "odotaccentmacron", "odotbelow", "odoublegrave", "oeligature", "offset", "offsetbox", "ograve", "ohm", "ohook", "ohorn", "ohornacute", "ohorndotbelow", "ohorngrave", "ohornhook", "ohorntilde", "ohungarumlaut", "oiiint", "oiint", "oint", "ointclockwise", "ointctrclockwise", "oinvertedbreve", "omacron", "omega", "omicron", "ominus", "onedigitrounding", "oneeighth", "onefifth", "onehalf", "onequarter", "onesixth", "onesuperior", "onethird", "oogonek", "oogonekmacron", "operatorlanguage", "operatortext", "oplus", "ordfeminine", "ordinaldaynumber", "ordinalstr", "ordmasculine", "ornamenttext", "oslash", "ostroke", "ostrokeacute", "otilde", "otildemacron", "otimes", "outputfilename", "outputstreambox", "outputstreamcopy", "outputstreamunvbox", "outputstreamunvcopy", "over", "overbar", "overbars", "overbarunderbar", "overbrace", "overbraceunderbrace", "overbracket", "overbracketunderbracket", "overlaybutton", "overlaycolor", "overlaydepth", "overlayfigure", "overlayheight", "overlaylinecolor", "overlaylinewidth", "overlayoffset", "overlayrollbutton", "overlaywidth", "overleftarrow", "overloaderror", "overparent", "overparentunderparent", "overrightarrow", "overset", "overstrike", "overstrikes", "owns", "page", "pagearea", "pagebreak", "pagefigure", "pagegridspanwidth", "pageinjection", "pagenumber", "pagereference", "pagestaterealpage", "paletsize", "paragraphmark", "parallel", "part", "partial", "pdfTeX", "pdfactualtext", "pdfbackendactualtext", "pdfbackendcurrentresources", "pdfbackendsetcatalog", "pdfbackendsetcolorspace", "pdfbackendsetextgstate", "pdfbackendsetinfo", "pdfbackendsetname", "pdfbackendsetpageattribute", "pdfbackendsetpageresource", "pdfbackendsetpagesattribute", "pdfbackendsetpattern", "pdfbackendsetshade", "pdfcolor", "pdfeTeX", "percent", "percentdimen", "periodcentered", "periods", "permitcaretescape", "permitcircumflexescape", "permitspacesbetweengroups", "perp", "persiandecimals", "persiandecimalseparator", "persiannumerals", "persianthousandsseparator", "perthousand", "phantom", "phantombox", "phi", "phook", "pi", "pickupgroupedcommand", "pitchfork", "placeattachments", "placebookmarks", "placebtxrendering", "placechemical", "placecitation", "placecombinedlist", "placecomments", "placecontent", "placecurrentformulanumber", "placedbox", "placefigure", "placefloat", "placefloatwithsetups", "placefootnotes", "placeformula", "placeframed", "placegraphic", "placeheadnumber", "placeheadtext", "placehelp", "placeindex", "placeinitial", "placeintermezzo", "placelayer", "placelayeredtext", "placelegend", "placelist", "placelistofabbreviations", "placelistofchemicals", "placelistoffigures", "placelistofgraphics", "placelistofintermezzi", "placelistoflogos", "placelistofpublications", "placelistofsorts", "placelistofsynonyms", "placelistoftables", "placelocalfootnotes", "placelocalnotes", "placement", "placenamedfloat", "placenamedformula", "placenotes", "placeongrid", "placeontopofeachother", "placepagenumber", "placepairedbox", "placeparallel", "placerawlist", "placeregister", "placerenderingwindow", "placesidebyside", "placesubformula", "placetable", "pm", "popattribute", "popmacro", "popmode", "popsystemmode", "position", "positionoverlay", "positionregionoverlay", "positivesign", "postponenotes", "prec", "precapprox", "preccurlyeq", "preceq", "preceqq", "precnapprox", "precneq", "precneqq", "precnsim", "precsim", "predefinedfont", "predefinefont", "predefinesymbol", "prefixedpagenumber", "prefixlanguage", "prefixtext", "prependetoks", "prependgvalue", "prependtocommalist", "prependtoks", "prependtoksonce", "prependvalue", "presetbtxlabeltext", "presetdocument", "presetfieldsymbols", "presetheadtext", "presetlabeltext", "presetmathlabeltext", "presetoperatortext", "presetprefixtext", "presetsuffixtext", "presettaglabeltext", "presetunittext", "pretocommalist", "prettyprintbuffer", "prevcounter", "prevcountervalue", "preventmode", "prevrealpage", "prevrealpagenumber", "prevsubcountervalue", "prevsubpage", "prevsubpagenumber", "prevuserpage", "prevuserpagenumber", "prime", "primes", "procent", "processMPbuffer", "processMPfigurefile", "processaction", "processallactionsinset", "processassignlist", "processassignmentcommand", "processassignmentlist", "processbetween", "processblocks", "processbodyfontenvironmentlist", "processcolorcomponents", "processcommacommand", "processcommalist", "processcommalistwithparameters", "processcontent", "processfile", "processfilemany", "processfilenone", "processfileonce", "processfirstactioninset", "processisolatedchars", "processisolatedwords", "processlinetablebuffer", "processlinetablefile", "processlist", "processmonth", "processranges", "processseparatedlist", "processtexbuffer", "processtokens", "processuntil", "processxtablebuffer", "processyear", "prod", "product", "profiledbox", "profilegivenbox", "program", "project", "propto", "pseudoMixedCapped", "pseudoSmallCapped", "pseudoSmallcapped", "pseudosmallcapped", "psi", "punctuationspace", "purenumber", "pushattribute", "pushbutton", "pushmacro", "pushmode", "pushoutputstream", "pushsystemmode", "putboxincache", "putnextboxincache", "qquad", "quad", "quadrupleprime", "quads", "quarterstrut", "questiondown", "questionedeq", "quitcommalist", "quitprevcommalist", "quittypescriptscanning", "quotation", "quote", "quotedbl", "quotedblbase", "quotedblleft", "quotedblright", "quoteleft", "quoteright", "quotesingle", "quotesinglebase", "rVert", "racute", "raggedbottom", "raggedcenter", "raggedleft", "raggedright", "raggedwidecenter", "raisebox", "randomizetext", "randomnumber", "rangle", "rationals", "rawcounter", "rawcountervalue", "rawdate", "rawdoifelseinset", "rawdoifinset", "rawdoifinsetelse", "rawgetparameters", "rawprocessaction", "rawprocesscommacommand", "rawprocesscommalist", "rawstructurelistuservariable", "rawsubcountervalue", "rbox", "rbrace", "rbracket", "rcaron", "rceil", "rcommaaccent", "rdoublegrave", "readfile", "readfixfile", "readjobfile", "readlocfile", "readsetfile", "readsysfile", "readtexfile", "readxmlfile", "realSmallCapped", "realSmallcapped", "realpagenumber", "reals", "realsmallcapped", "recursedepth", "recurselevel", "recursestring", "redoconvertfont", "ref", "reference", "referenceprefix", "referring", "registerattachment", "registerctxluafile", "registered", "registerexternalfigure", "registerfontclass", "registerhyphenationexception", "registerhyphenationpattern", "registermenubuttons", "registersort", "registersynonym", "registerunit", "regular", "relatemarking", "relateparameterhandlers", "relaxvalueifundefined", "relbar", "remainingcharacters", "remark", "removebottomthings", "removedepth", "removefromcommalist", "removelastskip", "removelastspace", "removemarkedcontent", "removepunctuation", "removesubstring", "removetoks", "removeunwantedspaces", "replacefeature", "replaceincommalist", "replaceword", "rescan", "rescanwithsetup", "resetMPdrawing", "resetMPenvironment", "resetMPinstance", "resetallattributes", "resetandaddfeature", "resetbar", "resetboxesincache", "resetbreakpoints", "resetbuffer", "resetcharacteralign", "resetcharacterkerning", "resetcharacterspacing", "resetcharacterstripping", "resetcollector", "resetcounter", "resetdigitsmanipulation", "resetdirection", "resetfeature", "resetflag", "resetfontcolorsheme", "resetfontfallback", "resetfontsolution", "resethyphenationfeatures", "resetinjector", "resetinteractionmenu", "resetitaliccorrection", "resetlayer", "resetlocalfloats", "resetmarker", "resetmarking", "resetmode", "resetpagenumber", "resetparallel", "resetpath", "resetpenalties", "resetprofile", "resetrecurselevel", "resetreference", "resetreplacement", "resetscript", "resetsetups", "resetshownsynonyms", "resetsubpagenumber", "resetsymbolset", "resetsystemmode", "resettimer", "resettrackers", "resettrialtypesetting", "resetusedsortings", "resetusedsynonyms", "resetuserpagenumber", "resetvalue", "resetvisualizers", "reshapebox", "resolvedglyphdirect", "resolvedglyphstyled", "restartcounter", "restorebox", "restorecatcodes", "restorecounter", "restorecurrentattributes", "restoreendofline", "restoreglobalbodyfont", "restriction", "reusableMPgraphic", "reuseMPgraphic", "reuserandomseed", "reverseddoubleprime", "reversedprime", "reversedtripleprime", "revivefeature", "rfence", "rfloor", "rgroup", "rhbox", "rho", "rhooknearrow", "rhookswarrow", "right", "rightaligned", "rightangle", "rightarrow", "rightarrowbar", "rightarrowtail", "rightarrowtriangle", "rightbottombox", "rightbox", "rightdasharrow", "rightguillemot", "rightharpoondown", "rightharpoonup", "righthbox", "rightheadtext", "rightlabeltext", "rightleftarrows", "rightleftharpoons", "rightline", "rightmathlabeltext", "rightorleftpageaction", "rightrightarrows", "rightskipadaption", "rightsquigarrow", "rightsubguillemot", "rightthreearrows", "rightthreetimes", "righttoleft", "righttolefthbox", "righttoleftvbox", "righttoleftvtop", "righttopbox", "rightwavearrow", "rightwhitearrow", "ring", "rinterval", "rinvertedbreve", "risingdotseq", "rlap", "rlointerval", "rmoustache", "rneq", "robustaddtocommalist", "robustdoifelseinset", "robustdoifinsetelse", "robustpretocommalist", "rointerval", "rollbutton", "roman", "romanC", "romanD", "romanI", "romanII", "romanIII", "romanIV", "romanIX", "romanL", "romanM", "romanV", "romanVI", "romanVII", "romanVIII", "romanX", "romanXI", "romanXII", "romanc", "romand", "romani", "romanii", "romaniii", "romaniv", "romanix", "romanl", "romanm", "romannumerals", "romanv", "romanvi", "romanvii", "romanviii", "romanx", "romanxi", "romanxii", "rootradical", "rotate", "rparent", "rrangle", "rrbracket", "rrointerval", "rtimes", "rtop", "ruledhbox", "ruledhpack", "ruledmbox", "ruledtopv", "ruledtpack", "ruledvbox", "ruledvpack", "ruledvtop", "runMPbuffer", "runninghbox", "rvert", "sacute", "safechar", "samplefile", "sans", "sansbold", "sansnormal", "sansserif", "savebox", "savebtxdataset", "savebuffer", "savecounter", "savecurrentattributes", "savenormalmeaning", "savetaggedtwopassdata", "savetwopassdata", "sbox", "scale", "scaron", "scedilla", "schwa", "schwahook", "scircumflex", "scommaaccent", "screen", "searrow", "secondoffivearguments", "secondoffourarguments", "secondofsixarguments", "secondofthreearguments", "secondofthreeunexpanded", "secondoftwoarguments", "secondoftwounexpanded", "section", "sectionmark", "seeindex", "select", "selectblocks", "serializecommalist", "serializedcommalist", "serif", "serifbold", "serifnormal", "setJSpreamble", "setMPlayer", "setMPpositiongraphic", "setMPpositiongraphicrange", "setMPtext", "setMPvariable", "setMPvariables", "setbar", "setbigbodyfont", "setboxllx", "setboxlly", "setbreakpoints", "setcapstrut", "setcatcodetable", "setcharacteralign", "setcharactercasing", "setcharactercleaning", "setcharacterkerning", "setcharacterspacing", "setcharacterstripping", "setcharstrut", "setcollector", "setcolormodell", "setcounter", "setcounterown", "setcurrentfontclass", "setdataset", "setdefaultpenalties", "setdigitsmanipulation", "setdirection", "setdocumentargument", "setdocumentargumentdefault", "setdocumentfilename", "setdummyparameter", "setelementexporttag", "setemeasure", "setevalue", "setevariable", "setevariables", "setfirstline", "setflag", "setfont", "setfontcolorsheme", "setfontfeature", "setfontsolution", "setfontstrut", "setgmeasure", "setgvalue", "setgvariable", "setgvariables", "sethboxregister", "sethyphenatedurlafter", "sethyphenatedurlbefore", "sethyphenatedurlnormal", "sethyphenationfeatures", "setinitial", "setinjector", "setinteraction", "setinterfacecommand", "setinterfaceconstant", "setinterfaceelement", "setinterfacemessage", "setinterfacevariable", "setinternalrendering", "setitaliccorrection", "setlayer", "setlayerframed", "setlayertext", "setlinefiller", "setlocalhsize", "setmainbodyfont", "setmainparbuilder", "setmarker", "setmarking", "setmathstyle", "setmeasure", "setmessagetext", "setminus", "setmode", "setnostrut", "setnote", "setnotetext", "setobject", "setoldstyle", "setpagegrid", "setpagereference", "setpagestate", "setpagestaterealpageno", "setpenalties", "setpercentdimen", "setposition", "setpositionbox", "setpositiondata", "setpositiondataplus", "setpositiononly", "setpositionplus", "setpositionstrut", "setprofile", "setrandomseed", "setreference", "setreferencedobject", "setregisterentry", "setreplacement", "setrigidcolumnbalance", "setrigidcolumnhsize", "setscript", "setsectionblock", "setsimplecolumnhsize", "setsmallbodyfont", "setsmallcaps", "setstackbox", "setstructurepageregister", "setstrut", "setsuperiors", "setsystemmode", "settabular", "settaggedmetadata", "settextcontent", "settightobject", "settightreferencedobject", "settightunreferencedobject", "settrialtypesetting", "setuevalue", "setugvalue", "setunreferencedobject", "setup", "setupMPgraphics", "setupMPinstance", "setupMPpage", "setupMPvariables", "setupTABLE", "setupTEXpage", "setupalign", "setupalternativestyles", "setuparranging", "setupattachment", "setupattachments", "setupbackend", "setupbackground", "setupbackgrounds", "setupbar", "setupbars", "setupblackrules", "setupblank", "setupbleeding", "setupblock", "setupbodyfont", "setupbookmark", "setupbottom", "setupbottomtexts", "setupbtx", "setupbtxdataset", "setupbtxlabeltext", "setupbtxlist", "setupbtxregister", "setupbtxrendering", "setupbuffer", "setupbutton", "setupcapitals", "setupcaption", "setupcaptions", "setupcharacterkerning", "setupcharacterspacing", "setupchemical", "setupchemicalframed", "setupclipping", "setupcollector", "setupcolor", "setupcolors", "setupcolumns", "setupcolumnspan", "setupcombination", "setupcombinedlist", "setupcomment", "setupcontent", "setupcounter", "setupdataset", "setupdelimitedtext", "setupdescription", "setupdirections", "setupdocument", "setupeffect", "setupenumeration", "setupenumerations", "setupenv", "setupexport", "setupexternalfigure", "setupexternalsoundtracks", "setupfield", "setupfieldbody", "setupfieldcategory", "setupfieldcontentframed", "setupfieldlabelframed", "setupfields", "setupfieldtotalframed", "setupfiller", "setupfillinlines", "setupfillinrules", "setupfirstline", "setupfittingpage", "setupfloat", "setupfloatcaption", "setupfloats", "setupfloatsplitting", "setupfontexpansion", "setupfontprotrusion", "setupfonts", "setupfontsolution", "setupfooter", "setupfootertexts", "setupforms", "setupformula", "setupformulae", "setupformulaframed", "setupframed", "setupframedcontent", "setupframedtable", "setupframedtablecolumn", "setupframedtablerow", "setupframedtext", "setupframedtexts", "setupglobalreferenceprefix", "setuphead", "setupheadalternative", "setupheader", "setupheadertexts", "setupheadnumber", "setupheads", "setupheadtext", "setuphelp", "setuphigh", "setuphighlight", "setuphyphenation", "setuphyphenmark", "setupindentedtext", "setupindenting", "setupindex", "setupinitial", "setupinsertion", "setupinteraction", "setupinteractionbar", "setupinteractionmenu", "setupinteractionscreen", "setupinterlinespace", "setupitaliccorrection", "setupitemgroup", "setupitemizations", "setupitemize", "setupitems", "setuplabel", "setuplabeltext", "setuplanguage", "setuplayer", "setuplayeredtext", "setuplayout", "setuplayouttext", "setuplegend", "setuplinefiller", "setuplinefillers", "setuplinenote", "setuplinenumbering", "setuplines", "setuplinetable", "setuplinewidth", "setuplist", "setuplistalternative", "setuplistextra", "setuplocalfloats", "setuplocalinterlinespace", "setuplow", "setuplowhigh", "setuplowmidhigh", "setupmakeup", "setupmarginblock", "setupmargindata", "setupmarginframed", "setupmarginrule", "setupmarginrules", "setupmarking", "setupmathalignment", "setupmathcases", "setupmathematics", "setupmathfence", "setupmathfraction", "setupmathfractions", "setupmathframed", "setupmathlabeltext", "setupmathmatrix", "setupmathornament", "setupmathradical", "setupmathstackers", "setupmathstyle", "setupmixedcolumns", "setupmodule", "setupnarrower", "setupnotation", "setupnotations", "setupnote", "setupnotes", "setupoffset", "setupoffsetbox", "setupoperatortext", "setupoppositeplacing", "setupoutputroutine", "setuppagechecker", "setuppagecomment", "setuppagegrid", "setuppagegridarea", "setuppagegridareatext", "setuppagegridlines", "setuppagegridspan", "setuppagegridstart", "setuppageinjection", "setuppageinjectionalternative", "setuppagenumber", "setuppagenumbering", "setuppageshift", "setuppagestate", "setuppagetransitions", "setuppairedbox", "setuppalet", "setuppaper", "setuppapersize", "setupparagraph", "setupparagraphintro", "setupparagraphnumbering", "setupparagraphs", "setupparallel", "setupperiods", "setupplacement", "setuppositionbar", "setuppositioning", "setupprefixtext", "setupprocessor", "setupprofile", "setupprograms", "setupquotation", "setupquote", "setuprealpagenumber", "setupreferenceformat", "setupreferenceprefix", "setupreferencestructureprefix", "setupreferencing", "setupregister", "setupregisters", "setuprenderingwindow", "setuprotate", "setups", "setupscale", "setupscript", "setupscripts", "setupsectionblock", "setupselector", "setupshift", "setupsidebar", "setupsorting", "setupspacing", "setupspellchecking", "setupstartstop", "setupstretched", "setupstruts", "setupstyle", "setupsubformula", "setupsubformulas", "setupsubpagenumber", "setupsuffixtext", "setupsymbolset", "setupsynctex", "setupsynonyms", "setuptables", "setuptabulate", "setuptabulation", "setuptagging", "setuptaglabeltext", "setuptext", "setuptextbackground", "setuptextflow", "setuptextrules", "setuptexttexts", "setupthinrules", "setuptolerance", "setuptooltip", "setuptop", "setuptoptexts", "setuptype", "setuptyping", "setupunit", "setupunittext", "setupurl", "setupuserpagenumber", "setupversion", "setupviewerlayer", "setupvspacing", "setupwhitespace", "setupwithargument", "setupwithargumentswapped", "setupxml", "setupxtable", "setuvalue", "setuxvalue", "setvalue", "setvariable", "setvariables", "setvboxregister", "setvisualizerfont", "setvtopregister", "setwidthof", "setxmeasure", "setxvalue", "setxvariable", "setxvariables", "seveneighths", "sfrac", "shapedhbox", "sharp", "shiftdown", "shiftup", "showallmakeup", "showattributes", "showbodyfont", "showbodyfontenvironment", "showboxes", "showbtxdatasetauthors", "showbtxdatasetcompleteness", "showbtxdatasetfields", "showbtxfields", "showbtxhashedauthors", "showbtxtables", "showchardata", "showcharratio", "showcolor", "showcolorbar", "showcolorcomponents", "showcolorgroup", "showcolorset", "showcolorstruts", "showcounter", "showdirectives", "showdirsinmargin", "showedebuginfo", "showexperiments", "showfont", "showfontdata", "showfontitalics", "showfontkerns", "showfontparameters", "showfontstrip", "showfontstyle", "showframe", "showglyphs", "showgrid", "showgridsnapping", "showhelp", "showhyphenationtrace", "showhyphens", "showinjector", "showjustification", "showkerning", "showlayout", "showlayoutcomponents", "showligature", "showligatures", "showlogcategories", "showmakeup", "showmargins", "showmessage", "showminimalbaseline", "shownextbox", "showotfcomposition", "showpalet", "showparentchain", "showprint", "showsetups", "showsetupsdefinition", "showstruts", "showsymbolset", "showtimer", "showtokens", "showtrackers", "showvalue", "showvariable", "showwarning", "sigma", "sim", "simeq", "simplealignedbox", "simplealignedboxplus", "simplealignedspreadbox", "simplegroupedcommand", "simplereversealignedbox", "simplereversealignedboxplus", "singalcharacteralign", "singlebond", "singleverticalbar", "sixperemspace", "sixthofsixarguments", "slanted", "slantedbold", "slantedface", "slash", "slicepages", "slong", "slovenianNumerals", "sloveniannumerals", "small", "smallbodyfont", "smallbold", "smallbolditalic", "smallboldslanted", "smallcappedcharacters", "smallcappedromannumerals", "smaller", "smallitalicbold", "smallnormal", "smallskip", "smallslanted", "smallslantedbold", "smalltype", "smash", "smashbox", "smashboxed", "smashedhbox", "smashedvbox", "smile", "snaptogrid", "softhyphen", "solidus", "someheadnumber", "somekindoftab", "someline", "somelocalfloat", "somenamedheadnumber", "someplace", "somewhere", "space", "spadesuit", "spanishNumerals", "spanishnumerals", "speech", "sphericalangle", "splitatasterisk", "splitatcolon", "splitatcolons", "splitatcomma", "splitatperiod", "splitdfrac", "splitfilename", "splitfloat", "splitfrac", "splitoffbase", "splitofffull", "splitoffkind", "splitoffname", "splitoffpath", "splitoffroot", "splitofftokens", "splitofftype", "splitstring", "spreadhbox", "sqcap", "sqcup", "sqrt", "sqsubset", "sqsubseteq", "sqsubsetneq", "sqsupset", "sqsupseteq", "sqsupsetneq", "square", "squaredots", "ssharp", "stackrel", "star", "stareq", "startJScode", "startJSpreamble", "startLUA", "startMP", "startMPclip", "startMPcode", "startMPdefinitions", "startMPdrawing", "startMPenvironment", "startMPextensions", "startMPinclusions", "startMPinitializations", "startMPpage", "startMPpositiongraphic", "startMPpositionmethod", "startMPrun", "startPARSEDXML", "startTABLE", "startTABLEbody", "startTABLEfoot", "startTABLEhead", "startTABLEnext", "startTC", "startTD", "startTDs", "startTEX", "startTEXpage", "startTH", "startTN", "startTR", "startTRs", "startTX", "startTY", "startXML", "startalign", "startalignment", "startallmodes", "startappendices", "startarrangedpages", "startaside", "startattachment", "startbackground", "startbackmatter", "startbar", "startbbordermatrix", "startbitmapimage", "startblockquote", "startbodymatter", "startbordermatrix", "startboxedcolumns", "startbtxlabeltext", "startbtxrenderingdefinitions", "startbuffer", "startcases", "startcatcodetable", "startcenteraligned", "startchapter", "startcharacteralign", "startcheckedfences", "startchemical", "startchemicaltext", "startcollect", "startcollecting", "startcolor", "startcolorintent", "startcoloronly", "startcolorset", "startcolumns", "startcolumnspan", "startcombination", "startcomment", "startcomponent", "startcontextcode", "startcontextdefinitioncode", "startctxfunction", "startctxfunctiondefinition", "startcurrentcolor", "startcurrentlistentrywrapper", "startdelimited", "startdelimitedtext", "startdisplaymath", "startdmath", "startdocument", "starteffect", "startelement", "startembeddedxtable", "startendnote", "startendofline", "startenvironment", "startexceptions", "startexpanded", "startexpandedcollect", "startextendedcatcodetable", "startexternalfigurecollection", "startfact", "startfigure", "startfiguretext", "startfittingpage", "startfixed", "startfloatcombination", "startfont", "startfontclass", "startfontsolution", "startfootnote", "startformula", "startformulas", "startframed", "startframedcell", "startframedcontent", "startframedrow", "startframedtable", "startframedtext", "startfrontmatter", "startgoto", "startgraphictext", "startgridsnapping", "starthanging", "starthbox", "starthboxestohbox", "starthboxregister", "starthead", "startheadtext", "starthelptext", "starthiding", "starthighlight", "starthyphenation", "startimath", "startindentation", "startindentedtext", "startinteraction", "startinteractionmenu", "startinterface", "startintermezzotext", "startintertext", "startitem", "startitemgroup", "startitemgroupcolumns", "startitemize", "startknockout", "startlabeltext", "startlayout", "startleftaligned", "startlegend", "startline", "startlinealignment", "startlinecorrection", "startlinefiller", "startlinenote", "startlinenumbering", "startlines", "startlinetable", "startlinetablebody", "startlinetablecell", "startlinetablehead", "startlocalfootnotes", "startlocalheadsetup", "startlocallinecorrection", "startlocalnotes", "startlocalsetups", "startlua", "startluacode", "startluaparameterset", "startluasetups", "startmakeup", "startmarginblock", "startmarginrule", "startmarkedcontent", "startmathalignment", "startmathcases", "startmathlabeltext", "startmathmatrix", "startmathmode", "startmathstyle", "startmatrices", "startmatrix", "startmaxaligned", "startmdformula", "startmidaligned", "startmiddlealigned", "startmiddlemakeup", "startmixedcolumns", "startmode", "startmodeset", "startmodule", "startmoduletestsection", "startmpformula", "startnamedsection", "startnamedsubformulas", "startnarrow", "startnarrower", "startnegative", "startnicelyfilledbox", "startnointerference", "startnotallmodes", "startnotext", "startnotmode", "startoperatortext", "startopposite", "startoutputstream", "startoverlay", "startoverprint", "startpacked", "startpagecomment", "startpagefigure", "startpagegrid", "startpagegridspan", "startpagelayout", "startpagemakeup", "startpar", "startparagraph", "startparagraphs", "startparagraphscell", "startparbuilder", "startpart", "startpath", "startplacechemical", "startplacefigure", "startplacefloat", "startplaceformula", "startplacegraphic", "startplaceintermezzo", "startplacelegend", "startplacepairedbox", "startplacetable", "startpositioning", "startpositionoverlay", "startpositive", "startpostponing", "startprefixtext", "startprocessassignmentcommand", "startprocessassignmentlist", "startprocesscommacommand", "startprocesscommalist", "startproduct", "startproject", "startprotect", "startprotectedcolors", "startpublication", "startpunctuation", "startquotation", "startquote", "startrandomized", "startrandomseed", "startrawsetups", "startreadingfile", "startreferenceprefix", "startregime", "startregister", "startreusableMPgraphic", "startrightaligned", "startscript", "startsdformula", "startsection", "startsectionblock", "startsectionblockenvironment", "startsectionlevel", "startsetups", "startshapebox", "startshift", "startsidebar", "startsimplecolumns", "startspecialitem", "startspeech", "startspformula", "startsplitformula", "startspread", "startstandardmakeup", "startstartstop", "startstaticMPfigure", "startstaticMPgraphic", "startstrictinspectnextcharacter", "startstructurepageregister", "startstrut", "startstyle", "startsubformulas", "startsubject", "startsubjectlevel", "startsubsection", "startsubsentence", "startsubstack", "startsubsubject", "startsubsubsection", "startsubsubsubject", "startsubsubsubsection", "startsubsubsubsubject", "startsubsubsubsubsection", "startsubsubsubsubsubject", "startsuffixtext", "startsymbolset", "starttable", "starttablehead", "starttables", "starttabletail", "starttabletext", "starttabulate", "starttabulatehead", "starttabulatetail", "starttagged", "starttaglabeltext", "starttexcode", "starttexdefinition", "starttext", "starttextbackground", "starttextbackgroundmanual", "starttextcolor", "starttextcolorintent", "starttextflow", "starttextmakeup", "starttextrule", "starttitle", "starttokens", "starttransparent", "starttypescript", "starttypescriptcollection", "starttyping", "startuniqueMPgraphic", "startuniqueMPpagegraphic", "startunittext", "startunpacked", "startusableMPgraphic", "startuseMPgraphic", "startusemathstyleparameter", "startusingbtxspecification", "startvbox", "startvboxregister", "startvboxtohbox", "startvboxtohboxseparator", "startviewerlayer", "startvtop", "startvtopregister", "startxcell", "startxcellgroup", "startxgroup", "startxmldisplayverbatim", "startxmlinlineverbatim", "startxmlraw", "startxmlsetups", "startxrow", "startxrowgroup", "startxtable", "startxtablebody", "startxtablefoot", "startxtablehead", "startxtablenext", "stligature", "stopJScode", "stopJSpreamble", "stopLUA", "stopMP", "stopMPclip", "stopMPcode", "stopMPdefinitions", "stopMPdrawing", "stopMPenvironment", "stopMPextensions", "stopMPinclusions", "stopMPinitializations", "stopMPpage", "stopMPpositiongraphic", "stopMPpositionmethod", "stopMPrun", "stopPARSEDXML", "stopTABLE", "stopTABLEbody", "stopTABLEfoot", "stopTABLEhead", "stopTABLEnext", "stopTC", "stopTD", "stopTDs", "stopTEX", "stopTEXpage", "stopTH", "stopTN", "stopTR", "stopTRs", "stopTX", "stopTY", "stopXML", "stopalign", "stopalignment", "stopallmodes", "stopappendices", "stoparrangedpages", "stopaside", "stopattachment", "stopbackground", "stopbackmatter", "stopbar", "stopbbordermatrix", "stopbitmapimage", "stopblockquote", "stopbodymatter", "stopbordermatrix", "stopboxedcolumns", "stopbtxlabeltext", "stopbtxrenderingdefinitions", "stopbuffer", "stopcases", "stopcatcodetable", "stopcenteraligned", "stopchapter", "stopcharacteralign", "stopcheckedfences", "stopchemical", "stopchemicaltext", "stopcollect", "stopcollecting", "stopcolor", "stopcolorintent", "stopcoloronly", "stopcolorset", "stopcolumns", "stopcolumnspan", "stopcombination", "stopcomment", "stopcomponent", "stopcontextcode", "stopcontextdefinitioncode", "stopctxfunction", "stopctxfunctiondefinition", "stopcurrentcolor", "stopcurrentlistentrywrapper", "stopdelimited", "stopdelimitedtext", "stopdisplaymath", "stopdmath", "stopdocument", "stopeffect", "stopelement", "stopembeddedxtable", "stopendnote", "stopendofline", "stopenvironment", "stopexceptions", "stopexpanded", "stopexpandedcollect", "stopextendedcatcodetable", "stopexternalfigurecollection", "stopfact", "stopfigure", "stopfiguretext", "stopfittingpage", "stopfixed", "stopfloatcombination", "stopfont", "stopfontclass", "stopfontsolution", "stopfootnote", "stopformula", "stopformulas", "stopframed", "stopframedcell", "stopframedcontent", "stopframedrow", "stopframedtable", "stopframedtext", "stopfrontmatter", "stopgoto", "stopgraphictext", "stopgridsnapping", "stophanging", "stophbox", "stophboxestohbox", "stophboxregister", "stophead", "stopheadtext", "stophelptext", "stophiding", "stophighlight", "stophyphenation", "stopimath", "stopindentation", "stopindentedtext", "stopinteraction", "stopinteractionmenu", "stopinterface", "stopintermezzotext", "stopintertext", "stopitem", "stopitemgroup", "stopitemgroupcolumns", "stopitemize", "stopknockout", "stoplabeltext", "stoplayout", "stopleftaligned", "stoplegend", "stopline", "stoplinealignment", "stoplinecorrection", "stoplinefiller", "stoplinenote", "stoplinenumbering", "stoplines", "stoplinetable", "stoplinetablebody", "stoplinetablecell", "stoplinetablehead", "stoplocalfootnotes", "stoplocalheadsetup", "stoplocallinecorrection", "stoplocalnotes", "stoplocalsetups", "stoplua", "stopluacode", "stopluaparameterset", "stopluasetups", "stopmakeup", "stopmarginblock", "stopmarginrule", "stopmarkedcontent", "stopmathalignment", "stopmathcases", "stopmathlabeltext", "stopmathmatrix", "stopmathmode", "stopmathstyle", "stopmatrices", "stopmatrix", "stopmaxaligned", "stopmdformula", "stopmidaligned", "stopmiddlealigned", "stopmiddlemakeup", "stopmixedcolumns", "stopmode", "stopmodeset", "stopmodule", "stopmoduletestsection", "stopmpformula", "stopnamedsection", "stopnamedsubformulas", "stopnarrow", "stopnarrower", "stopnegative", "stopnicelyfilledbox", "stopnointerference", "stopnotallmodes", "stopnotext", "stopnotmode", "stopoperatortext", "stopopposite", "stopoutputstream", "stopoverlay", "stopoverprint", "stoppacked", "stoppagecomment", "stoppagefigure", "stoppagegrid", "stoppagegridspan", "stoppagelayout", "stoppagemakeup", "stoppar", "stopparagraph", "stopparagraphs", "stopparagraphscell", "stopparbuilder", "stoppart", "stoppath", "stopplacechemical", "stopplacefigure", "stopplacefloat", "stopplaceformula", "stopplacegraphic", "stopplaceintermezzo", "stopplacelegend", "stopplacepairedbox", "stopplacetable", "stoppositioning", "stoppositionoverlay", "stoppositive", "stoppostponing", "stopprefixtext", "stopprocessassignmentcommand", "stopprocessassignmentlist", "stopprocesscommacommand", "stopprocesscommalist", "stopproduct", "stopproject", "stopprotect", "stopprotectedcolors", "stoppublication", "stoppunctuation", "stopquotation", "stopquote", "stoprandomized", "stoprandomseed", "stoprawsetups", "stopreadingfile", "stopreferenceprefix", "stopregime", "stopregister", "stopreusableMPgraphic", "stoprightaligned", "stopscript", "stopsdformula", "stopsection", "stopsectionblock", "stopsectionblockenvironment", "stopsectionlevel", "stopsetups", "stopshapebox", "stopshift", "stopsidebar", "stopsimplecolumns", "stopspecialitem", "stopspeech", "stopspformula", "stopsplitformula", "stopspread", "stopstandardmakeup", "stopstartstop", "stopstaticMPfigure", "stopstaticMPgraphic", "stopstrictinspectnextcharacter", "stopstructurepageregister", "stopstrut", "stopstyle", "stopsubformulas", "stopsubject", "stopsubjectlevel", "stopsubsection", "stopsubsentence", "stopsubstack", "stopsubsubject", "stopsubsubsection", "stopsubsubsubject", "stopsubsubsubsection", "stopsubsubsubsubject", "stopsubsubsubsubsection", "stopsubsubsubsubsubject", "stopsuffixtext", "stopsymbolset", "stoptable", "stoptablehead", "stoptables", "stoptabletail", "stoptabletext", "stoptabulate", "stoptabulatehead", "stoptabulatetail", "stoptagged", "stoptaglabeltext", "stoptexcode", "stoptexdefinition", "stoptext", "stoptextbackground", "stoptextbackgroundmanual", "stoptextcolor", "stoptextcolorintent", "stoptextflow", "stoptextmakeup", "stoptextrule", "stoptitle", "stoptokens", "stoptransparent", "stoptypescript", "stoptypescriptcollection", "stoptyping", "stopuniqueMPgraphic", "stopuniqueMPpagegraphic", "stopunittext", "stopunpacked", "stopusableMPgraphic", "stopuseMPgraphic", "stopusemathstyleparameter", "stopusingbtxspecification", "stopvbox", "stopvboxregister", "stopvboxtohbox", "stopvboxtohboxseparator", "stopviewerlayer", "stopvtop", "stopvtopregister", "stopxcell", "stopxcellgroup", "stopxgroup", "stopxmldisplayverbatim", "stopxmlinlineverbatim", "stopxmlraw", "stopxmlsetups", "stopxrow", "stopxrowgroup", "stopxtable", "stopxtablebody", "stopxtablefoot", "stopxtablehead", "stopxtablenext", "stretched", "strictdoifelsenextoptional", "strictdoifnextoptionalelse", "stripcharacter", "strippedcsname", "stripspaces", "structurelistuservariable", "structurenumber", "structuretitle", "structureuservariable", "structurevariable", "strut", "strutdp", "strutgap", "strutht", "struthtdp", "struttedbox", "strutwd", "style", "styleinstance", "subject", "subpagenumber", "subsection", "subsentence", "subset", "subseteq", "subseteqq", "subsetneq", "subsetneqq", "substituteincommalist", "subsubject", "subsubsection", "subsubsubject", "subsubsubsection", "subsubsubsubject", "subsubsubsubsection", "subsubsubsubsubject", "subtractfeature", "succ", "succapprox", "succcurlyeq", "succeq", "succeqq", "succnapprox", "succneq", "succneqq", "succnsim", "succsim", "suffixlanguage", "suffixtext", "sum", "supset", "supseteq", "supseteqq", "supsetneq", "supsetneqq", "surd", "surdradical", "swapcounts", "swapdimens", "swapface", "swapmacros", "swaptypeface", "swarrow", "switchstyleonly", "switchtobodyfont", "switchtocolor", "switchtointerlinespace", "symbol", "symbolreference", "synchronizeblank", "synchronizeindenting", "synchronizemarking", "synchronizeoutputstreams", "synchronizestrut", "synchronizewhitespace", "synctexblockfilename", "synctexresetfilename", "synctexsetfilename", "systemlog", "systemlogfirst", "systemloglast", "systemsetups", "tLeftarrow", "tLeftrightarrow", "tRightarrow", "tabulateautoline", "tabulateautorule", "tabulateline", "tabulaterule", "taggedctxcommand", "taggedlabeltexts", "taglabellanguage", "taglabeltext", "tau", "tbinom", "tbox", "tcaron", "tcedilla", "tcommaaccent", "tcurl", "tequal", "test", "testandsplitstring", "testcolumn", "testfeature", "testfeatureonce", "testpage", "testpageonly", "testpagesync", "testtokens", "tex", "texdefinition", "texsetup", "textAngstrom", "textacute", "textampersand", "textasciicircum", "textasciitilde", "textat", "textbackslash", "textbar", "textbottomcomma", "textbottomdot", "textbraceleft", "textbraceright", "textbreve", "textbrokenbar", "textbullet", "textcaron", "textcedilla", "textcelsius", "textcent", "textcircledP", "textcircumflex", "textcitation", "textcite", "textcomma", "textcontrolspace", "textcurrency", "textdag", "textddag", "textdegree", "textdiaeresis", "textdiv", "textdollar", "textdong", "textdotaccent", "textellipsis", "texteuro", "textflowcollector", "textfraction", "textgrave", "texthash", "texthorizontalbar", "texthungarumlaut", "texthyphen", "textkelvin", "textlognot", "textmacron", "textmath", "textmho", "textminus", "textmu", "textmultiply", "textnumero", "textogonek", "textohm", "textormathchar", "textounce", "textpercent", "textperiod", "textplus", "textpm", "textreference", "textring", "textrule", "textslash", "textsterling", "texttilde", "textunderscore", "textvisiblespace", "textyen", "thai", "thainumerals", "thefirstcharacter", "thenormalizedbodyfontsize", "therefore", "theremainingcharacters", "theta", "thickspace", "thinrule", "thinrules", "thinspace", "thirdoffivearguments", "thirdoffourarguments", "thirdofsixarguments", "thirdofthreearguments", "thirdofthreeunexpanded", "thook", "thookleftarrow", "thookrightarrow", "thorn", "threedigitrounding", "threeeighths", "threefifths", "threeperemspace", "threequarter", "threesuperior", "tibetannumerals", "tightlayer", "tilde", "times", "tinyfont", "title", "tlap", "tleftarrow", "tleftharpoondown", "tleftharpoonup", "tleftrightarrow", "tleftrightharpoons", "tmapsto", "to", "tochar", "tolinenote", "tooltip", "top", "topbox", "topleftbox", "toplinebox", "toprightbox", "topskippedbox", "tracecatcodetables", "tracedfontname", "traceoutputroutines", "tracepositions", "trademark", "translate", "transparencycomponents", "transparent", "trel", "triangle", "triangledown", "triangleleft", "triangleq", "triangleright", "trightarrow", "trightharpoondown", "trightharpoonup", "trightleftharpoons", "trightoverleftarrow", "triplebond", "tripleprime", "tripleverticalbar", "truefilename", "truefontname", "tstroke", "ttraggedright", "ttriplerel", "ttwoheadleftarrow", "ttwoheadrightarrow", "turnediota", "twodigitrounding", "twofifths", "twoheaddownarrow", "twoheadleftarrow", "twoheadrightarrow", "twoheadrightarrowtail", "twoheaduparrow", "twosuperior", "twothirds", "tx", "txx", "typ", "type", "typebuffer", "typedefinedbuffer", "typeface", "typefile", "typeinlinebuffer", "typescriptone", "typescriptprefix", "typescriptthree", "typescripttwo", "typesetbuffer", "typesetfile", "uacute", "ubreve", "ucaron", "ucircumflex", "uconvertnumber", "udiaeresis", "udiaeresisacute", "udiaeresiscaron", "udiaeresisgrave", "udiaeresismacron", "udotbelow", "udots", "udoublegrave", "uedcatcodecommand", "ugrave", "uhook", "uhorn", "uhornacute", "uhorndotbelow", "uhorngrave", "uhornhook", "uhorntilde", "uhungarumlaut", "uinvertedbreve", "ulcorner", "umacron", "undefinevalue", "undepthed", "underbar", "underbars", "underbrace", "underbracket", "underdash", "underdashes", "underdot", "underdots", "underleftarrow", "underparent", "underrandom", "underrandoms", "underrightarrow", "underset", "understrike", "understrikes", "undoassign", "unexpandeddocumentvariable", "unframed", "unhhbox", "unihex", "uniqueMPgraphic", "uniqueMPpagegraphic", "unit", "unitlanguage", "unitshigh", "unitslow", "unittext", "unknown", "unprotected", "unregisterhyphenationpattern", "unspaceafter", "unspaceargument", "unspaced", "unspacestring", "untexargument", "untexcommand", "uogonek", "upand", "uparrow", "updasharrow", "updownarrow", "updownarrowbar", "updownarrows", "upharpoonleft", "upharpoonright", "uplus", "uppercased", "uppercasestring", "upperleftdoubleninequote", "upperleftdoublesixquote", "upperleftsingleninequote", "upperleftsinglesixquote", "upperrightdoubleninequote", "upperrightdoublesixquote", "upperrightsingleninequote", "upperrightsinglesixquote", "upsilon", "upuparrows", "upwhitearrow", "urcorner", "uring", "url", "useJSscripts", "useMPenvironmentbuffer", "useMPgraphic", "useMPlibrary", "useMPrun", "useMPvariables", "useURL", "usealignparameter", "useblankparameter", "useblocks", "usebodyfont", "usebodyfontparameter", "usebtxdataset", "usebtxdefinitions", "usecitation", "usecolors", "usecomponent", "usedirectory", "usedummycolorparameter", "usedummystyleandcolor", "usedummystyleparameter", "useenvironment", "useexternaldocument", "useexternalfigure", "useexternalrendering", "useexternalsoundtrack", "usefigurebase", "usefile", "usegridparameter", "useindentingparameter", "useindentnextparameter", "useinterlinespaceparameter", "uselanguageparameter", "useluamodule", "usemathstyleparameter", "usemodule", "useproduct", "useprofileparameter", "useproject", "usereferenceparameter", "userpagenumber", "usesetupsparameter", "usestaticMPfigure", "usesubpath", "usesymbols", "usetexmodule", "usetypescript", "usetypescriptfile", "useurl", "usezipfile", "utfchar", "utflower", "utfupper", "utilde", "utilityregisterlength", "vDash", "varTheta", "varepsilon", "varkappa", "varnothing", "varphi", "varpi", "varrho", "varsigma", "vartheta", "vboxreference", "vdash", "vdots", "vec", "vee", "veebar", "veeeq", "verbatim", "verbatimstring", "verbosenumber", "version", "vert", "verticalgrowingbar", "verticalpositionbar", "veryraggedcenter", "veryraggedleft", "veryraggedright", "vglue", "viewerlayer", "vl", "vphantom", "vpos", "vsmash", "vsmashbox", "vsmashed", "vspace", "vspacing", "wcircumflex", "wdofstring", "wedge", "wedgeeq", "weekday", "whitearrowupfrombar", "widehat", "widetilde", "widthofstring", "widthspanningtext", "withoutpt", "word", "wordright", "words", "wordtonumber", "wp", "wr", "writebetweenlist", "writedatatolist", "writestatus", "writetolist", "xLeftarrow", "xLeftrightarrow", "xRightarrow", "xdefconvertedargument", "xequal", "xfrac", "xhookleftarrow", "xhookrightarrow", "xi", "xleftarrow", "xleftharpoondown", "xleftharpoonup", "xleftrightarrow", "xleftrightharpoons", "xmapsto", "xmladdindex", "xmlafterdocumentsetup", "xmlaftersetup", "xmlall", "xmlappenddocumentsetup", "xmlappendsetup", "xmlapplyselectors", "xmlatt", "xmlattdef", "xmlattribute", "xmlattributedef", "xmlbadinclusions", "xmlbeforedocumentsetup", "xmlbeforesetup", "xmlchainatt", "xmlchainattdef", "xmlchecknamespace", "xmlcommand", "xmlconcat", "xmlconcatrange", "xmlcontext", "xmlcount", "xmldefaulttotext", "xmldirectives", "xmldirectivesafter", "xmldirectivesbefore", "xmldisplayverbatim", "xmldoif", "xmldoifelse", "xmldoifelseempty", "xmldoifelseselfempty", "xmldoifelsetext", "xmldoifelsevalue", "xmldoifnot", "xmldoifnotselfempty", "xmldoifnottext", "xmldoifselfempty", "xmldoiftext", "xmlelement", "xmlfilter", "xmlfirst", "xmlflush", "xmlflushcontext", "xmlflushdocumentsetups", "xmlflushlinewise", "xmlflushpure", "xmlflushspacewise", "xmlflushtext", "xmlinclude", "xmlinclusion", "xmlinclusions", "xmlinfo", "xmlinjector", "xmlinlineprettyprint", "xmlinlineprettyprinttext", "xmlinlineverbatim", "xmlinstalldirective", "xmllast", "xmllastatt", "xmllastmatch", "xmllastpar", "xmlloadbuffer", "xmlloaddata", "xmlloaddirectives", "xmlloadfile", "xmlloadonly", "xmlmain", "xmlmapvalue", "xmlname", "xmlnamespace", "xmlnonspace", "xmlpar", "xmlparam", "xmlpath", "xmlpos", "xmlposition", "xmlprependdocumentsetup", "xmlprependsetup", "xmlprettyprint", "xmlprettyprinttext", "xmlprocessbuffer", "xmlprocessdata", "xmlprocessfile", "xmlpure", "xmlraw", "xmlrefatt", "xmlregistereddocumentsetups", "xmlregisteredsetups", "xmlregisterns", "xmlremapname", "xmlremapnamespace", "xmlremovedocumentsetup", "xmlremovesetup", "xmlresetdocumentsetups", "xmlresetinjectors", "xmlresetsetups", "xmlsave", "xmlsetatt", "xmlsetattribute", "xmlsetentity", "xmlsetfunction", "xmlsetinjectors", "xmlsetpar", "xmlsetparam", "xmlsetsetup", "xmlsetup", "xmlshow", "xmlsnippet", "xmlstrip", "xmlstripnolines", "xmlstripped", "xmlstrippednolines", "xmltag", "xmltexentity", "xmltext", "xmltobuffer", "xmltobufferverbose", "xmltofile", "xmlvalue", "xmlverbatim", "xrel", "xrightarrow", "xrightharpoondown", "xrightharpoonup", "xrightleftharpoons", "xrightoverleftarrow", "xsplitstring", "xtriplerel", "xtwoheadleftarrow", "xtwoheadrightarrow", "xxfrac", "xypos", "yacute", "ycircumflex", "ydiaeresis", "ydotbelow", "yen", "ygrave", "yhook", "ymacron", "ytilde", "zacute", "zcaron", "zdotaccent", "zerowidthnobreakspace", "zerowidthspace", "zeta", "zhook", "zstroke", "zwj", "zwnj" }, + ["cs"]={ "Cisla", "Kap", "MESIC", "Rimskecislice", "SLOVA", "SLOVO", "Slova", "Slovo", "VSEDNIDEN", "Znak", "Znaky", "aktualnicislonadpisu", "aktualnidatum", "barevnalista", "barva", "cernalinka", "cernelinky", "cisla", "cislonadpisu", "cislorovnice", "cislostrany", "datum", "definuj", "definujakcent", "definujbarvu", "definujblok", "definujbloksekce", "definujbuffer", "definujfont", "definujformatodkazu", "definujhbox", "definujinterakcnimenu", "definujkombinovanyseznam", "definujkonverzi", "definujnadpis", "definujobrazeksymbol", "definujodkaz", "definujodstavce", "definujopis", "definujoramovani", "definujoramovanytext", "definujpaletu", "definujplvouciobjekt", "definujpodpole", "definujpole", "definujpopis", "definujpopisek", "definujprekryv", "definujprikaz", "definujprofil", "definujprogram", "definujprostredizakladnihofontu", "definujrejstrik", "definujsablonutabulky", "definujsekci", "definujseznam", "definujskupinubarev", "definujstartstop", "definujstyl", "definujstylfontu", "definujsymbol", "definujsynonumumfontu", "definujsynonyma", "definujtabelaci", "definujtext", "definujtrideni", "definujupravu", "definujvelikostpapiru", "definujvycet", "definujzakladnifont", "definujzasobnikpoli", "definujznaceni", "definujznak", "delkaseznamu", "externiobraz", "hlavnijazyk", "hodnotabarvy", "instalacejazyka", "interakcnilista", "interakcnitlacitka", "interaktivnimenu", "jazyk", "jdidolu", "jdina", "jdinabox", "jdinastranu", "klonujpole", "komponenta", "konvertujcislo", "kopirujpole", "korekcebilehomista", "matematika", "meritko", "mesic", "mezera", "mrizka", "nastavbarvu", "nastavbarvy", "nastavbilamista", "nastavblok", "nastavbloksekce", "nastavbuffer", "nastavcernelinky", "nastavcislonadpisu", "nastavcislostrany", "nastavcislovaniodstavcu", "nastavcislovaniradku", "nastavcislovanistran", "nastavcitaci", "nastavdeleniplvoucichobjektu", "nastavdelitko", "nastavdolnitexty", "nastavhorejsek", "nastavhornitexty", "nastavinterakci", "nastavinterakcnilistu", "nastavinterakcnimenu", "nastavinterakcniobrazovku", "nastavjazyk", "nastavkapitalky", "nastavkombinovanyseznam", "nastavkomentar", "nastavkomentarstrany", "nastavmarginalnilinky", "nastavmeziradkovoumezeru", "nastavnadpis", "nastavnadpisy", "nastavodkazovani", "nastavodsazovani", "nastavodstavce", "nastavopis", "nastavoramovanetexty", "nastavoramovani", "nastavorez", "nastavotoceni", "nastavpaletu", "nastavplvouciobjekt", "nastavplvouciobjekty", "nastavpodcislostrany", "nastavpole", "nastavpolozky", "nastavpopisek", "nastavpopisky", "nastavpozadi", "nastavprechodstrany", "nastavpreskok", "nastavprogramy", "nastavradkovani", "nastavradky", "nastavrejstrik", "nastavrovnice", "nastavsadusymbolu", "nastavseznam", "nastavsirkucary", "nastavsloupce", "nastavspodek", "nastavsynonyma", "nastavtabelaci", "nastavtabulky", "nastavtenkelinky", "nastavtext", "nastavtextovelinky", "nastavtexttexty", "nastavtextyupati", "nastavtextyzahlavi", "nastavtoleranci", "nastavtrideni", "nastavtype", "nastavumisteniprotejsku", "nastavumistovani", "nastavupati", "nastavupravu", "nastavurl", "nastavusporadani", "nastavvelikostpapiru", "nastavvsechnapole", "nastavvycty", "nastavvyplnovelinky", "nastavvyplnoveradky", "nastavvzhled", "nastavzahlavi", "nastavzakladnifont", "nastavzarovnani", "nastavznaceni", "nastavzuzeni", "nastrane", "nejakyradek", "nekde", "neznamo", "nivy", "nizky", "nokap", "obrazovka", "odkaz", "odkaznastranu", "odkaznatext", "odkazujici", "opis", "opissoubor", "oramovani", "oref", "orez", "otocit", "oznaceni", "pis", "plnezneni", "pole", "polozka", "polozky", "porovnejpaletu", "porovnejskupinubarev", "pozadi", "pozice", "poznamka", "pref", "prelozit", "prepninazakladnifont", "preskoc", "prizpusobivepole", "prizpusobvzhled", "produkt", "projekt", "prostredi", "resetznaceni", "rimskecislice", "rozdelplvouciobjekt", "roztazene", "schovejbloky", "sedabarva", "sloupec", "slovovpravo", "stanovcharakteristickuseznamu", "stanovcislonadpisu", "startbarva", "startinteraktivnimenu", "startjdina", "startkomponenta", "startmarginalnilinka", "startnadpis", "startoramovani", "startpolozka", "startpozadi", "startprodukt", "startprojekt", "startprostredi", "startpublikace", "startradek", "starttextovalinka", "startumistirovnici", "startzarovnanonastred", "startzarovnanovlevo", "startzarovnanovpravo", "startzhustene", "stopbarva", "stopinteraktivnimenu", "stopjdina", "stopkomponenta", "stopmarginalnilinka", "stopnadpis", "stoporamovani", "stoppolozka", "stoppozadi", "stopprodukt", "stopprojekt", "stopprostredi", "stoppublikace", "stopradek", "stoptextovalinka", "stopumistirovnici", "stopzarovnanonastred", "stopzarovnanovlevo", "stopzarovnanovpravo", "stopzhustene", "strana", "tecky", "tenkalinka", "tenkelinky", "textovalinka", "tlacitko", "tlacitkomenu", "tloustkacary", "tref", "tvrdamezera", "tvrdemezery", "ukazbarvu", "ukazmrizku", "ukaznastaveni", "ukazpaletu", "ukazpodpery", "ukazpostredizakladnihofontu", "ukazramecek", "ukazsadusymbolu", "ukazskupinubarev", "ukazupravu", "ukazvytisk", "ukazvzhled", "ukazzakladnifont", "umistikombinovanyseznam", "umistilokalnipoznamkypodcarou", "umistinadsebe", "umistinamrizku", "umistipodrovnici", "umistipoznamkypodcarou", "umistirejstrik", "umistirovnici", "umistiseznam", "umistivedlesebe", "umistizalozky", "urcicharakteristikurejstriku", "uzijJSscripts", "uzijURL", "uzijadresar", "uzijbloky", "uzijexternidokument", "uzijexterniobraz", "uzijexternizvuk", "uzijmodul", "uzijsymbol", "uzijurl", "verze", "vlasovalinka", "vradku", "vsedniden", "vyberbloky", "vyplnenytext", "vyplnovelinky", "vyplnovyradek", "vysoky", "zachovejbloky", "zadnamezera", "zadnehorniadolniradky", "zadnezahlaviaupati", "zalozka", "zapisdoseznamu", "zapismeziseznam", "zaramovani", "zarovnanonastred", "zarovnanovlevo", "zarovnanovpravo", "zasobnikpoli", "ziskejbuffer", "ziskejznaceni", "znaceni", "znak", "znaky", "zpracujbloky", "zrcadlit", "zref" }, + ["de"]={ "Buchstabe", "Buchstaben", "Kap", "MONAT", "Roemischezahlen", "WOCHENTAG", "WOERTER", "WORT", "Woerter", "Wort", "Ziffern", "amgitterausrichten", "aufseite", "ausfuelltext", "ausschnitt", "bearbeitebloecke", "behaltebloecke", "bei", "bemerkung", "benutzeverzeichnis", "beschriftung", "bestimmekopfnummer", "bestimmelistencharakeristika", "bestimmeregistercharakteristika", "bildschirm", "blanko", "buchstabe", "buchstaben", "datum", "defineschriftsynonym", "definiereabbsymbol", "definiereabsaetze", "definiereabschnitt", "definiereabschnittsblock", "definiereakzent", "definierebefehl", "definierebeschreibung", "definierebeschriftung", "definiereblock", "definierefarbe", "definierefarbengruppe", "definierefeld", "definierefeldstapel", "definierefliesstext", "definierefliesstextumgebung", "definieregleitobjekt", "definierehbox", "definiereinteraktionsmenue", "definierekonversion", "definierelabel", "definiereliste", "definieren", "definierenummerierung", "definiereoverlay", "definierepalette", "definierepapierformat", "definiereprofil", "definiereprogramme", "definierepuffer", "definierereferenz", "definierereferenzformat", "definiereregister", "definiereschrift", "definiereschriftstil", "definieresortieren", "definierestartstop", "definierestil", "definieresubfeld", "definieresymbol", "definieresynonyme", "definieretabellenvorlage", "definieretabulator", "definieretext", "definieretippen", "definiereueberschrift", "definiereumbruch", "definiereumrahmt", "definiereumrahmtertext", "definierezeichen", "definierezusammengestellteliste", "drehen", "duennelinie", "duennerumriss", "einezeile", "externeabbildung", "farbbalken", "farbe", "farbewert", "feld", "feldstapel", "festesspatium", "format", "formelnummer", "gefuelltesrechteck", "gefuelltezeile", "gestreckt", "gitter", "graufarbe", "haarlinie", "hauptsprache", "heutigesdatum", "heutigeskopfnummer", "hintergrund", "hoch", "holebeschriftung", "holepuffer", "imumriss", "installieresprache", "interaktionsbalken", "interaktionsknopfe", "interaktionsmenue", "inzeile", "irgendwo", "keinekopfundfusszeilen", "keinspatium", "keinzeilenobenundunten", "klonierefeld", "knopf", "komponente", "konvertierezahl", "kopfnummer", "kopierefeld", "korrigierezwischenraum", "liniendicke", "linksbuendig", "listenlaenge", "mathematik", "menueknopf", "monat", "nachunten", "nokap", "notiz", "passelayoutan", "passendfeld", "platzierebookmarks", "platziereformel", "platzierefussnoten", "platziereliste", "platzierelokalefussnoten", "platzierenebeneinander", "platziereregister", "platziereuntereinander", "platziereunterformel", "platzierezusammengestellteliste", "pos", "posten", "produkt", "programm", "projekt", "punkt", "rechteck", "rechtecke", "rechtsbuendig", "referenz", "referieren", "roemischezahlen", "ruecksetztenbeschriftung", "schreibezurliste", "schreibezwischenliste", "seite", "seitenreferenz", "seitenummer", "settext", "spalte", "spatium", "spiegeln", "sprache", "startfarbe", "starthintergrund", "startinteraktionsmenue", "startkleinerdurchschuss", "startkomponente", "startkopf", "startlinksbuendig", "startmarginallinie", "startplatziereformel", "startpos", "startprodukt", "startprojekt", "startpublikation", "startrechtsbuendig", "starttextlinie", "startumgebung", "startumrahmt", "startzeile", "startzentriert", "startzu", "stelleabsaetzeein", "stelleabsatznummerierungein", "stelleabschnittsblockein", "stelleanordnenein", "stelleaufzaehlungenein", "stelleausrichtungein", "stelleausschnittein", "stellebeschreibungein", "stellebeschriftungein", "stellebilderunterschriftein", "stellebildunterschriftein", "stellebindestrichein", "stelleblankoein", "stelleblockein", "stelledrehenein", "stelleduennerumrissein", "stelleeinziehenein", "stelleengerein", "stellefarbeein", "stellefarbenein", "stellefeldein", "stellefelderin", "stellefliesstextein", "stelleformelnein", "stellefusszeileein", "stellefusszeilentextein", "stellegefuelltesrechteckein", "stellegefuelltezeileein", "stellegegenueberplatzierenein", "stellegleitobjekteein", "stellegleitobjektein", "stellehintergruendeein", "stellehintergrundein", "stelleinteraktionein", "stelleinteraktionsbalkenein", "stelleinteraktionsbildschirmein", "stelleinteraktionsmenueein", "stellekommentarein", "stellekopfzahlein", "stellekopfzeileein", "stellekopfzeilentextein", "stellelayoutein", "stellelinienbreiteein", "stellelisteein", "stellemarginallinieein", "stellenobenein", "stellepaletteein", "stellepapierformatein", "stelleplatziegeteiltegleitobjekt", "stellepositionierenein", "stellepostenein", "stelleprogrammein", "stellepufferein", "stellerechteckein", "stellereferenzierenein", "stelleregisterein", "stelleseitenkommentarein", "stelleseitennummerein", "stelleseitennummeriernungein", "stelleseitenuebergangein", "stellesortierenein", "stellespaltenein", "stellespatiumein", "stellespracheein", "stellesymbolsetein", "stellesynonymein", "stelletabellenein", "stelletabulatorein", "stelletextein", "stelletextobenein", "stelletexttexteein", "stelletextumrissein", "stelletextuntenein", "stelletipein", "stelletippenein", "stelletoleranzein", "stelleueberschriftein", "stelleueberschriftenein", "stelleumbruchein", "stelleumrahmtein", "stelleumrahmtetexteein", "stelleuntenein", "stelleunterseitennummerein", "stelleurlein", "stelleversalienein", "stellezeilenabstandein", "stellezeilenein", "stellezeilennumerierungein", "stellezitierenein", "stellezusammengestelltelisteein", "stellezwischenraumein", "stopfarbe", "stophintergrund", "stopinteraktionsmenue", "stopkleinerdurchschuss", "stopkomponente", "stopkopf", "stoplinksbuendig", "stopmarginallinie", "stopplatziereformel", "stoppos", "stopprodukt", "stopprojekt", "stoppublikation", "stoprechtsbuendig", "stoptextlinie", "stopumgebung", "stopumrahmt", "stopzeile", "stopzentriert", "stopzu", "teilegleitobjekt", "textlinie", "textreferenz", "tief", "tiho", "tip", "tippedatei", "tippen", "tippepuffer", "ueber", "uebersetzten", "umgebung", "umrahmt", "unbekant", "verbergebloecke", "vergleichefarbengruppe", "vergleichepalette", "verwendeJSscript", "verwendeURL", "verwendebloecke", "verwendeexteresdokument", "verwendeexterneabbildung", "verwendeexternestonstueck", "verwendemodul", "verwendesymbole", "verwendeurl", "volleswort", "von", "waehlebloeckeaus", "wechselezumfliesstext", "wochentag", "wortrechts", "zeigedruck", "zeigeeinstellungen", "zeigefarbe", "zeigefarbengruppe", "zeigefliesstext", "zeigefliesstextumgebung", "zeigegitter", "zeigelayout", "zeigepalette", "zeigerahmen", "zeigestruts", "zeigeumbruch", "zentriert", "ziffern", "zu", "zurbox", "zurseite" }, + ["en"]={}, + ["fr"]={ "Caractere", "Caracteres", "Chiffresromains", "JOURSEMAINE", "MOIS", "MOT", "MOTS", "Mot", "Mots", "Numeros", "a", "adaptedisposition", "ajustechamp", "alaligne", "alapage", "aligneadroite", "aligneagauche", "aligneaumilieu", "arriereplan", "baha", "barrecouleur", "barreinteraction", "bas", "bouton", "boutonmenu", "boutonsinteraction", "cacheblocs", "caractere", "caracteres", "champ", "changepolicecorps", "chiffresromains", "clonechamp", "colonne", "commentaire", "comparegroupecouleur", "comparepalette", "completenumeropage", "completeregistre", "composant", "concernant", "convertitnumero", "copitchamp", "corrigeespaceblanc", "couleur", "couleurgrise", "dactylographier", "dans", "datecourante", "de", "definicaractere", "definit", "definitaccent", "definitbloc", "definitblocsection", "definitbuffer", "definitcalque", "definitchamp", "definitcommande", "definitconversion", "definitcouleur", "definitdactylo", "definitdemarrestoppe", "definitdescription", "definitdisposition", "definitenumeration", "definitenvironnementpolicecorps", "definitetiquette", "definitflottant", "definitformatreference", "definitgroupecouleur", "definithbox", "definitliste", "definitlisteimbriquee", "definitmakeup", "definitmarquage", "definitmenuinteraction", "definitpalette", "definitparagraphes", "definitpilechamp", "definitpolice", "definitpolicecorps", "definitprofil", "definitprogramme", "definitreference", "definitregistre", "definitrevetement", "definitsautdecolonne", "definitsautdepage", "definitsection", "definitsouschamp", "definitstyle", "definitstylepolice", "definitsymbole", "definitsymbolefigure", "definitsynonymepolice", "definitsynonymes", "definittabulation", "definittaillepapier", "definittete", "definittexte", "definittrametableau", "definittri", "definittype", "definitvide", "demarreJScode", "demarreJSpreamble", "demarreLUA", "demarreMP", "demarreMPclip", "demarreMPcode", "demarreMPdefinitions", "demarreMPdrawing", "demarreMPenvironment", "demarreMPextensions", "demarreMPinclusions", "demarreMPinitializations", "demarreMPpage", "demarreMPpositiongraphic", "demarreMPpositionmethod", "demarreMPrun", "demarrePARSEDXML", "demarreTABLE", "demarreTABLEbody", "demarreTABLEfoot", "demarreTABLEhead", "demarreTABLEnext", "demarreTC", "demarreTD", "demarreTDs", "demarreTEX", "demarreTEXpage", "demarreTH", "demarreTN", "demarreTR", "demarreTRs", "demarreTX", "demarreTY", "demarreXML", "demarrealign", "demarrealigneadroite", "demarrealigneagauche", "demarrealigneaumilieu", "demarrealignment", "demarreallmodes", "demarreappendices", "demarrearrangedpages", "demarrearriereplan", "demarreaside", "demarreattachment", "demarrebackmatter", "demarrebar", "demarrebbordermatrix", "demarrebitmapimage", "demarreblockquote", "demarrebodymatter", "demarrebordermatrix", "demarreboxedcolumns", "demarrebtxlabeltext", "demarrebtxrenderingdefinitions", "demarrebuffer", "demarrecases", "demarrecatcodetable", "demarrecenteraligned", "demarrechapter", "demarrecharacteralign", "demarrecheckedfences", "demarrechemical", "demarrechemicaltext", "demarreciter", "demarrecollect", "demarrecollecting", "demarrecolorintent", "demarrecoloronly", "demarrecolorset", "demarrecolumns", "demarrecolumnspan", "demarrecombination", "demarrecomment", "demarrecomposant", "demarrecontextcode", "demarrecontextdefinitioncode", "demarrecouleur", "demarrectxfunction", "demarrectxfunctiondefinition", "demarrecurrentcolor", "demarrecurrentlistentrywrapper", "demarredelimited", "demarredelimitedtext", "demarredisplaymath", "demarredmath", "demarredocument", "demarreeffect", "demarreelement", "demarreembeddedxtable", "demarreendnote", "demarreendofline", "demarreenvironement", "demarreexceptions", "demarreexpanded", "demarreexpandedcollect", "demarreextendedcatcodetable", "demarreexternalfigurecollection", "demarrefact", "demarrefigure", "demarrefiguretext", "demarrefittingpage", "demarrefixed", "demarrefloatcombination", "demarrefont", "demarrefontclass", "demarrefontsolution", "demarrefootnote", "demarreformula", "demarreformulas", "demarreframed", "demarreframedcell", "demarreframedcontent", "demarreframedrow", "demarreframedtable", "demarreframedtext", "demarrefrontmatter", "demarregraphictext", "demarregridsnapping", "demarregroupe", "demarrehanging", "demarrehbox", "demarrehboxestohbox", "demarrehboxregister", "demarreheadtext", "demarrehelptext", "demarrehiding", "demarrehighlight", "demarrehyphenation", "demarreimath", "demarreindentation", "demarreindentedtext", "demarreinteraction", "demarreinterface", "demarreintermezzotext", "demarreintertext", "demarreitemgroup", "demarreitemgroupcolumns", "demarreitemize", "demarreknockout", "demarrelabeltext", "demarrelayout", "demarrelegend", "demarreligne", "demarreligneregleetexte", "demarrelinealignment", "demarrelinecorrection", "demarrelinefiller", "demarrelinenumbering", "demarrelines", "demarrelinetable", "demarrelinetablebody", "demarrelinetablecell", "demarrelinetablehead", "demarrelocalfootnotes", "demarrelocalheadsetup", "demarrelocallinecorrection", "demarrelocalnotes", "demarrelocalsetups", "demarrelua", "demarreluacode", "demarreluaparameterset", "demarreluasetups", "demarremakeup", "demarremargereglee", "demarremarginblock", "demarremarkedcontent", "demarremathalignment", "demarremathcases", "demarremathlabeltext", "demarremathmatrix", "demarremathmode", "demarremathstyle", "demarrematrices", "demarrematrix", "demarremaxaligned", "demarremdformula", "demarremenuinteraction", "demarremiddlealigned", "demarremiddlemakeup", "demarremixedcolumns", "demarremode", "demarremodeset", "demarremodule", "demarremoduletestsection", "demarrempformula", "demarrenamedsection", "demarrenamedsubformulas", "demarrenarrow", "demarrenarrower", "demarrenegative", "demarrenicelyfilledbox", "demarrenointerference", "demarrenotallmodes", "demarrenotext", "demarrenotmode", "demarreoperatortext", "demarreopposite", "demarreoutputstream", "demarreoverlay", "demarreoverprint", "demarrepagecomment", "demarrepagefigure", "demarrepagegrid", "demarrepagegridspan", "demarrepagelayout", "demarrepagemakeup", "demarrepar", "demarreparagraph", "demarreparagraphs", "demarreparagraphscell", "demarreparbuilder", "demarrepart", "demarrepath", "demarreplacechemical", "demarreplacefigure", "demarreplaceflottant", "demarreplaceformule", "demarreplacegraphic", "demarreplaceintermezzo", "demarreplacelegend", "demarreplacepairedbox", "demarreplacetable", "demarrepositioning", "demarrepositionoverlay", "demarrepositive", "demarrepostponing", "demarreprefixtext", "demarreprocessassignmentcommand", "demarreprocessassignmentlist", "demarreprocesscommacommand", "demarreprocesscommalist", "demarreproduit", "demarreprojet", "demarreprotect", "demarreprotectedcolors", "demarrepublication", "demarrepunctuation", "demarrequotation", "demarrequote", "demarrerandomized", "demarrerandomseed", "demarrerawsetups", "demarrereadingfile", "demarrereferenceprefix", "demarreregime", "demarrereusableMPgraphic", "demarrescript", "demarresdformula", "demarresection", "demarresectionblock", "demarresectionblockenvironment", "demarresectionlevel", "demarresetups", "demarreshapebox", "demarreshift", "demarresidebar", "demarresimplecolumns", "demarrespecialitem", "demarrespeech", "demarrespformula", "demarresplitformula", "demarrespread", "demarrestandardmakeup", "demarrestartstop", "demarrestaticMPfigure", "demarrestaticMPgraphic", "demarrestrictinspectnextcharacter", "demarrestrut", "demarrestyle", "demarresubformulas", "demarresubject", "demarresubjectlevel", "demarresubsection", "demarresubsentence", "demarresubstack", "demarresubsubject", "demarresubsubsection", "demarresubsubsubject", "demarresubsubsubsection", "demarresubsubsubsubject", "demarresubsubsubsubsection", "demarresubsubsubsubsubject", "demarresuffixtext", "demarresymbolset", "demarretable", "demarretablehead", "demarretables", "demarretabletail", "demarretabletext", "demarretabulate", "demarretabulatehead", "demarretabulatetail", "demarretagged", "demarretaglabeltext", "demarretete", "demarretexcode", "demarretexdefinition", "demarretext", "demarretextbackground", "demarretextbackgroundmanual", "demarretextcolor", "demarretextcolorintent", "demarretextflow", "demarretextmakeup", "demarretitle", "demarretokens", "demarretransparent", "demarretypescript", "demarretypescriptcollection", "demarretyping", "demarreuniqueMPgraphic", "demarreuniqueMPpagegraphic", "demarreunittext", "demarreunpacked", "demarreusableMPgraphic", "demarreuseMPgraphic", "demarreusemathstyleparameter", "demarreusingbtxspecification", "demarreva", "demarrevbox", "demarrevboxregister", "demarrevboxtohbox", "demarrevboxtohboxseparator", "demarreviewerlayer", "demarrevtop", "demarrevtopregister", "demarrexcell", "demarrexcellgroup", "demarrexgroup", "demarrexmldisplayverbatim", "demarrexmlinlineverbatim", "demarrexmlraw", "demarrexmlsetups", "demarrexrow", "demarrexrowgroup", "demarrextable", "demarrextablebody", "demarrextablefoot", "demarrextablehead", "demarrextablenext", "determinecaracteristiqueliste", "determinecaracteristiquesregistre", "determinenumerotete", "echelle", "ecran", "ecritdansliste", "ecritentreliste", "element", "elements", "environement", "espace", "espacefixe", "espacesfixes", "etire", "faitreference", "fichierdactylo", "figureexterne", "gardeblocs", "grille", "haut", "inconnu", "installelangue", "joursemaine", "langue", "langueprincipale", "largeurligne", "ligneh", "lignenoire", "ligneregleetexte", "lignesnoires", "llongueurliste", "marquage", "marquepage", "mathematique", "menuinteraction", "mois", "montrecadre", "montrecouleur", "montredisposition", "montreedition", "montreenvironnementpolicecorps", "montregrille", "montregroupecouleur", "montrejeusymboles", "montremakeup", "montrepalette", "montrepolicecorps", "montrereglages", "montrestruts", "motdroit", "numeroformule", "numeropage", "numeros", "numerotete", "numerotetecourant", "obtientmarquage", "oriente", "periodes", "pilechamp", "placecoteacote", "placeflottant", "placeformule", "placelesunsaudessusdesautres", "placeliste", "placelisteinmbriquee", "placemarquespages", "placenotespdp", "placenotespdplocales", "placenumeropage", "placenumerotete", "placeregistre", "placesousformule", "placesurgrille", "placetextetete", "prendbuffer", "produit", "programme", "projet", "qqpart", "razmarquage", "referencepage", "referencetexte", "reflete", "reglealignement", "reglearrangement", "reglearriereplan", "reglearriereplans", "reglebarreinteraction", "reglebloc", "regleblocsection", "reglebuffer", "reglecapitales", "reglechamp", "reglechamps", "regleclipping", "reglecolonnes", "reglecommentaire", "reglecommentairepage", "reglecompoetroite", "reglecomposeenalinea", "reglecouleur", "reglecouleurs", "regledactylo", "regledemarrestoppe", "regledisposition", "regleecraninteraction", "regleelements", "regleencadre", "regleentete", "regleenumerations", "regleepaisseurligne", "regleespaceblanc", "regleespacement", "regleespacementinterligne", "regleflottant", "regleflottants", "regleformulaires", "regleformules", "reglegroupeselements", "regleinf", "regleinteraction", "regleintitule", "regleintitules", "reglejeusymboles", "reglelangue", "reglelignes", "reglelignesnoires", "reglelignesreglestexte", "regleliste", "reglelisteimbriquee", "reglemakeup", "reglemargereglee", "reglemarquage", "reglemarquagehyphenation", "reglemenuinteraction", "reglenumeropage", "reglenumerotationligne", "reglenumerotationpage", "reglenumerotationparagraphe", "reglenumerotete", "regleoriente", "reglepalette", "reglepapier", "regleparagraphes", "reglepdp", "regleplacementopposition", "reglepolicecorps", "reglepositionnement", "regleprogrammes", "reglereferencage", "regleregistre", "regleremplitligne", "regleremplitlignesreglees", "regleseparationflottant", "reglesousnumeropage", "reglesup", "reglesynonymes", "regletableaux", "regletabulation", "regletaillepapier", "regletete", "regletetes", "regletexte", "regletextesentete", "regletextesinf", "regletextespdp", "regletextessup", "regletextestexte", "regletolerance", "regletraitsfins", "regletransitionspage", "regletri", "regletype", "regleurl", "remplitligne", "remplitlignesreglees", "remplittexte", "sansespace", "sanslignesenteteetpdp", "sanslignessupetinf", "selectionneblocs", "separeflottant", "settext", "sousnumeropage", "stoppeJScode", "stoppeJSpreamble", "stoppeLUA", "stoppeMP", "stoppeMPclip", "stoppeMPcode", "stoppeMPdefinitions", "stoppeMPdrawing", "stoppeMPenvironment", "stoppeMPextensions", "stoppeMPinclusions", "stoppeMPinitializations", "stoppeMPpage", "stoppeMPpositiongraphic", "stoppeMPpositionmethod", "stoppeMPrun", "stoppePARSEDXML", "stoppeTABLE", "stoppeTABLEbody", "stoppeTABLEfoot", "stoppeTABLEhead", "stoppeTABLEnext", "stoppeTC", "stoppeTD", "stoppeTDs", "stoppeTEX", "stoppeTEXpage", "stoppeTH", "stoppeTN", "stoppeTR", "stoppeTRs", "stoppeTX", "stoppeTY", "stoppeXML", "stoppealign", "stoppealigneadroite", "stoppealigneagauche", "stoppealigneaumilieu", "stoppealignment", "stoppeallmodes", "stoppeappendices", "stoppearrangedpages", "stoppearriereplan", "stoppeaside", "stoppeattachment", "stoppebackmatter", "stoppebar", "stoppebbordermatrix", "stoppebitmapimage", "stoppeblockquote", "stoppebodymatter", "stoppebordermatrix", "stoppeboxedcolumns", "stoppebtxlabeltext", "stoppebtxrenderingdefinitions", "stoppebuffer", "stoppecases", "stoppecatcodetable", "stoppecenteraligned", "stoppechapter", "stoppecharacteralign", "stoppecheckedfences", "stoppechemical", "stoppechemicaltext", "stoppecollect", "stoppecollecting", "stoppecolorintent", "stoppecoloronly", "stoppecolorset", "stoppecolumns", "stoppecolumnspan", "stoppecombination", "stoppecomment", "stoppecomposant", "stoppecontextcode", "stoppecontextdefinitioncode", "stoppecouleur", "stoppectxfunction", "stoppectxfunctiondefinition", "stoppecurrentcolor", "stoppecurrentlistentrywrapper", "stoppedelimited", "stoppedelimitedtext", "stoppedisplaymath", "stoppedmath", "stoppedocument", "stoppeeffect", "stoppeelement", "stoppeembeddedxtable", "stoppeendnote", "stoppeendofline", "stoppeenvironement", "stoppeexceptions", "stoppeexpanded", "stoppeexpandedcollect", "stoppeextendedcatcodetable", "stoppeexternalfigurecollection", "stoppefact", "stoppefigure", "stoppefiguretext", "stoppefittingpage", "stoppefixed", "stoppefloatcombination", "stoppefont", "stoppefontclass", "stoppefontsolution", "stoppefootnote", "stoppeformula", "stoppeformulas", "stoppeframed", "stoppeframedcell", "stoppeframedcontent", "stoppeframedrow", "stoppeframedtable", "stoppeframedtext", "stoppefrontmatter", "stoppegraphictext", "stoppegridsnapping", "stoppegroupe", "stoppehanging", "stoppehbox", "stoppehboxestohbox", "stoppehboxregister", "stoppeheadtext", "stoppehelptext", "stoppehiding", "stoppehighlight", "stoppehyphenation", "stoppeimath", "stoppeindentation", "stoppeindentedtext", "stoppeinteraction", "stoppeinterface", "stoppeintermezzotext", "stoppeintertext", "stoppeitemgroup", "stoppeitemgroupcolumns", "stoppeitemize", "stoppeknockout", "stoppelabeltext", "stoppelayout", "stoppelegend", "stoppeligne", "stoppeligneregleetexte", "stoppelinealignment", "stoppelinecorrection", "stoppelinefiller", "stoppelinenumbering", "stoppelines", "stoppelinetable", "stoppelinetablebody", "stoppelinetablecell", "stoppelinetablehead", "stoppelocalfootnotes", "stoppelocalheadsetup", "stoppelocallinecorrection", "stoppelocalnotes", "stoppelocalsetups", "stoppelua", "stoppeluacode", "stoppeluaparameterset", "stoppeluasetups", "stoppemakeup", "stoppemargereglee", "stoppemarginblock", "stoppemarkedcontent", "stoppemathalignment", "stoppemathcases", "stoppemathlabeltext", "stoppemathmatrix", "stoppemathmode", "stoppemathstyle", "stoppematrices", "stoppematrix", "stoppemaxaligned", "stoppemdformula", "stoppemenuinteraction", "stoppemiddlealigned", "stoppemiddlemakeup", "stoppemixedcolumns", "stoppemode", "stoppemodeset", "stoppemodule", "stoppemoduletestsection", "stoppempformula", "stoppenamedsection", "stoppenamedsubformulas", "stoppenarrow", "stoppenarrower", "stoppenegative", "stoppenicelyfilledbox", "stoppenointerference", "stoppenotallmodes", "stoppenotext", "stoppenotmode", "stoppeoperatortext", "stoppeopposite", "stoppeoutputstream", "stoppeoverlay", "stoppeoverprint", "stoppepagecomment", "stoppepagefigure", "stoppepagegrid", "stoppepagegridspan", "stoppepagelayout", "stoppepagemakeup", "stoppepar", "stoppeparagraph", "stoppeparagraphs", "stoppeparagraphscell", "stoppeparbuilder", "stoppepart", "stoppepath", "stoppeplacechemical", "stoppeplacefigure", "stoppeplaceflottant", "stoppeplaceformule", "stoppeplacegraphic", "stoppeplaceintermezzo", "stoppeplacelegend", "stoppeplacepairedbox", "stoppeplacetable", "stoppepositioning", "stoppepositionoverlay", "stoppepositive", "stoppepostponing", "stoppeprefixtext", "stoppeprocessassignmentcommand", "stoppeprocessassignmentlist", "stoppeprocesscommacommand", "stoppeprocesscommalist", "stoppeproduit", "stoppeprojet", "stoppeprotect", "stoppeprotectedcolors", "stoppepublication", "stoppepunctuation", "stoppequotation", "stoppequote", "stopperandomized", "stopperandomseed", "stopperawsetups", "stoppereadingfile", "stoppereferenceprefix", "stopperegime", "stoppereusableMPgraphic", "stoppescript", "stoppesdformula", "stoppesection", "stoppesectionblock", "stoppesectionblockenvironment", "stoppesectionlevel", "stoppesetups", "stoppeshapebox", "stoppeshift", "stoppesidebar", "stoppesimplecolumns", "stoppespecialitem", "stoppespeech", "stoppespformula", "stoppesplitformula", "stoppespread", "stoppestandardmakeup", "stoppestartstop", "stoppestaticMPfigure", "stoppestaticMPgraphic", "stoppestrictinspectnextcharacter", "stoppestrut", "stoppestyle", "stoppesubformulas", "stoppesubject", "stoppesubjectlevel", "stoppesubsection", "stoppesubsentence", "stoppesubstack", "stoppesubsubject", "stoppesubsubsection", "stoppesubsubsubject", "stoppesubsubsubsection", "stoppesubsubsubsubject", "stoppesubsubsubsubsection", "stoppesubsubsubsubsubject", "stoppesuffixtext", "stoppesymbolset", "stoppetable", "stoppetablehead", "stoppetables", "stoppetabletail", "stoppetabletext", "stoppetabulate", "stoppetabulatehead", "stoppetabulatetail", "stoppetagged", "stoppetaglabeltext", "stoppetete", "stoppetexcode", "stoppetexdefinition", "stoppetext", "stoppetextbackground", "stoppetextbackgroundmanual", "stoppetextcolor", "stoppetextcolorintent", "stoppetextflow", "stoppetextmakeup", "stoppetitle", "stoppetokens", "stoppetransparent", "stoppetypescript", "stoppetypescriptcollection", "stoppetyping", "stoppeuniqueMPgraphic", "stoppeuniqueMPpagegraphic", "stoppeunittext", "stoppeunpacked", "stoppeusableMPgraphic", "stoppeuseMPgraphic", "stoppeusemathstyleparameter", "stoppeusingbtxspecification", "stoppeva", "stoppevbox", "stoppevboxregister", "stoppevboxtohbox", "stoppevboxtohboxseparator", "stoppeviewerlayer", "stoppevtop", "stoppevtopregister", "stoppexcell", "stoppexcellgroup", "stoppexgroup", "stoppexmldisplayverbatim", "stoppexmlinlineverbatim", "stoppexmlraw", "stoppexmlsetups", "stoppexrow", "stoppexrowgroup", "stoppextable", "stoppextablebody", "stoppextablefoot", "stoppextablehead", "stoppextablenext", "symbole", "tapebuffer", "textenotepdp", "traduire", "traiteblocs", "traitfin", "traitsfins", "uneligne", "utiliseJSscripts", "utiliseURL", "utiliseblocs", "utilisechemin", "utilisedocumentexterne", "utilisefigureexterne", "utilisemodule", "utilisepsiteaudioexterne", "utilisesymboles", "utiliseurl", "va", "vaalaboite", "vaalapage", "vaenbas", "valeurcouleur", "vide" }, + ["it"]={ "GIORNOSETTIMANA", "Lettera", "Lettere", "MESE", "Numeri", "Numeriromani", "PAROLA", "PAROLE", "Parola", "Parole", "adattacampo", "adattalayout", "al", "allineacentro", "allineadestra", "allineasinistra", "ambiente", "ap", "apagina", "barracolori", "barrainterazione", "cambiaafontdeltesto", "campi", "capello", "chim", "circondato", "clonacampo", "colonna", "colore", "coloregrigio", "commento", "componenet", "confrontagruppocolori", "confrontatavolozza", "convertinumero", "copiacampo", "correggispaziobianco", "da", "daqualcheparte", "data", "datadioggi", "definisci", "definisciaccento", "definisciambientefontdeltesto", "definisciblocco", "definiscibloccosezione", "definiscibuffer", "definiscicampo", "definiscicapoversi", "definiscicarattere", "definiscicolore", "definiscicomando", "definisciconversione", "definiscidescrizione", "definiscidimensionicarta", "definiscielenco", "definiscielencocombinato", "definiscienumerazione", "definiscietichetta", "definiscifigurasimbolo", "definiscifont", "definiscifontdeltesto", "definisciformatoriferimento", "definiscigruppocolori", "definiscihbox", "definisciincorniciato", "definisciiniziatermina", "definiscilayout", "definiscimakeup", "definiscimarcatura", "definiscimenuinterazione", "definiscimodellotabella", "definiscioggettomobile", "definisciordinamento", "definisciprofilo", "definisciprogramma", "definisciregistro", "definisciriferimento", "definiscisezione", "definiscisimbolo", "definiscisinonimi", "definiscisinonimofont", "definiscisottocampo", "definiscisovrapposizione", "definiscistackcampi", "definiscistile", "definiscistilefont", "definiscitabulato", "definiscitavolozza", "definiscitesta", "definiscitesto", "definiscitestoincorniciato", "definiscitype", "definiscityping", "determinacaratteristicheregistro", "determinacarattersticheelenco", "determinanumerotesta", "elaborablocchi", "elementi", "elemento", "figuraesterna", "giornosettimana", "griglia", "ignoto", "impostaallineamento", "impostaampiezzariga", "impostabarrainterazione", "impostablocco", "impostabloccosezione", "impostabuffer", "impostacampi", "impostacampo", "impostacapoversi", "impostacaption", "impostacaptions", "impostacima", "impostaclippling", "impostacolonne", "impostacolore", "impostacolori", "impostacommento", "impostacommentopagina", "impostadimensionicarta", "impostaelementi", "impostaelencazioni", "impostaelenco", "impostaelencocombinato", "impostaenumerazioni", "impostafondo", "impostafontdeltesto", "impostaforms", "impostaformule", "impostaincorniciato", "impostainiziatermina", "impostainstestazione", "impostainterazione", "impostainterlinea", "impostalayout", "impostalineemargine", "impostalineenere", "impostalineeriempimento", "impostalineesottili", "impostalineetesto", "impostalingua", "impostamaiuscole", "impostamakeup", "impostamarcatura", "impostamenuinterazione", "impostamenzione", "impostanumerazionecapoversi", "impostanumerazionepagina", "impostanumerazionerighe", "impostanumeropagina", "impostanumerosottopagina", "impostanumerotesta", "impostaoggettimobili", "impostaoggettomobile", "impostaordinamento", "impostaparranging", "impostapdp", "impostapiustretto", "impostaposizionamento", "impostaposizionamentoopposti", "impostaprogrammi", "impostaregistro", "impostarientro", "impostariferimento", "impostarighe", "impostarigheriempimento", "impostarigovuoto", "impostarotazione", "impostaschermointerazione", "impostasegnosillabazione", "impostasetsimboli", "impostasfondi", "impostasfondo", "impostasinonimi", "impostaspaziatura", "impostaspaziobianco", "impostaspezzamentooggettomobile", "impostatabelle", "impostatabulato", "impostatavolozza", "impostatesta", "impostateste", "impostatesticima", "impostatestifondo", "impostatestiincorniciati", "impostatestiintestazioni", "impostatestipdp", "impostatesto", "impostatestotesti", "impostatolleranza", "impostatransizionepagina", "impostatype", "impostatyping", "impostaurl", "incorniciato", "iniziaJScode", "iniziaJSpreamble", "iniziaLUA", "iniziaMP", "iniziaMPclip", "iniziaMPcode", "iniziaMPdefinitions", "iniziaMPdrawing", "iniziaMPenvironment", "iniziaMPextensions", "iniziaMPinclusions", "iniziaMPinitializations", "iniziaMPpage", "iniziaMPpositiongraphic", "iniziaMPpositionmethod", "iniziaMPrun", "iniziaPARSEDXML", "iniziaTABLE", "iniziaTABLEbody", "iniziaTABLEfoot", "iniziaTABLEhead", "iniziaTABLEnext", "iniziaTC", "iniziaTD", "iniziaTDs", "iniziaTEX", "iniziaTEXpage", "iniziaTH", "iniziaTN", "iniziaTR", "iniziaTRs", "iniziaTX", "iniziaTY", "iniziaXML", "iniziaalign", "iniziaalignment", "iniziaallineacentro", "iniziaallineadestra", "iniziaallineasinistra", "iniziaallmodes", "iniziaambiente", "iniziaappendices", "iniziaarrangedpages", "iniziaaside", "iniziaattachment", "iniziabackmatter", "iniziabar", "iniziabbordermatrix", "iniziabitmapimage", "iniziablockquote", "iniziabodymatter", "iniziabordermatrix", "iniziaboxedcolumns", "iniziabtxlabeltext", "iniziabtxrenderingdefinitions", "iniziabuffer", "iniziacases", "iniziacatcodetable", "iniziacenteraligned", "iniziachapter", "iniziacharacteralign", "iniziacheckedfences", "iniziachemical", "iniziachemicaltext", "iniziacollect", "iniziacollecting", "iniziacolore", "iniziacolorintent", "iniziacoloronly", "iniziacolorset", "iniziacolumns", "iniziacolumnspan", "iniziacombination", "iniziacomment", "iniziacomponenet", "iniziacontextcode", "iniziacontextdefinitioncode", "iniziactxfunction", "iniziactxfunctiondefinition", "iniziacurrentcolor", "iniziacurrentlistentrywrapper", "iniziadelimited", "iniziadelimitedtext", "iniziadisplaymath", "iniziadmath", "iniziadocument", "iniziaeffect", "iniziaelement", "iniziaelemento", "iniziaembeddedxtable", "iniziaendnote", "iniziaendofline", "iniziaexceptions", "iniziaexpanded", "iniziaexpandedcollect", "iniziaextendedcatcodetable", "iniziaexternalfigurecollection", "iniziafact", "iniziafigure", "iniziafiguretext", "iniziafittingpage", "iniziafixed", "iniziafloatcombination", "iniziafont", "iniziafontclass", "iniziafontsolution", "iniziafootnote", "iniziaformula", "iniziaformulas", "iniziaframedcell", "iniziaframedcontent", "iniziaframedrow", "iniziaframedtable", "iniziaframedtext", "iniziafrontmatter", "iniziagraphictext", "iniziagridsnapping", "iniziahanging", "iniziahbox", "iniziahboxestohbox", "iniziahboxregister", "iniziaheadtext", "iniziahelptext", "iniziahiding", "iniziahighlight", "iniziahyphenation", "iniziaimath", "iniziaimpaccato", "iniziaincorniciato", "iniziaindentation", "iniziaindentedtext", "iniziainteraction", "iniziainterface", "iniziaintermezzotext", "iniziaintertext", "iniziaitemgroup", "iniziaitemgroupcolumns", "iniziaitemize", "iniziaknockout", "inizialabeltext", "inizialayout", "inizialegend", "inizialinealignment", "inizialineamargine", "inizialineatesto", "inizialinecorrection", "inizialinefiller", "inizialinenumbering", "inizialines", "inizialinetable", "inizialinetablebody", "inizialinetablecell", "inizialinetablehead", "inizialocalfootnotes", "inizialocalheadsetup", "inizialocallinecorrection", "inizialocalnotes", "inizialocalsetups", "inizialua", "inizialuacode", "inizialuaparameterset", "inizialuasetups", "iniziamakeup", "iniziamarginblock", "iniziamarkedcontent", "iniziamathalignment", "iniziamathcases", "iniziamathlabeltext", "iniziamathmatrix", "iniziamathmode", "iniziamathstyle", "iniziamatrices", "iniziamatrix", "iniziamaxaligned", "iniziamdformula", "iniziamenuinterattivo", "iniziamettiformula", "iniziamiddlealigned", "iniziamiddlemakeup", "iniziamixedcolumns", "iniziamode", "iniziamodeset", "iniziamodule", "iniziamoduletestsection", "iniziampformula", "inizianamedsection", "inizianamedsubformulas", "inizianarrow", "inizianarrower", "inizianegative", "inizianicelyfilledbox", "inizianointerference", "inizianotallmodes", "inizianotext", "inizianotmode", "iniziaoperatortext", "iniziaopposite", "iniziaoutputstream", "iniziaoverlay", "iniziaoverprint", "iniziapagecomment", "iniziapagefigure", "iniziapagegrid", "iniziapagegridspan", "iniziapagelayout", "iniziapagemakeup", "iniziapar", "iniziaparagraph", "iniziaparagraphs", "iniziaparagraphscell", "iniziaparbuilder", "iniziapart", "iniziapath", "iniziaplacechemical", "iniziaplacefigure", "iniziaplacefloat", "iniziaplacegraphic", "iniziaplaceintermezzo", "iniziaplacelegend", "iniziaplacepairedbox", "iniziaplacetable", "iniziapositioning", "iniziapositionoverlay", "iniziapositive", "iniziapostponing", "iniziaprefixtext", "iniziaprocessassignmentcommand", "iniziaprocessassignmentlist", "iniziaprocesscommacommand", "iniziaprocesscommalist", "iniziaprodotto", "iniziaprogetto", "iniziaprotect", "iniziaprotectedcolors", "iniziapubblicazione", "iniziapunctuation", "iniziaquotation", "iniziaquote", "iniziarandomized", "iniziarandomseed", "iniziarawsetups", "iniziareadingfile", "iniziareferenceprefix", "iniziaregime", "iniziareusableMPgraphic", "iniziariga", "iniziascript", "iniziasdformula", "iniziasection", "iniziasectionblock", "iniziasectionblockenvironment", "iniziasectionlevel", "iniziasetups", "iniziasfondo", "iniziashapebox", "iniziashift", "iniziasidebar", "iniziasimplecolumns", "iniziaspecialitem", "iniziaspeech", "iniziaspformula", "iniziasplitformula", "iniziaspread", "iniziastandardmakeup", "iniziastartstop", "iniziastaticMPfigure", "iniziastaticMPgraphic", "iniziastrictinspectnextcharacter", "iniziastrut", "iniziastyle", "iniziasubformulas", "iniziasubject", "iniziasubjectlevel", "iniziasubsection", "iniziasubsentence", "iniziasubstack", "iniziasubsubject", "iniziasubsubsection", "iniziasubsubsubject", "iniziasubsubsubsection", "iniziasubsubsubsubject", "iniziasubsubsubsubsection", "iniziasubsubsubsubsubject", "iniziasuffixtext", "iniziasymbolset", "iniziatable", "iniziatablehead", "iniziatables", "iniziatabletail", "iniziatabletext", "iniziatabulate", "iniziatabulatehead", "iniziatabulatetail", "iniziatagged", "iniziataglabeltext", "iniziatesta", "iniziatexcode", "iniziatexdefinition", "iniziatext", "iniziatextbackground", "iniziatextbackgroundmanual", "iniziatextcolor", "iniziatextcolorintent", "iniziatextflow", "iniziatextmakeup", "iniziatitle", "iniziatokens", "iniziatransparent", "iniziatypescript", "iniziatypescriptcollection", "iniziatyping", "iniziauniqueMPgraphic", "iniziauniqueMPpagegraphic", "iniziaunittext", "iniziaunpacked", "iniziausableMPgraphic", "iniziauseMPgraphic", "iniziausemathstyleparameter", "iniziausingbtxspecification", "iniziavaia", "iniziavbox", "iniziavboxregister", "iniziavboxtohbox", "iniziavboxtohboxseparator", "iniziaviewerlayer", "iniziavtop", "iniziavtopregister", "iniziaxcell", "iniziaxcellgroup", "iniziaxgroup", "iniziaxmldisplayverbatim", "iniziaxmlinlineverbatim", "iniziaxmlraw", "iniziaxmlsetups", "iniziaxrow", "iniziaxrowgroup", "iniziaxtable", "iniziaxtablebody", "iniziaxtablefoot", "iniziaxtablehead", "iniziaxtablenext", "inriga", "installalingua", "intorno", "lettera", "lettere", "lineanera", "lineasottile", "lineatesto", "lineenere", "lineeriempimento", "lineesottili", "lingua", "linguaprincipale", "lunghezzaelenco", "marcatura", "matematica", "menuinterattivo", "mese", "mettielenco", "mettielencocombinato", "mettifiancoafianco", "mettiformula", "mettiingriglia", "mettinotepdp", "mettinotepdplocali", "mettinumeropagina", "mettiregistro", "mettisegnalibro", "mettisottoformula", "mettiunosullaltro", "mostraambientefontdeltesto", "mostracolore", "mostracornice", "mostrafontdeltesto", "mostragriglia", "mostragruppocolori", "mostraimpostazioni", "mostralyout", "mostramakeup", "mostrasetsimboli", "mostrastampa", "mostrastruts", "mostratavolozza", "nascondiblocchi", "nientelineecimafondo", "nientelineintestazionepdp", "nientespazio", "nota", "numeri", "numeriromani", "numeroformula", "numeropagina", "numeropaginacompleto", "numerotesta", "numerotestacorrente", "pagina", "paroladestra", "ped", "pedap", "perlungo", "posizionanumerotesta", "posizionatestotesta", "posizione", "prendibuffer", "prendimarcatura", "prodotto", "progetto", "programma", "pulsante", "pulsantemenu", "pulsantinterazione", "punti", "qualcheriga", "reimpostamarcatura", "rif", "riferimento", "riferimentopagina", "riferimentotesto", "riflessione", "rigariempimento", "rigovuoto", "ruota", "scala", "schermo", "scrividentroelenco", "scriviinelenco", "segnalibro", "selezionablocchi", "settext", "sfondo", "simbolo", "spazifissi", "spazio", "spaziofisso", "spessoreriga", "spezzaoggettomobile", "stackcampi", "stirato", "terminaJScode", "terminaJSpreamble", "terminaLUA", "terminaMP", "terminaMPclip", "terminaMPcode", "terminaMPdefinitions", "terminaMPdrawing", "terminaMPenvironment", "terminaMPextensions", "terminaMPinclusions", "terminaMPinitializations", "terminaMPpage", "terminaMPpositiongraphic", "terminaMPpositionmethod", "terminaMPrun", "terminaPARSEDXML", "terminaTABLE", "terminaTABLEbody", "terminaTABLEfoot", "terminaTABLEhead", "terminaTABLEnext", "terminaTC", "terminaTD", "terminaTDs", "terminaTEX", "terminaTEXpage", "terminaTH", "terminaTN", "terminaTR", "terminaTRs", "terminaTX", "terminaTY", "terminaXML", "terminaalign", "terminaalignment", "terminaallineacentro", "terminaallineadestra", "terminaallineasinistra", "terminaallmodes", "terminaambiente", "terminaappendices", "terminaarrangedpages", "terminaaside", "terminaattachment", "terminabackmatter", "terminabar", "terminabbordermatrix", "terminabitmapimage", "terminablockquote", "terminabodymatter", "terminabordermatrix", "terminaboxedcolumns", "terminabtxlabeltext", "terminabtxrenderingdefinitions", "terminabuffer", "terminacases", "terminacatcodetable", "terminacenteraligned", "terminachapter", "terminacharacteralign", "terminacheckedfences", "terminachemical", "terminachemicaltext", "terminacollect", "terminacollecting", "terminacolore", "terminacolorintent", "terminacoloronly", "terminacolorset", "terminacolumns", "terminacolumnspan", "terminacombination", "terminacomment", "terminacomponenet", "terminacontextcode", "terminacontextdefinitioncode", "terminactxfunction", "terminactxfunctiondefinition", "terminacurrentcolor", "terminacurrentlistentrywrapper", "terminadelimited", "terminadelimitedtext", "terminadisplaymath", "terminadmath", "terminadocument", "terminaeffect", "terminaelement", "terminaelemento", "terminaembeddedxtable", "terminaendnote", "terminaendofline", "terminaexceptions", "terminaexpanded", "terminaexpandedcollect", "terminaextendedcatcodetable", "terminaexternalfigurecollection", "terminafact", "terminafigure", "terminafiguretext", "terminafittingpage", "terminafixed", "terminafloatcombination", "terminafont", "terminafontclass", "terminafontsolution", "terminafootnote", "terminaformula", "terminaformulas", "terminaframedcell", "terminaframedcontent", "terminaframedrow", "terminaframedtable", "terminaframedtext", "terminafrontmatter", "terminagraphictext", "terminagridsnapping", "terminahanging", "terminahbox", "terminahboxestohbox", "terminahboxregister", "terminaheadtext", "terminahelptext", "terminahiding", "terminahighlight", "terminahyphenation", "terminaimath", "terminaimpaccato", "terminaincorniciato", "terminaindentation", "terminaindentedtext", "terminainteraction", "terminainterface", "terminaintermezzotext", "terminaintertext", "terminaitemgroup", "terminaitemgroupcolumns", "terminaitemize", "terminaknockout", "terminalabeltext", "terminalayout", "terminalegend", "terminalinealignment", "terminalineamargine", "terminalineatesto", "terminalinecorrection", "terminalinefiller", "terminalinenumbering", "terminalines", "terminalinetable", "terminalinetablebody", "terminalinetablecell", "terminalinetablehead", "terminalocalfootnotes", "terminalocalheadsetup", "terminalocallinecorrection", "terminalocalnotes", "terminalocalsetups", "terminalua", "terminaluacode", "terminaluaparameterset", "terminaluasetups", "terminamakeup", "terminamarginblock", "terminamarkedcontent", "terminamathalignment", "terminamathcases", "terminamathlabeltext", "terminamathmatrix", "terminamathmode", "terminamathstyle", "terminamatrices", "terminamatrix", "terminamaxaligned", "terminamdformula", "terminamenuinterattivo", "terminamettiformula", "terminamiddlealigned", "terminamiddlemakeup", "terminamixedcolumns", "terminamode", "terminamodeset", "terminamodule", "terminamoduletestsection", "terminampformula", "terminanamedsection", "terminanamedsubformulas", "terminanarrow", "terminanarrower", "terminanegative", "terminanicelyfilledbox", "terminanointerference", "terminanotallmodes", "terminanotext", "terminanotmode", "terminaoperatortext", "terminaopposite", "terminaoutputstream", "terminaoverlay", "terminaoverprint", "terminapagecomment", "terminapagefigure", "terminapagegrid", "terminapagegridspan", "terminapagelayout", "terminapagemakeup", "terminapar", "terminaparagraph", "terminaparagraphs", "terminaparagraphscell", "terminaparbuilder", "terminapart", "terminapath", "terminaplacechemical", "terminaplacefigure", "terminaplacefloat", "terminaplacegraphic", "terminaplaceintermezzo", "terminaplacelegend", "terminaplacepairedbox", "terminaplacetable", "terminapositioning", "terminapositionoverlay", "terminapositive", "terminapostponing", "terminaprefixtext", "terminaprocessassignmentcommand", "terminaprocessassignmentlist", "terminaprocesscommacommand", "terminaprocesscommalist", "terminaprodotto", "terminaprogetto", "terminaprotect", "terminaprotectedcolors", "terminapubblicazione", "terminapunctuation", "terminaquotation", "terminaquote", "terminarandomized", "terminarandomseed", "terminarawsetups", "terminareadingfile", "terminareferenceprefix", "terminaregime", "terminareusableMPgraphic", "terminariga", "terminascript", "terminasdformula", "terminasection", "terminasectionblock", "terminasectionblockenvironment", "terminasectionlevel", "terminasetups", "terminasfondo", "terminashapebox", "terminashift", "terminasidebar", "terminasimplecolumns", "terminaspecialitem", "terminaspeech", "terminaspformula", "terminasplitformula", "terminaspread", "terminastandardmakeup", "terminastartstop", "terminastaticMPfigure", "terminastaticMPgraphic", "terminastrictinspectnextcharacter", "terminastrut", "terminastyle", "terminasubformulas", "terminasubject", "terminasubjectlevel", "terminasubsection", "terminasubsentence", "terminasubstack", "terminasubsubject", "terminasubsubsection", "terminasubsubsubject", "terminasubsubsubsection", "terminasubsubsubsubject", "terminasubsubsubsubsection", "terminasubsubsubsubsubject", "terminasuffixtext", "terminasymbolset", "terminatable", "terminatablehead", "terminatables", "terminatabletail", "terminatabletext", "terminatabulate", "terminatabulatehead", "terminatabulatetail", "terminatagged", "terminataglabeltext", "terminatesta", "terminatexcode", "terminatexdefinition", "terminatext", "terminatextbackground", "terminatextbackgroundmanual", "terminatextcolor", "terminatextcolorintent", "terminatextflow", "terminatextmakeup", "terminatitle", "terminatokens", "terminatransparent", "terminatypescript", "terminatypescriptcollection", "terminatyping", "terminauniqueMPgraphic", "terminauniqueMPpagegraphic", "terminaunittext", "terminaunpacked", "terminausableMPgraphic", "terminauseMPgraphic", "terminausemathstyleparameter", "terminausingbtxspecification", "terminavaia", "terminavbox", "terminavboxregister", "terminavboxtohbox", "terminavboxtohboxseparator", "terminaviewerlayer", "terminavtop", "terminavtopregister", "terminaxcell", "terminaxcellgroup", "terminaxgroup", "terminaxmldisplayverbatim", "terminaxmlinlineverbatim", "terminaxmlraw", "terminaxmlsetups", "terminaxrow", "terminaxrowgroup", "terminaxtable", "terminaxtablebody", "terminaxtablefoot", "terminaxtablehead", "terminaxtablenext", "testonotapdp", "testoriempimento", "tieniblocchi", "traduci", "usaJSscripts", "usaURL", "usablocco", "usacartella", "usacolonnasonoraesterna", "usadocumentoesterno", "usafiguraesterna", "usamodulo", "usasimboli", "usaurl", "vaia", "vaiabox", "vaiapagina", "vaigiu", "valorecolore", "versione" }, + ["nl"]={ "Cijfers", "Kap", "Letter", "Letters", "MAAND", "Romeins", "WEEKDAG", "WOORD", "WOORDEN", "Woord", "Woorden", "achtergrond", "bepaalkopnummer", "bepaallijstkenmerken", "bepaalregisterkenmerken", "bewaarbuffer", "blanko", "blokje", "blokjes", "cijfers", "converteernummer", "copieerveld", "corrigeerwitruimte", "datum", "definieer", "definieeraccent", "definieeralineas", "definieerblok", "definieerbuffer", "definieercombinatie", "definieercommando", "definieerconversie", "definieerfiguursymbool", "definieerfont", "definieerfontstijl", "definieerfontsynoniem", "definieerhbox", "definieeringesprongentext", "definieerinteractiemenu", "definieeritemgroep", "definieerkadertekst", "definieerkarakter", "definieerkleur", "definieerkleurgroep", "definieerkolomovergang", "definieerkop", "definieerkorps", "definieerkorpsomgeving", "definieerlayer", "definieerlayout", "definieerletter", "definieerlijst", "definieermarkering", "definieeromlijnd", "definieeropmaak", "definieeroverlay", "definieerpaginaovergang", "definieerpalet", "definieerpapierformaat", "definieerplaats", "definieerplaatsblok", "definieerprofiel", "definieerprogramma", "definieerreferentie", "definieerreferentieformaat", "definieerregister", "definieersamengesteldelijst", "definieersectie", "definieersectieblok", "definieersorteren", "definieerstartstop", "definieersubveld", "definieersymbool", "definieersynoniemen", "definieertabelvorm", "definieertabulatie", "definieertekst", "definieertekstachtergrond", "definieertype", "definieertypen", "definieerveld", "definieerveldstapel", "definieerwiskundeuitlijnen", "doordefinieren", "doorlabelen", "doornummeren", "dunnelijn", "dunnelijnen", "eenregel", "ergens", "externfiguur", "formulenummer", "gebruikJSscripts", "gebruikURL", "gebruikblokken", "gebruikexterndocument", "gebruikexternfiguur", "gebruikexterngeluidsfragment", "gebruikmodule", "gebruikpad", "gebruiksymbolen", "gebruiktypescript", "gebruiktypescriptfile", "gebruikurl", "geenbovenenonderregels", "geenhoofdenvoetregels", "geenspatie", "grijskleur", "haalbuffer", "haalmarkering", "haarlijn", "handhaafblokken", "hoofdtaal", "hoog", "huidigedatum", "huidigekopnummer", "inlijnd", "inregel", "installeertaal", "interactiebalk", "interactiebuttons", "interactiemenu", "invullijnen", "invulregel", "invultekst", "kleur", "kleurenbalk", "kleurwaarde", "kloonveld", "kolom", "kopnummer", "laag", "laho", "legeregels", "letter", "letters", "lijndikte", "lijstlengte", "maand", "markeer", "naar", "naarbox", "naarpagina", "nokap", "noot", "omgeving", "omlaag", "omlijnd", "onbekend", "onderdeel", "op", "oppagina", "pagina", "paginanummer", "paginareferentie", "paslayoutaan", "passendveld", "plaatsbookmarks", "plaatsformule", "plaatskopnummer", "plaatskoptekst", "plaatslijst", "plaatslijstmetsynoniemen", "plaatslokalevoetnoten", "plaatsnaastelkaar", "plaatsonderelkaar", "plaatsopgrid", "plaatspaginanummer", "plaatsplaatsblok", "plaatsregister", "plaatsruwelijst", "plaatssamengesteldelijst", "plaatssubformule", "plaatsvoetnoten", "positioneer", "produkt", "programma", "projekt", "punten", "refereer", "referentie", "regellinks", "regelmidden", "regelrechts", "resetmarkering", "romeins", "rooster", "roteer", "schaal", "scherm", "schrijfnaarlijst", "schrijftussenlijst", "selecteerblokken", "som", "spatie", "spiegel", "splitsplaatsblok", "startachtergrond", "startinteractiemenu", "startkantlijn", "startkleur", "startkop", "startlokalevoetnoten", "startmargeblok", "startnaar", "startomgeving", "startomlijnd", "startonderdeel", "startopelkaar", "startplaatsformule", "startplaatsplaatsblok", "startprodukt", "startprojekt", "startpublicatie", "startregel", "startregelcorrectie", "startregellinks", "startregelmidden", "startregelrechts", "startsom", "starttekstachtergrond", "starttekstlijn", "startuitlijnen", "stelachtergrondenin", "stelachtergrondin", "stelalineasin", "stelarrangerenin", "stelblankoin", "stelblokin", "stelblokjesin", "stelblokkopjein", "stelblokkopjesin", "stelbovenin", "stelboventekstenin", "stelbufferin", "stelciterenin", "stelclipin", "stelcommentaarin", "steldoordefinierenin", "steldoornummerenin", "steldunnelijnenin", "stelformulein", "stelformulesin", "stelformulierenin", "stelhoofdin", "stelhoofdtekstenin", "stelingesprongentextin", "stelinmargein", "stelinspringenin", "stelinteractiebalkin", "stelinteractiein", "stelinteractiemenuin", "stelinteractieschermin", "stelinterliniein", "stelinvullijnenin", "stelinvulregelsin", "stelitemgroepin", "stelitemsin", "stelkadertekstenin", "stelkadertekstin", "stelkantlijnin", "stelkapitalenin", "stelkleurenin", "stelkleurin", "stelkolommenin", "stelkopin", "stelkopnummerin", "stelkoppeltekenin", "stelkoppenin", "stelkorpsin", "stellayoutin", "stellijndiktein", "stellijstin", "stelmargeblokkenin", "stelmarkeringin", "stelnaastplaatsenin", "stelomlijndin", "stelonderin", "stelondertekstenin", "stelopmaakin", "stelopsommingenin", "stelpaginacommentaarin", "stelpaginanummerin", "stelpaginanummeringin", "stelpaginaovergangenin", "stelpaletin", "stelpapierformaatin", "stelpapierin", "stelparagraafnummerenin", "stelplaatsblokin", "stelplaatsblokkenin", "stelplaatsbloksplitsenin", "stelplaatsin", "stelpositionerenin", "stelprogrammasin", "stelrefererenin", "stelregelnummerenin", "stelregelsin", "stelregisterin", "stelroterenin", "stelsamengesteldelijstin", "stelsectieblokin", "stelsmallerin", "stelsorterenin", "stelspatieringin", "stelstartstopin", "stelsubpaginanummerin", "stelsymboolsetin", "stelsynoniemenin", "steltaalin", "steltabellenin", "steltabulatiein", "steltekstachtergrondin", "steltekstin", "steltekstinhoudin", "steltekstlijnenin", "stelteksttekstenin", "steltolerantiein", "steltypein", "steltypenin", "steluitlijnenin", "stelurlin", "stelveldenin", "stelveldin", "stelvoetin", "stelvoettekstenin", "stelwiskundeuitlijnenin", "stelwitruimtein", "stopachtergrond", "stopinteractiemenu", "stopkantlijn", "stopkleur", "stopkop", "stoplokalevoetnoten", "stopmargeblok", "stopnaar", "stopomgeving", "stopomlijnd", "stoponderdeel", "stopopelkaar", "stopplaatsformule", "stopplaatsplaatsblok", "stopprodukt", "stopprojekt", "stoppublicatie", "stopregel", "stopregelcorrectie", "stopregellinks", "stopregelmidden", "stopregelrechts", "stopsom", "stoptekstachtergrond", "stoptekstlijn", "stopuitlijnen", "subpaginanummer", "switchnaarkorps", "symbool", "taal", "tekstlijn", "tekstreferentie", "testkolom", "testpagina", "toelichting", "toongrid", "tooninstellingen", "toonkader", "toonkleur", "toonkleurgroep", "toonkorps", "toonkorpsomgeving", "toonlayout", "toonopmaak", "toonpalet", "toonprint", "toonstruts", "toonsymboolset", "uit", "uitgerekt", "vastespatie", "vastespaties", "veld", "veldstapel", "verbergblokken", "vergelijkkleurgroep", "vergelijkpalet", "versie", "vertaal", "verwerkblokken", "voetnoottekst", "volledigepaginanummer", "volledigregister", "voluit", "weekdag", "wiskunde", "woordrechts" }, + ["pe"]={ "آیتم", "آیتمها", "آینه", "از", "استفادهبلوکها", "استفادهدستخطتایپ", "استفادهشکلخارجی", "استفادهقطعهموزیکخارجی", "استفادهمدول", "استفادهمسیر", "استفادهنمادها", "استفادهنوشتارخارجی", "استفادهپروندهدستخطتایپ", "اعدادلاتین", "افزودن", "انتخاببلوکها", "بارگذاریآرایش", "بارگذاریآیتمها", "بارگذاریارجاع", "بارگذاریاندازهبرگ", "بارگذاریباریکتر", "بارگذاریبافر", "بارگذاریبالا", "بارگذاریبردباری", "بارگذاریبرنامهها", "بارگذاریبرگ", "بارگذاریبلوک", "بارگذاریبلوکبخش", "بارگذاریتایپ", "بارگذاریتایپکردن", "بارگذاریترتیب", "بارگذاریتنظیم", "بارگذاریتنظیمریاضی", "بارگذاریتهبرگ", "بارگذاریتورفتگی", "بارگذاریتوضیح", "بارگذاریتوضیحصفحه", "بارگذاریثبت", "بارگذاریجانشانی", "بارگذاریجدولها", "بارگذاریجدولبندی", "بارگذاریخالی", "بارگذاریخطها", "بارگذاریخطهایحاشیه", "بارگذاریخطهایسیاه", "بارگذاریخطهایمتن", "بارگذاریخطهاینازک", "بارگذاریدرجدرخطها", "بارگذاریدرجمخالف", "بارگذاریدوران", "بارگذاریرنگ", "بارگذاریرنگها", "بارگذاریزبان", "بارگذاریستونها", "بارگذاریسر", "بارگذاریسربرگ", "بارگذاریسرها", "بارگذاریشرح", "بارگذاریشرحها", "بارگذاریشروعپایان", "بارگذاریشمارهزیرصفحه", "بارگذاریشمارهسر", "بارگذاریشمارهصفحه", "بارگذاریشمارهگذاریها", "بارگذاریشمارهگذاریصفحه", "بارگذاریشمارهگذاریپاراگراف", "بارگذاریشمارهگذاریخط", "بارگذاریشناور", "بارگذاریشناورها", "بارگذاریشکافتنشناورها", "بارگذاریطرح", "بارگذاریطرحبندی", "بارگذاریعرضخط", "بارگذاریفاصلهبینخط", "بارگذاریفرمولها", "بارگذاریفضایسفید", "بارگذاریفضاگذاری", "بارگذاریقالبی", "بارگذاریقلممتن", "بارگذاریلوح", "بارگذاریلیست", "بارگذاریلیستترکیبی", "بارگذاریمترادفها", "بارگذاریمتن", "بارگذاریمتنهایبالا", "بارگذاریمتنسربرگ", "بارگذاریمتنقالبی", "بارگذاریمتنمتنها", "بارگذاریمتنپانوشت", "بارگذاریمتنپایین", "بارگذاریمجموعهنماد", "بارگذاریمنویپانل", "بارگذاریمکانگذاری", "بارگذاریمیدان", "بارگذاریمیدانها", "بارگذاریمیلهپانل", "بارگذارینشانهشکستن", "بارگذارینشانهگذاری", "بارگذارینقل", "بارگذاریپاراگرافها", "بارگذاریپانل", "بارگذاریپایین", "بارگذاریپردهپانل", "بارگذاریپرکردنخطها", "بارگذاریپسزمینه", "بارگذاریپسزمینهها", "بارگذاریچیدن", "بارگذاریگذارصفحه", "بارگذاریگروههایآیتم", "بارگذاریگروهآیتم", "بازنشانینشانهگذاری", "بدونخطبالاوپایین", "بدونخطسروتهبرگ", "بدونفضا", "برنامه", "بروبه", "بروبهجعبه", "بروبهصفحه", "بروپایین", "بلند", "بلوکهایپردازش", "بلوکهاپنهان", "بنویسبینلیست", "بنویسدرلیست", "تاریخ", "تاریخجاری", "تایپ", "تایپبافر", "تایپپرونده", "ترجمه", "تعریف", "تعریفآرایش", "تعریفالگویجدول", "تعریفاندازهبرگ", "تعریفبافر", "تعریفبخش", "تعریفبرنامه", "تعریفبرچسب", "تعریفبلوک", "تعریفبلوکبخش", "تعریفتایپ", "تعریفتایپکردن", "تعریفتبدیل", "تعریفترتیب", "تعریفترکیب", "تعریفتنظیمریاضی", "تعریفتودهمیدان", "تعریفثبت", "تعریفجانشانی", "تعریفجدولبندی", "تعریفجعبهافقی", "تعریفحرف", "تعریفرنگ", "تعریفزیرمیدان", "تعریفسبک", "تعریفسبکقلم", "تعریفسر", "تعریفشرح", "تعریفشروعپایان", "تعریفشمارهبندی", "تعریفشمایلمرجع", "تعریفشناور", "تعریفشکستنستون", "تعریفشکستصفحه", "تعریفطرحبندی", "تعریففرمان", "تعریفقالبی", "تعریفقلم", "تعریفقلممتن", "تعریفلایه", "تعریفلهجه", "تعریفلوح", "تعریفلیست", "تعریفلیستترکیبی", "تعریفمترادفها", "تعریفمترادفقلم", "تعریفمتن", "تعریفمتنقالبی", "تعریفمحیطقلمبدنه", "تعریفمرجع", "تعریفمنویپانل", "تعریفمیدان", "تعریفنشانهگذاری", "تعریفنماد", "تعریفنمادشکل", "تعریفپاراگرافها", "تعریفپروفایل", "تعریفپوشش", "تعریفگروهآیتم", "تعریفگروهرنگ", "تعیینشمارهسر", "تعیینمحتوایمتن", "تعیینمشخصاتثبت", "تعیینمشخصاتلیست", "تغییربهقلمبدنه", "تنظیمراست", "تنظیمطرحبندی", "تنظیموسط", "توجه", "توری", "تولید", "تک", "ثبتکامل", "حرف", "حرفها", "حفظبلوکها", "خالی", "خطهایسیاه", "خطهاینازک", "خطهاخالی", "خطسیاه", "خطمتن", "خطمو", "خطنازک", "خا", "خع", "در", "درجثبت", "درجدرخط", "درجدرخطها", "درجدرمتن", "درجدربالاییکدیگر", "درجدرتوری", "درجزیرفرمول", "درجشمارهسر", "درجشمارهصفحه", "درجشناور", "درجفرمول", "درجلیست", "درجلیستخام", "درجلیستمختلط", "درجمتنسر", "درجپانوشتها", "درجپانوشتهایموضعی", "درجچوبخط", "درجکناربهکنار", "درخط", "درصفحه", "درقالبی", "درمورد", "درون", "درپر", "دریافتبافر", "دریافتنشانه", "دوران", "دکمه", "دکمهمنو", "دکمهپانل", "رج", "رنگ", "رنگخاکستری", "روزهفته", "ریاضی", "زبان", "زباناصلی", "ستون", "ستونامتحان", "سرپوشکوچکنه", "شروعJScode", "شروعJSpreamble", "شروعLUA", "شروعMP", "شروعMPclip", "شروعMPcode", "شروعMPdefinitions", "شروعMPdrawing", "شروعMPenvironment", "شروعMPextensions", "شروعMPinclusions", "شروعMPinitializations", "شروعMPpage", "شروعMPpositiongraphic", "شروعMPpositionmethod", "شروعMPrun", "شروعPARSEDXML", "شروعTABLE", "شروعTABLEbody", "شروعTABLEfoot", "شروعTABLEhead", "شروعTABLEnext", "شروعTC", "شروعTD", "شروعTDs", "شروعTEX", "شروعTEXpage", "شروعTH", "شروعTN", "شروعTR", "شروعTRs", "شروعTX", "شروعTY", "شروعXML", "شروعalign", "شروعalignment", "شروعallmodes", "شروعappendices", "شروعarrangedpages", "شروعaside", "شروعattachment", "شروعbackmatter", "شروعbar", "شروعbbordermatrix", "شروعbitmapimage", "شروعblockquote", "شروعbodymatter", "شروعbordermatrix", "شروعboxedcolumns", "شروعbtxlabeltext", "شروعbtxrenderingdefinitions", "شروعbuffer", "شروعcases", "شروعcatcodetable", "شروعcenteraligned", "شروعchapter", "شروعcharacteralign", "شروعcheckedfences", "شروعchemical", "شروعchemicaltext", "شروعcollect", "شروعcollecting", "شروعcolorintent", "شروعcoloronly", "شروعcolorset", "شروعcolumns", "شروعcolumnspan", "شروعcombination", "شروعcomment", "شروعcontextcode", "شروعcontextdefinitioncode", "شروعctxfunction", "شروعctxfunctiondefinition", "شروعcurrentcolor", "شروعcurrentlistentrywrapper", "شروعdelimited", "شروعdelimitedtext", "شروعdisplaymath", "شروعdmath", "شروعdocument", "شروعeffect", "شروعelement", "شروعembeddedxtable", "شروعendnote", "شروعendofline", "شروعexceptions", "شروعexpanded", "شروعexpandedcollect", "شروعextendedcatcodetable", "شروعexternalfigurecollection", "شروعfact", "شروعfigure", "شروعfiguretext", "شروعfittingpage", "شروعfixed", "شروعfloatcombination", "شروعfont", "شروعfontclass", "شروعfontsolution", "شروعfootnote", "شروعformula", "شروعformulas", "شروعframedcell", "شروعframedcontent", "شروعframedrow", "شروعframedtable", "شروعframedtext", "شروعfrontmatter", "شروعgraphictext", "شروعgridsnapping", "شروعhanging", "شروعhbox", "شروعhboxestohbox", "شروعhboxregister", "شروعheadtext", "شروعhelptext", "شروعhiding", "شروعhighlight", "شروعhyphenation", "شروعimath", "شروعindentation", "شروعindentedtext", "شروعinteraction", "شروعinterface", "شروعintermezzotext", "شروعintertext", "شروعitemgroup", "شروعitemgroupcolumns", "شروعitemize", "شروعknockout", "شروعlabeltext", "شروعlayout", "شروعlegend", "شروعlinealignment", "شروعlinecorrection", "شروعlinefiller", "شروعlinenumbering", "شروعlines", "شروعlinetable", "شروعlinetablebody", "شروعlinetablecell", "شروعlinetablehead", "شروعlocalfootnotes", "شروعlocalheadsetup", "شروعlocallinecorrection", "شروعlocalnotes", "شروعlocalsetups", "شروعlua", "شروعluacode", "شروعluaparameterset", "شروعluasetups", "شروعmakeup", "شروعmarginblock", "شروعmarkedcontent", "شروعmathalignment", "شروعmathcases", "شروعmathlabeltext", "شروعmathmatrix", "شروعmathmode", "شروعmathstyle", "شروعmatrices", "شروعmatrix", "شروعmaxaligned", "شروعmdformula", "شروعmiddlealigned", "شروعmiddlemakeup", "شروعmixedcolumns", "شروعmode", "شروعmodeset", "شروعmodule", "شروعmoduletestsection", "شروعmpformula", "شروعnamedsection", "شروعnamedsubformulas", "شروعnarrow", "شروعnarrower", "شروعnegative", "شروعnicelyfilledbox", "شروعnointerference", "شروعnotallmodes", "شروعnotext", "شروعnotmode", "شروعoperatortext", "شروعopposite", "شروعoutputstream", "شروعoverlay", "شروعoverprint", "شروعpagecomment", "شروعpagefigure", "شروعpagegrid", "شروعpagegridspan", "شروعpagelayout", "شروعpagemakeup", "شروعpar", "شروعparagraph", "شروعparagraphs", "شروعparagraphscell", "شروعparbuilder", "شروعpart", "شروعpath", "شروعplacechemical", "شروعplacefigure", "شروعplacegraphic", "شروعplaceintermezzo", "شروعplacelegend", "شروعplacepairedbox", "شروعplacetable", "شروعpositioning", "شروعpositionoverlay", "شروعpositive", "شروعpostponing", "شروعprefixtext", "شروعprocessassignmentcommand", "شروعprocessassignmentlist", "شروعprocesscommacommand", "شروعprocesscommalist", "شروعprotect", "شروعprotectedcolors", "شروعpunctuation", "شروعquotation", "شروعquote", "شروعrandomized", "شروعrandomseed", "شروعrawsetups", "شروعreadingfile", "شروعreferenceprefix", "شروعregime", "شروعreusableMPgraphic", "شروعscript", "شروعsdformula", "شروعsection", "شروعsectionblock", "شروعsectionblockenvironment", "شروعsectionlevel", "شروعsetups", "شروعshapebox", "شروعshift", "شروعsidebar", "شروعsimplecolumns", "شروعspecialitem", "شروعspeech", "شروعspformula", "شروعsplitformula", "شروعspread", "شروعstandardmakeup", "شروعstartstop", "شروعstaticMPfigure", "شروعstaticMPgraphic", "شروعstrictinspectnextcharacter", "شروعstrut", "شروعstyle", "شروعsubformulas", "شروعsubject", "شروعsubjectlevel", "شروعsubsection", "شروعsubsentence", "شروعsubstack", "شروعsubsubject", "شروعsubsubsection", "شروعsubsubsubject", "شروعsubsubsubsection", "شروعsubsubsubsubject", "شروعsubsubsubsubsection", "شروعsubsubsubsubsubject", "شروعsuffixtext", "شروعsymbolset", "شروعtable", "شروعtablehead", "شروعtables", "شروعtabletail", "شروعtabletext", "شروعtabulate", "شروعtabulatehead", "شروعtabulatetail", "شروعtagged", "شروعtaglabeltext", "شروعtexcode", "شروعtexdefinition", "شروعtext", "شروعtextbackground", "شروعtextbackgroundmanual", "شروعtextcolor", "شروعtextcolorintent", "شروعtextflow", "شروعtextmakeup", "شروعtitle", "شروعtokens", "شروعtransparent", "شروعtypescript", "شروعtypescriptcollection", "شروعtyping", "شروعuniqueMPgraphic", "شروعuniqueMPpagegraphic", "شروعunittext", "شروعunpacked", "شروعusableMPgraphic", "شروعuseMPgraphic", "شروعusemathstyleparameter", "شروعusingbtxspecification", "شروعvbox", "شروعvboxregister", "شروعvboxtohbox", "شروعvboxtohboxseparator", "شروعviewerlayer", "شروعvtop", "شروعvtopregister", "شروعxcell", "شروعxcellgroup", "شروعxgroup", "شروعxmldisplayverbatim", "شروعxmlinlineverbatim", "شروعxmlraw", "شروعxmlsetups", "شروعxrow", "شروعxrowgroup", "شروعxtable", "شروعxtablebody", "شروعxtablefoot", "شروعxtablehead", "شروعxtablenext", "شروعآیتم", "شروعبروبه", "شروعتنظیمراست", "شروعتنظیموسط", "شروعتولید", "شروعخطحاشیه", "شروعخطمتن", "شروعدرجشناور", "شروعدرجفرمول", "شروعرنگ", "شروعسر", "شروعفشرده", "شروعقالبی", "شروعمحیط", "شروعمنویپانل", "شروعمولفه", "شروعنشر", "شروعپروژه", "شروعپسزمینه", "شروعچپچین", "شروعخط", "شمارهزیرصفحه", "شمارهسر", "شمارهسرجاری", "شمارهصفحه", "شمارهصفحهکامل", "شمارهفرمول", "شمارهمبدل", "شمارهها", "شکافتنشناور", "شکلخارجی", "صفحه", "صفحهتست", "طوللیست", "عرضخط", "فضا", "فضاهایثابت", "فضایثابت", "فضایسفیدصحیح", "قالبی", "لوحمقایسه", "ماه", "متنپانوشت", "محیط", "مراجعه", "مرجع", "مرجعصفحه", "مرجعمتن", "مقایسهگروهرنگ", "مقداررنگ", "مقیاس", "منویپانل", "مولفه", "مکان", "میدان", "میدانشبیهسازی", "میدانپشته", "میدانکپی", "میلهرنگ", "میلهپانل", "ناشناس", "نسخه", "نشانهگذاری", "نصبزبان", "نقطهها", "نماد", "نمایشآرایش", "نمایشبارگذاریها", "نمایشبستها", "نمایشتوری", "نمایشرنگ", "نمایشطرحبندی", "نمایشقالب", "نمایشقلمبدنه", "نمایشلوح", "نمایشمجموعهعلامت", "نمایشمحیطقلمبدنه", "نمایشچاپ", "نمایشگروهرنگ", "پابا", "پایانJScode", "پایانJSpreamble", "پایانLUA", "پایانMP", "پایانMPclip", "پایانMPcode", "پایانMPdefinitions", "پایانMPdrawing", "پایانMPenvironment", "پایانMPextensions", "پایانMPinclusions", "پایانMPinitializations", "پایانMPpage", "پایانMPpositiongraphic", "پایانMPpositionmethod", "پایانMPrun", "پایانPARSEDXML", "پایانTABLE", "پایانTABLEbody", "پایانTABLEfoot", "پایانTABLEhead", "پایانTABLEnext", "پایانTC", "پایانTD", "پایانTDs", "پایانTEX", "پایانTEXpage", "پایانTH", "پایانTN", "پایانTR", "پایانTRs", "پایانTX", "پایانTY", "پایانXML", "پایانalign", "پایانalignment", "پایانallmodes", "پایانappendices", "پایانarrangedpages", "پایانaside", "پایانattachment", "پایانbackmatter", "پایانbar", "پایانbbordermatrix", "پایانbitmapimage", "پایانblockquote", "پایانbodymatter", "پایانbordermatrix", "پایانboxedcolumns", "پایانbtxlabeltext", "پایانbtxrenderingdefinitions", "پایانbuffer", "پایانcases", "پایانcatcodetable", "پایانcenteraligned", "پایانchapter", "پایانcharacteralign", "پایانcheckedfences", "پایانchemical", "پایانchemicaltext", "پایانcollect", "پایانcollecting", "پایانcolorintent", "پایانcoloronly", "پایانcolorset", "پایانcolumns", "پایانcolumnspan", "پایانcombination", "پایانcomment", "پایانcontextcode", "پایانcontextdefinitioncode", "پایانctxfunction", "پایانctxfunctiondefinition", "پایانcurrentcolor", "پایانcurrentlistentrywrapper", "پایانdelimited", "پایانdelimitedtext", "پایانdisplaymath", "پایانdmath", "پایانdocument", "پایانeffect", "پایانelement", "پایانembeddedxtable", "پایانendnote", "پایانendofline", "پایانexceptions", "پایانexpanded", "پایانexpandedcollect", "پایانextendedcatcodetable", "پایانexternalfigurecollection", "پایانfact", "پایانfigure", "پایانfiguretext", "پایانfittingpage", "پایانfixed", "پایانfloatcombination", "پایانfont", "پایانfontclass", "پایانfontsolution", "پایانfootnote", "پایانformula", "پایانformulas", "پایانframedcell", "پایانframedcontent", "پایانframedrow", "پایانframedtable", "پایانframedtext", "پایانfrontmatter", "پایانgraphictext", "پایانgridsnapping", "پایانhanging", "پایانhbox", "پایانhboxestohbox", "پایانhboxregister", "پایانheadtext", "پایانhelptext", "پایانhiding", "پایانhighlight", "پایانhyphenation", "پایانimath", "پایانindentation", "پایانindentedtext", "پایانinteraction", "پایانinterface", "پایانintermezzotext", "پایانintertext", "پایانitemgroup", "پایانitemgroupcolumns", "پایانitemize", "پایانknockout", "پایانlabeltext", "پایانlayout", "پایانlegend", "پایانlinealignment", "پایانlinecorrection", "پایانlinefiller", "پایانlinenumbering", "پایانlines", "پایانlinetable", "پایانlinetablebody", "پایانlinetablecell", "پایانlinetablehead", "پایانlocalfootnotes", "پایانlocalheadsetup", "پایانlocallinecorrection", "پایانlocalnotes", "پایانlocalsetups", "پایانlua", "پایانluacode", "پایانluaparameterset", "پایانluasetups", "پایانmakeup", "پایانmarginblock", "پایانmarkedcontent", "پایانmathalignment", "پایانmathcases", "پایانmathlabeltext", "پایانmathmatrix", "پایانmathmode", "پایانmathstyle", "پایانmatrices", "پایانmatrix", "پایانmaxaligned", "پایانmdformula", "پایانmiddlealigned", "پایانmiddlemakeup", "پایانmixedcolumns", "پایانmode", "پایانmodeset", "پایانmodule", "پایانmoduletestsection", "پایانmpformula", "پایانnamedsection", "پایانnamedsubformulas", "پایانnarrow", "پایانnarrower", "پایانnegative", "پایانnicelyfilledbox", "پایانnointerference", "پایانnotallmodes", "پایانnotext", "پایانnotmode", "پایانoperatortext", "پایانopposite", "پایانoutputstream", "پایانoverlay", "پایانoverprint", "پایانpagecomment", "پایانpagefigure", "پایانpagegrid", "پایانpagegridspan", "پایانpagelayout", "پایانpagemakeup", "پایانpar", "پایانparagraph", "پایانparagraphs", "پایانparagraphscell", "پایانparbuilder", "پایانpart", "پایانpath", "پایانplacechemical", "پایانplacefigure", "پایانplacegraphic", "پایانplaceintermezzo", "پایانplacelegend", "پایانplacepairedbox", "پایانplacetable", "پایانpositioning", "پایانpositionoverlay", "پایانpositive", "پایانpostponing", "پایانprefixtext", "پایانprocessassignmentcommand", "پایانprocessassignmentlist", "پایانprocesscommacommand", "پایانprocesscommalist", "پایانprotect", "پایانprotectedcolors", "پایانpunctuation", "پایانquotation", "پایانquote", "پایانrandomized", "پایانrandomseed", "پایانrawsetups", "پایانreadingfile", "پایانreferenceprefix", "پایانregime", "پایانreusableMPgraphic", "پایانscript", "پایانsdformula", "پایانsection", "پایانsectionblock", "پایانsectionblockenvironment", "پایانsectionlevel", "پایانsetups", "پایانshapebox", "پایانshift", "پایانsidebar", "پایانsimplecolumns", "پایانspecialitem", "پایانspeech", "پایانspformula", "پایانsplitformula", "پایانspread", "پایانstandardmakeup", "پایانstartstop", "پایانstaticMPfigure", "پایانstaticMPgraphic", "پایانstrictinspectnextcharacter", "پایانstrut", "پایانstyle", "پایانsubformulas", "پایانsubject", "پایانsubjectlevel", "پایانsubsection", "پایانsubsentence", "پایانsubstack", "پایانsubsubject", "پایانsubsubsection", "پایانsubsubsubject", "پایانsubsubsubsection", "پایانsubsubsubsubject", "پایانsubsubsubsubsection", "پایانsubsubsubsubsubject", "پایانsuffixtext", "پایانsymbolset", "پایانtable", "پایانtablehead", "پایانtables", "پایانtabletail", "پایانtabletext", "پایانtabulate", "پایانtabulatehead", "پایانtabulatetail", "پایانtagged", "پایانtaglabeltext", "پایانtexcode", "پایانtexdefinition", "پایانtext", "پایانtextbackground", "پایانtextbackgroundmanual", "پایانtextcolor", "پایانtextcolorintent", "پایانtextflow", "پایانtextmakeup", "پایانtitle", "پایانtokens", "پایانtransparent", "پایانtypescript", "پایانtypescriptcollection", "پایانtyping", "پایانuniqueMPgraphic", "پایانuniqueMPpagegraphic", "پایانunittext", "پایانunpacked", "پایانusableMPgraphic", "پایانuseMPgraphic", "پایانusemathstyleparameter", "پایانusingbtxspecification", "پایانvbox", "پایانvboxregister", "پایانvboxtohbox", "پایانvboxtohboxseparator", "پایانviewerlayer", "پایانvtop", "پایانvtopregister", "پایانxcell", "پایانxcellgroup", "پایانxgroup", "پایانxmldisplayverbatim", "پایانxmlinlineverbatim", "پایانxmlraw", "پایانxmlsetups", "پایانxrow", "پایانxrowgroup", "پایانxtable", "پایانxtablebody", "پایانxtablefoot", "پایانxtablehead", "پایانxtablenext", "پایانآیتم", "پایانبروبه", "پایانتنظیمراست", "پایانتنظیموسط", "پایانتولید", "پایانخطحاشیه", "پایانخطمتن", "پایاندرجشناور", "پایاندرجفرمول", "پایانرنگ", "پایانسر", "پایانفشرده", "پایانقالبی", "پایانمحیط", "پایانمنویپانل", "پایانمولفه", "پایاننشر", "پایانپروژه", "پایانپسزمینه", "پایانچپچین", "پایانخط", "پایین", "پرده", "پروژه", "پرکردنمیدان", "پسزمینه", "چوبخط", "چپچین", "کشیده", "کلمهراست", "گیره", "یادداشت", "یکجا", "یکخط" }, + ["ro"]={ "CUVANT", "CUVINTE", "Cuvant", "Cuvinte", "Kap", "LUNA", "Litera", "Litere", "Numere", "Numereromane", "ZIDINSAPTAMANA", "adapteazaaspect", "adubuffer", "adumarcaje", "afiseazaaspect", "afiseazaculoare", "afiseazafonttext", "afiseazagrid", "afiseazagrupculoare", "afiseazamakeup", "afiseazamediufonttext", "afiseazapaleta", "afiseazarama", "afiseazasetari", "afiseazasetsimboluri", "afiseazastruts", "afiseazatiparire", "aliniatcentru", "aliniatdreapta", "aliniatstanga", "ascundeblocuri", "baraculoare", "barainteractiune", "blanc", "butoaneinteractiune", "buton", "butonmeniu", "camp", "cloneazacamp", "coloana", "comparagrupculoare", "comparapaleta", "completeazanumarpagina", "componenta", "convertestenumar", "copiazacamp", "corecteazaspatiualb", "culoare", "culoaregri", "cuvantdreapta", "data", "datacurenta", "defineste", "definesteaccent", "definesteantet", "definestebloc", "definesteblocsectiune", "definestebuffer", "definestecamp", "definestecaracter", "definestecomanda", "definesteconversie", "definesteculoare", "definestedescriere", "definestedimensiunehartie", "definesteenumerare", "definesteeticheta", "definestefloat", "definestefont", "definestefonttext", "definesteformatreferinte", "definestegrupculori", "definestehbox", "definesteinconjurare", "definestelista", "definestelistacombinata", "definestemakeup", "definestemarcaje", "definestemediulfonttext", "definestemeniuinteractiune", "definesteoverlay", "definestepaleta", "definesteparagraf", "definesteprofil", "definesteprogram", "definestereferinte", "definesteregistru", "definestesablontabel", "definestesectiune", "definestesimbol", "definestesimbolfigura", "definestesinonim", "definestesinonimfont", "definestesortare", "definestestartstop", "definestestil", "definestestilfont", "definestestivacampuri", "definestesubcamp", "definestetabulatori", "definestetext", "definestetexteinconjurate", "definestetextinconjurat", "definestetyping", "despre", "determinacaracteristicilelistei", "determinacaracteristiciregistru", "determinanumartitlu", "din", "dute", "dutebox", "dutepagina", "ecran", "element", "faraliniiantetsisubsol", "faraliniisussijos", "faraspatiu", "figuraexterna", "firdepar", "folosesteURL", "folosestebloc", "folosestedirector", "folosestedocumentextern", "folosestefiguraexterna", "folosestemodul", "folosestemuzicaexterna", "folosestescriptJS", "folosestesimboluri", "folosesteurl", "fundal", "grosimelinie", "impartefloat", "inalt", "injos", "inlinie", "instalarelimba", "intins", "jos", "jossus", "la", "lapagina", "limba", "limbaprincipala", "linieneagra", "liniesubtire", "linieumplere", "liniinegre", "liniisubtiri", "litera", "litere", "luna", "lungimelista", "marcaje", "matematica", "mediu", "meniuinteractiune", "necunoscut", "nokap", "nota", "numarformula", "numarpagina", "numartitlu", "numartitlucurent", "numere", "numereromane", "olinie", "pagina", "pastreazablocuri", "pelung", "plaseazapegrid", "plaseazasemnecarte", "potrivestecamp", "pozitie", "proceseazabloc", "produs", "proiect", "puncte", "punedeasuprafiecareia", "punefatainfata", "puneformula", "punelista", "punelistacombinata", "punenotesubsol", "punenotesubsollocale", "punenumarpagina", "puneregistru", "punesubformula", "referinta", "referintapagina", "referintatext", "reflexie", "remarca", "reseteazamarcaje", "riglatext", "rigleumplere", "roteste", "scala", "scriebuffer", "scrieinlista", "scrieintreliste", "selecteazablocuri", "semncarte", "setareitemization", "setarelimba", "setarepozitie", "seteazaaliniat", "seteazaalinierea", "seteazaantet", "seteazaaranjareapag", "seteazaaspect", "seteazabarainteractiune", "seteazablanc", "seteazabloc", "seteazablocsectiune", "seteazabuffer", "seteazacamp", "seteazacampuri", "seteazaclipping", "seteazacoloane", "seteazacomentariu", "seteazacomentariupagina", "seteazaculoare", "seteazaculori", "seteazadimensiunihartie", "seteazaecraninteractiune", "seteazaelemente", "seteazaenumerare", "seteazafloat", "seteazafloats", "seteazafonttext", "seteazaformulare", "seteazaformule", "seteazafundal", "seteazafundaluri", "seteazagrosimelinie", "seteazaimpartireafloat", "seteazainconjurat", "seteazaingust", "seteazainteractiunea", "seteazajos", "seteazalegenda", "seteazalegendele", "seteazaliniesilabe", "seteazaliniesubtire", "seteazalinii", "seteazaliniimargine", "seteazaliniinegre", "seteazaliniiumplere", "seteazalista", "seteazalistacombinata", "seteazamajuscule", "seteazamakeup", "seteazamarcaje", "seteazameniuinteractiune", "seteazaminicitat", "seteazanumarpagina", "seteazanumarsubpagina", "seteazanumartitlu", "seteazanumerotarelinii", "seteazanumerotarepagina", "seteazanumerotareparagrafe", "seteazapaleta", "seteazaparagrafe", "seteazaplasareaopozita", "seteazaprograme", "seteazareferinte", "seteazaregistru", "seteazarigletext", "seteazarigleumplere", "seteazarotare", "seteazasimbol", "seteazasinonime", "seteazasortare", "seteazaspatiu", "seteazaspatiualb", "seteazaspatiuinterliniar", "seteazasubsol", "seteazasus", "seteazatabele", "seteazatabulatori", "seteazatext", "seteazatexteantet", "seteazatextejos", "seteazatextesubsol", "seteazatextesus", "seteazatextetext", "seteazatitlu", "seteazatitluri", "seteazatoleranta", "seteazatranzitiepagina", "seteazatype", "seteazatyping", "seteazaurl", "simbol", "spatiifixate", "spatiu", "spatiufixat", "startaliniatcentru", "startaliniatdreapta", "startaliniatstanga", "startcomponenta", "startculoare", "startdute", "startfundal", "startimpachetat", "startlinie", "startliniemargine", "startmediu", "startmeniuinteractiune", "startprodus", "startproiect", "startpublicatie", "startpuneformula", "startriglatext", "starttitlu", "stivacampuri", "stopaliniatcentru", "stopaliniatdreapta", "stopaliniatstanga", "stopcomponenta", "stopculoare", "stopdute", "stopfundal", "stopimpachetat", "stoplinie", "stopliniemargine", "stopmediu", "stopmeniuinteractiune", "stopprodus", "stopproiect", "stoppublicatie", "stoppuneformula", "stopriglatext", "stoptitlu", "textumplere", "traduce", "trecilafonttext", "undeva", "valoareculoare", "versiune", "zidinsaptamana" }, }
\ No newline at end of file diff --git a/context/data/textadept/context/data/scite-context-data-metafun.lua b/context/data/textadept/context/data/scite-context-data-metafun.lua index 5c061e039..b577c8aee 100644 --- a/context/data/textadept/context/data/scite-context-data-metafun.lua +++ b/context/data/textadept/context/data/scite-context-data-metafun.lua @@ -1,4 +1,4 @@ return { - ["commands"]={ "loadmodule", "dispose", "nothing", "transparency", "tolist", "topath", "tocycle", "sqr", "log", "ln", "exp", "inv", "pow", "pi", "radian", "tand", "cotd", "sin", "cos", "tan", "cot", "atan", "asin", "acos", "invsin", "invcos", "invtan", "acosh", "asinh", "sinh", "cosh", "zmod", "paired", "tripled", "unitcircle", "fulldiamond", "unitdiamond", "fullsquare", "unittriangle", "fulltriangle", "llcircle", "lrcircle", "urcircle", "ulcircle", "tcircle", "bcircle", "lcircle", "rcircle", "lltriangle", "lrtriangle", "urtriangle", "ultriangle", "uptriangle", "downtriangle", "lefttriangle", "righttriangle", "triangle", "smoothed", "cornered", "superellipsed", "randomized", "randomizedcontrols", "squeezed", "enlonged", "shortened", "punked", "curved", "unspiked", "simplified", "blownup", "stretched", "enlarged", "leftenlarged", "topenlarged", "rightenlarged", "bottomenlarged", "crossed", "laddered", "randomshifted", "interpolated", "paralleled", "cutends", "peepholed", "llenlarged", "lrenlarged", "urenlarged", "ulenlarged", "llmoved", "lrmoved", "urmoved", "ulmoved", "rightarrow", "leftarrow", "centerarrow", "boundingbox", "innerboundingbox", "outerboundingbox", "pushboundingbox", "popboundingbox", "boundingradius", "boundingcircle", "boundingpoint", "crossingunder", "insideof", "outsideof", "bottomboundary", "leftboundary", "topboundary", "rightboundary", "xsized", "ysized", "xysized", "sized", "xyscaled", "intersection_point", "intersection_found", "penpoint", "bbwidth", "bbheight", "withshade", "withcircularshade", "withlinearshade", "defineshade", "shaded", "shadedinto", "withshadecolors", "withshadedomain", "withshademethod", "withshadefactor", "withshadevector", "withshadecenter", "withshadedirection", "withshaderadius", "withshadetransform", "withshadestep", "withshadefraction", "cmyk", "spotcolor", "multitonecolor", "namedcolor", "drawfill", "undrawfill", "inverted", "uncolored", "softened", "grayed", "greyed", "onlayer", "along", "graphictext", "loadfigure", "externalfigure", "figure", "register", "outlinetext", "checkedbounds", "checkbounds", "strut", "rule", "withmask", "bitmapimage", "colordecimals", "ddecimal", "dddecimal", "ddddecimal", "colordecimalslist", "textext", "thetextext", "rawtextext", "textextoffset", "texbox", "thetexbox", "rawtexbox", "verbatim", "thelabel", "label", "autoalign", "transparent", "withtransparency", "property", "properties", "withproperties", "asgroup", "infont", "space", "crlf", "dquote", "percent", "SPACE", "CRLF", "DQUOTE", "PERCENT", "grayscale", "greyscale", "withgray", "withgrey", "colorpart", "colorlike", "readfile", "clearxy", "unitvector", "center", "epsed", "anchored", "originpath", "infinite", "break", "xstretched", "ystretched", "snapped", "pathconnectors", "function", "constructedfunction", "constructedpath", "constructedpairs", "straightfunction", "straightpath", "straightpairs", "curvedfunction", "curvedpath", "curvedpairs", "evenly", "oddly", "condition", "pushcurrentpicture", "popcurrentpicture", "arrowpath", "resetarrows", "tensecircle", "roundedsquare", "colortype", "whitecolor", "blackcolor", "basiccolors", "complementary", "complemented", "resolvedcolor", "normalfill", "normaldraw", "visualizepaths", "detailpaths", "naturalizepaths", "drawboundary", "drawwholepath", "drawpathonly", "visualizeddraw", "visualizedfill", "detaileddraw", "draworigin", "drawboundingbox", "drawpath", "drawpoint", "drawpoints", "drawcontrolpoints", "drawcontrollines", "drawpointlabels", "drawlineoptions", "drawpointoptions", "drawcontroloptions", "drawlabeloptions", "draworiginoptions", "drawboundoptions", "drawpathoptions", "resetdrawoptions", "undashed", "pencilled", "decorated", "redecorated", "undecorated", "passvariable", "passarrayvariable", "tostring", "topair", "format", "formatted", "quotation", "quote", "startpassingvariable", "stoppassingvariable", "eofill", "eoclip", "nofill", "fillup", "eofillup", "area", "addbackground", "shadedup", "shadeddown", "shadedleft", "shadedright", "sortlist", "copylist", "shapedlist", "listtocurves", "listtolines", "listsize", "listlast", "uniquelist", "circularpath", "squarepath", "linearpath" }, - ["internals"]={ "nocolormodel", "greycolormodel", "graycolormodel", "rgbcolormodel", "cmykcolormodel", "shadefactor", "textextoffset", "normaltransparent", "multiplytransparent", "screentransparent", "overlaytransparent", "softlighttransparent", "hardlighttransparent", "colordodgetransparent", "colorburntransparent", "darkentransparent", "lightentransparent", "differencetransparent", "exclusiontransparent", "huetransparent", "saturationtransparent", "colortransparent", "luminositytransparent", "ahvariant", "ahdimple", "ahfactor", "metapostversion", "maxdimensions", "drawoptionsfactor", "dq", "sq", "crossingscale", "crossingoption" }, + ["commands"]={ "loadfile", "loadimage", "loadmodule", "dispose", "nothing", "transparency", "tolist", "topath", "tocycle", "sqr", "log", "ln", "exp", "inv", "pow", "pi", "radian", "tand", "cotd", "sin", "cos", "tan", "cot", "atan", "asin", "acos", "invsin", "invcos", "invtan", "acosh", "asinh", "sinh", "cosh", "tanh", "zmod", "paired", "tripled", "unitcircle", "fulldiamond", "unitdiamond", "fullsquare", "unittriangle", "fulltriangle", "llcircle", "lrcircle", "urcircle", "ulcircle", "tcircle", "bcircle", "lcircle", "rcircle", "lltriangle", "lrtriangle", "urtriangle", "ultriangle", "uptriangle", "downtriangle", "lefttriangle", "righttriangle", "triangle", "smoothed", "cornered", "superellipsed", "randomized", "randomizedcontrols", "squeezed", "enlonged", "shortened", "punked", "curved", "unspiked", "simplified", "blownup", "stretched", "enlarged", "leftenlarged", "topenlarged", "rightenlarged", "bottomenlarged", "crossed", "laddered", "randomshifted", "interpolated", "perpendicular", "paralleled", "cutends", "peepholed", "llenlarged", "lrenlarged", "urenlarged", "ulenlarged", "llmoved", "lrmoved", "urmoved", "ulmoved", "rightarrow", "leftarrow", "centerarrow", "drawdoublearrows", "boundingbox", "innerboundingbox", "outerboundingbox", "pushboundingbox", "popboundingbox", "boundingradius", "boundingcircle", "boundingpoint", "crossingunder", "insideof", "outsideof", "bottomboundary", "leftboundary", "topboundary", "rightboundary", "xsized", "ysized", "xysized", "sized", "xyscaled", "intersection_point", "intersection_found", "penpoint", "bbwidth", "bbheight", "withshade", "withcircularshade", "withlinearshade", "defineshade", "shaded", "shadedinto", "withshadecolors", "withshadedomain", "withshademethod", "withshadefactor", "withshadevector", "withshadecenter", "withshadedirection", "withshaderadius", "withshadetransform", "withshadestep", "withshadefraction", "cmyk", "spotcolor", "multitonecolor", "namedcolor", "drawfill", "undrawfill", "inverted", "uncolored", "softened", "grayed", "greyed", "onlayer", "along", "graphictext", "loadfigure", "externalfigure", "figure", "register", "outlinetext", "checkedbounds", "checkbounds", "strut", "rule", "withmask", "bitmapimage", "colordecimals", "ddecimal", "dddecimal", "ddddecimal", "colordecimalslist", "textext", "thetextext", "rawtextext", "textextoffset", "texbox", "thetexbox", "rawtexbox", "istextext", "verbatim", "thelabel", "label", "autoalign", "transparent", "withtransparency", "property", "properties", "withproperties", "asgroup", "infont", "space", "crlf", "dquote", "percent", "SPACE", "CRLF", "DQUOTE", "PERCENT", "grayscale", "greyscale", "withgray", "withgrey", "colorpart", "colorlike", "readfile", "clearxy", "unitvector", "center", "epsed", "anchored", "originpath", "infinite", "break", "xstretched", "ystretched", "snapped", "pathconnectors", "function", "constructedfunction", "constructedpath", "constructedpairs", "straightfunction", "straightpath", "straightpairs", "curvedfunction", "curvedpath", "curvedpairs", "evenly", "oddly", "condition", "pushcurrentpicture", "popcurrentpicture", "arrowpath", "resetarrows", "tensecircle", "roundedsquare", "colortype", "whitecolor", "blackcolor", "basiccolors", "complementary", "complemented", "resolvedcolor", "normalfill", "normaldraw", "visualizepaths", "detailpaths", "naturalizepaths", "drawboundary", "drawwholepath", "drawpathonly", "visualizeddraw", "visualizedfill", "detaileddraw", "draworigin", "drawboundingbox", "drawpath", "drawpoint", "drawpoints", "drawcontrolpoints", "drawcontrollines", "drawpointlabels", "drawlineoptions", "drawpointoptions", "drawcontroloptions", "drawlabeloptions", "draworiginoptions", "drawboundoptions", "drawpathoptions", "resetdrawoptions", "undashed", "pencilled", "decorated", "redecorated", "undecorated", "passvariable", "passarrayvariable", "tostring", "topair", "format", "formatted", "quotation", "quote", "startpassingvariable", "stoppassingvariable", "eofill", "eoclip", "nofill", "fillup", "eofillup", "area", "addbackground", "shadedup", "shadeddown", "shadedleft", "shadedright", "sortlist", "copylist", "shapedlist", "listtocurves", "listtolines", "listsize", "listlast", "uniquelist", "circularpath", "squarepath", "linearpath" }, + ["internals"]={ "nocolormodel", "greycolormodel", "graycolormodel", "rgbcolormodel", "cmykcolormodel", "shadefactor", "textextoffset", "normaltransparent", "multiplytransparent", "screentransparent", "overlaytransparent", "softlighttransparent", "hardlighttransparent", "colordodgetransparent", "colorburntransparent", "darkentransparent", "lightentransparent", "differencetransparent", "exclusiontransparent", "huetransparent", "saturationtransparent", "colortransparent", "luminositytransparent", "ahvariant", "ahdimple", "ahfactor", "ahscale", "metapostversion", "maxdimensions", "drawoptionsfactor", "dq", "sq", "crossingscale", "crossingoption" }, }
\ No newline at end of file diff --git a/context/data/textadept/context/data/scite-context-data-tex.lua b/context/data/textadept/context/data/scite-context-data-tex.lua index 3d2e60ea4..c0bce17d4 100644 --- a/context/data/textadept/context/data/scite-context-data-tex.lua +++ b/context/data/textadept/context/data/scite-context-data-tex.lua @@ -1,9 +1,9 @@ return { - ["aleph"]={ "AlephVersion", "Alephminorversion", "Alephrevision", "Alephversion", "Omegaminorversion", "Omegarevision", "Omegaversion", "boxdir", "pagebottomoffset", "pagerightoffset" }, + ["aleph"]={ "Alephminorversion", "Alephrevision", "Alephversion" }, ["etex"]={ "botmarks", "clubpenalties", "currentgrouplevel", "currentgrouptype", "currentifbranch", "currentiflevel", "currentiftype", "detokenize", "dimexpr", "displaywidowpenalties", "eTeXVersion", "eTeXminorversion", "eTeXrevision", "eTeXversion", "everyeof", "firstmarks", "fontchardp", "fontcharht", "fontcharic", "fontcharwd", "glueexpr", "glueshrink", "glueshrinkorder", "gluestretch", "gluestretchorder", "gluetomu", "ifcsname", "ifdefined", "iffontchar", "interactionmode", "interlinepenalties", "lastlinefit", "lastnodetype", "marks", "muexpr", "mutoglue", "numexpr", "pagediscards", "parshapedimen", "parshapeindent", "parshapelength", "predisplaydirection", "protected", "readline", "savinghyphcodes", "savingvdiscards", "scantokens", "showgroups", "showifs", "showtokens", "splitbotmarks", "splitdiscards", "splitfirstmarks", "topmarks", "tracingassigns", "tracinggroups", "tracingifs", "tracingnesting", "tracingscantokens", "unexpanded", "unless", "widowpenalties" }, - ["luatex"]={ "Uchar", "Udelcode", "Udelcodenum", "Udelimiter", "Udelimiterover", "Udelimiterunder", "Uhextensible", "Uleft", "Umathaccent", "Umathaxis", "Umathbinbinspacing", "Umathbinclosespacing", "Umathbininnerspacing", "Umathbinopenspacing", "Umathbinopspacing", "Umathbinordspacing", "Umathbinpunctspacing", "Umathbinrelspacing", "Umathchar", "Umathcharclass", "Umathchardef", "Umathcharfam", "Umathcharnum", "Umathcharnumdef", "Umathcharslot", "Umathclosebinspacing", "Umathcloseclosespacing", "Umathcloseinnerspacing", "Umathcloseopenspacing", "Umathcloseopspacing", "Umathcloseordspacing", "Umathclosepunctspacing", "Umathcloserelspacing", "Umathcode", "Umathcodenum", "Umathcodenumdef", "Umathconnectoroverlapmin", "Umathfractiondelsize", "Umathfractiondenomdown", "Umathfractiondenomvgap", "Umathfractionnumup", "Umathfractionnumvgap", "Umathfractionrule", "Umathinnerbinspacing", "Umathinnerclosespacing", "Umathinnerinnerspacing", "Umathinneropenspacing", "Umathinneropspacing", "Umathinnerordspacing", "Umathinnerpunctspacing", "Umathinnerrelspacing", "Umathlimitabovebgap", "Umathlimitabovekern", "Umathlimitabovevgap", "Umathlimitbelowbgap", "Umathlimitbelowkern", "Umathlimitbelowvgap", "Umathopbinspacing", "Umathopclosespacing", "Umathopenbinspacing", "Umathopenclosespacing", "Umathopeninnerspacing", "Umathopenopenspacing", "Umathopenopspacing", "Umathopenordspacing", "Umathopenpunctspacing", "Umathopenrelspacing", "Umathoperatorsize", "Umathopinnerspacing", "Umathopopenspacing", "Umathopopspacing", "Umathopordspacing", "Umathoppunctspacing", "Umathoprelspacing", "Umathordbinspacing", "Umathordclosespacing", "Umathordinnerspacing", "Umathordopenspacing", "Umathordopspacing", "Umathordordspacing", "Umathordpunctspacing", "Umathordrelspacing", "Umathoverbarkern", "Umathoverbarrule", "Umathoverbarvgap", "Umathoverdelimiterbgap", "Umathoverdelimitervgap", "Umathpunctbinspacing", "Umathpunctclosespacing", "Umathpunctinnerspacing", "Umathpunctopenspacing", "Umathpunctopspacing", "Umathpunctordspacing", "Umathpunctpunctspacing", "Umathpunctrelspacing", "Umathquad", "Umathradicaldegreeafter", "Umathradicaldegreebefore", "Umathradicaldegreeraise", "Umathradicalkern", "Umathradicalrule", "Umathradicalvgap", "Umathrelbinspacing", "Umathrelclosespacing", "Umathrelinnerspacing", "Umathrelopenspacing", "Umathrelopspacing", "Umathrelordspacing", "Umathrelpunctspacing", "Umathrelrelspacing", "Umathskewedfractionhgap", "Umathskewedfractionvgap", "Umathspaceafterscript", "Umathstackdenomdown", "Umathstacknumup", "Umathstackvgap", "Umathsubshiftdown", "Umathsubshiftdrop", "Umathsubsupshiftdown", "Umathsubsupvgap", "Umathsubtopmax", "Umathsupbottommin", "Umathsupshiftdrop", "Umathsupshiftup", "Umathsupsubbottommax", "Umathunderbarkern", "Umathunderbarrule", "Umathunderbarvgap", "Umathunderdelimiterbgap", "Umathunderdelimitervgap", "Umathnolimitsupfactor", "Umathnolimitsubfactor", "Umiddle", "Uoverdelimiter", "Uradical", "Uright", "Uroot", "Uskewed", "Uskewedwithdelims", "Ustack", "Ustartdisplaymath", "Ustartmath", "Ustopdisplaymath", "Ustopmath", "Usubscript", "Usuperscript", "Uunderdelimiter", "Uvextensible", "adjustspacing", "alignmark", "aligntab", "attribute", "attributedef", "hyphenpenaltymode", "automatichyphenmode", "automatichyphenpenalty", "automaticdiscretionary", "explicithyphenpenalty", "explicitdiscretionary", "bodydir", "boundary", "boxdir", "catcodetable", "clearmarks", "copyfont", "crampeddisplaystyle", "crampedscriptscriptstyle", "crampedscriptstyle", "crampedtextstyle", "draftmode", "dviextension", "dvifeedback", "dvivariable", "efcode", "hjcode", "firstvalidlanguage", "fontid", "formatname", "gleaders", "hyphenationmin", "hyphenationbounds", "ifabsdim", "ifabsnum", "ifprimitive", "ignoreligaturesinfont", "initcatcodetable", "insertht", "lastsavedboxresourceindex", "lastsavedimageresourceindex", "lastsavedimageresourcepages", "lastxpos", "lastypos", "latelua", "leftghost", "leftmarginkern", "letcharcode", "letterspacefont", "linedir", "localbrokenpenalty", "localinterlinepenalty", "localleftbox", "localrightbox", "lpcode", "luaescapestring", "luatexbanner", "luatexrevision", "luatexversion", "luafunction", "mathdir", "mathdisplayskipmode", "matheqnogapstep", "mathitalicsmode", "mathnolimitsmode", "mathoption", "mathscriptsmode", "mathstyle", "mathsurroundskip", "mathsurroundmode", "mathrulesmode", "mathrulesfam", "noboundary", "nokerns", "nohrule", "noligs", "nospaces", "novrule", "normaldeviate", "outputbox", "outputmode", "pagedir", "pageheight", "pagebottomoffset", "pageleftoffset", "pagerightoffset", "pagetopoffset", "pagewidth", "pardir", "pdfextension", "pdffeedback", "pdfvariable", "postexhyphenchar", "posthyphenchar", "predisplaygapfactor", "preexhyphenchar", "prehyphenchar", "primitive", "protrudechars", "protrusionboundary", "pxdimen", "randomseed", "rightghost", "rightmarginkern", "rpcode", "saveboxresource", "savecatcodetable", "saveimageresource", "savepos", "scantextokens", "setfontid", "setrandomseed", "shapemode", "suppressfontnotfounderror", "suppressifcsnameerror", "suppresslongerror", "suppressoutererror", "suppressmathparerror", "synctex", "tagcode", "textdir", "tracingfonts", "uniformdeviate", "useboxresource", "useimageresource", "wordboundary", "vpack", "hpack", "tpack", "csstring", "begincsname", "lastnamedcs", "toksapp", "tokspre", "etoksapp", "etokspre" }, - ["omega"]={ "OmegaVersion", "bodydir", "chardp", "charht", "charit", "charwd", "leftghost", "localbrokenpenalty", "localinterlinepenalty", "localleftbox", "localrightbox", "mathdir", "odelcode", "odelimiter", "omathaccent", "omathchar", "omathchardef", "omathcode", "oradical", "pagedir", "pageheight", "pagewidth", "pardir", "rightghost", "textdir" }, - ["pdftex"]={ "efcode", "expanded", "ifincsname", "ifpdfabsdim", "ifpdfabsnum", "ifpdfprimitive", "leftmarginkern", "letterspacefont", "lpcode", "pdfadjustspacing", "pdfannot", "pdfcatalog", "pdfcolorstack", "pdfcolorstackinit", "pdfcompresslevel", "pdfcopyfont", "pdfcreationdate", "pdfdecimaldigits", "pdfdest", "pdfdestmargin", "pdfdraftmode", "pdfeachlineheight", "pdfeachlinedepth", "pdfendlink", "pdfendthread", "pdffirstlineheight", "pdffontattr", "pdffontexpand", "pdffontname", "pdffontobjnum", "pdffontsize", "pdfxformmargin", "pdfgamma", "pdfgentounicode", "pdfglyphtounicode", "pdfhorigin", "pdfignoreddimen", "pdfimageapplygamma", "pdfimagegamma", "pdfimagehicolor", "pdfimageresolution", "pdfincludechars", "pdfinclusioncopyfonts", "pdfignoreunknownimages", "pdfinclusionerrorlevel", "pdfignoreunknownimages", "pdfinfo", "pdfinfoomitdate", "pdftrailerid", "pdfinsertht", "pdflastannot", "pdflastlinedepth", "pdflastlink", "pdflastobj", "pdflastxform", "pdflastximage", "pdflastximagepages", "pdflastxpos", "pdflastypos", "pdflinkmargin", "pdfliteral", "pdfmapfile", "pdfmapline", "pdfminorversion", "pdfnames", "pdfnoligatures", "pdfnormaldeviate", "pdfobj", "pdfobjcompresslevel", "pdfoutline", "pdfoutput", "pdfpageattr", "pdfpagebox", "pdfpageheight", "pdfpageref", "pdfpageresources", "pdfpagesattr", "pdfpagewidth", "pdfpkmode", "pdfpkresolution", "pdfpkfixeddpi", "pdfprimitive", "pdfprotrudechars", "pdfpxdimen", "pdfrandomseed", "pdfrefobj", "pdfrefxform", "pdfrefximage", "pdfreplacefont", "pdfrestore", "pdfretval", "pdfsave", "pdfsavepos", "pdfsetmatrix", "pdfsetrandomseed", "pdfstartlink", "pdfstartthread", "pdftexbanner", "pdftexrevision", "pdftexversion", "pdfsuppressptexinfo", "pdfsuppressoptionalinfo", "pdfthread", "pdfthreadmargin", "pdftracingfonts", "pdftrailer", "pdfuniformdeviate", "pdfuniqueresname", "pdfvorigin", "pdfxform", "pdfxformattr", "pdfxformname", "pdfxformresources", "pdfximage", "quitvmode", "rightmarginkern", "rpcode", "tagcode" }, - ["tex"]={ "-", "/", "AlephVersion", "Alephminorversion", "Alephrevision", "Alephversion", "OmegaVersion", "Omegaminorversion", "Omegarevision", "Omegaversion", "Udelcode", "Udelcodenum", "Udelimiter", "Udelimiterover", "Udelimiterunder", "Uhextensible", "Uleft", "Umathaccent", "Umathaxis", "Umathbinbinspacing", "Umathbinclosespacing", "Umathbininnerspacing", "Umathbinopenspacing", "Umathbinopspacing", "Umathbinordspacing", "Umathbinpunctspacing", "Umathbinrelspacing", "Umathchar", "Umathcharclass", "Umathchardef", "Umathcharfam", "Umathcharnum", "Umathcharnumdef", "Umathcharslot", "Umathclosebinspacing", "Umathcloseclosespacing", "Umathcloseinnerspacing", "Umathcloseopenspacing", "Umathcloseopspacing", "Umathcloseordspacing", "Umathclosepunctspacing", "Umathcloserelspacing", "Umathcode", "Umathcodenum", "Umathcodenumdef", "Umathconnectoroverlapmin", "Umathfractiondelsize", "Umathfractiondenomdown", "Umathfractiondenomvgap", "Umathfractionnumup", "Umathfractionnumvgap", "Umathfractionrule", "Umathinnerbinspacing", "Umathinnerclosespacing", "Umathinnerinnerspacing", "Umathinneropenspacing", "Umathinneropspacing", "Umathinnerordspacing", "Umathinnerpunctspacing", "Umathinnerrelspacing", "Umathlimitabovebgap", "Umathlimitabovekern", "Umathlimitabovevgap", "Umathlimitbelowbgap", "Umathlimitbelowkern", "Umathlimitbelowvgap", "Umathopbinspacing", "Umathopclosespacing", "Umathopenbinspacing", "Umathopenclosespacing", "Umathopeninnerspacing", "Umathopenopenspacing", "Umathopenopspacing", "Umathopenordspacing", "Umathopenpunctspacing", "Umathopenrelspacing", "Umathoperatorsize", "Umathopinnerspacing", "Umathopopenspacing", "Umathopopspacing", "Umathopordspacing", "Umathoppunctspacing", "Umathoprelspacing", "Umathordbinspacing", "Umathordclosespacing", "Umathordinnerspacing", "Umathordopenspacing", "Umathordopspacing", "Umathordordspacing", "Umathordpunctspacing", "Umathordrelspacing", "Umathoverbarkern", "Umathoverbarrule", "Umathoverbarvgap", "Umathoverdelimiterbgap", "Umathoverdelimitervgap", "Umathpunctbinspacing", "Umathpunctclosespacing", "Umathpunctinnerspacing", "Umathpunctopenspacing", "Umathpunctopspacing", "Umathpunctordspacing", "Umathpunctpunctspacing", "Umathpunctrelspacing", "Umathquad", "Umathradicaldegreeafter", "Umathradicaldegreebefore", "Umathradicaldegreeraise", "Umathradicalkern", "Umathradicalrule", "Umathradicalvgap", "Umathrelbinspacing", "Umathrelclosespacing", "Umathrelinnerspacing", "Umathrelopenspacing", "Umathrelopspacing", "Umathrelordspacing", "Umathrelpunctspacing", "Umathrelrelspacing", "Umathskewedfractionhgap", "Umathskewedfractionvgap", "Umathspaceafterscript", "Umathstackdenomdown", "Umathstacknumup", "Umathstackvgap", "Umathsubshiftdown", "Umathsubshiftdrop", "Umathsubsupshiftdown", "Umathsubsupvgap", "Umathsubtopmax", "Umathsupbottommin", "Umathsupshiftdrop", "Umathsupshiftup", "Umathsupsubbottommax", "Umathunderbarkern", "Umathunderbarrule", "Umathunderbarvgap", "Umathunderdelimiterbgap", "Umathunderdelimitervgap", "Umathnolimitsupfactor", "Umathnolimitsubfactor", "Umiddle", "Uoverdelimiter", "Uradical", "Uright", "Uroot", "Uskewed", "Uskewedwithdelims", "Ustack", "Ustartdisplaymath", "Ustartmath", "Ustopdisplaymath", "Ustopmath", "Usubscript", "Usuperscript", "Uunderdelimiter", "Uvextensible", "above", "abovedisplayshortskip", "abovedisplayskip", "abovewithdelims", "accent", "adjdemerits", "advance", "afterassignment", "aftergroup", "alignmark", "aligntab", "atop", "atopwithdelims", "attribute", "attributedef", "hyphenpenaltymode", "automatichyphenmode", "automatichyphenpenalty", "automaticdiscretionary", "explicithyphenpenalty", "explicitdiscretionary", "badness", "baselineskip", "batchmode", "begingroup", "belowdisplayshortskip", "belowdisplayskip", "binoppenalty", "bodydir", "botmark", "botmarks", "boundary", "box", "boxdir", "boxmaxdepth", "brokenpenalty", "catcode", "catcodetable", "char", "chardef", "cleaders", "clearmarks", "closein", "closeout", "clubpenalties", "clubpenalty", "copy", "copyfont", "count", "countdef", "cr", "crampeddisplaystyle", "crampedscriptscriptstyle", "crampedscriptstyle", "crampedtextstyle", "crcr", "csname", "currentgrouplevel", "currentgrouptype", "currentifbranch", "currentiflevel", "currentiftype", "day", "deadcycles", "def", "defaulthyphenchar", "defaultskewchar", "delcode", "delimiter", "delimiterfactor", "delimitershortfall", "detokenize", "dimen", "dimendef", "dimexpr", "directlua", "discretionary", "displayindent", "displaylimits", "displaystyle", "displaywidowpenalties", "displaywidowpenalty", "displaywidth", "divide", "doublehyphendemerits", "dp", "dump", "dviextension", "dvifeedback", "dvivariable", "eTeXVersion", "eTeXminorversion", "eTeXrevision", "eTeXversion", "edef", "efcode", "hjcode", "else", "emergencystretch", "end", "endcsname", "endgroup", "endinput", "endlinechar", "eqno", "errhelp", "errmessage", "errorcontextlines", "errorstopmode", "escapechar", "everycr", "everydisplay", "everyeof", "everyhbox", "everyjob", "everymath", "everypar", "everyvbox", "exhyphenchar", "exhyphenpenalty", "expandafter", "expanded", "expandglyphsinfont", "fam", "fi", "finalhyphendemerits", "firstmark", "firstmarks", "floatingpenalty", "font", "fontchardp", "fontcharht", "fontcharic", "fontcharwd", "fontdimen", "firstvalidlanguage", "fontid", "fontname", "formatname", "futurelet", "gdef", "gleaders", "global", "globaldefs", "glueexpr", "glueshrink", "glueshrinkorder", "gluestretch", "gluestretchorder", "gluetomu", "halign", "hangafter", "hangindent", "hbadness", "hbox", "hfil", "hfill", "hfilneg", "hfuzz", "hoffset", "holdinginserts", "hrule", "hsize", "hskip", "hss", "ht", "hyphenation", "hyphenchar", "hyphenpenalty", "hyphenationmin", "hyphenationbounds", "if", "ifabsdim", "ifabsnum", "ifcase", "ifcat", "ifcsname", "ifdefined", "ifdim", "ifeof", "iffalse", "iffontchar", "ifhbox", "ifhmode", "ifincsname", "ifinner", "ifmmode", "ifnum", "ifodd", "ifpdfabsdim", "ifpdfabsnum", "ifpdfprimitive", "ifprimitive", "iftrue", "ifvbox", "ifvmode", "ifvoid", "ifx", "ignoreligaturesinfont", "ignorespaces", "immediate", "indent", "initcatcodetable", "input", "inputlineno", "insert", "insertpenalties", "interactionmode", "interlinepenalties", "interlinepenalty", "jobname", "kern", "language", "lastbox", "lastkern", "lastlinefit", "lastnodetype", "lastpenalty", "lastsavedboxresourceindex", "lastsavedimageresourceindex", "lastsavedimageresourcepages", "lastskip", "lastxpos", "lastypos", "latelua", "lccode", "leaders", "left", "leftghost", "lefthyphenmin", "leftmarginkern", "leftskip", "leqno", "let", "letcharcode", "letterspacefont", "limits", "linedir", "linepenalty", "lineskip", "lineskiplimit", "localbrokenpenalty", "localinterlinepenalty", "localleftbox", "localrightbox", "long", "looseness", "lower", "lowercase", "lpcode", "luaescapestring", "luatexbanner", "luatexrevision", "luatexversion", "mag", "mark", "marks", "mathaccent", "mathbin", "mathchar", "mathchardef", "mathchoice", "mathclose", "mathcode", "mathdir", "mathdisplayskipmode", "matheqnogapstep", "mathinner", "mathitalicsmode", "mathnolimitsmode", "mathop", "mathopen", "mathoption", "mathord", "mathpunct", "mathrel", "mathrulesmode", "mathrulesfam", "mathscriptsmode", "mathstyle", "mathsurroundskip", "mathsurroundmode", "mathsurround", "maxdeadcycles", "maxdepth", "meaning", "medmuskip", "message", "middle", "mkern", "month", "moveleft", "moveright", "mskip", "muexpr", "multiply", "muskip", "muskipdef", "mutoglue", "newlinechar", "noalign", "noboundary", "noexpand", "noindent", "nokerns", "nohrule", "noligs", "nospaces", "novrule", "nolimits", "nolocaldirs", "nolocalwhatsits", "nonscript", "nonstopmode", "normaldeviate", "nulldelimiterspace", "nullfont", "number", "numexpr", "odelcode", "odelimiter", "omathaccent", "omathchar", "omathchardef", "omathcode", "omit", "openin", "openout", "or", "oradical", "outer", "output", "outputbox", "outputpenalty", "over", "overfullrule", "overline", "overwithdelims", "pagebottomoffset", "pagedepth", "pagedir", "pagediscards", "pagefilllstretch", "pagefillstretch", "pagefilstretch", "pagegoal", "pageheight", "pageleftoffset", "pagerightoffset", "pageshrink", "pagestretch", "pagetopoffset", "pagetotal", "pagewidth", "par", "pardir", "parfillskip", "parindent", "parshape", "parshapedimen", "parshapeindent", "parshapelength", "parskip", "patterns", "pausing", "pdfadjustspacing", "pdfannot", "pdfcatalog", "pdfcolorstack", "pdfcolorstackinit", "pdfcompresslevel", "pdfcopyfont", "pdfcreationdate", "pdfdecimaldigits", "pdfdest", "pdfdestmargin", "pdfdraftmode", "pdfeachlineheight", "pdfeachlinedepth", "pdfendlink", "pdfendthread", "pdfextension", "pdfvariable", "pdffirstlineheight", "pdffontattr", "pdffontexpand", "pdffontname", "pdffontobjnum", "pdffontsize", "pdfxformmargin", "pdfgamma", "pdfgentounicode", "pdfglyphtounicode", "pdfhorigin", "pdfignoreddimen", "pdfimageaddfilename", "pdfimageapplygamma", "pdfimagegamma", "pdfimagehicolor", "pdfimageresolution", "pdfincludechars", "pdfinclusioncopyfonts", "pdfinclusionerrorlevel", "pdfignoreunknownimages", "pdfinfo", "pdfinfoomitdate", "pdftrailerid", "pdfinsertht", "pdflastannot", "pdflastlinedepth", "pdflastlink", "pdflastobj", "pdflastxform", "pdflastximage", "pdflastximagepages", "pdflastxpos", "pdflastypos", "pdflinkmargin", "pdfliteral", "pdfmapfile", "pdfmapline", "pdfminorversion", "pdfnames", "pdfnoligatures", "pdfnormaldeviate", "pdfobj", "pdfobjcompresslevel", "pdfoutline", "pdfoutput", "pdfpageattr", "pdfpagebox", "pdfpageheight", "pdfpageref", "pdfpageresources", "pdfpagesattr", "pdfpagewidth", "pdfpkmode", "pdfpkresolution", "pdfpkfixeddpi", "pdfprimitive", "pdfprotrudechars", "pdfpxdimen", "pdfrandomseed", "pdfrefobj", "pdfrefxform", "pdfrefximage", "pdfreplacefont", "pdfrestore", "pdfretval", "pdfsave", "pdfsavepos", "pdfsetmatrix", "pdfsetrandomseed", "pdfstartlink", "pdfstartthread", "pdftexbanner", "pdftexrevision", "pdftexversion", "pdfsuppressptexinfo", "pdfsuppressoptionalinfo", "pdfthread", "pdfthreadmargin", "pdftracingfonts", "pdftrailer", "pdfuniformdeviate", "pdfuniqueresname", "pdfvorigin", "pdfxform", "pdfxformattr", "pdfxformname", "pdfxformresources", "pdfximage", "penalty", "postdisplaypenalty", "postexhyphenchar", "posthyphenchar", "predisplaydirection", "predisplaygapfactor", "predisplaypenalty", "predisplaysize", "preexhyphenchar", "prehyphenchar", "pretolerance", "prevdepth", "prevgraf", "primitive", "protected", "protrudechars", "protrusionboundary", "pxdimen", "quitvmode", "radical", "raise", "randomseed", "read", "readline", "relax", "relpenalty", "right", "rightghost", "righthyphenmin", "rightmarginkern", "rightskip", "romannumeral", "rpcode", "saveboxresource", "saveimageresource", "savepos", "savecatcodetable", "savinghyphcodes", "savingvdiscards", "scantextokens", "scantokens", "scriptfont", "scriptscriptfont", "scriptscriptstyle", "scriptspace", "scriptstyle", "scrollmode", "setbox", "setfontid", "setlanguage", "setrandomseed", "shapemode", "sfcode", "shipout", "show", "showbox", "showboxbreadth", "showboxdepth", "showgroups", "showifs", "showlists", "showthe", "showtokens", "skewchar", "skip", "skipdef", "spacefactor", "spaceskip", "span", "special", "splitbotmark", "splitbotmarks", "splitdiscards", "splitfirstmark", "splitfirstmarks", "splitmaxdepth", "splittopskip", "string", "suppressfontnotfounderror", "suppressifcsnameerror", "suppresslongerror", "suppressoutererror", "suppressmathparerror", "synctex", "tabskip", "tagcode", "textdir", "textfont", "textstyle", "the", "thickmuskip", "thinmuskip", "time", "toks", "toksdef", "tolerance", "topmark", "topmarks", "topskip", "tracingassigns", "tracingcommands", "tracingfonts", "tracinggroups", "tracingifs", "tracinglostchars", "tracingmacros", "tracingnesting", "tracingonline", "tracingoutput", "tracingpages", "tracingparagraphs", "tracingrestores", "tracingscantokens", "tracingstats", "uccode", "uchyph", "underline", "unexpanded", "unhbox", "unhcopy", "uniformdeviate", "unkern", "unless", "unpenalty", "unskip", "unvbox", "unvcopy", "uppercase", "useboxresource", "useimageresource", "vadjust", "valign", "vbadness", "vbox", "vcenter", "vfil", "vfill", "vfilneg", "vfuzz", "voffset", "vrule", "vsize", "vskip", "vsplit", "vss", "vtop", "wd", "widowpenalties", "widowpenalty", "wordboundary", "write", "xdef", "xleaders", "xspaceskip", "year", "vpack", "hpack", "tpack", "csstring", "begincsname", "lastnamedcs", "toksapp", "tokspre", "etoksapp", "etokspre" }, + ["luatex"]={ "Uchar", "Udelcode", "Udelcodenum", "Udelimiter", "Udelimiterover", "Udelimiterunder", "Uhextensible", "Umathaccent", "Umathaxis", "Umathbinbinspacing", "Umathbinclosespacing", "Umathbininnerspacing", "Umathbinopenspacing", "Umathbinopspacing", "Umathbinordspacing", "Umathbinpunctspacing", "Umathbinrelspacing", "Umathchar", "Umathcharclass", "Umathchardef", "Umathcharfam", "Umathcharnum", "Umathcharnumdef", "Umathcharslot", "Umathclosebinspacing", "Umathcloseclosespacing", "Umathcloseinnerspacing", "Umathcloseopenspacing", "Umathcloseopspacing", "Umathcloseordspacing", "Umathclosepunctspacing", "Umathcloserelspacing", "Umathcode", "Umathcodenum", "Umathconnectoroverlapmin", "Umathfractiondelsize", "Umathfractiondenomdown", "Umathfractiondenomvgap", "Umathfractionnumup", "Umathfractionnumvgap", "Umathfractionrule", "Umathinnerbinspacing", "Umathinnerclosespacing", "Umathinnerinnerspacing", "Umathinneropenspacing", "Umathinneropspacing", "Umathinnerordspacing", "Umathinnerpunctspacing", "Umathinnerrelspacing", "Umathlimitabovebgap", "Umathlimitabovekern", "Umathlimitabovevgap", "Umathlimitbelowbgap", "Umathlimitbelowkern", "Umathlimitbelowvgap", "Umathnolimitsubfactor", "Umathnolimitsupfactor", "Umathopbinspacing", "Umathopclosespacing", "Umathopenbinspacing", "Umathopenclosespacing", "Umathopeninnerspacing", "Umathopenopenspacing", "Umathopenopspacing", "Umathopenordspacing", "Umathopenpunctspacing", "Umathopenrelspacing", "Umathoperatorsize", "Umathopinnerspacing", "Umathopopenspacing", "Umathopopspacing", "Umathopordspacing", "Umathoppunctspacing", "Umathoprelspacing", "Umathordbinspacing", "Umathordclosespacing", "Umathordinnerspacing", "Umathordopenspacing", "Umathordopspacing", "Umathordordspacing", "Umathordpunctspacing", "Umathordrelspacing", "Umathoverbarkern", "Umathoverbarrule", "Umathoverbarvgap", "Umathoverdelimiterbgap", "Umathoverdelimitervgap", "Umathpunctbinspacing", "Umathpunctclosespacing", "Umathpunctinnerspacing", "Umathpunctopenspacing", "Umathpunctopspacing", "Umathpunctordspacing", "Umathpunctpunctspacing", "Umathpunctrelspacing", "Umathquad", "Umathradicaldegreeafter", "Umathradicaldegreebefore", "Umathradicaldegreeraise", "Umathradicalkern", "Umathradicalrule", "Umathradicalvgap", "Umathrelbinspacing", "Umathrelclosespacing", "Umathrelinnerspacing", "Umathrelopenspacing", "Umathrelopspacing", "Umathrelordspacing", "Umathrelpunctspacing", "Umathrelrelspacing", "Umathskewedfractionhgap", "Umathskewedfractionvgap", "Umathspaceafterscript", "Umathstackdenomdown", "Umathstacknumup", "Umathstackvgap", "Umathsubshiftdown", "Umathsubshiftdrop", "Umathsubsupshiftdown", "Umathsubsupvgap", "Umathsubtopmax", "Umathsupbottommin", "Umathsupshiftdrop", "Umathsupshiftup", "Umathsupsubbottommax", "Umathunderbarkern", "Umathunderbarrule", "Umathunderbarvgap", "Umathunderdelimiterbgap", "Umathunderdelimitervgap", "Unosubscript", "Unosuperscript", "Uoverdelimiter", "Uradical", "Uroot", "Uskewed", "Uskewedwithdelims", "Ustack", "Ustartdisplaymath", "Ustartmath", "Ustopdisplaymath", "Ustopmath", "Usubscript", "Usuperscript", "Uunderdelimiter", "Uvextensible", "adjustspacing", "alignmark", "aligntab", "attribute", "attributedef", "automaticdiscretionary", "automatichyphenmode", "automatichyphenpenalty", "begincsname", "bodydir", "bodydirection", "boxdir", "boxdirection", "breakafterdirmode", "catcodetable", "clearmarks", "copyfont", "compoundhyphenmode", "crampeddisplaystyle", "crampedscriptscriptstyle", "crampedscriptstyle", "crampedtextstyle", "draftmode", "dviextension", "dvifeedback", "dvivariable", "efcode", "etoksapp", "etokspre", "expanded", "expandglyphsinfont", "explicitdiscretionary", "explicithyphenpenalty", "fontid", "formatname", "gleaders", "hjcode", "hyphenationbounds", "hyphenationmin", "hyphenpenaltymode", "ifabsdim", "ifabsnum", "ifincsname", "ifprimitive", "ignoreligaturesinfont", "initcatcodetable", "insertht", "lastnamedcs", "lastsavedboxresourceindex", "lastsavedimageresourceindex", "lastsavedimageresourcepages", "lastxpos", "lastypos", "latelua", "leftghost", "leftmarginkern", "letcharcode", "letterspacefont", "linedir", "linedirection", "localbrokenpenalty", "localinterlinepenalty", "localleftbox", "localrightbox", "lpcode", "luaescapestring", "luafunction", "luatexbanner", "luatexrevision", "luatexversion", "mathdelimitersmode", "mathdir", "mathdirection", "mathdisplayskipmode", "matheqnogapstep", "mathitalicsmode", "mathnolimitsmode", "mathoption", "mathpenaltiesmode", "mathrulesfam", "mathrulesmode", "mathscriptsmode", "mathscriptboxmode", "mathstyle", "mathsurroundmode", "mathsurroundskip", "nohrule", "nokerns", "noligs", "normaldeviate", "nospaces", "novrule", "outputbox", "outputmode", "pagebottomoffset", "pagedir", "pagedirection", "pageheight", "pageleftoffset", "pagerightoffset", "pagetopoffset", "pagewidth", "pardir", "pardirection", "pdfextension", "pdffeedback", "pdfvariable", "postexhyphenchar", "posthyphenchar", "prebinoppenalty", "predisplaygapfactor", "preexhyphenchar", "prehyphenchar", "prerelpenalty", "primitive", "protrudechars", "pxdimen", "quitvmode", "randomseed", "rightghost", "rightmarginkern", "rpcode", "saveboxresource", "savecatcodetable", "saveimageresource", "savepos", "scantextokens", "setfontid", "setrandomseed", "shapemode", "suppressfontnotfounderror", "suppressifcsnameerror", "suppresslongerror", "suppressmathparerror", "suppressoutererror", "suppressprimitiveerror", "synctex", "tagcode", "textdir", "textdirection", "toksapp", "tokspre", "tracingfonts", "uniformdeviate", "useboxresource", "useimageresource" }, + ["omega"]={ "Omegaminorversion", "Omegarevision", "Omegaversion" }, + ["pdftex"]={ "ifpdfabsdim", "ifpdfabsnum", "ifpdfprimitive", "pdfadjustspacing", "pdfannot", "pdfcatalog", "pdfcolorstack", "pdfcolorstackinit", "pdfcompresslevel", "pdfcopyfont", "pdfcreationdate", "pdfdecimaldigits", "pdfdest", "pdfdestmargin", "pdfdraftmode", "pdfeachlinedepth", "pdfeachlineheight", "pdfendlink", "pdfendthread", "pdffirstlineheight", "pdffontattr", "pdffontexpand", "pdffontname", "pdffontobjnum", "pdffontsize", "pdfgamma", "pdfgentounicode", "pdfglyphtounicode", "pdfhorigin", "pdfignoreddimen", "pdfignoreunknownimages", "pdfimageaddfilename", "pdfimageapplygamma", "pdfimagegamma", "pdfimagehicolor", "pdfimageresolution", "pdfincludechars", "pdfinclusioncopyfonts", "pdfinclusionerrorlevel", "pdfinfo", "pdfinfoomitdate", "pdfinsertht", "pdflastannot", "pdflastlinedepth", "pdflastlink", "pdflastobj", "pdflastxform", "pdflastximage", "pdflastximagepages", "pdflastxpos", "pdflastypos", "pdflinkmargin", "pdfliteral", "pdfmapfile", "pdfmapline", "pdfmajorversion", "pdfminorversion", "pdfnames", "pdfnoligatures", "pdfnormaldeviate", "pdfobj", "pdfobjcompresslevel", "pdfoutline", "pdfoutput", "pdfpageattr", "pdfpagebox", "pdfpageheight", "pdfpageref", "pdfpageresources", "pdfpagesattr", "pdfpagewidth", "pdfpkfixeddpi", "pdfpkmode", "pdfpkresolution", "pdfprimitive", "pdfprotrudechars", "pdfpxdimen", "pdfrandomseed", "pdfrefobj", "pdfrefxform", "pdfrefximage", "pdfreplacefont", "pdfrestore", "pdfretval", "pdfsave", "pdfsavepos", "pdfsetmatrix", "pdfsetrandomseed", "pdfstartlink", "pdfstartthread", "pdfsuppressoptionalinfo", "pdfsuppressptexinfo", "pdftexbanner", "pdftexrevision", "pdftexversion", "pdfthread", "pdfthreadmargin", "pdftracingfonts", "pdftrailer", "pdftrailerid", "pdfuniformdeviate", "pdfuniqueresname", "pdfvorigin", "pdfxform", "pdfxformattr", "pdfxformmargin", "pdfxformname", "pdfxformresources", "pdfximage" }, + ["tex"]={ " ", "-", "/", "Uleft", "Umiddle", "Uright", "above", "abovedisplayshortskip", "abovedisplayskip", "abovewithdelims", "accent", "adjdemerits", "advance", "afterassignment", "aftergroup", "atop", "atopwithdelims", "badness", "baselineskip", "batchmode", "begingroup", "belowdisplayshortskip", "belowdisplayskip", "binoppenalty", "botmark", "boundary", "box", "boxmaxdepth", "brokenpenalty", "catcode", "char", "chardef", "cleaders", "closein", "closeout", "clubpenalty", "copy", "count", "countdef", "cr", "crcr", "csname", "csstring", "day", "deadcycles", "def", "defaulthyphenchar", "defaultskewchar", "delcode", "delimiter", "delimiterfactor", "delimitershortfall", "dimen", "dimendef", "directlua", "discretionary", "displayindent", "displaylimits", "displaystyle", "displaywidowpenalty", "displaywidth", "divide", "doublehyphendemerits", "dp", "dump", "edef", "else", "emergencystretch", "end", "endcsname", "endgroup", "endinput", "endlinechar", "eqno", "errhelp", "errmessage", "errorcontextlines", "errorstopmode", "escapechar", "everycr", "everydisplay", "everyhbox", "everyjob", "everymath", "everypar", "everyvbox", "exhyphenchar", "exhyphenpenalty", "expandafter", "fam", "fi", "finalhyphendemerits", "firstmark", "firstvalidlanguage", "floatingpenalty", "font", "fontdimen", "fontname", "futurelet", "gdef", "global", "globaldefs", "halign", "hangafter", "hangindent", "hbadness", "hbox", "hfil", "hfill", "hfilneg", "hfuzz", "hoffset", "holdinginserts", "hpack", "hrule", "hsize", "hskip", "hss", "ht", "hyphenation", "hyphenchar", "hyphenpenalty", "if", "ifcase", "ifcat", "ifdim", "ifeof", "iffalse", "ifhbox", "ifhmode", "ifinner", "ifmmode", "ifnum", "ifodd", "iftrue", "ifvbox", "ifvmode", "ifvoid", "ifx", "ignorespaces", "immediate", "indent", "input", "inputlineno", "insert", "insertpenalties", "interlinepenalty", "jobname", "kern", "language", "lastbox", "lastkern", "lastpenalty", "lastskip", "lccode", "leaders", "left", "lefthyphenmin", "leftskip", "leqno", "let", "limits", "linepenalty", "lineskip", "lineskiplimit", "long", "looseness", "lower", "lowercase", "mag", "mark", "mathaccent", "mathbin", "mathchar", "mathchardef", "mathchoice", "mathclose", "mathcode", "mathinner", "mathop", "mathopen", "mathord", "mathpunct", "mathrel", "mathsurround", "maxdeadcycles", "maxdepth", "meaning", "medmuskip", "message", "middle", "mkern", "month", "moveleft", "moveright", "mskip", "multiply", "muskip", "muskipdef", "newlinechar", "noalign", "noboundary", "noexpand", "noindent", "nolimits", "nonscript", "nonstopmode", "nulldelimiterspace", "nullfont", "number", "omit", "openin", "openout", "or", "outer", "output", "outputpenalty", "over", "overfullrule", "overline", "overwithdelims", "pagedepth", "pagefilllstretch", "pagefillstretch", "pagefilstretch", "pagegoal", "pageshrink", "pagestretch", "pagetotal", "par", "parfillskip", "parindent", "parshape", "parskip", "patterns", "pausing", "penalty", "postdisplaypenalty", "predisplaypenalty", "predisplaysize", "pretolerance", "prevdepth", "prevgraf", "protrusionboundary", "radical", "raise", "read", "relax", "relpenalty", "right", "righthyphenmin", "rightskip", "romannumeral", "scriptfont", "scriptscriptfont", "scriptscriptstyle", "scriptspace", "scriptstyle", "scrollmode", "setbox", "setlanguage", "sfcode", "shipout", "show", "showbox", "showboxbreadth", "showboxdepth", "showlists", "showthe", "skewchar", "skip", "skipdef", "spacefactor", "spaceskip", "span", "special", "splitbotmark", "splitfirstmark", "splitmaxdepth", "splittopskip", "string", "tabskip", "textfont", "textstyle", "the", "thickmuskip", "thinmuskip", "time", "toks", "toksdef", "tolerance", "topmark", "topskip", "tpack", "tracingcommands", "tracinglostchars", "tracingmacros", "tracingonline", "tracingoutput", "tracingpages", "tracingparagraphs", "tracingrestores", "tracingstats", "uccode", "uchyph", "underline", "unhbox", "unhcopy", "unkern", "unpenalty", "unskip", "unvbox", "unvcopy", "uppercase", "vadjust", "valign", "vbadness", "vbox", "vcenter", "vfil", "vfill", "vfilneg", "vfuzz", "voffset", "vpack", "vrule", "vsize", "vskip", "vsplit", "vss", "vtop", "wd", "widowpenalty", "wordboundary", "write", "xdef", "xleaders", "xspaceskip", "year" }, ["xetex"]={ "XeTeXversion" }, }
\ No newline at end of file diff --git a/context/data/textadept/context/lexers/scite-context-lexer-bibtex.lua b/context/data/textadept/context/lexers/scite-context-lexer-bibtex.lua index dce24a2b9..b53da82ea 100644 --- a/context/data/textadept/context/lexers/scite-context-lexer-bibtex.lua +++ b/context/data/textadept/context/lexers/scite-context-lexer-bibtex.lua @@ -10,23 +10,22 @@ local global, string, table, lpeg = _G, string, table, lpeg local P, R, S, V = lpeg.P, lpeg.R, lpeg.S, lpeg.V local type = type --- local lexer = require("lexer") -local lexer = require("scite-context-lexer") -local context = lexer.context -local patterns = context.patterns +local lexer = require("scite-context-lexer") +local context = lexer.context +local patterns = context.patterns -local token = lexer.token -local exact_match = lexer.exact_match +local token = lexer.token +local exact_match = lexer.exact_match -local bibtexlexer = lexer.new("bib","scite-context-lexer-bibtex") -local whitespace = bibtexlexer.whitespace +local bibtexlexer = lexer.new("bib","scite-context-lexer-bibtex") +local whitespace = bibtexlexer.whitespace - local escape, left, right = P("\\"), P('{'), P('}') +local escape, left, right = P("\\"), P('{'), P('}') - patterns.balanced = P { - [1] = ((escape * (left+right)) + (1 - (left+right)) + V(2))^0, - [2] = left * V(1) * right - } +patterns.balanced = P { + [1] = ((escape * (left+right)) + (1 - (left+right)) + V(2))^0, + [2] = left * V(1) * right +} -- taken from bibl-bib.lua diff --git a/context/data/textadept/context/lexers/scite-context-lexer-bidi.lua b/context/data/textadept/context/lexers/scite-context-lexer-bidi.lua new file mode 100644 index 000000000..ea9c56712 --- /dev/null +++ b/context/data/textadept/context/lexers/scite-context-lexer-bidi.lua @@ -0,0 +1,598 @@ +local info = { + version = 1.002, + comment = "scintilla lpeg lexer for plain text (with spell checking)", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files", +} + +local P, S, Cmt, Cp = lpeg.P, lpeg.S, lpeg.Cmt, lpeg.Cp +local find, match = string.find, string.match + +local lexer = require("scite-context-lexer") +local context = lexer.context +local patterns = context.patterns + +local token = lexer.token + +local bidilexer = lexer.new("bidi","scite-context-lexer-bidi") +local whitespace = bidilexer.whitespace + +local space = patterns.space +local any = patterns.any + +-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- + +require("char-def") + +characters.directions = { } + +setmetatable(characters.directions,{ __index = function(t,k) + local d = data[k] + if d then + local v = d.direction + if v then + t[k] = v + return v + end + end + t[k] = false -- maybe 'l' + return false +end }) + +characters.mirrors = { } + +setmetatable(characters.mirrors,{ __index = function(t,k) + local d = data[k] + if d then + local v = d.mirror + if v then + t[k] = v + return v + end + end + t[k] = false + return false +end }) + +characters.textclasses = { } + +setmetatable(characters.textclasses,{ __index = function(t,k) + local d = data[k] + if d then + local v = d.textclass + if v then + t[k] = v + return v + end + end + t[k] = false + return false +end }) + +local directiondata = characters.directions +local mirrordata = characters.mirrors +local textclassdata = characters.textclasses + +local maximum_stack = 0xFF -- unicode: 60, will be jumped to 125, we don't care too much +local analyze_fences = false + +local whitespace = { + lre = true, + rle = true, + lro = true, + rlo = true, + pdf = true, + bn = true, + ws = true, +} + +local b_s_ws_on = { + b = true, + s = true, + ws = true, + on = true +} + +local mt_space = { __index = { char = 0x0020, direction = "ws", original = "ws", level = 0 } } +local mt_lre = { __index = { char = 0x202A, direction = "lre", original = "lre", level = 0 } } +local mt_rle = { __index = { char = 0x202B, direction = "rle", original = "rle", level = 0 } } +local mt_pdf = { __index = { char = 0x202C, direction = "pdf", original = "pdf", level = 0 } } +local mt_object = { __index = { char = 0xFFFC, direction = "on", original = "on", level = 0 } } + +local list = { } +local stack = { } + +setmetatable(stack, { __index = function(t,k) local v = { } t[k] = v return v end }) + +local function build_list(head) + -- P1 + local size = 0 + lpegmatch(pattern,head) + return list, size +end + +local function resolve_fences(list,size,start,limit) + -- N0: funny effects, not always better, so it's an option + local nofstack = 0 + for i=start,limit do + local entry = list[i] + if entry.direction == "on" then + local char = entry.char + local mirror = mirrordata[char] + if mirror then + local class = textclassdata[char] + entry.mirror = mirror + entry.class = class + if class == "open" then + nofstack = nofstack + 1 + local stacktop = stack[nofstack] + stacktop[1] = mirror + stacktop[2] = i + stacktop[3] = false -- not used + elseif nofstack == 0 then + -- skip + elseif class == "close" then + while nofstack > 0 do + local stacktop = stack[nofstack] + if stacktop[1] == char then + local open = stacktop[2] + local close = i + list[open ].paired = close + list[close].paired = open + break + else + -- do we mirror or not + end + nofstack = nofstack - 1 + end + end + end + end + end +end + +local function get_baselevel(list,size,direction) + if direction == "TRT" then + return 1, "TRT", true + elseif direction == "TLT" then + return 0, "TLT", true + end + -- P2, P3: + for i=1,size do + local entry = list[i] + local direction = entry.direction + if direction == "r" or direction == "al" then -- and an ? + return 1, "TRT", true + elseif direction == "l" then + return 0, "TLT", true + end + end + return 0, "TLT", false +end + +local function resolve_explicit(list,size,baselevel) +-- if list.rle or list.lre or list.rlo or list.lro then + -- X1 + local level = baselevel + local override = "on" + local nofstack = 0 + for i=1,size do + local entry = list[i] + local direction = entry.direction + -- X2 + if direction == "rle" then + if nofstack < maximum_stack then + nofstack = nofstack + 1 + local stacktop = stack[nofstack] + stacktop[1] = level + stacktop[2] = override + level = level + (level % 2 == 1 and 2 or 1) -- least_greater_odd(level) + override = "on" + entry.level = level + entry.direction = "bn" + entry.remove = true + end + -- X3 + elseif direction == "lre" then + if nofstack < maximum_stack then + nofstack = nofstack + 1 + local stacktop = stack[nofstack] + stacktop[1] = level + stacktop[2] = override + level = level + (level % 2 == 1 and 1 or 2) -- least_greater_even(level) + override = "on" + entry.level = level + entry.direction = "bn" + entry.remove = true + end + -- X4 + elseif direction == "rlo" then + if nofstack < maximum_stack then + nofstack = nofstack + 1 + local stacktop = stack[nofstack] + stacktop[1] = level + stacktop[2] = override + level = level + (level % 2 == 1 and 2 or 1) -- least_greater_odd(level) + override = "r" + entry.level = level + entry.direction = "bn" + entry.remove = true + end + -- X5 + elseif direction == "lro" then + if nofstack < maximum_stack then + nofstack = nofstack + 1 + local stacktop = stack[nofstack] + stacktop[1] = level + stacktop[2] = override + level = level + (level % 2 == 1 and 1 or 2) -- least_greater_even(level) + override = "l" + entry.level = level + entry.direction = "bn" + entry.remove = true + end + -- X7 + elseif direction == "pdf" then + if nofstack < maximum_stack then + local stacktop = stack[nofstack] + level = stacktop[1] + override = stacktop[2] + nofstack = nofstack - 1 + entry.level = level + entry.direction = "bn" + entry.remove = true + end + -- X6 + else + entry.level = level + if override ~= "on" then + entry.direction = override + end + end + end +-- else +-- for i=1,size do +-- list[i].level = baselevel +-- end +-- end + -- X8 (reset states and overrides after paragraph) +end + +local function resolve_weak(list,size,start,limit,orderbefore,orderafter) + -- W1: non spacing marks get the direction of the previous character +-- if list.nsm then + for i=start,limit do + local entry = list[i] + if entry.direction == "nsm" then + if i == start then + entry.direction = orderbefore + else + entry.direction = list[i-1].direction + end + end + end +-- end + -- W2: mess with numbers and arabic +-- if list.en then + for i=start,limit do + local entry = list[i] + if entry.direction == "en" then + for j=i-1,start,-1 do + local prev = list[j] + local direction = prev.direction + if direction == "al" then + entry.direction = "an" + break + elseif direction == "r" or direction == "l" then + break + end + end + end + end +-- end + -- W3 +-- if list.al then + for i=start,limit do + local entry = list[i] + if entry.direction == "al" then + entry.direction = "r" + end + end +-- end + -- W4: make separators number +-- if list.es or list.cs then + -- skip +-- if false then + if false then + for i=start+1,limit-1 do + local entry = list[i] + local direction = entry.direction + if direction == "es" then + if list[i-1].direction == "en" and list[i+1].direction == "en" then + entry.direction = "en" + end + elseif direction == "cs" then + local prevdirection = list[i-1].direction + if prevdirection == "en" then + if list[i+1].direction == "en" then + entry.direction = "en" + end + elseif prevdirection == "an" and list[i+1].direction == "an" then + entry.direction = "an" + end + end + end + else -- only more efficient when we have es/cs + local runner = start + 2 + local before = list[start] + local entry = list[start + 1] + local after = list[runner] + while after do + local direction = entry.direction + if direction == "es" then + if before.direction == "en" and after.direction == "en" then + entry.direction = "en" + end + elseif direction == "cs" then + local prevdirection = before.direction + if prevdirection == "en" then + if after.direction == "en" then + entry.direction = "en" + end + elseif prevdirection == "an" and after.direction == "an" then + entry.direction = "an" + end + end + before = current + current = after + after = list[runner] + runner = runner + 1 + end + end +-- end + -- W5 +-- if list.et then + local i = start + while i <= limit do + if list[i].direction == "et" then + local runstart = i + local runlimit = runstart + for i=runstart,limit do + if list[i].direction == "et" then + runlimit = i + else + break + end + end + local rundirection = runstart == start and sor or list[runstart-1].direction + if rundirection ~= "en" then + rundirection = runlimit == limit and orderafter or list[runlimit+1].direction + end + if rundirection == "en" then + for j=runstart,runlimit do + list[j].direction = "en" + end + end + i = runlimit + end + i = i + 1 + end +-- end + -- W6 +-- if list.es or list.cs or list.et then + for i=start,limit do + local entry = list[i] + local direction = entry.direction + if direction == "es" or direction == "et" or direction == "cs" then + entry.direction = "on" + end + end +-- end + -- W7 + for i=start,limit do + local entry = list[i] + if entry.direction == "en" then + local prev_strong = orderbefore + for j=i-1,start,-1 do + local direction = list[j].direction + if direction == "l" or direction == "r" then + prev_strong = direction + break + end + end + if prev_strong == "l" then + entry.direction = "l" + end + end + end +end + +local function resolve_neutral(list,size,start,limit,orderbefore,orderafter) + -- N1, N2 + for i=start,limit do + local entry = list[i] + if b_s_ws_on[entry.direction] then + -- this needs checking + local leading_direction, trailing_direction, resolved_direction + local runstart = i + local runlimit = runstart + for j=runstart+1,limit do + if b_s_ws_on[list[j].direction] then + runlimit = j + else + break + end + end + if runstart == start then + leading_direction = orderbefore + else + leading_direction = list[runstart-1].direction + if leading_direction == "en" or leading_direction == "an" then + leading_direction = "r" + end + end + if runlimit == limit then + trailing_direction = orderafter + else + trailing_direction = list[runlimit+1].direction + if trailing_direction == "en" or trailing_direction == "an" then + trailing_direction = "r" + end + end + if leading_direction == trailing_direction then + -- N1 + resolved_direction = leading_direction + else + -- N2 / does the weird period + resolved_direction = entry.level % 2 == 1 and "r" or "l" + end + for j=runstart,runlimit do + list[j].direction = resolved_direction + end + i = runlimit + end + i = i + 1 + end +end + +local function resolve_implicit(list,size,start,limit,orderbefore,orderafter,baselevel) + for i=start,limit do + local entry = list[i] + local level = entry.level + local direction = entry.direction + if level % 2 ~= 1 then -- even + -- I1 + if direction == "r" then + entry.level = level + 1 + elseif direction == "an" or direction == "en" then + entry.level = level + 2 + end + else + -- I2 + if direction == "l" or direction == "en" or direction == "an" then + entry.level = level + 1 + end + end + end +end + +local function resolve_levels(list,size,baselevel,analyze_fences) + -- X10 + local start = 1 + while start < size do + local level = list[start].level + local limit = start + 1 + while limit < size and list[limit].level == level do + limit = limit + 1 + end + local prev_level = start == 1 and baselevel or list[start-1].level + local next_level = limit == size and baselevel or list[limit+1].level + local orderbefore = (level > prev_level and level or prev_level) % 2 == 1 and "r" or "l" + local orderafter = (level > next_level and level or next_level) % 2 == 1 and "r" or "l" + -- W1 .. W7 + resolve_weak(list,size,start,limit,orderbefore,orderafter) + -- N0 + if analyze_fences then + resolve_fences(list,size,start,limit) + end + -- N1 .. N2 + resolve_neutral(list,size,start,limit,orderbefore,orderafter) + -- I1 .. I2 + resolve_implicit(list,size,start,limit,orderbefore,orderafter,baselevel) + start = limit + end + -- L1 + for i=1,size do + local entry = list[i] + local direction = entry.original + -- (1) + if direction == "s" or direction == "b" then + entry.level = baselevel + -- (2) + for j=i-1,1,-1 do + local entry = list[j] + if whitespace[entry.original] then + entry.level = baselevel + else + break + end + end + end + end + -- (3) + for i=size,1,-1 do + local entry = list[i] + if whitespace[entry.original] then + entry.level = baselevel + else + break + end + end + -- L4 + if analyze_fences then + for i=1,size do + local entry = list[i] + if entry.level % 2 == 1 then -- odd(entry.level) + if entry.mirror and not entry.paired then + entry.mirror = false + end + -- okay + elseif entry.mirror then + entry.mirror = false + end + end + else + for i=1,size do + local entry = list[i] + if entry.level % 2 == 1 then -- odd(entry.level) + local mirror = mirrordata[entry.char] + if mirror then + entry.mirror = mirror + end + end + end + end +end + +local index = 1 + +local function process(head,direction) + local list, size = build_list(head) + local baselevel = get_baselevel(list,size,direction) -- we always have an inline dir node in context + resolve_explicit(list,size,baselevel) + resolve_levels(list,size,baselevel,analyze_fences) + index = 1 + return list, size +end + +-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- + +local utf = lexer.helpers.utfbytepattern + +-- local t_start = token("default", utf, function(s,i) if i == 1 then index = 1 process(s) end end)) +-- local t_bidi = token("error", utf / function() index = index + 1 return list[index].direction == "r" end) +-- local t_rest = token("default", any) + +-- bidilexer._rules = { +-- { "start", t_start }, +-- { "bidi", t_bidi }, +-- { "rest", t_rest }, +-- } + +bidilexer._grammar = #utf * function(s,i) + process(s) + local t = { } + local n = 0 + for i=1,size do + n = n + 1 t[n] = i + n = n + 1 t[n] = "error" + end + return t +end + +bidilexer._tokenstyles = context.styleset + +return bidilexer diff --git a/context/data/textadept/context/lexers/scite-context-lexer-cld.lua b/context/data/textadept/context/lexers/scite-context-lexer-cld.lua index a5fbf9cd7..7bda7800e 100644 --- a/context/data/textadept/context/lexers/scite-context-lexer-cld.lua +++ b/context/data/textadept/context/lexers/scite-context-lexer-cld.lua @@ -6,13 +6,12 @@ local info = { license = "see context related readme files", } --- local lexer = require("lexer") -local lexer = require("scite-context-lexer") -local context = lexer.context -local patterns = context.patterns +local lexer = require("scite-context-lexer") +local context = lexer.context +local patterns = context.patterns -local cldlexer = lexer.new("cld","scite-context-lexer-cld") -local lualexer = lexer.load("scite-context-lexer-lua") +local cldlexer = lexer.new("cld","scite-context-lexer-cld") +local lualexer = lexer.load("scite-context-lexer-lua") -- can probably be done nicer now, a bit of a hack diff --git a/context/data/textadept/context/lexers/scite-context-lexer-cpp-web.lua b/context/data/textadept/context/lexers/scite-context-lexer-cpp-web.lua index e8ff3c1ff..631a802fe 100644 --- a/context/data/textadept/context/lexers/scite-context-lexer-cpp-web.lua +++ b/context/data/textadept/context/lexers/scite-context-lexer-cpp-web.lua @@ -6,13 +6,12 @@ local info = { license = "see context related readme files", } --- local lexer = require("lexer") -local lexer = require("scite-context-lexer") -local context = lexer.context -local patterns = context.patterns +local lexer = require("scite-context-lexer") +local context = lexer.context +local patterns = context.patterns -local cppweblexer = lexer.new("cpp-web","scite-context-lexer-cpp") -local cpplexer = lexer.load("scite-context-lexer-cpp") +local cppweblexer = lexer.new("cpp-web","scite-context-lexer-cpp") +local cpplexer = lexer.load("scite-context-lexer-cpp") -- can probably be done nicer now, a bit of a hack diff --git a/context/data/textadept/context/lexers/scite-context-lexer-cpp.lua b/context/data/textadept/context/lexers/scite-context-lexer-cpp.lua index d56dc58f9..d9079855f 100644 --- a/context/data/textadept/context/lexers/scite-context-lexer-cpp.lua +++ b/context/data/textadept/context/lexers/scite-context-lexer-cpp.lua @@ -10,8 +10,7 @@ local info = { local P, R, S = lpeg.P, lpeg.R, lpeg.S --- local lexer = require("lexer") -local lexer = require("scite-context-lexer") +local lexer = require("scite-context-lexer") local context = lexer.context local patterns = context.patterns diff --git a/context/data/textadept/context/lexers/scite-context-lexer-dummy.lua b/context/data/textadept/context/lexers/scite-context-lexer-dummy.lua index 69590ed34..5d3096b7d 100644 --- a/context/data/textadept/context/lexers/scite-context-lexer-dummy.lua +++ b/context/data/textadept/context/lexers/scite-context-lexer-dummy.lua @@ -1,4 +1,4 @@ --- local info = { +local info = { version = 1.002, comment = "scintilla lpeg lexer that triggers whitespace backtracking", author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", @@ -10,8 +10,7 @@ -- we need to trigger that, for instance in the bibtex lexer, but still -- we get failed lexing --- local lexer = require("lexer") -local lexer = require("scite-context-lexer") +local lexer = require("scite-context-lexer") local context = lexer.context local patterns = context.patterns diff --git a/context/data/textadept/context/lexers/scite-context-lexer-lua-longstring.lua b/context/data/textadept/context/lexers/scite-context-lexer-lua-longstring.lua index 5d5b689d2..b1304f65c 100644 --- a/context/data/textadept/context/lexers/scite-context-lexer-lua-longstring.lua +++ b/context/data/textadept/context/lexers/scite-context-lexer-lua-longstring.lua @@ -6,8 +6,7 @@ local info = { license = "see context related readme files", } --- local lexer = require("lexer") -local lexer = require("scite-context-lexer") +local lexer = require("scite-context-lexer") local context = lexer.context local patterns = context.patterns diff --git a/context/data/textadept/context/lexers/scite-context-lexer-lua.lua b/context/data/textadept/context/lexers/scite-context-lexer-lua.lua index a8aa8dbe3..ba14f5206 100644 --- a/context/data/textadept/context/lexers/scite-context-lexer-lua.lua +++ b/context/data/textadept/context/lexers/scite-context-lexer-lua.lua @@ -13,7 +13,6 @@ local P, R, S, C, Cmt, Cp = lpeg.P, lpeg.R, lpeg.S, lpeg.C, lpeg.Cmt, lpeg.Cp local match, find = string.match, string.find local setmetatable = setmetatable --- local lexer = require("lexer") local lexer = require("scite-context-lexer") local context = lexer.context local patterns = context.patterns @@ -47,7 +46,7 @@ local functions = { "pcall", "print", "rawequal", "rawget", "rawset", "require", "setmetatable", "tonumber", "tostring", "type", "unpack", "xpcall", "select", - "string", "table", "coroutine", "debug", "file", "io", "lpeg", "math", "os", "package", "bit32", + "string", "table", "coroutine", "debug", "file", "io", "lpeg", "math", "os", "package", "bit32", "utf8", } local constants = { diff --git a/context/data/textadept/context/lexers/scite-context-lexer-mps.lua b/context/data/textadept/context/lexers/scite-context-lexer-mps.lua index e24a41d0c..1c87ea6d0 100644 --- a/context/data/textadept/context/lexers/scite-context-lexer-mps.lua +++ b/context/data/textadept/context/lexers/scite-context-lexer-mps.lua @@ -10,8 +10,7 @@ local global, string, table, lpeg = _G, string, table, lpeg local P, R, S, V = lpeg.P, lpeg.R, lpeg.S, lpeg.V local type = type --- local lexer = require("lexer") -local lexer = require("scite-context-lexer") +local lexer = require("scite-context-lexer") local context = lexer.context local patterns = context.patterns diff --git a/context/data/textadept/context/lexers/scite-context-lexer-pdf-object.lua b/context/data/textadept/context/lexers/scite-context-lexer-pdf-object.lua index cdf33cf7c..155a9bd51 100644 --- a/context/data/textadept/context/lexers/scite-context-lexer-pdf-object.lua +++ b/context/data/textadept/context/lexers/scite-context-lexer-pdf-object.lua @@ -10,8 +10,7 @@ local info = { local P, R, S, C, V = lpeg.P, lpeg.R, lpeg.S, lpeg.C, lpeg.V --- local lexer = require("lexer") -local lexer = require("scite-context-lexer") +local lexer = require("scite-context-lexer") local context = lexer.context local patterns = context.patterns diff --git a/context/data/textadept/context/lexers/scite-context-lexer-pdf-xref.lua b/context/data/textadept/context/lexers/scite-context-lexer-pdf-xref.lua index f08d16488..14ba5296b 100644 --- a/context/data/textadept/context/lexers/scite-context-lexer-pdf-xref.lua +++ b/context/data/textadept/context/lexers/scite-context-lexer-pdf-xref.lua @@ -10,7 +10,6 @@ local info = { local P, R = lpeg.P, lpeg.R --- local lexer = require("lexer") local lexer = require("scite-context-lexer") local context = lexer.context local patterns = context.patterns diff --git a/context/data/textadept/context/lexers/scite-context-lexer-pdf.lua b/context/data/textadept/context/lexers/scite-context-lexer-pdf.lua index 1d4796ea5..0fd238d63 100644 --- a/context/data/textadept/context/lexers/scite-context-lexer-pdf.lua +++ b/context/data/textadept/context/lexers/scite-context-lexer-pdf.lua @@ -6,13 +6,12 @@ local info = { license = "see context related readme files", } --- pdf is normally startic .. i.e. not edited so we don't really +-- pdf is normally static .. i.e. not edited so we don't really -- need embedded lexers. local P, R, S, V = lpeg.P, lpeg.R, lpeg.S, lpeg.V --- local lexer = require("lexer") -local lexer = require("scite-context-lexer") +local lexer = require("scite-context-lexer") local context = lexer.context local patterns = context.patterns diff --git a/context/data/textadept/context/lexers/scite-context-lexer-sql.lua b/context/data/textadept/context/lexers/scite-context-lexer-sql.lua index ea432c5c9..cf0a03331 100644 --- a/context/data/textadept/context/lexers/scite-context-lexer-sql.lua +++ b/context/data/textadept/context/lexers/scite-context-lexer-sql.lua @@ -8,8 +8,7 @@ local info = { local P, R, S = lpeg.P, lpeg.R, lpeg.S --- local lexer = require("lexer") -local lexer = require("scite-context-lexer") +local lexer = require("scite-context-lexer") local context = lexer.context local patterns = context.patterns diff --git a/context/data/textadept/context/lexers/scite-context-lexer-tex-web.lua b/context/data/textadept/context/lexers/scite-context-lexer-tex-web.lua index 4a55fd143..88499a9c2 100644 --- a/context/data/textadept/context/lexers/scite-context-lexer-tex-web.lua +++ b/context/data/textadept/context/lexers/scite-context-lexer-tex-web.lua @@ -6,13 +6,12 @@ local info = { license = "see context related readme files", } --- local lexer = require("lexer") -local lexer = require("scite-context-lexer") -local context = lexer.context -local patterns = context.patterns +local lexer = require("scite-context-lexer") +local context = lexer.context +local patterns = context.patterns -local texweblexer = lexer.new("tex-web","scite-context-lexer-tex") -local texlexer = lexer.load("scite-context-lexer-tex") +local texweblexer = lexer.new("tex-web","scite-context-lexer-tex") +local texlexer = lexer.load("scite-context-lexer-tex") -- can probably be done nicer now, a bit of a hack diff --git a/context/data/textadept/context/lexers/scite-context-lexer-tex.lua b/context/data/textadept/context/lexers/scite-context-lexer-tex.lua index bc08bfcd9..1f1246fc0 100644 --- a/context/data/textadept/context/lexers/scite-context-lexer-tex.lua +++ b/context/data/textadept/context/lexers/scite-context-lexer-tex.lua @@ -31,8 +31,7 @@ local P, R, S, V, C, Cmt, Cp, Cc, Ct = lpeg.P, lpeg.R, lpeg.S, lpeg.V, lpeg.C, l local type, next = type, next local find, match, lower, upper = string.find, string.match, string.lower, string.upper --- local lexer = require("lexer") -local lexer = require("scite-context-lexer") +local lexer = require("scite-context-lexer") local context = lexer.context local patterns = context.patterns local inform = context.inform @@ -145,6 +144,9 @@ local validminimum = 3 -- fails (empty loop message) ... latest lpeg issue? +-- todo: Make sure we only do this at the beginning .. a pitty that we +-- can't store a state .. now is done too often. + local knownpreamble = Cmt(P("% "), function(input,i,_) -- todo : utfbomb, was #P("% ") if i < 10 then validwords, validminimum = false, 3 @@ -220,10 +222,12 @@ local p_comment = commentline ----- p_helper = backslash * exact_match(helpers) ----- p_primitive = backslash * exact_match(primitives) -local p_command = backslash * lexer.helpers.utfchartabletopattern(currentcommands) * #(1-cstoken) -local p_constant = backslash * lexer.helpers.utfchartabletopattern(constants) * #(1-cstoken) -local p_helper = backslash * lexer.helpers.utfchartabletopattern(helpers) * #(1-cstoken) -local p_primitive = backslash * lexer.helpers.utfchartabletopattern(primitives) * #(1-cstoken) +local p_csdone = #(1-cstoken) + P(-1) + +local p_command = backslash * lexer.helpers.utfchartabletopattern(currentcommands) * p_csdone +local p_constant = backslash * lexer.helpers.utfchartabletopattern(constants) * p_csdone +local p_helper = backslash * lexer.helpers.utfchartabletopattern(helpers) * p_csdone +local p_primitive = backslash * lexer.helpers.utfchartabletopattern(primitives) * p_csdone local p_ifprimitive = P("\\if") * cstoken^1 local p_csname = backslash * (cstoken^1 + P(1)) @@ -446,12 +450,17 @@ local stopmetafuncode = token("embedded", stopmetafun) local callers = token("embedded", P("\\") * metafuncall) * metafunarguments + token("embedded", P("\\") * luacall) -lexer.embed_lexer(contextlexer, cldlexer, startluacode, stopluacode) lexer.embed_lexer(contextlexer, mpslexer, startmetafuncode, stopmetafuncode) +lexer.embed_lexer(contextlexer, cldlexer, startluacode, stopluacode) + +-- preamble is inefficient as it probably gets called each time (so some day I really need to +-- patch the plugin) + +contextlexer._preamble = preamble contextlexer._rules = { { "whitespace", spacing }, - { "preamble", preamble }, + -- { "preamble", preamble }, { "word", word }, { "text", text }, -- non words { "comment", comment }, @@ -459,10 +468,10 @@ contextlexer._rules = { -- { "subsystem", subsystem }, { "callers", callers }, { "subsystem", subsystem }, + { "ifprimitive", ifprimitive }, { "helper", helper }, { "command", command }, { "primitive", primitive }, - { "ifprimitive", ifprimitive }, -- { "subsystem", subsystem }, { "reserved", reserved }, { "csname", csname }, @@ -490,10 +499,10 @@ if web then { "comment", comment }, { "constant", constant }, { "callers", callers }, + { "ifprimitive", ifprimitive }, { "helper", helper }, { "command", command }, { "primitive", primitive }, - { "ifprimitive", ifprimitive }, { "reserved", reserved }, { "csname", csname }, { "grouping", grouping }, @@ -514,10 +523,10 @@ else { "comment", comment }, { "constant", constant }, { "callers", callers }, + { "ifprimitive", ifprimitive }, { "helper", helper }, { "command", command }, { "primitive", primitive }, - { "ifprimitive", ifprimitive }, { "reserved", reserved }, { "csname", csname }, { "grouping", grouping }, diff --git a/context/data/textadept/context/lexers/scite-context-lexer-txt.lua b/context/data/textadept/context/lexers/scite-context-lexer-txt.lua index 152e9a663..8ecfff7cb 100644 --- a/context/data/textadept/context/lexers/scite-context-lexer-txt.lua +++ b/context/data/textadept/context/lexers/scite-context-lexer-txt.lua @@ -9,8 +9,7 @@ local info = { local P, S, Cmt, Cp = lpeg.P, lpeg.S, lpeg.Cmt, lpeg.Cp local find, match = string.find, string.match --- local lexer = require("lexer") -local lexer = require("scite-context-lexer") +local lexer = require("scite-context-lexer") local context = lexer.context local patterns = context.patterns diff --git a/context/data/textadept/context/lexers/scite-context-lexer-web-snippets.lua b/context/data/textadept/context/lexers/scite-context-lexer-web-snippets.lua index 141de20e1..3cef71739 100644 --- a/context/data/textadept/context/lexers/scite-context-lexer-web-snippets.lua +++ b/context/data/textadept/context/lexers/scite-context-lexer-web-snippets.lua @@ -8,8 +8,7 @@ local info = { local P, R, S, C, Cg, Cb, Cs, Cmt, lpegmatch = lpeg.P, lpeg.R, lpeg.S, lpeg.C, lpeg.Cg, lpeg.Cb, lpeg.Cs, lpeg.Cmt, lpeg.match --- local lexer = require("lexer") -local lexer = require("scite-context-lexer") +local lexer = require("scite-context-lexer") local context = lexer.context local patterns = context.patterns diff --git a/context/data/textadept/context/lexers/scite-context-lexer-web.lua b/context/data/textadept/context/lexers/scite-context-lexer-web.lua index 6fe5ac84c..81a6f90df 100644 --- a/context/data/textadept/context/lexers/scite-context-lexer-web.lua +++ b/context/data/textadept/context/lexers/scite-context-lexer-web.lua @@ -8,8 +8,7 @@ local info = { local P, R, S = lpeg.P, lpeg.R, lpeg.S --- local lexer = require("lexer") -local lexer = require("scite-context-lexer") +local lexer = require("scite-context-lexer") local context = lexer.context local patterns = context.patterns diff --git a/context/data/textadept/context/lexers/scite-context-lexer-xml-cdata.lua b/context/data/textadept/context/lexers/scite-context-lexer-xml-cdata.lua index 25fa9128f..f5ca86cb2 100644 --- a/context/data/textadept/context/lexers/scite-context-lexer-xml-cdata.lua +++ b/context/data/textadept/context/lexers/scite-context-lexer-xml-cdata.lua @@ -8,8 +8,7 @@ local info = { local P = lpeg.P --- local lexer = require("lexer") -local lexer = require("scite-context-lexer") +local lexer = require("scite-context-lexer") local context = lexer.context local patterns = context.patterns diff --git a/context/data/textadept/context/lexers/scite-context-lexer-xml-comment.lua b/context/data/textadept/context/lexers/scite-context-lexer-xml-comment.lua index 2d7260b69..40de8f603 100644 --- a/context/data/textadept/context/lexers/scite-context-lexer-xml-comment.lua +++ b/context/data/textadept/context/lexers/scite-context-lexer-xml-comment.lua @@ -8,8 +8,7 @@ local info = { local P = lpeg.P --- local lexer = require("lexer") -local lexer = require("scite-context-lexer") +local lexer = require("scite-context-lexer") local context = lexer.context local patterns = context.patterns diff --git a/context/data/textadept/context/lexers/scite-context-lexer-xml-script.lua b/context/data/textadept/context/lexers/scite-context-lexer-xml-script.lua index 1ee96ba89..a1b717a6a 100644 --- a/context/data/textadept/context/lexers/scite-context-lexer-xml-script.lua +++ b/context/data/textadept/context/lexers/scite-context-lexer-xml-script.lua @@ -8,7 +8,6 @@ local info = { local P = lpeg.P --- local lexer = require("lexer") local lexer = require("scite-context-lexer") local context = lexer.context local patterns = context.patterns diff --git a/context/data/textadept/context/lexers/scite-context-lexer-xml.lua b/context/data/textadept/context/lexers/scite-context-lexer-xml.lua index 1b7e2e897..bbdb3febc 100644 --- a/context/data/textadept/context/lexers/scite-context-lexer-xml.lua +++ b/context/data/textadept/context/lexers/scite-context-lexer-xml.lua @@ -17,8 +17,7 @@ local P, R, S, C, Cmt, Cp = lpeg.P, lpeg.R, lpeg.S, lpeg.C, lpeg.Cmt, lpeg.Cp local type = type local match, find = string.match, string.find --- local lexer = require("lexer") -local lexer = require("scite-context-lexer") +local lexer = require("scite-context-lexer") local context = lexer.context local patterns = context.patterns diff --git a/context/data/textadept/context/lexers/scite-context-lexer.lua b/context/data/textadept/context/lexers/scite-context-lexer.lua index e526d5045..37f236a89 100644 --- a/context/data/textadept/context/lexers/scite-context-lexer.lua +++ b/context/data/textadept/context/lexers/scite-context-lexer.lua @@ -8,11 +8,6 @@ local info = { } --- todo: hook into context resolver etc --- todo: only old api in lexers, rest in context subnamespace --- todo: make sure we can run in one state .. copies or shared? --- todo: auto-nesting - if lpeg.setmaxstack then lpeg.setmaxstack(1000) end local log = false @@ -27,169 +22,252 @@ local inspect = false -- can save some 15% (maybe easier on scintilla) -- GET GOING -- --- You need to copy this file over lexer.lua. In principle other lexers could work too but --- not now. Maybe some day. All patterns will move into the patterns name space. I might do --- the same with styles. If you run an older version of SciTE you can take one of the --- archives. Pre 3.41 versions can just be copied to the right path, as there we still use --- part of the normal lexer. +-- You need to copy this file over lexer.lua. In principle other lexers could work +-- too but not now. Maybe some day. All patterns will move into the patterns name +-- space. I might do the same with styles. If you run an older version of SciTE you +-- can take one of the archives. Pre 3.41 versions can just be copied to the right +-- path, as there we still use part of the normal lexer. Below we mention some +-- issues with different versions of SciTE. We try to keep up with changes but best +-- check careful if the version that yuou install works as expected because SciTE +-- and the scintillua dll need to be in sync. -- -- REMARK -- --- We started using lpeg lexing as soon as it came available. Because we had rather demanding --- files and also wanted to use nested lexers, we ended up with our own variant. At least at --- that time this was more robust and also faster (as we have some pretty large lua data files --- and also work with large xml files). As a consequence successive versions had to be adapted --- to changes in the (at that time still unstable) api. In addition to lexing we also have --- spell checking and such. Around version 3.60 things became more stable so I don't expect to --- change much. +-- We started using lpeg lexing as soon as it came available. Because we had rather +-- demanding files and also wanted to use nested lexers, we ended up with our own +-- variant. At least at that time this was more robust and also much faster (as we +-- have some pretty large Lua data files and also work with large xml files). As a +-- consequence successive versions had to be adapted to changes in the (at that time +-- still unstable) api. In addition to lexing we also have spell checking and such. +-- Around version 3.60 things became more stable so I don't expect to change much. +-- +-- LEXING -- --- STATUS +-- When pc's showed up we wrote our own editor (texedit) in MODULA 2. It was fast, +-- had multiple overlapping (text) windows, could run in the at most 1M memory at +-- that time, etc. The realtime file browsing with lexing that we had at that time +-- is still on my current wish list. The color scheme and logic that we used related +-- to the logic behind the ConTeXt user interface that evolved. -- --- todo: maybe use a special stripped version of the dll (stable api) and add a bit more --- interfacing to scintilla --- todo: investigate if we can use the already built in lua instance so that we can combine the --- power of lexign with extensions --- todo: play with hotspot and other properties (but no real need now) --- todo: maybe come up with an extension to the api subsystem --- todo: add proper tracing and so .. not too hard as we can run on mtxrun, but we lack a console --- for debugging (ok, chicken-egg as lexers probably need to be loaded before a console can --- kick in) --- todo: get rid of these lexers.STYLE_XX and lexers.XX (hide such details) +-- Later I rewrote the editor in perl/tk. I don't like the perl syntax but tk +-- widgets are very powerful and hard to beat. In fact, TextAdept reminds me of +-- that: wrap your own interface around a framework (tk had an edit control that one +-- could control completely not that different from scintilla). Last time I checked +-- it still ran fine so I might try to implement something like its file handling in +-- TextAdept. -- --- wish: access to all scite properties and in fact integrate in scite +-- In the end I settled for SciTE for which I wrote TeX and MetaPost lexers that +-- could handle keyword sets. With respect to lexing (syntax highlighting) ConTeXt +-- has a long history, if only because we need it for manuals. Anyway, in the end we +-- arrived at lpeg based lexing (which is quite natural as we have lots of lpeg +-- usage in ConTeXt). The basic color schemes haven't changed much. The most +-- prominent differences are the nested lexers. -- +-- In the meantime I made the lexer suitable for typesetting sources which was no +-- big deal as we already had that in place (ConTeXt used lpeg from the day it +-- showed up so we have several lexing options there too). -- --- In the meantime I made the lexer suitable for typesetting sources which was no big deal as we --- already had that in place (ConTeXt used lpeg from the day it showed up so we have several lexing --- options there too). +-- Keep in mind that in ConTeXt (typesetting) lexing can follow several approached: +-- line based (which is handy for verbatim mode), syntax mode (which is nice for +-- tutorials), and tolerant mode (so that one can also show bad examples or errors). +-- These demands can clash. -- -- HISTORY -- --- The fold and lex functions are copied and patched from original code by Mitchell (see lexer.lua). --- All errors are mine. The ability to use lpeg in scintilla is a real nice addition and a brilliant --- move. The code is a byproduct of the (mainly Lua based) textadept (at the time I ran into it was --- a rapidly moving target so I decided to stick ot SciTE). When I played with it, it had no realtime --- output pane but that seems to be dealt with now (2017). I need to have a look at it in more detail --- but a first test again mad the output hang and it was a bit slow too (and I also want the log pane --- as scite has it, on the right, in view). So, for now I stick to SciTE even when it's somewhat --- crippled by the fact that we cannot hook our own (language dependent) lexer into the output pane --- (somehow the errorlist lexer is hard coded into the editor). Hopefully that will change some day. --- So, how did we arrive where we're now. +-- The remarks below are more for myself so that I keep track of changes in the +-- way we adapt to the changes in the scintillua and scite. +-- +-- The fold and lex functions are copied and patched from original code by Mitchell +-- (see lexer.lua) in the scintillua distribution. So whatever I say below, assume +-- that all errors are mine. The ability to use lpeg in scintilla is a real nice +-- addition and a brilliant move. The code is a byproduct of the (mainly Lua based) +-- TextAdept which at the time I ran into it was a rapidly moving target so I +-- decided to stick ot SciTE. When I played with it, it had no realtime output pane +-- although that seems to be dealt with now (2017). I need to have a look at it in +-- more detail but a first test again made the output hang and it was a bit slow too +-- (and I also want the log pane as SciTE has it, on the right, in view). So, for +-- now I stick to SciTE even when it's somewhat crippled by the fact that we cannot +-- hook our own (language dependent) lexer into the output pane (somehow the +-- errorlist lexer is hard coded into the editor). Hopefully that will change some +-- day. The ConTeXt distribution has cmd runner for textdept that will plug in the +-- lexers discussed here as well as a dedicated runner. Considere it an experiment. -- --- Starting with SciTE version 3.20 there is an issue with coloring. As we still lack a connection --- with SciTE itself (properties as well as printing to the log pane) and we cannot trace this (on --- windows). As far as I can see, there are no fundamental changes in lexer.lua or LexLPeg.cxx so it --- must be in Scintilla itself. So for the moment I stick to 3.10. Indicators are: no lexing of 'next' --- and 'goto <label>' in the Lua lexer and no brace highlighting either. Interesting is that it does --- work ok in the cld lexer (so the Lua code is okay). All seems to be ok again in later versions, --- so, when you update best check first and just switch back to an older version as normally a SciTE --- update is not critital. When char-def.lua lexes real fast this is a signal that the lexer quits --- somewhere halfway. Maybe there are some hard coded limitations on the amount of styles and/or --- length of names. +-- The basic code hasn't changed much but we had to adapt a few times to changes in +-- the api and/or work around bugs. Starting with SciTE version 3.20 there was an +-- issue with coloring. We still lacked a connection with SciTE itself (properties +-- as well as printing to the log pane) and we could not trace this (on windows). +-- However on unix we can see messages! As far as I can see, there are no +-- fundamental changes in lexer.lua or LexLPeg.cxx so it must be/have been in +-- Scintilla itself. So we went back to 3.10. Indicators of issues are: no lexing of +-- 'next' and 'goto <label>' in the Lua lexer and no brace highlighting either. +-- Interesting is that it does work ok in the cld lexer (so the Lua code is okay). +-- All seems to be ok again in later versions, so, when you update best check first +-- and just switch back to an older version as normally a SciTE update is not +-- critital. When char-def.lua lexes real fast this is a signal that the lexer quits +-- somewhere halfway. Maybe there are some hard coded limitations on the amount of +-- styles and/or length of names. -- --- Anyway, after checking 3.24 and adapting to the new lexer tables things are okay again. So, this --- version assumes 3.24 or higher. In 3.24 we have a different token result, i.e. no longer a { tag, --- pattern } but just two return values. I didn't check other changes but will do that when I run into --- issues. I had optimized these small tables by hashing which was more efficient but this is no longer --- needed. For the moment we keep some of that code around as I don't know what happens in future --- versions. I'm anyway still happy with this kind of lexing. +-- Anyway, after checking 3.24 and adapting to the new lexer tables things are okay +-- again. So, this version assumes 3.24 or higher. In 3.24 we have a different token +-- result, i.e. no longer a { tag, pattern } but just two return values. I didn't +-- check other changes but will do that when I run into issues. I had already +-- optimized these small tables by hashing which was much more efficient (and maybe +-- even more efficient than the current approach) but this is no longer needed. For +-- the moment we keep some of that code around as I don't know what happens in +-- future versions. I'm anyway still happy with this kind of lexing. -- --- In 3.31 another major change took place: some helper constants (maybe they're no longer constants) --- and functions were moved into the lexer modules namespace but the functions are assigned to the Lua --- module afterward so we cannot alias them beforehand. We're probably getting close to a stable --- interface now. I've considered making a whole copy and patch the other functions too as we need an --- extra nesting model. However, I don't want to maintain too much. An unfortunate change in 3.03 is --- that no longer a script can be specified. This means that instead of loading the extensions via the --- properties file, we now need to load them in our own lexers, unless of course we replace lexer.lua +-- In 3.31 another major change took place: some helper constants (maybe they're no +-- longer constants) and functions were moved into the lexer modules namespace but +-- the functions are assigned to the Lua module afterward so we cannot alias them +-- beforehand. We're probably getting close to a stable interface now. At that time +-- for the first time I considered making a whole copy and patch the other functions +-- too as we need an extra nesting model. However, I don't want to maintain too +-- much. An unfortunate change in 3.03 is that no longer a script can be specified. +-- This means that instead of loading the extensions via the properties file, we now +-- need to load them in our own lexers, unless of course we replace lexer.lua -- completely (which adds another installation issue). -- --- Another change has been that _LEXERHOME is no longer available. It looks like more and more --- functionality gets dropped so maybe at some point we need to ship our own dll/so files. For instance, --- I'd like to have access to the current filename and other scite properties. We could then cache some --- info with each file, if only we had knowledge of what file we're dealing with. +-- Another change has been that _LEXERHOME is no longer available. It looks like +-- more and more functionality gets dropped so maybe at some point we need to ship +-- our own dll/so files. For instance, I'd like to have access to the current +-- filename and other SciTE properties. We could then cache some info with each +-- file, if only we had knowledge of what file we're dealing with. This all makes a +-- nice installation more complex and (worse) makes it hard to share files between +-- different editors usign s similar directory structure. -- --- For huge files folding can be pretty slow and I do have some large ones that I keep open all the time. --- Loading is normally no ussue, unless one has remembered the status and the cursor is at the last line --- of a 200K line file. Optimizing the fold function brought down loading of char-def.lua from 14 sec --- => 8 sec. Replacing the word_match function and optimizing the lex function gained another 2+ seconds. --- A 6 second load is quite ok for me. The changed lexer table structure (no subtables) brings loading --- down to a few seconds. +-- For huge files folding can be pretty slow and I do have some large ones that I +-- keep open all the time. Loading is normally no ussue, unless one has remembered +-- the status and the cursor is at the last line of a 200K line file. Optimizing the +-- fold function brought down loading of char-def.lua from 14 sec => 8 sec. +-- Replacing the word_match function and optimizing the lex function gained another +-- 2+ seconds. A 6 second load is quite ok for me. The changed lexer table structure +-- (no subtables) brings loading down to a few seconds. -- --- When the lexer path is copied to the textadept lexer path, and the theme definition to theme path --- (as lexer.lua), the lexer works there as well. Although ... when I decided to check the state of --- textadept i had to adapt some loader code. It's not pretty but works and also permits overloading. --- When I have time and motive I will make a proper setup file to tune the look and feel a bit and --- associate suffixes with the context lexer. The textadept editor has a nice style tracing option but --- lacks the tabs for selecting files that scite has. It also has no integrated run that pipes to the --- log pane. Interesting is that the jit version of textadept crashes on lexing large files (and does --- not feel faster either; maybe a side effect of known limitations as we know that luajit is more --- limited than stock lua). Btw, in the meantime on unix one can test easier as there we can enable --- the loggers in this module. +-- When the lexer path is copied to the TextAdept lexer path, and the theme +-- definition to theme path (as lexer.lua), the lexer works there as well. Although +-- ... when I decided to check the state of TextAdept I had to adapt some loader +-- code. The solution is not pretty but works and also permits overloading. When I +-- have time and motive I will make a proper setup file to tune the look and feel a +-- bit more than we do now. The TextAdept editor nwo has tabs and a console so it +-- has become more useable for me (it's still somewhat slower than SciTE). +-- Interesting is that the jit version of TextAdept crashes on lexing large files +-- (and does not feel faster either; maybe a side effect of known limitations as we +-- know that Luajit is more limited than stock Lua). -- --- Function load(lexer_name) starts with _lexers.WHITESPACE = lexer_name .. '_whitespace' which means --- that we need to have it frozen at the moment we load another lexer. Because spacing is used to revert --- to a parent lexer we need to make sure that we load children as late as possible in order not to get --- the wrong whitespace trigger. This took me quite a while to figure out (not being that familiar with --- the internals). The lex and fold functions have been optimized. It is a pitty that there is no proper --- print available. Another thing needed is a default style in our own theme style definition, as otherwise --- we get wrong nested lexers, especially if they are larger than a view. This is the hardest part of +-- Function load(lexer_name) starts with _lexers.WHITESPACE = lexer_name .. +-- '_whitespace' which means that we need to have it frozen at the moment we load +-- another lexer. Because spacing is used to revert to a parent lexer we need to +-- make sure that we load children as late as possible in order not to get the wrong +-- whitespace trigger. This took me quite a while to figure out (not being that +-- familiar with the internals). The lex and fold functions have been optimized. It +-- is a pitty that there is no proper print available. Another thing needed is a +-- default style in our own theme style definition, as otherwise we get wrong nested +-- lexers, especially if they are larger than a view. This is the hardest part of -- getting things right. -- --- It's a pitty that there is no scintillua library for the OSX version of scite. Even better would be --- to have the scintillua library as integral part of scite as that way I could use OSX alongside --- windows and linux (depending on needs). Also nice would be to have a proper interface to scite then --- because currently the lexer is rather isolated and the lua version does not provide all standard --- libraries. It would also be good to have lpeg support in the regular scite lua extension (currently --- you need to pick it up from someplace else). +-- It's a pitty that there is no scintillua library for the OSX version of SciTE. +-- Even better would be to have the scintillua library as integral part of SciTE as +-- that way I could use OSX alongside windows and linux (depending on needs). Also +-- nice would be to have a proper interface to SciTE then because currently the +-- lexer is rather isolated and the Lua version does not provide all standard +-- libraries. It would also be good to have lpeg support in the regular SciTE Lua +-- extension (currently you need to pick it up from someplace else). I keep hoping. -- --- With 3.41 the interface changed again so it gets time to look into the C++ code and consider compiling --- and patching myself. Loading is more complicated now as the lexer gets loaded automatically so we have --- little control over extending the code now. After a few days trying all kind of solutions I decided to --- follow a different approach: drop in a complete replacement. This of course means that I need to keep --- track of even more changes (which for sure will happen) but at least I get rid of interferences. The --- api (lexing and configuration) is simply too unstable across versions. Maybe in a few years things have --- stabelized again. (Or maybe it's not really expected that one writes lexers at all.) A side effect is --- that I now no longer will use shipped lexers but just the built-in ones in addition to the context --- lpeg lexers. Not that it matters much as the context lexers cover what I need (and I can always write --- more). +-- With 3.41 the interface changed again so it became time to look into the C++ code +-- and consider compiling and patching myself, something that I like to avoid. +-- Loading is more complicated now as the lexer gets loaded automatically so we have +-- little control over extending the code now. After a few days trying all kind of +-- solutions I decided to follow a different approach: drop in a complete +-- replacement. This of course means that I need to keep track of even more changes +-- (which for sure will happen) but at least I get rid of interferences. Till 3.60 +-- the api (lexing and configuration) was simply too unstable across versions which +-- is a pitty because we expect authors to install SciTE without hassle. Maybe in a +-- few years things will have stabelized. Maybe it's also not really expected that +-- one writes lexers at all. A side effect is that I now no longer will use shipped +-- lexers for languages that I made no lexer for, but just the built-in ones in +-- addition to the ConTeXt lpeg lexers. Not that it matters much as the ConTeXt +-- lexers cover what I need (and I can always write more). For editing TeX files one +-- only needs a limited set of lexers (TeX, MetaPost, Lua, BibTeX, C/W, PDF, SQL, +-- etc). I can add more when I want. -- --- In fact, the transition to 3.41 was triggered by an unfateful update of Ubuntu which left me with an --- incompatible SciTE and lexer library and updating was not possible due to the lack of 64 bit libraries. --- We'll see what the future brings. +-- In fact, the transition to 3.41 was triggered by an unfateful update of Ubuntu +-- which left me with an incompatible SciTE and lexer library and updating was not +-- possible due to the lack of 64 bit libraries. We'll see what the future brings. +-- For now I can use SciTE under wine on linux. The fact that scintillua ships +-- independently is a showstopper. -- --- Promissing is that the library now can use another Lua instance so maybe some day it will get properly --- in SciTE and we can use more clever scripting. +-- Promissing is that the library now can use another Lua instance so maybe some day +-- it will get properly in SciTE and we can use more clever scripting. -- --- In some lexers we use embedded ones even if we could do it directly, The reason is that when the end --- token is edited (e.g. -->), backtracking to the space before the begin token (e.g. <!--) results in --- applying the surrounding whitespace which in turn means that when the end token is edited right, --- backtracking doesn't go back. One solution (in the dll) would be to backtrack several space categories. +-- In some lexers we use embedded ones even if we could do it directly, The reason +-- is that when the end token is edited (e.g. -->), backtracking to the space before +-- the begin token (e.g. <!--) results in applying the surrounding whitespace which +-- in turn means that when the end token is edited right, backtracking doesn't go +-- back. One solution (in the dll) would be to backtrack several space categories. -- After all, lexing is quite fast (applying the result is much slower). -- --- For some reason the first blob of text tends to go wrong (pdf and web). It would be nice to have 'whole --- doc' initial lexing. Quite fishy as it makes it impossible to lex the first part well (for already opened --- documents) because only a partial text is passed. +-- For some reason the first blob of text tends to go wrong (pdf and web). It would +-- be nice to have 'whole doc' initial lexing. Quite fishy as it makes it impossible +-- to lex the first part well (for already opened documents) because only a partial +-- text is passed. -- --- So, maybe I should just write this from scratch (assuming more generic usage) because after all, the dll --- expects just tables, based on a string. I can then also do some more aggressive resource sharing (needed --- when used generic). +-- So, maybe I should just write this from scratch (assuming more generic usage) +-- because after all, the dll expects just tables, based on a string. I can then +-- also do some more aggressive resource sharing (needed when used generic). -- --- I think that nested lexers are still bugged (esp over longer ranges). It never was robust or maybe it's --- simply not meant for too complex cases (well, it probably *is* tricky material). The 3.24 version was --- probably the best so far. The fact that styles bleed between lexers even if their states are isolated is --- an issue. Another issus is that zero characters in the text passed to the lexer can mess things up (pdf --- files have them in streams). +-- I think that nested lexers are still bugged (esp over longer ranges). It never +-- was robust or maybe it's simply not meant for too complex cases (well, it +-- probably *is* tricky material). The 3.24 version was probably the best so far. +-- The fact that styles bleed between lexers even if their states are isolated is an +-- issue. Another issus is that zero characters in the text passed to the lexer can +-- mess things up (pdf files have them in streams). -- --- For more complex 'languages', like web or xml, we need to make sure that we use e.g. 'default' for --- spacing that makes up some construct. Ok, we then still have a backtracking issue but less. +-- For more complex 'languages', like web or xml, we need to make sure that we use +-- e.g. 'default' for spacing that makes up some construct. Ok, we then still have a +-- backtracking issue but less. -- --- Good news for some ConTeXt users: there is now a scintillua plugin for notepad++ and we ship an ini --- file for that editor with some installation instructions embedded. +-- Good news for some ConTeXt users: there is now a scintillua plugin for notepad++ +-- and we ship an ini file for that editor with some installation instructions +-- embedded. Also, TextAdept has a console so that we can run realtime. The spawner +-- is still not perfect (sometimes hangs) but it was enough reason to spend time on +-- making our lexer work with TextAdept and create a setup. +-- +-- TRACING +-- +-- The advantage is that we now can check more easily with regular Lua(TeX). We can +-- also use wine and print to the console (somehow stdout is intercepted there.) So, +-- I've added a bit of tracing. Interesting is to notice that each document gets its +-- own instance which has advantages but also means that when we are spellchecking +-- we reload the word lists each time. (In the past I assumed a shared instance and +-- took some precautions. But I can fix this.) -- -- TODO -- --- I can make an export to context, but first I'll redo the code that makes the grammar, --- as we only seem to need +-- It would be nice if we could lods some ConTeXt Lua modules (the basic set) and +-- then use resolvers and such. +-- +-- The current lexer basics are still a mix between old and new. Maybe I should redo +-- some more. This is probably easier in TextAdept than in SciTE. +-- +-- We have to make sure we don't overload ConTeXt definitions when this code is used +-- in ConTeXt. I still have to add some of the goodies that we have there in lexers +-- into these. +-- +-- Maybe I should use a special stripped on the one hand and extended version of the +-- dll (stable api) and at least add a bit more interfacing to scintilla. +-- +-- I need to investigate if we can use the already built in Lua instance so that we +-- can combine the power of lexing with extensions. +-- +-- I need to play with hotspot and other properties like indicators (whatever they +-- are). +-- +-- I want to get rid of these lexers.STYLE_XX and lexers.XX things. This is possible +-- when we give up compatibility. Generalize the helpers that I wrote for SciTE so +-- that they also can be used TextAdept. +-- +-- I can make an export to ConTeXt, but first I'll redo the code that makes the +-- grammar, as we only seem to need -- -- lexer._TOKENSTYLES : table -- lexer._CHILDREN : flag @@ -199,38 +277,30 @@ local inspect = false -- can save some 15% (maybe easier on scintilla) -- lexers.load : function -- lexers.lex : function -- --- So, if we drop compatibility with other lex definitions, we can make things simpler. Howeverm in the --- meantime one can just do this: +-- So, if we drop compatibility with other lex definitions, we can make things +-- simpler. However, in the meantime one can just do this: -- -- context --extra=listing --scite [--compact --verycompact] somefile.tex -- --- and get a printable document. So, this todo is obsolete. - --- TRACING +-- and get a printable document. So, this todo is a bit obsolete. -- --- The advantage is that we now can check more easily with regular Lua(TeX). We can also use wine and print --- to the console (somehow stdout is intercepted there.) So, I've added a bit of tracing. Interesting is to --- notice that each document gets its own instance which has advantages but also means that when we are --- spellchecking we reload the word lists each time. (In the past I assumed a shared instance and took --- some precautions.) - --- todo: make sure we don't overload context definitions when used in context +-- Properties is an ugly mess ... due to chages in the interface we're now left +-- with some hybrid that sort of works ok --- properties is an ugly mess ... due to chages in the interface we're now left with some hybrid --- that sort of works ok +-- textadept: buffer:colourise(0,-1) local lpeg = require("lpeg") local global = _G -local find, gmatch, match, lower, upper, gsub, sub, format = string.find, string.gmatch, string.match, string.lower, string.upper, string.gsub, string.sub, string.format +local find, gmatch, match, lower, upper, gsub, sub, format, byte = string.find, string.gmatch, string.match, string.lower, string.upper, string.gsub, string.sub, string.format, string.byte local concat, sort = table.concat, table.sort local type, next, setmetatable, rawset, tonumber, tostring = type, next, setmetatable, rawset, tonumber, tostring local R, P, S, V, C, Cp, Cs, Ct, Cmt, Cc, Cf, Cg, Carg = lpeg.R, lpeg.P, lpeg.S, lpeg.V, lpeg.C, lpeg.Cp, lpeg.Cs, lpeg.Ct, lpeg.Cmt, lpeg.Cc, lpeg.Cf, lpeg.Cg, lpeg.Carg local lpegmatch = lpeg.match +local usage = (textadept and "textadept") or (resolvers and "context") or "scite" local nesting = 0 - -local print = (textadept and ui and ui.print) or print +local print = textadept and ui and ui.print or print local function report(fmt,str,...) if log then @@ -679,21 +749,34 @@ local locations = { -- end -- end -local function collect(name) - local rootlist = lexers.LEXERPATH or "." - for root in gmatch(rootlist,"[^;]+") do - local root = gsub(root,"/[^/]-lua$","") - for i=1,#locations do - local fullname = root .. "/" .. locations[i] .. "/" .. name .. ".lua" -- so we can also check for .luc - if trace then - report("attempt to locate '%s'",fullname) - end - local okay, result = pcall(function () return dofile(fullname) end) - if okay then - return result, fullname +local collect + +if usage == "context" then + + collect = function(name) + return require(name), name + end + +else + + collect = function(name) + local rootlist = lexers.LEXERPATH or "." + for root in gmatch(rootlist,"[^;]+") do + local root = gsub(root,"/[^/]-lua$","") + for i=1,#locations do + local fullname = root .. "/" .. locations[i] .. "/" .. name .. ".lua" -- so we can also check for .luc + if trace then + report("attempt to locate '%s'",fullname) + end + local okay, result = pcall(function () return dofile(fullname) end) + if okay then + return result, fullname + end end end + -- return require(name), name end + end function context.loadluafile(name) @@ -1371,25 +1454,33 @@ local function add_lexer(grammar, lexer) -- mostly the same as the original end local function build_grammar(lexer,initial_rule) -- same as the original - local children = lexer._CHILDREN + local children = lexer._CHILDREN local lexer_name = lexer._NAME - if children then + local preamble = lexer._preamble + local grammar = lexer._grammar + if grammar then + -- experiment + elseif children then if not initial_rule then initial_rule = lexer_name end - local grammar = { initial_rule } + grammar = { initial_rule } add_lexer(grammar, lexer) lexer._INITIALRULE = initial_rule - lexer._GRAMMAR = Ct(P(grammar)) + grammar = Ct(P(grammar)) if trace then report("building grammar for '%s' with whitespace '%s'and %s children",lexer_name,lexer.whitespace or "?",#children) end else - lexer._GRAMMAR = Ct(join_tokens(lexer)^0) + grammar = Ct(join_tokens(lexer)^0) if trace then report("building grammar for '%s' with whitespace '%s'",lexer_name,lexer.whitespace or "?") end end + if preamble then + grammar = preamble^-1 * grammar + end + lexer._GRAMMAR = grammar end -- So far. We need these local functions in the next one. @@ -1534,7 +1625,7 @@ function context.lex(lexer,text,init_style) if trace then report("lexing '%s' with initial style '%s' and %s children",lexer._NAME,#lexer._CHILDREN or 0,init_style) end - return matched(lexer,grammar,text) + return result else if trace then report("lexing '%s' with initial style '%s'",lexer._NAME,init_style) @@ -1733,7 +1824,7 @@ function context.loadlexer(filename,namespace) lexer = load_lexer(filename,namespace) or nolexer(filename,namespace) usedlexers[filename] = lexer -- - if not lexer._rules and not lexer._lexer then + if not lexer._rules and not lexer._lexer and not lexer_grammar then lexer._lexer = parent_lexer end -- @@ -1765,16 +1856,19 @@ function context.loadlexer(filename,namespace) end -- local _r = lexer._rules - if _r then + local _g = lexer._grammar + if _r or _g then local _s = lexer._tokenstyles if _s then for token, style in next, _s do add_style(lexer, token, style) end end - for i=1,#_r do - local rule = _r[i] - add_rule(lexer, rule[1], rule[2]) + if _r then + for i=1,#_r do + local rule = _r[i] + add_rule(lexer, rule[1], rule[2]) + end end build_grammar(lexer) end @@ -2001,10 +2095,20 @@ do -- return make(tree) -- end - helpers.utfcharpattern = P(1) * R("\128\191")^0 -- unchecked but fast + local utf8next = R("\128\191") + local utf8one = R("\000\127") + local utf8two = R("\194\223") * utf8next + local utf8three = R("\224\239") * utf8next * utf8next + local utf8four = R("\240\244") * utf8next * utf8next * utf8next + + helpers.utfcharpattern = P(1) * utf8next^0 -- unchecked but fast + helpers.utfbytepattern = utf8one / byte + + utf8two / function(s) local c1, c2 = byte(s,1,2) return c1 * 64 + c2 - 12416 end + + utf8three / function(s) local c1, c2, c3 = byte(s,1,3) return (c1 * 64 + c2) * 64 + c3 - 925824 end + + utf8four / function(s) local c1, c2, c3, c4 = byte(s,1,4) return ((c1 * 64 + c2) * 64 + c3) * 64 + c4 - 63447168 end - local p_false = P(false) - local p_true = P(true) + local p_false = P(false) + local p_true = P(true) local function make(t) local function making(t) diff --git a/context/data/textadept/context/modules/textadept-context-files.lua b/context/data/textadept/context/modules/textadept-context-files.lua index 5811280a2..d3412edc1 100644 --- a/context/data/textadept/context/modules/textadept-context-files.lua +++ b/context/data/textadept/context/modules/textadept-context-files.lua @@ -369,7 +369,7 @@ do newkeys[OSX and 'mc' or 'cc'] = runner.check newkeys[OSX and 'mr' or 'cr'] = runner.process newkeys[OSX and 'mp' or 'cp'] = runner.preview - newkeys[OSX and 'mx' or 'cx'] = runner.quit + -- newkeys[OSX and 'mx' or 'cx'] = runner.quit -- makes no sense newkeys['f7'] = runner.process newkeys['f12'] = runner.process diff --git a/context/data/textadept/context/modules/textadept-context-runner.lua b/context/data/textadept/context/modules/textadept-context-runner.lua index 4d0053996..d78a4f949 100644 --- a/context/data/textadept/context/modules/textadept-context-runner.lua +++ b/context/data/textadept/context/modules/textadept-context-runner.lua @@ -106,6 +106,9 @@ local function process(buffer,filename,action) if not filename then filename = buffer.filename end + if not filename then + return + end if filename == buffer.filename then buffer:annotation_clear_all() -- needed ? io.save_file() diff --git a/context/data/textadept/context/modules/textadept-context-types.lua b/context/data/textadept/context/modules/textadept-context-types.lua index 5c4dd3a21..552aa4e5f 100644 --- a/context/data/textadept/context/modules/textadept-context-types.lua +++ b/context/data/textadept/context/modules/textadept-context-types.lua @@ -54,9 +54,6 @@ install { end, } - - - install { lexer = "scite-context-lexer-xml", suffixes = { diff --git a/doc/context/documents/general/manuals/bidi.pdf b/doc/context/documents/general/manuals/bidi.pdf Binary files differnew file mode 100644 index 000000000..0d88c7de7 --- /dev/null +++ b/doc/context/documents/general/manuals/bidi.pdf diff --git a/doc/context/documents/general/manuals/cld-mkiv.pdf b/doc/context/documents/general/manuals/cld-mkiv.pdf Binary files differnew file mode 100644 index 000000000..bac02979f --- /dev/null +++ b/doc/context/documents/general/manuals/cld-mkiv.pdf diff --git a/doc/context/documents/general/manuals/columnsets.pdf b/doc/context/documents/general/manuals/columnsets.pdf Binary files differindex 32a7f8b06..e0be48ec5 100644 --- a/doc/context/documents/general/manuals/columnsets.pdf +++ b/doc/context/documents/general/manuals/columnsets.pdf diff --git a/doc/context/documents/general/manuals/details.pdf b/doc/context/documents/general/manuals/details.pdf Binary files differindex b99ae19a9..3448b59eb 100644 --- a/doc/context/documents/general/manuals/details.pdf +++ b/doc/context/documents/general/manuals/details.pdf diff --git a/doc/context/documents/general/manuals/libraries-mkiv.pdf b/doc/context/documents/general/manuals/libraries-mkiv.pdf Binary files differnew file mode 100644 index 000000000..f5a1e27f1 --- /dev/null +++ b/doc/context/documents/general/manuals/libraries-mkiv.pdf diff --git a/doc/context/documents/general/manuals/luatex.pdf b/doc/context/documents/general/manuals/luatex.pdf Binary files differindex db570e634..b9925775e 100644 --- a/doc/context/documents/general/manuals/luatex.pdf +++ b/doc/context/documents/general/manuals/luatex.pdf diff --git a/doc/context/documents/general/manuals/ma-cb-en.pdf b/doc/context/documents/general/manuals/ma-cb-en.pdf Binary files differindex 6ad164eb0..497cecfe0 100644 --- a/doc/context/documents/general/manuals/ma-cb-en.pdf +++ b/doc/context/documents/general/manuals/ma-cb-en.pdf diff --git a/doc/context/documents/general/manuals/math-mkiv.pdf b/doc/context/documents/general/manuals/math-mkiv.pdf Binary files differindex 1dd24f225..292c49527 100644 --- a/doc/context/documents/general/manuals/math-mkiv.pdf +++ b/doc/context/documents/general/manuals/math-mkiv.pdf diff --git a/doc/context/documents/general/manuals/metafun-p.pdf b/doc/context/documents/general/manuals/metafun-p.pdf Binary files differnew file mode 100644 index 000000000..4a67d67a1 --- /dev/null +++ b/doc/context/documents/general/manuals/metafun-p.pdf diff --git a/doc/context/documents/general/manuals/metafun-s.pdf b/doc/context/documents/general/manuals/metafun-s.pdf Binary files differnew file mode 100644 index 000000000..fea74466a --- /dev/null +++ b/doc/context/documents/general/manuals/metafun-s.pdf diff --git a/doc/context/documents/general/manuals/mkiv-publications.pdf b/doc/context/documents/general/manuals/mkiv-publications.pdf Binary files differnew file mode 100644 index 000000000..f428c2ca0 --- /dev/null +++ b/doc/context/documents/general/manuals/mkiv-publications.pdf diff --git a/doc/context/documents/general/manuals/nodes.pdf b/doc/context/documents/general/manuals/nodes.pdf Binary files differnew file mode 100644 index 000000000..8f0ec1b73 --- /dev/null +++ b/doc/context/documents/general/manuals/nodes.pdf diff --git a/doc/context/documents/general/manuals/notnow.pdf b/doc/context/documents/general/manuals/notnow.pdf Binary files differnew file mode 100644 index 000000000..e597a48bd --- /dev/null +++ b/doc/context/documents/general/manuals/notnow.pdf diff --git a/doc/context/documents/general/manuals/onandon.pdf b/doc/context/documents/general/manuals/onandon.pdf Binary files differnew file mode 100644 index 000000000..fe291acf0 --- /dev/null +++ b/doc/context/documents/general/manuals/onandon.pdf diff --git a/doc/context/documents/general/manuals/pagecolumns.pdf b/doc/context/documents/general/manuals/pagecolumns.pdf Binary files differnew file mode 100644 index 000000000..a9a1e561b --- /dev/null +++ b/doc/context/documents/general/manuals/pagecolumns.pdf diff --git a/doc/context/documents/general/manuals/rules-mkiv.pdf b/doc/context/documents/general/manuals/rules-mkiv.pdf Binary files differindex 97ac2fe4d..9861f76ef 100644 --- a/doc/context/documents/general/manuals/rules-mkiv.pdf +++ b/doc/context/documents/general/manuals/rules-mkiv.pdf diff --git a/doc/context/documents/general/manuals/spacing-mkiv.pdf b/doc/context/documents/general/manuals/spacing-mkiv.pdf Binary files differindex 1f0057f1d..fde9d6c70 100644 --- a/doc/context/documents/general/manuals/spacing-mkiv.pdf +++ b/doc/context/documents/general/manuals/spacing-mkiv.pdf diff --git a/doc/context/documents/general/manuals/sql-mkiv.pdf b/doc/context/documents/general/manuals/sql-mkiv.pdf Binary files differindex ff9824bad..09e63bcc8 100644 --- a/doc/context/documents/general/manuals/sql-mkiv.pdf +++ b/doc/context/documents/general/manuals/sql-mkiv.pdf diff --git a/doc/context/documents/general/manuals/tiptrick.pdf b/doc/context/documents/general/manuals/tiptrick.pdf Binary files differindex 6455b07f8..55d65029a 100644 --- a/doc/context/documents/general/manuals/tiptrick.pdf +++ b/doc/context/documents/general/manuals/tiptrick.pdf diff --git a/doc/context/documents/general/manuals/workflows-mkiv.pdf b/doc/context/documents/general/manuals/workflows-mkiv.pdf Binary files differindex cbbec0a5a..1d34669e2 100644 --- a/doc/context/documents/general/manuals/workflows-mkiv.pdf +++ b/doc/context/documents/general/manuals/workflows-mkiv.pdf diff --git a/doc/context/documents/general/manuals/xml-mkiv.pdf b/doc/context/documents/general/manuals/xml-mkiv.pdf Binary files differindex 4ca2570d3..78f6ffa1c 100644 --- a/doc/context/documents/general/manuals/xml-mkiv.pdf +++ b/doc/context/documents/general/manuals/xml-mkiv.pdf diff --git a/doc/context/documents/general/manuals/xtables-mkiv.pdf b/doc/context/documents/general/manuals/xtables-mkiv.pdf Binary files differindex fb04a53d9..d1b1a3ed0 100644 --- a/doc/context/documents/general/manuals/xtables-mkiv.pdf +++ b/doc/context/documents/general/manuals/xtables-mkiv.pdf diff --git a/doc/context/documents/general/qrcs/setup-cs.pdf b/doc/context/documents/general/qrcs/setup-cs.pdf Binary files differindex a3d5d78cf..c19e41f5d 100644 --- a/doc/context/documents/general/qrcs/setup-cs.pdf +++ b/doc/context/documents/general/qrcs/setup-cs.pdf diff --git a/doc/context/documents/general/qrcs/setup-de.pdf b/doc/context/documents/general/qrcs/setup-de.pdf Binary files differindex 81c15c263..1ed303414 100644 --- a/doc/context/documents/general/qrcs/setup-de.pdf +++ b/doc/context/documents/general/qrcs/setup-de.pdf diff --git a/doc/context/documents/general/qrcs/setup-en.pdf b/doc/context/documents/general/qrcs/setup-en.pdf Binary files differindex 9d3fa3314..20a83a632 100644 --- a/doc/context/documents/general/qrcs/setup-en.pdf +++ b/doc/context/documents/general/qrcs/setup-en.pdf diff --git a/doc/context/documents/general/qrcs/setup-fr.pdf b/doc/context/documents/general/qrcs/setup-fr.pdf Binary files differindex c3ad68a6b..50e0f897e 100644 --- a/doc/context/documents/general/qrcs/setup-fr.pdf +++ b/doc/context/documents/general/qrcs/setup-fr.pdf diff --git a/doc/context/documents/general/qrcs/setup-it.pdf b/doc/context/documents/general/qrcs/setup-it.pdf Binary files differindex eb563983b..1d5903d15 100644 --- a/doc/context/documents/general/qrcs/setup-it.pdf +++ b/doc/context/documents/general/qrcs/setup-it.pdf diff --git a/doc/context/documents/general/qrcs/setup-mapping-cs.pdf b/doc/context/documents/general/qrcs/setup-mapping-cs.pdf Binary files differnew file mode 100644 index 000000000..b3f4e0e36 --- /dev/null +++ b/doc/context/documents/general/qrcs/setup-mapping-cs.pdf diff --git a/doc/context/documents/general/qrcs/setup-mapping-de.pdf b/doc/context/documents/general/qrcs/setup-mapping-de.pdf Binary files differnew file mode 100644 index 000000000..ca4e724e9 --- /dev/null +++ b/doc/context/documents/general/qrcs/setup-mapping-de.pdf diff --git a/doc/context/documents/general/qrcs/setup-mapping-en.pdf b/doc/context/documents/general/qrcs/setup-mapping-en.pdf Binary files differnew file mode 100644 index 000000000..cf1afaa70 --- /dev/null +++ b/doc/context/documents/general/qrcs/setup-mapping-en.pdf diff --git a/doc/context/documents/general/qrcs/setup-mapping-fr.pdf b/doc/context/documents/general/qrcs/setup-mapping-fr.pdf Binary files differnew file mode 100644 index 000000000..5726a5536 --- /dev/null +++ b/doc/context/documents/general/qrcs/setup-mapping-fr.pdf diff --git a/doc/context/documents/general/qrcs/setup-mapping-it.pdf b/doc/context/documents/general/qrcs/setup-mapping-it.pdf Binary files differnew file mode 100644 index 000000000..0e7b84627 --- /dev/null +++ b/doc/context/documents/general/qrcs/setup-mapping-it.pdf diff --git a/doc/context/documents/general/qrcs/setup-mapping-nl.pdf b/doc/context/documents/general/qrcs/setup-mapping-nl.pdf Binary files differnew file mode 100644 index 000000000..aa314decf --- /dev/null +++ b/doc/context/documents/general/qrcs/setup-mapping-nl.pdf diff --git a/doc/context/documents/general/qrcs/setup-mapping-ro.pdf b/doc/context/documents/general/qrcs/setup-mapping-ro.pdf Binary files differnew file mode 100644 index 000000000..aedba70db --- /dev/null +++ b/doc/context/documents/general/qrcs/setup-mapping-ro.pdf diff --git a/doc/context/documents/general/qrcs/setup-nl.pdf b/doc/context/documents/general/qrcs/setup-nl.pdf Binary files differindex 3e80d8424..70aadea90 100644 --- a/doc/context/documents/general/qrcs/setup-nl.pdf +++ b/doc/context/documents/general/qrcs/setup-nl.pdf diff --git a/doc/context/documents/general/qrcs/setup-ro.pdf b/doc/context/documents/general/qrcs/setup-ro.pdf Binary files differindex fc6b0fade..a876a8a99 100644 --- a/doc/context/documents/general/qrcs/setup-ro.pdf +++ b/doc/context/documents/general/qrcs/setup-ro.pdf diff --git a/doc/context/presentations/bachotex/2017/bachotex-2017-emoji-demo.pdf b/doc/context/presentations/bachotex/2017/bachotex-2017-emoji-demo.pdf Binary files differnew file mode 100644 index 000000000..cce61e1b3 --- /dev/null +++ b/doc/context/presentations/bachotex/2017/bachotex-2017-emoji-demo.pdf diff --git a/doc/context/presentations/bachotex/2017/bachotex-2017-emoji-demo.tex b/doc/context/presentations/bachotex/2017/bachotex-2017-emoji-demo.tex new file mode 100644 index 000000000..ada27160b --- /dev/null +++ b/doc/context/presentations/bachotex/2017/bachotex-2017-emoji-demo.tex @@ -0,0 +1,26 @@ +\starttext + +\definefontfeature + [seguiemj-cl] + [default] + [colr=yes, + ccmp=yes, + dist=yes] + +\definefont + [MyEmoji] + [seguiemj*seguiemj-cl] + +\typefile{emoji-demo-001.tex} + +\showotfcomposition + {seguiemj*seguiemj-cl} + {1} + {\resolvedemoji + {family + man light skin tone + woman dark skin tone + girl medium skin tone + boy medium skin tone}} + +\stoptext diff --git a/doc/context/presentations/bachotex/2017/bachotex-2017-emoji.pdf b/doc/context/presentations/bachotex/2017/bachotex-2017-emoji.pdf Binary files differnew file mode 100644 index 000000000..d7e01f59c --- /dev/null +++ b/doc/context/presentations/bachotex/2017/bachotex-2017-emoji.pdf diff --git a/doc/context/presentations/bachotex/2017/bachotex-2017-emoji.tex b/doc/context/presentations/bachotex/2017/bachotex-2017-emoji.tex new file mode 100644 index 000000000..c6deb3873 --- /dev/null +++ b/doc/context/presentations/bachotex/2017/bachotex-2017-emoji.tex @@ -0,0 +1,374 @@ +% language=uk + +\setuppapersize + [S6] + +\setupbackgrounds + [page] + [background=color, + backgroundcolor=darkgray] + +\setuplayout + [backspace=24pt, + topspace=20pt, + bottomspace=8pt, + width=middle, + height=middle, + footerdistance=8pt, + footer=8pt, + header=0pt] + +\setupcolors + [textcolor=white] + +\setupbodyfont + [dejavu,14.4pt] + +\definecolor[trace:o] [s=1] +\definecolor[trace:r] [s=1] +\definecolor[trace:do][s=1] +\definecolor[trace:dr][s=1] + +\usemodule[abr-03] + +\definefontfeature[noligatures][liga=no] + +\setuphead + [section] + [page=yes, + style=\bfb, + after={\blank[3*medium]}] + +\setuphead + [subsection] + [page=no, + style=\bf\addfeature{noligatures}, + before={\blank[3*medium]}, + after={\blank}] + +\setupfooter + [strut=no, + style=\bf] + +\startdocument + [title={Picture Fonts}, + subtitle={welcome to a (beautiful) mess}, + author={Hans Hagen}, + occasion={BachoTUG 2017}] + +\startstandardmakeup + \vskip32pt + \bfd \setupinterlinespace + \documentvariable{title} + \crlf + \bfb \setupinterlinespace + \vskip12pt + \documentvariable{subtitle} + \vfill + \bfb \setupinterlinespace + \documentvariable{author} + \crlf + \documentvariable{occasion} +\stopstandardmakeup + +\startsubject[title=A Summary] + +\startitemize +\startitem + {\bf the macro package's view:} just a font like any other but it needs to configure + some extra color related properties +\stopitem +\startitem + {\bf the engine's view:} depending on the technology a normal font that needs a bit + special treatment or needs to be dealt with as collection of graphics +\stopitem +\startitem + {\bf the viewer's view:} regular outline glyphs or images tagged as kind of + characters so that their unicode representation can be cut and paste +\stopitem +\startitem + {\bf the user's view:} more pictures than glyphs although some people one can + communicate using them +\stopitem +\stopitemize + +So, in practice, for most \TEX\ users it's probably not a high priority font but more a fun +one. + +\stopsubject + +\startsubject[title=Technologies] + +As each vendor came up with something, we have to deal with a all kinds of formats. And or +course, as eagerness pushes things on the market before it's perfect we now have to deal +with all of them. + +\startitemize +\startitem + {\bf overlapping glyphs:} this technique uses the \type {colr} and \type {cpal} tables + and is actually a quite clean technology, you can combine in different ways +\stopitem +\startitem + {\bf svg graphics:} this technique uses the \type {svg} table that contains a svg vector + image +\stopitem +\startitem + {\bf bitmap graphics:} this technique uses for instance \type {sbix} tables that can have + various graphic images +\stopitem +\stopitemize + +The first two are already supported in the \CONTEXT\ font loader and processor +for a while, the last one was added recently. + +\blank + +Only the overlapping method is useable for the tens of thousands of skin tone combinations of +families, (kissing) couples, and professions. + +\stopsubject + +\startsubject[title=Preparation] + +For now one has to enable the feature: + +\startbuffer +\definefontfeature[overlay][default][ccmp=yes,colr=yes,dist=yes] +\definefontfeature[svg] [default][svg=yes] +\definefontfeature[bitmap] [default][sbix=yes] + +\definefontfeature [colored] [default] + [cmcp=yes,dist=yes, + colr=yes,svg=yes,sbix=yes] +\stopbuffer + +\typebuffer \getbuffer + +Defining a font is not different from others + +\starttyping +\definefont[MyEmojiFont] [seguiemj*overlay] +\definefontsynonym[emoji][seguiemj*overlay] +\stoptyping + +As is using: + +\starttyping +{\MyEmojiFont\resolvedemoji{woman}} +\emoji{woman} +\stoptyping + +\stopsubject + +\startsubject[title=Accessing shapes] + +\startbuffer +\definesymbol[man] [\emoji{man}] +\definesymbol[woman][\emoji{woman}] +\definesymbol[girl] [\emoji{girl}] +\definesymbol[boy] [\emoji{boy}] + +\definesymbol[family][\emoji{family man woman girl boy}] +\stopbuffer + +\typebuffer \getbuffer + +\starttyping +\definefontsynonym[emoji][file:seguiemj.ttf*default,overlay] + +\symbol[boy] \symbol[girl] \symbol[man] \symbol[woman] + +\symbol[family] +\stoptyping + +\stopsubject + +\startsubject[title=Different fonts] + +\def\ShowThem#1#2#3% + {\NC #1 + \NC default + \NC \definefontsynonym[emoji][#3*default]\symbol[boy] \symbol[girl] \symbol[man] \symbol[woman] + \NC \definefontsynonym[emoji][#3*default]\symbol[family] + \NC \NR + \NC + \NC #2 + \NC \definefontsynonym[emoji][#3*#2]\symbol[boy] \symbol[girl] \symbol[man] \symbol[woman] + \NC \definefontsynonym[emoji][#3*#2]\symbol[family] + \NC \NR} + +\starttabulate[|T|T|||] + \ShowThem{seguiemj} {overlay}{file:seguiemj.ttf} + \ShowThem{emojionecolor-svginot}{svg} {file:emojionecolor-svginot.ttf} + \ShowThem{emojionemozilla} {overlay}{file:emojionemozilla.ttf} + \ShowThem{applecoloremoji} {bitmap} {file:applecoloremoji.ttc} +\stoptabulate + +\stopsubject + +\startsubject[title=Ligatures] + +\definefontfeature[seguiemj-cl][default][colr=yes,ccmp=yes,dist=yes] +\definefontfeature[seguiemj-bw][default][ccmp=yes] + +% \definefont[MyEmoji][emojionecolor-svginot*default,svg] +% \definefont[MyEmoji][seguiemj*seguiemj-bw] +\definefont[MyEmoji][seguiemj*seguiemj-cl] +% \definefont[MyEmoji][emojionemozilla*default,overlay] +% \definefont[MyEmoji][applecoloremoji*default,bitmap] + +{\MyEmoji 👨🏽🌾 👨🏽🍳 👨🏽🎓 👨🏽🎤 👨🏽🎨 👨🏽🏫 👨🏽🏭 👨🏽💻 👨🏽💼 👨🏽🔧 👨🏽🔬 👨🏽🚀} + +\starttabulate[|T|T||] +\NC character \NC 1F477 \NC \MyEmoji \utfchar{"1F477} \NC \NR % construction worker +\NC skin modifier \NC 1F3FE \NC \MyEmoji \utfchar{"1F3FE} \NC \NR % medium dark skin +\NC ligature \NC 1F477 1F3FE \NC \MyEmoji \utfchar{"1F477}% + \utfchar{"1F3FE} \NC \NR +\NC zero width joiner \NC 0200D \NC \MyEmoji \utfchar{"0200D} \NC \NR +\NC female modifier \NC 02640 0FE0F \NC \MyEmoji \utfchar{"02640}% + \utfchar{"0FE0F} \NC \NR +\NC the whole lot \NC \NC \MyEmoji \utfchar{"1F477}% + \utfchar{"1F3FE}% + \utfchar{"0200D}% + \utfchar{"02640}% + \utfchar{"0FE0F} \NC \NR +\stoptabulate + +\starttabulate[|T|T||] +\NC 1F468 1F3FD 200D 1F33E \NC \MyEmoji 👨🏽🌾 \NC man farmer medium skin tone \NC \NR +\NC 1F468 1F3FD 200D 1F373 \NC \MyEmoji 👨🏽🍳 \NC man cook medium skin tone \NC \NR +\NC 1F468 1F3FD 200D 1F393 \NC \MyEmoji 👨🏽🎓 \NC man student medium skin tone \NC \NR +\NC 1F468 1F3FD 200D 1F3A4 \NC \MyEmoji 👨🏽🎤 \NC man singer medium skin tone \NC \NR +\NC 1F468 1F3FD 200D 1F3A8 \NC \MyEmoji 👨🏽🎨 \NC man artist medium skin tone \NC \NR +\NC 1F468 1F3FD 200D 1F3EB \NC \MyEmoji 👨🏽🏫 \NC man teacher medium skin tone \NC \NR +\NC 1F468 1F3FD 200D 1F3ED \NC \MyEmoji 👨🏽🏭 \NC man factory worker medium skin tone \NC \NR +\NC 1F468 1F3FD 200D 1F4BB \NC \MyEmoji 👨🏽💻 \NC man technologist medium skin tone \NC \NR +\NC 1F468 1F3FD 200D 1F4BC \NC \MyEmoji 👨🏽💼 \NC man office worker medium skin tone \NC \NR +\NC 1F468 1F3FD 200D 1F527 \NC \MyEmoji 👨🏽🔧 \NC man mechanic medium skin tone \NC \NR +\NC 1F468 1F3FD 200D 1F52C \NC \MyEmoji 👨🏽🔬 \NC man scientist medium skin tone \NC \NR +\NC 1F468 1F3FD 200D 1F680 \NC \MyEmoji 👨🏽🚀 \NC man astronaut medium skin tone \NC \NR +\stoptabulate + +\stopsubject + +\usemodule[fonts-emoji] + +\startsubject[title=Snippets] + +\start + + \definedfont[seguiemj*seguiemj-cl @ 32pt] + + \ShowEmojiSnippets + [family man light skin tone woman dark skin tone girl medium skin tone boy medium skin tone] + + \vskip1ex + + \ShowEmojiSnippetsOverlay + [family man light skin tone woman dark skin tone girl medium skin tone boy medium skin tone] + + \vskip1ex + + \ShowEmojiGlyphs + [family man light skin tone woman dark skin tone girl medium skin tone boy medium skin tone] + +\stop + +\stopsubject + +\startsubject[title=Using \type{\ShowEmoji[^man]}] + +\start + + \MyEmoji + + \ShowEmoji[^man] + +\stop + +\stopsubject + +\startsubject[title=Recoloring Seguiem] + +\start + +\definecolor[emoji-red] [r=.4] +\definecolor[emoji-blue] [b=.4] +\definecolor[emoji-yellow][y=.4] +\definecolor[emoji-gray] [s=.5,t=.5,a=1] + +\definefontcolorpalette + [emoji-red] + [emoji-red,emoji-gray] + +\definefontcolorpalette + [emoji-blue] + [emoji-blue,emoji-gray] + +\definefontcolorpalette + [emoji-yellow] + [emoji-yellow,emoji-gray] + +\definefontfeature[seguiemj-r][default][ccmp=yes,dist=yes,colr=emoji-red] +\definefontfeature[seguiemj-b][default][ccmp=yes,dist=yes,colr=emoji-blue] +\definefontfeature[seguiemj-y][default][ccmp=yes,dist=yes,colr=emoji-yellow] + +\definefont[MyColoredEmojiR][seguiemj*seguiemj-r @ 80pt] +\definefont[MyColoredEmojiB][seguiemj*seguiemj-b @ 80pt] +\definefont[MyColoredEmojiY][seguiemj*seguiemj-y @ 80pt] + +\MyColoredEmojiR + \resolvedemoji{man} + \resolvedemoji{woman} + \resolvedemoji{baby} + +\vskip24pt + +\MyColoredEmojiB + \resolvedemoji{triangular ruler} + \resolvedemoji{rabbit face} + \resolvedemoji{family man woman girl boy} + +\vskip24pt + +\MyColoredEmojiY + \resolvedemoji{triangular ruler} + \resolvedemoji{rabbit face} + \resolvedemoji{family man woman girl boy} + +\stop + +\page + +\starttyping +\definecolor [emoji-red] [r=.4] +\definecolor [emoji-gray] [s=.5,t=.5,a=1] + +\definefontcolorpalette + [emoji-red] + [emoji-red,emoji-gray] + +\definefontfeature + [seguiemj-r] + [default] + [ccmp=yes,dist=yes,colr=emoji-red] + +\definefont + [MyColoredEmojiR] + [seguiemj*seguiemj-r @ 80pt] + +\MyColoredEmojiR + \emoji{man} + \emoji{woman} + \emoji{baby} +\stoptyping + +\stopsubject + +\startsubject[title=Pallet \type{\ShowEmojiPalettes[1]}] + +{\MyEmoji \ShowEmojiPalettes[1]} + +\stopsubject + +\stopdocument diff --git a/doc/context/presentations/bachotex/2017/bachotex-2017-variablefonts-demo.pdf b/doc/context/presentations/bachotex/2017/bachotex-2017-variablefonts-demo.pdf Binary files differnew file mode 100644 index 000000000..bac8d54c1 --- /dev/null +++ b/doc/context/presentations/bachotex/2017/bachotex-2017-variablefonts-demo.pdf diff --git a/doc/context/presentations/bachotex/2017/bachotex-2017-variablefonts-demo.tex b/doc/context/presentations/bachotex/2017/bachotex-2017-variablefonts-demo.tex new file mode 100644 index 000000000..e9543a30a --- /dev/null +++ b/doc/context/presentations/bachotex/2017/bachotex-2017-variablefonts-demo.tex @@ -0,0 +1,44 @@ +% macros=mkvi + +\usemodule[art-01] \dontcomplain + +\starttexdefinition unexpanded TestFont #font#variant#size + \bgroup + \definedfont[name:#font#variant*default @ #size] + \setupinterlinespace + % \showstruts + % \strut + \samplefile{tufte} + \par + \egroup +\stoptexdefinition + +\starttext + +\dorecurse {5} { + + \dostepwiserecurse {8} {14} {1} { % 30 fonts + \TestFont {adobevariablefontprototype} {extralight} {##1pt} + \TestFont {adobevariablefontprototype} {light} {##1pt} + \TestFont {adobevariablefontprototype} {regular} {##1pt} + \TestFont {adobevariablefontprototype} {semibold} {##1pt} + \TestFont {adobevariablefontprototype} {bold} {##1pt} + \TestFont {adobevariablefontprototype} {black} {##1pt} + } + + \page + + % \dostepwiserecurse {8} {14} {1} { % 40 fonts + % \TestFont {avenirnextvariable} {regular} {##1pt} + % \TestFont {avenirnextvariable} {medium} {##1pt} + % \TestFont {avenirnextvariable} {bold} {##1pt} + % \TestFont {avenirnextvariable} {heavy } {##1pt} + % \TestFont {avenirnextvariable} {condensed} {##1pt} + % \TestFont {avenirnextvariable} {medium condensed} {##1pt} + % \TestFont {avenirnextvariable} {bold condensed} {##1pt} + % \TestFont {avenirnextvariable} {heavy condensed} {##1pt} + % } + +} + +\stoptext diff --git a/doc/context/presentations/bachotex/2017/bachotex-2017-variablefonts.pdf b/doc/context/presentations/bachotex/2017/bachotex-2017-variablefonts.pdf Binary files differnew file mode 100644 index 000000000..ee3537bd2 --- /dev/null +++ b/doc/context/presentations/bachotex/2017/bachotex-2017-variablefonts.pdf diff --git a/doc/context/presentations/bachotex/2017/bachotex-2017-variablefonts.tex b/doc/context/presentations/bachotex/2017/bachotex-2017-variablefonts.tex new file mode 100644 index 000000000..08050a57d --- /dev/null +++ b/doc/context/presentations/bachotex/2017/bachotex-2017-variablefonts.tex @@ -0,0 +1,500 @@ +% language=uk + +\setuppapersize + [S6] + +\setupbackgrounds + [page] + [background=color, + backgroundcolor=darkblue] + +\setuplayout + [backspace=24pt, + topspace=20pt, + bottomspace=8pt, + width=middle, + height=middle, + footerdistance=8pt, + footer=8pt, + header=0pt] + +\setupcolors + [textcolor=white] + +\setupbodyfont + [dejavu,14.4pt] + +\definecolor[trace:o] [s=1] +\definecolor[trace:r] [s=1] +\definecolor[trace:do][s=1] +\definecolor[trace:dr][s=1] + +\usemodule[abr-03] + +\definefontfeature[noligatures][liga=no] + +\setuphead + [section] + [page=yes, + style=\bfb, + after={\blank[3*medium]}] + +\setuphead + [subsection] + [page=no, + style=\bf\addfeature{noligatures}, + before={\blank[3*medium]}, + after={\blank}] + +\setupfooter + [strut=no, + style=\bf] + +\startuseMPgraphic{pagenumber} + if LastPageNumber > 0 : + draw outlinetext.f + (decimal RealPageNumber) + (withcolor "darkgray") + xysized ((RealPageNumber/LastPageNumber) * TextWidth/2,FooterHeight) ; + fi ; +\stopuseMPgraphic + +\setupfootertexts + [\useMPgraphic{pagenumber}] + +\startdocument + [title={Variable Fonts}, + subtitle={we're ready for them}, + author={Hans Hagen}, + occasion={BachoTUG 2017}] + +\startstandardmakeup + \vskip32pt + \bfd \setupinterlinespace + \documentvariable{title} + \crlf + \bfb \setupinterlinespace + \vskip12pt + \documentvariable{subtitle} + \vfill + \bfb \setupinterlinespace + \documentvariable{author} + \crlf + \documentvariable{occasion} +\stopstandardmakeup + +\startsubject[title=A Summary] + +\startitemize +\startitem + {\bf the macro package's view:} just a font but with many possible variations + in shapes (width, weight, slope, etc) and therefore a bit more complex user + interface +\stopitem +\startitem + {\bf the engine's view:} an abstraction not different from other fonts but + that needs a special treatment in the backend +\stopitem +\startitem + {\bf the viewer's view:} a font to be displayed like any other with outlines + in cff of ttf format +\stopitem +\startitem + {\bf the user's view:} an opentype font with possibly surprising shapes of + which you need to know a bit more than usual if you want to profit from it +\stopitem +\stopitemize + +So, in practice, for most \TEX\ users it's just a font that has to be supported by +\TEX\ and friends. + +\stopsubject + +\startsubject[title=Starting point] + +\startitemize +\startitem + The OpenType 1.8 specification at the MicroSoft website defined the extra + tables and explains bits and pieces. +\stopitem +\startitem + There a few fonts that have relevant tables (not all) and implement variants + as well as features. +\stopitem +\startitem + There are some posts on the internet that show a bit about axis and other things + that go on in these fonts. +\stopitem +\startitem + Luckily we have ways (in \CONTEXT) to explore what goes on in these fonts and + how they could look. +\stopitem +\startitem + Condition: no tricks, no fuzzy heuristics, just the specification should be + enough. +\stopitem +\stopitemize + +\stopsubject + +\startsubject[title=Implementation steps] + +\startitemize +\startitem + First try to render variants in order to see what we're dealing with. This was not too + hard (starting with cff) because we have already virtual font support. +\stopitem +\startitem + Next try to load the relevant tables and figure out what these deltas and such really + mean and how axis and regions and \unknown\ have to be applied. +\stopitem +\startitem + Try to make it all work on a real piece of text, so not only shapes but also features + and dimensions. +\stopitem +\startitem + Finally make sure that the font can get embedded as a normal font and not as inline + (tagged) graphic. +\stopitem +\startitem + Also, try to generalize the helpers and methods in such ways that we can experiment + with additional tricks (after all, \TEX\ is about control). +\stopitem +\startitem + Todo: once there are more fonts (with the right data tables), check the code with the + specification. +\stopitem +\stopitemize + +\stopsubject + +\setupTABLE[c][1][style=tttf,align={flushleft,lohi}] + +\startsubject[title=Adobe Variable Font Prototype (cff)] + +\unexpanded\def\SampleFont#1#2% weight / contrast + {\definedfont[name:adobevariablefontprototype#1*default at 32pt]It looks like this!} + +\bTABLE[distance=2em,frame=off] +\bTR \bTD extralight 0/0 \eTD \bTD \SampleFont {extralight} \eTD \eTR +\bTR \bTD light 150/0 \eTD \bTD \SampleFont {light} \eTD \eTR +\bTR \bTD regular 394/0 \eTD \bTD \SampleFont {regular} \eTD \eTR +\bTR \bTD semibold 600/0 \eTD \bTD \SampleFont {semibold} \eTD \eTR +\bTR \bTD bold 824/0 \eTD \bTD \SampleFont {bold} \eTD \eTR +\bTR \bTD black high contrast 1000/100 \eTD \bTD \SampleFont {blackhighcontrast} \eTD \eTR +\bTR \bTD black medium contrast 1000/50 \eTD \bTD \SampleFont {blackmediumcontrast} \eTD \eTR +\bTR \bTD black 1000/0 \eTD \bTD \SampleFont {black} \eTD \eTR +\eTABLE + +\stopsubject + +% \starttyping +% \definefont +% [MyLightFont] +% [name:adobevariablefontprototypelight*default] +% \stoptyping + +\unexpanded\def\SampleFont#1#2% weight / width + {\definedfont[name:avenirnextvariable#1*default at 32pt]It looks like this!} + +\startsubject[title=Avenir Next Variable (ttf)] + +\bTABLE[distance=2em,frame=off] +\bTR \bTD regular 400/100 \eTD \bTD \SampleFont {regular} \eTD \eTR +\bTR \bTD medium 500/100 \eTD \bTD \SampleFont {medium} \eTD \eTR +\bTR \bTD bold 700/100 \eTD \bTD \SampleFont {bold} \eTD \eTR +\bTR \bTD heavy 900/100 \eTD \bTD \SampleFont {heavy} \eTD \eTR +\bTR \bTD condensed 400/75 \eTD \bTD \SampleFont {condensed} \eTD \eTR +\bTR \bTD medium condensed 500/75 \eTD \bTD \SampleFont {mediumcondensed} \eTD \eTR +\bTR \bTD bold condensed 700/75 \eTD \bTD \SampleFont {boldcondensed} \eTD \eTR +\bTR \bTD heavy condensed 900/75 \eTD \bTD \SampleFont {heavycondensed} \eTD \eTR +\eTABLE + +\stopsubject + +\startbuffer[both] +\vfill +\startMPcode + draw outlinetext.b + ("\getbuffer[a]") + (withcolor "white") + (withcolor "red" withpen pencircle scaled 1/10) + xsized .9TextWidth ; +\stopMPcode +\vfill +\startMPcode + draw outlinetext.b + ("\getbuffer[b]") + (withcolor "white") + (withcolor "red" withpen pencircle scaled 1/10) + xsized .9TextWidth ; +\stopMPcode +\vfill +\startMPcode + draw outlinetext.b + ("\getbuffer[c]") + (withcolor "white") + (withcolor "red" withpen pencircle scaled 1/10) + xsized .90TextWidth ; +\stopMPcode +\vfill +\stopbuffer + +\startbuffer[fill] +\vfill +\startMPcode + draw outlinetext.f + ("\getbuffer[a]") + (withcolor "white") + xsized .9TextWidth ; +\stopMPcode +\vfill +\startMPcode + draw outlinetext.f + ("\getbuffer[b]") + (withcolor "white") + xsized .9TextWidth ; +\stopMPcode +\vfill +\startMPcode + draw outlinetext.f + ("\getbuffer[c]") + (withcolor "white") + xsized .9TextWidth ; +\stopMPcode +\vfill +\stopbuffer + +\startbuffer[draw] +\vfill +\startMPcode + draw outlinetext.d + ("\getbuffer[a]") + (withcolor "white" withpen pencircle scaled 1/10) + xsized .9TextWidth ; +\stopMPcode +\vfill +\startMPcode + draw outlinetext.d + ("\getbuffer[b]") + (withcolor "white" withpen pencircle scaled 1/10) + xsized .9TextWidth ; +\stopMPcode +\vfill +\startMPcode + draw outlinetext.d + ("\getbuffer[c]") + (withcolor "white" withpen pencircle scaled 1/10) + xsized .9TextWidth ; +\stopMPcode +\vfill +\stopbuffer + +\startbuffer[overlay] +\startoverlay{% +\startMPcode + draw outlinetext.d + ("\getbuffer[a]") + (withcolor "green" withtransparency (3,0.5) withpen pencircle scaled 1/10) + xsized .9TextWidth ; +\stopMPcode +}{% +\startMPcode + draw outlinetext.d + ("\getbuffer[b]") + (withcolor "yellow" withtransparency (3,0.5) withpen pencircle scaled 1/10) + xsized .9TextWidth ; +\stopMPcode +}{% +\startMPcode + draw outlinetext.d + ("\getbuffer[c]") + (withcolor "red" withtransparency (3,0.5) withpen pencircle scaled 1/10) + xsized .9TextWidth ; +\stopMPcode +} +\stopoverlay +\stopbuffer + +\startbuffer[a] +\definedfont[name:adobevariablefontprototypeextralight]bachotex% +\stopbuffer + +\startbuffer[b] +\definedfont[name:adobevariablefontprototypelight]bachotex% +\stopbuffer + +\startbuffer[c] +\definedfont[name:adobevariablefontprototypebold]bachotex% +\stopbuffer + +\startsubject[title=Metafontisch overlap (1)] + \getbuffer[both] +\stopsubject + +\startbuffer[a] +\definefontfeature[whatever][axis={weight:50}]% +\definedfont[name:adobevariablefontprototype*whatever]bachotex% +\stopbuffer + +\startbuffer[b] +\definefontfeature[whatever][axis={weight:300}]% +\definedfont[name:adobevariablefontprototype*whatever]bachotex% +\stopbuffer + +\startbuffer[c] +\definefontfeature[whatever][axis={weight:700}]% +\definedfont[name:adobevariablefontprototype*whatever]bachotex% +\stopbuffer + +\startsubject[title=Metafontisch overlap (2)] + \getbuffer[both] +\stopsubject +\startsubject[title=Fills hide the details] + \getbuffer[fill] +\stopsubject +\startsubject[title=Unsuitable outlines] + \getbuffer[draw] +\stopsubject + +\startbuffer[a] +\definefontfeature[whatever][axis={weight:100,contrast:0}]% +\definedfont[name:adobevariablefontprototype*whatever]bachotex% +\stopbuffer + +\startbuffer[b] +\definefontfeature[whatever][axis={weight:200,contrast:20}]% +\definedfont[name:adobevariablefontprototype*whatever]bachotex% +\stopbuffer + +\startbuffer[c] +\definefontfeature[whatever][axis={weight:200,contrast:50}]% +\definedfont[name:adobevariablefontprototype*whatever]bachotex% +\stopbuffer + +\startsubject[title=Stay within specification] + \getbuffer[draw] +\stopsubject + +\startsubject[title=Subjective choices] + \getbuffer[fill] +\stopsubject + +\startbuffer[a] +\definefontfeature[whatever][axis={weight:100,contrast:0}]% +\definedfont[name:adobevariablefontprototype*whatever]tex% +\stopbuffer + +\startbuffer[b] +\definefontfeature[whatever][axis={weight:200,contrast:20}]% +\definedfont[name:adobevariablefontprototype*whatever]tex% +\stopbuffer + +\startbuffer[c] +\definefontfeature[whatever][axis={weight:200,contrast:50}]% +\definedfont[name:adobevariablefontprototype*whatever]tex% +\stopbuffer + +\startsubject[title=Difficult choices] + \getbuffer[overlay] +\stopsubject + +\startsubject[title=Definitions (1)] + +\startbuffer +\definefontfeature + [default:shaped] + [default] + [axis={width:10}] + +\definefont + [SomeFont] + [file:avenirnextvariable*default:shaped] +\stopbuffer + +\typebuffer \getbuffer + +\start \setupinterlinespace \showglyphs \showfontkerns \SomeFont \input zapf \wordright{Hermann Zapf}\par \stop + +\stopsubject + +\startsubject[title=Definitions (2)] + +\startbuffer +\definefontfeature + [default:shaped] + [default] + [axis={width:100,weight=200}] + +\definefont + [SomeFont] + [file:avenirnextvariable*default:shaped @ 12pt] +\stopbuffer + +\typebuffer \getbuffer + +\start \setupinterlinespace \showglyphs \showfontkerns \SomeFont \input zapf \wordright{Hermann Zapf}\par \stop + +\stopsubject + +\startsubject[title=Transformations] + +\subsubject{correction:} + +\startformula + x^\prime = x + + s_{x1} \cdot x_1 + + s_{x2} \cdot x_2 + + s_{x3} \cdot x_3 + + s_{x4} \cdot x_4 +\stopformula + +\startformula + y^\prime = y + + s_{y1} \cdot y_1 + + s_{y2} \cdot y_2 + + s_{y3} \cdot y_3 + + s_{y4} \cdot y_4 +\stopformula + +\subsubject{internal cff:} + +\starttyping +1 <setvstore> +120 [10 -30 40 -60] 1 <blend> ... <operator> +100 120 [10 -30 40 -60] [30 -10 -30 20] 2 <blend> .. <operator> +\stoptyping + +\subsubject{external ttf:} + +\starttyping +apply x deltas [10 -30 40 -60] to x 120 +apply y deltas [30 -10 -30 20] to y 100 +\stoptyping + +\stopsubject + +\startsubject[title=Follow up] + +\startitemize +\startitem + Performance is quite okay because we cache instances. I might come up with an + alternative way but there is not much to gain. +\stopitem +\startitem + Once fonts show up alternative interfaces to axis and scaling can be explored + and provided. +\stopitem +\startitem + I will look into ways to do all the backend font code in \CONTEXT\ in \LUA\ + (easier to update and more flexible). +\stopitem +\startitem + Luigi and I will play with variable fonts defined in the traditional meta tools + that come with \TEX. +\stopitem +\stopitemize + +\stopsubject + +\stopdocument diff --git a/doc/context/presentations/examples/present-weird-001.pdf b/doc/context/presentations/examples/present-weird-001.pdf Binary files differnew file mode 100644 index 000000000..e3533a31e --- /dev/null +++ b/doc/context/presentations/examples/present-weird-001.pdf diff --git a/doc/context/presentations/examples/present-weird-001.tex b/doc/context/presentations/examples/present-weird-001.tex new file mode 100644 index 000000000..7049bac59 --- /dev/null +++ b/doc/context/presentations/examples/present-weird-001.tex @@ -0,0 +1,113 @@ +\usemodule[present-weird] + +\starttext + +\TitlePage{About Text\\Today's Talk\\Hans Hagen} + +\StartPage{The First Page} + + \StartTopic{Some Text} + \StartText \input tufte \StopText + \StartText \input knuth \StopText + \StartText \input zapf \StopText + \StartText \input knuth \StopText + \StopTopic + + \StartTopic{Another Text} + \StartText \input tufte \StopText + \StartText \input zapf \StopText + \StartText \input knuth \StopText + \StopTopic + + \StartTopic{Some More Text} + \StartText \input tufte \StopText + \StartText \input knuth \StopText + \StartText \input zapf \StopText + \StartText \input tufte \StopText + \StopTopic + + \StartTopic{Some Text Again} + \StartText \input tufte \StopText + \StartText \input zapf \StopText + \StartText \input knuth \StopText + \StartText \input tufte \StopText + \StopTopic + +\StopPage + +\StartPage{The Second Page} + + \StartTopic{Some Text} + \StartText \input tufte \StopText + \StartText \input knuth \StopText + \StartText \input zapf \StopText + \StartText \input tufte \StopText + \StartText \input knuth \StopText + \StartText \input zapf \StopText + \StopTopic + + \StartTopic{Another Text} + \StartText \input tufte \StopText + \StartText \input knuth \StopText + \StartText \input zapf \StopText + \StopTopic + + \StartTopic{Some Nice Text} + \StartText \input tufte \StopText + \StartText \input knuth \StopText + \StartText \input zapf \StopText + \StartText \input tufte \StopText + \StartText \input tufte \StopText + \StopTopic + + \StartTopic{Some Funny Text} + \StartText \input tufte \StopText + \StartText \input knuth \StopText + \StopTopic + + \StartTopic{Quite Some Text} + \StartText \input tufte \StopText + \StartText \input knuth \StopText + \StartText \input zapf \StopText + \StartText \input tufte \StopText + \StartText \input knuth \StopText + \StartText \input zapf \StopText + \StartText \input tufte \StopText + \StartText \input knuth \StopText + \StartText \input zapf \StopText + \StopTopic + + \StartTopic{Even More Text} + \StartText \input knuth \StopText + \StartText \input zapf \StopText + \StartText \input tufte \StopText + \StartText \input knuth \StopText + \StartText \input zapf \StopText + \StopTopic + +\StopPage + +\StartPage{The Third Page} + + \StartTopic{Some Short Text} + \StartText \input tufte \StopText + \StartText \input knuth \StopText + \StartText \input zapf \StopText + \StopTopic + + \StartTopic{Some Minimal Text} + \StartText \input tufte \StopText + \StartText \input zapf \StopText + \StopTopic + + \StartTopic{Some More Text} + \StartText \input tufte \StopText + \StartText \input knuth \StopText + \StartText \input zapf \StopText + \StartText \input tufte \StopText + \StartText \input tufte \StopText + \StopTopic + +\StopPage + +\stoptext diff --git a/doc/context/presentations/tug/2007/tug-2007-fonts.tex b/doc/context/presentations/tug/2007/tug-2007-fonts.tex new file mode 100644 index 000000000..8ec97d68c --- /dev/null +++ b/doc/context/presentations/tug/2007/tug-2007-fonts.tex @@ -0,0 +1,242 @@ +\usemodule[present-slanted] + +\usemodule[abr-01] + +\definefontfeature + [default] + [method=node, + script=latn, + onum=yes] + +\definefont[TitleFont] [palatinosanscom-bold*default at 48pt] % is used when defined +\definefont[MainTextFont][palatinosanscom-regular*default at 12pt] + +\setupinterlinespace + [line=15pt] + +\def\XETEX {\dontleavehmode{\morecolor xetex}} +\def\PDFTEX {\dontleavehmode{\morecolor pdftex}} +\def\LUATEX {\dontleavehmode{\morecolor luatex}} +\def\LUA {\dontleavehmode{\morecolor lua}} +\def\FONTFORGE{\dontleavehmode{\morecolor fontforge}} +\def\OPENTYPE {\dontleavehmode{\morecolor opentype}} +\def\TFM {\dontleavehmode{\morecolor tfm}} +\def\TEX {\dontleavehmode{\morecolor tex}} +\def\MKIV {\dontleavehmode{\morecolor mkiv}} + +\def|#1|{-} + +\startdocument + [location={tug 2007 san diego}, + author={hans hagen}, + title={{zapfino, a},{torture test},{for luatex}}] + +\StartTopic{loading fonts} + +\StartSteps + +\StartItem the \OPENTYPE\ font reader is borrowed from \FONTFORGE\ \FlushStep \StopItem +\StartItem once it was ready, we could look into such a font \FlushStep \StopItem +\StartItem it tooks while to figure out the format due to rather fuzzy specs \FlushStep \StopItem +\StartItem it took us even more time to find out that the loader was flawed \FlushStep \StopItem +\StartItem one reason was that fonts themselves may have bugs or be incomplete \FlushStep \StopItem +\StartItem then we changed to \FONTFORGE\ version 2 \FlushStep \StopItem +\StartItem this made the missing pieces surface in more complex feature handling \FlushStep \StopItem +\StartItem while implementing features the new table format was cleaned up \FlushStep \StopItem + +\StopSteps + +\StopTopic + +\StartTopic{making it work} + +\StartSteps + +\StartItem the \FONTFORGE\ library loads the fonts into memory \FlushStep \StopItem +\StartItem the internal data structures are mapped into a \LUA\ table \FlushStep \StopItem +\StartItem we enhance this table a bit (extra hashes as well as rearranging glyphs) \FlushStep \StopItem +\StartItem we save the table in a cache and compile it to bytecode \FlushStep \StopItem +\StartItem after that reloading is fast and efficient \FlushStep \StopItem +\StartItem when defining a font instance we share data as much as possible \FlushStep \StopItem +\StartItem the open type specific table is translated into a \TFM\ one \FlushStep \StopItem +\StartItem but for handling features we keep the original table available \FlushStep \StopItem + +\StopSteps + +\StopTopic + +\StartTopic{user control} + +\StartSteps + +\StartItem in context \MKIV\ currently we provide several interfaces \FlushStep \StopItem +\StartItem the \XETEX\ syntax is (more or less) supported \FlushStep \StopItem +\StartItem there is a higher level interface to associating features with fonts \FlushStep \StopItem +\StartItem there will be a font instance independent feature switch mechanism \FlushStep \StopItem +\StartItem there can be generic treatments unrelated to the specific font \FlushStep \StopItem +\StartItem fonts can be accessed by various names \FlushStep \StopItem +\StartItem but \unknown\ using features demands that users know what they're doing \FlushStep \StopItem + +\StopSteps + +\StopTopic + +\StartTopic{zapfino} + +\StartSteps + +\StartItem we needed this exercise as a prelude to handling arab (which we cannot really read) \FlushStep \StopItem +\StartItem this font provides a good testbed because has many features defined \FlushStep \StopItem +\StartItem the associated \LUATEX\ tables are rather large \FlushStep \StopItem +\StartItem there can be hundreds of lookups per character with lookahead and backtracking \FlushStep \StopItem +\StartItem when writing support for such features, bugs in such fonts complicate matters \FlushStep \StopItem +\StartItem visually checking the output is complicated by the fact that wrong alternatives may look good \FlushStep \StopItem +\StartItem we must make sure that \TEX's other mechanisms don't spoil the game \FlushStep \StopItem +\StartItem special care is needed for lookups that involve spaces \FlushStep \StopItem + +\StopSteps + +\page \start + +\definefontfeature[zapfino-a][mode=node,script=latn,language=dflt,liga=no] +\definefontfeature[zapfino-b][mode=node,script=latn,language=dflt,liga=yes] +\definefontfeature[zapfino-c][mode=node,script=latn,language=dflt,liga=no,clig=yes] +\definefontfeature[zapfino-d][mode=node,script=latn,language=dflt,liga=no,calt=yes] +\definefontfeature[zapfino-e][mode=node,script=latn,language=dflt,liga=yes,clig=yes,calt=yes] + +\font\testa=ZapfinoExtraLTPro*zapfino-a at 24pt +\font\testb=ZapfinoExtraLTPro*zapfino-b at 24pt +\font\testc=ZapfinoExtraLTPro*zapfino-c at 24pt +\font\testd=ZapfinoExtraLTPro*zapfino-d at 24pt +\font\teste=ZapfinoExtraLTPro*zapfino-e at 24pt + +\unexpanded\def\ShowSample #1 #2 % + {\StartTopic{examples : #2} + \start + \noligs1\nokerns1\language0 + \setupinterlinespace[line=35pt] + \StartItem + \getvalue{test#1}% + \input tufte \wordright{\morecolor Mr. E.R.~Tufte} + \StopItem + \stop + \StopTopic} + +\ShowSample a nothing +\ShowSample b ligatures +\ShowSample c {cont ligs} +\ShowSample d {cont alts} +\ShowSample e all of these + +\page \stop + +\StartTopic{arabtype} + +\StartSteps + +\StartItem this font has many advanced arab related features \FlushStep \StopItem +\StartItem there is quite some kerning and positioning going on \FlushStep \StopItem +\StartItem vowels travel with the base characters (glyphs) and ligatures \FlushStep \StopItem +\StartItem vowels need to be positioned relative to each other as well \FlushStep \StopItem + +\StopSteps + +\page + +\definefontfeature + [arab-none] + [mode=node,language=dflt,script=arab,kern=no,liga=no,dlig=no,rlig=no] + +\definefontfeature + [arab-replace] + [mode=node,language=dflt,script=arab,kern=no,liga=no,dlig=no,rlig=no, + init=yes,medi=yes,fina=yes,isol=yes] + +\definefontfeature + [arab-mark] + [mode=node,language=dflt,script=arab,kern=no,liga=no,dlig=no,rlig=no, + init=yes,medi=yes,fina=yes,isol=yes,mark=yes] + +\definefontfeature + [arab-mkmk] + [mode=node,language=dflt,script=arab,kern=no,liga=no,dlig=no,rlig=no, + init=yes,medi=yes,fina=yes,isol=yes,mkmk=yes,mark=yes] + +\definefontfeature + [arab-curs] + [mode=node,language=dflt,script=arab,kern=no,liga=no,dlig=no,rlig=no, + init=yes,medi=yes,fina=yes,isol=yes,mkmk=yes,mark=yes,curs=yes] + +\definefontfeature + [arab-kern] + [mode=node,language=dflt,script=arab,kern=no,liga=no,dlig=no,rlig=no, + init=yes,medi=yes,fina=yes,isol=yes,mkmk=yes,mark=yes,kern=yes] + +\definefontfeature + [arab-context] + [mode=node,language=dflt,script=arab,kern=no,liga=no,dlig=no,rlig=no, + init=yes,medi=yes,fina=yes,isol=yes,mkmk=yes,mark=yes,kern=yes,calt=yes] + +\definefontfeature + [arab-ligs] + [mode=node,language=dflt,script=arab,kern=no,liga=yes,dlig=yes,rlig=yes, + init=yes,medi=yes,fina=yes,isol=yes,mkmk=yes,mark=yes,curs=yes] + +\definefontfeature + [arab-ligkern] + [mode=node,language=dflt,script=arab,kern=no,liga=yes,dlig=yes,rlig=yes, + init=yes,medi=yes,fina=yes,isol=yes,mkmk=yes,mark=yes,kern=yes,curs=yes] + +\startbuffer +اَلْحَمْدُ لِلّٰهِ حَمْدَ مُعْتَرِفٍ بِحَمْدِهٖ، مُغْتَرِفٌ مِنْ بِحَارِ مَجْدِهٖ، بِلِسَانِ +الثَّنَاۤءِ شَاكِرًا، وَلِحُسْنِ اٰلاۤئِهٖ نَاشِرًا؛ اَلَّذِيْ خَلَقَ الْمَوْتَ وَالْحَيٰوةَ، وَالْخَيْرَ +وَالشَّرَّ، وَالنَّفْعَ وَالضَّرَّ، وَالسُّكُوْنَ وَالْحَرَكَةَ، وَالْأَرْوَاحَ +وَالْأَجْسَامَ، وَالذِّكْرَ وَالنِّسْيَانَ. +\stopbuffer + +\unexpanded\def\ShowSample #1 #2 #3 % + {\StartTopic{arab : #1} + \start \setuptolerance[verytolerant,stretch] + \noligs1\nokerns1\language0 + \setupinterlinespace[line=35pt] + \font\Test=arabtype*#3 at 35pt \Test + \setupinterlinespace + \textdir TRT + \pardir TRT + \ifnum#2=1 + \enabletrackers[otf.analyzing] + \fi + \slantedshapedelta5cm + \StartItem \getbuffer \par \StopItem + \slantedshapedelta\zeropoint + \ifnum#2=1 + \disabletrackers[otf.analyzing] + \fi + \stop + \StopTopic} + +\ShowSample analyze 1 arab-none +\ShowSample replace 0 arab-replace +\ShowSample mark 0 arab-mark +\ShowSample mkmk 0 arab-mkmk +\ShowSample curs 0 arab-curs +\ShowSample kern 0 arab-kern +\ShowSample context 0 arab-context +\ShowSample ligs 0 arab-ligs +\ShowSample ligkern 0 arab-ligkern + +\StartTopic{Remark} + +\StartItem + the samples on the previous pages were generated with an experimental version + of \LUATEX\ and \MKIV\ code and therefore may contain errors +\StopItem + +\StartItem + when this document is generated with a post-beta version of \LUATEX\ and \CONTEXT\ the results + can be different +\StopItem + +\StopTopic + +\stopdocument diff --git a/doc/context/scripts/mkii/ctxtools.html b/doc/context/scripts/mkii/ctxtools.html index 405965c1e..06acff7e0 100644 --- a/doc/context/scripts/mkii/ctxtools.html +++ b/doc/context/scripts/mkii/ctxtools.html @@ -21,9 +21,9 @@ </style> <style type="text/css"> </style> - </head> - <body> - <div id="top"> <div id="top-one"> + </head> + <body> + <div id="top"> <div id="top-one"> <div id="top-two">CtxTools 1.3.5 </div> </div> </div> @@ -60,5 +60,5 @@ <br/> </div> </div> - </body> - </html> + </body> +</html> diff --git a/doc/context/scripts/mkii/ctxtools.man b/doc/context/scripts/mkii/ctxtools.man index d85ab59e4..54a0a442c 100644 --- a/doc/context/scripts/mkii/ctxtools.man +++ b/doc/context/scripts/mkii/ctxtools.man @@ -1,4 +1,4 @@ -.TH "ctxtools" "1" "01-01-2017" "version 1.3.5" "CtxTools" +.TH "ctxtools" "1" "01-01-2018" "version 1.3.5" "CtxTools" .SH NAME .B ctxtools .SH SYNOPSIS diff --git a/doc/context/scripts/mkii/imgtopdf.html b/doc/context/scripts/mkii/imgtopdf.html index ec75e4886..acf645981 100644 --- a/doc/context/scripts/mkii/imgtopdf.html +++ b/doc/context/scripts/mkii/imgtopdf.html @@ -21,9 +21,9 @@ </style> <style type="text/css"> </style> - </head> - <body> - <div id="top"> <div id="top-one"> + </head> + <body> + <div id="top"> <div id="top-one"> <div id="top-two">ImgToPdf 1.1.2 </div> </div> </div> @@ -51,5 +51,5 @@ <br/> </div> </div> - </body> - </html> + </body> +</html> diff --git a/doc/context/scripts/mkii/imgtopdf.man b/doc/context/scripts/mkii/imgtopdf.man index 4cebf81fe..11cc46f95 100644 --- a/doc/context/scripts/mkii/imgtopdf.man +++ b/doc/context/scripts/mkii/imgtopdf.man @@ -1,4 +1,4 @@ -.TH "imgtopdf" "1" "01-01-2017" "version 1.1.2" "ImgToPdf" +.TH "imgtopdf" "1" "01-01-2018" "version 1.1.2" "ImgToPdf" .SH NAME .B imgtopdf .SH SYNOPSIS diff --git a/doc/context/scripts/mkii/mptopdf.html b/doc/context/scripts/mkii/mptopdf.html index 24f1325dd..9781a51f3 100644 --- a/doc/context/scripts/mkii/mptopdf.html +++ b/doc/context/scripts/mkii/mptopdf.html @@ -21,9 +21,9 @@ </style> <style type="text/css"> </style> - </head> - <body> - <div id="top"> <div id="top-one"> + </head> + <body> + <div id="top"> <div id="top-one"> <div id="top-two">MPtoPDF 1.4.1 </div> </div> </div> @@ -46,5 +46,5 @@ <br/> </div> </div> - </body> - </html> + </body> +</html> diff --git a/doc/context/scripts/mkii/mptopdf.man b/doc/context/scripts/mkii/mptopdf.man index e1c4ff914..c6f4655e0 100644 --- a/doc/context/scripts/mkii/mptopdf.man +++ b/doc/context/scripts/mkii/mptopdf.man @@ -1,4 +1,4 @@ -.TH "mptopdf" "1" "01-01-2017" "version 1.4.1" "convert MetaPost figures to PDF" +.TH "mptopdf" "1" "01-01-2018" "version 1.4.1" "convert MetaPost figures to PDF" .SH NAME .B mptopdf .SH SYNOPSIS diff --git a/doc/context/scripts/mkii/pdftools.html b/doc/context/scripts/mkii/pdftools.html index 94b5f1a2a..7c1474258 100644 --- a/doc/context/scripts/mkii/pdftools.html +++ b/doc/context/scripts/mkii/pdftools.html @@ -21,9 +21,9 @@ </style> <style type="text/css"> </style> - </head> - <body> - <div id="top"> <div id="top-one"> + </head> + <body> + <div id="top"> <div id="top-one"> <div id="top-two">PDFTools 1.2.1 </div> </div> </div> @@ -51,5 +51,5 @@ <br/> </div> </div> - </body> - </html> + </body> +</html> diff --git a/doc/context/scripts/mkii/pdftools.man b/doc/context/scripts/mkii/pdftools.man index b59b9494e..556035a0f 100644 --- a/doc/context/scripts/mkii/pdftools.man +++ b/doc/context/scripts/mkii/pdftools.man @@ -1,4 +1,4 @@ -.TH "pdftools" "1" "01-01-2017" "version 1.2.1" "PDFTools" +.TH "pdftools" "1" "01-01-2018" "version 1.2.1" "PDFTools" .SH NAME .B pdftools .SH SYNOPSIS diff --git a/doc/context/scripts/mkii/pstopdf.html b/doc/context/scripts/mkii/pstopdf.html index 9b8f50762..4470e6176 100644 --- a/doc/context/scripts/mkii/pstopdf.html +++ b/doc/context/scripts/mkii/pstopdf.html @@ -21,9 +21,9 @@ </style> <style type="text/css"> </style> - </head> - <body> - <div id="top"> <div id="top-one"> + </head> + <body> + <div id="top"> <div id="top-one"> <div id="top-two">PStoPDF 2.0.1 </div> </div> </div> @@ -45,5 +45,5 @@ <br/> </div> </div> - </body> - </html> + </body> +</html> diff --git a/doc/context/scripts/mkii/pstopdf.man b/doc/context/scripts/mkii/pstopdf.man index b633c731f..1502fa168 100644 --- a/doc/context/scripts/mkii/pstopdf.man +++ b/doc/context/scripts/mkii/pstopdf.man @@ -1,4 +1,4 @@ -.TH "pstopdf" "1" "01-01-2017" "version 2.0.1" "PStoPDF" +.TH "pstopdf" "1" "01-01-2018" "version 2.0.1" "PStoPDF" .SH NAME .B pstopdf .SH SYNOPSIS diff --git a/doc/context/scripts/mkii/rlxtools.html b/doc/context/scripts/mkii/rlxtools.html index 5aeffa129..6af4c5954 100644 --- a/doc/context/scripts/mkii/rlxtools.html +++ b/doc/context/scripts/mkii/rlxtools.html @@ -21,9 +21,9 @@ </style> <style type="text/css"> </style> - </head> - <body> - <div id="top"> <div id="top-one"> + </head> + <body> + <div id="top"> <div id="top-one"> <div id="top-two">RlxTools 1.0.1 </div> </div> </div> @@ -45,5 +45,5 @@ <br/> </div> </div> - </body> - </html> + </body> +</html> diff --git a/doc/context/scripts/mkii/rlxtools.man b/doc/context/scripts/mkii/rlxtools.man index 934623a79..56bc3c690 100644 --- a/doc/context/scripts/mkii/rlxtools.man +++ b/doc/context/scripts/mkii/rlxtools.man @@ -1,4 +1,4 @@ -.TH "rlxtools" "1" "01-01-2017" "version 1.0.1" "RlxTools" +.TH "rlxtools" "1" "01-01-2018" "version 1.0.1" "RlxTools" .SH NAME .B rlxtools .SH SYNOPSIS diff --git a/doc/context/scripts/mkii/texexec.html b/doc/context/scripts/mkii/texexec.html index 8a3a60abd..5f775068c 100644 --- a/doc/context/scripts/mkii/texexec.html +++ b/doc/context/scripts/mkii/texexec.html @@ -21,9 +21,9 @@ </style> <style type="text/css"> </style> - </head> - <body> - <div id="top"> <div id="top-one"> + </head> + <body> + <div id="top"> <div id="top-one"> <div id="top-two">TeXExec 6.2.1 </div> </div> </div> @@ -59,5 +59,5 @@ <br/> </div> </div> - </body> - </html> + </body> +</html> diff --git a/doc/context/scripts/mkii/texexec.man b/doc/context/scripts/mkii/texexec.man index c0b2a0f35..8de194d39 100644 --- a/doc/context/scripts/mkii/texexec.man +++ b/doc/context/scripts/mkii/texexec.man @@ -1,4 +1,4 @@ -.TH "texexec" "1" "01-01-2017" "version 6.2.1" "TeXExec" +.TH "texexec" "1" "01-01-2018" "version 6.2.1" "TeXExec" .SH NAME .B texexec .SH SYNOPSIS diff --git a/doc/context/scripts/mkii/texmfstart.html b/doc/context/scripts/mkii/texmfstart.html index 9a86eeee3..6e1f7f618 100644 --- a/doc/context/scripts/mkii/texmfstart.html +++ b/doc/context/scripts/mkii/texmfstart.html @@ -21,9 +21,9 @@ </style> <style type="text/css"> </style> - </head> - <body> - <div id="top"> <div id="top-one"> + </head> + <body> + <div id="top"> <div id="top-one"> <div id="top-two">texmfstart 7.0.0 </div> </div> </div> @@ -99,5 +99,5 @@ <br/> </div> </div> - </body> - </html> + </body> +</html> diff --git a/doc/context/scripts/mkii/texmfstart.man b/doc/context/scripts/mkii/texmfstart.man index 5ddb5f6b2..fdff5103c 100644 --- a/doc/context/scripts/mkii/texmfstart.man +++ b/doc/context/scripts/mkii/texmfstart.man @@ -1,4 +1,4 @@ -.TH "mtxrun" "1" "01-01-2017" "version 1.32" "ConTeXt TDS Runner Tool" +.TH "mtxrun" "1" "01-01-2018" "version 1.33" "ConTeXt TDS Runner Tool" .SH NAME .B mtxrun .SH SYNOPSIS diff --git a/doc/context/scripts/mkii/texmfstart.xml b/doc/context/scripts/mkii/texmfstart.xml index a10fef328..0fc6505f4 100644 --- a/doc/context/scripts/mkii/texmfstart.xml +++ b/doc/context/scripts/mkii/texmfstart.xml @@ -2,7 +2,7 @@ <metadata> <entry name="name">mtxrun</entry> <entry name="detail">ConTeXt TDS Runner Tool</entry> - <entry name="version">1.32</entry> + <entry name="version">1.33</entry> </metadata> <flags> <category name="basic"> diff --git a/doc/context/scripts/mkii/textools.html b/doc/context/scripts/mkii/textools.html index 397de9d8b..9bd9ac5c9 100644 --- a/doc/context/scripts/mkii/textools.html +++ b/doc/context/scripts/mkii/textools.html @@ -21,9 +21,9 @@ </style> <style type="text/css"> </style> - </head> - <body> - <div id="top"> <div id="top-one"> + </head> + <body> + <div id="top"> <div id="top-one"> <div id="top-two">TeXTools 1.3.1 </div> </div> </div> @@ -59,5 +59,5 @@ <br/> </div> </div> - </body> - </html> + </body> +</html> diff --git a/doc/context/scripts/mkii/textools.man b/doc/context/scripts/mkii/textools.man index 578c0ded5..d355ccf5d 100644 --- a/doc/context/scripts/mkii/textools.man +++ b/doc/context/scripts/mkii/textools.man @@ -1,4 +1,4 @@ -.TH "textools" "1" "01-01-2017" "version 1.3.1" "TeXTools" +.TH "textools" "1" "01-01-2018" "version 1.3.1" "TeXTools" .SH NAME .B textools .SH SYNOPSIS diff --git a/doc/context/scripts/mkii/texutil.html b/doc/context/scripts/mkii/texutil.html index b5974ab99..4dd23fa3a 100644 --- a/doc/context/scripts/mkii/texutil.html +++ b/doc/context/scripts/mkii/texutil.html @@ -21,9 +21,9 @@ </style> <style type="text/css"> </style> - </head> - <body> - <div id="top"> <div id="top-one"> + </head> + <body> + <div id="top"> <div id="top-one"> <div id="top-two">TeXUtil 9.1.0 </div> </div> </div> @@ -50,5 +50,5 @@ <br/> </div> </div> - </body> - </html> + </body> +</html> diff --git a/doc/context/scripts/mkii/texutil.man b/doc/context/scripts/mkii/texutil.man index c086eb603..918660e45 100644 --- a/doc/context/scripts/mkii/texutil.man +++ b/doc/context/scripts/mkii/texutil.man @@ -1,4 +1,4 @@ -.TH "texutil" "1" "01-01-2017" "version 9.1.0" "TeXUtil" +.TH "texutil" "1" "01-01-2018" "version 9.1.0" "TeXUtil" .SH NAME .B texutil .SH SYNOPSIS diff --git a/doc/context/scripts/mkii/tmftools.html b/doc/context/scripts/mkii/tmftools.html index 1e13062b9..17a182896 100644 --- a/doc/context/scripts/mkii/tmftools.html +++ b/doc/context/scripts/mkii/tmftools.html @@ -21,9 +21,9 @@ </style> <style type="text/css"> </style> - </head> - <body> - <div id="top"> <div id="top-one"> + </head> + <body> + <div id="top"> <div id="top-one"> <div id="top-two">TMFTools 1.2.1 </div> </div> </div> @@ -46,5 +46,5 @@ <br/> </div> </div> - </body> - </html> + </body> +</html> diff --git a/doc/context/scripts/mkii/tmftools.man b/doc/context/scripts/mkii/tmftools.man index f3fe4cade..68550bb00 100644 --- a/doc/context/scripts/mkii/tmftools.man +++ b/doc/context/scripts/mkii/tmftools.man @@ -1,4 +1,4 @@ -.TH "tmftools" "1" "01-01-2017" "version 1.1.0" "TMFTools" +.TH "tmftools" "1" "01-01-2018" "version 1.1.0" "TMFTools" .SH NAME .B tmftools .SH SYNOPSIS diff --git a/doc/context/scripts/mkii/xmltools.html b/doc/context/scripts/mkii/xmltools.html index fcb27aaf4..d6733ae7a 100644 --- a/doc/context/scripts/mkii/xmltools.html +++ b/doc/context/scripts/mkii/xmltools.html @@ -21,9 +21,9 @@ </style> <style type="text/css"> </style> - </head> - <body> - <div id="top"> <div id="top-one"> + </head> + <body> + <div id="top"> <div id="top-one"> <div id="top-two">XMLTools 1.2.1 </div> </div> </div> @@ -50,5 +50,5 @@ <br/> </div> </div> - </body> - </html> + </body> +</html> diff --git a/doc/context/scripts/mkii/xmltools.man b/doc/context/scripts/mkii/xmltools.man index 1da86756c..aacd5ee78 100644 --- a/doc/context/scripts/mkii/xmltools.man +++ b/doc/context/scripts/mkii/xmltools.man @@ -1,4 +1,4 @@ -.TH "xmltools" "1" "01-01-2017" "version 1.2.2" "XMLTools" +.TH "xmltools" "1" "01-01-2018" "version 1.2.2" "XMLTools" .SH NAME .B xmltools .SH SYNOPSIS diff --git a/doc/context/scripts/mkiv/context.html b/doc/context/scripts/mkiv/context.html index c63c81132..cb841477a 100644 --- a/doc/context/scripts/mkiv/context.html +++ b/doc/context/scripts/mkiv/context.html @@ -14,17 +14,17 @@ <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> <head> - <title>ConTeXt Process Management 1.01</title> + <title>ConTeXt Process Management 1.02</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <style type="text/css"> body { color: #FFFFFF; background-color: #808080; font-family: optima, verdana, futura, "lucida sans", arial, geneva, helvetica, sans; font-size: 12px; line-height: 18px; } a:link, a:active, a:visited { color: #FFFFFF; } a.dir-view:link, a.dir-view:active, a.dir-view:visited { color: #FFFFFF; text-decoration: underline; } .valid { color: #00FF00; } .invalid { color: #FF0000; } .invisible { visibility: hidden; } button, .commonlink, .smallbutton { font-weight: bold; font-size: 12px; text-decoration: none; color: #000000; border-color: #7F7F7F; border-style: solid; border-width: .125ex; background-color: #FFFFFF; padding: .5ex; } .smallbutton { width: 1em; } a.commonlink:link, a.commonlink:active, a.commonlink:visited, a.smalllink:link, a.smalllink:active, a.smalllink:visited { font-weight: bold; font-size: 12px; text-decoration: none; color: #000000; } h1, .title { font-style: normal; font-weight: normal; font-size: 18px; line-height: 18px; margin-bottom: 20px; } h2, .subtitle { font-style: normal; font-weight: normal; font-size: 12px; margin-top: 18px; margin-bottom: 18px; } table { line-height: 18px; font-size: 12px; margin: 0; } th { font-weight: bold; text-align: left; padding-bottom: 6px; } .tc { font-weight: bold; text-align: left; } p, li { max-width: 60em; } .empty-line { margin-top: 4px; } .more-room { margin-right: 1.5em; } .much-more-room { margin-right: 3em; } #main { position: absolute; left: 10%; top: 10%; right: 10%; bottom: 10%; z-index: 2; width: 80%; height: 80%; padding: 0%; margin: 0%; overflow: auto; border-style: none; border-width: 0; background-color: #3F3F3F; } #main-settings { margin: 12px; x_max-width: 60em; line-height: 18px; font-size: 12px; } #left { position: absolute; top : 10%; left: 0%; bottom: 0%; right: 90%; z-index: 1; width: 10%; height: 90%; padding: 0%; margin: 0%; font-size: 16px; border-style: none; border-width: 0; background-color: #4F6F6F; } #right { position: absolute; top : 0%; left: 90%; bottom: 10%; right: 0%; z-index: 1; width: 10%; height: 90%; padding: 0%; margin: 0%; font-size: 16px; border-style: none; border-width: 0; background-color: #4F6F6F; _margin-left: -15px; } #bottom { position: absolute; left: 10%; right: 0%; top: 90%; bottom: 0%; z-index: 1; width: 90%; height: 10%; padding: 0%; margin: 0%; font-size: 16px; border-style: none; border-width: 0; background-color: #6F6F8F; } #top { position: absolute; left: 0%; right: 10%; top: 0%; bottom: 90%; z-index: 1; width: 90%; height: 10%; padding: 0%; margin: 0%; font-size: 16px; border-style: none; border-width: 0; background-color: #6F6F8F; } #top-one { position: absolute; bottom: 50%; width: 100%; buggedheight: 100%; } #top-two { position: relative; margin-bottom: -9px; margin-left: 12px; margin-right: 12px; line-height: 18px; text-align: right; vertical-align: middle; } #bottom-one { position: absolute; bottom: 50%; width: 100%; buggedheight: 100%; } #bottom-two { position: relative; margin-bottom: -9px; margin-left: 12px; margin-right: 12px; line-height: 18px; text-align: left; vertical-align: middle; } #left-one { position: absolute; width: 100%; buggedheight: 100%; } #left-two { position: relative; margin-top: 12px; line-height: 18px; text-align: center; vertical-align: top; } #right-one { display: table; height: 100%; width: 100%; } #right-two { display: table-row; height: 100%; width: 100%; } #right-three { display: table-cell; width: 100%; vertical-align: bottom; _position: absolute; _top: 100%; } #right-four { text-align: center; margin-bottom: 2ex; _position: relative; _top: -100%; } #more-top { position: absolute; top: 0%; left: 90%; bottom: 90%; right: 0%; z-index: 3; width: 10%; height: 10%; padding: 0%; margin: 0%; border-style: none; border-width: 0; } #more-top-settings { text-align: center; } #more-right-settings { margin-right: 12px; margin-left: 12px; line-height: 18px; font-size: 10px; text-align: center; } #right-safari { _display: table; width: 100%; height: 100%; } </style> <style type="text/css"> </style> - </head> - <body> - <div id="top"> <div id="top-one"> - <div id="top-two">ConTeXt Process Management 1.01 </div> + </head> + <body> + <div id="top"> <div id="top-one"> + <div id="top-two">ConTeXt Process Management 1.02 </div> </div> </div> <div id="bottom"> <div id="bottom-one"> @@ -61,6 +61,7 @@ <tr><th>--trackers</th><td>list</td><td>set tracker variables (show list with --showtrackers)</td></tr> <tr><th>--directives</th><td>list</td><td>set directive variables (show list with --showdirectives)</td></tr> <tr><th>--silent</th><td>list</td><td>disable logcatgories (show list with --showlogcategories)</td></tr> + <tr><th>--errors</th><td>list</td><td>show errors at the end of a run, quit when in list (also when ----silent)</td></tr> <tr><th>--noconsole</th><td></td><td>disable logging to the console (logfile only)</td></tr> <tr><th>--purgeresult</th><td></td><td>purge result file before run</td></tr> <tr><th/><td/><td/></tr> @@ -81,8 +82,8 @@ <tr><th/><td/><td/></tr> <tr><th>--batchmode</th><td></td><td>run without stopping and do not show messages on the console</td></tr> <tr><th>--nonstopmode</th><td></td><td>run without stopping</td></tr> - <tr><th>--synctex</th><td></td><td>run with synctex enabled (optional value: zipped, unzipped, 1, -1, context)</td></tr> - <tr><th>--syncttx</th><td></td><td>a shortcut for --synctex=context</td></tr> + <tr><th>--nosynctex</th><td></td><td>never initializes synctex (for production runs)</td></tr> + <tr><th>--synctex</th><td></td><td>run with synctex enabled (better use \setupsynctex[state=start]</td></tr> <tr><th>--nodates</th><td></td><td>omit runtime dates in pdf file (optional value: a number (this 1970 offset time) or string "YYYY-MM-DD HH:MM")</td></tr> <tr><th>--nocompression</th><td></td><td>forcefully turns off compression in the backend</td></tr> <tr><th>--trailerid</th><td></td><td>alternative trailer id (or constant one)</td></tr> @@ -118,5 +119,5 @@ <br/> </div> </div> - </body> - </html> + </body> +</html> diff --git a/doc/context/scripts/mkiv/context.man b/doc/context/scripts/mkiv/context.man index 88f970e7b..39882b77e 100644 --- a/doc/context/scripts/mkiv/context.man +++ b/doc/context/scripts/mkiv/context.man @@ -1,4 +1,4 @@ -.TH "mtx-context" "1" "01-01-2017" "version 1.01" "ConTeXt Process Management" +.TH "mtx-context" "1" "01-01-2018" "version 1.01" "ConTeXt Process Management" .SH NAME .B mtx-context .SH SYNOPSIS @@ -65,6 +65,9 @@ set directive variables (show list with --showdirectives) .B --silent=list disable logcatgories (show list with --showlogcategories) .TP +.B --errors=list +show errors at the end of a run, quit when in list (also when ----silent) +.TP .B --noconsole disable logging to the console (logfile only) .TP @@ -110,11 +113,11 @@ run without stopping and do not show messages on the console .B --nonstopmode run without stopping .TP -.B --synctex -run with synctex enabled (optional value: zipped, unzipped, 1, -1, context) +.B --nosynctex +never initializes synctex (for production runs) .TP -.B --syncttx -a shortcut for --synctex=context +.B --synctex +run with synctex enabled (better use \setupsynctex[state=start] .TP .B --nodates omit runtime dates in pdf file (optional value: a number (this 1970 offset time) or string "YYYY-MM-DD HH:MM") diff --git a/doc/context/scripts/mkiv/context.xml b/doc/context/scripts/mkiv/context.xml index 25e92d7a6..9003b549a 100644 --- a/doc/context/scripts/mkiv/context.xml +++ b/doc/context/scripts/mkiv/context.xml @@ -70,6 +70,9 @@ <flag name="silent" value="list"> <short>disable logcatgories (show list with <ref name="showlogcategories"/>)</short> </flag> + <flag name="errors" value="list"> + <short>show errors at the end of a run, quit when in list (also when <ref name="--silent"/>)</short> + </flag> <flag name="noconsole"> <short>disable logging to the console (logfile only)</short> </flag> @@ -125,11 +128,11 @@ <flag name="nonstopmode"> <short>run without stopping</short> </flag> - <flag name="synctex"> - <short>run with synctex enabled (optional value: zipped, unzipped, 1, -1, context)</short> + <flag name="nosynctex"> + <short>never initializes synctex (for production runs)</short> </flag> - <flag name="syncttx"> - <short>a shortcut for --synctex=context</short> + <flag name="synctex"> + <short>run with synctex enabled (better use \setupsynctex[state=start]</short> </flag> <flag name="nodates"> <short>omit runtime dates in pdf file (optional value: a number (this 1970 offset time) or string "YYYY-MM-DD HH:MM")</short> diff --git a/doc/context/scripts/mkiv/luatools.html b/doc/context/scripts/mkiv/luatools.html index 5ec428efd..af51be9d1 100644 --- a/doc/context/scripts/mkiv/luatools.html +++ b/doc/context/scripts/mkiv/luatools.html @@ -21,9 +21,9 @@ </style> <style type="text/css"> </style> - </head> - <body> - <div id="top"> <div id="top-one"> + </head> + <body> + <div id="top"> <div id="top-one"> <div id="top-two">luatools 1.35 </div> </div> </div> @@ -61,5 +61,5 @@ <br/> </div> </div> - </body> - </html> + </body> +</html> diff --git a/doc/context/scripts/mkiv/luatools.man b/doc/context/scripts/mkiv/luatools.man index 7795a18a4..8cdcf0fd6 100644 --- a/doc/context/scripts/mkiv/luatools.man +++ b/doc/context/scripts/mkiv/luatools.man @@ -1,4 +1,4 @@ -.TH "luatools" "1" "01-01-2017" "version 1.35" "ConTeXt TDS Management Tool (aka luatools)" +.TH "luatools" "1" "01-01-2018" "version 1.35" "ConTeXt TDS Management Tool (aka luatools)" .SH NAME .B luatools .SH SYNOPSIS diff --git a/doc/context/scripts/mkiv/mtx-babel.html b/doc/context/scripts/mkiv/mtx-babel.html index 97f891516..bc92dc27f 100644 --- a/doc/context/scripts/mkiv/mtx-babel.html +++ b/doc/context/scripts/mkiv/mtx-babel.html @@ -21,9 +21,9 @@ </style> <style type="text/css"> </style> - </head> - <body> - <div id="top"> <div id="top-one"> + </head> + <body> + <div id="top"> <div id="top-one"> <div id="top-two">Babel Input To UTF Conversion 1.20 </div> </div> </div> @@ -46,5 +46,5 @@ <br/> </div> </div> - </body> - </html> + </body> +</html> diff --git a/doc/context/scripts/mkiv/mtx-babel.man b/doc/context/scripts/mkiv/mtx-babel.man index 236434f94..712911333 100644 --- a/doc/context/scripts/mkiv/mtx-babel.man +++ b/doc/context/scripts/mkiv/mtx-babel.man @@ -1,4 +1,4 @@ -.TH "mtx-babel" "1" "01-01-2017" "version 1.20" "Babel Input To UTF Conversion" +.TH "mtx-babel" "1" "01-01-2018" "version 1.20" "Babel Input To UTF Conversion" .SH NAME .B mtx-babel .SH SYNOPSIS diff --git a/doc/context/scripts/mkiv/mtx-base.html b/doc/context/scripts/mkiv/mtx-base.html index 7eceb57fc..19b06162a 100644 --- a/doc/context/scripts/mkiv/mtx-base.html +++ b/doc/context/scripts/mkiv/mtx-base.html @@ -21,9 +21,9 @@ </style> <style type="text/css"> </style> - </head> - <body> - <div id="top"> <div id="top-one"> + </head> + <body> + <div id="top"> <div id="top-one"> <div id="top-two">ConTeXt TDS Management Tool (aka luatools) 1.35 </div> </div> </div> @@ -61,5 +61,5 @@ <br/> </div> </div> - </body> - </html> + </body> +</html> diff --git a/doc/context/scripts/mkiv/mtx-base.man b/doc/context/scripts/mkiv/mtx-base.man index d092ae514..c38347353 100644 --- a/doc/context/scripts/mkiv/mtx-base.man +++ b/doc/context/scripts/mkiv/mtx-base.man @@ -1,4 +1,4 @@ -.TH "mtx-base" "1" "01-01-2017" "version 1.35" "ConTeXt TDS Management Tool (aka luatools)" +.TH "mtx-base" "1" "01-01-2018" "version 1.35" "ConTeXt TDS Management Tool (aka luatools)" .SH NAME .B mtx-base .SH SYNOPSIS diff --git a/doc/context/scripts/mkiv/mtx-bibtex.html b/doc/context/scripts/mkiv/mtx-bibtex.html index a70c88483..33924a883 100644 --- a/doc/context/scripts/mkiv/mtx-bibtex.html +++ b/doc/context/scripts/mkiv/mtx-bibtex.html @@ -21,9 +21,9 @@ </style> <style type="text/css"> </style> - </head> - <body> - <div id="top"> <div id="top-one"> + </head> + <body> + <div id="top"> <div id="top-one"> <div id="top-two">bibtex helpers </div> </div> </div> @@ -51,5 +51,5 @@ <br/><tt>mtxrun --script bibtex --search --list --pattern=match(author:foo) bar.bib</tt> <br/><br/> </div> </div> - </body> - </html> + </body> +</html> diff --git a/doc/context/scripts/mkiv/mtx-bibtex.man b/doc/context/scripts/mkiv/mtx-bibtex.man index c7fbe4261..9553b900d 100644 --- a/doc/context/scripts/mkiv/mtx-bibtex.man +++ b/doc/context/scripts/mkiv/mtx-bibtex.man @@ -1,4 +1,4 @@ -.TH "mtx-bibtex" "1" "01-01-2017" "version 1.00" "bibtex helpers" +.TH "mtx-bibtex" "1" "01-01-2018" "version 1.00" "bibtex helpers" .SH NAME .B mtx-bibtex .SH SYNOPSIS diff --git a/doc/context/scripts/mkiv/mtx-cache.html b/doc/context/scripts/mkiv/mtx-cache.html index e69a73977..475095eb4 100644 --- a/doc/context/scripts/mkiv/mtx-cache.html +++ b/doc/context/scripts/mkiv/mtx-cache.html @@ -21,9 +21,9 @@ </style> <style type="text/css"> </style> - </head> - <body> - <div id="top"> <div id="top-one"> + </head> + <body> + <div id="top"> <div id="top-one"> <div id="top-two">ConTeXt & MetaTeX Cache Management 0.10 </div> </div> </div> @@ -48,5 +48,5 @@ <br/> </div> </div> - </body> - </html> + </body> +</html> diff --git a/doc/context/scripts/mkiv/mtx-cache.man b/doc/context/scripts/mkiv/mtx-cache.man index f0f6a11ac..188e72078 100644 --- a/doc/context/scripts/mkiv/mtx-cache.man +++ b/doc/context/scripts/mkiv/mtx-cache.man @@ -1,4 +1,4 @@ -.TH "mtx-cache" "1" "01-01-2017" "version 0.10" "ConTeXt & MetaTeX Cache Management" +.TH "mtx-cache" "1" "01-01-2018" "version 0.10" "ConTeXt & MetaTeX Cache Management" .SH NAME .B mtx-cache .SH SYNOPSIS diff --git a/doc/context/scripts/mkiv/mtx-chars.html b/doc/context/scripts/mkiv/mtx-chars.html index 0cc3840e6..b92a3f267 100644 --- a/doc/context/scripts/mkiv/mtx-chars.html +++ b/doc/context/scripts/mkiv/mtx-chars.html @@ -21,9 +21,9 @@ </style> <style type="text/css"> </style> - </head> - <body> - <div id="top"> <div id="top-one"> + </head> + <body> + <div id="top"> <div id="top-one"> <div id="top-two">MkII Character Table Generators 0.10 </div> </div> </div> @@ -46,5 +46,5 @@ <br/> </div> </div> - </body> - </html> + </body> +</html> diff --git a/doc/context/scripts/mkiv/mtx-chars.man b/doc/context/scripts/mkiv/mtx-chars.man index 9afac1b5c..8914c9ed5 100644 --- a/doc/context/scripts/mkiv/mtx-chars.man +++ b/doc/context/scripts/mkiv/mtx-chars.man @@ -1,4 +1,4 @@ -.TH "mtx-chars" "1" "01-01-2017" "version 0.10" "MkII Character Table Generators" +.TH "mtx-chars" "1" "01-01-2018" "version 0.10" "MkII Character Table Generators" .SH NAME .B mtx-chars .SH SYNOPSIS diff --git a/doc/context/scripts/mkiv/mtx-check.html b/doc/context/scripts/mkiv/mtx-check.html index df50c7288..f64afe35c 100644 --- a/doc/context/scripts/mkiv/mtx-check.html +++ b/doc/context/scripts/mkiv/mtx-check.html @@ -21,9 +21,9 @@ </style> <style type="text/css"> </style> - </head> - <body> - <div id="top"> <div id="top-one"> + </head> + <body> + <div id="top"> <div id="top-one"> <div id="top-two">Basic ConTeXt Syntax Checking 0.10 </div> </div> </div> @@ -44,5 +44,5 @@ <br/> </div> </div> - </body> - </html> + </body> +</html> diff --git a/doc/context/scripts/mkiv/mtx-check.man b/doc/context/scripts/mkiv/mtx-check.man index 2a23dce7f..9c1f02a49 100644 --- a/doc/context/scripts/mkiv/mtx-check.man +++ b/doc/context/scripts/mkiv/mtx-check.man @@ -1,4 +1,4 @@ -.TH "mtx-check" "1" "01-01-2017" "version 0.10" "Basic ConTeXt Syntax Checking" +.TH "mtx-check" "1" "01-01-2018" "version 0.10" "Basic ConTeXt Syntax Checking" .SH NAME .B mtx-check .SH SYNOPSIS diff --git a/doc/context/scripts/mkiv/mtx-colors.html b/doc/context/scripts/mkiv/mtx-colors.html index f9b05c74c..91c088eef 100644 --- a/doc/context/scripts/mkiv/mtx-colors.html +++ b/doc/context/scripts/mkiv/mtx-colors.html @@ -21,9 +21,9 @@ </style> <style type="text/css"> </style> - </head> - <body> - <div id="top"> <div id="top-one"> + </head> + <body> + <div id="top"> <div id="top-one"> <div id="top-two">ConTeXt Color Management 0.10 </div> </div> </div> @@ -46,5 +46,5 @@ <tt>mtxrun --script color --table somename</tt> <br/><br/> </div> </div> - </body> - </html> + </body> +</html> diff --git a/doc/context/scripts/mkiv/mtx-colors.man b/doc/context/scripts/mkiv/mtx-colors.man index fb7800586..de271e01b 100644 --- a/doc/context/scripts/mkiv/mtx-colors.man +++ b/doc/context/scripts/mkiv/mtx-colors.man @@ -1,4 +1,4 @@ -.TH "mtx-colors" "1" "01-01-2017" "version 0.10" "ConTeXt Color Management" +.TH "mtx-colors" "1" "01-01-2018" "version 0.10" "ConTeXt Color Management" .SH NAME .B mtx-colors .SH SYNOPSIS diff --git a/doc/context/scripts/mkiv/mtx-context.html b/doc/context/scripts/mkiv/mtx-context.html index c63c81132..cb841477a 100644 --- a/doc/context/scripts/mkiv/mtx-context.html +++ b/doc/context/scripts/mkiv/mtx-context.html @@ -14,17 +14,17 @@ <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> <head> - <title>ConTeXt Process Management 1.01</title> + <title>ConTeXt Process Management 1.02</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <style type="text/css"> body { color: #FFFFFF; background-color: #808080; font-family: optima, verdana, futura, "lucida sans", arial, geneva, helvetica, sans; font-size: 12px; line-height: 18px; } a:link, a:active, a:visited { color: #FFFFFF; } a.dir-view:link, a.dir-view:active, a.dir-view:visited { color: #FFFFFF; text-decoration: underline; } .valid { color: #00FF00; } .invalid { color: #FF0000; } .invisible { visibility: hidden; } button, .commonlink, .smallbutton { font-weight: bold; font-size: 12px; text-decoration: none; color: #000000; border-color: #7F7F7F; border-style: solid; border-width: .125ex; background-color: #FFFFFF; padding: .5ex; } .smallbutton { width: 1em; } a.commonlink:link, a.commonlink:active, a.commonlink:visited, a.smalllink:link, a.smalllink:active, a.smalllink:visited { font-weight: bold; font-size: 12px; text-decoration: none; color: #000000; } h1, .title { font-style: normal; font-weight: normal; font-size: 18px; line-height: 18px; margin-bottom: 20px; } h2, .subtitle { font-style: normal; font-weight: normal; font-size: 12px; margin-top: 18px; margin-bottom: 18px; } table { line-height: 18px; font-size: 12px; margin: 0; } th { font-weight: bold; text-align: left; padding-bottom: 6px; } .tc { font-weight: bold; text-align: left; } p, li { max-width: 60em; } .empty-line { margin-top: 4px; } .more-room { margin-right: 1.5em; } .much-more-room { margin-right: 3em; } #main { position: absolute; left: 10%; top: 10%; right: 10%; bottom: 10%; z-index: 2; width: 80%; height: 80%; padding: 0%; margin: 0%; overflow: auto; border-style: none; border-width: 0; background-color: #3F3F3F; } #main-settings { margin: 12px; x_max-width: 60em; line-height: 18px; font-size: 12px; } #left { position: absolute; top : 10%; left: 0%; bottom: 0%; right: 90%; z-index: 1; width: 10%; height: 90%; padding: 0%; margin: 0%; font-size: 16px; border-style: none; border-width: 0; background-color: #4F6F6F; } #right { position: absolute; top : 0%; left: 90%; bottom: 10%; right: 0%; z-index: 1; width: 10%; height: 90%; padding: 0%; margin: 0%; font-size: 16px; border-style: none; border-width: 0; background-color: #4F6F6F; _margin-left: -15px; } #bottom { position: absolute; left: 10%; right: 0%; top: 90%; bottom: 0%; z-index: 1; width: 90%; height: 10%; padding: 0%; margin: 0%; font-size: 16px; border-style: none; border-width: 0; background-color: #6F6F8F; } #top { position: absolute; left: 0%; right: 10%; top: 0%; bottom: 90%; z-index: 1; width: 90%; height: 10%; padding: 0%; margin: 0%; font-size: 16px; border-style: none; border-width: 0; background-color: #6F6F8F; } #top-one { position: absolute; bottom: 50%; width: 100%; buggedheight: 100%; } #top-two { position: relative; margin-bottom: -9px; margin-left: 12px; margin-right: 12px; line-height: 18px; text-align: right; vertical-align: middle; } #bottom-one { position: absolute; bottom: 50%; width: 100%; buggedheight: 100%; } #bottom-two { position: relative; margin-bottom: -9px; margin-left: 12px; margin-right: 12px; line-height: 18px; text-align: left; vertical-align: middle; } #left-one { position: absolute; width: 100%; buggedheight: 100%; } #left-two { position: relative; margin-top: 12px; line-height: 18px; text-align: center; vertical-align: top; } #right-one { display: table; height: 100%; width: 100%; } #right-two { display: table-row; height: 100%; width: 100%; } #right-three { display: table-cell; width: 100%; vertical-align: bottom; _position: absolute; _top: 100%; } #right-four { text-align: center; margin-bottom: 2ex; _position: relative; _top: -100%; } #more-top { position: absolute; top: 0%; left: 90%; bottom: 90%; right: 0%; z-index: 3; width: 10%; height: 10%; padding: 0%; margin: 0%; border-style: none; border-width: 0; } #more-top-settings { text-align: center; } #more-right-settings { margin-right: 12px; margin-left: 12px; line-height: 18px; font-size: 10px; text-align: center; } #right-safari { _display: table; width: 100%; height: 100%; } </style> <style type="text/css"> </style> - </head> - <body> - <div id="top"> <div id="top-one"> - <div id="top-two">ConTeXt Process Management 1.01 </div> + </head> + <body> + <div id="top"> <div id="top-one"> + <div id="top-two">ConTeXt Process Management 1.02 </div> </div> </div> <div id="bottom"> <div id="bottom-one"> @@ -61,6 +61,7 @@ <tr><th>--trackers</th><td>list</td><td>set tracker variables (show list with --showtrackers)</td></tr> <tr><th>--directives</th><td>list</td><td>set directive variables (show list with --showdirectives)</td></tr> <tr><th>--silent</th><td>list</td><td>disable logcatgories (show list with --showlogcategories)</td></tr> + <tr><th>--errors</th><td>list</td><td>show errors at the end of a run, quit when in list (also when ----silent)</td></tr> <tr><th>--noconsole</th><td></td><td>disable logging to the console (logfile only)</td></tr> <tr><th>--purgeresult</th><td></td><td>purge result file before run</td></tr> <tr><th/><td/><td/></tr> @@ -81,8 +82,8 @@ <tr><th/><td/><td/></tr> <tr><th>--batchmode</th><td></td><td>run without stopping and do not show messages on the console</td></tr> <tr><th>--nonstopmode</th><td></td><td>run without stopping</td></tr> - <tr><th>--synctex</th><td></td><td>run with synctex enabled (optional value: zipped, unzipped, 1, -1, context)</td></tr> - <tr><th>--syncttx</th><td></td><td>a shortcut for --synctex=context</td></tr> + <tr><th>--nosynctex</th><td></td><td>never initializes synctex (for production runs)</td></tr> + <tr><th>--synctex</th><td></td><td>run with synctex enabled (better use \setupsynctex[state=start]</td></tr> <tr><th>--nodates</th><td></td><td>omit runtime dates in pdf file (optional value: a number (this 1970 offset time) or string "YYYY-MM-DD HH:MM")</td></tr> <tr><th>--nocompression</th><td></td><td>forcefully turns off compression in the backend</td></tr> <tr><th>--trailerid</th><td></td><td>alternative trailer id (or constant one)</td></tr> @@ -118,5 +119,5 @@ <br/> </div> </div> - </body> - </html> + </body> +</html> diff --git a/doc/context/scripts/mkiv/mtx-context.man b/doc/context/scripts/mkiv/mtx-context.man index 88f970e7b..39882b77e 100644 --- a/doc/context/scripts/mkiv/mtx-context.man +++ b/doc/context/scripts/mkiv/mtx-context.man @@ -1,4 +1,4 @@ -.TH "mtx-context" "1" "01-01-2017" "version 1.01" "ConTeXt Process Management" +.TH "mtx-context" "1" "01-01-2018" "version 1.01" "ConTeXt Process Management" .SH NAME .B mtx-context .SH SYNOPSIS @@ -65,6 +65,9 @@ set directive variables (show list with --showdirectives) .B --silent=list disable logcatgories (show list with --showlogcategories) .TP +.B --errors=list +show errors at the end of a run, quit when in list (also when ----silent) +.TP .B --noconsole disable logging to the console (logfile only) .TP @@ -110,11 +113,11 @@ run without stopping and do not show messages on the console .B --nonstopmode run without stopping .TP -.B --synctex -run with synctex enabled (optional value: zipped, unzipped, 1, -1, context) +.B --nosynctex +never initializes synctex (for production runs) .TP -.B --syncttx -a shortcut for --synctex=context +.B --synctex +run with synctex enabled (better use \setupsynctex[state=start] .TP .B --nodates omit runtime dates in pdf file (optional value: a number (this 1970 offset time) or string "YYYY-MM-DD HH:MM") diff --git a/doc/context/scripts/mkiv/mtx-context.xml b/doc/context/scripts/mkiv/mtx-context.xml index 25e92d7a6..9003b549a 100644 --- a/doc/context/scripts/mkiv/mtx-context.xml +++ b/doc/context/scripts/mkiv/mtx-context.xml @@ -70,6 +70,9 @@ <flag name="silent" value="list"> <short>disable logcatgories (show list with <ref name="showlogcategories"/>)</short> </flag> + <flag name="errors" value="list"> + <short>show errors at the end of a run, quit when in list (also when <ref name="--silent"/>)</short> + </flag> <flag name="noconsole"> <short>disable logging to the console (logfile only)</short> </flag> @@ -125,11 +128,11 @@ <flag name="nonstopmode"> <short>run without stopping</short> </flag> - <flag name="synctex"> - <short>run with synctex enabled (optional value: zipped, unzipped, 1, -1, context)</short> + <flag name="nosynctex"> + <short>never initializes synctex (for production runs)</short> </flag> - <flag name="syncttx"> - <short>a shortcut for --synctex=context</short> + <flag name="synctex"> + <short>run with synctex enabled (better use \setupsynctex[state=start]</short> </flag> <flag name="nodates"> <short>omit runtime dates in pdf file (optional value: a number (this 1970 offset time) or string "YYYY-MM-DD HH:MM")</short> diff --git a/doc/context/scripts/mkiv/mtx-dvi.html b/doc/context/scripts/mkiv/mtx-dvi.html index e83c43748..a763189f3 100644 --- a/doc/context/scripts/mkiv/mtx-dvi.html +++ b/doc/context/scripts/mkiv/mtx-dvi.html @@ -21,9 +21,9 @@ </style> <style type="text/css"> </style> - </head> - <body> - <div id="top"> <div id="top-one"> + </head> + <body> + <div id="top"> <div id="top-one"> <div id="top-two">ConTeXt DVI Helpers 0.10 </div> </div> </div> @@ -44,5 +44,5 @@ <br/> </div> </div> - </body> - </html> + </body> +</html> diff --git a/doc/context/scripts/mkiv/mtx-dvi.man b/doc/context/scripts/mkiv/mtx-dvi.man index 09a1301c0..29c5dd772 100644 --- a/doc/context/scripts/mkiv/mtx-dvi.man +++ b/doc/context/scripts/mkiv/mtx-dvi.man @@ -1,4 +1,4 @@ -.TH "mtx-dvi" "1" "01-01-2017" "version 0.01" "ConTeXt DVI Helpers" +.TH "mtx-dvi" "1" "01-01-2018" "version 0.01" "ConTeXt DVI Helpers" .SH NAME .B mtx-dvi .SH SYNOPSIS diff --git a/doc/context/scripts/mkiv/mtx-epub.html b/doc/context/scripts/mkiv/mtx-epub.html index 1a92a794a..efd8ad704 100644 --- a/doc/context/scripts/mkiv/mtx-epub.html +++ b/doc/context/scripts/mkiv/mtx-epub.html @@ -21,9 +21,9 @@ </style> <style type="text/css"> </style> - </head> - <body> - <div id="top"> <div id="top-one"> + </head> + <body> + <div id="top"> <div id="top-one"> <div id="top-two">ConTeXt EPUB Helpers 1.10 </div> </div> </div> @@ -51,5 +51,5 @@ <tt>mtxrun --script epub --make mydocument</tt> <br/><br/> </div> </div> - </body> - </html> + </body> +</html> diff --git a/doc/context/scripts/mkiv/mtx-epub.man b/doc/context/scripts/mkiv/mtx-epub.man index a3101e84b..3e6875204 100644 --- a/doc/context/scripts/mkiv/mtx-epub.man +++ b/doc/context/scripts/mkiv/mtx-epub.man @@ -1,4 +1,4 @@ -.TH "mtx-epub" "1" "01-01-2017" "version 1.10" "ConTeXt EPUB Helpers" +.TH "mtx-epub" "1" "01-01-2018" "version 1.10" "ConTeXt EPUB Helpers" .SH NAME .B mtx-epub .SH SYNOPSIS diff --git a/doc/context/scripts/mkiv/mtx-evohome.html b/doc/context/scripts/mkiv/mtx-evohome.html new file mode 100644 index 000000000..dc21f7721 --- /dev/null +++ b/doc/context/scripts/mkiv/mtx-evohome.html @@ -0,0 +1,55 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> + +<!-- compare with lmx framework variant --> + +<!-- + filename : context-base.xml + comment : companion to mtx-server-ctx-startup.tex + author : Hans Hagen, PRAGMA-ADE, Hasselt NL + copyright: PRAGMA ADE / ConTeXt Development Team + license : see context related readme files +--> + +<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> + <head> + <title>Evohome Fetcher 1.00</title> + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> + <style type="text/css"> + body { color: #FFFFFF; background-color: #808080; font-family: optima, verdana, futura, "lucida sans", arial, geneva, helvetica, sans; font-size: 12px; line-height: 18px; } a:link, a:active, a:visited { color: #FFFFFF; } a.dir-view:link, a.dir-view:active, a.dir-view:visited { color: #FFFFFF; text-decoration: underline; } .valid { color: #00FF00; } .invalid { color: #FF0000; } .invisible { visibility: hidden; } button, .commonlink, .smallbutton { font-weight: bold; font-size: 12px; text-decoration: none; color: #000000; border-color: #7F7F7F; border-style: solid; border-width: .125ex; background-color: #FFFFFF; padding: .5ex; } .smallbutton { width: 1em; } a.commonlink:link, a.commonlink:active, a.commonlink:visited, a.smalllink:link, a.smalllink:active, a.smalllink:visited { font-weight: bold; font-size: 12px; text-decoration: none; color: #000000; } h1, .title { font-style: normal; font-weight: normal; font-size: 18px; line-height: 18px; margin-bottom: 20px; } h2, .subtitle { font-style: normal; font-weight: normal; font-size: 12px; margin-top: 18px; margin-bottom: 18px; } table { line-height: 18px; font-size: 12px; margin: 0; } th { font-weight: bold; text-align: left; padding-bottom: 6px; } .tc { font-weight: bold; text-align: left; } p, li { max-width: 60em; } .empty-line { margin-top: 4px; } .more-room { margin-right: 1.5em; } .much-more-room { margin-right: 3em; } #main { position: absolute; left: 10%; top: 10%; right: 10%; bottom: 10%; z-index: 2; width: 80%; height: 80%; padding: 0%; margin: 0%; overflow: auto; border-style: none; border-width: 0; background-color: #3F3F3F; } #main-settings { margin: 12px; x_max-width: 60em; line-height: 18px; font-size: 12px; } #left { position: absolute; top : 10%; left: 0%; bottom: 0%; right: 90%; z-index: 1; width: 10%; height: 90%; padding: 0%; margin: 0%; font-size: 16px; border-style: none; border-width: 0; background-color: #4F6F6F; } #right { position: absolute; top : 0%; left: 90%; bottom: 10%; right: 0%; z-index: 1; width: 10%; height: 90%; padding: 0%; margin: 0%; font-size: 16px; border-style: none; border-width: 0; background-color: #4F6F6F; _margin-left: -15px; } #bottom { position: absolute; left: 10%; right: 0%; top: 90%; bottom: 0%; z-index: 1; width: 90%; height: 10%; padding: 0%; margin: 0%; font-size: 16px; border-style: none; border-width: 0; background-color: #6F6F8F; } #top { position: absolute; left: 0%; right: 10%; top: 0%; bottom: 90%; z-index: 1; width: 90%; height: 10%; padding: 0%; margin: 0%; font-size: 16px; border-style: none; border-width: 0; background-color: #6F6F8F; } #top-one { position: absolute; bottom: 50%; width: 100%; buggedheight: 100%; } #top-two { position: relative; margin-bottom: -9px; margin-left: 12px; margin-right: 12px; line-height: 18px; text-align: right; vertical-align: middle; } #bottom-one { position: absolute; bottom: 50%; width: 100%; buggedheight: 100%; } #bottom-two { position: relative; margin-bottom: -9px; margin-left: 12px; margin-right: 12px; line-height: 18px; text-align: left; vertical-align: middle; } #left-one { position: absolute; width: 100%; buggedheight: 100%; } #left-two { position: relative; margin-top: 12px; line-height: 18px; text-align: center; vertical-align: top; } #right-one { display: table; height: 100%; width: 100%; } #right-two { display: table-row; height: 100%; width: 100%; } #right-three { display: table-cell; width: 100%; vertical-align: bottom; _position: absolute; _top: 100%; } #right-four { text-align: center; margin-bottom: 2ex; _position: relative; _top: -100%; } #more-top { position: absolute; top: 0%; left: 90%; bottom: 90%; right: 0%; z-index: 3; width: 10%; height: 10%; padding: 0%; margin: 0%; border-style: none; border-width: 0; } #more-top-settings { text-align: center; } #more-right-settings { margin-right: 12px; margin-left: 12px; line-height: 18px; font-size: 10px; text-align: center; } #right-safari { _display: table; width: 100%; height: 100%; } + </style> + <style type="text/css"> + </style> + </head> + <body> + <div id="top"> <div id="top-one"> + <div id="top-two">Evohome Fetcher 1.00 </div> + </div> + </div> + <div id="bottom"> <div id="bottom-one"> + <div id="bottom-two">wiki: http://contextgarden.net | mail: ntg-context@ntg.nl | website: http://www.pragma-ade.nl</div> + </div> + </div> + <div id="left"></div> + <div id="right"></div> + <div id="main"> + <div id='main-settings'> + <h1>Command line options</h1> +<table> + <tr><th style="width: 10em">flag</th><th style="width: 8em">value</th><th>description</th></tr> + <tr><th/><td/><td/></tr> + <tr><th>--collect</th><td></td><td>collect data from device</td></tr> + <tr><th>--presets</th><td></td><td>file with authenciation data</td></tr> + <tr><th>--auto</th><td></td><td>fetch temperature data every hour</td></tr> + <tr><th>--port</th><td></td><td>server port when running the service, default: 8068</td></tr> + <tr><th>--host</th><td></td><td>server host when running the service, default: localhost</td></tr> + </table> +<br/> +<h1>Example</h1> +<tt>mtxrun --script evohome --collect --presets=c:/data/develop/domotica/code/evohome-presets.lua</tt> +<br/><tt>mtxrun --script evohome --server --presets=c:/data/develop/domotica/code/evohome-presets.lua</tt> +<br/><br/> </div> + </div> + </body> +</html> diff --git a/doc/context/scripts/mkiv/mtx-evohome.man b/doc/context/scripts/mkiv/mtx-evohome.man new file mode 100644 index 000000000..3c20161dc --- /dev/null +++ b/doc/context/scripts/mkiv/mtx-evohome.man @@ -0,0 +1,39 @@ +.TH "mtx-evohome" "1" "01-01-2018" "version 1.00" "Evohome Fetcher" +.SH NAME +.B mtx-evohome +.SH SYNOPSIS +.B mtxrun --script evohome [ +.I OPTIONS ... +.B ] [ +.I FILENAMES +.B ] +.SH DESCRIPTION +.B Evohome Fetcher +.SH OPTIONS +.TP +.B --collect +collect data from device +.TP +.B --presets +file with authenciation data +.TP +.B --auto +fetch temperature data every hour +.TP +.B --port +server port when running the service, default: 8068 +.TP +.B --host +server host when running the service, default: localhost +.SH AUTHOR +More information about ConTeXt and the tools that come with it can be found at: + + +.B "maillist:" +ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context + +.B "webpage:" +http://www.pragma-ade.nl / http://tex.aanhet.net + +.B "wiki:" +http://contextgarden.net diff --git a/doc/context/scripts/mkiv/mtx-evohome.xml b/doc/context/scripts/mkiv/mtx-evohome.xml new file mode 100644 index 000000000..7224d4183 --- /dev/null +++ b/doc/context/scripts/mkiv/mtx-evohome.xml @@ -0,0 +1,28 @@ +<?xml version="1.0"?> +<application> + <metadata> + <entry name="name">mtx-evohome</entry> + <entry name="detail">Evohome Fetcher</entry> + <entry name="version">1.00</entry> + </metadata> + <flags> + <category name="basic"> + <subcategory> + <flag name="collect"><short>collect data from device</short></flag> + <flag name="presets"><short>file with authenciation data</short></flag> + <flag name="auto"><short>fetch temperature data every hour</short></flag> + <flag name="port"><short>server port when running the service, default: 8068</short></flag> + <flag name="host"><short>server host when running the service, default: localhost</short></flag> + </subcategory> + </category> + </flags> + <examples> + <category> + <title>Example</title> + <subcategory> + <example><command>mtxrun --script evohome --collect --presets=c:/data/develop/domotica/code/evohome-presets.lua</command></example> + <example><command>mtxrun --script evohome --server --presets=c:/data/develop/domotica/code/evohome-presets.lua</command></example> + </subcategory> + </category> + </examples> +</application> diff --git a/doc/context/scripts/mkiv/mtx-fcd.html b/doc/context/scripts/mkiv/mtx-fcd.html index ec928f79d..5b8f44761 100644 --- a/doc/context/scripts/mkiv/mtx-fcd.html +++ b/doc/context/scripts/mkiv/mtx-fcd.html @@ -21,9 +21,9 @@ </style> <style type="text/css"> </style> - </head> - <body> - <div id="top"> <div id="top-one"> + </head> + <body> + <div id="top"> <div id="top-one"> <div id="top-two">Fast Directory Change 1.00 </div> </div> </div> @@ -58,5 +58,5 @@ <br/><tt>fcd --list</tt> <br/><br/> </div> </div> - </body> - </html> + </body> +</html> diff --git a/doc/context/scripts/mkiv/mtx-fcd.man b/doc/context/scripts/mkiv/mtx-fcd.man index c322b55ed..7b668b091 100644 --- a/doc/context/scripts/mkiv/mtx-fcd.man +++ b/doc/context/scripts/mkiv/mtx-fcd.man @@ -1,4 +1,4 @@ -.TH "mtx-fcd" "1" "01-01-2017" "version 1.00" "Fast Directory Change" +.TH "mtx-fcd" "1" "01-01-2018" "version 1.00" "Fast Directory Change" .SH NAME .B mtx-fcd .SH SYNOPSIS diff --git a/doc/context/scripts/mkiv/mtx-flac.html b/doc/context/scripts/mkiv/mtx-flac.html index c4fb4efc4..fd3323477 100644 --- a/doc/context/scripts/mkiv/mtx-flac.html +++ b/doc/context/scripts/mkiv/mtx-flac.html @@ -21,9 +21,9 @@ </style> <style type="text/css"> </style> - </head> - <body> - <div id="top"> <div id="top-one"> + </head> + <body> + <div id="top"> <div id="top-one"> <div id="top-two">ConTeXt Flac Helpers 0.10 </div> </div> </div> @@ -48,5 +48,5 @@ <br/><tt>mtxrun --script flac --collect --pattern="m:/music/**")</tt> <br/><br/> </div> </div> - </body> - </html> + </body> +</html> diff --git a/doc/context/scripts/mkiv/mtx-flac.man b/doc/context/scripts/mkiv/mtx-flac.man index 87aa90dda..02c977d76 100644 --- a/doc/context/scripts/mkiv/mtx-flac.man +++ b/doc/context/scripts/mkiv/mtx-flac.man @@ -1,4 +1,4 @@ -.TH "mtx-flac" "1" "01-01-2017" "version 0.10" "ConTeXt Flac Helpers" +.TH "mtx-flac" "1" "01-01-2018" "version 0.10" "ConTeXt Flac Helpers" .SH NAME .B mtx-flac .SH SYNOPSIS diff --git a/doc/context/scripts/mkiv/mtx-fonts.html b/doc/context/scripts/mkiv/mtx-fonts.html index 43d81015f..b175139c8 100644 --- a/doc/context/scripts/mkiv/mtx-fonts.html +++ b/doc/context/scripts/mkiv/mtx-fonts.html @@ -21,9 +21,9 @@ </style> <style type="text/css"> </style> - </head> - <body> - <div id="top"> <div id="top-one"> + </head> + <body> + <div id="top"> <div id="top-one"> <div id="top-two">ConTeXt Font Database Management 0.21 </div> </div> </div> @@ -39,8 +39,7 @@ <table> <tr><th style="width: 10em">flag</th><th style="width: 8em">value</th><th>description</th></tr> <tr><th/><td/><td/></tr> - <tr><th>--save</th><td></td><td>save open type font in raw table (ff format)</td></tr> - <tr><th>--convert</th><td></td><td>save open type font in raw table (ctx format)</td></tr> + <tr><th>--convert</th><td></td><td>save open type font in raw table</td></tr> <tr><th>--unpack</th><td></td><td>save a tma file in a more readable format</td></tr> <tr><th/><td/><td/></tr> <tr><th>--reload</th><td></td><td>generate new font database (use --force when in doubt)</td></tr> @@ -74,10 +73,9 @@ <br/><tt>mtxrun --script font --list --file somename</tt> <br/><tt>mtxrun --script font --list --file --all somename</tt> <br/><tt>mtxrun --script font --list --file --pattern=*somename*</tt> -<br/><br/><tt>mtxrun --script font --save texgyrepagella-regular.otf</tt> -<br/><tt>mtxrun --script font --convert texgyrepagella-regular.otf</tt> +<br/><br/><tt>mtxrun --script font --convert texgyrepagella-regular.otf</tt> <br/><tt>mtxrun --script font --convert --names texgyrepagella-regular.otf</tt> <br/><br/> </div> </div> - </body> - </html> + </body> +</html> diff --git a/doc/context/scripts/mkiv/mtx-fonts.man b/doc/context/scripts/mkiv/mtx-fonts.man index 1a8d3023b..c27731e33 100644 --- a/doc/context/scripts/mkiv/mtx-fonts.man +++ b/doc/context/scripts/mkiv/mtx-fonts.man @@ -1,4 +1,4 @@ -.TH "mtx-fonts" "1" "01-01-2017" "version 0.21" "ConTeXt Font Database Management" +.TH "mtx-fonts" "1" "01-01-2018" "version 1.00" "ConTeXt Font Database Management" .SH NAME .B mtx-fonts .SH SYNOPSIS @@ -11,11 +11,8 @@ .B ConTeXt Font Database Management .SH OPTIONS .TP -.B --save -save open type font in raw table (ff format) -.TP .B --convert -save open type font in raw table (ctx format) +save open type font in raw table .TP .B --unpack save a tma file in a more readable format diff --git a/doc/context/scripts/mkiv/mtx-fonts.xml b/doc/context/scripts/mkiv/mtx-fonts.xml index 8541c8dfb..d001f4f9a 100644 --- a/doc/context/scripts/mkiv/mtx-fonts.xml +++ b/doc/context/scripts/mkiv/mtx-fonts.xml @@ -3,13 +3,12 @@ <metadata> <entry name="name">mtx-fonts</entry> <entry name="detail">ConTeXt Font Database Management</entry> - <entry name="version">0.21</entry> + <entry name="version">1.00</entry> </metadata> <flags> <category name="basic"> <subcategory> - <flag name="save"><short>save open type font in raw table (ff format)</short></flag> - <flag name="convert"><short>save open type font in raw table (ctx format)</short></flag> + <flag name="convert"><short>save open type font in raw table</short></flag> <flag name="unpack"><short>save a tma file in a more readable format</short></flag> </subcategory> <subcategory> @@ -58,7 +57,6 @@ <example><command>mtxrun --script font --list --file --pattern=*somename*</command></example> </subcategory> <subcategory> - <example><command>mtxrun --script font --save texgyrepagella-regular.otf</command></example> <example><command>mtxrun --script font --convert texgyrepagella-regular.otf</command></example> <example><command>mtxrun --script font --convert --names texgyrepagella-regular.otf</command></example> </subcategory> diff --git a/doc/context/scripts/mkiv/mtx-grep.html b/doc/context/scripts/mkiv/mtx-grep.html index 184ca0df3..10df98cf4 100644 --- a/doc/context/scripts/mkiv/mtx-grep.html +++ b/doc/context/scripts/mkiv/mtx-grep.html @@ -21,9 +21,9 @@ </style> <style type="text/css"> </style> - </head> - <body> - <div id="top"> <div id="top-one"> + </head> + <body> + <div id="top"> <div id="top-one"> <div id="top-two">Simple Grepper 0.10 </div> </div> </div> @@ -57,5 +57,5 @@ <br/><tt>mtxrun --script grep --pattern=module --n=10 *.mkiv</tt> <br/><br/> </div> </div> - </body> - </html> + </body> +</html> diff --git a/doc/context/scripts/mkiv/mtx-grep.man b/doc/context/scripts/mkiv/mtx-grep.man index 3254c904d..19675cc51 100644 --- a/doc/context/scripts/mkiv/mtx-grep.man +++ b/doc/context/scripts/mkiv/mtx-grep.man @@ -1,4 +1,4 @@ -.TH "mtx-grep" "1" "01-01-2017" "version 0.10" "Simple Grepper" +.TH "mtx-grep" "1" "01-01-2018" "version 0.10" "Simple Grepper" .SH NAME .B mtx-grep .SH SYNOPSIS diff --git a/doc/context/scripts/mkiv/mtx-interface.html b/doc/context/scripts/mkiv/mtx-interface.html index 045dea546..4098ccaa2 100644 --- a/doc/context/scripts/mkiv/mtx-interface.html +++ b/doc/context/scripts/mkiv/mtx-interface.html @@ -21,9 +21,9 @@ </style> <style type="text/css"> </style> - </head> - <body> - <div id="top"> <div id="top-one"> + </head> + <body> + <div id="top"> <div id="top-one"> <div id="top-two">ConTeXt Interface Related Goodies 0.13 </div> </div> </div> @@ -50,15 +50,18 @@ <tr><th>--text</th><td></td><td>create text files for commands and environments</td></tr> <tr><th>--raw</th><td></td><td>report commands to the console</td></tr> <tr><th>--check</th><td></td><td>generate check file</td></tr> + <tr><th>--meaning</th><td></td><td>report the mening of commands</td></tr> <tr><th/><td/><td/></tr> <tr><th>--toutf</th><td></td><td>replace named characters by utf</td></tr> <tr><th>--preprocess</th><td></td><td>preprocess mkvi files to tex files [force,suffix]</td></tr> <tr><th/><td/><td/></tr> <tr><th>--suffix</th><td></td><td>use given suffix for output files</td></tr> <tr><th>--force</th><td></td><td>force action even when in doubt</td></tr> + <tr><th/><td/><td/></tr> + <tr><th>--pattern</th><td></td><td>a pattern for meaning lookups</td></tr> </table> <br/> </div> </div> - </body> - </html> + </body> +</html> diff --git a/doc/context/scripts/mkiv/mtx-interface.man b/doc/context/scripts/mkiv/mtx-interface.man index 831b9acc9..2dbba85df 100644 --- a/doc/context/scripts/mkiv/mtx-interface.man +++ b/doc/context/scripts/mkiv/mtx-interface.man @@ -1,4 +1,4 @@ -.TH "mtx-interface" "1" "01-01-2017" "version 0.13" "ConTeXt Interface Related Goodies" +.TH "mtx-interface" "1" "01-01-2018" "version 0.13" "ConTeXt Interface Related Goodies" .SH NAME .B mtx-interface .SH SYNOPSIS @@ -38,6 +38,9 @@ report commands to the console .B --check generate check file .TP +.B --meaning +report the mening of commands +.TP .B --toutf replace named characters by utf .TP @@ -49,6 +52,9 @@ use given suffix for output files .TP .B --force force action even when in doubt +.TP +.B --pattern +a pattern for meaning lookups .SH AUTHOR More information about ConTeXt and the tools that come with it can be found at: diff --git a/doc/context/scripts/mkiv/mtx-interface.xml b/doc/context/scripts/mkiv/mtx-interface.xml index 495154004..5faff8507 100644 --- a/doc/context/scripts/mkiv/mtx-interface.xml +++ b/doc/context/scripts/mkiv/mtx-interface.xml @@ -21,6 +21,7 @@ <flag name="text"><short>create text files for commands and environments</short></flag> <flag name="raw"><short>report commands to the console</short></flag> <flag name="check"><short>generate check file</short></flag> + <flag name="meaning"><short>report the mening of commands</short></flag> </subcategory> <subcategory> <flag name="toutf"><short>replace named characters by utf</short></flag> @@ -30,6 +31,9 @@ <flag name="suffix"><short>use given suffix for output files</short></flag> <flag name="force"><short>force action even when in doubt</short></flag> </subcategory> + <subcategory> + <flag name="pattern"><short>a pattern for meaning lookups</short></flag> + </subcategory> </category> </flags> </application> diff --git a/doc/context/scripts/mkiv/mtx-metapost.html b/doc/context/scripts/mkiv/mtx-metapost.html index 793a411b9..0c0ccef47 100644 --- a/doc/context/scripts/mkiv/mtx-metapost.html +++ b/doc/context/scripts/mkiv/mtx-metapost.html @@ -21,9 +21,9 @@ </style> <style type="text/css"> </style> - </head> - <body> - <div id="top"> <div id="top-one"> + </head> + <body> + <div id="top"> <div id="top-one"> <div id="top-two">MetaPost to PDF processor 0.10 </div> </div> </div> @@ -52,5 +52,5 @@ <br/><tt>mtxrun --script metapost yourfile.123 myfile.mps</tt> <br/><br/> </div> </div> - </body> - </html> + </body> +</html> diff --git a/doc/context/scripts/mkiv/mtx-metapost.man b/doc/context/scripts/mkiv/mtx-metapost.man index 66f178287..e8e7b465e 100644 --- a/doc/context/scripts/mkiv/mtx-metapost.man +++ b/doc/context/scripts/mkiv/mtx-metapost.man @@ -1,4 +1,4 @@ -.TH "mtx-metapost" "1" "01-01-2017" "version 0.10" "MetaPost to PDF processor" +.TH "mtx-metapost" "1" "01-01-2018" "version 0.10" "MetaPost to PDF processor" .SH NAME .B mtx-metapost .SH SYNOPSIS diff --git a/doc/context/scripts/mkiv/mtx-metatex.html b/doc/context/scripts/mkiv/mtx-metatex.html index 0bdc78987..18866c0d0 100644 --- a/doc/context/scripts/mkiv/mtx-metatex.html +++ b/doc/context/scripts/mkiv/mtx-metatex.html @@ -21,9 +21,9 @@ </style> <style type="text/css"> </style> - </head> - <body> - <div id="top"> <div id="top-one"> + </head> + <body> + <div id="top"> <div id="top-one"> <div id="top-two">MetaTeX Process Management 0.10 </div> </div> </div> @@ -45,5 +45,5 @@ <br/> </div> </div> - </body> - </html> + </body> +</html> diff --git a/doc/context/scripts/mkiv/mtx-metatex.man b/doc/context/scripts/mkiv/mtx-metatex.man index 1ff5ec367..fd45e312f 100644 --- a/doc/context/scripts/mkiv/mtx-metatex.man +++ b/doc/context/scripts/mkiv/mtx-metatex.man @@ -1,4 +1,4 @@ -.TH "mtx-metatex" "1" "01-01-2017" "version 0.10" "MetaTeX Process Management" +.TH "mtx-metatex" "1" "01-01-2018" "version 0.10" "MetaTeX Process Management" .SH NAME .B mtx-metatex .SH SYNOPSIS diff --git a/doc/context/scripts/mkiv/mtx-modules.html b/doc/context/scripts/mkiv/mtx-modules.html index 8278c1aca..279b728b0 100644 --- a/doc/context/scripts/mkiv/mtx-modules.html +++ b/doc/context/scripts/mkiv/mtx-modules.html @@ -21,9 +21,9 @@ </style> <style type="text/css"> </style> - </head> - <body> - <div id="top"> <div id="top-one"> + </head> + <body> + <div id="top"> <div id="top-one"> <div id="top-two">ConTeXt Module Documentation Generators 1.00 </div> </div> </div> @@ -42,9 +42,10 @@ <tr><th>--convert</th><td></td><td>convert source files (tex, mkii, mkiv, mp) to 'ted' files</td></tr> <tr><th>--process</th><td></td><td>process source files (tex, mkii, mkiv, mp) to 'pdf' files</td></tr> <tr><th>--prep</th><td></td><td>use original name with suffix 'prep' appended</td></tr> + <tr><th>--direct</th><td></td><td>use old method instead of extra</td></tr> </table> <br/> </div> </div> - </body> - </html> + </body> +</html> diff --git a/doc/context/scripts/mkiv/mtx-modules.man b/doc/context/scripts/mkiv/mtx-modules.man index 0455d83c9..2ca40f90f 100644 --- a/doc/context/scripts/mkiv/mtx-modules.man +++ b/doc/context/scripts/mkiv/mtx-modules.man @@ -1,4 +1,4 @@ -.TH "mtx-modules" "1" "01-01-2017" "version 1.00" "ConTeXt Module Documentation Generators" +.TH "mtx-modules" "1" "01-01-2018" "version 1.00" "ConTeXt Module Documentation Generators" .SH NAME .B mtx-modules .SH SYNOPSIS @@ -19,6 +19,9 @@ process source files (tex, mkii, mkiv, mp) to 'pdf' files .TP .B --prep use original name with suffix 'prep' appended +.TP +.B --direct +use old method instead of extra .SH AUTHOR More information about ConTeXt and the tools that come with it can be found at: diff --git a/doc/context/scripts/mkiv/mtx-modules.xml b/doc/context/scripts/mkiv/mtx-modules.xml index fe0311d16..4016c8158 100644 --- a/doc/context/scripts/mkiv/mtx-modules.xml +++ b/doc/context/scripts/mkiv/mtx-modules.xml @@ -11,6 +11,7 @@ <flag name="convert"><short>convert source files (tex, mkii, mkiv, mp) to 'ted' files</short></flag> <flag name="process"><short>process source files (tex, mkii, mkiv, mp) to 'pdf' files</short></flag> <flag name="prep"><short>use original name with suffix 'prep' appended</short></flag> + <flag name="direct"><short>use old method instead of extra</short></flag> </subcategory> </category> </flags> diff --git a/doc/context/scripts/mkiv/mtx-package.html b/doc/context/scripts/mkiv/mtx-package.html index 3ebf5c5be..e2682a8c6 100644 --- a/doc/context/scripts/mkiv/mtx-package.html +++ b/doc/context/scripts/mkiv/mtx-package.html @@ -21,9 +21,9 @@ </style> <style type="text/css"> </style> - </head> - <body> - <div id="top"> <div id="top-one"> + </head> + <body> + <div id="top"> <div id="top-one"> <div id="top-two">Distribution Related Goodies 0.10 </div> </div> </div> @@ -44,5 +44,5 @@ <br/> </div> </div> - </body> - </html> + </body> +</html> diff --git a/doc/context/scripts/mkiv/mtx-package.man b/doc/context/scripts/mkiv/mtx-package.man index 2ff4a165a..958e4a975 100644 --- a/doc/context/scripts/mkiv/mtx-package.man +++ b/doc/context/scripts/mkiv/mtx-package.man @@ -1,4 +1,4 @@ -.TH "mtx-package" "1" "01-01-2017" "version 0.10" "Distribution Related Goodies" +.TH "mtx-package" "1" "01-01-2018" "version 0.10" "Distribution Related Goodies" .SH NAME .B mtx-package .SH SYNOPSIS diff --git a/doc/context/scripts/mkiv/mtx-patterns.html b/doc/context/scripts/mkiv/mtx-patterns.html index 8aa378298..7d5da995d 100644 --- a/doc/context/scripts/mkiv/mtx-patterns.html +++ b/doc/context/scripts/mkiv/mtx-patterns.html @@ -21,9 +21,9 @@ </style> <style type="text/css"> </style> - </head> - <body> - <div id="top"> <div id="top-one"> + </head> + <body> + <div id="top"> <div id="top-one"> <div id="top-two">ConTeXt Pattern File Management 0.20 </div> </div> </div> @@ -57,5 +57,5 @@ <br/><tt>mtxrun --script pattern --hyphenate --language=nl --left=3 nogalwiedes inderdaad</tt> <br/><br/> </div> </div> - </body> - </html> + </body> +</html> diff --git a/doc/context/scripts/mkiv/mtx-patterns.man b/doc/context/scripts/mkiv/mtx-patterns.man index c962da2e8..1b7906b23 100644 --- a/doc/context/scripts/mkiv/mtx-patterns.man +++ b/doc/context/scripts/mkiv/mtx-patterns.man @@ -1,4 +1,4 @@ -.TH "mtx-patterns" "1" "01-01-2017" "version 0.20" "ConTeXt Pattern File Management" +.TH "mtx-patterns" "1" "01-01-2018" "version 0.20" "ConTeXt Pattern File Management" .SH NAME .B mtx-patterns .SH SYNOPSIS diff --git a/doc/context/scripts/mkiv/mtx-pdf.html b/doc/context/scripts/mkiv/mtx-pdf.html index e2961d94d..b156c154e 100644 --- a/doc/context/scripts/mkiv/mtx-pdf.html +++ b/doc/context/scripts/mkiv/mtx-pdf.html @@ -21,9 +21,9 @@ </style> <style type="text/css"> </style> - </head> - <body> - <div id="top"> <div id="top-one"> + </head> + <body> + <div id="top"> <div id="top-one"> <div id="top-two">ConTeXt PDF Helpers 0.10 </div> </div> </div> @@ -47,5 +47,5 @@ <br/> </div> </div> - </body> - </html> + </body> +</html> diff --git a/doc/context/scripts/mkiv/mtx-pdf.man b/doc/context/scripts/mkiv/mtx-pdf.man index fa702b86c..30aacc03a 100644 --- a/doc/context/scripts/mkiv/mtx-pdf.man +++ b/doc/context/scripts/mkiv/mtx-pdf.man @@ -1,4 +1,4 @@ -.TH "mtx-pdf" "1" "01-01-2017" "version 0.10" "ConTeXt PDF Helpers" +.TH "mtx-pdf" "1" "01-01-2018" "version 0.10" "ConTeXt PDF Helpers" .SH NAME .B mtx-pdf .SH SYNOPSIS diff --git a/doc/context/scripts/mkiv/mtx-plain.html b/doc/context/scripts/mkiv/mtx-plain.html index 2ceda35e7..e634dfe36 100644 --- a/doc/context/scripts/mkiv/mtx-plain.html +++ b/doc/context/scripts/mkiv/mtx-plain.html @@ -21,9 +21,9 @@ </style> <style type="text/css"> </style> - </head> - <body> - <div id="top"> <div id="top-one"> + </head> + <body> + <div id="top"> <div id="top-one"> <div id="top-two">Plain TeX Runner 1.00 </div> </div> </div> @@ -49,5 +49,5 @@ <br/> </div> </div> - </body> - </html> + </body> +</html> diff --git a/doc/context/scripts/mkiv/mtx-plain.man b/doc/context/scripts/mkiv/mtx-plain.man index 73c1a9377..fbdf301f7 100644 --- a/doc/context/scripts/mkiv/mtx-plain.man +++ b/doc/context/scripts/mkiv/mtx-plain.man @@ -1,4 +1,4 @@ -.TH "mtx-plain" "1" "01-01-2017" "version 1.00" "Plain TeX Runner" +.TH "mtx-plain" "1" "01-01-2018" "version 1.00" "Plain TeX Runner" .SH NAME .B mtx-plain .SH SYNOPSIS diff --git a/doc/context/scripts/mkiv/mtx-profile.html b/doc/context/scripts/mkiv/mtx-profile.html index 50ac0c42e..e049d3417 100644 --- a/doc/context/scripts/mkiv/mtx-profile.html +++ b/doc/context/scripts/mkiv/mtx-profile.html @@ -21,9 +21,9 @@ </style> <style type="text/css"> </style> - </head> - <body> - <div id="top"> <div id="top-one"> + </head> + <body> + <div id="top"> <div id="top-one"> <div id="top-two">ConTeXt MkIV LuaTeX Profiler 1.00 </div> </div> </div> @@ -45,5 +45,5 @@ <br/> </div> </div> - </body> - </html> + </body> +</html> diff --git a/doc/context/scripts/mkiv/mtx-profile.man b/doc/context/scripts/mkiv/mtx-profile.man index 862afe5fb..fefc60e74 100644 --- a/doc/context/scripts/mkiv/mtx-profile.man +++ b/doc/context/scripts/mkiv/mtx-profile.man @@ -1,4 +1,4 @@ -.TH "mtx-profile" "1" "01-01-2017" "version 1.00" "ConTeXt MkIV LuaTeX Profiler" +.TH "mtx-profile" "1" "01-01-2018" "version 1.00" "ConTeXt MkIV LuaTeX Profiler" .SH NAME .B mtx-profile .SH SYNOPSIS diff --git a/doc/context/scripts/mkiv/mtx-rsync.html b/doc/context/scripts/mkiv/mtx-rsync.html index 5a55fcbe5..c760fcba6 100644 --- a/doc/context/scripts/mkiv/mtx-rsync.html +++ b/doc/context/scripts/mkiv/mtx-rsync.html @@ -21,9 +21,9 @@ </style> <style type="text/css"> </style> - </head> - <body> - <div id="top"> <div id="top-one"> + </head> + <body> + <div id="top"> <div id="top-one"> <div id="top-two">Rsync Helpers 0.10 </div> </div> </div> @@ -46,5 +46,5 @@ <br/> </div> </div> - </body> - </html> + </body> +</html> diff --git a/doc/context/scripts/mkiv/mtx-rsync.man b/doc/context/scripts/mkiv/mtx-rsync.man index 13c838fd7..6b7e6e8bc 100644 --- a/doc/context/scripts/mkiv/mtx-rsync.man +++ b/doc/context/scripts/mkiv/mtx-rsync.man @@ -1,4 +1,4 @@ -.TH "mtx-rsync" "1" "01-01-2017" "version 0.10" "Rsync Helpers" +.TH "mtx-rsync" "1" "01-01-2018" "version 0.10" "Rsync Helpers" .SH NAME .B mtx-rsync .SH SYNOPSIS diff --git a/doc/context/scripts/mkiv/mtx-scite.html b/doc/context/scripts/mkiv/mtx-scite.html index 3b540fa81..497098f9e 100644 --- a/doc/context/scripts/mkiv/mtx-scite.html +++ b/doc/context/scripts/mkiv/mtx-scite.html @@ -21,9 +21,9 @@ </style> <style type="text/css"> </style> - </head> - <body> - <div id="top"> <div id="top-one"> + </head> + <body> + <div id="top"> <div id="top-one"> <div id="top-two">Scite Helper Script 1.00 </div> </div> </div> @@ -46,5 +46,5 @@ <br/> </div> </div> - </body> - </html> + </body> +</html> diff --git a/doc/context/scripts/mkiv/mtx-scite.man b/doc/context/scripts/mkiv/mtx-scite.man index 4911790f2..58733624d 100644 --- a/doc/context/scripts/mkiv/mtx-scite.man +++ b/doc/context/scripts/mkiv/mtx-scite.man @@ -1,4 +1,4 @@ -.TH "mtx-scite" "1" "01-01-2017" "version 1.00" "Scite Helper Script" +.TH "mtx-scite" "1" "01-01-2018" "version 1.00" "Scite Helper Script" .SH NAME .B mtx-scite .SH SYNOPSIS diff --git a/doc/context/scripts/mkiv/mtx-server.html b/doc/context/scripts/mkiv/mtx-server.html index 01cf1cdf7..733bc3d49 100644 --- a/doc/context/scripts/mkiv/mtx-server.html +++ b/doc/context/scripts/mkiv/mtx-server.html @@ -21,9 +21,9 @@ </style> <style type="text/css"> </style> - </head> - <body> - <div id="top"> <div id="top-one"> + </head> + <body> + <div id="top"> <div id="top-one"> <div id="top-two">Simple Webserver For Helpers 0.10 </div> </div> </div> @@ -49,5 +49,5 @@ <br/> </div> </div> - </body> - </html> + </body> +</html> diff --git a/doc/context/scripts/mkiv/mtx-server.man b/doc/context/scripts/mkiv/mtx-server.man index 5dec932e3..dfda87e71 100644 --- a/doc/context/scripts/mkiv/mtx-server.man +++ b/doc/context/scripts/mkiv/mtx-server.man @@ -1,4 +1,4 @@ -.TH "mtx-server" "1" "01-01-2017" "version 0.10" "Simple Webserver For Helpers" +.TH "mtx-server" "1" "01-01-2018" "version 0.10" "Simple Webserver For Helpers" .SH NAME .B mtx-server .SH SYNOPSIS diff --git a/doc/context/scripts/mkiv/mtx-texworks.html b/doc/context/scripts/mkiv/mtx-texworks.html index 5de6a748f..677420926 100644 --- a/doc/context/scripts/mkiv/mtx-texworks.html +++ b/doc/context/scripts/mkiv/mtx-texworks.html @@ -21,9 +21,9 @@ </style> <style type="text/css"> </style> - </head> - <body> - <div id="top"> <div id="top-one"> + </head> + <body> + <div id="top"> <div id="top-one"> <div id="top-two">TeXworks Startup Script 1.00 </div> </div> </div> @@ -45,5 +45,5 @@ <br/> </div> </div> - </body> - </html> + </body> +</html> diff --git a/doc/context/scripts/mkiv/mtx-texworks.man b/doc/context/scripts/mkiv/mtx-texworks.man index e475dc10e..1e29cb7db 100644 --- a/doc/context/scripts/mkiv/mtx-texworks.man +++ b/doc/context/scripts/mkiv/mtx-texworks.man @@ -1,4 +1,4 @@ -.TH "mtx-texworks" "1" "01-01-2017" "version 1.00" "TeXworks Startup Script" +.TH "mtx-texworks" "1" "01-01-2018" "version 1.00" "TeXworks Startup Script" .SH NAME .B mtx-texworks .SH SYNOPSIS diff --git a/doc/context/scripts/mkiv/mtx-timing.html b/doc/context/scripts/mkiv/mtx-timing.html index 1da0e6439..54598c8ca 100644 --- a/doc/context/scripts/mkiv/mtx-timing.html +++ b/doc/context/scripts/mkiv/mtx-timing.html @@ -21,9 +21,9 @@ </style> <style type="text/css"> </style> - </head> - <body> - <div id="top"> <div id="top-one"> + </head> + <body> + <div id="top"> <div id="top-one"> <div id="top-two">ConTeXt Timing Tools 0.10 </div> </div> </div> @@ -46,5 +46,5 @@ <br/> </div> </div> - </body> - </html> + </body> +</html> diff --git a/doc/context/scripts/mkiv/mtx-timing.man b/doc/context/scripts/mkiv/mtx-timing.man index 3a9f76a5e..785c40d78 100644 --- a/doc/context/scripts/mkiv/mtx-timing.man +++ b/doc/context/scripts/mkiv/mtx-timing.man @@ -1,4 +1,4 @@ -.TH "mtx-timing" "1" "01-01-2017" "version 0.10" "ConTeXt Timing Tools" +.TH "mtx-timing" "1" "01-01-2018" "version 0.10" "ConTeXt Timing Tools" .SH NAME .B mtx-timing .SH SYNOPSIS diff --git a/doc/context/scripts/mkiv/mtx-tools.html b/doc/context/scripts/mkiv/mtx-tools.html index 0cb6d6de3..a1031c43e 100644 --- a/doc/context/scripts/mkiv/mtx-tools.html +++ b/doc/context/scripts/mkiv/mtx-tools.html @@ -21,9 +21,9 @@ </style> <style type="text/css"> </style> - </head> - <body> - <div id="top"> <div id="top-one"> + </head> + <body> + <div id="top"> <div id="top-one"> <div id="top-two">Some File Related Goodies 1.01 </div> </div> </div> @@ -52,6 +52,9 @@ <tr><th>--longname</th><td></td><td>set name attributes to full path name</td></tr> <tr><th>--downcase</th><td></td><td>lowercase names</td></tr> <tr><th/><td/><td/></tr> + <tr><th>--showstring</th><td></td><td>show unicode characters in given string</td></tr> + <tr><th>--showfile</th><td></td><td>show unicode characters in given file</td></tr> + <tr><th/><td/><td/></tr> <tr><th>--pattern</th><td></td><td>glob pattern (default: *)</td></tr> <tr><th>--recurse</th><td></td><td>recurse into subdirecories</td></tr> <tr><th>--force</th><td></td><td>downcase indeed</td></tr> @@ -59,5 +62,5 @@ <br/> </div> </div> - </body> - </html> + </body> +</html> diff --git a/doc/context/scripts/mkiv/mtx-tools.man b/doc/context/scripts/mkiv/mtx-tools.man index adebb7202..d3a92138d 100644 --- a/doc/context/scripts/mkiv/mtx-tools.man +++ b/doc/context/scripts/mkiv/mtx-tools.man @@ -1,4 +1,4 @@ -.TH "mtx-tools" "1" "01-01-2017" "version 1.01" "Some File Related Goodies" +.TH "mtx-tools" "1" "01-01-2018" "version 1.01" "Some File Related Goodies" .SH NAME .B mtx-tools .SH SYNOPSIS @@ -44,6 +44,12 @@ set name attributes to full path name .B --downcase lowercase names .TP +.B --showstring +show unicode characters in given string +.TP +.B --showfile +show unicode characters in given file +.TP .B --pattern glob pattern (default: *) .TP diff --git a/doc/context/scripts/mkiv/mtx-tools.xml b/doc/context/scripts/mkiv/mtx-tools.xml index ec699a6b2..a578f0591 100644 --- a/doc/context/scripts/mkiv/mtx-tools.xml +++ b/doc/context/scripts/mkiv/mtx-tools.xml @@ -23,6 +23,10 @@ <flag name="downcase"><short>lowercase names</short></flag> </subcategory> <subcategory> + <flag name="showstring"><short>show unicode characters in given string</short></flag> + <flag name="showfile"><short>show unicode characters in given file</short></flag> + </subcategory> + <subcategory> <flag name="pattern"><short>glob pattern (default: *)</short></flag> <flag name="recurse"><short>recurse into subdirecories</short></flag> <flag name="force"><short>downcase indeed</short></flag> diff --git a/doc/context/scripts/mkiv/mtx-unicode.html b/doc/context/scripts/mkiv/mtx-unicode.html index 6c0729e0e..9302e26de 100644 --- a/doc/context/scripts/mkiv/mtx-unicode.html +++ b/doc/context/scripts/mkiv/mtx-unicode.html @@ -21,9 +21,9 @@ </style> <style type="text/css"> </style> - </head> - <body> - <div id="top"> <div id="top-one"> + </head> + <body> + <div id="top"> <div id="top-one"> <div id="top-two">Checker for char-def.lua 1.02 </div> </div> </div> @@ -44,5 +44,5 @@ <br/> </div> </div> - </body> - </html> + </body> +</html> diff --git a/doc/context/scripts/mkiv/mtx-unicode.man b/doc/context/scripts/mkiv/mtx-unicode.man index 3d9ec0785..a4665374f 100644 --- a/doc/context/scripts/mkiv/mtx-unicode.man +++ b/doc/context/scripts/mkiv/mtx-unicode.man @@ -1,4 +1,4 @@ -.TH "mtx-unicode" "1" "01-01-2017" "version 1.02" "Checker for char-dat.lua" +.TH "mtx-unicode" "1" "01-01-2018" "version 1.02" "Checker for char-dat.lua" .SH NAME .B mtx-unicode .SH SYNOPSIS diff --git a/doc/context/scripts/mkiv/mtx-unzip.html b/doc/context/scripts/mkiv/mtx-unzip.html index 885599f8f..655c1be8d 100644 --- a/doc/context/scripts/mkiv/mtx-unzip.html +++ b/doc/context/scripts/mkiv/mtx-unzip.html @@ -21,9 +21,9 @@ </style> <style type="text/css"> </style> - </head> - <body> - <div id="top"> <div id="top-one"> + </head> + <body> + <div id="top"> <div id="top-one"> <div id="top-two">Simple Unzipper 0.10 </div> </div> </div> @@ -46,5 +46,5 @@ <br/> </div> </div> - </body> - </html> + </body> +</html> diff --git a/doc/context/scripts/mkiv/mtx-unzip.man b/doc/context/scripts/mkiv/mtx-unzip.man index d6e3ded10..f2a382ad1 100644 --- a/doc/context/scripts/mkiv/mtx-unzip.man +++ b/doc/context/scripts/mkiv/mtx-unzip.man @@ -1,4 +1,4 @@ -.TH "mtx-unzip" "1" "01-01-2017" "version 0.10" "Simple Unzipper" +.TH "mtx-unzip" "1" "01-01-2018" "version 0.10" "Simple Unzipper" .SH NAME .B mtx-unzip .SH SYNOPSIS diff --git a/doc/context/scripts/mkiv/mtx-update.html b/doc/context/scripts/mkiv/mtx-update.html index 577453246..ed7363ca0 100644 --- a/doc/context/scripts/mkiv/mtx-update.html +++ b/doc/context/scripts/mkiv/mtx-update.html @@ -14,17 +14,17 @@ <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> <head> - <title>ConTeXt Minimals Updater 1.02</title> + <title>ConTeXt Minimals Updater 1.03</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <style type="text/css"> body { color: #FFFFFF; background-color: #808080; font-family: optima, verdana, futura, "lucida sans", arial, geneva, helvetica, sans; font-size: 12px; line-height: 18px; } a:link, a:active, a:visited { color: #FFFFFF; } a.dir-view:link, a.dir-view:active, a.dir-view:visited { color: #FFFFFF; text-decoration: underline; } .valid { color: #00FF00; } .invalid { color: #FF0000; } .invisible { visibility: hidden; } button, .commonlink, .smallbutton { font-weight: bold; font-size: 12px; text-decoration: none; color: #000000; border-color: #7F7F7F; border-style: solid; border-width: .125ex; background-color: #FFFFFF; padding: .5ex; } .smallbutton { width: 1em; } a.commonlink:link, a.commonlink:active, a.commonlink:visited, a.smalllink:link, a.smalllink:active, a.smalllink:visited { font-weight: bold; font-size: 12px; text-decoration: none; color: #000000; } h1, .title { font-style: normal; font-weight: normal; font-size: 18px; line-height: 18px; margin-bottom: 20px; } h2, .subtitle { font-style: normal; font-weight: normal; font-size: 12px; margin-top: 18px; margin-bottom: 18px; } table { line-height: 18px; font-size: 12px; margin: 0; } th { font-weight: bold; text-align: left; padding-bottom: 6px; } .tc { font-weight: bold; text-align: left; } p, li { max-width: 60em; } .empty-line { margin-top: 4px; } .more-room { margin-right: 1.5em; } .much-more-room { margin-right: 3em; } #main { position: absolute; left: 10%; top: 10%; right: 10%; bottom: 10%; z-index: 2; width: 80%; height: 80%; padding: 0%; margin: 0%; overflow: auto; border-style: none; border-width: 0; background-color: #3F3F3F; } #main-settings { margin: 12px; x_max-width: 60em; line-height: 18px; font-size: 12px; } #left { position: absolute; top : 10%; left: 0%; bottom: 0%; right: 90%; z-index: 1; width: 10%; height: 90%; padding: 0%; margin: 0%; font-size: 16px; border-style: none; border-width: 0; background-color: #4F6F6F; } #right { position: absolute; top : 0%; left: 90%; bottom: 10%; right: 0%; z-index: 1; width: 10%; height: 90%; padding: 0%; margin: 0%; font-size: 16px; border-style: none; border-width: 0; background-color: #4F6F6F; _margin-left: -15px; } #bottom { position: absolute; left: 10%; right: 0%; top: 90%; bottom: 0%; z-index: 1; width: 90%; height: 10%; padding: 0%; margin: 0%; font-size: 16px; border-style: none; border-width: 0; background-color: #6F6F8F; } #top { position: absolute; left: 0%; right: 10%; top: 0%; bottom: 90%; z-index: 1; width: 90%; height: 10%; padding: 0%; margin: 0%; font-size: 16px; border-style: none; border-width: 0; background-color: #6F6F8F; } #top-one { position: absolute; bottom: 50%; width: 100%; buggedheight: 100%; } #top-two { position: relative; margin-bottom: -9px; margin-left: 12px; margin-right: 12px; line-height: 18px; text-align: right; vertical-align: middle; } #bottom-one { position: absolute; bottom: 50%; width: 100%; buggedheight: 100%; } #bottom-two { position: relative; margin-bottom: -9px; margin-left: 12px; margin-right: 12px; line-height: 18px; text-align: left; vertical-align: middle; } #left-one { position: absolute; width: 100%; buggedheight: 100%; } #left-two { position: relative; margin-top: 12px; line-height: 18px; text-align: center; vertical-align: top; } #right-one { display: table; height: 100%; width: 100%; } #right-two { display: table-row; height: 100%; width: 100%; } #right-three { display: table-cell; width: 100%; vertical-align: bottom; _position: absolute; _top: 100%; } #right-four { text-align: center; margin-bottom: 2ex; _position: relative; _top: -100%; } #more-top { position: absolute; top: 0%; left: 90%; bottom: 90%; right: 0%; z-index: 3; width: 10%; height: 10%; padding: 0%; margin: 0%; border-style: none; border-width: 0; } #more-top-settings { text-align: center; } #more-right-settings { margin-right: 12px; margin-left: 12px; line-height: 18px; font-size: 10px; text-align: center; } #right-safari { _display: table; width: 100%; height: 100%; } </style> <style type="text/css"> </style> - </head> - <body> - <div id="top"> <div id="top-one"> - <div id="top-two">ConTeXt Minimals Updater 1.02 </div> + </head> + <body> + <div id="top"> <div id="top-one"> + <div id="top-two">ConTeXt Minimals Updater 1.03 </div> </div> </div> <div id="bottom"> <div id="bottom-one"> @@ -62,5 +62,5 @@ <br/> </div> </div> - </body> - </html> + </body> +</html> diff --git a/doc/context/scripts/mkiv/mtx-update.man b/doc/context/scripts/mkiv/mtx-update.man index 5e1313aa6..79743d7d5 100644 --- a/doc/context/scripts/mkiv/mtx-update.man +++ b/doc/context/scripts/mkiv/mtx-update.man @@ -1,4 +1,4 @@ -.TH "mtx-update" "1" "01-01-2017" "version 1.02" "ConTeXt Minimals Updater" +.TH "mtx-update" "1" "01-01-2018" "version 1.03" "ConTeXt Minimals Updater" .SH NAME .B mtx-update .SH SYNOPSIS diff --git a/doc/context/scripts/mkiv/mtx-update.xml b/doc/context/scripts/mkiv/mtx-update.xml index 00be476fb..818b994fd 100644 --- a/doc/context/scripts/mkiv/mtx-update.xml +++ b/doc/context/scripts/mkiv/mtx-update.xml @@ -3,7 +3,7 @@ <metadata> <entry name="name">mtx-update</entry> <entry name="detail">ConTeXt Minimals Updater</entry> - <entry name="version">1.02</entry> + <entry name="version">1.03</entry> </metadata> <flags> <category name="basic"> diff --git a/doc/context/scripts/mkiv/mtx-watch.html b/doc/context/scripts/mkiv/mtx-watch.html index 1f0e49bb4..cb24b18d6 100644 --- a/doc/context/scripts/mkiv/mtx-watch.html +++ b/doc/context/scripts/mkiv/mtx-watch.html @@ -21,9 +21,9 @@ </style> <style type="text/css"> </style> - </head> - <body> - <div id="top"> <div id="top-one"> + </head> + <body> + <div id="top"> <div id="top-one"> <div id="top-two">ConTeXt Request Watchdog 1.00 </div> </div> </div> @@ -51,5 +51,5 @@ <br/> </div> </div> - </body> - </html> + </body> +</html> diff --git a/doc/context/scripts/mkiv/mtx-watch.man b/doc/context/scripts/mkiv/mtx-watch.man index acb5ff22d..82dccbb8e 100644 --- a/doc/context/scripts/mkiv/mtx-watch.man +++ b/doc/context/scripts/mkiv/mtx-watch.man @@ -1,4 +1,4 @@ -.TH "mtx-watch" "1" "01-01-2017" "version 1.00" "ConTeXt Request Watchdog" +.TH "mtx-watch" "1" "01-01-2018" "version 1.00" "ConTeXt Request Watchdog" .SH NAME .B mtx-watch .SH SYNOPSIS diff --git a/doc/context/scripts/mkiv/mtx-youless.html b/doc/context/scripts/mkiv/mtx-youless.html index 6edb3fee6..a95170344 100644 --- a/doc/context/scripts/mkiv/mtx-youless.html +++ b/doc/context/scripts/mkiv/mtx-youless.html @@ -14,17 +14,17 @@ <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> <head> - <title>YouLess Fetcher 1.00</title> + <title>YouLess Fetcher 1.100</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <style type="text/css"> body { color: #FFFFFF; background-color: #808080; font-family: optima, verdana, futura, "lucida sans", arial, geneva, helvetica, sans; font-size: 12px; line-height: 18px; } a:link, a:active, a:visited { color: #FFFFFF; } a.dir-view:link, a.dir-view:active, a.dir-view:visited { color: #FFFFFF; text-decoration: underline; } .valid { color: #00FF00; } .invalid { color: #FF0000; } .invisible { visibility: hidden; } button, .commonlink, .smallbutton { font-weight: bold; font-size: 12px; text-decoration: none; color: #000000; border-color: #7F7F7F; border-style: solid; border-width: .125ex; background-color: #FFFFFF; padding: .5ex; } .smallbutton { width: 1em; } a.commonlink:link, a.commonlink:active, a.commonlink:visited, a.smalllink:link, a.smalllink:active, a.smalllink:visited { font-weight: bold; font-size: 12px; text-decoration: none; color: #000000; } h1, .title { font-style: normal; font-weight: normal; font-size: 18px; line-height: 18px; margin-bottom: 20px; } h2, .subtitle { font-style: normal; font-weight: normal; font-size: 12px; margin-top: 18px; margin-bottom: 18px; } table { line-height: 18px; font-size: 12px; margin: 0; } th { font-weight: bold; text-align: left; padding-bottom: 6px; } .tc { font-weight: bold; text-align: left; } p, li { max-width: 60em; } .empty-line { margin-top: 4px; } .more-room { margin-right: 1.5em; } .much-more-room { margin-right: 3em; } #main { position: absolute; left: 10%; top: 10%; right: 10%; bottom: 10%; z-index: 2; width: 80%; height: 80%; padding: 0%; margin: 0%; overflow: auto; border-style: none; border-width: 0; background-color: #3F3F3F; } #main-settings { margin: 12px; x_max-width: 60em; line-height: 18px; font-size: 12px; } #left { position: absolute; top : 10%; left: 0%; bottom: 0%; right: 90%; z-index: 1; width: 10%; height: 90%; padding: 0%; margin: 0%; font-size: 16px; border-style: none; border-width: 0; background-color: #4F6F6F; } #right { position: absolute; top : 0%; left: 90%; bottom: 10%; right: 0%; z-index: 1; width: 10%; height: 90%; padding: 0%; margin: 0%; font-size: 16px; border-style: none; border-width: 0; background-color: #4F6F6F; _margin-left: -15px; } #bottom { position: absolute; left: 10%; right: 0%; top: 90%; bottom: 0%; z-index: 1; width: 90%; height: 10%; padding: 0%; margin: 0%; font-size: 16px; border-style: none; border-width: 0; background-color: #6F6F8F; } #top { position: absolute; left: 0%; right: 10%; top: 0%; bottom: 90%; z-index: 1; width: 90%; height: 10%; padding: 0%; margin: 0%; font-size: 16px; border-style: none; border-width: 0; background-color: #6F6F8F; } #top-one { position: absolute; bottom: 50%; width: 100%; buggedheight: 100%; } #top-two { position: relative; margin-bottom: -9px; margin-left: 12px; margin-right: 12px; line-height: 18px; text-align: right; vertical-align: middle; } #bottom-one { position: absolute; bottom: 50%; width: 100%; buggedheight: 100%; } #bottom-two { position: relative; margin-bottom: -9px; margin-left: 12px; margin-right: 12px; line-height: 18px; text-align: left; vertical-align: middle; } #left-one { position: absolute; width: 100%; buggedheight: 100%; } #left-two { position: relative; margin-top: 12px; line-height: 18px; text-align: center; vertical-align: top; } #right-one { display: table; height: 100%; width: 100%; } #right-two { display: table-row; height: 100%; width: 100%; } #right-three { display: table-cell; width: 100%; vertical-align: bottom; _position: absolute; _top: 100%; } #right-four { text-align: center; margin-bottom: 2ex; _position: relative; _top: -100%; } #more-top { position: absolute; top: 0%; left: 90%; bottom: 90%; right: 0%; z-index: 3; width: 10%; height: 10%; padding: 0%; margin: 0%; border-style: none; border-width: 0; } #more-top-settings { text-align: center; } #more-right-settings { margin-right: 12px; margin-left: 12px; line-height: 18px; font-size: 10px; text-align: center; } #right-safari { _display: table; width: 100%; height: 100%; } </style> <style type="text/css"> </style> - </head> - <body> - <div id="top"> <div id="top-one"> - <div id="top-two">YouLess Fetcher 1.00 </div> + </head> + <body> + <div id="top"> <div id="top-one"> + <div id="top-two">YouLess Fetcher 1.100 </div> </div> </div> <div id="bottom"> <div id="bottom-one"> @@ -42,15 +42,19 @@ <tr><th>--collect</th><td></td><td>collect data from device</td></tr> <tr><th>--nobackup</th><td></td><td>don't backup old datafile</td></tr> <tr><th>--nofile</th><td></td><td>don't write data to file (for checking)</td></tr> - <tr><th>--kwh</th><td></td><td>summative kwh data</td></tr> - <tr><th>--watt</th><td></td><td>collected watt data</td></tr> + <tr><th>--electricity</th><td></td><td>collected eletricity data (p)</td></tr> + <tr><th>--gas</th><td></td><td>collected gas data</td></tr> + <tr><th>--pulse</th><td></td><td>collected eletricity data (s)</td></tr> <tr><th>--host</th><td></td><td>ip address of device</td></tr> + <tr><th>--auto</th><td></td><td>fetch (refresh) all data every hour</td></tr> </table> <br/> <h1>Example</h1> -<tt>mtxrun --script youless --collect --host=192.168.2.50 --kwh</tt> -<br/><tt>mtxrun --script youless --collect --host=192.168.2.50 --watt somefile.lua</tt> +<tt>mtxrun --script youless --collect --host=192.168.2.50 --electricity somefile.lua</tt> +<br/><tt>mtxrun --script youless --collect --host=192.168.2.50 --gas somefile.lua</tt> +<br/><tt>mtxrun --script youless --collect --host=192.168.2.50 --pulse somefile.lua</tt> +<br/><tt>mtxrun --script youless --collect --host=192.168.2.50 --auto file-prefix</tt> <br/><br/> </div> </div> - </body> - </html> + </body> +</html> diff --git a/doc/context/scripts/mkiv/mtx-youless.man b/doc/context/scripts/mkiv/mtx-youless.man index b48113381..043edd071 100644 --- a/doc/context/scripts/mkiv/mtx-youless.man +++ b/doc/context/scripts/mkiv/mtx-youless.man @@ -1,4 +1,4 @@ -.TH "mtx-youless" "1" "01-01-2017" "version 1.00" "youless Fetcher" +.TH "mtx-youless" "1" "01-01-2018" "version 1.100" "youless Fetcher" .SH NAME .B mtx-youless .SH SYNOPSIS @@ -20,14 +20,20 @@ don't backup old datafile .B --nofile don't write data to file (for checking) .TP -.B --kwh -summative kwh data +.B --electricity +collected eletricity data (p) .TP -.B --watt -collected watt data +.B --gas +collected gas data +.TP +.B --pulse +collected eletricity data (s) .TP .B --host ip address of device +.TP +.B --auto +fetch (refresh) all data every hour .SH AUTHOR More information about ConTeXt and the tools that come with it can be found at: diff --git a/doc/context/scripts/mkiv/mtx-youless.xml b/doc/context/scripts/mkiv/mtx-youless.xml index cd402c3d0..e4482bb6b 100644 --- a/doc/context/scripts/mkiv/mtx-youless.xml +++ b/doc/context/scripts/mkiv/mtx-youless.xml @@ -3,7 +3,7 @@ <metadata> <entry name="name">mtx-youless</entry> <entry name="detail">youless Fetcher</entry> - <entry name="version">1.00</entry> + <entry name="version">1.100</entry> </metadata> <flags> <category name="basic"> @@ -11,9 +11,11 @@ <flag name="collect"><short>collect data from device</short></flag> <flag name="nobackup"><short>don't backup old datafile</short></flag> <flag name="nofile"><short>don't write data to file (for checking)</short></flag> - <flag name="kwh"><short>summative kwh data</short></flag> - <flag name="watt"><short>collected watt data</short></flag> + <flag name="electricity"><short>collected eletricity data (p)</short></flag> + <flag name="gas"><short>collected gas data</short></flag> + <flag name="pulse"><short>collected eletricity data (s)</short></flag> <flag name="host"><short>ip address of device</short></flag> + <flag name="auto"><short>fetch (refresh) all data every hour</short></flag> </subcategory> </category> </flags> @@ -21,8 +23,10 @@ <category> <title>Example</title> <subcategory> - <example><command>mtxrun --script youless --collect --host=192.168.2.50 --kwh</command></example> - <example><command>mtxrun --script youless --collect --host=192.168.2.50 --watt somefile.lua</command></example> + <example><command>mtxrun --script youless --collect --host=192.168.2.50 --electricity somefile.lua</command></example> + <example><command>mtxrun --script youless --collect --host=192.168.2.50 --gas somefile.lua</command></example> + <example><command>mtxrun --script youless --collect --host=192.168.2.50 --pulse somefile.lua</command></example> + <example><command>mtxrun --script youless --collect --host=192.168.2.50 --auto file-prefix</command></example> </subcategory> </category> </examples> diff --git a/doc/context/scripts/mkiv/mtxrun.html b/doc/context/scripts/mkiv/mtxrun.html index 8b6155041..3df54da6e 100644 --- a/doc/context/scripts/mkiv/mtxrun.html +++ b/doc/context/scripts/mkiv/mtxrun.html @@ -21,9 +21,9 @@ </style> <style type="text/css"> </style> - </head> - <body> - <div id="top"> <div id="top-one"> + </head> + <body> + <div id="top"> <div id="top-one"> <div id="top-two">ConTeXt TDS Runner Tool 1.32 </div> </div> </div> @@ -99,5 +99,5 @@ <br/> </div> </div> - </body> - </html> + </body> +</html> diff --git a/doc/context/scripts/mkiv/mtxrun.man b/doc/context/scripts/mkiv/mtxrun.man index 5ddb5f6b2..fdff5103c 100644 --- a/doc/context/scripts/mkiv/mtxrun.man +++ b/doc/context/scripts/mkiv/mtxrun.man @@ -1,4 +1,4 @@ -.TH "mtxrun" "1" "01-01-2017" "version 1.32" "ConTeXt TDS Runner Tool" +.TH "mtxrun" "1" "01-01-2018" "version 1.33" "ConTeXt TDS Runner Tool" .SH NAME .B mtxrun .SH SYNOPSIS diff --git a/doc/context/scripts/mkiv/mtxrun.xml b/doc/context/scripts/mkiv/mtxrun.xml index 25f58545f..d307239c3 100644 --- a/doc/context/scripts/mkiv/mtxrun.xml +++ b/doc/context/scripts/mkiv/mtxrun.xml @@ -3,7 +3,7 @@ <metadata> <entry name="name">mtxrun</entry> <entry name="detail">ConTeXt TDS Runner Tool</entry> - <entry name="version">1.32</entry> + <entry name="version">1.33</entry> </metadata> <flags> <category name="basic"> diff --git a/doc/context/sources/general/fonts/fonts/fonts-appendix.tex b/doc/context/sources/general/fonts/fonts/fonts-appendix.tex index ae42b10fa..2eab26a93 100644 --- a/doc/context/sources/general/fonts/fonts/fonts-appendix.tex +++ b/doc/context/sources/general/fonts/fonts/fonts-appendix.tex @@ -456,7 +456,7 @@ to render this version. Because fonts might have changed in the meantime, some e might come out other than intended. \startluacode -local list = table.load("fonts-mkiv-usedfonts.lua") +local list = table.load("fonts-mkiv-usedfonts.lua") or { } local NC, NR = context.NC, context.NR @@ -473,7 +473,6 @@ for i=1,#list do NC() context("version") NC() context.type(version) NC() NR() context.stoptabulate() end - \stopluacode \stopsection diff --git a/doc/context/sources/general/fonts/fonts/fonts-environment.tex b/doc/context/sources/general/fonts/fonts/fonts-environment.tex index a8de89a42..c884d97e5 100644 --- a/doc/context/sources/general/fonts/fonts/fonts-environment.tex +++ b/doc/context/sources/general/fonts/fonts/fonts-environment.tex @@ -1,6 +1,46 @@ \startenvironment fonts-environment - \blockligatures[fi,fl,ff] % we need to do this beforehand + % we need to do this beforehand + + \blockligatures[fi,fl,ff] + + \startbuffer[extraminus] + \startluacode + fonts.helpers.addextraprivate("smallminus", function(tfmdata) + local hchar = tfmdata.characters[0x002D] + local mchar = tfmdata.characters[0x2212] + if hchar and mchar then + return { + width = hchar.width, + height = mchar.height, + commands = { + { "down", hchar.height - mchar.height }, + { "char", 0x002D }, + } + } + end + end) + fonts.helpers.addextraprivate("highminus", function(tfmdata) + local hchar = tfmdata.characters[0x002D] + local mchar = tfmdata.characters[0x2212] + local xchar = tfmdata.characters[0x0058] + if hchar and mchar and xchar then + return { + width = hchar.width, + height = mchar.height, + commands = { + { "down", - xchar.height + mchar.height }, + { "char", 0x002D }, + } + } + end + end) + \stopluacode + \stopbuffer + + \getbuffer[extraminus] + + % so far for preloading \environment manuals-explaining-environment \environment manuals-explaining-cover diff --git a/doc/context/sources/general/fonts/fonts/fonts-extensions.tex b/doc/context/sources/general/fonts/fonts/fonts-extensions.tex index fcb9746f2..ace0f771e 100644 --- a/doc/context/sources/general/fonts/fonts/fonts-extensions.tex +++ b/doc/context/sources/general/fonts/fonts/fonts-extensions.tex @@ -430,6 +430,9 @@ This is a rather special one. First we show a couple of definitions: \typebuffer \getbuffer +When you don't want a dimension to change you leave an entry empty, so +valid entries are for instance: \type {,3,} and \type {1,,}. + As usual you apply such a feature as follows: \starttyping @@ -475,7 +478,8 @@ A special case is the following: \typebuffer \getbuffer -This will make the height and depth the same as the current strut height and depth: +This will make the height and depth the same as the {\em current} strut height +and depth: \startbuffer \ruledhbox{\definedfont[Serif*default,dimensions-e at 8pt]clipped} @@ -489,6 +493,10 @@ The dimensions are (in this case) limited: \startlinecorrection[blank] \dontleavehmode \hpack{\maincolor\inlinebuffer} \stoplinecorrection +Another special case is \type {dimensions=mono} which will make an characters the +fonts em|-|width. This is handy when you define font fallbacks where glyphs come +from a non monospaced font. + \stopsection \startsection[title=Unicoding] @@ -797,6 +805,23 @@ We use the following example. The results are shown in \in {figure} \getbuffer [example] \stopplacefigure +You can see what happens in \in {figure} [expansion:visualized]. + +\startbuffer[example] + \setupalign[hz] + \enabletrackers[*expansion*] + \definefontfeature[boundingbox][boundingbox={frame,empty}] + \definedfont[Serif*default,quality,boundingbox @ 12.1pt] + \samplefile{sapolsky}\par + \disabletrackers[*expansion*] +\stopbuffer + +\typebuffer[example] + +\startplacefigure[reference=expansion:visualized,title=The injected expansion kerns.] + \getbuffer [example] +\stopplacefigure + \startsubsubject[title=Expansion and kerning] When we expand glyphs we also need to look at the font kerns between them. In the @@ -914,19 +939,16 @@ effect of expanded kerns is invisible. The used definitions are: \startplacefigure[reference=hz:natural,title={The two expansion methods compared.}] \showfontkerns \dontcomplain - \enabledirectives[fonts.injections.fontkern] \startcombination[1*3] {\ExtremeHzFont\ruledhpack{\startoverlay {\NoHzSample} {\HzSample } \stopoverlay}} {no hz \& hz} {\ExtremeHzFont\ruledhpack{\startoverlay {\NoHzSample} {\FullHzSample} \stopoverlay}} {no hz \& full hz} {\ExtremeHzFont\ruledhpack{\startoverlay {\HzSample } {\FullHzSample} \stopoverlay}} {hz \& full hz} \stopcombination - \disabledirectives[fonts.injections.fontkern] \stopplacefigure \startplacefigure[reference=hz:zoomed,title={The two expansion methods compared (zoomed in).}] \showfontkerns \dontcomplain - \enabledirectives[fonts.injections.fontkern] \startcombination[3*3] {\ExtremeHzFont @@ -951,20 +973,13 @@ effect of expanded kerns is invisible. The used definitions are: \clip[nx=6,ny=5,x=2,y=2,sx=2]{\startoverlay {\HzSample } {\FullHzSample} \stopoverlay}} {minimal: hz \& full hz} \stopcombination - \disabledirectives[fonts.injections.fontkern] \stopplacefigure -In \CONTEXT\ the \type {hz} alignment option only enables expansion of glyphs, while \type -{fullhz} also applies it to kerns. However, in the examples here we had to explicitly enable -font kerns in node mode: - -\starttyping -\enabledirectives[fonts.injections.fontkern] -\stoptyping - -It will be clear that you can just stick to using the \type {hz} directive (if -you want expansion at all) because this directive is normally disabled and -because most fonts are processed in node mode. +In \CONTEXT\ the \type {hz} alignment option only enables expansion of glyphs, +while \type {fullhz} also applies it to kerns. It will be clear that you can just +stick to using the \type {hz} directive (if you want expansion at all) because +this directive is normally disabled and because most fonts are processed in node +mode. \stopsubsubject @@ -1621,6 +1636,26 @@ example we only displace the second glyph. Of course you need to know a bit about the metrics of the glyphs involved so in practice this boils down to trial and error. +A single character (glyph) can also be tweaked, although normally this is done +better in a manipulator when loading the font. Anyway: + +\startbuffer +\startluacode + fonts.handlers.otf.addfeature { + name = "stest", + type = "single", + data = { + a = { -30, 0, -50, 0 }, + } + } +\stopluacode +\stopbuffer + +\typebuffer \getbuffer + +This will reduce the left and right edges and make the glyph a pretty tight one. The +values are for Latin Modern. + \stopsubsection \startsubsection[title=Examples] @@ -1694,6 +1729,199 @@ Here the dataset is a sequence of rules. There can be a \type {before}, \type {lookups} entry and the numbers are indices in the provided \type {lookups} table. +Here is another example. This one demonstrates that one can check against spaces +(some fonts kerns against them) and against boundaries as well. The later is +something \CONTEXT\ specific. First we define a feature that create ligatures but +only when we touch a space: + +\startbuffer +\startluacode + fonts.handlers.otf.addfeature { + name = "test-a", + type = "chainsubstitution", + lookups = { + { + type = "ligature", + data = { + ['1'] = { "a", "b" }, + ['2'] = { "c", "d" }, + }, + }, + }, + data = { + rules = { + { + before = { { " " } }, + current = { { "a" }, { "b" } }, + lookups = { 1 }, + }, + { + current = { { "c" }, { "d" } }, + after = { { " " } }, + lookups = { 1 }, + }, + }, + }, + } + +\stopluacode +\stopbuffer + +\typebuffer \getbuffer + +The next example also checks against whatever boundary we have. + +\startbuffer +\startluacode + fonts.handlers.otf.addfeature { + name = "test-b", + type = "chainsubstitution", + lookups = { + { + type = "ligature", + data = { + ['1'] = { "a", "b" }, + ['2'] = { "c", "d" }, + }, + }, + }, + data = { + rules = { + { + before = { { " ", 0xFFFC } }, + current = { { "a" }, { "b" } }, + lookups = { 1 }, + }, + { + current = { { "c" }, { "d" } }, + after = { { 0xFFFC, " " } }, + lookups = { 1 }, + }, + }, + }, + } +\stopluacode +\stopbuffer + +\typebuffer \getbuffer + +We can actually simplify this one to: + +\startbuffer +\startluacode + fonts.handlers.otf.addfeature { + name = "test-c", + type = "chainsubstitution", + lookups = { + { + type = "ligature", + data = { + ['1'] = { "a", "b" }, + ['2'] = { "c", "d" }, + }, + }, + }, + data = { + rules = { + { + before = { { 0xFFFC } }, + current = { { "a" }, { "b" } }, + lookups = { 1 }, + }, + { + current = { { "c" }, { "d" } }, + after = { { 0xFFFC } }, + lookups = { 1 }, + }, + }, + }, + } +\stopluacode +\stopbuffer + +\typebuffer \getbuffer + +As a bonus we show how to do more complex things: + +\startbuffer +\startluacode + fonts.handlers.otf.addfeature { + name = "test-d", + type = "chainsubstitution", + lookups = { + { + type = "substitution", + data = { + ["a"] = "A", + ["b"] = "B", + ["c"] = "C", + ["d"] = "D", + }, + }, + { + type = "ligature", + data = { + ['1'] = { "a", "b" }, + ['2'] = { "c", "d" }, + }, + }, + }, + data = { + rules = { + { + before = { { 0xFFFC } }, + current = { { "a" }, { "b" } }, + lookups = { 2 }, + }, + { + current = { { "c" }, { "d" } }, + after = { { 0xFFFC } }, + lookups = { 2 }, + }, + { + current = { { "a" } }, + after = { { "b" } }, + lookups = { 1 }, + }, + { + current = { { "c" } }, + after = { { "d" } }, + lookups = { 1 }, + }, + }, + }, + } +\stopluacode +\stopbuffer + +\typebuffer \getbuffer + +\definefontfeature[test-a][test-a=yes] +\definefontfeature[test-b][test-b=yes] +\definefontfeature[test-c][test-c=yes] +\definefontfeature[test-d][test-d=yes] + +\startbuffer +abababcdcd abababcdcd abababcdcd +\stopbuffer + +With the test text: + +\typebuffer + +These four result in: + +\blank \start + + \definedfont[file:dejavu-serif.ttf*default] + + \start \addff{test-a} \getbuffer \stop\par + \start \addff{test-b} \getbuffer \stop\par + \start \addff{test-c} \getbuffer \stop\par + \start \addff{test-d} \getbuffer \stop\par + +\stop \blank + \stopsubsection \startsubsection[title={Language dependencies}] @@ -2055,7 +2283,6 @@ fonts.handlers.otf.addfeature { { "down", depth + height }, { "rule", 3*height, width/5 }, - } } @@ -2400,6 +2627,92 @@ gets defined and because we share resources it even has to happen before the first font gets loaded. So, the \type {\blockligatures} commands go before setting up the body font. This is no real problem because it's a hack anyway. +The next example combines several tricks: + +\startbuffer[definitions] +\startluacode + fonts.handlers.otf.addfeature { + name = "kernligatures", + type = "kern", + data = { + f = { i = 50, l = 50 }, + } + } +\stopluacode + +\blockligatures[u:fl:a] + +\definefontfeature[default:b][default][blockligatures=yes] +\definefontfeature[default:k][default][blockligatures=yes,kernligatures=yes] + +\showfontkerns +\stopbuffer + +\startbuffer[demo] +{\definedfont[Brill*default @ 11pt]auflage}\par +{\definedfont[Brill*default:b @ 11pt]auflage}\par +{\definedfont[Brill*default:k @ 11pt]auflage}\par +\stopbuffer + +\typebuffer[definitions,demo] \getbuffer[definitions] + +\startlinecorrection + \externalfigure[demo.buffer][width=4cm] +\stoplinecorrection + +Processing fonts is complicated by the fact that a text can be hyphenated. This +complicates for instance ligature building which can cross the pre, post and|/|or +replace bounds. The current implementation does a decent job although there will +always be border cases. And, figuring out what goes wrong is a pain. There are +several ways to trace what happens and here's one. As mentioned, blocking only +works when we haven't not yet defined a font instance, so we use a funny size +here. + +\startbuffer +\blockligatures[u:fl:a] + +\definefontfeature + [blockligatures] + [default] + [blockligatures=yes] + +\startotfcompositionlist{texgyrepagella-regular*blockligatures @ 14.5pt}{l2r} + \HL + \showotfcompositionsample{auflage} + \showotfcompositionsample{a\discretionary{-}{}{}uflage} + \showotfcompositionsample{au\discretionary{-}{}{}flage} + \showotfcompositionsample{auf\discretionary{-}{}{}lage} + \showotfcompositionsample{aufl\discretionary{-}{}{}age} + \showotfcompositionsample{aufla\discretionary{-}{}{}ge} + \showotfcompositionsample{auflag\discretionary{-}{}{}e} + \HL + \showotfcompositionsample{auflegt} + \showotfcompositionsample{a\discretionary{-}{}{}uflegt} + \showotfcompositionsample{au\discretionary{-}{}{}flegt} + \showotfcompositionsample{auf\discretionary{-}{}{}legt} + \showotfcompositionsample{aufl\discretionary{-}{}{}egt} + \showotfcompositionsample{aufle\discretionary{-}{}{}gt} + \showotfcompositionsample{aufleg\discretionary{-}{}{}t} + \HL +\stopotfcompositionlist +\stopbuffer + +\typebuffer \getbuffer + +Here is another example. This one demonstrates that ligatures can force +collapsing of discretionaries. + +\startbuffer +\startotfcompositionlist{Serif*default @ 11pt}{l2r} + \HL + \showotfcompositionsample{effe} + \showotfcompositionsample{efficient} + \HL +\stopotfcompositionlist +\stopbuffer + +\typebuffer \getbuffer + \stopsection \startsection[title=Collections] diff --git a/doc/context/sources/general/fonts/fonts/fonts-features.tex b/doc/context/sources/general/fonts/fonts/fonts-features.tex index f6a12c30d..73d1cd96d 100644 --- a/doc/context/sources/general/fonts/fonts/fonts-features.tex +++ b/doc/context/sources/general/fonts/fonts/fonts-features.tex @@ -1,4 +1,4 @@ -language=uk +% language=uk \startcomponent fonts-features @@ -1074,12 +1074,21 @@ correction of \type {0.025} but for some shapes a different value is used. Again we have some commands at the \TEX\ end: \starttyping -\setupmathematics[italics=1] % fontitalics -\setupmathematics[italics=2] % fontdata -\setupmathematics[italics=3] % quad based +\setupmathematics[italics=1] % apply italics with we have an italic font +\setupmathematics[italics=2] % apply italics anyway +\setupmathematics[italics=3] % apply italics only when italic or bolditalic shapes \setupmathematics[italics=4] % combination of 1 and 3 \stoptyping +An alternative is this: + +\starttyping +\definefontfeature[mathextra][mathextra][collapseitalics=yes] +\stoptyping + +This extends the \type {mathextra} feature to move the italic correction into +the character's width. Often this works out ok. + Because (definitely at the start of the \LUATEX\ project) we had no proper \OPENTYPE\ math fonts, but at the same time wanted to move on to \OPENTYPE\ and \UNICODE\ math and no longer struggle with all @@ -2534,48 +2543,40 @@ unlikely to show up in future versions of the Latin Modern fonts. \stopsection -\startsection[title=Discretionaries] - -% speed test: +% \startsection[title=Discretionaries] % -% \edef\tufte{\cldloadfile{tufte}} -% \enabledirectives[otf.alwaysdisc] -% \testfeatureonce{100}{\setbox0\hbox{\tufte \smallcaps \tufte}}\elapsedtime\par -% \disabledirectives[otf.alwaysdisc] -% \testfeatureonce{100}{\setbox0\hbox{\tufte \smallcaps \tufte}}\elapsedtime\par - -\startbuffer -\definedfont[cambria*default] -12\discretionary - {3} {4} {5}% -67\par -12{\oldstyle\discretionary - {3} {4} {5}}% -67\par -12\discretionary - {3{\oldstyle3}} {{\oldstyle4}4} {5{\oldstyle5}5}% -67\par -\stopbuffer - -The font handler has to do some magick to get features working with and across -discretionaries. To some extend you can use font switches inside discretionaries -but for sure border cases are not dealt with. This works: - -\startlinecorrection[blank] -\startcombination[nx=4,ny=1,location=top] - {\framed[align=normal]{\enabledirectives [otf.alwaysdisc]\setupwhitespace[line]\getbuffer}} {1} - {\framed[align=normal]{\enabledirectives [otf.alwaysdisc]\hsize1mm\getbuffer}} {2} - {\framed[align=normal]{\disabledirectives[otf.alwaysdisc]\setupwhitespace[line]\getbuffer}} {3} - {\framed[align=normal]{\disabledirectives[otf.alwaysdisc]\hsize1mm\getbuffer}} {4} -\stopcombination -\stoplinecorrection - -The first two examples have \type {otf.alwaysdisk} enabled, the last two have it -disabled. - -\typebuffer - -\stopsection +% \startbuffer +% \definedfont[cambria*default] +% 12\discretionary +% {3} {4} {5}% +% 67\par +% 12{\oldstyle\discretionary +% {3} {4} {5}}% +% 67\par +% 12\discretionary +% {3{\oldstyle3}} {{\oldstyle4}4} {5{\oldstyle5}5}% +% 67\par +% \stopbuffer +% +% The font handler has to do some magick to get features working with and across +% discretionaries. To some extend you can use font switches inside discretionaries +% but for sure border cases are not dealt with. This works: +% +% \startlinecorrection[blank] +% \startcombination[nx=4,ny=1,location=top] +% {\framed[align=normal]{\enabledirectives [otf.alwaysdisc]\setupwhitespace[line]\getbuffer}} {1} +% {\framed[align=normal]{\enabledirectives [otf.alwaysdisc]\hsize1mm\getbuffer}} {2} +% {\framed[align=normal]{\disabledirectives[otf.alwaysdisc]\setupwhitespace[line]\getbuffer}} {3} +% {\framed[align=normal]{\disabledirectives[otf.alwaysdisc]\hsize1mm\getbuffer}} {4} +% \stopcombination +% \stoplinecorrection +% +% The first two examples have \type {otf.alwaysdisk} enabled, the last two have it +% disabled. +% +% \typebuffer +% +% \stopsection \startsection[title=Some remarks] @@ -2626,6 +2627,116 @@ changes in a lifetime than foreseen when \TEX\ showed up. \stopsection +\startsection[title=Different spaces] + +The width of the space and its stretch and shrink are taken from the font. The so +called emspace is the reference for much spacing related parameters. It is the +width of character \type {0x2014}. The regular space width is taken from \type +{0x0020}, the space character. When there is no space character, in the case of a +monospaced font we take the emwidth, otherwise we take half the emwidth. As a +last resort we can take the average width of characters. And of even that fails +we take half of the font units. When there is no emwidth that one is set to the +font units. + +In the \CONTEXT\ font loader we use a stretch that is 1/2 of the width of a space +and the shrink is 1/3 the width of a space, so we use values that are quite +similar to what \TEX\ always used. + +You can overload these values when a font is loaded and the overload is +implemented as a feature. The next example demonstrates how this is done: + +\startbuffer +\definefontfeature[morespace][spacing=0.50 plus 0.50 minus 0.250] +\definefontfeature[lessspace][spacing=0.25 plus 0.25 minus 0.125] + +\definedfont[Serif*default] \samplefile{klein}\blank +\definedfont[Serif*default,morespace]\samplefile{klein}\blank +\definedfont[Serif*default,lessspace]\samplefile{klein}\blank +\definedfont[Serif*default] \samplefile{klein}\blank +\stopbuffer + +\typebuffer \blank \getbuffer \blank + +\stopsection + +\startsection[title=Dynamic features] + +We can enable and disable features any time in the input by using the +\type {\feature} command. he following example was posted on the list: + +\startbuffer +\definefont + [WeirdShapes] + [file:linlibertiner*default] + +\definefontfeature + [hist] + [hlig=yes] + +\definefontfeature + [rare] + [dlig=yes] + +\setupquotation + [style={\feature[+][hist,rare]}] + +\startlines +\WeirdShapes +strict {\feature[+][hist]strict} +wurtzite {\feature[+][rare]wurtzite} +\quotation{strict wurtzite} +\stoplines +\stopbuffer + +\typebuffer + +Or typeset: + +\getbuffer + +The \type {\feature} command takes as first argument a directive of what +do do: + +\starttabulate[|T||] +\NC + more \NC add set to previous set and combine with font set \NC \NR +\NC - less \NC subtract set to previous set and combine with font set \NC \NR +\NC = new \NC replace font set \NC \NR +\NC ! < reset \NC forget sets and revert to font set \NC \NR +\NC > old default \NC make sure the current set is used on top of the font set \NC \NR +\stoptabulate + +\stopsection + +\startsection[title=Spacekerns] + +Some fonts kern glyphs with spaces. Although \TEX\ doesn't really have spaces we do +support this. However, it's implemented as part of kerning so when you define such +kerns you need to hook it into for instance the \type {kern} feature: + +\starttyping +\startluacode + local kern = -50 + local pair = { [32] = kern } + + fonts.handlers.otf.addfeature { + name = "kern", -- spacekerns assume kern + type = "kern", + data = { + A = pair, V = pair, W = pair, + [32] = { + A = kern, + V = kern, + W = kern, + }, + } + } +\stopluacode +\stoptyping + +Of course this depends on font properties so one can wonder how useful this is. + +\stopsection + \stopchapter \stopcomponent diff --git a/doc/context/sources/general/fonts/fonts/fonts-formats.tex b/doc/context/sources/general/fonts/fonts/fonts-formats.tex index dc98ee486..9ad6bc9bd 100644 --- a/doc/context/sources/general/fonts/fonts/fonts-formats.tex +++ b/doc/context/sources/general/fonts/fonts/fonts-formats.tex @@ -81,7 +81,7 @@ descender. The width of the bounding box is not by definition the width of the glyph. In \TYPEONE\ and \OPENTYPE\ fonts each shape has a so called advance width and that is the one that will be used. -\usemodule[fnt-40] +\usemodule[fonts-kerns] \startplacefigure [location=here,reference=fig:glyph-kerns,title={Kerning in Latin Roman, Cambria, Pagella and Dejavu.}] \scale[width=\textwidth]{\startcombination[1*4] @@ -844,17 +844,16 @@ to the representation that we need they get cached. You can peek into the cache which is someplace on your system (depending on the setup): \starttabulate[|l|p|] -\NC \type{fonts/afm} \NC type one fonts, converted from \type {afm} and \type - {pfb} files \NC \NR -\NC \type{fonts/data} \NC font name databases \NC \NR -\NC \type{fonts/mp} \NC fonts created using \METAPOST \NC \NR -\NC \type{fonts/otf} \NC open type fonts, converted from \type {ttf}, \type {otf}, - \type {ttc} and \type {ttx} files loaded using the - \FONTFORGE\ loader \NC \NR -\NC \type{fonts/otl} \NC open type fonts, converted from \type {ttf}, \type {otf}, - \type {ttc} and \type {ttx} files loaded using the - \CONTEXT\ \LUA\ loader \NC \NR -\NC \type{fonts/shapes} \NC outlines of fonts (for instance for use in \METAFUN) \NC \NR +\NC \type{fonts/data} \NC font name databases \NC \NR +\NC \type{fonts/mp} \NC fonts created using \METAPOST \NC \NR +\NC \type{fonts/one} \NC type one fonts, converted from \type {afm} and \type + {pfb} files \NC \NR +\NC \type{fonts/otl} \NC open type fonts, converted from \type {ttf}, \type {otf}, + \type {ttc} and \type {ttx} files loaded using the + \CONTEXT\ \LUA\ loader \NC \NR +\NC \type{fonts/pdf} \NC font shapes for color fonts \NC \NR +\NC \type{fonts/shapes} \NC outlines of fonts (for instance for use in \METAFUN) \NC \NR +\NC \type{fonts/streams} \NC font programs for variable font instances \NC \NR \stoptabulate There can be three types of files there. The \type{tma} files are just \LUA\ @@ -868,6 +867,30 @@ font or when the \CONTEXT\ font loader has been updated. \stopsection +\startsection[title=Paths] + +The search for fonts happens on paths defined in \type {texmf.cnf}. The information +in there is used to generate a file database for fast access with priorities based +on file type. The \TDS\ is starting point. The environment variable driven paths +\type {OSFONTDIR} (set automatically) and \type {EXTRAFONTDIR} are taken into account. + +In addition you can set \type {RUNTIMEFONTS} which is, when set, consulted at +runtime. You can also add a path in your style: + +\starttyping +\usefontpath[c:/data/projects/myproject/fonts] +\stoptyping + +although in general we recommend to put fonts in + +\starttyping +<texroot>/tex/texmf-fonts/fonts/data] +\stoptyping + +which is more efficient. + +\stopsection + \stopchapter \stopcomponent diff --git a/doc/context/sources/general/fonts/fonts/fonts-hooks.tex b/doc/context/sources/general/fonts/fonts/fonts-hooks.tex index 9be69d6b8..7ee5dc198 100644 --- a/doc/context/sources/general/fonts/fonts/fonts-hooks.tex +++ b/doc/context/sources/general/fonts/fonts/fonts-hooks.tex @@ -572,14 +572,346 @@ version.} \stopsection +\startsection[title=Extra characters] + +When \TEX\ loads a font it gets stored in an internal format. Although \LUATEX\ +can still load \TFM\ files, normally we will load font data using \LUA\ and then +pass it to \TEX. When that is done the font is basically frozen. After all, once +you entered text and that text has been processed to a sequence of glyphs, the +backend has to be sure that it can include the right data in the result. What +matters there is: + +\startitemize[packed] +\startitem the width of a glyph \stopitem +\startitem the index of a glyph in the font \stopitem +\startitem properties of a font, like its name \stopitem +\startitem all kind manipulations don't with a virtual glyph\stopitem +\stopitemize + +So, changing an already used glyph is not done. But, adding a new one should not +be a big deal. So, starting with \LUATEX\ 1.0.5 we can add characters (that +become glyphs) to a font after it got passed to \TEX. + +Of course there are some limitations to this. For instance, when \OPENTYPE\ +features are needed, you also need to extend that bit and it's not that trivial. +But adding independent special characters is no problem. Also, you can decide to +replace an already processed glyph by another one newly created with the same +dimensions but a different rendering. + +Here I'll give a few (simple) examples. First we define a helper that creates a +rule. After that we use all kind of \CONTEXT\ data structures and helpers but the +general setup is not that complicated. + +\startbuffer +\startluacode + function document.MakeGlyph(w) + local v = 655360 + local w = w*v + local h = v + local d = v/3 + return { + width = w, + height = h, + depth = d, + commands = { + { "down", d }, + { "rule", h + d, w } + }, + } + end +\stopluacode +\stopbuffer + +\typebuffer \getbuffer + +Of course, when one defines a font to be passed to \TEX\ it needs to conform to +the standard. The \LUATEX\ manual describes what parameters and other properties +have to be set. We cheat and copy the so called null font. We also create a fonts +sub table. In such a table, a reference to id zero will be resolved to the id of +the font. + +After defining the font table, we pass it to \TEX\ with \type {font,define} watch +how we also pass an already reserved id. Then we add some characters and we also +replace character 122 which is no problem because, after all, we haven't used it +yet. We just use numbers so don't think we're doing \UNICODE\ here. + +\startbuffer +\startluacode + local fontdata = fonts.hashes.identifiers + + local id = font.nextid(true) -- true reserves the id + local nf = table.copy(fontdata[0]) + + local make = document.MakeGlyph + local add = font.addcharacters + + nf.name = "foo" + nf.type = "virtual" + nf.fonts = { { id = 0 } } + nf.characters = { + [122] = make(1), + [123] = make(2), + } + + font.define(id,nf) + + fontdata[id] = nf + + local t = make(3) + nf.characters[124] = t + add(id, { + fonts = nf.fonts, + characters = { [124] = t } + }) + + local t = make(4) + nf.characters[125] = t + add(id, { + fonts = nf.fonts, + characters = { [125] = t } + }) + + local t = make(8) + nf.characters[122] = t + add(id, { + fonts = nf.fonts, + characters = { [122] = t } + }) + + interfaces.setmacro("MyDemoFontId",id) +\stopluacode +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer +\def\MyDemoFont{\setfontid\MyDemoFontId} +\stopbuffer + +We also define a command to access this font: + +\typebuffer \getbuffer + +\startbuffer +{\MyDemoFont \type{[122=}\char122\type{]}} +{\MyDemoFont \type{[123=}\char123\type{]}} +{\MyDemoFont \type{[124=}\char124\type{]}} +{\MyDemoFont \type{[125=}\char125\type{]}} +\stopbuffer + +and we test this font as follows: + +\typebuffer + +This gives: + +\startlines \getbuffer \stoplines + +Next we extend an existing font and demonstrate several methods for extending a +font. First we define a font that we will patch. + +\startbuffer +\definefontfeature[myextension-one][default][myextension=1] + +\definefont[MyDemoOne][Serif*myextension-one] +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer +\startluacode + local currentfont = font.current() + local fontdata = fonts.hashes.identifiers[currentfont] + local characters = fontdata.characters + local cfonts = fontdata.fonts + local addcharacters = font.addcharacters + + local make = document.MakeGlyph + + local function startextension() + statistics.starttiming() + end + + local function stopextension(n) + context.NC() context.formatted.type("\\char%s",n) + context.NC() context.char(n) + context.NC() context("%0.3f",statistics.stoptiming()) + context.NC() context.NR() + end + + context.starttabulate { "||||" } + + startextension() + for i=1000,1999 do + local t = make(3) + characters[i] = t + addcharacters(currentfont, { + fonts = cfonts, + characters = { [i] = t } + }) + end + stopextension(1500) + + startextension() + local t = { + fonts = cfonts, + characters = characters + } + for i=2000,2999 do + characters[i] = make(5) + addcharacters(currentfont, t) + end + stopextension(2500) + + startextension() + for i=3000,3999 do + characters[i] = make(7) + end + addcharacters(currentfont, { + fonts = cfonts, + characters = characters + }) + stopextension(3500) + + startextension() + local t = { } + for i=4000,4999 do + characters[i] = make(9) + t[i] = characters[i] + end + addcharacters(currentfont, { + fonts = cfonts, + characters = t + }) + stopextension(4500) + + local addcharacters = fonts.constructors.addcharacters + + startextension() + local t = { } + for i=5000,5999 do + t[i] = make(11) + end + addcharacters(currentfont, { + fonts = cfonts, + characters = t + }) + stopextension(5500) + + context.stoptabulate() +\stopluacode +\stopbuffer + +Watch how we only pass the new characters. We also need to make sure that the +table at the \LUA\ end gets updated, because we might need the data later. You +can see that not all methods are equally efficient. The last extension uses a +helper that also makes sure that the main character table at the \LUA\ end gets +updated. + +\typebuffer \start \MyDemoOne \getbuffer \stop + +\startbuffer +\startluacode + local addcharacters = fonts.constructors.addcharacters + local currentfont = font.current() + local parameters = fonts.hashes.parameters[currentfont] + + local m = metapost.simple + local f = string.formatters + ["draw fullsquare rotated %i scaled %b randomized 2bp withcolor %s"] + + local push = { "push" } + local pop = { "pop" } + + function make() + local r = parameters.size + local o = r/2 + local p1 = m("metafun",f( 0, r, "red")) + local p2 = m("metafun",f(30, r, "green")) + local p3 = m("metafun",f(60, r, "blue")) + return { + width = o + r, + height = 2*o, + depth = o, + commands = { + { "down", -o/2 }, { "right", o/2 + o }, + push, { "pdf", "origin", p1 }, pop, + push, { "pdf", "origin", p2 }, pop, + push, { "pdf", "origin", p3 }, pop, + }, + } + end + + local t = { } + for i=6000,6010 do + t[i] = make() + end + addcharacters(currentfont, { + fonts = cfonts, + characters = t + }) +\stopluacode +\stopbuffer + +In this example we use \METAPOST\ to generate a shape. There is some juggling +with dimensions and we need to shift the image in order to get a proper baseline. + +\typebuffer \start \MyDemoOne \showglyphs \getbuffer \stop + +These shapes show up as follows. We show the bounding box too: + +\startbuffer +\scale [width=\textwidth] {% + \char6000 \space + \char6001 \space + \char6002 \space + \char6003 +} +\stopbuffer + +\typebuffer \startlinecorrection \MyDemoOne \showglyphs \getbuffer \stoplinecorrection + +When defining virtual characters you need to keep in mind that there are limits to +how large a character can be. If you go too far \LUATEX\ will quit with a scale +related message. + +In \CONTEXT\ there are a couple of mechanism that were implemented when \LUATEX\ +came around that can be updated to use the tricks described here. I'm not sure if +I'll do that. After all, it works now too. The main benefit of the fact that we +can extend a font within reasonable bounds is that future mechanism can benefit +from it. + +There is one thing to keep in mind. Say that we define a font like this: + +\starttyping +\definefont[MyDemoOneX][Serif*myextension-one] +\stoptyping + +Because we already defined a font with the same size, we automatically get the characters +\type {6000} upto \type {6003}. If we don't want this and want a fresh instance, we can do: + +\starttyping +\definefontfeature[myextension-two][default][myextension=2] +\definefont[MyDemoOneX][Serif*myextension-two] +\stoptyping + +or just: + +\starttyping +\definefont[MyDemoOneX][Serif*default] +\stoptyping + +Normally this kind of hackery is not arbitrary and part of a well designed set up +so one knows what one gets. + +\stopsection + % - features % - subfonts % - outlines % - math % - hashes -\stopsection - \stopchapter \stopcomponent diff --git a/doc/context/sources/general/fonts/fonts/fonts-mkiv.tex b/doc/context/sources/general/fonts/fonts/fonts-mkiv.tex index c5283ad41..fa53492f0 100644 --- a/doc/context/sources/general/fonts/fonts/fonts-mkiv.tex +++ b/doc/context/sources/general/fonts/fonts/fonts-mkiv.tex @@ -21,7 +21,7 @@ % % \usemodule[speedtest] -\enabletrackers[fonts.files] +\enabletrackers[fonts.usage] \enablemode[simple] % ,oversized @@ -66,6 +66,7 @@ \component fonts-math \component fonts-extensions \component fonts-hooks + \component fonts-tricks \stopbodymatter \startappendices diff --git a/doc/context/sources/general/fonts/fonts/fonts-tricks.tex b/doc/context/sources/general/fonts/fonts/fonts-tricks.tex new file mode 100644 index 000000000..b8903b5ed --- /dev/null +++ b/doc/context/sources/general/fonts/fonts/fonts-tricks.tex @@ -0,0 +1,388 @@ +% language=uk + +\startcomponent fonts-tricks + +\environment fonts-environment + +\startchapter[title=Tricks][color=middleorange] + +\startsection[title=Introduction] + +In this chapter topics that don't fit in the previous chapters are +collected. + +\stopsection + +\startsection[title=Extra characters] + +In one of our projects we need a small (high) minus and here we discuss +one way of achieving this. An option is to define a new character +and use a font feature to add it, as in: + +\starttyping +\startluacode + local function addextraminus(tfmdata) + fonts.helpers.addprivate(tfmdata, "smallminus", ... ) -- see below + fonts.helpers.addprivate(tfmdata, "highminus", ... ) -- see below + end + fonts.constructors.newfeatures.otf.register { + name = "extraminus", + description = "extra minus symbols", + default = true, + manipulators = { + base = addextraminus, + node = addextraminus, + } + } +\stopluacode +\stoptyping + +However, why make it an option when we can just add it to any font. So, +we can end up with just: + +\typebuffer[extraminus] % already defined before loading fonts + +It is important to do this before fonts get loaded. Next we need to decide how to +access these characters. A straightforward way is: + +\startbuffer +\def\smallminus{\privatechar{smallminus}} +\def\highminus {\privatechar{highminus}} +\stopbuffer + +\typebuffer \getbuffer + +An alternative is: + +\starttyping +\definemathcommand [smallminus] [ord] {\privatechar{smallminus}} +\definemathcommand [highminus] [ord] {\privatechar{highminus}} +\stoptyping + +but that fails in text mode. So, we can consider: + +\starttyping +\def\smallminus{\mathortext{\mathord{\privatechar{smallminus}}}{\privatechar{smallminus}}} +\def\highminus {\mathortext{\mathord{\privatechar {highminus}}}{\privatechar {highminus}}} +\stoptyping + +or more compact + +\starttyping +\def\smallminus{\mathortext\mathord\firstofoneargument{\privatechar{smallminus}}} +\def\highminus {\mathortext\mathord\firstofoneargument{\privatechar {highminus}}} +\stoptyping + +What method you choose depends on usage. With the first, simple definitions we +get this: + +\startbuffer +[\getprivateslot{smallminus}] [\getprivatechar{smallminus}] [\smallminus] $[\smallminus]$\par +[\getprivateslot {highminus}] [\getprivatechar {highminus}] [\highminus ] $[\highminus ]$\par +\stopbuffer + +\typebuffer \getbuffer + +Because we are fully expandable we can even use this in: + +\startbuffer +\bTABLE[aligncharacter=yes,alignmentcharacter={text->\smallminus}] + \bTR \bTD \mathminus100\smallminus00+ \eTD \eTR + \bTR \bTD 100\smallminus00 \eTD \eTR + \bTR \bTD \mathminus 99\smallminus00+ \eTD \eTR + \bTR \bTD \mathminus 99\smallminus00 \eTD \eTR + \bTR \bTD 100\highminus \eTD \eTR +\eTABLE +\stopbuffer + +\typebuffer + +\startlinecorrection +\getbuffer +\stoplinecorrection + +With the other definitions the alignment would not work. If you need both then +you can define different commands for text and math. + +\stopsection + +\startsection[title=Tabular numbers] + +Some font features are meant to be used in controlled situations. An example is +the \type {tnum} feature that triggers so called \quote {tabular figures} meaning +numbers that have equal widths. Its opposite feature is \type {lnum} or lining +figures. We have two predefined \CONTEXT\ font features for this: + +\starttyping +\definefontfeature [inlinenumbers] [lnum=yes,tnum=no] +\definefontfeature [tabularnumbers] [tnum=yes,lnum=no] +\stoptyping + +Some mechanisms in \CONTEXT\ had better be aware of this and one of them is the +alignment mechanism in tables. + +\startbuffer[demo] +\startcombination[before=,after=] + \startcontent + \switchtobodyfont[pagella]\showglyphs% + \disabledirectives[typesetters.characteralign.autofont]% + \bTABLE[alignmentcharacter=.,aligncharacter=yes] + \bTR \bTD 11.111 \eTD \eTR + \bTR \bTD 2.2 \eTD \eTR + \bTR \bTD 444.444 \eTD \eTR + \eTABLE + \enabledirectives[typesetters.characteralign.autofont]% + \stopcontent + \startcaption + \small manual \type {tnum} + \stopcaption + \startcontent + \switchtobodyfont[pagella]\showglyphs% + \bTABLE[alignmentcharacter=.,aligncharacter=yes] + \bTR \bTD 11.111 \eTD \eTR + \bTR \bTD 2.2 \eTD \eTR + \bTR \bTD 444.444 \eTD \eTR + \eTABLE + \stopcontent + \startcaption + \small auto \type {tnum} + \stopcaption +\stopcombination +\stopbuffer + +In the following examples we demonstrate how the automatic font adaption makes +sure that tabular figures are used. The table is defined as: + +\typebuffer[demo] + +\startbuffer +\dontleavehmode\hbox to .3\textwidth \bgroup + \hss\getbuffer[demo]\hss +\egroup +\stopbuffer + +In \in {figure}[fig:tabularnumbers] we see what the features do. We use the \type +{\feature} or \type {\addfeature} macro for this. For the moment this trickery is +controlled by a directive (beware: enabling them is global). + +\startplacefigure[reference=fig:tabularnumbers,title={Tabular numbers}] + \startcombination[nx=3,ny=2] + {\getbuffer} {\tt\nohyphens default} + {\addfeature [inlinenumbers]\getbuffer} {\tt\nohyphens inlinenumbers} + {\addfeature [tabularnumbers]\getbuffer} {\tt\nohyphens tabularnumbers} + {\addfeature[oldstylenumbers]\getbuffer} {\tt\nohyphens oldstylenumbers} + {\addfeature[oldstylenumbers]% + \addfeature [inlinenumbers]\getbuffer} {\tt\nohyphens oldstylenumbers\par inlinenumbers} + {\addfeature[oldstylenumbers]% + \addfeature [tabularnumbers]\getbuffer} {\tt\nohyphens oldstylenumbers\par tabularnumbers} + \stopcombination +\stopplacefigure + +\stopsection + +\startsection[title=Symbols] + +You can access glyphs by name but you need to know that name, for example: + +\startbuffer +\definefontsynonym [bends] [file:manfnt.afm] + +\startsymbolset [Dangerous Bends] + \definesymbol [dbend] [\resolvedglyphdirect{bends}{n:char_7e}] + \definesymbol [lhdbend] [\resolvedglyphdirect{bends}{n:char_7f}] +\stopsymbolset + +\setupsymbolset [Dangerous Bends] + +Two dangerous bends: \symbol{dbend} and \symbol{lhdbend}. +\stopbuffer + +\typebuffer + +You can best save the fonts you use that way in a place that doesn't get +overwritten because names can change. + +\getbuffer + +\stopsection + +\startsection[title=Alternative styles] + +\startbuffer[demo] + \start + \getbuffer[setup] + \subject{[ {\myslanted myslanted} ] [ {\it it} ] [ {\slanted slanted} ] [ $x=1$ ]} + [ {\myslanted myslanted} ] [ {\it it} ] [ {\slanted slanted} ] [ $x=1$ ] + \typebuffer[setup] + \blackrule[width=\hsize,height=1pt,depth=0pt] + \stop +\stopbuffer + +In section heads we want a nested style (e.g.\ italic) to adapt to the main font. +The following definitions shows how you can influence that process. We use the +following \type {demo} buffer as sample: + +\typebuffer[demo] + +\startbuffer +\blackrule[width=\hsize,height=1pt,depth=0pt] + +\startbuffer[setup] +\setuphead[subject][style=\tfb,before=,after=] +\definealternativestyle [myslanted] [\it] [] +\stopbuffer + +\getbuffer[demo] + +\startbuffer[setup] +\setuphead[subject][style=\tfb,before=,after=] +\definealternativestyle [myslanted] [\it] [\bi] +\stopbuffer + +\getbuffer[demo] + +\startbuffer[setup] +\setuphead[subject][style=\tfb,before=,after=] +\definealternativestyle [myslanted] [\it] [\tf] +\stopbuffer + +\getbuffer[demo] + +\startbuffer[setup] +\definealternativestyle [myslanted] [\normalitalicface] +\setuphead[subject][style=bold,before=,after=] +\stopbuffer + +\getbuffer[demo] + +\startbuffer[setup] +\definealternativestyle [myslanted] [\normalitalicface] +\setuphead[subject][style=\bfd,before=,after=] +\stopbuffer + +\getbuffer[demo] + +\startbuffer[setup] +\definealternativestyle [myslanted] [\slantedface] +\setuphead[subject][style=boldface,before=,after=] +\stopbuffer + +\getbuffer[demo] +\stopbuffer + +You can influence the main method of operation with: + +\starttyping +\setupalternativestyles[method=normal] +\setupalternativestyles[method=auto] +\stoptyping + +\startplacefigure[title={Alternative style methods.},reference=fig:alternativestyle] + \startcombination + {\setupalternativestyles[method=normal]\scale[width=.45\textwidth]{\framed[width=.85\textwidth,align=normal,frame=off,offset=overlay]{\getbuffer}}} {\type{method=normal}} + {\setupalternativestyles [method=auto]\scale[width=.45\textwidth]{\framed[width=.85\textwidth,align=normal,frame=off,offset=overlay]{\getbuffer}}} {\type{method=auto}} + \stopcombination +\stopplacefigure + +The result is shown in \in {figure} [fig:alternativestyle]. Relevant commands are: + +\starttyping +\emphasistypeface +\emphasisboldface + +\normaltypeface \typeface +\normalboldface \boldface +\normalslantedface \slantedface +\normalitalicface \italicface +\swaptypeface \swapface +\stoptyping + +\stopsection + +\startsection[title={A virtual hack}] + +Here is some virtual trickery. A virtual font is just a font but instead of a +character being a reference to a slot in a font (often via an index) it +constructs a glyph from whatever characters, rules, displacements, inline \PDF\ +code, etc. We use them a lot deep down in \CONTEXT. The next example defines two +characters represented by rules. This definition is about as minimalistic as +reasonable and demonstrates how we can apply expansion (aka hz) to such a font. +\footnote {You need \LUATEX\ 1.08 or later for this.} We store the font id (a +number) in a macro. Watch how we don't refer to a glyph in a font. Because we +don't specify its type as \type {virtual} we can leave out the \type {font} +table. After all, we don't refer to real glyphs. + +\startbuffer +\startluacode +local d = 400000 -- just over 6pt +local a = font.define { + characters = { + [string.byte("A")] = + { + width = d, + depth = d, + commands = { { "down", d }, { "rule", d, d } }, + expansion_factor = 1000, + }, + [string.byte("B")] = + { + width = d, + height = d, + commands = { { "rule", d, d } }, + expansion_factor = 500, + }, + + }, + parameters = { + space = 2*d, + space_stretch = d, + space_shrink = d, + }, + stretch = 8, + shrink = 8, + step = 2, + name = "foo" +} + +tex.count.scratchcounter = a +\stopluacode + +\edef\MyFontID{\the\scratchcounter} +\stopbuffer + +\typebuffer \getbuffer + +% \enabletrackers[*expans*] + +\startbuffer +\startoverlay + {\vbox \bgroup + \setuptolerance[verytolerant,stretch] + \setfontid\MyFontID + \dorecurse{5}{ABABABABABABABABABABABABABABABABA } + \egroup} + {\vbox \bgroup + \normaladjustspacing2 + \middlegray + \setuptolerance[verytolerant,stretch] + \setfontid\MyFontID + \dorecurse{5}{ABABABABABABABABABABABABABABABABA } + \egroup} +\stopoverlay +\stopbuffer + +We test this with some rather low level code and show the result in \in {figure} +[fig:virtualhack]. Of course you will never define a font this way if only +because we don't set important parameters and this version is not generic in the +sense that it scales well. You can find better examples elsewhere in the manual +and in the distribution. + +\typebuffer + +\startplacefigure[title={A virtual hack.},reference=fig:virtualhack] + \getbuffer +\stopplacefigure + +\stopsection + +\stopchapter diff --git a/doc/context/sources/general/manuals/about/about-metafun.tex b/doc/context/sources/general/manuals/about/about-metafun.tex index 8daff05a7..d289dd803 100644 --- a/doc/context/sources/general/manuals/about/about-metafun.tex +++ b/doc/context/sources/general/manuals/about/about-metafun.tex @@ -389,7 +389,7 @@ By using some \METAPOST\ magic we can even go a step further in readability: Here we demonstrate that it also works well in \type {double} mode, which makes much sense when processing data from other sources. Note how we omit the -type {lua.} prefix: the \type {MP} macro will deal with that. +type {lua} prefix: the \type {MP} macro will deal with that. \startlinecorrection[blank] \getbuffer diff --git a/doc/context/sources/general/manuals/bidi/bidi.tex b/doc/context/sources/general/manuals/bidi/bidi.tex new file mode 100644 index 000000000..abd3f64fa --- /dev/null +++ b/doc/context/sources/general/manuals/bidi/bidi.tex @@ -0,0 +1,505 @@ +% language=uk + +% \showglyphs + +\usemodule[abr-04] + +\dontcomplain + +\startbuffer[preamble-fonts] +\definefontfallback + [Serif] [scheherazaderegular*arabic] + [arabic] [force=yes,rscale=1.5] +\definefontfallback + [SerifBold] [scheherazadebold*arabic] + [arabic] [force=yes,rscale=1.5] +\definefontfallback + [SerifItalic] [scheherazaderegular*arabic] + [arabic] [force=yes,rscale=1.5] +\definefontfallback + [SerifBoldItalic] [scheherazadebold*arabic] + [arabic] [force=yes,rscale=1.5] + +\definefontfallback + [Serif] [sileot*hebrew] + [hebrew] [force=yes] +\definefontfallback + [SerifBold] [sileot*hebrew] + [hebrew] [force=yes] +\definefontfallback + [SerifItalic] [sileot*hebrew] + [hebrew] [force=yes] +\definefontfallback + [SerifBoldItalic] [sileot*hebrew] + [hebrew] [force=yes] + +\definefontfallback + [Mono] [almfixed*none] + [arabic] [force=yes] + +\definefontfallback + [Mono] [sileot*none] + [hebrew] [force=yes,factor=1] % factor forces a monospace + +\setupbodyfont + [dejavu,10pt] +\stopbuffer + +\startbuffer[preamble-languages] +\setuplanguage[ar][font=arabic,bidi=right] +\setuplanguage[he][font=hebrew,bidi=right] +\stopbuffer + +\getbuffer[preamble-fonts] +\getbuffer[preamble-languages] + +\setuplayout + [backspace=15mm, + topspace=15mm, + footer=0pt, + width=middle, + height=middle] + +\setuptyping + [color=middleblue] + +\setuptype + [color=middleblue] + +\definecolor + [maincolor] + [middleblue] + +\setupwhitespace + [big] + +\setuphead + [color=darkyellow] + +\setuphead + [chapter] + [style=\bfc] + +\setuphead + [section] + [style=\bfb] + +\setuphead + [subsection] + [style=\bfa] + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\startluacode + local report = logs.reporter("directions","check") + local line = 0 + function nodes.tracers.checkdirections(head) + line = line + 1 + report("line: %i",line) + for n in nodes.traverse_id(nodes.nodecodes.dir,head) do + report(" %s (%i,%i)",n.dir,n.subtype,n.direction) + end + return head, false + end + + nodes.tasks.appendaction("contributers","after","nodes.tracers.checkdirections") + nodes.tasks.disableaction("contributers","nodes.tracers.checkdirections") +\stopluacode + +\installtextracker + {directions.check} + {\ctxlua{nodes.tasks.enableaction("contributers","nodes.tracers.checkdirections")}} + {\ctxlua{nodes.tasks.disableaction("contributers","nodes.tracers.checkdirections")}} + +% \enabletrackers[directions.check] +% \disabletrackers[directions.check] + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\starttext + +\startMPpage + + picture p, q, r, s ; + + p := textext("l2r") xsized .9PaperWidth ; + q := textext("r2l") xsized .9PaperWidth ; + r := textext("a few tips") xsized .9PaperWidth ; + s := textext("\bf\ss hans\quad\space\quad hagen") xsized .5bbheight(p); + + p := p shifted - llcorner p ; + q := q shifted - llcorner q ; + r := r shifted - llcorner r ; + s := s shifted - llcorner s ; + + fill Page withcolor "darkyellow" ; + + p := p shifted (.05PaperWidth,ypart .5[ulcorner Page, urcorner Page]-1.1bbheight(p)) ; + q := q shifted (.05PaperWidth,ypart .5[ulcorner Page, urcorner Page]-1.1bbheight(p)-1.15bbheight(q)) ; + r := r shifted (.05PaperWidth,ypart .5[llcorner Page, lrcorner Page]+0.3bbheight(r)) ; + s := s shifted (.66PaperWidth,ypart .5[llcorner Page, lrcorner Page]+1.5bbheight(s)) ; + + draw p withcolor "lightgray" ; + draw q withcolor "lightgray" ; + draw r withcolor "middleblue" ; + draw s withcolor "lightgray" ; + +\stopMPpage + +\startchapter[title=Introduction] + +With \CONTEXT\ you can typeset in two directions: from left to right and from +right to left. In fact you can also combine these two directions, like this: + +\startbuffer +There are many {\righttoleft \maincolor \it scripts in use} and some run into the +other direction. However, there is {\righttoleft \maincolor \it no fixed relation +{\lefttoright \black \it between the} direction of the script} and cars being +driven left or right of the road. +\stopbuffer + +\typebuffer + +\getbuffer + +Even someone not familiar with right to left typesetting can see what happens +here, or not? In fact Luigi Scarso pointed out that the \type {fixed} reversed +into {\righttoleft \type {fixed}} but not in the example where {\bf fixed} +becomes {\righttoleft \bf fixed}. This signals an important property of the way +the text gets processed: you input something, at some points font features get +applied (like ligatures) and in the end the resulting glyph stream is reversed. +By that time the combination of {\bf f}+{\bf i} has become {\bf fi}! So, be +prepared for surprises. + +This manual is written by a left to right user so don't expect a manual on +semitic typesetting. Also don't expect a (yet) complete manual. I'll add whatever +comes to mind. This is not a manual about Hebrew or Arabic, if only because I +can't read any of those scripts (languages). I leave that to others to cover. + +{\em This is work in progress! So expect errors and typos.} + +\startlines +Hans Hagen +Hasselt, NL +\stoplines + +\stopchapter + +\startchapter[title={Setting up fonts}] + +So let's see how Arabic and Hebrew come out: + +\startbuffer +The sentence \quotation {I have no clue what this means.} is translated (by +Google Translate) into \quotation {\ar \righttoleft ليس لدي أي فكرة عما يعنيه هذا.} +which is then translated back to \quotation {I have no idea what this means.} so +maybe arabic has no clue what a clue is. The suggested Arabic pronunciation is +\quotation {lays laday 'ayu fikrat eamaa yaenih hadha}. Hebrew also likes ideas +more: \quotation {\he \righttoleft אין לי מושג מה זה אומר}. +\stopbuffer + +\typebuffer + +\getbuffer + +According to Idris Hamid the Arabic should actually be this: \quotation {\ar +لَيْسَ لَدَيَّ أَيُّ فِكْرَةٍ عَمَّا يَعْنِيهِ هٰذَا} and the transliteration \quotation {Laysa +ladayya ayyu fikratin ʿammā yaʿnihi hādhā}. + +The \CONTEXT\ (or any \TEX) ecosystem deals with languages and fonts. Languages +(that relate to scripts) have specific characteristics, like running from right +to left, and fonts provide a repertoire of glyphs and features. There is no real +(standard) relationship between these. In for instance browsers, there are +automatic fallback systems for missing characters in a font: another font is +taken. These fallbacks are often not easy to tweak. + +In this document we use Dejavu and although that font has Arabic shapes in its +monospace variant, the serifs come without them (at least when I write this +down). Before we actually define the bodyfont we hook in some fallbacks. The +typescript for Dejavu has lines like this: + +\starttyping +\definefontsynonym + [SerifBoldItalic] + [name:dejavuserifbolditalic] + [features=default, + fallbacks=SerifBoldItalic] +\stoptyping + +This permits us to do this: + +\typebuffer[preamble-fonts] + +In addition we set up the languages: + +\typebuffer[preamble-languages] + +The following example demonstrates what the effects of these commands are: + +\startbuffer +{لَيْسَ لَدَيَّ أَيُّ فِكْرَةٍ عَمَّا يَعْنِيهِ هٰذَا.} +{אין לי מושג מה זה אומר.} +{\righttoleft لَيْسَ لَدَيَّ أَيُّ فِكْرَةٍ عَمَّا يَعْنِيهِ هٰذَا.} +{\righttoleft אין לי מושג מה זה אומר.} +{\ar \righttoleft لَيْسَ لَدَيَّ أَيُّ فِكْرَةٍ عَمَّا يَعْنِيهِ هٰذَا.} +{\he \righttoleft אין לי מושג מה זה אומר.} +{\ar لَيْسَ لَدَيَّ أَيُّ فِكْرَةٍ عَمَّا يَعْنِيهِ هٰذَا.} +{\he אין לי מושג מה זה אומר.} +\stopbuffer + +\typebuffer + +\startlines +\getbuffer +\stoplines + +In principle you can also rely on automatic direction changes, for instance +by using the following command: + +\starttyping +\setupdirections + [bidi=global, + method=three] +\stoptyping + +But that doesn't do a font switch for you, nor does it do any of the other +language related settings. It really helps if you properly tag your +document content, as in: + +\starttyping +{\ar لَيْسَ لَدَيَّ أَيُّ فِكْرَةٍ عَمَّا يَعْنِيهِ هٰذَا.} +{\he אין לי מושג מה זה אומר.} +\stoptyping + +One reason to set the \type {font} parameter for a language is that it will +activate the right features in a font. Instead of falling back on some default, +we can be very specific in what we want to enable. + +\stopchapter + +\startchapter[title=A mixed layout] + +The typesetting engine normally works from left to right and top to bottom. Going +from right to left actually involved two decisions: + +\startitemize[packed] +\startitem the direction of the display elements, the paragraphs \stopitem +\startitem the direction of the inline text, the lines \stopitem +\stopitemize + +The first one is kept track of in a state variable. Every paragraph starts with +a node that carries, among other information, that state. This node is added +automatically and does not interfere with the typesetting. The inline direction +is more intrusive as it is marked by nodes that indicate the beginning and end +of a reversed strip. This mechanism is rather reliable and normally works out +well. Take this: + +\startbuffer +left {\righttoleft right} left +left{ \righttoleft right} left +left {\righttoleft right }left +left{ \righttoleft right }left +\stopbuffer + +\typebuffer + +You can see that we need to be careful with spaces as they can end up inside or +outside a substream and by swapping next to each other: + +\startlines +\getbuffer +\stoplines + +We can wrap the lines in boxes as in: + +\startbuffer +\hbox{left\space{\bf\righttoleft right}\space left} +\hbox{left{\bf\space \righttoleft right}\space left} +\hbox{left\space{\bf\righttoleft right\space}left} +\hbox{left{\bf\space\righttoleft right\space}left} +\stopbuffer + +\typebuffer + +\definecolor[ShineThrough][s=0,a=1,t=.2] + +When visualize the spaces we get this: + +\startlines\ShineThrough +\showmakeup[space,hbox]\getbuffer +\stoplines + +The space of a normal and bold font in the same family normally is the same but +let's mix with a larger size: + +\startbuffer +\hbox{left {\bfa\righttoleft right} left} +\hbox{left{\bfa\space \righttoleft right} left} +\hbox{left {\bfa\righttoleft right }left} +\hbox{left{\bfa\space\righttoleft right }left} +\stopbuffer + +\typebuffer + +Now we get the following. As you can see, it really matters where we put the +braces. + +\startlines +\ShineThrough\showmakeup[space,hbox]\getbuffer +\stoplines + +Once you are accustomed to tagging and \TEX\ you will probably not fall into +these traps. In \in {figure} [fig:spaces] we show a large version. + +\startplacefigure[location=top,title={Watch your spaces!},reference=fig:spaces] + \scale + [width=\hsize] + {\vbox{\ShineThrough\showmakeup[space,hbox]\getbuffer}} +\stopplacefigure + + +The \type {\righttoleft} command actually has two meanings. This can best be seen +from an example. + +\startbuffer +\righttoleft \bf How will this come out? +\stopbuffer + +\typebuffer + +\start \getbuffer \par \stop + +\startbuffer +And \righttoleft \bf how will this come out? +\stopbuffer + +\typebuffer + +\start \getbuffer \par \stop + +When we start a paragraph (or in \TEX\ speak: when we are still in vertical mode) +the paragraph direction as well as the inline direction is set. Otherwise only +the inline direction is set. There are low level \TEX\ commands (primitives) to +set the direction but you can best {\em not} use these because we need to do a +bit more than that. + +There are quite some low level commands related to changing directions. Some deal +with the layout, some with boxes. We might provide more in the future. + +\starttabulate[|l|p|] +\FL +\NC \type {\lefttoright} \NC l2r dir node or paragraph property \NC \NR +\NC \type {\righttoleft} \NC r2l dir node or paragraph property \NC \NR +\NC \type {\checkedlefttoright} \NC l2r dir node or paragraph property (unless already set) \NC \NR +\NC \type {\checkedrighttoleft} \NC r2l dir node or paragraph property (unless already set) \NC \NR +\ML +\NC \type {\synchronizeinlinedirection} \NC pickup a (possibly) reset state \NC \NR +\NC \type {\synchronizelayoutdirection} \NC pickup a (possibly) reset state \NC \NR +\NC \type {\synchronizedisplaydirection} \NC pickup a (possibly) reset state \NC \NR +\ML +\NC \type {\righttolefthbox} \NC r2l \type {\hbox} \NC \NR +\NC \type {\lefttorighthbox} \NC l2r \type {\hbox} \NC \NR +\NC \type {\righttoleftvbox} \NC r2l \type {\vbox} \NC \NR +\NC \type {\lefttorightvbox} \NC l2r \type {\vbox} \NC \NR +\NC \type {\righttoleftvtop} \NC r2l \type {\vtop} \NC \NR +\NC \type {\lefttorightvtop} \NC l2r \type {\vtop} \NC \NR +\ML +\NC \type {\leftorrighthbox} \NC l2r or r2l \type {\hbox} \NC \NR +\NC \type {\leftorrightvbox} \NC l2r or r2l \type {\vbox} \NC \NR +\NC \type {\leftorrightvtop} \NC l2r or r2l \type {\vtop} \NC \NR +\ML +\NC \type {\autodirhbox} \NC l2r or r2l \type {\hbox} (a bit more clever) \NC \NR +\NC \type {\autodirvbox} \NC l2r or r2l \type {\vbox} (a bit more clever) \NC \NR +\NC \type {\autodirvtop} \NC l2r or r2l \type {\vtop} (a bit more clever) \NC \NR +\ML +\NC \type {\bidilre} \NC character \type {U+202A}, enforce l2r state \NC \NR +\NC \type {\bidirle} \NC character \type {U+202B}, enforce r2l state \NC \NR +\NC \type {\bidipop} \NC character \type {U+202C}, return to last state \NC \NR +\NC \type {\bidilro} \NC character \type {U+202D}, override l2r state \NC \NR +\NC \type {\bidirlo} \NC character \type {U+202E}, override r2l state \NC \NR +\NC \type {\lefttorightmark} \type {\lrm} \NC character \type {U+200E}, l2r indicator \NC \NR +\NC \type {\righttoleftmark} \type {\rlm} \NC character \type {U+200F}, r2l indicator \NC \NR +\ML +\NC \type {\dirlre} \NC switch to l2r mode using \type {\bidilre} or \lefttoright \NC \NR +\NC \type {\dirrle} \NC switch to r2l mode using \type {\bidirle} or \righttoleft \NC \NR +\NC \type {\dirlro} \NC enforce l2r mode using \type {\bidilro} or \lefttoright \NC \NR +\NC \type {\dirrlo} \NC enforce r2l mode using \type {\bidirlo} or \righttoleft \NC \NR +\ML +\NC \type {\naturalhbox} \NC a normal l2r \type {hbox} \NC \NR +\NC \type {\naturalvbox} \NC a normal l2r \type {vbox} \NC \NR +\NC \type {\naturalvtop} \NC a normal l2r \type {vtop} \NC \NR +\NC \type {\naturalhpack} \NC a normal l2r \type {hpack} \NC \NR +\NC \type {\naturalvpack} \NC a normal l2r \type {vpack} \NC \NR +\LL +\stoptabulate + +When we talk about layout, we mean the overall layout, concerning the document as +a whole. We can have a dominantly l2r, dominantly r2l or mixed setup. In a next +chapter we will give more details on the dominant setup. Here we stick to +mentioning that the document flow direction is set with + +\starttyping +\setupalign[r2l] % or r2l +\stoptyping + +When a command to setup an environment has a \type {align} parameter, the same +keywords can be uses as part of the specification. \footnote {We haven't tested +all situations and possible interferences. Just report anomalies to the mailing +list.} + +\stopchapter + +\startchapter[title={Numbering and positioning}] + +todo: columns (direction key), numbers (conversionsets), margins (begin/end), etc + +\stopchapter + +\startchapter[title={The \LUA\ interface}] + +We assume that you run \CONTEXT\ \MKIV\ in combination with \LUATEX. Direction +support in this engine has been improved over time. Originally the \OMEGA\ +(\ALEPH) direction model was used but in the meantime it has been stripped to the +basics, and what used to be so called whatsits (extension nodes) are now first +class nodes. In the \LUA\ interface we still support the: + +\startitemize[packed] +\startitem + \type {TLT} and \type {TRT} keywords for local par nodes +\stopitem +\startitem + \type {+TLT}, \type {-TLT}, \type {+TRT} and \type {-TRT} keywords for + direction nodes +\stopitem +\stopitemize + +However, because we use dedicated nodes, and because nodes actually store numbers +and not strings we also expose the numeric model: + +\starttabulate[|l|l|l|] +\NC 0 \NC \type {TLT} \NC left to right \NC \NR +\NC 1 \NC \type {TRT} \NC right to left \NC \NR +\NC 2 \NC \type {LTL} \NC not used in context \NC \NR +\NC 3 \NC \type {RTT} \NC not used in context \NC \NR +\stoptabulate + +These values are used for local par nodes as well as direction nodes. In addition +a direction node has a subtype: + +\starttabulate[|l|l|l|] +\NC 0 \NC \type {normal} \NC comparable to \type {+} \NC \NR +\NC 1 \NC \type {cancel} \NC comparable to \type {-} \NC \NR +\stoptabulate + +The \type {dir} field uses the strings, the \type {direction} field the number +(both of course share the same internal node variable). + +\stopchapter + +\stoptext + +% \defineconversionset [\s!default] [] [numbers] +% \defineconversionset [\v!number] [] [numbers] +% \defineconversionset [\v!pagenumber] [] [numbers] +% \defineconversionset [\v!appendix:\s!default] [Romannumerals,Characters] [numbers] +% \defineconversionset [\v!formula] [numbers,characters] % no \v! ? diff --git a/doc/context/sources/general/manuals/cld/cld-abitoflua.tex b/doc/context/sources/general/manuals/cld/cld-abitoflua.tex new file mode 100644 index 000000000..e61507929 --- /dev/null +++ b/doc/context/sources/general/manuals/cld/cld-abitoflua.tex @@ -0,0 +1,869 @@ +% language=uk + +\startcomponent cld-abitoflua + +\environment cld-environment + +\startchapter[title=A bit of Lua] + +\startsection[title=The language] + +\index[lua]{\LUA} + +Small is beautiful and this is definitely true for the programming language \LUA\ +(moon in Portuguese). We had good reasons for using this language in \LUATEX: +simplicity, speed, syntax and size to mention a few. Of course personal taste +also played a role and after using a couple of scripting languages extensively +the switch to \LUA\ was rather pleasant. + +As the \LUA\ reference manual is an excellent book there is no reason to discuss +the language in great detail: just buy \quote {Programming in \LUA} by the \LUA\ +team. Nevertheless I will give a short summary of the important concepts but +consult the book if you want more details. + +\stopsection + +\startsection[title=Data types] + +\index{functions} +\index{variables} +\index{strings} +\index{numbers} +\index{booleans} +\index{tables} + +The most basic data type is \type {nil}. When we define a variable, we don't need +to give it a value: + +\starttyping +local v +\stoptyping + +Here the variable \type {v} can get any value but till that +happens it equals \type {nil}. There are simple data types like +\type {numbers}, \type {booleans} and \type {strings}. Here are +some numbers: + +\starttyping +local n = 1 + 2 * 3 +local x = 2.3 +\stoptyping + +Numbers are always floats \footnote {This is true for all versions upto 5.2 but +following version can have a more hybrid model.} and you can use the normal +arithmetic operators on them as well as functions defined in the math library. +Inside \TEX\ we have only integers, although for instance dimensions can be +specified in points using floats but that's more syntactic sugar. One reason for +using integers in \TEX\ has been that this was the only way to guarantee +portability across platforms. However, we're 30 years along the road and in \LUA\ +the floats are implemented identical across platforms, so we don't need to worry +about compatibility. + +Strings in \LUA\ can be given between quotes or can be so called long strings +forced by square brackets. + +\starttyping +local s = "Whatever" +local t = s .. ' you want' +local u = t .. [[ to know]] .. [[--[ about Lua!]--]] +\stoptyping + +The two periods indicate a concatenation. Strings are hashed, so when you say: + +\starttyping +local s = "Whatever" +local t = "Whatever" +local u = t +\stoptyping + +only one instance of \type {Whatever} is present in memory and this fact makes +\LUA\ very efficient with respect to strings. Strings are constants and therefore +when you change variable \type {s}, variable \type {t} keeps its value. When you +compare strings, in fact you compare pointers, a method that is really fast. This +compensates the time spent on hashing pretty well. + +Booleans are normally used to keep a state or the result from an expression. + +\starttyping +local b = false +local c = n > 10 and s == "whatever" +\stoptyping + +The other value is \type {true}. There is something that you need +to keep in mind when you do testing on variables that are yet +unset. + +\starttyping +local b = false +local n +\stoptyping + +The following applies when \type {b} and \type {n} are defined this way: + +\starttabulate[|Tl|Tl|] +\NC b == false \NC true \NC \NR +\NC n == false \NC false \NC \NR +\NC n == nil \NC true \NC \NR +\NC b == nil \NC false \NC \NR +\NC b == n \NC false \NC \NR +\NC n == nil \NC true \NC \NR +\stoptabulate + +Often a test looks like: + +\starttyping +if somevar then + ... +else + ... +end +\stoptyping + +In this case we enter the else branch when \type {somevar} is either \type {nil} +or \type {false}. It also means that by looking at the code we cannot beforehand +conclude that \type {somevar} equals \type {true} or something else. If you want +to really distinguish between the two cases you can be more explicit: + +\starttyping +if somevar == nil then + ... +elseif somevar == false then + ... +else + ... +end +\stoptyping + +or + +\starttyping +if somevar == true then + ... +else + ... +end +\stoptyping + +but such an explicit test is seldom needed. + +There are a few more data types: tables and functions. Tables are very important +and you can recognize them by the same curly braces that make \TEX\ famous: + +\starttyping +local t = { 1, 2, 3 } +local u = { a = 4, b = 9, c = 16 } +local v = { [1] = "a", [3] = "2", [4] = false } +local w = { 1, 2, 3, a = 4, b = 9, c = 16 } +\stoptyping + +The \type {t} is an indexed table and \type {u} a hashed table. Because the +second slot is empty, table \type {v} is partially indexed (slot 1) and partially +hashed (the others). There is a gray area there, for instance, what happens when +you nil a slot in an indexed table? In practice you will not run into problems as +you will either use a hashed table, or an indexed table (with no holes), so table +\type {w} is not uncommon. + +We mentioned that strings are in fact shared (hashed) but that an assignment of a +string to a variable makes that variable behave like a constant. Contrary to +that, when you assign a table, and then copy that variable, both variables can be +used to change the table. Take this: + +\starttyping +local t = { 1, 2, 3 } +local u = t +\stoptyping + +We can change the content of the table as follows: + +\starttyping +t[1], t[3] = t[3], t[1] +\stoptyping + +Here we swap two cells. This is an example of a parallel assigment. However, the +following does the same: + +\starttyping +t[1], t[3] = u[3], u[1] +\stoptyping + +After this, both \type {t} and \type {u} still share the same table. This kind of +behaviour is quite natural. Keep in mind that expressions are evaluated first, so + +\starttyping +t[#t+1], t[#t+1] = 23, 45 +\stoptyping + +Makes no sense, as the values end up in the same slot. There is no gain in speed +so using parallel assignments is mostly a convenience feature. + +There are a few specialized data types in \LUA, like \type {coroutines} (built +in), \type {file} (when opened), \type {lpeg} (only when this library is linked +in or loaded). These are called \quote {userdata} objects and in \LUATEX\ we have +more userdata objects as we will see in later chapters. Of them nodes are the +most noticeable: they are the core data type of the \TEX\ machinery. Other +libraries, like \type {math} and \type {bit32} are just collections of functions +operating on numbers. + +Functions look like this: + +\starttyping +function sum(a,b) + print(a, b, a + b) +end +\stoptyping + +or this: + +\starttyping +function sum(a,b) + return a + b +end +\stoptyping + +There can be many arguments of all kind of types and there can be multiple return +values. A function is a real type, so you can say: + +\starttyping +local f = function(s) print("the value is: " .. s) end +\stoptyping + +In all these examples we defined variables as \type {local}. This is a good +practice and avoids clashes. Now watch the following: + +\starttyping +local n = 1 + +function sum(a,b) + n = n + 1 + return a + b +end + +function report() + print("number of summations: " .. n) +end +\stoptyping + +Here the variable \type {n} is visible after its definition and accessible for +the two global functions. Actually the variable is visible to all the code +following, unless of course we define a new variable with the same name. We can +hide \type {n} as follows: + +\starttyping +do + local n = 1 + + sum = function(a,b) + n = n + 1 + return a + b + end + + report = function() + print("number of summations: " .. n) + end +end +\stoptyping + +This example also shows another way of defining the function: by assignment. + +The \typ {do ... end} creates a so called closure. There are many places where +such closures are created, for instance in function bodies or branches like \typ +{if ... then ... else}. This means that in the following snippet, variable \type +{b} is not seen after the end: + +\starttyping +if a > 10 then + local b = a + 10 + print(b*b) +end +\stoptyping + +When you process a blob of \LUA\ code in \TEX\ (using \type {\directlua} or \type +{\latelua}) it happens in a closure with an implied \typ {do ... end}. So, \type +{local} defined variables are really local. + +\stopsection + +\startsection[title=\TEX's data types] + +We mentioned \type {numbers}. At the \TEX\ end we have counters as well as +dimensions. Both are numbers but dimensions are specified differently + +\starttyping +local n = tex.count[0] +local m = tex.dimen.lineheight +local o = tex.sp("10.3pt") -- sp or 'scaled point' is the smallest unit +\stoptyping + +The unit of dimension is \quote {scaled point} and this is a pretty small unit: +10 points equals to 655360 such units. + +Another accessible data type is tokens. They are automatically converted to +strings and vice versa. + +\starttyping +tex.toks[0] = "message" +print(tex.toks[0]) +\stoptyping + +Be aware of the fact that the tokens are letters so the following will come out +as text and not issue a message: + +\starttyping +tex.toks[0] = "\message{just text}" +print(tex.toks[0]) +\stoptyping + +\stopsection + +\startsection[title=Control structures] + +\index{loops} + +Loops are not much different from other languages: we have \typ {for ... do}, +\typ {while ... do} and \typ {repeat ... until}. We start with the simplest case: + +\starttyping +for index=1,10 do + print(index) +end +\stoptyping + +You can specify a step and go downward as well: + +\starttyping +for index=22,2,-2 do + print(index) +end +\stoptyping + +Indexed tables can be traversed this way: + +\starttyping +for index=1,#list do + print(index, list[index]) +end +\stoptyping + +Hashed tables on the other hand are dealt with as follows: + +\starttyping +for key, value in next, list do + print(key, value) +end +\stoptyping + +Here \type {next} is a built in function. There is more to say about this +mechanism but the average user will use only this variant. Slightly less +efficient is the following, more readable variant: + +\starttyping +for key, value in pairs(list) do + print(key, value) +end +\stoptyping + +and for an indexed table: + +\starttyping +for index, value in ipairs(list) do + print(index, value) +end +\stoptyping + +The function call to \type {pairs(list)} returns \typ {next, list} so there is an +(often neglectable) extra overhead of one function call. + +The other two loop variants, \type {while} and \type {repeat}, are similar. + +\starttyping +i = 0 +while i < 10 do + i = i + 1 + print(i) +end +\stoptyping + +This can also be written as: + +\starttyping +i = 0 +repeat + i = i + 1 + print(i) +until i = 10 +\stoptyping + +Or: + +\starttyping +i = 0 +while true do + i = i + 1 + print(i) + if i = 10 then + break + end +end +\stoptyping +\stopsection + +Of course you can use more complex expressions in such constructs. + +\startsection[title=Conditions] + +\index{expressions} + +Conditions have the following form: + +\starttyping +if a == b or c > d or e then + ... +elseif f == g then + ... +else + ... +end +\stoptyping + +Watch the double \type {==}. The complement of this is \type {~=}. Precedence is +similar to other languages. In practice, as strings are hashed. Tests like + +\starttyping +if key == "first" then + ... +end +\stoptyping + +and + +\starttyping +if n == 1 then + ... +end +\stoptyping + +are equally efficient. There is really no need to use numbers to identify states +instead of more verbose strings. + +\stopsection + +\startsection[title=Namespaces] + +\index{namespaces} + +Functionality can be grouped in libraries. There are a few default libraries, +like \type {string}, \type {table}, \type {lpeg}, \type {math}, \type {io} and +\type {os} and \LUATEX\ adds some more, like \type {node}, \type {tex} and \type +{texio}. + +A library is in fact nothing more than a bunch of functionality organized using a +table, where the table provides a namespace as well as place to store public +variables. Of course there can be local (hidden) variables used in defining +functions. + +\starttyping +do + mylib = { } + + local n = 1 + + function mylib.sum(a,b) + n = n + 1 + return a + b + end + + function mylib.report() + print("number of summations: " .. n) + end +end +\stoptyping + +The defined function can be called like: + +\starttyping +mylib.report() +\stoptyping + +You can also create a shortcut, This speeds up the process because there are less +lookups then. In the following code multiple calls take place: + +\starttyping +local sum = mylib.sum + +for i=1,10 do + for j=1,10 do + print(i, j, sum(i,j)) + end +end + +mylib.report() +\stoptyping + +As \LUA\ is pretty fast you should not overestimate the speedup, especially not +when a function is called seldom. There is an important side effect here: in the +case of: + +\starttyping + print(i, j, sum(i,j)) +\stoptyping + +the meaning of \type {sum} is frozen. But in the case of + +\starttyping + print(i, j, mylib.sum(i,j)) +\stoptyping + +The current meaning is taken, that is: each time the interpreter will access +\type {mylib} and get the current meaning of \type {sum}. And there can be a good +reason for this, for instance when the meaning is adapted to different +situations. + +In \CONTEXT\ we have quite some code organized this way. Although much is exposed +(if only because it is used all over the place) you should be careful in using +functions (and data) that are still experimental. There are a couple of general +libraries and some extend the core \LUA\ libraries. You might want to take a look +at the files in the distribution that start with \type {l-}, like \type +{l-table.lua}. These files are preloaded.\footnote {In fact, if you write scripts +that need their functionality, you can use \type {mtxrun} to process the script, +as \type {mtxrun} has the core libraries preloaded as well.} For instance, if you +want to inspect a table, you can say: + +\starttyping +local t = { "aap", "noot", "mies" } +table.print(t) +\stoptyping + +You can get an overview of what is implemented by running the following command: + +\starttyping +context s-tra-02 --mode=tablet +\stoptyping + +{\em todo: add nice synonym for this module and also add helpinfo at the to so +that we can do \type {context --styles}} + +\stopsection + +\startsection[title=Comment] + +\index{comment} + +You can add comments to your \LUA\ code. There are basically two methods: one +liners and multi line comments. + +\starttyping +local option = "test" -- use this option with care + +local method = "unknown" --[[comments can be very long and when entered + this way they and span multiple lines]] +\stoptyping + +The so called long comments look like long strings preceded by \type {--} and +there can be more complex boundary sequences. + +\stopsection + +\startsection[title=Pitfalls] + +Sometimes \type {nil} can bite you, especially in tables, as they have a dual nature: +indexed as well as hashed. + +\startbuffer +\startluacode +local n1 = # { nil, 1, 2, nil } -- 3 +local n2 = # { nil, nil, 1, 2, nil } -- 0 + +context("n1 = %s and n2 = %s",n1,n2) +\stopluacode +\stopbuffer + +\typebuffer + +results in: \getbuffer + +So, you cannot really depend on the length operator here. On the other hand, with: + +\startbuffer +\startluacode +local function check(...) + return select("#",...) +end + +local n1 = check ( nil, 1, 2, nil ) -- 4 +local n2 = check ( nil, nil, 1, 2, nil ) -- 5 + +context("n1 = %s and n2 = %s",n1,n2) +\stopluacode +\stopbuffer + +\typebuffer + +we get: \getbuffer, so the \type {select} is quite useable. However, that function also +has its specialities. The following example needs some close reading: + +\startbuffer +\startluacode +local function filter(n,...) + return select(n,...) +end + +local v1 = { filter ( 1, 1, 2, 3 ) } +local v2 = { filter ( 2, 1, 2, 3 ) } +local v3 = { filter ( 3, 1, 2, 3 ) } + +context("v1 = %+t and v2 = %+t and v3 = %+t",v1,v2,v3) +\stopluacode +\stopbuffer + +\typebuffer + +We collect the result in a table and show the concatination: + +\getbuffer + +So, what you effectively get is the whole list starting with the given offset. + +\startbuffer +\startluacode +local function filter(n,...) + return (select(n,...)) +end + +local v1 = { filter ( 1, 1, 2, 3 ) } +local v2 = { filter ( 2, 1, 2, 3 ) } +local v3 = { filter ( 3, 1, 2, 3 ) } + +context("v1 = %+t and v2 = %+t and v3 = %+t",v1,v2,v3) +\stopluacode +\stopbuffer + +\typebuffer + +Now we get: \getbuffer. The extra \type {()} around the result makes sure that +we only get one return value. + +Of course the same effect can be achieved as follows: + +\starttyping +local function filter(n,...) + return select(n,...) +end + +local v1 = filter ( 1, 1, 2, 3 ) +local v2 = filter ( 2, 1, 2, 3 ) +local v3 = filter ( 3, 1, 2, 3 ) + +context("v1 = %s and v2 = %s and v3 = %s",v1,v2,v3) +\stoptyping + +\stopsection + +\startsection[title={A few suggestions}] + +You can wrap all kind of functionality in functions but sometimes it makes no +sense to add the overhead of a call as the same can be done with hardly any code. + +If you want a slice of a table, you can copy the range needed to a new table. A +simple version with no bounds checking is: + +\starttyping +local new = { } for i=a,b do new[#new+1] = old[i] end +\stoptyping + +Another, much faster, variant is the following. + +\starttyping +local new = { unpack(old,a,b) } +\stoptyping + +You can use this variant for slices that are not extremely large. The function +\type {table.sub} is an equivalent: + +\starttyping +local new = table.sub(old,a,b) +\stoptyping + +An indexed table is empty when its size equals zero: + +\starttyping +if #indexed == 0 then ... else ... end +\stoptyping + +Sometimes this is better: + +\starttyping +if indexed and #indexed == 0 then ... else ... end +\stoptyping + +So how do we test if a hashed table is empty? We can use the +\type {next} function as in: + +\starttyping +if hashed and next(indexed) then ... else ... end +\stoptyping + +Say that we have the following table: + +\starttyping +local t = { a=1, b=2, c=3 } +\stoptyping + +The call \type {next(t)} returns the first key and value: + +\starttyping +local k, v = next(t) -- "a", 1 +\stoptyping + +The second argument to \type {next} can be a key in which case the +following key and value in the hash table is returned. The result +is not predictable as a hash is unordered. The generic for loop +uses this to loop over a hashed table: + +\starttyping +for k, v in next, t do + ... +end +\stoptyping + +Anyway, when \type {next(t)} returns zero you can be sure that the table is +empty. This is how you can test for exactly one entry: + +\starttyping +if t and not next(t,next(t)) then ... else ... end +\stoptyping + +Here it starts making sense to wrap it into a function. + +\starttyping +function table.has_one_entry(t) + t and not next(t,next(t)) +end +\stoptyping + +On the other hand, this is not that usefull, unless you can spent the runtime on +it: + +\starttyping +function table.is_empty(t) + return not t or not next(t) +end +\stoptyping + +\stopsection + +\startsection[title=Interfacing] + +We have already seen that you can embed \LUA\ code using commands like: + +\starttyping +\startluacode + print("this works") +\stopluacode +\stoptyping + +This command should not be confused with: + +\starttyping +\startlua + print("this works") +\stoplua +\stoptyping + +The first variant has its own catcode regime which means that tokens between the start +and stop command are treated as \LUA\ tokens, with the exception of \TEX\ commands. The +second variant operates under the regular \TEX\ catcode regime. + +Their short variants are \type {\ctxluacode} and \type {\ctxlua} as in: + +\starttyping +\ctxluacode{print("this works")} +\ctxlua{print("this works")} +\stoptyping + +In practice you will probably use \type {\startluacode} when using or defining % \stopluacode +a blob of \LUA\ and \type {\ctxlua} for inline code. Keep in mind that the +longer versions need more initialization and have more overhead. + +There are some more commands. For instance \type {\ctxcommand} can be used as +an efficient way to access functions in the \type {commands} namespace. The +following two calls are equivalent: + +\starttyping +\ctxlua {commands.thisorthat("...")} +\ctxcommand {thisorthat("...")} +\stoptyping + +There are a few shortcuts to the \type {context} namespace. Their use can best be +seen from their meaning: + +\starttyping +\cldprocessfile#1{\directlua{context.runfile("#1")}} +\cldloadfile #1{\directlua{context.loadfile("#1")}} +\cldcontext #1{\directlua{context(#1)}} +\cldcommand #1{\directlua{context.#1}} +\stoptyping + +The \type {\directlua{}} command can also be implemented using the token parser +and \LUA\ itself. A variant is therefore \type {\luascript{}} which can be +considered an alias but with a bit different error reporting. A variant on this +is the \type {\luathread {name} {code}} command. Here is an example of their +usage: + +\startbuffer +\luascript { context("foo 1:") context(i) } \par +\luathread {test} { i = 10 context("bar 1:") context(i) } \par +\luathread {test} { context("bar 2:") context(i) } \par +\luathread {test} {} % resets +\luathread {test} { context("bar 3:") context(i) } \par +\luascript { context("foo 2:") context(i) } \par +\stopbuffer + +\typebuffer + +These commands result in: + +\startpacked \getbuffer \stoppacked + +% \testfeatureonce{100000}{\directlua {local a = 10 local a = 10 local a = 10}} % 0.53s +% \testfeatureonce{100000}{\luascript {local a = 10 local a = 10 local a = 10}} % 0.62s +% \testfeatureonce{100000}{\luathread {test} {local a = 10 local a = 10 local a = 10}} % 0.79s + +The variable \type {i} is local to the thread (which is not really a thread in +\LUA\ but more a named piece of code that provides an environment which is shared +over the calls with the same name. You will probably never need these. + +Each time a call out to \LUA\ happens the argument eventually gets parsed, converted +into tokens, then back into a string, compiled to bytecode and executed. The next +example code shows a mechanism that avoids this: + +\starttyping +\startctxfunction MyFunctionA + context(" A1 ") +\stopctxfunction + +\startctxfunctiondefinition MyFunctionB + context(" B2 ") +\stopctxfunctiondefinition +\stoptyping + +The first command associates a name with some \LUA\ code and that code can be +executed using: + +\starttyping +\ctxfunction{MyFunctionA} +\stoptyping + +The second definition creates a command, so there we do: + +\starttyping +\MyFunctionB +\stoptyping + +There are some more helpers but for use in document sources they make less sense. You +can always browse the source code for examples. + +\stopsection + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/cld/cld-afewdetails.tex b/doc/context/sources/general/manuals/cld/cld-afewdetails.tex new file mode 100644 index 000000000..6c0cf3afa --- /dev/null +++ b/doc/context/sources/general/manuals/cld/cld-afewdetails.tex @@ -0,0 +1,398 @@ +% language=uk + +\startcomponent cld-afewdetails + +\environment cld-environment + +\startchapter[title=A few Details] + +\startsection[title=Variables] + +\index{user interface} + +Normally it makes most sense to use the English version of \CONTEXT. The +advantage is that you can use English keywords, as in: + +\starttyping +context.framed( { + frame = "on", + }, + "some text" +) +\stoptyping + +If you use the Dutch interface it looks like this: + +\starttyping +context.omlijnd( { + kader = "aan", + }, + "wat tekst" +) +\stoptyping + +A rather neutral way is: + +\starttyping +context.framed( { + frame = interfaces.variables.on, + }, + "some text" +) +\stoptyping + +But as said, normally you will use the English user interface so you can forget +about these matters. However, in the \CONTEXT\ core code you will often see the +variables being used this way because there we need to support all user +interfaces. + +\stopsection + +\startsection[title=Modes] + +\index{modes} +\index{systemmodes} +\index{constants} + +Context carries a concept of modes. You can use modes to create conditional +sections in your style (and|/|or content). You can control modes in your styles +or you can set them at the command line or in job control files. When a mode test +has to be done at processing time, then you need constructs like the following: + +\starttyping +context.doifmodeelse( "screen", + function() + ... -- mode == screen + end, + function() + ... -- mode ~= screen + end +) +\stoptyping + +However, often a mode does not change during a run, and then we can use the +following method: + +\starttyping +if tex.modes["screen"] then + ... +else + ... +end +\stoptyping + +Watch how the \type {modes} table lives in the \type {tex} namespace. We also +have \type {systemmodes}. At the \TEX\ end these are mode names preceded by a +\type {*}, so the following code is similar: + +\starttyping +if tex.modes["*mymode"] then + -- this is the same +elseif tex.systemmodes["mymode"] then + -- test as this +else + -- but not this +end +\stoptyping + +Inside \CONTEXT\ we also have so called constants, and again these can be +consulted at the \LUA\ end: + +\starttyping +if tex.constants["someconstant'] then + ... +else + ... +end +\stoptyping + +But you will hardly need these and, as they are often not public, their +meaning can change, unless of course they {\em are} documented as public. + +\stopsection + +\startsection[title={Token lists}] + +\index{tokens} + +There is normally no need to mess around with nodes and tokens at the \LUA\ end +yourself. However, if you do, then you might want to flush them as well. Say that +at the \TEX\ end we have said: + +\startbuffer +\toks0 = {Don't get \inframed{framed}!} +\stopbuffer + +\typebuffer \getbuffer + +Then at the \LUA\ end you can say: + +\startbuffer +context(tex.toks[0]) +\stopbuffer + +\typebuffer + +and get: \ctxluabuffer\ In fact, token registers are exposed as strings so here, +register zero has type \type {string} and is treated as such. + +\startbuffer +context("< %s >",tex.toks[0]) +\stopbuffer + +\typebuffer + +This gives: \ctxluabuffer. But beware, if you go the reverse way, you don't get +what you might expect: + +\startbuffer +tex.toks[0] = [[\framed{oeps}]] +\stopbuffer + +\typebuffer \ctxluabuffer + +If we now say \type{\the\toks0} we will get {\tttf \the\toks0} as +all tokens are considered to be letters. + +\stopsection + +\startsection[title={Node lists}] + +\index{nodes} + +If you're not deep into \TEX\ you will never feel the need to manipulate node +lists yourself, but you might want to flush boxes. As an example we put something +in box zero (one of the scratch boxes). + +\startbuffer +\setbox0 = \hbox{Don't get \inframed{framed}!} +\stopbuffer + +\typebuffer \getbuffer + +At the \TEX\ end you can flush this box (\type {\box0}) or take a copy +(\type{\copy0}). At the \LUA\ end you would do: + +\starttyping +context.copy() +context.direct(0) +\stoptyping + +or: + +\starttyping +context.copy(false,0) +\stoptyping + +but this works as well: + +\startbuffer +context(node.copy_list(tex.box[0])) +\stopbuffer + +\typebuffer + +So we get: \ctxluabuffer\ If you do: + +\starttyping +context(tex.box[0]) +\stoptyping + +you also need to make sure that the box is freed but let's not go into those +details now. + +Here is an example if messing around with node lists that get seen before a +paragraph gets broken into lines, i.e.\ when hyphenation, font manipulation etc +take place. First we define some colors: + +\startbuffer +\definecolor[mynesting:0][r=.6] +\definecolor[mynesting:1][g=.6] +\definecolor[mynesting:2][r=.6,g=.6] +\stopbuffer + +\typebuffer \getbuffer + +Next we define a function that colors nodes in such a way that we can see the +different processing stages. + +\startbuffer +\startluacode +local enabled = false +local count = 0 +local setcolor = nodes.tracers.colors.set + +function userdata.processmystuff(head) + if enabled then + local color = "mynesting:" .. (count % 3) + -- for n in node.traverse(head) do + for n in node.traverse_id(nodes.nodecodes.glyph,head) do + setcolor(n,color) + end + count = count + 1 + return head, true + end + return head, false +end + +function userdata.enablemystuff() + enabled = true +end + +function userdata.disablemystuff() + enabled = false +end +\stopluacode +\stopbuffer + +\typebuffer \getbuffer + +We hook this function into the normalizers category of the processor callbacks: + +\startbuffer +\startluacode +nodes.tasks.appendaction("processors", "normalizers", "userdata.processmystuff") +\stopluacode +\stopbuffer + +\typebuffer \getbuffer + +We now can enable this mechanism and show an example: + +\startbuffer +\startbuffer +Node lists are processed \hbox {nested from \hbox{inside} out} which is not +what you might expect. But, \hbox{coloring} does not \hbox {happen} really +nested here, more \hbox {in} \hbox {the} \hbox {order} \hbox {of} \hbox +{processing}. +\stopbuffer + +\ctxlua{userdata.enablemystuff()} +\par \getbuffer \par +\ctxlua{userdata.disablemystuff()} +\stopbuffer + +\typebuffer + +The \type {\par} is needed because otherwise the processing is already disabled +before the paragraph gets seen by \TEX. + +\blank \getbuffer \blank + +\startbuffer +\startluacode +nodes.tasks.disableaction("processors", "userdata.processmystuff") +\stopluacode +\stopbuffer + +\typebuffer + +Instead of using an boolean to control the state, we can also do this: + +\starttyping +\startluacode +local count = 0 +local setcolor = nodes.tracers.colors.set + +function userdata.processmystuff(head) + count = count + 1 + local color = "mynesting:" .. (count % 3) + for n in node.traverse_id(nodes.nodecodes.glyph,head) do + setcolor(n,color) + end + return head, true +end + +nodes.tasks.appendaction("processors", "after", "userdata.processmystuff") +\stopluacode +\stoptyping + +\startbuffer +\startluacode +nodes.tasks.disableaction("processors", "userdata.processmystuff") +\stopluacode +\stopbuffer + +Disabling now happens with: + +\typebuffer \getbuffer + +As you might want to control these things in more details, a simple helper +mechanism was made: markers. The following example code shows the way: + +\startbuffer +\definemarker[mymarker] +\stopbuffer + +\typebuffer \getbuffer + +Again we define some colors: + +\startbuffer +\definecolor[mymarker:1][r=.6] +\definecolor[mymarker:2][g=.6] +\definecolor[mymarker:3][r=.6,g=.6] +\stopbuffer + +\typebuffer \getbuffer + +The \LUA\ code like similar to the code presented before: + +\startbuffer +\startluacode +local setcolor = nodes.tracers.colors.setlist +local getmarker = nodes.markers.get +local hlist_code = nodes.codes.hlist +local traverse_id = node.traverse_id + +function userdata.processmystuff(head) + for n in traverse_id(hlist_code,head) do + local m = getmarker(n,"mymarker") + if m then + setcolor(n.list,"mymarker:" .. m) + end + end + return head, true +end + +nodes.tasks.appendaction("processors", "after", "userdata.processmystuff") +nodes.tasks.disableaction("processors", "userdata.processmystuff") +\stopluacode +\stopbuffer + +\typebuffer \getbuffer + +This time we disabled the processor (if only because in this document we don't +want the overhead. + +\startbuffer +\startluacode +nodes.tasks.enableaction("processors", "userdata.processmystuff") +\stopluacode + +Node lists are processed \hbox \boxmarker{mymarker}{1} {nested from \hbox{inside} +out} which is not what you might expect. But, \hbox {coloring} does not \hbox +{happen} really nested here, more \hbox {in} \hbox \boxmarker{mymarker}{2} {the} +\hbox {order} \hbox {of} \hbox \boxmarker{mymarker}{3} {processing}. + +\startluacode +nodes.tasks.disableaction("processors", "userdata.processmystuff") +\stopluacode +\stopbuffer + +\typebuffer + +The result looks familiar: + +\getbuffer + +% We don't want the burden of this demo to cary on: + +% {\em If there's enough interest I will expand this section with some basic +% information on what nodes are.} + +\stopsection + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/cld/cld-backendcode.tex b/doc/context/sources/general/manuals/cld/cld-backendcode.tex new file mode 100644 index 000000000..9c1284baa --- /dev/null +++ b/doc/context/sources/general/manuals/cld/cld-backendcode.tex @@ -0,0 +1,388 @@ +% language=uk + +\startcomponent cld-backendcode + +\environment cld-environment + +% derived from hybrid + +\startchapter[title={Backend code}] + +\startsection [title={Introduction}] + +In \CONTEXT\ we've always separated the backend code in so called driver files. +This means that in the code related to typesetting only calls to the \API\ take +place, and no backend specific code is to be used. Currently a \PDF\ backend is +supported as well as an \XML\ export. \footnote {This chapter is derived from an +article on these matters. You can find nore information in \type {hybrid.pdf}.} + +Some \CONTEXT\ users like to add their own \PDF\ specific code to their styles or +modules. However, such extensions can interfere with existing code, especially +when resources are involved. Therefore the construction of \PDF\ data structures +and resources is rather controlled and has to be done via the official helper +macros. + +\stopsection + +\startsection [title={Structure}] + +A \PDF\ file is a tree of indirect objects. Each object has a number and the file +contains a table (or multiple tables) that relates these numbers to positions in +a file (or position in a compressed object stream). That way a file can be viewed +without reading all data: a viewer only loads what is needed. + +\starttyping +1 0 obj << + /Name (test) /Address 2 0 R +>> +2 0 obj [ + (Main Street) (24) (postal code) (MyPlace) +] +\stoptyping + +For the sake of the discussion we consider strings like \type {(test)} also to be +objects. In the next table we list what we can encounter in a \PDF\ file. There +can be indirect objects in which case a reference is used (\type{2 0 R}) and +direct ones. + +It all starts in the document's root object. From there we access the page tree +and resources. Each page carries its own resource information which makes random +access easier. A page has a page stream and there we find the to be rendered +content as a mixture of (\UNICODE) strings and special drawing and rendering +operators. Here we will not discuss them as they are mostly generated by the +engine itself or dedicated subsystems like the \METAPOST\ converter. There we use +literal or \type {\latelua} whatsits to inject code into the current stream. + +\stopsection + +\startsection [title={Data types}] + +There are several datatypes in \PDF\ and we support all of them one way or the +other. + +\starttabulate[|l|l|p|] +\FL +\NC \bf type \NC \bf form \NC \bf meaning \NC \NR +\TL +\NC constant \NC \type{/...} \NC A symbol (prescribed string). \NC \NR +\NC string \NC \type{(...)} \NC A sequence of characters in pdfdoc + encoding \NC \NR +\NC unicode \NC \type{<...>} \NC A sequence of characters in utf16 + encoding \NC \NR +\NC number \NC \type{3.1415} \NC A number constant. \NC \NR +\NC boolean \NC \type{true/false} \NC A boolean constant. \NC \NR +\NC reference \NC \type{N 0 R} \NC A reference to an object \NC \NR +\NC dictionary \NC \type{<< ... >>} \NC A collection of key value pairs + where the value itself is an (indirect) object. + \NC \NR +\NC array \NC \type{[ ... ]} \NC A list of objects or references to + objects. \NC \NR +\NC stream \NC \NC A sequence of bytes either or not packaged with + a dictionary that contains descriptive data. \NC \NR +\NC xform \NC \NC A special kind of object containing an reusable + blob of data, for example an image. \NC \NR +\LL +\stoptabulate + +While writing additional backend code, we mostly create dictionaries. + +\starttyping +<< /Name (test) /Address 2 0 R >> +\stoptyping + +In this case the indirect object can look like: + +\starttyping +[ (Main Street) (24) (postal code) (MyPlace) ] +\stoptyping + +The \LUATEX\ manual mentions primitives like \type {\pdfobj}, \type {\pdfannot}, +\type {\pdfcatalog}, etc. However, in \MKIV\ no such primitives are used. You can +still use many of them but those that push data into document or page related +resources are overloaded to do nothing at all. + +In the \LUA\ backend code you will find function calls like: + +\starttyping +local d = lpdf.dictionary { + Name = lpdf.string("test"), + Address = lpdf.array { + "Main Street", "24", "postal code", "MyPlace", + } +} +\stoptyping + +Equaly valid is: + +\starttyping +local d = lpdf.dictionary() +d.Name = "test" +\stoptyping + +Eventually the object will end up in the file using calls like: + +\starttyping +local r = lpdf.immediateobject(tostring(d)) +\stoptyping + +or using the wrapper (which permits tracing): + +\starttyping +local r = lpdf.flushobject(d) +\stoptyping + +The object content will be serialized according to the formal specification so +the proper \type {<< >>} etc.\ are added. If you want the content instead you can +use a function call: + +\starttyping +local dict = d() +\stoptyping + +An example of using references is: + +\starttyping +local a = lpdf.array { + "Main Street", "24", "postal code", "MyPlace", +} +local d = lpdf.dictionary { + Name = lpdf.string("test"), + Address = lpdf.reference(a), +} +local r = lpdf.flushobject(d) +\stoptyping + +\stopsection + +We have the following creators. Their arguments are optional. + +\starttabulate[|l|p|] +\FL +\NC \bf function \NC \bf optional parameter \NC \NR +\TL +\NC \type{lpdf.null} \NC \NC \NR +\NC \type{lpdf.number} \NC number \NC \NR +\NC \type{lpdf.constant} \NC string \NC \NR +\NC \type{lpdf.string} \NC string \NC \NR +\NC \type{lpdf.unicode} \NC string \NC \NR +\NC \type{lpdf.boolean} \NC boolean \NC \NR +\NC \type{lpdf.array} \NC indexed table of objects \NC \NR +\NC \type{lpdf.dictionary} \NC hash with key/values \NC \NR +%NC \type{lpdf.stream} \NC indexed table of operators \NC \NR +\NC \type{lpdf.reference} \NC string \NC \NR +\NC \type{lpdf.verbose} \NC indexed table of strings \NC \NR +\LL +\stoptabulate + +\ShowLuaExampleString{tostring(lpdf.null())} +\ShowLuaExampleString{tostring(lpdf.number(123))} +\ShowLuaExampleString{tostring(lpdf.constant("whatever"))} +\ShowLuaExampleString{tostring(lpdf.string("just a string"))} +\ShowLuaExampleString{tostring(lpdf.unicode("just a string"))} +\ShowLuaExampleString{tostring(lpdf.boolean(true))} +\ShowLuaExampleString{tostring(lpdf.array { 1, lpdf.constant("c"), true, "str" })} +\ShowLuaExampleString{tostring(lpdf.dictionary { a=1, b=lpdf.constant("c"), d=true, e="str" })} +%ShowLuaExampleString{tostring(lpdf.stream("whatever"))} +\ShowLuaExampleString{tostring(lpdf.reference(123))} +\ShowLuaExampleString{tostring(lpdf.verbose("whatever"))} + +\stopsection + +\startsection[title={Managing objects}] + +Flushing objects is done with: + +\starttyping +lpdf.flushobject(obj) +\stoptyping + +Reserving object is or course possible and done with: + +\starttyping +local r = lpdf.reserveobject() +\stoptyping + +Such an object is flushed with: + +\starttyping +lpdf.flushobject(r,obj) +\stoptyping + +We also support named objects: + +\starttyping +lpdf.reserveobject("myobject") + +lpdf.flushobject("myobject",obj) +\stoptyping + +A delayed object is created with: + +\starttyping +local ref = pdf.delayedobject(data) +\stoptyping + +The data will be flushed later using the object number that is returned (\type +{ref}). When you expect that many object with the same content are used, you can +use: + +\starttyping +local obj = lpdf.shareobject(data) +local ref = lpdf.shareobjectreference(data) +\stoptyping + +This one flushes the object and returns the object number. Already defined +objects are reused. In addition to this code driven optimization, some other +optimization and reuse takes place but all that happens without user +intervention. Only use this when it's really needed as it might consume more +memory and needs more processing time. + +\startsection [title={Resources}] + +While \LUATEX\ itself will embed all resources related to regular typesetting, +\MKIV\ has to take care of embedding those related to special tricks, like +annotations, spot colors, layers, shades, transparencies, metadata, etc. Because +third party modules (like tikz) also can add resources we provide some macros +that makes sure that no interference takes place: + +\starttyping +\pdfbackendsetcatalog {key}{string} +\pdfbackendsetinfo {key}{string} +\pdfbackendsetname {key}{string} + +\pdfbackendsetpageattribute {key}{string} +\pdfbackendsetpagesattribute{key}{string} +\pdfbackendsetpageresource {key}{string} + +\pdfbackendsetextgstate {key}{pdfdata} +\pdfbackendsetcolorspace {key}{pdfdata} +\pdfbackendsetpattern {key}{pdfdata} +\pdfbackendsetshade {key}{pdfdata} +\stoptyping + +One is free to use the \LUA\ interface instead, as there one has more +possibilities but when code is shared with other macro packages the macro +interface makes more sense. The names of the \LUA\ functions are similar, like: + +\starttyping +lpdf.addtoinfo(key,anything_valid_pdf) +\stoptyping + +Currently we expose a bit more of the backend code than we like and +future versions will have a more restricted access. The following +function will stay public: + +\starttyping +lpdf.addtopageresources (key,value) +lpdf.addtopageattributes (key,value) +lpdf.addtopagesattributes(key,value) + +lpdf.adddocumentextgstate(key,value) +lpdf.adddocumentcolorspac(key,value) +lpdf.adddocumentpattern (key,value) +lpdf.adddocumentshade (key,value) + +lpdf.addtocatalog (key,value) +lpdf.addtoinfo (key,value) +lpdf.addtonames (key,value) +\stoptyping + +\stopsection + +\startsection [title={Annotations}] + +You can use the \LUA\ functions that relate to annotations etc.\ but normally you +will use the regular \CONTEXT\ user interface. You can look into some of the +\type {lpdf-*} modules to see how special annotations can be dealt with. + +\stopsection + +\startsection [title={Tracing}] + +There are several tracing options built in and some more will be added in due +time: + +\starttyping +\enabletrackers + [backend.finalizers, + backend.resources, + backend.objects, + backend.detail] +\stoptyping + +As with all trackers you can also pass them on the command line, for example: + +\starttyping +context --trackers=backend.* yourfile +\stoptyping + +The reference related backend mechanisms have their own trackers. When you write +code that generates \PDF, it also helps to look in the \PDF\ file so see if +things are done right. In that case you need to disable compression: + +\starttyping +\nopdfcompression +\stoptyping + +\stopsection + +\startsection[title={Analyzing}] + +The \type {epdf} library that comes with \LUATEX\ offers a userdata interface to +\PDF\ files. On top of that \CONTEXT\ provides a more \LUA-ish access, using +tables. You can open a \PDF\ file with: + +\starttyping +local mypdf = lpdf.epdf.load(filename) +\stoptyping + +When opening is successful, you have access to a couple of tables: + +\starttyping +\NC \type{pages} \NC indexed \NC \NR +\NC \type{destinations} \NC hashed \NC \NR +\NC \type{javascripts} \NC hashed \NC \NR +\NC \type{widgets} \NC hashed \NC \NR +\NC \type{embeddedfiles} \NC hashed \NC \NR +\NC \type{layers} \NC indexed \NC \NR +\stoptyping + +These provide efficient access to some data that otherwise would take a bit of +code to deal with. Another top level table is the for \PDF\ characteristic \type +{Catalog}. Watch the capitalization: as with other native \PDF\ data structures, +keys are case sensitive and match the standard. + +Here is an example of usage: + +\starttyping +local MyDocument = lpdf.epdf.load("somefile.pdf") + +context.starttext() + + local pages = MyDocument.pages + local nofpages = pages.n + + context.starttabulate { "|c|c|c|" } + + context.NC() context("page") + context.NC() context("width") + context.NC() context("height") context.NR() + + for i=1, nofpages do + local page = pages[i] + local bbox = page.CropBox or page.MediaBox + context.NC() context(i) + context.NC() context(bbox[4]-bbox[2]) + context.NC() context(bbox[3]-bbox[1]) context.NR() + end + + context.stoptabulate() + +context.stoptext() +\stoptyping + +\stopsection + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/cld/cld-callbacks.tex b/doc/context/sources/general/manuals/cld/cld-callbacks.tex new file mode 100644 index 000000000..c449af864 --- /dev/null +++ b/doc/context/sources/general/manuals/cld/cld-callbacks.tex @@ -0,0 +1,240 @@ +% language=uk + +\startcomponent cld-callbacks + +\environment cld-environment + +\startchapter[title={Callbacks}] + +\startsection [title={Introduction}] + +\index {callbacks} + +The \LUATEX\ engine provides the usual basic \TEX\ functionality plus a bit more. +It is a deliberate choice not to extend the core engine too much. Instead all +relevant processes can be overloaded by new functionality written in \LUA. In +\CONTEXT\ callbacks are wrapped in a protective layer: on the one hand there is +extra functionality (usually interfaced through macros) and on the other hand +users can pop in their own handlers using hooks. Of course a plugged in function +has to do the right thing and not mess up the data structures. In this chapter +the layer on top of callbacks is described. + +\stopsection + +\startsection [title={Actions}] + +\index {nodelists} + +Nearly all callbacks in \LUATEX\ are used in \CONTEXT. In the following list the +callbacks tagged with \type {enabled} are used and frozen, the ones tagged \type +{disabled} are blocked and never used, while the ones tagged \type {undefined} +are yet unused. + +% \ctxlua{callbacks.table()} % \ctxlua{callbacks.report()} +\ctxcommand{showcallbacks()} + +Eventually all callbacks will be used so don't rely on undefined callbacks not +being protected. Some callbacks are only set when certain functionality is +enabled. + +It may sound somewhat harsh but if users kick in their own code, we cannot +guarantee \CONTEXT's behaviour any more and support becomes a pain. If you really +need to use a callback yourself, you should use one of the hooks and make sure +that you return the right values. + +All callbacks related to file handling, font definition and housekeeping are +frozen and cannot be overloaded. A reason for this are that we need some kind of +protection against misuse. Another reason is that we operate in a well defined +environment, the so called \TEX\ directory structure, and we don't want to mess +with that. And of course, the overloading permits \CONTEXT\ to provide extensions +beyond regular engine functionality. + +So as a fact we only open up some of the node list related callbacks and these +are grouped as follows: + +\starttabulate[|l|l|p|] +\FL +\NC \bf category \NC \bf callback \NC \bf usage \NC \NR +\TL +\NC \type{processors} \NC \type{pre_linebreak_filter} \NC called just before the paragraph is broken into lines \NC \NR +\NC \NC \type{hpack_filter} \NC called just before a horizontal box is constructed \NC \NR +\NC \type{finalizers} \NC \type{post_linebreak_filter} \NC called just after the paragraph has been broken into lines \NC \NR +\NC \type{shipouts} \NC \type{no callback yet} \NC applied to the box (or xform) that is to be shipped out \NC \NR +\NC \type{mvlbuilders} \NC \type{buildpage_filter} \NC called after some material has been added to the main vertical list \NC \NR +\NC \type{vboxbuilders} \NC \type{vpack_filter} \NC called when some material is added to a vertical box \NC \NR +%NC \type{parbuilders} \NC \type{linebreak_filter} \NC called when a paragraph is to be broken into lines \NC \NR +%NC \type{pagebuilders} \NC \type{pre_output_filter} \NC called when a page it fed into the output routing \NC \NR +\NC \type{math} \NC \type{mlist_to_hlist} \NC called just after the math list is created, before it is turned into an horizontal list \NC \NR +\BL +\stoptabulate + +Each category has several subcategories but for users only two make sense: \type +{before} and \type {after}. Say that you want to hook some tracing into the \type +{mvlbuilder}. This is how it's done: + +\starttyping +function third.mymodule.myfunction(where) + nodes.show_simple_list(tex.lists.contrib_head) +end + +nodes.tasks.appendaction("processors", "before", "third.mymodule.myfunction") +\stoptyping + +As you can see, in this case the function gets no \type {head} passed (at least +not currently). This example also assumes that you know how to access the right +items. The arguments and return values are given below. \footnote {This interface +might change a bit in future versions of \CONTEXT. Therefore we will not discuss +the few more optional arguments that are possible.} + +\starttabulate[|l|l|p|] +\FL +\NC \bf category \NC \bf arguments \NC \bf return value \NC \NR +\TL +\NC \type{processors} \NC \type{head, ...} \NC \type{head, done} \NC \NR +\NC \type{finalizers} \NC \type{head, ...} \NC \type{head, done} \NC \NR +\NC \type{shipouts} \NC \type{head} \NC \type{head, done} \NC \NR +\NC \type{mvlbuilders} \NC \NC \type{done} \NC \NR +\NC \type{vboxbuilders} \NC \type{head, ...} \NC \type{head, done} \NC \NR +\NC \type{parbuilders} \NC \type{head, ...} \NC \type{head, done} \NC \NR +\NC \type{pagebuilders} \NC \type{head, ...} \NC \type{head, done} \NC \NR +\NC \type{math} \NC \type{head, ...} \NC \type{head, done} \NC \NR +\LL +\stoptabulate + +\stopsection + +\startsection [title={Tasks}] + +\index {tasks} + +In the previous section we already saw that the actions are in fact tasks and +that we can append (and therefore also prepend) to a list of tasks. The \type +{before} and \type {after} task lists are valid hooks for users contrary to the +other tasks that can make up an action. However, the task builder is generic +enough for users to be used for individual tasks that are plugged into the user +hooks. + +Of course at some point, too many nested tasks bring a performance penalty with +them. At the end of a run \MKIV\ reports some statistics and timings and these +can give you an idea how much time is spent in \LUA. + +The following tables list all the registered tasks for the processors actions: + +\ctxlua{nodes.tasks.table("processors")} + +Some of these do have subtasks and some of these even more, so you can imagine +that quite some action is going on there. + +The finalizer tasks are: + +\ctxlua{nodes.tasks.table("finalizers")} + +Shipouts concern: + +\ctxlua{nodes.tasks.table("shipouts")} + +There are not that many mvlbuilder tasks currently: + +\ctxlua{nodes.tasks.table("mvlbuilders")} + +The vboxbuilder perform similar tasks: + +\ctxlua{nodes.tasks.table("vboxbuilders")} + +In the future we expect to have more parbuilder tasks. Here again there are +subtasks that depend on the current typesetting environment, so this is the right +spot for language specific treatments. + +\ctxlua{nodes.tasks.table("parbuilders")} + +The following actions are applied just before the list is passed on the the +output routine. The return value is a vlist. + +\ctxlua{nodes.tasks.table("pagebuilders")} + +{\em Both the parbuilders and pagebuilder tasks are unofficial and not yet meant +for users.} + +Finally, we have tasks related to the math list: + +\ctxlua{nodes.tasks.table("math")} + +As \MKIV\ is developed in sync with \LUATEX\ and code changes from experimental +to more final and reverse, you should not be too surprised if the registered +function names change. + +You can create your own task list with: + +\starttyping +nodes.tasks.new("mytasks",{ "one", "two" }) +\stoptyping + +After that you can register functions. You can append as well as prepend them +either or not at a specific position. + +\starttyping +nodes.tasks.appendaction ("mytask","one","bla.alpha") +nodes.tasks.appendaction ("mytask","one","bla.beta") + +nodes.tasks.prependaction("mytask","two","bla.gamma") +nodes.tasks.prependaction("mytask","two","bla.delta") + +nodes.tasks.appendaction ("mytask","one","bla.whatever","bla.alpha") +\stoptyping + +Functions can also be removed: + +\starttyping +nodes.tasks.removeaction("mytask","one","bla.whatever") +\stoptyping + +As removal is somewhat drastic, it is also possible to enable and disable +functions. From the fact that with these two functions you don't specify a +category (like \type {one} or \type {two}) you can conclude that the function +names need to be unique within the task list or else all with the same name +within this task will be disabled. + +\starttyping +nodes.tasks.enableaction ("mytask","bla.whatever") +nodes.tasks.disableaction("mytask","bla.whatever") +\stoptyping + +The same can be done with a complete category: + +\starttyping +nodes.tasks.enablegroup ("mytask","one") +nodes.tasks.disablegroup("mytask","one") +\stoptyping + +There is one function left: + +\starttyping +nodes.tasks.actions("mytask",2) +\stoptyping + +This function returns a function that when called will perform the tasks. In this +case the function takes two extra arguments in addition to \type {head}. +\footnote {Specifying this number permits for some optimization but is not really +needed} + +Tasks themselves are implemented on top of sequences but we won't discuss them +here. + +\stopsection + +\startsection [title={Paragraph and page builders}] + +Building paragraphs and pages is implemented differently and has no user hooks. +There is a mechanism for plugins but the interface is quite experimental. + +\stopsection + +\startsection [title={Some examples}] + +{\em todo} + +\stopsection + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/cld/cld-contents.tex b/doc/context/sources/general/manuals/cld/cld-contents.tex new file mode 100644 index 000000000..132da7dff --- /dev/null +++ b/doc/context/sources/general/manuals/cld/cld-contents.tex @@ -0,0 +1,11 @@ +\startcomponent cld-contents + +\environment cld-environment + +\starttitle[title=Contents] + + \placelist[chapter,section][criterium=text,aligntitle=yes] + +\stoptitle + +\stopcomponent diff --git a/doc/context/sources/general/manuals/cld/cld-ctxfunctions.tex b/doc/context/sources/general/manuals/cld/cld-ctxfunctions.tex new file mode 100644 index 000000000..11600b847 --- /dev/null +++ b/doc/context/sources/general/manuals/cld/cld-ctxfunctions.tex @@ -0,0 +1,786 @@ +% language=uk + +\startcomponent cld-ctxfunctions + +\environment cld-environment + +\startchapter[title={The \LUA\ interface code}] + +\startsection[title={Introduction}] + +There is a lot of \LUA\ code in \MKIV. Much is not exposed and a lot of what is +exposed is not meant to be used directly at the \LUA\ end. But there is also +functionality and data that can be accessed without side effects. + +In the following sections a subset of the built in functionality is discussed. +There are often more functions alongside those presented but they might change or +disappear. So, if you use undocumented features, be sure to tag them somehow in +your source code so that you can check them out when there is an update. Best +would be to have more functionality defined local so that it is sort of hidden +but that would be unpractical as for instance functions are often used in other +modules and or have to be available at the \TEX\ end. + +It might be tempting to add your own functions to namespaces created by \CONTEXT\ +or maybe overload some existing ones. Don't do this. First of all, there is no +guarantee that your code will not interfere, nor that it overloads future +functionality. Just use your own namespace. Also, future versions of \CONTEXT\ +might have a couple of protection mechanisms built in. Without doubt the +following sections will be extended as soon as interfaces become more stable. + +\stopsection + +\startsection[title={Characters}] + +% not discussed: +% +% characters.filters.utf.addgrapheme() +% characters.filters.utf.collapse() +% characters.getrange() +% characters.bidi[] +% tex.uprint() +% utf.string() +% characters.flush() + +There are quite some data tables defined but the largest is the character +database. You can consult this table any time you want but you're not supposed to +add or change its content if only because changes will be overwritten when you +update \CONTEXT. Future versions may carry more information. The table can be +accessed using an unicode number. A relative simple entry looks as follows: + +\ShowLuaExampleTableHex{characters.data[0x00C1]} + +Much of this is rather common information but some of it is specific for use with +\CONTEXT. Some characters have even more information, for instance those that +deal with mathematics: + +\ShowLuaExampleTableHex{characters.data[0x2190]} + +Not all characters have a real entry. For instance most \CJK\ characters are +virtual and share the same data: + +\ShowLuaExampleTableHex{characters.data[0x3456]} + +You can also access the table using \UTF\ characters: + +\ShowLuaExampleTable{characters.data["ä"]} + +A more verbose string access is also supported: + +\ShowLuaExampleTableHex{characters.data["U+0070"]} + +Another (less usefull) table contains information about ranges in this character +table. You can access this table using rather verbose names, or you can use +collapsed lowercase variants. + +\ShowLuaExampleTableHex{characters.blocks["CJK Compatibility Ideographs"]} + +\ShowLuaExampleTableHex{characters.blocks["hebrew"]} + +\ShowLuaExampleTableHex{characters.blocks["combiningdiacriticalmarks"]} + +Some fields can be accessed using functions. This can be handy when you need that +information for tracing purposes or overviews. There is some overhead in the +function call, but you get some extra testing for free. You can use characters as +well as numbers as index. + +\ShowLuaExampleString{characters.contextname("ä")} +\ShowLuaExampleString{characters.adobename(228)} +\ShowLuaExampleString{characters.description("ä")} + +The category is normally a two character tag, but you can also ask for a more +verbose variant: + +\ShowLuaExampleString{characters.category(228)} +\ShowLuaExampleString{characters.category(228,true)} + +The more verbose category tags are available in a table: + +\ShowLuaExampleString{characters.categorytags["lu"]} + +There are several fields in a character entry that help us to remap a character. +The \type {lccode} indicates the lowercase code point and the \type {uccode} to +the uppercase code point. The \type {shcode} refers to one or more characters +that have a similar shape. + +\ShowLuaExampleString{characters.shape ("ä")} +\ShowLuaExampleString{characters.uccode("ä")} +\ShowLuaExampleString{characters.lccode("ä")} + +\ShowLuaExampleString{characters.shape (100)} +\ShowLuaExampleString{characters.uccode(100)} +\ShowLuaExampleString{characters.lccode(100)} + +You can use these function or access these fields directly in an +entry, but we also provide a few virtual tables that avoid +accessing the whole entry. This method is rather efficient. + +\ShowLuaExampleString{characters.lccodes["ä"]} +\ShowLuaExampleString{characters.uccodes["ä"]} +\ShowLuaExampleString{characters.shcodes["ä"]} +\ShowLuaExampleString{characters.lcchars["ä"]} +\ShowLuaExampleString{characters.ucchars["ä"]} +\ShowLuaExampleString{characters.shchars["ä"]} + +As with other tables, you can use a number instead of an \UTF\ character. Watch +how we get a table for multiple shape codes but a string for multiple shape +characters. + +\ShowLuaExampleString{characters.lcchars[0x00C6]} +\ShowLuaExampleString{characters.ucchars[0x00C6]} +\ShowLuaExampleString{characters.shchars[0x00C6]} +\ShowLuaExampleTable {characters.shcodes[0x00C6]} + +These codes are used when we manipulate strings. Although there +are \type {upper} and \type {lower} functions in the \type +{string} namespace, the following ones are the real ones to be +used in critical situations. + +\ShowLuaExampleString{characters.lower("ÀÁÂÃÄÅàáâãäå")} +\ShowLuaExampleString{characters.upper("ÀÁÂÃÄÅàáâãäå")} +\ShowLuaExampleString{characters.shaped("ÀÁÂÃÄÅàáâãäå")} + +A rather special one is the following: + +\ShowLuaExampleString{characters.lettered("Only 123 letters + count!")} + +With the second argument is true, spaces are kept and collapsed. Leading and +trailing spaces are stripped. + +\ShowLuaExampleString{characters.lettered("Only 123 letters + count!",true)} + +Access to tables can happen by number or by string, although there are some +limitations when it gets too confusing. Take for instance the number \type {8} +and string \type {"8"}: if we would interpret the string as number we could never +access the entry for the character eight. However, using more verbose hexadecimal +strings works okay. The remappers are also available as functions: + +\ShowLuaExampleString{characters.tonumber("a")} +\ShowLuaExampleString{characters.fromnumber(100)} +\ShowLuaExampleString{characters.fromnumber(0x0100)} +\ShowLuaExampleString{characters.fromnumber("0x0100")} +\ShowLuaExampleString{characters.fromnumber("U+0100")} + +In addition to the already mentioned category information you can also use a more +direct table approach: + +\ShowLuaExampleString{characters.categories["ä"]} +\ShowLuaExampleString{characters.categories[100]} + +In a similar fashion you can test if a given character is in a specific category. +This can save a lot of tests. + +\ShowLuaExampleBoolean{characters.is_character[characters.categories[67]]} +\ShowLuaExampleBoolean{characters.is_character[67]} +\ShowLuaExampleBoolean{characters.is_character[characters.data[67].category]} +\ShowLuaExampleBoolean{characters.is_letter[characters.data[67].category]} +\ShowLuaExampleBoolean{characters.is_command[characters.data[67].category]} + +Another virtual table is the one that provides access to special information, for +instance about how a composed character is made up of components. + +\ShowLuaExampleString{characters.specialchars["ä"]} +\ShowLuaExampleString{characters.specialchars[100]} + +The outcome is often similar to output that uses the shapecode information. + +Although not all the code deep down in \CONTEXT\ is meant for use at the user +level, it sometimes can eb tempting to use data and helpers that are available as +part of the general housekeeping. The next table was used when looking into +sorting Korean. For practical reasons we limit the table to ten entries; +otherwise we would have ended up with hundreds of pages. + +\startbuffer +\startluacode +local data = characters.data +local map = characters.hangul.remapped + +local first, last = characters.getrange("hangulsyllables") + +last = first + 9 -- for now + +context.start() + +context.definedfont { "file:unbatang" } + +context.starttabulate { "|T||T||T||T||T|" } +for unicode = first, last do + local character = data[unicode] + local specials = character.specials + if specials then + context.NC() + context.formatted("%04V",unicode) + context.NC() + context.formatted("%c",unicode) + for i=2,4 do + local chr = specials[i] + if chr then + chr = map[chr] or chr + context.NC() + context.formatted("%04V",chr) + context.NC() + context.formatted("%c",chr) + else + context.NC() + context.NC() + end + end + context.NC() + context(character.description) + context.NC() + context.NR() + end +end +context.stoptabulate() + +context.stop() +\stopluacode +\stopbuffer + +\getbuffer \typebuffer + +\stopsection + +\startsection[title={Fonts}] + +% not discussed (as not too relevant for users): +% +% cache cache_version +% nomath +% units units_per_em +% direction embedding encodingbytes +% boundarychar boundarychar_label +% has_italic has_math +% tounicode sub +% colorscheme (will probably become a hash) +% language script +% spacer +% MathConstants and a few split_names +% +% tables.baselines + +There is a lot of code that deals with fonts but most is considered to be a black +box. When a font is defined, its data is collected and turned into a form that +\TEX\ likes. We keep most of that data available at the \LUA\ end so that we can +later use it when needed. In this chapter we discuss some of the possibilities. +More details can be found in the font manual(s) so we don't aim for completeness +here. + +A font instance is identified by its id, which is a number where zero is reserved +for the so called \type {nullfont}. The current font id can be requested by the +following function. + +\ShowLuaExampleString{fonts.currentid()} + +The \type {fonts.current()} call returns the table with data related to the +current id. You can access the data related to any id as follows: + +\starttyping +local tfmdata = fonts.identifiers[number] +\stoptyping + +Not all entries in the table make sense for the user as some are just meant to +drive the font initialization at the \TEX\ end or the backend. The next table +lists the most important ones. Some of the tables are just shortcuts to en entry +in one of the \type {shared} subtables. + +\starttabulate[|l|Tl|p|] +\NC \type{ascender} \NC number \NC the height of a line conforming the font \NC \NR +\NC \type{descender} \NC number \NC the depth of a line conforming the font \NC \NR +\NC \type{italicangle} \NC number \NC the angle of the italic shapes (if present) \NC \NR +\NC \type{designsize} \NC number \NC the design size of the font (if known) \NC \NR +\ML +\NC \type{size} \NC number \NC the size in scaled points if the font instance \NC \NR +\NC \type{factor} \NC number \NC the multiplication factor for unscaled dimensions \NC \NR +\NC \type{hfactor} \NC number \NC the horizontal multiplication factor \NC \NR +\NC \type{vfactor} \NC number \NC the vertical multiplication factor \NC \NR +\NC \type{extend} \NC number \NC the horizontal scaling to be used by the backend \NC \NR +\NC \type{slant} \NC number \NC the slanting to be applied by the backend \NC \NR +\ML +\NC \type{characters} \NC table \NC the scaled character (glyph) information (tfm) \NC \NR +\NC \type{descriptions} \NC table \NC the original unscaled glyph information (otf, afm, tfm) \NC \NR +\NC \type{indices} \NC table \NC the mapping from unicode slot to glyph index \NC \NR +\NC \type{unicodes} \NC table \NC the mapoing from glyph names to unicode \NC \NR +\NC \type{marks} \NC table \NC a hash table with glyphs that are marks as entry \NC \NR +\NC \type{parameters} \NC table \NC the font parameters as \TEX\ likes them \NC \NR +\NC \type{mathconstants} \NC table \NC the \OPENTYPE\ math parameters \NC \NR +\NC \type{mathparameters} \NC table \NC a reference to the \type {MathConstants} table \NC \NR +\NC \type{shared} \NC table \NC a table with information shared between instances \NC \NR +\NC \type{unique} \NC table \NC a table with information unique for this instance \NC \NR +\NC \type{unscaled} \NC table \NC the unscaled (intermediate) table \NC \NR +\NC \type{goodies} \NC table \NC the \CONTEXT\ specific extra font information \NC \NR +\NC \type{fonts} \NC table \NC the table with references to other fonts \NC \NR +\NC \type{cidinfo} \NC table \NC a table with special information for the backend \NC \NR +\ML +\NC \type{filename} \NC string \NC the full path of the loaded font \NC \NR +\NC \type{fontname} \NC string \NC the font name as specified in the font (limited in size) \NC \NR +\NC \type{fullname} \NC string \NC the complete font name as specified in the font \NC \NR +\NC \type{name} \NC string \NC the (short) name of the font \NC \NR +\NC \type{psname} \NC string \NC the (unique) name of the font as used by the backend \NC \NR +\ML +\NC \type{hash} \NC string \NC the hash that makes this instance unique \NC \NR +\NC \type{id} \NC number \NC the id (number) that \TEX\ will use for this instance \NC \NR +\ML +\NC \type{type} \NC string \NC an idicator if the font is \type {virtual} or \type {real} \NC \NR +\NC \type{format} \NC string \NC a qualification for this font, e.g.\ \type {opentype} \NC \NR +\NC \type{mode} \NC string \NC the \CONTEXT\ processing mode, \type {node} or \type {base} \NC \NR +\ML +\stoptabulate + +The \type {parameters} table contains variables that are used by \TEX\ itself. +You can use numbers as index and these are equivalent to the so called \type +{\fontdimen} variables. More convenient is is to access by name: + +\starttabulate[|l|p|] +\NC \type{slant} \NC the slant per point (seldom used) \NC \NR +\NC \type{space} \NC the interword space \NC \NR +\NC \type{spacestretch} \NC the interword stretch \NC \NR +\NC \type{spaceshrink} \NC the interword shrink \NC \NR +\NC \type{xheight} \NC the x|-|height (not per se the heigth of an x) \NC \NR +\NC \type{quad} \NC the so called em|-|width (often the width of an emdash)\NC \NR +\NC \type{extraspace} \NC additional space added in specific situations \NC \NR +\stoptabulate + +The math parameters are rather special and explained in the \LUATEX\ manual. +Quite certainly you never have to touch these parameters at the \LUA\ end. + +En entry in the \type {characters} table describes a character if we have entries +within the \UNICODE\ range. There can be entries in the private area but these +are normally variants of a shape or special math glyphs. + +\starttabulate[|l|p|] +\NC \type{name} \NC the name of the character \NC \NR +\NC \type{index} \NC the index in the raw font table \NC \NR +\NC \type{height} \NC the scaled height of the character \NC \NR +\NC \type{depth} \NC the scaled depth of the character \NC \NR +\NC \type{width} \NC the scaled height of the character \NC \NR +\NC \type{tounicode} \NC a \UTF-16 string representing the conversion back to unicode \NC \NR +\NC \type{expansion_factor} \NC a multiplication factor for (horizontal) font expansion \NC \NR +\NC \type{left_protruding} \NC a multiplication factor for left side protrusion \NC \NR +\NC \type{right_protruding} \NC a multiplication factor for right side protrusion \NC \NR +\NC \type{italic} \NC the italic correction \NC \NR +\NC \type{next} \NC a pointer to the next character in a math size chain \NC \NR +\NC \type{vert_variants} \NC a pointer to vertical variants conforming \OPENTYPE\ math \NC \NR +\NC \type{horiz_variants} \NC a pointer to horizontal variants conforming \OPENTYPE\ math \NC \NR +\NC \type{top_accent} \NC information with regards to math top accents \NC \NR +\NC \type{mathkern} \NC a table describing stepwise math kerning (following the shape) \NC \NR +\NC \type{kerns} \NC a table with intercharacter kerning dimensions \NC \NR +\NC \type{ligatures} \NC a (nested) table describing ligatures that start with this character \NC \NR +\NC \type{commands} \NC a table with commands that drive the backend code for a virtual shape \NC \NR +\stoptabulate + +Not all entries are present for each character. Also, in so called \type {node} +mode, the \type {ligatures} and \type {kerns} tables are empty because in that +case they are dealt with at the \LUA\ end and not by \TEX. + +% \startluacode +% local tfmdata = fonts.current() +% context.starttabulate{ "|l|pl|" } +% for k, v in table.sortedhash(tfmdata) do +% local tv = type(v) +% if tv == "string" or tv == "number" or tv == "boolean" then +% context.NC() +% string.tocontext(k) +% context.NC() +% string.tocontext(tostring(v)) +% context.NC() +% context.NR() +% end +% end +% context.stoptabulate() +% \stopluacode + +% \ShowLuaExampleTable{table.sortedkeys(fonts.current())} + +Say that you run into a glyph node and want to access the data related to that +glyph. Given that variable \type {n} points to the node, the most verbose way of +doing that is: + +\starttyping +local g = fonts.identifiers[n.id].characters[n.char] +\stoptyping + +Given the speed of \LUATEX\ this is quite fast. Another method is the following: + +\starttyping +local g = fonts.characters[n.id][n.char] +\stoptyping + +For some applications you might want faster access to critical +parameters, like: + +\starttyping +local quad = fonts.quads [n.id][n.char] +local xheight = fonts.xheights[n.id][n.char] +\stoptyping + +but that only makes sense when you don't access more than one such variable at +the same time. + +Among the shared tables is the feature specification: + +\ShowLuaExampleTable{fonts.current().shared.features} + +As features are a prominent property of \OPENTYPE\ fonts, there are a few +datatables that can be used to get their meaning. + +\ShowLuaExampleString{fonts.handlers.otf.tables.features['liga']} +\ShowLuaExampleString{fonts.handlers.otf.tables.languages['nld']} +\ShowLuaExampleString{fonts.handlers.otf.tables.scripts['arab']} + +There is a rather extensive font database built in but discussing its interface +does not make much sense. Most usage happens automatically when you use the \type +{name:} and \type {spec:} methods of defining fonts and the \type {mtx-fonts} +script is built on top of it. + +\ctxlua{fonts.names.load()} % could be metatable driven + +\ShowLuaExampleTable{table.sortedkeys(fonts.names.data)} + +You can load the database (if it's not yet loaded) with: + +\starttyping +names.load(reload,verbose) +\stoptyping + +When the first argument is true, the database will be rebuild. The second +arguments controls verbosity. + +Defining a font normally happens at the \TEX\ end but you can also do it in \LUA. + +\starttyping +local id, fontdata = fonts.definers.define { + lookup = "file", -- use the filename (file spec name) + name = "pagella-regular", -- in this case the filename + size = 10*65535, -- scaled points + global = false, -- define the font globally + cs = "MyFont", -- associate the name \MyFont + method = "featureset", -- featureset or virtual (* or @) + sub = nil, -- no subfont specifier + detail = "whatever", -- the featureset (or whatever method applies) +} +\stoptyping + +In this case the \type {detail} variable defines what featureset has to be +applied. You can define such sets at the \LUA\ end too: + +\starttyping +fonts.definers.specifiers.presetcontext ( + "whatever", + "default", + { + mode = "node", + dlig = "yes", + } +) +\stoptyping + +The first argument is the name of the featureset. The second argument can be an +empty string or a reference to an existing featureset that will be taken as +starting point. The final argument is the featureset. This can be a table or a +string with a comma separated list of key|/|value pairs. + +\stopsection + +\startsection[title={Nodes}] + +Nodes are the building blocks that make a document reality. Nodes are linked into +lists and at various moments in the typesetting process you can manipulate them. +Deep down in \CONTEXT\ we use quite some \LUA\ magic to manipulate lists of +nodes. Therefore it is no surprise that we have some tracing available. Take the +following box. + +\startbuffer +\setbox0\hbox{It's in \hbox{\bf all} those nodes.} +\stopbuffer + +\typebuffer \getbuffer + +This box contains characters and glue between the words. The box is already +constructed. There can also be kerns between characters, but of course only if +the font provides such a feature. Let's inspect this box: + +\ShowLuaExampleString{nodes.toutf(tex.box[0])} +\ShowLuaExampleString{nodes.toutf(tex.box[0].list)} + +This tracer returns the text and spacing and recurses into nested lists. The next +tracer does not do this and marks non glyph nodes as \type {[-]}: + +\ShowLuaExampleString{nodes.listtoutf(tex.box[0])} +\ShowLuaExampleString{nodes.listtoutf(tex.box[0].list)} + +A more verbose tracer is the next one. It does show a bit more detailed +information about the glyphs nodes. + +\ShowLuaExampleString{nodes.tosequence(tex.box[0])} +\ShowLuaExampleString{nodes.tosequence(tex.box[0].list)} + +The fourth tracer does not show that detail and collapses sequences of similar +node types. + +\ShowLuaExampleString{nodes.idstostring(tex.box[0])} +\ShowLuaExampleString{nodes.idstostring(tex.box[0].list)} + +The number of nodes in a list is identified with the \type {countall} function. +Nested nodes are counted too. + +\ShowLuaExampleString{nodes.countall(tex.box[0])} +\ShowLuaExampleString{nodes.countall(tex.box[0].list)} + +There are a lot of helpers in the \type {nodes} namespace. In fact, we map all the +helpers provided by the engine itself under \type {nodes} too. These are described +in the \LUATEX\ manual. There are for instance functions to check node types and +node id's: + +\starttyping +local str = node.type(1) +local num = node.id("vlist") +\stoptyping + +These are basic \LUATEX\ functions. In addition to those we also provide a few more +helpers as well as +mapping tables. There are two tables that map node id's to strings and backwards: + +\starttabulate +\NC \type{nodes.nodecodes} \NC regular nodes, some fo them are sort of private to the engine \NC \NR +\NC \type{nodes.noadcodes} \NC math nodes that later on are converted into regular nodes \NC \NR +\stoptabulate + +Nodes can have subtypes. Again we have tables that map the subtype numbers onto +meaningfull names and reverse. + +\starttabulate +\NC \type{nodes.listcodes} \NC subtypes of \type {hlist} and \type {vlist} nodes \NC \NR +\NC \type{nodes.kerncodes} \NC subtypes of \type {kern} nodes \NC \NR +\NC \type{nodes.gluecodes} \NC subtypes of \type {glue} nodes (skips) \NC \NR +\NC \type{nodes.glyphcodes} \NC subtypes of \type {glyph} nodes, the subtype can change \NC \NR +\NC \type{nodes.mathcodes} \NC math specific subtypes \NC \NR +\NC \type{nodes.fillcodes} \NC these are not really subtypes but indicate the strength of the filler \NC \NR +\NC \type{nodes.whatsitcodes} \NC subtypes of a rather large group of extension nodes \NC \NR +\stoptabulate + +Some of the names of types and subtypes have underscores but you can omit them +when you use these tables. You can use tables like this as follows: + +\starttyping +local glyph_code = nodes.nodecodes.glyph +local kern_code = nodes.nodecodes.kern +local glue_code = nodes.nodecodes.glue + +for n in nodes.traverse(list) do + local id == n.id + if id == glyph_code then + ... + elseif id == kern_code then + ... + elseif id == glue_code then + ... + else + ... + end +end +\stoptyping + +You only need to use such temporary variables in time critical code. In spite of +what you might think, lists are not that long and given the speed of \LUA\ (and +successive optimizations in \LUATEX) looping over a paragraphs is rather fast. + +Nodes are created using \type {node.new}. If you study the \CONTEXT\ code you +will notice that there are quite some functions in the \type {nodes.pool} +namespace, like: + +\starttyping +local g = nodes.pool.glyph(fnt,chr) +\stoptyping + +Of course you need to make sure that the font id is valid and that the referred +glyph in in the font. You can use the allocators but don't mess with the code in +the \type {pool} namespace as this might interfere with its usage all over +\CONTEXT. + +The \type {nodes} namespace provides a couple of helpers and some of them are +similar to ones provided in the \type {node} namespace. This has practical as +well as historic reasons. For instance some were prototypes functions that were +later built in. + +\starttyping +local head, current = nodes.before (head, current, new) +local head, current = nodes.after (head, current, new) +local head, current = nodes.delete (head, current) +local head, current = nodes.replace(head, current, new) +local head, current, old = nodes.remove (head, current) +\stoptyping + +Another category deals with attributes: + +\starttyping +nodes.setattribute (head, attribute, value) +nodes.unsetattribute (head, attribute) +nodes.setunsetattribute (head, attribute, value) +nodes.setattributes (head, attribute, value) +nodes.unsetattributes (head, attribute) +nodes.setunsetattributes(head, attribute, value) +nodes.hasattribute (head, attribute, value) +\stoptyping + +% context(typesetters.hpack("Hello World!")) +% context(typesetters.hpack("Hello World!",1,100*1024*10)) + +% nodes.firstchar +% nodes.firstcharinbox + +% maybe node-tst +% tasks and so +% number.points (to numbers) + +\stopsection + +% \startsection[title={Core}] +% {\em todo} +% \stopsection + +\startsection[title={Resolvers}] + +All \IO\ is handled by functions in the \type {resolvers} namespace. Most of the +code that you find in the \type {data-*.lua} files is of litle relevance for +users, especially at the \LUA\ end, so we won't discuss it here in great detail. + +The resolver code is modelled after the \KPSE\ library that itself implements the +\TEX\ Directory Structure in combination with a configuration file. However, we +go a bit beyond this structure, for instance in integrating support for other +resources that file systems. We also have our own configuration file. But +important is that we still support a similar logic too so that regular +configurations are dealt with. + +During a run \LUATEX\ needs files of a different kind: source files, font files, +images, etc. In practice you will probably only deal with source files. The most +fundamental function is \type {findfile}. The first argument is the filename to +be found. A second optional argument indicates the file type. + +The following table relates so called formats to suffixes and variables in the +configuration file. + +\startluacode +context.starttabulate { "|lp|lp|l|" } +context.NC() context.bold("variable") +context.NC() context.bold("format") +context.NC() context.bold("suffix") +context.NC() context.NR() +context.ML() +for k, v in table.sortedpairs(resolvers.relations.core) do + local names = v.names + local variable = v.variable + local suffixes = v.suffixes + context.NC() + if variable then + context.type(variable) + end + context.NC() + if names then + for i=1,#names do + context.type(names[i]) + context.par() + end + end + context.NC() + if suffixes then + context.type(table.concat(suffixes, " ")) + end + context.NC() + context.NR() +end +context.stoptabulate() +\stopluacode + +There are a couple of more formats but these are not that relevant in the +perspective of \CONTEXT. + +When a lookup takes place, spaces are ignored and formats are normalized to +lowercase. + +\ShowLuaExampleString{file.strip(resolvers.findfile("context.tex"),"tex/")} +\ShowLuaExampleString{file.strip(resolvers.findfile("context.mkiv"),"tex/")} +\ShowLuaExampleString{file.strip(resolvers.findfile("context"),"tex/")} +\ShowLuaExampleString{file.strip(resolvers.findfile("data-res.lua"),"tex/")} +\ShowLuaExampleString{file.strip(resolvers.findfile("lmsans10-bold"),"tex/")} +\ShowLuaExampleString{file.strip(resolvers.findfile("lmsans10-bold.otf"),"tex/")} +\ShowLuaExampleString{file.strip(resolvers.findfile("lmsans10-bold","otf"),"tex/")} +\ShowLuaExampleString{file.strip(resolvers.findfile("lmsans10-bold","opentype"),"tex/")} +\ShowLuaExampleString{file.strip(resolvers.findfile("lmsans10-bold","opentypefonts"),"tex/")} +\ShowLuaExampleString{file.strip(resolvers.findfile("lmsans10-bold","opentype fonts"),"tex/")} + +The plural variant of this function returns one or more matches. + +\ShowLuaExampleTable{resolvers.findfiles("texmfcnf.lua","cnf")} +\ShowLuaExampleTable{resolvers.findfiles("context.tex","")} + +% table.print(resolvers.instance.environment) +% table.print(resolvers.instance.variables) +% table.print(resolvers.instance.expansions) +% +% resolvers.expandbraces +% resolvers.expandpath +% resolvers.expandvar +% resolvers.showpath +% resolvers.var_value +% +% resolvers.getenv +% resolvers.variable() +% resolvers.expansion() +% resolvers.is_variable +% resolvers.is_expansion +% +% resolvers.unexpandedpathlist(str) +% resolvers.unexpandedpath(str) +% resolvers.cleanpathlist +% resolvers.expandpath +% resolvers.expandedpath +% resolvers.expandedpathlistfromvariable +% resolvers.expandpathfromvariable +% resolvers.expandbraces +% +% resolvers.findpath +% resolvers.findgivenfiles +% resolvers.findgivenfile +% resolvers.findwildcardfiles +% resolvers.findwildcardfile +% resolvers.showpath + +% data-tre as example +% schemes (data-she) +% caching (containers) +% findbinfile (open|load) +% variables / environment +% findtexfile opentexfile loadtexfile +% file:// + +% supp + +\stopsection + +\startsection[title={Mathematics (math)}] + {\em todo} +\stopsection + +\startsection[title={Graphics (grph)}] + {\em is a separate chapter} +\stopsection + +\startsection[title={Languages (lang)}] + {\em todo} +\stopsection + +\startsection[title={MetaPost (mlib)}] + {\em todo} +\stopsection + +\startsection[title={Lua\TeX\ (luat)}] + {\em todo} +\stopsection + +\startsection[title={Tracing (trac)}] + {\em todo} +\stopsection + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/cld/cld-environment.tex b/doc/context/sources/general/manuals/cld/cld-environment.tex new file mode 100644 index 000000000..1355110bd --- /dev/null +++ b/doc/context/sources/general/manuals/cld/cld-environment.tex @@ -0,0 +1,224 @@ +% language=uk + +\startenvironment cld-environment + +\usemodule[abr-04] + +\setuplayout + [width=middle, + height=middle, + backspace=2cm, + topspace=1cm, + footer=0pt, + bottomdistance=1cm, + bottom=1cm, + bottomspace=2cm] + +\setuppagenumbering + [alternative=doublesided] + +\definecolor[darkred] [r=.5] +\definecolor[darkgreen][g=.5] +\definecolor[darkblue] [b=.5] + +\definecolor[red] [darkred] +\definecolor[green][darkgreen] +\definecolor[blue] [darkblue] + +\definetype + [boldtypebig] + [style=\ttbfa] + +\definetype + [boldtype] + [style=\ttbf] + +\definetyping + [smalltyping] + [bodyfont=small] + +\setuptype + [color=blue] + +\setuptyping + [color=blue] + +\setupbodyfont + [palatino,11pt] + +\setuphead + [chapter] + [style=\bfc, + color=blue] + +\setuphead + [section] + [style=\bfb, + color=blue] + +\definehead + [summary] + [subsubsubsubject] + +\setuphead + [summary] + [style=, + deeptextcommand=\boldtypebig, + color=blue] + +\definehead + [subsummary] + [subsubsubsubsubject] + +\setuphead + [subsummary] + [style=, + before=\blank, + after=\blank, + deeptextcommand=\type, + command=\MySubSummaryHead, + color=blue] + +\unexpanded\def\MySummaryHead#1#2% + {\framed + [frame=off, + bottomframe=on, + offset=0cm] + {#2}} + +\unexpanded\def\MySubSummaryHead#1#2% + {\framed + [frame=off, + bottomframe=on, + offset=0cm] + {#2}} + +\setupwhitespace + [big] + +\setupheadertexts + [] + +\setupheadertexts + [] + [{\getmarking[chapter]\quad\pagenumber}] + [{\pagenumber\quad\getmarking[chapter]}] + [] + +\setupheader + [color=darkblue] + +\setuplist + [chapter,title] + [color=darkblue, + style=bold] + +\setupbottom + [style=\bfx, + color=darkred] + +\setupbottomtexts + [preliminary, uncorrected version -- \currentdate] + +% special functions + +\unexpanded\def\ShowLuaExampleOne#1#2#3% + {\bgroup + \obeyluatokens + \startsubsummary[title={#1.#2(#3)}] + \ctxlua{table.tocontext(#3)} + \stopsubsummary + \egroup} + +\unexpanded\def\ShowLuaExampleTwo#1#2#3% + {\bgroup + \obeyluatokens + \startsubsummary[title={#1.#2(#3)}] + \ctxlua{table.tocontext(#1.#2(#3))} + \stopsubsummary + \egroup} + +\unexpanded\def\ShowLuaExampleThree#1#2#3% + {\bgroup + \obeyluatokens + \startsubsummary[title={#1.#2(#3)}] + \ctxlua{string.tocontext(tostring(#1.#2(#3)))} + \stopsubsummary + \egroup} + +\unexpanded\def\ShowLuaExampleFour#1#2#3#4% + {\bgroup + \obeyluatokens + \startsubsummary[title={t=#3 #1.#2(t#4)}] + \ctxlua{local t = #3 #1.#2(t#4) table.tocontext(t)} + \stopsubsummary + \egroup} + +\unexpanded\def\ShowLuaExampleFive#1#2% + {\bgroup + \obeyluatokens + \startsubsummary[title={#1.#2}] + \ctxlua{string.tocontext(tostring(#1.#2))} + \stopsubsummary + \egroup} + +\unexpanded\def\ShowLuaExampleSix#1#2#3% + {\bgroup + \obeyluatokens + \startsubsummary[title={#1.#2(#3)}] + \ctxlua{string.tocontext(#1.#2(#3))} + \stopsubsummary + \egroup} + +\unexpanded\def\ShowLuaExampleSeven#1#2#3% + {\bgroup + \obeyluatokens + \startsubsummary[title={#1.#2(#3)}] + \ctxlua{string.tocontext(table.concat({#1.#2(#3)}," "))} + \stopsubsummary + \egroup} + +\unexpanded\def\ShowLuaExampleTable#1% + {\bgroup + \obeyluatokens + \startsubsummary[title={#1}] + \ctxlua{table.tocontext(#1,false)} + \stopsubsummary + \egroup} + +\unexpanded\def\ShowLuaExampleTableHex#1% + {\bgroup + \obeyluatokens + \startsubsummary[title={#1}] + \ctxlua{table.tocontext(#1,false,false,true,true)} % name, reduce, noquotes, hex + \stopsubsummary + \egroup} + +\unexpanded\def\ShowLuaExampleString#1% + {\bgroup + \obeyluatokens + \startsubsummary[title={#1}] + \ctxlua{string.tocontext(#1)} + \stopsubsummary + \egroup} + +\unexpanded\def\ShowLuaExampleBoolean#1% + {\bgroup + \obeyluatokens + \startsubsummary[title={#1}] + \ctxlua{boolean.tocontext(#1)} + \stopsubsummary + \egroup} + +% interaction + +\setupinteraction + [state=start, + color=, + contrastcolor=] + +\setuplist + [chapter,section] + [interaction=all] + +\stopenvironment diff --git a/doc/context/sources/general/manuals/cld/cld-files.tex b/doc/context/sources/general/manuals/cld/cld-files.tex new file mode 100644 index 000000000..38a7322b1 --- /dev/null +++ b/doc/context/sources/general/manuals/cld/cld-files.tex @@ -0,0 +1,78 @@ +% language=uk + +\startcomponent cld-macros + +\environment cld-environment + +\startchapter[title=Files] + +\startsection[title={Preprocessing}] + +Although this option must be used with care, it is possible to preprocess files +before they enter \TEX. The following example shows this. + +\starttyping +local function showline(str,filename,linenumber,noflines) + logs.simple("[lc] file: %s, line: %s of %s, length: %s", + file.basename(filename),linenumber,noflines,#str) +end + +local function showfile(str,filename) + logs.simple("[fc] file: %s, length: %s", + file.basename(filename),#str) +end + +resolvers.installinputlinehandler(showline) +resolvers.installinputfilehandler(showfile) +\stoptyping + +Preprocessors like this are rather innocent. If you want to manipulate the +content you need to be aware of the fact that modules and such also pass your +code, and manipulating them can give unexpected side effects. So, the following +code will not make \CONTEXT\ happy. + +\starttyping +local function foo() + return "bar" +end + +resolvers.installinputlinehandler(foo) +\stoptyping + +But, as we pass the filename, you can base your preprocessing on names. + +There can be multiple handlers active at the same time, and although more +detailed control is possible, the current interface does not provide that, simply +because having too many handlers active is asking for trouble anyway. What you +can do, is putting your handler in front or after the built in handlers. + +\starttyping +resolvers.installinputlinehandler("before",showline) +resolvers.installinputfilehandler("after", showfile) +\stoptyping + +Of course you can also preprocess files outside this mechanism, which in most +cases might be a better idea. However, the following example code is quite +efficient and robust. + +\starttyping +local function MyHandler(str,filename) + if file.suffix(filename) == "veryspecial" then + logs.simple("preprocessing file '%s',filename) + return MyConverter(str) + else + return str + end +end + +resolvers.installinputfilehandler("before",MyHandler) +\stoptyping + +In this case only files that have a suffix \type {.veryspecial} will get an extra +treatment. + +\stopsection + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/cld/cld-gettingstarted.tex b/doc/context/sources/general/manuals/cld/cld-gettingstarted.tex new file mode 100644 index 000000000..5c7e1c263 --- /dev/null +++ b/doc/context/sources/general/manuals/cld/cld-gettingstarted.tex @@ -0,0 +1,437 @@ +% language=uk + +\startcomponent cld-gettingstarted + +\environment cld-environment + +\startchapter[title=Getting started] + +\startsection[title=Some basics] + +\index{processing} + +I assume that you have either the so called \CONTEXT\ standalone (formerly known +as minimals) installed or \TEXLIVE. You only need \LUATEX\ and can forget about +installing \PDFTEX\ or \XETEX, which saves you some megabytes and hassle. Now, +from the users perspective a \CONTEXT\ run goes like: + +\starttyping +context yourfile +\stoptyping + +and by default a file with suffix \type {tex}, \type {mkvi} or \type {mkvi} will +be processed. There are however a few other options: + +\starttyping +context yourfile.xml +context yourfile.rlx --forcexml +context yourfile.lua +context yourfile.pqr --forcelua +context yourfile.cld +context yourfile.xyz --forcecld +context yourfile.mp +context yourfile.xyz --forcemp +\stoptyping + +When processing a \LUA\ file the given file is loaded and just processed. This +options will seldom be used as it is way more efficient to let \type {mtxrun} +process that file. However, the last two variants are what we will discuss here. +The suffix \type {cld} is a shortcut for \CONTEXT\ \LUA\ Document. + +A simple \type {cld} file looks like this: + +\starttyping +context.starttext() +context.chapter("Hello There!") +context.stoptext() +\stoptyping + +So yes, you need to know the \CONTEXT\ commands in order to use this mechanism. +In spite of what you might expect, the codebase involved in this interface is not +that large. If you know \CONTEXT, and if you know how to call commands, you +basically can use this \LUA\ method. + +The examples that I will give are either (sort of) standalone, i.e.\ they are +dealt with from \LUA, or they are run within this document. Therefore you will +see two patterns. If you want to make your own documentation, then you can use +this variant: + +\starttyping +\startbuffer +context("See this!") +\stopbuffer + +\typebuffer \ctxluabuffer +\stoptyping + +I use anonymous buffers here but you can also use named ones. The other variant +is: + +\starttyping +\startluacode +context("See this!") +\stopluacode +\stoptyping + +This will process the code directly. Of course we could have encoded this +document completely in \LUA\ but that is not much fun for a manual. + +\stopsection + +\startsection[title=The main command] + +There are a few rules that you need to be aware of. First of all no syntax +checking is done. Second you need to know what the given commands expects in +terms of arguments. Third, the type of your arguments matters: + +\starttabulate[|||] +\NC \type{nothing} \EQ just the command, no arguments \NC \NR +\NC \type{string} \EQ an argument with curly braces \NC \NR +\NC \type{array} \EQ a list between square backets (sometimes optional) \NC \NR +\NC \type{hash} \EQ an assignment list between square brackets \NC \NR +\NC \type{boolean} \EQ when \type {true} a newline is inserted \NC \NR +\NC \EQ when \type {false}, omit braces for the next argument \NC \NR +\stoptabulate + +In the code above you have seen examples of this but here are some more: + +\starttyping +context.chapter("Some title") +context.chapter({ "first" }, "Some title") +context.startchapter({ title = "Some title", label = "first" }) +\stoptyping + +This blob of code is equivalent to: + +\starttyping +\chapter{Some title} +\chapter[first]{Some title} +\startchapter[title={Some title},label=first] +\stoptyping + +You can simplify the third line of the \LUA\ code to: + +\starttyping +context.startchapter { title = "Some title", label = "first" } +\stoptyping + +In case you wonder what the distinction is between square brackets and curly +braces: the first category of arguments concerns settings or lists of options or +names of instances while the second category normally concerns some text to be +typeset. + +Strings are interpreted as \TEX\ input, so: + +\starttyping +context.mathematics("\\sqrt{2^3}") +\stoptyping + +and if you don't want to escape: + +\starttyping +context.mathematics([[\sqrt{2^3}]]) +\stoptyping + +are both correct. As \TEX\ math is a language in its own and a de-facto standard +way of inputting math this is quite natural, even at the \LUA\ end. + +\stopsection + +\startsection[title=Spaces and Lines] + +\index{spaces} +\index{lines} + +In a regular \TEX\ file, spaces and newline characters are collapsed into one +space. At the \LUA\ end the same happens. Compare the following examples. First +we omit spaces: + +\startbuffer +context("left") +context("middle") +context("right") +\stopbuffer + +\typebuffer \ctxluabuffer + +Next we add spaces: + +\startbuffer +context("left") +context(" middle ") +context("right") +\stopbuffer + +\typebuffer \ctxluabuffer + +We can also add more spaces: + +\startbuffer +context("left ") +context(" middle ") +context(" right") +\stopbuffer + +\typebuffer \ctxluabuffer + +In principle all content becomes a stream and after that the \TEX\ parser will do +its normal work: collapse spaces unless configured to do otherwise. Now take the +following code: + +\startbuffer +context("before") +context("word 1") +context("word 2") +context("word 3") +context("after") +\stopbuffer + +\typebuffer \ctxluabuffer + +Here we get no spaces between the words at all, which is what we expect. So, how +do we get lines (or paragraphs)? + +\startbuffer +context("before") +context.startlines() +context("line 1") +context("line 2") +context("line 3") +context.stoplines() +context("after") +\stopbuffer + +\typebuffer \ctxluabuffer + +This does not work out well, as again there are no lines seen at the \TEX\ end. +Newline tokens are injected by passing \type {true} to the \type {context} +command: + +\startbuffer +context("before") +context.startlines() +context("line 1") context(true) +context("line 2") context(true) +context("line 3") context(true) +context.stoplines() +context("after") +\stopbuffer + +\typebuffer \ctxluabuffer + +Don't confuse this with: + +\startbuffer +context("before") context.par() +context("line 1") context.par() +context("line 2") context.par() +context("line 3") context.par() +context("after") context.par() +\stopbuffer + +\typebuffer \ctxluabuffer + +There we use the regular \type {\par} command to finish the current paragraph and +normally you will use that method. In that case, when set, whitespace will be +added between paragraphs. + +This newline issue is a somewhat unfortunate inheritance of traditional \TEX, +where \type {\n} and \type {\r} mean something different. I'm still not sure if +the \CLD\ do the right thing as dealing with these tokens also depends on the +intended effect. Catcodes as well as the \LUATEX\ input parser also play a role. +Anyway, the following also works: + +\startbuffer +context.startlines() +context("line 1\n") +context("line 2\n") +context("line 3\n") +context.stoplines() +\stopbuffer + +\typebuffer + +\stopsection + +\startsection[title=Direct output] + +\index{direct output} +\index{verbose} + +The \CONTEXT\ user interface is rather consistent and the use of special input +syntaxes is discouraged. Therefore, the \LUA\ interface using tables and strings +works quite well. However, imagine that you need to support some weird macro (or +a primitive) that does not expect its argument between curly braces or brackets. +The way out is to precede an argument by another one with the value \type +{false}. We call this the direct interface. This is demonstrated in the following +example. + +\startbuffer +\unexpanded\def\bla#1{[#1]} + +\startluacode +context.bla(false,"***") +context.par() +context.bla("***") +\stopluacode +\stopbuffer + +\typebuffer + +This results in: + +\getbuffer + +Here, the first call results in three \type {*} being passed, and \type {#1} +picks up the first token. The second call to \type {bla} gets \type {{***}} +passed so here \type {#1} gets the triplet. In practice you will seldom need the +direct interface. + +In \CONTEXT\ for historical reasons, combinations accept the following syntax: + +\starttyping +\startcombination % optional specification, like [2*3] + {\framed{content one}} {caption one} + {\framed{content two}} {caption two} +\stopcombination +\stoptyping + +You can also say: + +\starttyping +\startcombination + \combination {\framed{content one}} {caption one} + \combination {\framed{content two}} {caption two} +\stopcombination +\stoptyping + +When coded in \LUA, we can feed the first variant as follows: + +\startbuffer +context.startcombination() + context.direct("one","two") + context.direct("one","two") +context.stopcombination() +\stopbuffer + +\typebuffer + +To give you an idea what this looks like, we render it: + +\startlinecorrection[blank] +\ctxluabuffer +\stoplinecorrection + +So, the \type {direct} function is basically a no|-|op and results in nothing by +itself. Only arguments are passed. An equivalent but bit more ugly looking is: + +\starttyping +context.startcombination() + context(false,"one","two") + context(false,"one","two") +context.stopcombination() +\stoptyping + +\stopsection + +\startsection[title=Catcodes] + +\index{catcodes} + +If you are familiar with the inner working of \TEX, you will know that characters +can have special meanings. This meaning is determined by their catcodes. + +\startbuffer +context("$x=1$") +\stopbuffer + +\typebuffer + +This gives: \ctxluabuffer\ because the dollar tokens trigger inline math mode. If +you think that this is annoying, you can do the following: + +\startbuffer +context.pushcatcodes("text") +context("$x=1$") +context.popcatcodes() +\stopbuffer + +\typebuffer + +Now we get: \ctxluabuffer. There are several catcode regimes of +which only a few make sense in the perspective of the cld +interface. + +\starttabulate[|Tl|l|] +\NC ctx, ctxcatcodes, context \NC the normal \CONTEXT\ catcode regime \NC \NR +\NC prt, prtcatcodes, protect \NC the \CONTEXT\ protected regime, used for modules \NC \NR +\NC tex, texcatcodes, plain \NC the traditional (plain) \TEX\ regime \NC \NR +\NC txt, txtcatcodes, text \NC the \CONTEXT\ regime but with less special characters \NC \NR +\NC vrb, vrbcatcodes, verbatim \NC a regime specially meant for verbatim \NC \NR +\NC xml, xmlcatcodes \NC a regime specially meant for \XML\ processing \NC \NR +\stoptabulate + +In the second case you can still get math: + +\starttyping +context.pushcatcodes("text") +context.mathematics("x=1") +context.popcatcodes() +\stoptyping + +When entering a lot of math you can also consider this: + +\starttyping +context.startimath() +context("x") +context("=") +context("1") +context.stopimath() +\stoptyping + +Module writers of course can use \type {unprotect} and \type {protect} as they do +at the \TEX\ end. + +As we've seen, a function call to \type {context} acts like a print, as in: + +\startbuffer +context("test ") +context.bold("me") +context(" first") +\stopbuffer + +\typebuffer \ctxluabuffer + +When more than one argument is given, the first argument is considered a format +conforming the \type {string.format} function. + +\startbuffer +context.startimath() +context("%s = %0.5f",utf.char(0x03C0),math.pi) +context.stopimath() +\stopbuffer + +\typebuffer \ctxluabuffer + +This means that when you say: + +\starttyping +context(a,b,c,d,e,f) +\stoptyping + +the variables \type {b} till \type {f} are passed to the format and when the +format does not use them, they will not end up in your output. + +\starttyping +context("%s %s %s",1,2,3) +context(1,2,3) +\stoptyping + +The first line results in the three numbers being typeset, but in the second case +only the number~1 is typeset. + +\stopsection + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/cld/cld-goodies.tex b/doc/context/sources/general/manuals/cld/cld-goodies.tex new file mode 100644 index 000000000..d5b4b5c9c --- /dev/null +++ b/doc/context/sources/general/manuals/cld/cld-goodies.tex @@ -0,0 +1,621 @@ +% language=uk + +\startcomponent cld-macros + +% \usemodule[man-01] +% \setvariables[document][title=Font Goodies, author=Hans Hagen] +% \setups[titlepage] + +\environment cld-environment + +\startchapter[title=Font goodies] + +\startsection[title=Introduction] + +One of the interesting aspects of \TEX\ is that it provides control over fonts +and \LUATEX\ provides quite some. In \CONTEXT\ we support basic functionality, +like \OPENTYPE\ features, as well as some extra functionality. We also have a +mechanism for making virtual fonts which is mostly used for the transition from +\TYPEONE\ math fonts to \OPENTYPE\ math fonts. Instead of hard coding specific +details in the core \LUA\ code, we use so called \LUA\ Font Goodies to control +them. These goodies are collected in tables and live in files. When a font is +loaded, one or more such goodie files can be loaded alongside. + +In the following typescript we load a goodies file that defines a virtual Lucida +math font. The goodie file is loaded immediately and some information in the +table is turned into a form that permits access later on: the virtual font id +\type {lucida-math} that is used as part of the font specification. + +\starttyping +\starttypescript [math] [lucida] + \loadfontgoodies[lucida-math] + \definefontsynonym[MathRoman][lucidamath@lucida-math] +\stoptypescript +\stoptyping + +Not all information is to be used directly. Some can be accessed when needed. In +the following case the file \type {dingbats.lfg} gets loaded (only once) when the +font is actually used. In that file, there is information that is used by the +\type {unicoding} feature. + +\starttyping +\definefontfeature + [dingbats] + [mode=base, + goodies=dingbats, + unicoding=yes] + +\definefont[dingbats][file:dingbats][features=dingbats] +\stoptyping + +In the following sections some aspects of goodies are discussed. We don't go into +details of what these goodies are, but just stick to the \LUA\ side of the +specification. + +\stopsection + +\startsection[title=Virtual math fonts] + +A virtual font is defined using the \type {virtuals} entry in the \type +{mathematics} subtable. As \TYPEONE\ fonts are used, an additional table \type +{mapfiles} is needed to specify the files that map filenames onto real files. + +\startsmalltyping +return { + name = "px-math", + version = "1.00", + comment = "Goodies that complement px math.", + author = "Hans Hagen", + copyright = "ConTeXt development team", + mathematics = { + mapfiles = { + "mkiv-px.map", + }, + virtuals = { + ["px-math"] = { + { name = "texgyrepagella-regular.otf", features = "virtualmath", main = true }, + { name = "rpxr.tfm", vector = "tex-mr" } , + { name = "rpxmi.tfm", vector = "tex-mi", skewchar=0x7F }, + { name = "rpxpplri.tfm", vector = "tex-it", skewchar=0x7F }, + { name = "pxsy.tfm", vector = "tex-sy", skewchar=0x30, parameters = true } , + { name = "pxex.tfm", vector = "tex-ex", extension = true } , + { name = "pxsya.tfm", vector = "tex-ma" }, + { name = "pxsyb.tfm", vector = "tex-mb" }, + { name = "texgyrepagella-bold.otf", vector = "tex-bf" } , + { name = "texgyrepagella-bolditalic.otf", vector = "tex-bi" } , + { name = "lmsans10-regular.otf", vector = "tex-ss", optional=true }, + { name = "lmmono10-regular.otf", vector = "tex-tt", optional=true }, + }, + } + } +} +\stopsmalltyping + +Here the \type {px-math} virtual font is defined. A series of fonts is loaded and +combined into one. The \type {vector} entry is used to tell the builder how to +map the glyphs onto \UNICODE. Additional vectors can be defined, for instance: + +\starttyping +fonts.encodings.math["mine"] = { + [0x1234] = 0x56, +} +\stoptyping + +Eventually these specifications wil be replaced by real \OPENTYPE\ fonts, but +even then we will keep the virtual definitions around. + +\startsection[title=Math alternates] + +In addition to the official \type {ssty} feature for enforcing usage of script +and scriptscript glyphs, some stylistic alternates can be present. + +\startsmalltyping +return { + name = "xits-math", + version = "1.00", + comment = "Goodies that complement xits (by Khaled Hosny).", + author = "Hans Hagen", + copyright = "ConTeXt development team", + mathematics = { + alternates = { + cal = { + feature = 'ss01', + value = 1, + comment = "Mathematical Calligraphic Alphabet" + }, + greekssup = { + feature = 'ss02', + value = 1, + comment = "Mathematical Greek Sans Serif Alphabet" + }, + greekssit = { + feature = 'ss03', + value = 1, + comment = "Mathematical Italic Sans Serif Digits" + }, + monobfnum = { + feature = 'ss04', + value = 1, + comment = "Mathematical Bold Monospace Digits" + }, + mathbbbf = { + feature = 'ss05', + value = 1, + comment = "Mathematical Bold Double-Struck Alphabet" + }, + mathbbit = { + feature = 'ss06', + value = 1, + comment = "Mathematical Italic Double-Struck Alphabet" + }, + mathbbbi = { + feature = 'ss07', + value = 1, + comment = "Mathematical Bold Italic Double-Struck Alphabet" + }, + upint = { + feature = 'ss08', + value = 1, + comment = "Upright Integrals" + }, + } + } +} +\stopsmalltyping + +These can be activated (in math mode) with the \type {\mathalternate} command +like: + +\starttyping +$\mathalternate{cal}Z$ +\stoptyping + +\stopsection + +\startsection[title=Math parameters] + +Another goodie related to math is the overload of some parameters (part of the +font itself) and variables (used in making virtual shapes). + +\startsmalltyping +return { + name = "lm-math", + version = "1.00", + comment = "Goodies that complement latin modern math.", + author = "Hans Hagen", + copyright = "ConTeXt development team", + mathematics = { + mapfiles = { + "lm-math.map", + "lm-rm.map", + "mkiv-base.map", + }, + virtuals = { + ["lmroman5-math"] = five, + ["lmroman6-math"] = six, + ["lmroman7-math"] = seven, + ["lmroman8-math"] = eight, + ["lmroman9-math"] = nine, + ["lmroman10-math"] = ten, + ["lmroman10-boldmath"] = ten_bold, + ["lmroman12-math"] = twelve, + ["lmroman17-math"] = seventeen, + }, + variables = { + joinrelfactor = 3, -- default anyway + }, + parameters = { -- test values + -- FactorA = 123.456, + -- FactorB = false, + -- FactorC = function(value,target,original) return 7.89 * target.factor end, + -- FactorD = "Hi There!", + }, + } +} +\stopsmalltyping + +In this example you see several virtuals defined which is due to the fact that +Latin Modern has design sizes. The values (like \type {twelve} are tables defined +before the return happens and are not shown here. The variables are rather +\CONTEXT\ specific, and the parameters are those that come with regular +\OPENTYPE\ math fonts (so the example names are invalid). + +In the following example we show two wasy to change parameters. In this case we +have a regular \OPENTYPE\ math font. First we install a patch to the font itself. +That change will be cached. We could also have changed that parameter using the +goodies table. The first method is the oldest. + +\startsmalltyping +local patches = fonts.handlers.otf.enhancers.patches + +local function patch(data,filename,threshold) + local m = data.metadata.math + if m then + local d = m.DisplayOperatorMinHeight or 0 + if d < threshold then + patches.report("DisplayOperatorMinHeight(%s -> %s)",d,threshold) + m.DisplayOperatorMinHeight = threshold + end + end +end + +patches.register( + "after", + "check math parameters", + "asana", + function(data,filename) + patch(data,filename,1350) + end +) + +local function less(value,target,original) + return 0.25 * value +end + +return { + name = "asana-math", + version = "1.00", + comment = "Goodies that complement asana.", + author = "Hans Hagen", + copyright = "ConTeXt development team", + mathematics = { + parameters = { + StackBottomDisplayStyleShiftDown = less, + StackBottomShiftDown = less, + StackDisplayStyleGapMin = less, + StackGapMin = less, + StackTopDisplayStyleShiftUp = less, + StackTopShiftUp = less, + StretchStackBottomShiftDown = less, + StretchStackGapAboveMin = less, + StretchStackGapBelowMin = less, + StretchStackTopShiftUp = less, + } + } +} +\stopsmalltyping + +We use a function so that the scaling is taken into account as the values passed +are those resulting from the scaling of the font to the requested size. + +\stopsection + +\startsection[title=Unicoding] + +We still have to deal with existing \TYPEONE\ fonts, and some of them have an +encoding that is hard to map onto \UNICODE\ without additional information. The +following goodie does that. The keys in the \type {unicodes} table are the glyph +names. Keep in mind that this only works with simple fonts. The \CONTEXT\ code +takes care of kerns but that's about it. + +\startsmalltyping +return { + name = "dingbats", + version = "1.00", + comment = "Goodies that complement dingbats (funny names).", + author = "Hans Hagen", + copyright = "ConTeXt development team", + remapping = { + tounicode = true, + unicodes = { + a1 = 0x2701, + a10 = 0x2721, + a100 = 0x275E, + a101 = 0x2761, + ............. + a98 = 0x275C, + a99 = 0x275D, + }, + }, +} +\stopsmalltyping + +The \type {tounicode} option makes sure that additional information ends ip in +the output so that cut|-|and|-|paste becomes more trustworthy. + +\stopsection + +\startsection[title=Typescripts] + +Some font collections, like antykwa, come with so many variants that defining +them all in typescripts becomes somewhat of a nuisance. While a regular font has +a typescript of a few lines, antykwa needs way more lines. This is why we provide +a nother way as well, using goodies. + +\startsmalltyping +return { + name = "antykwapoltawskiego", + version = "1.00", + comment = "Goodies that complement Antykwa Poltawskiego", + author = "Hans & Mojca", + copyright = "ConTeXt development team", + files = { + name = "antykwapoltawskiego", -- shared + list = { + ["AntPoltLtCond-Regular.otf"] = { + -- name = "antykwapoltawskiego", + weight = "light", + style = "regular", + width = "condensed", + }, + ["AntPoltLtCond-Italic.otf"] = { + weight = "light", + style = "italic", + width = "condensed", + }, + ["AntPoltCond-Regular.otf"] = { + weight = "normal", + style = "regular", + width = "condensed", + }, + + ....... + + + ["AntPoltExpd-BoldItalic.otf"] = { + weight = "bold", + style = "italic", + width = "expanded", + }, + }, + }, + typefaces = { -- for Mojca (experiment, names might change) + ["antykwapoltawskiego-light"] = { + shortcut = "rm", + shape = "serif", + fontname = "antykwapoltawskiego", + normalweight = "light", + boldweight = "medium", + width = "normal", + size = "default", + features = "default", + }, + + ....... + + }, +} +\stopsmalltyping + +This is a typical example of when a goodies file is loaded directly: + +\starttyping +\loadfontgoodies[antykwapoltawskiego] +\stoptyping + +A bodyfont is now defined by choosing from the defined combinations: + +\starttyping +\definetypeface + [name=mojcasfavourite, + preset=antykwapoltawskiego, + normalweight=light, + boldweight=bold, + width=expanded] + +\setupbodyfont + [mojcasfavourite] +\stoptyping + +This mechanism is a follow up on a discussion at a \CONTEXT\ conference, still +somewhat experimental, and a playground for Mojca. + +\stopsection + +\startsection[title=Font strategies] + +This goodie is closely related to the Oriental \TEX\ project where a dedicated +paragraph optimizer can be used. A rather advanced font is used (husayni) and its +associated goodie file is rather extensive. It defines stylistic features, +implements a couple of feature sets, provides colorschemes and most of all, +defines some strategies for making paragraphs look better. Some of the goodie +file is shown here. + +\startsmalltyping +local yes = "yes" + +local basics = { + analyze = yes, + mode = "node", + language = "dflt", + script = "arab", +} + +local analysis = { + ccmp = yes, + init = yes, medi = yes, fina = yes, +} + +local regular = { + rlig = yes, calt = yes, salt = yes, anum = yes, + ss01 = yes, ss03 = yes, ss07 = yes, ss10 = yes, ss12 = yes, ss15 = yes, ss16 = yes, + ss19 = yes, ss24 = yes, ss25 = yes, ss26 = yes, ss27 = yes, ss31 = yes, ss34 = yes, + ss35 = yes, ss36 = yes, ss37 = yes, ss38 = yes, ss41 = yes, ss42 = yes, ss43 = yes, + js16 = yes, +} + +local positioning = { + kern = yes, curs = yes, mark = yes, mkmk = yes, +} + +local minimal_stretching = { + js11 = yes, js03 = yes, +} + +local medium_stretching = { + js12=yes, js05=yes, +} + +local maximal_stretching= { + js13 = yes, js05 = yes, js09 = yes, +} + +local wide_all = { + js11 = yes, js12 = yes, js13 = yes, js05 = yes, js09 = yes, +} + +local shrink = { + flts = yes, js17 = yes, ss05 = yes, ss11 = yes, ss06 = yes, ss09 = yes, +} + +local default = { + basics, analysis, regular, positioning, -- xxxx = yes, yyyy = 2, +} + +return { + name = "husayni", + version = "1.00", + comment = "Goodies that complement the Husayni font by Idris Samawi Hamid.", + author = "Idris Samawi Hamid and Hans Hagen", + featuresets = { -- here we don't have references to featuresets + default = { + default, + }, + minimal_stretching = { + default, + js11 = yes, js03 = yes, + }, + medium_stretching = { + default, + js12=yes, js05=yes, + }, + maximal_stretching= { + default, + js13 = yes, js05 = yes, js09 = yes, + }, + wide_all = { + default, + js11 = yes, js12 = yes, js13 = yes, js05 = yes, js09 = yes, + }, + shrink = { + default, + flts = yes, js17 = yes, ss05 = yes, ss11 = yes, ss06 = yes, ss09 = yes, + }, + }, + solutions = { -- here we have references to featuresets, so we use strings! + experimental = { + less = { + "shrink" + }, + more = { + "minimal_stretching", + "medium_stretching", + "maximal_stretching", + "wide_all" + }, + }, + }, + stylistics = { + ...... + ss03 = "level-1 stack over Jiim, initial entry only", + ss04 = "level-1 stack over Jiim, initial/medial entry", + ...... + ss54 = "chopped finals", + ss55 = "idgham-tanwin", + ...... + js11 = "level-1 stretching", + js12 = "level-2 stretching", + ...... + js21 = "Haa.final_alt2", + }, + colorschemes = { + default = { + [1] = { + "Onedotabove", "Onedotbelow", ... + }, + [2] = { + "Fathah", "Dammah", "Kasrah", ... + }, + [3] = { + "Ttaa.waqf", "SsLY.waqf", "QLY.waqf", ... + }, + [4] = { + "ZeroArabic.ayah", "OneArabic.ayah", "TwoArabic.ayah", ... + }, + [5] = { + "Ayah", "Ayah.alt1", "Ayah.alt2", ... + } + } + } +} +\stopmalltyping + +Discussion of these goodies is beyond this document and happens elsewhere. + +\stopsection + +\startsection[title=Composition] + +The \type {compose} features extends a font with additional (virtual) shapes. +This is mostly used with \TYPEONE\ fonts that lack support for eastern european +languages. The type {compositions} subtable is used to control placement of +accents. This can be done per font. + +\startmalltyping +local defaultunits = 193 - 30 + +-- local compose = { +-- DY = defaultunits, +-- [0x010C] = { DY = defaultunits }, -- Ccaron +-- [0x02C7] = { DY = defaultunits }, -- textcaron +-- } + +-- fractions relative to delta(X_height - x_height) + +local defaultfraction = 0.85 + +local compose = { + DY = defaultfraction, -- uppercase compensation +} + +return { + name = "lucida-one", + version = "1.00", + comment = "Goodies that complement lucida.", + author = "Hans and Mojca", + copyright = "ConTeXt development team", + compositions = { + ["lbr"] = compose, + ["lbi"] = compose, + ["lbd"] = compose, + ["lbdi"] = compose, + } +} +\stopsmalltyping + +\stopsection + +\startsection[title=Postprocessing] + +You can hook postprocessors into the scaler. Future versions might provide more +control over where this happens. + +\startsmalltyping +local function statistics(tfmdata) + commands.showfontparameters(tfmdata) +end + +local function squeeze(tfmdata) + for k, v in next, tfmdata.characters do + v.height = 0.75 * (v.height or 0) + v.depth = 0.75 * (v.depth or 0) + end +end + +return { + name = "demo", + version = "1.00", + comment = "An example of goodies.", + author = "Hans Hagen", + postprocessors = { + statistics = statistics, + squeeze = squeeze, + }, +} +\stopsmalltyping + +\stopsection + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/cld/cld-graphics.tex b/doc/context/sources/general/manuals/cld/cld-graphics.tex new file mode 100644 index 000000000..93ab80c2c --- /dev/null +++ b/doc/context/sources/general/manuals/cld/cld-graphics.tex @@ -0,0 +1,342 @@ +% language=uk + +\startcomponent cld-graphics + +\environment cld-environment + +\startchapter[title=Graphics] + +\startsection[title=The regular interface] + +If you are familiar with \CONTEXT, which by now probably is the case, you will +have noticed that it integrates the \METAPOST\ graphic subsystem. Drawing a +graphic is not that complex: + +\startbuffer +context.startMPcode() +context [[ + draw + fullcircle scaled 1cm + withpen pencircle scaled 1mm + withcolor .5white + dashed dashpattern (on 2mm off 2mm) ; + ]] +context.stopMPcode() +\stopbuffer + +\typebuffer + +We get a gray dashed circle rendered with an one millimeter thick line: + +\startlinecorrection +\ctxluabuffer +\stoplinecorrection + +So, we just use the regular commands and pass the drawing code as strings. +Although \METAPOST\ is a rather normal language and therefore offers loops and +conditions and the lot, you might want to use \LUA\ for anything else than the +drawing commands. Of course this is much less efficient, but it could be that you +don't care about speed. The next example demonstrates the interface for building +graphics piecewise. + +\startbuffer +context.resetMPdrawing() + +context.startMPdrawing() +context([[fill fullcircle scaled 5cm withcolor (0,0,.5) ;]]) +context.stopMPdrawing() + +context.MPdrawing("pickup pencircle scaled .5mm ;") +context.MPdrawing("drawoptions(withcolor white) ;") + +for i=0,50,5 do + context.startMPdrawing() + context("draw fullcircle scaled %smm ;",i) + context.stopMPdrawing() +end + +for i=0,50,5 do + context.MPdrawing("draw fullsquare scaled " .. i .. "mm ;") +end + +context.MPdrawingdonetrue() + +context.getMPdrawing() +\stopbuffer + +\typebuffer + +This gives: + +\startlinecorrection +\ctxluabuffer +\stoplinecorrection + +I the first loop we can use the format options associated with the simple \type +{context} call. This will not work in the second case. Even worse, passing more +than one argument will definitely give a faulty graphic definition. This is why +we have a special interface for \METAFUN. The code above can also be written as: + +\startbuffer +local metafun = context.metafun + +metafun.start() + +metafun("fill fullcircle scaled 5cm withcolor %s ;", + metafun.color("darkblue")) + +metafun("pickup pencircle scaled .5mm ;") +metafun("drawoptions(withcolor white) ;") + +for i=0,50,5 do + metafun("draw fullcircle scaled %smm ;",i) +end + +for i=0,50,5 do + metafun("draw fullsquare scaled %smm ;",i) +end + +metafun.stop() +\stopbuffer + +\typebuffer + +Watch the call to \type {color}, this will pass definitions at the \TEX\ end to +\METAPOST. Of course you really need to ask yourself \quotation {Do I want to use +\METAPOST\ this way?}. Using \LUA\ loops instead of \METAPOST\ ones makes much +more sense in the following case: + +\startbuffer +local metafun = context.metafun + +function metafun.barchart(t) + metafun.start() + local t = t.data + for i=1,#t do + metafun("draw unitsquare xyscaled(%s,%s) shifted (%s,0);", + 10, t[i]*10, i*10) + end + metafun.stop() +end + +local one = { 1, 4, 6, 2, 3, } +local two = { 8, 1, 3, 5, 9, } + +context.startcombination() + context.combination(metafun.delayed.barchart { data = one }, "one") + context.combination(metafun.delayed.barchart { data = two }, "two") +context.stopcombination() +\stopbuffer + +\typebuffer + +We get two barcharts alongside: + +\startlinecorrection +\ctxluabuffer +\stoplinecorrection + +\startbuffer +local template = [[ + path p, q ; color c[] ; + c1 := \MPcolor{darkblue} ; + c2 := \MPcolor{darkred} ; + p := fullcircle scaled 50 ; + l := length p ; + n := %s ; + q := subpath (0,%s/n*l) of p ; + draw q withcolor c2 withpen pencircle scaled 1 ; + fill fullcircle scaled 5 shifted point length q of q withcolor c1 ; + setbounds currentpicture to unitsquare shifted (-0.5,-0.5) scaled 60 ; + draw boundingbox currentpicture withcolor c1 ; + currentpicture := currentpicture xsized(1cm) ; +]] + +local function steps(n) + for i=0,n do + context.metafun.start() + context.metafun(template,n,i) + context.metafun.stop() + if i < n then + context.quad() + end + end +end + +context.hbox(function() steps(10) end) +\stopbuffer + +\typebuffer + +\startlinecorrection +\ctxluabuffer +\stoplinecorrection + +Using a template is quite convenient but at some point you can loose track of the +replacement values. Also, adding an extra value can force you to adapt the +following ones which enlarges the change for making an error. An alternative is +to use the template mechanism. Although this mechanism was originally made for +other purposes, you can use it for whatever you like. + +\startbuffer +local template = [[ + path p ; p := fullcircle scaled 4cm ; + draw p withpen pencircle scaled .5mm withcolor red ; + freedotlabel ("%lefttop%", point 1 of p,origin) ; + freedotlabel ("%righttop%", point 3 of p,origin) ; + freedotlabel ("%leftbottom%", point 5 of p,origin) ; + freedotlabel ("%rightbottom%",point 7 of p,origin) ; +]] + +local variables = { + lefttop = "one", + righttop = "two", + leftbottom = "three", + rightbottom = "four" , +} + +context.metafun.start() + context.metafun(utilities.templates.replace(template,variables)) +context.metafun.stop() +\stopbuffer + +\typebuffer + +Here we use named placeholders and pass a table with associated values to the +replacement function. Apart from convenience it's also more readable. And the +overhead is rather minimal. + +\startlinecorrection +\ctxluabuffer +\stoplinecorrection + +To some extent we fool ourselves with this kind of \LUA fication of \METAPOST\ +code. Of course we can make a nice \METAPOST\ library and put the code in a macro +instead. In that sense, doing this in \CONTEXT\ directly often gives better and +more efficient code. + +Of course you can use all relevant commands in the \LUA\ interface, like: + +\starttyping +context.startMPpage() + context("draw origin") + for i=0,100,10 do + context("..{down}(%d,0)",i) + end + context(" withcolor \\MPcolor{darkred} ;") +context.stopMPpage() +\stoptyping + +to get a graphic that has its own page. Don't use the \type {metafun} namespace +here, as it will not work here. This drawing looks like: + +\startlinecorrection +\startluacode +context.startMPcode() + context("draw origin") + for i=0,100,10 do + context("..{down}(%d,0)",i) + end + context(" withcolor red ;") +context.stopMPcode() +\stopluacode +\stoplinecorrection + +\stopsection + +\startsection[title=The \LUA\ interface] + +Messing around with graphics is normally not needed and if you do it, you'd +better know what you're doing. For \TEX\ a graphic is just a black box: a +rectangle with dimensions. You specify a graphic, in a format that the backend +can deal with, either or not apply some scaling and from then on a reference to +that graphic, normally wrapped in a normal \TEX\ box, enters the typesetting +machinery. Because the backend, the part that is responsible for translating +typeset content onto a viewable or printable format like \PDF, is built into +\LUATEX, at some point the real image has to be injected and the backend can only +handle a few image formats: \PNG, \JPG, \JBIG\ and \PDF. + +In \CONTEXT\ some more image formats are supported but in practice this boils +down to converting the image to a format that the backend can handle. Such a +conversion depends on an external programs and in order not to redo the +conversion each run \CONTEXT\ keeps track of the need to redo it. + +Some converters are built in, for example one that deals with \GIF\ images. This +is normally not a preferred format, but it happens that we have to deal with it +in cases where organizations use that format (if only because they use the web). +Here is how this works at the \LUA\ end: + +\starttyping +figures.converters.gif = { + pdf = function(oldname,newname) + os.execute(string.format("gm convert %s %s",oldname,newname)) + end +} +\stoptyping + +We use \type {gm} (Graphic Magic) for the conversion and pass the old and new +names. Given this definition at the \TEX\ end we can say: + +\starttyping +\externalfigure[whatever.gif][width=4cm] +\stoptyping + +Here is a another one: + +\starttyping +figures.converters.bmp = { + pdf = function(oldname,newname) + os.execute(string.format("gm convert %s %s",oldname,newname)) + end +} +\stoptyping + +In both examples we convert to \PDF\ because including this filetype is quite +fast. But you can also go to other formats: + +\starttyping +figures.converters.png = { + png = function(oldname,newname,resolution) + local command = string.format('gm convert -depth 1 "%s" "%s"',oldname,newname) + logs.report(string.format("running command %s",command)) + os.execute(command) + end +} +\stoptyping + +Instead of directly defining such a table, you can better do this: + +\starttyping +figures.converters.png = figures.converters.png or { } + +figures.converters.png.png = function(oldname,newname,resolution) + local command = string.format('gm convert -depth 1 "%s" "%s"',oldname,newname) + logs.report(string.format("running command %s",command)) + os.execute(command) +end +\stoptyping + +Here we check if a table exists and if not we extend the table. Such converters +work out of the box if you specify the suffix, but you can also opt for a simple: + +\starttyping +\externalfigure[whatever][width=4cm] +\stoptyping + +In this case \CONTEXT\ will check for all known supported formats, which is not +that efficient when no graphic can be found. In order to let for instance files +with suffix \type {bmp} can be included you have to register it as follows. The +second argument is the target. + +\starttyping +figures.registersuffix("bmp","bmp") +\stoptyping + +At some point more of the graphic inclusion helpers will be opened up for general +use but for now this is what you have available. + +\stopsection + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/cld/cld-introduction.tex b/doc/context/sources/general/manuals/cld/cld-introduction.tex new file mode 100644 index 000000000..82fcb8007 --- /dev/null +++ b/doc/context/sources/general/manuals/cld/cld-introduction.tex @@ -0,0 +1,55 @@ +% language=uk + +\startcomponent cld-introduction + +\environment cld-environment + +\startchapter[title=Introduction] + +Sometimes you hear folks complain about the \TEX\ input language, i.e.\ the +backslashed commands that determine your output. Of course, when alternatives are +being discussed every one has a favourite programming language. In practice +coding a document in each of them triggers similar sentiments with regards to +coding as \TEX\ itself does. + +So, just for fun, I added a couple of commands to \CONTEXT\ \MKIV\ that permit +coding a document in \LUA. In retrospect it has been surprisingly easy to +implement a feature like this using metatables. Of course it's a bit slower than +using \TEX\ as input language but sometimes the \LUA\ interface is more readable +given the problem at hand. + +After a while I decided to use that interface in non|-|critical core \CONTEXT\ +code and in styles (modules) and solutions for projects. Using the \LUA\ approach +is sometimes more convenient, especially if the code mostly manipulates data. For +instance, if you process \XML\ files of database output you can use the interface +that is available at the \TEX\ end, or you can use \LUA\ code to do the work, or +you can use a combination. So, from now on, in \CONTEXT\ you can code your style +and document source in (a mixture of) \TEX, \XML, \METAPOST\ and in \LUA. + +In the following chapters I will introduce typesetting in \LUA, but as we rely on +\CONTEXT\ it is unavoidable that some regular \CONTEXT\ code shows up. The fact +that you can ignore backslashes does not mean that you can do without knowledge +of the underlying system. I expect that the user is somewhat familiar with this +macro package. Some chapters are follow ups on articles or earlier publications. + +Some information (and mechanism) show up in more than one chapter. This is a side +effect of \LUA\ being integrated in many places, so an isolated discussion is a +bit hard. + +In the meantime most of the code is rather stable and proven. However, this +manual will never be complete. You can find examples all over the code base, and +duplicating everything here makes no sense. If you find errors, please let me +know. If you think that something is missing, you can try to convince me to add +it. It's hard to keep up with what gets added so input is welcome. + +\blank[2*big] + +\startlines +Hans Hagen +Hasselt NL +2009 \emdash\ 2016 +\stoplines + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/cld/cld-logging.tex b/doc/context/sources/general/manuals/cld/cld-logging.tex new file mode 100644 index 000000000..cbb904a69 --- /dev/null +++ b/doc/context/sources/general/manuals/cld/cld-logging.tex @@ -0,0 +1,91 @@ +% language=uk + +% maybe this will become a section instead + +\startcomponent cld-logging + +\environment cld-environment + +\startchapter[title={Logging}] + +Logging and localized messages have always been rather standardized in \CONTEXT, +so upgrading the related mechanism had been quite doable. In \MKIV\ for a while +we had two systems in parallel: the old one, mostly targeted at messages at the +\TEX\ end, and a new one used at the \LUA\ end. But when more and more hybrid +code showed up, integrating both systems made sense. + +Most logging concerns tracing and can be turned on and off on demand. This kind +of control is now possible for all messages. Given that the right interfaces are +used, you can turn off all messages: + +\starttyping +context --silent +\stoptyping + +This was already possible in \MKII, but there \TEX's own messages still were +visible. More important is that we have control: + +\starttyping +context --silent=structure*,resolve*,font* +\stoptyping + +This will disable all reporting for these three categories. It is also possible +to only disable messages to the console: + +\starttyping +context --noconsole +\stoptyping + +In \CONTEXT\ you can use directives: + +\starttyping +\enabledirectives[logs.blocked=structure*,resolve*,font*] +\enabledirectives[logs.target=file] +\stoptyping + +As all logging is under \LUA\ control and because this (and other) kind of +control has to kick in early in the initialization the code might look somewhat +tricky. Users won't notice this because they only deal with the formal interface. +Here we will only discuss the \LUA\ interfaces. + +Messages related to tracing are done as follows: + +\starttyping +local report_whatever = logs.reporter("modules","whatever") + +report_whatever("not found: %s","this or that") +\stoptyping + +The first line defined a logger in the category \type {modules}. You can give a +second argument as well, the subcategory. Both will be shown as part of the +message, of which an example is given in the second line. + +These messages are shown directly, that is, when the function is called. However, +when you generate \TEX\ code, as we discuss in this document, you need to make +sure that the message is synchronized with that code. This can be done with a +messenger instead of a reporter. + +\starttyping +local report_numbers = logs.reporter("numbers","check") +local status_numbers = logs.messenger("numbers","check") + +status_numbers("number 1: %s, number 2: %s",123,456) +report_numbers("number 1: %s, number 2: %s",456,123) +\stoptyping + +Both reporters and messages are localized when the pattern given as first +argument can be found in the \type {patterns} subtable of the interface messages. +Categories and subcategories are also translated, but these are looked up in the +\type {translations} subtable. So in the case of + +\starttyping +report_whatever("found: %s",filename) +report_whatever("not found: %s",filename) +\stoptyping + +you should not be surprised if it gets translated. Of course the category and +subcategory provide some contextual information. + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/cld/cld-luafunctions.tex b/doc/context/sources/general/manuals/cld/cld-luafunctions.tex new file mode 100644 index 000000000..b2760e05b --- /dev/null +++ b/doc/context/sources/general/manuals/cld/cld-luafunctions.tex @@ -0,0 +1,2367 @@ +% language=uk + +% table.unnest : only used in special cases +% table.derive : set metatable if unset +% table.compact : remove empty subtables + +\environment cld-environment + +\startcomponent cld-luafunctions + +\startchapter[title=Lua Functions] + +\startsection[title={Introduction}] + +When you run \CONTEXT\ you have some libraries preloaded. If you look into the +\LUA\ files you will find more than is discussed here, but keep in mind that what +is not documented, might be gone or done different one day. Some extensions live +in the same namespace as those provided by stock \LUA\ and \LUATEX, others have +their own. There are many more functions and the more obscure (or never being +used) ones will go away. + +The \LUA\ code in \CONTEXT\ is organized in quite some modules. Those with names +like \type {l-*.lua} are rather generic and are automatically available when you +use \type {mtxrun} to run a \LUA\ file. These are discusses in this chapter. A +few more modules have generic properties, like some in the categories \type +{util-*.lua}, \type {trac-*.lua}, \type {luat-*.lua}, \type {data-*.lua} and +\type {lxml-*.lua}. They contain more specialized functions and are discussed +elsewhere. + +Before we move on the the real code, let's introduce a handy helper: + +\starttyping +inspect(somevar) +\stoptyping + +Whenever you feel the need to see what value a variable has you can insert this +function to get some insight. It knows how to deal with several data types. + +\stopsection + +\startsection[title={Tables}] + +\startsummary[title={[lua] concat}] + +These functions come with \LUA\ itself and are discussed in detail in the \LUA\ +reference manual so we stick to some examples. The \type {concat} function +stitches table entries in an indexed table into one string, with an optional +separator in between. If can also handle a slice of the table + +\starttyping +local str = table.concat(t) +local str = table.concat(t,separator) +local str = table.concat(t,separator,first) +local str = table.concat(t,separator,first,last) +\stoptyping + +Only strings and numbers can be concatenated. + +\ShowLuaExampleThree {table} {concat} {{"a","b","c","d","e"}} +\ShowLuaExampleThree {table} {concat} {{"a","b","c","d","e"},"+"} +\ShowLuaExampleThree {table} {concat} {{"a","b","c","d","e"},"+",2,3} + +\stopsummary + +\startsummary[title={[lua] insert remove}] + +You can use \type {insert} and \type {remove} for adding or replacing entries in +an indexed table. + +\starttyping +table.insert(t,value,position) +value = table.remove(t,position) +\stoptyping + +The position is optional and defaults to the last entry in the table. For +instance a stack is built this way: + +\starttyping +table.insert(stack,"top") +local top = table.remove(stack) +\stoptyping + +Beware, the \type {insert} function returns nothing. You can provide an +additional position: + +\starttyping +table.insert(list,"injected in slot 2",2) +local thiswastwo = table.remove(list,2) +\stoptyping + +\stopsummary + +\startsummary[title={[lua] unpack}] + +You can access entries in an indexed table as follows: + +\starttyping +local a, b, c = t[1], t[2], t[3] +\stoptyping + +but this does the same: + +\starttyping +local a, b, c = table.unpack(t) +\stoptyping + +This is less efficient but there are situations where \type {unpack} +comes in handy. + +\stopsummary + +\startsummary[title={[lua] sort}] + +Sorting is done with \type {sort}, a function that does not return a value but +operates on the given table. + +\starttyping +table.sort(t) +table.sort(t,comparefunction) +\stoptyping + +The compare function has to return a consistent equivalent of \type {true} or +\type {false}. For sorting more complex data structures there is a specialized +sort module available. + +\ShowLuaExampleFour {table} {sort} {{"a","b","c"}} {} +\ShowLuaExampleFour {table} {sort} {{"a","b","c"}} {,function(x,y) return x > y end} +\ShowLuaExampleFour {table} {sort} {{"a","b","c"}} {,function(x,y) return x < y end} + +\stopsummary + +\startsummary[title={sorted}] + +The built|-|in \type {sort} function does not return a value but sometimes it can be +if the (sorted) table is returned. This is why we have: + +\starttyping +local a = table.sorted(b) +\stoptyping + +\stopsummary + +% table.strip + +\startsummary[title={keys sortedkeys sortedhashkeys sortedhash}] + +The \type {keys} function returns an indexed list of keys. The order is undefined +as it depends on how the table was constructed. A sorted list is provided by +\type {sortedkeys}. This function is rather liberal with respect to the keys. If +the keys are strings you can use the faster alternative \type {sortedhashkeys}. + +\starttyping +local s = table.keys (t) +local s = table.sortedkeys (t) +local s = table.sortedhashkeys (t) +\stoptyping + +Because a sorted list is often processed there is also an iterator: + +\starttyping +for key, value in table.sortedhash(t) do + print(key,value) +end +\stoptyping + +There is also a synonym \type {sortedpairs} which sometimes looks more natural +when used alongside the \type {pairs} and \type {ipairs} iterators. + +\ShowLuaExampleTwo {table} {keys} {{ [1] = 2, c = 3, [true] = 1 }} +\ShowLuaExampleTwo {table} {sortedkeys} {{ [1] = 2, c = 3, [true] = 1 }} +\ShowLuaExampleTwo {table} {sortedhashkeys} {{ a = 2, c = 3, b = 1 }} + +\stopsummary + +\startsummary[title={serialize print tohandle tofile}] + +The \type {serialize} function converts a table into a verbose representation. +The \type {print} function does the same but prints the result to the console +which is handy for tracing. The \type {tofile} function writes the table to a +file, using reasonable chunks so that less memory is used. The fourth variant +\type {tohandle} takes a handle so that you can do whatever you like with the +result. + +\starttyping +table.serialize (root, name, reduce, noquotes, hexify) +table.print (root, name, reduce, noquotes, hexify) +table.tofile (filename, root, name, reduce, noquotes, hexify) +table.tohandle (handle, root, name, reduce, noquotes, hexify) +\stoptyping + +The serialization can be controlled in several ways. Often only the first two +options makes sense: + +\ShowLuaExampleOne {table} {serialize} {{ a = 2 }} +\ShowLuaExampleOne {table} {serialize} {{ a = 2 }, "name"} +\ShowLuaExampleOne {table} {serialize} {{ a = 2 }, true} +\ShowLuaExampleOne {table} {serialize} {{ a = 2 }, false} +\ShowLuaExampleOne {table} {serialize} {{ a = 2 }, "return"} +\ShowLuaExampleOne {table} {serialize} {{ a = 2 }, 12} + +\ShowLuaExampleOne {table} {serialize} {{ a = 2, [3] = "b", [true] = "6" }, nil, true} +\ShowLuaExampleOne {table} {serialize} {{ a = 2, [3] = "b", [true] = "6" }, nil, true, true} +\ShowLuaExampleOne {table} {serialize} {{ a = 2, [3] = "b", [true] = "6" }, nil, true, true, true} + +In \CONTEXT\ there is also a \type {tocontext} function that typesets the table +verbose. This is handy for manuals and tracing. + +\stopsummary + +\startsummary[title={identical are_equal}] + +These two function compare two tables that have a similar structure. The \type +{identical} variant operates on a hash while \type {are_equal} assumes an indexed +table. + +\starttyping +local b = table.identical (one, two) +local b = table.are_equal (one, two) +\stoptyping + +\ShowLuaExampleThree {table} {identical} {{ a = { x = 2 } }, { a = { x = 3 } }} +\ShowLuaExampleThree {table} {identical} {{ a = { x = 2 } }, { a = { x = 2 } }} + +\ShowLuaExampleThree {table} {are_equal} {{ a = { x = 2 } }, { a = { x = 3 } }} +\ShowLuaExampleThree {table} {are_equal} {{ a = { x = 2 } }, { a = { x = 2 } }} + +\ShowLuaExampleThree {table} {identical} {{ "one", "two" }, { "one", "two" }} +\ShowLuaExampleThree {table} {identical} {{ "one", "two" }, { "two", "one" }} + +\ShowLuaExampleThree {table} {are_equal} {{ "one", "two" }, { "one", "two" }} +\ShowLuaExampleThree {table} {are_equal} {{ "one", "two" }, { "two", "one" }} + +\stopsummary + +\startsummary[title={tohash fromhash swapped swaphash reversed reverse mirrored}] + +We use \type {tohash} quite a lot in \CONTEXT. It converts a list into a hash so +that we can easily check if (a string) is in a given set. The \type {fromhash} +function does the opposite: it creates a list of keys from a hashed table where +each value that is not \type {false} or \type {nil} is present. + +\starttyping +local hashed = table.tohash (indexed) +local indexed = table.fromhash(hashed) +\stoptyping + +The function \type {swapped} turns keys into values vise versa while the \type +{reversed} and \type {reverse} reverses the values in an indexed table. The last +one reverses the table itself (in|-|place). + +\starttyping +local swapped = table.swapped (indexedtable) +local reversed = table.reversed (indexedtable) +local reverse = table.reverse (indexedtable) +local mirrored = table.mirrored (hashedtable) +\stoptyping + +\ShowLuaExampleTwo {table} {tohash} {{ "a", "b", "c" }} +\ShowLuaExampleTwo {table} {fromhash} {{ a = true, b = false, c = true }} +\ShowLuaExampleTwo {table} {swapped} {{ "a", "b", "c" }} +\ShowLuaExampleTwo {table} {reversed} {{ "a", "b", "c" }} +\ShowLuaExampleTwo {table} {reverse} {{ 1, 2, 3, 4 }} +\ShowLuaExampleTwo {table} {mirrored} {{ a = "x", b = "y", c = "z" }} + +\stopsummary + +\startsummary[title={append prepend}] + +These two functions operate on a pair of indexed tables. The first table gets +appended or prepended by the second. The first table is returned as well. + +\starttyping +table.append (one, two) +table.prepend(one, two) +\stoptyping + +The functions are similar to loops using \type {insert}. + +\ShowLuaExampleTwo {table} {append} {{ "a", "b", "c" }, { "d", "e" }} +\ShowLuaExampleTwo {table} {prepend} {{ "a", "b", "c" }, { "d", "e" }} + +\stopsummary + +\startsummary[title={merge merged imerge imerged}] + +You can merge multiple hashes with \type {merge} and indexed tables with \type +{imerge}. The first table is the target and is returned. + +\starttyping +table.merge (one, two, ...) +table.imerge (one, two, ...) +\stoptyping + +The variants ending with a \type {d} merge the given list of tables and return +the result leaving the first argument untouched. + +\starttyping +local merged = table.merged (one, two, ...) +local merged = table.imerged (one, two, ...) +\stoptyping + +\ShowLuaExampleTwo {table} {merge} {{ a = 1, b = 2, c = 3 }, { d = 1 }, { a = 0 }} +\ShowLuaExampleTwo {table} {imerge} {{ "a", "b", "c" }, { "d", "e" }, { "f", "g" }} + +% \ShowLuaExampleTwo {table} {merged} {{ a = 1, b = 2, c = 3 }, { d = 1 }, { a = 0 }} +% \ShowLuaExampleTwo {table} {imerged} {{ "a", "b", "c" }, { "d", "e" }, { "f", "g" }} + +\stopsummary + +\startsummary[title={copy fastcopy}] + +When copying a table we need to make a real and deep copy. The \type {copy} +function is an adapted version from the \LUA\ wiki. The \type {fastopy} is faster +because it does not check for circular references and does not share tables when +possible. In practice using the fast variant is okay. + +\starttyping +local copy = table.copy (t) +local copy = table.fastcopy(t) +\stoptyping + +\stopsummary + +\startsummary[title={flattened}] + +A nested table can be unnested using \type {flattened}. Normally you will only +use this function if the content is somewhat predictable. Often using one of the +merge functions does a similar job. + +\starttyping +local flattened = table.flatten(t) +\stoptyping + +\ShowLuaExampleTwo {table} {flattened} {{ a = 1, b = 2, { c = 3 }, d = 4}} +\ShowLuaExampleTwo {table} {flattened} {{ 1, 2, { 3, { 4 } }, 5}} +\ShowLuaExampleTwo {table} {flattened} {{ 1, 2, { 3, { 4 } }, 5}, 1} +\ShowLuaExampleTwo {table} {flattened} {{ a = 1, b = 2, { c = 3 }, d = 4}} +\ShowLuaExampleTwo {table} {flattened} {{ 1, 2, { 3, { c = 4 } }, 5}} +\ShowLuaExampleTwo {table} {flattened} {{ 1, 2, { 3, { c = 4 } }, 5}, 1} + +\stopsummary + +\startsummary[title={loweredkeys}] + +The name says it all: this function returns a new table with the keys being lower +case. This is handy in cases where the keys have a change to be inconsistent, as +can be the case when users input keys and values in less controlled ways. + +\starttyping +local normalized = table.loweredkeys { a = "a", A = "b", b = "c" } +\stoptyping + +\ShowLuaExampleTwo {table} {loweredkeys} {{ a = 1, b = 2, C = 3}} + +\stopsummary + +\startsummary[title={contains}] + +This function works with indexed tables. Watch out, when you look for a match, +the number \type {1} is not the same as string \type {"1"}. The function returns +the index or \type {false}. + +\starttyping +if table.contains(t, 5 ) then ... else ... end +if table.contains(t,"5") then ... else ... end +\stoptyping + +\ShowLuaExampleThree {table} {contains} {{ "a", 2, true, "1"}, 1} +\ShowLuaExampleThree {table} {contains} {{ "a", 2, true, "1"}, "1"} + +\stopsummary + +\startsummary[title={unique}] + +When a table (can) contain duplicate entries you can get rid of them by using the +\type {unique} helper: + +\starttyping +local t = table.unique { 1, 2, 3, 4, 3, 2, 5, 6 } +\stoptyping + +\ShowLuaExampleTwo {table} {unique} { { "a", "b", "c", "a", "d" } } + +\stopsummary + +\startsummary[title={count}] + +The name speaks for itself: this function counts the number of entries in the +given table. For an indexed table \type {#t} is faster. + +\starttyping +local n = table.count(t) +\stoptyping + +\ShowLuaExampleThree {table} {count} {{ 1, 2, [4] = 4, a = "a" }} + +\stopsummary + +\startsummary[title={sequenced}] + +Normally, when you trace a table, printing the serialized version is quite +convenient. However, when it concerns a simple table, a more compact variant is: + +\starttyping +print(table.sequenced(t, separator)) +\stoptyping + +% beware: by default sequences has | as separator + +\ShowLuaExampleThree {table} {sequenced} {{ 1, 2, 3, 4}} +\ShowLuaExampleThree {table} {sequenced} {{ 1, 2, [4] = 4, a = "a" }, ", "} + +\stopsummary + +\stopsection + +\startsection[title=Math] + +In addition to the built-in math function we provide: \type {round}, \type {odd}, +\type {even}, \type {div}, \type {mod}, \type {sind}, \type {cosd} and +\type {tand}. + +At the \TEX\ end we have a helper \type {luaexpr} that you can use to do +calculations: + +\startbuffer + \luaexpr{1 + 2.3 * 4.5 + math.pi} = \cldcontext{1 + 2.3 * 4.5 + math.pi} +\stopbuffer + +\typebuffer + +Both calls return the same result, but the first one is normally faster than the +\type {context} command which has quite some overhead. + +\blank \getbuffer \blank + +The \type {\luaexpr} command can also better deal with for instance conditions, +where it returns \type {true} or \type {false}, while \type {\cldcontext} would +interpret the boolean value as a special signal. + +\stopsection + +\startsection[title=Booleans] + +\startsummary[title={tonumber}] + +This function returns the number one or zero. You will seldom need this function. + +\starttyping +local state = boolean.tonumber(str) +\stoptyping + +\ShowLuaExampleThree {boolean} {tonumber} {true} + +\stopsummary + +\startsummary[title={toboolean}] + +When dealing with configuration files or tables a bit flexibility in setting a +state makes sense, if only because in some cases it's better to say \type {yes} +than \type {true}. + +\starttyping +local b = toboolean(str) +local b = toboolean(str,tolerant) +\stoptyping + +When the second argument is true, the strings \type {true}, \type {yes}, \type +{on}, \type {1}, \type {t} and the number \type {1} all turn into \type {true}. +Otherwise only \type {true} is honoured. This function is also defined in the +global namespace. + +\ShowLuaExampleThree {string} {toboolean} {"true"} +\ShowLuaExampleThree {string} {toboolean} {"yes"} +\ShowLuaExampleThree {string} {toboolean} {"yes",true} + +\stopsummary + +\startsummary[title={is_boolean}] + +This function is somewhat similar to the previous one. It interprets the strings +\type {true}, \type {yes}, \type {on} and \type {t} as \type {true} and +\type{false}, \type {no}, \type {off} and \type {f} as \type {false}. Otherwise +\type {nil} is returned, unless a default value is given, in which case that is +returned. + +\starttyping +if is_boolean(str) then ... end +if is_boolean(str,default) then ... end +\stoptyping + +\ShowLuaExampleThree {string} {is_boolean} {"true"} +\ShowLuaExampleThree {string} {is_boolean} {"off"} +\ShowLuaExampleThree {string} {is_boolean} {"crap",true} + +\stopsummary + +\stopsection + +\startsection[title=Strings] + +\LUA\ strings are simply sequences of bytes. Of course in some places special +treatment takes place. For instance \type {\n} expands to one or more characters +representing a newline, depending on the operating system, but normally, as long +as you manipulate strings in the perspective of \LUATEX, you don't need to worry +about such issues too much. As \LUATEX\ is a \UTF-8 engine, strings normally are +in that encoding but again, it does not matter much as \LUA\ is quite agnostic +about the content of strings: it does not care about three characters reflecting +one \UNICODE\ character or not. This means that when you use for instance the +functions discussed here, or use libraries like \type {lpeg} behave as you +expect. + +Versions later than 0.75 are likely to have some basic \UNICODE\ support on board +but we can easily adapt to that. At least till \LUATEX\ version 0.75 we provided +the \type {slunicode} library but users cannot assume that that will be present for +ever. If you want to mess around with \UTF\ string, use the \type {utf} library +instead as that is the one we provide in \MKIV. It presents the stable interface to +whatever \LUA\ itself provides and|/|or what \LUATEX\ offers and|/|or what +is there because \MKIV\ implements it. + +\startsummary[title={[lua] byte char}] + +As long as we're dealing with \ASCII\ characters we can use these two functions to +go from numbers to characters and vise versa. + +\ShowLuaExampleSeven {string} {byte} {"luatex"} +\ShowLuaExampleSeven {string} {byte} {"luatex",1,3} +\ShowLuaExampleSeven {string} {byte} {"luatex",-3,-1} + +\ShowLuaExampleSeven {string} {char} {65} +\ShowLuaExampleSeven {string} {char} {65,66,67} + +\stopsummary + +\startsummary[title={[lua] sub}] + +You cannot directly access a character in a string but you can take any slice you +want using \type {sub}. You need to provide a start position and negative values +will count backwards from the end. + +\starttyping +local slice = string.sub(str,first,last) +\stoptyping + +\ShowLuaExampleThree {string} {sub} {"abcdef",2} +\ShowLuaExampleThree {string} {sub} {"abcdef",2,3} +\ShowLuaExampleThree {string} {sub} {"abcdef",-3,-2} + +\stopsummary + +\startsummary[title={[lua] gsub}] + +There are two ways of analyzing the content of a string. The more modern and +flexible approach is to use \type {lpeg}. The other one uses some functions in +the \type {string} namespace that accept so called patterns for matching. While +\type {lpeg} is more powerfull than regular expressions, the pattern matching is +less powerfull but sometimes faster and also easier to specify. In many cases it +can do the job quite well. + +\starttyping +local new, count = string.gsub(old,pattern,replacement) +\stoptyping + +The replacement can be a function. Often you don't want the number +of matches, and the way to avoid this is either to store the result +in a variable: + +\starttyping +local new = string.gsub(old,"lua","LUA") +print(new) +\stoptyping + +or to use parentheses to signal the interpreter that only one value +is return. + +\starttyping +print((string.gsub(old,"lua","LUA")) +\stoptyping + +Patterns can be more complex so you'd better read the \LUA\ manual if you want to +know more about them. + +\ShowLuaExampleThree {string} {gsub} {"abcdef","b","B"} +\ShowLuaExampleThree {string} {gsub} {"abcdef","[bc]",string.upper} + +An optional fourth argument specifies how often the replacement has to happen + +\ShowLuaExampleThree {string} {gsub} {"textextextex","tex","abc"} +\ShowLuaExampleThree {string} {gsub} {"textextextex","tex","abc",1} +\ShowLuaExampleThree {string} {gsub} {"textextextex","tex","abc",2} + +\stopsummary + +\startsummary[title={[lua] find}] + +The \type {find} function returns the first and last position of the match: + +\starttyping +local first, last = find(str,pattern) +\stoptyping + +If you're only interested if there is a match at all, it's enough to know that +there is a first position. No match returns \type {nil}. So, + +\starttyping +if find("luatex","tex") then ... end +\stoptyping + +works out okay. You can pass an extra argument to \type {find} that indicates the +start position. So you can use this function to loop over all matches: just start +again at the end of the last match. + +A fourth optional argument is a boolean that signals not to interpret the pattern +but use it as|-|is. + +\ShowLuaExampleThree {string} {find} {"abc.def","c\letterpercent.d",1,false} +\ShowLuaExampleThree {string} {find} {"abc.def","c\letterpercent.d",1,true} +\ShowLuaExampleThree {string} {find} {"abc\letterpercent.def","c\letterpercent.d",1,false} +\ShowLuaExampleThree {string} {find} {"abc\letterpercent.def","c\letterpercent.d",1,true} + +\stopsummary + +\startsummary[title={[lua] match gmatch}] + +With \type {match} you can split of bits and pieces of a string. The parenthesis +indicate the captures. + +\starttyping +local a, b, c, ... = string.match(str,pattern) +\stoptyping + +The \type {gmatch} function is used to loop over a string, for instance the +following code prints the elements in a comma separated list, ignoring spaces +after commas. + +\starttyping +for s in string.gmatch(str,"([^,%s])+") do + print(s) +end +\stoptyping + +A more detailed description can be found in the \LUA\ reference manual, so we +only mention the special directives. Characters are grouped in classes: + +\starttabulate[|lT|l|] +\HL +\NC \letterpercent a \NC letters \NC \NR +\NC \letterpercent l \NC lowercase letters \NC \NR +\NC \letterpercent u \NC uppercase letters \NC \NR +\NC \letterpercent d \NC digits \NC \NR +\NC \letterpercent w \NC letters and digits \NC \NR +\NC \letterpercent c \NC control characters \NC \NR +\NC \letterpercent p \NC punctuation \NC \NR +\NC \letterpercent x \NC hexadecimal characters \NC \NR +\NC \letterpercent s \NC space related characters \NC \NR +\HL +\stoptabulate + +You can create sets too: + +\starttabulate[|lT|l|] +\HL +\NC [\letterpercent l\letterpercent d] \NC lowercase letters and digits \NC \NR +\NC [^\letterpercent d\letterpercent p] \NC all characters except digits and punctuation \NC \NR +\NC [p-z] \NC all characters in the range \type {p} upto \type {z} \NC \NR +\NC [pqr] \NC all characters \type {p}, \type {q} and \type {r} \NC \NR +\HL +\stoptabulate + +There are some characters with special meanings: + +\starttabulate[|lT|l|] +\HL +\NC \letterhat \NC the beginning of a string \NC \NR +\NC \letterdollar \NC end of a string \NC \NR +\NC . \NC any character \NC \NR +\NC * \NC zero or more of the preceding specifier, greedy \NC \NR +\NC - \NC zero or more of the preceding specifier, least possible \NC \NR +\NC + \NC one or more of the preceding specifier \NC \NR +\NC ? \NC zero or one of the preceding specifier \NC \NR +\NC ( ) \NC encapsulate capture \NC \NR +\NC \letterpercent b \NC capture all between the following two characters \NC \NR +\HL +\stoptabulate + +You can use whatever you like to be matched: + +\starttabulate[|lT|l|] +\HL +\NC pqr \NC the sequence \type {pqr} \NC \NR +\NC my name is (\letterpercent w) \NC the word following \type {my name is} \NC \NR +\HL +\stoptabulate + +If you want to specify such a token as it is, then you can precede it with a +percent sign, so to get a percent, you need two in a row. + +\ShowLuaExampleThree {string} {match} {"before:after","^(.-):"} +\ShowLuaExampleThree {string} {match} {"before:after","^([^:])"} +\ShowLuaExampleThree {string} {match} {"before:after","bef(.*)ter"} +\ShowLuaExampleThree {string} {match} {"abcdef","[b-e]+"} +\ShowLuaExampleThree {string} {match} {"abcdef","[b-e]*"} +\ShowLuaExampleThree {string} {match} {"abcdef","b-e+"} +\ShowLuaExampleThree {string} {match} {"abcdef","b-e*"} + +\stopsummary + +Such patterns should not be confused with regular expressions, although to some +extent they can do the same. If you really want to do complex matches, you should +look into \LPEG. + +\startsummary[title={[lua] lower upper}] + +These two function spreak for themselves. + +\ShowLuaExampleThree {string} {lower} {"LOW"} +\ShowLuaExampleThree {string} {upper} {"upper"} + +\stopsummary + +\startsummary[title={[lua] format}] + +The \type {format} function takes a template as first argument and one or more +additional arguments depending on the format. The template is similar to the one +used in \CCODE\ but it has some extensions. + +\starttyping +local s = format(format, str, ...) +\stoptyping + +The following table gives an overview of the possible format directives. The +\type {s} is the most probably candidate and can handle numbers well as strings. +Watch how the minus sign influences the alignment. \footnote {There can be +differences between platforms although so far we haven't run into problems. Also, +\LUA\ 5.2 does a bit more checking on correct arguments and \LUA\ 5.3 is more +picky on integers.} + +\starttabulate[|lB|lT|lT|lT|] +\HL +\NC integer \NC \letterpercent i \NC 12345 \NC \cldcontext{string.format("\letterpercent i", 12345 )} \NC \NR +\NC integer \NC \letterpercent d \NC 12345 \NC \cldcontext{string.format("\letterpercent d", 12345 )} \NC \NR +\NC unsigned \NC \letterpercent u \NC -12345 \NC \cldcontext{string.format("\letterpercent u", 12345 )} \NC \NR +\NC character \NC \letterpercent c \NC 123 \NC \cldcontext{string.format("\letterpercent c", 89 )} \NC \NR +\NC hexadecimal \NC \letterpercent x \NC 123 \NC \cldcontext{string.format("\letterpercent x", 123 )} \NC \NR +\NC \NC \letterpercent X \NC 123 \NC \cldcontext{string.format("\letterpercent X", 123 )} \NC \NR +\NC octal \NC \letterpercent o \NC 12345 \NC \cldcontext{string.format("\letterpercent o", 12345 )} \NC \NR +\HL +\NC string \NC \letterpercent s \NC abc \NC \cldcontext{string.format("\letterpercent s", "abcd")} \NC \NR +\NC \NC \letterpercent -8s \NC 123 \NC \cldcontext{string.format("\letterpercent -8s", 123 )} \NC \NR +\NC \NC \letterpercent 8s \NC 123 \NC \cldcontext{string.format("\letterpercent 8s", 123 )} \NC \NR +\HL +\NC float \NC \letterpercent 0.2f \NC 12.345 \NC \cldcontext{string.format("\letterpercent 0.2f",12.345)} \NC \NR +\NC exponential \NC \letterpercent 0.2e \NC 12.345 \NC \cldcontext{string.format("\letterpercent 0.2e",12.345)} \NC \NR +\NC \NC \letterpercent 0.2E \NC 12.345 \NC \cldcontext{string.format("\letterpercent 0.2E",12.345)} \NC \NR +\NC autofloat \NC \letterpercent 0.2g \NC 12.345 \NC \cldcontext{string.format("\letterpercent 0.2g",12.345)} \NC \NR +\NC \NC \letterpercent 0.2G \NC 12.345 \NC \cldcontext{string.format("\letterpercent 0.2G",12.345)} \NC \NR +\HL +\stoptabulate + +\startasciimode +\ShowLuaExampleThree {string} {format} {"U+\letterpercent 05X",2010} +\stopasciimode + +\stopsummary + +\startsummary[title={striplines}] + +The \type {striplines} function can strip leading and trailing empty lines, +collapse or delete intermediate empty lines and strips leading and trailing +spaces. We will demonstrate this with string \type {str}: + +\startluacode +local str = table.concat( { +" ", +" aap", +" noot mies", +" ", +" ", +" wim zus jet", +"teun vuur gijs", +" lam kees bok weide", +" ", +"does hok duif schapen ", +" ", +}, "\n") + +document.TempString = str + +function document.ShowStrippedString(str) + str = string.gsub(str," ","\\allowbreak<sp>\\allowbreak ") + str = string.gsub(str,"([\010])","\\allowbreak<lf>\\allowbreak ") + context.startalign { "flushleft,verytolerant" } + context("{\\tttf %s}",str) + context.stopalign() +end + +function document.ShowStrippedBuffer(name,str) + context.tobuffer(name,str) + context.typebuffer( { name }, { numbering = "line" }) + context.resetbuffer { name } +end + +function document.ShowStrippedCommand(option) + context.type( { style = "ttbf" }, [[utilities.strings.striplines(str,"]] .. option .. [[")]]) +end + +context.blank { "big" } +document.ShowStrippedString(str) +document.ShowStrippedBuffer("dummy",str) + +\stopluacode + +The different options for stripping are demonstrated below, We use verbose +descriptions instead of vague boolean flags. + +\startluacode +local str = document.TempString ; document.TempString = nil + +for option in table.sortedhash(utilities.strings.striplinepatterns) do + local s = utilities.strings.striplines(str,option) + context.blank() + document.ShowStrippedCommand(option) + context.blank { "big,samepage" } + document.ShowStrippedString(s) + context.blank { "big,samepage" } + document.ShowStrippedBuffer(option,str) +end +\stopluacode + +You can of course mix usage with the normal \type {context} helper commands, for +instance put them in buffers. Buffers normally will prune leading and trailing +empty lines anyway. + +\starttyping +context.tobuffer("dummy",utilities.strings.striplines(str)) +context.typebuffer( { "dummy" }, { numbering = "line" }) +\stoptyping + +\stopsummary + +\startsummary[title={formatters}] + +The \type {format} function discussed before is the built|-|in. As an alternative +\CONTEXT\ provides an additional formatter that has some extensions. Interesting +is that that one is often more efficient, although there are cases where the +speed is comparable. As we run out of keys, some extra ones are a bit counter +intuitive, like \type {l} for booleans (logical). + +\start \setuptype[color=] + +\starttabulate[|lB|lT|lT|lT|] +\HL +\NC utf character \NC \letterpercent c \NC 322 \NC \cldcontext{"\letterpercent c",322} \NC \NR +\HL +\NC string \NC \letterpercent s \NC foo \NC \cldcontext{"\letterpercent s","foo"} \NC \NR +\NC force tostring \NC \letterpercent S \NC nil \NC \cldcontext{"\letterpercent S",nil} \NC \NR +\NC quoted string \NC \letterpercent q \NC foo \NC \cldcontext{"\letterpercent q","foo"} \NC \NR +\NC force quoted string \NC \letterpercent Q \NC nil \NC \cldcontext{"\letterpercent Q",nil} \NC \NR +\NC \NC \letterpercent N \NC 0123 \NC \cldcontext{"\letterpercent N","0123"} \NC \NR +\NC automatic quoted \NC \letterpercent a \NC true \NC \cldcontext{"\letterpercent a",true} \NC \NR\NC \NR +\NC \NC \letterpercent A \NC true \NC \cldcontext{"\letterpercent A",true} \NC \NR\NC \NR +\NC left aligned utf \NC \letterpercent 30< \NC xx½xx \NC \cldcontext{"\letterpercent 30<","xx½xx"} \NC \NR\NC \NR +\NC right aligned utf \NC \letterpercent 30> \NC xx½xx \NC \cldcontext{"\letterpercent 30>","xx½xx"} \NC \NR\NC \NR +\HL +\NC integer \NC \letterpercent i \NC 1234 \NC \cldcontext{"\letterpercent i",1234} \NC \NR +\NC integer \NC \letterpercent d \NC 1234 \NC \cldcontext{"\letterpercent d",1234} \NC \NR +\NC signed number \NC \letterpercent I \NC 1234 \NC \cldcontext{"\letterpercent I",1234} \NC \NR +\NC rounded number \NC \letterpercent r \NC 1234.56 \NC \cldcontext{"\letterpercent r",1234.56} \NC \NR +\NC stripped number \NC \letterpercent N \NC 000123 \NC \cldcontext{"\letterpercent N","000123"} \NC \NR +\NC comma/period float \NC \letterpercent m \NC 12.34 \NC \cldcontext{"\letterpercent m",12.34} \NC \NR +\NC period/comma float \NC \letterpercent M \NC 12.34 \NC \cldcontext{"\letterpercent M",12.34} \NC \NR +\HL +\NC hexadecimal \NC \letterpercent x \NC 1234 \NC \cldcontext{"\letterpercent x",1234} \NC \NR +\NC \NC \letterpercent X \NC 1234 \NC \cldcontext{"\letterpercent X",1234} \NC \NR +\NC octal \NC \letterpercent o \NC 1234 \NC \cldcontext{"\letterpercent o",1234} \NC \NR +\HL +\NC float \NC \letterpercent 0.2f \NC 12.345 \NC \cldcontext{"\letterpercent 0.2f",12.345} \NC \NR +\NC formatted float \NC \letterpercent 2.3k \NC 12.3456 \NC \cldcontext{"\letterpercent 2.3f",12.3456} \NC \NR +\NC checked float \NC \letterpercent 0.2F \NC 12.30 \NC \cldcontext{"\letterpercent 0.2F",12.3} \NC \NR +\NC exponential \NC \letterpercent .2e \NC 12.345e120 \NC \cldcontext{"\letterpercent 0.2j",12.345e120} \NC \NR +\NC \NC \letterpercent .2E \NC 12.345e120 \NC \cldcontext{"\letterpercent 0.2J",12.345e120} \NC \NR +\NC sparse exp \NC \letterpercent 0.2j \NC 12.345e120 \NC \cldcontext{"\letterpercent 0.2j",12.345e120} \NC \NR +\NC \NC \letterpercent 0.2J \NC 12.345e120 \NC \cldcontext{"\letterpercent 0.2J",12.345e120} \NC \NR +\NC autofloat \NC \letterpercent g \NC 12.345 \NC \cldcontext{"\letterpercent 0.2J",12.345} \NC \NR +\NC \NC \letterpercent G \NC 12.345 \NC \cldcontext{"\letterpercent 0.2J",12.345} \NC \NR +\HL +\NC unicode value 0x \NC \letterpercent h \NC ł 1234 \NC \cldcontext{"\letterpercent v \letterpercent v", "ł",1234} \NC \NR +\NC \NC \letterpercent H \NC ł 1234 \NC \cldcontext{"\letterpercent V \letterpercent V", "ł",1234} \NC \NR +\NC unicode value U+ \NC \letterpercent u \NC ł 1234 \NC \cldcontext{"\letterpercent u \letterpercent u", "ł",1234} \NC \NR +\NC \NC \letterpercent U \NC ł 1234 \NC \cldcontext{"\letterpercent U \letterpercent U", "ł",1234} \NC \NR +\HL +\NC points \NC \letterpercent p \NC 1234567 \NC \cldcontext{"\letterpercent p",1234567} \NC \NR +\NC basepoints \NC \letterpercent b \NC 1234567 \NC \cldcontext{"\letterpercent b",1234567} \NC \NR +\HL +\NC table concat \NC \letterpercent t \NC \arg{1,2,3} \NC \cldcontext{"\letterpercent t",{1,2,3}} \NC \NR +\NC \NC \letterpercent *t \NC \arg{1,2,3} \NC \cldcontext{"\letterpercent *t",{1,2,3}} \NC \NR +\NC \NC \letterpercent \arg{ AND }t \NC \arg{a=1,b=3} \NC \cldcontext{"\letterpercent +{ AND }T",{a=1,b=2}} \NC \NR +\NC table serialize \NC \letterpercent T \NC \arg{1,2,3} \NC \cldcontext{"\letterpercent *t",{1,2,3}} \NC \NR +\NC \NC \letterpercent T \NC \arg{a=1,b=3} \NC \let|\relax\cldcontext{"\letterpercent T",{a=1,b=2}} \NC \NR +\NC \NC \letterpercent +T \NC \arg{a=1,b=3} \NC \cldcontext{"\letterpercent [+T]",{a=1,b=2}} \NC \NR +\HL +\NC boolean (logic) \NC \letterpercent l \NC "a" == "b" \NC \cldcontext{"\letterpercent l","a"=="b"} \NC \NR +\NC \NC \letterpercent L \NC "a" == "b" \NC \cldcontext{"\letterpercent L","a"=="b"} \NC \NR +\HL +\NC whitespace \NC \letterpercent w \NC 3 \NC \obeyspaces\vl\cldcontext{"\letterpercent w",3}\vl \NC \NR +\NC \NC \letterpercent 2w \NC 3 \NC \obeyspaces\vl\cldcontext{"\letterpercent 2w",3}\vl \NC \NR +\NC \NC \letterpercent 4W \NC \NC \obeyspaces\vl\cldcontext{"\letterpercent 4W"}\vl \NC \NR +\HL +\NC skip \NC \letterpercent 2z \NC 1,2,3,4 \NC \obeyspaces\vl\cldcontext{"\letterpercent s\letterpercent 2z\letterpercent s",1,2,3,4}\vl \NC \NR +\HL +\stoptabulate + +\stop + +The generic formatters \type {a} and \type {A} convert the argument into a string +and deals with strings, number, booleans, tables and whatever. We mostly use +these in tracing. The lowercase variant uses single quotes, and the uppercase +variant uses double quotes. + +A special one is the alignment formatter, which is a variant on the \type {s} one +that also takes an optional positive of negative number: + +\startbuffer +\startluacode +context.start() +context.tttf() +context.verbatim("[[% 30<]]","xxaxx") context.par() +context.verbatim("[[% 30<]]","xx½xx") context.par() +context.verbatim("[[% 30>]]","xxaxx") context.par() +context.verbatim("[[% 30>]]","xx½xx") context.par() +context.verbatim("[[%-30<]]","xxaxx") context.par() +context.verbatim("[[%-30<]]","xx½xx") context.par() +context.verbatim("[[%-30>]]","xxaxx") context.par() +context.verbatim("[[%-30>]]","xx½xx") context.par() +context.stop() +\stopluacode +\stopbuffer + +\typebuffer \getbuffer + +There are two more formatters plugged in: \type {!xml!} and \type {!tex!}. These +are best demonstrated with an example: + +\starttyping +local xf = formatter["xml escaped: %!xml!"] +local xr = formatter["tex escaped: %!tex!"] + +print(xf("x > 1 && x < 10")) +print(xt("this will cost me $123.00 at least")) +\stoptyping + +weird, this fails when cld-verbatim is there as part of the big thing: +catcodetable 4 suddenly lacks the comment being a other + +The \type {context} command uses the formatter so one can say: + +\startbuffer +\startluacode +context("first some xml: %!xml!, and now some %!tex!", + "x > 1 && x < 10", "this will cost me $123.00 at least") +\stopluacode +\stopbuffer + +\typebuffer + +This renders as follows: + +\blank \getbuffer \blank + +You can extend the formatter but we advise you not to do that unless you're sure +what you're doing. You never know what \CONTEXT\ itself might add for its own +benefit. + +However, you can define your own formatter and add to that without interference. +In fact, the main formatter is just defined that way. This is how it works: + +\startbuffer[definition] +local MyFormatter = utilities.strings.formatters.new() + +utilities.strings.formatters.add ( + MyFormatter, + "upper", + "global.string.upper(%s)" +) +\stopbuffer + +\typebuffer[definition] + +Now you can use this one as: + +\startbuffer[usage] +context.bold(MyFormatter["It's %s or %!upper!."]("this","that")) +\stopbuffer + +\typebuffer[usage] + +\blank \ctxluabuffer[definition,usage] \blank + +Because we're running inside \CONTEXT, a better definition would be this: + +\startbuffer +local MyFormatter = utilities.strings.formatters.new() + +utilities.strings.formatters.add ( + MyFormatter, + "uc", + "myupper(%s)", + -- "local myupper = global.characters.upper" + { myupper = global.characters.upper } +) + +utilities.strings.formatters.add ( + MyFormatter, + "lc", + "mylower(%s)", + -- "local mylower = global.characters.lower" + { mylower = global.characters.lower } +) + +utilities.strings.formatters.add ( + MyFormatter, + "sh", + "myshaped(%s)", + -- "local myshaped = global.characters.shaped" + { myshaped = global.characters.shaped } +) + +context(MyFormatter["Uppercased: %!uc!"]("ÀÁÂÃÄÅàáâãäå")) +context.par() +context(MyFormatter["Lowercased: %!lc!"]("ÀÁÂÃÄÅàáâãäå")) +context.par() +context(MyFormatter["Reduced: %!sh!"]("ÀÁÂÃÄÅàáâãäå")) +\stopbuffer + +\typebuffer + +The last arguments creates shortcuts. As expected we get: + +\blank \ctxluabuffer \blank + +Of course you can also apply the casing functions directly so in practice you +shouldn't use formatters without need. Among the advantages of using formatters +are: + +\startitemize[packed] +\startitem They provide a level of abstraction. \stopitem +\startitem They can replace multiple calls to \type {\context}. \stopitem +\startitem Sometimes they make source code look better. \stopitem +\startitem Using them is often more efficient and faster. \stopitem +\stopitemize + +The last argument might sound strange but considering the overhead involved in +the \type {context} (related) functions, doing more in one step has benefits. +Also, formatters are implemented quite efficiently, so their overhead can be +neglected. + +In the examples you see that a formatter extension is itself a template. + +\startbuffer +local FakeXML = utilities.strings.formatters.new() + +utilities.strings.formatters.add(FakeXML,"b",[["<" ..%s..">" ]]) +utilities.strings.formatters.add(FakeXML,"e",[["</"..%s..">" ]]) +utilities.strings.formatters.add(FakeXML,"n",[["<" ..%s.."/>"]]) + +context(FakeXML["It looks like %!b!xml%!e! doesn't it?"]("it","it")) +\stopbuffer + +\typebuffer + +This gives: \ctxluabuffer. Of course we could go over the top here: + +\startbuffer +local FakeXML = utilities.strings.formatters.new() + +local stack = { } + +function document.f_b(s) + table.insert(stack,s) + return "<" .. s .. ">" +end + +function document.f_e() + return "</" .. table.remove(stack) .. ">" +end + +utilities.strings.formatters.add(FakeXML,"b",[[global.document.f_b(%s)]]) +utilities.strings.formatters.add(FakeXML,"e",[[global.document.f_e()]]) + +context(FakeXML["It looks like %1!b!xml%0!e! doesn't it?"]("it")) +\stopbuffer + +\typebuffer + +This gives: \ctxluabuffer. Such a template look horrible, although it's not too +far from the regular format syntax: just compare \type {%1f} with \type {%1!e!}. +The zero trick permits us to inject information that we've put on the stack. As +this kind of duplicate usage might occur most, a better solution is available: + +\startbuffer +local FakeXML = utilities.strings.formatters.new() + +utilities.strings.formatters.add(FakeXML,"b",[["<" .. %s .. ">"]]) +utilities.strings.formatters.add(FakeXML,"e",[["</" .. %s .. ">"]]) + +context(FakeXML["It looks like %!b!xml%-1!e! doesn't it?"]("it")) +\stopbuffer + +\typebuffer + +We get: \ctxluabuffer. Anyhow, in most cases you will never feel the need for +such hackery and the regular formatter works fine. Adding this extension +mechanism was rather trivial and it doesn't influence the performance. + +In \CONTEXT\ we have a few more extensions: + +\starttyping +utilities.strings.formatters.add ( + strings.formatters, "unichr", + [["U+" .. format("%%05X",%s) .. " (" .. utfchar(%s) .. ")"]] +) + +utilities.strings.formatters.add ( + strings.formatters, "chruni", + [[utfchar(%s) .. " (U+" .. format("%%05X",%s) .. ")"]] +) +\stoptyping + +This one is used in messages: + +\startbuffer +context("Missing character %!chruni! in font.",234) context.par() +context("Missing character %!unichr! in font.",234) +\stopbuffer + +\typebuffer + +This shows up as: + +\blank \getbuffer \blank + +If you look closely to the definition, you will notice that we use \type {%s} +twice. This is a feature of the definer function: if only one argument is +picked up (which is default) then the replacement format can use that two +times. Because we use a format in the constructor, we need to escape the +percent sign there. + +\stopsummary + +\startsummary[title={strip}] + +This function removes any leading and trailing whitespace characters. + +\starttyping +local s = string.strip(str) +\stoptyping + +\ShowLuaExampleThree {string} {strip} {" lua + tex = luatex "} + +\stopsummary + +\startsummary[title={split splitlines checkedsplit}] + +The line splitter is a special case of the generic splitter. The \type {split} +function can get a string as well an \type {lpeg} pattern. The \type +{checkedsplit} function removes empty substrings. + +\starttyping +local t = string.split (str, pattern) +local t = string.split (str, lpeg) +local t = string.checkedsplit (str, lpeg) +local t = string.splitlines (str) +\stoptyping + +\start \let\ntex\relax % hack + +\ShowLuaExampleTwo {string} {split} {"a, b,c, d", ","} +\ShowLuaExampleTwo {string} {split} {"p.q,r", lpeg.S(",.")} +\ShowLuaExampleTwo {string} {checkedsplit} {";one;;two", ";"} +\ShowLuaExampleTwo {string} {splitlines} {"lua\ntex nic"} + +\stop + +\stopsummary + +\startsummary[title={quoted unquoted}] + +You will hardly need these functions. The \type {quoted} function can normally be +avoided using the \type {format} pattern \type {%q}. The \type {unquoted} +function removes single or double quotes but only when the string starts and ends +with the same quote. + +\starttyping +local q = string.quoted (str) +local u = string.unquoted(str) +\stoptyping + +\ShowLuaExampleThree {string} {quoted} {[[test]]} +\ShowLuaExampleThree {string} {quoted} {[[test"test]]} +\ShowLuaExampleThree {string} {unquoted} {[["test]]} +\ShowLuaExampleThree {string} {unquoted} {[["t\"est"]]} +\ShowLuaExampleThree {string} {unquoted} {[["t\"est"x]]} +\ShowLuaExampleThree {string} {unquoted} {"\'test\'"} + +\stopsummary + +\startsummary[title={count}] + +The function \type {count} returns the number of times that a given pattern +occurs. Beware: if you want to deal with \UTF\ strings, you need the variant that +sits in the \type {lpeg} namespace. + +\starttyping +local n = count(str,pattern) +\stoptyping + +\ShowLuaExampleThree {string} {count} {"test me", "e"} + +\stopsummary + +\startsummary[title={limit}] + +This function can be handy when you need to print messages that can be rather +long. By default, three periods are appended when the string is chopped. + +\starttyping +print(limit(str,max,sentinel) +\stoptyping + +\ShowLuaExampleThree {string} {limit} {"too long", 6} +\ShowLuaExampleThree {string} {limit} {"too long", 6, " (etc)"} + +\stopsummary + +\startsummary[title={is_empty}] + +A string considered empty by this function when its length is zero or when it +only contains spaces. + +\starttyping +if is_empty(str) then ... end +\stoptyping + +\ShowLuaExampleThree {string} {is_empty} {""} +\ShowLuaExampleThree {string} {is_empty} {" "} +\ShowLuaExampleThree {string} {is_empty} {" ? "} + +\stopsummary + +\startsummary[title={escapedpattern topattern}] + +These two functions are rather specialized. They come in handy when you need to +escape a pattern, i.e.\ prefix characters with a special meaning by a \type {%}. + +\starttyping +local e = escapedpattern(str, simple) +local p = topattern (str, lowercase, strict) +\stoptyping + +The simple variant does less escaping (only \type {-.?*} and is for instance used +in wildcard patterns when globbing directories. The \type {topattern} function +always does the simple escape. A strict pattern gets anchored to the beginning +and end. If you want to see what these functions do you can best look at their +implementation. + +\stopsummary + +% strings.tabtospace(str,n) +% strings.striplong + +\stopsection + +\startsection[title=\UTF] + +We used to have the \type {slunicode} library available but as most of it is not +used and because it has a somewhat fuzzy state, we will no longer rely on it. In +fact we only used a few functions in the \type {utf} namespace so as \CONTEXT\ +user you'd better stick to what is presented here. You don't have to worry how +they are implemented. Depending on the version of \LUATEX\ it can be that a +library, a native function, or \LPEG is used. + +\startsummary[title={char byte}] + +As \UTF\ is a multibyte encoding the term char in fact refers to a \LUA\ +string of one upto four 8|-|bit characters. + +\starttyping +local b = utf.byte("å") +local c = utf.char(0xE5) +\stoptyping + +The number of places in \CONTEXT\ where do such conversion is not that large: +it happens mostly in tracing messages. + +\starttyping +logs.report("panic","the character U+%05X is used",utf.byte("æ")) +\stoptyping + +\ShowLuaExampleThree {utf} {byte} {"æ"} +\ShowLuaExampleThree {utf} {char} {0xE6} + +\stopsummary + +\startsummary[title={sub}] + +If you need to take a slice of an \UTF\ encoded string the \type {sub} function +can come in handy. This function takes a string and a range defined by two +numbers. Negative numbers count from the end of the string. + +\ShowLuaExampleThree {utf} {sub} {"123456àáâãäå",1,7} +\ShowLuaExampleThree {utf} {sub} {"123456àáâãäå",0,7} +\ShowLuaExampleThree {utf} {sub} {"123456àáâãäå",0,9} +\ShowLuaExampleThree {utf} {sub} {"123456àáâãäå",4} +\ShowLuaExampleThree {utf} {sub} {"123456àáâãäå",0} +\ShowLuaExampleThree {utf} {sub} {"123456àáâãäå",0,0} +\ShowLuaExampleThree {utf} {sub} {"123456àáâãäå",4,4} +\ShowLuaExampleThree {utf} {sub} {"123456àáâãäå",4,0} +\ShowLuaExampleThree {utf} {sub} {"123456àáâãäå",-3,0} +\ShowLuaExampleThree {utf} {sub} {"123456àáâãäå",0,-3} +\ShowLuaExampleThree {utf} {sub} {"123456àáâãäå",-5,-3} +\ShowLuaExampleThree {utf} {sub} {"123456àáâãäå",-3} + +\stopsummary + +\startsummary[title={len}] + +There are probably not that many people that can instantly see how many bytes the +string in the following example takes: + +\starttyping +local l = utf.len("ÀÁÂÃÄÅàáâãäå") +\stoptyping + +Programming languages use \ASCII\ mostly so there each characters takes one byte. +In \CJK\ scripts however, you end up with much longer sequences. If you ever did +some typesetting of such scripts you have noticed that the number of characters +on a page is less than in the case of a Latin script. As information is coded +in less characters, effectively the source of a Latin or \CJK\ document will not +differ that much. + +\ShowLuaExampleThree {utf} {len} {"ÒÓÔÕÖòóôõö"} + +\stopsummary + +\startsummary[title={values characters}] + +There are two iterators that deal with \UTF. In \LUATEX\ these are extensions to +the \type {string} library but for consistency we've move them to the \type {utf} +namespace. + +The following function loops over the \UTF\ characters in a string and returns +the \UNICODE\ number in \type {u}: + +\starttyping +for u in utf.values(str) do + ... -- u is a number +end +\stoptyping + +The next one returns a string \type {c} that has one or more characters as \UTF\ +characters can have upto 4 bytes. + +\starttyping +for c in utf.characters(str) do + ... -- c is a string +end +\stoptyping + +\stopsummary + +\startsummary[title={ustring xstring tocodes}] + +These functions are mostly useful for logging where we want to see the \UNICODE\ +number. + +\ShowLuaExampleThree {utf} {ustring} {0xE6} +\ShowLuaExampleThree {utf} {ustring} {"ù"} +\ShowLuaExampleThree {utf} {xstring} {0xE6} +\ShowLuaExampleThree {utf} {xstring} {"à"} +\ShowLuaExampleThree {utf} {tocodes} {"ùúü"} +\ShowLuaExampleThree {utf} {tocodes} {"àáä",""} +\ShowLuaExampleThree {utf} {tocodes} {"òóö","+"} + +\stopsummary + +\startsummary[title={split splitlines totable}] + +The \type {split} function splits a sequence of \UTF\ characters into a table +which one character per slot. The \type {splitlines} does the same but each slot +has a line instead. The \type {totable} function is similar to \type {split}, but +the later strips an optionally present \UTF\ bom. + +\ShowLuaExampleThree {utf} {split} {"òóö"} + +\stopsummary + +\startsummary[title={count}] + +This function counts the number of times that a given substring occurs in a +string. The patterns can be a string or an \LPEG\ pattern. + +\ShowLuaExampleThree {utf} {count} {"òóöòóöòóö","ö"} +\ShowLuaExampleThree {utf} {count} {"äáàa",lpeg.P("á") + lpeg.P("à")} + +\stopsummary + +\startsummary[title={remapper replacer substituter}] + +With \type {remapper} you can create a remapping function that remaps a given +string using a (hash) table. + +\starttyping +local remap = utf.remapper { a = 'd', b = "c", c = "b", d = "a" } + +print(remap("abcd 1234 abcd")) +\stoptyping + +A remapper checks each character against the given mapping table. Its cousin +\type {replacer} is more efficient and skips non matches. The \type {substituter} +function only does a quick check first and avoids building a string with no +replacements. That one is much faster when you expect not that many replacements. + +The \type {replacer} and \type {substituter} functions take table as argument +and an indexed as well as hashed one are acceptable. In fact you can even do +things like this: + +\starttyping +local rep = utf.replacer { [lpeg.patterns.digit] = "!" } +\stoptyping + +\stopsummary + +\startsummary[title={is_valid}] + +This function returns false if the argument is no valid \UTF\ string. As \LUATEX\ +is pretty strict with respect to the input, this function is only useful when +dealing with external files. + +\starttyping +function checkfile(filename) + local data = io.loaddata(filename) + if data and data ~= "" and not utf.is_valid(data) then + logs.report("error","file %q contains invalid utf",filename) + end +end +\stoptyping + +\stopsummary + +% not that relevant: +% +% -- utf.filetype +% -- string.toutf + +\stopsection + +\startsection[title=Numbers and bits] + +In the \type {number} namespace we collect some helpers that deal with numbers as +well as bits. Starting with \LUA\ 5.2 a library \type {bit32} is but the language +itself doesn't provide for them via operators: the library uses functions to +manipulate numbers upto 2\high{32}. In the latest \LUATEX\ you can use the new +bit related operators. + +% For advanced bit manipulations you should use the \type {bit32} library, otherwise +% it's best to stick to the functions described here. +% +% \startsummary[title={hasbit setbit clearbit}] +% +% As bitsets are numbers you will also use numbers to qualify them. So, if you want to +% set bits 1, 4 and 8, you can to that using the following specification: +% +% \starttyping +% local b = 1 + 4 + 8 -- 0x1 + 0x4 + 0x8 +% local b = 13 -- or 0xC +% \stoptyping +% +% However, changing one bit by adding a number to an existing doesn't work out that well +% if that number already has that bit set. Instead we use: +% +% \starttyping +% local b = number.setbit(b,0x4) +% \stoptyping +% +% In a similar fashion you can turn of a bit: +% +% \starttyping +% local b = number.clearbit(b,0x4) +% \stoptyping +% +% Testing for a bit(set) is done as follows: +% +% \starttyping +% local okay = number.hasbit(b,0x4) +% \stoptyping +% +% \stopsummary +% +% \startsummary[title={bit}] +% +% Where the previously mentioned helpers work with numbers representing one or more +% bits, it is sometimes handy to work with positions. The \type {bit} function +% returns the associated number value. +% +% \ShowLuaExampleThree {number} {bit} {5} +% +% \stopsummary + +\startsummary[title={tobitstring}] + +There is no format option to go from number to bits in terms of zeros and ones so +we provide a helper: \type {tobitsting}. + +\ShowLuaExampleThree {number} {tobitstring} {2013} +\ShowLuaExampleThree {number} {tobitstring} {2013,3} +\ShowLuaExampleThree {number} {tobitstring} {2013,1} + +\stopsummary + +% \startsummary[title={bits}] +% +% If you ever want to convert a bitset into a table containing the set bits you can +% use this function. +% +% \ShowLuaExampleTwo {number} {bits} {11} +% +% \stopsummary +% +% \startsummary[title={toset}] +% +% A string or number can be split into digits with \type {toset}. Beware, this +% function does not return a function but multiple numbers +% +% \starttyping +% local a, b, c, d = number.toset("1001") +% \stoptyping +% +% The returned values are either numbers or \type {nil} when an valid digit is +% seen. +% +% \ShowLuaExampleSeven {number} {toset} {100101} +% \ShowLuaExampleSeven {number} {toset} {"100101"} +% \ShowLuaExampleSeven {number} {toset} {"21546"} +% +% \stopsummary + +\startsummary[title={valid}] + +This function can be used to check or convert a number, for instance in user +interfaces. + +\ShowLuaExampleThree {number} {valid} {12} +\ShowLuaExampleThree {number} {valid} {"34"} +\ShowLuaExampleThree {number} {valid} {"ab",56} + +\stopsummary + +\stopsection + +\startsection[title=\LPEG\ patterns] + +For \LUATEX\ and \CONTEXT\ \MKIV\ the \type {lpeg} library came at the right +moment as we can use it in lots of places. An in|-|depth discussion makes no +sense as it's easier to look into \type {l-lpeg.lua}, so we stick to an overview. +\footnote {If you search the web for \type {lua lpeg} you will end up at the +official documentation and tutorial.} Most functions return an \type {lpeg} +object that can be used in a match. In time critical situations it's more +efficient to use the match on a predefined pattern that to create the pattern new +each time. Patterns are cached so there is no penalty in predefining a pattern. +So, in the following example, the \type {splitter} that splits at the asterisk +will only be created once. + +\starttyping +local splitter_1 = lpeg.splitat("*") +local splitter_2 = lpeg.splitat("*") + +local n, m = lpeg.match(splitter_1,"2*4") +local n, m = lpeg.match(splitter_2,"2*4") +\stoptyping + +\startsummary[title={[lua] match print P R S V C Cc Cs ...}] + +The \type {match} function does the real work. Its first argument is a \type +{lpeg} object that is created using the functions with the short uppercase names. + +\starttyping +local P, R, C, Ct = lpeg.P, lpeg.R, lpeg.C, lpeg.Ct + +local pattern = Ct((P("[") * C(R("az")^0) * P(']') + P(1))^0) + +local words = lpeg.match(pattern,"a [first] and [second] word") +\stoptyping + +In this example the words between square brackets are collected in a table. There +are lots of examples of \type {lpeg} in the \CONTEXT\ code base. + +\stopsummary + +\startsummary[title={anywhere}] + +\starttyping +local p = anywhere(pattern) +\stoptyping + +\ShowLuaExampleTwo {lpeg} {match} {lpeg.Ct((lpeg.anywhere("->")/"!")^0), "oeps->what->more"} + +\stopsummary + +\startsummary[title={splitter splitat firstofsplit secondofsplit}] + +The \type {splitter} function returns a pattern where each match gets an action +applied. The action can be a function, table or string. + +\starttyping +local p = splitter(pattern, action) +\stoptyping + +The \type {splitat} function returns a pattern that will return the split off +parts. Unless the second argument is \type {true} the splitter keeps splitting + +\starttyping +local p = splitat(separator,single) +\stoptyping + +When you need to split off a prefix (for instance in a label) you can use: + +\starttyping +local p = firstofsplit(separator) +local p = secondofsplit(separator) +\stoptyping + +The first function returns the original when there is no match but the second +function returns \type {nil} instead. + +\ShowLuaExampleTwo {lpeg} {match} {lpeg.Ct(lpeg.splitat("->",false)), "oeps->what->more"} +\ShowLuaExampleTwo {lpeg} {match} {lpeg.Ct(lpeg.splitat("->",false)), "oeps"} +\ShowLuaExampleTwo {lpeg} {match} {lpeg.Ct(lpeg.splitat("->",true)), "oeps->what->more"} +\ShowLuaExampleTwo {lpeg} {match} {lpeg.Ct(lpeg.splitat("->",true)), "oeps"} + +\ShowLuaExampleThree {lpeg} {match} {lpeg.firstofsplit(":"), "before:after"} +\ShowLuaExampleThree {lpeg} {match} {lpeg.firstofsplit(":"), "whatever"} +\ShowLuaExampleThree {lpeg} {match} {lpeg.secondofsplit(":"), "before:after"} +\ShowLuaExampleThree {lpeg} {match} {lpeg.secondofsplit(":"), "whatever"} + +\stopsummary + +\startsummary[title={split checkedsplit}] + +The next two functions have counterparts in the \type {string} namespace. They +return a table with the split parts. The second function omits empty parts. + +\starttyping +local t = split (separator,str) +local t = checkedsplit(separator,str) +\stoptyping + +\ShowLuaExampleTwo {lpeg} {split} {",","a,b,c"} +\ShowLuaExampleTwo {lpeg} {split} {",",",a,,b,c,"} +\ShowLuaExampleTwo {lpeg} {checkedsplit} {",",",a,,b,c,"} + +\stopsummary + +\startsummary[title={stripper keeper replacer}] + +These three functions return patterns that manipulate a string. The \type +{replacer} gets a mapping table passed. + +\starttyping +local p = stripper(str or pattern) +local p = keeper (str or pattern) +local p = replacer(mapping) +\stoptyping + +\ShowLuaExampleThree {lpeg} {match} {lpeg.stripper(lpeg.R("az")), "[-a-b-c-d-]"} +\ShowLuaExampleThree {lpeg} {match} {lpeg.stripper("ab"), "[-a-b-c-d-]"} +\ShowLuaExampleThree {lpeg} {match} {lpeg.keeper(lpeg.R("az")), "[-a-b-c-d-]"} +\ShowLuaExampleThree {lpeg} {match} {lpeg.keeper("ab"), "[-a-b-c-d-]"} +\ShowLuaExampleThree {lpeg} {match} {lpeg.replacer{{"a","p"},{"b","q"}}, "[-a-b-c-d-]"} + +\stopsummary + +\startsummary[title={balancer}] + +One of the nice things about \type {lpeg} is that it can handle all kind of +balanced input. So, a function is provided that returns a balancer pattern: + +\starttyping +local p = balancer(left,right) +\stoptyping + +\ShowLuaExampleTwo {lpeg} {match} {lpeg.Ct((lpeg.C(lpeg.balancer("{","}"))+1)^0),"{a} {b{c}}"} +\ShowLuaExampleTwo {lpeg} {match} {lpeg.Ct((lpeg.C(lpeg.balancer("((","]"))+1)^0),"((a] ((b((c]]"} + +\stopsummary + +\startsummary[title={counter}] + +The \type {counter} function returns a function that returns the length of a +given string. The \type {count} function differs from its counterpart living in +the \type {string} namespace in that it deals with \UTF\ and accepts strings as +well as patterns. + +\starttyping +local fnc = counter(lpeg.P("á") + lpeg.P("à")) +local len = fnc("äáàa") +\stoptyping + +\stopsummary + +\startsummary[title={UP US UR}] + +In order to make working with \UTF-8 input somewhat more convenient a few helpers +are provided. + +\starttyping +local p = lpeg.UP(utfstring) +local p = lpeg.US(utfstring) +local p = lpeg.UR(utfpair) +local p = lpeg.UR(first,last) +\stoptyping + +\ShowLuaExampleThree {utf} {count} {"äáàa",lpeg.UP("áà")} +\ShowLuaExampleThree {utf} {count} {"äáàa",lpeg.US("àá")} +\ShowLuaExampleThree {utf} {count} {"äáàa",lpeg.UR("aá")} +\ShowLuaExampleThree {utf} {count} {"äáàa",lpeg.UR("àá")} +\ShowLuaExampleThree {utf} {count} {"äáàa",lpeg.UR(0x0000,0xFFFF)} + +\startsummary[title={patterns}] + +The following patterns are available in the \type {patterns} table in the \type +{lpeg} namespace: + +\startluacode +context.startalignment { "flushleft" } +local done = false +for k, v in table.sortedpairs(lpeg.patterns) do + if done then + context.space() + else + done = true + end + context.type(k) +end +context.stopalignment() +\stopluacode + +There will probably be more of them in the future. + +\stopsummary + +\stopsection + +\startsection[title=IO] + +The \type {io} library is extended with a couple of functions as well and +variables but first we mention a few predefined functions. + +\startsummary[title={[lua] open popen...}] + +The IO library deals with in- and output from the console and +files. + +\starttyping +local f = io.open(filename) +\stoptyping + +When the call succeeds \type {f} is a file object. You close this file +with: + +\starttyping +f:close() +\stoptyping + +Reading from a file is done with \type {f:read(...)} and writing to a file with +\type {f:write(...)}. In order to write to a file, when opening a second argument +has to be given, often \type {wb} for writing (binary) data. Although there are +more efficient ways, you can use the \type {f:lines()} iterator to process a file +line by line. + +You can open a process with \type {io.popen} but dealing with this one depends a +bit on the operating system. + +\stopsummary + +\startsummary[title={fileseparator pathseparator}] + +The value of the following two strings depends on the operating system that is +used. + +\starttyping +io.fileseparator +io.pathseparator +\stoptyping + +\ShowLuaExampleFive {io} {fileseparator} +\ShowLuaExampleFive {io} {pathseparator} + +\stopsummary + +\startsummary[title={loaddata savedata}] + +These two functions save you some programming. The first function loads a whole +file in a string. By default the file is loaded in binary mode, but when the +second argument is \type {true}, some interpretation takes place (for instance +line endings). In practice the second argument can best be left alone. + +\starttyping +io.loaddata(filename,textmode) +\stoptyping + +Saving the data is done with: + +\starttyping +io.savedata(filename,str) +io.savedata(filename,tab,joiner) +\stoptyping + +When a table is given, you can optionally specify a string that +ends up between the elements that make the table. + +\stopsummary + +\startsummary[title={exists size noflines}] + +These three function don't need much comment. + +\starttyping +io.exists(filename) +io.size(filename) +io.noflines(fileobject) +io.noflines(filename) +\stoptyping + +\stopsummary + +\startsummary[title={characters bytes readnumber readstring}] + +When I wrote the icc profile loader, I needed a few helpers for reading strings +of a certain length and numbers of a given width. Both accept five values of +\type {n}: \type {-4}, \type {-2}, \type {1}, \type {2} and \type {4} where the +negative values swap the characters or bytes. + +\starttyping +io.characters(f,n) -- +io.bytes(f,n) +\stoptyping + +The function \type {readnumber} accepts five sizes: \type {1}, \type {2}, \type +{4}, \type {8}, \type {12}. The string function handles any size and strings zero +bytes from the string. + +\starttyping +io.readnumber(f,size) +io.readstring(f,size) +\stoptyping + +Optionally you can give the position where the reading has to start: + +\starttyping +io.readnumber(f,position,size) +io.readstring(f,position,size) +\stoptyping + +\stopsummary + +\startsummary[title={ask}] + +In practice you will probably make your own variant of the following function, +but at least a template is there: + +\starttyping +io.ask(question,default,options) +\stoptyping + +For example: + +\starttyping +local answer = io.ask("choice", "two", { "one", "two" }) +\stoptyping + +\stopsummary + +\stopsection + +\startsection[title=File] + +The file library is one of the larger core libraries that comes with +\CONTEXT. + +\startsummary[title={dirname basename extname nameonly}] + +We start with a few filename manipulators. + +\starttyping +local path = file.dirname(name,default) +local base = file.basename(name) +local suffix = file.extname(name,default) -- or file.suffix +local name = file.nameonly(name) +\stoptyping + +\ShowLuaExampleThree {file} {dirname} {"/data/temp/whatever.cld"} +\ShowLuaExampleThree {file} {dirname} {"c:/data/temp/whatever.cld"} +\ShowLuaExampleThree {file} {basename} {"/data/temp/whatever.cld"} +\ShowLuaExampleThree {file} {extname} {"c:/data/temp/whatever.cld"} +\ShowLuaExampleThree {file} {nameonly} {"/data/temp/whatever.cld"} + +\stopsummary + +\startsummary[title={addsuffix replacesuffix}] + +These functions are used quite often: + +\starttyping +local filename = file.addsuffix(filename, suffix, criterium) +local filename = file.replacesuffix(filename, suffix) +\stoptyping + +The first one adds a suffix unless one is present. When \type {criterium} is +\type {true} no checking is done and the suffix is always appended. The second +function replaces the current suffix or add one when there is none. + +\ShowLuaExampleThree {file} {addsuffix} {"whatever","cld"} +\ShowLuaExampleThree {file} {addsuffix} {"whatever.tex","cld"} +\ShowLuaExampleThree {file} {addsuffix} {"whatever.tex","cld",true} + +\ShowLuaExampleThree {file} {replacesuffix} {"whatever","cld"} +\ShowLuaExampleThree {file} {replacesuffix} {"whatever.tex","cld"} + +\stopsummary + +\startsummary[title={is_writable is_readable}] + +These two test the nature of a file: + +\starttyping +file.is_writable(name) +file.is_readable(name) +\stoptyping + +\stopsummary + +\startsummary[title={splitname join collapsepath}] + +Instead of splitting off individual components you can get them all in one go: + +\starttyping +local drive, path, base, suffix = file.splitname(name) +\stoptyping + +The \type {drive} variable is empty on operating systems other than \MSWINDOWS. +Such components are joined with the function: + +\starttyping +file.join(...) +\stoptyping + +The given snippets are joined using the \type {/} as this is +rather platform independent. Some checking takes place in order +to make sure that nu funny paths result from this. There is +also \type {collapsepath} that does some cleanup on a path +with relative components, like \type {..}. + +\ShowLuaExampleSix {file} {splitname} {"a:/b/c/d.e"} +\ShowLuaExampleThree {file} {join} {"a","b","c.d"} +\ShowLuaExampleThree {file} {collapsepath} {"a/b/../c.d"} +\ShowLuaExampleThree {file} {collapsepath} {"a/b/../c.d",true} + +\stopsummary + +\startsummary[title={splitpath joinpath}] + +By default splitting a execution path specification is done using the operating +system dependant separator, but you can force one as well: + +\starttyping +file.splitpath(str,separator) +\stoptyping + +The reverse operation is done with: + +\starttyping +file.joinpath(tab,separator) +\stoptyping + +Beware: in the following examples the separator is system dependent so +the outcome depends on the platform you run on. + +\ShowLuaExampleTwo {file} {splitpath} {"a:b:c"} +\ShowLuaExampleTwo {file} {splitpath} {"a;b;c"} +\ShowLuaExampleThree {file} {joinpath} {{"a","b","c"}} + +\stopsummary + +\startsummary[title={robustname}] + +In workflows filenames with special characters can be a pain so the following +function replaces characters other than letters, digits, periods, slashes and +hyphens by hyphens. + +\starttyping +file.robustname(str,strict) +\stoptyping + +\ShowLuaExampleThree {file} {robustname} {"We don't like this!"} +\ShowLuaExampleThree {file} {robustname} {"We don't like this!",true} + +\stopsummary + +\startsummary[title={readdata writedata}] + +These two functions are duplicates of functions with the +same name in the \type {io} library. + +\stopsummary + +\startsummary[title={copy}] + +There is not much to comment on this one: + +\starttyping +file.copy(oldname,newname) +\stoptyping + +\stopsummary + +\startsummary[title={is_qualified_path is_rootbased_path}] + +A qualified path has at least one directory component while a rootbased path is +anchored to the root of a filesystem or drive. + +\starttyping +file.is_qualified_path(filename) +file.is_rootbased_path(filename) +\stoptyping + +\ShowLuaExampleThree {file} {is_qualified_path} {"a"} +\ShowLuaExampleThree {file} {is_qualified_path} {"a/b"} +\ShowLuaExampleThree {file} {is_rootbased_path} {"a/b"} +\ShowLuaExampleThree {file} {is_rootbased_path} {"/a/b"} + +\stopsummary + +\stopsection + +\startsection[title=Dir] + +The \type {dir} library uses functions of the \type {lfs} library that is linked +into \LUATEX. + +\startsummary[title={current}] + +This returns the current directory: + +\starttyping +dir.current() +\stoptyping + +\stopsummary + +\startsummary[title={glob globpattern globfiles}] + +% not yet documented: dir.collectpattern(path,patt,recurse,result) -- collects tree + +The \type {glob} function collects files with names that match a given pattern. +The pattern can have wildcards: \type {*} (oen of more characters), \type {?} +(one character) or \type {**} (one or more directories). You can pass the +function a string or a table with strings. Optionally a second argument can be +passed, a table that the results are appended to. + +\starttyping +local files = dir.glob(pattern,target) +local files = dir.glob({pattern,...},target) +\stoptyping + +The target is optional and often you end up with simple calls like: + +\starttyping +local files = dir.glob("*.tex") +\stoptyping + +There is a more extensive version where you start at a path, and applies an +action to each file that matches the pattern. You can either or not force +recursion. + +\starttyping +dir.globpattern(path,patt,recurse,action) +\stoptyping + +The \type {globfiles} function collects matches in a table that is returned at +the end. You can pass an existing table as last argument. The first argument is +the starting path, the second arguments controls analyzing directories and the +third argument has to be a function that gets a name passed and is supposed to +return \type {true} or \type {false}. This function determines what gets +collected. + +\starttyping +dir.globfiles(path,recurse,func,files) +\stoptyping + +\stopsummary + +\startsummary[title={makedirs}] + +With \type {makedirs} you can create the given directory. If more than one +name is given they are concatinated. + +\starttyping +dir.makedirs(name,...) +\stoptyping + +\stopsummary + +\startsummary[title={expandname}] + +This function tries to resolve the given path, including relative paths. + +\starttyping +dir.expandname(str) +\stoptyping + +\ShowLuaExampleThree {dir} {expandname} {"."} + +\stopsummary + +\stopsection + +\startsection[title=URL] + +\startsummary[title={split hashed construct}] + +This is a specialized library. You can split an \type {url} into its components. +An \URL\ is constructed like this: + +\starttyping +foo://example.com:2010/alpha/beta?gamma=delta#epsilon +\stoptyping + +\starttabulate[|T|T|] +\NC scheme \NC foo:// \NC \NR +\NC authority \NC example.com:2010 \NC \NR +\NC path \NC /alpha/beta \NC \NR +\NC query \NC gamma=delta \NC \NR +\NC fragment \NC epsilon \NC \NR +\stoptabulate + +A string is split into a hash table with these keys using the following function: + +\starttyping +url.hashed(str) +\stoptyping + +or in strings with: + +\starttyping +url.split(str) +\stoptyping + +The hash variant is more tolerant than the split. In the hash +there is also a key \type {original} that holds the original \URL\ +and and the boolean \type {noscheme} indicates if there is a +scheme at all. + +The reverse operation is done with: + +\starttyping +url.construct(hash) +\stoptyping + +\startasciimode +\ShowLuaExampleTwo {url} {hashed} {"foo://example.com:2010/alpha/beta?gamma=delta#epsilon"} +\ShowLuaExampleTwo {url} {hashed} {"alpha/beta"} +\ShowLuaExampleTwo {url} {split} {"foo://example.com:2010/alpha/beta?gamma=delta#epsilon"} +\ShowLuaExampleTwo {url} {split} {"alpha/beta"} +\stopasciimode + +\startsummary[title={hasscheme addscheme filename query}] + +There are a couple of helpers and their names speaks for themselves: + +\starttyping +url.hasscheme(str) +url.addscheme(str,scheme) +url.filename(filename) +url.query(str) +\stoptyping + +\ShowLuaExampleThree {url} {hasscheme} {"http://www.pragma-ade.com/cow.png"} +\ShowLuaExampleThree {url} {hasscheme} {"www.pragma-ade.com/cow.png"} +\ShowLuaExampleThree {url} {addscheme} {"www.pragma-ade.com/cow.png","http://"} +\ShowLuaExampleThree {url} {addscheme} {"www.pragma-ade.com/cow.png"} +\ShowLuaExampleThree {url} {filename} {"http://www.pragma-ade.com/cow.png"} +\ShowLuaExampleTwo {url} {query} {"a=b&c=d"} + +\stopsection + +\startsection[title=OS] + +\startsummary[title={[lua luatex] env setenv getenv}] + +In \CONTEXT\ normally you will use the resolver functions to deal with the +environment and files. However, a more low level interface is still available. +You can query and set environment variables with two functions. In addition there +is the \type {env} table as interface to the environment. This threesome replaces +the built in functions. + +\starttyping +os.setenv(key,value) +os.getenv(key) +os.env[key] +\stoptyping + +\stopsummary + +\startsummary[title={[lua] execute}] + +There are several functions for running programs. One comes directly from \LUA, +the otheres come with \LUATEX. All of them are are overloaded in \CONTEXT\ in +order to get more control. + +\starttyping +os.execute(...) +\stoptyping + +\stopsummary + +\startsummary[title={[luatex] spawn exec}] + +Two other runners are: + +\starttyping +os.spawn(...) +os.exec (...) +\stoptyping + +The \type {exec} variant will transfer control from the current process to the +new one and not return to the current job. There is a more detailed explanation +in the \LUATEX\ manual. + +\stopsummary + +\startsummary[title={resultof launch}] + +The following function runs the command and returns the result as string. +Multiple lines are combined. + +\starttyping +os.resultof(command) +\stoptyping + +The next one launches a file assuming that the operating system knows +what application to use. + +\starttyping +os.launch(str) +\stoptyping + +\stopsummary + +\startsummary[title={type name platform libsuffix binsuffix}] + +There are a couple of strings that reflect the current machinery: \type {type} +returns either \type {windows} or \type {unix}. The variable \type {name} is more +detailed: \type {windows}, \type {msdos}, \type {linux}, \type {macosx}, etc. If +you also want the architecture you can consult \type {platform}. + +\starttyping +local t = os.type +local n = os.name +local p = os.platform +\stoptyping + +These three variables as well as the next two are used internally and normally +they are not needed in your applications as most functions that matter are aware +of what platform specific things they have to deal with. + +\starttyping +local s = os.libsuffix +local b = os.binsuffix +\stoptyping + +These are string, not functions. + +\ShowLuaExampleFive {os} {type} +\ShowLuaExampleFive {os} {name} +\ShowLuaExampleFive {os} {platform} +\ShowLuaExampleFive {os} {libsuffix} +\ShowLuaExampleFive {os} {binsuffix} + +\stopsummary + +\startsummary[title={[lua] time}] + +The built in time function returns a number. The accuracy is +implementation dependent and not that large. + +\ShowLuaExampleThree {os} {time} {} + +\stopsummary + +\startsummary[title={[luatex] times gettimeofday}] + +Although \LUA\ has a built in type {os.time} function, we normally will use the +one provided by \LUATEX\ as it is more precise: + +\starttyping +os.gettimeofday() +\stoptyping + +There is also a more extensive variant: + +\starttyping +os.times() +\stoptyping + +This one is platform dependent and returns a table with \type {utime} (use time), +\type {stime} (system time), \type {cutime} (children user time), and \type +{cstime} (children system time). + +\stopsummary + +\ShowLuaExampleThree {os} {gettimeofday} {} +\ShowLuaExampleTwo {os} {times} {} + +\startsummary[title={runtime}] + +More interesting is: + +\starttyping +os.runtime() +\stoptyping + +which returns the time spent in the application so far. + +\ShowLuaExampleThree {os} {runtime} {} + +Sometimes you need to add the timezone to a verbose time and the following +function does that for you. + +\starttyping +os.timezone(delta) +\stoptyping + +\ShowLuaExampleThree {os} {timezone} {} +\ShowLuaExampleThree {os} {timezone} {1} +\ShowLuaExampleThree {os} {timezone} {-1} + +\stopsummary + +\startsummary[title={uuid}] + +A version 4 UUID can be generated with: + +\starttyping +os.uuid() +\stoptyping + +The generator is good enough for our purpose. + +\ShowLuaExampleThree {os} {uuid} {} + +\stopsummary + +\stopsection + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/cld/cld-macros.tex b/doc/context/sources/general/manuals/cld/cld-macros.tex new file mode 100644 index 000000000..a177db9f8 --- /dev/null +++ b/doc/context/sources/general/manuals/cld/cld-macros.tex @@ -0,0 +1,224 @@ +% language=uk + +\startcomponent cld-macros + +\environment cld-environment + +\startchapter[title=Macros] + +\startsection[title={Introduction}] + +You can skip this chapter if you're not interested in defining macros or are +quite content with defining them in \TEX. It's just an example of possible future +interface definitions and it's not the fastest mechanism around. + +\stopsection + +\startsection[title={Parameters}] + +Right from the start \CONTEXT\ came with several user interfaces. As a +consequence you need to take this into account when you write code that is +supposed to work with interfaces other than the English one. The \TEX\ command: + +\starttyping +\setupsomething[key=value] +\stoptyping + +and the \LUA\ call: + +\starttyping +context.setupsomething { key = value } +\stoptyping + +are equivalent. However, all keys at the \TEX\ end eventually become English, but +the values are unchanged. This means that when you code in \LUA\ you should use +English keys and when dealing with assigned values later on, you need to +translate them of compare with translations (which is easier). This is why in the +\CONTEXT\ code you will see: + +\starttyping +if somevalue == interfaces.variables.yes then + ... +end +\stoptyping + +instead of: + +\starttyping +if somevalue == "yes" then + ... +end +\stoptyping + +\stopsection + +\startsection[title={User interfacing}] + +Unless this is somehow inhibited, users can write their own macros and this is +done in the \TEX\ language. Passing data to macros is possible and looks like +this: + +\starttyping +\def\test#1#2{.. #1 .. #2 .. } \test{a}{b} +\def\test[#1]#2{.. #1 .. #2 .. } \test[a]{b} +\stoptyping + +Here \type {#1} and \type {#2} represent an argument and there can be at most 9 +of them. The \type{[]} are delimiters and you can delimit in many ways so the +following is also right: + +\starttyping +\def\test(#1><#2){.. #1 .. #2 .. } \test(a><b) +\stoptyping + +Macro packages might provide helper macros that for instance take care of +optional arguments, so that we can use calls like: + +\starttyping +\test[1,2,3][a=1,b=2,c=3]{whatever} +\stoptyping + +and alike. If you are familiar with the \CONTEXT\ syntax you know that we use +this syntax all over the place. + +If you want to write a macro that calls out to \LUA\ and handles things at that +end, you might want to avoid defining the macro itself and this is possible. + +\startbuffer +\startluacode +function test(opt_1, opt_2, arg_1) + context.startnarrower() + context("options 1: %s",interfaces.tolist(opt_1)) + context.par() + context("options 2: %s",interfaces.tolist(opt_2)) + context.par() + context("argument 1: %s",arg_1) + context.stopnarrower() +end + +interfaces.definecommand { + name = "test", + arguments = { + { "option", "list" }, + { "option", "hash" }, + { "content", "string" }, + }, + macro = test, +} +\stopluacode + +test: \test[1][a=3]{whatever} +\stopbuffer + +An example of a definition and usage at the \LUA\ end is: + +\typebuffer + +The call gives: + +\startpacked +\getbuffer +\stoppacked + +\startbuffer +\startluacode +local function startmore(opt_1) + context.startnarrower() + context("start more, options: %s",interfaces.tolist(opt_1)) + context.startnarrower() +end + +local function stopmore(opt_1) + context.stopnarrower() + context("stop more, options: %s",interfaces.tolist(opt_1)) + context.stopnarrower() +end + +interfaces.definecommand ( "more", { + environment = true, + arguments = { + { "option", "list" }, + }, + starter = startmore, + stopper = stopmore, +} ) +\stopluacode + +more: \startmore[1] one \startmore[2] two \stopmore one \stopmore +\stopbuffer + +If you want to to define an environment (i.e.\ a \type {start}||\type {stop} +pair, it looks as follows: + +\typebuffer + +This gives: + +\startpacked +\getbuffer +\stoppacked + +The arguments are know in both \type {startmore} and \type {stopmore} and nesting +is handled automatically. + +\stopsection + +\startsection[title=Looking inside] + +If needed you can access the body of a macro. Take for instance: + +\startbuffer +\def\TestA{A} +\def\TestB{\def\TestC{c}} +\def\TestC{C} +\stopbuffer + +\typebuffer \getbuffer + +The following example demonsttaies how we can look inside these macros. You need +to be aware of the fact that the whole blob of \LUA\ codes is finished before we +return to \TEX, so when we pipe the meaning of \type {TestB} back to \TEX\ it +only gets expanded afterwards. We can use a function to get back to \LUA. It's +only then that the meaning of \type {testC} is changed by the (piped) expansion +of \type {TestB}. + +\startbuffer +\startluacode +context(tokens.getters.macro("TestA")) +context(tokens.getters.macro("TestB")) +context(tokens.getters.macro("TestC")) +tokens.setters.macro("TestA","a") +context(tokens.getters.macro("TestA")) +context(function() + context(tokens.getters.macro("TestA")) + context(tokens.getters.macro("TestB")) + context(tokens.getters.macro("TestC")) +end) +\stopluacode +\stopbuffer + +\typebuffer \getbuffer + +Here is another example: + +\startbuffer +\startluacode +if tokens.getters.macro("fontstyle") == "rm" then + context("serif") +else + context("unknown") +end +\stopluacode +\stopbuffer + +\typebuffer + +Of course this assumes that you have some knowledge of the \CONTEXT\ internals. + +\getbuffer + +\stopsection + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/cld/cld-mkiv.tex b/doc/context/sources/general/manuals/cld/cld-mkiv.tex new file mode 100644 index 000000000..5c35fa4e7 --- /dev/null +++ b/doc/context/sources/general/manuals/cld/cld-mkiv.tex @@ -0,0 +1,91 @@ +% language=uk + +% author : Hans Hagen +% copyright : PRAGMA ADE & ConTeXt Development Team +% license : Creative Commons Attribution ShareAlike 4.0 International +% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions +% origin : the ConTeXt distribution +% +% comment : Because this manual is distributed with TeX distributions it comes with a rather +% liberal license. We try to adapt these documents to upgrades in the (sub)systems +% that they describe. Using parts of the content otherwise can therefore conflict +% with existing functionality and we cannot be held responsible for that. Many of +% the manuals contain characteristic graphics and personal notes or examples that +% make no sense when used out-of-context. +% +% comment : Some chapters might have been published in TugBoat, the NTG Maps, the ConTeXt +% Group journal or otherwise. Thanks to the editors for corrections. Also thanks +% to users for testing, feedback and corrections. + +% \disabledirectives[paragraphs.normalize.global] +% \disabledirectives[paragraphs.normalize.local] + +% \usemodule[s-lan-03] +% \ctxlua{languages.words.tracers.showwords()} % no run check yet +% \page +% \setupspellchecking[state=start,method=2] + +% \enabletrackers[structures.export.spaces] +% \enabletrackers[structures.export.showtree] + +% \enabletrackers[export.trace] +% \enabletrackers[export.trace.spacing] +% \enabletrackers[export.lessstate] +% \enabletrackers[export.comment] + +% \enablemode[export] + +\startmode[export] + + \setupbackend + [export=yes] + + \setupexport + [hyphen=yes, + width=60em] + +\stopmode + +\setupinteraction + [title=Context Lua Documents, + %subtitle=preliminary version, + author=Hans Hagen] + +\startproduct cld-mkiv + +\environment cld-environment + +\component cld-titlepage + +\startfrontmatter + \component cld-contents + \component cld-introduction +\stopfrontmatter + +\startbodymatter + \component cld-abitoflua + \component cld-gettingstarted + \component cld-moreonfunctions + \component cld-afewdetails + \component cld-somemoreexamples + \component cld-graphics + \component cld-macros + \component cld-verbatim + \component cld-logging + \component cld-luafunctions + \component cld-ctxfunctions + \component cld-callbacks + \component cld-backendcode + \component cld-goodies + \component cld-nicetoknow + %\component cld-xml + \component cld-summary + \component cld-specialcommands + \component cld-files +\stopbodymatter + +% \startbackmatter +% \component cld-index +% \stopbackmatter + +\stopproduct diff --git a/doc/context/sources/general/manuals/cld/cld-moreonfunctions.tex b/doc/context/sources/general/manuals/cld/cld-moreonfunctions.tex new file mode 100644 index 000000000..fab22515e --- /dev/null +++ b/doc/context/sources/general/manuals/cld/cld-moreonfunctions.tex @@ -0,0 +1,354 @@ +% language=uk + +\startcomponent cld-moreonfunctions + +\environment cld-environment + +\startchapter[title=More on functions] + +\startsection[title=Why we need them] + +\index{functions} + +In a previous chapter we introduced functions as arguments. At first sight this +feature looks strange but you need to keep in mind that a call to a \type +{context} function has no direct consequences. It generates \TEX\ code that is +executed after the current \LUA\ chunk ends and control is passed back to \TEX. +Take the following code: + +\startbuffer +context.framed( { + frame = "on", + offset = "5mm", + align = "middle" + }, + context.input("knuth") +) +\stopbuffer + +\typebuffer + +We call the function \type {framed} but before the function body is executed, the +arguments get evaluated. This means that \type {input} gets processed before +\type {framed} gets done. As a result there is no second argument to \type +{framed} and no content gets passed: an error is reported. This is why we need +the indirect call: + +\startbuffer +context.framed( { + frame = "on", + align = "middle" + }, + function() context.input("knuth") end +) +\stopbuffer + +\typebuffer + +This way we get what we want: + +\startlinecorrection +\ctxluabuffer +\stoplinecorrection + +The function is delayed till the \type {framed} command is executed. If your +applications use such calls a lot, you can of course encapsulate this ugliness: + +\starttyping +mycommands = mycommands or { } + +function mycommands.framed_input(filename) + context.framed( { + frame = "on", + align = "middle" + }, + function() context.input(filename) end +end + +mycommands.framed_input("knuth") +\stoptyping + +Of course you can nest function calls: + +\starttyping +context.placefigure( + "caption", + function() + context.framed( { + frame = "on", + align = "middle" + }, + function() context.input("knuth") end + ) + end +) +\stoptyping + +Or you can use a more indirect method: + +\starttyping +function text() + context.framed( { + frame = "on", + align = "middle" + }, + function() context.input("knuth") end + ) +end + +context.placefigure( + "none", + function() text() end +) +\stoptyping + +You can develop your own style and libraries just like you do with regular \LUA\ +code. Browsing the already written code can give you some ideas. + +\stopsection + +\startsection[title=How we can avoid them] + +\index{delaying} +\index{nesting} + +As many nested functions can obscure the code rather quickly, there is an +alternative. In the following examples we use \type {test}: + +\startbuffer +\def\test#1{[#1]} +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer +context.test("test 1 ",context("test 2a")," test 3") +\stopbuffer + +\typebuffer + +This gives: \ctxluabuffer. As you can see, the second argument is executed before +the encapsulating call to \type {test}. So, we should have packed it into a +function but here is an alternative: + +\startbuffer +context.test("test 1 ",context.delayed("test 2a")," test 3") +\stopbuffer + +\typebuffer + +Now we get: \ctxluabuffer. We can also delay functions themselves, +look at this: + +\startbuffer +context.test("test 1 ",context.delayed.test("test 2b")," test 3") +\stopbuffer + +\typebuffer + +The result is: \ctxluabuffer. This feature also conveniently permits the use of +temporary variables, as in: + +\starttyping +local f = context.delayed.test("test 2c") +context("before ",f," after") +\stoptyping + +Of course you can limit the amount of keystrokes even more by +creating a shortcut: + +\starttyping +local delayed = context.delayed + +context.test("test 1 ",delayed.test("test 2")," test 3") +context.test("test 4 ",delayed.test("test 5")," test 6") +\stoptyping + +So, if you want you can produce rather readable code and readability of code is +one of the reasons why \LUA\ was chosen in the first place. This is a good +example of why coding in \TEX\ makes sense as it looks more intuitive: + +\starttyping +\test{test 1 \test{test 2} test 3} +\test{test 4 \test{test 5} test 6} +\stoptyping + +There is also another mechanism available. In the next example the second +argument is actually a string. + +\starttyping +local nested = context.nested + +context.test("test 8",nested.test("test 9"),"test 10") +\stoptyping + +There is a pitfall here: a nested context command needs to be flushed explicitly, +so in the case of: + +\starttyping +context.nested.test("test 9") +\stoptyping + +a string is created but nothing ends up at the \TEX\ end. Flushing is up to you. +Beware: \type {nested} only works with the regular \CONTEXT\ catcode regime. + +\stopsection + +\startsection[title=Trial typesetting] + +\index {prerolls} +\index {trial typesetting} + +Some typesetting mechanisms demand a preroll. For instance, when determining the +most optimal way to analyse and therefore typeset a table, it is necessary to +typeset the content of cells first. Inside \CONTEXT\ there is a state tagged +\quote {trial typesetting} which signals other mechanisms that for instance +counters should not be incremented more than once. + +Normally you don't need to worry about these issues, but when writing the code +that implements the \LUA\ interface to \CONTEXT, it definitely had to be taken +into account as we either or not can free cached (nested) functions. + +You can influence this caching to some extend. If you say + +\starttyping +function() + context("whatever") +end +\stoptyping + +the function will be removed from the cache when \CONTEXT\ is not in the trial +typesetting state. You can prevent removal of a function by returning \type +{true}, as in: + +\starttyping +function() + context("whatever") + return true +end +\stoptyping + +Whenever you run into a situation that you don't get the outcome that you expect, +you can consider returning \type {true}. However, keep in mind that it will take +more memory, something that only matters on big runs. You can force flushing the +whole cache by: + +\starttyping +context.restart() +\stoptyping + +An example of an occasion where you need to keep the function available is in +repeated content, for instance in headers and footers. + +\starttyping +context.setupheadertexts { + function() + context.pagenumber() + return true + end +} +\stoptyping + +Of course it is not needed when you use the following method: + +\starttyping +context.pagenumber("pagenumber") +\stoptyping + +Because here \CONTEXT\ itself deals with the content driven by the keyword \type +{pagenumber}. + +\stopsection + +\startsection[title=Steppers] + +The \type {context} commands are accumulated within a \type {\ctxlua} call and +only after the call is finished, control is back at the \TEX\ end. Sometimes you +want (in your \LUA\ code) to go on and pretend that you jump out to \TEX\ for a +moment, but come back to where you left. The stepper mechanism permits this. + +A not so practical but nevertheless illustrative example is the following: + +\startbuffer +\startluacode + context.stepwise (function() + context.startitemize() + context.startitem() + context.step("BEFORE 1") + context.stopitem() + context.step("\\setbox0\\hbox{!!!!}") + context.startitem() + context.step("%p",tex.getbox(0).width) + context.stopitem() + context.startitem() + context.step("BEFORE 2") + context.stopitem() + context.step("\\setbox2\\hbox{????}") + context.startitem() + context.step("%p",tex.getbox(2).width) + context.startitem() + context.step("BEFORE 3") + context.stopitem() + context.startitem() + context.step("\\copy0\\copy2") + context.stopitem() + context.startitem() + context.step("BEFORE 4") + context.startitemize() + context.stepwise (function() + context.step("\\bgroup") + context.step("\\setbox0\\hbox{>>>>}") + context.startitem() + context.step("%p",tex.getbox(0).width) + context.stopitem() + context.step("\\setbox2\\hbox{<<<<}") + context.startitem() + context.step("%p",tex.getbox(2).width) + context.stopitem() + context.startitem() + context.step("\\copy0\\copy2") + context.stopitem() + context.startitem() + context.step("\\copy0\\copy2") + context.stopitem() + context.step("\\egroup") + end) + context.stopitemize() + context.stopitem() + context.startitem() + context.step("AFTER 1\\par") + context.stopitem() + context.startitem() + context.step("\\copy0\\copy2\\par") + context.stopitem() + context.startitem() + context.step("\\copy0\\copy2\\par") + context.stopitem() + context.startitem() + context.step("AFTER 2\\par") + context.stopitem() + context.startitem() + context.step("\\copy0\\copy2\\par") + context.stopitem() + context.startitem() + context.step("\\copy0\\copy2\\par") + context.stopitem() + context.stopitemize() +end) +\stopluacode +\stopbuffer + +\typebuffer + +This gives an (ugly) itemize with a nested one: + +\getbuffer + +As you can see in the code, the \type {step} call accepts multiple arguments, but +when more than one argument is given the first one is treated as a formatter. + +\stopsection + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/cld/cld-nicetoknow.tex b/doc/context/sources/general/manuals/cld/cld-nicetoknow.tex new file mode 100644 index 000000000..fcc0aa26b --- /dev/null +++ b/doc/context/sources/general/manuals/cld/cld-nicetoknow.tex @@ -0,0 +1,163 @@ +% language=uk + +\startcomponent cld-nicetoknow + +\environment cld-environment + +\startchapter[title=Nice to know] + +\startsection[title=Introduction] + +As we like to abstract interfaces it is no surprise that \CONTEXT\ and +therefore it's \LUA\ libraries come with all kind of helpers. In this +chapter I will explain a few of them. Feel free to remind of adding more +here. + +\stopsection + +\startsection[title=Templates] + +{\em Eventually we will move this to the utilities section.} + +When dealing with data from tables or when order matters it can be handy +to abstract the actual data from the way it is dealt with. For this we +provide a template mechanism. The following example demonstrate its use. + +\startbuffer +require("util-ran") -- needed for this example + +local preamble = [[|l|l|c|]] +local template = [[\NC %initials% \NC %surname% \NC %length% \NC \NR]] + +context.starttabulate { preamble } + for i=1,10 do + local row = utilities.templates.replace(template, { + surname = utilities.randomizers.surname(5,10), + initials = utilities.randomizers.initials(1,3), + length = string.format("%0.2f",math.random(140,195)), + }) + context(row) + end +context.stoptabulate() +\stopbuffer + +\typebuffer + +This renders a table with random entries: + +\ctxluabuffer + +The nice thing is that when we change the order of the columns, we don't need to +change the table builder. + +\starttyping +local preamble = [[|c|l|l|]] +local template = [[\NC %length% \NC %initials% \NC %surname% \NC \NR]] +\stoptyping + +The \type {replace} function takes a few more arguments. There are also a some +more replacement options. + +\starttyping +replace("test '%[x]%' test",{ x = [[a 'x' a]] })) +replace("test '%[x]%' test",{ x = true })) +replace("test '%[x]%' test",{ x = [[a 'x' a]], y = "oeps" },'sql')) +replace("test '%[x]%' test",{ x = [[a '%y%' a]], y = "oeps" },'sql',true)) +replace([[test %[x]% test]],{ x = [[a "x" a]]})) +replace([[test %(x)% test]],{ x = [[a "x" a]]})) +\stoptyping + +The first argument is the template and the second one a table with mappings from +keys to values. The third argument can be used to inform the replace mechanism +what string escaping has to happen. The last argument triggers recursive +replacement. The above calls result in the following strings: + +\starttyping +test 'a 'x' \127 a' test +test 'true' test +test 'a ''x'' a' test +test 'a ''oeps'' a' test +test a \"x\" \127 a test +test "a \"x\" \127 a" test +\stoptyping + +These examples demonstrate that by adding a pair of square brackets we get +escaped strings. When using parenthesis the quotes get added automatically. This +is somewhat faster in case when \LUA\ is the target, but in practice it is not +that noticeable. + +% replace(str,mapping,how,recurse) + +\stopsection + +\startsection [title=Extending] + +Instead of extending tex endlessly we can also define our own extensions. Here +is an example. When you want to manipulate a box at the \LUA\ end you have the +problem that the following will not always work out well: + +\starttyping +local b = tex.getbox(0) +-- mess around with b +tex.setbox(0,b) +\stoptyping + +So we end up with: + +\starttyping +local b = node.copy_list(tex.getbox(0)) +-- mess around with b +tex.setbox(0,b) +\stoptyping + +The reason is that at the \TEX\ end grouping plays a role which means that values +are saved and restored. However, there is a save way out by defining a function +that cheats a bit: + +\starttyping +function tex.takebox(id) + local box = tex.getbox(id) + if box then + local copy = node.copy(box) + local list = box.list + copy.list = list + box.list = nil + tex.setbox(id,nil) + return copy + end +end +\stoptyping + +Now we can say: + +\starttyping +local b = tex.takebox(0) +-- mess around with b +tex.setbox(b) +\stoptyping + +In this case we first get the box content and then let \TEX\ do some housekeeping. +But, because we only keep the list node (which we copied) in the register the +overhead of copying a whole list is gone. + +\stopsection + +% require("util-sto") require("char-def") require("char-ini") + +% local myformatter = utilities.strings.formatters.new() + +% string.addformatter("upper", [[upper (%s)]],[[local upper = characters.upper ]]) -- maybe handy +% string.addformatter("lower", [[lower (%s)]],[[local lower = characters.lower ]]) -- maybe handy +% string.addformatter("shaped", [[shaped(%s)]],[[local shaped = characters.shaped]]) -- maybe handy + +% utilities.strings.formatters.add("upper", [[lpegmatch(p_toupper,%s)]],[[local p_toupper = lpeg.patterns.toupper]]) -- maybe handy +% utilities.strings.formatters.add("lower", [[lpegmatch(p_tolower,%s)]],[[local p_tolower = lpeg.patterns.tolower]]) -- maybe handy +% utilities.strings.formatters.add("shaped", [[lpegmatch(p_toshape,%s)]],[[local p_toshape = lpeg.patterns.toshape]]) -- maybe handy + +% print("\n>>>",string.formatters["Is this %s handy or not?"](characters.upper("ÀÁÂÃÄÅàáâãäå"))) +% print("\n>>>",string.formatters["Is this %!upper! handy or not?"]("ÀÁÂÃÄÅàáâãäå")) +% print("\n>>>",string.formatters["Is this %!shaped! handy or not?"]("ÀÁÂÃÄÅàáâãäå")) + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/cld/cld-somemoreexamples.tex b/doc/context/sources/general/manuals/cld/cld-somemoreexamples.tex new file mode 100644 index 000000000..a282be4e9 --- /dev/null +++ b/doc/context/sources/general/manuals/cld/cld-somemoreexamples.tex @@ -0,0 +1,753 @@ +% language=uk + +\startcomponent cld-somemoreexamples + +\environment cld-environment + +\usemodule[morse] + +\startchapter[title=Some more examples] + +\startsection[title=Appetizer] + +Before we give some more examples, we will have a look at the way the title page +is made. This way you get an idea what more is coming. + +\typefile {cld-mkiv-simple-titlepage.cld} + +This does not look that bad, does it? Of course in pure \TEX\ code it looks +mostly the same but loops and calculations feel a bit more natural in \LUA\ then +in \TEX. The result is shown in \in {figure} [fig:cover]. The actual cover page +was derived from this. + +\startplacefigure[location=here,reference=fig:cover,title={The simplified cover page.}] + \doiffileexistselse {cld-mkiv-simple-titlepage.pdf} { + \externalfigure + [cld-mkiv-simple-titlepage.pdf] + [height=.5\textheight] + } { + \scale + [height=.5\textheight] + {\cldprocessfile{cld-mkiv-simple-titlepage.cld}} + } +\stopplacefigure + +\stopsection + +\startsection[title=A few examples] + +As it makes most sense to use the \LUA\ interface for generated text, here is +another example with a loop: + +\startbuffer +context.startitemize { "a", "packed", "two" } + for i=1,10 do + context.startitem() + context("this is item %i",i) + context.stopitem() + end +context.stopitemize() +\stopbuffer + +\typebuffer + +\ctxluabuffer + +Just as you can mix \TEX\ with \XML\ and \METAPOST, you can define bits and +pieces of a document in \LUA. Tables are good candidates: + +\startbuffer +local one = { + align = "middle", + style = "type", +} +local two = { + align = "middle", + style = "type", + background = "color", + backgroundcolor = "darkblue", + foregroundcolor = "white", +} +local random = math.random +context.bTABLE { framecolor = "darkblue" } + for i=1,10 do + context.bTR() + for i=1,20 do + local r = random(99) + context.bTD(r < 50 and one or two) + context("%2i",r) + context.eTD() + end + context.eTR() + end +context.eTABLE() +\stopbuffer + +\typebuffer + +\placetable[top][tab:random]{A table generated by \LUA.}{\ctxluabuffer} + +Here we see a function call to \type {context} in the most indented line. The +first argument is a format that makes sure that we get two digits and the random +number is substituted into this format. The result is shown in +\in{table}[tab:random]. The line correction is ignored when we use this table as +a float, otherwise it assures proper vertical spacing around the table. Watch how +we define the tables \type {one} and \type {two} beforehand. This saves 198 +redundant table constructions. + +Not all code will look as simple as this. Consider the following: + +\starttyping +context.placefigure( + "caption", + function() context.externalfigure( { "cow.pdf" } ) end +) +\stoptyping + +Here we pass an argument wrapped in a function. If we would not do that, the +external figure would end up wrong, as arguments to functions are evaluated +before the function that gets them (we already showed some alternative approaches +in previous chapters). A function argument is treated as special and in this case +the external figure ends up right. Here is another example: + +\startbuffer +context.placefigure("Two cows!",function() + context.bTABLE() + context.bTR() + context.bTD() + context.externalfigure( + { "cow.pdf" }, + { width = "3cm", height = "3cm" } + ) + context.eTD() + context.bTD { align = "{lohi,middle}" } + context("and") + context.eTD() + context.bTD() + context.externalfigure( + { "cow.pdf" }, + { width = "4cm", height = "3cm" } + ) + context.eTD() + context.eTR() + context.eTABLE() +end) +\stopbuffer + +\typebuffer + +In this case the figure is not an argument so it gets flushed sequentially +with the rest. + +\ctxluabuffer + +\stopsection + +\startsection[title=Styles] + +Say that you want to typeset a word in a bold font. You can do +that this way: + +\starttyping +context("This is ") +context.bold("important") +context("!") +\stoptyping + +Now imagine that you want this important word to be in red too. As we have +a nested command, we end up with a nested call: + +\starttyping +context("This is ") +context.bold(function() context.color( { "red" }, "important") end) +context("!") +\stoptyping + +or + +\starttyping +context("This is ") +context.bold(context.delayed.color( { "red" }, "important")) +context("!") +\stoptyping + +In that case it's good to know that there is a command that combines both +features: + +\starttyping +context("This is ") +context.style( { style = "bold", color = "red" }, "important") +context("!") +\stoptyping + +But that is still not convenient when we have to do that often. So, you can wrap +the style switch in a function. + +\starttyping +local function mycommands.important(str) + context.style( { style = "bold", color = "red" }, str ) +end + +context("This is ") +mycommands.important( "important") +context(", and ") +mycommands.important( "this") +context(" too !") +\stoptyping + +Or you can setup a named style: + +\starttyping +context.setupstyle( { "important" }, { style = "bold", color = "red" } ) + +context("This is ") +context.style( { "important" }, "important") +context(", and ") +context.style( { "important" }, "this") +context(" too !") +\stoptyping + +Or even define one: + +\starttyping +context.definestyle( { "important" }, { style = "bold", color = "red" } ) + +context("This is ") +context.important("important") +context(", and ") +context.important("this") +context(" too !") +\stoptyping + +This last solution is especially handy for more complex cases: + +\startbuffer +context.definestyle( { "important" }, { style = "bold", color = "red" } ) + +context("This is ") +context.startimportant() +context.inframed("important") +context.stopimportant() +context(", and ") +context.important("this") +context(" too !") +\stopbuffer + +\typebuffer + +\ctxluabuffer + +\stopsection + +\startsection[title=A complete example] + +One day my 6 year old niece Lorien was at the office and wanted to know what I +was doing. As I knew she was practicing arithmetic at school I wrote a quick and +dirty script to generate sheets with exercises. The most impressive part was that +the answers were included. It was a rather braindead bit of \LUA, written in a +few minutes, but the weeks after I ended up running it a few more times, for her +and her friends, every time a bit more difficult and also using different +arithmetic. It was that script that made me decide to extend the basic cld manual +into this more extensive document. + +We generate three columns of exercises. Each exercise is a row in a table. The +last argument to the function determines if answers are shown. + +\starttyping +local random = math.random + +local function ForLorien(n,maxa,maxb,answers) + context.startcolumns { n = 3 } + context.starttabulate { "|r|c|r|c|r|" } + for i=1,n do + local sign = random(0,1) > 0.5 + local a, b = random(1,maxa or 99), random(1,max or maxb or 99) + if b > a and not sign then a, b = b, a end + context.NC() + context(a) + context.NC() + context.mathematics(sign and "+" or "-") + context.NC() + context(b) + context.NC() + context("=") + context.NC() + context(answers and (sign and a+b or a-b)) + context.NC() + context.NR() + end + context.stoptabulate() + context.stopcolumns() + context.page() +end +\stoptyping + +This is a typical example of where it's more convenient to write the code in +\LUA\ that in \TEX's macro language. As a consequence setting up the page also +happens in \LUA: + +\starttyping +context.setupbodyfont { + "palatino", + "14pt" +} + +context.setuplayout { + backspace = "2cm", + topspace = "2cm", + header = "1cm", + footer = "0cm", + height = "middle", + width = "middle", +} +\stoptyping + +This leave us to generate the document. There is a pitfall here: we need to use +the same random number for the exercises and the answers, so we freeze and +defrost it. Functions in the \type {commands} namespace implement functionality +that is used at the \TEX\ end but better can be done in \LUA\ than in \TEX\ macro +code. Of course these functions can also be used at the \LUA\ end. + +\starttyping +context.starttext() + + local n = 120 + + commands.freezerandomseed() + + ForLorien(n,10,10) + ForLorien(n,20,20) + ForLorien(n,30,30) + ForLorien(n,40,40) + ForLorien(n,50,50) + + commands.defrostrandomseed() + + ForLorien(n,10,10,true) + ForLorien(n,20,20,true) + ForLorien(n,30,30,true) + ForLorien(n,40,40,true) + ForLorien(n,50,50,true) + +context.stoptext() +\stoptyping + +\placefigure + [here] + [fig:lorien] + {Lorien's challenge.} + {\startcombination + {\externalfigure[cld-005.pdf][page=1,width=.45\textwidth,frame=on]} {exercises} + {\externalfigure[cld-005.pdf][page=6,width=.45\textwidth,frame=on]} {answers} + \stopcombination} + +A few pages of the result are shown in \in {figure} [fig:lorien]. In the +\CONTEXT\ distribution a more advanced version can be found in \type +{s-edu-01.cld} as I was also asked to generate multiplication and table +exercises. In the process I had to make sure that there were no duplicates on a +page as she complained that was not good. There a set of sheets is generated +with: + +\starttyping +moduledata.educational.arithematic.generate { + name = "Bram Otten", + fontsize = "12pt", + columns = 2, + run = { + { method = "bin_add_and_subtract", maxa = 8, maxb = 8 }, + { method = "bin_add_and_subtract", maxa = 16, maxb = 16 }, + { method = "bin_add_and_subtract", maxa = 32, maxb = 32 }, + { method = "bin_add_and_subtract", maxa = 64, maxb = 64 }, + { method = "bin_add_and_subtract", maxa = 128, maxb = 128 }, + }, +} +\stoptyping + +\stopsection + +\startsection[title=Interfacing] + +The fact that we can define functionality using \LUA\ code does not mean that we +should abandon the \TEX\ interface. As an example of this we use a relatively +simple module for typesetting morse code.\footnote {The real module is a bit +larger and can format verbose morse.} First we create a proper namespace: + +\starttyping + +moduledata.morse = moduledata.morse or { } +local morse = moduledata.morse +\stoptyping + +We will use a few helpers and create shortcuts for them. The first helper loops +over each \UTF\ character in a string. The other two helpers map a character onto +an uppercase (because morse only deals with uppercase) or onto an similar shaped +character (because morse only has a limited character set). + +\starttyping +local utfcharacters = string.utfcharacters +local ucchars, shchars = characters.ucchars, characters.shchars +\stoptyping + +The morse codes are stored in a table. + +\starttyping +local codes = { + + ["A"] = "·—", ["B"] = "—···", + ["C"] = "—·—·", ["D"] = "—··", + ["E"] = "·", ["F"] = "··—·", + ["G"] = "——·", ["H"] = "····", + ["I"] = "··", ["J"] = "·———", + ["K"] = "—·—", ["L"] = "·—··", + ["M"] = "——", ["N"] = "—·", + ["O"] = "———", ["P"] = "·——·", + ["Q"] = "——·—", ["R"] = "·—·", + ["S"] = "···", ["T"] = "—", + ["U"] = "··—", ["V"] = "···—", + ["W"] = "·——", ["X"] = "—··—", + ["Y"] = "—·——", ["Z"] = "——··", + + ["0"] = "—————", ["1"] = "·————", + ["2"] = "··———", ["3"] = "···——", + ["4"] = "····—", ["5"] = "·····", + ["6"] = "—····", ["7"] = "——···", + ["8"] = "———··", ["9"] = "————·", + + ["."] = "·—·—·—", [","] = "——··——", + [":"] = "———···", [";"] = "—·—·—", + ["?"] = "··——··", ["!"] = "—·—·——", + ["-"] = "—····—", ["/"] = "—··—· ", + ["("] = "—·——·", [")"] = "—·——·—", + ["="] = "—···—", ["@"] = "·——·—·", + ["'"] = "·————·", ['"'] = "·—··—·", + + ["À"] = "·——·—", + ["Å"] = "·——·—", + ["Ä"] = "·—·—", + ["Æ"] = "·—·—", + ["Ç"] = "—·—··", + ["É"] = "··—··", + ["È"] = "·—··—", + ["Ñ"] = "——·——", + ["Ö"] = "———·", + ["Ø"] = "———·", + ["Ü"] = "··——", + ["ß"] = "··· ···", + +} + +morse.codes = codes +\stoptyping + +As you can see, there are a few non \ASCII\ characters supported as well. There +will never be full \UNICODE\ support simply because morse is sort of obsolete. +Also, in order to support \UNICODE\ one could as well use the bits of \UTF\ +characters, although \unknown\ memorizing the whole \UNICODE\ table is not much +fun. + +We associate a metatable index function with this mapping. That way we can not +only conveniently deal with the casing, but also provide a fallback based on the +shape. Once found, we store the representation so that only one lookup is needed +per character. + +\starttyping +local function resolvemorse(t,k) + if k then + local u = ucchars[k] + local v = rawget(t,u) or rawget(t,shchars[u]) or false + t[k] = v + return v + else + return false + end +end + +setmetatable(codes, { __index = resolvemorse }) +\stoptyping + +Next comes some rendering code. As we can best do rendering at the \TEX\ end we +just use macros. + +\starttyping +local MorseBetweenWords = context.MorseBetweenWords +local MorseBetweenCharacters = context.MorseBetweenCharacters +local MorseLong = context.MorseLong +local MorseShort = context.MorseShort +local MorseSpace = context.MorseSpace +local MorseUnknown = context.MorseUnknown +\stoptyping + +The main function is not that complex. We need to keep track of spaces and +newlines. We have a nested loop because a fallback to shape can result in +multiple characters. + +\starttyping +function morse.tomorse(str) + local inmorse = false + for s in utfcharacters(str) do + local m = codes[s] + if m then + if inmorse then + MorseBetweenWords() + else + inmorse = true + end + local done = false + for m in utfcharacters(m) do + if done then + MorseBetweenCharacters() + else + done = true + end + if m == "·" then + MorseShort() + elseif m == "—" then + MorseLong() + elseif m == " " then + MorseBetweenCharacters() + end + end + inmorse = true + elseif s == "\n" or s == " " then + MorseSpace() + inmorse = false + else + if inmorse then + MorseBetweenWords() + else + inmorse = true + end + MorseUnknown(s) + end + end +end +\stoptyping + +We use this function in two additional functions. One typesets a file, the other +a table of available codes. + +\starttyping +function morse.filetomorse(name,verbose) + morse.tomorse(resolvers.loadtexfile(name),verbose) +end + +function morse.showtable() + context.starttabulate { "|l|l|" } + for k, v in table.sortedpairs(codes) do + context.NC() context(k) + context.NC() morse.tomorse(v,true) + context.NC() context.NR() + end + context.stoptabulate() +end +\stoptyping + +We're done with the \LUA\ code that we can either put in an external file or put +in the module file. The \TEX\ file has two parts. The typesetting macros that we +use at the \LUA\ end are defined first. These can be overloaded. + +\starttyping +\def\MorseShort + {\dontleavehmode + \vrule + width \MorseWidth + height \MorseHeight + depth \zeropoint + \relax} + +\def\MorseLong + {\dontleavehmode + \vrule + width 3\dimexpr\MorseWidth + height \MorseHeight + depth \zeropoint + \relax} + +\def\MorseBetweenCharacters + {\kern\MorseWidth} + +\def\MorseBetweenWords + {\hskip3\dimexpr\MorseWidth\relax} + +\def\MorseSpace + {\hskip7\dimexpr\MorseWidth\relax} + +\def\MorseUnknown#1 + {[\detokenize{#1}]} +\stoptyping + +The dimensions are stored in macros as well. Of course we could provide a proper +setup command, but it hardly makes sense. + +\starttyping +\def\MorseWidth {0.4em} +\def\MorseHeight{0.2em} +\stoptyping + +Finally we have arrived at the macros that interface to the \LUA\ functions. + +\starttyping +\def\MorseString#1{\ctxlua{moduledata.morse.tomorse(\!!bs#1\!!es)}} +\def\MorseFile #1{\ctxlua{moduledata.morse.filetomorse("#1")}} +\def\MorseTable {\ctxlua{moduledata.morse.showtable()}} +\stoptyping + +\startbuffer +\Morse{A more advanced solution would be to convert a node list. That +way we can deal with weird input.} +\stopbuffer + +A string is converted to morse with the first command. + +\typebuffer + +This shows up as: + +\startalignment[flushleft,tolerant]\getbuffer\stopalignment + +Reduction and uppercasing is demonstrated in the next example: + +\startbuffer +\MorseString{ÀÁÂÃÄÅàáâãäå} +\stopbuffer + +\typebuffer + +This gives: + +\startalignment[flushleft,tolerant]\getbuffer\stopalignment + +\stopsection + +\startsection[title=Using helpers] + +The next example shows a bit of \LPEG. On top of the standard functionality +a few additional functions are provided. Let's start with a pure \TEX\ +example: + +\startbuffer +\defineframed + [colored] + [foregroundcolor=red, + foregroundstyle=\underbar, + offset=.1ex, + location=low] +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer +\processisolatedwords {\input ward \relax} \colored +\stopbuffer + +\typebuffer \blank \getbuffer \blank + +Because this processor macro operates at the \TEX\ end it has some limitations. +The content is collected in a very narrow box and from that a regular paragraph +is constructed. It is for this reason that no color is applied: the snippets that +end up in the box are already typeset. + +An alternative is to delegate the task to \LUA: + +\startbuffer +\startluacode +local function process(data) + + local words = lpeg.split(lpeg.patterns.spacer,data or "") + + for i=1,#words do + if i == 1 then + context.dontleavehmode() + else + context.space() + end + context.colored(words[i]) + end + +end + +process(io.loaddata(resolvers.findfile("ward.tex"))) +\stopluacode +\stopbuffer + +\typebuffer \blank \getbuffer \blank + +The function splits the loaded data into a table with individual words. We use a +splitter that splits on spacing tokens. The special case for \type {i = 1} makes +sure that we end up in horizontal mode (read: properly start a paragraph). This +time we do get color because the typesetting is done directly. Here is an +alternative implementation: + +\starttyping +local done = false + +local function reset() + done = false + return true +end + +local function apply(s) + if done then + context.space() + else + done = true + context.dontleavehmode() + end + context.colored(s) +end + +local splitter = lpeg.P(reset) + * lpeg.splitter(lpeg.patterns.spacer,apply) + +local function process(data) + lpeg.match(splitter,data) +end +\stoptyping + +This version is more efficient as it does not create an intermediate table. The +next one is comaprable: + +\starttyping +local function apply(s) + context.colored("%s ",s) +end + +local splitter lpeg.splitter(lpeg.patterns.spacer,apply) + +local function process(data) + context.dontleavevmode() + lpeg.match(splitter,data) + context.removeunwantedspaces() +end +\stoptyping + +\stopsection + +\startsection[title=Formatters] + +Sometimes can save a bit of work by using formatters. By default, the \type {context} +command, when called directly, applies a given formatter. But when called as table +this feature is lost because then we want to process non|-|strings as well. The next +example shows a way out: + +\startbuffer +context("the current emwidth is %p",\number\emwidth) +context.par() +context.formatted("the current emwidth is %p",\number\emwidth) +context.par() +context.bold(string.formatters["the current emwidth is %p"](\number\emwidth)) +context.par() +context.formatted.bold("the current emwidth is %p",\number\emwidth) +\stopbuffer + +The last one is the most interesting one here: in the subnamespace \type +{formatted} (watch the \type {d}) a format specification with extra arguments is +expected. + +\ctxluabuffer + +\stopsection + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/cld/cld-specialcommands.tex b/doc/context/sources/general/manuals/cld/cld-specialcommands.tex new file mode 100644 index 000000000..37ecf45c6 --- /dev/null +++ b/doc/context/sources/general/manuals/cld/cld-specialcommands.tex @@ -0,0 +1,257 @@ +% language=uk + +\startcomponent cld-specialcommands + +\environment cld-environment + +\startchapter[title=Special commands] + +\index{tracing} + +\startsection[title=Tracing] + +There are a few functions in the \type {context} namespace that are no +macros at the \TEX\ end. + +\starttyping +context.runfile("somefile.cld") +\stoptyping + +Another useful command is: + +\starttyping +context.settracing(true) +\stoptyping + +There are a few tracing options that you can set at the \TEX\ end: + +\starttyping +\enabletrackers[context.files] +\enabletrackers[context.trace] +\stoptyping + +\stopsection + +\startsection[title=Overloads] + +A few macros have special functions (overloads) at the \LUA\ end. One of them is +\type {\char}. The function makes sure that the characters ends up right. The +same is true for \type {\chardef}. So, you don't need to mess around with \type +{\relax} or trailing spaces as you would do at the \TEX\ end in order to tell the +scanner to stop looking ahead. + +\starttyping +context.char(123) +\stoptyping + +Other examples of macros that have optimized functions are \type {\par}, +\type{\bgroup} and \type {\egroup}. Or take this: + +\startbuffer +1: \ctxlua{commands.doif(true)}{one} +2: \cldcommand{doif("a","a","two")} +3: \ctxcommand{doif(true)}{three} +\stopbuffer + +\typebuffer + +\startlines +\getbuffer +\stoplines + +\stopsection + +\startsection[title=Steps] + +% added and extended in sync with an article about a generic 'execute' +% feature + +We already mentioned the stepper as a very special trick so let's give +some more explanation here. When you run the following code: + +\setbox0\emptybox + +\starttyping +\startluacode + context.startitemize() + context.startitem() + context("BEFORE 1") + context.stopitem() + context("\\setbox0\\hbox{!!!!}") + context.startitem() + context("%p",tex.getbox(0).width) + context.stopitem() + context.stopitemize() +\stopluacode +\stoptyping + +You get a message like: + +\starttyping +[ctxlua]:8: attempt to index a nil value +... +10 context("\\setbox0\\hbox{!!!!}") +11 context.startitem() +12 >> context("%p",tex.getbox(0).width) +... +\stoptyping + +due to the fact that the box is still void. All that the \CONTEXT\ commands feed +into \TEX\ happens when the code snippet has finished. You can however run a +snippet of code the following way: + +\startbuffer +\startluacode + context.stepwise (function() + context.startitemize() + context.startitem() + context.step("BEFORE 1") + context.stopitem() + context.step("\\setbox0\\hbox{!!!!}") + context.startitem() + context.step("%p",tex.getbox(0).width) + context.stopitem() + context.stopitemize() + end) +\stopluacode +\stopbuffer + +\typebuffer + +and get: + +\getbuffer + +A more extensive example is: + +\startbuffer +\startluacode + context.stepwise (function() + context.startitemize() + context.startitem() + context.step("BEFORE 1") + context.stopitem() + context.step("\\setbox0\\hbox{!!!!}") + context.startitem() + context.step("%p",tex.getbox(0).width) + context.stopitem() + context.startitem() + context.step("BEFORE 2") + context.stopitem() + context.step("\\setbox2\\hbox{????}") + context.startitem() + context.step("%p",tex.getbox(2).width) + context.startitem() + context.step("BEFORE 3") + context.stopitem() + context.startitem() + context.step("\\copy0\\copy2") + context.stopitem() + context.startitem() + context.step("BEFORE 4") + context.startitemize() + context.stepwise (function() + context.step("\\bgroup") + context.step("\\setbox0\\hbox{>>>>}") + context.startitem() + context.step("%p",tex.getbox(0).width) + context.stopitem() + context.step("\\setbox2\\hbox{<<<<}") + context.startitem() + context.step("%p",tex.getbox(2).width) + context.stopitem() + context.startitem() + context.step("\\copy0\\copy2") + context.stopitem() + context.startitem() + context.step("\\copy0\\copy2") + context.stopitem() + context.step("\\egroup") + end) + context.stopitemize() + context.stopitem() + context.startitem() + context.step("AFTER 1\\par") + context.stopitem() + context.startitem() + context.step("\\copy0\\copy2\\par") + context.stopitem() + context.startitem() + context.step("\\copy0\\copy2\\par") + context.stopitem() + context.startitem() + context.step("AFTER 2\\par") + context.stopitem() + context.startitem() + context.step("\\copy0\\copy2\\par") + context.stopitem() + context.startitem() + context.step("\\copy0\\copy2\\par") + context.stopitem() + context.stopitemize() + end) +\stopluacode +\stopbuffer + +\typebuffer + +which gives: + +\getbuffer + +A step returns control to \TEX\ immediately and after the \TEX\ code that it +feeds back is expanded, returns to \LUA. There are some limitations due to the +input stack but normally that is no real issue. + +You can run the following code: + +\starttyping +\definenumber[LineCounter][way=bypage] +\starttext +\startluacode +for i=1,2000 do + context.incrementnumber { "LineCounter" } + context.getnumber { "LineCounter" } + context.par() +end +\stopluacode +\stoptext +\stoptyping + +You will notice however that the number is not right on each page. This is +because \TEX\ doesn't know yet that there is no room on the page. The next will +work better: + +\starttyping +\definenumber[LineCounter][way=bypage] +\starttext +\startluacode +context.stepwise(function() + for i=1,2000 do + context.testpage { 0 } + context.incrementnumber { "LineCounter" } + context.getnumber { "LineCounter" } + context.par() + context.step() + end +end) +\stopluacode +\stoptext +\starttyping + +Instead of the \type {testpage} function you can also play directly with +registers, like: + +\starttyping +if tex.pagegtotal + tex.count.lineheight > tex.pagetotal then +\starttyping + +but often an already defined helper does a better job. Of course you will +probably never need this kind of hacks anyway, if only because much more is going +on and there are better ways then. + +\stopsection + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/cld/cld-summary.tex b/doc/context/sources/general/manuals/cld/cld-summary.tex new file mode 100644 index 000000000..2b62597fa --- /dev/null +++ b/doc/context/sources/general/manuals/cld/cld-summary.tex @@ -0,0 +1,841 @@ +% language=uk + +\startcomponent cld-summary + +\environment cld-environment + +\usemodule[s][characters-properties] + +\startchapter[title=A sort of summary] + +In this chapter we summarize the functionality provided by the \type {context} +namespace. We repeat some of what has been explained in other chapter so that in +fact you can start with this summary. + +If you have read this manual (or seen code) you know that you can access all the +core commands using this namespace: + +\starttyping +context.somecommand("some argument") +context["somecommand"]("some argument") +\stoptyping + +These calls will eventually expand \type {\somecommand} with the given argument. +This interface has been around form the start and has proven to be quite flexible +and robust. In spite of what you might think, the \type {somecommand} is not +really defined in the \type {context} namespace, but in its own one called \type +{core}, accessible via \type {context.core}. + +Next we describe the commands that are naturally defined in the \type {context} +namespace. Some have counterparts at the macro level (like \type {bgroup}) but +many haven't (for instance \type {rule}). We tried not to polute the \type +{context} namespace too much but although we could have put the helpers in a +separate namespace it would make usage a bit more unnatural. + +\startsection[title=Access to commands] + +\startsummary[title={context(".. some text ..")}] + +The string is flushed as|-|is: + +\starttyping +.. some text .. +\stoptyping + +\stopsummary + +\startsummary[title={context("format",...)}] + +The first string is a format specification according that is passed to the \LUA\ +function \type {format} in the \type {string} namespace. Following arguments are +passed too. + +\stopsummary + +\startsummary[title={context(123,...)}] + +The numbers (and following numbers or strings) are flushed without any +formatting. + +\starttyping +123... (concatenated) +\stoptyping + +\stopsummary + +\startsummary[title={context(true)}] + +An explicit \type {endlinechar} is inserted, in \TEX\ speak: + +\starttyping +^^M +\stoptyping + +\stopsummary + +\startsummary[title={context(false,...)}] + +Strings and numbers are flushed surrounded by curly braces, an indexed table is +flushed as option list, and a hashed table is flushed as parameter set. + +\starttyping +multiple {...} or [...] etc +\stoptyping + +\stopsummary + +\startsummary[title={context(node)}] + +The node (or list of nodes) is injected at the spot. Keep in mind that you need +to do the proper memory management yourself. + +\stopsummary + +\startsummary[title={context["command"] context.core["command"]}] + +The function that implements \type {\command}. The \type{core} table is where +these functions realy live. + +\stopsummary + +\startsummary[title={context["command"](value,...)}] + +The value (string or number) is flushed as a curly braced (regular) argument. + +\starttyping +\command {value}... +\stoptyping + +\stopsummary + +\startsummary[title={context["command"]({ value },...)}] + +The table is flushed as value set. This can be an identifier, +a list of options, or a directive. + +\starttyping +\command [value]... +\stoptyping + +\stopsummary + +\startsummary[title={context["command"]({ key = val },...)}] + +The table is flushed as key|/|value set. + +\starttyping +\command [key={value}]... +\stoptyping + +\stopsummary + +\startsummary[title={context["command"](true)}] + +An explicit \type {endlinechar} is inserted. + +\starttyping +\command ^^M +\stoptyping + +\stopsummary + +\startsummary[title={context["command"](node)}] + +The node(list) is injected at the spot. Keep in mind that you need to do the +proper memory management yourself. + +\starttyping +\command {node(list)} +\stoptyping + +\stopsummary + +\startsummary[title={context["command"](false,value)}] + +The value is flushed without encapsulating tokens. + +\starttyping +\command value +\stoptyping + +\stopsummary + +\startsummary[title={context["command"]({ value }, { key = val }, val, false, val)}] + +The arguments are flushed accordingly their nature and the order can be any. + +\starttyping +\command [value][key={value}]{value}value +\stoptyping + +\stopsummary + +\startsummary[title={context.direct(...)}] + +The arguments are interpreted the same as if \type {direct} was a command, but no +\type {\direct} is injected in front. Braces are added: + +\startbuffer +regular \expandafter \bold \ctxlua{context.direct("bold")} regular +black \expandafter \color \ctxlua{context.direct({"red"})}{red} black +black \expandafter \color \ctxlua{context.direct({"green"},"green")} black +\stopbuffer + +\typebuffer + +The \type {\expandafter} makes sure that the \type {\bold} and \type {\color} +macros see the following \type{{bold}}, \type {[red]}, and \type {[green]{green}} +arguments. + +\startlines\getbuffer\stoplines + +\stopsummary + +\startsummary[title={context.delayed(...)}] + +The arguments are interpreted the same as in a \type {context} call, but instead +of a direct flush, the arguments will be flushed in a next cycle. + +\stopsummary + +\startsummary[title={context.delayed["command"](...)}] + +The arguments are interpreted the same as in a \type {command} call, but instead +of a direct flush, the command and arguments will be flushed in a next cycle. + +\stopsummary + +\startsummary[title={context.nested["command"]}] + +This command returns the command, including given arguments as a string. No +flushing takes place. + +\stopsummary + +\startsummary[title={context.nested}] + +This command returns the arguments as a string and treats them the same as a +regular \type {context} call. + +\stopsummary + +\startsummary[title={context.formatted["command"]([<regime>,]<format>,<arguments>)}] + +This command returns the command that will pass it's arguments to the string +formatter. When the first argument is a number, then it is interpreted as a +catcode regime. + +\stopsummary + +\startsummary[title={context.formatted([<regime>,]<format>,<arguments>)}] + +This command passes it's arguments to the string formatter. When the first +argument is a number, then it is interpreted as a catcode regime. + +\stopsummary + +\stopsection + +\startsection[title=\METAFUN] + +\startsummary[title={context.metafun.start()}] + +This starts a \METAFUN\ (or \METAPOST) graphic. + +\stopsummary + +\startsummary[title={context.metafun.stop()}] + +This finishes and flushes a \METAFUN\ (or \METAPOST) graphic. + +\stopsummary + +\startsummary[title={context.metafun("format",...)}] + +The argument is appended to the current graphic data but the string formatter is +used on following arguments. + +\stopsummary + +\startsummary[title={context.metafun.delayed}] + +This namespace does the same as \type {context.delayed}: it wraps the code in such +a way that it can be used in a function call. + +\stopsummary + +\startsection[title=Building blocks] + +\startsummary[title={context.bgroup() context.egroup()}] + +These are just \type {\bgroup} and \type {\egroup} equivalents and as these are +in fact shortcuts to the curly braced we output these instead. + +\stopsummary + +\startsummary[title={context.space()}] + +This one directly maps onto \type {\space}. + +\stopsummary + +\startsummary[title={context.par()}] + +This one directly maps onto \type {\par}. + +\stopsummary + +\stopsection + +\startsection[title=Basic Helpers] + +\startsummary[title={context.rule(wd,ht,dp,direction) context.rule(specification)}] + +A rule node is injected with the given properties. A specification is just a +table with the four fields. The rule gets the current attributes. + +\stopsummary + +\startsummary[title={context.glyph(fontid,n) context.glyph(n)}] + +A glyph node is injected with the given font id. When no id is given, the current font +is used. The glyph gets the current attributes. + +\stopsummary + +\startsummary[title={context.char(n) context.char(str) context.char(tab)}] + +This will inject one or more copies of \type {\char} calls. You can pass a +number, a string representing a number, or a table with numbers. + +\stopsummary + +\startsummary[title={context.utfchar(n) context.utfchar(str)}] + +This injects is \UTF\ character (one or more bytes). You can pass a number +or a string representing a numbers. You need to be aware of special +characters in \TEX, like \type {#}. + +\stopsummary + +\stopsection + +\startsection[title={Registers}] + +This is a table that hosts a couple of functions. The following \type {new} +ones are available: + +\starttyping +local n = newdimen (name) +local n = newskip (name) +local n = newcount (name) +local n = newmuskip(name) +local n = newtoks (name) +local n = newbox (name) +\stoptyping + +These define a register with name \type {name} at the \LUA\ end and \type {\name} +at the \TEX\ end. The registers' number is returned. The next function is like +\type {\chardef}: it defines \type {\name} with value \type {n}. + +\starttyping +local n = newchar(name,n) +\stoptyping + +It's not likely that you will use any of these commands, if only because when +you're operating from the \LUA\ end using \LUA\ variables is more convenient. + +\stopsection + +\startsection[title=Catcodes] + +Normally we operate under the so called \type {context} catcode regime. This +means that content gets piped to \TEX\ using the same meanings for characters as +you normally use in \CONTEXT. So, a \type {$} starts math. In \in {table} +[tab:catcodes] we show the catcode regimes. + +\startplacetable[location=page,title={Catcode regimes},reference=tab:catcodes] + \showcharactercatcodes +\stopplacetable + +\startsummary[title={context.catcodes}] + +The \type {context.catcodes} tables contains the internal numbers of the +catcode tables used. The next table shows the names that can be used. + +\starttabulate[|lT|cT|lT|] +\BC name \BC mnemonic \BC \TEX\ command \NC \NR +\NC context \NC ctx \NC ctxcatcodes \NC \NR +\NC protect \NC prt \NC prtcatcodes \NC \NR +\NC plain \NC tex \NC texcatcodes \NC \NR +\NC text \NC txt \NC txtcatcodes \NC \NR +\NC verbatim \NC vrb \NC vrbcatcodes \NC \NR +\stoptabulate + +\stopsummary + +\startsummary[title={context.newindexer(catcodeindex)}] + +This function defines a new indexer. You can think of the context command itself +as an indexer. There are two (extra) predefined indexers: + +\starttyping +context.verbatim = context.newindexer(context.catcodes.verbatim) +context.puretext = context.newindexer(context.catcodes.text) +\stoptyping + +\stopsummary + +\startsummary[title={context.pushcatcodes(n) context.popcatcodes()}] + +These commands switch to another catcode regime and back. They have to be used +in pairs. Only the regimes atthe \LUA\ end are set. + +\stopsummary + +\startsummary[title={context.unprotect() context.protect()}] + +These commands switch to the protected regime and back. They have to be used in +pairs. Beware: contrary to what its name suggests, the \type {unprotect} enables +the protected regime. These functions also issue an \type {\unprotect} and \type +{\protect} equivalent at the \TEX\ end. + +\stopsummary + +\startsummary[title={context.verbatim context.puretext}] + +The differences between these are subtle: + +\startbuffer +\startluacode + context.verbatim.bold("Why do we use $ for math?") context.par() + context.verbatim.bold("Why do we use { as start?") context.par() + context.verbatim.bold("Why do we use } as end?") context.par() + context.puretext.bold("Why do we use {\\bi $} at all?") +\stopluacode +\stopbuffer + +\typebuffer + +Verbatim makes all characters letters while pure text leaves the backslash and +curly braces special. + +\startpacked \getbuffer \stoppacked + +\stopsummary + +\startsummary[title={context.protected}] + +The protected namespace is only used for commands that are in the \CONTEXT\ +private namespace. + +\stopsummary + +\startsummary[title={context.escaped(str) context.escape(str)}] + +The first command pipes the escaped string to \TEX, while the second one just +returns an unescaped string. The characters \typ {# $ % \ \ { }} are escaped. + +\stopsummary + +\startsummary[title={context.startcollecting() context.stopcollecting()}] + +These two commands will turn flushing to \TEX\ into collecting. This can be handy +when you want to interface commands that grab arguments using delimiters and as +such they are used deep down in some table related interfacing. You probably +don't need them. + +\stopsummary + +\stopsection + +\startsection[title={Templates}] + +In addition to the regular template mechanism (part of the utilities) there is a +dedicated template feature in the \type {context} namespace. An example demonstrates +its working: + +\startbuffer +\startluacode + local MyTable = [[ + \bTABLE + \bTR + \bTD \bf %one_first% \eTD + \bTD %[one_second]% \eTD + \eTR + \bTR + \bTD \bf %two_first% \eTD + \bTD %[two_second]% \eTD + \eTR + \eTABLE + ]] + + context.templates[MyTable] { + one_first = "one", + two_first = "two", + one_second = "just one $", + two_second = "just two $", + } +\stopluacode +\stopbuffer + +\typebuffer + +This renders: + +\startlinecorrection + \getbuffer +\stoplinecorrection + +You can also use more complex tables. Watch the space before and after the keys: + +\startbuffer +\startluacode + local MyOtherTable = [[ + \bTABLE + \bTR + \bTD \bf % ['one']['first'] % \eTD + \bTD %[ ['one']['second'] ]% \eTD + \eTR + \bTR + \bTD \bf % ['two']['first'] % \eTD + \bTD %[ ['two']['second'] ]% \eTD + \eTR + \eTABLE + ]] + + local data = { + one = { first = "one", second = "only 1$" }, + two = { first = "two", second = "only 2$" }, + } + + context.templates[MyOtherTable](data) + + context.templates(MyOtherTable,data) +\stopluacode +\stopbuffer + +\typebuffer + +We get: + +\startlinecorrection + \getbuffer +\stoplinecorrection + +\stopsection + +\startsection[title={Management}] + +\startsummary[title={context.functions}] + +This is private table that hosts managament of functions. You'd better leave this +one alone! + +\stopsummary + +\startsummary[title={context.nodes}] + +Normally you will just use \type {context(<somenode>)} to flush a node and this +private table is more for internal use. + +\stopsummary + +\stopsection + +\startsection[title=String handlers] + +These two functions implement handlers that split a given string into lines and +do something with it. We stick to showing their call. They are used for special +purpose flushing, like flushing content to \TEX\ in commands discussed here. The +\XML\ subsystem also used a couple of dedicated handlers. + +\starttyping +local foo = newtexthandler { + content = function(s) ... end, + endofline = function(s) ... end, + emptyline = function(s) ... end, + simpleline = function(s) ... end, +} + +local foo = newverbosehandler { + line = function(s) ... end, + space = function(s) ... end, + content = function(s) ... end, + before = function() ... end, + after = function() ... end, +} +\stoptyping + +\startsummary[title={context.printlines(str)}] + +The low level \type {tex.print} function pipes its content to \TEX\ and thereby +terminates at at \type {\r} (cariage return, \ASCII\ 13), although it depends on +the way catcodes and line endings are set up. In fact, a line ending in \TEX\ is +not really one, as it gets replaced by a space. Only several lines in succession +indicate a new paragraph. + +\startbuffer +\startluacode + tex.print("line 1\n line 2\r line 3") +\stopluacode +\stopbuffer + +\typebuffer + +This renders only two lines: + +\getbuffer + +\startbuffer +\startluacode + context("line 1\n line 2\r line 3") +\stopluacode +\stopbuffer + +However, the \type {context} command gives all three lines: + +\typebuffer + +Like: + +\getbuffer + +The \type {context.printlines} command is a direct way to print a string in a way +similar to reading from a file. So, + +\starttyping +tex.print(io.loaddata(resolvers.findfile("tufte"))) +\stoptyping + +Gives one line, while: + +\starttyping +context.printlines(io.loaddata(resolvers.findfile("tufte"))) +\stoptyping + +gives them all, as does: + +\starttyping +context(io.loaddata(resolvers.findfile("tufte"))) +\stoptyping + +as does a na\"ive: + +\starttyping +tex.print((string.gsub(io.loaddata(resolvers.findfile("tufte")),"\r","\n"))) +\stoptyping + +But, because successive lines need to become paragraph separators as bit more +work is needed and that is what \type {printlines} and \type {context} do for +you. However, a more convenient alternative is presented next. + +\stopsummary + +\startsummary[title={context.loadfile(name)}] + +This function locates and loads the file with the given name. The leading and +trailing spaces are stripped. + +\stopsummary + +\startsummary[title={context.runfile(name)}] + +This function locates and processes the file with the given name. The assumption +is that it is a valid \LUA\ file! When no suffix is given, the suffix \type {cld} +(\CONTEXT\ \LUA\ document) is used. + +\stopsummary + +\startsummary[title={context.viafile(data[,tag])}] + +The \type {data} is saved to a (pseudo) file with the optional name \type {tag} +and read in again from that file. This is a robust way to make sure that the data +gets processed like any other data read from file. It permits all kind of +juggling with catcodes, verbatim and alike. + +\stopsummary + +\stopsection + +\startsection[title={Helpers}] + +\startsummary[title={context.tocontext(variable)}] + +For documentation or tracing it can be handy to serialize a variable. The \type +{tocontext} function does this: + +\starttyping +context.tocontext(true) +context.tocontext(123) +context.tocontext("foo") +context.tocontext(tonumber) +context.tocontext(nil) +context.tocontext({ "foo", "bar" },true) +context.tocontext({ this = { foo , "bar" } },true) +\stoptyping + +Beware, \type {tocontext} is also a table that you can assign to, but that might +spoil serialization. This property makes it possible to extend the serializer. + +\stopsummary + +\startsummary[title={context.tobuffer(name,str[,catcodes])}] + +With this function you can put content in a buffer, optionally under a catcode +regime. + +\stopsummary + +\startsummary[title={context.tolines(str[,true])}] + +This function splits the string in lines and flushes them one by one. When the +second argument is \type {true} leading and trailing spaces are stripped. Each +flushed line always gets one space appended. + +\stopsummary + +\startsummary[title={context.fprint([regime,]fmt,...),tex.fprint([regime,]fmt,...)}] + +The \type {tex.fprint} is just there to complement the other flushers in the +\type {tex} namespace and therefore we also have it in the \type {context} +namespace. + +\stopsummary + +\stopsection + +\startsection[title=Tracing] + +\startsummary[title={context.settracing(true or false))}] + +You can trace the \TEX\ code that is generated at the \TEX\ end with: + +\starttyping +\enabletrackers[context.trace] +\stoptyping + +The \LUA\ function sets the tracing from the \LUA\ end. As the \type {context} +command is used a lot in the core, you can expect some more tracing that the code +that you're currently checking. + +\stopsummary + +\startsummary[title={context.pushlogger(fnc) context.poplogger() context.getlogger()}] + +You can provide your own logger if needed. The pushed function receives one string +argument. The getter returns three functions: + +\starttyping +local flush, writer, flushdirect = context.getlogger() +\stoptyping + +The \type{flush} function is similar to \type {tex.sprint} and appends its +arguments, while \type {flushdirect} treats each argument as a line and behaves +like \type {tex.print}. The \type {flush} function adds braces and paranthesis +around its arguments, apartt from the first one, which is considered to be a +command. Examples are: + +\starttyping +flush("one",2,"three") -- catcode, strings|numbers +writer("\\color",{"red"},"this is red") +\stoptyping + +and: + +\starttyping +flush(context.catcodes.verbatim,"one",2,"three") +writer(context.catcodes.verbatim,"\\color",{"red"},"this is red") +\stoptyping + +\stopsummary + +\stopsection + +\startsection[title=States] + +There are several ways to implement alternative code paths in \CONTEXT\ but modes +and conditionals are used mostly. There area few helpers for that. + +\startsummary[title={context.conditionals context.setconditional(name,value)}] + +Conditionals are used to keep a state. You can set their value using the setter, +but their effect is not immediate but part of the current sequence of commands +which is delegated to \TEX. However, you can easily keep track of your state +at the \LUA\ end with an extra boolean. So, after + +\starttyping +if context.conditionals.whatever then + context.setconditional("dothis",false) +else + context.setconditional("dothat",true) +end +\stoptyping + +the value of \type {dothis} and \type {dothat} conditions are not yet set in +\LUA. + +\stopsummary + +\startsummary[title={context.modes context.setmode(name,value)}] + +As with conditionals, you can (re)set the modes in \LUA\ but their values +get changes as part of the command sequence which is delayed till after the +\LUA\ call. + +\stopsummary + +\startsummary[title={context.systemmodes context.setsystemmode(name,value)}] + +The same applies as for regular modes. + +\stopsummary + +\startsummary[title={context.trialtypesetting()}] + +This function returns \type {true} if we're in trial typesetting mode (used when +for instance prerolling a table). + +\stopsummary + +\stopsection + +\startsection[title=Steps] + +The stepper permits stepwise processing of \CONTEXT\ code: after a step contyrol +gets delegated to \CONTEXT\ and afterwards back to \LUA. There main limitation of +this mechanism is that it cannot exceed the number of input levels. + +\startsummary[title={context.stepwise() context.step([str])}] + +Usage is as follows: + +\starttyping +context.stepwise (function() + ... + context.step(...) + ... + context.step(...) + ... + context.stepwise (function() + ... + context.step(...) + ... + context.step(...) + ... + end) + ... + context.step(...) + ... + context.step(...) + ... +end) +\stoptyping + +\stopsummary + +\stopsection + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/cld/cld-titlepage.tex b/doc/context/sources/general/manuals/cld/cld-titlepage.tex new file mode 100644 index 000000000..926a98952 --- /dev/null +++ b/doc/context/sources/general/manuals/cld/cld-titlepage.tex @@ -0,0 +1,14 @@ +\startcomponent cld-titlepage + +\environment cld-environment + +% \cldprocessfile{cld-mkiv-titlepage.cld} + +\startTEXpage + \externalfigure[cld-mkiv-titlepage.pdf]% +\stopTEXpage % faster during writing + +\startstandardmakeup[doublesided=no,page=no] +\stopstandardmakeup + +\stopcomponent diff --git a/doc/context/sources/general/manuals/cld/cld-verbatim.tex b/doc/context/sources/general/manuals/cld/cld-verbatim.tex new file mode 100644 index 000000000..2007f7d73 --- /dev/null +++ b/doc/context/sources/general/manuals/cld/cld-verbatim.tex @@ -0,0 +1,470 @@ +% language=uk + +\startcomponent cld-verbatim + +\environment cld-environment + +\startchapter[title=Verbatim] + +\startsection[title=Introduction] + +\index{verbatim} + +If you are familiar with traditional \TEX, you know that some characters have +special meanings. For instance a \type {$} starts and ends inline math mode: + +\starttyping +$e=mc^2$ +\stoptyping + +If we want to typeset math from the \LUA\ end, we can say: + +\starttyping +context.mathematics("e=mc^2") +\stoptyping + +This is in fact: + +\starttyping +\mathematics{e=mc^2} +\stoptyping + +However, if we want to typeset a dollar and use the \type {ctxcatcodes} regime, +we need to explicitly access that character using \type {\char} or use a command +that expands into the character with catcode other. + +One step further is that we typeset all characters as they are and this is called +verbatim. In that mode all characters are tokens without any special meaning. + +\stopsection + +\startsection[title=Special treatment] + +The formula in the introduction can be typeset verbatim as follows: + +\startbuffer +context.verbatim("$e=mc^2$") +\stopbuffer + +\typebuffer + +This gives: + +\ctxluabuffer + +You can also do things like this: + +\startbuffer +context.verbatim.bold("$e=mc^2$") +\stopbuffer + +\typebuffer + +Which gives: + +\ctxluabuffer + +So, within the \type {verbatim} namespace, each command gets its arguments +verbatim. + +\startbuffer +context.verbatim.inframed({ offset = "0pt" }, "$e=mc^2$") +\stopbuffer + +\typebuffer + +Here we get: \ctxluabuffer. So, settings and alike are processed as if the user +had used a regular \type {context.inframed} but the content comes out verbose. + +If you wonder why verbatim is needed as we also have the \type {type} function +(macro) the answer is that it is faster, easier to key in, and sometimes the only +way to get the desired result. + +\stopsection + +\startsection[title=Multiple lines] + +Currently we have to deal with linebreaks in a special way. This is due to the +way \TEX\ deals with linebreaks. In fact, when we print something to \TEX, the +text after a \type {\n} is simply ignored. + +For this reason we have a few helpers. If you want to put something in a buffer, +you cannot use the regular buffer functions unless you make sure that they are +not overwritten while you're still at the \LUA\ end. + +\starttyping +context.tobuffer("temp",str) +context.getbuffer("temp") +\stoptyping + +Another helper is the following. It splits the string into lines and feeds them +piecewise using the \type {context} function and in the process adds a space at +the end of the line (as this is what \TEX\ normally does. + +\starttyping +context.tolines(str) +\stoptyping + +Catcodes can get in the way when you pipe something to \TEX\ that itself changes +the catcodes. This happens for instance when you write buffers that themselves +have buffers or have code that changes the line endings as with \type +{startlines}. In that case you need to feed back the content as if it were a +file. This is done with: + +\starttyping +context.viafile(str) +\stoptyping + +The string can contain newlines. The string is written to a virtual file that is +input. Currently names looks like \type {virtual://virtualfile.1} but future +versions might have a different name part, so best use the variable instead. +After all, you don't know the current number in advance anyway. + +\stopsection + +\startsection[title=Pretty printing] + +In \CONTEXT\ \MKII\ there have always been pretty printing options. We needed it +for manuals and it was also handy to print sources in the same colors as the +editor uses. Most of those pretty printers work in a line|-|by|-|line basis, but +some are more complex, especially when comments or strings can span multiple +lines. + +When the first versions of \LUATEX\ showed up, rewriting the \MKII\ code to use +\LUA\ was a nice exercise and the code was not that bad, but when \LPEG\ showed +up, I put it on the agenda to reimplement them again. + +We only ship a few pretty printers. Users normally have their own preferences and +it's not easy to make general purpose pretty printers. This is why the new +framework is a bit more flexible and permits users to kick in their own code. + +Pretty printing involves more than coloring some characters or words: + +\startitemize[packed] +\startitem spaces should honoured and can be visualized \stopitem +\startitem newlines and empty lins need to be honoured as well \stopitem +\startitem optionally lines have to be numbered but \stopitem +\startitem wrapped around lines should not be numbered \stopitem +\stopitemize + +It's not much fun to deal with these matters each time that you write a pretty +printer. This is why we can start with an existing one like the default pretty +printer. We show several variants of doing the same. We start with a simple clone +of the default parser. \footnote {In the meantime the lexer of the \SCITE\ editor +that I used also provides a mechanism for using \LPEG\ based lexers. Although in +the pretty printing code we need a more liberal one I might backport the lexers I +wrote for editing \TEX, \METAPOST, \LUA, \CLD, \XML\ and \PDF\ as a variant for +the ones we use in \MKIV\ now. That way we get similar colorschemes which might +be handy sometimes.} + +\startbuffer +local P, V = lpeg.P, lpeg.V + +local grammar = visualizers.newgrammar("default", { + pattern = V("default:pattern"), + visualizer = V("pattern")^1 +} ) + +local parser = P(grammar) + +visualizers.register("test-0", { parser = parser }) +\stopbuffer + +\typebuffer \ctxluabuffer + +We distinguish between grammars (tables with rules), parsers (a grammar turned +into an \LPEG\ expression), and handlers (collections of functions that can be +applied. All three are registered under a name and the verbatim commands can +refer to that name. + +\startbuffer +\starttyping[option=test-0,color=] +Test 123, +test 456 and +test 789! +\stoptyping +\stopbuffer + +\typebuffer + +Nothing special happens here. We just get straightforward verbatim. + +\getbuffer + +Next we are going to color digits. We collect as many as possible in a row, so +that we minimize the calls to the colorizer. + +\startbuffer +local patterns, P, V = lpeg.patterns, lpeg.P, lpeg.V + +local function colorize(s) + context.color{"darkred"} + visualizers.writeargument(s) +end + +local grammar = visualizers.newgrammar("default", { + digit = patterns.digit^1 / colorize, + pattern = V("digit") + V("default:pattern"), + visualizer = V("pattern")^1 +} ) + +local parser = P(grammar) + +visualizers.register("test-1", { parser = parser }) +\stopbuffer + +\typebuffer \ctxluabuffer + +Watch how we define a new rule for the digits and overload the pattern rule. We +can refer to the default rule by using a prefix. This is needed when we define a +rule with the same name. + +\startbuffer +\starttyping[option=test-1,color=] +Test 123, +test 456 and +test 789! +\stoptyping +\stopbuffer + +\typebuffer + +This time the digits get colored. + +\getbuffer + +In a similar way we can colorize letters. As with the previous example, we use +\CONTEXT\ commands at the \LUA\ end. + +\startluacode +local patterns, P, V = lpeg.patterns, lpeg.P, lpeg.V + +local function colorize_lowercase(s) + context.color{"darkgreen"} + visualizers.writeargument(s) +end +local function colorize_uppercase(s) + context.color{"darkblue"} + visualizers.writeargument(s) +end + +local grammar = visualizers.newgrammar("default", { + + lowercase = patterns.lowercase^1 / colorize_lowercase, + uppercase = patterns.uppercase^1 / colorize_uppercase, + + pattern = + V("lowercase") + + V("uppercase") + + V("default:pattern"), + + visualizer = V("pattern")^1 + +} ) + +local parser = P(grammar) + +visualizers.register("test-2", { parser = parser }) +\stopluacode + +\startbuffer +\starttyping[option=test-2,color=] +Test 123, +test 456 and +test 789! +\stoptyping +\stopbuffer + +\typebuffer + +Again we get some coloring. + +\getbuffer + +It will be clear that the amount of rules and functions is larger when we use a +more complex parser. It is for this reason that we can group functions in +handlers. We can also make a pretty printer configurable by defining handlers at +the \TEX\ end. + +\startbuffer +\definestartstop + [MyDigit] + [style=bold,color=darkred] + +\definestartstop + [MyLowercase] + [style=bold,color=darkgreen] + +\definestartstop + [MyUppercase] + [style=bold,color=darkblue] +\stopbuffer + +\typebuffer \getbuffer + +The \LUA\ code now looks different. Watch out: we need an indirect call to for +instance \type {MyDigit} because a second argument can be passed: the settings +for this environment and you don't want that get passed to \type {MyDigit} and +friends. + +\startluacode +local patterns, P, V = lpeg.patterns, lpeg.P, lpeg.V +local pattern = visualizers.pattern +local verbatim = context.verbatim + +local MyDigit = verbatim.MyDigit +local MyLowercase = verbatim.MyLowercase +local MyUppercase = verbatim.MyUppercase + +-- local handler = newhandler("default, { +-- digit = function(s) MyDigit (s) end, +-- lowercase = function(s) MyLowercase(s) end, +-- uppercase = function(s) MyUppercase(s) end, +-- } ) + +local handler = { + digit = function(s) MyDigit (s) end, + lowercase = function(s) MyLowercase(s) end, + uppercase = function(s) MyUppercase(s) end, +} + +local grammar = visualizers.newgrammar("default", { + + digit = pattern(handler,"digit", patterns.digit ^1), + lowercase = pattern(handler,"lowercase", patterns.lowercase^1), + uppercase = pattern(handler,"uppercase", patterns.uppercase^1), + + pattern = + V("lowercase") + + V("uppercase") + + V("digit") + + V("default:pattern"), + + visualizer = V("pattern")^1 + +} ) + +local parser = P(grammar) + +visualizers.register("test-3", { parser = parser, handler = handler }) +\stopluacode + +\startbuffer +\starttyping[option=test-3,color=] +Test 123, +test 456 and +test 789! +\stoptyping +\stopbuffer + +\typebuffer + +We get digits, upper- and lowercase characters colored: + +\getbuffer + +You can also use parsers that don't use \LPEG: + +\startbuffer +local function parser(s) + visualizers.write("["..s.."]") +end + +visualizers.register("test-4", { parser = parser }) +\stopbuffer + +\typebuffer \ctxluabuffer + +\startbuffer +\starttyping[option=test-4,space=on,color=darkred] +Test 123, +test 456 and +test 789! +\stoptyping +\stopbuffer + +\typebuffer + +The function \type {visualizer.write} takes care of spaces and newlines. + +\getbuffer + +We have a few more helpers: + +\starttabulate[|||] +\NC \type{visualizers.write} \NC interprets the argument and applies methods \NC \NR +\NC \type{visualizers.writenewline} \NC goes to the next line (similar to \type {\par} \NC \NR +\NC \type{visualizers.writeemptyline} \NC inserts an empty line (similer to \type {\blank} \NC \NR +\NC \type{visualizers.writespace} \NC inserts a (visible) space \NC \NR +\NC \type{visualizers.writedefault} \NC writes the argument verbatim without interpretation \NC \NR +\stoptabulate + +These mechanism have quite some overhead in terms of function calls. In the worst +case each token needs a (nested) call. However, doing all this at the \TEX\ end +also comes at a price. So, in practice this approach is more flexible but without +too large a penalty. + +In all these examples we typeset the text verbose: what is keyed in normally +comes out (either or not with colors), so spaces stay spaces and linebreaks are +kept. + +\startbuffer +local function parser(s) + local s = string.gsub(s,"show","demonstrate") + local s = string.gsub(s,"'re"," are") + context(s) +end + +visualizers.register("test-5", { parser = parser }) +\stopbuffer + +\typebuffer \ctxluabuffer + +\startbuffer +\starttyping[option=test-5,color=darkred,style=] +This is just some text to show what we can do with this mechanism. In +spite of what you might think we're not bound to verbose text. +\stoptyping +\stopbuffer + +We can apply this visualizer as follows: + +\typebuffer + +This time the text gets properly aligned: + +\getbuffer + +It often makes sense to use a buffer: + +\startbuffer +\startbuffer[demo] +This is just some text to show what we can do with this mechanism. In +spite of what you might think we're not bound to verbose text. +\stopbuffer +\stopbuffer + +\typebuffer \getbuffer + +Instead of processing the buffer in verbatim mode you can then +process it directly: + +\startbuffer +\setuptyping[file][option=test-5,color=darkred,style=] +\ctxluabuffer[demo] +\stopbuffer + +\typebuffer + +Which gives: + +\start \getbuffer \stop + +In this case, the space is a normal space and not the fixed verbatim space, which +looks better. + +\stopsection + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/columnsets/columnsets-000.tex b/doc/context/sources/general/manuals/columnsets/columnsets-000.tex index 429a067de..4f254e2ae 100644 --- a/doc/context/sources/general/manuals/columnsets/columnsets-000.tex +++ b/doc/context/sources/general/manuals/columnsets/columnsets-000.tex @@ -40,6 +40,9 @@ \setupfooter [style=\tttf] +\setupheader + [style=\tttf] + \setuptolerance [verytolerant,stretch] diff --git a/doc/context/sources/general/manuals/columnsets/columnsets.tex b/doc/context/sources/general/manuals/columnsets/columnsets.tex index 0cb95229d..6df706d90 100644 --- a/doc/context/sources/general/manuals/columnsets/columnsets.tex +++ b/doc/context/sources/general/manuals/columnsets/columnsets.tex @@ -107,6 +107,11 @@ \definecolor[color-5][.5(white,color-4)] \definecolor[color-6][.2(white,color-4)] +\usemodule[typesetting] + +\setupcombination + [style=mono] + \startuseMPgraphic{page} StartPage ; path p ; @@ -143,144 +148,6 @@ StopPage ; \defineoverlay[frame] [\useMPgraphic{frame}] \defineoverlay[contrast][\useMPgraphic{contrast}] -\setupexternalfigures - [background=frame] - -\definecombination - [sixpages] - [%inbetween=\blank, - style=mono, - distance=.5\bodyfontsize, - width=\textwidth] - -\definecombination - [fourpages] - [%inbetween=\blank, - style=mono, - distance=.5\bodyfontsize, - width=\textwidth] - -\definecombination - [twopages] - [style=mono] - -\definemeasure[twopages] [\dimexpr\dimexpr\textwidth-3 \bodyfontsize\relax/4\relax] -\definemeasure[fourpages] [\dimexpr\dimexpr\textwidth-3 \bodyfontsize\relax/4\relax] -\definemeasure[eightpages][\dimexpr\dimexpr\textwidth-3 \bodyfontsize\relax/4\relax] -\definemeasure[sixpages] [\dimexpr\dimexpr\textwidth-2.5\bodyfontsize\relax/6\relax] - -\starttexdefinition unexpanded OnePage #1 - \startlinecorrection[blank] - \startcombination[twopages][1*1] - {\typesetfile[#1.tex][page=1,lines=15]} {1} - \stopcombination - \stoplinecorrection -\stoptexdefinition - -\starttexdefinition unexpanded OneSpread #1 - \startlinecorrection[blank] - \startcombination[twopages][1*1] - {\typesetfile[#1.tex][page=2,lines=15]} {2} - \stopcombination - \stoplinecorrection -\stoptexdefinition - -\starttexdefinition unexpanded TwoPages #1 - \startlinecorrection[blank] - \startcombination[twopages][2*1] - {\typesetfile[#1.tex][page=1,width=\measure{twopages}]} {1} - {\typesetfile[#1.tex][page=2,width=\measure{twopages}]} {2} - \stopcombination - \stoplinecorrection -\stoptexdefinition - -\starttexdefinition unexpanded TwoSpread #1 - \startlinecorrection[blank] - \startcombination[twopages][2*1] - {\typesetfile[#1.tex][page=2,width=\measure{twopages}]} {2} - {\typesetfile[#1.tex][page=3,width=\measure{twopages}]} {3} - \stopcombination - \stoplinecorrection -\stoptexdefinition - -\starttexdefinition unexpanded FourPages #1 - \startlinecorrection[blank] - \startcombination[fourpages][4*1] - {\typesetfile[#1.tex][page=1,width=\measure{fourpages}]} {1} - {\typesetfile[#1.tex][page=2,width=\measure{fourpages}]} {2} - {\typesetfile[#1.tex][page=3,width=\measure{fourpages}]} {3} - {\typesetfile[#1.tex][page=4,width=\measure{fourpages}]} {4} - \stopcombination - \stoplinecorrection -\stoptexdefinition - -\starttexdefinition unexpanded FourSpread #1 - \startlinecorrection[blank] - \startcombination[fourpages][4*1] - {\typesetfile[#1.tex][page=2,width=\measure{fourpages}]} {2} - {\typesetfile[#1.tex][page=3,width=\measure{fourpages}]} {3} - {\typesetfile[#1.tex][page=4,width=\measure{fourpages}]} {4} - {\typesetfile[#1.tex][page=5,width=\measure{fourpages}]} {5} - \stopcombination - \stoplinecorrection -\stoptexdefinition - -\starttexdefinition unexpanded SixPages #1 - \startlinecorrection[blank] - \startcombination[sixpages][6*1] - {\typesetfile[#1.tex][page=1,width=\measure{sixpages}]} {1} - {\typesetfile[#1.tex][page=2,width=\measure{sixpages}]} {2} - {\typesetfile[#1.tex][page=3,width=\measure{sixpages}]} {3} - {\typesetfile[#1.tex][page=4,width=\measure{sixpages}]} {4} - {\typesetfile[#1.tex][page=5,width=\measure{sixpages}]} {5} - {\typesetfile[#1.tex][page=6,width=\measure{sixpages}]} {6} - \stopcombination - \stoplinecorrection -\stoptexdefinition - -\starttexdefinition unexpanded SixSpread #1 - \startlinecorrection[blank] - \startcombination[sixpages][6*1] - {\typesetfile[#1.tex][page=2,width=\measure{sixpages}]} {2} - {\typesetfile[#1.tex][page=3,width=\measure{sixpages}]} {3} - {\typesetfile[#1.tex][page=4,width=\measure{sixpages}]} {4} - {\typesetfile[#1.tex][page=5,width=\measure{sixpages}]} {5} - {\typesetfile[#1.tex][page=6,width=\measure{sixpages}]} {6} - {\typesetfile[#1.tex][page=7,width=\measure{sixpages}]} {7} - \stopcombination - \stoplinecorrection -\stoptexdefinition - -\starttexdefinition unexpanded EightPages #1 - \startlinecorrection[blank] - \startcombination[fourpages][4*2] - {\typesetfile[#1.tex][page=1,width=\measure{eightpages}]} {#1 / 1} - {\typesetfile[#1.tex][page=2,width=\measure{eightpages}]} {#1 / 2} - {\typesetfile[#1.tex][page=3,width=\measure{eightpages}]} {#1 / 3} - {\typesetfile[#1.tex][page=4,width=\measure{eightpages}]} {#1 / 4} - {\typesetfile[#1.tex][page=5,width=\measure{eightpages}]} {#1 / 5} - {\typesetfile[#1.tex][page=6,width=\measure{eightpages}]} {#1 / 6} - {\typesetfile[#1.tex][page=7,width=\measure{eightpages}]} {#1 / 7} - {\typesetfile[#1.tex][page=8,width=\measure{eightpages}]} {#1 / 8} - \stopcombination - \stoplinecorrection -\stoptexdefinition - -\starttexdefinition unexpanded EightSpread #1 - \startlinecorrection[blank] - \startcombination[fourpages][4*2] - {\typesetfile[#1.tex][page=2,width=\measure{eightpages}]} {#1 / 2} - {\typesetfile[#1.tex][page=3,width=\measure{eightpages}]} {#1 / 3} - {\typesetfile[#1.tex][page=4,width=\measure{eightpages}]} {#1 / 4} - {\typesetfile[#1.tex][page=5,width=\measure{eightpages}]} {#1 / 5} - {\typesetfile[#1.tex][page=6,width=\measure{eightpages}]} {#1 / 6} - {\typesetfile[#1.tex][page=7,width=\measure{eightpages}]} {#1 / 7} - {\typesetfile[#1.tex][page=8,width=\measure{eightpages}]} {#1 / 8} - {\typesetfile[#1.tex][page=9,width=\measure{eightpages}]} {#1 / 9} - \stopcombination - \stoplinecorrection -\stoptexdefinition - \setuphead [chapter] [style=\QuiteLarge, @@ -352,23 +219,15 @@ StartPage ; fill p shifted sh withcolor \MPcolor{color-3} withtransparency(1,.5) ; draw q xysized (bbwidth(p),bbheight(p)) shifted sh ; enddef ; - if true : - do_it ((2w/10,17d),(.1w,20d)) ; - do_it ((2w/10,15d),(.1w,56d)) ; - do_it ((2w/10,21d),(.4w,66d)) ; - do_it ((2w/10,13d),(.7w,38d)) ; - do_it ((5w/10,13d),(.4w,13d)) ; - draw textext.urt("\ssbf Hans Hagen") - xysized (5w/10,5d) - shifted (.4w,6d) - withcolor \MPcolor{color-5} ; - else : - do_it ((2w/10,17d),(.1w,15d)) ; - do_it ((2w/10,15d),(.1w,51d)) ; - do_it ((2w/10,21d),(.4w,61d)) ; - do_it ((2w/10,13d),(.7w,31d)) ; - do_it ((5w/10,13d),(.4w, 7d)) ; - fi ; + do_it ((2w/10,17d),(.1w,20d)) ; + do_it ((2w/10,15d),(.1w,56d)) ; + do_it ((2w/10,21d),(.4w,66d)) ; + do_it ((2w/10,13d),(.7w,38d)) ; + do_it ((5w/10,13d),(.4w,13d)) ; + draw textext.urt("\ssbf Hans Hagen") + xysized (5w/10,5d) + shifted (.4w,6d) + withcolor \MPcolor{color-5} ; StopPage ; \stopMPpage diff --git a/doc/context/sources/general/manuals/details/back-0.tex b/doc/context/sources/general/manuals/details/back-0.tex new file mode 100644 index 000000000..137884919 --- /dev/null +++ b/doc/context/sources/general/manuals/details/back-0.tex @@ -0,0 +1,39 @@ +% content=tex +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\startenvironment back-0 + +\usemodule[simulate] + +\definecolor[shadecolor][r=.5,g=.5,b=.75] % blue +\definecolor[shadecolor][r=.5,g=.5,b=.25] % yellow + +\definecolor[red] [r=.5] +\definecolor[blue] [b=.5] +\definecolor[green][g=.5] + +\setuplayout + [width=middle,height=middle, + backspace=1cm,topspace=1cm, + header=0pt,footer=0pt,grid=yes] + +\setuprandomize + [medium] + +\setupbackgrounds + [page] + [background=color, + backgroundcolor=white] + +\setuptolerance + [verytolerant,stretch] + +\setupcolors + [state=start] + +\showgrid + +\setrandomseed{1000} + +\stopenvironment diff --git a/doc/context/sources/general/manuals/details/back-1.tex b/doc/context/sources/general/manuals/details/back-1.tex new file mode 100644 index 000000000..5f5109184 --- /dev/null +++ b/doc/context/sources/general/manuals/details/back-1.tex @@ -0,0 +1,58 @@ +\environment back-0 + +\setupindenting[big] + +\definecolumnset[two][n=3] +\definecolumnsetspan[test] + +\definetextbackground[test] + [background=color, + backgroundcolor=gray] + +\definetextbackground[more] + [background=color, + backgroundcolor=lightgray, + alternative=1,rulethickness=2pt] + +\dontcomplain + +\starttext + +\startcolumnset[two] + + \startcolumnsetspan[test] + \input tufte + \stopcolumnsetspan + + \starttextbackground[test] + + \input tufte \par + + \startnarrower + + \starttextbackground[more] + + \input tufte \par + \input tufte \par + \input tufte \par + \input tufte \par + \input tufte \par + \input tufte + + \stoptextbackground + + \stopnarrower + + \stoptextbackground + + \input tufte + + \starttextbackground[more] \input tufte \stoptextbackground + + \starttextbackground[test] \input tufte \stoptextbackground + + \starttextbackground[more] \input tufte \stoptextbackground + +\stopcolumnset + +\stoptext diff --git a/doc/context/sources/general/manuals/details/back-2.tex b/doc/context/sources/general/manuals/details/back-2.tex new file mode 100644 index 000000000..053125827 --- /dev/null +++ b/doc/context/sources/general/manuals/details/back-2.tex @@ -0,0 +1,99 @@ +\environment back-0 + +\startuseMPgraphic{mpos:par:color} + for i=1 upto nofmultipars : + fill multipars[i] withcolor + if multikind[i]="single" : "darkgray" ; + elseif multikind[i]="first" : "red" ; + elseif multikind[i]="middle" : "green" ; + elseif multikind[i]="last" : "blue" ; + else : "black" ; + fi ; + endfor ; +\stopuseMPgraphic + +\setupindenting + [medium,first] + +\definecolumnset + [four] + [n=4, + distance=7.5mm] + +\definetextbackground + [test] + [location=text, + mp=mpos:par:color, + before=\blank, + after=\blank] + +\starttext + +\starttexdefinition test #1#2#3 + \blank + \bgroup + \dontcomplain + \hangindent#1\relax + \hangafter #2\relax + \parindent #3\relax + \starttextbackground[test]% + \simulatewords[n=200,m=500,min=1,max=5,color=gray]% + \stoptextbackground + \par + \egroup + \blank +\stoptexdefinition + +\startcolumnset[four] + +\startbuffer[a] +\test {2cm} { -2} { 5mm} +\test {2cm} { -2} { 0cm} +\test {2cm} { -2} {-5mm} + +\test {2cm} { -5} { 5mm} +\test {2cm} { -5} { 0cm} +\test {2cm} { -5} {-5mm} + +\stopbuffer + +\startbuffer[b] +\test {-1cm} { -2} { 5mm} +\test {-1cm} { -2} { 0cm} +\test {-1cm} { -2} {-5mm} + +\test {-1cm} { -5} { 5mm} +\test {-1cm} { -5} { 0cm} +\test {-1cm} { -5} {-5mm} +\stopbuffer + +\startbuffer[c] +\test { 1cm} { 2} { 5mm} +\test { 1cm} { 2} { 0cm} +\test { 1cm} { 2} {-5mm} + +\test { 1cm} { 5} { 5mm} +\test { 1cm} { 5} { 0cm} +\test { 1cm} { 5} {-5mm} +\stopbuffer + +\startbuffer[d] +\test {-1cm} { 2} { 5mm} +\test {-1cm} { 2} { 0cm} +\test {-1cm} { 2} {-5mm} + +\test {-1cm} { 5} { 5mm} +\test {-1cm} { 5} { 0cm} +\test {-1cm} { 5} {-5mm} +\stopbuffer + +\dorecurse{2}{ + \dorecurse{1}{\getbuffer[a]} + \dorecurse{1}{\getbuffer[b]} + \dorecurse{1}{\getbuffer[c]} + \dorecurse{1}{\getbuffer[d]} +} + +\stopcolumnset + +\stoptext diff --git a/doc/context/sources/general/manuals/details/back-4.tex b/doc/context/sources/general/manuals/details/back-4.tex new file mode 100644 index 000000000..217525ed8 --- /dev/null +++ b/doc/context/sources/general/manuals/details/back-4.tex @@ -0,0 +1,39 @@ +\environment back-0 + +\startuseMPgraphic{mpos:par:color} + for i=1 upto nofmultipars : + fill multipars[i] withcolor + if multikind[i]="single" : "darkgray" ; + elseif multikind[i]="first" : "red" ; + elseif multikind[i]="middle" : "green" ; + elseif multikind[i]="last" : "blue" ; + else : "black" ; + fi ; + endfor ; +\stopuseMPgraphic + +\definecolumnset + [three] + [n=3, + distance=5mm] + +\definetextbackground + [shade] + [location=paragraph, + mp=mpos:par:color, + before=\blank, + after=\blank] + +\starttext + +\startcolumnset[three] + + \dorecurse {20} { + \starttextbackground[shade] + \simulatewords[n=50,m=500,min=1,max=5,color=gray]% + \stoptextbackground + } + +\stopcolumnset + +\stoptext diff --git a/doc/context/sources/general/manuals/details/back-5.tex b/doc/context/sources/general/manuals/details/back-5.tex new file mode 100644 index 000000000..a2d2c4632 --- /dev/null +++ b/doc/context/sources/general/manuals/details/back-5.tex @@ -0,0 +1,64 @@ +\environment back-0 + +\startuseMPgraphic{mpos:par:columnset:shade} + numeric h ; + for i=1 upto nofmultipars : + h := bbheight(p) ; + if multikind[i] = "single" : + fill multipars[i] topenlarged -.5h + withshademethod "linear" + withshadedirection shadedup + withcolor boxfillcolor shadedinto .8white ; + fill multipars[i] bottomenlarged -.5h + withshademethod "linear" + withshadedirection shadedup + withcolor .8white shadedinto boxfillcolor ; + elseif multikind[i] = "first" : + fill multipars[i] + withshademethod "linear" + withshadedirection shadedup + withcolor boxfillcolor shadedinto .8white ; + elseif multikind[i] = "middle" : + fill multipars[i] topenlarged -.5h + withshademethod "linear" + withshadedirection shadedup + withcolor boxfillcolor shadedinto .8white ; + fill multipars[i] bottomenlarged -.5h + withshademethod "linear" + withshadedirection shadedup + withcolor .8white shadedinto boxfillcolor ; + elseif multikind[i] = "last" : + fill multipars[i] + withshademethod "linear" + withshadedirection shadedup + withcolor .8white shadedinto boxfillcolor ; + fi ; + endfor ; +\stopuseMPgraphic + +\definecolumnset + [four] + [n=4, + distance=5mm] + +\definetextbackground + [shade] + [location=paragraph, + backgroundcolor=shadecolor, + mp=mpos:par:columnset:shade, + before=\blank, + after=\blank] + +\starttext + + \startcolumnset[four] + + \dorecurse{15} { + \starttextbackground[shade] + \simulatewords[n=10,m=500,min=1,max=5,color=text]% + \stoptextbackground + } + + \stopcolumnset + +\stoptext diff --git a/doc/context/sources/general/manuals/details/cow.pdf b/doc/context/sources/general/manuals/details/cow.pdf Binary files differnew file mode 100644 index 000000000..9cc8fb0b4 --- /dev/null +++ b/doc/context/sources/general/manuals/details/cow.pdf diff --git a/doc/context/sources/general/manuals/details/details-backpage.tex b/doc/context/sources/general/manuals/details/details-backpage.tex new file mode 100644 index 000000000..85e4d38ce --- /dev/null +++ b/doc/context/sources/general/manuals/details/details-backpage.tex @@ -0,0 +1,34 @@ +% language=uk + +\environment details-environment + +\startcomponent details-backpage + +\page[right] + +\startpagemakeup[doublesided=no,pagestate=stop,page=no] + \startMPcode + StartPage ; + fill Page withcolor \MPcolor{blue} ; % .5blue ; + StopPage ; + \stopMPcode +\stoppagemakeup + +\startpagemakeup[doublesided=no,pagestate=stop,page=no] + \startMPcode + StartPage ; + path p[] ; picture q[] ; + p[1] := Page ; + p[2] := Page xscaled .6 shifted (.2PaperWidth,0) ; + q[1] := textext.raw("\color[white]{CONTEXT}") xsized(.6PaperWidth) ; + q[2] := textext.raw("\color[white]{\currentdate}") xsized(.6PaperWidth) ; + fill p[1] withcolor \MPcolor{red} ; % .5red + fill p[2] withcolor \MPcolor{blue} ; % .5blue + q[2] := q[2] shifted (0,-1.5bbheight(q[2])) ; + draw q[1] shifted (.2PaperWidth,.15PaperHeight) ; + draw q[2] shifted (.2PaperWidth,.15PaperHeight) ; + StopPage ; + \stopMPcode +\stoppagemakeup + +\stopcomponent diff --git a/doc/context/sources/general/manuals/details/details-captiontrickery.tex b/doc/context/sources/general/manuals/details/details-captiontrickery.tex new file mode 100644 index 000000000..ccd163e20 --- /dev/null +++ b/doc/context/sources/general/manuals/details/details-captiontrickery.tex @@ -0,0 +1,290 @@ +% language=uk + +\environment details-environment + +\startcomponent details-captiontrickery + +\startchapter[title={Caption handling}] + +\start + +It's hard to predict what kind of caption placements users want. The amount of +variation if large and thereby any system of specifying them will look complex. +So, examples are the best way to show them. + +\startbuffer +\setupcaption + [figure] + [location=bottom] +\placefigure + [left] + {}{\externalfigure[dummy][lines=2,width=4cm]} +\fakewords{60}{80} \par +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer +% \setupfloats[grid=yes] +% \setupfloats[grid=tolerant] +\setupcaption + [figure] + [location=top] +\placefigure + [left] + {}{\externalfigure[dummy][lines=2,width=4cm]} +\fakewords{60}{80} \par +\stopbuffer + +\typebuffer \getbuffer + +In this document we typeset on a grid. For more complex cases and when a document +is processed without any user intervention, this is often a bad idea because the +snapper can decide to make sure that there is enough space above and below an +element. You can however influence the snapper explicitly: + +\startbuffer +\setupcaption + [figure] + [location=top] +\placefigure + [left,line] + {}{\externalfigure[dummy][lines=2,width=4cm]} +\fakewords{60}{80} \par +\stopbuffer + +\typebuffer \getbuffer + +Normally a side float plus caption has a normalized (strut) depth while also +top skip gets applied. When one of the grid related options \type {height}, \type +{line}, \type {depth}, \type {grid} or \type {halfline} is given the top skip +correction is removed. The \type {grid} option removes the depth too. The \type +{grid} option removes the depth while the \type {height} and \type {depth} +options adds an extra amount of strut depth. The \type {depth} option also adds a +line and \type {halfline} removes a line but adds strut height. Indeed this sounds +complicated so best play with it a bit. + +Keep in mind that the snapper plays safe and therefore tends to add more space when +needed. You can set a grid parameter that controls it: + +\starttyping +\setupfloats[grid=tolerant] +\stoptyping + +Currently this only applies to side floats but in the future we might support it +for regular floats too. + +\startbuffer +\setupcaption + [figure] + [width=4cm,align=flushright,location={left,high}] +\placefigure + [left] + {}{\externalfigure[dummy][lines=2,width=4cm]} +\fakewords{60}{80} \par +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer +\setupcaption + [figure] + [width=4cm,align=flushright,location={high,lefthanging}] +\placefigure + [left] + {}{\externalfigure[dummy][lines=2,width=4cm]} +\fakewords{60}{80} \par +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer +\setupcaption + [figure] + [width=4cm,align=flushleft,location={high,righthanging}] +\placefigure + [right] + {}{\externalfigure[dummy][lines=2,width=4cm]} +\fakewords{60}{80} \par +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer +\setupcaption + [figure] + [width=4cm,align=flushleft,location={high,rightmargin}] +\placefigure + [right] + {}{\externalfigure[dummy][lines=2,width=4cm]} +\fakewords{60}{80} \par +\stopbuffer + +\typebuffer \getbuffer + +The location of a caption is determined by the keywords \type {top}, \type +{bottom} and for the side captions \type {high}, \type {middle}, \type {low}, +either or not in combination with \type {left}, \type {right}, \type +{leftmargin}, \type {rightmargin}, {lefthanging} or \type {righthanging}. + +The next series of examples shows the regular (non||side) floats. + +\startbuffer +\setupcaption + [figure] + [location={high,left}] +\placefigure + {}{\externalfigure[dummy][lines=2,width=4cm]} +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer +\setupcaption + [figure] + [width=4cm,align=flushright,location={high,left}] +\placefigure + {}{\externalfigure[dummy][lines=2,width=4cm]} +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer +\setupcaption + [figure] + [width=4cm,align=flushright,location={middle,left}] +\placefigure + {}{\externalfigure[dummy][lines=2,width=4cm]} +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer +\setupcaption + [figure] + [width=4cm,align=flushright,location={low,left}] +\placefigure + {}{\externalfigure[dummy][lines=2,width=4cm]} +\stopbuffer + +\startbuffer +\setupfloat + [figure] + [location=right] +\setupcaption + [figure] + [width=4cm,align=flushright,location=high] +\placefigure + {}{\externalfigure[dummy][lines=2,width=4cm]} +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer +\setupfloat + [figure] + [location=right] +\setupcaption + [figure] + [width=4cm,align=flushright,location={high,left}] +\placefigure + {}{\externalfigure[dummy][lines=2,width=4cm]} + +\setupfloat + [figure] + [location=left] +\setupcaption + [figure] + [width=4cm,align=flushleft, location={high,left}] +\placefigure + {}{\externalfigure[dummy][lines=2,width=4cm]} +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer +\setupfloat + [figure] + [location=middle] +\setupcaption + [figure] + [width=4cm,align=flushright, location={high,lefthanging}] +\placefigure + {}{\externalfigure[dummy][lines=2,width=4cm]} +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer +\setupfloat + [figure] + [location=middle] +\setupcaption + [figure] + [width=4cm,align=flushleft, location={high,righthanging}] +\placefigure + {}{\externalfigure[dummy][lines=2,width=4cm]} +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer +\setupfloat + [figure] + [location=right] +\setupcaption + [figure] + [width=4cm,align=flushleft, location={high,rightmargin}] +\placefigure + {}{\externalfigure[dummy][lines=2,width=4cm]} +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer +\setupfloat + [figure] + [location=left] +\setupcaption + [figure] + [width=4cm,align=flushright,location={high,leftmargin}] +\placefigure + {}{\externalfigure[dummy][lines=2,width=4cm]} +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer +\setupfloat + [figure] + [location=middle] +\setupcaption + [figure] + [width=4cm,align=flushright,location={high,outermargin}] +\placefigure + {}{\externalfigure[dummy][lines=2,width=4cm]} +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer +\setupfloat + [figure] + [location=middle] +\setupcaption + [figure] + [width=4cm,align=flushleft, location={high,innermargin}] +\placefigure + {}{\externalfigure[dummy][lines=2,width=4cm]} +\stopbuffer + +\typebuffer \getbuffer + +The \type {innermargin} and \type {outermargin} are special cases. They adapt to +the kind of page. + +\page \stop + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/details/details-colofon.tex b/doc/context/sources/general/manuals/details/details-colofon.tex new file mode 100644 index 000000000..1ceda44e7 --- /dev/null +++ b/doc/context/sources/general/manuals/details/details-colofon.tex @@ -0,0 +1,36 @@ +% language=uk + +\environment details-environment + +\startcomponent details-colofon + +\startchapter[title={About this document}] + +This document is typeset in \CONTEXT\ using \LUATEX\ with \METAPOST. We use only +one font: the Computer Modern Typewriter. The verbatim portions of the text are +typeset in its mono spaced variant. One of the reasons that I chose this font is +that we need a mono spaced font to typeset the example code, and the Computer +Modern Typewriter is one the best there is. This font combines well with many +other typefaces, but the sometimes excessive use of different fonts (and sizes) +in the styles that I have to implement made me long for simplicity. And so I +decided to stick to one font. A careful reader will notice that this document has +character protruding enabled (resulting in hanging punctuation). + +We use a couple of colors. Again, I went for simplicity and use rather primary +colors, although I do use them in transparent variants as well. + +There is not much more to say, apart from that I want to thank our customers as +well as \CONTEXT\ users for asking me to implement \DTP\ competing styles and +features. Their demands drive \CONTEXT\ in directions we could not have foreseen +when we started its development. + +We use a (transparent) gray background behind the text so that we have an +indication where the text area is positioned relative to the page. It also +enables us to comfortably turn on the grid. + +Some features shown here are relatively new and therefore they occasionally are +improved. As a result some aspects of their functionality may change. + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/details/details-contents.tex b/doc/context/sources/general/manuals/details/details-contents.tex new file mode 100644 index 000000000..737f080a0 --- /dev/null +++ b/doc/context/sources/general/manuals/details/details-contents.tex @@ -0,0 +1,13 @@ +% language=uk + +\environment details-environment + +\startcomponent details-contents + +\starttitle[title={Table of contents}] + +\placelist[chapter][criterium=text] + +\stoptitle + +\stopcomponent diff --git a/doc/context/sources/general/manuals/details/details-environment.tex b/doc/context/sources/general/manuals/details/details-environment.tex new file mode 100644 index 000000000..003ea6905 --- /dev/null +++ b/doc/context/sources/general/manuals/details/details-environment.tex @@ -0,0 +1,317 @@ +% language=uk + +% this a rather old style and made for mkii, currently the only adaption to mkiv is +% with respect to fonts + +\showgrid + +\startenvironment details-environment + +\usemodule[abr-02,simulate] % visual + +\setupsystem + [random=123] + +\setupinteraction + [state=start, + style=, + color=] + +\setuplist + [chapter] + [interaction=all] + +\setupalign + [verytolerant, + stretch, + hanging] + +\setuptolerance + [verytolerant, + stretch] + +\definefontfeature + [fullprotrusion] + [protrusion=pure] + +\definefontfeature[default][default,fullprotrusion] + +\setupbodyfont[modernvariable,12pt] + +\setuppagenumbering + [alternative=doublesided] + +\setupindenting + [medium] + +\setuptyping + [margin=standard] + +\setuptyping + [color=blue] + +\setuptype + [color=blue] + +\startmode [screen] + \definepapersize[A4-S][width=210mm,height=210mm] + \setuppapersize[A4-S][A4-S] +\stopmode + +\setuplayout + [header=3cm, + footer=0pt, + topspace=0cm, + bottomspace=2cm, + bottom=2cm, + bottomdistance=0pt, + height=middle, + margindistance=.5cm, + leftmargin=2.0cm, + rightmargin=2.5cm, + backspace=2.5cm, + cutspace=3cm, + width=middle, + lines=48, % otherwise background issue +% textdistance=\dimexpr-\topskip+\strutheight+.5cm\relax, + grid=yes] + +\setuplayout + [margindistance=.5cm, + edgedistance=.25cm, + rightmargin=1cm, + rightedge=.75cm, + leftmargin=1cm, + leftedge=.5cm] + +\setuppagenumbering + [location=] + +\definecolor[red] [r=.5] +\definecolor[blue] [b=.5] +\definecolor[green] [g=.5] +\definecolor[yellow] [r=.5,g=.5] +\definecolor[gray] [s=.5] + +\definecolor[tred] [r=.5,t=.5,a=1] +\definecolor[tblue] [b=.5,t=.5,a=1] +\definecolor[tgreen] [g=.5,t=.5,a=1] +\definecolor[tyellow] [r=.5,g=.5,t=.5,a=1] +\definecolor[twhite] [s=0,t=.5,a=1] + +\definecolor[infogray] [g=.5,t=.5,a=1] +\definecolor[infogray] [s=.7,t=.5,a=1] +\definecolor[pagegray] [y=.5,t=.5,a=1] +\definecolor[textgray] [s=.9,t=.5,a=1] +\definecolor[areafill] [g=.5,t=.125,a=1] +\definecolor[areafill] [b=.5,t=.125,a=1] + +\definecolor[fakerulecolor] [green] +\definecolor[fakeparindentcolor][blue] + +\definefont[BigNumber][RegularBold sa 4] % 5 +\definefont[BigText] [RegularBold sa 2] +\definefont[MedNumber][RegularBold sa 2] + +\startbuffer[regular:sizes] +\definefont[regular:1][Regular*default sa 1] +\definefont[regular:2][Regular*default sa 2] +\definefont[regular:3][Regular*default sa 3] +\definefont[regular:4][Regular*default sa 4] +\stopbuffer + +\getbuffer[regular:sizes] + +\useMPlibrary[dum] + +\definecolor[p-red] [r=1] +\definecolor[p-blue] [b=1] +\definecolor[p-yellow] [r=1,g=1] + +\definepalet + [placeholder] + [1=p-red,2=p-blue,3=p-yellow] + +\definelayer + [graphics] + [position=yes] + +\setupbackgrounds + [page] + [background={color,graphics}, + backgroundoffset=1cm, + backgroundcolor=pagegray] + +\definelayer + [extras] + [width=\paperwidth,height=\paperheight] + +\setupbackgrounds + [leftpage] + [background=extras] + +\setupbackgrounds + [rightpage] + [background=extras] + +\definelayer % we need to compensate the backgroundoffset + [text] + [hoffset=1cm, + voffset=1cm] + +\setupbackgrounds + [text] + [background={color,text}, + backgroundoffset=1cm, + backgroundcolor=textgray] + +% chapter head + +\setuphead + [chapter] + [placehead=empty, + header=chapter, + incrementnumber=details, + style=\BigText, + numberstyle=\BigNumber] + +% we need to check each file +% +% \setuphead +% [chapter] +% [beforesection=\page, +% aftersection=\page] + +\definetext + [chapter] + [header] + [\setups{chapter}] + [] + +\definelayer + [chapter] + [width=\dimexpr\makeupwidth+\cutspace\relax, + height=\headerheight] + +\startsetups chapter + \setups[chapter:title] + \setups[chapter:number] + \setups[chapter:finish] +\stopsetups + +% here we can use mp instead but the following is not that bad either + +\startsetups chapter:title + + \setlayerframed + [chapter] + [x=\dimexpr\makeupwidth+\cutspace\relax, + location=lb] + [height=\headerheight, + foregroundcolor=white, + background=color, + backgroundcolor=blue, + frame=off, + offset=none, + align={right,lohi}] + {\hbox spread .5\cutspace + {\hss + \doiftextelse{\placeheadtext[chapter]}% + {\placeheadtext[chapter]}% + {\placeheadtext[title]}% + \hss}\space + \vskip.5cm} + +\stopsetups + +\startsetups chapter:number + + \setlayerframed + [chapter] + [x=\dimexpr\makeupwidth+\cutspace\relax, + y=\vsize, + location=lb] + [width=\dimexpr\cutspace-\rightmargindistance\relax, + height=\dimexpr\cutspace-\rightmargindistance\relax, + foregroundcolor=white, + background=color, + backgroundcolor=red, + frame=off, + offset=none, + align={middle,lohi}] + {\hbox to \hsize + {\hskip.5cm\hss + \doifmode{*bodypart}{\placeheadnumber[chapter]}% + \hss}} + +\stopsetups + +\startsetups chapter:finish + + \framed + [width=\makeupwidth, + height=\headerheight, + background=chapter, + frame=off] + {} + +\stopsetups + +% page number + +\defineframedtext + [pagenumbertext] + [align={lohi,middle}, + width=\dimexpr\cutspace-\margindistance\relax, % \hsize, + height=\vsize, + background=color, + backgroundcolor=green, + style=\MedNumber, + color=white, + offset=none, + frame=off] + +\setupbottomtexts + [margin] + [] + [\pagenumbertext{\hbox to \hsize{\hskip.5cm\hss\placepagenumber\hss}}] + [\pagenumbertext{\hbox to \hsize{\hss\placepagenumber\hss\hskip.5cm}}] + [] + +% area + +\setupbackgrounds [text] [leftedge] [backgroundoffset=0pt,backgroundcolor=areafill] +\setupbackgrounds [text] [rightedge] [backgroundoffset=0pt,backgroundcolor=areafill] +\setupbackgrounds [text] [leftmargin] [backgroundoffset=0pt,backgroundcolor=areafill] +\setupbackgrounds [text] [rightmargin] [backgroundoffset=0pt,backgroundcolor=areafill] + +% grids + +\setuptextbackground + [grid] + [state=start] + +% intros + +% \definetextbackground +% [intro] +% [backgroundcolor=infogray, % green, +% backgroundoffset=.25cm, +% offset=.5cm, +% frame=off, +% color=white] + +\setuplist + [chapter] + [before=, + after=, + alternative=c, + aligntitle=yes] + +\startsectionblockenvironment [backpart] + + \writebetweenlist[chapter]{\blank} + +\stopsectionblockenvironment + +\stopenvironment diff --git a/doc/context/sources/general/manuals/details/details-finetuningfloats.tex b/doc/context/sources/general/manuals/details/details-finetuningfloats.tex new file mode 100644 index 000000000..71e0772d1 --- /dev/null +++ b/doc/context/sources/general/manuals/details/details-finetuningfloats.tex @@ -0,0 +1,657 @@ +% language=uk + +% todo: \setlayeranchored[text-1]{HELLO WORLD} + +\environment details-environment + +\startcomponent details-finetuningfloats + +\startchapter[title={Finetuning graphics}] + +In this chapter we will discuss a few more tricks to control float placement. +This control is needed if you want to typeset documents in a semi desk top +publishing way. + +When you combine technical graphics, you may wish to align the content optically. +This can be done with the \type {offset} command. We will demonstrate this with a +couple of \METAPOST\ graphics: + +\startbuffer +\startreusableMPgraphic{alpha} + fill fullsquare xyscaled( 2cm, 2cm) withcolor \MPcolor{red} ; + fill unitsquare xyscaled(+.5cm,+.5cm) withcolor \MPcolor{gray} ; +\stopreusableMPgraphic + +\startreusableMPgraphic{beta} + fill fullsquare xyscaled( 2cm, 2cm) withcolor \MPcolor{red} ; + fill unitsquare xyscaled(+.5cm,-.5cm) withcolor \MPcolor{gray} ; +\stopreusableMPgraphic + +\startreusableMPgraphic{gamma} + fill fullsquare xyscaled( 2cm, 2cm) withcolor \MPcolor{red} ; + fill unitsquare xyscaled(-.5cm,-.5cm) withcolor \MPcolor{gray} ; +\stopreusableMPgraphic + +\startuseMPgraphic{delta} + fill fullsquare xyscaled( 2cm, 2cm) withcolor \MPcolor{red} ; + fill unitsquare xyscaled(-.5cm,+.5cm) withcolor \MPcolor{gray} ; +\stopuseMPgraphic +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer +\startcombination[2*2] + {\reuseMPgraphic{alpha}} {alpha} + {\reuseMPgraphic {beta}} {beta} + {\reuseMPgraphic{gamma}} {gamma} + {\reuseMPgraphic{delta}} {delta} +\stopcombination +\stopbuffer + +\typebuffer + +In \in {figure} [fig:offset-1] we place these graphics in a \type {2*2} grid. As +you can see, the centers don't align well. + +\placefigure[here][fig:offset-1]{}{\getbuffer} + +In \in {figure} [fig:offset-2] the centers of the graphic align well. This is +accomplished by adding some space around the graphics. + +\startbuffer +\startcombination[2*2] + {\ruledhbox{\offset[rightoffset=1cm] {\reuseMPgraphic{alpha}}}} {alpha} + {\ruledhbox{\offset[bottomoffset=.5cm]{\reuseMPgraphic {beta}}}} {beta} + {\ruledhbox{\offset[bottomoffset=.5cm]{\reuseMPgraphic{gamma}}}} {gamma} + {\ruledhbox{\offset[leftoffset=1cm] {\reuseMPgraphic{delta}}}} {delta} +\stopcombination +\stopbuffer + +\placefigure[here][fig:offset-2]{}{\getbuffer} + +\starttyping +\startcombination[2*2] + {\offset[rightoffset=1cm] {\reuseMPgraphic{alpha}}} {alpha} + {\offset[bottomoffset=.5cm]{\reuseMPgraphic {beta}}} {beta} + {\offset[bottomoffset=.5cm]{\reuseMPgraphic{gamma}}} {gamma} + {\offset[leftoffset=1cm] {\reuseMPgraphic{delta}}} {delta} +\stopcombination +\stoptyping + +If we align the centers vertically, as demonstrated in \in {figure} +[fig:offset-2] we can stick to a few bottom offsets. + +\starttyping +\startcombination[4*1] + {\reuseMPgraphic{alpha}} {alpha} + {\offset[bottomoffset=.5cm]{\reuseMPgraphic {beta}}} {beta} + {\offset[bottomoffset=.5cm]{\reuseMPgraphic{gamma}}} {gamma} + {\reuseMPgraphic{delta}} {delta} +\stopcombination +\stoptyping + +\startbuffer +\startcombination[4*1] + {\ruledhbox {\reuseMPgraphic{alpha}}} {alpha} + {\ruledhbox{\offset[bottomoffset=.5cm]{\reuseMPgraphic {beta}}}} {beta} + {\ruledhbox{\offset[bottomoffset=.5cm]{\reuseMPgraphic{gamma}}}} {gamma} + {\ruledhbox {\reuseMPgraphic{delta}}} {delta} +\stopcombination +\stopbuffer + +\placefigure[here][fig:offset-3]{}{\getbuffer} + +These examples demonstrate that the dimensions change with the offset. You can +retain the dimensions but still align them by using the \type {x} and \type {y} +parameter. This kind of manipulations will often result in a ugly spacing because +the placement macros handle on the original dimensions. \in {Figure} +[fig:offset-4] demonstrates this. + +\starttyping +\startcombination[4*1] + {\reuseMPgraphic{alpha}} {alpha} + {\offset[y=-.5cm]{\reuseMPgraphic {beta}}} {beta} + {\offset[y=-.5cm]{\reuseMPgraphic{gamma}}} {gamma} + {\reuseMPgraphic{delta}} {delta} +\stopcombination +\stoptyping + +\startbuffer +\startcombination[4*1] + {\ruledhbox {\reuseMPgraphic{alpha}}} {alpha} + {\ruledhbox{\offset[y=-.5cm]{\reuseMPgraphic {beta}}}} {beta} + {\ruledhbox{\offset[y=-.5cm]{\reuseMPgraphic{gamma}}}} {gamma} + {\ruledhbox {\reuseMPgraphic{delta}}} {delta} +\stopcombination +\stopbuffer + +\placefigure[here][fig:offset-4]{}{\getbuffer} + +In the previous chapter we demonstrated how a side float can be moved up or down +by providing a placement directive or by preceding the placement with \type +{\movesidefloat}. Such a move can be used to align a graphic with particular line +of text. This command can also be used for alignment purposes similar to the +\type {\offset} command. We will demonstrate this with the following graphics. + +\startbuffer +\startreusableMPgraphic{gnu} + fill fullsquare xyscaled( 4cm, 1cm) withcolor \MPcolor{red} ; + fill unitsquare xyscaled(-1cm,.5cm) + shifted (0,-.25cm) withcolor \MPcolor{gray} ; +\stopreusableMPgraphic + +\startreusableMPgraphic{gnat} + fill fullsquare xyscaled( 4cm, 1cm) withcolor \MPcolor{red} ; + fill unitsquare xyscaled(+1cm,.5cm) + shifted (0,-.25cm) withcolor \MPcolor{gray} ; +\stopreusableMPgraphic +\stopbuffer + +\typebuffer \getbuffer + +In the next two examples we shift the \type {gnu} and \type {gnat} graphics +horizontally in order to get them aligned. The move does not change the +dimensions of the float, but they do influence the paragraph shape. + +\startbuffer[a] +\movesidefloat [x=.5cm] +\placefigure [left,none] {} {\reuseMPgraphic{gnu}} +\stopbuffer + +\startbuffer[b] +\movesidefloat [x=-.5cm] +\placefigure [left,none] {} {\reuseMPgraphic{gnat}} +\stopbuffer + +\typebuffer[a,b] + +\getbuffer[a] \fakewords{50}{100} +\getbuffer[b] \fakewords{50}{100} + +\blank + +It is possible to shift vertically by setting \type {y}, but this is often a bad +idea and definitely may spoil alignment of graphics to the grid. If you have to +revert to this trick, you are probably working in document screw||up mode. This +is why in grid mode, we automatically round to an equal number of lines. + +If you know what text you're dealing with and also can be sure about the height +of a graphic, you can trick \CONTEXT\ to ignore the dimensions of a graphic. Here +we use the graphic: + +\startbuffer +\startreusableMPgraphic{gnome} + fill fullsquare xyscaled(2cm, 1cm) withcolor \MPcolor{red} ; + fill fullsquare xyscaled(1cm,.5cm) withcolor \MPcolor{gray} ; +\stopreusableMPgraphic +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer +\placefigure[leftmargin,none,reset]{}{\reuseMPgraphic{gnome}} +\stopbuffer + +\typebuffer \getbuffer + +The graphic is moved into the margin (\type {leftmargin}), has no caption (\type +{none}), and all kind of tricky housekeeping is reset (\type {reset}). + +\startbuffer +\placefigure[left,none,high,low]{}{\reuseMPgraphic{gnome}} +\stopbuffer + +\getbuffer + +Now the next graphic is not influenced by the previous one, so we can place them +close to each other. Use these tricks with care, especially if your document +source is reused and the typeset products are not carefully checked. + +\typebuffer + +When \CONTEXT\ tries to determine if a float fits, it makes a couple of +assumptions, for instance that the available room equals the text height minus +the height of the text so far. You can slightly influence the way these values +are interpreted by setting the calculation method. You can set the methods as +follows: + +\starttyping +\setupfloats[textmethod=0,sidemethod=1] +\stoptyping + +Method~0 just looks at the raw dimensions, while method~1 lessens the maximum +text height by one percent, thereby playing safe. Method~2 takes a window of +1~point. This may lead to better decisions since we may run into rounding errors +of several scaled points (which is small but troublesome). Method~2 is well +suited when typesetting on a grid, because there everything has to fit in a +rounded number of lines, which leaves no room for rounding errors. + +\starttabulate[||c|c|] +\NC \bf grid mode \NC \bf yes \NC \bf no \NC \NR +\NC \type{sidemethod} \NC \type{2} \NC \type{1} \NC \NR +\NC \type{textmethod} \NC \type{2} \NC \type{0} \NC \NR +\stoptabulate + +\startusableMPgraphic{demo-1}{color} + path p ; + p := fullsquare xyscaled (3cm,2LineHeight) ; + fill p withcolor \MPvar{color} ; +\stopusableMPgraphic + +\startusableMPgraphic{demo-2}{color,morecolor} + path p ; p := fullsquare xyscaled (6cm,4LineHeight) ; + path q ; q := fullsquare xyscaled (3cm,2LineHeight) ; + fill p withcolor \MPvar{color} ; + setbounds currentpicture to q ; + fill q withcolor \MPcolor{morecolor} ; +\stopusableMPgraphic + +As you may know by now, we can use the directives \type {high}, \type {low}, +\type {height}, \type {depth} and \type {line} to influence the spacing around a +side float. A real tight spacing can be achieved with \type {fit}. + +\starttyping +\placefigure[left,fit,none]{}{some graphic} +\stoptyping + +\placefigure[left,fit,none]{}{\useMPgraphic{demo-1}{color=red}} + +This kind of placements only make sense in special situations, because normally +you don't want the graphic to touch the text. + +If you think that this is all a user may want, you're wrong. It is not imaginary +that graphics have small pieces sticking out and|/|or lots of white space as part +of their design. In that case, the bounding box can be set to a smaller size. + +\placefigure + [left,fit,none] + {} + {\setlayer + [graphics] + {\useMPgraphic{demo-2}{color=red,morecolor=tgreen}}} + +Now, when handling a side float, \CONTEXT\ first places the float, and then +starts with typesetting the paragraph, cleverly avoiding the graphic. However, +when the graphic is virtually larger than its known size, it may cover part of +the preceding paragraph. + +How come that the graphic starting this paragraph does not do that? It is because +we explicitly moved it to the background. This involves some preparation. At the +document level, we define a layer called \type {graphic}. + +\starttyping +\definelayer[graphics][position=yes] +\stoptyping + +The position directive tells \CONTEXT\ that it should honour the position of the +graphic. Next we must make sure that this layer is placed. + +\starttyping +\setupbackgounds[page][background=graphics] +\stoptyping + +Now we're ready to move graphics to this layer: + +\starttyping +\placefigure + [left,fit,none] + {}{\setlayer[graphics]{graphic}} +\stoptyping + +It's now a small step to more advanced movements. Say that you want to move the +graphic a little bit to the left. In that case you can tell the layer placement +to do so. + +\starttyping +\placefigure + [left,fit,none]{}{\setlayer[graphics][hoffset=-12pt]{graphic}} +\stoptyping + +From this you can deduce that there is also a movement in the vertical direction +using \type {voffset}. In addition you can anchor the graphic using the \type +{location} parameter and provide offsets. + +\placefigure + [left,fit,none] + {} + {\setlayer + [graphics][hoffset=-12pt] + {\useMPgraphic{demo-2}{color=red,morecolor=tgreen}}} + +As soon as you run into situations where float placement is to be consistently +enforced, you will feel the need for dedicate placement macros. For example: + +\startbuffer +\definefloat + [somefloat] + [figure] + +\setupfloat + [somefloat] + [sidespaceafter=, + sidespacebefore=, + default={left,none}] +\stopbuffer + +\typebuffer \getbuffer + +Instead of resetting the side spacing, we could have default to \type {high,low}, +but this way we can overload the default placement and still get zero spacing. + +Throughout this manual we discuss features related to overlays and layers. These +permit you to move content around in ways that either or not depend on the text +flow. We have now come to another trick based on these mechanisms: bleeding. + +When printing a document, you need to take into account that when graphics go +beyond the page boundary, you need to compensate for inaccuracies in cutting the +pages. Such graphics are called bleeding graphics and the amount of bleed is +often a few millimeters. + +The best way to handle such graphics is to use the correct dimensions and play +with the edge widths and distances in combination with backspace and cut space. In +a properly set up layout and by using a well designed set of predefined graphic +placements, you can handle this quite well. A bleeding figure can be defined as +follows: + +\startbuffer +\definefloat + [edgefigure] + [figure] + +\setupfloat + [edgefigure] + [default={inner,height,high,low,none}, + maxwidth=4cm] + +\defineexternalfigure + [edgefigure] + [width=\dimexpr\backspace+4cm-1mm\relax, + lines=4] +\stopbuffer + +\typebuffer \getbuffer + +The default placement is pre|-|configured to have no additional vertical space and +align on the height of a line (this is default behaviour so the \type {height} +key is redundant here. The 1mm in the previous definition simulates what happens +when a page is cut off slightly wrong: we get an annoying gap. + +\startbuffer[a] +\placeedgefigure + {} + {\externalfigure[hacker][edgefigure]} +\stopbuffer + +\typebuffer[a] \getbuffer[a] \fakewords{50}{100} + +One of the nice things about \TEX\ is that you can fine tune dimensions pretty +well. So, instead of the previous placement, which turns out rather ugly, we can +come up with a better one: + +\startbuffer +\setupfloat + [edgefigure] + [default={inner,height,high,low,none}, + maxwidth=4cm, + margin=\strutdepth] + +\defineexternalfigure + [edgefigure] + [width=\dimexpr\backspace+4cm+2mm\relax, + height=\dimexpr3\lineheight+\strutheight\relax] +\stopbuffer + +\typebuffer \getbuffer + +This time we take no risk and add 2mm to the dimensions so that we can be sure +that the edge of the graphic falls outside the page boundary. + +\getbuffer[a] \fakewords{50}{100} + +The \CONTEXT\ resourse library modules provide means to report back the +dimensions of graphics used in a document, so that you can develop (tune) them +with the proper dimensions. In practice a slightly wider than normal graphic +(scaling it horizontally a few millimeters more) does not harm the visual +appearance that much, so adapting a graphic to this kind of bleeding is not +really needed. + +In addition to this (rather natural) way of adding bleed to a graphic, you can +apply the \type {\bleed} macro. In the previously discussed method the figure +placement mechanisms work with the real dimensions. The \type {bleed} macro is +using scaling in a different way: from the perspective of \CONTEXT\ the graphic +remains its original dimensions and the figure placement mechanisms will act +accordingly. We will give a couple of examples of using this macro. + +Permitted bleeding locations are \type {l}, \type {r}, \type {t}, \type {b}, +\type {lr}, \type {bl}, \type {br}, \type {tl} and \type {tr}. + +\startbuffer +\placesomefloat + [left,none,fit] + {} + {\setupbleeding[offset=5mm]% + \bleed[width=5cm,height=1cm,location=l] + {\externalfigure[mill][bleed]}} +\stopbuffer + +\typebuffer \getbuffer \fakewords{50}{100} + +\startbuffer +\placesomefloat + [left,none,fit] + {} + {\setupbleeding[offset=2mm]% + \bleed[width=5cm,height=1cm,location=l] + {\externalfigure[mill][bleed]}} +\stopbuffer + +\typebuffer \getbuffer \fakewords{50}{100} + +The amount of bleeding depends on the postprocessing. In the previous paragraph +we used a bleed offset of 5mm, and here we used 2mm. Because the graphic is +scaled in order to match the bleed, it will be slightly distorted. With small +values this will go unnoticed. You can set the offset with: + +\starttyping +\setupbleeding[offset=5mm] +\stoptyping + +Bleeding itself is accomplished by the \type {\bleed} macro as in: + +\starttyping +\bleed + [width=5cm,height=1cm,location=l] + {\externalfigure[mill][width=\bleedwidth,height=\bleedheight]} +\stoptyping + +It is kind of awkward to pass those two dimensions so here is a shorter way of +doing the same: + +\starttyping +\bleed + [width=5cm,height=1cm,location=l] + {\externalfigure[mill][bleed]} +\stoptyping + +In fact, this uses the following definition: + +\starttyping +\defineexternalfigure[bleed][width=\bleedwidth,height=\bleedheight] +\stoptyping + +You can influence the scaling of a graphic by setting the \type {stretch} +parameters. The location parameter determines the direction of the stretch: \type +{l}~(left), \type {r}~(right), \type {t}~(top), \type {b}~(bottom) or a +combination of these. We will now combine the previous example code with this +knowledge. + +\startbuffer +\placefigure + [left] + {} + {\bleed + [stretch=no,voffset=0pt,hoffset=1cm] + {\externalfigure[detcow][bleed]}} +\stopbuffer + +\typebuffer \getbuffer \fakewords {100} {150} + +\startbuffer +\placefigure + [left] + {} + {\bleed + [width=5cm,height=3cm,location=l] + {\externalfigure[detcow][bleed]}} +\stopbuffer + +\typebuffer \getbuffer \fakewords {100} {150} + +\startbuffer +\placefigure + [right] + {} + {\bleed + [width=5cm,height=3cm,location=r] + {\externalfigure[detcow][bleed]}} +\stopbuffer + +\typebuffer \getbuffer \fakewords {100} {150} + +You can combine this feature with layers. We will now show a few applications +which may look like magic at first glance, but will become natural to your +repertoire once you have played with them. + +The next example moves the graphic to a layer associated with the (current) page. + +\startbuffer +\placefigure + [right,none] + {} + {\setlayer + [graphics] + {\bleed + [width=5cm,height=3cm,location=rb] + {\externalfigure[detcow][bleed]}}} +\stopbuffer + +\typebuffer \getbuffer \fakewords {100} {150} + +You can also predefine locations where graphics (or other content) needs to be +anchored. A direct call to anchor looks as follows: + +\starttyping +\placefigure + [left,none] + {} + {\anchor + [text-1] + [location=lt,hoffset=max,voffset=max] + [width=3cm,height=3cm,frame=on]% + {\externalfigure[detcow][width=5cm,frame=on]}} +\stoptyping + +This will anchor a graphic in one of the text layers, but at the cost of +specifying this in the document source. One way around this is to predefine +anchors. + +\startbuffer +\defineanchor[rightbottom][text-1][location=lt,hoffset=max,voffset=max] +\defineanchor[righttop] [text-1][location=lb,hoffset=max] +\defineanchor[leftbottom] [text-1][location=rt,voffset=max] +\defineanchor[lefttop] [text-1][location=rb] +\stopbuffer + +\startbuffer +\defineanchor[rightbottom][text-1][preset=rightbottom] +\defineanchor[righttop] [text-1][preset=righttop] +\defineanchor[leftbottom] [text-1][preset=leftbottom] +\defineanchor[lefttop] [text-1][preset=lefttop] +\stopbuffer + +\typebuffer \getbuffer + +We will apply this to a predefined float type. + +\startbuffer +\definefloat[myfigure][figure] +\setupfloat[myfigure][sidespaceafter=,sidespacebefore=] +\stopbuffer + +\typebuffer \getbuffer + +Our previous example can now be reduced to: + +\startbuffer +\placemyfigure + [left,none] + {} + {\anchor[rightbottom] + {\externalfigure[detcow][width=5cm,frame=on]}} +\stopbuffer + +\typebuffer \getbuffer \fakewords {100} {150} + +You can still specify dimensions and anchors can be combined with bleeding. Of +course this kind of mixed usage means that you need to have some feeling for what +these mechanisms do. + +\startbuffer +\placemyfigure + [left,none] + {} + {\anchor + [rightbottom] + [width=5cm,height=3cm,frame=on] + {\bleed + [width=5cm,height=3cm,location=l] + {\externalfigure[detcow][bleed]}}} +\stopbuffer + +\typebuffer \getbuffer \fakewords {100} {150} + +\startbuffer +\placemyfigure + [right,none] + {} + {\anchor + [rightbottom] + [width=5cm,height=3cm,frame=on] + {\bleed + [width=5cm,height=3cm,location=r] + {\externalfigure[detcow][bleed]}}} +\stopbuffer + +\typebuffer \getbuffer \fakewords {100} {150} + +\startbuffer +\placemyfigure + [left,none] + {} + {\anchor + [lefttop] + [width=3cm,height=3cm,frame=on] + {\externalfigure[detcow][width=5cm,frame=on]}} +\stopbuffer + +\typebuffer \getbuffer \fakewords {100} {150} + +\startbuffer +\placemyfigure + [left,none] + {} + {\anchor + [lefttop] + [width=3cm,height=3cm,frame=on] + [offset=.5cm] + {\externalfigure[detcow][width=5cm,frame=on]}} +\stopbuffer + +\typebuffer \getbuffer \fakewords {100} {150} + +\blank {\em Todo: parameter specifications of all those macros.} + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/details/details-floatingaround.tex b/doc/context/sources/general/manuals/details/details-floatingaround.tex new file mode 100644 index 000000000..91d853098 --- /dev/null +++ b/doc/context/sources/general/manuals/details/details-floatingaround.tex @@ -0,0 +1,1485 @@ +% language=uk + +\environment details-environment + +\startcomponent details-floatingaround + +\startchapter[title={Floating around}] + +\index {floats} + +Graphics, tables and alike are often treated as floating bodies. This means that +when such a body does not fit on the current page, it will be moved to the next +one. In the examples we will use figures, but much of what we demonstrate here +applies to all floats. + +A side float is a float which placement one way or another depends on the text +that follows it. In its simplest form, the text flows around it, for instance in: + +\startbuffer +\placefigure[left,none]{caption}{\framed[height=1cm]{graphic}} +\stopbuffer + +\typebuffer + +The first keyword of such a call is treated as a placement directive, so this +figure will be placed left. The \type {none} directive nils the caption. + +\getbuffer \fakewords{60}{80} + +When the figure does not fit on the page, a page break is issued. A figure can +span multiple paragraphs. When a next graphic is placed the previous figure will +be padded if needed. First an example of multiple paragraphs. + +\getbuffer \fakewords{30}{40} \par \fakewords{30}{40} + +Multiple floats in a row will lead to padding. The amount of padding is a +combination of empty lines and the normal white space following the float. The +visual quality of the result depends on the graphic itself. + +\start \tracesidefloatstrue + +\getbuffer \fakewords{30}{40} + +\getbuffer \fakewords{30}{40} \fakewords{30}{40} + +\stop + +Here we show the baseline of the first paragraph after the float as well as the +filler. The whitespace around a graphic also depends on the inter|-|paragraph +whitespace. As with many automated mechanisms, compromises are made. A one point +smaller figure may result in an extra empty line. + +Later we will demonstrate a lot of tuning options, but first we give a few more +examples. Most of the tuning options can be driven by keywords as well as +(global) settings. + +\startbuffer +\placefigure + [left,nonumber] + {caption} {\framed[height=1cm]{graphic}} +\stopbuffer + +\typebuffer + +The \type {nonumber} keyword suppresses the label and figure number. You can do +this for all figures with + +\starttyping +\setupcaption[figure][number=no] +\stoptyping + +The previous placement command results in the following side float. + +\getbuffer \fakewords{80}{100} + +Another handy keyword is \type {none}. + +\startbuffer +\placefigure + [left,none]{quoting knuth} + {\framed[height=1cm]{graphic}} +\stopbuffer + +\typebuffer \getbuffer \fakewords{80}{100} + +Control over spacing is exercised by means of the keywords \type {high}, \type +{low} and \type {fit}. + +\startbuffer +\placefigure + [left,none,high]{} + {\framed[height=1cm]{graphic}} +\stopbuffer + +\typebuffer \getbuffer \fakewords{80}{100} + +\startbuffer +\placefigure + [left,none,high,low]{} + {\framed[height=1cm]{graphic}} +\stopbuffer + +\typebuffer \getbuffer \fakewords{80}{100} + +\startbuffer +\placefigure + [left,none,fit]{} + {\framed[height=1cm]{graphic}} +\stopbuffer + +\typebuffer \getbuffer \fakewords{80}{100} + +In the examples so far, we saw additional spacing around the graphic. We will now +(for a while) disable the surrounding whitespace. + +\startbuffer +\setupfloat + [figure] + [sidespacebefore=none, + sidespaceafter=none] +\stopbuffer + +\typebuffer + +With these settings a simple left placement looks as follows. The top of the side +float aligns with the maximum height of a line. + +\start \getbuffer \tracesidefloatstrue + +\startbuffer +\placefigure + [left,none] + {} {\framed[height=1cm]{graphic}} +\stopbuffer + +\typebuffer \getbuffer \fakewords{30}{40} \par \stop + +You can change the alignment by setting the \type {sidealign} variable, for +instance: + +\starttyping +\setupfloat + [figure] + [sidealign=line] +\stoptyping + +The three keywords \type {height}, \type {line} and \type {depth} can also be +passed directly: + +\startbuffer +\placefigure + [left,none,height]{} + {\framed[height=1cm]{graphic}} +\stopbuffer + +\typebuffer + +The three alignments disable the spacing before the float and show up as follows. + +\bgroup \tracesidefloatstrue \getbuffer \fakewords{30}{40} \par \egroup + +\startbuffer +\placefigure + [left,none,line]{} + {\framed[height=1cm]{graphic}} +\stopbuffer + +\bgroup \tracesidefloatstrue \getbuffer \fakewords{30}{40} \par \egroup + +\startbuffer +\placefigure + [left,none,depth]{} + {\framed[height=1cm]{graphic}} +\stopbuffer + +\bgroup \tracesidefloatstrue \getbuffer \fakewords{30}{40} \par \egroup + +So far the floats took up space in the main text body area. In addition to the +\type {left} (or \type {right}) directive we can use \type {inner} or \type +{outer} to force left or right placement depending in the spread. + +Instead of spoiling paper in the text areas, we can use the margin and edges: +\type {leftmargin} and \type {leftedge}, \type {rightmargin} and \type +{rightedge}, but also \type {innermargin} and \type {outermargin}, \type +{inneredge} and \type {outeredge}. + +The next couple of pages we will highlight the margins and edges so that we can +see what happens. + +\setupbackgrounds [text] [leftedge] [background=color] +\setupbackgrounds [text] [rightedge] [background=color] +\setupbackgrounds [text] [leftmargin] [background=color] +\setupbackgrounds [text] [rightmargin] [background=color] + +\startbuffer +\placefigure + [leftmargin,none] + {} {\framed{!}} +\stopbuffer + +\typebuffer \getbuffer \fakewords{30}{40} + +\startbuffer +\placefigure + [leftmargin,none] + {} {\framed[width=1cm]{!}} +\stopbuffer + +\typebuffer \getbuffer \fakewords{30}{40} + +\startbuffer +\placefigure + [leftmargin,none] + {} {\framed[width=1.5cm]{!}} +\stopbuffer + +\typebuffer \getbuffer \fakewords{30}{40} + +The placement directives can be combined with setting distance and width +parameters, thereby not only opening a world of possibilities, but also creating +confusion. Therefore, we will illustrate these features by cloning floats. + +\startbuffer +\definefloat + [marginfigure] + [figure] + +\setupfloat + [marginfigure] + [leftmargindistance=-\leftmargintotal, + default={left,none,low}] +\stopbuffer + +\typebuffer \getbuffer + +The definition command clones figure into a new class of figures. There are two +ways to use such a float : + +\starttyping +\placefloat + [marginfigure] + {} {\framed[width=1.5cm]{!}} +\stoptyping + +or directly: + +\startbuffer +\placemarginfigure + {} {\framed[width=1.5cm]{!}} +\stopbuffer + +\typebuffer + +Both placement calls will result in a figure sticking into the margin. + +\getbuffer \fakewords{30}{40} + +By manipulating the margin distance, you can align graphics to vertical grid +lines, like the edge: + +\startbuffer +\definefloat + [edgefigure] + [figure] + +\setupfloat + [edgefigure] + [leftmargindistance=-\innercombitotal, + default={left,none,low,high}] +\stopbuffer + +\typebuffer \getbuffer + +The \type {\innercombitotal} is one of the many available dimensions. This +measure is the combined width of the margin and edge. + +\startbuffer +\placeedgefigure + {} {\framed[width=1.5cm]{!}} +\stopbuffer + +\typebuffer \getbuffer \fakewords{30}{40} + +\startbuffer +\placeedgefigure + {} {\framed[width=\innercombitotal]{!}} +\stopbuffer + +\typebuffer \getbuffer \fakewords{30}{40} + +You need to be aware of the fact that the margins and edges are not related to +the backspace and cut space settings. When you set up a layout, you need to think +of the right page as starting point. In a double sided layout, the margins are +swapped in the page composition stage. Unless you explicitly go to a left or +right page, you don't know if your left margin will be swapped or not. + +For this reason \CONTEXT\ provides the inner and outer margin|/|edge dimensions. +These are automatically synchronized when the float is constructed. So, if you +want to automatically adapt the float placement and width to the current left +margin in a double sided document, you can use the inner dimensions. + +\starttabulate[||||] +\NC dimension \NC left page + \NC right page \NC\NR +\NC \type{\outermarginwidth} \NC \type{\leftmarginwidth} + \NC \type{\rightmarginwidth} \NC\NR +\NC \type{\innermarginwidth} \NC \type{\rightmarginwidth} + \NC \type{\leftmarginwidth} \NC\NR +\NC \type{\outermargindistance}\NC \type{\leftmargindistance} + \NC \type{\rightmargindistance}\NC\NR +\NC \type{\innermargindistance}\NC \type{\rightmargindistance} + \NC \type{\leftmargindistance} \NC\NR +\stoptabulate + +Similar dimensions are available for the edges. You can save yourself some +calculations by using the following dimensions: + +\starttabulate[|||||] +\NC \type{\leftmargintotal} \NC left margin width \NC + \NC left margin distance \NC\NR +\NC \type{\rightmargintotal} \NC right margin width \NC + \NC right margin distance \NC\NR +\NC \type{\innermargintotal} \NC inner margin width \NC + \NC inner margin distance \NC\NR +\NC \type{\outermargintotal} \NC outer margin width \NC + \NC outer margin distance \NC\NR +\stoptabulate + +As you may expect, the edge totals are available as well, which leave a few more +totals, namely the combinations of margin and edge. + +\starttabulate[|||] +\NC \type{\leftsidetotal} \NC left margin width \NC + \NC left edge total \NC\NR +\NC \type{\rightsidetotal} \NC right margin width \NC + \NC right edge total \NC\NR +\TB +\NC \type{\innersidetotal} \NC inner margin width \NC + \NC inner edge total \NC\NR +\NC \type{\outersidetotal} \NC outer margin width \NC + \NC outer edge total \NC\NR +\TB +\NC \type{\leftcombitotal} \NC left margin total \NC + \NC left edge total \NC\NR +\NC \type{\rightcombitotal} \NC right margin total \NC + \NC right edge total \NC\NR +\TB +\NC \type{\innercombitotal} \NC inner margin total \NC + \NC inner edge total \NC\NR +\NC \type{\outercombitotal} \NC outer margin total \NC + \NC outer edge total \NC\NR +\stoptabulate + +Adaptive back- and cutspace dimensions are also available: + +\starttabulate[|||||] +\NC \type{\innerspacewidth} \NC adaptive backspace \NC\NR +\NC \type{\outerspacewidth} \NC adaptive cutspace \NC\NR +\stoptabulate + +There is one drawback in using the inner and outer dimensions: if you also change +the height of the float dynamically, you may end up in a kind of loop because a +page break may occur at a non||expected place. + +While negative values move float into the margin, positive values will move the +float into the text. It will be of no surprise that you can also set the right +margin distance. Keep in mind that this distance is not related to the text +margin, but to the float margin. + +\startbuffer +\setupfloat + [edgefigure] + [leftmargindistance=-\outercombitotal, + rightmargindistance=-\outercombitotal, + default={outer,none,low,high}] +\stopbuffer + +\typebuffer \getbuffer + +The locations \type {inner} and \type {outer} change with the left or right page. + +\startbuffer +\placeedgefigure + {} {\framed[width=\outercombitotal]{!}} +\stopbuffer + +\typebuffer \getbuffer \fakewords{30}{40} + +\startbuffer +\placeedgefigure + {} {\framed[width=8cm]{!}} +\stopbuffer + +\typebuffer \getbuffer \fakewords{30}{40} + +As a result of manipulating the floats margin settings, the side floats can start +in the margin (or edge). You should not confuse this with margin floats, i.e.\ +side floats that are explicitly placed in the margins. + +\startbuffer +\placefigure[leftmargin,none] + {} {\framed{!}} +\stopbuffer + +\typebuffer \getbuffer \fakewords{30}{40} + +\startbuffer +\placefigure[leftmargin,none] + {} {\framed[width=.5cm]{!}} +\stopbuffer + +\typebuffer \getbuffer \fakewords{30}{40} + +\startbuffer +\placefigure[leftmargin,none] + {} {\framed[width=1.5cm]{!}} +\stopbuffer + +\typebuffer \getbuffer \fakewords{30}{40} + +\startbuffer +\placefigure[leftmargin,none] + {} {\framed[width=5cm]{!}} +\stopbuffer + +\typebuffer \getbuffer \fakewords{30}{40} + +The margin side floats align to the margin and the edge floats to the edge. This +way you can create bleeding figures. + +\startbuffer +\placefigure[leftedge,none] + {} {\framed{!}} +\stopbuffer + +\typebuffer \getbuffer \fakewords{30}{40} + +There are situations where you don't know the dimensions in advance. In order to +prevent unwanted side effects, for instance part of a graphic disappearing +outside the page boundary, \CONTEXT\ provides a few options. The most crude one +is setting the \type {criterium}, as in: + +\starttyping +\setupfloat + [figure] + [criterium=.25\textwidth] +\stoptyping + +This will automatically turn figures that are wider than 25\% of the text width +into normal floats instead of side floats. But let's not fall back on that +feature now. + +You can use \type {maxwidth} and \type {minwidth} variables to control the +placement in more detail. The exact result depends on the settings of \type +{location}. By default we center, but you can set the location to \type {left} or +\type {right} to achieve a different alignment. + +\startbuffer +\definefloat + [midmarginfigure] + [figure] + +\setupfloat + [midmarginfigure] + [minwidth=\leftmarginwidth, + default={leftmargin,none}] +\stopbuffer + +\typebuffer \getbuffer + +You can use \type {maxwidth} and \type {minwidth} variables to control the +placement in more detail. The exact result depends on the settings of \type +{location}. By default we center, but you can set the location to \type {left} or +\type {right} to achieve a different alignment. + +\startbuffer +\placemidmarginfigure + {} {\framed[width=1.5cm]{!}} +\stopbuffer + +\typebuffer \getbuffer \fakewords{30}{40} + +The meaning of \type {maxwidth} depends on the kind of float. First we place a +left float with a width smaller than \type {maxwidth}. + +\start + +\startbuffer +\setupfloat[figure][maxwidth=2cm] +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer +\placefigure[left,none]{}{\framed[width=1cm]{!}} +\stopbuffer + +\typebuffer \getbuffer \fakewords{30}{40} + +When the width exceeds the maxwidth, the float will be centered. This is because +we have no reference alignment point. + +\startbuffer +\placefigure[left,none]{}{\framed[width=5cm]{!}} +\stopbuffer + +\typebuffer \getbuffer \fakewords{30}{40} + +In margin floats, the \type {maxwidth} settings have a different result. First we +place a small graphic. + +\startbuffer +\setupfloat[figure][maxwidth=\leftmarginwidth] +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer +\placefigure[leftmargin,none]{}{\framed[width=1cm]{!}} +\stopbuffer + +\typebuffer \getbuffer \fakewords{30}{40} + +Because the left and right margin of this document are the same |<|the edges +differ|>| we don't need to use inner and outer dimensions. + +\startbuffer +\setupfloat[figure][maxwidth=\leftmarginwidth] +\stopbuffer + +\typebuffer \getbuffer + +A wider than \type {maxwidth} graphic will behave like a mixture of a margin and +text side float. Watch how we align the float to the margin. + +\startbuffer +\placefigure[leftmargin,none]{}{\framed[width=5cm]{!}} +\stopbuffer + +\typebuffer \getbuffer \fakewords{30}{40} + +\stop + +Instead of setting the width you can give \type {hanging} a try. The next +examples demonstrate this. + +\startbuffer +\placefigure[leftmargin,hanging,none]{}{\framed[width=5cm]{!}} +\stopbuffer + +\typebuffer \getbuffer \fakewords{30}{40} + +\startbuffer +\placefigure[left,hanging,none]{}{\framed[width=5cm]{!}} +\stopbuffer + +\typebuffer \getbuffer \fakewords{30}{40} + +You can move down|/|up margin floats with the \type {\movesidefloat} macro. Such +shifts come in handy when you have multiple side floats near to each other. + +\startbuffer +\movesidefloat [+2*line] +\placemidmarginfigure {} {\framed{!}} +\stopbuffer + +\typebuffer \getbuffer \fakewords{30}{40} + +Given the default placement template, this is equivalent to the following +command. Watch out, a simple \type {line} has a different effect (alignment). + +\starttyping +\placemidmarginfigure + [leftmargin,none,+2*line] + {} {\framed{!}} +\stoptyping + +Another nice keyword is \type {long}: + +\startbuffer +\placefigure + [leftmargin,none,long] + {} {\framed[height=2cm,width=2cm]{!}} + +Watch how we move down. The effect is that we skip over the margin figure. + +\placefigure + [leftmargin,none] + {} {\framed[height=1cm,width=2cm]{!}} +\stopbuffer + +\typebuffer \getbuffer \fakewords{30}{40} + +\startbuffer +\placefigure + [leftmargin,none] + {} {\framed[height=2cm,width=2cm]{!}} + +Do we clash or not? + +\placefigure + [leftmargin,none] + {} {\framed[height=2cm,width=2cm]{!}} + +Did we clash or not? +\stopbuffer + +\typebuffer \getbuffer + +There are a few macros that can be of help with solving clashes in side floats: + +\starttabulate +\NC \tex {flushsidefloats} \NC + This macro moves down as much as is needed to separate the side floats of + each other. \NC \NR +\NC \tex {forgetsidefloats} \NC + this macro kind of forgets that a side float is in progress. \NC \NR +\stoptabulate + +Use these macros with care. If you change the dimensions of the graphic and|/|or +content involved, reconsider the use of these directives. + +The next couple of spreads we will demonstrate some example definitions. These +placements are taken from one of the styles we made for typesetting a series of +school math books which illustrations and tables all over the pages. + +First we fine tune the spacing around side floats and verbatim text. + +\startbuffer[setupa] +\setupfloats + [sidespacebefore=none, + sidespaceafter=depth] + +\setuptyping + [margin=] +\stopbuffer + +\typebuffer[setupa] + +The placements have rather verbose names. In this case the word \quote {edge} is +used to identify bleeding floats (with an cut||off margin of 3mm). The \quote +{text} floats are side floats positioned in the main text flow. + +\startbuffer[setupb] +\definefloat [marginfigure] [marginfigures] [figure] +\definefloat [middlemarginfigure] [middlemarginfigures] [figure] +\definefloat [middlefigure] [middlefigures] [figure] +\definefloat [textfigure] [textfigures] [figure] +\definefloat [leftfigure] [leftfigures] [figure] +\definefloat [rightfigure] [rightfigures] [figure] +\definefloat [bleedfigure] [bleedfigures] [figure] +\stopbuffer + +\typebuffer[setupa] + +Watch how we define fall backs for too wide content (\type +{criterium} as well as use \type {maxwidth} to manipulate +the placement of content that falls off the margins. + +The black rules are set up with: + +\startbuffer[setupc] +\setupblackrules[color=tred,depth=0pt,height=1.5cm] +\stopbuffer + +\typebuffer[setupc] + +\page[left] + +\startbuffer[series] + +\startbuffer +\setupfloat + [marginfigure] + [criterium=.5\textwidth, + maxwidth=\rightmarginwidth, + default={outermargin,none}] +\stopbuffer + +\getbuffer \typebuffer + +\startbuffer +\placemarginfigure{}{\blackrule[width=.25cm]} +\stopbuffer + +\getbuffer \typebuffer \flushsidefloats + +\startbuffer +\placemarginfigure{}{\blackrule[width=.5cm]} +\stopbuffer + +\getbuffer \typebuffer \flushsidefloats + +\startbuffer +\placemarginfigure{}{\blackrule[width=1cm]} +\stopbuffer + +\getbuffer \typebuffer \flushsidefloats + +\startbuffer +\placemarginfigure{}{\blackrule[width=2cm]} +\stopbuffer + +\getbuffer \typebuffer \flushsidefloats + +\startbuffer +\placemarginfigure{}{\blackrule[width=4cm]} +\stopbuffer + +\getbuffer \typebuffer \flushsidefloats + +\startbuffer +\placemarginfigure{}{\blackrule[width=8cm]} +\stopbuffer + +\getbuffer \typebuffer \flushsidefloats + +\startbuffer +\placemarginfigure{}{\blackrule[width=16cm]} +\stopbuffer + +\getbuffer \typebuffer \flushsidefloats + +\stopbuffer + +{\getbuffer[setupa,setupb,setupc,series]} \page +{\getbuffer[setupa,setupb,setupc,series]} \page + +\startbuffer[series] + +\startbuffer +\setupfloat + [middlemarginfigure] + [minwidth=\rightmarginwidth, + criterium=\backspace, + location=middle, + default={outermargin,none}] +\stopbuffer + +\getbuffer \typebuffer + +\startbuffer +\placemiddlemarginfigure{}{\blackrule[width=.25cm]} +\stopbuffer + +\getbuffer \typebuffer \flushsidefloats + +\startbuffer +\placemiddlemarginfigure{}{\blackrule[width=.5cm]} +\stopbuffer + +\getbuffer \typebuffer \flushsidefloats + +\startbuffer +\placemiddlemarginfigure{}{\blackrule[width=1cm]} +\stopbuffer + +\getbuffer \typebuffer \flushsidefloats + +\startbuffer +\placemiddlemarginfigure{}{\blackrule[width=2cm]} +\stopbuffer + +\getbuffer \typebuffer \flushsidefloats + +\startbuffer +\placemiddlemarginfigure{}{\blackrule[width=4cm]} +\stopbuffer + +\getbuffer \typebuffer \flushsidefloats + +\startbuffer +\placemiddlemarginfigure{}{\blackrule[width=8cm]} +\stopbuffer + +\getbuffer \typebuffer \flushsidefloats + +\startbuffer +\placemiddlemarginfigure{}{\blackrule[width=16cm]} +\stopbuffer + +\getbuffer \typebuffer \flushsidefloats + +\stopbuffer + +{\getbuffer[setupa,setupb,setupc,series]} \page +{\getbuffer[setupa,setupb,setupc,series]} \page + +\startbuffer[series] + +\startbuffer +\setupfloat + [middlefigure] + [default={here,none}] +\stopbuffer + +\getbuffer \typebuffer + +\startbuffer +\placemiddlefigure{}{\blackrule[width=.25cm]} +\stopbuffer + +\getbuffer \typebuffer + +\startbuffer +\placemiddlefigure{}{\blackrule[width=.5cm]} +\stopbuffer + +\getbuffer \typebuffer + +\startbuffer +\placemiddlefigure{}{\blackrule[width=1cm]} +\stopbuffer + +\getbuffer \typebuffer + +\startbuffer +\placemiddlefigure{}{\blackrule[width=2cm]} +\stopbuffer + +\getbuffer \typebuffer + +\startbuffer +\placemiddlefigure{}{\blackrule[width=4cm]} +\stopbuffer + +\getbuffer \typebuffer + +\startbuffer +\placemiddlefigure{}{\blackrule[width=8cm]} +\stopbuffer + +\getbuffer \typebuffer + +%\startbuffer +%\placemiddlefigure{}{\blackrule[width=16cm]} +%\stopbuffer +% +%\getbuffer \typebuffer + +\stopbuffer + +{\getbuffer[setupa,setupb,setupc,series]} \page +{\getbuffer[setupa,setupb,setupc,series]} \page + +\startbuffer[series] + +\startbuffer +\setupfloat + [textfigure] + [criterium=.5\textwidth, + default={outer,none}] +\stopbuffer + +\getbuffer \typebuffer + +\startbuffer +\placetextfigure{}{\blackrule[width=.25cm]} +\stopbuffer + +\getbuffer \typebuffer + +\startbuffer +\placetextfigure{}{\blackrule[width=.5cm]} +\stopbuffer + +\getbuffer \typebuffer + +\startbuffer +\placetextfigure{}{\blackrule[width=1cm]} +\stopbuffer + +\getbuffer \typebuffer + +\startbuffer +\placetextfigure{}{\blackrule[width=2cm]} +\stopbuffer + +\getbuffer \typebuffer + +\startbuffer +\placetextfigure{}{\blackrule[width=4cm]} +\stopbuffer + +\getbuffer \typebuffer + +\startbuffer +\placetextfigure{}{\blackrule[width=8cm]} +\stopbuffer + +\getbuffer \typebuffer + +\startbuffer +\placetextfigure{}{\blackrule[width=16cm]} +\stopbuffer + +\getbuffer \typebuffer + +\stopbuffer + +{\getbuffer[setupa,setupb,setupc,series]} \page +{\getbuffer[setupa,setupb,setupc,series]} \page + +\startbuffer[series] + +\startbuffer +\setupfloat + [leftfigure] + [criterium=.5\textwidth, + default={left,none}] +\stopbuffer + +\getbuffer \typebuffer + +\startbuffer +\placeleftfigure{}{\blackrule[width=.25cm]} +\stopbuffer + +\getbuffer \typebuffer \flushsidefloats + +\startbuffer +\placeleftfigure{}{\blackrule[width=.5cm]} +\stopbuffer + +\getbuffer \typebuffer \flushsidefloats + +\startbuffer +\placeleftfigure{}{\blackrule[width=1cm]} +\stopbuffer + +\getbuffer \typebuffer \flushsidefloats + +\startbuffer +\placeleftfigure{}{\blackrule[width=2cm]} +\stopbuffer + +\getbuffer \typebuffer \flushsidefloats + +\startbuffer +\placeleftfigure{}{\blackrule[width=4cm]} +\stopbuffer + +\getbuffer \typebuffer \flushsidefloats + +\startbuffer +\placeleftfigure{}{\blackrule[width=8cm]} +\stopbuffer + +\getbuffer \typebuffer \flushsidefloats + +\startbuffer +\placeleftfigure{}{\blackrule[width=16cm]} +\stopbuffer + +\getbuffer \typebuffer \flushsidefloats + +\stopbuffer + +{\getbuffer[setupa,setupb,setupc,series]} \page +{\getbuffer[setupa,setupb,setupc,series]} \page + +\startbuffer[series] + +\startbuffer +\setupfloat + [rightfigure] + [criterium=.5\textwidth, + default={right,none}] +\stopbuffer + +\getbuffer \typebuffer + +\startbuffer +\placerightfigure{}{\blackrule[width=.25cm]} +\stopbuffer + +\getbuffer \typebuffer \flushsidefloats + +\startbuffer +\placerightfigure{}{\blackrule[width=.5cm]} +\stopbuffer + +\getbuffer \typebuffer \flushsidefloats + +\startbuffer +\placerightfigure{}{\blackrule[width=1cm]} +\stopbuffer + +\getbuffer \typebuffer \flushsidefloats + +\startbuffer +\placerightfigure{}{\blackrule[width=2cm]} +\stopbuffer + +\getbuffer \typebuffer \flushsidefloats + +\startbuffer +\placerightfigure{}{\blackrule[width=4cm]} +\stopbuffer + +\getbuffer \typebuffer \flushsidefloats + +\startbuffer +\placerightfigure{}{\blackrule[width=8cm]} +\stopbuffer + +\getbuffer \typebuffer \flushsidefloats + +\startbuffer +\placerightfigure{}{\blackrule[width=16cm]} +\stopbuffer + +\getbuffer \typebuffer \flushsidefloats + +\stopbuffer + +{\getbuffer[setupa,setupb,setupc,series]} \page +{\getbuffer[setupa,setupb,setupc,series]} \page + +\startbuffer[series] + +\startbuffer +\setupfloat + [bleedfigure] + [criterium=.5\textwidth, + leftmargindistance=-1mm, + rightmargindistance=-1mm, + default={backspace,none}] +\stopbuffer + +\getbuffer \typebuffer + +\startbuffer +\placebleedfigure{}{\blackrule[width=.25cm]} +\stopbuffer + +\getbuffer \typebuffer \flushsidefloats + +\startbuffer +\placebleedfigure{}{\blackrule[width=.5cm]} +\stopbuffer + +\getbuffer \typebuffer \flushsidefloats + +\startbuffer +\placebleedfigure{}{\blackrule[width=1cm]} +\stopbuffer + +\getbuffer \typebuffer \flushsidefloats + +\startbuffer +\placebleedfigure{}{\blackrule[width=2cm]} +\stopbuffer + +\getbuffer \typebuffer \flushsidefloats + +\startbuffer +\placebleedfigure{}{\blackrule[width=4cm]} +\stopbuffer + +\getbuffer \typebuffer \flushsidefloats + +\startbuffer +\placebleedfigure{}{\blackrule[width=8cm]} +\stopbuffer + +\getbuffer \typebuffer \flushsidefloats + +\startbuffer +\placebleedfigure{}{\blackrule[width=16cm]} +\stopbuffer + +\getbuffer \typebuffer \flushsidefloats + +\stopbuffer + +{\getbuffer[setupa,setupb,setupc,series]} \page +{\getbuffer[setupa,setupb,setupc,series]} \page + +\startbuffer[series] + +\startbuffer +\setupfloat + [bleedfigure] + [criterium=.5\textwidth, + leftmargindistance=-1mm, + rightmargindistance=-1mm, + default={cutspace,none}] +\stopbuffer + +\getbuffer \typebuffer + +\startbuffer +\placebleedfigure{}{\blackrule[width=.25cm]} +\stopbuffer + +\getbuffer \typebuffer \flushsidefloats + +\startbuffer +\placebleedfigure{}{\blackrule[width=.5cm]} +\stopbuffer + +\getbuffer \typebuffer \flushsidefloats + +\startbuffer +\placebleedfigure{}{\blackrule[width=1cm]} +\stopbuffer + +\getbuffer \typebuffer \flushsidefloats + +\startbuffer +\placebleedfigure{}{\blackrule[width=2cm]} +\stopbuffer + +\getbuffer \typebuffer \flushsidefloats + +\startbuffer +\placebleedfigure{}{\blackrule[width=4cm]} +\stopbuffer + +\getbuffer \typebuffer \flushsidefloats + +\startbuffer +\placebleedfigure{}{\blackrule[width=8cm]} +\stopbuffer + +\getbuffer \typebuffer \flushsidefloats + +\startbuffer +\placebleedfigure{}{\blackrule[width=16cm]} +\stopbuffer + +\getbuffer \typebuffer \flushsidefloats + +\stopbuffer + +{\getbuffer[setupa,setupb,setupc,series]} \page +{\getbuffer[setupa,setupb,setupc,series]} \page + +\page + +\setupbackgrounds [text] [leftedge] [background=] +\setupbackgrounds [text] [rightedge] [background=] +\setupbackgrounds [text] [leftmargin] [background=] +\setupbackgrounds [text] [rightmargin] [background=] + +At \CONTEXT\ and Bacho\TEX meetings it is now a tradition that Harald König and I +spend some time on figuring out what happens with border cases and interfences +with user intervention. As it's hard to nail down I decided to add some more +tracing and control. So, the remainder of this chapter is dedicated to Harald. + +We will now demonstrate some features in a way that makes it possible to +compare to the simple default case. Options can be passed as keywords: + +\starttyping +\placefigure + [left,...] + [fig:whatever] + {caption} + {content} +\stoptyping + +or as settings: + +\starttyping +\startplacefigure + [default={left,...}, + title=caption, + reference=fig:whatever] + + content + +\stopplacefigure +\stoptyping + +It is important to realize that all that spacing can interfere with additional +hard coded corrections at the users end. We don't show the effects of \type +{sidespacebefore} and \type {sidespaceafter}, the two general vertical spacing +hooks. These are currently set to {\tttf \rootfloatparameter {sidespacebefore}} +and {\tttf \rootfloatparameter {sidespaceafter}} respectively. The \type +{sidealign} parameter is always winning from a keyword doing the same. + +The last few examples demonstrate that you can define an instance. Often that's +the best way to deal with special cases in a consistent way. For instance: + +\starttyping +\definefloat + [LeftTwo] + [figure] + +\setupfloat + [LeftTwo] + [default=left, + sidealign=line] +\stoptyping + +First we show some keyword variant, next some parameter driven versions. + +\def\SampleKeyword#1% + {\setbuffer[foo] + \useMPlibrary[dum] + \setupbodyfont[dejavu] + \setuplayout[page] + \placefigure[left]{}{\externalfigure[dummy]} \samplefile{sapolsky} \samplefile{sapolsky} + \placefigure[#1] {}{\externalfigure[dummy]} \samplefile{sapolsky} \samplefile{sapolsky} + \endbuffer + \framed + [background=color,backgroundcolor=white,offset=overlay] + {\scale + [width=.45\textwidth] + {\typesetbuffer[foo]}}} + +\def\SampleSettings#1#2#3% + {\setbuffer[foo] + \useMPlibrary[dum] + \setupbodyfont[dejavu] + \setuplayout[page] + \definefloat[#1][figure] + \setupfloat[#1][default=left] + \definefloat[#2][figure] + \setupfloat[#2][#3] + \startplacefloat[#1] \externalfigure[dummy] \stopplacefloat \samplefile{sapolsky} \samplefile{sapolsky} + \startplacefloat[#2] \externalfigure[dummy] \stopplacefloat \samplefile{sapolsky} \samplefile{sapolsky} + \endbuffer + \framed + [background=color,backgroundcolor=white,offset=overlay] + {\scale + [width=.45\textwidth] + {\typesetbuffer[foo]}}} + +\startbuffer[LeftOne] +\definefloat[LeftOne][figure] + +\setupfloat + [LeftOne] + [default=left] +\stopbuffer + +\startbuffer[LeftTwo] +\definefloat[LeftTwo][figure] + +\setupfloat + [LeftTwo] + [default=left, + sidealign=line] +\stopbuffer + +\startbuffer[LeftThree] +\definefloat[LeftThree][figure] + +\setupfloat + [LeftThree] + [default={left,2*line}] +\stopbuffer + +\startbuffer[LeftFour] +\definefloat[LeftFour][figure] + +\setupfloat + [LeftFour] + [default={left}, + topoffset=5pt] +\stopbuffer + +\startbuffer[LeftFive] +\definefloat[LeftFive][figure] + +\setupfloat + [LeftFive] + [default={left}, + bottomoffset=5pt, + topoffset=5pt] +\stopbuffer + +\startlinecorrection +\startcombination[2*2] + {\SampleKeyword{left,high}} {\type{left,high}} + {\SampleKeyword{left,low}} {\type{left,low}} + {\SampleKeyword{left,high,low}} {\type{left,high,low}} + {\SampleKeyword{left,fit}} {\type{left,fit}} +\stopcombination +\stoplinecorrection + +\startlinecorrection +\startcombination[2*2] + {\SampleKeyword{left,halfline}} {\type{left,halfline}} + {\SampleKeyword{left,height}} {\type{left,height}} + {\SampleKeyword{left,depth}} {\type{left,depth}} + {\SampleKeyword{left,grid}} {\type{left,grid}} +\stopcombination +\stoplinecorrection + +\startlinecorrection +\startcombination[2*2] + {\SampleKeyword{left,line}} {\type{left,line}} + {\SampleKeyword{left,1*line}} {\type{left,1*line}} + {\SampleKeyword{left,2*line}} {\type{left,2*line}} + {\SampleKeyword{left,3*line}} {\type{left,3*line}} +\stopcombination +\stoplinecorrection + +\startlinecorrection +\startcombination[2*2] + {\SampleSettings{LeftOne}{LeftTwo} {default={left,line}}} + {\typ{default={left,line}}} + {\SampleSettings{LeftOne}{LeftThree}{default={left,2*line}}} + {\typ{default={left,2*line}}} + {\SampleSettings{LeftOne}{LeftFour} {default=left,topoffset=5pt}} + {\typ{default=left, topoffset=5pt}} + {\SampleSettings{LeftOne}{LeftFive} {default=left, topoffset=5pt, bottomoffset=5pt}} + {\typ{default=left, topoffset=5pt, bottomoffset=5pt}} +\stopcombination +\stoplinecorrection + +There is some tracing built in but as this mechanism is rather complex it only +gives an idea about what is going on. Here is an example: + +\startbuffer[one] +\enabletrackers[floats.anchoring] + +\showframe + +\setupfloat + [sidespacebefore=big, + sidespaceafter=big] + +\starttext + \dorecurse{10}{ + \placefigure[left]{#1.1}{} + a small sentence \par + \placefigure[left]{#1.2}{} + a small sentence \par + \input klein \par + } +\stoptext +\stopbuffer + +\typebuffer[one] + +In \in {figure} [fig:side:one:1] and \in {figure} [fig:side:one:2] you see the +first two pages of the typeset result. + +The anchor to the text is showed in orange and an optional shift in red. The content +is in green and a depth compensation in magenta. Dummy lines added for proper +spacing as well as progressing beyond a previous float are in blue. + +\startplacefigure[title={Side float tracing example 1, page 1.},reference=fig:side:one:1] + \scale[width=\textwidth]{\typesetbuffer[one][page=1]} +\stopplacefigure + +\startplacefigure[title={Side float tracing example 1, page 2.},reference=fig:side:one:2] + \scale[width=\textwidth]{\typesetbuffer[one][page=2]} +\stopplacefigure + +A second example that uses different settings is shown in \in {figure} +[fig:side:two:1] and \in {figure} [fig:side:two:2]. + +\startbuffer[two] +\enabletrackers[floats.anchoring] + +\setupfloat + [sidespacebefore=, + sidespaceafter=big, + step=small] + +\showframe + +\starttext + \dorecurse{10}{ + \placefigure[left]{#1.1}{} + a small sentence \par + \placefigure[left]{#1.2}{} + a small sentence \par + \input klein \par + } +\stoptext +\stopbuffer + +\typebuffer[two] + +\startplacefigure[title={Side float tracing example 2, page 1.},reference=fig:side:two:1] + \framed + [background=color,backgroundcolor=white,offset=overlay] + {\scale[width=\textwidth]{\typesetbuffer[two][page=1]}} +\stopplacefigure + +\startplacefigure[title={Side float tracing example 2, page 2.},reference=fig:side:two:2] + \framed + [background=color,backgroundcolor=white,offset=overlay] + {\scale[width=\textwidth]{\typesetbuffer[two][page=2]}} +\stopplacefigure + +\startbuffer[three] +\usemodule[simulate] + +\setuplayout + [tight] + +\setupbodyfont + [dejavu] + +\enabletrackers + [floats.anchoring] + +\setupfloats + [sidethreshold=.5\strutdp, % default, use "old" for previous implementation + step=small] + +\definemeasure[MyHeight][3cm] +\definemeasure[MyWidth] [3cm] + +% \setupheadertexts +% [width=\measure{MyWidth}\quad height=\measure{MyHeight}] + +\unexpanded\def\FakeWords#1% + {\simulatewords + [n=#1,m=#1,min=1,max=5,hyphen=no,color=text,line=yes,random=1234]} + +\starttext + +\startbuffer + \FakeWords{100}\par + \placefigure + [left] {oeps} + {\framed[width=\measure{MyWidth},height=\measure{MyHeight}]{}} + \FakeWords {2}\par + \FakeWords {3}\par + \FakeWords {5}\par + \FakeWords {4}\par + \FakeWords{200}\par + \placefigure + [left] {oeps} + {\framed[width=\measure{MyWidth},height=\measure{MyHeight}]{}} + \FakeWords{200}\par +\stopbuffer + +\dostepwiserecurse {\number\dimexpr3cm} {\number\dimexpr4cm} {\number\dimexpr0.25cm} { + \definemeasure[MyWidth][#1sp] + \dostepwiserecurse {\number\dimexpr3cm} {\number\dimexpr4cm} {\number\dimexpr0.25cm} { + \definemeasure[MyHeight][##1sp] + \start + \setupwhitespace[none] + \getbuffer \page + \stop + \start + \setupwhitespace[big] + \getbuffer \page + \stop + } +} +\stoptext +\stopbuffer + +Progressing next to a side float and determining how many lines to indent is a +somewhat complex mechamism because many factors play a role and spacing can +interfere badly. The decision about the number of lines to hang is to some extend +controllable but there are cases when you need to steer it (for instance by +scaling an image). In the next overviews we see the result of the following +somewhat complex setup: + +\typebuffer[three] + +The \type {step} parameter controls how we fill up the space when we need to +progress beyond it for instance because another float shows up or because we +issue a \type {\flushsidefloats}. Its value can be \type {big}, \type {medium} or +\type {small} and defaults to \type {small} which gives of enough precision. The +\type {sidethreshold} parameter controls the number of lines that we hang around +the float. Here we only show the consequence of the the threshold. A larger +threshold result in mode whitespace below the side float. You can zoom in to see +what happens at the bottom of the float (or run the examples yourself). + +\def\ShowSample#1% + {\framed + [background=color,backgroundcolor=white,offset=overlay] + {\scale + [width=\dimexpr(\textwidth-2\emwidth)/3\relax] + {\typesetbuffer[three][page=#1]}}} + +\startplacefigure[title={The working of default step and side threshold (no whitespace.},reference=fig:side:three:1] + \startcombination[3*3] + {\ShowSample {1}} {} {\ShowSample {3}} {} {\ShowSample {5}} {} + {\ShowSample {7}} {} {\ShowSample {9}} {} {\ShowSample {9}} {} + {\ShowSample{11}} {} {\ShowSample{13}} {} {\ShowSample{15}} {} + \stopcombination +\stopplacefigure + +\startplacefigure[title={The working of default step and side threshold (whitespace).},reference=fig:side:three:2] + \startcombination[3*3] + {\ShowSample {2}} {} {\ShowSample {4}} {} {\ShowSample {6}} {} + {\ShowSample {8}} {} {\ShowSample{10}} {} {\ShowSample{12}} {} + {\ShowSample{12}} {} {\ShowSample{14}} {} {\ShowSample{15}} {} + \stopcombination +\stopplacefigure + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/details/details-frontpage.tex b/doc/context/sources/general/manuals/details/details-frontpage.tex new file mode 100644 index 000000000..0c7df22f5 --- /dev/null +++ b/doc/context/sources/general/manuals/details/details-frontpage.tex @@ -0,0 +1,43 @@ +% language=uk + +\environment details-environment + +\startcomponent details-frontpage + +\startpagemakeup[doublesided=no,pagestate=stop,page=no] + \startMPcode + StartPage ; + % todo: calculate p[3] from the text dimensions as now it's a gamble + path p[] ; picture q[] ; + p[1] := Page ; + p[2] := Page xscaled .60 shifted (.2PaperWidth,0) ; + p[3] := Page yscaled .22 shifted (0,.69PaperHeight) ; + q[1] := textext.raw("\color[white] {DETAILS}") xsized(.98PaperWidth) ; + q[2] := textext.raw("\color[white] {IT'S IN THE}") xsized(.98PaperWidth) ; + q[3] := textext.raw("\color[twhite]{\tt HANS HAGEN}") xsized(.60PaperWidth) ; + q[4] := textext.raw("\color[twhite]{\tt PRAGMA ADE}") xsized(.60PaperWidth) ; + q[5] := textext.raw("\color[twhite]{\tt HASSELT NL}") xsized(.60PaperWidth) ; + q[2] := q[2] shifted (0,- bbheight(q[2])) ; + q[3] := q[3] shifted (0,+1.5bbheight(q[3])) ; + q[5] := q[5] shifted (0,-1.5bbheight(q[5])) ; + fill p[1] withcolor \MPcolor{blue} ; % .5blue + fill p[2] withcolor \MPcolor{red} ; % .5red + fill p[3] withcolor \MPcolor{gray} withtransparency(1,.5) ; % .6white + draw q[1] shifted (.01PaperWidth,.7PaperHeight) ; + draw q[2] shifted (.01PaperWidth,.9PaperHeight) ; + draw q[3] shifted (.20PaperWidth,.2PaperHeight) ; + draw q[4] shifted (.20PaperWidth,.2PaperHeight) ; + draw q[5] shifted (.20PaperWidth,.2PaperHeight) ; + StopPage ; + \stopMPcode +\stoppagemakeup + +\startpagemakeup[doublesided=no,pagestate=stop,page=no] + \startMPcode + StartPage ; + fill Page withcolor \MPcolor{blue} ; % .5blue ; + StopPage ; + \stopMPcode +\stoppagemakeup + +\stopcomponent diff --git a/doc/context/sources/general/manuals/details/details-gridtrickery.tex b/doc/context/sources/general/manuals/details/details-gridtrickery.tex new file mode 100644 index 000000000..f37c7bd4b --- /dev/null +++ b/doc/context/sources/general/manuals/details/details-gridtrickery.tex @@ -0,0 +1,161 @@ +% language=uk + +\environment details-environment + +\startcomponent details-gridtrickery + +\startchapter[title={Grid trickery}] + +In this manual we pay quite some words on ways to snap your content on a grid. +When dealing with grids, we often run into conflicting situations where we have +to make the best of it. Let's again deal with an aspect of graphics. + +One of the strong points of \TEX\ is that it can deal with graphics +automatically, which means that you seldom have to tweak dimensions or placements +unless \unknown\ you're dealing with grids. In that case you need to make sure +that the height of graphics consistently match the height of lines (or multiples +of lines). It is for this purpose that the graphic inclusion macro has a \type +{grid} entry. + +We will illustrate its usage using a dedicated figure class where we have set the +space between figure and caption to zero. + +\startbuffer +\definefloat[tightfigure][tightfigures][figure] +\setupcaption[tightfigure][inbetween=] +\stopbuffer + +\typebuffer \getbuffer + +The \type {grid} parameter controls rounding of the height of a graphic in the +following way: + +\starttabulate + +\NC \type {yes} \NC safe rounding to an equal number of lines \NC \NR +\NC \type {fit} \NC tight rounding to an equal number of lines \NC \NR +\NC \type {height} \NC same as \type {yes} but incremented by linedepth \NC \NR +\stoptabulate + +On the next pages we demonstrate the effects of these settings. At the bottom of +a page we show the placement commands. On the last pages we've hidden the +captions with: + +\starttyping +\setupfloat[tightfigure][default={here,none}] +\stoptyping + +As you will notice, the \type {height} option is handy when the caption is +positioned directly under the graphic. + +\start \page + +\fakewords{20}{30} \placetightfigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.3,grid=yes]} +\fakewords{20}{30} \placetightfigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.4,grid=yes]} +\fakewords{20}{30} \placetightfigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.5,grid=yes]} +\fakewords{20}{30} \placetightfigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.6,grid=yes]} +\fakewords{20}{30} \placetightfigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.7,grid=yes]} +\fakewords{20}{30} + +\starttyping +\placetightfigure{}{\externalfigure[dummy][lines=1.3,grid=yes]} +\placetightfigure{}{\externalfigure[dummy][lines=1.4,grid=yes]} +\placetightfigure{}{\externalfigure[dummy][lines=1.5,grid=yes]} +\placetightfigure{}{\externalfigure[dummy][lines=1.6,grid=yes]} +\placetightfigure{}{\externalfigure[dummy][lines=1.7,grid=yes]} +\stoptyping + +\page + +\fakewords{20}{30} \placetightfigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.3,grid=fit]} +\fakewords{20}{30} \placetightfigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.4,grid=fit]} +\fakewords{20}{30} \placetightfigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.5,grid=fit]} +\fakewords{20}{30} \placetightfigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.6,grid=fit]} +\fakewords{20}{30} \placetightfigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.7,grid=fit]} +\fakewords{20}{30} + +\starttyping +\placetightfigure{}{\externalfigure[dummy][lines=1.3,grid=fit]} +\placetightfigure{}{\externalfigure[dummy][lines=1.4,grid=fit]} +\placetightfigure{}{\externalfigure[dummy][lines=1.5,grid=fit]} +\placetightfigure{}{\externalfigure[dummy][lines=1.6,grid=fit]} +\placetightfigure{}{\externalfigure[dummy][lines=1.7,grid=fit]} +\stoptyping + +\page + +\fakewords{20}{30} \placetightfigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.3,grid=height]} +\fakewords{20}{30} \placetightfigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.4,grid=height]} +\fakewords{20}{30} \placetightfigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.5,grid=height]} +\fakewords{20}{30} \placetightfigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.6,grid=height]} +\fakewords{20}{30} \placetightfigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.7,grid=height]} +\fakewords{20}{30} + +\starttyping +\placetightfigure{}{\externalfigure[dummy][lines=1.3,grid=height]} +\placetightfigure{}{\externalfigure[dummy][lines=1.4,grid=height]} +\placetightfigure{}{\externalfigure[dummy][lines=1.5,grid=height]} +\placetightfigure{}{\externalfigure[dummy][lines=1.6,grid=height]} +\placetightfigure{}{\externalfigure[dummy][lines=1.7,grid=height]} +\stoptyping + +\page + +\setupfloat[tightfigure][default={here,none}] + +\fakewords{20}{30} \placetightfigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.3,grid=yes]} +\fakewords{20}{30} \placetightfigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.4,grid=yes]} +\fakewords{20}{30} \placetightfigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.5,grid=yes]} +\fakewords{20}{30} \placetightfigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.6,grid=yes]} +\fakewords{20}{30} \placetightfigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.7,grid=yes]} +\fakewords{20}{30} + +\starttyping +\placetightfigure{}{\externalfigure[dummy][lines=1.3,grid=yes]} +\placetightfigure{}{\externalfigure[dummy][lines=1.4,grid=yes]} +\placetightfigure{}{\externalfigure[dummy][lines=1.5,grid=yes]} +\placetightfigure{}{\externalfigure[dummy][lines=1.6,grid=yes]} +\placetightfigure{}{\externalfigure[dummy][lines=1.7,grid=yes]} +\stoptyping + +\page + +\fakewords{20}{30} \placetightfigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.3,grid=fit]} +\fakewords{20}{30} \placetightfigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.4,grid=fit]} +\fakewords{20}{30} \placetightfigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.5,grid=fit]} +\fakewords{20}{30} \placetightfigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.6,grid=fit]} +\fakewords{20}{30} \placetightfigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.7,grid=fit]} +\fakewords{20}{30} + +\starttyping +\placetightfigure{}{\externalfigure[dummy][lines=1.3,grid=fit]} +\placetightfigure{}{\externalfigure[dummy][lines=1.4,grid=fit]} +\placetightfigure{}{\externalfigure[dummy][lines=1.5,grid=fit]} +\placetightfigure{}{\externalfigure[dummy][lines=1.6,grid=fit]} +\placetightfigure{}{\externalfigure[dummy][lines=1.7,grid=fit]} +\stoptyping + +\page + +\fakewords{20}{30} \placetightfigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.3,grid=height]} +\fakewords{20}{30} \placetightfigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.4,grid=height]} +\fakewords{20}{30} \placetightfigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.5,grid=height]} +\fakewords{20}{30} \placetightfigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.6,grid=height]} +\fakewords{20}{30} \placetightfigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.7,grid=height]} +\fakewords{20}{30} + +\starttyping +\placetightfigure{}{\externalfigure[dummy][lines=1.3,grid=height]} +\placetightfigure{}{\externalfigure[dummy][lines=1.4,grid=height]} +\placetightfigure{}{\externalfigure[dummy][lines=1.5,grid=height]} +\placetightfigure{}{\externalfigure[dummy][lines=1.6,grid=height]} +\placetightfigure{}{\externalfigure[dummy][lines=1.7,grid=height]} +\stoptyping + +\page \stop + +\stopchapter + +\page + +\stopcomponent diff --git a/doc/context/sources/general/manuals/details/details-index.tex b/doc/context/sources/general/manuals/details/details-index.tex new file mode 100644 index 000000000..9b6940f0b --- /dev/null +++ b/doc/context/sources/general/manuals/details/details-index.tex @@ -0,0 +1,13 @@ +% language=uk + +\environment details-environment + +\startcomponent details-index + +\startchapter[title={Document index}] + +\placeregister[index] + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/details/details-introduction.tex b/doc/context/sources/general/manuals/details/details-introduction.tex new file mode 100644 index 000000000..8e64ba4ed --- /dev/null +++ b/doc/context/sources/general/manuals/details/details-introduction.tex @@ -0,0 +1,42 @@ +% language=uk + +\startcomponent details-introduction + +\environment details-environment + +\starttitle[title={Introduction}] + +On the \CONTEXT\ mailing list, occasionally a user asks if we can post a complete +document with the associated style. One reason for not honouring this request is +that we want users to cook up their own styles. Besides that, there are a couple +of styles in the regular \CONTEXT\ distribution. + +When browsing through this document, a \CONTEXT\ user may wonder what style was +used to achieve its look and feel. We hope that while reading the text and +playing with the examples, the reader will accomplish the skills to define more +than just simple layouts. + +This document is not easy reading. Occasionally we spend some time explaining +features not described in other manuals. The design of this document is to a +large extent determined by its purpose, and as a result not always functional. +For instance, we typeset on a grid which doesn't look too good. Also the order of +presenting features, tips and tricks is kind of random and unstructured. The idea +is that the visual effects will draw you to the right trick. Also, if you really +want to benefit from these features, there is no way but to read the whole story. + +In spite of all its shortcomings, I hope that you enjoy reading this (yet +unfinished) manual. Keep in mind that this manual is far from finished. + +\blank + +\startlines +Hans Hagen +Hasselt NL +\blank +2002\high{+} MkII +2015\high{+} MkIV +\stoplines + +\stoptitle + +\stopcomponent diff --git a/doc/context/sources/general/manuals/details/details-ornaments.tex b/doc/context/sources/general/manuals/details/details-ornaments.tex new file mode 100644 index 000000000..35d23c8b4 --- /dev/null +++ b/doc/context/sources/general/manuals/details/details-ornaments.tex @@ -0,0 +1,585 @@ +% language=uk + +\environment details-environment + +\startcomponent details-ornaments + +\startchapter[title={Ornaments everywhere}] + +The background mechanisms present in \CONTEXT\ have evolved over time and with +computers becoming faster, you can expect new functionality to show up and +existing functionality to start using this technology. A simple background +consist of a colored area. Many commands accept settings like: + +\starttyping +...[background=color,backgroundcolor=red,backgroundoffset=3pt] +\stoptyping + +Instead of such an area you can define one or more so called +overlays: + +\starttyping +\defineoverlay[one][...] +\defineoverlay[two][...] + +...[background={one,two}] +\stoptyping + +The name overlay comes from the fact that you stack them on top of each other. A +special overlay is \type {foreground}, and deep down in \CONTEXT\ there are more +predefined overlays. + +In the \METAFUN\ manual you will find example of usage, so here we stick to a +simple code snippet for testing this functionality: + +\startbuffer +\defineoverlay[one][\green A] +\defineoverlay[two][\red B] + +\framed[background=one] {1} +\framed[background={one,two}] {1---2} +\stopbuffer + +\typebuffer + +The rather ugly result is: + +\startlinecorrection +\hbox{\getbuffer} +\stoplinecorrection + +You can construct overlays by using \TEX\ boxing primitives or commands like +\type {\framed}. Alternatively you can use another mechanism: layers. Layers +collect content and flush that when asked, for instance when an overlay is +constructed. Layers can be independent of a page, or bound to a specific page +number, left or right hand pages. Here we look at independent layers. + +All these mechanisms are fine tuned for cooperating with the output routine (the +part of \TEX\ that deals with composing pages) and are well interact quite well +with \METAPOST\ graphics. Details of usage and tricks are revealed in this manual +as well as in styles that come with \CONTEXT. In this chapter we will apply +layers to graphics. For this we need a few setups, like: + +\starttyping +\setupbackgrounds + [page] + [background=pagegraphics] +\stoptyping + +Here we have set up the page background to use an overlay called \type +{pagegraphics}. However, instead of an overlay, we will use a layer. This layer +will collect content that goes into the page background. Whenever a layer is +defined, an overlay is automatically defined as well. + +\startbuffer +\definelayer + [pagegraphics] + [x=-2mm, + y=-2mm, + width=\paperwidth, + height=\paperheight] +\stopbuffer + +\typebuffer \getbuffer + +When you fill a layer with content, you can influence the placement with the +\type {x} and \type {y} parameters as well as \type {hoffset} and \type +{voffset}, whichever you prefer. The reference point and alignment are set with +\type {corner} and \type {location}. + +Live can be made easier by using presets, especially for our intended usage. The +following presets are predefined. + +\startbuffer +\definelayerpreset + [lefttop] [corner={left,top}, location={right,bottom}] +\definelayerpreset + [righttop] [corner={right,top}, location={left,bottom}] +\definelayerpreset + [leftbottom] [corner={left,bottom}, location={right,top}] +\definelayerpreset + [rightbottom] [corner={right,bottom},location={left,top}] +\stopbuffer + +\typebuffer \getbuffer + +Because for this layer we have also preset the \type {x} and \type {y}, those +corners are laying a few millimeters outside the page area. We have preset the +size as well, otherwise all corners would end up in the top left corner. + +We will now fill this layer. Because the layer is hooked into the page, it will +be flushed when the page is constructed. After the page is written to the output +file, the layer is emptied, unless its \type {state} is set to \type {repeat}. + +\startbuffer +\setlayer [extras] [preset=lefttop] {\externalfigure[hacker]} +\setlayer [extras] [preset=righttop] {\externalfigure[hacker]} +\setlayer [extras] [preset=leftbottom] {\externalfigure[hacker]} +\setlayer [extras] [preset=rightbottom] {\externalfigure[hacker]} +\stopbuffer + +\testpage[5] \typebuffer \getbuffer + +Once you got the picture of layering, you will start using this mechanism for all +kind of tasks. Instead of putting layers in a background, you can also directly +place them, by using one of the two (equivalent) commands: + +\starttyping +\composedlayer{identifier} +\placelayer[identifier] +\stoptyping + +Layer are quite convenient for defining title pages, colophons, and special +section heads, especially in combination with \type {\framed}. + +On top of the layer mechanism we have build a few more mechanisms, like +ornaments. You can use ornaments to annotate graphics in such a way that the +dimensions stay unchanged. + +\startbuffer +\defineornament + [affiliation] + [rotation=90,corner={right,bottom},location={right,top}, + hoffset=-.25ex] + [frame=on,background=color,backgroundcolor=red,offset=0pt] +\stopbuffer + +\typebuffer \getbuffer + +The negative offset will overlay the text outside the graphic. The meaning of the +sign of coordinates and offsets depends on the corner. \in {Figure} [fig:affi-1] +shows the result. We have put the reference point in the right bottom corner. The +ornament is anchored at the right top corner of the dot you can picture at the +reference point. The ornament is shifted .25ex outwards. + +\starttyping +\placefigure + {} + {\affiliation{graphic}{\externalfigure[hacker][width=3cm]}} +\stoptyping + +\placefigure + [here] [fig:affi-1] {Number 1} + {\affiliation{graphic}{\externalfigure[hacker][width=3cm]}} + +There are two ways to handle the placement. Alternative \type {a} will change the +dimensions of the graphic according to the size of the ornament, while +alternative \type {b} acts as a pure overlay. In \in {figure} [fig:affi-2] the +ornament is not taken into account when calculating the dimensions of the +graphic. This is often the preferred placement, because this way the (often +small) ornament will not it will not spoil visual alignment of similar graphics. + +\startbuffer +\defineornament + [affiliation] + [rotation=90,corner={right,bottom},location={right,top}, + hoffset=-.25ex,alternative=b] + [frame=on,background=color,backgroundcolor=red,offset=0pt] +\stopbuffer + +\typebuffer \getbuffer + +\placefigure + [here] [fig:affi-2] {Number 2} + {\affiliation{graphic}{\externalfigure[hacker][width=3cm]}} + +A positive offset will place the ornament on top of the graphic (see \in {figure} +[fig:affi-3]). + +\startbuffer +\defineornament + [affiliation] + [rotation=90,corner={right,bottom},location={left,top}, + hoffset=.25ex,voffset=.25ex,alternative=a] + [background=color,style=\ss\tfxx,backgroundcolor=white,offset=0pt] +\stopbuffer + +\typebuffer \getbuffer + +\placefigure + [here] [fig:affi-3] {Number 3} + {\affiliation{graphic}{\externalfigure[hacker][width=3cm]}} + +You need to play a bit with this mechanism in order to get a feeling for what the +parameters do. + +\startbuffer +\defineornament + [affiliation] + [rotation=90,corner={right,bottom},location={left,top}, + hoffset=.25ex,voffset=.25ex,alternative=b] + [background=color,style=\ss\tfxx,backgroundcolor=white,offset=0pt] +\stopbuffer + +\typebuffer \getbuffer + +\placefigure + [here] [fig:affi-4] {Number 4} + {\affiliation{graphic}{\externalfigure[hacker][width=3cm]}} + +Because the text is normally typeset quite small, you'd better use a font that +can be scaled down a lot. + +\startbuffer +\definefont[AffiliationFont][Sans sa .25] + +\defineornament + [SomeAffiliation] + [rotation=90,corner={right,bottom},location={right,top}, + hoffset=-.125ex,alternative=b] + [style=AffiliationFont,offset=0pt] +\stopbuffer + +\typebuffer \getbuffer + +This affiliation is used as: + +\startbuffer +\placefigure + {Affiliations normally are typeset pretty small.} + {\SomeAffiliation + {author: Hester De Weert} + {\externalfigure[hacker]}} +\stopbuffer + +\typebuffer \getbuffer + +Ornaments are implemented in terms of layers and collectors. A few examples +demonstrate how these can be used. + +\startbuffer +\layeredtext + [corner={right,bottom},location={left,top}] + [background=color,backgroundcolor=white,offset=0pt] + {graphic} + {\externalfigure[hacker][width=3cm]} +\stopbuffer + +\typebuffer \startlinecorrection \getbuffer \stoplinecorrection + +\startbuffer +\layeredtext + [rotation=90,corner={right,bottom},location={right,top}] + [frame=on,offset=0pt] + {graphic} + {\externalfigure[hacker][width=3cm]} +\stopbuffer + +\typebuffer \startlinecorrection \getbuffer \stoplinecorrection + +\startbuffer +\layeredtext + [rotation=90,corner={left,bottom},location={left,top}] + [frame=on,offset=0pt] + {graphic} + {\externalfigure[hacker][width=3cm]} +\stopbuffer + +\typebuffer \startlinecorrection \getbuffer \stoplinecorrection + +\startbuffer +\collectedtext + [corner={right,bottom},location={left,top}] + [background=color,backgroundcolor=white,offset=0pt] + {graphic} + {\externalfigure[hacker][width=3cm]} +\stopbuffer + +\typebuffer \startlinecorrection \getbuffer \stoplinecorrection + +\startbuffer +\collectedtext + [rotation=90,corner={right,bottom},location={right,top}] + [frame=on,offset=0pt] + {graphic} + {\externalfigure[hacker][width=3cm]} +\stopbuffer + +\typebuffer \startlinecorrection \getbuffer \stoplinecorrection + +\startbuffer +\collectedtext + [rotation=90,corner={left,bottom},location={left,top}] + [frame=on,offset=0pt] + {graphic} + {\externalfigure[hacker][width=3cm]} +\stopbuffer + +\typebuffer \startlinecorrection \getbuffer \stoplinecorrection + +There are several methods to construct title pages, headers, and other +compositions. Of course there are the low level box constructors like \type +{\hbox}, \type {\vbox} and positioning primitives like \type {\hskip}, \type +{\hfill} and alike. + +Another option is to fall back on the low level box macros in the \CONTEXT\ +support file \type {supp-box} or the higher level \type {\framed} macro. You can +use \type {\framed} nested and by cleverly using the offsets and dimensions you +can do a lot. + +Layers are another means. You can or instance construct a title page in the +following way: + +\starttyping +\definelayer + [titlepage] + [width=\textwidth, + height=\textheight] + +\setlayer + [titlepage] + [preset=righttop,location={left,bottom},y=1cm,x=1cm] + {\definedfont[Regular at 60pt]Welcome} + +\setlayer + [titlepage] + [preset=rightbottom,location={right,top},y=2cm,x=2cm] + {\definedfont[Regular at 30pt]By Me} +\stoptyping + +This just fills the layer. Placement is done with: + +\starttyping +\startstandardmakeup + \flushlayer[titlepage] +\stopstandardmakeup +\stoptyping + +or alternatively: + +\starttyping +\setupbackgrounds[text][background=titlepage] +\startstandardmakeup \stopstandardmakeup +\setupbackgrounds[text][background=] +\stoptyping + +Another way to collect content is to use a collector. A collector starts out +empty with: + +\startbuffer +\definecollector[test][state=repeat] +\stopbuffer + +\typebuffer \getbuffer + +We can now stepwise fill this collector. For educational purposes we've turn of +tracing so that you can see what the anchor points. + +\startbuffer +\setcollector[test] + [location={right,bottom}] + {\externalfigure[detcow][frame=on,width=3cm]} +\stopbuffer + +\typebuffer {\traceboxplacementtrue \getbuffer} + +\startlinecorrection[blank] \flushcollector[test] \stoplinecorrection + +\startbuffer +\setcollector[test] + [corner={right,bottom},location={left,top}] + {\framed[background=color,backgroundcolor=tyellow]{this is a cow}} +\stopbuffer + +\typebuffer {\traceboxplacementtrue \getbuffer} + +\startlinecorrection[blank] \flushcollector[test] \stoplinecorrection + +\startbuffer +\setcollector[test] + [corner={right,bottom},location={right,bottom}] + {\framed[background=color,backgroundcolor=tblue]{that's for sure}} +\stopbuffer + +\typebuffer {\traceboxplacementtrue \getbuffer} + +\startlinecorrection[blank] \flushcollector[test] \stoplinecorrection + +\startbuffer +\setcollector[test] + [corner={left,top},location={left,top}] + {\framed[background=color,backgroundcolor=tgreen]{a dutch cow}} +\stopbuffer + +\typebuffer {\traceboxplacementtrue \getbuffer} + +\startlinecorrection[blank] \flushcollector[test] \stoplinecorrection + +\startbuffer +\setcollector[test] + [corner=middle, + location=middle] + {\framed[background=color,backgroundcolor=tred]{nearly done}} +\stopbuffer + +\typebuffer {\traceboxplacementtrue \getbuffer} + +\startlinecorrection[blank] \flushcollector[test] \stoplinecorrection + +In addition to the parameters shown here, you can also provide additional ones: +\type {x}, \type {y}, \type {offset}, \type {hoffset} and \type {voffset} for +positioning and \type {rotation} for (as expected) rotating the content in steps +of 90 degrees. As with layers, the coordinates and offsets can be used +intermixed. + +\startbuffer +\setcollector[test] + [hoffset=4cm, + voffset=-1cm, + corner=middle, + location=middle] + {\framed{now}} +\stopbuffer + +\typebuffer {\traceboxplacementtrue \getbuffer} + +\startlinecorrection[blank] \flushcollector[test] \stoplinecorrection + +We can show the intermediate results because we have set the state of this +collector to repeat. In this case you need to erase the content manually, using: + +\startbuffer +\resetcollector[test] +\stopbuffer + +\typebuffer \getbuffer + +The chapter titles of this document are (as usual in a \CONTEXT\ document) +typeset by the \type {\chapter} macro. When thinking about implementing a non +standard head, those familiar with \CONTEXT's head macros will probably first +think of using one of the hooks, like: + +\starttyping +\setuphead[chapter][command=\MyChapterHead] +\stoptyping + +Here we have followed a different approach. First we set up the chapter head. The +\type {empty} directive instructs \CONTEXT\ not to place the head itself, but +still to include the associated data in the text stream. This means that we will +not see a chapter title, but that there will be an entry in the table of +contents, that references will be set up, that so called marks will be available, +etc. + +\starttyping +\setuphead + [chapter] + [placehead=empty, + header=chapter, + style=\BigText, + numberstyle=\BigNumber] +\stoptyping + +The \type {header} parameters instructs the head handler to mark this page as +special with regards to header texts. This text is set up as follows: + +\starttyping +\definetext + [chapter] + [header] + [\setups{chapter}] + [] +\stoptyping + +The setups are just series of typesetting instructions. For the sake of +readability, we have split them up. + +\starttyping +\startsetups chapter + \setups[chapter:title] + \setups[chapter:number] + \setups[chapter:finish] +\stopsetups +\stoptyping + +The setups will use a dedicated layer for the chapter title: + +\starttyping +\definelayer + [chapter] + [width=\dimexpr\makeupwidth+\cutspace\relax, + height=\headerheight] +\stoptyping + +The following code uses a macro \type {\setlayerframed}. This is a combination +between \type {\setlayer} and \type {\framed}. We use two placement macros to +typeset the title and number. When doing so, we need to take care of both +numbered chapters and unnumbered titles. + +\starttyping +\startsetups chapter:title + + \setlayerframed + [chapter] + [x=\dimexpr\makeupwidth+\cutspace\relax,location={left,bottom}] + [height=\headerheight, + foregroundcolor=white, + background=color, + backgroundcolor=blue, + frame=off, + offset=none, + align={right,lohi}] + {\hbox spread .5\cutspace + {\hss + \doiftextelse{\placeheadtext[chapter]}% + {\placeheadtext[chapter]}% + {\placeheadtext[title]}% + \hss}\space + \vskip.5cm} + +\stopsetups +\stoptyping + +Definitions like these may look complicated but in practice you will construct +them piece|-|wise. + +\starttyping +\startsetups chapter:number + + \setlayerframed + [chapter] + [x=\dimexpr\makeupwidth+\cutspace\relax, + y=\vsize, + location={left,bottom}] + [width=\dimexpr\cutspace-\rightmargindistance\relax, + height=\dimexpr\cutspace-\rightmargindistance\relax, + foregroundcolor=white, + background=color, + backgroundcolor=red, + frame=off, + offset=none, + align={middle,lohi}] + {\hbox to \hsize + {\hskip.5cm\hss + \doifmode{*bodypart}{\placeheadnumber[chapter]}% + \hss}} + +\stopsetups +\stoptyping + +The finishing touch is just a dummy frame with the chapter background. We could +have used the header text background instead. + +\starttyping +\startsetups chapter:finish + + \framed + [width=\makeupwidth, + height=\headerheight, + background=chapter, + frame=off] + {} + +\stopsetups +\stoptyping + +As the title of this manual suggests: it's in the details. Most of our time is +spent in optimizing spacing issues. If you're designing the layout yourself, for +a large part you can fall back on the consistent spacing provided by \TEX, i.e.\ +think in terms of \type {em}'s, \type {ex}'s and fractions or multiples of \type +{\bodyfontsize}, as well as base you're dimensions on those provided by the +layout. When dealing with translating a \DTP\ layout into something \TEX, +definitions like the above will often look more messy. + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/details/details-pseudocolumns.tex b/doc/context/sources/general/manuals/details/details-pseudocolumns.tex new file mode 100644 index 000000000..f30ffaeab --- /dev/null +++ b/doc/context/sources/general/manuals/details/details-pseudocolumns.tex @@ -0,0 +1,155 @@ +% language=uk + +\environment details-environment + +\startcomponent details-pseudocolumns + +\start \page[right] + +\definelayout + [temp] + [columndistance=12pt, + columns=3] + +\setuplayout + [temp] + +\startchapter[title={Pseudo columns}] + +\index {grid snapping+columns} +\index {pseudo columns} +\index {layers} +\index {backgrounds} + +In desk top publishing applications the grid is pretty dominant in defining +layouts. On the other hand, \TEX\ is pretty good defining layouts in terms of +relative dimensions. This means that mapping a desk top publishing layout into +its \TEX\ (or \CONTEXT) counterpart takes some effort. For what it's worth, +personally I don't like grids that much, specially not in complex documents, +unless one makes sure that all elements are suitable sized for the grid used. + +We not only have to deal with vertical grids, but also with horizontal ones. Here +we focus on the second category. When implementing designs, it is best first to +look into the normal page layout areas. For most documents these are sufficient, +but occasionally we need a more detailed approach. + +When playing with grids, you need to make sure that grid snapping is turned on. +It helps if you turn on the grid so that you can see where things end up. When a +horizontal grid is defined, gray vertical rules show their boundaries. + +\starttyping +\setuplayout[grid=yes] \showgrid +\stoptyping + +The \type {\setuplayout} command has a few settings that have to do with so +called pseudo columns. These are in no sense related to multi|-|column +typesetting and only play a role in placing text on specific locations. + +\starttyping +\setuplayout + [columndistance=12pt, + columns=3] +\stoptyping + +You can use \type {\layoutcolumnoffset} for positioning relative to the left +boundary of the running text: + +\startbuffer +\hskip\layoutcolumnoffset{2}{\red Text positioned in column 2!} +\stopbuffer + +\typebuffer \getbuffer + +This mechanism is actually meant to ease the definition of complicated (title) +pages where many text and graphic elements need to be anchored at well defined +places. The layer mechanism is the most natural candidate for this. + +\startbuffer +\definelayer [text] \setupbackgrounds [text] [background=text] +\stopbuffer + +\typebuffer + +When anchoring elements on a layer, you can specify absolute positions using the +\type {x} and \type {y} keys but grid based positioning is possible with the +\type {column} and \type {line} keys. We need to pass \type {grid} as location +specifier. + +\startbuffer +\setlayer[text][column=1,line=48,location=grid]{these are not} +\setlayer[text][column=2,line=47,location=grid]{real columns} +\setlayer[text][column=3,line=48,location=grid]{but fake ones} +\stopbuffer + +\typebuffer \getbuffer + +\page + +\startbuffer +\setlayer [text] [column=1,line=32,location=grid] + {\ruledvtop {\hsize\layoutcolumnwidth + \style[regular:3]{nitty\par gritty}}} + +\setlayer [text] [column=2,line=37,location=grid] + {\ruledvbox {\hsize\layoutcolumnwidth + \style[regular:3]{nitty\par gritty}}} + +\setlayer [text] [column=3,line=42,location=grid] + {\ruledvcenter {\hsize\layoutcolumnwidth + \style[regular:3]{nitty\par gritty}}} +\stopbuffer + +\typebuffer \getbuffer + +The data that goes into the layer is collected and flushed as soon as \TEX\ +builds the page. The buffer associated to the layer is then ready for new data +(for the next page). + +In this example, you can see that the baselines of the boxes (here visualized by +dashed rules) are put at the specified lines. You can use the \TEX\ box commands +\type {\vbox}, \type {\vtop} and \type {\vcenter} to specify where the main +baseline of the box content is positioned (at the top or bottom line, or +centered). + +\startbuffer +\setlayer + [text] + [column=2,line=48,x=\layoutcolumnwidth,location=left] + {\framed + [background=color,backgroundcolor=red, + foregroundstyle=regular:2,foregroundcolor=white, + frame=off] + {Why ain't I framed?}} +\stopbuffer + +\typebuffer \getbuffer + +\page + +On the previous page we demonstrated a more complicated call to \type {\setlayer} +and more features will be introduced in later chapters. We position the framed +text in column~2 and at line~48. In addition we shift the text over the pseudo +column width, i.e. we position the text at the right of the column. The location +specifier aligns the text left from the point of positioning. + +When we have set up the pseudo columns, we have access to a couple of variables: + +\starttabulate[|l|l|l|] +\NC \type {\layoutcolumns} \NC counter \NC number of columns \NC \NR +\NC \type {\layoutlines} \NC counter \NC number of gridlines \NC \NR +\NC \type {\layoutcolumnwidth} \NC dimension \NC width of one column \NC \NR +\NC \type {\layoutcolumnoffset{n}} \NC macro \NC position of column n \NC \NR +\stoptabulate + +This is typically a feature that has been there for quite a while but that I forget +about. It's probably because I never have to use grids myself. + +In the examples before we used some predefined (font) styles: + +\typebuffer[regular:sizes] + +\page \setuplayout[reset] \stop + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/details/details-snappingheads.tex b/doc/context/sources/general/manuals/details/details-snappingheads.tex new file mode 100644 index 000000000..26f4dfbc4 --- /dev/null +++ b/doc/context/sources/general/manuals/details/details-snappingheads.tex @@ -0,0 +1,276 @@ +% language=uk + +\environment details-environment + +\startcomponent details-snappingheads + +\startchapter[title={Snapping heads}] + +The grid snapper in \MKIV\ is quite different from the one in \MKII. For not too +complex layouts the old grid snapper was quite ok, but the new one should be a +bit more robust. In the old situation the running text was assumed to fit on the +grid and the normal baseline skip should do the job in combination with the grid +aware spacing features and placement mechanisms like tables and figures. + +Snapping on a fixed grid is sort of counter intuitive in \TEX\ because it has an a +advanced spacing model with glue. Publishers however love grids so we do need to +support it. Of course when complex layouts are involved in a later stage of +document preparation the grid is often abandoned. This manual uses the grid but I +personally never use the grid. There are better ways to make your document look +good and often a grid snapped document doesn't look that great anyway, because +all elements should somehow fit in multiples of the line height. + +The \MKIV\ snapper does more analysis and therefore can compensate for the more +nasty cases. Of course it can still fail but we hope to fix those cases when we +run into them. Grids are controlled by keywords or a combination of them. + +\starttabulate[|tCT{blue}||] +\NC none \NC don't enlarge \NC \NR +\NC halfline \NC enlarge by halfline/halfline \NC \NR +\NC line \NC enlarge by line/line \NC \NR +\NC strut \NC enlarge by ht/dp (default) \NC \NR +\NC first \NC align to top line \NC \NR +\NC last \NC align to bottom line \NC \NR +\NC mindepth \NC round depth down \NC \NR +\NC maxdepth \NC round depth up \NC \NR +\NC minheight \NC round height down \NC \NR +\NC maxheight \NC round height up \NC \NR +\NC local \NC use local interline space \NC \NR +\NC offset:-3tp \NC vertical shift within box \NC \NR +\NC bottom:lines \NC \NC \NR +\NC top:lines \NC \NC \NR +\NC box \NC centers a box rounded upwards (box:.5 -> tolerance) \NC \NR +\NC min \NC centers a box rounded downwards \NC \NR +\NC max \NC centers a box rounded upwards \NC \NR +\stoptabulate + +We combine these directives in so called grid options: + +\starttyping +\definegridsnapping [normal] [maxheight,maxdepth,strut] +\definegridsnapping [standard] [maxheight,maxdepth,strut] +\definegridsnapping [yes] [maxheight,maxdepth,strut] + +\definegridsnapping [strict] [maxdepth:0.8,maxheight:0.8,strut] +\definegridsnapping [tolerant] [maxdepth:1.2,maxheight:1.2,strut] +\definegridsnapping [math] [maxdepth:1.05,maxheight:1.05,strut] + +\definegridsnapping [top] [minheight,maxdepth,strut] +\definegridsnapping [bottom] [maxheight,mindepth,strut] +\definegridsnapping [both] [minheight,mindepth,strut] + +\definegridsnapping [broad] [maxheight,maxdepth,strut,0.8] +\definegridsnapping [fit] [maxheight,maxdepth,strut,1.2] + +\definegridsnapping [first] [first] +\definegridsnapping [last] [last] +\definegridsnapping [high] [minheight,maxdepth,none] +\definegridsnapping [one] [minheight,mindepth] +\definegridsnapping [low] [maxheight,mindepth,none] +\definegridsnapping [none] [none] +\definegridsnapping [line] [line] +\definegridsnapping [strut] [strut] +\definegridsnapping [box] [box] +\definegridsnapping [min] [min] +\definegridsnapping [max] [max] + +\definegridsnapping [middle] [maxheight,maxdepth] +\stoptyping + +As you can see, keys like \type {maxdepth} can take a criterium as extra detail, +separated by a colon. These options look obscure and often you need to trial and +error a bit to get what you want. This is no real problem because most cases are +handles automatically. Only headings and structuring elements that exceed a +line height might need some treatment. For instance you might want to be more +tolerant for (fractions of) a point overflow or when you know that always a blank +follows you can decide to limit the height of some element to a line. Some of +the options, like \type {math} and \type {middle} are used internally. + +On the next pages we show how the \type {maxheight} and \type {maxdepth} +fractions work on a sample line. + +\page + +\bgroup + \page + \enabledirectives[visualizers.fraction=.5] + \dostepwiserecurse {0} {10} {1} { + \edef\one{\ifnum#1=10 10\else0.#1\fi} + \dostepwiserecurse {0} {10} {1} { + \edef\two{\ifnum##1=10 10\else0.##1\fi} + \definegridsnapping [test:\one:\two][maxdepth:\one,maxheight:\two,strut] + \par + \blackrule[height=1pt,depth=1pt,width=\textwidth,color=green] + \par + \par + \snaptogrid[test:\one:\two] + \ruledhbox{\backgroundline[red]{\white\bf maxdepth:\one,maxheight:\two}} + \par + } + } + \par + \blackrule[height=1pt,depth=1pt,width=\textwidth,color=green] + \par + \page + \enabledirectives[visualizers.fraction] +\egroup + +Next we show some of the options in action. For practical reasons we start a new +page each time. The sample is input as: + +\startbuffer +\bf none \par +\bfb \hskip2cm none \par +\bfd \hskip6cm none \par +\bf test \par +\bfb \hskip2cm test \par +\bfd \hskip6cm test \par +\bf grid \par +\bfb \hskip2cm grid \par +\bfd \hskip6cm grid \par +\bf \strut strut \par +\bfb \hskip2cm \strut strut \par +\bfd \hskip6cm \strut strut \par +\bfb \hskip2cm \setstrut \strut setstrut \par +\bfd \hskip6cm \setstrut \strut setstrut \par +\stopbuffer + +\typebuffer + +\unexpanded\def\SampleGrid#1% + {\page + \section{Grid snapping method \quotation{#1}} + This is just a line to start with but next we % + show what method \type {#1} does. \par + \start + \setuplayout[grid=#1] % the demo value + \showstruts + \getbuffer + \stop + And here we end the demo. + \setuplayout[grid=yes] % the document default + \page} + +\SampleGrid{normal} +\SampleGrid{strict} +\SampleGrid{tolerant} +\SampleGrid{top} +\SampleGrid{bottom} +\SampleGrid{both} +\SampleGrid{broad} +\SampleGrid{fit} +\SampleGrid{first} +\SampleGrid{last} +\SampleGrid{high} +\SampleGrid{one} +\SampleGrid{low} +\SampleGrid{none} +\SampleGrid{line} +\SampleGrid{strut} +\SampleGrid{box} +\SampleGrid{min} +\SampleGrid{max} +\SampleGrid{middle} + +We now come to the topic of this chapter: snapping heads. The problem with +section heads is that they often exceed the line height. Even worse, they can +be more than one line high. + +The next pages show some ways to control snapping around heads. The result can be +confusing, even when we use a font that we assume behaves like a regular style. +For instance in Latin Modern the bold style has larger heights and depths than +the regular style and even 0.1pt can force the snapper to add a line. The +examples use that font. + +The grid option of \type {setuphead} normally takes one keyword that refers to +the local snapper. However, the result gets then snapped again. This is because +the local snapper can use a different line height. Historically the local snapper is +the default but you can force global snapping by prefixing with the \type +{global} keyword. The next table summarizes the ways you can control snapping: + +\starttabulate +\NC \type {(nothing)} \NC local snapping plus global snapping \NC \NR +\NC \type {local} \NC local snapping plus global snapping \NC \NR +\NC \type {foo} \NC local \type {foo} snapping cf.\ font style plus global snapping \NC \NR +\NC \type {local:foo} \NC local \type {foo} snapping cf.\ font style plus global snapping \NC \NR +\NC \type {global} \NC global snapping \NC \NR +\NC \type {global:foo} \NC global \type {foo} snapping \NC \NR +\stoptabulate + +\startbuffer[demo] +\setuppapersize + [A5][A5] + +\setuplayout + [grid=yes, + width=middle, + height=middle, + backspace=1cm, + topspace=2mm, + lines=38, + bottomspace=2mm, + footer=0cm, + header=4mm, + headerdistance=5mm] + +\definehead + [MyHead] + [subsubsubject] + [style=\tf, + textstyle=, + numberstyle=, + before=, + after=] + +\showgrid + +\starttext + +\starttexdefinition TestHead #1 + \page + \setupheadertexts[\type{#1}] + \setuphead[MyHead][grid={#1},style=\tf,interlinespace=] + \MyHead{some head 1.1} + \hskip1cm line following 1.1 + \MyHead{some head 1.2} + \hskip1cm line following 1.2 + \MyHead{some head 1.3a\par some head 1.3b} + \hskip1cm line following 1.3 + \setuphead[MyHead][grid={#1},style=\bf,interlinespace=] + \MyHead{some head 2.1} + \hskip1cm line following 2.1 + \MyHead{some head 2.2} + \hskip1cm line following 2.2 + \MyHead{some head 2.3a\par some head 2.3b} + \hskip1cm line following 2.3 + \setuphead[MyHead][grid=,style=\bf,interlinespace=4ex] + \MyHead{some head 3.1} + \hskip1cm line following 3.1 + \MyHead{some head 3.2} + \hskip1cm line following 3.2 + \MyHead{some head 3.3a\par some head 3.3b} + \hskip1cm line following 3.3 + \setuphead[MyHead][grid={#1},style=\bfb,interlinespace=] + \MyHead{some head 4.1} + \hskip1cm line following 4.1 + \MyHead{some head 4.2} + \hskip1cm line following 4.2 + \page +\stoptexdefinition + +\TestHead{yes} +\TestHead{tolerant} +\TestHead{global:tolerant} + +\stoptext +\stopbuffer + +\typebuffer + +\placefigure[page]{}{\typesetbuffer[demo][page=1,background=color,backgroundcolor=white,width=\textwidth]} +\placefigure[page]{}{\typesetbuffer[demo][page=2,background=color,backgroundcolor=white,width=\textwidth]} +\placefigure[page]{}{\typesetbuffer[demo][page=3,background=color,backgroundcolor=white,width=\textwidth]} + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/details/details-textbackgrounds.tex b/doc/context/sources/general/manuals/details/details-textbackgrounds.tex new file mode 100644 index 000000000..0f3962fff --- /dev/null +++ b/doc/context/sources/general/manuals/details/details-textbackgrounds.tex @@ -0,0 +1,687 @@ +% language=uk + +\environment details-environment + +\startcomponent details-textbackgrounds + +\start \setuphead [chapter] [after=] \startchapter[title={Backgrounds behind text}] + +\startbuffer[setup-a] +\definetextbackground + [intro] + [backgroundcolor=infogray, + backgroundoffset=.25cm, + frame=off, + location=paragraph, + color=red] +\stopbuffer + +\startbuffer[setup-b] +\definetextbackground + [subintro] + [backgroundcolor=textgray, + backgroundoffset=0pt, + frame=off, + location=text, + color=blue] +\stopbuffer + +\startbuffer[demo-a] +\starttextbackground[intro] +A rather common way to draw attention to a passage, is to add a +background. In this chapter we will therefore discuss how to enhance your +document with \starttextbackground [subintro] those colorful areas that either +or not follow the shape of your paragraph. \stoptextbackground\ Be +warned: this chapter has so many backgrounds that you might start to +dislike them. +\stoptextbackground +\stopbuffer + +\getbuffer[setup-a,setup-b,demo-a] + +\blank + +In the previous paragraph we demonstrated two important features of the +background handler: you can nest backgrounds and backgrounds can be tight or +wide. Features like this will often be used in combination with others, like +special section headers. The raw coding of the previous paragraph is therefore +not representative. + +\typebuffer[demo-a] + +The outer background commands is defined as follows: + +\typebuffer[setup-a] + +Here, the \type {paragraph} option ensures that the background covers the width +of the body text. The inner background is defined in a similar way, but this time +we choose \type {text} location. + +\typebuffer[setup-b] + +In this document we use protruding characters (hanging punctuation) so we've +chosen a rather large offset, one that also matches the rest of the page design. + +Those who are familiar with the way \TEX\ works will probably see what problems +can occur with backgrounds like this. What happens for instance when we cross +page boundaries, and how will more complicated paragraph shapes be handled? + +The current implementation tries to handle page breaks and paragraph shapes as +good as possible. This works well in normal one||column mode as well as in +columns. + +\startbuffer[setup-c] +\definetextbackground [A] [backgroundcolor=infogray] +\definetextbackground [B] [backgroundcolor=textgray] + +\setuptextbackground + [backgroundoffset=0pt, + offset=0pt, + frame=off, + location=text] +\stopbuffer + +\getbuffer[setup-c] + +\startbuffer[demo-b] +\placefigure[left]{}{\externalfigure[detcow][width=2cm]} + +\starttextbackground [A] + In this example, the paragraph shape is determined by the graphic placed + left of the text. + \starttextbackground [B] + This feature is implemented using the \type {\hangindent} and \type + {\hangafter} primitives, which means that we need to keep track of + their state. In addition, we need to handle the indentation directives + \type {\leftskip}, \type {\rightskip} and \type {\parindent}. + \stoptextbackground\ + Because backgrounds end up in a different background overlay, nesting + them is no problem, and it is even possible to move them to the front + and back, as we will demonstrate later on. While the mechanism discussed + here will always be improved when we find border cases, the fundaments + it is built upon are quite stable. +\stoptextbackground +\stopbuffer + +{\setupalign[nothanging]\getbuffer[demo-b]\par} + +\typebuffer[demo-b] + +The backgrounds were defined as: + +\typebuffer[setup-c] + +\startbuffer[setup-d] +\setuptextbackground [B] [backgroundcolor=darkgray,level=+2] +\stopbuffer + +{\setupalign[nothanging]\getbuffer[setup-d,demo-b]\par} + +This time we moved the inner background a few levels up. By default they reside +at \type {level=-1}. This way, by using a non transparent color, we can hide +information. + +\typebuffer[setup-d] + +Unless you mess around too much with boxes, backgrounds work as expected in most +situations. According to the Merriam||Webster on the authors laptop: + +\startbuffer +\starttabulate[|l|p|l|] +\NC background \NC \starttextbackground [A] the part of a + painting representing what lies behind objects is the + \starttextbackground [B] foreground \stoptextbackground + \stoptextbackground \NC one \NC \NR +\TB [halfline] +\NC foreground \NC \starttextbackground [A] the part of a + scene or representation that is nearest to and in front + of the \starttextbackground [B] spectator + \stoptextbackground \stoptextbackground \NC two \NC \NR +\TB [halfline] +\NC spectator \NC \starttextbackground [A] one who looks + on or watches \stoptextbackground \NC three \NC \NR +\stoptabulate +\stopbuffer + +\getbuffer + +This is coded similar to normal running text. A table like this is in a way still +part of the text flow. As floating body (see \in {table} [tab:back]) it can +virtually end up everywhere. We add a frame to make clear where the boundaries are. + +\start + + \setupfloat + [table] + [frame=on,framecolor=red,rulethickness=1pt] + + \placetable + [here] [tab:back] + {} {\hsize.75\textwidth\getbuffer} + + \definefloat + [mytable] + [table] + + \setupfloat + [mytable] + [leftmargindistance=-\innermargintotal] + + \placemytable + [left,high,low] + [tab:back-m] + {} + {\hsize.5\textwidth\getbuffer} + + Keeping track of the state of a paragraph in a table in combination with + background is not entirely trivial. The current implementation evolved from + less clever ones and, unless you start doing complicated box manipulations + with the float content, works quite well. One reason why we made backgrounds + work in tables (and especially floating tables) is that is was needed for + typesetting books for primary and secundary education. In there, we want to + be able to hide the answers that students are supposed to fill in. + + \flushsidefloats + +\stop + +In \in {figure} [fig:columns:1] you can see an advanced example of backgrounds +running over columns. If you look carefully, you will notice that the background +depends on the kind of background at hand: + +\startitemize[n,packed] +\item the text starts and flows on +\item the text flows on (or stands alone) +\item the text flows on and ends +\stopitemize + +This information is available when you want to draw your own backgrounds. Here +the graphic was defined as follows: + +\startplacefigure [reference=fig:columns:1] + \startcombination[4*1] + {\externalfigure[back-4.pdf][page=1,width=\distributedhsize\textwidth\emwidth4]}{Page 1} + {\externalfigure[back-4.pdf][page=2,width=\distributedhsize\textwidth\emwidth4]}{Page 2} + {\externalfigure[back-4.pdf][page=3,width=\distributedhsize\textwidth\emwidth4]}{Page 3} + {\externalfigure[back-4.pdf][page=4,width=\distributedhsize\textwidth\emwidth4]}{Page 4} + \stopcombination +\stopplacefigure + +\starttyping +\startuseMPgraphic{mpos:par:color} + for i=1 upto nofmultipars : + fill multipars[i] withcolor + if multikind[i]="single" : "darkgray" ; + elseif multikind[i]="first" : "red" ; + elseif multikind[i]="middle" : "green" ; + elseif multikind[i]="last" : "blue" ; + else : "black" ; + fi ; + endfor ; +\stopuseMPgraphic +\stoptyping + +This graphic is hooked into the background setup by setting the \type {mp} +variable. + +\starttyping +\definetextbackground + [shade] + [location=paragraph, + mp=mpos:par:color, + before=\blank, + after=\blank] +\stoptyping + +A variant is the following. This time we use a shade: + +\starttyping +\startuseMPgraphic{mpos:par:columnset:shade} + numeric h ; + for i=1 upto nofmultipars : + h := bbheight(p) ; + if multikind[i] = "single" : + fill multipars[i] topenlarged -.5h + withshademethod "linear" + withshadedirection shadedup + withcolor boxfillcolor shadedinto .8white ; + fill multipars[i] bottomenlarged -.5h + withshademethod "linear" + withshadedirection shadedup + withcolor .8white shadedinto boxfillcolor ; + elseif multikind[i] = "first" : + fill multipars[i] + withshademethod "linear" + withshadedirection shadedup + withcolor boxfillcolor shadedinto .8white ; + elseif multikind[i] = "middle" : + fill multipars[i] topenlarged -.5h + withshademethod "linear" + withshadedirection shadedup + withcolor boxfillcolor shadedinto .8white ; + fill multipars[i] bottomenlarged -.5h + withshademethod "linear" + withshadedirection shadedup + withcolor .8white shadedinto boxfillcolor ; + elseif multikind[i] = "last" : + fill multipars[i] + withshademethod "linear" + withshadedirection shadedup + withcolor .8white shadedinto boxfillcolor ; + fi ; + endfor ; +\stopuseMPgraphic +\stoptyping + +When we hook it into the background we get \in {figure} [fig:columns:2] as result: + +\starttyping +\definetextbackground + [shade] + [location=paragraph, + backgroundcolor=shadecolor, + mp=mpos:par:columnset:shade, + before=\blank, + after=\blank] +\stoptyping + +\startplacefigure [reference=fig:columns:2] + \startcombination[4*1] + {\externalfigure[back-5.pdf][page=1,width=\distributedhsize\textwidth\emwidth4]}{Page 1} + {\externalfigure[back-5.pdf][page=2,width=\distributedhsize\textwidth\emwidth4]}{Page 2} + {\externalfigure[back-5.pdf][page=3,width=\distributedhsize\textwidth\emwidth4]}{Page 3} + {\externalfigure[back-5.pdf][page=4,width=\distributedhsize\textwidth\emwidth4]}{Page 4} + \stopcombination +\stopplacefigure + +The complexity of the backgrounds mechanism is partly due to the fact that we +want to use arbitrary \METAPOST\ code to render the background. For instance, we +want to have a proper shape so that not only the filled shape but also the drawn +shape comes out right. You can compare this to a glyph in a font: when rendered +filled the outline can be anything as it will not be drawn but when we use the +outline we can run into overlaps and such. Where glyphs can use the odd|-|even +filling methods, background can only use that for simple cases. + +When a background is rectangular it's all quite easy but as soon as some holes +occur we need to do more work. Holes can be the result of a image placed next to +the running text, or an image flushed at a page break or in the middle of a +background. Paragraph shapes are another example. Backgrounds can cross page +boundaries too. Yet another property is nesting and in such cases the shape is +a bit more complex as we cross lines partially. + +In \MKII\ the background mechanism already was quite useable but it had some +limitations. Calculating the background was mostly delegated to \METAPOST\ which +is reasonable. In \MKIV\ some work is delegated to \LUA\ instead but that doesn't +mean that the code is cleaner or easier to understand. So, to summarize, there +are several cases that we need to take into account, like: + +\startitemize + \startitem + A background can run behind a paragraph in which case the start is + leftmost and end rightmost. In this case inserts (like floats) have to be + dealt with after the shape has been calculated. + \stopitem + \startitem + A background can be in|-|line (the \type {text} location variant) in + which case we need to follow the paragraph shape, if set. In that case we + have a mix of calculating the background shape and afterwards + compensating for inserts. + \stopitem + \startitem + A third case is tabulation and tables where we have dedicated regions to + deal with. When these float we need to make sure that the backgrounds are + adapted to the where they end up. + \stopitem + \startitem + Yet another case is in columns, where we hape multiple regions to deal + with. + \stopitem + \startitem + As mentioned, floats need special treatment and they can be part of the + page flow but also end up left or right of the text (either or not + shifted) but also in the margins, edges, back- or cutspace. Their + placement influences the way backgrounds are calculated so additional + information needs to travel with them. + \stopitem + +\stopitemize + +We distinguish between a paragraph background, which runs between the left and right skip +areas and a text background which follows a shape. In \in {figure} [fig:columns:3] we see a +test case with several such shapes. + +\startplacefigure [reference=fig:columns:3] + \startcombination[4*3] + {\externalfigure[back-2.pdf][page=1, width=\distributedhsize\textwidth\emwidth4]}{Page 1} + {\externalfigure[back-2.pdf][page=2, width=\distributedhsize\textwidth\emwidth4]}{Page 2} + {\externalfigure[back-2.pdf][page=3, width=\distributedhsize\textwidth\emwidth4]}{Page 3} + {\externalfigure[back-2.pdf][page=4, width=\distributedhsize\textwidth\emwidth4]}{Page 4} + {\externalfigure[back-2.pdf][page=5, width=\distributedhsize\textwidth\emwidth4]}{Page 5} + {\externalfigure[back-2.pdf][page=6, width=\distributedhsize\textwidth\emwidth4]}{Page 6} + {\externalfigure[back-2.pdf][page=7, width=\distributedhsize\textwidth\emwidth4]}{Page 7} + {\externalfigure[back-2.pdf][page=8, width=\distributedhsize\textwidth\emwidth4]}{Page 8} + {\externalfigure[back-2.pdf][page=9, width=\distributedhsize\textwidth\emwidth4]}{Page 9} + {\externalfigure[back-2.pdf][page=10,width=\distributedhsize\textwidth\emwidth4]}{Page 10} + {\externalfigure[back-2.pdf][page=11,width=\distributedhsize\textwidth\emwidth4]}{Page 11} + {\externalfigure[back-2.pdf][page=12,width=\distributedhsize\textwidth\emwidth4]}{Page 12} + \stopcombination +\stopplacefigure + +In the case of side floats the following cases occur. Of course multiple such +cases can follow each order so in practice we have to deal with an accumulation. + +\startlinecorrection[blank] +\startMPcode + linejoin := linecap := butt ; + + numeric u ; u := 1mm ; + numeric lw ; lw := u/2 ; + + pickup pencircle scaled 2lw ; + + def example (expr n) (text t) (text l) = + path b ; b := boundingbox image ( + for i=t : draw ( 0u,i*2u) -- (20u,i*2u) ; endfor ; + for i=l : draw ( 0u,i*2u) -- (20u,i*2u) ; endfor ; + ) ; + picture p ; p := image ( + for i=t : draw ( 0u,i*2u) -- (20u,i*2u) ; endfor ; + for i=l : draw (11u,i*2u) -- (20u,i*2u) ; endfor ; + ) ; + setbounds p to b ; + path q ; q := unitsquare xysized(10u,10u) shifted (0,4u) ; + draw image ( + fill boundingbox p leftenlarged -lw rightenlarged -lw withcolor "blue" ; + draw p withcolor .5white ; + fill q withcolor "red" ; + draw textext("\bf " & decimal n) shifted (center q) withcolor white ; + ) shifted ((n-1)*30u,0) ; + enddef ; + + example (1) (1) (2,3,4) ; + example (2) (1,8) (2,3,4,5,6,7) ; + example (3) (8) (5,6,7) ; + example (4) () (3,4,5,6) ; + + currentpicture := currentpicture ysized(3*LineHeight- StrutDepth) ; + +\stopMPcode +\stoplinecorrection + +As often in \TEX\ coming up with a solution is not a the problem but interference +is. You can cook up a solution for one case that fails in another. Backgrounds +fall into this category, as do side floats. In the next pages we will demonstrate +a few cases. In practice you can probably always come up with something that +works out well, but in an automated workflow (like unattended \XML\ to \PDF\ +conversion) you can best play safe. We show some examples on the next pages. + +\blank + +\definetextbackground + [demobg] + [backgroundcolor=blue, + color=white, + frame=off, + location=paragraph] + +\setupfloatcaption + [color=black] + +\definesimulatewords + [demo] + [n=50, + m=\simulatewordsparameter{n}, + min=1, + max=5, + color=text, + line=yes, + random=100] + +\startbuffer +\placefigure + [left] + {case 1} + {\blackrule[width=12cm,height=1cm,color=red]} +\simulatewords[demo][n=10] +\starttextbackground[demobg] + \simulatewords[demo][n=30] +\stoptextbackground +\flushsidefloats + +\blank + +\starttextbackground[demobg] + \simulatewords[demo][n=40] + \placefigure + [left] + {case 2} + {\blackrule[width=12cm,height=1cm,color=red]} + \simulatewords[demo][n=40] +\stoptextbackground +\flushsidefloats + +\blank + +\placefigure + [left] + {case 3} + {\blackrule[width=4cm,height=15mm,color=red]} +\starttextbackground[demobg] + \simulatewords[demo][n=40] +\stoptextbackground +\simulatewords[demo][n=40] +\flushsidefloats + +\blank + +\simulatewords[demo][n=35] +\placefigure + [left] + {case 4} + {\blackrule[width=4cm,height=1cm,color=red]} +\simulatewords[demo][n=20] +\starttextbackground[demobg] + \simulatewords[demo][n=25] +\stoptextbackground +\simulatewords[demo][n=40] +\flushsidefloats + +\blank + +\stopbuffer + +\start \setupwhitespace[none] \getbuffer \stop \blank + +The previous examples were typeset with: + +\typebuffer + +Regular (page flow) floats are a different story. Here we have the problem that a +float might be postpones because there is no room on the current page and they +are moved forward (which is why they're called float). Again we show some +examples. + +% \page + +\startbuffer[sample] +One problem introduced by the internet is that one can view music online. Well, +it's actually not really a problem as it is fun to do, but it does interfere with +development of code: one can enter distraction mode quite easily. +\stopbuffer + +\startbuffer +\starttextbackground[demobg] + \par \getbuffer[sample] \par + \placefigure{}{\blackrule[width=4cm,height=1cm,color=red]} + \par \getbuffer[sample] \par + \placefigure{}{\blackrule[width=4cm,height=3cm,color=red]} + \par \getbuffer[sample] \par + \placefigure{}{\blackrule[width=4cm,height=2cm,color=red]} + \par \getbuffer[sample] \par +\stoptextbackground +\stopbuffer + +\blank \getbuffer \blank + +The input is: + +\typebuffer + +A combination of both background avoiding mechanisms is shown on the next page +(we flush a few more grapohics so that we cross a page boundary): + +% \page + +\startbuffer +\starttextbackground[demobg] + \placefigure{}{\blackrule[width=4cm,height=2cm,color=red]} + \par \input ward \par + \placefigure[left]{}{\blackrule[width=4cm,height=2cm,color=red]} + \par \input ward \par + \placefigure{}{\blackrule[width=4cm,height=2cm,color=red]} + \placefigure{}{\blackrule[width=4cm,height=2cm,color=red]} + \placefigure{}{\blackrule[width=4cm,height=2cm,color=red]} + \placefigure{}{\blackrule[width=4cm,height=2cm,color=red]} + \placefigure{}{\blackrule[width=4cm,height=2cm,color=red]} + \placefigure{}{\blackrule[width=4cm,height=2cm,color=red]} + \par \input ward \par + \placefigure{}{\blackrule[width=4cm,height=2cm,color=red]} + \par \input ward \par +\stoptextbackground +\stopbuffer + +\blank \getbuffer \blank + +This is the result from: + +\typebuffer + +You can control the interaction between backgrounds and floars with the \type +{freeregion} parameter. + +\startbuffer +\starttextbackground[demobg] + \simulatewords[demo][n=40] + \startplacefigure + [location=left, + title={free}] + \blackrule[width=12cm,height=1cm,color=red] + \stopplacefigure + \simulatewords[demo][n=40] + \startplacefigure + [location=left, + title={non|-|free}, + freeregion=no, + color=textcolor] + \blackrule[width=12cm,height=1cm,color=red] + \stopplacefigure + \simulatewords[demo][n=40] + \startplacefigure + [location=here, + title={free}] + \blackrule[width=12cm,height=1cm,color=red] + \stopplacefigure + \simulatewords[demo][n=40] + \startplacefigure + [location=here, + title={non|-|free}, + freeregion=no, + color=textcolor] + \blackrule[width=12cm,height=1cm,color=red] + \stopplacefigure + \simulatewords[demo][n=40] +\stoptextbackground +\stopbuffer + +\typebuffer + +The next pages show the result, first with some tracing enabled sop that you +can see what gets freed. This visual effect is enabled with: + +\starttyping +\enabletrackers[floats.freeregion] +\stoptyping + +We now move to the next page. + +\page + \getbuffer +\page + \enabletrackers[floats.freeregion] + \getbuffer + \disabletrackers[floats.freeregion] +\page + +We have some control over side float placement and of course that will interfere +with backgrounds. Say that we have this: + +\startbuffer +\definefloat + [demofigureleft] + [figure] + [default=left, + margin=1cm, + leftmargindistance=2cm, + rightmargindistance=2cm] + +\definefloat + [demofigureright] + [demofigureleft] + [default=right] +\stopbuffer + +\typebuffer \getbuffer + +Combined with the following we get the result on the next pages. + +\startbuffer +\starttextbackground[demobg] + \startplacefloat[figure][location=left] + \blackrule[width=12cm,height=1cm,color=red] + \stopplacefigure + \simulatewords[demo][n=40] + \blank + \startplacefloat[figure][location=right] + \blackrule[width=12cm,height=1cm,color=red] + \stopplacefigure + \simulatewords[demo][n=40] + \blank + \startplacefloat[demofigureleft] + \blackrule[width=10cm,height=1cm,color=red] + \stopplacefigure + \simulatewords[demo][n=40] + \blank + \startplacefloat[demofigureright] + \blackrule[width=10cm,height=1cm,color=red] + \stopplacefigure + \simulatewords[demo][n=40] + \startplacefloat[figure] % [freeregion=no] + \blackrule[width=12cm,height=1cm,color=red] + \stopplacefigure + \simulatewords[demo][n=40] +\stoptextbackground +\stopbuffer + +\typebuffer + +\page + +\start + \enabletrackers[floats.freeregion] + \setupwhitespace[none] + \getbuffer + \disabletrackers[floats.freeregion] +\stop + +\page + +\start + \setupwhitespace[none] + \getbuffer +\stop + +\page + +\stop \stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/details/details-tuningformulas.tex b/doc/context/sources/general/manuals/details/details-tuningformulas.tex new file mode 100644 index 000000000..b36320769 --- /dev/null +++ b/doc/context/sources/general/manuals/details/details-tuningformulas.tex @@ -0,0 +1,212 @@ +% language=uk + +\environment details-environment + +\startcomponent details-tuningformulas + +\startchapter[title={Tuning math formulas}] + +Because of its look and feel, a math formula can look too widely spaced when put +on a grid. There are a few ways to control this. First of all, the default grid +option bound to math is already more tolerant. But you can control it locally +too. Take the following formula: + +\startbuffer +\startformula + a = b^c +\stopformula +\stopbuffer + +\blank \fakeline \getbuffer \fakeline \blank + +This has been entered as: + +\typebuffer + +and because it is just a line of math it comes out as expected. The next code + +\startbuffer +\startformula + a = \frac {a} {b} +\stopformula +\stopbuffer + +\typebuffer + +produces a higher line: + +\blank \fakeline \getbuffer \fakeline \blank + +as does: + +\startbuffer +\startformula + a = \frac {\frac {b} {c}} {\frac {d} {e}} +\stopformula +\stopbuffer + +\typebuffer + +\blank \fakeline \getbuffer \fakeline \blank + +We will now demonstrate three ways to compensate fo rexcessive spacing. The first +variant just sets a grid parameter: + +\startbuffer +\startformula[grid=math:-halfline] + a = \frac {\frac {b} {c}} {\frac {d} {e}} +\stopformula +\stopbuffer + +\typebuffer + +\blank \fakeline \getbuffer \fakeline \blank + +You can also pass this as an option. Only a few such grid related options are +defined: \type {halfline}, \type {line}, \type {-halfline} and \type {-grid}. + +\startbuffer +\startformula[-halfline] + a = \frac {\frac {b} {c}} {\frac {d} {e}} +\stopformula +\stopbuffer + +\typebuffer + +\blank \fakeline \getbuffer \fakeline \blank + +If you need to compensate frequently you can consider defining an instance: + +\startbuffer +\defineformula[tight][grid=math:-halfline] + +\starttightformula + a = \frac {\frac {b} {c}} {\frac {d} {e}} +\stoptightformula +\stopbuffer + +\typebuffer + +\blank \fakeline \getbuffer \fakeline \blank + +The result can be somewhat unexpected at the top and bottom of a page. When we +subtract half a line from the height we can end up above the text area. This is +where the \type {split} directive comes in. So, the compensations are actually +defined as + +\starttabulate[|TCT{blue}|T|] +\NC math \NC \theexpandedsnapperset{math} \NC \NR +\NC math:line \NC \theexpandedsnapperset{math:line} \NC \NR +\NC math:halfline \NC \theexpandedsnapperset{math:halfline} \NC \NR +\NC math:-line \NC \theexpandedsnapperset{math:-line} \NC \NR +\NC math:-halfline \NC \theexpandedsnapperset{math:-halfline} \NC \NR +\stoptabulate + +You can define your own variants building on top of an existing one: + +\starttyping +\definegridsnapping[math:my][math,....] +\stoptyping + +We demonstrate the effect of the \type {split} directive here. It triggers a +check at the page boundaries but you need to keep in mind that this is not always +robust as such boundaries themselves can be triggered by and inject anything. + +\startbuffer[a] +\dorecurse {15} { + \startformula[grid={math,-halfline}] + a = \frac {\frac {b} {c}} {\frac {d} {e}} + (\hbox{top #1 default}) + \stopformula + \blank[samepage] + \fakeline +} +\stopbuffer + +\startbuffer[b] +\dorecurse {15} { + \startformula[grid={math,-halfline,split}] + a = \frac {\frac {b} {c}} {\frac {d} {e}} + (\hbox{top #1 compensated}) + \stopformula + \blank[samepage] + \fakeline +} +\stopbuffer + +\getbuffer[a] +\getbuffer[b] + +As said, the compensation is achieved with the \type {page} directive. The +previous pages were rendered using: + +\typebuffer[a] + +and + +\typebuffer[b] + +In order to get a consistent result we keep the depth of the formula the same but +effectively shift it down a bit, still honouring the grid. So what about the +bottom. + +We can decide that the snapped formula doesn't fit and force a new page but we +can also accept that it sticks out to the bottom, which is less worse than the +top|-|of|-|the|-|page case. + +\startbuffer[a] +\dorecurse{45}{\fakeline} +\startformula[grid={math,-halfline}] + a = \frac {\frac {b} {c}} {\frac {d} {e}} + (\hbox{bottom default}) +\stopformula +\stopbuffer + +\startbuffer[b] +\dorecurse{45}{\fakeline} +\startformula[grid={math,-halfline,split}] + a = \frac {\frac {b} {c}} {\frac {d} {e}} + (\hbox{bottom compensated}) +\stopformula +\stopbuffer + +\page \getbuffer[a] % fits on the page +\page \getbuffer[b] % forces a new page + +These mechanisms might be improved over time but as we don't use it frequently +that might take a while. + +The following formula was posted at the \CONTEXT\ mailing list in a grid snapping +thread and we will use it to demonstrate how you can mess a bit with the +snapping. + +\startbuffer +g(x_{*}) = \lim_{n\to\infty} g(a_{n}) \leq 0 \leq \lim_{n\to\infty} g(b_{n}) = g(x_{*}) +\stopbuffer + +\typebuffer + +We show the given grid parameter as well as its expansion into the low level grid +directives. + +\unexpanded\def\SampleFormula#1% + {\definegridsnapping[math:temp][#1] + \blank + \type{grid=#1} \hfill expanded: \normalexpanded{\type{\theexpandedsnapperset{math:temp}}} + \blank[samepage] + \fakeline + \blank[samepage] + \startformula[grid={#1}] + \getbuffer + \stopformula + \blank[samepage] + \fakeline + \blank} + +\SampleFormula{math} +\SampleFormula{low,halfline} +\SampleFormula{math,nodepth} + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/details/details.tex b/doc/context/sources/general/manuals/details/details.tex new file mode 100644 index 000000000..6319721e5 --- /dev/null +++ b/doc/context/sources/general/manuals/details/details.tex @@ -0,0 +1,50 @@ +% interface=english modes=screen + +% author : Hans Hagen +% copyright : PRAGMA ADE & ConTeXt Development Team +% license : Creative Commons Attribution ShareAlike 4.0 International +% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions +% origin : the ConTeXt distribution +% +% comment : Because this manual is distributed with TeX distributions it comes with a rather +% liberal license. We try to adapt these documents to upgrades in the (sub)systems +% that they describe. Using parts of the content otherwise can therefore conflict +% with existing functionality and we cannot be held responsible for that. Many of +% the manuals contain characteristic graphics and personal notes or examples that +% make no sense when used out-of-context. +% +% comment : Some chapters might have been published in TugBoat, the NTG Maps, the ConTeXt +% Group journal or otherwise. Thanks to the editors for corrections. Also thanks +% to users for testing, feedback and corrections. + +\startproduct details + +\environment details-environment + +\component details-frontpage + +\startfrontmatter + \component details-introduction + \component details-contents +\stopfrontmatter + +\startbodymatter + \component details-snappingheads + \component details-pseudocolumns + \component details-textbackgrounds + \component details-tuningformulas + \component details-floatingaround + \component details-finetuningfloats + \component details-ornaments + \component details-gridtrickery + \component details-captiontrickery +\stopbodymatter + +\startbackmatter + % \component details-index + \component details-colofon +\stopbackmatter + +\component details-backpage + +\stopproduct diff --git a/doc/context/sources/general/manuals/details/detcow.mp b/doc/context/sources/general/manuals/details/detcow.mp new file mode 100644 index 000000000..18fc570e5 --- /dev/null +++ b/doc/context/sources/general/manuals/details/detcow.mp @@ -0,0 +1,297 @@ +% Converted from PostScript(TM) to MetaPost by pstoedit +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +% MetaPost backend contributed by Scott Pakin <pakin@uiuc.edu> +% pstoedit is Copyright (C) 1993 - 1999 Wolfgang Glunz <wglunz@geocities.com> + +% Generate structured PostScript +prologues := 1; + +% Display a given string with its *baseline* at a given location +% and with a given rotation angle +vardef showtext(expr origin)(expr angle)(expr string) = + draw string infont defaultfont scaled defaultscale + rotated angle shifted origin; +enddef; + +beginfig(1); +drawoptions (withcolor (1,1,1)); +fill (84.3799,618.55)..controls (88.3398,624.38) and (92.5898,622.94)..(96.3398,615.67) + ..controls (101.23,615.6) and (102.46,612.43)..(104.98,610.78) + ..controls (122.62,598.39) and (147.46,607.18)..(167.9,601.92) + ..controls (180.94,598.54) and (190.87,599.76)..(200.09,602.06) + ..controls (220.32,607.25) and (246.1,596.16)..(263.74,603.86) + ..controls (274.75,608.62) and (284.76,605.66)..(292.97,600.91) + ..controls (297.58,597.96) and (299.59,596.09)..(300.96,591.26) + ..controls (306.29,572.54) and (306.29,551.02)..(309.53,530.57) + ..controls (309.53,528.84) and (312.19,526.1)..(312.48,522.07) + ..controls (315.79,511.34) and (316.08,510.12)..(317.16,502.2) + ..controls (317.16,501.34) and (326.52,488.45)..(325.01,479.02) + ..controls (323.93,481.25) and (323.86,482.83)..(321.62,481.68) + ..controls (320.33,479.3) and (320.9,473.9)..(322.56,471.74) + ..controls (320.83,470.81) and (318.46,473.47)..(317.52,475.2) + ..controls (318.17,473.04) and (317.81,470.81)..(316.73,469.3) + ..controls (315.86,472.25) and (316.58,473.18)..(315.36,473.9) + ..controls (313.99,472.9) and (314.21,469.3)..(314.28,466.2) + ..controls (313.49,468.07) and (311.47,472.46)..(312.55,476.42) + ..controls (312.48,484.2) and (308.81,489.1)..(310.32,499.1) + ..controls (310.1,504.43) and (307.3,521.06)..(304.56,524.3) + ..controls (303.12,526.25) and (306.36,510.77)..(306.36,506.16) + ..controls (306.65,500.9) and (307.08,468.72)..(306.43,463.1) + ..controls (306.43,459.22) and (306.22,453.96)..(307.08,452.16) + ..controls (308.74,450.79) and (309.38,450.5)..(309.6,447.98) + ..controls (309.24,446.62) and (308.74,446.04)..(307.73,445.54) + ..controls (306.07,444.6) and (307.37,441.79)..(306.07,439.85) + ..controls (304.49,438.77) and (304.13,441.86)..(303.34,441.86) + ..controls (302.69,441) and (303.05,437.98)..(302.47,436.18) + ..controls (299.66,433.8) and (292.18,432.5)..(289.15,434.66) + ..controls (289.73,440.64) and (291.74,441.58)..(295.63,446.62) + ..controls (298.66,452.59) and (297,460.94)..(296.93,468.14) + ..controls (295.49,480.38) and (289.22,487.3)..(289.44,496.44) + ..controls (287.86,495.72) and (286.42,494.57)..(284.26,494.86) + ..controls (283.39,489.46) and (286.42,484.56)..(284.83,480.82) + ..controls (281.95,471.96) and (277.06,446.62)..(279,437.76) + ..controls (280.01,434.74) and (278.21,433.15)..(277.06,433.94) + ..controls (276.77,433.94) and (276.55,433.94)..(276.41,433.94) + ..controls (276.41,433.94) and (276.55,431.42)..(275.69,430.92) + ..controls (274.1,430.34) and (273.67,431.71)..(272.66,432.14) + ..controls (271.22,430.85) and (272.52,429.48)..(271.15,428.04) + ..controls (267.19,428.04) and (261.36,425.38)..(257.98,428.26) + ..controls (257.33,434.16) and (263.3,436.68)..(266.47,440.71) + ..controls (268.63,446.62) and (271.08,462.89)..(267.77,474.62) + ..controls (267.77,475.56) and (264.38,485.28)..(261.43,488.66) + ..controls (258.7,487.66) and (257.33,485.5)..(253.22,486.29) + ..controls (252.58,484.34) and (253.3,482.33)..(252.22,480.1) + ..controls (251.86,479.52) and (249.34,478.58)..(249.19,481.39) + ..controls (248.98,483.05) and (248.9,486.36)..(248.26,486.72) + ..controls (243.65,486.72) and (233.71,487.08)..(231.77,493.92) + ..controls (219.89,492.34) and (215.93,491.26)..(206.57,493.42) + ..controls (196.63,489.67) and (183.24,506.16)..(174.53,502.2) + ..controls (172.51,496.15) and (173.09,485.64)..(171.65,481.39) + ..controls (169.34,474.77) and (171.14,467.14)..(171.14,456.41) + ..controls (170.57,455.4) and (169.85,454.46)..(168.48,454.46) + ..controls (168.48,453.1) and (169.34,450.86)..(168.62,449.42) + ..controls (167.18,447.62) and (165.89,451.8)..(165.02,444.6) + ..controls (163.15,443.74) and (157.75,442.22)..(155.59,445.18) + ..controls (155.88,448.99) and (158.33,451.3)..(160.13,453.38) + ..controls (161.42,456.91) and (160.99,458.28)..(160.7,461.81) + ..controls (160.99,464.98) and (161.71,468.58)..(161.86,470.09) + ..controls (161.86,473.04) and (162.5,479.3)..(161.14,481.18) + --(159.41,482.69)..controls (157.18,487.22) and (158.33,494.64)..(157.61,500.26) + ..controls (155.81,500.69) and (155.81,500.98)..(154.01,498.31) + ..controls (154.01,494.42) and (153.5,486.36)..(152.35,483.84) + ..controls (149.69,479.81) and (150.84,459.65)..(151.42,448.56) + ..controls (151.78,446.47) and (149.69,447.7)..(149.76,444.74) + ..controls (150.05,442.8) and (147.89,443.59)..(146.09,444.6) + ..controls (145.15,445.18) and (146.59,439.78)..(145.37,439.56) + ..controls (142.34,438.84) and (136.87,438.19)..(135.22,440.71) + ..controls (134.57,444.6) and (137.88,448.06)..(140.62,451.01) + ..controls (143.14,455.83) and (140.9,465.7)..(140.47,476.28) + --(138.89,478.22)..controls (134.86,483.19) and (139.61,496.94)..(136.51,506.23) + ..controls (120.02,514.87) and (122.11,519.19)..(118.73,537.62) + ..controls (115.13,557.64) and (93.3799,567.65)..(79.0598,567.65) + ..controls (73.4399,563.04) and (66.24,563.62)..(58.5398,567.65) + ..controls (55.6599,569.23) and (54.4299,573.19)..(54.5,576.5) + ..controls (52.6299,580.75) and (55.22,582.19)..(59.6199,583.49) + ..controls (62.71,587.81) and (68.6199,594.65)..(69.1899,597.74) + ..controls (70.3398,601.92) and (75.5298,608.11)..(77.7598,609.77) + ..controls (75.8198,613.01) and (74.8098,615.17)..(77.1099,618.55) + ..controls (79.5598,620.14) and (81.7898,616.61)..(84.3799,618.55) + --cycle; +drawoptions (withcolor (0,0,0)); +pickup pencircle scaled 0.636492bp; +draw (84.3799,618.55)..controls (88.3398,624.38) and (92.5898,622.94)..(96.3398,615.67) + ..controls (101.23,615.6) and (102.46,612.43)..(104.98,610.78) + ..controls (122.62,598.39) and (147.46,607.18)..(167.9,601.92) + ..controls (180.94,598.54) and (190.87,599.76)..(200.09,602.06) + ..controls (220.32,607.25) and (246.1,596.16)..(263.74,603.86) + ..controls (274.75,608.62) and (284.76,605.66)..(292.97,600.91) + ..controls (297.58,597.96) and (299.59,596.09)..(300.96,591.26) + ..controls (306.29,572.54) and (306.29,551.02)..(309.53,530.57) + ..controls (309.53,528.84) and (312.19,526.1)..(312.48,522.07) + ..controls (315.79,511.34) and (316.08,510.12)..(317.16,502.2) + ..controls (317.16,501.34) and (326.52,488.45)..(325.01,479.02) + ..controls (323.93,481.25) and (323.86,482.83)..(321.62,481.68) + ..controls (320.33,479.3) and (320.9,473.9)..(322.56,471.74) + ..controls (320.83,470.81) and (318.46,473.47)..(317.52,475.2) + ..controls (318.17,473.04) and (317.81,470.81)..(316.73,469.3) + ..controls (315.86,472.25) and (316.58,473.18)..(315.36,473.9) + ..controls (313.99,472.9) and (314.21,469.3)..(314.28,466.2) + ..controls (313.49,468.07) and (311.47,472.46)..(312.55,476.42) + ..controls (312.48,484.2) and (308.81,489.1)..(310.32,499.1) + ..controls (310.1,504.43) and (307.3,521.06)..(304.56,524.3) + ..controls (303.12,526.25) and (306.36,510.77)..(306.36,506.16) + ..controls (306.65,500.9) and (307.08,468.72)..(306.43,463.1) + ..controls (306.43,459.22) and (306.22,453.96)..(307.08,452.16) + ..controls (308.74,450.79) and (309.38,450.5)..(309.6,447.98) + ..controls (309.24,446.62) and (308.74,446.04)..(307.73,445.54) + ..controls (306.07,444.6) and (307.37,441.79)..(306.07,439.85) + ..controls (304.49,438.77) and (304.13,441.86)..(303.34,441.86) + ..controls (302.69,441) and (303.05,437.98)..(302.47,436.18) + ..controls (299.66,433.8) and (292.18,432.5)..(289.15,434.66) + ..controls (289.73,440.64) and (291.74,441.58)..(295.63,446.62) + ..controls (298.66,452.59) and (297,460.94)..(296.93,468.14) + ..controls (295.49,480.38) and (289.22,487.3)..(289.44,496.44) + ..controls (287.86,495.72) and (286.42,494.57)..(284.26,494.86) + ..controls (283.39,489.46) and (286.42,484.56)..(284.83,480.82) + ..controls (281.95,471.96) and (277.06,446.62)..(279,437.76) + ..controls (280.01,434.74) and (278.21,433.15)..(277.06,433.94) + ..controls (276.77,433.94) and (276.55,433.94)..(276.41,433.94) + ..controls (276.41,433.94) and (276.55,431.42)..(275.69,430.92) + ..controls (274.1,430.34) and (273.67,431.71)..(272.66,432.14) + ..controls (271.22,430.85) and (272.52,429.48)..(271.15,428.04) + ..controls (267.19,428.04) and (261.36,425.38)..(257.98,428.26) + ..controls (257.33,434.16) and (263.3,436.68)..(266.47,440.71) + ..controls (268.63,446.62) and (271.08,462.89)..(267.77,474.62) + ..controls (267.77,475.56) and (264.38,485.28)..(261.43,488.66) + ..controls (258.7,487.66) and (257.33,485.5)..(253.22,486.29) + ..controls (252.58,484.34) and (253.3,482.33)..(252.22,480.1) + ..controls (251.86,479.52) and (249.34,478.58)..(249.19,481.39) + ..controls (248.98,483.05) and (248.9,486.36)..(248.26,486.72) + ..controls (243.65,486.72) and (233.71,487.08)..(231.77,493.92) + ..controls (219.89,492.34) and (215.93,491.26)..(206.57,493.42) + ..controls (196.63,489.67) and (183.24,506.16)..(174.53,502.2) + ..controls (172.51,496.15) and (173.09,485.64)..(171.65,481.39) + ..controls (169.34,474.77) and (171.14,467.14)..(171.14,456.41) + ..controls (170.57,455.4) and (169.85,454.46)..(168.48,454.46) + ..controls (168.48,453.1) and (169.34,450.86)..(168.62,449.42) + ..controls (167.18,447.62) and (165.89,451.8)..(165.02,444.6) + ..controls (163.15,443.74) and (157.75,442.22)..(155.59,445.18) + ..controls (155.88,448.99) and (158.33,451.3)..(160.13,453.38) + ..controls (161.42,456.91) and (160.99,458.28)..(160.7,461.81) + ..controls (160.99,464.98) and (161.71,468.58)..(161.86,470.09) + ..controls (161.86,473.04) and (162.5,479.3)..(161.14,481.18) + --(159.41,482.69)..controls (157.18,487.22) and (158.33,494.64)..(157.61,500.26) + ..controls (155.81,500.69) and (155.81,500.98)..(154.01,498.31) + ..controls (154.01,494.42) and (153.5,486.36)..(152.35,483.84) + ..controls (149.69,479.81) and (150.84,459.65)..(151.42,448.56) + ..controls (151.78,446.47) and (149.69,447.7)..(149.76,444.74) + ..controls (150.05,442.8) and (147.89,443.59)..(146.09,444.6) + ..controls (145.15,445.18) and (146.59,439.78)..(145.37,439.56) + ..controls (142.34,438.84) and (136.87,438.19)..(135.22,440.71) + ..controls (134.57,444.6) and (137.88,448.06)..(140.62,451.01) + ..controls (143.14,455.83) and (140.9,465.7)..(140.47,476.28) + --(138.89,478.22)..controls (134.86,483.19) and (139.61,496.94)..(136.51,506.23) + ..controls (120.02,514.87) and (122.11,519.19)..(118.73,537.62) + ..controls (115.13,557.64) and (93.3799,567.65)..(79.0598,567.65) + ..controls (73.4399,563.04) and (66.24,563.62)..(58.5398,567.65) + ..controls (55.6599,569.23) and (54.4299,573.19)..(54.5,576.5) + ..controls (52.6299,580.75) and (55.22,582.19)..(59.6199,583.49) + ..controls (62.71,587.81) and (68.6199,594.65)..(69.1899,597.74) + ..controls (70.3398,601.92) and (75.5298,608.11)..(77.7598,609.77) + ..controls (75.8198,613.01) and (74.8098,615.17)..(77.1099,618.55) + ..controls (79.5598,620.14) and (81.7898,616.61)..(84.3799,618.55) + --cycle; +pickup pencircle scaled 0bp; +fill (305.28,560.95)..controls (304.63,560.95) and (299.95,561.24)..(299.38,561.24) + ..controls (302.4,550.44) and (303.98,536.47)..(304.2,525.31) + ..controls (303.7,521.35) and (299.81,517.46)..(299.38,525.67) + ..controls (295.85,530.86) and (296.42,540.07)..(293.4,540.29) + ..controls (287.35,539.64) and (285.34,513.22)..(280.01,509.33) + ..controls (276.26,512.28) and (280.73,524.02)..(275.54,524.74) + ..controls (270.5,524.02) and (264.31,526.68)..(266.69,534.46) + ..controls (270.29,543.02) and (268.34,554.76)..(266.54,561.6) + ..controls (262.37,578.59) and (264.02,587.09)..(271.58,596.09) + --(267.48,604.51)..controls (275.4,608.26) and (285.62,604.58)..(290.02,602.21) + ..controls (294.62,600.26) and (300.24,595.94)..(301.1,587.38) + ..controls (303.34,578.88) and (304.42,569.74)..(305.28,560.95) + --cycle; +fill (245.45,600.34)..controls (242.78,599.4) and (239.62,596.02)..(237.67,594.07) + ..controls (236.74,584.42) and (244.58,583.63)..(250.2,577.44) + ..controls (258.77,573.7) and (251.21,567.72)..(256.18,557.42) + ..controls (257.04,550.94) and (257.9,543.89)..(255.31,539.78) + ..controls (249.48,538.92) and (247.97,540.22)..(246.89,531.43) + ..controls (246.31,526.97) and (231.77,529.06)..(229.03,538.27) + ..controls (227.09,544.97) and (221.33,546.7)..(217.8,543.17) + ..controls (213.77,538.06) and (215.78,531.22)..(217.8,527.47) + ..controls (224.93,517.32) and (212.04,511.42)..(205.13,516.74) + ..controls (199.73,508.68) and (211.39,500.04)..(207.43,494.5) + ..controls (205.78,493.99) and (204.77,489.17)..(185.47,500.54) + ..controls (180.36,504.14) and (167.83,500.76)..(168.77,520.63) + ..controls (168.77,525.82) and (165.6,543.53)..(162.14,555.91) + ..controls (159.41,561.24) and (156.74,559.08)..(156.89,553.9) + ..controls (157.18,547.85) and (162.94,531.22)..(155.52,540.22) + ..controls (153.58,539.21) and (156.89,523.58)..(156.89,521.64) + ..controls (162,517.03) and (157.39,513.58)..(154.73,512.28) + ..controls (151.27,518.33) and (149.62,518.04)..(147.17,514.44) + ..controls (141.7,514.08) and (144.58,528.19)..(140.26,528.62) + ..controls (137.02,527.76) and (139.18,520.06)..(138.24,518.76) + ..controls (132.98,524.74) and (130.9,529.27)..(127.01,521.64) + ..controls (126.14,521.64) and (122.11,519.19)..(120.96,526.54) + ..controls (117.65,552.74) and (107.06,558.36)..(93.8198,565.13) + ..controls (92.0198,565.63) and (84.24,566.71)..(79.3398,568.15) + ..controls (73.5098,560.88) and (58.3198,565.63)..(56.23,570.31) + ..controls (54.7898,572.69) and (54.6499,575.21)..(54.7898,576.5) + ..controls (52.3398,580.1) and (55.8699,582.7)..(59.6199,583.06) + ..controls (62.8599,587.16) and (68.5398,594.94)..(71.2798,601.56) + ..controls (72.2898,603.07) and (74.95,609.34)..(78.1899,609.55) + ..controls (74.95,612.94) and (74.2998,622.51)..(82.6599,617.33) + ..controls (87.1199,624.02) and (92.0898,624.31)..(95.7598,615.82) + ..controls (102.89,615.38) and (102.31,608.69)..(115.78,605.52) + ..controls (122.76,602.86) and (132.77,604.58)..(140.26,603.72) + ..controls (136.22,596.88) and (127.44,566.86)..(132.98,559.8) + ..controls (140.76,564.7) and (141.84,605.38)..(157.03,595.66) + ..controls (160.56,593.93) and (159.91,590.04)..(164.09,590.18) + ..controls (170.42,587.45) and (169.13,600.77)..(172.51,600.77) + ..controls (176.47,599.76) and (183.02,599.04)..(186.98,599.54) + ..controls (197.71,600.77) and (206.93,604.08)..(223.92,602.5) + ..controls (231.12,601.78) and (238.25,601.06)..(245.45,600.34) + --cycle; +pickup pencircle scaled 0.636492bp; +draw (305.28,560.95)..controls (304.63,560.95) and (299.95,561.24)..(299.38,561.24) + ..controls (302.4,550.44) and (303.98,536.47)..(304.2,525.31) + ..controls (303.7,521.35) and (299.81,517.46)..(299.38,525.67) + ..controls (295.85,530.86) and (296.42,540.07)..(293.4,540.29) + ..controls (287.35,539.64) and (285.34,513.22)..(280.01,509.33) + ..controls (276.26,512.28) and (280.73,524.02)..(275.54,524.74) + ..controls (270.5,524.02) and (264.31,526.68)..(266.69,534.46) + ..controls (270.29,543.02) and (268.34,554.76)..(266.54,561.6) + ..controls (262.37,578.59) and (264.02,587.09)..(271.58,596.09) + --(267.48,604.51)..controls (275.4,608.26) and (285.62,604.58)..(290.02,602.21) + ..controls (294.62,600.26) and (300.24,595.94)..(301.1,587.38) + ..controls (303.34,578.88) and (304.42,569.74)..(305.28,560.95) + --cycle; +draw (245.45,600.34)..controls (242.78,599.4) and (239.62,596.02)..(237.67,594.07) + ..controls (236.74,584.42) and (244.58,583.63)..(250.2,577.44) + ..controls (258.77,573.7) and (251.21,567.72)..(256.18,557.42) + ..controls (257.04,550.94) and (257.9,543.89)..(255.31,539.78) + ..controls (249.48,538.92) and (247.97,540.22)..(246.89,531.43) + ..controls (246.31,526.97) and (231.77,529.06)..(229.03,538.27) + ..controls (227.09,544.97) and (221.33,546.7)..(217.8,543.17) + ..controls (213.77,538.06) and (215.78,531.22)..(217.8,527.47) + ..controls (224.93,517.32) and (212.04,511.42)..(205.13,516.74) + ..controls (199.73,508.68) and (211.39,500.04)..(207.43,494.5) + ..controls (205.78,493.99) and (204.77,489.17)..(185.47,500.54) + ..controls (180.36,504.14) and (167.83,500.76)..(168.77,520.63) + ..controls (168.77,525.82) and (165.6,543.53)..(162.14,555.91) + ..controls (159.41,561.24) and (156.74,559.08)..(156.89,553.9) + ..controls (157.18,547.85) and (162.94,531.22)..(155.52,540.22) + ..controls (153.58,539.21) and (156.89,523.58)..(156.89,521.64) + ..controls (162,517.03) and (157.39,513.58)..(154.73,512.28) + ..controls (151.27,518.33) and (149.62,518.04)..(147.17,514.44) + ..controls (141.7,514.08) and (144.58,528.19)..(140.26,528.62) + ..controls (137.02,527.76) and (139.18,520.06)..(138.24,518.76) + ..controls (132.98,524.74) and (130.9,529.27)..(127.01,521.64) + ..controls (126.14,521.64) and (122.11,519.19)..(120.96,526.54) + ..controls (117.65,552.74) and (107.06,558.36)..(93.8198,565.13) + ..controls (92.0198,565.63) and (84.24,566.71)..(79.3398,568.15) + ..controls (73.5098,560.88) and (58.3198,565.63)..(56.23,570.31) + ..controls (54.7898,572.69) and (54.6499,575.21)..(54.7898,576.5) + ..controls (52.3398,580.1) and (55.8699,582.7)..(59.6199,583.06) + ..controls (62.8599,587.16) and (68.5398,594.94)..(71.2798,601.56) + ..controls (72.2898,603.07) and (74.95,609.34)..(78.1899,609.55) + ..controls (74.95,612.94) and (74.2998,622.51)..(82.6599,617.33) + ..controls (87.1199,624.02) and (92.0898,624.31)..(95.7598,615.82) + ..controls (102.89,615.38) and (102.31,608.69)..(115.78,605.52) + ..controls (122.76,602.86) and (132.77,604.58)..(140.26,603.72) + ..controls (136.22,596.88) and (127.44,566.86)..(132.98,559.8) + ..controls (140.76,564.7) and (141.84,605.38)..(157.03,595.66) + ..controls (160.56,593.93) and (159.91,590.04)..(164.09,590.18) + ..controls (170.42,587.45) and (169.13,600.77)..(172.51,600.77) + ..controls (176.47,599.76) and (183.02,599.04)..(186.98,599.54) + ..controls (197.71,600.77) and (206.93,604.08)..(223.92,602.5) + ..controls (231.12,601.78) and (238.25,601.06)..(245.45,600.34) + --cycle; +endfig; +end diff --git a/doc/context/sources/general/manuals/details/detcow.tex b/doc/context/sources/general/manuals/details/detcow.tex new file mode 100644 index 000000000..c3698e335 --- /dev/null +++ b/doc/context/sources/general/manuals/details/detcow.tex @@ -0,0 +1,15 @@ +% content=tex +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\setupcolors[state=start] + +\starttext + +\startMPpage + loadfigure "detcow.mp" ; + refill currentpicture withcolor transparent(1,.5,.5red) ; + redraw currentpicture withcolor .5red ; +\stopMPpage + +\stoptext diff --git a/doc/context/sources/general/manuals/details/detcowmp.mps b/doc/context/sources/general/manuals/details/detcowmp.mps new file mode 100644 index 000000000..c5cb7df80 --- /dev/null +++ b/doc/context/sources/general/manuals/details/detcowmp.mps @@ -0,0 +1,295 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%BoundingBox: 53 426 326 623 +%%Creator: MetaPost +%%CreationDate: 2002.04.10:1235 +%%Pages: 1 +%%EndProlog +%%Page: 1 1 + 1 setgray +newpath 84.3799 618.55 moveto +88.3398 624.38 92.5898 622.94 96.3398 615.67 curveto +101.23 615.6 102.46 612.43 104.98 610.78 curveto +122.62 598.39 147.46 607.18 167.9 601.92 curveto +180.94 598.54 190.87 599.76 200.09 602.06 curveto +220.32 607.25 246.1 596.16 263.74 603.86 curveto +274.75 608.62 284.76 605.66 292.97 600.91 curveto +297.58 597.96 299.59 596.09 300.96 591.26 curveto +306.29 572.54 306.29 551.02 309.53 530.57 curveto +309.53 528.84 312.19 526.1 312.48 522.07 curveto +315.79 511.34 316.08 510.12 317.16 502.2 curveto +317.16 501.34 326.52 488.45 325.01 479.02 curveto +323.93 481.25 323.86 482.83 321.62 481.68 curveto +320.33 479.3 320.9 473.9 322.56 471.74 curveto +320.83 470.81 318.46 473.47 317.52 475.2 curveto +318.17 473.04 317.81 470.81 316.73 469.3 curveto +315.86 472.25 316.58 473.18 315.36 473.9 curveto +313.99 472.9 314.21 469.3 314.28 466.2 curveto +313.49 468.07 311.47 472.46 312.55 476.42 curveto +312.48 484.2 308.81 489.1 310.32 499.1 curveto +310.1 504.43 307.3 521.06 304.56 524.3 curveto +303.12 526.25 306.36 510.77 306.36 506.16 curveto +306.65 500.9 307.08 468.72 306.43 463.1 curveto +306.43 459.22 306.22 453.96 307.08 452.16 curveto +308.74 450.79 309.38 450.5 309.6 447.98 curveto +309.24 446.62 308.74 446.04 307.73 445.54 curveto +306.07 444.6 307.37 441.79 306.07 439.85 curveto +304.49 438.77 304.13 441.86 303.34 441.86 curveto +302.69 441 303.05 437.98 302.47 436.18 curveto +299.66 433.8 292.18 432.5 289.15 434.66 curveto +289.73 440.64 291.74 441.58 295.63 446.62 curveto +298.66 452.59 297 460.94 296.93 468.14 curveto +295.49 480.38 289.22 487.3 289.44 496.44 curveto +287.86 495.72 286.42 494.57 284.26 494.86 curveto +283.39 489.46 286.42 484.56 284.83 480.82 curveto +281.95 471.96 277.06 446.62 279 437.76 curveto +280.01 434.74 278.21 433.15 277.06 433.94 curveto +276.77 433.94 276.55 433.94 276.41 433.94 curveto +276.41 433.94 276.55 431.42 275.69 430.92 curveto +274.1 430.34 273.67 431.71 272.66 432.14 curveto +271.22 430.85 272.52 429.48 271.15 428.04 curveto +267.19 428.04 261.36 425.38 257.98 428.26 curveto +257.33 434.16 263.3 436.68 266.47 440.71 curveto +268.63 446.62 271.08 462.89 267.77 474.62 curveto +267.77 475.56 264.38 485.28 261.43 488.66 curveto +258.7 487.66 257.33 485.5 253.22 486.29 curveto +252.58 484.34 253.3 482.33 252.22 480.1 curveto +251.86 479.52 249.34 478.58 249.19 481.39 curveto +248.98 483.05 248.9 486.36 248.26 486.72 curveto +243.65 486.72 233.71 487.08 231.77 493.92 curveto +219.89 492.34 215.93 491.26 206.57 493.42 curveto +196.63 489.67 183.24 506.16 174.53 502.2 curveto +172.51 496.15 173.09 485.64 171.65 481.39 curveto +169.34 474.77 171.14 467.14 171.14 456.41 curveto +170.57 455.4 169.85 454.46 168.48 454.46 curveto +168.48 453.1 169.34 450.86 168.62 449.42 curveto +167.18 447.62 165.89 451.8 165.02 444.6 curveto +163.15 443.74 157.75 442.22 155.59 445.18 curveto +155.88 448.99 158.33 451.3 160.13 453.38 curveto +161.42 456.91 160.99 458.28 160.7 461.81 curveto +160.99 464.98 161.71 468.58 161.86 470.09 curveto +161.86 473.04 162.5 479.3 161.14 481.18 curveto +159.41 482.69 lineto +157.18 487.22 158.33 494.64 157.61 500.26 curveto +155.81 500.69 155.81 500.98 154.01 498.31 curveto +154.01 494.42 153.5 486.36 152.35 483.84 curveto +149.69 479.81 150.84 459.65 151.42 448.56 curveto +151.78 446.47 149.69 447.7 149.76 444.74 curveto +150.05 442.8 147.89 443.59 146.09 444.6 curveto +145.15 445.18 146.59 439.78 145.37 439.56 curveto +142.34 438.84 136.87 438.19 135.22 440.71 curveto +134.57 444.6 137.88 448.06 140.62 451.01 curveto +143.14 455.83 140.9 465.7 140.47 476.28 curveto +138.89 478.22 lineto +134.86 483.19 139.61 496.94 136.51 506.23 curveto +120.02 514.87 122.11 519.19 118.73 537.62 curveto +115.13 557.64 93.3799 567.65 79.0598 567.65 curveto +73.4399 563.04 66.24 563.62 58.5398 567.65 curveto +55.6599 569.23 54.4299 573.19 54.5 576.5 curveto +52.6299 580.75 55.22 582.19 59.6199 583.49 curveto +62.71 587.81 68.6199 594.65 69.1899 597.74 curveto +70.3398 601.92 75.5298 608.11 77.7598 609.77 curveto +75.8198 613.01 74.8098 615.17 77.1099 618.55 curveto +79.5598 620.14 81.7898 616.61 84.3799 618.55 curveto + closepath fill + 0 setgray 0 0.63649 dtransform truncate idtransform setlinewidth pop [] 0 setdash 1 setlinejoin 10 setmiterlimit +newpath 84.3799 618.55 moveto +88.3398 624.38 92.5898 622.94 96.3398 615.67 curveto +101.23 615.6 102.46 612.43 104.98 610.78 curveto +122.62 598.39 147.46 607.18 167.9 601.92 curveto +180.94 598.54 190.87 599.76 200.09 602.06 curveto +220.32 607.25 246.1 596.16 263.74 603.86 curveto +274.75 608.62 284.76 605.66 292.97 600.91 curveto +297.58 597.96 299.59 596.09 300.96 591.26 curveto +306.29 572.54 306.29 551.02 309.53 530.57 curveto +309.53 528.84 312.19 526.1 312.48 522.07 curveto +315.79 511.34 316.08 510.12 317.16 502.2 curveto +317.16 501.34 326.52 488.45 325.01 479.02 curveto +323.93 481.25 323.86 482.83 321.62 481.68 curveto +320.33 479.3 320.9 473.9 322.56 471.74 curveto +320.83 470.81 318.46 473.47 317.52 475.2 curveto +318.17 473.04 317.81 470.81 316.73 469.3 curveto +315.86 472.25 316.58 473.18 315.36 473.9 curveto +313.99 472.9 314.21 469.3 314.28 466.2 curveto +313.49 468.07 311.47 472.46 312.55 476.42 curveto +312.48 484.2 308.81 489.1 310.32 499.1 curveto +310.1 504.43 307.3 521.06 304.56 524.3 curveto +303.12 526.25 306.36 510.77 306.36 506.16 curveto +306.65 500.9 307.08 468.72 306.43 463.1 curveto +306.43 459.22 306.22 453.96 307.08 452.16 curveto +308.74 450.79 309.38 450.5 309.6 447.98 curveto +309.24 446.62 308.74 446.04 307.73 445.54 curveto +306.07 444.6 307.37 441.79 306.07 439.85 curveto +304.49 438.77 304.13 441.86 303.34 441.86 curveto +302.69 441 303.05 437.98 302.47 436.18 curveto +299.66 433.8 292.18 432.5 289.15 434.66 curveto +289.73 440.64 291.74 441.58 295.63 446.62 curveto +298.66 452.59 297 460.94 296.93 468.14 curveto +295.49 480.38 289.22 487.3 289.44 496.44 curveto +287.86 495.72 286.42 494.57 284.26 494.86 curveto +283.39 489.46 286.42 484.56 284.83 480.82 curveto +281.95 471.96 277.06 446.62 279 437.76 curveto +280.01 434.74 278.21 433.15 277.06 433.94 curveto +276.77 433.94 276.55 433.94 276.41 433.94 curveto +276.41 433.94 276.55 431.42 275.69 430.92 curveto +274.1 430.34 273.67 431.71 272.66 432.14 curveto +271.22 430.85 272.52 429.48 271.15 428.04 curveto +267.19 428.04 261.36 425.38 257.98 428.26 curveto +257.33 434.16 263.3 436.68 266.47 440.71 curveto +268.63 446.62 271.08 462.89 267.77 474.62 curveto +267.77 475.56 264.38 485.28 261.43 488.66 curveto +258.7 487.66 257.33 485.5 253.22 486.29 curveto +252.58 484.34 253.3 482.33 252.22 480.1 curveto +251.86 479.52 249.34 478.58 249.19 481.39 curveto +248.98 483.05 248.9 486.36 248.26 486.72 curveto +243.65 486.72 233.71 487.08 231.77 493.92 curveto +219.89 492.34 215.93 491.26 206.57 493.42 curveto +196.63 489.67 183.24 506.16 174.53 502.2 curveto +172.51 496.15 173.09 485.64 171.65 481.39 curveto +169.34 474.77 171.14 467.14 171.14 456.41 curveto +170.57 455.4 169.85 454.46 168.48 454.46 curveto +168.48 453.1 169.34 450.86 168.62 449.42 curveto +167.18 447.62 165.89 451.8 165.02 444.6 curveto +163.15 443.74 157.75 442.22 155.59 445.18 curveto +155.88 448.99 158.33 451.3 160.13 453.38 curveto +161.42 456.91 160.99 458.28 160.7 461.81 curveto +160.99 464.98 161.71 468.58 161.86 470.09 curveto +161.86 473.04 162.5 479.3 161.14 481.18 curveto +159.41 482.69 lineto +157.18 487.22 158.33 494.64 157.61 500.26 curveto +155.81 500.69 155.81 500.98 154.01 498.31 curveto +154.01 494.42 153.5 486.36 152.35 483.84 curveto +149.69 479.81 150.84 459.65 151.42 448.56 curveto +151.78 446.47 149.69 447.7 149.76 444.74 curveto +150.05 442.8 147.89 443.59 146.09 444.6 curveto +145.15 445.18 146.59 439.78 145.37 439.56 curveto +142.34 438.84 136.87 438.19 135.22 440.71 curveto +134.57 444.6 137.88 448.06 140.62 451.01 curveto +143.14 455.83 140.9 465.7 140.47 476.28 curveto +138.89 478.22 lineto +134.86 483.19 139.61 496.94 136.51 506.23 curveto +120.02 514.87 122.11 519.19 118.73 537.62 curveto +115.13 557.64 93.3799 567.65 79.0598 567.65 curveto +73.4399 563.04 66.24 563.62 58.5398 567.65 curveto +55.6599 569.23 54.4299 573.19 54.5 576.5 curveto +52.6299 580.75 55.22 582.19 59.6199 583.49 curveto +62.71 587.81 68.6199 594.65 69.1899 597.74 curveto +70.3398 601.92 75.5298 608.11 77.7598 609.77 curveto +75.8198 613.01 74.8098 615.17 77.1099 618.55 curveto +79.5598 620.14 81.7898 616.61 84.3799 618.55 curveto + closepath stroke +newpath 305.28 560.95 moveto +304.63 560.95 299.95 561.24 299.38 561.24 curveto +302.4 550.44 303.98 536.47 304.2 525.31 curveto +303.7 521.35 299.81 517.46 299.38 525.67 curveto +295.85 530.86 296.42 540.07 293.4 540.29 curveto +287.35 539.64 285.34 513.22 280.01 509.33 curveto +276.26 512.28 280.73 524.02 275.54 524.74 curveto +270.5 524.02 264.31 526.68 266.69 534.46 curveto +270.29 543.02 268.34 554.76 266.54 561.6 curveto +262.37 578.59 264.02 587.09 271.58 596.09 curveto +267.48 604.51 lineto +275.4 608.26 285.62 604.58 290.02 602.21 curveto +294.62 600.26 300.24 595.94 301.1 587.38 curveto +303.34 578.88 304.42 569.74 305.28 560.95 curveto + closepath fill +newpath 245.45 600.34 moveto +242.78 599.4 239.62 596.02 237.67 594.07 curveto +236.74 584.42 244.58 583.63 250.2 577.44 curveto +258.77 573.7 251.21 567.72 256.18 557.42 curveto +257.04 550.94 257.9 543.89 255.31 539.78 curveto +249.48 538.92 247.97 540.22 246.89 531.43 curveto +246.31 526.97 231.77 529.06 229.03 538.27 curveto +227.09 544.97 221.33 546.7 217.8 543.17 curveto +213.77 538.06 215.78 531.22 217.8 527.47 curveto +224.93 517.32 212.04 511.42 205.13 516.74 curveto +199.73 508.68 211.39 500.04 207.43 494.5 curveto +205.78 493.99 204.77 489.17 185.47 500.54 curveto +180.36 504.14 167.83 500.76 168.77 520.63 curveto +168.77 525.82 165.6 543.53 162.14 555.91 curveto +159.41 561.24 156.74 559.08 156.89 553.9 curveto +157.18 547.85 162.94 531.22 155.52 540.22 curveto +153.58 539.21 156.89 523.58 156.89 521.64 curveto +162 517.03 157.39 513.58 154.73 512.28 curveto +151.27 518.33 149.62 518.04 147.17 514.44 curveto +141.7 514.08 144.58 528.19 140.26 528.62 curveto +137.02 527.76 139.18 520.06 138.24 518.76 curveto +132.98 524.74 130.9 529.27 127.01 521.64 curveto +126.14 521.64 122.11 519.19 120.96 526.54 curveto +117.65 552.74 107.06 558.36 93.8198 565.13 curveto +92.0198 565.63 84.24 566.71 79.3398 568.15 curveto +73.5098 560.88 58.3198 565.63 56.23 570.31 curveto +54.7898 572.69 54.6499 575.21 54.7898 576.5 curveto +52.3398 580.1 55.8699 582.7 59.6199 583.06 curveto +62.8599 587.16 68.5398 594.94 71.2798 601.56 curveto +72.2898 603.07 74.95 609.34 78.1899 609.55 curveto +74.95 612.94 74.2998 622.51 82.6599 617.33 curveto +87.1199 624.02 92.0898 624.31 95.7598 615.82 curveto +102.89 615.38 102.31 608.69 115.78 605.52 curveto +122.76 602.86 132.77 604.58 140.26 603.72 curveto +136.22 596.88 127.44 566.86 132.98 559.8 curveto +140.76 564.7 141.84 605.38 157.03 595.66 curveto +160.56 593.93 159.91 590.04 164.09 590.18 curveto +170.42 587.45 169.13 600.77 172.51 600.77 curveto +176.47 599.76 183.02 599.04 186.98 599.54 curveto +197.71 600.77 206.93 604.08 223.92 602.5 curveto +231.12 601.78 238.25 601.06 245.45 600.34 curveto + closepath fill +newpath 305.28 560.95 moveto +304.63 560.95 299.95 561.24 299.38 561.24 curveto +302.4 550.44 303.98 536.47 304.2 525.31 curveto +303.7 521.35 299.81 517.46 299.38 525.67 curveto +295.85 530.86 296.42 540.07 293.4 540.29 curveto +287.35 539.64 285.34 513.22 280.01 509.33 curveto +276.26 512.28 280.73 524.02 275.54 524.74 curveto +270.5 524.02 264.31 526.68 266.69 534.46 curveto +270.29 543.02 268.34 554.76 266.54 561.6 curveto +262.37 578.59 264.02 587.09 271.58 596.09 curveto +267.48 604.51 lineto +275.4 608.26 285.62 604.58 290.02 602.21 curveto +294.62 600.26 300.24 595.94 301.1 587.38 curveto +303.34 578.88 304.42 569.74 305.28 560.95 curveto + closepath stroke +newpath 245.45 600.34 moveto +242.78 599.4 239.62 596.02 237.67 594.07 curveto +236.74 584.42 244.58 583.63 250.2 577.44 curveto +258.77 573.7 251.21 567.72 256.18 557.42 curveto +257.04 550.94 257.9 543.89 255.31 539.78 curveto +249.48 538.92 247.97 540.22 246.89 531.43 curveto +246.31 526.97 231.77 529.06 229.03 538.27 curveto +227.09 544.97 221.33 546.7 217.8 543.17 curveto +213.77 538.06 215.78 531.22 217.8 527.47 curveto +224.93 517.32 212.04 511.42 205.13 516.74 curveto +199.73 508.68 211.39 500.04 207.43 494.5 curveto +205.78 493.99 204.77 489.17 185.47 500.54 curveto +180.36 504.14 167.83 500.76 168.77 520.63 curveto +168.77 525.82 165.6 543.53 162.14 555.91 curveto +159.41 561.24 156.74 559.08 156.89 553.9 curveto +157.18 547.85 162.94 531.22 155.52 540.22 curveto +153.58 539.21 156.89 523.58 156.89 521.64 curveto +162 517.03 157.39 513.58 154.73 512.28 curveto +151.27 518.33 149.62 518.04 147.17 514.44 curveto +141.7 514.08 144.58 528.19 140.26 528.62 curveto +137.02 527.76 139.18 520.06 138.24 518.76 curveto +132.98 524.74 130.9 529.27 127.01 521.64 curveto +126.14 521.64 122.11 519.19 120.96 526.54 curveto +117.65 552.74 107.06 558.36 93.8198 565.13 curveto +92.0198 565.63 84.24 566.71 79.3398 568.15 curveto +73.5098 560.88 58.3198 565.63 56.23 570.31 curveto +54.7898 572.69 54.6499 575.21 54.7898 576.5 curveto +52.3398 580.1 55.8699 582.7 59.6199 583.06 curveto +62.8599 587.16 68.5398 594.94 71.2798 601.56 curveto +72.2898 603.07 74.95 609.34 78.1899 609.55 curveto +74.95 612.94 74.2998 622.51 82.6599 617.33 curveto +87.1199 624.02 92.0898 624.31 95.7598 615.82 curveto +102.89 615.38 102.31 608.69 115.78 605.52 curveto +122.76 602.86 132.77 604.58 140.26 603.72 curveto +136.22 596.88 127.44 566.86 132.98 559.8 curveto +140.76 564.7 141.84 605.38 157.03 595.66 curveto +160.56 593.93 159.91 590.04 164.09 590.18 curveto +170.42 587.45 169.13 600.77 172.51 600.77 curveto +176.47 599.76 183.02 599.04 186.98 599.54 curveto +197.71 600.77 206.93 604.08 223.92 602.5 curveto +231.12 601.78 238.25 601.06 245.45 600.34 curveto + closepath stroke +showpage +%%EOF diff --git a/doc/context/sources/general/manuals/details/hacker.jpg b/doc/context/sources/general/manuals/details/hacker.jpg Binary files differnew file mode 100644 index 000000000..cbc53a7de --- /dev/null +++ b/doc/context/sources/general/manuals/details/hacker.jpg diff --git a/doc/context/sources/general/manuals/details/mill.png b/doc/context/sources/general/manuals/details/mill.png Binary files differnew file mode 100644 index 000000000..9a1bf14e8 --- /dev/null +++ b/doc/context/sources/general/manuals/details/mill.png diff --git a/doc/context/sources/general/manuals/libraries/libraries-mkiv.tex b/doc/context/sources/general/manuals/libraries/libraries-mkiv.tex new file mode 100644 index 000000000..67ca75966 --- /dev/null +++ b/doc/context/sources/general/manuals/libraries/libraries-mkiv.tex @@ -0,0 +1,199 @@ +% language=uk + +% author : Hans Hagen +% copyright : PRAGMA ADE & ConTeXt Development Team +% license : Creative Commons Attribution ShareAlike 4.0 International +% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions +% origin : the ConTeXt distribution +% +% comment : Because this manual is distributed with TeX distributions it comes with a rather +% liberal license. We try to adapt these documents to upgrades in the (sub)systems +% that they describe. Using parts of the content otherwise can therefore conflict +% with existing functionality and we cannot be held responsible for that. Many of +% the manuals contain characteristic graphics and personal notes or examples that +% make no sense when used out-of-context. +% +% comment : Some chapters might have been published in TugBoat, the NTG Maps, the ConTeXt +% Group journal or otherwise. Thanks to the editors for corrections. Also thanks +% to users for testing, feedback and corrections. + +\usemodule[art-01,abr-02] + +\definecolor + [maincolor] + [r=.4] + +\definecolor + [extracolor] + [g=.4] + +\setupbodyfont + [11pt] + +\setuptype + [color=maincolor] + +\setuptyping + [color=maincolor] + +\definefontsynonym + [TitlePageMono] + [file:lmmonoproplt10-bold*default] + +\setuphead + [color=maincolor] + +\usesymbols + [cc] + +\setupinteraction + [hidden] + +\loadfontgoodies[lm] + +\startdocument + [metadata:author=Hans Hagen, + metadata:title=Libraries in ConTeXt, + author=Hans Hagen, + affiliation=PRAGMA ADE, + location=Hasselt NL, + title=Libraries in \ConTeXt, + support=www.contextgarden.net, + website=www.pragma-ade.nl] + +\startluasetups[swiglib] + context.nohyphens() + for i=1,640 do + context.definedfont { string.formatters["TitlePageMono at %p"](65536*(10+math.random(5))) } + context("Libraries ") + end + context.removeunwantedspaces() +\stopluasetups + +\startMPpage + +StartPage ; + + fill Page enlarged 1cm withcolor \MPcolor{extracolor} ; + + draw textext("\framed[loffset=2pt,roffset=2pt,frame=off,width=\paperwidth,align={normal,paragraph,verytolerant,stretch}]{\luasetup{swiglib}}") + xysized (PaperWidth,PaperHeight) + shifted center Page + withcolor .8white ; + + draw textext.ulft("\definedfont[TitlePageMono]basics") + xsized .75PaperWidth + shifted lrcorner Page + shifted (-1cm,2cm) + withcolor \MPcolor{maincolor} ; + + % draw textext.ulft("\definedfont[TitlePageMono]in context mkiv") + % xsized .6PaperWidth + % shifted lrcorner Page + % shifted (-1cm,6cm) + % withcolor \MPcolor{maincolor} ; + +StopPage ; + +\stopMPpage + +\dontcomplain + +\startsubject[title=Contents] + +\placelist[section][alternative=a] + +\stopsubject + +\startsection[title=Introduction] + +Not long after we released \LUATEX\ 1.0, we started experimenting a bit more with +so called foreign function interface: \FFI. Originally that interface to external +libraries was only available in \LUAJITTEX, but a good and compatible alternative +is now also available in the normal engine too. For users it is not that relevant +to know how it works, as long as it works. It means that in addition to \SWIGLIB\ +we have a method that doesn't demand compilation as it uses normal (public) +libraries. + +Of course one needs to make sure that the right version of a library is used. +And, as there is the danger of the \API\ having been changed in an incompatible +way one can wonder if such a dependency is really what one wants. On the other +hand one can expect \CONTEXT\ to keep up. + +Do you really need libraries? For instance does it really make sense to use curl, +ghostscript or graphicmagic libraries while the command line version is +(normally) just as efficient and avoids a dependency. This is even more true if +you realizes that for instance a fetch or conversion only needs to happen once +per run or in fact only when there is some change in the resource. + +On the other hand, when accessing databases one can avoid the often slower +command line calls and save the hassle of intermediate files. Here efficiency +wins. Also, when \CONTEXT\ is used in a high performance database backend +application a distribution and the used libraries are not updated on a daily +basis. + +\stopsection + +\startsection[title=Supported] + +Apart from some experiments we currently can use \FFI\ interfaced libraries in: + +\starttabulate[|l|l|l|l|l|] +\FL +\BC module \BC library \BC windows \BC unix \NC \NR +\ML +\NC util-crl \NC curl \NC libcurl \NC libcurl \NC \NR % todo: client and ffi +\NC util-sql-imp-ffi \NC mysql \NC libmysql \NC libmysqlclient \NC \NR +\NC util-sql-imp-sqlite \NC sqlite \NC sqlite3 \NC sqlite3 \NC \NR +%NC font-phb-imp-library \NC harfbuzz \NC libharfbuzz \NC libharfbuzz \NC \NR % for testing uniscribe (idris fonts) +%NC \NC ghostscript \NC \NC \NC \NR % only a few experiments +%NC \NC graphicmagick \NC \NC \NC \NR % only a few experiments +\LL +\stoptabulate + +The profiler that we occasionally use to identify bottlenecks in the engine (for +instance when we upgrade \LUA) uses \FFI\ to provide access to the high resolution +timers but this is typically different per platform. + +One problem with libraries, especially on \WINDOWS\ is that the library is found on +some system path and it can happen that multiple programs ship the same library but in +different versions. You can try to play safe and put libraries in the \TEX\ tree, for +instance on my system they are in: + +\starttyping +c:/data/tex-context/tex/texmf-win64/bin/lib/luatex/lua/whatever/libwhatever.dll +\stoptyping + +You can trace where libraries are looked for with: + +\starttyping +\enabletrackers[resolvers.ffilib] +\stoptyping + +or in \LUA\ with: + +\starttyping +trackers.enable("resolvers.ffilib") +\stoptyping + +The library is first located on one of the valid \TDS\ paths (these are sort of +standardized in \TEX\ distributions) and then using the normal \FFI\ loader. + +As this is all still experimental in \LUATEX\ there is not much more to say about +it now. Of course this kind of specialized support to a large degree depends on +the need to use it. + +\stopsection + +\startsection[title=Colofon] + +\starttabulate[|B|p|] +\NC author \NC \getvariable{document}{author}, \getvariable{document}{affiliation}, \getvariable{document}{location} \NC \NR +\NC version \NC \currentdate \NC \NR +\NC website \NC \getvariable{document}{website} \endash\ \getvariable{document}{support} \NC \NR +\NC comment \NC many thanks to Luigi Scarso for taking care of ffi support in the engines \NC \NR +\stoptabulate + +\stopsection + +\stopdocument diff --git a/doc/context/sources/general/manuals/luatex/luatex-enhancements.tex b/doc/context/sources/general/manuals/luatex/luatex-enhancements.tex index 19f88234a..d1da33878 100644 --- a/doc/context/sources/general/manuals/luatex/luatex-enhancements.tex +++ b/doc/context/sources/general/manuals/luatex/luatex-enhancements.tex @@ -55,7 +55,7 @@ chapters on fonts and math we discuss a few more new ones. There are three new primitives to test the version of \LUATEX: \starttabulate[|l|pl|pl|] -\NC \bf primitive \NC \bf explanation \NC \bf value \NC \NR +\BC primitive \BC explanation \BC value \NC \NR \NC \type {\luatexbanner} \NC the banner reported on the command line \NC \luatexbanner \NC \NR \NC \type {\luatexversion} \NC a combination of major and minor number \NC \the\luatexversion \NC \NR \NC \type {\luatexrevision} \NC the revision number, the current value is \NC \luatexrevision \NC \NR @@ -550,6 +550,16 @@ $ x + 1 = a $ \stoptyping +\subsection{\type {\suppressprimitiveerror}} + +When set to a non|-|zero value the following command will not issue an error: + +\starttyping +\suppressprimitiveerror = 1 + +\primitive\notaprimitive +\stoptyping + \section {Math} \subsection{Extensions} @@ -881,6 +891,20 @@ ignores the value. This allows for embedded spaces, without the need for double quotes. Macro expansion takes place inside the argument. +The \type {\tracingfonts} primitive that has been inherited from \PDFTEX\ has +been adapted to support variants in reporting the font. The reason for this +extension is that a csname not always makes sense. The zero case is the default. + +\starttabulate[|T||] +\NC 0 \EQ \type{\foo xyz} \NC \NR +\NC 1 \EQ \type{\foo (bar)} \NC \NR +\NC 2 \EQ \type{<bar> xyz} \NC \NR +\NC 3 \EQ \type{<bar @ ..pt> xyz} \NC \NR +\NC 4 \EQ \type{<id>} \NC \NR +\NC 5 \EQ \type{<id: bar>} \NC \NR +\NC 6 \EQ \type{<id: bar @ ..pt> xyz} \NC \NR +\stoptabulate + \subsection{Writing to file} You can now open upto 127 files with \type {\openout}. When no file is open diff --git a/doc/context/sources/general/manuals/luatex/luatex-fonts.tex b/doc/context/sources/general/manuals/luatex/luatex-fonts.tex index 221c0ce85..ddb64d946 100644 --- a/doc/context/sources/general/manuals/luatex/luatex-fonts.tex +++ b/doc/context/sources/general/manuals/luatex/luatex-fonts.tex @@ -22,92 +22,106 @@ The column \quote {\VF} means that this key will be created by the \type The top|-|level keys in the table are as follows: -\starttabulate[|Tl|c|c|c|l|p|] -\NC \rmbf key \NC \bf vf \NC \bf tfm \NC \bf used \NC \bf value type \NC \bf description \NC \NR -\NC name \NC yes \NC yes \NC yes \NC string \NC metric (file) name \NC \NR -\NC area \NC no \NC yes \NC yes \NC string \NC (directory) location, typically empty \NC \NR -\NC used \NC no \NC yes \NC yes \NC boolean\NC indicates usage (initial: false) \NC \NR -\NC characters \NC yes \NC yes \NC yes \NC table \NC the defined glyphs of this font \NC \NR -\NC checksum \NC yes \NC yes \NC no \NC number \NC default: 0 \NC \NR -\NC designsize \NC no \NC yes \NC yes \NC number \NC expected size (default: 655360 == 10pt) \NC \NR -\NC direction \NC no \NC yes \NC yes \NC number \NC default: 0 \NC \NR -\NC encodingbytes \NC no \NC no \NC yes \NC number \NC default: depends on \type {format} \NC \NR -\NC encodingname \NC no \NC no \NC yes \NC string \NC encoding name \NC \NR -\NC fonts \NC yes \NC no \NC yes \NC table \NC locally used fonts \NC \NR -\NC psname \NC no \NC no \NC yes \NC string \NC This is the \POSTSCRIPT\ fontname in the incoming font - source, and it's used as fontname identifier in the \PDF\ - output. This has to be a valid string, e.g.\ no spaces - and such, as the backend will not do a cleanup. This gives - complete control to the loader. \NC \NR -\NC fullname \NC no \NC no \NC yes \NC string \NC output font name, used as a fallback in the \PDF\ output - if the \type {psname} is not set \NC \NR -\NC header \NC yes \NC no \NC no \NC string \NC header comments, if any \NC \NR -\NC hyphenchar \NC no \NC no \NC yes \NC number \NC default: \TEX's \type {\hyphenchar} \NC \NR -\NC parameters \NC no \NC yes \NC yes \NC hash \NC default: 7 parameters, all zero \NC \NR -\NC size \NC no \NC yes \NC yes \NC number \NC loaded (at) size. (default: same as designsize) \NC \NR -\NC skewchar \NC no \NC no \NC yes \NC number \NC default: \TEX's \type {\skewchar} \NC \NR -\NC type \NC yes \NC no \NC yes \NC string \NC basic type of this font \NC \NR -\NC format \NC no \NC no \NC yes \NC string \NC disk format type \NC \NR -\NC embedding \NC no \NC no \NC yes \NC string \NC \PDF\ inclusion \NC \NR -\NC filename \NC no \NC no \NC yes \NC string \NC the name of the font on disk \NC \NR -\NC tounicode \NC no \NC yes \NC yes \NC number \NC When this is set to~1 \LUATEX\ assumes per|-|glyph - tounicode entries are present in the font. \NC \NR -\NC stretch \NC no \NC no \NC yes \NC number \NC the \quote {stretch} value from \type - {\expandglyphsinfont} \NC \NR -\NC shrink \NC no \NC no \NC yes \NC number \NC the \quote {shrink} value from \type - {\expandglyphsinfont} \NC \NR -\NC step \NC no \NC no \NC yes \NC number \NC the \quote {step} value from \type - {\expandglyphsinfont} \NC \NR -\NC auto_expand \NC no \NC no \NC yes \NC boolean\NC the \quote {autoexpand} keyword from \crlf - \type {\expandglyphsinfont} \NC \NR -\NC expansion_factor \NC no \NC no \NC no \NC number \NC the actual expansion factor of an expanded font \NC \NR -\NC attributes \NC no \NC no \NC yes \NC string \NC the \type {\pdffontattr} \NC \NR -\NC cache \NC no \NC no \NC yes \NC string \NC This key controls caching of the \LUA\ table on the - \TEX\ end where \type {yes} means: use a reference to - the table that is passed to \LUATEX\ (this is the - default), and no \type {no} means: don't store the - table reference, don't cache any \LUA\ data for this - font while \type {renew} means: don't store the table - reference, but save a reference to the table that is - created at the first access to one of its fields in font. - Note: the saved reference is thread|-|local, so be - careful when you are using coroutines: an error will be - thrown if the table has been cached in one thread, but - you reference it from another thread. \NC \NR -\NC nomath \NC no \NC no \NC yes \NC boolean\NC This key allows a minor speedup for text fonts. If it - is present and true, then \LUATEX\ will not check the - character entries for math|-|specific keys. \NC \NR -\NC oldmath \NC no \NC no \NC yes \NC boolean\NC This key flags a font as representing an old school \TEX\ - math font and disables the \OPENTYPE\ code path. \NC \NR -\NC slant \NC no \NC no \NC yes \NC number \NC This has the same semantics as the \type {SlantFont} - operator in font map files. \NC \NR -\NC extent \NC no \NC no \NC yes \NC number \NC This has the same semantics as the \type {ExtendFont} - operator in font map files. \NC \NR +\starttabulate[|l|c|c|c|l|p|] +\BC key \BC vf \BC tfm \BC used \BC value type \BC description \NC \NR +\NC \type{name} \NC yes \NC yes \NC yes \NC string \NC metric (file) name \NC \NR +\NC \type{area} \NC no \NC yes \NC yes \NC string \NC (directory) location, typically empty \NC \NR +\NC \type{used} \NC no \NC yes \NC yes \NC boolean \NC indicates usage (initial: false) \NC \NR +\NC \type{characters} \NC yes \NC yes \NC yes \NC table \NC the defined glyphs of this font \NC \NR +\NC \type{checksum} \NC yes \NC yes \NC no \NC number \NC default: 0 \NC \NR +\NC \type{designsize} \NC no \NC yes \NC yes \NC number \NC expected size (default: 655360 == 10pt) \NC \NR +\NC \type{direction} \NC no \NC yes \NC yes \NC number \NC default: 0 \NC \NR +\NC \type{encodingbytes} \NC no \NC no \NC yes \NC number \NC default: depends on \type {format} \NC \NR +\NC \type{encodingname} \NC no \NC no \NC yes \NC string \NC encoding name \NC \NR +\NC \type{fonts} \NC yes \NC no \NC yes \NC table \NC locally used fonts \NC \NR +\NC \type{psname} \NC no \NC no \NC yes \NC string \NC This is the \POSTSCRIPT\ fontname in the incoming font + source, and it's used as fontname identifier in the \PDF\ + output. This has to be a valid string, e.g.\ no spaces + and such, as the backend will not do a cleanup. This gives + complete control to the loader. \NC \NR +\NC \type{fullname} \NC no \NC no \NC yes \NC string \NC output font name, used as a fallback in the \PDF\ output + if the \type {psname} is not set \NC \NR +\NC \type{header} \NC yes \NC no \NC no \NC string \NC header comments, if any \NC \NR +\NC \type{hyphenchar} \NC no \NC no \NC yes \NC number \NC default: \TEX's \type {\hyphenchar} \NC \NR +\NC \type{parameters} \NC no \NC yes \NC yes \NC hash \NC default: 7 parameters, all zero \NC \NR +\NC \type{size} \NC no \NC yes \NC yes \NC number \NC loaded (at) size. (default: same as designsize) \NC \NR +\NC \type{skewchar} \NC no \NC no \NC yes \NC number \NC default: \TEX's \type {\skewchar} \NC \NR +\NC \type{type} \NC yes \NC no \NC yes \NC string \NC basic type of this font \NC \NR +\NC \type{format} \NC no \NC no \NC yes \NC string \NC disk format type \NC \NR +\NC \type{embedding} \NC no \NC no \NC yes \NC string \NC \PDF\ inclusion \NC \NR +\NC \type{filename} \NC no \NC no \NC yes \NC string \NC the name of the font on disk \NC \NR +\NC \type{tounicode} \NC no \NC yes \NC yes \NC number \NC When this is set to~1 \LUATEX\ assumes per|-|glyph + tounicode entries are present in the font. \NC \NR +\NC \type{stretch} \NC no \NC no \NC yes \NC number \NC the \quote {stretch} value from \type + {\expandglyphsinfont} \NC \NR +\NC \type{shrink} \NC no \NC no \NC yes \NC number \NC the \quote {shrink} value from \type + {\expandglyphsinfont} \NC \NR +\NC \type{step} \NC no \NC no \NC yes \NC number \NC the \quote {step} value from \type + {\expandglyphsinfont} \NC \NR +\NC \type{expansion_factor} \NC no \NC no \NC no \NC number \NC the actual expansion factor of an expanded font \NC \NR +\NC \type{attributes} \NC no \NC no \NC yes \NC string \NC the \type {\pdffontattr} \NC \NR +\NC \type{cache} \NC no \NC no \NC yes \NC string \NC This key controls caching of the \LUA\ table on the + \TEX\ end where \type {yes} means: use a reference to + the table that is passed to \LUATEX\ (this is the + default), and no \type {no} means: don't store the + table reference, don't cache any \LUA\ data for this + font while \type {renew} means: don't store the table + reference, but save a reference to the table that is + created at the first access to one of its fields in font. + Note: the saved reference is thread|-|local, so be + careful when you are using coroutines: an error will be + thrown if the table has been cached in one thread, but + you reference it from another thread. \NC \NR +\NC \type{nomath} \NC no \NC no \NC yes \NC boolean \NC This key allows a minor speedup for text fonts. If it + is present and true, then \LUATEX\ will not check the + character entries for math|-|specific keys. \NC \NR +\NC \type{oldmath} \NC no \NC no \NC yes \NC boolean \NC This key flags a font as representing an old school \TEX\ + math font and disables the \OPENTYPE\ code path. \NC \NR +\NC \type{slant} \NC no \NC no \NC yes \NC number \NC This has the same semantics as the \type {SlantFont} + operator in font map files. \NC \NR +\NC \type{extent} \NC no \NC no \NC yes \NC number \NC This has the same semantics as the \type {ExtendFont} + operator in font map files. \NC \NR \stoptabulate The key \type {name} is always required. The keys \type {stretch}, \type -{shrink}, \type {step} and optionally \type {auto_expand} only have meaning when -used together: they can be used to replace a post|-|loading \type -{\expandglyphsinfont} command. The \type {expansion_factor} is value that can be -present inside a font in \type {font.fonts}. It is the actual expansion factor (a -value between \type {-shrink} and \type {stretch}, with step \type {step}) of a -font that was automatically generated by the font expansion algorithm. The key -\type {attributes} can be used to set font attributes in the \PDF\ file. The key -\type {used} is set by the engine when a font is actively in use, this makes sure -that the font's definition is written to the output file (\DVI\ or \PDF). The -\TFM\ reader sets it to false. The \type {direction} is a number signalling the -\quote {normal} direction for this font. There are sixteen possibilities: - -\starttabulate[|Tc|Tc|Tc|Tc|] -\NC \rmbf number \NC \rmbf meaning \NC \rmbf number \NC \rmbf meaning \NC\NR -\NC 0 \NC LT \NC 8 \NC TT \NC\NR -\NC 1 \NC LL \NC 9 \NC TL \NC\NR -\NC 2 \NC LB \NC 10 \NC TB \NC\NR -\NC 3 \NC LR \NC 11 \NC TR \NC\NR -\NC 4 \NC RT \NC 12 \NC BT \NC\NR -\NC 5 \NC RL \NC 13 \NC BL \NC\NR -\NC 6 \NC RB \NC 14 \NC BB \NC\NR -\NC 7 \NC RR \NC 15 \NC BR \NC\NR +{shrink}, \type {step} only have meaning when used together: they can be used to +replace a post|-|loading \type {\expandglyphsinfont} command. The \type +{auto_expand} option is not supported in \LUATEX. In fact, the primitives +that create expanded or protruding copies are probably only useful when used with +traditional fonts because all these extra \OPENTYPE\ properties are kept out of +the picture. The \type {expansion_factor} is value that can be present inside a +font in \type {font.fonts}. It is the actual expansion factor (a value between +\type {-shrink} and \type {stretch}, with step \type {step}) of a font that was +automatically generated by the font expansion algorithm. + +Because we store the actual state of expansion with each glyph and don't have +special font instances, we can change some font related parameters before lines +are constructed, like: + +\starttyping +font.setexpansion(font.current(),100,100,20) +\stoptyping + +This is mostly meant for experiments (or an optimizing routing written in \LUA) +so there is no primitive. + +The key \type {attributes} can be used to set font attributes in the \PDF\ file. +The key \type {used} is set by the engine when a font is actively in use, this +makes sure that the font's definition is written to the output file (\DVI\ or +\PDF). The \TFM\ reader sets it to false. The \type {direction} is a number +signalling the \quote {normal} direction for this font. There are sixteen +possibilities: + +\starttabulate[|c|c|c|c|] +\BC number \BC meaning \BC number \BC meaning \NC \NR +\NC \type{0} \NC \type{LT} \NC \type {8} \NC \type{TT} \NC \NR +\NC \type{1} \NC \type{LL} \NC \type {9} \NC \type{TL} \NC \NR +\NC \type{2} \NC \type{LB} \NC \type{10} \NC \type{TB} \NC \NR +\NC \type{3} \NC \type{LR} \NC \type{11} \NC \type{TR} \NC \NR +\NC \type{4} \NC \type{RT} \NC \type{12} \NC \type{BT} \NC \NR +\NC \type{5} \NC \type{RL} \NC \type{13} \NC \type{BL} \NC \NR +\NC \type{6} \NC \type{RB} \NC \type{14} \NC \type{BB} \NC \NR +\NC \type{7} \NC \type{RR} \NC \type{15} \NC \type{BR} \NC \NR \stoptabulate These are \OMEGA|-|style direction abbreviations: the first character indicates @@ -123,15 +137,15 @@ gives a nicer user interface. The names and their internal remapping are: -\starttabulate[|lT|c|] -\NC \rmbf name \NC \rmbf remapping \NC\NR -\NC slant \NC 1 \NC\NR -\NC space \NC 2 \NC\NR -\NC space_stretch \NC 3 \NC\NR -\NC space_shrink \NC 4 \NC\NR -\NC x_height \NC 5 \NC\NR -\NC quad \NC 6 \NC\NR -\NC extra_space \NC 7 \NC\LR +\starttabulate[|l|c|] +\BC name \BC remapping \NC \NR +\NC \type {slant} \NC 1 \NC \NR +\NC \type {space} \NC 2 \NC \NR +\NC \type {space_stretch} \NC 3 \NC \NR +\NC \type {space_shrink} \NC 4 \NC \NR +\NC \type {x_height} \NC 5 \NC \NR +\NC \type {quad} \NC 6 \NC \NR +\NC \type {extra_space} \NC 7 \NC \NR \stoptabulate The keys \type {type}, \type {format}, \type {embedding}, \type {fullname} and @@ -182,29 +196,29 @@ Each character hash itself is a hash. For example, here is the character \quote The following top|-|level keys can be present inside a character hash: -\starttabulate[|lT|c|c|c|l|p|] -\NC \rmbf key \NC \bf vf \NC \bf tfm \NC \bf used \NC \bf type \NC \bf description \NC\NR -\NC width \NC yes \NC yes \NC yes \NC number \NC character's width, in sp (default 0) \NC\NR -\NC height \NC no \NC yes \NC yes \NC number \NC character's height, in sp (default 0) \NC\NR -\NC depth \NC no \NC yes \NC yes \NC number \NC character's depth, in sp (default 0) \NC\NR -\NC italic \NC no \NC yes \NC yes \NC number \NC character's italic correction, in sp (default zero) \NC\NR -\NC top_accent \NC no \NC no \NC maybe \NC number \NC character's top accent alignment place, in sp (default zero) \NC\NR -\NC bot_accent \NC no \NC no \NC maybe \NC number \NC character's bottom accent alignment place, in sp (default zero) \NC\NR -\NC left_protruding \NC no \NC no \NC maybe \NC number \NC character's \type {\lpcode} \NC\NR -\NC right_protruding \NC no \NC no \NC maybe \NC number \NC character's \type {\rpcode} \NC\NR -\NC expansion_factor \NC no \NC no \NC maybe \NC number \NC character's \type {\efcode} \NC\NR -\NC tounicode \NC no \NC no \NC maybe \NC string \NC character's \UNICODE\ equivalent(s), in \UTF|-|16BE hexadecimal format \NC\NR -\NC next \NC no \NC yes \NC yes \NC number \NC the \quote {next larger} character index \NC\NR -\NC extensible \NC no \NC yes \NC yes \NC table \NC the constituent parts of an extensible recipe \NC\NR -\NC vert_variants \NC no \NC no \NC yes \NC table \NC constituent parts of a vertical variant set \NC \NR -\NC horiz_variants \NC no \NC no \NC yes \NC table \NC constituent parts of a horizontal variant set \NC \NR -\NC kerns \NC no \NC yes \NC yes \NC table \NC kerning information \NC\NR -\NC ligatures \NC no \NC yes \NC yes \NC table \NC ligaturing information \NC\NR -\NC commands \NC yes \NC no \NC yes \NC array \NC virtual font commands \NC\NR -\NC name \NC no \NC no \NC no \NC string \NC the character (\POSTSCRIPT) name \NC\NR -\NC index \NC no \NC no \NC yes \NC number \NC the (\OPENTYPE\ or \TRUETYPE) font glyph index \NC\NR -\NC used \NC no \NC yes \NC yes \NC boolean \NC typeset already (default: false)? \NC\NR -\NC mathkern \NC no \NC no \NC yes \NC table \NC math cut-in specifications \NC\NR +\starttabulate[|l|c|c|c|l|p|] +\BC key \BC vf \BC tfm \BC used \BC type \BC description \NC\NR +\NC \type{width} \NC yes \NC yes \NC yes \NC number \NC character's width, in sp (default 0) \NC\NR +\NC \type{height} \NC no \NC yes \NC yes \NC number \NC character's height, in sp (default 0) \NC\NR +\NC \type{depth} \NC no \NC yes \NC yes \NC number \NC character's depth, in sp (default 0) \NC\NR +\NC \type{italic} \NC no \NC yes \NC yes \NC number \NC character's italic correction, in sp (default zero) \NC\NR +\NC \type{top_accent} \NC no \NC no \NC maybe \NC number \NC character's top accent alignment place, in sp (default zero) \NC\NR +\NC \type{bot_accent} \NC no \NC no \NC maybe \NC number \NC character's bottom accent alignment place, in sp (default zero) \NC\NR +\NC \type{left_protruding} \NC no \NC no \NC maybe \NC number \NC character's \type {\lpcode} \NC\NR +\NC \type{right_protruding} \NC no \NC no \NC maybe \NC number \NC character's \type {\rpcode} \NC\NR +\NC \type{expansion_factor} \NC no \NC no \NC maybe \NC number \NC character's \type {\efcode} \NC\NR +\NC \type{tounicode} \NC no \NC no \NC maybe \NC string \NC character's \UNICODE\ equivalent(s), in \UTF|-|16BE hexadecimal format \NC\NR +\NC \type{next} \NC no \NC yes \NC yes \NC number \NC the \quote {next larger} character index \NC\NR +\NC \type{extensible} \NC no \NC yes \NC yes \NC table \NC the constituent parts of an extensible recipe \NC\NR +\NC \type{vert_variants} \NC no \NC no \NC yes \NC table \NC constituent parts of a vertical variant set \NC \NR +\NC \type{horiz_variants} \NC no \NC no \NC yes \NC table \NC constituent parts of a horizontal variant set \NC \NR +\NC \type{kerns} \NC no \NC yes \NC yes \NC table \NC kerning information \NC\NR +\NC \type{ligatures} \NC no \NC yes \NC yes \NC table \NC ligaturing information \NC\NR +\NC \type{commands} \NC yes \NC no \NC yes \NC array \NC virtual font commands \NC\NR +\NC \type{name} \NC no \NC no \NC no \NC string \NC the character (\POSTSCRIPT) name \NC\NR +\NC \type{index} \NC no \NC no \NC yes \NC number \NC the (\OPENTYPE\ or \TRUETYPE) font glyph index \NC\NR +\NC \type{used} \NC no \NC yes \NC yes \NC boolean \NC typeset already (default: false)? \NC\NR +\NC \type{mathkern} \NC no \NC no \NC yes \NC table \NC math cut-in specifications \NC\NR \stoptabulate The values of \type {top_accent}, \type {bot_accent} and \type {mathkern} are @@ -236,26 +250,26 @@ present. It in in turn can be overruled by \type {vert_variants}. The \type {extensible} table is very simple: -\starttabulate[|lT|l|p|] -\NC \rmbf key \NC \bf type \NC \bf description \NC\NR -\NC top \NC number \NC top character index \NC\NR -\NC mid \NC number \NC middle character index \NC\NR -\NC bot \NC number \NC bottom character index \NC\NR -\NC rep \NC number \NC repeatable character index \NC\NR +\starttabulate[|l|l|p|] +\BC key \BC type \BC description \NC\NR +\NC \type{top} \NC number \NC top character index \NC\NR +\NC \type{mid} \NC number \NC middle character index \NC\NR +\NC \type{bot} \NC number \NC bottom character index \NC\NR +\NC \type{rep} \NC number \NC repeatable character index \NC\NR \stoptabulate The \type {horiz_variants} and \type {vert_variants} are arrays of components. Each of those components is itself a hash of up to five keys: -\starttabulate[|lT|l|p|] -\NC \rmbf key \NC \bf type \NC \bf explanation \NC\NR -\NC glyph \NC number \NC The character index. Note that this is an encoding number, not a name. \NC \NR -\NC extender \NC number \NC One (1) if this part is repeatable, zero (0) otherwise. \NC \NR -\NC start \NC number \NC The maximum overlap at the starting side (in scaled points). \NC \NR -\NC end \NC number \NC The maximum overlap at the ending side (in scaled points). \NC \NR -\NC advance \NC number \NC The total advance width of this item. It can be zero or missing, - then the natural size of the glyph for character \type {component} - is used. \NC \NR +\starttabulate[|l|l|p|] +\BC key \BC type \BC explanation \NC \NR +\NC \type{glyph} \NC number \NC The character index. Note that this is an encoding number, not a name. \NC \NR +\NC \type{extender} \NC number \NC One (1) if this part is repeatable, zero (0) otherwise. \NC \NR +\NC \type{start} \NC number \NC The maximum overlap at the starting side (in scaled points). \NC \NR +\NC \type{end} \NC number \NC The maximum overlap at the ending side (in scaled points). \NC \NR +\NC \type{advance} \NC number \NC The total advance width of this item. It can be zero or missing, + then the natural size of the glyph for character \type {component} + is used. \NC \NR \stoptabulate The \type {kerns} table is a hash indexed by character index (and \quote @@ -268,10 +282,10 @@ The \type {ligatures} table is a hash indexed by character index (and \quote value \type {right_boundary}), with the values being yet another small hash, with two fields: -\starttabulate[|lT|l|p|] -\NC \rmbf key \NC \bf type \NC \bf description \NC \NR -\NC type \NC number \NC the type of this ligature command, default 0 \NC \NR -\NC char \NC number \NC the character index of the resultant ligature \NC \NR +\starttabulate[|l|l|p|] +\BC key \BC type \BC description \NC \NR +\NC \type{type} \NC number \NC the type of this ligature command, default 0 \NC \NR +\NC \type{char} \NC number \NC the character index of the resultant ligature \NC \NR \stoptabulate The \type {char} field in a ligature is required. @@ -285,15 +299,15 @@ forward one or two places. The glyph that ends up to the right of the insertion point will become the next \quote {left}. \starttabulate[|l|c|l|l|] -\NC \bf textual (Knuth) \NC \bf number \NC \bf string \NC result \NC\NR -\NC \type{l + r =: n} \NC 0 \NC \type{=:} \NC \type{|n} \NC\NR -\NC \type{l + r =:| n} \NC 1 \NC \type{=:|} \NC \type{|nr} \NC\NR -\NC \type{l + r |=: n} \NC 2 \NC \type{|=:} \NC \type{|ln} \NC\NR -\NC \type{l + r |=:| n} \NC 3 \NC \type{|=:|} \NC \type{|lnr} \NC\NR -\NC \type{l + r =:|> n} \NC 5 \NC \type{=:|>} \NC \type{n|r} \NC\NR -\NC \type{l + r |=:> n} \NC 6 \NC \type{|=:>} \NC \type{l|n} \NC\NR -\NC \type{l + r |=:|> n} \NC 7 \NC \type{|=:|>} \NC \type{l|nr} \NC\NR -\NC \type{l + r |=:|>> n} \NC 11 \NC \type{|=:|>>} \NC \type{ln|r} \NC\NR +\BC textual (Knuth) \BC number \BC string \BC result \NC\NR +\NC \type{l + r =: n} \NC 0 \NC \type{=:} \NC \type{|n} \NC\NR +\NC \type{l + r =:| n} \NC 1 \NC \type{=:|} \NC \type{|nr} \NC\NR +\NC \type{l + r |=: n} \NC 2 \NC \type{|=:} \NC \type{|ln} \NC\NR +\NC \type{l + r |=:| n} \NC 3 \NC \type{|=:|} \NC \type{|lnr} \NC\NR +\NC \type{l + r =:|> n} \NC 5 \NC \type{=:|>} \NC \type{n|r} \NC\NR +\NC \type{l + r |=:> n} \NC 6 \NC \type{|=:>} \NC \type{l|n} \NC\NR +\NC \type{l + r |=:|> n} \NC 7 \NC \type{|=:|>} \NC \type{l|nr} \NC\NR +\NC \type{l + r |=:|>> n} \NC 11 \NC \type{|=:|>>} \NC \type{ln|r} \NC\NR \stoptabulate The default value is~0, and can be left out. That signifies a \quote {normal} @@ -310,10 +324,10 @@ structure. If the value is \type {real}, then this is a proper font, and the inclusion mechanism will attempt to add the needed font object definitions to the \PDF. Values for \type {type} are: -\starttabulate[|Tl|p|] -\NC \rmbf value \NC \rmbf description \NC\NR -\NC real \NC this is a base font \NC\NR -\NC virtual \NC this is a virtual font \NC\NR +\starttabulate[|l|p|] +\BC value \BC description \NC\NR +\NC \type{real} \NC this is a base font \NC\NR +\NC \type{virtual} \NC this is a virtual font \NC\NR \stoptabulate The actions to be taken depend on a number of different variables: @@ -354,12 +368,12 @@ the separate characters. Values for \type {format} are: -\starttabulate[|Tl|p|] -\NC \rmbf value \NC \rmbf description \NC \NR -\NC type1 \NC this is a \POSTSCRIPT\ \TYPEONE\ font \NC \NR -\NC type3 \NC this is a bitmapped (\PK) font \NC \NR -\NC truetype \NC this is a \TRUETYPE\ or \TRUETYPE|-|based \OPENTYPE\ font \NC \NR -\NC opentype \NC this is a \POSTSCRIPT|-|based \OPENTYPE\ font \NC \NR +\starttabulate[|l|p|] +\BC value \BC description \NC \NR +\NC \type{type1} \NC this is a \POSTSCRIPT\ \TYPEONE\ font \NC \NR +\NC \type{type3} \NC this is a bitmapped (\PK) font \NC \NR +\NC \type{truetype} \NC this is a \TRUETYPE\ or \TRUETYPE|-|based \OPENTYPE\ font \NC \NR +\NC \type{opentype} \NC this is a \POSTSCRIPT|-|based \OPENTYPE\ font \NC \NR \stoptabulate \type {type3} fonts are provided for backward compatibility only, and do not @@ -367,11 +381,11 @@ support the new wide encoding options. Values for \type {embedding} are: -\starttabulate[|Tl|p|] -\NC \rmbf value \NC \rmbf description \NC \NR -\NC no \NC don't embed the font at all \NC \NR -\NC subset \NC include and atttempt to subset the font \NC \NR -\NC full \NC include this font in its entirety \NC \NR +\starttabulate[|l|p|] +\BC value \BC description \NC \NR +\NC \type{no} \NC don't embed the font at all \NC \NR +\NC \type{subset} \NC include and atttempt to subset the font \NC \NR +\NC \type{full} \NC include this font in its entirety \NC \NR \stoptabulate The other fields are used as follows: The \type {fullname} will be the @@ -453,25 +467,28 @@ The \type {commands} array is a hash where each item is another small array, with the first entry representing a command and the extra items being the parameters to that command. The allowed commands and their arguments are: -\starttabulate[|Tl|l|l|p|] -\NC \rmbf command name \NC \bf arguments \NC \bf type \NC \bf description \NC\NR -\NC font \NC 1 \NC number \NC select a new font from the local \type {fonts} table\NC\NR -\NC char \NC 1 \NC number \NC typeset this character number from the current font, - and move right by the character's width\NC\NR -\NC node \NC 1 \NC node \NC output this node (list), and move right - by the width of this list\NC\NR -\NC slot \NC 2 \NC number \NC a shortcut for the combination of a font and char command\NC\NR -\NC push \NC 0 \NC \NC save current position\NC\NR -\NC nop \NC 0 \NC \NC do nothing \NC\NR -\NC pop \NC 0 \NC \NC pop position \NC\NR -\NC rule \NC 2 \NC 2 numbers \NC output a rule $ht*wd$, and move right.\NC\NR -\NC down \NC 1 \NC number \NC move down on the page\NC\NR -\NC right \NC 1 \NC number \NC move right on the page\NC\NR -\NC special \NC 1 \NC string \NC output a \type {\special} command\NC\NR -\NC lua \NC 1 \NC string \NC execute a \LUA\ script (at \type {\latelua} time)\NC\NR -\NC image \NC 1 \NC image \NC output an image (the argument can be either an \type - {<image>} variable or an \type {image_spec} table)\NC\NR -\NC comment \NC any \NC any \NC the arguments of this command are ignored\NC\NR +\starttabulate[|l|l|l|p|] +\BC command name \BC arguments \BC type \BC description \NC \NR +\NC \type{font} \NC 1 \NC number \NC select a new font from the local \type {fonts} table \NC \NR +\NC \type{char} \NC 1 \NC number \NC typeset this character number from the current font, + and move right by the character's width \NC \NR +\NC \type{node} \NC 1 \NC node \NC output this node (list), and move right + by the width of this list\NC \NR +\NC \type{slot} \NC 2 \NC 2 numbers \NC a shortcut for the combination of a font and char command\NC \NR +\NC \type{push} \NC 0 \NC \NC save current position\NC \NR +\NC \type{nop} \NC 0 \NC \NC do nothing \NC \NR +\NC \type{pop} \NC 0 \NC \NC pop position \NC \NR +\NC \type{rule} \NC 2 \NC 2 numbers \NC output a rule $ht*wd$, and move right. \NC \NR +\NC \type{down} \NC 1 \NC number \NC move down on the page \NC \NR +\NC \type{right} \NC 1 \NC number \NC move right on the page \NC \NR +\NC \type{special} \NC 1 \NC string \NC output a \type {\special} command \NC \NR +\NC \type{pdf} \NC 2 \NC 2 strings \NC output a \PDF\ literal, the first string is one of \type {origin}, + \type {page}, \type {text}, \type {font}, \type {direct} or \type {raw}; if you + have one string only \type {origin} is assumed \NC \NR +\NC \type{lua} \NC 1 \NC string \NC execute a \LUA\ script (at \type {\latelua} time) \NC \NR +\NC \type{image} \NC 1 \NC image \NC output an image (the argument can be either an \type + {<image>} variable or an \type {image_spec} table) \NC \NR +\NC \type{comment} \NC any \NC any \NC the arguments of this command are ignored \NC \NR \stoptabulate When a font id is set to~0 then it will be replaced by the currently assigned @@ -479,20 +496,43 @@ font id. This prevents the need for hackery with future id's (normally one could use \type {font.nextid} but when more complex fonts are built in the meantime other instances could have been loaded. +The \type {pdf} option also accepts a \type {mode} keyword in which case the +third argument sets the mode. That option will change the mode in an efficient +way (passing an empty string would result in an extra empty lines in the \PDF\ +file. This option only makes sense for virtual fonts. The \type {font} mode only +makes sense in virtual fonts. + +These modes are somewhat fuzzy and partially inherited from \PDFTEX. + +\starttabulate[|l|p|] +\BC mode \BC description \NC \NR +\NC \type {origin} \NC enter page mode and set the position \NC \NR +\NC \type {page} \NC enter page mode \NC \NR +\NC \type {text} \NC enter text mode \NC \NR +\NC \type {font} \NC enter font mode (kind of text mode, only in virtual fonts) \NC \NR +\NC \type {always} \NC finish the current string and force a transform if needed \NC \NR +\NC \type {raw} \NC finish the current string \NC \NR +\stoptabulate + +You always need to check what \PDF\ code is generated because there can be all kind of +interferences with optimizations in the backend and fonts are complicated anyway. + Here is a rather elaborate glyph commands example: \starttyping ... commands = { - { 'push' }, -- remember where we are - { 'right', 5000 }, -- move right about 0.08pt - { 'font', 3 }, -- select the fonts[3] entry - { 'char', 97 }, -- place character 97 (ASCII 'a') - { 'pop' }, -- go all the way back - { 'down', -200000 }, -- move upwards by about 3pt - { 'special', 'pdf: 1 0 0 rg' } -- switch to red color - { 'rule', 500000, 20000 } -- draw a bar - { 'special','pdf: 0 g' } -- back to black + { "push" }, -- remember where we are + { "right", 5000 }, -- move right about 0.08pt + { "font", 3 }, -- select the fonts[3] entry + { "char", 97 }, -- place character 97 (ASCII 'a') + { "pop" }, -- go all the way back + { "down", -200000 }, -- move upwards by about 3pt + { "special", "pdf: 1 0 0 rg" } -- switch to red color + -- { "pdf", "origin", "1 0 0 rg" } -- switch to red color (alternative) + { "rule", 500000, 20000 } -- draw a bar + { "special", "pdf: 0 g" } -- back to black + -- { "pdf", "origin", "0 g" } -- back to black (alternative) } ... \stoptyping @@ -511,6 +551,10 @@ output pointer will always move by exactly the width that was given in the \type {width} key of the character hash. Any movements that take place inside the \type {commands} array are ignored on the upper level. +The special can have a \type {pdf:}, \type {pdf:origin:}, \type {pdf:page:}, +\type {pdf:direct:} or \type {pdf:raw:} prefix. When you have to concatenate +strings using the \type {pdf} command might be more efficient. + \subsection{Artificial fonts} Even in a \quote {real} font, there can be virtual characters. When \LUATEX\ @@ -564,6 +608,18 @@ Finally, here is a plain \TEX\ input file with a virtual font demonstration: \typebuffer +\section{The \type {vf} library} + +The \type {vf} library can be used when \LUA\ code, as defined in the \type +{commands} of the font, is executed. The functions provided are similar as the +commands: \type {char}, \type {down}, \type {fontid}, \type {image}, \type +{node}, \type {nop}, \type {pop}, \type {push}, \type {right}, \type {rule}, +\type {special} and \type {pdf}. This library has been present for a while but +not been advertised and tested much, if only because it's easy to define an +invalid font (or mess up the \PDF\ stream). Keep in mind that the \LUA\ snippets +are executed each time when a character is output. + + \section{The \type {font} library} The font library provides the interface into the internals of the font system, @@ -662,7 +718,32 @@ You can define your own font into \type {font.fonts} by calling this function: The return value is the internal id number of the defined font (the index into \type {font.fonts}). If the font creation fails, an error is raised. The table -is a font structure, as explained in \in {chapter} [fonts]. +is a font structure, as explained in \in {chapter} [fonts]. An alternative call +is: + +\startfunctioncall +<number> i = + font.define(<number> n, <table> f) +\stopfunctioncall + +Where the first argument is a reserved font id (see below). + +\subsection{Extending a font} + +Within reasonable bounds you can extend a font after it has been defined. Because +some properties are best left unchanged this is limited to adding characters. + +\startfunctioncall +font.addcharacters(<number n>, <table> f) +\stopfunctioncall + +The table passed can have the fields \type {characters} which is a (sub)table +like the one used in define, and for virtual fonts a \type {fonts} table can be +added. The characters defined in the \type {characters} table are added (when not +yet present) or replace an existing entry. Keep in mind that replacing can have +side effects because a character already can have been used. Instead of posing +restrictions we expect the user to be careful. (The \type {setfont} helper is +a more drastic replacer.) \subsection{Projected next font id} @@ -673,7 +754,14 @@ is a font structure, as explained in \in {chapter} [fonts]. This returns the font id number that would be returned by a \type {font.define} call if it was executed at this spot in the code flow. This is useful for virtual -fonts that need to reference themselves. +fonts that need to reference themselves. If you pass \type {true} as argument, +the id gets reserved and you can pass to \type {font.define} as first argument. +This can be handy when you create complex virtual fonts. + +\startfunctioncall +<number> i = + font.nextid(true) +\stopfunctioncall \subsection{Font id} diff --git a/doc/context/sources/general/manuals/luatex/luatex-introduction.tex b/doc/context/sources/general/manuals/luatex/luatex-introduction.tex index 196a9af4f..d0899147d 100644 --- a/doc/context/sources/general/manuals/luatex/luatex-introduction.tex +++ b/doc/context/sources/general/manuals/luatex/luatex-introduction.tex @@ -72,11 +72,10 @@ code in \TEX\ engines (especially code that is not needed any longer). \IO\ can be intercepted. \stopitem \startitem - We currently use \LUA\ 5.2.*. At some point we might decide to move to - 5.3.* but that is yet to be decided. There are few \LUA\ libraries that - we consider part of the core \LUA\ machinery, for instance \type {lpeg}. + We currently use \LUA\ 5.3.*. There are few \LUA\ libraries that we + consider part of the core \LUA\ machinery, for instance \type {lpeg}. There are additional \LUA\ libraries that interface to the internals of - \TEX. + \TEX. We also keep the \LUA\ 5.2 \type {bit32} library around. \stopitem \startitem There are various \TEX\ extensions but only those that cannot be done diff --git a/doc/context/sources/general/manuals/luatex/luatex-languages.tex b/doc/context/sources/general/manuals/luatex/luatex-languages.tex index 54a7b390d..365e87f26 100644 --- a/doc/context/sources/general/manuals/luatex/luatex-languages.tex +++ b/doc/context/sources/general/manuals/luatex/luatex-languages.tex @@ -224,45 +224,104 @@ node. But by default also a hlist, vlist, rule, dir, whatsit, ins, and adjust no indicate a start or end. You can omit the last set from the test by setting \type {\hyphenationbounds} to a non|-|zero value: -\starttabulate[|Tl|l|] -\NC 0 \NC not strict \NC \NR -\NC 1 \NC strict start \NC \NR -\NC 2 \NC strict end \NC \NR -\NC 3 \NC strict start and strict end \NC \NR +\starttabulate[|l|l|] +\NC \type{0} \NC not strict \NC \NR +\NC \type{1} \NC strict start \NC \NR +\NC \type{2} \NC strict end \NC \NR +\NC \type{3} \NC strict start and strict end \NC \NR \stoptabulate The word start is determined as follows: -\starttabulate[|Bl|l|] -\NC boundary \NC yes when wordboundary \NC \NR -\NC hlist \NC when hyphenationbounds 1 or 3 \NC \NR -\NC vlist \NC when hyphenationbounds 1 or 3 \NC \NR -\NC rule \NC when hyphenationbounds 1 or 3 \NC \NR -\NC dir \NC when hyphenationbounds 1 or 3 \NC \NR -\NC whatsit \NC when hyphenationbounds 1 or 3 \NC \NR -\NC glue \NC yes \NC \NR -\NC math \NC skipped \NC \NR -\NC glyph \NC exhyphenchar (one only) : yes (so no -- ---) \NC \NR -\NC otherwise \NC yes \NC \NR +\starttabulate[|l|l|] +\BC boundary \NC yes when wordboundary \NC \NR +\BC hlist \NC when hyphenationbounds 1 or 3 \NC \NR +\BC vlist \NC when hyphenationbounds 1 or 3 \NC \NR +\BC rule \NC when hyphenationbounds 1 or 3 \NC \NR +\BC dir \NC when hyphenationbounds 1 or 3 \NC \NR +\BC whatsit \NC when hyphenationbounds 1 or 3 \NC \NR +\BC glue \NC yes \NC \NR +\BC math \NC skipped \NC \NR +\BC glyph \NC exhyphenchar (one only) : yes (so no -- ---) \NC \NR +\BC otherwise \NC yes \NC \NR \stoptabulate The word end is determined as follows: -\starttabulate[|Bl|l|] -\NC boundary \NC yes \NC \NR -\NC glyph \NC yes when different language \NC \NR -\NC glue \NC yes \NC \NR -\NC penalty \NC yes \NC \NR -\NC kern \NC yes when not italic (for some historic reason) \NC \NR -\NC hlist \NC when hyphenationbounds 2 or 3 \NC \NR -\NC vlist \NC when hyphenationbounds 2 or 3 \NC \NR -\NC rule \NC when hyphenationbounds 2 or 3 \NC \NR -\NC dir \NC when hyphenationbounds 2 or 3 \NC \NR -\NC whatsit \NC when hyphenationbounds 2 or 3 \NC \NR -\NC ins \NC when hyphenationbounds 2 or 3 \NC \NR -\NC adjust \NC when hyphenationbounds 2 or 3 \NC \NR +\starttabulate[|l|l|] +\BC boundary \NC yes \NC \NR +\BC glyph \NC yes when different language \NC \NR +\BC glue \NC yes \NC \NR +\BC penalty \NC yes \NC \NR +\BC kern \NC yes when not italic (for some historic reason) \NC \NR +\BC hlist \NC when hyphenationbounds 2 or 3 \NC \NR +\BC vlist \NC when hyphenationbounds 2 or 3 \NC \NR +\BC rule \NC when hyphenationbounds 2 or 3 \NC \NR +\BC dir \NC when hyphenationbounds 2 or 3 \NC \NR +\BC whatsit \NC when hyphenationbounds 2 or 3 \NC \NR +\BC ins \NC when hyphenationbounds 2 or 3 \NC \NR +\BC adjust \NC when hyphenationbounds 2 or 3 \NC \NR \stoptabulate +\in{Figures}[hb:1] upto \in[hb:5] show some examples. In all cases we set the min +values to 1 and make sure that the words hyphenate at each character. + +\hyphenation{o-n-e t-w-o} + +\def\SomeTest#1#2% + {\lefthyphenmin \plusone + \righthyphenmin \plusone + \parindent \zeropoint + \everypar \emptytoks + \dontcomplain + \hbox to 2cm {% + \vtop {% + \hsize 1pt + \hyphenationbounds#1 + #2 + \par}}} + +\startplacefigure[reference=hb:1,title={\type{one}}] + \startcombination[4*1] + {\SomeTest{0}{one}} {\type{0}} + {\SomeTest{1}{one}} {\type{1}} + {\SomeTest{2}{one}} {\type{2}} + {\SomeTest{3}{one}} {\type{3}} + \stopcombination +\stopplacefigure +\startplacefigure[reference=hb:2,title={\type{one\null two}}] + \startcombination[4*1] + {\SomeTest{0}{one\null two}} {\type{0}} + {\SomeTest{1}{one\null two}} {\type{1}} + {\SomeTest{2}{one\null two}} {\type{2}} + {\SomeTest{3}{one\null two}} {\type{3}} + \stopcombination +\stopplacefigure +\startplacefigure[reference=hb:3,title={\type{\null one\null two}}] + \startcombination[4*1] + {\SomeTest{0}{\null one\null two}} {\type{0}} + {\SomeTest{1}{\null one\null two}} {\type{1}} + {\SomeTest{2}{\null one\null two}} {\type{2}} + {\SomeTest{3}{\null one\null two}} {\type{3}} + \stopcombination +\stopplacefigure +\startplacefigure[reference=hb:4,title={\type{one\null two\null}}] + \startcombination[4*1] + {\SomeTest{0}{one\null two\null}} {\type{0}} + {\SomeTest{1}{one\null two\null}} {\type{1}} + {\SomeTest{2}{one\null two\null}} {\type{2}} + {\SomeTest{3}{one\null two\null}} {\type{3}} + \stopcombination +\stopplacefigure +\startplacefigure[reference=hb:5,title={\type{\null one\null two\null}}] + \startcombination[4*1] + {\SomeTest{0}{\null one\null two\null}} {\type{0}} + {\SomeTest{1}{\null one\null two\null}} {\type{1}} + {\SomeTest{2}{\null one\null two\null}} {\type{2}} + {\SomeTest{3}{\null one\null two\null}} {\type{3}} + \stopcombination +\stopplacefigure + % (Future versions of \LUATEX\ might provide more granularity.) In traditional \TEX\ ligature building and hyphenation are interwoven with the @@ -277,7 +336,7 @@ hyphenated. A side effect is that a leading hyphen can lead to a split but one will seldom run into that situation. Setting a pre and post character makes this more prominent. A value of 1 will prevent this side effect and a value of 2 will not turn the hyphen into a discretionary. Experiments with other options, like -permitting hyphenation, of the words on both sides were discarded. +permitting hyphenation of the words on both sides were discarded. \startbuffer[a] before-after \par @@ -432,18 +491,18 @@ have been added: The first parameter has the following consequences for automatic discs (the ones resulting from an \type {\exhyphenchar}: -\starttabulate[|Tc|l|l|] -\BC mode \BC automatic disc \type{-} \BC explicit disc \type{\-} \NC \NR +\starttabulate[|c|l|l|] +\BC mode \BC automatic disc \type{-} \BC explicit disc \type{\-} \NC \NR \HL -\NC 0 \NC \type {\exhyphenpenalty} \NC \type {\exhyphenpenalty} \NC \NR -\NC 1 \NC \type {\hyphenpenalty} \NC \type {\hyphenpenalty} \NC \NR -\NC 2 \NC \type {\exhyphenpenalty} \NC \type {\hyphenpenalty} \NC \NR -\NC 3 \NC \type {\hyphenpenalty} \NC \type {\exhyphenpenalty} \NC \NR -\NC 4 \NC \type {\automatichyphenpenalty} \NC \type {\explicithyphenpenalty} \NC \NR -\NC 5 \NC \type {\exhyphenpenalty} \NC \type {\explicithyphenpenalty} \NC \NR -\NC 6 \NC \type {\hyphenpenalty} \NC \type {\explicithyphenpenalty} \NC \NR -\NC 7 \NC \type {\automatichyphenpenalty} \NC \type {\exhyphenpenalty} \NC \NR -\NC 8 \NC \type {\automatichyphenpenalty} \NC \type {\hyphenpenalty} \NC \NR +\NC \type{0} \NC \type {\exhyphenpenalty} \NC \type {\exhyphenpenalty} \NC \NR +\NC \type{1} \NC \type {\hyphenpenalty} \NC \type {\hyphenpenalty} \NC \NR +\NC \type{2} \NC \type {\exhyphenpenalty} \NC \type {\hyphenpenalty} \NC \NR +\NC \type{3} \NC \type {\hyphenpenalty} \NC \type {\exhyphenpenalty} \NC \NR +\NC \type{4} \NC \type {\automatichyphenpenalty} \NC \type {\explicithyphenpenalty} \NC \NR +\NC \type{5} \NC \type {\exhyphenpenalty} \NC \type {\explicithyphenpenalty} \NC \NR +\NC \type{6} \NC \type {\hyphenpenalty} \NC \type {\explicithyphenpenalty} \NC \NR +\NC \type{7} \NC \type {\automatichyphenpenalty} \NC \type {\exhyphenpenalty} \NC \NR +\NC \type{8} \NC \type {\automatichyphenpenalty} \NC \type {\hyphenpenalty} \NC \NR \stoptabulate other values do what we always did in \LUATEX: insert \type {\exhyphenpenalty}. @@ -488,9 +547,9 @@ listed items. It is important to note that the keys in an exception dictionary can always be generated from the values. Here are a few examples: \starttabulate[|l|l|l|] -\NC \bf value \NC \bf implied key (input) \NC \bf effect \NC\NR -\NC \type {ta-ble} \NC table \NC \type {ta\-ble} ($=$ \type {ta\discretionary{-}{}{}ble}) \NC\NR -\NC \type {ba{k-}{}{c}ken} \NC backen \NC \type {ba\discretionary{k-}{}{c}ken} \NC\NR +\BC value \BC implied key (input) \NC effect \NC\NR +\NC \type {ta-ble} \NC table \NC \type {ta\-ble} ($=$ \type {ta\discretionary{-}{}{}ble}) \NC\NR +\NC \type {ba{k-}{}{c}ken} \NC backen \NC \type {ba\discretionary{k-}{}{c}ken} \NC\NR \stoptabulate The resultant patterns and exception dictionary will be stored under the language @@ -650,10 +709,10 @@ For example, take the word \type {office}, hyphenated \type {of-fice}, using a type ligatures: \starttabulate[|l|l|] -\NC Initial: \NC \type {{o}{f}{f}{i}{c}{e}} \NC\NR -\NC After hyphenation: \NC \type {{o}{f}{{-},{},{}}{f}{i}{c}{e}} \NC\NR -\NC First ligature stage: \NC \type {{o}{{f-},{f},{<ff>}}{i}{c}{e}} \NC\NR -\NC Final result: \NC \type {{o}{{f-},{<fi>},{<ffi>}}{c}{e}} \NC\NR +\NC initial \NC \type {{o}{f}{f}{i}{c}{e}} \NC\NR +\NC after hyphenation \NC \type {{o}{f}{{-},{},{}}{f}{i}{c}{e}} \NC\NR +\NC first ligature stage \NC \type {{o}{{f-},{f},{<ff>}}{i}{c}{e}} \NC\NR +\NC final result \NC \type {{o}{{f-},{<fi>},{<ffi>}}{c}{e}} \NC\NR \stoptabulate That's bad enough, but let us assume that there is also a hyphenation point @@ -675,25 +734,25 @@ the top-level discretionary that resulted from the first hyphenation point. Here is that nested solution again, in a different representation: -\starttabulate[|l|l|l|l|] -\NC \NC pre \NC post \NC replace \NC \NR -\NC topdisc \NC \type {f-}$^1$ \NC sub1 \NC sub2 \NC \NR -\NC sub1 \NC \type {f-}$^2$ \NC \type {i}$^3$ \NC \type {<fi>}$^4$ \NC \NR -\NC sub2 \NC \type {<ff>-}$^5$\NC \type {i}$^6$ \NC \type {<ffi>}$^7$ \NC \NR +\starttabulate[|l|c|c|c|c|c|c|] +\NC \BC pre \BC \BC post \BC \BC replace \BC \NC \NR +\NC topdisc \NC \type {f-} \NC (1) \NC \NC sub 1 \NC \NC sub 2 \NC \NR +\NC sub 1 \NC \type {f-} \NC (2) \NC \type {i} \NC (3) \NC \type {<fi>} \NC (4) \NC \NR +\NC sub 2 \NC \type {<ff>-} \NC (5) \NC \type {i} \NC (6) \NC \type {<ffi>} \NC (7) \NC \NR \stoptabulate When line breaking is choosing its breakpoints, the following fields will eventually be selected: -\starttabulate[|l|l|l|] -\NC \type {of-f-ice} \NC \type {f-}$^1$ \NC \NR -\NC \NC \type {f-}$^2$ \NC \NR -\NC \NC \type {i}$^3$ \NC \NR -\NC \type {of-fice} \NC \type {f-}$^1$ \NC \NR -\NC \NC \type {<fi>}$^4$ \NC \NR -\NC \type {off-ice} \NC \type {<ff>-}$^5$ \NC \NR -\NC \NC \type {i}$^6$ \NC \NR -\NC \type {office} \NC \type {<ffi>}$^7$ \NC \NR +\starttabulate[|l|c|c|] +\NC \type {of-f-ice} \NC \type {f-} \NC (1) \NC \NR +\NC \NC \type {f-} \NC (2) \NC \NR +\NC \NC \type {i} \NC (3) \NC \NR +\NC \type {of-fice} \NC \type {f-} \NC (1) \NC \NR +\NC \NC \type {<fi>} \NC (4) \NC \NR +\NC \type {off-ice} \NC \type {<ff>-} \NC (5) \NC \NR +\NC \NC \type {i} \NC (6) \NC \NR +\NC \type {office} \NC \type {<ffi>} \NC (7) \NC \NR \stoptabulate The current solution in \LUATEX\ is not able to handle nested discretionaries, @@ -711,14 +770,14 @@ make the whole stuff fit into just two discretionary nodes. The mapping of the seven list fields to the six fields in this discretionary node pair is as follows: -\starttabulate[|l|p|] -\NC \bf field \NC \bf description \NC \NR -\NC \type {disc1.pre} \NC \type {f-}$^1$ \NC \NR -\NC \type {disc1.post} \NC \type {<fi>}$^4$ \NC \NR -\NC \type {disc1.replace} \NC \type {<ffi>}$^7$ \NC \NR -\NC \type {disc2.pre} \NC \type {f-}$^2$ \NC \NR -\NC \type {disc2.post} \NC \type {i}$^{3{,}6}$\NC \NR -\NC \type {disc2.replace} \NC \type {<ff>-}$^5$\NC \NR +\starttabulate[|l|c|c|] +\BC field \BC description \NC \NC \NR +\NC \type {disc1.pre} \NC \type {f-} \NC (1) \NC \NR +\NC \type {disc1.post} \NC \type {<fi>} \NC (4) \NC \NR +\NC \type {disc1.replace} \NC \type {<ffi>} \NC (7) \NC \NR +\NC \type {disc2.pre} \NC \type {f-} \NC (2) \NC \NR +\NC \type {disc2.post} \NC \type {i} \NC (3,6) \NC \NR +\NC \type {disc2.replace} \NC \type {<ff>-} \NC (5) \NC \NR \stoptabulate What is actually generated after ligaturing has been applied is therefore: diff --git a/doc/context/sources/general/manuals/luatex/luatex-lua.tex b/doc/context/sources/general/manuals/luatex/luatex-lua.tex index 0960f8032..82b060440 100644 --- a/doc/context/sources/general/manuals/luatex/luatex-lua.tex +++ b/doc/context/sources/general/manuals/luatex/luatex-lua.tex @@ -55,33 +55,33 @@ option. If there is no \type {--lua} option, the command line is interpreted in similar fashion as the other \TEX\ engines. Some options are accepted but have no consequence. The following command|-|line options are understood: -\starttabulate[|lT|p|] -\NC --credits \NC display credits and exit \NC \NR -\NC --debug-format \NC enable format debugging \NC \NR -\NC --draftmode \NC switch on draft mode i.e.\ generate no output in \PDF\ mode \NC \NR -\NC --[no-]file-line-error \NC disable/enable \type {file:line:error} style messages \NC \NR -\NC --[no-]file-line-error-style \NC aliases of \type {--[no-]file-line-error} \NC \NR -\NC --fmt=FORMAT \NC load the format file \type {FORMAT} \NC\NR -\NC --halt-on-error \NC stop processing at the first error\NC \NR -\NC --help \NC display help and exit \NC\NR -\NC --ini \NC be \type {iniluatex}, for dumping formats \NC\NR -\NC --interaction=STRING \NC set interaction mode: \type {batchmode}, \type {nonstopmode}, \type {scrollmode} or \type {errorstopmode} \NC \NR -\NC --jobname=STRING \NC set the job name to \type {STRING} \NC \NR -\NC --kpathsea-debug=NUMBER \NC set path searching debugging flags according to the bits of \type {NUMBER} \NC \NR -\NC --lua=FILE \NC load and execute a \LUA\ initialization script \NC\NR -\NC --[no-]mktex=FMT \NC disable/enable \type {mktexFMT} generation with \type {FMT} is \type {tex} or \type {tfm} \NC \NR -\NC --nosocket \NC disable the \LUA\ socket library \NC\NR -\NC --output-comment=STRING \NC use \type {STRING} for \DVI\ file comment instead of date (no effect for \PDF) \NC \NR -\NC --output-directory=DIR \NC use \type {DIR} as the directory to write files to \NC \NR -\NC --output-format=FORMAT \NC use \type {FORMAT} for job output; \type {FORMAT} is \type {dvi} or \type {pdf} \NC \NR -\NC --progname=STRING \NC set the program name to \type {STRING} \NC \NR -\NC --recorder \NC enable filename recorder \NC \NR -\NC --safer \NC disable easily exploitable \LUA\ commands \NC\NR -\NC --[no-]shell-escape \NC disable/enable system calls \NC \NR -\NC --shell-restricted \NC restrict system calls to a list of commands given in \type {texmf.cnf} \NC \NR -\NC --synctex=NUMBER \NC enable \type {synctex} \NC \NR -\NC --utc \NC use utc times when applicable \NC \NR -\NC --version \NC display version and exit \NC \NR +\starttabulate[|l|p|] +\NC \type{--credits} \NC display credits and exit \NC \NR +\NC \type{--debug-format} \NC enable format debugging \NC \NR +\NC \type{--draftmode} \NC switch on draft mode i.e.\ generate no output in \PDF\ mode \NC \NR +\NC \type{--[no-]file-line-error} \NC disable/enable \type {file:line:error} style messages \NC \NR +\NC \type{--[no-]file-line-error-style} \NC aliases of \type {--[no-]file-line-error} \NC \NR +\NC \type{--fmt=FORMAT} \NC load the format file \type {FORMAT} \NC\NR +\NC \type{--halt-on-error} \NC stop processing at the first error\NC \NR +\NC \type{--help} \NC display help and exit \NC\NR +\NC \type{--ini} \NC be \type {iniluatex}, for dumping formats \NC\NR +\NC \type{--interaction=STRING} \NC set interaction mode: \type {batchmode}, \type {nonstopmode}, \type {scrollmode} or \type {errorstopmode} \NC \NR +\NC \type{--jobname=STRING} \NC set the job name to \type {STRING} \NC \NR +\NC \type{--kpathsea-debug=NUMBER} \NC set path searching debugging flags according to the bits of \type {NUMBER} \NC \NR +\NC \type{--lua=FILE} \NC load and execute a \LUA\ initialization script \NC\NR +\NC \type{--[no-]mktex=FMT} \NC disable/enable \type {mktexFMT} generation with \type {FMT} is \type {tex} or \type {tfm} \NC \NR +\NC \type{--nosocket} \NC disable the \LUA\ socket library \NC\NR +\NC \type{--output-comment=STRING} \NC use \type {STRING} for \DVI\ file comment instead of date (no effect for \PDF) \NC \NR +\NC \type{--output-directory=DIR} \NC use \type {DIR} as the directory to write files to \NC \NR +\NC \type{--output-format=FORMAT} \NC use \type {FORMAT} for job output; \type {FORMAT} is \type {dvi} or \type {pdf} \NC \NR +\NC \type{--progname=STRING} \NC set the program name to \type {STRING} \NC \NR +\NC \type{--recorder} \NC enable filename recorder \NC \NR +\NC \type{--safer} \NC disable easily exploitable \LUA\ commands \NC\NR +\NC \type{--[no-]shell-escape} \NC disable/enable system calls \NC \NR +\NC \type{--shell-restricted} \NC restrict system calls to a list of commands given in \type {texmf.cnf} \NC \NR +\NC \type{--synctex=NUMBER} \NC enable \type {synctex} \NC \NR +\NC \type{--utc} \NC use utc times when applicable \NC \NR +\NC \type{--version} \NC display version and exit \NC \NR \stoptabulate Some of the traditional flags are just ignored: \type {--etex}, \type @@ -141,7 +141,7 @@ Then it checks the various safety switches. You can use those to disable some \type {--safer} \type {nil}s the following functions: \starttabulate[|l|l|] -\NC \bf library \NC \bf functions \NC \NR +\BC library \BC functions \NC \NR \NC \type {os} \NC \type {execute} \type {exec} \type {spawn} \type {setenv} \type {rename} \type {remove} \type {tmpdir} \NC \NR \NC \type {io} \NC \type {popen} \type {output} \type {tmpfile} \NC \NR \NC \type {lfs} \NC \type {rmdir} \type {mkdir} \type {chdir} \type {lock} \type {touch} \NC \NR @@ -179,8 +179,7 @@ deal with typesetting, like \type {tex}, \type {token}, \type {node} and are \type {nil}'d). Special care is taken that \type {texio.write} and \type {texio.write_nl} function properly, so that you can at least report your actions to the log file when (and if) it eventually becomes opened (note that \TEX\ does -not even know its \type {\jobname} yet at this point). See \in {chapter} [libraries] -for more information about the \LUATEX-specific \LUA\ extension tables. +not even know its \type {\jobname} yet at this point). Everything you do in the \LUA\ initialization script will remain visible during the rest of the run, with the exception of the \TEX\ specific libraries like @@ -214,7 +213,7 @@ the right|-|hand side of an assignment to a \type {\dimen} or \type {\count}. Loading dynamic \LUA\ libraries will fail if there are two \LUA\ libraries loaded at the same time (which will typically happen on \type {win32}, because there is -one \LUA\ 5.2 inside \LUATEX, and another will likely be linked to the \DLL\ file +one \LUA\ 5.3 inside \LUATEX, and another will likely be linked to the \DLL\ file of the module itself). \LUATEX\ is able to use the kpathsea library to find \type {require()}d modules. @@ -304,17 +303,17 @@ piecemeal: \type {string.utfcharacters(s)}: a string with a single \UTF-8 token in it \stopitem \startitem - \type {string.characters(s)} \NC a string containing one byte + \type {string.characters(s)}: a string containing one byte \stopitem \startitem - \type {string.characterpairs(s)} two strings each containing one byte or an + \type {string.characterpairs(s)}: two strings each containing one byte or an empty second string if the string length was odd \stopitem \startitem - \type {string.bytes(s)} a single byte value + \type {string.bytes(s)}: a single byte value \stopitem \startitem - \type {string.bytepairs(s)} two byte values or nil instead of a number as + \type {string.bytepairs(s)}: two byte values or nil instead of a number as its second return value if the string length was odd \stopitem \stopitemize @@ -336,8 +335,28 @@ always returns byte positions in a string, and \type {unicode.utf8.match} and are} \UNICODE|-|aware, they fall|-|back to non|-|\UNICODE|-|aware behavior when using the empty capture \type {()} but other captures work as expected. For the interpretation of character classes in \type {unicode.utf8} functions refer to -the library sources at \hyphenatedurl {http://luaforge.net/projects/sln}. Version -5.3 of \LUA\ will provide some native \UTF8 support. +the library sources at \hyphenatedurl {http://luaforge.net/projects/sln}. + +Version 5.3 of \LUA\ provides some native \UTF8 support but we have added a few +similar helpers too: + +\startitemize +\startitem + \type {string.utfvalue(s)}: returns the codepoints of the characters in the + given string +\stopitem +\startitem + \type {string.utfcharacter(c,...)}: returns a string with the characters of + the given code points +\stopitem +\startitem + \type {string.utflength(s)}: returns the length oif the given string +\stopitem +\stopitemize + +These three functions are relative fast and don't do much checking. They can be used +as building blocks for other helpers. + \blank @@ -405,7 +424,7 @@ The \type {os} library has a few extra functions and variables: \startitem \type {os.env} is a hash table containing a dump of the variables and values in the process environment at the start of the run. It is writeable, - but the actual environment is {\em not\/} updated automatically. + but the actual environment is \notabene {not} updated automatically. \stopitem \startitem @@ -560,12 +579,17 @@ When Universal Time is needed, you can pass the flag \type {utc} to the engine. property also works when the date and time are set by \LUATEX\ itself. It has a complementary entry \type {use_utc_time} in the \type {texconfig} table. -{\em To some extend a cleaner solution would be to have a flag that disables all -variable data in one go (like filenames and so) but we just follow the method -implemented in \PDFTEX\ where primitives are used to influence other properties.} - -{\em In \CONTEXT\ we provide the command line argument \type {--nodates} that -does bit more disabling of dates.} +\startnotabene + To some extend a cleaner solution would be to have a flag that disables all + variable data in one go (like filenames and so) but we just follow the method + implemented in \PDFTEX\ where primitives are used to influence other + properties. +\stopnotabene + +\startnotabene + In \CONTEXT\ we provide the command line argument \type {--nodates} that does + bit more disabling of dates. +\stopnotabene \stopchapter diff --git a/doc/context/sources/general/manuals/luatex/luatex-math.tex b/doc/context/sources/general/manuals/luatex/luatex-math.tex index 3c29d9609..8ccae83f3 100644 --- a/doc/context/sources/general/manuals/luatex/luatex-math.tex +++ b/doc/context/sources/general/manuals/luatex/luatex-math.tex @@ -168,20 +168,20 @@ The input for such primitives would look like this: The altered \TEX82 primitives are: \starttabulate[|l|l|r|c|l|r|] -\NC \bf primitive \NC \bf min \NC \bf max \NC \kern 2em \NC \bf min \NC \bf max \NC \NR -\NC \type {\mathcode} \NC 0 \NC 10FFFF \NC = \NC 0 \NC 8000 \NC \NR -\NC \type {\delcode} \NC 0 \NC 10FFFF \NC = \NC 0 \NC FFFFFF \NC \NR +\BC primitive \BC min \BC max \BC \kern 2em \BC min \BC max \NC \NR +\NC \type {\mathcode} \NC 0 \NC 10FFFF \NC = \NC 0 \NC 8000 \NC \NR +\NC \type {\delcode} \NC 0 \NC 10FFFF \NC = \NC 0 \NC FFFFFF \NC \NR \stoptabulate The unaltered ones are: \starttabulate[|l|l|r|] -\NC \bf primitive \NC \bf min \NC \bf max \NC \NR -\NC \type {\mathchardef} \NC 0 \NC 8000 \NC \NR -\NC \type {\mathchar} \NC 0 \NC 7FFF \NC \NR -\NC \type {\mathaccent} \NC 0 \NC 7FFF \NC \NR -\NC \type {\delimiter} \NC 0 \NC 7FFFFFF \NC \NR -\NC \type {\radical} \NC 0 \NC 7FFFFFF \NC \NR +\BC primitive \BC min \BC max \NC \NR +\NC \type {\mathchardef} \NC 0 \NC 8000 \NC \NR +\NC \type {\mathchar} \NC 0 \NC 7FFF \NC \NR +\NC \type {\mathaccent} \NC 0 \NC 7FFF \NC \NR +\NC \type {\delimiter} \NC 0 \NC 7FFFFFF \NC \NR +\NC \type {\radical} \NC 0 \NC 7FFFFFF \NC \NR \stoptabulate For practical reasons \type {\mathchardef} will silently accept values larger @@ -193,18 +193,18 @@ The following new primitives are compatible with \XETEX: % somewhat fuzzy: \starttabulate[|l|l|r|c|l|r|] -\NC \bf primitive \NC \bf min \NC \bf max \NC \kern 2em \NC \bf min \NC \bf max \NC \NR -\NC \type {\Umathchardef} \NC 0+0+0 \NC 7+FF+10FFFF\rlap{\high{1}} \NC \NC \NC \NC \NR -\NC \type {\Umathcharnumdef}\rlap{\high{5}} \NC -80000000 \NC 7FFFFFFF\rlap{\high{3}} \NC \NC \NC \NC \NR -\NC \type {\Umathcode} \NC 0 \NC 10FFFF \NC = \NC 0+0+0 \NC 7+FF+10FFFF\rlap{\high{1}} \NC \NR -\NC \type {\Udelcode} \NC 0 \NC 10FFFF \NC = \NC 0+0 \NC FF+10FFFF\rlap{\high{2}} \NC \NR -\NC \type {\Umathchar} \NC 0+0+0 \NC 7+FF+10FFFF \NC \NC \NC \NC \NR -\NC \type {\Umathaccent} \NC 0+0+0 \NC 7+FF+10FFFF\rlap{\high{2,4}} \NC \NC \NC \NC \NR -\NC \type {\Udelimiter} \NC 0+0+0 \NC 7+FF+10FFFF\rlap{\high{2}} \NC \NC \NC \NC \NR -\NC \type {\Uradical} \NC 0+0 \NC FF+10FFFF\rlap{\high{2}} \NC \NC \NC \NC \NR -\NC \type {\Umathcharnum} \NC -80000000 \NC 7FFFFFFF\rlap{\high{3}} \NC \NC \NC \NC \NR -\NC \type {\Umathcodenum} \NC 0 \NC 10FFFF \NC = \NC -80000000 \NC 7FFFFFFF\rlap{\high{3}} \NC \NR -\NC \type {\Udelcodenum} \NC 0 \NC 10FFFF \NC = \NC -80000000 \NC 7FFFFFFF\rlap{\high{3}} \NC \NR +\BC primitive \BC min \BC max \BC \kern 2em \BC min \BC max \NC \NR +\NC \type {\Umathchardef} \NC 0+0+0 \NC 7+FF+10FFFF\rlap{\high{1}} \NC \NC \NC \NC \NR +\NC \type {\Umathcharnumdef}\rlap{\high{5}} \NC -80000000 \NC 7FFFFFFF\rlap{\high{3}} \NC \NC \NC \NC \NR +\NC \type {\Umathcode} \NC 0 \NC 10FFFF \NC = \NC 0+0+0 \NC 7+FF+10FFFF\rlap{\high{1}} \NC \NR +\NC \type {\Udelcode} \NC 0 \NC 10FFFF \NC = \NC 0+0 \NC FF+10FFFF\rlap{\high{2}} \NC \NR +\NC \type {\Umathchar} \NC 0+0+0 \NC 7+FF+10FFFF \NC \NC \NC \NC \NR +\NC \type {\Umathaccent} \NC 0+0+0 \NC 7+FF+10FFFF\rlap{\high{2,4}} \NC \NC \NC \NC \NR +\NC \type {\Udelimiter} \NC 0+0+0 \NC 7+FF+10FFFF\rlap{\high{2}} \NC \NC \NC \NC \NR +\NC \type {\Uradical} \NC 0+0 \NC FF+10FFFF\rlap{\high{2}} \NC \NC \NC \NC \NR +\NC \type {\Umathcharnum} \NC -80000000 \NC 7FFFFFFF\rlap{\high{3}} \NC \NC \NC \NC \NR +\NC \type {\Umathcodenum} \NC 0 \NC 10FFFF \NC = \NC -80000000 \NC 7FFFFFFF\rlap{\high{3}} \NC \NR +\NC \type {\Udelcodenum} \NC 0 \NC 10FFFF \NC = \NC -80000000 \NC 7FFFFFFF\rlap{\high{3}} \NC \NR \stoptabulate Specifications typically look like: @@ -238,13 +238,13 @@ details. New primitives that exist in \LUATEX\ only (all of these will be explained in following sections): -\starttabulate[|l|l|l|l|] -\NC \bf primitive \NC \bf value range (in hex) \NC \NR -\NC \type {\Uroot} \NC 0+0--FF+10FFFF$^2$ \NC \NR -\NC \type {\Uoverdelimiter} \NC 0+0--FF+10FFFF$^2$ \NC \NR -\NC \type {\Uunderdelimiter} \NC 0+0--FF+10FFFF$^2$ \NC \NR -\NC \type {\Udelimiterover} \NC 0+0--FF+10FFFF$^2$ \NC \NR -\NC \type {\Udelimiterunder} \NC 0+0--FF+10FFFF$^2$ \NC \NR +\starttabulate[|l|l|] +\BC primitive \BC value range (in hex) \NC \NR +\NC \type {\Uroot} \NC 0+0--FF+10FFFF$^2$ \NC \NR +\NC \type {\Uoverdelimiter} \NC 0+0--FF+10FFFF$^2$ \NC \NR +\NC \type {\Uunderdelimiter} \NC 0+0--FF+10FFFF$^2$ \NC \NR +\NC \type {\Udelimiterover} \NC 0+0--FF+10FFFF$^2$ \NC \NR +\NC \type {\Udelimiterunder} \NC 0+0--FF+10FFFF$^2$ \NC \NR \stoptabulate \section{Cramped math styles} @@ -336,7 +336,7 @@ now accessible via primitive commands. In fact, refactoring of the math engine has resulted in many more parameters than were accessible before. \starttabulate -\NC \bf primitive name \NC \bf description \NC \NR +\BC primitive name \BC description \NC \NR \NC \type {\Umathquad} \NC the width of 18 mu's \NC \NR \NC \type {\Umathaxis} \NC height of the vertical center axis of the math formula above the baseline \NC \NR @@ -412,8 +412,8 @@ to fully control spacing. Therefore \LUATEX\ comes with a new directive: \type {\mathdisplayskipmode}. The following values apply: \starttabulate -\NC 0 \NC normal \TEX\ behaviour: always above, only below when larger than zero \NC \NR -\NC 1 \NC always \NC \NR +\NC 0 \NC normal \TEX\ behaviour \NC \NR +\NC 1 \NC always (same as 0) \NC \NR \NC 2 \NC only when not zero \NC \NR \NC 3 \NC never, not even when not zero \NC \NR \stoptabulate @@ -447,7 +447,7 @@ dimension parameter. For math fonts, this should be set to zero. \switchtobodyfont[8pt] \starttabulate[|l|l|l|p|] -\NC \bf variable \NC \bf style \NC \bf default value opentype \NC \bf default value tfm \NC \NR +\BC variable \BC style \BC default value opentype \BC default value tfm \NC \NR \NC \type {\Umathaxis} \NC -- \NC AxisHeight \NC axis_height \NC \NR \NC \type {\Umathoperatorsize} \NC D, D' \NC DisplayOperatorMinHeight \NC $^6$ \NC \NR \NC \type {\Umathfractiondelsize} \NC D, D' \NC FractionDelimiterDisplayStyleSize$^9$ \NC delim1 \NC \NR @@ -579,7 +579,7 @@ kerns assume correction too. Anyway, with this parameter one can control it. \NC \mathnolimitsmode8000 $\displaystyle\int\nolimits^0_1$ \NC \NR \TB - \NC \bf mode + \BC mode \NC \tttf 0 \NC \tttf 1 \NC \tttf 2 @@ -587,7 +587,7 @@ kerns assume correction too. Anyway, with this parameter one can control it. \NC \tttf 4 \NC \tttf 8000 \NC \NR - \NC \bf superscript + \BC superscript \NC 0 \NC font \NC 0 @@ -595,7 +595,7 @@ kerns assume correction too. Anyway, with this parameter one can control it. \NC +ic/2 \NC 0 \NC \NR - \NC \bf subscript + \BC subscript \NC -ic \NC font \NC 0 @@ -617,26 +617,121 @@ experimenting. The \type {\mathitalicsmode} parameter can be set to~1 to force italic correction before noads that represent some more complex structure (read: everything -that is not an ord, bin, rel, open, close, punct or inner). +that is not an ord, bin, rel, open, close, punct or inner). We show a Cambria +example. \starttexdefinition Whatever #1 - \NC \type{\mathitalicsmode=#1} + \NC \type{\mathitalicsmode = #1} \NC \mathitalicsmode#1\ruledhbox{$\left|T^1\right|$} \NC \mathitalicsmode#1\ruledhbox{$\left|T\right|$} \NC \mathitalicsmode#1\ruledhbox{$T+1$} \NC \mathitalicsmode#1\ruledhbox{$T{1\over2}$} \NC \mathitalicsmode#1\ruledhbox{$T\sqrt{1}$} - \NR \NR + \NC \NR \stoptexdefinition -\starttabulate[|c|c|c|c|c|c|] - \Whatever0 - \Whatever1 -\stoptabulate +\start + \switchtobodyfont[cambria] + \starttabulate[|c|c|c|c|c|c|] + \Whatever{0}% + \Whatever{1}% + \stoptabulate +\stop This kind of parameters relate to the fact that italic correction in \OPENTYPE\ math is bound to fuzzy rules. So, control is the solution. +\section{Script boxes} + +If you want typeset text in math macro packages often provide something \type +{\text} which obeys the script sizes. As the definition can be anything there is +a good change that the kerning doesn't come out well when used in a script. Given +that the first glyph ends up in an \type {\hbox} we have some control over this. +And, as a bonus we also added control over the normal sublist kerning. The \type +{\mathscriptboxmode} parameter defaults to~1. + +\starttabulate[|l|l|] +\NC \type {0} \NC forget about kerning \NC \NR +\NC \type {1} \NC kern math sub lists with a valid glyph \NC \NR +\NC \type {2} \NC also kern math sub boxes that have a valid glyph \NC \NR +\NC \type {2} \NC only kern math sub boxes with a boundary node present\NC \NR +\stoptabulate + +Here we show some examples. Of course this doesn't solve all our problems, if +only because some fonts have characters with bounding boxes that compensate for +italics, while other fonts can lack kerns. + +\startbuffer[1] + $T_{\tf fluff}$ +\stopbuffer + +\startbuffer[2] + $T_{\text{fluff}}$ +\stopbuffer + +\startbuffer[3] + $T_{\text{\boundary1 fluff}}$ +\stopbuffer + +\unexpanded\def\Show#1#2#3% + {\doifelsenothing{#3} + {\small\typeinlinebuffer[#1]} + {\doifelse{#3}{-} + {\small\type{mode #2}} + {\switchtobodyfont[#3]\showfontkerns\showglyphs\mathscriptboxmode#2\relax\inlinebuffer[#1]}}} + +\starttabulate[|lT|c|c|c|c|c|] + \NC \NC \Show{1}{0}{} \NC\Show{1}{1}{} \NC \Show{2}{1}{} \NC \Show{2}{2}{} \NC \Show{3}{3}{} \NC \NR + \NC \NC \Show{1}{0}{-} \NC\Show{1}{1}{-} \NC \Show{2}{1}{-} \NC \Show{2}{2}{-} \NC \Show{3}{3}{-} \NC \NR + \NC modern \NC \Show{1}{0}{modern} \NC\Show{1}{1}{modern} \NC \Show{2}{1}{modern} \NC \Show{2}{2}{modern} \NC \Show{3}{3}{modern} \NC \NR + \NC lucidaot \NC \Show{1}{0}{lucidaot} \NC\Show{1}{1}{lucidaot} \NC \Show{2}{1}{lucidaot} \NC \Show{2}{2}{lucidaot} \NC \Show{3}{3}{lucidaot} \NC \NR + \NC pagella \NC \Show{1}{0}{pagella} \NC\Show{1}{1}{pagella} \NC \Show{2}{1}{pagella} \NC \Show{2}{2}{pagella} \NC \Show{3}{3}{pagella} \NC \NR + \NC cambria \NC \Show{1}{0}{cambria} \NC\Show{1}{1}{cambria} \NC \Show{2}{1}{cambria} \NC \Show{2}{2}{cambria} \NC \Show{3}{3}{cambria} \NC \NR + \NC dejavu \NC \Show{1}{0}{dejavu} \NC\Show{1}{1}{dejavu} \NC \Show{2}{1}{dejavu} \NC \Show{2}{2}{dejavu} \NC \Show{3}{3}{dejavu} \NC \NR +\stoptabulate + +\section{Unscaled fences} + +The \type {\mathdelimitersmode} primitive is experimental and deals with the +following (potential) problems. Three bits can be set. The first bit prevents +an unwanted shift when the fence symbol is not scaled (a cambria side effect). The +second bit forces italic correction between a preceding character ordinal and +the fenced subformula, while the third bit turns that subformula into a ordinary +so that the same spacing applies as with unfenced variants. Here we show Cambria +(with \type {\mathitalicsmode} enabled). + +\starttexdefinition Whatever #1 + \NC \type{\mathdelimitersmode = #1} + \NC \mathitalicsmode1\mathdelimitersmode#1\ruledhbox{\showglyphs\showfontkerns\showfontitalics$f(x)$} + \NC \mathitalicsmode1\mathdelimitersmode#1\ruledhbox{\showglyphs\showfontkerns\showfontitalics$f\left(x\right)$} + \NC \NR +\stoptexdefinition + +\start + \switchtobodyfont[cambria] + \starttabulate[|l|l|l|] + \Whatever{0}\Whatever{1}\Whatever{2}\Whatever{3}% + \Whatever{4}\Whatever{5}\Whatever{6}\Whatever{7}% + \stoptabulate +\stop + +So, when set to 7 fenced subformulas with unscaled delimiters come out the same +as unfenced ones. This can be handy for cases where one is forced to use \type +{\left} and \type {\right} always because of unpredictable content. As said, it's +an experimental features (which somehow fits in the exceptional way fences are +dealt with in the engine). The full list of flags is given in the next table: + +\starttabulate[|T|l|] +\NC "01 \NC don't apply the usual shift \NC \NR +\NC "02 \NC apply italic correction when possible \NC \NR +\NC "04 \NC force a ordinary subformula \NC \NR +\NC "08 \NC no shift when a base character \NC \NR +\NC "10 \NC only shift when an extensible \NC \NR +\stoptabulate + +The effect can depend on the font (and for Cambria one can use for instance \type +{"16}). + \section{Math spacing setting} Besides the parameters mentioned in the previous sections, there are also 64 new @@ -1033,8 +1128,8 @@ get the length of the last line, the following will often work too: \LUATEX\ defines six new primitives that have the same function as \type {^}, \type {_}, \type {$}, and \type {$$}: -\starttabulate[|l|l|l|l|] -\NC \bf primitive \NC \bf explanation \NC \NR +\starttabulate[|l|l|] +\BC primitive \BC explanation \NC \NR \NC \type {\Usuperscript} \NC Duplicates the functionality of \type {^} \NC \NR \NC \type {\Usubscript} \NC Duplicates the functionality of \type {_} \NC \NR \NC \type {\Ustartmath} \NC Duplicates the functionality of \type {$}, % $ @@ -1051,6 +1146,25 @@ The \type {\Ustopmath} and \type {\Ustopdisplaymath} primitives check if the cur math mode is the correct one (inline vs.\ displayed), but you can freely intermix the four mathon|/|mathoff commands with explicit dollar sign(s). +\subsection{Script commands \type {\Unosuperscript} and \type {\Unosubscript}} + +These two commands result in super- and subscripts but with the current style (at the +time of rendering). So, + +\startbuffer[script] +$ + x\Usuperscript {1}\Usubscript {2} = + x\Unosuperscript{1}\Unosubscript{2} = + x\Usuperscript {1}\Unosubscript{2} = + x\Unosuperscript{1}\Usubscript {2} +$ +\stopbuffer + +\typebuffer + +results in \inlinebuffer[script]. + + \subsection{Allowed math commands in non-math modes} The commands \type {\mathchar}, and \type {\Umathchar} and control sequences that @@ -1071,9 +1185,7 @@ with zero being the default behaviour. \start \def\OneLiner#1#2% - {\NC #1 -% \NC \ruledhbox{\mathsurroundmode#1\relax\hsize 100pt x$x$x} -% \NC \ruledhbox{\mathsurroundmode#1\relax\hsize 100pt x $x$ x} + {\NC \type{#1} \NC \dontleavehmode\inframed[align=normal,offset=0pt,frame=off]{\mathsurroundmode#1\relax\hsize 100pt x$x$x} \NC \dontleavehmode\inframed[align=normal,offset=0pt,frame=off]{\mathsurroundmode#1\relax\hsize 100pt x $x$ x} \NC #2 @@ -1086,7 +1198,7 @@ with zero being the default behaviour. \typebuffer \getbuffer -\starttabulate[|Tc|c|c|pl|] +\starttabulate[|c|c|c|pl|] \HL \BC mode \BC \type {x$x$x} \BC \type {x $x$ x} \BC effect \NC \NR \HL @@ -1105,7 +1217,7 @@ with zero being the default behaviour. Method six omits the surround glue when there is (x)spacing glue present while method seven does the opposite, the glue is only applied when there is (x)space -glue present too. Anything more fance, like checking the begining or end of a +glue present too. Anything more fancy, like checking the begining or end of a paragraph (or edges of a box) would not be robust anyway. If you want that you can write a callback that runs over a list and analyzes a paragraph. Actually, in that case you could also inject glue (or set the properties of a math node) @@ -1175,7 +1287,7 @@ still stepping through the successively larger variants. When no dimensions are given the \type {noaxis} command can be used to prevent shifting over the axis. You can influence the final class with the keyword \type {class} which will -influence the spacing. +influence the spacing. The numbers are the same as for character classes. \subsection{Fixed scripts} @@ -1196,13 +1308,13 @@ effects. {$\mathscriptsmode#1\mathupright CH_2 + CH^+_2 + CH^2_2$} \starttabulate[|c|c|c|l|] -\NC \bf mode \NC \bf down \NC \bf up \NC \NC \NR -\NC 0 \NC dynamic \NC dynamic \NC \SampleMath{0} \NC \NR -\NC 1 \NC $d$ \NC $u$ \NC \SampleMath{1} \NC \NR -\NC 2 \NC $s$ \NC $u$ \NC \SampleMath{2} \NC \NR -\NC 3 \NC $s$ \NC $u + s - d$ \NC \SampleMath{3} \NC \NR -\NC 4 \NC $d + (s-d)/2$ \NC $u + (s-d)/2$ \NC \SampleMath{4} \NC \NR -\NC 5 \NC $d$ \NC $u + s - d$ \NC \SampleMath{5} \NC \NR +\BC mode \BC down \BC up \BC \NC \NR +\NC 0 \NC dynamic \NC dynamic \NC \SampleMath{0} \NC \NR +\NC 1 \NC $d$ \NC $u$ \NC \SampleMath{1} \NC \NR +\NC 2 \NC $s$ \NC $u$ \NC \SampleMath{2} \NC \NR +\NC 3 \NC $s$ \NC $u + s - d$ \NC \SampleMath{3} \NC \NR +\NC 4 \NC $d + (s-d)/2$ \NC $u + (s-d)/2$ \NC \SampleMath{4} \NC \NR +\NC 5 \NC $d$ \NC $u + s - d$ \NC \SampleMath{5} \NC \NR \stoptabulate The value of this parameter obeys grouping but applies to the whole current @@ -1210,6 +1322,28 @@ formula. % if needed we can put the value in stylenodes but maybe more should go there +\subsection{Penalties: \type {\mathpenaltiesmode}} + +Only in inline math penalties will be added in a math list. You can force +penalties (also in display math) by setting: + +\starttyping +\mathpenaltiesmode = 1 +\stoptyping + +This primnitive is not really needed in \LUATEX\ because you can use the callback +\type {mlist_to_hlist} to force penalties by just calling the regular routine +with forced penalties. However, as part of opening up and control this primitive +makes sense. As a bonus we also provide two extra penalties: + +\starttyping +\prebinoppenalty = -100 % example value +\prerelpenalty = 900 % example value +\stoptyping + +They default to inifinite which signals that they don't need to be inserted. When +set they are injected before a binop or rel noad. This is an experimental feature. + \subsection {Tracing} Because there are quite some math related parameters and values, it is possible diff --git a/doc/context/sources/general/manuals/luatex/luatex-modifications.tex b/doc/context/sources/general/manuals/luatex/luatex-modifications.tex index 2857603ea..b5d8f2750 100644 --- a/doc/context/sources/general/manuals/luatex/luatex-modifications.tex +++ b/doc/context/sources/general/manuals/luatex/luatex-modifications.tex @@ -326,7 +326,7 @@ provide the ability to use content that has been rendered in several places, and images are also common. For that reason we also changed the names: \starttabulate[|l|l|] -\NC \bf new name \NC \bf old name \NC \NR +\BC new name \BC old name \NC \NR \NC \type {\saveboxresource} \NC \type {\pdfxform} \NC \NR \NC \type {\saveimageresource} \NC \type {\pdfximage} \NC \NR \NC \type {\useboxresource} \NC \type {\pdfrefxform} \NC \NR @@ -1063,20 +1063,58 @@ kerns, should be handled in the input or macro package because there is no way w can predict the expected behaviour. In fact, the \type {\linedir} is just a convenience extra which could also have been implemented using node list parsing. +Glue after a dir node is ignored in the linebreak decision but you can bypass that +by setting \type {\breakafterdirmode} to~\type {1}. The following table shows the +difference. Watch your spaces. + +\def\ShowSome#1{% + \BC + \type{#1} + \NC + \breakafterdirmode = 0 + \hsize 0pt + #1 + \NC + \NC + \breakafterdirmode = 1 + \hsize 0pt + #1 + \NC + \NC \NR \HL +} + +\starttabulate[|l|Tp(0pt)|w(5em)|Tp(0pt)|p|] + \HL + \BC \type{\breakafterdirmode} + \BC \type{0} + \NC + \BC \type{1} + \NC + \NC \NR + \HL + \ShowSome{pre {\textdir TLT xxx} post} + \ShowSome{pre {\textdir TLT xxx }post} + \ShowSome{pre{ \textdir TLT xxx} post} + \ShowSome{pre{ \textdir TLT xxx }post} + \ShowSome{pre { \textdir TLT xxx } post} + \ShowSome{pre {\textdir TLT\relax\space xxx} post} +\stoptabulate + + Another adaptation to the \ALEPH\ directional model is control over shapes driven by \type {\hangindent} and \type {\parshape}. This is controlled by a new parameter \type {\shapemode}: -\starttabulate[|cTB|c|] -\NC \NC \bf \type {\hangindent} \NC \bf \type {\parshape} \NC \NR -\NC 0 \NC normal \NC normal \NC \NR -\NC 1 \NC mirrored \NC normal \NC \NR -\NC 2 \NC normal \NC mirrored \NC \NR -\NC 3 \NC mirrored \NC mirrored \NC \NR +\starttabulate[|c|c|c|] +\BC \BC \type {\hangindent} \BC \type {\parshape} \NC \NR +\BC \type{0} \NC normal \NC normal \NC \NR +\BC \type{1} \NC mirrored \NC normal \NC \NR +\BC \type{2} \NC normal \NC mirrored \NC \NR +\BC \type{3} \NC mirrored \NC mirrored \NC \NR \stoptabulate The value is reset to zero (like \type {\hangindent} and \type {\parshape}) -after the paragraph is done with. You can use negative values to preven t +after the paragraph is done with. You can use negative values to prevent this. In \in {figure} [fig:shapemode] a few examples are given. @@ -1217,6 +1255,28 @@ previous code (that mostly used \type {getc} calls), it can be quite a bit faste \stopsubsection +\startsubsection[title=Tabs and spaces] + +We conform to the way other \TEX\ engines handle trailing tabs and spaces. For +decades trailing tabs and spaces (before a newline) were removed from the input +but this behaviour was changed in September 2017 to only handle spaces. We are +aware that this can introduce compatibility issues in existing workflows but +because we don't want too many differences with upstream \TEXLIVE\ we just follow +up on that patch (which is a functional one and not really a fix). It is up to +macro packages maintainers to deal with possible compatibility issues and in +\LUATEX\ they can do so via the callbacks that deal with reading from files. + +The previous behaviour was a known side effect and (as that kind of input +normally comes from generated sources) it was normally dealt with by adding a +comment token to the line in case the spaces and|/|or tabs were intentional and +to be kept. We are aware of the fact that this contradicts some of our other +choices but consistency with other engines and the fact that in \KPSE\ mode a +common file \IO\ layer is used can have a side effect of breaking compatibility. +We still stick to our view that at the log level we can (and might be) more +incompatible. + +\stopsubsection + \stopsection \stopchapter diff --git a/doc/context/sources/general/manuals/luatex/luatex-nodes.tex b/doc/context/sources/general/manuals/luatex/luatex-nodes.tex index d3c2c06da..517d9b6c8 100644 --- a/doc/context/sources/general/manuals/luatex/luatex-nodes.tex +++ b/doc/context/sources/general/manuals/luatex/luatex-nodes.tex @@ -35,6 +35,13 @@ You can ask for a list of fields with the \type {node.fields} (which takes an id and for valid subtypes with \type {node.subtypes} (which takes a string because eventually we might support more used enumerations). +The \type {node.values} function reports some used values. Valid arguments are +\type {dir}, \type {direction}, \type {glue}, \type {pdf_literal}, \type +{pdf_action}, \type {pdf_window} and \type {color_stack}. Keep in mind that the +setters normally expect a number, but this helper gives you a list of what +numbers matter. For practical reason the \type {pagestate} values are also +reported with this helper. + \subsection{Attributes} The newly introduced attribute registers are non|-|trivial, because the value @@ -48,9 +55,9 @@ the low|-|level interface. An \type {attribute_list} item is used as a head pointer for a list of attribute items. It has only one user-visible field: -\starttabulate[|lT|l|p|] -\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR -\NC next \NC node \NC pointer to the first attribute \NC \NR +\starttabulate[|l|l|p|] +\BC field \BC type \BC explanation \NC \NR +\NC \type{next} \NC node \NC pointer to the first attribute \NC \NR \stoptabulate \subsubsection{attribute nodes} @@ -60,11 +67,11 @@ A normal node's attribute field will point to an item of type \type defined \quote {attribute} item, whose \type {next} will point to the second \quote {attribute} item, etc. -\starttabulate[|lT|l|p|] -\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR -\NC next \NC node \NC pointer to the next attribute \NC \NR -\NC number \NC number \NC the attribute type id \NC \NR -\NC value \NC number \NC the attribute value \NC \NR +\starttabulate[|l|l|p|] +\BC field \BC type \BC explanation \NC \NR +\NC \type{next} \NC node \NC pointer to the next attribute \NC \NR +\NC \type{number} \NC number \NC the attribute type id \NC \NR +\NC \type{value} \NC number \NC the attribute value \NC \NR \stoptabulate As mentioned it's better to use the official helpers rather than edit these @@ -76,11 +83,11 @@ and there is no double linked list. These are the nodes that comprise actual typesetting commands. A few fields are present in all nodes regardless of their type, these are: -\starttabulate[|lT|l|p|] -\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR -\NC next \NC node \NC the next node in a list, or nil \NC \NR -\NC id \NC number \NC the node's type (\type {id}) number \NC \NR -\NC subtype \NC number \NC the node \type {subtype} identifier \NC \NR +\starttabulate[|l|l|p|] +\BC field \BC type \BC explanation \NC \NR +\NC \type{next} \NC node \NC the next node in a list, or nil \NC \NR +\NC \type{id} \NC number \NC the node's type (\type {id}) number \NC \NR +\NC \type{subtype} \NC number \NC the node \type {subtype} identifier \NC \NR \stoptabulate The \type {subtype} is sometimes just a stub entry. Not all nodes actually use @@ -98,19 +105,19 @@ internal magic uses a leading \type {temp} nodes to temporarily store a state. \subsubsection{hlist nodes} -\starttabulate[|lT|l|p|] -\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR -\NC subtype \NC number \NC \showsubtypes{list} \NC \NR -\NC attr \NC node \NC list of attributes \NC \NR -\NC width \NC number \NC the width of the box \NC \NR -\NC height \NC number \NC the height of the box \NC \NR -\NC depth \NC number \NC the depth of the box \NC \NR -\NC shift \NC number \NC a displacement perpendicular to the character progression direction \NC \NR -\NC glue_order \NC number \NC a number in the range $[0,4]$, indicating the glue order \NC \NR -\NC glue_set \NC number \NC the calculated glue ratio \NC \NR -\NC glue_sign \NC number \NC 0 = \type {normal}, 1 = \type {stretching}, 2 = \type {shrinking} \NC \NR -\NC head/list \NC node \NC the first node of the body of this list \NC \NR -\NC dir \NC string \NC the direction of this box, see~\in[dirnodes] \NC \NR +\starttabulate[|l|l|p|] +\BC field \BC type \BC explanation \NC \NR +\NC \type{subtype} \NC number \NC \showsubtypes{list} \NC \NR +\NC \type{attr} \NC node \NC list of attributes \NC \NR +\NC \type{width} \NC number \NC the width of the box \NC \NR +\NC \type{height} \NC number \NC the height of the box \NC \NR +\NC \type{depth} \NC number \NC the depth of the box \NC \NR +\NC \type{shift} \NC number \NC a displacement perpendicular to the character progression direction \NC \NR +\NC \type{glue_order} \NC number \NC a number in the range $[0,4]$, indicating the glue order \NC \NR +\NC \type{glue_set} \NC number \NC the calculated glue ratio \NC \NR +\NC \type{glue_sign} \NC number \NC 0 = \type {normal}, 1 = \type {stretching}, 2 = \type {shrinking} \NC \NR +\NC \type{head/list} \NC node \NC the first node of the body of this list \NC \NR +\NC \type{dir} \NC string \NC the direction of this box, see~\in[dirnodes] \NC \NR \stoptabulate A warning: never assign a node list to the \type {head} field unless you are sure @@ -132,27 +139,27 @@ Contrary to traditional \TEX, \LUATEX\ has more subtypes because we also use rules to store reuseable objects and images. User nodes are invisible and can be intercepted by a callback. -\starttabulate[|lT|l|p|] -\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR -\NC subtype \NC number \NC \showsubtypes{rule} \NC \NR -\NC attr \NC node \NC list of attributes \NC \NR -\NC width \NC number \NC the width of the rule where the special value $-1073741824$ is used for \quote {running} glue dimensions \NC \NR -\NC height \NC number \NC the height of the rule (can be negative) \NC \NR -\NC depth \NC number \NC the depth of the rule (can be negative) \NC \NR -\NC dir \NC string \NC the direction of this rule, see~\in[dirnodes] \NC \NR -\NC index \NC number \NC an optional index that can be referred to \NC \NR +\starttabulate[|l|l|p|] +\BC field \BC type \BC explanation \NC \NR +\NC \type{subtype} \NC number \NC \showsubtypes{rule} \NC \NR +\NC \type{attr} \NC node \NC list of attributes \NC \NR +\NC \type{width} \NC number \NC the width of the rule where the special value $-1073741824$ is used for \quote {running} glue dimensions \NC \NR +\NC \type{height} \NC number \NC the height of the rule (can be negative) \NC \NR +\NC \type{depth} \NC number \NC the depth of the rule (can be negative) \NC \NR +\NC \type{dir} \NC string \NC the direction of this rule, see~\in[dirnodes] \NC \NR +\NC \type{index} \NC number \NC an optional index that can be referred to \NC \NR \stoptabulate \subsubsection{ins nodes} -\starttabulate[|lT|l|p|] -\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR -\NC subtype \NC number \NC the insertion class \NC \NR -\NC attr \NC node \NC list of attributes \NC \NR -\NC cost \NC number \NC the penalty associated with this insert \NC \NR -\NC height \NC number \NC height of the insert \NC \NR -\NC depth \NC number \NC depth of the insert \NC \NR -\NC head/list \NC node \NC the first node of the body of this insert \NC \NR +\starttabulate[|l|l|p|] +\BC field \BC type \BC explanation \NC \NR +\NC \type{subtype} \NC number \NC the insertion class \NC \NR +\NC \type{attr} \NC node \NC list of attributes \NC \NR +\NC \type{cost} \NC number \NC the penalty associated with this insert \NC \NR +\NC \type{height} \NC number \NC height of the insert \NC \NR +\NC \type{depth} \NC number \NC depth of the insert \NC \NR +\NC \type{head/list} \NC node \NC the first node of the body of this insert \NC \NR \stoptabulate There is a set of extra fields that concern the associated glue: \type {width}, @@ -166,21 +173,21 @@ names and both names are equally sensible). \subsubsection{mark nodes} -\starttabulate[|lT|l|p|] -\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR -\NC subtype \NC number \NC unused \NC \NR -\NC attr \NC node \NC list of attributes \NC \NR -\NC class \NC number \NC the mark class \NC \NR -\NC mark \NC table \NC a table representing a token list \NC \NR +\starttabulate[|l|l|p|] +\BC field \BC type \BC explanation \NC \NR +\NC \type{subtype} \NC number \NC unused \NC \NR +\NC \type{attr} \NC node \NC list of attributes \NC \NR +\NC \type{class} \NC number \NC the mark class \NC \NR +\NC \type{mark} \NC table \NC a table representing a token list \NC \NR \stoptabulate \subsubsection{adjust nodes} -\starttabulate[|lT|l|p|] -\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR -\NC subtype \NC number \NC \showsubtypes{adjust} \NC \NR -\NC attr \NC node \NC list of attributes \NC \NR -\NC head/list \NC node \NC adjusted material \NC \NR +\starttabulate[|l|l|p|] +\BC field \BC type \BC explanation \NC \NR +\NC \type{subtype} \NC number \NC \showsubtypes{adjust} \NC \NR +\NC \type{attr} \NC node \NC list of attributes \NC \NR +\NC \type{head/list} \NC node \NC adjusted material \NC \NR \stoptabulate A warning: never assign a node list to the \type {head} field unless you are sure @@ -188,14 +195,14 @@ its internal link structure is correct, otherwise an error may be result. \subsubsection{disc nodes} -\starttabulate[|lT|l|p|] -\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR -\NC subtype \NC number \NC \showsubtypes{disc} \NC \NR -\NC attr \NC node \NC list of attributes \NC \NR -\NC pre \NC node \NC pointer to the pre|-|break text \NC \NR -\NC post \NC node \NC pointer to the post|-|break text \NC \NR -\NC replace \NC node \NC pointer to the no|-|break text \NC \NR -\NC penalty \NC number \NC the penalty associated with the break, normally \type {\hyphenpenalty} or \type {\exhyphenpenalty} \NC \NR +\starttabulate[|l|l|p|] +\BC field \BC type \BC explanation \NC \NR +\NC \type{subtype} \NC number \NC \showsubtypes{disc} \NC \NR +\NC \type{attr} \NC node \NC list of attributes \NC \NR +\NC \type{pre} \NC node \NC pointer to the pre|-|break text \NC \NR +\NC \type{post} \NC node \NC pointer to the post|-|break text \NC \NR +\NC \type{replace} \NC node \NC pointer to the no|-|break text \NC \NR +\NC \type{penalty} \NC number \NC the penalty associated with the break, normally \type {\hyphenpenalty} or \type {\exhyphenpenalty} \NC \NR \stoptabulate The subtype numbers~4 and~5 belong to the \quote {of-f-ice} explanation given @@ -223,11 +230,11 @@ freeing it again might crash \LUATEX). \subsubsection{math nodes} -\starttabulate[|lT|l|p|] -\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR -\NC subtype \NC number \NC \showsubtypes{math} \NC \NR -\NC attr \NC node \NC list of attributes \NC \NR -\NC surround \NC number \NC width of the \type {\mathsurround} kern \NC \NR +\starttabulate[|l|l|p|] +\BC field \BC type \BC explanation \NC \NR +\NC \type{subtype} \NC number \NC \showsubtypes{math} \NC \NR +\NC \type{attr} \NC node \NC list of attributes \NC \NR +\NC \type{surround} \NC number \NC width of the \type {\mathsurround} kern \NC \NR \stoptabulate There is a set of extra fields that concern the associated glue: \type {width}, @@ -240,13 +247,13 @@ Skips are about the only type of data objects in traditional \TEX\ that are not simple value. The structure that represents the glue components of a skip is called a \type {glue_spec}, and it has the following accessible fields: -\starttabulate[|lT|l|p|] -\NC \rmbf key \NC \bf type \NC \bf explanation \NC \NR -\NC width \NC number \NC the horizontal or vertical displacement \NC \NR -\NC stretch \NC number \NC extra (positive) displacement or stretch amount \NC \NR -\NC stretch_order \NC number \NC factor applied to stretch amount \NC \NR -\NC shrink \NC number \NC extra (negative) displacement or shrink amount\NC \NR -\NC shrink_order \NC number \NC factor applied to shrink amount \NC \NR +\starttabulate[|l|l|p|] +\BC key \BC type \BC explanation \NC \NR +\NC \type{width} \NC number \NC the horizontal or vertical displacement \NC \NR +\NC \type{stretch} \NC number \NC extra (positive) displacement or stretch amount \NC \NR +\NC \type{stretch_order} \NC number \NC factor applied to stretch amount \NC \NR +\NC \type{shrink} \NC number \NC extra (negative) displacement or shrink amount\NC \NR +\NC \type{shrink_order} \NC number \NC factor applied to shrink amount \NC \NR \stoptabulate The effective width of some glue subtypes depends on the stretch or shrink needed @@ -273,11 +280,11 @@ a field can result in a new copy). So in the end the advantages of sharing are not that high (and nowadays memory is less an issue, also given that a glue node is only a few memory words larger than a spec). -\starttabulate[|lT|l|p|] -\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR -\NC subtype \NC number \NC \showsubtypes{glue} \NC \NR -\NC attr \NC node \NC list of attributes \NC \NR -\NC leader \NC node \NC pointer to a box or rule for leaders \NC \NR +\starttabulate[|l|l|p|] +\BC field \BC type \BC explanation \NC \NR +\NC \type{subtype} \NC number \NC \showsubtypes{glue} \NC \NR +\NC \type{attr} \NC node \NC list of attributes \NC \NR +\NC \type{leader} \NC node \NC pointer to a box or rule for leaders \NC \NR \stoptabulate In addition there are the \type {width}, \type {stretch} \type {stretch_order}, @@ -290,20 +297,20 @@ a \type {userskip} with subtype zero). \subsubsection{kern nodes} -\starttabulate[|lT|l|p|] -\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR -\NC subtype \NC number \NC \showsubtypes{kern} \NC \NR -\NC attr \NC node \NC list of attributes \NC \NR -\NC kern \NC number \NC fixed horizontal or vertical advance \NC \NR +\starttabulate[|l|l|p|] +\BC field \BC type \BC explanation \NC \NR +\NC \type{subtype} \NC number \NC \showsubtypes{kern} \NC \NR +\NC \type{attr} \NC node \NC list of attributes \NC \NR +\NC \type{kern} \NC number \NC fixed horizontal or vertical advance \NC \NR \stoptabulate \subsubsection{penalty nodes} -\starttabulate[|lT|l|p|] -\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR -\NC subtype \NC number \NC \showsubtypes{penalty} \NC \NR -\NC attr \NC node \NC list of attributes \NC \NR -\NC penalty \NC number \NC the penalty value \NC \NR +\starttabulate[|l|l|p|] +\BC field \BC type \BC explanation \NC \NR +\NC \type{subtype} \NC number \NC \showsubtypes{penalty} \NC \NR +\NC \type{attr} \NC node \NC list of attributes \NC \NR +\NC \type{penalty} \NC number \NC the penalty value \NC \NR \stoptabulate The subtypes are just informative and \TEX\ itself doesn't use them. When you @@ -312,24 +319,24 @@ accumulation of \type {club}, \type{widow} and other relevant penalties. \subsubsection[glyphnodes]{glyph nodes} -\starttabulate[|lT|l|p|] -\NC \rmbf field \NC \rmbf type \NC \rmbf explanation \NC \NR -\NC subtype \NC number \NC bitfield \NC \NR -\NC attr \NC node \NC list of attributes \NC \NR -\NC char \NC number \NC the chatacter index in the font \NC \NR -\NC font \NC number \NC the font identifier \NC \NR -\NC lang \NC number \NC the language identifier \NC \NR -\NC left \NC number \NC the frozen \type {\lefthyphenmnin} value \NC \NR -\NC right \NC number \NC the frozen \type {\righthyphenmnin} value \NC \NR -\NC uchyph \NC boolean \NC the frozen \type {\uchyph} value \NC \NR -\NC components \NC node \NC pointer to ligature components \NC \NR -\NC xoffset \NC number \NC a virtual displacement in horizontal direction \NC \NR -\NC yoffset \NC number \NC a virtual displacement in vertical direction \NC \NR -\NC xadvance \NC number \NC an additional advance after the glyph (experimental) \NC \NR -\NC width \NC number \NC the (original) width of the character \NC \NR -\NC height \NC number \NC the (original) height of the character\NC \NR -\NC depth \NC number \NC the (original) depth of the character\NC \NR -\NC expansion_factor \NC number \NC the to be applied expansion_factor \NC \NR +\starttabulate[|l|l|p|] +\BC field \BC type \BC explanation \NC \NR +\NC \type{subtype} \NC number \NC bitfield \NC \NR +\NC \type{attr} \NC node \NC list of attributes \NC \NR +\NC \type{char} \NC number \NC the chatacter index in the font \NC \NR +\NC \type{font} \NC number \NC the font identifier \NC \NR +\NC \type{lang} \NC number \NC the language identifier \NC \NR +\NC \type{left} \NC number \NC the frozen \type {\lefthyphenmnin} value \NC \NR +\NC \type{right} \NC number \NC the frozen \type {\righthyphenmnin} value \NC \NR +\NC \type{uchyph} \NC boolean \NC the frozen \type {\uchyph} value \NC \NR +\NC \type{components} \NC node \NC pointer to ligature components \NC \NR +\NC \type{xoffset} \NC number \NC a virtual displacement in horizontal direction \NC \NR +\NC \type{yoffset} \NC number \NC a virtual displacement in vertical direction \NC \NR +%NC \type{xadvance} \NC number \NC an additional advance after the glyph (experimental) \NC \NR +\NC \type{width} \NC number \NC the (original) width of the character \NC \NR +\NC \type{height} \NC number \NC the (original) height of the character\NC \NR +\NC \type{depth} \NC number \NC the (original) depth of the character\NC \NR +\NC \type{expansion_factor} \NC number \NC the to be applied expansion_factor \NC \NR \stoptabulate The \type {width}, \type {height} and \type {depth} values are read|-|only. The @@ -340,12 +347,12 @@ its internal link structure is correct, otherwise an error may be result. Valid bits for the \type {subtype} field are: \starttabulate[|c|l|] -\NC \rmbf bit \NC \bf meaning \NC \NR -\NC 0 \NC character \NC \NR -\NC 1 \NC ligature \NC \NR -\NC 2 \NC ghost \NC \NR -\NC 3 \NC left \NC \NR -\NC 4 \NC right \NC \NR +\BC bit \BC meaning \NC \NR +\NC 0 \NC character \NC \NR +\NC 1 \NC ligature \NC \NR +\NC 2 \NC ghost \NC \NR +\NC 3 \NC left \NC \NR +\NC 4 \NC right \NC \NR \stoptabulate See \in {section} [charsandglyphs] for a detailed description of the \type @@ -368,15 +375,16 @@ and \type {false} gets returned otherwise. When nil is returned, the id is also returned. The \type {is_glyph} variant doesn't check for a subtype being less than 256, so it returns either the character value or nil plus the id. These helpers are not always faster than separate calls but they sometimes permit -making more readable tests. +making more readable tests. The \type {uses_font} helpers takes a node +and font id and returns true when a glyph or disc node references that font. \subsubsection{boundary nodes} -\starttabulate[|lT|l|p|] -\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR -\NC subtype \NC number \NC \showsubtypes{boundary} \NC \NR -\NC attr \NC node \NC list of attributes \NC \NR -\NC value \NC number \NC values 0--255 are reserved \NC \NR +\starttabulate[|l|l|p|] +\BC field \BC type \BC explanation \NC \NR +\NC \type{subtype} \NC number \NC \showsubtypes{boundary} \NC \NR +\NC \type{attr} \NC node \NC list of attributes \NC \NR +\NC \type{value} \NC number \NC values 0--255 are reserved \NC \NR \stoptabulate This node relates to the \type {\noboundary}, \type {\boundary}, \type @@ -384,16 +392,16 @@ This node relates to the \type {\noboundary}, \type {\boundary}, \type \subsubsection{local_par nodes} -\starttabulate[|lT|l|p|] -\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR -\NC attr \NC node \NC list of attributes \NC \NR -\NC pen_inter \NC number \NC local interline penalty (from \type {\localinterlinepenalty}) \NC \NR -\NC pen_broken \NC number \NC local broken penalty (from \type {\localbrokenpenalty}) \NC \NR -\NC dir \NC string \NC the direction of this par. see~\in [dirnodes] \NC \NR -\NC box_left \NC node \NC the \type {\localleftbox} \NC \NR -\NC box_left_width \NC number \NC width of the \type {\localleftbox} \NC \NR -\NC box_right \NC node \NC the \type {\localrightbox} \NC \NR -\NC box_right_width \NC number \NC width of the \type {\localrightbox} \NC \NR +\starttabulate[|l|l|p|] +\BC field \BC type \BC explanation \NC \NR +\NC \type{attr} \NC node \NC list of attributes \NC \NR +\NC \type{pen_inter} \NC number \NC local interline penalty (from \type {\localinterlinepenalty}) \NC \NR +\NC \type{pen_broken} \NC number \NC local broken penalty (from \type {\localbrokenpenalty}) \NC \NR +\NC \type{dir} \NC string \NC the direction of this par. see~\in [dirnodes] \NC \NR +\NC \type{box_left} \NC node \NC the \type {\localleftbox} \NC \NR +\NC \type{box_left_width} \NC number \NC width of the \type {\localleftbox} \NC \NR +\NC \type{box_right} \NC node \NC the \type {\localrightbox} \NC \NR +\NC \type{box_right_width} \NC number \NC width of the \type {\localrightbox} \NC \NR \stoptabulate A warning: never assign a node list to the \type {box_left} or \type {box_right} @@ -402,11 +410,11 @@ error may be result. \subsubsection[dirnodes]{dir nodes} -\starttabulate[|lT|l|p|] -\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR -\NC attr \NC node \NC list of attributes \NC \NR -\NC dir \NC string \NC the direction (but see below) \NC \NR -\NC level \NC number \NC nesting level of this direction whatsit \NC \NR +\starttabulate[|l|l|p|] +\BC field \BC type \BC explanation \NC \NR +\NC \type{attr} \NC node \NC list of attributes \NC \NR +\NC \type{dir} \NC string \NC the direction (but see below) \NC \NR +\NC \type{level} \NC number \NC nesting level of this direction whatsit \NC \NR \stoptabulate A note on \type {dir} strings. Direction specifiers are three|-|letter @@ -436,12 +444,12 @@ or popped from the direction stack. \subsubsection{margin_kern nodes} -\starttabulate[|lT|l|p|] -\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR -\NC subtype \NC number \NC \showsubtypes{margin_kern} \NC \NR -\NC attr \NC node \NC list of attributes \NC \NR -\NC width \NC number \NC the advance of the kern \NC \NR -\NC glyph \NC node \NC the glyph to be used \NC \NR +\starttabulate[|l|l|p|] +\BC field \BC type \BC explanation \NC \NR +\NC \type{subtype} \NC number \NC \showsubtypes{margin_kern} \NC \NR +\NC \type{attr} \NC node \NC list of attributes \NC \NR +\NC \type{width} \NC number \NC the advance of the kern \NC \NR +\NC \type{glyph} \NC node \NC the glyph to be used \NC \NR \stoptabulate \subsection{Math nodes} @@ -461,11 +469,11 @@ The \type {next} and \type {prev} fields for these subnodes are unused. \subsubsubsection{math_char and math_text_char subnodes} -\starttabulate[|lT|l|p|] -\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR -\NC attr \NC node \NC list of attributes \NC \NR -\NC char \NC number \NC the character index \NC \NR -\NC fam \NC number \NC the family number \NC \NR +\starttabulate[|l|l|p|] +\BC field \BC type \BC explanation \NC \NR +\NC \type{attr} \NC node \NC list of attributes \NC \NR +\NC \type{char} \NC number \NC the character index \NC \NR +\NC \type{fam} \NC number \NC the family number \NC \NR \stoptabulate The \type {math_char} is the simplest subnode field, it contains the character @@ -475,10 +483,10 @@ conversion (its sole function is to suppress a following italic correction). \subsubsubsection{sub_box and sub_mlist subnodes} -\starttabulate[|lT|l|p|] -\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR -\NC attr \NC node \NC list of attributes \NC \NR -\NC head/list \NC node \NC list of nodes \NC \NR +\starttabulate[|l|l|p|] +\BC field \BC type \BC explanation \NC \NR +\NC \type{attr} \NC node \NC list of attributes \NC \NR +\NC \type{head/list} \NC node \NC list of nodes \NC \NR \stoptabulate These two subnode types are used for subsidiary list items. For \type {sub_box}, @@ -495,13 +503,13 @@ before, the \type {next} and \type {prev} fields are unused. \subsubsubsection{delim subnodes} -\starttabulate[|lT|l|p|] -\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR -\NC attr \NC node \NC list of attributes \NC \NR -\NC small_char \NC number \NC character index of base character \NC \NR -\NC small_fam \NC number \NC family number of base character \NC \NR -\NC large_char \NC number \NC character index of next larger character \NC \NR -\NC large_fam \NC number \NC family number of next larger character \NC \NR +\starttabulate[|l|l|p|] +\BC field \BC type \BC explanation \NC \NR +\NC \type{attr} \NC node \NC list of attributes \NC \NR +\NC \type{small_char} \NC number \NC character index of base character \NC \NR +\NC \type{small_fam} \NC number \NC family number of base character \NC \NR +\NC \type{large_char} \NC number \NC character index of next larger character \NC \NR +\NC \type{large_fam} \NC number \NC family number of next larger character \NC \NR \stoptabulate The fields \type {large_char} and \type {large_fam} can be zero, in that case the @@ -515,50 +523,68 @@ associated with the simple math objects: ord, op, bin, rel, open, close, punct, inner, over, under, vcent. These all have the same fields, and they are combined into a single node type with separate subtypes for differentiation. +Some noads have an option field. The values in this bitset are common: + +\starttabulate[|l|r|] +\NC set \NC \type{0x08} \NC \NR +\NC internal \NC \type{0x00} + \type{0x08} \NC \NR +\NC internal \NC \type{0x01} + \type{0x08} \NC \NR +\NC axis \NC \type{0x02} + \type{0x08} \NC \NR +\NC no axis \NC \type{0x04} + \type{0x08} \NC \NR +\NC exact \NC \type{0x10} + \type{0x08} \NC \NR +\NC left \NC \type{0x11} + \type{0x08} \NC \NR +\NC middle \NC \type{0x12} + \type{0x08} \NC \NR +\NC right \NC \type{0x14} + \type{0x08} \NC \NR +\NC no sub script \NC \type{0x21} + \type{0x08} \NC \NR +\NC no super script \NC \type{0x22} + \type{0x08} \NC \NR +\NC no script \NC \type{0x23} + \type{0x08} \NC \NR +\stoptabulate + \subsubsubsection{simple nodes} -\starttabulate[|lT|l|p|] -\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR -\NC subtype \NC number \NC \showsubtypes{noad} \NC \NR -\NC attr \NC node \NC list of attributes \NC \NR -\NC nucleus \NC kernel node \NC base \NC \NR -\NC sub \NC kernel node \NC subscript \NC \NR -\NC sup \NC kernel node \NC superscript \NC \NR +\starttabulate[|l|l|p|] +\BC field \BC type \BC explanation \NC \NR +\NC \type{subtype} \NC number \NC \showsubtypes{noad} \NC \NR +\NC \type{attr} \NC node \NC list of attributes \NC \NR +\NC \type{nucleus} \NC kernel node \NC base \NC \NR +\NC \type{sub} \NC kernel node \NC subscript \NC \NR +\NC \type{sup} \NC kernel node \NC superscript \NC \NR +\NC \type{options} \NC number \NC bitset of rendering options \NC \NR \stoptabulate \subsubsubsection{accent nodes} -\starttabulate[|lT|l|p|] -\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR -\NC subtype \NC number \NC \showsubtypes{accent} \NC \NR -\NC nucleus \NC kernel node \NC base \NC \NR -\NC sub \NC kernel node \NC subscript \NC \NR -\NC sup \NC kernel node \NC superscript \NC \NR -\NC accent \NC kernel node \NC top accent \NC \NR -\NC bot_accent \NC kernel node \NC bottom accent \NC \NR -\NC fraction \NC number \NC larger step criterium (divided by 1000) \NC \NR +\starttabulate[|l|l|p|] +\BC field \BC type \BC explanation \NC \NR +\NC \type{subtype} \NC number \NC \showsubtypes{accent} \NC \NR +\NC \type{nucleus} \NC kernel node \NC base \NC \NR +\NC \type{sub} \NC kernel node \NC subscript \NC \NR +\NC \type{sup} \NC kernel node \NC superscript \NC \NR +\NC \type{accent} \NC kernel node \NC top accent \NC \NR +\NC \type{bot_accent} \NC kernel node \NC bottom accent \NC \NR +\NC \type{fraction} \NC number \NC larger step criterium (divided by 1000) \NC \NR \stoptabulate \subsubsubsection{style nodes} -\starttabulate[|lT|l|p|] -\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR -\NC style \NC string \NC contains the style \NC \NR +\starttabulate[|l|l|p|] +\BC field \BC type \BC explanation \NC \NR +\NC \type{style} \NC string \NC contains the style \NC \NR \stoptabulate -There are eight possibilities for the string value: one of \quote {display}, -\quote {text}, \quote {script}, or \quote {scriptscript}. Each of these can have -a trailing \type {'} to signify \quote {cramped} styles. +There are eight possibilities for the string value: one of \type {display}, +\type {text}, \type {script}, or \type {scriptscript}. Each of these can have +be prefixed by \type {cramped}. \subsubsubsection{choice nodes} -\starttabulate[|lT|l|p|] -\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR -\NC attr \NC node \NC list of attributes \NC \NR -\NC display \NC node \NC list of display size alternatives \NC \NR -\NC text \NC node \NC list of text size alternatives \NC \NR -\NC script \NC node \NC list of scriptsize alternatives \NC \NR -\NC scriptscript \NC node \NC list of scriptscriptsize alternatives \NC \NR +\starttabulate[|l|l|p|] +\BC field \BC type \BC explanation \NC \NR +\NC \type{attr} \NC node \NC list of attributes \NC \NR +\NC \type{display} \NC node \NC list of display size alternatives \NC \NR +\NC \type{text} \NC node \NC list of text size alternatives \NC \NR +\NC \type{script} \NC node \NC list of scriptsize alternatives \NC \NR +\NC \type{scriptscript} \NC node \NC list of scriptscriptsize alternatives \NC \NR \stoptabulate Warning: never assign a node list to the \type {display}, \type {text}, \type @@ -567,17 +593,17 @@ structure is correct, otherwise an error may be result. \subsubsubsection{radical nodes} -\starttabulate[|lT|l|p|] -\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR -\NC subtype \NC number \NC \showsubtypes{radical} \NC \NR -\NC attr \NC node \NC list of attributes \NC \NR -\NC nucleus \NC kernel node \NC base \NC \NR -\NC sub \NC kernel node \NC subscript \NC \NR -\NC sup \NC kernel node \NC superscript \NC \NR -\NC left \NC delimiter node \NC \NC \NR -\NC degree \NC kernel node \NC only set by \type {\Uroot} \NC \NR -\NC width \NC number \NC required width \NC \NR -\NC options \NC number \NC bitset of rendering options \NC \NR +\starttabulate[|l|l|p|] +\BC field \BC type \BC explanation \NC \NR +\NC \type{subtype} \NC number \NC \showsubtypes{radical} \NC \NR +\NC \type{attr} \NC node \NC list of attributes \NC \NR +\NC \type{nucleus} \NC kernel node \NC base \NC \NR +\NC \type{sub} \NC kernel node \NC subscript \NC \NR +\NC \type{sup} \NC kernel node \NC superscript \NC \NR +\NC \type{left} \NC delimiter node \NC \NC \NR +\NC \type{degree} \NC kernel node \NC only set by \type {\Uroot} \NC \NR +\NC \type{width} \NC number \NC required width \NC \NR +\NC \type{options} \NC number \NC bitset of rendering options \NC \NR \stoptabulate Warning: never assign a node list to the \type {nucleus}, \type {sub}, \type @@ -586,16 +612,16 @@ link structure is correct, otherwise an error may be result. \subsubsubsection{fraction nodes} -\starttabulate[|lT|l|p|] -\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR -\NC attr \NC node \NC list of attributes \NC \NR -\NC width \NC number \NC (optional) width of the fraction \NC \NR -\NC num \NC kernel node \NC numerator \NC \NR -\NC denom \NC kernel node \NC denominator \NC \NR -\NC left \NC delimiter node \NC left side symbol \NC \NR -\NC right \NC delimiter node \NC right side symbol \NC \NR -\NC middle \NC delimiter node \NC middle symbol \NC \NR -\NC options \NC number \NC bitset of rendering options \NC \NR +\starttabulate[|l|l|p|] +\BC field \BC type \BC explanation \NC \NR +\NC \type{attr} \NC node \NC list of attributes \NC \NR +\NC \type{width} \NC number \NC (optional) width of the fraction \NC \NR +\NC \type{num} \NC kernel node \NC numerator \NC \NR +\NC \type{denom} \NC kernel node \NC denominator \NC \NR +\NC \type{left} \NC delimiter node \NC left side symbol \NC \NR +\NC \type{right} \NC delimiter node \NC right side symbol \NC \NR +\NC \type{middle} \NC delimiter node \NC middle symbol \NC \NR +\NC \type{options} \NC number \NC bitset of rendering options \NC \NR \stoptabulate Warning: never assign a node list to the \type {num}, or \type {denom} field @@ -604,16 +630,16 @@ may be result. \subsubsubsection{fence nodes} -\starttabulate[|lT|l|p|] -\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR -\NC subtype \NC number \NC \showsubtypes{fence} \NC \NR -\NC attr \NC node \NC list of attributes \NC \NR -\NC delim \NC delimiter node \NC delimiter specification \NC \NR -\NC italic \NC number \NC italic correction \NC \NR -\NC height \NC number \NC required height \NC \NR -\NC depth \NC number \NC required depth \NC \NR -\NC options \NC number \NC bitset of rendering options \NC \NR -\NC class \NC number \NC spacing related class \NC \NR +\starttabulate[|l|l|p|] +\BC field \BC type \BC explanation \NC \NR +\NC \type{subtype} \NC number \NC \showsubtypes{fence} \NC \NR +\NC \type{attr} \NC node \NC list of attributes \NC \NR +\NC \type{delim} \NC delimiter node \NC delimiter specification \NC \NR +\NC \type{italic} \NC number \NC italic correction \NC \NR +\NC \type{height} \NC number \NC required height \NC \NR +\NC \type{depth} \NC number \NC required depth \NC \NR +\NC \type{options} \NC number \NC bitset of rendering options \NC \NR +\NC \type{class} \NC number \NC spacing related class \NC \NR \stoptabulate Warning: some of these fields are used by the renderer and might get adapted in @@ -637,30 +663,30 @@ Whatsit nodes come in many subtypes that you can ask for by running \subsubsubsection{open whatsits} -\starttabulate[|lT|l|p|] -\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR -\NC attr \NC node \NC list of attributes \NC \NR -\NC stream \NC number \NC \TEX's stream id number \NC \NR -\NC name \NC string \NC file name \NC \NR -\NC ext \NC string \NC file extension \NC \NR -\NC area \NC string \NC file area (this may become obsolete) \NC \NR +\starttabulate[|l|l|p|] +\BC field \BC type \BC explanation \NC \NR +\NC \type{attr} \NC node \NC list of attributes \NC \NR +\NC \type{stream} \NC number \NC \TEX's stream id number \NC \NR +\NC \type{name} \NC string \NC file name \NC \NR +\NC \type{ext} \NC string \NC file extension \NC \NR +\NC \type{area} \NC string \NC file area (this may become obsolete) \NC \NR \stoptabulate \subsubsubsection{write whatsits} -\starttabulate[|lT|l|p|] -\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR -\NC attr \NC node \NC list of attributes \NC \NR -\NC stream \NC number \NC \TEX's stream id number \NC \NR -\NC data \NC table \NC a table representing the token list to be written \NC \NR +\starttabulate[|l|l|p|] +\BC field \BC type \BC explanation \NC \NR +\NC \type{attr} \NC node \NC list of attributes \NC \NR +\NC \type{stream} \NC number \NC \TEX's stream id number \NC \NR +\NC \type{data} \NC table \NC a table representing the token list to be written \NC \NR \stoptabulate \subsubsubsection{close whatsits} -\starttabulate[|lT|l|p|] -\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR -\NC attr \NC node \NC list of attributes \NC \NR -\NC stream \NC number \NC \TEX's stream id number \NC \NR +\starttabulate[|l|l|p|] +\BC field \BC type \BC explanation \NC \NR +\NC \type{attr} \NC node \NC list of attributes \NC \NR +\NC \type{stream} \NC number \NC \TEX's stream id number \NC \NR \stoptabulate \subsubsubsection{user_defined whatsits} @@ -669,46 +695,46 @@ User|-|defined whatsit nodes can only be created and handled from \LUA\ code. In effect, they are an extension to the extension mechanism. The \LUATEX\ engine will simply step over such whatsits without ever looking at the contents. -\starttabulate[|lT|l|p|] -\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR -\NC attr \NC node \NC list of attributes \NC \NR -\NC user_id \NC number \NC id number \NC \NR -\NC type \NC number \NC type of the value \NC \NR -\NC value \NC number \NC a \LUA\ number \NC \NR -\NC \NC node \NC a node list \NC \NR -\NC \NC string \NC a \LUA\ string \NC \NR -\NC \NC table \NC a \LUA\ table \NC \NR +\starttabulate[|l|l|p|] +\BC field \BC type \BC explanation \NC \NR +\NC \type{attr} \NC node \NC list of attributes \NC \NR +\NC \type{user_id} \NC number \NC id number \NC \NR +\NC \type{type} \NC number \NC type of the value \NC \NR +\NC \type{value} \NC number \NC a \LUA\ number \NC \NR +\NC \NC node \NC a node list \NC \NR +\NC \NC string \NC a \LUA\ string \NC \NR +\NC \NC table \NC a \LUA\ table \NC \NR \stoptabulate The \type {type} can have one of six distinct values. The number is the \ASCII\ value if the first character if the type name (so you can use string.byte("l") instead of \type {108}). -\starttabulate[|lT|lT|p|] -\NC \rmbf value \NC \bf meaning \NC \bf explanation \NC \NR -\NC 97 \NC a \NC list of attributes (a node list) \NC \NR -\NC 100 \NC d \NC a \LUA\ number \NC \NR -\NC 108 \NC l \NC a \LUA\ value (table, number, boolean, etc) \NC \NR -\NC 110 \NC n \NC a node list \NC \NR -\NC 115 \NC s \NC a \LUA\ string \NC \NR -\NC 116 \NC t \NC a \LUA\ token list in \LUA\ table form (a list of triplets) \NC \NR +\starttabulate[|r|c|p|] +\BC value \BC meaning \BC explanation \NC \NR +\NC 97 \NC a \NC list of attributes (a node list) \NC \NR +\NC 100 \NC d \NC a \LUA\ number \NC \NR +\NC 108 \NC l \NC a \LUA\ value (table, number, boolean, etc) \NC \NR +\NC 110 \NC n \NC a node list \NC \NR +\NC 115 \NC s \NC a \LUA\ string \NC \NR +\NC 116 \NC t \NC a \LUA\ token list in \LUA\ table form (a list of triplets) \NC \NR \stoptabulate \subsubsubsection{save_pos whatsits} -\starttabulate[|lT|l|p|] -\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR -\NC attr \NC node \NC list of attributes \NC \NR +\starttabulate[|l|l|p|] +\BC field \BC type \BC explanation \NC \NR +\NC \type{attr} \NC node \NC list of attributes \NC \NR \stoptabulate \subsubsubsection{late_lua whatsits} -\starttabulate[|lT|l|p|] -\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR -\NC attr \NC node \NC list of attributes \NC \NR -\NC data \NC string \NC data to execute \NC \NR -\NC string \NC string \NC data to execute \NC \NR -\NC name \NC string \NC the name to use for \LUA\ error reporting \NC \NR +\starttabulate[|l|l|p|] +\BC field \BC type \BC explanation \NC \NR +\NC \type{attr} \NC node \NC list of attributes \NC \NR +\NC \type{data} \NC string \NC data to execute \NC \NR +\NC \type{string} \NC string \NC data to execute \NC \NR +\NC \type{name} \NC string \NC the name to use for \LUA\ error reporting \NC \NR \stoptabulate The difference between \type {data} and \type {string} is that on assignment, the @@ -719,31 +745,32 @@ The difference between \type {data} and \type {string} is that on assignment, th \subsubsection{special whatsits} -\starttabulate[|lT|l|p|] -\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR -\NC attr \NC node \NC list of attributes \NC \NR -\NC data \NC string \NC the \type {\special} information \NC \NR +\starttabulate[|l|l|p|] +\BC field \BC type \BC explanation \NC \NR +\NC \type{attr} \NC node \NC list of attributes \NC \NR +\NC \type{data} \NC string \NC the \type {\special} information \NC \NR \stoptabulate \subsubsection{\PDF\ backend whatsits} \subsubsubsection{pdf_literal whatsits} -\starttabulate[|lT|l|p|] -\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR -\NC attr \NC node \NC list of attributes \NC \NR -\NC mode \NC number \NC the \quote {mode} setting of this literal \NC \NR -\NC data \NC string \NC the \type {\pdfliteral} information \NC \NR +\starttabulate[|l|l|p|] +\BC field \BC type \BC explanation \NC \NR +\NC \type{attr} \NC node \NC list of attributes \NC \NR +\NC \type{mode} \NC number \NC the \quote {mode} setting of this literal \NC \NR +\NC \type{data} \NC string \NC the \type {\pdfliteral} information \NC \NR \stoptabulate Possible mode values are: -\starttabulate[|lT|p|] -\NC \rmbf value \NC \rmbf \PDFTEX\ keyword \NC \NR -\NC 0 \NC setorigin \NC \NR -\NC 1 \NC page \NC \NR -\NC 2 \NC direct \NC \NR -\NC 3 \NC raw \NC \NR +\starttabulate[|l|p|] +\BC value \BC keyword \NC \NR +\NC 0 \NC \type{origin} \NC \NR +\NC 1 \NC \type{page} \NC \NR +\NC 2 \NC \type{direct} \NC \NR +\NC 3 \NC \type{raw} \NC \NR +\NC 4 \NC \type{text} \NC \NR \stoptabulate The higher the number, the less checking and the more you can run into troubles. @@ -752,58 +779,58 @@ what you generate. \subsubsubsection{pdf_refobj whatsits} -\starttabulate[|lT|l|p|] -\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR -\NC attr \NC node \NC list of attributes \NC \NR -\NC objnum \NC number \NC the referenced \PDF\ object number \NC \NR +\starttabulate[|l|l|p|] +\BC field \BC type \BC explanation \NC \NR +\NC \type{attr} \NC node \NC list of attributes \NC \NR +\NC \type{objnum} \NC number \NC the referenced \PDF\ object number \NC \NR \stoptabulate \subsubsubsection{pdf_annot whatsits} -\starttabulate[|lT|l|p|] -\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR -\NC attr \NC node \NC list of attributes \NC \NR -\NC width \NC number \NC the width (not used in calculations) \NC \NR -\NC height \NC number \NC the height (not used in calculations) \NC \NR -\NC depth \NC number \NC the depth (not used in calculations) \NC \NR -\NC objnum \NC number \NC the referenced \PDF\ object number \NC \NR -\NC data \NC string \NC the annotation data \NC \NR +\starttabulate[|l|l|p|] +\BC field \BC type \BC explanation \NC \NR +\NC \type{attr} \NC node \NC list of attributes \NC \NR +\NC \type{width} \NC number \NC the width (not used in calculations) \NC \NR +\NC \type{height} \NC number \NC the height (not used in calculations) \NC \NR +\NC \type{depth} \NC number \NC the depth (not used in calculations) \NC \NR +\NC \type{objnum} \NC number \NC the referenced \PDF\ object number \NC \NR +\NC \type{data} \NC string \NC the annotation data \NC \NR \stoptabulate \subsubsubsection{pdf_start_link whatsits} -\starttabulate[|lT|l|p|] -\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR -\NC attr \NC node \NC list of attributes \NC \NR -\NC width \NC number \NC the width (not used in calculations) \NC \NR -\NC height \NC number \NC the height (not used in calculations) \NC \NR -\NC depth \NC number \NC the depth (not used in calculations) \NC \NR -\NC objnum \NC number \NC the referenced \PDF\ object number \NC \NR -\NC link_attr \NC table \NC the link attribute token list \NC \NR -\NC action \NC node \NC the action to perform \NC \NR +\starttabulate[|l|l|p|] +\BC field \BC type \BC explanation \NC \NR +\NC \type{attr} \NC node \NC list of attributes \NC \NR +\NC \type{width} \NC number \NC the width (not used in calculations) \NC \NR +\NC \type{height} \NC number \NC the height (not used in calculations) \NC \NR +\NC \type{depth} \NC number \NC the depth (not used in calculations) \NC \NR +\NC \type{objnum} \NC number \NC the referenced \PDF\ object number \NC \NR +\NC \type{link_attr} \NC table \NC the link attribute token list \NC \NR +\NC \type{action} \NC node \NC the action to perform \NC \NR \stoptabulate \subsubsubsection{pdf_end_link whatsits} -\starttabulate[|lT|l|p|] -\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR -\NC attr \NC node \NC \NC \NR +\starttabulate[|l|l|p|] +\BC field \BC type \BC explanation \NC \NR +\NC \type{attr} \NC node \NC \NC \NR \stoptabulate \subsubsubsection{pdf_dest whatsits} -\starttabulate[|lT|l|p|] -\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR -\NC attr \NC node \NC list of attributes \NC \NR -\NC width \NC number \NC the width (not used in calculations) \NC \NR -\NC height \NC number \NC the height (not used in calculations) \NC \NR -\NC depth \NC number \NC the depth (not used in calculations) \NC \NR -\NC named_id \NC number \NC is the \type {dest_id} a string value? \NC \NR -\NC dest_id \NC number \NC the destination id \NC \NR -\NC \NC string \NC the destination name \NC \NR -\NC dest_type \NC number \NC type of destination \NC \NR -\NC xyz_zoom \NC number \NC the zoom factor (times 1000) \NC \NR -\NC objnum \NC number \NC the \PDF\ object number \NC \NR +\starttabulate[|l|l|p|] +\BC field \BC type \BC explanation \NC \NR +\NC \type{attr} \NC node \NC list of attributes \NC \NR +\NC \type{width} \NC number \NC the width (not used in calculations) \NC \NR +\NC \type{height} \NC number \NC the height (not used in calculations) \NC \NR +\NC \type{depth} \NC number \NC the depth (not used in calculations) \NC \NR +\NC \type{named_id} \NC number \NC is the \type {dest_id} a string value? \NC \NR +\NC \type{dest_id} \NC number \NC the destination id \NC \NR +\NC \NC string \NC the destination name \NC \NR +\NC \type{dest_type} \NC number \NC type of destination \NC \NR +\NC \type{xyz_zoom} \NC number \NC the zoom factor (times 1000) \NC \NR +\NC \type{objnum} \NC number \NC the \PDF\ object number \NC \NR \stoptabulate \subsubsubsection{pdf_action whatsits} @@ -811,98 +838,99 @@ what you generate. These are a special kind of item that only appears inside \PDF\ start link objects. -\starttabulate[|lT|l|p|] -\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR -\NC action_type \NC number \NC the kind of action involved \NC \NR -\NC action_id \NC number or string \NC token list reference or string \NC \NR -\NC named_id \NC number \NC the index of the destination \NC \NR -\NC file \NC string \NC the target filename \NC \NR -\NC new_window \NC number \NC the window state of the target \NC \NR -\NC data \NC string \NC the name of the destination \NC \NR +\starttabulate[|l|l|p|] +\BC field \BC type \BC explanation \NC \NR +\BC field \BC type \BC explanation \NC \NR +\NC \type{action_type} \NC number \NC the kind of action involved \NC \NR +\NC \type{action_id} \NC number or string \NC token list reference or string \NC \NR +\NC \type{named_id} \NC number \NC the index of the destination \NC \NR +\NC \type{file} \NC string \NC the target filename \NC \NR +\NC \type{new_window} \NC number \NC the window state of the target \NC \NR +\NC \type{data} \NC string \NC the name of the destination \NC \NR \stoptabulate Valid action types are: -\starttabulate[|lT|lT|] -\NC 0 \NC page \NC \NR -\NC 1 \NC goto \NC \NR -\NC 2 \NC thread \NC \NR -\NC 3 \NC user \NC \NR +\starttabulate[|l|l|] +\NC 0 \NC \type{page} \NC \NR +\NC 1 \NC \type{goto} \NC \NR +\NC 2 \NC \type{thread} \NC \NR +\NC 3 \NC \type{user} \NC \NR \stoptabulate Valid window types are: -\starttabulate[|lT|lT|] -\NC 0 \NC notset \NC \NR -\NC 1 \NC new \NC \NR -\NC 2 \NC nonew \NC \NR +\starttabulate[|l|l|] +\NC 0 \NC \type{notset} \NC \NR +\NC 1 \NC \type{new} \NC \NR +\NC 2 \NC \type{nonew} \NC \NR \stoptabulate \subsubsubsection{pdf_thread whatsits} -\starttabulate[|lT|l|p|] -\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR -\NC attr \NC node \NC list of attributes \NC \NR -\NC width \NC number \NC the width (not used in calculations) \NC \NR -\NC height \NC number \NC the height (not used in calculations) \NC \NR -\NC depth \NC number \NC the depth (not used in calculations) \NC \NR -\NC named_id \NC number \NC is \type {tread_id} a string value? \NC \NR -\NC tread_id \NC number \NC the thread id \NC \NR -\NC \NC string \NC the thread name \NC \NR -\NC thread_attr \NC number \NC extra thread information \NC \NR +\starttabulate[|l|l|p|] +\BC field \BC type \BC explanation \NC \NR +\NC \type{attr} \NC node \NC list of attributes \NC \NR +\NC \type{width} \NC number \NC the width (not used in calculations) \NC \NR +\NC \type{height} \NC number \NC the height (not used in calculations) \NC \NR +\NC \type{depth} \NC number \NC the depth (not used in calculations) \NC \NR +\NC \type{named_id} \NC number \NC is \type {tread_id} a string value? \NC \NR +\NC \type{tread_id} \NC number \NC the thread id \NC \NR +\NC \NC string \NC the thread name \NC \NR +\NC \type{thread_attr} \NC number \NC extra thread information \NC \NR \stoptabulate \subsubsubsection{pdf_start_thread whatsits} -\starttabulate[|lT|l|p|] -\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR -\NC attr \NC node \NC list of attributes \NC \NR -\NC width \NC number \NC the width (not used in calculations) \NC \NR -\NC height \NC number \NC the height (not used in calculations) \NC \NR -\NC depth \NC number \NC the depth (not used in calculations) \NC \NR -\NC named_id \NC number \NC is \type {tread_id} a string value? \NC \NR -\NC tread_id \NC number \NC the thread id \NC \NR -\NC \NC string \NC the thread name \NC \NR -\NC thread_attr \NC number \NC extra thread information \NC \NR +\starttabulate[|l|l|p|] +\BC field \BC type \BC explanation \NC \NR +\NC \type{attr} \NC node \NC list of attributes \NC \NR +\NC \type{width} \NC number \NC the width (not used in calculations) \NC \NR +\NC \type{height} \NC number \NC the height (not used in calculations) \NC \NR +\NC \type{depth} \NC number \NC the depth (not used in calculations) \NC \NR +\NC \type{named_id} \NC number \NC is \type {tread_id} a string value? \NC \NR +\NC \type{tread_id} \NC number \NC the thread id \NC \NR +\NC \NC string \NC the thread name \NC \NR +\NC \type{thread_attr} \NC number \NC extra thread information \NC \NR \stoptabulate \subsubsubsection{pdf_end_thread whatsits} -\starttabulate[|lT|l|p|] -\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR -\NC attr \NC node \NC \NC \NR +\starttabulate[|l|l|p|] +\BC field \BC type \BC explanation \NC \NR +\NC \type{attr} \NC node \NC \NC \NR \stoptabulate \subsubsubsection{pdf_colorstack whatsits} -\starttabulate[|lT|l|p|] -\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR -\NC attr \NC node \NC list of attributes \NC \NR -\NC stack \NC number \NC colorstack id number \NC \NR -\NC command \NC number \NC command to execute \NC \NR -\NC data \NC string \NC data \NC \NR +\starttabulate[|l|l|p|] +\BC field \BC type \BC explanation \NC \NR +\NC \type{attr} \NC node \NC list of attributes \NC \NR +\NC \type{stack} \NC number \NC colorstack id number \NC \NR +\NC \type{command} \NC number \NC command to execute \NC \NR +\NC \type{data} \NC string \NC data \NC \NR \stoptabulate \subsubsubsection{pdf_setmatrix whatsits} -\starttabulate[|lT|l|p|] -\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR -\NC attr \NC node \NC list of attributes \NC \NR -\NC data \NC string \NC data \NC \NR +\starttabulate[|l|l|p|] +\BC field \BC type \BC explanation \NC \NR +\NC \type{attr} \NC node \NC list of attributes \NC \NR +\NC \type{data} \NC string \NC data \NC \NR \stoptabulate \subsubsubsection{pdf_save whatsits} -\starttabulate[|lT|l|p|] -\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR -\NC attr \NC node \NC list of attributes \NC \NR +\starttabulate[|l|l|p|] +\BC field \BC type \BC explanation \NC \NR +\NC \type{attr} \NC node \NC list of attributes \NC \NR \stoptabulate \subsubsubsection{pdf_restore whatsits} -\starttabulate[|lT|l|p|] -\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR -\NC attr \NC node \NC list of attributes \NC \NR +\starttabulate[|l|l|p|] +\BC field \BC type \BC explanation \NC \NR +\NC \type{attr} \NC node \NC list of attributes \NC \NR \stoptabulate \section{The \type {node} library} @@ -1541,26 +1569,29 @@ optional. The two returned nodes \type {h} and \type {t} are the head and tail (either one of these can be an inserted kern node, because special kernings with word boundaries are possible). -\subsubsection{\type {node.unprotect_glyphs}} +\subsubsection{\type {node.unprotect_glyphs} and \type {node.unprotect_glyph}} \startfunctioncall -node.unprotect_glyphs(<node> n) +node.unprotect_glyph(<node> n) +node.unprotect_glyphs(<node> n,[<node> n]) \stopfunctioncall Subtracts 256 from all glyph node subtypes. This and the next function are helpers to convert from \type {characters} to \type {glyphs} during node -processing. +processing. The second argument is option and indicates the end of a range. \subsubsection{\type {node.protect_glyphs} and \type {node.protect_glyph}} \startfunctioncall -node.protect_glyphs(<node> n) +node.protect_glyph(<node> n) +node.protect_glyphs(<node> n,[<node> n]) \stopfunctioncall Adds 256 to all glyph node subtypes in the node list starting at \type {n}, except that if the value is 1, it adds only 255. The special handling of 1 means that \type {characters} will become \type {glyphs} after subtraction of 256. A -single character can be marked by the singular call. +single character can be marked by the singular call. The second argument is +option and indicates the end of a range. \subsubsection{\type {node.last_node}} @@ -1604,8 +1635,7 @@ node.setglue(<node> n) node.setglue(<node> n,width,stretch,shrink,stretch_order,shrink_order) \stopfunctioncall -When you pass values, only arguments that are numbers -are assigned so +When you pass values, only arguments that are numbers are assigned so \starttyping node.setglue(n,655360,false,65536) @@ -1613,6 +1643,8 @@ node.setglue(n,655360,false,65536) will only adapt the width and shrink. +When a list node is passed, you set the glue, order and sign instead. + \subsubsection{\type {node.getglue}} The next call will return 5 values (or northing when no glue is passed). @@ -1625,6 +1657,9 @@ The next call will return 5 values (or northing when no glue is passed). When the second argument is false, only the width is returned (this is consistent with \type {tex.get}). +When a list node is passed, you get back the glue that is set, the order of that +glue and the sign. + \subsubsection{\type {node.is_zero_glue}} This function returns \type {true} when the width, stretch and shrink properties @@ -1681,7 +1716,7 @@ node.set_attribute(<node> n, <number> id, <number> val) \stopfunctioncall Sets the attribute with number \type {id} to the value \type {val}. Duplicate -assignments are ignored. {\em [needs explanation]} +assignments are ignored. \subsubsection{\type {node.unset_attribute}} @@ -1733,6 +1768,15 @@ node.check_discretionaries(<node> head) The plural variant runs over all disc nodes in a list, the singular variant checks one node only (it also checks if the node is a disc node). +\subsubsection{\type {node.flatten_discretionaries}} + +This function will remove the discretionaries in the list and inject the replace +field when set. + +\startfunctioncall +<node> head, count = node.flatten_discretionaries(<node> n) +\stopfunctioncall + \subsubsection{\type {node.family_font}} When you pass it a proper family identifier the next helper will return the font @@ -1744,6 +1788,22 @@ font field or getter because it will resolve the family automatically for noads. node.family_font(<integer> fam) \stopfunctioncall +\subsubsection{\type {node.set_synctex_fields} and \type {node.get_synctex_fields}} + +You can set and query the synctex fields, a file number aka tag and a line +number, for a glue, kern, hlist, vlist, rule and math nodes as well as glyph +nodes (although this last one are not used in native synctex). + +\startfunctioncall +node.set_synctex_fields(<integer> f, <integer> l) +<integer> f, <integer> l = + node.get_synctex_fields(<node> n) +\stopfunctioncall + +Of course you need to know what you're doing as no checking on sane values takes +place. Also, the synctex interpreter used in editors is rather peculiar and has +some assumptions (heuristics). + \section{Two access models} Deep down in \TEX\ a node has a number which is an numeric entry in a memory @@ -1812,24 +1872,24 @@ end Some accessors are used frequently and for these we provide more efficient helpers: -\starttabulate[|T|p|] -\NC getnext \NC parsing nodelist always involves this one \NC \NR -\NC getprev \NC used less but is logical companion to \type {getnext} \NC \NR -\NC getboth \NC returns the next and prev pointer of a node \NC \NR -\NC getid \NC consulted a lot \NC \NR -\NC getsubtype \NC consulted less but also a topper \NC \NR -\NC getfont \NC used a lot in \OPENTYPE\ handling (glyph nodes are consulted a lot) \NC \NR -\NC getchar \NC idem and also in other places \NC \NR -\NC getwhd \NC returns the \type {width}, \type {height} and \type {depth} of a list, rule or - (unexpanded) glyph as well as glue (its spec is looked at) and unset nodes\NC \NR -\NC getdisc \NC returns the \type {pre}, \type {post} and \type {replace} fields and - optionally when true is passed also the tail fields. \NC \NR -\NC getlist \NC we often parse nested lists so this is a convenient one too \NC \NR -\NC getleader \NC comparable to list, seldom used in \TEX\ (but needs frequent consulting - like lists; leaders could have been made a dedicated node type) \NC \NR -\NC getfield \NC generic getter, sufficient for the rest (other field names are - often shared so a specific getter makes no sense then) \NC \NR -\NC getbox \NC gets the given box (a list node) \NC \NR +\starttabulate[|l|p|] +\NC \type{getnext} \NC parsing nodelist always involves this one \NC \NR +\NC \type{getprev} \NC used less but is logical companion to \type {getnext} \NC \NR +\NC \type{getboth} \NC returns the next and prev pointer of a node \NC \NR +\NC \type{getid} \NC consulted a lot \NC \NR +\NC \type{getsubtype} \NC consulted less but also a topper \NC \NR +\NC \type{getfont} \NC used a lot in \OPENTYPE\ handling (glyph nodes are consulted a lot) \NC \NR +\NC \type{getchar} \NC idem and also in other places \NC \NR +\NC \type{getwhd} \NC returns the \type {width}, \type {height} and \type {depth} of a list, rule or + (unexpanded) glyph as well as glue (its spec is looked at) and unset nodes\NC \NR +\NC \type{getdisc} \NC returns the \type {pre}, \type {post} and \type {replace} fields and + optionally when true is passed also the tail fields. \NC \NR +\NC \type{getlist} \NC we often parse nested lists so this is a convenient one too \NC \NR +\NC \type{getleader} \NC comparable to list, seldom used in \TEX\ (but needs frequent consulting + like lists; leaders could have been made a dedicated node type) \NC \NR +\NC \type{getfield} \NC generic getter, sufficient for the rest (other field names are + often shared so a specific getter makes no sense then) \NC \NR +\NC \type{getbox} \NC gets the given box (a list node) \NC \NR \stoptabulate In the direct namespace there are more such helpers and most of them are @@ -1857,9 +1917,9 @@ consistency. You can of course always define additional accessor using \type \def\yes{$+$} \def\nop{$-$} -\starttabulate[|T|c|c|] +\starttabulate[|l|c|c|] \HL -\NC \bf function \NC \bf node \NC \bf direct \NC \NR +\BC function \BC node \BC direct \NC \NR \HL %NC \type {do_ligature_n} \NC \yes \NC \yes \NC \NR % was never documented and experimental \NC \type {check_discretionaries}\NC \yes \NC \yes \NC \NR @@ -1886,6 +1946,7 @@ consistency. You can of course always define additional accessor using \type \NC \type {getdepth} \NC \nop \NC \yes \NC \NR \NC \type {getdir} \NC \nop \NC \yes \NC \NR \NC \type {getdisc} \NC \yes \NC \yes \NC \NR +\NC \type {getfam} \NC \nop \NC \yes \NC \NR \NC \type {getfield} \NC \yes \NC \yes \NC \NR \NC \type {getfont} \NC \yes \NC \yes \NC \NR \NC \type {getglue} \NC \yes \NC \yes \NC \NR @@ -1977,10 +2038,13 @@ consistency. You can of course always define additional accessor using \type \NC \type {unprotect_glyphs} \NC \yes \NC \yes \NC \NR \NC \type {unset_attribute} \NC \yes \NC \yes \NC \NR \NC \type {usedlist} \NC \yes \NC \yes \NC \NR +\NC \type {uses_font} \NC \yes \NC \yes \NC \NR \NC \type {vpack} \NC \yes \NC \yes \NC \NR \NC \type {whatsitsubtypes} \NC \yes \NC \nop \NC \NR \NC \type {whatsits} \NC \yes \NC \nop \NC \NR \NC \type {write} \NC \yes \NC \yes \NC \NR +\NC \type {set_synctex_fields} \NC \yes \NC \yes \NC \NR +\NC \type {get_synctex_fields} \NC \yes \NC \yes \NC \NR \stoptabulate % \stopcolumns diff --git a/doc/context/sources/general/manuals/luatex/luatex-style.tex b/doc/context/sources/general/manuals/luatex/luatex-style.tex index c07dc3b76..a277a1178 100644 --- a/doc/context/sources/general/manuals/luatex/luatex-style.tex +++ b/doc/context/sources/general/manuals/luatex/luatex-style.tex @@ -89,7 +89,11 @@ \definecolor[keptcolor] [b=.5] \definecolor[othercolor][r=.5,g=.5] -\setupbodyfont[modern] % we need this in examples so we predefine +\usebodyfont[lucidaot] +\usebodyfont[pagella] +\usebodyfont[cambria] +%usebodyfont[dejavu] +\usebodyfont[modern] % we need this in examples so we predefine % \doifmodeelse {atpragma} { % @@ -214,7 +218,7 @@ luaorbitfactor := 1 ; picture p ; p := lualogo xsized (3PaperWidth/5) ; - draw p shifted center Page shifted (0,-.5ypart center ulcorner p) ; + draw p shifted center Page shifted (0,-.85ypart center ulcorner p) ; StopPage ; \stopuseMPgraphic @@ -354,6 +358,16 @@ [margin=3em, width=5em] +\definestartstop + [notabene] + [style=slanted] + +\definestartstop + [preamble] + [style=normal, + before=\blank, + after=\blank] + % Hans doesn't like the bookmarks opening by default so we comment this: % % \setupinteractionscreen diff --git a/doc/context/sources/general/manuals/luatex/luatex-titlepage.tex b/doc/context/sources/general/manuals/luatex/luatex-titlepage.tex index 8ab56f85d..307741ee1 100644 --- a/doc/context/sources/general/manuals/luatex/luatex-titlepage.tex +++ b/doc/context/sources/general/manuals/luatex/luatex-titlepage.tex @@ -21,7 +21,7 @@ [align=middle, foregroundcolor=blue, frame=off] - {Lua\TeX\\Reference} + {Lua\TeX\\Reference Manual} \definedfont[Bold*default at 18pt] \setupinterlinespace diff --git a/doc/context/sources/general/manuals/luatex/luatex.tex b/doc/context/sources/general/manuals/luatex/luatex.tex index 1613b920b..1d6f16f6a 100644 --- a/doc/context/sources/general/manuals/luatex/luatex.tex +++ b/doc/context/sources/general/manuals/luatex/luatex.tex @@ -1,6 +1,8 @@ % macros=mkvi -% author : Hans Hagen +% \disabledirectives[vspacing.synchronizepage] + +% author : Hans Hagen with Taco Hoekwater, Luigi Scarso & Hartmut Henkel % copyright : PRAGMA ADE & ConTeXt Development Team % license : Creative Commons Attribution ShareAlike 4.0 International % reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions @@ -13,9 +15,13 @@ % the manuals contain characteristic graphics and personal notes or examples that % make no sense when used out-of-context. % -% comment : Some chapters might have been published in TugBoat, the NTG Maps, the ConTeXt -% Group journal or otherwise. Thanks to the editors for corrections. Also thanks -% to users for testing, feedback and corrections. +% comment : Some (parts of) chapters might have been published in TugBoat, the NTG Maps, the +% ConTeXt Group journal or otherwise. Thanks to the editors for corrections. Also +% thanks to users for testing, feedback and corrections. +% +% 238 pages : 2017-07-06 +% luatex 9.5 sec / luajittex 7.0 sec +% Dell 7600 / i7 3840QM / passmark 1.922 / Windows 10 64 bit % \tex vs \type vs \syntax vs. \luatex % \em \it \/ @@ -23,16 +29,33 @@ % "context --nodates --nocompression luatex" can be used for comparison % runs, not that we do it +% \enabledirectives[hyphenator.flatten] + +% \setupsynctex[state=start,method=max] % adds 5 pct overhead + \environment luatex-style \environment luatex-logos +\startmode[export] + + \setupbackend + [export=luatex] + +\stopmode + \dontcomplain \startdocument - [status=release, - version=1.0.5] + [status=experimental, + version=1.08.0] + +\startnotmode[*export] + \component luatex-titlepage +\stopnotmode -\component luatex-titlepage +\startmode[*export] + \component luatex-export-titlepage +\stopmode \startfrontmatter \component luatex-contents diff --git a/doc/context/sources/general/manuals/math/math-alignments.tex b/doc/context/sources/general/manuals/math/math-alignments.tex new file mode 100644 index 000000000..bb2801b8a --- /dev/null +++ b/doc/context/sources/general/manuals/math/math-alignments.tex @@ -0,0 +1,297 @@ +\environment math-layout + +\startcomponent math-alignments + +\startchapter[title=Alignments and such] + +\startsection[title=Using ampersands] + +When you come from plain \TEX, using ampersands probably comes as a custom, like in: + +\startbuffer +\startformula +\bordermatrix { + a & b & c & d \cr + e & f & G & h \cr + i & j & k & l \cr +} +\stopformula +\stopbuffer + +\typebuffer \getbuffer + +or: + +\startbuffer +\startformula +\bbordermatrix { + a & b & c & d \cr + e & f & G & h \cr + i & j & k & l \cr +} +\stopformula +\stopbuffer + +\typebuffer \getbuffer + +A more \CONTEXT\ way is this: + +\startbuffer +\startformula +\startbordermatrix + \NC a \NC b \NC c \NC d \NR + \NC e \NC f \NC G \NC h \NR + \NC i \NC j \NC k \NC l \NR +\stopbordermatrix +\stopformula +\stopbuffer + +\typebuffer \getbuffer + +and: + +\startbuffer +\startformula +\startbbordermatrix + \NC a \NC b \NC c \NC d \NR + \NC e \NC f \NC G \NC h \NR + \NC i \NC j \NC k \NC l \NR +\stopbbordermatrix +\stopformula +\stopbuffer + +\typebuffer \getbuffer + +Just that you know. In general ampersands in \CONTEXT\ text mode are just that: +ampersands, not something alignment related. + +\stopsection + +\startsection[title=Locations] + +The \type {location} feature gives some control over the alignment of alignments. +The following examples are taken from an email exchange with Henri Menke. + +\startbuffer +\startplaceformula + \startformula + \startmathalignment[location=top] + \NC a + b \NC= c + d \NR + \NC a + b \NC= c + d \NR + \NC a + b \NC= c + d \NR + \stopmathalignment + \quad\text{or}\quad + \startmathalignment[location=center] + \NC a + b \NC= c + d \NR + \NC a + b \NC= c + d \NR + \NC a + b \NC= c + d \NR + \stopmathalignment + \quad\text{or}\quad + \startmathalignment[location=bottom] + \NC a + b \NC= c + d \NR + \NC a + b \NC= c + d \NR + \NC a + b \NC= c + d \NR + \stopmathalignment + \stopformula +\stopplaceformula +\stopbuffer + +\typebuffer \getbuffer + +Numbering works ok for a single mathalignment + +\startbuffer +\startplaceformula + \startformula + \startmathalignment[number=auto] + \NC a + b \NC= c + d \NR + \NC a + b \NC= c + d \NR + \NC a + b \NC= c + d \NR + \stopmathalignment + \stopformula +\stopplaceformula +\stopbuffer + +\typebuffer \getbuffer + +But for one with a location the results are suboptimal: + +\startbuffer +\startplaceformula + \startformula + \startmathalignment[location=center,number=auto] + \NC a + b \NC= c + d \NR + \NC a + b \NC= c + d \NR + \NC a + b \NC= c + d \NR + \stopmathalignment + \stopformula +\stopplaceformula +\stopbuffer + +\typebuffer \getbuffer + +Here is a real example: + +\startbuffer +\startplaceformula + \startformula + U_2 = \frac{1}{2!} + \int_0^\beta \diff\tau_1 \int_0^\beta \diff\tau_2\; + \sum_{\startsubstack k_1,q_1 \NR k_2,q_2 \stopsubstack} + \Bigl\langle + \startmathalignment[location=top,align=left] + \NC + \mathcal T \Bigl[ + c_{k_1}^\dagger (\tau_1) + \Delta_{k_1,q_1}^r c_{-k_1}^* (\tau_1) + c_{-q_1}^T (\tau_1) + \Delta_{k_1,q_1}^{r\dagger} c_{q_1} (\tau_1) + \Bigr] + \NR + \NC + \times \Bigl[ + c_{k_2}^\dagger(\tau_2) \Delta_{k_2,q_2}^r c_{-k_2}^* + (\tau_2) + c_{-q_2}^T (\tau_2) \Delta_{k_2,q_2}^{r\dagger} + c_{q_2} (\tau_2) + \Bigr] \Bigr\rangle . + \NR + \stopmathalignment + \stopformula +\stopplaceformula +\stopbuffer + +\typebuffer \getbuffer + +\stopsection + +\startsection[title=Tuning alignments] + +Again a few examples of manipulating alignments. It really helps to play +with examples if you want to get an idea what is possible. + +\startbuffer +\startformula + \startalign[m=2,align={middle}] + \NC \text to 6cm{} \NC x = 0 \NR + \stopalign +\stopformula + +\startformula + \startalign[m=2,align={middle}] + \NC \text to 6cm{One\hfill} \NC a = 1 \NR + \NC \text to 6cm{One Two\hfill} \NC b = 2 \NR + \NC \text to 6cm{One Two Three\hfill} \NC c = 3 \NR + \stopalign +\stopformula + +\startformula + \startalign[m=2,align={left}] + \NC \text to 6cm{One\hfill} \NC a = 1 \NR + \NC \text to 6cm{One Two\hfill} \NC b = 2 \NR + \NC \text to 6cm{One Two Three\hfill} \NC c = 3 \NR + \stopalign +\stopformula +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer +\startformula + \startalign[m=2,align={middle}] + \NC \text to 6cm{} \NC x = 0 \NR + \stopalign +\stopformula + +\startformula + \startalign[m=2,align={middle}] + \NC \text to 6cm{One} \NC a = 1 \NR + \NC \text to 6cm{One Two} \NC b = 2 \NR + \NC \text to 6cm{One Two Three} \NC c = 3 \NR + \stopalign +\stopformula + +\startformula + \startalign[m=2,align={left}] + \NC \text to 6cm{One} \NC a = 1 \NR + \NC \text to 6cm{One Two} \NC b = 2 \NR + \NC \text to 6cm{One Two Three} \NC c = 3 \NR + \stopalign +\stopformula +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer +\startformula + \startalign[m=2,align={middle}] + \NC \text{} \NC x = 0 \NR + \stopalign +\stopformula + +\startformula + \startalign[m=2,align={middle}] + \NC \text{One} \NC a = 1 \NR + \NC \text{One Two} \NC b = 2 \NR + \NC \text{One Two Three} \NC c = 3 \NR + \stopalign +\stopformula + +\startformula + \startalign[m=2,align={left}] + \NC \text{One} \NC a = 1 \NR + \NC \text{One Two} \NC b = 2 \NR + \NC \text{One Two Three} \NC c = 3 \NR + \stopalign +\stopformula +\stopbuffer + +\typebuffer \getbuffer + +\stopsection + +\startsection[title={Splitting over pages}] + +Because formula placement has positioning options a formula gets +wrapped in a box. As a consequence formulas will not break across +pages. This can be an issue with alignments. There is an experimental +option for this (the result is shown in \in {figure} [fig:splitalign]): + +\startbuffer[demo] +\usemodule[art-01] +\setupbodyfont[13pt] +\starttext + \input tufte + \startplaceformula + \startsplitformula + \startalign + \NC a \EQ b \NR[+] + \NC \EQ d \NR + \NC c \EQ f \NR[+] + \NC \EQ g \NR + \NC \EQ h \NR[+] + \dorecurse{100}{\NC \EQ i + #1 - #1\NR[+]}% + \NC \EQ x \NR + \stopalign + \stopsplitformula + \stopplaceformula + \input tufte +\stoptext +\stopbuffer + +\typebuffer[demo] + +\startplacefigure[title={Splitting an alignment.},reference=fig:splitalign] + \startcombination[nx=4,ny=1] + {\typesetbuffer[demo][page=1,width=\measure{combination}]} {} + {\typesetbuffer[demo][page=2,width=\measure{combination}]} {} + {\typesetbuffer[demo][page=3,width=\measure{combination}]} {} + {\typesetbuffer[demo][page=4,width=\measure{combination}]} {} + \stopcombination +\stopplacefigure + +\stoptext + +\stopsection + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/math/math-definitions.tex b/doc/context/sources/general/manuals/math/math-definitions.tex new file mode 100644 index 000000000..d8903121a --- /dev/null +++ b/doc/context/sources/general/manuals/math/math-definitions.tex @@ -0,0 +1,101 @@ +\environment math-layout + +\startcomponent math-definitions + +\startchapter[title=Definitions] + +\startsection[title=Special stackers] + +There are many math symbols but never enough. Here is an example of how you can +roll out your own. We start out with nothing: + +\startbuffer +\definemathstackers + [nosymbol] + [voffset=\zeropoint, + hoffset=\zeropoint, + mathclass=ord, + topoffset=\zeropoint, + middlecommand=, + color=maincolor] +\stopbuffer + +\typebuffer \getbuffer + +You can now use this class of stackers: + +\startbuffer +\startformula + \mathover [nosymbol] {"2217} {A} + \mathover [nosymbol] {"2218} {A} + \mathover [nosymbol] {"2219} {A} +\stopformula +\stopbuffer + +\typebuffer + +This looks like this: + +\getbuffer + +But we want proper math, which means an an italic nucleus, a properly placed +accent, a shift of that accent matching the slope or the nucleus, so we actually +need: + +\startbuffer +\definemathstackers + [mysymbol] + [voffset=-.30\mathexheight, + hoffset=\zeropoint, + mathclass=ord, + topoffset=.4\mathemwidth, + middlecommand=\mathematics, + color=maincolor] +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer +\startformula + \mathover [mysymbol]{"2217} {A} + \mathover [mysymbol]{"2218} {A} + \mathover [mysymbol]{"2219} {A} + \mathunder [mysymbol] {"2217}{A} + \mathunder [mysymbol] {"2218}{A} + \mathunder [mysymbol] {"2219}{A} + \mathdouble[mysymbol]{"2217}{"2217}{A} + \mathdouble[mysymbol]{"2218}{"2218}{A} + \mathdouble[mysymbol]{"2219}{"2219}{A} +\stopformula +\stopbuffer + +We show both over and under variants: + +\typebuffer + +So this time we get: + +\getbuffer + +We can now redefine the \quote {interiorset} symbol to use +\type {0x2217} instead of \type {0x2218}: + +\startbuffer +\definemathover[mysymbol][interiorset]["2217] + +\startformula + \interiorset{A}^{\interiorset{A}^{\interiorset{A}}} +\stopformula +\stopbuffer + +\typebuffer + +Of course normally you will not use color: + +\getbuffer + +\stopsection + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/math/math-features.tex b/doc/context/sources/general/manuals/math/math-features.tex index 3869c575e..863493804 100644 --- a/doc/context/sources/general/manuals/math/math-features.tex +++ b/doc/context/sources/general/manuals/math/math-features.tex @@ -122,6 +122,84 @@ show the plus sign. \stopsection +\startsection[title=Script kerning] + +Text in math is somewhat special. First of all, a math font is not a text fonts +because the characters and glyphs have a different purpose. Text features are +normally not present (and often not even wanted). Anyway, you can force a text +font, but that doesn't mean you will get for instance kerning. You can force a +box which in turn will trigger font processing, but then you normally loose the +script related size properties. So we end up with some juggling possibly combined +with user intervention, and that is what the \type {\text} macro does. + +But still there is the kern between a variable and its subscript to consider, +something that normally is dealt with with staircase kerns, an \OPENTYPE\ math +speciality. But, as we progress over the math list, and we bind a subscript to a +variable, that subscript can be anything: a simple character, or more characters +(a list) or something wrapped in a box. There is simply no universal solution +that we can hard code because sometimes you don't want that special kerning. This +is why in \LUATEX\ the integer variable \type {\mathscriptboxmode} controls the +way this is dealt with. + +\starttabulate[|l|p|] +\NC \type {0} \NC forget about kerning \NC \NR +\NC \type {1} \NC kern math sub lists with a valid glyph (default in the engine) \NC \NR +\NC \type {2} \NC also kern math sub boxes that have a valid glyph (default in \CONTEXT) \NC \NR +\NC \type {3} \NC only kern math sub boxes with a boundary node present \NC \NR +\stoptabulate + +Here we show some examples of how this parameter controls kerning. Watch the +difference between a simple font switch and a text wrapped in a box. There are +differences between fonts: some fonts have kerns, some don't. When present kerns +are passed to the engine without further user intervention. + +\startbuffer[1] + $T_{\tf fluff}$ +\stopbuffer + +\startbuffer[2] + $T_{\text{fluff}}$ +\stopbuffer + +\startbuffer[3] + $T_{\text{\boundary1 fluff}}$ +\stopbuffer + +\unexpanded\def\Show#1#2#3% + {\doifelsenothing{#3} + {\typeinlinebuffer[#1]} + {\doifelse{#3}{-} + {\type{mode #2}} + {\switchtobodyfont[#3,big]\setstrut\strut\showfontkerns\showglyphs\mathscriptboxmode#2\relax\inlinebuffer[#1]}}} + +% \starttabulate[|lT|c|c|c|c|c|] +% \NC \NC \Show{1}{0}{} \NC\Show{1}{1}{} \NC \Show{2}{1}{} \NC \Show{2}{2}{} \NC \Show{3}{3}{} \NC \NR +% \NC \NC \Show{1}{0}{-} \NC\Show{1}{1}{-} \NC \Show{2}{1}{-} \NC \Show{2}{2}{-} \NC \Show{3}{3}{-} \NC \NR +% \NC modern \NC \Show{1}{0}{modern} \NC\Show{1}{1}{modern} \NC \Show{2}{1}{modern} \NC \Show{2}{2}{modern} \NC \Show{3}{3}{modern} \NC \NR +% \NC lucidaot \NC \Show{1}{0}{lucidaot} \NC\Show{1}{1}{lucidaot} \NC \Show{2}{1}{lucidaot} \NC \Show{2}{2}{lucidaot} \NC \Show{3}{3}{lucidaot} \NC \NR +% \NC pagella \NC \Show{1}{0}{pagella} \NC\Show{1}{1}{pagella} \NC \Show{2}{1}{pagella} \NC \Show{2}{2}{pagella} \NC \Show{3}{3}{pagella} \NC \NR +% \NC cambria \NC \Show{1}{0}{cambria} \NC\Show{1}{1}{cambria} \NC \Show{2}{1}{cambria} \NC \Show{2}{2}{cambria} \NC \Show{3}{3}{cambria} \NC \NR +% \NC dejavu \NC \Show{1}{0}{dejavu} \NC\Show{1}{1}{dejavu} \NC \Show{2}{1}{dejavu} \NC \Show{2}{2}{dejavu} \NC \Show{3}{3}{dejavu} \NC \NR +% \stoptabulate + +\def\ShowMore#1#2% + {\subsubject{\Show{#1}{#2}{} (\Show{#1}{#2}{-})} + \starttabulate[|lT|c|c|c|c|c|] + \NC modern \NC \Show{#1}{#2}{modern} \NC \NR + \NC lucidaot \NC \Show{#1}{#2}{lucidaot} \NC \NR + \NC pagella \NC \Show{#1}{#2}{pagella} \NC \NR + \NC cambria \NC \Show{#1}{#2}{cambria} \NC \NR + \NC dejavu \NC \Show{#1}{#2}{dejavu} \NC \NR + \stoptabulate} + +\ShowMore{1}{0} +\ShowMore{1}{1} +\ShowMore{2}{1} +\ShowMore{2}{2} +\ShowMore{3}{3} + +\stopsection + \stopchapter \stopcomponent diff --git a/doc/context/sources/general/manuals/math/math-input.tex b/doc/context/sources/general/manuals/math/math-input.tex new file mode 100644 index 000000000..d395e1865 --- /dev/null +++ b/doc/context/sources/general/manuals/math/math-input.tex @@ -0,0 +1,100 @@ +% language=uk + +\environment math-layout + +\startcomponent math-input + +\startchapter[title=Inputting math] + +\startsection[title=Collapsing] + +When in text mode you enter a combination of combining accent and character, a +composed character is assumed and often you then get one shape in your document. +A similar feature is available in math mode. After some discussion and analysis +of the potential clashes and confusion (thanks to Aditya Mahajan) we settled on a +combination of methods: so called math lists entries that we entered in the +character database and|/|or so called special sequences that are part of +\UNICODE. In the next tables we use \type {ml} for math list and \type {sp} for +specials. Collapsing mode \type {1} only uses the specials, while \type {2} first +checks the specials and then the math lists, and \type {3} does the reverse. + +In the database you can find this (a few fields have been omitted): + +\starttyping +[0x2260] = { + adobename = "notequal", + category = "sm", + description = "NOT EQUAL TO", + mathlist = { 0x2F, 0x3D }, + mathspec = { + { + class = "relation", + name = "neq", + }, + { + class = "relation", + name = "ne", + }, + }, + specials = { "char", 0x3D, 0x338 }, + unicodeslot = 0x2260, +} +\stoptyping + +and + +\starttyping +[0x2261] = { + adobename = "equivalence", + category = "sm", + description = "IDENTICAL TO", + mathclass = "relation", + mathextensible = "h", + mathname = "equiv", + mathlist = { 0x3D, 0x3D }, + unicodeslot = 0x2261, +} +\stoptyping + +Here are a few examples: + +\def\Test#1% + {\NC \bf \type{$#1$} + \NC \setupmathematics[collapsing=0] $#1$ + \NC \setupmathematics[collapsing=1] $#1$ + \NC \setupmathematics[collapsing=2] $#1$ + \NC \setupmathematics[collapsing=3] $#1$ \NC \NR} + +\starttabulate[|c|cp|cp|cp|cp|] + \NC \BC \ttbf 0 \BC \ttbf 1 (sp) \BC \ttbf 2 (sp ml) \BC \ttbf 3 (ml sp) \BC \NR + \Test{==} + \Test{/=} + \Test{>=} +\stoptabulate + +A complete list of collapses can be generated after loading one of the tracing +modules: + +\startbuffer +\usemodule[math-ligatures] +\stopbuffer + +\typebuffer \getbuffer + +This provides the command: + +\startbuffer +\showmathligatures +\stopbuffer + +\typebuffer + +which gives: + +\start \switchtobodyfont[8pt] \getbuffer \stop + +\stopsection + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/math/math-introduction.tex b/doc/context/sources/general/manuals/math/math-introduction.tex index f5d241004..de7c0a960 100644 --- a/doc/context/sources/general/manuals/math/math-introduction.tex +++ b/doc/context/sources/general/manuals/math/math-introduction.tex @@ -7,7 +7,18 @@ This manual is not a systematic discussion about math in \CONTEXT\ but more a collection of wrap|-|ups. The file also serves as testcase. The content can change over time and can also serve as a trigger for discussions on the mailing -list. Suggestions are welcome. +list. Content gets added sort of random. Suggestions are welcome. + +We discuss high level as well as low level commands. Some of the low level +commands (primitives) are wrapped in high level commands but you can of course +always revert to bare \TEX. + +I won't go into much detail about typesetting beautiful math, for that I refer to +the \TEX book. \footnote {The most beautiful math is not typeset by \TEX\ anyway: +just search on YouTube for \quotation {Mathematics} by Hollie McNish, the +Metropole Orkest (conducted by Jules Buckley) and Martin Pyper.} + +% https://www.youtube.com/watch?v=SB8_2Yuj8Og \startlines Hans Hagen diff --git a/doc/context/sources/general/manuals/math/math-layout.tex b/doc/context/sources/general/manuals/math/math-layout.tex index 92ced8f22..83137444d 100644 --- a/doc/context/sources/general/manuals/math/math-layout.tex +++ b/doc/context/sources/general/manuals/math/math-layout.tex @@ -1,10 +1,17 @@ \startenvironment math-layout -\switchtobodyfont [modern] -\switchtobodyfont [dejavu] -\switchtobodyfont [cambria] -\switchtobodyfont[lucidaot] -\switchtobodyfont [xits] +\enabledirectives[fontgoodies.mathkerning] + +\usebodyfont [modern] +\usebodyfont [cambria] +\usebodyfont [lucidaot] +\usebodyfont [xits] +\usebodyfont [stixtwo] +\usebodyfont [dejavu] +\usebodyfont [pagella] +\usebodyfont [termes] +\usebodyfont [bonum] +\usebodyfont [schola] \setupbodyfont [pagella] @@ -32,21 +39,24 @@ height=middle, width=middle] +\definecolor[maincolor] [darkmagenta] +\definecolor[extracolor][darkyellow] + \setuphead [chapter] [header=high, style=\bfc, - color=darkmagenta] + color=maincolor] \setuphead [section] [style=\bfb, - color=darkmagenta] + color=maincolor] \setuphead [subsection] [style=\bfa, - color=darkmagenta] + color=maincolor] \usemodule[abr-02] diff --git a/doc/context/sources/general/manuals/math/math-mkiv.tex b/doc/context/sources/general/manuals/math/math-mkiv.tex index f36b1032d..11fb4ca1c 100644 --- a/doc/context/sources/general/manuals/math/math-mkiv.tex +++ b/doc/context/sources/general/manuals/math/math-mkiv.tex @@ -31,12 +31,17 @@ \stopfrontmatter \startbodymatter + \component math-input + \component math-definitions \component math-spacing \component math-framing \component math-numbering \component math-combining \component math-features + \component math-alignments + \component math-suboptimal \component math-tricks + \component math-oddities \stopbodymatter \stopdocument diff --git a/doc/context/sources/general/manuals/math/math-numbering.tex b/doc/context/sources/general/manuals/math/math-numbering.tex index 64f766628..1576e17bb 100644 --- a/doc/context/sources/general/manuals/math/math-numbering.tex +++ b/doc/context/sources/general/manuals/math/math-numbering.tex @@ -69,6 +69,61 @@ are some examples: \typebuffer \getbuffer +In the next examples we demonstrate how we can avoid numbering, pass a reference as key, +use assignments instead and add a title or suffix. + +\startbuffer +\startplaceformula + \startformula e=mc^2 \stopformula +\stopplaceformula +\startplaceformula[-] + \startformula e=mc^2 \stopformula +\stopplaceformula +\startplaceformula[p] + \startformula e=mc^2 \stopformula +\stopplaceformula +\startplaceformula[reference=foo] + \startformula e=mc^2 \stopformula +\stopplaceformula +\startplaceformula[title=whatever] + \startformula e=mc^2 \stopformula +\stopplaceformula +\startplaceformula[suffix=q] + \startformula e=mc^2 \stopformula +\stopplaceformula +\startplaceformula[r] + \startformula e=mc^2 \stopformula +\stopplaceformula +\stopbuffer + +\typebuffer \getbuffer + +If you want consistent spacing you can enforce this: + +\startbuffer +\startplaceformula[s] + \startformula e=mc^2 \stopformula +\stopplaceformula +\startplaceformula[-] + \startformula e=mc^2 \stopformula +\stopplaceformula +\startplaceformula[-] + \startformula e=mc^2 \stopformula +\stopplaceformula +\setupformulas[numberstrut=always] +\startplaceformula[-] + \startformula e=mc^2 \stopformula +\stopplaceformula +\startplaceformula[-] + \startformula e=mc^2 \stopformula +\stopplaceformula +\stopbuffer + +\typebuffer \start \showstruts \getbuffer \stop + +Possible values for \type {numberstrut} are \type {yes} (the default), \type +{always} and \type {no}. + \stopchapter \stopcomponent diff --git a/doc/context/sources/general/manuals/math/math-oddities.tex b/doc/context/sources/general/manuals/math/math-oddities.tex new file mode 100644 index 000000000..015a30126 --- /dev/null +++ b/doc/context/sources/general/manuals/math/math-oddities.tex @@ -0,0 +1,176 @@ +% language=uk + +\environment math-layout + +\startcomponent math-oddities + +\startchapter[title=Things you might forget] + +\startsection[title=Ampersands] + +You can skip this, but if you continue reading, here is some low level plain code +(don't use this in \CONTEXT): + +\starttyping +\def\matrix#1% + {\null + \, + \vcenter + {\normalbaselines + \ialign{\hfil$##$\hfil && \quad\hfil$##$\hfil\crcr + \mathstrut\crcr + \noalign{\kern-\baselineskip} + #1\crcr + \mathstrut\crcr + \noalign{\kern-\baselineskip}}}% + \,} +\stoptyping + +You see the \type {&} here and it's the alignment cell separator. The special +meaning of these characters is determined by the so called catcode. Here we have: + +\starttyping +\catcode"26=4 +\stoptyping + +Character \type {0x26} is the ampersand. In \CONTEXT\ this character can be used +in text mode because we never use it as alignment character, which is something +typical \TEX. The same is true for \type {^} and \type {_}. So, effectively we +have (for instance): + +\starttyping +\catcode"26=12 +\stoptyping + +In order to still get this \type {&} supported as alignment character in math +mode, we have to jump through some hoops. Think of this (again, don't do this in +\CONTEXT): + +\starttyping +\bgroup + \global\mathcode"26="8000 + + \catcode"26=4 + + \xdef\normalmathaligntab{&} + + \catcode"26=13 + + \global\everymath{\def&{\normalmathaligntab}} +\egroup +\stoptyping + +Before we go on you should realize that we never use the \type {&} in \CONTEXT\ +as separator. The sole reason for dealing with this issue is that users can have +their own code that uses the ampersand that way. In \CONTEXT\ we do things like: + +\starttyping +\startformula + \startmatrix + \NC 1 \NC 2 \NR + \NC 3 \NC 4 \NR + \stopmatrix +\stopformula +\stoptyping + +Where \type {\NC} can be more powerful than a \type {&}. Anyhow, the reason for +discussing this here is that there can be surprises. In a running text you can do +this: + +\starttyping +A & B +\stoptyping + +Which procces okay and gives the ampersand as glyph. The following is also okay: + +\starttyping +$A \Umathchar"2"0"26 B$ +\stoptyping + +However, the next one: + +\starttyping +$A \char"26 B$ +\stoptyping + +fails with a \type {Misplaced alignment tab character &}. The reason is that +where in text mode \TEX's parser will turn the \type {\char} into a character +node and carry on afterwards, in math mode it will treat this inpout as were it a +directly input character, so the above is like, where the \type {&} has active +properties and becomes the sparator ampersand which then triggers the error: + +\starttyping +$A & B$ +\stoptyping + +This means that we cannot have a definition like: + +\starttyping +\def\AND{\char"26\relax} +\stoptyping + +that can be used in math mode, which is why the \CWEB\ macros do: + +\starttyping +\def\AND{\def\AND{\mathchar"2026\relax}\AND} +\stoptyping + +Back to the plain example. The \type {\matrix} command has to be wrapped in +math mode and therefore the \type {&} will adapt, while in most \CONTEXT\ +constructs that use alignment, we're not in math mode at all when we start +with the alignment. Therefore the \type {&} will be just an ampersand in most +\CONTEXT\ cases. + +So to summarize: don't expect \type {\char"26} to work out well in math mode +because all kind of magic kicks in. These are the more obscure features and side +effects of \TEX\ dealing with input and it's really hard to predict how \TEX\ +will see the ampersand you entered. You need to know the internals and even then +it's non trivial. Take + +\starttyping +\startformula +\startalign + \NC x \NR + \NC x \NR +\stopalign +\stopformula +\stoptyping + +versus: + +\starttyping +\startformula +\startalign + & x \NR + & x \NR +\stopalign +\stopformula +\stoptyping + +versus: + +\starttyping +\startformula +\startalign + \NC x & y \NR + \NC x & y \NR +\stopalign +\stopformula +\stoptyping + +The first case works as expected, the second one treats the \type {&} as text and +the third one, as we enter math mode with \type {\NC}, depends on circumstances. +If you use just \CONTEXT\ math coding, you can say: + +\starttyping +\setupmathematics + [ampersand=normal] +\stoptyping + +And always render an ampersand (although a math one in math mode). + +\stopsection + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/math/math-spacing.tex b/doc/context/sources/general/manuals/math/math-spacing.tex index 3412a3abc..913a90d9e 100644 --- a/doc/context/sources/general/manuals/math/math-spacing.tex +++ b/doc/context/sources/general/manuals/math/math-spacing.tex @@ -1,3 +1,5 @@ +% language=uk + \environment math-layout \startcomponent math-spacing @@ -392,6 +394,352 @@ Of course better is to fix the font. \stopsection +\startsection[title=Multiline] + +Inline formulas can span lines but display math normally sits on one line unless +one uses alignment mechanisms. Take this: + +\startbuffer[demo] +\startformula + x\dorecurse{30}{ + #1x^{#1x}} = 10 +\stopformula +\stopbuffer + +\typebuffer[demo] + +\par \start \setupformula[split=no] \getbuffer[demo] \stop \par + +You can set \type {split} to \type {yes} using \type {\setupformula} and get the +following: + +\par \start \setupformula[split=yes] \getbuffer[demo] \stop \par + +Maybe nicer is to also set \type {align} to \type {flushleft}: + +\par \start \setupformula[split=yes,align=flushleft] \getbuffer[demo] \stop \par + +If you want the binary operators to start the lines you can set this: + +\startbuffer[setup] +\setupmathematics[setups=math:spacing:split] +\setupformulas[split=yes,align=flushleft] +\stopbuffer + +\typebuffer[setup] + +\par \start \getbuffer[setup,demo] \stop \par + +You can prevent a split with a large penalty. Here is a test that yuou can run +to play with this feature: + +\starttyping +\dostepwiserecurse {30} {100} {1} { + \hsize \dimexpr 40pt + #1pt \relax + \startformula + y = a \dorecurse {50} { + \penalty 10000 {\bf + ##1b} + + ##1c^2 + } + \stopformula + \page +} +\stoptyping + +There is an experimental alignment mechanism available. Watch the following +examples: + +\startbuffer[demo] +before + \startformula + z + 3y = \alignhere x + \dorecurse{20}{ + #1x^{#1x}} + \stopformula +inbetween + \startformula + z + 3y \alignhere = 1 + \dorecurse{4}{ + \dorecurse{#1}{+ #1x^{##1x}} + \ifnum#1<4\breakhere\fi + } + \stopformula +after +\stopbuffer + +\typebuffer[demo] + +\startbuffer[setup] +\setupformula + [split=no] +\stopbuffer + +\typebuffer[setup] \start \getbuffer[setup,demo] \stop + +\startbuffer[setup] +\setupformula + [split=yes, + align=flushleft] +\stopbuffer + +\typebuffer[setup] \start \getbuffer[setup,demo] \stop + +\startbuffer[setup] +\setupformula + [split=yes, + align=flushleft, + hang=auto] +\stopbuffer + +\typebuffer[setup] \start \getbuffer[setup,demo] \stop + +\startbuffer[setup] +\setupformula + [split=yes, + align=flushleft, + hang=auto, + distance=1em] +\stopbuffer + +\typebuffer[setup] \start \getbuffer[setup,demo] \stop + +\startbuffer[setup] +\setupformula + [split=yes, + align=flushleft, + hang=yes, + distance=2em] +\stopbuffer + +\typebuffer[setup] \start \getbuffer[setup,demo] \stop + +\startbuffer[setup] +\setupformula + [split=yes, + align=flushleft, + hang=yes, + distance=2em, + interlinespace=1.5\lineheight] +\stopbuffer + +\typebuffer[setup] \start \getbuffer[setup,demo] \stop + +If you want to split over pages, you can say: + +\starttyping +\setupformula + [split=page, + align=middle] +\stoptyping + +but that is rather experimental (especially in combination with other +number placement related options). + +\stopsection + +\startsection[title=Scripts] + +Superscripts and subscripts are typeset in a smaller size than their nucleus. You +can influence that as follows: + +\startbuffer +\startformula +x^{2} = x^{\textstyle 2} + = x^{\scriptstyle 2} + = x^{\scriptscriptstyle 2} +\stopformula +\stopbuffer + +\typebuffer \getbuffer + +You can also use macros instead of a \type {^} and \type {_}, as in: + +\startbuffer +\startformula +x \superscript {2} = +x \superscript {\textstyle 2} = +x \superscript {\scriptstyle 2} = +x \superscript {\scriptscriptstyle 2} = +x \nosuperscript {2} +\stopformula +\stopbuffer + +\typebuffer \getbuffer + +The \type {\nosuperscript} primitive makes sure that we get the same size as the +nucleus. + +\startbuffer +\startformula +x \superscript {2} \subscript {i} = +x \nosuperscript {2} \subscript {i} = +x \superscript {2} \nosubscript {i} = +x \nosuperscript {2} \nosubscript {i} +\stopformula +\stopbuffer + +\typebuffer \getbuffer + +\stopsection + +\startsection[title=Text accents] + +You can put an accent over a character: + +\startbuffer +$\grave{x} \neq \grave{i}$\quad +$\ddot {x} \neq \ddot {i}$\quad +$\bar {x} \neq \bar {i}$\quad +$\acute{x} \neq \acute{i}$\quad +$\hat {x} \neq \hat {i}$\quad +$\check{x} \neq \check{i}$\quad +$\breve{x} \neq \breve{i}$\quad +$\dot {x} \neq \dot {i}$\quad +$\ring {x} \neq \ring {i}$\quad +$\tilde{x} \neq \tilde{i}$\quad +$\dddot{x} \neq \dddot{i}$\quad +\stopbuffer + +\typebuffer + +This comes out as: \inlinebuffer. For regular text you can better use proper composed +\UTF\ encoded characters. + +\stopsection + +\startsection[title=Directions] + +Math has its own direction control: + +\starttexdefinition unexpanded MathTest #1#2#3 + \ruledvbox \bgroup + \mathdir#1\relax + \textdir#2\relax + \pardir #3\relax + \hsize=30mm + \startformula + a^2+b^2=c^2 + \stopformula + \egroup +\stoptexdefinition + +\starttexdefinition unexpanded MathShow #1#2#3#4 + \hbox \bgroup + \infofont #1 : m=#2 t=#3 p=#4 + \egroup +\stoptexdefinition + +\startbuffer +\startcombination[nx=4,ny=2,distance=1cm] + {\MathTest{TLT}{TLT}{TLT}} {\MathShow1{TLT}{TLT}{TLT}} + {\MathTest{TLT}{TLT}{TRT}} {\MathShow2{TLT}{TLT}{TRT}} + {\MathTest{TLT}{TRT}{TLT}} {\MathShow3{TLT}{TRT}{TLT}} + {\MathTest{TLT}{TRT}{TRT}} {\MathShow4{TLT}{TRT}{TRT}} + {\MathTest{TRT}{TLT}{TLT}} {\MathShow5{TRT}{TLT}{TLT}} + {\MathTest{TRT}{TLT}{TRT}} {\MathShow6{TRT}{TLT}{TRT}} + {\MathTest{TRT}{TRT}{TLT}} {\MathShow7{TRT}{TRT}{TLT}} + {\MathTest{TRT}{TRT}{TRT}} {\MathShow8{TRT}{TRT}{TRT}} +\stopcombination +\stopbuffer + +\typebuffer + +Normally you will not control directions this way but use the proper parameters +in layout related setup commands. + +\startlinecorrection +\getbuffer +\stoplinecorrection + +\stopsection + +\startsection[title=Surround] + +The spacing around inline formulas is consistent with other +spacing but it can be enlarged. We just show a few examples: + +\startbuffer[demo] +\hsize 20em +We have +\dorecurse {8} {% + \ifcase#1\or\else and \fi + $x+#1$ and $x-#1$ and $x \times #1$ +} +\removeunwantedspaces . +\par +\stopbuffer + +\typebuffer[demo] + +\blank \start \getbuffer[demo] \stop + +\startbuffer[setup] +\setupmathematics + [textdistance=2pt plus 1pt minus 1pt] +\stopbuffer + +\typebuffer[setup] + +\blank \start \getbuffer[setup,demo] \stop + +\startbuffer[setup] +\setupmathematics + [textdistance=4pt plus 2pt minus 2pt] +\stopbuffer + +\typebuffer[setup] + +\blank \start \getbuffer[setup,demo] \stop + +\stopsection + +\startsection[title=Choices] + +The next examples are generated using this macro: + +\startbuffer +\starttexdefinition unexpanded Test#1#2 + + \begingroup + + \showmakeup[depth] + + \def\TestA{\dontleavehmode\ruledhbox{\dorecurse{8}{before }}} + \def\TestB{\dontleavehmode\ruledhbox{\dorecurse{8}{after }}} + \def\TestC{\dorecurse{18}{x+}x} + + \setdisplaymathspacemodel[3] + \setupalign[flushleft] 1\space:\space\TestA \par + \startformula #2 \TestC \stopformula \par + \setupalign[flushleft] 2\space:\space\TestB \par + + \setdisplaymathspacemodel[4] + + \vskip#1\lineheight + + \setupalign[flushright] \TestA\space:\space2 \par + \startformula #2 \TestC \stopformula \par + \setupalign[flushright] \TestB\space:\space2 \par + + \endgroup + +\stoptexdefinition +\stopbuffer + +\typebuffer \getbuffer + +It demonstrates the often hard decisions that we have to make with regards to +spacing. On the one hand we want to be adaptive, on the other hand we want to be +consistent, for instance in the depth of lines. These examples overlay the two +variants (which is of course font and style dependent). + +\Test{-4.70}{} \blank[2*line] +\Test{-6.00}{\frac{1}{2}} \blank[2*line] +\Test{-6.55}{\frac{1}{\frac{1}{2}}} + +One side effect of these options is that at some point we need to choose a +default and then easily forget about the other variants. + +\stopsection + \stopchapter \stopcomponent diff --git a/doc/context/sources/general/manuals/math/math-suboptimal.tex b/doc/context/sources/general/manuals/math/math-suboptimal.tex new file mode 100644 index 000000000..9f4e94730 --- /dev/null +++ b/doc/context/sources/general/manuals/math/math-suboptimal.tex @@ -0,0 +1,40 @@ +\environment math-layout + +\startcomponent math-subtoptimal + +\startchapter[title=Suboptimal] + +\startsection[title=Extensibles] + +Extensibles are implemented as follows: we start with the default shape, and when +that doesn't cover the body of text, a next size is chosen. When we run out of +sizes, a glyph is made from snippets (often a start glyph, overlapping middle +pieces and an end piece. Of course a font needs to provide these variants and +snippets. + +However, the quality of the coverage can differ per font. Here we show how Latin +Modern, Pagella, Cambria, Lucida and Dejavu look like: + +\starttexdefinition ShowSample #1#2 + \start + \showglyphs + \switchtobodyfont [#1] + \dontleavehmode#2: \dorecurse{50}{$\vec{\blackrule[width=##1pt]}$\space}\unskip + \par + \stop +\stoptexdefinition + +\ShowSample{modern} {Latin Modern} \blank +\ShowSample{pagella} {Pagella} \blank +\ShowSample{cambria} {Cambria} \blank +\ShowSample{lucidaot}{Lucida} \blank +\ShowSample{dejavu} {Dejavu} + +Of course fonts can be improved (or patched) and these samples might come out +better compared to previous renderings. + +\stopsection + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/math/math-tricks.tex b/doc/context/sources/general/manuals/math/math-tricks.tex new file mode 100644 index 000000000..7efcec50b --- /dev/null +++ b/doc/context/sources/general/manuals/math/math-tricks.tex @@ -0,0 +1,819 @@ +\environment math-layout + +\startcomponent math-tricks + +\startchapter[title=Tricks] + +\startsection[title=Introduction] + +Math support in \CONTEXT\ is wrapped around basic \TEX\ primitives and +unfortunately not all we want is easy to configure. This is not surprising +because the original ideas behind \TEX\ are that one makes a style per book and a +one macro package \quote {we-can-do-it-all} approach is not what Don Knuth had in +mind at that time. + +So, for instance support for configurable spacing per math element, coloring of +specific (sub) elements, simple switching of whatever combination of alignments +and number placement, these all take quite a bit of code and hackery. + +Even configuring something seemingly trivial as fractions or top, bottom, left, +middle and right fences take some effort. This is because the engine uses +information from fonts to combine shapes and paste the content and ornaments to +together. + +For that reason already in \MKII\ but more extensively in \MKIV\ we did a lot of +these things in wrapper macros. When the math renderer was finalized for +\OPENTYPE\ math some extra control was added that can make these things easier. +However, because we go a bit beyond what is possible using this new functionality +these new mechanisms are not yet used in \MKIV, but they might be eventually. +Here we just show some of the (newer) low level trickery. For details about what +was already possible in pure \TEX, we refer to the ultimate references: the \TeX +book (by Donald Knuth) and \TeX\ by Topic (by Victor Eijkhout). + +\stopsection + +\startsection[title=Kerning] + +Kerning in \OPENTYPE\ math is not the same as in traditional \TEX: instead of a +single value, we have staircase kerns, that is, depending on the location (left +or right) and the vertical position, at discrete distances between depth and +height. In addition there is italic correction but that is only applied in +certain cases, one of which is the script location. + +Unfortunately not all fonts follow the same route. Some fonts have a true width +and a moderate italic correction is added to it (of at all), while other fonts +lie about the width and depend on an excessive italic correction to compensate +for that. + +\definemeasure[quarter][\dimexpr(\textwidth-3em)/4\relax] + +\def\TestKern#1% + {\scale + [width=\measure{quarter}] + {\hbox to 50pt{\hss\showboxes\switchtobodyfont[#1]$V_i^i = W_i^i$\hss}}} + +\startlinecorrection +\startcombination[nx=4,ny=2,distance=1em] + {\TestKern {modern}} {\infofont modern} + {\TestKern {cambria}} {\infofont cambria} + {\TestKern{lucidaot}} {\infofont lucida} + {\TestKern {dejavu}} {\infofont dejavu} + {\TestKern {pagella}} {\infofont pagella} + {\TestKern {termes}} {\infofont termes} + {\TestKern {bonum}} {\infofont bonum} + {\TestKern {schola}} {\infofont schola} +\stopcombination +\stoplinecorrection + +I will not discuss the details because when a font gets updated, it might look +better or worse. These fonts were loaded with the following directive set: + +\starttyping +\enabledirectives[fontgoodies.mathkerning] +\stoptyping + +An example of a fontgoodie that fixed the kerning is \type {pagella-math.lfg}. Here +is the relevant bit: + +\starttyping +local kern_200 = { bottomright = { { kern = -200 } } } +local kern_100 = { bottomright = { { kern = -100 } } } + +return { + ..... + mathematics = { + ..... + kerns = { + [0x1D449] = kern_200, -- 𝑉 + [0x1D44A] = kern_100, -- 𝑊 + }, + ..... + } +} +\stoptyping + +This fixes the real bad kerning of Pagella Math which at least in 2017 was not +(yet) fixed. When the fonts are frozen we can start makling permanent runtime +fixes like this. + +\stopsection + +\startsection[title=Primes] + +Primes are a pain in the butt. The reason for this is that they are independent +characters on the one hand but can be seen as a superscript on the other. Let's +first look at the symbols at the three sizes that are used in math. + +\startbuffer[prime] +$ + {\textstyle \char"2032} + {\scriptstyle \char"2032} + {\scriptscriptstyle\char"2032} +\quad + {\textstyle \char"FE931} + {\scriptstyle \char"FE931} + {\scriptscriptstyle\char"FE931} +\quad + {\textstyle \char"FE932} + {\scriptstyle \char"FE932} + {\scriptscriptstyle\char"FE932} +$ +\stopbuffer + +\typebuffer[prime] + +We blow up the characters a bit and get this: + +\startlinecorrection +\scale[scale=5000]{\showglyphs\inlinebuffer[prime]} +\stoplinecorrection + +\def\TestPrime#1% + {\scale + [width=\measure{quarter}] + {\ruledhbox to 65pt{% + \hss + \showglyphs + \switchtobodyfont[#1]% + \inlinebuffer[prime]% + \hss}}} + +The first set is the normal prime character scaled to the text, script and +scriptscriptsize. The second set shows the characters (at three sizes) as they +are in the font. The largest character is raised while the other two are closer +to the baseline. In some fonts the smaller sizes arenot smaller at all. The last +set is a variant of the the first set but we made them into virtual characters +with a displacement and different dimensions. Those are the ones we use as +primes. + +\startlinecorrection +\startcombination[nx=4,ny=2,distance=1em] + {\TestPrime {modern}} {\infofont modern} + {\TestPrime {cambria}} {\infofont cambria} + {\TestPrime{lucidaot}} {\infofont lucida} + {\TestPrime {dejavu}} {\infofont dejavu} + {\TestPrime {pagella}} {\infofont pagella} + {\TestPrime {termes}} {\infofont termes} + {\TestPrime {bonum}} {\infofont bonum} + {\TestPrime {schola}} {\infofont schola} +\stopcombination +\stoplinecorrection + +Next we show how primes show up in real math. The examples +explain themselves. + +\startbuffer +{\textstyle f = g} \quad +{\scriptstyle f = g} \quad +{\scriptscriptstyle f = g} +\stopbuffer + +\typebuffer + +\startlinecorrection +\scale[scale=2000]{\showglyphs$\inlinebuffer$} +\stoplinecorrection + +\startbuffer +{\textstyle f_i' = g_i'} \quad +{\scriptstyle f_i' = g_i'} \quad +{\scriptscriptstyle f_i' = g_i'} +\stopbuffer + +\typebuffer + +\startlinecorrection +\scale[scale=2000]{\showglyphs$\inlinebuffer$} +\stoplinecorrection + +\startbuffer +{\textstyle f^{\char"2032}(0) = g^{\char"2032}(0)} \quad +{\scriptstyle f^{\char"2032}(0) = g^{\char"2032}(0)} \quad +{\scriptscriptstyle f^{\char"2032}(0) = g^{\char"2032}(0)} +\stopbuffer + +\typebuffer + +\startlinecorrection +\scale[scale=2000]{\showglyphs$\inlinebuffer$} +\stoplinecorrection + +\startbuffer +{\textstyle f'(0) = g'(0)} \quad +{\scriptstyle f'(0) = g'(0)} \quad +{\scriptscriptstyle f'(0) = g'(0)} +\stopbuffer + +\typebuffer + +\startlinecorrection +\scale[scale=2000]{\showglyphs$\inlinebuffer$} +\stoplinecorrection + +\startbuffer +{\textstyle f^{\char"2032}(0) = g^{\char"2032}(0)} \quad +{\scriptstyle f^{\char"2032}(0) = g^{\char"2032}(0)} \quad +{\scriptscriptstyle f^{\char"2032}(0) = g^{\char"2032}(0)} +\stopbuffer + +\typebuffer + +\startlinecorrection +\scale[scale=2000]{\showglyphs$\inlinebuffer$} +\stoplinecorrection + +\startbuffer +{\textstyle f^{\char"2032}(0) = g^{\char"2032}(0)} \quad +{\scriptstyle f^{\char"2032}(0) = g^{\char"2032}(0)} \quad +{\scriptscriptstyle f^{\char"2032}(0) = g^{\char"2032}(0)} +\stopbuffer + +\typebuffer + +\startlinecorrection +\scale[scale=2000]{\showglyphs$\inlinebuffer$} +\stoplinecorrection + +The prime analyzer can deal with sizes, subscripts but also converts a sequence +of upright quotes into one unicode symbol. So, + +\startbuffer +f'_i \neq f''_i \neq f'''_i \neq f''''_i +\stopbuffer + +\typebuffer + +becomes: + +\startlinecorrection +\scale[scale=4000]{\showglyphs$\inlinebuffer$} +\stoplinecorrection + +\stopsection + +\startsection[title=Radicals] + +Sometimes users complain about the look of a radical symbol. This is however a matter +of design. Some fonts let the shape start more below the baseline than others. Soem go +more straight up than relatives in another font. When largers sizes are needed, some +fonts offer smaller than others. Just look at the different desings: + +\def\TestRadical#1% + {\NC + \type{#1}\blackrule[width=0pt,height=2.5ex,depth=2ex]\NC + \switchtobodyfont[#1]\scale[scale=2000]{\showglyphs$\surd $}\NC + \switchtobodyfont[#1]\scale[scale=2000]{\showglyphs$\sqrt{} $}\NC + \switchtobodyfont[#1]\scale[scale=2000]{\showglyphs$\sqrt{.}$}\NC + \switchtobodyfont[#1]\scale[scale=2000]{\showglyphs$\sqrt{x}$}\NC + \switchtobodyfont[#1]\scale[scale=2000]{\showglyphs$\surd \sqrt{} \sqrt{.} \sqrt{x}$}\NC + \NR} + +\starttabulate[|l|c|c|c|c|c|] + \NC \NC \type{\surd} \NC \type{\sqrt{}} \NC \type{\sqrt{.}} \NC \type{\sqrt{x}} \NC \NR + \TestRadical{modern} + \TestRadical{cambria} + \TestRadical{lucidaot} + \TestRadical{dejavu} + \TestRadical{pagella} + \TestRadical{termes} + \TestRadical{bonum} + \TestRadical{schola} +\stoptabulate + +The automatic scaling doesn't always work out as expected but on the average is +okay. Keep in mind that often the content is not that extreme. + +\def\TestRadical#1% + {\NC + \type{#1}\NC + \switchtobodyfont[#1]\showglyphs$\sqrt{\blackrule[width=1em,height=1.0ex,color=darkgray]}$\NC + \switchtobodyfont[#1]\showglyphs$\sqrt{\blackrule[width=1em,height=1.5ex,color=darkgray]}$\NC + \switchtobodyfont[#1]\showglyphs$\sqrt{\blackrule[width=1em,height=2.0ex,color=darkgray]}$\NC + \switchtobodyfont[#1]\showglyphs$\sqrt{\blackrule[width=1em,height=2.5ex,color=darkgray]}$\NC + \switchtobodyfont[#1]\showglyphs$\sqrt{\blackrule[width=1em,height=3.0ex,color=darkgray]}$\NC + \switchtobodyfont[#1]\showglyphs$\sqrt{\blackrule[width=1em,height=3.5ex,color=darkgray]}$\NC + \switchtobodyfont[#1]\showglyphs$\sqrt{\blackrule[width=1em,height=4.0ex,color=darkgray]}$\NC + \switchtobodyfont[#1]\showglyphs$\sqrt{\blackrule[width=1em,height=4.5ex,color=darkgray]}$\NC + \NR} + +\starttabulate[|l|c|c|c|c|c|c|c|c|] + \NC \NC 1.0ex \NC 1.5ex \NC 2.0ex \NC 2.5ex \NC 3.0ex \NC 3.5ex \NC 4.0ex \NC 4.5ex \NC \NR + \TestRadical{modern} + \TestRadical{cambria} + \TestRadical{lucidaot} + \TestRadical{dejavu} + \TestRadical{pagella} + \TestRadical{termes} + \TestRadical{bonum} + \TestRadical{schola} +\stoptabulate + +In Lucida (the version at the time of writing this) we have to correct the threshold +a bit in the goodie file: + +\starttyping +local function FixRadicalDisplayStyleVerticalGap(value,target,original) + local o = original.mathparameters.RadicalVerticalGap -- 50 + return 2 * o * target.parameters.factor +end + +return { + ..... + mathematics = { + ..... + parameters = { + RadicalDisplayStyleVerticalGap = + FixRadicalDisplayStyleVerticalGap, + }, + ..... + }, +} +\stoptyping + +\stopsection + +\startsection[title=Integrals] + +A curious exception in the math system is the integral sign. Its companions are +the summation and product signs, but integral has as extra property that it has a +slant. In \LUATEX\ there is rather advanced control over how the (optional) +scripts are positioned (which relates to italic correction) but in \CONTEXT\ we +only make limited use of that. The main reason is that we also need to support +additional features like color. Therefore integrals are handled by the extensible +mechanism. + +The size of an integral is more of less fixed but you can enlarge to your +liking. One reason for this is that you might want a consistent size across +formulas. Let's use the following setup: + +\startbuffer[setup] +\setupmathextensible + [integral] + [rightoffset=-1mu, + exact=yes, + factor=2] + +\let\int\integral +\stopbuffer + +\typebuffer[setup] + +We use the following exmaple: + +\startbuffer[demo] +\ruledhbox{$\integral f\frac{1}{2} $}\quad +\ruledhbox{$\integral[rightoffset=3mu] f\frac{1}{2} $}\quad +\ruledhbox{$\integral[exact=no] f\frac{1}{2} $}\quad +\ruledhbox{$\integral f\frac{\frac{1}{2}}{x} $}\quad +\ruledhbox{$\integral[exact=no] f\frac{\frac{1}{2}}{x} $}\quad +\ruledhbox{$\integral[factor=1] f\frac{1}{2} $}\quad +\ruledhbox{$\integral[factor=3] f\frac{\frac{1}{2}}{x} $}\quad +\ruledhbox{$\integral[factor=3] f\frac{1}{2} $}\quad +\ruledhbox{$\int f\frac{1}{2} $}% bonus +\stopbuffer + +\typebuffer[demo] + +This renders as: + +\dontleavehmode\hbox{\getbuffer[setup,demo]} + +\stopsection + +\startsection[title=Fancy fences] + +Here I only show an example of fences drawn by \METAPOST. For the implementation +you can consult the library file \type {meta-imp-mat.mkiv} in the \CONTEXT\ +distribution. + +\startbuffer[setup] +\useMPlibrary[mat] + +\setupmathstackers + [both] % vfenced] + [color=darkred, + alternative=mp] + +\setupmathstackers + [top] + [color=darkred, + alternative=mp] + +\setupmathstackers + [bottom] + [color=darkred, + alternative=mp] +\stopbuffer + +\typebuffer[setup] + +We keep the demo simple: + +\startbuffer[demo] +$ \overbracket {a+b+c+d} \quad + \underbracket {a+b+c+d} \quad + \doublebracket {a+b+c+d} \quad + \overparent {a+b+c+d} \quad + \underparent {a+b+c+d} \quad + \doubleparent {a+b+c+d} $ \blank +$ \overbrace {a+b+c+d} \quad + \underbrace {a+b+c+d} \quad + \doublebrace {a+b+c+d} \quad + \overbar {a+b+c+d} \quad + \underbar {a+b+c+d} \quad + \doublebar {a+b+c+d} $ \blank +$ \overleftarrow {a+b+c+d} \quad + \overrightarrow {a+b+c+d} \quad + \underleftarrow {a+b+c+d} \quad + \underrightarrow {a+b+c+d} $ \blank +\stopbuffer + +\typebuffer[demo] + +Or visualized: + +\start +\getbuffer[setup,demo] +\stop + +\stopsection + +\startsection[title=Combined characters] + +We have some magic built with respect to sequences of characters. They are derived +from information in the character database that ships with \CONTEXT\ and are +implemented as a sort of ligatures. Some are defined in \UNICODE, others are +defined explicitly. + +\usemodule[math-ligatures] + +\start + \switchtobodyfont[small] + \showmathligatures +\stop + +\stopsection + +\startsection[title=Middle class fences] + +The next examples are somewhat obscure. They are a side effect of some extensions +to the engine that were introduced to control spacing around the \type {\middle} +class fences. Actually there is no real middle class and spacing was somewhat +hard codes when \type {\middle} was added to \ETEX. In \LUATEX\ we have +introduced keywords to some primitives that control spacing and other properties. +This permits better control over spacing than messing around with (for instance) +injected \type {\mathrel} commands that can have their own side effects. + +\startbuffer +\def\Middle{\middle|} +\def\Riddle{\Umiddle class 5 |} +\def\Left {\left (} +\def\Right {\right )} +\def\Rel {\mathrel{}} +\def\Per {\mathrel{.}} +\stopbuffer + +\startbuffer[1a] +$ a b $ +\stopbuffer +\startbuffer[1b] +$ \Rel a\Rel b\Rel $ +\stopbuffer + +\startbuffer[2a] +$ a b $ +\stopbuffer +\startbuffer[2b] +$ \Per a\Per b\Per $ +\stopbuffer + +\startbuffer[3a] +$\Left a \Middle b \Right$ +\stopbuffer +\startbuffer[3b] +$\Left\Rel a \Middle\Rel b\Rel\Right$ +\stopbuffer + +\startbuffer[4a] +$\Left a \Middle b \Right$ +\stopbuffer +\startbuffer[4b] +$\Left\Rel a \Middle\Per b\Per\Right$ +\stopbuffer + +\startbuffer[5a] +$\Left a \Middle b \Right$ +\stopbuffer +\startbuffer[5b] +$\Left\Rel a\Rel\Middle\Rel b\Rel\Right$ +\stopbuffer + +\startbuffer[6a] +$\Left a \Middle b \Right$ +\stopbuffer +\startbuffer[6b] +$\Left\Per a\Per\Middle\Per b\Per\Right$ +\stopbuffer + +\startbuffer[7a] +$\Left a \Riddle b \Right$ +\stopbuffer +\startbuffer[7b] +$\Left\Rel a \Riddle\Rel b\Rel\Right$ +\stopbuffer + +\startbuffer[8a] +$\Left a \Riddle b \Right$ +\stopbuffer +\startbuffer[8b] +$\Left\Rel a \Riddle\Per b\Per\Right$ +\stopbuffer + +\startbuffer[9a] +$\Left a \Riddle b \Right$ +\stopbuffer +\startbuffer[9b] +$\Left\Rel a\Rel\Riddle\Rel b\Rel\Right$ +\stopbuffer + +\startbuffer[10a] +$\Left a \Riddle b \Right$ +\stopbuffer +\startbuffer[10b] +$\Left\Per a\Per\Riddle\Per b\Per\Right$ +\stopbuffer + +We use the following definitions: + +\typebuffer + +Applied to samples these give the following outcome and spacing: + +\start + \getbuffer + + \starttabulate + \NC \ruledhbox{\typeinlinebuffer[1a]} \NC \showglyphs \inlinebuffer[1a] \NC \NR + \NC \ruledhbox{\typeinlinebuffer[1b]} \NC \showglyphs \inlinebuffer[1b] \NC \NR + \NC \ruledhbox{\typeinlinebuffer[2a]} \NC \showglyphs \inlinebuffer[2a] \NC \NR + \NC \ruledhbox{\typeinlinebuffer[2b]} \NC \showglyphs \inlinebuffer[2b] \NC \NR + \NC \ruledhbox{\typeinlinebuffer[3a]} \NC \showglyphs \inlinebuffer[3a] \NC \NR + \NC \ruledhbox{\typeinlinebuffer[3b]} \NC \showglyphs \inlinebuffer[3b] \NC \NR + \NC \ruledhbox{\typeinlinebuffer[4a]} \NC \showglyphs \inlinebuffer[4a] \NC \NR + \NC \ruledhbox{\typeinlinebuffer[4b]} \NC \showglyphs \inlinebuffer[4b] \NC \NR + \NC \ruledhbox{\typeinlinebuffer[5a]} \NC \showglyphs \inlinebuffer[5a] \NC \NR + \NC \ruledhbox{\typeinlinebuffer[5b]} \NC \showglyphs \inlinebuffer[5b] \NC \NR + \NC \ruledhbox{\typeinlinebuffer[6a]} \NC \showglyphs \inlinebuffer[6a] \NC \NR + \NC \ruledhbox{\typeinlinebuffer[6b]} \NC \showglyphs \inlinebuffer[6b] \NC \NR + \NC \ruledhbox{\typeinlinebuffer[7a]} \NC \showglyphs \inlinebuffer[7a] \NC \NR + \NC \ruledhbox{\typeinlinebuffer[7b]} \NC \showglyphs \inlinebuffer[7b] \NC \NR + \NC \ruledhbox{\typeinlinebuffer[8a]} \NC \showglyphs \inlinebuffer[8a] \NC \NR + \NC \ruledhbox{\typeinlinebuffer[8b]} \NC \showglyphs \inlinebuffer[8b] \NC \NR + \NC \ruledhbox{\typeinlinebuffer[9a]} \NC \showglyphs \inlinebuffer[9a] \NC \NR + \NC \ruledhbox{\typeinlinebuffer[9b]} \NC \showglyphs \inlinebuffer[9b] \NC \NR + \NC \ruledhbox{\typeinlinebuffer[10a]} \NC \showglyphs \inlinebuffer[10a] \NC \NR + \NC \ruledhbox{\typeinlinebuffer[10b]} \NC \showglyphs \inlinebuffer[10b] \NC \NR + \stoptabulate +\stop + +\stopsection + +\startsection[title=Auto|-|punctuation] + +\def\TestA#1#2#3% + {\ifnum#1=0 \type{#2}\else\setupmathematics[autopunctuation={#2}]$#3$\fi} + +\def\TestB#1#2% + {\NC \TestA{#1}{no} {#2} + \NC \TestA{#1}{yes} {#2} + \NC \TestA{#1}{yes,semicolon}{#2} + \NC \TestA{#1}{all} {#2} + \NC \TestA{#1}{all,semicolon}{#2} + \NC \NR} + +The \type {\setupmathematics} command has an option \type {autopunctuation} that +influences the way spacing after punctuatuon is handled, especially in cases like +the following (coordinates and such): + +\starttabulate[|c|c|c|c|c|] + \TestB{0}{} + \TestB{1}{(1,2)=(1, 2)} + \TestB{1}{(1.2)=(1. 2)} + \TestB{1}{(1;2)=(1; 2)} +\stoptabulate + +\stopsection + +\stopcomponent + +% \enabletrackers[math.makeup=boxes] + +% \startTEXpage[offset=10pt] +% $\displaystyle {{1}\normalover{2}}+x$\quad $\crampeddisplaystyle {{1}\normalover{2}}+x$\blank +% $\textstyle {{1}\normalover{2}}+x$\quad $\crampedtextstyle {{1}\normalover{2}}+x$\blank +% $\scriptstyle {{1}\normalover{2}}+x$\quad $\crampedscriptstyle {{1}\normalover{2}}+x$\blank +% $\scriptscriptstyle {{1}\normalover{2}}+x$\quad $\crampedscriptscriptstyle{{1}\normalover{2}}+x$\blank +% \stopTEXpage + +% \startTEXpage[offset=10pt] +% $e=mc^2$ +% \stopTEXpage + +% \startTEXpage[offset=10pt] +% $\sqrt{\frac{1}{2}+x}$ +% \stopTEXpage + +% \startTEXpage[offset=10pt] +% $\int^0_1{\frac{1}{2}+x}$ +% \stopTEXpage + +% \startTEXpage[offset=10pt] +% $\displaystyle\the\everydisplay\int^0_1{\frac{1}{2}+x}$ +% \stopTEXpage + +% \startbuffer +% ${}^2_2x^3_4 {}^2x_4$ +% \stopbuffer + +% % d : \Umathsubshiftdown +% % u : \Umathsupshiftup +% % s : \Umathsubsupshiftdown + +% \startTEXpage[offset=10pt] +% \starttabulate[|T||cT|cT|] +% \NC 0 \NC \mathscriptsmode 0 \inlinebuffer \NC dynamic \NC dynamic \NC \NR \TB +% \NC 1 \NC \mathscriptsmode 1 \inlinebuffer \NC d \NC u \NC \NR \TB +% \NC 2 \NC \mathscriptsmode 2 \inlinebuffer \NC s \NC u \NC \NR \TB +% \NC 3 \NC \mathscriptsmode 3 \inlinebuffer \NC s \NC u + s − d \NC \NR \TB +% \NC 4 \NC \mathscriptsmode 4 \inlinebuffer \NC d + (s − d)/2 \NC u + (s − d)/2 \NC \NR \TB +% \NC 5 \NC \mathscriptsmode 5 \inlinebuffer \NC d \NC u + s − d \NC \NR +% \stoptabulate +% \stopTEXpage + +% \startTEXpage[offset=10pt] \tt +% \starttabulate[|l|ck1|ck1|ck1|ck1|ck1|ck1|] +% \NC +% \NC \mathnolimitsmode0 $\displaystyle\int\nolimits^0_1$ +% \NC \mathnolimitsmode1 $\displaystyle\int\nolimits^0_1$ +% \NC \mathnolimitsmode2 $\displaystyle\int\nolimits^0_1$ +% \NC \mathnolimitsmode3 $\displaystyle\int\nolimits^0_1$ +% \NC \mathnolimitsmode4 $\displaystyle\int\nolimits^0_1$ +% \NC \mathnolimitsmode8000 $\displaystyle\int\nolimits^0_1$ +% \NC \NR +% \TB +% \NC \bf mode +% \NC 0 +% \NC 1 +% \NC 2 +% \NC 3 +% \NC 4 +% \NC 8000 +% \NC \NR +% \NC \bf superscript +% \NC 0 +% \NC font +% \NC 0 +% \NC 0 +% \NC +ic/2 +% \NC 0 +% \NC \NR +% \NC \bf subscript +% \NC -ic +% \NC font +% \NC 0 +% \NC -ic/2 +% \NC -ic/2 +% \NC 8000ic/1000 +% \NC \NR +% \stoptabulate +% \stopTEXpage + +{ } \bgroup \egroup \begingroup \endgroup + +\startbuffer[1] + [a:\mathstyle]\quad + \bgroup + \mathchoice + {\bf \scriptstyle (x:d :\mathstyle)} + {\bf \scriptscriptstyle (x:t :\mathstyle)} + {\bf \scriptscriptstyle (x:s :\mathstyle)} + {\bf \scriptscriptstyle (x:ss:\mathstyle)} + \egroup + \quad[b:\mathstyle]\quad + \mathchoice + {\bf \scriptstyle (y:d :\mathstyle)} + {\bf \scriptscriptstyle (y:t :\mathstyle)} + {\bf \scriptscriptstyle (y:s :\mathstyle)} + {\bf \scriptscriptstyle (y:ss:\mathstyle)} + \quad[c:\mathstyle]\quad + \bgroup + \mathchoice + {\bf \scriptstyle (z:d :\mathstyle)} + {\bf \scriptscriptstyle (z:t :\mathstyle)} + {\bf \scriptscriptstyle (z:s :\mathstyle)} + {\bf \scriptscriptstyle (z:ss:\mathstyle)} + \egroup + \quad[d:\mathstyle] +\stopbuffer + +\startbuffer[2] + [a:\mathstyle]\quad + \begingroup + \mathchoice + {\bf \scriptstyle (x:d :\mathstyle)} + {\bf \scriptscriptstyle (x:t :\mathstyle)} + {\bf \scriptscriptstyle (x:s :\mathstyle)} + {\bf \scriptscriptstyle (x:ss:\mathstyle)} + \endgroup + \quad[b:\mathstyle]\quad + \mathchoice + {\bf \scriptstyle (y:d :\mathstyle)} + {\bf \scriptscriptstyle (y:t :\mathstyle)} + {\bf \scriptscriptstyle (y:s :\mathstyle)} + {\bf \scriptscriptstyle (y:ss:\mathstyle)} + \quad[c:\mathstyle]\quad + \begingroup + \mathchoice + {\bf \scriptstyle (z:d :\mathstyle)} + {\bf \scriptscriptstyle (z:t :\mathstyle)} + {\bf \scriptscriptstyle (z:s :\mathstyle)} + {\bf \scriptscriptstyle (z:ss:\mathstyle)} + \endgroup + \quad[d:\mathstyle] +\stopbuffer + +% % \bgroup .. \egroup + +% \startTEXpage[offset=10pt] +% $\displaystyle \getbuffer[1]$ \blank +% $\textstyle \getbuffer[1]$ +% \stopTEXpage + +% % \begingroup .. \endgroup + +% \startTEXpage[offset=10pt] +% $\displaystyle \getbuffer[2]$ \blank +% $\textstyle \getbuffer[2]$ +% \stopTEXpage + + +% \startTEXpage[offset=10pt] +% $\Uleft ( x \Umiddle\| \Uright )$ +% $\Uleft height 3ex ( x \Umiddle\| \Uright height 3ex )$ +% $\Uleft axis height 3ex ( x \Umiddle\| \Uright axis height 3ex )$ +% $\Uleft axis height 3ex depth 1ex ( x \Umiddle\| \Uright axis height 3ex depth 1ex )$ +% \stopTEXpage + +% \startTEXpage[offset=10pt] +% $\Uvextensible ( \frac{1}{x}$ +% $\Uvextensible height 3ex ( \frac{1}{x}$ +% $\Uvextensible axis height 3ex ( \frac{1}{x}$ +% $\Uvextensible axis height 3ex depth 1ex ( \frac{1}{x}$ +% $\Uvextensible exact axis height 3ex depth 1ex ( \frac{1}{x}$ +% \stopTEXpage + +% \startTEXpage[offset=10pt] +% \ruledhbox{$\Uhextensible "0 "23DE$} +% \ruledhbox{$\Uhextensible width 3ex "0 "23DE$} +% \ruledhbox{$\Uhextensible middle width 3ex "0 "23DE$} +% \ruledhbox{$\Uhextensible left width 3ex "0 "23DE$} +% \ruledhbox{$\Uhextensible right width 3ex "0 "23DE$} +% \stopTEXpage + +% \startTEXpage[offset=10pt] +% \ruledhbox{$\Umathaccent "0 "0 "23DE {1+x}$} +% \ruledhbox{$\Umathaccent fixed "0 "0 "23DE {1+x}$} +% \ruledhbox{$\Umathaccent top "0 "0 "23DE {1+x}$} +% \ruledhbox{$\Umathaccent bottom "0 "0 "23DF {1+x}$} +% \ruledhbox{$\Umathaccent both "0 "0 "23DE "0 "0 "23DF {1+x}$} +% \ruledhbox{$\Umathaccent overlay "0 "0 "23DE {1+x}$} +% \ruledhbox{$\Umathaccent top "0 "0 "23DE fraction 800 {1+x}$} +% \stopTEXpage + +% \startTEXpage[offset=10pt] +% ${ {1} \Uskewed / {2} }$ +% ${ {1} \Uskewed / exact {2} }$ +% ${ {1} \Uskewed / noaxis {2} }$ +% ${ {1} \Uskewed / exact noaxis {2} }$ +% ${ {1} \Uskewedwithdelims / () {2} }$ +% ${ {1} \Uskewedwithdelims / () exact {2} }$ +% ${ {1} \Uskewedwithdelims / () noaxis {2} }$ +% ${ {1} \Uskewedwithdelims / () exact noaxis {2} }$ +% \stopTEXpage + +% \disabletrackers[math.makeup] + +% \stopchapter +% +% \stopcomponent + +% A \type {\matheqnogapstep} factor that determines the gap between formula and +% equation number. +% +% A \type {\mathdisplayskipmode} directive that controls display skips: 1 = always, +% 2 = only when not zero, 3 = never. +% +% \mathstyle +% +% \suppressmathparerror + diff --git a/doc/context/sources/general/manuals/metafun/cow-fun.mps b/doc/context/sources/general/manuals/metafun/cow-fun.mps new file mode 100644 index 000000000..4235985ba --- /dev/null +++ b/doc/context/sources/general/manuals/metafun/cow-fun.mps @@ -0,0 +1,154 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%BoundingBox: 52 425 327 625 +%%Comment: originally a CorelDraw cow +%%Creator: MetaPost +%%Pages: 1 +%%EndProlog +%%Page: 1 1 +0 2 dtransform truncate idtransform setlinewidth pop +.625 0 0 setrgbcolor +newpath 245.45 600.34 moveto +242.78 599.40 239.62 596.02 237.67 594.07 curveto +236.74 584.42 244.58 583.63 250.20 577.44 curveto +258.77 573.70 251.21 567.72 256.18 557.42 curveto +257.04 550.94 257.90 543.89 255.31 539.78 curveto +249.48 538.92 247.97 540.22 246.89 531.43 curveto +246.31 526.97 231.77 529.06 229.03 538.27 curveto +227.09 544.97 221.33 546.70 217.80 543.17 curveto +213.77 538.06 215.78 531.22 217.80 527.47 curveto +224.93 517.32 212.04 511.42 205.13 516.74 curveto +199.73 508.68 211.39 500.04 207.43 494.50 curveto +205.78 493.99 204.77 489.17 185.47 500.54 curveto +180.36 504.14 167.83 500.76 168.77 520.63 curveto +168.77 525.82 165.60 543.53 162.14 555.91 curveto +159.41 561.24 156.74 559.08 156.89 553.90 curveto +157.18 547.85 162.94 531.22 155.52 540.22 curveto +153.58 539.21 156.89 523.58 156.89 521.64 curveto +162.00 517.03 157.39 513.58 154.73 512.28 curveto +151.27 518.33 149.62 518.04 147.17 514.44 curveto +141.70 514.08 144.58 528.19 140.26 528.62 curveto +137.02 527.76 139.18 520.06 138.24 518.76 curveto +132.98 524.74 130.90 529.27 127.01 521.64 curveto +126.14 521.64 122.11 519.19 120.96 526.54 curveto +117.65 552.74 107.06 558.36 93.82 565.13 curveto +92.02 565.63 84.24 566.71 79.34 568.15 curveto +73.51 560.88 58.32 565.63 56.23 570.31 curveto +54.79 572.69 54.65 575.21 54.79 576.50 curveto +52.34 580.10 55.87 582.70 59.62 583.06 curveto +62.86 587.16 68.54 594.94 71.28 601.56 curveto +72.29 603.07 74.95 609.34 78.19 609.55 curveto +74.95 612.94 74.30 622.51 82.66 617.33 curveto +87.12 624.02 92.09 624.31 95.76 615.82 curveto +102.89 615.38 102.31 608.69 115.78 605.52 curveto +122.76 602.86 132.77 604.58 140.26 603.72 curveto +136.22 596.88 127.44 566.86 132.98 559.80 curveto +140.76 564.70 141.84 605.38 157.03 595.66 curveto +160.56 593.93 159.91 590.04 164.09 590.18 curveto +170.42 587.45 169.13 600.77 172.51 600.77 curveto +176.47 599.76 183.02 599.04 186.98 599.54 curveto +197.71 600.77 206.93 604.08 223.92 602.50 curveto +231.12 601.78 238.25 601.06 245.45 600.34 curveto +closepath fill +newpath 305.28 560.95 moveto +304.63 560.95 299.95 561.24 299.38 561.24 curveto +302.40 550.44 303.98 536.47 304.20 525.31 curveto +303.70 521.35 299.81 517.46 299.38 525.67 curveto +295.85 530.86 296.42 540.07 293.40 540.29 curveto +287.35 539.64 285.34 513.22 280.01 509.33 curveto +276.26 512.28 280.73 524.02 275.54 524.74 curveto +270.50 524.02 264.31 526.68 266.69 534.46 curveto +270.29 543.02 268.34 554.76 266.54 561.60 curveto +262.37 578.59 264.02 587.09 271.58 596.09 curveto +267.48 604.51 lineto +275.40 608.26 285.62 604.58 290.02 602.21 curveto +294.62 600.26 300.24 595.94 301.10 587.38 curveto +303.34 578.88 304.42 569.74 305.28 560.95 curveto +closepath fill +.625 .625 0 setrgbcolor +newpath 84.38 618.55 moveto +88.34 624.38 92.59 622.94 96.34 615.67 curveto +101.23 615.60 102.46 612.43 104.98 610.78 curveto +122.62 598.39 147.46 607.18 167.90 601.92 curveto +180.94 598.54 190.87 599.76 200.09 602.06 curveto +220.32 607.25 246.10 596.16 263.74 603.86 curveto +274.75 608.62 284.76 605.66 292.97 600.91 curveto +297.58 597.96 299.59 596.09 300.96 591.26 curveto +306.29 572.54 306.29 551.02 309.53 530.57 curveto +309.53 528.84 312.19 526.10 312.48 522.07 curveto +315.79 511.34 316.08 510.12 317.16 502.20 curveto +317.16 501.34 326.52 488.45 325.01 479.02 curveto +323.93 481.25 323.86 482.83 321.62 481.68 curveto +320.33 479.30 320.90 473.90 322.56 471.74 curveto +320.83 470.81 318.46 473.47 317.52 475.20 curveto +318.17 473.04 317.81 470.81 316.73 469.30 curveto +315.86 472.25 316.58 473.18 315.36 473.90 curveto +313.99 472.90 314.21 469.30 314.28 466.20 curveto +313.49 468.07 311.47 472.46 312.55 476.42 curveto +312.48 484.20 308.81 489.10 310.32 499.10 curveto +310.10 504.43 307.30 521.06 304.56 524.30 curveto +303.12 526.25 306.36 510.77 306.36 506.16 curveto +306.65 500.90 307.08 468.72 306.43 463.10 curveto +306.43 459.22 306.22 453.96 307.08 452.16 curveto +308.74 450.79 309.38 450.50 309.60 447.98 curveto +309.24 446.62 308.74 446.04 307.73 445.54 curveto +306.07 444.60 307.37 441.79 306.07 439.85 curveto +304.49 438.77 304.13 441.86 303.34 441.86 curveto +302.69 441.00 303.05 437.98 302.47 436.18 curveto +299.66 433.80 292.18 432.50 289.15 434.66 curveto +289.73 440.64 291.74 441.58 295.63 446.62 curveto +298.66 452.59 297.00 460.94 296.93 468.14 curveto +295.49 480.38 289.22 487.30 289.44 496.44 curveto +287.86 495.72 286.42 494.57 284.26 494.86 curveto +283.39 489.46 286.42 484.56 284.83 480.82 curveto +281.95 471.96 277.06 446.62 279.00 437.76 curveto +280.01 434.74 278.21 433.15 277.06 433.94 curveto +276.77 433.94 276.55 433.94 276.41 433.94 curveto +276.41 433.94 276.55 431.42 275.69 430.92 curveto +274.10 430.34 273.67 431.71 272.66 432.14 curveto +271.22 430.85 272.52 429.48 271.15 428.04 curveto +267.19 428.04 261.36 425.38 257.98 428.26 curveto +257.33 434.16 263.30 436.68 266.47 440.71 curveto +268.63 446.62 271.08 462.89 267.77 474.62 curveto +267.77 475.56 264.38 485.28 261.43 488.66 curveto +258.70 487.66 257.33 485.50 253.22 486.29 curveto +252.58 484.34 253.30 482.33 252.22 480.10 curveto +251.86 479.52 249.34 478.58 249.19 481.39 curveto +248.98 483.05 248.90 486.36 248.26 486.72 curveto +243.65 486.72 233.71 487.08 231.77 493.92 curveto +219.89 492.34 215.93 491.26 206.57 493.42 curveto +196.63 489.67 183.24 506.16 174.53 502.20 curveto +172.51 496.15 173.09 485.64 171.65 481.39 curveto +169.34 474.77 171.14 467.14 171.14 456.41 curveto +170.57 455.40 169.85 454.46 168.48 454.46 curveto +168.48 453.10 169.34 450.86 168.62 449.42 curveto +167.18 447.62 165.89 451.80 165.02 444.60 curveto +163.15 443.74 157.75 442.22 155.59 445.18 curveto +155.88 448.99 158.33 451.30 160.13 453.38 curveto +161.42 456.91 160.99 458.28 160.70 461.81 curveto +160.99 464.98 161.71 468.58 161.86 470.09 curveto +161.86 473.04 162.50 479.30 161.14 481.18 curveto +159.41 482.69 lineto +157.18 487.22 158.33 494.64 157.61 500.26 curveto +155.81 500.69 155.81 500.98 154.01 498.31 curveto +154.01 494.42 153.50 486.36 152.35 483.84 curveto +149.69 479.81 150.84 459.65 151.42 448.56 curveto +151.78 446.47 149.69 447.70 149.76 444.74 curveto +150.05 442.80 147.89 443.59 146.09 444.60 curveto +145.15 445.18 146.59 439.78 145.37 439.56 curveto +142.34 438.84 136.87 438.19 135.22 440.71 curveto +134.57 444.60 137.88 448.06 140.62 451.01 curveto +143.14 455.83 140.90 465.70 140.47 476.28 curveto +138.89 478.22 lineto +134.86 483.19 139.61 496.94 136.51 506.23 curveto +120.02 514.87 122.11 519.19 118.73 537.62 curveto +115.13 557.64 93.38 567.65 79.06 567.65 curveto +73.44 563.04 66.24 563.62 58.54 567.65 curveto +55.66 569.23 54.43 573.19 54.50 576.50 curveto +52.63 580.75 55.22 582.19 59.62 583.49 curveto +62.71 587.81 68.62 594.65 69.19 597.74 curveto +70.34 601.92 75.53 608.11 77.76 609.77 curveto +75.82 613.01 74.81 615.17 77.11 618.55 curveto +79.56 620.14 81.79 616.61 84.38 618.55 curveto +closepath stroke +showpage +%%EOF diff --git a/doc/context/sources/general/manuals/metafun/hacker.png b/doc/context/sources/general/manuals/metafun/hacker.png Binary files differnew file mode 100644 index 000000000..3a54696ee --- /dev/null +++ b/doc/context/sources/general/manuals/metafun/hacker.png diff --git a/doc/context/sources/general/manuals/metafun/m-1.png b/doc/context/sources/general/manuals/metafun/m-1.png Binary files differnew file mode 100644 index 000000000..ab020de9f --- /dev/null +++ b/doc/context/sources/general/manuals/metafun/m-1.png diff --git a/doc/context/sources/general/manuals/metafun/m-2.png b/doc/context/sources/general/manuals/metafun/m-2.png Binary files differnew file mode 100644 index 000000000..512d3eda0 --- /dev/null +++ b/doc/context/sources/general/manuals/metafun/m-2.png diff --git a/doc/context/sources/general/manuals/metafun/metafun-backgrounds.tex b/doc/context/sources/general/manuals/metafun/metafun-backgrounds.tex new file mode 100644 index 000000000..200620cae --- /dev/null +++ b/doc/context/sources/general/manuals/metafun/metafun-backgrounds.tex @@ -0,0 +1,878 @@ +% language=uk +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\startcomponent metafun-backgrounds + +\environment metafun-environment + +\startchapter[reference=sec:page,title={Page backgrounds}] + +\startintro + +Especially in interactive documents, adding backgrounds to the page and text +areas not only enhances readability, but also makes it more convenient to +identify header, footers and navigational areas. In this chapter we will +demonstrate that with \METAPOST\ we can go beyond the \TEX\ based features +present in \CONTEXT. One section is dedicated to graphics and printing, +especially bleeding. + +\stopintro + +\startsection[title={The basic layout}] + +\index {layout} + +In the \CONTEXT\ manual you can find many details on the composition of the page. +When \TEX\ typesets text, crossing the page boundary triggers \TEX's output +routine. This routine is responsible for pasting the body text that goes onto a +page in the correct area. A simple representation of such a page is: + +\startbuffer[a] +\startuseMPgraphic{layout 1} + pickup pencircle scaled 1mm ; + fill unitsquare xyscaled (7cm,8cm) + withcolor .85white ; + fill unitsquare xyscaled (5cm,5cm) shifted (1cm,1.5cm) + withcolor .625yellow ; + fill unitsquare xyscaled (5cm,1cm) shifted (1cm,.5cm) + withcolor .625red ; + fill unitsquare xyscaled (5cm,1cm) shifted (1cm,6.5cm) + withcolor .625red ; + draw unitsquare xyscaled (5cm,7cm) shifted (1cm,.5cm) + withcolor .25white ; + drawarrow (2cm,8cm) -- top (2cm,7.5cm) ; + drawarrow (0cm,7cm) -- lft (1cm,7cm) ; + clip currentpicture to unitsquare xyscaled (7cm,8cm) ; +\stopuseMPgraphic +\stopbuffer + +\startbuffer[b] +\startuseMPgraphic{layout 2} + \includeMPgraphic{layout 1} + clip currentpicture to unitsquare scaled 3cm shifted (0,5cm) ; + currentpicture := currentpicture scaled 2 shifted (0,-8cm) ; + setbounds currentpicture to unitsquare xyscaled (6cm,8cm) ; +\stopuseMPgraphic +\stopbuffer + +\getbuffer[a,b] + +\startbuffer[c] +\startlinecorrection[blank] +\hbox + {\useMPgraphic{layout 1}\hskip1cm + \useMPgraphic{layout 2}} +\stoplinecorrection +\stopbuffer + +\getbuffer[c] + +The red areas are the header and footer, while the yellow areas contains the text +flow. We can turn headers on and off and|/|or hide them. For this reason, the +header, text and footer areas together make up the height of the text. + +A close look at the left picture will reveal that the two arrows point to the +center of the lines. This is achieved by the \type {top} and \type {lft} +directives. If we would not have clipped the picture, the arrow would have stuck +half a line width outside the gray area that represents the page. When +constructing such pictures, one should really pay attention to such details, +since it pays off in the overall look and feel of the document. + +The vertical arrow represents the top space, while the horizontal arrow denotes +the distance to the back of the cover (back space). By changing their values, you +can shift the main body text on the page. In a double sided layout scheme, the +back space is automatically mirrored on even pages. + +An advanced \METAPOST\ user may wonder why we hard code the dimensions, and avoid +\METAPOST's powerful mechanisms for defining relations. Our experience has taught +us that in pictures like this, providing a general solution seldom pays large +dividents or savings in time. + +\typebuffer[a] + +As you can see, the left graphic is defined as a series of rectangles. The \type +{xyscaled} macro is part of the \CONTEXT\ files, and saves some typing and space. +It is defined as a primary, requiring both left and right operands. + +\starttyping +primarydef p xyscaled q = + p xscaled (xpart q) yscaled (ypart q) +enddef ; +\stoptyping + +Zooming in on the top left corner only takes a few lines. First we clip the +correct part, next we scale it up, and finally we let the bounding box suit the +left picture. + +\typebuffer[b] + +This code demonstrates how you can reuse a graphic inside another one. This +strategy can easily be used to stepwise build (or extend) graphics. The two +graphics were put side by side with the following command. Watch the use of line +correction commands. They optimize the white space around the graphic. + +\typebuffer[c] + +As soon as you want to make an electronic document, you will want to use +different areas of the screen for different purposes: text, menus, buttons, etc. +For this reason, \CONTEXT\ provides not only left and right margins, but also +additional left and right edge areas and top and bottom margins. These areas are +shown in the figure on the next page. + +\startbuffer[aa] +pickup pencircle scaled 2pt ; + +numeric w[], h[], x[], y[], u ; u := .5cm ; + +numeric width ; width := \the\textwidth ; +numeric height ; height := \the\textheight ; +\stopbuffer + +\startbuffer[bb] +w[1] = 2u ; w[2] = 3u ; w[4] = 3u ; w[5] = 2u ; +h[1] = 1u ; h[2] = 1u ; h[4] = 1u ; h[5] = 1u ; + +w[1]+w[2]+w[3]+w[4]+w[5]+4u = width ; +h[1]+h[2]+h[3]+h[4]+h[5]+4u = height ; + +x[1] = 1u ; y[1] = 1u ; +x[2] = x[1] + w[1] + .5u ; y[2] = y[1] + h[1] + .5u ; +x[3] = x[2] + w[2] + .5u ; y[3] = y[2] + h[2] + .5u ; +x[4] = x[3] + w[3] + .5u ; y[4] = y[3] + h[3] + .5u ; +x[5] = x[4] + w[4] + .5u ; y[5] = y[4] + h[4] + .5u ; +\stopbuffer + +\startbuffer[cc] +def do_it (expr xx, yy, cc) = + draw unitsquare + xyscaled (w[xx],h[yy]) shifted (x[xx],y[yy]) + withcolor if cc : .625red else : .625yellow fi ; +enddef ; + +fill unitsquare xyscaled (width,height) withcolor .85white; + +do_it (1,1,false) ; do_it (5,1,false) ; +do_it (2,1,false) ; do_it (3,1,false) ; do_it (4,1,false) ; + +do_it (1,2,false) ; do_it (5,2,false) ; +do_it (2,2,true ) ; do_it (3,2,true ) ; do_it (4,2,true ) ; + +do_it (1,3,false) ; do_it (5,3,false) ; +do_it (2,3,true ) ; do_it (3,3,true ) ; do_it (4,3,true ) ; + +do_it (1,4,false) ; do_it (5,4,false) ; +do_it (2,4,true ) ; do_it (3,4,true ) ; do_it (4,4,true ) ; + +do_it (1,5,false) ; do_it (5,5,false) ; +do_it (2,5,false) ; do_it (3,5,false) ; do_it (4,5,false) ; +\stopbuffer + +\startbuffer[dd] +def do_it (expr yy, tt) = + path p ; + p := unitsquare xyscaled (w[1],h[yy]) shifted (x[1],y[yy]) ; + label.lft(tt, center p shifted (-w[1]/2-u-.25cm,0)) ; +enddef ; + +do_it (1,btex bottom etex) ; +do_it (2,btex footer etex) ; +do_it (3,btex text etex) ; +do_it (4,btex header etex) ; +do_it (5,btex top etex) ; +\stopbuffer + +\startbuffer[ee] +def do_it (expr xx, tt) = + path p ; + p := unitsquare xyscaled (w[xx],h[1]) shifted (x[xx],y[1]) ; + label(tt, center p shifted (0,height-h[1]/2)) ; +enddef ; + +do_it (1,btex edge etex) ; +do_it (2,btex margin etex) ; +do_it (3,btex text etex) ; +do_it (4,btex margin etex) ; +do_it (5,btex edge etex) ; +\stopbuffer + +\startbuffer[ff] +setbounds currentpicture to + unitsquare xyscaled (width,height) ; +\stopbuffer + +% We use two chars for buffer names, otherwise we can get +% get in conflict with the next buffers with similar names. + +\startpostponing +\centerbox{\processMPbuffer[aa,bb,cc,dd,ee,ff]} +\stoppostponing + +When defining this graphic, all areas have related dimensions. Here it makes +sense to let \METAPOST\ calculate these dimensions as much as possible. First we +define the five by five matrix of areas. We pass the width and height of the main +text area. Because they are stored in \TEX\ dimension registers, we have to +prefix them by \type {\the}. + +\typebuffer[aa] + +We now specify the lower left corners using \type {=} instead of the \type {:=}, +which means that \METAPOST\ will calculate \type {w[3]} and \type {h[3]} for us. + +\typebuffer[bb] + +Because we are going to repeat ourselves, we draw the areas using a macro. +Depending on its importance, we color it red or yellow. + +\typebuffer[cc] + +This picture in itself is not yet explanatory, so we add some labels. Again, we +use a macro, which we feed with a picture generated by \TEX. Since these pictures +are filtered from the source and pre||processed, we cannot embed the \type +{btex}||\type {etex} in the macro \type {do_it} and pass a string. It has to be +done this way. \footnote {This is true only in a regular \METAPOST\ run. In +\CONTEXT\ \MKIV\ we follow a different route.} + +\typebuffer[dd] + +In the horizontal direction we have edges, margins and text. There are left and +right edges and margins, which are swapped on even pages when you typeset a +double sided document. + +\typebuffer[ee] + +Since we want the graphic to match the dimensions of the text area of the current +page, we have to make sure that the bounding box is adapted accordingly. By this +action, the labels will fall outside the bounding box. When we directly embed a +graphic, this works ok, but when we start scaling and reusing, due to the object +reuse mechanism the graphic will be clipped to the bounding box. + +\typebuffer[ff] + +In the following sections we will demonstrate how you can put graphics behind +these 25~areas, as well as behind the (left and right) page. + +\stopsection + +\startsection[title={Setting up backgrounds}] + +\index {overlays} +\index {backgrounds} + +One way of protecting a document for unwanted usage is to put an annoying word in +the background. If you like this, you may try the following. The macro \type +{ysized} is part of the macros that come with \CONTEXT\ and scales a picture to a +specific size. + +\startbuffer[a] +\startuniqueMPgraphic{concept} + draw btex \colored[s=.8]{\bf CONCEPT} etex rotated 60 ; + currentpicture := currentpicture + ysized (\overlayheight-.5cm) ; +\stopuniqueMPgraphic + +\defineoverlay[concept][\uniqueMPgraphic{concept}] +\stopbuffer + +\typebuffer[a] + +You can now put this graphic in the page background by +saying: + +\starttyping +\setupbackgrounds[page][background=concept] +\stoptyping + +You may consider the next alternative a bit better, but still it renders the text +unreadable. Like \type {xysized}, the macro \type {enlarged} is not part of +standard \METAPOST, but comes with \CONTEXT. + +\startbuffer[b] +\startuniqueMPgraphic{copyright} + picture p ; p := btex \colored[s=.8]{COPYRIGHT} etex + rotated 90 ; + setbounds p to boundingbox p enlarged 1pt ; + draw p ; + currentpicture := currentpicture + xysized (\overlaywidth,\overlayheight) ; +\stopuniqueMPgraphic + +\defineoverlay[copyright][\uniqueMPgraphic{copyright}] +\stopbuffer + +\typebuffer[b] + +Again, we put this graphic in the background. By using a unique graphic, we make +sure that it's rendered only once and reused when possible. + +\startbuffer[c] +\setupbackgrounds[text][rightmargin][background=copyright] +\stopbuffer + +\typebuffer[c] + +\doifnotmode{screen}{\getbuffer[b,c]} + +In both cases, we slightly scale down the graphic. We do so because otherwise a +small portion of the text is clipped off. This is unrelated to \TEX\ or +\METAPOST, but a characteristic of the font. Compare the following Pagella, Latin +Modern and Termes gi's (the Pagella is the body font of this text). + +\startbuffer +\hbox \bgroup + \hbox{\definedfont[file:texgyrepagella-regular at 6cm]gi}% + \hbox{\definedfont[file:lmroman10-regular at 6cm]gi}% + \hbox{\definedfont[file:texgyretermes-regular at 6cm]gi}% +\egroup +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] +{\showboxes \getbuffer} +\stoplinecorrection + +Watch how the bounding boxes differ and sometimes cross the shape. So, in order +not to loose part of a glyph when clipping, you need to add a bit of space. \in +{Figure} [fig:annoying] shows the two backgrounds in action. + +\startbuffer +\getbuffer[a,b] +\def\ShowPage#1% % (yet) no image as background to image + {\framed % possible due to nested file problems + [background=#1,offset=overlay] + {\typesetfile[mfun-900.tex][page=1,width=.4\textwidth]}} +\startcombination + {\ShowPage{concept}} {concept} + {\ShowPage{copyright}} {copyright} +\stopcombination +\stopbuffer + +\placefigure + [here][fig:annoying] + {Two examples of annoying backgrounds.} + {\getbuffer} + +If you really want to add such texts to a document, in \CONTEXT\ we don't have to +use the page background, but can use one of the layout areas instead (like \type +{[text][text]} or \type {[text][leftmargin]}) + +\typebuffer[d] + +There is one drawback: when your left and right margin have different dimensions, +the text will be scaled differently on odd and even pages. Normally this is no +problem for a draft. + +As an alternative you can use the \type {\setuptexts} command and wrap the +graphic in a box with the right dimensions, using code like: + +\starttyping +\startuniqueMPgraphic{copyright} + picture p ; p := btex COPYRIGHT etex rotated 90 ; + setbounds p to boundingbox p enlarged 1pt ; + draw p withcolor .8white ; + xyscale_currentpicture(\the\leftmarginwidth,\the\textheight) ; +\stopuniqueMPgraphic + +\setuptexttexts [margin] [] [\uniqueMPgraphic{copyright}] +\stoptyping + +The graphic goes into the outer margin. The second argument can be used to put +something in the inner margin. + +\stopsection + +\startsection[title={Multiple overlays}] + +\index{overlays+stack} + +\setupbackgrounds[text][rightmargin][background=] + +You can stack overlays. Consider the next case, where we assume that you have +enabled interaction support using \type {\setupinteraction[state=start]}: + +\starttyping +\setupbackgrounds + [page] + [background={color,nextpage}, + backgroundcolor=darkyellow] +\stoptyping + +Here, the page gets a colored background and a hyperlink to the next page, +previously defined by: + +\starttyping +\defineoverlay[nextpage][\overlaybutton{nextpage}] +\stoptyping + +An \type {\overlaybutton} is just a button, with all attributes (color, frame, +etc) set to nothing, having the dimensions of the overlay. The argument is one of +the permitted destinations, like \type {nextpage}, \type {firstpage}, \type +{SearchDocument} and alike. + +For efficiency reasons, the background areas (like \type {[text][text]}) are +calculated only when their definition has changed. When a background changes per +page, we have to recalculate it on each page. In the next example, the macro +\type {\overlaybutton} generates a different button on each page. But, since we +don't explicitly set the background at each page, there is no way the background +drawing mechanism can know that this button has changed. Therefore, we must force +recalculation with: + +\starttyping +\setupbackgrounds[state=repeat] +\stoptyping + +You can test this concept yourself with the following code. Here we assume that +you have a file called \type {tufte.tex} on your system, which is the case if you +have \CONTEXT\ installed. However, you can just as easily use any file having a +paragraph of two of text. + +\starttyping +\starttext +\setupinteraction[state=start] +\setupbackgrounds[state=repeat] +\defineoverlay[nextpage][\overlaybutton{nextpage}] +\setupbackgrounds[text][text][background=nextpage] +\dorecurse{20}{\input tufte \par} +\stoptext +\stoptyping + +Note that you can move forward from page to page in the resulting \PDF\ file by +clicking on each page with the mouse. Now compile this file without setting the +background state to \type {repeat} and note the difference as you click pages +with the mouse. + +Setting the state was not needed when we used the page background: + +\starttyping +\setupbackgrounds[page][background=nextpage] +\stoptyping + +The \type {\dorecurse} macro is handy for testing since it saves us typing. One +can nest this macro as in: + +\starttyping +\dorecurse{20}{\dorecurse{10}{Hello World! }\par} +\stoptyping + +The current step is available in \type {\recurselevel} and the depth (nesting +level) in \type {\recursedepth}. + +\stopsection + +\startsection[title={Crossing borders}] + +\index{backgrounds} + +In many cases, the previously mentioned background areas will suffice, but in the +case of more complicated backgrounds, you may wish to use \METAPOST\ to draw +graphics that combine or span these areas. + +At runtime \CONTEXT\ saves information on the layout that can be picked up by +\METAPOST. The framework for a page graphic is: + +\starttyping +StartPage; + % all kind of commands +StopPage ; +\stoptyping + +Between the \type {StartPage} and \type {StopPage} command you have access to a +wide range of variables: + +\starttabulate[|l|Tp|] +\HL +\NC page \NC PaperHeight PaperWidth \NC \NR +\NC \NC PrintPaperHeight PrintPaperWidth \NC \NR +\NC \NC PageOffset PageDepth \NC \NR +\NC margins \NC TopSpace BackSpace \NC \NR +\NC text \NC MakeupHeight MakeupWidth \NC \NR +\NC vertical \NC TopHeight TopDistance \NC \NR +\NC \NC HeaderHeight HeaderDistance \NC \NR +\NC \NC TextHeight \NC \NR +\NC \NC FooterDistance FooterHeight \NC \NR +\NC \NC BottomDistance BottomHeight \NC \NR +\NC horizontal \NC LeftEdgeWidth LeftEdgeDistance \NC \NR +\NC \NC LeftMarginWidth LeftMarginDistance \NC \NR +\NC \NC TextWidth \NC \NR +\NC \NC RightMarginDistance RightMarginWidth \NC \NR +\NC \NC RightEdgeDistance RightEdgeWidth \NC \NR +\HL +\stoptabulate + +Since using these variables to construct paths is not that handy because the +areas are available as predefined paths, which we will demonstrate here. + +\placefigure + [here][fig:back 1] + {A background with combined areas.} + {\startcombination + {\typesetfile[mfun-900.tex][page=2,width=.4\textwidth]}{even} + {\typesetfile[mfun-900.tex][page=3,width=.4\textwidth]}{odd} + \stopcombination} + +In \in {figure} [fig:back 1] you see two pages (odd and even) with a background +spanning the outer margin and the text area. You can access an area in two ways. +The area itself is available as \type {Area}. + +\starttyping +StartPage ; + fill Area[Text][Text] withcolor .85white ; +StopPage ; +\stoptyping + +If you use an area this way, you will notice that it is not positioned at the +right place. An \type {Area} is just a rectangle. If you want a positioned area, +you should use the \type {Field} array: + +\starttyping +StartPage ; + fill Field[Text][Text] withcolor .85white ; +StopPage ; +\stoptyping + +The location of an area is available in \type {Location}, so the previous +definition is the same as: + +\starttyping +StartPage ; + fill Area[Text][Text] shifted Location[Text][Text] + withcolor .85white ; +StopPage ; +\stoptyping + +The following definition fills and draws the margin and text areas. + +\typebuffer[back-2] + +This background is assigned to the page layer by saying: + +\typebuffer[back-0] + +As you can see in \in {figure} [fig:back 2], the text is typeset rather tightly +between the left and right margins. + +\placefigure + [here][fig:back 2] + {A background with split areas.} + {\startcombination + {\typesetfile[mfun-900.tex][page=4,width=.4\textwidth]}{even} + {\typesetfile[mfun-900.tex][page=5,width=.4\textwidth]}{odd} + \stopcombination} + +This can easily be solved by enlarging the areas a bit. The next example +demonstrates this on the text area, which is shown in \in {figure} [fig:back 3]. + +\typebuffer[back-3] + +\placefigure + [here][fig:back 3] + {A background with enlarged text area.} + {\startcombination + {\typesetfile[mfun-900.tex][page=6,width=.4\textwidth]}{even} + {\typesetfile[mfun-900.tex][page=7,width=.4\textwidth]}{odd} + \stopcombination} + +The \type {enlarged} macro can be used like \type {shifted} and accepts either a +numeric or a pair. + +How do we define a background as in \in {figure} [fig:back 1]? Because \type +{Field} provides us the positioned areas, we can use the corners of those. + +\typebuffer[back-1] + +In this definition we calculate a different path for odd and even pages. When +done, we enlarge the path a bit. If you want to use different offsets in all +directions, you can use moved corner points. + +\typebuffer[back-4] + +Here we displace the corners randomly which leads to backgrounds like \in +{figure} [fig:back 4]. The following definition would have worked as well: + +\typebuffer[back-4x] + +\placefigure + [here][fig:back 4] + {A random text area.} + {\startcombination + {\typesetfile[mfun-900.tex][page=8,width=.4\textwidth]}{even} + {\typesetfile[mfun-900.tex][page=9,width=.4\textwidth]}{odd} + \stopcombination} + +The previous graphics are defined as usable ones, which means that they will be +recalculated each page. This is rather inefficient when the shapes don't change. +But, using a reusable graphic instead, would result in only one graphic for both +pages. Since the layout for the left and right page differs, another method is +needed. + +Instead of putting the same graphic on the page layer, we put two different ones +on the left and right page layer. + +\starttyping +\defineoverlay[left page] [\useMPgraphic{left page}] +\defineoverlay[right page][\useMPgraphic{right page}] + +\setupbackgrounds[leftpage] [background=left page] +\setupbackgrounds[rightpage][background=right page] +\stoptyping + +Now we only have to split the previously defined graphic into two parts. In order +to force consistency, we isolate the code that fills and draws. The left page +code looks like: + +\starttyping +\startreusableMPgraphic{left page} + StartPage ; + path Main ; Main := + llcorner Field[OuterMargin][Text] -- + lrcorner Field[Text] [Text] -- + urcorner Field[Text] [Text] -- + ulcorner Field[OuterMargin][Text] -- cycle ; + \includeMPgraphic{draw page} + StopPage ; +\stopreusableMPgraphic +\stoptyping + +The right page text looks similar: + +\starttyping +\startreusableMPgraphic{right page} + StartPage ; + path Main ; Main := + lrcorner Field[OuterMargin][Text] -- + llcorner Field[Text] [Text] -- + ulcorner Field[Text] [Text] -- + urcorner Field[OuterMargin][Text] -- cycle ; + \includeMPgraphic{draw page} + StopPage ; +\stopreusableMPgraphic +\stoptyping + +Watch how we used a reusable graphic first and a simple usable one next. +Actually, the next graphic is not a stand alone graphic. + +\starttyping +\startuseMPgraphic{draw page} + Main := Main enlarged 6pt ; + pickup pencircle scaled 2pt ; + fill Page withcolor .625white ; + fill Main withcolor .850white ; + draw Main withcolor .625red ; +\stopuseMPgraphic +\stoptyping + +We have seen some predefined paths and locations. Apart from the \type {Page} +path, they take two arguments that specify their position on the layout grid. + +\starttabulate[|lT|l|] +\HL +\NC path Area [][] \NC an area similar to a \CONTEXT\ one \NC \NR +\NC pair Location [][] \NC the position of this area \NC \NR +\NC path Field [][] \NC the area positioned at the right place \NC \NR +\NC path Page \NC the page itself \NC \NR +\HL +\stoptabulate + +Some less used and more obscure variables are the following. + +\starttabulate[|lT|l|] +\HL +\NC numeric Hstep [] \NC the horizontal distance to the previous area \NC \NR +\NC numeric Vstep [] \NC the vertical distance to the previous area \NC \NR +\NC numeric Hsize [] \NC the width of an area \NC \NR +\NC numeric Vsize [] \NC the height of an area \NC \NR +\HL +\stoptabulate + +The array variables are accessed by using constants: + +\starttabulate[|l|l|] +\HL +\NC horizontal \NC vertical \NC \NR +\HL +\NC LeftEdge \NC Top \NC \NR +\NC LeftEdgeSeparator \NC TopSeparator \NC \NR +\NC LeftMargin \NC Header \NC \NR +\NC LeftMarginSeparator \NC HeaderSeparator \NC \NR +\NC Text \NC Text \NC \NR +\NC RightMarginSeparator \NC FooterSeparator \NC \NR +\NC RightMargin \NC Footer \NC \NR +\NC RightEdgeSeparator \NC BottomSeparator \NC \NR +\NC RightEdge \NC Bottom \NC \NR +\HL +\stoptabulate + +In addition to these, there are \type {Margin}, \type {InnerMargin} and \type +{OuterMargin} which adapt themselves to the current odd or even page. The same is +true for \type {Edge}, \type {InnerEdge} and \type {OuterEdge}, although these +will seldom be used, since interactive documents are always single sided. + +We started this chapter with spending a lot of code to simulate the page areas. +It will be clear now that in practice this is much easier using the mechanism +described here. + +\placefigure + [here][fig:back 5] + {A quick way to draw all used areas.} + {\setupexternalfigures[background=color,backgroundcolor=white]% + \startcombination + {\typesetfile[mfun-900.tex][page=10,width=.4\textwidth]}{even} + {\typesetfile[mfun-900.tex][page=11,width=.4\textwidth]}{odd} + \stopcombination} + +In \in {figure} [fig:back 5] we see all used areas. Areas that are not used are +not drawn (which saves some testing). This background was defined as: + +\typebuffer[back-5] + +We use two nested \type {for} loops to step over the areas. A \type {for} loop +with a step of~1 will fail, because the indices are defined in a rather special +way. On the other hand, the mechanism is rather tolerant, in the sense that \type +{[i][j]} and \type {[j][i]} are both accepted. + +\stopsection + +\startsection[title={Bleeding}] + +\index {bleeding} + +If you want to share your document all over the world, it makes sense to use a +paper format like {\em letter} or {\em A4}. In that case, the layout often +matches the paper size. + +\startlinecorrection[blank] +\startMPcode + path p ; p := fullcircle xyscaled (21mm,29.7mm) ; + path q ; q := boundingbox p ; + fill q withcolor .625white ; + fill p withcolor .625yellow ; + currentpicture := currentpicture shifted (-31mm,0) ; + fill q withcolor .625white ; + fill p xsized (bbwidth(p)-2mm) withcolor .625yellow ; + currentpicture := currentpicture shifted (-31mm,0) ; + fill q withcolor .625white ; + fill p withcolor .625yellow ; + draw q enlarged -1mm withpen pencircle scaled 2mm withcolor .625white ; +\stopMPcode +\stoplinecorrection + +The left picture demonstrates what happens when you have a printer that is +capable of printing from edge to edge. If you have such a printer, you're lucky. +The middle picture demonstrates what happens if you have a properly set up +printing program and|/|or printer: the page is scaled down so that the content +fits into the non printable area of the printer. One reason why printers don't +print from edge to edge is that the engine is not that happy when toner or ink +ends up next to the page. The third picture shows what happens when a printer +simply ignores content that runs over the non printable area. In many cases it's +best to make sure that the content leaves a margin of 5mm from the edges. + +Books and magazines seldom use the popular desk||top paper sizes. Here the +designer determined the paper size and layout more or less independent from the +size of the sheet on which the result is printed. Instead of one page per sheet, +arrangements of 2 upto 32 or more pages per sheet are made. The process of +arranging pages in such a way that these sheets can be folded and combined into +books is called page imposition. \CONTEXT\ supports a wide range of page +imposition schemes. More information on this can be found in the \CONTEXT\ +manuals. + +The fact that the sheet on which a page is printed is larger than the page itself +opens the possibility to use the full page for content. In that case, especially +when you use background graphics, you need to make sure that indeed the page is +covered completely. Where in desk top printing you can get away with imperfection +simply because the printing engines have their limitations, in professional +output you need to be more considerate. + +\startlinecorrection[blank] +\startMPcode + path p ; p := fullsquare xyscaled (4cm,5cm) ; + path q ; q := fullsquare xyscaled (3cm,4cm) ; + path r ; r := fullsquare xyscaled (2cm,3cm) shifted (-.5cm,.5cm) ; + fill p withcolor .625white ; + fill q withcolor .850white ; + currentpicture := currentpicture shifted (-45mm,0) ; + fill p withcolor .625white ; + fill q withcolor .850white ; + fill r withcolor transparent(1,.5,.625yellow) ; + currentpicture := currentpicture shifted (-45mm,0) ; + fill p withcolor .625white ; + fill q withcolor .850white ; + r := r topenlarged 2mm leftenlarged 2mm ; + fill r withcolor transparent(1,.5,.625yellow) ; +\stopMPcode +\stoplinecorrection + +Slightly enlarging a graphic so that it exceeds the natural page limits is called +bleeding. Because quite often layout elements have a rectangular nature, +\METAFUN\ provides a couple of operations that can save you some work in defining +bleeding boxes. + +\startbuffer +path p, q ; +def ShowPath = + fill p withcolor transparent(1,.5,.625yellow) ; + fill q withcolor transparent(1,.5,.625yellow) ; + currentpicture := currentpicture shifted (-25mm,0) ; +enddef ; +p := q := fullsquare xyscaled (2cm,3cm) ; ShowPath ; +p := p leftenlarged 2mm ; ShowPath ; +p := p topenlarged 2mm ; ShowPath ; +p := p rightenlarged 2mm ; ShowPath ; +p := p bottomenlarged 2mm ; ShowPath ; +\stopbuffer + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +This graphic is generated as follows: + +\typebuffer + +The trick is in the last couple of lines. In addition to the general \type +{enlarged} operator, we have 4~operators that enlarge a rectangle in a certain +direction. This means that we can define the original path using dimensions +related to the layout, and add bleed strips independently. + +\startbuffer +path p ; p := fullsquare xyscaled (4cm,1cm) ; +path q ; q := p leftenlarged 2mm topenlarged 2mm ; +fill p withcolor transparent(1,.5,.625yellow) ; +fill q withcolor transparent(1,.5,.625yellow) ; +draw boundingbox currentpicture withcolor .625red ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +This example demonstrates that when we enlarge a graphic, the bounding box also +gets larger. Because this can interfere with the placement of such a graphic, we +need to make sure that the bleeding is there but not seen. + +\startbuffer +path p ; p := fullsquare xyscaled (4cm,1cm) ; +path q ; q := p leftenlarged 2mm topenlarged 2mm ; +fill p withcolor transparent(1,.5,.625yellow) ; +fill q withcolor transparent(1,.5,.625yellow) ; +setbounds currentpicture to p ; +draw boundingbox currentpicture withcolor .625red ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +There are two more operators: \type {innerenlarged} and \type {outerenlarged}. +These expand to either \type {leftenlarged} or \type {rightenlarged}, depending +on the page being left or right hand. + +\stopsection + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/metafun/metafun-backpage.tex b/doc/context/sources/general/manuals/metafun/metafun-backpage.tex new file mode 100644 index 000000000..82931d756 --- /dev/null +++ b/doc/context/sources/general/manuals/metafun/metafun-backpage.tex @@ -0,0 +1,53 @@ +% language=uk +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\doifmode{book}{\endinput} + +\startcomponent metafun-backpage + +\environment metafun-environment + +\startstandardmakeup[doublesided=no,page=right] + % back page +\stopstandardmakeup + +\setupbackgrounds + [leftpage] + [background=back page] + +\definecolor[twhite][s=1,t=.80,a=1] + +\setupbackgrounds + [text][text] + [background=color, + backgroundcolor=twhite, + backgroundoffset=.5cm] + +\setuplayout + [cutspace=2cm, + backspace=8cm, + header=0pt, + footer=0pt, + topspace=17cm, + bottomspace=2cm] + +\startstandardmakeup[doublesided=no,page=left,top=,bottom=] + + \switchtobodyfont[big] + + \setupinterlinespace[stretch=.5] + + \getbuffer[backtext] + + \blank + + \getbuffer[backbanner] + +\stopstandardmakeup + +\setupbackgrounds + [rightpage] + [background=] + +\stopcomponent diff --git a/doc/context/sources/general/manuals/metafun/metafun-basics.tex b/doc/context/sources/general/manuals/metafun/metafun-basics.tex new file mode 100644 index 000000000..df556e239 --- /dev/null +++ b/doc/context/sources/general/manuals/metafun/metafun-basics.tex @@ -0,0 +1,3587 @@ +% language=uk +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\startcomponent metafun-basics + +\environment metafun-environment + +\startchapter[title={A few more details}] + +\startintro + +In this chapter we will see how to define a \METAPOST\ graphic, and how to +include it in a document. Since the exact dimensions of graphics play an +important role in the placement of a graphic, we will explore the way a bounding +box is constructed. + +We will also pay attention to the usage of units and the side effects of scaling +and shifting, since they can contradict our expectations in unexpected ways. +Furthermore we will explore a few obscure areas. + +\stopintro + +\startsection[title={Making graphics}] + +\index{graphics} + +In this manual we will use \METAPOST\ in a rather straightforward way, and we +will try to avoid complicated math as much as possible. We will do a bit of +drawing, clipping, and moving around. Occasionally we will see some more +complicated manipulations. + +When defined as stand||alone graphic, a \METAPOST\ file looks like this: + +\starttyping +% Let's draw a circle. + +beginfig (7) ; + draw fullcircle scaled 3cm withpen pencircle scaled 1cm ; +endfig ; + +end . +\stoptyping + +The main structuring components in such a file are the \type {beginfig} and \type +{endfig} macros. Like in a big story, the file has many sub||sentences, where +each sub||sentence ends with a semi||colon. Although the \type {end} command at +the end of the file concludes the story, putting a period there is a finishing +touch. Actually, after the \type {end} command you can put whatever text you +wish, your comments, your grocery list, whatever. Comments in \METAPOST, prefixed +by a percent sign, as in \typ {% Let's draw a circle}, are ignored by the +interpreter, but useful reminders for the programmer. + +If the file is saved as \type {yourfile.mp}, then the file is processed by +\METAPOST\ by issuing the following command: + +\starttyping +mpost yourfile +\stoptyping + +after which you will have a graphic called \type {yourfile.7}, which contains a +series of \POSTSCRIPT\ commands. Because \METAPOST\ does all the work, this file +is efficient and compact. The number of distinct \POSTSCRIPT\ operators used is +limited, which has the advantage that we can postprocess this file rather easily. +Alternatively \METAPOST\ can generate \SVG\ output. It does when you say + +\starttyping +outputformat := "svg" ; +\stoptyping + +Here we will not go into details about this format. Even \POSTSCRIPT\ is not +covered in detail as we use \METAPOST\ mostly in embedded form. + +We can view this file in a \POSTSCRIPT\ viewer like \GHOSTVIEW\ or convert the +graphic to \PDF\ (using \type {mptopdf}) and view the result in a suitable \PDF\ +viewer like \ACROBAT. Of course, you can embed such a file in a \CONTEXT\ +document, using a command like: + +\starttyping +\externalfigure[yourfile.7] +\stoptyping + +We will go in more detail about embedding graphics in \in {chapter} +[sec:embedding]. + +If you have installed \CONTEXT, somewhere on your system there resides a file +\type {mp-tool.mp}. If you make a stand||alone graphic, it's best to put the +following line at the top of your file: + +\starttyping +input mp-tool ; % or input metafun ; +\stoptyping + +By loading this file, the resulting graphic will provide a high resolution +bounding box, which enables more accurate placement. The file also sets the \typ +{prologues := 1} so that viewers like \GHOSTVIEW\ can refresh the file when it is +changed. + +Next we will introduce some more \METAPOST\ commands. From now on, we will omit +the encapsulating \type {beginfig} and \type {endfig} macros. If you want to +process these examples yourself, you should add those commands yourself, or if +you use \CONTEXT\ you don't need them at all. + +\startbuffer +pickup pencircle scaled .5cm ; +draw unitsquare xscaled 8cm yscaled 1cm withcolor .625white ; +draw origin withcolor .625yellow ; +pickup pencircle scaled 1pt ; +draw bbox currentpicture withcolor .625red ; +\stopbuffer + +\typebuffer + +In this example we see a mixture of so called primitives as well as macros. A +primitive is something hard coded, a built||in command, while a macro is a +collection of such primitives, packaged in a way that they can be recalled +easily. Where \type {scaled} is a primitive and \type {draw} a macro, \type +{unitsquare} is a path variable, an abbreviation for: + +\starttyping +unitsquare = (0,0) -- (1,0) -- (1,1) -- (0,1) -- cycle ; +\stoptyping + +The double dash (\type {--}) is also a macro, used to connect two points with a +straight line segment. However, \type {cycle} is a primitive, which connects the +last point of the unitsquare to the first on unitsquare's path. Path variables +must first be declared, as in: + +\starttyping +path unitsquare ; +\stoptyping + +A large collection of such macros is available when you launch \METAPOST. Consult +the \METAPOST\ manual for details. + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +In the first line of our example, we set the drawing pen to \type {.5cm}. You can +also specify such a dimension in other units, like points (\type {pt}). When no +unit is provided, \METAPOST\ will use a big point (\type {bp}) , the \POSTSCRIPT\ +approximation of a point. + +The second line does just as it says: it draws a rectangle of certain dimensions +in a certain color. In the third line we draw a colored dot at the origin of the +coordinate system in which we are drawing. Finally, we set up a smaller pen and +draw the bounding box of the current picture, using the variable \type +{currentpicture}. Normally, all drawn shapes end up in this picture variable. + +\stopsection + +\startsection[title={Bounding boxes}] + +\index{boundingbox} + +If you take a close look at the last picture in the previous section, you will +notice that the bounding box is larger than the picture. This is one of the nasty +side effects of \METAPOST's \type {bbox} macro. This macro draws a box, but with +a certain offset. The next example shows how we can manipulate this offset. +Personally I never use the \type {bbox} macro because this offset is rather +annoying. Also, the \type {boundingbox} operator combined with \type {enlarged} +can provide any offset you want. + +\startbuffer +pickup pencircle scaled .5cm ; +draw unitsquare xscaled 8cm yscaled 1cm withcolor .625white ; +path bb ; bboxmargin := 0pt ; bb := bbox currentpicture ; +draw bb withpen pencircle scaled 1pt withcolor .625red ; +draw origin withpen pencircle scaled 5pt withcolor .625yellow ; +\stopbuffer + +\typebuffer + +In the third line we define a path variable. We assign the current bounding box +to this variable, but first we set the offset to zero. The last line demonstrates +how to draw such a path. Instead of setting the pen as we did in the first line, +we pass the dimensions directly. + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +Where \type {draw} draws a path, the \type {fill} macro fills one. In order to be +filled, a path should be closed, which is accomplished by the \type {cycle} +primitive, as we saw in constructing the \type {unitsquare} path. + +\startbuffer +pickup pencircle scaled .5cm ; +fill unitsquare xscaled 8cm yscaled 1cm withcolor .625white ; +path bb ; bboxmargin := 0pt ; bb := bbox currentpicture ; +draw bb withpen pencircle scaled 1pt withcolor .625red ; +draw origin withpen pencircle scaled 5pt withcolor .625yellow ; +\stopbuffer + +\typebuffer + +This example demonstrates that when we fill the path, the resulting graphic is +smaller. Where \type {draw} follows the center of a path, \type {fill} stays +inside the path. + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +A third alternative is the \type {filldraw} macro. From the previous examples, we +would expect a bounding box that matches the one of the drawn path. + +\startbuffer +pickup pencircle scaled .5cm ; +filldraw unitsquare xscaled 8cm yscaled 1cm withcolor .625white ; +path bb ; bboxmargin := 0pt ; bb := bbox currentpicture ; +draw bb withpen pencircle scaled 1pt withcolor .625red ; +draw origin withpen pencircle scaled 5pt withcolor .625yellow ; +\stopbuffer + +\typebuffer + +% The resulting graphic has the bounding box of the fill. Note +% how the path, because it is stroked with a .5cm pen, extends +% beyond the border of the bounding box. The way this image +% shows up depends on the viewer (settings) you use to render +% the graphic. For example, in \GHOSTVIEW, if you disable +% clipping to the bounding box, only the positive quadrant of +% the graphic is shown. Further, if you enable clipping to the +% bounding box, this image will look exactly like the previous +% image created with the fill command. In many cases, it may +% be best to avoid the \type {filldraw} command. + +The resulting graphic has the bounding box of the fill. Note how the path, +because it is stroked with a .5cm pen, extends beyond the border of the previous +bounding box. The way this image shows up depends on the viewer (settings) you +use to render the graphic. For example, in \GHOSTVIEW, if you disable clipping to +the bounding box, only the positive quadrant of the graphic is shown. \footnote +{Old versions of \METAPOST\ calculated the boundingbox differently for a \type +{filldraw}: through the middle of the penpath.} + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +From the previous examples, you can conclude that the following alternative +results in a proper bounding box: + +\startbuffer +pickup pencircle scaled .5cm ; +path p ; p := unitsquare xscaled 8cm yscaled 1cm ; +fill p withcolor .625white ; +draw p withcolor .625white ; +path bb ; bboxmargin := 0pt ; bb := bbox currentpicture ; +draw bb withpen pencircle scaled 1pt withcolor .625red ; +draw origin withpen pencircle scaled 5pt withcolor .625yellow ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +The \CONTEXT\ distribution comes with a set of \METAPOST\ modules, one of which +contains the \type {drawfill} macro, which provides the outer bounding box. +\footnote {Starting from version 1.0 \METAPOST\ calculates the boundingbox +differently and the distinction between \type {drawfill} and \type {filldraw} is +gone. We keep them around both for compatibility.} Next we demonstrate its use in +another, more complicated example. + +\startbuffer +picture finalpicture ; finalpicture := nullpicture ; +numeric n ; n := 0 ; bboxmargin := 0pt ; +pickup pencircle scaled .5cm ; + +def shape = + unitsquare scaled 2cm withcolor .625white ; + draw bbox currentpicture + withpen pencircle scaled .5mm withcolor .625red ; + addto finalpicture also currentpicture shifted(n*3cm,0) ; + currentpicture := nullpicture ; n := n+1 ; +enddef ; + +fill shape ; draw shape ; filldraw shape ; drawfill shape ; + +currentpicture := finalpicture ; +\stopbuffer + +\typebuffer + +Here we introduce a macro definition, \type {shape}. In \METAPOST, the start of a +macro definition is indicated with the keyword \type {def}. Thereafter, you can +insert other variables and commands, even other macro definitions. The keyword +\type {enddef} signals the end of the macro definition. The result is shown in +\in {figure} [fig:draws and fills]; watch the bounding boxes. Close reading of +the macro will reveal that the \type {fill}, \type {draw}, \type {filldraw} and +\type {drawfill} macros are applied to the first \type {unitsquare} path in the +macro. + +\placefigure + [here] + [fig:draws and fills] + {A \type {fill}, \type {draw}, \type {filldraw} and \type + {drawfill} applied to the same square.} + {\processMPbuffer} + +In this macro, \type {bbox} calls a macro that returns the enlarged bounding box +of a path. By setting \type {bboxmargin} we can influence how much the bounding +box is enlarged. Since this is an existing variable, we don't have to allocate +it, like we do with~\type{numeric n}. Unless you take special precautions, +variables are global by nature and persistent outside macros. + +\starttyping +picture finalpicture ; finalpicture := nullpicture ; +\stoptyping + +Just as \type {numeric} allocates an integer variable, the \type {picture} +primitive allocates a picture data structure. We explicitly have to set this +picture to nothing using the built||in primitive \type {nullpicture}. + +Later on, we will add the drawn paths as accumulated in \type {currentpicture} to +this \type {finalpicture} in the following manner. + +\starttyping +addto finalpicture also currentpicture shifted(n*3cm,0) ; +\stoptyping + +Since we want to add a few more and don't want them to overlap, we shift them. +Therefore we have to erase the current picture as well as increment the shift +counter. + +\starttyping +currentpicture := nullpicture ; n := n+1 ; +\stoptyping + +The \type {drawfill} macro is one of the \METAFUN\ macros. Another handy macro is +\type {boundingbox}. When used instead of \type {bbox}, you don't have to set the +margin to zero. + +\startbuffer +drawoptions (withcolor .625white) ; +path p ; p := unitsquare scaled 2cm ; +fill p shifted (3cm,0) ; +pickup pencircle scaled .5cm ; fill p shifted (6cm,0) ; +fill p shifted (9cm,0) withpen pencircle scaled .5cm ; +\stopbuffer + +\placefigure + [here] + [fig:more draws and fills] + {The influence of pens on \type {fill}.} + {\processMPbuffer} + +There is a subtle point in filling a shape. In \in {figure} [fig:more draws and +fills] you see the influence of the pen on a \type {fill} operation. An indirect +specification has no influence, and results in a filled rectangle with sharp +corners. The third rectangle is drawn with a direct pen specification which +results in a larger shape with rounds corners. However, the bounding box is the +same in all three cases. The graphic is defined as follows. This time we don't +use a (complicated) macro. + +\typebuffer + +When a graphic is constructed, its components end up in an internal data +structure in a more or less layered way. This means that as long as a graphic is +not flushed, you may consider it to be a stack of paths and texts with the paths +being drawn or filled shapes or acting as clipping paths or bounding boxes. + +When you ask for the dimensions of a graphic the lower left and upper right +corner are calculated using this stack. Because you can explicitly set bounding +boxes, you can lie about the dimensions of a graphic. This is a very useful +feature. In the rare case that you want to know the truth and nothing but the +truth, you can tweak the \type {truecorners} numeric variable. We will +demonstrate this with a few examples. + +\startbuffer +fill fullcircle scaled 1cm withcolor .625yellow ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank]\ruledhbox{\processMPbuffer}\stoplinecorrection + +\startbuffer +fill fullcircle scaled 1cm withcolor .625yellow ; +setbounds currentpicture to boundingbox currentpicture enlarged 2mm ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank]\ruledhbox{\processMPbuffer}\stoplinecorrection + +\startbuffer +fill fullcircle scaled 1cm withcolor .625yellow ; +setbounds currentpicture to boundingbox currentpicture enlarged 2mm ; +interim truecorners := 1 ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank]\ruledhbox{\processMPbuffer}\stoplinecorrection + +\startbuffer +fill fullcircle scaled 1cm withcolor .625yellow ; +interim truecorners := 1 ; +setbounds currentpicture to boundingbox currentpicture enlarged 2mm ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank]\ruledhbox{\processMPbuffer}\stoplinecorrection + +As you can see here, as soon as we set \type {truecorners} to~1, the bounding box +settings are ignored. \footnote {Normally you will use grouping to keep the +interim local. In \METAFUN\ each figure restores this variable at the beginning.} + +There are two related macros: \type {bbwidth} and \type {bbheight} that you can +apply to a path. + +\startbuffer +fill unitcircle xscaled 4cm yscaled 2cm + withpen pencircle scaled 1mm withcolor .625red ; +draw origin -- (bbwidth(currentpicture),0) + withpen pencircle scaled 1mm withcolor .625yellow ; +draw origin -- (0,bbheight(currentpicture)) + withpen pencircle scaled 1mm withcolor .625white ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank]\processMPbuffer\stoplinecorrection + +\stopsection + +Yet another helper is \type {boundingcircle}. Its effect can best be demonstrated with +a few examples: + +\startbuffer[a] +path p ; p := fullsquare scaled 2cm ; + +draw p withpen pencircle scaled 3mm withcolor .625white ; +draw center p withpen pencircle scaled 3mm withcolor .625white ; +draw boundingbox p withpen pencircle scaled 1mm withcolor .625red ; +draw boundingcircle p withpen pencircle scaled 1mm withcolor .625yellow ; +\stopbuffer + +\startbuffer[b] +path p ; p := fullcircle scaled 2cm ; + +draw p withpen pencircle scaled 3mm withcolor .625white ; +draw center p withpen pencircle scaled 3mm withcolor .625white ; +draw boundingbox p withpen pencircle scaled 1mm withcolor .625red ; +draw boundingcircle p withpen pencircle scaled 1mm withcolor .625yellow ; +\stopbuffer + +\startbuffer[c] +path p ; p := fulltriangle scaled 2cm ; + +draw p withpen pencircle scaled 3mm withcolor .625white ; +draw center p withpen pencircle scaled 3mm withcolor .625white ; +draw boundingbox p withpen pencircle scaled 1mm withcolor .625red ; +draw boundingcircle p withpen pencircle scaled 1mm withcolor .625yellow ; +\stopbuffer + +\typebuffer[a,b,c] + +You can consider the \type {boundingcircle} to be a round boundingbox. + +\startlinecorrection +\startcombination[nx=3,ny=1,location=middle] + {\processMPbuffer[a]} {square} + {\processMPbuffer[b]} {circle} + {\processMPbuffer[c]} {triangle} +\stopcombination +\stoplinecorrection + +\startsection[title={Units}] + +\index{units} + +Like \TEX, \METAPOST\ supports multiple units of length. In \TEX, these units are +hard coded and handled by the parser, where the internal unit of length is the +scaled point (\type {sp}), something on the nanometer range. Because \METAPOST\ +is focused on \POSTSCRIPT\ output, its internal unit is the big point (\type +{bp}). All other units are derived from this unit and available as numeric +instead of hard coded. + +\starttyping +mm = 2.83464 ; pt = 0.99626 ; dd = 1.06601 ; bp := 1 ; +cm = 28.34645 ; pc = 11.95517 ; cc = 12.79213 ; in := 72 ; +\stoptyping + +Careful reading reveals that only the \type {bp} and \type {in} are fixed, while +the rest of the dimensions are scalar multiples of \type {bp}. + +Since we are dealing with graphics, the most commonly used dimensions are \type +{pt}, \type {bp}, \type {mm}, \type {cm} and~\type {in}. + +\startuseMPgraphic{pt} + fill fullsquare scaled 72.27pt withcolor .625yellow ; + fill fullcircle scaled 72.27pt withcolor white ; + label("72.27pt", center currentpicture) ; +\stopuseMPgraphic +\startuseMPgraphic{bp} + fill fullsquare scaled 72bp withcolor .625yellow ; + fill fullcircle scaled 72bp withcolor white ; + label("72bp", center currentpicture) ; +\stopuseMPgraphic +\startuseMPgraphic{mm} + fill fullsquare scaled 25.4mm withcolor .625yellow ; + fill fullcircle scaled 25.4mm withcolor white ; + label("25.4mm", center currentpicture) ; +\stopuseMPgraphic +\startuseMPgraphic{cm} + fill fullsquare scaled 2.54cm withcolor .625yellow ; + fill fullcircle scaled 2.54cm withcolor white ; + label("2.54cm", center currentpicture) ; +\stopuseMPgraphic +\startuseMPgraphic{in} + fill fullsquare scaled 1in withcolor .625yellow ; + fill fullcircle scaled 1in withcolor white ; + label("1in", center currentpicture) ; +\stopuseMPgraphic + +\startlinecorrection[blank] +\hbox to \hsize + {\useMPgraphic{pt}\hss + \useMPgraphic{bp}\hss + \useMPgraphic{mm}\hss + \useMPgraphic{cm}\hss + \useMPgraphic{in}} +\stoplinecorrection + +The text in the center of the leftmost graphic is typeset by \METAPOST\ as a +label. + +\starttyping +fill fullsquare scaled 72.27pt withcolor .625yellow ; +fill fullcircle scaled 72.27pt withcolor white ; +label("72.27pt", center currentpicture) ; +\stoptyping + +In \METAPOST\ the following lines are identical: + +\starttyping +draw fullcircle scaled 100 ; +draw fullcircle scaled 100bp ; +\stoptyping + +You might be tempted to omit the unit, but this can be confusing, particularly if +you also program in a language like \METAFONT, where the \type {pt} is the base +unit. This means that a circle scaled to 100 in \METAPOST\ is not the same as a +circle scaled to 100 in \METAFONT. Consider the next definition: + +\startbuffer +pickup pencircle scaled 0 ; +fill unitsquare + xscaled 400pt yscaled -.5cm withcolor .625red ; +fill unitsquare + xscaled 400bp yscaled +.5cm withcolor .625yellow ; +drawoptions(withcolor white) ; +label.rt("400 pt", origin shifted (0, -.25cm)) ; +label.rt("400 bp", origin shifted (0, +.25cm)) ; +\stopbuffer + +\typebuffer + +When processed, the difference between a \type {pt} and \type {bp} shows rather +well. Watch how we use \type {.rt} to move the label to the right; you can +compare this with \TEX's macro \type {\rlap}. You might want to experiment with +\type {.lft}, \type {.top}, \type {.bot}, \type {.ulft}, \type {.urt}, \type +{.llft} and \type {.lrt}. + +The difference between both bars is exactly \scratchdimen = 400 bp +\advance\scratchdimen by -400 pt \the \scratchdimen \space (as calculated by +\TEX). + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +Where \TEX\ is anchored in tradition, and therefore more or less uses the \type +{pt} as the default unit, \METAPOST, much like \POSTSCRIPT, has its roots in the +computer sciences. There, to simplify calculations, an inch is divided in 72 big +points, and .72pt is sacrificed. + +When you consider that \POSTSCRIPT\ is a high end graphic programming language, +you may wonder why this sacrifice was made. Although the difference between \type +{1bp} and \type {1pt} is miniscule, this difference is the source of much +(unknown) confusion. When \TEX\ users talk about a \type {10pt} font, a desktop +publisher hears \type {10bp}. In a similar vein, when we define a papersize +having a width of \type {600pt} and a height of \type {450pt}, which is papersize +\type {S6} in \CONTEXT, a \POSTSCRIPT\ or \PDF\ viewer will report slightly +smaller values as page dimensions. This is because those programs claim the \type +{pt} to be a \type {bp}. [This confusion can lead to interesting discussions with +desktop publishers when they have to use \TEX. They often think that their demand +of a baseline distance of \type {13.4} is met when we set it to \type {13.4pt}, +while actually they were thinking of \type {13.4bp}, which of course in other +programs is specified using a \type {pt} suffix.] + +Therefore, when embedding graphics in \CONTEXT, we strongly recommend that you +use \type {pt} as the base unit instead. The main reason why we spend so many +words on this issue is that, when neglected, large graphics may look inaccurate. +Actually, when taken care of, it is one of the (many) reasons why \TEX\ documents +always look so accurate. Given that the eye is sensitive to distortions of far +less than \type {1pt}, you can be puzzled by the fact that many drawing programs +only provide a bounding box in rounded units. Thereby, they round to the next +position, to prevent unwanted cropping. For some reason this low resolution has +made it into the high end \POSTSCRIPT\ standard. + +In \CONTEXT\ we try to deal with these issues as well as possible. + +\stopsection + +\startsection[title={Scaling and shifting}] + +\index{scaling} +\index{shifting} + +When we draw a shape, \METAPOST\ will adapt the bounding box accordingly. This +means that a graphic has its natural dimensions, unless of course we adapt the +bounding box manually. When you limit your graphic to a simple shape, say a +rectangle, shifting it to some place can get obscured by this fact. Therefore, +the following series of shapes appear to be the same. + +\startbuffer +draw + unitsquare xscaled 6cm yscaled 1.5cm + withpen pencircle scaled 2mm withcolor .625red ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank]\processMPbuffer\stoplinecorrection + +\startbuffer +draw + unitsquare shifted (.5,.5) xscaled 6cm yscaled 1.5cm + withpen pencircle scaled 2mm withcolor .625red ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank]\processMPbuffer\stoplinecorrection + +\startbuffer +draw + unitsquare shifted (-.5,-.5) xscaled 6cm yscaled 1.5cm + withpen pencircle scaled 2mm withcolor .625red ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank]\processMPbuffer\stoplinecorrection + +\startbuffer +draw + unitsquare xscaled 6cm yscaled 1.5cm shifted (1cm,1cm) + withpen pencircle scaled 2mm withcolor .625red ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank]\processMPbuffer\stoplinecorrection + +\startbuffer +draw + unitsquare xscaled 6cm yscaled 1.5cm shifted (1.5cm,1cm) + withpen pencircle scaled 2mm withcolor .625red ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank]\processMPbuffer\stoplinecorrection + +However, when we combine such graphics into one, we will see in what respect the +scaling and shifting actually takes place. + +\startbuffer +draw + unitsquare xscaled 6cm yscaled 2cm + withpen pencircle scaled 3.0mm withcolor .625yellow ; +draw + unitsquare shifted (.5,.5) xscaled 6cm yscaled 2cm + withpen pencircle scaled 3.0mm withcolor .625red ; +draw + unitsquare xscaled 6cm yscaled 2cm shifted (1cm,1cm) + withpen pencircle scaled 3.0mm withcolor .625white ; +draw + unitsquare xscaled 6cm yscaled 2cm shifted (1.5cm,1cm) + withpen pencircle scaled 1.5mm withcolor white ; +draw + unitsquare shifted (-.5,-.5) xscaled 6cm yscaled 2cm + withpen pencircle scaled 1mm withcolor black ; +draw origin withpen pencircle scaled 1mm ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank]\processMPbuffer\stoplinecorrection + +As you can see, the transformations are applied in series. Sometimes this is not +what we want, in which case we can use parentheses to force the desired +behaviour. The lesson learned is that {\em scaling and shifting} is not always +the same as {\em shifting and scaling}. + +\startbuffer +draw + origin -- origin shifted ((4cm,0cm) shifted (4cm,0cm)) + withpen pencircle scaled 1cm withcolor .625white ; +draw + origin -- origin shifted (4cm,0cm) shifted (4cm,0cm) + withpen pencircle scaled 8mm withcolor .625yellow ; +draw + (origin -- origin shifted (4cm,0cm)) shifted (4cm,0cm) + withpen pencircle scaled 6mm withcolor .625red ; +draw + origin -- (origin shifted (4cm,0cm) shifted (4cm,0cm)) + withpen pencircle scaled 4mm withcolor white ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank]\processMPbuffer\stoplinecorrection + +Especially when a path results from a call to a macro, using parentheses around a +path may help, as in the following example. + +\startbuffer +def unitslant = origin -- origin shifted (1,1) enddef ; +draw + unitslant xscaled 5cm yscaled 1cm + withpen pencircle scaled 1cm withcolor .625red ; +draw + (unitslant) xscaled 5cm yscaled 1cm + withpen pencircle scaled 5mm withcolor .625yellow ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank]\processMPbuffer\stoplinecorrection + +The next definition of \type {unitslant} is therefore better. + +\startbuffer +def unitslant = (origin -- origin shifted (1,1)) enddef ; +draw + unitslant xscaled 5cm yscaled 1cm + withpen pencircle scaled 5mm withcolor .625red ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank]\processMPbuffer\stoplinecorrection + +An even better alternative is: + +\startbuffer +path unitslant ; unitslant = origin -- origin shifted (1,1) ; +draw + unitslant xscaled 5cm yscaled 1cm + withpen pencircle scaled 5mm withcolor .625yellow ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +\stopsection + +\startsection[title={Curve construction}] + +\index{curves} + +\doifmodeelse{screen} + {\def\Xcom{3}\def\Ycom{2}\def\Zcom{\the\textheight}} + {\def\Xcom{2}\def\Ycom{3}\def\Zcom{\the\textwidth }} + +Chapter 3 of the \METAFONT\ book explains the mathematics behind the construction +of curves. Both \METAFONT\ and \METAPOST\ implement B\'ezier curves. The fact +that these curves are named after Pierre B\'ezier obscures the fact that the math +behind them originates with Serge\u{\i} Bernshte\u{\i}n. + +The points on the curve are determined by the following formula: + +\placeformula[-] +\startformula +z(t) = (1-t)^3 z_1 + 3 (1-t)^2 t z_2 + 3 (1-t) t^2 z_3 + t^3 z_4 +\stopformula + +Here, the parameter $t$ runs from $[0,1]$. As you can see, we are dealing with +four points. In practice this means that when we construct a curve from multiple +points, we act on two points and the two control points in between. So, the +segment that goes from $z_1$ to $z_4$ is calculated using these two points and +the points that \METAFONT|/|\METAPOST\ calls post control point and pre control +point. + +\startbuffer[a] +vardef dodrawmidpoints (expr a, b, c, d, n, col, m) = + save e, f, g, h, i, j ; pair e, f, g, h, i, j ; + e := .5[a,b] ; f := .5[b,c] ; g := .5[c,d] ; + h := .5[e,f] ; i := .5[f,g] ; j := .5[h,i] ; + if m= 0 : drawpoints j elseif + m= 1 : draw a--b--c--d elseif + m= 2 : draw e--f--g elseif + m= 3 : draw h--i elseif + m= 4 : draw a--e--h--j elseif + m= 5 : draw j--i--g--d elseif + m=11 : drawpoints a--b--c--d elseif + m=12 : drawpoints e--f--g elseif + m=13 : drawpoints h--i elseif + m=14 : drawpoints a--e--h--j elseif + m=15 : drawpoints j--i--g--d fi withcolor col ; + if n>1 : + dodrawmidpoints(a, e, h, j, n-1, col, m) ; + dodrawmidpoints(j, i, g, d, n-1, col, m) ; + fi ; +enddef ; + +vardef drawmidpoints (expr p, n, col, m) = + save a, b, c, d ; pair a, b, c, d ; + for x=0 upto length(p)-1 : + a := point x of p ; b := postcontrol x of p ; + d := point x+1 of p ; c := precontrol x+1 of p ; + dodrawmidpoints(a,b,c,d,n,col,m) ; + endfor ; +enddef ; +\stopbuffer + +\startbuffer[b] +path p ; p := (4cm,4cm)..(6cm,0cm)..(1cm,2cm) ; +\stopbuffer + +\startbuffer[c] +drawpath p ; +drawcontrollines p withcolor .625yellow ; +drawcontrolpoints p withcolor .625red ; +drawpoints p withcolor .625red ; +freelabel(btex $z_1$ etex, point 0 of p, center p) ; +freelabel(btex $z_2$ etex, postcontrol 0 of p, center p) ; +freelabel(btex $z_3$ etex, precontrol 1 of p, center p) ; +freelabel(btex $z_4$ etex, point 1 of p, center p) ; +freelabel(btex $z_5$ etex, postcontrol 1 of p, center p) ; +freelabel(btex $z_6$ etex, precontrol 2 of p, center p) ; +freelabel(btex $z_7$ etex, point 2 of p, center p) ; +\stopbuffer + +\startbuffer[x] +draw boundingbox p enlarged 1cm ; +setbounds currentpicture to boundingbox p enlarged 1cm ; +currentpicture := currentpicture xsized (.45*\Zcom) ; +\stopbuffer + +\startlinecorrection[blank] +\processMPbuffer[a,b,c,x] +\stoplinecorrection + +The previous curve is constructed from the three points $z_1$, $z_4$ and $z_7$. +The curve is drawn in \METAPOST\ by \type {z1..z4..z7} and is made up out of two +segments. The first segment is determined by the following points: + +\startitemize[packed,n] +\item point $z_1$ of the curve +\item the postcontrol point $z_2$ of $z_1$ +\item the precontrol point $z_3$ of $z_4$ +\item point $z_4$ of the curve +\stopitemize + +On the next pages we will see how the whole curve is constructed from these +quadruples of points. The process comes down to connecting the mid points of the +straight lines to the points mentioned. We do this three times, which is why +these curves are classified as third order approximations. + +The first series of graphics demonstrates the process of determining the mid +points. The third order midpoint is positioned on the final curve. The second +series focuses on the results: new sets of four points that will be used in a +next stage. The last series only shows the third order midpoints. As you can see, +after some six iterations we have already reached a rather good fit of the final +curve. The exact number of iterations depends on the resolution needed. You will +notice that the construction speed (density) differs per segment. + +\startpostponing + +% cc .. hh in order to avoid conflicts with c-... + +\startbuffer[cc] +drawpath p ; drawpoints p ; drawcontrolpoints p ; +\stopbuffer + +\startbuffer[dd] +drawmidpoints(p,1,.625red, 11) ; drawmidpoints(p,1,.625yellow, 1) ; +\stopbuffer + +\startbuffer[ee] +drawmidpoints(p,1,.625red, 12) ; drawmidpoints(p,1,.625yellow, 2) ; +\stopbuffer + +\startbuffer[ff] +drawmidpoints(p,1,.625red, 13) ; drawmidpoints(p,1,.625yellow, 3) ; +\stopbuffer + +\startbuffer[gg] +drawmidpoints(p,1,.625red, 14) ; drawmidpoints(p,1,.625yellow, 4) ; +\stopbuffer + +\startbuffer[hh] +drawmidpoints(p,1,.625red, 15) ; drawmidpoints(p,1,.625yellow, 5) ; +\stopbuffer + +\startbuffer +\startcombination[\Xcom*\Ycom] + {\processMPbuffer[a,b,cc,x]} {points} + {\processMPbuffer[a,b,cc,dd,x]} {first order curve} + {\processMPbuffer[a,b,cc,dd,ee,x]} {second order curve} + {\processMPbuffer[a,b,cc,dd,ee,ff,x]} {third order curve} + {\processMPbuffer[a,b,cc,dd,ee,gg,x]} {left side curves} + {\processMPbuffer[a,b,cc,dd,ee,hh,x]} {right side curves} +\stopcombination +\stopbuffer + +\getbuffer \page + +\startbuffer[dd] +drawmidpoints(p,1,.625red, 11) ; +drawmidpoints(p,1,.625yellow, 1) ; +\stopbuffer + +\startbuffer[ee] +for i=11, 12 : drawmidpoints(p,1,.625red, i) ; endfor ; +drawmidpoints(p,1,.625yellow, 2) ; +\stopbuffer + +\startbuffer[ff] +for i=11, 12, 13 : drawmidpoints(p,1,.625red, i) ; endfor ; +drawmidpoints(p,1,.625yellow, 3) ; +\stopbuffer + +\startbuffer[gg] +for i=11,12,13,14 : drawmidpoints(p,1,.625red, i) ; endfor ; +drawmidpoints(p,1,.625yellow, 4) ; +\stopbuffer + +\startbuffer[hh] +for i=11, 12, 13, 14, 15 : drawmidpoints(p,1,.625red, i) ; endfor ; +drawmidpoints(p,1,.625yellow, 5) ; +\stopbuffer + +\startbuffer +\startcombination[\Xcom*\Ycom] + {\processMPbuffer[a,b,cc,x]} {points} + {\processMPbuffer[a,b,cc,dd,x]} {first order points} + {\processMPbuffer[a,b,cc,ee,x]} {second order points} + {\processMPbuffer[a,b,cc,ff,x]} {third order points} + {\processMPbuffer[a,b,cc,gg,x]} {left side points} + {\processMPbuffer[a,b,cc,hh,x]} {right side points} +\stopcombination +\stopbuffer + +\getbuffer \page + +\startbuffer[cc] +drawpath p ; drawmidpoints (p,1,.625yellow, 0) ; +\stopbuffer + +\startbuffer[dd] +drawpath p ; drawmidpoints (p,2,.625yellow, 0) ; +\stopbuffer + +\startbuffer[ee] +drawpath p ; drawmidpoints (p,3,.625yellow, 0) ; +\stopbuffer + +\startbuffer[ff] +drawpath p ; drawmidpoints (p,4,.625yellow, 0) ; +\stopbuffer + +\startbuffer[gg] +drawpath p ; drawmidpoints (p,5,.625yellow, 0) ; +\stopbuffer + +\startbuffer[hh] +drawpath p ; drawmidpoints (p,6,.625yellow, 0) ; +\stopbuffer + +\startbuffer +\startcombination[\Xcom*\Ycom] + {\processMPbuffer[a,b,cc,x]} {first iteration} + {\processMPbuffer[a,b,cc,dd,x]} {second iteration} + {\processMPbuffer[a,b,cc,dd,ee,x]} {third iteration} + {\processMPbuffer[a,b,cc,dd,ee,ff,x]} {fourth iteration} + {\processMPbuffer[a,b,cc,dd,ee,ff,gg,x]} {fifth iteration} + {\processMPbuffer[a,b,cc,dd,ee,ff,gg,hh,x]} {sixths iteration} +\stopcombination +\stopbuffer + +\getbuffer \page + +\stoppostponing + +% here we pick up the thread, if we would not flush the +% pages before the next text, the reader could become +% confused + +The path in these examples is defined as follows: + +\typebuffer[b] + +If you are playing with graphics like this, the \METAFUN\ macro \type {randomize} +may come in handy: + +\startbuffer[bb] +p := p randomized (1cm,.5cm) ; +\stopbuffer + +\typebuffer[bb] + +If we apply this operation a couple of times we can see how the (control) points +vary. (Using the randomizer saves us the troubles of finding nice example +values.) The angle between the tangent as well as the distance from the parent +point determine the curve. + +\startbuffer[xx] +currentpicture := currentpicture scaled .5 ; +\stopbuffer + +\startlinecorrection[blank] +\hbox to \hsize + {\processMPbuffer[a,b,bb,c,x,xx]\hss + \processMPbuffer[a,b,bb,c,x,xx]\hss + \processMPbuffer[a,b,bb,c,x,xx]\hss + \processMPbuffer[a,b,bb,c,x,xx]} +\stoplinecorrection + +% new thread + +Just in case you are interested in how such graphical simulations can be +organized, we show simplified versions of the macros used here. (In the previous +examples we minimized the complexity of the code by using buffers, but describing +this mechanism is out of the scope of this section.) + +\startbuffer[demo] +vardef dodrawmidpoints (expr a, b, c, d, n) = + save e, f, g, h, i, j ; pair e, f, g, h, i, j ; + e := .5[a,b] ; f := .5[b,c] ; g := .5[c,d] ; + h := .5[e,f] ; i := .5[f,g] ; j := .5[h,i] ; + draw j ; + if n>1 : + dodrawmidpoints(a, e, h, j, n-1) ; + dodrawmidpoints(j, i, g, d, n-1) ; + fi ; +enddef ; + +vardef drawmidpoints (expr p, n) = + save a, b, c, d ; pair a, b, c, d ; + for x=0 upto length(p)-1 : + a := point x of p ; b := postcontrol x of p ; + d := point x+1 of p ; c := precontrol x+1 of p ; + dodrawmidpoints(a, b, c, d, n) ; + endfor ; +enddef ; +\stopbuffer + +We need to loop over all segments of a curve, where for each segment the left and +right side sub curves are handled recursively, upto the requested depth (denoted +as \type {n}). For this we define the following macros. + +\typebuffer[demo] + +\startbuffer[zero] +drawoptions (withpen pencircle scaled 5pt withcolor .625red); +\stopbuffer + +\startbuffer[extra] +drawoptions (withpen pencircle scaled 5pt withcolor .625yellow); +\stopbuffer + +We apply this macro to a simple shape: + +\startbuffer[one] +drawmidpoints (fullcircle xscaled 300pt yscaled 50pt, 1) ; +\stopbuffer + +\typebuffer[one] + +When drawn, this results in the points that makes up the +curve: + +\startlinecorrection[blank] +\processMPbuffer[demo,zero,one] +\stoplinecorrection + +We now add an extra iteration (resulting in the yellow points): + +\startbuffer[two] +drawmidpoints (fullcircle xscaled 300pt yscaled 50pt, 2) ; +\stopbuffer + +\typebuffer[two] + +and get: + +\startlinecorrection[blank] +\processMPbuffer[demo,zero,two,extra,one] +\stoplinecorrection + +We don't even need that much iterations to get a good result. The depth needed to +get a good result depends on the size of the pen and the resolution of the device +on which the curve is visualized. + +\startbuffer[zero] +drawoptions (withpen pencircle scaled 2pt withcolor .625red) ; +\stopbuffer + +\startbuffer[three] +for i=1 upto 7 : + drawmidpoints (fullcircle + xscaled (300pt+i*10pt) yscaled (50pt+i*10pt), i) ; +endfor ; +\stopbuffer + +\typebuffer[three] + +Here we show 7 iterations in one graphic. + +\startlinecorrection[blank] +\processMPbuffer[demo,zero,three] +\stoplinecorrection + +In practice it is not that trivial to determine the depth needed. The next +example demonstrates how the resolution of the result depends on the length and +nature of the segment. + +\startbuffer[four] +drawmidpoints (fullsquare + xscaled 300pt yscaled 50pt randomized (20pt,10pt), 5) ; +\stopbuffer + +\typebuffer[four] + +\startlinecorrection[blank] +\processMPbuffer[demo,zero,four] +\stoplinecorrection + +\stopsection + +\startsection[title={Inflection, tension and curl}] + +\index{inflection} +\index{tension} +\index{curl} + +The \METAPOST\ manual describes the meaning of \type {...} as \quotation {choose +an inflection||free path between these points unless the endpoint directions make +this impossible}. To use the words of David Arnold: a point of inflection is +where a path switches concavity, from concave up to concave down, for example. + +It is surprisingly difficult to find nice examples that demonstrate the +difference between \type {..} and \type {...}, as it is often \quote {impossible} +to honour the request for less inflection. We will demonstrate this with a few +graphics. + +In the four figures on the next pages, you will see that \type {...} is not +really suited for taming wild curves. If you really want to make sure that a +curve stays within certain bounds, you have to specify it as such using control +or intermediate points. In the figures that follow, the gray curves draw the +random path using \type {..} on top of yellow curves that use the \type {...} +connection. As you can see, in only a few occasions do the yellow \quote +{inflection} free curves show up. + +For those who asked for the code that produces these pictures, we now include it +here. We use a macro \type {sample} which we define as a usable graphic (nearly +all examples in this manual are coded in the document source). + +\startbuffer +\startuseMPgraphic{sample} +def sample (expr rx, ry) = + path p, q ; numeric n, m, r, a, b ; + color c ; c := \MPcolor{lightgray} ; + a := 3mm ; b := 2mm ; r := 2cm ; n := 7 ; m := 5 ; + q := unitsquare scaled r xyscaled (n,m) shifted (.5r,.5r) ; + draw q withpen pencircle scaled (b/4) withcolor .625yellow; + for i=1 upto n : for j=1 upto m : + p := (fullcircle scaled r randomized (r/rx,r/ry)) + shifted ((i,j) scaled r) ; + pickup pencircle scaled a ; + draw for k=0 upto length(p) : + point k of p .. endfor cycle withcolor c ; + draw for k=0 upto length(p) : + point k of p ... endfor cycle withcolor c ; + pickup pencircle scaled b ; + draw for k=0 upto length(p) : + point k of p .. endfor cycle withcolor .625yellow ; + draw for k=0 upto length(p) : + point k of p ... endfor cycle withcolor .625white ; + for k=0 upto length(p) : + draw point k of p withcolor .625red ; + endfor ; + endfor ; endfor ; + setbounds currentpicture to q ; +enddef ; +\stopuseMPgraphic +\stopbuffer + +\typebuffer \getbuffer + +As you see, not so much code is needed. The graphics themselves were produced +with a couple of commands like: + +\startbuffer +\placefigure + {Circles with minimized inflection and 25\% randomized points.} + {\startMPcode + \includeMPgraphic{sample} ; sample(4,4) ; + \stopMPcode} +\stopbuffer + +\typebuffer + +\startpostponing + +\placefigure + {Circles with minimized inflection and 25\% randomized points.} + {\startMPcode\includeMPgraphic{sample} ; sample(4,4) ; \stopMPcode} + +\placefigure + {Circles with minimized inflection and 33\% randomized points.} + {\startMPcode\includeMPgraphic{sample} ; sample(3,3) ; \stopMPcode} + +\page + +\placefigure + {Circles with minimized inflection and 50\% randomized points.} + {\startMPcode\includeMPgraphic{sample} ; sample(2,2) ; \stopMPcode} + +\placefigure + {Circles with minimized inflection and 100\% randomized points.} + {\startMPcode\includeMPgraphic{sample} ; sample(1,1) ; \stopMPcode} + +\page + +\stoppostponing + +The tension specifier can be used to influence the curvature. To quote the +\METAPOST\ manual once more: \quotation {The tension parameter can be less than +one, but it must be at least $3/4$}. The following paths are the same: + +\starttyping +z1 .. z2 +z1 .. tension 1 .. z2 +z1 .. tension 1 and 1 .. z2 +\stoptyping + +The triple dot command \type {...} is actually a macro that makes the following +commands equivalent. Both commands will draw identical paths. + +\starttyping +z1 ... z2 +z1 .. tension atleast 1 .. z2 +\stoptyping + +The \type {atleast} directive tells \METAPOST\ to do some magic behind the +screens. Both the $3/4$ and the \type {atleast} lead directly to the question: +\quotation {What, exactly, is the influence of the tension directive?} We will +try to demystify the \type {tension} specifier through a sequence of graphics. + +\startbuffer +u := 1cm ; z1 = (0,0) ; z2 = (2u,4u) ; z3 = (4u,0) ; +def sample (expr p, c) = + draw p withpen pencircle scaled 2.5mm withcolor white ; + draw p withpen pencircle scaled 2.0mm withcolor c ; +enddef ; +for i=.75 step .05 until 1 : + sample (z1 .. tension i .. z2 .. z3, .625red) ; +endfor ; +for i=1 step .05 until 2 : + sample (z1 .. tension i .. z2 .. z3, .625yellow) ; +endfor ; +sample (z1 .. z2 .. z3, .625white) ; +sample (z1 ... z2 ... z3, .625white) ; +\stopbuffer + +\typebuffer + +Indeed values less than .75 give an error message, but large values are okay. As +you can see, the two gray curves are the same. Here, \type {atleast 1} means~1, +even if larger values are useful. + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +\startbuffer +u := 1cm ; z1 = (0,0) ; z2 = (2u,4u) ; z3 = (4u,0) ; +def sample (expr p, c) = + draw p withpen pencircle scaled 2.5mm withcolor white ; + draw p withpen pencircle scaled 2.0mm withcolor c ; +enddef ; +for i=.75 step .05 until 1 : + sample (z1 .. tension i and 2i .. z2 .. z3, .625red) ; +endfor ; +for i=1 step .05 until 2 : + sample (z1 .. tension i and 2i .. z2 .. z3, .625yellow) ; +endfor ; +sample (z1 .. z2 .. z3, .625white) ; +sample (z1 ... z2 ... z3, .625white) ; +\stopbuffer + +Curves finally are made up out of points, and each point has two control points. +Since the \type {tension} specifier finally becomes a control point, it is not +surprising that you may specify two tension values. If we replace the tension in +the previous example by + +\starttyping +.. tension i and 2i .. +\stoptyping + +we get the following graphic: + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +\startbuffer +u := 1cm ; z1 = (0,0) ; z2 = (2u,4u) ; z3 = (4u,0) ; +def sample (expr p, c) = + draw p withpen pencircle scaled 2.5mm withcolor white ; + draw p withpen pencircle scaled 2.0mm withcolor c ; +enddef ; +for i=.75 step .05 until 1 : + sample (z1 .. tension 2i and i .. z2 .. z3, .625red) ; +endfor ; +for i=1 step .05 until 2 : + sample (z1 .. tension 2i and i .. z2 .. z3, .625yellow) ; +endfor ; +sample (z1 .. z2 .. z3, .625white) ; +sample (z1 ... z2 ... z3, .625white) ; +\stopbuffer + +If we swap both values (\type {.. tension 2i and i ..}) we get: + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +\startbuffer[a] +u := 1cm ; z1 = (0,0) ; z2 = (2u,4u) ; z3 = (4u,0) ; +def sample (expr p, c) = + drawpath p withpen pencircle scaled 2.5mm withcolor c ; + drawcontrollines p withcolor c ; + drawpoints p ; + drawcontrolpoints p ; +enddef ; +\stopbuffer + +We mentioned control points. We will now draw a few extreme tensions and show the +control points as \METAPOST\ calculates them. + +\startbuffer[b] +sample (z1 .. tension 0.75 .. z2 .. z3, .625red) ; +sample (z1 .. tension 2.00 .. z2 .. z3, .625yellow) ; +sample (z1 .. z2 .. z3, .625white) ; +\stopbuffer + +\typebuffer[b] + +First we will show the symmetrical tensions. + +\startlinecorrection[blank] +\processMPbuffer[a,b] +\stoplinecorrection + +The asymetrical tensions are less prominent. We use the following values: + +\startbuffer[b] +sample (z1 .. tension .75 and 10 .. z2 .. z3, .625red) ; +sample (z1 .. tension 10 and .75 .. z2 .. z3, .625yellow) ; +sample (z1 .. z2 .. z3, .625white) ; +\stopbuffer + +\typebuffer[b] + +\startlinecorrection[blank] +\processMPbuffer[a,b] +\stoplinecorrection + +What happens when you use the \METAPOST\ maximum value of \type {infinity} +instead of 10? Playing with this kind of graphic can be fun, especially when we +apply a few tricks. + +\startbuffer +def sample (expr p, c) = + draw p withpen pencircle scaled 2.5mm withcolor white ; + draw p withpen pencircle scaled 2.0mm withcolor c ; +enddef; + +u := 1cm ; z1 = (0,0) ; z2 = (2u,4u) ; z3 = (4u,0) ; + +for i=0 step .05 until 1 : + sample(z1 .. tension (.75+i) .. z2 .. z3, i[.625red,.625yellow]) ; +endfor; +\stopbuffer + +\typebuffer + +Here we change the color along with the tension. This clearly demonstrates that +we're dealing with a non linear phenomena. + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +We can (misuse) transparant colors to illustrate how the effect becomes less with +growing tension. + +\startbuffer +def sample (expr p) (text c)= + draw p withpen pencircle scaled 2.0mm withcolor c ; +enddef; + +u := 1cm ; z1 = (0,0) ; z2 = (2u,4u) ; z3 = (4u,0) ; + +for i=0 step .05 until 1 : + sample(z1 .. tension (.75+i) .. z2 .. z3, transparent(1,1-i,.625red)) ; +endfor; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +A third magic directive is \type {curl}. The curl is attached to a point between +\type {{ }}, like \type {{curl 2}}. Anything between curly braces is a direction +specifier, so instead of a \type {curl} you may specify a vector, like \type +{{(2,3)}}, a pair of numbers, as in \type {{2,3}}, or a direction, like \type +{{dir 30}}. Because vectors and angles are straightforward, we will focus a bit +on \type {curl}. + +\starttyping +z0 .. z1 .. z2 +z0 {curl 1} .. z1 .. {curl 1} z2 +\stoptyping + +So, a \type {curl} of~1 is the default. When set to~1, the begin and|/|or end +points are approached. Given the following definitions: + +\startbuffer[a] +u := 1cm ; z1 = (0,0) ; z2 = (2u,4u) ; z3 = (4u,0) ; +def sample (expr p, c) = + draw p withpen pencircle scaled 2.5mm withcolor white ; + draw p withpen pencircle scaled 2.0mm withcolor c ; +enddef ; +\stopbuffer + +\typebuffer[a] + +We can draw three curved paths. + +\startbuffer[b] +sample (z1 {curl 0} .. z2 .. {curl 0} z3, .625red) ; +sample (z1 {curl 2} .. z2 .. {curl 2} z3, .625yellow) ; +sample (z1 {curl 1} .. z2 .. {curl 1} z3, .625white) ; +\stopbuffer + +\typebuffer[b] + +The third (gray) curve is the default situation, so we could have left the \type +{curl} specifier out of the expression. + +\startlinecorrection[blank] +\processMPbuffer[a,b] +\stoplinecorrection + +\startbuffer[b] +sample (z1 {curl 0} .. z2 .. {curl 0} z3, .625red) ; +sample (z1 {curl infinity} .. z2 .. {curl infinity} z3, .625yellow) ; +sample (z1 {curl 1} .. z2 .. {curl 1} z3, .625white) ; +\stopbuffer + +The curly specs have a lower bound of zero and no upper bound. When we use +\METAPOST\ maximum value of \type {infinity} instead of~2, we get: + +\startlinecorrection[blank] +\processMPbuffer[a,b] +\stoplinecorrection + +These curves were defined as: + +\typebuffer[b] + +It may sound strange, but internally \METAPOST\ can handle +larger values than \type {infinity}. + +\startbuffer[b] +sample (z1 {curl infinity} .. z2 .. {curl infinity} z3, .625red) ; +sample (z1 {curl 4infinity} .. z2 .. {curl 4infinity} z3, .625yellow) ; +sample (z1 {curl 8infinity} .. z2 .. {curl 8infinity} z3, .625white) ; +\stopbuffer + +\typebuffer[b] + +Although this is quite certainly undefined behaviour, interesting effects can be +achieved. When you turn off \METAPOST's first stage overflow catcher by setting +\type {warningcheck} to zero, you can go upto 8 times \type {infinity}, which, +being some $2^{15}$, is still far from what today's infinity is supposed to be. + +\startlinecorrection[blank] +\processMPbuffer[a,b] +\stoplinecorrection + +As the built||in \METAPOST\ command \type {..} accepts the \type {curl} and \type +{tension} directives as described in this section, you will now probably +understand the following plain \METAPOST\ definitions: + +\starttyping +def -- = {curl 1} .. {curl 1} enddef ; +def --- = .. tension infinity .. enddef ; +def ... = .. tension atleast 1 .. enddef ; +\stoptyping + +These definitions also point out why you cannot add directives to the left or +right side of \type {--}, \type {---} and \type {...}: they are directives +themselves! + +\stopsection + +\startsection[title={Transformations}] + +\index{transformations} + +A \type {transform} is a vector that is used in what is called an affine +transformation. To quote the \METAPOST\ manual: + +\startquotation +If $p=(p_x,p_y)$ is a pair and $T$ is a transform, then +\type {p transform T} is a pair of the form: + +\startformula +(t_x + t_{xx} p_x + t_{xy} p_y, t_y + t_{yx} p_x + t_{yy} p_y) +\stopformula + +where the six numeric quantities $(t_x, t_y, t_{xx}, t_{xy}, +t_{yx}, t_{yy})$ determine T. +\stopquotation + +In literature concerning \POSTSCRIPT\ and \PDF\ you will find many references to +such transformation matrices. A matrix of $(s_x,0,0,s_y,0,0)$ is scaling by $s_x$ +in the horizontal direction and $s_y$ in the vertical direction, while +$(1,0,t_x,1,0,t_y)$ is a shift over $t_x,t_y$. Of course combinations are also +possible. + +Although these descriptions seem in conflict with each other in the nature and +order of the transform components in the vectors, the concepts are the same. You +normally populate transformation matrices using \type {scaled}, \type {shifted}, +\type {rotated}. + +\starttyping +transform t ; t := identity shifted (a,b) rotated c scaled d ; +path p ; p := fullcircle transformed t ; +\stoptyping + +The previous lines of code are equivalent to: + +\starttyping +path p ; p := fullcircle shifted (a,b) rotated c scaled d ; +\stoptyping + +You always need a starting point, in this case the identity matrix \type +{identity}: $(0,0,1,0,0,1)$. By the way, in \POSTSCRIPT\ the zero vector is +$(1,0,0,1,0,0)$. So, unless you want to extract the components using \type +{xpart}, \type {xypart}, \type {xxpart}, \type {ypart}, \type {yxpart} and|/|or \ +\type {yypart}, you may as well forget about the internal representation. + +You can invert a transformation using the \type {inverse} macro, which is defined +as follows, using an equation: + +\starttyping +vardef inverse primary T = + transform T_ ; T_ transformed T = identity ; T_ +enddef ; +\stoptyping + +Using transform matrices makes sense when similar transformations need to be +applied on many paths, pictures, pens, or other transforms. However, in most +cases you will use the predefined commands \type {scaled}, \type {shifted}, \type +{rotated} and alike. We will now demonstrate the most common transformations in a +text example. + +\startbuffer[a] +draw btex \bfd MetaFun etex ; +draw boundingbox currentpicture withcolor .625yellow ; +\stopbuffer + +\typebuffer[a] + +Before an independent \METAPOST\ run, the \typ {btex ... etex}'s are filtered +from the file and passed on to \TEX. After that, the \DVI\ file is converted to a +list of pictures, which is consulted by \METAPOST. This is no longer the case in +\LUATEX\ where we use \MPLIB, so users don't have to worry about these issues: +just ignore what is mentioned in the official \METAPOST\ manual. + +We can manipulate the pictures representing text like any graphic as well as draw +it with \type {draw}. + +\startlinecorrection[blank] +\processMPbuffer[a] +\stoplinecorrection + +We show the transformations in relation to the origin and make the origin stand +out a bit more by painting it a bit larger in white first. + +\startbuffer[c] +draw origin withpen pencircle scaled 1.5mm withcolor white ; +draw origin withpen pencircle scaled 1mm withcolor .625red +\stopbuffer + +\typebuffer[c] + +The origin is in the lower left corner of the picture. + +\startlinecorrection[blank] +\processMPbuffer[a,c] +\stoplinecorrection + +Because the transformation keywords are proper english, we let the pictures speak +for themselves. + +% shifted + +\startbuffer[b] +currentpicture := currentpicture shifted (0,-1cm) ; +\stopbuffer + +\page[preference] \typebuffer[b] \page[no] + +\startlinecorrection[blank] +\processMPbuffer[a,b,c] +\stoplinecorrection + +% rotated + +\startbuffer[b] +currentpicture := currentpicture rotated 180 ; +\stopbuffer + +\page[preference] \typebuffer[b] \page[no] + +\startlinecorrection[blank] +\processMPbuffer[a,b,c] +\stoplinecorrection + +% rotatedaround + +\startbuffer[b] +currentpicture := currentpicture rotatedaround(origin,30) ; +\stopbuffer + +\page[preference] \typebuffer[b] \page[no] + +\startlinecorrection[blank] +\processMPbuffer[a,b,c] +\stoplinecorrection + +% scaled + +\startbuffer[b] +currentpicture := currentpicture scaled 1.75 ; +\stopbuffer + +\page[preference] \typebuffer[b] \page[no] + +\startlinecorrection[blank] +\processMPbuffer[a,b,c] +\stoplinecorrection + +% scaled + +\startbuffer[b] +currentpicture := currentpicture scaled -1 ; +\stopbuffer + +\page[preference] \typebuffer[b] \page[no] + +\startlinecorrection[blank] +\processMPbuffer[a,b,c] +\stoplinecorrection + +% xscaled + +\startbuffer[b] +currentpicture := currentpicture xscaled 3.50 ; +\stopbuffer + +\page[preference] \typebuffer[b] \page[no] + +\startlinecorrection[blank] +\processMPbuffer[a,b,c] +\stoplinecorrection + +% xscaled + +\startbuffer[b] +currentpicture := currentpicture xscaled -1 ; +\stopbuffer + +\page[preference] \typebuffer[b] \page[no] + +\startlinecorrection[blank] +\processMPbuffer[a,b,c] +\stoplinecorrection + +% yscaled + +\startbuffer[b] +currentpicture := currentpicture yscaled .5 ; +\stopbuffer + +\page[preference] \typebuffer[b] \page[no] + +\startlinecorrection[blank] +\processMPbuffer[a,b,c] +\stoplinecorrection + +% yscaled + +\startbuffer[b] +currentpicture := currentpicture yscaled -1 ; +\stopbuffer + +\page[preference] \typebuffer[b] \page[no] + +\startlinecorrection[blank] +\processMPbuffer[a,b,c] +\stoplinecorrection + +% slanted + +\startbuffer[b] +currentpicture := currentpicture slanted .5 ; +\stopbuffer + +\page[preference] \typebuffer[b] \page[no] + +\startlinecorrection[blank] +\processMPbuffer[a,b,c] +\stoplinecorrection + +% slanted + +\startbuffer[b] +currentpicture := currentpicture slanted -.5 ; +\stopbuffer + +\page[preference] \typebuffer[b] \page[no] + +\startlinecorrection[blank] +\processMPbuffer[a,b,c] +\stoplinecorrection + +% zscaled + +\startbuffer[b] +currentpicture := currentpicture zscaled (.75,.25) ; +\stopbuffer + +\page[preference] \typebuffer[b] \page[no] + +\startlinecorrection[blank] +\processMPbuffer[a,b,c] +\stoplinecorrection + +% reflectedabout + +\startbuffer[b] +currentpicture := currentpicture + reflectedabout(llcorner currentpicture,urcorner currentpicture) ; +\stopbuffer + +\page[preference] \typebuffer[b] \page[no] + +\startlinecorrection[blank] +\processMPbuffer[a,b,c] +\stoplinecorrection + +% reverse counterclockwise turningnumber + +A path has a certain direction. When the \type {turningnumber} of a path is +larger than zero, it runs in clockwise direction. The \METAPOST\ primitive \type +{reverse} changes the direction, while the macro \type {counterclockwise} can be +used to get a path running in a well defined direction. + +\startbuffer +drawoptions(withpen pencircle scaled 2pt withcolor .625red) ; +path p ; p := fullcircle scaled 1cm ; +drawarrow p ; +drawarrow reverse p shifted (2cm,0) ; +drawarrow counterclockwise p shifted (4cm,0) ; +drawarrow counterclockwise reverse p shifted (6cm,0) ; +drawarrow reverse counterclockwise p shifted (8cm,0) ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +\stopsection + +\startsection[title={Only this far}] + +When you take a close look at the definitions of the Computer Modern Roman fonts, +defined in the \METAFONT\ book, you will notice a high level of abstraction. +Instead of hard coded points you will find points defined in terms of \quote +{being the same as this point} or \quote {touching that point}. In this section +we will spend some time on this touchy aspect. + +\startbuffer[a] +pickup pencircle scaled 2mm ; +path p ; p := fullsquare scaled 2cm ; +draw p withcolor .625white ; +\stopbuffer + +\startlinecorrection[blank] +\processMPbuffer[a] +\stoplinecorrection + +This rectangle is a scaled instance of the predefined \METAFUN\ path \type +{fullsquare} which is centered around the origin. + +\typebuffer[a] + +On this path, halfway between two of its corners, we define a point \type {q}: + +\startbuffer[b] +pair q ; q := .5[llcorner p, lrcorner p] ; +\stopbuffer + +\typebuffer[b] + +We draw this point in red, using: + +\startbuffer[c] +draw q withcolor .625red ; +\stopbuffer + +\typebuffer[c] + +As you can see, this point is drawn on top of the path. + +\startlinecorrection[blank] +\processMPbuffer[a,b,c] +\stoplinecorrection + +There are four of those midpoints, and when we connect them, we get: + +\startbuffer[c] +draw q -- q rotated 90 -- q rotated 180 -- + q rotated 270 -- cycle withcolor .625red ; +\stopbuffer + +\startlinecorrection[blank] +\processMPbuffer[a,b,c] +\stoplinecorrection + +Because path \type {p} is centered around the origin, we can simply rotate point +\type {q} a few times. + +\typebuffer[c] + +There are situations, where you don't want the red path to be drawn inside +another path, or more general: where you want points to touch instead of being +overlayed. + +\startlinecorrection[blank] +\processMPbuffer[a,b,c] +\stoplinecorrection + +We can achieve this by defining point \type {q} to be located on top of the +midpoint. + +\startbuffer[b] +pair q ; q := top .5[llcorner p, lrcorner p] ; +\stopbuffer + +\typebuffer[b] + +The predefined macro \type {top} moves the point over the distance similar to the +current pen width. + +\startlinecorrection[blank] +\processMPbuffer[a,b,c] +\stoplinecorrection + +Because we are dealing with two drawing operations, and since the path inside is +drawn through the center of points, we need to repeat this move in order to draw +the red path really inside the other one. + +\startbuffer[b] +pair q ; q := top top .5[llcorner p, lrcorner p] ; +\stopbuffer + +\typebuffer[b] + +Operations like \type {top} and its relatives \type {bot}, \type {lft} and \type +{rt} can be applied sequentally. + +\startlinecorrection[blank] +\processMPbuffer[a,b,c] +\stoplinecorrection + +We already showed that \type {q} was defined as a series of rotations. + +\typebuffer[c] + +As an intermezzo we will show an alternative definition of \type {q}. Because +each point is rotated 90 degrees more, we can define a macro that expands into +the point and rotates afterwards. Because each consecutive point on the path is +rotated an additional 90 degrees, we use the \METAPOST\ macro \type {hide} to +isolate the assignment. The \type {hide} command executes the hidden command and +afterwards continues as if it were never there. You must not confuse this with +grouping, since the hidden commands are visible to its surroundings. + +\startbuffer[c] +def qq = q hide(q := q rotated 90) enddef ; +draw qq -- qq -- qq -- qq -- cycle withcolor .625red ; +\stopbuffer + +\typebuffer[c] + +The macro \type {top} uses the characteristics of the current pen to determine +the displacement. However, for the more complicated pen shapes we need a +different trick to get an inside path. Let's start by defining an elliptical +path. + +\startbuffer[a] +pickup pencircle xscaled 3mm yscaled 5mm rotated 30 ; +path p ; p := fullcircle xscaled 6cm yscaled 3cm ; +draw p withcolor .625white ; +\stopbuffer + +\typebuffer[a] + +We draw this path using a non standard pen. In the \METAFONT\ manual you will +find methods to draw shapes with similar pens, where the pen is also turning, as +it does in real calligraphy. Here we stick to a more simple one. + +\startlinecorrection[blank] +\processMPbuffer[a] +\stoplinecorrection + +We construct the inner path from the points that make up the curve. Watch how we +use a for loop to compose the new path. When used this way, no semi colon may be +used to end the loop, since it would isolate the color directive. + +\startbuffer[b] +draw point 0 of p + for i=1 upto length(p) : -- point (i) of p endfor + withcolor .625red ; +\stopbuffer + +\typebuffer[b] + +The points are still located on the original path. + +\startlinecorrection[blank] +\processMPbuffer[a,b] +\stoplinecorrection + +We can move the points to the inside by shifting them over the penwidth in the +direction perpendicular to the point. Because we use this transformation more +than once, we wrap it into a macro. This also keeps the code readable. + +\startbuffer[b] +vardef inside expr pnt of p = + (point pnt of p shifted + -(penoffset direction pnt of p of currentpen)) +enddef ; +draw inside 0 of p + for i=1 upto length(p) : -- inside i of p endfor + withcolor .625red ; +\stopbuffer + +\typebuffer[b] + +Whenever you define a pen, \METAPOST\ stores its characteristics in some private +variables which are used in the \type {top} and alike directives. The \type +{penoffset} is a built in primitive and is defined as the \quotation {point on +the pen furthest to the right of the given direction}. Deep down in \METAPOST\ +pens are actually simple paths and therefore \METAPOST\ has a notion of a point +on the penpath. In the \METAFONT\ book and \METAPOST\ manual you can find in +depth discussions on pens. + +\startlinecorrection[blank] +\processMPbuffer[a,b] +\stoplinecorrection + +We're still not there. Like in a previous example, we need to shift over twice +the pen width. To get good results, we should determine the width of the pen at +that particular point, which is not trivial. The more general solution, which +permits us to specify the amount of shifting, is as follows. + +\startbuffer[b] +vardef penpoint expr pnt of p = + save n, d ; numeric n, d ; + (n,d) = if pair pnt : pnt else : (pnt,1) fi ; + (point n of p shifted + ((penoffset direction n of p of currentpen) scaled d)) +enddef ; +\stopbuffer + +\typebuffer[b] + +When the point specification is extended with a distance, in which case we have a +pair expression, the point and distance are derived from this specification. +First we demonstrate the simple case: + +\startbuffer[c] +draw penpoint 0 of p + for i=1 upto length(p)-1 : .. penpoint i of p endfor .. cycle + withcolor .625red ; +\stopbuffer + +\typebuffer[c] + +\startlinecorrection[blank] +\processMPbuffer[a,b,c] +\stoplinecorrection + +In the next graphic, we draw both an inner and and outer path. + +\startbuffer[c] +draw penpoint (0,-2) of p + for i=1 upto length(p)-1 : .. penpoint (i,-2) of p endfor .. cycle + withcolor .625red ; +draw penpoint (0,+2) of p + for i=1 upto length(p)-1 : .. penpoint (i,+2) of p endfor .. cycle + withcolor .625yellow ; +\stopbuffer + +\typebuffer[c] + +\startlinecorrection[blank] +\processMPbuffer[a,b,c] +\stoplinecorrection + +\startbuffer[a] +path p, q, r ; + +p := fullcircle scaled 3cm ; +q := p shifted (7cm,0cm) ; +r := center p -- center q ; +\stopbuffer + +\startbuffer[b] +pair pr, qr ; + +pr := p intersectionpoint r ; +qr := q intersectionpoint r ; + +r := r cutbefore pr cutafter qr ; +\stopbuffer + +\startbuffer[c] +r := r cutbefore (point 5pt on r) ; +r := r cutafter (point -5pt on r) ; +\stopbuffer + +\startbuffer[cc] +r := r cutends 5pt ; +\stopbuffer + +\startbuffer[d] +draw p withpen pencircle scaled 10pt withcolor .625red ; +draw q withpen pencircle scaled 10pt withcolor .625yellow ; +draw r withpen pencircle scaled 20pt withcolor .625white ; +\stopbuffer + +\startbuffer[dd] +draw r withpen pencircle scaled 20pt withcolor .625white ; +draw p withpen pencircle scaled 10pt withcolor .625red ; +draw q withpen pencircle scaled 10pt withcolor .625yellow ; +\stopbuffer + +Another case when \type {top} and friends cannot be applied in a general way is +the following. Consider the three paths: + +\typebuffer[a] + +We draw these paths with: + +\typebuffer[d] + +The line is drawn from center to center and since the line has a non zero width +and a round line cap, it extends beyond this point. + +\startlinecorrection[blank] +\processMPbuffer[a,d] +\stoplinecorrection + +If we want the line to stop at the circular paths, we can cut off the pieces that +extend beyond those paths. + +\typebuffer[b] + +This time we get: + +\startlinecorrection[blank] +\processMPbuffer[a,b,d] +\stoplinecorrection + +Due to the thicker line width used when drawing the straight line, part of that +line is still visible inside the circles. So, we need to clip off a bit more. + +\typebuffer[c] + +The \type {point ... on} operation is a \METAFUN\ macro that takes a dimension. + +\startlinecorrection[blank] +\processMPbuffer[a,b,c,d] +\stoplinecorrection + +In order to save you some typing, \METAFUN\ provides a macro \type {cutends} that +does the same job: + +\typebuffer[cc] + +This time we draw the path in a different order: + +\typebuffer[dd] + +That way we hide the still remaining overlapping part of the line. + +\startlinecorrection[blank] +\processMPbuffer[a,b,cc,dd] +\stoplinecorrection + +\stopsection + +\startsection[title={Directions}] + +\index{directions} + +Quite often you have to tell \METAPOST\ in what direction a line should be drawn. +A direction is specified as a vector. There are four predefined vectors: \type +{up}, \type {down}, \type {left}, \type {right}. These are defined as follows: + +\starttyping +pair up, down, left, right ; +up = -down = (0,1) ; right = -left = (1,0) ; +\stoptyping + +We can use these predefined pairs as specifications and in calculations. + +\startbuffer +dotlabel.top("up" , up * 1cm) ; +dotlabel.bot("down" , down * 1cm) ; +dotlabel.lft("left" , left * 1cm) ; +dotlabel.rt ("right", right * 1cm) ; + +drawoptions (withpen pencircle scaled .25mm withcolor .625 red) ; + +drawarrow origin -- up * 1cm ; +drawarrow origin -- down * 1cm ; +drawarrow origin -- left * 1cm ; +drawarrow origin -- right * 1cm ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +This graphic can also be defined in a more efficient (but probably more cryptic) +way. The next definition demonstrates a few nice tricks. Instead of looping over +the four directions, we loop over their names. Inside the loop we convert these +names, or strings, into a pair by scanning the string using \type {scantokens}. +The \type {freedotlabel} macro is part of \METAFUN\ and takes three arguments: a +label string (or alternatively a picture), a point (location), and the \quote +{center of gravity}. The label is positioned in the direction opposite to this +center of gravity. + +\startbuffer +pair destination ; +for whereto = "up", "down", "left", "right" : + destination := scantokens(whereto) * 1cm ; + freedotlabel(whereto, destination, origin) ; + drawarrow origin -- destination + withpen pencircle scaled .25mm withcolor .625 red ; +endfor ; +\stopbuffer + +\typebuffer + +So, in this code fragment, we use the string as string and (by means of \type +{scantokens}) as a point or vector. + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +The previous definition is a stepping stone to the next one. This time we don't +use points, but the \type {dir} command. This command converts an angle into an +unitvector. + +\startbuffer +pair destination ; +for whereto = 0 step 30 until 330 : + destination := dir(whereto) * 1.5cm ; + freedotlabel(decimal whereto, destination, origin) ; + drawarrow origin -- destination + withpen pencircle scaled .25mm withcolor .625 red ; +endfor ; +\stopbuffer + +\typebuffer + +In \METAPOST\ the angles go counter clockwise, which is not that illogical if you +look at it from the point of view of vector algebra. + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +\stopsection + +\startsection[title={Analyzing pictures}] + +\index{pictures+analyzing} + +{\em Unless you really want to know all details, you can safely skip this +section. The \METAPOST\ features discussed here are mainly of importance when you +write (advanced) macros.} + +% Later we will discuss in detail how you can use either \METAPOST\ or \TEX\ to +% typeset text (\in {section} [sec:text] and \in {chapter} [sec:typesetting]), so +% here we limit our exploration to a quick introduction. The most direct way of +% processing text in \METAPOST\ is using the \type {infont} operator. +% +% \startbuffer[mp] +% draw "this string will become a sequence of glyphs (MP)" +% infont defaultfont scaled defaultscale ; +% \stopbuffer +% +% \typebuffer[mp] +% +% The text between \type {"} is passed to \TEX, and the resulting \DVI\ will be +% converted into a picture with textual components. So, we get: +% +% \startlinecorrection[blank] +% \midaligned{\processMPbuffer[mp]} +% \stoplinecorrection +% +% The same string typeset by \TEX\ shows up as: +% +% \blank +% \midaligned{this string will become a sequence of glyphs (\TeX)} +% \blank +% +% The following \METAPOST\ features are not covered by the \METAPOST\ manual, but +% most of them are discussed in the appendix of the \type {graph} package written +% by John Hobby. +% +%It is possible to disassemble a picture by means of a special for loop using the +%\type {within} specifier. The following code walks over a picture and draws the +%components with their bounding boxes. +% +% \startbuffer[show] +% for i within currentpicture : +% draw boundingbox i withcolor .625yellow ; +% endfor ; +% \stopbuffer +% +% \typebuffer[show] +% +% We can use the disassemble loop feature to look into the previously shown +% example text. +% +% \startlinecorrection[blank] +% \processMPbuffer[mp,show] +% \stoplinecorrection +% +% The second line is typeset by \TEX. The resulting \DVI\ code is converted into a +% series of pictures, which \METAPOST\ pastes into one picture. You may also notice +% that in the set of pictures that originate in \TEX, the space is replaced by a +% shift (this is because \TEX\ knows no space). +% +% An interesting aspect of this \quote {loop over a picture} feature, is that it +% can provide insight in how \TEX\ is composing a paragraph. +% +% \startbuffer +% draw btex \framed[width=fit,align=middle]{\input tufte \relax} etex ; +% for i within currentpicture : +% draw boundingbox i withpen pencircle scaled .2pt withcolor .625yellow ; +% endfor ; +% \stopbuffer +% +% \startlinecorrection[blank] +% \processMPbuffer +% \stoplinecorrection +% +% You may also notice, that rules produced by \TEX\ are converted to straight line +% segments. Because the line extends 50\% of its linewidth beyond a point, there is +% a slight overshoot. This picture was defined in a few lines: +% +% \typebuffer +% +% If we use a Times Roman instead of a Palatino, we get quite +% different results. +% +% \startlinecorrection[blank] +% \startMPenvironment +% %\let\fontclass\empty +% \usetypescript[times][texnansi] +% \switchtobodyfont[times,10pt] +% \stopMPenvironment +% \processMPbuffer +% \stoplinecorrection +% +% In \CONTEXT, you can easily change the body font for +% \METAPOST\ graphics with directives like: +% +% \starttyping +% \startMPenvironment +% \usetypescript[times][texnansi] +% \switchtobodyfont[times,10pt] +% \stopMPenvironment +% \stoptyping +% +% This font has far less kerning. Even more interesting is the Lucida Bright +% Handwriting font, which is defined in such a way that no kerning is needed at +% all. +% +% \startlinecorrection[blank] +% \resetMPenvironment +% \startMPenvironment +% %\let\fontclass\empty +% \usetypescript[lucida][texnansi] +% \switchtobodyfont[lucida,hw,10pt] +% \stopMPenvironment +% \processMPbuffer +% \stoplinecorrection +% +% You can ask for the number of components with \type {length}. A component can be +% a stroked or filled path, or a text resulting from an \type {infont} operation. +% If the (last) path is a clip path, or when the whole picture has a forced +% boundingbox, the picture is treated as a whole. We will demonstrate this later. + +We can decompose \METAPOST\ pictures using a \type {within} loop. You may wonder +if such a \type {within} loop construct has any real application, and as you can +expect, it has. In \in {section} [sec:color circles] a macro is defined that +draws a colored circle. If you want the inverted alternative, you can pass the +inverted color specification, but wouldn't it be more convenient if there was an +operator that did this for you automatically? Unfortunately there isn't one so we +have to define one ourselves in a macro. + +\startbuffer +colorcircle(4cm,(.4,.6,.8),(.4,.8,.6),(.6,.4,.8)) ; +addto currentpicture also inverted currentpicture shifted (5cm,0) ; +\stopbuffer + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +These circles were drawn using: + +\typebuffer + +When we \type {draw} a path, or stroke a path, as it is called officially, we +actually perform an addition: + +\starttyping +addto currentpicture doublepath somepath +\stoptyping + +The \type {fill} command is actually: + +\starttyping +addto currentpicture contour somepath +\stoptyping + +We will need both \type {doublepath} and \type {contour} operations in the +definition of \type {inverted}. + +When \METAPOST\ has digested a path into a picture, it keeps track of some +characteristics. We can ask for them using \type {part...} operators. The +following operators can be applied to a transform vector (one of \METAPOST's data +types), but also to a picture. Say that we have drawn a circle: + +\startbuffer[a] +draw fullcircle + xscaled 3cm yscaled 2cm + dashed dashpattern(on 3mm off 3mm) + withpen pencircle scaled 1mm + withcolor .625red ; +picture p ; p := currentpicture ; +\stopbuffer + +\typebuffer[a] + +This circle looks like: + +\startlinecorrection[blank] +\processMPbuffer[a] +\stoplinecorrection + +We can now ask for some of the characteristics of \type {currentpicture}, like +its color. We could write the values to the log file, but it is more convenient +to put them on paper. + +\startbuffer[b] +label.rt("redpart: " & decimal redpart p, (4cm,+.5cm)) ; +label.rt("greenpart: " & decimal greenpart p, (4cm, 0cm)) ; +label.rt("bluepart: " & decimal bluepart p, (4cm,-.5cm)) ; +\stopbuffer + +\typebuffer[b] + +Here the \type {&} glues strings together, while the decimal operator converts a +number into a string. + +The result has no typographic beauty |<|keep in mind that here we use \METAPOST\ +to typeset the text|>|but the result serves its purpose. + +\startlinecorrection[blank] +\processMPbuffer[a,b] +\stoplinecorrection + +We can also ask for the path itself (\type {pathpart}), the pen (\type {penpart}) +and the dashpattern (\type {dashpart}), but these can only be assigned to +variables of the corresponding type. + +A path can be stroked or filled, in which case it is a cyclic path. It can have a +non natural bounding box, be a clip path, consist of line segments or contain +text. All these characteristics can be tested. + +\startbuffer[b] +label.rt("filled: " & condition filled p, (4cm,+1.25cm)) ; +label.rt("stroked: " & condition stroked p, (4cm,+0.75cm)) ; +label.rt("textual: " & condition textual p, (4cm,+0.25cm)) ; +label.rt("clipped: " & condition clipped p, (4cm,-0.25cm)) ; +label.rt("bounded: " & condition bounded p, (4cm,-0.75cm)) ; +label.rt("cycle: " & condition cycle pathpart p, (4cm,-1.25cm)) ; +\stopbuffer + +\typebuffer[b] + +\startlinecorrection[blank] +\processMPbuffer[a,b] +\stoplinecorrection + +In this code snippet, \type {condition} is a macro that takes care of translating +a boolean value into a string (like \type {decimal} does with a numeric value). + +\starttyping +def condition primary b = + if b : "true" else : "false" fi +enddef ; +\stoptyping + +Clip paths and bounding boxes are kind of special in the sense that they can +obscure components. The following examples demonstrate this. In case of a clip +path or bounding box, the \type {pathpart} operator returns this path. In any +case that asking for a value does not make sense |<|a clipping path for instance +has no color|>| a zero (null) value is returned. + +\startbuffer[b] +n := 1 ; +for i within currentpicture : n := n + 1 ; + label("n: " & decimal n & " / " & + "length: " & decimal length i & " / " & + "stroked: " & condition stroked i & " / " & + "clipped: " & condition clipped i & " / " & + "bounded: " & condition bounded i , (0,-n*.5cm)) ; +endfor ; +\stopbuffer + +\startbuffer[c] +\startlinecorrection[blank] +\framed[offset=overlay,frame=off,background=color,backgroundcolor=gray]{\processMPbuffer[a,b]} +\stoplinecorrection +\stopbuffer + +\startbuffer[a] +draw fullcircle withpen pencircle scaled 6mm ; +clip currentpicture to fullcircle ; +setbounds currentpicture to fullcircle ; +\stopbuffer + +\typebuffer[a] \getbuffer[c] + +\startbuffer[a] +draw fullcircle withpen pencircle scaled 6mm ; +setbounds currentpicture to fullcircle ; +clip currentpicture to fullcircle ; +\stopbuffer + +\typebuffer[a] \getbuffer[c] + +\startbuffer[a] +clip currentpicture to fullcircle ; +draw fullcircle withpen pencircle scaled 6mm ; +setbounds currentpicture to fullcircle ; +\stopbuffer + +\typebuffer[a] \getbuffer[c] + +\startbuffer[a] +clip currentpicture to fullcircle ; +setbounds currentpicture to fullcircle ; +draw fullcircle withpen pencircle scaled 6mm ; +\stopbuffer + +\typebuffer[a] \getbuffer[c] + +\startbuffer[a] +setbounds currentpicture to fullcircle ; +clip currentpicture to fullcircle ; +draw fullcircle withpen pencircle scaled 6mm ; +\stopbuffer + +\typebuffer[a] \getbuffer[c] + +\startbuffer[a] +setbounds currentpicture to fullcircle ; +draw fullcircle withpen pencircle scaled 6mm ; +clip currentpicture to fullcircle ; +\stopbuffer + +\typebuffer[a] \getbuffer[c] + +The description lines were generated by the following loop: + +\typebuffer[b] + +% % The following is no longer valid in MetaFun: +% +% If we have a textual picture, we can also ask for the text and font. Take the +% following picture: +% +% \startbuffer[a] +% picture p ; +% p := "MetaFun" normalinfont "rm-lmr10" scaled 2 rotated 30 slanted .5 ; +% p := p shifted (0,-ypart center p) ; +% currentpicture := p ; +% \stopbuffer +% +% \typebuffer[a] +% +% Here we can ask for: +% +% \startbuffer[b] +% label.rt("textpart: " & textpart p, (4cm,+0.25cm)) ; +% label.rt("fontpart: " & fontpart p, (4cm,-0.25cm)) ; +% \stopbuffer +% +% \typebuffer[b] +% +% and get: +% +% \startlinecorrection[blank] +% \processMPbuffer[a,b] +% \stoplinecorrection +% +% We use \type {normalinfont} instead of \type {infont} because in \METAFUN\ this +% operator is overloaded and follows another route for including text. +% +% If we're dealing with a path, the transformations have ended up in the path +% specification. If we have a text picture, we can explicitly ask for the transform +% components. +% +% \startbuffer[b] +% label.rt("xpart: " & decimal xpart p, (4cm,+1.25cm)) ; +% label.rt("ypart: " & decimal ypart p, (4cm,+0.75cm)) ; +% label.rt("xxpart: " & decimal xxpart p, (4cm,+0.25cm)) ; +% label.rt("xypart: " & decimal xypart p, (4cm,-0.25cm)) ; +% label.rt("yxpart: " & decimal yxpart p, (4cm,-0.75cm)) ; +% label.rt("yypart: " & decimal yypart p, (4cm,-1.25cm)) ; +% \stopbuffer +% +% \typebuffer[b] +% +% \startlinecorrection[blank] +% \processMPbuffer[a,b] +% \stoplinecorrection +% +% We will now define the \type {inverted} macro using these primitives. Because we +% have to return a picture, we cannot use \type {draw} and \type {fill} but need to +% use the low level operators. Because a picture can consist of more than one path, +% we need a temporary picture \type {pp}. +% +% \starttyping +% vardef inverted expr p = +% save pp ; picture pp ; pp := nullpicture ; +% for i within p : +% addto pp +% if stroked i or filled i : +% if filled i : contour else : doublepath fi pathpart i +% dashed dashpart i withpen penpart i +% else : +% also i +% fi +% withcolor white-(redpart i, greenpart i, bluepart i) ; +% endfor ; +% pp +% enddef ; +% \stoptyping +% +% We probably need to handle a few more border cases, but for general purposes, +% this macro works as expected. + +The textual capabilities built in \METAPOST\ are rather limited but in \CONTEXT\ +we have overloaded the relevant operators. There we hook into the normal font +handler. The native text related operators are: + +\starttyping +draw "MetaFun" infont "somefont" scaled 2 rotated 30 slanted .5 ; +draw btex MetaFun etex scaled 2 rotated 30 slanted .5 ; +\stoptyping + +The \type {infont} operator directly calls for a font and in stock \METAPOST\ is +limited to (eight bit) \TYPEONE\ fonts. In \CONTEXT\ you can do this: + +\startbuffer[a] +draw "MetaFun" infont "SerifBold*default" xscaled 5 rotated 5 slanted .5 ; +\stopbuffer + +\typebuffer[a] + +The specification is a regular \CONTEXT\ font specification. + +\startlinecorrection[blank] +\processMPbuffer[a] +\stoplinecorrection + +The \type {btex ... etex} variant in normal \METAPOST\ delegates to \TEX\ and in \MKII\ +indeed we filter them and process them between runs (or at runtime). In \MKIV\ they are +also handled by \TEX\ but in an even more integrated and immediate way. + +The two primitives \type {textpart} and \type {fontpart} that can be used to disassemble +a picture don't apply to \METAFUN\ as contrary to \METAPOST\ we don't convert the result +to a picture. In later chapters we will discuss text in more detail. + +From the previous examples it may be clear that each picture has some associated +data stored with it. From the \type {bounded} boolean test we can conclude that +the bounding box is part of this data. Internally \METAPOST\ keeps track of two +bounding boxes: the natural one, and the forced one. The forced one is actually a +component of the picture which applies to all previously added graphics. You can +calculate the bounding box from the \type {llcorner} and \type {urcorner} or if +you like \type {ulcorner} and \type {lrcorner} and the \METAFUN\ command \type +{boundingbox} does so. + +The four corners that make up the bounding box are either the natural ones, or +the ones forced by \type {setbounds}. You can force \METAPOST\ to report the +natural ones by setting \type {truecorners} to~1. The next example demonstrates +this feature. + +\startbuffer +pickup pencircle scaled 2mm ; path p, q ; +draw fullcircle + scaled 4cm slanted .5 withcolor .625white ; +setbounds currentpicture to + boundingbox currentpicture enlarged -5mm ; +interim truecorners := 0 ; p := boundingbox currentpicture ; +interim truecorners := 1 ; q := boundingbox currentpicture ; +pickup pencircle scaled 1mm ; +draw p withcolor .625red ; +draw q withcolor .625yellow ; +\stopbuffer + +\typebuffer + +We use \type {interim} because \type {truecorners} is an internal \METAPOST\ +variable. + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +% % we already redefined infont so it's kind of dangerous to provide this example +% +% Since \METAPOST\ can handle fonts (it can even generate font metric files) it is +% no surprise that we can also ask for the natural size of a font. For this we use +% \type {fontsize}. However, you should beware of the fact that the size reported +% is in base points. Since this is \METAPOST's native unit, this is no problem in +% calculations, but it may look confusing when you \type {show} this size on your +% terminal and get less that 10 reported for a \type {cmr10} font. +% +% \starttyping +% show fontsize "cmr10" ; +% \stoptyping +% +% In order to demonstrate that \type {fontsize} is useful, we extend the \type +% {infont} command. In the process we show a few macro definition tricks. What we +% want is a \TEX\ like specification of a font size: +% +% \startbuffer[txt] +% draw "MetaFun" infont defaultfont at 20pt ; +% \stopbuffer +% +% \typebuffer[txt] +% +% We can store the current meaning of a primitive or macro in a new macro. We do so +% with \type {infont}: +% +% \startbuffer[a] +% let normalinfont = infont ; +% \stopbuffer +% +% \typebuffer[a] +% +% We can only know the size if we know the name of the font, so we have to redefine +% \type {infont} to pick up this name. +% +% \startbuffer[b] +% numeric lastfontsize ; lastfontsize = fontsize defaultfont ; +% \stopbuffer +% +% \startbuffer[c] +% primarydef infont primary name = % patched: def should work too +% hide(lastfontsize := fontsize name) +% normalinfont name +% enddef ; +% \stopbuffer +% +% \typebuffer[c] +% +% Because we are replacing an operator, and since \METAPOST\ expects one, we have +% to use \type {def} instead of \type {vardef} (which is actually a kind of +% variable). For the same reason, we have to pick up a \type {primary}. If we would +% use a \typ {expr name}, we would end up in an unwanted look ahead. The \type +% {hide} macro hides the assignment and makes this macro behave like a \type +% {vardef} with respect to hiding expressions. We may not put a semi colon after +% the \type {)} because it would stop \METAPOST\ from reading on, and thereby +% invoke an error message. +% +% We can now define \type {at}. This macro picks up an expression (which can be +% more than just a number) and return a scale transform that normalizes the given +% size to the design size. +% +% \startbuffer[d] +% def at expr size = +% scaled (size/lastfontsize) +% enddef ; +% \stopbuffer +% +% \typebuffer[d] +% +% Because this macro is defined global, and therefore can be used apart from \type +% {infont}, we predefine the size: +% +% \typebuffer[b] +% +% When defined this way \type {at} a comfortable 20 points, the string \type +% {MetaFun} comes out as follows: +% +% \startlinecorrection[blank] +% \processMPbuffer[a,b,c,d,txt] +% \stoplinecorrection + +\stopsection + +\startsection[title={Filling}] + +\index{filling} +\index{reversing} + +In most cases a path ends up being drawn or filled. When filling a path, it +doesn't matter in what direction the path runs, as long as it's closed you're +fine. You can however change the direction any time along the path. Here is an +example of what happens when you fill a path that is partially reversed. + +\startbuffer +fill fullsquare rotated 45 scaled 2cm + withcolor .625 red ; +fill fullcircle scaled 2cm -- reverse fullcircle scaled 1cm -- cycle + withcolor .625 yellow ; +\stopbuffer + +\typebuffer + +You'll notice that the inner circle is not filled: + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +Now watch the following: + +\startbuffer +fill + fullsquare rotated 45 scaled 2cm + -- fullcircle scaled 2cm + -- cycle + withcolor .625 red ; +\stopbuffer + +\typebuffer + +This results in: + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +Compare this with: + +\startbuffer +fill + fullsquare rotated 45 scaled 2cm + -- reverse fullcircle scaled 2cm -- cycle + -- cycle + withcolor .625 red ; +\stopbuffer + +\typebuffer + +giving: + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +The normal filling happens according to the non||zero winding rule. An alternative is the +odd||even rule. There we don't need the reverse trick: + +\startbuffer +eofill fullsquare rotated 45 scaled 2cm + -- fullcircle scaled 2cm -- cycle + withcolor .625 red ; +\stopbuffer + +\typebuffer + +The \type {eofill} is a \METAFUN\ extension. Hopefully the next explains a bit +how this works (you can find explanations zon the internet). + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +\startuseMPgraphic{demo} + def DrawIt(text how) = + path p ; p := ((0,0) .. (1,0) .. (1,1) .. (0,1) .. (1,0) .. (2,1) .. cycle) scaled 2cm ; + how p withcolor .625 yellow ; + draw p withcolor .625 red ; + for i=0 step 0.05 until 1 : + fill arrowheadonpath (p,i) + withcolor .625 red ; + endfor ; + draw (0.5,0.5) scaled 2cm withpen pencircle scaled .5mm withcolor .375 white ; + draw ((0.5,0.5) scaled 2cm -- llcorner p) withpen pencircle scaled .5mm withcolor .375 white ; + draw (1.5,1.5) scaled 2cm withpen pencircle scaled .5mm withcolor .375 white ; + draw ((1.5,1.5) scaled 2cm -- urcorner p) withpen pencircle scaled .5mm withcolor .375 white ; + enddef ; +\stopuseMPgraphic + +\startlinecorrection[blank] + \startcombination[distance=4em] + {\startMPcode \includeMPgraphic{demo} DrawIt(eofill) \stopMPcode} {\type{eofill}} + {\startMPcode \includeMPgraphic{demo} DrawIt(fill) \stopMPcode} {\type{fill}} + \stopcombination +\stoplinecorrection + +In the case of a normal fill, the non||zero winding rule is applied: a winding +number is calculated by subtracting 1 each time the line (from inside an area to +someplace outside) is crossed clockwise while 1 is added each time we cross +anti||clockwise. When the total is non zero the area is filled. Here we run in one +direction and therefore we always get a fill. In the previous example where we +used a reverse, an anti||clockwise crossing was nilled by a clockwise one. + +The leftmost shape uses \type {eofill} and therefore the odd||even rule gets +applied. This time we follow the line and when it gets crossed en even number of +times the area will not be filled. + +A glyph is often constructed from more than one path and eventually the shape is +filled with an odd||even fill (\type {eofill}) operation. Take the following +sequence: + +\startbuffer +pickup pencircle scaled 1mm ; +draw fullsquare scaled 2cm ; +draw fullsquare scaled 2cm shifted (1cm,0) ; +draw fullsquare scaled 2cm shifted (0,1cm) ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +We can use a sequence of \type {nofill} ending with a \type {eofill} to create +a combined shape. This is not done in \METAPOST\ but in the backend. + +\startbuffer +nofill fullsquare scaled 2cm ; +nofill fullsquare scaled 2cm shifted (1cm,0) ; +eofill fullsquare scaled 2cm shifted (0,1cm) ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +As this is used for glyphs, we demonstrate this mechanism with a simple \type {O} +shape: + +\startbuffer +nofill fullcircle xyscaled (2cm,3cm) ; +eofill fullcircle xyscaled (1cm,2cm) ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +Another backend related feature is \type {fillup}. This is just a combination +of a fill and a draw in one go. It can save some bytes in the output file. + +\startbuffer +draw image ( + pickup pencircle scaled 5mm ; + fill fullsquare scaled 2cm ; + draw fullsquare scaled 2cm ; + fillup fullsquare scaled 2cm shifted (4cm,0) ; +) withcolor .625red ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +\stopsection + +\startsection[title={Pitfalls}] + +When writing macros, you need to be careful in what +operations apply to what object. There is for instance a +difference between the following code: + +\startbuffer +pickup pencircle scaled 2pt ; +draw (0,0)--(0,1)--(1,1) scaled 1cm withcolor .625 red ; +draw ((0,0)--(0,1)--(1,1)) scaled 2cm withcolor .625 yellow ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +The \type {scaled} operates on the previous expression which in the first case is +the point \type {(1,1)} and in the second case the whole path. + +\startbuffer +pickup pencircle scaled 2pt ; +draw (0,0)--(0,1)--(1,1)--cycle scaled 1cm withcolor .625 red ; +draw ((0,0)--(0,1)--(1,1)--cycle) scaled 2cm withcolor .625 yellow ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +Here the last element in the first case is not the cycle, and the next +alternative does not help us much in discovering what is going on. (Well, at +least something {\em is} going on, because the result seems to have some +dimensions.) + +\startbuffer +pickup pencircle scaled 2pt ; +draw (1,1)--cycle scaled 1cm withcolor .625 red ; +draw ((1,1)--cycle) scaled 1cm withcolor .625 yellow ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +The next lines demonstrate that we're dealing with the dark sides of \METAPOST, +and from that we may conclude that in case of doubt it's best to add parenthesis +when such fuzzy situations threaten to occur. + +\startbuffer +pickup pencircle scaled 2pt ; +draw (0,1)--(1,1)--cycle scaled 1cm withcolor .625 red ; +draw ((0,1)--(1,1)--cycle) scaled 1cm withcolor .625 yellow ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +There are more cases where the result may surprise you. Take the following code: + +\startbuffer +drawarrow ((0,0)--(10,0)) + withpen pencircle scaled 2pt + withcolor red randomized (.4,.9) ; +currentpicture := currentpicture scaled 8 ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +The arrow is made up out of two pieces and each piece gets a different shade of +red. This is because the attributes are collected and applied to each of the +components that make up the arrow. Because for each component the attribute code +is expanded again, we get two random colors. One way around this is to apply the +color afterwards. + +\startbuffer +draw + image (drawarrow ((0,0)--(10,0)) withpen pencircle scaled 2pt) + scaled 8 withcolor red randomized (.4,.9) ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +Here the \type {image} macro creates a picture and as you can see, this provides +a way to draw within a draw operation. + +Once you see the benefits of \type {image}, you will use it frequently. Another +handy (at first sight strange) macro is \type {hide}. You can use this in +situations where you don't want code to interfere. + +\starttyping +def mydraw text t = + boolean error ; error := false ; + def withpencil expr p = hide (error := true) enddef ; + draw t ; + if error : message "pencils are not supported here" fi ; +enddef ; +mydraw fullcircle scaled 10cm withpencil sharp ; +\stoptyping + +Here, setting the boolean normally interferes with the draw operation, but by +hiding the assignment, this code becomes valid. This code will bring the message +to your terminal and log file. + +Once you start using expressions you have a good chance of encountering messages +with regard to redundant expressions. The following code is for instance a +recipe for problems: + +\starttyping +z1 = (1,0) ; z1 = (2,0) ; +\stoptyping + +Changing the \type {=} into \type {:=} helps, but this may not be what you want. + +Because the \type {z}||variables are used frequently, they are reset each figure. +You can also reset them yourself, using the \type {clearxy} macro. The \METAFUN\ +version clears all \type {z}||variables, unless you explictly specify what +variables to reset. \footnote {This version resulted from a discussion on the +\METAFONT\ discussion list and is due to Bogus\l{}aw Jackowski.} If you want to +play with this macro, see what happens when you run the following code: + +\starttyping +show x0 ; z0 = (10,10) ; +show x0 ; x0 := whatever ; y0 := whatever ; +show x0 ; z0 = (20,20) ; +show x0 ; clearxy 0 ; +show x0 ; z0 = (30,30) ; +\stoptyping + +So, the following calls are all legal: + +\starttyping +clearxy ; clearxy 1 ; clearxy 1, 8, 10 ; +\stoptyping + +Keep in mind that for each figure a full clear is done anyway. You should not +confuse this command with \type {clearit}, which clears \type {currentpicture}. + +\stopsection + +\startsection[title={\TeX\ versus \MetaPost}] + +If you are defining your own \TEX\ and \METAPOST\ macros, you will notice that +there are a couple of essential differences between the two macro languages. In +\TEX\ the following code is invalid. \footnote {In \ETEX\ the calculation can be +done in less lines using a \type {\numexpr}.} + +\starttyping +\def\fancyplied#1% + {\ifnum#1=0 + \message{zero argument}% + \fi + \count0=#1 \multiply \count0 by \count0 + \count2=#1 \multiply \count2 by 2 + \count4=#1 \divide \count4 by 2 + \advance \count0 by \count2 + \advance \count0 by \count4 + \count4 } +\hskip \fancyplied{3} pt +\stoptyping + +This is because \TEX\ is very strict in what tokens it expects next. In +\METAPOST\ however, you can use \type {vardef}'d macros to hide nasty +intermediate calculations. + +\starttyping +vardef fancyplied expr x = + if x=0 : message "x is zero" ; (x*x+2x+x/2) +enddef ; +a := a shifted (fancyplied 3pt,0) ; +\stoptyping + +Hiding intermediate calculations and manipulations is a very strong point of +\METAPOST. + +Another important difference between both languages is the way grouping is +implemented. Because \TEX\ is dealing with a flow of information, strong grouping +is a must and therefore part of the language. Occasionally you run into +situations where you wished that you could reach over a group (for instance in +order to pass a value). + +In \METAPOST\ grouping behaves quite different. First of all, it provides the +mechanism that hides processing from the current flow. The previously mentioned +\type {vardef} is implicitly grouped. Contrary to \TEX, in \METAPOST\ all +assignments are global by default, even in a group. If you assign a variable +inside a group it is persistent unless you first save the variable (or macro) +using the \type {save} operator. + +So, in the next code snippet, the value of \type {\value} inside the box is {\em +no} but after the box is typeset, it will be {\em yes} again. + +\starttyping +\def\value{yes} \hbox{\def\value{no}\value} \value +\stoptyping + +To make a value local in \METAPOST, the following code is needed. + +\starttyping +string value ; value := "yes" ; +def intermezzo + begingroup ; + save value ; string value ; value := "no" ; + endgroup ; +enddef ; +\stoptyping + +Once you start writing your own \METAPOST\ macros, you will appreciate this +\quote {always global} behaviour. As with other differences between the two +languages, they make sense if you look at what the programs are supposed to do. + +\stopsection + +\startsection[title={Internals and Interims}] + +\index{internals} +\index{interims} + +Related to grouping is the internal numeric datatype. When numeric variables are +defined as interim, you can quickly overload them inside a group. + +\starttyping +newinternal mynumber ; mynumber := 1 ; + +begingroup ; ... interim mynumber := 0 ; ... ; endgroup ; +\stoptyping + +You can only \type {interim} a variable if it is already defined using \type +{newinternal}. + +Among the \METAPOST\ macros is one called \type {drawdot}. This macro is kind of +redundant because, at least at first sight, you can use draw to achieve the same +result. There is however a very subtle difference: a dot is slightly larger than +a drawn point. We guess that it's about the device pixel, so you may not even +notice it. It may even be due to differences in accuracy of the methods to render +them. + +\startbuffer +pickup pencircle scaled 50pt ; +drawdot origin shifted (-120pt,0) ; draw origin shifted (-60pt,0) ; +drawdot origin ; draw origin withcolor white ; +setbounds currentpicture to boundingbox currentpicture enlarged 1pt ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +\stopsection + +\startsection[title=Named colors] + +The \type {withcolor} operator accepts a color expression but in \METAFUN\ it +also accepts a string indicating a color defined at the \TEX\ end. Most helpers +that deal with colors are able to deal with named colors as well. Here are some +examples. First we define a few colors: + +\startbuffer +\definecolor[MyColor1][r=.5] +\definecolor[MyColor2][g=.5] +\definecolor[MyColor3][b=.5] +\definecolor[MyColor4][s=.8] +\stopbuffer + +\typebuffer \getbuffer + +Here we access them: + +\startbuffer +fill fullcircle scaled 12 withcolor "MyColor1" ; +fill fullcircle scaled 10 withcolor "MyColor2" ; +fill fullcircle scaled 8 withcolor complementary "MyColor3" ; +fill fullcircle scaled 6 withcolor complemented "MyColor3" ; +fill fullcircle scaled 4 withcolor "MyColor4" randomized 2 ; +fill fullcircle scaled 2 withcolor "MyColor4" randomized 2 ; +addbackground + withcolor .5[resolvedcolor("MyColor4"),resolvedcolor("MyColor2")] ; +currentpicture := currentpicture ysized 4cm ; +\stopbuffer + +\typebuffer + +And get: + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +\stopsection + +\startsection[title=Formatted text] + +Text support in \METAFUN\ has evolved quite a bit over years. For compatibility +reasons we keep old methods around but in practice one can probably do all with +the following: + +\starttabulate[|T|p|] +\NC textext[.anchor](str) \NC position a text relative to the origin \NC \NR +\NC thetextext[.anchor](str,pos) \NC position a text relative to the given position \NC \NR +\NC rawtextext[.anchor](str,pos) \NC idem but with less checking \NC \NR +\stoptabulate + +If needed all functionality could be combined in one call (textext) but we keep +it this way. + +You need to keep in mind that text in \METAPOST\ is not a first class object but +something virtual that is known to \METAFUN\ as something with path like properties +but is actually dealt with in the backend. This means that timing is important. + +\starttyping +\startMPinitializations +picture p ; p := image(draw textext("Foo");); +\stopMPinitializations + +\startMPcode + picture q ; q := image(draw textext("Bar");); + picture r ; r := image(draw textext("Gnu");); + draw p ; + draw q shifted (2cm,0) ; + draw r shifted (4cm,0) ; +\stopMPcode +\stoptyping + +This will work out well because an initialization is part of a figure, but +this will fail: + +\starttyping +\startMPinclusions +picture p ; p := image(draw textext("Foo");); +\stopMPinclusions +\stoptyping + +because inclusions happen before the local textexts get initialized and +due to the multipass implementation are not seeN a second time. The order of +processing is: + +\starttabulate[|l|c|c|] +\BC action \BC first pass \BC second pass \NC \NR +\NC definitions \NC yes \NC \NC \NR +\NC extensions \NC yes \NC \NC \NR +\NC inclusions \NC yes \NC \NC \NR +\NC begin figure \NC yes \NC yes \NC \NR +\NC initializations \NC yes \NC yes \NC \NR +\NC metapost code \NC yes \NC yes \NC \NR +\NC end figure \NC yes \NC yes \NC \NR +\stoptabulate + +The graph package (that comes with \METAPOST) has some pseudo typesetting on +board needed to format numbers. Because we don't want to interfere with the +definitions of macros used in that package we provide another set of macros for +formatting: \type {fmttext}, \type {thefmttext} and \type {rawfmttext}. + +\startbuffer +\startMPcode +draw thefmttext("\bf@3.2f done",123.45678) withcolor darkred ; +\stopMPcode +\stopbuffer + +\typebuffer + +Here we pass one variable to the format but there can be more: \inlinebuffer. In +\LUA\ the \type {%} is used as format directive but that does not work well in +\TEX\ and \LUA\ which is why we use \type {@} instead. The formatting is done +with the formatters subsystem which is an extension to the regular \LUA\ \type +{format} function. More information can be found in \type {clf-mkiv.pdf} but one +extension is not mentioned there: \type {%!texexp!}. This directive takes one +argument by default but optionally can take one or two extra arguments: the +format of the base number and one for the exponent. The following code +demonstrates this: + +\startbuffer +\startMPcode{doublefun} +draw image ( + draw thefmttext.rt("@!texexp!", 10.4698E30, (0,-1LineHeight)) ; + draw thefmttext.rt("@1!texexp!",10.4698E30, (0,-2LineHeight)) ; + draw thefmttext.rt("@2!texexp!",10.4698E30,"@2.3f", (0,-3LineHeight)) ; + draw thefmttext.rt("@3!texexp!",10.4698E30,false,"@2i", (0,-4LineHeight)) ; + draw thefmttext.rt("@3!texexp!",10.4698E30,"@2.3f","@2i",(0,-5LineHeight)) ; +) withcolor darkblue ; +\stopMPcode +\stopbuffer + +\typebuffer + +We switch to double mode because we use large numbers. + +\startlinecorrection[blank] + \getbuffer +\stoplinecorrection + +Of course this extra formatter is also supported in the \type {context} +command: + +\startbuffer +\startluacode +context("%!texexp!, ", 10.4698E30) +context("%1!texexp!, ", 10.4698E30) +context("%2!texexp!, ", 10.4698E30,"@2.3f") +context("%3!texexp! and ",10.4698E30,false,"@2i") +context("%3!texexp!", 10.4698E30,"@2.3f","@2i") +\stopluacode +\stopbuffer + +\typebuffer + +This gives: \inlinebuffer . + +\stopsection + +\startsection[title=Lists (aka suffixed variables)] + +Sometimes graphics are constructed using lists. There are a few helpers (and +maybe there will be some more) that can make things a bit easier. Say that we +do this: + +\startbuffer +pair a[] ; +a[1] := (0,0) ; a[2] := (1,0) ; +a[3] := (1,1) ; a[4] := (0,1) ; +a[5] := (1,1) ; a[6] := (2,0) ; + +draw topath(a,--) ysized 2cm + withpen pencircle scaled 1mm + withcolor .625red ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +The \type {topath} macro converts the list into a path, in this case an ugly one. + +Say that we want to get rid of the sixth entry. For that we can use the \type +{dispose} macro. You can use the dispose for any type (except a macro). + +\startbuffer +dispose(a[6]) ; +draw topath(a,--) ysized 2cm + withpen pencircle scaled 1mm + withcolor .625yellow ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +We still have some duplicate entries here: + +\startbuffer +dispose(a[6]) ; +drawpoints topath(a,--) ysized 2cm + withpen pencircle scaled 1mm + withcolor .625red ; +drawpointlabels topath(a,--) ysized 2cm ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +These can be removed with: + +\startbuffer +uniquelist(a) ; +draw topath(a,--) ysized 2cm + withpen pencircle scaled 1mm + withcolor .625yellow ; +drawpoints topath(a,--) ysized 2cm + withpen pencircle scaled 1mm + withcolor .625red ; +drawpointlabels topath(a,--) ysized 2cm ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +Sometimes a list needs to be sorted and here is the solution: + +\startbuffer +sortlist(a,nothing) ; +draw topath(a,--) ysized 2cm + withpen pencircle scaled 1mm + withcolor .625red ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +The second argument can be an operator that takes a pair variable: + +\startbuffer +sortlist(a,xpart) ; +draw topath(a,--) ysized 2cm + withpen pencircle scaled 3mm + withcolor .625red ; +sortlist(a,ypart) ; +draw topath(a,--) ysized 2cm + withpen pencircle scaled 2mm + withcolor .625yellow ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +Constructing a list can be sped up with the \type {tolist} macro. + +\startbuffer +pair a[], b[], c[], d[] ; +tolist(a,1,(0,0),(1,0),(1,1),(0,1)--(1,1)--(2,2)) ; +tolist(b,0,(0,0),(1,0),(1,1),(0,1)--(1,1)--(2,2)) ; +tolist(c,(0,0),(1,0),(1,1),(0,1)--(1,1)--(2,2)) ; +tolist(d,(0,0),(1,0),(1,1)) ; + +draw image ( + draw topath(a,--) shifted (0,0) ; + draw topath(b,--) shifted (3,0) ; + draw topath(c,--) shifted (6,0) ; + draw topath(d,--) shifted (9,0) ; +) ysized 2cm withpen pencircle scaled 1mm withcolor .625red ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +\stopsection + +\startsection[title=Segmented paths] + +\index {segmented paths}There are all kind of helpers in \METAFUN\ and some are +discussed here. In \in {figure} [fig:segmentedpaths] we see a few macros that +return a (smooth) path made from segments. You can for instance use these to do +things that use the points on a path, like anchoring text. + +\startbuffer +def DrawSomePath(text t) = + drawpath t withcolor .625red ; + drawpoints t withcolor white ; + drawpointlabels t ; +enddef ; + +DrawSomePath(circularpath(5) scaled 12cm) ; +DrawSomePath(squarepath (5) scaled 8cm) ; +DrawSomePath(linearpath (5) scaled 4cm) ; +\stopbuffer + +\typebuffer + +\startplacefigure[title={A few segmented paths.},reference=fig:segmentedpaths] + \processMPbuffer +\stopplacefigure + +\index {crossing paths}The following examples demonstrates two mechanisms. In the +image two paths are drawn on top of each other but one of them has holes where +the other one crosses. The \type {crossingunder} macro was written by Alan +Braslau as part of the node based diagram builder. In the process the arrow +drawing code was adapted to accept a picture. + +\startbuffer[a] +drawarrow image ( + draw ((fullcircle scaled 2.25cm) crossingunder (fullsquare scaled 2cm)) + withpen pencircle scaled 1mm withcolor .625green ; + draw (fullsquare scaled 2cm) + withpen pencircle scaled 1mm withcolor .625blue ; +) ; +drawarrow image ( + draw (fullsquare scaled 4cm) + withpen pencircle scaled 1mm withcolor .625red ; + draw ((fullcircle scaled 5cm) crossingunder (fullsquare scaled 4cm)) + withpen pencircle scaled 1mm withcolor .625yellow ; +) ; +\stopbuffer + +\startbuffer[b] +drawarrow image ( + draw ((fullsquare scaled 2cm) crossingunder (fullcircle scaled 2.25cm)) + withpen pencircle scaled 1mm withcolor .625blue ; + draw (fullcircle scaled 2.25cm) + withpen pencircle scaled 1mm withcolor .625green ; +) ; +drawarrow image ( + draw (fullcircle scaled 5cm) + withpen pencircle scaled 1mm withcolor .625yellow ; + draw ((fullsquare scaled 4cm) crossingunder (fullcircle scaled 5cm)) + withpen pencircle scaled 1mm withcolor .625red ; +) ; +\stopbuffer + +\typebuffer[a] + +The next variant uses a different order: + +\typebuffer[b] + +The results are shown in \in {figure} [fig:crossingunder]. The internal variable +\type {crossingscale} can be used to make the gap wider or narrower. The gap has +a default value of 20. + +\startplacefigure[title=Crossing paths without touching,reference=fig:crossingunder] + \startcombination + {\processMPbuffer[a]} {} + {\processMPbuffer[b]} {} + \stopcombination +\stopplacefigure + +\stopsection + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/metafun/metafun-colofon-paper.tex b/doc/context/sources/general/manuals/metafun/metafun-colofon-paper.tex new file mode 100644 index 000000000..1a611a325 --- /dev/null +++ b/doc/context/sources/general/manuals/metafun/metafun-colofon-paper.tex @@ -0,0 +1,19 @@ +% language=uk +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\startcomponent metafun-colofon-paper + +\environment metafun-environment + +\startstandardmakeup + + \vfill + + \setupalign[flushright,broad] + + \component metafun-colofon + +\stopstandardmakeup + +\stopcomponent diff --git a/doc/context/sources/general/manuals/metafun/metafun-colofon-screen.tex b/doc/context/sources/general/manuals/metafun/metafun-colofon-screen.tex new file mode 100644 index 000000000..590c7725f --- /dev/null +++ b/doc/context/sources/general/manuals/metafun/metafun-colofon-screen.tex @@ -0,0 +1,21 @@ +% language=uk +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\startcomponent metafun-colofon-screen + +\environment metafun-environment + +\page + +\start + + \setupalign[flushright,broad] + + \component metafun-colofon + +\stop + +\page + +\stopcomponent diff --git a/doc/context/sources/general/manuals/metafun/metafun-colofon.tex b/doc/context/sources/general/manuals/metafun/metafun-colofon.tex new file mode 100644 index 000000000..b4c162a89 --- /dev/null +++ b/doc/context/sources/general/manuals/metafun/metafun-colofon.tex @@ -0,0 +1,56 @@ +% language=uk +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\startcomponent metafun-colofon + +\environment metafun-environment + +\introsubject{For them} + +I owe much inspiration to both my parents. My mother Jannie constantly +demonstrated me that computer graphics will never improve nature. She also +converted one of my first \METAPOST\ graphics into a patchwork that will remind +me forever that handcraft is more vivid than computer artwork. My father Hein has +spent a great deal of his life teaching math, and I'm sure he would have loved +\METAPOST. I inherited his love for books. I therefore dedicate this document to +them. + +\introsubject{Colofon} + +This manual is typeset with \CONTEXT\ \MKIV. No special tricks are used and +everything you see in here, is available for \CONTEXT\ users. The text is typeset +in Palatino and Computer Modern Typewriter. We used \LUATEX\ as \TEX\ processing +engine. Since this document is meant to be printed in color, some examples will +look sub||optimal when printed in black and white. + +\introsubject{Graphics} + +The artist impression of one of Hasselts canals at \at {page} [canal] is made by +Johan Jonker. The \CDROM\ production process graphic at \at {page} [hacker] is a +scan of a graphic made by Hester de Weert. + +\introsubject{Copyright} + +\startlines +Hans Hagen, PRAGMA Advanced Document Engineering, Hasselt NL +copyright: 1999-\currentdate[year] / version 4: \currentdate +\stoplines + +\introsubject{Publisher} + +\startlines +publisher: Boekplan, NL +isbn-ean: 978-94-90688-02-8 +website: www.boekplan.nl +\stoplines + +\introsubject{Info} + +\startlines +internet: www.pragma-ade.com +support: ntg-context@ntg.nl +context: www.contextgarden.net +\stoplines + +\stopcomponent diff --git a/doc/context/sources/general/manuals/metafun/metafun-contents.tex b/doc/context/sources/general/manuals/metafun/metafun-contents.tex new file mode 100644 index 000000000..0767a0248 --- /dev/null +++ b/doc/context/sources/general/manuals/metafun/metafun-contents.tex @@ -0,0 +1,17 @@ +% language=uk +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\startcomponent metafun-contents + +\environment metafun-environment + +\starttitle[reference=content,title={Content}] + + \startcolumns + \placelist[chapter,section] + \stopcolumns + +\stoptitle + +\stopcomponent diff --git a/doc/context/sources/general/manuals/metafun/metafun-conventions.tex b/doc/context/sources/general/manuals/metafun/metafun-conventions.tex new file mode 100644 index 000000000..6a6072c56 --- /dev/null +++ b/doc/context/sources/general/manuals/metafun/metafun-conventions.tex @@ -0,0 +1,117 @@ +% language=uk +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\startcomponent metafun-conventions + +\environment metafun-environment + +\startchapter[title={Conventions}] + +\index {running} +\index {processing} + +When reading this manual, you may be tempted to test the examples shown. This can +be done in several ways. You can make a file and process that file by \METAPOST. +Such a file looks like: + +\starttyping +beginfig(1) ; + fill fullcircle scaled 5cm withcolor red ; % a graphic +endfig ; + +end . +\stoptyping + +Don't forget the semi||colons that end the statements. If the file is saved as +\type {yourfile.mp}, then the file can be processed. Before we process this file, +we first need to load some basic \METAPOST\ definitions, because the built in +repertoire of commands is rather limited. Such a set is called a format. The +standard format is called {metapost} but we will use a more extensive set of +macros \type {metafun}. In the past such a set was converted into a \type {mem} +file and running the above file was done with: + +\starttyping +mpost --mem=metafun.mem yourfile +\stoptyping + +However, this is no longer the case and macros need to be loaded at startup as +follows: + +\starttyping +mpost --ini metafun.mpii yourfile.mp +\stoptyping + +Watch the suffix \type {mpii}: this refers to the stand alone, the one that +doesn't rely on \LUATEX. + +After the run the results are available in \type {yourfile.1} and can be viewed +with \GHOSTSCRIPT. You don't need to close the file so reprocessing is very +convenient. + +Because we will go beyond standard \METAPOST, we will use the \type {mpiv} files. +These work with the library which in turn means that we will run from within +\CONTEXT. This has the advantage that we also have advanced font support at our +hands. In that case, a simple file looks like: + +\starttyping +\starttext + \startMPpage + fill fullcircle scaled 5cm withcolor red ; + \stopMPpage + \startMPpage + fill unitsquare scaled 5cm withcolor red ; + \stopMPpage +\stoptext +\stoptyping + +If the file is saved as \type {yourfile.tex}, then you can produce a \PDF\ file +with: \footnote {In fact, you could also process the \METAPOST\ file directly +because the \type {context} script will recognize it as such and wrap it into +a page.} + +\starttyping +context yourfile +\stoptyping + +The previous call will use \LUATEX\ and \CONTEXT\ \MKIV\ to produce a file with +two pages using the built in \METAPOST\ library with \METAFUN. When you use this +route you will automatically get the integrated text support shown in this +manual, including \OPENTYPE\ support. If one page is enough, you can also say: + +\starttyping +\startMPpage +fill fullcircle scaled 5cm withcolor red ; +\stopMPpage +\stoptyping + +So when you have a running \CONTEXT\ on your system you don't need to bother +about installing \METAPOST\ and running \METAFUN. + +We will use lots of color. Don't worry if your red is not our red, or your yellow +does not match ours. We've made color definitions to match the overall design of +this document, but you should feel free to use any color of choice in the +upcoming examples. + +By default, \CONTEXT\ has turned its color mechanism on. If you don't want your +graphics to have color, you should say: + +\starttyping +\setupcolors[state=stop] +\stoptyping + +but in todays documents color is so normal that you will probably never do that. +Because \METAFUN\ hooks into the \CONTEXT\ color mechanism, you can also use its +color space and conversion related features. + +You need to keep in mind that just like \CONTEXT\ \MKII\ is frozen, the \type +{mpii} macros are also not extended. From now on we assume that you use \CONTEXT\ +\MKIV\ which exclusively uses \type {mpiv} macros. + +Even if you want to use \METAFUN\ but not \CONTEXT, you can still best use the +mentioned page method as it will give you decent text processing. You need to +know (and use) only a few \CONTEXT\ commands then. + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/metafun/metafun-debugging.tex b/doc/context/sources/general/manuals/metafun/metafun-debugging.tex new file mode 100644 index 000000000..4174d34e1 --- /dev/null +++ b/doc/context/sources/general/manuals/metafun/metafun-debugging.tex @@ -0,0 +1,383 @@ +% language=uk +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\startcomponent mfun-debugging + +\environment metafun-environment + +\startchapter[reference=sec:debugging,title={Debugging}] + +\index{debugging} + +\startintro + +Those familiar with \CONTEXT\ will know that it has quite some visual debugging +features build in. So, what can you expect of the \METAPOST\ macros that come +with \CONTEXT ? In this chapter we will introduce a few commands that show some +insight in what \METAPOST\ is doing. + +\stopintro + +\startsection[title=Showing paths] + +Since the outcome of \METAPOST\ code is in many respects more predictable than +that of \TEX\ code, we don't need that advanced visual debugging features. +Nevertheless we provide a few, that are all based on visualizing paths. + +\startbuffer +path p ; p := fullcircle scaled 4cm ; +drawpath p ; drawpoints p ; drawpointlabels p ; +\stopbuffer + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +This visualization is achieved by using dedicated drawing commands: + +\typebuffer + +Since control points play an important role in defining the shape, visualizing +them may shed some insight in what \METAPOST\ is doing. + +\startbuffer +path p ; p := fullcircle xscaled 4cm yscaled 3cm ; +drawpath p ; drawcontrollines p ; +drawpoints p ; drawcontrolpoints p ; drawpointlabels p ; +\stopbuffer + +\typebuffer + +The pre and post control points show up as small dots and are connected to their +parent point with thin lines. + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +You can deduce the direction of a path from the way the +points are numbered, but using an arrow to indicate the +direction is more clear. + +\startbuffer +path p ; p := fullcircle xscaled 4cm yscaled 3cm ; +drawarrowpath p ; drawcontrollines p ; +drawpoints p ; drawcontrolpoints p ; drawpointlabels p ; +\stopbuffer + +\typebuffer + +The \type {drawarrowpath} is responsible for the arrow. Especially when you are +in the process of defining macros that have to calculate intersections or take +subpaths, knowing the direction may be of help. + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +The next table summarizes the special drawing commands: + +\starttabulate[|lT|l|] +\HL +\NC drawpath \NC the path \NC \NR +\NC drawarrowpath \NC the direction of the path \NC \NR +\NC drawcontrollines \NC the lines to the control points \NC \NR +\NC drawpoints \NC the points that make up the path \NC \NR +\NC drawcontrolpoints \NC the control points of the points \NC \NR +\NC drawpointlabels \NC the numbers of the points \NC \NR +\HL +\stoptabulate + +You can set the characteristics of these like you set \type {drawoptions}. The +default settings are as follows: + +\starttyping +drawpathoptions (withpen pencircle scaled 5 withcolor .8white) ; +drawpointoptions (withpen pencircle scaled 4 withcolor black) ; +drawcontroloptions(withpen pencircle scaled 2.5 withcolor black) ; +drawlineoptions (withpen pencircle scaled 1 withcolor .5white) ; +drawlabeloptions () ; +\stoptyping + +Two more options are \type {draworiginoptions} and \type {drawboundoptions} which +are used when visualizing the bounding box and origin. + +\startbuffer +swappointlabels := true ; +path p ; p := fullcircle xscaled 4cm yscaled 3cm ; +drawarrowpath p ; drawcontrollines p ; +drawpoints p ; drawcontrolpoints p ; drawpointlabels p ; +drawboundingbox p ; draworigin ; +\stopbuffer + +\typebuffer + +In this example we have set \type {swappointlabels} to change the place of the +labels. You can set the variable \type {originlength} to tune the appearance of +the origin. + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +You can pass options directly, like you do with \type {draw} and \type {fill}. +Those options override the defaults. + +\startbuffer +path p ; p := fullcircle xscaled 6cm yscaled 3cm rotated 15 ; +drawarrowpath p ; +drawcontrollines p withcolor .625red ; +drawpoints p withcolor .625yellow ; +drawcontrolpoints p withcolor .625yellow ; +drawpointlabels p withcolor .625yellow ; +drawboundingbox p ; +draworigin withcolor .625red ; +\stopbuffer + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +Here we used the options: + +\typebuffer + +Sometimes it makes sense to draw a simple coordinate system, and for that purpose +we have three more macros. They draw axis and tickmarks. + +\startbuffer +drawticks unitsquare xscaled 4cm yscaled 3cm shifted (-1cm,-1cm) ; +\stopbuffer + +\typebuffer + +The system drawn is based on the bounding box specification of the path passed to +the macro. You can also draw one axis, using \type {drawxticks} or \type +{drawyticks}. Here we show the previous command. + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +By default, the ticks are placed at .5cm distance, but you can change this by +setting \type {tickstep} to a different value. + +\startbuffer +tickstep := 1cm ; ticklength := 2mm ; +drawticks fullsquare xscaled 4cm yscaled 3cm ; +tickstep := tickstep/2 ; ticklength := ticklength/2 ; +drawticks fullsquare xscaled 4cm yscaled 3cm ; +\stopbuffer + +\typebuffer + +The \type {ticklength} variable specifies the length of a tick. Here we +manipulated both the variables to get a more advanced system. + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +If visualizing a path would mean that we would have to key in al those +draw||commands, you could hardly call it a comfortable tool. Therefore, we can +say: + +\startbuffer +drawwholepath fullsquare scaled 3cm rotated 30 randomized 5mm ; +\stopbuffer + +\typebuffer + +The \type {drawwholepath} command shows everything except the axis. + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +If even this is too much labour, you may say: + +\starttyping +visualizepaths ; +\stoptyping + +This redefines the \type {draw} and \type {fill} command in such a way that they +also show all the information. + +\startbuffer +visualizepaths ; +draw fullsquare scaled 3cm rotated 30 randomized 2mm ; +\stopbuffer + +\typebuffer + +You may compare this feature to the \type {\showmakeup} command available in +\CONTEXT, that redefines the \TEX\ primitives that deal with boxes, glues, +penalties, and alike. + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +Of course you may want to take a look at the \METAPOST\ manual for its built in +(more verbose) tracing options. One command that may prove to be useful is \type +{show}, that you can apply to any variable. This command reports the current +value (if known) to the terminal and log file. + +\startlinecorrection[blank] +{\showmakeup\processMPbuffer} +\stoplinecorrection + +The previous picture shows what is typeset when we also say \type {\showmakeup}. +This command visualizes \TEX's boxes, skips, kerns and penalties. As you can see, +there are some boxes involved, which is due to the conversion of \METAPOST\ +output to \PDF. + +\starttyping +\startlinecorrection[blank] +... the graphic ... +\stoplinecorrection +\stoptyping + +The small bar is a kern and the small rectangles are penalties. More details on +this debugger can be found in the \CONTEXT\ manuals and the documentation of the +modules involved. + +\stopsection + +\startsection[title=Comments] + +Sometimes, when trouble strikes, you might want to peek in the \PDF\ file to see +what gets written there. Each graphic is marked with a number but when you +have many it might make sense to add a comment to help you locate the code. + +\startbuffer +\startMPcode + comment("test graphic") ; + message("processing a test graphic") ; + draw fullsquare scaled 1cm ; +\stopMPcode +\stopbuffer + +\typebuffer + +This renders as: + +\startlinecorrection[blank] + \getbuffer +\stoplinecorrection + +On the console we get these messages: + +\starttyping +metapost > message : processing a test graphic +metapost > warning : processing a test graphic +\stoptyping + +And in the \PDF\ file we will find: + +\starttyping +% mps graphic 1: begin +% mps graphic 1: test graphic +q 0 g 0 G 10 M 1 j 1 J +0.500000000 w +-14.173233032 -14.173233032 m +14.173233032 -14.173233032 l +14.173233032 14.173233032 l +-14.173233032 14.173233032 l +-14.173233032 -14.173233032 l +h S +0 g 0 G Q +% mps graphic 1: end +\stoptyping + +Here are some examples of constructed messages: + +\starttyping +message "2: okay (done)" ; +message "1: " & dq & "okay" & dq & " (done)" ; +message "3: " & quotation "okay" & " (done)" ; +message "3: " & quote "okay" & " (done)" ; +message "4: " & quotation 123 & " (done)" ; +message "5: " & quotation true & " (done)" ; +message "6: " & quote true & " (done)" ; +message "7: " & tostring true & " (done)" ; +message "8: " & tostring (1,2) & " (done)" ; +message "9: " & topair (1,2) & " (done)" ; +\stoptyping + +and this is what you get: + +\starttyping +metapost > message : 2: okay (done) +metapost > message : 1: "okay" (done) +metapost > message : 3: "okay" (done) +metapost > message : 3: 'okay' (done) +metapost > message : 4: "123" (done) +metapost > message : 5: "true" (done) +metapost > message : 6: 'true' (done) +metapost > message : 7: true (done) +metapost > message : 8: 1 2 (done) +metapost > message : 9: (1,2) (done) +\stoptyping + +\stopsection + +\startsection[title=Pens] + +A circular pen is applied to a path in a different way than for instance a +square pen. Circular pens are mapped onto \POSTSCRIPT\ pens while for other +pens an outline is calculated that gets filled. Take this code: + +\startbuffer[a] +\startMPcode + draw fullcircle xscaled 6cm yscaled 3cm + withpen pensquare scaled 5mm rotated 30 + withcolor .625yellow ; +\stopMPcode +\stopbuffer + +\startbuffer[b] +\startMPcode + draw envelope pensquare scaled 5mm rotated 30 of + (fullcircle xscaled 6cm yscaled 3cm) + withpen pencircle scaled 1mm + withcolor .375white ; +\stopMPcode +\stopbuffer + +\startbuffer[c] +\enabletrackers[metapost.forcestroke] +\startMPcode + draw fullcircle xscaled 6cm yscaled 3cm + withpen pensquare scaled 5mm rotated 30 + withcolor .625red ; +\stopMPcode +\disabletrackers[metapost.forcestroke] +\stopbuffer + +\typebuffer[a] + +and this: + +\typebuffer[b] + +and: + +\typebuffer[c] + +When we overlay these three we get. The envelope only returns the outer curve. + +\startlinecorrection[blank] +\startoverlay + {\getbuffer[a]} + {\getbuffer[b]} + {\getbuffer[c]} +\stopoverlay +\stoplinecorrection + +\stopsection + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/metafun/metafun-document.tex b/doc/context/sources/general/manuals/metafun/metafun-document.tex new file mode 100644 index 000000000..bb5540850 --- /dev/null +++ b/doc/context/sources/general/manuals/metafun/metafun-document.tex @@ -0,0 +1,118 @@ +% language=uk +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\startcomponent metafun-document + +\environment metafun-environment + +\startchapter[title={This document}] + +\startintro + +This document is produced in \CONTEXT\ and can serve as an example of how to +integrate \METAPOST\ graphics into \TEX. In this appendix we will discuss some +details of producing this document. + +\stopintro + +We did not use any special tricks, so most of the examples you have seen are +coded just as shown. We used buffers to ensure that the code used to produce the +accompanying graphic is identical to the typeset code in the document. Here is an +example. + +\starttyping +\startbuffer[dummy] +draw fullcircle + xscaled 3cm yscaled 2cm + rotatedaround(origin,30) + withcolor .625red ; +\stopbuffer +\stoptyping + +Instead of using \type {\getbuffer}, we used the following command: + +\starttyping +\startlinecorrection[blank] +\processMPbuffer[dummy] +\stoplinecorrection +\stoptyping + +The line correction commands take care of proper spacing around the graphic. If +you want to process more buffers at once, you can pass their names as a comma +separated list. Alternatively, we could have said: + +\starttyping +\startuseMPgraphic{dummy} + draw fullcircle + xscaled 3cm yscaled 2cm + rotatedaround(origin,30) + withcolor .625red ; +\stopuseMPgraphic +\stoptyping + +When including this graphic, we again take care of spacing. + +\starttyping +\startlinecorrection[blank] +\useMPgraphic{dummy} +\stoplinecorrection +\stoptyping + +The first version of this manual was produced with \PDFTEX\ and call|-|outs to +\METAPOST. Because the number of graphics is large, we processed that version +using the \type {--automp} directive (at that moment we were using \TEXEXEC). And +even then runtime was so unconveniently long that updating this manual became +less and less fun. The current version is produced with \LUATEX\ and \CONTEXT\ +\MKIV, which brings down the runtime (including runtime calls to independent +\CONTEXT\ runs for the outline examples) to some 45 seconds on a 2.2 Gig Dell +M90. Given that (at the time of writing this) over 1700 graphics are generated on +the fly, this is not bad at all. On my current machine, a Dell M6700 with an +Intel Core i7|-|3840QM running at 2.8 (3.9) Ghz (and Windows~8) the runtime of +the third version was just above 20 seconds all|-|in and some 25\percent\ less +when using \LUAJITTEX. When I started with updating to version 4 of this manual, +I timed about 15 seconds on the same machine (but with Windows-10) which means +that in the meantime the \CONTEXT|/|\LUATEX\ combination gained some 25\% +performance. Using the new Bash|-|On|-|Windows subsystem gives the same +performance. Of course each update adds pages so in the end we need more time +with each update but it remains a nice test case. The tight integration of \TEX, +\METAPOST\ and \LUA\ pays off. + +The document style is not that complicated. The main complication in such a +document is to make sure that \METAPOST\ is operating under the same font regime, +but in \MKIV\ this happens automatically. As document font we use the URW +Palatino for the running text combined with Computer Modern Typewriter. Because +this document is available as paper and screen document, some large graphics are +scaled down in the screen version. + +We don't use any special tricks in typesetting this document, but when we added +the section about transparency, a dirty trick was needed in a few cases in order to +get the described results. Because the screen document has gray backgrounds, +exclusive transparencies come out \quote {wrong}. In the function drawing example +we use the following trick to get a black background behind the graphics only. We +have a buffer that contains a few lines of code: + +% buffer only available in screen mode + +\starttyping +picture savedpicture ; +savedpicture := currentpicture ; +currentpicture := nullpicture ; +draw savedpicture withcolor black ; +draw savedpicture ; +\stoptyping + +Since we use buffers for the graphics as well, we can now process a buffer with +name \type {example} as follows: + +\starttyping +\processbuffer[example,wipe] +\stoptyping + +This means that the example code is included two times. After it is processed, we +recolor the currentpicture black, and after that we add the original picture once +again. + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/metafun/metafun-effects.tex b/doc/context/sources/general/manuals/metafun/metafun-effects.tex new file mode 100644 index 000000000..74e7d487e --- /dev/null +++ b/doc/context/sources/general/manuals/metafun/metafun-effects.tex @@ -0,0 +1,2596 @@ +% language=uk +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +% graphic text takes 5 sec on 21 + +\startcomponent metafun-effects + +\environment metafun-environment + +\useMPlibrary[outlines] + +\startchapter[reference=sec:effects,title={Special effects}] + +\startintro + +Sometimes we want to go beyond \METAPOST's native features. Examples of such an +extension are \CMYK\ colors, shading and transparency. Although features like +this should be used with care, sometimes the documents look and feel can profit +from it. + +If you don't want the whole graphic, but only a part of it, clipping comes into +play. In addition to the standard clipping features, we can use \METAPOST\ to +provide a decent clipping path. In this chapter we will uncover the details. + +We will also introduce ways to include externally defined graphics and outline +fonts. We will demonstrate that within reasonable bounds you can manipulate such +graphics. + +\stopintro + +\startsection[title={Spot colors}] + +You can define spot and multitone colors directly in \METAFUN, although normally +you will do it at the \TEX\ end for consistency. At the \TEX\ end we define this: + +\startbuffer +\definecolor [SpotBlue] [c=1,m=.38,y=0,k=.64] +\definecolor [SpotYellow] [c=0,m=.28,y=1,k=.06] +\definemultitonecolor [MultiColor] [SpotBlue=.5,SpotYellow=.25] +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer +draw image ( + fill unitsquare shifted (7,0) + withcolor namedcolor("MultiColor") ; + fill unitsquare shifted (6,0) + withcolor .6 * spotcolor("temp1",red) ; + fill unitsquare shifted (5,0) + withcolor .4 * spotcolor("temp1",red) ; + fill unitsquare shifted (4,0) + withcolor .5 * spotcolor("temp2",.5green) ; + fill unitsquare shifted (3,0) + withcolor .5 * spotcolor("temp3",green) ; + fill unitsquare shifted (2,0) + withcolor multitonecolor("temp4",blue/2,yellow/2,green/2,magenta/3) ; +) xsized TextWidth ; +\stopbuffer + +Next we process this graphic: + +\typebuffer + +and get: + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +\stopsection + +\startsection[title={Transparency}] + +\index{transparency} + +{\em In the screen version we use a light gray background color. As a result, +some of the transparency methods demonstrated here give unexpected results. The +A4 version of this document demonstrates the real effects.} + +Although transparent colors have been around for some time already, it was only +around 2000 that they made it as a high level feature into document format +languages like \PDF. Supporting such a feature at a higher abstraction level is +not only more portable, but also less sensitive for misinterpretation. + +\startbuffer[mpdef] +vardef ColorCircle (expr method, factor, ca, cb, cc) = + save u, p ; path p ; p := fullcircle shifted (1/4,0) ; + image + ( fill p rotated 90 withcolor ca withtransparency (method,factor) ; + fill p rotated 210 withcolor cb withtransparency (method,factor) ; + fill p rotated 330 withcolor cc withtransparency (method,factor) ; ) +enddef ; +\stopbuffer + +\typebuffer[mpdef] + +\startbuffer[mp] +draw ColorCircle ("normal", .5, red, green, blue) xsized 3cm ; +currentpicture := currentpicture shifted (-4cm,0) ; +draw ColorCircle ("exclusion", .5, red, green, blue) xsized 3cm ; +currentpicture := currentpicture shifted (-4cm,0) ; +draw ColorCircle ("exclusion", 1, red, green, blue) xsized 3cm ; +\stopbuffer + +\typebuffer[mp] + +\startlinecorrection[blank] +\processMPbuffer[mpdef,mp] +\stoplinecorrection + +\startbuffer[mp] +cmykcolor xcyan ; xcyan := (1,0,0,0) ; +cmykcolor xmagenta ; xmagenta := (0,1,0,0) ; +cmykcolor xyellow ; xyellow := (0,0,1,0) ; + +draw ColorCircle ("exclusion", .5, xcyan, xmagenta, xyellow) xsized 3cm ; +\stopbuffer + +\typebuffer[mp] + +\startlinecorrection[blank] +\processMPbuffer[mpdef,mp] +\stoplinecorrection + +You can be tempted to use transparency as a convenient way to achieve soft +colors. In that case you should be aware of the fact that rendering transparent +colors takes more time than normal colors \footnote {When your printer does not +support this feature natively, the intermediate (\POSTSCRIPT) file send to the +printing engine is also larger.} + +Fortunatey, \METAPOST\ provides a similar mechanism. The last circle in the +following row demonstrates how we can trigger colors proportionally to other +colors. Normally \type {background} is white, but you can set predefined color +variables to another value. + +\startbuffer[mp] +path p ; p := fullcircle scaled 2cm ; +fill p shifted (0cm,0) withcolor blue ; +fill p shifted (3cm,0) withcolor .5blue ; +fill p shifted (6cm,0) withcolor transparent (1,0.5,blue) ; +fill p shifted (9cm,0) withcolor .5[blue,white] ; +\stopbuffer + +\typebuffer[mp] + +\startlinecorrection[blank] +\processMPbuffer[mp] +\stoplinecorrection + +The next series demonstrates that we use the complementary factor \type {.7} in +the \METAPOST\ soft color to achieve the same softness as the \type {.3} +transparency. + +\startbuffer[mp] +path p ; p := fullcircle scaled 2cm ; +fill p shifted (0cm,0) withcolor red ; +fill p shifted (3cm,0) withcolor .7red ; +fill p shifted (6cm,0) withcolor transparent (1,0.3,red) ; +fill p shifted (9cm,0) withcolor .7[red,white] ; +\stopbuffer + +\typebuffer[mp] + +\startlinecorrection[blank] +\processMPbuffer[mp] +\stoplinecorrection + +\startbuffer[mp] +vardef SampleText (expr t, c) = + save p ; picture p ; + p := image (draw t infont "\truefontname{Regular}") ; + draw (p shifted (- xpart center p,0)) scaled 5 withcolor c; +enddef ; + +SampleText ("Much Of This" , transparent(1, .5, red )) ; +SampleText ("Functionality" , transparent(1, .5, green)) ; +SampleText ("Was Written" , transparent(1, .5, blue )) ; +SampleText ("While Listening", transparent(1, .5, cmyk(1,0,0,0))) ; +SampleText ("To the CD's Of" , transparent(1, .5, cmyk(0,1,0,0))) ; +SampleText ("Tori Amos" , transparent(1, .5, cmyk(0,0,1,0))) ; +\stopbuffer + +So far we have applied transparent colors to shapes but text can also be the +target. + +\typebuffer[mp] + +The source code of this example illustrates that the \CMYK\ color space is also +supported. The \type {\truefontname} macro communicates the running font from +\TEX\ to \METAPOST. Instead of such low level code one can of course also use the +\type {textext} macro. + +\startbuffer[mp] +vardef SampleText (expr t) = + draw textext(t) scaled 5 ; +enddef ; + +SampleText ("\colored[a=1,t=.5,r=1]{Much Of This}") ; +SampleText ("\colored[a=1,t=.5,g=1]{Functionality}") ; +SampleText ("\colored[a=1,t=.5,b=1]{Was Written}") ; +SampleText ("\colored[a=1,t=.5,c=1]{While Listening}") ; +SampleText ("\colored[a=1,t=.5,m=1]{To the CD's Of}") ; +SampleText ("\colored[a=1,t=.5,y=1]{Tori Amos}") ; +\stopbuffer + +However, as we do the typesetting in \TEX\ in \MKIV\ this is the way to go: + +\typebuffer[mp] + +As expected we get: + +\startlinecorrection[blank] +\processMPbuffer[mp] +\stoplinecorrection + +Currently the 12 in \PDF\ available transparency methods are supported. \footnote +{In the future we may also support more control over the individual methods.} You +can use both numbers and names. As you may expect, both \CONTEXT\ and \METAFUN\ +support transparency in the same way. \in {Figure} [fig:transparencies] shows how +the method affects the result. + +\startuseMPgraphic{test} +numeric u ; u := if lua.mp.mode("screen") : 12mm else : 20mm fi ; + +path p ; p := fullcircle scaled u shifted (u/4,0); + +% cmykcolor xyellow ; xyellow := (0,0,1,0) ; +% color xgreen ; xgreen := (0,1,0) ; +% color xblue ; xblue := (0,0,1) ; + +% fill p rotated 90 withcolor transparent("\MPvar{a}",.5,xyellow) ; +% fill p rotated 210 withcolor transparent("\MPvar{a}",.5,xgreen) ; +% fill p rotated 330 withcolor transparent("\MPvar{a}",.5,xblue) ; + +fill p rotated 90 withcolor (0,0,1,0) withtransparency("\MPvar{a}",.5) ; +fill p rotated 210 withcolor (0,1,0) withtransparency("\MPvar{a}",.5) ; +fill p rotated 330 withcolor (0,0,1) withtransparency("\MPvar{a}",.5) ; +\stopuseMPgraphic + +\startplacefigure[location=here,reference=fig:transparencies,title={The 12 transparency alternatives by name.}] + \doifelsemode {screen} { + \setupcombination[nx=8,ny=2] + } { + \setupcombination[nx=4,ny=4] + } + \startcombination + {\useMPgraphic{test}{a=normal}} {\tttf normal} + {\useMPgraphic{test}{a=multiply}} {\tttf multiply} + {\useMPgraphic{test}{a=screen}} {\tttf screen} + {\useMPgraphic{test}{a=overlay}} {\tttf overlay} + {\useMPgraphic{test}{a=softlight}} {\tttf softlight} + {\useMPgraphic{test}{a=hardlight}} {\tttf hardlight} + {\useMPgraphic{test}{a=colordodge}} {\tttf colordodge} + {\useMPgraphic{test}{a=colorburn}} {\tttf colorburn} + {\useMPgraphic{test}{a=darken}} {\tttf darken} + {\useMPgraphic{test}{a=lighten}} {\tttf lighten} + {\useMPgraphic{test}{a=difference}} {\tttf difference} + {\useMPgraphic{test}{a=exclusion}} {\tttf exclusion} + {\useMPgraphic{test}{a=hue}} {\tttf hue} + {\useMPgraphic{test}{a=saturation}} {\tttf saturation} + {\useMPgraphic{test}{a=color}} {\tttf color} + {\useMPgraphic{test}{a=luminosity}} {\tttf luminosity} + \stopcombination +\stopplacefigure + +In \CONTEXT\ a transparent color is defined in a similar way as \quote {normal} +colors. The transparency method is specified with the \type {a} key (either by +number or by name) and the factor \type {t}. + +\startbuffer +\definecolor [tred] [r=1,t=.5,a=exclusion] +\definecolor [tgreen] [g=1,t=.5,a=exclusion] +\definecolor [tblue] [b=1,t=.5,a=exclusion] +\stopbuffer + +\typebuffer \getbuffer + +Both keys are needed. You can define your own symbolic names using: + +\starttyping +\definetransparency [myowndefault] [1] +\stoptyping + +The \type {\MPcolor} macro passes a color from \CONTEXT\ to \METAPOST, including +the transparency specification. + +\startbuffer[mp] +u := 2cm ; path p ; p := fullcircle scaled u shifted (u/4,0); + +fill p rotated 90 withcolor \MPcolor{tred} ; +fill p rotated 210 withcolor \MPcolor{tgreen} ; +fill p rotated 330 withcolor \MPcolor{tblue} ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] +\processMPbuffer[mp] +\stoplinecorrection + +Of course this also works well for \CMYK\ colors. + +\startbuffer +\definecolor[tred] [c=1,k=.2,t=.5,a=1] +\definecolor[tgreen][m=1,k=.2,t=.5,a=1] +\definecolor[tblue] [y=1,k=.2,t=.5,a=1] +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] +\processMPbuffer[mp] +\stoplinecorrection + +Gray scales work as well: + +\startbuffer +\definecolor[ta][s=.9,t=.7,a=11] +\definecolor[tb][s=.7,t=.7,a=11] +\definecolor[tc][s=.5,t=.7,a=11] +\stopbuffer + +\typebuffer \getbuffer + +We apply this to some text. By using an overlay we can conveniently explore the +difference in fonts. + +% \startbuffer +% def SampleText (expr s, f, c) = +% draw s infont f scaled 5 withcolor c ; +% enddef ; + +% SampleText("Hello", "\truefontname{Regular}" , \MPcolor{ta}) ; +% SampleText("Hello", "\truefontname{RegularBold}" , \MPcolor{tb}) ; +% SampleText("Hello", "\truefontname{RegularSlanted}", \MPcolor{tc}) ; +% \stopbuffer + +\startbuffer +draw textext("\color[ta]{\tf Hello}") scaled 5 ; +draw textext("\color[tb]{\bf Hello}") scaled 5 ; +draw textext("\color[tc]{\sl Hello}") scaled 5 ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +\stopsection + +\startsection[title={Shading}] + +\startsubsection[title=Introduction] + +\index{shading} + +In this section we introduce different kinds of shading. Since \METAPOST\ does +not support this feature directly, we have to fall back on a few tricks. For the +moment shading is only supported in \PDF. In the following examples, we will use +the next three colors: + +\startbuffer +\definecolor[a][darkyellow] +\definecolor[b][s=.8] +\definecolor[c][darkred] +\stopbuffer + +\typebuffer + +\getbuffer + +Shading support evolved in steps and alongside development of the backend code. Also, +as it became more used a second interface came available. We discuss both here. + +\stopsubsection + +\startsubsection[title=The old method] + +First we discuss the old method which is still valid and also available in +\MKII. It illustrates some of the principles. + +\startbuffer[a] +\startuniqueMPgraphic{CircularShade} + path p ; + p := unitsquare xscaled \overlaywidth yscaled \overlayheight ; + circular_shade(p,0,\MPcolor{a},\MPcolor{b}) ; +\stopuniqueMPgraphic + +\startuniqueMPgraphic{LinearShade} + path p ; + p := unitsquare xscaled \overlaywidth yscaled \overlayheight ; + linear_shade(p,0,\MPcolor{a},\MPcolor{b}); +\stopuniqueMPgraphic +\stopbuffer + +\startbuffer[b] +\defineoverlay[circular shade][\uniqueMPgraphic{CircularShade}] +\defineoverlay[linear shade] [\uniqueMPgraphic{LinearShade}] +\stopbuffer + +\startbuffer[c] +\framed + [background=circular shade,frame=off] + {\bf \white Hi there, I'm Circular!} +\stopbuffer + +\startbuffer[d] +\framed + [background=linear shade,frame=off] + {\bf \white Whow, this is Linear!} +\stopbuffer + +A shade is a fill with a stepwise change in color. In \POSTSCRIPT\ (level 2), the +way this color changes can be circular, linear, or according to a user defined +function. Circular and linear shades look like this: + +\startlinecorrection[blank] +\getbuffer[a,b,c] +\stoplinecorrection + +\startlinecorrection[blank] +\getbuffer[a,b,d] +\stoplinecorrection + +As you can see, the shade lays behind the text, as a background overlay. These +overlays are unique \METAPOST\ graphics, so they will adapt themselves to the +dimensions of the foreground. + +\typebuffer[b] + +The two framed texts are defined as: + +\typebuffer[c] + +and: + +\typebuffer[d] + +We still have to define the graphics. Here we use a macro that takes four +arguments: a path, a number identifying the center of shading, and the colors to +start and end with. + +\typebuffer[a] + +The \METAPOST\ macros, \type {circular_shade} and \type {linear_shade}, add +information to the \METAPOST\ output file, which is interpreted by the converter +built in \CONTEXT. Shading comes down to interpolation between two or more points +or user supplied ranges. A poor mans way of doing this, is to build the graphics +piecewise with slightly changing colors. But, instead of \quote {manually} +stepping through the color values, we can use the more efficient and generalized +\POSTSCRIPT\ level~2 and \PDF\ level~1.3 shading feature. + +\def\SomeShade#1#2#3% waarom unique ? + {\startuniqueMPgraphic{shade-#1} + width := \overlaywidth ; + height := \overlayheight ; + path p ; p := unitsquare xscaled width yscaled height ; + #2_shade(p,#3,\MPcolor{a},\MPcolor{b}) ; + \stopuniqueMPgraphic + \defineoverlay[shade-#1][\uniqueMPgraphic{shade-#1}]% + \framed[background=shade-#1,width=2cm,height=2cm,frame=off]{}} + +\startlinecorrection[blank] +\startcombination[5*1] + {\SomeShade{20}{circular}{0}} {circular 0} + {\SomeShade{21}{circular}{1}} {circular 1} + {\SomeShade{22}{circular}{2}} {circular 2} + {\SomeShade{23}{circular}{3}} {circular 3} + {\SomeShade{24}{circular}{4}} {circular 4} +\stopcombination +\stoplinecorrection + +\startlinecorrection[blank] +\startcombination[4*2] + {\SomeShade{32}{linear}{1}} {linear 1} + {\SomeShade{32}{linear}{2}} {linear 2} + {\SomeShade{33}{linear}{3}} {linear 3} + {\SomeShade{34}{linear}{4}} {linear 4} + {\SomeShade{35}{linear}{5}} {linear 5} + {\SomeShade{36}{linear}{6}} {linear 6} + {\SomeShade{37}{linear}{7}} {linear 7} + {\SomeShade{38}{linear}{8}} {linear 8} +\stopcombination +\stoplinecorrection + +% % This limitation si no longer present in mpiv. +% +% Shading is not a \METAPOST\ feature, which means that it has to be implemented +% using so called specials, directives that end up in the output file. +% Unfortunately these are not coupled to the specific path, which means that we +% have to do a significant amount of internal bookkeeping. Also, in \PDF\ we have +% to make sure that the graphics and their resources (being the shading functions) +% are packaged together. +% +% Because of this implementation, shading may behave somewhat unexpected at times. +% A rather normal case is the next one, where we place 5~shaded circles in a row. +% +% \startbuffer +% path p ; p := fullcircle scaled 1cm ; +% for i=0 step 2cm until 8cm : +% circular_shade(p shifted (i,0),0,\MPcolor{a},\MPcolor{b}) ; +% endfor ; +% \stopbuffer +% +% \typebuffer +% +% \startlinecorrection[blank] +% \processMPbuffer +% \stoplinecorrection +% +% At first sight, in the next situation, we would expect something similar, because +% we simply copy the same circle 5~times. However, due to the way we have +% implemented shading in \CONTEXT, we do indeed copy the circles, but the shade +% definition is frozen and the same one is used for all 5~circles. This means that +% the center of the shading stays at the first circle. +% +% \startbuffer +% circular_shade(fullcircle scaled 1cm,0,\MPcolor{a},\MPcolor{b}) ; +% picture s ; s := currentpicture ; currentpicture := nullpicture ; +% for i=0 step 2cm until 8cm : +% addto currentpicture also s shifted (i,0) ; +% endfor ; +% \stopbuffer +% +% \typebuffer +% +% \startlinecorrection[blank] +% \processMPbuffer +% \stoplinecorrection +% +% Unlike \TEX, \METAPOST\ does not keep its specials attached to the current path, +% and flushes them before the graphic data. Since we use these specials to register +% shading information, it is rather hard to tightly connect a specific shade with a +% certain fill, especially if an already performed fill is not accessible, which is +% the case when we copy a picture. +% +% This may seem a disadvantage, but fortunately it also has its positive side. In +% the next example we don't copy, but reuse an already defined shade. By storing +% the reference to this shade, and referring to it by using \type {withshade}, we +% can use a shade that operates on multiple shapes. + +\startbuffer +sh := define_circular_shade + (origin,origin,0,8cm,\MPcolor{a},\MPcolor{b}) ; +for i=0 step 2cm until 8cm : + fill fullcircle scaled 1cm shifted (i,0) withshade sh ; +endfor ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +The low level macro \type {define_circular_shade} is fed with two pairs (points), +two radius, and two colors. The shade is distributed between the colors according +to the radius. + +Shading can hardly be called an easy issue. The macros that we provide here are +in fact simplifications, which means that at a lower level, one can do more +advanced things. Here we limit ourselves to the more common cases. In the +previous examples, we used an arrow to indicate the direction and magnitude of +the shade. The next macro demonstrates the principles in a different way. + +\startbuffer[a] +def test_shade (expr a, b, ra, rb) = + pickup pencircle scaled 1mm ; + + color ca ; ca := \MPcolor{a} ; + color cb ; cb := \MPcolor{b} ; + color cc ; cc := \MPcolor{c} ; + + path pa ; pa := fullcircle scaled 2ra shifted a ; + path pb ; pb := fullcircle scaled 2rb shifted b ; + + sh := define_circular_shade(a,b,ra,rb,ca,cb) ; + + fill pb withshade sh ; + draw pb withcolor cc ; + draw pa withcolor cc ; +enddef ; +\stopbuffer + +\typebuffer[a] + +The shade is distributed between two circles, each with a radius and center +point. All four can be set, but as the next calls demonstrate, we can normally do +with less, which is why we provided the macro with less parameters. + +\startbuffer[b] +test_shade(origin, origin, 0cm, 1cm) ; +\stopbuffer +\startbuffer[c] +test_shade(origin, origin, .25cm, 1cm) ; +\stopbuffer +\startbuffer[d] +test_shade(origin, origin, .50cm, 1cm) ; +\stopbuffer + +\startbuffer[f] +\startlinecorrection[blank] +\hbox + {\processMPbuffer[a,b]\quad + \processMPbuffer[a,c]\quad + \processMPbuffer[a,d]} +\stoplinecorrection +\stopbuffer + +\typebuffer[b,c,d] \getbuffer[f] + +\startbuffer[b] +test_shade(origin, origin shifted (.25cm,0), 0cm, 1cm) ; +\stopbuffer +\startbuffer[c] +test_shade(origin, origin shifted (.25cm,0), .25cm, 1cm) ; +\stopbuffer +\startbuffer[d] +test_shade(origin, origin shifted (.25cm,0), .50cm, 1cm) ; +\stopbuffer + +\typebuffer[b,c,d] \getbuffer[f] + +\startbuffer[b] +test_shade(origin shifted (.25cm,0), origin, 0cm, 1cm) ; +\stopbuffer +\startbuffer[c] +test_shade(origin shifted (.25cm,0), origin, .25cm, 1cm) ; +\stopbuffer +\startbuffer[d] +test_shade(origin shifted (.25cm,0), origin, .50cm, 1cm) ; +\stopbuffer + +\typebuffer[b,c,d] \getbuffer[f] + +\startbuffer[a] +def test_shade (expr a, b) = + pickup pencircle scaled 1mm ; + + color ca ; ca := \MPcolor{a} ; + color cb ; cb := \MPcolor{b} ; + color cc ; cc := \MPcolor{c} ; + + sh := define_linear_shade(a,b,ca,cb) ; + + fill fullsquare scaled 2cm withshade sh ; + draw a withcolor cc ; + draw b withcolor cc ; +enddef ; +\stopbuffer + +In a similar fashion, we can define a linear shade. This time we only pass two +points and two colors. + +\typebuffer[a] + +Although one can control shading to a large extend, in practice only a few cases +really make sense. + +\startbuffer[b] +test_shade(origin, origin shifted (1cm,0)) ; +\stopbuffer +\startbuffer[c] +test_shade(origin shifted (-1cm,0), origin shifted (1cm,0)) ; +\stopbuffer +\startbuffer[d] +test_shade(origin shifted (-1cm,-1cm), origin shifted (1cm,1cm)) ; +\stopbuffer + +\startbuffer[f] +\startlinecorrection[blank] +\hbox + {\processMPbuffer[a,b]\quad + \processMPbuffer[a,c]\quad + \processMPbuffer[a,d]} +\stoplinecorrection +\stopbuffer + +\typebuffer[b,c,d] \getbuffer[f] + +\stopsubsection + +\startsubsection[title=The new method] + +By now the shader macros are rather advanced and specifications are easier than +before. Here we discuss the new method. An example is: + +\startbuffer +fill fullsquare xyscaled (TextWidth,1cm) + withshademethod "linear" + withshadevector (1,0) + withshadecolors (darkred,darkgreen) +; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] + \processMPbuffer +\stoplinecorrection + +There are several properties that can be set: + +\starttabulate[|l|p|] +\NC domain \NC The range over which the colors run, with a minimum of 0 and maximum of 1. \NC \NR +\NC color \NC A color to start from and one to end with, we default from black to white. \NC \NR +\NC type \NC The shading can be linear or circular. \NC \NR +\NC center \NC The origin of the shade vector. \NC \NR +\NC radius \NC The radius vector of a circular shade. \NC \NR +\NC vector \NC Where we start and end the shading. \NC \NR +\stoptabulate + +For a linear shade the centers are the lower left and upper right corners, for a +circular shade it's the center of the path. For a circular shade the radius runs +from zero to the maximum distance from the center as determined by the +boundingbox. + +The vector is used as follows: the first coordinate (xpart) determines the point +on the path where we start, the second coordinate (ypart) the point on the +path where we end. + +\startbuffer[a] +fill fullsquare xyscaled (TextWidth,1cm) + withshademethod "linear" + withshadevector (1,0) + withshadecolors (darkred,darkgreen) +; +\stopbuffer + +\startbuffer[b] +draw fullsquare xyscaled (TextWidth,1cm) + shownshadevector (1,0) + withpen pencircle scaled 2 + withcolor .5white ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] + \processMPbuffer[a,b] +\stoplinecorrection + +In the end only the x coordinate matters, but using a point on the path sort of +fits in \METAPOST. In the case of a rectangle we have 4 points while circle has 8 +points. + +\startbuffer[a] +fill fullcircle xyscaled (TextWidth,1cm) + withshademethod "linear" + withshadevector (2,4) + withshadecolors (darkred,darkgreen) +; +\stopbuffer + +\startbuffer[b] +draw fullcircle xyscaled (TextWidth,1cm) + shownshadevector (2,4) + withpen pencircle scaled 2 + withcolor .5white ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] + \processMPbuffer[a,b] +\stoplinecorrection + +A triangle has three points. Using 1 and 2 as second vector value gives the same +results as do values in the range 0 upto 1 and 2 upto 3 (0 again). + +\startbuffer[a] +fill fulltriangle xyscaled (TextWidth,1cm) + withshademethod "linear" + withshadevector (0.25,0.75) + withshadecolors (darkred,darkgreen) +; +\stopbuffer + +\startbuffer[b] +draw fulltriangle xyscaled (TextWidth,1cm) + shownshadevector (0.25,0.75) + withpen pencircle scaled 2 + withcolor .5white ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] + \processMPbuffer[a,b] +\stoplinecorrection + +The shadevector relates to (the x coordinates of) points on the path. A variant is +to use the boundingbox: + +\startbuffer[a] +for i=1 upto 3 : + fill fulltriangle xyscaled (TextWidth,1cm) + shifted (0,-i*15mm) + withshademethod "linear" + withshadedirection (1,1-i/4) + withshadecolors (darkgreen,darkblue) + ; +endfor ; +\stopbuffer + +\startbuffer[b] +for i=1 upto 3 : + draw fulltriangle xyscaled (TextWidth,1cm) + shifted (0,-i*15mm) + shownshadevector (1,1-i/4) + withpen pencircle scaled 2 + withcolor .5white ; +endfor ; +\stopbuffer + +\typebuffer[a] + +\startlinecorrection[blank] + \processMPbuffer[a,b] +\stoplinecorrection + +So, where a vector is defined as going from {\em point xpart a of pth} to +{\em point ypart a of pth}, a direction goes from {\em point xpart a of +boundingbox pth} to {\em point ypart a of boundingbox pth}. + +To make life convenient we provide a few constants that indicate directions: + +\starttyping +pair shadedup ; shadedup := (0.5,2.5) ; +pair shadeddown ; shadeddown := (2.5,0.5) ; +pair shadedleft ; shadedleft := (1.5,3.5) ; +pair shadedright ; shadedright := (3.5,1.5) ; +\stoptyping + +\startbuffer[a] +for d = shadedup, shadeddown, shadedleft, shadedright : + fill fullsquare xyscaled (TextWidth,1cm) + withshademethod "linear" + withshadedirection d + withshadecolors (darkgreen,darkblue) + ; + currentpicture := currentpicture shifted (0,15mm) ; +endfor ; +\stopbuffer + +\startbuffer[b] +currentpicture := currentpicture shifted (0,-60mm) ; +for d = shadedup, shadeddown, shadedleft, shadedright : + draw fullsquare xyscaled (TextWidth,1cm) + shownshadedirection d + withpen pencircle scaled 2 + withcolor .5white ; + currentpicture := currentpicture shifted (0,15mm) ; +endfor ; +\stopbuffer + +\typebuffer[a] + +\startlinecorrection[blank] + \processMPbuffer[a,b] +\stoplinecorrection + +In case of a circular shade another method comes in handy: + +\startbuffer[a] +fill fullcircle xyscaled (TextWidth,4cm) + withshademethod "circular" + withshadecenter (.7,.9) + withshadecolors (darkblue,darkyellow) +; +\stopbuffer + +\startbuffer[b] +draw fullcircle xyscaled (TextWidth,4cm) + shownshadecenter (.7,.9) + withpen pencircle scaled 2 + withcolor .5white ; +\stopbuffer + +\typebuffer + +Here the values relate to the center of path i.e.\ they shift the center by the +given fraction of the width and height of the boundingbox devided by 2. + +\startlinecorrection[blank] + \processMPbuffer[a,b] +\stoplinecorrection + +You can set a center directly i.e.\ unrelated to the center of the path as +follows: + +\startbuffer[a] +fill fullcircle xyscaled (TextWidth,4cm) + withshademethod "circular" + withshadeorigin (-30mm,-15mm) + withshadecolors (darkblue,darkyellow) +; +\stopbuffer + +\startbuffer[b] +draw fullcircle xyscaled (TextWidth,4cm) + shownshadeorigin (-30mm,-15mm) + withpen pencircle scaled 2 + withcolor .5white ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] + \processMPbuffer[a,b] +\stoplinecorrection + +In a similar way you can set an explicit radius: + +\startbuffer[a] +fill fullcircle xyscaled (TextWidth,1cm) + withshademethod "circular" + withshaderadius (10mm,50mm) + withshadecolors (darkblue,darkyellow) +; +currentpicture := currentpicture shifted (0,15mm) ; +fill fullcircle xyscaled (TextWidth,1cm) + withshademethod "circular" + withshaderadius (50mm,10mm) + withshadecolors (darkgreen,darkred) +; +currentpicture := currentpicture shifted (0,15mm) ; +fill fullcircle xyscaled (TextWidth,1cm) + withshademethod "circular" + withshaderadius (TextWidth/3,0mm) + withshadecolors (darkmagenta,darkcyan) +; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] + \processMPbuffer[a] +\stoplinecorrection + +A more fancy feature is combined shades. This works as follows: + +\startbuffer[a] +fill fullsquare xyscaled (TextWidth,1cm) + withshademethod "linear" + withshadevector (0,1) + withshadestep ( + withshadefraction .3 + withshadecolors (red,green) + ) + withshadestep ( + withshadefraction .5 + withshadecolors (green,blue) + ) + withshadestep ( + withshadefraction .7 + withshadecolors (blue,red) + ) + withshadestep ( + withshadefraction 1 + withshadecolors (red,yellow) + ) +; +\stopbuffer + +\typebuffer[a] + +By stepwise defining the colored bands you get: + +\startlinecorrection[blank] + \processMPbuffer[a] +\stoplinecorrection + +Shades work well with colors and transparencies. This involves quite some +resource managament in the backend but it's hidden by the interface. + +\startbuffer[a] +fill fullsquare scaled 5cm + withshademethod "linear" + withshadefactor 1 + withshadedomain (0,1) + withshadevector (0.5,2.75) + withshadecolors (red,green) ; + +fill fullcircle scaled 5cm + withshademethod "circular" + withshadefactor 1 + withshadedomain (0,1) + withshadecenter (.25,.25) + withshadecolors (green,blue) ; + +fill fulltriangle scaled 5cm + withshademethod "circular" + withshadefactor 1 + withshadedomain (0,1) + withshadecenter (.25,.25) + withshadecolors (blue,yellow) ; +\stopbuffer + +\startbuffer[b] +fill fullsquare scaled 5cm + withcolor white ; +fill fullsquare scaled 5cm + withshademethod "linear" + withshadevector (0.5,2.75) + withshadecolors (red,green) + withtransparency (1,.5) ; + +fill fullcircle scaled 5cm + withcolor white ; +fill fullcircle scaled 5cm + withshademethod "circular" + withshadecenter (.25,.25) + withshadecolors (green,blue) + withtransparency (1,.5) ; + +fill fulltriangle scaled 5cm + withcolor white ; +fill fulltriangle scaled 5cm + withshademethod "circular" + withshadecenter (.25,.25) + withcolor blue shadedinto yellow + withtransparency (1,.5) ; +\stopbuffer + +\startbuffer[c] +fill fullsquare scaled 5cm + withshademethod "linear" + withshadevector (0.5,2.75) + withshadecolors (red,green) + withtransparency (1,.5) ; + +fill fullcircle scaled 5cm + withshademethod "circular" + withshadecenter (.25,.25) + withcolor green shadedinto blue + withtransparency (1,.5) ; + +fill fulltriangle scaled 5cm + withshademethod "circular" + withshadecenter (.25,.25) + withcolor blue shadedinto yellow + withtransparency (1,.5) ; +\stopbuffer + +Here are some shades without transparency: + +\typebuffer[a] + +When the background is white, transparency is just a way to achieve soft colors. +We leave out the defaults. + +\typebuffer[b] + +Real transparency will show op darker due to the accumulated colors. This time we +demonstrate an alternative color specification. + +\typebuffer[c] + +\startplacefigure[reference=shades:transparency,title={Transparency applied to shades.}] + \startcombination[3*1] + {\processMPbuffer[a]} {no transparency} + {\processMPbuffer[b]} {transparency on white} + {\processMPbuffer[c]} {real transparency} + \stopcombination +\stopplacefigure + +Within reasonable bounds you can move around and adapt shaded paths but you need +to keep in mind that due to the fact that we are dealing with relatively complex +data structures there are some limits. For instance it is possible to define a +shade as (kind of) variable and reuse it. it's also possible then to overload +some properties. + +% % still supported but not advertized: +% +% numeric n ; n = define_linear_shade (center fullcircle,center fullsquare,red,green) ; +% +% fill fullcircle randomized 1cm xyscaled(10cm,8cm) withshade n ; + +\startbuffer +defineshade myshade + withshademethod "circular" + withshadefactor 1 + withshadedomain (0,1) + withshadecolors (black,white) + withtransparency (1,.5) +; + +for i=1 upto 5 : + fill fullcircle randomized 1 xyscaled(5cm,3cm) + shaded myshade ; +endfor ; + +draw image ( + for i=1 upto 5 : + fill fullcircle randomized 1 + shaded myshade + withshadecolors (yellow,blue) ; + endfor ; +) xyscaled(5cm,3cm) shifted (5cm,0) ; +\stopbuffer + +\typebuffer + +We get two groups of five overlayed shades here, one with a different color. The +shade properties can only be applied to paths (see \in {figure} +[fig:shades:defined]). + +\startplacefigure[reference=fig:shades:defined,title={Reusing defined shaded.}] + \processMPbuffer +\stopplacefigure + +In older versions one could not reposition or scale a shaded path without losing +or crippling the shade properties. Nowadays this is no longer a limitation, as we +demonstrate in the following examples. You can disable this feature if wanted. +The results are shown in \in {figure} [fig:shades:transform]. Without the +transform the vectors and such are kept which might be useful in special cases. + +\startbuffer[a] +fill fullsquare xyscaled (15mm, 15mm) + withshademethod "linear" + withshadedirection shadedright + withshadecolors (red,(1,1,1)) ; + +fill fullsquare xyscaled (10mm, 10mm) + withshademethod "circular" + withshadecolors (green,blue) ; + +currentpicture := currentpicture xysized (.4TextWidth,30mm) ; +currentpicture := currentpicture shifted (5mm,5mm) ; +\stopbuffer + +\typebuffer[a] + +The transform can be ignored with: + +\startbuffer[b] +fill fullsquare xyscaled (15mm, 15mm) + withshademethod "linear" + withshadetransform "no" + withshadedirection shadedright + withshadecolors (red,(1,1,1)) ; + +fill fullsquare xyscaled (10mm, 10mm) + withshademethod "circular" + withshadetransform "no" + withshadecolors (green,blue) ; + +currentpicture := currentpicture xysized (.4TextWidth,30mm) ; +currentpicture := currentpicture shifted (5mm,5mm) ; +\stopbuffer + +\typebuffer[b] + +\startplacefigure[reference=fig:shades:transform,title={Shifting and scaling shades.}] + \startcombination + {\processMPbuffer[a]} {with transform} + {\processMPbuffer[b]} {without transform} + \stopcombination +\stopplacefigure + +\stopsubsection + +\stopsection + +\startsection[title={Clipping}] + +\index{clipping} + +In this section we will use the graphic representation (although simplified) of a +Dutch cow to demonstrate clipping. + +\startbuffer +\placefigure + {A cow.} + {\externalfigure[cow-fun.mps][width=4cm]} +\stopbuffer + +\getbuffer + +Since this cow is defined as a \METAPOST\ graphic, we use the suffix \type {mps} +instead of \type {eps} or a number, although \CONTEXT\ will recognize each as +being \METAPOST\ output. The placement of the cow is defined as: + +\typebuffer + +Clipping is combined with a matrix, as in \in {figure} [fig:clipped cow 1]. The +content to be clipped is divided in \type {nx} by \type {ny} rectangles. For +instance, \type {nx=5} and \type {ny=8} will produce a 40~cell grid with +5~columns of 8~rows. + +\startbuffer +\startbuffer +\setupclipping[nx=3,ny=2] +\startcombination + {\clip[x=1,y=1]{\externalfigure[cow-fun.mps][width=4cm]}} {1,1} + {\clip[x=3,y=1]{\externalfigure[cow-fun.mps][width=4cm]}} {3,1} +\stopcombination +\stopbuffer + +\placefigure + [here][fig:clipped cow 1] + {A clipped cow.}{\getbuffer} +\stopbuffer + +\getbuffer + +Here we have divided the cow in six cells, so that we can clip its head and tail. +This kind of clipping enables you to zoom in or focus on a specific part of a +graphic. + +\typebuffer + +Alternatively, we can specify a \type {width}, \type {height}, \type {hoffset} +and \type {voffset}, as demonstrated in \in {figure} [fig:clipped cow 2]. + +\startbuffer +\placefigure + [here][fig:clipped cow 2] + {Another clipped cow.} + {\clip + [width=2cm,height=2cm,hoffset=0cm,voffset=0cm] + {\externalfigure[cow-fun.mps][width=4cm]}} +\stopbuffer + +\getbuffer + +\typebuffer + +Because \METAPOST\ supports clipping, it will be no surprise that both techniques +can be combined. In the next example we will zoom in on the head of the cow. We +also use this opportunity to demonstrate how you can package a clip in a figure +definition. + +\startbuffer +\startMPclip{head clip} + w := \width ; h := \height ; + clip currentpicture to + ((0,h)--(w,h){down}..{left}(0,0)--cycle) ; +\stopMPclip + +\placefigure + [here][fig:circular clipped cowhead] + {A quarter circle applied to a cows head.} + {\ruledhbox + {\clip + [nx=2,ny=2,x=1,y=1,mp=head clip] + {\externalfigure[cow-fun.mps][width=4cm]}}} +\stopbuffer + +\typebuffer + +A more advanced clip is demonstrated in \in {figure} [fig:circular clipped +cowhead]. We added \type {\ruledhbox} to demonstrate the dimensions of the +resulting graphic. Putting something in such a ruled box is often a quick way to +test spacing. + +\getbuffer + +Although a clip path definition can contain any \METAPOST\ command, even +graphics, it must contain at least one clipping path. The first one encountered +in the resulting graphic is used. In the example we used a path that is built out +of three subpaths. + +\starttyping +(0,h)--(w,h){down}..{left}(0,0)--cycle +\stoptyping + +We start in the top left corner and draw a straight line. Next we draw a curve to +the origin. Directives like \type {down} and \type {right} force the curve in a +certain direction. With \type {cycle} we close the path. Because we use this path +as a clipping path, we use \type {clip} instead of \type {draw} or \type {fill}. + +\startbuffer +w := 4cm ; h := 2cm ; +draw (0,h)--(w,h){down}..{left}(0,0)--cycle + withpen pencircle scaled 1mm withcolor .625red ; +\stopbuffer + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +Clipping as such is not limited to graphics. Take for instance the text buffer: + +\startbuffer +\startbuffer[sample] +\framed + [align=middle,width=4cm,background=screen,frame=off] + {A \METAPOST\ clip is not the same as a video clip, + although we can use \METAPOST\ to produce a video clip.} +\stopbuffer +\stopbuffer + +\typebuffer + +\getbuffer + +We can call up such a buffer as if it were an external figure. \in {Figure} +[fig:clipped text 1] shows the result. This time we use a different clip path: + +\startbuffer[a] +\startMPclip{text clip} + clip currentpicture to fullcircle shifted (.5,.5) + xscaled \width yscaled \height ; +\stopMPclip +\stopbuffer + +\typebuffer[a] + +To load a buffer, we have to specify its name and type, as in: + +\startbuffer[b] +\placefigure + [here][fig:clipped text 1] + {A clipped buffer (text).} + {\clip + [nx=1,ny=1,mp=text clip] + {\externalfigure[sample][type=buffer,width=4cm]}} +\stopbuffer + +\typebuffer[b] + +\getbuffer[a,b] + +The next few lines demonstrate that we can combine techniques like backgrounds +and clipping. + +\startbuffer +\startuseMPgraphic{clip outline} + draw fullcircle + xscaled \overlaywidth yscaled \overlayheight + withpen pencircle scaled 4mm + withcolor .625red ; +\stopuseMPgraphic + +\defineoverlay[clip outline][\useMPgraphic{clip outline}] + +\placefigure + [here][fig:clipped text 2] + {A clipped buffer (text).} + {\framed + [background=clip outline,offset=overlay,frame=off] + {\clip + [nx=1,ny=1,mp=text clip] + {\externalfigure[sample][type=buffer,width=4cm]}}} +\stopbuffer + +\typebuffer + +We could have avoided the \type {\framed} here, by using the \typ{clip outline} +overlay as a background of the sample. In that case, the resulting linewidth +would have been 2.5~mm instead of 5~mm, since the clipping path goes through the +center of the line. + +\getbuffer + +In most cases, the clip path will be a rather simple path and defining such a +path every time you need it, can be annoying. \in {Figure} [fig:clipping paths] +shows a collection of predefined clipping paths. These are available after +loading the \METAPOST\ clipping library. + +\starttyping +\useMPlibrary[clp] +\stoptyping + +We already saw how the circular clipping path was defined. The diamond is defined +in a similar way, using the predefined path \type {diamond}: + +\starttyping +\startMPclip{diamond} + clip currentpicture to unitdiamond + xscaled \width yscaled \height ; +\stopMPclip +\stoptyping + +The definition of the negated ellipse (\type {negellipse}) uses the primary \type +{peepholed}. This primary is defined in one of the \METAPOST\ modules that come +with \CONTEXT. + +\starttyping +\startMPclip{negellipse} + clip currentpicture to (unitcircle peepholed unitsquare) + xscaled \width yscaled \height ; +\stopMPclip +\stoptyping + +The definition of \type {peepholed} is rather dirty and using \type {peepholed} +is restricted to well defined situations (like here). It's called a primary +because it acts as an operator at the same level as \type {*} and \type {scaled}. + +\startbuffer +\setupclipping [nx=1,ny=1,x=1,y=1] +\setupblackrules[width=2cm,height=1cm] +\startcombination[6*3] + {\clip[mp=urellipse] {\darkred\blackrule}} {urellipse} + {\clip[mp=ulellipse] {\darkred\blackrule}} {ulellipse} + {\clip[mp=llellipse] {\darkred\blackrule}} {llellipse} + {\clip[mp=lrellipse] {\darkred\blackrule}} {lrellipse} + {\clip[mp=ellipse] {\darkred\blackrule}} {ellipse} + {\clip[mp=negellipse]{\darkred\blackrule}} {negellipse} + {\clip[mp=tellipse] {\darkred\blackrule}} {tellipse} + {\clip[mp=bellipse] {\darkred\blackrule}} {bellipse} + {\clip[mp=lellipse] {\darkred\blackrule}} {lellipse} + {\clip[mp=rellipse] {\darkred\blackrule}} {rellipse} + {} {} + {} {} + {\clip[mp=urtriangle]{\darkred\blackrule}} {urtriangle} + {\clip[mp=ultriangle]{\darkred\blackrule}} {ultriangle} + {\clip[mp=lltriangle]{\darkred\blackrule}} {lltriangle} + {\clip[mp=lrtriangle]{\darkred\blackrule}} {lrtriangle} + {\clip[mp=diamond] {\darkred\blackrule}} {diamond} + {\clip[mp=negdiamond]{\darkred\blackrule}} {negdiamond} +\stopcombination +\stopbuffer + +\placefigure + [here][fig:clipping paths] + {A collection of predefined clipping paths.} + {\getbuffer} + +\stopsection + +\startsection[title={Including graphics}] + +\index{graphics+including} + +This document demonstrates that it is no big problem to include \METAPOST\ +graphics in a \TEX\ document. But how about including graphics in a \METAPOST\ +picture? In this section we will explore a couple of macros that provide you this +feature. + +Before we go into details, we introduce a very impressive program called +\PSTOEDIT\ by Wolfgang Glunz. This program runs on top of \GHOSTSCRIPT\ and is +able to convert \POSTSCRIPT\ code into other formats, among them \METAPOST\ (that +part of the \PSTOEDIT\ code is due to Scott Pakin). Some of the graphics that we +use in this section are produced that way. For us, the next call works well, but +the exact call may differ per version or platform. + +\starttyping +pstoedit -ssp -dt -f mpost yourfile.ps newfile.mp +\stoptyping + +We have converted the Dutch cow that shows up in many \CONTEXT\ documents into +\METAPOST\ using this program. The resulting \METAPOST\ file encapsulates the cow +in \METAPOST\ figure~1: \type {beginfig(1)}. Of course you can process this file +like any other, but more interesting is to use this code in an indirect way. + +\startbuffer +loadfigure "mycow.mp" number 1 scaled .5 ; +\stopbuffer + +\typebuffer + +This call will load figure~1 from the specified \METAPOST\ file, in such a way +that there is no interference with the current (encapsulating) figure. + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +Because this graphic is the result from a conversion, there are only paths. If +you want to import a more complex graphic, you need to make sure that the +variables used in there do not conflict with the one currently in use. + +\METAPOST\ is good in drawing vector graphics, but lacks natural support for +bitmaps, but the next macro offers a way out. This macro permits you to include +graphics in \PNG, \PDF, and \JPG\ format, or more precise: those formats +supported by \PDFTEX.\pagereference[hacker] + +\startbuffer +draw externalfigure "hacker.png" scaled 5cm shifted (-6cm,0) ; +draw externalfigure "hacker.png" scaled 5cm slanted .5 ; +\stopbuffer + +\typebuffer + +You can apply the usual transformations, but only those applied directly will be +taken into account. This means that you (currently) cannot store external figures +in picture variables in order to transform them afterwards. + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +Although you are limited in what you can do with such graphics, you can include +them multiple times with a minimum of overhead. Graphics are stored in objects +and embedded only once. + +\startbuffer +numeric s ; pair d, c ; +for i := 1 upto 5 : + s := 3cm randomized 1cm ; % size of picture + c := .5(s,s) ; % center of picture + d := (2cm*i,.5cm) randomized .5cm ; % displacement + draw externalfigure "hacker.png" + scaled s rotatedaround (c,0 randomized 30) shifted d ; +endfor ; +\stopbuffer + +\typebuffer + +Because we cannot store the graphic in a picture and scale afterwards, we +calculate the scale in advance, so that we can rotate around the center. + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +As long as you don't mess around with a stored external figure, you're safe. The +following example demonstrates how we can combine two special driven features: +figure inclusion and shading. + +\startbuffer +picture p ; +p := externalfigure "hacker.png" scaled 150pt ; +clip p to unitcircle scaled 150pt ; +circular_shade(boundingbox p enlarged 10pt, 0, .2red, .9red) ; +addto currentpicture also p ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +We end this section with a few more words to \METAPOST\ inclusion. It may seem +that in order to use the features discussed here, you need to use \CONTEXT\ as +typesetting engine. This is not true. First of all, you can use the small \TEX\ +package \MPTOPDF\ (described in another manual) or you can make small \CONTEXT\ +files with one page graphics. The advantage of the last method is that you can +manipulate graphics a bit. + +\starttyping +\setupcolors[cmyk=yes,rgb=no,state=start] + +\starttext + +\startMPpage[offset=6pt] + loadfigure "niceone.mp" number 10 ; +\stopMPpage + +\stoptext +\stoptyping + +The resulting \PDF\ file can be included as any other graphic +and has the advantage that it is self contained. + +\stopsection + +\startsection[reference=sec:conversion,title={Changing colors}] + +\index{color+manipulating} + +One of the advantages of \METAPOST\ graphics is that it is rather easy to force +consistency in colors and line widths. You seldom can influence third party +graphics that way, but we can use some \METAFUN\ trickery to get around this +limitation. + +\startbuffer +loadfigure "mycow.mp" number 1 scaled .35 ; +refill currentpicture withcolor .625red ; +\stopbuffer + +Say that we want a red cow instead of a black one. The following code does the +trick: + +\typebuffer + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +In a similar way we can influence the width and colors of the lines. + +\startbuffer +loadfigure "mycow.mp" number 1 scaled .35 ; +refill currentpicture withcolor .625red ; +redraw currentpicture withpen pencircle scaled 2pt withcolor .625yellow ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +Of course we can also use the more fancy features of \METAFUN, like transparency +and shading. + +\startbuffer +loadfigure "mycow.mp" number 1 scaled .35 ; +numeric sh ; sh := define_linear_shade + (llcorner currentpicture,urcorner currentpicture,.625red, .625yellow) ; +refill currentpicture withshade sh ; +redraw currentpicture withpen pencircle scaled 2pt withcolor .5white; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +Before we show a next trick, we draw a few circles. + +\startbuffer[a] +fill fullcircle scaled 2cm withcolor yellow ; +fill fullcircle scaled 2cm shifted (3cm,0) withcolor red ; +\stopbuffer + +\typebuffer[a] + +\startlinecorrection[blank] +\processMPbuffer[a] +\stoplinecorrection + +The yellow and red color do not match the main document colors, but this is no +problem: we can remap them, without spoiling the original definition. + +\startbuffer[b] +remapcolor(yellow,.625yellow) ; +remapcolor(red ,.625red) ; +recolor currentpicture ; +resetcolormap ; +\stopbuffer + +\typebuffer[a,b] + +\startlinecorrection[blank] +\processMPbuffer[a,b] +\stoplinecorrection + +We can combine the inclusion technique with remapping colors. This time using an +artist impression of one of Hasselts Canals (gracht in Dutch)\pagereference +[canal]. + +\startbuffer[a] +loadfigure "gracht.mp" number 1 scaled .5 ; +\stopbuffer + +\typebuffer[a] + +\startlinecorrection[blank] +\processMPbuffer[a] +\stoplinecorrection + +If you think that the sky is too bright in this picture, and given that you also +know which color is used, you can fool the reader by remapping a few colors. + +\startbuffer[b] +color skycolor ; skycolor := (0.8,0.90,1.0) ; +color watercolor ; watercolor := (0.9,0.95,1.0) ; +remapcolor(skycolor ,.8skycolor ) ; +remapcolor(watercolor,.8watercolor) ; +recolor currentpicture ; +resetcolormap ; +\stopbuffer + +\typebuffer[a,b] + +\startlinecorrection[blank] +\processMPbuffer[a,b] +\stoplinecorrection + +Including another \METAPOST\ graphic, refilling, redrawing, and recoloring are +all relatively simple features that use no real tricks. Opposite to the next +feature, which is implemented using the \METAPOST\ special driver that comes with +\CONTEXT. + +\METAPOST\ is not really meant for manipulating graphics, but the previous +examples demonstrated that we have some control over individual colors. In the +next series of examples we will treat the picture as a whole. First we invert the +colors using \type {inverted}. + +\startbuffer +loadfigure "gracht.mp" number 1 scaled .5 ; +addto currentpicture also + inverted currentpicture + shifted (bbwidth(currentpicture)+.5cm,0) ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] \processMPbuffer \stoplinecorrection + +This is a special case of \type {uncolored}. In the next example we explicitly +specify the color. + +\startbuffer +loadfigure "gracht.mp" number 1 scaled .5 ; +addto currentpicture also + (currentpicture uncolored green) + shifted (bbwidth(currentpicture)+.5cm,0) ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] \processMPbuffer \stoplinecorrection + +You can also multiply each color using \type {softened}. In the next sample, the +colors have 80\% of their value. + +\startbuffer +loadfigure "gracht.mp" number 1 scaled .5 ; +addto currentpicture also + (currentpicture softened .8) + shifted (bbwidth(currentpicture)+.5cm,0) ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] \processMPbuffer \stoplinecorrection + +You can also use this operator to harden colors, simply by +providing a value larger than~1. Keep in mind that colors +are clipped at~1 anyway. + +\startbuffer +loadfigure "gracht.mp" number 1 scaled .5 ; +addto currentpicture also + (currentpicture softened 1.2) + shifted (bbwidth(currentpicture)+.5cm,0) ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] \processMPbuffer \stoplinecorrection + +By providing a triplet, you can treat each color component +independently. + +\startbuffer +loadfigure "gracht.mp" number 1 scaled .5 ; +addto currentpicture also + (currentpicture softened (.7,.8,.9)) + shifted (bbwidth(currentpicture)+.5cm,0) ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] \processMPbuffer \stoplinecorrection + +After these examples your are probably sick of seeing this picture in color, so +let's turn the colors into a weigthed grayscales (in a way similar to the way +black and white television treated color). + +\startbuffer +loadfigure "gracht.mp" number 1 scaled .5 ; +addto currentpicture also + grayed currentpicture + shifted (bbwidth(currentpicture)+.5cm,0) ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] \processMPbuffer \stoplinecorrection + +\stopsection + +% \startsection[title={Outline fonts}] +% +% \index{text+outlines} +% \index{outlines} +% +% Outline fonts don't belong to \METAPOST's repertoire of features. Nevertheless we +% can simulate this in a reasonable way. We will not discuss all details here, +% because most details are covered in the \MAKEMPY\ manual. +% +% The macro responsible for outline fonts is \type {graphictext}. The first +% argument should be a string. This string is processed by \TEX. Additionally you +% can provide transformation directives and color specifications. The next example +% demonstrates this. +% +% \startbuffer +% graphictext "\bf Fun" scaled 4 zscaled (1,1.5) +% withdrawcolor blue +% withfillcolor .5white +% withpen pencircle scaled 5pt +% \stopbuffer +% +% \typebuffer +% +% Once the text is typeset by \TEX, it is converted to \POSTSCRIPT\ and converted +% into \METAPOST\ by the \PSTOEDIT\ program. The resulting graphic is imported, +% analyzed, and processed conforming the specifications of \type {graphictext}. +% +% \startlinecorrection[blank] +% \processMPbuffer +% \stoplinecorrection +% +% By default the shapes are filled after they are drawn. This has the advantage +% that in characters built out of pieces, disturbing lines fragments are covered. +% The drawback is that you get only half the linewidth. You can reverse the drawing +% order by adding the \type {reversefill} directive. The previous graphic then +% comes out as: +% +% \startbuffer +% graphictext "\bf Fun" scaled 4 zscaled (1,1.5) +% reversefill +% withdrawcolor blue +% withfillcolor .5white +% withpen pencircle scaled 5pt +% \stopbuffer +% +% \typebuffer +% +% The \type {reversefill} directive can be countered by \type {outlinefill}. +% +% \startlinecorrection[blank] +% \processMPbuffer +% \stoplinecorrection +% +% The next example is taken from the \MAKEMPY\ manual. It demonstrates that you can +% combine \TEX's powerful line breaking with \METAPOST's graphic capabilities. +% +% \startbuffer +% \startuseMPgraphic{quotation} +% picture one ; one := image ( graphictext +% \MPstring{text} +% scaled 1.5 +% withdrawcolor .625blue +% withfillcolor .625white +% withpen pencircle scaled 1pt ; ) ; +% picture two ; two := image ( graphictext +% \MPstring{author} +% scaled 2 +% withdrawcolor .625red +% withfillcolor .625white +% withpen pencircle scaled 2pt ; ) ; +% currentpicture := one ; +% addto currentpicture also two +% shifted lrcorner one +% shifted - 1.125 lrcorner two +% shifted (0, - 1.250 * ypart urcorner two) ; +% setbounds currentpicture to boundingbox currentpicture enlarged 3pt ; +% \stopuseMPgraphic +% \stopbuffer +% +% \typebuffer \getbuffer +% +% In this graphic, we have two text fragments, the first one is a text, the second +% one the name of the author. We combine the quotation and author into this graphic +% using the following definitions: +% +% \startbuffer +% \setMPtext{text} {\vbox{\hsize 8.5cm \input zapf }} +% \setMPtext{author}{\hbox{\sl Hermann Zapf}} +% \stopbuffer +% +% \typebuffer \getbuffer +% +% These definitions assume that the file \type {zapf.tex} is present on the system +% (which is the case when you have installed \CONTEXT). The graphic can now be +% typeset using the following call: +% +% \startbuffer +% \placefigure +% {A text does not need to be an outline in order to be +% typeset in an outline font.} +% {\useMPgraphic{quotation}} +% \stopbuffer +% +% \typebuffer \getbuffer +% +% The quality of the output depends on how the glyphs are constructed. For +% instance, in \TEX, math symbols are sometimes composed of glyph fragments and +% rules. +% +% \startbuffer +% graphictext +% "$$\sqrt{1+x}$$" +% scaled 8 +% withdrawcolor .625red +% withpen pencircle scaled 1.5pt +% \stopbuffer +% +% \typebuffer +% +% \startlinecorrection[blank] +% \processMPbuffer +% \stoplinecorrection +% +% This is not really a problem because we can also fill the shapes. It is the +% reason why the fill is applied after the draw and in such case the effective line +% width is half the size specified. +% +% \startbuffer +% graphictext +% "$$\left({{\sqrt{1+x}}\over{\sqrt{2+x^2}}}\right)$$" +% scaled 4 +% dashed evenly +% withdrawcolor .625red +% withfillcolor .850white +% withpen pencircle scaled 1.5pt +% \stopbuffer +% +% \typebuffer +% +% In this example we also use a dashed line. Instead of normal colors, we could +% have used shades or transparent colors. +% +% \startlinecorrection[blank] +% \processMPbuffer +% \stoplinecorrection +% +% Instead of supplying the text directly, you can use the indirect method. This +% permits you to process rather complex data without messing up your \METAPOST\ +% code. +% +% \startbuffer +% \setMPtext {some math}% +% {\usemodule[mathml] +% \xmlprocessdata +% {main} +% {<math xmlns='http://www.w3c.org/mathml' version='2.0'> +% <apply> <log/> +% <logbase> <cn> 2 </cn> </logbase> +% <apply> <plus/> +% <ci> x </ci> +% <cn> 1 </cn> +% </apply> +% </apply> +% </math>} +% {}} +% \stopbuffer +% +% \typebuffer \getbuffer +% +% Here we feed some \MATHML\ into \TEX, which in turn shows up as a \METAPOST\ +% graphic. +% +% \startbuffer +% graphictext +% \MPstring{some math} +% scaled 4 +% withdrawcolor .625red +% withfillcolor .625white +% withpen pencircle scaled 1.5pt +% \stopbuffer +% +% \typebuffer +% +% \startlinecorrection[blank] +% \processMPbuffer +% \stoplinecorrection +% +% \stopsection + +\startsection[title={Outline fonts}] + +\index{text+outlines} +\index{outlines} + +Outline fonts don't belong to \METAPOST's repertoire of features. Nevertheless we +can simulate this in a reasonable way. The current version of \METAFUN\ uses the +outline subsystem of \CONTEXT\ \MKIV, but in earlier days we used an external +process: a \PDF\ file is generated that has the snippet, that gets converted to +\POSTSCRIPT, which in turn is converted to \METAPOST\ with \type {pstoedit} and +from that result we filter the outlines. This method uses \type {graphictext} and +is covered in the \MAKEMPY\ manual. Here we discuss the new method using \type +{outlinetext}. + +\startbuffer +draw outlinetext.b("\bf Funky") + (withcolor .5white) + (withcolor blue withpen pencircle scaled 1/5) + scaled 4 zscaled (1,0.5) ; +\stopbuffer + +\typebuffer + +Once the text is typeset by \TEX, the result (a node list) is parsed and a +\METAPOST\ representation is created. The glyphs are converted to outlines that +are taken from the original font. For the moment this only works for \OPENTYPE\ +fonts. + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +\startbuffer[1] +draw outlinetext ("\bf Funky") + scaled 3 ; +\stopbuffer + +\startbuffer[2] +draw outlinetext.d ("\bf Funky") + (withcolor red withpen pencircle scaled 1/5) + scaled 3 ; +\stopbuffer + +\startbuffer[3] +draw outlinetext.f ("\bf Funky") + (withcolor blue) + scaled 3 ; +\stopbuffer + +\startbuffer[4] +draw outlinetext.b ("\bf Funky") + (withcolor blue) + (withcolor red withpen pencircle scaled 1/5) + scaled 3 ; +\stopbuffer + +\startbuffer[5] +draw outlinetext.r ("\bf Funky") + (withcolor blue) + (withcolor red withpen pencircle scaled 1/5) + scaled 3 ; +\stopbuffer + +\startplacetable[reference=tab:outlinetext,title={The four variants of \type {graphictext}.}] + \bTABLE[offset=1ex] + \dorecurse{5}{\bTR \bTD \processMPbuffer[#1] \eTD \bTD \typebuffer[#1] \eTD \eTR} + \eTABLE +\stopplacetable + +The five variants of this command are shown in \in {table} [tab:outlinetext]: the +suffix determines the number of arguments and rendering. The \type {r} suffix +reverses the order: the fill comes over the draw. There is a \type {p} suffix +that returns just the picture. + +The next example demonstrates that you can combine \TEX's powerful line breaking +algorithm with \METAPOST's graphic capabilities. + +\startbuffer +\startuseMPgraphic{quotation} + picture one ; one := image ( draw outlinetext.b + (\MPstring{text}) + (withcolor .625white) + (withcolor .625blue withpen pencircle scaled 1/5) + scaled 1.5 + ) ; + picture two ; two := image ( draw outlinetext.b + (\MPstring{author}) + (withcolor .625white) + (withcolor .625red withpen pencircle scaled 1/5) + scaled 2 + ) ; + currentpicture := one ; + addto currentpicture also two + shifted lrcorner one + shifted - 1.125 lrcorner two + shifted (0, - 2 * ypart urcorner two) ; + setbounds currentpicture to boundingbox currentpicture enlarged 3pt ; +\stopuseMPgraphic +\stopbuffer + +\typebuffer \getbuffer + +In this graphic, we have two text fragments, the first one is a text, the second +one the name of the author. We combine the quotation and author into this graphic +using the following definitions: + +\startbuffer +\setMPtext + {text} + {\vbox + {\setupalign[verytolerant,stretch] + \hsize 8.5cm + \input zapf }} +\setMPtext + {author} + {\hbox + {\sl Hermann Zapf}} +\stopbuffer + +\typebuffer \getbuffer + +These definitions assume that the file \type {zapf.tex} is present on the system +(which is the case when you have installed \CONTEXT). The graphic can now be +typeset using the following call: + +\startbuffer +\placefigure + [here] + [fig:zapf] + {A text does not need to be an outline in order to be + typeset in an outline font.} + {\useMPgraphic{quotation}} +\stopbuffer + +\typebuffer + +The result is \in {figure} [fig:zapf]. The quality of the output depends on how +the glyphs are constructed. For instance, in \TEX, math symbols are sometimes +composed of glyph fragments and rules. + +\start + \def||{-} + \getbuffer +\stop + +\startbuffer +draw outlinetext.d + ("\mathematics{\sqrt{1+x}}") + (withcolor .625red withpen pencircle scaled 1/5) + scaled 8 +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +This is not really a problem because we can also fill the shapes. It is the +reason why the fill is applied after the draw and in such case the effective line +width is half the size specified. + +\startbuffer +draw outlinetext.b + ("\mathematics{\left({{\sqrt{1+x}}\over{\sqrt{2+x^2}}}\right)}") + (withcolor .850white) + (withcolor .625red + dashed evenly scaled .1 + withpen pencircle scaled 1/5) + scaled 8 +\stopbuffer + +\typebuffer + +In this example (shown in \in {figure} [fig:dashedoutline]) we also use a dashed +line. + +\placefigure + [here] + [fig:dashedoutline] + {A dashed outline text.} + {\processMPbuffer} + +Instead of supplying the text directly, you can use the indirect method. This +permits you to process rather complex data without messing up your \METAPOST\ +code. + +\startbuffer +\usemodule[mathml] + +\setMPtext {some math}% + {\xmlprocessdata + {main} + {<math xmlns='http://www.w3c.org/mathml' version='2.0'> + <apply> <log/> + <logbase> <cn> 2 </cn> </logbase> + <apply> <plus/> + <ci> x </ci> + <cn> 1 </cn> + </apply> + </apply> + </math>} + {}} +\stopbuffer + +\typebuffer \getbuffer + +Here we feed some \MATHML\ into \TEX, which in turn shows up as a \METAPOST\ +graphic (\in {figure} [fig:mathml]). + +\startbuffer +draw outlinetext.b + (\MPstring{some math}) + (withcolor .625white) + (withcolor .625red withpen pencircle scaled 1/5) + scaled 8 +\stopbuffer + +\typebuffer + +\placefigure + [here] + [fig:mathml] + {A \MATHML\ snippet turned into outlines.} + {\processMPbuffer} + +Outlines are fun to look at. Here are a few ways to visualize a glyph: + +\startbuffer[1] +\startcombination[3*1] + {\ruledhbox\bgroup + \showshape[character=(,alternative=text]% + \egroup} {} + {\ruledhbox\bgroup + \showshape[character=a,alternative=text]% + \egroup} {} + {\ruledhbox\bgroup + \showshape[character=x,alternative=text]% + \egroup} {} +\stopcombination +\stopbuffer + +\typebuffer[1] + +You can control the rendering a bit by setting \type {option}. Possible options +are: \type {box}, \type {width}, \type {min}, \type {max} and \type {comment}. +The \type {simple} option disables all. The simple results are shown in +\in{figure} [fig:showshape]. + +\startbuffer[2] +\startcombination[3*1] + {\ruledhbox\bgroup + \showshape[character=(,alternative=text,option=simple]% + \egroup} {} + {\ruledhbox\bgroup + \showshape[character=a,alternative=text,option=simple]% + \egroup} {} + {\ruledhbox\bgroup + \showshape[character=x,alternative=text,option=simple]% + \egroup} {} +\stopcombination +\stopbuffer + +\typebuffer[2] + +\startplacefigure[reference=fig:showshape,title={Showing shapes.}] + \getbuffer[2] +\stopplacefigure + +When you use this feature you need to be aware of the fact that fonts can have +features, for instance ligatures and kerns between characters. In \in {figure} +[fig:outlines:features] we see a few examples with and without features, one with +Pagella (the Zapf quote) and one with Optima Nova (the Tufte quote). + +\startplacefigure[reference=fig:outlines:features,title={Pagela (\OPENTYPE) and Optima Nova (\TYPEONE)}] + \startcombination[1*4] + \bgroup + \def|#1|{-}% + \definedfont[texgyrepagella-regular.otf*none]% + \startMPcode + draw outlinetext.b + ("\framed[align=normal,width=max]{\input{zapf}}") + (withcolor .375white) + (withcolor .625red withpen pencircle scaled 1/10) ; + \stopMPcode + \egroup {pagella / no features} + \bgroup + \def|#1|{-}% + \definedfont[texgyrepagella-regular.otf*default]% + \startMPcode + draw outlinetext.b + ("\framed[align=normal,width=max]{\input{zapf}}") + (withcolor .375white) + (withcolor .625blue withpen pencircle scaled 1/10) ; + \stopMPcode + \egroup {pagella / default features} + \bgroup + \def|#1|{-}% + \definedfont[lt55476.afm*none]% optima nova + \startMPcode + draw outlinetext.b + ("\framed[align=normal,width=max]{\input{tufte}}") + (withcolor .375white) + (withcolor .625green withpen pencircle scaled 1/10) ; + \stopMPcode + \egroup {optima nova / no features} + \bgroup + \def|#1|{-}% + \definedfont[lt55476.afm*default]% optima nova + \startMPcode + draw outlinetext.b + ("\framed[align=normal,width=max]{\input{tufte}}") + (withcolor .375white) + (withcolor .625yellow withpen pencircle scaled 1/10) ; + \stopMPcode + \egroup {optima nova / default features} + \stopcombination +\stopplacefigure + +Given that a shape has a path that is suitable for it, you can use special effects, +like: + +\startbuffer + draw image ( + draw outlinetext.d + ("Abracadabra") + (withpen pencircle scaled 1/10 dashed withdots scaled 1/20) ; + ) xsized TextWidth ; +\stopbuffer + +\typebuffer + +\startlinecorrection + \processMPbuffer +\stoplinecorrection + +\stopsection + +\startsection[title=Transparency groups] + +The following feature is not that usefull but implemented anyway. The \PDF\ reference says: + +\startitemize + \startitem + A group may be isolated or non-isolated, which shall determine the + initial backdrop against which its stack is composited. + \stopitem + \startitem + A group may be knockout or non-knockout, which shall determine whether + the objects within its stack are composited with one another or only with + the group’s backdrop. + \stopitem +\stopitemize + +and then carries on with a detailed explanation of groups. Here we stick to just +mentioning how one can create a group in a picture. First we define a helper: + +\startbuffer +\startMPdefinitions + def ShowGroup (expr clr) (text grouped) = + draw image ( + drawarrow (10,0) -- (0,0) + withtransparency(1,.5) + withcolor clr ; + ) grouped ; + currentpicture := currentpicture xsized (TextWidth/8) ; + setbounds currentpicture to boundingbox currentpicture enlarged 2mm ; + addbackground withcolor .5white ; + enddef ; +\stopMPdefinitions +\stopbuffer + +\typebuffer \getbuffer + +\startlinecorrection[blank] + \startcombination[5*1] + {\startMPcode ShowGroup(.5red) () \stopMPcode} {\tttf no group} + {\startMPcode ShowGroup(.5green) (asgroup "") \stopMPcode} {\tttf group} + {\startMPcode ShowGroup(.5blue) (asgroup "isolated") \stopMPcode} {\tttf isolated} + {\startMPcode ShowGroup(.5cyan) (asgroup "knockout") \stopMPcode} {\tttf knockout} + {\startMPcode ShowGroup(.5magenta)(asgroup "isolated,knockout") \stopMPcode} {\tttf isolated\crlf knockout} + \stopcombination +\stoplinecorrection + +The syntax is: + +\starttyping +draw somepicture|somepath grouped "[isolated|knockout] ; +\stoptyping + +The group becomes an object and is no longer part of the stream of graphic +operators but a reference. For what it's worth: I never needed this feature. + +\stopsection + +\startsection[title=Decorating] + +Although the \METAPOST\ language is quite powerful the number of data types is +not that large and when it comes to drawing stuff there are only paths and +pictures. A path is a list of points (with controlpoints) and a few properties, +like the pen, linewidth, linecap, color and such. For a long time in \METAFUN\ we +used so called specials to implement extensions (like shading). This was done by +using special colors and associating these with entries in the special section at +the top of the output. + +Nowadays we use the pre- and postscript properties of paths. The advantage is +that we can add whatever we want, as long as the backend supports it and because +the backend is written in \LUA\ there are no real limitations. So, instead of +extending \METAPOST\ we extend the \METAFUN\ macros and backend. + +Most extensions use the prescripts. Think of this: + +\starttyping +draw fullcircle + withprescript "do this" + withprescript "and that" + withprescript "and even more" ; +\stoptyping + +Eventually this becomes a string: + +\starttyping +and even more<newline>and that<newline>do this +\stoptyping + +\typebuffer + +The prescripts get prepended, while the postscripts (that we use for text only) +get appended. When we draw a picture with properties (like color) they get +overwritten but not so (with good reason) for the pre- and postscripts: these +just accumulate. We will now demonstrate how we can manipulate the picture +(a bit). + +\startbuffer +picture MyShape ; MyShape := image ( + fill fullsquare xyscaled (4,1) withcolor .625red ; + fill fullsquare xyscaled (3,1) withcolor .625green ; + fill fullsquare xyscaled (2,1) withcolor .625blue ; + fill fullsquare xyscaled (1,1) withcolor .625yellow ; +) xysized (TextWidth,1cm) ; + +draw MyShape; +\stopbuffer + +\typebuffer + +We just draw the (natural) picture: + +\startlinecorrection[blank] + \processMPbuffer +\stoplinecorrection + +When we draw the picture with a new color, all its components get recolored: + +\startbuffer +draw MyShape + withcolor .625magenta ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] + \processMPbuffer +\stoplinecorrection + +However, when we add a transparency only the first component gets adapted because +we use prescripts for this extension. (An extension using the postscripts would +affect the last component.) + +\startbuffer +draw MyShape + withcolor .625magenta + withtransparency (1,.5) ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] + \processMPbuffer +\stoplinecorrection + +The same logic applied to the \type {image}: prescripts get prepended to the +first copmponent, postscripts to the last. + +\startbuffer +draw image (draw MyShape) + withcolor .625cyan ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] + \processMPbuffer +\stoplinecorrection + +\startbuffer +draw image (draw MyShape) + withcolor .625cyan + withtransparency (1,.5) ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] + \processMPbuffer +\stoplinecorrection + +The \type {undecorated} macro ignores the properties. We can't reset the scripts as +this could ruin the effects like shading. + +\startbuffer +draw undecorated (draw MyShape) + withcolor .625white ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] + \processMPbuffer +\stoplinecorrection + +The \type {decorated} macro applies the properties to each component. + +\startbuffer +draw decorated (draw MyShape) + withtransparency (1,.5) ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] + \processMPbuffer +\stoplinecorrection + +Here we kept the colors as they are but next we redo them: + +\startbuffer +draw decorated (draw MyShape) + withcolor .625magenta + withtransparency (1,.5) ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] + \processMPbuffer +\stoplinecorrection + +The \type {redecorated} macro is the most intrusive as it resets the properties. +This also means that you will loose texts, shades etc. + +\startbuffer +draw redecorated (draw MyShape) + withtransparency (1,.5) ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] + \processMPbuffer +\stoplinecorrection + +Indeed we get no color (but black) but we can bring back some color: + +\startbuffer +draw redecorated (draw MyShape) + withcolor .625yellow + withtransparency (1,.5) ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] + \processMPbuffer +\stoplinecorrection + +\stopsection + +\startsection[title=Properties] + +The (plain) \METAPOST\ macro \type {drawoptions} stored its arguments +in a macro that gets expanded when something is drawn (or filled). So, when you say + +\starttyping +drawoptions(withcolor red) ; +draw somepath ; +\stoptyping + +This effectively is: + +\starttyping +draw somepath withcolor red ; +\stoptyping + +A disadvantage is that there is not much control over where it gets applied, +especially when you hide drawing operations in macros. It's the reason why +personally I always prefer explicit options. If you want some abstraction +you can use the properties feature: + +\startbuffer +\startMPcode + property p[] ; + p1 = properties(withcolor "darkred") ; + p2 = properties(withcolor "darkblue") ; + p3 = properties(withcolor "darkgreen") ; + fill fullsquare xysized (TextWidth,12mm) withproperties p1 ; + fill fullsquare xysized (TextWidth, 8mm) withproperties p2 ; + fill fullsquare xysized (TextWidth, 4mm) withproperties p3 ; + fill fullsquare xysized (TextWidth, 2mm) withproperties p1 ; +\stopMPcode +\stopbuffer + +\typebuffer + +We get: + +\startlinecorrection +\getbuffer +\stoplinecorrection + +Here we use an \quote {array} of properties but a single property is also possible: + +\startbuffer +\startMPcode + property p ; + p = properties(withcolor "darkyellow") ; + fill fullsquare xysized (TextWidth,4mm) withproperties p ; +\stopMPcode +\stopbuffer + +\typebuffer + +We get: + +\startlinecorrection +\getbuffer +\stoplinecorrection + +\stopsection + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/metafun/metafun-embedding.tex b/doc/context/sources/general/manuals/metafun/metafun-embedding.tex new file mode 100644 index 000000000..10383fa3a --- /dev/null +++ b/doc/context/sources/general/manuals/metafun/metafun-embedding.tex @@ -0,0 +1,1208 @@ +% language=uk +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\startcomponent metafun-embedding + +\environment metafun-environment + +\startchapter[reference=sec:embedding,title={Embedded graphics}] + +\startintro + +In addition to the \type {beginfig}||\type {endfig} method, there are other ways +to define and include a \METAPOST\ graphic. Each method has its advantages and +disadvantages. + +In the previous chapter we were still assuming that the graphic was defined in +its own file. In this chapter we will introduce the interface between \CONTEXT\ +and \METAPOST\ and demonstrate how the definitions of the graphics can be +embedded in the document source. + +\stopintro + +\startsection[title={Getting started}] + +\index{running} +\index{processing} + +From now on, we will assume that you have \CONTEXT\ running on your platform. +Since \PDF\ has full graphics support, we also assume that you use \LUATEX\ in +combination with \CONTEXT\ \MKIV, although most will also work with other engines +and \MKII. Since this document is not meant as a \CONTEXT\ tutorial, we will +limit this introduction to the basics needed to run the examples. + +A simple document looks like: + +\starttyping +\starttext + Some text. +\stoptext +\stoptyping + +You can process this document with the \LUA\ based command line interface to +\CONTEXT. If the source code is embedded in the file \type {mytext.tex}, you can +say: + +\starttyping +context mytext +\stoptyping + +We will use color, and in \MKIV\ color is enabled by default. If you don't want +color you can tell \CONTEXT, so + +\starttyping +\setupcolors[state=stop] +\starttext + Some \color[blue]{text} and/or \color[green]{graphics}. +\stoptext +\stoptyping + +comes out in black and white. + +In later chapters we will occasionally see some more \CONTEXT\ commands show up. +If you want to know more about what \CONTEXT\ can do for you, we recommend the +beginners manual and the reference manual, as well as the wiki pages. + +\stopsection + +\startsection[title={External graphics}] + +\index {graphics+external} + +Since \TEX\ has no graphic capabilities built in, a graphic is referred to as an +external figure. A \METAPOST\ graphic often has a number as suffix, so embedding +such a graphic is done by: + +\starttyping +\externalfigure[graphic.123][width=4cm] +\stoptyping + +An alternative method is to separate the definition from the inclusion. An +example of a definition is: + +\starttyping +\useexternalfigure[pentastar][star.803][height=4cm] +\useexternalfigure[octostar] [star.804][pentastar] +\stoptyping + +Here, the second definition inherits the characteristics from the first one. +These graphics can be summoned like: + +\starttyping +\placefigure + {A five||point star drawn by \METAPOST.} + {\externalfigure[pentastar]} +\stoptyping + +Here the stars are defined as stand||alone graphics, in a file called \type +{star.mp}. Such a file can look like: + +\starttyping +def star (expr size, n, pos) = + for a=0 step 360/n until round(360*(1-1/n)) : + draw (origin -- (size/2,0)) + rotatedaround (origin,a) shifted pos ; + endfor ; +enddef ; + +beginfig(803) ; + pickup pencircle scaled 2mm ; star(2cm,5,origin) ; +endfig ; + +beginfig(804) ; + pickup pencircle scaled 1mm ; star(1cm,8,origin) ; + pickup pencircle scaled 2mm ; star(2cm,7,(3cm,0)) ; +endfig ; + +end. +\stoptyping + +This \type {star} macro will produce graphics like: + +\startbuffer +def star (expr size, n, pos) = + for a=0 step 360/n until round(360*(1-1/n)) : + draw (origin -- (size/2,0)) + rotatedaround (origin,a) shifted pos ; + endfor ; +enddef ; + +for i=5 upto 10 : + drawoptions (withpen pencircle scaled 2mm withcolor .625red) ; + star(1cm,i,origin shifted (i*2cm,0)) ; +endfor ; +\stopbuffer + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +But, now that we have instant \METAPOST\ available in \LUATEX, there is no need +for external images and we can collect them in libraries, as we will see later +on. + +\stopsection + +\startsection[title={Integrated graphics}] + +\index{graphics+embedded} + +An integrated graphic is defined in the document source or in a style definition +file. The most primitive way of doing this is just inserting the code: + +\starttyping +\startMPcode + fill fullcircle scaled 200pt withcolor .625white ; +\stopMPcode +\stoptyping + +Such a graphic is used once at the spot where it is defined. In this document we +also generate graphics while we finish a page, so there is a good chance that +when we have constructed a graphic which will be called on the next page, the +wrong graphic is placed. + +For this reason there are are more convenient ways of defining and using +graphics, which have the added advantage that you can predefine multiple +graphics, thereby separating the definitions from the usage. + +The first alternative is a {\em usable} graphic. Such a graphic is calculated +anew each time it is used. An example of a usable graphic is: + +\starttyping +\startuseMPgraphic{name} + fill fullcircle scaled 200pt withcolor .625yellow ; +\stopuseMPgraphic +\stoptyping + +When you put this definition in the preamble of your document, you can place this +graphic anywhere in the file, saying: + +\starttyping +\useMPgraphic{name} +\stoptyping + +As said, this graphic is calculated each time it is placed, which can be time +consuming. Apart from the time aspect, this also means that the graphic itself is +incorporated many times. Therefore, for graphics that don't change, \CONTEXT\ +provides {\em reusable} graphics: + +\starttyping +\startreusableMPgraphic{name} + fill fullcircle scaled 200pt withcolor .625yellow; +\stopreusableMPgraphic +\stoptyping + +This definition is accompanied by: + +\starttyping +\reuseMPgraphic{name} +\stoptyping + +Imagine that we use a graphic as a background for a button. We can create a +unique and reusable graphic by saying: + +\starttyping +\def\MyGraphic + {\startreusableMPgraphic{name:\overlaywidth:\overlayheight} + path p ; p := unitsquare + xscaled OverlayWidth yscaled OverlayHeight ; + fill p withcolor .625yellow ; + draw p withcolor .625red ; + \stopreusableMPgraphic + \reuseMPgraphic{name:\overlaywidth:\overlayheight}} +\stoptyping + +Notice the use of \type {OverlayWidth} and \type {OverlayHeight}. These variables +are set for each call to \METAPOST. After this we can say: + +\starttyping +\defineoverlay[my graphic][\MyGraphic] +\button[background=my graphic,frame=off]{Go Home}[firstpage] +\stoptyping + +Say that we have a 30pt by 20pt button, then the identifier will be \type +{name:30pt:20pt}. Different dimensions will lead to other identifiers, so this +sort of makes the graphics unique. + +We can bypass the ugly looking \type {\def} by using a third class of embedded +graphics, the {\em unique} graphics. + +\starttyping +\startuniqueMPgraphic{name} + path p ; p := unitsquare + xscaled OverlayWidth yscaled OverlayHeight ; + fill p withcolor .625yellow ; + draw p withcolor .625red ; +\stopuniqueMPgraphic +\stoptyping + +Now we can say: + +\starttyping +\defineoverlay[my graphic][\uniqueMPgraphic{name}] +\button[background=my graphic,frame=off]{Go Home}[firstpage] +\stoptyping + +A shorter variant is: + +\starttyping +\startuniqueMPgraphic{name} + fill OverlayBox withcolor .625yellow ; + draw OverlayBox withcolor .625red ; +\stopuniqueMPgraphic +\stoptyping + +You may wonder why unique graphics are needed when a single graphic might be used +multiple times by scaling it to fit the situation. Since a unique graphic is +calculated for each distinctive case, we can be sure that the current +circumstances are taken into account. Also, scaling would result in incomparable +graphics. Consider the following definition: + +\startbuffer[a] +\startuseMPgraphic{demo} + draw unitsquare + xscaled 5cm yscaled 1cm + withpen pencircle scaled 2mm + withcolor .625red ; +\stopuseMPgraphic +\stopbuffer + +\typebuffer[a] + +Since we reuse the graphic, the dimensions are sort of fixed, and because the +graphic is calculated once, scaling it will result in incompatible line widths. + +\startbuffer[b] +\hbox \bgroup + \scale[width=5cm,height=1cm]{\useMPgraphic{demo}}\quad + \scale[width=8cm,height=1cm]{\useMPgraphic{demo}}% +\egroup +\stopbuffer + +\startlinecorrection[blank] +\getbuffer[a,b] +\stoplinecorrection + +These graphics were placed with: + +\typebuffer[b] + +Imagine what happens when we add some buttons to an interactive document without +taking care of this side effect. All the frames would look different. Consider +the following example. + +\startbuffer[a] +\startuniqueMPgraphic{right or wrong} + pickup pencircle scaled .075 ; + fill unitsquare withcolor .8white ; + draw unitsquare withcolor .625red ; + currentpicture := currentpicture + xscaled OverlayWidth yscaled OverlayHeight ; +\stopuniqueMPgraphic +\stopbuffer + +\typebuffer[a] + +Let's define this graphic as a background to some buttons. + +\startbuffer[b] +\defineoverlay[button][\uniqueMPgraphic{right or wrong}] +\setupbuttons[background=button,frame=off] +\stopbuffer + +\startbuffer[c] +\hbox + {\button {previous} [previouspage]\quad + \button {next} [nextpage]\quad + \button {index} [index]\quad + \button {table of contents} [content]} +\stopbuffer + +\typebuffer[b,c] + +The buttons will look like: + +\startlinecorrection[blank] +\setupinteraction[state=start,color=,contrastcolor=] +\getbuffer[a,b,c] +\stoplinecorrection + +Compare these with: + +\startbuffer[a] +\startuniqueMPgraphic{wrong or right} + pickup pencircle scaled 3pt ; + path p ; p := unitsquare + xscaled OverlayWidth yscaled OverlayHeight ; + fill p withcolor .8white ; + draw p withcolor .625red ; +\stopuniqueMPgraphic +\stopbuffer + +\startlinecorrection[blank] +\getbuffer[a,b] +\defineoverlay[button][\uniqueMPgraphic{wrong or right}] +\setupinteraction[state=start,color=,contrastcolor=] +\getbuffer[c] +\stoplinecorrection + +Here the graphic was defined as: + +\typebuffer[a] + +The last class of embedded graphics are the {\em runtime} graphics. When a +company logo is defined in a separate file \type {mylogos.mp}, you can run this +file by saying: + +\starttyping +\startMPrun + input mylogos ; +\stopMPrun +\stoptyping + +The source for the logo is stored in a file named \type {mylogos.mp}. + +\startbuffer +beginfig(21) ; + draw fullsquare withcolor .625red ; + draw fullsquare rotated 45 withcolor .625red ; + picture cp ; cp := currentpicture ; + def copy = addto currentpicture also cp enddef ; + copy scaled .9 withcolor .625white ; + copy scaled .7 withcolor .625yellow ; + copy scaled .6 withcolor .625white ; + copy scaled .4 withcolor .625red ; + copy scaled .3 withcolor .625white ; + fill fullcircle scaled .2 withcolor .625yellow ; + currentpicture := currentpicture scaled 50 ; +endfig ; +end . +\stopbuffer + +\typebuffer + +In this example the result is available in the virtual file \type {mprun.21}. +This file can be included in the normal way, using: + +\starttyping +\externalfigure[mprun.21][width=5cm] +\stoptyping + +\startuseMPgraphic{dummy logo} + draw fullsquare withcolor .625red ; + draw fullsquare rotated 45 withcolor .625red ; + picture cp ; cp := currentpicture ; + def copy = addto currentpicture also cp enddef ; + copy scaled .9 withcolor .625white ; + copy scaled .7 withcolor .625yellow ; + copy scaled .6 withcolor .625white ; + copy scaled .4 withcolor .625red ; + copy scaled .3 withcolor .625white ; + fill fullcircle scaled .2 withcolor .625yellow ; + currentpicture := currentpicture scaled 3cm ; +\stopuseMPgraphic + +\placefigure + {The logo is defined in the file \type {mylogos.mp} as + figure~21 and processed by means of the \type {mprun} + method.} + {\useMPgraphic{dummy logo}} + +Optionally you can specify a name and an instance. This has the advantage that +the graphics don't interfere with the regular inline graphics. Here the instance +used is \type {extrafun} and the name where the run is stored is \type {mydemo}. + +\startbuffer +\startMPrun{extrafun::mydemo} + input mfun-mrun-demo.mp ; +\stopMPrun + +\placefigure + {An external file can have multiple graphics. Here we show a few + images that we used to use on the \PRAGMA\ \CONTEXT\ website.} + {\startcombination[2*2] + {\externalfigure[mprun:extrafun::mydemo.1][height=6cm]} {downloads} + {\externalfigure[mprun:extrafun::mydemo.2][height=6cm]} {links} + {\externalfigure[mprun:extrafun::mydemo.3][height=6cm]} {mirrors} + {\externalfigure[mprun:extrafun::mydemo.4][height=6cm]} {team} + \stopcombination} +\stopbuffer + +\typebuffer + +Keep in mind that the whole file will be processed (using the built in library) +in order to get one graphic. Normally this is no big deal. + +\getbuffer + +\stopsection + +\startsection[title={Using \METAFUN\ but not \CONTEXT}] + +\index{graphics+standalone} + +If you don't want to use \CONTEXT\ but still want to use \METAFUN, a rather +convenient method is the following. Create a file that + +\starttyping +\startMPpage + % Your mp code goes here. You can use the textext + % macro as discussed later to deal with typeset text. +\stopMPpage +\stoptyping + +When you process that file with the \type {context} command you will get a \PDF\ +file that you can include in any application that can embed a \PDF\ image. In +this case your exposure to \CONTEXT\ is minimal. + +\stopsection + +\startsection[title={Graphic buffers}] + +\index{graphics+buffers} +\index{buffers} + +In addition to the macros defined in the previous section, you can use \CONTEXT's +buffers to handle graphics. This can be handy when making documentation, so it +makes sense to spend a few words on them. + +A buffer is a container for content that is to be (re|)|used later on. The main +reason for their existence is that they were needed for typesetting manuals and +articles on \TEX. By putting the code snippets in buffers, we don't have to key +in the code twice, since we can either show the code of buffers verbatim, or +process the code as part of the text flow. This means that the risk of mismatch +between the code shown and the typeset text is minimized. + +\startbuffer[a] +\startbuffer +You are reading the \METAFUN\ manual. +\stopbuffer +\stopbuffer + +\typebuffer[a] + +This buffer can be typeset verbatim using \type {\typebuffer} and processed using +\type {\getbuffer}, as we will do now: + +\blank \getbuffer[a] \blank + +An other advantage of using buffers, is that they help you keeping the document +source clean. In many places in this manual we put table or figure definitions in +a buffer and pass the buffer to another command, like: + +\starttyping +\placefigure{A very big table}{\getbuffer} +\stoptyping + +Sometimes it makes sense to collect buffers in separate files. In that case we +give them names. + +\startbuffer +\startbuffer[mfun] +You are reading the \METAFUN\ manual. +\stopbuffer +\stopbuffer + +This time we should say \type {\typebuffer[mfun]} to typeset the code verbatim. +Instead of \TEX\ code, we can put \METAPOST\ definitions in buffers. + +\startbuffer +\startbuffer[graphic] +draw fullcircle scaled 2cm ; +\stopbuffer +\stopbuffer + +Buffers can be used to stepwise build graphics. By putting code in multiple +buffers, you can selectively process this code. + +\startbuffer +\startbuffer[red] +drawoptions(withcolor .625red) ; +\stopbuffer + +\startbuffer[yellow] +drawoptions(withcolor .625yellow) ; +\stopbuffer +\stopbuffer + +\typebuffer + +We can now include the same graphic in two colors by simply using different +buffers. This time we use the special command \type {\processMPbuffer}, since +\type {\getbuffer} will typeset the code fragment, which is not what we want. + +\startbuffer +\startlinecorrection[blank] +\processMPbuffer[red,graphic] +\stoplinecorrection +\stopbuffer + +\typebuffer + +The line correction macros take care of proper spacing around the graphic. The +\type {[blank]} directive tells \CONTEXT\ to add more space before and after the +graphic. + +\startbuffer +\startlinecorrection[blank] +\processMPbuffer[yellow,graphic] +\stoplinecorrection +\stopbuffer + +\typebuffer + +Which mechanism you use, (multiple) buffers or (re|)|usable graphics, depends on +your preferences. Buffers are slower but don't take memory, while (re|)|usable +graphics are stored in memory which means that they are accessed faster. + +\stopsection + +\startsection[title={Communicating color}] + +\index{color} + +Now that color has moved to the desktop, even simple documents have become more +colorful, so we need a way to consistently apply color to text as well as +graphics. In \CONTEXT, colors are called by name. + +The next definitions demonstrate that we can define a color using different color +models, \RGB\ or \CMYK. Depending on the configuration, \CONTEXT\ will convert +one color system to the other, \RGB\ to \CMYK, or vice versa. The full repertoire +of color components that can be set is as follows. + +\starttyping +\definecolor[color one] [r=.1, g=.2, b=.3] +\definecolor[color two] [c=.4, m=.5, y=.6, k=.7] +\definecolor[color three][s=.8] +\stoptyping + +The numbers are limited to the range $0\dots1$ and represent percentages. Black +is represented by: + +\starttyping +\definecolor[black 1] [r=0, g=0, b=0] +\definecolor[black 2] [c=0, m=0, y=0, k=1] +\definecolor[black 3] [s=0] +\stoptyping + +Predefined colors are passed to \METAPOST\ graphics via the \type {\MPcolor}. +First we define some colors. + +\starttyping +\definecolor[darkyellow][y=.625] % a CMYK color +\definecolor[darkred] [r=.625] % a RGB color +\definecolor[darkgray] [s=.625] % a gray scale +\stoptyping + +These are the colors we used in this document. The next example uses two of them. + +\startbuffer +\startuseMPgraphic{color demo} + pickup pencircle scaled 1mm ; + path p ; p := fullcircle xscaled 10cm yscaled 1cm ; + fill p withcolor \MPcolor{darkgray} ; + draw p withcolor \MPcolor{darkred} ; +\stopuseMPgraphic + +\useMPgraphic{color demo} +\stopbuffer + +\typebuffer + +The previous example uses a pure \RGB\ red shade, combined with a gray fill. + +\startlinecorrection[blank] +\getbuffer +\stoplinecorrection + +Originally \METAPOST\ only supported only the \RGB\ and gray color spaces. In \METAFUN\ +we also supported \CMYK\ and spot colors, using an extension mechanism that hooked into +the backend. At some point \METAPOST\ got native support for \CMYK. When you use mixed +color models you need to be aware of the fact that their related variables have different +types: + +\starttabulate[||T|T|] +\NC gray \NC numeric \NC s \NC \NR +\NC rgb \NC color \NC (r,g,b) \NC \NR +\NC cmyk \NC cmykcolor \NC (c,m,y,k) \NC \NR +\stoptabulate + +Because in \METAFUN\ (\type {mpiv}) we hook deeply into the \CONTEXT\ color +mechanisms we can use symbolic names instead. and these are just strings. + +There is a fundamental difference between a yellow as defined in \CONTEXT\ using +\CMYK\ and a \RGB\ yellow. + +\startbuffer +\definecolor[cmyyellow] [y=1] +\definecolor[rgbyellow] [r=1,g=1] + +\definecolor[cmydarkyellow][y=.625] +\definecolor[rgbdarkyellow][r=.625,g=.625] +\stopbuffer + +\typebuffer \getbuffer + +\in {Figure} [fig:many yellows:pass] demonstrates what happens when we multiply +colors by a factor. Since we are not dealing with real \CMYK\ colors, +multiplication gives different results for \CMYK\ colors passed as \type +{\MPcolor}. \in {Figure} [fig:many yellows:fetch] we show the same colors but +this time we use a different method, one that avoids the \TEX\ macro. This method +can be used in \MKIV. We will use both methods in examples. + +\def\TestColor#1% + {\startuseMPgraphic{yellow} + fill unitsquare xscaled (.30*\the\hsize) yscaled 1cm withcolor #1 ; + \stopuseMPgraphic + \useMPgraphic{yellow}} + +\startbuffer +\setuptype[style=\ttx]% +\startcombination[3*3] + {\TestColor{(0,0,1,0)}} {\type{(0,0,1,0)}} + {\TestColor{(1,1,0)}} {\type{(1,1,0)}} + {\TestColor{(.5,.5,0)}} {\type{(.5,.5,0)}} + {\TestColor{\MPcolor{rgbyellow}}} {\type{\MPcolor{rgbyellow}}} + {\TestColor{\MPcolor{rgbdarkyellow}}} {\type{\MPcolor{rgbdarkyellow}}} + {\TestColor{.5\MPcolor{rgbyellow}}} {\type{.5\MPcolor{rgbyellow}}} + {\TestColor{\MPcolor{cmyyellow}}} {\type{\MPcolor{cmyyellow}}} + {\TestColor{\MPcolor{cmydarkyellow}}} {\type{\MPcolor{cmydarkyellow}}} + {\TestColor{.5\MPcolor{cmyyellow}}} {\type{.5\MPcolor{cmyyellow}}} +\stopcombination +\stopbuffer + +\placefigure + [here][fig:many yellows:pass] + {All kinds of yellow (passing valued from \TEX).} + {\getbuffer} + +\startbuffer +\setuptype[style=\ttx]% +\startcombination[3*3] + {\TestColor{(0,0,1,0)}} {\type{(0,0,1,0)}} + {\TestColor{(1,1,0)}} {\type{(1,1,0)}} + {\TestColor{(.5,.5,0)}} {\type{(.5,.5,0)}} + {\TestColor{"rgbyellow"}} {\type{"rgbyellow"}} + {\TestColor{"rgbdarkyellow"}} {\type{"rgbdarkyellow"}} + {\TestColor{.5namedcolor("rgbyellow")}} {\type{.5namedcolor("rgbyellow")}} + {\TestColor{"cmyyellow"}} {\type{"cmyyellow"}} + {\TestColor{"cmydarkyellow"}} {\type{"cmydarkyellow"}} + {\TestColor{.5namedcolor("cmyyellow")}} {\type{.5namedcolor("cmyyellow")}} +\stopcombination +\stopbuffer + +\placefigure + [here][fig:many yellows:fetch] + {All kinds of yellow (fetching values from \TEX).} + {\getbuffer} + +So, \type {.625red} is the same as \type {[r=.5]}, but \type {.625yellow} is not +the same as \type {[y=.5]}, but matches \type {[r=.5,g=.5]}. \in {Figure} +[fig:some reds] shows the pure and half reds. + +\def\TestColor#1% + {\startMPcode + fill unitsquare xscaled (.30*\the\hsize) yscaled 1cm withcolor #1 ; + \stopMPcode} + +\startbuffer +\setuptype[style=\ttx]\setupcolors[mpcmyk=no] +\startcombination[3*2] + {\TestColor{red}} {\type{red}} + {\TestColor{(1,0,0)}} {\type{(1,0,0)}} + {\TestColor{(.625,0,0)}} {\type{(.625,0,0)}} + {\TestColor{"red"}} {\type{"red")}} + {\TestColor{"darkred"}} {\type{"darkred")}} + {\TestColor{.625namedcolor("red")}} {\type{.625namedcolor("red")}} +\stopcombination +\stopbuffer + +\placefigure + [here][fig:some reds] + {Some kinds of red.} + {\getbuffer} + +In order to prevent problems, we advise you to stick to \RGB\ color +when you create documents for screen and \CMYK\ when producing for print. + +In the \METAFUN\ macro collection there is a macro \type {cmyk} that takes four +arguments, representing the cyan, magenta, yellow, and black component. Nowadays +you don't need it as we have native \CMYK. + +\startbuffer +fill unitsquare xyscaled (10cm, 5mm) withcolor cmyk(1,0,.3,.3) ; +fill unitsquare xyscaled (10cm,-5mm) withcolor (1,.3,0,.3) ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +If you take a close look at the numbers, you will notice that the cyan component +results in a 100\% ink contribution. You will also notice that 30\% black ink is +added. This means that we cannot safely convert this color to \RGB\ ($r=1-c-k<0$) +without losing information. Nevertheless the previous blue bar is presented all +right. This is due to the fact that in \METAFUN\ the \CMYK\ colors are handled as +they should, even when \METAPOST\ does not support this color model. + +If you use this feature independent of \CONTEXT, you need to enable it by setting +\type {cmykcolors} to \type {true}. You have to convert the resulting graphic to +\PDF\ by using for instance the \type {mptopdf} suite. + +In \CONTEXT\ you can influence this conversion by changing parameters related to +color handling: + +\starttyping +\setupcolors[cmyk=yes,rgb=no] +\stoptyping + +Unless you know what you are doing, you don't have to change the default settings +(both \type {yes}). In the \CONTEXT\ reference manual you can also read how color +reduction can be handled. + +Special care should be paid to gray scales. Combining equal quantities of the +three color inks will not lead to a gray scale, but to a muddy brown shade. + +\startbuffer +fill fullsquare xyscaled (10cm, 2cm) withcolor .5white ; +fill fullsquare xyscaled ( 6cm,1.5cm) withcolor cmyk(.5,.5,.5,0) ; +fill fullsquare xyscaled ( 2cm, 1cm) withcolor cmyk(0,0,0,.5) ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +In \in {figure} [fig:cmyk 1] \in {and} [fig:cmyk 2] you can see some more colors +defined in the \CMYK\ color space. When you display the screen version of this +document, you will notice that the way colors are displayed can differ per +viewer. This is typical for \CMYK\ colors and has to do with the fact that some +assumptions are made with respect to the (print) medium. + +\startbuffer[mp] + fill fullcircle xyscaled (3cm,1cm) withcolor \MPcolor{test} ; +\stopbuffer + +\startbuffer[cmyk] +\startcombination[4*1] + {\definecolor[test][c=1,y=.3,k=.3] \processMPbuffer[mp]} {c=1 y=.3 k=.3} + {\definecolor[test][c=.9,y=.15] \processMPbuffer[mp]} {c=.9 y=.15} + {\definecolor[test][c=.25,y=.8] \processMPbuffer[mp]} {c=.25 y=.8} + {\definecolor[test][c=.45,y=.1] \processMPbuffer[mp]} {c=.45 y=.1} +\stopcombination +\stopbuffer + +\placefigure + [here][fig:cmyk 1] + {\CMYK\ support enabled.} + {\getbuffer[cmyk]} + +\placefigure + [here][fig:cmyk 2] + {\CMYK\ support disabled, no support in \METAPOST.} + {\setupcolors[cmyk=no]\getbuffer[cmyk]\setupcolors[cmyk=yes]} + +\stopsection + +% \startsection[title={Common definitions}] +% +% \index{inclusions} +% \index{common definitions} +% +% When using many graphics, there is a chance that they share common definitions. +% Such shared components can be defined by: +% +% \starttyping +% \startMPinclusions +% color mycolor ; mycolor := .625red ; +% \stopMPinclusions +% \stoptyping +% +% {\em The following is only true for \CONTEXT\ \MKII ! Users of \MKIV\ can skip +% this section.} +% +% All \METAPOST\ graphics defined in the document end up in the files \type +% {mpgraph.mp} and \type {mprun.mp}. When processed, they produce (sometimes many) +% graphic files. When you use \CONTEXT\ \MKII\ and \TEXEXEC\ to process documents, +% these two files are processed automatically after a run so that in a next run, +% the right graphics are available. +% +% When you are using the \type {web2c} distribution, \CONTEXT\ can call \METAPOST\ +% at runtime and thereby use the right graphics instantaneously. In order to use +% this feature, you have to enable \type {\write18} in the file \type {texmf.cnf}. +% Also, in the file \type {cont-sys.tex}, that holds local preferences, or in the +% document source, you should say: +% +% \starttyping +% \runMPgraphicstrue +% \stoptyping +% +% This enables runtime generation of graphics using the low level \TEX\ command +% \type {\write18}. First make sure that your local brand of \TEX\ supports this +% feature. A simple test is making a \TEX\ file with the following line: +% +% \starttyping +% \immediate\write18{echo It works} +% \stoptyping +% +% If this fails, you should consult the manual that comes with your system, locate +% an expert or ask around on the \CONTEXT\ mailing list. Of course you can also +% decide to let \TEXEXEC\ take care of processing the graphics afterwards. This has +% the advantage of being faster but has the disadvantage that you need additional +% \TEX\ runs. +% +% If you generate the graphics at run time, you should consider to turn on graphic +% slot recycling, which means that you often end up with fewer intermediate files: +% +% \starttyping +% \recycleMPslotstrue +% \stoptyping +% +% There are a few more low level switches and features, but these go beyond the +% purpose of this manual. Some of these features, like the option to add tokens to +% \type {\everyMPgraphic} are for experts only, and fooling around with them can +% interfere with existing features. +% +% \stopsection + +\startsection[title={One page graphics}] + +An advantage of using \CONTEXT\ to make your \METAPOST\ graphics is you don't +have to bother about specials, font inclusion and all those nasty things that can +spoil a good day. An example of such a graphic is the file \type {mfun-800} that +resides on the computer of the author. + +\typefile{mfun-800} + +Given that \CONTEXT\ is present on your system, you can process this file with: + +\starttyping +context mfun-800 +\stoptyping + +You can define many graphics in one file. Later you can include individual pages +from the resulting \PDF\ file in your document: + +\startbuffer +\placefigure + {A silly figure, demonstrating that stand||alone||graphics + can be made.} + {\typesetfile[mfun-800.tex][page=1]} +\stopbuffer + +\typebuffer + +In this case the \type {page=1} specification is not really needed. You can scale +and manipulate the figure in any way supported by the macro package that you use. + +\getbuffer + +\stopsection + +\startsection[title={Managing resources}] + +A graphic consists of curves, either or not filled with a given color. A graphic +can also include text, which means that fonts are used. Finally a graphic can +have special effects, like a shaded fill. Colors, fonts and special effects go +under the name resources, since they may demand special care or support from the +viewing or printing device. + +% When fonts are used, a \METAPOST\ file is not self contained. This means that the +% postprocessing program has to deal with the fonts. In \CONTEXT, the special +% driver |<|and \PDFTEX\ support is considered as such|>| takes care of this. + +Special effects, like shading, are supported by dedicated \METAPOST\ modules. +These are included in the \CONTEXT\ distribution and will be discussed later in +\in {chapter} [sec:effects]. + +Since \METAPOST\ supports color, an embedded graphic can be rather colorful. +However, when color support is disabled or set up to convert colors to gray +scales, \CONTEXT\ will convert the colors in the graphics to gray scales. + +\startbuffer[circle] + colorcircle(4cm,red,green,blue) ; +\stopbuffer + +\startbuffer +\startcombination[3*1] + {\setupcolors[state=start]\processMPbuffer[circle]} {full color} + {\setupcolors[state=stop]\processMPbuffer[circle]} {weighted gray} + {\setupcolors[state=stop,factor=no]\processMPbuffer[circle]} {linear gray} +\stopcombination +\stopbuffer + +You may wonder what the advantage is of weighted gray conversion. \in {Figure} +[fig:color circles] shows the difference between natural colors, weighted gray +scales and straightforward, non||weighted, gray scales. + +\placefigure + [here][fig:color circles] + {The advantage of weighted gray over linear gray.} + {\getbuffer\setupcolors[state=start,factor=yes]} % just to be sure + +When we convert color to gray, we use the following formula. This kind of +conversion also takes place in black and white televisions. + +\placeformula [-] + \startformula + G = .30r + .59g + .11b + \stopformula + +\in {Section} [sec:conversion] introduces the \type {grayed} operation that you +can use to convert a colored picture into a gray one. This macro uses the same +conversion method as mentioned here. + +\stopsection + +\startsection[title={Instances}] + +There are a few instances predefined and if you want to isolate your own +graphics from whatever \CONTEXT\ itself cooks up, you can define more as the +extra overhead can be neglected. + +\starttabulate[|T|T|T|T|T|] +\BC name \BC format \BC extensions \BC initializations \BC method \NC \NR +\NC metafun \NC metafun \NC yes \NC yes \NC \NC \NR +\NC extrafun \NC metafun \NC yes \NC yes \NC \NC \NR +\NC lessfun \NC metafun \NC \NC \NC \NC \NR +\NC doublefun \NC metafun \NC yes \NC yes \NC double \NC \NR +\NC binaryfun \NC metafun \NC yes \NC yes \NC binary \NC \NR +\NC decimalfun \NC metafun \NC yes \NC yes \NC decimal \NC \NR +\stoptabulate + +According to this the \type {doublefun} instance is defined as: + +\starttyping +\defineMPinstance + [doublefun] + [format=metafun, + extensions=yes, + initializations=yes, + method=double] +\stoptyping + +The \type {extensions} key relates to: + +\starttyping +\startMPextensions + % some code +\stopMPextensions +\stoptyping + +that are used to pass (common) extensions to the instance. The \type +{initializations} key relates to: + +\starttyping +\startMPinitializations + % some code +\stopMPinitializations +\stoptyping + +that are used to communicate \TEX\ properties to the instance (they are +expanded each graphic). Instance bound definitions can be set with: + +\starttyping +\startMPdefinitions{doublefun} + % some code +\stopMPdefinitions +\stoptyping + +We do have more instances, for instance for the chemical subsystem. If you load +the \type {graph} module you get a double precision \type {graph} instance. We might +use more private ones in the future. + +When you make graphic pages, you can do this: + +\starttyping +\startMPpage[instance=doublefun] + % some code +\stopMPpage +\stoptyping + +When you use the other commands you can optionally specify an instance: + +\startbuffer[metafun] +\startMPcode{metafun} + draw textext(decimal pi) scaled 2 withcolor .625red ; + draw boundingbox currentpicture enlarged 2pt ; +\stopMPcode +\stopbuffer + +\startbuffer[extrafun] +\startMPcode{extrafun} + draw textext(decimal pi) scaled 2 withcolor .625green ; + draw boundingbox currentpicture enlarged 2pt ; +\stopMPcode +\stopbuffer + +\startbuffer[doublefun] +\startMPcode{doublefun} + draw textext(decimal pi) scaled 2 withcolor .625blue ; + draw boundingbox currentpicture enlarged 2pt ; +\stopMPcode +\stopbuffer + +\startbuffer[binaryfun] +\startMPcode{binaryfun} + draw textext(decimal pi) scaled 2 withcolor .625yellow ; + draw boundingbox currentpicture enlarged 2pt ; +\stopMPcode +\stopbuffer + +\startbuffer[decimalfun] +\startMPcode{decimalfun} + draw textext(decimal pi) scaled 2 withcolor .375white ; + draw boundingbox currentpicture enlarged 2pt ; +\stopMPcode +\stopbuffer + +\typebuffer[metafun,extrafun,doublefun,binaryfun,decimalfun] + +The result is shown in \in {figure} [fig:instances] and as expected there +is a different value for $\pi$ reported. + +\startplacefigure[reference=fig:instances,title={Instances can use different number systems.}] + \startcombination[1*5] + {\getbuffer[metafun]} {metafun} + {\getbuffer[extrafun]} {extrafun} + {\getbuffer[doublefun]} {doublefun} + {\getbuffer[binaryfun]} {binaryfun} + {\getbuffer[decimalfun]} {decimalfun} + \stopcombination +\stopplacefigure + +You need to be aware of the fact that the results of a (for instance) double +instance can differ from a scaled (the default) one. As long as graphics can be +processed in both models (which is the case as long as the dimensions stay below +4096 base points) the outcome is probably not that different. However, we've seen +that the accuracy of for instance $\pi$ (just a variable) differs. I like to use +random values and the random generators are definitely different: each of the +number libraries has its own implementation. Let's look at that. We define two +random graphic generators: + +\startbuffer +\startuseMPgraphic{normaldeviate} + randomseed := 100 ; + draw fullsquare + withpen pencircle scaled 1/200 + withcolor .5white ; + for i=1 upto 500 : + draw (normaldeviate,normaldeviate) + scaled 1/3 + withpen pencircle scaled 1/30 + withtransparency (1,.5) ; + endfor ; + setbounds currentpicture to + boundingbox fullcircle + enlarged 1/2 ; + currentpicture := + currentpicture + xsized (2TextWidth/5) ; +\stopuseMPgraphic +\stopbuffer + +\typebuffer \getbuffer + +And: + +\startbuffer +\startuseMPgraphic{uniformdeviate} + randomseed := 100 ; + draw fullsquare + withpen pencircle scaled 1/200 + withcolor .5white ; + for i=1 upto 500 : + draw (-1/2 + uniformdeviate 1,-1/2 + uniformdeviate 1) + withpen pencircle scaled 1/30 + withtransparency (1,.5) ; + endfor ; + setbounds currentpicture to + boundingbox fullcircle + enlarged 1/2 ; + currentpicture := + currentpicture + xsized (2TextWidth/5) ; +\stopuseMPgraphic +\stopbuffer + +\typebuffer \getbuffer + +We show the results for a normaldeviate in \in {figure} [fig:random:1] \in {upto} +[fig:random:4] you see the randomizers per number system. In \in {figure} +[fig:random:compared] we demonstrate that the scaled version has its own variant. + +\unexpanded\def\TestRandomFun#1#2#3% + {\startMPcode{#1} + draw image(\includeMPgraphic{#2}) + withcolor #3 ; + \stopMPcode} + +\startplacefigure[reference=fig:random:1,title={The scaled randomizers.}] + \pushrandomseed + \startcombination + {\TestRandomFun{metafun} {normaldeviate} {darkred}} {normaldeviate} + {\TestRandomFun{metafun} {uniformdeviate}{darkred}} {uniformdeviate} + \stopcombination + \poprandomseed +\stopplacefigure + +\startplacefigure[reference=fig:random:2,title={The double randomizers.}] + \pushrandomseed + \startcombination + {\TestRandomFun{doublefun} {normaldeviate} {darkgreen}} {normaldeviate} + {\TestRandomFun{doublefun} {uniformdeviate}{darkgreen}} {uniformdeviate} + \stopcombination + \poprandomseed +\stopplacefigure + +\startplacefigure[reference=fig:random:3,title={The decimal randomizers.}] + \pushrandomseed + \startcombination + {\TestRandomFun{decimalfun}{normaldeviate} {darkblue}} {normaldeviate} + {\TestRandomFun{decimalfun}{uniformdeviate}{darkblue}} {uniformdeviate} + \stopcombination + \poprandomseed +\stopplacefigure + +\startplacefigure[reference=fig:random:4,title={The binary randomizers.}] + \pushrandomseed + \startcombination + {\TestRandomFun{binaryfun} {normaldeviate} {darkyellow}} {normaldeviate} + {\TestRandomFun{binaryfun} {uniformdeviate}{darkyellow}} {uniformdeviate} + \stopcombination + \poprandomseed +\stopplacefigure + +\startplacefigure[reference=fig:random:compared,title={Normaldeviate and uniformdeviate overlayed.}] + \pushrandomseed + \startcombination[2*1] + \bgroup + \startoverlay + {\TestRandomFun{metafun} {normaldeviate} {darkred}} + {\TestRandomFun{doublefun} {normaldeviate} {darkgreen}} + {\TestRandomFun{decimalfun}{normaldeviate} {darkblue}} + {\TestRandomFun{binaryfun} {normaldeviate} {darkyellow}} + \stopoverlay + \egroup {normaldeviate} + \bgroup + \startoverlay + {\TestRandomFun{metafun} {uniformdeviate}{darkred}} + {\TestRandomFun{doublefun} {uniformdeviate}{darkgreen}} + {\TestRandomFun{decimalfun}{uniformdeviate}{darkblue}} + {\TestRandomFun{binaryfun} {uniformdeviate}{darkyellow}} + \stopoverlay + \egroup {uniformdeviate} + \stopcombination + \poprandomseed +\stopplacefigure + +\stopsection + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/metafun/metafun-environment-layout.tex b/doc/context/sources/general/manuals/metafun/metafun-environment-layout.tex new file mode 100644 index 000000000..409839cba --- /dev/null +++ b/doc/context/sources/general/manuals/metafun/metafun-environment-layout.tex @@ -0,0 +1,151 @@ +\startenvironment metafun-environment-layout + +\setupsystem + [random=big] + +\setupfootertexts + [section][] % [Preliminary Version \currentdate][] + [][section] % [][Preliminary Version \currentdate] + +\useMPlibrary + [clp,txt] + +\definepapersize + [mine] + [width=21cm, + height=28cm] + +\setuppapersize + [mine] + [A4] + +\setuplayout + [topspace=1cm, + backspace=3cm, + cutspace=3cm, + leftmargin=.75cm, + leftmargindistance=.5cm, + rightmargin=1.25cm, + rightmargindistance=1cm, + header=1cm, + headerdistance=1cm, + footer=1cm, + footerdistance=1cm, + width=middle, + height=middle, + % marking=on, + location=middle] + +\startmode[book] + + % \definepapersize + % [mine] + % [width=21cm, + % height=24cm] + % + % \setuppapersize + % [mine] + % [oversized] + % + % \setuplayout + % [backspace=2.5cm, + % cutspace=3.5cm] + + \setuplayout + [marking=on, + scale=\luaexpr{24/28}] + +\stopmode + +\startmode[print] + + \setuppapersize + [mine] + [mine] + +\stopmode + +\setupcolumns + [distance=1cm] + +\setuppagenumbering + [alternative=doublesided] + +\definetypeface [metafunbodyfont] [rm] [serif] [pagella] [default] +\definetypeface [metafunbodyfont] [ss] [sans] [modern] [default] +\definetypeface [metafunbodyfont] [tt] [mono] [modern] [default] +\definetypeface [metafunbodyfont] [mm] [math] [palatino] [default] + +\setupbodyfont [metafunbodyfont,10pt] % 11 pt and 12pt -> errors due to intersection mess + +\definefont[RotFont][RegularBold*default] + +% \setupindenting +% [medium,yes] + +\setupwhitespace + [medium] + +\setuptyping + [margin=standard, + blank=halfline] + +\definecolor [darkred] [r=.625] +\definecolor [darkyellow] [r=.625,g=.625] % not: [y=.625] +\definecolor [darkgray] [s=.625] +\definecolor [lightgray] [s=.875] + +\definecolor [metafun] [darkred] + +\startMPinclusions + color darkred ; darkred := \MPcolor{darkred} ; + color darkyellow ; darkyellow := \MPcolor{darkyellow} ; + color darkgray ; darkgray := \MPcolor{darkgray} ; + color lightgray ; lightgray := \MPcolor{lightgray} ; +\stopMPinclusions + +\setupinteraction % otherwise funny page dimensions due to + [state=start, % grouping half way the file in demo text + style=, + color=, + contrastcolor=] + +% \enabledirectives[refences.linkmethod=page] + +% \setupstructure % needs \startchapter +% [state=start] + +\placebookmarks + [chapter,title,section] + [all] + [force=yes] + +\setuptolerance + [verytolerant] + +\definestartstop + [intro] + [style=slanted, + after=\blank] + +\setupquote + [before=\blank\startnarrower, + after=\stopnarrower\blank] + +\setuplist + [chapter] + [after={\blank[line]}] + +\setupcombinedlist + [content] + [aligntitle=yes, + alternative=c, + interaction=all] + +\setuptabulate + [rulecolor=darkyellow, + rulethickness=1pt] + +\setuplist[chapter][style=bold] + +\stopenvironment diff --git a/doc/context/sources/general/manuals/metafun/metafun-environment-samples.tex b/doc/context/sources/general/manuals/metafun/metafun-environment-samples.tex new file mode 100644 index 000000000..5991a61d5 --- /dev/null +++ b/doc/context/sources/general/manuals/metafun/metafun-environment-samples.tex @@ -0,0 +1,321 @@ +\startenvironment metafun-environment-sample + +\startuseMPgraphic{sample setup} + numeric Scale ; Scale := 2cm ; + numeric Size ; Size := 2.5mm/Scale ; + numeric Pen ; Pen := .25mm/Scale ; + path Path ; + pickup pencircle scaled (4Pen) ; + def InRed = withcolor .625red enddef ; + def InYellow = withcolor .625yellow enddef ; + def InGray = withpen pencircle scaled Pen withcolor .625white enddef ; + def InBetween= withpen pencircle scaled (4Pen) withcolor .800white enddef ; + def InBlack = withpen pencircle scaled Pen enddef ; + def InWhite = withpen pencircle scaled Pen withcolor white enddef ; + def DrawArrow text t = + draw t ; Path := boundingbox currentpicture ; + drawarrow t ; setbounds currentpicture to Path ; + enddef ; + def ColorCircle = + fill llcircle withcolor .625red ; + fill lrcircle withcolor .625green ; + fill urcircle withcolor .625blue ; + fill ulcircle withcolor .625yellow ; + enddef ; + evenly := dashpattern(on (3mm/Scale) off (3mm/Scale)) ; + withdots := dashpattern(off (2.5mm/Scale) on 0 off (2.5mm/Scale)) ; + ahlength := 4mm/Scale ; ahangle := 30 ; + draw (origin shifted (0,Size)--origin shifted (0,-Size)) ; + draw (origin shifted (Size,0)--origin shifted (-Size,0)) ; + picture Origin ; Origin := currentpicture ; + setbounds Origin to origin--cycle ; + currentpicture := nullpicture ; +\stopuseMPgraphic + +\startuseMPgraphic{sample finish} + draw boundingbox currentpicture InBlack ; + draw Origin InGray ; + currentpicture := currentpicture scaled Scale ; +\stopuseMPgraphic + +% fm = metafun macro +% fv = metafun variable +% mc = metapost concept +% mm = metapost macro +% mp = metapost primitive +% mv = metapost variable + +\starttexdefinition unexpanded DoDoSampleHead#1#2#3 + \setbox\scratchbox\vbox { + \tabskip\zeropoint + \tt\tfx + \halign { + \strut\hss##\unskip\unskip + \cr#3\cr#1\cr + } + } + \ht\scratchbox\ht\strutbox + \dp\scratchbox\dp\strutbox + \noligature{#2}\black + \hfill + \box\scratchbox + \ignorespaces +\stoptexdefinition + +\starttexdefinition unexpanded DoSampleHead #1#2#3 + \processaction + [#1] + [fm=>\DoDoSampleHead{metafun macro}{#2}{#3}, + fv=>\DoDoSampleHead{metafun variable}{#2}{#3}, + mc=>\DoDoSampleHead{metapost concept}{#2}{#3}, + mm=>\DoDoSampleHead{metapost macro}{#2}{#3}, + mp=>\DoDoSampleHead{metapost primitive}{#2}{#3}, + mv=>\DoDoSampleHead{metapost variable}{#2}{#3}] +\stoptexdefinition + +\starttexdefinition unexpanded SampleHead #1#2#3 + \expanded{\extrosubject{\DoSampleHead{#1}{#2}{\detokenize{#3}}}} +\stoptexdefinition + +\starttexdefinition unexpanded StartSample + \doquintuplegroupempty\doStartSample +\stoptexdefinition + +\starttexdefinition unexpanded StopSample + % dummy +\stoptexdefinition + +\starttexdefinition unexpanded doStartSample #1#2#3#4#5#6 StopSample + \bgroup + \SampleHead{#1}{#2}{#3} + \startuseMPgraphic{dummy} + \includeMPgraphic{sample setup} + #6 + \includeMPgraphic{sample finish} + \stopuseMPgraphic + \blank[samepage] + \startlinecorrection[blank] + \useMPgraphic{dummy} + \stoplinecorrection + \egroup +\stoptexdefinition + +\starttexdefinition unexpanded ShowSampleZ #1#2#3 + \bgroup + \SampleHead{#1}{#2}{} + \blank[samepage] + #3 + \par + \egroup +\stoptexdefinition + +\starttexdefinition unexpanded ShowSampleA #1#2#3 + \StartSample{#1}{#2}{#3} + path p ; p := #3 ; % freeze randomized + if length(p)>0 : + DrawArrow p InRed ; + fi ; + drawpoints p InBetween ; + \StopSample +\stoptexdefinition + +\starttexdefinition unexpanded ShowSampleB #1#2#3#4 + \StartSample{#1}{#2}{#4} + DrawArrow (#3) InRed ; + DrawArrow (#4) InYellow ; + drawpoints (#3) InBetween ; + drawpoints (#4) InBetween ; + \StopSample +\stoptexdefinition + +\starttexdefinition unexpanded ShowSampleC #1#2#3#4 + \StartSample{#1}{#2}{#4} + path bb ; bb := boundingbox #3 ; + DrawArrow #3 InRed ; + draw #4 withpen pencircle scaled .15 InYellow ; + setbounds currentpicture to bb ; + \StopSample +\stoptexdefinition + +\starttexdefinition unexpanded ShowSampleD #1#2#3#4 + \StartSample{#1}{#2}{#4} + DrawArrow #3 InRed ; + setbounds currentpicture to #4 ; + \StopSample +\stoptexdefinition + +\starttexdefinition unexpanded ShowSampleDD #1#2#3#4 + \StartSample{#1}{#2}{#4} + DrawArrow #3 InRed ; + DrawArrow #4 InYellow ; + \StopSample +\stoptexdefinition + +\starttexdefinition unexpanded ShowSampleE #1#2#3#4 + \StartSample{#1}{#2}{#4} + fill fullcircle scaled 1cm InRed ; + currentpicture := currentpicture #3 ; + Scale := 1 ; + \StopSample +\stoptexdefinition + +\starttexdefinition unexpanded ShowSampleF #1#2#3#4 + \StartSample{#1}{#2}{#4} + DrawArrow #3 InRed ; + drawdot #4 InYellow ; + \StopSample +\stoptexdefinition + +\starttexdefinition unexpanded ShowSampleG #1#2#3#4 + \StartSample{#1}{#2}{#4} + draw #3 InRed ; + drawdot #4 InYellow ; + \StopSample +\stoptexdefinition + +\starttexdefinition unexpanded ShowSampleH #1#2#3#4#5 + \StartSample{#1}{#2}{#5} + DrawArrow #3 InRed ; + DrawArrow #4 InYellow ; + drawdot #5 InWhite ; + \StopSample +\stoptexdefinition + +\starttexdefinition unexpanded ShowSampleHH #1#2#3 + \StartSample{#1}{#2}{#3} + draw #3 InRed ; + \StopSample +\stoptexdefinition + +\starttexdefinition unexpanded ShowSampleI #1#2#3 + \StartSample{#1}{#2}{#3} + draw fullcircle InRed #3 ; + \StopSample +\stoptexdefinition + +\starttexdefinition unexpanded ShowSampleII #1#2#3 + \StartSample{#1}{#2}{#3} + draw fullcircle #3 InRed ; + \StopSample +\stoptexdefinition + +\starttexdefinition unexpanded ShowSampleJ #1#2#3 + \StartSample{#1}{withpen #2}{withpen #3 scaled 2mm} + draw fullcircle xscaled 2 withpen #3 scaled Pen InRed ; + \StopSample +\stoptexdefinition + +\starttexdefinition unexpanded ShowSampleK #1#2#3 + \StartSample{#1}{withpen #2}{withpen #3} + draw fullcircle xscaled 2 withpen #3 InRed ; + \StopSample +\stoptexdefinition + +\starttexdefinition unexpanded ShowSampleL #1#2#3 + \StartSample{#1}{#2}{#2 #3} + #2 #3 InRed; + \StopSample +\stoptexdefinition + +\starttexdefinition unexpanded ShowSampleM #1#2#3 + \StartSample{#1}{#2}{#2 #3} + fill boundingbox (#3--cycle) InRed ; + #2 #3 ; + \StopSample +\stoptexdefinition + +\starttexdefinition unexpanded ShowSampleN #1#2#3#4 + \StartSample{#1}{#2}{#3} + #3 ; + draw #4 withpen pencircle scaled 25Pen InRed ; + \StopSample +\stoptexdefinition + +\starttexdefinition unexpanded ShowSampleO #1#2#3 + \StartSample{#1}{#2}{#3} + drawdot origin InRed ; + #3 scaled (2.5/Scale) InYellow ; + \StopSample +\stoptexdefinition + +\starttexdefinition unexpanded ShowSampleP #1#2#3 + \StartSample{#1}{#2}{#3} + drawdot origin InRed ; + #3 scaled (2.5/Scale) InYellow ; + \StopSample +\stoptexdefinition + +\starttexdefinition unexpanded ShowSampleQ #1#2#3 + \StartSample{#1}{#2}{#3} + #2 #3 withpen pencircle scaled 25Pen InRed ; + \StopSample +\stoptexdefinition + +\starttexdefinition unexpanded ShowSampleQQ #1#2#3 + \StartSample{#1}{#2}{#3} + #3 scaled (2.5/Scale) withpen pencircle scaled Pen InYellow ; + \StopSample +\stoptexdefinition + +\starttexdefinition unexpanded ShowSampleQQQ #1#2#3 + \StartSample{#1}{#2}{#3} + #3 scaled (2.5/Scale) withpen pencircle scaled Pen ; + \StopSample +\stoptexdefinition + +\starttexdefinition unexpanded ShowSampleR #1#2#3 + \StartSample{#1}{#2}{#3} + ColorCircle ; + addto currentpicture also (#3) shifted (bbwidth(currentpicture)+.1,0) ; + \StopSample +\stoptexdefinition + +\starttexdefinition unexpanded ShowSampleS #1#2#3 + \StartSample{#1}{#2}{#3} + Pen := Pen * Scale ; Scale := 1 ; #3 ;% + \StopSample +\stoptexdefinition + +\starttexdefinition unexpanded ShowSampleT #1#2#3#4 + \StartSample{#1}{#2}{#3} + #4 ; + \StopSample +\stoptexdefinition + +\starttexdefinition unexpanded ShowSampleU #1#2#3 + \StartSample{#1}{#2}{#3} + Scale := Scale / 5 ; + #3 ; + \StopSample +\stoptexdefinition + +\starttexdefinition unexpanded ShowSampleUU #1#2#3 + \StartSample{#1}{#2}{#3} + Scale := Scale / 10 ; + #3 ; + \StopSample +\stoptexdefinition + +\starttexdefinition unexpanded ShowSampleV #1#2#3#4 + \StartSample{#1}{#2}{#3} + Scale := Scale / 5 ; + Pen := Pen * 20 ; + #4 ; + Pen := Pen / 20 ; + \StopSample +\stoptexdefinition + +\starttexdefinition unexpanded ShowSampleW #1#2#3#4 + \StartSample{#1}{#2}{#3} + Scale := 1 ; + #4 ; + \StopSample +\stoptexdefinition + +\starttexdefinition unexpanded ShowSampleX #1#2#3 + \StartSample{#1}{#2}{#3} + #3 InRed ; + \StopSample +\stoptexdefinition + +\stopenvironment diff --git a/doc/context/sources/general/manuals/metafun/metafun-environment-screen.tex b/doc/context/sources/general/manuals/metafun/metafun-environment-screen.tex new file mode 100644 index 000000000..afeea7008 --- /dev/null +++ b/doc/context/sources/general/manuals/metafun/metafun-environment-screen.tex @@ -0,0 +1,139 @@ +% language=uk +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\startenvironment mfun-environment-screen + +\enablemode[screen] + +\setuppapersize + [S6][S6] + +\setuplayout + [backspace=60pt, + topspace=60pt, + cutspace=0pt, + header=0pt, + footer=0pt, + bottom=20pt, + bottomdistance=40pt, + top=20pt, + topdistance=40pt, + leftmargin=30pt, + leftmargindistance=25pt, + rightmargin=0pt, + edge=0pt, + width=middle, + height=middle] + +\setupbodyfont + [9pt] + +\setuppagenumbering + [alternative=singlesided] + +\setupinteraction + [state=start, + style=bold, + color=darkred, + contrastcolor=darkred, + symbolset=navigation 3, + menu=on] + +\setupsymbolset + [navigation 3] + +\setupinteractionscreen + [option=max] + +\setupinteractionmenu + [bottom] + [unknownreference=yes, + state=start] + +\setuptoptexts + [] + [{\lightgray \bf Page \pagenumber + \doifcontent\quad{}{}\hbox{\getmarking[section]}}] + +\startinteractionmenu[bottom] + \txt \bf \lightgray \getmarking[chapter] \\ + \hfill + \bgroup + \setupinteraction[color=white,contrastcolor=white] + \got [CloseDocument] exit \\ + \egroup + \got [content] content \\ + \got [index] index \\ +% \got [commands] commands \\ + \got [reference] reference \\ + \setupinteraction[color=white,contrastcolor=white] + \got [PreviousJump] \symbol[PreviousJump] \\ + \got [previouspage] \symbol[previouspage] \\ + \got [nextpage] \symbol[nextpage] \\ + \got [NextJump] \symbol[NextJump] \\ +\stopinteractionmenu + +\starttexdefinition unexpanded ChapterCommand #1#2 + \framed [ + background=titled, + frame=off + ] { + #1 + \quad + #2 + } +\stoptexdefinition + +\startuseMPgraphic{PageFrame} + StartPage ; + save p, q, ranx, rany, minx, miny, maxx, maxy ; + pickup pencircle scaled 4pt ; + pair p[] ; path q[] ; numeric ranx, rany, minx, miny, maxx, maxy ; + minx := BackSpace/2 ; maxx := PaperWidth -minx ; ranx := minx/2 ; + miny := TopSpace /2 ; maxy := PaperHeight-miny ; rany := miny/2 ; + p[0] := llcorner Page ; + p[1] := (minx,0) randomshifted (ranx,0) ; + p[2] := (maxx,0) randomshifted (ranx,0) ; + p[3] := lrcorner Page ; + p[4] := (PaperWidth,miny) randomshifted (0,rany) ; + p[5] := (PaperWidth,maxy) randomshifted (0,rany) ; + p[6] := urcorner Page ; + p[7] := (maxx,PaperHeight) randomshifted (ranx,0) ; + p[8] := (minx,PaperHeight) randomshifted (ranx,0) ; + p[9] := ulcorner Page ; + p[10] := (0,maxy) randomshifted (0,rany) ; + p[11] := (0,miny) randomshifted (0,rany) ; + def page_color = (.4+uniformdeviate.3)*white enddef ; + fill Page withcolor \MPcolor{lightgray} ; + q[1] := p[9]--p[6]--p[ 5]--p[10]--cycle ; + q[2] := p[6]--p[3]--p[ 2]--p[ 7]--cycle ; + q[3] := p[3]--p[0]--p[11]--p[ 4]--cycle ; + q[4] := p[0]--p[9]--p[ 8]--p[ 1]--cycle ; + for i=1 upto 4: fill q[i] withcolor page_color ; endfor ; + q[1] := p[9]--p[8]--((p[8]--p[ 1]) intersectionpoint (p[10]--p[ 5]))--p[10]--cycle ; + q[2] := p[6]--p[5]--((p[5]--p[10]) intersectionpoint (p[ 2]--p[ 7]))--p[ 7]--cycle ; + q[3] := p[3]--p[4]--((p[4]--p[11]) intersectionpoint (p[ 7]--p[ 2]))--p[ 2]--cycle ; + q[4] := p[0]--p[1]--((p[1]--p[ 8]) intersectionpoint (p[ 4]--p[11]))--p[11]--cycle ; + for i=1 upto 4: fill q[i] withcolor page_color ; endfor ; + q[1] := p[ 8]--p[1] ; + q[2] := p[ 7]--p[2] ; + q[3] := p[10]--p[5] ; + q[4] := p[11]--p[4] ; + for i=1 upto 4: draw q[i] withcolor \MPcolor{darkred} ; endfor ; + StopPage ; +\stopuseMPgraphic + +% \setupbackgrounds[page][background=PageFrame] + +\setupbackgrounds + [page] + [background={PageFrame,backgraphics,foreground,foregraphics}] + +\defineoverlay[PageFrame][\useMPgraphic{PageFrame}] + +\startMPinclusions + background := \MPcolor{lightgray} ; +\stopMPinclusions + +\stopenvironment diff --git a/doc/context/sources/general/manuals/metafun/metafun-environment.tex b/doc/context/sources/general/manuals/metafun/metafun-environment.tex new file mode 100644 index 000000000..ca9fc24b3 --- /dev/null +++ b/doc/context/sources/general/manuals/metafun/metafun-environment.tex @@ -0,0 +1,595 @@ +% language=uk +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\startenvironment metafun-environment + +\environment metafun-environment-layout + +\usemodule[abr-01,syntax] + +\startuseMPgraphic{cover page} + + numeric w ; w := PaperWidth -eps ; % or clip + numeric h ; h := PaperHeight-eps ; % or clip + + for i=0cm step 1cm until w : + for j=0cm step 1cm until h : + fill unitsquare scaled 1cm shifted (i,j) withcolor (.6+uniformdeviate.35)*white ; + endfor ; + endfor ; + + % clip currentpicture to unitsquare xyscaled (w,h) ; + + for i=0cm step 1cm until w+.5cm : + draw (i,0) -- (i,h) withpen pensquare scaled .5mm withcolor .625yellow ; + endfor ; + + for i=0cm step 1cm until h+.5cm : + draw (0,i) -- (w,i) withpen pensquare scaled .5mm withcolor .625yellow ; + endfor ; + +\stopuseMPgraphic + +\startuseMPgraphic{title page} + + StartPage ; + + \includeMPgraphic{cover page} + + picture p ; p := image (draw rawtextext("\darkred\definedfont[Sans]metafun" )) ; + picture q ; q := image (draw rawtextext("\darkred\definedfont[Sans]Hans Hagen")) ; + % picture r ; r := image (draw rawtextext("\darkred\definedfont[Sans]\doifnotmode{book}{context mkiv}")) ; + picture r ; r := image (draw rawtextext("\darkred\definedfont[Sans]context mkiv")) ; + + p := p xsized(PaperHeight - 2cm) ; + q := q xsized(PaperWidth - 8cm) ; + r := r xsized(6cm) ; + + p := p rotated 90 ; + r := r rotated 90 ; + + draw p shifted (urcorner Page - urcorner p - (1cm,1cm) - (-1mm,0) ) ; + draw q shifted (1cm, 1cm) ; + draw r shifted (urcorner Page - urcorner r - (5cm,2cm) ) ; + + StopPage ; + + setbounds currentpicture to Page ; + +\stopuseMPgraphic + +\startuseMPgraphic{back page} + + \includeMPgraphic{cover page} + +\stopuseMPgraphic + +\startuseMPgraphic{small grid} + + numeric w ; w := \overlaywidth ; + numeric h ; h := \overlayheight ; + numeric d ; d := .25cm ; + + drawoptions(withcolor (.6+uniformdeviate.35)*white) ; + + for i=0cm step d until w : + for j=0cm step d until h : + fill unitsquare scaled d shifted (i,j) ; + endfor ; + endfor ; + + drawoptions(withpen pencircle scaled .125mm withcolor .625yellow) ; + + for i=0 step d until w+d : draw (i,0) -- (i,h) ; endfor ; + for i=0 step d until h+d : draw (0,i) -- (w,i) ; endfor ; + +\stopuseMPgraphic + +\defineoverlay[title page][\useMPgraphic{title page}] + +\startnotmode[proof] + \defineoverlay[back page][\useMPgraphic{back page}] + \defineoverlay[small grid][\useMPgraphic{small grid}] +\stopnotmode + +% could be all in mp + +\starttexdefinition unexpanded OnGrid#1 + \hbox to \hsize \bgroup + \ifodd\realpageno + \hss + \fi + \setbox\scratchbox=\hbox { + \color[darkred]{#1} + } + \scratchoffset.25cm + \scratchwidth\wd\scratchbox + \ifdim\scratchwidth>\zeropoint + \advance \scratchwidth by .5\scratchoffset + \divide \scratchwidth by \scratchoffset + \multiply\scratchwidth by \scratchoffset + \advance \scratchwidth by 2\scratchoffset + \else + \scratchwidth8\scratchoffset + \fi + \dp\scratchbox \scratchoffset + \ht\scratchbox 2\scratchoffset + \framed [ + background=small grid, + frame=off, + offset=overlay + ] { + \hbox to \scratchwidth { + \hss + \box\scratchbox + \hss + } + } + \unless \ifodd\realpageno + \hss + \fi + \egroup +\stoptexdefinition + +\setupfootertexts + [margin] + [] + [\OnGrid{\doifelsetext{\getmarking[chapter]}{\getmarking[chapter]}{\getmarking[title]}}] + +\startuseMPgraphic{circled} + pickup pencircle scaled 1mm ; + drawoptions(withcolor (.6+uniformdeviate.35)*white) ; + fill fullcircle xscaled 1.5cm yscaled 1cm ; + drawoptions(withcolor .625yellow) ; + draw fullcircle xscaled 1.5cm yscaled 1cm ; +\stopuseMPgraphic + +\startnotmode[proof] + \defineoverlay[circled][\useMPgraphic{circled}] +\stopnotmode + +\starttexdefinition unexpanded Circled #1 + \framed [ + background=circled, + frame=off, + offset=overlay + ] { + \color[darkred]{#1} + } +\stoptexdefinition + +\setuppagenumbering + [location=] + +\setupheadertexts + [margin] + [][\hbox to \hsize{\hss\Circled\pagenumber\hss}] + +\setupheader + [style=bold] + +\setupfooter + [style=bold] + +\startuniqueMPgraphic{titled} + path p ; p := unitsquare xscaled OverlayWidth yscaled OverlayHeight ; + pickup pencircle scaled 1mm ; + drawoptions(withcolor .625yellow) ; + draw llcorner p -- lrcorner p ; + setbounds currentpicture to p ; +\stopuniqueMPgraphic + +\defineoverlay[titled][\uniqueMPgraphic{titled}] + +\starttexdefinition unexpanded ChapterCommand #1#2 + \ifconditional\headshownumber + \ifdim\leftmarginwidth<\rightmarginwidth + \donetrue + \else + \donefalse + \fi + \hskip-\ifdone\leftmargintotal\else\rightmargintotal\fi + \framed [ + background=titled, + frame=off, + offset=0pt + ] { + \hbox to \ifdone\leftmarginwidth\else\rightmarginwidth\fi { + #1 + \hss + } + \hskip\ifdone\leftmargindistance\else\rightmargindistance\fi + #2 + } + \else + \framed [ + background=titled, + frame=off, + offset=0pt + ] { + #2 + } + \fi +\stoptexdefinition + +\starttexdefinition unexpanded TitleCommand #1#2 + \framed [ + background=titled, + frame=off, + offset=0pt + ] { + #2 + } +\stoptexdefinition + +\starttexdefinition unexpanded IntroTitleCommand #1#2 + \framed [ + background=titled, + frame=off, + offset=0pt, + width=\textwidth + ] { + \hfill + #2 + } +\stoptexdefinition + +\starttexdefinition unexpanded ExtroTitleCommand #1#2 + \framed [ + background=titled, + frame=off, + offset=0pt, + width=\textwidth + ] { + \hss + #2 + \hss + } +\stoptexdefinition + +\setuphead + [chapter,section,subsection,subsubsection] + [color=darkred] + +\setuphead + [chapter] + [style=\bfc] + +\setuphead + [section] + [style=\bfa] + +\setuphead + [subsection] + [style=\bf] + +\setuphead + [subsubsection] + [style=\bf] + +\setuphead + [chapter,section,subsection,subsubsection] + [command=\ChapterCommand] + +\setuphead + [title,subject,subsubject,subsubsubject] + [command=\TitleCommand] + + +\definehead [introsubject] [subsubject] +\definehead [extrosubject] [subsubject] + +\setuphead [introsubject] [command=\IntroTitleCommand] +\setuphead [extrosubject] [command=\ExtroTitleCommand] + +\setuphead + [subsection,subsubject] + [before=\blank, + after=\blank] + +% charts + +\usemodule[chart] + +\setupFLOWcharts + [offset=0pt, + width=6\bodyfontsize, + height=3\bodyfontsize, + dx=\bodyfontsize, + dy=\bodyfontsize] + +\setupFLOWshapes + [framecolor=darkred] + +\setupFLOWlines + [color=darkyellow] + +% hm, slows down the whole doc + +\setupbackgrounds + [page] + [background={backgraphics,foreground,foregraphics}] + +\defineoverlay [backgraphics] [\positionoverlay{backgraphics}] +\defineoverlay [foregraphics] [\positionoverlay{foregraphics}] + +\startbuffer[shape-a] +\startuniqueMPgraphic{meta:hash}{linewidth,linecolor,angle,gap} + if unknown context_back : input mp-back ; fi ; + some_hash ( OverlayWidth, OverlayHeight , + \MPvar{linewidth}, \MPvar{linecolor} , + \MPvar{angle}, \MPvar{gap} ) ; +\stopuniqueMPgraphic +\stopbuffer + +\startbuffer[shape-b] +\setupMPvariables + [meta:hash] + [gap=.25\bodyfontsize, + angle=45, + linewidth=\overlaylinewidth, + linecolor=\overlaylinecolor] +\stopbuffer + +\startbuffer[shape-c] +\def\metahashoverlay#1{\uniqueMPgraphic{meta:hash}{angle=#1}} + +\defineoverlay[meta:hash:right] [\metahashoverlay{ +45}] +\defineoverlay[meta:hash:left] [\metahashoverlay{ -45}] +\defineoverlay[meta:hash:horizontal][\metahashoverlay{+180}] +\defineoverlay[meta:hash:vertical] [\metahashoverlay{ -90}] +\stopbuffer + +\startbuffer[symb-a] +\startuniqueMPgraphic{meta:button}{type,size,linecolor,fillcolor} + if unknown context_butt : input mp-butt ; fi ; + some_button ( \MPvar{type}, + \MPvar{size}, + \MPvar{linecolor}, + \MPvar{fillcolor} ) ; +\stopuniqueMPgraphic +\stopbuffer + +\startbuffer[symb-b] +\setupMPvariables + [meta:button] + [type=1, + size=2\bodyfontsize, + fillcolor=gray, + linecolor=darkred] +\stopbuffer + +\startbuffer[symb-c] +\def\metabuttonsymbol#1{\uniqueMPgraphic{meta:button}{type=#1}} + +\definesymbol[menu:left] [\metabuttonsymbol{101}] +\definesymbol[menu:right] [\metabuttonsymbol{102}] +\definesymbol[menu:list] [\metabuttonsymbol{103}] +\definesymbol[menu:index] [\metabuttonsymbol{104}] +\definesymbol[menu:person][\metabuttonsymbol{105}] +\definesymbol[menu:stop] [\metabuttonsymbol{106}] +\definesymbol[menu:info] [\metabuttonsymbol{107}] +\definesymbol[menu:down] [\metabuttonsymbol{108}] +\definesymbol[menu:up] [\metabuttonsymbol{109}] +\definesymbol[menu:print] [\metabuttonsymbol{110}] +\stopbuffer + +\hyphenation{tool-kit} + +\startbuffer[pagetext] +\subject{Edward R. Tufte} \input tufte \par +\subject{Donald E. Knuth} \input knuth \par +\subject{Douglas R. Hostadter} \input douglas \page +\stopbuffer + +\startbuffer[back-0] +\defineoverlay[page][\useMPgraphic{page}] +\setupbackgrounds[page][background=page] +\stopbuffer + +\startbuffer[back-1] +\startuseMPgraphic{page} + StartPage ; + path Main ; + if OnRightPage : + Main := lrcorner Field[OuterMargin][Text] -- + llcorner Field[Text] [Text] -- + ulcorner Field[Text] [Text] -- + urcorner Field[OuterMargin][Text] -- cycle ; + else : + Main := llcorner Field[OuterMargin][Text] -- + lrcorner Field[Text] [Text] -- + urcorner Field[Text] [Text] -- + ulcorner Field[OuterMargin][Text] -- cycle ; + fi ; + Main := Main enlarged 6pt ; + pickup pencircle scaled 2pt ; + fill Page withcolor .625white ; + fill Main withcolor .850white ; + draw Main withcolor .625red ; + StopPage ; +\stopuseMPgraphic +\stopbuffer + +\startbuffer[back-2] +\startuseMPgraphic{page} + StartPage ; + pickup pencircle scaled 2pt ; + fill Page withcolor .625white ; + fill Field[OuterMargin][Text] withcolor .850white ; + fill Field[Text] [Text] withcolor .850white ; + draw Field[OuterMargin][Text] withcolor .625red ; + draw Field[Text] [Text] withcolor .625red ; + StopPage ; +\stopuseMPgraphic +\stopbuffer + +\startbuffer[back-3] +\startuseMPgraphic{page} + StartPage ; + pickup pencircle scaled 2pt ; + fill Page withcolor .625white ; + fill Field[Text][Text] enlarged .5cm withcolor .850white ; + draw Field[Text][Text] enlarged .5cm withcolor .625red ; + StopPage ; +\stopuseMPgraphic +\stopbuffer + +\startbuffer[back-4] +\startuseMPgraphic{page} + StartPage ; + def somewhere = + (uniformdeviate 1cm,uniformdeviate 1cm) + enddef ; + path Main ; + Main := Field[Text][Text] lrmoved somewhere -- + Field[Text][Text] llmoved somewhere -- + Field[Text][Text] ulmoved somewhere -- + Field[Text][Text] urmoved somewhere -- cycle ; + pickup pencircle scaled 2pt ; + fill Page withcolor .625white ; + fill Main withcolor .850white ; + draw Main withcolor .625red ; + StopPage ; +\stopuseMPgraphic +\stopbuffer + +\startbuffer[back-4x] +\startuseMPgraphic{page} + StartPage ; + path Main ; Main := Field[Text][Text] randomized 1cm ; + pickup pencircle scaled 2pt ; + fill Page withcolor .625white ; + fill Main withcolor .850white ; + draw Main withcolor .625red ; + StopPage ; +\stopuseMPgraphic +\stopbuffer + +\startbuffer[back-5] +\startuseMPgraphic{page} + StartPage + for i=Top,Header,Text,Footer,Bottom : + for j=LeftEdge,LeftMargin,Text,RightMargin,RightEdge : + draw Field[i][j] withpen pencircle scaled 2pt withcolor .625red ; + endfor ; + endfor ; + StopPage +\stopuseMPgraphic +\stopbuffer + +\starttexdefinition unexpanded Literature #1#2#3 + \blank + \noindentation + #1 + \space + \begingroup + \bf + #2 + \endgroup + \space + #3 + \blank +\stoptexdefinition + +\environment metafun-environment-samples + +\startbuffer[handwrit] + +\usetypescript[serif][chorus] + +\definefont[SomeHandwriting][TeXGyreChorus-MediumItalic*default at 12pt] + +\start \SomeHandwriting\setstrut + +\startMPpage + StartPage ; + numeric l, n ; path p ; + l := 1.5LineHeight ; + n := 0 ; + p := origin shifted (l,0) -- origin shifted (PaperWidth-l,0) ; + for i=PaperHeight-l step -l until l : + n := n + 1 ; + fill p shifted (0,i+StrutHeight) -- + reverse p shifted (0,i-StrutDepth ) -- cycle + withcolor .85white ; + draw p shifted (0,i) + withpen pencircle scaled .25pt + withcolor .5white ; + draw p shifted (0,i+ExHeight) + withpen pencircle scaled .25pt + withcolor .5white ; + draw textext.origin("\strut How are those penalty lines called + in english? I may not steal candies ..." & decimal n) + shifted (l,i) + shifted (0,-StrutDepth) ; + endfor ; + StopPage ; +\stopMPpage +\stop +\stopbuffer + +\startbuffer[gridpage] +\startMPpage + StartPage ; + width := PaperWidth ; height := PaperHeight ; unit := cm ; + drawoptions(withpen pencircle scaled .2pt withcolor .8white) ; + draw vlingrid(0, width /unit, 1/10, width, height) ; + draw hlingrid(0, height/unit, 1/10, height, width ) ; + drawoptions(withpen pencircle scaled .5pt withcolor .4white) ; + draw vlingrid(0, width /unit, 1, width, height) ; + draw hlingrid(0, height/unit, 1, height, width ) ; + StopPage ; +\stopMPpage +\stopbuffer + +% needed to get white backgrounds + +\startmode[screen] + +\startbuffer[wipe] +picture savedpicture ; +savedpicture := currentpicture ; +currentpicture := nullpicture ; +draw savedpicture withcolor black ; +draw savedpicture ; +\stopbuffer + +\stopmode + +\startnotmode[screen] + +\startbuffer[wipe] + % nothing to whipe +\stopbuffer + +\stopnotmode + +\startbuffer[backtext] + + This document introduces you in the world of the graphic programming language + \MetaPost. Not only the language itself is covered in detail, but also the way to + interface with the typographic language \TeX. We also present the collection of + \MetaPost\ extensions that come with the \ConTeXt\ typesetting system. This + collection goes under the name \MetaFun. + + \blank + + All aspects of the \MetaPost\ language are covered. The first chapters focus on + the language itself, later chapters cover aspects like color, graphic + inclusions, adding labels, and stepwise constructing graphics. We finish with a + graphical overview of commands. + +\stopbuffer + +\startbuffer[backbanner] + + \WidthSpanningText + {PRAGMA Advanced Document Engineering, Hasselt NL, \currentdate[year]} + {\hsize} + {RegularBold} + +\stopbuffer + +\stopenvironment diff --git a/doc/context/sources/general/manuals/metafun/metafun-examples.tex b/doc/context/sources/general/manuals/metafun/metafun-examples.tex new file mode 100644 index 000000000..4e5e0eed3 --- /dev/null +++ b/doc/context/sources/general/manuals/metafun/metafun-examples.tex @@ -0,0 +1,3269 @@ +% language=uk +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\startcomponent metafun-examples + +\environment metafun-environment + +\startchapter[title={A few applications}] + +\startintro + +For those who need to be inspired, we will demonstrate how \METAPOST\ can be used +to enhance your document with simple graphics. In these examples we will try to +be not too clever, simply because we lack the experience to be that clever. The +real tricks can be found in the files that come with \METAPOST. + +\stopintro + +\startsection[reference={sec:coils,sec:springs},title={Simple drawings}] + +In the words of John Hobby, the creator of \METAPOST, \quotation {\METAPOST\ is +particularly well||suited for generating figures for technical documents where +some aspects of a picture may be controlled by mathematical or geometrical +constraints that are best expressed symbolically. In other words, \METAPOST\ is +not meant to take the place of a freehand drawing tool or even an interactive +graphics editor}. + +An example of such a picture is the following one, which is dedicated to David +Arnold, who asked me once how to draw a spring. So, imagine that we want to draw +a schematic view of a system of four springs. + +\startbuffer[a] +def spring (expr a, b, w, h, n) = + ( ( (0,0) -- (0,h) -- + for i=1 upto n-1: (if odd(i) : - fi w/2,i+h) -- endfor + (0,n+h) -- (0,n+2h) ) + yscaled ((xpart (b-a) ++ ypart (b-a))/(n+2h)) + rotatedaround(origin,-90+angle(b-a)) + shifted a ) +enddef ; +\stopbuffer + +\startbuffer[b] +vardef spring (expr a, b, w, h, n) = + pair vec ; path pat ; numeric len ; numeric ang ; + vec := (b-a) ; + pat := for i=1 upto n-1: (if odd(i):-fi w/2,i)--endfor (0,n) ; + pat := (0,0)--(0,h)-- pat shifted (0,h)--(0,n+h)--(0,n+2h) ; + len := (xpart vec ++ ypart vec)/(n+2h) ; + ang := -90+angle(vec) ; + ( pat yscaled len rotatedaround(origin,ang) shifted a ) +enddef ; +\stopbuffer + +\startbuffer[c] +path p ; p := + (0,0)--spring((.5cm,0),(2.5cm,0),.5cm,0,10)--(3cm,0) ; + +draw p withpen pencircle scaled 2pt ; +draw p withpen pencircle scaled 1pt withcolor .8white; +\stopbuffer + +\startbuffer[d] +z1 = (+2cm,0) ; z2 = (0,+2cm) ; +z3 = (-2cm,0) ; z4 = (0,-2cm) ; + +pickup pencircle scaled 1.5pt ; + +drawoptions (withcolor .625red) ; + +draw spring (z1, z2, .75cm, 2, 10) ; draw z1 -- 1.5 z1 ; +draw spring (z2, z3, .75cm, 2, 9) ; draw z2 -- 1.1 z2 ; +draw spring (z3, z4, .75cm, 2, 8) ; draw z3 -- 1.5 z3 ; +draw spring (z4, z1, .75cm, 2, 7) ; draw z4 -- 1.1 z4 ; +\stopbuffer + +\startbuffer[e] +drawarrow + (0,0)--spring((.5cm,0),(2.5cm,0),.5cm,0,10)--(3cm,0) + withpen pencircle scaled 2pt withcolor .625red ; +\stopbuffer + +\startbuffer[f] +numeric u ; u := 1mm ; pickup pencircle scaled (u/2) ; +drawoptions (withcolor .625red) ; +draw (0,0)--spring((5u,0),(25u,0),5u,0,10)--(30u,0) ; +drawoptions (dashed evenly withcolor .5white) ; +draw (0,0)--spring((5u,0),(35u,0),(25/35)*5u,0,10)--(40u,0) ; +\stopbuffer + +\startlinecorrection[blank] +\processMPbuffer[a,d] +\stoplinecorrection + +A rather natural way to define such a system is: + +\typebuffer[d] + +Here, the macro \type {spring} takes 5~arguments: two points, the width of the +winding, the length of the connecting pieces, and the number of elements (half +windings). The definition of \type {spring} is less complicated than readable. + +\typebuffer[a] + +First we build a path starting in the origin, going left or right depending on +the counter being an odd number. + +\starttyping +pat := (0,0) ; +for i=1 upto n-1: + if odd(i) : + pat := pat -- (-w/2,i) ; + else : + pat := pat -- (+w/2,i) ; + fi ; +endfor ; +pat := pat -- (0,n) ; +\stoptyping + +Once you are accustomed to the way \METAPOST\ interprets (specialists may say +expand) the source code, you will start using \type {if} and \type {for} +statements in assignments. The previous code can be converted in a one liner, +using the pattern: + +\starttyping +pat := for i=1 upto n-1: (x,y)-- endfor (0,n) ; +\stoptyping + +The loop splits out a series of \type {(x,y)--} but the last point is added +outside the loop. Otherwise \type {pat} would have ended with a dangling \type +{--}. Of course we need to replace \type {(x,y)} by something meaningful, so we +get: + +\starttyping +pat := for i=1 upto n-1: (if odd(i):-fi w/2,i)--endfor (0,n) ; +\stoptyping + +We scale this path to the length needed. The expression $b-a$ calculates a +vector, starting at $a$ and ending at $b$. In \METAPOST, the expression \type +{a++b} is identical to $\sqrt{a^2+b^2}$. Thus, the expression \typ {xpart (b-a) +++ ypart (b-a)} calculates the length of the vector $b-a$. Because the unscaled +spring has length $n+2h$, scaling by the expression \typ {((xpart (b-a) ++ ypart +(b-a)) / (n+2h))} gives the spring the same length as the vector $b-a$. + +Because we have drawn our spring in the vertical position, we first rotate it 90 +degrees clockwise to a horizontal position, and then rotate it through an angle +equal to the angle in which the vector $b-a$ is pointing. After that, we shift it +to the first point. The main complications are that we also want to draw +connecting lines at the beginning and end, as well as support springs that +connect arbitrary points. Since no check is done on the parameters, you should be +careful in using this macro. + +When we want to improve the readability, we have to use intermediate variables. +Since the macro is expected to return a path, we must make sure that the content +matches this expectation. + +\typebuffer[b] + +If you use \type {vardef}, then the last statement is the return value. Here, +when \typ {p := spring (z1, z2, .75cm, 2, 10)} is being parsed, the macro is +expanded, the variables are kept invisible for the assignment, and the path at +the end is considered to be the return value. In a \type {def} the whole body of +the macro is \quote {pasted} in the text, while in a \type {vardef} only the last +line is visible. We will demonstrate this with a simple example. + +\starttyping +def one = (n,n) ; n := n+1 ; enddef ; +def two = n := n + 1 ; (n,n) enddef ; +\stoptyping + +Now, when we say: + +\starttyping +pair a, b ; numeric n ; n= 10 ; a := one ; b := two ; +\stoptyping + +we definitely get an error message. This is because, when macro \type {two} is +expanded, \METAPOST\ sees something: + +\starttyping +b := n := n + 1 ; +\stoptyping + +By changing the second definition in + +\starttyping +vardef two = n := n + 1 ; (n,n) enddef ; +\stoptyping + +the increment is expanded out of sight for \type {b :=} and the pair \type +{(n,n)} is returned. + +We can draw a slightly better looking spring by drawing twice with a different +pen. The following commands use the spring macro implemented by the \type +{vardef}. + +\typebuffer[c] + +This time we get: + +\startlinecorrection[blank] +\processMPbuffer[a,c] +\stoplinecorrection + +Since the \type {spring} macro returns a path, you can do whatever is possible +with a path, like drawing an arrow: + +\startlinecorrection[blank] +\processMPbuffer[a,e] +\stoplinecorrection + +Or even (watch how we use the neutral unit \type {u} to specify the dimensions): + +\startlinecorrection[blank] +\processMPbuffer[a,f] +\stoplinecorrection + +This was keyed in as: + +\typebuffer[e] + +and: + +\typebuffer[f] + +\stopsection + +\startsection[reference=sec:free labels,title={Free labels}] + +\index {labels} + +The \METAPOST\ label macro enables you to position text at certain points. This +macro is kind of special, because it also enables you to influence the +positioning. For that purpose it uses a special kind of syntax which we will not +discuss here in detail. + +\startbuffer[a] +pickup pencircle scaled 1mm ; +path p ; p := fullcircle scaled 3cm ; +draw p withcolor .625yellow ; +dotlabel.rt ("right" , point 0 of p) ; +dotlabel.urt ("upper right" , point 1 of p) ; +dotlabel.top ("top" , point 2 of p) ; +dotlabel.ulft ("upper left" , point 3 of p) ; +dotlabel.lft ("left" , point 4 of p) ; +dotlabel.llft ("lower left" , point 5 of p) ; +dotlabel.bot ("bottom" , point 6 of p) ; +dotlabel.lrt ("lower right" , point 7 of p) ; +\stopbuffer + +\typebuffer[a] + +The \type {label} command just typesets a text, while \type {dotlabel} also draws +a dot at the position of the label. The \type {thelabel} (not shown here) command +returns a picture. + +\startlinecorrection[blank] +\processMPbuffer[a] +\stoplinecorrection + +There is a numeric constant \type {labeloffset} that can be set to influence the +distance between the point given and the content of the label. When we set the +offset to zero, we get the following output. + +\startbuffer[x] +interim labeloffset := 0pt ; % local assignment +\stopbuffer + +\startlinecorrection[blank] +\processMPbuffer[x,a] +\stoplinecorrection + +This kind of positioning works well as long as we know where we want the label to +be placed. However, when we place labels automatically, for instance in a macro, +we have to apply a few clever tricks. There are for sure many ways to accomplish +this goal, but here we will follow the mathless method. + +\startbuffer[a] +pickup pencircle scaled 1mm ; +path p ; p := fullcircle scaled 3cm ; +draw p withcolor .625yellow ; +vardef do (expr str) = + save currentpicture ; picture currentpicture ; + currentpicture := thelabel(str,origin) ; + draw boundingbox currentpicture withpen pencircle scaled .5pt ; + currentpicture +enddef ; +\stopbuffer + +\startbuffer[b] +dotlabel.rt (do("right") , point 0 of p) ; +dotlabel.urt (do("upper right") , point 1 of p) ; +dotlabel.top (do("top") , point 2 of p) ; +dotlabel.ulft (do("upper left") , point 3 of p) ; +dotlabel.lft (do("left") , point 4 of p) ; +dotlabel.llft (do("lower left") , point 5 of p) ; +dotlabel.bot (do("bottom") , point 6 of p) ; +dotlabel.lrt (do("lower right") , point 7 of p) ; +\stopbuffer + +\startlinecorrection[blank] +\processMPbuffer[x,a,b] +\stoplinecorrection + +The previous graphic visualizes the bounding box of the labels. This bounding box +is rather tight and therefore the placement of labels will always be suboptimal. +Compare the alignment of the left- and rightmost labels. The \type {btex}||\type +{etex} method is better, since then we can add struts, like: + +\starttyping +btex \strut right etex +\stoptyping + +to force labels with uniform depths and heights. The next graphic demonstrates +that this looks better indeed. Also, as \TEX\ does the typesetting we get the +current text font instead of the label font and the content will be properly +typeset; for instance kerning will be applied when applicable. Spending some time +on such details pays back in better graphics. + +\startbuffer[b] +dotlabel.rt (do(btex \strut right etex) , point 0 of p) ; +dotlabel.urt (do(btex \strut upper right etex) , point 1 of p) ; +dotlabel.top (do(btex \strut top etex) , point 2 of p) ; +dotlabel.ulft (do(btex \strut upper left etex) , point 3 of p) ; +dotlabel.lft (do(btex \strut left etex) , point 4 of p) ; +dotlabel.llft (do(btex \strut lower left etex) , point 5 of p) ; +dotlabel.bot (do(btex \strut bottom etex) , point 6 of p) ; +dotlabel.lrt (do(btex \strut lower right etex) , point 7 of p) ; +\stopbuffer + +\startlinecorrection[blank] +\processMPbuffer[x,a,b] +\stoplinecorrection + +Now, what happens when we want to place labels in other positions? In the worst +case, given that we place the labels manually, we end up in vague arguments in +favour for one or the other placement. + +\startbuffer[y] +p := p rotatedaround(center p, 22.5) ; +\stopbuffer + +\startlinecorrection[blank] +\processMPbuffer[x,a,y,b] +\stoplinecorrection + +Although any automatic mechanism will be sub||optimal, we can give it a try to +write a macro that deals with arbitrary locations. This macro will accept three +arguments and return a picture. + +\starttyping +thefreelabel("some string or picture",a position,the origin) +\stoptyping + +Our testcase is just a simple \type {for} loop that places a series of labels. +The \type {freedotlabel} macro is derived from \type {thefreelabel}. + +\startbuffer[c] +pickup pencircle scaled 1mm ; +path p ; p := fullcircle scaled 3cm ; +draw p withcolor .625yellow ; +for i=0 step .5 until 7.5 : + freedotlabel ("text" , point i of p, center p) ; +endfor ; +\stopbuffer + +\typebuffer[c] + +As a first step we will simply place the labels without any correction. We also +visualize the bounding box. + +\startbuffer[b] +vardef freedotlabel (expr str, loc, ori) = + drawdot loc ; draw thefreelabel(str,loc,ori) ; +enddef ; + +vardef freelabel (expr str, loc, ori) = + draw thefreelabel(str,loc,ori) ; +enddef ; +\stopbuffer + +\startbuffer[a] +vardef thefreelabel (expr str, loc, ori) = + save s ; picture s ; s := thelabel(str,loc) ; + draw boundingbox s withpen pencircle scaled .5pt ; + s +enddef ; +\stopbuffer + +\typebuffer[a] + +To make our lives more easy, we also define a macro that draws the dot as well as +a macro that draws the label. + +\typebuffer[b] + +Now we get: + +\startlinecorrection[blank] +\processMPbuffer[x,a,b,c] +\stoplinecorrection + +The original label macros permits us to align the label at positions, 4~corners +and 4~points halfway the sides. It happens that circles are also composed of +8~points. Because in most cases the label is to be positioned in the direction of +the center of a curve and the point at hand, it makes sense to take circles as +the starting points for positioning the labels. + +To help us in positioning, we define a special square path, \type {freesquare}. +This path is constructed out of 8~points that match the positions that are used +to align labels. + +\startbuffer[d] +path freesquare ; + +freesquare := ((-1,0)--(-1,-1)--(0,-1)--(+1,-1)-- + (+1,0)--(+1,+1)--(0,+1)--(-1,+1)--cycle) scaled .5 ; +\stopbuffer + +\typebuffer[d] + +We now show this free path together with a circle, using the following +definitions: + +\startbuffer[e] +drawpath fullcircle scaled 3cm ; +drawpoints fullcircle scaled 3cm ; +drawpointlabels fullcircle scaled 3cm ; +currentpicture := currentpicture shifted (5cm,0) ; +drawpath freesquare scaled 3cm ; +drawpoints freesquare scaled 3cm ; +drawpointlabels freesquare scaled 3cm ; +\stopbuffer + +\typebuffer[e] + +We use two drawing macros that are part of the suite of visual debugging macros. + +\startlinecorrection[blank] +\processMPbuffer[x,d,e] +\stoplinecorrection + +As you can see, point~1 is the corner point that suits best for alignment when a +label is put at point~1 of the circle. We will now rewrite \type {thefreelabel} +in such a way that the appropriate point of the associated \type {freesquare} is +found. + +\startbuffer[a] +vardef thefreelabel (expr str, loc, ori) = + save s, p, q, l ; picture s ; path p, q ; pair l ; + s := thelabel(str,loc) ; + p := fullcircle scaled (2*length(loc-ori)) shifted ori ; + q := freesquare xyscaled (urcorner s - llcorner s) ; + l := point (xpart (p intersectiontimes (ori--loc))) of q ; + draw q shifted loc withpen pencircle scaled .5pt ; + draw l shifted loc withcolor .625yellow ; + draw loc withcolor .625red ; + s +enddef ; +\stopbuffer + +\typebuffer[a] + +The macro xyscaled is part of \METAFUN\ and scales in two directions at once. The +\METAPOST\ primitive \type {intersectiontimes} returns a pair of time values of +the point where two paths intersect. The first part of the pair concerns the +first path. + +\startlinecorrection[blank] +\processMPbuffer[x,a,b,c] +\stoplinecorrection + +We are now a small step from the exact placement. If we change the last line of +the macro into: + +\starttyping +(s shifted -l) +\stoptyping + +we get the displacement we want. Although the final look and feel is also +determined by the text itself, the average result is quite acceptable. + +\startbuffer[a] +vardef thefreelabel (expr str, loc, ori) = + save s, p, q, l ; picture s ; path p, q ; pair l ; + s := thelabel(str,loc) ; + p := fullcircle scaled (2*length(loc-ori)) shifted ori ; + q := freesquare xyscaled (urcorner s - llcorner s) ; + l := point (xpart (p intersectiontimes (ori--loc))) of q ; + draw q shifted loc withpen pencircle scaled .5pt ; + draw l shifted loc withcolor .625yellow ; + draw loc withcolor .625red ; + (s shifted -l) +enddef ; +\stopbuffer + +\startlinecorrection[blank] +\processMPbuffer[x,a,b,c] +\stoplinecorrection + +Because we also want to pass pictures, and add a bit of offset too, the final +implementation is slightly more complicated. The picture is handled with an +additional condition, and the offset with the \METAFUN\ macro \type {enlarged}. + +\startbuffer[a] +newinternal freelabeloffset ; freelabeloffset := 3pt ; + +vardef thefreelabel (expr str, loc, ori) = + save s, p, q, l ; picture s ; path p, q ; pair l ; + interim labeloffset := freelabeloffset ; + s := if string str : thelabel(str,loc) + else : str shifted -center str shifted loc fi ; + setbounds s to boundingbox s enlarged freelabeloffset ; + p := fullcircle scaled (2*length(loc-ori)) shifted ori ; + q := freesquare xyscaled (urcorner s - llcorner s) ; + l := point (xpart (p intersectiontimes (ori--loc))) of q ; + setbounds s to boundingbox s enlarged -freelabeloffset ; + (s shifted -l) +enddef ; +\stopbuffer + +\typebuffer[a] + +Watch how we temporarily enlarge the bounding box of the typeset label text. We +will now test this macro on a slightly rotated circle, using labels typeset by +\TEX. The \type {reverse} is there purely for cosmetic reasons, to suit the label +texts. + +\startbuffer[b] +pickup pencircle scaled 1mm ; +path p ; p := reverse fullcircle rotated -25 scaled 3cm ; +draw p withcolor .625yellow ; pair cp ; cp := center p ; +freedotlabel (btex \strut We can etex, point 0 of p, cp) ; +freedotlabel (btex \strut go on etex, point 1 of p, cp) ; +freedotlabel (btex \strut and on etex, point 2 of p, cp) ; +freedotlabel (btex \strut in etex, point 3 of p, cp) ; +freedotlabel (btex \strut defining etex, point 4 of p, cp) ; +freedotlabel (btex \strut funny etex, point 5 of p, cp) ; +freedotlabel (btex \strut macros. etex, point 6 of p, cp) ; +freedotlabel (btex \strut Can't we? etex, point 7 of p, cp) ; +\stopbuffer + +\startlinecorrection[blank] +\processMPbuffer[a,b] +\stoplinecorrection + +\typebuffer[b] + +Unfortunately we can run into problems due to rounding errors. Therefore we use a +less readable but more safe expression for calculating the intersection points. +Instead of using point \type {loc} as endpoint we use \type {loc} shifted over a +very small distance into the direction \type {loc} from \type{ori}. In the +assignment to~\type {l} we replace \type {loc} by: + +\starttyping + ( (1+eps) * arclength(ori--loc) * unitvector(loc-ori) ) +\stoptyping + +\stopsection + +\startsection[title={Marking angles}] + +\index{angles} + +A convenient \METAPOST\ macro is \type {unitvector}. When we draw a line segment +from the origin to the point returned by this macro, the segment has a length of +1~base point. This macro has a wide range of applications, but some basic +knowledge of vector algebra is handy. The following lines of \METAPOST\ code +demonstrate the basics behind unitvectors. + +\startbuffer +pair uv ; pickup pencircle scaled 1mm ; autoarrows := true ; +draw fullcircle scaled 2cm withcolor .625red ; +for i=(10,35), (-40,-20), (85,-15) : + draw origin--i dashed evenly withcolor .625white ; + drawarrow origin--unitvector(i) scaled 1cm withcolor .625yellow ; +endfor ; +draw origin withcolor .625red ; +\stopbuffer + +\typebuffer + +The circle has a radius of 1cm, and the three line segments are drawn from the +origin in the direction of the points that are passed as arguments. Because the +vector has length of~1, we scale it to the radius to let it touch the circle. By +setting \type {autoarrows} we make sure that the arrowheads are scaled +proportionally to the linewidth of 1~mm. + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +An application of this macro is drawing the angle between two lines. In the +\METAPOST\ manual you can find two macros for drawing angles: \type {mark_angle} +and \type {mark_rt_angle}. You may want to take a look at their definitions +before we start developing our own alternatives. + +\startbuffer[x] +pickup pencircle scaled 1mm ; autoarrows := true ; +drawoptions(withcolor .625white) ; +\stopbuffer + +\startbuffer[a] +def anglebetween (expr a, b) = + (unitvector(a){a rotated 90} .. unitvector(b)) +enddef ; +\stopbuffer + +\startbuffer[b] +pair a, b ; a := (2cm,-1cm) ; b := (3cm,1cm) ; +drawarrow origin--a ; drawarrow origin--b ; +drawarrow anglebetween(a,b) scaled 1cm withcolor .625red ; +\stopbuffer + +\startlinecorrection[blank] +\processMPbuffer[x,a,b] +\stoplinecorrection + +The previous graphic demonstrates what we want to accomplish: a circular curve +indicating the angle between two straight lines. The lines and curve are drawn +with the code: + +\typebuffer[b] + +where \type {anglebetween} is defined as: + +\typebuffer[a] + +Both unitvectors return just a point on the line positioned 1~unit (later scaled +to 1cm) from the origin. We connect these points by a curve that starts in the +direction at the first point. If we omit the \type {a rotated 90} direction +specifier, we get: + +\startbuffer[a] +def anglebetween (expr a, b) = + (unitvector(a) .. unitvector(b)) +enddef ; +\stopbuffer + +\startlinecorrection[blank] +\processMPbuffer[x,a,b] +\stoplinecorrection + +These definitions of \type {anglebetween} are far from perfect. If we don't start +in the origin, we get the curve in the wrong place and when we swap both points, +we get the wrong curve. + +\startbuffer[a] +def anglebetween (expr endofa, endofb, common, length) = + (unitvector (endofa-common){(endofa-common) rotated 90} .. + unitvector (endofb-common)) scaled length shifted common +enddef ; +\stopbuffer + +\startbuffer[b] +pair a, b, c ; a := (2cm,-1cm) ; b := (3cm,1cm) ; c := (-1cm,.5cm) ; +drawarrow c--a ; drawarrow c--b ; +drawarrow anglebetween(a,b,c,1cm) withcolor .625red ; +\stopbuffer + +The solution for the displacement is given in the \METAPOST\ manual and looks +like this (we package the macro a bit different): + +\typebuffer[a] + +As you can see, we compensate for the origin of both vectors. This macro is +called with a few more parameters. We need to pass the length, since we want to +add the shift to the macro and the shift takes place after the scaling. + +\typebuffer[b] + +That the results are indeed correct, is demonstrated by the output of following +example: + +\startlinecorrection[blank] +\processMPbuffer[x,a,b] +\stoplinecorrection + +However, when we swap the points, we get: + +\startbuffer[a] +def anglebetween (expr endofb, endofa, common, length) = + (unitvector (endofa-common){(endofa-common) rotated 90} .. + unitvector (endofb-common)) scaled length shifted common +enddef ; +\stopbuffer + +\startlinecorrection[blank] +\processMPbuffer[x,a,b] +\stoplinecorrection + +This means that instead of rotating over $90$ degrees, we have to rotate over +$-90$ or $270$ degrees. That way the arrow will also point in the other +direction. There are undoubtedly more ways to determine the direction, but the +following method also demonstrates the use of \type {turningnumber}, which +reports the direction of a path. For this purpose we compose a dummy cyclic path. + +\startbuffer[a] +vardef anglebetween (expr endofa, endofb, common, length) = + save tn ; tn := turningnumber(common--endofa--endofb--cycle) ; +show tn ; + (unitvector(endofa-common){(endofa-common) rotated (tn*90)} .. + unitvector(endofb-common)) scaled length shifted common +enddef ; +\stopbuffer + +\typebuffer[a] + +Because we use an intermediate variable, just to keep things readable, we have to +use \type {vardef} to hide the assignment for the outside world. We demonstrate +this macro using the following code: + +\startbuffer[b] +pair a, b, c ; a := (2cm,-1cm) ; b := (3cm,1cm) ; c := (-1cm,.5cm) ; +drawarrow c--a ; drawarrow c--b ; +drawarrow anglebetween(a,b,c,0.75cm) withcolor .625red ; +drawarrow anglebetween(b,a,c,1.50cm) withcolor .625red ; +\stopbuffer + +\typebuffer[b] + +Watch how both arrows point in the direction of the line that is determined by +the second point. + +\startlinecorrection[blank] +\processMPbuffer[x,a,b] +\stoplinecorrection + +We now have the framework of an angle drawing macro ready and can start working +placing the label. + +\startbuffer[a] +vardef anglebetween (expr endofa, endofb, common, length, str) = + save curve, where ; path curve ; numeric where ; + where := turningnumber (common--endofa--endofb--cycle) ; + curve := (unitvector(endofa-common){(endofa-common) rotated (where*90)} + .. unitvector(endofb-common)) scaled length shifted common ; + draw thefreelabel(str,point .5 of curve,common) withcolor black ; + curve +enddef ; +\stopbuffer + +\typebuffer[a] + +The macro \type {thefreelabel} is part of \METAFUN\ and is explained in detail in +\in {section} [sec:free labels]. This macro tries to place the label as good as +possible without user interference. + +\startbuffer[b] +pair a ; a := (2cm,-1cm) ; drawarrow origin--a ; +pair b ; b := (3cm, 1cm) ; drawarrow origin--b ; +drawarrow + anglebetween(a,b,origin,1cm,btex $\alpha$ etex) + withcolor .625red ; +\stopbuffer + +\typebuffer[b] + +Instead of a picture we may also pass a string, but using \TEX\ by means of \type +{btex}||\type {etex} often leads to better results. + +\startlinecorrection[blank] +\processMPbuffer[x,a,b] +\stoplinecorrection + +Because in most cases we want the length to be consistent between figures and +because passing two paths is more convenient than passing three points, the final +definition looks slightly different. + +\startbuffer[a] +numeric anglelength ; anglelength := 20pt ; + +vardef anglebetween (expr a, b, str) = % path path string + save endofa, endofb, common, curve, where ; + pair endofa, endofb, common ; path curve ; numeric where ; + endofa := point length(a) of a ; + endofb := point length(b) of b ; + if round point 0 of a = round point 0 of b : + common := point 0 of a ; + else : + common := a intersectionpoint b ; + fi ; + where := turningnumber (common--endofa--endofb--cycle) ; + curve := (unitvector (endofa-common){(endofa-common) rotated (where*90)} .. + unitvector (endofb-common)) scaled anglelength shifted common ; + draw thefreelabel(str,point .5 of curve,common) withcolor black ; + curve +enddef ; +\stopbuffer + +\typebuffer[a] + +This macro has a few more \type {if}'s than its predecessor. First we test if the +label is a string, and if so, we calculate the picture ourselves, otherwise we +leave this to the user. + +\startbuffer[b] +path a, b, c, d, e, f ; +a := origin--( 2cm, 1cm) ; b := origin--( 1cm, 2cm) ; +c := origin--(-2cm, 2cm) ; d := origin--(-2cm,-1cm) ; +e := origin--(-1cm,-2cm) ; f := origin--( 1cm,-2cm) ; +for i=a, b, c, d, e, f : drawarrow i ; endfor ; +anglelength := 1.0cm ; drawoptions(withcolor .625red) ; +drawarrow anglebetween(a,b,btex $\alpha $ etex) ; +drawarrow anglebetween(c,d,btex $\gamma $ etex) ; +drawarrow anglebetween(e,f,btex $\epsilon$ etex) ; +anglelength := 1.5cm ; drawoptions(withcolor .625yellow) ; +drawdblarrow anglebetween(b,c,btex $\beta $ etex) ; +drawarrow reverse anglebetween(d,e,btex $\delta $ etex) ; +drawarrow anglebetween(a,f,btex $\zeta $ etex) ; +\stopbuffer + +\typebuffer[b] + +Because \type {anglebetween} returns a path, you can apply transformations to it, +like reversing. Close reading of the previous code learns that the macro handles +both directions. + +\startlinecorrection[blank] +\processMPbuffer[x,a,b] +\stoplinecorrection + +Multiples of 90 degrees are often identified by a rectangular symbol. We will now +extend the previously defined macro in such a way that more types can be drawn. + +\startbuffer[a] +numeric anglelength ; anglelength := 20pt ; +numeric anglemethod ; anglemethod := 1 ; + +vardef anglebetween (expr a, b, str) = % path path string + save pointa, pointb, common, middle, offset ; + pair pointa, pointb, common, middle, offset ; + save curve ; path curve ; + save where ; numeric where ; + if round point 0 of a = round point 0 of b : + common := point 0 of a ; + else : + common := a intersectionpoint b ; + fi ; + pointa := point anglelength on a ; + pointb := point anglelength on b ; + where := turningnumber (common--pointa--pointb--cycle) ; + middle := ((common--pointa) rotatedaround (pointa,-where*90)) + intersectionpoint + ((common--pointb) rotatedaround (pointb, where*90)) ; + if anglemethod = 1 : + curve := pointa{unitvector(middle-pointa)}.. pointb; + middle := point .5 along curve ; + elseif anglemethod = 2 : + middle := common rotatedaround(.5[pointa,pointb],180) ; + curve := pointa--middle--pointb ; + elseif anglemethod = 3 : + curve := pointa--middle--pointb ; + elseif anglemethod = 4 : + curve := pointa..controls middle..pointb ; + middle := point .5 along curve ; + fi ; + draw thefreelabel(str, middle, common) withcolor black ; + curve +enddef ; +\stopbuffer + +\typebuffer[a] + +\startbuffer[p] +anglemethod := 1 ; +\stopbuffer + +\startbuffer[q] +anglemethod := 2 ; +\stopbuffer + +\startbuffer[r] +anglemethod := 3 ; +\stopbuffer + +\startbuffer +\startcombination[3*1] + {\processMPbuffer[x,a,p,b]} {method 1} + {\processMPbuffer[x,a,q,b]} {method 2} + {\processMPbuffer[x,a,r,b]} {method 3} +\stopcombination +\stopbuffer + +\placefigure + [here][fig:three methods] + {Three ways of marking angles.} + {\getbuffer} + +\in {Figure} [fig:three methods] shows the first three alternative methods +implemented here. Instead of using \typ {unitvectors}, we now calculate the +points using the \typ {arctime} and \typ {arclength} primitives. Instead of +complicated expressions, we use the \METAFUN\ operators \type {along} and \type +{on}. The following expressions are equivalent. + +\starttyping +pointa := point anglelength on a ; +middle := point .5 along curve ; + +pointa := point (arctime anglelength of a) of a ; +middle := arctime (.5(arclength curve)) of curve) of curve ; +\stoptyping + +The third method can be implemented in different, more math intensive ways, but +the current implementation suits rather well and is understood by the author. + +\stopsection + +\startsection[reference=sec:color circles,title={Color circles}] + +\index{color} + +In \in {chapter} [sec:embedding] we showed a few color circles. Drawing such a +graphic can be done in several ways, and here we will show a few methods. First +we will demonstrate how you can apply \type {cutafter} and \type {cutbefore}, +next we will show how the \METAPOST\ macro \type {buildpath} can be used, and +finally we will present a clean solution using \type {subpath}. We will assume +that the circle is called with the macro: + +\starttyping +colorcircle (4cm, red, green, blue) ; +\stoptyping + +\startbuffer[circle] +vardef colorcircle (expr size, red, green, blue) = + save r, g, b, rr, gg, bb, cc, mm, yy ; + save b_r, b_g, g_r, g_b ; + save radius ; + + path r, g, b, rr, bb, gg, cc, mm, yy ; + pair b_r, b_g, g_r, g_b ; + + numeric radius ; radius := 3cm ; + + pickup pencircle scaled (radius/20) ; + + r := g := b := fullcircle scaled radius shifted (0,radius/4); + + r := r rotatedaround(origin, 15) ; % drawarrow r withcolor red ; + g := g rotatedaround(origin,135) ; % drawarrow g withcolor green ; + b := b rotatedaround(origin,255) ; % drawarrow b withcolor blue ; + + b_r := b intersectionpoint r ; % draw b_r ; + b_g := b intersectionpoint g ; % draw b_g ; + g_r := reverse g intersectionpoint r ; % draw g_r ; + g_b := reverse g intersectionpoint b ; % draw g_b ; + + bb := b cutafter b_r ; bb := bb cutbefore b_g ; % drawarrow bb ; + gg := g cutbefore b_g ; gg := gg cutafter g_r ; % drawarrow gg ; + rr := r cutbefore g_r & r cutafter b_r ; % drawarrow rr ; + + cc := b cutbefore b_r ; cc := cc cutafter g_b ; % drawarrow br ; + yy := g cutbefore g_r ; yy := yy cutafter g_b ; % drawarrow rg ; + mm := r cutbefore g_r & r cutafter b_r ; % drawarrow gb ; + + bb := gg -- rr -- reverse bb -- cycle ; + gg := bb rotatedaround(origin,120) ; + rr := bb rotatedaround(origin,240) ; + + cc := mm -- cc -- reverse yy -- cycle ; + yy := cc rotatedaround(origin,120) ; + mm := cc rotatedaround(origin,240) ; + + fill fullcircle scaled radius withcolor white ; + + fill rr withcolor red ; fill cc withcolor white-red ; + fill gg withcolor green ; fill mm withcolor white-green ; + fill bb withcolor blue ; fill yy withcolor white-blue ; + + for i = rr,gg,bb,cc,mm,yy : draw i withcolor .5white ; endfor ; + + currentpicture := currentpicture xsized size ; +enddef ; +\stopbuffer + +We need to calculate seven paths. The first implementation does all the handywork +itself and thereby is rather long, complicated and unreadable. It does not really +use the strength of \METAPOST\ yet. + +\typebuffer[circle] + +In determining the right intersection points, you need to know where the path +starts and in what direction it moves. In case of doubt, drawing the path as an +arrow helps. If you want to see the small paths used, you need to comment the +lines with the \type {fill}'s and uncomment the lines with \type {draw}'s. Due to +the symmetry and the fact that we keep the figure centered around the origin, we +only need to calculate two paths since we can rotate them. + +There are for sure more (efficient) ways to draw such a figure, but this one +demonstrates a few new tricks, like grouping. We use grouping here because we +want to use \type {mm} to indicate the magenta path, and \type {mm} normally +means millimeter. Within a group, you can save variables. These get their old +values when the group is left. + +With \type {for} we process multiple paths after each other. In this case it +hardly saves tokens, but it looks more clever. + +One of the more efficient methods is using the \type {buildcycle} macro. This +macro takes two or more paths and calculates the combined path. Although this is +a rather clever macro, you should be prepared to help it a bit when paths have +multiple intersection points. Again, we could follow a more secure mathematical +method, but the next one took only a few minutes of trial and error. To save some +memory, we redefine the \type {colors} graphic. + +\startbuffer[demo] +colorcircle(4cm, red, green, blue) ; +\stopbuffer + +When we call this macro as: + +\typebuffer[demo] + +we get: + +\startlinecorrection[blank] +\processMPbuffer[circle,demo] +\stoplinecorrection + +Of course this macro is only used for demonstration purposes and has no real use. + +\startbuffer[circle] +vardef colorcircle (expr size, red, green, blue) = + save r, g, b, rr, gg, bb, cc, mm, yy ; save radius ; + path r, g, b, rr, bb, gg, cc, mm, yy ; numeric radius ; + + radius := 5cm ; pickup pencircle scaled (radius/25) ; + + r := g := b := fullcircle scaled radius shifted (0,radius/4) ; + + r := r rotatedaround (origin, 15) ; + g := g rotatedaround (origin,135) ; + b := b rotatedaround (origin,255) ; + + r := r rotatedaround(center r,-90) ; + g := g rotatedaround(center g, 90) ; + + gg := buildcycle(buildcycle(reverse r,b),g) ; + cc := buildcycle(buildcycle(b,reverse g),r) ; + + rr := gg rotatedaround(origin,120) ; + bb := gg rotatedaround(origin,240) ; + + yy := cc rotatedaround(origin,120) ; + mm := cc rotatedaround(origin,240) ; + + fill fullcircle scaled radius withcolor white ; + + fill rr withcolor red ; fill cc withcolor white-red ; + fill gg withcolor green ; fill mm withcolor white-green ; + fill bb withcolor blue ; fill yy withcolor white-blue ; + + for i = rr,gg,bb,cc,mm,yy : draw i withcolor .5white ; endfor ; + + currentpicture := currentpicture xsized size ; +enddef ; +\stopbuffer + +\typebuffer [circle] + +Since we don't want to duplicate a graphic, this time we show the dark +alternatives. + +\startbuffer[demo] +colorcircle(4cm, .5red, .5green, .5blue) ; +\stopbuffer + +\typebuffer[demo] + +This kind of unsafe path calculations are very sensitive to breaking. Changing +the \type {radius/4} into something else demonstrates this but we will not +challenge this macro that much. Therefore, the 50\% color circle shows up as: + +\startlinecorrection[blank] +\processMPbuffer[circle,demo] +\stoplinecorrection + +This command is part of \METAFUN\ and can be used to determine nice color +combinations by also looking at their complementary colors. + +\startbuffer[demo] +colorcircle (4cm, .7red, .5green, .3blue) ; +\stopbuffer + +\typebuffer[demo] + +\startlinecorrection[blank] +\processMPbuffer[circle,demo] +\stoplinecorrection + +The next circle that we draw shows the three main colors used in this document. +This circle is not that beautiful. + +\startbuffer[demo] +colorcircle(4cm,.625red,.625yellow,.625white) ; +\stopbuffer + +\typebuffer[demo] + +\startlinecorrection[blank] +\processMPbuffer[circle,demo] +\stoplinecorrection + +This definition can be cleaned up a bit by using \type {transform}, but the fuzzy +\type {buildcycle}'s remain. + +\startbuffer[circle] +vardef colorcircle (expr size, red, green, blue) = + save r, g, b, rr, gg, bb, cc, mm, yy ; save radius ; + path r, g, b, rr, bb, gg, cc, mm, yy ; numeric radius ; + + radius := 5cm ; pickup pencircle scaled (radius/25) ; + + transform t ; t := identity rotatedaround(origin,120) ; + + r := fullcircle scaled radius + shifted (0,radius/4) rotatedaround(origin,15) ; + + g := r transformed t ; b := g transformed t ; + + r := r rotatedaround(center r,-90) ; + g := g rotatedaround(center g, 90) ; + + gg := buildcycle(buildcycle(reverse r,b),g) ; + cc := buildcycle(buildcycle(b,reverse g),r) ; + + rr := gg transformed t ; bb := rr transformed t ; + yy := cc transformed t ; mm := yy transformed t ; + + fill fullcircle scaled radius withcolor white ; + + fill rr withcolor red ; fill cc withcolor white-red ; + fill gg withcolor green ; fill mm withcolor white-green ; + fill bb withcolor blue ; fill yy withcolor white-blue ; + + for i = rr,gg,bb,cc,mm,yy : draw i withcolor .5white ; endfor ; + + currentpicture := currentpicture xsized size ; +enddef ; +\stopbuffer + +\typebuffer [circle] + +\startbuffer[demo] +colorcircle(4cm,(.4,.6,.8),(.8,.4,.6),(.6,.8,.4)); +\stopbuffer + +\startlinecorrection[blank] +\processMPbuffer[circle,demo] +\stoplinecorrection + +This rather nice circle is defined as: + +\typebuffer[demo] + +The final implementation, which is part of \METAFUN, is slightly more efficient. + +\startbuffer[circle] +vardef colorcircle (expr size, red, green, blue) = + save r, g, b, c, m, y, w ; save radius ; + path r, g, b, c, m, y, w ; numeric radius ; + + radius := 5cm ; pickup pencircle scaled (radius/25) ; + + transform t ; t := identity rotatedaround(origin,120) ; + + r := fullcircle rotated 90 scaled radius + shifted (0,radius/4) rotatedaround(origin,135) ; + + b := r transformed t ; g := b transformed t ; + + c := buildcycle(subpath(1,7) of g, subpath(1,7) of b) ; + y := c transformed t ; m := y transformed t ; + + w := buildcycle(subpath(3,5) of r, + subpath(3,5) of g, subpath(3,5) of b) ; + + pushcurrentpicture ; + + fill r withcolor red ; + fill g withcolor green ; + fill b withcolor blue ; + fill c withcolor white-red ; + fill m withcolor white-green ; + fill y withcolor white-blue ; + fill w withcolor white ; + + for i = r,g,b,c,m,y : draw i withcolor .5white ; endfor ; + + currentpicture := currentpicture xsized size ; + + popcurrentpicture ; +enddef ; +\stopbuffer + +\typebuffer [circle] + +Here, we first fill the primary circles, next we fill the secondary ones. These +also cover the center, which is why finally we fill the center with white. + +\startbuffer[demo] +colorcircle(4cm,(.2,.5,.8),(.8,.2,.5),(.5,.8,.2)); +\stopbuffer + +\startlinecorrection[blank] +\processMPbuffer[circle,demo] +\stoplinecorrection + +The circle uses the following colors: + +\typebuffer[demo] + +The next graphic demonstrates how the subpaths look that build the shapes. + +\startbuffer[circle] +vardef colorcircle (expr size, red, green, blue) = + save r, g, b, c, m, y, w ; save radius ; + path r, g, b, c, m, y, w ; numeric radius ; + + radius := 5cm ; pickup pencircle scaled (radius/25) ; + + transform t ; t := identity rotatedaround(origin,120) ; + + r := fullcircle rotated 90 scaled radius + shifted (0,radius/4) rotatedaround(origin,135) ; + + b := r transformed t ; g := b transformed t ; + + c := buildcycle(subpath(1,7) of g,subpath(1,7) of b) ; + y := c transformed t ; m := y transformed t ; + + w := buildcycle(subpath(3,5) of r, + subpath(3,5) of g, subpath(3,5) of b) ; + + pushcurrentpicture ; + + def do_it = + fill r withcolor red ; + fill g withcolor green ; + fill b withcolor blue ; + fill c withcolor white-red ; + fill m withcolor white-green ; + fill y withcolor white-blue ; + fill w withcolor white ; + for i = r,g,b,c,m,y : draw i withcolor .5white ; endfor ; + enddef ; + + autoarrows := true ; + + do_it ; + for i=r,g,b : drawarrow i withcolor black ; endfor ; + currentpicture := currentpicture shifted (-2radius,0) ; + + do_it ; + for i=r,g,b : drawarrow subpath(1,7) of i withcolor black ; endfor ; + currentpicture := currentpicture shifted (-2radius,0) ; + + do_it ; + for i=r,g,b : drawarrow subpath(3,5) of i withcolor black ; endfor ; + currentpicture := currentpicture shifted (+4radius,2radius) ; + + drawarrow r withpen pencircle scaled (radius/10) withcolor red ; + drawarrow g withpen pencircle scaled (radius/20) withcolor green ; + drawarrow b withpen pencircle scaled (radius/40) withcolor blue ; + currentpicture := currentpicture shifted (-2radius,0) ; + + drawarrow c withpen pencircle scaled (radius/10) withcolor white-red ; + drawarrow m withpen pencircle scaled (radius/20) withcolor white-green ; + drawarrow y withpen pencircle scaled (radius/40) withcolor white-blue ; + currentpicture := currentpicture shifted (-2radius,0) ; + + drawarrow w withcolor black ; + + currentpicture := currentpicture xsized 3size ; + + popcurrentpicture ; +enddef ; +\stopbuffer + +\startlinecorrection[blank] +\processMPbuffer[circle,demo] +\stoplinecorrection + +We did not mention what the push and pop commands are responsible for. Scaling +the current picture is well defined as long as we deal with one graphic. However, +if the current picture already has some content, this content is also scaled. The +push and pop commands let us add content to the current picture as well as +manipulating the picture as a whole without any side effects. The final result is +put on top of the already drawn content. Instead of the sequence: + +\starttyping +pushcurrentpicture ; + ... + currentpicture := currentpicture ... transformations ... ; +popcurrentpicture ; +\stoptyping + +you can say: + +\starttyping +pushcurrentpicture ; + ... +popcurrentpicture ... transformations ... ; +\stoptyping + +Both are equivalent to: + +\starttyping +draw image ( ... ) ... transformations ... ; +\stoptyping + +For larger sequences of commands, the push||pop alternative gives a bit more more +readable code. + +\stopsection + +\startsection[title={Fool yourself}] + +When doing a literature search on the human perception of black||white edges, I +ran into several articles with graphics that I remember having seen before in +books on psychology, physiology and|/|or ergonomics. One of the articles was by +Edward H.~Adelson of MIT and we will use a few of his example graphics in our +exploration to what extend \METAPOST\ can be of help in those disciplines. Since +such graphics normally occur in typeset documents, we will define them in the +document source. + +\startbuffer[a] +\startbuffer +interim linecap := butt ; numeric u ; u := 1cm ; +pickup pencircle scaled .5u ; +for i=1u step u until 5u : + draw (0,i) -- (5u,i) ; +endfor ; +for i=2u step u until 4u : + draw (u,i) -- (2u,i) withcolor .5white ; + draw ((3u,i) -- (4u,i)) shifted (0,-.5u) withcolor .5white ; +endfor ; +\stopbuffer +\stopbuffer + +\startbuffer[b] +\placefigure + [here][fig:tricked 1] + {White's illusion.} + {\processMPbuffer} +\stopbuffer + +\getbuffer[a,b] + +Unless you belong to the happy few whose visual capabilities are not distorted by +neural optimizations, in \in {figure} [fig:tricked 1] the gray rectangles at the +left look lighter than those on the right. Alas, you can fool yourself, but +\METAPOST\ does not cheat. This graphic, referred to as White's illusion, is +defined as follows. + +\typebuffer[a] + +Watch how we include the code directly. We have packaged this graphic in a buffer +which we include as a floating figure. + +\typebuffer[b] + +When passed to \METAPOST, this code is encapsulated in its \type {beginfig} and +\type {endfig} macros and thereby grouped. But any change to a variable that is +not explicitly saved, migrates to the outer level. In order to prevent all +successive graphics to have butt'd linecaps, we have to change this line +characteristic locally. Because \type {linecap} is defined as an internal +variable, we have to use \type {interim} to overload its value. Because \type {u} +is a rather commonly used scratch variable, we don't save its value. + +Watch how we use \type {u} as the loop step. In spite of what your eyes tell you, +this graphic only has two explicit color directives, both being 50\% black. In +the next example we will use some real colors. + +\startbuffer[a] +\startuseMPgraphic{first} + numeric size, delta ; + size := 2.5cm ; delta := size/3 ; + color mainshade, topshade, bottomshade, centershade ; + mainshade := \MPcolor{funcolor} ; + topshade := .9mainshade ; bottomshade := .5mainshade ; + centershade := .5[topshade,bottomshade] ; +\stopuseMPgraphic +\stopbuffer + +\startbuffer[b] +\startuseMPgraphic{second} + \includeMPgraphic{first} + fill fullsquare scaled size withcolor topshade ; + fill fullsquare scaled delta withcolor centershade ; +\stopuseMPgraphic +\stopbuffer + +\startbuffer[c] +\startuseMPgraphic{third} + \includeMPgraphic{first} + fill fullsquare scaled size withcolor bottomshade ; + fill fullsquare scaled delta withcolor centershade ; +\stopuseMPgraphic +\stopbuffer + +\getbuffer[a,b,c] + +\startbuffer[d] +\startcombination[5*2] + {\definecolor[funcolor][red] \useMPgraphic{second}} {} + {\definecolor[funcolor][green] \useMPgraphic{second}} {} + {\definecolor[funcolor][blue] \useMPgraphic{second}} {} + {\definecolor[funcolor][yellow]\useMPgraphic{second}} {} + {\definecolor[funcolor][white] \useMPgraphic{second}} {} + {\definecolor[funcolor][red] \useMPgraphic{third}} {} + {\definecolor[funcolor][green] \useMPgraphic{third}} {} + {\definecolor[funcolor][blue] \useMPgraphic{third}} {} + {\definecolor[funcolor][yellow]\useMPgraphic{third}} {} + {\definecolor[funcolor][white] \useMPgraphic{third}} {} +\stopcombination +\stopbuffer + +\placefigure + [here][fig:tricked 2] + {The simultaneous contrast effect.} + {\getbuffer[d]} + +In \in {figure} [fig:tricked 2] the small squares in the center of each colored +pair of big squares have the same shade, but the way we perceive them are +influenced by their surroundings. Both sets of squares are defined using usable +graphics. The top squares are defined as: + +\typebuffer[b] + +and the bottom squares are coded as: + +\typebuffer[c] + +Because both graphics share code, we have defined that code as a separate +graphic, that we include. The only point of interest in this definition is the +fact that we let \METAPOST\ interpolate between the two colors using \type {.5[ +]}. + +\typebuffer[a] + +The color \type {funcolor} is provided by \CONTEXT, and since we want to use this +graphic with different colors, this kind of mapping is quite convenient. The +bunch of graphics is packaged in a combination with empty captions. Note how we +set the color before we include the graphic. + +\typebuffer[d] + +We use a similar arrangement for the following graphic, where we have replaced +the definitions of \type {first}, \type {second} and \type {third} by new +definitions. + +\startbuffer[a] +\startuseMPgraphic{first} + numeric height, width, radius, gap ; gap := 1mm ; + height = 2.5cm ; width := height/2 ; radius := height/2.5 ; + color mainshade, leftshade, rightshade, centershade ; + mainshade := \MPcolor{funcolor} ; + leftshade := .9mainshade ; rightshade := .5mainshade ; + centershade := .5[leftshade,rightshade] ; + fill unitsquare xyscaled ( width,height) withcolor leftshade ; + fill unitsquare xyscaled (-width,height) withcolor rightshade ; + draw (fullcircle scaled radius) shifted (0,height/2) + withpen pencircle scaled (radius/2) withcolor centershade ; +\stopuseMPgraphic +\stopbuffer + +\startbuffer[b] +\startuseMPgraphic{second} + \includeMPgraphic{first} + interim linecap := butt ; pickup pencircle scaled gap ; + draw (0,0) -- (0,height) withcolor white ; +\stopuseMPgraphic +\stopbuffer + +\startbuffer[c] +\startuseMPgraphic{third} + \includeMPgraphic{first} + picture p, q ; p := q := currentpicture ; + clip p to unitsquare xscaled width yscaled height ; + clip q to unitsquare xscaled -width yscaled height ; + currentpicture := p ; + addto currentpicture also q shifted (0,radius/2) ; +\stopuseMPgraphic +\stopbuffer + +\getbuffer[a,b,c] + +\startbuffer[d] +\startcombination[5*3] + {\definecolor[funcolor][red] \useMPgraphic{first}} {} + {\definecolor[funcolor][green] \useMPgraphic{first}} {} + {\definecolor[funcolor][blue] \useMPgraphic{first}} {} + {\definecolor[funcolor][yellow]\useMPgraphic{first}} {} + {\definecolor[funcolor][white] \useMPgraphic{first}} {} + {\definecolor[funcolor][red] \useMPgraphic{second}} {} + {\definecolor[funcolor][green] \useMPgraphic{second}} {} + {\definecolor[funcolor][blue] \useMPgraphic{second}} {} + {\definecolor[funcolor][yellow]\useMPgraphic{second}} {} + {\definecolor[funcolor][white] \useMPgraphic{second}} {} + {\definecolor[funcolor][red] \useMPgraphic{third}} {} + {\definecolor[funcolor][green] \useMPgraphic{third}} {} + {\definecolor[funcolor][blue] \useMPgraphic{third}} {} + {\definecolor[funcolor][yellow]\useMPgraphic{third}} {} + {\definecolor[funcolor][white] \useMPgraphic{third}} {} +\stopcombination +\stopbuffer + +\placefigure + [here][fig:tricked 3] + {Koffka's examples of manipulating contrast by changing + the spatial configuration.} + {\getbuffer[d]} + +The definition of the first row of \in {figure} [fig:tricked 3] is used in the +second and third and therefore is the most complicated. We use quite some scratch +variables to reach a high level of abstraction. The \type {xyscaled} operator is +a \METAFUN\ macro. + +\typebuffer[a] + +The graphics of the second row extends those of the first by drawing a white line +through the middle. In this example setting the linecap is not really needed, +because rounded top and bottoms in white are invisible and the part that extends +beyond the points does not count in calculating the bounding box. + +\typebuffer[b] + +The third row graphics again extend the first graphic. First we copy the picture +constructed so far. Watch the double assignment. Next we clip the pictures in +half, and shift the right half down over the width of the circle. + +\typebuffer[c] + +\stopsection + +% \startsection[title={Puzzles}] +% +% {\em Maybe.} +% +% \stopsection +% +% \startsection[title={Flow charts}] +% +% {\em Instead of starting anew every time, you can use predefined macros, like +% those in the flow chart module. Let's see how we can influence the \METAPOST\ +% code. Maybe not here.} +% +% \stopsection +% +% \startsection[title={Chemistry}] +% +% {\em \METAPOST\ can do it's work unseen, as in the chemistry module that comes +% with \CONTEXT. There, \METAPOST\ is used as one of the graphical plug||ins. It +% demonstrates that we can put \METAPOST\ to work without seeing any code.} +% +% \stopsection + +\startsection[title={Growing graphics}] + +Although \METAPOST\ is not really suited as a simulation engine, it is possible +to build graphics that are built and displayed incrementally with a sequence of +mouse clicks. The following example is the result of an email discussion David +Arnold and the author had while \METAFUN\ evolved. + +Instead of defining the graphics in a separate \METAPOST\ file, we will +incorporate them in the document source in which they are used. We can use +several methods. + +\startitemize[n] +\startitem + Define macros and figures in a separate file and include the graphics as + external graphics. +\stopitem +\startitem + Define everything in the document source as usable graphics and include the + graphics using \type {\useMPgraphic}. +\stopitem +\startitem + Package the graphic components in buffers and paste those together as + graphics that can be processed at run time. +\stopitem +\stopitemize + +The first method is the most independent one, which has its advantages if we want +to use the graphics in other applications too. The second method works well in +graphics where parts of the definitions change between invocations of the +graphic. This method follows the template: + +\starttyping +\startuseMPgraphic{whatever} + ... +\stopuseMPgraphic + +\startuseMPgraphic{result} + ... + \includeMPgraphic{whatever} + ... +\stopuseMPgraphic + +\useMPgraphic{result} +\stoptyping + +The disadvantage of this method is that it cannot be combined with \type +{btex}||\type {etex} since it is nearly impossible to determine when, how, and to +what extent the content of a graphic should be expanded before writing it to the +temporary \METAPOST\ file. + +Therefore, we will demonstrate how buffers can be used. This third method closely +parallels the first way of defining graphics. A nice side effect is that we can +easily typeset these buffers verbatim, which we did to typeset this document. + +We are going to do a classic compass and straightedge construction, the bisection +of a line segment joining two arbitrary points. We will construct five graphics, +where each one displays one step of the construction. We will embed each graphic +in a start||stop command. Later we will see the advantage of this strategy. + +\startbuffer +\startbuffer[a] +def start_everything = enddef ; +def stop_everything = enddef ; +\stopbuffer +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer +\startbuffer[b] +numeric u, w ; u := .5cm ; w := 1pt ; + +pickup pencircle scaled w ; + +def draw_dot expr p = + draw p withpen pencircle scaled 3w ; +enddef ; + +def stand_out = + drawoptions(withcolor .625red) ; +enddef ; +\stopbuffer +\stopbuffer + +We are going to draw a few dots, and to force consistency we first define a macro +\type {draw_dot}. The current step will be highlighted in red using \type +{stand_out}. + +\typebuffer \getbuffer + +\startbuffer +\startbuffer[c] +def draw_basics = + pair pointA, pointB ; path lineAB ; + pointA := origin ; pointB := pointA shifted (5u,0) ; + lineAB := pointA -- pointB ; + draw lineAB ; + draw_dot pointA ; label.lft(btex A etex, pointA) ; + draw_dot pointB ; label.rt (btex B etex, pointB) ; +enddef ; +\stopbuffer +\stopbuffer + +First, we construct the macro that will plot two points $A$ and $B$ and connect +them with a line segment. + +\typebuffer \getbuffer + +\startbuffer +\startbuffer[1] +start_everything ; + stand_out ; draw_basics ; +stop_everything ; +\stopbuffer +\stopbuffer + +The code in this buffer executes the preceding macros. The \type {..._everything} +commands are still undefined, but later we can use these hooks for special +purposes. + +\typebuffer \getbuffer + +This graphic can now be embedded by the \CONTEXT\ command +\type {\processMPbuffer}. This command, like the ordinary +buffer inclusion commands, accepts a list of buffers. + +\startbuffer +\startlinecorrection[blank] +\ruledhbox{\processMPbuffer[a,b,c,1]} +\stoplinecorrection +\stopbuffer + +\typebuffer + +We use \type {\ruledhbox} to show the tight bounding box of the graphic. The line +correction takes care of proper spacing around non textual content, like +graphics. \footnote {These spacing commands try to get the spacing around the +content visually compatible, and take the height and depth of the preceding and +following text into account.} This is only needed when the graphic is part of the +text flow! + +\getbuffer + +Next, we draw two circles of equal radius, one centered at point $A$, the other +at point $B$. + +\startbuffer +\startbuffer[d] +def draw_circles = + path circleA, circleB ; numeric radius, distance ; + distance := (xpart pointB) - (xpart pointA) ; + radius := 2/3 * distance ; + circleA := fullcircle scaled (2*radius) ; + circleB := circleA shifted pointB ; + draw circleA ; + draw circleB ; +enddef ; +\stopbuffer +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer +\startbuffer[2] +start_everything ; + draw_basics ; stand_out ; draw_circles ; +stop_everything ; +\stopbuffer +\stopbuffer + +As you can see, we move down the \type {stand_out} macro so that only the +additions are colored red. + +\typebuffer \getbuffer + +We now use \type{\processMPbuffer[a,b,c,d,2]} to include the latest step. + +\startlinecorrection[blank] +\ruledhbox{\processMPbuffer[a,b,c,d,2]} +\stoplinecorrection + +The next step in the construction of the perpendicular bisector requires that we +find and label the points of intersection of the two circles centered at points +$A$ and $B$. The intersection points are calculated as follows. Watch the \type +{reverse} operation, which makes sure that we get the second intersection point. + +\startbuffer +\startbuffer[e] +def draw_intersection = + pair pointC, pointD ; + pointC := circleA intersectionpoint circleB ; + pointD := (reverse circleA) intersectionpoint (reverse circleB) ; + draw_dot pointC ; label.lft(btex C etex, pointC shifted (-2w,0)) ; + draw_dot pointD ; label.lft(btex D etex, pointD shifted (-2w,0)) ; +enddef ; +\stopbuffer +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer +\startbuffer[3] +start_everything ; + draw_basics ; draw_circles ; stand_out ; draw_intersection ; +stop_everything ; +\stopbuffer +\stopbuffer + +In placing the label, we must make sure that the text runs free of the lines and +curves. Again, move the \type {stand_out} macro just prior to \type +{draw_intersection} macro, so that this step is highlighted in the drawing color, +while prior steps are drawn in the default color (in this case black). + +\typebuffer \getbuffer + +\startlinecorrection[blank] +\ruledhbox{\processMPbuffer[a,b,c,d,e,3]} +\stoplinecorrection + +The line drawn through points $C$ and $D$ will be the perpendicular bisector of +the line segment connecting points $A$ and $B$. In the next step we will draw a +line using the plain \METAPOST\ \type {drawdblarrow} macro that draws arrowheads +at each end of a path. + +\startbuffer +\startbuffer[f] +def draw_bisector = + path lineCD ; + lineCD := origin -- origin shifted (2*distance,0) ; + lineCD := lineCD rotated 90 shifted 0.5[pointA,pointB] ; + lineCD := lineCD shifted (0,-distance) ; + drawdblarrow lineCD ; +enddef ; +\stopbuffer + +\startbuffer[4] +start_everything ; + draw_basics ; draw_circles ; draw_intersection ; stand_out ; + draw_bisector ; +stop_everything ; +\stopbuffer +\stopbuffer + +\typebuffer \getbuffer + +\startlinecorrection[blank] +\ruledhbox{\processMPbuffer[a,b,c,d,e,f,4]} +\stoplinecorrection + +The following code draws the intersection of line $C-D$ and line segment $A-B$, +which can be shown to be the midpoint of segment $A-B$. + +\startbuffer +\startbuffer[g] +def draw_midpoint = + pair pointM ; + pointM := lineCD intersectionpoint lineAB ; + draw_dot pointM ; label.llft(btex M etex, pointM) ; +enddef ; +\stopbuffer + +\startbuffer[5] +start_everything ; + draw_basics ; draw_circles ; draw_intersection ; draw_bisector ; + stand_out ; draw_midpoint ; +stop_everything ; +\stopbuffer +\stopbuffer + +\typebuffer \getbuffer + +\startlinecorrection[blank] +\ruledhbox{\processMPbuffer[a,b,c,d,e,f,g,5]} +\stoplinecorrection + +As long as we place the graphics as individual insertions in our document, +everything is fine. However, if we wish to place them all at once, or as we shall +see later, place them on top of one another in a fieldstack, it makes sense to +give them all the same bounding box. We can do this by completing the \type +{start_everything} and \type {stop_everything} commands. + +\startbuffer +\startbuffer[a] +def start_everything = + path bb ; + draw_basics ; + draw_circles ; + draw_intersection ; + draw_bisector ; + draw_midpoint ; + bb := boundingbox currentpicture ; + currentpicture := nullpicture ; +enddef ; + +def stop_everything = + setbounds currentpicture to bb ; +enddef ; +\stopbuffer +\stopbuffer + +\typebuffer \getbuffer + +In \in {figure} [fig:1 till 5] we demonstrate the effect of this redefinition. +For this purpose we scale down the graphic to a comfortable 40\%, of course by +using an additional buffer. We also visualize the bounding box. + +\startbuffer +\startbuffer[h] +def stop_everything = + setbounds currentpicture to bb ; + draw bb withpen pencircle scaled .5pt withcolor .625yellow ; + currentpicture := currentpicture scaled .4 ; +enddef ; +\stopbuffer +\stopbuffer + +\typebuffer \getbuffer + +The graphic itself is defined as follows. Watch how we use the default buffer to +keep the definitions readable. + +\startbuffer +\startbuffer +\startcombination[5*1] + {\processMPbuffer[a,b,c,h,d,e,f,g,1]} {step 1} + {\processMPbuffer[a,b,c,h,d,e,f,g,2]} {step 2} + {\processMPbuffer[a,b,c,h,d,e,f,g,3]} {step 3} + {\processMPbuffer[a,b,c,h,d,e,f,g,4]} {step 4} + {\processMPbuffer[a,b,c,h,d,e,f,g,5]} {step 5} +\stopcombination +\stopbuffer + +\placefigure + [here][fig:1 till 5] + {The five graphics, each with the same bounding box.} + {\getbuffer} +\stopbuffer + +\typebuffer \getbuffer + +As the original purpose of these graphics was not to show them side by side, but +to present them as field stack in a document to be viewed at the computer screen. +For this purpose we have to define the graphics as symbols. + +\startbuffer +\definesymbol[step 1][{\processMPbuffer[a,b,c,d,e,f,g,1]}] +\definesymbol[step 2][{\processMPbuffer[a,b,c,d,e,f,g,2]}] +\definesymbol[step 3][{\processMPbuffer[a,b,c,d,e,f,g,3]}] +\definesymbol[step 4][{\processMPbuffer[a,b,c,d,e,f,g,4]}] +\definesymbol[step 5][{\processMPbuffer[a,b,c,d,e,f,g,5]}] +\stopbuffer + +\typebuffer \getbuffer + +A field stack is a sequence of overlayed graphics. We will arrange these to cycle +manually, with clicks of the mouse, through the sequence of graphs depicting the +construction of the midpoint of segment $A-B$. So, in fact we are dealing with a +manual simulation. The definition of such a stack is as follows: + +\startbuffer +\definefieldstack + [midpoint construction] + [step 1, step 2, step 3, step 4, step 5] + [frame=on,offset=3pt,framecolor=darkyellow,rulethickness=1pt] +\stopbuffer + +\typebuffer \getbuffer + +The first argument is to be a unique identifier, the second argument takes a list +of symbols, while the third argument accepts settings. More on this command can +be found in the \CONTEXT\ manuals. + +The stack is shown as \in {figure} [fig:steps]. Its caption provides a button, +which enables the reader to cycle through the stack. We call this a stack because +the graphics are positioned on top of each other. Only one of them is visible at +any time. + +\startbuffer +\placefigure + [here][fig:steps] + {Bisecting a line segment with compass and straightedge? Just + click \goto {here} [JS(Walk_Field{midpoint construction})] to + walk through the construction! (This stack is only visible + in a \PDF\ viewer that supports widgets.)} + {\framed{\startoverlay + {\symbol[step 1]} + {\fieldstack[midpoint construction]} + \stopoverlay}} +\stopbuffer + +\typebuffer + +We cheat a bit and overlay the stack over the first symbol because otherwise +nothing shows up in print (nowadays I mostly use sumatrapdf). + +{\setupinteraction[color=darkred,contrastcolor=darkred]\getbuffer} + +At the start of this section, we mentioned three methods. When we use the first +method of putting all the graphics in an external \METAPOST\ file, the following +framework suits. We assume that the file is called \type {step.mp} and that it is +kept by the user along with his document source. We start with the definitions of +the graphic steps. These are the same as the ones shown previously. + +\starttyping +def draw_basics = ... enddef ; +def draw_circles = ... enddef ; +def draw_intersection = ... enddef ; +def draw_bisector = ... enddef ; +def draw_midpoint = ... enddef ; +def stand_out = ... enddef ; +\stoptyping + +We can safe some code by letting the \type {..._everything} take care of the +\type {beginfig} and \type {endfig} macros. + +\starttyping +def start_everything (expr n) = beginfig(n) ; ... enddef ; +def stop_everything = ... ; endfig ; enddef ; +\stoptyping + +The five graphics now become: + +\starttyping +start_everything (1) ; + stand_out ; draw_basics ; +stop_everything ; + +start_everything (2) ; + draw_basics ; stand_out ; draw_circles ; +stop_everything ; + +start_everything (3) ; + draw_basics ; draw_circles ; stand_out ; draw_intersection ; +stop_everything ; + +start_everything (4) ; + draw_basics ; draw_circles ; draw_intersection ; stand_out ; + draw_bisector ; +stop_everything ; + +start_everything (5) ; + draw_basics ; draw_circles ; draw_intersection ; draw_bisector ; + stand_out ; draw_midpoint ; +stop_everything ; +\stoptyping + +The definitions of the symbols now refer to an external +figure. + +\starttyping +\definesymbol[step 1][{\externalfigure[step.1]}] +\definesymbol[step 2][{\externalfigure[step.2]}] +\definesymbol[step 3][{\externalfigure[step.3]}] +\definesymbol[step 4][{\externalfigure[step.4]}] +\definesymbol[step 5][{\externalfigure[step.5]}] +\stoptyping + +Which method is used, depends on the way the graphics are used. In this example +we wanted to change the definition of \type {..._everything}, so here the third +method was quite useful. + +\stopsection + +\startsection[title={Simple Logos}] + +\startbuffer[ns] +numeric width, height, line, delta ; +width = 5cm ; height = width/2 ; line = height/4 ; delta = line ; + +linejoin := mitered ; pickup pencircle scaled line ; + +color nsblue ; nsblue := (0,0,1) ; +color nsyellow ; nsyellow := (1,1,0) ; + +z1 = (0, height/2) ; +z2 = (width/2-height/4, y1) ; +z3 = (width/2+height/4, y4) ; +z4 = (width, 0) ; + +z5 = (x4+height/2, y1) ; +z6 = (x4, 2y1) ; +z7 = 1.5[z5,z6] ; + +path p ; p := z1--z2--z3--z4 ; path q ; q := z3--z4--z5--z7 ; + +numeric d, lx, ly, ux, uy ; d = line/2 ; + +lx = -3d - d/3 ; ly = -d ; ux = rt x5 + d/3 ; uy = top y6 ; + +path r ; r := (lx,ly)--(ux,ly)--(ux,uy)--(lx,uy)--cycle; + +lx := lx-delta ; ly := ly-delta ; ux := ux+delta ; uy := uy+delta ; + +path s ; s := (lx,ly)--(ux,ly)--(ux,uy)--(lx,uy)--cycle; + +draw p withcolor nsblue ; draw q withcolor nsblue ; + +addto currentpicture also currentpicture + rotatedaround (.5[z2,z3],180) shifted (height/4,height/2) ; + +picture savedpicture ; savedpicture := currentpicture ; + +clip currentpicture to r ; +setbounds currentpicture to r ; + +savedpicture := currentpicture ; currentpicture := nullpicture ; + +fill s withcolor nsyellow ; +addto currentpicture also savedpicture ; +\stopbuffer + +Many company logos earn their beauty from their simplicity. One of the logos that +most Dutch people have imprinted in their mind is that of the Dutch Railway +Company (NS). An interesting feature of this logo is that, although it is widely +known, drawing it on a piece of paper from mind is a task that many people fail. + +\startlinecorrection[blank] +\processMPbuffer[ns] +\stoplinecorrection + +This logo makes a good candidate for demonstrating a few fine points of drawing +graphics, like using linear equations, setting line drawing characteristics, +clipping and manipulating bounding boxes. + +The implementation below is quite certainly not according to the official +specifications, but it can nevertheless serve as an example of defining such +logos. + +\startbuffer[a] +numeric width ; width = 3cm ; +numeric height ; height = width/2 ; +numeric line ; line = height/4 ; +\stopbuffer + +As always, we need to determine the dimensions first. Here, both the height and +line width depend on the width of the graphic. + +Instead of calculating the blue shape such that it will be a filled outline, we +will draw the logo shape using line segments. This is why we need the \type +{line} parameter. + +\typebuffer[a] + +We want sharp corners which can be achieved by setting \type {linejoin} to \type +{mitered}. + +\startbuffer[b] +linejoin := mitered ; pickup pencircle scaled line ; +\stopbuffer + +\typebuffer[b] + +The colors are rather primary blue and yellow. At the time of writing this +manual, Dutch trains are still painted yellow, so we will use that shade as +background color. + +\startbuffer[c] +color nsblue ; nsblue := (0,0,1) ; +color nsyellow ; nsyellow := (1,1,0) ; +\stopbuffer + +\typebuffer[c] + +We will now describe the main curves. Although these expressions are not that +advanced, they demonstrate that we can express relationships instead of using +assignments. + +\startbuffer[d] +z1 = (0, height/2) ; +z2 = (width/2-height/4, y1) ; +z3 = (width/2+height/4, y4) ; +z4 = (width, 0) ; + +path p ; p := z1--z2--z3--z4 ; +\stopbuffer + +\typebuffer[d] + +Although it is accepted to consider \type {z} to be a variable, it is in fact a +\type {vardef} macro, that expands into a pair \type {(x,y)}. This means that the +previous definitions internally become: + +\starttyping +(x1,y1) = (0, height/2) ; +(x2,y2) = (width/2-height/4, y1) ; +(x3,y3) = (width/2+height/4, y4) ; +(x4,y4) = (width, 0) ; +\stoptyping + +These 8 relations can be solved by \METAPOST, since all dependencies are known. + +\starttyping +x1 = 0 ; y1 = height/2 ; +x2 = width/2-height/4 ; y2 = y1 ; +x3 = width/2+height/4 ; y3 = y4 ; +x4 = width ; y4 = 0 ; +\stoptyping + +Since we express the variables \type {x} and \type {y} in terms of relations, we +cannot reuse them, because that would mean that inconsistent relations occur. So, +the following lines will lead to an error message: + +\starttyping +z1 = (10,20) ; z1 = (30,50) ; +\stoptyping + +For similar reasons, we may not assign a value (using \type {:=}) to such a \type +{z} variable. Within a \METAPOST\ figure, \type {z} variables are automatically +saved, which means that they can be reused for each figure. + +\startbuffer[x] +drawpath p ; drawpoints p ; drawpointlabels p ; +\stopbuffer + +So far, we have defined the following segment of the logo. + +\startlinecorrection[blank] +\processMPbuffer[a,b,c,d,x] +\stoplinecorrection + +\startbuffer[e] +z5 = (x4+height/2, y1) ; +z6 = (x4, 2y1) ; +z7 = 1.5[z5,z6] ; + +path q ; q := z3--z4--z5--z7 ; +\stopbuffer + +The next expressions are used to define the second segment. The third expression +determines \type {z7} to be positioned on the line \type {z5--z6}, where we +extend this line by 50\%. + +\typebuffer[e] + +\startbuffer[x] +drawpath q ; drawpoints q ; drawpointlabels q ; +\stopbuffer + +\startlinecorrection[blank] +\processMPbuffer[a,b,c,d,e,x] +\stoplinecorrection + +If we combine these two segments, we get: + +\startbuffer[x] +drawpath p ; drawpoints p ; drawpointlabels p ; +swappointlabels := true ; +drawpath q ; drawpoints q ; drawpointlabels q ; +\stopbuffer + +\startlinecorrection[blank] +\processMPbuffer[a,b,c,d,e,x] +\stoplinecorrection + +However, when we draw them using the right linewidth and color, you will notice +that we're not yet done: + +\startbuffer[f] +draw p withcolor nsblue ; draw q withcolor nsblue ; +\stopbuffer + +\startlinecorrection[blank] +\processMPbuffer[a,b,c,d,e,f] +\stoplinecorrection + +The second curve is similar to the first one, but rotated over 180 degrees. + +\startbuffer[g] +addto currentpicture also currentpicture + rotatedaround (.5[z2,z3],180) shifted (height/4,height/2) ; +\stopbuffer + +\typebuffer[g] + +\startlinecorrection[blank] +\processMPbuffer[a,b,c,d,e,f,g] +\stoplinecorrection + +In order to get the sharp edges, we need to clip off part of +the curves and at first sight, we may consider using a +scaled bounding box. However, when we show the natural +bounding box, you will notice that a more complicated bit of +calculations is needed. + +\startbuffer[x] +draw boundingbox currentpicture + withpen pencircle scaled .5mm withcolor .625white ; +\stopbuffer + +\startlinecorrection[blank] +\processMPbuffer[a,b,c,d,e,f,g,x] +\stoplinecorrection + +The right clip path is calculated using the following expressions. Watch how we +use \type {rt} and \type {top} to correct for the linewidth. + +\startbuffer[h] +numeric d, lx, ly, ux, uy ; d = line/2 ; + +lx = -3d - d/3 ; ly = -d ; ux = rt x5 + d/3 ; uy = top y6 ; + +path r ; r := (lx,ly)--(ux,ly)--(ux,uy)--(lx,uy)--cycle; +\stopbuffer + +\typebuffer[h] + +The clipping path is applied by saying: + +\startbuffer[i] +clip currentpicture to r ; +\stopbuffer + +\typebuffer[i] + +The result is quite acceptable: + +\startlinecorrection[blank] +\processMPbuffer[a,b,c,d,e,f,g,h,i] +\stoplinecorrection + +But, if you watch closely to how this graphic extends into to left margin of this +document, you will see that the bounding box is not yet right. + +\startlinecorrection[blank] +\processMPbuffer[a,b,c,d,e,f,g,h,i,x] +\stoplinecorrection + +\startbuffer[j] +setbounds currentpicture to r ; +\stopbuffer + +\typebuffer[j] + +We use the same path \type {r} to correct the bounding box. + +\startlinecorrection[blank] +\processMPbuffer[a,b,c,d,e,f,g,h,i,j,x] +\stoplinecorrection + +There are a few subtle points involved, like setting the \type {linejoin} +variable. If we had not set it to \type {mitered}, we would have got round +corners. We don't set the \type {linecap}, because a flat cap would not extend +far enough into the touching curve and would have left a small hole. The next +example shows what happens if we set these variables to the wrong values: + +\startbuffer[bb] +linejoin := rounded ; linecap := mitered ; +\stopbuffer + +\startlinecorrection[blank] +\processMPbuffer[a,b,bb,c,d,e,f,g,h,i,j] +\stoplinecorrection + +In fact we misuse the fact that both curves overlay each other. + +\startbuffer[f] +draw p withcolor nsblue ; draw q withcolor .625white ; +\stopbuffer + +\startlinecorrection[blank] +\processMPbuffer[a,b,c,d,e,f,g,h,i,j] +\stoplinecorrection + +The complete logo definition is a bit more extensive because we also want to add +a background. Because we need to clip the blue foreground graphic, we must +temporarily store it when we fill the background. + +\typebuffer[ns] + +For practical use it makes sense to package this definition in a macro to which +we pass the dimensions. + +\stopsection + +\startsection[title={Music sheets}] + +The next example demonstrates quite some features. Imagine that we want to make +us a couple of sheets so that we can write a musical masterpiece. Let's also +forget that \TEX\ can draw lines, which means that somehow we need to use +\METAPOST. + +Drawing a bar is not that complicated as the following code demonstrates. + +\startbuffer +\startusableMPgraphic{bar} + vardef MusicBar (expr width, gap, linewidth, barwidth) = + image + ( interim linecap := butt ; + for i=1 upto 5 : + draw ((0,0)--(width,0)) shifted (0,(i-1)*gap) + withpen pencircle scaled linewidth ; + endfor ; + for i=llcorner currentpicture -- ulcorner currentpicture , + lrcorner currentpicture -- urcorner currentpicture : + draw i withpen pencircle scaled barwidth ; + endfor ; ) + enddef ; +\stopusableMPgraphic +\stopbuffer + +\typebuffer \getbuffer + +We can define the sidebars a bit more efficient using two predefined subpaths: + +\starttyping +for i=leftboundary currentpicture, rightboundary currentpicture : +\stoptyping + +We define a macro \type {MusicBar} that takes four arguments. The first two +determine the dimensions, the last two concern the line widths. Now watch how we +can use this macro: + +\startbuffer +\includeMPgraphic{bar} ; +draw MusicBar (200pt, 6pt, 1pt, 2pt) ; +draw MusicBar (300pt, 6pt, 1pt, 2pt) shifted (0,-30pt) ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +As you can see in this example, the bar is a picture that can be transformed +(shifted in our case). However, a close look at the macro teaches us that it does +a couple of draws too. This is possible because we wrap the whole in an image +using the \type {image} macro. This macro temporary saves the current picture, +and at the end puts the old \type {currentpicture} under the new one. + +We wrap the whole in a \type {vardef}. This means that the image is returned as +if it was a variable. Actually, the last thing in a \type {vardef} should be a +proper return value, in our case a picture. This also means that we may not end +the \type {vardef} with a semi colon. So, when the content of the \type {vardef} +is expanded, we get something + +\starttyping +draw some_picture ... ; +\stoptyping + +Because we are still drawing something, we can add transform directives and set +attributes, like the color. + +The second \type {for} loop demonstrates two nice features. Instead of repeating +the draw operation by copying code, we apply it to a list, in our case a list of +paths. This list contains two simple line paths. Because an \type {image} starts +with a fresh \type {currentpicture}, we can safely use the bounding box data to +determine the height of the line. + +The next step in producing the sheets of paper is to put several bars on a page, +preferable with the width of the current text. This time we will use a reusable +graphic, because each bar is the same. + +\startbuffer +\startreusableMPgraphic{bars} + \includeMPgraphic{bar} ; + draw MusicBar (TextWidth, 6pt, 1pt, 2pt) withcolor .625yellow ; +\stopreusableMPgraphic +\stopbuffer + +\typebuffer \getbuffer + +\startlinecorrection[blank] +\reuseMPgraphic{bars} +\stoplinecorrection + +Instead of going through the trouble of letting \METAPOST\ calculate the positions +of the bars, we will use \TEX. We put 12 bars on a page and let \TEX\ take care +of the inter||bar spacing. Because we only want stretchable space between bars, +called glue in \TEX, we need to remove the last added glue. + +\startnotmode[screen] + +\startbuffer[music] +\startstandardmakeup[doublesided=no,page=] + \dorecurse{15}{\reuseMPgraphic{bars}\vfill}\removelastskip +\stopstandardmakeup +\stopbuffer + +\stopnotmode + +\startmode[screen] + +\startbuffer[music] +\startstandardmakeup[doublesided=no,page=] + \dorecurse{10}{\reuseMPgraphic{bars}\vfill}\removelastskip +\stopstandardmakeup +\stopbuffer + +\stopmode + +\typebuffer[music] + +\startusableMPgraphic{bar} + vardef MusicBar (expr width, gap, linewidth, barwidth) = + image + ( interim linecap := butt ; + for i=1 upto 5 : + draw ((0,0)--(width,0)) + randomized (1pt,1.5pt) + shifted (0,(i-1)*gap) + withpen pencircle scaled linewidth ; + endfor ; + for i=llcorner currentpicture -- ulcorner currentpicture , + lrcorner currentpicture -- urcorner currentpicture : + draw i randomized 2pt shifted (0,-1pt) + withpen pencircle scaled barwidth ; + endfor ; ) + enddef ; +\stopusableMPgraphic + +\startreusableMPgraphic{bars} % trigger a new one + \includeMPgraphic{bar} ; + draw MusicBar (TextWidth, 6pt, 1pt, 2pt) withcolor .625yellow ; +\stopreusableMPgraphic + +It may add to the atmosphere of handy||work if you slightly randomize the lines. +We leave it up to the reader to figure out how the code should be changed to +accomplish this. + +\startlinecorrection[blank] +\reuseMPgraphic{bars} +\stoplinecorrection + +The complete result is shown on the next page. + +\startpostponing +\getbuffer[music] +\stoppostponing + +\stopsection + +\startsection[title={The euro symbol}] + +When Patrick Gundlach posted a nice \METAPOST\ version of the euro symbol to the +\CONTEXT\ discussion list, he added the comment \quotation {The official +construction is ambiguous: how thick are the horizontal bars? How much do they +stick out to the left? Is this thing a circle or what? Are the angles on the left +side of the bars the same as the one on the right side? \unknown} The alternative +below is probably not as official as his, but permits a finetuning. You are +warned: whatever you try, the euro {\em is} and {\em will remain} an ugly symbol. + +We use a couple of global variables to control the euro shape within reasonable +bounds. Then we define two circles. Next we define a vertical line that we use in +a couple of cut and paste operations. Watch how the top left point of the outer +circle determines the slant of the line that we use to slice the vertical bars. + +\startbuffer[euro] +boolean trace_euro ; trace_euro := false ; + +vardef euro_symbol = image ( % begin_of_euro + +if unknown euro_radius : euro_radius := 2cm ; fi ; +if unknown euro_width : euro_width := 3euro_radius/16 ; fi ; +if unknown euro_r_offset : euro_r_offset := euro_width ; fi ; +if unknown euro_l_offset : euro_l_offset := euro_radius/32 ; fi ; +if unknown euro_l_shift : euro_l_shift := euro_r_offset ; fi ; +if unknown euro_v_delta : euro_v_delta := euro_width/4 ; fi ; + +save + outer_circle, inner_circle, hor_bar, + right_line, right_slant, top_slant, bot_slant, + euro_circle, euro_topbar, euro_botbar ; + +path + outer_circle, inner_circle, hor_bar, + right_line, right_slant, top_slant, bot_slant, + euro_circle, euro_topbar, euro_botbar ; + +outer_circle := fullcircle scaled euro_radius ; +inner_circle := fullcircle scaled (euro_radius-euro_width) ; + +if trace_euro : for i = outer_circle, inner_circle : + draw i withpen pencircle scaled 1pt withcolor .5white ; +endfor ; fi ; + +right_line := + (lrcorner outer_circle -- urcorner outer_circle) + shifted (-euro_r_offset,0) ; + +outer_circle := outer_circle cutbefore right_line ; + +right_slant := + point 0 of outer_circle + -- origin shifted (0,ypart lrcorner outer_circle) ; + +euro_circle := buildcycle(outer_circle, right_line, + reverse inner_circle, reverse right_slant) ; + +hor_bar := (-euro_radius,0) -- (euro_radius,0) ; + +top_slant := + right_slant shifted (-euro_radius+euro_r_offset-euro_l_offset,0) ; + +bot_slant := + top_slant shifted (0,-euro_l_shift) ; + +if trace_euro : for i = right_line, right_slant, top_slant, bot_slant : + draw i withpen pencircle scaled 1pt withcolor .5white ; +endfor ; fi ; + +euro_topbar := buildcycle + (top_slant, hor_bar shifted (0, euro_v_delta), + right_slant, hor_bar shifted (0, euro_v_delta+euro_width/2)) ; + +euro_botbar := buildcycle + (bot_slant, hor_bar shifted (0,-euro_v_delta), + right_slant, hor_bar shifted (0,-euro_v_delta-euro_width/2)) ; + +for i = euro_circle, euro_topbar, euro_botbar : + draw i withpen pencircle scaled 0 ; +endfor ; +for i = euro_circle, euro_topbar, euro_botbar : + fill i withpen pencircle scaled 0 ; +endfor ; + +if trace_euro : + drawpoints euro_circle withcolor red ; + drawpoints euro_topbar withcolor green ; + drawpoints euro_botbar withcolor blue ; +fi ; + +) enddef ; % end_of_euro +\stopbuffer + +\typebuffer[euro] + +We only set a parameter when it is not yet set. This has +the advantage that we don't have to set them when we change +one. This way of manipulating paths (cutting and building) +does not always work well because of rounding errors, but +here it does work. + +\startbuffer[demo] +euro_radius := 4cm ; trace_euro := true ; draw euro_symbol ; +\stopbuffer + +\typebuffer[demo] + +For educational purposes, we have added a bit of +tracing. When enabled, the euro shows up as: + +\startlinecorrection[blank] +\processMPbuffer[euro,demo] +\stoplinecorrection + +Of course it would be best to define the euro as one shape, but we won't go +though that process right now. By packaging the combined paths in an image, we +can conveniently color the euro symbol: + +\startbuffer[demo] +draw euro_symbol withcolor .625red ; +\stopbuffer + +\typebuffer[demo] + +\startlinecorrection[blank] +\processMPbuffer[euro,demo] +\stoplinecorrection + +You may wonder why we both draw and fill the euro, using a pen with zero width. +We've done this in order to demonstrate the \type {redraw} and \type {refill} +macros. + +\startbuffer[extra] +redraw currentpicture withpen pencircle scaled 4pt withcolor .625yellow ; +refill currentpicture withcolor .625white ; +setbounds currentpicture to boundingbox currentpicture enlarged 2pt ; +\stopbuffer + +\typebuffer[extra] + +\startlinecorrection[blank] +\processMPbuffer[euro,demo,extra] +\stoplinecorrection + +\stopsection + +\startsection[title={Killing time}] + +Not seldom \TEX\ users want to use this program and its meta||relatives as +general purpose tools, even at the cost of quite some effort or suboptimal +results. Imagine that you are under way from our planet to Mars. After a long +period of sleep you wake up and start wondering on what track you are. You even +start questioning the experts that send you on your way, so you pop open your +laptop, launch your editor and start metaposting. + +First you need to determine the begin and end points of your journey. For now it +is enough to know the relative angle of the paths that both planets follow as +well as the path themselves. We assume circular paths. + +\startbuffer +path a ; a := fullcircle scaled 3cm ; +path b ; b := fullcircle scaled 2cm rotated 120 ; + +draw a withpen pencircle scaled 1mm withcolor .625red ; +draw b withpen pencircle scaled 1mm withcolor .625yellow ; + +draw point 0 of a withpen pencircle scaled 2mm ; +draw point 0 of b withpen pencircle scaled 2mm ; +\stopbuffer + +\typebuffer + +The rotation 120 can be calculated from the relative starting points and time the +journey will take. Alternatively we can use the time along the path, but this +would be a bit more fuzzy later on. \footnote {In case you wonder why \METAPOST\ +talks about the time on a path, you now have a cue.} + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +After a bit of playing with drawing paths between the two points, you decide to +make a macro. We want to feed the angle between the paths but also the connecting +path. So, we have to pass a path, but unfortunately we don't have direct access +to the points. By splitting the argument definition we can pass an expression +first, and a wildcard argument next. + +\startbuffer +\startuseMPgraphic{gamble} +def Gamble (expr rot) (text track) = + path a ; a := fullcircle scaled 3cm ; + path b ; b := fullcircle scaled 2cm rotated rot ; + + pair aa ; aa := point 0 of a ; + pair bb ; bb := point 0 of b ; + path ab ; ab := track ; + + draw a withpen pencircle scaled 1mm withcolor .625red ; + draw b withpen pencircle scaled 1mm withcolor .625yellow ; + + draw aa withpen pencircle scaled 2mm ; + draw bb withpen pencircle scaled 2mm ; + + drawarrow ab withpen pencircle scaled 1mm withcolor .625white ; + + setbounds currentpicture to boundingbox a enlarged 2mm ; + draw boundingbox currentpicture withpen pencircle scaled .25mm ; +enddef ; +\stopuseMPgraphic +\stopbuffer + +\typebuffer \getbuffer + +Because at this distance nobody will bother us with the thickness of the pen and +colors, we code them the hard way. We create our own universe by setting a fixed +boundingbox. + +We leave the Earth in the most popular way, straight upwards and after a few +cycles, we leave it parallel to the surface. The path drawn reminds much of the +trajectories shown in popular magazines. + +\startbuffer +\startMPcode +\includeMPgraphic{gamble} ; +Gamble(120, aa {(0,1)} .. bb) ; +\stopMPcode +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] \getbuffer \stoplinecorrection + +According to \METAPOST, when we leave the Earth straight upwards and want a +smooth trajectory, we have to pass through outer space. + +\startbuffer +\startMPcode +\includeMPgraphic{gamble} ; +Gamble(120,aa {(1,0)} .. bb) ; +\stopMPcode +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] \getbuffer \stoplinecorrection + +Given that we want a smooth path as well as a short journey, we can best follow +Mars' path. Here we face the risk that when we travel slower than Mars does, we +have a problem. + +\startbuffer +\startMPcode +\includeMPgraphic{gamble} ; +Gamble(120,aa {dir 90} .. {precontrol 0 of b rotated 90} bb) ; +\stopMPcode +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] \getbuffer \stoplinecorrection + +We can even travel a shorter path when we leave Earth at the surface that faces +the point of arrival. + +\startbuffer +\startMPcode +\includeMPgraphic{gamble} ; +Gamble(120,aa .. {precontrol 0 of b rotated 90} bb) ; +\stopMPcode +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] \getbuffer \stoplinecorrection + +In the end we decide that although the trajectories look impressive, we will not +trust our lives to \METAPOST. A beautiful path is not neccessarily a good path. +But even then, this macro provides a nice way to experiment with directions, +controls and tensions. + +\stopsection + +% \startsection[title={Animations}] +% +% {\em Although \METAPOST\ is not that well suited for free hand drawings, you can +% use it to make stylistics animations.} +% +% \stopsection + +\startsection[title={Selective randomization}] + +In this document we have used a lot of randomization. Because \CONTEXT\ often +needs multiple runs to sort out cross references, positions, tables of contents, +and so on, being real random every run would result in endless runs to get things +right, because the size of graphics changes. This is prevented by storing the +random seed betweeen runs. You can remove the \type {tuc} file to get a new seed +(or run \type {context --purgeall}). + +Here is another example of randomization. This time we only randomize the control +points so the main shape sort of remains intact which can be handy when you use +such random shapes around text but still want a predictable size. + +\startbuffer +\startMPcode +fill fullcircle scaled 2cm + randomizedcontrols 0.1cm + withcolor darkred + withtransparency (1,.5) ; +fill ((1cm,0)--(0,1cm)--(-1cm,0)--cycle) + randomizedcontrols 0.1cm + withcolor darkblue + withtransparency (1,.5) ; +\stopMPcode +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] \getbuffer \stoplinecorrection + +\startbuffer +\startMPcode +draw image ( + fill fullcircle scaled 2cm + withcolor darkred + withtransparency (1,.5) ; + fill ((1cm,0)--(0,1cm)--(-1cm,0)--cycle) + withcolor darkblue + withtransparency (1,.5) ; +) randomizedcontrols 0.1cm ; +\stopMPcode +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] \getbuffer \stoplinecorrection + +\stopsection + +\startsection[title=Snapping] + +There are quite some helpers in \METAFUN\ and I must admit that I forgot +about most. Some just ended up in the core because they can be useful, others +serve as illustration. Here's one of them: \type {snapped}. First we define +a few helpers that we then use to check out a few shapes. + +\startbuffer +\startMPdefinitions +def ShowSnapGrid(text shape) = + fill (shape xsized 77mm) withcolor white/3 ; + draw image ( + for i=10mm step 5mm until 100mm : + draw fullsquare scaled i ; + endfor ; + ) withcolor 2white/3 ; + drawpoints (shape xsized 77mm) withcolor black ; +enddef ; + +vardef SnapShape expr shape = + image ( + draw shape ; + drawpoints shape ; + ) +enddef ; + +vardef ShowSnapShape expr shape = + ShowSnapGrid(shape); + + draw SnapShape(shape xsized 77mm snapped -5mm ) withcolor red ; + draw SnapShape(shape xsized 77mm snapped 5mm ) withcolor red ; + draw SnapShape(shape xsized 77mm snapped (5mm,10mm)) withcolor green ; + draw SnapShape(shape xsized 77mm snapped (5mm,15mm)) withcolor blue ; + draw SnapShape(shape xsized 77mm snapped (5mm,20mm)) withcolor yellow ; +enddef ; +\stopMPdefinitions +\stopbuffer + +\typebuffer \getbuffer + +In \in {figures} [fig:snapper:1], \in [fig:snapper:2] and \in [fig:snapper:3] we +see how the original shape gets snapped on the grid. Of course in more complex +images the direction of the snapping can change the result in an unwanted way, +like overlapping shapes that obscure others, but normally this snapping is only +useful for simple predictable cases (like title pages). + +\startplacefigure[reference=fig:snapper:1,title={Messing with \type{fullcircle}.}] +\startMPcode + ShowSnapShape(fullcircle); +\stopMPcode +\stopplacefigure + +\startplacefigure[reference=fig:snapper:2,title={\type{fullsquare}}] +\startMPcode + ShowSnapShape(fullsquare); +\stopMPcode +\stopplacefigure + +\startplacefigure[reference=fig:snapper:3,title={\type{fulltriangle}}] +\startMPcode + ShowSnapShape(fulltriangle); +\stopMPcode +\stopplacefigure + +\stopsection + +\startsection[title=Arrowheads] + +Arrows are actually drawn quite well in \METAPOST, as the arrowheads nicely adapt +to the direction of the point where the arrowhead is attached. There are however +some limitations as the following examples demonstrate: arrows don't work well +with transparency and you can probably figure out why. Alan Braslau came up with +an extension that allows to set the dimple of the head. You can see all this +in \in {figure} [fig:arrowheads]. + +\startbuffer[a] +numeric unit ; unit := mm ; + +drawoptions(withcolor .6blue withtransparency (1,.25)) ; + +pickup pencircle scaled 2unit ; ahlength := 6unit ; + +picture p ; p := image ( + drawarrow reverse fullcircle rotated - 5 scaled 50unit ; + drawarrow reverse fullcircle rotated -10 scaled 30unit ; +) shifted ( -45unit, 0unit) ; + +for i=0 step 90 until 360 : draw p rotated i ; endfor ; + +currentpicture := currentpicture shifted - center currentpicture ; + +p := currentpicture ; p := image ( + draw llcorner p -- center p ; + drawarrow llcorner p -- 0.875[llcorner p,center p] ; +) ; + +for i=0 step 90 until 360 : draw p rotated i ; endfor ; + +clip currentpicture to boundingbox (fullcircle scaled 80unit) ; + +if lua.mp.mode("screen") : + currentpicture := currentpicture ysized .4TextHeight ; +else : + currentpicture := currentpicture xsized .4TextWidth ; +fi ; +\stopbuffer + +\typebuffer[a] + +\startbuffer[b] + resetarrows ; +\stopbuffer + +\startbuffer[a1] + ahvariant := 1 ; +\stopbuffer +\startbuffer[a2] + ahvariant := 2 ; +\stopbuffer + +\startbuffer[a3] + ahvariant := 1 ; ahdimple := 1/2 ; +\stopbuffer +\startbuffer[a4] + ahvariant := 1 ; ahdimple := 1 ; +\stopbuffer +\startbuffer[a5] + ahvariant := 1 ; ahdimple := 5/2 ; +\stopbuffer + +\startplacefigure[reference=fig:arrowheads,title=The way arrowheads are constructed.] + \doifelsemode {screen} { + \setupcombination[nx=3,ny=2] + } { + \setupcombination[nx=2,ny=3] + } + \startcombination[distance=2em] + {\processMPbuffer[a, b]} {\tttf ahvariant=0} + {\processMPbuffer[a1,a,b]} {\tttf ahvariant=1} + {\processMPbuffer[a2,a,b]} {\tttf ahvariant=2} + {\processMPbuffer[a3,a,b]} {\tttf ahvariant=1, ahdimple=1/2} + {\processMPbuffer[a4,a,b]} {\tttf ahvariant=1, ahdimple=1} + {\processMPbuffer[a5,a,b]} {\tttf ahvariant=1, ahdimple=5/2} + \stopcombination +\stopplacefigure + +\stopsection + +\startsection[title=Teaser] + +Sometimes, when playing with \METAPOST\ you run into interesting cases. Here is +one. The result is shown in \in {figure} [fig:teaser:1]. + +\startbuffer +\startusableMPgraphic{BackgroundTeaser} + fill OverlayBox enlarged 1mm withcolor darkyellow ; % bleed + path p ; p := OverlayBox enlarged -5mm ; + path q ; q := OverlayBox enlarged -10mm ; + fill q withcolor white ; + drawoptions(withcolor darkred) ; + fill reverse topboundary q -- topboundary p -- cycle ; + fill reverse bottomboundary q -- bottomboundary p -- cycle ; + drawoptions(withcolor darkgreen) ; + fill reverse leftboundary q -- leftboundary p -- cycle ; + fill reverse rightboundary q -- rightboundary p -- cycle ; +\stopusableMPgraphic + +\defineoverlay + [BackgroundTeaser] + [\useMPgraphic{BackgroundTeaser}] + +\framed + [frame=off, + offset=15mm, + background=BackgroundTeaser, + align=normal] + {\input knuth } +\stopbuffer + +\typebuffer + +\startplacefigure[reference=fig:teaser:1,title=Can you guess what happens here?] + \getbuffer +\stopplacefigure + +\stopsection + +\startsection[title={Lists}] + +For some specific purpose I needed to sort a list of paths and therefore +\METAFUN\ comes with a quick sort macro. Its working can be demonstrated by an +example. + +\startbuffer[a] +pair p[], pp[] ; numeric n ; n := 25 ; +for i=1 upto n : p[i] := origin randomized 4cm ; endfor ; +\stopbuffer + +\startbuffer[b] +copylist(p,pp) ; % unsorted +drawarrow listtolines(pp) shifted ( 0,0) withcolor darkblue ; +\stopbuffer + +\startbuffer[c] +copylist(p,pp) ; sortlist(pp)() ; % sorted +drawarrow listtolines(pp) shifted (300,0) withcolor darkyellow ; +\stopbuffer + +\startbuffer[d] +copylist(p,pp) ; sortlist(pp)(xpart) ; +drawarrow listtolines(pp) shifted (100,0) withcolor darkred ; + +\stopbuffer +\startbuffer[e] +copylist(p,pp) ; sortlist(pp)(ypart) ; +drawarrow listtolines(pp) shifted (200,0) withcolor darkgreen ; +\stopbuffer + +\startbuffer[f] +vardef whow expr p = (xpart p + ypart p) enddef ; + +copylist(p,pp) ; sortlist(pp)(whow) ; +drawarrow listtolines(pp) shifted (400,0) withcolor darkcyan ; +\stopbuffer + +\startbuffer[g] +vardef whow expr p = (xpart p ++ ypart p) enddef ; + +copylist(p,pp) ; sortlist(pp)(whow) ; +drawarrow listtolines(pp) shifted (500,0) withcolor darkmagenta ; +\stopbuffer + +\typebuffer[a,b,c,d,e,f,g] + +The result of this code is shown in \in {figure} [fig:sorting]. + +\startplacefigure[reference=fig:sorting,title={Using the sorter.}] + \startcombination[3*2] + {\processMPbuffer[a,b]} {\tttf unsorted} + {\processMPbuffer[a,c]} {\tttf sorted} + {\processMPbuffer[a,d]} {\tttf xpart} + {\processMPbuffer[a,e]} {\tttf ypath} + {\processMPbuffer[a,f]} {\tttf xpart p + ypart p} + {\processMPbuffer[a,g]} {\tttf xpart p ++ ypart p} + \stopcombination +\stopplacefigure + +There is a helper that converts a list of paths into a shape that covers all +of them. In \in {figure} [fig:shapedlist] three shaped lists are shown. + +\startbuffer[a] + def ShowShape(expr e) = + draw image ( + + save p ; path p[] ; + + def MakeShape(expr i,w,h,x,y) = + p[i] := e + xysized ((w,h) randomized (2mm,1mm)) + shifted ((x,y) randomized (2mm,1mm)) ; + enddef ; + + MakeShape(1,40mm,6mm,10mm, 0mm) ; + MakeShape(2,50mm,5mm, 5mm,-10mm) ; + MakeShape(3,20mm,8mm,30mm,-20mm) ; + MakeShape(4,55mm,5mm,10mm,-30mm) ; + MakeShape(5,55mm,5mm, 5mm,-50mm) ; + + save s ; path s ; s := shapedlist(p) ; drawarrow s ; + + linejoin := butt ; + + for i=1 upto 5 : + fill p[i] withcolor .75white withtransparency (1,.5) ; + draw thetextext("\tttf " & decimal i, center p[i]) ; + endfor ; + + ) ysized 4cm ; + enddef ; +\stopbuffer + +\typebuffer[a] + +\startbuffer[b] +ShowShape(unitsquare) +\stopbuffer + +\startbuffer[c] +ShowShape(unitcircle) +\stopbuffer + +\startbuffer[d] +ShowShape(unittriangle) +\stopbuffer + +\startplacefigure[reference=fig:shapedlist,title={The \type {shapedlist} macro returns the envelope that covers all the paths in the list.}] + \startcombination[3*1] + {\processMPbuffer[a,b]} {\tttf unitsquare} + {\processMPbuffer[a,c]} {\tttf unitcircle} + {\processMPbuffer[a,d]} {\tttf unittriangle} + \stopcombination +\stopplacefigure + +\stopsection + +\startsection[title=Table cells] + +Sometimes a standard \CONTEXT\ feature doesn't work out as expected. Take the +following table: + +\startbuffer +\bTABLE[frame=on,framecolor=blue,rulethickness=1pt] + \bTR + \bTD test \eTD + \bTD test \eTD + \bTD test \eTD + \bTD[framecolor=magenta] test \eTD + \bTD test \eTD + \bTD test \eTD + \eTR + \bTR + \bTD test \eTD + \bTD[framecolor=red] test \eTD + \bTD test \eTD + \bTD test \eTD + \bTD test \eTD + \bTD[framecolor=green] test \eTD + \eTR +\eTABLE +\stopbuffer + +\typebuffer + +Because cells are drawn top|-|down and left|-|right a next cell border +overruns the previous one. + +\startlinecorrection +\getbuffer +\stoplinecorrection + +\startbuffer +\bTABLE[frame=on,framecolor=blue,rulethickness=1pt] + \bTR + \bTD test \eTD + \bTD test \eTD + \bTD test \eTD + \bTD[framecolor=magenta,frameoffset=-.5pt] test \eTD + \bTD test \eTD + \bTD test \eTD + \eTR + \bTR + \bTD test \eTD + \bTD[framecolor=red,frameoffset=-.5pt] test \eTD + \bTD test \eTD + \bTD test \eTD + \bTD test \eTD + \bTD[framecolor=green,frameoffset=-.5pt] test \eTD + \eTR +\eTABLE +\stopbuffer + +You can try this: + +\typebuffer + +which gives us something that is not okay either for cells that touch an edge: + +\startlinecorrection +\getbuffer +\stoplinecorrection + +but we can cheat: + +\startlinecorrection +\framed + [offset=overlay, + frameoffset=.5pt, + framecolor=blue, + rulethickness=1pt] + {\getbuffer} +\stoplinecorrection + +This is achieved by framing the whole table: + +\starttyping +\framed + [offset=overlay, + frameoffset=.5pt, + framecolor=blue, + rulethickness=1pt] + {...} +\stoptyping + +\startbuffer +\startuseMPgraphic{cell:innerframe}{innercolor} + draw OverlayBox enlarged -1.5OverlayLineWidth + withpen pensquare scaled OverlayLineWidth + withcolor \MPvar{innercolor} ; +\stopuseMPgraphic + +\defineoverlay + [innerframe] + [{\uniqueMPgraphic{cell:innerframe}% + {innercolor=\framedparameter{innercolor}}}] + +\bTABLE[frame=on,framecolor=blue,rulethickness=1pt,innercolor=magenta] + \bTR + \bTD test \eTD + \bTD test \eTD + \bTD test \eTD + \bTD[background=innerframe] test \eTD + \bTD test \eTD + \bTD test \eTD + \eTR + \bTR + \bTD test \eTD + \bTD[background=innerframe,innercolor=red] test \eTD + \bTD test \eTD + \bTD test \eTD + \bTD test \eTD + \bTD[background=innerframe,innercolor=green] test \eTD + \eTR +\eTABLE +\stopbuffer + +A \METAPOST\ alternative is also possible and it gives a bit nicer +interface too: + +\typebuffer + +We get: + +\startlinecorrection +\getbuffer +\stoplinecorrection + +\stopsection + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/metafun/metafun-functions.tex b/doc/context/sources/general/manuals/metafun/metafun-functions.tex new file mode 100644 index 000000000..780127408 --- /dev/null +++ b/doc/context/sources/general/manuals/metafun/metafun-functions.tex @@ -0,0 +1,611 @@ +% language=uk +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\startcomponent metafun-functions + +\environment metafun-environment + +\startchapter[title={Functions}] + +\index{functions} + +\startintro + +\METAPOST\ provides a wide range of functions, like \type {sind} and \type +{floor}. We will discuss most of them here and define a few more. We will also +introduce a few methods for drawing grids and functions. + +\stopintro + +\startsection[title={Overview}] + +What follows is a short overview of the functions that can be applied to numeric +expressions and strings. Functions that operate on pairs, colors, paths and +pictures are discussed in other chapters. + +First of all we have \type {+}, \type {-}, \type {/} and \type {*}. For as far as +is reasonable, you can apply these to numerics, pairs and colors. Strings can be +concatenated by \type {&}. + +Pythagorean addition is accomplished by \type {++}, while Pythagorean subtraction +is handled by \type {+-+}. The \type {**} operator gives you exponentiation. The +nature of the \METAPOST\ language is such that you can easily define interesting +functions using such symbols. + +The logarithmic functions are based on bytes. This makes them quite accurate but +forces you to think like a computer. + +\starttabulate[|lT|l|] +\HL +\NC mexp(x) \NC expential function with base 256 \NC \NR +\NC mlog(x) \NC logarithm with base 256 \NC \NR +\HL +\stoptabulate + +The basic goniometric functions operate on degrees, which is why they have a +\quote {d} in their name. + +\starttabulate[|lT|l|] +\HL +\NC cosd(x) \NC cosine of $x$ with $x$ in degrees \NC \NR +\NC sind(x) \NC sine of $x$ with $x$ in degrees \NC \NR +\HL +\stoptabulate + +There are three ways to truncate numbers. The \type {round} function can also +handle pairs and colors. + +\starttabulate[|lT|l|] +\HL +\NC ceiling(x) \NC the least integer greater than or equal to $x$ \NC \NR +\NC floor(x) \NC the greatest integer less than or equal to $x$ \NC \NR +\NC round(x) \NC round each component of $x$ to the nearest integer \NC \NR +\HL +\stoptabulate + +Of course we have: + +\starttabulate[|lT|l|] +\HL +\NC x mod y \NC the remainder of $x/y$ \NC \NR +\NC x div y \NC the integer part of $x/y$ \NC \NR +\NC abs(x) \NC the absolute value of $x$ \NC \NR +\NC sqrt(x) \NC the square root of $x$ \NC \NR +\NC x dotprod y \NC the dot product of two vectors \NC \NR +\HL +\stoptabulate + +What would life be without a certain randomness and uncertainty: + +\starttabulate[|lT|l|] +\HL +\NC normaldeviate \NC a number with mean 0 and standard deviation 1 \NC \NR +\NC uniformdeviate(x) \NC a number between zero and $x$ \NC \NR +\HL +\stoptabulate + +The following functions are actually macros: + +\starttabulate[|lT|l|] +\HL +\NC decr(x,n) \NC decrement $x$ by $n$ \NC \NR +\NC incr(x,n) \NC increment $x$ by $n$ \NC \NR +\NC max(a,b,..) \NC return the maximum value in the list \NC \NR +\NC min(a,b,..) \NC return the minimum value in the list \NC \NR +\HL +\stoptabulate + +The \type {min} and \type {max} funtions can be applied to numerics as well as +strings. + +The following functions are related to strings: + +\starttabulate[|lT|l|] +\HL +\NC oct s \NC string representation of an octal number \NC \NR +\NC hex s \NC string representation of a hexadecimal number \NC \NR +\NC str s \NC string representation for a suffix \NC \NR +\NC ASCII s \NC \ASCII\ value of the first character \NC \NR +\NC char x \NC character of the given \ASCII\ code \NC \NR +\NC decimal x \NC decimal representation of a numeric \NC \NR +\HL +\stoptabulate + +With \type {substring (i,j) of s} you can filter the substring bounded by the +given indices from the given string. + +In \METAFUN\ we provide a few more functions (you can take a look in \type +{mp-tool.mp} to see how they are defined. You need to be aware of very subtle +rounding errors. Normally these only show up when you reverse an operation. This +is a result from mapping to and from internal quantities. + +\starttabulate[|Tl|ml|] +\HL +\NC sqr(x) \NC x^2 \NC \NR +\NC log(x) \NC \log(x) \NC \NR +\NC ln(x) \NC \ln(x) \NC \NR +\NC exp(x) \NC {\rm e}^x \NC \NR +\NC pow(x, p) \NC x^p \NC \NR +\NC inv(x) \NC 1/x \NC \NR +\HL +\stoptabulate + +The following sine and cosine functions take radians instead of angles in +degrees. + +\starttabulate[|Tl|Tl|Tl|] +\HL +\NC sin(x) \NC asin(x) \NC invsin(x) \NC \NR +\NC cos(x) \NC acos(x) \NC invcos(x) \NC \NR +\HL +\stoptabulate + +There are no tangent functions, so we provide both the radian and degrees +versions: + +\starttabulate[|Tl|Tl|] +\HL +\NC tan(x) \NC tand(x) \NC \NR +\NC cot(x) \NC cotd(x) \NC \NR +\HL +\stoptabulate + +Here are a couple of hyperbolic functions. + +\starttabulate[|Tl|Tl|] +\HL +\NC sinh(x) \NC asinh(x) \NC \NR +\NC cosh(x) \NC acosh(x) \NC \NR +\HL +\stoptabulate + +We end with a few additional string converters. + +\starttabulate[|Tl|l|] +\HL +\NC ddecimal x \NC decimal representation of a pair \NC \NR +\NC dddecimal x \NC decimal representation of a color \NC \NR +\NC condition x \NC string representation of a boolean \NC \NR +\HL +\stoptabulate + +\stopsection + +\startsection[title={Grids}] + +\index{grids} +\index{axis} + +Some day you may want to use \METAPOST\ to draw a function like graphic. In the +regular \TEX\ distributions you will find a module \type {graph.mp} that provides +many ways to accomplish this. For the moment, \METAFUN\ does not provide advanced +features with respect to drawing functions, so this section will be relatively +short. + +When drawing a functions (for educational purposes) we need to draw a couple of +axis or a grid as well as a shape. Along the axis we can put labels. For this we +can use the \METAPOST\ package \type {format.mp}, but this does not integrate +that well into the way \METAFUN\ deals with text typeset by \TEX. + +For those who love dirty tricks and clever macros, close reading of the code in +\type {format.mp} may be worthwhile. The format macros in there use \TEX\ to +typeset the core components of a number, and use the dimensions of those +components to compose combinations of signs, numbers and superscripts. + +In \METAFUN\ we have the module \type {mp-form.mp} which contains most of the +code in \type {format.mp} but in a form that is a bit more suited for fine +tuning. This permits us to use either the composition method, or to fall back on +the \type {textext} method that is part of \METAFUN. That way we can also handle +fonts that have digits with different dimensions. Another \quote {change} +concerns the pattern separator. Instead of a \type {%} we use \type {@}; you can +choose to set another separator, but for embedded definitions \type {%} is +definitely a bad choice because \TEX\ sees it as a comment and ignores everything +following it. + +\startbuffer[grd] +drawoptions(withpen pencircle scaled 1pt withcolor .625yellow) ; + +draw hlingrid(0, 10, 1, 3cm, 3cm) ; +draw vlingrid(0, 10, 1, 3cm, 3cm) ; + +draw hlingrid(0, 10, 1, 3cm, 3cm) shifted ( 3.5cm,0) ; +draw vloggrid(0, 10, 1, 3cm, 3cm) shifted ( 3.5cm,0) ; + +draw hloggrid(0, 10, 1, 3cm, 3cm) shifted ( 7.0cm,0) ; +draw vlingrid(0, 10, 1, 3cm, 3cm) shifted ( 7.0cm,0) ; + +draw hloggrid(0, 10, 1, 3cm, 3cm) shifted (10.5cm,0) ; +draw vloggrid(0, 10, 1, 3cm, 3cm) shifted (10.5cm,0) ; +\stopbuffer + +\typebuffer[grd] + +\startlinecorrection[blank] +\processMPbuffer[grd] +\stoplinecorrection + +\startbuffer[grd] +drawoptions(withpen pencircle scaled 1pt withcolor .625yellow) ; + +draw hlingrid(0, 10, 1, 3cm, 3cm) slanted .5 ; +draw vlingrid(0, 10, 1, 3cm, 3cm) slanted .5 ; +\stopbuffer + +\typebuffer[grd] + +\startlinecorrection[blank] +\processMPbuffer[grd] +\stoplinecorrection + +Using macros like these often involves a bit of trial and error. The arguments to +these macros are as follows: + +\starttyping +hlingrid (Min, Max, Step, Length, Width) +vlingrid (Min, Max, Step, Length, Height) +hloggrid (Min, Max, Step, Length, Width) +vloggrid (Min, Max, Step, Length, Height) +\stoptyping + +The macros take the following text upto the semi||colon into account and return a +picture. We will now apply this knowledge to a more meaningful example. First we +draw a grid. + +You can use the grid drawing macros to produce your own paper, for instance using +the following mixed \TEX ||\METAFUN\ code: + +\typebuffer[gridpage] + +This produces a page (as in \in {figure} [fig:gridpage]) with a metric grid. If +you're hooked to the inch, you can set \type {unit := 1in}. If you want to +process this code, you need to wrap it into the normal document producing +commands: + +\starttyping +\setupcolors[state=start] + +\starttext + ... definitions ... +\stoptext +\stoptyping + +\placefigure + [page] + [fig:gridpage] + {Quick and dirty grid paper.} + {\typesetfile + [mfun-901.tex] + [page=1,height=.9\textheight]} + +\stopsection + +\startsection[title={Drawing functions}] + +Today there are powerful tools to draw functions on grids, but for simple +functions you can comfortably use \METAPOST. Let's first draw a simple +log||linear grid. + +\startbuffer[grd] +drawoptions(withpen pencircle scaled .25pt withcolor .5white) ; + +draw hlingrid (0, 20, .2, 20cm, 10cm) ; +draw vloggrid (0, 10, .5, 10cm, 20cm) ; + +drawoptions(withpen pencircle scaled .50pt) ; + +draw hlingrid (0, 20, 1, 20cm, 10cm) ; +draw vloggrid (0, 10, 1, 10cm, 20cm) ; +\stopbuffer + +\typebuffer[grd] + +To this grid we add some labels: + +\startbuffer[txt] +fmt_pictures := false ; % use TeX as formatting engine +textextoffset := ExHeight ; % a variable set by ConTeXt + +draw hlintext.lft(0, 20, 5, 20cm, "@3e") ; +draw vlogtext.bot(0, 10, 9, 10cm, "@3e") ; +\stopbuffer + +\typebuffer[txt] + +The arguments to the text placement macros are similar to the ones for drawing +the axes. Here we provide a format string. + +\starttyping +hlintext (Min, Max, Step, Length, Format) +vlintext (Min, Max, Step, Length, Format) +hlogtext (Min, Max, Step, Length, Format) +vlogtext (Min, Max, Step, Length, Format) +\stoptyping + +When drawing a smooth function related curve, you need to provide enough sample +points. The \type {function} macro will generate them for you, but you need to +make sure that for instance the maximum and minimum values are part of the +generated series of points. Also, a smooth curve is not always the right curve. +Therefore we provide three drawing modes: + +\starttabulate[|cT|l|] +\HL +\NC \bf method \NC \bf result \NC \NR +\HL +\NC 1 \NC a punked curve, drawn using \type {--} \NC \NR +\NC 2 \NC a smooth curve, drawn using \type {..} \NC \NR +\NC 3 \NC a tight curve, drawn using \type {...} \NC \NR +\HL +\stoptabulate + +If method~2 or~3 do not give the desired outcome, you can try a smaller step +combined with method~1. + +\startbuffer[log] +draw + function(1,"log(x)","x",1,10,1) xyscaled (10cm,2cm) + withpen pencircle scaled 5mm withcolor transparent(1,.5,yellow) ; + +draw + function(2,".5log(x)","x",1,10,1) xyscaled (10cm,2cm) + withpen pencircle scaled 5mm withcolor transparent(1,.5,blue) ; +\stopbuffer + +\typebuffer[log] + +\placefigure + [page] + {An example of a graphic with labels along the axes.} + {\doifmodeelse{screen} + {\scale[height=.85\textheight]{\processMPbuffer[grd,txt,log]}} + {\processMPbuffer[grd,txt,log]}} + +The first argument to the \type {function} macro specifies the drawing method. +The last three arguments are the start value, end value and step. The second and +third argument specify the function to be drawn. In this case the pairs \type +{(x,x)} and \type {(.5log(x),x)} are calculated. + +\startbuffer[gon] +textextoffset := ExHeight ; + +drawoptions(withpen pencircle scaled .50pt) ; + +draw hlingrid(-10, 10, 1, 10cm, 10cm) ; +draw vlingrid( 0, 20, 1, 10cm, 20cm) shifted (0,-10cm) ; + +drawoptions() ; + +draw + function(2,"x","sind(x)",0,360,10) xyscaled (1cm/36,10cm) + withpen pencircle scaled 5mm withcolor transparent(1,.5,blue) ; + +draw + function(2,"x","sin(x*pi)",0,epsed(2),.1) xyscaled (10cm/2,5cm) + withpen pencircle scaled 5mm withcolor transparent(1,.5,yellow) ; + +draw + function(2,"x","cosd(x)",0,360,10) xyscaled (1cm/36,10cm) + withpen pencircle scaled 5mm withcolor transparent(1,.5,red) ; + +draw + function(2,"x","cos(x*pi)",0,epsed(2),.1) xyscaled (10cm/2,5cm) + withpen pencircle scaled 5mm withcolor transparent(1,.5,green) ; +\stopbuffer + +\typebuffer[gon] + +\placefigure + [page] + {By using transparent colors, we don't have to calculate + and mark the common points: they already stand out.} + {\doifmodeelse{screen} + {\scale[height=.85\textheight]{\processMPbuffer[gon]}} + {\processMPbuffer[gon]}} + +In this example we draw sinus and cosine functions using degrees and radians. In +the case of radians the end points are not calculated due to rounding errors. In +such case you can use the \type {epsed} value, which gives slightly more +playroom. + +\startbuffer[mix] +draw function (1, "x", "sin(2x)" , 1, 10, .01) scaled 1.5cm + withpen pencircle scaled 1mm withcolor transparent(1,.5,red) ; +draw function (1, "x", "sin(2x*x)" , 1, 10, .01) scaled 1.5cm + withpen pencircle scaled 1mm withcolor transparent(1,.5,green) ; +draw function (1, "x", "sin(2x*x+x)", 1, 10, .01) scaled 1.5cm + withpen pencircle scaled 1mm withcolor transparent(1,.5,blue) ; +\stopbuffer + +\typebuffer[mix] + +Of course you can do without a grid. The next example demonstrates a nice +application of transparencies. + +\startlinecorrection[blank] +\processMPbuffer[mix] +\stoplinecorrection + +If we use the \type {exclusion} method for the transparencies, combined with no +transparency, we get the following alternative. + +\startbuffer[mix] +draw function (2, "x", "sin(x)" , 0, 2pi, pi/40) scaled 2cm + withpen pencircle scaled 5mm withcolor transparent("exclusion",1,red) ; +draw function (2, "x", "sin(2x)", 0, 2pi, pi/40) scaled 2cm + withpen pencircle scaled 5mm withcolor transparent("exclusion",1,green) ; +draw function (2, "x", "sin(3x)", 0, 2pi, pi/40) scaled 2cm + withpen pencircle scaled 5mm withcolor transparent("exclusion",1,blue) ; +\stopbuffer + +\typebuffer[mix] + +\startlinecorrection[blank] +\processMPbuffer[mix,wipe] +\stoplinecorrection + +The next alternative uses a larger step, and as a result (in drawing mode~2) +gives worse results. (Without the \type {epsed} it would have looked even worse +in the end points. + + \startbuffer[mix] +draw function (2, "x", "sin(x)" , 0, epsed(2pi), pi/10) scaled 2cm + withpen pencircle scaled 5mm withcolor transparent("exclusion",1,red) ; +draw function (2, "x", "sin(2x)", 0, epsed(2pi), pi/10) scaled 2cm + withpen pencircle scaled 5mm withcolor transparent("exclusion",1,green) ; +draw function (2, "x", "sin(3x)", 0, epsed(2pi), pi/10) scaled 2cm + withpen pencircle scaled 5mm withcolor transparent("exclusion",1,blue) ; +\stopbuffer + +\typebuffer[mix] + +\startlinecorrection[blank] +\processMPbuffer[mix,wipe] +\stoplinecorrection + +There are enough applications out there to draw nice functions, like gnuplot for +which Mojca Miklavec made a backend that works well with \CONTEXT. Nevertheless +it can be illustrative to explore the possibilities of the \CONTEXT, \LUATEX, +\METAPOST\ combination using functions. + +First of all you can use \LUA\ to make paths and this is used in some of the +debugging and tracing options that come with \CONTEXT. For instance, if you +process a document with + +\starttyping +context --timing yourdoc.tex +\stoptyping + +then you can afterwards process a file that is generated while processing this +document: + +\starttyping +context --extras timing yourdoc +\stoptyping + +This will give you a document with graphics that show where \LUATEX\ spent its +time on. Of course these graphics are generated with \METAPOST. + +There are a few helpers built in (and more might follow). For example: + +\startbuffer +draw + \ctxlua { + metapost.metafun.topath { + { x=1, y=1 }, + { x=1, y=3 }, + { 4, 1}, + "cycle" + } + } + xysized(4cm,3cm) + withpen pencircle scaled 1mm + withcolor .625 red ; +\stopbuffer + +\typebuffer + +The \type {topath} function takes a table of points or strings. + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +You can pass a connector so + +\startbuffer +draw + \ctxlua { + metapost.metafun.topath ( + { + { x=1, y=1 }, + { x=1, y=3 }, + { 4, 1 }, + "cycle" + }, + "--" + ) + } + xysized(4cm,3cm) + withpen pencircle scaled 1mm + withcolor .625 red ; +\stopbuffer + +\typebuffer + +gives: + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +Writing such \LUA\ functions is no big deal. For instance we have available: + +\starttyping +function metapost.metafun.interpolate(f,b,e,s,c) + tex.write("(") + for i=b,e,(e-b)/s do + local d = loadstring ( + string.formatters["return function(x) return %s end"](f) + ) + if d then + d = d() + if i > b then + tex.write(c or "...") + end + tex.write(string.formatters["(%F,%F)"](i,d(i))) + end + end + tex.write(")") +end +\stoptyping + +An example of usage is: + +\startbuffer +draw + \ctxlua{metapost.metafun.interpolate( + "math.sin(x^2+2*x+math.sqrt(math.abs(x)))", + -math.pi/2,math.pi/2,100 + )} + xysized(6cm,3cm) + withpen pencircle scaled 1mm + withcolor .625 red ; +\stopbuffer + +\typebuffer + +And indeed we get some drawing: + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +Let's see what happens when we use less accuracy and a different connector: + +\startbuffer +draw + \ctxlua{metapost.metafun.interpolate( + "math.sin(x^2+2*x+math.sqrt(math.abs(x)))", + -math.pi/2,math.pi/2,10,"--" + )} + xysized(6cm,3cm) + withpen pencircle scaled 1mm + withcolor .625 red ; +\stopbuffer + +\typebuffer + +Now we get: + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +Of course we could extend this \LUA\ function with all kind of options and we +might even do that when we need it. + +\stopsection + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/metafun/metafun-gadgets.tex b/doc/context/sources/general/manuals/metafun/metafun-gadgets.tex new file mode 100644 index 000000000..9010fc403 --- /dev/null +++ b/doc/context/sources/general/manuals/metafun/metafun-gadgets.tex @@ -0,0 +1,548 @@ +% language=uk +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\startcomponent metafun-gadgets + +\environment metafun-environment + +\startchapter[title={Shapes, symbols and buttons}] + +\startintro + +One can use \METAPOST\ to define symbols and enhance buttons. Here we introduce +some of the gadgets that come with \CONTEXT, as well as explain how to integrate +such gadgets yourself. + +\stopintro + +\startsection[title={Interfacing to \TEX}] + +\index {interfacing} + +\startbuffer[a] +\setupMPvariables + [EnglishRule] + [height=1ex, + width=\availablehsize, + color=darkgray] + +\startuniqueMPgraphic{EnglishRule}{height,width,color} + numeric height ; height = \MPvar{height} ; + x1 = 0 ; x3 = \MPvar{width} ; x2 = x4 = .5x3 ; + y1 = y3 = 0 ; y2 := -y4 = height/2 ; + fill z1 .. z2 .. z3 & z3 .. z4 .. z1 & cycle + withcolor \MPvar{color} ; +\stopuniqueMPgraphic +\stopbuffer + +\startbuffer[b] +\defineblank + [EnglishRule] + [medium] + +\unexpanded\def\EnglishRule + {\start + \dontcomplain + \startlinecorrection[EnglishRule] + \noindent \reuseMPgraphic{EnglishRule} + \stoplinecorrection + \stop} +\stopbuffer + +\getbuffer[a,b] + +In the early days of \METAPOST\ support in \CONTEXT, Tobias Burnus asked me if it +was possible to define English rules. What exactly does an english rule look +like? Here is one: + +\EnglishRule + +As you can see, such a rule has to adapt itself to the current text width, +normally \type {\hsize} in \TEX, or on request \type {\availablehsize} in +\CONTEXT. We need to set the height to a reasonable size, related to the font +size, and we also need to take care of proper spacing. Of course we want to run +\METAPOST\ as less times as possible, so we need to use unique graphics. Let's +start with the graphic. + +\typebuffer[a] + +As you can see, we pass two arguments to the graphic definition. The first +argument is the name, the second argument is a comma separated list of variables. +This list serves two purposes. First this list is used to create a unique profile +for the graphic. This means that when we change the value of a variable, a new +graphic is generated that reflects the change. A second purpose of the list is to +convert \TEX\ data structures into \METAPOST\ ones, especially dimensions and +colors. The graphic itself is not that spectacular. We use \type {&} because we +don't want smooth connections. + +\typebuffer[b] + +When setting the variables, we used \type {\availablehsize}. We need to use \type +{\noindent}, a rather familiar \TEX\ primitive, that we use here to start a non +indented paragraph, being the graphic. The line correction is needed to get the +spacing around the rule (graphic) right. We pass a blank skip identifier that is +mapped to a convenient medium skip. + +\startbuffer[c] +Why is this called an English line? + +\startnarrower + \EnglishRule + Is it because they cannot draw a straight one? This could be true + after a few strong beers, but then, how do Germans draw a line? + \EnglishRule +\stopnarrower +\stopbuffer + +\typebuffer[c] + +As expected, the rule adapts itself to the current width of the text. The height +of the rule in the middle matches the height of a character with no ascenders and +descenders. + +\getbuffer[c] + +\stopsection + +\startsection[title={Random graphics}] + +\index{randomization} + +\startbuffer[a] +\startuseMPgraphic{fuzzycount} + begingroup + save height, vstep, hsize, span, drift, d, cp ; + height := 3/ 4 * \the \bodyfontsize * \currentfontscale ; + span := 1/ 3 * height ; + drift := 1/10 * height ; + hsize := \the\hsize ; + vstep := \the\lineheight ; + xmax := hsize div 5span ; + pickup pencircle scaled (1/12 * height) ; + def d = (uniformdeviate drift) enddef ; + for i := 1 upto \MPvar{n} : + xpos := ((i-1) mod (5*xmax))*span ; + ypos := ((i-1) div (5*xmax))*vstep ; + draw + if (i mod 5)=0 : ((-d-4.5span,d)--(+d-0.5span,height-d)) + else : ((-d,+d)--(+d,height-d)) fi + shifted (xpos,-ypos+d-drift) ; + endfor; + picture cp ; cp := currentpicture ; + if (ypart ulcorner cp - ypart llcorner cp) <= vstep : + setbounds currentpicture to + (llcorner cp shifted (0,-ypart llcorner cp) -- + lrcorner cp shifted (0,-ypart lrcorner cp) -- + urcorner cp -- ulcorner cp -- cycle) ; + fi + endgroup ; +\stopuseMPgraphic +\stopbuffer + +\startbuffer[b] +\useMPgraphic{fuzzycount}{n=1001} +\stopbuffer + +Given enough time and paper, we can probably give you some + +\startlinecorrection[blank] +\getbuffer[a,b] +\stoplinecorrection + +reasons why \METAPOST\ is fun. To mention a few: you can enhance the layout with +graphic ornaments, you can tune your graphics at runtime, and simple high quality +graphics can be very effective. + +\startbuffer[c] +\startuseMPgraphic{fuzzycount} + begingroup + save height, span, drift, d, cp ; + height := 3/ 5 * \baselinedistance ; + span := 1/ 3 * height ; + drift := 1/10 * height ; + pickup pencircle scaled (1/12 * height) ; + def d = (uniformdeviate drift) enddef ; + for i := 1 upto \MPvar{n} : + draw + if (i mod 5)=0 : ((-d-4.5span,d)--(+d-0.5span,height-d)) + else : ((-d,+d)--(+d,height-d)) fi + shifted (span*i,d-drift) ; + endfor; + picture cp ; cp := currentpicture ; % for readability + setbounds currentpicture to + (llcorner cp shifted (0,-ypart llcorner cp) -- + lrcorner cp shifted (0,-ypart lrcorner cp) -- + urcorner cp -- ulcorner cp -- cycle) ; + endgroup ; +\stopuseMPgraphic +\stopbuffer + +\startbuffer[d] +\setupMPvariables[fuzzycount][n=10] +\stopbuffer + +\getbuffer[c,d] + +The previous graphics draws exactly 1001 lines in a scratch||numbers||in||a||wall +fashion. In 1998, the \NTG\ did a survey among its members, and in the report, we +used this fuzzy counter to enhance the rather dull tables. + +\startbuffer +\starttabulate[|l|c|l|] +\HL +\NC system \NC \% \NC \# users \NC\NR +\HL +\NC Atari \NC 10.4 \NC \useMPgraphic{fuzzycount}{n=11} \NC\NR +\NC MSDOS \NC 49.1 \NC \useMPgraphic{fuzzycount}{n=52} \NC\NR +\NC OS/2 \NC ~9.4 \NC \useMPgraphic{fuzzycount}{n=10} \NC\NR +\NC MacOS \NC ~5.7 \NC \useMPgraphic{fuzzycount}{n= 6} \NC\NR +\NC UNIX \NC 51.9 \NC \useMPgraphic{fuzzycount}{n=55} \NC\NR +\NC WINDOWS \NC 64.2 \NC \useMPgraphic{fuzzycount}{n=68} \NC\NR +\HL +\stoptabulate +\stopbuffer + +\placetable + [here][tab:fuzzy] + {Operating system (n=106).}{\getbuffer} + +\in {Table} [tab:fuzzy] demonstrates how scratch numbers can be used. An +interesting side effect is that when you look long enough to these kind of +graphics, it looks like the lines are no longer horizontal. This table is defined +as follows: + +\typebuffer + +You will notice that we pass a variable to the graphic using a second argument. +We can access this variable with \type {\MPvar}. The graphic is defined as usable +graphic, because we want to generate a unique random one each time. + +\typebuffer[c] + +The core of the macro is the \type {for} loop. Within this loop, we draw groups +of four plus one lines. The draw path's look a bit complicated, but this has to +do with the fact that a \type {mod} returns $0-4$ while we like to deal with +$1-5$. + +The height adapts itself to the height of the line. The bounding box correction +at the end ensures that the baseline is consistent and that the random vertical +offsets fall below the baseline. + +Because we want to be sure that \type {n} has a value, we preset it by saying: + +\typebuffer[d] + +In the table, it makes sense to adapt the drawing to the lineheight, but a more +general solution is to adapt the height to the fontsize. + +\starttyping +height := 3/ 4 * \the \bodyfontsize * \currentfontscale ; +\stoptyping + +\getbuffer[a] + +In the table we called the graphic directly, but how about making it available as +a conversion macro? In \CONTEXT\ this is not that hard: + +\startbuffer +\def\fuzzycount#1{{\tx\useMPgraphic{fuzzycount}{n=#1}}} +\defineconversion[fuzzy][\fuzzycount] +\stopbuffer + +\typebuffer \getbuffer + +Because such a counter should not be that large, we use \type {\tx} to switch to +a smaller font. This also demonstrates how the graphic adapts itself to the font +size. + +We can now use this conversion for instance in an itemize. To save space we use +three columns and no white space between the lines. The \type {2*broad} directive +makes sure that we have enough room for the number. + +\startbuffer +\startitemize[fuzzy,pack,2*broad,columns,three] +\item one \item two \item three +\item four \item five \item six +\item seven \item eight \item nine +\stopitemize +\stopbuffer + +\getbuffer + +\typebuffer + +A careful reader will have noticed that the previous definition of the fuzzy +counter drawing is not suited to generate the graphics we started with. + +\typebuffer[b] + +This time we want to limit the width to the current \type {\hsize}. We only need +to add a few lines of code. Watch how we don't recalculate the bounding box when +more lines are used. + +\typebuffer[a] + +\stopsection + +\startsection[title={Graphic variables}] + +\index{graphics+variables} +\index{variables} + +In the previous sections we have seen that we can pass information to the graphic +by means of variables. How exactly does this mechanism work? + +\startbuffer[def] +\setupMPvariables[smile][type=1,height=1.25ex,color=darkred] + +\startuniqueMPgraphic{smile}{type,height,color} + numeric size ; size := \MPvar{height} ; + drawoptions(withcolor \MPvar{color}) ; + pickup pencircle xscaled (size/6) yscaled (size/12) ; + draw halfcircle rotated -90 scaled size ; + pickup pencircle scaled (size/4) ; + if \MPvar{type}=1 : + for i=-1,+1 : draw origin shifted (0,i*size/4) ; endfor ; + elseif \MPvar{type}=2 : + for i=-1,+1 : draw origin shifted (-size/2,i*size/4) ; endfor ; + pickup pencircle scaled (size/6) ; + draw (size/4,0) -- (-size/4,0) ; + fi ; +\stopuniqueMPgraphic +\stopbuffer + +\startbuffer[sym] +\definesymbol[smile] [\uniqueMPgraphic{smile}{type=1}] +\definesymbol[smilemore][\uniqueMPgraphic{smile}{type=2}] +\stopbuffer + +\startbuffer[exa] +Say it with a \symbol [smile]\ or maybe even a \symbol +[smilemore], although seeing too many \dorecurse {10} +{\symbol [smile]\ } \unskip in one text may make you cry. +\stopbuffer + +\getbuffer[def,sym] + +A nice application of setting up variables for a specific graphic (or class of +graphics) is the following. In an email message the author can express his own or +the readers expected emotions with so called smilies like: \symbol [smile]. If +you want them in print, you can revert to combinations of characters in a font, +but as a \TEX\ user you may want to include nicer graphics. + +A convenient way to implement these is to make them into symbols, one reason +being that in that case they will adapt themselves to the current font size. + +\typebuffer[exa] \getbuffer[exa] + +Because we want an efficient implementation, we will use unique graphics, because +these will only be generated when the circumstances change. + +\typebuffer[sym] + +The definition itself then becomes: + +\typebuffer[def] + +We can now change some characteristics of the smilies without the need to +redefine the graphic. + +\startbuffer[set] +\setupMPvariables[smile][height=1ex,color=darkred] +\stopbuffer + +\typebuffer[set] + +\getbuffer[set,exa] + +In order to keep the smilies unique there is some magic involved, watch the +second argument in the next line: + +\starttyping +\startuniqueMPgraphic{smile}{type,height,color} +\stoptyping + +Because unique graphics often are used in backgrounds, its uniqueness is +determined by the overlay characteristics. In our case however the uniqueness is +determined by the smilies type, height and color. By explicitly specifying these, +we make sure that they count in the creation of the uniqueness stamp. + +\startbuffer[exa] +\midaligned{\switchtobodyfont[60pt]\symbol[smile]} +\stopbuffer + +\typebuffer[exa] + +Because we use the ex||height, the previous call works as expected. + +\startlinecorrection[blank] +\getbuffer[exa] +\stoplinecorrection + +\stopsection + +\startsection[title={Shape libraries}] + +\index{graphics+libraries} + +Unfortunately it takes some effort to define graphics, attach them to an overlay, +and invoke the background. However, the good news is that since in many cases we +want a consistent layout, we only have to do it once. The next table has some +hashed backgrounds. (More information about how to define tables can be found in +the \CONTEXT\ documentation and Up||To||Date documents.) + +\startbuffer +\bTABLE[frame=off,meta:hash:linecolor=darkyellow,offset=3ex] + \bTR + \bTD[background=meta:hash:right] right \eTD + \bTD[background=meta:hash:left] left \eTD + \bTD[background=meta:hash:horizontal] horizontal \eTD + \bTD[background=meta:hash:vertical] vertical \eTD + \eTR +\eTABLE +\stopbuffer + +\getbuffer[shape-a,shape-b,shape-c] + +\placetable + {A hashed table.} + {\getbuffer} + +This table is defined as: + +\typebuffer + +The graphics themselves are defined in a \METAPOST\ module. In this particular +example, the macro \type {some_hash} is defined in the file \type {mp-back.mp}. +This macro takes six arguments: + +\starttyping +some_hash (width, height, linewidth, linecolor, angle, gap) ; +\stoptyping + +Because we don't want to define a specific overlay for each color and linewidth, +we will use variables in the definition of the unique graphic. + +\typebuffer[shape-a] + +These variables are preset using \type {\setupMPvariables}: + +\typebuffer[shape-b] + +The last step in this process is to define the different +alternatives as overlays: + +\typebuffer[shape-c] + +As we can see in the definition of the table, we can pass settings to the \type +{\bTABLE} command. Actually, we can pass such settings to each command that +supports backgrounds, or more precisely \type {\framed}. \in {Table} [tab:hashes] +is for instance defined as: + +\startbuffer +\bTABLE[frame=off,meta:hash:linewidth=.4pt,align=middle,offset=2ex] + \bTR + \bTD[background={meta:hash:left,meta:hash:right}, + meta:hash:linecolor=darkyellow] + left \par \& \par right \eTD + \bTD[background={meta:hash:horizontal,meta:hash:vertical}, + meta:hash:linecolor=darkred] + horizontal \par \& \par vertical \eTD + \eTR +\eTABLE +\stopbuffer + +\typebuffer + +The long names are somewhat cumbersome, but in that way we can prevent name +clashes. Also, since the \METAPOST\ interface is english, the variables are also +english. + +\placetable + [here][tab:hashes] + {A double hashed table.} + {\getbuffer} + +\stopsection + +\startsection[title={Symbol collections}] + +\index{graphics+symbols} +\index{symbols} + +In \CONTEXT, a symbol can be defined without much coding. The advantage of using +symbols is that you can redefine them depending on the situation. So, + +\starttyping +\definesymbol [yes] [\em Yes!] +\stoptyping + +creates a symbol, that lets \type {\symbol[yes]} expand into {\em Yes!} Since +nearly anything can be a symbol, we can also say: + +\starttyping +\definesymbol [yes] [\mathematics{\star}] +\stoptyping + +or even the already defined symbol \symbol[star], by saying: + +\starttyping +\definesymbol [yes] [{\symbol[star]}] +\stoptyping + +It may be clear that we can use a graphic as well: + +\typebuffer[symb-c] + +Since we have collected some nice buttons in a \METAPOST\ file already, we can +use a rather simple definition: + +\typebuffer[symb-a] + +This leaves a few settings: + +\typebuffer[symb-b] + +These symbols are collected in \in {table} [tab:symbols], and are called up with +the \CONTEXT\ commands like \type {\symbol[menu:left]}. If needed, we can collect +these button symbols in a so called symbol set, which permits us to instantly +switch between sets with similar symbols. + +\startbuffer +\bTABLE[frame=off,width=36pt,align=middle] + \bTR \bTD \dontleavehmode \symbol[menu:left] \eTD + \bTD \dontleavehmode \symbol[menu:right] \eTD + \bTD \dontleavehmode \symbol[menu:list] \eTD + \bTD \dontleavehmode \symbol[menu:index] \eTD + \bTD \dontleavehmode \symbol[menu:person] \eTD + \bTD \dontleavehmode \symbol[menu:stop] \eTD + \bTD \dontleavehmode \symbol[menu:info] \eTD + \bTD \dontleavehmode \symbol[menu:down] \eTD + \bTD \dontleavehmode \symbol[menu:up] \eTD + \bTD \dontleavehmode \symbol[menu:print] \eTD \eTR + \bTR \bTD left \eTD + \bTD right \eTD + \bTD list \eTD + \bTD index \eTD + \bTD person \eTD + \bTD stop \eTD + \bTD info \eTD + \bTD down \eTD + \bTD up \eTD + \bTD print \eTD \eTR +\eTABLE +\stopbuffer + +\getbuffer[symb-a,symb-b,symb-c] + +\placetable + [here][tab:symbols] + {A collection of button symbols.} + {\getbuffer} + +\stopsection + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/metafun/metafun-graphics.tex b/doc/context/sources/general/manuals/metafun/metafun-graphics.tex new file mode 100644 index 000000000..79c5df0df --- /dev/null +++ b/doc/context/sources/general/manuals/metafun/metafun-graphics.tex @@ -0,0 +1,21 @@ +% language=uk +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\startcomponent metafun-graphics + +\environment metafun-environment + +\startchapter[title={Example graphics}] + +\startintro + +In this chapter we will show some of the graphics that we made the last few years +using \METAPOST. They give an impression of what kind of non||mathematical +drawings can be made. + +\stopintro + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/metafun/metafun-index.tex b/doc/context/sources/general/manuals/metafun/metafun-index.tex new file mode 100644 index 000000000..8be313d85 --- /dev/null +++ b/doc/context/sources/general/manuals/metafun/metafun-index.tex @@ -0,0 +1,25 @@ +% language=uk +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\startcomponent metafun-index + +\environment metafun-environment + +\startchapter[reference=index,title={Index}] + + \startcolumns + \placeregister[index] + \stopcolumns + +\stopchapter + +% \startchapter[reference=commands,title={Commands}] +% +% \startcolumns +% \placeregister[command] +% \stopcolumns +% +% \stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/metafun/metafun-introduction.tex b/doc/context/sources/general/manuals/metafun/metafun-introduction.tex new file mode 100644 index 000000000..b519055c0 --- /dev/null +++ b/doc/context/sources/general/manuals/metafun/metafun-introduction.tex @@ -0,0 +1,101 @@ +% language=uk +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\startcomponent metafun-introduction + +\environment metafun-environment + +\starttitle[title={Introduction}] + +This document is about \METAPOST\ and \TEX. The former is a graphic programming +language, the latter a typographic programming language. However, in this +document we will not focus on real programming, but more on how we can interface +between those two languages. We will do so by using \CONTEXT, a macro package +written in \TEX, in which support for \METAPOST\ is integrated in the core. The +\TEX\ macros are integrated in \CONTEXT, and the \METAPOST\ macros are bundled in +\METAFUN. + +When Donald Knuth wrote his typographical programming language \TEX\ he was in +need for fonts, especially mathematical fonts. So, as a side track, he started +writing \METAFONT, a graphical language. When you read between the lines in the +\METAFONT\ book and the source code, the name John Hobby is mentioned alongside +complicated formulas. It will be no surprise then, that, since he was tightly +involved in the development of \METAFONT, after a few years his \METAPOST\ showed +up. + +While its ancestor \METAFONT\ was originally targeted at designing fonts, +\METAPOST\ is more oriented to drawing graphics as used in scientific +publications. Since \METAFONT\ produced bitmap output, some of its operators make +use of this fact. \METAPOST\ on the other hand produces \POSTSCRIPT\ code, which +means that it has some features not present in \METAFONT\ and vice versa. + +With \METAFUN\ I will demonstrate that \METAPOST\ can also be used, or misused, +for less technical drawing purposes. We will see that \METAPOST\ can fill in some +gaps in \TEX, especially its lack of graphic capabilities. We will demonstrate +that graphics can make a document more attractive, even if it is processed in a +batch processing system like \TEX. Most of all, we will see that embedding +\METAPOST\ definitions in the \TEX\ source enables a smooth communication between +both programs. + +The best starting point for using \METAPOST\ is the manual written by its author +John Hobby. You can find this manual at every main \TEX\ repository. Also, a copy +of the \METAFONT\ book from Donald Knuth is worth every cent, if only because it +will give you the feeling that many years of graphical fun lays ahead. + +In this \METAFUN\ manual we will demonstrate how you can embed graphics in a +\TEX\ document, but we will also introduce most of the features of \METAPOST. For +this reason you will see a lot of \METAPOST\ code. For sure there are better +methods to solve problems, but I have tried to demonstrate different methods and +techniques as much as possible. + +I started using \METAPOST\ long after I started using \TEX, and I never regret +it. Although I like \TEX\ very much, I must admit that sometimes using \METAPOST\ +is even more fun. Therefore, before we start exploring both in depth, I want to +thank their creators, Donald Knuth and John Hobby, for providing me these +fabulous tools. Of course I also need to thank \THANH, for giving the \TEX\ +community \PDFTEX, as well as providing me the hooks I considered necessary for +implementing some of the features presented here. In the meantime Taco Hoekwater +has created the \METAPOST\ library so that it can be an integral component of +\LUATEX. After that happened, the program was extended to deal with more than one +number implementation: in addition to scaled integers we now can switch to floats +and arbitrary precision decimal or binary calculations. I myself prototyped a +simple but efficient \LUA\ script interface. With Luigi Scarso, who is now the +maintainer of \METAPOST, we keep improving the system, so who knows what will +show up next. + +I also want to thank David Arnold and Ton Otten for their fast proofreading, for +providing me useful input, and for testing the examples. Without David's patience +and help, this document would be far from perfect English and less complete. +Without Ton's help, many small typos would have gone unnoticed. + +In the second version of this manual the content was been adapted to \CONTEXT\ +\MKIV\ that uses \LUATEX\ and the built in \METAPOST\ library. In the meantime +some \LUA\ has been brought into the game, not only to help construct graphics, +but also as a communication channel. In the process some extra features have been +added and some interfacing has been upgraded. The third version of this document +deals with that too. It makes no sense to maintain compatibility with \CONTEXT\ +\MKII, but many examples can be used there as well. In the meantime most +\CONTEXT\ users have switched to \MKIV, so this is no real issue. In the fourth +update some new features are presented and the discussion of obsolete ones have +been removed. + +The fifth update describes the \MPIV\ version of \METAFUN\ which brings some more +and improved functionality. Some examples are inspired from questions by users and +examples that Alan Braslau, Luigi Scarso and I made when testing new features and +macros. Some examples can be rewritten in a more efficient way but are kept as +they are. Therefore this manual presents different ways to solve problems. +Hopefully this is not too confusing. Numerous examples can be found in the other +manuals and test suite. + +\blank[big,samepage] + +\startlines +Hans Hagen +Hasselt NL +\currentdate[month,year] +\stoplines + +\stoptitle + +\stopcomponent diff --git a/doc/context/sources/general/manuals/metafun/metafun-layout.tex b/doc/context/sources/general/manuals/metafun/metafun-layout.tex new file mode 100644 index 000000000..2be7e19ff --- /dev/null +++ b/doc/context/sources/general/manuals/metafun/metafun-layout.tex @@ -0,0 +1,990 @@ +% language=uk +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\startcomponent metafun-layout + +\environment metafun-environment + +\startchapter[title={Enhancing the layout}] + +\startintro + +One of the most powerful and flexible commands of \CONTEXT\ is \type {\framed}. +We can use the background features of this command to invoke and position +graphics that adapt themselves to the current situation. Once understood, +overlays will become a natural part of the \CONTEXT\ users toolkit. + +\stopintro + +\startsection[title={Overlays}] + +\index{overlays} + +Many \CONTEXT\ commands support overlays. The term {\em overlay} is a bit +confusing, since such an overlay in most cases will lay under the text. However, +because there can be many layers on top of each other, the term suits its +purpose. + +When we want to put a \METAPOST\ graphic under some text, we go through a three +step process. First we define the graphic itself: + +\startbuffer +\startuniqueMPgraphic{demo circle} + path p ; + p := fullcircle xscaled \overlaywidth yscaled \overlayheight ; + fill p withcolor .85white ; + draw p withpen pencircle scaled 2pt withcolor .625red ; +\stopuniqueMPgraphic +\stopbuffer + +\typebuffer + +\getbuffer + +This graphic will adapt itself to the width and height of the overlay. Both \type +{\overlaywidth} and \type {\overlayheight} are macros that return a dimension +followed by a space. The next step is to register this graphic as an overlay. + +\startbuffer +\defineoverlay[demo circle][\uniqueMPgraphic{demo circle}] +\stopbuffer + +\typebuffer + +\getbuffer + +We can now use this overlay in any command that provides the \type {\framed} +functionality. Since this graphic is defined as unique, \CONTEXT\ will try to +reuse already calculated and embedded graphics when possible. + +\startbuffer +\framed[background=demo circle]{This text is overlayed.} +\stopbuffer + +\typebuffer + +The background can be set to \type {color}, \type {screen}, an overlay +identifier, like \typ {demo circle}, or a comma separated list of those. + +\startlinecorrection[blank] +\getbuffer +\stoplinecorrection + +The \type {\framed} command automatically draws a ruled box, which can be quite +useful when debugging a graphic. However, in this case we want to turn the frame +off. + +\startbuffer +\framed + [background=demo circle,frame=off] + {This text is overlayed.} +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] +\getbuffer +\stoplinecorrection + +In this case, it would have made sense to either set the \type {offset} to a +larger value, or to set \type {backgroundoffset}. In the latter case, the ellipse +is positioned outside the frame. + +The difference between the three offsets \type {offset}, \type {frameoffset} and +\type {backgroundoffset} is demonstrated in \in {figure} [fig:offsets]. While the +\type {offset} is added to the (natural or specified) dimensions of the content +of the box, the other two are applied to the frame and background and don't add +to the dimensions. + +In the first row we only set the \type {offset}, while in the second row, the +(text) offset is set to \type {3pt}. When not specified, the \type {offset} has a +comfortable default value of \type {.25ex} (some 25\% of the height of an~x). + +\startbuffer +\setupframed + [width=.3\textwidth, + background=demo circle] +\startcombination[3*3] + {\framed[offset=none] {\TeX}} {\tt offset=none} + {\framed[offset=overlay] {\TeX}} {\tt offset=overlay} + {\framed[offset=0pt] {\TeX}} {\tt offset=0pt} + {\framed[offset=1pt] {\TeX}} {\tt offset=1pt} + {\framed[offset=2pt] {\TeX}} {\tt offset=2pt} + {\framed[offset=4pt] {\TeX}} {\tt offset=4pt} + {\framed[offset=3pt] {\TeX}} {\tt offset=3pt} + {\framed[frameoffset=3pt] {\TeX}} {\tt frameoffset=3pt} + {\framed[backgroundoffset=3pt]{\TeX}} {\tt backgroundoffset=3pt} +\stopcombination +\stopbuffer + +\typebuffer + +\placefigure + [here][fig:offsets] + {The three offsets.} + {\getbuffer} + +As the first row in \in {figure} [fig:offsets] demonstrates, instead of a value, +one can pass a keyword. The \type {overlay} keyword implies that there is no +offset at all and that the lines cover the content. With \type {none} the frame +is drawn tight around the content. When the offset is set to \type {0pt} or more, +the text is automatically set to at least the height of a line. You can turn this +feature off by saying \type {strut=off}. More details can be found in the +\CONTEXT\ manual. + +In \in {figure} [fig:all offsets] we have set {offset} to \type {3pt}, \type +{frameoffset} to \type {6pt} and \type {backgroundoffset} to \type {9pt}. Both +the frame and background offset are sort of imaginary, since they don't +contribute to the size of the box. + +\startbuffer +\ruledhbox + {\framed + [offset=3pt,frameoffset=6pt,backgroundoffset=9pt, + background=screen,backgroundscreen=.85] + {Welcome in the hall of frame!}} +\stopbuffer + +\typebuffer + +\placefigure + [here][fig:all offsets] + {The three offsets.} + {\getbuffer} + +\stopsection + +\startsection[title={Overlay variables}] + +The communication between \TEX\ and embedded \METAPOST\ graphics takes place by +means of some macros. + +\starttabulate[|l|p|] +\HL +\NC overlay status macro \NC meaning \NC \NR +\HL +\NC \tex {overlaywidth} \NC the width of the graphic, as + calculated from the actual + width and background offset \NC \NR +\NC \tex {overlayheight} \NC the height of the graphic, as + calculated from the actual + height, depth and background + offset \NC \NR +\NC \tex {overlaydepth} \NC the depth of the graphic, if + available \NC \NR +\NC \tex {overlaycolor} \NC the background color, if given \NC \NR +\NC \tex {overlaylinecolor} \NC the color of the frame \NC \NR +\NC \tex {overlaylinewidth} \NC the width of the frame \NC \NR +\HL +\stoptabulate + +The dimensions of the overlay are determined by dimensions of the background, +which normally is the natural size of a \type {\framed}. When a background offset +is specified, it is added to \type {overlayheight} and \type {overlaywidth}. + +Colors can be converted by \type {\MPcolor} and in addition to the macros +mentioned, you can use all macros that expand into a dimension or dimen register +prefixed by the \TEX\ primitive \type {\the} (this and other primitives are +explained in \quotation {The \TeX book}, by Donald Knuth). + +\stopsection + +\startsection[title={Stacking overlays}] + +A background can be a gray scale (\type {screen}), a color (\type {color}), a +previously defined overlay identifier, or any combination of these. The next +assignments are therefore valid: + +\starttyping +\framed[background=color,backgroundcolor=red]{...} +\framed[background=screen,backgroundscreen=.8]{...} +\framed[background=circle]{...} +\framed[background={color,cow},backgroundcolor=red]{...} +\framed[background={color,cow,grid},backgroundcolor=red]{...} +\stoptyping + +In the last three cases of course you have to define \type {circle}, \type {cow} +and \type {grid} as overlay. These items are packed in a comma separated list, +which has to be surrounded by \type {{}}. + +\stopsection + +\startsection[title={Foregrounds}] + +\startbuffer[a] +\startuniqueMPgraphic{backfore} + draw fullcircle + xscaled \overlaywidth yscaled \overlayheight + withpen pencircle scaled 2pt + withcolor .625yellow ; +\stopuniqueMPgraphic + +\defineoverlay[backfore][\uniqueMPgraphic{backfore}] +\stopbuffer + +\startbuffer[b] +\framed + [background=backfore,backgroundoffset=4pt] + {one, two, three, \unknown} +\stopbuffer + +\startbuffer[c] +\framed + [background={foreground,backfore},backgroundoffset=4pt] + {one, two, three, \unknown} +\stopbuffer + +The overlay system is actually a system of layers. Sometimes we are confronted +with a situation in which we want the text behind another layer. This can be +achieved by explicitly placing the foreground layer, as in \in {figure} +[fig:foreground]. + +\getbuffer[a] + +\placefigure + [here][fig:foreground] + {Foreground material moved backwards.} + {\setupframed[linewidth=1pt]% + \startcombination + {\getbuffer[b]} {frame on top layer} + {\getbuffer[c]} {frame on bottom layer} + \stopcombination} + +The graphic layer is defined as follows: + +\typebuffer[a] + +The two framed texts have a slightly different definition. The leftmost graphic +is defined as: + +\typebuffer[b] + +The rightmost graphic is specified as: + +\typebuffer[c] + +The current values of the frame color and frame width are passed to the overlay. +It often makes more sense to use colors defined at the document level, if only to +force consistency. + +\startbuffer +\startuniqueMPgraphic{super ellipse} + path p ; p := unitsquare + xscaled \overlaywidth yscaled \overlayheight + superellipsed .85 ; + pickup pencircle scaled \overlaylinewidth ; + fill p withcolor \MPcolor{\overlaycolor} ; + draw p withcolor \MPcolor{\overlaylinecolor} ; +\stopuniqueMPgraphic + +\defineoverlay[super ellipse][\uniqueMPgraphic{super ellipse}] +\stopbuffer + +\typebuffer \getbuffer + +This background demonstrates that a super ellipse is rather well suited as frame. + +\startbuffer +\framed + [background=super ellipse, + frame=off, + width=3cm, + align=middle, + framecolor=darkyellow, + rulethickness=2pt, + backgroundcolor=darkgray] + {\white This is a\\Super Ellipsed\\sentence.} +\stopbuffer + +\typebuffer + +Such a super ellipse looks quite nice and is a good candidate for backgrounds, +for which the superness should be at least~.85. + +\startlinecorrection[blank] +\getbuffer +\stoplinecorrection + +\stopsection + +\startsection[title={Typesetting graphics}] + +I have run into people who consider it kind of strange when you want to use \TEX\ +for non||mathematical typesetting. If you agree with them, you may skip this +section with your eyes closed. + +One of the \CONTEXT\ presentation styles (number 15, tagged as balls) stepwise +builds screens full of sentences, quotes or concepts, packages in balloons and +typesets them as a paragraph. We will demonstrate that \TEX\ can typeset graphics +using the following statement. + +% \let\processword\relax + +\startbuffer[lions] +\processwords{As you may know, \TEX's ambassador is a lion, while {\METAFONT} +is represented by a lioness. It is still unclear if they have a relationship, +but if so, and if a cub is born, may it enjoy \METAFUN.} +\stopbuffer + +\startquotation +\def\processwords#1{#1}\getbuffer[lions] +\stopquotation + +The low level \CONTEXT\ macro \type {\processwords} provides a mechanism to treat +the individual words of its argument. The macro is called as follows: + +\typebuffer[lions] + +In order to perform a task, you should also define a macro \type {\processword}, +which takes one argument. The previous quote was typeset with the following +definition in place: + +\starttyping +\def\processword#1{#1} +\stoptyping + +A slightly more complicated definition is the following: + +\startbuffer +\def\processword#1{\noindent\framed{#1}\space} +\stopbuffer + +\typebuffer \getbuffer + +We now get: + +\blank\getbuffer[lions]\blank + +If we can use \type {\framed}, we can also use backgrounds. + +\startbuffer +\def\processword#1% + {\noindent\framed[frame=off,background=lions]{#1} } +\stopbuffer + +\typebuffer \getbuffer + +We can add a supperellipsed frame using the following definition: + +\startbuffer +\startuniqueMPgraphic{lions a} + path p ; p := fullsquare + xyscaled (\overlaywidth,\overlayheight) superellipsed .85 ; + pickup pencircle scaled 1pt ; + fill p withcolor .850white ; draw p withcolor .625yellow ; +\stopuniqueMPgraphic + +\defineoverlay[lions][\uniqueMPgraphic{lions a}] +\stopbuffer + +\typebuffer \getbuffer + +\bgroup \blank \veryraggedright\getbuffer[lions]\unskip \blank \egroup + +\startbuffer +\startuseMPgraphic{lions b} + path p ; p := fullsquare + xyscaled (\overlaywidth,\overlayheight) randomized 5pt ; + pickup pencircle scaled 1pt ; + fill p withcolor .850white ; draw p withcolor .625yellow ; +\stopuseMPgraphic + +\defineoverlay[lions][\uniqueMPgraphic{lions b}] +\stopbuffer + +\typebuffer \getbuffer + +\bgroup \blank \veryraggedcenter\getbuffer[lions]\unskip \blank \egroup + +\startbuffer +\startuniqueMPgraphic{lions c} + path p ; p := fullsquare + xyscaled (\overlaywidth,\overlayheight) squeezed 2pt ; + pickup pencircle scaled 1pt ; + fill p withcolor .850white ; draw p withcolor .625yellow ; +\stopuniqueMPgraphic + +\defineoverlay[lions][\uniqueMPgraphic{lions c}] +\stopbuffer + +\typebuffer \getbuffer + +\bgroup \blank \veryraggedleft\getbuffer[lions]\unskip \blank \egroup + +These paragraphs were typeset with the following settings. + +\starttyping +\setupalign[broad, right] % == \veryraggedright +\setupalign[broad, middle] % == \veryraggedcenter +\setupalign[broad, left] % == \veryraggedleft +\stoptyping + +The \type {broad} increases the raggedness. We defined three different graphics +(a, b and c) because we want some to be unique, which saves some processing. Of +course we don't reuse the random graphics. In the definition of \type +{\processword} we have to use \type {\noindent} because otherwise \TEX\ will put +each graphic on a line of its own. Watch the space at the end of the macro. + +\stopsection + +\startsection[title={Graphics and macros}] + +Because \TEX's typographic engine and \METAPOST's graphic engine are separated, +interfacing between them is not as natural as you may expect. In \CONTEXT\ we +have tried to integrate them as much as possible, but using the interface is not +always as convenient as it should be. What method you follow, depends on the +problem at hand. + +The official \METAPOST\ way to embed \TEX\ code into graphics is to use \typ +{btex ... etex}. As soon as \CONTEXT\ writes the graphic data to the intermediate +\METAPOST\ file, it looks for these commands. When it has encountered an \type +{etex}, \CONTEXT\ will make sure that the text that is to be typeset by \TEX\ is +{\em not} expanded. This is what you may expect, because when you would embed +those commands in a stand||alone graphic, they would also not be expanded, if +only because \METAPOST\ does not know \TEX. With expansion we mean that \TEX\ +commands are replaced by their meaning (which can be quite extensive). + +{\em Users of \CONTEXT\ MKIV\ can skip the next paragraph}. + +When \METAPOST\ sees a \type {btex} command, it will consult a so called \type +{mpx} file. This file holds the \METAPOST\ representation of the text typeset by +\TEX. Before \METAPOST\ processes a graphic definition file, it first calls +another program that filters the \type {btex} commands from the source file, and +generates a \TEX\ file from them. This file is then processed by \TEX, and after +that converted to a \type {mpx} file. In \CONTEXT\ we let \TEXEXEC\ take care of +this whole process. + +Because the \typ {btex ... etex} commands are filtered from the raw \METAPOST\ +source code, they cannot be part of macro definitions and loop constructs. When +used that way, only one instance would be found, while in practice multiple +instances may occur. + +This drawback is overcome by \METAFUN's \type {textext} command. This command +still uses \typ {btex ... etex} but writes these commands to a separate job +related file each time it is used. \footnote {It took the author a while to find +out that there is a \METAPOST\ module called \type {tex.mp} that provides a +similar feature, but with the disadvantage that each text results in a call to +\TEX. Each text goes into a temporary file, which is then included and results in +\METAPOST\ triggering \TEX.} After the first \METAPOST\ run, this file is merged +with the original file, and \METAPOST\ is called again. So, at the cost of an +additional run, we can use text typeset by \TEX\ in a more versatile way. Because +\METAPOST\ runs are much faster than \TEX\ runs, the price to pay in terms of run +time is acceptable. Unlike \typ {btex ... etex}, the \TEX\ code in \type +{textext} command is expanded, but as long as \CONTEXT\ is used this is seldom a +problem, because most commands are somewhat protected. + +If we define a graphic with text to be typeset by \TEX, there is a good chance +that this text is not frozen but passes as argument. A \TEX||like solution for +passing arbitrary content to such a graphic is the following: \footnote {The \type +{\unexpanded} prefix makes the command robust for being passed as argument. It is not +to be confused with the primitive. We had this feature already when the primitive +showed up and it was considered to be inconvenient for other macro packages to adapt to +the \CONTEXT\ situation. So keep that in mind when you mix macro packages.} + +\startbuffer[def] +\unexpanded\def\RotatedText#1#2% + {\startuseMPgraphic{RotatedText} + draw btex #2 etex rotated #1 ; + \stopuseMPgraphic + \useMPgraphic{RotatedText}} +\stopbuffer + +\typebuffer[def] \getbuffer[def] + +This macro takes two arguments (the \type {#} identifies an +argument): + +\startbuffer[exa] +\RotatedText{15}{Some Rotated Text} +\stopbuffer + +\typebuffer[exa] + +The text is rotated over 15 degrees about the origin in a counterclockwise +direction. + +\startlinecorrection[blank] +\getbuffer[exa] +\stoplinecorrection + +In \CONTEXT\ we seldom pass settings like the angle of rotation in this manner. +You can use \type {\setupMPvariables} to set up graphic||specific variables. Such +a variable can be accessed with \type {\MPvar}. + +\startbuffer[def] +\setupMPvariables[RotatedText][rotation=90] + +\startuseMPgraphic{RotatedText} + draw textext{Some Text} rotated \MPvar{rotation} ; +\stopuseMPgraphic +\stopbuffer + +\typebuffer[def] \getbuffer[def] + +An example: + +\startbuffer[exa] +\RotatedText{-15}{Some Rotated Text} +\stopbuffer + +\typebuffer[exa] + +\startlinecorrection[blank] +\getbuffer[exa] +\stoplinecorrection + +In a similar fashion we can isolate the text. This permits us to use the same +graphics with different settings. + +\startbuffer[def] +\setupMPvariables[RotatedText][rotation=270] + +\setMPtext{RotatedText}{Some Text} + +\startuseMPgraphic{RotatedText} + draw \MPbetex{RotatedText} rotated \MPvar{rotation} ; +\stopuseMPgraphic +\stopbuffer + +\typebuffer[def] \getbuffer[def] + +This works as expected: + +\startbuffer[exa] +\RotatedText{165}{Some Rotated Text} +\stopbuffer + +\typebuffer[exa] + +\startlinecorrection[blank] +\getbuffer[exa] +\stoplinecorrection + +It is now a small step towards an encapsulating macro (we assume that you are +familiar with \TEX\ macro definitions). + +\startbuffer[def] +\def\RotatedText[#1]#2% + {\setupMPvariables[RotatedText][#1]% + \setMPtext{RotatedText}{#2}% + \useMPgraphic{RotatedText}} + +\setupMPvariables[RotatedText][rotation=90] + +\startuseMPgraphic{RotatedText} + draw \MPbetex{RotatedText} rotated \MPvar{rotation} ; +\stopuseMPgraphic +\stopbuffer + +\typebuffer[def] \getbuffer[def] + +Again, we default to a 90 degrees rotation, and pass both the settings and text +in an indirect way. This method permits you to build complicated graphics and +still keep macros readable. + +\startbuffer[exa] +\RotatedText[rotation=240]{Some Rotated Text} +\stopbuffer + +\typebuffer[exa] + +\startlinecorrection[blank] +\getbuffer[exa] +\stoplinecorrection + +You may wonder why we don't use the variable mechanism to pass the text. The main +reason is that the text mechanism offers a few more features, one of which is +that it passes the text straight on, without the danger of unwanted expansion of +embedded macros. Using \type {\setMPtext} also permits you to separate \TEX\ and +\METAPOST\ code and reuse it multiple times (imagine using the same graphic in a +section head command). + +There are three ways to access a text defined with \type {\setMPtext}. Imagine +that we have the following definitions: + +\startbuffer +\setMPtext {1} {Now is this \TeX\ or not?} +\setMPtext {2} {See what happens here.} +\setMPtext {3} {Text streams become pictures.} +\stopbuffer + +\typebuffer \getbuffer + +The \type {\MPbetex} macro returns a \typ {btex ... etex} construct. The \type +{\MPstring} returns the text as a \METAPOST\ string, between quotes. The raw text +can be fetched with \type {\MPtext}. + +\startbuffer +\startMPcode + picture p ; p := \MPbetex {1} ; + picture q ; q := textext( \MPstring{2} ) ; + picture r ; r := thelabel("\MPtext {3}",origin) ; + + for i=p, boundingbox p : draw i withcolor .625red ; endfor ; + for i=q, boundingbox q : draw i withcolor .625yellow ; endfor ; + for i=r, boundingbox r : draw i withcolor .625white ; endfor ; + + currentpicture := currentpicture scaled 2 ; + draw origin + withpen pencircle scaled 5.0mm withcolor white ; + draw origin + withpen pencircle scaled 2.5mm withcolor black ; + draw boundingbox currentpicture + withpen pencircle scaled .1mm + dashed evenly ; +\stopMPcode +\stopbuffer + +\typebuffer + +The first two lines return text typeset by \TEX, while the last line leaves this +to \METAPOST. + +\startlinecorrection[blank] +\getbuffer +\stoplinecorrection + +If you watch closely, you will notice that the first (red) alternative is +positioned with the baseline on the origin. + +\startbuffer +\startMPcode + picture p ; p := \MPbetex {1} ; + picture q ; q := textext.origin( \MPstring{2} ) ; + picture r ; r := thelabel.origin("\MPtext {3}",origin) ; + + for i=p, boundingbox p : draw i withcolor .625red ; endfor ; + for i=q, boundingbox q : draw i withcolor .625yellow ; endfor ; + for i=r, boundingbox r : draw i withcolor .625white ; endfor ; + + currentpicture := currentpicture scaled 2 ; + draw origin withpen pencircle scaled 5.0mm + withcolor white ; + draw origin withpen pencircle scaled 2.5mm + withcolor black ; + draw boundingbox currentpicture + withpen pencircle scaled .1mm + dashed evenly ; +\stopMPcode +\stopbuffer + +\typebuffer + +This draws: + +\startlinecorrection[blank] +\getbuffer +\stoplinecorrection + +This picture demonstrates that we can also position \type {textext}'s and \type +{label}'s on the baseline. For this purpose the repertoire of positioning +directives (\type {top}, \type {lft}, etc.) is extended with an \type {origin} +directive. Another extra positioning directive is \type {raw}. This one does not +do any positioning at all. + +\starttyping +picture q ; q := textext.origin( \MPstring{2} ) ; +picture r ; r := thelabel.origin("\MPtext {3}",origin) ; +\stoptyping + +We will now apply this knowledge of text inclusion in graphics to a more advanced +example. The next definitions are the answer to a question on the \CONTEXT\ +mailinglist with regards to framed texts with titles. + +\startbuffer[a] +\defineoverlay[FunnyFrame][\useMPgraphic{FunnyFrame}] + +\defineframedtext[FunnyText][frame=off,background=FunnyFrame] + +\def\StartFrame{\startFunnyText} +\def\StopFrame {\stopFunnyText } + +\def\FrameTitle#1% + {\setMPtext{FunnyFrame}{\hbox spread 1em{\hss\strut#1\hss}}} + +\setMPtext{FunnyFrame}{} % initialize the text variable +\stopbuffer + +\startbuffer[b] +\startuseMPgraphic{FunnyFrame} + picture p ; numeric w, h, o ; + p := textext.rt(\MPstring{FunnyFrame}) ; + w := OverlayWidth ; h := OverlayHeight ; o := BodyFontSize ; + p := p shifted (2o,h-ypart center p) ; draw p ; + drawoptions (withpen pencircle scaled 1pt withcolor .625red) ; + draw (2o,h)--(0,h)--(0,0)--(w,0)--(w,h)--(xpart urcorner p,h) ; + draw boundingbox p ; + setbounds currentpicture to unitsquare xyscaled(w,h) ; +\stopuseMPgraphic +\stopbuffer + +\startbuffer[c1] +\FrameTitle{Zapf (1)} + +\StartFrame +Coming back to the use of typefaces in electronic +publishing: many of the new typographers receive their +knowledge and information about the rules of typography from +books, from computer magazines or the instruction manuals +which they get with the purchase of a PC or software. +\StopFrame +\stopbuffer + +\getbuffer[a,b,c1] + +In this example, the title is positioned on top of the frame. Title and text are +entered as: + +\typebuffer[c1] + +The implementation is not that complicated and uses the frame commands that are +built in \CONTEXT. Instead of letting \TEX\ draw the frame, we use \METAPOST, +which we also use for handling the title. The graphic is defined as follows: + +\typebuffer[b] + +Because the framed title is partly positioned outside the main frame, and because +the main frame will be combined with the text, we need to set the boundingbox +explicitly. This is a way to create so called free figures, where part of the +figure lays beyond the area that is taken into account when positioning the +graphic. The shift + +\starttyping +... shifted (2o,h-ypart center p) +\stoptyping + +ensures that the title is vertically centered over the top line of the main box. + +The macros that use this graphic combine some techniques of defining macros, +using predefined \CONTEXT\ classes, and passing information to graphics. + +\typebuffer[a] + +There is a little bit of low level \TEX\ code involved, like a horizontal box +(\type {\hbox}) that stretches one em||space beyond its natural size (\type +{spread 1em}) with a centered text (two times \type {\hss}). Instead of applying +this spread, we could have enlarged the frame on both sides. + +\startbuffer[b] +\startuseMPgraphic{FunnyFrame} + picture p ; numeric o ; path a, b ; pair c ; + p := textext.rt(\MPstring{FunnyFrame}) ; + a := unitsquare xyscaled(OverlayWidth,OverlayHeight) ; + o := BodyFontSize ; + p := p shifted (2o,OverlayHeight-ypart center p) ; + drawoptions (withpen pencircle scaled 1pt withcolor .625red) ; + b := a randomized (o/2) ; + fill b withcolor .85white ; draw b ; + b := (boundingbox p) randomized (o/8) ; + fill b withcolor .85white ; draw b ; + draw p withcolor black; + setbounds currentpicture to a ; + \stopuseMPgraphic +\stopbuffer + +In the previous graphic we calculated the big rectangle taking the small one into +account. This was needed because we don't use a background fill. The next +definition does, so there we can use a more straightforward approach by just +drawing (and filling) the small rectangle on top of the big one. + +\typebuffer[b] \getbuffer[b] + +\startbuffer[c2] +\FrameTitle{Zapf (2)} + +\StartFrame +There is not so much basic instruction, as of now, as there +was in the old days, showing the differences between good +and bad typographic design. +\StopFrame +\stopbuffer + +\getbuffer[c2] + +Because we use a random graphic, we cannot guarantee beforehand that the left and +right edges of the small shape touch the horizontal lines in a nice way. The next +alternative displaces the small shape plus text so that its center lays on the +line. On the average, this looks better. + +\startbuffer[b] +\startuseMPgraphic{FunnyFrame} + picture p ; numeric o ; path a, b ; pair c ; + p := textext.rt(\MPstring{FunnyFrame}) ; + a := unitsquare xyscaled(OverlayWidth,OverlayHeight) ; + o := BodyFontSize ; + p := p shifted (2o,OverlayHeight-ypart center p) ; + drawoptions (withpen pencircle scaled 1pt withcolor .625red) ; + b := a randomized (o/2) ; + fill b withcolor .85white ; draw b ; + c := center p ; + c := b intersectionpoint (c shifted (0,-o)--c shifted(0,o)) ; + p := p shifted (c-center p) ; + b := (boundingbox p) randomized (o/8) ; + fill b withcolor .85white ; draw b ; + draw p withcolor black; + setbounds currentpicture to a ; + \stopuseMPgraphic +\stopbuffer + +\typebuffer[b] \getbuffer[b] + +\getbuffer[c2] + +Yet another definition uses super ellipsed shapes instead of random ones. We need +a high degree of superness (.95) in order to make sure that the curves don't +touch the texts. + +\startbuffer[b] +\startuseMPgraphic{FunnyFrame} + picture p ; numeric o ; path a, b ; pair c ; + p := textext.rt(\MPstring{FunnyFrame}) ; + o := BodyFontSize ; + a := unitsquare xyscaled(OverlayWidth,OverlayHeight) ; + p := p shifted (2o,OverlayHeight-ypart center p) ; + drawoptions (withpen pencircle scaled 1pt withcolor .625red) ; + b := a superellipsed .95 ; + fill b withcolor .85white ; draw b ; + b := (boundingbox p) superellipsed .95 ; + fill b withcolor .85white ; draw b ; + draw p withcolor black ; + setbounds currentpicture to a ; +\stopuseMPgraphic +\stopbuffer + +\typebuffer[b] \getbuffer[b] + +\startbuffer[c3] +\FrameTitle{Zapf (3)} + +\StartFrame +Many people are just fascinated by their PC's tricks, and +think that a widely||praised program, called up on the +screen, will make everything automatic from now on. +\StopFrame +\stopbuffer + +\getbuffer[c3] + +There are quite some hard coded values in these graphics, like the linewidths, +offsets and colors. Some of these can be fetched from the \type {\framed} +environment either by using \TEX\ macros or dimensions, or by using their +\METAFUN\ counterparts. In the following table we summarize both the available +\METAPOST\ variables and their \TEX\ counterparts. They may be used +interchangeably. + +\starttabulate[|l|Tl|l|] +\HL +\NC \bf \METAPOST\ variable \NC \rm \bf \TEX\ command \NC \bf meaning \NC\NR +\HL +\NC OverlayWidth \NC \string\overlaywidth + \NC current width \NC\NR +\NC OverlayHeight \NC \string\overlayheight + \NC current height \NC\NR +\NC OverlayDepth \NC \string\overlayheight + \NC current depth (often zero) \NC\NR +\NC OverlayColor \NC \string\MPcolor\string{\string\overlaycolor\string} + \NC background color \NC\NR +\NC OverlayLineWidth \NC \string\overlaylinewidth + \NC width of the frame \NC\NR +\NC OverlayLineColor \NC \string\MPcolor\string{\overlaylinecolor\string} + \NC color of the frame \NC\NR +\NC BaseLineSkip \NC \string\the\string\baselineskip + \NC main line distance \NC\NR +\NC LineHeight \NC \string\the\string\baselineskip + \NC idem \NC\NR +\NC BodyFontSize \NC \string\the\string\bodyfontsize + \NC font size of the running text \NC\NR +\NC StrutHeight \NC \string\strutheight + \NC space above the baseline \NC\NR +\NC StrutDepth \NC \string\strutdepth + \NC space below the baseline \NC\NR +\NC ExHeight \NC 1ex + \NC height of an x \NC \NR +\NC EmWidth \NC 1em + \NC width of an m-dash \NC \NR +\HL +\stoptabulate + +\startbuffer[b] +\startuseMPgraphic{FunnyFrame} + picture p ; numeric o ; path a, b ; pair c ; + p := textext.rt(\MPstring{FunnyFrame}) ; + o := BodyFontSize ; + a := unitsquare xyscaled(OverlayWidth,OverlayHeight) ; + p := p shifted (2o,OverlayHeight-ypart center p) ; + pickup pencircle scaled OverlayLineWidth ; + b := a superellipsed .95 ; + fill b withcolor OverlayColor ; + draw b withcolor OverlayLineColor ; + b := (boundingbox p) superellipsed .95 ; + fill b withcolor OverlayColor ; + draw b withcolor OverlayLineColor ; + draw p withcolor black ; + setbounds currentpicture to a ; +\stopuseMPgraphic +\stopbuffer + +\typebuffer[b] \getbuffer[b] + +\startbuffer[d] +\setupframedtexts + [FunnyText] + [backgroundcolor=lightgray, + framecolor=darkred, + rulethickness=2pt, + offset=\bodyfontsize, + before={\blank[big,medium]}, + after={\blank[big]}, + width=\textwidth] +\stopbuffer + +\getbuffer[d,c3] + +We used the following command to pass the settings: + +\typebuffer[d] + +In a real implementation, we should also take care of some additional spacing +before the text, which is why we have added more space before than after the +framed text. + +We demonstrated that when defining graphics that are part of the layout, you need +to have access to information known to the typesetting engine. Take \in {figure} +[fig:penalty]. The line height needs to match the font and the two thin +horizontal lines should match the {\em x}||height. We also need to position the +baseline, being the lowest one of a pair of lines, in such a way that it suits +the proportions of the line as specified by the strut. A strut is an imaginary +large character with no width. You should be aware of the fact that while \TEX\ +works its way top||down, in \METAPOST\ the origin is in the lower left corner. + +\startmode[screen] + +\placefigure + [page][fig:penalty] + {Penalty lines.} + {\typesetfile[mfun-902.tex][page=1,frame=on,height=.85\textheight]} + +\stopmode + +\startnotmode[screen] + +\placefigure + [here][fig:penalty] + {Penalty lines.} + {\typesetfile[mfun-902.tex][page=1,frame=on,height=.50\textheight]} + +\stopnotmode + +\typebuffer[handwrit] + +This code demonstrates the use of \type {LineHeight}, \type {ExHeight}, \type +{StrutHeight} and \type {StrutDepth}. We set the interline spacing to 1.5 so that +we get a bit more loose layout. The variables mentioned are set each time a +graphic is processed and thereby match the current font settings. + +\stopsection + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/metafun/metafun-lua.tex b/doc/context/sources/general/manuals/metafun/metafun-lua.tex new file mode 100644 index 000000000..da35cccde --- /dev/null +++ b/doc/context/sources/general/manuals/metafun/metafun-lua.tex @@ -0,0 +1,1060 @@ +% language=uk +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +% this is an extension of about-lua + +\startcomponent mfun-lua + +\environment metafun-environment + +\startchapter[title={Lua}] + +\index{\LUA} + +\startintro + +Already for some years I have been wondering how it would be if we could escape +to \LUA\ inside \METAPOST, or in practice, use \MPLIB\ in \LUATEX. The idea is +simple: embed \LUA\ code in a \METAPOST\ file that gets run as soon as it's seen. +In case you wonder why \LUA\ code makes sense, imagine generating graphics using +external data. The capabilities of \LUA\ to deal with that is more flexible and +advanced than in \METAPOST. Of course we could generate a \METAPOST\ definition +of a graphic from data but often it makes more sense to do the reverse. I finally +found time and reason to look into this and in the following sections I will +describe how it's done. + +\stopintro + +\startsection[title=Introduction] + +\stopsection + +\startsection[title=The basics] + +The approach is comparable to \LUATEX's \type {\directlua}. That primitive can be +used to execute \LUA\ code and in combination with \type {tex.print} we can pipe +back strings into the \TEX\ input stream. There a complication is that that we +have to be able to operate under different so called catcode regimes: the meaning +of characters can differ per regime. We also have to deal with line endings in +special ways as they relate to paragraphs and such. In \METAPOST\ we don't have +that complication so getting back input into the \METAPOST\ input, we can do so +with simple strings. For that a mechanism similar to \type {scantokens} can be +used. That way we can return anything (including nothing) as long as \METAPOST\ +can interpret it and as long as it fulfils the expectations. + +\starttyping +numeric n ; n := scantokens("123.456") ; +\stoptyping + +A script is run as follows: + +\starttyping +numeric n ; n := runscript("return '123.456'") ; +\stoptyping + +This primitive doesn't have the word \type {lua} in its name so in principle any +wrapper around the library can use it as hook. In the case of \LUATEX\ the script +language is of course \LUA. At the \METAPOST\ end we only expect a string. How +that string is constructed is completely up to the \LUA\ script. In fact, the +user is completely free to implement the runner any way she or he wants, like: + +\starttyping +local function scriptrunner(code) + local f = loadstring(code) + if f then + return tostring(f()) + else + return "" + end +end +\stoptyping + +This is hooked into an instance as follows: + +\starttyping +local m = mplib.new { + ... + run_script = scriptrunner, + ... +} +\stoptyping + +Now, beware, this is not the \CONTEXT\ way. We provide print functions and other +helpers, which we will explain in the next section. + +\stopsection + +\startsection[title=Helpers] + +After I got this feature up and running I played a bit with possible interfaces +at the \CONTEXT\ (read: \METAFUN) end and ended up with a bit more advanced runner +where no return value is used. The runner is wrapped in the \type {lua} macro. + +\startbuffer +numeric n ; n := lua("mp.print(12.34567)") ; +draw textext(n) xsized 4cm withcolor darkred ; +\stopbuffer + +\typebuffer + +This renders as: + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +In case you wonder how efficient calling \LUA\ is, don't worry: it's fast enough, +especially if you consider suboptimal \LUA\ code and the fact that we switch +between machineries. + +\startbuffer +draw image ( + lua("statistics.starttiming()") ; + for i=1 upto 10000 : draw + lua("mp.pair(math.random(-200,200),math.random(-50,50))") ; + endfor ; + setbounds currentpicture to fullsquare xyscaled (400,100) ; + lua("statistics.stoptiming()") ; +) withcolor darkyellow withpen pencircle scaled 1 ; +draw textext(lua("mp.print(statistics.elapsedtime())")) + ysized 50 withcolor darkred ; +\stopbuffer + +\typebuffer + +Here the line: + +\starttyping +draw lua("mp.pair(math.random(-200,200),math.random(-50,50))") ; +\stoptyping + +effectively becomes (for instance): + +\starttyping +draw scantokens "(25,40)" ; +\stoptyping + +which in turn becomes: + +\starttyping +draw scantokens (25,40) ; +\stoptyping + +The same happens with this: + +\starttyping +draw textext(lua("mp.print(statistics.elapsedtime())")) ... +\stoptyping + +This becomes for instance: + +\starttyping +draw textext(scantokens "1.23") ... +\stoptyping + +and therefore: + +\starttyping +draw textext(1.23) ... +\stoptyping + +We can use \type {mp.print} here because the \type {textext} macro can deal with +numbers. The next also works: + +\starttyping +draw textext(lua("mp.quoted(statistics.elapsedtime())")) ... +\stoptyping + +Now we get (in \METAPOST\ speak): + +\starttyping +draw textext(scantokens (ditto & "1.23" & ditto) ... +\stoptyping + +Here \type {ditto} represents the double quotes that mark a string. Of course, +because we pass the strings directly to \type {scantokens}, there are no outer +quotes at all, but this is how it can be simulated. In the end we have: + +\starttyping +draw textext("1.23") ... +\stoptyping + +What you use, \type {mp.print} or \type {mp.quoted} depends on what the expected +code is: an assignment to a numeric can best be a number or an expression +resulting in a number. + +This graphic becomes: + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +The runtime on my current machine is some 0.25 seconds without and 0.12 seconds +with caching. But to be honest, speed is not really a concern here as the amount +of complex \METAPOST\ graphics can be neglected compared to extensive node list +manipulation. With \LUAJITTEX\ generating the graphic takes 15\% less time. + +\startbuffer +numeric n ; n := lua("mp.print(1) mp.print('+') mp.print(2)") ; +draw textext(n) xsized 1cm withcolor darkred ; +\stopbuffer + +The three print command accumulate their arguments: + +\typebuffer + +As expected we get: + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +\startbuffer +numeric n ; n := lua("mp.print(1,'+',2)") ; +draw textext(n) xsized 1cm withcolor darkred ; +\stopbuffer + +Equally valid is: + +\typebuffer + +This gives the same result: + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +Of course all kind of action can happen between the prints. It is also legal to +have nothing returned as could be seen in the 10.000 dot example: there the timer +related code returns nothing so effectively we have \type {scantokens("")}. Another +helper is \type {mp.quoted}, as in: + +\startbuffer +draw + textext(lua("mp.quoted('@0.3f'," & decimal n & ")")) + withcolor darkred ; +\stopbuffer + +\typebuffer + +This typesets \processMPbuffer. Watch the \type {@}. When no percent character is +found in the format specifier, we assume that an \type {@} is used instead. + +\startbuffer +\startluacode +table.save("demo-data.lua", + { + { 1, 2 }, { 2, 4 }, { 3, 3 }, { 4, 2 }, + { 5, 2 }, { 6, 3 }, { 7, 4 }, { 8, 1 }, + } +) +\stopluacode +\stopbuffer + +But, the real benefit of embedded \LUA\ is when we deal with data that is stored +at the \LUA\ end. First we define a small dataset: + +\typebuffer + +\getbuffer + +There are several ways to deal with this table. I will show clumsy as well as +better looking ways. + +\startbuffer +lua("MP = { } MP.data = table.load('demo-data.lua')") ; +numeric n ; +lua("mp.print('n := ',\#MP.data)") ; +for i=1 upto n : + drawdot + lua("mp.pair(MP.data[" & decimal i & "])") scaled cm + withpen pencircle scaled 2mm + withcolor darkred ; +endfor ; +\stopbuffer + +\typebuffer + +Here we load a \LUA\ table and assign the size to a \METAPOST\ numeric. Next we +loop over the table entries and draw the coordinates. + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +We will stepwise improve this code. In the previous examples we omitted wrapper +code but here we show it: + +\startbuffer +\startluacode + MP.data = table.load('demo-data.lua') + function MP.n() + mp.print(#MP.data) + end + function MP.dot(i) + mp.pair(MP.data[i]) + end +\stopluacode + +\startMPcode + numeric n ; n := lua("MP.n()") ; + for i=1 upto n : + drawdot + lua("MP.dot(" & decimal i & ")") scaled cm + withpen pencircle scaled 2mm + withcolor darkred ; + endfor ; +\stopMPcode +\stopbuffer + +\typebuffer + +So, we create a few helpers in the \type {MP} table. This table is predefined so +normally you don't need to define it. You may however decide to wipe it clean. + +\startlinecorrection[blank] +\getbuffer +\stoplinecorrection + +You can decide to hide the data: + +\startbuffer +\startluacode + local data = { } + function MP.load(name) + data = table.load(name) + end + function MP.n() + mp.print(#data) + end + function MP.dot(i) + mp.pair(data[i]) + end +\stopluacode +\stopbuffer + +\typebuffer \getbuffer + +It is possible to use less \LUA, for instance in: + +\startbuffer +\startluacode + local data = { } + function MP.loaded(name) + data = table.load(name) + mp.print(#data) + end + function MP.dot(i) + mp.pair(data[i]) + end +\stopluacode + +\startMPcode + for i=1 upto lua("MP.loaded('demo-data.lua')") : + drawdot + lua("MP.dot(",i,")") scaled cm + withpen pencircle scaled 4mm + withcolor darkred ; + endfor ; +\stopMPcode +\stopbuffer + +\typebuffer + +Here we also omit the \type {decimal} because the \type {lua} macro is clever +enough to recognize it as a number. + +\startlinecorrection[blank] +\getbuffer +\stoplinecorrection + +By using some \METAPOST\ magic we can even go a step further in readability: + +\startbuffer +\startMPcode{doublefun} + lua.MP.load("demo-data.lua") ; + + for i=1 upto lua.MP.n() : + drawdot + lua.MP.dot(i) scaled cm + withpen pencircle scaled 4mm + withcolor darkred ; + endfor ; + + for i=1 upto MP.n() : + drawdot + MP.dot(i) scaled cm + withpen pencircle scaled 2mm + withcolor white ; + endfor ; +\stopMPcode +\stopbuffer + +\typebuffer + +Here we demonstrate that it also works ok in \type {double} mode, which makes +much sense when processing data from other sources. Watch how we omit the +type {lua.} prefix: the \type {MP} macro will deal with that. + +\startlinecorrection[blank] +\getbuffer +\stoplinecorrection + +So in the end we can simplify the code that we started with to: + +\starttyping +\startMPcode{doublefun} + for i=1 upto MP.loaded("demo-data.lua") : + drawdot + MP.dot(i) scaled cm + withpen pencircle scaled 2mm + withcolor darkred ; + endfor ; +\stopMPcode +\stoptyping + +\stopsection + +\startsection[title=Access to variables] + +The question with such mechanisms is always: how far should we go. Although +\METAPOST\ is a macro language it has properties of procedural languages. It also +has more introspective features at the user end. For instance, one can loop over +the resulting picture and manipulate it. This means that we don't need full +access to \METAPOST\ internals. However, it makes sense to provide access to +basic variables: \type {numeric}, \type {string}, and \type {boolean}. + +\startbuffer +draw textext(lua("mp.quoted('@0.15f',mp.get.numeric('pi')-math.pi)")) + ysized 1cm + withcolor darkred ; +\stopbuffer + +\typebuffer + +In double mode you will get zero printed but in scaled mode we definitely get a +difference: + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +\startbuffer +boolean b ; b := true ; +draw textext(lua("mp.quoted(mp.get.boolean('b') and 'yes' or 'no')")) + ysized 1cm + withcolor darkred ; +\stopbuffer + +In the next example we use \type {mp.quoted} to make sure that indeed we pass a +string. The \type {textext} macro can deal with numbers but an unquoted \type +{yes} or \type {no} is asking for problems. + +\typebuffer + +Especially when more text is involved it makes sense to predefine a helper in +the \type {MP} namespace if only because \METAPOST\ (currently) doesn't like +newlines in the middle of a string, so a \type {lua} call has to be on one line. + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +Here is an example where \LUA\ does something that would be close to impossible, +especially if more complex text is involved. + +% \enabletrackers[metapost.lua] + +\startbuffer +string s ; s := "ΤΕΧ" ; % "τεχ" +draw textext(lua("mp.quoted(characters.lower(mp.get.string('s')))")) + ysized 1cm + withcolor darkred ; +\stopbuffer + +\typebuffer + +As you can see here, the whole repertoire of helper functions can be used in +a \METAFUN\ definition. + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +\stopsection + +\startsection[title=The library] + +In \CONTEXT\ we have a dedicated runner, but for the record we mention the +low level constructor: + +\starttyping +local m = mplib.new { + ... + script_runner = function(s) return loadstring(s)() end, + script_error = function(s) print(s) end, + ..., +} +\stoptyping + +An instance (in this case \type {m}) has a few extra methods. Instead you can use +the helpers in the library. + +\starttabulate[|l|l|] +\HL +\NC \type {m:get_numeric(name)} \NC returns a numeric (double) \NC \NR +\NC \type {m:get_boolean(name)} \NC returns a boolean (\type {true} or \type {false}) \NC \NR +\NC \type {m:get_string (name)} \NC returns a string \NC \NR +\HL +\NC \type {mplib.get_numeric(m,name)} \NC returns a numeric (double) \NC \NR +\NC \type {mplib.get_boolean(m,name)} \NC returns a boolean (\type {true} or \type {false}) \NC \NR +\NC \type {mplib.get_string (m,name)} \NC returns a string \NC \NR +\HL +\stoptabulate + +In \CONTEXT\ the instances are hidden and wrapped in high level macros, so there +you cannot use these commands. + +\stopsection + +\startsection[title=\CONTEXT\ helpers] + +The \type {mp} namespace provides the following helpers: + +\starttabulate[|l|l|] +\HL +\NC \type {print(...)} \NC returns one or more values \NC \NR +\NC \type {pair(x,y)} + \type {pair(t)} \NC returns a proper pair \NC \NR +\NC \type {triplet(x,y,z)} + \type {triplet(t)} \NC returns an \RGB\ color \NC \NR +\NC \type {quadruple(w,x,y,z)} + \type {quadruple(t)} \NC returns an \CMYK\ color \NC \NR +\NC \type {format(fmt,...)} \NC returns a formatted string \NC \NR +\NC \type {quoted(fmt,...)} + \type {quoted(s)} \NC returns a (formatted) quoted string \NC \NR +\NC \type {path(t[,connect][,close])} \NC returns a connected (closed) path \NC \NR +\HL +\stoptabulate + +The \type {mp.get} namespace provides the following helpers: + +\starttabulate[|l|l|] +\HL +\NC \type {numeric(name)} \NC gets a numeric from \METAPOST \NC \NR +\NC \type {boolean(name)} \NC gets a boolean from \METAPOST \NC \NR +\NC \type {string(name)} \NC gets a string from \METAPOST \NC \NR +\HL +\stoptabulate + +\stopsection + +\startsection[title=Paths] + +In the meantime we got several questions on the \CONTEXT\ mailing list about turning +coordinates into paths. Now imagine that we have this dataset: + +\startbuffer[dataset] +10 20 20 20 -- sample 1 +30 40 40 60 +50 10 + +10 10 20 30 % sample 2 +30 50 40 50 +50 20 + +10 20 20 10 # sample 3 +30 40 40 20 +50 10 +\stopbuffer + +\typebuffer[dataset] + +In this case I've put the data in a buffer so that it can be shown +here as well as used in a demo. Watch how we can add comments. The +following code converts this into a table with three subtables. + +\startbuffer +\startluacode + MP.myset = mp.dataset(buffers.getcontent("dataset")) +\stopluacode +\stopbuffer + +\typebuffer \getbuffer + +We use the \type {MP} (user) namespace to store the table. Next we turn +these subtables into paths: + +\startbuffer +\startMPcode + for i=1 upto lua("mp.print(mp.n(MP.myset))") : + draw + lua("mp.path(MP.myset[" & decimal i & "])") + xysized (HSize-.25ExHeight,10ExHeight) + withpen pencircle scaled .25ExHeight + withcolor basiccolors[i]/2 ; + endfor ; +\stopMPcode +\stopbuffer + +\typebuffer + +This gives: + +\startlinecorrection[blank] \getbuffer \stoplinecorrection + +Instead we can fill the path in which case we also need to close it. The +\type {true} argument deals with that: + +\startbuffer +\startMPcode + for i=1 upto lua("mp.print(mp.n(MP.myset))") : + path p ; p := + lua("mp.path(MP.myset[" & decimal i & "],true)") + xysized (HSize,10ExHeight) ; + fill p + withcolor basiccolors[i]/2 + withtransparency (1,.5) ; + endfor ; +\stopMPcode +\stopbuffer + +\typebuffer + +We get: + +\startlinecorrection[blank] \getbuffer \stoplinecorrection + +\startbuffer +\startMPcode + for i=1 upto lua("mp.print(mp.n(MP.myset))") : + path p ; p := + lua("mp.path(MP.myset[" & decimal i & "])") + xysized (HSize,10ExHeight) ; + p := + (xpart llcorner boundingbox p,0) -- + p -- + (xpart lrcorner boundingbox p,0) -- + cycle ; + fill p + withcolor basiccolors[i]/2 + withtransparency (1,.25) ; + endfor ; +\stopMPcode +\stopbuffer + +The following makes more sense: + +\typebuffer + +So this gives: + +\startlinecorrection[blank] \getbuffer \stoplinecorrection + +This (area) fill is so common that we have a helper for it: + +\startbuffer +\startMPcode + for i=1 upto lua("mp.size(MP.myset)") : + fill area + lua("mp.path(MP.myset[" & decimal i & "])") + xysized (HSize,5ExHeight) + withcolor basiccolors[i]/2 + withtransparency (2,.25) ; + endfor ; +\stopMPcode +\stopbuffer + +\typebuffer + +So this gives: + +\startlinecorrection[blank] \getbuffer \stoplinecorrection + +A variant call is the following: \footnote {Getting that to work properly in the +library was non||trivial as the loop variable \type {i} is an abstract nameless +variable at the \METAPOST\ end. When investigating this Luigi Scarso and I found out +that the internals of \METAPOST\ are not really geared for interfacing this way +but in the end it worked out well.} + +\startbuffer +\startMPcode + for i=1 upto lua("mp.size(MP.myset)") : + fill area + lua("mp.path(MP.myset[mp.get.numeric('i')])") + xysized (HSize,5ExHeight) + withcolor basiccolors[i]/2 + withtransparency (2,.25) ; + endfor ; +\stopMPcode +\stopbuffer + +\typebuffer + +The result is the same: + +\startlinecorrection[blank] \getbuffer \stoplinecorrection + +\startbuffer +\startluacode + MP.mypath = function(i) + return mp.path(MP.myset[mp.get.numeric(i)]) + end +\stopluacode +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer +\startMPcode + for i=1 upto lua("mp.size(MP.myset)") : + fill area + lua("MP.mypath('i')") + xysized (HSize,5ExHeight) + withcolor basiccolors[i]/2 + withtransparency (2,.25) ; + endfor ; +\stopMPcode +\stopbuffer + +\typebuffer + +This snippet of \METAPOST\ code still looks kind of horrible so how can we make +it look better? Here is an attempt, First we define a bit more \LUA: + +\startbuffer +\startluacode +local data = mp.dataset(buffers.getcontent("dataset")) + +MP.dataset = { + Line = function(n) mp.path(data[n]) end, + Size = function() mp.size(data) end, +} +\stopluacode +\stopbuffer + +\typebuffer \getbuffer + +We can now make the \METAPOST\ look more natural. Of course this is possible +because in \METAFUN\ the \type {lua} macro does some extra work. + +\startbuffer +\startMPcode + for i=1 upto lua.MP.dataset.Size() : + path p ; p := + lua.MP.dataset.Line(i) + xysized (HSize-ExHeight,20ExHeight) ; + draw + p + withpen pencircle scaled .25ExHeight + withcolor basiccolors[i]/2 ; + drawpoints + p + withpen pencircle scaled ExHeight + withcolor basiccolors[i]/2 ; + endfor ; +\stopMPcode +\stopbuffer + +\typebuffer + +As expected, we get the desired result: + +\startlinecorrection[blank] \getbuffer \stoplinecorrection + +Once we start making things look nicer and more convenient, we quickly end up +with helpers like the once in the next example. First we save some demo data +in files: + +\startbuffer +\startluacode + io.savedata("foo.tmp","10 20 20 20 30 40 40 60 50 10") + io.savedata("bar.tmp","10 10 20 30 30 50 40 50 50 20") +\stopluacode +\stopbuffer + +\typebuffer \getbuffer + +We load the data in datasets: + +\startbuffer +\startMPcode + lua.mp.datasets.load("foo","foo.tmp") ; + lua.mp.datasets.load("bar","bar.tmp") ; + fill area + lua.mp.datasets.foo.Line() + xysized (HSize/2-EmWidth-.25ExHeight,10ExHeight) + withpen pencircle scaled .25ExHeight + withcolor darkyellow ; + fill area + lua.mp.datasets.bar.Line() + xysized (HSize/2-EmWidth-.25ExHeight,10ExHeight) + shifted (HSize/2+EmWidth,0) + withpen pencircle scaled .25ExHeight + withcolor darkred ; +\stopMPcode +\stopbuffer + +\typebuffer + +Because the datasets are stores by name we can use them without worrying about +them being forgotten: + +\startlinecorrection[blank] \getbuffer \stoplinecorrection + +If no tag is given, the filename (without suffix) is used as tag, so the following is +valid: + +\starttyping +\startMPcode + lua.mp.datasets.load("foo.tmp") ; + lua.mp.datasets.load("bar.tmp") ; +\stopMPcode +\stoptyping + +The following methods are defined for a dataset: + +\starttabulate[|l|pl|] +\HL +\NC \type {method} \NC usage \NC \NR +\HL +\NC \type {Size} \NC the number of subsets in a dataset \NC \NR +\NC \type {Line} \NC the joined pairs in a dataset making a non|-|closed path \NC \NR +\NC \type {Data} \NC the table containing the data (in subsets, so there is always at least one subset) \NC \NR +\HL +\stoptabulate + +{\em In order avoid interference with suffix handling in \METAPOST\ the methods +start with an uppercase character.} + +\stopsection + +\startsection[title=Passing variables] + +You can pass variables from \METAPOST\ to \CONTEXT. Originally that happened via +a temporary file and so called \METAPOST\ specials. Nowadays it's done via \LUA. +Here is an example: + +\startbuffer +\startMPcalculation + +passvariable("version","1.0") ; +passvariable("number",123) ; +passvariable("string","whatever") ; +passvariable("point",(1.5,2.8)) ; +passvariable("triplet",(1/1,1/2,1/3)) ; +passvariable("quad",(1.1,2.2,3.3,4.4)) ; +passvariable("boolean",false) ; +passvariable("path",fullcircle scaled 1cm) ; +path p[] ; p[1] := fullcircle ; p[2] := fullsquare ; +passarrayvariable("list",p,1,2,1) ; % first last step +\stopMPcalculation +\stopbuffer + +\typebuffer + +\getbuffer + +We can visualize the result with + +\startbuffer +\startluacode +context.tocontext(metapost.variables) +\stopluacode +\stopbuffer + +\typebuffer + +\getbuffer + +In \TEX\ you can access these variables as follows: + +\startbuffer +\MPrunvar{version} +\MPruntab{quad}{3} +(\MPrunset{triplet}{,}) + +$(x,y) = (\MPruntab{point}{1},\MPruntab{point}{2})$ +$(x,y) = (\MPrunset{point}{,})$ +\stopbuffer + +\typebuffer + +This becomes: % we need a hack as we cross pages and variables get replace then + +\startlines +\getbuffer +\stoplines + +Here we passed the code between \type {\startMPcalculation} and \type +{\stopMPcalculation} which does not produce a graphic and therefore takes no +space in the flow. Of course it also works with normal graphics. + +\startbuffer +\startMPcode +path p ; p := fullcircle xyscaled (10cm,2cm) ; +path b ; b := boundingbox p ; +startpassingvariable("mypath") + passvariable("points",p) ; + startpassingvariable("metadata") + passvariable("boundingbox",boundingbox p) ; + stoppassingvariable ; +stoppassingvariable ; +fill p withcolor .625red ; +draw b withcolor .625yellow ; +\stopMPcode +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] + \getbuffer +\stoplinecorrection + +This time we get: + +\ctxlua{context.tocontext(metapost.variables)} + +You need to be aware of the fact that a next graphic resets the previous +variables. You can easily overcome that limitation by saving the variables (in +\LUA). It helps that when a page is being shipped out (which can involve +graphics) the variables are protected. You can push and pop variable sets with +\type {\MPpushvariables} and \type {\MPpopvariables}. Because you can nest +the \type {start}||\type{stop} pairs you can create quite complex indexed +and hashed tables. If the results are not what you expect, you can enable a +tracker to follow what gets passed: + +\starttyping +\enabletrackers[metapost.variables] +\stoptyping + +Serializing variables can be done with the \type {tostring} macro, for instance: + +\startbuffer +\startMPcode +message("doing circle",fullcircle); +draw fullcircle ; +\stopMPcode +\stopbuffer + +In this case the \type {tostring} is redundant as the message already does the +serialization. + +\stopsection + +\stopchapter + +% \startMPcode{doublefun} +% numeric n ; n := 123.456 ; +% lua("print('>>>>>>>>>>>> number',mp.get.number('n'))") ; +% lua("print('>>>>>>>>>>>> number',mp.get.boolean('n'))") ; +% lua("print('>>>>>>>>>>>> number',mp.get.string('n'))") ; +% boolean b ; b := true ; +% lua("print('>>>>>>>>>>>> boolean',mp.get.number('b'))") ; +% lua("print('>>>>>>>>>>>> boolean',mp.get.boolean('b'))") ; +% lua("print('>>>>>>>>>>>> boolean',mp.get.string('b'))") ; +% string s ; s := "TEST" ; +% lua("print('>>>>>>>>>>>> string',mp.get.number('s'))") ; +% lua("print('>>>>>>>>>>>> string',mp.get.boolean('s'))") ; +% lua("print('>>>>>>>>>>>> string',mp.get.string('s'))") ; +% \stopMPcode + +% \usemodule[graph] +% +% \startluacode +% local d = nil +% function MP.set(data) +% d = data +% end +% function MP.n() +% mp.print(d and #d or 0) +% end +% function MP.get(i,j) +% mp.print(d and d[i] and d[i][j] or 0) +% end +% \stopluacode +% +% \startluacode +% MP.set { +% { 1, 0.5, 2.5 }, +% { 2, 1.0, 3.5 }, +% } +% \stopluacode +% +% \startMPpage[instance=graph,offset=2mm] +% +% draw begingraph(3cm,5cm); +% numeric a[]; +% for j = 1 upto MP.n() : +% path b; +% augment.b(MP.get(j,1),MP.get(j,2)); +% augment.b(MP.get(j,1),MP.get(j,3)); +% setrange(0,0,3,4); +% gdraw b; +% endfor ; +% endgraph ; +% \stopMPpage + +% \starttext +% +% % \enabletrackers[metapost.variables] +% +% \startMPcode +% numeric n[] ; for i=1 upto 10: n[i] := 1/i ; endfor ; +% path p[] ; for i=1 upto 10: p[i] := fullcircle xyscaled (cm*i,cm/i) ; endfor ; +% numeric r[][] ; for i=1 upto 4 : for j=1 upto 3 : r[i][j] := uniformdeviate(1) ; endfor ; endfor ; +% pair u[][] ; for i=1 step 0.5 until 4 : for j=1 step 0.1 until 2 : u[i][j] := (i,j) ; endfor ; endfor ; +% +% passvariable("x",12345) ; +% passarrayvariable("n-array",n,1,7,1) ; +% passarrayvariable("p-array",p,1,7,1) ; +% passvariable("p",(1,1) .. (2,2)) ; +% +% startpassingvariable("b") +% for i=1 upto 4 : +% startpassingvariable(i) +% for j=1 upto 3 : +% passvariable(j,r[i][j]) +% endfor +% stoppassingvariable +% endfor +% stoppassingvariable ; +% +% startpassingvariable("a") +% startpassingvariable("test 1") +% passvariable(1,123) +% passvariable(2,456) +% stoppassingvariable ; +% startpassingvariable("test 2") +% passvariable(0,123) +% passvariable(1,456) +% passvariable(2,789) +% passvariable(999,987) +% stoppassingvariable ; +% startpassingvariable("test 3") +% passvariable("first",789) +% passvariable("second",987) +% stoppassingvariable +% stoppassingvariable ; +% +% startpassingvariable("c") +% for i=1 step 0.5 until 4 : +% startpassingvariable(i) +% for j=1 step 0.1 until 2 : +% passvariable(j,u[i][j]) +% endfor +% stoppassingvariable +% endfor +% stoppassingvariable ; +% +% draw fullcircle scaled 1cm ; +% \stopMPcode +% +% \ctxluacode{inspect(metapost.variables)} +% +% \ctxcommand{mprunvar("x")} + +\stoptext + + diff --git a/doc/context/sources/general/manuals/metafun/metafun-macros.tex b/doc/context/sources/general/manuals/metafun/metafun-macros.tex new file mode 100644 index 000000000..e1df13c92 --- /dev/null +++ b/doc/context/sources/general/manuals/metafun/metafun-macros.tex @@ -0,0 +1,91 @@ +% language=uk +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\startcomponent metafun-macros + +\environment metafun-environment + +\startchapter[title={\METAFUN\ macros}] + +\index{metafun} + +\startintro + +\CONTEXT\ comes with a series of \METAPOST\ modules. In this chapter we will +summarize the most important \TEX\ and \METAPOST\ macros. More information can be +found in the documentation of the modules. + +\stopintro + +There are several ways to use the power of \METAFUN, either or not using +\CONTEXT. + +\startitemize[n] + +\startitem + You can create an independent \type {mp} file and process it with the + \METAPOST\ program or \MPTOPDF. Depending on what features you use, the + succes of a run depends on the proper set up of the programs that take care + of running \TEX\ for \type {btex}. +\stopitem + +\startitem + You can embed the graphic in a \type {\startMPpage} construct and process it + with \CONTEXT\ \MKIV. In that case you have the full \METAFUN\ functionality + available. If for some reason you still want to use \MKII, you need to use + \TEXEXEC\ as before processing the file, it will do a couple of checks on the + file. It will also make sure that the temporary files (\type {mpt} for \type + {textext}'s and \type {mpo} for outline fonts) are taken care of too. +\stopitem + +\startitem + You can integrate the graphic in the document flow, using buffers, \METAPOST\ + code sections, or (reusable) graphic containers. In that case the graphics + are processed runtime or between runs. This happens automatically. +\stopitem + +\stopitemize + +Unless you want to write low level \CONTEXT\ code yourself, there is no real +reason to look into the modules that deal with \METAPOST\ support. The +traditional (partly generic) code is collected in: + +\starttabulate[|lT|p|] +\NC supp-mps.tex \NC low level inclusion macros and housekeeping \NC\NR +\NC supp-mpe.tex \NC experimental extensions (like specials) \NC\NR +\NC supp-pdf.tex \NC \METAPOST\ to \PDF\ conversion \NC\NR +\stoptabulate + +Especially the last two can be used in other macro packages. However, in +\CONTEXT\ we have regrouped the code (plus more) in other files: + +\starttabulate[|lT|p|] +\NC meta-***.tex \NC definition and managing \NC\NR +\NC mlib-***.tex \NC processing and conversion \NC\NR +\stoptabulate + +The last category will certainly grow. Some of these modules are preloaded, +others can be loaded using the command \type {\useMPlibrary}, like + +\starttyping +\useMPlibrary[clp,txt] +\stoptyping + +for loading the predefined clipping paths and text tricks. + +The \METAPOST\ code is organized in files named \type {mp-****.mp}. The core file +is \type {mp-tool.mp} and this file can comfortably be used in stand||alone +graphics. The file \type {metafun.mp} is used to load the collection of modules +into a format. The collection of \METAPOST\ code files will grow in due time, but +as long as you use the \METAFUN\ format, you don't have to keep track of the +organization of files. Most files relate to subsystems and are loaded +automatically, like the files that implement page layout support and flow charts. + +Although this document is the main source of information, occasionally the source +code of \METAFUN, and in many cases the source code of \CONTEXT\ may contain +additional information and examples. + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/metafun/metafun-positioning.tex b/doc/context/sources/general/manuals/metafun/metafun-positioning.tex new file mode 100644 index 000000000..5a3b1ece0 --- /dev/null +++ b/doc/context/sources/general/manuals/metafun/metafun-positioning.tex @@ -0,0 +1,1013 @@ +% language=uk +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\startcomponent metafun-positioning + +\environment metafun-environment + +\startchapter[reference=sec:positioning,title={Positional graphics}] + +\startintro + +In this chapter, we will explore one of the more advanced, but also conceptually +more difficult, graphic capabilities of \CONTEXT. It took quite a few experiments +to find the {\em right} way to support these kind of graphics, and you can be +sure that in due time extensions will show up. You can skip this chapter if you +are no \CONTEXT\ user. Because we're now a decade into \MKIV\ the tricks here +will assume that you use \CONTEXT\ \MKIV\ because we have a more convenient +interface there. For old|-|school \MKII\ usage you can look in old \METAFUN\ +manuals or in the \type {mkii} source files. Of course we remain compatible, it's +just that more (convenient) interfaces were added. + +\stopintro + +\startsection[title={The status quo}] + +After \TEX\ has read a paragraph of text, it will try to break this paragraph +into lines. When this is done, the result is flushed and after that \TEX\ will +check if a page should be split off. As a result, we can hardly predict how a +document will come out. Therefore, when we want graphics to adapt themselves to +this text, maybe even to text broken across lines, we have to deal with this +asynchronous feature of \TEX\ in a rather advanced way. Before we present a way +of dealing with this complexity, we will elaborate on the nature of embedded +graphics in \TEX. + +When \TEX\ entered the world of typesetting, desktop printers were not that +common, let alone color desktop printers. But times have changed and nowadays we +want color and graphics and if possible we want them integrated in the text. When +\METAPOST\ showed up it depended on the \DVI\ processor to recognize the +\POSTSCRIPT\ code as being produced by \METAPOST\ and therefore also include the +fonts that were used. But color was still limited to \RGB. When \PDFTEX\ evolved +I wrote an interpreter (in \TEX) that could translate the output to \PDF. This +also opened up the possibility to add features to \METAPOST, like \CMYK\ colors, +shading, transparencies etc. But basically the \TEX\ and \METAPOST\ processes +were rather isolated. We could of course pass information to \METAPOST\ and pick +up information from \METAPOST\ in a second pass. That has changed in \LUATEX. + +In order to really integrate \METAPOST\ graphics into the flow you need to know +where you are on the page and how large graphics should be, especially when you +want them to depend on the layout. A first solution to this was to embed specials +in the \DVI\ that could later be used to extract positions. In retrospect this +was a relative trivial extension, something that could have been around much +earlier but somehow didn't happen. Anyhow, after some experiments \PDFTEX\ got a +native position tracker which meant that no post processor was needed. Of course +\LUATEX\ inherited this feature too. Because positioning is rather bound to the +macro package reading this chapter only makes sense when you use \CONTEXT. + +\stopsection + +\startbuffer[arrow:1] +\startMPpositionmethod{mypos:arrow} + \startMPpositiongraphic{mypos:arrow} + save pa, pb, pm, pab, na, nb, sa, sb ; + path pa, pb, pm, pab ; numeric na, nb ; string sa, sb ; + % the tags + sa := texstr("from") ; + sb := texstr("to") ; + % we need to check page crossing so we fetch the page numbers + na := positionpage(sa) ; + nb := positionpage(sb) ; + % we use the repositioned shapes + pa := positionbox(sa) ; + pb := positionbox(sb) ; + % but want circles instead of rectangles + pa := llcorner pa .. lrcorner pa .. urcorner pa .. ulcorner pa .. cycle ; + pb := llcorner pb .. lrcorner pb .. urcorner pb .. ulcorner pb .. cycle ; + pickup pencircle scaled 1pt ; + if na = nb : + % both are on the same page + fill pa withcolor .800white ; + fill pb withcolor .800white ; + draw pa withcolor .625yellow ; + draw pb withcolor .625yellow ; + pm := .5[center pa,center pb] shifted (0,2*LineHeight) ; + pab := center pa .. pm .. center pb ; + pab := pab cutbefore (pab intersectionpoint pa) ; + pab := pab cutafter (pab intersectionpoint pb) ; + drawarrow pab dashed evenly withcolor .625red ; + positionatanchor(sa) ; + elseif nb < na : + % they are on different pages and we're at the first one + fill pb withcolor .800white ; + draw pb withcolor .625yellow ; + pab := center pb {up} .. ulcorner bbox pb ; + pab := pab cutbefore (pab intersectionpoint pb) ; + drawarrow pab dashed evenly withcolor .625red ; + positionatanchor(sb) ; + else : + % they are on different pages and we're at the last one + fill pa withcolor .800white ; + draw pa withcolor .625yellow ; + pab := center pa {up} .. urcorner bbox pa ; + pab := pab cutbefore (pab intersectionpoint pa) ; + drawarrow pab dashed evenly withcolor .625red ; + positionatanchor(sa) ; + fi ; + \stopMPpositiongraphic + % we put it here at the first position + \MPpositiongraphic{mypos:arrow} + % we need to carry information forward and make sure that we also + % check and flush at the second position of the pair + \ifnum\MPp{\MPvar{from}}<\MPp{\MPvar{to}}\relax + \expanded{\setMPpositiongraphic{\MPvar{to}}{mypos:arrow}{to=\MPvar{from}}} + \fi +\stopMPpositionmethod +\stopbuffer + +\startbuffer[arrow:2] +\setMPpositiongraphic{A-1}{mypos:arrow}{to=A-2} +\stopbuffer + +\startbuffer[box:1] +\startMPpositiongraphic{mpos:box}{fillcolor,linecolor,linewidth} + string tag; tag := "\MPvar{self}" ; + path box ; box := positionbox(tag) ; + box := box enlarged \MPvar{filloffset} ; + fill box + withcolor \MPvar{fillcolor} ; + draw box + withcolor \MPvar{linecolor} + withpen pencircle scaled \MPvar{linewidth} ; + positioninregion ; +\stopMPpositiongraphic +\stopbuffer + +\startbuffer[box:1:also] +\startMPpositiongraphic{mpos:box}{fillcolor,linecolor,linewidth} + path box ; box := positionbox(texstr("self")) ; + box := box enlarged texvar("filloffset") ; + fill box + withcolor texvar("fillcolor") ; + draw box + withcolor texvar("linecolor") + withpen pencircle scaled texvar("linewidth") ; + positioninregion ; +\stopMPpositiongraphic +\stopbuffer + +\startbuffer[box:2] +\setupMPvariables + [mpos:box] + [linecolor=blue, + linewidth=\linewidth, + fillcolor=lightgray, + filloffset=2pt] + +\setupMPvariables[mpos:box][linecolor=darkred] +\setupMPvariables[mpos:par][linecolor=darkred] + +\startpositionoverlay{backgraphics} + \setMPpositiongraphic{A-0}{mpos:box}{self=A-0} + \setMPpositiongraphic{A-3}{mpos:box}{self=A-3} + \setMPpositiongraphic{A-4}{mpos:box}{self=A-4} +\stoppositionoverlay +\stopbuffer + +\getbuffer[arrow:1,arrow:2] +\getbuffer[box:1,box:2] + +\startsection[title={The concept}] + +\index {graphics+positioning} +\index {positioning} +\index {anchoring} + +Because we have a \LUA\ connection in \MPLIB, we have implemented a couple of +helpers that make live easier. This is also why the following examples are \MKIV\ +specific, although \MKII\ can do the same, but with a bit different set of +helpers. We can for instance query properties of \hpos {A-0} {positions} without +using \TEX\ macros but can use \METAPOST\ macros instead. Let's give an example. +The background and frame behind the word \type {position} in this paragraph is +not done with \type {\framed} but using a different mechanism: + +\starttyping +to get \hpos {A-0} {positions} sorted +\stoptyping + +The \type {\hpos} refers to a position and we have bound that position to a graphic: + +\starttyping +\setMPpositiongraphic{A-0}{mpos:box}{self=A-0} +\stoptyping + +The graphic itself is defined with: + +\typebuffer[box:1] + +A variant that has no macro calls and does all via the \LUA\ intercaface in \MKIV\ is +the following: + +\typebuffer[box:1:also] + +A \type {\hpos} position has several properties: the coordinates of the origin: +\type {x} and \type {y}, the dimensions of the boxed content, \type {w}, \type +{h} and \type {d}, and the page number \type {p}. An additional helper \type +{positioninregion} will move the drawing to the right spot in the region. +Examples or regions are the page, text area or some overlay. The \type +{positionatanchor} variant relocates to the anchor of the given tag. The first +helper is actually a shortcut for: + +\starttyping +currentpicture := currentpicture shifted - positionxy(positionanchor) ; +\stoptyping + +In our case we use a dedicated layer \type {backgraphics} that we have hooked into +the page backgrounds: + +\starttyping +\setupbackgrounds + [page] + [background={backgraphics,foreground,foregraphics}] + +\defineoverlay [backgraphics] [\positionoverlay{backgraphics}] +\defineoverlay [foregraphics] [\positionoverlay{foregraphics}] +\stoptyping + +The relation between position graphics and that layer are defined as follows +(we will come back to this in a moment): + +\typebuffer[box:2] + +\stopsection + +\startsection[title={A more detailed view}] + +As we know, a decent portion of \TEX's attention is focused on breaking +paragraphs into lines and determining the optimal point to split off the page. +Trying to locate the optimal points to break lines is a dynamic process. The +space between words is flexible and we don't know in advance when a \hpos {A-1} +{word} or piece of a word |<|maybe it's best to talk of typographic \hpos {A-2} +{globs} instead|>| will end up on the page. It might even cross the page +boundary. + +In the previous section we saw \hpos {A-3} {word} and \hpos {A-4} {globs} +encircled and connected by an arrow. This graphic can be drawn only when the +position and dimensions are known. Unfortunately, this information is only +available after the paragraph is typeset and the best breakpoints are chosen. +\bpos {A-5} Because the text must be laid on top of the graphic, the graphic must +precede the first word in the typeset stream or it must be positioned on a +separate layer. In the latter case it can be calculated directly after the +paragraph is typeset, but in the former case a second pass is needed. \epos {A-5} +Because such graphics are not bound to one paragraph, the multi||pass option +suits better because it gives us more control: the more we know about he final +state, the better we can act upon it. Think of graphics on the first page that +depend on the content of the last page \bpos {A-6} or, as in this paragraph, +backgrounds that depend on the typeset text. \epos {A-6} + +The arrows that connect the shapes are drawn with the following code that now +looks familiar: + +\typebuffer[arrow:1] + +and + +\typebuffer[arrow:2] + +However, here we anchor at one of the positions because we don't flush in a layer +but at the position itself. Indeed it looks complex. + +It may be clear now that we need some positional information in order to provide +features like the ones shown here. The fact that we will act upon in a second +pass simplifies the task, although it forces us to store the positional +information between runs in some place. This may look uncomfortable at first +sight, but it also enables us to store some additional information. Now why is +that needed? + +A position has no dimensions, it's just a place somewhere on the page. In order +to do tricks like those shown here, we also need to know the height and depth of +lines at a specific point as well as the width of the box(es) we're dealing with. +In the encircled examples, the dimensions of the box following the positional +node are stored along with the position. + +In order to process the graphics, we tag each point with a name, so that we can +attach actions to those points. In fact they become trigger points. As we will +demonstrate, we also need to store the current page number. This brings the data +stored with a point to: + +\starttyping +<identifier> <pagenumber> <x> <y> <width> <height> <depth> +\stoptyping + +Actually we store more information, for example the region in which the positions +sit. Depending on the use we can also get access to paragraph and line properties +but discussing these is beyond this manual. These are for instance used in the +text backgrounds. + +The page number is needed in order to let the graphics engine determine boundary +conditions. Backgrounds like those shown here can span multiple pages. In order +to calculate the right backgrounds, some additional information must be +available, like the top and bottom of the current text area. In fact, these are +just normal points that can be saved while processing the split off page. So, +apart from positioning anchors in the text we need anchors on crucial points of +the layout. This means that this kind of support cannot be fully integrated into +the \TEX\ kernel, unless we also add extensive support for layout definitions, +and that is probably not what we want. + +As soon as something like $(x,y)$ shows up, a logical question is where $(0,0)$ +is located. Although this is a valid question, the answer is less important than +you may expect. Even if we know that ($0,0)$ is \quote {officially} located in +the bottom left corner of the page, the simple fact that in \CONTEXT\ we are +dealing with a mixed page concept, like paper size and print paper size, or left +and right pages, forces us to think in relative positions instead of absolute +ones. Therefore, graphics, even those that involve multiple positions, are +anchored to a position on the layer on which they are located. + +Users who simply want to use these features may wonder why we go into so much +detail. The main reason is that in the end many users will want to go beyond the +simple cases, and when dealing with these issues, you must be aware not only of +height, depth and width, but also of the crossing of a page boundary, and the +height and depth of lines. In some cases your graphics may have to respond to +layout characteristics, like differences between odd and even pages. Given that +unique identifiers are used for anchor points, in \CONTEXT\ you can have access +to all the information needed. Here are some of the helpers: + +\starttabulate[|T||] +\NC positionpath (tag) \NC the path determined by width, height and depth \NC \NR +\NC positionxy (tag) \NC the origin \NC \NR +\NC positionwhd (tag) \NC the dimensions (in a triplet) \NC \NR +\NC positionpage (tag) \NC the page number fo the position \NC \NR +\NC positionregion(tag) \NC the region that the position sits in \NC \NR +\NC positionbox (tag) \NC the positioned box (path shifted over coordinates) \NC \NR +\NC positionanchor \NC the current anchor of the region \NC \NR +\stoptabulate + +The \type {positionwhd} macro returns a triplet that you can query, like: + +\starttyping +triplet whd ; whd := positionwhd("\MPvar{from}"); +numeric wd; wd := wdpart whd ; +\stoptyping + +We will add more such convenient helpers in the future. In the \CONTEXT\ +distribution you can find examples (in manuals or librarties) that demonstrate +other tricks with positioning. + +\stopsection + +\startsection[title={Anchors and layers}] + +\index{anchoring} +\index{layers} + +\startbuffer[g-circle] +\startMPpositiongraphic{mypos:circle} + path p ; p := positionbox(texstr("self")) ; + p := fullcircle xsized (bbwidth(p)+4pt) shifted center p ; + pickup pencircle scaled 1pt ; + fill p withcolor .800white ; + draw p withcolor .625yellow ; + positioninregion ; +\stopMPpositiongraphic +\stopbuffer + +\startbuffer[g-line] +\startMPpositiongraphic{mypos:line} + path pa, pb, pab ; numeric na, nb ; string ta, tb ; + ta := texstr("from") ; + tb := texstr("to") ; + na := positionpage(ta) ; + nb := positionpage(tb) ; + pa := positionbox(ta) ; + pb := positionbox(tb) ; + pa := fullcircle xsized (bbwidth(pa)+4pt) shifted center pa ; + pb := fullcircle xsized (bbwidth(pb)+4pt) shifted center pb ; + if na = nb : + pab := center pa -- center pb ; + pab := pab cutbefore (pab intersectionpoint pa) ; + pab := pab cutafter (pab intersectionpoint pb) ; + pickup pencircle scaled 1pt ; + draw pab withcolor .625yellow ; + positioninregion ; + fi ; +\stopMPpositiongraphic +\stopbuffer + +\getbuffer[g-circle,g-line] + +\startbuffer[a] +\setMPpositiongraphic{X-1}{mypos:arrow}{to=X-2} +\setMPpositiongraphic{X-2}{mypos:arrow}{to=X-3} +\stopbuffer + +\startbuffer[b] +In a previous section we saw that some \hpos {X-1} {words} were +\hpos {X-2} {circled} and connected by an \hpos {X-3} {arrow}. +As with most things in \CONTEXT, marking these words is separated +from declaring what to do with those words. This paragraph is keyed +in as: +\stopbuffer + +\getbuffer[a,b] + +\typebuffer[b] + +We see three position anchors, each marked by an identifier: \type {X-1}, \type +{X-2} and \type {X-3}. Each of these anchors can be associated with a (series) of +graphic operations. Here we defined: + +\typebuffer[a] + +These examples clearly demonstrate that we cannot control to what extent graphics +will cover text and vice versa. A solution to this problem is using position +overlays. We can define such an overlay as follows: + +\startbuffer +\startpositionoverlay{backgraphics} + \setMPpositiongraphic{G-1}{mypos:circle} + \setMPpositiongraphic{G-2}{mypos:circle} + \setMPpositiongraphic{G-3}{mypos:circle} + \setMPpositiongraphic{G-4}{mypos:circle} +\stoppositionoverlay + +\startpositionoverlay{foregraphics} + \setMPpositiongraphic{G-1}{mypos:line}{to=G-2} + \setMPpositiongraphic{G-2}{mypos:line}{to=G-3} + \setMPpositiongraphic{G-3}{mypos:line}{to=G-4} +\stoppositionoverlay +\stopbuffer + +\getbuffer \typebuffer + +\startbuffer +First we have defined an \hpos {G-1} {\strut overlay}. This +overlay can be attached to some overlay layer, like, in our +case, the \hpos {G-2} {\strut page}. We define four small \hpos +{G-3} {\strut circles}. These are drawn as soon as the page +overlay is typeset. Because they are located in the +background, they don't cover the \hpos {G-4} {\strut text}, while +the lines do. The previous paragraph was typeset by saying: +\stopbuffer + +\getbuffer \typebuffer + +As said, the circles are on the background layer, but the lines are not! They are +positioned on top of the text. This is a direct result of the definition of the +page background: + +\starttyping +\defineoverlay [foregraphics] [\positionoverlay{foregraphics}] +\defineoverlay [backgraphics] [\positionoverlay{backgraphics}] + +\setupbackgrounds + [page] + [background={backgraphics,foreground,foregraphics}] +\stoptyping + +\doifmode{screen}{\writestatus{CHECK}{POSITION GRAPHICS}} + +In this definition, the predefined overlay \type {foreground} inserts the page +data itself, so the foreground graphics end up on top. This example also +demonstrates that you should be well aware of the way \CONTEXT\ builds a page. +There are six main layers, in some cases with sublayers. The body text goes into +the main text layer, which, unless forced otherwise, lays on top. + +\startitemize[packed,n,columns,three] +\item paper background +\item area backgrounds +\item page backgrounds +\item text areas +\item logo areas +\item main text +\stopitemize + +The paper background is used for special (sometimes internal) purposes. There are +three page backgrounds: left, right and both. The text areas, logo areas and +backgrounds form a $5 \times 5$ matrix with columns containing the leftedge, +leftmargin, text, rightmargin, and rightedge. The rows of the matrix contain the +top, header, text, footer, and bottom. The main text is what you are reading now. + +Since the page background is applied last, the previous layers can be considered +to be the foreground to the page background layer. And, indeed, it is available +as an overlay under the name \type {foreground}, as we already saw in the +example. Foregrounds are available in most cases, but (for the moment) not when +we are dealing with the text area. Since anchoring the graphics is implemented +rather independent of the position of the graphics themselves, this is no real +problem, we can put them all on the page layer, if needed in separate overlays. + +How is such a graphic defined? In fact these graphics are a special case of the +already present mechanism of including \METAPOST\ graphics. The circles are +defined as follows: + +\typebuffer[g-circle] + +Drawing the lines is handled in a similar fashion. + +\typebuffer[g-line] + +The command \tex {startMPpositiongraphic} defines a graphic, in this example we +have called it \type {mypos:circle}. Here we show the definition out of order but +normally you need to define it before you refer to it. + +The \METAPOST\ macro \type {positionbox} returns a box that is constructed from +the coordinates and dimensions. After this call, the corners are available via +\type {llcorner}, \type {lrcorner}, \type {urcorner} and \type {ulcorner}. The +center is accessible by \type {center}. When we are finished drawing the graphic, +we can anchor the result with \type {positioninregion}. This macro automatically +handles positioning on specific layers. The helper macros are not loaded by +default, you do that with: + +\typebuffer[g-include] + +The position macro \type {\MPpos} returns the current characteristics of a +position. The previously defined G~positions return: + +\starttabulate[|c|c|c|c|c|c|c|] +\HL +\NC position\NC page\NC$x$\NC$y$\NC width\NC height\NC depth\NC\NR +\HL +\NC G-1\NC\MPp{G-1}\NC\MPx{G-1}\NC\MPy{G-1}\NC\MPw{G-1}\NC\MPh{G-1}\NC\MPd{G-1}\NC\NR +\NC G-2\NC\MPp{G-2}\NC\MPx{G-2}\NC\MPy{G-2}\NC\MPw{G-2}\NC\MPh{G-2}\NC\MPd{G-2}\NC\NR +\NC G-3\NC\MPp{G-3}\NC\MPx{G-3}\NC\MPy{G-3}\NC\MPw{G-3}\NC\MPh{G-3}\NC\MPd{G-3}\NC\NR +\NC G-4\NC\MPp{G-4}\NC\MPx{G-4}\NC\MPy{G-4}\NC\MPw{G-4}\NC\MPh{G-4}\NC\MPd{G-4}\NC\NR +\HL +\stoptabulate + +The numbers represent the real pagenumber~$p$, the current position $(x,y)$, and +the dimensions of the box $(w,h,d)$ if known. These values are fed directly into +\METAPOST\ graphics but the individual components can be asked for by \type +{\MPp}, \type {\MPx}, \type {\MPy}, \type {\MPw}, \type {\MPh} and \type {\MPd}. + +In the previous definition of the graphic, we saw another macro, \type {\MPvar}. +When we invoke a graphic or attach a graphic to a layer, we can pass variables. +We can also set specific variables in other ways, as we will see later. + +\starttyping +\setMPpositiongraphic{G-1}{mypos:circle} +\setMPpositiongraphic{G-1}{mypos:line}{to=G-2} +\stoptyping + +In the second definition, we let the variable \type {to} point to another +position. When needed, we can ask for the value of \type {to} by \type +{\MPvar{to}}. For reasons of convenience, the current position is assigned +automatically to \type {from} and \type {self}. This means that in the line we +saw in the graphic: + +\starttyping +path p ; p := positionbox(texstr("self")) ; +\stoptyping + +\type {texstr("self")} will return the current position, which, fed to \type +{positionbox} will return a box with the right dimensions. We already warned the +reader: this is not an easy chapter. + +\stopsection + +\startsection[title={More layers}] + +\index{layers} + +\setupbackgrounds + [state=repeat] + +Overlays are one of the nicer features of \CONTEXT\ and even more nice things can +be build on top of them. Overlays are defined first and then assigned to framed +boxes using the \type {background} variable. + +You can stack overlays, which is why they are called as such. You can use the +special overlay called \type {foreground} to move the topmost (often text) layer +down in the stack. + +\starttabulate +\HL +\NC background overlay \NC a text, graphic, hyperlink or widget \NC \NR +\NC position overlay \NC a series of macros triggered by positions \NC \NR +\NC background layer \NC a box that can hold boxes with offsets \NC \NR +\HL +\stoptabulate + +The last kind of layer can be used in other situations as well, but in most cases +it will be hooked into a background overlay. + +\startbuffer +\definelayer[MyLayer][option=test] + +\setupbackgrounds[text][leftmargin][background=MyLayer] + +\setlayer[MyLayer][x=.5cm,y=5cm] + {\rotate{\framed{This goes to the background}}} +\stopbuffer + +\typebuffer \getbuffer \setuplayer[MyLayer][option=] % no frames + +In this case the framed text will be placed in the background of the (current) +page with the given offset to the topleft corner. Instead of a fixed position, +you can inherit the current position using the \type {position} directive. Say +that we have a layer called \type {YourLayer} which we put in the background of +the text area. + +\startbuffer +\definelayer[YourLayer] +\setupbackgrounds[text][text][background=YourLayer] +\stopbuffer + +\typebuffer \getbuffer + +We can now move some framed text to this layer using \type {\setlayer} with the +directive \type {position} set to \type {yes}. + +\startbuffer +here: \setlayer[YourLayer][position=yes]{\inframed{Here}} +\stopbuffer + +\typebuffer + +You can influence the placement by explicitly providing an offset (\type +{hoffset} and|/|or \type {voffset}), a position (\type {x} and|/|or \type {y}) or +a location directive (\type {location}). Normally you will use the offsets for +the layer as a whole and the positions for individual contributions. The next +example demonstrates the use of a location directive. + +\startbuffer +here: \setlayer[YourLayer][position=yes,location=c]{\inframed{Here}} +\stopbuffer + +\typebuffer \getbuffer + +Many layers can be in use at the same time. In the next example we put something +in the page layer. By default, we turn on position tracking, which visualizes the +bounding box of the content and shows the reference point. + +\startbuffer +\definelayer[BackLayer][position=yes] +\setupbackgrounds[page][background=BackLayer] +\stopbuffer + +\typebuffer \getbuffer + +\setupbackgrounds + [page] + [background={PageFrame,BackLayer,backgraphics,foreground,foregraphics}] + +Next we define an overlay that we can put behind for instance framed texts. We +use \METAPOST\ to draw \type {Shape}. + +\startbuffer +\defineoverlay[Shape] [BackLayer] [\uniqueMPgraphic{Shape}] + +\startuniqueMPgraphic{Shape} + path p ; p := fullcircle xyscaled(OverlayWidth,OverlayHeight) ; + fill p withcolor \MPcolor{lightgray} ; + draw p withpen pencircle scaled 1pt withcolor \MPcolor{darkred} ; +\stopuniqueMPgraphic +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer[def] +\defineframed[Shaped][background=Shape,frame=off,location=low] +\stopbuffer + +\getbuffer[def] + +We can now put this background shape behind the running text, for instance with: + +\startbuffer +.... some \inframed[background=Shape]{text} with a frame ... +.... some \Shaped{text} with a frame ... +\stopbuffer + +\typebuffer + +\startlines +\getbuffer +\stoplines + +The \type {\Shaped} macro was defined as: + +\typebuffer[def] + +Watch how the graphics are moved to the background while the frame of the first +text stays on top, since it remains part of the text flow. + +\startbuffer[def] +\setuplayer[BackLayer][direction=reverse] +\stopbuffer + +\getbuffer[def] + +\startlines +\getbuffer +\stoplines + +In the previous instance of the example we have reversed the stacking. Reversal +can be done with the \type {direction} directive. + +\typebuffer[def] + +% next series + +\startbuffer +\setuplayer + [BackLayer] + [position=no,corner=bottom,height=\paperheight] + +\setlayer[BackLayer][x=2cm,y=10cm,location=bl] + {\externalfigure[somecow.pdf][width=1cm]} + +\setlayer[BackLayer][x=1cm,y=8cm,location=br] + {\externalfigure[somecow.pdf][width=1cm]} + +\setlayer[BackLayer][x=2cm,y=4cm,location=tl] + {\externalfigure[somecow.pdf][width=1cm]} + +\setlayer[BackLayer][x=10cm,y=1cm,location=tr] + {\externalfigure[somecow.pdf][width=1cm]} +\stopbuffer + +You can influence the placement of a background component by using a different +anchor point. + +\typebuffer {\setuplayer[option=test]\getbuffer} + +\startbuffer[xx] +\setuplayer + [BackLayer] + [position=no,corner=bottom,height=\paperheight] + +\setlayer[BackLayer][x=15cm,y=5cm,location=bl] + {\externalfigure[somecow.pdf][width=3cm]} + +\setlayer[BackLayer][x=15cm,y=5cm,location=br] + {\externalfigure[somecow.pdf][width=3cm]} + +\setlayer[BackLayer][x=15cm,y=5cm,location=tl] + {\externalfigure[somecow.pdf][width=2cm]} + +\setlayer[BackLayer][x=15cm,y=5cm,location=tr] + {\externalfigure[somecow.pdf][width=2cm]} + +\setlayer[BackLayer][x=15cm,y=5cm,location=c] + {\externalfigure[somecow.pdf][width=3cm]} +\stopbuffer + +% \startpostponing + +Instead of using relative positions, you can also use absolute ones. Of course +you need to know how your coordinates relate to the rest of the layout +definition. + +\typebuffer[xx] + +These examples again demonstrate how we can influence the placement by assigning +an anchor point to \type {position}. Here we also put the reference point in the +lower left corner (\type {bottom}). This mechanism only works when we also use +\type {height}. + +{\setuplayer[option=test]\getbuffer[xx]} + +\page + +% \stoppostponing + +\setupbackgrounds + [page] + [background={PageFrame,DemoLayer,backgraphics,foreground,foregraphics}] + +\definelayer + [DemoLayer] + [position=yes] + +\startbuffer +\definelayer + [DemoLayer] + [position=yes] + +\startplacefigure[title={Demo 1}] + \ruledhbox\bgroup + \setlayerframed + [DemoLayer] [hoffset=-10mm,voffset=5mm] + {\startMPcode + fill fullcircle scaled 2cm withcolor .625red ; + \stopMPcode}% + \setlayerframed + [DemoLayer] [voffset=-10mm] + {\startMPcode + fill fullcircle scaled 2cm withcolor .625green ; + \stopMPcode}% + \setlayerframed + [DemoLayer] [hoffset=10mm,voffset=5mm] + {\startMPcode + fill fullcircle scaled 2cm withcolor .625blue ; + \stopMPcode}% + \egroup +\stopplacefigure +\stopbuffer + +\getbuffer + +One of the reasons for developing the layer mechanism was that we needed to +slightly change the position of figures in the final stage of typesetting. The +previous pages demonstrate how one can position anything anywhere on the page, +but in the case of figures the position may depend on where the text ends up on +the page. + +Normally, when you manipulate a document this way, you are in the final stage of +typesetting. You may qualify this as desk top publishing without actually using a +desktop. + +\typebuffer + +\startbuffer[demo] +\startbuffer +\setlayer [DemoLayer] + [position=yes, + voffset=-1.5cm, + width=3cm, + height=2cm] + {\MPfigure{somecow.pdf}{scaled .5 slanted .5}} +\stopbuffer + +\placefigure[right]{}{\ruledhbox{\getbuffer}} +\stopbuffer + +{\setuplayer[option=test]\getbuffer[demo]} + +The previous example also demonstrated the use of \METAPOST\ for rotating the +picture. The \type {\MPfigure} macro encapsulates the code in a shortcut. You can +achieve special effects by using the layers behind floating bodies and alike, but +always keep in mind that the readability of the text should not be violated too +much. + +\typebuffer[demo] + +In these examples we added a \type {\ruledhbox} around the pseudo graphics so +that you can see what the size is of those graphics. + +% summary + +We have already seen a lot of parameters that can be used to control the content +of a layer. There are a few more. General housekeeping takes place with: + +\starttabulate[|Tl|Tl|l|] +\HL +\NC state \NC start \NC enable the layer \NC \NR +\NC \NC stop \NC disable the layer \NC \NR +\NC position \NC no \NC use absolute positions \NC \NR +\NC \NC yes \NC use relative positions \NC \NR +\NC \NC overlay \NC idem, but ignore the size \NC \NR +\NC direction \NC normal \NC put new data on top \NC \NR +\NC \NC reverse \NC put new data below old data \NC \NR +\HL +\stoptabulate + +Sometimes all data needs to be offset in a similar way. You can use both offset +parameters for that. + +\starttabulate[|Tl|l|] +\HL +\NC hoffset \NC an additional horizontal displacement \NC \NR +\NC voffset \NC an additional vertical displacement \NC \NR +\HL +\stoptabulate + +You can position data anywhere in the layer. When positioning is turned on, the +current position will get a placeholder. You can change the dimensions of that +placeholder (when \type {position} is set to \type {overlay}), zero dimensions +are used. + +\starttabulate[|Tl|l|] +\HL +\NC x \NC the horizontal displacement \NC \NR +\NC y \NC the vertical displacement \NC \NR +\NC width \NC the (non natural) width \NC \NR +\NC height \NC the (non natural) height \NC \NR +\NC location \NC \tttf l r t b c lt lb rt rb \NC \NR +\HL +\stoptabulate + +The \type {location} directive determines what point of the data is used as +reference point. You can keep track of this point and the placement when you +enable test mode. This is how the rectangles in the previous examples were +drawn. + +\starttabulate[|Tl|Tl|l|] +\HL +\NC option \NC test \NC show positioning information \NC \NR +\HL +\stoptabulate + +When you are enhancing the final version of a document, you can explicitly +specify on what page the data will go. Use this option with care. + +\starttabulate[|Tl|l|] +\HL +\NC page \NC the page where the data will go \NC \NR +\HL +\stoptabulate + +Because layers can migrate to other pages, they may disappear due to the +background not being recalculated. In case of doubt, you can force repetitive +background calculation by: + +\starttyping +\setupbackgrounds[state=repeat] +\stoptyping + +% restore 'm + +\setupbackgrounds + [page] + [background={PageFrame,backgraphics,foreground,foregraphics}] + +\setupbackgrounds + [state=start] + +\stopsection + +\startsection[title={Complex text in graphics}] + +\index{text} + +If you like to embed \METAPOST\ snippets in \CONTEXT, you may want to combine +text and graphics and let \METAPOST\ provide the position and the dimensions of +the text to be typeset outside by \TEX. For most applications using the \METAFUN\ +\type {textext} macro works well enough, but when the typeset text needs to +communicate with the typesetting engine, for instance because it contains +hyperlinks or references, you can use the following method: + +\startitemize[packed] +\item define a layer +\item define a (reusable) graphic +\item put your text into the layer +\item combine the graphic with the text +\stopitemize + +You must be aware of the fact that when the layer is flushed, its content is +gone. You can take advantage of this by using the same graphic with multiple +texts. + +\startbuffer +\definelayer[test] +\stopbuffer + +\typebuffer \getbuffer + +You don't need to pass the width and height explicitly, but when you do so, you +have access to them later. + +\startbuffer +\startuseMPgraphic{oeps} + path p ; p := fullcircle scaled 6cm ; + fill p withcolor .8white ; + draw p withpen pencircle scaled 1mm withcolor .625red ; + register ("somepos-1",0cm,0cm,center currentpicture) ; + register ("somepos-2",3cm,1cm,(-1cm,-1cm)) ; + register ("somepos-3",2cm,0cm,(-2cm,2cm)) ; +\stopuseMPgraphic +\stopbuffer + +\typebuffer \getbuffer + +The \METAFUN\ \type {register} macro takes the following arguments: + +\starttyping +register ("tag",width,height,(x offset,y offset)) ; +\stoptyping + +The width and height are available in the macros \type {\MPlayerwidth} and \type +{\MPlayerheight} and are equivalent to \type {\MPw{tag}} and \type {\MPh{tag}}, + +\startbuffer +\setMPlayer [test] [somepos-1] [location=c] + {Does it work al right?} + +\setMPlayer [test] [somepos-2] + {\framed + [width=\MPlayerwidth,height=\MPlayerheight, + background=color,backgroundcolor=white] + {It Works!}} + +\setMPlayer [test] [somepos-3] + {\externalfigure[cow-fun.mps][width=2cm]} +\stopbuffer + +\typebuffer \getbuffer + +Combining the graphic and the text is handled by the macro \type {\getMPlayer}. + +\startbuffer +\getMPlayer [test] {\useMPgraphic{oeps}} +\stopbuffer + +\typebuffer \getbuffer + +The macro \type {\getMPlayer} is built on top of \type {\framed}. The settings +passed in the (optional) second argument are the same as those to \type +{\framed}. + +\starttyping +\getMPlayer + [test] + [frame=on,offset=5pt] + {\useMPgraphic{oeps}} +\stoptyping + +As you see, you need a bit of a twisted mind to handle graphics this way, but at +least the functionality is there to create complex graphics in a declarative way. + +\stopsection + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/metafun/metafun-reference.tex b/doc/context/sources/general/manuals/metafun/metafun-reference.tex new file mode 100644 index 000000000..6eb177949 --- /dev/null +++ b/doc/context/sources/general/manuals/metafun/metafun-reference.tex @@ -0,0 +1,659 @@ +% language=uk +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\startcomponent metafun-reference + +\environment metafun-environment + +\startchapter[reference=reference,title={Reference}] + +\startintro + +In this chapter, we will demonstrate most of the drawing related primitives and +macros as present in plain \METAPOST\ and \METAFUN\ extensions. + +If a path is shown and|/|or a transformation is applied, we show the original in +red and the transformed path or point in yellow. The small dark gray crosshair is +the origin and the black rectangle the bounding box. In some drawings, in light +gray we show the points that make up the path. + +This list describes traditional \METAPOST\ and the stable part of \METAFUN. As +\METAPOST\ evolves, new primitives are added but they are not always that +relevant to us. If you browse the \METAFUN\ sources you will for sure notice more +functionality than summarized here. Most of that is meant for usage in \CONTEXT\ +and not exposed to the user. Other macros are still somewhat experimental but +might become more official at some point. The same is true for \METAFUN\ +commands: not all make sense for daily usage and some are just there as helper +for additional modules. + +\stopintro + +\startsection[title={Paths}] + +\index{paths} + +\ShowSampleA {mc} {pair} {(1,.5)} +\ShowSampleA {mm} {pair .. pair} {(0,0)..(.75,0)..(1,.25)..(1,1)} +\ShowSampleA {mm} {pair ... pair} {(0,0)..(.75,0)...(1,.25)..(1,1)} +\ShowSampleA {mm} {pair -- pair\quad (a)} {(0,0)--(.75,0)--(1,.25)--(1,1)} +\ShowSampleA {mm} {pair -- pair\quad (b)} {(0,0)..(.75,0)--(1,.25)..(1,1)} +\ShowSampleA {mm} {pair --- pair} {(0,0)..(.75,0)---(1,.25)..(1,1)} + +\ShowSampleA {mm} {pair softjoin pair} {(0,0)..(.75,0) softjoin (1,.25)..(1,1)} +\ShowSampleA {mp} {controls pair} {(0,0)..controls (.75,0)..(1,1)} +\ShowSampleA {mp} {controls pair and pair} {(0,0)..controls (.75,0) and (1,.25)..(1,1)} +\ShowSampleA {mp} {tension numeric} {(0,0)..(.75,0)..tension 2.5..(1,.25)..(1,1)} +\ShowSampleA {mp} {tension num.. and num..} {(0,0)..(.75,0)..tension 2.5 and 1.5..(1,.25)..(1,1)} +\ShowSampleA {mp} {tension atleast numeric} {(0,0)..(.75,0)..tension atleast 1..(1,.25)..(1,1)} + +\ShowSampleA {mp} {cycle} {(0,0)--(1,0)--(1,1)--cycle} +\ShowSampleA {mp} {curl numeric} {(0,0){curl 1}..(.75,0)..(1,.25)..(1,1)} +\ShowSampleA {mp} {dir numeric} {(0,0){dir 30}..(1,1)} +\ShowSampleA {mm} {left} {(0,0){left}..(1,1)} +\ShowSampleA {mm} {right} {(0,0){right}..(1,1)} +\ShowSampleA {mm} {up} {(0,0){up}..(1,1)} +\ShowSampleA {mm} {down} {(0,0){down}..(1,1)} + +\ShowSampleA {mp} {path \& path} {(0,0)..(.75,.25) \& (.75,.25)..(1,1)} + +\ShowSampleA {mv} {unitvector} {origin--unitvector(1,1)} +\ShowSampleA {mp} {dir} {origin--dir(45)} +\ShowSampleA {mp} {angle} {origin--dir(angle(1,1))} + +\ShowSampleA {mv} {fullcircle} {fullcircle} +\ShowSampleA {fv} {unitcircle} {unitcircle} +\ShowSampleA {fv} {fullsquare} {fullsquare} +\ShowSampleA {mv} {unitsquare} {unitsquare} +\ShowSampleA {fv} {fulltriangle}{fulltriangle} +\ShowSampleA {fv} {unittriangle}{unittriangle} +\ShowSampleA {fv} {fulldiamond} {fulldiamond} +\ShowSampleA {fv} {unitdiamond} {unitdiamond} + +\ShowSampleA {mv} {halfcircle} {halfcircle} +\ShowSampleA {mv} {quartercircle} {quartercircle} + +\ShowSampleA {fv} {llcircle} {llcircle} +\ShowSampleA {fv} {lrcircle} {lrcircle} +\ShowSampleA {fv} {urcircle} {urcircle} +\ShowSampleA {fv} {ulcircle} {ulcircle} +\ShowSampleA {fv} {tcircle} {tcircle} +\ShowSampleA {fv} {bcircle} {bcircle} +\ShowSampleA {fv} {lcircle} {lcircle} +\ShowSampleA {fv} {rcircle} {rcircle} + +\ShowSampleA {fv} {triangle} {triangle} +\ShowSampleA {fv} {righttriangle} {righttriangle} +\ShowSampleA {fv} {uptriangle} {uptriangle} +\ShowSampleA {fv} {lefttriangle} {lefttriangle} +\ShowSampleA {fv} {downtriangle} {downtriangle} + +\ShowSampleA {fv} {lltriangle} {lltriangle} +\ShowSampleA {fv} {lrtriangle} {lrtriangle} +\ShowSampleA {fv} {urtriangle} {urtriangle} +\ShowSampleA {fv} {ultriangle} {ultriangle} + +\ShowSampleA {mm} {flex(pair,pair,pair)} + {flex ((0,0),(1,1),(1,0))} +\ShowSampleA {mm} {superellipse(pair,p..,p..,p..,num..)} + {superellipse((1,.5),(.5,1),(0,.5),(.5,0),.75)} + +\ShowSampleA {fm} {path smoothed numeric/pair} {unitsquare scaled 1.5 smoothed .2} +\ShowSampleA {fm} {path cornered numeric/pair} {lltriangle scaled 1.5 cornered .2} +\ShowSampleA {fm} {path superellipsed numeric} {unitsquare scaled 1.5 superellipsed .75} +\ShowSampleA {fm} {path randomized numeric/pair} {unitsquare scaled 1.5 randomized (.2,.2)} +\ShowSampleA {fm} {path randomizedcontrols numeric/pair} {fullcircle scaled 1.5 randomizedcontrols (.2,.2)} +\ShowSampleA {fm} {path squeezed numeric/pair} {unitsquare scaled 1.5 squeezed (.2,.1)} +\ShowSampleA {fm} {path snapped numeric/pair} {fullcircle scaled 1.5 snapped (.2,.1)} + +\ShowSampleB {fm} {punked path} + {unitcircle scaled 1.5} + {punked unitcircle scaled 1.5} + +\ShowSampleB {fm} {curved path} + {((0,0)--(.2,1)--(1,.2)--cycle)} + {curved ((0,0)--(.2,1)--(1,.2)--cycle)} + +\ShowSampleB {fm} {laddered path} + {((0,0)--(1.4,.8)--(2.8,1.2)--(6.2,1.6))} + {laddered ((0,0)--(1.4,.8)--(2.8,1.2)--(6.2,1.6))} + +\ShowSampleB {fm} {path paralleled distance} + {((0,0)--(5,1))} + {((0,0)--(5,1)) paralleled .25} + +\ShowSampleB {fm} {shortened path} + {((0,0)--(6,1))} + {((0,0)--(6,1)) shortened 1} + +\ShowSampleB {fm} {unspiked path} + {((0,0)--(1,0)--(1,1)--(2,1)--(1,1)--(0,1)) shifted (-3,0)} + {unspiked ((0,0)--(1,0)--(1,1)--(2,1)--(1,1)--(0,1))} + +\ShowSampleB {fm} {simplified path} + {((0,0)--(1,0)--(2,0)--(2,1)--(0,1)--cycle) shifted (-3,0)} + {simplified ((0,0)--(1,0)--(2,0)--(2,1)--(0,1)--cycle)} + +\ShowSampleB {fm} {path blownup numeric/pair} + {fullcircle scaled 1.5} + {(fullcircle scaled 1.5) blownup .1} + +\ShowSampleB {fm} {path stretched numeric/pair\quad (a)} + {fullcircle scaled 1.5} + {(fullcircle scaled 1.5) stretched (1.1,0.8)} + +\ShowSampleB {fm} {path stretched numeric\quad (b)} + {((0,0)--(1,1))} + {((0,0)--(1,1)) stretched 1.5} + +\ShowSampleB {fm} {path xstretched numeric} + {fullcircle} + {fullcircle xstretched 5} + +\ShowSampleB {fm} {path ystretched numeric} + {fullcircle} + {fullcircle ystretched 1.5} + +\ShowSampleB {fm} {path enlonged numeric} + {((0,0)--(1,1))} + {((0,0)--(1,1)) enlonged 1.5} + +\ShowSampleB {fm} {path shorted numeric} + {((0,0)--(2,2))} + {((0,0)--(2,2)) shortened 0.5} + +\ShowSampleA {fm} {roundedsquare(num..,num..,num..)} + {roundedsquare(2,1,.2)} + +\ShowSampleA {fm} {tensecircle(num..,num..,num..)} + {tensecircle(2,1,.2)} + +\ShowSampleA {fm} {pair crossed size} + {origin crossed 1} + +\ShowSampleA {fm} {path crossed size} + {fullcircle scaled 2 crossed .5} + +\ShowSampleA {fm} {(constructed)function} + {constructedfunction("--")("x","sin(x)",0,2pi,pi/10)} + +\ShowSampleA {fm} {curvedfunction} + {curvedfunction("x","sin(x)",0,2pi,pi/10)} + +\ShowSampleA {fm} {straightfunction} + {straightfunction("x","sin(x)",0,2pi,pi/10)} + +\ShowSampleA {fm} {constructedpath} + {constructedpath("..")((0,0),(1,2),(2,1),(3,2))} + +\ShowSampleA {fm} {curvedpath} + {curvedpath((0,0),(1,2),(2,1),(3,2))} + +\ShowSampleA {fm} {straightpath} + {straightpath((0,0),(1,2),(2,1),(3,2))} + +\ShowSampleA {fm} {leftarrow} + {leftarrow(fullcircle,3,2)} + +\ShowSampleA {fm} {rightarrow} + {rightarrow(fullcircle,3,2)} + +\ShowSampleA {fm} {centerarrow} + {centerarrow(fullcircle,3,2)} + +\ShowSampleX {fm} {arrowhead} {draw arrowhead fullcircle} +\ShowSampleX {fm} {arrowpath} {draw arrowpath fullcircle} + +\ShowSampleA {mm} {buildcycle} + {buildcycle(fullcircle,fullsquare)} + +\ShowSampleA {fm} {circularpath} {circularpath(4)} +\ShowSampleA {fm} {squarepath} {squarepath(4)} +\ShowSampleA {fm} {linearpath} {linearpath(4)} + +\stopsection + +\startsection[title={Transformations}] + +\index{transformations} + +\ShowSampleB {mp} {path scaled numeric} {fullcircle} {fullcircle scaled .50} +\ShowSampleB {mp} {path xscaled numeric} {fullcircle} {fullcircle xscaled .25} +\ShowSampleB {mp} {path yscaled numeric} {fullcircle} {fullcircle yscaled .25} +\ShowSampleB {mp} {path zscaled pair} {fullcircle} {fullcircle zscaled (2,.25)} +\ShowSampleB {mp} {path xyscaled numeric/pair} {fullcircle} {fullcircle xyscaled (.5,.7)} +\ShowSampleB {mp} {path xyscaled pair} {fullcircle} {fullcircle xyscaled (2,.25)} +\ShowSampleB {mp} {path shifted pair} {fullcircle} {fullcircle shifted (2,.25)} + +\ShowSampleB {fm} {path leftenlarged numeric} {fullsquare} {fullsquare leftenlarged .25} +\ShowSampleB {fm} {path topenlarged numeric} {fullsquare} {fullsquare topenlarged .25} +\ShowSampleB {fm} {path rightenlarged numeric} {fullsquare} {fullsquare rightenlarged .25} +\ShowSampleB {fm} {path bottomenlarged numeric} {fullsquare} {fullsquare bottomenlarged .25} + +\ShowSampleB {fm} {path enlarged numeric} {fullcircle} {fullcircle enlarged .25} +\ShowSampleB {fm} {path enlarged pair} {fullcircle} {fullcircle enlarged (1,.25)} +\ShowSampleB {fm} {path llenlarged numeric} {fullcircle} {fullcircle llenlarged .25} +\ShowSampleB {fm} {path lrenlarged numeric} {fullcircle} {fullcircle lrenlarged .25} +\ShowSampleB {fm} {path urenlarged numeric} {fullcircle} {fullcircle urenlarged .25} +\ShowSampleB {fm} {path ulenlarged numeric} {fullcircle} {fullcircle ulenlarged .25} +\ShowSampleB {fm} {path llenlarged pair} {fullcircle} {fullcircle llenlarged (1,.25)} +\ShowSampleB {fm} {path lrenlarged pair} {fullcircle} {fullcircle lrenlarged (1,.25)} +\ShowSampleB {fm} {path urenlarged pair} {fullcircle} {fullcircle urenlarged (1,.25)} +\ShowSampleB {fm} {path ulenlarged pair} {fullcircle} {fullcircle ulenlarged (1,.25)} +\ShowSampleB {fm} {path llmoved numeric} {fullcircle} {fullcircle llmoved .25} +\ShowSampleB {fm} {path lrmoved numeric} {fullcircle} {fullcircle lrmoved .25} +\ShowSampleB {fm} {path urmoved numeric} {fullcircle} {fullcircle urmoved .25} +\ShowSampleB {fm} {path ulmoved numeric} {fullcircle} {fullcircle ulmoved .25} +\ShowSampleB {fm} {path llmoved pair} {fullcircle} {fullcircle llmoved (1,.25)} +\ShowSampleB {fm} {path lrmoved pair} {fullcircle} {fullcircle lrmoved (1,.25)} +\ShowSampleB {fm} {path urmoved pair} {fullcircle} {fullcircle urmoved (1,.25)} +\ShowSampleB {fm} {path ulmoved pair} {fullcircle} {fullcircle ulmoved (1,.25)} +\ShowSampleB {mp} {path slanted numeric} {fullcircle} {fullcircle slanted .5} +\ShowSampleB {mp} {path rotated numeric} {fullsquare} {fullsquare rotated 45} + +\ShowSampleB {mm} {path rotatedaround(pair,numeric)} {fullsquare} {fullsquare rotatedaround((.25,.5),45)} +\ShowSampleB {mm} {path reflectedabout(pair,pair)} {fullcircle} {fullcircle reflectedabout((.25,-1),(.25,+1))} +\ShowSampleB {mp} {reverse path} {fullcircle} {reverse fullcircle shifted(.5,0)} +\ShowSampleB {mm} {counterclockwise path} {fullcircle} {counterclockwise fullcircle shifted(.5,0)} +\ShowSampleB {mm} {tensepath path} {fullcircle} {tensepath fullcircle} + +\ShowSampleB {mp} {subpath (numeric,numeric) of path} {fullcircle} {subpath (1,5) of fullcircle} +\ShowSampleB {mm} {path cutbefore pair} {fullcircle} {fullcircle cutbefore point 3 of fullcircle} +\ShowSampleB {mm} {path cutafter pair} {fullcircle} {fullcircle cutafter point 3 of fullcircle} +\ShowSampleB {mm} {path cutends .1} {fullcircle} {fullcircle cutends .5} + +\ShowSampleC {mp} {llcorner path} {fullcircle} {llcorner fullcircle} +\ShowSampleC {mp} {lrcorner path} {fullcircle} {lrcorner fullcircle} +\ShowSampleC {mp} {urcorner path} {fullcircle} {urcorner fullcircle} +\ShowSampleC {mp} {ulcorner path} {fullcircle} {ulcorner fullcircle} +\ShowSampleC {mm} {center path} {fullcircle} {center fullcircle} + +\ShowSampleD {fm} {boundingbox path} {fullcircle} {boundingbox fullcircle} +\ShowSampleD {fm} {boundingcircle path} {fullsquare} {boundingcircle fullsquare} +\ShowSampleD {fm} {innerboundingbox path} {fullcircle} {innerboundingbox fullcircle} +\ShowSampleD {fm} {outerboundingbox path} {fullcircle} {outerboundingbox fullcircle} + +\ShowSampleDD {fm} {bottomboundary path} {fullcircle} {bottomboundary fullcircle} +\ShowSampleDD {fm} {leftboundary path} {fullcircle} {leftboundary fullcircle} +\ShowSampleDD {fm} {topboundary path} {fullcircle} {topboundary fullcircle} +\ShowSampleDD {fm} {rightboundary path} {fullcircle} {rightboundary fullcircle} + +\ShowSampleP {fm} {bbwidth path} {draw textext(decimal bbwidth (fullcircle xscaled 100 yscaled 200))} +\ShowSampleP {fm} {bbwidth path} {draw textext(decimal bbheight (fullcircle xscaled 100 yscaled 200))} + +\ShowSampleE {fm} {path/picture xsized numeric} {xsized 3cm} {currentpicture xsized 5cm} +\ShowSampleE {fm} {path/picture ysized numeric} {ysized 2cm} {currentpicture ysized 2cm} +\ShowSampleE {fm} {path/picture xysized numeric} {xysized (3cm,2cm)} {currentpicture xysized (3cm,2cm)} + +\ShowSampleP {fm} + {area path} + {draw area ((0,10)--(20,20)--(30,5)--(40,10)--(50,5)--(60,5))} + +\ShowSampleT {mp} + {setbounds picture} + {draw fullcircle ; setbounds currentpicture to unitsquare} + {draw fullcircle scaled .5 InGray; setbounds currentpicture to unitsquare scaled .5} + +\ShowSampleT {mm} + {clip path} + {fill fullcircle ; clip currentpicture to fullsquare scaled 0.9} + {fill fullcircle scaled 1 InRed ; clip currentpicture to fullsquare scaled 0.9} + +\ShowSampleT {mm} + {path peepholed path} + {fill (fullcircle peepholed fullsquare)} + {fill (fullcircle peepholed fullsquare) InRed} + +\ShowSampleT {fm} + {anchored} + {draw anchored.urt(textext("ll"),origin)} + {draw anchored.urt(textext("ll") xsized (5mm/Scale),origin) InRed ;} + +% \ShowSampleT {fm} +% {autoalign} +% {draw textext.autoalign(260)("260")} +% {draw textext.autoalign(260)("260")} + +% draw textext.autoalign(260)("\strut oeps 3") ; + +\ShowSampleX {fm} + {path crossingunder path} + {draw (fullsquare rotated 45) crossingunder fullsquare} + +\stopsection + +\startsection[title={Points}] + +\index{points} + +%ShowSampleF {mp} {center path} {fullcircle} {center fullcircle} +\ShowSampleF {mm} {top pair} {fullcircle} {top center fullcircle} +\ShowSampleF {mm} {bot pair} {fullcircle} {bot center fullcircle} +\ShowSampleF {mm} {lft pair} {fullcircle} {lft center fullcircle} +\ShowSampleF {mm} {rt pair} {fullcircle} {rt center fullcircle} +\ShowSampleF {mp} {point numeric of path} {fullcircle} {point 2 of fullcircle} +\ShowSampleF {fm} {point numeric on path} {fullcircle} {point .5 on fullcircle} +\ShowSampleF {fm} {point numeric along path} {fullcircle} {point 1cm along fullcircle} +\ShowSampleF {mp} {precontrol numeric of path} {fullcircle} {precontrol 2 of fullcircle} +\ShowSampleF {mp} {postcontrol numeric of path} {fullcircle} {postcontrol 2 of fullcircle} +\ShowSampleF {mp} {directionpoint pair of path} {fullcircle} {directionpoint (2,3) of fullcircle} + +\ShowSampleG {mc} {numeric[pair,pair]} {(1,1)} {.5[(0,0),(1,1)]} + +\ShowSampleH {mm} {path intersectionpoint path} {fullcircle} {fulldiamond} + {fullcircle intersectionpoint fulldiamond} + +\ShowSampleHH {mm} {interpath(numeric,path,path} + {interpath(.8,fullcircle,fullsquare)} + +\ShowSampleHH {fm} {interpolated(numeric,path,path} + {interpolated(.8,fullcircle,fullsquare)} + +\ShowSampleO {mm} {right} {draw left} +\ShowSampleO {mm} {up} {draw up} +\ShowSampleO {mm} {left} {draw left} +\ShowSampleO {mm} {down} {draw down} + +\stopsection + +\startsection[title={Colors}] + +\index{colors} + +\ShowSampleI {mp} {withcolor rgbcolor} {withcolor (.625,0,0)} +\ShowSampleI {mp} {withrgbcolor rgbcolor} {withrgbcolor (.625,0,0)} +\ShowSampleI {mp} {withcmykcolor cmykcolor} {withcmykcolor (.375,0,0,0)} +\ShowSampleI {mp} {withgray / withgrey numeric} {withgray .625} +\ShowSampleI {mp} {withcolor namedcolor} {withcolor namedcolor("darkblue")} +\ShowSampleI {mp} {withcolor spotcolor} {withcolor spotcolor("tempone",red/2)} +\ShowSampleI {mp} {withcolor multitonecolor} {withcolor .2 * multitonecolor("temptwo",blue/2,yellow/3)} + +Remark: at the time of this writing only Acrobat shows spot- and multitonecolors +properly. Possible indications of a viewing problem are factors not being applied +(in the page stream) or colors that are way off. + +\ShowSampleU {mp} {red} {fill fullcircle scaled 2 withcolor red/2} +\ShowSampleU {mp} {green} {fill fullcircle scaled 2 withcolor green/2} +\ShowSampleU {mp} {blue} {fill fullcircle scaled 2 withcolor blue/2} +\ShowSampleU {mp} {cyan} {fill fullcircle scaled 2 withcolor cyan/2} +\ShowSampleU {mp} {magenta} {fill fullcircle scaled 2 withcolor magenta/2} +\ShowSampleU {mp} {yellow} {fill fullcircle scaled 2 withcolor yellow/2} +\ShowSampleU {mp} {black} {fill fullcircle scaled 2 withcolor black/2} +\ShowSampleU {mp} {white} {fill fullcircle scaled 2 withcolor white/2} + +\ShowSampleU {mp} {blackcolor} {fill fullcircle withcolor blackcolor red} + +%ShowSampleI {fm} {withcolor cmyk(c,m,y,k)} {withcolor cmyk(0,.625,.625,0)} +%ShowSampleI {fm} {withcolor transparent(n.m,color)} {withcolor transparent(1,.625,red)} + +\ShowSampleI {fm} {withtransparency(num,num)} {withcolor red withtransparency (1,.625)} + +% \ShowSampleZ {fm} {withshade numeric} {Shades need to be declared before they can be (re)used.} + +\startMPinclusions + defineshade cshade withshademethod "circular" ; + defineshade lshade withshademethod "linear" ; +\stopMPinclusions + +\ShowSampleW {fm} {shaded someshade } + {fill fullsquare shaded lshade} + {fill fullsquare scaled 2cm shaded lshade} + +This assumes the definition: + +\starttyping +defineshade lshade withshademethod "linear" ; +\stoptyping + +\ShowSampleW {fm} {shaded someshade} + {fill fullcircle shaded cshade} + {fill fullcircle scaled 2cm shaded cshade} + +This assumes the definition: + +\starttyping +defineshade cshade withshademethod "circular" ; +\stoptyping + +% withshadefactor 1 +% withshadedomain (0,1) +% withshadecolors (black,white) +% withtransparency (1,.5) + +% \startMPcode +% fill fullcircle scaled 3cm +% shaded myshade +% withshadefactor 0.7 +% ; +% \stopMPcode + +% \startMPcode +% fill fullcircle scaled 3cm +% shaded myshade +% withshadecolors (red,green) +% withshadefactor 1 +% withtransparency (1,.75) +% ; +% \stopMPcode + +% \startMPcode +% fill fullcircle scaled 3cm +% shaded myshade ; +% withshadefactor 1 +% withshadedomain (0,1) +% withshadecolors (green,blue) +% withtransparency (1,.5) +% ; +% \stopMPcode + +% \startMPcode +% fill fullcircle scaled 3cm +% shaded myshade ; +% withshadefactor 1 +% withshadedomain (0,1) +% withcolor blue shadedinto yellow +% withtransparency (1,.5) +% ; +% \stopMPcode + +\ShowSampleV {mp} + {basiccolors} + {for i=0 upto 21 : fill ... withcolor basiccolors[i] ; endfor} + {for i=0 upto 21 : fill fullcircle shifted (i,0) withcolor basiccolors[i] ; endfor} + +\stopsection + +\startsection[title={Attributes}] + +\index{attributes} + +\ShowSampleII {mp} {dashed withdots} {dashed withdots} +\ShowSampleII {mp} {dashed evenly} {dashed evenly} +\ShowSampleII {mp} {dashed oddly} {dashed oddly} +\ShowSampleII {mp} {dashpattern} {dashed dashpattern (on .1 off .2 on .3 off .4)} +\ShowSampleII {mp} {undashed} {dashed evenly undashed} + +\ShowSampleJ {mm} {pencircle transform} {pencircle} +\ShowSampleJ {mm} {pensquare transform} {pensquare} +\ShowSampleJ {mm} {penrazor transform} {penrazor} +\ShowSampleK {mm} {penspeck transform} {penspeck} + +\ShowSampleL {mm} {draw} {fullcircle} +\ShowSampleL {mm} {fill} {fullcircle} +\ShowSampleL {mm} {filldraw} {fullcircle} +\ShowSampleL {mm} {drawfill} {fullcircle} +\ShowSampleL {mm} {drawdot} {origin} +\ShowSampleL {mm} {drawarrow} {fullcircle} +\ShowSampleL {mm} {drawdblarrow} {fullcircle} + +\ShowSampleL {fm} {eofill} {fullcircle} + +\ShowSampleM {mm} {undraw} {fullcircle} +\ShowSampleM {mm} {unfill} {fullcircle} +\ShowSampleM {mm} {unfilldraw} {fullcircle} +\ShowSampleM {mm} {undrawfill} {fullcircle} +\ShowSampleM {mm} {undrawdot} {origin} + +\ShowSampleQ {mm} {cutdraw} {origin--(1,1)} + +\ShowSampleN {mv} {butt} {linecap := butt} {(0,.5)--(.5,0)--(1,1)} +\ShowSampleN {mv} {rounded} {linecap := rounded} {(0,.5)--(.5,0)--(1,1)} +\ShowSampleN {mv} {squared} {linecap := squared} {(0,.5)--(.5,0)--(1,1)} + +\ShowSampleN {mv} {mitered} {linejoin := mitered} {(0,.5)--(.5,0)--(1,1)} +\ShowSampleN {mv} {rounded} {linejoin := rounded} {(0,.5)--(.5,0)--(1,1)} +\ShowSampleN {mv} {beveled} {linejoin := beveled} {(0,.5)--(.5,0)--(1,1)} + +\ShowSampleR {fm} {inverted picture} {inverted currentpicture} +\ShowSampleR {fm} {picture uncolored color} {currentpicture uncolored green} +\ShowSampleR {fm} {picture softened numeric} {currentpicture softened .8} +\ShowSampleR {fm} {picture softened color} {currentpicture softened (.7,.8,.9)} +\ShowSampleR {fm} {grayed picture} {grayed currentpicture} + +\stopsection + +\startsection[title={Text}] + +\index{text} + +\ShowSampleO {mm} {label} {label("MetaFun",origin)} +\ShowSampleO {mm} {label.top} {label.top("MetaFun",origin)} +\ShowSampleO {mm} {label.bot} {label.bot("MetaFun",origin)} +\ShowSampleO {mm} {label.lft} {label.lft("MetaFun",origin)} +\ShowSampleO {mm} {label.rt} {label.rt("MetaFun",origin)} +\ShowSampleO {mm} {label.llft} {label.llft("MetaFun",origin)} +\ShowSampleO {mm} {label.lrt} {label.lrt("MetaFun",origin)} +\ShowSampleO {mm} {label.urt} {label.urt("MetaFun",origin)} +\ShowSampleO {mm} {label.ulft} {label.ulft("MetaFun",origin)} + +\ShowSampleW {mp} {dotlabel} + {dotlabel.bot("\tttf metafun",(2cm,1cm))} + {dotlabel.bot("\tttf metafun",(2cm,1cm))} + +\ShowSampleW {mp} {dotlabels + range .. thru ..} + {z1 = ... ; dotlabels.bot(range 1 thru 3)} + {z1=(0,0); z2=(10mm,10mm); z3=(20mm,15mm); ; z4=(30mm,5mm); dotlabels.bot(range 1 thru 4)} + +\ShowSampleW {mp} {labels + range .. thru ..} + {z1 = ... ; labels.bot(range 1 thru 3)} + {z1=(0,0); z2=(10mm,10mm); z3=(20mm,15mm); ; z4=(30mm,5mm); labels.bot(range 1 thru 4)} + +\ShowSampleQQ {fm} + {thelabel(string,pair)} + {draw thelabel("MetaFun",(2cm,0))} + +\ShowSampleQQ {fm} + {formatted(string)} + {draw textext(formatted("@0.5f",1.234))} + +\ShowSampleQQ {fm} + {format(string) : graph package} + {draw textext(format("@5E-2",1.234))} + +\ShowSampleP {mp} + {btex text etex} + {draw btex MetaTeX etex} + +\ShowSampleQQ {fm} + {textext(string)} + {draw textext("MetaFun")} + +\ShowSampleQQ {fm} + {thetextext(string,pair)} + {draw thetextext("MetaFun",(2cm,0))} + +% \ShowSampleQQ {fm} +% {graphictext string ...} +% {graphictext "MetaFun"} + +\ShowSampleQQQ {fm} + {outlinetext.d("string")(d)} + {draw outlinetext.d("MetaFun")(InRed)} + +\ShowSampleQQQ {fm} + {outlinetext.f("string")(f)} + {draw outlinetext.f("MetaFun")(InYellow)} + +\ShowSampleQQQ {fm} + {outlinetext.b("string")(f)(d)} + {draw outlinetext.b("MetaFun")(InYellow)(InRed)} + +\ShowSampleQQQ {fm} + {outlinetext.r("string")(d)(f)} + {draw outlinetext.r("MetaFun")(InRed)(InYellow)} + +\ShowSampleUU {fm} + {outlinetext.p("string")} + {draw outlinetext.p("MetaFun")} + +\stopsection + +\startsection[title={Control}] + +\index{loops} + +\ShowSampleU {mp} {for (positive step) until} {for i=0 step 2 until 8: drawdot (i,0) ; endfor} +\ShowSampleU {mp} {for (negative step) until} {for i=6 step -2 until 0: drawdot (i,0) ; endfor} +\ShowSampleU {mm} {for upto} {for i=0 upto 12: drawdot (i,0) ; endfor} +\ShowSampleU {mm} {for downto} {for i=10 downto 0: drawdot (i,0) ; endfor} +\ShowSampleU {mm} {forsuffixes} {forsuffixes i=1,4,6,12: drawdot (i,0) ; endfor} + +\stopsection + +\startsection[title={Graphics}] + +\index{graphics} + +\ShowSampleS {fm} + {loadfigure string number numeric ...} + {loadfigure "mycow.mp" number 1 scaled .25} + +\ShowSampleS {fm} + {externalfigure string ...} + {draw externalfigure "mycow.pdf" scaled 3cm} + +\ShowSampleT {fm} {addbackground text} + {addbackground withcolor .625 yellow} + {fill fullcircle xyscaled (2,1) InRed; addbackground InYellow} + +\ShowSampleQQ {mm} {image (text)} + {draw image(draw fullcircle) xscaled 4cm yscaled 1cm} + +\ShowSampleT {mm} {decorated (text) text} + {draw decorated (....) withcolor red} + {draw decorated (fill fullcircle) InRed} + +\ShowSampleT {mm} {undecorated (text) text} + {draw undecorated (.... withcolor yellow) withcolor red} + {draw undecorated (fill fullcircle InYellow) InRed} + +\ShowSampleT {mm} {redecorated (text) text} + {draw redecorated (.... withcolor yellow) withcolor red} + {draw redecorated (fill fullcircle InYellow) InRed} + +\ShowSampleS {mm} + {bitmapimage (w,h,data)} + {draw bitmapimage (2,2,"114477AA") rotated 15 scaled 4cm} + +\ShowSampleT {mm} + {withmask string} + {draw externalfigure "m-1.png" scaled 2cm withmask "m-2.png"} + {Scale := 1 ; + draw externalfigure "m-2.png" scaled 2cm shifted (-3cm,0) ; + draw externalfigure "m-1.png" scaled 2cm shifted (-6cm,0) ; + draw externalfigure "m-1.png" scaled 2cm withmask "m-2.png"} + +\stopsection + +\stopchapter + +\stopcomponent + +%% draw leftpath fullcircle scaled 1cm withpen pencircle scaled 1mm withcolor .625red ; +%% draw reverse leftpath (reverse fullcircle scaled 2cm) withpen pencircle scaled 1mm withcolor .625yellow ; +%% draw rightpath fullcircle scaled 3cm withpen pencircle scaled 1mm withcolor .625white ; +%% +%% path p ; p := (0,0) .. (1,2) .. cycle ; +%% draw leftpath p scaled 1cm withpen pencircle scaled 1mm withcolor .625red ; +%% draw reverse leftpath (reverse p scaled 2cm) withpen pencircle scaled 1mm withcolor .625yellow ; +%% draw rightpath p scaled 3cm withpen pencircle scaled 1mm withcolor .625white ; diff --git a/doc/context/sources/general/manuals/metafun/metafun-sneaky.tex b/doc/context/sources/general/manuals/metafun/metafun-sneaky.tex new file mode 100644 index 000000000..02c502cf0 --- /dev/null +++ b/doc/context/sources/general/manuals/metafun/metafun-sneaky.tex @@ -0,0 +1,60 @@ +% language=uk +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\startcomponent metafun-conventions + +\environment metafun-environment + +\startchapter[title={Conventions}] + +\startsection[title={Suffixes}] + +One characteristic of using \METAFUN\ in \CONTEXT\ is that it is basically one +long run. The code snippets become figures that then get converted to \PDF\ and +embedded. If text is involved, each figure is actually processed twice, once to +identify what needs to be typeset, and once with the result(ing metrics). +Normally that gets unnoticed. You can check for the state by consulting the +boolean \type {mfun_trial_run}. + +A consequence of the one run cq.\ multiple runs is that you need to be careful with +undefined or special variables. Consider the following: + +\starttyping +vardef foo@#(text t) = + save s ; string s ; s := str @# ; + if length(s) > 0 : + textext(s) + else : + nullpicture + fi +enddef ; +\stoptyping + +The following works ok in the first run when bar is undefined: + +\starttyping +draw foo.bar("a") ; +\stoptyping + +But if afterwards we say: + +\starttyping +vardef bar(expr x) = + 123 +enddef ; +\stoptyping + +and expand \type {foo.bar} again we will get an error message because this time +\type {bar} expands. Suffixes are always expanded! + +The lesson is: when you get unexpected results or errors, check your variable +definitions. You can use the \type {begingroup} and \type {endgroup} primitives +to protect your variables but then you also need to explicitly use \type {save} +to store their meanings and allocate new ones after that inside the group. + +\stopsection + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/metafun/metafun-styles.tex b/doc/context/sources/general/manuals/metafun/metafun-styles.tex new file mode 100644 index 000000000..f82359117 --- /dev/null +++ b/doc/context/sources/general/manuals/metafun/metafun-styles.tex @@ -0,0 +1,445 @@ +% language=uk +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\startcomponent metafun-styles + +\environment metafun-environment + +\startchapter[title={Defining styles}] + +\index {layout} +\index {styles} + +\startintro + +Since the integration of \METAPOST\ into \CONTEXT, a complete new range of layout +fetaures became available. In this document we have introduced several ways to +include graphics in your document definition. In this chapter we go one step +further and make dynamic graphics part of a document style. + +\stopintro + +\startsection[title={Adaptive buttons}] + +So far we have seen a lot of graphic ingredients that you can use to make your +documents more attractive. In this chapter we will define a simple document +style. This style was written for the \PDFTEX\ presentations at the TUG 2000 +conference in Oxford (UK). + +This style exploits a few tricks, like graphics calculated using positional +information. It also demonstrates how you can make menu buttons that dynamically +adapt their shapes to the rest of the page layout. + +\startbuffer[screens] +\startlinecorrection[blank] +\setupcombinations[distance=.0125\textwidth] +\startcombination[5*1] + {\typesetfile[mfun-77\ScrNum.tex][page=1,width=.19\textwidth]} {page 1} + {\typesetfile[mfun-77\ScrNum.tex][page=2,width=.19\textwidth]} {page 2} + {\typesetfile[mfun-77\ScrNum.tex][page=3,width=.19\textwidth]} {page 3} + {\typesetfile[mfun-77\ScrNum.tex][page=4,width=.19\textwidth]} {page 4} + {\typesetfile[mfun-77\ScrNum.tex][page=5,width=.19\textwidth]} {page 5} +\stopcombination +\stoplinecorrection +\stopbuffer + +\def\ScrNum{1} \getbuffer[screens] + +Later we will see an instance with some more randomness in the graphics. While +writing this style, the random alternative made me think of those organic +buildings with non equal windows |<|we have a few of those in The Netherlands|>|, +so I decided to label this style as \type {pre-organic}. If you use \CONTEXT, you +can load this style with: + +\starttyping +\usemodule[pre-organic] +\stoptyping + +At the end of this file, there is a small test file, so when you process the file +\type {s-pre-19.tex} \footnote {This style is the 19\high{th} presentation style. +Those numbered styles are internally mapped onto more meaningful names like in +this case \type {pre-organic}.} with the options \type {--mode=demo} and \type +{--pdf}, you will get a demo document. + +We use one of the standard screen \quote {paper} sizes, and map it onto the same +size, so that we get a nicely cropped page. Other screen sizes are \type {S4} and +\type {S5}. + +\starttyping +\setuppapersize[S6][S6] +\stoptyping + +Like in this \METAFUN\ manual, we use the Palatino as main bodyfont. This font is +quite readable on even low resolution screens, although I admit that this style +is developed using an $1400\times1050$ pixel \kap {lcd} screen, so the author may +be a little biased. + +\starttyping +\setupbodyfont[ppl] +\stoptyping + +The layout specification sets up a text area and a right edge area where the +menus will go (see \in {chapter} [sec:page] for a more in depth discussion on the +layout areas). Watch how we use a rather large edge distance. By setting the +header and footer dimensions to zero, we automatically get rid of page body +ornaments, like the page number. + +\starttyping +\setuplayout + [topspace=48pt, + backspace=48pt, + cutspace=12pt, + width=400pt, + margin=0cm, + rightedge=88pt, + rightedgedistance=48pt, + header=0cm, + footer=0cm, + height=middle] +\stoptyping + +We use a moderate, about a line height, inter||paragraph white space. + +\starttyping +\setupwhitespace[big] +\stoptyping + +Of course we use colors, since on computer displays they come for free. + +\starttyping +\setupcolors[state=start] + +\definecolor [red] [r=.75] +\definecolor [yellow] [r=.75,g=.75] +\definecolor [gray] [s=.50] +\definecolor [white] [s=.85] +\stoptyping + +Because it is an interactive document, we have to enable hyperlinks and alike. +However, in this style, we disable the viewer's \quote {highlight a hyperlink +when it's clicked on} feature. We will use a menu, so we enable menus. Later we +will see the contrast color |<|hyperlinks gets that color when we are already on +the location|>| in action. + +\starttyping +\setupinteraction + [state=start, + click=off, + color=red, + contrastcolor=gray, + menu=on] +\stoptyping + +The menu itself is set up as follows. Because we will calculate menu buttons +based on their position on the page, we have to keep track of the positions. +Therefore, we set the \type {position} variable to \type {yes}. + +\starttyping +\setupinteractionmenu + [right] + [frame=off, + position=yes, + align=middle, + topoffset=-.75cm, + bottomoffset=-.75cm, + color=gray, + contrastcolor=gray, + style=bold, + before=, + after=] +\stoptyping + +The menu content is rather sober: just a list of topics and a close button. Later +we will define the command that generates topic entries. The alternative \type +{right} lets the topic list inherit its characteristics from the menu. + +\starttyping +\startinteractionmenu[right] + \placelist[Topic][alternative=right] + \vfill + \but [CloseDocument] close \\ +\stopinteractionmenu +\stoptyping + +We have now arrived at the more interesting part of the style definition: the +graphic that goes in the page background. Because this graphic will change, we +define a useable \METAPOST\ graphic. Page backgrounds are recalculated each page, +opposite to the other backgrounds that are calculated when a new background is +defined, or when repetitive calculation is turned on. + +\starttyping +\setupbackgrounds [page] [background=page] +\defineoverlay [page] [\useMPgraphic{page}] +\setupMPvariables [page] [alternative=3] +\stoptyping + +We will implement three alternative backgrounds. First we demonstrate the +relatively simple super ellipsed one. The main complication is that we want the +button shapes to follow the right edge of the curve that surrounds the text. We +don't know in advance how many lines of text there will be in a button, and we +also don't know at what height it will end up. Therefore, we need to calculate +each button shape independently and for that purpose we need to know its position +(see \in {chapter} [sec:positioning]). In \in {figure} [fig:style] you can see +what lines we need in order to be calculate the button shapes. + +\startpostponing + +\startmode[screen] + \placefigure + [here][fig:style] + {The lines used to calculate the button shapes.} + {\externalfigure[mfun-774.pdf][page=1,height=.85\textheight]} +\stopmode + +\startnotmode[screen] + \placefigure + [here][fig:style] + {The auxiliary lines used to calculate the button shapes.} + {\rotate{\externalfigure[mfun-774.pdf][page=1,height=\textwidth]}} +\stopnotmode + +\page + +\stoppostponing + +We separate the calculation of the button shape from the rest by embedding it in +its own usable graphic container. The \type {StartPage}||\type {StopPage} pair +takes care of proper placement of the whole graphic. + +\starttyping +\startuseMPgraphic{page} + + \includeMPgraphic{rightsuperbutton} + + StartPage ; + + path p, q ; pickup pencircle scaled 3pt ; + + p := Field[Text][Text] enlarged 36pt superellipsed .90 ; + + fill Page withcolor \MPcolor{yellow} ; + fill p withcolor \MPcolor{white} ; + draw p withcolor \MPcolor{red} ; + + p := Field[Text][Text] enlarged 48pt superellipsed .90 ; + + def right_menu_button (expr nn, rr, pp, xx, yy, ww, hh, dd) = + if (pp>0) and (rr>0) : + q := rightsuperbutton(p,xx,yy,RightEdgeWidth,hh) ; + fill q withcolor \MPcolor{white} ; + draw q withcolor if rr=2 : \MPcolor{gray} + else : \MPcolor{red} fi ; + fi ; + enddef ; + + \MPmenubuttons{right} + + StopPage ; +\stopuseMPgraphic +\stoptyping + +The \TEX\ macro \type {\MPmenubuttons} expands into a list of (in this case four) +calls to the \METAPOST\ macro \type {right_menu_button}. This list is generated +by \CONTEXT\ when it generates the menu. Because the page background is applied +last, this list is available at that moment. + +\starttyping +... (expr nn, rr, pp, xx, yy, ww, hh, dd) ... +\stoptyping + +This rather long list of arguments represents the following variables: number, +referred page, current page, x coordinate, y coordinate, width, height and depth. +The last six variables originate from the positioning mechanism. Because the +variables are only available after a second \TEX\ pass, we only draw a button +shape when the test for the page numbers succeeds. + +\starttyping +\startuseMPgraphic{rightsuperbutton} + vardef rightsuperbutton (expr pat, xpos, ypos, wid, hei) = + + save p, ptop, pbot, t, b, edge, shift, width, height ; + path p, ptop, pbot ; pair t, b ; + numeric edge, shift, width, height ; + + edge := xpos + wid ; shift := ypos + hei ; + + p := rightpath pat ; + + ptop := ((-infinity,shift)--(edge,shift)) ; + pbot := ((-infinity,shift-hei)--(edge,shift-hei)) ; + + t := p intersectionpoint ptop ; + b := p intersectionpoint pbot ; + + p := subpath(0,xpart (p intersectiontimes ptop)) of p ; + p := subpath(xpart (p intersectiontimes pbot),length(p)) of p ; + + (p -- t -- point 1 of ptop & + point 1 of ptop -- point 1 of pbot & + point 1 of pbot -- b + -- cycle) + + enddef ; +\stopuseMPgraphic +\stoptyping + +The calculation of the button itself comes down to combining segments of the main +shape and auxiliary lines. The \type {rightpath} macro returns the right half of +the path provided. This half is shown as a non dashed line. + +Topics are identified with \type {\Topic}, which is an instance of chapter +headings. The number is made invisible. Since it still is a numbered section +header, \CONTEXT\ will write the header to the table of contents. + +\starttyping +\definehead [Topic] [chapter] +\setuphead [Topic] [number=no] +\stoptyping + +We will use a bold font in the table of contents. We also force a complete list. + +\starttyping +\setuplist + [Topic] + [criterium=all, + style=bold, + before=, + after=] +\stoptyping + +The \type {\TitlePage} macro looks horrible, because we want to keep the +interface simple: a list of small sentences, separated by \type {\\}. + +\starttyping +\def\TitlePage#1% + {\startstandardmakeup + \switchtobodyfont[big] + \def\\{\vfill\bfb\let\\=\par} + \bfd\setupinterlinespace\gray + \vskip.5cm#1\\\vskip.5cm % \\ is really needed -) + \stopstandardmakeup} +\stoptyping + +A presentation that uses this style, may look like the one below. You can choose +among three alternatives. + +\starttyping +\useenvironment[pre-organic] \setupoutput[pdftex] + +\setupMPvariables[page][alternative=1] + +\starttext + +\TitlePage + {A Few Nice Quotes\\ + A Simple Style Demo\\ + Hans Hagen, August 2000} + +\Topic {Douglas R. Hofstadter} \input douglas \page +\Topic {Donald E. Knuth} \input knuth \page +\Topic {Edward R. Tufte} \input tufte \page +\Topic {Hermann Zapf} \input zapf \page + +\stoptext +\stoptyping + +We will not implement the two other alternative shapes: squeezed and randomized. + +\def\ScrNum{2} \getbuffer[screens] +\def\ScrNum{3} \getbuffer[screens] + +We combine all alternatives into one page graphic. The alternative is chosen by +setting the \type {alternative} variable, as we demonstrated in the example. + +\starttyping +\startuseMPgraphic{page} + + \includeMPgraphic{rightsuperbutton} + + StartPage ; + + numeric alternative, seed, superness, squeezeness, randomness ; + path p, q ; transform t ; +\stoptyping + +This is one of those cases where a transform variable is useful. We need to store +the random seed value because we want the larger path that is used in the +calculations to have the same shape. + +\starttyping + alternative := \MPvar{alternative} ; + seed := uniformdeviate 100 ; + + if alternative > 10 : + superness := .85 + ((\realfolio-1)/max(\lastpage,1)) * .25 ; + squeezeness := 12pt - ((\realfolio-1)/max(\lastpage,1)) * 10pt ; + else : + superness := .90 ; + squeezeness := 12pt ; + fi ; + + randomness := squeezeness ; + + alternative := alternative mod 10 ; +\stoptyping + +If you read closely, you will notice that when we add 10 to the alternative, we +get a page dependant graphic. So, in fact we have five alternatives. We use +\CONTEXT\ macros to fetch the (real) page number and the number of the last page. +In further calculations we use the lower alternative numbers, which is why we +apply a \type {mod}. + +The rest of the code is not so much different from the previous definition. The +hard coded point sizes match the page dimensions (600pt by 450pt) quite well. + +\starttyping + t := identity if alternative=3: shifted (9pt,-9pt) fi ; + + randomseed := seed ; + + p := Field[Text][Text] enlarged if + alternative = 1 : 36pt superellipsed superness elseif + alternative = 2 : 36pt squeezed squeezeness elseif + alternative = 3 : 36pt randomized randomness else + : 36pt fi ; + + pickup pencircle scaled 3pt ; + + fill Page withcolor \MPcolor{yellow} ; + fill p withcolor \MPcolor{white} ; + draw p withcolor \MPcolor{red} ; + + randomseed := seed ; + + p := ( Field[Text][Text] enlarged if + alternative = 1 : 48pt superellipsed superness elseif + alternative = 2 : 48pt squeezed squeezeness elseif + alternative = 3 : 36pt randomized randomness else + : 48pt fi ) transformed t ; + + def right_menu_button (expr nn, rr, pp, xx, yy, ww, hh, dd) = + if (pp>0) and (rr>0) : + q := rightsuperbutton(p,xx,yy,RightEdgeWidth,hh) ; + fill q withcolor \MPcolor{white} ; + draw q withcolor if rr=2 : \MPcolor{gray} + else : \MPcolor{red} fi ; + fi ; + enddef ; + + \MPmenubuttons{right} + + StopPage ; +\stopuseMPgraphic +\stoptyping + +When we choose the alternatives~21 and~22 we get this result: + +\def\ScrNum{5} \getbuffer[screens] +\def\ScrNum{6} \getbuffer[screens] + +\stopsection + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/metafun/metafun-syntax.tex b/doc/context/sources/general/manuals/metafun/metafun-syntax.tex new file mode 100644 index 000000000..9407b1dd0 --- /dev/null +++ b/doc/context/sources/general/manuals/metafun/metafun-syntax.tex @@ -0,0 +1,1130 @@ +% language=uk +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +% eoclip: no postscript possible yet +% +% mpprocset mpxbreak + +% path expression -> path + +% listsize +% copylist +% sortlist +% shapedlist +% listtocurves +% listtolines + +\startcomponent metafun-syntax + +\environment metafun-environment + +\startchapter[title={\METAPOST\ syntax}] + +\index{syntax} +\index{language} + +\startintro + +In the \METAFONT\ book as well as the \METAPOST\ manual, you can find the exact +specification of the language. Below you find the full \METAPOST\ syntax, to +which we add the basic \METAFUN\ extensions. If this page looks too cryptic, you +can safely skip to the next chapter. We don't distinguish between primitives and +functionality defined in the \METAPOST\ format, simply because the core is kept +small and a macro package is supposed to extend that core. + +\stopintro + +% \startsection[title={Syntax diagrams}] + +The following syntax diagrams are derived from the diagrams in the \METAPOST\ +manual. The \mathematics {\rightarrow} represents \quote {means} and the +\mathematics {\vert} symbol stands for \quote {or}. + +The diagrams describe the hard coded \METAPOST\ syntax as well as most of the +macros and variables defined in the plain \METAPOST\ format that belongs to the +core of the system. They also include most of the fundamental \METAFUN\ commands. +We have omitted the \METAPOST\ and \METAFONT\ commands that make no sense any +more or are irrelevant for common usage. Specific \METAFUN\ modules are not +included here, only general tools, text helpers and extensions to the built||in +capabilities like transparency. If you feel that something is missing that should +be specified here, just let me know. + +\start \switchtobodyfont[8pt] % small] + +\StartSyntax +\S{atom} + \M \S{variable} \S{argument} + \O \S{number or fraction} + \O \S{internal variable} + \O \( \S{expression} \) + \O \L{begingroup} \S{statement list} \S{expression} \L{endgroup} + \O \S{nullary op} + \O \L{btex} \S{typesetting command} \L{etex} + % \O \L{verbatimtex} \S{typesetting command} \L{etex} + \O \S{pseudo function} +\StopSyntax + +\StartSyntax +\S{primary} + \M \S{atom} + \O \( \S{numeric expression} \L{,} \S{numeric expression} \) + \O \( \S{numeric expression} \L{,} \S{numeric expression} \L{,} \S{numeric expression} \) + \O \( \S{numeric expression} \L{,} \S{numeric expression} \L{,} \S{numeric expression} \L{,} \S{numeric expression} \) + \O \S{of operator} \S{expression} \L{of} \S{primary} + \O \S{numeric expression} \S{expression} \FL{along} \S{path expression} + \O \S{numeric expression} \S{expression} \FL{on} \S{path expression} + \O \S{unary op} \S{primary} + \O \L{str} \S{suffix} + \O \L{z} \S{suffix} + \O \S{numeric atom} \[ \S{expression} \L{,} \S{expression} \] + \O \S{scalar multiplication op} \S{primary} + \O \S{color expression} \FL{shadedinto} \S{color expression} + \O \S{picture expression} \FL{asgroup} \S{string expression} + \O \S{picture expression} \FL{onlayer} \S{string expression} +\StopSyntax + +\StartSyntax +\S{secondary} + \M \S{primary} + \O \S{secondary} \S{primary binop} \S{primary} + \O \S{secondary} \S{transformer} +\StopSyntax + +\StartSyntax +\S{tertiary} + \M \S{secondary} + \O \S{tertiary} \S{secondary binop} \S{secondary} +\StopSyntax + +\StartSyntax +\S{subexpression} + \M \S{tertiary} + \O \S{path expression} \S{path join} \S{path knot} +\StopSyntax + +\StartSyntax +\S{expression} + \M \S{subexpression} + \O \S{expression} \S{tertiary binop} \S{tertiary} + \O \S{path subexpression} \S{direction specifier} + \O \S{path subexpression} \S{path join} \L{cycle} +\StopSyntax + +\StartSyntax +\S{path knot} + \M \S{tertiary} +\StopSyntax + +\StartSyntax +\S{path join} + \M \L{--} + \O \S{direction specifier} \S{basic path join} \S{direction specifier} +\StopSyntax + +\StartSyntax +\S {direction specifier} + \M \S{empty} + \O \{ \L{curl} \S{numeric expression} \} + \O \{ \S{pair expression} \} + \O \{ \S{numeric expression} \L{,} \S{numeric expression} \} +\StopSyntax + +\StartSyntax +\S{basic path join} + \M \L{..} + \O \L{...} + \O \L{..} \S{tension} \L{..} + %O \L{..} \S{tension} \L{..} % check what got lost here + \O \L{..} \S{controls} \L{..} +\StopSyntax + +\StartSyntax % atleast added +\S{tension} + \M \L{tension} \S{numeric primary} + \O \L{tension} \L{atleast} \S{numeric primary} + \O \L{tension} \S{numeric primary} \L{and} \S{numeric primary} +\StopSyntax + +\StartSyntax +\S{controls} + \M controls \S{pair primary} + \O controls \S{pair primary} \L{and} \S{pair primary} +\StopSyntax + +\StartSyntax +\S{argument} + \M \S{symbolic token} +\StopSyntax + +\StartSyntax +\S{number or fraction} + \M \S{number} \L{/} \S{number} + \O \S{number} \Q{not followed by} \L{/} \S{number} +\StopSyntax + +\StartSyntax +\S{scalar multiplication op} + \M \L{+} \O \L{-} + \O \S{number or fraction} \Q{not followed by} \S{add op} \S{number} +\StopSyntax + +\StartSyntax +\S{transformer} + \M \L {rotated} \S {numeric primary} + \O \L {scaled} \S {numeric primary} + \O \L {shifted} \S {pair primary} + \O \L {slanted} \S {numeric primary} + \O \L {transformed} \S {transform primary} + \O \L {xscaled} \S {numeric primary} \O \L {yscaled} \S {numeric primary} \O \FL{xyscaled} \S {numeric or pair primary} + \O \L {zscaled} \S {pair primary} + \O \L {reflectedabout} \L \( \S{pair expression} \L{,} \S{pair expression} \) + \O \L {rotatedaround} \L \( \S{pair expression} \L{,} \S{numeric expression} \) + \O \FL{xsized} \S {numeric primary} \O \FL{ysized} \S {numeric primary} \O \FL{xysized} \S {numeric or pair primary} + \O \FL{blownup} \S {numeric or pair primary} + \O \FL{enlarged} \S {numeric or pair primary} + \O \FL{xstretched} \S {numeric primary} \O \FL{ystretched} \S{numeric primary} \O \FL{stretched} \S{numeric or pair primary} + \O \FL{shortened} \S {numeric or pair primary} + \O \FL{enlonged} \S {numeric or pair primary} + \O \FL{crossed} \S {numeric primary} + \O \FL{paralelled} \S {numeric primary} + \O \FL{curved} \S {numeric primary} + \O \FL{laddered} + \O \FL{leftenlarged} \S{numeric primary} \O \FL{llenlarged} \S{numeric primary} \O \FL{llmoved} \S{numeric primary} + \O \FL{rightenlarged} \S{numeric primary} \O \FL{lrenlarged} \S{numeric primary} \O \FL{lrmoved} \S{numeric primary} + \O \FL{topenlarged} \S{numeric primary} \O \FL{urenlarged} \S{numeric primary} \O \FL{urmoved} \S{numeric primary} + \O \FL{bottomenlarged} \S{numeric primary} \O \FL{ulenlarged} \S{numeric primary} \O \FL{ulmoved} \S{numeric primary} + \O \FL{randomized} \S{numeric or pair or color primary} + \O \FL{randomizedcontrols} \S{numeric or pair} + \O \FL{snapped} \S{numeric or pair primary} + \O \FL{cornered} \S{numeric or pair} + \O \FL{peepholed} \S{path expression} + \O \FL{smoothed} \S{numeric or pair} + \O \FL{squeezed} \S{numeric or pair primary} + \O \FL{superellipsed} \S{numeric primary} + \O \FL{randomshifted} \S{numeric or pair primary} + \O \FL{uncolored} \S{color primary} + \O \FL{softened} \S{numeric or color primary} + \O \FL{asgroup} \S{string primary} + \O \L {gobbled} \S{primary} + % + \O \FL {insideof} \S{path expression} + \O \FL {outsideof} \S{path expression} + \O \FL {crossinunder} \S{path expression} +\StopSyntax + +\StartSyntax +\S{numeric or pair primary} + \M \S{numeric primary} + \O \S{pair primary} +\StopSyntax + +\StartSyntax +\S{numeric or pair or color primary} + \M \S{numeric primary} + \O \S{pair primary} + \O \S{color primary} +\StopSyntax + +\StartSyntax +\S{numeric or color primary} + \M \S{numeric primary} + \O \S{color primary} +\StopSyntax + +\StartSyntax +\S{nullary op} + \M \L{false} \O \L{true} + \O \L{normaldeviate} + \O \L{nullpen} \O \L{nullpicture} \O \L{pencircle}% + \O \L{whatever} +\StopSyntax + +\StartSyntax +\S{unary op} + \M \S{type} + \O \L {ASCII} + \O \FL{asin} \O \FL{asinh} \O \FL{acos} \O \FL{acosh} \O \FL{atan} \O \L {cosd} \O \FL{cos} \O \FL{cosh} \O \FL{cot} \O \FL{cotd} \O \L {sind} \O \FL{sin} \O \FL{sinh} \O \FL{tand} \O \FL{tan} + \O \L {inverse} \O \FL{inv} \O \FL{invcos} \O \FL{invsin} \O \FL{invtan} + \O \FL{sqr} \O \L {sqrt} \O \L {pow} \O \FL{exp} \O \L {mexp} \O \L {mlog} \O \FL{ln} \O \FL{log} \O \L {uniformdeviate} + \O \L {abs} \O \L {round} \O \L {odd} \O \L {ceiling} \O \L {floor} + \O \L {dir} \O \L {angle} \O \L {length} \O \L {arclength} + \O \L {bbox} \O \FL{bbwidth} \O \FL{bbheight} + \O \L {bot} \O \L {lft} \O \L {rt} \O \L {top} \O \L {center} + \O \FL{colordecimals} \O \L {decimal} \O \FL{ddecimal} \O \FL{dddecimal} \O \FL{ddddecimal} \O \FL{condition} \O \FL{tostring} + \O \FL{boundingbox} \O \FL{outerboundingbox} \O \FL{innerboundingbox} \O \L {bbox} + \O \L {colorpart} \O {fontpart} \O \L {pathpart} \O \L {penpart} \O \L {textpart} \O \L {dashpart} + \O \L {redpart} \O \L {greenpart} \O \L {bluepart} \O \L {greypart} \O \L {graypart} + \O \L {cyanpart} \O \L {magentapart} \O \L {yellowpart} \O \L {blackpart} + \O \L {postscriptpart} \O \L {prescriptpart} + \O \L {clipped} \O \L {bounded} \O \L {stroked} \O \L {filled} \O \L {textual} + \O \FL{punked} \O \L{paralleled} + \O \FL{leftboundary} \O \FL{rightboundary} \O \FL{topboundary} \O \FL{bottomboundary} + \O \L {xpart} \O \L {xxpart} \O \L {xypart} \O \L {ypart} \O \L {yxpart} \O \L {yypart} + \O \L {oct} \O \L {hex} + \O \L {colortype} + \O \FL{grayed} \O \FL{greyed} + \O \L {llcorner} \O \L {lrcorner} \O \L {ulcorner} \O \L {urcorner} + \O \L {not} \O \L {known} \O \L {unknown} + \O \FL{blackcolor} \O \FL{whitecolor} \O \L {colormodel} + \O \L {char} \O \L {fontsize} + \O \L {cycle} \O \L {reverse} \O \L {counterclockwise} + \O \L {makepath} \O \L {makepen} + \O \L {unitvector} + \O \L {turningnumber} + \O \L {circularpath} \O \L {squarepath} \O \L {linearpath} + % maybe pseudo functions: + \O \FL{area} \O \FL{inverted} \O \FL{simplified} \O \FL{unspiked} +\StopSyntax + +\StartSyntax +\S{type} + \M \L{boolean} \O \L{numeric} \O \L{pair} \O \L{path} + \O \L{pen} \O \L{picture} \O \L{string} \O \L{transform} + \O \L{color} \O \L{cmykcolor} \O \FL {greycolor} \FL {graycolor}\O \L{rgbcolor} + \O \FL{property}\O \FL{transparency} + \O \L{outer} \O \L{inner} +\StopSyntax + +\StartSyntax +\S{primary binop} + \M \L{*} \O \L{/} \O \L{**} \O \L{and} + \O \L{dotprod} \O \L{div} \O \L{infont} \O \L{mod} +\StopSyntax + +\StartSyntax +\S{secondary binop} + \M \L{+} \O \L{-} \O \L{++} \O \L{+-+} \O \L{or} + \O \L{intersectionpoint} \O \L{intersectiontimes} +\StopSyntax + +\StartSyntax +\S{tertiary binop} + \M \L{&} \O \L{<} \O \L{<=} \O \L{<>} \O \L{=} \O \L{>} \O \L{>=} + \O \L{cutafter} \O \L{cutbefore} \O \FL{cutends} + \O \L{softjoin} +\StopSyntax + +\StartSyntax +\S{of operator} + \M \L{arctime} \O \L{direction} \O \L{directiontime} \O \L{directionpoint}% + \O \L{penoffset} \O \L{point} + \O \L{postcontrol} \O \L{precontrol} \O \L{subpath} \O \L{substring} + \O \L{takepower} +\StopSyntax + +\StartSyntax +\S{variable} + \M \S{predefined numeric variable} + \O \S{predefined path variable} + \O \S{predefined picture variable} + \O \S{predefined transform variable} + \O \S{predefined pair variable} + \O \S{predefined pen variable} + \O \S{predefined string variable} + \O \S{predefined dashpattern} + \O \S{predefined rgbcolor variable} + \O \S{predefined macro} + \O \S{tag} \S{suffix} +\StopSyntax + +\StartSyntax +\S{predefined numeric variable} + \M \FL{nothing yet} +\StopSyntax + +\StartSyntax +\S{predefined picture variable} + \M \FL{blankpicture} + \O \L{currentpicture} +\StopSyntax + +\StartSyntax +\S{predefined transform variable} + \M \L{identity} \O \L{currenttransform} +\StopSyntax + +\StartSyntax +\S{predefined path variable} + \M \FL{originpath} + \O \FL{fullcircle} \O \FL{fullsquare} \O \FL{fulldiamond} \O \FL{fulltriangle} + \O \FL{unitcircle} \O \FL{unitsquare} \O \FL{unitdiamond} \O \FL{unittriangle} + \O \FL{halfcircle} \O \FL{quartercircle} + \O \FL{llcircle} \O \FL{lrcircle} \O \FL{urcircle} \O \FL{ulcircle} + \O \FL{bcircle} \O \FL{tcircle} \O \FL{lcircle} \O \FL{rcircle} + \O \FL{triangle} + \O \FL{righttriangle} \O \FL{uptriangle} \O \FL{lefttriangle} \O \FL{downtriangle} + \O \FL{lltriangle} \O \FL{lrtriangle} \O \FL{urtriangle} \O \FL{ultriangle} + \O \L{cuttings} +\StopSyntax + +\StartSyntax +\S{predefined pair variable} + \M \L{right} \O \L{up} \O \L{left} \O \L{down} + \M \L{shadedright} \O \L{shadedup} \O \L{shadedleft} \O \L{shadeddown} +\StopSyntax + +\StartSyntax +\S{predefined pen variable} + \M \FL{pensquare} \O \FL{penrazor} \O \FL{penspec} + \O \L{currentpen} +\StopSyntax + +\StartSyntax +\S{predefined string variable} + \M \FL{EOF} + \O \FL{CRLF} \O \FL{crlf} + \O \FL{DQUOTE} \O \FL{dquote} \O \L{ditto} + \O \FL{SPACE} \O \FL{space} + \O \FL{PERCENT} \O \FL{percent} + \O \L{defaultfont} + \O \L{extra_beginfig} \O \L {extra_endfig} + \O \FL{pathconnectors} +\StopSyntax + +\StartSyntax +\S{predefined dashpattern} + \M \L{evenly} \O \FL{oddly} \O \L{withdots} +\StopSyntax + +\StartSyntax +\S{predefined rgbcolor variable} + \M \L{red} \O \L{green} \O \L{blue} \O \L{white} + \O \L{cyan} \O \L{magenta} \O \L{yellow} \O \L{black} + \O \L{background} + \O \FL{basiccolors} +\StopSyntax + +\StartSyntax +\S{predefined macro} + \M \FL{shipit} \O \FL{bye} + \O \FL{resetdrawoptions} + \O \FL{visualizepaths} \O \FL{naturalizepaths} +\StopSyntax + +\StartSyntax +\S{suffix} + \M \S{empty} + \O \S{suffix} \S{subscript} + \O \S{suffix} \S{tag} + \O \S{suffix parameter} +\StopSyntax + +\StartSyntax +\S{subscript} + \M \S{number} + \O \[ \S{numeric expression} \] +\StopSyntax + +\StartSyntax +\S{internal variable} + \M \L{ahangle} \O \L{ahlength} + \O \L{bboxmargin} \O \L{labeloffset} + \O \L{charcode} + \O \L{defaultcolormodel} \O \L{defaultpen} \O \L{defaultscale} + \O \L{linecap} \O \L{linejoin} \O \L{miterlimit} + \O \L{outputformat} \O \L{outputtemplate} \O \O \L{prologues} + \O \L{showstopping} \L{pausing} + \O \L{tracingoutput} \O \L{tracingcapsules} \O \L{tracingchoices} \O \L{tracingcommands} \O \L{tracingequations} + \O \L{tracinglostchars} \O \L{tracingmacros} \O \L{tracingonline} \O \L{tracingrestores} \O \L{tracingspecs} + \O \L{tracingstats} \O \L{tracingtitles} + \O \L{truecorners} \O \L{warningcheck} + \O \L{dotlabeldiam} + \O \L{day} \O \L{month} \O \L{year} \O \L{hour} \O \L{minute} \O \L{time} + \O \L{mm} \O \L{pt} \O \L{dd} \O \L{bp} \O \L{cm} \O \L{pc} \O \L{cc} \O \L{in} + \O \L{butt} \O \L{rounded} \O \L{squared} \O \L{mitered} \O \L{beveled} + \O \FL{pi} \O \FL{radian} \O \FL{eps} \O \FL{epsilon} + \O \FL{nocolormodel} \O \FL{greycolormodel} \O \FL{graycolormodel} \O \FL{rgbcolormodel} \O \FL{cmykcolormodel} + % \O \FL{shadefactor} + \O \FL{textextoffset} + \O \FL{maxdimensions} + \O \L{infinity} + \O \FL{charscale} + \O \FL{metapostversion} + \O \FL{normaltransparent} \O \FL{multiplytransparent} \O \FL{screentransparent} \O \FL{overlaytransparent} + \O \FL{softlighttransparent} \O \FL{hardlighttransparent} \O \FL{colordodgetransparent} \O \FL{colorburntransparent} + \O \FL{darkentransparent} \O \FL{lightentransparent} \O \FL{differencetransparent} \O \FL{exclusiontransparent} + \O \FL{huetransparent} \O \FL{saturationtransparent} \O \FL{colortransparent} \O \FL{luminositytransparent} + \O \S{symbolic token defined by \L{newinternal}} + \O \L{ahangle} \O \L{ahlength} + \O \L{bboxmargin} + \O \L{pen_bot} \O \L{pen_top} \O \L{pen_lft} \O \L{pen_rt} + \O \L{join_radius} + \O \L{crossingscale} \O \L{crossingoption} +\StopSyntax + +\StartSyntax +\S{pseudo function} + \M \L {min} \( \S{expression list} \)% + \O \L {max} \( \S{expression list} \) + \O \L {incr} \( \S{numeric variable} \)% + \O \L {decr} \( \S{numeric variable} \) + \O \L {dashpattern} \( \S{on/off list} \) + \O \L {interpath} \( \S{numeric expression} \L{,} \S{path expression} \L{,} \S{path expression} \) + \O \FL{interpolated} \( \S{numeric expression} \L{,} \S{path expression} \L{,} \S{path expression} \) + \O \L {buildcycle} \( \S{path expression list} \) + \O \L {thelabel} \S{label suffix} \( \S{expression} \L{,} \S{pair expression} \) + \O \FL{thefreelabel} \( \S{expression}\L{,} \S{pair expression} \L{,} \S{pair expression} \) + \O \FL{anglebetween} \( \S{path expression} \L{,} \S{path expression} \L{,} \S{expression} \) + \O \L {flex} \( \S{text} \) + \O \L {hide} \( \S{text} \) + \O \L {gobble} \S{primary} + \O \L {clearit} + \O \L {clearpen} + \O \L {clearxy} + \O \FL{pointarrow} \( \S{path expression} \L{,} \S{numeric or pair primary} \L{,} \S{numeric expression} \) + \O \FL{centerarrow} \( \S{path expression} \L{,} \S{numeric or pair primary} \L{,} \S{numeric expression} \) + \O \FL{leftarrow} \( \S{path expression} \L{,} \S{numeric or pair primary} \L{,} \S{numeric expression} \) + \O \FL{rightarrow} \( \S{path expression} \L{,} \S{numeric or pair primary} \L{,} \S{numeric expression} \) + \O \FL{paired} \( \S{numeric or pair} \)% + \O \FL{tripled} \( \S{numeric or color} \) + \O \FL{remappedcolor} \( \S{color expression} \) + \O \FL{superellipse} \( \S{numeric primary} \L{,} \S{numeric primary} \L{,} \S{numeric primary} \L{,} \L{numeric primary} \L{,} \N \L{numeric primary} \) + \O \FL{roundedsquare} \( \S{numeric primary} \L{,} \S{numeric primary} \L{,} \S{numeric primary} \) + \O \FL{tensecircle} \( \S{numeric primary} \L{,} \S{numeric primary} \L{,} \S{numeric primary} \) + \O \FL{tensepath} \( \S{path primary} \) + \O \FL{(constructed)function}% + \( \S{string expression} \)% + \( \S{string primary} \L{,} \S{string primary} \L{,} \S{numeric primary} \L{,} + \N \S{numeric primary} \L{,} \S{numeric primary} \) + \O \FL{straightfunction} \( \S{string primary} \L{,} \S{string primary} \L{,} \S{numeric primary} \L{,} \S{numeric primary} \L{,} + \N \S{numeric primary} \) + \O \FL{curvedfunction} \( \S{string primary} \L{,} \S{string primary} \L{,} \S{numeric primary} \L{,} \S{numeric primary} \L{,} + \N \S{numeric primary} \) + %\O \FL{punkedfunction} \( \S{string primary} \L{,} \S{string primary} \L{,} \S{numeric primary} \L{,} \S{numeric primary} \L{,} \S{numeric primary} \) + %\O \FL{tightfunction} \( \S{string primary} \L{,} \S{string primary} \L{,} \S{numeric primary} \L{,} \S{numeric primary} \L{,} \S{numeric primary} \) + \O \FL{constructedpairs} \( \S{string expression} \) \( \S{pair array} \) + \O \FL{straightpairs} \( \S{pair array} \) + \O \FL{curvedpairs} \( \S{pair array} \) + %\O \FL{punkedpairs} \( \S{pair array} \) + %\O \FL{tightpairs} \( \S{pair array} \) + \O \FL{constructedpath} \( \S{string expression} \) \( \S{text} \) + \O \FL{straightpath} \( \S{text} \) + \O \FL{curvedpath} \( \S{text} \) + %\O \FL{punkedpath} \( \S{text} \) + %\O \FL{tightpath} \( \S{text} \) + \O \FL{epsed} \S{numeric primary} + \O \FL{arrowhead} \S{path primary} + \O \FL{arrowpath} \S{path primary} + \O \FL{infinite} \S{path primary} + % + \O \FL{tolist} \( \S{pair array} \) \( \S{text} \) + \O \FL{topath} \( \S{pair array} \) \( \S{text} \) + \O \FL{tocycle} \( \S{pair array} \) \( \S{text} \) + \O \FL{pencilled} \( \S{path expression} \) \( \S{pen expression} \) +\StopSyntax + +\StartSyntax +\S{color expression} + \M \S{basic color expression} + \O \S{string primary} + \O \FL{namedcolor} \( \S{string primary} \) + \O \FL{spotcolor} \( \S{string primary} \L{,} \S{basic color expression} \) + \O \FL{multitonecolor} \( \S{string primary} \L{,} \S{basic color expression list} \) +\StopSyntax + +\StartSyntax +\S{basic color expression} + \M \S{rgb color expression} + \O \S{cmyk color expression} + \O \S{gray color expression} +\StopSyntax + +\StartSyntax +\S{basic color expression list} + \M \S{basic color expression} + \O \S{basic color expression list} \L{,} \S{basic color expression} +\StopSyntax + +\StartSyntax +\S{rgb color expression} + \M \S\( \S{numeric primary} \L{,} \S{numeric primary} \L{,} \S{numeric primary} \S\) +\StopSyntax + +\StartSyntax +\S{cmyk color expression} + \M \S\( \S{numeric primary} \L{,} \S{numeric primary} \L{,} \S{numeric primary} \L{,} \S{numeric primary} \S\) +\StopSyntax + +\StartSyntax +\S{gray color expression} + \M \S\( \S{numeric primary} \S\) + \O \S{numeric primary} +\StopSyntax + +\StartSyntax +\S{path expression list} + \M \S{path expression} + \O \S{path expression list} \L{,} \S{path expression} +\StopSyntax + +\StartSyntax +\S{on/off list} + \M \S{on/off list} \S{on/off clause} + \O \S{on/off clause} +\StopSyntax + +\StartSyntax +\S{on/off clause} + \M \L{on} \S{numeric tertiary} + \O \L{off} \S{numeric tertiary} +\StopSyntax + +\StartSyntax +\S{boolean expression} \M \S{expression} +\S{cmyk expression} \M \S{expression} +\S{color expression} \M \S{expression} +\S{numeric atom} \M \S{atom} +\S{numeric expression} \M \S{expression} +\S{numeric primary} \M \S{primary} +\S{numeric tertiary} \M \S{tertiary} +\S{numeric variable} \M \S{variable} \O \S{internal variable} +\S{pair expression} \M \S{expression} +\S{pair primary} \M \S{primary} +\S{path expression} \M \S{expression} +\S{path subexpression} \M \S{subexpression} +\S{pen expression} \M \S{expression} +\S{picture expression} \M \S{expression} +\S{picture variable} \M \S{variable} +\S{rgb expression} \M \S{expression} +\S{string expression} \M \S{expression} +\S{suffix parameter} \M \S{parameter} +\S{transform primary} \M \S{primary} +\StopSyntax + +\StartSyntax +\S{program} + \M \S{statement list} \L{end} +\StopSyntax + +\StartSyntax +\S{statement list} + \M \S{empty} + \O \S{statement list} \L{;} \S{statement} +\StopSyntax + +\StartSyntax +\S{statement} + \M \S{empty} + \O \S{equation} + \O \S{assignment} + \O \S{declaration} + \O \S{macro definition} + \O \S{compound} + \O \S{pseudo procedure} + \O \S{command} +\StopSyntax + +\StartSyntax +\S{compound} + \M \L{begingroup} \S{statement list} \L{endgroup} + \O \L{beginfig} \( \S{numeric expression} \) \L{;} \S{statement list} \S{;} \L{endfig} + \O \FL{beginglyph} \( \S{glyph property list} \) \L{;} \S{statement list} \S{;} \L{endglyph} + \O \L{image builder} \( \S{statement list} \) +\StopSyntax + +\StartSyntax +\S{image builder} + \M {image} \O \FL {decorated} \O \FL {redecorated} \O \FL {undecorated} +\StopSyntax + +\StartSyntax +\S{glyph property list} + \M \S{numeric expression} \L{,} \S{numeric expression} \L{,} \S{numeric expression} \L{,} \S{numeric expression} +\StopSyntax + +\StartSyntax +\S{equation} + \M \S{expression} \L{=} \S{right-hand side} +\StopSyntax + +\StartSyntax +\S{assignment} + \M \S{variable} \L{:=} \S{right-hand side} + \O \S{internal variable} \L{:=} \S{right-hand side} +\StopSyntax + +\StartSyntax +\S{right-and side} + \M \S{expression} + \O \S{equation} + \O \S{assignment} +\StopSyntax + +\StartSyntax +\S{declaration} + \M \S{type} \S{declaration list} +\StopSyntax + +\StartSyntax +\S{declaration list} + \M \S{generic variable} + \O \S{declaration list} \L{,} \S{generic variable} +\StopSyntax + +\StartSyntax +\S{generic variable} + \M \S{Symbolic token} \S{generic suffix} +\StopSyntax + +\StartSyntax +\S{generic suffix} + \M \S{empty} + \O \S{generic suffix} \S{tag} + \O \S{generic suffix} \L{[]} +\StopSyntax + +\StartSyntax +\S{macro definition} + \M \S{macro heading} \L{=} \S{replacement text} \L{enddef} +\StopSyntax + +\StartSyntax +\S{macro heading} + \M \L{def} \S{Symbolic token} \S{delimited part} \S{undelimited part} + \O \L{vardef} \S{generic variable} \S{delimited part} \S{undelimited part} + \O \L{vardef} \S{generic variable} \L{@#} \S{delimited part} \S{undelimited part} + \O \S{binary def} \S{parameter} \S {symbolic token} \S{parameter} +\StopSyntax + +\StartSyntax +\S{delimited part} + \M \S{empty} + \O \S{delimited part} \( \S{parameter type} \S{parameter tokens} \) +\StopSyntax + +\StartSyntax +\S{parameter type} + \M \L{expr} + \O \L{suffix} + \O \L{text} +\StopSyntax + +\StartSyntax +\S{parameter tokens} + \M \S{parameter} + \O \S{parameter tokens} \L{,} \S{parameter} +\StopSyntax + +\StartSyntax +\S{parameter} + \M \S{Symbolic token} +\StopSyntax + +\StartSyntax +\S{undelimited part} + \M \S{empty} + \O \S{parameter type} \S{parameter} + \O \S{precedence level} \S{parameter} + \O \L{expr} \S{parameter} \L{of} \S{parameter} +\StopSyntax + +\StartSyntax +\S{precedence level} + \M \L{primary} + \O \L{secondary} + \O \L{tertiary} +\StopSyntax + +\StartSyntax +\S{binary def} + \M \S{primarydef} + \O \S{secondarydef} + \O \S{tertiarydef} +\StopSyntax + +\StartSyntax +\S{pseudo procedure} + \M \L {drawoptions} \( \S{option list} \) + \O \L {label} \S{label suffix} \( \S{expression} \L{,} \S{pair expression} \) + \O \L {thelabel} \S{label suffix} \( \S{expression} \L{,} \S{pair expression} \) + \O \L {dotlabel} \S{label suffix} \( \S{expression} \L{,} \S{pair expression} \) + \O \L {makelabel} \S{makelabel} + \O \L {labels} \S{label suffix} \( \S{point number list} \) + \O \L {dotlabels} \S{label suffix} \( \S{point number list} \) + \O \FL{textext} \S{label suffix} \( \S{expression} \) + \O \FL{infotext} \S{label suffix} \( \S{expression}, \S{numeric expression} \) + \O \FL{thetextext} \S{label suffix} \( \S{expression}, \S{pair expression} \) + \O \FL{rawtextext} \( \S{expression} \) + \O \FL{verbatim} \S{string expression} + \O \FL{freelabel} \( \S{expression} \L{,} \S{pair expression} \L{,} \S{pair expression} \) + \O \FL{freedotlabel} \( \S{expression} \L{,} \S{pair expression} \L{,} \S{pair expression} \) + \O \FL{remapcolor} \( \S{color expression} \L{,} \S{color expression} \) + \O \FL{resetcolormap} + \O \FL{recolor} \S{picture expression} + \O \FL{bitmapimage} \( \S{numeric primary} \L{,} \S{numeric primary} \L{,} \S{string primary} \) + \O \FL{pushboundingbox} \O \FL{popboundingbox} + \O \FL{pushcurrentpicture} \O \FL{popcurrentpicture} + \O \FL{externalfigure} \S{string expression} \S{transformer} + \O \FL{loadfigure} \S{string expression} \L{number} \S{numeric expression} \S{transformer} + \O \FL{properties} + \O \L {anchored} \S{label suffix} \( \S{expression} \L{,} \S{pair expression} \) +\StopSyntax + +\StartSyntax +\S{point number list} + \M \S{suffix} \O \S{point number list} \L{,} \S{suffix} +\StopSyntax + +\StartSyntax +\S{label suffix} + \M \S{empty} + \O \L{lft} \O \L{rt}\O \L{top} \O \L{bot} \O \L{ulft} \O \L{urt}% + \O \L{llft} \O \L{lrt} \O \FL{raw} \O \FL{origin} +\StopSyntax + +\StartSyntax +\S{command} + \M \L{clip} \S{picture variable} \L{to} \S{path expression} + \O \L{interim} \S{internal variable} \L{:=} \S{right-hand side} + \O \L{let} \S{symbolic token} \L{=} \S{symbolic token} + \O \L{pickup} \S{expression} + \O \L{randomseed} \L{:=} \S{numeric expression} + \O \L{save} \S{symbolic token list} + \O \L{delimiters} \S{character} \S{character} + \O \L{setbounds} \S{picture variable} \L{to} \S{path expression} + \O \L{shipout} \S{picture expression} + \O \L{special} \S{string expression} + \O \L{endinput} + \O \L{expandafter} + \O \S{addto command} + \O \S{drawing command} + \O \S{font metric command} + \O \S{newinternal command} + \O \S{message command} + \O \S{mode command} + \O \S{show command} + \O \S{special command} + \O \S{tracing command} + \O \S{scantokens} \S{string expression} + \O \FL{defineshade} \S{symbolic token} \S{shading expression} + \O \L{write} \S{string expression} \L{to} \S{string expression} + \O \L{readfrom} \S{string expression} + \O \FL{readfile} \S{string expression} + \O \L{readstring} + \O \L{restoreclipcolor} + \O \L{savepen} + \O \L{runscript} + \O \L{relax} +\StopSyntax + +\StartSyntax +\S{show command} + \M \L{show} \S{expression list} + \O \L{showvariable} \S{symbolic token list} + \O \L{showtoken} \S{symbolic token list} + \O \L{showdependencies} +\StopSyntax + +\StartSyntax +\S{symbolic token list} + \M \S{symbolic token} + \O \S{symbolic token} \L{,} \S{symbolic token list} +\StopSyntax + +\StartSyntax +\S{expression list} + \M \S{expression} + \O \S{expression list} \L{,} \S{expression} +\StopSyntax + +\StartSyntax +\S{addto command} + \M \L{addto} \S{picture variable} \L{also} \S{picture expression} \S{option list} + \O \L{addto} \S{picture variable} \L{contour} \S{path expression} \S{option list} + \O \L{addto} \S{picture variable} \L{doublepath} \S{path expression} \S{option list} +\StopSyntax + +\StartSyntax +\S{option list} + \M \S{empty} + \O \S{drawing option} \S{option list} +\StopSyntax + +\StartSyntax +\S{drawing option} + \M \L {withcolor} \S{color expression}% + \O \FL {withgrey} \S{numeric expression}% + \O \FL {withgray} \S{numeric expression} + \O \L {withrgbcolor} \S{rgb expression}% + \O \L {withcmykcolor} \S{cmyk expression}% + \O \L {withgreyscale} \S{numeric expression} + \O \L {withoutcolor} + \O \L {withprescript} \S{string expression}% + \O \L {withpostscript} \S{string expression} + \O \L {withpen} \S{pen expression} + \O \L {dashed} \S{picture expression} + \O \FL{undashed} + \O \FL{withshade} \S{numeric expression} \O \FL{shaded} \S{shading expression} + \O \FL{withproperties} \S{property primary} + \O \FL{withtransparency} \S{pair primary} + \O \FL{withlinearshade} \(% + \S{path expression} \L{,}% + \S{path expression} \L{,}% + \S{color expression} \L{,}% + \S{color expression} \) + \O \FL{withcircularshade} \(% + \S{path ex} \L{,}% + \S{path ex} \L{,}% + \S{numeric ex} \L{,}% + \S{numeric ex} \L{,}% + \S{color ex} \L{,}% + \S{color ex} \) + \O \S{shading expression} + \O \FL{onlayer} \S{string expression} + \O \FL{withmask} \S{string expression} +\StopSyntax + +\StartSyntax +\S{property expression} + \M \( {drawing option} \) +\StopSyntax + +\StartSyntax +\S{shading expression} + \M \FL{withshademethod} \L{string expression} + \O \FL{withshadefactor} \L{numeric expression} + \O \FL{withshadedomain} \L{pair expression} + \O \FL{withshadevector} \L{pair expression} + \O \FL{withshaderadius} \L{pair expression} + \O \FL{withshadeorigin} \L{pair expression} + \O \FL{withshadecolors} \( \S{color expression} \L{,} \S{color expression} \) + \O \FL{withshadecenter} \L{pair expression} +\StopSyntax + +\StartSyntax +\S{drawing command} + \M \L{draw} \S{picture expression} \S{option list} + \O \S{fill type} \S{path expression} \S{option list} +\StopSyntax + +\StartSyntax +\S{fill type} + \M \L {fill} \O \L{unfill} \O \FL{refill} + \O \L {draw} \O \L{undraw} \O \FL{redraw} + \O \L {filldraw} \O \FL{drawfill} \O \L{undrawfill} \O \L{unfilldraw} + \O \FL{eofill} \O \FL{nofill} \O \FL{fillup} + \O \L {drawdot} + \O \L {drawarrow} \O \L{drawdblarrow} + \O \L {cutdraw} + \O \L {visualizer} + \O \FL{normaldraw} \O \FL{normalfill} +\StopSyntax + +\StartSyntax +\S{visualizer} + \M \FL{drawboundary} \O \FL{drawboundingbox} \O \FL{drawboundoptions} + \O \FL{drawcontrollines} \O \FL{drawcontroloptions} \O \FL{drawcontrolpoints} + \O \FL{drawlabeloptions} \O \FL{drawlineoptions} \O \FL{drawoptions} + \O \FL{draworigin} \O \FL{draworiginoptions} + \O \FL{drawpath} \O \FL{drawpathoptions} + \O \FL{drawpoint} \O \FL{drawpointlabels} \O \FL{drawpointoptions} + \O \FL{drawpoints} \O \FL{drawwholepath} + \O \FL{visualizeddraw} \O \FL{visualizedfill} +\StopSyntax + +\StartSyntax +\S{newinternal command} + \M \L{newinternal} \S{internal type} \S{symbolic token list} + \O \S{newinternal} \S{symbolic token list} +\StopSyntax + +\StartSyntax +\S{message command} + \M \L{errhelp} \S{string expression} + \O \L{errmessage} \S{string expression} + \O \L{filenametemplate} \S{string expression} + \O \L{message} \S{string expression} +\StopSyntax + +\StartSyntax +\S{mode command} + \M \L{batchmode} + \O \L{nonstopmode} + \O \L{scrollmode} + \O \L{errorstopmode} + \O \L{interact} +\StopSyntax + +\StartSyntax +\S{special command} + \M \L{fontmapfile} \S{string expression} + \O \L{fontmapline} \S{string expression} + \O \L{special} \S{string expression} + \O \L{input} \S{string expression} + \O \L{prologies} \S{numeric expression} + \O \L{outputtemplate} \S{string expression} + \O \L{outputformat} \S{string expression} +\StopSyntax + +\StartSyntax +\S{tracing command} + \M \L{tracingall} + \O \L{loggingall} + \O \L{tracingnone} +\StopSyntax + +\StartSyntax +\S{if test} + \M \L{if} \S{boolean expression} \L{:} \S{balanced tokens} \S{alternatives} \L{fi} +\StopSyntax + +\StartSyntax +\S{alternatives} + \M \S{empty} + \O \L{else} \L{:} \S{balanced tokens} + \O \L{elseif} \S{boolean expression} \S{:} \S{balanced tokens} \S{alternatives} + \O \L{exit} \O \L{exitif} \S{boolean expression} \O \L{exitunless} \S{boolean expression} + \O \L{break} +\StopSyntax + +\StartSyntax +\S{loop} + \M \S{loop header} \L{:} \S{loop text} \L{endfor} +\StopSyntax + +\StartSyntax +\S{loop header} + \M \L{for} \S{symbolic token} \L{=} \S{progression} + \O \L{for} \S{symbolic token} \L{=} \S{for list} + \O \L{for} \S{symbolic token} \L{within} \S{picture expression} + \O \L{forsuffixes} \S{symbolic token} \L{=} \S{suffix list} + \O \L{forever} +\StopSyntax + +\StartSyntax +\S{progression} + \M \S{numeric expression} \L{upto} \S{numeric expression} + \O \S{numeric expression} \L{downto} \S{numeric expression} + \O \S{numeric expression} \L{step} \S{numeric expression} \L{until} \S{numeric expression} + \O \L{range} \S{numeric expression} \L{thru} \S{numeric expression} +\StopSyntax + +\StartSyntax +\S{for list} + \M \S{expression} + \O \S{for list} \L{,} \S{expression} +\StopSyntax + +\StartSyntax +\S{suffix list} + \M \S{suffix} + \O \S{suffix list} \L{,} \S{suffix} +\StopSyntax + +\stop + +% \stopsection + +\stopchapter + +\stopcomponent + +% \startsection[title={Left overs}] + +% There are a few more concepts and commands available in \METAFUN, like color +% remapping, shading and graphic inclusion. Because they have their own small +% syntax world, we present them here. +% +% You may consider shades to be internally represented by a hidden datastructure. +% The end user has access to a shade by means of a pointer, expressed in a numeric. +% +% \start \switchtobodyfont[small] +% +% \StartSyntax +% \S{pseudo procedure} +% \M \FL{linear_shade}% +% \( \S{path expression} \L{,} \S{numeric expression}% +% \L{,} \S{color expression} \L{,} \S{color expression} \) +% \O \FL{circular_shade}% +% \( \S{path expression} \L{,} \S{numeric expression}% +% \L{,} \S{color expression} \L{,} \S{color expression} \) +% \StopSyntax +% +% \StartSyntax +% \S{pseudo function} +% \M \FL{define_linear_shade}% +% \( \S{pair expr} \L{,} \S{pair expr}% +% \L{,} \S{color expr} \L{,} \S{color expr} \) +% \O \FL{define_circular_shade}% +% \( \S{pair expr} \L{,} \S{pair expr}% +% \L{,} \S{path expr} \L{,} \S{path expr}% +% \L{,} \S{color expr} \L{,} \S{color expr} \) +% \O \FL{predefined_linear_shade}% +% \( \S{path expr} \L{,} \S{numeric expr}% +% \L{,} \S{color expr} \L{,} \S{color expr} \) +% \O \FL{predefined_circular_shade}% +% \( \S{path expr} \L{,} \S{numeric expr}% +% \L{,} \S{color expr} \L{,} \S{color expr} \) +% \StopSyntax +% +% \stop + +% External figures are just files, so the string passed as first argument needs to +% be a valid filename. Additionally, they need to be given dimensions. + +% \start \switchtobodyfont[small] +% +% \StartSyntax +% \S{pseudo procedure} +% \M \FL{externalfigure} \S{string expression} \S{transformer} +% \StopSyntax +% +% \stop + +% An external \METAPOST\ graphic can be loaded by filename and figure number. The +% normal transformations can be applied. +% +% \start \switchtobodyfont[small] +% +% \StartSyntax +% \S{pseudo procedure} +% \M \FL{loadfigure} \S{string expression} \L{number} \S{numeric expression} \S{transformer} +% \StopSyntax +% +% \stop + +% A graphic text is (normally) an outline representation of a snippet of text +% typeset by \TEX. This procedure has a couple of dedicated options. + +% \start \switchtobodyfont[small] + +% \StartSyntax +% \S{pseudo procedure} +% \M \FL{graphictext} \S{string expression} \S{transformer} \S{text option list} +% \O \FL{regraphictext} \S{transformer} \S{text option list} +% \StopSyntax + +% \StartSyntax +% \S{text option list} +% \M \S{empty} +% \O \S{text drawing option} \S{text option list} +% \StopSyntax + +% \StartSyntax +% \S{text drawing option} +% \M \S{drawing option} +% \O \FL{reversefill} +% \O \FL{outlinefill} +% \O \FL{withdrawcolor} \S{color expression} +% \O \FL{withfillcolor} \S{color expression} +% \StopSyntax + +% \StartSyntax +% \S{pseudo procedure} +% \M \FL{resetgraphictextdirective} +% \O \FL{graphictextdirective} \S {string expression} +% \StopSyntax + +% \StartSyntax +% \S{internal variable} +% \M \FL{graphictextformat} +% \StopSyntax + +% \stop + +% \stopsection + +% \stopchapter + +% \stopcomponent diff --git a/doc/context/sources/general/manuals/metafun/metafun-text.tex b/doc/context/sources/general/manuals/metafun/metafun-text.tex new file mode 100644 index 000000000..f70f53ac3 --- /dev/null +++ b/doc/context/sources/general/manuals/metafun/metafun-text.tex @@ -0,0 +1,1784 @@ +% language=uk +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\startcomponent metafun-text + +\environment metafun-environment + +\startchapter[reference=sec:typesetting,title={Typesetting in \METAPOST}] + +\startintro + +It is said that a picture tells more than a thousand words. So you might expect +that text in graphics becomes superfluous. Out of experience we can tell you that +this is not the case. In this chapter we explore the ways to add text to +\METAPOST\ graphics, and let you choose whether or not to have it typeset by +\TEX. + +\stopintro + +\startsection[title={The process}] + +\index{text} + +You can let \METAPOST\ process text that is typeset by \TEX. Such text is first +embedded in the \METAPOST\ file in the following way: + +\starttyping +btex Some text to be typeset by \TEX etex +\stoptyping + +This returns a picture, but only after \METAPOST\ has made sure that \TEX\ has +converted it into something useful. This process of conversion is slightly system +dependent and even a bit obscure. Traditional \METAPOST\ calls a program that +filters the \type {btex}|\unknown|\type {etex} commands, next it calls \TEX\ by +passing the output routine, in order to make sure that each piece of text ends up +on its own page, and afterwards it again calls a program that converts the \DVI\ +pages into \METAPOST\ pictures. In \LUATEX's \MPLIB\ a different route is +followed. + +In \CONTEXT\ \MKII, when using \WEBC, you can generate the graphics at run||time. +This takes more time than processing the graphics afterwards, but has the +advantage that \TEX\ knows immediately what graphic it is dealing with. When +enabled, \CONTEXT\ will call either \METAPOST, or, when the graphic contains +\type {btex}||\type {etex} commands, call \TEXEXEC, which in turn makes sure that +the right auxiliary programs are executed. + +In \CONTEXT\ \MKIV\ you won't notice this at all because everything is tightly +integrated with \LUATEX's \MPLIB. This has an enormous speed gain: when this +manual had about 425 pages, on my laptop with mobile 3840QM processor, one run of +this document takes 18 seconds (14.5 with \LUAJITTEX) and that includes loadint a +bunch of (outline) fonts and processing some 2200 \METAPOST\ images. While +writing the first version of this manual runtime was upto 50 times slower for +half the number of pages so compared to \MKII\ we have gained a lot. + +\startFLOWchart[metatex] + \startFLOWcell + \name {script 1} + \location {1,1} + \shape {action} + \text {\type{context}} + \connection [rl] {context 1} + \stopFLOWcell + \startFLOWcell + \name {context 1} + \location {2,1} + \shape {action} + \text {\CONTEXT} + \connection [bt] {metapost 1} + \connection [rl] {script 2} + \stopFLOWcell + \startFLOWcell + \name {metapost 1} + \location {2,2} + \shape {action} + \text {\METAPOST} + \stopFLOWcell + \startFLOWcell + \name {script 2} + \location {3,1} + \shape {action} + \text {\type{context}} + \connection [rl] {context 2} + \connection [bt] {metapost 2} + \stopFLOWcell + \startFLOWcell + \name {context 2} + \location {4,1} + \shape {action} + \text {\CONTEXT} + \stopFLOWcell + \startFLOWcell + \name {metapost 2} + \location {3,2} + \shape {action} + \text {\METAPOST} + \stopFLOWcell +\stopFLOWchart + +\startplacefigure[title={How \TEX\ and \METAPOST\ work together.}] + \FLOWchart[metatex] +\stopplacefigure + +\stopsection + +\startsection[title={Environments}] + +\index{environments} + +In case you want to pass code that is shared by all \type {btex}||\type {etex} +pictures, \METAPOST\ provides: + +\starttyping +verbatimtex \DefineSomeCommands etex ; +\stoptyping + +However, in \CONTEXT\ one has a better mechanism available. In \CONTEXT\ \MKII\ +the advised method is passing environments. The best way to pass them is the +following. As an example we switch to the 15 basic \POSTSCRIPT\ fonts. + +\startbuffer[pos] +\startMPenvironment + \usetypescript[palatino][texnansi] % mkii has encodings + \setupbodyfont[palatino] +\stopMPenvironment +\stopbuffer + +\typebuffer[pos] + +This means that in code like the following, a Palatino font will be used. + +\starttyping +\startMPcode +draw btex Meta is a female lion! etex + xysized (\the\textwidth,\the\textheight) ; +\stopMPcode +\stoptyping + +However, in \CONTEXT\ \MKIV\ this method is no longer recomended as all +processing happens in the same run anyway. + +% beware: extensive scaling can make acrobat crash and okular drop the ! + +\startbuffer[lioncode] +\startMPcode +numeric w, h ; w := \the\textwidth ; h := w/2 ; + +picture p ; p := btex \colored[r=.375,g=.375]{Meta is a female lion!} etex + xysized (w,h) ; +picture q ; q := btex \colored[r=.625] {Meta is a female lion!} etex + xysized (w,h) ; + +path b ; b := boundingbox p ; draw p ; + +for i=(.28w,.90h),(.85w,.90h),(w,.05h) : + picture r ; r := q ; + path s ; s := (fullsquare xscaled .05w yscaled .4h) shifted i ; + clip r to s ; draw r ; % draw s ; +endfor ; + +setbounds currentpicture to b ; +\stopMPcode +\stopbuffer + +\typebuffer[lioncode] + +\in {Figure} [lionclip] shows the previous sentence in a slightly different look. +You may consider coloring the dots to be an exercise in clipping. + +\getbuffer[pos] + +\placefigure + [here][lionclip] + {An example of clipping.} + {\getbuffer[lioncode]} + +\resetMPenvironment + +An environment can be reset with \typ {\resetMPenvironment} or by passing \type +{reset} to \typ {\startMPenvironment}. + +\starttyping +\startMPenvironment[reset] + \usetypescript[postscript][texnansi] % mkii + \setupbodyfont[postscript] +\stopMPenvironment +\stoptyping + +So, to summarize: if you're using \CONTEXT\ \MKIV\ you might as well forgot what +you just read. + +\stopsection + +\startsection[title={Labels}] + +\index{labels} + +In \METAPOST\ you can use the \type {label} macro to position text at certain +points. + +\starttyping +label("x", origin) ; +\stoptyping + +The font and scale are determined by two variables, \type {defaultfont} and \type +{defaultscale}, the former expecting the name of a font in the form of a string, +the latter expecting a numeric to be used in the scaling of the font. Should you +choose not to set these yourself, they default to \type {"Mono"} and \type +{1.0}, respectively. However, you can change the defaults as follows: + +\starttyping +defaultfont := "texgyrepagella-regular*default" ; +defaultscale := 1.2 ; +\stoptyping + +These settings selects Pagella at about 12pt. You can also set these variables +to \CONTEXT\ related values. For \CONTEXT\ graphics they are set to: + +\starttyping +defaultfont := "\truefontname{Regular}*default" ; +defaultscale := \the\bodyfontsize/10 ; +\stoptyping + +This means that they will adapt themselves to the current body font (in this +document we get \truefontname{Regular}) and the current size of the bodyfont +(here \the\bodyfontsize/10). + +\stopsection + +\startsection[title={\TeX\ text}] + +\index{text} + +In the next example we will use a special mechanism for building graphics step by +step. The advantage of this method is that we can do intermediate calculations in +\TEX. Our objective is to write a macro that draws text along a circular path. +While doing so we want to achieve the following: + +\startitemize[packed] +\item the text should be properly kerned, i.e.\ the + spacing between characters should be optimal, +\item the position on the circle should vary, and +\item the radius of the circle should vary. +\stopitemize + +This implementation is not the most straightforward one, but by doing it step by +step, at least we see what is involved. Later, we will see a better method. If +you run these examples yourself, you must make sure that the \TEX\ environment of +your document matches the one used by \METAPOST. + +We let the bodyfont match the font used in this document, and define \type +{RotFont} to be the regular typeface, the one you are reading right now, but +bold. + +\startbuffer +\definefont[RotFont][RegularBold*default] +\stopbuffer + +\typebuffer \getbuffer + +Since \METAPOST\ is unaware of kerning, we have to use \TEX\ to keep track of the +positions. We will split the text into tokens (often characters) and store the +result in an array of pictures (\type {pic}). We will also store the accumulated +width in an array (\type {len}). The number of characters is stored in~\type {n}. +In a few paragraphs we will see why the other arrays are needed. + +While defining the graphic, we need \TEX\ to do some calculations. Therefore, we +will use \type {\startMPdrawing} to stepwise construct the definition. The basic +pattern we will follow is: + +\starttyping +\resetMPdrawing +\startMPdrawing + metapost code +\stopMPdrawing +tex code +\startMPdrawing + metapost code +\stopMPdrawing +\MPdrawingdonetrue +\getMPdrawing +\stoptyping + +In the process, we will use a few variables. We will store the individual +characters of the text in the variable \type {pic}, its width in \type {wid} and +the length of the string so far in \type {len}. Later we will use the \type {pos} +array to store the position where a character ends up. The variable \type {n} +holds the number of tokens. + +\startbuffer[init] +\resetMPdrawing +\startMPdrawing + picture pic[] ; + numeric wid[], len[], pos[], n ; + wid[0] := len[0] := pos[0] := n := 0 ; +\stopMPdrawing +\stopbuffer + +\typebuffer[init] + +We also started fresh by resetting the drawing. From now on, each start command +will add some more to this graphic. The next macro is responsible for collecting +the data. Each element is passed on to \TEX, using the \type {btex} construct. +So, \METAPOST\ itself will call \TEX ! + +\startbuffer[toks] +\def\whatever#1% + {\appendtoks#1\to\MPtoks + \setbox\MPbox=\hbox{\bfd\the\MPtoks}% + \startMPdrawing + n := n + 1 ; len[n] := \the\wd\MPbox ; + \stopMPdrawing + \startMPdrawing[-] + pic[n] := textext("\bfd\setstrut\strut#1") ; + pic[n] := pic[n] shifted - llcorner pic[n] ; + \stopMPdrawing} + +\handletokens MetaPost is Fun!\with\whatever +\stopbuffer + +\typebuffer[toks] + +We use the low level \CONTEXT\ macro \type {\appendtoks} to extend the token list +\type {\MPtoks}. The \type {\handletokens} macro passes each token (character) of +\typ {MetaPost is Fun!} to the macro \type {\whatever}. The tokens are appended +to the token register \type {\MPtoks} (already defined). Then we typeset the +content of \type {\MPtoks} in \type {\MPbox} (also already defined). The width of +the box is passed to \METAPOST\ and stored in \type {len}. + +By default the content of the drawing is expanded, which means that the macro is +replaced by its current meaning, so the current width ends up in the \METAPOST\ +file. The next part of the drawing, starting with \type {btex}, puts the token in +a picture. This time we don't expand the drawing, since we want to pass font +information. Here, the \type {[-]} suppresses expansion of \typ {btex \bfd #1 +etex}. The process is iterated by \type {\handletokens} for each character of the +text \typ {MetaPost is Fun!}. + +Before we typeset the text, now available in pieces in \type {pic}, in a circle, +we will first demonstrate what they look like. You may like to take a look at the +file \type {mpgraph.mp} to see what is passed to \METAPOST. + +\startbuffer[test] +\startMPdrawing + pair len ; len := origin ; + for i=1 upto n : + draw pic[i] shifted len ; + draw boundingbox pic[i] shifted len + withpen pencircle scaled .25pt withcolor red ; + len := len+(xpart urcorner pic[i]-xpart llcorner pic[i],0) ; + endfor ; +\stopMPdrawing +\stopbuffer + +\typebuffer[test] + +\startbuffer[show] +\MPdrawingdonetrue\getMPdrawing +\stopbuffer + +We can call up this drawing with \type {\getMPdrawing}, but first we inform the +compiler that our \METAPOST\ drawing is completed. + +\typebuffer[show] + +This results in: + +\startlinecorrection[blank] +\getbuffer[init,toks,test,show] +\stoplinecorrection + +Compare this text with the text as typeset by \TEX: + +\blank \start \bfd MetaPost is Fun!\par \stop \blank + +and you will see that the text produced by \METAPOST\ is not properly kerned. +When putting characters after each other, \TEX\ uses the information available in +the font, to optimize the spacing between characters, while \METAPOST\ looks at +characters as separate entities. But, since we have stored the optimal spacing in +\type {len}, we can let \METAPOST\ do a better job. Let's first calculate the +correction needed. + +\startbuffer[kern] +\startMPdrawing + for i=1 upto n : + wid[i] := abs(xpart urcorner pic[i] - xpart llcorner pic[i]) ; + pos[i] := len[i]-wid[i] ; + endfor ; +\stopMPdrawing +\stopbuffer + +\typebuffer[kern] + +This compares well to the text as typeset by \TEX: + +\blank \start \bfd MetaPost is Fun!\par \stop \blank + +We can now use the values in \type {pos} to position the pictures according to +what \TEX\ considered to be the best (relative) position. + +\startbuffer[test] +\startMPdrawing + for i=1 upto n : + draw pic[i] shifted (pos[i],0) ; + draw boundingbox pic[i] shifted (pos[i],0) + withpen pencircle scaled .25pt withcolor red ; + endfor ; +\stopMPdrawing +\stopbuffer + +\typebuffer[test] + +That this correction is adequate, is demonstrated in the next graphic. If you +look closely, you will see that for instance the \quote {o} is moved to the left, +under the capital \quote {P}. + +\startlinecorrection[blank] +\getbuffer[init,toks,kern,test,show] +\stoplinecorrection + +When we want to position the pictures along a circle, we need to apply some +rotations, especially because we want to go clockwise. Since we don't want to use +\quote {complicated} math or more advanced \METAPOST\ code yet, we will do it in +steps. + +\startbuffer[swap] +\startMPdrawing + for i=1 upto n: + pic[i] := pic[i] rotatedaround(origin,-270) ; + endfor ; +\stopMPdrawing +\stopbuffer + +\typebuffer[swap] + +\startlinecorrection[blank] +\getbuffer[init,toks,kern,swap,test,show] +\stoplinecorrection + +\startbuffer[cent] +\startMPdrawing + for i=1 upto n : + pic[i] := pic[i] + shifted (0,ypart -.5[ulcorner pic[i],llcorner pic[i]]) ; + endfor ; +\stopMPdrawing +\stopbuffer + +We will now center the pictures around the baseline. Centering comes down to +shifting over half the height of the picture. This can be expressed by: + +\starttyping +ypart -.5[ulcorner pic[i],llcorner pic[i]] +\stoptyping + +but different ways of calculating the distance are possible +too. + +\typebuffer[cent] + +So, now we have: + +\startlinecorrection[blank] +\getbuffer[init,toks,kern,swap,cent,test,show] +\stoplinecorrection + +When we typeset on a (half) circle, we should map the actual length onto a +partial circle. We denote the radius with an~\type {r} and shift the pictures to +the left. + +\startbuffer[shif] +\startMPdrawing + numeric r ; r := len[n]/pi ; + for i=1 upto n : + pic[i] := pic[i] shifted (-r,0) ; + endfor ; +\stopMPdrawing +\stopbuffer + +\typebuffer[shif] + +You can now use the following code to test the current state of the pictures. Of +course this code should not end up in the final definitions. + +\startbuffer[test] +\startMPdrawing + draw origin + withpen pencircle scaled 5pt withcolor red ; + for i=1 upto n : + draw pic[i] ; + draw boundingbox pic[i] + withpen pencircle scaled .25pt withcolor red ; + endfor ; +\stopMPdrawing +\stopbuffer + +\typebuffer[test] + +\startlinecorrection[blank] +\getbuffer[init,toks,kern,swap,cent,shif,test,show] +\stoplinecorrection + +Later we will write a compact, efficient macro to take care of rotation. However, +for the moment, so as not to overwhelm you with complicated code, we will rotate +each individual picture with the following code fragment. + +\startbuffer[rots] +\startMPdrawing + numeric delta, extra, radius, rot[] ; + + delta := extra := radius := 0 ; + + for i=1 upto n : + rot[i] := extra+delta-((pos[i]+.5wid[i])/len[n])*(180+2delta) ; + endfor ; +\stopMPdrawing +\stopbuffer + +\typebuffer[rots] + +Here we introduce a few variables that we can use later to tune the result a bit. +With \type {delta}, the space between the characters can be increased, while +\type {extra} rotates the whole string around the origin. The \type {radius} +variable can be used to increase the distance to the origin. Without these +variables, the assignment would have been: + +\starttyping +rot[i] := ((pos[i]+.5wid[i])/len[n])*180 ; +\stoptyping + +Placing the pictures is now rather easy: + +\startbuffer[done] +\startMPdrawing + for i=1 upto n : + draw pic[i] shifted (-radius,0) rotatedaround(origin,rot[i]) ; + endfor ; +\stopMPdrawing +\stopbuffer + +\typebuffer[done] + +The pictures are now positioned on half a circle, properly kerned. + +\startlinecorrection[blank] +\getbuffer[init,toks,kern,swap,cent,shif,rots,done,show] +\stoplinecorrection + +A bit more insight is given in the next picture: + +\startbuffer[test] +\startMPdrawing + def moved(expr i) = + shifted (-radius,0) rotatedaround(origin,rot[i]) + enddef ; + pickup pencircle scaled .5pt ; + for i=1 upto n : + draw pic[i] moved(i) ; + draw boundingbox pic[i] moved(i) withcolor red ; + draw origin -- center pic[i] moved(i) withcolor green ; + endfor ; + draw tcircle scaled 2r withcolor blue ; +\stopMPdrawing +\stopbuffer + +\startlinecorrection[blank] +\getbuffer[init,toks,kern,swap,cent,shif,rots,test,show] +\stoplinecorrection + +This was defined as follows. The path variable \type {tcycle} is predefined to +the top half of a fullcircle. + +\typebuffer[test] + +We will now package all of this into a nice, efficient macro, using, of course, +the predefined scratch registers \type {\MPtoks} and \type {\MPbox}. First we +define the token processor. Note again the expansion inhibition switch \type +{[-]}. + +\startbuffer +\def\processrotationtoken#1% + {\appendtoks#1\to\MPtoks + \setbox\MPbox=\hbox{\RotFont\the\MPtoks}% + \startMPdrawing + n := n + 1 ; len[n] := \the\wd\MPbox ; + \stopMPdrawing + \startMPdrawing[-] + pic[n] := textext("\RotFont\setstrut\strut#1") ; + pic[n] := pic[n] shifted - llcorner pic[n] ; + \stopMPdrawing} +\stopbuffer + +\typebuffer + +\getbuffer + +The main macro is a bit more complicated but by using a few scratch numerics, we +can keep it readable. + +\startbuffer +\def\rotatetokens#1#2#3#4% delta extra radius tokens + {\vbox\bgroup + \MPtoks\emptytoks + \resetMPdrawing + \startMPdrawing + picture pic[] ; + numeric wid, len[], rot ; + numeric delta, extra, radius, n, r ; + len[0] := n := 0 ; + delta := #1 ; extra := #2 ; radius := #3 ; + \stopMPdrawing + \handletokens#4\with\processrotationtoken + \startMPdrawing + r := len[n]/pi ; + for i=1 upto n : + wid := abs(xpart lrcorner pic[i] - + xpart llcorner pic[i]) ; + rot := extra + delta - + ((len[i]-.5wid)/len[n]) * (180+2delta) ; + draw pic[i] + rotatedaround (origin,-270) shifted (-r-radius, + ypart -.5[ulcorner pic[i], llcorner pic[i]]) + rotatedaround (origin,rot) ; + endfor ; + \stopMPdrawing + \MPdrawingdonetrue + \getMPdrawing + \resetMPdrawing + \egroup} +\stopbuffer + +\typebuffer + +\getbuffer + +\startbuffer +\startcombination[3*1] + {\rotatetokens {0} {0}{0}{Does it work ok?}} {A} + {\rotatetokens{20} {0}{0}{Does it work ok?}} {B} + {\rotatetokens{20}{30}{0}{Does it work ok?}} {C} +\stopcombination +\stopbuffer + +We can use this macro as follows: + +\typebuffer + +\startlinecorrection[blank] +\getbuffer +\stoplinecorrection + +The previous macro is not really an example of generalization, but we used it for +demonstrating how to build graphics in a stepwise way. If you put the steps in +buffers, you can even combine steps and replace them at will. This is how we made +the previous step by step examples: We put each sub||graphic in a buffer and then +called the ones we wanted. + +We now present a more general approach to typesetting along a given path. This +method is not only more robust and general, it is also a more compact definition, +especially if we omit the tracing and testing code. We use a familiar auxiliary +definition. The \type {\setstrut} and \type {\strut} commands ensure that the +lines have the proper depth and height. + +\startbuffer +\def\processfollowingtoken#1% + {\appendtoks#1\to\MPtoks + \setbox\MPbox=\hbox{\RotFont\setstrut\strut\the\MPtoks}% + \startMPdrawing + n := n + 1 ; len[n] := \the\wd\MPbox ; + \stopMPdrawing + \startMPdrawing[-] + pic[n] := btex \RotFont\setstrut\strut#1 etex ; + pic[n] := pic[n] shifted -llcorner pic[n] ; + \stopMPdrawing} +\stopbuffer + +\typebuffer \getbuffer + +In \MKII\ the previous code is collected in the macro \type {\followtokens} but +in \MKIV\ we use a different approach. There we use a mix of \TEX, \METAPOST, and +\LUA\ to define that macro. The principles remain the same but the code is more +robust. + +\input meta-imp-txt.mkiv % we need to force a reload \useMPlibrary[txt] + +So, how does this compare to earlier results? The original, full text as typeset +by \TEX, looks like: + +\blank \start \RotFont We now follow some arbitrary path ... \stop \blank + +In the examples, the text is typeset along the path with: + +\startbuffer[toks] +\followtokens{We now follow some arbitrary path ...} +\stopbuffer + +\typebuffer[toks] + +\startlinecorrection[blank] +\getbuffer[toks] +\stoplinecorrection + +Since we did not set a path, a dummy path is used. We can provide a path by +(re)defining the graphic \type {followtokens}. + +\startbuffer[trac] +\startMPinclusions + boolean TraceRot ; TraceRot := true ; +\stopMPinclusions +\stopbuffer + +\startbuffer[draw] +\startuseMPgraphic{followtokens} + path RotPath ; RotPath := fullcircle ; +\stopuseMPgraphic +\stopbuffer + +\startbuffer +\typebuffer[draw] +\startlinecorrection[blank] +\hbox + {\getbuffer[draw,toks]\hskip1cm + \getbuffer[trac,draw,toks]} +\stoplinecorrection +\stopbuffer + +\getbuffer + +\startbuffer[draw] +\startuseMPgraphic{followtokens} + path RotPath ; RotPath := reverse fullcircle ; +\stopuseMPgraphic +\stopbuffer + +\getbuffer + +\startbuffer[draw] +\startuseMPgraphic{followtokens} + path RotPath ; RotPath := (-3cm,-1cm)--(0,1cm)--(3cm,-1cm) ; +\stopuseMPgraphic +\stopbuffer + +\getbuffer + +\startbuffer[draw] +\startuseMPgraphic{followtokens} + path RotPath ; RotPath := (-3cm,0)--(3cm,1cm) ; +\stopuseMPgraphic +\stopbuffer + +\getbuffer + +\startbuffer[draw] +\startuseMPgraphic{followtokens} + path RotPath ; RotPath := (-3cm,0)..(-1cm,1cm)..(3cm,0) ; +\stopuseMPgraphic +\stopbuffer + +\getbuffer + +\startbuffer[draw] +\startuseMPgraphic{followtokens} + path RotPath ; RotPath := (-3cm,0)..(-1cm,1cm)..(0cm,-2cm)..(3cm,0) ; +\stopuseMPgraphic +\stopbuffer + +\getbuffer + +When turned on, tracing will produce bounding boxes as well as draw the path. +Tracing can be turned on by saying: + +\typebuffer[trac] + +% let's turn it off now + +\startMPinclusions + boolean TraceRot ; TraceRot := false ; +\stopMPinclusions + +The next example is dedicated to Giuseppe Bilotta who wants to handle multiple +strings and uses a patched version of \type {\followtokens}. To avoid a +complicated explanation, we will present an alternative here that uses overlays. +This method also avoids complicated path definitions. + +\startbuffer +\startoverlay + {\startuseMPgraphic{followtokens} + draw fullcircle scaled 5cm . + withpen pencircle scaled 1pt withcolor .625yellow ; + draw fullsquare scaled 5.25cm + withpen pencircle scaled 1pt withcolor .625red ; + drawoptions (withcolor .625red) ; + path RotPath ; RotPath := halfcircle scaled 5cm ; + setbounds currentpicture to boundingbox fullcircle scaled 5.25cm ; + \stopuseMPgraphic + \followtokens { Met{\`a} superiore }} + {\startuseMPgraphic{followtokens} + drawoptions (withcolor .625red) ; + path RotPath ; RotPath := halfcircle rotated 90 scaled 5cm ; + setbounds currentpicture to boundingbox fullcircle scaled 5.25cm ; + \stopuseMPgraphic + \followtokens { {$\star$} }} + {\startuseMPgraphic{followtokens} + drawoptions (withcolor .625red) ; + path RotPath ; RotPath := halfcircle rotated 180 scaled 5cm ; + setbounds currentpicture to boundingbox fullcircle scaled 5.25cm ; + \stopuseMPgraphic + \followtokens { Met{\`a} inferiore }} + {\startuseMPgraphic{followtokens} + drawoptions (withcolor .625red) ; + path RotPath ; RotPath := halfcircle rotated 270 scaled 5cm ; + setbounds currentpicture to boundingbox fullcircle scaled 5.25cm ; + \stopuseMPgraphic + \followtokens { {$\star$} }} +\stopoverlay +\stopbuffer + +\typebuffer + +In order to fool the overlay macro that each graphic has the same size, we force +a bounding box. + +\startlinecorrection[blank] +\getbuffer +\stoplinecorrection + +\stopsection + +\startsection[title={Talking to \TEX}] + +Sometimes, others may say oftentimes, we are in need for some fancy typesetting. +If we want to typeset a paragraph of text in a non standard shape, like a circle, +we have to fall back on \type {\parshape}. Unfortunately, \TEX\ is not that +strong in providing the specifications of more complicated shapes, unless you are +willing to do some complicated arithmetic \TEX. Given that \METAPOST\ knows how +to deal with shapes, the question is: \quotation {Can \METAPOST\ be of help?} + +In the process of finding out how to deal with this, we first define a simple +path. Because we are going to replace pieces of code, we will compose the graphic +from components. First, we create the path. + +\startbuffer +\startuseMPgraphic{text path} + path p ; p := ((0,1)..(-1,0)..(1,0)--cycle) scaled 65pt ; +\stopuseMPgraphic +\stopbuffer + +\typebuffer \getbuffer + +This shape is not that beautiful, but it has a few characteristics that will help +us to identify bordercases. + +\startbuffer +\startuseMPgraphic{text draw} + drawarrow p withpen pencircle scaled 1pt withcolor red ; +\stopuseMPgraphic +\stopbuffer + +\typebuffer \getbuffer + +Now we use \CONTEXT's \type {\includeMPgraphic} command to build our graphic from +the previously defined components. + +\startbuffer +\startuseMPgraphic{text} + \includeMPgraphic{text path} + \includeMPgraphic{text draw} +\stopuseMPgraphic +\stopbuffer + +\typebuffer \getbuffer + +When called with \type {\useMPgraphic{text}}, we get: + +\startlinecorrection[blank] +\useMPgraphic{text} +\stoplinecorrection + +For the moment we start the path at $(x=0,y>0)$, but later using more complicated +macros, we will see that we can use arbitrary paths. + +We are going to split the path in two, and will use the points that make up the +bounding box as calcutated by \METAPOST. The next graphic shows one of these +points, the lower left corner, available as point \typ {llcorner p}. + +\startbuffer +\startuseMPgraphic{text draw} + draw p withpen pencircle scaled 3pt withcolor red ; + draw boundingbox p withpen pencircle scaled 1pt ; + draw llcorner p withpen pencircle scaled 5pt ; +\stopuseMPgraphic +\stopbuffer + +\typebuffer \getbuffer + +\startlinecorrection[blank] +\useMPgraphic{text} +\stoplinecorrection + +The five points that \METAPOST\ can report for each path or picture are: + +\starttabulate[|Tl|l|] +\NC llcorner \NC lower left corner \NC \NR +\NC lrcorner \NC lower right corner \NC \NR +\NC urcorner \NC upper right corner \NC \NR +\NC ulcorner \NC upper left corner \NC \NR +\NC center \NC intersection of the diagonals \NC \NR +\stoptabulate + +If we want to typeset text inside this circle, we need to know where a line +starts and ends. Given that lines are horizontal and straight, we therefore need +to calculate the intersection points of the lines and the path. As a first step, +we calculate the top and bottom of the path and after that we split off the left +and right path. + +\startbuffer +\startuseMPgraphic{text split} + pair t, b ; path l, r ; + + t := (ulcorner p -- urcorner p) intersectionpoint p ; + b := (llcorner p -- lrcorner p) intersectionpoint p ; + + l := p cutbefore t ; l := l cutafter b ; + r := p cutbefore b ; r := r cutafter t ; +\stopuseMPgraphic +\stopbuffer + +\typebuffer \getbuffer + +The \type {intersectionpoint} macro returns the point where two paths cross. If +the paths don't cross, an error is reported, when the paths cross more times, +just one point is returned. The \type {cutafter} and \type {cutbefore} commands +do as their names say and return a path. + +In the \type {text split} code fragment, \type {t} and \type {b} are the top +points of the main path, while \type {l} and \type {r} become the left and right +half of path \type {p}. + +We now draw the original path using a thick pen and both halves with a thinner +pen on top of the original. The arrows show the direction. + +\startbuffer +\startuseMPgraphic{text draw} + draw p withpen pencircle scaled 3pt withcolor red ; + drawarrow l withpen pencircle scaled 1pt withcolor green ; + drawarrow r withpen pencircle scaled 1pt withcolor blue ; +\stopuseMPgraphic +\stopbuffer + +\typebuffer \getbuffer + +We use \type {\includeMPgraphic} to assemble the components: + +\startbuffer +\startuseMPgraphic{text} + \includeMPgraphic{text path} + \includeMPgraphic{text split} + \includeMPgraphic{text draw} +\stopuseMPgraphic +\stopbuffer + +\typebuffer \getbuffer + +This graphic is typeset with \type {\useMPgraphic{text}}: + +\startlinecorrection[blank] +\useMPgraphic{text} +\stoplinecorrection + +Before we are going to use them, we define some variables that specify the text. +We use a baseline distance of 8~points. The part of the line above the baseline +is 7.2~points, while the (maximum) depth is 2.8~points. These ratios are the ones +we use in \CONTEXT. Because we don't want the text to touch the circle so we +define an offset too. + +\startbuffer +\startuseMPgraphic{text vars} + baselineskip := 8pt ; + strutheight := (7.2/10) * baselineskip ; + strutdepth := (2.8/10) * baselineskip ; + offset := baselineskip/2 ; + topskip := strutheight ; +\stopuseMPgraphic +\stopbuffer + +\typebuffer \getbuffer + +We more or less achieve the offset by scaling the path. In doing so, we use the +width and height, which we call \type {hsize} and \type {vsize}, thereby +conforming to the \TEX\ naming scheme. + +First we calculate both dimensions from the bounding box of the path. Next we +down scale the path to compensate for the offset. When done, we recalculate the +dimensions. + +\startbuffer +\startuseMPgraphic{text move} + pair t, b ; path q, l, r ; + + hsize := xpart lrcorner p - xpart llcorner p ; + vsize := ypart urcorner p - ypart lrcorner p ; + + q := p xscaled ((hsize-2offset)/hsize) + yscaled ((vsize-2offset)/vsize) ; + + hsize := xpart lrcorner q - xpart llcorner q ; + vsize := ypart urcorner q - ypart lrcorner q ; +\stopuseMPgraphic +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer +\startuseMPgraphic{text split} + t := (ulcorner q -- urcorner q) intersectionpoint q ; + b := (llcorner q -- lrcorner q) intersectionpoint q ; + + l := q cutbefore t ; l := l cutafter b ; + r := q cutbefore b ; r := r cutafter t ; +\stopuseMPgraphic +\stopbuffer + +We adapt the \type {text split} code to use the reduced path +instead of the original. + +\typebuffer \getbuffer + +\startbuffer +\startuseMPgraphic{text draw} + drawarrow p withpen pencircle scaled 1pt withcolor red ; + draw t withpen pencircle scaled 2pt ; + draw b withpen pencircle scaled 2pt ; + drawarrow l withpen pencircle scaled 1pt withcolor green ; + drawarrow r withpen pencircle scaled 1pt withcolor blue ; +\stopuseMPgraphic +\stopbuffer + +In order to test what we have reached so far, we draw the original path, the left +and right part of the reduced path, and both the top and bottom point. + +\typebuffer \getbuffer + +Again we use \type {\includeMPgraphic} to combine the +components into a graphic. + +\startbuffer +\startuseMPgraphic{text} + \includeMPgraphic{text path} \includeMPgraphic{text vars} + \includeMPgraphic{text move} \includeMPgraphic{text split} + \includeMPgraphic{text draw} +\stopuseMPgraphic +\stopbuffer + +\typebuffer \getbuffer + +Then we use \type {\useMPgraphic{text}} to call up the picture. + +\startlinecorrection[blank] +\useMPgraphic{text} +\stoplinecorrection + +The offset is not optimal. Note the funny gap at the top. We could try to fix +this, but there is a better way to optimize both paths. + +We lower the top edge of \type {q}'s bounding box by \type {topskip}, then cut +any part of the left and right pieces of \type {q} that lie above it. Similarly, +we raise the bottom edge and cut off the pieces that fall below this line. + +\startbuffer +\startuseMPgraphic{text cutoff} + path tt, bb ; + + tt := (ulcorner q -- urcorner q) shifted (0,-topskip) ; + bb := (llcorner q -- lrcorner q) shifted (0,strutdepth) ; + + l := l cutbefore (l intersectionpoint tt) ; + l := l cutafter (l intersectionpoint bb) ; + r := r cutbefore (r intersectionpoint bb) ; + r := r cutafter (r intersectionpoint tt) ; +\stopuseMPgraphic +\stopbuffer + +\typebuffer \getbuffer + +Because we use \type {\includeMPgraphic} to construct the graphic, we can +redefine \type {text draw} to show the result of this effort. + +\startbuffer +\startuseMPgraphic{text draw} + drawarrow p withpen pencircle scaled 1pt withcolor red ; + drawarrow l withpen pencircle scaled 1pt withcolor green ; + drawarrow r withpen pencircle scaled 1pt withcolor blue ; +\stopuseMPgraphic +\stopbuffer + +\typebuffer \getbuffer + +The \type {text} graphic now becomes: + +\startbuffer +\startuseMPgraphic{text} + \includeMPgraphic{text path} \includeMPgraphic{text vars} + \includeMPgraphic{text move} \includeMPgraphic{text split} + \includeMPgraphic{text cutoff} \includeMPgraphic{text draw} +\stopuseMPgraphic +\stopbuffer + +\typebuffer \getbuffer + +Or, as graphic: + +\startlinecorrection[blank] +\useMPgraphic{text} +\stoplinecorrection + +We are now ready for an attempt to calculate the shape of the text. For each +line, we have to calculate the left and right intersection points, and since a +line has a height and depth, we have to determine which part touches first. + +\startbuffer +\startuseMPgraphic{text calc} + vardef found_point (expr lin, pat, sig) = + pair a, b ; + a := pat intersection_point (lin shifted (0,strutheight)) ; + if intersection_found : + a := a shifted (0,-strutheight) ; + else : + a := pat intersection_point lin ; + fi ; + b := pat intersection_point (lin shifted (0,-strutdepth)) ; + if intersection_found : + if sig : + if xpart b > xpart a : a := b shifted (0,strutdepth) fi ; + else : + if xpart b < xpart a : a := b shifted (0,strutdepth) fi ; + fi ; + fi ; + a + enddef ; +\stopuseMPgraphic +\stopbuffer + +\typebuffer \getbuffer + +Instead of using \METAPOST's \type {intersectionpoint} macro, we use one that +comes with \CONTEXT. That way we don't get an error message when no point is +found, and can use a boolean flag to take further action. Since we use a \type +{vardef}, all calculations are hidden and the~\type {a} at the end is returned, +so that we can use this macro in an assignment. The \type {sig} variable is used +to distinguish between the beginning and end of a line (the left and right +subpath). + +\startbuffer +\startuseMPgraphic{text step} + path line; pair lll, rrr ; + + for i=topskip step baselineskip until vsize : + + line := (ulcorner q -- urcorner q) shifted (0,-i) ; + + lll := found_point(line,l,true ) ; + rrr := found_point(line,r,false) ; +\stopuseMPgraphic +\stopbuffer + +\typebuffer \getbuffer + +Here we divide the available space in lines. The first line starts at \type +{strutheight} from the top. + +We can now finish our graphic by visualizing the lines. Both the height and depth +of the lines are shown. + +\startbuffer +\startuseMPgraphic{text line} + fill (lll--rrr--rrr shifted (0,strutheight)--lll + shifted (0,strutheight)--cycle) withcolor .5white ; + fill (lll--rrr--rrr shifted (0,-strutdepth)--lll + shifted (0,-strutdepth)--cycle) withcolor .7white ; + draw lll withpen pencircle scaled 2pt ; + draw rrr withpen pencircle scaled 2pt ; + draw (lll--rrr) withpen pencircle scaled .5pt ; +\stopuseMPgraphic + +\startuseMPgraphic{text done} + endfor ; +\stopuseMPgraphic +\stopbuffer + +\typebuffer \getbuffer + +The result is still a bit disappointing. + +\startbuffer +\startuseMPgraphic{text} + \includeMPgraphic{text path} \includeMPgraphic{text vars} + \includeMPgraphic{text move} \includeMPgraphic{text split} + \includeMPgraphic{text cutoff} \includeMPgraphic{text draw} + \includeMPgraphic{text calc} \includeMPgraphic{text step} + \includeMPgraphic{text line} \includeMPgraphic{text done} +\stopuseMPgraphic +\stopbuffer + +\typebuffer \getbuffer +\startlinecorrection[blank] +\useMPgraphic{text} +\stoplinecorrection + +In order to catch the overflow at the bottom, we need to change the \type +{for}||loop a bit, so that the number of lines does not exceed the available +space. The test that surrounds the assignment of \type {vvsize} makes sure that +we get better results when we (on purpose) take a smaller height. + +\startbuffer +\startuseMPgraphic{text step} + path line; pair lll, rrr ; numeric vvsize ; + + if (strutheight+strutdepth<baselineskip) : + vvsize := vsize ; + else : + vvsize := (vsize div baselineskip) * baselineskip ; + fi ; + + for i=topskip step baselineskip until vvsize : + + line := (ulcorner q -- urcorner q) shifted (0,-i) ; + + lll := found_point(line,l,true ) ; + rrr := found_point(line,r,false) ; +\stopuseMPgraphic +\stopbuffer + +\typebuffer \getbuffer + +\startlinecorrection[blank] +\useMPgraphic{text} +\stoplinecorrection + +We can manipulate the heigth and depth of the lines to give different (and maybe +better) results. + +\startbuffer +\startuseMPgraphic{text vars} +baselineskip := 8pt ; +strutheight := 4pt ; +strutdepth := 2pt ; +offset := 4pt ; +topskip := 3pt ; +\stopuseMPgraphic +\stopbuffer + +\typebuffer \getbuffer + +\startlinecorrection[blank] +\useMPgraphic{text} +\stoplinecorrection + +This kind of graphic trickery in itself is not enough to get \TEX\ into +typesetting within the bounds of a closed curve. Since \METAPOST\ can write +information to a file, and \TEX\ can read such a file, a natural way to handle +this is to let \METAPOST\ write a \type {\parshape} specification. + +\startbuffer +\startuseMPgraphic{text macro} + def provide_parshape (expr p, offset, baselineskip, + strutheight, strutdepth, topskip) = + + \includeMPgraphic{text move} + \includeMPgraphic{text split} + \includeMPgraphic{text cutoff} + \includeMPgraphic{text draw} + \includeMPgraphic{text calc} + \includeMPgraphic{text loop} + \includeMPgraphic{text save} + + enddef ; +\stopuseMPgraphic +\stopbuffer + +\typebuffer \getbuffer + +We have to adapt the for||loop to register the information about the lines. After +the loop we write those values to a file using another loop. + +\startbuffer +\startuseMPgraphic{text loop} + path line; pair lll, rrr ; numeric vvsize, n ; n := 0 ; + + if (strutheight+strutdepth<baselineskip) : + vvsize := vsize ; + else : + vvsize := (vsize div baselineskip) * baselineskip ; + fi ; + + for i=topskip step baselineskip until vvsize : + + line := (ulcorner q -- urcorner q) shifted (0,-i) ; + + lll := found_point(line,l,true ) ; + rrr := found_point(line,r,false) ; + + n := n + 1 ; + + indent[n] := abs(xpart lll - xpart llcorner q) ; + width[n] := abs(xpart rrr - xpart lll) ; + + endfor ; +\stopuseMPgraphic + +\startuseMPgraphic{text save} + write "\parshape " & decimal n to "mfun-mp-data.txt" ; + for i=1 upto n: + write decimal indent[i]&"bp " & + decimal width[i]&"bp " to "mfun-mp-data.txt" ; + endfor ; + write EOF to "mfun-mp-data.txt" ; +\stopuseMPgraphic +\stopbuffer + +\typebuffer \getbuffer + +We can call this macro using the part we used in the previous examples. + +\startbuffer +\startuseMPgraphic{text} + \includeMPgraphic{text macro} + + path p ; p := ((0,1)..(-1,0)..(1,0)--cycle) scaled 65pt ; + + provide_parshape + (p, % shape path + .5*\baselinedistance, % offset + \baselinedistance, % distance between lines + \strutheight, % height of a line + \strutdepth, % depth of a line + \strutheight) ; % height of first line +\stopuseMPgraphic +\stopbuffer + +\typebuffer \getbuffer + +After we called \type {\useMPgraphic{text}}, the resulting file looks as follows. +You can call up this file by its anonymous name \type {\MPdatafile}, since this +macro gets the value of the graphic at hand. + +\startnointerference + \useMPgraphic{text} +\stopnointerference + +\typefile{mfun-mp-data.txt} + +% \blank{\em todo: mp data file}\blank +% \writestatus{!!!!}{todo: mp data file} + +So, reading in this file at the start of a paragraph will setup \TEX\ to follow +this shape. + +The final implementation is a bit more complicated since it takes care of paths +that are not centered around the origin and don't start at the top point. We +achieve this by moving the path to the center: + +\starttyping +cp := center p ; q := p shifted - cp ; +\stoptyping + +The arbitrary starting point is taken care of by a slightly more complicated path +cutter. First we make sure that the path runs counterclockwise. + +\starttyping +if xpart directionpoint t of q < 0 : q := reverse q fi ; +\stoptyping + +Knowing this, we can split the path in two, using a slightly different splitter: + +\starttyping +l := q cutbefore t ; +l := l if xpart point 0 of q < 0 : & q fi cutafter b ; +r := q cutbefore b ; +r := r if xpart point 0 of q > 0 : & q fi cutafter t ; +\stoptyping + +As always, when implementing a feature like this, some effort goes into a proper +user interface. In doing so, we need some \TEX\ trickery that goes beyond this +text, like collecting text and splitting of the part needed. Also, we want to be +able to handle multiple shapes at once, like the next example demonstrates. + +\stopsection + +\startsection[title={Libraries}] + +\index{graphics+libraries} + +The macro discussed in the previous section is included in one of the \METAPOST\ +libraries, so we first have to say: + +\startbuffer +\useMPlibrary[txt] +\stopbuffer + +\typebuffer + +\getbuffer + +We define four shapes. They are not really beautiful, but they demonstrate what +happens in border cases. For instance, too small first lines are ignored. First +we define a circle. Watch how the dimensions are set in the graphic. The +arguments passed to \type {build_parshape} are: path, an offset, an additional +horizontal and vertical displacement, the baseline distance, the height and depth +of the line, and the height of the first line (topskip in \TEX\ terminology). The +height and depth of a line are often called strut height and depth, with a strut +being an invisible character with maximum dimensions. + +\startbuffer +\startuseMPgraphic{test 1} + path p ; p := fullcircle scaled 6cm ; + + build_parshape(p,6pt,0,0,\baselinedistance, + \strutheight,\strutdepth,\strutheight) ; + + draw p withpen pencircle scaled 1pt ; +\stopuseMPgraphic +\stopbuffer + +\typebuffer \getbuffer + +The second shape is a diamond. This is a rather useless shape, unless the text +suits the small lines at the top and bottom. + +\startbuffer +\startuseMPgraphic{test 2} + path p ; p := fullsquare rotated 45 scaled 5cm ; + + build_parshape(p,6pt,0,0,\baselinedistance, + \strutheight,\strutdepth,\strutheight) ; + + draw p withpen pencircle scaled 1pt ; +\stopuseMPgraphic +\stopbuffer + +\typebuffer \getbuffer + +The third and fourth shape demonstrate that providing a suitable offset is not +always trivial. + +\startbuffer +\startuseMPgraphic{test 3} + numeric w, h ; w := h := 6cm ; + path p ; p := (.5w,h) -- (0,h) -- (0,0) -- (w,0) & + (w,0) .. (.75w,.5h) .. (w,h) & (w,h) -- cycle ; + + build_parshape(p,6pt,0,0,\baselinedistance, + \strutheight,\strutdepth,\strutheight) ; + + draw p withpen pencircle scaled 1pt ; +\stopuseMPgraphic +\stopbuffer + +\typebuffer \getbuffer + +Contrary to the first three shapes, here we use a different path for the +calculations and the drawing. Watch carefully! If, instead of an offset, we pass +a path, \METAPOST\ is able to calculate the right dimensions and offsets. This is +needed, since we need these later on. + +\startbuffer +\startuseMPgraphic{test 4} + numeric w, h, o ; + + def shape = (o,o) -- (w-o,o) & (w-o,o) .. (.75w-o,.5h) .. + (w-2o,h-o) & (w-2o,h-o) -- (o,h-o) -- cycle + enddef ; + + w := h := 6cm ; o := 6pt ; path p ; p := shape ; + w := h := 6cm ; o := 0pt ; path q ; q := shape ; + + build_parshape(p,q,6pt,6pt,\baselinedistance, + \strutheight,\strutdepth,\strutheight) ; + + draw q withpen pencircle scaled 1pt ; +\stopuseMPgraphic +\stopbuffer + +\typebuffer \getbuffer + +Since we also want these graphics as backgrounds, we define them as overlays. If +you don't want to show the graphic, you may omit this step. + +\startbuffer +\defineoverlay[test 1][\useMPgraphic{test 1}] +\defineoverlay[test 2][\useMPgraphic{test 2}] +\defineoverlay[test 3][\useMPgraphic{test 3}] +\defineoverlay[test 4][\useMPgraphic{test 4}] +\stopbuffer + +\typebuffer \getbuffer + +As text, we use a quote from Douglas R.~Hofstadter's book \quotation {Metamagical +Themas, Questing for the Essence of Mind and Pattern}. Watch how we pass a list +of shapes. + +\startbuffer[text] +\startshapetext[test 1,test 2,test 3,test 4] + \forgetall % as it says + \setupalign[verytolerant,stretch,normal]% + \input douglas % Douglas R. Hofstadter +\stopshapetext +\stopbuffer + +\typebuffer[text] + +Finally we combine text and shapes. Since we also want a background, we use \type +{\framed}. The macros \type {\parwidth} and \type {\parheight} are automatically +set to the current shape dimensions. The normal result is shown in \in {figure} +[fig:shapes]. + +\startbuffer[shapes] +\startbuffer +\setupframed + [offset=overlay,align=normal,frame=off, + width=\parwidth,height=\parheight] +\startcombination[2*2] + {\framed[background=test 1]{\getshapetext}} {test 1} + {\framed[background=test 2]{\getshapetext}} {test 2} + {\framed[background=test 3]{\getshapetext}} {test 3} + {\framed[background=test 4]{\getshapetext}} {test 4} +\stopcombination +\stopbuffer +\stopbuffer + +\typebuffer[shapes] + +\getbuffer[shapes] + +By using a buffer we keep \type {\placefigure} readable. + +\startbuffer[a] +\placefigure + [here][fig:shapes] + {A continuous text, typeset in a non||standard shape, + spread over four areas, and right aligned.} + {\getbuffer} +\stopbuffer + +\startbuffer[b] +\placefigure + [here][fig:shapes] + {A continuous text, typeset in a non||standard shape, + spread over four areas.} + {\scale[factor=max,height=.9\textheight]{\getbuffer}} +\stopbuffer + +\typebuffer[a] + +\doifmodeelse{screen}{\getbuffer[text,b]}{\getbuffer[text,a]} + +The traced alternative is shown in \in {figure} [fig:traced shapes]. This one is +defined as: + +\startbuffer[a] +\placefigure + [here][fig:traced shapes] + {A continuous text, typeset in a non||standard shape, + spread over four areas (tracing on).} + {\startMPinclusions + boolean trace_parshape ; trace_parshape := true ; + \stopMPinclusions + \getbuffer} +\stopbuffer + +\startbuffer[b] +\placefigure + [here][fig:traced shapes] + {A continuous text, typeset in a non||standard shape, + spread over four areas (tracing on).} + {\startMPinclusions + boolean trace_parshape ; trace_parshape := true ; + \stopMPinclusions + \scale[factor=max,height=.9\textheight]{\getbuffer}} +\stopbuffer + +\typebuffer[a] + +\doifmodeelse{screen}{\getbuffer[text,b]}{\getbuffer[text,a]} + +% {\em This mechanism is still somewhat experimental and will be optimized and +% extended with name spaces and more.} + +\blank + +We can combine all those tricks, although the input is somewhat fuzzy. First we +define a quote typeset in a circular paragraph shape. + +\startbuffer[shape] +\startuseMPgraphic{center} + build_parshape(fullcircle scaled 8cm,0,0,0,\baselinedistance, + \strutheight,\strutdepth,\strutheight) ; +\stopuseMPgraphic + +\startshapetext[center] + \input douglas +\stopshapetext + +\defineoverlay[center][\useMPgraphic{center}] +\stopbuffer + +\typebuffer[shape] + +We will surround this text with a circular line, that we define as follows. By +using a buffer we keep things organized. + +\startbuffer +\startbuffer[circle] +\startuseMPgraphic{followtokens} + path RotPath ; RotPath := reverse fullcircle + rotatedaround(origin,90) + xscaled \overlaywidth yscaled \overlayheight ; + drawoptions (withcolor .625red) ; +\stopuseMPgraphic + +\followtokens + {This is just a dummy text, kerned by \TeX\ and typeset + in a circle using \MetaPost.\quad} +\stopbuffer + +\defineoverlay[edge][{\getbuffer[circle]}] +\stopbuffer + +\typebuffer \getbuffer + +The text and graphics come together in a framed text: + +\startbuffer +\startbuffer[quote] +\framed + [offset=24pt, + background=edge, + frame=off, + backgroundoffset=-18pt] + {\getshapetext} +\stopbuffer + +\placefigure + {One more time Hofstadter's quotation (normal).} + {\getbuffer[shape,quote]} + +\placefigure + {One more time Hofstadter's quotation (traced).} + {\startMPinclusions + boolean TraceRot ; TraceRot := true ; + \stopMPinclusions + \getbuffer[shape,quote]} +\stopbuffer + +\typebuffer \getbuffer + +% {\em Here also, I will rewrite things a bit so that we can avoid \type +% {\startMPdrawing} outside the macro, and thereby avoid problems. I can also add +% the maps cdrom cover as example.} + +\stopsection + +% \startsection[title={Visualizing \TEX}] +% +% The next example is a bit out of place in this manual, but nevertheless +% demonstrates how one can use \METAPOST\ to get insight in what \TEX\ is doing +% inside. +% +% The author of \PDFTEX, \THANH, has extended the paragraph builder with a +% provision for protruding characters and glyphs substitution, also known as {\it +% hz} (which stands for Hermann Zapf). The {\it hz} optimization involves an +% additional pass over the lines and|/|or paragraph, in order to determine how +% inconsistency in gaps can be reduced by substituting an \quote {\scale [sx=1.01] +% {a}} by an \quote {\scale [sx=5] {a}} or \quote {\scale [sx=.5] {a}}. In \in +% {figure} [fig:hz] you can find the visualization in action. By means of colors we +% indicate in what way glyphs are substituted by slightly larger or smaller values. +% More details on how the {\it hz} optimization works can be found in \THANH's +% thesis. +% +% \placefigure +% [page][fig:hz] +% {When we feed \TEX\ code into \METAPOST\ and back, we +% can visualize {\it hz}||optimization in a colorful way.} +% {\doifmodeelse{screen} +% {\externalfigure[mfun-hzs.pdf][height=.8\textheight]} +% {\externalfigure[mfun-hzp.pdf][height=.8\textheight]}} +% +% In order to avoid a complicated discussion about how to set up \PDFTEX\ to use +% {\it hz} |<|this can best be left over to the macro package that you use|>| we +% will illustrate the method behind this kind of visualizations in a more simple +% case. +% +% When you include a \METAPOST\ graphic in \PDFTEX, the output produced by +% \METAPOST\ is interpreted by a bunch of macros and converted into raw \PDF\ code. +% In the process special extensions, like shading, transparency, graphic inclusion, +% are taken care of. When the converter encounters a font inclusion directive, +% i.e.\ the \POSTSCRIPT\ \type {fshow} operator, it uses the \TEX\ font handler to +% take care of the font. A benefit of this approach is that \TEX\ and \METAPOST\ +% share the same font resources and therefore the inclusion is done in the way +% expected. +% +% The low level macro that takes care of the font inclusion provides a couple of so +% called hooks, that permit us to do additional manipulations with the character +% sequences that are encountered. +% +% \startbuffer[demo] +% draw +% btex \definedfont[cmr10]% +% Combine the power of \TeX\ and \MetaPost ! +% etex scaled 2 ; +% \stopbuffer +% +% \typebuffer[demo] +% +% When processed, this gives the graphic: +% +% \startlinecorrection[blank] +% \processMPbuffer[demo] +% \stoplinecorrection +% +% The result is not spectacular, and there is no indication that \METAPOST\ has +% been in action. The following line of code sets the hook \type {\MPfshowcommand} +% |<|this commands takes one argument|>| to produce a ruled horizontal box. +% +% \startbuffer +% \let\MPfshowcommand\ruledhbox +% \stopbuffer +% +% \typebuffer +% +% \startlinecorrection[blank] +% \getbuffer \processMPbuffer[demo] +% \stoplinecorrection +% +% If you watch closely, you will see that the ruled boxes contain one or more +% characters (or more precise glyphs). This is a result from \TEX\ explicitely +% kerning characters. +% +% A second hook is provided in the macro that takes care of the font switch. This +% command is defined as follows: +% +% \starttyping +% \def\setMPfshowfont#1#2% +% {\font\temp=#1\space at #2\relax\temp} +% \stoptyping +% +% The first argument is the raw font name, and the second argument specifies the +% desired size. If we want to see what fonts are involved, we can redefine the +% hooks as follows. +% +% \starttyping +% \def\setMPfshowfont#1#2% +% {\message{[using #1 at #2 in mp graphic]}% +% \font\temp=#1\space at #2\relax\temp} +% \stoptyping +% +% It happens that two fonts are used: \type {cmr10} and \type {logo10}. Once we +% know this, we can apply some magic: we set the color to the fontname and define a +% couple of colors that match the name. +% +% \startbuffer +% \definecolor [cmr10] [darkred] +% \definecolor [logo10] [darkyellow] +% +% \def\setMPfshowfont#1#2% +% {\color[#1]\font\temp=#1\space at #2\relax\temp} +% \stopbuffer +% +% \typebuffer +% +% In the case of the \type {\it hz} examples we had to define a couple of more +% colors, but the principle remains. +% +% \startlinecorrection[blank] +% \getbuffer \processMPbuffer[demo] +% \stoplinecorrection +% +% We don't expect the user to use tricks like this on a daily basis, but it +% demonstrates that with a bit of knowlegde of the internals of \CONTEXT, you can +% produce nice examples of typographic programming. +% +% \stopsection + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/metafun/metafun-titlepage-paper.tex b/doc/context/sources/general/manuals/metafun/metafun-titlepage-paper.tex new file mode 100644 index 000000000..558e3b798 --- /dev/null +++ b/doc/context/sources/general/manuals/metafun/metafun-titlepage-paper.tex @@ -0,0 +1,23 @@ +% language=uk +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\doifmode{book}{\endinput} + +\startcomponent mfun-titlepage-paper + +\environment metafun-environment + +\setupbackgrounds + [rightpage] + [background=title page] + +\startstandardmakeup + % title page +\stopstandardmakeup + +\setupbackgrounds + [rightpage] + [background=] + +\stopcomponent diff --git a/doc/context/sources/general/manuals/metafun/metafun-titlepage-screen.tex b/doc/context/sources/general/manuals/metafun/metafun-titlepage-screen.tex new file mode 100644 index 000000000..6350bdbda --- /dev/null +++ b/doc/context/sources/general/manuals/metafun/metafun-titlepage-screen.tex @@ -0,0 +1,30 @@ +% language=uk +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\startcomponent metafun-titlepage-screen + +\environment metafun-environment + +\startstandardmakeup[topstate=empty] + + \definefont[Big] [RegularBold*default at 60pt] + \definefont[Medium][RegularBold*default at 48pt] + \definefont[Small] [RegularBold*default at 32pt] + \definefont[Tiny] [RegularBold*default at 24pt] + +% \showstruts + + \startcolor[darkyellow] + + \Big METAFUN \par + \Tiny \setstrut \strut context mkiv \par + \vfill + \Tiny \setstrut \hfill \strut \currentdate \par + \Small \setstrut \hfill \strut Hans Hagen \par + + \stopcolor + +\stopstandardmakeup + +\stopcomponent diff --git a/doc/context/sources/general/manuals/metafun/metafun-welcome.tex b/doc/context/sources/general/manuals/metafun/metafun-welcome.tex new file mode 100644 index 000000000..425d15796 --- /dev/null +++ b/doc/context/sources/general/manuals/metafun/metafun-welcome.tex @@ -0,0 +1,3502 @@ +% language=uk +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\startcomponent metafun-welcome + +\environment metafun-environment + +\startchapter[reference=sec:welcome,title={Welcome to MetaPost}] + +\startintro + +In this chapter, we will introduce the most important \METAPOST\ concepts as well +as demonstrate some drawing primitives and operators. This chapter does not +replace the \METAFONT\ book or \METAPOST\ manual, both of which provide a lot of +explanations, examples, and (dirty) tricks. + +As its title says, the \METAFONT\ book by Donald.\ E.\ Knuth is about fonts. +Nevertheless, buying a copy is worth the money, because as a \METAPOST\ user you +can benefit from the excellent chapters about curves, algebraic expressions, and +(linear) equations. The following sections are incomplete in many aspects. More +details on how to define your own macros can be found in both the \METAFONT\ book +and \METAPOST\ manual, but you will probably only appreciate the nasty details if +you have written a few simple figures yourself. This chapter will give you a +start. + +A whole section is dedicated to the basic extensions to \METAPOST\ as provided by +\METAFUN. Most of them are meant to make defining graphics like those shown in +this document more convenient. + +Many of the concepts introduced here will be discussed in more detail in later +chapters. So, you may consider this chapter to be an appetizer for the following +chapters. If you want to get started quickly, you can safely skip this chapter +now. + +\stopintro + +\startsection[title={Paths}] + +\index{paths} + +Paths are the building blocks of \METAPOST\ graphics. In its simplest form, a +path is a single point. + +\startuseMPgraphic{axis} + tickstep := 1cm ; ticklength := 2mm ; + drawticks unitsquare xscaled 4cm yscaled 3cm shifted (-1cm,-1cm) ; + tickstep := tickstep/2 ; ticklength := ticklength/2 ; + drawticks unitsquare xscaled 4cm yscaled 3cm shifted (-1cm,-1cm) ; +\stopuseMPgraphic + +\startlinecorrection[blank] +\startMPcode + \includeMPgraphic{axis} + drawpoint "1cm,1.5cm" ; +\stopMPcode +\stoplinecorrection + +Such a point is identified by two numbers, which represent the horizontal and +vertical position, often referred to as $x$ and $y$, or $(x,y)$. Because there +are two numbers involved, in \METAPOST\ this point is called a pair. Its related +datatype is therefore \type {pair}. The following statements assigns the point we +showed previously to a pair variable. + +\starttyping +pair somepoint ; somepoint := (1cm,1.5cm) ; +\stoptyping + +A pair can be used to identify a point in the two dimensional coordinate space, +but it can also be used to denote a vector (being a direction or displacement). +For instance, \type {(0,1)} means \quote {go up}. Looking through math glasses, +you may consider them vectors, and if you know how to deal with them, \METAPOST\ +may be your friend, since it knows how to manipulate them. + +You can connect points and the result is called a path. A path is a straight or +bent line, and is not necessarily a smooth curve. An example of a simple +rectangular path is: \footnote {In the next examples we use the debugging +features discussed in \in {chapter} [sec:debugging] to visualize the points, +paths and bounding boxes.} + +\startuseMPgraphic{path} + path p ; + p := unitsquare xyscaled (2cm,1cm) shifted (.5cm,.5cm) ; +\stopuseMPgraphic + +\startlinecorrection[blank] +\startMPcode + \includeMPgraphic{axis} + \includeMPgraphic{path} + drawpath p ; +\stopMPcode +\stoplinecorrection + +This path is constructed out of four points: + +\startlinecorrection[blank] +\startMPcode + \includeMPgraphic{axis} + \includeMPgraphic{path} + swappointlabels := true ; drawpath p ; drawpoints p ; +\stopMPcode +\stoplinecorrection + +Such a path has both a beginning and end and runs in a certain direction: + +\startlinecorrection[blank] +\startMPcode + \includeMPgraphic{axis} + \includeMPgraphic{path} + autoarrows := true ; + swappointlabels := true ; drawarrowpath p ; drawpoints p ; +\stopMPcode +\stoplinecorrection + +A path can be open or closed. The previous path is an example of a closed path. +An open path looks like this: + +\startuseMPgraphic{path} + path p ; p := (1cm,1cm)..(1.5cm,1.5cm)..(2cm,0cm) ; +\stopuseMPgraphic + +\startlinecorrection[blank] +\startMPcode + \includeMPgraphic{axis} + \includeMPgraphic{path} + swappointlabels := true ; drawpath p ; drawpoints p ; +\stopMPcode +\stoplinecorrection + +When we close this path |<|and in a moment we will see how to do this|>| the path +looks like: + +\startbuffer +\startlinecorrection[blank] +\startMPcode + \includeMPgraphic{axis} + \includeMPgraphic{path} + p := p .. cycle ; + swappointlabels := true ; drawpath p ; drawpoints p ; +\stopMPcode +\stoplinecorrection +\stopbuffer + +\getbuffer + +The open path is defined as: + +\starttyping +(1cm,1cm)..(1.5cm,1.5cm)..(2cm,0cm) +\stoptyping + +The \quote {double period} connector \type {..} tells \METAPOST\ that we want to +connect the lines by a smooth curve. If you want to connect points with straight +line segments, you should use \type {--}. + +Closing the path is done by connecting the first and last point, using the \type +{cycle} command. + +\starttyping +(1cm,1cm)..(1.5cm,1.5cm)..(2cm,0cm)..cycle +\stoptyping + +Feel free to use \type {..} or \type {--} at any point in your path. + +\starttyping +(1cm,1cm)--(1.5cm,1.5cm)..(2cm,0cm)..cycle +\stoptyping + +\startuseMPgraphic{path} +path p ; p := (1cm,1cm)--(1.5cm,1.5cm)..(2cm,0cm)..cycle ; +\stopuseMPgraphic + +This path, when drawn, looks like this: + +\getbuffer + +As you can see in some of the previous examples, \METAPOST\ is capable of drawing +a smooth curve through the three points that make up the path. We will now +examine how this is done. + +\startlinecorrection[blank] +\startMPcode + \includeMPgraphic{axis} + \includeMPgraphic{path} + p := p .. cycle ; swappointlabels := true ; + drawpath p ; drawcontrollines p ; drawpoints p ; drawcontrolpoints p ; +\stopMPcode +\stoplinecorrection + +The six small points are the so called control points. These points pull their +parent point in a certain direction. The further away such a point is, the +stronger the pull. + +Each point has at most two control points. As you can see in the following +graphic, the endpoints of a non closed curve have only one control point. + +\startuseMPgraphic{path} +path p ; p := (1.5cm,1.5cm)..(2cm,0cm)..(1cm,1cm) ; +\stopuseMPgraphic + +\startbuffer[path] +\startlinecorrection[blank] +\startMPcode + \includeMPgraphic{axis} + \includeMPgraphic{path} + swappointlabels := true ; + drawpath p ; drawcontrollines p ; drawpoints p ; drawcontrolpoints p ; +\stopMPcode +\stoplinecorrection +\stopbuffer + +\getbuffer[path] + +This time we used the path: + +\starttyping +(1.5cm,1.5cm)..(2cm,0cm)..(1cm,1cm) +\stoptyping + +When you connect points by a smooth curve, \METAPOST\ will calculate the control +points itself, unless you specify one or more of them. + +\startuseMPgraphic{path} + path p ; p := (1cm,1cm)..(1.5cm,1.5cm)..controls (3cm,2cm)..(2cm,0cm) ; +\stopuseMPgraphic + +\getbuffer[path] + +This path is specified as: + +\starttyping +(1cm,1cm)..(1.5cm,1.5cm)..controls (3cm,2cm)..(2cm,0cm) +\stoptyping + +In this path, the second and third point share a control point. Watch how the +curve is pulled in that direction. It is possible to pull a bit less by choosing +a different control point: + +\starttyping +(1cm,1cm)..(1.5cm,1.5cm)..controls (2.75cm,1.25cm)..(2cm,0cm) +\stoptyping + +Now we get: + +\startuseMPgraphic{path} + path p ; p := (1cm,1cm)..(1.5cm,1.5cm)..controls (2.75cm,1.25cm)..(2cm,0cm) ; +\stopuseMPgraphic + +\getbuffer[path] + +We can also specify a different control point for each connecting segment. + +\startuseMPgraphic{path} + path p ; p := (1cm,1cm)..controls (.5cm,2cm) and (2.5cm,2cm)..(2cm,.5cm) ; +\stopuseMPgraphic + +\getbuffer[path] + +This path is defined as: + +\starttyping +(1cm,1cm)..controls (.5cm,2cm) and (2.5cm,2cm)..(2cm,.5cm) +\stoptyping + +\stopsection + +\startsection[title={Transformations}] + +\index{transformations} + +We can store a path in a path variable. Before we can use such a variable, we +have to allocate its memory slot with \type {path}. + +\starttyping +path p ; p := (1cm,1cm)..(1.5cm,2cm)..(2cm,0cm) ; +\stoptyping + +Although we can manipulate any path in the same way, using a variable saves us +the effort to key in a path more than once. + +\startuseMPgraphic{axis} + tickstep := 1cm ; ticklength := 2mm ; + drawticks unitsquare xscaled 8cm yscaled 4cm ; + tickstep := tickstep/2 ; ticklength := ticklength/2 ; + drawticks unitsquare xscaled 8cm yscaled 4cm ; +\stopuseMPgraphic + +\startuseMPgraphic{path} + path p ; p := (1cm,1cm)..(1.5cm,2cm)..(2cm,0cm)..cycle ; + path q ; q := p shifted (4cm,2cm) ; +\stopuseMPgraphic + +\startbuffer[path] +\startlinecorrection[blank] +\startMPcode + \includeMPgraphic{axis} + \includeMPgraphic{path} + swappointlabels := true ; + drawpath p ; drawcontrollines p ; drawpoints p ; drawcontrolpoints p ; + drawpath q ; drawcontrollines q ; drawpoints q ; drawcontrolpoints q ; +\stopMPcode +\stoplinecorrection +\stopbuffer + +\getbuffer[path] + +In this graphic, the path stored in \type {p} is drawn twice, once in its +displaced form. The displacement is defined as: + +\starttyping +p shifted (4cm,2cm) +\stoptyping + +In a similar fashion you can rotate a path. You can even combine shifts and +rotations. First we rotate the path 15 degrees counter||clockwise around the +origin. + +\starttyping +p rotated 15 +\stoptyping + +\startuseMPgraphic{path} + path p ; p := (1cm,1cm)..(1.5cm,2cm)..(2cm,0cm)..cycle ; + path q ; q := p rotated 15 ; +\stopuseMPgraphic + +\getbuffer[path] + +This rotation becomes more visible when we also shift the path to the right by +saying: + +\starttyping +rotated 15 shifted (4cm,0cm) +\stoptyping + +Now we get: + +\startuseMPgraphic{path} + path p ; p := (1cm,1cm)..(1.5cm,2cm)..(2cm,0cm)..cycle ; + path q ; q := p rotated 15 shifted (4cm,0cm) ; +\stopuseMPgraphic + +\getbuffer[path] + +Note that \type {rotated 15} is equivalent to \typ {p rotatedaround (origin, +15)}. + +It may make more sense to rotate the shape around its center. This can easily be +achieved with the \type {rotatedaround} command. Again, we move the path to the +right afterwards. + +\starttyping +p rotatedaround(center p, 15) shifted (4cm,0cm) +\stoptyping + +\startuseMPgraphic{axis} + tickstep := 1cm ; ticklength := 2mm ; + drawticks unitsquare xscaled 10cm yscaled 3cm ; + tickstep := tickstep/2 ; ticklength := ticklength/2 ; + drawticks unitsquare xscaled 10cm yscaled 3cm ; +\stopuseMPgraphic + +\startuseMPgraphic{path} + path p ; p := (1cm,1cm)..(1.5cm,2cm)..(2cm,0cm)..cycle ; + path q ; q := p rotatedaround(center p, 15) shifted (4cm,0cm) ; +\stopuseMPgraphic + +\getbuffer[path] + +Yet another transformation is slanting. Just like characters can be upright or +slanted, a graphic can be: + +\starttyping +p slanted 1.5 shifted (4cm,0cm) +\stoptyping + +\startuseMPgraphic{path} + path p ; p := (1cm,1cm)..(1.5cm,2cm)..(2cm,0cm)..cycle ; + path q ; q := p slanted 1.5 shifted (4cm,0cm) ; +\stopuseMPgraphic + +\getbuffer[path] + +The slant operation's main application is in tilting fonts. The $x$||coodinates +are increased by a percentage of their $y$||coordinate, so here every $x$ becomes +$x+1.5y$. The $y$||coordinate is left untouched. The following table summarizes +the most important primitive transformations that \METAPOST\ supports. + +\starttabulate[|lT|l|] +\HL +\NC \METAPOST\ code \NC mathematical equivalent \NC \NR +\HL +\NC (x,y) shifted (a,b) \NC $(x+a,y+b)$ \NC \NR +\NC (x,y) scaled s \NC $(sx,sy)$ \NC \NR +\NC (x,y) xscaled s \NC $(sx,y)$ \NC \NR +\NC (x,y) yscaled s \NC $(x,sy)$ \NC \NR +\NC (x,y) zscaled (u,v) \NC $(xu-yv,xv+yu)$ \NC \NR +\NC (x,y) slanted s \NC $(x+sy,y)$ \NC \NR +\NC (x,y) rotated r \NC $(x\cos(r)-y\sin(r),x\sin(r)+y\cos(r))$ \NC \NR +\HL +\stoptabulate + +The previously mentioned \type {rotatedaround} is not a primitive but a macro, +defined in terms of shifts and rotations. Another transformation macro is +mirroring, or in \METAPOST\ terminology, \type {reflectedabout}. + +\startbuffer[path] +\startlinecorrection[blank] +\startMPcode + \includeMPgraphic{axis} + \includeMPgraphic{path} + swappointlabels := true ; + drawpath p ; drawpoints p ; + drawpath q ; drawpoints q ; +\stopMPcode +\stoplinecorrection +\stopbuffer + +\startuseMPgraphic{path} + path p ; p := unitsquare scaled 2cm shifted (2cm,.5cm) ; + path q ; q := unitsquare scaled 2cm shifted (2cm,.5cm) reflectedabout((2.4cm,-.5),(2.4cm,3cm)) ; + draw (2.4cm,-.5cm)--(2.4cm,3cm) ; +\stopuseMPgraphic + +\getbuffer[path] + +The reflection axis is specified by a pair of points. For example, in the graphic +above, we used the following command to reflect the square about a line through +the given points. + +\starttyping +p reflectedabout((2.4cm,-.5),(2.4cm,3cm)) +\stoptyping + +The line about which the path is mirrored. Mirroring does not have to be parallel +to an axis. + +\starttyping +p reflectedabout((2.4cm,-.5),(2.6cm,3cm)) +\stoptyping + +The rectangle now becomes: + +\startuseMPgraphic{path} + path p ; p := unitsquare scaled 2cm shifted (2cm,.5cm) ; + path q ; q := unitsquare scaled 2cm shifted (2cm,.5cm) reflectedabout((2.4cm,-.5),(2.6cm,3cm)) ; + draw (2.4cm,-.5cm)--(2.6cm,3cm) ; +\stopuseMPgraphic + +\getbuffer[path] + +\pagereference [zscaled]The table also mentions \type {zscaled}. + +\startuseMPgraphic{path} +path p ; p := unitsquare scaled (1cm) shifted (1cm,.5cm) ; +path q ; q := unitsquare scaled (1cm) zscaled (2,.5) shifted (1cm,.5cm) ; +\stopuseMPgraphic + +\getbuffer[path] + +A \type {zscaled} specification takes a vector as argument: + +\starttyping +p zscaled (2,.5) +\stoptyping + +The result looks like a combination of scaling and rotation, and conforms to the +formula in the previous table. + +Transformations can be defined in terms of a transform matrix. Such a matrix is +stored in a transform variable. For example: + +\starttyping +transform t ; t := identity scaled 2cm shifted (4cm,1cm) ; +\stoptyping + +We use the associated keyword \type {transformed} to apply this matrix to a path +or picture. + +\starttyping +p transformed t +\stoptyping + +In this example we've taken the \type {identity} matrix as starting point but you +can use any predefined transformation. The identity matrix is defined in such a +way that it scales by a factor of one in both directions and shifts over the +zero||vector. + +Transform variables can save quite some typing and may help you to force +consistency when many similar transformations are to be done. Instead of changing +the scaling, shifting and other transformations you can then stick to just +changing the one transform variable. + +\stopsection + +\startsection[title={Constructing paths}] + +\index{paths} + +In most cases, a path will have more points than the few shown here. Take for +instance a so called {\em super ellipse}. + +\startlinecorrection[blank] +\startMPcode +path p ; p := fullsquare xyscaled (5cm,3cm) superellipsed .85 ; +drawpath p ; drawpoints p ; +visualizepaths ; draw p shifted (6cm,0cm) withcolor .625yellow ; +\stopMPcode +\stoplinecorrection + +These graphics provide a lot of information. In this picture the crosshair in the +center is the {\em origin} and the dashed rectangle is the {\em bounding box} of +the super ellipse. The bounding box specifies the position of the graphic in +relation to the origin as well as its width and height. + +In the graphic on the right, you can see the points that make up the closed path +as well as the control points. Each point has a number with the first point +numbered zero. Because the path is closed, the first and last point coincide. + +\startuseMPgraphic{axis} + tickstep := 1cm ; ticklength := 2mm ; + drawticks unitsquare xscaled 8cm yscaled 3cm ; + tickstep := tickstep/2 ; ticklength := ticklength/2 ; + drawticks unitsquare xscaled 8cm yscaled 3cm ; +\stopuseMPgraphic + +\startbuffer +\startlinecorrection[blank] +\startMPcode + string tmp ; defaultfont := "\truefontname{Mono}" ; + \includeMPgraphic{axis} + \includeMPgraphic{points} + \includeMPgraphic{path} + label.lft(verbatim(tmp),(14.5cm,2.5cm)) ; + drawwholepath scantokens(tmp) ; +\stopMPcode +\stoplinecorrection +\stopbuffer + +We've used the commands \type {..} and \type {--} as path connecting directives. +In the next series of examples, we will demonstrate a few more. However, before +doing that, we define a few points, using the predefined \type {z} variables. + +\startuseMPgraphic{points} + z0 = (0.5cm,1.5cm) ; z1 = (2.5cm,2.5cm) ; + z2 = (6.5cm,0.5cm) ; z3 = (3.0cm,1.5cm) ; +\stopuseMPgraphic + +\starttyping +z0 = (0.5cm,1.5cm) ; z1 = (2.5cm,2.5cm) ; +z2 = (6.5cm,0.5cm) ; z3 = (3.0cm,1.5cm) ; +\stoptyping + +Here \type {z1} is a short way of saying \type {(x1,y1)}. When a \type {z} +variable is called, the corresponding \type {x} and \type {y} variables are +available too. Later we will discuss \METAPOST\ capability to deal with +expressions, which are expressed using an \type {=} instead of \type {:=}. In +this case the expression related to \type {z0} is expanded into: + +\starttyping +z0 = (x0,y0) = (0.5cm,1.5cm) ; +\stoptyping + +But for this moment let's forget about their expressive nature and simply see +them as points which we will now connect by straight line segments. + +\startuseMPgraphic{path} + tmp := "z0--z1--z2--z3--cycle" ; +\stopuseMPgraphic + +\getbuffer + +The smooth curved connection, using \type {..} looks like: + +\startuseMPgraphic{path} + tmp := "z0..z1..z2..z3..cycle" ; +\stopuseMPgraphic + +\getbuffer + +If we replace the \type {..} by \type {...}, we get a tighter path. + +\startuseMPgraphic{path} + tmp := "z0...z1...z2...z3...cycle" ; +\stopuseMPgraphic + +\getbuffer + +Since there are \type {..}, \type {--}, and \type {...}, it will be no surprise +that there is also \type {---}. + +\startuseMPgraphic{path} + tmp := "z0---z1---z2---z3---cycle" ; +\stopuseMPgraphic + +\getbuffer + +If you compare this graphic with the one using \type {--} the result is the same, +but there is a clear difference in control points. As a result, combining \type +{..} with \type {--} or \type {---} makes a big difference. Here we get a +non||smooth connection between the curves and the straight line. + +\startuseMPgraphic{path} + tmp := "z0..z1..z2--z3..cycle" ; +\stopuseMPgraphic + +\getbuffer + +As you can see in the next graphic, when we use \type {---}, we get a smooth +connection between the straight line and the rest of the curve. + +\startuseMPgraphic{path} + tmp := "z0..z1..z2---z3..cycle" ; +\stopuseMPgraphic + +\getbuffer + +So far, we have joined the four points as one path. Alternatively, we can +constrict subpaths and connect them using the ampersand symbol, \type {&}. + +\startuseMPgraphic{path} + tmp := "z0..z1..z2 & z2..z3..z0 & cycle" ; +\stopuseMPgraphic + +\getbuffer + +So far we have created a closed path. Closing is done by \type {cycle}. The +following path may look closed but is in fact open. + +\startuseMPgraphic{path} + tmp := "z0..z1..z2..z3..z0" ; +\stopuseMPgraphic + +\getbuffer + +Only a closed path can be filled. The closed alternative looks as follows. We +will see many examples of filled closed paths later on. + +\startuseMPgraphic{path} + tmp := "z0..z1..z2..z3..z0..cycle" ; +\stopuseMPgraphic + +\getbuffer + +Here the final \type {..} will try to make a smooth connection, but because we +already are at the starting point, this is not possible. However, the \type +{cycle} command can automatically connect to the first point. Watch the +difference between the previous and the next path. + +\startuseMPgraphic{path} + tmp := "z0..z1..z2..z3..cycle" ; +\stopuseMPgraphic + +\getbuffer + +It is also possible to combine two paths into one that don't have common head and +tails. First we define an open path: + +\startuseMPgraphic{path} + tmp := "z0..z1..z2" ; +\stopuseMPgraphic + +\getbuffer + +The following path is a closed one, and crosses the previously shown path. + +\startuseMPgraphic{path} + tmp := "z0..z3..z1..cycle" ; +\stopuseMPgraphic + +\getbuffer + +With \type {buildcycle} we can combine two paths into one. + +\startuseMPgraphic{path} + tmp := "buildcycle(z0..z1..z2 , z0..z3..z1..cycle)" ; +\stopuseMPgraphic + +\getbuffer + +We would refer readers to the \METAFONT\ book and the \METAPOST\ manual for an +explanation of the intricacies of the \type {buildcycle} command. It is an +extremely complicated command, and there is just not enough room here to do it +justice. We suffice with saying that the paths should cross at least once before +the \type {buildcycle} command can craft a combined path from two given paths. We +encourage readers to experiment with this command. + +In order to demonstrate another technique of joining paths, we first draw a few +strange paths. The last of these three graphics demonstrates the use of \type +{softjoin}. + +\startuseMPgraphic{path} + tmp := "z0--z1..z2--z3" ; +\stopuseMPgraphic + +\getbuffer + +\startuseMPgraphic{path} + tmp := "z0..z1..z2--z3" ; +\stopuseMPgraphic + +\getbuffer + +Watch how \type {softjoin} removes a point in the process of smoothing a +connection. The smoothness is accomplished by adapting the control points of the +neighbouring points in the appropriate way. + +\startuseMPgraphic{path} + tmp := "z0--z1 softjoin z2--z3" ; +\stopuseMPgraphic + +\getbuffer + +Once a path is known, you can cut off a slice of it. We will demonstrate a few +alternative ways of doing so, but first we show one more time the path that we +take as starting point. + +\startuseMPgraphic{path} + tmp := "z0..z1..z2..z3..cycle" ; +\stopuseMPgraphic + +\getbuffer + +This path is made up out of five points, where the cycle duplicates the first +point and connects the loose ends. The first point has number zero. + +We can use these points in the \type {subpath} command, which takes two +arguments, specifying the range of points to cut of the path specified after the +keyword \type {of}. + +\startuseMPgraphic{path} + tmp := "subpath(2,4) of (z0..z1..z2..z3..cycle)" ; +\stopuseMPgraphic + +\getbuffer + +The new (sub|)|path is a new path with its own points that start numbering at +zero. The next graphic shows both the original and the subpath from point 1 +upto~3. + +\startuseMPgraphic{path} + tmp := "(z0..z1..z2..z3..cycle)" ; + sub := "subpath(1,3)" ; +\stopuseMPgraphic + +\startbuffer[sub] +\startlinecorrection[blank] +\startMPcode + string tmp, sub ; defaultfont := "\truefontname{Mono}" ; + \includeMPgraphic{axis} + \includeMPgraphic{points} + \includeMPgraphic{path} + label.lft(verbatim(tmp),(14.5cm,2.5cm)) ; + label.lft(verbatim(sub),(14.5cm,2.0cm)) ; + sub := sub & " of " & tmp ; + path p ; p := scantokens(tmp) ; + path q ; q := scantokens(sub) ; + drawwholepath p ; swappointlabels := true ; + drawpath q withcolor .625yellow ; + drawpoints q withcolor .625red ; + drawpointlabels q ; +\stopMPcode +\stoplinecorrection +\stopbuffer + +\getbuffer[sub] + +In spite of what you may think, a point is not fixed. This is why in \METAPOST\ a +point along a path is officially called a time. The next example demonstrates +that we can specify any time on the path. + +\startuseMPgraphic{path} + tmp := "(z0..z1..z2..z3..cycle)" ; + sub := "subpath(2.45,3.85)" ; +\stopuseMPgraphic + +\getbuffer[sub] + +Often we want to take a slice starting at a specific point. This is provided by +\type {cutafter} and its companion \type {cutbefore}. Watch out, this time we use +a non||cyclic path. + +\startuseMPgraphic{path} + tmp := "(z0..z1..z2..z3)" ; +\stopuseMPgraphic + +\getbuffer + +When you use \type {cutafter} and \type {cutbefore} it really helps if you know +in what direction the path runs. + +\startuseMPgraphic{path} + tmp := "(z0..z1..z2..z3) cutafter z2" ; +\stopuseMPgraphic + +\getbuffer + +\startuseMPgraphic{path} + tmp := "(z0..z1..z2..z3) cutbefore z1" ; +\stopuseMPgraphic + +\getbuffer + +Here is a somewhat silly way of accomplishing the same thing, but it is a nice +introduction to \METAPOST's \type {point} operation. In order to use this command +effectively, you need to know how many points make up the path. + +\startuseMPgraphic{path} + tmp := "(z0..z1..z2..z3) cutbefore point 2 of (z0..z1..z2..z3)" ; +\stopuseMPgraphic + +\getbuffer + +As with \type {subpath}, you can use fractions to specify the time on the path, +although the resulting point is not necessarily positioned linearly along the +curve. + +\startuseMPgraphic{path} + tmp := "(z0..z1..z2..z3) cutbefore point 2.5 of (z0..z1..z2..z3)" ; +\stopuseMPgraphic + +\getbuffer + +If you really want to know the details of where fraction points are positioned, +you should read the \METAFONT\ book and study the source of \METAFONT\ and +\METAPOST, where you will find the complicated formulas that are used to +calculate smooth curves. + +\startuseMPgraphic{path} + tmp := "z0..z1..cycle" ; +\stopuseMPgraphic + +\getbuffer + +Like any closed path, this path has points where the tangent is horizontal or +vertical. Early in this chapter we mentioned that a pair (or point) can specify a +direction or vector. Although any angle is possible, we often use one of four +predefined directions: + +\starttabulate[|Tl|Tl|] +\HL +\NC right \NC ( 1, 0) \NC \NR +\NC up \NC ( 0, 1) \NC \NR +\NC left \NC (-1, 0) \NC \NR +\NC down \NC ( 0,-1) \NC \NR +\HL +\stoptabulate + +We can use these predefined directions in combination with \type {directionpoint} +and \type {cutafter}. The following command locates the first point on the path +that has a tangent that points vertically upward, and then feeds this point to +the \type {cutafter} command. + +\startuseMPgraphic{path} + tmp := "(z0..z1..cycle) cutafter directionpoint up of (z0..z1..cycle)" ; +\stopuseMPgraphic + +\getbuffer + +You are not limited to predefined direction vectors. You can provide a pair to +indicate a direction. In the next example we use the following cyclic path: + +\startuseMPgraphic{path} + tmp := "z0..z1..cycle" ; +\stopuseMPgraphic + +\getbuffer + +Using \type {( )} is not mandatory but makes the expression look less +complicated. + +\startuseMPgraphic{path} + tmp := "(z0..z1..cycle) cutafter directionpoint (1,1) of (z0..z1..cycle)" ; +\stopuseMPgraphic + +\getbuffer + +We will apply these commands in the next chapters, but first we will finish our +introduction in \METAPOST. We have seen how a path is constructed and what can be +done with it. Now it is time to demonstrate how such a path is turned into a +graphic. + +\stopsection + +\startsection[title={Angles}] + +\index{angles} +\index{rotation} + +You can go from angles to vectors and vice versa using the \type {angle} and +\type {dir} functions. The next example show both in action. + +\startbuffer +pickup pencircle scaled 2mm ; +draw (origin -- dir(45) -- dir(0) -- cycle) + scaled 3cm withcolor .625red ; +draw (origin -- dir(angle(1,1)) -- dir(angle(1,0)) -- cycle) + scaled 3cm shifted (3.5cm,0) withcolor .625yellow ; +draw (origin -- (1,1) -- (1,0) -- cycle) + scaled 3cm shifted (7cm,0) withcolor .625white ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +The \type {dir} command returns an unit vector, which is why the first two shapes +look different and are smaller than the third one. We can compensate for that by +an additional scaling: + +\startbuffer +pickup pencircle scaled 2mm ; +draw (origin -- dir(45) -- dir(0) -- cycle) + scaled sqrt(2) scaled 3cm withcolor .625red ; +draw (origin -- dir(angle(1,1)) -- dir(angle(1,0)) -- cycle) + scaled sqrt(2) scaled 3cm shifted (4.5cm,0) withcolor .625yellow ; +draw (origin -- (1,1) -- (1,0) -- cycle) + scaled 3cm shifted (9cm,0) withcolor .625white ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +\stopsection + +\startsection[title={Drawing pictures}] + +\index{drawing} + +Once a path is defined, either directly or as a variable, you can turn it into a +picture. You can draw a path, like we did in the previous examples, or you can +fill it, but only if it is closed. + +\startlinecorrection[blank] +\startMPcode +visualizepaths ; +path p ; p := (0cm,1cm)..(2cm,2cm)..(4cm,0cm)..cycle ; +draw p withcolor .625red ; +fill p shifted (7cm,0) withcolor .625white ; +\stopMPcode +\stoplinecorrection + +Drawing is done by applying the \type {draw} command to a path, as in: + +\starttyping +draw (0cm,1cm)..(2cm,2cm)..(4cm,0cm)..cycle ; +\stoptyping + +The rightmost graphic was made with \type {fill}: + +\starttyping +fill (0cm,1cm)..(2cm,2cm)..(4cm,0cm)..cycle ; +\stoptyping + +If you try to duplicate this drawing, you will notice that you will get black +lines instead of red and a black fill instead of a gray one. When drawing or +filling a path, you can give it a color, use all kinds of pens, and achieve +special effects like dashes or arrows. + +\startlinecorrection[blank] +\startMPcode +visualizepaths ; +path p ; p := (0cm,1cm)..(2cm,2cm)..(4cm,0cm)..(2.5cm,1cm)..cycle ; +drawarrow p withcolor .625red ; +draw p shifted (7cm,0) dashed withdots withcolor .625yellow ; +\stopMPcode +\stoplinecorrection + +These two graphics were defined and drawn using the following commands. Later we +will explain how you can set the line width (or penshape in terms of \METAPOST). + +\starttyping +path p ; p := (0cm,1cm)..(2cm,2cm)..(4cm,0cm)..(2.5cm,1cm)..cycle ; +drawarrow p withcolor .625red ; +draw p shifted (7cm,0) dashed withdots withcolor .625yellow ; +\stoptyping + +Once we have drawn one or more paths, we can store them in a picture variable. +The straightforward way to store a picture is to copy it from the current +picture: + +\starttyping +picture pic ; pic := currentpicture ; +\stoptyping + +The following command effectively clears the picture memory and allows us to +start anew. + +\starttyping +currentpicture := nullpicture ; +\stoptyping + +We can shift, rotate and slant the picture stored in \type {pic} as we did with +paths. We can say: + +\starttyping +draw pic rotated 45 withcolor red ; +\stoptyping + +A picture can hold multiple paths. You may compare a picture to grouping as +provided by drawing applications. + +\starttyping +draw (0cm,0cm)--(1cm,1cm) ; draw (1cm,0cm)--(0cm,1cm) ; +picture pic ; pic := currentpicture ; +draw pic shifted (3cm,0cm) ; draw pic shifted (6cm,0cm) ; +pic := currentpicture ; draw pic shifted (0cm,2cm) ; +\stoptyping + +We first draw two paths and store the resulting \quote {cross} in a picture +variable. Then we draw this picture two times, so that we now have three copies +of the cross. We store the accumulated drawing again, so that after duplication, +we finally get six crosses. + +\startlinecorrection[blank] +\startMPcode +path p ; p := (0cm,0cm)--(1cm,1cm) ; +path q ; q := (1cm,0cm)--(0cm,1cm) ; +for i=p,q : + drawpath i ; drawcontrollines i ; drawpoints i ; drawcontrolpoints i ; +endfor ; +picture pic ; pic := currentpicture ; +draw pic shifted (3cm,0cm) ; +draw pic shifted (6cm,0cm) ; +pic := currentpicture ; +draw pic shifted (0cm,2cm) ; +\stopMPcode +\stoplinecorrection + +You can often follow several routes to reach the same solution. Consider for +instance the following graphic. + +\startbuffer[points] +w := 4cm ; h := 2cm ; ww := 1cm ; hh := 1.5cm ; +\stopbuffer + +\startbuffer[common] +drawoptions(withcolor .625white) ; +\stopbuffer + +\startbuffer[background] +fill (unitsquare xscaled w yscaled h) enlarged 2mm withcolor .625yellow ; +\stopbuffer + +\startbuffer[shape] +fill (0,0)--(ww,0)--(ww,hh)--(w,hh)--(w,h)--(0,h)--cycle ; +fill (ww,0)--(w,0)--(w,hh)--cycle ; +\stopbuffer + +\typebuffer[shape] + +\startlinecorrection[blank] +\processMPbuffer[common,points,shape] +\stoplinecorrection + +The points that are used to construct the paths are defined using the constants +\type {w}, \type {h}, \type {ww} and \type {hh}. These are defined as follows: + +\typebuffer[points] + +In this case we draw two shapes that leave part of the rectangle uncovered. If +you have a background, this technique allows the background to \quote {show +through} the graphic. + +\startlinecorrection[blank] +\processMPbuffer[common,points,background,shape] +\stoplinecorrection + +A not uncommon practice when making complicated graphics is to use unfill +operations. Since \METAPOST\ provides one, let us see what happens if we apply +this command. + +\startbuffer[shape] +fill (0,0)--(w,0)--(w,h)--(0,h)--cycle ; +unfill (ww,0)--(w,hh)--(ww,hh)--cycle ; +\stopbuffer + +\typebuffer[shape] + +\startlinecorrection[blank] +\processMPbuffer[common,points,background,shape] +\stoplinecorrection + +This does not always give the desired effect, because \METAPOST's \type {unfill} +is not really an unfill, but a \type {fill} with color \type {background}. Since +this color is white by default, we get what we just showed. So, if we set \type +{background} to \type {black}, using \typ {background := black}, we get: + +\startbuffer[back] +background := black ; +\stopbuffer + +\startlinecorrection[blank] +\processMPbuffer[back,common,points,background,shape] +\stoplinecorrection + +Of course, you can set the variable \type {background} to a different color, but +this does not hide the fact that \METAPOST\ lacks a real unfill operation. + +\startbuffer[shape] +fill (0,0)--(0,h)--(w,h)--(w,0)--(ww,0)--(w,hh)--(ww,hh)-- + (ww,0)--cycle ; +\stopbuffer + +\startbuffer[path] +autoarrows := true ; +path p ; p := (0,0)--(0,h)--(w,h)--(w,0)--(ww,0)--(w,hh)--(ww,hh)-- + (ww,0)--cycle ; +draw p withpen pencircle scaled 1mm withcolor .625red; +numeric l ; l := length(p)-1 ; +for i=0 upto l : + drawarrow subpath(i,i+1) of p + withpen pencircle scaled 1mm + withcolor (.5+.5(i/l))*red ; +endfor ; +\stopbuffer + +\startlinecorrection[blank] +\processMPbuffer[common,points,background,shape] +\stoplinecorrection + +Since we don't consider this \type {unfill} a suitable operator, you may wonder +how we achieved the above result. + +\typebuffer[shape] + +\startlinecorrection[blank] +\processMPbuffer[common,points,background,shape,path] +\stoplinecorrection + +This feature depends on the \POSTSCRIPT\ way of filling closed paths, which comes +down to filling either the left or the right hand side of a curve. The following +alternative works too. + +\startbuffer[shape] +fill (0,0)--(0,h)--(w,h)--(w,hh)--(ww,hh)--(ww,0)--(w,hh)-- + (w,0)--cycle ; +\stopbuffer + +\typebuffer[shape] + +\startlinecorrection[blank] +\processMPbuffer[common,points,background,shape] +\stoplinecorrection + +The next alternative will fail. This has to do with the change in direction at +point \type {(0,0)} halfway through the path. Sometimes changing direction can +give curious but desirable effects, but here it brings no good. + +\startbuffer[shape] +fill (0,0)--(0,h)--(w,h)--(w,0)--(0,0)--(ww,0)--(ww,hh)-- + (w,hh)--(ww,0)--cycle ; +\stopbuffer + +\typebuffer[shape] + +This path fails because of the way \POSTSCRIPT\ implements its fill operator. +More details on how \POSTSCRIPT\ defines fills can be found in the reference +manuals. + +\startlinecorrection[blank] +\processMPbuffer[common,points,background,shape] +\stoplinecorrection + +Some of the operations we have seen are hard coded into \METAPOST\ and are called +primitives. Others are defined as macros, that is, a sequence of \METAPOST\ +commands. Since they are used often, you may expect \type {draw} and \type {fill} +to be primitives, but they are not. They are macros defined in terms of +primitives. + +Given a path \type {pat}, you can consider a \type {draw} to be defined in terms +of: + +\starttyping +addto currentpicture doublepath pat +\stoptyping + +The \type {fill} command on the other hand is defined as: + +\starttyping +addto currentpicture contour pat +\stoptyping + +Both macros are actually a bit more complicated but this is mainly due to the +fact that they also have to deal with attributes like the pen and color they draw +with. + +You can use \type {doublepath} and \type {contour} directly, but we will use +\type {draw} and \type {fill} whenever possible. + +Given a picture \type {pic}, the following code is valid: + +\starttyping +addto currentpicture also pic +\stoptyping + +You can add pictures to existing picture variables, where \type {currentpicture} +is the picture that is flushed to the output file. Watch the subtle difference +between adding a \type {doublepath}, \type {contour} or \type {picture}. + +\stopsection + +\startsection[title={Variables}] + +\index{variables} + +At this point you may have noted that \METAPOST\ is a programming language. +Contrary to some of today's languages, \METAPOST\ is a simple and clean language. +Actually, it is a macro language. Although \METAPOST\ and \TEX\ are a couple, the +languages differ in many aspects. If you are using both, you will sometimes wish +that features present in one would be available in the other. When using both +languages, in the end you will understand why the conceptual differences make +sense. + +Being written in \PASCAL, it will be no surprise that \METAPOST\ has some +\PASCAL||like features, although some may also recognize features from \ALGOL68\ +in it. + +First there is the concept of variables and assignments. There are several data +types, some of which we already have seen. + +\starttabulate +\HL +\NC numeric \NC real number in the range $-4096 \ldots +4096$ \NC \NR +\NC boolean \NC a variable that takes one of two states: true or false \NC \NR +\NC pair \NC point or vector in 2||dimensional space \NC \NR +\NC path \NC a piecewise collection of curves and line segments \NC \NR +\NC picture \NC collection of stroked or filled paths \NC \NR +\NC string \NC sequence of characters, like \type {"metapost"} \NC \NR +\NC color \NC vector of three (rgb) or four (cmyk) numbers \NC \NR +\HL +\stoptabulate + +There are two additional types, \type {transform} and \type {pen}, but we will +not discuss these in depth. + +\starttabulate +\HL +\NC transform \NC transformation vector with six elements \NC \NR +\NC pen \NC pen specification \NC \NR +\HL +\stoptabulate + +You can achieve interesting effects by using pens with certain shapes. For the +moment you may consider a pen to be a path itself that is applied to the path +that is drawn. + +The \type {numeric} data type is used so often that it is the default type of any +non declared variable. This means that + +\starttyping +n := 10 ; +\stoptyping + +is the same as + +\starttyping +numeric n ; n := 10 ; +\stoptyping + +When writing collections of macros, it makes sense to use the second method, +because you can never be sure if \type {n} isn't already declared as a picture +variable, and assigning a numeric to a picture variable is not permitted. + +Because we often deal with collections of objects, such as a series of points, +all variables can be organized in arrays. For instance: + +\starttyping +numeric n[] ; n[3] := 10 ; n[5] := 13 ; +\stoptyping + +An array is a collection of variables of the same type that are assigned and +accessed by indexing the variable name, as in \type {n[3] := 5}. +Multi||dimensional arrays are also supported. Since you need a bit of imagination +to find an application for 5||dimensional arrays, we restrict ourselves to a +two||dimensional example. + +\starttyping +numeric n[][] ; n[2][3] := 10 ; +\stoptyping + +A nice feature is that the bounds of such an array needs not to be set +beforehand. This also means that each cell that you access is reported as {\em +unknown} unless you have assigned it a value. + +Behind the screens there are not really arrays. It's just a matter of creating +hash entries. It might not be obvious, but the following assignments are all +equivalent: + +\startbuffer +i_111_222 := 1cm ; +i_[111]_[222] := 1cm ; +i_[111][222] := 1cm ; +draw + image ( + draw (0cm,i_111_222) ; + draw (1cm,i_[111]_[222]) ; + draw (2cm,i_[111][222]) ; + ) + withpen pencircle scaled 5mm + withcolor .625 red ; +\stopbuffer + +\typebuffer + +Sometimes \METAPOST\ ways are mysterious: + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +\stopsection + +\startsection[title={Conditions}] + +\index{conditions} + +The existence of boolean variables indicates the presence of conditionals. +Indeed, the general form of \METAPOST's conditional follows: + +\starttyping +if n=10 : draw p ; else : draw q ; fi ; +\stoptyping + +Watch the colons after the if and else clause. They may not be omitted. The +semi||colons on the other hand, are optional and depend on the context. You may +say things like: + +\starttyping +draw if n=10 : p ; else : q ; fi ; +\stoptyping + +Here we can omit a few semi||colons: + +\starttyping +draw if n=10 : p else : q fi withcolor red ; +\stoptyping + +Adding semi||colons after \type {p} and \type {q} will definitely result in an +error message, since the semi||colon ends the draw operation and \typ {withcolor +red} becomes an isolated piece of nonsense. + +There is no case statement available, but for most purposes, the following +extension is adequate: + +\starttyping +draw p withcolor if n<10 : red elseif n=10 : green else : blue fi ; +\stoptyping + +There is a wide repertoire of boolean tests available. + +\starttyping +if picture p : +if known n : +if odd i : +if cycle q : +\stoptyping + +Of course, you can use \type {and}, \type {or}, \type {not}, and \type {( )} to +construct very advanced boolean expressions. If you have a bit of programming +experience, you will appreciate the extensive support of conditionals in +\METAPOST. + +\stopsection + +\startsection[title={Loops}] + +\index{loops} + +Yet another programming concept present in \METAPOST\ is the loop statement, the +familiar \quote {for loop} of all programming languages. + +\starttyping +for i=0 step 2 until 20 : + draw (0,i) ; +endfor ; +\stoptyping + +As explained convincingly in Niklaus Wirth's book on algorithms and +datastructures, the for loop is the natural companion to an array. Given an array +of length $n$, you can construct a path out of the points that make up the array. + +\starttyping +draw for i=0 step 1 until n-1 : p[i] .. endfor p[n] ; +\stoptyping + +If the step increment is not explicitly stated, it has an assumed value of 1. We +can shorten the previous loop construct as follows: + +\starttyping +draw for i=0 upto n-1 : p[i] .. endfor p[n] ; +\stoptyping + +After seeing \type {if} in action, the following \type {for} loop will be no +surprise: + +\startbuffer +draw origin for i=0 step 10 until 100 : ..{down}(i,0) endfor ; +\stopbuffer + +\typebuffer + +This gives the zig||zag curve: + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +You can use a loop to iterate over a list of objects. A simple 3||step iteration +is: + +\starttyping +for i=p,q,r : + fill i withcolor .8white ; + draw i withcolor red ; +endfor ; +\stoptyping +Using \type {for} in this manner can sometimes save a bit of typing. The list can +contain any expression, and may be of different types. + +In the previous example the \type {i} is an independent variable, local to the +for loop. If you want to change the loop variable itself, you need to use \type +{forsuffixes}. In the next loop the paths \type {p}, \type {q} and~\type {r} are +all shifted. + +\starttyping +forsuffixes i = p, q, r : + i := i shifted (3cm,2cm) ; +endfor ; +\stoptyping + +Sometimes you may want to loop forever until a specific condition occurs. For +this, \METAPOST\ provides a special looping mechanism: + +\startbuffer[demo] +numeric done[][], i, j, n ; n := 0 ; +forever : + i := round(uniformdeviate(10)) ; j := round(uniformdeviate(2)) ; + if unknown done[i][j] : + drawdot (i*cm,j*cm) ; n := n + 1 ; done[i][j] := n ; + fi ; + exitif n = 10 ; +endfor ; +\stopbuffer + +\typebuffer[demo] + +Here we remain in the loop until we have 10 points placed. We use an array to +keep track of placed points. The \METAPOST\ macro \type {uniformdeviate(n)} +returns a random number between 0 and~n and the \type {round} command is used to +move the result toward the nearest integer. The \type {unknown} primitive allows +us to test if the array element already exists, otherwise we exit the +conditional. This saves a bit of computational time as each point is drawn and +indexed only once. + +\startbuffer[pen] +pickup pencircle scaled 2mm ; +\stopbuffer + +\startlinecorrection[blank] +\processMPbuffer[pen,demo] +\stoplinecorrection + +The loop terminator \type {exitif} and its companion \type {exitunless} can be +used in \type {for}, \type {forsuffixes} and \type {forever}. + +\stopsection + +\startsection[title={Macros}] + +\index{macros} +\index{definitions} + +In the previous section we introduced \type {upto}. Actually this is not part of +the built in syntax, but a sort of shortcut, defined by: + +\starttyping +def upto = step 1 until enddef ; +\stoptyping + +You just saw a macro definition where \type {upto} is the name of the macro. The +counterpart of \type {upto} is \type {downto}. Whenever you use \type {upto}, it +is replaced by \typ {step 1 until}. This replacement is called expansion. + +There are several types of macros. A primary macro is used to define your own +operators. For example: + +\starttyping +primarydef p doublescaled s = + p xscaled (s/2) yscaled (s*2) +enddef ; +\stoptyping + +Once defined, the \type {doublescaled} macro is implemented as in the following +example: + +\starttyping +draw somepath doublescaled 2cm withcolor red ; +\stoptyping + +When this command is executed, the macro is expanded. Thus, the actual content of +this command becomes: + +\starttyping +draw somepath xscaled 1cm yscaled 4cm withcolor red ; +\stoptyping + +If in the definition of \type {doublescaled} we had added a semi||colon after +\type {(s*2)}, we could not have set the color, because the semicolon ends the +statement. The \type {draw} expects a path, so the macro can best return one. + +A macro can take one or more arguments, as in: + +\starttyping +def drawrandomscaledpath (expr p, s) = + draw p xscaled (s/2) yscaled (s*2) ; +enddef ; +\stoptyping + +When using this macro, it is expected that you will pass it two parameters, the +first being a path, the second a numeric scale factor. + +\starttyping +drawrandomscaledpath(fullsquare, 3cm) ; +\stoptyping + +Sometimes we want to return a value from a macro. In that case we must make sure +that any calculations don't interfere with the expectations. Consider: + +\starttyping +vardef randomscaledpath(expr p, s) = + numeric r ; r := round(1 + uniformdeviate(4)) ; + p xscaled (s/r) yscaled (s*r) +enddef ; +\stoptyping + +Because we want to use the same value of \type {r} twice, we have to use an +intermediate variable. By using a \type {vardef} we hide everything but the last +statement. It is important to distinguish \type {def} macros from those defined +with \type {vardef}. In the latter case, \type {vardef} macros are not a simple +expansion and replacement. Rather, \type {vardef} macros return the value of +their last statement. In the case of the \type {randomscaledpath} macro, a path +is returned. This macro is used in the following manner: + +\starttyping +path mypath ; mypath := randomscaledpath(unitsquare,4cm) ; +\stoptyping + +Note that we send \type {randomscaledpath} a path (\type {unitsquare}) and a +scaling factor (\type {4cm}). The macro returns a scaled path which is then +stored in the path variable \type {mypath}. + +The following argument types are accepted: + +\starttabulate +\HL +\NC expr \NC something that can be assigned to a variable \NC \NR +\NC text \NC arbitrary \METAPOST\ code ending with a \type {;} \NC \NR +\NC suffix \NC a variable bound to another variable \NC \NR +\HL +\stoptabulate +An expression is passed by value. This means that in the body of the macro, a +copy is used and the original is left untouched. On the other hand, any change to +a variable passed as suffix is also applied to the original. + +Local variables must be handled in a special manner, since they may conflict with +variables used elsewhere. This is because all variables are global by default. +The way out of this problem is using grouping in combination with saving +variables. The use of grouping is not restricted to macros and may be used +anywhere in your code. Variables saved and declared in a group are local to that +group. Once the group is exited the variables cease to exist. + +\starttyping +vardef randomscaledpath(expr p, s) = + begingroup ; save r ; numeric r ; + r := round(1 + uniformdeviate(4)) ; + p xscaled (s/r) yscaled (s*r) + endgroup +enddef ; +\stoptyping + +In this particular case, we could have omitted the grouping, since \type {vardef} +macros are always grouped automatically. Therefore, we could have defined the +macro as: + +\starttyping +vardef randomscaledpath(expr p, s) = + save r ; numeric r ; r := round(1 + uniformdeviate(4)) ; + p xscaled (s/r) yscaled (s*r) +enddef ; +\stoptyping + +The command \type {save r} declares that the variable \type {r} is local to the +macro. Thus, any changes to the (new) numeric variable \type {r} are local and +will not interfere with a variable \type {r} defined outside the macro. This is +important to understand, as variables outside the macro are global and accessible +to the code within the body of the macro. + +Macro definitions may be nested, but since most \METAPOST\ code is relatively +simple, it is seldom needed. Nesting is discouraged as it makes your code less +readable. + +Besides \type {def} and \type {vardef}, \METAPOST\ also provides the classifiers +\type {primarydef}, \type {secondarydef} and \type {tertiarydef}. You can use +these classifiers to define macros like those provided by \METAPOST\ itself: + +\starttyping +primarydef x mod y = ... enddef ; +secondarydef p intersectionpoint q = ... enddef ; +tertiarydef p softjoin q = ... enddef ; +\stoptyping +A primary macro acts like the binary operators \type {*} or \type {scaled} and +\type {shifted}. Secondary macros are like \type {+}, \type {-} and logical \type +{or}, and take less precedence. The tertiary operators like \type {<} or the path +and string concatenation operator \type {&} have tertiary macros as companions. +More details can be found in the \METAFONT\ book. When it comes to taking +precedence, \METAPOST\ tries to be as natural as possible, in the sense that you +need to provide as few \type {( )}'s as possible. When in doubt, or when +surprised by unexpected results, use parentheses. + +\stopsection + +\startsection[title={Arguments}] + +\index{arguments} +\index{macros+arguments} + +The \METAPOST\ macro language is rather flexible in how you feed arguments to +macros. If you have only one argument, the following definitions and calls are +valid. + +\starttyping +def test expr a = enddef ; test (a) ; test a ; +def test (expr a) = enddef ; test (a) ; test a ; +\stoptyping + +A more complex definition is the following. As you can see, you can call the +\type {test} macro in your favorite way. + +\starttyping +def test (expr a,b) (expr c,d) = enddef ; + +test (a) (b) (c) (d) ; +test (a,b) (c,d) ; +test (a,b,c) (d) ; +test (a,b,c,d) ; +\stoptyping + +The type of the arguments is one of \type {expr}, \type {primary} or \type +{suffix}. When fetching arguments, \METAPOST\ uses the type to determine how and +what to grab. A fourth type is \type {text}. When no parenthesis are used, a +\type {text} argument grabs everything upto the next semicolon. + +\starttyping +def test (expr a) text b = enddef ; + +test (a) ; test (a) b ; +\stoptyping + +You can use a \type {text} to grab arguments like \typ {withpen pencircle scaled +10 withcolor red}. Because \type {text} is so hungry, you may occasionally need a +two stage definition: + +\starttyping +def test expr a = dotext(a) enddef ; +def dotest (expr a) text b = ... enddef ; + +test a ; test a b ; +\stoptyping + +This definition permits arguments without parenthesis, which is something you +want with commands like \type {draw}. + +The \type {vardef} alternative behaves in a similar way. It always provides +grouping. You need to generate a return value and as a result may not end with a +semicolon. + +You may consider the whole \type {vardef} to be encapsulated into parenthesis and +thereby to be a (self contained) variable. Adding additional parenthesis often +does more harm than good: + +\starttyping +vardef test (expr a) = + ( do tricky things with a ; manipulated_a ) +enddef ; +\stoptyping + +Here the tricky things become part of the return value, which quite certainly is +something that you don't want. + +The three operator look||alike macro definitions are less flexible and have the +definition scheme: + +\starttyping +primarydef x test y = enddef ; +secondarydef x test y = enddef ; +tertiarydef x test y = enddef ; +\stoptyping + +When defining macros using this threesome you need to be aware of the associated +priorities. When using these definitions, you also have to provide your own +grouping. + +In the plain \METAPOST\ macro collection (\type {plain.mp}) you can find many +examples of clever definitions. The following (simplified) version of \type {min} +demonstrates how we use the argument handler to isolate the first argument from +the provided list, simply by using two arguments. + +\starttyping +vardef min (expr u) (text t) = + save min_u ; min_u := u ; + for uu = t : if uu<u : min_u := uu ; fi endfor + min_u +enddef ; +\stoptyping + +The special sequence \type {@#} is used to pick up a so called delimited argument: + +\starttyping +vardef TryMe@#(expr x) = + % we can now use @#, which is just text +enddef ; +\stoptyping + +This feature is used in the definition of \type {z} as used in \type {z1} or +\type {z234}: + +\starttyping +vardef z@# = (x@#,y@#) enddef ; +\stoptyping + +Other applications can be found in the label drawing macros where the anchor +point is assigned to the obscure variable \type {@#}. + +\stopsection + +\startsection[title={Pens}] + +\index{pens} + +When drawing, three attributes can be applied to it: a dashpattern, a pen +and|/|or a color. You may consider an arrowhead an attribute, but actually it is +just an additional drawing, appended to the path. + +The (predefined) \type {pencircle} attribute looks like: + +\starttyping +withpen pencircle +\stoptyping + +where \type {pencircle} is a special kind of path, stored in a pen variable. Like +any path, you can transform it. You can scale it equally in all directions: + +\starttyping +withpen pencircle scaled 1mm +\stoptyping + +You can also provide unequal scales, creating an elliptically shaped and rotated +pen. + +\starttyping +withpen pencircle xscaled 2mm yscaled 4mm rotated 30 +\stoptyping + +In the following graphic, the circle in the center is drawn without any option, +which means that the default pen is used, being a pencircle with a radius of half +a base point. The other three circles are drawn with different pen +specifications. + +\startlinecorrection[blank] +\startMPcode +path p ; p := fullcircle scaled 1cm ; +drawoptions (withcolor .625yellow) ; +draw p ; +drawoptions (withcolor .625red) ; +draw p scaled 2 withpen pencircle ; +drawoptions (withcolor .625yellow) ; +draw p scaled 3 withpen pencircle scaled 1mm ; +drawoptions (withcolor .625red) ; +draw p scaled 4 withpen pencircle xscaled 2mm yscaled 4mm rotated 30 ; +\stopMPcode +\stoplinecorrection + +If you forget about the colors, the \METAPOST\ code to achieve this is as +follows. + +\starttyping +path p ; p := fullcircle scaled 1cm ; +draw p ; +draw p scaled 2 withpen pencircle ; +draw p scaled 3 withpen pencircle scaled 1mm ; +draw p scaled 4 withpen pencircle xscaled 2mm yscaled 4mm rotated 30 ; +\stoptyping + +If this were the only way of specifying a pen, we would be faced with a +considerable amount of typing, particularly in situations where we use pens +similar to the fourth specification above. For that reason, \METAPOST\ supports +the concept of a current pen. The best way to set this pen is to use the \type +{pickup} macro. + +\starttyping +pickup pencircle xscaled 2mm yscaled 4mm rotated 30 ; +\stoptyping + +This macro also stores some characteristics of the pen in variables, so that they +can be used in (the more complicated) calculations that are involved in +situations like drawing font||like graphics. + +If we substitute \type {pencircle} by \type {pensquare}, we get a different kind +of shapes. In the non rotated pens, the top, bottom, left and right parts of the +curve are thinner. + +\startlinecorrection[blank] +\startMPcode +path p ; p := fullcircle scaled 1cm ; +drawoptions (withcolor .625yellow) ; +draw p ; +drawoptions (withcolor .625red) ; +draw p scaled 2 withpen pensquare ; +drawoptions (withcolor .625yellow) ; +draw p scaled 3 withpen pensquare scaled 1mm ; +drawoptions (withcolor .625red) ; +draw p scaled 4 withpen pensquare xscaled 2mm yscaled 4mm rotated 30 ; +\stopMPcode +\stoplinecorrection + +You should look at pens in the way an artist does. He follows a shape and in +doing so he or she twists the pen (and thereby the nib) and puts more or less +pressure on it. + +The chance that you have an appropriate pen laying at your desk is not so big, +but you can simulate the following \METAPOST's pen by taking two pencils and +holding them together in one hand. If you position them in a 45 degrees angle, +and draw a circle, you will get something like: + +\startlinecorrection[blank] +\startMPcode +path p ; p := fullcircle xscaled 2cm yscaled 3cm ; +drawoptions(withcolor .625red withpen pencircle scaled .5mm); +draw p ; draw p shifted (.3cm,.3cm) ; +\stopMPcode +\stoplinecorrection + +If you take a calligraphic pen with a thin edge of .5cm, you will get: + +\startlinecorrection[blank] +\startMPcode +drawoptions(withcolor .625red); +path p ; p := fullcircle xscaled 2cm yscaled 3cm ; +draw p withpen makepen ((0,0)--(.3cm,.3cm)) withcolor .625white ; +drawoptions(withcolor .625red withpen pencircle scaled .25mm); +draw p ; draw p shifted (.3cm,.3cm) ; +\stopMPcode +\stoplinecorrection + +You can define such a pen yourself: + +\starttyping +path p ; p := fullcircle xscaled 2cm yscaled 3cm ; +pen doublepen ; doublepen := makepen ((0,0)--(.3cm,.3cm)) ; +pickup doublepen ; draw p ; +\stoptyping + +Here we define a new pen using the \type {pen} command. Then we define a path, +and make a pen out of it using the \type {makepen} macro. The path should be a +relatively simple one, otherwise \METAPOST\ will complain. + +You can use \type {makepen} with the previously introduced \type {withpen}: + +\starttyping +draw p withpen makepen ((0,0)--(.3cm,.3cm)) ; +\stoptyping + +and \type {pickup}: + +\starttyping +pickup makepen ((0,0)--(.3cm,.3cm)) ; draw p ; +\stoptyping + +You can use \type {makepen} and \type {makepath} to convert paths into pens and +vice versa. + +Pens are very important when defining fonts, and \METAFONT\ is meant to be a font +creation tool. Since \METAPOST\ has a slightly different audience, it lacks some +features in this area, but offers a few others instead. Nevertheless, one can try +to design a font using \METAPOST. Of course, pens are among the designers best +kept secrets. But even then, not every~O is a nice looking one. + +\startlinecorrection[blank] +\startMPcode +path p ; p := fullcircle xscaled 2cm yscaled 3cm ; +draw p withpen makepen (unitsquare scaled .4cm superellipsed .85) +withcolor .625white ; +\stopMPcode +\stoplinecorrection + +\startbuffer[s00] + path p ; p := (-1,0) {down} .. {up} (1,0) ; + draw pensilled(p, pensquare scaled (1/3)) + scaled 2cm ; + draw boundingbox image(draw p) + scaled 2cm ; +\stopbuffer + +\startbuffer[s30] + path p ; p := (-1,0) {down} .. {up} (1,0) ; + draw pensilled(p, pensquare scaled (1/3) rotated 30) + scaled 2cm ; + draw boundingbox image(draw p) + scaled 2cm ; +\stopbuffer + +\startbuffer[s45] + path p ; p := (-1,0) {down} .. {up} (1,0) ; + draw pensilled(p, pensquare scaled (1/3) rotated 45) + scaled 2cm ; + draw boundingbox image(draw p) + scaled 2cm ; +\stopbuffer + +\startbuffer[c00] + path p ; p := (-1,0) {down} .. {up} (1,0) ; + draw pensilled(p, pencircle scaled (1/3)) + scaled 2cm ; + draw boundingbox image(draw p) + scaled 2cm ; +\stopbuffer + +\startbuffer[c30] + path p ; p := (-1,0) {down} .. {up} (1,0) ; + draw pensilled(p, pencircle scaled (1/3) rotated 30) + scaled 2cm ; + draw boundingbox image(draw p) + scaled 2cm ; +\stopbuffer + +\startbuffer[c45] + path p ; p := (-1,0) {down} .. {up} (1,0) ; + draw pensilled(p, pencircle scaled (1/3) rotated 45) + scaled 2cm ; + draw boundingbox image(draw p) + scaled 2cm ; +\stopbuffer + +\startbuffer[f30] + interim pensilstep := 1/6 ; + draw pensilled(fullcircle, pencircle xscaled (1/10) yscaled (2/10) rotated 30) + scaled 5cm ; + draw boundingbox fullcircle + scaled 5cm ; +\stopbuffer + +The \type {pensilled} macro is a variant on a macro used for testing some border +cases in the engine. It provides a nice way to see what actually happens when a +pen is applied. \in {Figure} [fig:pensilled] demonstrates this macro. The first +row shows a square pen: + +\typebuffer[s30] + +and the second row a circular pen: + +\typebuffer[c30] + +\startplacefigure[title={How pens are applied.},reference=fig:pensilled] + \startcombination[3*2] + {\processMPbuffer[s00]} {\tttf pensquare rotated 0} + {\processMPbuffer[s30]} {\tttf pensquare rotated 30} + {\processMPbuffer[s45]} {\tttf pensquare rotated 45} + {\processMPbuffer[c00]} {\tttf pencircle rotated 0} + {\processMPbuffer[c30]} {\tttf pencircle rotated 30} + {\processMPbuffer[c45]} {\tttf pencircle rotated 45} + \stopcombination +\stopplacefigure + +The effects of rotation and non|-|proportional scaling are demonstrated +in \in {figure} [fig:pensilled:fullcircle]. + +\typebuffer[f30] + +\startplacefigure[title={A proportionally scaled and rotated pen.},reference=fig:pensilled:fullcircle] + \processMPbuffer[f30] +\stopplacefigure + +\stopsection + +\startsection[title={Joining lines}] + +\index{joining} +\index{paths+joining} + +The way lines are joined or end is closely related to the way \POSTSCRIPT\ +handles this. By setting the variables \type {linejoin} and \type {linecap}, you +can influence the drawing process. \in {Figure} [fig:joints] demonstrates the +alternatives. The gray curves are drawn with both variables set to \type +{rounded}. + +\startnotmode[screen] + +\def\showMPline#1#2% + {\startMPcode + path p ; p := ((0,0)--(.5,1)--(1,0)) xscaled 3cm yscaled 1.5cm ; + pickup pencircle scaled 1cm ; + draw p withcolor .625white ; + interim linejoin := #1 ; + interim linecap := #2 ; + draw p withcolor transparent(1,.5,.625yellow) ; + \stopMPcode} + +\stopnotmode + +\startmode[screen] + +\def\showMPline#1#2% + {\startMPcode + path p ; p := ((0,0)--(.5,1)--(1,0)) xscaled 2.5cm yscaled 1.25cm ; + pickup pencircle scaled .75cm ; + draw p withcolor .625white ; + interim linejoin := #1 ; + interim linecap := #2 ; + draw p withcolor transparent(1,.5,.625yellow) ; + \stopMPcode} + +\stopmode + +\def\showMPtext#1#2% + {linejoin=#1\par linecap=#2} + +\startbuffer +\startcombination[3*3] + {\showMPline{mitered}{butt}} {\showMPtext{mitered}{butt}} + {\showMPline{mitered}{rounded}} {\showMPtext{mitered}{rounded}} + {\showMPline{mitered}{squared}} {\showMPtext{mitered}{squared}} + {\showMPline{rounded}{butt}} {\showMPtext{rounded}{butt}} + {\showMPline{rounded}{rounded}} {\showMPtext{rounded}{rounded}} + {\showMPline{rounded}{squared}} {\showMPtext{rounded}{squared}} + {\showMPline{beveled}{butt}} {\showMPtext{beveled}{butt}} + {\showMPline{beveled}{rounded}} {\showMPtext{beveled}{rounded}} + {\showMPline{beveled}{squared}} {\showMPtext{beveled}{squared}} +\stopcombination +\stopbuffer + +\placefigure + [here] [fig:joints] + {The nine ways to end and join lines.} + {\getbuffer} + +By setting the variable \type {miterlimit}, you can influence the mitering of +joints. The next example demonstrates that the value of this variable acts as a +trigger. + +\startbuffer +interim linejoin := mitered ; +for i :=1 step 1 until 5 : + interim miterlimit := i*pt ; + draw ((0,0)--(.5,1)--(1,0)) shifted (1.5i,0) scaled 50pt + withpen pencircle scaled 10pt withcolor .625red ; +endfor ; +\stopbuffer + +\typebuffer + +The variables \type {linejoin}, \type {linecap} and \type {miterlimit} are so +called {\em internal} variables. When we prefix their assignments by \type +{interim}, the setting will be local within groups, like \typ {beginfig ... +endfig}. + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +\stopsection + +\startsection[title={Colors}] + +\index{attributes} +\index{color} +So far, we have seen some colors in graphics. It must be said that \METAPOST\ +color model is not that advanced, although playing with colors in the \METAPOST\ +way can be fun. In later chapters we will discuss some extensions that provide +shading. + +Colors are defined as vectors with three components: a red, green and blue one. +Like pens, colors have their \type {with}||command: + +\starttyping +withcolor (.4,.5.,6) +\stoptyping + +You can define color variables, like: + +\starttyping +color darkred ; darkred := (.625,0.0) ; +\stoptyping + +You can now use this color as: + +\starttyping +withcolor darkred +\stoptyping + +Given that \type {red} is already defined, we also could have said: + +\starttyping +withcolor .625red +\stoptyping + +Because for \METAPOST\ colors are just vectors, you can do things similar to +points. A color halfway red and green is therefore accomplished with: + +\starttyping +withcolor .5[red,green] +\stoptyping + +Since only the \RGB\ color space is supported, this is about all we can tell +about colors for this moment. Later we will discuss some nasty details. + +\stopsection + +\startsection[title={Dashes}] + +\index{dashes} + +A dash pattern is a simple picture that is build out of straight lines. Any +slightly more complicated picture will be reduced to straight lines and a real +complicated one is rejected, and in this respect \METAPOST\ considers a circle to +be a complicated path. + +The next example demonstrates how to get a dashed line. First we built picture +\type {p}, that we apply to a path. Here we use a straight path, but dashing can +be applied to any path. + +\startbuffer +picture p ; p := nullpicture ; +addto p doublepath ((0,0)--(3mm,3mm)) shifted (6mm,6mm) ; +draw (0,0)--(10cm,0) dashed p withpen pencircle scaled 1mm ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +This way of defining a pattern is not that handy, especially if you start +wondering why you need to supply a slanted path. Therefore, \METAPOST\ provides a +more convenient mechanism to define a pattern. + +\startbuffer +picture p ; p := dashpattern(on 3mm off 3mm) ; +draw (0,0)--(10cm,0) dashed p withpen pencircle scaled 1mm ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +Most dashpatterns can be defined in terms of on and off. This simple on||off +dashpattern is predefined as picture \type {evenly}. Because this is a picture, +you can (and often need to) scale it. + +\startbuffer +draw (0,0)--(10cm,0) dashed (evenly scaled 1mm) + withpen pencircle scaled 1mm ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +Opposite to a defaultpen, there is no default color and default dash pattern set. +The macro \type {drawoptions} provides you a way to set the default attributes. + +\starttyping +drawoptions(dashed evenly withcolor red) ; +\stoptyping + +\stopsection + +\startsection[reference=sec:text,title={Text}] + +\index{text} + +Since \METAFONT\ is meant for designing fonts, the only means for including text +are those that permit you to add labels to positions for the sole purpose of +documentation. + +Because \METAPOST\ is derived from \METAFONT\ it provides labels too, but in +order to let users add more sophisticated text, like a math formula, to a +graphic, it also provides an interface to \TEX. + +Because we will spend a whole chapter on using text in \METAPOST\ we limit the +discussion here to a few fundamentals. + +\startbuffer[font] +defaultfont := "\truefontname{Mono}" ; +defaultscale := .8 ; +\stopbuffer + +\startbuffer[label] +pair a ; a := (3cm,3cm) ; +label.top("top",a) ; label.bot("bot",a) ; +label.lft("lft",a) ; label.rt ("rt" ,a) ; +\stopbuffer + +\typebuffer[label] + +These four labels show up at the position stored in the pair variable \type {a}, +anchored in the way specified after the period. + +\startlinecorrection[blank] +\processMPbuffer[font,label] +\stoplinecorrection + +The command \type {dotlabel} also typesets the point as a rather visible dot. + +\startbuffer[label] +pair a ; a := (3cm,3cm) ; +dotlabel.top("top",a) ; dotlabel.bot("bot",a) ; +dotlabel.lft("lft",a) ; dotlabel.rt ("rt" ,a) ; +\stopbuffer + +\typebuffer[label] + +\startlinecorrection[blank] +\processMPbuffer[font,label] +\stoplinecorrection + +The command \type {thelabel} returns the typeset label as picture that you can +manipulate or draw afterwards. + +\startbuffer[label] +pair a ; a := (3cm,3cm) ; pickup pencircle scaled 1mm ; +drawdot a withcolor .625yellow ; +draw thelabel.rt("the right way",a) withcolor .625red ; +\stopbuffer + +\typebuffer[label] + +You can of course rotate, slant and manipulate such a label picture like any +other picture. + +\startlinecorrection[blank] +\processMPbuffer[font,label] +\stoplinecorrection + +The font can be specified in the string \type {defaultfont} and the scale in +\type {defaultscale}. Labels are defined using the low level operator \type +{infont}. The next statement returns a picture: + +\startbuffer[mp] +draw "this string will become a sequence of glyphs (MP)" + infont defaultfont scaled defaultscale ; +\stopbuffer + +\typebuffer[mp] + +By default the \type {infont} operator is not that clever and does not apply +kerning. Also, typesetting math or accented characters are not supported. The way +out of this problem is using \typ {btex ... etex}. + +\startbuffer[tex] +draw btex this string will become a sequence of glyphs (\TeX) etex ; +\stopbuffer + +\typebuffer[tex] + +The difference between those two methods is shown below. The outcome of \type +{infont} depends on the current setting of the variable \type {defaultfont}. + +\startlinecorrection[blank] +\processMPbuffer[mp] +\processMPbuffer[tex] +\stoplinecorrection + +When you run inside \CONTEXT\ (as we do here) there is no difference between +\type {infont} and the \TEX\ methods. This is because we overload the \type +{infont} operator and also pass its content to \TEX. Both \type {infont} and +\type {btex} use the macro \type {textext} which is intercepted and redirects the +task to \TEX. This happens in the current run so there is no need to pass extra +information about fonts. + +Instead of passing strings to \type {infont}, you can also pass characters, using +\type {char}, for example \type {char(73)}. When you use \type {infont} you +normally expect the font to be \ASCII\ conforming. If this is not the case, you +must make sure that the encoding of the font that you use matches your +expectations. However, as we overload this macro it does not really matter since +the string is passed to \TEX\ anyway. For instance, \UTF\ encoded text should +work fine as \CONTEXT\ itself understands this encoding. + +\stopsection + +\startsection[title={Linear equations}] + +\index{equations} +\index{expressions} + +\startbuffer[a] +\defineMPinstance + [solvers] + [format=metafun, + extensions=yes, + initializations=yes] +\stopbuffer + +\startbuffer[b] +\startMPdefinitions{solvers} +def draw_problem (expr p, q, r, s, show_labels) = + begingroup ; save x, y, a, b, c, d, e, f, g, h ; + + z11 = z42 = p ; z21 = z12 = q ; z31 = z22 = r ; z41 = z32 = s ; + + a = x12 - x11 ; b = y12 - y11 ; c = x22 - x21 ; d = y22 - y21 ; + e = x32 - x31 ; f = y32 - y31 ; g = x42 - x41 ; h = y42 - y41 ; + + z11 = (x11, y11) ; z12 = (x12, y12) ; + z13 = (x12-b, y12+a) ; z14 = (x11-b, y11+a) ; + z21 = (x21, y21) ; z22 = (x22, y22) ; + z23 = (x22-d, y22+c) ; z24 = (x21-d, y21+c) ; + z31 = (x31, y31) ; z32 = (x32, y32) ; + z33 = (x32-f, y32+e) ; z34 = (x31-f, y31+e) ; + z41 = (x41, y41) ; z42 = (x42, y42) ; + z43 = (x42-h, y42+g) ; z44 = (x41-h, y41+g) ; + + pickup pencircle scaled .5pt ; + + draw z11--z12--z13--z14--cycle ; draw z11--z13 ; draw z12--z14 ; + draw z21--z22--z23--z24--cycle ; draw z21--z23 ; draw z22--z24 ; + draw z31--z32--z33--z34--cycle ; draw z31--z33 ; draw z32--z34 ; + draw z41--z42--z43--z44--cycle ; draw z41--z43 ; draw z42--z44 ; + + z1 = 0.5[z11,z13] ; z2 = 0.5[z21,z23] ; + z3 = 0.5[z31,z33] ; z4 = 0.5[z41,z43] ; + + draw z1--z3 dashed evenly ; draw z2--z4 dashed evenly ; + + z0 = whatever[z1,z3] = whatever[z2,z4] ; + mark_rt_angle (z1, z0, z2) ; % z2 is not used at all + + if show_labels > 0 : + draw_problem_labels ; + fi ; + + endgroup ; +enddef ; +\stopMPdefinitions +\stopbuffer + +\startbuffer[c] +\startMPdefinitions{solvers} +angle_radius := 10pt ; + +def mark_rt_angle (expr a, b, c) = + draw ((1,0)--(1,1)--(0,1)) + zscaled (angle_radius*unitvector(a-b)) + shifted b +enddef ; +\stopMPdefinitions +\stopbuffer + +\startbuffer[d] +\startMPdefinitions{solvers} +def draw_problem_labels = + pickup pencircle scaled 5pt ; + + dotlabel.llft("$Z_{11}$", z11) ; dotlabel.ulft("$Z_{12}$", z12) ; + dotlabel.ulft("$Z_{13}$", z13) ; dotlabel.llft("$Z_{14}$", z14) ; + + dotlabel.lrt ("$Z_{21}$", z21) ; dotlabel.llft("$Z_{22}$", z22) ; + dotlabel.urt ("$Z_{23}$", z23) ; dotlabel.ulft("$Z_{24}$", z24) ; + + dotlabel.urt ("$Z_{31}$", z31) ; dotlabel.ulft("$Z_{32}$", z32) ; + dotlabel.urt ("$Z_{33}$", z33) ; dotlabel.urt ("$Z_{34}$", z34) ; + + dotlabel.lrt ("$Z_{41}$", z41) ; dotlabel.urt ("$Z_{42}$", z42) ; + dotlabel.llft("$Z_{43}$", z43) ; dotlabel.lrt ("$Z_{44}$", z44) ; + + dotlabel.urt ("$Z_{0}$", z0) ; + dotlabel.lft ("$Z_{1}$", z1) ; dotlabel.top ("$Z_{2}$", z2) ; + dotlabel.rt ("$Z_{3}$", z3) ; dotlabel.bot ("$Z_{4}$", z4) ; +enddef ; +\stopMPdefinitions +\stopbuffer + +\startbuffer[e] +\startuseMPgraphic{solvers::one}{i,j,s} + draw_problem ( + (400pt,400pt), (300pt,600pt), + \MPvar{i}[(300pt,600pt), (550pt,800pt)], + \MPvar{j}[(400pt,400pt), (550pt,500pt)], + \MPvar{s} + ) ; +\stopuseMPgraphic +\stopbuffer + +\startbuffer[f] +\placefigure + [here][fig:problem] + {The problem.} + {\scale + [width=\textwidth] + {\useMPgraphic{solvers::one}{i=0.6,j=1.0,s=1}}} +\stopbuffer + +In the previous sections, we used the assignment operator \type {:=} to assign a +value to a variable. Although for most of the graphics that we will present in +later chapters, an assignment is appropriate, specifying a graphic in terms of +expressions is not only more flexible, but also more in the spirit of the +designers of \METAFONT\ and \METAPOST. + +The \METAFONT\ book and \METAPOST\ manual provide lots of examples, some of which +involve math that we don't consider to belong to everyones repertoire. But, even +for non mathematicians using expressions can be a rewarding challenge. + +The next introduction to linear equations is based on my first experiences with +\METAPOST\ and involves a mathematical challenge posed by a friend. I quickly +ascertained that a graphical proof was far more easy than some proof with a lot +of $\sin (this)$ and $\cos (that)$ and long forgotten formulas. + +I was expected to prove that the lines connecting the centers of four squares +drawn upon the four sides of a quadrilateral were perpendicular (see \in {figure} +[fig:problem]). + +\getbuffer[a,b,c,d,e] + +\getbuffer[f] + +This graphic was generated with the following command: + +\typebuffer[f] + +We will use this example to introduce a few new concepts, one being instances. In +a large document there can be many \METAPOST\ graphics and they might fall in +different categories. In this manual we have graphics that are generated as part +of the style as wel as examples that show what \METAFUN\ can do. As definitions +and variables in \METAPOST\ are global by default, there is a possibility that we +end up with clashes. This can be avoided by grouping graphics in instances. Here +we create an instance for the example that we're about to show. + +\typebuffer[a] + +We can now limit the scope of definitions to this specific instance. Let's start +with the macro that takes care of drawing the solution to our problem. The macro +accepts four pairs of coordinates that determine the central quadrilateral. All +of them are expressions. + +\typebuffer[b] + +Because we want to call this macro more than once, we first have to save the +locally used values. Instead of declaring local variables, one can hide their use +from the outside world. In most cases variables behave globally. If we don't save +them, subsequent calls will lead to errors due to conflicting equations. We can +omit the grouping commands, because we wrap the graphic in a figure, and figures +are grouped already. + +We will use the predefined \type {z} variable, or actually a macro that returns a +variable. This variable has two components, an \type {x} and \type {y} +coordinate. So, we don't save \type {z}, but the related variables \type {x} and +\type {y}. + +Next we draw four squares and instead of hard coding their corner points, we use +\METAPOST's equation solver. Watch the use of \type {=} which means that we just +state dependencies. In languages like \PERL, the equal sign is used in +assignments, but in \METAPOST\ it is used to express relations. + +In a first version, we will just name a lot of simple relations, as we can read +them from a sketch drawn on paper. So, we end up with quite some \type {z} +related expressions. + +For those interested in the mathematics behind this code, we add a short +explanation. Absolutely key to the construction is the fact that you traverse the +original quadrilateral in a clockwise orientation. What is really going on here +is vector geometry. You calculate the vector from $z_{11}$ to $z_{12}$ (the first +side of the original quadrilateral) with: + +\starttyping +(a,b) = z12 - z11 ; +\stoptyping + +This gives a vector that points from $z_{11}$ to $z_{12}$. Now, how about an +image that shows that the vector $(-b,a)$ is a 90 degree rotation in the +counterclockwise direction. Thus, the points $z_{13}$ and $z_{14}$ are easily +calculated with vector addition. + +\starttyping +z13 = z12 + (-b,a) ; +z14 = z11 + (-b,a) ; +\stoptyping + +This pattern continues as you move around the original quadrilateral in a +clockwise manner. \footnote {Thanks to David Arnold for this bonus explanation.} + +The code that calculates the pairs \type {a} through \type {h}, can be written in +a more compact way. + +\starttyping +(a,b) = z12 - z11 ; (c,d) = z22 - z21 ; +(e,f) = z32 - z31 ; (g,h) = z42 - z41 ; +\stoptyping + +The centers of each square can also be calculated by \METAPOST. The next lines +define that those points are positioned halfway the extremes. + +\starttyping +z1 = 0.5[z11,z13] ; z2 = 0.5[z21,z23] ; +z3 = 0.5[z31,z33] ; z4 = 0.5[z41,z43] ; +\stoptyping + +Once we have defined the relations we can let \METAPOST\ solve the equations. +This is triggered when a variable is needed, for instance when we draw the +squares and their diagonals. We connect the centers of the squares using a dashed +line style. + +Just to be complete, we add a symbol that marks the right angle. First we +determine the common point of the two lines, that lays at {\em whatever} point +\METAPOST\ finds suitable. + +The definition of \type {mark_rt_angle} is copied from the \METAPOST\ manual and +shows how compact a definition can be (see \at {page} [zscaled] for an +introduction to \type {zscaled}). + +\typebuffer[c] + +So far, most equations are rather simple, and in order to solve them, \METAPOST\ +did not have to work real hard. The only boundary condition is that in order to +find a solution, \METAPOST\ must be able to solve all dependencies. + +The actual value of the \type {whatever} variable is that it saves us from +introducing a slew of variables that will never be used again. We could write: + +\starttyping +z0 = A[z1,z3] = B[z2,z4] ; +\stoptyping + +and get the same result, but the \type {whatever} variable saves us the trouble +of introducing intermediate variables for which we have no use once the +calculation is finished. + +The macro \type{mark_rt_angle} draws the angle symbol and later we will see how +it is defined. First we draw the labels. Unfortunately we cannot package \typ +{btex ... etex} into a macro, because it is processed in a rather special way. +Each \typ {btex ... etex} occurance is filtered from the source and converted +into a snippet of \TEX\ code. When passed through \TEX, each snippet becomes a +page, and an auxiliary program converts each page into a \METAPOST\ picture +definition, which is loaded by \METAPOST. The limitation lays in the fact that +the filtering is done independent from the \METAPOST\ run, which means that loops +(and other code) are not seen at all. Later we will introduce the \METAFUN\ way +around this. + +In order to get all the labels typeset, we have to put a lot of code here. The +macro \type {dotlabel} draws a dot and places the typeset label. + +\typebuffer[d] + +Watch out: as we are in \CONTEXT, we can pass regular \TEX\ code to the label +macro. In a standalone \METAPOST\ run you'd have to use the \type {btex} variant. + +We are going to draw a lot of pictures, so we define an extra macro. This time we +hard||code some values. The fractions \type {i} and \type {j} are responsible for +the visual iteration process, while \type {s} determines the labels. We pass +these variables to the graphic using an extra argument. When you define the +(useable) graphic you need to tell what variables it can expect. + +\typebuffer[e] + +Of course we could have used a loop construct here, but defining auxiliary macros +probably takes more time than simply calling the drawing macro directly. The +results are shown on a separate page (\in{figure}[fig:solution]). + +\startbuffer[x] +\def\MyTest#1#2% + {\scale + [width=.25\textwidth] + {\useMPgraphic{solvers::one}{i=#1,j=#2,s=0}}} +\stopbuffer + +\startbuffer[y] + \startcombination[3*4] + {\MyTest{1.0}{1.0}} {1.0 / 1.0} {\MyTest{0.8}{1.0}} {0.8 / 1.0} + {\MyTest{0.6}{1.0}} {0.6 / 1.0} {\MyTest{0.4}{1.0}} {0.4 / 1.0} + {\MyTest{0.2}{1.0}} {0.2 / 1.0} {\MyTest{0.0}{1.0}} {0.0 / 1.0} + {\MyTest{0.0}{1.0}} {0.0 / 1.0} {\MyTest{0.0}{0.8}} {0.0 / 0.8} + {\MyTest{0.0}{0.6}} {0.0 / 0.6} {\MyTest{0.0}{0.4}} {0.0 / 0.4} + {\MyTest{0.0}{0.2}} {0.0 / 0.2} {\MyTest{0.0}{0.0}} {0.0 / 0.0} + \stopcombination +\stopbuffer + +We will use a helper macro (that saves us typing): + +\typebuffer[x] + +We now can say: + +\typebuffer[y] + +Watch how we pass the settings to the graphic definition using an extra argument. +We force using the \type {solvers} instance by prefixing the name. + +\startpostponing + + \startnotmode[screen] + \placefigure + [here][fig:solution] + {The solution.} + {\getbuffer[x,y]} + \stopnotmode + + \startmode[screen] + \placefigure + [here][fig:solution] + {The solution.} + {\getbuffer[x,y]} + \stopmode + + \page + +\stoppostponing + +It does not need that much imagination to see the four sided problem converge to +a three sided one, which itself converges to a two sided one. In the two sided +alternative it's not that hard to prove that the angle is indeed 90 degrees. + +As soon as you can see a clear pattern in some code, it's time to consider using +loops. In the previous code, we used semi indexes, like \type {12} in \type +{z12}. In this case \type{12} does reflect something related to square~1 and~2, +but in reality the 12 is just twelve. This does not harm our expressions. + +A different approach is to use a two dimensional array. In doing so, we can +access the variables more easily using loops. If we omit the labels, and angle +macro, the previously defined macro can be reduced considerably. + +\starttyping +def draw_problem (expr n, p, q, r, s) = % number and 4 positions + begingroup ; save x, y ; + + z[1][1] = p ; z[2][1] = q ; z[3][1] = r ; z[4][1] = s ; + + for i=1 upto 4 : + z[i][1] = (x[i][1],y[i][1]) = z[if i=1: 4 else: i-1 fi][2] ; + z[i][2] = (x[i][2],y[i][2]) ; + z[i][3] = (x[i][2]-y[i][2]+y[i][1], y[i][2]+x[i][2]-x[i][1]) ; + z[i][4] = (x[i][1]-y[i][2]+y[i][1], y[i][1]+x[i][2]-x[i][1]) ; + z[i] = 0.5[z[i][1],z[i][3]] ; + endfor ; + + z[0] = whatever[z[1],z[3]] = whatever[z[2],z[4]] ; + + pickup pencircle scaled .5pt ; + + for i=1 upto 4 : + draw z[i][1]--z[i][2]--z[i][3]--z[i][4]--cycle ; + draw z[i][1]--z[i][3] ; draw z[i][2]--z[i][4] ; + if i<3 : draw z[i]--z[i+2] dashed evenly fi ; + endfor ; + + draw ((1,0)--(1,1)--(0,1)) + zscaled (unitvector(z[1]-z[0])*10pt) + shifted z[0] ; + + endgroup ; +enddef ; +\stoptyping + +I think that we could argue quite some time about the readability of this code. +If you start from a sketch, and the series of equations does a good job, there is +hardly any need for such improvements to the code. On the other hand, there are +situations where the simplified (reduced) case can be extended more easily, for +instance to handle 10 points instead of~4. It all depends on how you want to +spend your free hours. + +\stopsection + +\startsection[title={Clipping}] + +\index{clipping} + +For applications that do something with a drawing, for instance \TEX\ embedding a +graphic in a text flow, it is important to know the dimensions of the graphic. +The maximum dimensions of a graphic are specified by its bounding box. + +\startlinecorrection[blank] +\startMPcode +path p ; p := fullcircle scaled 3cm ; +draw p withpen pencircle scaled 1mm withcolor .625red ; +draw boundingbox p withpen pencircle scaled .1mm ; +draw llcorner boundingbox p withpen pencircle scaled 2mm withcolor .625yellow ; +draw urcorner boundingbox p withpen pencircle scaled 2mm withcolor .625yellow ; +\stopMPcode +\stoplinecorrection + +A bounding box is defined by its lower left and upper right corners. If you open +the \POSTSCRIPT\ file produced by \METAPOST, you may find lines like: + +\starttyping +%%BoundingBox: -46 -46 46 46 +\stoptyping + +or, when supported, + +\starttyping +%%HiResBoundingBox: -45.35432 -45.35432 45.35432 45.35432 +\stoptyping + +The first two numbers define the lower left corner and the last two numbers the +upper right corner. From these values, you can calculate the width and height of +the graphic. + +A graphic may extend beyond its bounding box. It depends on the application that +uses the graphic whether that part of the graphic is shown. + +In \METAPOST\ you can ask for all four points of the bounding box of a path or +picture as well as the center. + +\starttabulate[|lT|l|] +\HL +\NC llcorner p \NC lower left corner \NC \NR +\NC lrcorner p \NC lower right corner \NC \NR +\NC urcorner p \NC upper right corner \NC \NR +\NC ulcorner p \NC upper left corner \NC \NR +\NC center p \NC the center point \NC \NR +\HL +\stoptabulate + +You can construct the bounding box of path~\type {p} out of the four points +mentioned: + +\starttyping +llcorner p -- lrcorner p -- urcorner p -- ulcorner p -- cycle +\stoptyping + +You can set the bounding box of a picture, which can be handy if you want to +build a picture in steps and show the intermediate results using the same +dimensions as the final picture, or when you want to show only a small piece. + +\startbuffer +fill fullcircle scaled 2cm withcolor .625yellow ; +setbounds currentpicture to unitsquare scaled 1cm ; +draw unitsquare scaled 1cm withcolor .625red ; +\stopbuffer + +\typebuffer + +Here, we set the bounding box with the command \type {setbounds}, which takes a +path. + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +The graphic extends beyond the bounding box, but the bounding box determines the +placement and therefore the spacing around the graphic. We can get rid of the +artwork outside the bounding box by clipping it. + +\startbuffer +fill fullcircle scaled 2cm withcolor .625yellow ; +clip currentpicture to unitsquare scaled 1cm ; +\stopbuffer + +\typebuffer + +The resulting picture is just as large but shows less of the picture. + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +\stopsection + +\startsection[title={Some extensions}] + +We will now encounter a couple of transformations that can make your life easy +when you use \METAPOST\ for making graphics like the ones demonstrated in this +document. These transformations are not part of standard \METAPOST, but come with +\METAFUN. + +A very handy extension is \type {enlarged}. Although you can feed it with any +path, it will return a rectangle larger or smaller than the boundingbox of that +path. You can specify a pair or a numeric. + +\startbuffer +path p ; p := fullsquare scaled 2cm ; +drawpath p ; drawpoints p ; +p := (p shifted (3cm,0)) enlarged (.5cm,.25cm) ; +drawpath p ; drawpoints p ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] \processMPbuffer \stoplinecorrection + +There are a few more alternatives, like \type {bottomenlarged}, \type +{rightenlarged}, \type {topenlarged} and \type {leftenlarged}. + +The \type {cornered} operator will replace sharp corners by rounded ones (we +could not use \type {rounded} because this is already in use). + +\startbuffer +path p ; p := ((1,0)--(2,0)--(2,2)--(1,2)--(0,1)--cycle) + xysized (4cm,2cm) ; +drawpath p ; drawpoints p ; +p := (p shifted (5cm,0)) cornered .5cm ; +drawpath p ; drawpoints p ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] \processMPbuffer \stoplinecorrection + +The \type {smoothed} operation is a less subtle one, since it operates on the +bounding box and thereby can result in a different shape. + +\startbuffer +path p ; p := ((1,0)--(2,0)--(2,2)--cycle) xysized (4cm,2cm) ; +drawpath p ; drawpoints p ; +p := (p shifted (5cm,0)) smoothed .5cm ; +drawpath p ; drawpoints p ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] \processMPbuffer \stoplinecorrection + +The next one, \type {simplified}, can be applied to paths that are constructed +automatically. Instead of testing for duplicate points during construction, you +can clean up the path afterwards. + +\startbuffer +path p ; p := + ((0,0)--(1,0)--(2,0)--(2,1)--(2,2)--(1,2)--(0,2)--(0,1)--cycle) + xysized (4cm,2cm) ; +drawpath p ; drawpoints p ; +p := simplified (p shifted (5cm,0)) ; +drawpath p ; drawpoints p ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] \processMPbuffer \stoplinecorrection + +A cousin of the previous operation is \type {unspiked}. This one removes ugly +left|-|overs. It works well for the average case. + +\startbuffer +path p ; p := + ((0,0)--(2,0)--(3,1)--(2,0)--(2,2)--(1,2)--(1,3)--(1,2)--(0,1)--cycle) + xysized (4cm,2cm) ; +drawpath p ; drawpoints p ; +p := unspiked (p shifted (5cm,0)) ; +drawpath p ; drawpoints p ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] \processMPbuffer \stoplinecorrection + +There are a couple of operations that manipulate the path in more drastic ways. +Take \type {randomized}. + +\startbuffer +path p ; p := fullsquare scaled 2cm ; +drawpath p ; drawpoints p ; +p := (p shifted (5cm,0)) randomized .5cm ; +drawpath p ; drawpoints p ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] \processMPbuffer \stoplinecorrection + +Or how about \type {squeezed}: + +\startbuffer +path p ; p := fullsquare scaled 2cm randomized .5cm ; +drawpath p ; drawpoints p ; +p := (p shifted (5cm,0)) squeezed .5cm ; +drawpath p ; drawpoints p ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] \processMPbuffer \stoplinecorrection + +A \type {punked} path is, like a punked font, a font with less smooth curves (in +our case, only straight lines). + +\startbuffer +path p ; p := fullcircle scaled 2cm randomized .5cm ; +drawpath p ; drawpoints p ; +p := punked (p shifted (5cm,0)) ; +drawpath p ; drawpoints p ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] \processMPbuffer \stoplinecorrection + +A \type {curved} path on the other hand has smooth connections. Where in many +cases a punked path becomes smaller, a curved path will be larger. + +\startbuffer +path p ; p := fullsquare scaled 2cm randomized .5cm ; +drawpath p ; drawpoints p ; +p := curved (p shifted (5cm,0)) ; +drawpath p ; drawpoints p ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] \processMPbuffer \stoplinecorrection + +Probably less usefull (although we use it in one of the \OPENTYPE\ visualizers) +is \type {laddered}: + +\startbuffer +path p ; p := fullcircle scaled 3cm ; +drawpath p ; drawpoints p ; +p := laddered (p shifted (5cm,0)) ; +drawpath p ; drawpoints p ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] \processMPbuffer \stoplinecorrection + +When writing \PPCHTEX\ (that can be used to draw chemical structure formulas) I +needed a parallelizing macro, so here it is: + +\startbuffer +path p ; p := fullcircle scaled 3cm ; +drawpath p ; drawpoints p ; +p := p paralleled 1cm ; +drawpath p ; drawpoints p ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] \processMPbuffer \stoplinecorrection + +If you use a negative argument (like \type {-1cm}) the parallel line will be +drawn at the other side. + +The \type {blownup} operation scales the path but keeps the center in the same +place. + +\startbuffer +path p ; p := fullsquare xyscaled (4cm,1cm) randomized .5cm ; +drawpath p ; drawpoints p ; +p := p blownup .5cm ; +drawpath p ; drawpoints p ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] \processMPbuffer \stoplinecorrection + +The \type {shortened} operation also scales the path but only makes it longer or +shorter. This macro only works on straight paths. + +\startbuffer +path p ; p := (0,0) -- (2cm,3cm) ; +drawpath p ; drawpoints p ; +p := p shortened 1cm ; +drawpath p ; drawpoints p ; +p := p shortened -1cm ; +drawpath p ; drawpoints p ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] \processMPbuffer \stoplinecorrection + +Here are a few more drawing helpers. Even if you don't need them you might at +some point take a look at their definitions to see what happens there. First we +give a square round corners with \type {roundedsquare}: + +\startbuffer +path p ; p := roundedsquare(2cm,4cm,.25cm) ; +drawpath p ; drawpoints p ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] \processMPbuffer \stoplinecorrection + +Next we draw a square|-|like circle (or circle|-|like square) using \type +{tensecircle}: + +\startbuffer +path p ; p := tensecircle(2cm,4cm,.25cm) ; +drawpath p ; drawpoints p ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] \processMPbuffer \stoplinecorrection + +Often I make such helpers in the process of writing larger drawing systems. Take +\type {crossed}: + +\startbuffer +path p ; p := origin crossed 1cm ; +drawpath p ; drawpoints p ; +p := (origin crossed fullcircle scaled 2cm crossed .5cm) shifted (3cm,0) ; +drawpath p ; drawpoints p ; +\stopbuffer + +\typebuffer + +These examples demonstrate that a path is made up out of points (something that +you probably already knew by now). The \METAPOST\ operator \type {of} can be used +to \quote {access} a certain point at a curve. + +\startbuffer +path p ; p := fullsquare xyscaled (3cm,2cm) randomized .5cm ; +drawpath p ; drawpoints p ; drawpointlabels p ; +draw point 2.25 of p withpen pencircle scaled 5mm withcolor .625red ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] \processMPbuffer \stoplinecorrection + +To this we add two more operators: \type {on} and \type {along}. With \type {on} +you get the point at the supplied distance from point~0; with \type {along} you +get the point at the fraction of the length of the path. + +\startbuffer +path p, q, r ; +p := fullsquare xyscaled (2cm,2cm) randomized .5cm ; +q := p shifted (3cm,0) ; r := q shifted (3cm,0) ; +drawpath p ; drawpoints p ; drawpointlabels p ; +drawpath q ; drawpoints q ; drawpointlabels q ; +drawpath r ; drawpoints r ; drawpointlabels r ; +pickup pencircle scaled 5mm ; +draw point 2.25 of p withcolor .625red ; +draw point 2.50cm on q withcolor .625yellow ; +draw point .45 along r withcolor .625white ; +\stopbuffer + +\typebuffer + +Beware: the \type {length} of a path is the number of points minus one. The +shapes below are constructed from 5~points and a length of~4. If you want the +length as dimension, you should use \type {arclength}. + +\startlinecorrection[blank] \processMPbuffer \stoplinecorrection + +We will now play a bit with simple lines. With \type {cutends}, you can (indeed) +cut off the ends of a curve. The specification is a dimension. + +\startbuffer +path p ; p := (0cm,0cm) -- (4cm,1cm) ; +path q ; q := (5cm,0cm){right} .. (9cm,1cm) ; +drawpath p ; drawpoints p ; drawpath q ; drawpoints q ; +p := p cutends .5cm ; q := q cutends .5cm ; +drawpathoptions (withpen pencircle scaled 5pt withcolor .625yellow) ; +drawpointoptions(withpen pencircle scaled 4pt withcolor .625red) ; +drawpath p ; drawpoints p ; drawpath q ; drawpoints q ; +resetdrawoptions ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] \processMPbuffer \stoplinecorrection + +As with more operators, \type {cutends} accepts a numeric or a pair. Watch the +subtle difference between the next and the previous use of \type {cutends}. + +\startbuffer +path p ; p := (0cm,0) .. (4cm,0) .. (8cm,0) .. (4cm,0) .. cycle ; +drawpath p ; drawpoints p ; p := p cutends (2cm,1cm) ; +drawpathoptions (withpen pencircle scaled 5pt withcolor .625yellow) ; +drawpointoptions(withpen pencircle scaled 4pt withcolor .625red) ; +drawpath p ; drawpoints p ; +resetdrawoptions ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] \processMPbuffer \stoplinecorrection + +When \type {stretched} is applied to a path, it is scaled but the starting point +(point~0) keeps its location. The specification is a scale. + +\startbuffer +path p ; p := (0cm,0) .. (3cm,1cm) .. (4cm,0) .. (5cm,1cm) ; +drawpath p ; drawpoints p ; p := p stretched 1.1 ; +drawpathoptions (withpen pencircle scaled 2.5pt withcolor .625yellow) ; +drawpointoptions(withpen pencircle scaled 4.0pt withcolor .625red) ; +drawpath p ; drawpoints p ; resetdrawoptions ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] \processMPbuffer \stoplinecorrection + +We can scale in two directions independently or even in one direction by +providing a zero value. In the next example we apply the stretch two times. + +\startbuffer +path p ; p := (0cm,0) .. (3cm,1cm) .. (4cm,0) .. (5cm,1cm) ; +drawpath p ; drawpoints p ; p := p stretched (.75,1.25) ; +drawpathoptions (withpen pencircle scaled 2.5pt withcolor .625yellow) ; +drawpointoptions(withpen pencircle scaled 4.0pt withcolor .625red) ; +drawpath p ; drawpoints p ; p := p stretched (0,1.5) ; +drawpathoptions (withpen pencircle scaled 4.0pt withcolor .625red) ; +drawpointoptions(withpen pencircle scaled 2.5pt withcolor .625yellow) ; +drawpath p ; drawpoints p ; resetdrawoptions ; +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] \processMPbuffer \stoplinecorrection + +We already met the \type {randomize} operator. This one is the chameleon under +the operators. + +\startbuffer +draw fullsquare xyscaled (4cm,2cm) + randomized .25cm + shifted origin randomized (1cm, 2cm) + withcolor red randomized (.625, .850) + withpen pencircle scaled (5pt randomized 1pt) ; +\stopbuffer + +\typebuffer + +So, \type {randomized} can handle a numeric, pair, path and color, and its +specification can be a numeric, pair or color, depending on what we're dealing +with. + +\startlinecorrection[blank] \processMPbuffer \stoplinecorrection + +In the previous example we also see \type {xyscaled} in action. Opposite to \type +{scaled}, \type {xscaled} and \type {yscaled}, this is not one of \METAPOST\ +build in features. The same is true for the \type {.sized} operators. + +\startbuffer[a] +picture p ; p := image + ( draw fullsquare + xyscaled (300,800) + withpen pencircle scaled 50 + withcolor .625 yellow ; ) ; +draw p xysized (3cm,2cm) shifted (bbwidth(currentpicture)+.5cm,0) ; +draw p xysized 2cm shifted (bbwidth(currentpicture)+.5cm,0) ; +draw p xsized 1cm shifted (bbwidth(currentpicture)+.5cm,0) ; +draw p ysized 2cm shifted (bbwidth(currentpicture)+.5cm,0) ; +\stopbuffer + +\typebuffer[a] + +\startlinecorrection[blank] \processMPbuffer[a] \stoplinecorrection + +Here, the \type {image} macro creates an (actually rather large) picture. The +last four lines actually draw this picture, but at the given dimensions. Watch +how the line width scales accordingly. If you don't want this, you can add the +following line: + +\startbuffer[b] +redraw currentpicture withpen pencircle scaled 2pt ; +draw boundingbox currenpicture withpen pencircle scaled .5mm ; +\stopbuffer + +\typebuffer[b] + +Watch how the boundingbox is not affected: + +\startlinecorrection[blank] \processMPbuffer[a,b] \stoplinecorrection + +In this example we also used \type {bbwidth} (which has a companion macro \type +{bbheight}). You can apply this macro to a path or a picture. + +In fact you don't always need to follow this complex route if you want to simply +redraw a path with another pen or color. + +\startbuffer +draw fullcircle scaled 1cm + withcolor .625red withpen pencircle scaled 1mm ; +draw currentpicture + withcolor .625yellow withpen pencircle scaled 3mm ; +draw boundingbox currentpicture + withpen pencircle scaled .5mm ; +\stopbuffer + +\typebuffer + +This is what you will get from this: + +\startlinecorrection[blank] \processMPbuffer \stoplinecorrection + +If you want to add a background color to a picture you can do that afterwards. +This can be handy when you don't know in advance what size the picture will have. + +\startbuffer +fill fullcircle scaled 1cm withcolor .625red ; +addbackground withcolor .625 yellow ; +\stopbuffer + +\typebuffer + +The background is just a filled rectangle that gets the same size as the current +picture, that is put on top of it. + +\startlinecorrection[blank] \processMPbuffer \stoplinecorrection + +\stopsection + +\startsection[title={Cutting and pasting}] + +\index{paths+cutting} +\index{cutting} + +When enhancing or building a graphic, often parts of already constructed paths +are needed. The \type {subpath}, \type {cutbefore} and \type {cutafter} operators +can be used to split paths in smaller pieces. In order to do so, we must know +where we are on the path that is involved. For this we use points on the path. +Unfortunately we can only use these points when we know where they are located. +In this section we will combine some techniques discussed in previous sections. +We will define a few macros, manipulate some paths and draw curves and points. + +\startbuffer +path p ; p := fullcircle yscaled 3cm xscaled .9TextWidth ; +drawpath p ; drawpoints p withcolor .625red ; drawpointlabels p ; +\stopbuffer + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +This circle is drawn by scaling the predefined path \type {fullcircle}. This path +is constructed using 8~points. As you can see, these points are not distributed +equally along the path. In the following graphic, the second and third point of +the curve are colored red, and point 2.5 is colored yellow. Point~0 is marked in +black. This point is positioned halfway between point~2 and~3. + +\startbuffer +path p ; p := fullcircle scaled 3cm xscaled 2 ; +pickup pencircle scaled 5mm ; autoarrows := true ; +drawarrow p withcolor .625white ; +draw point 0.0 of p ; +draw point 2.0 of p withcolor .625red ; +draw point 2.5 of p withcolor .625yellow ; +draw point 3.0 of p withcolor .625red ; +\stopbuffer + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +It is clear that, unless you know exactly how the path is constructed, other +methods should be available. A specific point on a path is accessed by \typ +{point ... of}, but the next example demonstrates two more alternatives. + +\startbuffer +path p ; p := fullcircle scaled 3cm xscaled 2 ; +pickup pencircle scaled 5mm ; +draw p withcolor .625white ; +draw point 3 of p withcolor .625red ; +draw point .6 along p withcolor .625yellow ; +draw point 3cm on p ; +\stopbuffer + +\typebuffer + +So, in addition to \type {on} to specify a point by number (in \METAPOST\ +terminology called time), we have \type {along} to specify a point as fraction of +the path, and \type {on} to specify the position in a dimension. + +\startlinecorrection[blank] +\processMPbuffer +\stoplinecorrection + +The \type {on} and \type {along} operators are macros and can be defined as: + +\starttyping +primarydef len on pat = + (arctime len of pat) of pat +enddef ; + +primarydef pct along pat = + (arctime (pct * (arclength pat)) of pat) of pat +enddef ; +\stoptyping + +These macros introduce two new primitives, \type {arctime} and \type {arclength}. +While \type {arctime} returns a number denoting the time of the point on the +path, \type {arclength} returns a dimension. + +\quotation {When mathematicians draw parametric curves, they frequently need to +indicate the direction of motion. I often have need of a little macro that will +put an arrow of requested length, anchored at a point on the curve, and bending +with the curve in the direction of motion.} + +When David Arnold asked me how this could be achieved, the fact that a length was +requested meant that the solution should be sought in using the primitives and +macros we introduced a few paragraphs before. Say that we want to call for such +an arrow as follows. + +\startbuffer[a] +path p ; p := fullcircle scaled 3cm ; +pair q ; q := point .4 along p ; +pickup pencircle scaled 2mm ; +draw p withcolor .625white ; +drawarrow somearrow(p,q,2cm) withcolor .625red ; +draw q withcolor .625yellow ; +\stopbuffer + +\typebuffer[a] + +Because we want to follow the path, we need to construct the arrow from this +path. Therefore, we first reduce the path by cutting off the part before the +given point. Next we cut off the end of the resulting path so that we keep a +slice that has the length that was asked for. Since we can only cut at points, we +determine this point using the \type {arctime} primitive. + +\startbuffer[b] +vardef somearrow (expr pat, loc, len) = + save p ; path p ; p := pat cutbefore loc ; + (p cutafter point (arctime len of p) of p) +enddef ; +\stopbuffer + +\typebuffer[b] + +By using a \type {vardef} we hide the intermediate assignments. Such \type +{vardef} is automatically surrounded by \type {begingroup} and \type {endgroup}, +so the \type {save} is local to this macro. When processed, this code produces +the following graphic: + +\startbuffer[c] +autoarrows := true ; +\stopbuffer + +\startlinecorrection[blank] +\processMPbuffer[c,b,a] +\stoplinecorrection + +This graphic shows that we need a bit more control over the exact position of the +arrow. It would be nice if we could start the arrow at the point, or end there, +or center the arrow around the point. Therefore, the real implementation is a bit +more advanced. + +\startbuffer +vardef pointarrow (expr pat, loc, len, off) = + save l, r, s, t ; path l, r ; numeric s ; pair t ; + t := if pair loc : loc else : point loc along pat fi ; + s := len/2 - off ; if s<=0 : s := 0 elseif s>len : s := len fi ; + r := pat cutbefore t ; + r := (r cutafter point (arctime s of r) of r) ; + s := len/2 + off ; if s<=0 : s := 0 elseif s>len : s := len fi ; + l := reverse (pat cutafter t) ; + l := (reverse (l cutafter point (arctime s of l) of l)) ; + (l..r) +enddef ; +\stopbuffer + +\typebuffer + +This code fragment also demonstrates how we can treat the \type {loc} argument as +pair (coordinates) or fraction of the path. We calculate the piece of path before +and after the given point separately and paste them afterwards as \type {(l..r)}. +By adding braces we can manipulate the path in expressions without the danger of +handling \type {r} alone. + +We can now implement left, center and right arrows by providing this macro the +right parameters. The offset (the fourth parameter), is responsible for a +backward displacement. This may seem strange, but negative values would be even +more confusing. + +\startbuffer +def rightarrow (expr p,t,l) = pointarrow(p,t,l,-l) enddef ; +def leftarrow (expr p,t,l) = pointarrow(p,t,l,+l) enddef ; +def centerarrow(expr p,t,l) = pointarrow(p,t,l, 0) enddef ; +\stopbuffer + +\typebuffer + +We can now apply this macro as follows: + +\startbuffer[a] +path p ; p := fullcircle scaled 3cm ; +pickup pencircle scaled 2mm ; +draw p withcolor .625white ; +drawarrow leftarrow (p, .4 ,2cm) withcolor .625red ; +drawarrow centerarrow(p,point 5 of p,2cm) withcolor .625yellow ; +draw point .4 along p withcolor .625yellow ; +draw point 5 of p withcolor .625red ; +\stopbuffer + +\typebuffer[a] + +\startlinecorrection[blank] +\processMPbuffer[a] +\stoplinecorrection + +Watch how we can pass a point (\typ {point 5 of p}) as well as a fraction (\type +{.4}). The following graphic demonstrates a few more alternatives. + +\startbuffer[a] +pickup pencircle scaled 2mm; autoarrows := true ; + +path p ; p := fullcircle yscaled 3cm xscaled .9TextWidth ; + +draw p withcolor .5white; + +for i=1, 2, 3 : + drawdot point i of p withpen pencircle scaled 5mm withcolor .625white ; +endfor ; +for i=.60, .75, .90 : + drawdot point i along p withpen pencircle scaled 5mm withcolor .625white ; +endfor ; +\stopbuffer + +\startbuffer[b] +drawarrow leftarrow (p,point 1 of p,2cm) withcolor red ; +drawarrow centerarrow (p,point 2 of p,2cm) withcolor blue ; +drawarrow rightarrow (p,point 3 of p,2cm) withcolor green ; +drawarrow pointarrow (p,.60,4cm,+.5cm) withcolor yellow ; +drawarrow pointarrow (p,.75,3cm,-.5cm) withcolor cyan ; +drawarrow centerarrow (p,.90,3cm) withcolor magenta ; +\stopbuffer + +\startlinecorrection[blank] +\processMPbuffer[a,b] +\stoplinecorrection + +The arrows are drawn using the previously defined macros. Watch the positive and +negative offsets in call to \type {pointarrow}. + +\typebuffer[b] + +\stopsection + +\startsection[title={Current picture}] + +\index {pictures} + +When you draw paths, texts and|/|or pictures they are added to the so called +current picture. You can manipulate this current picture as is demonstrated in +this manual. Let's show a few current picture related tricks. + +\startbuffer + draw fullcircle scaled 1cm withpen pencircle scaled 1mm withcolor .625red ; +\stopbuffer + +\typebuffer \startlinecorrection[blank] \processMPbuffer \stoplinecorrection + +We can manipulate the picture as a whole: + +\startbuffer + draw fullcircle scaled 1cm withpen pencircle scaled 1mm withcolor .625red ; + currentpicture := currentpicture slanted .5 ; +\stopbuffer + +\typebuffer \startlinecorrection[blank] \processMPbuffer \stoplinecorrection + +Sometimes it's handy to temporarily set aside the current picture. + +\startbuffer + draw fullcircle scaled 1cm withpen pencircle scaled 1mm withcolor .625red ; + currentpicture := currentpicture slanted .5 ; + pushcurrentpicture ; + draw fullcircle scaled 1cm withpen pencircle scaled 1mm withcolor .625yellow ; + currentpicture := currentpicture slanted -.5 ; + popcurrentpicture ; +\stopbuffer + +\typebuffer \startlinecorrection[blank] \processMPbuffer \stoplinecorrection + +These are \METAFUN\ commands but \METAPOST\ itself comes with a variant, \type +{image}, and you explicitly have to draw this picture (or otherwise add it to the +currentpicture). + +\startbuffer + draw fullcircle scaled 1cm withpen pencircle scaled 1mm withcolor .625red ; + currentpicture := currentpicture slanted .5 ; + draw image ( + draw fullcircle scaled 1cm + withpen pencircle scaled 1mm withcolor .625yellow ; + currentpicture := currentpicture slanted -.5 ; + ) ; +\stopbuffer + +\typebuffer \startlinecorrection[blank] \processMPbuffer \stoplinecorrection + +Each graphic starts fresh with an empty current picture. In \METAFUN\ we make +sure that we also reset some otherwise global variables, like color, pen and some +line properties. + +\stopsection + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/metafun/metafun.tex b/doc/context/sources/general/manuals/metafun/metafun.tex new file mode 100644 index 000000000..dc90bb611 --- /dev/null +++ b/doc/context/sources/general/manuals/metafun/metafun.tex @@ -0,0 +1,108 @@ +% language=uk macros=mkvi + +% author : Hans Hagen +% copyright : PRAGMA ADE & ConTeXt Development Team +% license : Creative Commons Attribution ShareAlike 4.0 International +% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions +% origin : the ConTeXt distribution +% +% comment : Because this manual is distributed with TeX distributions it comes with a rather +% liberal license. We try to adapt these documents to upgrades in the (sub)systems +% that they describe. Using parts of the content otherwise can therefore conflict +% with existing functionality and we cannot be held responsible for that. Many of +% the manuals contain characteristic graphics and personal notes or examples that +% make no sense when used out-of-context. +% +% comment : Some chapters might have been published in TugBoat, the NTG Maps, the ConTeXt +% Group journal or otherwise. Thanks to the editors for corrections. Also thanks +% to users for testing, feedback and corrections. +% +% comment : This manual was originally written for MkII and as a consequence many examples +% are coded in a bit different way than we would nowadays do in MkIV. But, as we +% try to be downward compatible, it doesn't hurt. +% +% comment : I also use this manual for benchmarking ConTeXt MkIV. On my current machine (a +% 2013 dell i7 laptop) one run takes some 18.1 seconds for LuaTeX and around 14.2 +% seconds for LuajitTeX which is quite okay given the amount of graphics (428 +% pages). +% +% comment : This is one of the manuals that can be ordered at http://www.h2o-books.com and +% it's actually meant to be read on paper. + +\enabledirectives[hyphenator.optimize] +\enabledirectives[hyphenator.flatten] +% \setuphyphenation[method=traditional] + +% \enabletrackers[*defin*] + +% \enablemode[screen] +\enablemode[print] +% \enablemode[book] + +% \usemodule[luacalls] + +% todo: check startintro .. stopintro each chapter + +% \showframe + +\startproduct metafun + +\environment metafun-environment + +\startnotmode[screen] + \component metafun-titlepage-paper + \component metafun-colofon-paper +\stopnotmode + +\startmode[screen] + \environment metafun-environment-screen + \component metafun-titlepage-screen +\stopmode + +\startfrontmatter + \component metafun-introduction + \component metafun-contents + \component metafun-conventions +\stopfrontmatter + +\startbodymatter + \component metafun-welcome + \component metafun-basics + \component metafun-embedding + \component metafun-layout + \component metafun-positioning + \component metafun-backgrounds + \component metafun-gadgets + \component metafun-effects + \component metafun-functions + \component metafun-text + \component metafun-debugging + \component metafun-styles + \component metafun-examples + \component metafun-macros + \component metafun-lua + %component metafun-graphics + \component metafun-sneaky +\stopbodymatter + +\startappendices + % \component metafun-programs + \component metafun-syntax + \component metafun-document + \component metafun-reference + % \component metafun-literature +\stopappendices + +\startbackmatter + \component metafun-index +\stopbackmatter + +\startmode[screen] + \component metafun-colofon-screen +\stopmode + +\startnotmode[screen] + \component metafun-backpage +\stopnotmode + +\stopproduct diff --git a/doc/context/sources/general/manuals/metafun/mfun-700.tex b/doc/context/sources/general/manuals/metafun/mfun-700.tex new file mode 100644 index 000000000..e393a34f3 --- /dev/null +++ b/doc/context/sources/general/manuals/metafun/mfun-700.tex @@ -0,0 +1,17 @@ +% language=uk +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\starttext + +\TitlePage + {A Few Nice Quotes\\ + A Simple Style Demo\\ + Hans Hagen, August 2000} + +\Topic {Douglas R. Hofstadter} \input douglas \page +\Topic {Donald E. Knuth} \input knuth \page +\Topic {Edward R. Tufte} \input tufte \page +\Topic {Hermann Zapf} \input zapf \page + +\stoptext diff --git a/doc/context/sources/general/manuals/metafun/mfun-771.tex b/doc/context/sources/general/manuals/metafun/mfun-771.tex new file mode 100644 index 000000000..460c16f2a --- /dev/null +++ b/doc/context/sources/general/manuals/metafun/mfun-771.tex @@ -0,0 +1,9 @@ +% language=uk +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\usemodule[present-organic] + +\setupMPvariables[page][alternative=1] + +\input mfun-700 diff --git a/doc/context/sources/general/manuals/metafun/mfun-772.tex b/doc/context/sources/general/manuals/metafun/mfun-772.tex new file mode 100644 index 000000000..99dec1551 --- /dev/null +++ b/doc/context/sources/general/manuals/metafun/mfun-772.tex @@ -0,0 +1,9 @@ +% language=uk +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\usemodule[present-organic] + +\setupMPvariables[page][alternative=2] + +\input mfun-700 diff --git a/doc/context/sources/general/manuals/metafun/mfun-773.tex b/doc/context/sources/general/manuals/metafun/mfun-773.tex new file mode 100644 index 000000000..daefcfe66 --- /dev/null +++ b/doc/context/sources/general/manuals/metafun/mfun-773.tex @@ -0,0 +1,9 @@ +% language=uk +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\usemodule[present-organic] + +\setupMPvariables[page][alternative=3] + +\input mfun-700 diff --git a/doc/context/sources/general/manuals/metafun/mfun-774.tex b/doc/context/sources/general/manuals/metafun/mfun-774.tex new file mode 100644 index 000000000..725d1199b --- /dev/null +++ b/doc/context/sources/general/manuals/metafun/mfun-774.tex @@ -0,0 +1,103 @@ +% language=uk +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\usemodule[present-organic] + +\setupMPvariables[page][alternative=1] + +\startuseMPgraphic{page} + + \includeMPgraphic{rightsuperbutton} + + StartPage ; + + path p, q ; + + p := Field[Text][Text] enlarged 36pt superellipsed .90 ; + + fill Page + withcolor \MPcolor{yellow} ; + fill p + withcolor \MPcolor{white} ; + draw p + dashed dashpattern (on 9pt off 9pt) + withpen pencircle scaled 3pt + withcolor \MPcolor{red} ; + + p := Field[Text][Text] enlarged 48pt superellipsed .90 ; + + draw p + dashed dashpattern (on 9pt off 9pt) + withpen pencircle scaled 1.5pt ; + + def right_menu_button (expr nn, rr, pp, xx, yy, ww, hh, dd) = + if (pp>0) and (rr>0) : + q := rightsuperbutton(p,xx,yy,RightEdgeWidth,hh) ; + fill q + withcolor \MPcolor{white} ; + draw ptop + withpen pencircle scaled 1.5pt ; + draw pbot + withpen pencircle scaled 1.5pt ; + draw q + dashed dashpattern (on 9pt off 9pt) + withpen pencircle scaled 3pt + withcolor if rr=2 : \MPcolor{gray} else : \MPcolor{red} fi ; + fi ; + enddef ; + + \MPmenubuttons{right} + + StopPage ; +\stopuseMPgraphic + +\startuseMPgraphic{rightsuperbutton} + +vardef rightsuperbutton (expr pat, xpos, ypos, wid, hei) = + + save p, t, b, edge, shift, width, height ; + path p, ptop, pbot ; pair t, b ; numeric edge, shift, width, height ; + + edge := xpos + wid ; shift := ypos + hei ; + + p := rightpath pat ; + +draw p withpen pencircle scaled 1.5pt ; + + ptop := ((-infinity,shift)--(edge,shift)) ; + pbot := ((-infinity,shift-hei)--(edge,shift-hei)) ; + + t := p intersectionpoint ptop ; + b := p intersectionpoint pbot ; + + label.llft("t",t) ; + label.ulft("b",b) ; + + p := subpath(0,xpart (p intersectiontimes ptop)) of p ; + p := subpath(xpart (p intersectiontimes pbot),length(p)) of p ; + + (p -- t -- point 1 of ptop & + point 1 of ptop -- point 1 of pbot & + point 1 of pbot -- b + -- cycle) + +enddef ; + +\stopuseMPgraphic + + + +\starttext + +\TitlePage + {A Few Nice Quotes\\ + A Simple Style Demo\\ + Hans Hagen, August 2000} + +\Topic {Douglas R. Hofstadter} \input douglas \page +\Topic {Donald E. Knuth} \input knuth \page +\Topic {Edward R. Tufte} \input tufte \page +\Topic {Hermann Zapf} \input zapf \page + +\stoptext diff --git a/doc/context/sources/general/manuals/metafun/mfun-775.tex b/doc/context/sources/general/manuals/metafun/mfun-775.tex new file mode 100644 index 000000000..e9d2b85a7 --- /dev/null +++ b/doc/context/sources/general/manuals/metafun/mfun-775.tex @@ -0,0 +1,9 @@ +% language=uk +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\usemodule[present-organic] + +\setupMPvariables[page][alternative=11] + +\input mfun-700 diff --git a/doc/context/sources/general/manuals/metafun/mfun-776.tex b/doc/context/sources/general/manuals/metafun/mfun-776.tex new file mode 100644 index 000000000..82b5c18dd --- /dev/null +++ b/doc/context/sources/general/manuals/metafun/mfun-776.tex @@ -0,0 +1,9 @@ +% language=uk +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\usemodule[present-organic] + +\setupMPvariables[page][alternative=12] + +\input mfun-700 diff --git a/doc/context/sources/general/manuals/metafun/mfun-800.tex b/doc/context/sources/general/manuals/metafun/mfun-800.tex new file mode 100644 index 000000000..aa0c1260f --- /dev/null +++ b/doc/context/sources/general/manuals/metafun/mfun-800.tex @@ -0,0 +1,27 @@ +% language=uk +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\setupMPpage + [offset=1pt, + background=color, + backgroundcolor=gray] + +\definecolor [gray] [s=.625] +\definecolor [red] [r=.625] +\definecolor [yellow] [r=.625,g=.625] + +\startuseMPgraphic{test} + fill fullsquare rotated 45 scaled 4cm + withcolor \MPcolor{yellow} ; +\stopuseMPgraphic + +\starttext + +\startMPpage + \includeMPgraphic{test} + fill fullcircle scaled 3cm + withcolor \MPcolor{red} ; +\stopMPpage + +\stoptext diff --git a/doc/context/sources/general/manuals/metafun/mfun-900.tex b/doc/context/sources/general/manuals/metafun/mfun-900.tex new file mode 100644 index 000000000..c295ec908 --- /dev/null +++ b/doc/context/sources/general/manuals/metafun/mfun-900.tex @@ -0,0 +1,48 @@ +% language=uk +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\startcomponent mfun-900 + +\environment metafun-environment + +% Page 1 + +\getbuffer[pagetext] + +% Page 2/3 + +\getbuffer[back-0,back-1,pagetext] +\getbuffer[back-0,back-1,pagetext] + +\setupbackgrounds[page][background=] + +% Page 4/5 + +\getbuffer[back-0,back-2,pagetext] +\getbuffer[back-0,back-2,pagetext] + +\setupbackgrounds[page][background=] + +% Page 6/7 + +\getbuffer[back-0,back-3,pagetext] +\getbuffer[back-0,back-3,pagetext] + +\setupbackgrounds[page][background=] + +% Page 8/9 + +\getbuffer[back-0,back-4,pagetext] +\getbuffer[back-0,back-4,pagetext] + +\setupbackgrounds[page][background=] + +% Page 10/11 + +\getbuffer[back-0,back-5,pagetext] +\getbuffer[back-0,back-5,pagetext] + +\setupbackgrounds[page][background=] + +\stopcomponent diff --git a/doc/context/sources/general/manuals/metafun/mfun-901.tex b/doc/context/sources/general/manuals/metafun/mfun-901.tex new file mode 100644 index 000000000..23adf77b4 --- /dev/null +++ b/doc/context/sources/general/manuals/metafun/mfun-901.tex @@ -0,0 +1,11 @@ +% language=uk +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\startcomponent mfun-901 + +\environment metafun-environment + +\getbuffer[gridpage] + +\stopcomponent diff --git a/doc/context/sources/general/manuals/metafun/mfun-902.tex b/doc/context/sources/general/manuals/metafun/mfun-902.tex new file mode 100644 index 000000000..7c4fed73e --- /dev/null +++ b/doc/context/sources/general/manuals/metafun/mfun-902.tex @@ -0,0 +1,11 @@ +% language=uk +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\startcomponent mfun-902 + +\environment metafun-environment + +\getbuffer[handwrit] + +\stopcomponent diff --git a/doc/context/sources/general/manuals/metafun/mfun-mrun-demo.mp b/doc/context/sources/general/manuals/metafun/mfun-mrun-demo.mp new file mode 100644 index 000000000..c6589beb5 --- /dev/null +++ b/doc/context/sources/general/manuals/metafun/mfun-mrun-demo.mp @@ -0,0 +1,212 @@ +%D Downloading + +beginfig (1) ; + + path p, q ; + + p := (0,110)..(50,110) shifted (0,-15)..(100,110)-- + (50,50) shifted (10,0) ..(50,50) shifted (0,2.5).. + (50,50) shifted(-10,0)--cycle ; + q := (5,0)--(95,0)--(95,30)..(50,0) shifted (0,10)..(5,30)--cycle ; + + pickup pencircle scaled 15 ; + drawdot (80,100) withcolor .6red ; + drawdot (65,95) withcolor .6red ; + drawdot (50,95) withcolor .6red ; + drawdot (35,95) withcolor .6red ; + + drawdot (50,60) withcolor .6red ; + drawdot (50,35) withcolor .6red ; + drawdot (50,10) withcolor .6red ; + drawdot (70,10) withcolor .6red ; + drawdot (32.5,10) withcolor .6red ; + + pickup pencircle scaled 5 ; + fill p withcolor .6green ; draw p withcolor .4green ; + fill q withcolor .6green ; draw q withcolor .4green ; + + bboxmargin := 2.5 ; p := bbox currentpicture ; + picture s ; s := currentpicture ; currentpicture := nullpicture ; + + pickup pencircle scaled 2.5 ; + fill p withcolor .4blue ; + addto currentpicture also s ; + +endfig ; + +%D WWW Links + +beginfig (2) ; + + boolean angles [], lengths[], colors [][][] ; + numeric a, l, r, g, b, n ; + path p ; + color c ; + + draw fullsquare scaled 150 withpen pencircle scaled 1 withcolor .5white ; + + n := 0 ; + forever : + a := 6 * round(uniformdeviate 60) ; + l := 40 + round(uniformdeviate 60) ; + r := 2 + round(uniformdeviate 6) ; + g := 2 + round(uniformdeviate 6) ; + b := 2 + round(uniformdeviate 6) ; + if (a>0) and not known angles [a] and not known lengths[l] and not known colors [r][g][b] : + n := n + 1 ; + angles [a] := true ; + lengths[l] := true ; + colors [r][g][b] := true ; + p := (origin--origin shifted (0,.5l)) rotatedaround(origin,a) ; + draw p withpen pencircle scaled 2 withcolor (r/10,g/10,b/10) ; + drawdot point 1 of p withpen pencircle scaled 4 withcolor (r/10,g/10,b/10) ; + p := (origin shifted (0,.5l+8)--origin shifted(0,100)) rotatedaround(origin,a) ; + draw p withpen pencircle scaled 2 withcolor (r/10,g/10,b/10) ; + drawdot point 0 of p withpen pencircle scaled 4 withcolor (r/10,g/10,b/10) ; + fi ; + exitif n >= 60 ; + endfor ; + + drawdot + origin + withpen pencircle scaled 10 + withcolor white ; + + fill + ((fullcircle scaled 130) peepholed (fullsquare scaled 150)) + withcolor (1,1,1)-(1,.62,.06); + + clip currentpicture to fullsquare scaled 130 ; + +endfig ; + +%D Mirrors + +beginfig(3) + + path a, b, p, q ; + pair s, t, u, v ; + color c ; + numeric h, w, r ; + + pickup pencircle scaled 10 ; + + h := 120 ; + w := 80 ; + r := 30 ; + + a := (0,0)..(0,.5h) shifted (-r,0)..(0,h) ; + b := (w,0)..(w,.5h) shifted ( r,0)..(w,h) ; + + draw a withcolor .4white; + draw b withcolor .4white; + + def moved (expr i) = + ((i) - 10 + uniformdeviate 20) + enddef ; + + for i=5 step 10 until h-5 : + s := (point (length(a)*(i/h)) of a) ; + t := (point (length(b)*(1-i/h)) of b) ; + u := (s--t) intersectionpoint ((.25w,0)--(.25w,h)) ; + v := (s--t) intersectionpoint ((.75w,0)--(.75w,h)) ; + p := s..(xpart u,moved(ypart u))..(xpart v,moved(ypart v))..t ; + c := (0,.4+uniformdeviate.55,0) ; + l := length(p) ; + l := .25l+uniformdeviate.5l ; + q := p cutafter point l of p ; + pickup pencircle scaled 2.5 ; + draw p withcolor c ; + pickup pencircle scaled 5 ; + drawdot point 0 of p withcolor c ; + drawdot point infinity of p withcolor c ; + endfor ; + + picture s ; s := currentpicture ; currentpicture := nullpicture ; + + bboxmargin := 2.5 ; fill bbox s withcolor .85white ; + + addto currentpicture also s ; + +endfig; + +%D Team + +def dpuppet (expr v, w) = + v - .5w + uniformdeviate w +enddef ; + +def somepuppet (expr s, r) = + picture p ; p := currentpicture ; currentpicture := nullpicture ; + draw ((-10,0)--(10,0)) ; + for i:=-10 step 5 until 10 : + draw ((i,0)--(dpuppet(i,2),-10)) ; + endfor ; + currentpicture := currentpicture rotated r shifted s ; + addto currentpicture also p ; +enddef ; + +def puppet (expr loc, sca, col) = + picture s ; s := currentpicture ; currentpicture := nullpicture ; + + pair a ; a := (dpuppet( 20,5),dpuppet( 0, 5)) ; + pair b ; b := (dpuppet(-20,5),dpuppet( 0, 5)) ; + pair c ; c := (dpuppet( 30,5),dpuppet(60,10)) ; + pair d ; d := (dpuppet(-30,5),dpuppet(60,10)) ; + pair e ; e := (dpuppet( 0,5),dpuppet(30,10)) ; + pair f ; f := (dpuppet( 0,5),dpuppet(50,10)) ; + pair g ; g := (dpuppet( 0,5),dpuppet(65,10)) ; + + pair f ; f := (.6+uniformdeviate.1)[e,g] ; + + drawoptions (withcolor col) ; + + somepuppet(a,dpuppet( 20,5)) ; + somepuppet(b,dpuppet( -20,5)) ; + somepuppet(c,dpuppet( 120,5)) ; + somepuppet(d,dpuppet(-120,5)) ; + + draw a -- e ; + draw b -- e ; + draw c -- f ; + draw d -- f ; + draw e -- g ; + draw fullcircle scaled 25 shifted (g shifted (0,12.5)); + + drawoptions () ; + + currentpicture := currentpicture scaled sca shifted loc ; + addto currentpicture also s ; +enddef ; + +beginfig (4) ; + + pickup pencircle scaled 0 ; + + color col ; col := (.4,.8,.6) ; + + puppet((-20, 0) ,.20, 0.700col) ; + puppet(( 10,10) ,.30, 0.750col) ; + puppet(( 30,20) ,.40, 0.800col) ; + puppet((-20,30) ,.35, 0.850col) ; + puppet(( 20,60) ,.20, 0.900col) ; + puppet(( -5,65) ,.25, 0.950col) ; + + picture s ; s := currentpicture ; currentpicture := nullpicture ; + + bboxmargin := 15 ; fill bbox s withcolor .8(1,1,0) ; + + addto currentpicture also s withpen pencircle scaled .8 ; + + path b ; bboxmargin := -10 ; b := bbox currentpicture ; + numeric len ; len := length(b) ; + numeric stp ; stp := 20 ; + drawoptions(withpen pencircle scaled .8 withcolor .7red) ; + for i=len/8stp step len/4stp until len+len/8stp : + pair ii ; ii := point (dpuppet(i,len/20stp)) of b ; + pair dd ; dd := (direction i of b) rotated (dpuppet(-90,10)) ; + draw ii shifted -.1dd withpen pencircle scaled 1.2 ; + draw ii--(ii shifted .25dd) ; + endfor ; + +endfig ; diff --git a/doc/context/sources/general/manuals/metafun/mycow.mp b/doc/context/sources/general/manuals/metafun/mycow.mp new file mode 100644 index 000000000..24c3e0f7d --- /dev/null +++ b/doc/context/sources/general/manuals/metafun/mycow.mp @@ -0,0 +1,299 @@ +% Converted from PostScript(TM) to MetaPost by pstoedit +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +% MetaPost backend contributed by Scott Pakin <pakin@uiuc.edu> +% pstoedit is Copyright (C) 1993 - 1999 Wolfgang Glunz <wglunz@geocities.com> + +% Generate structured PostScript +prologues := 1; + +% Display a given string with its *baseline* at a given location +% and with a given rotation angle +vardef showtext(expr origin)(expr angle)(expr string) = + draw string infont defaultfont scaled defaultscale + rotated angle shifted origin; +enddef; + +beginfig(1); +drawoptions (withcolor (1,1,1)); +fill (84.3799,618.55)..controls (88.3398,624.38) and (92.5898,622.94)..(96.3398,615.67) + ..controls (101.23,615.6) and (102.46,612.43)..(104.98,610.78) + ..controls (122.62,598.39) and (147.46,607.18)..(167.9,601.92) + ..controls (180.94,598.54) and (190.87,599.76)..(200.09,602.06) + ..controls (220.32,607.25) and (246.1,596.16)..(263.74,603.86) + ..controls (274.75,608.62) and (284.76,605.66)..(292.97,600.91) + ..controls (297.58,597.96) and (299.59,596.09)..(300.96,591.26) + ..controls (306.29,572.54) and (306.29,551.02)..(309.53,530.57) + ..controls (309.53,528.84) and (312.19,526.1)..(312.48,522.07) + ..controls (315.79,511.34) and (316.08,510.12)..(317.16,502.2) + ..controls (317.16,501.34) and (326.52,488.45)..(325.01,479.02) + ..controls (323.93,481.25) and (323.86,482.83)..(321.62,481.68) + ..controls (320.33,479.3) and (320.9,473.9)..(322.56,471.74) + ..controls (320.83,470.81) and (318.46,473.47)..(317.52,475.2) + ..controls (318.17,473.04) and (317.81,470.81)..(316.73,469.3) + ..controls (315.86,472.25) and (316.58,473.18)..(315.36,473.9) + ..controls (313.99,472.9) and (314.21,469.3)..(314.28,466.2) + ..controls (313.49,468.07) and (311.47,472.46)..(312.55,476.42) + ..controls (312.48,484.2) and (308.81,489.1)..(310.32,499.1) + ..controls (310.1,504.43) and (307.3,521.06)..(304.56,524.3) + ..controls (303.12,526.25) and (306.36,510.77)..(306.36,506.16) + ..controls (306.65,500.9) and (307.08,468.72)..(306.43,463.1) + ..controls (306.43,459.22) and (306.22,453.96)..(307.08,452.16) + ..controls (308.74,450.79) and (309.38,450.5)..(309.6,447.98) + ..controls (309.24,446.62) and (308.74,446.04)..(307.73,445.54) + ..controls (306.07,444.6) and (307.37,441.79)..(306.07,439.85) + ..controls (304.49,438.77) and (304.13,441.86)..(303.34,441.86) + ..controls (302.69,441) and (303.05,437.98)..(302.47,436.18) + ..controls (299.66,433.8) and (292.18,432.5)..(289.15,434.66) + ..controls (289.73,440.64) and (291.74,441.58)..(295.63,446.62) + ..controls (298.66,452.59) and (297,460.94)..(296.93,468.14) + ..controls (295.49,480.38) and (289.22,487.3)..(289.44,496.44) + ..controls (287.86,495.72) and (286.42,494.57)..(284.26,494.86) + ..controls (283.39,489.46) and (286.42,484.56)..(284.83,480.82) + ..controls (281.95,471.96) and (277.06,446.62)..(279,437.76) + ..controls (280.01,434.74) and (278.21,433.15)..(277.06,433.94) + ..controls (276.77,433.94) and (276.55,433.94)..(276.41,433.94) + ..controls (276.41,433.94) and (276.55,431.42)..(275.69,430.92) + ..controls (274.1,430.34) and (273.67,431.71)..(272.66,432.14) + ..controls (271.22,430.85) and (272.52,429.48)..(271.15,428.04) + ..controls (267.19,428.04) and (261.36,425.38)..(257.98,428.26) + ..controls (257.33,434.16) and (263.3,436.68)..(266.47,440.71) + ..controls (268.63,446.62) and (271.08,462.89)..(267.77,474.62) + ..controls (267.77,475.56) and (264.38,485.28)..(261.43,488.66) + ..controls (258.7,487.66) and (257.33,485.5)..(253.22,486.29) + ..controls (252.58,484.34) and (253.3,482.33)..(252.22,480.1) + ..controls (251.86,479.52) and (249.34,478.58)..(249.19,481.39) + ..controls (248.98,483.05) and (248.9,486.36)..(248.26,486.72) + ..controls (243.65,486.72) and (233.71,487.08)..(231.77,493.92) + ..controls (219.89,492.34) and (215.93,491.26)..(206.57,493.42) + ..controls (196.63,489.67) and (183.24,506.16)..(174.53,502.2) + ..controls (172.51,496.15) and (173.09,485.64)..(171.65,481.39) + ..controls (169.34,474.77) and (171.14,467.14)..(171.14,456.41) + ..controls (170.57,455.4) and (169.85,454.46)..(168.48,454.46) + ..controls (168.48,453.1) and (169.34,450.86)..(168.62,449.42) + ..controls (167.18,447.62) and (165.89,451.8)..(165.02,444.6) + ..controls (163.15,443.74) and (157.75,442.22)..(155.59,445.18) + ..controls (155.88,448.99) and (158.33,451.3)..(160.13,453.38) + ..controls (161.42,456.91) and (160.99,458.28)..(160.7,461.81) + ..controls (160.99,464.98) and (161.71,468.58)..(161.86,470.09) + ..controls (161.86,473.04) and (162.5,479.3)..(161.14,481.18) + --(159.41,482.69)..controls (157.18,487.22) and (158.33,494.64)..(157.61,500.26) + ..controls (155.81,500.69) and (155.81,500.98)..(154.01,498.31) + ..controls (154.01,494.42) and (153.5,486.36)..(152.35,483.84) + ..controls (149.69,479.81) and (150.84,459.65)..(151.42,448.56) + ..controls (151.78,446.47) and (149.69,447.7)..(149.76,444.74) + ..controls (150.05,442.8) and (147.89,443.59)..(146.09,444.6) + ..controls (145.15,445.18) and (146.59,439.78)..(145.37,439.56) + ..controls (142.34,438.84) and (136.87,438.19)..(135.22,440.71) + ..controls (134.57,444.6) and (137.88,448.06)..(140.62,451.01) + ..controls (143.14,455.83) and (140.9,465.7)..(140.47,476.28) + --(138.89,478.22)..controls (134.86,483.19) and (139.61,496.94)..(136.51,506.23) + ..controls (120.02,514.87) and (122.11,519.19)..(118.73,537.62) + ..controls (115.13,557.64) and (93.3799,567.65)..(79.0598,567.65) + ..controls (73.4399,563.04) and (66.24,563.62)..(58.5398,567.65) + ..controls (55.6599,569.23) and (54.4299,573.19)..(54.5,576.5) + ..controls (52.6299,580.75) and (55.22,582.19)..(59.6199,583.49) + ..controls (62.71,587.81) and (68.6199,594.65)..(69.1899,597.74) + ..controls (70.3398,601.92) and (75.5298,608.11)..(77.7598,609.77) + ..controls (75.8198,613.01) and (74.8098,615.17)..(77.1099,618.55) + ..controls (79.5598,620.14) and (81.7898,616.61)..(84.3799,618.55) + --cycle; +drawoptions (withcolor (0,0,0)); +pickup pencircle scaled 0.636492bp; +draw (84.3799,618.55)..controls (88.3398,624.38) and (92.5898,622.94)..(96.3398,615.67) + ..controls (101.23,615.6) and (102.46,612.43)..(104.98,610.78) + ..controls (122.62,598.39) and (147.46,607.18)..(167.9,601.92) + ..controls (180.94,598.54) and (190.87,599.76)..(200.09,602.06) + ..controls (220.32,607.25) and (246.1,596.16)..(263.74,603.86) + ..controls (274.75,608.62) and (284.76,605.66)..(292.97,600.91) + ..controls (297.58,597.96) and (299.59,596.09)..(300.96,591.26) + ..controls (306.29,572.54) and (306.29,551.02)..(309.53,530.57) + ..controls (309.53,528.84) and (312.19,526.1)..(312.48,522.07) + ..controls (315.79,511.34) and (316.08,510.12)..(317.16,502.2) + ..controls (317.16,501.34) and (326.52,488.45)..(325.01,479.02) + ..controls (323.93,481.25) and (323.86,482.83)..(321.62,481.68) + ..controls (320.33,479.3) and (320.9,473.9)..(322.56,471.74) + ..controls (320.83,470.81) and (318.46,473.47)..(317.52,475.2) + ..controls (318.17,473.04) and (317.81,470.81)..(316.73,469.3) + ..controls (315.86,472.25) and (316.58,473.18)..(315.36,473.9) + ..controls (313.99,472.9) and (314.21,469.3)..(314.28,466.2) + ..controls (313.49,468.07) and (311.47,472.46)..(312.55,476.42) + ..controls (312.48,484.2) and (308.81,489.1)..(310.32,499.1) + ..controls (310.1,504.43) and (307.3,521.06)..(304.56,524.3) + ..controls (303.12,526.25) and (306.36,510.77)..(306.36,506.16) + ..controls (306.65,500.9) and (307.08,468.72)..(306.43,463.1) + ..controls (306.43,459.22) and (306.22,453.96)..(307.08,452.16) + ..controls (308.74,450.79) and (309.38,450.5)..(309.6,447.98) + ..controls (309.24,446.62) and (308.74,446.04)..(307.73,445.54) + ..controls (306.07,444.6) and (307.37,441.79)..(306.07,439.85) + ..controls (304.49,438.77) and (304.13,441.86)..(303.34,441.86) + ..controls (302.69,441) and (303.05,437.98)..(302.47,436.18) + ..controls (299.66,433.8) and (292.18,432.5)..(289.15,434.66) + ..controls (289.73,440.64) and (291.74,441.58)..(295.63,446.62) + ..controls (298.66,452.59) and (297,460.94)..(296.93,468.14) + ..controls (295.49,480.38) and (289.22,487.3)..(289.44,496.44) + ..controls (287.86,495.72) and (286.42,494.57)..(284.26,494.86) + ..controls (283.39,489.46) and (286.42,484.56)..(284.83,480.82) + ..controls (281.95,471.96) and (277.06,446.62)..(279,437.76) + ..controls (280.01,434.74) and (278.21,433.15)..(277.06,433.94) + ..controls (276.77,433.94) and (276.55,433.94)..(276.41,433.94) + ..controls (276.41,433.94) and (276.55,431.42)..(275.69,430.92) + ..controls (274.1,430.34) and (273.67,431.71)..(272.66,432.14) + ..controls (271.22,430.85) and (272.52,429.48)..(271.15,428.04) + ..controls (267.19,428.04) and (261.36,425.38)..(257.98,428.26) + ..controls (257.33,434.16) and (263.3,436.68)..(266.47,440.71) + ..controls (268.63,446.62) and (271.08,462.89)..(267.77,474.62) + ..controls (267.77,475.56) and (264.38,485.28)..(261.43,488.66) + ..controls (258.7,487.66) and (257.33,485.5)..(253.22,486.29) + ..controls (252.58,484.34) and (253.3,482.33)..(252.22,480.1) + ..controls (251.86,479.52) and (249.34,478.58)..(249.19,481.39) + ..controls (248.98,483.05) and (248.9,486.36)..(248.26,486.72) + ..controls (243.65,486.72) and (233.71,487.08)..(231.77,493.92) + ..controls (219.89,492.34) and (215.93,491.26)..(206.57,493.42) + ..controls (196.63,489.67) and (183.24,506.16)..(174.53,502.2) + ..controls (172.51,496.15) and (173.09,485.64)..(171.65,481.39) + ..controls (169.34,474.77) and (171.14,467.14)..(171.14,456.41) + ..controls (170.57,455.4) and (169.85,454.46)..(168.48,454.46) + ..controls (168.48,453.1) and (169.34,450.86)..(168.62,449.42) + ..controls (167.18,447.62) and (165.89,451.8)..(165.02,444.6) + ..controls (163.15,443.74) and (157.75,442.22)..(155.59,445.18) + ..controls (155.88,448.99) and (158.33,451.3)..(160.13,453.38) + ..controls (161.42,456.91) and (160.99,458.28)..(160.7,461.81) + ..controls (160.99,464.98) and (161.71,468.58)..(161.86,470.09) + ..controls (161.86,473.04) and (162.5,479.3)..(161.14,481.18) + --(159.41,482.69)..controls (157.18,487.22) and (158.33,494.64)..(157.61,500.26) + ..controls (155.81,500.69) and (155.81,500.98)..(154.01,498.31) + ..controls (154.01,494.42) and (153.5,486.36)..(152.35,483.84) + ..controls (149.69,479.81) and (150.84,459.65)..(151.42,448.56) + ..controls (151.78,446.47) and (149.69,447.7)..(149.76,444.74) + ..controls (150.05,442.8) and (147.89,443.59)..(146.09,444.6) + ..controls (145.15,445.18) and (146.59,439.78)..(145.37,439.56) + ..controls (142.34,438.84) and (136.87,438.19)..(135.22,440.71) + ..controls (134.57,444.6) and (137.88,448.06)..(140.62,451.01) + ..controls (143.14,455.83) and (140.9,465.7)..(140.47,476.28) + --(138.89,478.22)..controls (134.86,483.19) and (139.61,496.94)..(136.51,506.23) + ..controls (120.02,514.87) and (122.11,519.19)..(118.73,537.62) + ..controls (115.13,557.64) and (93.3799,567.65)..(79.0598,567.65) + ..controls (73.4399,563.04) and (66.24,563.62)..(58.5398,567.65) + ..controls (55.6599,569.23) and (54.4299,573.19)..(54.5,576.5) + ..controls (52.6299,580.75) and (55.22,582.19)..(59.6199,583.49) + ..controls (62.71,587.81) and (68.6199,594.65)..(69.1899,597.74) + ..controls (70.3398,601.92) and (75.5298,608.11)..(77.7598,609.77) + ..controls (75.8198,613.01) and (74.8098,615.17)..(77.1099,618.55) + ..controls (79.5598,620.14) and (81.7898,616.61)..(84.3799,618.55) + --cycle; +pickup pencircle scaled 0bp; +fill (305.28,560.95)..controls (304.63,560.95) and (299.95,561.24)..(299.38,561.24) + ..controls (302.4,550.44) and (303.98,536.47)..(304.2,525.31) + ..controls (303.7,521.35) and (299.81,517.46)..(299.38,525.67) + ..controls (295.85,530.86) and (296.42,540.07)..(293.4,540.29) + ..controls (287.35,539.64) and (285.34,513.22)..(280.01,509.33) + ..controls (276.26,512.28) and (280.73,524.02)..(275.54,524.74) + ..controls (270.5,524.02) and (264.31,526.68)..(266.69,534.46) + ..controls (270.29,543.02) and (268.34,554.76)..(266.54,561.6) + ..controls (262.37,578.59) and (264.02,587.09)..(271.58,596.09) + --(267.48,604.51)..controls (275.4,608.26) and (285.62,604.58)..(290.02,602.21) + ..controls (294.62,600.26) and (300.24,595.94)..(301.1,587.38) + ..controls (303.34,578.88) and (304.42,569.74)..(305.28,560.95) + --cycle; +fill (245.45,600.34)..controls (242.78,599.4) and (239.62,596.02)..(237.67,594.07) + ..controls (236.74,584.42) and (244.58,583.63)..(250.2,577.44) + ..controls (258.77,573.7) and (251.21,567.72)..(256.18,557.42) + ..controls (257.04,550.94) and (257.9,543.89)..(255.31,539.78) + ..controls (249.48,538.92) and (247.97,540.22)..(246.89,531.43) + ..controls (246.31,526.97) and (231.77,529.06)..(229.03,538.27) + ..controls (227.09,544.97) and (221.33,546.7)..(217.8,543.17) + ..controls (213.77,538.06) and (215.78,531.22)..(217.8,527.47) + ..controls (224.93,517.32) and (212.04,511.42)..(205.13,516.74) + ..controls (199.73,508.68) and (211.39,500.04)..(207.43,494.5) + ..controls (205.78,493.99) and (204.77,489.17)..(185.47,500.54) + ..controls (180.36,504.14) and (167.83,500.76)..(168.77,520.63) + ..controls (168.77,525.82) and (165.6,543.53)..(162.14,555.91) + ..controls (159.41,561.24) and (156.74,559.08)..(156.89,553.9) + ..controls (157.18,547.85) and (162.94,531.22)..(155.52,540.22) + ..controls (153.58,539.21) and (156.89,523.58)..(156.89,521.64) + ..controls (162,517.03) and (157.39,513.58)..(154.73,512.28) + ..controls (151.27,518.33) and (149.62,518.04)..(147.17,514.44) + ..controls (141.7,514.08) and (144.58,528.19)..(140.26,528.62) + ..controls (137.02,527.76) and (139.18,520.06)..(138.24,518.76) + ..controls (132.98,524.74) and (130.9,529.27)..(127.01,521.64) + ..controls (126.14,521.64) and (122.11,519.19)..(120.96,526.54) + ..controls (117.65,552.74) and (107.06,558.36)..(93.8198,565.13) + ..controls (92.0198,565.63) and (84.24,566.71)..(79.3398,568.15) + ..controls (73.5098,560.88) and (58.3198,565.63)..(56.23,570.31) + ..controls (54.7898,572.69) and (54.6499,575.21)..(54.7898,576.5) + ..controls (52.3398,580.1) and (55.8699,582.7)..(59.6199,583.06) + ..controls (62.8599,587.16) and (68.5398,594.94)..(71.2798,601.56) + ..controls (72.2898,603.07) and (74.95,609.34)..(78.1899,609.55) + ..controls (74.95,612.94) and (74.2998,622.51)..(82.6599,617.33) + ..controls (87.1199,624.02) and (92.0898,624.31)..(95.7598,615.82) + ..controls (102.89,615.38) and (102.31,608.69)..(115.78,605.52) + ..controls (122.76,602.86) and (132.77,604.58)..(140.26,603.72) + ..controls (136.22,596.88) and (127.44,566.86)..(132.98,559.8) + ..controls (140.76,564.7) and (141.84,605.38)..(157.03,595.66) + ..controls (160.56,593.93) and (159.91,590.04)..(164.09,590.18) + ..controls (170.42,587.45) and (169.13,600.77)..(172.51,600.77) + ..controls (176.47,599.76) and (183.02,599.04)..(186.98,599.54) + ..controls (197.71,600.77) and (206.93,604.08)..(223.92,602.5) + ..controls (231.12,601.78) and (238.25,601.06)..(245.45,600.34) + --cycle; +pickup pencircle scaled 0.636492bp; +draw (305.28,560.95)..controls (304.63,560.95) and (299.95,561.24)..(299.38,561.24) + ..controls (302.4,550.44) and (303.98,536.47)..(304.2,525.31) + ..controls (303.7,521.35) and (299.81,517.46)..(299.38,525.67) + ..controls (295.85,530.86) and (296.42,540.07)..(293.4,540.29) + ..controls (287.35,539.64) and (285.34,513.22)..(280.01,509.33) + ..controls (276.26,512.28) and (280.73,524.02)..(275.54,524.74) + ..controls (270.5,524.02) and (264.31,526.68)..(266.69,534.46) + ..controls (270.29,543.02) and (268.34,554.76)..(266.54,561.6) + ..controls (262.37,578.59) and (264.02,587.09)..(271.58,596.09) + --(267.48,604.51)..controls (275.4,608.26) and (285.62,604.58)..(290.02,602.21) + ..controls (294.62,600.26) and (300.24,595.94)..(301.1,587.38) + ..controls (303.34,578.88) and (304.42,569.74)..(305.28,560.95) + --cycle; +draw (245.45,600.34)..controls (242.78,599.4) and (239.62,596.02)..(237.67,594.07) + ..controls (236.74,584.42) and (244.58,583.63)..(250.2,577.44) + ..controls (258.77,573.7) and (251.21,567.72)..(256.18,557.42) + ..controls (257.04,550.94) and (257.9,543.89)..(255.31,539.78) + ..controls (249.48,538.92) and (247.97,540.22)..(246.89,531.43) + ..controls (246.31,526.97) and (231.77,529.06)..(229.03,538.27) + ..controls (227.09,544.97) and (221.33,546.7)..(217.8,543.17) + ..controls (213.77,538.06) and (215.78,531.22)..(217.8,527.47) + ..controls (224.93,517.32) and (212.04,511.42)..(205.13,516.74) + ..controls (199.73,508.68) and (211.39,500.04)..(207.43,494.5) + ..controls (205.78,493.99) and (204.77,489.17)..(185.47,500.54) + ..controls (180.36,504.14) and (167.83,500.76)..(168.77,520.63) + ..controls (168.77,525.82) and (165.6,543.53)..(162.14,555.91) + ..controls (159.41,561.24) and (156.74,559.08)..(156.89,553.9) + ..controls (157.18,547.85) and (162.94,531.22)..(155.52,540.22) + ..controls (153.58,539.21) and (156.89,523.58)..(156.89,521.64) + ..controls (162,517.03) and (157.39,513.58)..(154.73,512.28) + ..controls (151.27,518.33) and (149.62,518.04)..(147.17,514.44) + ..controls (141.7,514.08) and (144.58,528.19)..(140.26,528.62) + ..controls (137.02,527.76) and (139.18,520.06)..(138.24,518.76) + ..controls (132.98,524.74) and (130.9,529.27)..(127.01,521.64) + ..controls (126.14,521.64) and (122.11,519.19)..(120.96,526.54) + ..controls (117.65,552.74) and (107.06,558.36)..(93.8198,565.13) + ..controls (92.0198,565.63) and (84.24,566.71)..(79.3398,568.15) + ..controls (73.5098,560.88) and (58.3198,565.63)..(56.23,570.31) + ..controls (54.7898,572.69) and (54.6499,575.21)..(54.7898,576.5) + ..controls (52.3398,580.1) and (55.8699,582.7)..(59.6199,583.06) + ..controls (62.8599,587.16) and (68.5398,594.94)..(71.2798,601.56) + ..controls (72.2898,603.07) and (74.95,609.34)..(78.1899,609.55) + ..controls (74.95,612.94) and (74.2998,622.51)..(82.6599,617.33) + ..controls (87.1199,624.02) and (92.0898,624.31)..(95.7598,615.82) + ..controls (102.89,615.38) and (102.31,608.69)..(115.78,605.52) + ..controls (122.76,602.86) and (132.77,604.58)..(140.26,603.72) + ..controls (136.22,596.88) and (127.44,566.86)..(132.98,559.8) + ..controls (140.76,564.7) and (141.84,605.38)..(157.03,595.66) + ..controls (160.56,593.93) and (159.91,590.04)..(164.09,590.18) + ..controls (170.42,587.45) and (169.13,600.77)..(172.51,600.77) + ..controls (176.47,599.76) and (183.02,599.04)..(186.98,599.54) + ..controls (197.71,600.77) and (206.93,604.08)..(223.92,602.5) + ..controls (231.12,601.78) and (238.25,601.06)..(245.45,600.34) + --cycle; +endfig; +end +pstoedit: version 3.18 / DLL interface 106 (build May 1 2000) : Copyright (C) 1993 - 2000 Wolfgang Glunz +Interpreter finished. Return status 0 diff --git a/doc/context/sources/general/manuals/metafun/mycow.pdf b/doc/context/sources/general/manuals/metafun/mycow.pdf Binary files differnew file mode 100644 index 000000000..9cc8fb0b4 --- /dev/null +++ b/doc/context/sources/general/manuals/metafun/mycow.pdf diff --git a/doc/context/sources/general/manuals/metafun/somecow.pdf b/doc/context/sources/general/manuals/metafun/somecow.pdf Binary files differnew file mode 100644 index 000000000..1a43087fd --- /dev/null +++ b/doc/context/sources/general/manuals/metafun/somecow.pdf diff --git a/doc/context/sources/general/manuals/nodes/nodes-sun-pia-03149.jpg b/doc/context/sources/general/manuals/nodes/nodes-sun-pia-03149.jpg Binary files differnew file mode 100644 index 000000000..4de706984 --- /dev/null +++ b/doc/context/sources/general/manuals/nodes/nodes-sun-pia-03149.jpg diff --git a/doc/context/sources/general/manuals/nodes/nodes-sun-pia-03150.jpg b/doc/context/sources/general/manuals/nodes/nodes-sun-pia-03150.jpg Binary files differnew file mode 100644 index 000000000..aa3849605 --- /dev/null +++ b/doc/context/sources/general/manuals/nodes/nodes-sun-pia-03150.jpg diff --git a/doc/context/sources/general/manuals/nodes/nodes.tex b/doc/context/sources/general/manuals/nodes/nodes.tex new file mode 100644 index 000000000..e9857f37e --- /dev/null +++ b/doc/context/sources/general/manuals/nodes/nodes.tex @@ -0,0 +1,1706 @@ +% interface=english modes=screen + +% author : Alan Braslau +% copyright : ConTeXt Development Team +% license : Creative Commons Attribution ShareAlike 4.0 International +% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions +% origin : the ConTeXt distribution +% +% comment : Because this manual is distributed with TeX distributions it comes with a rather +% liberal license. We try to adapt these documents to upgrades in the (sub)systems +% that they describe. Using parts of the content otherwise can therefore conflict +% with existing functionality and we cannot be held responsible for that. Many of +% the manuals contain characteristic graphics and personal notes or examples that +% make no sense when used out-of-context. +% +% comment : A prototype of the nodes module was presented at the ConTeXt 2016 user meeting +% and the first release was presented at the 2017 meeting. The module is part of +% the MetaFun code modules. +% +% comment : This manual orginates in an article by Alan so anything wrong in here is Hans +% fault as he converted it. +% +% comment : It is also being published as an article in TugBoat. +% +% comment : The cover images are from the NASA website. + + +% Alan : There is no need for % before \startfootnote .. the less such crap the better +% (as it might give disappearing content if one wraps). +% +% Alan : ḻṯ What is this? An editor glitch? +% +% Alan : $≠$ -> just use ≠ (also, soon the gyre fonts will have more symbols in text +% that match text. +% +% Alan : You can use \typ {x = 0} for something that breaks accross lines. + +%\enabletrackers[metapost.showlog] + +\definemeasure [layout:margin] [\paperheight/20] + +\setuplayout + [topspace=\measure{layout:margin}, + bottomspace=\measure{layout:margin}, + backspace=\measure{layout:margin}, + header=0pt, + footer=\measure{layout:margin}, + width=middle, + height=middle] + +\setupbodyfont + [dejavu,11pt] + +\setupwhitespace + [big] + +\setuphead + [chapter] + [style=\bfc, + interaction=all] + +\setuppagenumbering + [alternative=doublesided, + location=] + +\setupfootertexts + [\documentvariable{title}][\pagenumber] + [\pagenumber][\documentvariable{title}] + +\setuphead + [section] + [style=\bfb] + +\setuphead + [subsection] + [style=\bfa] + +\setuphead + [subsubsection] + [style=\bf, + after=] + +\setuplist + [interaction=all] + +\setupalign + [verytolerant,stretch] + +% \definesymbol [1] [$\cdot$] + +% Dot rather than bullet ... Alan hates bullets! Hans hates too small dots. + +\setupitemize + [symbol=2] % dash rather than bullet, I hate bullets! + +\setupnote + [footnote] + [next={ }, + split=verystrict, + scope=page] + +\setupinteraction + [state=start, + option=bookmark, + color=darkmagenta, + contrastcolor=darkmagenta] + +\setupinteractionscreen + [option=bookmark] + +\placebookmarks + [title,subject] + [title,subject] + +\enabledirectives + [references.bookmarks.preroll] + +\kindofpagetextareas\plusone % partial page. HH: low level, no high level switch (yet) + +\definetextbackground + [aside] + [location=paragraph, + frame=off, + leftoffset=1ex, + rightoffset=1ex, + topoffset=1ex, + bottomoffset=1ex, + background=color, + backgroundcolor=lightgray] + +\definedescription + [description] + [location=hanging, + width=broad, + before={\blank}, + after={\blank}] + +\defineparagraphs + [two] + [n=2, + offset=1ex, + background=color, + backgroundcolor=gray] + +\defineframed + [node] + [offset=1pt, + foregroundstyle=\tfa] + +\defineframed + [nodeGreen] + [node] + [foregroundcolor=darkgreen, + foregroundstyle=italic] + +\defineframed + [nodeSmall] + [node] + [foregroundstyle=\tfx] + +\startbuffer [bib] + @ARTICLE{Krebs1946, + author = {Krebs, H. A.}, + title = {Cyclic processes in living matter}, + journal = {Enzymologia}, + year = {1946}, + volume = {12}, + pages = {88--100} + } + + @ARTICLE{Bethe1939a, + author = {Bethe, H. A.}, + title = {Energy Production in Stars}, + journal = {Phys. Rev.}, + year = {1939}, + volume = {55}, + pages = {103–103}, + month = {Jan}, + doi = {10.1103/PhysRev.55.103}, + issue = {1}, + publisher = {American Physical Society}, + XXurl = {http://link.aps.org/doi/10.1103/PhysRev.55.103} + } + + @ARTICLE{Bethe1939b, + author = {Bethe, H. A.}, + title = {Energy Production in Stars}, + journal = {Phys. Rev.}, + year = {1939}, + volume = {55}, + pages = {434–456}, + month = {Mar}, + doi = {10.1103/PhysRev.55.434}, + issue = {5}, + publisher = {American Physical Society}, + XXurl = {http://link.aps.org/doi/10.1103/PhysRev.55.434} + } + + @BOOK{Lawvere2009, + author = {Lawvere, F. William and Schanuel, Stephen H.}, + title = {Conceptual Mathematics} + subtitle = {A first introduction to categories}, + edition = {2\high{nd}}, + publisher = {Cambridge University Press}, + address = {Cambridge, UK}, + year = {2009} + } +\stopbuffer + +\usebtxdefinitions [apa] +\setupbtxrendering [apa] [pagestate=start] % index cite pages in bibliography + +\usebtxdataset [bib.buffer] + +% Say, MP math arrows rather than font arrows: + +\useMPlibrary[mat] + +\definemathstackers + [mp] + [alternative=mp] + +\definemathextensible [mp] [leftarrow] ["2190] +\definemathextensible [mp] [rightarrow] ["2192] +\definemathextensible [mp] [leftrightarrow] ["2194] +\definemathextensible [mp] [longleftrightarrow] ["27F7] +\definemathextensible [mp] [rightoverleftarrow] ["21C4] + +\startMPinitializations + ahlength := EmWidth ; + ahangle := 30 ; + ahvariant := 1 ; % dimpled curved + ahdimple := 4/5 ; + + node_loopback_yscale := .7 ; +\stopMPinitializations + +% Only here do we use the special nodes:: instance + +\defineframed + [mynode] + [node] + [offset=1pt, + foregroundcolor=white] + +\startreusableMPgraphic{nodes::krebs} + + % The Bethe cycle for energy production in stars (1939), following + % Krebs (1946) + + save p ; path p[] ; + p1 := (for i=0 step 60 until 300: dir(90-i).. endfor cycle) scaled 2.75cm ; + p0 := p1 scaled .5 ; + p2 := p1 scaled 1.5 ; + + draw node(p1,0,"\mynode{\chemical{^{12}C}}") ; + draw node(p1,1,"\mynode{\chemical{^{13}N}}") ; + draw node(p1,2,"\mynode{\chemical{^{13}C}}") ; + draw node(p1,3,"\mynode{\chemical{^{14}N}}") ; + draw node(p1,4,"\mynode{\chemical{^{15}O}}") ; + draw node(p1,5,"\mynode{\chemical{^{15}N}}") ; + + drawarrow fromtopaths.urt (true,p1,0,p1,1,"\mynode{a}") withcolor white ; + drawarrow fromtopaths.rt (true,p1,1,p1,2,"\mynode{b}") withcolor white ; + drawarrow fromtopaths.lrt (true,p1,2,p1,3,"\mynode{c}") withcolor white ; + drawarrow fromtopaths.llft(true,p1,3,p1,4,"\mynode{d}") withcolor white ; + drawarrow fromtopaths.lft (true,p1,4,p1,5,"\mynode{e}") withcolor white ; + drawarrow fromtopaths.ulft(true,p1,5,p1,6,"\mynode{f}") withcolor white ; + + draw node(p0,0,"\mynode{\chemical{^1H}}") ; + draw node(p0,2,"\mynode{\chemical{^1H}}") ; + draw node(p0,3,"\mynode{\chemical{^1H}}") ; + draw node(p0,5,"\mynode{\chemical{^1H}}") ; + + drawarrow fromtopaths(3/10,p0,0,p1,0.5) withcolor white ; + drawarrow fromtopaths(3/10,p0,2,p1,2.5) withcolor white ; + drawarrow fromtopaths(3/10,p0,3,p1,3.5) withcolor white ; + drawarrow fromtopaths(3/10,p0,5,p1,5.5) withcolor white ; + + draw node (p2,0,"\mynode{\chemical{^4He}}") ; + draw node (p2,1,"\mynode{$γ$}") ; + draw node.lrt (p2,2,"\mynode{$\mathrm{e}^+ + ν_\mathrm{e}$}") ; + draw node (p2,3,"\mynode{$γ$}") ; + draw node (p2,4,"\mynode{$γ$}") ; + draw node.ulft(p2,5,"\mynode{$\mathrm{e}^+ + ν_\mathrm{e}$}") ; + + drawarrow fromtopaths(-1/10,p1,0.5,p2,1) withcolor white ; + drawarrow fromtopaths(-1/10,p1,1.5,p2,2) withcolor white ; + drawarrow fromtopaths(-1/10,p1,2.5,p2,3) withcolor white ; + drawarrow fromtopaths(-1/10,p1,3.5,p2,4) withcolor white ; + drawarrow fromtopaths(-1/10,p1,4.5,p2,5) withcolor white ; + drawarrow fromtopaths(-1/10,p1,5.5,p2,0) withcolor white ; + +\stopreusableMPgraphic + +\startuseMPgraphic{CoverPage} + + StartPage ; + + % Alan wanted a sun in the background combined somehow with the energy + % harvesting molecule so here we go. The images that are used come from + % the NASA website and I used them as screen saver for a while. The + % version that I generate uses a variant from the one on the user's + % machine. + + draw textext("\externalfigure[\framedparameter{imagename}]") + xsized PaperWidth ysized (PaperHeight+4cm) + shifted center Page shifted (0,2cm); + + for i=1 upto 512 : + draw (textext("\reuseMPgraphic{nodes::krebs}") scaled (1/5 randomized 1/5)) + shifted (center Page randomized (PaperWidth,PaperHeight)) ; + endfor ; + + draw (textext.ulft("\word{\documentvariable{title}}") xsized (PaperWidth/2)) + shifted (lrcorner Page) + shifted (-PaperWidth/10,2PaperWidth/10) + withcolor white; + + draw (textext.ulft("\word{\documentvariable{author}}") xsized (PaperWidth/2)) + shifted (lrcorner Page) + shifted (-PaperWidth/10,PaperWidth/10) + withcolor white; + + StopPage ; + +\stopuseMPgraphic + +\startsetups document:start + + % We each have our preferred cover... ;-) + + \doifmodeelse {atpragma} { + \startMPpage[imagename=nodes-sun-pia-03150] + \includeMPgraphic{CoverPage} + \stopMPpage + } { + \startMPpage[imagename=nodes-sun-pia-03149] + \includeMPgraphic{CoverPage} + \stopMPpage + } + +\stopsetups + +\startsetups document:stop + +\stopsetups + +% And now, the document! + +\startdocument + [title=Nodes, + author=Alan Braslau, + copyright=\ConTeXt\ development team, + version=1.0] + +\startsubject [title=Introduction] + +The graphical representation of textual diagrams is a very useful tool in the +communication of ideas. In category and topos theory, for example, many key +concepts, formulas, and theorems are expressed by means of \emph {commutative +diagrams}; these involve objects and arrows between them. Certain concepts +discovered by category theory, such as \emph {natural transformations}, are +becoming useful in areas outside of mathematics and natural science, e.g., in +philosophy. To make category and topos methods usable by both specialists and +non|-|specialists, commutative diagrams are an indispensable tool. +\startfootnote + For many examples of formal and informal commutative diagrams, see \cite + [authoryears] [Lawvere2009]. +\stopfootnote +The use of nodal diagrams is not limited to category theory, for they may +represent a flow diagram (of a process, for example), a chemical reaction +sequence or pathways, or that of phases and phase transitions, a hierarchical +structure (of anything), a timeline or sequence of events or dependencies, a tree +of descendance or ascendance, etc. + +The basic units of a node|-|based diagram include \emph {node objects}, each +attached to some point (= the \emph {node}) in some spatial relationship. Note +that to a single node might be associated a set of objects. Given a node, it also +stands in a spatial relation to some other node. The spatial relationship between +the set of nodes of a diagram need not be in a regular network, although they +quite often are. Note that the spatial relationship between nodes is graphical +and may represent, e.g., a temporal or logical relationship, or a transformation +of one object into another or into others (one interesting example might be that +representing cell division or, mitosis). + +Given a spatial relation between any two nodes, a node|-|based diagram often +includes some \emph {path segment} or segments (such as arrows or other curves) +between two given nodes that \emph {relates} them. Each path segment may be +augmented by some textual or graphical label. + +A very simple example of a node diagram is shown in \in{Figure} [fig:AB]. + +\startbuffer +\startMPcode + clearnodepath ; + nodepath = (left -- right) scaled .75cm ; + draw node(0,"A") ; + draw node(1,"B") ; + drawarrow fromto(0,0,1) ; +\stopMPcode +\stopbuffer + +\startplacefigure [reference=fig:AB] + \getbuffer +\stopplacefigure + +\startplacefigure [reference=fig:ID, + location={right,+2*hang}] +\startMPcode + clearnodepath ; nodepath = origin ; + draw node(0,"$O$") ; + drawarrow fromto.urt (.75cm,0,0) ; + setbounds currentpicture to boundingbox currentpicture + enlarged (1.2cm,0) ; +\stopMPcode +\stopplacefigure + +More precisely, a \emph {node} is a point of intersection or branching of paths, +often a point on a regular lattice. (The nodes of the above diagram are the two +endpoints of a straight line segment.) Sometimes, however, a node might be a +single point as in an \emph {identity map} of category theory, referring to +itself: +\startfootnote + The standard arrowhead in \METAPOST\ is a simple triangle, whose length and + angle can be adjusted. \METAFUN\ provides further options, allowing this + arrowhead to be barbed or dimpled. In the present article, we use the + settings: \type {ahlength := EmWidth ; ahangle := 30 ; ahvariant := 1 ; + ahdimple := 4/5 ;} The loop|-|back arrow paths used here deviate from a + circular segment, becoming ellipsoidal, through the value \type + {node_loopback_yscale := .7 ;} These are all set, of course, between a \type + {\startMPinitializations} … \type {\stopMPinitializations} pair. +\stopfootnote + +In this article we discuss a new \METAPOST\ module designed for handling +node|-|based graphics as well as a derivative simple \CONTEXT\ interface. To +illustrate, the code producing \inlinebuffer\ {could} be, in \METAPOST\ and the +\CONTEXT\ interface respectively: + +\starttwo + \METAPOST + \startTEX + \startMPcode + draw node(0,"A") ; + draw node(1,"B") ; + drawarrow fromto(0,1) ; + \stopMPcode + \stopTEX +\two + \CONTEXT + \startbuffer + \startnodes [dx=1.5cm] + \placenode [0,0] {A} + \placenode [1,0] {B} + \connectnodes [0,1] + [alternative=arrow] + \stopnodes + \stopbuffer + \typebuffer [option=TEX] +\stoptwo + +drawing an arrow from A to B (or from node 0 to node 1): \getbuffer + +\startitemize[packed] + \startitem + The \METAPOST\ code shown above has been slightly simplified, as will be + seen later. + \stopitem + \startitem + The \CONTEXT\ interface as used here is limited and will be explained a + little later. + \stopitem +\stopitemize + +For beginners or casual users of \CONTEXT\ |<|including those who might be +intimidated by \METAPOST\ syntax|>| the ability to construct simple diagrams by +means of standard \CONTEXT\ syntax is very helpful. For those who have tried the +\CONTEXT\ interface and/or want to draw more advanced diagrams, the \METAPOST\ +module is much more powerful and flexible. + +\stopsubject + +\startsubject [title=\METAPOST] + +\METAPOST\ is a vector|-|graphics language which calls upon \TeX\ to typeset text +(such as labels); in \CONTEXT, furthermore, \METAPOST\ is integrated natively +through the library MPlib as well as the macro package \METAFUN. The tight +integration of \CONTEXT\ and \METAPOST\ provides advantages over the use of +other, external graphics engines. These advantages include ease of maintaining +coherence of style, as well as extensive flexibility without bloat. \METAPOST\ +has further advantages over most other graphics engines, including a very high +degree of precision as well as the possibility to solve certain types of +algebraic equations. This last feature is rarely used but should not be +overlooked. + +It is quite natural in \METAPOST\ to locate our node objects along a path or on +differing paths. This is a much more powerful concept than merely locating a node +at some pair of coordinates, e.g., on a square or a rectangular lattice, for +example (as in a table). Furthermore, these paths may be in three dimensions (or +more); of course the printed page will only involve some projection onto two +dimensions. Nor are the nodes restricted to location on the points defining a +path: they may have, as index, any \emph {time} along a given path \type {p} +ranging from the first defining point ($t = 0$) up to the last point of that path +($t ≤ \mathtt {length(p)}$), the number of defining points of a path. +\startfootnote + Note that the time of a cyclic path is taken modulo the length of the path, + that is $t$ outside of the range $[\mathtt0,\mathtt{length(p)}]$ will return + the first or the last point of an open path, but will \quotation {wrap} for a + closed path. +\stopfootnote + +Given a path \type {p}, nodes are defined (implicitly) as \type {picture} +elements: \type {picture p.pic[] ;} This is a pseudo|-|array where the square +brackets indicates a set of numerical tokens, as in \type {p.pic[0]} or \type +{p.pic[i]} (for \type {i=0}), but also \type {p.pic0}. This number need not be an +integer, and \type {p.pic[.5]} or \type {p.pic.5} (not to be confused with \type +{p.pic5}) are also valid. These picture elements are taken to be located relative +to the path \type {p}, with the index \type {t} corresponding to a time along the +path, as in \type {draw p.pic[t] shifted point t of p;} (although it is not +necessary to draw them in this way). This convention allows the nodes to be +oriented and offset with respect to the path in an arbitrary manner. + +Note that a path can be defined, then nodes placed relative to this path. Or the +path may be declared but remain undefined, to be determined only after the nodes +are declared. In yet another possibility, the path may be adjusted as needed, as +a function of whatever nodes are to be occupied. This will be illustrated through +examples further down. + +\stopsubject + +\startsubject [title=A few simple examples] + +\startplacefigure [location=right,reference=fig:square] + \startMPcode + path p ; p := fullsquare scaled 3cm ; + draw p ; + for i=0 upto length p: + draw point i of p + withcolor red + withpen pencircle scaled 5pt ; + endfor ; + % this looks better in the figure placement: + setbounds currentpicture to boundingbox currentpicture + enlarged (.5cm,0) ; + \stopMPcode +\stopplacefigure + +Let's begin with illustration of a typical commutative diagram from category +theory. Although it may appear trivial, this example helps to introduce +\METAPOST\ syntax. At the same time, a large part of the idea behind this module +is to facilitate use of this system without having to learn much \METAPOST. + +A path is drawn as well as the points defining the path. + +%\flushsidefloats + +\startTEX +\startMPcode + path p ; p := fullsquare scaled 3cm ; draw p ; + for i=0 upto length p: + draw point i of p + withcolor red + withpen pencircle scaled 5pt ; + endfor ; +\stopMPcode +\stopTEX + +\startbuffer +\startMPcode + clearnodepath ; + nodepath = p ; + draw node(0,"\node{$G(X)$}") ; + draw node(1,"\node{$G(Y)$}") ; + draw node(2,"\node{$F(Y)$}") ; + draw node(3,"\node{$F(X)$}") ; + drawarrow fromto.bot(0,0,1, "\nodeSmall{$G(f)$}") ; + drawarrow fromto.top(0,3,2, "\nodeSmall{$F(f)$}") ; + drawarrow fromto.rt (0,2,1, "\nodeSmall{$η_Y$}") ; + drawarrow fromto.lft(0,3,0, "\nodeSmall{$η_X$}") ; +\stopMPcode +\stopbuffer + +\startplacefigure [location={right,+1*hang},reference=fig:natural, + title={Drawn using \METAPOST\ interface}] + \getbuffer +\stopplacefigure + +Given the named path \type {nodepath}, we can now define and draw nodes as well +as connections between them (see \in{Figure} [fig:natural]): + +%\flushsidefloats + +\typebuffer [option=TEX] + +\startaside +In working with \METAPOST, it is good practice to reset or clear a variable using +the directive \type {save} for the \emph {suffix} (or variable name) \type +{nodepath} contained in the directive \type {clearnodepath} (defined as +\quotation {\type {save nodepath ; path nodepath}}). The macros used here rely on +the creation of certain internal variables and may not function correctly if the +variable structure is not cleared. Indeed, any node may contain a combination of +picture elements, added successively, so it is very important to \type {save} the +variable, making its use local, rather than global. This point is particularly +true with \CONTEXT, where a single MPlib instance is used and maintained over +multiple runs. + +The \CONTEXT\ directives \type {\startMPcode} … \type {\stopMPcode} include +grouping (\METAPOST\ \type {begingroup ;}… \type {endgroup ;}) and the use of +\type {save} (in \type {clearnodepath}) will make the suffix \type {nodepath} +local to this code block. In the code for \in{Figures} [fig:square] and \in +[fig:natural], the path \type {p} itself is not declared local (through the use +of a \type {save}); it therefore remains available for other \METAPOST\ code +blocks. We cannot do this with the default suffix name \type {nodepath} without +undesired consequences. + +The directive \type {clearnodepath} used in the example above, much like the +\METAPOST\ command \type {clearxy} clearing the \type {(x,y)} pair also known as +\type {z}, uses \type {save} to clear the default suffix \type {nodepath}. +\stopaside + +Note that one should not confuse the \METAPOST\ function \type {node()} with the +\CONTEXT\ command \type {\node{}}, defined as follows: + +\starttwo + \startTEX + \defineframed + [node] + [frame=off, + offset=1pt] + \stopTEX +\two + \startTEX + \defineframed + [nodeSmall] + [node] + [foregroundstyle=small] + \stopTEX +\stoptwo + +\type {\node{}} places the text within a \CONTEXT\ frame (with the frame border +turned|-|off), whereas the \METAPOST\ function \type {node(i,"…")} sets and +returns a picture element associated with a point on path \type {nodepath} +indexed by its first argument. The second argument here is a string that gets +typeset by \TEX. (The use of \type {\node{}} adds an \type {offset}). + +By default, the \METAPOST\ function \type {fromto()} returns a path segment going +between two points of the path \type {nodepath}. The first argument (\type {0} in +the example above) can be used as a displacement to skew the path away from a +straight line (by an amount in units of the straight path length). The last +argument is a string to be typeset and placed midpoint of the segment. The +{suffix} appended to the function name gives an offset around this halfway point. +This follows standard \METAPOST\ conventions. + +It is important to draw or declare the nodes \emph {before} drawing the +connections, using \type {fromto()}, in order to be able to avoid overlapping +symbols, as one notices that the arrows drawn in the example above begin and end +on the border of the frame (or bounding box) surrounding the node text. This +would of course not be possible if the arrow were to be drawn before this text +was known. + +As will be seen further on, one can actually specify the use of any defined path, +without restriction to the built|-|in name \type {nodepath} that is used by +default. Furthermore, a function \type {fromtopaths()} can be used to draw +segments connecting any two paths which may be distinct. This too will be +illustrated further on. + +The \CONTEXT\ syntax for the current example looks like this: + +\startbuffer + \startnodes [dx=3cm,dy=3cm] + \placenode [0,0] {\node{$G(X)$}} + \placenode [1,0] {\node{$G(Y)$}} + \placenode [1,1] {\node{$F(Y)$}} + \placenode [0,1] {\node{$F(X)$}} + \connectnodes [0,1] [alternative=arrow, + label={\nodeSmall{$G(f)$}},position=bottom] + \connectnodes [3,2] [alternative=arrow, + label={\nodeSmall{$F(f)$}},position=top] + \connectnodes [2,1] [alternative=arrow, + label={\nodeSmall{$η_Y$}}, position=right] + \connectnodes [3,0] [alternative=arrow, + label={\nodeSmall{$η_X$}}, position=left] + \stopnodes +\stopbuffer + +\startplacefigure [location=right, + title={Drawn using \CONTEXT\ interface}] + \getbuffer +\stopplacefigure + +\typebuffer [option=TEX] + +\startplacefigure [reference=fig:indices, + location=right, + title={Coordinates and indices.\footnote{For variety, a rectangular oblique + lattice is drawn in \in{Figure} [fig:indices].} + }] +\stopfootnote + \startframed [frame=off,width=.33\textwidth,align=flushright] + \startnodes [dx=3cm,dy=2cm,rotation=60] + \placenode [0,0] {\node{(0,0)}} + \placenode [1,0] {\node{(1,0)}} + \placenode [1,1] {\node{(1,1)}} + \placenode [0,1] {\node{(0,1)}} + \connectnodes [0,1] [alternative=arrow, + label={\nodeSmall{$0\rightarrow1$}},position=bottom] + \connectnodes [3,2] [alternative=arrow, + label={\nodeSmall{$3\rightarrow2$}},position=top] + \connectnodes [2,1] [alternative=arrow, + label={\nodeSmall{$~2\rightarrow1$}}, position=right] + \connectnodes [3,0] [alternative=arrow, + label={\nodeSmall{$3\rightarrow0$}}, position=upperleft] + \stopnodes + \stopframed +\stopplacefigure + +This follows the more classic (and limited) approach of placing nodes on the +coordinates of a regular lattice, here defined as a 3~cm square network. +\footnote {The lattice can be square (\type {dx} $=$ \type {dy}), rectangular +(\type {dx} $≠$ \type {dy}), or oblique (through \type {rotation} $≠$ 90).} The +arguments are then $(x,y)$ coordinates of this lattice and the nodes are indexed +0, 1, 2, … in the order that they are drawn. These are used as reference indices +in the commands \type {\connectnodes} (rather than requiring two \emph {pairs} of +coordinates); see \in {Figure} [fig:indices]. This might seem a bit confusing at +first view, but it simplifies things in the end, really! + +An identity map, as shown in \in {Figure} [fig:ID], earlier, and, below, in \in +{Figure} [fig:Me] is achieved by connecting a node to itself: + +\startbuffer +\startnodes [dx=2cm,dy=1cm] + \placenode [0,0] {\node{Me}} + \placenode [1,-1] {\node{You}} + \connectnodes [0,0] [alternative=arrow, + offset=.75cm,position=topright, + label=myself] + \connectnodes [1,1] [alternative=arrow, + offset=.75cm,position=bottomright, + label=yourself] +\stopnodes +\stopbuffer + +\startplacefigure [reference=fig:Me,title=Identity maps, + location=right] + \getbuffer +\stopplacefigure + +\typebuffer [option=TEX] + +The scale (diameter) of the circular loop|-|back is set by the keyword \type +{offset=} (normally used to curve or bow|-|away a path connecting nodes from the +straight|-|line segment between them), and the \type {position=} keyword sets its +orientation. + +\page [yes] + +\startbuffer +\startMPcode +clearnodepath ; +nodepath = fullsquare scaled 2cm ; +save A ; A = 3 ; draw node(A,"\node{A}") ; +save B ; B = 2 ; draw node(B,"\node{B}") ; +save C ; C = 0 ; draw node(C,"\node{C}") ; +save D ; D = 1 ; draw node(D,"\node{D}") ; + +drawarrow fromto(0,B,C) ; +drawarrow fromto(0,A,D) crossingunder fromto(0,B,C) ; +\stopMPcode +\stopbuffer + +\startplacefigure [reference=fig:crossingunder, + location={right,+3*hang}, + title=A$\rightarrow$D under B$\rightarrow$C] + \startframed [frame=off,width=5cm,align=middle] + \getbuffer + \stopframed +\stopplacefigure + +Let us now consider the following code which illustrates the \METAFUN\ operator +\type {crossingunder} +\startfootnote + The operator \type {crossingunder} is of such general use that it has been + added to the \METAFUN\ base. +\stopfootnote +(see \in {Figure}[fig:crossingunder]). The \type {nodepath} indices are put into +variables \type {A}, \type {B}, \type {C}, and \type {D}, thus simplifying the +code. + +\typebuffer [option=TEX] + +\startplacefigure [reference=fig:sincos, + location=right, + title={\type{crossingunder}}] + \startMPcode + save u ; u := 2cm ; + save p ; path p[] ; + n := 64 ; + p2 := for i=0 upto n : if i>0 : .. fi (3u*(i/n), u*sind(720*(i/n))) endfor ; + p3 := for i=0 upto n : if i>0 : .. fi (3u*(i/n), u*cosd(720*(i/n))) endfor ; + p4 := point 0 of p2 -- point (length p2) of p2 shifted (left*.01u) ; + + draw p2 withcolor red ; + begingroup ; + interim crossingscale := 20 ; + draw (p3 crossingunder p2) crossingunder p4 withcolor blue ; + endgroup ; + drawarrow (p4 crossingunder p2) ; + \stopMPcode +\stopplacefigure + +Another illustration of the \type {crossingunder} operator in use is shown in \in +{figure} [fig:sincos]. Because the diagrams are all defined and drawn in +\METAPOST, one can easily use the power of \METAPOST\ to extend a simple node +drawing with any kind of graphical decoration. + +This brings up an important point that has limited the development of a +full|-|featured \CONTEXT\ module up to now. A pure \METAPOST\ interface affords +much more flexibility than can be conveniently reduced to a set of \TeX\ macros; +the \CONTEXT\ interface has been written to maintain only basic functionality. +\startfootnote + One can use \type {\nodeMPcode{}} to inject arbitrary \METAPOST\ code within + a \type {\startnode} … \type {\stopnode} pair, although in this example one + is probably better off using the straight \METAPOST\ interface. +\stopfootnote + +\stopsubject + +\startsubject [title=Cyclic diagrams] + +For a somewhat more complicated example, let us consider the representation of a +catalytic process such as that given by \cite [author] [Krebs1946]. \cite +[Krebs1946] The input is shown coming into the cycle from the center of a circle; +the products of the cycle are spun|-|off from the outside of the circle. We start +by defining a circular path where each point corresponds to a step in the cyclic +process. Our example will use six steps (see \in {Figure} [fig:circles]). + +We also want to define a second circular path with the same number of points at +the interior of this first circle for the input, and a third circular path at the +exterior for the output. + +The code is as follows: + +\page [yes] + +\startbuffer +\startMPcode + save p ; path p[] ; + % define a fullcircle path with nodes at 60° (rather than 45°) + p1 := (for i=0 step 60 until 300: dir(90-i) .. endfor cycle) scaled 2.5cm ; + p0 := p1 scaled .5 ; + p2 := p1 scaled 1.5 ; + + for i=0 upto 2: + draw p[i] ; + label.bot("\bf p" & decimal i, point 0 of p[i]) ; + for j=1 upto length p[i]: + draw point j of p[i] withpen currentpen scaled 10 withcolor red ; + if i=1: + label.autoalign(angle point j of p[i]) (decimal j, point j of p[i]) + withcolor red ; + fi + endfor + endfor +\stopMPcode +\stopbuffer + +\typebuffer [option=TEX] + +\startplacefigure [reference=fig:circles, + location=right, + title={The paths that we will use for the anchoring of nodes.}] + \getbuffer +\stopplacefigure + +[\type {autoalign()} is a feature defined within \METAFUN.] + +Nodes will then be drawn on each of these three circles and arrows will be used +to connect these various nodes, either on the same path or else between paths. + +The \METAPOST\ function \type {fromto()} is used to give a path segment that +points from one node to another. It \emph {assumes} the path \type {nodepath}, +and in fact calls the function \type {fromtopaths} that explicitly takes path +names as arguments. That is, \type {fromto (d, i, j, …)} is equivalent to \type +{fromtopaths (d, nodepath, i, nodepath, j, …)}. + +As stated above, this segment can be a straight line or else a path that can be +bowed|-|away from this straight line by a transverse displacement given by the +function's first argument (given in units of the straight segment length). When +both nodes are located on a single, defined path, this segment can be made to lie +on or follow this path, such as one of the circular paths defined above. This +behavior is obtained by using any non|-|numeric value (such as \type {true}) in +place of the first argument. Of course, this cannot work if the two nodes are not +located on the same path. + +The circular arc segments labeled \emph {\darkgreen a–f} are drawn on \in +{figure} [fig:Bethe] using the following: + +\startTEX +drawarrow fromtopaths.urt (true,p1,0,p1,1,"\nodeGreen{a}") ; +\stopTEX + +for example, where \type {\nodeGreen} is a frame that inherits from \type +{\node}, changing style and color: + +\startTEX +\defineframed + [nodeGreen] + [node] + [foregroundcolor=darkgreen, + foregroundstyle=italic] +\stopTEX + +The bowed|-|arrows feeding into the cyclic process and leading out to the +products, thus between different paths, from the path \type {p0} to the path +\type {p1} and from the path \type {p1} to the path \type {p2}, respectively, are +drawn using the deviations \type {+3/10} and \type {-1/10} (to and from +half|-|integer indices, thus mid|-|step, on path \type {p1}): + +\startTEX +drawarrow fromtopaths( 3/10,p0,0,p1,0.5) withcolor .6white ; +drawarrow fromtopaths(-1/10,p1,0.5,p2,1) withcolor .6white ; +\stopTEX + +\startplacefigure [reference=fig:Bethe, + title={The \cite[author] [Bethe1939a] cycle for the energy production in stars + \cite[alternative=year,left=(,right=)] [Bethe1939a+Bethe1939b] in a + \cite[author] [Krebs1946] representation of a catalytic process + \cite[alternative=year,left=(,right=)] [Krebs1946].}] +\startMPcode + + % differs slightly from \reuseMPgraphic{nodes::krebs} + + % The Bethe cycle for energy production in stars (1939), following Krebs (1946) + + save p ; path p[] ; + p1 := (for i=0 step 60 until 300: dir(90-i).. endfor cycle) scaled 2.75cm ; + p0 := p1 scaled .5 ; + p2 := p1 scaled 1.5 ; + + bboxmargin := 0pt ; + + draw node(p1,0,"\node{\chemical{^{12}C}}") ; + draw node(p1,1,"\node{\chemical{^{13}N}}") ; + draw node(p1,2,"\node{\chemical{^{13}C}}") ; + draw node(p1,3,"\node{\chemical{^{14}N}}") ; + draw node(p1,4,"\node{\chemical{^{15}O}}") ; + draw node(p1,5,"\node{\chemical{^{15}N}}") ; + + drawarrow fromtopaths.urt (true,p1,0,p1,1,"\nodeGreen{a}") ; + drawarrow fromtopaths.rt (true,p1,1,p1,2,"\nodeGreen{b}") ; + drawarrow fromtopaths.lrt (true,p1,2,p1,3,"\nodeGreen{c}") ; + drawarrow fromtopaths.llft(true,p1,3,p1,4,"\nodeGreen{d}") ; + drawarrow fromtopaths.lft (true,p1,4,p1,5,"\nodeGreen{e}") ; + drawarrow fromtopaths.ulft(true,p1,5,p1,6,"\nodeGreen{f}") ; + + draw node(p0,0,"\node{\chemical{^1H}}") ; + draw node(p0,2,"\node{\chemical{^1H}}") ; + draw node(p0,3,"\node{\chemical{^1H}}") ; + draw node(p0,5,"\node{\chemical{^1H}}") ; + + drawarrow fromtopaths(3/10,p0,0,p1,0.5) withcolor .6white ; + drawarrow fromtopaths(3/10,p0,2,p1,2.5) withcolor .6white ; + drawarrow fromtopaths(3/10,p0,3,p1,3.5) withcolor .6white ; + drawarrow fromtopaths(3/10,p0,5,p1,5.5) withcolor .6white ; + + draw node (p2,0,"\node{\chemical{^4He}}") ; + draw node (p2,1,"\node{$γ$}") ; + draw node.lrt (p2,2,"\node{$\mathrm{e}^+ + ν_\mathrm{e}$}") ; + draw node (p2,3,"\node{$γ$}") ; + draw node (p2,4,"\node{$γ$}") ; + draw node.ulft(p2,5,"\node{$\mathrm{e}^+ + ν_\mathrm{e}$}") ; + + drawarrow fromtopaths(-1/10,p1,0.5,p2,1) withcolor .6white ; + drawarrow fromtopaths(-1/10,p1,1.5,p2,2) withcolor .6white ; + drawarrow fromtopaths(-1/10,p1,2.5,p2,3) withcolor .6white ; + drawarrow fromtopaths(-1/10,p1,3.5,p2,4) withcolor .6white ; + drawarrow fromtopaths(-1/10,p1,4.5,p2,5) withcolor .6white ; + drawarrow fromtopaths(-1/10,p1,5.5,p2,0) withcolor .6white ; + +\stopMPcode +\stopplacefigure + +\startsubsubject [title={A lesson in \METAPOST}] + +An \quote {array} of paths is declared through \type {path p[] ;} it is not a +formal array, but rather a syntactic definition of a collection of path variables +\type {p0}, \type {p1}, … each of whose name is prefixed with the tag \quotation +{p} followed by any number, not necessarily an integer (e.g., \type {p3.14} is a +valid path name). The syntax allows enclosing this \quotation {index} within +square brackets, as in \type {p[0]} or, more typically, \type {p[i]}, where \type +{i} would be a numeric variable or the index of a loop. Note that the use of +brackets is required when using a negative index, as in \type {p[-1]} (for \type +{p-1} is interpreted as three tokens, representing a subtraction). Furthermore, +the variable \type {p} itself, would here be a numeric (by default), so \type +{p[p]} would be a valid syntactic construction! One could, additionally, declare +a set of variables \type {path p[][] ;} and so forth, defining also \type +{p[0][0]} (equivalently, \type {p0 0}) for example as a valid path, coexisting +with yet different from the path \type {p0}. + +\METAPOST\ also admits variable names reminiscent of a structure: \type {picture +p.pic[] ;} for example is used internally in the \type {node} macros, but this +becomes \type {picture p[]pic[] ;} when using a path \quote {array} syntax. These +variable names are associated with the suffix \type {p} and become all undefined +by \type {save p ;}. + +\stopsubsubject + +\startsubsubject [title={Putting it together}] + +What follows is simple example of a natural transformation, discovered and +articulated in the course of a philosophical research project (by Idris Samawi +Hamid). \in {Figure} [fig:NT] represents what is called the Croce Topos [named +after the Italian philosopher Benedetto Croce (1866–1952)]: + +\startbuffer +\startMPcode + save nodepath ; + path nodepath ; + nodepath = ((0,0) -- (1,0) -- (3,0) -- + (3,1) -- (1,1) -- (0,1) -- + cycle) scaled 4cm ; + draw node(0,"\node{Practical}") ; + draw node(1,"\node{Economic}") ; + draw node(2,"\node{Moral}") ; + draw node(3,"\node{Conceptual}") ; + draw node(4,"\node{Aesthetic}") ; + draw node(5,"\node{Theoretical}") ; + + drawarrow fromto.rt (.1,5,0,"\node{$γ$}") ; + drawarrow fromto.lft(.1,0,5,"\node{$γ'$}") ; + drawarrow fromto.rt (.1,4,1,"\node{$Fγ$}") ; + drawarrow fromto.lft(.1,1,4,"\node{$Fγ'$}") ; + drawarrow fromto.rt (.1,3,2,"\node{$Gγ$}") ; + drawarrow fromto.lft(.1,2,3,"\node{$Gγ'$}") ; + + drawarrow fromto.top( 0,4,3,"\node{\it concretization$_1$}") ; + drawarrow fromto.bot(.1,3,4,"\node{\it abstraction$_1$}") + dashed evenly ; + drawarrow fromto.top( 0,1,2,"\node{\it concretization$_2$}") ; + drawarrow fromto.bot(.1,2,1,"\node{\it abstraction$_2$}") + dashed evenly ; +\stopMPcode +\stopbuffer + +% Let's forget that and rather use \startnodes... + +\startbuffer +\startnodes [dx=4cm,dy=4cm,alternative=arrow] + \placenode [0,0] {\node{Practical}} + \placenode [1,0] {\node{Economic}} + \placenode [3,0] {\node{Moral}} + \placenode [3,1] {\node{Conceptual}} + \placenode [1,1] {\node{Aesthetic}} + \placenode [0,1] {\node{Theoretical}} + + \connectnodes [5,0] [offset=.1,position=right, label={\node{$γ$}}] + \connectnodes [0,5] [offset=.1,position=left, label={\node{$γ'$}}] + \connectnodes [4,1] [offset=.1,position=right, label={\node{$Fγ$}}] + \connectnodes [1,4] [offset=.1,position=left, label={\node{$Fγ'$}}] + \connectnodes [3,2] [offset=.1,position=right, label={\node{$Gγ$}}] + \connectnodes [2,3] [offset=.1,position=left, label={\node{$Gγ'$}}] + + \connectnodes [4,3] [position=top, label={\node{\it concretization$_1$}}] + \connectnodes [3,4] [postition=bottom,offset=.1, option=dashed, + label={\node{\it abstraction$_1$}}] + \connectnodes [1,2] [position=top, label={\node{\it concretization$_2$}}] + \connectnodes [2,1] [position=bottom,offset=.1, option=dashed, + label={\node{\it abstraction$_2$}}] +\stopnodes +\stopbuffer + +\startplacefigure [reference=fig:NT, + title={A representation of the Croce Topos}] + \getbuffer +\stopplacefigure + +Here we use the \CONTEXT\ interface to the node package: + +\typebuffer [option=TEX] + +\stopsubsubject + +\stopsubject + +\startsubject [title=Tree diagrams] + +The tree diagram shown in \in {Figure} [fig:DNA] is drawn using four paths, each +one defining a row or generation in the branching. The definition of the spacing +of nodes was crafted by hand and is somewhat arbitrary: 3.8, 1.7, and 1 for the +first, second and third generations. This might not be the best approach, but +this is how I was thinking when I first created this figure. + +\startplacefigure [location=force,reference=fig:DNA] +\startMPcode + % third example: A tree diagram + + save u ; u := 2.25cm ; + save n ; n := 2 ; % n children per generation + + save p ; path p[] ; + p0 := origin ; + numeric d[] ; d1 := 3.8 ; d2 := 1.7 ; d3 := 1 ; + for g=1 upto 3: + p[g] := + for i=0 upto length(p[g-1]): + for c=0 upto n-1: + if (i+c)>0: -- fi + ((point i of p[g-1]) shifted (d[g]*(c/(n-1)-.5)*u,-u)) + endfor + endfor ; + endfor + + draw node(p0,0, "\node{DNA interactions with surfaces}") ; + draw node(p1,0, "\node{repulsive:}") ; + draw node(p1,1, "\node{attractive: adsorption}") ; + draw node(p2,0, "\node{confinement}") ; + draw node(p2,1, "\node[align=middle,location=high]{depletion,\\macromolecular\\crowding}") ; + draw node(p2,2, "\node{chemisorption}") ; + draw node(p2,3, "\node{physisorption}") ; + draw node(p3,5.5,"\node{immobilized}") ; + draw node(p3,7, "\node{mobile}") ; + + drawarrow fromtopaths(0,p0,0,p1,0) ; + drawarrow fromtopaths(0,p0,0,p1,1) ; + + drawarrow fromtopaths(0,p1,0,p2,0) ; + drawarrow fromtopaths(0,p1,0,p2,1) ; + drawarrow fromtopaths(0,p1,1,p2,2) ; + drawarrow fromtopaths(0,p1,1,p2,3) ; + + drawarrow fromtopaths(0,p2,2,p3,5.5) ; + drawarrow fromtopaths(0,p2,3,p3,5.5) ; + drawarrow fromtopaths(0,p2,3,p3,7) ; + +\stopMPcode +\stopplacefigure + +Ultimately, one can do better by allowing \METAPOST\ to solve the relevant +equations and to determine this spacing automatically. Because it is a somewhat +advanced procedure, this approach will be first illustrated through a very simple +example of a diagram where the nodes will be placed on a declared but undefined +path: + +\startTEX +save p ; % path p ; +\stopTEX + +The \type {save p ;} assures that the path is undefined. This path will later ḻṯ +defined based on the contents of the nodes and a desired relative placement. In +fact, it is not even necessary to declare that the suffix will be a path, as the +path will be declared and automatically built once the positions of all the nodes +are determined. To emphasize this point, the \type {path} declaration above is +commented|-|out. + +\startdescription {Warning:} +Solving equations in \METAPOST\ can be non|-|trivial for those who are less +mathematically inclined. One needs to establish a coupled set of equations that +is solvable: that is, fully but not over|-|determined. +\stopdescription + +A few helper functions have been defined: \type {makenode()} returns a suffix +(variable name) corresponding to the node's position. The first such node can be +placed at any finite point, for example the drawing's origin. The following nodes +can be placed in relation to this first node: + +% \startframed [frame=off,align=text,offset=overlay] % keep this together on one page. +\startTEX +save nodepath ; +save first, second, third, fourth ; +pair first, second, third, fourth ; +first.i = 0 ; first = makenode(first.i, "\node{first}") ; +second.i = 1 ; second = makenode(second.i,"\node{second}") ; +third.i = 2 ; third = makenode(third.i, "\node{third}") ; +fourth.i = 3 ; fourth = makenode(fourth.i,"\node{fourth}") ; + +first = origin ; +second = first + + betweennodes.urt(nodepath,first.i, nodepath,second.i,whatever) ; +third = second + + betweennodes.lft(nodepath,second.i,nodepath,third.i, whatever) ; +fourth = third + + betweennodes.bot(nodepath,fourth.i,nodepath,first.i,3ahlength) ; +\stopTEX +% \stopframed + +The helper function \type {betweennodes()} returns a vector pointing in a certain +direction, here following the standard \METAPOST\ suffixes: \type {urt}, \type +{lft}, and \type {bot}, that takes into account the bounding boxes of the +contents of each node, plus an (optional) additional distance (here given in +units of the arrow|-|head length, \type {ahlength}). Using the keyword \type +{whatever} tells \METAPOST\ to adjust this distance as necessary. The above set +of equations is incomplete as written, so a fifth and final relation needs to be +added; the fourth node is also to be located directly to the left of the very +first node: +\startfootnote + Equivalently, we could declare that the first node located to the right of + the fourth node: \type {first = fourth + betweennodes.rt (nodepath, first.i, + nodepath, fourth.i, 3ahlength) ;} +\stopfootnote + +\startTEX +fourth = first + + betweennodes.lft(nodepath,fourth.i,nodepath,first.i,3ahlength) ; +\stopTEX + +Note that the helper function \type {makenode()} can be used as many times as +needed; if given no content, only returning the node's position. Additional nodes +can be added to this diagram along with appropriate relational equations, keeping +in mind that the equations must, of course, be solvable. This last issue is the +one challenge that most users might face. The function \type {node()} that was +used previously and returning a picture element to be drawn itself calls the +function \type {makenode()}, used here. The nodes have not yet been drawn: + +\startplacefigure [location=right,reference=fig:relative] +\startMPcode + save nodepath ; + save first, second, third, fourth ; + pair first, second, third, fourth ; + first.i = 0 ; first = makenode(first.i, "\node{first}") ; + second.i = 1 ; second = makenode(second.i,"\node{second}") ; + third.i = 2 ; third = makenode(third.i, "\node{third}") ; + fourth.i = 3 ; fourth = makenode(fourth.i,"\node{fourth}") ; + + first = origin ; + second = first + betweennodes.urt(nodepath,first.i, nodepath,second.i,whatever) ; + third = second + betweennodes.lft(nodepath,second.i,nodepath,third.i, whatever) ; + fourth = third + betweennodes.bot(nodepath,fourth.i,nodepath,first.i,3ahlength) ; + fourth = first + betweennodes.lft(nodepath,fourth.i,nodepath,first.i,3ahlength) ; + + for i = first.i, second.i, third.i, fourth.i : + draw node(i) ; + drawarrow fromto(0,i,i+1) ; + endfor +\stopMPcode +\stopplacefigure + +\startTEX +for i = first.i, second.i, third.i, fourth.i : + draw node(i) ; + drawarrow fromto(0,i,i+1) ; +endfor +\stopTEX + +This results in \in {Figure} [fig:relative]. The path is now defined as one +running through the position of all of the defined nodes, and is cyclic. + +Using this approach, that of defining but not drawing the nodes until a complete +set of equations defining their relative positions has been constructed, imposes +several limitations. First, the nodes are expected to be numbered from $0$ up to +$n$, continuously and without any gaps for each defined path. This is just an +implicit, heuristic convention of the path construction. Second, when finally +defining all the nodes and their positions, the path needs to be constructed. A +function, \type {makenodepath(p) ;} accomplishes this; it gets implicitly called +(once) upon the drawing of any \type {node()} or connecting \type {fromto}. Of +course, \type {makenodepath()} can always be called explicitly once the set of +equations determining the node positions is completely defined. + +\startparagraph [style=bold] +We once again stress that the writing of a solvable yet not over|-|determined set +of equations can be a common source of error for many \METAPOST\ users. +\startfootnote + The generous use of descriptive variables as we try to illustrate in the + examples here can help tremendously in keeping track of multiple equations. +\stopfootnote +\stopparagraph + +Another such example is the construction of a simple tree of descendance or +family tree. There are many ways to draw such a tree; in \in {figure} +[fig:descendance] we will show only three generations. + +\startplacefigure [location=here,reference=fig:descendance, + title={A tree of descendance}] +\startMPcode + save p ; % path p[], p[][] ; get automagically defined + save spacing ; spacing = 5pt ; + save d ; d = 4ahlength ; + + save mother, father ; pair mother, father ; + + mother = makenode(p,0,"\node{mother}") ; + father = makenode(p,1,"\node{father}") ; + + mother = origin ; + father = mother + betweennodes.rt(p,0,p,1,spacing) ; + + % first generation + save child, spouse ; pair child[], spouse[] ; + child = 0 ; spouse = 1 ; + + child1 = makenode(p0,child, "\node{child1}") ; + spouse1 = makenode(p0,spouse,"\node{spouse}") ; + child2 = makenode(p1,child, "\node{child2}") ; + spouse2 = makenode(p1,spouse,"\node{spouse}") ; + + .5[child1,child2] = mother + d*down ; + spouse1 = child1 + betweennodes.rt(p0,child, p0,spouse,spacing) ; + child2 = spouse1 + betweennodes.rt(p0,spouse,p1,child, whatever) ; + spouse2 = child2 + betweennodes.rt(p1,child, p1,spouse,spacing) ; + + % second generation + save grandchild, grandspouse ; pair grandchild[], grandspouse[] ; + grandchild1 = makenode(p0 0,child, "\node{grandchild1}") ; + grandspouse1 = makenode(p0 0,spouse,"\node{spouse}") ; + grandchild2 = makenode(p0 1,child, "\node{grandchild2}") ; + grandspouse2 = makenode(p0 1,spouse,"\node{spouse}") ; + grandchild3 = makenode(p1 0,child, "\node{grandchild3}") ; + grandspouse3 = makenode(p1 0,spouse,"\node{spouse}") ; + grandchild4 = makenode(p1 1,child, "\node{grandchild4}") ; + grandspouse4 = makenode(p1 1,spouse,"\node{spouse}") ; + + .5[grandchild1,grandchild2] = child1 + d*down ; + .5[grandchild3,grandchild4] = child2 + d*down ; + grandchild2 = grandchild1 + betweennodes.rt(p0 0,child,p0 1,child,spacing) ; + grandchild3 = grandchild2 + betweennodes.rt(p0 1,child,p1 0,child,spacing) ; + grandchild4 = grandchild3 + betweennodes.rt(p1 0,child,p1 1,child,spacing) ; + grandspouse1 = grandchild1 + nodeboundingpoint.bot(p0 0,child) + + nodeboundingpoint.lrt(p0 0,spouse) ; + grandspouse2 = grandchild2 + nodeboundingpoint.bot(p0 1,child) + + nodeboundingpoint.lrt(p0 1,spouse) ; + grandspouse3 = grandchild3 + nodeboundingpoint.bot(p1 0,child) + + nodeboundingpoint.lrt(p1 0,spouse) ; + grandspouse4 = grandchild4 + nodeboundingpoint.bot(p1 1,child) + + nodeboundingpoint.lrt(p1 1,spouse) ; + + draw node(p,0) ; + draw node(p,1) withcolor blue ; + + for i=0,1 : + draw node(p[i],child) ; + drawarrow fromtopaths(0,p,0,p[i],child) ; + draw node(p[i],spouse) withcolor blue ; + for j=0,1 : + draw node(p[i][j],child) ; + draw node(p[i][j],spouse) withcolor blue ; + endfor + drawarrow fromtopaths(0,p[i],child,p[i][0],child) ; + drawarrow fromtopaths(0,p[i],child,p[i][1],child) ; + endfor +\stopMPcode +\stopplacefigure + +We leave it as an exercise to the reader to come|-|up with the equations used to +determine this tree (one can look at source of this document, if necessary). + +The requisite set of equations could be hidden from the user wishing to construct +simple, pre|-|defined types of diagrams. However, such cases would involve a loss +of generality and flexibility. Nevertheless, the \ConTeXt-Nodes module \emph +{could} be extended in the future to provide a few simple models. One might be a +branching tree structure, although even the above example (as drawn) does not +easily fit into a simple, general model. + +\blank + +A user on the \CONTEXT\ mailing list asked if it is possible to make structure +trees for English sentences with categorical grammar, an example of which is +shown in \in {Figure} [fig:grammar]. + +\startbuffer +\startMPcode + save p ; path p[] ; + save n ; n = 0 ; + % rather than parsing a string, we can use "suffixes": + forsuffixes $=People,from,the,country,can,become,quite,lonely : + p[n] = makenode(p[n],0,"\node{\it" & (str $) & "}") + = (n,0) ; % we work first with unit paths. + n := n + 1 ; + endfor + save u ; u := MakeupWidth/n ; %(columns) TextWidth/n ; + + % build upward tree + + vardef makeparentnode(text t) = + save i, xsum, xaverage, ymax ; + i = xsum = 0 ; + forsuffixes $ = t : + clearxy ; z = point infinity of $ ; + xsum := xsum + x ; + if unknown ymax : ymax = y ; elseif y > ymax : ymax := y ; fi + i := i + 1 ; + endfor + xaverage = xsum / i ; + ymax := ymax + 1 ; + forsuffixes $ = t : + clearxy ; + z = point infinity of $ ; + $ := $ & z -- (x,ymax) if i>1 : -- (xaverage,ymax) fi ; + endfor + enddef ; + + makeparentnode(p2,p3) ; + makeparentnode(p4,p5) ; + makeparentnode(p6,p7) ; + makeparentnode(p1,p2) ; + makeparentnode(p0,p1) ; + makeparentnode(p4,p6) ; + makeparentnode(p0,p4) ; + makeparentnode(p0) ; + + % the paths are all defined but need to be scaled. + + for i=0 upto n-1 : + p[i] := p[i] xyscaled (u,.8u) ; + draw node(p[i],0) ; + endfor + + save followpath ; boolean followpath ; followpath = true ; + + draw fromtopaths(followpath,p0,0,p0,1,"\node{H:N}") ; + draw fromtopaths(followpath,p1,0,p1,1,"\node{Rel:Prep}") ; + draw fromtopaths(followpath,p2,0,p2,1,"\node{Dr:Dv}") ; + draw fromtopaths(followpath,p3,0,p3,1,"\node{H:N}") ; + draw fromtopaths(followpath,p4,0,p4,1,"\node{M:Aux}") ; + draw fromtopaths(followpath,p5,0,p5,1,"\node{H:Mv}") ; + draw fromtopaths(followpath,p6,0,p6,1,"\node{M:Adv}") ; + draw fromtopaths(followpath,p7,0,p7,1,"\node{H:Adj}") ; + + draw fromtopaths(followpath,p1,1,p1,2) ; + draw fromtopaths(followpath,p2,3,p2,4) ; + draw fromtopaths(followpath,p1,2,p1,3,"\node{M:PP}") ; + draw fromtopaths(followpath,p2,1,p2,2) ; + draw fromtopaths(followpath,p3,1,p3,2) ; + draw fromtopaths(followpath,p2,2,p2,3,"\node{Ax:NP}") ; + draw fromtopaths(followpath,p4,1,p4,2) ; + draw fromtopaths(followpath,p5,1,p5,2) ; + draw fromtopaths(followpath,p4,2,p4,3,"\node{P:VP}") ; + draw fromtopaths(followpath,p6,1,p6,2) ; + draw fromtopaths(followpath,p7,1,p7,2) ; + draw fromtopaths(followpath,p6,2,p6,3,"\node{PCs:AdjP}") ; + draw fromtopaths(followpath,p0,1,p0,2) ; + draw fromtopaths(followpath,p1,3,p1,4) ; + draw fromtopaths(followpath,p0,2,p0,3,"\node{S:NP}") ; + draw fromtopaths(followpath,p4,3,p4,4) ; + draw fromtopaths(followpath,p6,3,p6,4) ; + draw fromtopaths(followpath,p4,4,p4,5,"\node{Pred:PredP}") ; + draw node(p0,4.5,"\node{Cl}") ; + draw fromtopaths(followpath,p0,3,p0,4.5) ; + draw fromtopaths(followpath,p4,5,p4,6) ; +\stopMPcode +\stopbuffer + +\startplacefigure [reference=fig:grammar, + title={A categorical grammer structure tree}] + \getbuffer +\stopplacefigure + +Here, I chose to define a series of parallel paths, one per word, with one path +terminating whenever it joins another path (or paths) at a common parent. +Naturally, labeling each branch of the tree structure requires a knowledge of the +tree structure. The code is not short, but hopefully it is mostly clear. + +\typebuffer [option=TEX] + +Note that diagrams such as those constructed here will each be significantly +different, making the writing of a general mechanism rather complex. For example, +one might need to construct a tree branching up rather than down, or to the right +(or left), or even following an arbitrary path, such as a random walk. These can +all be achieved individually in \METAPOST\ without too much difficulty. + +\stopsubject + +\startsubject [title=A 3D projection] + +Although \METAPOST\ is a 2D drawing language, it can be easily extended to work +in 3D. Several attempts have been made in the past ranging from simple to +complicated. Here, we will take a simple approach. + +The \METAPOST\ language includes a triplet variable type, used to handle \type +{rgb} colors (it also has a quadruplet type used for \type {cmyk} colors). We +will use this \type {triplet} type to hold 3D coordinates. There is a separate +\CONTEXT\ module, entitled \type {three}, which creates a new \METAPOST\ instance +(also named \type {three}), which loads a set of macros that can be used to +manipulate these triplet coordinates. + +\usemodule [three] + +\startTEX +\usemodule [three] + +\startMPcode{three} + % code here +\stopMPcode +\stopTEX + +For our purposes here, only one function is really necessary: \type +{projection()} that maps a 3D coordinate to a 2D projection on the page. This +will not be a perspective projection having a viewpoint and a focus point, but +rather a very simple oblique projection, useful for, e.g., pseudo|-|3D schematic +drawings. The \type {Z} coordinate is taken to be \type {up} and the \type {Y} +coordinate taken to be \type {right}, both in the page of the paper. The third +coordinate \type {X} is an oblique projection in a right|-|hand coordinate +system. + +\page [yes] + +\startbuffer +\startMPcode{three} + save nodepath ; + path nodepath ; + nodepath = (projection Origin -- + projection (1,0,0) -- + projection (1,1,0) -- + projection (0,1,0) -- + projection (0,1,1) -- + projection (1,1,1) -- + projection (1,0,1) -- + projection (0,0,1) -- + cycle) scaled 5cm ; + + draw node(0,"\node{${\cal C}_{i\cal P}^{\mathrm{nt}}$}") ; + draw node(1,"\node{${\cal C}_{i\cal G}^{\mathrm{nt}}$}") ; + draw node(2,"\node{${\cal C}_{j\cal P}^{\mathrm{nt}}$}") ; + draw node(3,"\node{${\cal C}_{j\cal G}^{\mathrm{nt}}$}") ; + draw node(4,"\node{${\cal C}_{j\cal G}$}") ; + draw node(5,"\node{${\cal C}_{j\cal P}$}") ; + draw node(6,"\node{${\cal C}_{i\cal G}$}") ; + draw node(7,"\node{${\cal C}_{i\cal P}$}") ; + + interim crossingscale := 30 ; + drawdoublearrows fromto(0,0,1) ; + drawdoublearrows fromto(0,1,2) ; + drawdoublearrows fromto(0,2,3) ; + drawdoublearrows fromto(0,3,0) crossingunder fromto(0,2,5) ; + + drawdoublearrows fromto(0,7,6) ; + drawdoublearrows fromto(0,6,5) ; + drawdoublearrows fromto.ulft(0,5,4,"\node{$τ_j$~}") ; + drawdoublearrows fromto.top (0,7,4,"\node{$σ$}") ; + + drawdoublearrows fromto.lrt(0,0,7,"\node{$Ψ^{\mathrm{nt}}$}") + crossingunder fromto(0,6,5) ; + drawdoublearrows fromto(0,1,6) ; + drawdoublearrows fromto(0,2,5) ; + drawdoublearrows fromto(0,3,4) ; +\stopMPcode +\stopbuffer + +\startplacefigure [location=right, + reference=fig:cube] + \getbuffer +\stopplacefigure + +Intended for schematic drawings, there is no automatic hidden|-|line removal nor +effects like shading, and line crossings need to be handled manually (using \type +{crossingunder} introduced previously). In \in{Figure} [fig:cube] we draw a +simple cubical commutative diagram, with a node at each corner. + +\typebuffer [option=TEX] + +Note the use of \type {drawdoublearrows}, a new \METAFUN\ command that is +introduced here. + +\stopsubject + +\startsubject [title=Two final examples] + +\startbuffer[mp:tikz-cd] +\startMPcode + save nodepath ; save l ; l = 5ahlength ; + save X, Y, Z, XxY, T ; + pair X, Y, Z, XxY, T ; + XxY.i = 0 ; XxY = makenode(XxY.i,"\node{$X\times_Z Y$}") ; + X.i = 1 ; X = makenode(X.i, "\node{$X$}") ; + Z.i = 2 ; Z = makenode(Z.i, "\node{$Z$}") ; + Y.i = 3 ; Y = makenode(Y.i, "\node{$Y$}") ; + T.i = 4 ; T = makenode(T.i, "\node{$T$}") ; + XxY = origin ; + X = XxY + betweennodes.rt (nodepath,XxY.i,nodepath,X.i) + (l,0) ; + Z = X + betweennodes.bot(nodepath,X.i, nodepath,Z.i) + (0,-.8l); + Y = XxY + betweennodes.bot(nodepath,XxY.i,nodepath,Y.i) + (0,-.8l) ; + T = XxY + nodeboundingpoint.ulft(XxY.i) + + nodeboundingpoint.lft (T.i) + l*dir(135) ; + for i = XxY.i, X.i, Z.i, Y.i, T.i: + draw node(i) ; + endfor + drawarrow fromto.top(0, XxY.i,X.i, "\nodeSmall{$p$}") ; + drawarrow fromto.rt (0, X.i,Z.i, "\nodeSmall{$f$}") ; + drawarrow fromto.top(0, Y.i,Z.i, "\nodeSmall{$g$}") ; + drawarrow fromto.rt (0, XxY.i,Y.i, "\nodeSmall{$q$}") ; + drawarrow fromto.top( .13,T.i,X.i, "\nodeSmall{$x$}") ; + drawarrow fromto.urt(-.13,T.i,Y.i, "\nodeSmall{$y$}") ; + drawarrow fromto (0, T.i,XxY.i,"\nodeSmall{$(x,y)$}") + dashed withdots scaled .5 + withpen currentpen scaled 2 ; +\stopMPcode +\stopbuffer + +% Rather, let's do it similarly to TikZ. + +\startbuffer[mp:tikz-cd] +\startnodes [dx=2.5cm,dy=2cm,alternative=arrow] + \placenode [0, 0] {\node{$X\times_Z Y$}} + \placenode [1, 0] {\node{$X$}} + \placenode [1,-1] {\node{$Z$}} + \placenode [0,-1] {\node{$Y$}} + \placenode [-1,1] {\node{$T$}} + + \connectnodes [0,1] [position=top, label={\nodeSmall{$p$}}] + \connectnodes [1,2] [position=right, label={\nodeSmall{$f$}}] + \connectnodes [0,3] [position=right, label={\nodeSmall{$q$}}] + \connectnodes [3,2] [position=top, label={\nodeSmall{$g$}}] + \connectnodes [4,0] [option=dotted,rulethickness=1pt, + label={\nodeSmall{$(x,y)$}}] + \connectnodes [4,1] [offset=+.13,position=top, + label={\nodeSmall{$x$}}] + \connectnodes [4,3] [offset=-.13,position=topright, + label={\nodeSmall{$y$}}] +\stopnodes +\stopbuffer + +\startplacefigure [reference=fig:tikz-cd, + location={right,+3*hang}] + \getbuffer[mp:tikz-cd] +\stopplacefigure + +We end this manual with two examples of more advanced commutative diagrams. The +following example, shown in \in {Figure} [fig:tikz-cd], illustrates what in +category theory is called a \emph {pullback}. It is inspired from an example +given in the TikZ CD (commutative diagrams) package. + +The arrow labeled \quotation {$(x,y)$} is drawn \type {dashed withdots} and +illustrates how the line gets broken, implicitly \type {crossingunder} its +centered label. + +\typebuffer[mp:tikz-cd] [option=TEX] + +The previous diagram was drawn using the \CONTEXT\ interface. Our final example, +shown in \in {Figure} [fig:tikz-cd2], gives another \quotation {real|-|life} +example of a categorical pullback, also inspired by TikZ-CD, but this time drawn +through the \METAPOST\ interface and solving for positions. + +\startbuffer[mp:tikz-cd2] +\startMPcode + save nodepath ; save l ; l = 5ahlength ; + save A, B, C, D, E ; + pair A, B, C, D, E ; + A.i = 0 ; A = makenode(A.i,"\node{$\pi_1(U_1\cap U_2)$}") ; + B.i = 1 ; B = makenode(B.i, + "\node{$\pi_1(U_1)\ast_{\pi_1(U_1\cap U_2)}\pi_1(U_2)$}") ; + C.i = 2 ; C = makenode(C.i,"\node{$\pi_1(X)$}") ; + D.i = 3 ; D = makenode(D.i,"\node{$\pi_1(U_2)$}") ; + E.i = 4 ; E = makenode(E.i,"\node{$\pi_1(U_1)$}") ; + A = origin ; + B = A + betweennodes.rt(nodepath,A.i,nodepath,B.i) + ( l,0) ; + C = B + betweennodes.rt(nodepath,B.i,nodepath,C.i) + (.7l,0) ; + D = .5[A,B] + (0,-.9l) ; + E = .5[A,B] + (0, .9l) ; + + for i = A.i, B.i, C.i, D.i, E.i : + draw node(i) ; + endfor + drawarrow fromto.llft( 0,A.i,D.i,"\smallnode{$i_2$}") ; + drawarrow fromto.ulft( 0,A.i,E.i,"\smallnode{$i_1$}") ; + drawarrow fromto ( 0,D.i,B.i) ; + drawarrow fromto ( 0,E.i,B.i) ; + drawarrow fromto.urt( .1,E.i,C.i,"\smallnode{$j_1$}") ; + drawarrow fromto.lrt(-.1,D.i,C.i,"\smallnode{$j_2$}") ; + drawarrow fromto.top( 0,B.i,C.i) dashed evenly ; + draw textext.top("{\tfxx\strut$\simeq$}") + shifted point .4 of fromto(0,B.i,C.i) ; +\stopMPcode +\stopbuffer + +\startplacefigure [location=here,reference=fig:tikz-cd2] + \getbuffer[mp:tikz-cd2] +\stopplacefigure + +\typebuffer[mp:tikz-cd2] [option=TEX] + +\stopsubject + +\startsubject [title=Conclusions] + +There was initial consensus at the 2017 \CONTEXT\ Meeting in Maibach, Germany, +where a version of this package was presented, that there was little use of +developing a purely \CONTEXT\ interface. Rather, the \METAPOST\ package should be +sufficiently accessible. Since then, however, we decided that the development of +a derivative \CONTEXT\ interface implementing some basic functionality could +indeed be useful for many users, although it will necessarily remain somewhat +limited. Users are recommended to turn to the pure \METAPOST\ interface when more +sophisticated functionality is needed. + +\stopsubject + +\startsubject [title=Acknowledgements] + +This module was inspired by a request made by Idris Samawi Hamid to draw a +natural transformation diagram (\in{Figure} [fig:natural]). The \METAPOST\ macros +that were developed then benefited from improvements suggested by Hans Hagen as +well as inspiration provided by Taco Hoekwater. + +The cover artwork one can recognize as coming under the hand of Hans Hagen that +he produced when I mentioned that I wanted to do something along these lines. It +fits very well into the style of manual covers that we distribute with \CONTEXT. +This manual therefore has been co|-|written by Hans and Alan. + +\stopsubject + +\startsubject [title=References] + + \placelistofpublications + +\stopsubject + +\stoptitle + +\stoptext diff --git a/doc/context/sources/general/manuals/notnow/notnow-columns-and-notes.tex b/doc/context/sources/general/manuals/notnow/notnow-columns-and-notes.tex new file mode 100644 index 000000000..336c39480 --- /dev/null +++ b/doc/context/sources/general/manuals/notnow/notnow-columns-and-notes.tex @@ -0,0 +1,26 @@ +\usemodule[art-01] + +\starttext + + \samplefile{tufte} + \footnote{\samplefile{tufte}} + + \startitemize[packed,columns] + \startitem one \stopitem + \startitem two \stopitem + \startitem three \footnote{A note (three).} + \stopitem + \startitem four \stopitem + \startitem five \stopitem + \startitem six \stopitem + \startitem seven \stopitem + \startitem eight \stopitem + \stopitemize + + \dorecurse {10} { + \samplefile{ward} + \footnote{Another note #1!} + \par + } + +\stoptext diff --git a/doc/context/sources/general/manuals/notnow/notnow-sidefloats.tex b/doc/context/sources/general/manuals/notnow/notnow-sidefloats.tex new file mode 100644 index 000000000..4a8a1ba3b --- /dev/null +++ b/doc/context/sources/general/manuals/notnow/notnow-sidefloats.tex @@ -0,0 +1,59 @@ +\usemodule[art-01] + +\starttext + +\definefloat + [figure-column] + +\setupfloat + [figure-column] + [default={left,nonumber,none,high}, % high kills sidespacebefore + topoffset=\strutgap] + +\setupfloat + [sidespacebefore=, + sidespaceafter=] + +\enabletrackers[*float*] + +\starttext + +\input ward + +\placefloat + [figure-column][][]{} + {\externalfigure[t:/sources/cow.pdf][width=3cm,frame=on]} + +\input ward + +\placefloat + [figure-column][][]{} + {\externalfigure[t:/sources/cow.pdf][width=3cm,frame=on]} + +\input ward + +\placefloat + [figure-column][][]{} + {\externalfigure[t:/sources/cow.pdf][width=3cm,frame=on]} + +\flushsidefloats + +\input ward + +\page + +\setupfloat + [spacebeforeside=3*big, + spaceafterside=5*big] + +\input ward + +\placefloat + [figure-column][][]{} + {\externalfigure[t:/sources/cow.pdf][width=3cm,frame=on]} + +\flushsidefloats + +\input ward + +\stoptext diff --git a/doc/context/sources/general/manuals/notnow/notnow.tex b/doc/context/sources/general/manuals/notnow/notnow.tex new file mode 100644 index 000000000..e1768db41 --- /dev/null +++ b/doc/context/sources/general/manuals/notnow/notnow.tex @@ -0,0 +1,175 @@ +% language=uk + +\usemodule[typesetting] + +\defineexternalfigure + [typesetting] + [frame=on, + framecolor=darkblue, + rulethickness=1pt] + +\setupcombination + [twopages] + [style=bold, + color=darkblue] + +\setupbodyfont + [ebgaramond,14.4pt] + +\setuphead + [chapter] + [style=\bfc, + header=empty, + color=darkblue] + +\setuplist + [chapter] + [alternative=c, + width=1.5em] + +\setuplayout + [width=middle, + height=middle, + topspace=15mm, + backspace=15mm, + header=15mm, + footer=0mm] + +\setupwhitespace + [big] + +\setuptype + [color=darkblue] + +\setuptyping + [color=darkblue] + +\setuppagenumbering + [alternative=doublesided] + +% \showframe + +\startdocument[author=Hans Hagen] + +\definefont[NotNow][Serif*default @ 18pt]% +\definefont[NotNot][Serif*default @ 2.5pt]% + +\startpagemakeup[pagestate=stop] + \scale[width=\paperwidth,height=\paperheight] \bgroup + \bTABLE[strut=no,height=29.7pt,width=21pt,align={lohi,middle},foregroundcolor=white,framecolor=white,background=color] + \bTR + \bTD[backgroundcolor=darkblue] \NotNow W \eTD + \bTD[backgroundcolor=darkgray] \NotNow H \eTD + \bTD[backgroundcolor=darkblue] \NotNow Y \eTD + \eTR + \bTR + \bTD[backgroundcolor=darkgray] \NotNow N \eTD + \bTD[backgroundcolor=darkblue] \NotNow O \eTD + \bTD[backgroundcolor=darkgray] \NotNow T \eTD + \eTR + \bTR + \bTD[backgroundcolor=darkblue] \NotNow N \eTD + \bTD[backgroundcolor=darkgray] \NotNow O \eTD + \bTD[backgroundcolor=darkblue] \NotNow W \eTD + \eTR + \eTABLE + \egroup +\stoppagemakeup + +\starttitle[title=Contents] + + \placelist[chapter] + +\stoptitle + +\startchapter[title=Introduction] + +You can do a lot in \CONTEXT\ but for sure there are limitations too. There are +quite some sub|-|mechanisms and sometimes there are more solutions for one +problem. For instance, we have several table mechanisms and several +multi|-|column mechanisms. In this document we will collect information about +what doesn't work (well) and if possible indicate why. Feel free to submit more +items. We will also discuss features that do work in most cases but are somewhat +unreliable. + +Does that mean that we cannot make everything work? No, sometimes demands are too +conflicting. Yes, we can implement more, but it simply doesn't pay off to spend +time on writing code that is used seldom. Keep in mind that much of \CONTEXT\ is +written in spare time without any compensation. Publishers have demands but +seldom are willing to pay for it. Users have demands and no means to pay for it. +On the other hand, user demands often have challenging properties that trigger +development. Sometimes a project has as side effect that some mechanism become +better. + +The good news that one can often work around it. Not all typesetting has to be +fully automatic. And there are always reasonable typographic alternatives. The +examples shown here can be run on your machine. + +\stopchapter + +\startchapter[title=Columns and notes] + +Because \TEX\ doesn't really support columns we need to cook up some magic to +achieve them. Especially a mix between single and multi|-|columns is sort of +tricky. Because notes are inserts and inserts play a role in determining the +optimal breakpoints they can interfere badly, depending on the mechanism used. In +\CONTEXT\ we use mixed columns for multi|-|column itemizations and as these can +have footnotes you can end up in troubles. + +\typefile{notnow-columns-and-notes.tex} + +In such case the notes are postponed and flushed {\em after} the itemized list so +they can end up on a next page. If this happens depends on how much room there is +on the page. Solutions are possible (and the old \MKII\ column handler might +behave better in some cases) but it's not worth the trouble to complicate the +already complex code more than needed. Also, it will never be perfect anyway. + +\FirstPages{notnow-columns-and-notes} + +\stopchapter + +\startpagemakeup[pagestate=stop,page=left,doublesided=no] + \scale[width=\paperwidth,height=\paperheight] \bgroup + \bTABLE[strut=no,height=29.7pt,width=21pt,align={lohi,middle},foregroundcolor=white,framecolor=white,background=color] + \bTR + \bTD[backgroundcolor=darkblue] \eTD + \bTD[backgroundcolor=darkgray] \eTD + \bTD[backgroundcolor=darkblue] \eTD + \eTR + \bTR + \bTD[backgroundcolor=darkgray] \eTD + \bTD[backgroundcolor=darkblue] \eTD + \bTD[backgroundcolor=darkgray] \eTD + \eTR + \bTR + \bTD[backgroundcolor=darkblue] \eTD + \bTD[backgroundcolor=darkgray] \eTD + \bTD[backgroundcolor=darkblue,foregroundstyle=\NotNot] + Hans Hagen \vfilll PRAGMA ADE \vfilll Hasselt NL + \eTD + \eTR + \eTABLE + \egroup +\stoppagemakeup + +\startchapter[title=Sidefloats] + +Support for side floats is non|-|trivial and no solution will serve all intended +usage. Over the years we have improved on border cases but it is still not +perfect. For that reason the implementation is (apart from solving bugs, mostly) frozen. +Here is an example of a use case that we ran into. We manipulate the spacing with +an offset parameter. + +\typefile{notnow-sidefloats.tex} + +You can best play with these parameters and see what they do. If you use this +mechanism in a long term project, use a frozen instance of \CONTEXT ! + +\TwoPages{notnow-sidefloats} + +The second pages has preceding and trailing whitespace outside the sidefloat +flow. + +\stopchapter + +\stopdocument diff --git a/doc/context/sources/general/manuals/onandon/m-fonts-plugins-timings-luajittex.lua b/doc/context/sources/general/manuals/onandon/m-fonts-plugins-timings-luajittex.lua new file mode 100644 index 000000000..2bc4e0371 --- /dev/null +++ b/doc/context/sources/general/manuals/onandon/m-fonts-plugins-timings-luajittex.lua @@ -0,0 +1,90 @@ +return { + ["engine"]="luajittex", + ["timings"]={ + ["arabic"]={ + ["list"]={ "arabtype", "husayni" }, + ["results"]={ + ["arabtype"]={ + ["context base"]=0.32, + ["context node"]=7.167, + ["context none"]=0.322, + ["harfbuzz native"]=4.631, + ["harfbuzz uniscribe"]=4.67, + }, + ["husayni"]={ + ["context base"]=0.35, + ["context node"]=12.251, + ["context none"]=0.351, + ["harfbuzz native"]=15.279, + ["harfbuzz uniscribe"]=15.253, + }, + }, + }, + ["latin"]={ + ["list"]={ "modern", "pagella", "dejavu", "cambria", "ebgaramond", "lucidaot" }, + ["results"]={ + ["cambria"]={ + ["context base"]=0.384, + ["context node"]=1.17, + ["context none"]=0.366, + ["harfbuzz native"]=2.907, + ["harfbuzz uniscribe"]=2.863, + }, + ["dejavu"]={ + ["context base"]=0.399, + ["context node"]=0.985, + ["context none"]=0.364, + ["harfbuzz native"]=3.02, + ["harfbuzz uniscribe"]=2.968, + }, + ["ebgaramond"]={ + ["context base"]=0.43, + ["context node"]=1.323, + ["context none"]=0.383, + ["harfbuzz native"]=2.999, + ["harfbuzz uniscribe"]=2.983, + }, + ["lucidaot"]={ + ["context base"]=0.414, + ["context node"]=0.626, + ["context none"]=0.422, + ["harfbuzz native"]=2.606, + ["harfbuzz uniscribe"]=2.594, + }, + ["modern"]={ + ["context base"]=0.418, + ["context node"]=0.773, + ["context none"]=0.383, + ["harfbuzz native"]=3.074, + ["harfbuzz uniscribe"]=3.049, + }, + ["pagella"]={ + ["context base"]=0.436, + ["context node"]=0.803, + ["context none"]=0.416, + ["harfbuzz native"]=3.024, + ["harfbuzz uniscribe"]=3.006, + }, + }, + }, + ["mixed"]={ + ["list"]={ "arabtype", "husayni" }, + ["results"]={ + ["arabtype"]={ + ["context base"]=0.572, + ["context node"]=4.039, + ["context none"]=0.602, + ["harfbuzz native"]=3.69, + ["harfbuzz uniscribe"]=3.686, + }, + ["husayni"]={ + ["context base"]=0.617, + ["context node"]=5.943, + ["context none"]=0.575, + ["harfbuzz native"]=7.193, + ["harfbuzz uniscribe"]=7.109, + }, + }, + }, + }, +}
\ No newline at end of file diff --git a/doc/context/sources/general/manuals/onandon/m-fonts-plugins-timings-luatex.lua b/doc/context/sources/general/manuals/onandon/m-fonts-plugins-timings-luatex.lua new file mode 100644 index 000000000..59606554d --- /dev/null +++ b/doc/context/sources/general/manuals/onandon/m-fonts-plugins-timings-luatex.lua @@ -0,0 +1,90 @@ +return { + ["engine"]="luatex", + ["timings"]={ + ["arabic"]={ + ["list"]={ "arabtype", "husayni" }, + ["results"]={ + ["arabtype"]={ + ["context base"]=0.416, + ["context node"]=15.168, + ["context none"]=0.412, + ["harfbuzz native"]=7.144, + ["harfbuzz uniscribe"]=7.679, + }, + ["husayni"]={ + ["context base"]=0.449, + ["context node"]=26.076, + ["context none"]=0.459, + ["harfbuzz native"]=10.498, + ["harfbuzz uniscribe"]=18.958, + }, + }, + }, + ["latin"]={ + ["list"]={ "modern", "pagella", "dejavu", "cambria", "ebgaramond", "lucidaot" }, + ["results"]={ + ["cambria"]={ + ["context base"]=0.444, + ["context node"]=2.114, + ["context none"]=0.426, + ["harfbuzz native"]=4.587, + ["harfbuzz uniscribe"]=5.026, + }, + ["dejavu"]={ + ["context base"]=0.464, + ["context node"]=1.676, + ["context none"]=0.426, + ["harfbuzz native"]=4.495, + ["harfbuzz uniscribe"]=4.792, + }, + ["ebgaramond"]={ + ["context base"]=0.497, + ["context node"]=2.356, + ["context none"]=0.433, + ["harfbuzz native"]=4.957, + ["harfbuzz uniscribe"]=5.169, + }, + ["lucidaot"]={ + ["context base"]=0.481, + ["context node"]=0.926, + ["context none"]=0.474, + ["harfbuzz native"]=4.28, + ["harfbuzz uniscribe"]=4.685, + }, + ["modern"]={ + ["context base"]=0.477, + ["context node"]=1.227, + ["context none"]=0.439, + ["harfbuzz native"]=5.057, + ["harfbuzz uniscribe"]=5.243, + }, + ["pagella"]={ + ["context base"]=0.502, + ["context node"]=1.273, + ["context none"]=0.469, + ["harfbuzz native"]=4.958, + ["harfbuzz uniscribe"]=5.489, + }, + }, + }, + ["mixed"]={ + ["list"]={ "arabtype", "husayni" }, + ["results"]={ + ["arabtype"]={ + ["context base"]=0.678, + ["context node"]=7.854, + ["context none"]=0.687, + ["harfbuzz native"]=5.822, + ["harfbuzz uniscribe"]=6.214, + }, + ["husayni"]={ + ["context base"]=0.724, + ["context node"]=11.922, + ["context none"]=0.674, + ["harfbuzz native"]=6.929, + ["harfbuzz uniscribe"]=9.851, + }, + }, + }, + }, +}
\ No newline at end of file diff --git a/doc/context/sources/general/manuals/onandon/onandon-decade.tex b/doc/context/sources/general/manuals/onandon/onandon-decade.tex new file mode 100644 index 000000000..890668a5c --- /dev/null +++ b/doc/context/sources/general/manuals/onandon/onandon-decade.tex @@ -0,0 +1,90 @@ +% language=uk + +\startcomponent onandon-decade + +\environment onandon-environment + +\startchapter[title=The first decade] + +When writing this it's hard to believe that we're already a decade working on +\LUATEX\ and about the same time on \MKIV. The question is, did we achieve the +objectives? The answer can easily be \quotation {yes} because we didn't start +with objectives, just with some experiments with a \LUA\ extension interface. +However, it quickly became clear that this was the way to go. Already in an early +stage we took a stand in what direction we had to move. + +How did we end up with \LUA\ and not one of the other popular scripting +languages? The \CONTEXT\ macro package always came with a runner. Not only did +the runner manage the (often) multiple runs, it also took care of sorting the +index and other inter|-|job activities. Additional helpers were written for +installing fonts, managing (and converting) images, job control, etc. First they +were binaries (written in \MODULA\ 2), but successive implementations used \PERL\ +and \RUBY. When I found out that the \SCITE\ editor I switched to had an +extension mechanism using \LUA, I immediately liked that language. It's clean, +not bloated, relatively stable, evolves in an academic environment and is not +driven by commerce and|/|or short term success, and above all, the syntax makes +the code look good. So, it was the most natural candidate for extending \TEX. + +Already for along time, \TEX\ is a stable program and whatever we do with it, we +should not break it. There has been frontend extensions, like \ETEX, and backend +extensions, like \PDFTEX, and experiments like \OMEGA\ and \ALEPH\ and we could +start from there. So, basically we took \PDFTEX, after all, that was what we used +for the first experiments, and merged some \ALEPH\ directional code in it. A +tremendous effort was undertaken (thanks to funding by the Oriental \TEX\ +project) to convert the code base from \PASCAL\ to~\CCODE. + +It is hard to get an agreement over what needs to be added and it's a real waste +of time to enter that route by endless discussions: every \TEX\ user has +different demands and macro packages differ in philosophy . So, in the spirit of +the extension language \LUA\ we stuck to concept of \quotation {If you want it +better, write it in \LUA}. As a consequence we had to provide access to the +internals with efficient and convenient methods, something that happened +stepwise. We did extend the engine with a few features that make live easier but +tried to limit ourselves. On the other hand, due to developments with fonts and +languages we generalized these concepts so that extending and controlling them is +easier. And, due to developments in math font technology we also added +alternative code paths to the math renderer. + +All these matters have been presented and discussed at meetings, in user group +journals and in documents that are part of the \CONTEXT\ suite. And during this +decade the \CONTEXT\ users have been patient testers of whatever we threw at them +in the \MKIV\ version of this macro package. + +It's kind of interesting to note that in the \TEX\ community it takes a while +before version 1 of programs becomes available. Some programs never (seem to) +reach that state. However, for us version 1.0 marks the moment that we consider +the interfaces to be stable. Of course we move on so a version 2.0 can divert and +provide more or even less interfaces, provide new functionality or drop obsolete +features. The intermediate versions (up to version one) were always quite useable +in production. In 2005 the first prototype of \LUATEX\ was demonstrated at the +\TUG\ conference, and in 2007 at the \TUG\ conference we had a whole day on +\LUATEX. At that time \CONTEXT\ \MKIV\ evolved fast and we already had decent +\OPENTYPE\ support as part of the oriental \TEX\ project. It was in those years +that the major reorganization of the code base took place but in successive years +many subsystems were opened and cleaned up. There were some occasions where an +interface was changed for the better but adapting was not that hard. It might +have helped that much of \CONTEXT\ \MKIV\ is written in \LUA. What also helped is +that most \CONTEXT\ users quickly switched to \MKIV, if only because \MKII\ was +frozen. And, thanks to those users, we were able to root out bugs and +bottlenecks. It was interesting to see that the approach of mixing \TEX, +\METAPOST\ and \LUA\ catched on quite well. + +By the end of September 2016, at the 10\high{th} \CONTEXT\ meeting we released +what we call the first long term stable version of \LUATEX. This version performs +quite well but we might still add a few things here and there and the code will be +further cleaned up and documented. In the meantime \LUATEX\ is also used in other +macro packages. It will not replace \PDFTEX\ (at least not soon) because that +engine does the job for most of the publications done in \TEX: articles. As they +are mostly in English and use traditional fonts, there is no need to switch to +the more flexible but somewhat slower \LUATEX. In a similar fashion \XETEX\ +serves those who want the benefits of \PDFTEX, hard|-|coded font support and +token juggling at the \TEX\ level. We will support those engines with \MKII\ but +as mentioned, we will not develop new code for. We strongly advice \CONTEXT\ users +to use \LUATEX\ but there the advertisements stop. Personally I haven't used +\PDFTEX\ (which made \TEX\ survive in the evolving world of electronic documents) +for a decade and I never really used \XETEX\ (which opened up the \TEX\ world to +modern fonts). At least for the coming decade I hope that \LUATEX\ can serve us well. + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/onandon/onandon-editing.tex b/doc/context/sources/general/manuals/onandon/onandon-editing.tex new file mode 100644 index 000000000..c8482397e --- /dev/null +++ b/doc/context/sources/general/manuals/onandon/onandon-editing.tex @@ -0,0 +1,393 @@ +% language=uk + +\startcomponent onandon-editing + +\environment onandon-environment + +\startchapter[title=Editing] + +\startsection[title=Introduction] + +% This introduction is similar to the workflows chapter. + +Some users like the synctex feature that is built in the \TEX\ engines. +Personally I never use it because it doesn't work well with the kind of documents +I maintain. If you have one document source, and don't shuffle around (reuse) +text too much it probably works out okay but that is not our practice. Here I +will describe how you can enable a more \CONTEXT\ specific synctex support so +that aware \PDF\ viewers can bring you back to the source. + +\stopsection + +\startsection[title={The premise}] + +Most of the time we provide our customers with an authoring workflow consisting +of: + +\startitemize[packed] + \startitem the typesetting engine \CONTEXT \stopitem + \startitem the styles to generate the desired \PDF\ files \stopitem + \startitem the text editor \SCITE \stopitem + \startitem the \SUMATRAPDF\ viewer \stopitem +\stopitemize + +For the \MATHML\ we advice the \MATHTYPE\ editor and we provide them with a +customized \MATHML\ translator for the copy & paste actions. When \ASCIIMATH\ is +used to code math no special tools are needed. + +What people operate this workflow? Sometimes it's an author, but most of the time +they are editors with a background in copy|-|editing. We call them \XML\ editors, +because they are maintaining the large (sets of) \XML\ documents and edit +directly in the \XML\ sources. + +Maybe you'll ask yourself \quotation {Can they do that? Can they edit directly in +the \XML\ resource?} The answer is yes, because after they have hit the +processing key they are rewarded with a publishable \PDF\ document in a demanding +layout. + +The \XML\ sources have a dual purpose. They form the basis for: + +\startitemize[packed] + \startitem + all folio products that are generated in \XML\ to \PDF\ workflow(s) + \stopitem + \startitem + the digital web product(s) + \stopitem +\stopitemize + +The \XML\ editors do their proofing chapter|-|wise. Sometimes a chapter is one +big \XML\ file (10.000 lines is no exception when the chapter contains hundreds +of bloated \MATHML\ snippets). In other projects they have to deal with chapters +that are made up of hundreds (100 upto 500) of smaller \XML\ files. + +\stopsection + +\startsection[title={The problem}] + +Let's keep it simple: there's a typo. Here's what an \XML\ editor will do: + +\startitemize[packed] + \startitem + start \SCITE + \stopitem + \startitem + open a file + \stopitem + \startitem + correct the typo + \stopitem + \startitem + generate the \PDF + \stopitem + \startitem + proof the \PDF\ and see if his alteration has some undesired side + effects like text flow of image floating + \stopitem +\stopitemize + +So far so good. When the editor dealing with one big \XML\ file there's no +problem. Hopefully the filename will indicate the specific chapter. He or she +opens the file and searches for the typo. And then correction happens. But what +if there are hundreds of small \XML\ files. How does the editor know in which +file the typo can be found? + +First, let's give a few statistics based on two projects that are in a revision +stage. + +\starttabulate[|c|c|c|c|] +\HL +\NC + project \NC + chapters \NC + \# of files \NC + average \# of lines \NC \NR +\HL +\NC + A \NC + 16 \NC + 16 \NC + 11000 \NC \NR +\NC + B \NC + 132 \NC + 16000\footnote{132 chapters consisting of $\pm 120$ files.} \NC + 100 \NC \NR +\HL +\stoptabulate + +The \XML\ resource passes three stages: a raw, a semi final and a final version. +The raw \XML\ version originates from a web authoring tool that is used by the +author. Then the \PDF\ is proofread and the \XML\ editor goes to work. + +\starttabulate[|l|c|c|] +\HL +\NC + workflow \NC + \# edit locations and adaptations \NC + \# runs\footnote {Maybe you can now see why we put quite some effort in + keeping \CONTEXT\ working at a comfortable speed.} \NC \NR +\HL +\NC + raw to semifinal \NC + 75 \NC + 105 \NC \NR +\NC + semifinal to final \NC + 35 \NC + 55 \NC \NR +\HL +\stoptabulate + +Keep in mind that altering text may cause text to flow and images to float in a +way that an \XML\ editor will have to finetune and needs multiple runs for one +correction. + +Just to give an idea of the work involved. A typical semi final needs some 50 +runs where each run takes 20 seconds (assuming 3 runs to get all cross +referencing right). The numbers of explicit pagebreaks is about 5, and (related +to formulas) explicit linebreaks around 8. It takes some 2 hours to get +everything right, which includes checking in detail, fixing some things and if +needed moving content a bit around. + +Now we broaden the earlier question into: how can we make the work of an \XML\ +editor as easy and efficient as possible? + +\stopsection + +\startsection[title={Enhancing efficiency}] + +Since it is easier to proof content for folio and web via PDF documents we +generate proof \PDF\ files in which the complete content is shown. The proof can +be a massive document. A normal 40 page chapter can explode to 140 pages +visualizing all the content that is coded in the \XML\ file(s). + +The content in the proof is shown in an effective way and a functional order. +Let's give a few examples of how we enhance the \XML\ editors effectiveness: + +\startitemize[packed] + +\startitem + By default the proof \PDF\ file is interactive which serves testing the tocs + and the register. +\stopitem +\startitem + The web hyperlinks are active so their destinatation can be tested. +\stopitem +\startitem + The questions and their answers are displayed in eachothers proximity. This + sounds logical but in folio they are two seperate products (theory and + answer books). +\stopitem +\startitem + Medium specific content (web or folio) is typographically highligthed. For + example by colored backgrounds. +\stopitem +\startitem + When spelling mode is on the \XML\ editor can easily pick out the colored + misspelled words. +\stopitem +\startitem + Images can be active areas although this is of no interest to \XML\ editors. + Clicking the image results in opening the image file in its corresponding + application for maintenance. +\stopitem +\startitem + For practical reasons the filenames and paths of the \XML\ files are + displayed. The filenames are active links and clicking them results in + opening the destination \XML\ file in \SCITE. +\stopitem +\stopitemize + +Okay. The last option is a nice feature. However, the destination file is opened +at the top of the file and you still have to find the typo or whatever +incorrect issue you are looking for. + +So a further enhancement in efficiency would be to jump to the typo's +corresponding line in the \XML\ source. This is where \SYNCTEX\ comes into view. +This feature, present in the \TEX\ engines, provides a way to go from \PDF\ to +source by using a secondary file with positions. Unfortunately that mechanism is +hardly useable for \CONTEXT\ because it assumes a page and file handling model +different from what we use. However, as \CONTEXT\ uses \LUATEX, it can also +provide it's own alternative. + +\stopsection + +% The rest is similar to the workflows chapter. + +\startsection[title=What we want] + +The \SYNCTEX\ method roughly works as follows. Internally \TEX\ constricts linked +lists of glyphs, kerns, glue, boxes, rules etc. These elements are called nodes. +Some nodes carry information about the file and line where they were created. In +the backend this information gets somehow translated in a (sort of) verbose tree +that describes the makeup in terms of boxes, glue and kerns. From that +information the \SYNCTEX\ parser library, hooked into a \PDF\ viewer, can go back +from a position on the screen to a line in a file. One would expect this to be a +relative simple rectangle based model, but as far as I can see it's way more +complex than that. There are some comments that \CONTEXT\ is not supported well +because it has a layered page model, which indicates that there are some +assumptions about how macro packages are supposed to work. Also the used +heuristics not only involve some specific spot (location) but also involve the +corners and edges. It is therefore not so much a (simple) generic system but a +mechanism geared for a macro package like \LATEX. + +Because we have a couple of users who need to edit complex sets of documents, +coded in \TEX\ or \XML, I decided to come up with a variant that doesn't use the +\SYNCTEX\ machinery but manipulates the few \SYNCTEX\ fields directly \footnote {This +is something that in my opinion should have been possible right from the start +but it's too late now to change the system and it would not be used beyond +\CONTEXT\ anyway.} and eventually outputs a straightforward file for the editor. +Of course we need to follow some rules so that the editor can deal with it. It +took a bit of trial and error to get the right information in the support file +needed by the viewer but we got there. + +The prerequisites of a decent \CONTEXT\ \quotation {click on preview and goto +editor} are the following: + +\startitemize + +\startitem + It only makes sense to click on text in the text flow. Headers and footers + are often generated from structure, and special typographic elements can + originate in macros hooked into commands instead of in the source. +\stopitem + +\startitem + Users should not be able to reach environments (styles) and other files + loaded from the (normally read|-|only) \TEX\ tree, like modules. We don't + want accidental changes in such files. +\stopitem + +\startitem + We not only have \TEX\ files but also \XML\ files and these can normally + flush in rather arbitrary ways. Although the concept of lines is sort of + lost in such a file, there is still a relation between lines and the snippets + that make out the content of an \XML\ node. +\stopitem + +\startitem + In the case of \XML\ files the overhead related to preserving line + numbers should be minimal and have no impact on loading and memory when + these features are not used. +\stopitem + +\startitem + The overhead in terms of an auxiliary file size and complexity as well + as producing that file should be minimal. It should be easy to turn on and + off these features. (I'd never turn them on by default.) +\stopitem + +\stopitemize + +It is unavoidable that we get more run time but I assume that for the average user +that is no big deal. It pays off when you have a workflow when a book (or even a +chapter in a book) is generated from hundreds of small \XML\ files. There is no +overhead when \SYNCTEX\ is not used. + +In \CONTEXT\ we don't use the built|-|in \SYNCTEX\ features, that is: we let +filename and line numbers be set but often these are overloaded explicitly. The +output file is not compressed and constructed by \CONTEXT. There is no benefit in +compression and the files are probably smaller than default \SYNCTEX\ anyway. + +\stopsection + +\startsection[title=Commands] + +Although you can enable this mechanism with directives it makes sense to do it +using the following command. + +\starttyping +\setupsynctex[state=start] +\stoptyping + +The advantage of using an explicit command instead of some command line option is +that in an editor it's easier to disable this trickery. Commenting that line will +speed up processing when needed. This command can also be given in an environment +(style). On the command line you can say + +\starttyping +context --synctex somefile.tex +\stoptyping + +A third method is to put this at the top of your file: + +\starttyping +% synctex=yes +\stoptyping + +Often an \XML\ files is very structured and although probably the main body of +text is flushed as a stream, specific elements can be flushed out of order. In +educational documents flushing for instance answers to exercises can happen out of +order. In that case we still need to make sure that we go to the right spot in +the file. It will never be 100\% perfect but it's better than nothing. The +above command will also enable \XML\ support. + +If you don't want a file to be accessed, you can block it: + +\starttyping +\blocksynctexfile[foo.tex] +\stoptyping + +Of course you need to configure the viewer to respond to the request for +editing. In Sumatra combined with SciTE the magic command is: + +\starttyping +c:\data\system\scite\wscite\scite.exe "%f" "-goto:%l" +\stoptyping + +Such a command is independent of the macro package so you can just consult the +manual or help info that comes with a viewer, given that it supports this linking +back to the source at all. + +If you enable tracing (see next section) you can what has become clickable. +Instead of words you can also work with ranges, which not only gives less runtime +but also much smaller \type {.synctex} files. Use + +\starttyping +\setupsynctex[state=start,method=min] +\stoptyping + +to get words clickable and + +\starttyping +\setupsynctex[state=start,method=max] +\stoptyping + +if you want somewhat more efficient ranges. The overhead for \type {min} is about +10 percent while \type {max} slows down around 5 percent. + +\stopsection + +\startsection[title=Tracing] + +In case you want to see what gets synced you can enable a tracker: + +\starttyping +\enabletrackers[system.synctex.visualize] +\enabletrackers[system.synctex.visualize=real] +\stoptyping + +The following tracker outputs some status information about \XML\ flushing. Such +trackers only make sense for developers. + +\starttyping +\enabletrackers[system.synctex.xml] +\stoptyping + +\stopsection + +\startsection[title=Warning] + +Don't turn on this feature when you don't need it. This is one of those mechanism +that hits performance badly. + +Depending on needs the functionality can be improved and|/|or extended. Of course +you can always use the traditional \SYNCTEX\ method but don't expect it to behave +as described here. + +\stopsection + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/onandon/onandon-emoji.tex b/doc/context/sources/general/manuals/onandon/onandon-emoji.tex new file mode 100644 index 000000000..1f67cc528 --- /dev/null +++ b/doc/context/sources/general/manuals/onandon/onandon-emoji.tex @@ -0,0 +1,457 @@ +% language=uk + +\usemodule[fonts-emoji] + +\environment onandon-environment + +% \definefont[MyEmoji][emojionecolor-svginot*default,svg] +% \definefont[MyEmoji][seguiemj*seguiemj-bw] +% \definefont[MyEmoji][emojionemozilla*default,overlay] +% \definefont[MyEmoji][applecoloremoji*default,bitmap] + +\definefontfeature[seguiemj-cl][default][colr=yes,ccmp=yes,dist=yes] +\definefontfeature[seguiemj-bw][default][ccmp=yes,dist=yes] + +\definefont[MyEmoji] [seguiemj*seguiemj-cl] +\definefont[MyEmojiLarge][seguiemj*seguiemj-cl @ 100pt] + +\definefontsynonym[emoji][seguiemj*seguiemj-cl] + +\startcomponent onandon-emoji + +\startchapter[title=Emoji again] + +Because at the \CONTEXT\ 2016 meeting color fonts \footnote {For that occasion +the cowfont, a practical joke concerning Dutch \quote {koeieletters}, were turned +into a color font and presented at the meeting.} were on the agenda, some time +was spent on emoji (these colorful small picture glyphs). When possible I bring +kids to the Bacho\TEX\ conference so for the 2017 BachoTUG I decided to do +something with emoji that, after all, are mostly used by those younger than I am. +So, I had to take a look at the current state. Here are some observations. + +The \UNICODE\ standard defines a whole lot of emoji and if mankind manages to +survive for a while one can assume that a lot more will be added. After all, +icons as well as variants keep evolving. There are several ways to organize these +symbols in groups but I will not give grouping a try. Just visit \type +{emojipedia.org} and you get served well. For this story I only mention that: + +\startitemize + \startitem + There are quite some shapes and nearly all of them are in color. The + yellow ones, smilies and such, are quite prominently present but there + are many more. + \stopitem + \startitem + A special subset is fulled by persons: man, woman, girl, boy and recently + a baby. + \stopitem + \startitem + The grown ups can be combined in loving couples (either or not kissing) + and then can form families, but only upto 2 young kids or gender neutral + babies. + \stopitem + \startitem + All persons can be flagged with one of five skin tones so that not all + persons (or heads) look bright yellow. + \stopitem + \startitem + Interesting is that girls and boys are still fond of magenta (pinkish) + and cyan (blueish) cloths and ornaments. Also haircuts are rather + specific to the gender. + \stopitem +\stopitemize + +For rendering color emojis we have a few color related \OPENTYPE\ font properties +available: bitmaps, \SVG\, and stacked glyphs. Now, if you think of the +combinations that can be made with skin tones, you realize that fonts can become +pretty large if each combination results in a glyph. In the first half of 2017 +\MICROSOFT\ released an update for its emoji font and the company took the +challenge to provide not only mixed skin tone couples, but also supported skin +tones for the kids, including a baby. + +This recent addition already adds over 25.000 additional glyphs \footnote {That +is the amount I counted when I added all combinations runtime but the emojipedia +mentions twice that amount. Currently in \CONTEXT\ we resolve such combinations +when requested.} so imagine what will happen in the future. But, instead of +making a picture for each variant, a different solution has been chosen. For +coloring this seguiemj font uses the (very flexible) stacking technology: a color +shape is an overlay of colored symbols. The colors are organized in pallets and +it's no big deal to add additional pallets if needed. Instead of adding +pre|-|composed shapes (as is needed with bitmaps and \SVG) snippets are used to +build alternative glyphs and these can be combined into new shapes by +substitution and positioning (for that kerns, mark anchoring and distance +compensation is used). + +So, a family can be constructed of composed shapes (man, woman, etc) that each +are composed of snippets (skull, hair, mouth, eyes). So, effectively a family of +four is a bunch of maybe 25 small glyphs overlayed and colored. In \in {figure} +[fig:emojisnippets] we see how a shape is constructed out of separate glyphs. \in +{Figure} [fig:emojisnippetsoverlay] shows how they can be overlayed with colors +(we use a dedicated color set). + +\startplacefigure[title={Emoji snippets.},reference=fig:emojisnippets] + \scale[width=\textwidth]{\framed[frame=off,offset=overlay,align=normal]\bgroup + \forgetall + \MyEmoji + \ShowEmojiSnippets + [family man light skin tone + woman dark skin tone + girl medium skin tone + boy medium skin tone] + \egroup} +\stopplacefigure + +\startplacefigure[title={Emoji snippets overlayed.},reference=fig:emojisnippetsoverlay] + \scale[width=\textwidth]{\framed[frame=off,offset=overlay,align=normal]\bgroup + \forgetall + \MyEmoji + \ShowEmojiSnippetsOverlay + [family man light skin tone + woman dark skin tone + girl medium skin tone + boy medium skin tone] + \egroup} +\stopplacefigure + +When a font supports it, a sequence of emoji can be turned into a more compact +representation. In \in {figure} [fig:emojiskintones] we see how skin tones are +applied in such combinations. \in {Figure} [fig:emojiglyphs] shows the small +snippets. + +\startplacefigure[title={Emoji families and such with skin tones.},reference=fig:emojiskintones,location=page] + \startcombination[2*4] + {\ruledhbox{\MyEmojiLarge\resolvedemoji + {family man woman girl boy}}} + {family man woman girl boy} + {\ruledhbox{\MyEmojiLarge\resolvedemoji + {family woman girl boy}}} + {family woman girl boy} + {\ruledhbox{\MyEmojiLarge\resolvedemoji + {family woman woman girl boy}}} + {family woman woman girl boy} + {\ruledhbox{\MyEmojiLarge\resolvedemoji + {family man girl boy}}} + {family man girl boy} + {\ruledhbox{\MyEmojiLarge\resolvedemoji + {family + man dark skin tone + woman girl baby}}} + {family + man dark skin tone + woman girl baby} + {\ruledhbox{\MyEmojiLarge\resolvedemoji + {family + man light skin tone + woman light skin tone + girl dark skin tone}}} + {family + man light skin tone + woman light skin tone + girl dark skin tone} + {\ruledhbox{\MyEmojiLarge\resolvedemoji + {family woman girl boy}}} + {family woman girl boy} + {\ruledhbox{\MyEmojiLarge\resolvedemoji + {family + man light skin tone + woman dark skin tone + girl medium skin tone + boy medium skin tone}}} + {family + man light skin tone + woman dark skin tone + girl medium skin tone + boy medium skin tone} + \stopcombination +\stopplacefigure + +\startplacefigure[title={Emoji glyphs.},reference=fig:emojiglyphs] + \scale[width=\textwidth]{\framed[frame=off,offset=overlay,align=normal]\bgroup + \forgetall + \MyEmoji + \ShowEmojiGlyphs + [family man light skin tone + woman dark skin tone + girl medium skin tone + boy medium skin tone] + \egroup} +\stopplacefigure + +When we have to choose a font we need to take the following criteria into +account: + +\startitemize +\startitem + What is the quality of the shapes? For sure, outlines are best if you want to + scale too. +\stopitem +\startitem + How efficient is a shape constructed. In that respect a bitmap or \SVG\ image + is just one entity. +\stopitem +\startitem + How well can (semi) arbitrary combinations of emoji be provided. Here the + glyph approach wins. +\stopitem +\startitem + Are all skin colors for all human relates shapes supported? Actually it opens + the possibility for racist fonts. +\stopitem +\startitem + Are all reasonable combinations of persons supported? It looks like (depending + on time and version) kissing men or women can be missing, maybe because of + social political reasons. +\stopitem +\startitem + Are black and white shapes provided alongside color shapes. +\stopitem +\stopitemize + +Maybe an \SVG\ or bitmap image can have a lot of detail compared to a stacked +glyph but, when we're just using pictographic representations, the later is the +best choice. + +When I was playing a bit with the skin tone variants and other combinations that +should result in some composed shape, I used the \UNICODE\ test files but I got +the impression that there are some errors in the test suite, for instance with +respect to modifiers. Maybe the fonts are just doing the wrong thing or maybe +some implement these sequences a bit inconsistent. This will probably improve +over time but the question is if we should intercept issues. I'm not in favour of +this because it adds more and more fuzzy code that not only wastes cycles +(energy) but is also a conceptual horror. So, when testing, imperfection has to +be accepted for now. This is no big deal as until now no one ever asked for emoji +support in \CONTEXT. + +When no combined shape is provided, the original sequence shows up. A side effect +can be that zero|-|width|-| joiners and modifiers become visible. This depends on +the fonts. Users probably don't care that much about it. Now how do we suppose +that users enter these emoji (sequences) in a document source? One can imagine a +pop up in the editor but \TEX ies are often using commands for special cases. + +We already showed some combined shapes. The reader might appreciate the outcome +but getting there from the input takes a bit of work. For instance a two person +\typ {man light skin tone woman medium skin tone girl medium-light skin tone baby +medium-light skin tone} involves this: + +\blank +\start + \setupalign[verytolerant] + \showotfcomposition + {seguiemj*seguiemj-cl} + {1} + {\resolvedemoji{family + man light skin tone + woman medium skin tone + girl medium-light skin tone + baby medium-light skin tone}} +\stop +\blank + +A black and white example is the following \type {family woman girl}: + +\blank +\start + \setupalign[verytolerant] + \showotfcomposition + {seguiemj*seguiemj-bw} + {1} + {\resolvedemoji{family woman girl}} +\stop +\blank + +I will not show all emoji, just the subset that contains the word \type {woman} +in the description. As you can see the persons in the sequences are separated by +a zero|-|width|-|joiner. There are some curious ones, for instance a \typ {woman +wearing turban} which in terms of \UNICODE\ input is a female combine with a +turban wearing man becomes a beardless woman wearing a turban. Woman vampires and +zombies are not supported so these are male properties. + +\startpacked + \MyEmoji + \ShowEmoji[woman] +\stoppacked + +So what if you don't like these colors? Because we're dealing with \TEX\ you can +assume that if there is some way around the fixed color sets, then it will be +provided. So, when you use \CONTEXT, here is away to overload them: + +\startbuffer +\definecolor[emoji-red] [r=.4] +\definecolor[emoji-green] [g=.4] +\definecolor[emoji-blue] [b=.4] +\definecolor[emoji-yellow][r=.4,g=.4] +\definecolor[emoji-gray] [s=1,t=.5,a=1] + +\definefontcolorpalette + [emoji-s] + [black,emoji-gray] + +\definefontcolorpalette + [emoji-r] + [emoji-red,emoji-gray] + +\definefontcolorpalette + [emoji-g] + [emoji-green,emoji-gray] + +\definefontcolorpalette + [emoji-b] + [emoji-blue,emoji-gray] + +\definefontcolorpalette + [emoji-y] + [emoji-yellow,emoji-gray] + +\definefontfeature[seguiemj-s][ccmp=yes,dist=yes,colr=emoji-s] +\definefontfeature[seguiemj-r][ccmp=yes,dist=yes,colr=emoji-r] +\definefontfeature[seguiemj-g][ccmp=yes,dist=yes,colr=emoji-g] +\definefontfeature[seguiemj-b][ccmp=yes,dist=yes,colr=emoji-b] +\definefontfeature[seguiemj-y][ccmp=yes,dist=yes,colr=emoji-y] + +\definefont[MyEmojiS][seguiemj*seguiemj-s] +\definefont[MyEmojiR][seguiemj*seguiemj-r] +\definefont[MyEmojiG][seguiemj*seguiemj-g] +\definefont[MyEmojiB][seguiemj*seguiemj-b] +\definefont[MyEmojiY][seguiemj*seguiemj-y] +\stopbuffer + +\typebuffer \getbuffer + +\startplacefigure[title={Overloading colors by plugging in a sequence of alternate colors.},reference=fig:emojioverload,location=page] +\startcombination[4*6] + {\scale[height=.1\textheight]{\MyEmoji \resolvedemoji{triangular ruler}}} {} + {\scale[height=.1\textheight]{\MyEmoji \resolvedemoji{rabbit face}}} {} + {\scale[height=.1\textheight]{\MyEmoji \resolvedemoji{man}}} {} + {\scale[height=.1\textheight]{\MyEmoji \resolvedemoji{woman}}} {} + {\scale[height=.1\textheight]{\MyEmojiR\resolvedemoji{triangular ruler}}} {} + {\scale[height=.1\textheight]{\MyEmojiR\resolvedemoji{rabbit face}}} {} + {\scale[height=.1\textheight]{\MyEmojiR\resolvedemoji{man}}} {} + {\scale[height=.1\textheight]{\MyEmojiR\resolvedemoji{woman}}} {} + {\scale[height=.1\textheight]{\MyEmojiG\resolvedemoji{triangular ruler}}} {} + {\scale[height=.1\textheight]{\MyEmojiG\resolvedemoji{rabbit face}}} {} + {\scale[height=.1\textheight]{\MyEmojiG\resolvedemoji{man}}} {} + {\scale[height=.1\textheight]{\MyEmojiG\resolvedemoji{woman}}} {} + {\scale[height=.1\textheight]{\MyEmojiB\resolvedemoji{triangular ruler}}} {} + {\scale[height=.1\textheight]{\MyEmojiB\resolvedemoji{rabbit face}}} {} + {\scale[height=.1\textheight]{\MyEmojiB\resolvedemoji{man}}} {} + {\scale[height=.1\textheight]{\MyEmojiB\resolvedemoji{woman}}} {} + {\scale[height=.1\textheight]{\MyEmojiY\resolvedemoji{triangular ruler}}} {} + {\scale[height=.1\textheight]{\MyEmojiY\resolvedemoji{rabbit face}}} {} + {\scale[height=.1\textheight]{\MyEmojiY\resolvedemoji{man}}} {} + {\scale[height=.1\textheight]{\MyEmojiY\resolvedemoji{woman}}} {} + {\scale[height=.1\textheight]{\MyEmojiS\resolvedemoji{triangular ruler}}} {} + {\scale[height=.1\textheight]{\MyEmojiS\resolvedemoji{rabbit face}}} {} + {\scale[height=.1\textheight]{\MyEmojiS\resolvedemoji{man}}} {} + {\scale[height=.1\textheight]{\MyEmojiS\resolvedemoji{woman}}} {} +\stopcombination +\vskip2ex % looks nicer +\stopplacefigure + +In \in {figure} [fig:emojioverload] we see how this is applied. You can provide +as many colors as needed but when you don't provide enough the last one is used. +This way we get the overlayed transparent colors in the examples. By using +transparency we don't obscure shapes. + +The emojipedia mentions \quotation {Asked about the design, \MICROSOFT\ told +emojipedia that one of the reasons for the thick stroke was to allow each emoji +to be easily read on any background color.} The first glyph in the stack seems to +do the trick, so just make sure that it doesn't become white. And, before I read +that remark, while preparing a presentation with a colored background, I had +already noticed that using a background was no problem. This font definitely sets +the standard. + +How do we know what colors are used? The next table shows the first color palette +of seguiemj. There are quite some colors so defining your own definitely involved +some studying. + +{\MyEmoji\ShowEmojiPalettes[1]} + +Normally special symbols are accessed in \CONTEXT\ with the \type {symbol} +command where symbols are organized in symbol sets. This is a rather old +mechanism and dates from the time that fonts were limited in coverage and symbols +were collected in special fonts. The emoji are accessed by their own command: +\type {\emoji}. The font used has the font synonym \type {emoji} so you need to +set that one first: + +\starttyping +\definefontsynonym[emoji][seguiemj*seguiemj-cl] +\stoptyping + +Here is an example: + +\startbuffer +\emoji{woman light skin tone}\quad +\emoji{woman scientist}\quad +{\bfd bigger \emoji{man health worker}} +\stopbuffer + +\typebuffer + +or typeset: \getbuffer + +The emoji symbol scales with the normal running font. When you ask for a family +with skin toned members the lookup can result in another match (or no match) +because one never knows to what extend a font supports it. + +\starttabulate[|l|p|] +\NC \type{\expandedemoji} \NC the sequence constructed from the given string \NC \NR +\NC \type{\resolvedemoji} \NC a protected sequence constructed from the given string \NC \NR +\NC \type{\checkedemoji } \NC an typeset sequence with unresolved modifiers and joiners removed \NC \NR +\NC \type{\emoji} \NC a typeset resolved sequence using the \type {emoji} font synonym \NC \NR +\NC \type{\robustemoji} \NC a typeset checked sequence using the \type {emoji} font synonym \NC \NR +\stoptabulate + +In case you wonder how some of the details above were typeset, there is a module +\type {fonts-emoji} that provides some helpers for introspection. + +\starttabulate[|l|p|] +\NC \type {\ShowEmoji} \NC show all the emoji in the current font \NC \NR +\NC \type {\ShowEmojiSnippets} \NC show the snippets of a given emoji \NC \NR +\NC \type {\ShowEmojiSnippetsOverlay} \NC show the overlayed snippets of a given emoji \NC \NR +\NC \type {\ShowEmojiGlyphs} \NC show the snippets of a typeset emoji \NC \NR +\NC \type {\ShowEmojiPalettes} \NC show the color pallets in the current font \NC \NR +\stoptabulate + +Examples of usage are: + +\starttyping +\ShowEmojiSnippets[family man woman girl boy] +\ShowEmojiGlyphs [family man woman baby girl] +\ShowEmoji [^man] +\ShowEmoji +\ShowEmojiPalettes +\ShowEmojiPalettes[1] +\stoptyping + +A good source of information about emoji is the mentioned \type {emojipedia.org} +website. There you find not only details about all these symbols but also has +some history. It compares updates in fonts too. It mentions for instance that in +the creative update of Windows 10, some persons grew beards in the seguiemj font +and others lost an eye. Now, if you look at the snippets shown before, you can +wonder if that eye is really gone. Maybe the color is wrong or the order of +stacking is not right. I decided not to waste time looking into that. + +Another quote: \quotation {Support for color emoji presentation on \MSWINDOWS\ is +limited. Many applications on \MSWINDOWS\ display emojis with a black and white +text presentation instead of their color version.} Well, we can do better with +\TEX, but as usual not that many people really cares about that. But it's fun +anyway. + +We end with a warning. When you use \quote {ligatures} like this, you really need +to check the outcome. For instance, when \MICROSOFT\ updated the font end 2017, +same gender couples got different hair style for the individuals so that one can +still distinguish them. However, kissing couples and couples in love (indicated +by a heart) seem to be removed. Who knows how and when politics creep into fonts: +is public mixed couple kissing permitted, do we support families with any mix of +gender, is associating pink with girls okay or not, how do we distinguish male +and female anyway? In \in {figure} [fig:old-and-new] we see the same combination +twice, the early 2017 rendering versus the late 2017 rendering. Can you notice +the differences? + +\startplacefigure[title={Incompatible updates.},reference=fig:old-and-new] + \externalfigure[onandon-seguiemj.pdf][width=\textwidth] +\stopplacefigure + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/onandon/onandon-ffi.tex b/doc/context/sources/general/manuals/onandon/onandon-ffi.tex new file mode 100644 index 000000000..01c1bb4c5 --- /dev/null +++ b/doc/context/sources/general/manuals/onandon/onandon-ffi.tex @@ -0,0 +1,554 @@ +% language=uk + +\startcomponent onandon-ffi + +\environment onandon-environment + +\startchapter[title={Plug mode, an application of ffi}] + +A while ago, at an NTG meeting, Kai Eigner and Ivo Geradts demonstrated how to +use the Harfbuzz (hb) library for processing \OPENTYPE\ fonts. The main +motivation for them playing with that was that it provides a way to compare the +\LUA\ based font machinery with other methods. They also assumed that it would +give a better performance for complex fonts and|/|or scripts. + +One of the guiding principles of \LUATEX\ development is that we don't provide +hard coded solutions. For that reason we opened up the internals so that one can +provide solutions written in pure \LUA, but, of course, one can cooperate with +libraries via \LUA\ code as well. Hard coding solutions makes no sense as there +are often several solutions possible, depending on one's need. Although +development is closely related to \CONTEXT, the development of the \LUATEX\ +engine is generic. We try to be macro package agnostic. Already in an early stage +we made sure that the \CONTEXT\ font handler could be used in other packages as +well, but one can easily dream up light weight variants for specific purposes. +The standard \TEX\ font handling was kept and is called \type {base} mode in +\CONTEXT. The \LUA\ variant is tagged \type {node} mode because it operates on +the node list. Later we will refer to these modes. + +With the output of \XETEX\ for comparison, the first motive mentioned for looking +into support for such a library is not that strong. And when we want to test +against the standard, we can use MS-Word. A minimal \CONTEXT\ \MKIV\ installation +one only has the \LUATEX\ engine. Maintaining several renderers simultaneously +might give rise to unwanted dependencies. + +The second motive could be more valid for users because, for complex fonts, there +is|=|or at least was|=|a performance hit with the \LUA\ variant. Some fonts use +many lookup steps or are inefficient even in using their own features. It must be +said that till now I haven't heard \CONTEXT\ users complain about speed. In fact, +the font handling became many times faster the last few years, and probably no +one even noticed. Also, when using alternatives to the built in methods, in the +end, you will loose functionality and|/|or interactions with other mechanisms +that are built into the current font system. Any possible gain in speed is lost, +or even becomes negative, when a user wants to use additional functionality that +requires additional processing. \footnote {In general we try to stay away from +libraries. For instance, graphics can be manipulated with external programs, and +caching the result is much more efficient than recreating it. Apart from \SQL\ +support, where integration makes sense, I never felt the need for libraries. And +even \SQL\ can efficiently be dealt with via intermediate files.} + +Just kicking in some alternative machinery is not the whole story. We still need +to deal with the way \TEX\ sees text, and that, in practice, is as a sequence of +glyph nodes|=|mixed with discretionaries for languages that hyphenate, glue, +kern, boxes, math, and more. It's the discretionary part that makes it a bit +complex. In contextual analysis as well as positioning one needs to process up to +three additional cases: the pre, post and replace texts|=|either or not linked +backward and forward. And as applied features accumulate one ends up winding and +unwinding these snippets. In the process one also needs to keep an eye on spaces +as they can be involved in lookups. Also, when injecting or removing glyphs one +needs to deal with attributes associated with nodes. Of course something hard +codes in the engine might help a little, but then one ends up with the situation +where macro packages have different demands (and possible interactions) and no +solution is the right one. Using \LUA\ as glue is a way to avoid that problem. In +fact, once we go along that route, it starts making sense to come up with a +stripped down \LUATEX\ that might suit \CONTEXT\ better, but it's not a route we +are eager to follow right now. + +Kai and Ivo are plain \TEX\ users so they use a font definition and switching +environment that is quite different from \CONTEXT. In an average \CONTEXT\ run +the time spent on font processing is measurable but not the main bottleneck +because other time consuming things happen. Sometimes the load on the font +subsystem can be higher because we provide additional features normally not found +in \OPENTYPE. Add to that a more dynamic font model and it will be clear that +comparing performance between situations that use different macro packages is not +that trivial (or relevant). + +More reasons why we follow a \LUA\ route are that we: support (run time +generated) virtual fonts, are able to kick in additional features, can let the +font mechanism cooperate with other functionality, and so on. In the upcoming +years more trickery will be provided in the current mechanisms. Because we had to +figure out a lot of these \OPENTYPE\ things a decade ago when standards were +fuzzy quite some tracing and visualization is available. Below we will see some +timings, It's important to keep in mind that in \CONTEXT\ the \OPENTYPE\ font +handler can do a bit more if requested to do so, which comes with a bit of +overhead when the handler is used in \CONTEXT|=|something we can live with. + +Some time after Kai's presentation he produced an article, and that was the +moment I looked into the code and tried to replicate his experiments. Because +we're talking libraries, one can understand that this is not entirely trivial, +especially because I'm on another platform than he is|=|Windows instead of OSX. +The first thing that I did was rewrite the code that glues the library to \TEX\ +in a way that is more suitable for \CONTEXT. Mixing with existing modes (\type +{base} or \type {node} mode) makes no sense and is asking for unwanted +interferences, so instead a new \type {plug} mode was introduced. A sort of +general text filtering mechanism was derived from the original code so that we +can plug in whatever we want. After all, stability is not the strongest point of +today's software development, so when we depend on a library, we need to be +prepared for other (library based) solutions|=|for instance, if I understood +correctly, \XETEX\ switched a few times. + +After redoing the code the next step was to get the library running and I decided +that the \type {ffi} route made most sense. \footnote {One can think of a +intermediate layer but I'm pretty sure that I have different demands than others, +but \type {ffi} sort of frees us from endless discussions.} Due to some expected +functions not being supported, my efforts in using the library failed. At that +time I thought it was a matter of interfacing, but I could get around it by +piping into the command line tools that come with the library, and that was good +enough for testing. Of course it was dead slow, but the main objective was +comparison of rendering so it doesn't matter that much. After that I just quit +and moved on to something else. + +At some point Kai's article came close to publishing, and I tried the old code +again, and, surprise, after some messing around, the library worked. On my system +the one shipped with Inkscape is used, which is okay as it frees me from bothering +about installations. As already mentioned, we have no real reason in \CONTEXT\ +for using fonts libraries, but the interesting part was that it permitted me to +play with this so called \type {ffi}. At that moment it was only available in +\LUAJITTEX\. Because that creates a nasty dependency, after a while, Luigi +Scarso and I managed to get a similar library working in stock \LUATEX\, which is +of course the reference. So, I decided to give it a second try, and in the process +I rewrote the interfacing code. After all, there is no reason not to be nice for +libraries and optimize the interface where possible. + +Now, after a decade of writing \LUA\ code, I dare to claim that I know a bit +about how to write relatively fast code. I was surprised to see that where Kai +claimed that the library was faster than the \LUA\ code.I saw that it really +depends on the font. Sometimes the library approach is actually slower, which is +not what one expects. But remember that one argument for using a library is for +complex fonts and scripts. So what is meant with complex? + +Most Latin fonts are not complex|=|ligatures and kerns and maybe a little bit of +contextual analysis. Here the \LUA\ variant is the clear winner. It runs upto ten +times faster. For more complex Latin fonts, like EBgaramond, that resolves +ligatures in a different way, the library catches up, but still the \LUA\ handler +is faster. Keep in mind that we need to juggle discretionary nodes in any case. +One difference between both methods is that the \LUA\ handler runs over all the +lists (although it has to jump over fonts not being processed then), while the +library gets snippets. However, tests show that the overhead involved in that is +close to zero and can be neglected. Already long ago we saw that when we compared +\MKIV\ \LUATEX\ and \MKII\ \XETEX, the \LUA\ based font handler is not that slow +at all. This makes sense because the problem doesn't change, and maybe more +importantly because \LUA\ is a pretty fast language. If one or the other approach +is less that two times faster the gain will probably go unnoticed in real runs. +In my experience a few bad choices in macro or style writing is more harmful than +a bit slower font machinery. Kick in some additional node processing and it might +make comparison of a run even harder. By the way, one reason why font handling +has been sped up over the years is because our workflows sometimes have a high +load, and, for instance, processing a set of 5 documents remotely has to be fast. +Also, in an edit workflow you want the runtime to be a bit comfortable. + +Contrary to Latin, a pure Arabic text (normally) has no discretionary nodes, and +the library profits most of this. Some day I have to pick up the thread with +Idris about the potential use of discretionary nodes in Arabic typesetting. +Contrary to Arabic, Latin text has not many replacements and positioning, and, +therefore, the \LUA\ variant gets the advantage. Some of the additional features +that the \LUA\ variant provides can, of course, be provided for the library +variant by adding some pre- and postprocessing of the list, but then you quickly +loose any gain a library provides. So, Arabic has less complex node lists with no +branches into discretinaries, but it definitely has more replacements, +positioning and contextual lookups due to the many calls to helpers in the \LUA\ +code. Here the library should win because it can (I assume) use more optimized +datastructures. + +In Kai's prototype there are some cheats for right|-|to|-|left rendering and +special scripts like Devanagari. As these tweaks mostly involve discretionary +nodes; there is no real need for them. When we don't hyphenate no time is wasted +anyway. I didn't test Devanagari, but there is some preprocessing needed in the +\LUA\ variant (provided by Kai and Ivo) that I might rewrite from scratch once I +understand what happens there. But still, I expect the library to perform +somewhat better there but I didn't test it. Eventually I might add support for +some more scripts that demand special treatments, but so far there has not been +any request for it. + +So what is the processing speed of non|-|Latin scripts? An experiment with Arabic +using the frequently used Arabtype font showed that the library performs faster, +but when we use a mixed Latin and Arabic document the differences become less +significant. On pure Latin documents the \LUA\ variant will probably win. On pure +Arabic the library might be on top. On average there is little difference in +processing speed between the \LUA\ and library engines when processing mixed +documents. The main question is, does one want to loose functionality provided by +the \LUA\ variant? Of course one can depend on functionality provided by the +library but not by the \LUA\ variant. In the end the user decides. + +How did we measure? The baseline measurement is the so called \type {none} mode: +nothing is done there. It's fast but still takes a bit of time as it is triggered +by a general mode identifying pass. That pass determines what font processing +modes are needed for a list. \type {Base} mode only makes sense for Latin and has +some limitations. It's fast and, basically, its run time can be neglected. That's +why, for instance, \PDFTEX\ is faster than the other engines, but it doesn't do +\UNICODE\ well. \type {Node} mode is the fancy name for the \LUA\ font handler. +So, in order of increasing run time we have: \type {none}, \type {base} and \type +{node}. If we compare \type{node} mode with \type {plug} mode (in our case using +the hb library), we can subtract \type {none} mode. This gives a cleaner (more +distinctive) comparison but not a real honest one because the identifying pass +always happens. + +We also tested with and without hyphenation, but in practice that makes no sense. +Only verbatim is typeset that way, and normally we typeset that in \type {none} +mode anyway. On the other hand mixing fonts does happen. All the tests start with +forced garbage collection in order to get rid of that variance. We also pack into +horizontal boxes so that the par builder (with all kind of associated callbacks) +doesn't kick in, although the \type {node} mode should compensate that. + +Keep in mind that the tests are somewhat dumb. There is no overhead in handling +structure, building pages, adding color or whatever. I never process raw text. As +a reference it's no problem to let \CONTEXT\ process hundreds of pages per +second. In practice a moderate complex document like the metafun manual does some +20 pages per second. In other words, only a fraction of the time is spent on +fonts. The timings for \LUATEX\ are as follows: + +\usemodule[m-fonts-plugins] + +\startluacode + local process = moduledata.plugins.processlist + local data = table.load("m-fonts-plugins-timings-luatex.lua") + or table.load("t:/sources/m-fonts-plugins-timings-luatex.lua") + + context.testpage { 6 } + context.subsubject("luatex latin") + process(data.timings.latin) + context.testpage { 6 } + context.subsubject("luatex arabic") + process(data.timings.arabic) + context.testpage { 6 } + context.subsubject("luatex mixed") + process(data.timings.mixed) +\stopluacode + +The timings for \LUAJITTEX\ are, of course, overall better. This is because the +virtual machine is faster, but at the cost of some limitations. We seldom run +into these limitations, but fonts with large tables can't be cached unless we +rewrite some code and sacrifice clean solutions. Instead, we perform a runtime +conversion which is not that noticeable when it's just a few fonts. The numbers +below are not influenced by this as the test stays away from these rare cases. + +\startluacode + local process = moduledata.plugins.processlist + local data = table.load("m-fonts-plugins-timings-luajittex.lua") + or table.load("t:/sources/m-fonts-plugins-timings-luajittex.lua") + + context.testpage { 6 } + context.subsubject("luajittex latin") + process(data.timings.latin) + context.testpage { 6 } + context.subsubject("luajittex arabic") + process(data.timings.arabic) + context.testpage { 6 } + context.subsubject("luajittex mixed") + process(data.timings.mixed) +\stopluacode + +A few side notes. Since a library is an abstraction, one has to live with what +one gets. In my case that was a crash in \UTF-32 mode. I could get around it, but +one advantage of using \LUA\ is that it's hard to crash|=|if only because as a +scripting language it manages its memory well without user interference. My +policy with libraries is just to wait till things get fixed and not bother with +the why and how of the internals. + +Although \CONTEXT\ will officially support the \type {plug} model, it will not be +actively used by me, or in documentation, so for support users are on their own. +I didn't test the \type {plug} mode in real documents. Most documents that I +process are Latin (or a mix), and redefining feature sets or adapting styles for +testing makes no sense. So, can one just switch engines without looking at the +way a font is defined? The answer is|=|not really, because (even without the user +knowing about it) virtual fonts might be used, additional features kicked in and +other mechanisms can make assumptions about how fonts are dealt with too. + +The useability of \type {plug} mode probably depends on the workflow one has. We +use \CONTEXT\ in a few very specific workflows where, interestingly, we only use a +small subset of its functionality. Most of which is driven by users, and tweaking +fonts is popular and has resulted in all kind of mechanisms. So, for us it's +unlikely that we will use it. If you process (in bursts) many documents in +succession, each demanding a few runs, you don't want to sacrifice speed. + +Of course timing can (and likely will) be different for plain \TEX\ and \LATEX\ +usage. It depends on how mechanisms are hooked into the callbacks, what extra +work is done or not done compared to \CONTEXT. This means that my timings for +\CONTEXT\ for sure will differ from those of other packages. Timings are a +snapshot anyway. And as said, font processing is just one of the many things that +goes on. If you are not using \CONTEXT\ you probably will use Kai's version +because it is adapted to his use case and well tested. + +A fundamental difference between the two approaches is that|=|whereas the \LUA\ +variant operates on node lists only, the \type {plug} variant generates strings +that get passed to a library where, in the \CONTEXT\ variant of hb support, we +use \UTF-32 strings. Interesting, a couple of years ago I considered using a +similar method for \LUA\ but eventually decided against it, first of all for +performance reasons, but mostly because one still has to use some linked list +model. I might pick up that idea as a variant, but because all this \TEX\ related +development doesn't really pay off and costs a lot of free time it will probably +never happen. + +I finish with a few words on how to use the plug model. Because the library +initializes a default set of features,\footnote {Somehow passing features to the +library fails for Arabic. So when you don't get the desired result, just try with +the defaults.} all you need to do is load the plugin mechanism: + +\starttyping +\usemodule[fonts-plugins] +\stoptyping + +Next you define features that use this extension: + +\starttyping +\definefontfeature + [hb-native] + [mode=plug, + features=harfbuzz, + shaper=native] +\stoptyping + +After this you can use this feature set when you define fonts. Here is a complete +example: + +\starttyping +\usemodule[fonts-plugins] + +\starttext + + \definefontfeature + [hb-library] + [mode=plug, + features=harfbuzz, + shaper=native] + + \definedfont[Serif*hb-library] + + \input ward \par + + \definefontfeature + [hb-binary] + [mode=plug, + features=harfbuzz, + method=binary, + shaper=uniscribe] + + \definedfont[Serif*hb-binary] + + \input ward \par + +\stoptext +\stoptyping + +The second variant uses the \type {hb-shape} binary which is, of course, pretty +slow, but does the job and is okay for testing. + +There are a few trackers available too: + +\starttyping +\enabletrackers[fonts.plugins.hb.colors] +\enabletrackers[fonts.plugins.hb.details] +\stoptyping + +The first one colors replaced glyphs while the second gives lot of information +about what is going on. If you want to know what gets passed to the library you +can use the \type {text} plugin: + +\starttyping +\definefontfeature[test][mode=plug,features=text] +\start + \definedfont[Serif*test] + \input ward \par +\stop +\stoptyping + +This produces something: + +\starttyping[style=\ttx] +otf plugin > text > start run 3 +otf plugin > text > 001 : [-] The [+]-> U+00054 U+00068 U+00065 +otf plugin > text > 002 : [+] Earth, [+]-> U+00045 U+00061 U+00072 ... +otf plugin > text > 003 : [+] as [+]-> U+00061 U+00073 +otf plugin > text > 004 : [+] a [+]-> U+00061 +otf plugin > text > 005 : [+] habi- [-]-> U+00068 U+00061 U+00062 ... +otf plugin > text > 006 : [-] tat [+]-> U+00074 U+00061 U+00074 +otf plugin > text > 007 : [+] habitat [+]-> U+00068 U+00061 U+00062 ... +otf plugin > text > 008 : [+] for [+]-> U+00066 U+0006F U+00072 +otf plugin > text > 009 : [+] an- [-]-> U+00061 U+0006E U+0002D +\stoptyping + +You can see how hyphenation of \type {habi-tat} results in two snippets and a +whole word. The font engine can decide to turn this word +into a disc node with a pre, post and replace text. Of course the machinery will +try to retain as many hyphenation points as possible. Among the tricky parts of +this are lookups across and inside discretionary nodes resulting in (optional) +replacements and kerning. You can imagine that there is some trade off between +performance and quality here. The results are normally acceptable, especially +because \TEX\ is so clever in breaking paragraphs into lines. + +Using this mechanism (there might be variants in the future) permits the user to +cook up special solutions. After all, that is what \LUATEX\ is about|=|the +traditional core engine with the ability to plug in your own code using \LUA. +This is just an example of it. + +I'm not sure yet when the plugin mechanism will be in the \CONTEXT\ distribution, +but it might happen once the \type {ffi} library is supported in \LUATEX. At the +end of this document the basics of the test setup are shown, just in case you +wonder what the numbers apply to. + +Just to put things in perspective, the current (February 2017) \METAFUN\ manual +has 424 pages. It takes \LUATEX\ 18.3 seconds and \LUAJITTEX\ 14.4 seconds on my +Dell 7600 laptop with 3840QM mobile i7 processor. Of this 6.1 (4.5) seconds is +used for processing 2170 \METAPOST\ graphics. Loading the 15 fonts used takes +0.25 (0.3) seconds, which includes also loading the outline of some. Font +handling is part of the, so called, hlist processing and takes around 1 (0.5) +second, and attribute backend processing takes 0.7 (0.3) seconds. One problem in +these timings is that font processing often goes too fast for timing, especially +when we have lots of small snippets. For example, short runs like titles and such +take no time at all, and verbatim needs no font processing. The difference in +runtime between \LUATEX\ and \LUAJITTEX\ is significant so we can safely assume +that we spend some more time on fonts than reported. Even if we add a few +seconds, in this rather complete document, the time spent on fonts is still not +that impressive. A five fold increase in processing (we use mostly Pagella and +Dejavu) is a significant addition to the total run time, especially if you need a +few runs to get cross referencing etc.\ right. + +The test files are the familiar ones present in the distribution. The \type +{tufte} example is a good torture test for discretionary processing. We preload +the files so that we don't have the overhead of \type {\input}. + +\starttyping +\edef\tufte{\cldloadfile{tufte.tex}} +\edef\khatt{\cldloadfile{khatt-ar.tex}} +\stoptyping + +We use six buffers for the tests. The Latin test uses three fonts and also +has a paragraph with mixed font usage. Loading the fonts happens once before +the test, and the local (re)definition takes no time. Also, we compensate +for general overhead by subtracting the \type {none} timings. + +\starttyping +\startbuffer[latin-definitions] +\definefont[TestA][Serif*test] +\definefont[TestB][SerifItalic*test] +\definefont[TestC][SerifBold*test] +\stopbuffer + +\startbuffer[latin-text] +\TestA \tufte \par +\TestB \tufte \par +\TestC \tufte \par +\dorecurse {10} {% + \TestA Fluffy Test Font A + \TestB Fluffy Test Font B + \TestC Fluffy Test Font C +}\par +\stopbuffer +\stoptyping + +The Arabic tests are a bit simpler. Of course we do need to make sure that we go +from right to left. + +\starttyping +\startbuffer[arabic-definitions] +\definedfont[Arabic*test at 14pt] +\setupinterlinespace[line=18pt] +\setupalign[r2l] +\stopbuffer + +\startbuffer[arabic-text] +\dorecurse {10} { + \khatt\space + \khatt\space + \khatt\blank +} +\stopbuffer +\stoptyping + +The mixed case use a Latin and an Arabic font and also processes a mixed script +paragraph. + +\starttyping +\startbuffer[mixed-definitions] +\definefont[TestL][Serif*test] +\definefont[TestA][Arabic*test at 14pt] +\setupinterlinespace[line=18pt] +\setupalign[r2l] +\stopbuffer + +\startbuffer[mixed-text] +\dorecurse {2} { + {\TestA\khatt\space\khatt\space\khatt} + {\TestL\lefttoright\tufte} + \blank + \dorecurse{10}{% + {\TestA وَ قَرْمِطْ بَيْنَ الْحُرُوفِ؛ فَإِنَّ} + {\TestL\lefttoright A snippet text that makes no sense.} + } +} +\stopbuffer +\stoptyping + +The related font features are defined as follows: + +\starttyping +\definefontfeature + [test-none] + [mode=none] + +\definefontfeature + [test-base] + [mode=base, + liga=yes, + kern=yes] + +\definefontfeature + [test-node] + [mode=node, + script=auto, + autoscript=position, + autolanguage=position, + ccmp=yes,liga=yes,clig=yes, + kern=yes,mark=yes,mkmk=yes, + curs=yes] + +\definefontfeature + [test-text] + [mode=plug, + features=text] + +\definefontfeature + [test-native] + [mode=plug, + features=harfbuzz, + shaper=native] + +\definefontfeature + [arabic-node] + [arabic] + +\definefontfeature + [arabic-native] + [mode=plug, + features=harfbuzz, + script=arab,language=dflt, + shaper=native] +\stoptyping + +The timings are collected in \LUA\ tables and typeset afterwards, so there is no +interference there either. + +{\em The timings are as usual a snapshot and just indications. The relative times +can differ over time depending on how binaries are compiled, libraries are +improved and \LUA\ code evolves. In node mode we can have experimental trickery +that is not yet optimized. Also, especially with complex fonts like Husayni, not +all shapers give the same result, although node mode and Uniscribe should be the +same in most cases. A future (public) version of Husayni will play more safe and +use less complex sequences of features.} + +% And for the record: when I finished it, this 12 page documents processes in +% roughly 1~second with \LUATEX\ and 0.8 second with \LUAJITTEX\ which is okay for +% a edit|-|preview cycle. + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/onandon/onandon-performance.tex b/doc/context/sources/general/manuals/onandon/onandon-performance.tex new file mode 100644 index 000000000..279383a8c --- /dev/null +++ b/doc/context/sources/general/manuals/onandon/onandon-performance.tex @@ -0,0 +1,785 @@ +% language=uk + +% no zero timing compensation, just simple tests +% m4all book + +\startcomponent onandon-performance + +\environment onandon-environment + +\startchapter[title=Performance] + +\startsection[title=Introduction] + +This chapter is about performance. Although it concerns \LUATEX\ this text is +only meant for \CONTEXT\ users. This is not because they ever complain about +performance, on the contrary, I never received a complain from them. No, it's +because it gives them some ammunition against the occasionally occurring nagging +about the speed of \LUATEX\ (somewhere on the web or at some meeting). My +experience is that in most such cases those complaining have no clue what they're +talking about, so effectively we could just ignore them, but let's, for the sake +of our users, waste some words on the issue. + +\stopsection + +\startsection[title=What performance] + +So what exactly does performance refer to? If you use \CONTEXT\ there are +probably only two things that matter: + +\startitemize[packed] +\startitem How long does one run take. \stopitem +\startitem How many runs do I need. \stopitem +\stopitemize + +Processing speed is reported at the end of a run in terms of seconds spent on the +run, but also in pages per second. The runtime is made up out of three +components: + +\startitemize[packed] +\startitem start-up time \stopitem +\startitem processing pages \stopitem +\startitem finishing the document \stopitem +\stopitemize + +The startup time is rather constant. Let's take my 2013 Dell Precision with +i7-3840QM as reference. A simple + +\starttyping +\starttext +\stoptext +\stoptyping + +document reports 0.4 seconds but as we wrap the run in an \type {mtxrun} +management run we have an additional 0.3 overhead (auxiliary file handling, \PDF\ +viewer management, etc). This includes loading the Latin Modern font. With +\LUAJITTEX\ these times are below 0.3 and 0.2 seconds. It might look like much +overhead but in an edit|-|preview runs it feels snappy. One can try this: + +\starttyping +\stoptext +\stoptyping + +which bring down the time to about 0.2 seconds for both engines but as it doesn't +do anything useful that is is no practice. + +Finishing a document is not that demanding because most gets flushed as we go. +The more (large) fonts we use, the longer it takes to finish a document but on +the average that time is not worth noticing. The main runtime contribution comes +from processing the pages. + +Okay, this is not always true. For instance, if we process a 400 page book from +2500 small \XML\ files with multiple graphics per page, there is a little +overhead in loading the files and constructing the \XML\ tree as well as in +inserting the graphics but in such cases one expects a few seconds more runtime. The +\METAFUN\ manual has some 450 pages with over 2500 runtime generated \METAPOST\ +graphics. It has color, uses quite some fonts, has lots of font switches +(verbatim too) but still one run takes only 18 seconds in stock \LUATEX\ and less +that 15 seconds with \LUAJITTEX. Keep these numbers in mind if a non|-|\CONTEXT\ +users barks against the performance tree that his few page mediocre document +takes 10 seconds to compile: the content, styling, quality of macros and whatever +one can come up with all plays a role. Personally I find any rate between 10 and +30 pages per second acceptable, and if I get the lower rate then I normally know +pretty well that the job is demanding in all kind of aspects. + +Over time the \CONTEXT||\LUATEX\ combination, in spite of the fact that more +functionality has been added, has not become slower. In fact, some subsystems +have been sped up. For instance font handling is very sensitive for adding +functionality. However, each version so far performed a bit better. Whenever some +neat new trickery was added, at the same time improvements were made thanks to +more insight in the matter. In practice we're not talking of changes in speed by +large factors but more by small percentages. I'm pretty sure that most \CONTEXT\ +users never noticed. Recently a 15\endash30\% speed up (in font handling) was +realized (for more complex fonts) but only when you use such complex fonts and +pages full of text you will see a positive impact on the whole run. + +There is one important factor I didn't mention yet: the efficiency of the +console. You can best check that by making a format (\typ {context --make en}). +When that is done by piping the messages to a file, it takes 3.2 seconds on my +laptop and about the same when done from the editor (\SCITE), maybe because the +\LUATEX\ run and the log pane run on a different thread. When I use the standard +console it takes 3.8 seconds in Windows 10 Creative update (in older versions it +took 4.3 and slightly less when using a console wrapper). The powershell takes +3.2 seconds which is the same as piping to a file. Interesting is that in Bash on +Windows it takes 2.8 seconds and 2.6 seconds when piped to a file. Normal runs +are somewhat slower, but it looks like the 64 bit Linux binary is somewhat faster +than the 64 bit mingw version. \footnote {Long ago we found that \LUATEX\ is very +sensitive to for instance the \CPU\ cache so maybe there are some differences due +to optimization flags and|/|or the fact that bash runs in one thread and all file +\IO\ in the main windows instance. Who knows.} Anyway, it demonstrates that when +someone yells a number you need to ask what the conditions where. + +At a \CONTEXT\ meeting there has been a presentation about possible speed|-|up of +a run for instance by using a separate syntax checker to prevent a useless run. +However, the use case concerned a document that took a minute on the machine +used, while the same document took a few seconds on mine. At the same meeting we +also did a comparison of speed for a \LATEX\ run using \PDFTEX\ and the same +document migrated to \CONTEXT\ \MKIV\ using \LUATEX\ (Harald K\"onigs \XML\ +torture and compatibility test). Contrary to what one might expect, the +\CONTEXT\ run was significantly faster; the resulting document was a few +gigabytes in size. + +\stopsection + +\startsection[title=Bottlenecks] + +I will discuss a few potential bottlenecks next. A complex integrated system like +\CONTEXT\ has lots of components and some can be quite demanding. However, when +something is not used, it has no (or hardly any) impact on performance. Even when +we spend a lot of time in \LUA\ that is not the reason for a slow|-|down. +Sometimes using \LUA\ results in a speedup, sometimes it doesn't matter. Complex +mechanisms like natural tables for instance will not suddenly become less +complex. So, let's focus on the \quotation {aspects} that come up in those +complaints: fonts and \LUA. Because I only use \CONTEXT\ and occasionally test +with the plain \TEX\ version that we provide, I will not explore the potential +impact of using truckloads of packages, styles and such, which I'm sure of plays +a role, but one neglected in the discussion. + +\startsubsubject[title=Fonts] + +According to the principles of \LUATEX\ we process (\OPENTYPE) fonts using \LUA. +That way we have complete control over any aspect of font handling, and can, as +to be expected in \TEX\ systems, provide users what they need, now and in the +future. In fact, if we didn't had that freedom in \CONTEXT\ I'd probably already +quit using \TEX\ a decade ago and found myself some other (programming) niche. + +After a font is loaded, part of the data gets passed to the \TEX\ engine so that +it can do its work. For instance, in order to be able to typeset a paragraph, +\TEX\ needs to know the dimensions of glyphs. Once a font has been loaded +(that is, the binary blob) the next time it's fetched from a cache. Initial +loading (and preparation) takes some time, depending on the complexity or size of +the font. Loading from cache is close to instantaneous. After loading the +dimensions are passed to \TEX\ but all data remains accessible for any desired +usage. The \OPENTYPE\ feature processor for instance uses that data and \CONTEXT\ +for sure needs that data (fast accessible) for different purposes too. + +When a font is used in so called base mode, we let \TEX\ do the ligaturing and +kerning. This is possible with simple fonts and features. If you have a critical +workflow you might enable base mode, which can be done per font instance. +Processing in node mode takes some time but how much depends on the font and +script. Normally there is no difference between \CONTEXT\ and generic usage. In +\CONTEXT\ we also have dynamic features, and the impact on performance depends on +usage. In addition to base and node we also have plug mode but that is only used +for testing and therefore not advertised. + +Every \type {\hbox} and every paragraph goes through the font handler. Because +we support mixed modes, some analysis takes place, and because we do more in +\CONTEXT, the generic analyzer is more light weight, which again can mean that a +generic run is not slower than a similar \CONTEXT\ one. + +Interesting is that added functionality for variable and|/|or color fonts had no +impact on performance. Runtime added user features can have some impact but when +defined well it can be neglected. I bet that when you add additional node list +handling yourself, its impact on performance is larger. But in the end what +counts is that the job gets done and the more you demand the higher the price you +pay. + +\stopsubsubject + +\startsubsubject[title=\LUA] + +The second possible bottleneck when using \LUATEX\ can be in using \LUA\ code. +However, using that as argument for slow runs is laughable. For instance +\CONTEXT\ \MKIV\ can easily spend half its time in \LUA\ and that is not making +it any slower than \MKII\ using \PDFTEX\ doing equally complex things. For +instance the embedded \METAPOST\ library makes \MKIV\ way faster than \MKII, and +the built|-|in \XML\ processing capabilities in \MKIV\ can easily beat \MKII\ +\XML\ handling, apart from the fact that it can do more, like filtering by path +and expression. In fact, files that take, say, half a minute in \MKIV, could as +well have taken 15 minutes or more in \MKII\ (and imagine multiple runs then). + +So, for \CONTEXT\ using \LUA\ to achieve its objectives is mandate. The +combination of \TEX, \METAPOST\ and \LUA\ is pretty powerful! Each of these +components is really fast. If \TEX\ is your bottleneck, review your macros! When +\LUA\ seems to be the bad, go over your code and make it better. Much of the +\LUA\ code I see flying around doesn't look that efficient, which is okay because +the interpreter is really fast, but don't blame \LUA\ beforehand, blame your +coding (style) first. When \METAPOST\ is the bottleneck, well, sometimes not much +can be done about it, but when you know that language well enough you can often +make it perform better. + +For the record: every additional mechanism that kicks in, like character spacing +(the ugly one), case treatments, special word and line trickery, marginal stuff, +graphics, line numbering, underlining, referencing, and a few dozen more will add +a bit to the processing time. In that case, in \CONTEXT, the font related runtime +gets pretty well obscured by other things happening, just that you know. + +\stopsubsubject + +\stopsection + +\startsection[title=Some timing] + +Next I will show some timings related to fonts. For this I use stock \LUATEX\ +(second column) as well as \LUAJITTEX\ (last column) which of course performs +much better. The timings are given in 3 decimals but often (within a set of runs) +and as the system load is normally consistent in a set of test runs the last two +decimals only matter in relative comparison. So, for comparing runs over time +round to the first decimal. Let's start with loading a bodyfont. This happens +once per document and normally one has only one bodyfont active. Loading involves +definitions as well as setting up math so a couple of fonts are actually loaded, +even if they're not used later on. A setup normally involves a serif, sans, mono, +and math setup (in \CONTEXT). \footnote {The timing for Latin Modern is so low +because that font is loaded already.} + +\environment onandon-speed-000 + +\ShowSample{onandon-speed-000} % bodyfont + +There is a bit difference between the font sets but a safe average is 150 milli +seconds and this is rather constant over runs. + +An actual font switch can result in loading a font but this is a one time overhead. +Loading four variants (regular, bold, italic and bold italic) roughly takes the +following time: + +\ShowSample{onandon-speed-001} % four variants + +Using them again later on takes no time: + +\ShowSample{onandon-speed-002} % four variants + +Before we start timing the font handler, first a few baseline benchmarks are +shown. When no font is applied and nothing else is done with the node list we +get: + +\ShowSample{onandon-speed-009} + +A simple monospaced, no features applied, run takes a bit more: + +\ShowSample{onandon-speed-010} + +Now we show a one font typesetting run. As the two benchmarks before, we just +typeset a text in a \type {\hbox}, so no par builder interference happens. We use +the \type {sapolsky} sample text and typeset it 100 times 4 (either of not with +font switches). + +\ShowSample{onandon-speed-003} + +Much more runtime is needed when we typeset with four font switches. The garamond +is most demanding. Actually we're not doing 4 fonts there because it has no bold, +so the numbers are a bit lower than expected for this example. One reason for it +being demanding is that it has lots of (contextual) lookups. The only comment I +can make about that is that it also depends on the strategies of the font +designer. Combining lookups saves space and time so complexity of a font is not +always a good predictor for performance hits. + +% \ShowSample{onandon-speed-004} + +If we typeset paragraphs we get this: + +\ShowSample{onandon-speed-005} + +We're talking of some 275 pages here. + +\ShowSample{onandon-speed-006} + +There is of course overhead in handling paragraphs and pages: + +\ShowSample{onandon-speed-011} + +Before I discuss these numbers in more details two more benchmarks are +shown. The next table concerns a paragraph with only a few (bold) words. + +\ShowSample{onandon-speed-007} + +The following table has paragraphs with a few mono spaced words +typeset using \type{\type}. + +\ShowSample{onandon-speed-008} + +When a node list (hbox or paragraph) is processed, each glyph is looked at. One +important property of \LUATEX\ (compared to \PDFTEX) is that it hyphenates the +whole text, not only the most feasible spots. For the \type {sapolsky} snippet +this results in 200 potential breakpoints, registered in an equal number of +discretionary nodes. The snippet has 688 characters grouped into 125 words and +because it's an English quote we're not hampered with composed characters or +complex script handling. And, when we mention 100 runs then we actually mean +400 ones when font switching and bodyfonts are compared + +\startnarrower + \showglyphs \showfontkerns + \input sapolsky \wordright{Robert M. Sapolsky} +\stopnarrower + +In order to get substitutions and positioning right we need not only to consult +streams of glyphs but also combinations with preceding pre or replace, or +trailing post and replace texts. When a font has a bit more complex substitutions, +as ebgaramond has, multiple (sometimes hundreds of) passes over the list are made. +This is why the more complex a font is, the more runtime is involved. + +Another factor, one you could easily deduce from the benchmarks, is intermediate +font switches. Even a few such switches (in the last benchmarks) already result +in a runtime penalty. The four switch benchmarks show an impressive increase of +runtime, but it's good to know that such a situation seldom happens. It's also +important not to confuse for instance a verbatim snippet with a bold one. The +bold one is indeed leading to a pass over the list, but verbatim is normally +skipped because it uses a font that needs no processing. That verbatim or bold +have the same penalty is mainly due to the fact that verbatim itself is costly: +the text is picked up using a different catcode regime and travels through \TEX\ +and \LUA\ before it finally gets typeset. This relates to special treatments of +spacing and syntax highlighting and such. + +Also keep in mind that the page examples are quite unreal. We use a layout with +no margins, just text from edge to edge. + +\placefigure + {\SampleTitle{onandon-speed-005}} + {\externalfigure[onandon-speed-005][frame=on,orientation=90,width=.45\textheight]} + +\placefigure + {\SampleTitle{onandon-speed-006}} + {\externalfigure[onandon-speed-006][frame=on,orientation=90,maxwidth=.45\textheight,maxheight=\textwidth]} + +\placefigure + {\SampleTitle{onandon-speed-007}} + {\externalfigure[onandon-speed-007][frame=on,orientation=90,width=.45\textheight]} + +\placefigure + {\SampleTitle{onandon-speed-008}} + {\externalfigure[onandon-speed-008][frame=on,orientation=90,width=.45\textheight]} + +\placefigure + {\SampleTitle{onandon-speed-011}} + {\externalfigure[onandon-speed-011][frame=on,orientation=90,width=.45\textheight]} + +So what is a realistic example? That is hard to say. Unfortunately no one ever +asked us to typeset novels. They are rather brain dead products for a machinery +so they process fast. On the mentioned laptop 350 word pages in Dejavu fonts can +be processed at a rate of 75 pages per second with \LUATEX\ and over 100 pages +per second with \LUAJITTEX . On a more modern laptop or professional server +performance is of course better. And for automated flows batch mode is your +friend. The rate is not much worse for a document in a language with a bit more +complex character handling, take accents or ligatures. Of course \PDFTEX\ is +faster on such a dumb document but kick in some more functionality and the +advantage quickly disappears. So, if someone complains that \LUATEX\ needs 10 or +more seconds for a simple few page document \unknown\ you can bet that when the +fonts are seen as reason, that the setup is pretty bad. Personally I'd not waste +time on such a complaint. + +\stopsection + +\startsection[title=Valid questions] + +Here are some reasonable questions that you can ask when someone complains to you +about the slowness of \LUATEX: + +\startsubsubject[title={What engines do you compare?}] + +If you come from \PDFTEX\ you come from an 8~bit world: input and font handling +are based on bytes and hyphenation is integrated into the par builder. If you use +\UTF-8\ in \PDFTEX, the input is decoded by \TEX\ macros which carries a speed +penalty. Because in the wide engines macro names can also be \UTF\ sequences, +construction of macro names is less efficient too. + +When you try to use wide fonts, again there is a penalty. Now, if you use \XETEX\ +or \LUATEX\ your input is \UTF-8 which becomes something 32 bit internally. Fonts +are wide so more resources are needed, apart from these fonts being larger and in +need of more processing due to feature handling. Where \XETEX\ uses a library, +\LUATEX\ uses its own handler. Does that have a consequence for performance? Yes +and no. First of all it depends on how much time is spent on fonts at all, but +even then the difference is not that large. Sometimes \XETEX\ wins, sometimes +\LUATEX. One thing is clear: \LUATEX\ is more flexible as we can roll out our own +solutions and therefore do more advanced font magic. For \CONTEXT\ it doesn't +matter as we use \LUATEX\ exclusively and rely on the flexible font handler, also +for future extensions. If really needed you can kick in a library based handler +but it's (currently) not distributed as we loose other functionality which in +turn would result in complaints about that fact (apart from conflicting with the +strive for independence). + +There is no doubt that \PDFTEX\ is faster but for \CONTEXT\ it's an obsolete +engine. The hard coded solutions engine \XETEX\ is also not feasible for +\CONTEXT\ either. So, in practice \CONTEXT\ users have no choice: \LUATEX\ is +used, but users of other macro packages can use the alternatives if they are not +satisfied with performance. The fact that \CONTEXT\ users don't complain about +speed is a clear signal that this is no issue. And, if you want more speed you +can use \LUAJITTEX. \footnote {In plug mode we can actually test a library and +experiments have shown that performance on the average is much worse but it can +be a bit better for complex scripts, although a gain gets unnoticed in normal +documents. So, one can decide to use a library but at the cost of much other +functionality that \CONTEXT\ offers, so we don't support it.} In the last section +the different engines will be compared in more detail. + +Just that you know, when we do the four switches example in plain \TEX\ on my +laptop I get a rate of 40 pages per second, and for one font 180 pages per +second. There is of course a bit more going on in \CONTEXT\ in page building and +so, but the difference between plain and \CONTEXT\ is not that large. + +\stopsubsubject + +\startsubsubject[title={What macro package is used?}] + +If the answer is that when plain \TEX\ is used, a follow up question is: what +variant? The \CONTEXT\ distribution ships with \type {luatex-plain} and that is +our benchmark. If there really is a bottleneck it is worth exploring. But keep in +mind that in order to be plain, not that much can be done. The \LUATEX\ part is +just an example of an implementation. We already discussed \CONTEXT, and for +\LATEX\ I don't want to speculate where performance hits might come from. When +we're talking fonts, \CONTEXT\ can actually a bit slower than the generic (or +\LATEX) variant because we can kick in more functionality. Also, when you compare +macro packages, keep in mind that when node list processing code is added in that +package the impact depends on interaction with other functionality and depends on +the efficiency of the code. You can't compare mechanisms or draw general +conclusions when you don't know what else is done! + +\stopsubsubject + +\startsubsubject[title={What do you load?}] + +Most \CONTEXT\ modules are small and load fast. Of course there can be exceptions +when we rely on third party code; for instance loading tikz takes a a bit of +time. It makes no sense to look for ways to speed that system up because it is +maintained elsewhere. There can probably be gained a bit but again, no user +complained so far. + +If \CONTEXT\ is not used, one probably also uses a large \TEX\ installations. +File lookup in \CONTEXT\ is done differently and can can be faster. Even loading +can be more efficient in \CONTEXT, but it's hard to generalize that conclusion. +If one complains about loading fonts being an issue, just try to measure how much +time is spent on loading other code. + +\stopsubsubject + +\startsubsubject[title={Did you patch macros?}] + +Not everyone is a \TEX pert. So, coming up with macros that are expanded many +times and|/|or have inefficient user interfacing can have some impact. If someone +complains about one subsystem being slow, then honestly demands to complain about +other subsystems as well. You get what you ask for. + +\stopsubsubject + +\startsubsubject[title={How efficient is the code that you use?}] + +Writing super efficient code only makes sense when it's used frequently. In +\CONTEXT\ most code is reasonable efficient. It can be that in one document fonts +are responsible for most runtime, but in another document table construction can +be more demanding while yet another document puts some stress on interactive +features. When hz or protrusion is enabled then you run substantially slower +anyway so when you are willing to sacrifice 10\% or more runtime don't complain +about other components. The same is true for enabling \SYNCTEX: if you are +willing to add more than 10\% runtime for that, don't wither about the same +amount for font handling. \footnote {In \CONTEXT\ we use a \SYNCTEX\ alternative +that is somewhat faster but it remains a fact that enabling more and more +functionality will make the penalty of for instance font processing relatively +small.} + +\stopsubsubject + +\startsubsubject[title={How efficient is the styling that you use?}] + +Probably the most easily overseen optimization is in switching fonts and color. +Although in \CONTEXT\ font switching is fast, I have no clue about it in other +macro packages. But in a style you can decide to use inefficient (massive) font +switches. The effects can easily be tested by commenting bit and pieces. For +instance sometimes you need to do a full bodyfont switch when changing a style, +like assigning \type {\small\bf} to the \type {style} key in \type {\setuphead}, +but often using e.g.\ \type {\tfd} is much more efficient and works quite as +well. Just try it. + +\stopsubsubject + +\startsubsubject[title={Are fonts really the bottleneck?}] + +We already mentioned that one can look in the wrong direction. Maybe once someone +is convinced that fonts are the culprit, it gets hard to look at the real issue. +If a similar job in different macro packages has a significant different runtime +one can wonder what happens indeed. + +It is good to keep in mind that the amount of text is often not as large as you +think. It's easy to do a test with hundreds of paragraphs of text but in practice +we have whitespace, section titles, half empty pages, floats, itemize and similar +constructs, etc. Often we don't mix many fonts in the running text either. So, in +the end a real document is the best test. + +\stopsubsubject + +\startsubsubject[title={If you use \LUA, is that code any good?}] + +You can gain from the faster virtual machine of \LUAJITTEX. Don't expect wonders +from the jitting as that only pays of for long runs with the same code used over +and over again. If the gain is high you can even wonder how well written your +\LUA\ code is anyway. + +\stopsubsubject + +\startsubsubject[title={What if they don't believe you?}] + +So, say that someone finds \LUATEX\ slow, what can be done about it? Just advice +him or her to stick to tool used previously. Then, if arguments come that one +also wants to use \UTF-8, \OPENTYPE\ fonts, a bit of \METAPOST, and is looking +forward to using \LUA\ runtime, the only answer is: take it or leave it. You pay +a price for progress, but if you do your job well, the price is not that large. +Tell them to spend time on learning and maybe adapting and bark against their own +tree before barking against those who took that step a decade ago. Most \CONTEXT\ +users took that step and someone still using \LUATEX\ after a decade can't be +that stupid. It's always best to first wonder what one actually asks from \LUATEX, +and if the benefit of having \LUA\ on board has an advantage. If not, one can +just use another engine. + +Also think of this. When a job is slow, for me it's no problem to identify where +the problem is. The question then is: can something be done about it? Well, I +happily keep the answer for myself. After all, some people always need room to +complain, maybe if only to hide their ignorance or incompetence. Who knows. + +\stopsubsubject + +\stopsection + +\startsection[title={Comparing engines}] + +The next comparison is to be taken with a grain of salt and concerns the state of +affairs mid 2017. First of all, you cannot really compare \MKII\ with \MKIV: the +later has more functionality (or a more advanced implementation of +functionality). And as mentioned you can also not really compare \PDFTEX\ and the +wide engines. Anyway, here are some (useless) tests. First a bunch of loads. Keep +in mind that different engines also deal differently with reading files. For +instance \MKIV\ uses \LUATEX\ callbacks to normalize the input and has its own +readers. There is a bit more overhead in starting up a \LUATEX\ run and some +functionality is enabled that is not present in \MKII. The format is also larger, +if only because we preload a lot of useful font, character and script related +data. + +\starttyping +\starttext + \dorecurse {#1} { + \input knuth + \par + } +\stoptext +\stoptyping + +When looking at the numbers one should realize that the times include startup and +job management by the runner scripts. We also run in batchmode to avoid logging +to influence runtime. The average is calculated from 5 runs. + +% sample 1, number of runs: 5 + +\starttabulate[||r|r|r|] +\HL +\BC engine \BC 50 \BC 500 \BC 2500 \NC \NR +\HL +\BC pdftex \NC 0.43 \NC 0.77 \NC 2.33 \NC \NR +\BC xetex \NC 0.85 \NC 2.66 \NC 10.79 \NC \NR +\BC luatex \NC 0.94 \NC 2.50 \NC 9.44 \NC \NR +\BC luajittex \NC 0.68 \NC 1.69 \NC 6.34 \NC \NR +\HL +\stoptabulate + +The second example does a few switches in a paragraph: + +\starttyping +\starttext + \dorecurse {#1} { + \tf \input knuth + \bf \input knuth + \it \input knuth + \bs \input knuth + \par + } +\stoptext +\stoptyping + +% sample 2, number of runs: 5 + +\starttabulate[||r|r|r|] +\HL +\BC engine \BC 50 \BC 500 \BC 2500 \NC \NR +\HL +\BC pdftex \NC 0.58 \NC 2.10 \NC 8.97 \NC \NR +\BC xetex \NC 1.47 \NC 8.66 \NC 42.50 \NC \NR +\BC luatex \NC 1.59 \NC 8.26 \NC 38.11 \NC \NR +\BC luajittex \NC 1.12 \NC 5.57 \NC 25.48 \NC \NR +\HL +\stoptabulate + +The third examples does a few more, resulting in multiple subranges +per style: + +\starttyping +\starttext + \dorecurse {#1} { + \tf \input knuth \it knuth + \bf \input knuth \bs knuth + \it \input knuth \tf knuth + \bs \input knuth \bf knuth + \par + } +\stoptext +\stoptyping + +% sample 3, number of runs: 5 + +\starttabulate[||r|r|r|] +\HL +\BC engine \BC 50 \BC 500 \BC 2500 \NC \NR +\HL +\BC pdftex \NC 0.59 \NC 2.20 \NC 9.52 \NC \NR +\BC xetex \NC 1.49 \NC 8.88 \NC 43.85 \NC \NR +\BC luatex \NC 1.64 \NC 8.91 \NC 41.26 \NC \NR +\BC luajittex \NC 1.15 \NC 5.91 \NC 27.15 \NC \NR +\HL +\stoptabulate + +The last example adds some color. Enabling more functionality can have an impact +on performance. In fact, as \MKIV\ uses a lot of \LUA\ and is also more advanced +that \MKII, one can expect a performance hit but in practice the opposite +happens, which can also be due to some fundamental differences deep down at the +macro level. + +\starttyping +\setupcolors[state=start] % default in MkIV + +\starttext + \dorecurse {#1} { + {\red \tf \input knuth \green \it knuth} + {\red \bf \input knuth \green \bs knuth} + {\red \it \input knuth \green \tf knuth} + {\red \bs \input knuth \green \bf knuth} + \par + } +\stoptext +\stoptyping + +% sample 4, number of runs: 5 + +\starttabulate[||r|r|r|] +\HL +\BC engine \BC 50 \BC 500 \BC 2500 \NC \NR +\HL +\BC pdftex \NC 0.61 \NC 2.36 \NC 10.33 \NC \NR +\BC xetex \NC 1.53 \NC 9.25 \NC 45.59 \NC \NR +\BC luatex \NC 1.65 \NC 8.91 \NC 41.32 \NC \NR +\BC luajittex \NC 1.15 \NC 5.93 \NC 27.34 \NC \NR +\HL +\stoptabulate + +In these measurements the accuracy is a few decimals but a pattern is visible. As +expected \PDFTEX\ wins on simple documents but starts loosing when things get +more complex. For these tests I used 64 bit binaries. A 32 bit \XETEX\ with +\MKII\ performs the same as \LUAJITTEX\ with \MKIV, but a 64 bit \XETEX\ is +actually quite a bit slower. In that case the mingw cross compiled \LUATEX\ +version does pretty well. A 64 bit \PDFTEX\ is also slower (it looks) that a 32 +bit version. So in the end, there are more factors that play a role. Choosing +between \LUATEX\ and \LUAJITTEX\ depends on how well the memory limited +\LUAJITTEX\ variant can handle your documents and fonts. + +Because in most of our recent styles we use \OPENTYPE\ fonts and (structural) +features as well as recent \METAFUN\ extensions only present in \MKIV\ we cannot +compare engines using such documents. The mentioned performance of \LUATEX\ (or +\LUAJITTEX) and \MKIV\ on the \METAFUN\ manual illustrate that in most cases this +combination is a clear winner. + +\starttyping +\starttext + \dorecurse {#1} { + \null \page + } +\stoptext +\stoptyping + +This gives: + +% sample 5, number of runs: 5 + +\starttabulate[||r|r|r|] +\HL +\BC engine \BC 50 \BC 500 \BC 2500 \NC \NR +\HL +\BC pdftex \NC 0.46 \NC 1.05 \NC 3.72 \NC \NR +\BC xetex \NC 0.73 \NC 1.80 \NC 6.56 \NC \NR +\BC luatex \NC 0.84 \NC 1.44 \NC 4.07 \NC \NR +\BC luajittex \NC 0.61 \NC 1.10 \NC 3.33 \NC \NR +\HL +\stoptabulate + +That leaves the zero run: + +\starttyping +\starttext + \dorecurse {#1} { + % nothing + } +\stoptext +\stoptyping + +This gives the following numbers. In longer runs the difference in overhead is +neglectable. + +% sample 6, number of runs: 5 + +\starttabulate[||r|r|r|] +\HL +\BC engine \BC 50 \BC 500 \BC 2500 \NC \NR +\HL +\BC pdftex \NC 0.36 \NC 0.36 \NC 0.36 \NC \NR +\BC xetex \NC 0.57 \NC 0.57 \NC 0.59 \NC \NR +\BC luatex \NC 0.74 \NC 0.74 \NC 0.74 \NC \NR +\BC luajittex \NC 0.53 \NC 0.53 \NC 0.54 \NC \NR +\HL +\stoptabulate + +It will be clear that when we use different fonts the numbers will also be +different. And if you use a lot of runtime \METAPOST\ graphics (for instance for +backgrounds), the \MKIV\ runs end up at the top. And when we process \XML\ it +will be clear that going back to \MKII\ is no longer a realistic option. It must +be noted that I occasionally manage to improve performance but we've now reached +a state where there is not that much to gain. Some functionality is hard to +compare. For instance in \CONTEXT\ we don't use much of the \PDF\ backend +features because we implement them all in \LUA. In fact, even in \MKII\ already a +done in \TEX, so in the end the speed difference there is not large and often in +favour of \MKIV. + +For the record I mention that shipping out the about 1250 pages has some overhead +too: about 2 seconds. Here \LUAJITTEX\ is 20\% more efficient which is an +indication of quite some \LUA\ involvement. Loading the input files has an +overhead of about half a second. Starting up \LUATEX\ takes more time that +\PDFTEX\ and \XETEX, but that disadvantage disappears with more pages. So, in the +end there are quite some factors that blur the measurements. In practice what +matters is convenience: does the runtime feel reasonable and in most cases it +does. + +If I would replace my laptop with a reasonable comparable alternative that one +would be some 35\% faster (single threads on processors don't gain much per year). +I guess that this is about the same increase in performance that \CONTEXT\ +\MKIV\ got in that period. I don't expect such a gain in the coming years so +at some point we're stuck with what we have. + +\stopsection + +\startsection[title=Summary] + +So, how \quotation {slow} is \LUATEX\ really compared to the other engines? If we +go back in time to when the first wide engines showed up, \OMEGA\ was considered +to be slow, although I never tested that myself. Then, when \XETEX\ showed up, +there was not much talk about speed, just about the fact that we could use +\OPENTYPE\ fonts and native \UTF\ input. If you look at the numbers, for sure you +can say that it was much slower than \PDFTEX. So how come that some people +complain about \LUATEX\ being so slow, especially when we take into account that +it's not that much slower than \XETEX, and that \LUAJITTEX\ is often faster that +\XETEX. Also, computers have become faster. With the wide engines you get more +functionality and that comes at a price. This was accepted for \XETEX\ and is +also acceptable for \LUATEX. But the price is nto that high if you take into +account that hardware performs better: you just need to compare \LUATEX\ (and +\XETEX) runtime with \PDFTEX\ runtime 15 years ago. + +As a comparison, look at games and video. Resolution became much higher as did +color depth. Higher frame rates were in demand. Therefore the hardware had to +become faster and it did, and as a result the user experience kept up. No user +will say that a modern game is slower than an old one, because the old one does +500 frames per second compared to some 50 for the new game on the modern +hardware. In a similar fashion, the demands for typesetting became higher: +\UNICODE, \OPENTYPE, graphics, \XML, advanced \PDF, more complex (niche) +typesetting, etc. This happened more or less in parallel with computers becoming +more powerful. So, as with games, the user experience didn't degrade with +demands. Comparing \LUATEX\ with \PDFTEX\ is like comparing a low res, low frame +rate, low color game with a modern one. You need to have up to date hardware and +even then, the writer of such programs need to make sure it runs efficient, +simply because hardware no longer scales like it did decades ago. You need to +look at the larger picture. + +\stopsection + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/onandon/onandon-seguiemj.pdf b/doc/context/sources/general/manuals/onandon/onandon-seguiemj.pdf Binary files differnew file mode 100644 index 000000000..02b2bd271 --- /dev/null +++ b/doc/context/sources/general/manuals/onandon/onandon-seguiemj.pdf diff --git a/doc/context/sources/general/manuals/onandon/onandon-seguiemj.tex b/doc/context/sources/general/manuals/onandon/onandon-seguiemj.tex new file mode 100644 index 000000000..eff8a6acb --- /dev/null +++ b/doc/context/sources/general/manuals/onandon/onandon-seguiemj.tex @@ -0,0 +1,54 @@ +% language=uk + +\environment onandon-environment + +\setuppagenumbering[alternative=singlesided] + +\definefontfeature[seguiemj-cl][default][colr=yes,ccmp=yes,dist=yes] + +\definefont[MyEmojiLargeOld][seguiemj-old*seguiemj-cl @ 100pt] +\definefont[MyEmojiLargeNew][seguiemj*seguiemj-cl @ 100pt] + +\def\ShowThem#1% + {\ruledhbox{\MyEmojiLargeOld\resolvedemoji{#1}}% + \quad + \ruledhbox{\MyEmojiLargeNew\resolvedemoji{#1}}} + +\def\ShowGone#1% + {\setbox\scratchbox\ruledhbox{\MyEmojiLargeOld\resolvedemoji{#1}}% + \copy\scratchbox + \quad + \ruledhbox to \wd\scratchbox + {\lower\dp\scratchbox\vbox to \htdp\scratchbox + {\vss + \hbox to \wd\scratchbox{\hss no longer supported\hss}% + \vss}}} + +\starttext + +\startTEXpage[offset=.5pt] +\startcombination[2*5] + {\ShowThem{family woman woman girl boy}}% + {family woman woman girl boy} + {\ShowThem{family woman woman boy boy}}% + {family woman woman boy boy} + {\ShowThem{family woman girl boy}} + {family woman girl boy} + {\ShowThem{family man dark skin tone woman girl baby}} + {family man dark skin tone woman girl baby} + {\ShowThem{family man light skin tone woman light skin tone girl dark skin tone}} + {family man light skin tone woman light skin tone girl dark skin tone} + {\ShowThem{family man girl boy}} + {family man girl boy} + {\ShowThem{family man man girl boy}}% + {family man man girl boy} + {\ShowThem{family man light skin tone woman dark skin tone girl medium skin tone boy medium skin tone}} + {family man light skin tone woman dark skin tone girl medium skin tone boy medium skin tone} + {\ShowGone{couple with heart man light skin tone man medium-dark skin tone}} + {couple with heart man light skin tone man medium-dark skin tone} + {\ShowGone{kiss man medium-light skin tone man dark skin tone}} + {kiss man medium-light skin tone man dark skin tone} +\stopcombination +\stopTEXpage + +\stoptext diff --git a/doc/context/sources/general/manuals/onandon/onandon-speed-000.tex b/doc/context/sources/general/manuals/onandon/onandon-speed-000.tex new file mode 100644 index 000000000..f48af866d --- /dev/null +++ b/doc/context/sources/general/manuals/onandon/onandon-speed-000.tex @@ -0,0 +1,116 @@ +% \startenvironment onandon-speed-000 + +% \dontcomplain + +\edef\sapolsky{\ignorespaces\cldloadfile{sapolsky}\removeunwantedspaces} + +\startluacode + + function document.ResetSample(title) + document.elapsed = { + title = title, + times = { }, + } + end + + function document.RegisterSample(bodyfont,elapsed) + table.insert(document.elapsed.times, { + bodyfont = bodyfont, + elapsed = elapsed + }) + end + + function document.SaveSample() + if LUATEXENGINE == "luajittex" then + table.save(tex.jobname.."-jit.lua",document.elapsed) + else + table.save(tex.jobname..".lua",document.elapsed) + end + end + + function document.ShowSample(filename) + -- context.typefile(filename..".tex") + local elapsed = table.load(file.nameonly(filename)..".lua") + local elapsedjit = table.load(file.nameonly(filename).."-jit.lua") + if elapsed and elapsedjit then + context.testpage { 6 } + context.starttabulate { "|l|l|lp|" } + context.HL() + context.NC() context.formatted.rlap("\\bf %s",elapsed.title) + context.NC() + context.NC() + context.NC() context.NR() + context.HL() + local times = elapsed.times + local timesjit = elapsedjit.times + for j=1,#times do + local t = times[j] + local tjit = timesjit[j] + context.NC() context(t.bodyfont) + context.NC() context(t.elapsed) + context.NC() context(tjit.elapsed) + context.NC() context.NR() + end + context.HL() + context.stoptabulate() + end + end + + function document.SampleTitle(filename) + local elapsed = table.load(filename..".lua") + if elapsed then + context(elapsed.title) + end + end +\stopluacode + +\appendtoks + \ctxlua{document.SaveSample()}% +\to \everystoptext + +\def\SampleCount{1000} +\def\SampleCount{100} + +\unexpanded\def\RegisterSample#1% + {\ctxlua{document.RegisterSample("#1","\elapsedtime")}} + +\unexpanded\def\ProcessSample#1% + {\page + \ctxlua{document.ResetSample("#1")}% + \resettimer \Sample {modern} \RegisterSample {modern} + \resettimer \Sample {pagella} \RegisterSample {pagella} + \resettimer \Sample {termes} \RegisterSample {termes} + \resettimer \Sample {cambria} \RegisterSample {cambria} + \resettimer \Sample {dejavu} \RegisterSample {dejavu} + \resettimer \Sample {ebgaramond} \RegisterSample {ebgaramond} + \resettimer \Sample {lucidaot} \RegisterSample {lucidaot} + \page } + +\unexpanded\def\ProcessBaselineSample#1% + {\page + \ctxlua{document.ResetSample("#1")}% + \resettimer \Sample {baseline} \RegisterSample {baseline} + \page } + +\unexpanded\def\Sample#1% + {\setupbodyfont[#1]} + +\unexpanded\def\ShowSample#1% + {\ctxlua{document.ShowSample("#1")}} + +\unexpanded\def\SampleTitle#1% + {\ctxlua{document.SampleTitle("#1.lua")}} + +\continueifinputfile{onandon-speed-000.tex} + +\starttext + +\ProcessSample{bodyfont} + +\setbox\scratchbox\vbox{\hsize1pt\tttf\sapolsky} \getnoflines{\htdp\scratchbox} + +\writestatus{!!!!!!}{noflines : \the\noflines} + +\stoptext + +% \stopenvironment diff --git a/doc/context/sources/general/manuals/onandon/onandon-speed-001.tex b/doc/context/sources/general/manuals/onandon/onandon-speed-001.tex new file mode 100644 index 000000000..b6c241752 --- /dev/null +++ b/doc/context/sources/general/manuals/onandon/onandon-speed-001.tex @@ -0,0 +1,15 @@ +\environment onandon-speed-000 + +\ProcessSample{bodyfont} \setupbodyfont[dejavu] + +\starttext + +\def\Sample#1% + {\start + \switchtobodyfont[#1] + \setbox\scratchbox\hbox{\tf\bf\it\bi}% + \stop} + +\ProcessSample{bodyfont switch and 4 style changes (first time)} + +\stoptext diff --git a/doc/context/sources/general/manuals/onandon/onandon-speed-002.tex b/doc/context/sources/general/manuals/onandon/onandon-speed-002.tex new file mode 100644 index 000000000..edd6dd0f7 --- /dev/null +++ b/doc/context/sources/general/manuals/onandon/onandon-speed-002.tex @@ -0,0 +1,16 @@ +\environment onandon-speed-000 + +\ProcessSample{bodyfont} \setupbodyfont[dejavu] + +\starttext + +\def\Sample#1% + {\start + \switchtobodyfont[#1] + \setbox\scratchbox\hbox{\tf\bf\it\bi}% + \stop} + +\ProcessSample{bodyfont switch and 4 style changes (first time)} +\ProcessSample{bodyfont switch and 4 style changes (follow up)} + +\stoptext diff --git a/doc/context/sources/general/manuals/onandon/onandon-speed-003.tex b/doc/context/sources/general/manuals/onandon/onandon-speed-003.tex new file mode 100644 index 000000000..4362ccb4f --- /dev/null +++ b/doc/context/sources/general/manuals/onandon/onandon-speed-003.tex @@ -0,0 +1,15 @@ +\environment onandon-speed-000 + +\ProcessSample{bodyfont} \setupbodyfont[dejavu] + +\starttext + +\def\Sample#1% + {\start + \switchtobodyfont[#1] + \dorecurse\SampleCount{\setbox\scratchbox\hbox{\sapolsky\space\sapolsky\space\sapolsky\space\sapolsky}}% + \stop} + +\ProcessSample{\SampleCount\space hboxes with 4 texts using one font} + +\stoptext diff --git a/doc/context/sources/general/manuals/onandon/onandon-speed-005.tex b/doc/context/sources/general/manuals/onandon/onandon-speed-005.tex new file mode 100644 index 000000000..7aeb53b4b --- /dev/null +++ b/doc/context/sources/general/manuals/onandon/onandon-speed-005.tex @@ -0,0 +1,17 @@ +\environment onandon-speed-000 + +\ProcessSample{bodyfont} \setupbodyfont[dejavu] + +\starttext + +\def\Sample#1% + {\start + \switchtobodyfont[#1] + \dorecurse\SampleCount{\sapolsky\space\sapolsky\space\sapolsky\space\sapolsky\par}% + \stop} + +\startlayout[page] + \ProcessSample{\SampleCount\space times 4 texts on pages} +\stoplayout + +\stoptext diff --git a/doc/context/sources/general/manuals/onandon/onandon-speed-006.tex b/doc/context/sources/general/manuals/onandon/onandon-speed-006.tex new file mode 100644 index 000000000..d15ef428e --- /dev/null +++ b/doc/context/sources/general/manuals/onandon/onandon-speed-006.tex @@ -0,0 +1,17 @@ +\environment onandon-speed-000 + +\ProcessSample{bodyfont} \setupbodyfont[dejavu] + +\starttext + +\def\Sample#1% + {\start + \switchtobodyfont[#1] + \dorecurse\SampleCount{\tf\sapolsky\space\bf\sapolsky\space\it\sapolsky\space\bi\sapolsky\space\par}% + \stop} + +\startlayout[page] + \ProcessSample{\SampleCount\space times 4 texts on pages using 4 styles} +\stoplayout + +\stoptext diff --git a/doc/context/sources/general/manuals/onandon/onandon-speed-007.tex b/doc/context/sources/general/manuals/onandon/onandon-speed-007.tex new file mode 100644 index 000000000..7a4eed497 --- /dev/null +++ b/doc/context/sources/general/manuals/onandon/onandon-speed-007.tex @@ -0,0 +1,31 @@ +\environment onandon-speed-000 + +\ProcessSample{bodyfont} \setupbodyfont[dejavu] + +\starttext + +\def\sapolsky{% + Agriculture is a fairly recent human invention, and in many ways it was one of + the great {\bf stupid} moves of all time. Hunter|-|gatherers have thousands of wild + sources of food to subsist on. Agriculture changed that all, generating an + overwhelming reliance on a few dozen domesticated food sources, making you + extremely vulnerable to the next famine, the next locust infestation, the next + potato blight. Agriculture allowed for stockpiling of surplus resources and thus, + {\bf inevitably}, the unequal stockpiling of them --- stratification of society and + the invention of classes. Thus, it allowed for the invention of poverty. I think + that the punch line of the primate|-|human difference is that when humans + invented poverty, they came up with a way of subjugating the low|-|ranking like + {\bf nothing ever seen before} in the primate world. +}% + +\def\Sample#1% + {\start + \switchtobodyfont[#1] + \dorecurse\SampleCount{\sapolsky\par}% + \stop} + +\startlayout[page] + \ProcessSample{\SampleCount\space texts on pages with [1,2,4] bold font switches} +\stoplayout + +\stoptext diff --git a/doc/context/sources/general/manuals/onandon/onandon-speed-008.tex b/doc/context/sources/general/manuals/onandon/onandon-speed-008.tex new file mode 100644 index 000000000..ae968bc10 --- /dev/null +++ b/doc/context/sources/general/manuals/onandon/onandon-speed-008.tex @@ -0,0 +1,32 @@ +\environment onandon-speed-000 + +\ProcessSample{bodyfont} \setupbodyfont[dejavu] + +\starttext + +\def\sapolsky{% + Agriculture is a fairly recent human invention, and in many ways it was one + of the great \type {stupid} moves of all time. Hunter|-|gatherers have + thousands of wild sources of food to subsist on. Agriculture changed that + all, generating an overwhelming reliance on a few dozen domesticated food + sources, making you extremely vulnerable to the next famine, the next locust + infestation, the next potato blight. Agriculture allowed for stockpiling of + surplus resources and thus, \type {inevitably}, the unequal stockpiling of + them --- stratification of society and the invention of classes. Thus, it + allowed for the invention of poverty. I think that the punch line of the + primate|-|human difference is that when humans invented poverty, they came up + with a way of subjugating the low|-|ranking like \type {nothing ever seen + before} in the primate world. +}% + +\def\Sample#1% + {\start + \switchtobodyfont[#1] + \dorecurse\SampleCount{\sapolsky\par}% + \stop} + +\startlayout[page] + \ProcessSample{\SampleCount\space texts on pages with [1,2,4] word verbatim switches} +\stoplayout + +\stoptext diff --git a/doc/context/sources/general/manuals/onandon/onandon-speed-009.tex b/doc/context/sources/general/manuals/onandon/onandon-speed-009.tex new file mode 100644 index 000000000..61116e652 --- /dev/null +++ b/doc/context/sources/general/manuals/onandon/onandon-speed-009.tex @@ -0,0 +1,15 @@ +\environment onandon-speed-000 + +\ProcessSample{bodyfont} \setupbodyfont[dejavu] + +\starttext + +\def\Sample#1% + {\start + \infofont + \dorecurse\SampleCount{\setbox\scratchbox\hpack{\sapolsky\space\sapolsky\space\sapolsky\space\sapolsky}}% + \stop} + +\ProcessBaselineSample{\SampleCount\space hboxes with 4 texts and no font handling} + +\stoptext diff --git a/doc/context/sources/general/manuals/onandon/onandon-speed-010.tex b/doc/context/sources/general/manuals/onandon/onandon-speed-010.tex new file mode 100644 index 000000000..673c2b1e5 --- /dev/null +++ b/doc/context/sources/general/manuals/onandon/onandon-speed-010.tex @@ -0,0 +1,15 @@ +\environment onandon-speed-000 + +\ProcessSample{bodyfont} \setupbodyfont[dejavu] + +\starttext + +\def\Sample#1% + {\start + \infofont + \dorecurse\SampleCount{\setbox\scratchbox\hbox{\sapolsky\space\sapolsky\space\sapolsky\space\sapolsky}}% + \stop} + +\ProcessBaselineSample{\SampleCount\space hboxes with 4 texts and no features} + +\stoptext diff --git a/doc/context/sources/general/manuals/onandon/onandon-speed-011.tex b/doc/context/sources/general/manuals/onandon/onandon-speed-011.tex new file mode 100644 index 000000000..90d924c00 --- /dev/null +++ b/doc/context/sources/general/manuals/onandon/onandon-speed-011.tex @@ -0,0 +1,20 @@ +\environment onandon-speed-000 + +\ProcessSample{bodyfont} \setupbodyfont[dejavu] + +\dontcomplain + +\starttext + +\def\Sample#1% + {\start + \tttf\tx + \dorecurse\SampleCount{\sapolsky\space\sapolsky\space\sapolsky\space\sapolsky\par}% + \stop} + +\startlayout[page] + \ProcessBaselineSample {\SampleCount\space paragraphs with 4 texts and no features} +\stoplayout + + +\stoptext diff --git a/doc/context/sources/general/manuals/onandon/onandon-speed-012.tex b/doc/context/sources/general/manuals/onandon/onandon-speed-012.tex new file mode 100644 index 000000000..e2d51e195 --- /dev/null +++ b/doc/context/sources/general/manuals/onandon/onandon-speed-012.tex @@ -0,0 +1,20 @@ +\environment onandon-speed-000 + +\ProcessSample{bodyfont} \setupbodyfont[dejavu] + +\dontcomplain + +\starttext + +\def\SampleCount{1000} + +\def\Sample#1% + {\start +% \switchtobodyfont[#1] + \dorecurse\SampleCount{\sapolsky\par} + \stop} + +% \ProcessSample{\SampleCount\space pages no features} +\ProcessBaselineSample{\SampleCount\space paragraphs text} + +\stoptext diff --git a/doc/context/sources/general/manuals/onandon/onandon-variable.tex b/doc/context/sources/general/manuals/onandon/onandon-variable.tex new file mode 100644 index 000000000..c73196cef --- /dev/null +++ b/doc/context/sources/general/manuals/onandon/onandon-variable.tex @@ -0,0 +1,557 @@ +% language=uk + +% todo: callback: stream, llx, lly, urx, ury, wd, lsb +% add glyphs runtime +% create whole cff so that we can go from mp + +\startcomponent onandon-variable + +\environment onandon-environment + +\startchapter[title=Variable fonts] + +\startsubject[title=Introduction] + +History shows the tendency to recycle ideas. Often quite some effort is made by +historians to figure out what really happened, not just long ago, when nothing +was written down and we have to do with stories or pictures at most, but also in +recent times. Descriptions can be conflicting, puzzling, incomplete, partially +lost, biased, \unknown + +Just as language was invented (or evolved) several times, so were scripts. The +same might be true for rendering scripts on a medium. Semaphores came and went +within decades and how many people know now that they existed and that encryption +was involved? Are the old printing presses truly the old ones, or are older +examples simply gone? One of the nice aspects of the internet is that one can now +more easily discover similar solutions for the same problem, but with a different +(and independent) origin. + +So, how about this \quotation {new big thing} in font technology: variable fonts. +In this case, history shows that it's not that new. For most \TEX\ users the +names \METAFONT\ and \METAPOST\ will ring bells. They have a very well documented +history so there is not much left to speculation. There are articles, books, +pictures, examples, sources, and more around for decades. So, the ability to +change the appearance of a glyph in a font depending on some parameters is not +new. What probably {\em is} new is that creating variable fonts is done in the +natural environment where fonts are designed: an interactive program. The +\METAFONT\ toolkit demands quite some insight in programming shapes in such a way +that one can change look and feel depending on parameters. There are not that +many meta fonts made and one reason is that making them requires a certain mind- +and skill set. On the other hand, faster computers, interactive programs, +evolving web technologies, where rea|l|-time rendering and therefore more or less +real-time tweaking of fonts is a realistic option, all play a role in acceptance. + +But do interactive font design programs make this easier? You still need to be +able to translate ideas into usable beautiful fonts. Taking the common shapes of +glyphs, defining extremes and letting a program calculate some interpolations +will not always bring good results. It's like morphing a picture of your baby's +face into yours of old age (or that of your grandparent): not all intermediate +results will look great. It's good to notice that variable fonts are a revival of +existing techniques and ideas used in, for instance, multiple master fonts. The +details might matter even more as they can now be exaggerated when some +transformation is applied. + +There is currently (March 2017) not much information about these fonts so what I +say next may be partially wrong or at least different from what is intended. The +perspective will be one from a \TEX\ user and coder. Whatever you think of them, +these fonts will be out there and for sure there will be nice examples +circulating soon. And so, when I ran into a few experimental fonts, with +\POSTSCRIPT\ and \TRUETYPE\ outlines, I decided to have a look at what is inside. +After all, because it's visual, it's also fun to play with. Let's stress that at +the moment of this writing I only have a few simple fonts available, fonts that +are designed for testing and not usage. Some recommended tables were missing and +no complex \OPENTYPE\ features are used in these fonts. + +\stopsubject + +\startsubject[title=The specification] + +I'm not that good at reading specifications, first of all because I quickly fall +asleep with such documents, but most of all because I prefer reading other stuff +(I do have lots of books waiting to be read). I'm also someone who has to play +with something in order to understand it: trial and error is my modus operandi. +Eventually it's my intended usage that drives the interface and that is when +everything comes together. + +Exploring this technology comes down to: locate a font, get the \OPENTYPE\ 1.8 +specification from the \MICROSOFT\ website, and try to figure out what is in the +font. When I had a rough idea the next step was to get to the shapes and see if I +could manipulate them. Of course it helped that in \CONTEXT\ we already can load +fonts and play with shapes (using \METAPOST). I didn't have to install and learn +other programs. Once I could render them, in this case by creating a virtual font +with inline \PDF\ literals, a next step was to apply variation. Then came the +first experiments with a possible user interface. Seeing more variation then +drove the exploration of additional properties needed for typesetting, like +features. + +The main extension to the data packaged in a font file concerns the (to be +discussed) axis along which variable fonts operate and deltas to be applied to +coordinates. The \type {gdef} table has been extended and contains information +that is used in \type {gpos} features. There are new \type {hvar}, \type {vvar} +and \type {mvar} tables that influence the horizontal, vertical and general font +dimensions. The \type {gvar} table is used for \TRUETYPE\ variants, while the +\type {cff2} table replaces the \type {cff} table for \OPENTYPE\ \POSTSCRIPT\ +outlines. The \type {avar} and \type {stat} tables contain some +meta|-|information about the axes of variations. + +It must be said that because this is new technology the information in the +standard is not always easy to understand. The fact that we have two rendering +techniques, \POSTSCRIPT\ \type {cff} and \TRUETYPE\ \type {ttf}, also means that +we have different information and perspectives. But this situation is not much +different from \OPENTYPE\ standards a few years ago: it takes time but in the end +I will get there. And, after all, users also complain about the lack of +documentation for \CONTEXT, so who am I to complain? In fact, it will be those +\CONTEXT\ users who will provide feedback and make the implementation better in +the~end. + +\stopsubject + +\startsubject[title=Loading] + +Before we discuss some details, it will be useful to summarize what the font +loader does when a user requests a font at a certain size and with specific +features enabled. When a font is used the first time, its binary format is +converted into a form that makes it suitable for use within \CONTEXT\ and +therefore \LUATEX. This conversion involves collecting properties of the font as +a whole (official names, general dimensions like x-height and em-width, etc.), of +glyphs (dimensions, \UNICODE\ properties, optional math properties), and all +kinds of information that relates to (contextual) replacements of glyphs (small +caps, oldstyle, scripts like Arabic) and positioning (kerning, anchoring marks, +etc.). In the \CONTEXT\ font loader this conversion is done in \LUA. + +The result is stored in a condensed format in a cache and the next time the font +is needed it loads in an instant. In the cached version the dimensions are +untouched, so a font at different sizes has just one copy in the cache. Often a +font is needed at several sizes and for each size we create a copy with scaled +glyph dimensions. The feature-related dimensions (kerning, anchoring, etc.)\ are +shared and scaled when needed. This happens when sequences of characters in the +node list get converted into sequences of glyphs. We could do the same with glyph +dimensions but one reason for having a scaled copy is that this copy can also +contain virtual glyphs and these have to be scaled beforehand. In practice there +are several layers of caching in order to keep the memory footprint within +reasonable bounds. \footnote {In retrospect one can wonder if that makes sense; +just look at how much memory a browser uses when it has been open for some time. +In the beginning of \LUATEX\ users wondered about caching fonts, but again, just +look at what amounts browsers cache: it gets pretty close to the average amount +of writes that a \SSD\ can handle per day within its guarantee.} + +When the font is actually used, interaction between characters is resolved using +the feature|-|related information. When for instance two characters need to be +kerned, a lookup results in the injection of a kern, scaled from general +dimensions to the current size of the font. + +When the outlines of glyphs are needed in \METAFUN\ the font is also converted +from its binary form to something in \LUA, but this time we filter the shapes. +For a \type {cff} this comes down to interpreting the \type {charstrings} and +reducing the complexity to \type {moveto}, \type {lineto} and \type {curveto} +operators. In the process subroutines are inlined. The result is something that +\METAPOST\ is happy with but that also can be turned into a piece of a \PDF. + +We now come to what a variable font actually is: a basic design which is +transformed along one or more axes. A simple example is wider shapes: + +\startlinecorrection +\startMPcode +for i=1 upto 4 : + fill fullsquare xyscaled (i*.5cm,1cm) shifted (i*2.5*cm,0) withcolor "darkgray"; + fill fullcircle xyscaled (2.5mm,2.5mm) shifted (i*2.5*cm,0) withcolor "lightgray" ; +endfor ; +\stopMPcode +\stoplinecorrection + +We can also go taller and retain the width: + +\startlinecorrection +\startMPcode +for i=1 upto 4 : + fill fullsquare xyscaled (1cm,i*.5cm) shifted (i*2.5*cm,0) withcolor "darkgray"; + fill fullcircle xyscaled (2.5mm,2.5mm) shifted (i*2.5*cm,0) withcolor "lightgray" ; +endfor ; +\stopMPcode +\stoplinecorrection + +Here we have a linear scaling but glyphs are not normally done that way. There +are font collections out there with lots of intermediate variants (say from light +to heavy) and it's more profitable to sell each variant independently. However, +there is often some logic behind it, probably supported by programs that +designers use, so why not build that logic into the font and have one file that +represents many intermediate forms. In fact, once we have multiple axes, even +when the designer has clear ideas of the intended usage, nothing will prevent +users from tinkering with the axis properties in ways that will fulfil their +demands but hurt the designers eyes. We will not discuss that dilemma here. + +When a variable font follows the route described above, we face a problem. When +you load a \TRUETYPE\ font it will just work. The glyphs are packaged in the same +format as static fonts. However, a variable font has axes and on each axis a +value can be set. Each axis has a minimum, maximum and default. It can be that +the default instance also assumes some transformations are applied. The standard +recommends adding tables to describe these things but the fonts that I played +with each lacked such tables. So that leaves some guesswork. But still, just +loading a \TRUETYPE\ font gives some sort of outcome, although the dimensions +(widths) might be weird due to lack of a (default) axis being applied. + +An \OPENTYPE\ font with \POSTSCRIPT\ outlines is different: the internal \type +{cff} format has been upgraded to \type {cff2} which on the one hand is less +complicated but on the other hand has a few new operators \emdash\ which results +in programs that have not been adapted complaining or simply quitting on them. + +One could argue that a font is just a resource and that one only has to pass it +along but that's not what works well in practice. Take \LUATEX. We can of course +load the font and apply axis vales so that we can process the document as we +normally do. But at some point we have to create a \PDF. We can simply embed the +\TRUETYPE\ files but no axis values are applied. This is because, even if we add +the relevant information, there is no way in current \PDF\ formats to deal with +it. For that, we should be able to pass all relevant axis|-|related information +as well as specify what values to use along these axes. And for \TRUETYPE\ fonts +this information is not part of the shape description so then we in fact need to +filter and pass more. An \OPENTYPE\ \POSTSCRIPT\ font is much cleaner because +there we have the information needed to transform the shape mostly in the glyph +description. There we only need to carry some extra information on how to apply +these so|-|called blend values. The region|/|axis model used there only demands +passing a relatively simple table (stripped down to what we need). But, as said +above, \type {cff2} is not backward-compatible so a viewer will (currently) +simply not show anything. + +Recalling how we load fonts, how does that translate with variable changes? If we +have two characters with glyphs that get transformed and that have a kern between +them, the kern may or may not transform. So, when we choose values on an axis, +then not only glyph properties change but also relations. We no longer can share +positional information and scale afterwards because each instance can have +different values to start with. We could carry all that information around and +apply it at runtime but because we're typesetting documents with a static design +it's more convenient to just apply it once and create an instance. We can use the +same caching as mentioned before but each chosen instance (provided by the font +or made up by user specifications) is kept in the cache. As a consequence, using +a variable font has no overhead, apart from initial caching. + +So, having dealt with that, how do we proceed? Processing a font is not different +from what we already had. However, I would not be surprised if users are not +always satisfied with, for instance, kerning, because in such fonts a lot of care +has to be given to this by the designer. Of course I can imagine that programs +used to create fonts deal with this, but even then, there is a visual aspect to +it too. The good news is that in \CONTEXT\ we can manipulate features so in +theory one can create a so|-|called font goodie file for a specific instance. + +\stopsubject + +\startsubject[title=Shapes] + +For \OPENTYPE\ \POSTSCRIPT\ shapes we always have to do a dummy rendering in +order to get the right bounding box information. For \TRUETYPE\ this information +is already present but not when we use a variable instance, so I had to do a bit +of coding for that. Here we face a problem. For \TEX\ we need the width, height +and depth of a glyph. Consider the following case: + +\startlinecorrection +\startMPcode +path p ; p := fullcircle xysized (3cm,2cm) ; +fill p + withcolor "lightgray" ; +draw boundingbox currentpicture + withpen pencircle scaled .5mm + withcolor "darkgray" ; +setbounds currentpicture to p ; +draw boundingbox currentpicture + leftenlarged 2mm rightenlarged 5mm ; +\stopMPcode +\stoplinecorrection + +The shape has a bounding box that fits the shape. However, its left corner is not +at the origin. So, when we calculate a tight bounding box, we cannot use it for +actually positioning the glyph. We do use it (for horizontal scripts) to get the +height and depth but for the width we depend on an explicit value. In \OPENTYPE\ +\POSTSCRIPT\ we have the width available and how the shape is positioned relative +to the origin doesn't much matter. In a \TRUETYPE\ shape a bounding box is part +of the specification, as is the width, but for a variable font one has to use +so-called phantom points to recalculate the width and the test fonts I had were +not suitable for investigating this. + +At any rate, once I could generate documents with typeset text using variable +fonts it became time to start thinking about a user interface. A variable font +can have predefined instances but of course a user also wants to mess with axis +values. Take one of the test fonts: Adobe Variable Font Prototype. It has several +instances: + +\unexpanded\def\SampleFont#1#2#3% + {\NC #2 + \NC \definedfont[name:#1#3*default]It looks like this! + \normalexpanded{\noexpand\NC\currentfontinstancespec} + \NC \NR} + +\starttabulate[|||T|] +\SampleFont {adobevariablefontprototype} {extralight} {extralight} +\SampleFont {adobevariablefontprototype} {light} {light} +\SampleFont {adobevariablefontprototype} {regular} {regular} +\SampleFont {adobevariablefontprototype} {semibold} {semibold} +\SampleFont {adobevariablefontprototype} {bold} {bold} +\SampleFont {adobevariablefontprototype} {black high contrast} {blackhighcontrast} +\SampleFont {adobevariablefontprototype} {black medium contrast} {blackmediumcontrast} +\SampleFont {adobevariablefontprototype} {black} {black} +\stoptabulate + +Such an instance is accessed with: + +\starttyping +\definefont + [MyLightFont] + [name:adobevariablefontprototypelight*default] +\stoptyping + +The Avenir Next variable demo font (currently) provides: + +\starttabulate[|||T|] +\SampleFont {avenirnextvariable} {regular} {regular} +\SampleFont {avenirnextvariable} {medium} {medium} +\SampleFont {avenirnextvariable} {bold} {bold} +\SampleFont {avenirnextvariable} {heavy} {heavy} +\SampleFont {avenirnextvariable} {condensed} {condensed} +\SampleFont {avenirnextvariable} {medium condensed} {mediumcondensed} +\SampleFont {avenirnextvariable} {bold condensed} {boldcondensed} +\SampleFont {avenirnextvariable} {heavy condensed} {heavycondensed} +\stoptabulate + +Before we continue I will show a few examples of variable shapes. Here we use some +\METAFUN\ magic. Just take these definitions for granted. + +\startbuffer[a] +\startMPcode + draw outlinetext.b + ("\definedfont[name:adobevariablefontprototypeextralight]foo@bar") + (withcolor "gray") + (withcolor red withpen pencircle scaled 1/10) + xsized .45TextWidth ; +\stopMPcode +\stopbuffer + +\startbuffer[b] +\startMPcode + draw outlinetext.b + ("\definedfont[name:adobevariablefontprototypelight]foo@bar") + (withcolor "gray") + (withcolor red withpen pencircle scaled 1/10) + xsized .45TextWidth ; +\stopMPcode +\stopbuffer + +\startbuffer[c] +\startMPcode + draw outlinetext.b + ("\definedfont[name:adobevariablefontprototypebold]foo@bar") + (withcolor "gray") + (withcolor red withpen pencircle scaled 1/10) + xsized .45TextWidth ; +\stopMPcode +\stopbuffer + +\startbuffer[d] +\startMPcode + draw outlinetext.b + ("\definefontfeature[whatever][axis={weight:350}]% + \definedfont[name:adobevariablefontprototype*whatever]foo@bar") + (withcolor "gray") + (withcolor red withpen pencircle scaled 1/10) + xsized .45TextWidth ; +\stopMPcode +\stopbuffer + +\typebuffer[a,b,c,d] + +The results are shown in \in {figure} [fig:whatever:1]. What we see here is that +as long as we fill the shape everything will look as expected but using an +outline only won't. The crucial (control) points are moved to different locations +and as a result they can end up inside the shape. Giving up outlines is the price +we evidently need to pay. Of course this is not unique for variable fonts +although in practice static fonts behave better. To some extent we're back to +where we were with \METAFONT\ and (for instance) Computer Modern: because these +originate in bitmaps (and probably use similar design logic) we also can have +overlap and bits and pieces pasted together and no one will notice that. The +first outline variants of Computer Modern also had such artifacts while in the +static Latin Modern successors, outlines were cleaned up. + +\startplacefigure[title=Four variants,reference=fig:whatever:1] + \startcombination[2*2] + {\getbuffer[a]} {a} + {\getbuffer[b]} {b} + {\getbuffer[c]} {d} + {\getbuffer[d]} {c} + \stopcombination +\stopplacefigure + +The fact that we need to preprocess an instance but only know how to do that when +we have gotten the information about axis values from the font means that the +font handler has to be adapted to keep caching correct. Another definition is: + +\starttyping +\definefontfeature + [lightdefault] + [default] + [axis={weight:230,contrast:50}] + +\definefont + [MyLightFont] + [name:adobevariablefontprototype*lightdefault] +\stoptyping + +Here the complication is that where normally features are dealt with after +loading, the axis feature is part of the preparation (and caching). If you want +the virtual font solution you can do this: + +\starttyping +\definefontfeature + [inlinelightdefault] + [default] + [axis={weight:230,contrast:50}, + variableshapes=yes] + +\definefont + [MyLightFont] + [name:adobevariablefontprototype*inlinelightdefault] +\stoptyping + +When playing with these fonts it was hard to see if loading was done right. For +instance not all values make sense. It is beyond the scope of this article, but +axes like weight, width, contrast and italic values get applied differently to +so|-|called regions (subspaces). So say that we have an $x$ coordinate with value +$50$. This value can be adapted in, for instance, four subspaces (regions), so we +actually get: + +\startformula + x^\prime = x + + s_1 \times x_1 + + s_2 \times x_2 + + s_3 \times x_3 + + s_4 \times x_4 +\stopformula + +The (here) four scale factors $s_n$ are determined by the axis value. Each axis +has some rules about how to map the values $230$ for weight and $50$ for contrast +to such a factor. And each region has its own translation from axis values to +these factors. The deltas $x_1,\dots,x_4$ are provided by the font. For a +\POSTSCRIPT|-|based font we find sequences like: + +\starttyping +1 <setvstore> +120 [10 -30 40 -60] 1 <blend> ... <operator> +100 120 [10 -30 40 -60] [30 -10 -30 20] 2 <blend> .. <operator> +\stoptyping + +A store refers to a region specification. From there the factors are calculated +using the chosen values on the axis. The deltas are part of the glyphs +specification. Officially there can be multiple region specifications, but how +likely it is that they will be used in real fonts is an open question. + +For \TRUETYPE\ fonts the deltas are not in the glyph specification but in a +dedicated \type {gvar} table. + +\starttyping +apply x deltas [10 -30 40 -60] to x 120 +apply y deltas [30 -10 -30 20] to y 100 +\stoptyping + +Here the deltas come from tables outside the glyph specification and their +application is triggered by a combination of axis values and regions. + +The following two examples use Avenir Next Variable and demonstrate that kerning +is adapted to the variant. + +\startbuffer +\definefontfeature + [default:shaped] + [default] + [axis={width:10}] + +\definefont + [SomeFont] + [file:avenirnextvariable*default:shaped] +\stopbuffer + +\typebuffer \getbuffer + +\start \showglyphs \showfontkerns \SomeFont \input zapf \wordright{Hermann Zapf}\par \stop + +\startbuffer +\definefontfeature + [default:shaped] + [default] + [axis={width:100}] + +\definefont + [SomeFont] + [file:avenirnextvariable*default:shaped] +\stopbuffer + +\typebuffer \getbuffer + +\start \showglyphs \showfontkerns \SomeFont \input zapf \wordright{Hermann Zapf}\par \stop + +\stopsubject + +\startsubject[title=Embedding] + +Once we're done typesetting and a \PDF\ file has to be created there are three +possible routes: + +\startitemize + \startitem + We can embed the shapes as \PDF\ images (inline literal) using virtual + font technology. We cannot use so|-|called xforms here because we want to + support color selectively in text. + \stopitem + \startitem + We can wait till the \PDF\ format supports such fonts, which might happen + but even then we might be stuck for years with viewers getting there. Also + documents need to get printed, and when printer support might + arrive is another unknown. + \stopitem + \startitem + We can embed a regular font with shapes that match the chosen values on the + axis. This solution is way more efficient than the first. + \stopitem +\stopitemize + +Once I could interpret the right information in the font, the first route was the +way to go. A side effect of having a converter for both outline types meant that +it was trivial to create a virtual font at runtime. This option will stay in +\CONTEXT\ as pseudo|-|feature \type {variableshapes}. + +When trying to support variable fonts I tried to limit the impact on the backend +code. Also, processing features and such was not touched. The inclusion of the +right shapes is done via a callback that requests the blob to be injected in the +\type {cff} or \type {glyf} table. When implementing this I actually found out +that the \LUATEX\ backend also does some juggling of charstrings, to serve the +purpose of inlining subroutines. In retrospect I could have learned a few tricks +faster by looking at that code but I never realized that it was there. Looking at +the code again, it strikes me that the whole inclusion could be done with \LUA\ +code and some day I will give that a try. + +\stopsubject + +\startsubject[title=Conclusion] + +When I first heard about variable fonts I was confident that when they showed up +they could be supported. Of course a specimen was needed to prove this. A first +implementation demonstrates that indeed it's no big deal to let \CONTEXT\ with +\LUATEX\ handle such fonts. Of course we need to fill in some gaps which can be +done once we have complete fonts. And then of course users will demand more +control. In the meantime the helper script that deals with identifying fonts by +name has been extended and the relevant code has been added to the distribution. +At some point the \CONTEXT\ Garden will provide the \LUATEX\ binary that has the +callback. + +I end with a warning. On the one hand this technology looks promising but on the +other hand one can easily get lost. Probably most such fonts operate over a +well|-|defined domain of values but even then one should be aware of complex +interactions with features like positioning or replacements. Not all combinations +can be tested. It's probably best to stick to fonts that have all the relevant +tables and don't depend on properties of a specific rendering technology. + +Although support is now present in the core of \CONTEXT\ the official release +will happen at the \CONTEXT\ meeting in 2017. By then I hope to have tested more +fonts. Maybe the interface has also been extended by then because after all, +\TEX\ is about control. + +\stopsubject + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/onandon/onandon.tex b/doc/context/sources/general/manuals/onandon/onandon.tex new file mode 100644 index 000000000..60b626a5e --- /dev/null +++ b/doc/context/sources/general/manuals/onandon/onandon.tex @@ -0,0 +1,56 @@ +% author : Hans Hagen +% copyright : PRAGMA ADE & ConTeXt Development Team +% license : Creative Commons Attribution ShareAlike 4.0 International +% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions +% origin : the ConTeXt distribution +% +% comment : Because this manual is distributed with TeX distributions it comes with a rather +% liberal license. We try to adapt these documents to upgrades in the (sub)systems +% that they describe. Using parts of the content otherwise can therefore conflict +% with existing functionality and we cannot be held responsible for that. Many of +% the manuals contain characteristic graphics and personal notes or examples that +% make no sense when used out-of-context. +% +% comment : Some chapters have been published in TugBoat, the NTG Maps, the ConTeXt Group +% journal or otherwise. Thanks to the editors for corrections. + +% Timestamp: I started this document in the week https://www.youtube.com/watch?v=PFWz_6hnAEI +% showed up --- and there's more of this bbc performance --- it's this kind of the stuff that +% keeps me going 'on and on' .. Jacob C, Cory H, Snarky P, Jules B with orchestra ... it can't +% get any better I guess (although .. what would happen if we add Gavin H to that equation). +% And when looking at https://www.youtube.com/watch?v=c5FqpddnJmc ... it's the kind of innovation +% in music that reminds me of first hearing Kate Bush (equally young when she showed up). + +\environment onandon-environment + +\startproduct onandon + +\component onandon-titlepage + +\startfrontmatter + \component onandon-contents + \component onandon-introduction +\stopfrontmatter + +\startbodymatter + \component onandon-decade + \component onandon-ffi + % \startchapter[title=Variable fonts] First published in user group magazines. \stopchapter + \component onandon-variable + \component onandon-emoji + \startchapter[title={Children of \TEX}] First published in user group magazines. \stopchapter + % \component onandon-children + \component onandon-performance + \component onandon-editing + \startchapter[title={Advertising \TEX}] First published in user group magazines. \stopchapter + % \component onandon-perception + \startchapter[title={Tricky fences}] First published in user group magazines. \stopchapter + % \component onandon-fences + % \component onandon-media + \startchapter[title={From 5.2 to 5.3}] Maybe first published in user group magazines. \stopchapter + % \component onandon-53 + \startchapter[title={Executing \TEX}] Maybe first published in user group magazines. \stopchapter + % \component onandon-execute +\stopbodymatter + +\stopproduct diff --git a/doc/context/sources/general/manuals/pagecolumns/pagecolumns-000.tex b/doc/context/sources/general/manuals/pagecolumns/pagecolumns-000.tex new file mode 100644 index 000000000..418595aa1 --- /dev/null +++ b/doc/context/sources/general/manuals/pagecolumns/pagecolumns-000.tex @@ -0,0 +1,72 @@ +% content=tex +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\startenvironment pagecolumns-000 + +\usemodule[visual,simulate] + +\dontcomplain + +\useMPlibrary[dum] + +\setupbodyfont + [palatino] + +\setuplayout + [grid=yes] + +\setuplayout + [backspace=20mm, + cutspace=15mm, + width=middle, + height=middle] + +\setupsystem + [random=1234] + +\setuppagenumbering + [alternative=doublesided, + location=] + +\setupheadertexts + [pagenumber][right] + [left][pagenumber] + +\setupfootertexts + [\inputfilename] + +\setupfooter + [color=black, + style=\tttf] + +\setupheader + [color=black, + style=\tttf] + +\setuptolerance + [verytolerant,stretch] + +\definecolor[color-3][.5(red,black)] +\definecolor[color-2][.5(green,black)] +\definecolor[color-1][.5(blue,black)] +\definecolor[color-4][.5(white,black)] +\definecolor[color-5][.5(white,color-4)] + +\definecolor[fakerulecolor][white] + +\setupcolors + [textcolor=white] + +\startuniqueMPgraphic{frame} + fill OverlayBox withcolor \MPcolor{color-1} ; +\stopuniqueMPgraphic + +\startuniqueMPgraphic{contrast} + fill OverlayBox withcolor \MPcolor{color-3} ; +\stopuniqueMPgraphic + +\defineoverlay[frame] [\uniqueMPgraphic{frame}] +\defineoverlay[contrast][\uniqueMPgraphic{contrast}] + +\stopenvironment diff --git a/doc/context/sources/general/manuals/pagecolumns/pagecolumns-001.tex b/doc/context/sources/general/manuals/pagecolumns/pagecolumns-001.tex new file mode 100644 index 000000000..afdca49aa --- /dev/null +++ b/doc/context/sources/general/manuals/pagecolumns/pagecolumns-001.tex @@ -0,0 +1,24 @@ +% content=tex +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\environment pagecolumns-000 + +\definepagecolumns + [example] + [n=2] + +\setupbackgrounds + [text] + [background=color, + backgroundcolor=color-1] + +\starttext + +\startpagecolumns[example] + + \dorecurse{20}{\fakewords{100}{200}\par} + +\stoppagecolumns + +\stoptext diff --git a/doc/context/sources/general/manuals/pagecolumns/pagecolumns-002.tex b/doc/context/sources/general/manuals/pagecolumns/pagecolumns-002.tex new file mode 100644 index 000000000..d425d3b82 --- /dev/null +++ b/doc/context/sources/general/manuals/pagecolumns/pagecolumns-002.tex @@ -0,0 +1,79 @@ +% content=tex +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\environment pagecolumns-000 + +\definepagecolumns + [example] + [n=3, + distance=\emwidth] + +\setupbackgrounds + [text] + [background=color, + backgroundcolor=color-1] + +\starttext + +\startpagecolumns[example] + +\dorecurse {7} { + \startplacefigure[location={here,none}] + \framed + [width=\columnwidth, + height=1cm, + frame=off, + background=color, + backgroundcolor=color-2] + {Here: A.#1} + \stopplacefigure + \samplefile{tufte} + \startplacefigure[location={here,none}] + \framed + [width=\columnwidth, + height=1cm, + frame=off, + background=color, + backgroundcolor=color-2] + {Here: B.#1} + \stopplacefigure + \samplefile{tufte} + \startplacefigure[location={here,none}] + \framed + [width=\textwidth, + height=1cm, + frame=off, + background=color, + backgroundcolor=color-2] + {Here: C.#1} + \stopplacefigure + \startplacefigure[location={here,none}] + \framed + [width=\measure{twocolumns}, + height=1cm, + frame=off, + background=color, + backgroundcolor=color-2] + {Here: D.#1} + \stopplacefigure + \samplefile{tufte} + \startplacefigure[location={force,none}] + \framed + [width=\columnwidth, + height=1cm, + frame=off, + background=color, + backgroundcolor=color-2] + {Force: E.#1} + \stopplacefigure +} + +\dorecurse {7} { + \samplefile{tufte} + \par +} + +\stoppagecolumns + +\stoptext diff --git a/doc/context/sources/general/manuals/pagecolumns/pagecolumns-003.tex b/doc/context/sources/general/manuals/pagecolumns/pagecolumns-003.tex new file mode 100644 index 000000000..544458b34 --- /dev/null +++ b/doc/context/sources/general/manuals/pagecolumns/pagecolumns-003.tex @@ -0,0 +1,53 @@ +% content=tex +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\environment pagecolumns-000 + +\definepagecolumns + [example] + [n=3, + distance=\emwidth] + +\setupbackgrounds + [text] + [background=color, + backgroundcolor=color-1] + +\starttext + +\startpagecolumns[example] + +\dorecurse {7} { + \startplacefigure[location={top,none}] + \framed + [width=\textwidth, + height=1cm, + frame=off, + background=color, + backgroundcolor=color-2] + {A.#1} + \stopplacefigure + \startplacefigure[location={top,none}] + \framed + [width=\measure{twocolumns}, + height=1cm, + frame=off, + background=color, + backgroundcolor=color-3] + {B.#1} + \stopplacefigure + \samplefile{tufte} + \par +} + +\dorecurse {7} { + \samplefile{tufte} + \par +} + +\stoppagecolumns + +\stoptext + + diff --git a/doc/context/sources/general/manuals/pagecolumns/pagecolumns-004.tex b/doc/context/sources/general/manuals/pagecolumns/pagecolumns-004.tex new file mode 100644 index 000000000..2144d399b --- /dev/null +++ b/doc/context/sources/general/manuals/pagecolumns/pagecolumns-004.tex @@ -0,0 +1,54 @@ +% content=tex +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\environment pagecolumns-000 + +\definepagecolumns + [example] + [n=3, + distance=\emwidth] + +\setupbackgrounds + [text] + [background=color, + backgroundcolor=color-1] + +\starttext + +\startpagecolumns[example] + +\dorecurse {7} { + + \startplacefigure[location={top,none}] + \framed + [width=1cm, + height=1cm, + frame=off, + background=color, + backgroundcolor=color-2] + {A.#1} + \stopplacefigure + + \startplacefigure[location={left,none}] + \framed + [width=1cm, + height=1cm, + frame=off, + background=color, + backgroundcolor=color-2] + {A.#1} + \stopplacefigure + + \samplefile{tufte} + \footnote{foo #1.1} + \footnote{foo #1.2} + + \par +} + +\stoppagecolumns + +\stoptext + + diff --git a/doc/context/sources/general/manuals/pagecolumns/pagecolumns-005.tex b/doc/context/sources/general/manuals/pagecolumns/pagecolumns-005.tex new file mode 100644 index 000000000..c714879fd --- /dev/null +++ b/doc/context/sources/general/manuals/pagecolumns/pagecolumns-005.tex @@ -0,0 +1,52 @@ +% content=tex +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\environment pagecolumns-000 + +\definepagecolumns + [example] + [n=3, + distance=\emwidth] + +\setupbackgrounds + [text] + [background=color, + backgroundcolor=color-1] + +\starttext + +\startpagecolumns[example] + +\dorecurse {7} { + + \startplacefigure[location={top,none}] + \framed + [width=1cm, + height=1cm, + frame=off, + background=color, + backgroundcolor=color-2] + {A.#1} + \stopplacefigure + + \startplacefigure[location={left,none}] + \framed + [width=1cm, + height=6cm, + frame=off, + background=color, + backgroundcolor=color-2] + {B.#1} + \stopplacefigure + + \samplefile{klein}\par + \samplefile{klein}\par + +} + +\stoppagecolumns + +\stoptext + + diff --git a/doc/context/sources/general/manuals/pagecolumns/pagecolumns-006.tex b/doc/context/sources/general/manuals/pagecolumns/pagecolumns-006.tex new file mode 100644 index 000000000..b56470bbc --- /dev/null +++ b/doc/context/sources/general/manuals/pagecolumns/pagecolumns-006.tex @@ -0,0 +1,45 @@ +% content=tex +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\environment pagecolumns-000 + +\definepagecolumns + [example] + [n=3, + distance=\emwidth] + +\setupbackgrounds + [text] + [background=color, + backgroundcolor=color-1] + +\starttext + +\startpagecolumns[example] + +\dorecurse {20} { + HERE #1.1 + \samplefile{klein}\column + \samplefile{klein}\page +} + +\page[right] + +RIGHT PAGE + +\page[left] + +LEFT PAGE + +\dorecurse {20} { + HERE #1.2 + \samplefile{klein}\column + \samplefile{klein}\page +} + +\stoppagecolumns + +\stoptext + + diff --git a/doc/context/sources/general/manuals/pagecolumns/pagecolumns-007.tex b/doc/context/sources/general/manuals/pagecolumns/pagecolumns-007.tex new file mode 100644 index 000000000..aefa62588 --- /dev/null +++ b/doc/context/sources/general/manuals/pagecolumns/pagecolumns-007.tex @@ -0,0 +1,70 @@ +% content=tex +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\environment pagecolumns-000 + +\definepagecolumns[example][n=2,distance=\emwidth] + +\setupbackgrounds[text][background=color,backgroundcolor=color-1] + +\useMPlibrary[dum] + +\starttext + +\startbuffer[small] + \framed + [width=3cm, + height=2cm, + frame=off, + background=color, + backgroundcolor=color-2] + {Small} +\stopbuffer + +\startbuffer[large] + \framed + [width=12cm, + height=6cm, + frame=off, + background=color, + backgroundcolor=color-2] + {Large} +\stopbuffer + +\startpagecolumns[example] + \samplefile{tufte}\par + \startplacefigure[location=here,title=Test] + \getbuffer[small] + \stopplacefigure + \startplacefigure[location=here,title=Test] + \getbuffer[small] + \stopplacefigure + \samplefile{tufte}\par +\stoppagecolumns + +\startpagecolumns[example] + \samplefile{tufte}\par + \startplacefigure[location=here,title=Test] + \getbuffer[small] + \stopplacefigure + \startplacefigure[location=here,title=Test] + \getbuffer[large] + \stopplacefigure + \samplefile{tufte}\par +\stoppagecolumns + +\startpagecolumns[example] + \samplefile{tufte}\par + \startplacefigure[location=here,title=Test] + \getbuffer[large] + \stopplacefigure + \startplacefigure[location=here,title=Test] + \getbuffer[large] + \stopplacefigure + \samplefile{tufte}\par +\stoppagecolumns + +\stoptext + + diff --git a/doc/context/sources/general/manuals/pagecolumns/pagecolumns.tex b/doc/context/sources/general/manuals/pagecolumns/pagecolumns.tex new file mode 100644 index 000000000..40a396e1b --- /dev/null +++ b/doc/context/sources/general/manuals/pagecolumns/pagecolumns.tex @@ -0,0 +1,395 @@ +% macros=mkvi language=uk + +\definemeasure[onecolumn] [\columnwidth] +\definemeasure[twocolumns] [\dimexpr\plustwo \columnwidth+ \columndistance\relax] +\definemeasure[threecolumns][\dimexpr\plusthree\columnwidth+\plustwo \columndistance\relax] +\definemeasure[fourcolumns] [\dimexpr\plusfour \columnwidth+\plusthree\columndistance\relax] + +\usemodule[abr-04] + +\setupbodyfont + [dejavu,11pt] + +\definefont[QuiteLarge][SansBold sa 2.50] +\definefont[NotSoLarge][SansBold sa 1.25] + +\setuplayout + [backspace=.1\paperwidth, + topspace=.025\paperheight, + header=0.025\paperheight, + footer=0.025\paperheight, + headerdistance=0.025\paperheight, + footerdistance=0.025\paperheight, + width=middle, + height=middle] + +\setuppagenumbering + [alternative=doublesided, + location=] + +\setupwhitespace + [line] + +\setupblank + [line] + +\setuptyping + [blank=halfline] + +\startsetups [pagenumber] + \hbox to .2\paperwidth { + \hss + Page \pagenumber + \hss + } +\stopsetups + +\setupfooter [before=\vfill,after=\vfill,style=\bf,color=color-4] +\setupheader [before=\vfill,after=\vfill,style=\bf,color=color-4] + +\setupfootertexts [] [\setups{pagenumber}] +\setupheadertexts [] [\setups{chapterhead}] + +\startsetups [chapterhead] + \hbox to .2\paperwidth { + \hss + \getmarking[chapter] + \hss + } +\stopsetups + +\setuphead + [chapter] + [header=empty] + +\definecolor[color-3][.5(red,black)] +\definecolor[color-2][.5(green,black)] +\definecolor[color-1][.5(blue,black)] +\definecolor[color-4][.5(white,black)] +\definecolor[color-5][.5(white,color-4)] +\definecolor[color-6][.2(white,color-4)] + +\definecolor[fakerulecolor][white] + +\usemodule[typesetting] + +\setupcombination + [style=mono] + +\startuseMPgraphic{page} +StartPage ; + path p ; + numeric n; n := PageNumber ; + numeric w; w := bbwidth(Page) ; + numeric h; h := bbheight(Page) ; + def DrawBit (expr bit, dx, dy) = + path p ; p := unitsquare xyscaled(w/5,h/40) shifted (dx*w/10,dy*(h-h/40)) ; + if n div bit > 0 : + n := n - (n div bit)*bit ; + fill p withcolor \MPcolor{color-1} ; + else : + fill p withcolor \MPcolor{color-2} ; + fi ; + enddef ; + DrawBit(32,7,1) ; + DrawBit(16,4,1) ; + DrawBit( 8,1,1) ; + DrawBit( 4,7,0) ; + DrawBit( 2,4,0) ; + DrawBit( 1,1,0) ; +StopPage ; +\stopuseMPgraphic + +\startuniqueMPgraphic{frame} + fill OverlayBox withcolor \MPcolor{color-5} ; +\stopuniqueMPgraphic + +\startuniqueMPgraphic{contrast} + fill OverlayBox withcolor \MPcolor{color-4} ; +\stopuniqueMPgraphic + +\defineoverlay[page] [\useMPgraphic{page}] +\defineoverlay[frame] [\useMPgraphic{frame}] +\defineoverlay[contrast][\useMPgraphic{contrast}] + +\setuphead + [chapter] + [style=\QuiteLarge, + color=color-3, + number=no] + +\setuplist + [chapter] + [command=\MyListCommand, + alternative=command] + +\starttexdefinition unexpanded MyListCommand #1#2#3 + \snaptogrid + [line,-line]\vbox { + \tfb + \setstrut + \strut#2 + \quad#3 + } +\stoptexdefinition + +\setupmargindata + [style=\tttf, + color=color-3] + +\starttexdefinition unexpanded ShowFile #1 + \margintext + {\cldcontext{string.match("#1","\letterpercent d+")}} + \typefile + [range={environment}] + {#1} +\stoptexdefinition + +% \typefile[range=4] {...} +% \typefile[range={=}]{...} % start after comment lines + +\starttexdefinition unexpanded ShowEnvironmentFile #1 + \margintext + {\cldcontext{string.match("#1","\letterpercent d+")}} + \typefile + [range={=startenvironment}] + {#1} +\stoptexdefinition + +\startdocument + +\startMPpage +StartPage ; + path p ; numeric w, h, d ; picture q ; + if true : + q := image(draw textext.urt("\ssbf PAGES") withcolor \MPcolor{color-6}) ; + else : + q := image(draw textext.urt("\ssbf PAGECOLUMNS") withcolor \MPcolor{color-6}) ; + fi ; + w := bbwidth(Page) ; + h := bbheight(Page) ; + d := h/100 ; + fill Page withcolor \MPcolor{color-1} ; + p := Page xysized (w,d) ; + for i := 5d step 2d until h-5d : + fill p shifted (0,i) withcolor \MPcolor{color-2} ; + endfor + p := Page xysized(w/10,h) ; + for i = 0, .3, .6, .9 : + fill p shifted (i*w,0) withcolor \MPcolor{color-1} withtransparency(1,.75) ; + endfor ; + def do_it(expr sz, sh) = + p := Page xysized sz ; + fill p shifted sh withcolor \MPcolor{color-3} withtransparency(1,.5) ; + draw q xysized (bbwidth(p),bbheight(p)) shifted sh ; + enddef ; + do_it ((8w/10,13d),(.1w,81d)) ; + do_it ((5w/10,13d),(.4w,67d)) ; + do_it ((2w/10,17d),(.1w,20d)) ; + do_it ((2w/10,15d),(.1w,56d)) ; + do_it ((1w/10,10d),(.4w,40d)) ; + do_it ((2w/10,13d),(.7w,27d)) ; + draw textext.urt("\ssbf Hans Hagen") + xysized (5w/10,5d) + shifted (.4w,6d) + withcolor \MPcolor{color-5} ; +StopPage ; +\stopMPpage + +\page[empty] \setuppagenumber[number=1] + +\setupbackgrounds + [page] + [background=page] + +\starttitle[title=Contents] + + \placelist[chapter] + +\stoptitle + +\startchapter[title=Introduction] + +{\em This manual as well as the mechanism it describes is under construction. Don't +use page columns in production. Experimenting is of course fine.} + +The \TEX\ engine is a progressive typesetter: it takes input and does something +with it and can do that for quite a while. It can process massive input and +produce massive output. In that process it never looks back. Now, it is of course +possible to collect content and delay some aspects of the rendering but to what +extent that content can be manipulated is limited. In \LUATEX\ one can do a bit +more but even then the basic typesetting process is mostly linear. + +When a text gets typeset there are several properties that play a role: + +\startitemize +\startitem + the width of the lines in a paragraph which is the main unit of processing +\stopitem +\startitem + the target height of what gets output, normally this is the height of the + text area, excluding headers and footers +\stopitem +\startitem + the parameters that determine when the so called output routine gets called, + for instance successive broken lines, widow and club penalties +\stopitem +\startitem + the presence of so called inserts, for instance footnotes or floating bodies +\stopitem +\startitem + the space between lines and paragraphs +\stopitem +\startitem + explicitly entered elements or spacing or injected by macros hooked into for + instance \type {\everypar} +\stopitem +\stopitemize + +It is important to realize that \TEX\ has no concept of what a page is. It takes +input and occasionally hand over the intermediate result to the output routine. +There decisions are made to flush out a page, either of not with ornaments like +headers, footers, content left over from previous encounters, footnotes as well +as maybe specific trickery liked by the backend that targets at some viewer. + +That said, so called multi|-|column layouts are {\em not} part of the concepts +present in \TEX. As far as the engine is concerned there is only one column. +Among the reasons for not having a native mechanism for columns is that it is +very hard to come up with a mechanism for splitting them in ways that suits +everybody. In fact, the amount of control needed would make such a mechanism very +complex and still limited. You can compare this to math typesetting. That +subspace has some fixed characteristics if only because otherwise mathematicians +could not communicate. However, there is some control over spacing and one can to +some extend intervene. In \LUATEX\ some of the hard coded properties are made +configureable but still one gets pretty much what the engine considers right. +Such an approach would not work with columns. In fact, it doesn't even work well +with tables, for which \TEX\ provides the alignment mechanism: different kind of +tables demand different solutions, which is why in \CONTEXT\ we have old +fashioned tables, tabulated tables (that span pages and can contain paragraphs), +natural as well as extreme tables that resemble \HTML\ tables, line tables and +framed tables. + +So, when we want to support columns we need to write something in \TEX\ lingua +and for that the \type {\vsplit} operation can be of help. So far we have in +\CONTEXT\ four mechanisms: + +\startitemize[n] +\startitem + the original \MKII\ mechanism that permits mixed single and multi|-|column + text flows, with limited support for floating bodies +\stopitem +\startitem + a reimplementation of mixed columns in a mix of \TEX\ and \LUA, a bit better + with balancing and penalties for keeping section heads with the text, but + with very limited support for floating bodies; it works ok with grids +\stopitem +\startitem + a reimplementation of \MKII\ columnsets, a mechanism that is meant for + magazine like layouts where floats can span columns and positioned at will: + this one assumes relative simple text flows but as a bonus provides spreads; + this one is strongly grid based +\stopitem +\startitem + page based columns, where we use the normal (single column) page builder to + collect columns that then get combined into a page: this one is quite robust + but one has to keep an eye on floats as we don't span across columns + otherwise than in top or bottom floats but, on the other hand, one can use so + called side floats; this one is still experimental +\stopitem +\stopitemize + +Given specific demands one can come up with alternatives but it's very hard to +combine all demands into one mechanismn simply because anything can be part of +the text flow. Because it is not much fun to write such mechanisms and because +no project ever pays for fundamental development, one just has to accept what +\CONTEXT\ provides, be it with limitations. + +The first mechanism is more or less obsolete and replaced by the second. For +instance, we now use the second one when we have an itemize that demands columns. +I must admit that I don't like columns and never use them. I was involved in +projects where the designer wanted columns but in the end the complexity of the +content didn't work well with that that decision: inconsistent whitespace (due to +many small sections, lots of images, many tables, math formulas, etc) as well as +the result having more pages that the single column variant with side and margin +floats. Occasionally I use columned itemize or columned tables of contents and of +course registers are often in columns. + +One can wonder why columns are supported anyway. It's mostly useful for +newspapers that have wide pages or journals that have small print. For magazines +and special layout it's fine too although it can look bad when columns are narrow +and fancy layout tricks are used. I guess that at some point their use will +disappear. A document on a phone or tablet is one narrow columns. An internet +page is one long column. A printed book, given that there will be such items in +the future is normally typeset in one column. And journals as well as newspapers +more and more get replaced by media that better serve their purpose. So, apart +from an intellectual challenge, implementing extensive multi|-|column support is +a waste of energy. Which is why we can accept limitations. + +\stopchapter + +\startchapter[title=Just text] + +As with the other mechanism you can define a column instance and use that later. +You can also directly pass the settings with the \type {\startpagecolumns} command +but best is to define an instance. + +\FourPages{pagecolumns-001} + +\ShowFile{pagecolumns-001} + +We always start at a new page and end on a new one. Footnotes and such don't span +columns and we don't balance. When the number of columns equals one you get the +normal routine but with the requested settings. + +\stopchapter + +\startchapter[title=Floats] + +You can have floating bodies in columns. When a float doesn't fit it will be +flushed at the top of the next page. + +\FourPages{pagecolumns-002} + +\ShowFile{pagecolumns-002} + +\SixPages{pagecolumns-007} + +\ShowFile{pagecolumns-007} + +Side floats are also supported but we don't treat them special so you get the +same behaviour as with single column layouts. + +\FourPages{pagecolumns-005} + +\ShowFile{pagecolumns-005} + +\FourPages{pagecolumns-003} + +\ShowFile{pagecolumns-003} + + +\stopchapter + +\startchapter[title=Footnotes] + +Footnotes are supported but we assume sane usage. You can always revert to +endnotes if needed. + +\FourPages{pagecolumns-004} + +\ShowFile{pagecolumns-004} + +\stopchapter + +\startchapter[title=Pages] + +Going to a new page happens with \type {\page} and progressing to the next column +with \type {\column}. + +\FourSpread{pagecolumns-006} + +\ShowFile{pagecolumns-006} + +\stopchapter + +\stopdocument diff --git a/doc/context/sources/general/manuals/publications/122176.pdf b/doc/context/sources/general/manuals/publications/122176.pdf Binary files differnew file mode 100644 index 000000000..f8db03c1c --- /dev/null +++ b/doc/context/sources/general/manuals/publications/122176.pdf diff --git a/doc/context/sources/general/manuals/publications/124484.mol b/doc/context/sources/general/manuals/publications/124484.mol new file mode 100644 index 000000000..24800c395 --- /dev/null +++ b/doc/context/sources/general/manuals/publications/124484.mol @@ -0,0 +1,62 @@ +141125 + Marvin 01010811133D + + 13 13 0 0 0 0 999 V2000 + -0.1283 -2.5422 -0.0043 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1658 -0.6138 0.0065 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.1195 -1.3196 -0.0021 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0475 0.8443 -0.0012 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.2986 -0.6295 -0.0041 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.1554 1.4497 -0.0042 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3072 0.7176 -0.0039 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7474 -0.9159 -0.8684 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7236 -0.9042 0.9004 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8754 1.3949 -0.0035 H 0 0 0 0 0 0 0 0 0 0 0 0 + -2.1653 -1.1196 -0.0049 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.2061 2.4425 -0.0066 H 0 0 0 0 0 0 0 0 0 0 0 0 + -2.1794 1.1959 -0.0037 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 3 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 2 8 1 0 0 0 0 + 2 9 1 0 0 0 0 + 3 5 1 0 0 0 0 + 4 6 2 0 0 0 0 + 4 10 1 0 0 0 0 + 5 7 2 0 0 0 0 + 5 11 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 12 1 0 0 0 0 + 7 13 1 0 0 0 0 +M END + +> <PUBCHEM_BONDANNOTATIONS> +2 3 8 +2 4 8 +3 5 8 +4 6 8 +5 7 8 +6 7 8 + +> <StdInChI> +InChI=1S/C6H6O/c7-6-4-2-1-3-5-6/h1-4H,5H2 + +> <StdInChIKey> +WQPDQJCBHQPNCZ-UHFFFAOYSA-N + +> <AuxInfo> +1/0/N:6,7,4,5,2,3,1/rA:13nOCCCCCCHHHHHH/rB:;d1s2;s2;s3;d4;d5s6;s2;s2;s4;s5;s6;s7;/rC:-.1283,-2.5422,-.0043;1.1658,-.6138,.0065;-.1195,-1.3196,-.0021;1.0475,.8443,-.0012;-1.2986,-.6295,-.0041;-.1554,1.4497,-.0042;-1.3072,.7176,-.0039;1.7474,-.9159,-.8684;1.7236,-.9042,.9004;1.8754,1.3949,-.0035;-2.1653,-1.1196,-.0049;-.2061,2.4425,-.0066;-2.1794,1.1959,-.0037; + +> <Formula> +C6 H6 O + +> <Mw> +94.11124 + +> <SMILES> +O=C1C([H])=C([H])C([H])=C([H])C1([H])[H] + +> <CSID> +124484 + +$$$$ diff --git a/doc/context/sources/general/manuals/publications/124484.pdf b/doc/context/sources/general/manuals/publications/124484.pdf Binary files differnew file mode 100644 index 000000000..227a35b29 --- /dev/null +++ b/doc/context/sources/general/manuals/publications/124484.pdf diff --git a/doc/context/sources/general/manuals/publications/4953942.mol b/doc/context/sources/general/manuals/publications/4953942.mol new file mode 100644 index 000000000..9addc2281 --- /dev/null +++ b/doc/context/sources/general/manuals/publications/4953942.mol @@ -0,0 +1,54 @@ +6451477 + Marvin 12300719113D + + 13 13 0 0 0 0 999 V2000 + 0.0758 1.5048 0.6075 O 0 0 0 0 0 0 0 0 0 0 0 0 + -0.7275 -1.1065 -0.4102 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6148 -1.1430 -0.4871 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.5117 -0.0902 0.0316 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4983 -0.1720 -0.1409 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.0967 1.1007 0.4952 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2041 1.0381 0.3634 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.2084 -1.9253 -0.7143 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0128 -1.9857 -0.8416 H 0 0 0 0 0 0 0 0 0 0 0 0 + -2.4964 -0.2417 0.0106 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4645 -0.3767 -0.2737 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.7903 1.7498 0.7873 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9607 1.6477 0.5723 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 4 1 0 0 0 0 + 2 8 1 0 0 0 0 + 3 5 1 0 0 0 0 + 3 9 1 0 0 0 0 + 4 6 2 0 0 0 0 + 4 10 1 0 0 0 0 + 5 7 2 0 0 0 0 + 5 11 1 0 0 0 0 + 6 12 1 0 0 0 0 + 7 13 1 0 0 0 0 +M END + +> <StdInChI> +InChI=1S/C6H6O/c1-2-4-6-7-5-3-1/h1-6H + +> <StdInChIKey> +ATYBXHSAIOKLMG-UHFFFAOYSA-N + +> <AuxInfo> +1/0/N:2,3,4,5,6,7,1/E:(1,2)(3,4)(5,6)/rA:13nOCCCCCCHHHHHH/rB:;d2;s2;s3;s1d4;s1d5;s2;s3;s4;s5;s6;s7;/rC:.0758,1.5048,.6075;-.7275,-1.1065,-.4102;.6148,-1.143,-.4871;-1.5117,-.0902,.0316;1.4983,-.172,-.1409;-1.0967,1.1007,.4952;1.2041,1.0381,.3634;-1.2084,-1.9253,-.7143;1.0128,-1.9857,-.8416;-2.4964,-.2417,.0106;2.4645,-.3767,-.2737;-1.7903,1.7498,.7873;1.9607,1.6477,.5723; + +> <Formula> +C6 H6 O + +> <Mw> +94.11124 + +> <SMILES> +O1C([H])=C([H])C([H])=C([H])C([H])=C1[H] + +> <CSID> +4953942 + +$$$$ diff --git a/doc/context/sources/general/manuals/publications/4953942.pdf b/doc/context/sources/general/manuals/publications/4953942.pdf Binary files differnew file mode 100644 index 000000000..02c6cc22a --- /dev/null +++ b/doc/context/sources/general/manuals/publications/4953942.pdf diff --git a/doc/context/sources/general/manuals/publications/971.mol b/doc/context/sources/general/manuals/publications/971.mol new file mode 100644 index 000000000..d27a673ba --- /dev/null +++ b/doc/context/sources/general/manuals/publications/971.mol @@ -0,0 +1,62 @@ +996 + Marvin 12300703363D + + 13 13 0 0 0 0 999 V2000 + -1.1709 -2.1086 -0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + -0.5317 -1.0277 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8788 -1.0328 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.2264 0.1986 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.5888 0.1839 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.5163 1.4138 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8912 1.4069 -0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3960 -1.9155 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + -2.2490 0.2143 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6112 0.1810 -0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.0246 2.3005 -0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4055 2.2902 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + -2.0526 -2.1045 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 13 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 4 1 0 0 0 0 + 3 5 1 0 0 0 0 + 3 8 1 0 0 0 0 + 4 6 2 0 0 0 0 + 4 9 1 0 0 0 0 + 5 7 2 0 0 0 0 + 5 10 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 11 1 0 0 0 0 + 7 12 1 0 0 0 0 +M END + +> <PUBCHEM_BONDANNOTATIONS> +2 3 8 +2 4 8 +3 5 8 +4 6 8 +5 7 8 +6 7 8 + +> <StdInChI> +InChI=1S/C6H6O/c7-6-4-2-1-3-5-6/h1-5,7H + +> <StdInChIKey> +ISWSIDIOOBJBQZ-UHFFFAOYSA-N + +> <AuxInfo> +1/0/N:7,5,6,3,4,2,1/E:(2,3)(4,5)/rA:13nOCCCCCCHHHHHH/rB:s1;d2;s2;s3;d4;d5s6;s3;s4;s5;s6;s7;s1;/rC:-1.1709,-2.1086,0;-.5317,-1.0277,0;.8788,-1.0328,0;-1.2264,.1986,0;1.5888,.1839,0;-.5163,1.4138,0;.8912,1.4069,0;1.396,-1.9155,0;-2.249,.2143,0;2.6112,.181,0;-1.0246,2.3005,0;1.4055,2.2902,0;-2.0526,-2.1045,0; + +> <Formula> +C6 H6 O + +> <Mw> +94.11124 + +> <SMILES> +O([H])C1C([H])=C([H])C([H])=C([H])C=1[H] + +> <CSID> +971 + +$$$$ diff --git a/doc/context/sources/general/manuals/publications/971.pdf b/doc/context/sources/general/manuals/publications/971.pdf Binary files differnew file mode 100644 index 000000000..a2fbc32c7 --- /dev/null +++ b/doc/context/sources/general/manuals/publications/971.pdf diff --git a/doc/context/sources/general/manuals/publications/C6H6O.bib b/doc/context/sources/general/manuals/publications/C6H6O.bib new file mode 100644 index 000000000..4e37e3d19 --- /dev/null +++ b/doc/context/sources/general/manuals/publications/C6H6O.bib @@ -0,0 +1,105 @@ +@chemical{108-95-2, + cas = {108-95-2}, + formula = {C_6H_6O}, + chemspider = {971}, + pubchem = {996}, + mw = {94.113}, + mass = {94.042}, + IUPAC = {phenol}, + name = {phenol}, + name:en = {phenol}, + name:nl = {fenol}, + name:pl = {fenol}, + name:it = {fenolo}, + name:fr = {phénol}, + name:de = {phenole}, + synonyms = {carbolic acid; hydroxybenzene; monohydroxybenzene; phenic acid; + phenyl alcohol; benzophenol; carbolicum acidum; phenic alcohol; + phenyl hydroxide; phenylic acid; carbolic oil; carbolsaeure;}, + molarvolume = {87.9 cm³}, + mp = {42°C}, + bp = {181°C}, + density = {1.071 g/ml}, + ionization = {8.5 eV}, + vaporpressure = {0.4 mmHg}, + refractiveindex = {1.553}, + surfacetension = {41.0 dyne/cm}, + appearance = {Colorless to light-pink, crystalline solid with a sweet, acrid odor}, + chemical = {SIX,ROT,B,EB135,+SR1,RZ1=OH}, + InChI={1S/C6H6O/c7-6-4-2-1-3-5-6/h1-5,7H}, + SMILES={C1=CC=C(C=C1)O}, + jmol = {971.mol}, + rendered = {971.pdf}, +} + +@chemical{24599-57-3, + cas = {24599-57-3}, + formula = {C_6H_6O}, + chemspider = {124484}, + pubchem = {141125}, + mw = {94.113}, + mass = {94.042}, + IUPAC = {cyclohexa-2,4-dien-1-one}, + name = {cyclohexadienone}, + name:en = {2,4-cyclohexadien-1-one}, + name:fr = {2,4-cyclohexadién-1-one}, + name:de = {2,4-cyclohexadien-1-on}, + density = {1.1 g/ml}, + bp = {182.4°C}, + refractiveindex = {1.515}, + surfacetension = {37.2 dyne/cm}, + molarvolume = {89.5 cm³}, + chemical = {SIX,ROT,B,EB35,+DR1,RZ1=O}, + InChI={1S/C6H6O/c7-6-4-2-1-3-5-6/h1-4H,5H2}, + SMILES = {C1C=CC=CC1=O}, + jmol = {124484.mol}, + rendered = {124484.pdf}, +} + +@chemical{566-33-5, + cas = {566-33-5}, + formula = {C_6H_6O}, + pubchem = {138558}, + chemspider = {122176}, + mw = {94.113}, + mass = {94.042}, + IUPAC = {cyclohexa-2,5-dien-1-one}, + name = {2,5-cyclohexadienone}, + name:en = {2,5-cyclohexadien-1-one}, + name:fr = {2,5-cyclohexadién-1-one}, + name:de = {2,5-cyclohexadien-1-on}, + density = {1.1 g/ml}, + bp = {173°C}, + refractiveindex = {1.515}, + surfacetension = {37.2 dyne/cm}, + molarvolume = {89.5 cm³}, + chemical = {SIX,ROT,B,EB25,+DR1,RZ1=O}, + InChI = {1S/C6H6O/c7-6-4-2-1-3-5-6/h2-5H,1H2}, + SMILES = {C1C=CC(=O)C=C1}, + jmol = {122176.mol}, + rendered = {122176.pdf}, +} + +@chemical{291-70-3, + cas = {291-70-3}, + chemspider = {4953942}, + pubchem = {6451477}, + formula = {C_6H_6O}, + mw = {94.113}, + mass = {94.042}, + IUPAC = {oxepine}, + name = {oxepin}, + name:en = {Oxacycloheptatriene}, + name:fr = {oxépine}, + name:de = {oxepin}, + density = {1.0 g/ml}, + bp = {183.1°C}, + refractiveindex = {1.502}, + surfacetension = {39.9 dyne/cm}, + molarvolume = {95.1 cm³}, + chemical = {SEVEN,ROT,+SB7,-SB1,B2..6,EB246,Z1=O}, + InChI={1S/C6H6O/c1-2-4-6-7-5-3-1/h1-6H}, + SMILES = {C1=CC=COC=C1}, + jmol = {4953942.mol}, + rendered = {4953942.pdf}, +} diff --git a/doc/context/sources/general/manuals/publications/boekplan.bib b/doc/context/sources/general/manuals/publications/boekplan.bib new file mode 100644 index 000000000..5089388ed --- /dev/null +++ b/doc/context/sources/general/manuals/publications/boekplan.bib @@ -0,0 +1,93 @@ +@Book{Hagen2010metafun, + Title = {MetaFun}, + + Address = {Hassalt, NL}, + Author = {Hans Hagen}, + Edition = {2nd}, + Month = {October}, + Organization = {PRAGMA ADE}, + Year = {2010}, + + Abstract = {If you like graphics, you may like MetaFun, a collection of MetaPost macros. The manual covers most of MetaPost, as well as the interface between this graphical environment and ConTeXt. There are numerous examples, that give you an impression about the power of this graphical system as well as the strength of the combination with TeX. + +This is the second version of the MetaFun book. This version is adapted to ConTeXt MkIV that uses LuaTeX with MPlib. Although the book targets at ConTeXt users, much of the content concerns general usage of MetaPost, a small and fast system for making graphics.}, + Day = {8}, + File = {metafun-p.pdf}, + ISBN = {978-94-90688-02-8}, + Keywords = {MetaPost; ConTeXt; MkIV. LuaTeX}, + Language = {english}, + TotalPages = {375}, + Publisher = {Boekplan}, + Url = {http://www.h2o-books.com/catalog/context/metafun} +} + +@Book{Hagen2010mkii-mkiv, + Title = {MKII - MKIV, the history of LuaTeX}, + Author = {Hans Hagen}, + Publisher = {Boekplan}, + Year = {2010}, + + Address = {Hassalt, NL}, + Month = {October}, + + Abstract = {The objective of the LuaTeX project by Taco Hoekwater, Hartmut Henkel and Hans Hagen is to provide a versatile successor to TeX. During the development the team keeps track of ideas and experiments. In parallel ConTeXt MkIV is developed. This book describes the development of both systems and shows what impact the project has. The book start at version zero and ends with version 0.50, the first formal release.}, + Day = {30}, + Keywords = {ConTeXt; MkII; MkIV; LuaTeX}, + Language = {english}, + TotalPages = {328}, + Url = {http://www.h2o-books.com/catalog/context/mkii-mkiv} +} + +@Manual{Hagen2014bibliographies, + Title = {Bibliographies}, + + Address = {Hassalt, NL}, + Author = {Hans Hagen and Alan Braslau}, + Note = {still incomplete}, + Organization = {PRAGMA ADE \& \CONTEXT\ Development Team}, + Year = {2015}, + + Abstract = {Abstract...}, + Comment = {Comment...}, + File = {mkiv-publications.pdf}, + Keywords = {manual}, + Language = {english}, + Review = {Review...}, + Subtitle = {The \CONTEXT\ way} +} + +@Book{Hoekwater2011fonts, + Title = {Fonts in ConTeXt}, + + Address = {Hassalt, NL}, + Author = {Taco Hoekwater and Hans Hagen}, + Month = {February}, + Year = {2011}, + + Abstract = {This booklet describes how to define and use fonts in ConTeXt. It demonstrates how to use individual fonts and provides examples of more complex setups for related font styles. Although ConTeXt comes with many fonts set up, this manual is a must-read for those who want to roll out their own setups.}, + Day = {18}, + ISBN = {978-94-90688-03-5}, + Keywords = {fonts; ConTeXt; MkIV; LuaTeX}, + Language = {english}, + TotalPages = {128}, + Publisher = {Boekplan}, + Url = {http://www.h2o-books.com/catalog/context/fonts} +} + +@Book{Hoekwater2011layouts, + Title = {Layouts in ConTeXt}, + + Address = {Hassalt, NL}, + Author = {Taco Hoekwater and Hans Hagen and Willi Egger}, + Month = {July}, + Year = {2011}, + + Abstract = {One of the principles behind ConTeXt is that you can create your own styles. Often defining a style starts with setting up the page layout. This booklet tells in detail how to do that. It also contains information on how to prepare your documents for professional printing, including page imposition.}, + Day = {11}, + ISBN = {978-94-90688-00-4}, + Keywords = {ConTeXt; MkIV; LuaTeX}, + Language = {english}, + TotalPages = {142}, + Publisher = {Boekplan}, + Url = {http://www.h2o-books.com/catalog/context/layouts} +} diff --git a/doc/context/sources/general/manuals/publications/duane.bib b/doc/context/sources/general/manuals/publications/duane.bib new file mode 100644 index 000000000..bc31a26e1 --- /dev/null +++ b/doc/context/sources/general/manuals/publications/duane.bib @@ -0,0 +1,116 @@ +@IMAGE {tug2014, + title = "TUG 2014", + url = "http://tug.org/tug2014/", + url_image = "http://tug.org/art/tug2014-color.jpg", + url_thumb = "http://tug.org/tug2014/t2014-thumb.jpg", + description = "Official drawing of the TUG 2014 conference", + author = "Duane Bibby", + year = 2014, +} + +@IMAGE {tug2013, + title = "TUG 2013", + url = "http://tug.org/tug2013/", + url_image = "http://tug.org/tug2013/tug2013-color-300.jpg", + url_thumb = "http://tug.org/tug2013/t2013-thumb.jpg", + description = "Official drawing of the TUG 2013 conference", + author = "Duane Bibby", + year = 2013, +} + +@IMAGE {tug2012, + title = "TUG 2012", + url = "http://tug.org/tug2012/", + url_image = "http://www.tug.org/art/tug2012-color.jpg", + url_thumb = "http://www.tug.org/tug2012/t2012-thumb.jpg", + description = "Official drawing of the TUG 2012 conference", + author = "Duane Bibby", + year = 2012, +} + +@IMAGE {tug2011, + title = "TUG 2011: TeX in the eBook era", + url = "http://tug.org/tug2011/", + url_image = "http://www.tug.org/art/tug2011-boatrace.jpg", + url_thumb = "http://www.tug.org/tug2011/art/t2011-thumb.jpg", + description = "Official drawing of the TUG 2011 conference", + author = "Duane Bibby", + year = 2011, +} + +@IMAGE {tug2010, + title = "TUG 2010: TeX's $2^5$ anniversary", + url = "http://tug.org/tug2010/", + url_image = "http://www.tug.org/art/tug2010-color.jpg", + url_thumb = "http://www.tug.org/tug2010/t2010-thumb.jpg", + description = "Official drawing of the TUG 2010 conference", + author = "Duane Bibby", + year = 2010, +} + +@IMAGE {tug2009, + title = "TUG 2009", + url = "http://tug.org/tug2009/", + url_image = "http://www.tug.org/art/tug2009.jpg", + url_thumb = "http://www.tug.org/tug2009/t2009-thumb.jpg", + description = "Official drawing of the TUG 2009 conference", + author = "Duane Bibby", + year = 2009, +} + +@IMAGE {tug2008, + title = "TUG 2008", + url = "http://www.ucc.ie/archive/tug2008/", + url_image = "http://www.tug.org/art/tug2008.jpg", + url_thumb = "", + description = "Official drawing of the TUG 2008 conference", + author = "Duane Bibby", + year = 2008, +} + +@IMAGE {tug2007, + title = "TUG 2007", + url = "http://tug.org/tug2007/", + url_image = "http://www.tug.org/tug2007/t2007.jpg", + url_thumb = "http://www.tug.org/tug2007/t2007-thumb.jpg", + description = "Official drawing of the TUG 2007 conference", + author = "Duane Bibby", + year = 2007, +} + +% URL not working +@IMAGE {tug2006, + title = "TUG 2006", + url = "http://tug.org/tug2006/", + url_image = "http://www.tug.org/art/tug2006-color.jpg", + url_thumb = "", + description = "Official drawing of the TUG 2006 conference", + author = "Duane Bibby", + year = 2006, +} + +@IMAGE {tug2006bw, + title = "TUG 2006 b&w", + url = "http://tug.org/tug2006/", + url_image = "http://www.tug.org/art/tug2006-bw.jpg", + url_thumb = "", + colorspace = "gray", + description = "Official drawing of the TUG 2006 conference (black and white version)", + author = "Duane Bibby", + year = 2006, +} + + +@IMAGE {tug2005, + title = "TUG 2005", + url = "http://tug.org/tug2005/", + url_image = "http://www.tug.org/art/tug2005.jpg", + url_thumb = "", + description = "Official drawing of the TUG 200 conference", + author = "Duane Bibby", + year = 2005, +} + +% http://www.tug.org/art/ +% https://tug.org/meetings.html +% http://www.tug.org/tug2001/bulletin/bulletin.jpg diff --git a/doc/context/sources/general/manuals/publications/manuals.bib b/doc/context/sources/general/manuals/publications/manuals.bib new file mode 100644 index 000000000..00f5d9136 --- /dev/null +++ b/doc/context/sources/general/manuals/publications/manuals.bib @@ -0,0 +1,47 @@ +@BOOK {h2o:layouts-in-context, + title = "Layouts in ConTeXt", + author = "Taco Hoekwater and Hans Hagen and Willi Egger", + year = 2011, + month = 07, + day = 11, + url = "http://www.h2o-books.com/node/12", + url_image = "http://www.h2o-books.com/sites/default/files/imagecache/product_full/layout-cover.png", + url_thumb = "http://www.h2o-books.com/sites/default/files/imagecache/product/layout-cover.png", + price = 24, +} + +@BOOK {h2o:fonts-in-context, + title = "Fonts in ConTeXt", + author = "Taco Hoekwater and Hans Hagen", + year = 2011, + month = 02, + day = 18, + url = "http://www.h2o-books.com/node/11", + url_image = "http://www.h2o-books.com/sites/default/files/imagecache/product_full/fonts-cover.png", + url_thumb = "http://www.h2o-books.com/sites/default/files/imagecache/product/fonts-cover.png", + price = 19, +} + +@BOOK {h2o:mkii-mkiv, + title = "MKII - MKIV, the history of LuaTeX", + author = "Hans Hagen", + year = 2010, + month = 10, + day = 30, + url = "http://www.h2o-books.com/node/10", + url_image = "http://www.h2o-books.com/sites/default/files/imagecache/product_full/mk-thumb.png", + url_thumb = "http://www.h2o-books.com/sites/default/files/imagecache/product/mk-thumb.png", + price = 49, +} + +@BOOK {h2o:metafun-manual, + title = "MetaFun manual", + author = "Hans Hagen", + year = 2010, + month = 10, + day = 10, + url = "http://www.h2o-books.com/node/9", + url_image = "http://www.h2o-books.com/sites/default/files/imagecache/product_full/metafun-thumb_0.png", + url_thumb = "http://www.h2o-books.com/sites/default/files/imagecache/product/metafun-thumb_0.png", + price = 49, +} diff --git a/doc/context/sources/general/manuals/publications/mkiv-publications.bib b/doc/context/sources/general/manuals/publications/mkiv-publications.bib new file mode 100644 index 000000000..15086e5b0 --- /dev/null +++ b/doc/context/sources/general/manuals/publications/mkiv-publications.bib @@ -0,0 +1,680 @@ +@Comment{Start example} +@Article{article, + Title = {Article title}, + Title:fr = {Titre de l'article}, + Author = {First Last} + # { and First Middle Last} + # { and Last, First-Combined} + # { and First van Last} + # { and van Last, First Middle} + # { and Last, Junior, First Middle} + # { and van Last, Junior III, First Middle} + # { and De La, Last, Junior III, First Middle}, + Journal = {Journal name}, + Year = {YYYY}, + + Note = {note...}, + Number = {number}, + Pages = {ff--tt}, + Subtitle = {Subtitle}, + Type = {Special Issue}, + Volume = {volume}, + + Month = {MM-ignored!}, + Day = {DD-ignored!}, + Abstract = {Abstract...}, + Warning = {Notice that Comment= also exists}, + Comment = {Comment...}, + XCrossref = {crossref}, + Doi = {doi-specification}, + Keywords = {keyword1; keyword2; keyword3}, + Language = {english}, + Review = {Review...}, + Url = {url} +} +@Comment{Stop example} +@Article{article, + Title = {Article title}, + Title:fr = {Titre de l'article}, + Author = {First Last} + # { and First Middle Last} + # { and Last, First-Combined} + # { and First van Last} + # { and van Last, First Middle} + # { and Last, Junior, First Middle} + # { and van Last, Junior III, First Middle} + # { and De La, Last, Junior III, First Middle}, + Journal = {Journal name}, + Year = {YYYY}, + + Note = {note...}, + Number = {number}, + Pages = {ff--tt}, + Subtitle = {Subtitle}, + Type = {Special Issue}, + Volume = {volume}, + + Month = {MM-ignored!}, + Day = {DD-ignored!}, + Abstract = {Abstract...}, + Warning = {Notice that Comment= also exists}, + Comment = {Comment...}, + XCrossref = {crossref}, + Doi = {doi-specification}, + Keywords = {keyword1; keyword2; keyword3}, + Language = {english}, + Review = {Review...}, + Url = {url} +} + +@Comment{We define a few other instances of Article to test some realistic contingencies.} + +@Article{advancedonline, + Message = {This is an example of an advanced online publication.}, + Title = {Advanced article title}, + Author = {LastnameA, FirstnameA + and LastnameB, FirstnameB + and LastnameC, FirstnameC + and LastnameD, FirstnameD + and LastnameE, FirstnameE + and LastnameF, FirstnameF + and LastnameG, FirstnameG}, + Journal = {Journal name}, + + Language = {english}, + Url = {url}, +} + +@Magazine{magazine, + Message = {This is a magazine article.}, + Title = {Magazine article title}, + Author = {MagazineLastname, Firstname}, + Journal = {Magazine name}, + Year = {YYYY}, + + Month = {Month}, + Day = {DD}, + Note = {note...}, + Number = {number}, + Pages = {ff--tt}, + + Abstract = {Abstract...}, + Comment = {Comment...}, + PercentCrossref = {crossref}, + Keywords = {magazine}, + Language = {english}, + Review = {Review...}, + Url = {url} +} + +@Newspaper{newspaper, + Message = {This is a newspaper article.}, + Title = {Article title}, + Author = {NewspaperLastname, Firstname}, + Journal = {Newspaper name}, + Year = {YYYY}, + + Month = {Month}, + Day = {DD}, + Note = {note...}, + Number = {number}, + Pages = {ff--tt}, + + Abstract = {Abstract...}, + Comment = {Comment...}, + PercentCrossref = {crossref}, + Keywords = {newspaper}, + Language = {english}, + Review = {Review...}, + Url = {url} +} + +@Newspaper{editorial, + Message = {This is a newspaper editorial.}, + Editor = {EditorLastname, Firstname}, + Title = {Editorial title}, + Journal = {Newspaper name}, + Year = {YYYY}, + + Month = {Month}, + Day = {DD}, + Note = {note...}, + Number = {number}, + Pages = {ff--tt}, + Type = {Editorial}, + + Abstract = {Abstract...}, + Comment = {Comment...}, + PercentCrossref = {crossref}, + Keywords = {editorial}, + Language = {english}, + Review = {Review...}, + Url = {url} +} + +@Book{book, + Title = {Book title}, + Title = {Title2}, + Author = {BookAuthorLastnameA, Firstname + and BookAuthorLastnameB, Firstname Middle + and BookAuthorLastnameC, Firstname-Combined}, + Editor = {EditorLastname, Firstname}, + Editor = {EditorLastname2, Firstname}, + Publisher = {Publisher}, + Year = {YYYY}, + + Address = {Address}, + Edition = {edition}, + Month = {Month}, + Note = {note...}, + Number = {number}, + Series = {series}, + Type = {Translated title, for example}, + Volume = {volume}, + + Abstract = {Abstract...}, + Comment = {Comment...}, + PercentCrossref = {crossref}, + Doi = {doi-specification}, + Keywords = {book}, + Language = {english}, + Review = {Review...}, + Url = {url} +} + +@Book{selfpublished, + Title = {Book title}, + Author = {BookAuthorLastname, Firstname}, + Author = {BookAuthorLastname2, Firstname}, + Year = {YYYY}, + + Address = {Address}, + + Comment = {A self-published book}, + Language = {english}, +} + +@Book{editedbook, + Editor = {EditorLastnameA, Firstname + and EditorLastnameB, Firstname}, + Publisher = {Publisher}, + Title = {Book title}, + Year = {YYYY}, + + Address = {Address}, + + Comment = {Editors as authors}, + Language = {english}, +} + +@Book{noauthor, + Title = {Book title}, + Publisher = {Publisher}, + Year = {YYYY}, + + Address = {Address}, + + Comment = {Publisher as author}, + Language = {english}, +} + +@Booklet{booklet, + Title = {Booklet title}, + + Address = {Address}, + Author = {BookletAuthorLastname, Firstname}, + HowPublished = {howpublished}, + Month = {Month}, + Note = {note...}, + Year = {YYYY}, + + Abstract = {Abstract...}, + Comment = {Comment...}, + PercentCrossref = {crossref}, + Doi = {doi-specification}, + Keywords = {booklet}, + Language = {english}, + Review = {Review...}, + Url = {url} +} + +@Conference{conference, + Title = {Conference title}, + Author = {ConferenceAuthorLastname, Firstname}, + Booktitle = {Booktitle}, + Year = {YYYY}, + + Address = {Address}, + Editor = {EditorLastname, Firstname}, + Month = {Month}, + Note = {note...}, + Number = {number}, + Organization = {<Symposium conducted at the meeting of> Organization}, + Pages = {ff--tt}, + Publisher = {publisher}, + Series = {series}, + Volume = {volume}, + + Abstract = {Abstract...}, + Comment = {Comment...}, + PercentCrossref = {crossref}, + Doi = {doi-specification}, + Keywords = {conference}, + Language = {english}, + Review = {Review...}, + Url = {url} +} + +@Electronic{electronic, + Title = {Electronic title}, + + Address = {Address}, + Author = {ElectronicAuthorLastname, Firstname}, + HowPublished = {howpublished}, + Language = {english}, + Month = {Month}, + Note = {note...}, + Organization = {Organization}, + Url = {url}, + Year = {YYYY}, + + Abstract = {Abstract...}, + Comment = {Comment...}, + PercentCrossref = {crossref}, + Doi = {doi-specification}, + Keywords = {electronic}, + Review = {Review...}, +} + +@Film{film, + Title = {Film title}, + + Director = {DirectorLastname, Firstname}, + Producer = {ProducerLastName, Firstname}, + Publisher = {studio}, + Address = {address}, + Note = {note...}, + Year = {YYYY}, + + Abstract = {Abstract...}, + Comment = {Comment...}, + PercentCrossref = {crossref}, + Keywords = {misc}, + Language = {english}, + Review = {Review...}, + Url = {url} +} + +@InBook{inbook, + Title = {InBook title}, + Author = {InBookAuthorLastname, Firstname}, + Chapter = {Chapter title}, + Editor = {EditorLastname, Firstname}, + Pages = {ff--tt}, + Publisher = {publisher}, + Year = {YYYY}, + + Address = {Address}, + Edition = {edition}, + Month = {Month}, + Note = {note...}, + Number = {number}, + Series = {series}, + Type = {type}, + Volume = {volume}, + + Abstract = {Abstract...}, + Comment = {Comment...}, + PercentCrossref = {crossref}, + Doi = {doi-specification}, + Keywords = {inbook}, + Language = {english}, + Review = {Review...}, + Url = {url} +} + +@InCollection{incollection, + Title = {InCollection title}, + Author = {InCollectionAuthorLastname, Firstname}, + Booktitle = {Booktitle}, + Publisher = {publisher}, + Year = {YYYY}, + + Address = {Address}, + Chapter = {Chaptertitle}, + Edition = {edition}, + Editor = {EditorLastname, Firstname}, + Month = {Month}, + Note = {note...}, + Number = {number}, + Pages = {ff--tt}, + Series = {series}, + Type = {type}, + Volume = {volume}, + + Abstract = {Abstract...}, + Comment = {Comment...}, + PercentCrossref = {crossref}, + Doi = {doi-specification}, + Keywords = {incollection}, + Language = {english}, + Review = {Review...}, + Url = {url} +} + +@InProceedings{inproceedings, + Title = {InProceedings title}, + Author = {InProceedingsAuthorLastname, Firstname}, + Booktitle = {Booktitle}, + Year = {YYYY}, + + Address = {Address}, + Editor = {EditorLastname, Firstname}, + Month = {Month}, + Note = {note...}, + Number = {number}, + Organization = {<Symposium conducted at the meeting of> Organization}, + Pages = {ff--tt}, + Publisher = {publisher}, + Series = {series}, + Volume = {volume}, + + Abstract = {Abstract...}, + Comment = {Comment...}, + PercentCrossref = {crossref}, + Doi = {doi-specification}, + Keywords = {inproceedings}, + Language = {english}, + Review = {Review...}, + Url = {url} +} + +@Manual{manual, + Title = {Manual title}, + + Address = {Address}, + Author = {ManualLastname, Firstname}, + Edition = {Edition}, + Month = {Month}, + Note = {note...}, + Organization = {Organization}, + Year = {YYYY}, + + Abstract = {Abstract...}, + Comment = {Comment...}, + Doi = {doi-specification}, + Keywords = {manual}, + Review = {Review...}, + Url = {url} +} + +@MastersThesis{mastersthesis, + Title = {MastersThesis title}, + Author = {MastersThesisAuthorLastname, Firstname}, + School = {school}, + Year = {YYYY}, + + Address = {Address}, + Month = {Month}, + Note = {note...}, + Type = {type}, + + Abstract = {Abstract...}, + Comment = {Comment...}, + PercentCrossref = {crossref}, + Doi = {doi-specification}, + Keywords = {mastersthesis}, + Language = {english}, + Review = {Review...}, + Url = {url} +} + +@Thesis{thesis, + Title = {Thesis title}, + Author = {ThesisAuthorLastname, Firstname}, + School = {school}, + Year = {YYYY}, + + Address = {Address}, + Month = {Month}, + Note = {note...}, + Type = {type of thesis}, + + Abstract = {Abstract...}, + Comment = {Comment...}, + PercentCrossref = {crossref}, + Doi = {doi-specification}, + Keywords = {mastersthesis}, + Language = {english}, + Review = {Review...}, + Url = {url} +} + +@Misc{misc, + Title = {Misc title}, + + Author = {MiscAuthorLastname, Firstname}, + HowPublished = {howpublished}, + Month = {Month}, + Note = {note...}, + Year = {YYYY}, + + Abstract = {Abstract...}, + Comment = {Comment...}, + PercentCrossref = {crossref}, + Doi = {doi-specification}, + Keywords = {misc}, + Language = {english}, + Review = {Review...}, + Url = {url} +} + +@Music{music, + Title = {Music title}, + Album = {Album title}, + + Artist = {ArtistLastname, Firstname}, + Composer = {ComposerLastName, Firstname}, + Publisher = {label}, + Address = {address}, + Note = {note...}, + Year = {YYYY}, + + Abstract = {Abstract...}, + Comment = {Comment...}, + PercentCrossref = {crossref}, + Keywords = {misc}, + Language = {english}, + Review = {Review...}, + Url = {url} +} + +@Other{other, + Title = {Other title}, + Abstract = {Abstract...}, + Author = {OtherAuthorLastname, Firstname}, + Comment = {Comment...}, + PercentCrossref = {crossref}, + Doi = {doi-specification}, + Keywords = {other}, + Language = {english}, + Note = {note...}, + Review = {Review...}, + Url = {url}, + Year = {YYYY} +} + +@Patent{patent, + Title = {Patent title}, + Nationality = {nationality}, + Number = {number}, + Year = {YYYY}, + Yearfiled = {YYYYfiled}, + Author = {PatentAuthorLastname, Firstname}, + Language = {english}, + Note = {note...}, + Url = {url}, + + Abstract = {Abstract...}, + Comment = {Comment...}, + PercentCrossref = {crossref}, + Doi = {doi-specification}, + Keywords = {patent}, + Review = {Review...}, +} + +@Periodical{periodical, + Title = {Periodical title}, + + Editor = {EditorLastname, Firstname}, + Language = {english}, + Month = {Month}, + Note = {note...}, + Number = {number}, + Organization = {Organization}, + Series = {series}, + Url = {url}, + Volume = {volume}, + Year = {YYYY}, + + Abstract = {Abstract...}, + Author = {PeriodicalAuthorLastname, Firstname}, + Journal = {Periodical Journal}, + Comment = {Complete issue of a periodical, such as + a special issue of a journal}, + PercentCrossref = {crossref}, + Day = {DD}, + Keywords = {periodical}, + Review = {Review...}, +} + +@PhdThesis{phdthesis, + Title = {PhDThesis title}, + Author = {PhDThesisAuthorLastname, Firstname}, + School = {school}, + Year = {YYYY}, + Note = {note...}, + + Abstract = {Abstract...}, + Comment = {Comment...}, + PercentCrossref = {crossref}, + Doi = {doi-specification}, + Keywords = {phdthesis}, + Language = {english}, + Review = {Review...}, + Url = {url} +} + +@Proceedings{proceedings, + Title = {Proceedings title}, + Year = {YYYY}, + + Address = {Address}, + Editor = {EditorLastname, Firstname}, + Month = {Month}, + Note = {note...}, + Number = {number}, + Organization = {<Symposium conducted at the meeting of> Organization}, + Publisher = {Publisher}, + Series = {series}, + Volume = {volume}, + + Abstract = {Abstract...}, + Comment = {Comment...}, + PercentCrossref = {crossref}, + Doi = {doi-specification}, + Keywords = {proceedings}, + Review = {Review...}, + Url = {url} +} + +@Proceedings{proceedings-organization, + Title = {Proceedings title}, + Year = {YYYY}, + + Address = {Address}, + Month = {Month}, + Day = {DD}, + Note = {note...}, + Number = {number}, + Organization = {Organization}, + Publisher = {Publisher}, + Series = {series}, + Volume = {volume}, + + Abstract = {Abstract...}, + Comment = {Conference preceedings with no identified editor(s)}, + PercentCrossref = {crossref}, + Doi = {doi-specification}, + Keywords = {proceedings}, + Review = {Review...}, + Url = {url} +} + +@Standard{standard, + Title = {Standard title}, + Institution = {institution}, + Organization = {Organization}, + Author = {StandardAuthorLastname, Firstname}, + Language = {english}, + Note = {note...}, + Url = {url}, + Year = {YYYY}, + + Abstract = {Abstract...}, + Comment = {Comment...}, + PercentCrossref = {crossref}, + Doi = {doi-specification}, + Keywords = {standard}, + Review = {Review...}, +} + +@TechReport{techreport, + Title = {TechReport title}, + Author = {TechReportAuthorLastname, Firstname}, + Institution = {institution}, + Year = {YYYY}, + + Address = {Address}, + Month = {Month}, + Note = {note...}, + Number = {number}, + Type = {type}, + + Abstract = {Abstract...}, + Comment = {Comment...}, + PercentCrossref = {crossref}, + Doi = {doi-specification}, + Keywords = {techreport}, + Language = {english}, + Review = {Review...}, + Url = {url} +} + +@Unpublished{unpublished, + Title = {Unpublished title}, + Author = {UnpublishedAuthorLastname, Firstname}, + Note = {note...}, + + Month = {Month}, + Year = {YYYY}, + + Abstract = {Abstract...}, + Comment = {Comment...}, + PercentCrossref = {crossref}, + Doi = {doi-specification}, + Keywords = {unpublished}, + Language = {english}, + Review = {Review...}, + Url = {url} +} + +@Literal{literal, + Key = {ZZZZ-end}, + Text = {Copied literally to the bibliography}, +} + +@Book{selfpublished2, + Crossref = selfpublished, + Author = {BookAuthorLastname2, Firstname}, +} diff --git a/doc/context/sources/general/manuals/publications/mkiv-publications.lua b/doc/context/sources/general/manuals/publications/mkiv-publications.lua new file mode 100644 index 000000000..f6a980f3e --- /dev/null +++ b/doc/context/sources/general/manuals/publications/mkiv-publications.lua @@ -0,0 +1,30 @@ +return { + ["GH0001"] = { + category = "book", + title = "Rhythmic Illusions", + subtitle = "for drums", + author = "Gavin Harrison", + publisher = "Warner", + isbn = "1576236870", + year = "1996", + comment = "plus cd", + }, + ["GH0002"] = { -- no reference in brittisch library + category = "book", + title = "Rhythmic Perspectives", + subtitle = "a multidimensional study of rhythmic composition", + author = "Gavin Harrison", + publisher = "Alfred Publishing Co., Inc", + year = "1999", + comment = "plus cd", + }, + ["GH0003"] = { + category = "book", + title = "Rhythmic Designs", + subtitle = "a study of practical creativity", + author = "Gavin Harrison and Terry Branham", + publisher = "Hudson", + year = "2010", + comment = "plus dvd", + }, +} diff --git a/doc/context/sources/general/manuals/publications/mkiv-publications.tex b/doc/context/sources/general/manuals/publications/mkiv-publications.tex new file mode 100644 index 000000000..9612221ac --- /dev/null +++ b/doc/context/sources/general/manuals/publications/mkiv-publications.tex @@ -0,0 +1,63 @@ +% language=en % uk - Is behaviour really better than behavior, defence than defense? + +% todo : index key in chapters + +% \enabletrackers[publications*] +% \enabletrackers[publications.match] +% \enabletrackers[publications.setups] +% \enabletrackers[publications.authorhash] + +% We use the following bib files: +% +% tugboat.bib +% template2.bib +% +% boekplan.bib +% duane.bib +% manuals.bib +% +% mkiv-publications.bib +% mkiv-publications.lua + +\environment publications-style + +\startdocument + [title={Bibliographies}, + subtitle={The \CONTEXT\ way}, + author={Hans Hagen and Alan Braslau}] + +\component publications-titlepage + +\startfrontmatter + \component publications-contents + \component publications-introduction +\stopfrontmatter + +\startbodymatter + \component publications-quick + \component publications-database + \component publications-datasets + \component publications-rendering + \component publications-citations + \component publications-customize + \component publications-exporting + \component publications-lua + \component publications-xml + \component publications-extensions + % \component publications-journals + \component publications-otheruse + \component publications-tracing +\stopbodymatter + +\startappendices + \component publications-fields + \component publications-completeness + \component publications-transition + \component publications-performance +\stopappendices + +\startbackmatter + \component publications-overviews +\stopbackmatter + +\stopdocument diff --git a/doc/context/sources/general/manuals/publications/publications-citations.tex b/doc/context/sources/general/manuals/publications/publications-citations.tex new file mode 100644 index 000000000..aabdd5328 --- /dev/null +++ b/doc/context/sources/general/manuals/publications/publications-citations.tex @@ -0,0 +1,881 @@ +\environment publications-style + +\startcomponent publications-citations + +\startchapter + [title=Citations, + reference=ch:cite] + +The \index {style+APA}APA Style Guide as well as good practice demand that +\emphasis {all} references appearing in the bibliography be cited at least once +in the text (and, of course, all citations must have a corresponding +bibliographical reference). Other publishing styles, textbooks in particular, +might additionally include lists of general references for \quote {further +reading} (and these lists might sometimes be split into sections according to +subject). An author may, in contrast, choose not to interrupt a text with many +citations, nevertheless, including a list of references. Furthermore, one might +refer in the text to certain works that need not necessarily be accompanied by a +full bibliography listing (for example, \Name {Darwin} {C.}'s \emph {Origin}). +\startfootnote \textcite[entry] [default::Darwin1859] \stopfootnote Thus, a +system providing tools to handle bibliographies needs to be flexible. + +A good, general reference on bibliography practice (in the English language), +independent of any particular specification, can be found in \cite [title] +[default::vanLeunen1992] \cite [default::vanLeunen1992]. Note that rules and +traditions may differ slightly in other languages and cultures. + +The examples of bibliography listings of the previous chapter were simplified by +the fact that the entire bibliographical dataset was rendered. In practice, the +same dataset source(s) could be used over many documents, and the dataset might +contain many more references than are used in any one document. That is, the data +source might be more complete than the final rendered bibliography list or lists. +The mechanism of citation allows you to select references from the dataset(s) to +build the list rendering as well as to place a indicator of the reference (or +not) in the text of the document corresponding to a list entry (a publication). +These citation renderings can be of many forms. + +A citation is normally pretty short as its main purpose is to refer uniquely to a +more detailed description. But, there are several ways to refer, which is why the +citation subsystem is configurable and extensible. Just look at the following +commands: + +\cindex{cite} +\tindex{::} + +\starttabulate +\NC \TEXcode{\cite[num][article]} \NC \cite[num] [article] \NC \NR +\NC \TEXcode{\cite[textnum][article]} \NC \cite[textnum] [article] \NC \NR +\NC \TEXcode{\cite[authornum][article]} \NC \cite[authornum] [article] \NC \NR +\NC \TEXcode{\cite[authoryear][article]} \NC \cite[authoryear] [article] \NC \NR +\NC \TEXcode{\cite[authoryears][article]} \NC \cite[authoryears][article] \NC \NR +\NC \TEXcode{\cite[short][article]} \NC \cite[short] [article] \NC \NR +\NC \TEXcode{\cite[tag][article]} \NC \cite[tag] [article] \NC \NR +\NC \TEXcode{\cite[index][article]} \NC \cite[index] [article] \NC \NR +\NC \TEXcode{\cite[category][article]} \NC \cite[category] [article] \NC \NR +\NC \TEXcode{\cite[author][article]} \NC \cite[author] [article] \NC \NR +\NC \TEXcode{\cite[year][article]} \NC \cite[year] [article] \NC \NR +\NC \TEXcode{\cite[title][article]} \NC \cite[title] [article] \NC \NR +\NC \TEXcode{\cite[keywords][article]} \NC \cite[keywords] [article] \NC \NR +\NC \TEXcode{\cite[none][article]} \NC \cite[none] [article] \NC \NR +\NC \TEXcode{\cite[X]} \NC \cite[X] \NC \NR +\NC \TEXcode{\cite[]} \NC \cite[] \NC \NR +\NC \TEXcode{\cite[template::Chen:1988:IPP]} \NC \cite[template::Chen:1988:IPP] \NC \NR +\NC \TEXcode{\cite[entry][article]} \NC \cite[entry] [article] \NC \NR +\stoptabulate + +The first argument is optional and if omitted, the default citation rendering +(for example, \TEXcode {num} or \TEXcode {authoryear}, depending on the +specification) will be selected. + +\startbuffer +\cite[article] +\stopbuffer +\cindex{cite} + +\typeTEXbuffer \getbuffer + +\startaside +The default citation alternative is defined via \cindex {setupbtx} + +\startTEX +\setupbtx[alternative=num] +\stopTEX + +However, this is not used as it is overridden by the specification, even the +\TEXcode {default} specification: + +\startTEX +\setupbtx[default:cite][alternative=num] +\setupbtx [apa:cite][alternative=authoryear] +\stopTEX + +These examples introduce the concept of \Index {namespace}s that is extensively +used in the bibliography subsystem. The \TEXcode {cite} namespace will inherit +from the root namespace; similarly, the \TEXcode {default} specification will +inherit elements from the \TEXcode {cite} namespace, but will be distinct from +the \TEXcode {apa} specification's \TEXcode {cite} namespace, and so forth. +Normally, we need not to worry about this as it is handled through the loading of +the specification. +\stopaside + +\cindex {cite} +\showsetup[cite] + +The \Cindex{citation} command is synonymous to \Cindex{cite}. + +\cindex {citation} +\showsetup[citation] +%\showsetup[citation:userdata] +\showsetup[citation:alternative] +\showsetup[citation:direct] + +\startaside +Note that the \MKII\ module based on \Tindex {bibtex} allowed the use of curly +brackets enclosing the \Index {tag} (for reasons of backward compatibility with +traditional \LATEX\ practice). A side|-|effect made this a bit picky about spaces +between its arguments, the first of which is optional. We have chosen to remove +this restriction through the use of standard \CONTEXT\ syntax using square +brackets (reserving curly brackets to usually be used to enclose text that is to +be typeset). + +The system will tolerate the \Index {depreciated} syntax \cindex {cite}\TEXcode +{\cite{tag}}, but this practice is to be strongly discouraged and cannot be mixed +with any other options. +\stopaside + +The most commonly used citation variants (or alternatives) are \TEXcode {num} and +\TEXcode {authoryear} introduced above. The first is typically employed in +conjunction with a numbered bibliography list, usually sorted in the citation +order in the text; the second is typically used in conjunction with a +bibliography list sorted by author and year of publication. + +Other citation variants may be quite useful, even when used in the context of the +above standard schemes. One such example would be \Cindex {cite}\TEXcode +{[title][tag]} that can be used to include the title of the work in the running +text (as can be seen earlier in \in {section} [sec:styles]; another one is +\cindex {cite}\TEXcode {\cite[year][tag]} that can be used to include the +publication date and \cindex {cite}\TEXcode {\cite[author][tag]} can be used to +extract the authors' names. These are examples of a general rule where \cindex +{cite}\TEXcode {\cite[field][tag]} will return the contents of the given field +for an entry, if the entry contains such a field. + +The variants \TEXcode {textnum} and \TEXcode {authoryears} are intended to be +used in the running text when the reference becomes part of the syntax of the +sentence: typically, they will not be set|-|off by parenthesis, for example. + +\startaside +The name \TEXcode {authoryears} (with an \quote{s}) is a shorthand that was used +in \MKII. Whereas its name is not immediately obvious at first view, in practice +it is a quite convenient variant of \TEXcode {authoryear} that differs only in +the style of punctuation, thus its place in a sentence structure. +\stopaside + +Notice that in the example \TEXcode{\cite[template::Chen:1988:IPP]} shown above, +the \TEXcode {tag} was prefixed with an alternate dataset name (\tindex +{::}\TEXcode {template::}) rather than to the default \TEXcode {dataset=example} +that was specified in the \Cindex {setupbtx} command earlier. The reason behind +the double|-|colon syntax should be made obvious here (where the \Index {tag} +itself uses single colons). + +In the last of the examples shown above, \TEXcode{\cite[entry][article]}, the +full rendered bibliographic entry gets placed. + +Unless the placed rendering uses \TEXcode {method=dataset}, only publications +that are explicitly cited will end up in the lists. You can force a citation into +a list using \Cindex {usecitation}, for example: + +\cindex{usecitation} + +\startTEX +\usecitation[patent] +\stopTEX + +This command has two synonyms: \Cindex {nocite} and \Cindex {nocitation} so you +can choose whatever fits you best. + +\cindex {nocite} +\showsetup[nocite] + +\cindex {nocitation} +\showsetup[nocitation] + +\cindex {usecitation} +\showsetup[usecitation] + +The purpose and utility of these commands (and their synonyms) is not only to +draw a citation from the dataset for inclusion in the bibliography, but also to +mark the place in the text where the citation is relevant. Normally, one might +claim that this should be done through one of the forms of the \Cindex {cite} (or +\Cindex {citation}) command, as all references appearing in the bibliography are +to be cited at least once in the text. However, even if one does not disagree +with this statement, one might still wish attach the citation to the reference in +the text of a \Index {floating object} such as a table or a figure, thus +establishing a proper order in the numbering since the explicit citation +rendering might occur within the table or the figure caption that might get +placed on a much later page. Consider the following schematic illustration: + +\cindex{nocite} +\cindex{cite} + +\startTEX +(see \nocite [MyReference]\in {table} [tab:mytable]). + +\startplacetable[reference=tab:mytable] + \unknown\ \cite[MyReference] +\stopplacetable +\stopTEX + +The citation rendering and the bibliographic list rendering are intimately +coupled reciprocally and cannot be dissociated. This coupling can be through the +reference number for example, but unnumbered reference lists also contain +interacting hyperlinks. A failure to take into account this interdependence can +lead to fundamental misunderstandings in use. + +\startaside +Both the citation and the list must be rendered. For example, a common error +would be to omit (or comment|-|out) the list rendering during the writing stage +of a document. Such an error will cause the citations to fail to render properly. + +Whereas this might seem to be an unnecessary limitation, it results from a +specific design choice and from the possibility of placing multiple renderings +freely, anywhere in a document. It is preferable not to render citations at all +than to render these citations possibly incorrectly. +\stopaside + +\startsection[title=Combining citations] + +\startbuffer +\cite[num][article,book,booklet] +\stopbuffer + +A single citation might refer to several sources, obtained through the use of a +comma separated list of \Index{tag}s, for example: \getbuffer + +\cindex{cite} + +\typeTEXbuffer + +A comma separated list of three (or more) consecutive numbers will get collapsed +or compressed into a range of numbers (if possible). + +\cindex {cite} The order in which the citation \Index {tag}s appear in the list +may or may not be important, depending upon the citation variant and on the style +specification. Consider the following examples: + +\startbuffer +\cite[num] [article,book] +\cite[textnum] [article,book] +\cite[authoryear] [article,book] +\cite[authoryears][article,book] +\cite[short] [article,book] +\cite[author] [article,book] +\cite[year] [article,book] +\cite[title] [article,book] +\stopbuffer + +\typeTEXbuffer + +This gives: + +\cindex{cite} +\startlines \getbuffer \stoplines + +Now we swap the order: + +\startbuffer +\cite[num] [book,article] +\cite[textnum] [book,article] +\cite[authoryear] [book,article] +\cite[authoryears][book,article] +\cite[short] [book,article] +\cite[author] [book,article] +\cite[year] [book,article] +\cite[title] [book,article] +\stopbuffer + +\typeTEXbuffer + +and get: + +\startlines \getbuffer \stoplines + +Note that the numbered citation reference is always rendered in numerical order, +where the numbers correspond to the order in which the entries appear in the +bibliography list. This order depends on the \Index {sorting} of the list +rendering (this sorting may be, in some styles, in the order in which the +references are cited) and is controlled by the \TEXcode {[list]} \TEXcode +{sorttype} parameter. In the \index {style+APA}APA style, presently active, the +citations are always sorted according to author and year. Thus, \quotation +{BookAuthorLastname} appears before \quotation {Last} in our example here, +regardless of the order in which the references appear in the \Cindex {cite} +command (i.e. either \TEXcode {\cite[article,book]} or \TEXcode +{\cite[book,article]}). + +The user can control the state of sorting of the \cindex{cite}\TEXcode {cite} +variants through the parameter \TEXcode {sorttype=normal}; other choices are +\TEXcode {reverse} and \TEXcode {none}: + +\startTEX +\setupbtx[aps:cite:num][sorttype=none] +\stopTEX + +\startsubsubject [title=Single list item containing multiple publication entries] + +Some bibliography styles admit the combination of several bibliographical sources +into a single list item having a unique reference number. The combination of +multiple bibliographic entries into as single bibliography list item is more +compact and this practice is often encountered in short \quote {letter}|-|type +journal articles. (Note, however, that entries combined as such do not make any +sense in an authoryear scheme such as \index {style+APA}APA.) + +One can combine \Index {tag}s using the addition operator symbol (\TEXcode {+}), +best illustrated though an example: + +\startbuffer +\METAFUN\ began as an expression of love and appreciation for \METAPOST. +\citation [num] [tugboat::Berdnikov:TB21-2-129+Hobby:TB21-2-131] + +\definebtxrendering[tugboat][aps][dataset=tugboat,group=examples] +\placebtxrendering [tugboat][criterium=section] +\stopbuffer + +\cindex{citation} +\cindex{definebtxrendering} +\cindex{placebtxrendering} +\tindex{::} + +\typeTEXbuffer + +\getbuffer + +Combined entries are joined using a separator that can be specified, as in: + +\startbuffer +\setupbtxrendering[tugboat][separator={\break}] +\stopbuffer + +\cindex{setupbtxrendering} +\tindex{separator} + +\typeTEXbuffer + +or suppressed (using \tindex {separator}\TEXcode {separator=,}); By default, +\cindex {removepunctuation}\TEXcode {separator={\removepunctuation;\space}}. + +Dataset entries that are combined cannot also appear apart (nor does this really +make any logical sense). All of the following: + +\startbuffer +\cite[num][tugboat::Berdnikov:TB21-2-129] +\cite[num][tugboat::Berdnikov:TB21-2-129,Hobby:TB21-2-131] +\cite[num][tugboat::Hobby:TB21-2-131] +\stopbuffer +\cindex{cite} +\tindex{::} + +\typeTEXbuffer \getbuffer + +will point to the combined reference (as they should). However, beware that +attempting to include any of these references in a \emphasis {different} combined +list item is undefined, meaning unsupported. + +Combining list entries is another instance showing that citations and the +rendered bibliography list interact and cannot be separated. + +\stopsubsubject + +\stopsection + +\startsection[title=Additional text] + +\startsubsubject [title=Additional text in a citation reference] + +Sometimes one would like to include additional text in a citation, for example +a specific commentary or page number reference. + +\startbuffer +\cite[righttext={ p.\nbsp xx}][article] +\stopbuffer + +\cindex{cite} + +\typeTEXbuffer + +yielding: + +\getbuffer + +The additional text can be either before (\TEXcode {lefttext=}) or after +(\TEXcode {righttext=}) \startfootnote The \MKII\ bib module used the keyword +\TEXcode {extra=} in the place of \TEXcode {righttext=}. We chose not to support +this as a synonym as the name is ambiguous. Furthermore, we seek to limit the +number of keywords used in \CONTEXT. \stopfootnote each citation entry and are +not to be confused with the delimiters \TEXcode {left={(},} and \TEXcode +{right={)},} used to surround the entire citation. The difference becomes +important when referencing multiple citations. + +The following examples further illustrate the syntax: + +\startbuffer +\cite[lefttext={See },righttext={ p.\nbsp yy}][book] +\stopbuffer + +\typeTEXbuffer \getbuffer + +\startbuffer +\cite[alternative=authoryears,righttext={ p.\nbsp xx}][article] + +\cite[alternative=authornum,righttext={ p.\nbsp xx}][article] +\stopbuffer + +\typeTEXbuffer \getbuffer + +\startbuffer +\cite[alternative=num,righttext={{ p.\nbsp xx},{ p.\nbsp yy}}] + [article,book,booklet] +\stopbuffer + +\cindex{cite} + +\typeTEXbuffer \getbuffer + +\startbuffer +\cite[lefttext={In the article: },righttext={.}][article] +\stopbuffer + +\cindex{cite} + +\typeTEXbuffer \getbuffer + +\startbuffer +\cite[lefttext={{In the article: },{in the book: }},alternative=title] + [article,book] +\stopbuffer + +\cindex{cite} + +\typeTEXbuffer \getbuffer + +\startbuffer +\cite[righttext={{ p.\nbsp xx},}][article,book] +\stopbuffer + +\cindex{cite} \typeTEXbuffer \getbuffer + +Because \CONTEXT\ does not allow mixing key|-|value pair lists with single value +keys, the keyword \TEXcode {alternative=} must be used, if needed, as shown in +the examples above. + +Note that a double curly|-|bracket (\TEXcode {{{}}}) also needs to be used when +the text is to contain a comma. + +\stopsubsubject + +\startsubsubject [title=Additional text in a list entry] + +Additional text such as notes and page numbers can also get placed with the entry +in the bibliography list. Of course, the bibliography data entry can contain a +\TEXcode {note=} field that may or may not get rendered, but often is, according +to the style specification. + +It is also possible to specify notes or page references to be rendered \TEXcode +{before} or \TEXcode {after} a bibliography entry through the citation call. + +\startbuffer +\cite + [alternative=num, + before={{Introducing MetaPost: },}, + after={,{ See, also, the references therein, p.\nbsp 58.}}] + [tugboat::Hobby:TB10-4-505,Hobby:TB22-1-46] +\blank +\placebtxrendering [tugboat][criterium=section] +\stopbuffer + +\cindex{cite} +\cindex{placebtxrendering} +\tindex{::} + +\typeTEXbuffer \getbuffer + +Clearly, such additional text can be added to each entry only once, so the first +such \Cindex {cite} call wins. + +\stopsubsubject + +\stopsection + +\startsection[title=Placing a single citation] + +Sometimes, one would like to place a single citation somewhere in the text +without necessarily adding it to a bibliography list. Take, for example, + +\startbuffer +\placecitation[tugboat::Mahajan:TB31-1-88] +\stopbuffer + +\getbuffer + +obtained by using + +\cindex{placecitation} +\tindex{::} + +\typeTEXbuffer + +Note that \Cindex {placecitation}\TEXcode {[tag]} is a synonym for \Cindex +{citation}\TEXcode {[entry][tag]} (that was seen earlier). + +\showsetup[placecitation] + +As for other citation reference, this will fail if a bibliography list rendering +is not placed somewhere in the document so let's do that here: + +\startbuffer +\placebtxrendering[tugboat][criterium=section] +\stopbuffer + +\cindex{placebtxrendering} + +\typeTEXbuffer \getbuffer + +Whereas this might seem redundant above (placing the citation entry as well as +its list rendering), this will only exceptionally be the case (as in this highly +artificial example of this manual); Indeed, all cited work (such as \cite +[textnum] [tugboat::Mahajan:TB31-1-88], above) will logically always be placed in +a list of references. + +The placement of a single citation brings to light a subtle point: The \TEXcode +{specification} that is used by citations is that set in the root namespace +(through \Cindex {setupbtx}\TEXcode {[specification=apa]} or possibly through +\Cindex {usebtxdefinitions}\TEXcode {[apa]}. This is \emphasis {not} necessarily +the same as that of the rendering (if a different rendering specification is +declared). Note that the named rendering used above (\TEXcode {[tugboat]}) was +not declared a child of the rendering named \TEXcode {[aps]}, though the \TEXcode +{specification=apa} is active. Thus, the style of the citations can be made to +differ from the style of their bibliography list, as here, but this is not really +a very good practice. + +\stopsection + +\startsection[title=Placing citations as footnotes] + +A \Cindex {placecitation} command can occur inside a footnote or other \Index +{floating object} such as a figure or table caption. No specification or style +that places its bibliography list renderings as footnotes has been implemented +yet. + +% bibliographies as endnotes intercalated with footnotes... + +\stopsection + +\startsection[title=Searching] + +Finding the right \Index {tag} in a database can be a pain. In particular, +datasets having their origin in multiple source files may contain conflicting +\Index {tag}s, though duplicate \Index {tag}s get suffixed automatically so this +should not be a real problem. + +On the other hand, asking for a \Index {wildcard} also makes no sense. +\startfootnote Note that \cindex {nocite}\TEXcode {\nocite{*}} is a valid +\LATEX/\BIBTEX\ practice that is used to include all entries of a \Tindex {.bib} +file in the final bibliography. This result can be obtained in \CONTEXT\ through +the \TEXcode {method=dataset} list rendering parameter. Alternately, one can use +the syntax \cindex {cite}\TEXcode {\cite[match(*:*)]} which is a shorthand to +match all values of all fields. \stopfootnote Nevertheless, we provide a powerful +mechanism for matching a query. Keep in mind that a \Index {tag} is used as a +quick look|-|up in a hashed table whereas a search will look through the entire +dataset. If processing speed is critical, one should use the cite \Index {tag} +lookup; in practice, even on a big book project employing a very large dataset, +the search is not a penalty. + +Let's look in more detail at the \Cindex {cite} command. In order to distinguish +efficiently between a normal reference and a more clever one, we use the \TEXcode +{match()} function: + +\tindex{::} +\startTEX +match(query) +dataset::match(query) +dataset :: match ( query ) +\stopTEX + +The handler is rather tolerant for spaces (as well as capitalization) which is +handy if you have long queries that wrap around in the source code. Of course the +\tindex {::}\TEXcode {dataset::} prefix is optional in which case the current +dataset is taken. Such match queries can be mixed in a multiple reference +citation indifferently with hashed cite \Index {tag}s so the system is really +flexible. + +\blank + +To demonstrate the use a search query, we load a small bibliographic database: + +\startbuffer +\usebtxdataset[boekplan][boekplan.bib] +\stopbuffer + +\cindex{usebtxdataset} + +\typeTEXbuffer + +\getbuffer + +We could switch to this base using: + +\cindex{setupbtx} +\startTEX +\setupbtx[dataset=boekplan] +\stopTEX + +but instead we shall use a prefix as seen previously. Consider the following: + +\startbuffer +everything that you might want to know about layouts +\cite[boekplan::match(author:Egger)] +\stopbuffer + +\cindex{cite} +\tindex{::} + +\typeTEXbuffer + +We will get: \quotation {\inlinebuffer}. Of course this assumes that we also +typeset a list of references somewhere in our document, so let's do that here: + +\startbuffer +\definebtxrendering[boekplan][apa][dataset=boekplan,group=examples] +\placebtxrendering [boekplan][criterium=chapter] +\stopbuffer + +\cindex{definebtxrendering} +\cindex{placebtxrendering} + +\typeTEXbuffer \getbuffer + +\startbuffer +\cite[authoryears][ match(title:Lua)]\\ +\cite[authoryears][default:: match(title:Lua)]\\ +\cite[authoryears][boekplan::match(title:Lua)] +\stopbuffer + +\cindex{cite} +\tindex{::} + +\typeTEXbuffer \getbuffer + +Notice that no match is found in the \quote {current} dataset (\TEXcode {example}). + +A query eventually becomes a \LUA\ expression so you can use helpers to achieve +your goal. As a convenience there are some shortcuts to access fields. The +following examples demonstrate this: + +\startbuffer +\cite + [authoryears] + [boekplan::match(author:hagen and year:2010-2011)]\\ +\cite + [authoryears] + [boekplan::match(author:{Willi Egger})]\\ +\cite + [authoryears] + [boekplan::match(author:Hans and (tonumber(field:year) or 0) > 2011)] +\stopbuffer + +\cindex{cite} +\tindex{::} + +\typeTEXbuffer \getbuffer + +You can use grouping braces when spaces are involved. Ranges (of numbers) are +recognized. Of course, you can use other characters that the basic alphabet. + +\startbuffer +\cite[authoryears][tugboat::match(author:{Bogusław Jackowski})]\\ +\stopbuffer + +\cindex{cite} +\tindex{::} + +\typeTEXbuffer \getbuffer + +This demonstrates further the interest in converting classical \TEX\ accent +sequences into proper \UTF\ characters. The citations found above \bold{must} +correspond to some bibliography list entries, so we will place this list here: + +\startbuffer +\placebtxrendering [tugboat][criterium=section] +\stopbuffer + +\cindex{placebtxrendering} + +\typeTEXbuffer \getbuffer + +String lookups are partial and case insensitive. + +\startbuffer +\cite [boekplan::match(author:e)]\\ +\cite [boekplan::match(author:h)] +\stopbuffer + +\cindex{cite} +\tindex{::} + +\typeTEXbuffer + +so one must take care in formulating cite queries as both lookups above will +get all five entries: \inlinebuffer, whereas + +\startbuffer +\cite [boekplan::match(author:eg)]\\ +\cite [boekplan::match(author:e*r)] +\stopbuffer + +\cindex{cite} +\tindex{::} + +\typeTEXbuffer + +finds \inlinebuffer. As the match compares the entire author string, and not +just each author, it also finds [Hag]en & Br[aslau] as well as [Ho]ekwater[ & +Hagen]. + +% To Hans: It is curious that match(author:e*r) finds [Hag]en and Br[aslau]. +% To Alan: We match the whole (original) string. +% +% Response: Yes, but this is not what one might naively expect. +% It would be useful to match author by author, rather than the entire author +% string, at least that is how one might want to use it. Oh well... +% the mechanism is predictable and the above example explicitly explains this +% point. Would it be easy to add match(lastname:h*), for example? I suppose that +% this would have to yield hits in ALL author-type fields (author, editor, ...). + +Note also that the order of the match criteria is not significant. + +\startaside +The search mechanism is very powerful. However, a \bold {major \Index{pitfall}} +or risk comes from the possibility to easily under|-|specify the match criteria. +For example, \TEXcode {match(author:Hagen and author:Hoekwater)} will find \cite +[title] [boekplan::match(title:Fonts)], but it will also find \cite [title] +[boekplan::match(title:Layouts)]; Nor would adding the criterium \TEXcode {and +year:2011} be of any help. The solution is + +\startbuffer +\cite + [authoryear] + [boekplan::match(author:Hagen and author:Hoekwater and title:fonts)] +\stopbuffer + +\cindex{cite} +\tindex{::} + +\typeTEXbuffer \getbuffer + +Note that using \TEXcode {match(title:fonts)} alone would also work, that is +until another reference work containing the word \quote {fonts} in its title gets +added to the dataset! \startfootnote Multiple hits would have occurred in the +examples above containing \TEXcode {title:lua} had only one dataset been used in +the typesetting of the present manual. \stopfootnote Thus, whereas it might +appear that the match mechanism be a more robust way of identifying dataset +entries then short cite \Index {tag}s, incomplete search queries might return +unwanted, excess matches. + +It is quite common in real bibliography databases for some author or authors to +appear in many different references published in the same year, perhaps buried in +a longer list of authors, so some care has to be taken to uniquely identify the +desired work. Of course, this feature can also be a good shorthand as well to +select several different matching works when that is the desired result. +\stopaside + +% This only begins to touch on the search mechanism. +% This section needs to be expanded. + +\stopsection + +\startsection[title={Page index, interaction, and registers},reference=sec:index] + +Each citation in the text not only marks the dataset entry for inclusion in the +bibliography list but also records the page number on which the citation occurs. +Each named list rendering can be instructed to include these pages just like an +index. + +\startbuffer +\setupbtxrendering + [default] + [pagestate=start] +\stopbuffer + +\cindex{setupbtxrendering} + +\typeTEXbuffer + +The result can be observed in the \about [ch:biblio] on \at {page} [ch:biblio]. +If interaction is active (\cindex {setupinteraction}\TEXcode +{\setupinteraction[state=start]}), then these page numbers will be \Index +{hyperlink}s back to the citations. If \TEXcode {numbering=yes}, then the +numbered bibliography entries will also contain \Index {hyperlink}s back to the +first occurrence in the text where the entry is cited (which is the same as the +first page indexed). + +Some styles, such as \index {style+APA}\TEXcode {apa}, will have other \Index +{hyperlink}s. The author list including the year will be active just like the +numbers above (an \TEXcode {authoryear} list is usually not numbered). +Furthermore, any doi or url that is included in the entry will be a \Index +{hyperlink} to the external resource. Finally, all titles will contain \Index +{hyperlink}s to the local downloaded file of the cited work if this exists and +was specified (using the data field \TEXcode {file={},}). + +In addition to the index of pages of citations in the text associated with each +entry in the bibliography list, one has the possibility of adding bibliography +items to any standard index list. This can be illustrated through the creation of +a list of authors or names: + +\startbuffer +\defineregister + [indexofauthors] + +\definebtxregister + [authors] + [field=author, + register=indexofauthors, + method=always, + dataset=default, + alternative=invertedshort] +\stopbuffer + +\cindex{defineregister} +\cindex{definebtxregister} + +\typeTEXbuffer + +placed in the preamble of the document and to be followed later, typically +towards the end of the document, by + +\cindex{placeregister} + +\startTEX +\startchapter[title=Index of Names] + \placeregister[indexofauthors][compress=yes] +\stopchapter +\stopTEX + +as can be see in the present manual on \at {page} [ch:indexofauthors]. + +\cindex {definebtxregister} +\showsetup[definebtxregister] + +\cindex {setupbtxregister} +\showsetup[setupbtxregister] + +Any field can be indexed, as desired, for example \TEXcode {field=title}. One +particularly useful field is \TEXcode {keywords={}}: a semi|-|colon separated +list of keywords will be split into individual index entries for each cited work. + +The handling of fields to be interpreted as names (as in \TEXcode {author}) or as +keywords (split into fields separated by semi|-|colons), etc. depends on the +specification and is declared in a lua file associated with the specification +definition file. This will be described in the next chapter. + +\stopsection + +\startsection [title=Summary and explanation of the \TEXcode {\cite} mechanism] + +As the list of cited references is being built in memory, each used dataset entry +is flagged. As the list gets placed, either partially or fully, eventual conflits +in \TEXcode {short} and in \TEXcode {authoryear} tags are resolved through an +assignment of suffixes. These are then fed|-|back to the citation references. + +A dataset can have multiple renderings and multiple datasets and renderings can +be grouped. The many citation variants can be freely used together and this may +or may not make coherent sense. For example, an \TEXcode {authoryear} sorted list +is assigned numbers that are available for use as numbered citation references, +but these numbers will follow the order of the list and not the order of +citations. Conversely, a list that is sorted in the order of citations will still +have \TEXcode {authoryear} and \TEXcode {short} citation tags, but these will be +of less use for the reader in this case than the \TEXcode {authornum} variant. +With such flexibility comes complication. + +\stopsection + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/publications/publications-completeness.tex b/doc/context/sources/general/manuals/publications/publications-completeness.tex new file mode 100644 index 000000000..5642ea312 --- /dev/null +++ b/doc/context/sources/general/manuals/publications/publications-completeness.tex @@ -0,0 +1,23 @@ +\environment publications-style + +\startcomponent publications-completeness + +\startchapter + [reference=ch:datasetcompleteness, + title={Dataset completeness}] + +\startbuffer +\showbtxdatasetcompleteness[example] +\stopbuffer + +\typeTEXbuffer + +\cindex {showbtxdatasetcompleteness}The listing can be rather long \unknown\ The +header for each entry gives the \TEXcode {index}, \TEXcode {category} and +\TEXcode {tag}. + +\getbuffer + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/publications/publications-contents.tex b/doc/context/sources/general/manuals/publications/publications-contents.tex new file mode 100644 index 000000000..3e5acaa03 --- /dev/null +++ b/doc/context/sources/general/manuals/publications/publications-contents.tex @@ -0,0 +1,18 @@ +\environment publications-style + +\startcomponent publications-contents + +\starttitle[title=Contents] + + \setuplist + [chapter] + [before=, + after=] + + \placelist + [chapter] + [color=black] + +\stoptitle + +\stopcomponent diff --git a/doc/context/sources/general/manuals/publications/publications-customize.tex b/doc/context/sources/general/manuals/publications/publications-customize.tex new file mode 100644 index 000000000..1a2ab7040 --- /dev/null +++ b/doc/context/sources/general/manuals/publications/publications-customize.tex @@ -0,0 +1,659 @@ +\environment publications-style + +\startcomponent publications-customize + +\startchapter[title=Custom renderings,reference=ch:custom] + +\startsection[title=Introduction] + +The rendering of citations and bibliography lists is highly configurable and +custom rendering schemes can be added. The details can get quite complicated so +we will begin with a description of how citation variations can be used in the +running text, followed by a description on how to control the rending of the +associated bibliography list. + +\startaside +Loading the specification file defines a \Index {namespace}, say \TEXcode {apa}, +containing subspaces \TEXcode {apa:list} and \TEXcode {apa:cite} as well as +variants, for example \TEXcode {apa:cite:authoryear}, allowing \emphasis +{parameters} to be tuned independently for each form. This insures independence +but can get somewhat confusing. Most users will not encounter any problems as all +of this setup work is taken care of in the specification file; only those needing +to fine|-|tune specific settings need to better understand the underlying +mechanism. + +The rendering of the variants can be adjusted through \Cindex {setupbtx} in the +appropriate \Index {namespace}, for example modifying (or suppressing) +parenthesis or activating or deactivating interaction \Index {hyperlink}s. Beyond +the settings of parameters in the appropriate \Index {namespace}, +\emphasis{setups} are used to perform the actual renderings of citations as well +as of lists. One must be aware of \Index {namespace} \Index {isolation} and +\Index {inheritance} as well as fall|-|back when attempting to make changes. + +When small modifications on one of the pre|-|defined specifications are desired, +we suggest loading the specification and then adjusting certain parameters and +overloading the appropriate setups. Eventually, a new specification might be +necessary. +\stopaside + +A common setup will enable or disable interaction: + +\startbuffer +\setupbtx [interaction=start] +\stopbuffer + +\cindex{setupbtx} + +\typeTEXbuffer + +Notice that this is applied to the root \Index {namespace}. + +Other root|-|\Index {namespace} parameters that have been used are \TEXcode +{specification}, \TEXcode {dataset} and \TEXcode {numbering}. + +Associated with \TEXcode {specification} is an additional parameter \TEXcode +{default=} that defines a fall|-|back specification to be used to complete a +derived specification. \startfootnote For example, a variant on a specification +can be defined by only addressing specific differences, for example \index +{style+RMP}\TEXcode {specification=rmp} would be associated with \index +{style+APS}\TEXcode {default=aps}, as this describes a style used by the journal: +The Review of Modern Physics, mostly based on the style of the American Physical +Society. \stopfootnote + +Further \quote {low|-|level} formatting parameters, mostly dealing with the +formatting of names, are also defined by default in the root namespace. These are +listed in \in {table} [tab:setupbtx]. Some might eventually be redefined by the +specification in other namespaces, and may with good reason differ by context: +between the \TEXcode {[cite]} and \TEXcode {[list]} namespaces, for example. + +In order to insure the independence of specifications, each one defines its own +root namespace, for example \TEXcode {[default]}, \TEXcode {[apa]} or \TEXcode +{[aps]}, inheriting its settings from root, upon which are built the other +namespaces. + +\startplacetable + [reference=tab:setupbtx, + list={\TEXcode {\setupbtx} low|-|level formatting parameters}, + title={\Cindex {setupbtx} low|-|level formatting parameters. Some may be + redefined differently in the \TEXcode {cite} and \TEXcode {list} namespaces.}] +\starttabulate [|Tr|Tl|p|] + \NC specification \NC default \NC default style \NC \NR + \NC default \NC <null> \NC fall|-|back style \NC \NR + \NC interaction \NC start \NC active hyperlinks \NC \NR + \NC separator \NC \Cindex{btxsemicolon} \NC between multiple references \NC \NR + \NC separator:firstnames \NC \Cindex{btxspace} \NC between first names \NC \NR + \NC separator:juniors \NC \Cindex{btxspace} \NC before \quote{juniors} \NC \NR + \NC separator:vons \NC \Cindex{btxspace} \NC before \quote{vons} \NC \NR + \NC separator:initials \NC \Cindex{btxspace} \NC between initials \NC \NR + \NC stopper:initials \NC . \NC initialization truncation symbol \NC \NR + \NC separator:invertedinitials \NC \Cindex{btxcomma} \NC before initials, inverted form \NC \NR + \NC separator:invertedfirstnames \NC \Cindex{btxcomma} \NC before first names, inverted form \NC \NR + \NC authorconversion \NC normal \NC normal, normalshort, inverted, invertedshort, name (see \in{table}[tab:authorconversion]) \NC \NR + \NC monthconversion \NC number \NC month, month:mnen (see \TEXcode {\convertnumber}) \NC \NR + \NC journalconversion \NC normal \NC normal, abbreviated(short?) \NC \NR + \NC etallimit \NC 3 \NC length of author list \NC \NR + \NC etaldisplay \NC 3 \NC length of truncated author list \NC \NR + \NC \tindex{others}otherstext \NC et al. \NC author list truncation text \NC \NR + \NC separator:names:2 \NC \Cindex{btxcomma} \NC separates multiple names \NC \NR + \NC separator:names:3 \NC \Cindex{btxcomma} \NC before last name in a list \NC \NR + \NC separator:names:4 \NC \Cindex{btxcomma} \NC between only two names \NC \NR + \NC separator:2 \NC \Cindex{btxsemicolon} \NC separates multiple objects \NC \NR + \NC separator:3 \NC \Cindex{btxsemicolon} \NC before last object in a list \NC \NR + \NC separator:4 \NC \Cindex{btxsemicolon} \NC between only two objects \NC \NR +\stoptabulate +\stopplacetable + +\cindex {setupbtx} +\showsetup[setupbtx] + +\stopsection + +\startsection + [reference=sec:customcite, + title=Custom citation renderings] + +\startsubsubject [title=Parameters] + +Citation variants are mostly controlled though adjustment of their parameters +within the appropriate \Index {namespace}. For example, the cite variant \cindex +{cite}\TEXcode {\cite[num]} would be addressed through + + +\cindex {setupbtx} + +\startTEX +\setupbtx[default:cite:num] +\stopTEX + +for the \TEXcode {default} specification, or alternately, through + +\cindex {setupbtx} + +\startTEX +\setupbtx[apa:cite:num] +\stopTEX + +for the \index {style+APA}\TEXcode {apa} specification. For example, superscript +numbered citations in the \index {style+APS}\TEXcode {aps} specification could be +obtained through + +\cindex{setupbtx} + +\startTEX +\setupbtx[aps:cite:num][command=\high] +\stopTEX + +Typical parameters (in addition to those listed in \in {table} [tab:setupbtx]) +are presented in \in {table} [tab:setupbtxcite]. + +\startplacetable + [reference=tab:setupbtxcite, + location=force, + list= {\TEXcode{\setupbtx [cite]} parameters}, + title={\cindex{setupbtx}\TEXcode{\setupbtx[cite]} parameters}] +\starttabulate [|Tr|l|l|] +\NC alternative \NC num \NC default cite form \NC \NR +\NC left \NC \NC opening string \NC \NR +\NC right \NC \NC closing string \NC \NR +\NC inbetween \NC \Cindex{btxspace} \NC \NC \NR +\NC range \NC \TEXcode{\endash} \NC \NC \NR +\NC command \NC \NC \NC \NR +\NC style \NC \NC \NC \NR +\NC sorttype \NC normal \NC \NC \NR +\NC compress \NC yes \NC \NC \NR +\stoptabulate +\stopplacetable + +A demonstration of how these parameters can be manipulated in an individual +\TEXcode {\cite} call is shown in \in{table} [tab:authorconversion], which also +illustrates the different ways of formatting names. + +\startplacetable + [title={\TEXcode{authorconversion}}, + reference=tab:authorconversion] +\starttabulate [|Tl|p|] +\NC ac \NC \TEXcode{\cite[alternative=author,etallimit=,authorconversion=ac][article]} \NC \NR +\HL +\NC name \NC \cite[alternative=author,etallimit=,authorconversion=name] [article] \NC \NR +\NC normal \NC \cite[alternative=author,etallimit=,authorconversion=normal] [article] \NC \NR +\NC normalshort \NC \cite[alternative=author,etallimit=,authorconversion=normalshort] [article] \NC \NR +\NC inverted \NC \cite[alternative=author,etallimit=,authorconversion=inverted] [article] \NC \NR +\NC invertedshort \NC \cite[alternative=author,etallimit=,authorconversion=invertedshort][article] \NC \NR +\stoptabulate +\stopplacetable + +\stopsubsubject + +\startsubsubject [title=Setups] + +The next step in the customization of citation variants is through the overlaying +of setups that handle the actual rendering of the citation. These rarely will +need to be changed as most tuning can be done through the adjustment of +parameters such as those given above. \startfootnote An exception is for special +features, such as in the \index {style+APA}\TEXcode {apa} specification where a +missing date is replaced by the notation \quotation {n..d.}. \stopfootnote + +It is to be pointed|-|out that original citation variants can be easily added. As +an example, imagine that one might like to access the field \TEXcode {abstract} +that is normally not rendered (like many other unused dataset fields). One would +start by defining a parameter \Index {namespace} inheriting from the \TEXcode +{cite} \Index {namespace}, followed by a simple setup (remember that the \TEXcode +{apa} specification is currently active): + +\startbuffer +\definebtx[apa:cite:abstract][apa:cite] +\startsetups btx:apa:cite:abstract + \btxcitereference + \btxflush{abstract} +\stopsetups + +\startparagraph [style=slanted] +\cite[abstract][boekplan::Hagen2010metafun] +\stopparagraph +\stopbuffer + +\cindex{definebtx} +\cindex{btxcitereference} +\cindex{btxflush} +\cindex{cite} +\cindex{startsetups} +\cindex{stopsetups} +\tindex{::} + +\typeTEXbuffer + +\getbuffer + +If no special manipulation is known, the field with the same name (if found) will +be simply flushed. This will only work, however, if the field is identified as +either required or optional, that is not flagged as ignored in \in {table} +[tab:fields] (see also \in {Appendix} [ch:datasetfields]). For the sake of the +present manual, the field \BTXcode{abstract} has been defined as optional for the +\BTXcode{book} entry in the specification's lua file. + +But don't expect too much support for such low|-|level rendering control. + +\stopsubsubject + +\stopsection + +\startsection[title=Custom list renderings,reference=sec:list] + +The rendering of lists is much more flexible and configurable than the rendering +of citation markers. This is because the nature of data to be rendered requires +many tools and helpers to deal with all of the eventual contingencies inherent in +describing bibliographical references. + +The same \quote {low|-|level} formatting parameters used for citations also apply +for \TEXcode {list} \Index {namespace}s, although their settings may differ from +those of the citations. Consider the \index {style+APA}\TEXcode {apa} style that +specifies the use of \tindex {others} \quotation {et al.} in citations but +\quotation {\textellipsis} in the bibliography list, \quotation {and} in +citations but \quotation {\textampersand} in lists, last names only in \TEXcode +{authoryear} citations, etc. + +\startsubsubject[title=Bibliographies as lists] + +At another level of detail, the bibliography list is rendered in a standard +\CONTEXT\ list environment that can be setup using the command \Cindex +{setupbtxlist} (which is only \Cindex {setuplist} working in the protected +bibliography environment: \TEXcode {btx}). The root settings, appropriate for a +numbered bibliography list, are: + +\cindex{setuplist} + +\startTEX +\setuplist + [btx] + [prefixstopper=:, + state=start, + alternative=a, + before=\blank, + after=\blank] +\stopTEX + +whereas an unnumbered, author|-|year sorted list might have: + +\cindex{setupbtxlist} + +\startTEX +\setupbtxlist + [apa] + [alternative=paragraph, + margin=3\emwidth] +\stopTEX + +as already seen in \in {Chapter} [ch:renderings]. The above demonstrate that +\cindex {setupbtxlist}\TEXcode {\setupbtxlist[name]} is just a synonym for +\cindex {setuplist}\TEXcode {\setuplist[btx:name]}. + +\cindex {setupbtxlist} +\showsetup[setupbtxlist] + +\cindex {setuplist} +\showsetup[setuplist] % too big for the page! + +Each specification will have its own list \Index {namespace} (\TEXcode +{btx:specification}) that inherits from the root \TEXcode {btx} \Index +{namespace}. This model of inheritance holds true for the citation and list +details as described earlier. + +\stopsubsubject + +\startsubsubject[title=Setups] + +The layout of the information presented in the list is entirely controlled +through setups, with the help of some underlying \LUA\ code organizing the data +stored in the dataset. These setups rely on further setups as well as some +convenient helpers or defined special commands. To understand this, consider as +an illustration the setups defined for the \TEXcode {default} specification +(taken from the source file \type {publ-imp-default.mkvi}): + +\cindex{startsetups} +\cindex{stopsetups} +\cindex{texdefinition} +\cindex{btxperiod} + +\startTEX +\startsetups btx:default:list:book + \texdefinition{btx:default:author} + \texdefinition{btx:default:title} + \texdefinition{btx:default:editionset} + \texdefinition{btx:default:publisher} + \texdefinition{btx:default:year} + \btxperiod +\stopsetups +\stopTEX + +\cindex{startsetups} +\cindex{stopsetups} +\cindex{texdefinition} +\cindex{btxperiod} + +\startTEX +\startsetups btx:default:list:article + \texdefinition{btx:default:author} + \texdefinition{btx:default:title} + \texdefinition{btx:default:journal} + \texdefinition{btx:default:year} + \btxperiod +\stopsetups +\stopTEX + +This specification could be extended to handle publication categories other than +\TEXcode {book} and \TEXcode {article} simply by defining an additional setup, +\emphasis {almost} (see the following). + +\stopsubsubject + +\startsubsubject[title=\LUA\ tables] + +The qualification above is to bring attention to an important \LUA\ component +that is defined in a companion source file: \TEXcode {publ-imp-default.lua}. This +file defines a hierarchical \LUA\ table containing an element \TEXcode +{categories} that itself contains the entries \TEXcode {book}, \TEXcode +{article}, etc. The entries for each \Index {category} themselves contain the +entries \index {field+required}\TEXcode {required} and \index +{field+optional}\TEXcode {optional} listing the dataset fields that are to be +used. Any field that is not declared either \index {field+required}required or +\index {field+optional}optional will be \index {field+ignored}\emphasis +{ignored}. \startfootnote The difference between \index {field+required}\quote +{required} and \index {field+optional}\quote {optional} is only a question of +diagnostics as described in the Appendices. Their functional meaning is rather +\quote {handled} in contrast to \index {field+ignored}\quote {ignored}. +\stopfootnote Note that if a category is \emphasis {not} declared in this \LUA\ +table, than \emphasis {all} of its fields will be considered \index +{field+optional}\quote {optional}. Thus, ignoring this level of control and +simply defining additional setups might be sufficient for most use. + +The advantage of the \LUA\ table is a great simplification of the logic of the +helper setups. Fields that might be irrelevant for one category yet used in +another can be tested; if the field is to be \index {field+ignored}\quote +{ignored}, than a fetch will return nothing. Indeed, the above two setups could +be replaced by a single setup as \TEXcode {journal} is irrelevant and thus +ignored for the \Index {category} \TEXcode {book} but not for the \Index +{category} \TEXcode {journal}. However, an oversimplification such as just +described would be rather confusing and would not extend well to a more complete +specification (such as \index {style+APA}\TEXcode {apa}) handling many different +categories. + +Note, as well, that fields \index {field+ignored}\quote {ignored} for certain +\index {category}categories in the bibliography list will also be ignored in +citations. For example, choosing to ignore \TEXcode {title} in some \Index +{category}, say \TEXcode {article}, will cause \TEXcode {\cite[title]} to fail +(return nothing) when referring to an entry of that category. In the example +shown in \in {section} [sec:customcite], the abstract field would not return +anything if it did not appear in the \LUA\ table. + +This \LUA\ table also defines (as \index {type}\quote {types}, outside of \index +{category}\quote {categories}) what fields are to be interpreted as names, what +fields are to eventually be interpreted as a number or range of numbers, and what +fields are to be interpreted specially as a (semi|-|colon) separated list (for +example, \TEXcode {keywords}). + +A more subtle feature of the \LUA\ level is the notion of \index {set}\quote +{sets}. Related fields can be grouped into sets, for example. + +\startLUA +book = { + sets = { + author = { "author", "editor", }, + editionset = { "edition", "volume", "number" }, + }, +}, +\stopLUA + +A fetch of the set \text {author} (i.e. \cindex {btxflush}\TEXcode +{\btxflush{author}}, to be described below) will return the \text {author} field +if this is present, otherwise it will return the \TEXcode {editor} field, for an +edited book, for example. Testing for the presence of a set in a data entry is +equivalent to a logical \emphasis{or} in testing for the presence of each element +of the set. This mechanism can appear confusing yet it has served to greatly +simplify the logic of the various setups. \startfootnote Sometimes a \Index {set} +will be defined using the same name as its first element, sometimes it can be +given a unique name (typically ending in \quote {set}). \stopfootnote + +The \TEXcode {author} set is a bit special given its use in the \TEXcode +{authoryear(s)}, \TEXcode {authornum}, and \TEXcode {short} citation variants. +This \Index {set} determines what fields are to enter into the citation \Index +{tag}s, a generalization of the notion of author. For example, in the \index +{style+APA}APA style, this set would include the author, editor, or title fields +or an article and the author, editor, publisher, or title fields for a book and +still other sequences of fields for other categories of publications. + +\stopsubsubject + +\startsubsubject[title=Defined helpers] + +Fetching data from the dataset is performed using the command encountered above: +\TEXcode {\btxflush}. If the field (or no elements of the set) is not found, then +this command will return nothing. + +\cindex {btxflush} +\showsetup[btxflush] + +Alternately, one might need to explicitly test for the presence or absence of the +field, in order to conditionally include punctuation or not to trigger +separators, for example. Three test macros have been defined: + +\startplacetable [title=Conditional macros] +\cindex{btxdoifelse} +\cindex{btxdoif} +\cindex{btxdoifnot} +\startTEX +\btxdoifelse{fieldname}{action when found}{action when not found} +\btxdoif {fieldname}{action when found} +\btxdoifnot {fieldname} {action when not found} +\stopTEX +\stopplacetable + +In many cases, the readability can be improved by using further setups, for +instance: + +\cindex{btxdoifelse} +\cindex{fastsetup} + +\startTEX +\btxdoifelse {author} { + \fastsetup{btx:apa:author:yes} +} { + \fastsetup{btx:apa:author:nop} +} +\stopTEX + +Note that the choice between using setups (defined through \Cindex {startsetups} +\unknown\ \Cindex {stopsetups} and recalled through \Cindex {fastsetup}) versus +textdefinitions without arguments (defined through \Cindex {starttexdefinition} +\unknown\ \Cindex {stoptexdefinition} and recalled through \Cindex +{texdefinition}) is a question of taste and opportunity. One should keep in mind +not get carried away abusing setups and texdefinitions for simple code fragments +that are to be used uniquely. + +An extra conditional is available for testing interactivity: + +\cindex{btxdoifelseinteraction} + +\startTEX +\btxdoifelseinteraction{action when true}{action when false} +\stopTEX + +There is also a conditional \Cindex {btxinteractive} which is more efficient, +although in practice efficiency is not so important here. + +\blank + +In addition to \Index {set}s, there are derived or special fields such as +\TEXcode {num} (for the reference number), \TEXcode {suffix} (to be appended in +some cases to \TEXcode {year}), \TEXcode {short} (for names), etc. These all can +be retrieved using \Cindex {btxflush}. Sometimes one might want to force access +to a particular data field (such as \TEXcode {author}) rather than eventually an +element of a \Index {set} having the same name. There are three basic commands to +flush data and a few others to flush associated information: + +\startplacetable [title=Field access macros] +\starttabulate[|l|l|] +\NC \Cindex{btxflush} \NC fetch a derived or explicit field \NC \NR +\NC \Cindex{btxdetail} \NC fetch a derived field (e.g.\ \TEXcode {short}) \NC \NR +\NC \Cindex{btxfield} \NC fetch a explicit field (e.g.\ \TEXcode {year}) \NC \NR +\NR +\NC \Cindex{btxfieldname} \NC fetch the field name \NC \NR +\NC \Cindex{btxfieldtype} \NC fetch the field type (e.g.\ \TEXcode{author}, \TEXcode{range}, \unknown \NC \NR +\NC \Cindex{btxfoundname} \NC fetch the field name of a set (or field) \NC \NR +\NC \Cindex{btxfoundtype} \NC fetch the field type of a set (or field) \NC \NR +\stoptabulate +\stopplacetable + +A few helpers are provided to inject symbols but also take care of leading and +trailing spaces: \startfootnote These make use of the \CONTEXT\ command \Cindex +{removeunwantedspaces}. There is also a \quote {secret} command \TEXcode +{\removepunctuation} that can be quite useful, but also lead to undesired +consequences when wielded blindly! \stopfootnote + +\startplacetable [title=Punctuation macros] +\starttabulate[|||] +\NC \Cindex{btxspace} \NC before \btxspace after \NC \NR +\NC \Cindex{btxnbsp} \NC before \btxnbsp after \NC \NR +\NC \Cindex{btxnobreakspace} \NC before \btxnobreakspace after (same as \Cindex {btxnbsp}) \NC \NR +\NC \Cindex{btxperiod} \NC before \btxperiod after \NC \NR +\NC \Cindex{btxcomma} \NC before \btxcomma after \NC \NR +\NC \Cindex{btxcommabreak} \NC before \btxcommabreak after (allows a line break) \NC \NR +\NC \Cindex{btxleftparenthesis} \NC before \btxleftparenthesis after \NC \NR +\NC \Cindex{btxrightparenthesis} \NC before \btxrightparenthesis after \NC \NR +\NC \Cindex{btxrightparenthesiscomma} \NC before \btxrightparenthesiscomma after \NC \NR +\NC \Cindex{btxrightparenthesisperiod} \NC before \btxrightparenthesisperiod after \NC \NR +\NC \Cindex{btxleftbracket} \NC before \btxleftbracket after \NC \NR +\NC \Cindex{btxrightbracket} \NC before \btxrightbracket after \NC \NR +\NC \Cindex{btxrightbracketcomma} \NC before \btxrightbracketcomma after \NC \NR +\NC \Cindex{btxrightbracketperiod} \NC before \btxrightbracketperiod after \NC \NR +\stoptabulate +\stopplacetable + +\stopsubsubject + +\starthiding + +Normally you can use \TEXcode {\btxfield} or \TEXcode {\btxflush} as derived +fields just like analyzed author fields are flushed in a special way. There is +experimental support for so called manipulators. You can for instance say this: + +\starttyping +\btxflush{lowercase->title} +\stoptyping + +A sequence of manipulators is applied to fetched field, where a sequence is one +or more manipulators: + +\starttyping +\btxflush{stripperiod->uppercase->title} +\stoptyping + +Some actions are recognized (built|-|in) but you can also use actions from other +namespaces, like in: + +\starttyping +\btxflush{converters.Word -> title} +\stoptyping + +Watch how we can use spaces around the \TEXcode {->} which is nicer for wrapped +around usage. Eventually, we might put some more function in the default +namespace. + +So, the previous example setup can be rewritten as: + +\starttyping +\btxdoif {title} { + \bold{\btxfield{title}} + \btxcomma +} +\stoptyping + +There is a special command for rendering a (combination) of authors: + +\starttyping +\btxflushauthor{author} +\btxflushauthor{editor} +\btxflushauthor[inverted]{editor} +\stoptyping + +Instead of the last one you can also use: + +\starttyping +\btxflushauthorinverted{editor} +\stoptyping + +You can use a (configurable) default or pass directives: Valid directives are + +\starttabulate +\NC \bf conversion \NC \bf rendering \NC \NR +\HL +\NC \TEXcode{inverted} \NC the Frog jr, Kermit \NC \NR +\NC \TEXcode{invertedshort} \NC the Frog jr, K \NC \NR +\NC \TEXcode{normal} \NC Kermit, the Frog, jr \NC \NR +\NC \TEXcode{normalshort} \NC K, the Frog, jr \NC \NR +\stoptabulate + +The list itself is not a list in the sense of a regular \CONTEXT\ structure +related list. We do use the list mechanism to keep track of used entries but that +is mostly because we can then reuse filtering mechanisms. The actual rendering of +a reference and entry runs on top of so called constructions (other examples of +constructions are descriptions, enumerations and notes). + +\showsetup[setupbtxlist] + +You need to be aware what command is used to achieve the desired result. For +instance, in order to put parentheses around a number reference you say: + +\starttyping +\setupbtxlistvariant + [num] + [left=(, + right=)] +\stoptyping + +If you want automated width calculations, the following does the trick: + +\starttyping +\setupbtxrendering + [default] + [width=auto] +\stoptyping + +but if you want to control it yourself you say something: + +\starttyping +\setupbtxrendering + [width=none] + +\setupbtxlist + [default] + [width=3cm, + distance=\emwidth, + color=red, + headcolor=blue, + headalign=flushright] +\stoptyping + +In most cases the defaults will work out fine. + +Normally the references are numbered using one counter for the whole document. If +you want each list to have its own number, then you can set the \TEXcode +{continue} parameter: + +\starttyping +\setupbtxrendering[continue=no] +\stoptyping + +In a similar fashion you can influence if references are included only once of in +each list: + +\starttyping +\setupbtxrendering[repeat=yes] +\stoptyping + +\stophiding + +\stopsection + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/publications/publications-database.tex b/doc/context/sources/general/manuals/publications/publications-database.tex new file mode 100644 index 000000000..656ace56d --- /dev/null +++ b/doc/context/sources/general/manuals/publications/publications-database.tex @@ -0,0 +1,553 @@ +\environment publications-style + +\startcomponent publications-database + +\startchapter[title=The database] + +The bibliography subsystem uses a database (or a set of databases) to construct a +list of citations to be used in a scholarly work. However, it will be shown later +that the database system can be used (and abused) to many ends having little or +nothing at all to do with citations and bibliographies. Nevertheless, at first we +shall remain focused on the use of bibliography databases. + +The data to be used must have a source and a structure. In the next sections we +describe the possible input. + +\startsection[title=\BibTeX] + +The \BIBTEX\ format is rather popular in the \TEX\ community and even with its +shortcomings it will stay around for a while. Many publication websites can +export and many tools are available to work with this database format. It is +rather simple and looks a bit like \index [LUA table] {\LUA\ table}\LUA\ tables. +Indeed, it is said that the \BIBTEX\ format was one of the inspirations for the +constructor syntax in \LUA\ \cite [alternative=num, +righttext={\btxcomma Chapter\nbsp 12.}] [default::Ierusalimschy2006]. + +Unfortunately the content can be (and usually is) polluted with +non|-|standardized \TEX\ commands which complicates pre- or post|-|processing +outside \TEX. In that sense a \BIBTEX\ database is often not coded neutrally. +Some limitations, like the use of commands to encode accented characters root in +the \ASCII\ world and can be bypassed by using \index [UTF] {\UTF}\UTF\ instead +(as handled somewhat in \LATEX\ through extensions such as \Tindex {bibtex8}). + +The normal way to deal with a bibliography is to refer to entries using a unique +\Index {tag} or key. When a text containing a list of entries is typeset, this +reference can be used for linking purposes. The list can be processed and sorted +using the \Tindex {bibtex} program that converts the database into something more +\TEX\ friendly (a \Tindex {.bbl} file). + +In \CONTEXT\ we no longer use the (external) \goto {\Tindex {bibtex} program} +[url(https://www.ctan.org/pkg/bibtex)] at all: we simply parse the database files +in \LUA\ and deal with the necessary manipulations directly in \CONTEXT. One or +more such databases can be used and combined with additional entries defined +within the document. We can have several such datasets active at the same time. + +\startaside +\emphasis {On the name \Tindex {btx}:} many of the \CONTEXT\ commands that will be +used in the following contain the label \TEXcode {btx} in their name. This +identifier was retained despite the fact that \CONTEXT\ \MKIV\ is now completely +independent of \BIBTEX; it reflects the role still played by \BIBTEX\ data as a +preferred source format and serves as a handy, unique identifier, both internally +in the programming as well as for the user. This three|-|letter label is +systematically used in commands that otherwise attempt to avoid cryptic|-|styled +names. +\stopaside + +A \BIBTEX\ file entry looks like this: + +\startBTX +@Article {sometag, + author = "An Author and Another One", + title = "A hopefully meaningful title", + journal = maps, + volume = "25", + number = "2", + pages = "5--9", + month = mar, + year = "2013", + ISSN = "1234-5678", +} +\stopBTX + +Entries are of the form: \index {category}\BTXcode {@category{...}} + +Anything outside of a valid \BTXcode {@category{...}} construction is ignored and +is taken to be a comment. Within an entry, there are to be no comments but one +can prefix field names, for example, to have them ignored. + +There is a special entry type named \index {@comment}\BTXcode {@comment{...}}. +The main use of such an entry type is to comment a large part of the bibliography +easily, since anything outside an entry is already a comment, and commenting out +one entry may be achieved by just removing its initial~\BTXcode {@}. — The \index +{@comment}\BTXcode {@comment{...}} entry is perhaps of some use, although this is +not very elegant! As one can input multiple bibliography data files, as will be +seen below, it is much better practice to split datafiles for optional loading. + +Many \BIBTEX\ data management tools such as \Tindex {jabref} (see below) will +ignore and then throw|-|away all such handily|-|crafted comments and data entries +turned into comments. So one must beware! + +The field names are all cast to lowercase so capitalization is irrelevant; +Spacing is not important and should be used advantageously for readability. The +leading \Index {tag} (\BTXcode {sometag} in the example above) cannot contain +spaces and \emphasis {must} be followed by a comma. + +The entry \Index {tag} (\BTXcode {@category{sometag,...}}) is not to be confused +with the optional field \BTXcode {key=sortkey,} that may also be present. + +Normally a value is given between quotes (or curly brackets) but single words are +also valid (as there is no real benefit in not using quotes or curly brackets, we +advise to always use them, contrary to our example above). The order of the +fields in an entry is inconsequential and there can be many more fields than +those shown above. Instead of string values one can also use predefined +shortcuts. The title for example might quite often contain \TEX\ macros, and some +fields, like \BTXcode {pages} have funny characters such as the endash (typically +entered as \BTXcode {--}) so we have a mixture of data and typesetting +directives. Furthermore, if you are covering non||English references, you often +need characters that are not in the \ASCII\ subset. Note that \CONTEXT\ is quite +happy with \UTF, but if your database file uses old|-|fashioned \TEX\ accent +combinations then these will be internally converted automatically to \UTF. + +Commands (macros) found in a database file are converted to an indirect call, +which is quite robust. The use of commands in the database file will be described +in \in {section} [sec:Commands]. + +The \Tindex {author} (and \Tindex {editor}) fields are parsed separating multiple +authors identified by the conjunction \quote {and}. Each name is assumed to be in +the form: + +\definetyping + [NameSyntax] + [margin=1em] + +\startNameSyntax +Firstname(s) Lastname +\stopNameSyntax + +\seeindex {vons} {particule} + +where \type {Lastname} is a single word but may include an optional (nobility) +\Index {particule}: lower|-|case word(s) such as \quotation {von}, \quotation +{de}, \quotation {de la}, etc.) \emphasis {unless} specifically in the two- or +three|-|token form: + +\index {suffix} + +\startNameSyntax +Lastname(s), Firstname(s) +Lastnames(s), Suffix(es), Firstname(s) +\stopNameSyntax + +separated explicitly using comma(s) thus allowing multi|-|word \type {Lastnames}. + +\startaside +An \BTXcode {author} field is sometimes abused in traditional \BIBTEX\ usage to +hold not a name but rather an entity. Other fields, such as \BTXcode +{organization} or \BTXcode {collaboration}, for example, should be used in such +cases. +\stopaside + +\BIBTEX\ also (obscurely) supports the syntax: + +\seeindex {juniors}{suffix} +\index {suffix} + +\startNameSyntax +Firstname(s) \{Lastname(s), Suffix(es)\} +\stopNameSyntax + +we may (or may not) support this in the future, so don't use this! + +We extend \BIBTEX\ by optionally parsing each name in terms of four or five +tokens: + +\index {particule} \index {suffix} \index {initial} + +\startNameSyntax +Particule(s), Lastname(s), Suffix(es), Firstname(s) +Particule(s), Lastname(s), Suffix(es), Firstname(s), Initial(s) +\stopNameSyntax + +in order to allow a free form for the particules, irrespective of capitalization, +thus avoiding the need to resort to any sort of \TEX\ trickery \cite [num] +[default::Patashnik1988,Markey2009]. In fact, an optional sixth token is parsed +whose meaning is presently reserved for future directives describing how the name +is to be interpreted: + +\index {particule} \index {suffix} \index {initial} + +\startNameSyntax +Particule(s), Lastname(s), Suffix(es), Firstname(s), Initial(s), directives +\stopNameSyntax + +\BIBTEX\ additionally accepts the special token \Tindex {others} to be used +(sparingly) to indicate an incomplete author list. Note that most style +specifications will handle the truncation of long author lists in a systematic +fashion. The \index [others] {\tt and others}\BTXcode {and others} construction +finds its use when the complete author list is not well known or ill|-|defined. + +Sometimes, or even often, the database might contain variants of an author's +name that we would like to identify as a single, unique author. Indeed, certain +bibliographic styles (as will be seen later) as well as an index of authors, for +example, will depend on this identification. A command \Cindex {btxremapauthor} +allows establishing this identity: + +\startbuffer +\btxremapauthor [Donald Knuth] [Donald E. Knuth] +\btxremapauthor [Don Knuth] [Donald E. Knuth] +\stopbuffer +\getbuffer + +\cindex {btxremapauthor} +\typebuffer [option=TEX] + +Fields other than \Tindex {author} and \Tindex {editor}, for example \Tindex +{artist} or \Tindex {director} if one desires, can be declared to be of type +\quote {author} and thus interpreted as names, but this is a subject for +specialists. + +The \BTXcode {keywords} field can also be split into tokens separated by +semicolons (keyword; keyword; \unknown). This can be useful, as will be seen +later, in the creation of keyword indexes, for example. + +Other string values such as \BTXcode {title} are kept literally (except for an +internal automatic conversion to \UTF\ of certain \TEX\ strings such as accent +combinations, endash, quotations, etc.). Note that the bibliography rendering +style (see below) might specify a capitalization of the title (using the +\CONTEXT\ commands \TEXcode {\Word} or \TEXcode {\Words}, for example). +Capitalized Names and acronyms are respected removing a need for the \BIBTEX\ +practice of \quote {protecting} such words or letters with surrounding curly +brackets (which here are simply stripped off). (Furthermore, since \CONTEXT\ uses +\UTF, it does not suffer from all of the complicated \Index {sorting} issues that +plague \BIBTEX|/|\LATEX.) As some styles might not specify the capitalization of +words in the title whereas other styles might, it is recommended that strings be +written in lower case except where upper case is explicitly required so as to be +compatible with all such capitalization styles. + +\startaside +Some bibliographic database sources can be quite sloppy and return strings +(titles and even authors) in all capitals, for example. We have made the design +choice \emphasis {not} to follow the \BIBTEX\ practice/feature of explicitly +formatting all string values, as we did not want to require the protection +through enclosing curly brackets that would have been a necessary consequence. +Thus, some cleaning of these database files might be needed. Furthermore, we +attempt to use all the power of \CONTEXT\ and \LUA, thus making unnecessary much +(most?) of the \TEX-like encoding of the data. We encourage users to clean|-|up +their \Tindex {.bib} database files as much as possible so that they contain only +the necessary data, with a minimum of explicit formatting directives. +\stopaside + +String values, as described above, can be enclosed indifferently between matching +curly brackets: \BTXcode {{}} or pairs of quotation marks: \BTXcode {""}. +Multiple string values can be \index {string concatenation}concatenated using the +operator \BTXcode {\#}, as will be illustrated in \in {table} +[tab:mkiv-publications.bib]. + +Everything outside of a valid entry is ignored and treated as a \Index {comment}. +Syntactic errors (such as a missing comma or some unbalanced quotes or +parenthesis) are also skipped over, i.e. ignored. This is to attempt to continue +on to valid data but may lead to unexpected results. It is therefore the user's +responsibility to insure the correctness of the data files. Whereas some checks +and warnings are issued, the system is purposefully not too verbose. + +Data is handled on a \quote {first come, first served} basis: duplicate \index +{duplicate+fields}\emphasis {fields} in an entry are ignored \startfootnote Note +that some \BIBTEX\ practice allows for the concatenation of duplicate name \index +{duplicate+fields}fields (i.e. \BTXcode {author} and \BTXcode {editor}) through +\BTXcode {and}, but (silently) ignores duplicate other fields. We choose to have +a consistant behavior and disallow duplicate field occurrences. \stopfootnote +though duplicate \index {duplicate+entries}\emphasis {entries} (having the same +\index {duplicate+tags}tag) are retained, but the subsequent identical \Index +{tag}s will be modified by adding a suffix $-n$ for the $n$\high {th} duplicate. +The presence of duplicate \index {duplicate+fields}fields or \index +{duplicate+tags}tags will be flagged as such with warnings in the log file. +Duplicate \index {duplicate+entries}entries using different \Index {tag}s will +not be treated as duplicates. + +A special provision has been made to declare author \Index {synonyms}, that is +names that might occur with a variation of spellings or aliases. This shall be +discussed later. + +We have attempted to remain compatible with the \BIBTEX\ format, and any new +bibliography extensions that we introduce here were designed in a way to remain +compatible with \BIBTEX, being simply ignored rather than potentially generating +a \BIBTEX\ error. + +The \BIBTEX\ files are loaded in memory as \LUA\ table but can be converted to +\XML\ so that we can access them in a more flexible way, but that is another +subject for specialists. + +\stopsection + +\startsection [reference=sec:Commands,title=Commands in entries] + +One unfortunate aspect commonly found in \BIBTEX\ files is that they may contain +\TEX\ commands. Even worse is that there is no standard on what these commands +can be and what they mean, at least not formally, as \BIBTEX\ is a program +intended to be used with many variants of \TEX\ style: plain, \LATEX, and others. +This means that we need to define our use of these typesetting commands. (In +particular, one might need to redefine those that are too \LATEX|-|centric.) +However, in most cases, they are just abbreviations or font switches and these +are often well known. Therefore, \CONTEXT\ will try to resolve them before +reporting an issue. The log file will announce the commands that have been seen +in the loaded databases. For instance, loading \Tindex {tugboat.bib} (distributed +with \TEXLIVE) gives a long list of commands of which we show a small set of the +five most frequently encountered ones here: + +\startbuffer +\definebtxdataset[tugboat] +\usebtxdataset[tugboat][tugboat.bib] +\stopbuffer + +\getbuffer + +\starttyping +publications > tugboat tt 134 known +publications > tugboat Dash 136 unknown +publications > tugboat acro 137 known +publications > tugboat LaTeX 209 known +publications > tugboat TeX 856 known +\stoptyping + +Some are flagged as known and others as unknown. You can define unknown commands, +or overload existing definitions in the standard way (\emphasis {e.g.} \TEXcode +{\def\Dash{—}}), the \CONTEXT\ way (\TEXcode {\define\Dash{—}}) or, +alternatively, in the following way: + +\cindex {definebtxcommand} + +\startTEX +\definebtxcommand\TUB {TUGboat} +\definebtxcommand\MP {METAPOST} +\definebtxcommand\sltt{\tt} +\definebtxcommand\<#1>{\type{#1}} +\stopTEX + +\definebtxcommand\MP {METAPOST} % to be used silently below + +Custom commands created using \Cindex {definebtxcommand} have the advantage of +using a separate name space thus allowing \Index {isolation} from other \CONTEXT\ +commands. (The \Index {isolation} of \Cindex {btxcommand} allows the \Tindex +{.bib} files to safely contain \TEX\ and \LATEX\ idiosyncrasies that might +conflict with proper \CONTEXT\ syntax.) Unknown commands do not stall processing, +but their names are then typeset in a mono|-|spaced font so they probably stand +out for proofreading. You can access the commands using \index +{btxcommand}\TEXcode {\btxcommand{...}} (or \Cindex {btxcmd}), as in: + +\startbuffer +commands like \btxcommand{MySpecialCommand} are handled in an indirect way +\stopbuffer + +\cindex {btxcommand} + +\typeTEXbuffer + +As this is an undefined command we get: \quotation {\inlinebuffer}. + +Often, these embedded \TEX\ commands are present in \Tindex {.bib} files in order +to trick \BIBTEX\ into certain behavior. Since this will generally not be +necessary here, we strongly encourage users to clean|-|up such unnecessary +extras. Indeed, the idea is to keep the data clean, using styles and parameter +settings instead to handle rendering issues. Indeed, we don't see it as challenge +nor as a duty to support all kinds of messy definitions. Of course, we try to be +somewhat tolerant, but you will be sure to get better results if you use nicely +setup, consistent databases. + +Finally, the \BIBTEX\ entry \tindex {@string}\BTXcode {@String{}} is preprocessed +as expected. + +\tindex {@string} + +\startTEX +@String{j-TUGboat = "TUGboat"} +\stopTEX + +\startaside +Notice that \Tindex {tugboat.bib} also contains: \tindex {@preamble} +\startBTX +@Preamble{"\input tugboat.def"} +@Preamble{"\input path.sty"} +\stopBTX +These are silently ignored as many such commands are most likely not to be +compatible with \CONTEXT. Indeed, the examples shown here are not! +\stopaside + +\stopsection + +\startsection[title=\MKII\ definitions] + +In the old \MKII\ setup we have two kinds of entries: the ones that come from the +\BIBTEX\ run and additional user|-|supplied ones. We no longer rely on \BIBTEX\ +output but we do still support the user supplied definitions. These were in fact +prepared in a way that suits the processing of the \BIBTEX\ generated entries; +The next variant reflects the \CONTEXT\ recoding of the old \BIBTEX\ output. For +this reason, some users refer to this as \Tindex {.bbl} format. + +\cindex {startpublication} +\cindex {stoppublication} + +\startTEX +\startpublication[k=Hagen:Second,t=article,a={Hans Hagen},y=2013,s=HH01] + \artauthor[] {Hans}[H.]{}{Hagen} + \arttitle {Who knows more?} + \journal {MyJournal} + \pubyear {2013} + \month {8} + \volume {1} + \issue {3} + \issn {1234-5678} + \pages {123--126} +\stoppublication +\stopTEX + +The split \TEXcode {\artauthor} fields will be collapsed into a single \TEXcode +{author} field as we handle the splitting later when it gets parsed in \LUA. The +\TEXcode {\artauthor} syntax is only kept around for backward compatibility with +the previous use of \BIBTEX. + +In the new setup we support these variants: + +\cindex {startpublication} +\cindex {stoppublication} + +\startTEX +\startpublication[k=Hagen:Third,t=article] + \author{Hans Hagen} + \title {Who knows who?} + ... +\stoppublication +\stopTEX + +as well as + +\cindex {startpublication} +\cindex {stoppublication} + +\startTEX +\startpublication[tag=Hagen:Third,category=article] + \author{Hans Hagen} + \title {Who knows who?} + ... +\stoppublication +\stopTEX + +and + +\cindex {startpublication} +\cindex {stoppublication} + +\startTEX +\startpublication + \tag {Hagen:Third} + \category{article} + \author {Hans Hagen} + \title {Who knows who?} + ... +\stoppublication +\stopTEX + +The use of this format will be illustrated later a means to export the database +which may be of great use in converting collections of \MKII\ bibliography files. + +\showsetup[startpublication] + +\stopsection + +\startsection[title=\LUA\ tables] + +Because internally the entries are \index [LUA table] {\LUA\ table}\LUA\ tables, +we also support the loading of \LUA\ based definitions: + +\startLUA +return { + ["Hagen:First"] = { + author = "Hans Hagen", + category = "article", + issn = "1234-5678", + issue = "3", + journal = "MyJournal", + month = "8", + pages = "123--126", + tag = "Hagen:First", + title = "Who knows nothing?", + volume = "1", + year = "2013", + }, +} +\stopLUA + +Notice that the \Index {tag} is redundantly specified; it is \quote {pushed} into +the table so that one can access it without having to know the \Index {tag} of the +original table. + +\stopsection + +\startsection[title=\XML] + +The following \index [XML] {\XML}\XML\ input is rather close in structure, and is +also accepted as input. + +\startXML +<?xml version="2.0" standalone="yes" ?> +<bibtex> + <entry tag="Hagen:First" category="article"> + <field name="author">Hans Hagen</field> + <field name="category">article</field> + <field name="issn">1234-5678</field> + <field name="issue">3</field> + <field name="journal">MyJournal</field> + <field name="month">8</field> + <field name="pages">123--126</field> + <field name="tag">Hagen:First</field> + <field name="title">Who knows nothing?</field> + <field name="volume">1</field> + <field name="year">2013</field> + </entry> +</bibtex> +\stopXML + +We shall focus on the use of \BIBTEX\ \Tindex {.bib} files as the input data +format of reference. Keep in mind, however, that the \index [LUA table] {\LUA\ +table}\LUA\ table format and the \index [XML] {\XML}\XML\ format might prove to +be more flexible for future expansion of functionality. + +\stopsection + +\startsection[title=Other formats] + +Various other bibliographic data file formats are in common use, such as: + +\starttabulate [|Tl|p|] +\NC savedrecs.txt \NC Institute of Scientific Information (ISI) tagged format + (e.g. Thomson Reuters™ Web of Science™), \NC \NR +\NC filename.enw \NC Thomson Reuters™ Endnote™ export format + (there is also an Endnote \type {.xml} export), \NC \NR +\NC filename.ris \NC Research Information Systems, Incorporated, now + Thomson Reuters™ Reference Manager™, and \NC \NR +\NC pubmed_result.txt \NC The National Library of Medicine® (NLM®) + MEDLINE®|/|PubMed® data format \NC \NR +\stoptabulate + +just to name a few (amongst many more). Filters can be easily written in \LUA\ to +read these and other bibliography data formats, although no such filters are +provided. This is because the user has a choice of a certain number of +bibliography database management programs that can easily convert from these to +the \BIBTEX\ format. (Notable, open source examples are \index {jabref} \goto +{jabref} [url(http://jabref.sourceforge.net)] and \index {zotero} \goto {zotero} +[url(http://www.zotero.org)].) Indeed, it is not the vocation of the present +\CONTEXT\ bibliography subsystem to fully manage the bibliography data sources, +only to be able to use such data in the production of documents. + +\startaside +\emphasis {A note on database management programs:} these are very valuable tools +for the manipulation of bibliography database information, which is why the +\BIBTEX\ format has so much importance for us here. However, one must be aware +that these programs are not standards and many of them may introduce invalid +extensions that might not even be handled correctly by \BIBTEX\ itself. +\stopaside + +\stopsection + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/publications/publications-datasets.tex b/doc/context/sources/general/manuals/publications/publications-datasets.tex new file mode 100644 index 000000000..d612b72e0 --- /dev/null +++ b/doc/context/sources/general/manuals/publications/publications-datasets.tex @@ -0,0 +1,337 @@ +\environment publications-style + +\startcomponent publications-datasets + +\startchapter[title=Datasets] + +Normally in a document you will use only one bibliographic database, whether or +not its source is distributed over multiple files. Nevertheless, we support +multiple database formats as well which is why we talk of datasets instead. The +use of multiple datasets allows the isolation of different bibliographies (a +single bibliography can nevertheless be rendered by structure element: section, +chapter, part, etc. as we shall see later). A good example of the use of multiple +datasets would be for a proper bibliography itself in addition to a reference +catalog (of equipment, suppliers, software, patents, legal jurisprudence, music, +\unknown). Indeed, datasets can be used to hold both bibliographic and +non|-|bibliographic information. + +A dataset is initiated with the \Cindex {definebtxdataset} command. + +\cindex {definebtxdataset} + +\startTEX +\definebtxdataset[default] +\stopTEX + +\startaside +A default database, \TEXcode {default}, is predefined, yet we recommend defining +it explicitly because in the future we may provide more options. +\stopaside + +Like other commands in \CONTEXT, the dataset options can be setup using the +command \Cindex {setupbtxdataset}. + +\cindex {definebtxdataset} +\showsetup[definebtxdataset] + +\cindex {setupbtxdataset} +\showsetup[setupbtxdataset] + +A dataset is loaded from some source through the use of the +\Cindex {usebtxdataset} command. + +Here are some examples: + +\cindex {usebtxdataset} +\tindex {.bib} +\tindex {.xml} +\tindex {.lua} +\tindex {.bbl} + +\startTEX +\usebtxdataset[tugboat][tugboat.bib] +\usebtxdataset[default][mtx-bibtex-output.xml] +\usebtxdataset[default][test-001-btx-standard.lua] +\usebtxdataset[default][mkii-publications.bbl] +\usebtxdataset[default][named.buffer] +\stopTEX + +\cindex {usebtxdataset} +\showsetup[usebtxdataset] + +The four suffixes illustrated in the example above are understood by the loader. +Here the dataset (other than the first) has the name \TEXcode {default} and the +four database files are merged. The last example shows that a \TEXcode {named} +\Index {buffer} can also be employed to add dataset entries (in \BIBTEX\ format). +This may be useful for small additions or examples, but it is generally a better +idea (for convenience of management of data) to place them in files separate from +the document source code. + +Definitions in the document source (coded in \TEX\ speak) are also added, and +they are saved for successive runs. This means that if you load and define +entries, they will be known at a next run beforehand, so that references to them +are independent of where in the document source loading and definitions take +place. This is convenient to eventually break|-|up the dataset loading calls to +relevant sections of the document structure. + +In this document we use some example databases, so let's load one of them now: +\startfootnote This code snippet demonstrates that \TEXcode {\usebtxdataset} will +implicitly declare an undefined dataset name, although this practice is to be +discouraged. Similarly, omitting to specify the dataset name \TEXcode {[default]} +in the examples given earlier would fall|-|back correctly, but this, too, is to +be discouraged as being potentially error|-|prone. \stopfootnote + +\startbuffer +\usebtxdataset[example][mkiv-publications.bib] +\stopbuffer + +\cindex {definebtxdataset} +\cindex {usebtxdataset} + +\typeTEXbuffer + +\getbuffer + +The beginning of the file \type {mkiv-publications.bib} is shown below in \in +{table} [tab:mkiv-publications.bib]. This bibliography database test file +contains one entry of each standard type or category, with the \Index {tag} set +to the entry type name. This entry shown here illustrates many features that will +be explained elsewhere in the text. + +\startsection[title=Dataset coverage] + +You can load much more data than you actually need. Usually only those entries +that are referred to explicitly will be shown in lists, and commands used to +select these dataset entries will described in \in {chapter} [ch:cite]. + +A single bibliography list can span groups of datasets; also multiple datasets +can loaded from the same source, for example, one per chapter, in order to +achieve a complete \Index {isolation} of bibliographies with respect to numbering +and references. + +As this concept is not obvious but can be quite useful, we will repeat this last +point: multiple datasets can be loaded using the same source file, i.e.\ +containing the same data, to be used in parallel, independently. There is little +penalty in keeping even very large datasets as multiple copies in memory. + +The current active dataset to be used by default can be set with + +\startbuffer +\setupbtx[dataset=example] +\stopbuffer + +\cindex {setupbtx} + +\typeTEXbuffer + +\getbuffer + +However, most publication|-|related commands accept optional arguments that +denote the dataset and references to entries can always be prefixed with a +dataset identifier. More about that later. + +\showsetup[setupbtx] + +\stopsection + +\startsection [title=Specification] + +The content of a dataset can really be anything: entries of type (or categories) +of all sorts, each containing arbitrary fields. The use to be made of this data +can vary greatly since the system is not limited to the production of +bibliography lists, in particular. The intended use is reflected through a set of +specifications, specific to each bibliography (or non|-|bibliography) style. +These specifications affect the interpretation of dataset categories and fields +as well as their rendering. They will also affect the rendering of citations or +the reference or invocation of individual data entries. + +The \TEXcode {default} bibliography specification is very simple: only the +categories \TEXcode {book} and \TEXcode {article} are explicitly defined. These +were shown along with their default rendering in the quick|-|start example on \at +{page} [ch:quick]. We purposely limited this \TEXcode {default} specification as +a minimal example for a bibliography. + +The notion of categories and the fields that they might contain and their +interpretation depend on a particular specification, although the dataset +\emphasis {content} is independent of all eventual rendering specifications that +may be applied. + +An alternative set of specifications can be selected using, for example + +\startbuffer +\usebtxdefinitions[apa] +\stopbuffer + +\cindex {usebtxdefinitions} +\index {style+APA} +\seeindex {specification}{style} + +\typeTEXbuffer + +\getbuffer + +Alternately, the set of specifications can be loaded and (later) activated using + +\cindex {loadbtxdefinitionfile} +\cindex {setupbtx} +\index {style+APA} + +\startTEX +\loadbtxdefinitionfile[apa] +... +\setupbtx[specification=apa] +\stopTEX + +but it is safer to use the \TEXcode {\use} rather than \TEXcode {\load} form, in +particular with specifications that may themselves have several variants. Also, +it is way too easy to later forget to set the \TEXcode {specification} parameter +and then wonder why the loaded specification was not applied. + +\startaside +We wish to clarify that each specification defines the categories of entries and +the interpretation or use of the fields that they contain, but does not alter the +data itself, only how this data is used. It also defines \emphasis {setups} that +control the rendering of lists as well as citations (to be described below). +Additionally, it creates a namespace with settings for particular \emphasis +{parameters} controlling the formatting of names, for example, punctuation as +well as other stylistic features. The user can tune or overload these settings as +needed. +\stopaside + +A specification need not be activated before loading a dataset; indeed the +contents of a dataset are stored independent of the specification, and multiple +specifications can be applied to the same dataset (although this will not usually +be the case). Furthermore, multiple specification files can be loaded +simultaneously as they reside in separate namespaces, but only one specification +can be selected at a time. We introduce these commands here in the context of +datasets as the labeling of categories and of field use can change depending on +the specification. Indeed, some specifications might ignore certain fields +present in the dataset that may be used with other specifications. The details of +how this is programmed will be explained in \in {Chapter} [ch:custom]. + +So a specification is both a definition of how a dataset is to be interpreted as +well as stylistic tuning of how it is to be rendered. + +\cindex {loadbtxdefinitionfile} +\showsetup[loadbtxdefinitionfile] + +\cindex {usebtxdefinitions} +\showsetup[usebtxdefinitions] + +\stopsection + +\startsection [title=Dataset diagnostics] + +You can ask for an overview of entries present in a dataset with: + +\startbuffer +\showbtxdatasetfields[example] +\stopbuffer + +\cindex {showbtxdatasetfields} + +\typeTEXbuffer + +The listing that this produces is shown in \in {Appendix} [ch:datasetfields]. + +\cindex {showbtxdatasetfields} +\showsetup[showbtxdatasetfields] +\showsetup[showbtxdatasetfields:argument] + +Sometimes you might want to check a database, listing all of its entries in +detail. This can be particularly useful when in doubt concerning the correctness +or the completeness of the data source, remembering that invalid entries and some +syntax errors are simply skipped over. One way of examining the loaded dataset in +detail is the following: + +\startbuffer +\showbtxdatasetcompleteness[example] +\stopbuffer + +\cindex {showbtxdatasetcompleteness} + +\typeTEXbuffer + +The diagnostic listing (which can be rather long) is shown in \in {Appendix} +[ch:datasetcompleteness]. + +\cindex {showbtxdatasetcompleteness} +\showsetup[showbtxdatasetcompleteness] +\showsetup[showbtxdatasetcompleteness:argument] + +The dataset contains many entries and each entry is assigned to a \Index +{category}. It must be stressed, so we repeat ourselves here, that these \quote +{categories} can be of any sort whatsoever, the meaning of which resides in the +rendering style that is chosen. The entries contain fields, and these too can be +of any sort; their use also depends on the rendering style and the \Index +{category} in which they belong. \BibTeX\ has conventionally defined a number of +standard categories, each making use of a number of fields considered either +\index {field+required}required, \index {field+optional}optional or \index +{field+ignored}ignored. However, different traditional \BIBTEX\ rendering styles +can make inconsistant use of these standard categories and fields. To make +matters worse, different \Tindex {.bib} database handling programs might use (and +impose) differing \quote {standards} as well, as mentioned above. \startfootnote +For example, \Tindex {jabref}, in addition to discarding all comments contained +in the database file, will convert all unrecognized, preciously named categories +to \tindex {@other}\BTXcode {@Other}! Of course, \Tindex {jabref} is flexible +enough to be configured with new categories and additional fields, so users of +\Tindex {jabref} with \CONTEXT\ will probably want to use an extended, custom +configuration. \stopfootnote This situation arises from the complexity of +handling bibliographic data of all sorts. + +You can see all (currently known) \index {category}categories and \index +{field}fields with: + +\cindex {showbtxfields} + +\startTEX +\showbtxfields[rotation=...] +\stopTEX + +The result is shown \in {table} [tab:fields], below. + +\cindex {showbtxfields} +\showsetup[showbtxfields] +\showsetup[showbtxfields:argument] + +Note that other, possibly non|-|bibliographic use of the present dataset system +might define entirely different categories and field types, possibly having +nothing at all to do with the names shown here. An example of such use is given +in \in {chapter} [ch:duane]. + +Just as a database can be much larger than needed for a document, the same is +true for the fields that make up an entry; not all entry fields will be +necessarily used. This idea will be developed in the next section describing the +rendering of bibliography lists. + +\stopsection + +\startplacetable + [reference=tab:mkiv-publications.bib, + title={mkiv-publications.bib\\ + This test file was constructed to illustrate various features of the + \BIBTEX\ format and contains some fields that might at first glance + appear somewhat curious.}]. + \typeBTXfile + [range={@Comment{Start example},@Comment{Stop example}}] + {mkiv-publications.bib} +\stopplacetable + +\startplacetable + [reference=tab:fields, + list={\TEXcode {\showbtxfields[rotation=90]}}, + title={\cindex {showbtxfields}\TEXcode {\showbtxfields[rotation=90]} The entry + \Index {category} and \Index {field} names (and how they are used) are + defined by both the rendering style as well as by the contents of the + dataset. \index {field+required}\quote {Required} fields are indicated + in green. All unmarked fields are normally \index + {field+ignored}ignored in the rendering.}] + \small + \showbtxfields[rotation=90] +\stopplacetable + +\placefloats + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/publications/publications-exporting.tex b/doc/context/sources/general/manuals/publications/publications-exporting.tex new file mode 100644 index 000000000..b459ce118 --- /dev/null +++ b/doc/context/sources/general/manuals/publications/publications-exporting.tex @@ -0,0 +1,33 @@ +\environment publications-style + +\startcomponent publications-exporting + +\startchapter[title=Exporting datasets] + +A dataset can be much more complete than necessary. Furthermore, it may be +desirable to isolate bibliography data by chapter, for example, or by any other +structural element such as part. To achieve this, it is possible to export the +entries of a dataset following certain criteria. + +\cindex{savebtxdataset} + +Take as an example, the bibliography of the present manual that was entered in +the source as buffers for convenience. The entries can be saved to a legitimate +\BIBTEX\ format file using: + +\startTEX +\savebtxdataset + [default] + [mkvi-publications.bib] + [alternative=bib, + criterium=all] +\stopTEX + +This can also be used to convert older bibliography source files (for example, +kept in the \tindex {.bbl}\MKII\ format) into the \tindex {.bib}\type {bib}, +\tindex {.lua}\type {lua} or even \tindex {.xml}\type {xml} format that could be +more convenient for future manipulation. + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/publications/publications-extensions.tex b/doc/context/sources/general/manuals/publications/publications-extensions.tex new file mode 100644 index 000000000..262d5eb3c --- /dev/null +++ b/doc/context/sources/general/manuals/publications/publications-extensions.tex @@ -0,0 +1,119 @@ +\environment publications-style + +\startcomponent publications-extensions + +\startchapter[title=Extensions] + +As \TEX\ and \LUA\ are both open and accessible in \CONTEXT\ it is possible to +extend the functionality of the bibliography related code. For instance, you +could add extra loaders, sketched as follows: + +\startTEX +\startluacode +function publications.loaders.myformat(dataset,filename) + local t = { } + -- Load data from 'filename' and convert it to a Lua table 't' with + -- the key as hash entry and fields conforming the luadata table + -- format. + loaders.lua(dataset,t) +end +\stopluacode +\stopTEX + +This would then permit the loading a database (into a dataset) with the command: + +\cindex{usebtxdataset} + +\startTEX +\usebtxdataset[default][myfile.myformat] +\stopTEX + +The \type {myformat} suffix is recognized automatically. If you want to use another +suffix, you can do this: + +\cindex{usebtxdataset} + +\startTEX +\usebtxdataset[default][myformat::myfile.txt] +\stopTEX + +%% NO SETUP BTX:APA:LEFTTEXT SO THE FOLLOWING DOES NOT WORK: +%% +%% If you want to add information to an entry at runtime you can pass so called user +%% variables with the \type {\cite} command. The following example demonstrates +%% this. First we define a dataset: +%% +%% \startbuffer +%% \startbuffer [knuth] +%% @Book{knuth-texbook, +%% title = {The TeXbook}, +%% author = {Knuth, Donald Ervin}, +%% isbn = {0-201-13447-0}, +%% series = {Computers {\&} Typesetting}, +%% volume = {A}, +%% year = {1986}, +%% publisher = {Addison Wesley}, +%% address = {Reading, MA}, +%% } +%% \stopbuffer +%% +%% \definebtxdataset[knuth] +%% \usebtxdataset [knuth] [knuth.buffer] +%% \definebtxrendering[knuth][dataset=knuth] +%% \stopbuffer +%% +%% \typeTEXbuffer +%% \getbuffer +%% +%% \startbuffer[setup] +%% \startsetups btx:apa:lefttext +%% \currentbtxlefttext +%% \btxspace +%% \btxdoifelseuservariable {notabene} { +%% {\bs \currentbtxuservariable{notabene}} +%% } { +%% % nothing +%% } +%% \btxspace +%% \stopsetups +%% \stopbuffer +%% +%% \getbuffer[setup] +%% +%% \startbuffer +%% We all know the \TeX book by Don Knuth \citation [reference=knuth::knuth-texbook, +%% lefttext={\bf >}] [notabene=Well known to \TEX\ users:]. +%% \stopbuffer +%% +%% We use this example where we use \type {\citation} instead of \type {\cite} because +%% it is more tolerant with spaces. Because we pass user variables as second argument +%% the first argument also has to be a key|/|value set. +%% +%% \typeTEXbuffer +%% +%% \getbuffer +%% +%% The list is typeset using: +%% +%% \startbuffer +%% \placelistofpublications [knuth] [criterium=all] +%% \stopbuffer +%% +%% \typeTEXbuffer +%% +%% and looks like this: +%% +%% \getbuffer +%% +%% The injection of the user variables is up to you. Here we hooked it into an +%% existing setup that we overload: +%% +%% \typeTEXbuffer [setup] +%% +%% The \type {lefttext} and \type {righttext} variables are also kept with the +%% entry but these are checked for automatically. In this case it means that +%% when no \type {lefttext} is specified, the \type {notabene} doesn't show up. + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/publications/publications-fields.tex b/doc/context/sources/general/manuals/publications/publications-fields.tex new file mode 100644 index 000000000..adbdb373b --- /dev/null +++ b/doc/context/sources/general/manuals/publications/publications-fields.tex @@ -0,0 +1,38 @@ +\environment publications-style + +\startcomponent publications-fields + +\startchapter + [title={Dataset fields}, + reference=ch:datasetfields] + +\setupbtx + [specification=apa] + +\usebtxdataset + [example] + [mkiv-publications.bib] + +\startbuffer +\showbtxdatasetfields[example] +\stopbuffer + +\typeTEXbuffer + +\cindex {showbtxdatasetfields}The field names for each entry \Index {category} +are colored according to their status with respect to the bibliography rendering +style. The \index {field+required}\quote {required} field names are colored in +green, where required means that if this field is missing, one is probably not +using the correct entry type or category. Some fields are \index +{field+optional}\quote {optional} (and some \index {field+required}\quote +{required} fields can become conditionally optional, see below). Fields that +normally would be \index {field+ignored}ignored (defined as neither required, nor +optional) are colored in dark yellow. Some fields are treated as \index +{field+special}\quote {special}, that is are used internally, not necessarily +directly rendered, and are colored here in blue. + +\getbuffer + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/publications/publications-introduction.tex b/doc/context/sources/general/manuals/publications/publications-introduction.tex new file mode 100644 index 000000000..53abf5d83 --- /dev/null +++ b/doc/context/sources/general/manuals/publications/publications-introduction.tex @@ -0,0 +1,109 @@ +\environment publications-style + +\startcomponent publications-introduction + +\startchapter[title=Introduction] + +\startsubject[title=How Hans got involved] + +This manual is dedicated to Taco \Name{Hoekwater}{T.} who in a previous century +implemented the first \BIBTEX\ module and saw it morph into a \TEX||\LUA\ hybrid +in this century. The fact that there was support for bibliographies made it +possible for users to use \CONTEXT\ in an academic environment, dominated by +bibliographic databases encoded in the \BIBTEX\ format. + +This manual describes how \MKIV\ now handles bibliographies. Support in \CONTEXT\ +started in \MKII\ for \BIBTEX, as mentioned above, using a module written by Taco +\Name {Hoekwater} {T.}. Later his code was adapted to \MKIV, but because users +demanded more, I decided that reimplementing made more sense than patching. In +particular, through the use of \LUA, the \BIBTEX\ data files can be easily +directly parsed, thus liberating \CONTEXT\ from the dependency on an external +\BIBTEX\ executable. The \Index{CritEd project} (by Thomas \Name {Schmitz} {T.}, +Alan \Name {Braslau} {A.}, Luigi \Name {Scarso} {L.} and \name {Hagen} +{H.}myself) was a good reason to undertake this rewrite. As part that project +users were invited to come up with ideas about extensions. Not all of them are +(yet) honored, but the rewrite makes more functionality possible. + +The subsystem described here is one of the most complex and messy of all +\CONTEXT\ subsystems. This has to do with the fact that it combines (multiple) +lists and (multiple) forward and backward references, all kind of rendering of +the citation as well as the entry in the list, rather complex interactivity, +multiple databases, datasets and renderings and of course combinations of this. +The implementation uses a mix of \TEX\ and \LUA\ code with so called setups as +rendering specifications. At the cost of complexity (and some runtime penalty) +this provides a lot of freedom and flexibility. + +% \startlines +% Hans \Name {Hagen} {H.} +% PRAGMA ADE +% Hasselt NL +% \stoplines + +\stopsubject + +\startsubject[title=How Alan got involved] + +Bibliographies and citations are of utmost importance in any scholarly work. +Nevertheless, the production of bibliography lists and the insertion of +citations, just like the production of an index, is a task that is often +postponed to a later stage in the writing of an article, a book, or a manual. +Perhaps this is because it can be more important to create than to refer, but +maybe the necessary tools are found to be insufficient or unnatural. + +A computerized typesetting system should help an author produce a text, not +impose any preset format or unnecessary constraint. In a referenced work, a +bibliography system should be flexible enough to adapt to very different styles +and practices. Creating such a system is quite a challenge. + +\CONTEXT\ \MKII\ implemented a system that was based on a use of \BIBTEX, an +external program that built upon basic bibliographic macros introduced in \LATEX. +\CONTEXT\ \MKIV\ moved away from this dependency, opening up many possibilities +for new functionality and, we hoped, providing more natural and flexible tools +for authors. For my own use, the most important of which is a very powerful +search and match mechanism that has been made possible though the use of \LUA. + +I had started by asking simple questions on details of the workings of this new +system and making \quotation{wouldn't it be nice to} requests for functionality +that I knew was somehow buried in the inner workings of \CONTEXT. As a result of +these inquiries, I got drawn into the project to make this new system a reality. + +% \startlines +% Alan \Name{Braslau}{A.} +% Paris, France +% \stoplines + +\stopsubject + +\startsubject[title=How you can be involved] + +Bibliography management is indeed one of the most complex subsystems in \CONTEXT, +and many, many design decisions had to be made during its development. +Experimental features were added, some of which were later abandoned as being +inappropriate or else superseded by some better mechanism. The effort (and time) +that we spent in reimplementing the treatment of bibliographies was much greater +than any of us had anticipated when we undertook this project. Hopefully, now the +system is stable enough to be more widely used and this manual is an attempt to +make it accessible to all users. + +There are \CONTEXT\ users who will just use whatever the bibliograpy modules +provide by default. For many, the \APA\ style is good enough; others may have +specific needs. This manual should provide insight on how to adapt the system to +new styles. But sometimes users will ask questions on the mailing list that are +not answered here. Feel free to come up with additional examples that can be +added to the test suite, or when we consider them to be of general use, to this +manual. + +\stopsubject + +\startsubject[title=Hyperlinks] + +Please note \startfootnote Footnotes are placed at the end of each chapter. +\stopfootnote that this document contains hyperlinks that are not highlighted for +aesthetic reasons. In addition to standard interaction (table of contents, index, +and cross|-|references, some external web sources are selectable. + +\stopsubject + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/publications/publications-journals.tex b/doc/context/sources/general/manuals/publications/publications-journals.tex new file mode 100644 index 000000000..0dd8a872f --- /dev/null +++ b/doc/context/sources/general/manuals/publications/publications-journals.tex @@ -0,0 +1,88 @@ +% \endinput + +\environment publications-style + +\startcomponent publications-journals + +\startchapter[title=Journals] + +An experimental feature is the ability to load a list of mapping from complete +journal names to abbreviated forms. + +\startbuffer +\btxloadjournallist[journals.txt] % the jabref list + +\btxexpandedjournal {Z. Ökol. Nat.schutz} or +\btxabbreviatedjournal{Z. Ökol. Nat.schutz} or +\btxabbreviatedjournal{Z. Ökol. Nat. schutz} +\stopbuffer + +\typeTEXbuffer \getbuffer + +In this case the text file looks like: + +\starttyping +Zeitschrift für Ökologie und Naturschutz = Z. Ökol. Nat..schutz +.... +\stoptyping + +Instead you can have a \LUA\ file that looks like: + +\startLUA +return { + ["Zeitschrift für Ökologie und Naturschutz"] = "Z. Ökol. Nat.schutz", + ... +} +\stopLUA + +or + +\startLUA +return { + { "Zeitschrift für Ökologie und Naturschutz", "Z. Ökol. Nat.schutz" }, + ... +} +\stopLUA + +A file can be saved with: + +\startTEX +\btxsavejournallist[journals.lua] +\stopTEX + +and then loaded again in a second run. For small lists it makes not much sense +to cache the lists but if you have tens thousands of journals it can be +considered. Normally loading is can be neglected compared to the run. Anyhow, +such a list looks like this: + +\startLUA +return { + ["abbreviations"]={ + ["zeitschriftfürökologieundnaturschutz"] = "Z. Ökol. Nat.schutz", + }, + ["expansions"]={ + ["zökolnatschutz"] = "Zeitschrift für Ökologie und Naturschutz", + }, +} +\stopLUA + +In the future \type {mtx-bibtex} might be able to generate such lists (once we know +what users come up with). + +You can add additional entries with: + +\startTEX +\btxaddjournal + [Zeitschrift für Ökologie und Naturschutz] + [Z. Ökol. Nat.schutz] +\stopTEX + +As usual with such mechanisms, internally spaces, punctuation and case are +ignored with a lookup. + +There are also two manipulators for journals: \type {expandedjournal} and +\type {abbreviatedjournal}. + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/publications/publications-lua.tex b/doc/context/sources/general/manuals/publications/publications-lua.tex new file mode 100644 index 000000000..3a148dca4 --- /dev/null +++ b/doc/context/sources/general/manuals/publications/publications-lua.tex @@ -0,0 +1,224 @@ +\environment publications-style + +\startcomponent publications-lua + +\startchapter[title=The \LUA\ view] + +The following is reserved for \LUA\ programmers. + +Because we manage data at the \LUA\ end it is tempting to access it there for +other purposes. This is fine as long as you keep in mind that aspects of the +implementation may change over time, although this is unlikely once the modules +become stable. + +The entries are collected in datasets and each set has a unique name. In this +document we have the set named \type {example}. A dataset table has several +fields, and probably the one of most interest is the \type {luadata} field. Each +entry in this table describes a publication. Take, for example \type +{publications.datasets.example.luadata["article"]}: + +\startluacode + context.tocontext(publications.datasets.example.luadata["article"]) +\stopluacode + +There is a companion entry in the parallel \type {details} table,\\ +\type {publications.datasets.example.details["article"]}: + +\startluacode + context.tocontext(publications.datasets.example.details["article"]) +\stopluacode + +tracking further information derived from the publication entry and its use. + +You can loop over the entries using regular \LUA\ code combined with \MKIV\ +helpers: + +\startbuffer +local dataset = publications.datasets.example + +context.starttabulate { "|l|l|l|" } +context.NC() context("tag") +context.NC() context("short") +context.NC() context("title") +context.NC() context.NR() +context.HL() +for tag, entry in table.sortedhash(dataset.luadata) do + local detail = dataset.details[tag] or { } + context.NC() context.type(tag) + context.NC() context(detail.shorthash) + context.NC() context(entry.title) + context.NC() context.NR() +end +context.stoptabulate() +\stopbuffer + +\typeLUAbuffer + +This results in: + +\ctxluabuffer + +Notice that the years in this example dataset given as \type {YYYY} are +interpreted as if they were \index {9999}\type {9999}. + +You can manipulate a dataset after loading. Of course this assumes that you know +what kind of content you have and what you need for rendering. As example we load +a small dataset. + +\startbuffer +\definebtxdataset[drumming] +\usebtxdataset[drumming][mkiv-publications.lua] +\stopbuffer + +\cindex{definebtxdataset} +\cindex{usebtxdataset} + +\typeTEXbuffer + +\getbuffer + +Because we're going to do some \LUA, we could have loaded this dataset using: + +\startTEX +\startluacode +publications.load("drumming","mkiv-publications.lua","lua") +\stopluacode +\stopTEX + +The dataset has three entries:% +\startfootnote +Gavin Harrison is in my (Hans) opinion one of the most creative, diverse and +interesting drummers of our time. It's also fascinating to watch him play and a +welcome distraction from writing code and manuals. +\stopfootnote + +\typeLUAfile{mkiv-publications.lua} + +As you can see, we can have a subtitle. As an exercise, we will combine the +title and subtitle into one: + +\startbuffer +\startluacode +local luadata = publications.datasets.drumming.luadata + +for tag, entry in next, luadata do + if entry.subtitle then + if entry.title then + entry.title = entry.title .. ", " .. entry.subtitle + else + entry.title = entry.subtitle + end + entry.subtitle = nil + logs.report("btx", + "combining title and subtitle of entry tagged %a into %a", + tag,entry.title) + end +end +\stopluacode +\stopbuffer + +\typeTEXbuffer \getbuffer + +As a hash comes in a different order each run (something that demands a lot of +care in multi|-|pass workflows that save data in between), so it is probably +better to use this instead: + +\startTEX +\startluacode +local ordered = publications.datasets.drumming.ordered + +for i=1,#ordered do + local entry = ordered[i] + if entry.subtitle then + if entry.title then + entry.title = entry.title .. ", " .. entry.subtitle + else + entry.title = entry.subtitle + end + entry.subtitle = nil + logs.report("btx", + "combining title and subtitle of entry tagged %a into %a", + entry.tag,entry.title) + end +end +\stopluacode +\stopTEX + +This loops processes in the order of definition. Alternately, one can sort by +\Index{tag}: + +\startTEX +\startluacode +local luadata = publications.datasets.drumming.luadata + +for tag, entry in table.sortedhash(luadata) do + if entry.subtitle then + if entry.title then + entry.title = entry.title .. ", " .. entry.subtitle + else + entry.title = entry.subtitle + end + entry.subtitle = nil + logs.report("btx", + "combining title and subtitle of entry tagged %a into %a", + entry.tag,entry.title) + end +end +\stopluacode +\stopTEX + +The original data is stored in a \LUA\ table, hashed by tag. Starting with \LUA\ 5.2 +each run of \LUA\ gets a different ordering of such a hash. In older versions, when you +looped over a hash, the order was undefined, but the same as long as you used the same +binary. This had the advantage that successive runs, something we often have in document +processing gave consistent results. In today's \LUA\ we need to do much more sorting of +hashes before we loop, especially when we save multi||pass data. It is for this reason +that the \XML\ tree is sorted by hash key by default. That way lookups (especially +the first of a set) give consistent outcomes. + +We can now simply typeset the entries with: + +\cindex{definebtxrendering} +\cindex{placebtxrendering} + +\startbuffer +\definebtxrendering[drumming][group=examples,dataset=drumming] +\placebtxrendering[drumming][method=dataset] +\stopbuffer + +\typeTEXbuffer \getbuffer + +Because we just want to show the entries, and have no citations that force them +to be shown, we have to set the \type {method} to \type {dataset}. + +Of course, none of these manipulations in \LUA\ are really necessary, as the +rendering could be setup as: + +\cindex {btxfetch} +\cindex {btxdoif} +\cindex {btxcomma} +\cindex {starttexdefinition} +\cindex {stoptexdefinition} + +\startTEX +\starttexdefinition btx:default:title + \btxfetch{author} + \btxdoif{subtitle} { + \btxcomma + \btxfetch{subtitle} + } +\stoptexdefinition +\stopTEX + +which is indeed the case in many of the styles (the \type {default} style uses +\Cindex {btxcolon}). \startfootnote The specifications could be modified to use a +parameter \type {inbetween={, }} for titles:subtitles that the user can easily +setup as needed. But as such style questions are, in general, well defined in the +specifications, this was not deemed necessary. \stopfootnote + +It is always a question of how much should be done in \LUA\ and how much should +be done in \TEX. In the end, it is often a question of taste. + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/publications/publications-otheruse.tex b/doc/context/sources/general/manuals/publications/publications-otheruse.tex new file mode 100644 index 000000000..43b21d9a5 --- /dev/null +++ b/doc/context/sources/general/manuals/publications/publications-otheruse.tex @@ -0,0 +1,328 @@ +\environment publications-style + +\startcomponent publications-otheruse + +\startchapter + [reference=ch:duane, + title=Other use of datasets] + +Because a bibliography is just a kind of database, you can use the publications +mechanism for other purposes as well. + +\startsection + [title=Images] + +During the re|-|implementation \name {Miklavec}{M.}Mojca came up with the +following definitions: + +\startbuffer +\startbuffer[duane] +@IMAGE {tug2013, + title = "TUG 2013", + url = "http://tug.org/tug2013/", + url_image = "http://tug.org/tug2013/tug2013-color-300.jpg", + url_thumb = "http://tug.org/tug2013/t2013-thumb.jpg", + description = "Official drawing of the TUG 2013 conference", + author = "Duane Bibby", + year = 2013, + copyright = "TUG", +} + +@IMAGE {tug2014, + title = "TUG 2014", + url = "http://tug.org/tug2014/", + url_image = "http://tug.org/art/tug2014-color.jpg", + url_thumb = "http://tug.org/tug2014/t2014-thumb.jpg", + description = "Official drawing of the TUG 2014 conference", + author = "Duane Bibby", + year = 2014, + copyright = "TUG", +} +\stopbuffer +\stopbuffer + +\typeBTXbuffer \name{Bibby}{D.}\getbuffer + +For documentation purposes we can have a definition in a buffer so that we can +show it verbatim but also load it. The following code defines a dataset, loads +the buffer and sets up a rendering. + +\startbuffer +\definebtxdataset + [duane] + +\usebtxdataset + [duane] + [duane.buffer] + +\definebtx + [duane] + [default=, + specification=duane, + authorconversion=normal] + +\definebtx + [duane:list] + [duane] + +\definebtx + [duane:list:author] + [duane:list] + +\definebtx + [duane:list:image] + [duane:list] + +\definebtxrendering + [duane] + [specification=duane, + group=duane, % so not: group=default, + dataset=duane, + method=dataset, + numbering=no, + criterium=all] + +\stopbuffer + +\cindex{definebtxdataset} +\cindex{usebtxdataset} +\cindex{definebtx} +\cindex{definebtxrendering} + +\typeTEXbuffer \getbuffer + +Instead of for instance \TEXcode {apa} we create a specification named \TEXcode +{duane}. Because categories are rendered with a setup, we can define the +following: + +\startbuffer +\startsetups btx:duane:list:image + \tbox \bgroup + \bTABLE[offset=1ex] + \bTR + \bTD[ny=4] + \dontleavehmode + \externalfigure[\btxflush{url_thumb}][width=3cm] + \eTD + \bTD \btxflush{title} \eTD + \eTR + \bTR + \bTD \btxflush{author} \eTD + \eTR + \bTR + \bTD \btxflush{description} \eTD + \eTR + \bTR + \bTD + \goto{high res variant}[url(\btxflush{url_image})] + \eTD + \eTR + \eTABLE + \egroup +\stopsetups + +\placebtxrendering[duane][criterium=all] +\stopbuffer + +\cindex{startsetups} +\cindex{stopsetups} +\cindex{placebtxrendering} +\cindex{btxflush} + +\typeTEXbuffer \getbuffer + +An alternative rendering is: + +\startbuffer +\startsetups btx:duane:list:image + \bgroup + \bTABLE[offset=1ex] + \bTR + \bTD + \dontleavehmode + \goto{\externalfigure[\btxflush{url_thumb}][width=3cm]} + [url(\btxflush{url_image})] + \eTD + \bTD + \bold{\btxflush{title}} + \blank + \btxflush{description} + \blank [3*line] + \btxflush{author} + \eTD + \eTR + \eTABLE + \egroup +\stopsetups + +\placebtxrendering[duane] +\stopbuffer + +\cindex{startsetups} +\cindex{stopsetups} +\cindex{placebtxrendering} +\cindex{btxflush} + +\typeTEXbuffer \getbuffer + +We only get the second rendering because we specified \TEXcode {criterium} as +\TEXcode {all}. Future version of \CONTEXT\ will probably provide \Index{sorting} +options and ways to plug in additional functionality. + +\stopsection + +\startsection + [title=Chemistry] + +To give further ideas on how the \quote {publications} database system can be +effectively used in a document, consider any object such as an image (as seen +above), an equation, a chemical compound, or other entity having various +properties and that might be used repeatedly. Here we will give an almost +realistic example of a dataset containing various chemical compounds. + +Like above, we shall define a named dataset and load it with definitions having +nothing to do with publications, rather a number of chemical compounds of +formula \chemical {C_6H_6O} (there are some 57 such molecules). + +\startbuffer +\definebtxdataset + [chemistry] + +\usebtxdataset + [chemistry] + [C6H6O.bib] +\stopbuffer + +\cindex{definebtxdataset} +\cindex{usebtxdataset} +\typebuffer [option=TEX] +\getbuffer + +We can visualize the contents of the dataset using, for example: + +\startbuffer +\showbtxdatasetcompleteness + [dataset=chemistry, + specification=chemistry] +\stopbuffer + +\cindex{showbtxdatasetcompleteness} +\typebuffer [option=TEX] + +Note that the specification \quote {chemistry} is undefined (as yet) so the log file shows: + +\starttyping +publications > no data definition file 'publ-imp-chemistry.lua' for 'chemistry' +\stoptyping + +This is harmless as a missing (lua) definition file makes \emphasis {all} data categories and fields +\quote {optional}, allowing their access and use. + +The dataset (containing just 4 of the 57 entries) is: + +\startparagraph [style=small] +\getbuffer +\stopparagraph + +The next step is to activate the specification and dataset and to define a list rendering, as +follows: + +\startbuffer +\setupbtx + [specification=chemistry, + dataset=chemistry] + +\definebtxrendering + [chemistry] + [specification=chemistry, + group=chemistry, + dataset=chemistry] +\stopbuffer + +\cindex{setupbtx} +\cindex{definebtxrendering} +\typebuffer [option=TEX] +\getbuffer + +This list rendering can then be placed, but first one needs to create a setup +describing how to handle the entry (or category) \type {@chemical{}} contained +in the file \type {C6H6O.bib}. As in the earlier example, we shall use a table +structure for the list text: + +\startbuffer +\startsetups btx:chemistry:list:chemical + \startframed [frame=off,location=middle] + \bTABLE [frame=off] + \bTR + \bTD [width=.2\textwidth,ny=2] + \goto + {\startchemical [scale=small] + \chemical [\btxflush{chemical}] + \stopchemical} [program(\btxflush{rendered})] + \eTD + \bTD [width=.2\textwidth] \chemical{\btxflush{formula}} \eTD + \bTD [width=.4\textwidth] \btxflush{iupac} \eTD + \eTR + \bTR + \bTD \btxflush{mw}~g/mole \eTD + \bTD \btxflush{cas} \eTD + \eTR + \eTABLE + \stopframed +\stopsetups + +\placebtxrendering [method=dataset] +\stopbuffer + +\cindex{startsetups} +\cindex{stopsetups} +\typebuffer [option=TEX] + +Note that not all fields of the dataset are used. + +\getbuffer + +The real usefulness of the dataset is the possibility of referring to entries +and the ability to extract data fields. Setups can be defined for those fields +requiring any formatting beyond a simple flushing, for example those requiring +the \Cindex {chemical} command. + +\startbuffer +\startsetups btx:chemistry:cite:formula + \chemical {\currentbtxfirst} +\stopsetups + +\startsetups btx:chemistry:cite:chemical + \startchemical [scale=600] + \chemical [\currentbtxfirst] + \stopchemical +\stopsetups + +\cite [name] [108-95-2] |<|or|>| +\cite [formula] [108-95-2] |<|or|>| +\cite [chemical] [108-95-2] |<|or|>| +\cite [molarvolume] [108-95-2] +\stopbuffer + +\cindex{startsetups} +\cindex{stopsetups} +\cindex{cite} +\typebuffer [option=TEX] +\getbuffer + +\startbuffer +\cite [name] [566-33-5] |<|or|>| +\cite [formula] [566-33-5] |<|or|>| +\cite [chemical] [566-33-5] |<|or|>| +\cite [molarvolume] [566-33-5] +\stopbuffer + +\cindex{cite} +\typebuffer [option=TEX] +\getbuffer + +\stopsection + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/publications/publications-overviews.tex b/doc/context/sources/general/manuals/publications/publications-overviews.tex new file mode 100644 index 000000000..27ec420db --- /dev/null +++ b/doc/context/sources/general/manuals/publications/publications-overviews.tex @@ -0,0 +1,42 @@ +\environment publications-style + +\startcomponent publications-overviews + +\startchapter[title=Bibliography,reference=ch:biblio] + +\setupbtx + [interaction=all] + +\setupbtxrendering + [default] + [pagestate=start, + before=, + after=] + +\placelistofpublications + +\stopchapter + +\startchapter[reference=ch:listoftables,title=List of tables] + \placelistoftables [criterium=all] +\stopchapter + +\startchapter[reference=ch:indexofauthors,title=Index of names] + \placeregister[indexofauthors] [criterium=all,compress=yes] +\stopchapter + +\startchapter[reference=ch:index,title=Index of subjects] + \placeindex [criterium=all,compress=yes] +\stopchapter + +\startchapter[title=Hashed authors] + +\start + \small + \small + \showbtxhashedauthors +\stop + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/publications/publications-performance.tex b/doc/context/sources/general/manuals/publications/publications-performance.tex new file mode 100644 index 000000000..ec358dfc9 --- /dev/null +++ b/doc/context/sources/general/manuals/publications/publications-performance.tex @@ -0,0 +1,46 @@ +\environment publications-style + +\startcomponent publications-performance + +\startchapter[title=Performance] + +The move from external \BIBTEX\ processing to internal processing has the +advantage that we stay within the same run. In the traditional approach we had +roughly the following steps: + +\startitemize[packed] +\startitem + In the first \CONTEXT\ run information is collected and written to file. +\stopitem +\startitem + fter the first run the \BIBTEX\ program converts that file to another + one, a so called \type {bbl} file with \TEX\ commands. +\stopitem +\startitem + Successive runs use that file for typesetting references and producing + lists of publications that are reffered to. +\stopitem +\stopitemize + +In the \MKIV\ approach the bibliographic database is loaded in memory each run +and processing also happens each run. On paper this looks less efficient but as +\LUA\ is quite fast, in practice performance is much better. + +Probably most demanding is the treatment of authors as we have to analyze names, +split multiple authors and reassemble firstnames, vons, surnames and juniors. +When we sort by author sorting vectors have to be made which also has a penalty. +However, in practice the user will not notice a performance degradation. We did +some tests with a list of 500.000 authors, sorted them and typeset them as list +(producing some 5400 dense pages in a small font and with small margins). This is +typical one of these cases where using \LUAJITTEX\ saves quite time. On my +machine it took just over 100 seconds to get this done. Unfortunately not all +operating systems performed equally well: 32 bit versions worked fine, but 64 bit +\LINUX\ either crashed (stalled) the machine or ran out of memory rather fast, +while \MACOSX\ and \WINDOWS\ performed fine. In practice you will never run into +this, unless you produce massive amounts of bibliographic entries. \LUAJIT\ has +some benefits but also some drawbacks. In practice you will not run into these +problems. + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/publications/publications-quick-example.tex b/doc/context/sources/general/manuals/publications/publications-quick-example.tex new file mode 100644 index 000000000..14f70960f --- /dev/null +++ b/doc/context/sources/general/manuals/publications/publications-quick-example.tex @@ -0,0 +1,16 @@ +\usebtxdataset[mkiv-publications.bib] + +\starttext + +\startbodymatter +a citation: \cite[article,book] +\stopbodymatter + +\startbackmatter + \startchapter[title=Bibliography] + \placelistofpublications + \stopchapter +\stopbackmatter + +\stoptext + diff --git a/doc/context/sources/general/manuals/publications/publications-quick.tex b/doc/context/sources/general/manuals/publications/publications-quick.tex new file mode 100644 index 000000000..930203a38 --- /dev/null +++ b/doc/context/sources/general/manuals/publications/publications-quick.tex @@ -0,0 +1,44 @@ +\environment publications-style + +\startcomponent publications-quick + +\startchapter + [reference=ch:quick, + list={Quick start}, + title={\Index{Quick start}, for the impatient}] + +\cindex{usebtxdataset} +\cindex{cite} +\cindex{placelistofpublications} + +Without \emphasis {any} explanation: + +\typeTEXfile + {publications-quick-example.tex} + +\startcombination[c=2,r=1,distance=\emwidth] + \startcontent + \typesetfile + [publications-quick-example.tex] + [width=.5\dimexpr\textwidth-\emwidth\relax,frame=on,page=1] + \stopcontent + \startcaption + bodymatter + \stopcaption + \startcontent + \typesetfile + [publications-quick-example.tex] + [width=.5\dimexpr\textwidth-\emwidth\relax,frame=on,page=2] + \stopcontent + \startcaption + backmatter + \stopcaption +\stopcombination + +This example demonstrates that the basic usage in the production of bibliography +citations and lists is rather simple. However, once the user starts asking for +particular customizations, then things can get quite complicated rather quickly. + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/publications/publications-rendering.tex b/doc/context/sources/general/manuals/publications/publications-rendering.tex new file mode 100644 index 000000000..caa1f61d7 --- /dev/null +++ b/doc/context/sources/general/manuals/publications/publications-rendering.tex @@ -0,0 +1,541 @@ +\environment publications-style + +\startcomponent publications-rendering + +\startchapter[title=Renderings,reference=ch:renderings] + +\startsection + [reference=sec:styles, + title={Generating lists of publications}] + +A list of publications can be rendered at any place in the document, and multiple +renderings can appear under certain limitations (according to \Index {scope}). +The specification introduced previously defines the style of the rendering as +well as what data it will contain. + +If you want to see what publications are in the database, the easiest way is to +ask for a complete list: + +\startbuffer +\usebtxdataset % illustrated again here + [example] % although already loaded + [mkiv-publications.bib] % in the previous chapter + +\definebtxrendering + [example] % named rendering + [apa] % parent namespace + [dataset=example, + group=examples] % group will be presented later + +\placelistofpublications % aka \placebtxrendering + [example] % rendering defined above + [method=dataset] % i.e. all entries +\stopbuffer + +\cindex{definebtxrendering} +\cindex{placelistofpublications} +\cindex{placebtxrendering} + +\typeTEXbuffer + +The commands \Cindex {placelistofpublications} (that is just a synonym for +\Cindex {placebtxrendering}) refer to a named rendering and accept a list of +options (inherited from \Cindex {setupbtxrendering}). When applied to a named +dataset (other than \TEXcode {default}), a named rendering needs to be associated +through \Cindex {definebtxrendering} as is done here. + +Note that the define shown above explicitly inherits from a rendering named +\TEXcode {apa} that was itself defined when loading the specification file. +\startfootnote The rendering parent \index {style+APA}\TEXcode {[apa]} sets the +parameters: \TEXcode {specification=apa,} \TEXcode {sorttype=authoryear,} and +\TEXcode {numbering=no,} described below. It also sets various list parameters in +a protected \TEXcode {apa} namespace to produce a \quote {hanging} bibliography +list. \stopfootnote Had this inheritance not been specified, the new rendering +would inherit default, minimal settings. This notion of inheritance will be +further illustrated later. + +The bibliography list rendering of our example dataset, following the \index +{style+APA}APA style, is: + +\getbuffer + +The rendering is a list whose appearance can be tuned, as any list in \CONTEXT. +It is somewhat more complex to manage, though, because we can have not only many +different standards but also many fields that can be set up. This means that +there are several commands involved. As we saw demonstrated above, a rendering is +defined and setup using the commands: + +\cindex{definebtxrendering} + +\showsetup{definebtxrendering} + +\cindex{setupbtxrendering} + +\showsetup{setupbtxrendering} + +A rendering is then placed using \Cindex {placebtxrendering}, a \CONTEXT\ command +that accepts the same arguments as for its setup. Using \TEXcode +{method=dataset}, as above, one renders the entire contents of the dataset. +Normally, however, one would not use this \TEXcode {method} and place only a +selection of entries that are to be used in the document, whereas the dataset may +very well contain many other, unused references. The \TEXcode {method=global} or +\TEXcode {method=local} option can be used to specify if this use is to be global +for the entire document or else local to a structure element such as a part or a +chapter. + +\cindex{placebtxrendering} + +\showsetup{placebtxrendering} + +\cindex{placelistofpublications} + +\showsetup{placelistofpublications} + +The rendering is a \TEXcode {list} and this reference list is numbered. These +numbers can be displayed, or not, depending on the bibliography style +specification through the use of the \index {numbering}\TEXcode {numbering=yes} +or \TEXcode {no} parameter values. The \index {style+APA}APA style, illustrated +above, normally does not number the bibliography list. + +The reference list is also \index {sorting}sorted, controlled by the parameter +\TEXcode {sorttype}; here \TEXcode {sorttype=authoryear}, appropriate for the +\index {style+APA}APA style, \Index {sorting} first by author list, then by +publication year, then by title, finally by page. One can sort the list in many +ways: for example \TEXcode {sorttype=index} will render the list in the order in +which it was loaded into the dataset (see \in {table} [tab:sorttype] for an +explanation of list sorting schemes). + +\startplacetable [location=force, + title={\TEXcode {sorttype=}}, + reference=tab:sorttype] +\index{sorting} +\starttabulate [|Tp(5.5em)|p(.75\textwidth)|] +\HL +\NC default\\none\\cite\\list +\NC render the list in the order in which it was built, + that is, in the order that references were selected from the dataset for + inclusion in the list. \NC \NR +\HL +\NC dataset\\index +\NC sort the list according to the dataset index, that is, in the order in that + references were added to the dataset. \NC \NR +\HL +\NC reference +\NC sort the list in alphabetical order of the citation \Index{tag}s of the + dataset. Note that all entries missing tags get assigned the dataset index as + their tag. \NC \NR +\HL +\NC key +\NC sort the list in alphabetical order of the entry field \TEXcode {key} + (traditionally used in \BIBTEX\ as an alternate sorting key). Falls back on + the dataset index if no such field is present. \NC \NR +\HL +\NC short +\NC sort the list in alphabetical order of the short tag (first three letters + of the author name or first letter of the first three authors followed by + the last two digits of the year). \NC \NR +\HL +\NC authoryear +\NC sort the list in alphabetical order of the authors (or editors or publisher), + then by publication year, then by title (or by journal and volume) and + finally by page. \NC \NR +\stoptabulate +\stopplacetable + +As a concrete example, the rendering named \TEXcode {example} above inherits from +the rendering instance named \TEXcode {apa} that is defined in the specification +file as: + +\cindex{definebtxrendering} + +\startTEX +\definebtxrendering + [apa] + [specification=apa, + sorttype=authoryear, + numbering=no] +\stopTEX + +\startaside +A more subtle characteristic of renderings is that one generally would not want a +bibliography list to appear redundantly in a document as that would be confusing, +unless of course it is desired that elements of the list reappear in later lists, +for example when placing partial bibliographies at the end of each chapter and a +complete bibliography list at the end of a book. One must specify \TEXcode +{repeat=yes} in order to get multiple renderings of a bibliography list; +otherwise, as they appear, entries get marked as placed and will be inhibited +from being placed again elsewhere. +\stopaside + +All renderings of bibliography lists such as the one shown earlier in this +section also depend on a set of general list parameters that apply to each +individual entry (a cited publication), as for any list item in \CONTEXT. These +can be adjusted through the command \Cindex {setupbtxlist} (further described in +\in {section} [sec:list], below). As an example, the \TEXcode {apa} specification +file includes: + +\cindex{setupbtxlist} + +\startTEX +\setupbtxlist + [apa] + [alternative=paragraph, + width=fit, + distance=.5em, + margin=3em] +\stopTEX + +Such settings (yielding a hanging list that would be inappropriate with a +numbered bibliography list) get inherited from the \TEXcode {apa} namespace in +the rendering that we named \TEXcode {example} above. + +Let's try a new example (using a file taken from the \index {TUG bibliography +archive}\goto {TUG bibliography archive} +[url(http://ftp.math.utah.edu/pub/tex/bib/index.html)]): \startfootnote \index +{template.bib} The file \TEXcode {template-clean.bib} is simply a copy of \TEXcode +{template.bib} that has been cleaned|-|up to remove the empty entries. +\stopfootnote + +\startbuffer +\definebtxdataset[template] +\usebtxdataset [template][template-clean.bib] + +\loadbtxdefinitionfile[aps] +\definebtxrendering + [template] + [aps] + [dataset=template, + group=examples] + +\placelistofpublications + [template] + [method=dataset] +\stopbuffer + +\cindex{definebtxdataset} +\cindex{usebtxdataset} +\cindex{loadbtxdefinitionfile} +\cindex{definebtxrendering} +\cindex{placelistofpublications} + +\typeTEXbuffer + +Here, the new rendering is defined to inherit explicitly from a rendering named +\index {style+APS}\TEXcode {aps} (whose specification is loaded but not activated +here). Notice, in particular, compared to the previous rendering example, that +the list is numbered and that there is no hanging margin (it uses the standard +list \TEXcode {alternative=b}): + +\getbuffer + +The \Index {numbering} of the references are unique and pick|-|up from where the +previous numbering stops (the first example contains 33 references, although this +numbering is not displayed). This behavior can be \TEXcode {method=global} for +the entire document, or else \TEXcode {method=local}, limited to a structural +element such as a chapter or a part. Furthermore, one can associate renderings +into particular number groups, effectively isolating them from any other +renderings. For example, as seen above in the rendering definitions, the present +manual uses: + +\cindex{setupbtxrendering} + +\startTEX +\setupbtxrendering[example] [group=examples] +\setupbtxrendering[template][group=examples] +\stopTEX + +thus setting the numbering of the group \TEXcode {examples} apart from the +numbering of the dataset \TEXcode {default} and its named rendering (which contains +this manual's own bibliography, to be placed later, on \at {page} [ch:biblio]). + +\stopsection + +\startsection + [reference=sec:styles, + title={Rendering styles, or more on specifications}] + +The default rendering style implemented in the \MKII\ module was loosely based on +the \index {style+APA}APA standard. In contrast, we made a design choice in the +present \MKIV\ system to provide a very minimal \TEXcode {default} style, and one +should not expect much from this default: in fact, it only recognizes \type +{article} and \type {book} entries (see the bibliography on \at {page} +[ch:biblio]). A user requiring a more complete rendering will want to explicitly +load and activate another style file. One such complete specification, +illustrated above and appropriately named \index {style+APA}\TEXcode {apa}, is +described in the \cite [title] [default::APA2010]. \cite [num] +[default::APA2010] + +\startaside +\emphasis {A note on the \index {style+APA}APA style:} We get the strong +impression that the APA bibliography style standard was made with the implicit +assumption that manual intervention would be involved in the editing and +production process; It has been an arduous task to create a system capable of +fully conforming to these specifications. + +Furthermore, we note that it has sometimes been argued that a numbered citation +system and bibliography list is supposedly superior to the author|-|year scheme +as is employed in the \index {style+APA}APA style (amongst others); indeed, +handling numbered citations is certainly much easier from the point of view of +the programmer of an automated typesetting system such as \TEX. Yet many find +that the longer author|-|year citations can be of great use to the reader (as +well as the writer) so we take no stand in this debate and provide both +possibilities. + +We have made (and continue to make) a great effort to scrupulously respect the +\index {style+APA}APA style in the so|-|named rendering. Yet be warned that very +few editors and publishers in fact follow this style exactly so some +customization will always be required. +\stopaside + +In addition to the APA specification, there are many prescribed styles to render +bibliographic descriptions that can be programmed as standards. Alternatives to +\index {style+APA}\TEXcode {specification=apa} might be \index +{style+MLA}\TEXcode {mla}, \index {style+Chicago}\TEXcode {chicago}, \index +{style+Harvard}\TEXcode {harvard}, \index {style+IEEE}\TEXcode {ieee}, \index +{style+APS}\TEXcode {aps} (commonly used in the physical sciences), \index +{style+Vancouver}\TEXcode {vancouver} (used in the biological sciences), or many +others. At this time, we only provide two description files, with \index +{style+APS}\TEXcode {aps} being an example\startfootnote The \index +{style+APS}APS style attempts to be very compact, providing complete yet minimal +information, in contrast to the \index {style+APA}APA style which is rather +verbose. \stopfootnote of a number|-|based rather than an authoryear|-|based +scheme; more style schemes may be added in the future and the customization of a +rendering style will be described in a later chapter. + +The rendering style usually also implies a particular bibliography list \Index +{sorting} scheme as well as the use of a particular citation style. Indeed, the +rendering of bibliography lists and references to it are intimately coupled. This +question will be explained a bit later. The \index {style+APA}APA style, for +example, specifies that the bibliography list be sorted by author and then by +year, then by title. The list is not numbered (references are cited by author and +year). Note, however, as can be seen from the two examples shown above that the +references were indeed assigned numbers even though they are not displayed in the +\index {style+APA}\TEXcode {apa} rendering (the user can easily choose to display +these numbers, if desired). + +\stopsection + +\startsection + [list={Bibliography list scope}, + title={Bibliography list \Index{scope}}] + +A single dataset can by used with multiple renderings. Although these renderings +may illustrate different styles (as here for the purpose of demonstration in a +manual on bibliographies), this would not be a coherent choice for a document +that would normally employ a single bibliography style. + +The most obvious use of multiple renderings (employing a single specification) is +the placement of bibliography lists localized by structure elements: parts, +chapters in a book, sections, etc. through the option \TEXcode +{criterium=chapter}, for example. This can be setup using: + +\cindex{setupbtxrendering} + +\startTEX +\setupbtxrendering + [default] + [repeat=yes, + continue=yes, + method=global] +\stopTEX + +followed at the end of each chapter by + +\cindex{placelistofpublications} + +\startTEX +\placelistofpublications + [criterium=chapter] +\stopTEX + +The numbering might alternately be made local through the option \TEXcode +{method=local}. If desired, the reference numbers can also get prefixed: + +\cindex{setupbtxlist} + +\startTEX +\setupbtxlist + [default] + [prefix=yes, + width=1cm] +\stopTEX + +A bibliography list rendering placed at a single location, at the end of a book, +for example, can also be easily split into structural parts. The following code +(given without any explanation) illustrates this idea nicely: + +\cindex{placelistofpublications} + +\startTEX +\startbackmatter + \startchapter [title=Bibliography,number=no,incrementnumber=no] + \startsubject [title=Introduction] + \placelistofpublications + [criterium=reference,reference=introduction] + \stopsubject + \dorecurse{12} { + \startsubject [title={Chapter #1}] + \placelistofpublications + [criterium=bodypart:chapter,reference=#1] + \stopsubject + } + \stopchapter +\stopbackmatter +\stopTEX + +Note, as the above demonstrates, that the list of bibliography citations for +\emphasis {any} referenced structural element can be placed \emphasis {anywhere} +in the document, not simply within the structural element itself. + +\stopsection + +\startsection[title=Language] + +Bibliography lists (and citations in the text, see below) are rendered in the +language of the document (\Cindex {mainlanguage}). However, a bibliography entry +can contain a \TEXcode {language=} field and this can be used (if present), +depending on the specification, in the rendering and hyphenation of the \TEXcode +{title}, for example. + +One might choose to override this behavior and impose a single language for all +bibliography entries (as well as for all other \CONTEXT\ constructs) using +\Cindex {setupdelimitedtext} \TEXcode {[language=global]}. + +Since this directive is general for all delimited text in \CONTEXT\ and is not +specific to bibliographies, one can apply it to force a particular language +within a unique section, as in: + +\cindex{setupdelimitedtext} +\cindex{placelistofpublications} + +\startTEX +\startsection[title=Bibliografía] + \setupdelimitedtext[language=es] + \placelistofpublications +\stopsection +\stopTEX + +% to Hans: This currently does not work! +% to Alan: I need an example! + +The language setting also influences the sorting of \UTF\ strings, in particular +authors and titles. + +\cindex {setupdelimitedtext} +\showsetup[setupdelimitedtext] + +\startplacetable [title={\cindex{setupdelimitedtext}\TEXcode{\setupdelimitedtext[language=…]}}] + \starttabulate [|Tl|p(.7\textwidth)|] + \NC language= \NC \NC \NR + \HL + \NC {\it<blank>} \NC (the default) use the current active language; \NC \NR + \NC local \NC respect local language directives (such as the + entry's \TEXcode {language={…},} field, if present + and managed by the rendering specification) \NC \NR + \NC global \NC impose the main document language; \NC \NR + \NC en, de, nl, + \unknown \NC impose the specified language. \NC \NR + \HL + \stoptabulate +\stopplacetable + +\startsubsubject[title=Translated titles] + +Going beyond this handling of punctuation, labels and sorting, we have also +introduced an entirely new feature, allowing for dataset entries to contain +fields describing translated titles, for example. This is particularly useful +when including citations to references published in languages other than the +document language. + +Below is an example including \emphasis{three} languages: \startfootnote In this +reference, the \TEXcode {title} and the \TEXcode {booktitle} are in different +languages and the \TEXcode {language = {french},} field refers to the cited text. +Both titles would have been rendered using French hyphenation rules had this not +been overridden by including the switch \TEXcode {\de} that otherwise should be +avoided in a database. The solution used here is sloppy, but fortunately, a +complicated situation such as this is not very common. +\stopfootnote + +% We could have +% booktitle:de = {Die ...}, +% +% but what simple logic could be used to indicate choosing this title? +% The present case could, perhaps should, have language = {german}, but this +% would simply switch the problem to title = {\fr Principes ...}, + +\startbuffer +\startbuffer[leibniz] +@INCOLLECTION{Leibniz1885, + author = {Leibniz, G. W.}, + title = {Principes de la nature et de la grâce fondés en raison, 1714}, + title:en = {Principles of Nature and Grace Founded in Reason}, + booktitle = {\de Die Philosophischen Schriften von Gottfried Wilhelm Leibniz}, + booktitle:en = {The Philosophical Writings of Gottfried Wilhelm Leibniz}, + editor = {Gerhardt, C. G.}, + publisher = {Weidmann}, + year = {1885}, + volume = {6}, + chapter = {8}, + pages = {598–606}, + address = {Berlin}, + language = {french}, +} +\stopbuffer +\stopbuffer + +\typeTEXbuffer \getbuffer + +\startbuffer +\usebtxdataset [leibniz][leibniz.buffer] +\definebtxrendering[leibniz][apa][group=examples,dataset=leibniz] +\placebtxrendering [leibniz][method=dataset] +\stopbuffer + +with + +\typeTEXbuffer + +that gets rendered as: + +\getbuffer + +In the \index {style+APA}APA bibliography style, the original reference title is +listed followed by the translated title (within square brackets), the translation +chosen being that of the \Cindex {mainlanguage} of the document (if present in +the entry, of course). In other bibliography styles, this feature might not be +implemented or may be ignored. + +\stopsubsubject + +\startsubsubject + [title=Multilingual bibliographies] + +The present handling of languages is only the beginning, and these features will +be developed further in the future: multilingual typesetting being one of the +great strengths behind \CONTEXT. + +\stopsubsubject + +\stopsection + +\startsection + [title=Page index] + +The list renderings can also include a page index of citations to each entry. +This can be enabled using the parameter \TEXcode {pagestate}: + +\cindex{setupbtxrendering} + +\startTEX +\setupbtxrendering [pagestate=start] +\stopTEX + +As this is more of a subject related to the citation mechanism, it will be +described in the following chapter (see \in {section} [sec:index], \at {p.} +[sec:index]). + +\stopsection + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/publications/publications-style.tex b/doc/context/sources/general/manuals/publications/publications-style.tex new file mode 100644 index 000000000..2e0937887 --- /dev/null +++ b/doc/context/sources/general/manuals/publications/publications-style.tex @@ -0,0 +1,359 @@ +\startenvironment publications-style + +\startmode[atpragma] + \usemodule[scite] % gives the default lexing +\stopmode + +\dontcomplain + +\setupbodyfont + [dejavu,10pt] + +\definecolor[fore:one] [darkmagenta] +\definecolor[fore:two] [darkcyan] +\definecolor[fore:three][darkyellow] + +% \definecolor[back:one][.85(darkblue,white)] +% \definecolor[back:two][.85(darkcyan,white)] +\definecolor[back:one] [.90(darkyellow,white)] +\definecolor[back:two] [.90(darkyellow,white)] +\definecolor[back:three][.90(darkblue,white)] + +\setuphead + [chapter] + [header=high, + style=\bfc] + +\setuphead + [section,subject] + [style=\bfb] + +\setuphead + [subsection,subsubject] + [style=\bfa] + +\setuphead + [chapter,section,subject,subsection,subsubject] + [color=fore:one] + +\setupheader + [color=fore:one] + +\setuplayout + [topspace=1.5cm, + bottomspace=1cm, + width=middle, + height=middle] + +\setupfootertexts + [pagenumber] + +\setupheadertexts + [chapter] + +\setupnotes + [location=none] + +\setupnotation + [way=bychapter] + +\startsetups chapter:after + \ifcase\rawcountervalue[footnote]\relax + \or + \startsubject[title=Footnote] + \placefootnotes + \stopsubject + \else + \startsubject[title=Footnotes] + \placefootnotes + \stopsubject + \fi +\stopsetups + +\setuphead + [chapter] + [aftersection=\setups{chapter:after}] + +\setupwhitespace + [big] + +% All this syntax highlighting doesn't look good but Alan likes it, so: + +\ifdefined\scitebuffer + + \definetype [BTXcode] [option=bibtex] + \definetype [XMLcode] [option=xml] + \definetype [TEXcode] [option=tex] + \definetype [LUAcode] [option=lua] + \definetype [MPcode] [option=mps] + + \definetyping[BTX] [option=bibtex] + +\else + + \definetype [BTXcode] [option=,color=fore:two] + \definetype [XMLcode] [option=,color=fore:two] + \definetype [TEXcode] [option=,color=fore:two] + \definetype [LUAcode] [option=,color=fore:two] + \definetype [MPcode] [option=,color=fore:two] + + \definetyping[BTX] [option=,color=fore:two] + + \setuptyping [BTX] [option=,color=fore:one] + \setuptyping [XML] [option=,color=fore:one] + \setuptyping [TEX] [option=,color=fore:one] + \setuptyping [LUA] [option=,color=fore:one] + \setuptyping [MP] [option=,color=fore:one] + +\fi + +\setuptype + [option=, + color=fore:two] + +\setuptyping + [option=, + color=fore:one] + +\setuptyping + [keeptogether=yes] + +% \setupinteraction +% [state=start, +% style=bold, +% color=fore:two, +% contrastcolor=fore:two] + +\setupinteraction + [state=start, + style=, + color=, + contrastcolor=] + +\setupalign + [verytolerant] + +\definehighlight + [emphasis] + [style=italic] + +% This bit of MP magic keeps the text aligned and puts the left frame in the margin. + +\startuseMPgraphic{mpos:region:aside} + for i=1 upto nofmultipars : + multipars[i] := multipars[i] leftenlarged ExHeight ; + endfor ; + draw_multi_pars ; + draw_multi_side ; +\stopuseMPgraphic + +\definetextbackground + [framedbg] + [location=paragraph, + before=\blank, + after=\blank, + mp=mpos:region:aside, + topoffset=.5ex, + leftoffset=0pt, + rightoffset=1ex, + bottomoffset=.5ex, + frame=off, + leftframe=on, + frameoffset=1ex, + rulethickness=2pt, + framecolor=fore:two, + background=color, + backgroundcolor=back:two] + +\definetextbackground + [aside] + [framedbg] + [framecolor=fore:one, + backgroundcolor=back:one] + +\setupbtxrendering + [before={\startframedbg\blank[disable]}, + after={\blank[back]\stopframedbg}] + +% HH: low level, no high level switch (yet): + +\setnewconstant\kindofpagetextareas 1 + +\defineregister + [indexofauthors] + +\definebtxregister + [authors] + [field=author, + register=indexofauthors, + method=always, + dataset={default,tugboat,boekplan}, + alternative=invertedshort] + +% the \textbackslash variant doesn't always work out well with inline verbatim as \tt is +% something else .. also, following that by some arguments in \type is messy +% +% bad: \cindex {cite}\TEXcode{\cite[field][tag]} + +\define [1] \Index {\index {#1}#1} +\define [1] \tindex{\index [#1]{\tt#1}} +\define [1] \Tindex{\tindex{#1}{\tt#1}} +\define [1] \cindex{\expanded{\index [#1]{\TEXcode{\expandafter\string\csname#1\endcsname}}}} % bah +\define [1] \Cindex{\expanded{\cindex{#1}{\TEXcode{\expandafter\string\csname#1\endcsname}}}} % bah + +% hm + +\define [2] \name {\btxregisterauthor{#1 #2}\indexofauthors{#1, #2}} +\define [2] \Name {\name{#1}{#2}#1} + +\setupnote + [footnote] + [next={ }] % Why should this be necessary? + +\setupfloat + [table] + [default={here,force}] + +\setupcaption + [table] + [location=top] + +\setuplist + [table] + [interaction=all, + alternative=c] + +\usemodule[abr-02] +\usemodule[set-11] + +\logo [BibTeX] {Bib\TeX} + +\startmode[export] + + \setupbackend + [export=yes]%, + + % \setupexport + % [hyphen=yes, + % width=60em] + + \setuptagging + [state=start] + + % HH: bah: + + \setupinteraction [option=bookmark] + \setupinteractionscreen [option=bookmark] + \placebookmarks [chapter,title,section,subsection] + +\stopmode + +\setupinteraction + [title={\documentvariable{title}}, + subtitle={\documentvariable{subtitle}}, + author={\documentvariable{author}}] + +\usemodule[setups-basics] + +\loadsetups[i-context] + +% \setupframedtext +% [setuptext] +% [rulethickness=2pt, +% framecolor=fore:three, +% leftframe=on, +% frame=off, +% width=\dimexpr\hsize\relax, +% background=color, +% backgroundcolor=back:three] + +\definetextbackground + [mysetuptext] + [framedbg] + [framecolor=fore:three, + topoffset=1ex, + bottomoffset=1ex, + backgroundcolor=back:three] + +\startsetups xml:setups:start + \starttextbackground[mysetuptext] +\stopsetups + +\startsetups xml:setups:stop + \stoptextbackground +\stopsetups + +% Since this is a manual about bibliographies, let us use citations... + +\startbuffer [bibliography] +@Book{Ierusalimschy2006, + author = {Ierusalimschy, R.}, + title = {Programming in Lua}, + year = {2006}, + publisher = {Lua.org}, + isbn = {8590379817}, + url = {http://www.lua.org/pil/contents.html}, +} + +@Book{APA2010, + title = {Publication Manual of the American Psychological Association}, + year = {2010}, + edition = {Sixth}, + address = {Washington, DC}, + publisher = {American Psychological Association}, + note = {291 pages}, + ISBN = {1-4338-0559-6 (hardcover)}, + url = {http://www.apa.org/books/}, +} + +@Article{Patashnik1988, + title = {Bib\TEX ing}, + author = {Patashnik, Oren}, + year = {1988}, + month = {February}, + day = {8}, + url = {https://www.ctan.org/tex-archive/biblio/bibtex/base/btxdoc..pdf}, +} + +@Article{Markey2009, + title = {Tame the BeaST}, + subtitle = {The B to X of Bib\TEX}, + author = {Markey, Nicolas}, + year = {2009}, + month = {October}, + day = {11}, + url = {http://tug.ctan.org/info/bibtex/tamethebeast/ttb_en.pdf}, +} + +@Book{vanLeunen1992, + title = {A Handbook for Scholars}, + author = {van Leunen, Mary-Claire}, + year = {1992}, + edition = {revised}, + publisher = {Oxford University Press}, + address = {New York}, +} + +@BOOK{Darwin1859, + author = {Darwin, C.}, + year = {1859}, + title = {On the Origin of Species by Means of Natural Selection, or The Preservation + of Favoured Races in the Struggle for Life}, + publisher = {John Murray}, + address = {London} +} +\stopbuffer + +\usebtxdataset + [bibliography.buffer] + +% also used: + +%\definebtxdataset +% [tugboat] + +%\usebtxdataset +% [tugboat] +% [tugboat.bib] + +\stopenvironment diff --git a/doc/context/sources/general/manuals/publications/publications-titlepage.tex b/doc/context/sources/general/manuals/publications/publications-titlepage.tex new file mode 100644 index 000000000..dfc53419a --- /dev/null +++ b/doc/context/sources/general/manuals/publications/publications-titlepage.tex @@ -0,0 +1,39 @@ +\environment publications-style + +\startcomponent publications-titlepage + +\startMPpage + + StartPage ; + + picture pic ; pic := image ( + path pth ; pth := ((0,0) for i=1 step 2 until 20 : -- (i,1) -- (i+1,0) endfor) ; + for i=0 upto 9 : draw pth shifted (0,2*i) ; endfor ; + ) ; + + picture btx ; btx := textext("\ssbf\WORDS{\getvariable{document}{title}}") ; + picture ctx ; ctx := textext("\ssbf\WORDS{\getvariable{document}{subtitle}}") ; + picture dtx ; dtx := textext("\ssbf \getvariable{document}{author}") ; + + pic := pic shifted - llcorner pic ; + btx := btx shifted - llcorner btx ; + ctx := ctx shifted - llcorner ctx ; + dtx := dtx shifted - llcorner dtx ; + + pic := pic xysized (PaperWidth,PaperHeight) ; + btx := btx xsized (2PaperWidth/3) shifted (.25PaperWidth,.225PaperHeight) ; + ctx := ctx xsized (2PaperWidth/3) shifted (.25PaperWidth,.150PaperHeight) ; + dtx := dtx xsized (2PaperWidth/3) shifted (.25PaperWidth,.075PaperHeight) ; + + fill Page withcolor \MPcolor{fore:two} ; + + draw pic withcolor \MPcolor{fore:one} ; + draw btx withcolor \MPcolor{lightgray} ; + draw ctx withcolor \MPcolor{lightgray} ; + draw dtx withcolor \MPcolor{lightgray} ; + + StopPage ; + +\stopMPpage + +\stopcomponent diff --git a/doc/context/sources/general/manuals/publications/publications-tracing.tex b/doc/context/sources/general/manuals/publications/publications-tracing.tex new file mode 100644 index 000000000..1c97c715d --- /dev/null +++ b/doc/context/sources/general/manuals/publications/publications-tracing.tex @@ -0,0 +1,108 @@ +\environment publications-style + +\startcomponent publications-tracing + +\startchapter + [title=Tracing] + +There are several tracing options. If you want to see where a citations refers to +and where a list entry point back to, you can say: + +\startTEX +\enabletrackers[publications.crosslinks] +\stopTEX + +This injects markers in both places. One list entry can point to multiple +citations. The other tracers a more for debugging and can generate lots of +messages. + +\startTEX +publications +publications.authorhash +publications.cite +publications.cite.missing +publications.cite.references +publications.detail +publications.duplicates +publications.match +publications.setups +publications.sorters +publications.suffixes +\stopTEX + +You can also trace the databases. Take this one: + +\startbuffer +\startbuffer[phony] +@comment { warning : + Hello Allan! + How are you doing today? +} + +@CoMMeNT { message : + Hello Allan! + How are you doing today? +} + +@comment { + all kind of crap +} + +@Article{Myarticle, + Title = {My title}, + Author = {Myself, Me}, + Journal = {My favorite journal}, + Year = {2014}, + Pages = {1}, +} + +@Foo{foo, + Goo = goo, +} +\stopbuffer +\stopbuffer + +\typeBTXbuffer \getbuffer + +\startbuffer +\usebtxdataset [phony] [phony.buffer] +\stopbuffer + +When we load this database (buffer) with: + +\typeTEXbuffer \getbuffer + +We get this on the console and in the log + +\starttyping +publications > adding bib data to set 'phony' from source 'phony' +publications > phony > warning : Hello Allan! +publications > phony > warning : How are you doing today? +publications > phony > message : Hello Allan! +publications > phony > message : How are you doing today? +\stoptyping + +You can use this feature to add warnings to your database for entries that you +need to check. + +You can also use comment to hide entries: + +\startBTX +@comment { + + @article{Hobby1999, + author = {Hobby, John D.}, + year = {1999}, + title = {Introduction to MetaPost}, + journal = {Eutupon}, + volume = {2}, + month = {April}, + pages = {39-53}, + } + +} +\stopBTX + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/publications/template-clean.bib b/doc/context/sources/general/manuals/publications/template-clean.bib new file mode 100644 index 000000000..7537362e6 --- /dev/null +++ b/doc/context/sources/general/manuals/publications/template-clean.bib @@ -0,0 +1,419 @@ +%%% ==================================================================== +%%% BibTeX-file{ +%%% author = "BibNet", +%%% version = "1.01", +%%% date = "06 April 1995", +%%% time = "10:40:31 MST", +%%% filename = "template.bib", +%%% address = "Center for Scientific Computing +%%% Department of Mathematics +%%% University of Utah +%%% Salt Lake City, UT 84112 +%%% USA +%%% and +%%% Utah Supercomputing Institute +%%% University of Utah +%%% Salt Lake City, UT 84112 +%%% USA", +%%% telephone = "+1 801 581 5254", +%%% FAX = "+1 801 581 4148", +%%% checksum = "50833 419 1409 11712", +%%% email = "bibnet at math.utah.edu (Internet)", +%%% codetable = "ISO/ASCII", +%%% keywords = "BibTeX, template", +%%% supported = "yes", +%%% docstring = "This file contains empty sample BibTeX entry +%%% templates, and one filled-in example of each. +%%% +%%% The checksum field above contains a CRC-16 +%%% checksum as the first value, followed by the +%%% equivalent of the standard UNIX wc (word +%%% count) utility output of lines, words, and +%%% characters. This is produced by Robert +%%% Solovay's checksum utility.", +%%% } +%%% ==================================================================== + +% @Article{, +% author = "", +% title = "", +% journal = "", +% year = "", +% OPTvolume = "", +% OPTnumber = "", +% OPTpages = "", +% OPTmonth = "", +% OPTnote = "", +% bibdate = "Thu Feb 10 16:53:42 1994", +% } +% +% @Booklet{, +% title = "", +% OPTauthor = "", +% OPThowpublished = "", +% OPTaddress = "", +% OPTmonth = "", +% OPTyear = "", +% OPTnote = "", +% bibdate = "Thu Feb 10 16:53:33 1994", +% } +% +% @Book{, +% author = "", +% title = "", +% publisher = "", +% year = "", +% ISBN = "", +% LCCN = "", +% OPTeditor = "", +% OPTvolume = "", +% OPTnumber = "", +% OPTseries = "", +% OPTaddress = "", +% OPTedition = "", +% OPTmonth = "", +% OPTnote = "", +% OPTpages = "", +% OPTprice = "", +% OPTacknowledgement = "", +% bibdate = "Thu Feb 10 16:53:36 1994", +% } +% +% @InBook{, +% author = "", +% title = "", +% chapter = "", +% publisher = "", +% year = "", +% ISBN = "", +% LCCN = "", +% OPTeditor = "", +% OPTvolume = "", +% OPTnumber = "", +% OPTseries = "", +% OPTaddress = "", +% OPTedition = "", +% OPTmonth = "", +% OPTtype = "", +% OPTnote = "", +% OPTpages = "", +% OPTprice = "", +% OPTacknowledgement = "", +% bibdate = "Thu Feb 10 16:52:57 1994", +% } +% +% @InCollection{, +% author = "", +% title = "", +% booktitle = "", +% publisher = "", +% year = "", +% ISBN = "", +% LCCN = "", +% OPTeditor = "", +% OPTvolume = "", +% OPTnumber = "", +% OPTseries = "", +% OPTtype = "", +% OPTchapter = "", +% OPTaddress = "", +% OPTedition = "", +% OPTmonth = "", +% OPTnote = "", +% OPTpages = "", +% OPTprice = "", +% OPTacknowledgement = "", +% bibdate = "Thu Feb 10 16:52:36 1994", +% } +% +% @InProceedings{, +% author = "", +% title = "", +% booktitle = "", +% year = "", +% ISBN = "", +% ISBN = "", +% OPTeditor = "", +% OPTvolume = "", +% OPTnumber = "", +% OPTseries = "", +% OPTorganization = "", +% OPTpublisher = "", +% OPTaddress = "", +% OPTmonth = "", +% OPTnote = "", +% OPTpages = "", +% OPTprice = "", +% bibdate = "Thu Feb 10 16:53:46 1994", +% } +% +% @Manual{, +% title = "", +% OPTauthor = "", +% OPTorganization = "", +% OPTaddress = "", +% OPTedition = "", +% OPTyear = "", +% OPTmonth = "", +% OPTnote = "", +% bibdate = "Thu Feb 10 16:53:17 1994", +% } +% +% @MastersThesis{, +% author = "", +% title = "", +% school = "", +% year = "", +% OPTaddress = "", +% OPTmonth = "", +% OPTnote = "", +% OPTtype = "", +% bibdate = "Thu Feb 10 16:53:30 1994", +% } +% +% @Misc{, +% OPTauthor = "", +% OPTtitle = "", +% OPThowpublished = "", +% OPTyear = "", +% OPTmonth = "", +% OPTnote = "", +% bibdate = "Thu Feb 10 16:52:31 1994", +% } +% +% @Periodical{, +% key = "", +% title = "", +% OPTeditor = "", +% OPTorganization = "", +% OPTvolume = "", +% OPTnumber = "", +% OPTpages = "", +% OPTmonth = "", +% OPTyear = "", +% OPTISSN = "", +% OPTpublisher = "", +% OPTaddress = "", +% OPThowpublished = "", +% OPTnote = "", +% OPTkeywords = "", +% bibdate = "Thu Feb 10 16:52:20 1994", +% } +% +% @PhdThesis{, +% author = "", +% title = "", +% school = "", +% year = "", +% OPTaddress = "", +% OPTmonth = "", +% OPTtype = "", +% OPTnote = "", +% bibdate = "Thu Feb 10 16:53:28 1994", +% } +% +% @Proceedings{, +% title = "", +% year = "", +% ISBN = "", +% OPTeditor = "", +% OPTvolume = "", +% OPTnumber = "", +% OPTseries = "", +% OPTpublisher = "", +% OPTorganization = "", +% OPTaddress = "", +% OPTmonth = "", +% OPTnote = "", +% OPTpages = "", +% OPTacknowledgement = "", +% bibdate = "Thu Feb 10 16:53:13 1994", +% } +% +% @TechReport{, +% author = "", +% title = "", +% institution = "", +% year = "", +% OPTtype = "", +% OPTnumber = "", +% OPTaddress = "", +% OPTmonth = "", +% OPTnote = "", +% bibdate = "Thu Feb 10 16:53:24 1994", +% } +% +% @Unpublished{, +% author = "", +% title = "", +% note = "", +% OPTyear = "", +% OPTmonth = "", +% bibdate = "Thu Feb 10 16:52:27 1994", +% } + +%%====================================================================== +@String{inst-mit = "Massachusetts Institute of Technology"} + +@String{j-SPE = "Soft{\-}ware\emdash Prac{\-}tice and Experience"} + +@String{pub-ADOBE = "{Adobe Systems Incorporated}"} +@String{pub-ADOBE:adr = "1585 Charleston Road, P.~O. Box 7900, Mountain + View, CA 94039-7900, USA, Tel: (415) 961-4400"} +@String{pub-CUP = "Cambridge University Press"} +@String{pub-CUP:adr = "New York"} +@String{pub-CURSCI = "Current Science"} +@String{pub-CURSCI:adr = "34--42 Cleveland Street, London, UK"} + +@String{pub-PH = "Pren{\-}tice-Hall"} +@String{pub-PH:adr = "Englewood Cliffs, NJ 07632, USA"} + +@Article{Chen:1988:IPP, + author = "Pehong Chen and Michael A. Harrison", + title = "Index Preparation and Processing", + journal = j-SPE, + year = "1988", + volume = "19", + number = "9", + pages = "897--915", + month = sep, + note = "The {\LaTeX} text of this paper is included in the + {\tt makeindex} software distribution.", +} + +@Book{Kahaner:1989:NMS, + author = "David Kahaner and Cleve Moler and Stephen Nash", + title = "Numerical Methods and Software", + publisher = pub-PH, + address = pub-PH:adr, + year = "1989", + ISBN = "0-13-627258-4", + LCCN = "TA345 .K341 1989", + pages = "xii + 495", + bibdate = "Wed Dec 15 10:35:43 1993", +} + +@InBook{Fletcher:1987:PMO, + author = "R. Fletcher", + title = "Practical Methods of Optimization", + chapter = "8.7~: {P}olynomial time algorithms", + pages = "183--188", + publisher = "John Wiley~\&~Sons", + address = "New York", + edition = "second", + year = "1987", +} + +@InCollection{Johnson:1987:LDT, + author = "Steven C. Johnson and Michael E. Lesk", + title = "Language Development Tools", + booktitle = "{UNIX} System Readings and Applications", + publisher = pub-PH, + address = pub-PH:adr, + year = "1987", + pages = "245--265", + note = "Reprinted from {T}he {B}ell {S}ystem {T}echnical + {J}ournal, 1978", +} + +@InProceedings{Gray:1988:GLA, + author = "Robert W. Gray", + title = "$\gamma$-{GLA}\emdash A Generator for Lexical + Analyzers that Programmers Can Use", + booktitle = "Summer USENIX '88", + year = "1988", + pages = "147--160", + month = jun # " 20--24", +} + +@Manual{Adobe:1990:ATF, + author = pub-ADOBE, + title = "Adobe Type 1 Font Format", + organization = pub-ADOBE, + address = pub-ADOBE:adr, + year = "1990", + month = mar, + partnumber = "LPS0064", +} + +@Mastersthesis{Adams:1986:DFL, + title = "A Dialogue of Forms: Letters and Digital Font Design", + author = "Debra Anne Adams", + year = "1986", + month = sep, + school = inst-mit, + address = "MIT Microreproduction Lab, 77 Massachusetts Avenue, + room 014-0551, Cambridge, MA 02139. \$46.35", + comments = "Deriving other characters from the control characters + in a typeface. Her work continues at Xerox.", +} + +@Misc{Abraxas:1987:P, + author = "{Abraxas Software, Inc.}", + title = "{PCYACC} 2.0", + note = "7033 SW Macadam Ave., Portland, OR 97219.", + year = "1987", +} + +@Periodical{CurSci:1987:A, + key = "C01AIDS", + title = "{AIDS}", + year = "1987--date{}", + publisher = pub-CURSCI, + address = pub-CURSCI:adr, + acknowledgement = ack-ga-gt, + note = "Current Science publishes more than 80 medical + periodicals using an in-house markup language for + which {\TeX} is the back-end typesetting system. All + submitted articles (whether on paper or on magnetic + media) are rekeyed by clerical staff into the markup + system.", +} + +@Phdthesis{Naiman:1991:UGI, + author = "Avi Naiman", + title = "The Use of Grayscale for Improved Character + Presentation", + school = "University of Toronto", + year = "1991", + address = "ATTN: Technical Reports, + Computer Systems Research Institute, + University of Toronto, + 6 King's College Road, + Toronto, Ontario M5S 1A1, + CANADA, + Tel: (416) 978-8751. + The cost is CDN\$16 if inside Canada, US\$16 if outside. + Avi's e-mail address is \path|avi@cvs.rochester.edu|.", + note = "Technical report CSRI-253", + acknowledgement = ack-kb, +} + +@Proceedings{Andre:1989:RID, + title = "Raster Imaging and Digital Topography", + year = "1989", + editor = "Jacques Andr{\'e} and Roger Hersch", + publisher = pub-CUP, + ISBN = "0-521-37490-1", +} + +@TechReport{Chen:1987:AIP, + author = "Pehong Chen and Michael A. Harrison", + title = "Automating Index Preparation", + institution = "Computer Science Division, University of California", + year = "1987", + type = "Technical Report", + number = "87/347", + address = "Berkeley, CA, USA", + month = mar, + note = "This is an expanded version of + \cite{Chen:SPE-19-9-897}.", +} + +@Unpublished{English:1987:UMO, + title = "Using {METAFONT} for Original Font Design", + author = "Paul M. English", + month = aug, + year = "1987", + institution = "University of Massachusetts at Boston", +} diff --git a/doc/context/sources/general/manuals/rules/rules-mkiv.tex b/doc/context/sources/general/manuals/rules/rules-mkiv.tex index 536a37aea..00ab49c25 100644 --- a/doc/context/sources/general/manuals/rules/rules-mkiv.tex +++ b/doc/context/sources/general/manuals/rules/rules-mkiv.tex @@ -627,7 +627,7 @@ primitive here, so we follow the \TEX\ conventions of keywords. \hskip-100mm \darkred \frule width 100mm height 10mm depth 8mm radius 2mm line 2pt\relax \hskip-100mm - \hbox to 100mm{\white \bold \hfill some handy word with frames\hfill} + \hbox to 100mm{\white \bold \hfill some handy word with frames\hfill}% \egroup \stopbuffer diff --git a/doc/context/sources/general/manuals/spacing/spacing-linecorrection.tex b/doc/context/sources/general/manuals/spacing/spacing-linecorrection.tex index c16afbf0a..525dd7490 100644 --- a/doc/context/sources/general/manuals/spacing/spacing-linecorrection.tex +++ b/doc/context/sources/general/manuals/spacing/spacing-linecorrection.tex @@ -6,6 +6,8 @@ \startchapter[title=Line correction] +\startsection[title=Wrapping content] + \startbuffer[linecorrection] \typebuffer \blank @@ -103,6 +105,8 @@ Because in this document we have set the whitespace this also gets added around the box. So, in case your spacing around some special content looks bad, consider using these commands. +\stopsection + \stopchapter \stopcomponent diff --git a/doc/context/sources/general/manuals/spacing/spacing-mkiv.tex b/doc/context/sources/general/manuals/spacing/spacing-mkiv.tex index 375f4e2a8..0f32e4d30 100644 --- a/doc/context/sources/general/manuals/spacing/spacing-mkiv.tex +++ b/doc/context/sources/general/manuals/spacing/spacing-mkiv.tex @@ -28,6 +28,8 @@ \startbodymatter \component spacing-linecorrection + \component spacing-spaces + \component spacing-periods \stopbodymatter \stopdocument diff --git a/doc/context/sources/general/manuals/spacing/spacing-periods.tex b/doc/context/sources/general/manuals/spacing/spacing-periods.tex new file mode 100644 index 000000000..8d493b9a9 --- /dev/null +++ b/doc/context/sources/general/manuals/spacing/spacing-periods.tex @@ -0,0 +1,79 @@ +% language=uk + +\environment spacing-style + +\startcomponent spacing-periods + +\startchapter[title=Periods in abbreviations] + +% \enabletrackers[typesetters.periodkerns] + +When you use so called non french spacing you get more spacing after punctuation +(as determined by the \type {sfcode} of the punctuation character) . However, +when you use periods as delimiters for abbreviations, that period is not the end +of a sentence and you want normal interword spacing instead. One way to achieve +this is to add a backslash after the period but in an automated workflow where +the source is not coming from \TEX\ but for instance in \XML\ format, you can't +do that. The \type {\setupspacing} command can be used to set one of: + +\starttabulate[|T|p|] +\NC fixed \NC \showglyphs \frenchspacing bla bla e.g. some more \NC \NR +\NC packed \NC \showglyphs \newfrenchspacing bla bla e.g. some more \NC \NR +\NC broad \NC \showglyphs \nonfrenchspacing bla bla e.g. some more \NC \NR +\stoptabulate + +The \type {packed} case is similar to \type {fixed} but has slightly larger (some +5\percent) spacing after punctuation which (at least historically) avoids some +side effects with hyphenation and dashes. We default to \type {broad} anyway. + +The next examples demonstrate what the \type {\setperiodkerning} does when it gets +an option passed. Its counterpart is \type {\resetperiodkerning}. + +\starttabulate[|T|Tr|p|] + \HL + \NC \NC \NC \showglyphs \nonfrenchspacing \resetperiodkerning bla bla e.g. some more \NC \NR + \NC \NC \NC \showglyphs \nonfrenchspacing \resetperiodkerning bla bla e.g. Some more \NC \NR + \HL + \NC zerospaceperiods \NC 0 \NC \showglyphs \nonfrenchspacing \setperiodkerning [zerospaceperiods]bla bla e.g. some more \NC \NR + \NC \NC \NC \showglyphs \nonfrenchspacing \setperiodkerning [zerospaceperiods]bla bla e.g. Some more \NC \NR + \HL + \NC smallspaceperiods \NC .25\NC \showglyphs \nonfrenchspacing \setperiodkerning [smallspaceperiods]bla bla e.g. some more \NC \NR + \NC \NC \NC \showglyphs \nonfrenchspacing \setperiodkerning [smallspaceperiods]bla bla e.g. Some more \NC \NR + \HL + \NC halfspaceperiods \NC .50 \NC \showglyphs \nonfrenchspacing \setperiodkerning [halfspaceperiods]bla bla e.g. some more \NC \NR + \NC \NC \NC \showglyphs \nonfrenchspacing \setperiodkerning [halfspaceperiods]bla bla e.g. Some more \NC \NR + \HL +\stoptabulate + +Next we enlarge the affected bit of text so that you can see that the last two +options also affects the space after the periods that bind the characters. + +\startlinecorrection +\startcombination[4*2] + {\scale[scale=3500]{\ruledhbox{\showglyphs \nonfrenchspacing \resetperiodkerning e.g. s}}} {} + {\scale[scale=3500]{\ruledhbox{\showglyphs \nonfrenchspacing \setperiodkerning [zerospaceperiods]e.g. s}}} {} + {\scale[scale=3500]{\ruledhbox{\showglyphs \nonfrenchspacing \setperiodkerning [smallspaceperiods]e.g. s}}} {} + {\scale[scale=3500]{\ruledhbox{\showglyphs \nonfrenchspacing \setperiodkerning [halfspaceperiods]e.g. s}}} {} + {\scale[scale=3500]{\ruledhbox{\showglyphs \nonfrenchspacing \resetperiodkerning e.g. S}}} {} + {\scale[scale=3500]{\ruledhbox{\showglyphs \nonfrenchspacing \setperiodkerning [zerospaceperiods]e.g. S}}} {\ttxx zerospaceperiods} + {\scale[scale=3500]{\ruledhbox{\showglyphs \nonfrenchspacing \setperiodkerning [smallspaceperiods]e.g. S}}} {\ttxx smallspaceperiods} + {\scale[scale=3500]{\ruledhbox{\showglyphs \nonfrenchspacing \setperiodkerning [halfspaceperiods]e.g. S}}} {\ttxx halfspaceperiods} +\stopcombination +\stoplinecorrection + +Defining more options is easy, we only specify the factor that determines mid +periods. When \type {factor} is zero, only the final period is looked at. + +\starttyping +\defineperiodkerning [zerospaceperiods] [factor=0] +\defineperiodkerning [smallspaceperiods] [factor=.25] +\defineperiodkerning [halfspaceperiods] [factor=.5] +\stoptyping + +This mechanism has been present for a while but I forgot about it. When cleaning +up code it was decided to add it to the core. Maybe more options and features are +needed but so far there has never been demand for this so \unknown + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/spacing/spacing-spaces.tex b/doc/context/sources/general/manuals/spacing/spacing-spaces.tex new file mode 100644 index 000000000..0d7f64379 --- /dev/null +++ b/doc/context/sources/general/manuals/spacing/spacing-spaces.tex @@ -0,0 +1,276 @@ +% language=uk + +\environment spacing-style + +\startcomponent spacing-periods + +\startchapter[title=Spacing] + +\startsection[title=Spaces] + +When \TEX\ reads its input and transforms content it into a node list spaces are +turned into glue nodes of subtype \quote {spaceskip} or \quote {xspaceskip}. In +pseudo code, this is what happens: + +\starttyping +if spacefactor >= 2000 and xspaceskip ~= 0 then + space = xspaceskip_space + stretch = xspaceskip_stretch + shrink = xspaceskip_shrink + subtype = xspaceskip +else + if spaceskip == 0 then + space = font_space + stretch = font_stretch + shrink = font_shrink + else + space = spaceskip_space + stretch = spaceskip_stretch + shrink = spaceskip_shrink + end + if space_factor >= 2000 + space = space + font_extraspace + end + stretch = stretch * space_factor + shrink = shrink * space_factor + subtype = spaceskip +end +insert_glue(space,stretch,shrink,subtype) +\stoptyping + +We demonstrate the effects in a few examples. You can use \typ {\showmakeup [space]} to +visualize spaces. + +\def\ShowSpaces#1#2#3% + {\blank + \start + \startsubsubsubject[title={case #1: \type{#2} and \type {#3}}] + \dontleavehmode + #2\relax + #3\relax + \showmakeup[space]% + % \definedfont[Serif*default]% + \nonfrenchspacing + \strut x\space x.\space x\crlf + \frenchspacing + \strut x\space x.\space x\par + \stop + \stopsubsubject + \blank} + +\ShowSpaces{1}{\spacefactor2000}{\xspaceskip100pt} + +\starttabulate[|l|l|] +\HL +\NC \type {\spacefactor} \NC $\geq 2000$ \NC \NR +\NC \type {\xspaceskip} \NC $\neq 0$ \NC \NR +\HL +\NC space \NC xspaceskip_space \NC \NR +\NC stretch \NC xspaceskip_stretch \NC \NR +\NC shrink \NC xspaceskip_shrink \NC \NR +\NC subtype \NC xspaceskip \NC \NR +\HL +\stoptabulate + +\ShowSpaces{2}{\spacefactor1000}{\spaceskip0pt} + +\starttabulate[|l|l|] +\HL +\NC \type {\spacefactor} \NC $\lt 2000$ \NC \NR +\NC \type {\spaceskip} \NC $\eq 0$ \NC \NR +\HL +\NC space \NC font_space \NC \NR +\NC stretch \NC font_stretch \NC \NR +\NC shrink \NC font_shrink \NC \NR +\NC subtype \NC spaceskip \NC \NR +\HL +\stoptabulate + +\ShowSpaces{3}{\spacefactor2000}{\spaceskip0pt} + +\starttabulate[|l|l|] +\HL +\NC \type {\spacefactor} \NC $\geq 2000$ \NC \NR +\NC \type {\spaceskip} \NC $\eq 0$ \NC \NR +\HL +\NC space \NC font_space $+$ extraspace_font \NC \NR +\NC stretch \NC font_stretch \NC \NR +\NC shrink \NC font_shrink \NC \NR +\NC subtype \NC spaceskip \NC \NR +\HL +\stoptabulate + +\ShowSpaces{4}{\spacefactor1000}{\spaceskip100pt} + +\starttabulate[|l|l|] +\HL +\NC \type {\spacefactor} \NC $\lt 2000$ \NC \NR +\NC \type {\spaceskip} \NC $\neq 0$ \NC \NR +\HL +\NC space \NC font_space \NC \NR +\NC stretch \NC font_stretch $\times$ space_factor \NC \NR +\NC shrink \NC font_shrink $\times$ space_factor \NC \NR +\NC subtype \NC spaceskip \NC \NR +\HL +\stoptabulate + +\ShowSpaces{5}{\spacefactor2000}{\spaceskip100pt} + +\starttabulate[|l|l|] +\HL +\NC \type {\spacefactor} \NC $\geq 2000$ \NC \NR +\NC \type {\spaceskip} \NC $\neq 0$ \NC \NR +\HL +\NC space \NC font_space $+$ extraspace_font \NC \NR +\NC stretch \NC font_stretch $\times$ space_factor \NC \NR +\NC shrink \NC font_shrink $\times$ space_factor \NC \NR +\NC subtype \NC spaceskip \NC \NR +\HL +\stoptabulate + +The width of a space relates to the design of a font and therefore the t width of +the space, its stretch and its shrink are taken from the font and scaled +accordingly. Normally we take the space character in the font as reference. +Traditional \TEX\ fonts don't have that character but \OPENTYPE\ fonts have. When +there is no space character, in the case of a monospaced font we take the +emwidth, otherwise we take half the emwidth. As a last resort we can take the +average width of characters. And of even that fails we take half of the font +units. But, as mentioned, modern fonts have a space. + +In the \CONTEXT\ font loader we use a stretch that is 1/2 of the width of a space +and the shrink is 1/3 the width of a space. These values are familiar for those +who come from traditional \TEX. + +As with many variables, you can overload these values when a font is loaded by +setting the \type {spacing} feature. Here is how this is done: + +\startbuffer +\definefontfeature + [morespace] + [spacing=0.50 plus 0.50 minus 0.250] +\definefontfeature + [lessspace] + [spacing=0.25 plus 0.25 minus 0.125] +\definefontfeature + [extramorespace] + [spacing=0.50 plus 0.50 minus 0.250 extra 2.00] +\definefontfeature + [extralessspace] + [spacing=0.25 plus 0.25 minus 0.125 extra 2.00] + +\definedfont[Serif*default] + \inleft{\infofont default} + \samplefile{klein}\par + \blank +\definedfont[Serif*default,morespace] + \inleft{\infofont morespace} + \samplefile{klein}\par + \blank +\definedfont[Serif*default,extramorespace] + \inleft{\infofont extramorespace} + \samplefile{klein}\par + \blank +\definedfont[Serif*default,lessspace] + \inleft{\infofont lessspace} + \samplefile{klein}\par + \blank +\definedfont[Serif*default,extralessspace] + \inleft{\infofont extralessspace} + \samplefile{klein}\par + \blank +\stopbuffer + +\typebuffer + +For demonstration purposes we use a somewhat excessive \type {extra} +specification. By default the extra space is equal to the shrink. + +\blank \start + \showmakeup[space] + \getbuffer +\stop \blank + +\stopsection + +\startsection[title=Expansion] + +Spaces become glue that can shrink or stretch. In the worst case words will come +too close, or the gap will be large. Even worse is that this can lead to +successive lines in a paragraph looking different with respect to spacing. A solution +for this is to use font expansion, although the benefits are often less than +some users want (you) to believe. + +This mechanism is enabled with \type {\setupalign}. There are two variants (\type +{hz} and \type {fullhz}) and a reset (\type {nohz}). In \in {figure} [fig:expansion] +we use the following font definition: + +\startbuffer +\definefont[testfont][Normal*default,quality @ 9pt] +\stopbuffer + +\typebuffer \getbuffer + +We use \type {\showfontexpansion} to view the effective expansion factors of each +glyph. When \type {fullhz} is used fontkerns also can get expanded. Zero values +are not shown. The font kern factors are shown below the character factors. They +can be neglected and one can even wonder if they need a treatment especially +because kerns are also used for relative positioning, accent anchoring and +cursive attachments. + +\startplacefigure[reference=fig:expansion,title={The two expansion methods in action.}] + \startcombination[nx=3,ny=2,location=top] + {\framed[foregroundstyle=\testfont,width=.3\textwidth,align={normal,tolerant,nohz}] {\showfontexpansion\samplefile{ward}}} {} + {\framed[foregroundstyle=\testfont,width=.3\textwidth,align={normal,tolerant,fullhz}]{\showfontexpansion\samplefile{ward}}} {} + {\framed[foregroundstyle=\testfont,width=.3\textwidth,align={normal,tolerant,hz}] {\showfontexpansion\samplefile{ward}}} {} + {\scale[width=.3\textwidth]{\clip[nx=2,ny=4,x=2,y=3]{\framed[foregroundstyle=\testfont,width=.3\textwidth,align={normal,tolerant,nohz}] {\showfontexpansion\samplefile{ward}}}}} {\tttf{nohz}} + {\scale[width=.3\textwidth]{\clip[nx=2,ny=4,x=2,y=3]{\framed[foregroundstyle=\testfont,width=.3\textwidth,align={normal,tolerant,fullhz}]{\showfontexpansion\samplefile{ward}}}}} {\tttf{fullhz}} + {\scale[width=.3\textwidth]{\clip[nx=2,ny=4,x=2,y=3]{\framed[foregroundstyle=\testfont,width=.3\textwidth,align={normal,tolerant,hz}] {\showfontexpansion\samplefile{ward}}}}} {\tttf{hz}} + \stopcombination +\stopplacefigure + +\stopsection + +\startsection[title=Looseness] + +The \type {\looseness} parameter can be used to let the par builder add more +lines, but that condition is only met when the demand is reasonable. So we need +stretch and often also tolerance to achieve it. + +\starttyping +\looseness=1 ... text ... \par +\stoptyping + +This setting is reset afterwards. Because \type {framed} does some grouping deep down, +we need either to use it in there like this: + +\starttyping +\framed + [align={normal,verytolerant,stretch},strut=no] + {\looseness1 ... \par} +\stoptyping + +which is somewhat clumsy, or we can do: + +\starttyping +\framed + [align={normal,verytolerant,stretch,2*more}] + {...} +\stoptyping + +This is demonstrated in \in {figure} [fig:looseness]. + +\startplacefigure[reference=fig:looseness,title={Looseness in action.}] + \dontcomplain + \startcombination[location=top,nx=3,ny=1] + {\framed[foregroundstyle=small,align={normal,verytolerant,stretch}, width=.3\textwidth]{\samplefile{sapolsky}\unskip}} {} + {\framed[foregroundstyle=small,align={normal,verytolerant,stretch,1*more},width=.3\textwidth]{\samplefile{sapolsky}\unskip}} {\type {1*more}} + {\framed[foregroundstyle=small,align={normal,verytolerant,stretch,2*more},width=.3\textwidth]{\samplefile{sapolsky}\unskip}} {\type {2*more}} + \stopcombination +\stopplacefigure + +\stopsection + +\stopchapter + +\stopcomponent + diff --git a/doc/context/sources/general/manuals/spacing/spacing-style.tex b/doc/context/sources/general/manuals/spacing/spacing-style.tex index cf0bae7bf..5514df729 100644 --- a/doc/context/sources/general/manuals/spacing/spacing-style.tex +++ b/doc/context/sources/general/manuals/spacing/spacing-style.tex @@ -1,5 +1,7 @@ \startenvironment spacing-style +\usemodule[abbreviations-words,typesetting] + \setupbodyfont [pagella] @@ -52,4 +54,11 @@ [style=\bfc, color=maincolor] +\setuphead + [subsubsection] + [style=bold, + color=maincolor, + before=\blank, + after=\blank] + \stopenvironment diff --git a/doc/context/sources/general/manuals/sql/sql-mkiv.tex b/doc/context/sources/general/manuals/sql/sql-mkiv.tex index dabb0a34f..4d2ecbc6e 100644 --- a/doc/context/sources/general/manuals/sql/sql-mkiv.tex +++ b/doc/context/sources/general/manuals/sql/sql-mkiv.tex @@ -527,7 +527,6 @@ loggers.save(db, { -- variant 2: flat table message = "whatever b" } ) - local result = loggers.collect(db, { start = { day = 1, @@ -576,7 +575,6 @@ In this example we typeset the (small) table): \ctxluabuffer - \stopsection \startsection[title=Colofon] diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en-heads.tex b/doc/context/sources/general/manuals/start/en/ma-cb-en-heads.tex index aa7e7b161..4eddcb9fd 100644 --- a/doc/context/sources/general/manuals/start/en/ma-cb-en-heads.tex +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en-heads.tex @@ -33,12 +33,12 @@ These titles are created with the commands shown in \in{table}[tab:headers]: \HL \stoptable} -\shortsetup{chapter} -\shortsetup{section} -\shortsetup{subsection} -\shortsetup{title} -\shortsetup{subject} -\shortsetup{subsubject} +\shortsetup{startsection:instance:chapter} +\shortsetup{startsection:instance:section} +\shortsetup{startsection:instance:subsection} +\shortsetup{startsection:instance:title} +\shortsetup{startsection:instance:subject} +\shortsetup{startsection:instance:subsubject} These commands will produce a numbered or unnumbered title in a predefined fontsize and fonttype with some vertical spacing before and after the header. diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en.pdf b/doc/context/sources/general/manuals/start/en/ma-cb-en.pdf Binary files differindex 6ad164eb0..497cecfe0 100644 --- a/doc/context/sources/general/manuals/start/en/ma-cb-en.pdf +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en.pdf diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en.tex b/doc/context/sources/general/manuals/start/en/ma-cb-en.tex index 2e0b283af..2e7f7eac4 100644 --- a/doc/context/sources/general/manuals/start/en/ma-cb-en.tex +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en.tex @@ -6,13 +6,10 @@ \project ma-cb -% \disabledirectives[otf.kernruns] -% \disabledirectives[otf.discruns] -% \disabledirectives[otf.compruns] - \startdocument - [title={\ConTeXt\ Mark IV\crlf an excursion}, - subtitle={English\crlf version}, + [title={\ConTeXt\ Mark IV}, + subtitle={an excursion}, + version={English}, author={Ton Otten\crlf PRAGMA ADE}] \startfrontmatter diff --git a/doc/context/sources/general/manuals/start/ma-cb-style.tex b/doc/context/sources/general/manuals/start/ma-cb-style.tex index 294e4a5cc..d4f7d7c5f 100644 --- a/doc/context/sources/general/manuals/start/ma-cb-style.tex +++ b/doc/context/sources/general/manuals/start/ma-cb-style.tex @@ -11,7 +11,9 @@ % Setups are kind of special. -\loadsetups[cont-\currentmainlanguage.xml] +% \loadsetups[cont-\currentmainlanguage.xml] + +\loadsetups[i-context] \setupsetup [\c!criterium=\v!used] @@ -254,59 +256,26 @@ \newbox\CoverBackgroundBox % reuse saves .8 sec, could be an object! +\definebodyfontenvironment[1.9pt] + +\defineframed + [CoverFramed] + [%\c!foregroundstyle=\CoverFont, + \c!background=basic-shape-dark, + \c!backgroundoffset=1pt, + \c!rulethickness=2pt, + \c!frame=\v!off] + \starttexdefinition unexpanded ShowSetupOnCover #n #tag #xmlroot \dontleavehmode - \framed [ - \c!background=basic-shape-light, - \c!backgroundoffset=5pt, - \c!rulethickness=2pt, - \c!frame=\v!off - ] { - \xmlsetup{#xmlroot}{xml:setups:assemblename} - \tttf - \texescape\currentSETUPfullname + \CoverFramed { + \tttf\showsetupnameonly{#1}{#2}{#3} } - \hskip1.25em plus 1em minus 1em\relax + \kern\zeropoint + \hskip1em plus 1em minus .25em\relax \stoptexdefinition -% \startsetups coverbackground -% -% \ifvoid\CoverBackgroundBox -% -% \global\setbox\CoverBackgroundBox=\vbox to \paperheight \bgroup -% \hsize\paperwidth -% \emergencystretch3em -% \parfillskip0pt -% \switchtobodyfont -% [6pt] -% \baselineskip 0pt plus 1pt minus 1pt -% \setupsorting -% [texcommand] -% [\c!command=\ShowSetupOnCover, -% \c!criterium=\v!all] -% \beginofshapebox -% \leftskip3pt -% \rightskip3pt -% \placelistofsorts -% [texcommand] -% \endofshapebox -% \doreshapebox -% {\box\shapebox} -% {\penalty\shapepenalty} -% {\kern\shapekern} -% {\vfil} -% \kern3pt -% \vfilneg -% \flushshapebox -% \vfilneg -% \kern3pt -% \egroup -% -% \fi -% -% \copy\CoverBackgroundBox -% -% \stopsetups +\definecolor[CoverTransparency][a=1,t=.5] \startsetups coverbackground @@ -316,14 +285,18 @@ \startnicelyfilledbox [\c!width=\paperwidth, \c!height=\paperheight, - \c!offset=\exheight, +% \c!offset=\exheight, +% \c!offset=\emwidth, + \c!offset=\zeropoint, \c!strut=\v!no] \switchtobodyfont - [6pt] + [1.9pt] + \starttransparent[CoverTransparency] \placelistofsorts [texcommand] [\c!command=\ShowSetupOnCover, - \c!criterium=\v!all] + \c!criterium=\v!all]% used + \stoptransparent \stopnicelyfilledbox \fi @@ -362,14 +335,16 @@ \hbox to \hsize \bgroup \hss - \definedfont[SansBold*default at 40pt] + %\definedfont[SansBold*default at 40pt] + \definedfont[Bold*default at 40pt] \framed [\c!background=basic-shape-dark, \c!frame=\v!off, - \c!rulethickness=15pt, + \c!rulethickness=30pt, \c!align=\v!middle, \c!offset=40pt] - {\documentvariable{title}} + {\dontleavehmode\hbox{\documentvariable{title}}\par + \dontleavehmode\hbox{\documentvariable{subtitle}}} \egroup \vfill @@ -377,14 +352,15 @@ \doifsomething {\documentvariable{subtitle}} { \hbox to \hsize \bgroup - \definedfont[SansBold*default at 14pt] + %\definedfont[SansBold*default at 20pt] + \definedfont[Bold*default at 20pt] \framed [\c!background=basic-shape-dark, \c!frame=\v!off, - \c!rulethickness=10pt, + \c!rulethickness=15pt, \c!align=\v!middle, \c!offset=20pt] - {\documentvariable{subtitle}} + {\documentvariable{version}} \hss \egroup @@ -392,11 +368,12 @@ \hbox to \hsize \bgroup \hss - \definedfont[SansBold*default at 20pt] + %\definedfont[SansBold*default at 24pt] + \definedfont[Bold*default at 24pt] \framed [\c!background=basic-shape-dark, \c!frame=\v!off, - \c!rulethickness=12.5pt, + \c!rulethickness=18pt, \c!align=\v!middle, \c!offset=35pt] {\documentvariable{author}} @@ -547,9 +524,16 @@ \switchtobodyfont[8pt] - \startmixedcolumns[documentcolumns] + % somehow \blank doesn't work here + + \setupframedtexts + [setuptext] + [\c!before={\vskip6pt}, + \c!after={\vskip6pt}] + + % \startmixedcolumns[documentcolumns] \placelistofsorts[texcommand] - \stopmixedcolumns + % \stopmixedcolumns \stop @@ -671,7 +655,7 @@ \setupregister [Command] [\c!indicator=\v!off, - c!before={\blank[\v!line]}] + \c!before={\blank[\v!line]}] \protect diff --git a/doc/context/sources/general/manuals/workflows/workflows-mkiv.tex b/doc/context/sources/general/manuals/workflows/workflows-mkiv.tex index c742b94e1..52070c49e 100644 --- a/doc/context/sources/general/manuals/workflows/workflows-mkiv.tex +++ b/doc/context/sources/general/manuals/workflows/workflows-mkiv.tex @@ -38,12 +38,14 @@ \stopfrontmatter \startbodymatter + \component workflows-running \component workflows-resources \component workflows-graphics \component workflows-suspects \component workflows-injectors \component workflows-xml \component workflows-setups + \component workflows-synctex \stopbodymatter \stopdocument diff --git a/doc/context/sources/general/manuals/workflows/workflows-running.tex b/doc/context/sources/general/manuals/workflows/workflows-running.tex new file mode 100644 index 000000000..6d3e9f5c4 --- /dev/null +++ b/doc/context/sources/general/manuals/workflows/workflows-running.tex @@ -0,0 +1,72 @@ +% language=uk + +\environment workflows-style + +\startcomponent workflows-running + +\startchapter[title={Running}] + +\startsection[title={Errors}] + +A \CONTEXT\ runs normally spits out quite some information to the console. In +fact, even more information can go to the log file. It makes sense to have a look +at the end of the log file occasionally because there you can find information +about the (file) structure loaded, modules, issues with references and|/|or +fonts, etc. + +One problem with the terminal is that you can miss an issue easily, but there is +a way out of this: + +\starttyping +\enabledirectives[logs.errors] +\stoptyping + +The command line argument \type {--errors} has the same consequence. If you want +to quit in an error, you can say for instance: + +\starttyping +\enabledirectives[logs.errors=missing characters] +\stoptyping + +If you run \CONTEXT\ with \type {--trackers} or \type {--directives} you get some +information about the possible extra tracing. It might be illustrative to run a +file with: + +\starttyping +\enabletrackers[*] +\stoptyping + +There are all kind of trackers and directives and you can get a list with: + +\starttyping +context --trackers --directives +\stoptyping + +An example is: + +\starttyping +\enabletrackers[fonts.missing=replace] +\stoptyping + +or just: + +\starttyping +\enabletrackers[fonts.missing] +\stoptyping + + +\stopsection + +\startsection[title={Silent}] + +The \type {--silent} options blocks most message. You can also pass a list (or +pattern) of categories to silence. The \type {--noconsole} option only disables +logging to the console. The error reporting mentioned in the previous section +will never be silenced. + +\stopsection + +\stopchapter + +\stopcomponent + diff --git a/doc/context/sources/general/manuals/workflows/workflows-synctex.tex b/doc/context/sources/general/manuals/workflows/workflows-synctex.tex new file mode 100644 index 000000000..8f1fac632 --- /dev/null +++ b/doc/context/sources/general/manuals/workflows/workflows-synctex.tex @@ -0,0 +1,207 @@ +% language=uk + +\environment workflows-style + +\startcomponent workflows-xml + +\startchapter[title=\SYNCTEX] + +\startsection[title=Introduction] + +Some users like the \SYNCTEX\ feature that is built in the \TEX\ engines. +Personally I never use it because it doesn't work well with the kind of documents +I maintain. If you have one document source, and don't shuffle around (reuse) +text too much it probably works out okay but that is not our practice. Here I +will describe how you can enable a more \CONTEXT\ specific \SYNCTEX\ support so +that aware \PDF\ viewers can bring you back to the source. + +\stopsection + +\startsection[title=What we want] + +The \SYNCTEX\ method roughly works as follows. Internally \TEX\ constricts linked +lists of glyphs, kerns, glue, boxes, rules etc. These elements are called nodes. +Some nodes carry information about the file and line where they were created. In +the backend this information gets somehow translated in a (sort of) verbose tree +that describes the makeup in terms of boxes, glue and kerns. From that +information the \SYNCTEX\ parser library, hooked into a \PDF\ viewer, can go back +from a position on the screen to a line in a file. One would expect this to be a +relative simple rectangle based model, but as far as I can see it's way more +complex than that. There are some comments that \CONTEXT\ is not supported well +because it has a layered page model, which indicates that there are some +assumptions about how macro packages are supposed to work. Also the used +heuristics not only involve some specific spot (location) but also involve the +corners and edges. It is therefore not so much a (simple) generic system but a +mechanism geared for a macro package like \LATEX. + +Because we have a couple of users who need to edit complex sets of documents, +coded in \TEX\ or \XML, I decided to come up with a variant that doesn't use the +\SYNCTEX\ machinery but manipulates the few \SYNCTEX\ fields directly \footnote {This +is something that in my opinion should have been possible right from the start +but it's too late now to change the system and it would not be used beyond +\CONTEXT\ anyway.} and eventually outputs a straightforward file for the editor. +Of course we need to follow some rules so that the editor can deal with it. It +took a bit of trial and error to get the right information in the support file +needed by the viewer but we got there. + +The prerequisites of a decent \CONTEXT\ \quotation {click on preview and goto +editor} are the following: + +\startitemize + +\startitem + It only makes sense to click on text in the text flow. Headers and footers + are often generated from structure, and special typographic elements can + originate in macros hooked into commands instead of in the source. +\stopitem + +\startitem + Users should not be able to reach environments (styles) and other files + loaded from the (normally read|-|only) \TEX\ tree, like modules. We don't + want accidental changes in such files. +\stopitem + +\startitem + We not only have \TEX\ files but also \XML\ files and these can normally + flush in rather arbitrary ways. Although the concept of lines is sort of + lost in such a file, there is still a relation between lines and the snippets + that make out the content of an \XML\ node. +\stopitem + +\startitem + In the case of \XML\ files the overhead related to preserving line + numbers should be minimal and have no impact on loading and memory when + these features are not used. +\stopitem + +\startitem + The overhead in terms of an auxiliary file size and complexity as well + as producing that file should be minimal. It should be easy to turn on and + off these features. (I'd never turn them on by default.) +\stopitem + +\stopitemize + +It is unavoidable that we get more run time but I assume that for the average user +that is no big deal. It pays off when you have a workflow when a book (or even a +chapter in a book) is generated from hundreds of small \XML\ files. There is no +overhead when \SYNCTEX\ is not used. + +In \CONTEXT\ we don't use the built|-|in \SYNCTEX\ features, that is: we let +filename and line numbers be set but often these are overloaded explicitly. The +output file is not compressed and constructed by \CONTEXT. There is no benefit in +compression and the files are probably smaller than default \SYNCTEX\ anyway. + +\stopsection + +\startsection[title=Commands] + +Although you can enable this mechanism with directives it makes sense to do it +using the following command. + +\starttyping +\setupsynctex[state=start] +\stoptyping + +The advantage of using an explicit command instead of some command line option is +that in an editor it's easier to disable this trickery. Commenting that line will +speed up processing when needed. This command can also be given in an environment +(style). On the command line you can say + +\starttyping +context --synctex somefile.tex +\stoptyping + +A third method is to put this at the top of your file: + +\starttyping +% synctex=yes +\stoptyping + +Often an \XML\ files is very structured and although probably the main body of +text is flushed as a stream, specific elements can be flushed out of order. In +educational documents flushing for instance answers to exercises can happen out of +order. In that case we still need to make sure that we go to the right spot in +the file. It will never be 100\% perfect but it's better than nothing. The +above command will also enable \XML\ support. + +If you don't want a file to be accessed, you can block it: + +\starttyping +\blocksynctexfile[foo.tex] +\stoptyping + +Of course you need to configure the viewer to respond to the request for +editing. In Sumatra combined with SciTE the magic command is: + +\starttyping +c:\data\system\scite\wscite\scite.exe "%f" "-goto:%l" +\stoptyping + +Such a command is independent of the macro package so you can just consult the +manual or help info that comes with a viewer, given that it supports this linking +back to the source at all. + +\stopsection + +\startsection[title=Methods] + +Contrary to the native \SYNCTEX\ we only deal with text which gives reasonable +efficient output. If you enable tracing (see next section) you can what has +become clickable. Instead of words you can also work with ranges, which not only +gives less runtime but also much smaller \type {.synctex} files. Just try: + +\starttyping +\setupsynctex[state=start,method=min] +\stoptyping + +to get words clickable and + +\starttyping +\setupsynctex[state=start,method=max] +\stoptyping + +to get the more efficient ranges. The overhead for \type {min} is some 10 percent +while \type {max} slows down around 5 percent. + +\stopsection + +\startsection[title=Tracing] + +In case you want to see what gets synced you can enable a tracker: + +\starttyping +\enabletrackers[system.synctex.visualize] +\enabletrackers[system.synctex.visualize=real] +\stoptyping + +The following tracker outputs some status information about \XML\ flushing. Such +trackers only make sense for developers. + +\starttyping +\enabletrackers[system.synctex.xml] +\stoptyping + +% At the cost of some extra overhead, the next (experimental) directive can be used +% when the accuracy is not optimal. +% +% \starttyping +% \enabledirectives[system.synctex.details] +% \stoptyping + +\stopsection + +\startsection[title=Warning] + +Don't turn on this feature when you don't need it. This is one of those mechanism +that hits performance badly. + +Depending on needs the functionality can be improved and|/|or extended. Of course +you can always use the traditional \SYNCTEX\ method but don't expect it to behave +as described here. + +\stopsection + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/xml/xml-mkiv.tex b/doc/context/sources/general/manuals/xml/xml-mkiv.tex index 80d51532f..0f9c74662 100644 --- a/doc/context/sources/general/manuals/xml/xml-mkiv.tex +++ b/doc/context/sources/general/manuals/xml/xml-mkiv.tex @@ -288,7 +288,6 @@ code can be used as starting point: \starttyping \startxmlsetups xml:demo:base - \xmlsetsetup{#1}{*}{-} \xmlsetsetup{#1}{document|section|p}{xml:demo:*} \stopxmlsetups @@ -1275,6 +1274,15 @@ The following commands return strings. Normally these are used in tests. returns the last attribute found (this avoids a lookup) \stopxmlcmd +\startxmlcmd {\cmdbasicsetup{xmlsetatt}} + set the value of attribute \cmdinternal {cd:name} +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlsetattribute}} + set the value of attribute \cmdinternal {cd:name} for each match of \cmdinternal + {cd:lpath} +\stopxmlcmd + \stopsection \startsection[title={manipulation}] @@ -1610,6 +1618,80 @@ mechanism for other purposes as well. \stopsection +\startsection[title={Parameters}] + +\startbuffer[test] +<something whatever="alpha"> + <what> + beta + </what> +</something> +\stopbuffer + +\startbuffer +\startxmlsetups xml:mysetups + \xmlsetsetup{\xmldocument}{*}{xml:*} +\stopxmlsetups + +\xmlregistersetup{xml:mysetups} + +\startxmlsetups xml:something + parameter : \xmlpar {#1}{whatever}\par + attribute : \xmlatt {#1}{whatever}\par + text : \xmlfirst {#1}{what} \par + \xmlsetpar{#1}{whatever}{gamma} + parameter : \xmlpar {#1}{whatever}\par + \xmlflush{#1} +\stopxmlsetups + +\startxmlsetups xml:what + what: \xmlflush{#1}\par + parameter : \xmlparam{#1}{..}{whatever}\par +\stopxmlsetups + +\xmlprocessbuffer{main}{test}{} +\stopbuffer + +Say that we have this \XML\ blob: + +\typebuffer[test] + +With: + +\typebuffer + +we get: + +\getbuffer + +Parameters are stored with a node. + +\startxmlcmd {\cmdbasicsetup{xmlpar}} + returns the value of parameter \cmdinternal {cd:name} or empty if no such + parameter exists +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlparam}} + finds a first match for \cmdinternal {cd:lpath} at \cmdinternal {cd:node} and + returns the value of parameter \cmdinternal {cd:name} or empty if no such + parameter exists +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmllastpar}} + returns the last parameter found (this avoids a lookup) +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlsetpar}} + set the value of parameter \cmdinternal {cd:name} +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlsetparam}} + set the value of parameter \cmdinternal {cd:name} for each match of \cmdinternal + {cd:lpath} +\stopxmlcmd + +\stopsection + \stopchapter \startchapter[title={Expressions and filters}] @@ -1779,7 +1861,6 @@ In addition, \type {=} equals \type {==} and \type {!=} is the same as \type \stopsection - \startsection[title={css selectors}] \startbuffer[selector-001] @@ -1838,7 +1919,7 @@ supported too. In fact, you can combine both methods. Depending on what you select, the \CSS\ one can be a little bit faster too. It has the advantage that one can select more in one go but at the same time looks a bit less attractive. This method was added just to show that it can be done but might be useful too. A -selector is gogen between curly braces (after all \CSS\ uses them and they have no +selector is given between curly braces (after all \CSS\ uses them and they have no function yet in the parser. \starttyping diff --git a/doc/context/sources/general/manuals/xtables/xtables-mkiv.tex b/doc/context/sources/general/manuals/xtables/xtables-mkiv.tex index d4316b479..827ad3fcc 100644 --- a/doc/context/sources/general/manuals/xtables/xtables-mkiv.tex +++ b/doc/context/sources/general/manuals/xtables/xtables-mkiv.tex @@ -1013,14 +1013,240 @@ similar. \stopsection -\startsection[title={Colofon}] +\startsection[title={Alignment}] -\starttabulate[|B|p|] -\NC author \NC \getvariable{document}{author}, \getvariable{document}{affiliation}, \getvariable{document}{location} \NC \NR -\NC version \NC \currentdate \NC \NR -\NC website \NC \getvariable{document}{website} \endash\ \getvariable{document}{support} \NC \NR -\NC copyright \NC \symbol[cc][cc-by-sa-nc] \NC \NR -\stoptabulate +\enabletrackers[typesetters.characteralign] + +There is limited support for aligning numbers in columns. When you flush right +and have a fixed number of digits it's not a problem, but otherwise it might come +in handy. In any case, you might want to use the following as part of your style: + +\starttyping +\addfeature[tabularnumbers] +\stoptyping + +\start \addfeature[tabularnumbers] + +The basic alignment mechanism can be demonstrated with the following examples: + +\startbuffer +\startcharacteralign[,] % or [character={,}] + \checkcharacteralign{123.456,78} \par + \checkcharacteralign {456} \par + \checkcharacteralign {23.456} \par + \checkcharacteralign {78,9} \par + \checkcharacteralign {78} \par +\stopcharacteralign +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer +\startcharacteralign[leftsample=123.456,rightsample=00,character={,}] + \checkcharacteralign{123.456,78} \par + \checkcharacteralign {456} \par + \checkcharacteralign {23.456} \par + \checkcharacteralign {78,9} \par + \checkcharacteralign {78} \par +\stopcharacteralign +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer +\startcharacteralign[leftwidth=100pt,rightwidth=30pt] + \checkcharacteralign{123.456,78} \par + \checkcharacteralign {456} \par + \checkcharacteralign {23.456} \par + \checkcharacteralign {78,9} \par + \checkcharacteralign {78} \par +\stopcharacteralign +\stopbuffer + +\typebuffer \getbuffer + +Samples win over width settings. When no sample or width is given a two pass +analyzer kicks in. This is not the case in the following examples. + +\startbuffer +\startxtable + [align={flushright,lohi}, + aligncharacter=yes, + alignmentleftsample=100, + alignmentrightsample=00, + alignmentcharacter={.}] + \startxrow \startxcell 1 \stopxcell \stopxrow + \startxrow \startxcell 1.1 \stopxcell \stopxrow + \startxrow \startxcell 11.11 \stopxcell \stopxrow +\stopxtable +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer +\startxtable + [align={flushright,lohi}, + aligncharacter=yes, + alignmentleftsample=000.000, + alignmentrightsample=00, + alignmentcharacter={,}] + \startxrow \startxcell 123.456,78 x \stopxcell \stopxrow + \startxrow \startxcell 456 x \stopxcell \stopxrow + \startxrow \startxcell 23.456 x \stopxcell \stopxrow + \startxrow \startxcell 78,9 x \stopxcell \stopxrow + \startxrow \startxcell 78 x \stopxcell \stopxrow +\stopxtable +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer +\startxtable[align={flushright,lohi}] + \startxrow + \startxcell + [aligncharacter=yes, + alignmentcharacter={,}, + alignmentleftsample=000.000, + alignmentrightsample=00] + 123.456,78 + \stopxcell + \stopxrow + \startxrow + \startxcell + [aligncharacter=yes] + 456 + \stopxcell + \stopxrow + \startxrow + \startxcell + [aligncharacter=yes] + 23.456 + \stopxcell + \stopxrow + \startxrow + \startxcell + [aligncharacter=yes] + 78,9 + \stopxcell + \stopxrow + \startxrow + \startxcell + [aligncharacter=yes] + 78 + \stopxcell + \stopxrow +\stopxtable +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer +\setupxtable + [aligned] + [aligncharacter=yes, + alignmentleftsample=000.000, + alignmentrightsample=00, + alignmentcharacter={,}] + +\startxtable[align={flushright,lohi}] + \startxrow \startxcell[aligned] 123.456,78 \stopxcell \stopxrow + \startxrow \startxcell[aligned] 456 \stopxcell \stopxrow + \startxrow \startxcell[aligned] 23.456 \stopxcell \stopxrow + \startxrow \startxcell[aligned] 78,9 \stopxcell \stopxrow + \startxrow \startxcell[aligned] 78 \stopxcell \stopxrow +\stopxtable +\stopbuffer + +\typebuffer \getbuffer + +\stop + +\disabletrackers[typesetters.characteralign] + +\stopsection + +\startsection[title={Depth}] + +Take the following example. Here we have some text that, when typeset narrow, +will have a last line with no (or, depending on the font, hardly) depth. + +\startbuffer +\startxtable[frame=on] + + \startxrow + \startxcell[width=3cm] + here filled with some words to force a rather long line + \stopxcell + \stopxrow + + \startxrow + \startxcell + here filled with some words to force a rather long line + \stopxcell + \stopxrow + + \startxrow + \startxcell + here filled with some words to force a rather long line + + \stopxcell + \stopxrow + +\stopxtable +\stopbuffer + +\typebuffer + +The problem is that \TEX\ doesn't add depth that that last line and adding it +automatically can be done in grid mode but one doesn't always want that. Some mechanisms +add so called struts automatically. As the table cells are framed boxes indeed that +happens here, unless you add an empty line (as in the last row). When you embed + +\startlinecorrection[blank] {\showstruts \showboxes \getbuffer} \stoplinecorrection + +\startbuffer +\startxtable[frame=on] + + \startxrow + \startxcell[width=3cm] + \startitemize[packed] + \startitem + here filled with some words to force a rather long line + \stopitem + \stopitemize + \stopxcell + \stopxrow + + \startxrow + \startxcell + \startitemize[packed] + \startitem + here filled with some words to force a rather long line + \stopitem + \stopitemize + \stopxcell + \stopxrow + + \startxrow + \startxcell + \startitemize[packed] + \startitem + here filled with some words to force a rather long line + + \stopitem + \stopitemize + \stopxcell + \stopxrow + +\stopxtable +\stopbuffer + +\typebuffer + +Don't count on all mechanisms used inside a cell to provide this but with itemize +you're lucky. + +\startlinecorrection[blank] {\showstruts \showboxes \getbuffer} \stoplinecorrection \stopsection @@ -1234,6 +1460,78 @@ in the distribution. \typebuffer[tight] \start \getbuffer[tight,demo] \stop \typebuffer[normal] \start \getbuffer[normal,demo] \stop +\page + +\startbuffer +\startxtable[align={middle,lohi}] + \startxrow + \startxcell[ny=3] (1,3) \stopxcell + \startxcell (1,1) \stopxcell + \startxcell (1,1) \stopxcell + \stopxrow + \startxrow + \startxcell (1,1) \stopxcell + \startxcell (1,1) \stopxcell + \stopxrow + \startxrow + \startxcell[nx=2] (2,1) \stopxcell + \stopxrow +\stopxtable +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer +\startxtable[align={middle,lohi}] + \startxrow + \startxcell[ny=2] (1,2) \stopxcell + \startxcell (1,1) \stopxcell + \startxcell (1,1) \stopxcell + \stopxrow + \startxrow + \startxcell (1,1) \stopxcell + \startxcell (1,1) \stopxcell + \stopxrow + \startxrow + \startxcell[nx=2] (2,1) \stopxcell + \stopxrow +\stopxtable +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer +\startxtable[align={middle,lohi}] + \startxrow + \startxcell[ny=2] (1,2) \stopxcell + \startxcell (1,1) \stopxcell + \startxcell (1,1) \stopxcell + \startxcell (1,1) \stopxcell + \stopxrow + \startxrow + \startxcell[nx=3] (3,1) \stopxcell + \stopxrow + \startxrow + \startxcell[nx=4] (4,1) \stopxcell + \stopxrow +\stopxtable +\stopbuffer + +\typebuffer \getbuffer + +\page + % \ruledhbox{\getbuffer[normal,demo]} +\startsection[title={Colofon}] + +\starttabulate[|B|p|] +\NC author \NC \getvariable{document}{author}, \getvariable{document}{affiliation}, \getvariable{document}{location} \NC \NR +\NC version \NC \currentdate \NC \NR +\NC website \NC \getvariable{document}{website} \endash\ \getvariable{document}{support} \NC \NR +\NC copyright \NC \symbol[cc][cc-by-sa-nc] \NC \NR +\stoptabulate + +\stopsection + \stopdocument diff --git a/metapost/context/base/mpii/mp-tool.mpii b/metapost/context/base/mpii/mp-tool.mpii index a3300f5bb..562139fed 100644 --- a/metapost/context/base/mpii/mp-tool.mpii +++ b/metapost/context/base/mpii/mp-tool.mpii @@ -2816,3 +2816,4 @@ enddef; extra_endfig := extra_endfig & "mfun_apply_max_dimensions ;" ; let dump = relax ; + diff --git a/metapost/context/base/mpiv/metafun.mpiv b/metapost/context/base/mpiv/metafun.mpiv index ab3fa8638..818fd7c56 100644 --- a/metapost/context/base/mpiv/metafun.mpiv +++ b/metapost/context/base/mpiv/metafun.mpiv @@ -35,6 +35,7 @@ input "mp-func.mpiv" ; % under construction % "mp-char.mpiv" ; % loaded on demand % "mp-step.mpiv" ; % loaded on demand % "mp-chem.mpiv" ; % loaded on demand +input "mp-node.mpiv" ; % relatively small so preloaded input "mp-apos.mpiv" ; input "mp-abck.mpiv" ; diff --git a/metapost/context/base/mpiv/mp-char.mpiv b/metapost/context/base/mpiv/mp-char.mpiv index e878c2d16..54e9d6e88 100644 --- a/metapost/context/base/mpiv/mp-char.mpiv +++ b/metapost/context/base/mpiv/mp-char.mpiv @@ -31,14 +31,14 @@ numeric flow_shape_width ; flow_shape_width := 45pt ; numeric flow_grid_height ; flow_grid_height := 40pt ; numeric flow_shape_height ; flow_shape_height := 30pt ; numeric flow_chart_offset ; flow_chart_offset := 2pt ; -color flow_chart_background_color ; flow_chart_background_color := white ; +string flow_chart_background_color ; flow_chart_background_color := "white" ; boolean flow_show_mid_points ; flow_show_mid_points := false ; boolean flow_show_con_points ; flow_show_con_points := false ; boolean flow_show_all_points ; flow_show_all_points := false ; numeric flow_shape_line_width ; flow_shape_line_width := 2pt ; -color flow_shape_line_color ; flow_shape_line_color := .5white ; -color flow_shape_fill_color ; flow_shape_fill_color := .9white ; -color flow_connection_line_color ; flow_connection_line_color := .2white ; +string flow_shape_line_color ; flow_shape_line_color := "gray-5" ; +string flow_shape_fill_color ; flow_shape_fill_color := "gray-9"; +string flow_connection_line_color ; flow_connection_line_color := "gray-2" ; numeric flow_connection_line_width ; flow_connection_line_width := flow_shape_line_width ; @@ -102,14 +102,14 @@ def flow_new_chart = flow_grid_height := 40pt ; flow_shape_height := 30pt ; flow_chart_offset := 2pt ; - flow_chart_background_color := white ; + flow_chart_background_color := "white" ; flow_show_mid_points := false ; flow_show_con_points := false ; flow_show_all_points := false ; flow_shape_line_width := 2pt ; - flow_shape_line_color := .5white ; - flow_shape_fill_color := .9white ; - flow_connection_line_color := .2white ; + flow_shape_line_color := "gray-5" ; + flow_shape_fill_color := "gray-9" ; + flow_connection_line_color := "gray-2" ; flow_connection_line_width := flow_shape_line_width ; flow_connection_smooth_size := 5pt ; flow_connection_arrow_size := 4pt ; @@ -140,8 +140,8 @@ def flow_new_chart = path flow_xypath [][] ; numeric flow_xysx [][] ; numeric flow_xysy [][] ; - color flow_xyfill [][] ; - color flow_xydraw [][] ; + string flow_xyfill [][] ; + string flow_xydraw [][] ; numeric flow_xyline [][] ; boolean flow_xypeep [][] ; picture flow_xytext [][] ; @@ -150,7 +150,7 @@ def flow_new_chart = picture flow_xycomment [][] ; path flow_cpaths [] ; numeric flow_cline [] ; - color flow_ccolor [] ; + string flow_ccolor [] ; boolean flow_carrow [] ; boolean flow_cdash [] ; boolean flow_ccross [] ; @@ -1112,7 +1112,7 @@ def flow_begin_sub_chart = begingroup ; save flow_shape_line_width, flow_connection_line_width ; save flow_shape_line_color, flow_shape_fill_color, flow_connection_line_color ; - color flow_shape_line_color, flow_shape_fill_color, flow_connection_line_color ; + string flow_shape_line_color, flow_shape_fill_color, flow_connection_line_color ; save flow_smooth, flow_arrowtip, flow_dashline, flow_peepshape ; boolean flow_smooth, flow_arrowtip, flow_dashline, flow_peepshape ; enddef ; diff --git a/metapost/context/base/mpiv/mp-crop.mpiv b/metapost/context/base/mpiv/mp-crop.mpiv index 00bcdcb44..e06cf8def 100644 --- a/metapost/context/base/mpiv/mp-crop.mpiv +++ b/metapost/context/base/mpiv/mp-crop.mpiv @@ -15,7 +15,7 @@ if known context_crop : endinput ; fi ; boolean context_crop ; context_crop := true ; -vardef crop_marks_lines (expr box, len, offset, nx, ny) = +vardef crop_marks_lines (expr box, len, offset, nx, ny, boxtoo) = save p ; picture p ; save w, h, x, y ; numeric w, h, x, y ; p := image ( x := if nx = 0 : 1 else : nx - 1 fi ; @@ -30,12 +30,20 @@ vardef crop_marks_lines (expr box, len, offset, nx, ny) = draw ((llcorner box) -- (llcorner box) shifted (0,-len)) shifted (i*w,-offset) ; draw ((ulcorner box) -- (ulcorner box) shifted (0, len)) shifted (i*w, offset) ; endfor ; + if boxtoo : + for i=0 upto x-1 : + for j=0 upto y-1 : + draw box enlarged 1/8 shifted (i*w,j*h) dashed evenly withpen pencircle scaled 1/4 ; + endfor ; + endfor ; + fi ; ) ; setbounds p to box ; p enddef ; vardef crop_marks_cmyk = + pickup pencircle scaled 1/2 ; save p ; picture p ; p := image ( fill ulcircle scaled 12.5 withcolor (1,0,0,0) ; fill urcircle scaled 12.5 withcolor (0,1,0,0) ; @@ -125,6 +133,8 @@ enddef ; def page_marks_add_color(expr width, height, length, offset) = % todo: namespace + pickup pencircle scaled 1/2 ; interim linecap := squared ; interim linejoin := butt ; + path page ; page := fullsquare xscaled width yscaled height ; path more ; more := page enlarged (offset+length/2,offset+length/2) ; @@ -159,6 +169,8 @@ enddef ; def page_marks_add_marking(expr width, height, length, offset) = % todo: namespace + pickup pencircle scaled 1/2 ; interim linecap := squared ; interim linejoin := butt ; + path page ; page := fullsquare xscaled width yscaled height ; path more ; more := page enlarged (offset+length/2,offset+length/2) ; @@ -169,12 +181,14 @@ def page_marks_add_marking(expr width, height, length, offset) = % todo: namespa enddef ; -def page_marks_add_lines(expr width, height, length, offset, nx, ny) = % todo: namespace +def page_marks_add_lines(expr width, height, length, offset, nx, ny, boxtoo) = % todo: namespace + + pickup pencircle scaled 1/2 ; interim linecap := squared ; interim linejoin := butt ; path page ; page := fullsquare xscaled width yscaled height ; path more ; more := page enlarged (offset+length/2,offset+length/2) ; - draw crop_marks_lines(page,length,offset,nx,ny) ; + draw crop_marks_lines(page,length,offset,nx,ny,boxtoo) ; setbounds currentpicture to page ; @@ -182,6 +196,8 @@ enddef ; def page_marks_add_number(expr width, height, length, offset, n) = % todo: namespace + pickup pencircle scaled 1/2 ; interim linecap := squared ; interim linejoin := butt ; + path page ; page := fullsquare xscaled width yscaled height ; path more ; more := page enlarged (offset+length/2,offset+length/2) ; diff --git a/metapost/context/base/mpiv/mp-grap.mpiv b/metapost/context/base/mpiv/mp-grap.mpiv index 3a1d7742a..e799f629c 100644 --- a/metapost/context/base/mpiv/mp-grap.mpiv +++ b/metapost/context/base/mpiv/mp-grap.mpiv @@ -199,7 +199,8 @@ def begingraph(expr w, h) = graph_number_of_arrowheads = 0 ; if known graph_background : % new feature! - fill origin--(w,0)--(w,h)--(0,h)--cycle withcolor graph_background ; + addto graph_finished_graph contour + origin--(w,0)--(w,h)--(0,h)--cycle withcolor graph_background ; fi enddef ; @@ -863,7 +864,7 @@ vardef graph_gridline_picture@#(suffix $)(expr c, f, u)(text w) = if c : graph_xyscale fi shifted (((.5 + mfun_laboff@# dotprod (.5,.5)) * mfun_laboff@#) graph_xyscale) ; image(draw p w ; - label@#(if string f : format(f,u) else : f fi, point 0 of p)) + label@#(if string f : format(f,u) else : f fi, point 0 of p) w) fi enddef ; diff --git a/metapost/context/base/mpiv/mp-grph.mpiv b/metapost/context/base/mpiv/mp-grph.mpiv index 5938b9f02..04d4920f6 100644 --- a/metapost/context/base/mpiv/mp-grph.mpiv +++ b/metapost/context/base/mpiv/mp-grph.mpiv @@ -65,7 +65,6 @@ enddef ; numeric currentgraphictext ; currentgraphictext := 0 ; -def data_mpo_file = job_name & "-mpgraph.mpo" enddef ; def data_mpy_file = job_name & "-mpgraph.mpy" enddef ; def begingraphictextfig (expr n) = @@ -82,10 +81,10 @@ def endgraphictextfig = enddef ; def loadfigure primary filename = - doloadfigure (filename) + mfun_load_figure(filename) enddef ; -def doloadfigure (expr filename) text figureattributes = +def mfun_load_figure (expr filename) text figureattributes = begingroup ; save figurenumber, figurepicture, number, fixedplace ; numeric figurenumber ; figurenumber := 0 ; diff --git a/metapost/context/base/mpiv/mp-luas.mpiv b/metapost/context/base/mpiv/mp-luas.mpiv index 76d28f7f9..d35701ec6 100644 --- a/metapost/context/base/mpiv/mp-luas.mpiv +++ b/metapost/context/base/mpiv/mp-luas.mpiv @@ -49,6 +49,9 @@ boolean context_luas ; context_luas := true ; % % Fourth variant: +string mfun_lua_bs ; mfun_lua_bs := "[[" ; +string mfun_lua_es ; mfun_lua_es := "]]" ; + vardef mlib_luas_luacall(text t) = runscript("" for s = t : if string s : @@ -72,7 +75,8 @@ vardef mlib_luas_lualist(expr c)(text t) = hide(b := true) fi if string s : - & ditto & s & ditto + % & ditto & s & ditto + & mfun_lua_bs & s & mfun_lua_es elseif numeric s : & decimal s elseif boolean s : @@ -106,21 +110,11 @@ def message expr t = if t <> "" : lua.mp.report(t) fi ; enddef ; -% a few helpers - -% A few helpers: - -vardef isarray suffix a = - lua.mp.isarray(str a) -enddef ; +% A few helpers -vardef prefix suffix a = - lua.mp.prefix(str a) -enddef ; - -vardef dimensions suffix a = - lua.mp.dimensions(str a) -enddef ; +vardef isarray suffix a = lua.mp.isarray (str a) enddef ; +vardef prefix suffix a = lua.mp.prefix (str a) enddef ; +vardef dimension suffix a = lua.mp.dimension(str a) enddef ; % More access diff --git a/metapost/context/base/mpiv/mp-mlib.mpiv b/metapost/context/base/mpiv/mp-mlib.mpiv index 0638ee3e1..115fe63ae 100644 --- a/metapost/context/base/mpiv/mp-mlib.mpiv +++ b/metapost/context/base/mpiv/mp-mlib.mpiv @@ -1245,33 +1245,21 @@ vardef properties(text t) = image(draw unitcircle t) enddef ; -% if metapostversion < 1.770 : -% -% def withproperties expr p = -% if colormodel p = 3 : -% withcolor greypart p -% elseif colormodel p = 5 : -% withcolor (redpart p,greenpart p,bluepart p) -% elseif colormodel p = 7 : -% withcolor (cyanpart p,magentapart p,yellowpart p,blackpart p) -% fi -% enddef ; -% -% else : - - def withproperties expr p = - if colormodel p = 3 : - withcolor greypart p - elseif colormodel p = 5 : - withcolor (redpart p,greenpart p,bluepart p) - elseif colormodel p = 7 : - withcolor (cyanpart p,magentapart p,yellowpart p,blackpart p) - fi - withprescript prescriptpart p - withpostscript postscriptpart p - enddef ; - -% fi ; +def withproperties expr p = + if colormodel p = 3 : + withcolor greypart p + elseif colormodel p = 5 : + withcolor (redpart p,greenpart p,bluepart p) + elseif colormodel p = 7 : + withcolor (cyanpart p,magentapart p,yellowpart p,blackpart p) + fi + withpen penpart p + % if dashpart p <> nullpicture : % fails + dashed dashpart p + % fi + withprescript prescriptpart p + withpostscript postscriptpart p +enddef ; % Experimental: diff --git a/metapost/context/base/mpiv/mp-node.mpiv b/metapost/context/base/mpiv/mp-node.mpiv index fdd308ad1..79391220b 100644 --- a/metapost/context/base/mpiv/mp-node.mpiv +++ b/metapost/context/base/mpiv/mp-node.mpiv @@ -11,76 +11,137 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -%D Ths crossing macros were written as part of this module but as they +%D The crossing macros were written as part of this module but as they %D can be of use elsewhere they are defined in mp-tool. if known context_node : endinput ; fi ; boolean context_node ; context_node := true ; -% returns a pair suffix if the path is unknown +% Build a path from the node positions. +% Must be integer and continuous in index starting at 0. -vardef makenode@#(suffix p)(text t) = - save i, b ; numeric i ; string b ; - for a = t : - if unknown i : % first argument is the index - i = a ; - if isarray p : - % - % note that one needs to declare "path p[] ; picture p[]pic[] ;" - % before calling node() if one is to use a pseudo-array for p - % because "picture p1.pic[] ;" is not a valid syntax! - % - % The following works, but is a bit awkward... - % - b := prefix p ; - if not picture p.pic[i] : scantokens("picture " & b & "[]pic[] ;") ; fi - if not pair p.pos[i] : scantokens("pair " & b & "[]pos[] ;") ; fi +vardef makenodepath(suffix p) = + if unknown p : + if not path p : + d := dimension p ; + if d>0 : + scantokens("path " & prefix p & for i=1 upto d : "[]" & endfor " ;") ; else : - if not picture p.pic[i] : picture p.pic[] ; fi - if not pair p.pos[i] : pair p.pos[] ; fi + path p ; fi + fi + save i ; i = -1 ; + p = forever : exitif unknown p.pos[incr i] ; + p.pos[i] -- + endfor cycle ; + fi +enddef ; + +% can take a list: +def clearpath text t = + save t ; path t ; +enddef ; + +def clearnodepath = clearpath nodepath enddef ; + +clearnodepath ; + +% the trailing "," below handles when number of t<3 + +vardef makenode@#(text t) = + for a = t : + if (path a) or (unknown a) : + mfun_makenode@#(t,) else : - if known p.pic[i] : - addto p.pic[i] also - else : - p.pic[i] := - fi + mfun_makenode@#(nodepath, t,) + fi + exitif true ; + endfor +enddef ; + +vardef node@#(text t) = + for a = t : + if (path a) or (unknown a) : + mfun_node@#(t,) + else : + mfun_node@#(nodepath, t,) + fi + exitif true ; + endfor +enddef ; + +vardef nodeboundingpoint@#(text t) = + for a = t : + if (path a) or (unknown a) : + mfun_nodeboundingpoint@#(t) + else : + mfun_nodeboundingpoint@#(nodepath,a) + fi + exitif true ; + endfor +enddef ; + +vardef fromto@#(expr d, f)(text t) = + fromtopaths@#(d,nodepath,f,nodepath,t) +enddef ; + +% returns a pair suffix if the path is unknown + +vardef mfun_makenode@#(suffix p)(expr i)(text t) = + save d, b ; string b ; + d = dimension p ; + if d > 0 : + b := prefix p ; + if not picture p.pic[i] : scantokens("picture " & b & + for j=1 upto d : "[]" & endfor + "pic[] ;") ; fi + if not pair p.pos[i] : scantokens("pair " & b & + for j=1 upto d : "[]" & endfor + "pos[] ;") ; fi + else : + if not picture p.pic[i] : picture p.pic[] ; fi + if not pair p.pos[i] : pair p.pos[] ; fi + fi + for a = t : + if known p.pic[i] : + addto p.pic[i] also + else : + p.pic[i] = + fi if picture a : a - elseif string a : textext@#(a) + elseif string a : if (length(a) > 0) : textext@#(a) else : nullpicture fi elseif numeric a : textext@#(decimal a) - elseif ((boolean a) and a) : image(draw origin) + elseif ((boolean a) and a) : image(draw origin withpen currentpen scaled 4) else : nullpicture fi ; - fi endfor p.pos[i] if known p : := point i of p ; fi enddef ; % returns a picture -vardef node@#(suffix p)(text t) = - if pair makenode@#(p)(t) : - % nop: gobble the function return. +vardef mfun_node@#(suffix p)(expr i)(text t) = + if pair mfun_makenode@#(p,i,t) : + % nop: enclose in "if ... fi" to gobble the function return. + fi + if (unknown p) and (known p.pos[i]) : + makenodepath(p) ; + fi + if known p.pic[i] : + p.pic[i] if known p : shifted point i of p fi + else : + nullpicture fi - for a = t : - if (unknown p) and (known p.pos[a]) : - makenodepath(p) ; - fi - if known p.pic[a] : - p.pic[a] if known p : shifted point a of p fi - else : - nullpicture - fi - exitif true ; - endfor enddef ; +newinternal node_loopback_yscale ; node_loopback_yscale := 1 ; + % returns a path -vardef fromto@#(expr d)(suffix p)(expr f)(suffix q)(text s) = +vardef fromtopaths@#(expr d)(suffix p)(expr f)(suffix q)(text s) = save r, t, l ; - path r[] ; numeric t ; picture l ; + path r[] ; picture l ; for a = s : if unknown t : t = a ; @@ -97,15 +158,24 @@ vardef fromto@#(expr d)(suffix p)(expr f)(suffix q)(text s) = else : point f of p -- point t of q fi ; - save deviation ; numeric deviation ; + save deviation ; deviation := if numeric d: d else: 0 fi ; - r1 = if deviation=0 : r0 - else : - point 0 of r0 .. - unitvector direction .5length r0 of r0 rotated 90 - scaled deviation * arclength r0 - shifted point .5length r0 of r0 .. - point length r0 of r0 + r1 = if (point 0 of r0) = (point length r0 of r0) : + (fullcircle yscaled node_loopback_yscale rotated 180 + if mfun_laboff@# <> origin : + rotated angle mfun_laboff@# + shifted .5mfun_laboff@# + fi) + scaled deviation + shifted point 0 of r0 + elseif deviation=0 : + r0 + else : + point 0 of r0 .. + unitvector direction .5length r0 of r0 rotated 90 + scaled deviation * arclength r0 + shifted point .5length r0 of r0 .. + point length r0 of r0 fi ; else : if known l : @@ -113,12 +183,12 @@ vardef fromto@#(expr d)(suffix p)(expr f)(suffix q)(text s) = else : l := fi - if picture a : a - elseif string a : textext@#(a) - elseif numeric a : textext@#(decimal a) - elseif ((boolean a) and a) : image(draw origin withpen currentpen scaled 4) - else : nullpicture - fi ; + if picture a : a + elseif string a : if (length(a) > 0) : textext@#(a) else : nullpicture fi + elseif numeric a : textext@#(decimal a) + elseif ((boolean a) and a) : image(draw origin withpen currentpen scaled 4) + else : nullpicture + fi ; fi endfor r2 = r1 @@ -140,7 +210,7 @@ enddef ; % returns pair: bounding point of the node picture -vardef nodeboundingpoint@#(suffix p)(expr i) = +vardef mfun_nodeboundingpoint@#(suffix p)(expr i) = if known p.pic[i] : boundingpoint@#(p.pic[i]) else : @@ -157,7 +227,7 @@ enddef ; % returns pair: vector between nodes (+ optional scale) vardef betweennodes@#(suffix p)(expr f)(suffix q)(text s) = - save t ; numeric t ; + save t ; for a = s : if unknown t : t = a ; @@ -168,15 +238,27 @@ vardef betweennodes@#(suffix p)(expr f)(suffix q)(text s) = endfor enddef ; -% build a path from the node positions. -% Must be continuous in index starting at 0. +% helpers that save passing tokens -vardef makenodepath(suffix p) = - if unknown p : - save i ; i = -1 ; - p = forever : exitif unknown p.pos[incr i] ; - p.pos[i] -- - endfor cycle ; - fi +def mfun_node_init(expr dx, dy, da) = + save nodelattice ; pair nodelattice[] ; + nodelattice0 = (dx,0) ; + nodelattice1 = dy * dir(da) ; + clearnodepath ; + save nodecount ; nodecount = -1; +enddef ; + +def mfun_node_make(expr x, y, s) = + nodecount := nodecount + 1 ; + makenode(nodecount,s) = x * nodelattice0 + y * nodelattice1 ; enddef ; +def mfun_node_flush = + for i=0 upto nodecount: + draw node(i) ; + endfor +enddef ; + +vardef mfun_nodes_fromto@#(expr d, f)(text t) = + fromtopaths@#(d,nodepath,f,nodepath,t) +enddef ; diff --git a/metapost/context/base/mpiv/mp-page.mpiv b/metapost/context/base/mpiv/mp-page.mpiv index f32990677..6e93bdaae 100644 --- a/metapost/context/base/mpiv/mp-page.mpiv +++ b/metapost/context/base/mpiv/mp-page.mpiv @@ -235,9 +235,13 @@ vardef OnOddPage = lua.mp.OnOddPage () enddef ; vardef InPageBody = lua.mp.InPageBody () enddef ; vardef RealPageNumber = lua.mp.RealPageNumber () enddef ; +vardef LastPageNumber = lua.mp.LastPageNumber () enddef ; % duplicates + vardef PageNumber = lua.mp.PageNumber () enddef ; vardef NOfPages = lua.mp.NOfPages () enddef ; -vardef LastPageNumber = lua.mp.LastPageNumber () enddef ; % duplicates + +vardef SubPageNumber = lua.mp.SubPageNumber () enddef ; +vardef NOfSubPages = lua.mp.NOfSubPages () enddef ; vardef CurrentColumn = lua.mp.CurrentColumn () enddef ; vardef NOfColumns = lua.mp.NOfColumns () enddef ; diff --git a/metapost/context/base/mpiv/mp-text.mpiv b/metapost/context/base/mpiv/mp-text.mpiv index b68e8412a..043d09d80 100644 --- a/metapost/context/base/mpiv/mp-text.mpiv +++ b/metapost/context/base/mpiv/mp-text.mpiv @@ -59,10 +59,10 @@ def build_parshape (expr p, offset_or_path, dx, dy, baselineskip, strutheight, s startsavingdata ; - savedata "\global\parvoffset " & decimal voffset&"bp " ; - savedata "\global\parhoffset " & decimal hoffset&"bp " ; - savedata "\global\parwidth " & decimal hsize&"bp " ; - savedata "\global\parheight " & decimal vsize&"bp " ; + savedata "\global\parvoffset " & decimal voffset & "bp " ; + savedata "\global\parhoffset " & decimal hoffset & "bp " ; + savedata "\global\parwidth " & decimal hsize & "bp " ; + savedata "\global\parheight " & decimal vsize & "bp " ; if not path offset_or_path : q := q xscaled ((hsize-2hoffset)/hsize) yscaled ((vsize-2voffset)/vsize) ; @@ -144,13 +144,13 @@ def build_parshape (expr p, offset_or_path, dx, dy, baselineskip, strutheight, s if (i=strutheight) and (width[n]<baselineskip) : n := n - 1 ; - savedata "\global\chardef\parfirst=1 " ; + savedata "\global\parfirst\plusone " ; fi ; endfor ; - savedata "\global\parlines " & decimal n ; - savedata "\global\partoks{ " ; + savedata "\global\parlines " & decimal n ; + savedata "\global\partoks{ " ; for i=1 upto n: savedata decimal indent[i]&"bp " & decimal width[i]&"bp " ; endfor ; diff --git a/metapost/context/base/mpiv/mp-tool.mpiv b/metapost/context/base/mpiv/mp-tool.mpiv index cd04b8dcb..36d6f1743 100644 --- a/metapost/context/base/mpiv/mp-tool.mpiv +++ b/metapost/context/base/mpiv/mp-tool.mpiv @@ -234,50 +234,27 @@ def job_name = jobname enddef ; -def data_mpd_file = - job_name & "-mp.mpd" -enddef ; - %D Because \METAPOST\ has a hard coded limit of 4~datafiles, %D we need some trickery when we have multiple files. This will %D be redone (via \LUA). -if unknown collapse_data : - boolean collapse_data ; - collapse_data := false ; -fi ; - boolean savingdata ; savingdata := false ; boolean savingdatadone ; savingdatadone := false ; def savedata expr txt = - write if collapse_data : - txt - else : - if savingdata : txt else : "\MPdata{" & decimal charcode & "}{" & txt & "}" fi & "%" - fi to data_mpd_file ; + lua.mp.save_data(txt); enddef ; def startsavingdata = - savingdata := true ; - savingdatadone := true ; - if collapse_data : - write "\MPdata{" & decimal charcode & "}{%" to data_mpd_file ; - fi ; + lua.mp.start_saving_data(); enddef ; def stopsavingdata = - if collapse_data : - write "}%" to data_mpd_file ; - fi ; - savingdata := false ; + lua.mp.stop_saving_data() ; enddef ; def finishsavingdata = - if savingdatadone : - write EOF to data_mpd_file ; - savingdatadone := false ; - fi ; + lua.mp.finish_saving_data() ; enddef ; %D Instead of a keystroke eating save and allocation @@ -1204,8 +1181,53 @@ enddef ; %D Interesting too: +% primarydef p paralleled d = ( +% p shifted if d < 0 : - fi ((point abs(d) on (p rotatedaround(point 0 of p,90))) - point 0 of p) +% ) enddef ; +% +% primarydef p paralleled d = ( +% p shifted ((d*unitvector(direction 0 of p) - point 0 of p) rotated 90) +% ) enddef ; +% +% Alan came up with an improved version and stepwise we ended up with (or +% might up with a variant of): + +vardef perpendicular expr t of p = + unitvector((direction t of p) rotated 90) +enddef ; + +def istextext(expr p) = + (picture p and ((substring(0,3) of prescriptpart p) = "tx_")) +enddef ; + primarydef p paralleled d = ( - p shifted if d < 0 : - fi ((point abs(d) on (p rotatedaround(point 0 of p,90))) - point 0 of p) + if path p : + begingroup ; + save dp ; pair dp ; + for i=0 upto length p if cycle p : -1 fi : + hide(dp := d * perpendicular i of p) + if i > 0 : .. fi + (point i of p + dp) + if i < length p : + .. controls (postcontrol i of p + dp) and + (precontrol (i+1) of p + dp) + fi + endfor + if cycle p : .. cycle fi + endgroup + elseif picture p : + image( + for i within p : + draw (pathpart i) + if not istextext(i) : % dirty trick + paralleled d + fi + mfun_decoration_i i ; + endfor ; + ) + elseif pair p : + p + fi ) enddef ; vardef punked primary p = @@ -1291,6 +1313,7 @@ enddef ; newinternal ahvariant ; ahvariant := 0 ; newinternal ahdimple ; ahdimple := 1/5 ; +newinternal ahscale ; ahscale := 3/4 ; vardef arrowhead expr p = save q, e, r ; @@ -1333,7 +1356,8 @@ def resetarrows = ahangle := 45 ; ahvariant := 0 ; ahdimple := 1/5 ; - ) + ahscale := 3/4 ; +) enddef ; %D Points. @@ -1690,7 +1714,9 @@ def mfun_with_arrow_picture (text t) = mfun_arrow_count := 0 ; mfun_arrow_snippets := stroked_paths(mfun_arrow_picture) ; for i within mfun_arrow_picture : - if stroked i : + if istextext(i) : + draw i + else : mfun_arrow_count := mfun_arrow_count + 1 ; mfun_arrow_path := pathpart i ; t @@ -1719,13 +1745,12 @@ def mfun_draw_arrow_picture_double text t = fi mfun_with_arrow_picture ( draw - if mfun_arrow_count = 1 : - arrowpath reverse - fi - if mfun_arrow_count = mfun_arrow_snippets : - arrowpath - fi - mfun_arrow_path mfun_decoration_i i t ; + if mfun_arrow_count = 1 : + arrowpath reverse + elseif mfun_arrow_count = mfun_arrow_snippets : + arrowpath + fi + mfun_arrow_path mfun_decoration_i i t ; if mfun_arrow_count = 1 : fillup arrowhead reverse mfun_arrow_path mfun_decoration_i i t ; fi @@ -1736,6 +1761,65 @@ def mfun_draw_arrow_picture_double text t = endgroup ; enddef ; +%D Some more arrow magic, by Alan: + +def drawdoublearrows expr p = + begingroup ; + save mfun_arrow_path ; + path mfun_arrow_path ; + save mfun_arrow_path_parallel ; + path mfun_arrow_path_parallel ; + if path p : + mfun_arrow_path := p ; + expandafter mfun_draw_arrow_paths + elseif picture p : + save mfun_arrow_picture ; + picture mfun_arrow_picture ; + mfun_arrow_picture := p ; + expandafter mfun_draw_arrow_pictures + else : + expandafter mfun_draw_arrow_nothing + fi +enddef ; + +def mfun_draw_arrow_paths text t = + if autoarrows : + set_ahlength(t) ; + fi + save d ; d := ahscale*ahlength*sind(ahangle/2) ; + mfun_arrow_path_parallel := mfun_arrow_path paralleled d ; + draw arrowpath mfun_arrow_path_parallel t ; + fillup arrowhead mfun_arrow_path_parallel t ; + mfun_arrow_path_parallel := (reverse mfun_arrow_path) paralleled d ; + draw arrowpath mfun_arrow_path_parallel t ; + fillup arrowhead mfun_arrow_path_parallel t ; + endgroup ; +enddef ; + +def mfun_draw_arrow_pictures text t = + if autoarrows : + set_ahlength(t) ; + fi + save d ; d := ahscale*ahlength*sind(ahangle/2) ; + mfun_with_arrow_picture( + if mfun_arrow_count = 1 : + draw (mfun_arrow_path paralleled d) mfun_decoration_i i t ; + mfun_arrow_path_parallel := (reverse mfun_arrow_path) paralleled d ; + draw arrowpath mfun_arrow_path_parallel mfun_decoration_i i t ; + fillup arrowhead mfun_arrow_path_parallel mfun_decoration_i i t ; + elseif mfun_arrow_count = mfun_arrow_snippets : + draw ((reverse mfun_arrow_path) paralleled d) mfun_decoration_i i t ; + mfun_arrow_path_parallel := mfun_arrow_path paralleled d ; + draw arrowpath mfun_arrow_path_parallel mfun_decoration_i i t ; + fillup arrowhead mfun_arrow_path_parallel mfun_decoration_i i t ; + else : + draw ( mfun_arrow_path paralleled d) mfun_decoration_i i t ; + draw ((reverse mfun_arrow_path) paralleled d) mfun_decoration_i i t ; + fi + ) + endgroup ; +enddef ; + %D Handy too ...... vardef pointarrow (expr pat, loc, len, off) = @@ -3222,6 +3306,9 @@ def loadmodule expr name = % no vardef fi ; enddef ; +def loadfile (expr filename) = scantokens("input " & filename) enddef ; +def loadimage (expr filename) = image(scantokens("input " & filename);) enddef ; + %D Handy for backgrounds: def drawpathwithpoints expr p = diff --git a/metapost/context/base/mpiv/mp-tres.mpiv b/metapost/context/base/mpiv/mp-tres.mpiv new file mode 100644 index 000000000..335670a98 --- /dev/null +++ b/metapost/context/base/mpiv/mp-tres.mpiv @@ -0,0 +1,186 @@ +%D \module +%D [ file=mp-tres.mpiv, +%D version=2017.11.08, +%D title=\CONTEXT\ \METAPOST\ graphics, +%D subtitle=Pseudo 3D, +%D author=Alan Braslau, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See licen-en.pdf for +%C details. + +%D This module provides simple 3D->2D projections. The code is an adaption of code +%D by Urs Oswald, Dr.sc.math.\ ETH as presented in: +%D +%D \starttyping +%D http://www.ursoswald.ch/metapost/tutorial.html. +%D \stoptyping +%D +%D We need a bit more so it got extended. + +if known context_three : endinput ; fi ; + +boolean context_three ; context_three := true ; + +pair mfun_three_xy ; % this avoids the costly save and allocate +pair mfun_three_yz ; +pair mfun_three_zx ; + +transform Txy ; + +def setTxy(expr ori, ang) = + begingroup + save P, t ; + pair P[] ; + transform t ; + + P0 = ori ; % origin in MetaPost coordinates (bp) + P1 = (left rotated ang) scaled (cosd ang) ; % x axis (in mathematical coordinates) + + % A sort of "cavalier projection". + + % t: maps mathematical 2D coordinates onto MetaPost coordinates. + + t := identity shifted P0 ; % Note: no shift when P0 = origin! + + % Txy: maps the x-y plane of 3D space onto MetaPost coordinates, + % z is the vertical (MetaPost y). + + % Txy:=identity + % reflectedabout((0,0), (1,1)) + % yscaled ypart P1 + % slanted (xpart P1/ypart P1) + % transformed t ; + + % Alternatively, defined via Pxy: + + % Pxy is the projection of the 3D plane z=0 onto the mathematical 2D coordinates. + % Pxy is determined by 3 e q u a t i o n s describing + % how (1,0), (0,1), and (0,0) are mapped + + save Pxy ; + transform Pxy ; + P1 = (1,0) transformed Pxy ; % Pxy: (1,0) --> P1 + (1,0) = (0,1) transformed Pxy ; % (0,1) --> (1,0) + (0,0) = (0,0) transformed Pxy ; % (0,0) --> (0,0) + + % mathematical 2D coordinates --> MetaPost coordinates + + Txy := Pxy transformed t ; + endgroup +enddef ; + +setTxy(origin,60) ; + +%D We already define triplet (as rgbcolor synonym) in in \type {mp-tool.mpiv}: + +let Xpart = redpart ; +let Ypart = greenpart ; +let Zpart = bluepart ; + +primarydef p Xscaled q = + (q*Xpart p, Ypart p, Zpart p) +enddef ; + +primarydef p Yscaled q = + (Xpart p, q*Ypart p, Zpart p) +enddef ; + +primarydef p Zscaled q = + (Xpart p, Ypart p, q*Zpart p) +enddef ; + +primarydef p XYZscaled q = + (q*Xpart p,q*Ypart p,q*Zpart p) +enddef ; + +vardef projection expr t = + if triplet t : + (Xpart t, Ypart t) transformed Txy shifted (0,Zpart t) + elseif pair t : + t transformed Txy + else : + origin transformed Txy + fi +enddef ; + +%D This overloads the plain macro \type {abs} (being \type {length}): + +vardef abs primary p = + if triplet p : + sqrt((Xpart p)**2+(Ypart p)**2+(Zpart p)**2) + else : + length p + fi +enddef ; + +primarydef p dotproduct q = + ((Xpart p)*(Xpart q) + (Ypart p)*(Ypart q) + (Zpart p)*(Zpart q)) +enddef ; + +primarydef p crossproduct q = + ( + (Ypart p)*(Zpart q) - (Zpart p)*(Ypart q), + (Zpart p)*(Xpart q) - (Xpart p)*(Zpart q), + (Xpart p)*(Ypart q) - (Ypart p)*(Xpart q) + ) +enddef ; + +primarydef p rotatedaboutX q = + hide ( + mfun_three_yz := (Ypart p, Zpart p) ; + mfun_three_yz := mfun_three_yz rotated q ; + ) + (Xpart p, xpart mfun_three_yz, ypart mfun_three_yz) +enddef ; + +primarydef p rotatedaboutY q = + hide( + mfun_three_zx := (Zpart p, Xpart p) ; + mfun_three_zx := mfun_three_zx rotated q ; + ) + (ypart mfun_three_zx, Ypart p, xpart mfun_three_zx) +enddef ; + +primarydef p rotatedaboutZ q = + hide ( + mfun_three_xy := (Xpart p, Ypart p) ; + mfun_three_xy := mfun_three_xy rotated q ; + ) + (xpart mfun_three_xy, ypart mfun_three_xy, Zpart p) +enddef ; + +%D We can use a rotation about an arbitrary direction t ... (easy) + +% primarydef p rotatedabout(expr t, a) = +% enddef ; + +vardef draw_vector@# (expr v, s) text t = + if triplet v : + drawarrow projection(Origin) -- projection(v) t ; + if string s : + label@#(s, projection(v)) t ; + fi + fi +enddef ; + +%D Some constants... + +triplet Origin, Xunitvector, Yunitvector, Zunitvector ; + +Origin := (0,0,0) ; +Xunitvector := (1,0,0) ; +Yunitvector := (0,1,0) ; +Zunitvector := (0,0,1) ; + +%D We could do but don't: + +% let normalxpart = xpart ; +% let normalypart = ypart ; + +% vardef xpart expr p = if triplet p : redpart else : normalxpart fi p enddef ; +% vardef ypart expr p = if triplet p : greenpart else : normalypart fi p enddef ; +% vardef zpart expr p = bluepart p enddef ; + diff --git a/scripts/context/lua/mtx-base.lua b/scripts/context/lua/mtx-base.lua index bd6749717..bcc9aeb60 100644 --- a/scripts/context/lua/mtx-base.lua +++ b/scripts/context/lua/mtx-base.lua @@ -51,8 +51,6 @@ local report = application.report -- private option --noluc for testing errors in the stub -local instance = resolvers.instance - local pattern = environment.arguments["pattern"] or nil local fileformat = environment.arguments["format"] or "" -- nil ? local allresults = environment.arguments["all"] or false @@ -108,7 +106,7 @@ elseif pattern then -- brrr resolvers.load() resolvers.dowithfilesandreport(resolvers.findfiles, { pattern }, fileformat, allresults) elseif environment.arguments["generate"] then - instance.renewcache = true + resolvers.renewcache() trackers.enable("resolvers.locating") resolvers.load() elseif environment.arguments["make"] or environment.arguments["ini"] or environment.arguments["compile"] then diff --git a/scripts/context/lua/mtx-context.lua b/scripts/context/lua/mtx-context.lua index 6863cffb2..f380dc6ff 100644 --- a/scripts/context/lua/mtx-context.lua +++ b/scripts/context/lua/mtx-context.lua @@ -34,7 +34,7 @@ local formatters = string.formatters local application = logs.application { name = "mtx-context", - banner = "ConTeXt Process Management 1.01", + banner = "ConTeXt Process Management 1.02", -- helpinfo = helpinfo, -- table with { category_a = text_1, category_b = text_2 } or helpstring or xml_blob helpinfo = "mtx-context.xml", } @@ -192,6 +192,7 @@ local temporary_runfiles = { local temporary_suffixes = { "prep", -- context preprocessed } + local synctex_runfiles = { "synctex", "synctex.gz", "syncctx" -- synctex } @@ -435,13 +436,22 @@ local function pdf_open(name,method) pdfview = pdfview or dofile(resolvers.findfile("l-pdfview.lua","tex")) pdfview.setmethod(method) report(pdfview.status()) - pdfview.open(filenewsuffix(name,"pdf")) + local pdfname = filenewsuffix(name,"pdf") + if not lfs.isfile(pdfname) then + pdfname = name .. ".pdf" -- agressive + end + pdfview.open(pdfname) end local function pdf_close(name,method) pdfview = pdfview or dofile(resolvers.findfile("l-pdfview.lua","tex")) pdfview.setmethod(method) - pdfview.close(filenewsuffix(name,"pdf")) + local pdfname = filenewsuffix(name,"pdf") + if lfs.isfile(pdfname) then + pdfview.close(pdfname) + end + pdfname = name .. ".pdf" -- agressive + pdfview.close(pdfname) end -- result file handling @@ -581,17 +591,6 @@ local function run_texexec(filename,a_purge,a_purgeall) end end --- context mode will become the only method some day - -local function check_synctex(a_synctex) -- context is intercepted elsewhere - return a_synctex and ( - tonumber(a_synctex) or - (toboolean(a_synctex,true) and 1) or - (a_synctex == "zipped" and 1) or - (a_synctex == "unzipped" and -1) - ) or nil -end - function scripts.context.run(ctxdata,filename) -- local a_nofile = getargument("nofile") @@ -649,7 +648,6 @@ function scripts.context.run(ctxdata,filename) local a_nonstopmode = getargument("nonstopmode") local a_scollmode = getargument("scrollmode") local a_once = getargument("once") - local a_synctex = getargument("syncctx") and "context" or getargument("synctex") local a_backend = getargument("backend") local a_arrange = getargument("arrange") local a_noarrange = getargument("noarrange") @@ -675,7 +673,6 @@ function scripts.context.run(ctxdata,filename) -- a_batchmode = (a_batchmode and "batchmode") or (a_nonstopmode and "nonstopmode") or (a_scrollmode and "scrollmode") or nil - -- a_synctex = check_synctex(a_synctex) -- for i=1,#filelist do -- @@ -702,8 +699,6 @@ function scripts.context.run(ctxdata,filename) -- local analysis = preamble_analyze(filename) -- - a_synctex = a_synctex or analysis.synctex - -- if a_mkii or analysis.engine == 'pdftex' or analysis.engine == 'xetex' then run_texexec(filename,a_purge,a_purgeall) elseif plain_format(a_texformat or analysis.texformat) then @@ -741,7 +736,10 @@ function scripts.context.run(ctxdata,filename) if formatfile and scriptfile then local suffix = validstring(getargument("suffix")) local resultname = validstring(getargument("result")) - if suffix then + local resultpath = file.pathpart(resultname) + if resultpath ~= "" then + resultname = nil + elseif suffix then resultname = removesuffix(jobname) .. suffix end local oldbase = "" @@ -810,9 +808,9 @@ function scripts.context.run(ctxdata,filename) -- local l_flags = { ["interaction"] = a_batchmode, - ["synctex"] = check_synctex(a_synctex), -- otherwise not working - ["no-parse-first-line"] = true, -- obsolete - ["safer"] = a_safer, -- better use --sandbox + -- ["synctex"] = false, -- context has its own way + ["no-parse-first-line"] = true, -- obsolete + ["safer"] = a_safer, -- better use --sandbox -- ["no-mktex"] = true, -- ["file-line-error-style"] = true, ["fmt"] = formatfile, @@ -836,7 +834,7 @@ function scripts.context.run(ctxdata,filename) directives[#directives+1] = format("backend.date=%s",type(a_nodates) == "string" and a_nodates or " no") end -- - if a_trailerid then + if type(a_trailerid) == "string" then directives[#directives+1] = format("backend.trailerid=%s",a_trailerid) end -- @@ -847,9 +845,6 @@ function scripts.context.run(ctxdata,filename) for i=1,#synctex_runfiles do removefile(fileaddsuffix(jobname,synctex_runfiles[i])) end - if a_synctex then - directives[#directives+1] = format("system.synctex=%s",a_synctex) - end -- if #directives > 0 then c_flags.directives = concat(directives,",") @@ -905,9 +900,13 @@ function scripts.context.run(ctxdata,filename) -- end -- - if a_synctex == "context" then - renamefile(fileaddsuffix(jobname,"syncctx"),fileaddsuffix(jobname,"synctex")) + -- this will go away after we update luatex + -- + local syncctx = fileaddsuffix(jobname,"syncctx") + if validfile(syncctx) then + renamefile(syncctx,fileaddsuffix(jobname,"synctex")) end + -- if a_arrange then -- c_flags.final = true @@ -944,6 +943,10 @@ function scripts.context.run(ctxdata,filename) result_save_keep(oldbase,newbase) end report("result renamed to: %s",newbase) + elseif resultpath ~= "" then + report() + report("results are to be on the running path, not on %a, ignoring --result",resultpath) + report() end -- -- -- needs checking @@ -1173,7 +1176,7 @@ do -- more or less copied from mtx-plain.lua: end function scripts.context.generate() - resolvers.instance.renewcache = true + resolvers.renewcache() trackers.enable("resolvers.locating") resolvers.load() end @@ -1316,12 +1319,6 @@ function scripts.context.purge_job(jobname,all,mkiitoo,fulljobname) deleted[#deleted+1] = purge_file(fileaddsuffix(fulljobname,temporary_suffixes[i],true)) end end - if not environment.argument("synctex") then - -- special case: not deleted when --synctex is given, but what if given in preamble - for i=1,#synctex_runfiles do - deleted[#deleted+1] = purge_file(fileaddsuffix(filebase,synctex_runfiles[i])) - end - end if all then for i=1,#persistent_runfiles do deleted[#deleted+1] = purge_file(fileaddsuffix(filebase,persistent_runfiles[i])) @@ -1755,6 +1752,13 @@ do directives.enable("logs.blocked") end + local errors = getargument("errors") + if type(errors) == "errors" then + directives.enable(format("logs.errors={%s}",silent)) + elseif errors then + directives.enable("logs.errors") + end + end if getargument("once") then diff --git a/scripts/context/lua/mtx-context.xml b/scripts/context/lua/mtx-context.xml index 25e92d7a6..9003b549a 100644 --- a/scripts/context/lua/mtx-context.xml +++ b/scripts/context/lua/mtx-context.xml @@ -70,6 +70,9 @@ <flag name="silent" value="list"> <short>disable logcatgories (show list with <ref name="showlogcategories"/>)</short> </flag> + <flag name="errors" value="list"> + <short>show errors at the end of a run, quit when in list (also when <ref name="--silent"/>)</short> + </flag> <flag name="noconsole"> <short>disable logging to the console (logfile only)</short> </flag> @@ -125,11 +128,11 @@ <flag name="nonstopmode"> <short>run without stopping</short> </flag> - <flag name="synctex"> - <short>run with synctex enabled (optional value: zipped, unzipped, 1, -1, context)</short> + <flag name="nosynctex"> + <short>never initializes synctex (for production runs)</short> </flag> - <flag name="syncttx"> - <short>a shortcut for --synctex=context</short> + <flag name="synctex"> + <short>run with synctex enabled (better use \setupsynctex[state=start]</short> </flag> <flag name="nodates"> <short>omit runtime dates in pdf file (optional value: a number (this 1970 offset time) or string "YYYY-MM-DD HH:MM")</short> diff --git a/scripts/context/lua/mtx-evohome.lua b/scripts/context/lua/mtx-evohome.lua new file mode 100644 index 000000000..7fd8612ec --- /dev/null +++ b/scripts/context/lua/mtx-evohome.lua @@ -0,0 +1,122 @@ +if not modules then modules = { } end modules ['mtx-evohome'] = { + version = 1.002, + comment = "script to fetch data from a evohome device", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE", + license = "see context related readme files" +} + +local evohome = require("util-evo") + +local formatters = string.formatters + +-- the script + +local helpinfo = [[ +<?xml version="1.0"?> +<application> + <metadata> + <entry name="name">mtx-evohome</entry> + <entry name="detail">Evohome Fetcher</entry> + <entry name="version">1.00</entry> + </metadata> + <flags> + <category name="basic"> + <subcategory> + <flag name="collect"><short>collect data from device</short></flag> + <flag name="presets"><short>file with authenciation data</short></flag> + <flag name="auto"><short>fetch temperature data every hour</short></flag> + <flag name="port"><short>server port when running the service, default: 8068</short></flag> + <flag name="host"><short>server host when running the service, default: localhost</short></flag> + </subcategory> + </category> + </flags> + <examples> + <category> + <title>Example</title> + <subcategory> + <example><command>mtxrun --script evohome --collect --presets=c:/data/develop/domotica/code/evohome-presets.lua</command></example> + <example><command>mtxrun --script evohome --server --presets=c:/data/develop/domotica/code/evohome-presets.lua</command></example> + </subcategory> + </category> + </examples> +</application> +]] + +local application = logs.application { + name = "mtx-evohome", + banner = "Evohome Fetcher 1.00", + helpinfo = helpinfo, +} + +local report = application.report + +scripts = scripts or { } +scripts.evohome = scripts.evohome or { } + +local arguments = environment.arguments +local files = environment.files + +function scripts.evohome.collect() + local presets = arguments.presets + local delay = tonumber(arguments.delay) or 15*60*60 + if presets then + presets = evohome.helpers.loadpresets(presets) + end + if presets then + local function fetch() + report("current time %a",os.now()) + evohome.helpers.updatetemperatures(presets) + end + if arguments.auto then + while true do + fetch() + report("sleeping for %i seconds",delay) + io.flush() + os.sleep(delay) + end + else + fetch(presets) + end + else + report("invalid preset file") + end +end + +function scripts.evohome.update() + local presets = arguments.presets + if presets then + presets = evohome.helpers.loadpresets(presets) + end + if presets then + evohome.helpers.geteverything(presets) + else + report("invalid preset file") + end +end + +function scripts.evohome.server() + local presets = arguments.presets + if presets then + require("util-evo-imp-server") + evohome.server { + filename = presets, -- e:/domotica/code/evohome-presets.lua + host = arguments.host, + port = tonumber(arguments.port), + } + else + report("invalid preset file") + end +end + +if environment.argument("collect") then + scripts.evohome.collect() +elseif environment.argument("update") then + scripts.evohome.update() +elseif environment.argument("server") then + scripts.evohome.server() +elseif environment.argument("exporthelp") then + application.export(environment.argument("exporthelp"),environment.files[1]) +else + application.help() +end diff --git a/scripts/context/lua/mtx-fonts.lua b/scripts/context/lua/mtx-fonts.lua index 068d38a84..9b23f55c4 100644 --- a/scripts/context/lua/mtx-fonts.lua +++ b/scripts/context/lua/mtx-fonts.lua @@ -16,8 +16,7 @@ local lower = string.lower local concat = table.concat local write_nl = texio.write_nl -local otfversion = 2.826 -local otlversion = 3.029 +local otlversion = 3.103 local helpinfo = [[ <?xml version="1.0"?> @@ -25,13 +24,12 @@ local helpinfo = [[ <metadata> <entry name="name">mtx-fonts</entry> <entry name="detail">ConTeXt Font Database Management</entry> - <entry name="version">0.21</entry> + <entry name="version">1.00</entry> </metadata> <flags> <category name="basic"> <subcategory> - <flag name="save"><short>save open type font in raw table (ff format)</short></flag> - <flag name="convert"><short>save open type font in raw table (ctx format)</short></flag> + <flag name="convert"><short>save open type font in raw table</short></flag> <flag name="unpack"><short>save a tma file in a more readable format</short></flag> </subcategory> <subcategory> @@ -80,7 +78,6 @@ local helpinfo = [[ <example><command>mtxrun --script font --list --file --pattern=*somename*</command></example> </subcategory> <subcategory> - <example><command>mtxrun --script font --save texgyrepagella-regular.otf</command></example> <example><command>mtxrun --script font --convert texgyrepagella-regular.otf</command></example> <example><command>mtxrun --script font --convert --names texgyrepagella-regular.otf</command></example> </subcategory> @@ -108,14 +105,20 @@ local function loadmodule(filename) end end --- old loader code - -loadmodule("font-otp.lua") -- we need to unpack the font for analysis - --- new loader code +-- loader code loadmodule("char-def.lua") +loadmodule("font-ini.lua") +loadmodule("font-log.lua") +loadmodule("font-con.lua") +loadmodule("font-cft.lua") +loadmodule("font-enc.lua") +loadmodule("font-agl.lua") +loadmodule("font-cid.lua") +loadmodule("font-map.lua") +loadmodule("font-oti.lua") + loadmodule("font-otr.lua") loadmodule("font-cff.lua") loadmodule("font-ttf.lua") @@ -123,6 +126,7 @@ loadmodule("font-tmp.lua") loadmodule("font-dsp.lua") loadmodule("font-oup.lua") +loadmodule("font-otl.lua") loadmodule("font-onr.lua") -- extra code @@ -293,6 +297,7 @@ local function showfeatures(tag,specification) report("no features") end report() + collectgarbage("collect") end local function reloadbase(reload) @@ -345,6 +350,7 @@ local function list_matches(t,info) for k=1,#s do local v = s[k] showfeatures(v,t[v]) + collectgarbage("collect") -- in case we load a lot end else for k=1,#s do @@ -419,7 +425,7 @@ function scripts.fonts.list() end elseif pattern then --~ mtxrun --script font --list --pattern=*somename* - list_matches(fonts.names.list(string.topattern(pattern,true),reload,all),info) + list_matches(fonts.names.list(string.topattern(pattern,true),reload,all),info) elseif given then --~ mtxrun --script font --list somename list_matches(fonts.names.list(given,reload,all),info) @@ -432,18 +438,6 @@ function scripts.fonts.list() end -function scripts.fonts.justload() - local fullname = environment.files[1] - if fullname then - local result = fontloader.open(fullname) - if type(result) == "table" then - report("loading %s: %s","succeeded",fullname) - fontloader.close(result) - end - end - report("loading %s: %s","failed",fullname) -end - function scripts.fonts.unpack() local name = removesuffix(basename(givenfiles[1] or "")) if name and name ~= "" then @@ -456,8 +450,6 @@ function scripts.fonts.unpack() report("fontsave, saving data in %s",savename) if data.creator == "context mkiv" then fonts.handlers.otf.readers.unpack(data) - else - fonts.handlers.otf.unpackdata(data) end io.savedata(savename,table.serialize(data,true)) else @@ -466,51 +458,6 @@ function scripts.fonts.unpack() end end -function scripts.fonts.save() - local name = givenfiles[1] or "" - local sub = givenfiles[2] or "" - local function save(savename,fontblob) - if fontblob then - if fontblob.validation_state and table.contains(fontblob.validation_state,"bad_ps_fontname") then - report("ignoring bad fontname for %a",name) - savename = nameonly(name) .. "-bad-ps-name" - end - savename = addsuffix(lower(savename),"lua") - report("fontsave, saving data in %a",savename) - table.tofile(savename,fontloader.to_table(fontblob),"return") - fontloader.close(fontblob) - end - end - if name and name ~= "" then - local filename = resolvers.findfile(name) -- maybe also search for opentype - if filename and filename ~= "" then - local suffix = lower(suffix(filename)) - if suffix == 'ttf' or suffix == 'otf' or suffix == 'ttc' or suffix == "dfont" then - local fontinfo = fontloader.info(filename) - if fontinfo then - report("font: %a located as %a",name,filename) - if #fontinfo > 0 then - for k=1,#fontinfo do - local v = fontinfo[k] - save(v.fontname,fontloader.open(filename,v.fullname)) - end - else - save(fontinfo.fullname,fontloader.open(filename)) - end - else - report("font: %a cannot be read",filename) - end - else - report("font: %a not saved",filename) - end - else - report("font: %a not found",name) - end - else - report("font: no name given") - end -end - function scripts.fonts.convert() -- new save local name = givenfiles[1] or "" local sub = givenfiles[2] or "" @@ -550,12 +497,8 @@ if getargument("list") then scripts.fonts.list() elseif getargument("reload") then scripts.fonts.reload() -elseif getargument("save") then - scripts.fonts.save() elseif getargument("convert") then scripts.fonts.convert() -elseif getargument("justload") then - scripts.fonts.justload() elseif getargument("unpack") then scripts.fonts.unpack() elseif getargument("statistics") then diff --git a/scripts/context/lua/mtx-interface.lua b/scripts/context/lua/mtx-interface.lua index 876a073e8..85ccb3ca0 100644 --- a/scripts/context/lua/mtx-interface.lua +++ b/scripts/context/lua/mtx-interface.lua @@ -35,6 +35,7 @@ local helpinfo = [[ <flag name="text"><short>create text files for commands and environments</short></flag> <flag name="raw"><short>report commands to the console</short></flag> <flag name="check"><short>generate check file</short></flag> + <flag name="meaning"><short>report the mening of commands</short></flag> </subcategory> <subcategory> <flag name="toutf"><short>replace named characters by utf</short></flag> @@ -44,6 +45,9 @@ local helpinfo = [[ <flag name="suffix"><short>use given suffix for output files</short></flag> <flag name="force"><short>force action even when in doubt</short></flag> </subcategory> + <subcategory> + <flag name="pattern"><short>a pattern for meaning lookups</short></flag> + </subcategory> </category> </flags> </application> @@ -86,9 +90,31 @@ end function flushers.scite(collected) local data = { } +-- for interface, whatever in next, collected do +-- data[interface] = whatever.commands +-- end + local function add(target,origin,field) + if origin then + local list = origin[field] + if list then + for i=1,#list do + target[list[i]] = true + end + end + end + end + -- for interface, whatever in next, collected do - data[interface] = whatever.commands + local combined = { } + add(combined,whatever,"commands") + add(combined,whatever,"environments") + if interface == "common" then + add(combined,whatever,"textnames") + add(combined,whatever,"mathnames") + end + data[interface] = sortedkeys(combined) end + -- collect("scite-context-data-interfaces", "context", data) collect("scite-context-data-metapost", "metapost", dofile(resolvers.findfile("mult-mps.lua"))) collect("scite-context-data-metafun", "metafun", dofile(resolvers.findfile("mult-fun.lua"))) @@ -227,15 +253,15 @@ function flushers.textpad(collected) end end --- we could instead load context-en.xml - function scripts.interface.editor(editor,split,forcedinterfaces) + require("char-def") + local interfaces = forcedinterfaces or environment.files if #interfaces == 0 then interfaces= userinterfaces end -- --- local filename = "i-context.xml" + -- local filename = "i-context.xml" local filename = "context-en.xml" local xmlfile = resolvers.findfile(filename) or "" if xmlfile == "" then @@ -264,32 +290,33 @@ function scripts.interface.editor(editor,split,forcedinterfaces) report("generating files for %a",editor) report("loading %a",xmlfile) local xmlroot = xml.load(xmlfile) --- xml.include(xmlroot,"cd:interfacefile","filename",true,function(s) --- local fullname = resolvers.findfile(s) --- if fullname and fullname ~= "" then --- report("including %a",fullname) --- return io.loaddata(fullname) --- end --- end) --- local definitions = { } --- for e in xml.collected(xmlroot,"cd:interface/cd:define") do --- definitions[e.at.name] = e.dt --- end --- local function resolve(root) --- for e in xml.collected(root,"*") do --- if e.tg == "resolve" then --- local resolved = definitions[e.at.name or ""] --- if resolved then --- -- use proper replace helper --- e.__p__.dt[e.ni] = resolved --- resolved.__p__ = e.__p__ --- resolve(resolved) --- end --- end --- end --- end --- resolve(xmlroot) - -- + -- xml.include(xmlroot,"cd:interfacefile","filename",true,function(s) + -- local fullname = resolvers.findfile(s) + -- if fullname and fullname ~= "" then + -- report("including %a",fullname) + -- return io.loaddata(fullname) + -- end + -- end) + -- local definitions = { } + -- for e in xml.collected(xmlroot,"cd:interface/cd:define") do + -- definitions[e.at.name] = e.dt + -- end + -- local function resolve(root) + -- for e in xml.collected(root,"*") do + -- if e.tg == "resolve" then + -- local resolved = definitions[e.at.name or ""] + -- if resolved then + -- -- use proper replace helper + -- e.__p__.dt[e.ni] = resolved + -- resolved.__p__ = e.__p__ + -- resolve(resolved) + -- end + -- end + -- end + -- end + -- resolve(xmlroot) + + -- todo: use sequence for i=1,#interfaces do local interface = interfaces[i] @@ -304,13 +331,40 @@ function scripts.interface.editor(editor,split,forcedinterfaces) if name ~= "" then local c = commands[name] local n = c and (c[interface] or c.en) or name + local sequence = xml.all(e,"/cd:sequence/*") if at.generated == "yes" then for e in xml.collected(e,"/cd:instances/cd:constant") do local name = e.at.value if name then local c = variables[name] local n = c and (c[interface] or c.en) or name - if type == "environment" then + if sequence then + local done = { } + for i=1,#sequence do + local e = sequence[i] + if e.tg == "string" then + local value = e.at.value + if value then + done[i] = value + else + done = false + break + end + else + local tg = e.tg + if tg == "instance" or tg == "instance:assignment" or tg == "instance:ownnumber" then + done[i] = name + else + done = false + break + end + end + end + if done then + n = concat(done) + end + end + if type ~= "environment" then i_commands[n] = true elseif split then i_environments[n] = true @@ -334,12 +388,80 @@ function scripts.interface.editor(editor,split,forcedinterfaces) end if next(i_commands) then collected[interface] = { - commands = sortedkeys(i_commands), - environments = sortedkeys(i_environments), + commands = i_commands, + environments = i_environments, } end end -- + local commoncommands = { } + local commonenvironments = { } + for k, v in next, collected do + local c = v.commands + local e = v.environments + if k == "en" then + for k, v in next, c do + commoncommands[k] = true + end + for k, v in next, e do + commonenvironments[k] = true + end + else + for k, v in next, c do + if not commoncommands[k] then + commoncommands[k] = nil + end + end + for k, v in next, e do + if not commonenvironments[k] then + commonenvironments[k] = nil + end + end + end + end + for k, v in next, collected do + local c = v.commands + local e = v.environments + for k, v in next, commoncommands do + c[k] = nil + end + for k, v in next, commonenvironments do + e[k] = nil + end + v.commands = sortedkeys(c) + v.environments = sortedkeys(e) + end + -- + local mathnames = { } + local textnames = { } + for k, v in next, characters.data do + local name = v.contextname + if name then + textnames[name] = true + end + local name = v.mathname + if name then + mathnames[name] = true + end + local spec = v.mathspec + if spec then + for i=1,#spec do + local s = spec[i] + local name = s.name + if name then + mathnames[name] = true + end + end + end + end + -- + collected.common = { + textnames = sortedkeys(textnames), + mathnames = sortedkeys(mathnames), + commands = sortedkeys(commoncommands), + environments = sortedkeys(commonenvironments), + } + -- flushers[editor](collected) end @@ -452,8 +574,8 @@ function scripts.interface.mkii() end function scripts.interface.preprocess() - dofile(resolvers.findfile("luat-mac.lua")) - -- require("luat-mac.lua") + require("luat-mac") + local newsuffix = environment.argument("suffix") or "log" local force = environment.argument("force") for i=1,#environment.files do @@ -470,10 +592,45 @@ function scripts.interface.preprocess() end end +function scripts.interface.bidi() + require("char-def") + + local directiondata = { } + local mirrordata = { } + local textclassdata = { } + + local data = { + comment = "generated by: mtxrun -- script interface.lua --bidi", + direction = directions, + mirror = mirrors, + textclass = textclasses, + } + + for k, d in next, characters.data do + local direction = d.direction + local mirror = d.mirror + local textclass = d.textclass + if direction and direction ~= "l" then + directiondata[k] = direction + end + if mirror then + mirrordata[k] = mirror + end + if textclass then + textclassdata[k] = textclass + end + end + + local filename = "scite-context-data-bidi.lua" + + report("saving %a",filename) + table.save(filename,data) +end + function scripts.interface.toutf() local filename = environment.files[1] if filename then - require("char-def.lua") + require("char-def") local contextnames = { } for unicode, data in next, characters.data do local contextname = data.contextname @@ -487,7 +644,7 @@ function scripts.interface.toutf() contextnames.aumlaut = contextnames.adiaeresis contextnames.Aumlaut = contextnames.Adiaeresis end - report("loading '%s'",filename) + report("loading %a",filename) local str = io.loaddata(filename) or "" local done = { } str = gsub(str,"(\\)([a-zA-Z][a-zA-Z][a-zA-Z]+)(%s*)", function(b,s,a) @@ -508,19 +665,43 @@ function scripts.interface.toutf() end end filename = filename .. ".toutf" - report("saving '%s'",filename) + report("saving %a",filename) io.savedata(filename,str) end end +function scripts.interface.meaning() + local runner = "mtxrun --silent --script context --extra=meaning --once --noconsole --nostatistics" + local pattern = environment.arguments.pattern + local files = environment.files + if type(pattern) == "string" then + runner = runner .. ' --pattern="' .. pattern .. '"' + elseif files and #files > 0 then + for i=1,#files do + runner = runner .. ' "' .. files[i] .. '"' + end + else + return + end + local r = os.resultof(runner) + if type(r) == "string" then + r = gsub(r,"^.-(meaning%s+>)","\n%1") + print(r) + end +end + local ea = environment.argument if ea("mkii") then scripts.interface.mkii() elseif ea("preprocess") then scripts.interface.preprocess() +elseif ea("meaning") then + scripts.interface.meaning() elseif ea("toutf") then scripts.interface.toutf() +elseif ea("bidi") then + scripts.interface.bidi() elseif ea("check") then scripts.interface.check() elseif ea("scite") or ea("bbedit") or ea("jedit") or ea("textpad") or ea("text") or ea("raw") then diff --git a/scripts/context/lua/mtx-modules.lua b/scripts/context/lua/mtx-modules.lua index 572e6a304..78e1418fd 100644 --- a/scripts/context/lua/mtx-modules.lua +++ b/scripts/context/lua/mtx-modules.lua @@ -6,6 +6,8 @@ if not modules then modules = { } end modules ['mtx-modules'] = { license = "see context related readme files" } +-- should be an extra + scripts = scripts or { } scripts.modules = scripts.modules or { } @@ -23,6 +25,7 @@ local helpinfo = [[ <flag name="convert"><short>convert source files (tex, mkii, mkiv, mp) to 'ted' files</short></flag> <flag name="process"><short>process source files (tex, mkii, mkiv, mp) to 'pdf' files</short></flag> <flag name="prep"><short>use original name with suffix 'prep' appended</short></flag> + <flag name="direct"><short>use old method instead of extra</short></flag> </subcategory> </category> </flags> @@ -160,32 +163,51 @@ local function source_to_ted(inpname,outname,filetype) return true end -local suffixes = table.tohash { 'tex','mkii','mkiv', 'mkvi', 'mp' } +local suffixes = table.tohash { 'tex', 'mkii', 'mkiv', 'mkvi', 'mp', 'mpii', 'mpiv' } function scripts.modules.process(runtex) local processed = { } - local prep = environment.argument("prep") - local files = environment.files - for i=1,#files do - local shortname = files[i] - local suffix = file.suffix(shortname) - if suffixes[suffix] then - local longname - if prep then - longname = shortname .. ".prep" - else - longname = file.removesuffix(shortname) .. "-" .. suffix .. ".ted" - end - local done = source_to_ted(shortname,longname) - if done and runtex then - os.execute(format("mtxrun --script context --usemodule=mod-01 --purge %s",longname)) - processed[#processed+1] = longname + local files = environment.files + if environment.arguments.direct then + local prep = environment.argument("prep") + for i=1,#files do + local shortname = files[i] + local suffix = file.suffix(shortname) + if suffixes[suffix] then + local longname + if prep then + longname = shortname .. ".prep" + else + longname = file.removesuffix(shortname) .. "-" .. suffix .. ".ted" + end + local done = source_to_ted(shortname,longname) + if done and runtex then + local command = format("mtxrun --script context --usemodule=module-basic --purge %s",longname) + report() + report("running: %s",command) + report() + os.execute(command) + processed[#processed+1] = longname + end end end + else + for i=1,#files do + local name = files[i] + local only = file.nameonly(name) + local command = format("mtxrun --script context --extra=module --result=%s %s",only,name) + report() + report("running: %s",command) + report() + os.execute(command) + processed[#processed+1] = command + end end - for i=1,#processed do - local name = processed[i] - report("modules","processed: %s",name) + if #processed > 0 then + report() + for i=1,#processed do + report("processed: %s",processed[i]) + end end end diff --git a/scripts/context/lua/mtx-pdf.lua b/scripts/context/lua/mtx-pdf.lua index 0d3f37ad5..371b7f319 100644 --- a/scripts/context/lua/mtx-pdf.lua +++ b/scripts/context/lua/mtx-pdf.lua @@ -116,8 +116,6 @@ local function getfonts(pdffile) for k, v in next, lpdf.epdf.expand(fontlist) do usedfonts[k] = lpdf.epdf.expand(v) end - else - report("no fonts") end end return usedfonts @@ -221,7 +219,7 @@ end -- this is a quick hack ... proof of concept .. will change (derived from luigi's example) ... -- i will make a ctx wrapper -local qpdf +local qpdf -- just call qpdf, no need for a lib here function scripts.pdf.linearize(filename) qpdf = qpdf or swiglib("qpdf.core") diff --git a/scripts/context/lua/mtx-plain.lua b/scripts/context/lua/mtx-plain.lua index 347f63f1d..72cc48f92 100644 --- a/scripts/context/lua/mtx-plain.lua +++ b/scripts/context/lua/mtx-plain.lua @@ -49,13 +49,18 @@ scripts = scripts or { } scripts.plain = scripts.plain or { } local passed_options = table.tohash { - "utc" + "utc", + "synctex", } local function execute(...) local command = format(...) report("running command %a\n",command) - return os.execute(command) + statistics.starttiming() + local status = os.execute(command) + statistics.stoptiming() + report("runtime %s seconds",statistics.elapsedtime()) + return status end local function resultof(...) diff --git a/scripts/context/lua/mtx-server-ctx-fonttest.lua b/scripts/context/lua/mtx-server-ctx-fonttest.lua index ab324d3cb..d5437587b 100644 --- a/scripts/context/lua/mtx-server-ctx-fonttest.lua +++ b/scripts/context/lua/mtx-server-ctx-fonttest.lua @@ -9,17 +9,36 @@ if not modules then modules = { } end modules ['mtx-server-ctx-fonttest'] = { -- probably too much but who cares dofile(resolvers.findfile("trac-lmx.lua","tex")) +dofile(resolvers.findfile("char-def.lua","tex")) + dofile(resolvers.findfile("font-ini.lua","tex")) +dofile(resolvers.findfile("font-log.lua","tex")) dofile(resolvers.findfile("font-con.lua","tex")) --- dofile(resolvers.findfile("font-oti.lua","tex")) --- dofile(resolvers.findfile("font-otf.lua","tex")) --- dofile(resolvers.findfile("font-otp.lua","tex")) +dofile(resolvers.findfile("font-cft.lua","tex")) +dofile(resolvers.findfile("font-enc.lua","tex")) +dofile(resolvers.findfile("font-agl.lua","tex")) +dofile(resolvers.findfile("font-cid.lua","tex")) +dofile(resolvers.findfile("font-map.lua","tex")) dofile(resolvers.findfile("font-otr.lua","tex")) +dofile(resolvers.findfile("font-web.lua","tex")) dofile(resolvers.findfile("font-cff.lua","tex")) --- dofile(resolvers.findfile("font-ttf.lua","tex")) --- dofile(resolvers.findfile("font-ott.lua","tex")) +dofile(resolvers.findfile("font-ttf.lua","tex")) dofile(resolvers.findfile("font-dsp.lua","tex")) +dofile(resolvers.findfile("font-hsh.lua","tex")) +dofile(resolvers.findfile("font-oti.lua","tex")) +dofile(resolvers.findfile("font-ott.lua","tex")) +dofile(resolvers.findfile("font-otl.lua","tex")) +-- dofile(resolvers.findfile("font-oto.lua","tex")) +-- dofile(resolvers.findfile("font-otj.lua","tex")) +dofile(resolvers.findfile("font-oup.lua","tex")) +-- dofile(resolvers.findfile("font-ots.lua","tex")) +-- dofile(resolvers.findfile("font-otd.lua","tex")) +-- dofile(resolvers.findfile("font-otc.lua","tex")) +-- dofile(resolvers.findfile("font-oth.lua","tex")) +-- dofile(resolvers.findfile("font-osd.lua","tex")) +-- dofile(resolvers.findfile("font-ocl.lua","tex")) dofile(resolvers.findfile("font-onr.lua","tex")) + dofile(resolvers.findfile("font-syn.lua","tex")) dofile(resolvers.findfile("font-mis.lua","tex")) @@ -102,7 +121,7 @@ local javascripts = formatters [ [[ function selected_radio(name) { var form = document.forms["main-form"] ; var script = form.elements[name] ; - if (script) { + if (script) { var n = script.length ; if (n) { for (var i=0; i<n; i++) { @@ -110,8 +129,8 @@ function selected_radio(name) { return script[i].value ; } } - } - } + } + } return "" ; } diff --git a/scripts/context/lua/mtx-synctex.lua b/scripts/context/lua/mtx-synctex.lua new file mode 100644 index 000000000..3c4f6ee71 --- /dev/null +++ b/scripts/context/lua/mtx-synctex.lua @@ -0,0 +1,261 @@ +if not modules then modules = { } end modules ['mtx-synctex'] = { + version = 1.002, + comment = "companion to mtxrun.lua", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +-- InverseSearchCmdLine = scite.exe "%f" "-goto:%l" $ +-- InverseSearchCmdLine = mtxrun.exe --script synctex --edit --name="%f" --line="%l" $ + +local tonumber = tonumber +local find, match, gsub = string.find, string.match, string.gsub +local isfile = lfs.isfile +local longtostring = string.longtostring + +local helpinfo = [[ +<?xml version="1.0"?> +<application> + <metadata> + <entry name="name">mtx-synctex</entry> + <entry name="detail">SyncTeX Checker</entry> + <entry name="version">1.00</entry> + </metadata> + <flags> + <category name="basic"> + <subcategory> + <flag name="edit"><short>open file at line: --line=.. --editor=.. sourcefile</short></flag> + <flag name="list"><short>show blob: synctexfile</short></flag> + <flag name="goto"><short>open file at position: --page=.. --x=.. --y=.. --editor=.. synctexfile</short></flag> + <flag name="report"><short>show file and line: --page=.. --x=.. --y=.. --console synctexfile</short></flag> + </subcategory> + </category> + </flags> +</application> +]] + +local application = logs.application { + name = "mtx-synctex", + banner = "ConTeXt SyncTeX Checker 1.00", + helpinfo = helpinfo, +} + +local report = application.report + +local editors = { + console = function(specification) + print(string.formatters["%q %i"](specification.filename,specification.linenumber or 1)) + end, + scite = sandbox.registerrunner { + name = "scite", + program = { + windows = "scite", + unix = "SciTE", + }, + template = longtostring [[ + "%filename%" + "-goto:%linenumber%" + ]], + }, +} + +local function validfile(filename) + if not filename or not isfile(filename) then + report("invalid synctex log file %a",filename) + return false + else + return true + end +end + +local function editfile(filename,line,editor) + if not validfile(filename) then + return + end + local runner = editors[editor or "scite"] or editors.scite + runner { + filename = filename, + linenumber = tonumber(line) or 1, + } +end + +-- In context we only care about explicitly marked horizontal blobs. And this is +-- only a check script. I know of no viewer that calls the synctex command line +-- version. Otherwise we could provide our own simplified variant and even +-- consider a more compact format (for instance we could use an "=" when the value +-- of x y w h d is the same as before, which is actually often the case for y, h +-- and d). + +local factor = (7200/7227)/65536 -- we assume unit 1 +local quit = true -- we only have one hit anyway + +local function findlocation(filename,page,xpos,ypos) + if not validfile(filename) then + return + elseif not page then + page = 1 + elseif not xpos or not ypos then + report("provide x and y coordinates (unit: basepoints)") + return + end + local files = { } + local found = false + local skip = false + local dx = false + local dy = false + local px = xpos / factor + local py = ypos / factor + local fi = 0 + local ln = 0 + for line in io.lines(filename) do + if found then + if find(line,"^}") then + break + else + -- we only look at positive cases + local f, l, x, y, w, h, d = match(line,"^h(.-),(.-):(.-),(.-):(.-),(.-),(.-)$") + if f and f ~= 0 then + x = tonumber(x) + if px >= x then + w = tonumber(w) + if px <= x + w then + y = tonumber(y) + d = tonumber(d) + if py >= y - d then + h = tonumber(h) + if py <= y + h then + if quit then + -- we have no overlapping boxes + fi = f + ln = l + break + else + local lx = px - x + local rx = x + w - px + local by = py - y + d + local ty = y + h - py + mx = lx < rx and lx or rx + my = by < ty and by or ty + if not dx then + dx = mx + dy = my + fi = f + ln = l + else + if mx < dx then + dx = mx + di = f + ln = l + end + if my < dy then + dy = my + fi = f + ln = l + end + end + end + end + end + end + end + end + end + elseif skip then + if find(line,"^}") then + skip = false + end + elseif find(line,"^{(%d+)") then + local p = tonumber(match(line,"^{(%d+)")) + if p == page then + found = true + else + skip = true + end + elseif find(line,"^Input:") then + local id, name = match(line,"^Input:(.-):(.-)$") + if id then + files[id] = name + end + end + end + if fi ~= 0 then + return files[fi], ln + end +end + +local function showlocation(filename) + if not validfile(filename) then + return + end + local files = { } + local found = false + local page = 0 + for line in io.lines(filename) do + if found then + if find(line,"^}") then + found = false + report("end page: %i",page) + else + local f, l, x, y, w, h, d = match(line,"^h(.-),(.-):(.-),(.-):(.-),(.-),(.-)$") + if f then + x = tonumber(x) + y = tonumber(y) + local llx = factor * ( x ) + local lly = factor * ( y - tonumber(d) ) + local urx = factor * ( x + tonumber(w) ) + local ury = factor * ( y + tonumber(h) ) + f = files[f] + if f then + report(" [% 4r % 4r % 4r % 4r] : % 5i : %s",llx,lly,urx,ury,l,f) + end + end + end + elseif find(line,"^{(%d+)") then + page = tonumber(match(line,"^{(%d+)")) + found = true + report("begin page: %i",page) + elseif find(line,"^Input:") then + local id, name = match(line,"^Input:(.-):(.-)$") + if id then + files[id] = name + end + end + end +end + +local function gotolocation(filename,page,xpos,ypos,editor) + if filename then + local target, line = findlocation(filename,tonumber(page),tonumber(xpos),tonumber(ypos)) + if target and line then + if editor then + editfile(target,line,editor) + else + report("filename=%a linenumber=%a",target,line) + end + end + end +end + +-- print(findlocation("oeps.synctex",4,318,348)) +-- print(findlocation("oeps.synctex",40,378,348)) +-- print(gotolocation("oeps.synctex",4,318,348,"scite")) +-- print(showlocation("oeps.synctex")) + +local argument = environment.argument +local filename = environment.files[1] + +if argument("edit") then + editfile(filename,argument("line"),argument("editor")) +elseif argument("goto") then + gotolocation(filename,argument("page"),argument("x"),argument("y"),argument("editor")) +elseif argument("report") then + gotolocation(filename,argument("page"),argument("x"),argument("y"),"console") +elseif argument("list") then + showlocation(filename) +elseif argument("exporthelp") then + application.export(argument("exporthelp"),filename) +else + application.help() +end + diff --git a/scripts/context/lua/mtx-tools.lua b/scripts/context/lua/mtx-tools.lua index a38e9d7e6..69064c640 100644 --- a/scripts/context/lua/mtx-tools.lua +++ b/scripts/context/lua/mtx-tools.lua @@ -34,6 +34,10 @@ local helpinfo = [[ <flag name="downcase"><short>lowercase names</short></flag> </subcategory> <subcategory> + <flag name="showstring"><short>show unicode characters in given string</short></flag> + <flag name="showfile"><short>show unicode characters in given file</short></flag> + </subcategory> + <subcategory> <flag name="pattern"><short>glob pattern (default: *)</short></flag> <flag name="recurse"><short>recurse into subdirecories</short></flag> <flag name="force"><short>downcase indeed</short></flag> @@ -115,7 +119,6 @@ function scripts.tools.downcase() end end - function scripts.tools.dirtoxml() local join, removesuffix, suffixonly, date = file.join, file.removesuffix, file.suffixonly, os.date @@ -187,6 +190,32 @@ function scripts.tools.dirtoxml() end +local function showstring(s) + if not characters or not characters.data then + require("char-def") + end + local d = characters.data + local f = string.formatters["%U %s %-30s %c"] + for c in string.utfvalues(s) do + local cs = d[c] + print(f(c,cs.category or "",cs.description or "",c)) + end +end + +function scripts.tools.showstring() + local files = environment.files + for i=1,#files do + showstring(files[i]) + end +end + +function scripts.tools.showfile() + local files = environment.files + for i=1,#files do + showstring(io.loaddata(files[i]) or "") + end +end + if environment.argument("disarmutfbomb") then scripts.tools.disarmutfbomb() elseif environment.argument("dirtoxml") then @@ -195,6 +224,10 @@ elseif environment.argument("downcase") then scripts.tools.downcase() elseif environment.argument("exporthelp") then application.export(environment.argument("exporthelp"),environment.files[1]) +elseif environment.argument("showstring") then + scripts.tools.showstring() +elseif environment.argument("showfile") then + scripts.tools.showfile() else application.help() end diff --git a/scripts/context/lua/mtx-unicode.lua b/scripts/context/lua/mtx-unicode.lua index 557e70b79..7d59bd1ca 100644 --- a/scripts/context/lua/mtx-unicode.lua +++ b/scripts/context/lua/mtx-unicode.lua @@ -85,6 +85,12 @@ local skipped = { for i=0x0FE00,0x0FE0F do skipped[i] = true end -- variant selector for i=0xE0100,0xE01EF do skipped[i] = true end -- variant selector extension +-- This can be done: +-- +-- for i=0x1B170,0x1B2FF do skipped[i] = true end -- nushu +-- +-- but then also adapt char-cjk.lua bottom part! + function scripts.unicode.update() local unicodedata = texttables.unicodedata local bidimirroring = texttables.bidimirroring diff --git a/scripts/context/lua/mtx-update.lua b/scripts/context/lua/mtx-update.lua index 8a23ba9a6..20ca9ce27 100644 --- a/scripts/context/lua/mtx-update.lua +++ b/scripts/context/lua/mtx-update.lua @@ -19,7 +19,7 @@ local helpinfo = [[ <metadata> <entry name="name">mtx-update</entry> <entry name="detail">ConTeXt Minimals Updater</entry> - <entry name="version">1.02</entry> + <entry name="version">1.03</entry> </metadata> <flags> <category name="basic"> @@ -51,7 +51,7 @@ local helpinfo = [[ local application = logs.application { name = "mtx-update", - banner = "ConTeXt Minimals Updater 1.02", + banner = "ConTeXt Minimals Updater 1.03", helpinfo = helpinfo, } @@ -61,6 +61,7 @@ local format, concat, gmatch, gsub, find = string.format, table.concat, string.g scripts = scripts or { } scripts.update = scripts.update or { } +local update = scripts.update minimals = minimals or { } minimals.config = minimals.config or { } @@ -70,7 +71,7 @@ minimals.config = minimals.config or { } os.setenv("CYGWIN","nontsec") -scripts.update.texformats = { +update.texformats = { "cont-en", "cont-nl", "cont-cz", @@ -85,28 +86,28 @@ scripts.update.texformats = { "plain" } --- scripts.update.mpformats = { +-- update.mpformats = { -- -- "metafun", -- -- "mpost", -- } -- experimental is not functional at the moment -scripts.update.repositories = { +update.repositories = { "current", "experimental" } -- more options than just these two are available (no idea why this is here) -scripts.update.versions = { +update.versions = { "current", "latest" } -- list of basic folders that are needed to make a functional distribution -scripts.update.base = { +update.base = { { "base/tex/", "texmf" }, { "base/metapost/", "texmf" }, { "fonts/common/", "texmf" }, @@ -123,7 +124,10 @@ scripts.update.base = { -- binaries and font-related files -- for pdftex we don't need OpenType fonts, for LuaTeX/XeTeX we don't need TFM files -scripts.update.engines = { +update.defaultengine = "luatex" +update.rsyncvariant = "cygwin" -- will be come mingw + +update.engines = { ["luatex"] = { { "fonts/new/", "texmf" }, { "bin/luatex/<platform>/", "texmf-<platform>" }, @@ -151,7 +155,7 @@ scripts.update.engines = { }, } -scripts.update.goodies = { +update.goodies = { ["scite"] = { { "bin/<platform>/scite/", "texmf-<platform>" }, }, @@ -160,7 +164,7 @@ scripts.update.goodies = { }, } -scripts.update.platforms = { +update.platforms = { ["mswin"] = "mswin", ["windows"] = "mswin", ["win32"] = "mswin", @@ -222,20 +226,20 @@ local windowsplatform = { ["win64"] = true, } -scripts.update.selfscripts = { +update.selfscripts = { "mtxrun", -- "luatools", } -- the list is filled up later (when we know what modules to download) -scripts.update.modules = { +update.modules = { } -scripts.update.fonts = { +update.fonts = { } -function scripts.update.run(str) +function update.run(str) -- important, otherwise formats fly to a weird place -- (texlua sets luatex as the engine, we need to reset that or to fix texexec :) os.setenv("engine",nil) @@ -247,7 +251,7 @@ function scripts.update.run(str) end end -function scripts.update.fullpath(path) +function update.fullpath(path) if file.is_rootbased_path(path) then return path else @@ -255,10 +259,8 @@ function scripts.update.fullpath(path) end end -local rsync_variant = "cygwin" -- will be come mingw - local function drive(d) - if rsync_variant == "cygwin" then + if update.rsyncvariant == "cygwin" then d = gsub(d,[[([a-zA-Z]):/]], "/cygdrive/%1/") else d = gsub(d,[[([a-zA-Z]):/]], "/%1/") @@ -266,11 +268,11 @@ local function drive(d) return d end -function scripts.update.synchronize() +function update.synchronize() report("update, start") - local texroot = scripts.update.fullpath(states.get("paths.root")) + local texroot = update.fullpath(states.get("paths.root")) local engines = states.get('engines') or { } local platforms = states.get('platforms') or { } local repositories = states.get('repositories') -- minimals @@ -331,7 +333,7 @@ function scripts.update.synchronize() return prefix .. concat(list_of_folders, format(" %s", prefix)) end - -- example of usage: print(list_of_folders_to_rsync_string(collection_to_list_of_folders(scripts.update.base, os.platform))) + -- example of usage: print(list_of_folders_to_rsync_string(collection_to_list_of_folders(update.base, os.platform))) -- rename function and add some more functionality: -- * recursive/non-recursive (default: non-recursive) @@ -377,7 +379,7 @@ function scripts.update.synchronize() for i=1,#available_modules do local s = available_modules[i] if modules.all or modules[s] then - scripts.update.modules[#scripts.update.modules+1] = { format("modules/%s/",s), "texmf-modules" } + update.modules[#update.modules+1] = { format("modules/%s/",s), "texmf-modules" } report("+ %s",s) else report(" %s",s) @@ -398,7 +400,7 @@ function scripts.update.synchronize() for i=1,#available_fonts do local s = available_fonts[i] if fonts.all or fonts[s] then - scripts.update.fonts[#scripts.update.fonts+1] = { format("fonts/extra/%s/",s), "texmf" } + update.fonts[#update.fonts+1] = { format("fonts/extra/%s/",s), "texmf" } end asked[s] = nil end @@ -409,7 +411,7 @@ function scripts.update.synchronize() local function add_collection(collection,platform) if collection and platform then - platform = scripts.update.platforms[platform] + platform = update.platforms[platform] if platform then for i=1,#collection do local c = collection[i] @@ -427,30 +429,30 @@ function scripts.update.synchronize() end for platform in table.sortedhash(platforms) do - add_collection(scripts.update.base,platform) + add_collection(update.base,platform) end for platform in table.sortedhash(platforms) do - add_collection(scripts.update.modules,platform) + add_collection(update.modules,platform) end for platform in table.sortedhash(platforms) do - add_collection(scripts.update.fonts,platform) + add_collection(update.fonts,platform) end for engine in table.sortedhash(engines) do for platform in table.sortedhash(platforms) do - add_collection(scripts.update.engines[engine],platform) + add_collection(update.engines[engine],platform) end end if goodies and type(goodies) == "table" then for goodie in table.sortedhash(goodies) do for platform in table.sortedhash(platforms) do - add_collection(scripts.update.goodies[goodie],platform) + add_collection(update.goodies[goodie],platform) end end end local combined = { } - local update_repositories = scripts.update.repositories + local update_repositories = update.repositories for i=1,#update_repositories do local repository = update_repositories[i] if repositories[repository] then @@ -481,7 +483,7 @@ function scripts.update.synchronize() command = format("%s %s %s %s %s'%s' '%s'", bin, normalflags, deleteflags, dryrunflags, url, archives, drive(destination)) -- report("running command: %s",command) if not fetched[command] then - scripts.update.run(command,true) + update.run(command,true) fetched[command] = command end end @@ -489,7 +491,7 @@ function scripts.update.synchronize() local function update_script(script, platform) local bin = gsub(bin,"\\","/") local texroot = gsub(texroot,"\\","/") - platform = scripts.update.platforms[platform] + platform = update.platforms[platform] if platform then local command if windowsplatform[platform] then @@ -500,13 +502,13 @@ function scripts.update.synchronize() command = format([[%s -tgo --chmod=a+x '%s/texmf-context/scripts/context/lua/%s.lua' '%s/texmf-%s/bin/%s']], bin, texroot, script, texroot, platform, script) end report("updating %s for %s: %s", script, platform, command) - scripts.update.run(command) + update.run(command) end end for platform in table.sortedhash(platforms) do - for i=1, #scripts.update.selfscripts do - update_script(scripts.update.selfscripts[i],platform) + for i=1, #update.selfscripts do + update_script(update.selfscripts[i],platform) end end @@ -520,9 +522,9 @@ function scripts.update.synchronize() resolvers.load_tree(texroot) -- else we operate in the wrong tree -- update filename database for pdftex/xetex - scripts.update.run(format('mtxrun --tree="%s" %s --direct --resolve mktexlsr %s',texroot,silent,quiet)) + update.run(format('mtxrun --tree="%s" %s --direct --resolve mktexlsr %s',texroot,silent,quiet)) -- update filename database for luatex - scripts.update.run(format('mtxrun --tree="%s" %s --generate',texroot,silent)) + update.run(format('mtxrun --tree="%s" %s --generate',texroot,silent)) report("update, done") end @@ -536,14 +538,14 @@ function table.fromhash(t) end -- make the ConTeXt formats -function scripts.update.make() +function update.make() report("make, start") local force = environment.argument("force") local silent = environment.argument("silent") and "--silent" or "" local quiet = silent == "" and "" or "--quiet" - local texroot = scripts.update.fullpath(states.get("paths.root")) + local texroot = update.fullpath(states.get("paths.root")) local engines = states.get('engines') local goodies = states.get('goodies') local platforms = states.get('platforms') @@ -551,12 +553,12 @@ function scripts.update.make() resolvers.load_tree(texroot) - scripts.update.run(format('mtxrun --tree="%s" %s --direct --resolve mktexlsr %s',texroot,silent,quiet)) - scripts.update.run(format('mtxrun --tree="%s" %s --generate',texroot,silent)) + update.run(format('mtxrun --tree="%s" %s --direct --resolve mktexlsr %s',texroot,silent,quiet)) + update.run(format('mtxrun --tree="%s" %s --generate',texroot,silent)) local askedformats = formats - local texformats = table.tohash(scripts.update.texformats) - -- local mpformats = table.tohash(scripts.update.mpformats) + local texformats = table.tohash(update.texformats) + -- local mpformats = table.tohash(update.mpformats) for k,v in table.sortedhash(texformats) do if not askedformats[k] then texformats[k] = nil @@ -571,24 +573,24 @@ function scripts.update.make() if formatlist ~= "" then for engine in table.sortedhash(engines) do if engine == "luatex" or engine == "luajittex" then - scripts.update.run(format('mtxrun --tree="%s" %s --script context --autogenerate --make %s',texroot,silent,silent)) - scripts.update.run(format('mtxrun --tree="%s" %s --script context --autogenerate --make --engine=luajittex %s',texroot,silent,silent)) + update.run(format('mtxrun --tree="%s" %s --script context --autogenerate --make %s',texroot,silent,silent)) + update.run(format('mtxrun --tree="%s" %s --script context --autogenerate --make --engine=luajittex %s',texroot,silent,silent)) else - -- scripts.update.run(format('mtxrun --tree="%s" %s --script texexec --make --all %s --%s %s',texroot,silent,silent,engine,formatlist)) - scripts.update.run(format('mtxrun --tree="%s" --resolve %s --script context --resolve --make %s --engine=%s %s',texroot,silent,silent,engine,formatlist)) + -- update.run(format('mtxrun --tree="%s" %s --script texexec --make --all %s --%s %s',texroot,silent,silent,engine,formatlist)) + update.run(format('mtxrun --tree="%s" --resolve %s --script context --resolve --make %s --engine=%s %s',texroot,silent,silent,engine,formatlist)) end end end -- local formatlist = concat(table.fromhash(mpformats), " ") -- if formatlist ~= "" then - -- scripts.update.run(format('mtxrun --tree="%s" %s --script texexec --make --all %s %s',texroot,silent,silent,formatlist)) + -- update.run(format('mtxrun --tree="%s" %s --script texexec --make --all %s %s',texroot,silent,silent,formatlist)) -- end if not force then report("make, use --force to really make formats") end - -- scripts.update.run(format('mtxrun --tree="%s" %s --direct --resolve mktexlsr',texroot,silent)) -- needed for mpost - scripts.update.run(format('mtxrun --tree="%s" %s --generate',texroot,silent)) + -- update.run(format('mtxrun --tree="%s" %s --direct --resolve mktexlsr',texroot,silent)) -- needed for mpost + update.run(format('mtxrun --tree="%s" %s --generate',texroot,silent)) report("make, done") end @@ -618,17 +620,17 @@ if scripts.savestate then states.set("context.version", environment.argument("context"), "current", true) -- ok - local valid = table.tohash(scripts.update.repositories) + local valid = table.tohash(update.repositories) for r in gmatch(environment.argument("repository") or "current","([^, ]+)") do if valid[r] then states.set("repositories." .. r, true) end end - local valid = scripts.update.engines + local valid = update.engines local engine = environment.argument("engine") or "" if engine == "" then local e = states.get("engines") if not e or not next(e) then - engine = "all" + engine = update.defaultengine end end if engine ~= "" then @@ -646,16 +648,16 @@ if scripts.savestate then end end - local valid = scripts.update.platforms + local valid = update.platforms for r in gmatch(environment.argument("platform") or os.platform,"([^, ]+)") do if valid[r] then states.set("platforms." .. r, true) end end - local valid = table.tohash(scripts.update.texformats) + local valid = table.tohash(update.texformats) for r in gmatch(environment.argument("formats") or "","([^, ]+)") do if valid[r] then states.set("formats." .. r, true) end end - -- local valid = table.tohash(scripts.update.mpformats) + -- local valid = table.tohash(update.mpformats) -- for r in gmatch(environment.argument("formats") or "","([^, ]+)") do -- if valid[r] then states.set("formats." .. r, true) end -- end @@ -695,18 +697,18 @@ if environment.argument("state") then end if environment.argument("mingw") then - rsync_variant = "mingw" + update.rsyncvariant = "mingw" elseif environment.argument("cygwin") then - rsync_variant = "cygwin" + update.rsyncvariant = "cygwin" end if environment.argument("update") then - scripts.update.synchronize() + update.synchronize() if environment.argument("make") then - scripts.update.make() + update.make() end elseif environment.argument("make") then - scripts.update.make() + update.make() elseif environment.argument("exporthelp") then application.export(environment.argument("exporthelp"),environment.files[1]) else diff --git a/scripts/context/lua/mtx-watch.lua b/scripts/context/lua/mtx-watch.lua index 95323f571..8629058e5 100644 --- a/scripts/context/lua/mtx-watch.lua +++ b/scripts/context/lua/mtx-watch.lua @@ -167,6 +167,7 @@ function scripts.watch.watch() lfs.chdir(path) local files = { } glob(files,path) + glob(files,".") table.sort(files,filenamesort) -- for name, time in next, files do for i=1,#files do @@ -176,6 +177,7 @@ function scripts.watch.watch() local name = joinname(dirname,basename) --~ local ok, joblog = xpcall(function() return dofile(name) end, function() end ) local ok, joblog = pcall(dofile,name) +report("checking file %s/%s: %s",dirname,basename,ok and "okay" or "skipped") if ok and joblog then if joblog.status == "processing" then report("aborted job, %s added to queue",name) @@ -399,7 +401,9 @@ function scripts.watch.cleanup_stale_files() -- removes duplicates elseif not delay then report("missing --cleanup=delay") else - report("dryrun, use --force for real cleanup") + if not force then + report("dryrun, use --force for real cleanup") + end local files = dir.glob(file.join(path,"*")) local rtime = time() for i=1,#files do diff --git a/scripts/context/lua/mtx-youless.lua b/scripts/context/lua/mtx-youless.lua index 740fdcb65..32e1bd870 100644 --- a/scripts/context/lua/mtx-youless.lua +++ b/scripts/context/lua/mtx-youless.lua @@ -22,7 +22,7 @@ local helpinfo = [[ <metadata> <entry name="name">mtx-youless</entry> <entry name="detail">youless Fetcher</entry> - <entry name="version">1.00</entry> + <entry name="version">1.100</entry> </metadata> <flags> <category name="basic"> @@ -30,9 +30,11 @@ local helpinfo = [[ <flag name="collect"><short>collect data from device</short></flag> <flag name="nobackup"><short>don't backup old datafile</short></flag> <flag name="nofile"><short>don't write data to file (for checking)</short></flag> - <flag name="kwh"><short>summative kwh data</short></flag> - <flag name="watt"><short>collected watt data</short></flag> + <flag name="electricity"><short>collected eletricity data (p)</short></flag> + <flag name="gas"><short>collected gas data</short></flag> + <flag name="pulse"><short>collected eletricity data (s)</short></flag> <flag name="host"><short>ip address of device</short></flag> + <flag name="auto"><short>fetch (refresh) all data every hour</short></flag> </subcategory> </category> </flags> @@ -40,8 +42,10 @@ local helpinfo = [[ <category> <title>Example</title> <subcategory> - <example><command>mtxrun --script youless --collect --host=192.168.2.50 --kwh</command></example> - <example><command>mtxrun --script youless --collect --host=192.168.2.50 --watt somefile.lua</command></example> + <example><command>mtxrun --script youless --collect --host=192.168.2.50 --electricity somefile.lua</command></example> + <example><command>mtxrun --script youless --collect --host=192.168.2.50 --gas somefile.lua</command></example> + <example><command>mtxrun --script youless --collect --host=192.168.2.50 --pulse somefile.lua</command></example> + <example><command>mtxrun --script youless --collect --host=192.168.2.50 --auto file-prefix</command></example> </subcategory> </category> </examples> @@ -50,7 +54,7 @@ local helpinfo = [[ local application = logs.application { name = "mtx-youless", - banner = "YouLess Fetcher 1.00", + banner = "YouLess Fetcher 1.100", helpinfo = helpinfo, } @@ -59,19 +63,37 @@ local report = application.report scripts = scripts or { } scripts.youless = scripts.youless or { } +local arguments = environment.arguments +local files = environment.files + function scripts.youless.collect() - local host = environment.arguments.host - local variant = environment.arguments.kwh and "kwh" or environment.arguments.watt and "watt" - local nobackup = environment.arguments.nobackup - local nofile = environment.arguments.nofile - local password = environment.arguments.password - local filename = environment.files[1] - if not variant then - report("provide variant --kwh or --watt") - return - else + local host = arguments.host + local nobackup = arguments.nobackup + local nofile = arguments.nofile + local password = arguments.password + local filename = files[1] + local delay = tonumber(arguments.delay) or 12*60*60 + + local function fetch(filename,variant) + local data = utilities.youless.collect { + filename = filename, + host = host, + variant = variant, + nobackup = nobackup, + password = password, + } + if type(data) ~= "table" then + report("no data collected") + elseif filename == "" then + report("data collected but not saved") + end report("using variant %a",variant) + if filename ~= "" then + report("using file %a",filename) + end + report("current time %a",os.now()) end + if not host then host = "192.168.2.50" report("using default host %a",host) @@ -81,25 +103,35 @@ function scripts.youless.collect() if nobackup then report("not backing up data file") end - if not filename and not nofile then - filename = formatters["youless-%s.lua"](variant) - end - if filename ~= "" then - report("using file %a",filename) - end - local data = utilities.youless.collect { - filename = filename, - host = host, - variant = variant, - nobackup = nobackup, - password = password, - } - if type(data) ~= "table" then - report("no data collected") - elseif filename == "" then - report("data collected but not saved") + + if arguments.auto then + local filename_electricity = formatters["%s-electricity.lua"](filename ~= "" and filename or "youless") + local filename_gas = formatters["%s-gas.lua" ] (filename ~= "" and filename or "youless") + local filename_pulse = formatters["%s-pulse.lua"] (filename ~= "" and filename or "youless") + while true do + fetch(filename_electricity,"electricity") + fetch(filename_gas, "gas") + fetch(filename_pulse, "pulse") + report("sleeping for %i seconds",delay) + io.flush() + os.sleep(delay) + end + else + local variant = (environment.arguments.electricity and "electricity") or + (environment.arguments.watt and "electricity") or + (environment.arguments.gas and "gas") or + (environment.arguments.pulse and "pulse") + if not variant then + report("provide variant --electricity, --gas or --pulse") + return + end + if nofile then + filename = "" + elseif not filename or filename == "" then + filename = formatters["youless-%s.lua"](variant) + end + fetch(filename,variant) end - report("current time %a",os.now()) end if environment.argument("collect") then diff --git a/scripts/context/lua/mtxlibs.lua b/scripts/context/lua/mtxlibs.lua index 5e547cdee..bb0e03b17 100644 --- a/scripts/context/lua/mtxlibs.lua +++ b/scripts/context/lua/mtxlibs.lua @@ -49,10 +49,10 @@ if not modules then modules = { } end modules ['mtxlibs'] = { -- the for context handy option to expose them in the normal ones. I might make the dependencies -- less but it probably makes no sense to waste time on them. -xpcall(function() local _, t = require("lpeg") return end,function() end) if t then lpeg = t end -xpcall(function() local _, t = require("md5") return end,function() end) if t then md5 = t end -xpcall(function() local _, t = require("lfs") return end,function() end) if t then lfs = t end -xpcall(function() local _, t = require("slunicode") return end,function() end) if t then unicode = t end +xpcall(function() local _, t = require("lpeg") if t then lpeg = t end return end,function() end) +xpcall(function() local _, t = require("md5") if t then md5 = t end return end,function() end) +xpcall(function() local _, t = require("lfs") if t then lfs = t end return end,function() end) +xpcall(function() local _, t = require("slunicode") if t then unicode = t end return end,function() end) -- begin library merge @@ -68,6 +68,7 @@ local owntree = ownpath local ownlibs = { "l-lua.lua", + "l-macros.lua", "l-sandbox.lua", "l-package.lua", "l-lpeg.lua", diff --git a/scripts/context/lua/mtxrun.lua b/scripts/context/lua/mtxrun.lua index 873770cac..3374a364a 100644 --- a/scripts/context/lua/mtxrun.lua +++ b/scripts/context/lua/mtxrun.lua @@ -56,7 +56,7 @@ do -- create closure to overcome 200 locals limit package.loaded["l-lua"] = package.loaded["l-lua"] or true --- original size: 5125, stripped down to: 2881 +-- original size: 6230, stripped down to: 3662 if not modules then modules={} end modules ['l-lua']={ version=1.001, @@ -65,14 +65,16 @@ if not modules then modules={} end modules ['l-lua']={ copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" } -_MAJORVERSION,_MINORVERSION=string.match(_VERSION,"^[^%d]+(%d+)%.(%d+).*$") -_MAJORVERSION=tonumber(_MAJORVERSION) or 5 -_MINORVERSION=tonumber(_MINORVERSION) or 1 -_LUAVERSION=_MAJORVERSION+_MINORVERSION/10 -if _LUAVERSION<5.2 and jit then - _MINORVERSION=2 - _LUAVERSION=5.2 -end +local next,type,tonumber=next,type,tonumber +LUAMAJORVERSION,LUAMINORVERSION=string.match(_VERSION,"^[^%d]+(%d+)%.(%d+).*$") +LUAMAJORVERSION=tonumber(LUAMAJORVERSION) or 5 +LUAMINORVERSION=tonumber(LUAMINORVERSION) or 1 +LUAVERSION=LUAMAJORVERSION+LUAMINORVERSION/10 +if LUAVERSION<5.2 and jit then + MINORVERSION=2 + LUAVERSION=5.2 +end +_LUAVERSION=LUAVERSION if not lpeg then lpeg=require("lpeg") end @@ -172,6 +174,166 @@ if not FFISUPPORTED then elseif not ffi.number then ffi.number=tonumber end +if not bit32 then + bit32=require("l-bit32") +end +local loaded=package.loaded +if not loaded["socket"] then loaded["socket"]=loaded["socket.core"] end +if not loaded["mime"] then loaded["mime"]=loaded["mime.core"] end +if not socket.mime then socket.mime=package.loaded["mime"] end +if not loaded["socket.mime"] then loaded["socket.mime"]=socket.mime end +if not loaded["socket.http"] then loaded["socket.http"]=socket.http end +if not loaded["socket.ftp"] then loaded["socket.ftp"]=socket.ftp end +if not loaded["socket.smtp"] then loaded["socket.smtp"]=socket.smtp end +if not loaded["socket.tp"] then loaded["socket.tp"]=socket.tp end +if not loaded["socket.url"] then loaded["socket.url"]=socket.url end + + +end -- of closure + +do -- create closure to overcome 200 locals limit + +package.loaded["l-macro"] = package.loaded["l-macro"] or true + +-- original size: 6393, stripped down to: 3659 + +if not modules then modules={} end modules ['l-macros']={ + version=1.001, + comment="companion to luat-lib.mkiv", + author="Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright="PRAGMA ADE / ConTeXt Development Team", + license="see context related readme files" +} +local S,P,R,V,C,Cs,Cc,Ct,Carg=lpeg.S,lpeg.P,lpeg.R,lpeg.V,lpeg.C,lpeg.Cs,lpeg.Cc,lpeg.Ct,lpeg.Carg +local lpegmatch=lpeg.match +local concat=table.concat +local next=next +local newline=S("\n\r")^1 +local continue=P("\\")*newline +local spaces=S(" \t")+continue +local name=R("az","AZ","__","09")^1 +local body=((1+continue/"")-newline)^1 +local lparent=P("(") +local rparent=P(")") +local noparent=1-(lparent+rparent) +local nested=P { lparent*(noparent+V(1))^0*rparent } +local escaped=P("\\")*P(1) +local squote=P("'") +local dquote=P('"') +local quoted=dquote*(escaped+(1-dquote))^0*dquote+squote*(escaped+(1-squote))^0*squote +local arguments=lparent*Ct((Cs((nested+(quoted+1-S("),")))^1)+S(", "))^0)*rparent +local macros=lua.macros or {} +lua.macros=macros +local patterns={} +local definitions={} +local resolve +local subparser +resolve=C(C(name)*arguments^-1)/function(raw,s,a) + local d=definitions[s] + if d then + if a then + local n=#a + local p=patterns[s][n] + if p then + local d=d[n] + for i=1,n do + a[i]=lpegmatch(subparser,a[i]) or a[i] + end + return lpegmatch(p,d,1,a) or d + else + return raw + end + else + return d[0] or raw + end + elseif a then + for i=1,#a do + a[i]=lpegmatch(subparser,a[i]) or a[i] + end + return s.."("..concat(a,",")..")" + else + return raw + end +end +subparser=Cs((resolve+P(1))^1) +local enddefine=P("#enddefine")/"" +local beginregister=(C(name)*spaces^0*(arguments+Cc(false))*C((1-enddefine)^1)*enddefine)/function(k,a,v) + local n=0 + if a then + n=#a + local pattern=P(false) + for i=1,n do + pattern=pattern+(P(a[i])*Carg(1))/function(t) return t[i] end + end + pattern=Cs((pattern+P(1))^1) + local p=patterns[k] + if not p then + p={ [0]=false,false,false,false,false,false,false,false,false } + patterns[k]=p + end + p[n]=pattern + end + local d=definitions[k] + if not d then + d={ [0]=false,false,false,false,false,false,false,false,false } + definitions[k]=d + end + d[n]=lpegmatch(subparser,v) or v + return "" +end +local register=(C(name)*spaces^0*(arguments+Cc(false))*spaces^0*C(body))/function(k,a,v) + local n=0 + if a then + n=#a + local pattern=P(false) + for i=1,n do + pattern=pattern+(P(a[i])*Carg(1))/function(t) return t[i] end + end + pattern=Cs((pattern+P(1))^1) + local p=patterns[k] + if not p then + p={ [0]=false,false,false,false,false,false,false,false,false } + patterns[k]=p + end + p[n]=pattern + end + local d=definitions[k] + if not d then + d={ [0]=false,false,false,false,false,false,false,false,false } + definitions[k]=d + end + d[n]=lpegmatch(subparser,v) or v + return "" +end +local unregister=(C(name)*spaces^0*(arguments+Cc(false)))/function(k,a) + local n=0 + if a then + n=#a + local p=patterns[k] + if p then + p[n]=false + end + end + local d=definitions[k] + if d then + d[n]=false + end + return "" +end +local begindefine=(P("begindefine")*spaces^0/"")*beginregister +local define=(P("define" )*spaces^0/"")*register +local undefine=(P("undefine" )*spaces^0/"")*unregister +local parser=Cs((((P("#")/"")*(define+begindefine+undefine)*(newline^0/"") )+resolve+P(1) )^0 ) +function macros.reset() + definitions={} + patterns={} +end +function macros.resolvestring(str) + return lpegmatch(parser,str) or str +end +function macros.resolving() + return next(patterns) +end end -- of closure @@ -180,7 +342,7 @@ do -- create closure to overcome 200 locals limit package.loaded["l-sandbox"] = package.loaded["l-sandbox"] or true --- original size: 9667, stripped down to: 6678 +-- original size: 9678, stripped down to: 6688 if not modules then modules={} end modules ['l-sandbox']={ version=1.001, @@ -193,7 +355,7 @@ local global=_G local next=next local unpack=unpack or table.unpack local type=type -local tprint=texio.write_nl or print +local tprint=texio and texio.write_nl or print local tostring=tostring local format=string.format local concat=table.concat @@ -447,7 +609,7 @@ do -- create closure to overcome 200 locals limit package.loaded["l-package"] = package.loaded["l-package"] or true --- original size: 10587, stripped down to: 7815 +-- original size: 11564, stripped down to: 8625 if not modules then modules={} end modules ['l-package']={ version=1.001, @@ -461,6 +623,7 @@ local gsub,format,find=string.gsub,string.format,string.find local P,S,Cs,lpegmatch=lpeg.P,lpeg.S,lpeg.Cs,lpeg.match local package=package local searchers=package.searchers or package.loaders +local insert,remove=table.insert,table.remove local filejoin=file and file.join or function(path,name) return path.."/"..name end local isreadable=file and file.is_readable or function(name) local f=io.open(name) if f then f:close() return true end end local addsuffix=file and file.addsuffix or function(name,suffix) return name.."."..suffix end @@ -594,15 +757,43 @@ local function registerpath(tag,what,target,...) add(path) end end - return paths +end +local function pushpath(tag,what,target,path) + local path=helpers.cleanpath(path) + insert(target,1,path) + if helpers.trace then + helpers.report("pushing %s path in front: %s",tag,path) + end +end +local function poppath(tag,what,target) + local path=remove(target,1) + if helpers.trace then + if path then + helpers.report("popping %s path from front: %s",tag,path) + else + helpers.report("no %s path to pop",tag) + end + end end helpers.registerpath=registerpath function package.extraluapath(...) registerpath("extra lua","lua",extraluapaths,...) end +function package.pushluapath(path) + pushpath("extra lua","lua",extraluapaths,path) +end +function package.popluapath() + poppath("extra lua","lua",extraluapaths) +end function package.extralibpath(...) registerpath("extra lib","lib",extralibpaths,...) end +function package.pushlibpath(path) + pushpath("extra lib","lib",extralibpaths,path) +end +function package.poplibpath() + poppath("extra lib","lua",extralibpaths) +end local function loadedaslib(resolved,rawname) local base=gsub(rawname,"%.","_") local init="luaopen_"..gsub(base,"%.","_") @@ -737,7 +928,7 @@ do -- create closure to overcome 200 locals limit package.loaded["l-lpeg"] = package.loaded["l-lpeg"] or true --- original size: 37748, stripped down to: 20111 +-- original size: 38582, stripped down to: 20518 if not modules then modules={} end modules ['l-lpeg']={ version=1.001, @@ -746,7 +937,8 @@ if not modules then modules={} end modules ['l-lpeg']={ copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" } -lpeg=require("lpeg") +lpeg=require("lpeg") +local lpeg=lpeg if not lpeg.print then function lpeg.print(...) print(lpeg.pcode(...)) end end local type,next,tostring=type,next,tostring local byte,char,gmatch,format=string.byte,string.char,string.gmatch,string.format @@ -768,11 +960,14 @@ patterns.alwaysmatched=alwaysmatched local sign=S('+-') local zero=P('0') local digit=R('09') +local digits=digit^1 local octdigit=R("07") +local octdigits=octdigit^1 local lowercase=R("az") local uppercase=R("AZ") local underscore=P("_") local hexdigit=digit+lowercase+uppercase +local hexdigits=hexdigit^1 local cr,lf,crlf=P("\r"),P("\n"),P("\r\n") local newline=P("\r")*(P("\n")+P(true))+P("\n") local escaped=P("\\")*anything @@ -874,27 +1069,30 @@ patterns.singlequoted=squote*patterns.nosquote*squote patterns.doublequoted=dquote*patterns.nodquote*dquote patterns.quoted=patterns.doublequoted+patterns.singlequoted patterns.digit=digit +patterns.digits=digits patterns.octdigit=octdigit +patterns.octdigits=octdigits patterns.hexdigit=hexdigit +patterns.hexdigits=hexdigits patterns.sign=sign -patterns.cardinal=digit^1 -patterns.integer=sign^-1*digit^1 -patterns.unsigned=digit^0*period*digit^1 +patterns.cardinal=digits +patterns.integer=sign^-1*digits +patterns.unsigned=digit^0*period*digits patterns.float=sign^-1*patterns.unsigned -patterns.cunsigned=digit^0*comma*digit^1 -patterns.cpunsigned=digit^0*(period+comma)*digit^1 +patterns.cunsigned=digit^0*comma*digits +patterns.cpunsigned=digit^0*(period+comma)*digits patterns.cfloat=sign^-1*patterns.cunsigned patterns.cpfloat=sign^-1*patterns.cpunsigned patterns.number=patterns.float+patterns.integer patterns.cnumber=patterns.cfloat+patterns.integer patterns.cpnumber=patterns.cpfloat+patterns.integer -patterns.oct=zero*octdigit^1 +patterns.oct=zero*octdigits patterns.octal=patterns.oct patterns.HEX=zero*P("X")*(digit+uppercase)^1 patterns.hex=zero*P("x")*(digit+lowercase)^1 -patterns.hexadecimal=zero*S("xX")*hexdigit^1 -patterns.hexafloat=sign^-1*zero*S("xX")*(hexdigit^0*period*hexdigit^1+hexdigit^1*period*hexdigit^0+hexdigit^1)*(S("pP")*sign^-1*hexdigit^1)^-1 -patterns.decafloat=sign^-1*(digit^0*period*digit^1+digit^1*period*digit^0+digit^1)*S("eE")*sign^-1*digit^1 +patterns.hexadecimal=zero*S("xX")*hexdigits +patterns.hexafloat=sign^-1*zero*S("xX")*(hexdigit^0*period*hexdigits+hexdigits*period*hexdigit^0+hexdigits)*(S("pP")*sign^-1*hexdigits)^-1 +patterns.decafloat=sign^-1*(digit^0*period*digits+digits*period*digit^0+digits)*S("eE")*sign^-1*digits patterns.propername=(uppercase+lowercase+underscore)*(uppercase+lowercase+underscore+digit)^0*endofstring patterns.somecontent=(anything-newline-space)^1 patterns.beginline=#(1-newline) @@ -1141,11 +1339,13 @@ function lpeg.balancer(left,right) left,right=P(left),P(right) return P { left*((1-left-right)+V(1))^0*right } end -local nany=utf8char/"" -function lpeg.counter(pattern) - pattern=Cs((P(pattern)/" "+nany)^0) - return function(str) - return #lpegmatch(pattern,str) +function lpeg.counter(pattern,action) + local n=0 + local pattern=(P(pattern)/function() n=n+1 end+anything)^0 + if action then + return function(str) n=0;lpegmatch(pattern,str);action(n) end + else + return function(str) n=0;lpegmatch(pattern,str);return n end end end utf=utf or (unicode and unicode.utf8) or {} @@ -1306,7 +1506,13 @@ function lpeg.append(list,pp,delayed,checked) end local p_false=P(false) local p_true=P(true) -local function make(t,rest) +local lower=utf and utf.lower or string.lower +local upper=utf and utf.upper or string.upper +function lpeg.setutfcasers(l,u) + lower=l or lower + upper=u or upper +end +local function make1(t,rest) local p=p_false local keys=sortedkeys(t) for i=1,#keys do @@ -1317,7 +1523,7 @@ local function make(t,rest) p=p+P(k)*p_true elseif v==false then else - p=p+P(k)*make(v,v[""]) + p=p+P(k)*make1(v,v[""]) end end end @@ -1326,32 +1532,27 @@ local function make(t,rest) end return p end -local function collapse(t,x) - if type(t)~="table" then - return t,x - else - local n=next(t) - if n==nil then - return t,x - elseif next(t,n)==nil then - local k=n +local function make2(t,rest) + local p=p_false + local keys=sortedkeys(t) + for i=1,#keys do + local k=keys[i] + if k~="" then local v=t[k] - if type(v)=="table" then - return collapse(v,x..k) + if v==true then + p=p+(P(lower(k))+P(upper(k)))*p_true + elseif v==false then else - return v,x..k + p=p+(P(lower(k))+P(upper(k)))*make2(v,v[""]) end - else - local tt={} - for k,v in next,t do - local vv,kk=collapse(v,k) - tt[kk]=vv - end - return tt,x end end + if rest then + p=p+p_true + end + return p end -function lpeg.utfchartabletopattern(list) +function lpeg.utfchartabletopattern(list,insensitive) local tree={} local n=#list if n==0 then @@ -1422,7 +1623,7 @@ function lpeg.utfchartabletopattern(list) end end end - return make(tree) + return (insensitive and make2 or make1)(tree) end patterns.containseol=lpeg.finder(eol) local function nextstep(n,step,result) @@ -1456,7 +1657,7 @@ end local trailingzeros=zero^0*-digit local case_1=period*trailingzeros/"" local case_2=period*(digit-trailingzeros)^1*(trailingzeros/"") -local number=digit^1*(case_1+case_2) +local number=digits*(case_1+case_2) local stripper=Cs((number+1)^0) lpeg.patterns.stripzeros=stripper local byte_to_HEX={} @@ -1545,7 +1746,7 @@ do -- create closure to overcome 200 locals limit package.loaded["l-string"] = package.loaded["l-string"] or true --- original size: 6419, stripped down to: 3339 +-- original size: 6461, stripped down to: 3341 if not modules then modules={} end modules ['l-string']={ version=1.001, @@ -1647,9 +1848,9 @@ function string.tformat(fmt,...) end string.quote=string.quoted string.unquote=string.unquoted -if not string.bytetable then +if not string.bytetable then local limit=5000 - function string.bytetable(str) + function string.bytetable(str) local n=#str if n>limit then local t={ byte(str,1,limit) } @@ -1670,7 +1871,7 @@ do -- create closure to overcome 200 locals limit package.loaded["l-table"] = package.loaded["l-table"] or true --- original size: 39608, stripped down to: 23165 +-- original size: 40161, stripped down to: 23559 if not modules then modules={} end modules ['l-table']={ version=1.001, @@ -1679,7 +1880,7 @@ if not modules then modules={} end modules ['l-table']={ copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" } -local type,next,tostring,tonumber,ipairs,select=type,next,tostring,tonumber,ipairs,select +local type,next,tostring,tonumber,select=type,next,tostring,tonumber,select local table,string=table,string local concat,sort,insert,remove=table.concat,table.sort,table.insert,table.remove local format,lower,dump=string.format,string.lower,string.dump @@ -1688,6 +1889,9 @@ local getinfo=debug.getinfo local lpegmatch,patterns=lpeg.match,lpeg.patterns local floor=math.floor local stripper=patterns.stripper +function table.getn(t) + return t and #t +end function table.strip(tab) local lst,l={},0 for i=1,#tab do @@ -1981,7 +2185,7 @@ function table.tohash(t,value) local h={} if t then if value==nil then value=true end - for _,v in next,t do + for _,v in next,t do h[v]=value end end @@ -1989,7 +2193,7 @@ function table.tohash(t,value) end function table.fromhash(t) local hsh,h={},0 - for k,v in next,t do + for k,v in next,t do if v then h=h+1 hsh[h]=k @@ -2464,7 +2668,9 @@ function table.unnest(t) return unnest(t) end local function are_equal(a,b,n,m) - if a and b and #a==#b then + if a==b then + return true + elseif a and b and #a==#b then n=n or 1 m=m or #a for i=n,m do @@ -2484,15 +2690,17 @@ local function are_equal(a,b,n,m) end end local function identical(a,b) - for ka,va in next,a do - local vb=b[ka] - if va==vb then - elseif type(va)=="table" and type(vb)=="table" then - if not identical(va,vb) then + if a~=b then + for ka,va in next,a do + local vb=b[ka] + if va==vb then + elseif type(va)=="table" and type(vb)=="table" then + if not identical(va,vb) then + return false + end + else return false end - else - return false end end return true @@ -2714,6 +2922,24 @@ function table.filtered(t,pattern,sort,cmp) return nothing end end +if not table.move then + function table.move(a1,f,e,t,a2) + if a2 and a1~=a2 then + for i=f,e do + a2[t]=a1[i] + t=t+1 + end + return a2 + else + t=t+e-f + for i=e,f,-1 do + a1[t]=a1[i] + t=t-1 + end + return a1 + end + end +end end -- of closure @@ -2722,7 +2948,7 @@ do -- create closure to overcome 200 locals limit package.loaded["l-io"] = package.loaded["l-io"] or true --- original size: 11790, stripped down to: 6961 +-- original size: 11823, stripped down to: 6945 if not modules then modules={} end modules ['l-io']={ version=1.001, @@ -2735,16 +2961,15 @@ local io=io local open,flush,write,read=io.open,io.flush,io.write,io.read local byte,find,gsub,format=string.byte,string.find,string.gsub,string.format local concat=table.concat -local floor=math.floor local type=type if string.find(os.getenv("PATH"),";",1,true) then io.fileseparator,io.pathseparator="\\",";" else io.fileseparator,io.pathseparator="/",":" end -local large=2^24 -local medium=large/16 -local small=medium/8 +local large=0x01000000 +local medium=0x00100000 +local small=0x00020000 local function readall(f) local size=f:seek("end") if size>0 then @@ -3075,7 +3300,7 @@ do -- create closure to overcome 200 locals limit package.loaded["l-number"] = package.loaded["l-number"] or true --- original size: 5358, stripped down to: 3177 +-- original size: 5645, stripped down to: 2253 if not modules then modules={} end modules ['l-number']={ version=1.001, @@ -3091,33 +3316,6 @@ local lpegmatch=lpeg.match local floor=math.floor number=number or {} local number=number -if bit32 then - local btest,bor=bit32.btest,bit32.bor - function number.bit(p) - return 2^(p-1) - end - number.hasbit=btest - number.setbit=bor - function number.setbit(x,p) - return btest(x,p) and x or x+p - end - function number.clearbit(x,p) - return btest(x,p) and x-p or x - end -else - function number.bit(p) - return 2^(p-1) - end - function number.hasbit(x,p) - return x%(p+p)>=p - end - function number.setbit(x,p) - return (x%(p+p)>=p) and x or x+p - end - function number.clearbit(x,p) - return (x%(p+p)>=p) and x-p or x - end -end if bit32 then local bextract=bit32.extract local t={ @@ -3193,26 +3391,6 @@ function number.toevenhex(n) return "0"..s end end -local one=lpeg.C(1-lpeg.S('')/tonumber)^1 -function number.toset(n) - return lpegmatch(one,tostring(n)) -end -local function bits(n,i,...) - if n>0 then - local m=n%2 - local n=floor(n/2) - if m>0 then - return bits(n,i+1,i,...) - else - return bits(n,i+1,...) - end - else - return... - end -end -function number.bits(n) - return { bits(n,1) } -end function number.bytetodecimal(b) local d=floor(b*100/255+0.5) if d>100 then @@ -3689,7 +3867,7 @@ do -- create closure to overcome 200 locals limit package.loaded["l-file"] = package.loaded["l-file"] or true --- original size: 20997, stripped down to: 9986 +-- original size: 21616, stripped down to: 10359 if not modules then modules={} end modules ['l-file']={ version=1.001, @@ -3725,6 +3903,9 @@ end function lfs.isfile(name) return attributes(name,"mode")=="file" end +function lfs.isfound(name) + return attributes(name,"mode")=="file" and name or nil +end local colon=P(":") local period=P(".") local periods=P("..") @@ -4063,6 +4244,23 @@ function lfs.mkdirs(path) lfs.mkdir(full) end end +function file.withinbase(path) + local l=0 + if not find(path,"^/") then + path="/"..path + end + for dir in gmatch(path,"/([^/]+)") do + if dir==".." then + l=l-1 + elseif dir~="." then + l=l+1 + end + if l<0 then + return false + end + end + return true +end end -- of closure @@ -4215,7 +4413,7 @@ do -- create closure to overcome 200 locals limit package.loaded["l-url"] = package.loaded["l-url"] or true --- original size: 12531, stripped down to: 5721 +-- original size: 14755, stripped down to: 7236 if not modules then modules={} end modules ['l-url']={ version=1.001, @@ -4226,24 +4424,51 @@ if not modules then modules={} end modules ['l-url']={ } local char,format,byte=string.char,string.format,string.byte local concat=table.concat -local tonumber,type=tonumber,type +local tonumber,type,next=tonumber,type,next local P,C,R,S,Cs,Cc,Ct,Cf,Cg,V=lpeg.P,lpeg.C,lpeg.R,lpeg.S,lpeg.Cs,lpeg.Cc,lpeg.Ct,lpeg.Cf,lpeg.Cg,lpeg.V local lpegmatch,lpegpatterns,replacer=lpeg.match,lpeg.patterns,lpeg.replacer +local sortedhash=table.sortedhash url=url or {} local url=url -local tochar=function(s) return char(tonumber(s,16)) end +local unescapes={} +local escapes={} +setmetatable(unescapes,{ __index=function(t,k) + local v=char(tonumber(k,16)) + t[k]=v + return v +end }) +setmetatable(escapes,{ __index=function(t,k) + local v=format("%%%02X",byte(k)) + t[k]=v + return v +end }) local colon=P(":") local qmark=P("?") local hash=P("#") local slash=P("/") +local atsign=P("@") local percent=P("%") local endofstring=P(-1) local hexdigit=R("09","AF","af") local plus=P("+") local nothing=Cc("") -local escapedchar=(percent*C(hexdigit*hexdigit))/tochar +local okay=R("09","AZ","az")+S("-_.,:=+*~!'()@&$") +local escapedchar=(percent*C(hexdigit*hexdigit))/unescapes +local unescapedchar=P(1)/escapes local escaped=(plus/" ")+escapedchar local noslash=P("/")/"" +local plustospace=P("+")/" " +local decoder=Cs(( + plustospace+escapedchar+P("\r\n")/"\n"+P(1) + )^0 ) +local encoder=Cs(( + R("09","AZ","az")^1+S("-./_")^1+P(" ")/"+"+P("\n")/"\r\n"+unescapedchar + )^0 ) +lpegpatterns.urldecoder=decoder +lpegpatterns.urlencoder=encoder +function url.decode (str) return str and lpegmatch(decoder,str) or str end +function url.encode (str) return str and lpegmatch(encoder,str) or str end +function url.unescape(str) return str and lpegmatch(unescaper,str) or str end local schemestr=Cs((escaped+(1-colon-slash-qmark-hash))^2) local authoritystr=Cs((escaped+(1- slash-qmark-hash))^0) local pathstr=Cs((escaped+(1- qmark-hash))^0) @@ -4258,13 +4483,7 @@ local validurl=scheme*authority*path*query*fragment local parser=Ct(validurl) lpegpatterns.url=validurl lpegpatterns.urlsplitter=parser -local escapes={} -setmetatable(escapes,{ __index=function(t,k) - local v=format("%%%02X",byte(k)) - t[k]=v - return v -end }) -local escaper=Cs((R("09","AZ","az")^1+P(" ")/"%%20"+S("-./_")^1+P(1)/escapes)^0) +local escaper=Cs((R("09","AZ","az")^1+P(" ")/"%%20"+S("-./_:")^1+P(1)/escapes)^0) local unescaper=Cs((escapedchar+1)^0) local getcleaner=Cs((P("+++")/"%%2B"+P("+")/"%%20"+P(1))^1) lpegpatterns.urlunescaped=escapedchar @@ -4294,12 +4513,15 @@ local barswapper=replacer("|",":") local backslashswapper=replacer("\\","/") local equal=P("=") local amp=P("&") -local key=Cs(((escapedchar+1)-equal )^0) -local value=Cs(((escapedchar+1)-amp -endofstring)^0) +local key=Cs(((plustospace+escapedchar+1)-equal )^0) +local value=Cs(((plustospace+escapedchar+1)-amp-endofstring)^0) local splitquery=Cf (Ct("")*P { "sequence", sequence=V("pair")*(amp*V("pair"))^0, pair=Cg(key*equal*value), },rawset) +local userpart=(1-atsign-colon)^1 +local serverpart=(1-colon)^1 +local splitauthority=((Cs(userpart)*colon*Cs(userpart)+Cs(userpart)*Cc(nil))*atsign+Cc(nil)*Cc(nil))*Cs(serverpart)*(colon*(serverpart/tonumber)+Cc(nil)) local function hashed(str) if not str or str=="" then return { @@ -4332,7 +4554,14 @@ local function hashed(str) end local authority=detailed[2] local path=detailed[3] - local filename=nil + local filename + local username + local password + local host + local port + if authority~="" then + username,password,host,port=lpegmatch(splitauthority,authority) + end if authority=="" then filename=path elseif path=="" then @@ -4350,6 +4579,8 @@ local function hashed(str) original=str, noscheme=false, filename=filename, + host=host, + port=port, } end url.split=split @@ -4365,24 +4596,38 @@ function url.addscheme(str,scheme) end end function url.construct(hash) - local fullurl,f={},0 - local scheme,authority,path,query,fragment=hash.scheme,hash.authority,hash.path,hash.query,hash.fragment + local result,r={},0 + local scheme=hash.scheme + local authority=hash.authority + local path=hash.path + local queries=hash.queries + local fragment=hash.fragment if scheme and scheme~="" then - f=f+1;fullurl[f]=scheme.."://" + r=r+1;result[r]=lpegmatch(escaper,scheme) + r=r+1;result[r]="://" end if authority and authority~="" then - f=f+1;fullurl[f]=authority + r=r+1;result[r]=lpegmatch(escaper,authority) end if path and path~="" then - f=f+1;fullurl[f]="/"..path + r=r+1;result[r]="/" + r=r+1;result[r]=lpegmatch(escaper,path) end - if query and query~="" then - f=f+1;fullurl[f]="?"..query + if queries then + local done=false + for k,v in sortedhash(queries) do + r=r+1;result[r]=done and "&" or "?" + r=r+1;result[r]=lpegmatch(escaper,k) + r=r+1;result[r]="=" + r=r+1;result[r]=lpegmatch(escaper,v) + done=true + end end if fragment and fragment~="" then - f=f+1;fullurl[f]="#"..fragment + r=r+1;result[r]="#" + r=r+1;result[r]=lpegmatch(escaper,fragment) end - return lpegmatch(escaper,concat(fullurl)) + return concat(result) end local pattern=Cs(slash^-1/""*R("az","AZ")*((S(":|")/":")+P(":"))*slash*P(1)^0) function url.filename(filename) @@ -4998,7 +5243,7 @@ do -- create closure to overcome 200 locals limit package.loaded["l-unicode"] = package.loaded["l-unicode"] or true --- original size: 38263, stripped down to: 16330 +-- original size: 40036, stripped down to: 17837 if not modules then modules={} end modules ['l-unicode']={ version=1.001, @@ -5034,37 +5279,73 @@ if not unicode then unicode={ utf=utf } end if not utf.char then - local floor,char=math.floor,string.char - function utf.char(n) - if n<0x80 then - return char(n) - elseif n<0x800 then - return char( - 0xC0+floor(n/0x40), - 0x80+(n%0x40) - ) - elseif n<0x10000 then - return char( - 0xE0+floor(n/0x1000), - 0x80+(floor(n/0x40)%0x40), - 0x80+(n%0x40) - ) - elseif n<0x200000 then - return char( - 0xF0+floor(n/0x40000), - 0x80+(floor(n/0x1000)%0x40), - 0x80+(floor(n/0x40)%0x40), - 0x80+(n%0x40) - ) + utf.char=string.utfcharacter or (utf8 and utf8.char) + if not utf.char then + local char=string.char + if bit32 then + local rshift=bit32.rshift + function utf.char(n) + if n<0x80 then + return char(n) + elseif n<0x800 then + return char( + 0xC0+rshift(n,6), + 0x80+(n%0x40) + ) + elseif n<0x10000 then + return char( + 0xE0+rshift(n,12), + 0x80+(rshift(n,6)%0x40), + 0x80+(n%0x40) + ) + elseif n<0x200000 then + return char( + 0xF0+rshift(n,18), + 0x80+(rshift(n,12)%0x40), + 0x80+(rshift(n,6)%0x40), + 0x80+(n%0x40) + ) + else + return "" + end + end else - return "" + local floor=math.floor + function utf.char(n) + if n<0x80 then + return char(n) + elseif n<0x800 then + return char( + 0xC0+floor(n/0x40), + 0x80+(n%0x40) + ) + elseif n<0x10000 then + return char( + 0xE0+floor(n/0x1000), + 0x80+(floor(n/0x40)%0x40), + 0x80+(n%0x40) + ) + elseif n<0x200000 then + return char( + 0xF0+floor(n/0x40000), + 0x80+(floor(n/0x1000)%0x40), + 0x80+(floor(n/0x40)%0x40), + 0x80+(n%0x40) + ) + else + return "" + end + end end end end if not utf.byte then - local utf8byte=patterns.utf8byte - function utf.byte(c) - return lpegmatch(utf8byte,c) + utf.byte=string.utfvalue or (utf8 and utf8.codepoint) + if not utf.byte then + local utf8byte=patterns.utf8byte + function utf.byte(c) + return lpegmatch(utf8byte,c) + end end end local utfchar,utfbyte=utf.char,utf.byte @@ -5115,19 +5396,22 @@ function utf.is_valid(str) return type(str)=="string" and lpegmatch(validatedutf,str) or false end if not utf.len then - local n,f=0,1 - local utfcharcounter=patterns.utfbom^-1*Cmt ( - Cc(1)*patterns.utf8one^1+Cc(2)*patterns.utf8two^1+Cc(3)*patterns.utf8three^1+Cc(4)*patterns.utf8four^1, - function(_,t,d) - n=n+(t-f)/d - f=t - return true + utf.len=string.utflength or (utf8 and utf8.len) + if not utf.len then + local n,f=0,1 + local utfcharcounter=patterns.utfbom^-1*Cmt ( + Cc(1)*patterns.utf8one^1+Cc(2)*patterns.utf8two^1+Cc(3)*patterns.utf8three^1+Cc(4)*patterns.utf8four^1, + function(_,t,d) + n=n+(t-f)/d + f=t + return true + end + )^0 + function utf.len(str) + n,f=0,1 + lpegmatch(utfcharcounter,str or "") + return n end - )^0 - function utf.len(str) - n,f=0,1 - lpegmatch(utfcharcounter,str or "") - return n end end utf.length=utf.len @@ -5475,20 +5759,22 @@ function utf.utf32_to_utf8_t(t,endian) end local function little(b) if b<0x10000 then - return char(b%256,b/256) + return char(b%256,rshift(b,8)) else b=b-0x10000 - local b1,b2=b/1024+0xD800,b%1024+0xDC00 - return char(b1%256,b1/256,b2%256,b2/256) + local b1=rshift(b,10)+0xD800 + local b2=b%1024+0xDC00 + return char(b1%256,rshift(b1,8),b2%256,rshift(b2,8)) end end local function big(b) if b<0x10000 then - return char(b/256,b%256) + return char(rshift(b,8),b%256) else b=b-0x10000 - local b1,b2=b/1024+0xD800,b%1024+0xDC00 - return char(b1/256,b1%256,b2/256,b2%256) + local b1=rshift(b,10)+0xD800 + local b2=b%1024+0xDC00 + return char(rshift(b1,8),b1%256,rshift(b2,8),b2%256) end end local l_remap=Cs((p_utf8byte/little+P(1)/"")^0) @@ -5609,22 +5895,43 @@ function utf.chrlen(u) (u<0xFC and 5) or (u<0xFE and 6) or 0 end -local extract=bit32.extract -local char=string.char -function unicode.toutf32string(n) - if n<=0xFF then - return - char(n).."\000\000\000" - elseif n<=0xFFFF then - return - char(extract(n,0,8))..char(extract(n,8,8)).."\000\000" - elseif n<=0xFFFFFF then - return - char(extract(n,0,8))..char(extract(n,8,8))..char(extract(n,16,8)).."\000" - else - return - char(extract(n,0,8))..char(extract(n,8,8))..char(extract(n,16,8))..char(extract(n,24,8)) +if bit32 then + local extract=bit32.extract + local char=string.char + function unicode.toutf32string(n) + if n<=0xFF then + return + char(n).."\000\000\000" + elseif n<=0xFFFF then + return + char(extract(n,0,8))..char(extract(n,8,8)).."\000\000" + elseif n<=0xFFFFFF then + return + char(extract(n,0,8))..char(extract(n,8,8))..char(extract(n,16,8)).."\000" + else + return + char(extract(n,0,8))..char(extract(n,8,8))..char(extract(n,16,8))..char(extract(n,24,8)) + end + end +end +local len=utf.len +local rep=rep +function string.utfpadd(s,n) + if n and n~=0 then + local l=len(s) + if n>0 then + local d=n-l + if d>0 then + return rep(c or " ",d)..s + end + else + local d=- n-l + if d>0 then + return s..rep(c or " ",d) + end + end end + return s end @@ -5634,7 +5941,7 @@ do -- create closure to overcome 200 locals limit package.loaded["l-math"] = package.loaded["l-math"] or true --- original size: 974, stripped down to: 890 +-- original size: 2555, stripped down to: 1900 if not modules then modules={} end modules ['l-math']={ version=1.001, @@ -5643,21 +5950,23 @@ if not modules then modules={} end modules ['l-math']={ copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" } -local floor,sin,cos,tan=math.floor,math.sin,math.cos,math.tan if not math.ceiling then math.ceiling=math.ceil end if not math.round then + local floor=math.floor function math.round(x) return floor(x+0.5) end end if not math.div then + local floor=math.floor function math.div(n,m) return floor(n/m) end end if not math.mod then function math.mod(n,m) return n%m end end -local pipi=2*math.pi/360 if not math.sind then + local sin,cos,tan=math.sin,math.cos,math.tan + local pipi=2*math.pi/360 function math.sind(d) return sin(d*pipi) end function math.cosd(d) return cos(d*pipi) end function math.tand(d) return tan(d*pipi) end @@ -5666,6 +5975,60 @@ if not math.odd then function math.odd (n) return n%2~=0 end function math.even(n) return n%2==0 end end +if not math.cosh then + local exp=math.exp + function math.cosh(x) + local xx=exp(x) + return (xx+1/xx)/2 + end + function math.sinh(x) + local xx=exp(x) + return (xx-1/xx)/2 + end + function math.tanh(x) + local xx=exp(x) + return (xx-1/xx)/(xx+1/xx) + end +end +if not math.pow then + function math.pow(x,y) + return x^y + end +end +if not math.atan2 then + math.atan2=math.atan +end +if not math.ldexp then + function math.ldexp(x,e) + return x*2.0^e + end +end +if not math.log10 then + local log=math.log + function math.log10(x) + return log(x,10) + end +end +if not math.type then + function math.type() + return "float" + end +end +if not math.tointeger then + math.mininteger=-0x4FFFFFFFFFFF + math.maxinteger=0x4FFFFFFFFFFF + local floor=math.floor + function math.tointeger(n) + local f=floor(n) + return f==n and f or nil + end +end +if not math.ult then + local floor=math.floor + function math.tointeger(m,n) + return floor(m)<floor(n) + end +end end -- of closure @@ -5674,7 +6037,7 @@ do -- create closure to overcome 200 locals limit package.loaded["util-str"] = package.loaded["util-str"] or true --- original size: 36148, stripped down to: 20179 +-- original size: 38725, stripped down to: 21726 if not modules then modules={} end modules ['util-str']={ version=1.001, @@ -5688,13 +6051,13 @@ utilities.strings=utilities.strings or {} local strings=utilities.strings local format,gsub,rep,sub,find=string.format,string.gsub,string.rep,string.sub,string.find local load,dump=load,string.dump -local tonumber,type,tostring=tonumber,type,tostring +local tonumber,type,tostring,next=tonumber,type,tostring,next local unpack,concat=table.unpack,table.concat local P,V,C,S,R,Ct,Cs,Cp,Carg,Cc=lpeg.P,lpeg.V,lpeg.C,lpeg.S,lpeg.R,lpeg.Ct,lpeg.Cs,lpeg.Cp,lpeg.Carg,lpeg.Cc local patterns,lpegmatch=lpeg.patterns,lpeg.match -local utfchar,utfbyte=utf.char,utf.byte +local utfchar,utfbyte,utflen=utf.char,utf.byte,utf.len local loadstripped=nil -if _LUAVERSION<5.2 then +if LUAVERSION<5.2 then loadstripped=function(str,shortcuts) return load(str) end @@ -5782,6 +6145,17 @@ local pattern=Carg(1)/function(t) function strings.tabtospace(str,tab) return lpegmatch(pattern,str,1,tab or 7) end +function string.utfpadding(s,n) + if not n or n==0 then + return "" + end + local l=utflen(s) + if n>0 then + return nspaces[n-l] + else + return nspaces[-n-l] + end +end local space=spacer^0 local nospace=space/"" local endofline=nospace*newline @@ -5888,6 +6262,21 @@ function number.formatted(n,sep1,sep2) return lpegmatch(splitter,s,1,sep1 or ",",sep2 or ".") end end +local p=Cs( + P("-")^0*(P("0")^1/"")^0*(1-P("."))^0*(P(".")*P("0")^1*P(-1)/""+P(".")^0)*P(1-P("0")^1*P(-1))^0 + ) +function number.compactfloat(n,fmt) + if n==0 then + return "0" + elseif n==1 then + return "1" + end + n=lpegmatch(p,format(fmt or "%0.3f",n)) + if n=="." or n=="" or n=="-" then + return "0" + end + return n +end local zero=P("0")^1/"" local plus=P("+")/"" local minus=P("-") @@ -5940,7 +6329,7 @@ local template=[[ return function(%s) return %s end ]] local preamble,environment="",{} -if _LUAVERSION<5.2 then +if LUAVERSION<5.2 then preamble=[[ local lpeg=lpeg local type=type @@ -5955,6 +6344,7 @@ local utfchar=utf.char local utfbyte=utf.byte local lpegmatch=lpeg.match local nspaces=string.nspaces +local utfpadding=string.utfpadding local tracedchar=string.tracedchar local autosingle=string.autosingle local autodouble=string.autodouble @@ -5979,6 +6369,7 @@ else utfbyte=utf.byte, lpegmatch=lpeg.match, nspaces=string.nspaces, + utfpadding=string.utfpadding, tracedchar=string.tracedchar, autosingle=string.autosingle, autodouble=string.autodouble, @@ -6014,9 +6405,32 @@ local format_S=function(f) return format("tostring(a%s)",n) end end +local format_right=function(f) + n=n+1 + f=tonumber(f) + if not f or f==0 then + return format("(a%s or '')",n) + elseif f>0 then + return format("utfpadding(a%s,%i)..a%s",n,f,n) + else + return format("a%s..utfpadding(a%s,%i)",n,n,f) + end +end +local format_left=function(f) + n=n+1 + f=tonumber(f) + if not f or f==0 then + return format("(a%s or '')",n) + end + if f<0 then + return format("utfpadding(a%s,%i)..a%s",n,-f,n) + else + return format("a%s..utfpadding(a%s,%i)",n,n,-f) + end +end local format_q=function() n=n+1 - return format("(a%s and format('%%q',a%s) or '')",n,n) + return format("(a%s ~= nil and format('%%q',tostring(a%s)) or '')",n,n) end local format_Q=function() n=n+1 @@ -6268,6 +6682,8 @@ local builder=Cs { "start", +V("j")+V("J") +V("m")+V("M") +V("z") ++V(">") ++V("<") )+V("*") )*(P(-1)+Carg(1)) )^0, @@ -6285,7 +6701,7 @@ local builder=Cs { "start", ["X"]=(prefix_any*P("X"))/format_X, ["o"]=(prefix_any*P("o"))/format_o, ["S"]=(prefix_any*P("S"))/format_S, - ["Q"]=(prefix_any*P("Q"))/format_S, + ["Q"]=(prefix_any*P("Q"))/format_Q, ["N"]=(prefix_any*P("N"))/format_N, ["k"]=(prefix_sub*P("k"))/format_k, ["c"]=(prefix_any*P("c"))/format_c, @@ -6311,6 +6727,8 @@ local builder=Cs { "start", ["z"]=(prefix_any*P("z"))/format_z, ["a"]=(prefix_any*P("a"))/format_a, ["A"]=(prefix_any*P("A"))/format_A, + ["<"]=(prefix_any*P("<"))/format_left, + [">"]=(prefix_any*P(">"))/format_right, ["*"]=Cs(((1-P("%"))^1+P("%%")/"%%")^1)/format_rest, ["?"]=Cs(((1-P("%"))^1 )^1)/format_rest, ["!"]=Carg(2)*prefix_any*P("!")*C((1-P("!"))^1)*P("!")/format_extension, @@ -6341,7 +6759,7 @@ local function use(t,fmt,...) return t[fmt](...) end strings.formatters={} -if _LUAVERSION<5.2 then +if LUAVERSION<5.2 then function strings.formatters.new(noconcat) local t={ _type_="formatter",_connector_=noconcat and "," or "..",_extensions_={},_preamble_=preamble,_environment_={} } setmetatable(t,{ __index=make,__call=use }) @@ -6378,7 +6796,7 @@ patterns.xmlescape=Cs((P("<")/"<"+P(">")/">"+P("&")/"&"+P('"')/"" patterns.texescape=Cs((C(S("#$%\\{}"))/"\\%1"+P(1))^0) patterns.luaescape=Cs(((1-S('"\n'))^1+P('"')/'\\"'+P('\n')/'\\n"')^0) patterns.luaquoted=Cs(Cc('"')*((1-S('"\n'))^1+P('"')/'\\"'+P('\n')/'\\n"')^0*Cc('"')) -if _LUAVERSION<5.2 then +if LUAVERSION<5.2 then add(formatters,"xml",[[lpegmatch(xmlescape,%s)]],"local xmlescape = lpeg.patterns.xmlescape") add(formatters,"tex",[[lpegmatch(texescape,%s)]],"local texescape = lpeg.patterns.texescape") add(formatters,"lua",[[lpegmatch(luaescape,%s)]],"local luaescape = lpeg.patterns.luaescape") @@ -6400,6 +6818,21 @@ local pattern=Cs((newline/(os.newline or "\r")+1)^0) function string.replacenewlines(str) return lpegmatch(pattern,str) end +function strings.newcollector() + local result,r={},0 + return + function(fmt,str,...) + r=r+1 + result[r]=str==nil and fmt or formatters[fmt](str,...) + end, + function(connector) + if result then + local str=concat(result,connector) + result,r={},0 + return str + end + end +end end -- of closure @@ -6408,7 +6841,7 @@ do -- create closure to overcome 200 locals limit package.loaded["util-tab"] = package.loaded["util-tab"] or true --- original size: 27407, stripped down to: 17116 +-- original size: 27665, stripped down to: 17051 if not modules then modules={} end modules ['util-tab']={ version=1.001, @@ -6788,11 +7221,6 @@ function table.drop(t,slow) return fastdrop(t) end end -function table.autokey(t,k) - local v={} - t[k]=v - return v -end local selfmapper={ __index=function(t,k) t[k]=k return k end } function table.twowaymapper(t) if not t then @@ -7037,7 +7465,7 @@ do -- create closure to overcome 200 locals limit package.loaded["util-fil"] = package.loaded["util-fil"] or true --- original size: 7567, stripped down to: 5575 +-- original size: 7787, stripped down to: 5858 if not modules then modules={} end modules ['util-fil']={ version=1.001, @@ -7048,8 +7476,6 @@ if not modules then modules={} end modules ['util-fil']={ } local byte=string.byte local char=string.char -local extract=bit32 and bit32.extract -local floor=math.floor utilities=utilities or {} local files={} utilities.files=files @@ -7066,7 +7492,10 @@ function files.close(f) f:close() end function files.size(f) - return f:seek("end") + local current=f:seek() + local size=f:seek("end") + f:seek("set",current) + return size end files.getsize=files.size function files.setposition(f,n) @@ -7216,7 +7645,7 @@ function files.readfixed4(f) return (0x100*a+b )+(0x100*c+d)/0x10000 end end -if extract then +if bit32 then local extract=bit32.extract local band=bit32.band function files.read2dot14(f) @@ -7236,19 +7665,30 @@ end function files.skiplong(f,n) f:read(4*(n or 1)) end -function files.writecardinal2(f,n) - local a=char(n%256) - n=floor(n/256) - local b=char(n%256) - f:write(b,a) +if bit32 then + local rshift=bit32.rshift + function files.writecardinal2(f,n) + local a=char(n%256) + n=rshift(n,8) + local b=char(n%256) + f:write(b,a) + end +else + local floor=math.floor + function files.writecardinal2(f,n) + local a=char(n%256) + n=floor(n/256) + local b=char(n%256) + f:write(b,a) + end end function files.writecardinal4(f,n) local a=char(n%256) - n=floor(n/256) + n=rshift(n,8) local b=char(n%256) - n=floor(n/256) + n=rshift(n,8) local c=char(n%256) - n=floor(n/256) + n=rshift(n,8) local d=char(n%256) f:write(d,c,b,a) end @@ -7267,6 +7707,8 @@ if fio and fio.readcardinal1 then files.readinteger2=fio.readinteger2 files.readinteger3=fio.readinteger3 files.readinteger4=fio.readinteger4 + files.readfixed2=fio.readfixed2 + files.readfixed4=fio.readfixed4 files.read2dot14=fio.read2dot14 files.setposition=fio.setposition files.getposition=fio.getposition @@ -7634,7 +8076,7 @@ do -- create closure to overcome 200 locals limit package.loaded["util-sto"] = package.loaded["util-sto"] or true --- original size: 3926, stripped down to: 2742 +-- original size: 6449, stripped down to: 3069 if not modules then modules={} end modules ['util-sto']={ version=1.001, @@ -7643,7 +8085,7 @@ if not modules then modules={} end modules ['util-sto']={ copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" } -local setmetatable,getmetatable,type=setmetatable,getmetatable,type +local setmetatable,getmetatable,rawset,type=setmetatable,getmetatable,rawset,type utilities=utilities or {} utilities.storage=utilities.storage or {} local storage=utilities.storage @@ -7753,6 +8195,25 @@ function table.setmetatablecall(t,f) end return t end +function table.setmetatableindices(t,f,n,c) + if type(t)~="table" then + f,t=t,{} + end + local m=getmetatable(t) + local i=f_index[f] or f + if m then + m.__index=i + m.__newindex=n + m.__call=c + else + setmetatable(t,{ + __index=i, + __newindex=n, + __call=c, + }) + end + return t +end function table.setmetatablekey(t,key,value) local m=getmetatable(t) if not m then @@ -7774,7 +8235,7 @@ do -- create closure to overcome 200 locals limit package.loaded["util-prs"] = package.loaded["util-prs"] or true --- original size: 22883, stripped down to: 16045 +-- original size: 22956, stripped down to: 16106 if not modules then modules={} end modules ['util-prs']={ version=1.001, @@ -8192,14 +8653,16 @@ function parsers.rfc4180splitter(specification) local field=escaped+non_escaped+Cc("") local record=Ct(field*(separator*field)^1) local headerline=record*Cp() - local wholeblob=Ct((newline^(specification.strict and -1 or 1)*record)^0) + local morerecords=(newline^(specification.strict and -1 or 1)*record)^0 + local headeryes=Ct(morerecords) + local headernop=Ct(record*morerecords) return function(data,getheader) if getheader then local header,position=lpegmatch(headerline,data) - local data=lpegmatch(wholeblob,data,position) + local data=lpegmatch(headeryes,data,position) return data,header else - return lpegmatch(wholeblob,data) + return lpegmatch(headernop,data) end end end @@ -8220,8 +8683,8 @@ end local cardinal=lpegpatterns.cardinal/tonumber local spacers=lpegpatterns.spacer^0 local endofstring=lpegpatterns.endofstring -local stepper=spacers*(C(cardinal)*(spacers*S(":-")*spacers*(C(cardinal)+Cc(true) )+Cc(false) )*Carg(1)*Carg(2)/ranger*S(", ")^0 )^1 -local stepper=spacers*(C(cardinal)*(spacers*S(":-")*spacers*(C(cardinal)+(P("*")+endofstring)*Cc(true) )+Cc(false) )*Carg(1)*Carg(2)/ranger*S(", ")^0 )^1*endofstring +local stepper=spacers*(cardinal*(spacers*S(":-")*spacers*(cardinal+Cc(true) )+Cc(false) )*Carg(1)*Carg(2)/ranger*S(", ")^0 )^1 +local stepper=spacers*(cardinal*(spacers*S(":-")*spacers*(cardinal+(P("*")+endofstring)*Cc(true) )+Cc(false) )*Carg(1)*Carg(2)/ranger*S(", ")^0 )^1*endofstring function parsers.stepper(str,n,action) if type(n)=="function" then lpegmatch(stepper,str,1,false,n or print) @@ -8408,7 +8871,7 @@ do -- create closure to overcome 200 locals limit package.loaded["trac-set"] = package.loaded["trac-set"] or true --- original size: 12454, stripped down to: 8840 +-- original size: 13044, stripped down to: 9231 if not modules then modules={} end modules ['trac-set']={ version=1.001, @@ -8417,8 +8880,8 @@ if not modules then modules={} end modules ['trac-set']={ copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" } -local type,next,tostring=type,next,tostring -local concat=table.concat +local type,next,tostring,tonumber=type,next,tostring,tonumber +local concat,sortedhash=table.concat,table.sortedhash local format,find,lower,gsub,topattern=string.format,string.find,string.lower,string.gsub,string.topattern local is_boolean=string.is_boolean local settings_to_hash=utilities.parsers.settings_to_hash @@ -8435,7 +8898,7 @@ function setters.initialize(filename,name,values) frozen=true local data=setter.data if data then - for key,newvalue in next,values do + for key,newvalue in sortedhash(values) do local newvalue=is_boolean(newvalue,newvalue,true) local functions=data[key] if functions then @@ -8484,7 +8947,7 @@ local function set(t,what,newvalue) done={} t.done=done end - for w,value in next,what do + for w,value in sortedhash(what) do if value=="" then value=newvalue elseif not value then @@ -8493,7 +8956,7 @@ local function set(t,what,newvalue) value=is_boolean(value,value,true) end w=topattern(w,true,true) - for name,functions in next,data do + for name,functions in sortedhash(data) do if done[name] then elseif find(name,w) then done[name]=true @@ -8509,7 +8972,7 @@ end local function reset(t) local data=t.data if not data.frozen then - for name,functions in next,data do + for name,functions in sortedthash(data) do for i=1,#functions do functions[i](false) end @@ -8600,13 +9063,30 @@ function setters.show(t) local name=list[k] local functions=t.data[name] if functions then - local value,default,modules=functions.value,functions.default,#functions - value=value==nil and "unset" or tostring(value) - default=default==nil and "unset" or tostring(default) - t.report("%-50s modules: %2i default: %-12s value: %-12s",name,modules,default,value) + local value=functions.value + local default=functions.default + local modules=#functions + if default==nil then + default="unset" + elseif type(default)=="table" then + default=concat(default,"|") + else + default=tostring(default) + end + if value==nil then + value="unset" + elseif type(value)=="table" then + value=concat(value,"|") + else + value=tostring(value) + end + t.report(name) + t.report(" modules : %i",modules) + t.report(" default : %s",default) + t.report(" value : %s",value) + t.report() end end - t.report() end local enable,disable,register,list,show=setters.enable,setters.disable,setters.register,setters.list,setters.show function setters.report(setter,...) @@ -8720,7 +9200,7 @@ do -- create closure to overcome 200 locals limit package.loaded["trac-log"] = package.loaded["trac-log"] or true --- original size: 30007, stripped down to: 20818 +-- original size: 32737, stripped down to: 22946 if not modules then modules={} end modules ['trac-log']={ version=1.001, @@ -8739,7 +9219,8 @@ local datetime=os.date local openfile=io.open local setmetatableindex=table.setmetatableindex local formatters=string.formatters -local texgetcount=tex and tex.getcount +local settings_to_hash=utilities.parsers.settings_to_hash +local sortedkeys=table.sortedkeys local variant="default" logs=logs or {} local logs=logs @@ -9166,14 +9647,14 @@ logs.direct=direct logs.subdirect=subdirect logs.writer=writer logs.newline=newline -local data,states={},nil +local data={} +local states=nil +local force=false function logs.reporter(category,subcategory) local logger=data[category] if not logger then - local state=false - if states==true then - state=true - elseif type(states)=="table" then + local state=states==true + if not state and type(states)=="table" then for c,_ in next,states do if find(category,c) then state=true @@ -9191,7 +9672,7 @@ function logs.reporter(category,subcategory) if not reporter then if subcategory then reporter=function(...) - if not logger.state then + if force or not logger.state then subreport(category,subcategory,...) end end @@ -9199,7 +9680,7 @@ function logs.reporter(category,subcategory) else local tag=category reporter=function(...) - if not logger.state then + if force or not logger.state then report(category,...) end end @@ -9225,7 +9706,7 @@ function logs.messenger(category,subcategory) end end local function setblocked(category,value) - if category==true then + if category==true or category=="all" then category,value="*",true elseif category==false then category,value="*",false @@ -9238,7 +9719,8 @@ local function setblocked(category,value) v.state=value end else - states=utilities.parsers.settings_to_hash(category,type(states)=="table" and states or nil) + alllocked=false + states=settings_to_hash(category,type(states)=="table" and states or nil) for c in next,states do local v=data[c] if v then @@ -9261,7 +9743,7 @@ function logs.enable(category) setblocked(category,false) end function logs.categories() - return table.sortedkeys(data) + return sortedkeys(data) end function logs.show() local n,c,s,max=0,0,0,0 @@ -9283,7 +9765,7 @@ function logs.show() max=m end end - local subcategories=concat(table.sortedkeys(reporters),", ") + local subcategories=concat(sortedkeys(reporters),", ") if state==true then state="disabled" elseif state==false then @@ -9310,54 +9792,57 @@ end) directives.register("logs.target",function(v) settarget(v) end) -local report_pages=logs.reporter("pages") -local real,user,sub -function logs.start_page_number() - real=texgetcount("realpageno") - user=texgetcount("userpageno") - sub=texgetcount("subpageno") -end -local timing=false -local starttime=nil -local lasttime=nil -trackers.register("pages.timing",function(v) - starttime=os.clock() - timing=true -end) -function logs.stop_page_number() - if timing then - local elapsed,average - local stoptime=os.clock() - if not lasttime or real<2 then - elapsed=stoptime - average=stoptime - starttime=stoptime - else - elapsed=stoptime-lasttime - average=(stoptime-starttime)/(real-1) - end - lasttime=stoptime - if real<=0 then - report_pages("flushing page, time %0.04f / %0.04f",elapsed,average) - elseif user<=0 then - report_pages("flushing realpage %s, time %0.04f / %0.04f",real,elapsed,average) - elseif sub<=0 then - report_pages("flushing realpage %s, userpage %s, time %0.04f / %0.04f",real,user,elapsed,average) - else - report_pages("flushing realpage %s, userpage %s, subpage %s, time %0.04f / %0.04f",real,user,sub,elapsed,average) - end - else - if real<=0 then - report_pages("flushing page") - elseif user<=0 then - report_pages("flushing realpage %s",real) - elseif sub<=0 then - report_pages("flushing realpage %s, userpage %s",real,user) +if tex then + local report=logs.reporter("pages") + local texgetcount=tex and tex.getcount + local real,user,sub + function logs.start_page_number() + real=texgetcount("realpageno") + user=texgetcount("userpageno") + sub=texgetcount("subpageno") + end + local timing=false + local starttime=nil + local lasttime=nil + trackers.register("pages.timing",function(v) + starttime=os.clock() + timing=true + end) + function logs.stop_page_number() + if timing then + local elapsed,average + local stoptime=os.clock() + if not lasttime or real<2 then + elapsed=stoptime + average=stoptime + starttime=stoptime + else + elapsed=stoptime-lasttime + average=(stoptime-starttime)/(real-1) + end + lasttime=stoptime + if real<=0 then + report("flushing page, time %0.04f / %0.04f",elapsed,average) + elseif user<=0 then + report("flushing realpage %s, time %0.04f / %0.04f",real,elapsed,average) + elseif sub<=0 then + report("flushing realpage %s, userpage %s, time %0.04f / %0.04f",real,user,elapsed,average) + else + report("flushing realpage %s, userpage %s, subpage %s, time %0.04f / %0.04f",real,user,sub,elapsed,average) + end else - report_pages("flushing realpage %s, userpage %s, subpage %s",real,user,sub) + if real<=0 then + report("flushing page") + elseif user<=0 then + report("flushing realpage %s",real) + elseif sub<=0 then + report("flushing realpage %s, userpage %s",real,user) + else + report("flushing realpage %s, userpage %s, subpage %s",real,user,sub) + end end + logs.flush() end - logs.flush() end local nesting=0 local verbose=false @@ -9512,6 +9997,92 @@ io.stderr:setvbuf('no') if package.helpers.report then package.helpers.report=logs.reporter("package loader") end +if tex then + local finalactions={} + local fatalerrors={} + local possiblefatal={} + local loggingerrors=false + function logs.loggingerrors() + return loggingerrors + end + directives.register("logs.errors",function(v) + loggingerrors=v + if type(v)=="string" then + fatalerrors=settings_to_hash(v) + else + fatalerrors={} + end + end) + function logs.registerfinalactions(...) + insert(finalactions,...) + end + local what=nil + local report=nil + local state=nil + local target=nil + local function startlogging(t,r,w,s) + target=t + state=force + force=true + report=type(r)=="function" and r or logs.reporter(r) + what=w + pushtarget(target) + newline() + if s then + report("start %s: %s",what,s) + else + report("start %s",what) + end + if target=="logfile" then + newline() + end + return report + end + local function stoplogging() + if target=="logfile" then + newline() + end + report("stop %s",what) + if target=="logfile" then + newline() + end + poptarget() + state=oldstate + end + function logs.startfilelogging(...) + return startlogging("logfile",...) + end + logs.stopfilelogging=stoplogging + local done=false + function logs.starterrorlogging(r,w,...) + if not done then + pushtarget("terminal") + newline() + logs.report("error logging","start possible issues") + poptarget() + done=true + end + if fatalerrors[w] then + possiblefatal[w]=true + end + return startlogging("terminal",r,w,...) + end + logs.stoperrorlogging=stoplogging + function logs.finalactions() + if #finalactions>0 then + for i=1,#finalactions do + finalactions[i]() + end + if done then + pushtarget("terminal") + newline() + logs.report("error logging","stop possible issues") + poptarget() + end + return next(possiblefatal) and sortedkeys(possiblefatal) or false + end + end +end end -- of closure @@ -9520,7 +10091,7 @@ do -- create closure to overcome 200 locals limit package.loaded["trac-inf"] = package.loaded["trac-inf"] or true --- original size: 8036, stripped down to: 5567 +-- original size: 8284, stripped down to: 5698 if not modules then modules={} end modules ['trac-inf']={ version=1.001, @@ -9556,7 +10127,7 @@ local ticks=clock local seconds=function(n) return n or 0 end local function starttiming(instance) local timer=timers[instance or "notimer"] - local it=timer.timing or 0 + local it=timer.timing if it==0 then timer.starttime=ticks() if not timer.loadtime then @@ -9586,7 +10157,7 @@ local function stoptiming(instance) end local function elapsed(instance) if type(instance)=="number" then - return instance or 0 + return instance else local timer=timers[instance or "notimer"] return timer and seconds(timer.loadtime) or 0 @@ -9627,8 +10198,9 @@ function statistics.show() return format("%s, type: %s, binary subtree: %s", os.platform or "unknown",os.type or "unknown",environment.texos or "unknown") end) - register("luatex banner",function() - return lower(status.banner) + register("used engine",function() + return format("%s version %s with functionality level %s, banner: %s", + LUATEXENGINE,LUATEXVERSION,LUATEXFUNCTIONALITY,lower(status.banner)) end) register("control sequences",function() return format("%s of %s + %s",status.cs_count,status.hash_size,status.hash_extra) @@ -9650,8 +10222,9 @@ function statistics.show() local hashchar=tonumber(status.luatex_hashchars) local hashtype=status.luatex_hashtype local mask=lua.mask or "ascii" - return format("engine: %s, used memory: %s, hash type: %s, hash chars: min(%s,40), symbol mask: %s (%s)", + return format("engine: %s %s, used memory: %s, hash type: %s, hash chars: min(%i,40), symbol mask: %s (%s)", jit and "luajit" or "lua", + LUAVERSION, statistics.memused(), hashtype or "default", hashchar and 2^hashchar or "unknown", @@ -9707,7 +10280,7 @@ do -- create closure to overcome 200 locals limit package.loaded["trac-pro"] = package.loaded["trac-pro"] or true --- original size: 5829, stripped down to: 3501 +-- original size: 5841, stripped down to: 3511 if not modules then modules={} end modules ['trac-pro']={ version=1.001, @@ -9716,7 +10289,7 @@ if not modules then modules={} end modules ['trac-pro']={ copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" } -local getmetatable,setmetatable,rawset,type=getmetatable,setmetatable,rawset,type +local getmetatable,setmetatable,rawset,type,next=getmetatable,setmetatable,rawset,type,next local trace_namespaces=false trackers.register("system.namespaces",function(v) trace_namespaces=v end) local report_system=logs.reporter("system","protection") namespaces=namespaces or {} @@ -9854,7 +10427,7 @@ do -- create closure to overcome 200 locals limit package.loaded["util-lua"] = package.loaded["util-lua"] or true --- original size: 5396, stripped down to: 3708 +-- original size: 6921, stripped down to: 4998 if not modules then modules={} end modules ['util-lua']={ version=1.001, @@ -9865,13 +10438,14 @@ if not modules then modules={} end modules ['util-lua']={ license="see context related readme files" } local rep,sub,byte,dump,format=string.rep,string.sub,string.byte,string.dump,string.format -local load,loadfile,type=load,loadfile,type +local load,loadfile,type,collectgarbage=load,loadfile,type,collectgarbage utilities=utilities or {} utilities.lua=utilities.lua or {} local luautilities=utilities.lua local report_lua=logs.reporter("system","lua") +local report_mem=logs.reporter("system","lua memory") local tracestripping=false -local forcestupidcompile=true +local tracememory=false luautilities.stripcode=true luautilities.alwaysstripcode=false luautilities.nofstrippedchunks=0 @@ -9915,11 +10489,19 @@ local function stupidcompile(luafile,lucfile,strip) end return false,0 end -function luautilities.loadedluacode(fullname,forcestrip,name) +function luautilities.loadedluacode(fullname,forcestrip,name,macros) name=name or fullname local code,message - if environment.loadpreprocessedfile then - code,message=environment.loadpreprocessedfile(fullname) + if macros then + macros=lua.macros + end + if macros and macros.enabled then + local f=io.open(fullname,"rb") local c=f:read("*a") f:close() + local n=c and macros.resolvestring("--[["..fullname.."]] "..c) + if n and #n~=#c then + report_lua("preprocessed file %a: %i => %i bytes",fullname,#c,#n) + end + code,message=load(n or c) else code,message=loadfile(fullname) end @@ -9945,7 +10527,7 @@ function luautilities.loadedluacode(fullname,forcestrip,name) return code,0 end end -function luautilities.strippedloadstring(code,forcestrip,name) +function luautilities.strippedloadstring(code,name,forcestrip) local code,message=load(code) if not code then report_lua("loading of file %a failed:\n\t%s",name,message or "no message") @@ -9957,6 +10539,13 @@ function luautilities.strippedloadstring(code,forcestrip,name) return code,0 end end +function luautilities.loadstring(code,name) + local code,message=load(code) + if not code then + report_lua("loading of file %a failed:\n\t%s",name,message or "no message") + end + return code,0 +end function luautilities.compile(luafile,lucfile,cleanup,strip,fallback) report_lua("compiling %a into %a",luafile,lucfile) os.remove(lucfile) @@ -9987,6 +10576,26 @@ setmetatable(finalizers,{ function luautilities.registerfinalizer(f) finalizers[#finalizers+1]=f end +function luautilities.checkmemory(previous,threshold,trace) + local current=collectgarbage("count") + if previous then + local checked=(threshold or 64)*1024 + local delta=current-previous + if current-previous>checked then + collectgarbage("collect") + local afterwards=collectgarbage("count") + if trace or tracememory then + report_mem("previous %i MB, current %i MB, delta %i MB, threshold %i MB, afterwards %i MB", + previous/1024,current/1024,delta/1024,threshold,afterwards) + end + return afterwards + elseif trace or tracememory then + report_mem("previous %i MB, current %i MB, delta %i MB, threshold %i MB", + previous/1024,current/1024,delta/1024,threshold) + end + end + return current +end end -- of closure @@ -9995,7 +10604,7 @@ do -- create closure to overcome 200 locals limit package.loaded["util-deb"] = package.loaded["util-deb"] or true --- original size: 8911, stripped down to: 6504 +-- original size: 8984, stripped down to: 6573 if not modules then modules={} end modules ['util-deb']={ version=1.001, @@ -10121,7 +10730,8 @@ function debugger.showstats(printer,threshold) local functions=0 local dataset={} local length=0 - local wholetime=0 + local realtime=0 + local totaltime=0 local threshold=threshold or 0 for name,sources in next,names do for source,lines in next,sources do @@ -10138,8 +10748,9 @@ function debugger.showstats(printer,threshold) if real<0 then real=0 end - wholetime=wholetime+real + realtime=realtime+real end + totaltime=totaltime+total if line<0 then line=0 end @@ -10174,7 +10785,7 @@ function debugger.showstats(printer,threshold) if length>50 then length=50 end - local fmt=string.formatters["%4.9k %4.9k %3.3k %8i %-"..length.."s %4i %s"] + local fmt=string.formatters["%4.9k s %3.3k %% %4.9k s %3.3k %% %8i # %-"..length.."s %4i %s"] for i=1,#dataset do local data=dataset[i] local real=data[1] @@ -10183,14 +10794,13 @@ function debugger.showstats(printer,threshold) local name=data[4] local source=data[5] local line=data[6] - local percent=real/wholetime calls=calls+count functions=functions+1 name=gsub(name,"%s+"," ") if #name>length then name=sub(name,1,length) end - printer(fmt(seconds(total),seconds(real),percent,count,name,line,source)) + printer(fmt(seconds(total),100*total/totaltime,seconds(real),100*real/realtime,count,name,line,source)) end printer("") printer(format("functions : %i",functions)) @@ -10254,7 +10864,7 @@ do -- create closure to overcome 200 locals limit package.loaded["util-tpl"] = package.loaded["util-tpl"] or true --- original size: 7100, stripped down to: 3978 +-- original size: 7112, stripped down to: 3988 if not modules then modules={} end modules ['util-tpl']={ version=1.001, @@ -10267,7 +10877,7 @@ utilities.templates=utilities.templates or {} local templates=utilities.templates local trace_template=false trackers.register("templates.trace",function(v) trace_template=v end) local report_template=logs.reporter("template") -local tostring=tostring +local tostring,next=tostring,next local format,sub,byte=string.format,string.sub,string.byte local P,C,R,Cs,Cc,Carg,lpegmatch,lpegpatterns=lpeg.P,lpeg.C,lpeg.R,lpeg.Cs,lpeg.Cc,lpeg.Carg,lpeg.match,lpeg.patterns local replacer @@ -10399,7 +11009,7 @@ do -- create closure to overcome 200 locals limit package.loaded["util-sbx"] = package.loaded["util-sbx"] or true --- original size: 20309, stripped down to: 13848 +-- original size: 20393, stripped down to: 13924 if not modules then modules={} end modules ['util-sbx']={ version=1.001, @@ -10424,6 +11034,7 @@ local concat=string.concat local unquoted=string.unquoted local optionalquoted=string.optionalquoted local basename=file.basename +local nameonly=file.nameonly local sandbox=sandbox local validroots={} local validrunners={} @@ -10503,9 +11114,9 @@ local function registerlibrary(name) return end if validlibraries==true then - validlibraries={ [name]=true } + validlibraries={ [nameonly(name)]=true } else - validlibraries[name]=true + validlibraries[nameonly(name)]=true end elseif name==true then validlibraries={} @@ -10780,7 +11391,7 @@ function sandbox.getrunner(name) return name and validrunners[name] end local function suspicious(str) - return (find(str,"[/\\]") or find(command,"%.%.")) and true or false + return (find(str,"[/\\]") or find(command,"..",1,true)) and true or false end local function binaryrunner(action,command,...) if validbinaries==false then @@ -10830,15 +11441,15 @@ if FFISUPPORTED and ffi then end end end - local load=ffi.load - if load then + local fiiload=ffi.load + if fiiload then local reported={} function ffi.load(name,...) if validlibraries==false then elseif validlibraries==true then - return load(name,...) - elseif validlibraries[name] then - return load(name,...) + return fiiload(name,...) + elseif validlibraries[nameonly(name)] then + return fiiload(name,...) else end if not reported[name] then @@ -11083,7 +11694,7 @@ do -- create closure to overcome 200 locals limit package.loaded["util-env"] = package.loaded["util-env"] or true --- original size: 9246, stripped down to: 5038 +-- original size: 9400, stripped down to: 5499 if not modules then modules={} end modules ['util-env']={ version=1.001, @@ -11098,8 +11709,21 @@ local unquoted,quoted,optionalquoted=string.unquoted,string.quoted,string.option local concat,insert,remove=table.concat,table.insert,table.remove environment=environment or {} local environment=environment -os.setlocale(nil,nil) -function os.setlocale() +local setlocale=os.setlocale +setlocale(nil,nil) +local report=logs.reporter("system") +function os.setlocale(a,b) + if a or b then + if report then + report() + report("You're messing with os.locale in a supposedly locale neutral enviroment. From") + report("now on are on your own and without support. Crashes or unexpected side effects") + report("can happen but don't bother the luatex and context developer team with it.") + report() + report=nil + end + setlocale(a,b) + end end local validengines=allocate { ["luatex"]=true, @@ -11270,7 +11894,7 @@ do -- create closure to overcome 200 locals limit package.loaded["luat-env"] = package.loaded["luat-env"] or true --- original size: 6174, stripped down to: 4141 +-- original size: 5820, stripped down to: 4155 if not modules then modules={} end modules ['luat-env']={ version=1.001, @@ -11344,11 +11968,11 @@ local function strippable(filename) return false end end -function environment.luafilechunk(filename,silent) +function environment.luafilechunk(filename,silent,macros) filename=file.replacesuffix(filename,"lua") local fullname=environment.luafile(filename) if fullname and fullname~="" then - local data=luautilities.loadedluacode(fullname,strippable,filename) + local data=luautilities.loadedluacode(fullname,strippable,filename,macros) if not silent then report_lua("loading file %a %s",fullname,not data and "failed" or "succeeded") end @@ -11423,7 +12047,7 @@ do -- create closure to overcome 200 locals limit package.loaded["lxml-tab"] = package.loaded["lxml-tab"] or true --- original size: 57003, stripped down to: 35696 +-- original size: 59638, stripped down to: 37936 if not modules then modules={} end modules ['lxml-tab']={ version=1.001, @@ -11469,8 +12093,17 @@ local entities,parameters local strip,utfize,resolve,cleanup,resolve_predefined,unify_predefined local dcache,hcache,acache local mt,dt,nt +local currentfilename,currentline,linenumbers +local grammar_parsed_text_one +local grammar_parsed_text_two +local grammar_unparsed_text +local handle_hex_entity +local handle_dec_entity +local handle_any_entity_dtd +local handle_any_entity_text local function preparexmlstate(settings) if settings then + linenumbers=settings.linenumbers stack={} level=0 top={} @@ -11487,6 +12120,8 @@ local function preparexmlstate(settings) unify_predefined=settings.unify_predefined_entities cleanup=settings.text_cleanup entities=settings.entities or {} + currentfilename=settings.currentresource + currentline=1 parameters={} reported_at_errors={} dcache={} @@ -11501,6 +12136,7 @@ local function preparexmlstate(settings) resolve_predefined=true end else + linenumbers=false stack=nil level=nil top=nil @@ -11522,6 +12158,8 @@ local function preparexmlstate(settings) dcache=nil hcache=nil acache=nil + currentfilename=nil + currentline=1 end end local function initialize_mt(root) @@ -11559,14 +12197,24 @@ local function add_empty(spacing,namespace,tag) top=stack[level] dt=top.dt nt=#dt+1 - local t={ + local t=linenumbers and { + ns=namespace or "", + rn=resolved, + tg=tag, + at=at, + dt={}, + ni=nt, + cf=currentfilename, + cl=currentline, + __p__=top, + } or { ns=namespace or "", rn=resolved, tg=tag, at=at, dt={}, ni=nt, - __p__=top + __p__=top, } dt[nt]=t setmetatable(t,mt) @@ -11581,18 +12229,28 @@ local function add_begin(spacing,namespace,tag) dt[nt]=spacing end local resolved=namespace=="" and xmlns[#xmlns] or nsremap[namespace] or namespace - top={ + dt={} + top=linenumbers and { ns=namespace or "", rn=resolved, tg=tag, at=at, - dt={}, + dt=dt, + ni=nil, + cf=currentfilename, + cl=currentline, + __p__=stack[level], + } or { + ns=namespace or "", + rn=resolved, + tg=tag, + at=at, + dt=dt, ni=nil, - __p__=stack[level] + __p__=stack[level], } setmetatable(top,mt) - dt=top.dt - nt=#dt + nt=0 level=level+1 stack[level]=top at={} @@ -11660,7 +12318,15 @@ local function add_special(what,spacing,text) if strip and (what=="@cm@" or what=="@dt@") then else nt=nt+1 - dt[nt]={ + dt[nt]=linenumbers and { + special=true, + ns="", + tg=what, + ni=nil, + dt={ text }, + cf=currentfilename, + cl=currentline, + } or { special=true, ns="", tg=what, @@ -11688,12 +12354,6 @@ local function attribute_specification_error(str) end return str end -local grammar_parsed_text_one -local grammar_parsed_text_two -local handle_hex_entity -local handle_dec_entity -local handle_any_entity_dtd -local handle_any_entity_text do local badentity="&" xml.placeholders={ @@ -12095,7 +12755,13 @@ local function handle_crap_error(chr) add_text(chr) return chr end +local function handlenewline() + currentline=currentline+1 +end +local spacetab=S(' \t') local space=S(' \r\n\t') +local newline=lpegpatterns.newline/handlenewline +local anything=P(1) local open=P('<') local close=P('>') local squote=S("'") @@ -12111,43 +12777,9 @@ local name_nop=C(P(true))*C(valid^1) local name=name_yes+name_nop local utfbom=lpegpatterns.utfbom local spacing=C(space^0) -local anyentitycontent=(1-open-semicolon-space-close-ampersand)^0 -local hexentitycontent=R("AF","af","09")^1 -local decentitycontent=R("09")^1 -local parsedentity=P("#")/""*( - P("x")/""*(hexentitycontent/handle_hex_entity)+(decentitycontent/handle_dec_entity) - )+(anyentitycontent/handle_any_entity_dtd) -local parsedentity_text=P("#")/""*( - P("x")/""*(hexentitycontent/handle_hex_entity)+(decentitycontent/handle_dec_entity) - )+(anyentitycontent/handle_any_entity_text) -local entity=(ampersand/"")*parsedentity*(semicolon/"")+ampersand*(anyentitycontent/handle_end_entity) -local entity_text=(ampersand/"")*parsedentity_text*(semicolon/"")+ampersand*(anyentitycontent/handle_end_entity) -local text_unparsed=C((1-open)^1) -local text_parsed=(Cs((1-open-ampersand)^1)/add_text+Cs(entity_text)/add_text)^1 -local somespace=space^1 -local optionalspace=space^0 -local value=(squote*Cs((entity+(1-squote))^0)*squote)+(dquote*Cs((entity+(1-dquote))^0)*dquote) -local endofattributes=slash*close+close -local whatever=space*name*optionalspace*equal -local wrongvalue=Cs(P(entity+(1-space-endofattributes))^1)/attribute_value_error -local attributevalue=value+wrongvalue -local attribute=(somespace*name*optionalspace*equal*optionalspace*attributevalue)/add_attribute -local attributes=(attribute+somespace^-1*(((1-endofattributes)^1)/attribute_specification_error))^0 -local parsedtext=text_parsed -local unparsedtext=text_unparsed/add_text -local balanced=P { "["*((1-S"[]")+V(1))^0*"]" } -local emptyelement=(spacing*open*name*attributes*optionalspace*slash*close)/add_empty -local beginelement=(spacing*open*name*attributes*optionalspace*close)/add_begin -local endelement=(spacing*open*slash*name*optionalspace*close)/add_end -local begincomment=open*P("!--") -local endcomment=P("--")*close -local begininstruction=open*P("?") -local endinstruction=P("?")*close -local begincdata=open*P("![CDATA[") -local endcdata=P("]]")*close -local someinstruction=C((1-endinstruction)^0) -local somecomment=C((1-endcomment )^0) -local somecdata=C((1-endcdata )^0) +local space_nl=spacetab+newline +local spacing_nl=Cs((space_nl)^0) +local anything_nl=newline+P(1) local function weirdentity(k,v) if trace_entities then report_xml("registering %s entity %a as %a","weird",k,v) @@ -12172,59 +12804,114 @@ local function publicentity(k,v,n) end entities[k]=v end -local begindoctype=open*P("!DOCTYPE") -local enddoctype=close -local beginset=P("[") -local endset=P("]") -local wrdtypename=C((1-somespace-P(";"))^1) -local doctypename=C((1-somespace-close)^0) -local elementdoctype=optionalspace*P("<!ELEMENT")*(1-close)^0*close -local basiccomment=begincomment*((1-endcomment)^0)*endcomment -local weirdentitytype=P("%")*(somespace*doctypename*somespace*value)/weirdentity -local normalentitytype=(doctypename*somespace*value)/normalentity -local publicentitytype=(doctypename*somespace*P("PUBLIC")*somespace*value)/publicentity -local systementitytype=(doctypename*somespace*P("SYSTEM")*somespace*value*somespace*P("NDATA")*somespace*doctypename)/systementity -local entitydoctype=optionalspace*P("<!ENTITY")*somespace*(systementitytype+publicentitytype+normalentitytype+weirdentitytype)*optionalspace*close -local function weirdresolve(s) - lpegmatch(entitydoctype,parameters[s]) -end -local function normalresolve(s) - lpegmatch(entitydoctype,entities[s]) -end -local entityresolve=P("%")*(wrdtypename/weirdresolve )*P(";")+P("&")*(wrdtypename/normalresolve)*P(";") -entitydoctype=entitydoctype+entityresolve -local doctypeset=beginset*optionalspace*P(elementdoctype+entitydoctype+entityresolve+basiccomment+space)^0*optionalspace*endset -local definitiondoctype=doctypename*somespace*doctypeset -local publicdoctype=doctypename*somespace*P("PUBLIC")*somespace*value*somespace*value*somespace*doctypeset -local systemdoctype=doctypename*somespace*P("SYSTEM")*somespace*value*somespace*doctypeset -local simpledoctype=(1-close)^1 -local somedoctype=C((somespace*(publicdoctype+systemdoctype+definitiondoctype+simpledoctype)*optionalspace)^0) -local instruction=(spacing*begininstruction*someinstruction*endinstruction)/function(...) add_special("@pi@",...) end -local comment=(spacing*begincomment*somecomment*endcomment )/function(...) add_special("@cm@",...) end -local cdata=(spacing*begincdata*somecdata*endcdata )/function(...) add_special("@cd@",...) end -local doctype=(spacing*begindoctype*somedoctype*enddoctype )/function(...) add_special("@dt@",...) end -local crap_parsed=1-beginelement-endelement-emptyelement-begininstruction-begincomment-begincdata-ampersand -local crap_unparsed=1-beginelement-endelement-emptyelement-begininstruction-begincomment-begincdata -local parsedcrap=Cs((crap_parsed^1+entity_text)^1)/handle_crap_error -local parsedcrap=Cs((crap_parsed^1+entity_text)^1)/handle_crap_error -local unparsedcrap=Cs((crap_unparsed )^1)/handle_crap_error -local trailer=space^0*(text_unparsed/set_message)^0 -grammar_parsed_text_one=P { "preamble", - preamble=utfbom^0*instruction^0*(doctype+comment+instruction)^0, -} -grammar_parsed_text_two=P { "followup", - followup=V("parent")*trailer, - parent=beginelement*V("children")^0*endelement, - children=parsedtext+V("parent")+emptyelement+comment+cdata+instruction+parsedcrap, -} -local grammar_unparsed_text=P { "preamble", - preamble=utfbom^0*instruction^0*(doctype+comment+instruction)^0*V("parent")*trailer, - parent=beginelement*V("children")^0*endelement, - children=unparsedtext+V("parent")+emptyelement+comment+cdata+instruction+unparsedcrap, -} -local function _xmlconvert_(data,settings) +local function install(spacenewline,spacing,anything) + local anyentitycontent=(1-open-semicolon-space-close-ampersand)^0 + local hexentitycontent=R("AF","af","09")^1 + local decentitycontent=R("09")^1 + local parsedentity=P("#")/""*( + P("x")/""*(hexentitycontent/handle_hex_entity)+(decentitycontent/handle_dec_entity) + )+(anyentitycontent/handle_any_entity_dtd) + local parsedentity_text=P("#")/""*( + P("x")/""*(hexentitycontent/handle_hex_entity)+(decentitycontent/handle_dec_entity) + )+(anyentitycontent/handle_any_entity_text) + local entity=(ampersand/"")*parsedentity*(semicolon/"")+ampersand*(anyentitycontent/handle_end_entity) + local entity_text=(ampersand/"")*parsedentity_text*(semicolon/"")+ampersand*(anyentitycontent/handle_end_entity) + local text_unparsed=Cs((anything-open)^1) + local text_parsed=(Cs((anything-open-ampersand)^1)/add_text+Cs(entity_text)/add_text)^1 + local somespace=(spacenewline)^1 + local optionalspace=(spacenewline)^0 + local value=(squote*Cs((entity+(anything-squote))^0)*squote)+(dquote*Cs((entity+(anything-dquote))^0)*dquote) + local endofattributes=slash*close+close + local whatever=space*name*optionalspace*equal + local wrongvalue=Cs(P(entity+(1-space-endofattributes))^1)/attribute_value_error + local attributevalue=value+wrongvalue + local attribute=(somespace*name*optionalspace*equal*optionalspace*attributevalue)/add_attribute + local attributes=(attribute+somespace^-1*(((anything-endofattributes)^1)/attribute_specification_error))^0 + local parsedtext=text_parsed + local unparsedtext=text_unparsed/add_text + local balanced=P { "["*((anything-S"[]")+V(1))^0*"]" } + local emptyelement=(spacing*open*name*attributes*optionalspace*slash*close)/add_empty + local beginelement=(spacing*open*name*attributes*optionalspace*close)/add_begin + local endelement=(spacing*open*slash*name*optionalspace*close)/add_end + local begincomment=open*P("!--") + local endcomment=P("--")*close + local begininstruction=open*P("?") + local endinstruction=P("?")*close + local begincdata=open*P("![CDATA[") + local endcdata=P("]]")*close + local someinstruction=C((anything-endinstruction)^0) + local somecomment=C((anything-endcomment )^0) + local somecdata=C((anything-endcdata )^0) + local begindoctype=open*P("!DOCTYPE") + local enddoctype=close + local beginset=P("[") + local endset=P("]") + local wrdtypename=C((anything-somespace-P(";"))^1) + local doctypename=C((anything-somespace-close)^0) + local elementdoctype=optionalspace*P("<!ELEMENT")*(anything-close)^0*close + local basiccomment=begincomment*((anything-endcomment)^0)*endcomment + local weirdentitytype=P("%")*(somespace*doctypename*somespace*value)/weirdentity + local normalentitytype=(doctypename*somespace*value)/normalentity + local publicentitytype=(doctypename*somespace*P("PUBLIC")*somespace*value)/publicentity + local systementitytype=(doctypename*somespace*P("SYSTEM")*somespace*value*somespace*P("NDATA")*somespace*doctypename)/systementity + local entitydoctype=optionalspace*P("<!ENTITY")*somespace*(systementitytype+publicentitytype+normalentitytype+weirdentitytype)*optionalspace*close + local function weirdresolve(s) + lpegmatch(entitydoctype,parameters[s]) + end + local function normalresolve(s) + lpegmatch(entitydoctype,entities[s]) + end + local entityresolve=P("%")*(wrdtypename/weirdresolve )*P(";")+P("&")*(wrdtypename/normalresolve)*P(";") + entitydoctype=entitydoctype+entityresolve + local doctypeset=beginset*optionalspace*P(elementdoctype+entitydoctype+entityresolve+basiccomment+space)^0*optionalspace*endset + local definitiondoctype=doctypename*somespace*doctypeset + local publicdoctype=doctypename*somespace*P("PUBLIC")*somespace*value*somespace*value*somespace*doctypeset + local systemdoctype=doctypename*somespace*P("SYSTEM")*somespace*value*somespace*doctypeset + local simpledoctype=(anything-close)^1 + local somedoctype=C((somespace*(publicdoctype+systemdoctype+definitiondoctype+simpledoctype)*optionalspace)^0) + local instruction=(spacing*begininstruction*someinstruction*endinstruction)/function(...) add_special("@pi@",...) end + local comment=(spacing*begincomment*somecomment*endcomment )/function(...) add_special("@cm@",...) end + local cdata=(spacing*begincdata*somecdata*endcdata )/function(...) add_special("@cd@",...) end + local doctype=(spacing*begindoctype*somedoctype*enddoctype )/function(...) add_special("@dt@",...) end + local crap_parsed=anything-beginelement-endelement-emptyelement-begininstruction-begincomment-begincdata-ampersand + local crap_unparsed=anything-beginelement-endelement-emptyelement-begininstruction-begincomment-begincdata + local parsedcrap=Cs((crap_parsed^1+entity_text)^1)/handle_crap_error + local parsedcrap=Cs((crap_parsed^1+entity_text)^1)/handle_crap_error + local unparsedcrap=Cs((crap_unparsed )^1)/handle_crap_error + local trailer=space^0*(text_unparsed/set_message)^0 + local grammar_parsed_text_one=P { "preamble", + preamble=utfbom^0*instruction^0*(doctype+comment+instruction)^0, + } + local grammar_parsed_text_two=P { "followup", + followup=V("parent")*trailer, + parent=beginelement*V("children")^0*endelement, + children=parsedtext+V("parent")+emptyelement+comment+cdata+instruction+parsedcrap, + } + local grammar_unparsed_text=P { "preamble", + preamble=utfbom^0*instruction^0*(doctype+comment+instruction)^0*V("parent")*trailer, + parent=beginelement*V("children")^0*endelement, + children=unparsedtext+V("parent")+emptyelement+comment+cdata+instruction+unparsedcrap, + } + return grammar_parsed_text_one,grammar_parsed_text_two,grammar_unparsed_text +end +grammar_parsed_text_one_nop, +grammar_parsed_text_two_nop, +grammar_unparsed_text_nop=install(space,spacing,anything) +grammar_parsed_text_one_yes, +grammar_parsed_text_two_yes, +grammar_unparsed_text_yes=install(space_nl,spacing_nl,anything_nl) +local function _xmlconvert_(data,settings,detail) settings=settings or {} preparexmlstate(settings) + if settings.linenumbers then + grammar_parsed_text_one=grammar_parsed_text_one_yes + grammar_parsed_text_two=grammar_parsed_text_two_yes + grammar_unparsed_text=grammar_unparsed_text_yes + else + grammar_parsed_text_one=grammar_parsed_text_one_nop + grammar_parsed_text_two=grammar_parsed_text_two_nop + grammar_unparsed_text=grammar_unparsed_text_nop + end local preprocessor=settings.preprocessor if data and data~="" and type(preprocessor)=="function" then data=preprocessor(data,settings) or data @@ -12241,6 +12928,8 @@ local function _xmlconvert_(data,settings) nt=0 if not data or data=="" then errorstr="empty xml file" + elseif data==true then + errorstr=detail or "problematic xml file" elseif utfize or resolve then local m=lpegmatch(grammar_parsed_text_one,data) if m then @@ -12272,7 +12961,7 @@ local function _xmlconvert_(data,settings) if errorhandler then local currentresource=settings.currentresource if currentresource and currentresource~="" then - xml.errorhandler(formatters["load error in [%s]: %s"](currentresource,errorstr)) + xml.errorhandler(formatters["load error in [%s]: %s"](currentresource,errorstr),currentresource) else xml.errorhandler(formatters["load error: %s"](errorstr)) end @@ -12315,8 +13004,10 @@ local function xmlconvert(data,settings) local ok,result=pcall(function() return _xmlconvert_(data,settings) end) if ok then return result + elseif type(result)=="string" then + return _xmlconvert_(true,settings,result) else - return _xmlconvert_("",settings) + return _xmlconvert_(true,settings) end end xml.convert=xmlconvert @@ -13945,7 +14636,7 @@ do -- create closure to overcome 200 locals limit package.loaded["lxml-mis"] = package.loaded["lxml-mis"] or true --- original size: 3684, stripped down to: 1957 +-- original size: 3574, stripped down to: 1863 if not modules then modules={} end modules ['lxml-mis']={ version=1.001, @@ -13955,8 +14646,8 @@ if not modules then modules={} end modules ['lxml-mis']={ license="see context related readme files" } local xml,lpeg,string=xml,lpeg,string +local type=type local concat=table.concat -local type,next,tonumber,tostring,setmetatable,loadstring=type,next,tonumber,tostring,setmetatable,loadstring local format,gsub,match=string.format,string.gsub,string.match local lpegmatch,lpegpatterns=lpeg.match,lpeg.patterns local P,S,R,C,V,Cc,Cs=lpeg.P,lpeg.S,lpeg.R,lpeg.C,lpeg.V,lpeg.Cc,lpeg.Cs @@ -14014,7 +14705,7 @@ do -- create closure to overcome 200 locals limit package.loaded["lxml-aux"] = package.loaded["lxml-aux"] or true --- original size: 29835, stripped down to: 21174 +-- original size: 30650, stripped down to: 21793 if not modules then modules={} end modules ['lxml-aux']={ version=1.001, @@ -14034,7 +14725,7 @@ local type,next,setmetatable,getmetatable=type,next,setmetatable,getmetatable local insert,remove,fastcopy,concat=table.insert,table.remove,table.fastcopy,table.concat local gmatch,gsub,format,find,strip=string.gmatch,string.gsub,string.format,string.find,string.strip local utfbyte=utf.byte -local lpegmatch=lpeg.match +local lpegmatch,lpegpatterns=lpeg.match,lpeg.patterns local striplinepatterns=utilities.strings.striplinepatterns local function report(what,pattern,c,e) report_xml("%s element %a, root %a, position %a, index %a, pattern %a",what,xmlname(e),xmlname(e.__p__),c,e.ni,pattern) @@ -14375,7 +15066,9 @@ local function include(xmldata,pattern,attribute,recursive,loaddata,level) end local data=nil if name and name~="" then - data=loaddata(name) or "" + local d,n=loaddata(name) + data=d or "" + name=n or name if trace_inclusions then report_xml("including %s bytes from %a at level %s by pattern %a and attribute %a (%srecursing)",#data,name,level,pattern,attribute or "",recursive and "" or "not ") end @@ -14385,6 +15078,9 @@ local function include(xmldata,pattern,attribute,recursive,loaddata,level) elseif ekat["parse"]=="text" then epdt[ek.ni]=xml.escaped(data) else +local settings=xmldata.settings +local savedresource=settings.currentresource +settings.currentresource=name local xi=xmlinheritedconvert(data,xmldata) if not xi then epdt[ek.ni]="" @@ -14395,6 +15091,7 @@ local function include(xmldata,pattern,attribute,recursive,loaddata,level) local child=xml.body(xi) child.__p__=ekrt child.__f__=name +child.cf=name epdt[ek.ni]=child local settings=xmldata.settings local inclusions=settings and settings.inclusions @@ -14415,6 +15112,7 @@ local function include(xmldata,pattern,attribute,recursive,loaddata,level) end end end +settings.currentresource=savedresource end end end @@ -14458,13 +15156,12 @@ end function xml.badinclusions(e,sorted) return getinclusions("badinclusions",e,sorted) end -local b_collapser=lpeg.patterns.b_collapser -local m_collapser=lpeg.patterns.m_collapser -local e_collapser=lpeg.patterns.e_collapser -local b_stripper=lpeg.patterns.b_stripper -local m_stripper=lpeg.patterns.m_stripper -local e_stripper=lpeg.patterns.e_stripper -local lpegmatch=lpeg.match +local b_collapser=lpegpatterns.b_collapser +local m_collapser=lpegpatterns.m_collapser +local e_collapser=lpegpatterns.e_collapser +local b_stripper=lpegpatterns.b_stripper +local m_stripper=lpegpatterns.m_stripper +local e_stripper=lpegpatterns.e_stripper local function stripelement(e,nolines,anywhere) local edt=e.dt if edt then @@ -14876,6 +15573,27 @@ function xml.totable(x,strip,flat) return convert(x,strip,flat) end end +function xml.rename(e,namespace,name,attributes) + if type(e)~="table" or not e.tg then + return + end + if type(name)=="table" then + attributes=name + name=namespace + namespace="" + elseif type(name)~="string" then + attributes={} + name=namespace + namespace="" + end + if type(attributes)~="table" then + attributes={} + end + e.ns=namespace + e.rn=namespace + e.tg=name + e.at=attributes +end end -- of closure @@ -14884,7 +15602,7 @@ do -- create closure to overcome 200 locals limit package.loaded["lxml-xml"] = package.loaded["lxml-xml"] or true --- original size: 10274, stripped down to: 7538 +-- original size: 10412, stripped down to: 7669 if not modules then modules={} end modules ['lxml-xml']={ version=1.001, @@ -14893,6 +15611,7 @@ if not modules then modules={} end modules ['lxml-xml']={ copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" } +local tonumber,next=tonumber,next local concat=table.concat local find,lower,upper=string.find,string.lower,string.upper local xml=xml @@ -15012,6 +15731,9 @@ local function xmltotext(root) return xmlserialize(root,xmltexthandler) or "" end end +function xml.serializetotext(root) + return root and xmlserialize(root,xmltexthandler) or "" +end local function text(collected) if collected then local e=collected[1] or collected @@ -15684,7 +16406,7 @@ do -- create closure to overcome 200 locals limit package.loaded["data-exp"] = package.loaded["data-exp"] or true --- original size: 17958, stripped down to: 10705 +-- original size: 18105, stripped down to: 11207 if not modules then modules={} end modules ['data-exp']={ version=1.001, @@ -15883,38 +16605,41 @@ local nofscans=0 local scancache={} local fullcache={} local nofsharedscans=0 +local addcasecraptoo=true local function scan(files,remap,spec,path,n,m,r,onlyone,tolerant) local full=path=="" and spec or (spec..path..'/') - local dirs={} + local dirlist={} local nofdirs=0 local pattern=tolerant and lessweird or weird + local filelist={} + local noffiles=0 for name in directory(full) do if not lpegmatch(pattern,name) then local mode=attributes(full..name,"mode") if mode=="file" then n=n+1 - local lower=lower(name) - local paths=files[lower] - if paths then - if onlyone then - else - if type(paths)=="string" then - files[lower]={ paths,path } - else - paths[#paths+1]=path - end - if name~=lower then - local rl=remap[lower] - if not rl then - remap[lower]=name - r=r+1 - elseif trace_globbing and rl~=name then - report_globbing("confusing filename, name: %a, lower: %a, already: %a",name,lower,rl) - end - end - end - else - files[lower]=path + noffiles=noffiles+1 + filelist[noffiles]=name + elseif mode=="directory" then + m=m+1 + nofdirs=nofdirs+1 + if path~="" then + dirlist[nofdirs]=path.."/"..name + else + dirlist[nofdirs]=name + end + end + end + end + if noffiles>0 then + sort(filelist) + for i=1,noffiles do + local name=filelist[i] + local lower=lower(name) + local paths=files[lower] + if paths then + if onlyone then + else if name~=lower then local rl=remap[lower] if not rl then @@ -15923,23 +16648,41 @@ local function scan(files,remap,spec,path,n,m,r,onlyone,tolerant) elseif trace_globbing and rl~=name then report_globbing("confusing filename, name: %a, lower: %a, already: %a",name,lower,rl) end + if addcasecraptoo then + local paths=files[name] + if not paths then + files[name]=path + elseif type(paths)=="string" then + files[name]={ paths,path } + else + paths[#paths+1]=path + end + end + end + if type(paths)=="string" then + files[lower]={ paths,path } + else + paths[#paths+1]=path end end - elseif mode=="directory" then - m=m+1 - nofdirs=nofdirs+1 - if path~="" then - dirs[nofdirs]=path.."/"..name - else - dirs[nofdirs]=name + else + files[lower]=path + if name~=lower then + local rl=remap[lower] + if not rl then + remap[lower]=name + r=r+1 + elseif trace_globbing and rl~=name then + report_globbing("confusing filename, name: %a, lower: %a, already: %a",name,lower,rl) + end end end end end if nofdirs>0 then - sort(dirs) + sort(dirlist) for i=1,nofdirs do - files,remap,n,m,r=scan(files,remap,spec,dirs[i],n,m,r,onlyonce,tolerant) + files,remap,n,m,r=scan(files,remap,spec,dirlist[i],n,m,r,onlyonce,tolerant) end end scancache[sub(full,1,-2)]=files @@ -16068,7 +16811,7 @@ do -- create closure to overcome 200 locals limit package.loaded["data-env"] = package.loaded["data-env"] or true --- original size: 9342, stripped down to: 6887 +-- original size: 9360, stripped down to: 6903 if not modules then modules={} end modules ['data-env']={ version=1.001, @@ -16078,6 +16821,7 @@ if not modules then modules={} end modules ['data-env']={ license="see context related readme files", } local lower,gsub=string.lower,string.gsub +local next=next local resolvers=resolvers local allocate=utilities.storage.allocate local setmetatableindex=table.setmetatableindex @@ -16352,7 +17096,7 @@ do -- create closure to overcome 200 locals limit package.loaded["data-tmp"] = package.loaded["data-tmp"] or true --- original size: 16088, stripped down to: 11435 +-- original size: 16116, stripped down to: 11459 if not modules then modules={} end modules ['data-tmp']={ version=1.100, @@ -16366,6 +17110,7 @@ local concat=table.concat local mkdirs,isdir,isfile=dir.mkdirs,lfs.isdir,lfs.isfile local addsuffix,is_writable,is_readable=file.addsuffix,file.is_writable,file.is_readable local formatters=string.formatters +local next,type=next,type local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end) local trace_cache=false trackers.register("resolvers.cache",function(v) trace_cache=v end) local report_caches=logs.reporter("resolvers","caches") @@ -16500,7 +17245,7 @@ function caches.usedpaths(separator) end end function caches.configfiles() - return concat(resolvers.instance.specification,";") + return concat(resolvers.configurationfiles(),";") end function caches.hashed(tree) tree=gsub(tree,"[\\/]+$","") @@ -16838,7 +17583,7 @@ do -- create closure to overcome 200 locals limit package.loaded["data-res"] = package.loaded["data-res"] or true --- original size: 67524, stripped down to: 46632 +-- original size: 68263, stripped down to: 47789 if not modules then modules={} end modules ['data-res']={ version=1.001, @@ -16912,8 +17657,7 @@ local usertypes=resolvers.usertypes local dangerous=resolvers.dangerous local suffixmap=resolvers.suffixmap resolvers.defaultsuffixes={ "tex" } -resolvers.instance=resolvers.instance or nil -local instance=resolvers.instance or nil +local instance=nil function resolvers.setenv(key,value,raw) if instance then instance.environment[key]=value @@ -16948,27 +17692,30 @@ local variableresolver=Cs((variable+P(1))^0) local function expandedvariable(var) return lpegmatch(variableexpander,var) or var end -function resolvers.newinstance() +function resolvers.reset() if trace_locating then report_resolving("creating instance") end - local environment,variables,expansions,order=allocate(),allocate(),allocate(),allocate() - local newinstance={ + local environment={} + local variables={} + local expansions={} + local order={} + instance={ environment=environment, variables=variables, expansions=expansions, order=order, - files=allocate(), - setups=allocate(), - found=allocate(), - foundintrees=allocate(), - hashes=allocate(), - hashed=allocate(), + files={}, + setups={}, + found={}, + foundintrees={}, + hashes={}, + hashed={}, pathlists=false, - specification=allocate(), - lists=allocate(), - data=allocate(), - fakepaths=allocate(), + specification={}, + lists={}, + data={}, + fakepaths={}, remember=true, diskcache=true, renewcache=false, @@ -17015,15 +17762,9 @@ function resolvers.newinstance() t[k]=v return v end) - return newinstance -end -function resolvers.setinstance(someinstance) - instance=someinstance - resolvers.instance=someinstance - return someinstance end -function resolvers.reset() - return resolvers.setinstance(resolvers.newinstance()) +function resolvers.initialized() + return instance~=nil end local function reset_hashes() instance.lists={} @@ -17192,8 +17933,12 @@ local function load_configuration_files() report_resolving("warning: no lua configuration files found") end end +function resolvers.configurationfiles() + return instance.specification or {} +end local function load_file_databases() - instance.loaderror,instance.files=false,allocate() + instance.loaderror=false + instance.files={} if not instance.renewcache then local hashes=instance.hashes for k=1,#hashes do @@ -17404,7 +18149,7 @@ function resolvers.stackpath() return currentpath~="" and currentpath or nil end local done={} -function resolvers.resetextrapath() +function resolvers.resetextrapaths() local ep=instance.extra_paths if not ep then done={} @@ -17414,6 +18159,9 @@ function resolvers.resetextrapath() reset_caches() end end +function resolvers.getextrapaths() + return instance.extra_paths or {} +end function resolvers.registerextrapath(paths,subpaths) if not subpaths or subpaths=="" then if not paths or path=="" then @@ -17573,9 +18321,8 @@ function resolvers.cleanedpathlist(v) end return t end -function resolvers.expandbraces(str) - local ori=str - local pth=expandedpathfromlist(resolvers.splitpath(ori)) +function resolvers.expandbraces(str) + local pth=expandedpathfromlist(resolvers.splitpath(str)) return joinpath(pth) end function resolvers.registerfilehash(name,content,someerror) @@ -17588,6 +18335,17 @@ function resolvers.registerfilehash(name,content,someerror) end end end +function resolvers.getfilehashes() + return instance and instance.files or {} +end +function resolvers.gethashes() + return instance and instance.hashes or {} +end +function resolvers.renewcache() + if instance then + instance.renewcache=true + end +end local function isreadable(name) local readable=isfile(name) if trace_detail then @@ -17602,7 +18360,7 @@ end local function collect_files(names) local filelist={} local noffiles=0 - local function check(hash,root,pathname,path,name) + local function check(hash,root,pathname,path,basename,name) if not pathname or find(path,pathname) then local variant=hash.type local search=filejoin(root,path,name) @@ -17641,10 +18399,10 @@ local function collect_files(names) local metadata=content.metadata local realroot=metadata and metadata.path or hashname if type(path)=="string" then - check(hash,realroot,pathname,path,name) + check(hash,realroot,pathname,path,basename,name) else for i=1,#path do - check(hash,realroot,pathname,path[i],name) + check(hash,realroot,pathname,path[i],basename,name) end end end @@ -17660,17 +18418,26 @@ function resolvers.registerintrees(filename,format,filetype,usedmethod,foundname local foundintrees=instance.foundintrees if usedmethod=="direct" and filename==foundname and fit[foundname] then else + local collapsed=collapsepath(foundname,true) local t={ filename=filename, - format=format~="" and format or nil, + format=format~="" and format or nil, filetype=filetype~="" and filetype or nil, usedmethod=usedmethod, foundname=foundname, + fullname=collapsed, } fit[foundname]=t foundintrees[#foundintrees+1]=t end end +function resolvers.foundintrees() + return instance.foundintrees or {} +end +function resolvers.foundintree(fullname) + local f=fit[fullname] + return f and f.usedmethod=="database" +end local function can_be_dir(name) local fakepaths=instance.fakepaths if not fakepaths[name] then @@ -17685,10 +18452,12 @@ end local preparetreepattern=Cs((P(".")/"%%."+P("-")/"%%-"+P(1))^0*Cc("$")) local collect_instance_files local function find_analyze(filename,askedformat,allresults) - local filetype,wantedfiles,ext='',{},suffixonly(filename) + local filetype='' + local filesuffix=suffixonly(filename) + local wantedfiles={} wantedfiles[#wantedfiles+1]=filename if askedformat=="" then - if ext=="" or not suffixmap[ext] then + if filesuffix=="" or not suffixmap[filesuffix] then local defaultsuffixes=resolvers.defaultsuffixes local formatofsuffix=resolvers.formatofsuffix for i=1,#defaultsuffixes do @@ -17706,7 +18475,7 @@ local function find_analyze(filename,askedformat,allresults) end end else - if ext=="" or not suffixmap[ext] then + if filesuffix=="" or not suffixmap[filesuffix] then local format_suffixes=suffixes[askedformat] if format_suffixes then for i=1,#format_suffixes do @@ -17851,7 +18620,7 @@ end local function find_intree(filename,filetype,wantedfiles,allresults) local pathlists=instance.pathlists if not pathlists then - pathlists=setmetatableindex(allocate(),makepathlist) + pathlists=setmetatableindex({},makepathlist) instance.pathlists=pathlists end local pathlist=pathlists[filetype] @@ -18254,15 +19023,21 @@ function resolvers.findwildcardfile(filename) end function resolvers.automount() end -function resolvers.load(option) +function resolvers.starttiming() statistics.starttiming(instance) +end +function resolvers.stoptiming() + statistics.stoptiming(instance) +end +function resolvers.load(option) + resolvers.starttiming() identify_configuration_files() load_configuration_files() if option~="nofiles" then load_databases() resolvers.automount() end - statistics.stoptiming(instance) + resolvers.stoptiming() local files=instance.files return files and next(files) and true end @@ -18354,7 +19129,6 @@ function resolvers.booleanvariable(str,default) end end function resolvers.dowithfilesintree(pattern,handle,before,after) - local instance=resolvers.instance local hashes=instance.hashes for i=1,#hashes do local hash=hashes[i] @@ -18392,6 +19166,31 @@ local obsolete=resolvers.obsolete or {} resolvers.obsolete=obsolete resolvers.find_file=resolvers.findfile obsolete.find_file=resolvers.findfile resolvers.find_files=resolvers.findfiles obsolete.find_files=resolvers.findfiles +function resolvers.knownvariables(pattern) + if instance then + local environment=instance.environment + local variables=instance.variables + local expansions=instance.expansions + local order=instance.order + local pattern=upper(pattern or "") + local result={} + for i=1,#order do + for key in next,order[i] do + if result[key]==nil and key~="" and (pattern=="" or find(upper(key),pattern)) then + result[key]={ + environment=rawget(environment,key), + variable=key, + expansion=expansions[key], + resolved=resolveprefix(expansions[key]), + } + end + end + end + return result + else + return {} + end +end end -- of closure @@ -18802,7 +19601,7 @@ do -- create closure to overcome 200 locals limit package.loaded["data-use"] = package.loaded["data-use"] or true --- original size: 4045, stripped down to: 3110 +-- original size: 4272, stripped down to: 3289 if not modules then modules={} end modules ['data-use']={ version=1.001, @@ -18822,7 +19621,7 @@ function resolvers.automount(usecache) mountpaths=caches.getreadablepaths("mount") end if mountpaths and #mountpaths>0 then - statistics.starttiming(resolvers.instance) + resolvers.starttiming() for k=1,#mountpaths do local root=mountpaths[k] local f=io.open(root.."/url.tmi") @@ -18842,7 +19641,7 @@ function resolvers.automount(usecache) f:close() end end - statistics.stoptiming(resolvers.instance) + resolvers.stoptiming() end end statistics.register("used config file",function() return caches.configfiles() end) @@ -18856,6 +19655,7 @@ function statistics.savefmtstatus(texname,formatbanner,sourcefile,kind,banner) formatbanner=formatbanner, sourcehash=md5.hex(io.loaddata(resolvers.findfile(sourcefile)) or "unknown"), sourcefile=sourcefile, + luaversion=LUAVERSION, } io.savedata(luvname,table.serialize(luvdata,true)) lua.registerfinalizer(function() @@ -18880,6 +19680,10 @@ function statistics.checkfmtstatus(texname) if luvhash~=sourcehash then return format("source mismatch (luv: %s <> bin: %s)",luvhash,sourcehash) end + local luvluaversion=luv.luaversion or 0 + if luvluaversion~=LUAVERSION then + return format("lua mismatch (luv: %s <> bin: %s)",luvluaversion,LUAVERSION) + end else return "invalid status file" end @@ -18897,7 +19701,7 @@ do -- create closure to overcome 200 locals limit package.loaded["data-zip"] = package.loaded["data-zip"] or true --- original size: 8772, stripped down to: 6841 +-- original size: 8716, stripped down to: 6795 if not modules then modules={} end modules ['data-zip']={ version=1.001, @@ -19070,17 +19874,16 @@ function resolvers.usezipfile(archive) if archive and not registeredfiles[archive] then local z=zip.openarchive(archive) if z then - local instance=resolvers.instance local tree=url.query(specification.query).tree or "" if trace_locating then report_zip("registering: archive %a",archive) end - statistics.starttiming(instance) + resolvers.starttiming() resolvers.prependhash('zip',archive) resolvers.extendtexmfvariable(archive) registeredfiles[archive]=z - instance.files[archive]=resolvers.registerzipfile(z,tree) - statistics.stoptiming(instance) + resolvers.registerfilehash(archive,resolvers.registerzipfile(z,tree)) + resolvers.stoptiming() elseif trace_locating then report_zip("registering: unknown archive %a",archive) end @@ -19323,7 +20126,7 @@ do -- create closure to overcome 200 locals limit package.loaded["data-sch"] = package.loaded["data-sch"] or true --- original size: 6653, stripped down to: 5467 +-- original size: 6753, stripped down to: 5511 if not modules then modules={} end modules ['data-sch']={ version=1.001, @@ -19332,13 +20135,14 @@ if not modules then modules={} end modules ['data-sch']={ copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" } -local load=load +local load,tonumber=load,tonumber local gsub,concat,format=string.gsub,table.concat,string.format local finders,openers,loaders=resolvers.finders,resolvers.openers,resolvers.loaders local trace_schemes=false trackers.register("resolvers.schemes",function(v) trace_schemes=v end) local report_schemes=logs.reporter("resolvers","schemes") local http=require("socket.http") local ltn12=require("ltn12") +if mbox then mbox=nil end local resolvers=resolvers local schemes=resolvers.schemes or {} resolvers.schemes=schemes @@ -19378,7 +20182,7 @@ local runner=sandbox.registerrunner { name="curl resolver", method="execute", program="curl", - template="--silent -- insecure --create-dirs --output %cachename% %original%", + template="--silent --insecure --create-dirs --output %cachename% %original%", checkers={ cachename="cache", original="url", @@ -19624,7 +20428,7 @@ do -- create closure to overcome 200 locals limit package.loaded["data-aux"] = package.loaded["data-aux"] or true --- original size: 2431, stripped down to: 1996 +-- original size: 2438, stripped down to: 2003 if not modules then modules={} end modules ['data-aux']={ version=1.001, @@ -19660,7 +20464,7 @@ function resolvers.updatescript(oldname,newname) if trace_locating then report_scripts("old and new script are the same") end - elseif not find(newscript,scriptpath) then + elseif not find(newscript,scriptpath,1,true) then if trace_locating then report_scripts("new script should come from %a",scriptpath) end @@ -19747,7 +20551,7 @@ do -- create closure to overcome 200 locals limit package.loaded["data-lst"] = package.loaded["data-lst"] or true --- original size: 2734, stripped down to: 2354 +-- original size: 1823, stripped down to: 1591 if not modules then modules={} end modules ['data-lst']={ version=1.001, @@ -19756,14 +20560,14 @@ if not modules then modules={} end modules ['data-lst']={ copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" } -local rawget,type,next=rawget,type,next -local find,concat,upper=string.find,table.concat,string.upper -local fastcopy,sortedpairs=table.fastcopy,table.sortedpairs +local type=type +local concat,sortedhash=table.concat,table.sortedhash local resolvers=resolvers local listers=resolvers.listers or {} resolvers.listers=listers local resolveprefix=resolvers.resolve local report_lists=logs.reporter("resolvers","lists") +local report_resolved=logs.reporter("system","resolved") local function tabstr(str) if type(str)=='table' then return concat(str," | ") @@ -19772,39 +20576,17 @@ local function tabstr(str) end end function listers.variables(pattern) - local instance=resolvers.instance - local environment=instance.environment - local variables=instance.variables - local expansions=instance.expansions - local pattern=upper(pattern or "") - local configured={} - local order=instance.order - for i=1,#order do - for k,v in next,order[i] do - if v~=nil and configured[k]==nil then - configured[k]=v - end - end - end - local env=fastcopy(environment) - local var=fastcopy(variables) - local exp=fastcopy(expansions) - for key,value in sortedpairs(configured) do - if key~="" and (pattern=="" or find(upper(key),pattern)) then - report_lists(key) - report_lists(" env: %s",tabstr(rawget(environment,key)) or "unset") - report_lists(" var: %s",tabstr(configured[key]) or "unset") - report_lists(" exp: %s",tabstr(expansions[key]) or "unset") - report_lists(" res: %s",tabstr(resolveprefix(expansions[key])) or "unset") - end - end - instance.environment=fastcopy(env) - instance.variables=fastcopy(var) - instance.expansions=fastcopy(exp) + local result=resolvers.knownvariables(pattern) + for key,value in sortedhash(result) do + report_lists(key) + report_lists(" env: %s",tabstr(value.environment or "unset")) + report_lists(" var: %s",tabstr(value.variable or "unset")) + report_lists(" exp: %s",tabstr(value.expansion or "unset")) + report_lists(" res: %s",tabstr(value.resolved or "unset")) + end end -local report_resolved=logs.reporter("system","resolved") function listers.configurations() - local configurations=resolvers.instance.specification + local configurations=resolvers.configurationfiles() for i=1,#configurations do report_resolved("file : %s",resolveprefix(configurations[i])) end @@ -19827,7 +20609,7 @@ do -- create closure to overcome 200 locals limit package.loaded["util-lib"] = package.loaded["util-lib"] or true --- original size: 13595, stripped down to: 7500 +-- original size: 14943, stripped down to: 8305 if not modules then modules={} end modules ['util-lib']={ version=1.001, @@ -19846,6 +20628,7 @@ local pathpart=file.pathpart local nameonly=file.nameonly local joinfile=file.join local removesuffix=file.removesuffix +local addsuffix=file.addsuffix local findfile=resolvers.findfile local findfiles=resolvers.findfiles local expandpaths=resolvers.expandedpathlistfromvariable @@ -19865,13 +20648,20 @@ local function locate(required,version,trace,report,action) local required_path=pathpart(required_full) local required_base=nameonly(required_full) if qualifiedpath(required) then - if isfile(required) then + if isfile(addsuffix(required,os.libsuffix)) then + if trace then + report("qualified name %a found",required) + end found_library=required + else + if trace then + report("qualified name %a not found",required) + end end else local required_name=required_base.."."..os.libsuffix local version=type(version)=="string" and version~="" and version or false - local engine=environment.ownmain or false + local engine="luatex" if trace and not done then local list=expandpaths("lib") for i=1,#list do @@ -19930,9 +20720,11 @@ local function locate(required,version,trace,report,action) end package.extralibpath(environment.ownpath) local paths=package.libpaths() + local pattern="/[^/]+%."..os.libsuffix.."$" for i=1,#paths do - local found=check(lfs.isfile) - if found and (not checkpattern or find(found,checkpattern)) then + required_path=gsub(paths[i],pattern,"") + local found=check(lfs.isfound) + if type(found)=="string" and (not checkpattern or find(found,checkpattern)) then return found end end @@ -19962,18 +20754,20 @@ local function locate(required,version,trace,report,action) if trace then report("found: %a",found_library) end - local message,result=action(found_library,required_base) + local result,message=action(found_library,required_base) if result then library=result else library=false - report("load error: message %a, library %a",tostring(message),found_library or "no library") + report("load error: message %a, library %a",tostring(message or "unknown"),found_library or "no library") end end - if not library then - report("unknown: %a",required) - elseif trace then - report("stored: %a",required) + if trace then + if not library then + report("unknown library: %a",required) + else + report("stored library: %a",required) + end end return library end @@ -20000,13 +20794,12 @@ do local libtype=type(library) if libtype=="function" then library=library() - message=true else report_swiglib("load error: %a returns %a, message %a, library %a",opener,libtype,(string.gsub(message or "no message","[%s]+$","")),found_library or "no library") library=false end popdir() - return message,library + return library end) loadedlibs[required]=library or false end @@ -20050,29 +20843,48 @@ if FFISUPPORTED and ffi and ffi.load then local trace_ffilib=false local savedffiload=ffi.load trackers.register("resolvers.ffilib",function(v) trace_ffilib=v end) + local loaded={} local function locateindeed(name) - local message,library=pcall(savedffiload,removesuffix(name)) - if type(library)=="userdata" then - return library - else - return false + name=removesuffix(name) + local l=loaded[name] + if l==nil then + local message,library=pcall(savedffiload,name) + if type(message)=="userdata" then + l=message + elseif type(library)=="userdata" then + l=library + else + l=false + end + loaded[name]=l + elseif trace_ffilib then + report_ffilib("reusing already loaded %a",name) end + return l end - function ffilib(required,version) - if version=="system" then + function ffilib(name,version) + name=removesuffix(name) + local l=loaded[name] + if l~=nil then + if trace_ffilib then + report_ffilib("reusing already loaded %a",name) + end + return l + elseif version=="system" then return locateindeed(name) else - return locate(required,version,trace_ffilib,report_ffilib,locateindeed) + return locate(name,version,trace_ffilib,report_ffilib,locateindeed) end end function ffi.load(name) local library=ffilib(name) if type(library)=="userdata" then return library - else + end + if trace_ffilib then report_ffilib("trying to load %a using normal loader",name) - return savedffiload(name) end + return savedffiload(name) end end @@ -20186,7 +20998,7 @@ do -- create closure to overcome 200 locals limit package.loaded["luat-fmt"] = package.loaded["luat-fmt"] or true --- original size: 9144, stripped down to: 7291 +-- original size: 9268, stripped down to: 7401 if not modules then modules={} end modules ['luat-fmt']={ version=1.001, @@ -20225,6 +21037,9 @@ local function secondaryflags() if arguments.silent then flags[#flags+1]="--c:silent" end + if arguments.errors then + flags[#flags+1]="--c:errors" + end if arguments.jit then flags[#flags+1]="--c:jiton" end @@ -20261,6 +21076,7 @@ local runners={ function environment.make_format(name,arguments) local engine=environment.ownmain or "luatex" local silent=environment.arguments.silent + local errors=environment.arguments.errors local olddir=dir.current() local path=caches.getwritablepath("formats",engine) or "" if path~="" then @@ -20416,10 +21232,10 @@ end end -- of closure --- used libraries : l-lua.lua l-sandbox.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-fil.lua util-sac.lua util-sto.lua util-prs.lua util-fmt.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-tpl.lua util-sbx.lua util-mrg.lua util-env.lua luat-env.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.lua data-ini.lua data-exp.lua data-env.lua data-tmp.lua data-met.lua data-res.lua data-pre.lua data-inp.lua data-out.lua data-fil.lua data-con.lua data-use.lua data-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua util-lib.lua luat-sta.lua luat-fmt.lua +-- used libraries : l-lua.lua l-macro.lua l-sandbox.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-fil.lua util-sac.lua util-sto.lua util-prs.lua util-fmt.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-tpl.lua util-sbx.lua util-mrg.lua util-env.lua luat-env.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.lua data-ini.lua data-exp.lua data-env.lua data-tmp.lua data-met.lua data-res.lua data-pre.lua data-inp.lua data-out.lua data-fil.lua data-con.lua data-use.lua data-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua util-lib.lua luat-sta.lua luat-fmt.lua -- skipped libraries : - --- original bytes : 842443 --- stripped bytes : 306317 +-- original bytes : 874849 +-- stripped bytes : 317531 -- end library merge @@ -20443,6 +21259,7 @@ local owntree = environment and environment.ownpath or ownpath local ownlibs = { -- order can be made better 'l-lua.lua', + 'l-macro.lua', 'l-sandbox.lua', 'l-package.lua', 'l-lpeg.lua', @@ -20607,30 +21424,37 @@ local e_verbose = false -- some common flags (also passed through environment) local e_silent = environment.argument("silent") +local e_errors = environment.argument("errors") local e_noconsole = environment.argument("noconsole") local e_trackers = environment.argument("trackers") local e_directives = environment.argument("directives") local e_experiments = environment.argument("experiments") -if e_silent == true then - e_silent = "*" +local t = { } + +if type(e_directives) == "string" then + t[#t+1] = e_directives end if type(e_silent) == "string" then - if type(e_directives) == "string" then - e_directives = format("%s,logs.blocked={%s}",e_directives,e_silent) - else - e_directives = format("logs.blocked={%s}",e_silent) - end + t[#t+1] = format("logs.blocked={%s}",e_silent) +elseif e_silent == true then + t[#t+1] = "logs.blocked" +end + +if type(e_errors) == "string" then + t[#t+1] = format("logs.errors={%s}",e_errors) +elseif e_errors == true then + t[#t+1] = "logs.errors" end if e_noconsole then - if type(e_directives) == "string" then - e_directives = format("%s,logs.target=file",e_directives) - else - e_directives = format("logs.target=file") - end + t[#t+1] = format("logs.target=file") +end + +if #t > 0 then + e_directives = concat(t,",") end if e_trackers then trackers .enable(e_trackers) end @@ -20643,7 +21467,7 @@ if not environment.experiments then environment.experiments = e_experiments end -- -local instance = resolvers.reset() +resolvers.reset() local helpinfo = [[ <?xml version="1.0" ?> @@ -20651,7 +21475,7 @@ local helpinfo = [[ <metadata> <entry name="name">mtxrun</entry> <entry name="detail">ConTeXt TDS Runner Tool</entry> - <entry name="version">1.32</entry> + <entry name="version">1.33</entry> </metadata> <flags> <category name="basic"> @@ -21199,7 +22023,7 @@ function runners.execute_ctx_script(filename,...) end -- retry after generate but only if --autogenerate if fullname == "" and environment.argument("autogenerate") then -- might become the default - instance.renewcache = true + resolvers.renewcache() trackers.enable("resolvers.locating") resolvers.load() -- @@ -21224,7 +22048,7 @@ function runners.execute_ctx_script(filename,...) end filename = environment.files[1] if e_verbose then - report("using script: %s\n",fullname) + report("using script: %s (if --path is used don't run on path where mtxrun lives)\n",fullname) end environment.ownscript = fullname dofile(fullname) @@ -21378,8 +22202,6 @@ local before, after = environment.splitarguments(filename) environment.arguments_before, environment.arguments_after = before, after environment.initializearguments(before) -instance.lsrmode = environment.argument("lsr") or false - e_verbose = environment.arguments["verbose"] -- delayed till here (we need the ones before script) if e_verbose then @@ -21466,7 +22288,7 @@ else function runners.loadbase(...) if not resolvers.load(...) then report("forcing cache reload") - instance.renewcache = true + resolvers.renewcache() trackers.enable("resolvers.locating") if not resolvers.load(...) then report("the resolver databases are not present or outdated") @@ -21480,6 +22302,42 @@ end -- joke .. reminds me of messing with gigi terminals +do + + local a_locale = e_argument("locale") + + if a_locale then + + -- I really hate this crap but am too tired of discussing it over and over + -- again so for the sake of usiage outside context we will provide ways to + -- use locales in an otherwise supposed to be locale agnostic system. And + -- forget about support in case of interferences. + + report() + report(what == "force" and "forcing locale:" or "original locale:") + report() + report(" collate : %s",status.lc_collate or "<unset>") + report(" ctype : %s",status.lc_ctype or "<unset>") + report(" monetary : %s",status.lc_monetary or "<unset>") + report(" numeric : %s",status.lc_numeric or "<unset>") + report(" time : %s",status.lc_time or "<unset>") + report() + + end + + if a_locale == "force" then + os.setlocale(status.lc_collate ,"collate") + os.setlocale(status.lc_ctype ,"ctype") + os.setlocale(status.lc_monetary,"monetary") + os.setlocale(status.lc_numeric ,"numeric") + os.setlocale(status.lc_time ,"time") + else + function os.setlocale() + end + end + +end + if e_argument("ansi") then logs.setformatters("ansi") @@ -21673,7 +22531,7 @@ elseif e_argument("find-path") then -- luatools: runners.execute_ctx_script("mtx-base","--find-path",filename) resolvers.load() - local path = resolvers.findpath(filename, instance.my_format) + local path = resolvers.findpath(filename) if e_verbose then report(path) else @@ -21754,7 +22612,7 @@ elseif e_argument("generate") then trackers.enable("resolvers.locating") resolvers.renew(filename) else - instance.renewcache = true + resolvers.renewcache() trackers.enable("resolvers.locating") resolvers.load() end @@ -21814,6 +22672,10 @@ elseif e_argument("systeminfo") then runners.systeminfo() +elseif e_argument("locale") then + + -- already done + elseif e_argument("help") or filename=='help' or filename == "" then application.help() diff --git a/scripts/context/stubs/mswin/mtxrun.lua b/scripts/context/stubs/mswin/mtxrun.lua index 873770cac..3374a364a 100644 --- a/scripts/context/stubs/mswin/mtxrun.lua +++ b/scripts/context/stubs/mswin/mtxrun.lua @@ -56,7 +56,7 @@ do -- create closure to overcome 200 locals limit package.loaded["l-lua"] = package.loaded["l-lua"] or true --- original size: 5125, stripped down to: 2881 +-- original size: 6230, stripped down to: 3662 if not modules then modules={} end modules ['l-lua']={ version=1.001, @@ -65,14 +65,16 @@ if not modules then modules={} end modules ['l-lua']={ copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" } -_MAJORVERSION,_MINORVERSION=string.match(_VERSION,"^[^%d]+(%d+)%.(%d+).*$") -_MAJORVERSION=tonumber(_MAJORVERSION) or 5 -_MINORVERSION=tonumber(_MINORVERSION) or 1 -_LUAVERSION=_MAJORVERSION+_MINORVERSION/10 -if _LUAVERSION<5.2 and jit then - _MINORVERSION=2 - _LUAVERSION=5.2 -end +local next,type,tonumber=next,type,tonumber +LUAMAJORVERSION,LUAMINORVERSION=string.match(_VERSION,"^[^%d]+(%d+)%.(%d+).*$") +LUAMAJORVERSION=tonumber(LUAMAJORVERSION) or 5 +LUAMINORVERSION=tonumber(LUAMINORVERSION) or 1 +LUAVERSION=LUAMAJORVERSION+LUAMINORVERSION/10 +if LUAVERSION<5.2 and jit then + MINORVERSION=2 + LUAVERSION=5.2 +end +_LUAVERSION=LUAVERSION if not lpeg then lpeg=require("lpeg") end @@ -172,6 +174,166 @@ if not FFISUPPORTED then elseif not ffi.number then ffi.number=tonumber end +if not bit32 then + bit32=require("l-bit32") +end +local loaded=package.loaded +if not loaded["socket"] then loaded["socket"]=loaded["socket.core"] end +if not loaded["mime"] then loaded["mime"]=loaded["mime.core"] end +if not socket.mime then socket.mime=package.loaded["mime"] end +if not loaded["socket.mime"] then loaded["socket.mime"]=socket.mime end +if not loaded["socket.http"] then loaded["socket.http"]=socket.http end +if not loaded["socket.ftp"] then loaded["socket.ftp"]=socket.ftp end +if not loaded["socket.smtp"] then loaded["socket.smtp"]=socket.smtp end +if not loaded["socket.tp"] then loaded["socket.tp"]=socket.tp end +if not loaded["socket.url"] then loaded["socket.url"]=socket.url end + + +end -- of closure + +do -- create closure to overcome 200 locals limit + +package.loaded["l-macro"] = package.loaded["l-macro"] or true + +-- original size: 6393, stripped down to: 3659 + +if not modules then modules={} end modules ['l-macros']={ + version=1.001, + comment="companion to luat-lib.mkiv", + author="Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright="PRAGMA ADE / ConTeXt Development Team", + license="see context related readme files" +} +local S,P,R,V,C,Cs,Cc,Ct,Carg=lpeg.S,lpeg.P,lpeg.R,lpeg.V,lpeg.C,lpeg.Cs,lpeg.Cc,lpeg.Ct,lpeg.Carg +local lpegmatch=lpeg.match +local concat=table.concat +local next=next +local newline=S("\n\r")^1 +local continue=P("\\")*newline +local spaces=S(" \t")+continue +local name=R("az","AZ","__","09")^1 +local body=((1+continue/"")-newline)^1 +local lparent=P("(") +local rparent=P(")") +local noparent=1-(lparent+rparent) +local nested=P { lparent*(noparent+V(1))^0*rparent } +local escaped=P("\\")*P(1) +local squote=P("'") +local dquote=P('"') +local quoted=dquote*(escaped+(1-dquote))^0*dquote+squote*(escaped+(1-squote))^0*squote +local arguments=lparent*Ct((Cs((nested+(quoted+1-S("),")))^1)+S(", "))^0)*rparent +local macros=lua.macros or {} +lua.macros=macros +local patterns={} +local definitions={} +local resolve +local subparser +resolve=C(C(name)*arguments^-1)/function(raw,s,a) + local d=definitions[s] + if d then + if a then + local n=#a + local p=patterns[s][n] + if p then + local d=d[n] + for i=1,n do + a[i]=lpegmatch(subparser,a[i]) or a[i] + end + return lpegmatch(p,d,1,a) or d + else + return raw + end + else + return d[0] or raw + end + elseif a then + for i=1,#a do + a[i]=lpegmatch(subparser,a[i]) or a[i] + end + return s.."("..concat(a,",")..")" + else + return raw + end +end +subparser=Cs((resolve+P(1))^1) +local enddefine=P("#enddefine")/"" +local beginregister=(C(name)*spaces^0*(arguments+Cc(false))*C((1-enddefine)^1)*enddefine)/function(k,a,v) + local n=0 + if a then + n=#a + local pattern=P(false) + for i=1,n do + pattern=pattern+(P(a[i])*Carg(1))/function(t) return t[i] end + end + pattern=Cs((pattern+P(1))^1) + local p=patterns[k] + if not p then + p={ [0]=false,false,false,false,false,false,false,false,false } + patterns[k]=p + end + p[n]=pattern + end + local d=definitions[k] + if not d then + d={ [0]=false,false,false,false,false,false,false,false,false } + definitions[k]=d + end + d[n]=lpegmatch(subparser,v) or v + return "" +end +local register=(C(name)*spaces^0*(arguments+Cc(false))*spaces^0*C(body))/function(k,a,v) + local n=0 + if a then + n=#a + local pattern=P(false) + for i=1,n do + pattern=pattern+(P(a[i])*Carg(1))/function(t) return t[i] end + end + pattern=Cs((pattern+P(1))^1) + local p=patterns[k] + if not p then + p={ [0]=false,false,false,false,false,false,false,false,false } + patterns[k]=p + end + p[n]=pattern + end + local d=definitions[k] + if not d then + d={ [0]=false,false,false,false,false,false,false,false,false } + definitions[k]=d + end + d[n]=lpegmatch(subparser,v) or v + return "" +end +local unregister=(C(name)*spaces^0*(arguments+Cc(false)))/function(k,a) + local n=0 + if a then + n=#a + local p=patterns[k] + if p then + p[n]=false + end + end + local d=definitions[k] + if d then + d[n]=false + end + return "" +end +local begindefine=(P("begindefine")*spaces^0/"")*beginregister +local define=(P("define" )*spaces^0/"")*register +local undefine=(P("undefine" )*spaces^0/"")*unregister +local parser=Cs((((P("#")/"")*(define+begindefine+undefine)*(newline^0/"") )+resolve+P(1) )^0 ) +function macros.reset() + definitions={} + patterns={} +end +function macros.resolvestring(str) + return lpegmatch(parser,str) or str +end +function macros.resolving() + return next(patterns) +end end -- of closure @@ -180,7 +342,7 @@ do -- create closure to overcome 200 locals limit package.loaded["l-sandbox"] = package.loaded["l-sandbox"] or true --- original size: 9667, stripped down to: 6678 +-- original size: 9678, stripped down to: 6688 if not modules then modules={} end modules ['l-sandbox']={ version=1.001, @@ -193,7 +355,7 @@ local global=_G local next=next local unpack=unpack or table.unpack local type=type -local tprint=texio.write_nl or print +local tprint=texio and texio.write_nl or print local tostring=tostring local format=string.format local concat=table.concat @@ -447,7 +609,7 @@ do -- create closure to overcome 200 locals limit package.loaded["l-package"] = package.loaded["l-package"] or true --- original size: 10587, stripped down to: 7815 +-- original size: 11564, stripped down to: 8625 if not modules then modules={} end modules ['l-package']={ version=1.001, @@ -461,6 +623,7 @@ local gsub,format,find=string.gsub,string.format,string.find local P,S,Cs,lpegmatch=lpeg.P,lpeg.S,lpeg.Cs,lpeg.match local package=package local searchers=package.searchers or package.loaders +local insert,remove=table.insert,table.remove local filejoin=file and file.join or function(path,name) return path.."/"..name end local isreadable=file and file.is_readable or function(name) local f=io.open(name) if f then f:close() return true end end local addsuffix=file and file.addsuffix or function(name,suffix) return name.."."..suffix end @@ -594,15 +757,43 @@ local function registerpath(tag,what,target,...) add(path) end end - return paths +end +local function pushpath(tag,what,target,path) + local path=helpers.cleanpath(path) + insert(target,1,path) + if helpers.trace then + helpers.report("pushing %s path in front: %s",tag,path) + end +end +local function poppath(tag,what,target) + local path=remove(target,1) + if helpers.trace then + if path then + helpers.report("popping %s path from front: %s",tag,path) + else + helpers.report("no %s path to pop",tag) + end + end end helpers.registerpath=registerpath function package.extraluapath(...) registerpath("extra lua","lua",extraluapaths,...) end +function package.pushluapath(path) + pushpath("extra lua","lua",extraluapaths,path) +end +function package.popluapath() + poppath("extra lua","lua",extraluapaths) +end function package.extralibpath(...) registerpath("extra lib","lib",extralibpaths,...) end +function package.pushlibpath(path) + pushpath("extra lib","lib",extralibpaths,path) +end +function package.poplibpath() + poppath("extra lib","lua",extralibpaths) +end local function loadedaslib(resolved,rawname) local base=gsub(rawname,"%.","_") local init="luaopen_"..gsub(base,"%.","_") @@ -737,7 +928,7 @@ do -- create closure to overcome 200 locals limit package.loaded["l-lpeg"] = package.loaded["l-lpeg"] or true --- original size: 37748, stripped down to: 20111 +-- original size: 38582, stripped down to: 20518 if not modules then modules={} end modules ['l-lpeg']={ version=1.001, @@ -746,7 +937,8 @@ if not modules then modules={} end modules ['l-lpeg']={ copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" } -lpeg=require("lpeg") +lpeg=require("lpeg") +local lpeg=lpeg if not lpeg.print then function lpeg.print(...) print(lpeg.pcode(...)) end end local type,next,tostring=type,next,tostring local byte,char,gmatch,format=string.byte,string.char,string.gmatch,string.format @@ -768,11 +960,14 @@ patterns.alwaysmatched=alwaysmatched local sign=S('+-') local zero=P('0') local digit=R('09') +local digits=digit^1 local octdigit=R("07") +local octdigits=octdigit^1 local lowercase=R("az") local uppercase=R("AZ") local underscore=P("_") local hexdigit=digit+lowercase+uppercase +local hexdigits=hexdigit^1 local cr,lf,crlf=P("\r"),P("\n"),P("\r\n") local newline=P("\r")*(P("\n")+P(true))+P("\n") local escaped=P("\\")*anything @@ -874,27 +1069,30 @@ patterns.singlequoted=squote*patterns.nosquote*squote patterns.doublequoted=dquote*patterns.nodquote*dquote patterns.quoted=patterns.doublequoted+patterns.singlequoted patterns.digit=digit +patterns.digits=digits patterns.octdigit=octdigit +patterns.octdigits=octdigits patterns.hexdigit=hexdigit +patterns.hexdigits=hexdigits patterns.sign=sign -patterns.cardinal=digit^1 -patterns.integer=sign^-1*digit^1 -patterns.unsigned=digit^0*period*digit^1 +patterns.cardinal=digits +patterns.integer=sign^-1*digits +patterns.unsigned=digit^0*period*digits patterns.float=sign^-1*patterns.unsigned -patterns.cunsigned=digit^0*comma*digit^1 -patterns.cpunsigned=digit^0*(period+comma)*digit^1 +patterns.cunsigned=digit^0*comma*digits +patterns.cpunsigned=digit^0*(period+comma)*digits patterns.cfloat=sign^-1*patterns.cunsigned patterns.cpfloat=sign^-1*patterns.cpunsigned patterns.number=patterns.float+patterns.integer patterns.cnumber=patterns.cfloat+patterns.integer patterns.cpnumber=patterns.cpfloat+patterns.integer -patterns.oct=zero*octdigit^1 +patterns.oct=zero*octdigits patterns.octal=patterns.oct patterns.HEX=zero*P("X")*(digit+uppercase)^1 patterns.hex=zero*P("x")*(digit+lowercase)^1 -patterns.hexadecimal=zero*S("xX")*hexdigit^1 -patterns.hexafloat=sign^-1*zero*S("xX")*(hexdigit^0*period*hexdigit^1+hexdigit^1*period*hexdigit^0+hexdigit^1)*(S("pP")*sign^-1*hexdigit^1)^-1 -patterns.decafloat=sign^-1*(digit^0*period*digit^1+digit^1*period*digit^0+digit^1)*S("eE")*sign^-1*digit^1 +patterns.hexadecimal=zero*S("xX")*hexdigits +patterns.hexafloat=sign^-1*zero*S("xX")*(hexdigit^0*period*hexdigits+hexdigits*period*hexdigit^0+hexdigits)*(S("pP")*sign^-1*hexdigits)^-1 +patterns.decafloat=sign^-1*(digit^0*period*digits+digits*period*digit^0+digits)*S("eE")*sign^-1*digits patterns.propername=(uppercase+lowercase+underscore)*(uppercase+lowercase+underscore+digit)^0*endofstring patterns.somecontent=(anything-newline-space)^1 patterns.beginline=#(1-newline) @@ -1141,11 +1339,13 @@ function lpeg.balancer(left,right) left,right=P(left),P(right) return P { left*((1-left-right)+V(1))^0*right } end -local nany=utf8char/"" -function lpeg.counter(pattern) - pattern=Cs((P(pattern)/" "+nany)^0) - return function(str) - return #lpegmatch(pattern,str) +function lpeg.counter(pattern,action) + local n=0 + local pattern=(P(pattern)/function() n=n+1 end+anything)^0 + if action then + return function(str) n=0;lpegmatch(pattern,str);action(n) end + else + return function(str) n=0;lpegmatch(pattern,str);return n end end end utf=utf or (unicode and unicode.utf8) or {} @@ -1306,7 +1506,13 @@ function lpeg.append(list,pp,delayed,checked) end local p_false=P(false) local p_true=P(true) -local function make(t,rest) +local lower=utf and utf.lower or string.lower +local upper=utf and utf.upper or string.upper +function lpeg.setutfcasers(l,u) + lower=l or lower + upper=u or upper +end +local function make1(t,rest) local p=p_false local keys=sortedkeys(t) for i=1,#keys do @@ -1317,7 +1523,7 @@ local function make(t,rest) p=p+P(k)*p_true elseif v==false then else - p=p+P(k)*make(v,v[""]) + p=p+P(k)*make1(v,v[""]) end end end @@ -1326,32 +1532,27 @@ local function make(t,rest) end return p end -local function collapse(t,x) - if type(t)~="table" then - return t,x - else - local n=next(t) - if n==nil then - return t,x - elseif next(t,n)==nil then - local k=n +local function make2(t,rest) + local p=p_false + local keys=sortedkeys(t) + for i=1,#keys do + local k=keys[i] + if k~="" then local v=t[k] - if type(v)=="table" then - return collapse(v,x..k) + if v==true then + p=p+(P(lower(k))+P(upper(k)))*p_true + elseif v==false then else - return v,x..k + p=p+(P(lower(k))+P(upper(k)))*make2(v,v[""]) end - else - local tt={} - for k,v in next,t do - local vv,kk=collapse(v,k) - tt[kk]=vv - end - return tt,x end end + if rest then + p=p+p_true + end + return p end -function lpeg.utfchartabletopattern(list) +function lpeg.utfchartabletopattern(list,insensitive) local tree={} local n=#list if n==0 then @@ -1422,7 +1623,7 @@ function lpeg.utfchartabletopattern(list) end end end - return make(tree) + return (insensitive and make2 or make1)(tree) end patterns.containseol=lpeg.finder(eol) local function nextstep(n,step,result) @@ -1456,7 +1657,7 @@ end local trailingzeros=zero^0*-digit local case_1=period*trailingzeros/"" local case_2=period*(digit-trailingzeros)^1*(trailingzeros/"") -local number=digit^1*(case_1+case_2) +local number=digits*(case_1+case_2) local stripper=Cs((number+1)^0) lpeg.patterns.stripzeros=stripper local byte_to_HEX={} @@ -1545,7 +1746,7 @@ do -- create closure to overcome 200 locals limit package.loaded["l-string"] = package.loaded["l-string"] or true --- original size: 6419, stripped down to: 3339 +-- original size: 6461, stripped down to: 3341 if not modules then modules={} end modules ['l-string']={ version=1.001, @@ -1647,9 +1848,9 @@ function string.tformat(fmt,...) end string.quote=string.quoted string.unquote=string.unquoted -if not string.bytetable then +if not string.bytetable then local limit=5000 - function string.bytetable(str) + function string.bytetable(str) local n=#str if n>limit then local t={ byte(str,1,limit) } @@ -1670,7 +1871,7 @@ do -- create closure to overcome 200 locals limit package.loaded["l-table"] = package.loaded["l-table"] or true --- original size: 39608, stripped down to: 23165 +-- original size: 40161, stripped down to: 23559 if not modules then modules={} end modules ['l-table']={ version=1.001, @@ -1679,7 +1880,7 @@ if not modules then modules={} end modules ['l-table']={ copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" } -local type,next,tostring,tonumber,ipairs,select=type,next,tostring,tonumber,ipairs,select +local type,next,tostring,tonumber,select=type,next,tostring,tonumber,select local table,string=table,string local concat,sort,insert,remove=table.concat,table.sort,table.insert,table.remove local format,lower,dump=string.format,string.lower,string.dump @@ -1688,6 +1889,9 @@ local getinfo=debug.getinfo local lpegmatch,patterns=lpeg.match,lpeg.patterns local floor=math.floor local stripper=patterns.stripper +function table.getn(t) + return t and #t +end function table.strip(tab) local lst,l={},0 for i=1,#tab do @@ -1981,7 +2185,7 @@ function table.tohash(t,value) local h={} if t then if value==nil then value=true end - for _,v in next,t do + for _,v in next,t do h[v]=value end end @@ -1989,7 +2193,7 @@ function table.tohash(t,value) end function table.fromhash(t) local hsh,h={},0 - for k,v in next,t do + for k,v in next,t do if v then h=h+1 hsh[h]=k @@ -2464,7 +2668,9 @@ function table.unnest(t) return unnest(t) end local function are_equal(a,b,n,m) - if a and b and #a==#b then + if a==b then + return true + elseif a and b and #a==#b then n=n or 1 m=m or #a for i=n,m do @@ -2484,15 +2690,17 @@ local function are_equal(a,b,n,m) end end local function identical(a,b) - for ka,va in next,a do - local vb=b[ka] - if va==vb then - elseif type(va)=="table" and type(vb)=="table" then - if not identical(va,vb) then + if a~=b then + for ka,va in next,a do + local vb=b[ka] + if va==vb then + elseif type(va)=="table" and type(vb)=="table" then + if not identical(va,vb) then + return false + end + else return false end - else - return false end end return true @@ -2714,6 +2922,24 @@ function table.filtered(t,pattern,sort,cmp) return nothing end end +if not table.move then + function table.move(a1,f,e,t,a2) + if a2 and a1~=a2 then + for i=f,e do + a2[t]=a1[i] + t=t+1 + end + return a2 + else + t=t+e-f + for i=e,f,-1 do + a1[t]=a1[i] + t=t-1 + end + return a1 + end + end +end end -- of closure @@ -2722,7 +2948,7 @@ do -- create closure to overcome 200 locals limit package.loaded["l-io"] = package.loaded["l-io"] or true --- original size: 11790, stripped down to: 6961 +-- original size: 11823, stripped down to: 6945 if not modules then modules={} end modules ['l-io']={ version=1.001, @@ -2735,16 +2961,15 @@ local io=io local open,flush,write,read=io.open,io.flush,io.write,io.read local byte,find,gsub,format=string.byte,string.find,string.gsub,string.format local concat=table.concat -local floor=math.floor local type=type if string.find(os.getenv("PATH"),";",1,true) then io.fileseparator,io.pathseparator="\\",";" else io.fileseparator,io.pathseparator="/",":" end -local large=2^24 -local medium=large/16 -local small=medium/8 +local large=0x01000000 +local medium=0x00100000 +local small=0x00020000 local function readall(f) local size=f:seek("end") if size>0 then @@ -3075,7 +3300,7 @@ do -- create closure to overcome 200 locals limit package.loaded["l-number"] = package.loaded["l-number"] or true --- original size: 5358, stripped down to: 3177 +-- original size: 5645, stripped down to: 2253 if not modules then modules={} end modules ['l-number']={ version=1.001, @@ -3091,33 +3316,6 @@ local lpegmatch=lpeg.match local floor=math.floor number=number or {} local number=number -if bit32 then - local btest,bor=bit32.btest,bit32.bor - function number.bit(p) - return 2^(p-1) - end - number.hasbit=btest - number.setbit=bor - function number.setbit(x,p) - return btest(x,p) and x or x+p - end - function number.clearbit(x,p) - return btest(x,p) and x-p or x - end -else - function number.bit(p) - return 2^(p-1) - end - function number.hasbit(x,p) - return x%(p+p)>=p - end - function number.setbit(x,p) - return (x%(p+p)>=p) and x or x+p - end - function number.clearbit(x,p) - return (x%(p+p)>=p) and x-p or x - end -end if bit32 then local bextract=bit32.extract local t={ @@ -3193,26 +3391,6 @@ function number.toevenhex(n) return "0"..s end end -local one=lpeg.C(1-lpeg.S('')/tonumber)^1 -function number.toset(n) - return lpegmatch(one,tostring(n)) -end -local function bits(n,i,...) - if n>0 then - local m=n%2 - local n=floor(n/2) - if m>0 then - return bits(n,i+1,i,...) - else - return bits(n,i+1,...) - end - else - return... - end -end -function number.bits(n) - return { bits(n,1) } -end function number.bytetodecimal(b) local d=floor(b*100/255+0.5) if d>100 then @@ -3689,7 +3867,7 @@ do -- create closure to overcome 200 locals limit package.loaded["l-file"] = package.loaded["l-file"] or true --- original size: 20997, stripped down to: 9986 +-- original size: 21616, stripped down to: 10359 if not modules then modules={} end modules ['l-file']={ version=1.001, @@ -3725,6 +3903,9 @@ end function lfs.isfile(name) return attributes(name,"mode")=="file" end +function lfs.isfound(name) + return attributes(name,"mode")=="file" and name or nil +end local colon=P(":") local period=P(".") local periods=P("..") @@ -4063,6 +4244,23 @@ function lfs.mkdirs(path) lfs.mkdir(full) end end +function file.withinbase(path) + local l=0 + if not find(path,"^/") then + path="/"..path + end + for dir in gmatch(path,"/([^/]+)") do + if dir==".." then + l=l-1 + elseif dir~="." then + l=l+1 + end + if l<0 then + return false + end + end + return true +end end -- of closure @@ -4215,7 +4413,7 @@ do -- create closure to overcome 200 locals limit package.loaded["l-url"] = package.loaded["l-url"] or true --- original size: 12531, stripped down to: 5721 +-- original size: 14755, stripped down to: 7236 if not modules then modules={} end modules ['l-url']={ version=1.001, @@ -4226,24 +4424,51 @@ if not modules then modules={} end modules ['l-url']={ } local char,format,byte=string.char,string.format,string.byte local concat=table.concat -local tonumber,type=tonumber,type +local tonumber,type,next=tonumber,type,next local P,C,R,S,Cs,Cc,Ct,Cf,Cg,V=lpeg.P,lpeg.C,lpeg.R,lpeg.S,lpeg.Cs,lpeg.Cc,lpeg.Ct,lpeg.Cf,lpeg.Cg,lpeg.V local lpegmatch,lpegpatterns,replacer=lpeg.match,lpeg.patterns,lpeg.replacer +local sortedhash=table.sortedhash url=url or {} local url=url -local tochar=function(s) return char(tonumber(s,16)) end +local unescapes={} +local escapes={} +setmetatable(unescapes,{ __index=function(t,k) + local v=char(tonumber(k,16)) + t[k]=v + return v +end }) +setmetatable(escapes,{ __index=function(t,k) + local v=format("%%%02X",byte(k)) + t[k]=v + return v +end }) local colon=P(":") local qmark=P("?") local hash=P("#") local slash=P("/") +local atsign=P("@") local percent=P("%") local endofstring=P(-1) local hexdigit=R("09","AF","af") local plus=P("+") local nothing=Cc("") -local escapedchar=(percent*C(hexdigit*hexdigit))/tochar +local okay=R("09","AZ","az")+S("-_.,:=+*~!'()@&$") +local escapedchar=(percent*C(hexdigit*hexdigit))/unescapes +local unescapedchar=P(1)/escapes local escaped=(plus/" ")+escapedchar local noslash=P("/")/"" +local plustospace=P("+")/" " +local decoder=Cs(( + plustospace+escapedchar+P("\r\n")/"\n"+P(1) + )^0 ) +local encoder=Cs(( + R("09","AZ","az")^1+S("-./_")^1+P(" ")/"+"+P("\n")/"\r\n"+unescapedchar + )^0 ) +lpegpatterns.urldecoder=decoder +lpegpatterns.urlencoder=encoder +function url.decode (str) return str and lpegmatch(decoder,str) or str end +function url.encode (str) return str and lpegmatch(encoder,str) or str end +function url.unescape(str) return str and lpegmatch(unescaper,str) or str end local schemestr=Cs((escaped+(1-colon-slash-qmark-hash))^2) local authoritystr=Cs((escaped+(1- slash-qmark-hash))^0) local pathstr=Cs((escaped+(1- qmark-hash))^0) @@ -4258,13 +4483,7 @@ local validurl=scheme*authority*path*query*fragment local parser=Ct(validurl) lpegpatterns.url=validurl lpegpatterns.urlsplitter=parser -local escapes={} -setmetatable(escapes,{ __index=function(t,k) - local v=format("%%%02X",byte(k)) - t[k]=v - return v -end }) -local escaper=Cs((R("09","AZ","az")^1+P(" ")/"%%20"+S("-./_")^1+P(1)/escapes)^0) +local escaper=Cs((R("09","AZ","az")^1+P(" ")/"%%20"+S("-./_:")^1+P(1)/escapes)^0) local unescaper=Cs((escapedchar+1)^0) local getcleaner=Cs((P("+++")/"%%2B"+P("+")/"%%20"+P(1))^1) lpegpatterns.urlunescaped=escapedchar @@ -4294,12 +4513,15 @@ local barswapper=replacer("|",":") local backslashswapper=replacer("\\","/") local equal=P("=") local amp=P("&") -local key=Cs(((escapedchar+1)-equal )^0) -local value=Cs(((escapedchar+1)-amp -endofstring)^0) +local key=Cs(((plustospace+escapedchar+1)-equal )^0) +local value=Cs(((plustospace+escapedchar+1)-amp-endofstring)^0) local splitquery=Cf (Ct("")*P { "sequence", sequence=V("pair")*(amp*V("pair"))^0, pair=Cg(key*equal*value), },rawset) +local userpart=(1-atsign-colon)^1 +local serverpart=(1-colon)^1 +local splitauthority=((Cs(userpart)*colon*Cs(userpart)+Cs(userpart)*Cc(nil))*atsign+Cc(nil)*Cc(nil))*Cs(serverpart)*(colon*(serverpart/tonumber)+Cc(nil)) local function hashed(str) if not str or str=="" then return { @@ -4332,7 +4554,14 @@ local function hashed(str) end local authority=detailed[2] local path=detailed[3] - local filename=nil + local filename + local username + local password + local host + local port + if authority~="" then + username,password,host,port=lpegmatch(splitauthority,authority) + end if authority=="" then filename=path elseif path=="" then @@ -4350,6 +4579,8 @@ local function hashed(str) original=str, noscheme=false, filename=filename, + host=host, + port=port, } end url.split=split @@ -4365,24 +4596,38 @@ function url.addscheme(str,scheme) end end function url.construct(hash) - local fullurl,f={},0 - local scheme,authority,path,query,fragment=hash.scheme,hash.authority,hash.path,hash.query,hash.fragment + local result,r={},0 + local scheme=hash.scheme + local authority=hash.authority + local path=hash.path + local queries=hash.queries + local fragment=hash.fragment if scheme and scheme~="" then - f=f+1;fullurl[f]=scheme.."://" + r=r+1;result[r]=lpegmatch(escaper,scheme) + r=r+1;result[r]="://" end if authority and authority~="" then - f=f+1;fullurl[f]=authority + r=r+1;result[r]=lpegmatch(escaper,authority) end if path and path~="" then - f=f+1;fullurl[f]="/"..path + r=r+1;result[r]="/" + r=r+1;result[r]=lpegmatch(escaper,path) end - if query and query~="" then - f=f+1;fullurl[f]="?"..query + if queries then + local done=false + for k,v in sortedhash(queries) do + r=r+1;result[r]=done and "&" or "?" + r=r+1;result[r]=lpegmatch(escaper,k) + r=r+1;result[r]="=" + r=r+1;result[r]=lpegmatch(escaper,v) + done=true + end end if fragment and fragment~="" then - f=f+1;fullurl[f]="#"..fragment + r=r+1;result[r]="#" + r=r+1;result[r]=lpegmatch(escaper,fragment) end - return lpegmatch(escaper,concat(fullurl)) + return concat(result) end local pattern=Cs(slash^-1/""*R("az","AZ")*((S(":|")/":")+P(":"))*slash*P(1)^0) function url.filename(filename) @@ -4998,7 +5243,7 @@ do -- create closure to overcome 200 locals limit package.loaded["l-unicode"] = package.loaded["l-unicode"] or true --- original size: 38263, stripped down to: 16330 +-- original size: 40036, stripped down to: 17837 if not modules then modules={} end modules ['l-unicode']={ version=1.001, @@ -5034,37 +5279,73 @@ if not unicode then unicode={ utf=utf } end if not utf.char then - local floor,char=math.floor,string.char - function utf.char(n) - if n<0x80 then - return char(n) - elseif n<0x800 then - return char( - 0xC0+floor(n/0x40), - 0x80+(n%0x40) - ) - elseif n<0x10000 then - return char( - 0xE0+floor(n/0x1000), - 0x80+(floor(n/0x40)%0x40), - 0x80+(n%0x40) - ) - elseif n<0x200000 then - return char( - 0xF0+floor(n/0x40000), - 0x80+(floor(n/0x1000)%0x40), - 0x80+(floor(n/0x40)%0x40), - 0x80+(n%0x40) - ) + utf.char=string.utfcharacter or (utf8 and utf8.char) + if not utf.char then + local char=string.char + if bit32 then + local rshift=bit32.rshift + function utf.char(n) + if n<0x80 then + return char(n) + elseif n<0x800 then + return char( + 0xC0+rshift(n,6), + 0x80+(n%0x40) + ) + elseif n<0x10000 then + return char( + 0xE0+rshift(n,12), + 0x80+(rshift(n,6)%0x40), + 0x80+(n%0x40) + ) + elseif n<0x200000 then + return char( + 0xF0+rshift(n,18), + 0x80+(rshift(n,12)%0x40), + 0x80+(rshift(n,6)%0x40), + 0x80+(n%0x40) + ) + else + return "" + end + end else - return "" + local floor=math.floor + function utf.char(n) + if n<0x80 then + return char(n) + elseif n<0x800 then + return char( + 0xC0+floor(n/0x40), + 0x80+(n%0x40) + ) + elseif n<0x10000 then + return char( + 0xE0+floor(n/0x1000), + 0x80+(floor(n/0x40)%0x40), + 0x80+(n%0x40) + ) + elseif n<0x200000 then + return char( + 0xF0+floor(n/0x40000), + 0x80+(floor(n/0x1000)%0x40), + 0x80+(floor(n/0x40)%0x40), + 0x80+(n%0x40) + ) + else + return "" + end + end end end end if not utf.byte then - local utf8byte=patterns.utf8byte - function utf.byte(c) - return lpegmatch(utf8byte,c) + utf.byte=string.utfvalue or (utf8 and utf8.codepoint) + if not utf.byte then + local utf8byte=patterns.utf8byte + function utf.byte(c) + return lpegmatch(utf8byte,c) + end end end local utfchar,utfbyte=utf.char,utf.byte @@ -5115,19 +5396,22 @@ function utf.is_valid(str) return type(str)=="string" and lpegmatch(validatedutf,str) or false end if not utf.len then - local n,f=0,1 - local utfcharcounter=patterns.utfbom^-1*Cmt ( - Cc(1)*patterns.utf8one^1+Cc(2)*patterns.utf8two^1+Cc(3)*patterns.utf8three^1+Cc(4)*patterns.utf8four^1, - function(_,t,d) - n=n+(t-f)/d - f=t - return true + utf.len=string.utflength or (utf8 and utf8.len) + if not utf.len then + local n,f=0,1 + local utfcharcounter=patterns.utfbom^-1*Cmt ( + Cc(1)*patterns.utf8one^1+Cc(2)*patterns.utf8two^1+Cc(3)*patterns.utf8three^1+Cc(4)*patterns.utf8four^1, + function(_,t,d) + n=n+(t-f)/d + f=t + return true + end + )^0 + function utf.len(str) + n,f=0,1 + lpegmatch(utfcharcounter,str or "") + return n end - )^0 - function utf.len(str) - n,f=0,1 - lpegmatch(utfcharcounter,str or "") - return n end end utf.length=utf.len @@ -5475,20 +5759,22 @@ function utf.utf32_to_utf8_t(t,endian) end local function little(b) if b<0x10000 then - return char(b%256,b/256) + return char(b%256,rshift(b,8)) else b=b-0x10000 - local b1,b2=b/1024+0xD800,b%1024+0xDC00 - return char(b1%256,b1/256,b2%256,b2/256) + local b1=rshift(b,10)+0xD800 + local b2=b%1024+0xDC00 + return char(b1%256,rshift(b1,8),b2%256,rshift(b2,8)) end end local function big(b) if b<0x10000 then - return char(b/256,b%256) + return char(rshift(b,8),b%256) else b=b-0x10000 - local b1,b2=b/1024+0xD800,b%1024+0xDC00 - return char(b1/256,b1%256,b2/256,b2%256) + local b1=rshift(b,10)+0xD800 + local b2=b%1024+0xDC00 + return char(rshift(b1,8),b1%256,rshift(b2,8),b2%256) end end local l_remap=Cs((p_utf8byte/little+P(1)/"")^0) @@ -5609,22 +5895,43 @@ function utf.chrlen(u) (u<0xFC and 5) or (u<0xFE and 6) or 0 end -local extract=bit32.extract -local char=string.char -function unicode.toutf32string(n) - if n<=0xFF then - return - char(n).."\000\000\000" - elseif n<=0xFFFF then - return - char(extract(n,0,8))..char(extract(n,8,8)).."\000\000" - elseif n<=0xFFFFFF then - return - char(extract(n,0,8))..char(extract(n,8,8))..char(extract(n,16,8)).."\000" - else - return - char(extract(n,0,8))..char(extract(n,8,8))..char(extract(n,16,8))..char(extract(n,24,8)) +if bit32 then + local extract=bit32.extract + local char=string.char + function unicode.toutf32string(n) + if n<=0xFF then + return + char(n).."\000\000\000" + elseif n<=0xFFFF then + return + char(extract(n,0,8))..char(extract(n,8,8)).."\000\000" + elseif n<=0xFFFFFF then + return + char(extract(n,0,8))..char(extract(n,8,8))..char(extract(n,16,8)).."\000" + else + return + char(extract(n,0,8))..char(extract(n,8,8))..char(extract(n,16,8))..char(extract(n,24,8)) + end + end +end +local len=utf.len +local rep=rep +function string.utfpadd(s,n) + if n and n~=0 then + local l=len(s) + if n>0 then + local d=n-l + if d>0 then + return rep(c or " ",d)..s + end + else + local d=- n-l + if d>0 then + return s..rep(c or " ",d) + end + end end + return s end @@ -5634,7 +5941,7 @@ do -- create closure to overcome 200 locals limit package.loaded["l-math"] = package.loaded["l-math"] or true --- original size: 974, stripped down to: 890 +-- original size: 2555, stripped down to: 1900 if not modules then modules={} end modules ['l-math']={ version=1.001, @@ -5643,21 +5950,23 @@ if not modules then modules={} end modules ['l-math']={ copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" } -local floor,sin,cos,tan=math.floor,math.sin,math.cos,math.tan if not math.ceiling then math.ceiling=math.ceil end if not math.round then + local floor=math.floor function math.round(x) return floor(x+0.5) end end if not math.div then + local floor=math.floor function math.div(n,m) return floor(n/m) end end if not math.mod then function math.mod(n,m) return n%m end end -local pipi=2*math.pi/360 if not math.sind then + local sin,cos,tan=math.sin,math.cos,math.tan + local pipi=2*math.pi/360 function math.sind(d) return sin(d*pipi) end function math.cosd(d) return cos(d*pipi) end function math.tand(d) return tan(d*pipi) end @@ -5666,6 +5975,60 @@ if not math.odd then function math.odd (n) return n%2~=0 end function math.even(n) return n%2==0 end end +if not math.cosh then + local exp=math.exp + function math.cosh(x) + local xx=exp(x) + return (xx+1/xx)/2 + end + function math.sinh(x) + local xx=exp(x) + return (xx-1/xx)/2 + end + function math.tanh(x) + local xx=exp(x) + return (xx-1/xx)/(xx+1/xx) + end +end +if not math.pow then + function math.pow(x,y) + return x^y + end +end +if not math.atan2 then + math.atan2=math.atan +end +if not math.ldexp then + function math.ldexp(x,e) + return x*2.0^e + end +end +if not math.log10 then + local log=math.log + function math.log10(x) + return log(x,10) + end +end +if not math.type then + function math.type() + return "float" + end +end +if not math.tointeger then + math.mininteger=-0x4FFFFFFFFFFF + math.maxinteger=0x4FFFFFFFFFFF + local floor=math.floor + function math.tointeger(n) + local f=floor(n) + return f==n and f or nil + end +end +if not math.ult then + local floor=math.floor + function math.tointeger(m,n) + return floor(m)<floor(n) + end +end end -- of closure @@ -5674,7 +6037,7 @@ do -- create closure to overcome 200 locals limit package.loaded["util-str"] = package.loaded["util-str"] or true --- original size: 36148, stripped down to: 20179 +-- original size: 38725, stripped down to: 21726 if not modules then modules={} end modules ['util-str']={ version=1.001, @@ -5688,13 +6051,13 @@ utilities.strings=utilities.strings or {} local strings=utilities.strings local format,gsub,rep,sub,find=string.format,string.gsub,string.rep,string.sub,string.find local load,dump=load,string.dump -local tonumber,type,tostring=tonumber,type,tostring +local tonumber,type,tostring,next=tonumber,type,tostring,next local unpack,concat=table.unpack,table.concat local P,V,C,S,R,Ct,Cs,Cp,Carg,Cc=lpeg.P,lpeg.V,lpeg.C,lpeg.S,lpeg.R,lpeg.Ct,lpeg.Cs,lpeg.Cp,lpeg.Carg,lpeg.Cc local patterns,lpegmatch=lpeg.patterns,lpeg.match -local utfchar,utfbyte=utf.char,utf.byte +local utfchar,utfbyte,utflen=utf.char,utf.byte,utf.len local loadstripped=nil -if _LUAVERSION<5.2 then +if LUAVERSION<5.2 then loadstripped=function(str,shortcuts) return load(str) end @@ -5782,6 +6145,17 @@ local pattern=Carg(1)/function(t) function strings.tabtospace(str,tab) return lpegmatch(pattern,str,1,tab or 7) end +function string.utfpadding(s,n) + if not n or n==0 then + return "" + end + local l=utflen(s) + if n>0 then + return nspaces[n-l] + else + return nspaces[-n-l] + end +end local space=spacer^0 local nospace=space/"" local endofline=nospace*newline @@ -5888,6 +6262,21 @@ function number.formatted(n,sep1,sep2) return lpegmatch(splitter,s,1,sep1 or ",",sep2 or ".") end end +local p=Cs( + P("-")^0*(P("0")^1/"")^0*(1-P("."))^0*(P(".")*P("0")^1*P(-1)/""+P(".")^0)*P(1-P("0")^1*P(-1))^0 + ) +function number.compactfloat(n,fmt) + if n==0 then + return "0" + elseif n==1 then + return "1" + end + n=lpegmatch(p,format(fmt or "%0.3f",n)) + if n=="." or n=="" or n=="-" then + return "0" + end + return n +end local zero=P("0")^1/"" local plus=P("+")/"" local minus=P("-") @@ -5940,7 +6329,7 @@ local template=[[ return function(%s) return %s end ]] local preamble,environment="",{} -if _LUAVERSION<5.2 then +if LUAVERSION<5.2 then preamble=[[ local lpeg=lpeg local type=type @@ -5955,6 +6344,7 @@ local utfchar=utf.char local utfbyte=utf.byte local lpegmatch=lpeg.match local nspaces=string.nspaces +local utfpadding=string.utfpadding local tracedchar=string.tracedchar local autosingle=string.autosingle local autodouble=string.autodouble @@ -5979,6 +6369,7 @@ else utfbyte=utf.byte, lpegmatch=lpeg.match, nspaces=string.nspaces, + utfpadding=string.utfpadding, tracedchar=string.tracedchar, autosingle=string.autosingle, autodouble=string.autodouble, @@ -6014,9 +6405,32 @@ local format_S=function(f) return format("tostring(a%s)",n) end end +local format_right=function(f) + n=n+1 + f=tonumber(f) + if not f or f==0 then + return format("(a%s or '')",n) + elseif f>0 then + return format("utfpadding(a%s,%i)..a%s",n,f,n) + else + return format("a%s..utfpadding(a%s,%i)",n,n,f) + end +end +local format_left=function(f) + n=n+1 + f=tonumber(f) + if not f or f==0 then + return format("(a%s or '')",n) + end + if f<0 then + return format("utfpadding(a%s,%i)..a%s",n,-f,n) + else + return format("a%s..utfpadding(a%s,%i)",n,n,-f) + end +end local format_q=function() n=n+1 - return format("(a%s and format('%%q',a%s) or '')",n,n) + return format("(a%s ~= nil and format('%%q',tostring(a%s)) or '')",n,n) end local format_Q=function() n=n+1 @@ -6268,6 +6682,8 @@ local builder=Cs { "start", +V("j")+V("J") +V("m")+V("M") +V("z") ++V(">") ++V("<") )+V("*") )*(P(-1)+Carg(1)) )^0, @@ -6285,7 +6701,7 @@ local builder=Cs { "start", ["X"]=(prefix_any*P("X"))/format_X, ["o"]=(prefix_any*P("o"))/format_o, ["S"]=(prefix_any*P("S"))/format_S, - ["Q"]=(prefix_any*P("Q"))/format_S, + ["Q"]=(prefix_any*P("Q"))/format_Q, ["N"]=(prefix_any*P("N"))/format_N, ["k"]=(prefix_sub*P("k"))/format_k, ["c"]=(prefix_any*P("c"))/format_c, @@ -6311,6 +6727,8 @@ local builder=Cs { "start", ["z"]=(prefix_any*P("z"))/format_z, ["a"]=(prefix_any*P("a"))/format_a, ["A"]=(prefix_any*P("A"))/format_A, + ["<"]=(prefix_any*P("<"))/format_left, + [">"]=(prefix_any*P(">"))/format_right, ["*"]=Cs(((1-P("%"))^1+P("%%")/"%%")^1)/format_rest, ["?"]=Cs(((1-P("%"))^1 )^1)/format_rest, ["!"]=Carg(2)*prefix_any*P("!")*C((1-P("!"))^1)*P("!")/format_extension, @@ -6341,7 +6759,7 @@ local function use(t,fmt,...) return t[fmt](...) end strings.formatters={} -if _LUAVERSION<5.2 then +if LUAVERSION<5.2 then function strings.formatters.new(noconcat) local t={ _type_="formatter",_connector_=noconcat and "," or "..",_extensions_={},_preamble_=preamble,_environment_={} } setmetatable(t,{ __index=make,__call=use }) @@ -6378,7 +6796,7 @@ patterns.xmlescape=Cs((P("<")/"<"+P(">")/">"+P("&")/"&"+P('"')/"" patterns.texescape=Cs((C(S("#$%\\{}"))/"\\%1"+P(1))^0) patterns.luaescape=Cs(((1-S('"\n'))^1+P('"')/'\\"'+P('\n')/'\\n"')^0) patterns.luaquoted=Cs(Cc('"')*((1-S('"\n'))^1+P('"')/'\\"'+P('\n')/'\\n"')^0*Cc('"')) -if _LUAVERSION<5.2 then +if LUAVERSION<5.2 then add(formatters,"xml",[[lpegmatch(xmlescape,%s)]],"local xmlescape = lpeg.patterns.xmlescape") add(formatters,"tex",[[lpegmatch(texescape,%s)]],"local texescape = lpeg.patterns.texescape") add(formatters,"lua",[[lpegmatch(luaescape,%s)]],"local luaescape = lpeg.patterns.luaescape") @@ -6400,6 +6818,21 @@ local pattern=Cs((newline/(os.newline or "\r")+1)^0) function string.replacenewlines(str) return lpegmatch(pattern,str) end +function strings.newcollector() + local result,r={},0 + return + function(fmt,str,...) + r=r+1 + result[r]=str==nil and fmt or formatters[fmt](str,...) + end, + function(connector) + if result then + local str=concat(result,connector) + result,r={},0 + return str + end + end +end end -- of closure @@ -6408,7 +6841,7 @@ do -- create closure to overcome 200 locals limit package.loaded["util-tab"] = package.loaded["util-tab"] or true --- original size: 27407, stripped down to: 17116 +-- original size: 27665, stripped down to: 17051 if not modules then modules={} end modules ['util-tab']={ version=1.001, @@ -6788,11 +7221,6 @@ function table.drop(t,slow) return fastdrop(t) end end -function table.autokey(t,k) - local v={} - t[k]=v - return v -end local selfmapper={ __index=function(t,k) t[k]=k return k end } function table.twowaymapper(t) if not t then @@ -7037,7 +7465,7 @@ do -- create closure to overcome 200 locals limit package.loaded["util-fil"] = package.loaded["util-fil"] or true --- original size: 7567, stripped down to: 5575 +-- original size: 7787, stripped down to: 5858 if not modules then modules={} end modules ['util-fil']={ version=1.001, @@ -7048,8 +7476,6 @@ if not modules then modules={} end modules ['util-fil']={ } local byte=string.byte local char=string.char -local extract=bit32 and bit32.extract -local floor=math.floor utilities=utilities or {} local files={} utilities.files=files @@ -7066,7 +7492,10 @@ function files.close(f) f:close() end function files.size(f) - return f:seek("end") + local current=f:seek() + local size=f:seek("end") + f:seek("set",current) + return size end files.getsize=files.size function files.setposition(f,n) @@ -7216,7 +7645,7 @@ function files.readfixed4(f) return (0x100*a+b )+(0x100*c+d)/0x10000 end end -if extract then +if bit32 then local extract=bit32.extract local band=bit32.band function files.read2dot14(f) @@ -7236,19 +7665,30 @@ end function files.skiplong(f,n) f:read(4*(n or 1)) end -function files.writecardinal2(f,n) - local a=char(n%256) - n=floor(n/256) - local b=char(n%256) - f:write(b,a) +if bit32 then + local rshift=bit32.rshift + function files.writecardinal2(f,n) + local a=char(n%256) + n=rshift(n,8) + local b=char(n%256) + f:write(b,a) + end +else + local floor=math.floor + function files.writecardinal2(f,n) + local a=char(n%256) + n=floor(n/256) + local b=char(n%256) + f:write(b,a) + end end function files.writecardinal4(f,n) local a=char(n%256) - n=floor(n/256) + n=rshift(n,8) local b=char(n%256) - n=floor(n/256) + n=rshift(n,8) local c=char(n%256) - n=floor(n/256) + n=rshift(n,8) local d=char(n%256) f:write(d,c,b,a) end @@ -7267,6 +7707,8 @@ if fio and fio.readcardinal1 then files.readinteger2=fio.readinteger2 files.readinteger3=fio.readinteger3 files.readinteger4=fio.readinteger4 + files.readfixed2=fio.readfixed2 + files.readfixed4=fio.readfixed4 files.read2dot14=fio.read2dot14 files.setposition=fio.setposition files.getposition=fio.getposition @@ -7634,7 +8076,7 @@ do -- create closure to overcome 200 locals limit package.loaded["util-sto"] = package.loaded["util-sto"] or true --- original size: 3926, stripped down to: 2742 +-- original size: 6449, stripped down to: 3069 if not modules then modules={} end modules ['util-sto']={ version=1.001, @@ -7643,7 +8085,7 @@ if not modules then modules={} end modules ['util-sto']={ copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" } -local setmetatable,getmetatable,type=setmetatable,getmetatable,type +local setmetatable,getmetatable,rawset,type=setmetatable,getmetatable,rawset,type utilities=utilities or {} utilities.storage=utilities.storage or {} local storage=utilities.storage @@ -7753,6 +8195,25 @@ function table.setmetatablecall(t,f) end return t end +function table.setmetatableindices(t,f,n,c) + if type(t)~="table" then + f,t=t,{} + end + local m=getmetatable(t) + local i=f_index[f] or f + if m then + m.__index=i + m.__newindex=n + m.__call=c + else + setmetatable(t,{ + __index=i, + __newindex=n, + __call=c, + }) + end + return t +end function table.setmetatablekey(t,key,value) local m=getmetatable(t) if not m then @@ -7774,7 +8235,7 @@ do -- create closure to overcome 200 locals limit package.loaded["util-prs"] = package.loaded["util-prs"] or true --- original size: 22883, stripped down to: 16045 +-- original size: 22956, stripped down to: 16106 if not modules then modules={} end modules ['util-prs']={ version=1.001, @@ -8192,14 +8653,16 @@ function parsers.rfc4180splitter(specification) local field=escaped+non_escaped+Cc("") local record=Ct(field*(separator*field)^1) local headerline=record*Cp() - local wholeblob=Ct((newline^(specification.strict and -1 or 1)*record)^0) + local morerecords=(newline^(specification.strict and -1 or 1)*record)^0 + local headeryes=Ct(morerecords) + local headernop=Ct(record*morerecords) return function(data,getheader) if getheader then local header,position=lpegmatch(headerline,data) - local data=lpegmatch(wholeblob,data,position) + local data=lpegmatch(headeryes,data,position) return data,header else - return lpegmatch(wholeblob,data) + return lpegmatch(headernop,data) end end end @@ -8220,8 +8683,8 @@ end local cardinal=lpegpatterns.cardinal/tonumber local spacers=lpegpatterns.spacer^0 local endofstring=lpegpatterns.endofstring -local stepper=spacers*(C(cardinal)*(spacers*S(":-")*spacers*(C(cardinal)+Cc(true) )+Cc(false) )*Carg(1)*Carg(2)/ranger*S(", ")^0 )^1 -local stepper=spacers*(C(cardinal)*(spacers*S(":-")*spacers*(C(cardinal)+(P("*")+endofstring)*Cc(true) )+Cc(false) )*Carg(1)*Carg(2)/ranger*S(", ")^0 )^1*endofstring +local stepper=spacers*(cardinal*(spacers*S(":-")*spacers*(cardinal+Cc(true) )+Cc(false) )*Carg(1)*Carg(2)/ranger*S(", ")^0 )^1 +local stepper=spacers*(cardinal*(spacers*S(":-")*spacers*(cardinal+(P("*")+endofstring)*Cc(true) )+Cc(false) )*Carg(1)*Carg(2)/ranger*S(", ")^0 )^1*endofstring function parsers.stepper(str,n,action) if type(n)=="function" then lpegmatch(stepper,str,1,false,n or print) @@ -8408,7 +8871,7 @@ do -- create closure to overcome 200 locals limit package.loaded["trac-set"] = package.loaded["trac-set"] or true --- original size: 12454, stripped down to: 8840 +-- original size: 13044, stripped down to: 9231 if not modules then modules={} end modules ['trac-set']={ version=1.001, @@ -8417,8 +8880,8 @@ if not modules then modules={} end modules ['trac-set']={ copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" } -local type,next,tostring=type,next,tostring -local concat=table.concat +local type,next,tostring,tonumber=type,next,tostring,tonumber +local concat,sortedhash=table.concat,table.sortedhash local format,find,lower,gsub,topattern=string.format,string.find,string.lower,string.gsub,string.topattern local is_boolean=string.is_boolean local settings_to_hash=utilities.parsers.settings_to_hash @@ -8435,7 +8898,7 @@ function setters.initialize(filename,name,values) frozen=true local data=setter.data if data then - for key,newvalue in next,values do + for key,newvalue in sortedhash(values) do local newvalue=is_boolean(newvalue,newvalue,true) local functions=data[key] if functions then @@ -8484,7 +8947,7 @@ local function set(t,what,newvalue) done={} t.done=done end - for w,value in next,what do + for w,value in sortedhash(what) do if value=="" then value=newvalue elseif not value then @@ -8493,7 +8956,7 @@ local function set(t,what,newvalue) value=is_boolean(value,value,true) end w=topattern(w,true,true) - for name,functions in next,data do + for name,functions in sortedhash(data) do if done[name] then elseif find(name,w) then done[name]=true @@ -8509,7 +8972,7 @@ end local function reset(t) local data=t.data if not data.frozen then - for name,functions in next,data do + for name,functions in sortedthash(data) do for i=1,#functions do functions[i](false) end @@ -8600,13 +9063,30 @@ function setters.show(t) local name=list[k] local functions=t.data[name] if functions then - local value,default,modules=functions.value,functions.default,#functions - value=value==nil and "unset" or tostring(value) - default=default==nil and "unset" or tostring(default) - t.report("%-50s modules: %2i default: %-12s value: %-12s",name,modules,default,value) + local value=functions.value + local default=functions.default + local modules=#functions + if default==nil then + default="unset" + elseif type(default)=="table" then + default=concat(default,"|") + else + default=tostring(default) + end + if value==nil then + value="unset" + elseif type(value)=="table" then + value=concat(value,"|") + else + value=tostring(value) + end + t.report(name) + t.report(" modules : %i",modules) + t.report(" default : %s",default) + t.report(" value : %s",value) + t.report() end end - t.report() end local enable,disable,register,list,show=setters.enable,setters.disable,setters.register,setters.list,setters.show function setters.report(setter,...) @@ -8720,7 +9200,7 @@ do -- create closure to overcome 200 locals limit package.loaded["trac-log"] = package.loaded["trac-log"] or true --- original size: 30007, stripped down to: 20818 +-- original size: 32737, stripped down to: 22946 if not modules then modules={} end modules ['trac-log']={ version=1.001, @@ -8739,7 +9219,8 @@ local datetime=os.date local openfile=io.open local setmetatableindex=table.setmetatableindex local formatters=string.formatters -local texgetcount=tex and tex.getcount +local settings_to_hash=utilities.parsers.settings_to_hash +local sortedkeys=table.sortedkeys local variant="default" logs=logs or {} local logs=logs @@ -9166,14 +9647,14 @@ logs.direct=direct logs.subdirect=subdirect logs.writer=writer logs.newline=newline -local data,states={},nil +local data={} +local states=nil +local force=false function logs.reporter(category,subcategory) local logger=data[category] if not logger then - local state=false - if states==true then - state=true - elseif type(states)=="table" then + local state=states==true + if not state and type(states)=="table" then for c,_ in next,states do if find(category,c) then state=true @@ -9191,7 +9672,7 @@ function logs.reporter(category,subcategory) if not reporter then if subcategory then reporter=function(...) - if not logger.state then + if force or not logger.state then subreport(category,subcategory,...) end end @@ -9199,7 +9680,7 @@ function logs.reporter(category,subcategory) else local tag=category reporter=function(...) - if not logger.state then + if force or not logger.state then report(category,...) end end @@ -9225,7 +9706,7 @@ function logs.messenger(category,subcategory) end end local function setblocked(category,value) - if category==true then + if category==true or category=="all" then category,value="*",true elseif category==false then category,value="*",false @@ -9238,7 +9719,8 @@ local function setblocked(category,value) v.state=value end else - states=utilities.parsers.settings_to_hash(category,type(states)=="table" and states or nil) + alllocked=false + states=settings_to_hash(category,type(states)=="table" and states or nil) for c in next,states do local v=data[c] if v then @@ -9261,7 +9743,7 @@ function logs.enable(category) setblocked(category,false) end function logs.categories() - return table.sortedkeys(data) + return sortedkeys(data) end function logs.show() local n,c,s,max=0,0,0,0 @@ -9283,7 +9765,7 @@ function logs.show() max=m end end - local subcategories=concat(table.sortedkeys(reporters),", ") + local subcategories=concat(sortedkeys(reporters),", ") if state==true then state="disabled" elseif state==false then @@ -9310,54 +9792,57 @@ end) directives.register("logs.target",function(v) settarget(v) end) -local report_pages=logs.reporter("pages") -local real,user,sub -function logs.start_page_number() - real=texgetcount("realpageno") - user=texgetcount("userpageno") - sub=texgetcount("subpageno") -end -local timing=false -local starttime=nil -local lasttime=nil -trackers.register("pages.timing",function(v) - starttime=os.clock() - timing=true -end) -function logs.stop_page_number() - if timing then - local elapsed,average - local stoptime=os.clock() - if not lasttime or real<2 then - elapsed=stoptime - average=stoptime - starttime=stoptime - else - elapsed=stoptime-lasttime - average=(stoptime-starttime)/(real-1) - end - lasttime=stoptime - if real<=0 then - report_pages("flushing page, time %0.04f / %0.04f",elapsed,average) - elseif user<=0 then - report_pages("flushing realpage %s, time %0.04f / %0.04f",real,elapsed,average) - elseif sub<=0 then - report_pages("flushing realpage %s, userpage %s, time %0.04f / %0.04f",real,user,elapsed,average) - else - report_pages("flushing realpage %s, userpage %s, subpage %s, time %0.04f / %0.04f",real,user,sub,elapsed,average) - end - else - if real<=0 then - report_pages("flushing page") - elseif user<=0 then - report_pages("flushing realpage %s",real) - elseif sub<=0 then - report_pages("flushing realpage %s, userpage %s",real,user) +if tex then + local report=logs.reporter("pages") + local texgetcount=tex and tex.getcount + local real,user,sub + function logs.start_page_number() + real=texgetcount("realpageno") + user=texgetcount("userpageno") + sub=texgetcount("subpageno") + end + local timing=false + local starttime=nil + local lasttime=nil + trackers.register("pages.timing",function(v) + starttime=os.clock() + timing=true + end) + function logs.stop_page_number() + if timing then + local elapsed,average + local stoptime=os.clock() + if not lasttime or real<2 then + elapsed=stoptime + average=stoptime + starttime=stoptime + else + elapsed=stoptime-lasttime + average=(stoptime-starttime)/(real-1) + end + lasttime=stoptime + if real<=0 then + report("flushing page, time %0.04f / %0.04f",elapsed,average) + elseif user<=0 then + report("flushing realpage %s, time %0.04f / %0.04f",real,elapsed,average) + elseif sub<=0 then + report("flushing realpage %s, userpage %s, time %0.04f / %0.04f",real,user,elapsed,average) + else + report("flushing realpage %s, userpage %s, subpage %s, time %0.04f / %0.04f",real,user,sub,elapsed,average) + end else - report_pages("flushing realpage %s, userpage %s, subpage %s",real,user,sub) + if real<=0 then + report("flushing page") + elseif user<=0 then + report("flushing realpage %s",real) + elseif sub<=0 then + report("flushing realpage %s, userpage %s",real,user) + else + report("flushing realpage %s, userpage %s, subpage %s",real,user,sub) + end end + logs.flush() end - logs.flush() end local nesting=0 local verbose=false @@ -9512,6 +9997,92 @@ io.stderr:setvbuf('no') if package.helpers.report then package.helpers.report=logs.reporter("package loader") end +if tex then + local finalactions={} + local fatalerrors={} + local possiblefatal={} + local loggingerrors=false + function logs.loggingerrors() + return loggingerrors + end + directives.register("logs.errors",function(v) + loggingerrors=v + if type(v)=="string" then + fatalerrors=settings_to_hash(v) + else + fatalerrors={} + end + end) + function logs.registerfinalactions(...) + insert(finalactions,...) + end + local what=nil + local report=nil + local state=nil + local target=nil + local function startlogging(t,r,w,s) + target=t + state=force + force=true + report=type(r)=="function" and r or logs.reporter(r) + what=w + pushtarget(target) + newline() + if s then + report("start %s: %s",what,s) + else + report("start %s",what) + end + if target=="logfile" then + newline() + end + return report + end + local function stoplogging() + if target=="logfile" then + newline() + end + report("stop %s",what) + if target=="logfile" then + newline() + end + poptarget() + state=oldstate + end + function logs.startfilelogging(...) + return startlogging("logfile",...) + end + logs.stopfilelogging=stoplogging + local done=false + function logs.starterrorlogging(r,w,...) + if not done then + pushtarget("terminal") + newline() + logs.report("error logging","start possible issues") + poptarget() + done=true + end + if fatalerrors[w] then + possiblefatal[w]=true + end + return startlogging("terminal",r,w,...) + end + logs.stoperrorlogging=stoplogging + function logs.finalactions() + if #finalactions>0 then + for i=1,#finalactions do + finalactions[i]() + end + if done then + pushtarget("terminal") + newline() + logs.report("error logging","stop possible issues") + poptarget() + end + return next(possiblefatal) and sortedkeys(possiblefatal) or false + end + end +end end -- of closure @@ -9520,7 +10091,7 @@ do -- create closure to overcome 200 locals limit package.loaded["trac-inf"] = package.loaded["trac-inf"] or true --- original size: 8036, stripped down to: 5567 +-- original size: 8284, stripped down to: 5698 if not modules then modules={} end modules ['trac-inf']={ version=1.001, @@ -9556,7 +10127,7 @@ local ticks=clock local seconds=function(n) return n or 0 end local function starttiming(instance) local timer=timers[instance or "notimer"] - local it=timer.timing or 0 + local it=timer.timing if it==0 then timer.starttime=ticks() if not timer.loadtime then @@ -9586,7 +10157,7 @@ local function stoptiming(instance) end local function elapsed(instance) if type(instance)=="number" then - return instance or 0 + return instance else local timer=timers[instance or "notimer"] return timer and seconds(timer.loadtime) or 0 @@ -9627,8 +10198,9 @@ function statistics.show() return format("%s, type: %s, binary subtree: %s", os.platform or "unknown",os.type or "unknown",environment.texos or "unknown") end) - register("luatex banner",function() - return lower(status.banner) + register("used engine",function() + return format("%s version %s with functionality level %s, banner: %s", + LUATEXENGINE,LUATEXVERSION,LUATEXFUNCTIONALITY,lower(status.banner)) end) register("control sequences",function() return format("%s of %s + %s",status.cs_count,status.hash_size,status.hash_extra) @@ -9650,8 +10222,9 @@ function statistics.show() local hashchar=tonumber(status.luatex_hashchars) local hashtype=status.luatex_hashtype local mask=lua.mask or "ascii" - return format("engine: %s, used memory: %s, hash type: %s, hash chars: min(%s,40), symbol mask: %s (%s)", + return format("engine: %s %s, used memory: %s, hash type: %s, hash chars: min(%i,40), symbol mask: %s (%s)", jit and "luajit" or "lua", + LUAVERSION, statistics.memused(), hashtype or "default", hashchar and 2^hashchar or "unknown", @@ -9707,7 +10280,7 @@ do -- create closure to overcome 200 locals limit package.loaded["trac-pro"] = package.loaded["trac-pro"] or true --- original size: 5829, stripped down to: 3501 +-- original size: 5841, stripped down to: 3511 if not modules then modules={} end modules ['trac-pro']={ version=1.001, @@ -9716,7 +10289,7 @@ if not modules then modules={} end modules ['trac-pro']={ copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" } -local getmetatable,setmetatable,rawset,type=getmetatable,setmetatable,rawset,type +local getmetatable,setmetatable,rawset,type,next=getmetatable,setmetatable,rawset,type,next local trace_namespaces=false trackers.register("system.namespaces",function(v) trace_namespaces=v end) local report_system=logs.reporter("system","protection") namespaces=namespaces or {} @@ -9854,7 +10427,7 @@ do -- create closure to overcome 200 locals limit package.loaded["util-lua"] = package.loaded["util-lua"] or true --- original size: 5396, stripped down to: 3708 +-- original size: 6921, stripped down to: 4998 if not modules then modules={} end modules ['util-lua']={ version=1.001, @@ -9865,13 +10438,14 @@ if not modules then modules={} end modules ['util-lua']={ license="see context related readme files" } local rep,sub,byte,dump,format=string.rep,string.sub,string.byte,string.dump,string.format -local load,loadfile,type=load,loadfile,type +local load,loadfile,type,collectgarbage=load,loadfile,type,collectgarbage utilities=utilities or {} utilities.lua=utilities.lua or {} local luautilities=utilities.lua local report_lua=logs.reporter("system","lua") +local report_mem=logs.reporter("system","lua memory") local tracestripping=false -local forcestupidcompile=true +local tracememory=false luautilities.stripcode=true luautilities.alwaysstripcode=false luautilities.nofstrippedchunks=0 @@ -9915,11 +10489,19 @@ local function stupidcompile(luafile,lucfile,strip) end return false,0 end -function luautilities.loadedluacode(fullname,forcestrip,name) +function luautilities.loadedluacode(fullname,forcestrip,name,macros) name=name or fullname local code,message - if environment.loadpreprocessedfile then - code,message=environment.loadpreprocessedfile(fullname) + if macros then + macros=lua.macros + end + if macros and macros.enabled then + local f=io.open(fullname,"rb") local c=f:read("*a") f:close() + local n=c and macros.resolvestring("--[["..fullname.."]] "..c) + if n and #n~=#c then + report_lua("preprocessed file %a: %i => %i bytes",fullname,#c,#n) + end + code,message=load(n or c) else code,message=loadfile(fullname) end @@ -9945,7 +10527,7 @@ function luautilities.loadedluacode(fullname,forcestrip,name) return code,0 end end -function luautilities.strippedloadstring(code,forcestrip,name) +function luautilities.strippedloadstring(code,name,forcestrip) local code,message=load(code) if not code then report_lua("loading of file %a failed:\n\t%s",name,message or "no message") @@ -9957,6 +10539,13 @@ function luautilities.strippedloadstring(code,forcestrip,name) return code,0 end end +function luautilities.loadstring(code,name) + local code,message=load(code) + if not code then + report_lua("loading of file %a failed:\n\t%s",name,message or "no message") + end + return code,0 +end function luautilities.compile(luafile,lucfile,cleanup,strip,fallback) report_lua("compiling %a into %a",luafile,lucfile) os.remove(lucfile) @@ -9987,6 +10576,26 @@ setmetatable(finalizers,{ function luautilities.registerfinalizer(f) finalizers[#finalizers+1]=f end +function luautilities.checkmemory(previous,threshold,trace) + local current=collectgarbage("count") + if previous then + local checked=(threshold or 64)*1024 + local delta=current-previous + if current-previous>checked then + collectgarbage("collect") + local afterwards=collectgarbage("count") + if trace or tracememory then + report_mem("previous %i MB, current %i MB, delta %i MB, threshold %i MB, afterwards %i MB", + previous/1024,current/1024,delta/1024,threshold,afterwards) + end + return afterwards + elseif trace or tracememory then + report_mem("previous %i MB, current %i MB, delta %i MB, threshold %i MB", + previous/1024,current/1024,delta/1024,threshold) + end + end + return current +end end -- of closure @@ -9995,7 +10604,7 @@ do -- create closure to overcome 200 locals limit package.loaded["util-deb"] = package.loaded["util-deb"] or true --- original size: 8911, stripped down to: 6504 +-- original size: 8984, stripped down to: 6573 if not modules then modules={} end modules ['util-deb']={ version=1.001, @@ -10121,7 +10730,8 @@ function debugger.showstats(printer,threshold) local functions=0 local dataset={} local length=0 - local wholetime=0 + local realtime=0 + local totaltime=0 local threshold=threshold or 0 for name,sources in next,names do for source,lines in next,sources do @@ -10138,8 +10748,9 @@ function debugger.showstats(printer,threshold) if real<0 then real=0 end - wholetime=wholetime+real + realtime=realtime+real end + totaltime=totaltime+total if line<0 then line=0 end @@ -10174,7 +10785,7 @@ function debugger.showstats(printer,threshold) if length>50 then length=50 end - local fmt=string.formatters["%4.9k %4.9k %3.3k %8i %-"..length.."s %4i %s"] + local fmt=string.formatters["%4.9k s %3.3k %% %4.9k s %3.3k %% %8i # %-"..length.."s %4i %s"] for i=1,#dataset do local data=dataset[i] local real=data[1] @@ -10183,14 +10794,13 @@ function debugger.showstats(printer,threshold) local name=data[4] local source=data[5] local line=data[6] - local percent=real/wholetime calls=calls+count functions=functions+1 name=gsub(name,"%s+"," ") if #name>length then name=sub(name,1,length) end - printer(fmt(seconds(total),seconds(real),percent,count,name,line,source)) + printer(fmt(seconds(total),100*total/totaltime,seconds(real),100*real/realtime,count,name,line,source)) end printer("") printer(format("functions : %i",functions)) @@ -10254,7 +10864,7 @@ do -- create closure to overcome 200 locals limit package.loaded["util-tpl"] = package.loaded["util-tpl"] or true --- original size: 7100, stripped down to: 3978 +-- original size: 7112, stripped down to: 3988 if not modules then modules={} end modules ['util-tpl']={ version=1.001, @@ -10267,7 +10877,7 @@ utilities.templates=utilities.templates or {} local templates=utilities.templates local trace_template=false trackers.register("templates.trace",function(v) trace_template=v end) local report_template=logs.reporter("template") -local tostring=tostring +local tostring,next=tostring,next local format,sub,byte=string.format,string.sub,string.byte local P,C,R,Cs,Cc,Carg,lpegmatch,lpegpatterns=lpeg.P,lpeg.C,lpeg.R,lpeg.Cs,lpeg.Cc,lpeg.Carg,lpeg.match,lpeg.patterns local replacer @@ -10399,7 +11009,7 @@ do -- create closure to overcome 200 locals limit package.loaded["util-sbx"] = package.loaded["util-sbx"] or true --- original size: 20309, stripped down to: 13848 +-- original size: 20393, stripped down to: 13924 if not modules then modules={} end modules ['util-sbx']={ version=1.001, @@ -10424,6 +11034,7 @@ local concat=string.concat local unquoted=string.unquoted local optionalquoted=string.optionalquoted local basename=file.basename +local nameonly=file.nameonly local sandbox=sandbox local validroots={} local validrunners={} @@ -10503,9 +11114,9 @@ local function registerlibrary(name) return end if validlibraries==true then - validlibraries={ [name]=true } + validlibraries={ [nameonly(name)]=true } else - validlibraries[name]=true + validlibraries[nameonly(name)]=true end elseif name==true then validlibraries={} @@ -10780,7 +11391,7 @@ function sandbox.getrunner(name) return name and validrunners[name] end local function suspicious(str) - return (find(str,"[/\\]") or find(command,"%.%.")) and true or false + return (find(str,"[/\\]") or find(command,"..",1,true)) and true or false end local function binaryrunner(action,command,...) if validbinaries==false then @@ -10830,15 +11441,15 @@ if FFISUPPORTED and ffi then end end end - local load=ffi.load - if load then + local fiiload=ffi.load + if fiiload then local reported={} function ffi.load(name,...) if validlibraries==false then elseif validlibraries==true then - return load(name,...) - elseif validlibraries[name] then - return load(name,...) + return fiiload(name,...) + elseif validlibraries[nameonly(name)] then + return fiiload(name,...) else end if not reported[name] then @@ -11083,7 +11694,7 @@ do -- create closure to overcome 200 locals limit package.loaded["util-env"] = package.loaded["util-env"] or true --- original size: 9246, stripped down to: 5038 +-- original size: 9400, stripped down to: 5499 if not modules then modules={} end modules ['util-env']={ version=1.001, @@ -11098,8 +11709,21 @@ local unquoted,quoted,optionalquoted=string.unquoted,string.quoted,string.option local concat,insert,remove=table.concat,table.insert,table.remove environment=environment or {} local environment=environment -os.setlocale(nil,nil) -function os.setlocale() +local setlocale=os.setlocale +setlocale(nil,nil) +local report=logs.reporter("system") +function os.setlocale(a,b) + if a or b then + if report then + report() + report("You're messing with os.locale in a supposedly locale neutral enviroment. From") + report("now on are on your own and without support. Crashes or unexpected side effects") + report("can happen but don't bother the luatex and context developer team with it.") + report() + report=nil + end + setlocale(a,b) + end end local validengines=allocate { ["luatex"]=true, @@ -11270,7 +11894,7 @@ do -- create closure to overcome 200 locals limit package.loaded["luat-env"] = package.loaded["luat-env"] or true --- original size: 6174, stripped down to: 4141 +-- original size: 5820, stripped down to: 4155 if not modules then modules={} end modules ['luat-env']={ version=1.001, @@ -11344,11 +11968,11 @@ local function strippable(filename) return false end end -function environment.luafilechunk(filename,silent) +function environment.luafilechunk(filename,silent,macros) filename=file.replacesuffix(filename,"lua") local fullname=environment.luafile(filename) if fullname and fullname~="" then - local data=luautilities.loadedluacode(fullname,strippable,filename) + local data=luautilities.loadedluacode(fullname,strippable,filename,macros) if not silent then report_lua("loading file %a %s",fullname,not data and "failed" or "succeeded") end @@ -11423,7 +12047,7 @@ do -- create closure to overcome 200 locals limit package.loaded["lxml-tab"] = package.loaded["lxml-tab"] or true --- original size: 57003, stripped down to: 35696 +-- original size: 59638, stripped down to: 37936 if not modules then modules={} end modules ['lxml-tab']={ version=1.001, @@ -11469,8 +12093,17 @@ local entities,parameters local strip,utfize,resolve,cleanup,resolve_predefined,unify_predefined local dcache,hcache,acache local mt,dt,nt +local currentfilename,currentline,linenumbers +local grammar_parsed_text_one +local grammar_parsed_text_two +local grammar_unparsed_text +local handle_hex_entity +local handle_dec_entity +local handle_any_entity_dtd +local handle_any_entity_text local function preparexmlstate(settings) if settings then + linenumbers=settings.linenumbers stack={} level=0 top={} @@ -11487,6 +12120,8 @@ local function preparexmlstate(settings) unify_predefined=settings.unify_predefined_entities cleanup=settings.text_cleanup entities=settings.entities or {} + currentfilename=settings.currentresource + currentline=1 parameters={} reported_at_errors={} dcache={} @@ -11501,6 +12136,7 @@ local function preparexmlstate(settings) resolve_predefined=true end else + linenumbers=false stack=nil level=nil top=nil @@ -11522,6 +12158,8 @@ local function preparexmlstate(settings) dcache=nil hcache=nil acache=nil + currentfilename=nil + currentline=1 end end local function initialize_mt(root) @@ -11559,14 +12197,24 @@ local function add_empty(spacing,namespace,tag) top=stack[level] dt=top.dt nt=#dt+1 - local t={ + local t=linenumbers and { + ns=namespace or "", + rn=resolved, + tg=tag, + at=at, + dt={}, + ni=nt, + cf=currentfilename, + cl=currentline, + __p__=top, + } or { ns=namespace or "", rn=resolved, tg=tag, at=at, dt={}, ni=nt, - __p__=top + __p__=top, } dt[nt]=t setmetatable(t,mt) @@ -11581,18 +12229,28 @@ local function add_begin(spacing,namespace,tag) dt[nt]=spacing end local resolved=namespace=="" and xmlns[#xmlns] or nsremap[namespace] or namespace - top={ + dt={} + top=linenumbers and { ns=namespace or "", rn=resolved, tg=tag, at=at, - dt={}, + dt=dt, + ni=nil, + cf=currentfilename, + cl=currentline, + __p__=stack[level], + } or { + ns=namespace or "", + rn=resolved, + tg=tag, + at=at, + dt=dt, ni=nil, - __p__=stack[level] + __p__=stack[level], } setmetatable(top,mt) - dt=top.dt - nt=#dt + nt=0 level=level+1 stack[level]=top at={} @@ -11660,7 +12318,15 @@ local function add_special(what,spacing,text) if strip and (what=="@cm@" or what=="@dt@") then else nt=nt+1 - dt[nt]={ + dt[nt]=linenumbers and { + special=true, + ns="", + tg=what, + ni=nil, + dt={ text }, + cf=currentfilename, + cl=currentline, + } or { special=true, ns="", tg=what, @@ -11688,12 +12354,6 @@ local function attribute_specification_error(str) end return str end -local grammar_parsed_text_one -local grammar_parsed_text_two -local handle_hex_entity -local handle_dec_entity -local handle_any_entity_dtd -local handle_any_entity_text do local badentity="&" xml.placeholders={ @@ -12095,7 +12755,13 @@ local function handle_crap_error(chr) add_text(chr) return chr end +local function handlenewline() + currentline=currentline+1 +end +local spacetab=S(' \t') local space=S(' \r\n\t') +local newline=lpegpatterns.newline/handlenewline +local anything=P(1) local open=P('<') local close=P('>') local squote=S("'") @@ -12111,43 +12777,9 @@ local name_nop=C(P(true))*C(valid^1) local name=name_yes+name_nop local utfbom=lpegpatterns.utfbom local spacing=C(space^0) -local anyentitycontent=(1-open-semicolon-space-close-ampersand)^0 -local hexentitycontent=R("AF","af","09")^1 -local decentitycontent=R("09")^1 -local parsedentity=P("#")/""*( - P("x")/""*(hexentitycontent/handle_hex_entity)+(decentitycontent/handle_dec_entity) - )+(anyentitycontent/handle_any_entity_dtd) -local parsedentity_text=P("#")/""*( - P("x")/""*(hexentitycontent/handle_hex_entity)+(decentitycontent/handle_dec_entity) - )+(anyentitycontent/handle_any_entity_text) -local entity=(ampersand/"")*parsedentity*(semicolon/"")+ampersand*(anyentitycontent/handle_end_entity) -local entity_text=(ampersand/"")*parsedentity_text*(semicolon/"")+ampersand*(anyentitycontent/handle_end_entity) -local text_unparsed=C((1-open)^1) -local text_parsed=(Cs((1-open-ampersand)^1)/add_text+Cs(entity_text)/add_text)^1 -local somespace=space^1 -local optionalspace=space^0 -local value=(squote*Cs((entity+(1-squote))^0)*squote)+(dquote*Cs((entity+(1-dquote))^0)*dquote) -local endofattributes=slash*close+close -local whatever=space*name*optionalspace*equal -local wrongvalue=Cs(P(entity+(1-space-endofattributes))^1)/attribute_value_error -local attributevalue=value+wrongvalue -local attribute=(somespace*name*optionalspace*equal*optionalspace*attributevalue)/add_attribute -local attributes=(attribute+somespace^-1*(((1-endofattributes)^1)/attribute_specification_error))^0 -local parsedtext=text_parsed -local unparsedtext=text_unparsed/add_text -local balanced=P { "["*((1-S"[]")+V(1))^0*"]" } -local emptyelement=(spacing*open*name*attributes*optionalspace*slash*close)/add_empty -local beginelement=(spacing*open*name*attributes*optionalspace*close)/add_begin -local endelement=(spacing*open*slash*name*optionalspace*close)/add_end -local begincomment=open*P("!--") -local endcomment=P("--")*close -local begininstruction=open*P("?") -local endinstruction=P("?")*close -local begincdata=open*P("![CDATA[") -local endcdata=P("]]")*close -local someinstruction=C((1-endinstruction)^0) -local somecomment=C((1-endcomment )^0) -local somecdata=C((1-endcdata )^0) +local space_nl=spacetab+newline +local spacing_nl=Cs((space_nl)^0) +local anything_nl=newline+P(1) local function weirdentity(k,v) if trace_entities then report_xml("registering %s entity %a as %a","weird",k,v) @@ -12172,59 +12804,114 @@ local function publicentity(k,v,n) end entities[k]=v end -local begindoctype=open*P("!DOCTYPE") -local enddoctype=close -local beginset=P("[") -local endset=P("]") -local wrdtypename=C((1-somespace-P(";"))^1) -local doctypename=C((1-somespace-close)^0) -local elementdoctype=optionalspace*P("<!ELEMENT")*(1-close)^0*close -local basiccomment=begincomment*((1-endcomment)^0)*endcomment -local weirdentitytype=P("%")*(somespace*doctypename*somespace*value)/weirdentity -local normalentitytype=(doctypename*somespace*value)/normalentity -local publicentitytype=(doctypename*somespace*P("PUBLIC")*somespace*value)/publicentity -local systementitytype=(doctypename*somespace*P("SYSTEM")*somespace*value*somespace*P("NDATA")*somespace*doctypename)/systementity -local entitydoctype=optionalspace*P("<!ENTITY")*somespace*(systementitytype+publicentitytype+normalentitytype+weirdentitytype)*optionalspace*close -local function weirdresolve(s) - lpegmatch(entitydoctype,parameters[s]) -end -local function normalresolve(s) - lpegmatch(entitydoctype,entities[s]) -end -local entityresolve=P("%")*(wrdtypename/weirdresolve )*P(";")+P("&")*(wrdtypename/normalresolve)*P(";") -entitydoctype=entitydoctype+entityresolve -local doctypeset=beginset*optionalspace*P(elementdoctype+entitydoctype+entityresolve+basiccomment+space)^0*optionalspace*endset -local definitiondoctype=doctypename*somespace*doctypeset -local publicdoctype=doctypename*somespace*P("PUBLIC")*somespace*value*somespace*value*somespace*doctypeset -local systemdoctype=doctypename*somespace*P("SYSTEM")*somespace*value*somespace*doctypeset -local simpledoctype=(1-close)^1 -local somedoctype=C((somespace*(publicdoctype+systemdoctype+definitiondoctype+simpledoctype)*optionalspace)^0) -local instruction=(spacing*begininstruction*someinstruction*endinstruction)/function(...) add_special("@pi@",...) end -local comment=(spacing*begincomment*somecomment*endcomment )/function(...) add_special("@cm@",...) end -local cdata=(spacing*begincdata*somecdata*endcdata )/function(...) add_special("@cd@",...) end -local doctype=(spacing*begindoctype*somedoctype*enddoctype )/function(...) add_special("@dt@",...) end -local crap_parsed=1-beginelement-endelement-emptyelement-begininstruction-begincomment-begincdata-ampersand -local crap_unparsed=1-beginelement-endelement-emptyelement-begininstruction-begincomment-begincdata -local parsedcrap=Cs((crap_parsed^1+entity_text)^1)/handle_crap_error -local parsedcrap=Cs((crap_parsed^1+entity_text)^1)/handle_crap_error -local unparsedcrap=Cs((crap_unparsed )^1)/handle_crap_error -local trailer=space^0*(text_unparsed/set_message)^0 -grammar_parsed_text_one=P { "preamble", - preamble=utfbom^0*instruction^0*(doctype+comment+instruction)^0, -} -grammar_parsed_text_two=P { "followup", - followup=V("parent")*trailer, - parent=beginelement*V("children")^0*endelement, - children=parsedtext+V("parent")+emptyelement+comment+cdata+instruction+parsedcrap, -} -local grammar_unparsed_text=P { "preamble", - preamble=utfbom^0*instruction^0*(doctype+comment+instruction)^0*V("parent")*trailer, - parent=beginelement*V("children")^0*endelement, - children=unparsedtext+V("parent")+emptyelement+comment+cdata+instruction+unparsedcrap, -} -local function _xmlconvert_(data,settings) +local function install(spacenewline,spacing,anything) + local anyentitycontent=(1-open-semicolon-space-close-ampersand)^0 + local hexentitycontent=R("AF","af","09")^1 + local decentitycontent=R("09")^1 + local parsedentity=P("#")/""*( + P("x")/""*(hexentitycontent/handle_hex_entity)+(decentitycontent/handle_dec_entity) + )+(anyentitycontent/handle_any_entity_dtd) + local parsedentity_text=P("#")/""*( + P("x")/""*(hexentitycontent/handle_hex_entity)+(decentitycontent/handle_dec_entity) + )+(anyentitycontent/handle_any_entity_text) + local entity=(ampersand/"")*parsedentity*(semicolon/"")+ampersand*(anyentitycontent/handle_end_entity) + local entity_text=(ampersand/"")*parsedentity_text*(semicolon/"")+ampersand*(anyentitycontent/handle_end_entity) + local text_unparsed=Cs((anything-open)^1) + local text_parsed=(Cs((anything-open-ampersand)^1)/add_text+Cs(entity_text)/add_text)^1 + local somespace=(spacenewline)^1 + local optionalspace=(spacenewline)^0 + local value=(squote*Cs((entity+(anything-squote))^0)*squote)+(dquote*Cs((entity+(anything-dquote))^0)*dquote) + local endofattributes=slash*close+close + local whatever=space*name*optionalspace*equal + local wrongvalue=Cs(P(entity+(1-space-endofattributes))^1)/attribute_value_error + local attributevalue=value+wrongvalue + local attribute=(somespace*name*optionalspace*equal*optionalspace*attributevalue)/add_attribute + local attributes=(attribute+somespace^-1*(((anything-endofattributes)^1)/attribute_specification_error))^0 + local parsedtext=text_parsed + local unparsedtext=text_unparsed/add_text + local balanced=P { "["*((anything-S"[]")+V(1))^0*"]" } + local emptyelement=(spacing*open*name*attributes*optionalspace*slash*close)/add_empty + local beginelement=(spacing*open*name*attributes*optionalspace*close)/add_begin + local endelement=(spacing*open*slash*name*optionalspace*close)/add_end + local begincomment=open*P("!--") + local endcomment=P("--")*close + local begininstruction=open*P("?") + local endinstruction=P("?")*close + local begincdata=open*P("![CDATA[") + local endcdata=P("]]")*close + local someinstruction=C((anything-endinstruction)^0) + local somecomment=C((anything-endcomment )^0) + local somecdata=C((anything-endcdata )^0) + local begindoctype=open*P("!DOCTYPE") + local enddoctype=close + local beginset=P("[") + local endset=P("]") + local wrdtypename=C((anything-somespace-P(";"))^1) + local doctypename=C((anything-somespace-close)^0) + local elementdoctype=optionalspace*P("<!ELEMENT")*(anything-close)^0*close + local basiccomment=begincomment*((anything-endcomment)^0)*endcomment + local weirdentitytype=P("%")*(somespace*doctypename*somespace*value)/weirdentity + local normalentitytype=(doctypename*somespace*value)/normalentity + local publicentitytype=(doctypename*somespace*P("PUBLIC")*somespace*value)/publicentity + local systementitytype=(doctypename*somespace*P("SYSTEM")*somespace*value*somespace*P("NDATA")*somespace*doctypename)/systementity + local entitydoctype=optionalspace*P("<!ENTITY")*somespace*(systementitytype+publicentitytype+normalentitytype+weirdentitytype)*optionalspace*close + local function weirdresolve(s) + lpegmatch(entitydoctype,parameters[s]) + end + local function normalresolve(s) + lpegmatch(entitydoctype,entities[s]) + end + local entityresolve=P("%")*(wrdtypename/weirdresolve )*P(";")+P("&")*(wrdtypename/normalresolve)*P(";") + entitydoctype=entitydoctype+entityresolve + local doctypeset=beginset*optionalspace*P(elementdoctype+entitydoctype+entityresolve+basiccomment+space)^0*optionalspace*endset + local definitiondoctype=doctypename*somespace*doctypeset + local publicdoctype=doctypename*somespace*P("PUBLIC")*somespace*value*somespace*value*somespace*doctypeset + local systemdoctype=doctypename*somespace*P("SYSTEM")*somespace*value*somespace*doctypeset + local simpledoctype=(anything-close)^1 + local somedoctype=C((somespace*(publicdoctype+systemdoctype+definitiondoctype+simpledoctype)*optionalspace)^0) + local instruction=(spacing*begininstruction*someinstruction*endinstruction)/function(...) add_special("@pi@",...) end + local comment=(spacing*begincomment*somecomment*endcomment )/function(...) add_special("@cm@",...) end + local cdata=(spacing*begincdata*somecdata*endcdata )/function(...) add_special("@cd@",...) end + local doctype=(spacing*begindoctype*somedoctype*enddoctype )/function(...) add_special("@dt@",...) end + local crap_parsed=anything-beginelement-endelement-emptyelement-begininstruction-begincomment-begincdata-ampersand + local crap_unparsed=anything-beginelement-endelement-emptyelement-begininstruction-begincomment-begincdata + local parsedcrap=Cs((crap_parsed^1+entity_text)^1)/handle_crap_error + local parsedcrap=Cs((crap_parsed^1+entity_text)^1)/handle_crap_error + local unparsedcrap=Cs((crap_unparsed )^1)/handle_crap_error + local trailer=space^0*(text_unparsed/set_message)^0 + local grammar_parsed_text_one=P { "preamble", + preamble=utfbom^0*instruction^0*(doctype+comment+instruction)^0, + } + local grammar_parsed_text_two=P { "followup", + followup=V("parent")*trailer, + parent=beginelement*V("children")^0*endelement, + children=parsedtext+V("parent")+emptyelement+comment+cdata+instruction+parsedcrap, + } + local grammar_unparsed_text=P { "preamble", + preamble=utfbom^0*instruction^0*(doctype+comment+instruction)^0*V("parent")*trailer, + parent=beginelement*V("children")^0*endelement, + children=unparsedtext+V("parent")+emptyelement+comment+cdata+instruction+unparsedcrap, + } + return grammar_parsed_text_one,grammar_parsed_text_two,grammar_unparsed_text +end +grammar_parsed_text_one_nop, +grammar_parsed_text_two_nop, +grammar_unparsed_text_nop=install(space,spacing,anything) +grammar_parsed_text_one_yes, +grammar_parsed_text_two_yes, +grammar_unparsed_text_yes=install(space_nl,spacing_nl,anything_nl) +local function _xmlconvert_(data,settings,detail) settings=settings or {} preparexmlstate(settings) + if settings.linenumbers then + grammar_parsed_text_one=grammar_parsed_text_one_yes + grammar_parsed_text_two=grammar_parsed_text_two_yes + grammar_unparsed_text=grammar_unparsed_text_yes + else + grammar_parsed_text_one=grammar_parsed_text_one_nop + grammar_parsed_text_two=grammar_parsed_text_two_nop + grammar_unparsed_text=grammar_unparsed_text_nop + end local preprocessor=settings.preprocessor if data and data~="" and type(preprocessor)=="function" then data=preprocessor(data,settings) or data @@ -12241,6 +12928,8 @@ local function _xmlconvert_(data,settings) nt=0 if not data or data=="" then errorstr="empty xml file" + elseif data==true then + errorstr=detail or "problematic xml file" elseif utfize or resolve then local m=lpegmatch(grammar_parsed_text_one,data) if m then @@ -12272,7 +12961,7 @@ local function _xmlconvert_(data,settings) if errorhandler then local currentresource=settings.currentresource if currentresource and currentresource~="" then - xml.errorhandler(formatters["load error in [%s]: %s"](currentresource,errorstr)) + xml.errorhandler(formatters["load error in [%s]: %s"](currentresource,errorstr),currentresource) else xml.errorhandler(formatters["load error: %s"](errorstr)) end @@ -12315,8 +13004,10 @@ local function xmlconvert(data,settings) local ok,result=pcall(function() return _xmlconvert_(data,settings) end) if ok then return result + elseif type(result)=="string" then + return _xmlconvert_(true,settings,result) else - return _xmlconvert_("",settings) + return _xmlconvert_(true,settings) end end xml.convert=xmlconvert @@ -13945,7 +14636,7 @@ do -- create closure to overcome 200 locals limit package.loaded["lxml-mis"] = package.loaded["lxml-mis"] or true --- original size: 3684, stripped down to: 1957 +-- original size: 3574, stripped down to: 1863 if not modules then modules={} end modules ['lxml-mis']={ version=1.001, @@ -13955,8 +14646,8 @@ if not modules then modules={} end modules ['lxml-mis']={ license="see context related readme files" } local xml,lpeg,string=xml,lpeg,string +local type=type local concat=table.concat -local type,next,tonumber,tostring,setmetatable,loadstring=type,next,tonumber,tostring,setmetatable,loadstring local format,gsub,match=string.format,string.gsub,string.match local lpegmatch,lpegpatterns=lpeg.match,lpeg.patterns local P,S,R,C,V,Cc,Cs=lpeg.P,lpeg.S,lpeg.R,lpeg.C,lpeg.V,lpeg.Cc,lpeg.Cs @@ -14014,7 +14705,7 @@ do -- create closure to overcome 200 locals limit package.loaded["lxml-aux"] = package.loaded["lxml-aux"] or true --- original size: 29835, stripped down to: 21174 +-- original size: 30650, stripped down to: 21793 if not modules then modules={} end modules ['lxml-aux']={ version=1.001, @@ -14034,7 +14725,7 @@ local type,next,setmetatable,getmetatable=type,next,setmetatable,getmetatable local insert,remove,fastcopy,concat=table.insert,table.remove,table.fastcopy,table.concat local gmatch,gsub,format,find,strip=string.gmatch,string.gsub,string.format,string.find,string.strip local utfbyte=utf.byte -local lpegmatch=lpeg.match +local lpegmatch,lpegpatterns=lpeg.match,lpeg.patterns local striplinepatterns=utilities.strings.striplinepatterns local function report(what,pattern,c,e) report_xml("%s element %a, root %a, position %a, index %a, pattern %a",what,xmlname(e),xmlname(e.__p__),c,e.ni,pattern) @@ -14375,7 +15066,9 @@ local function include(xmldata,pattern,attribute,recursive,loaddata,level) end local data=nil if name and name~="" then - data=loaddata(name) or "" + local d,n=loaddata(name) + data=d or "" + name=n or name if trace_inclusions then report_xml("including %s bytes from %a at level %s by pattern %a and attribute %a (%srecursing)",#data,name,level,pattern,attribute or "",recursive and "" or "not ") end @@ -14385,6 +15078,9 @@ local function include(xmldata,pattern,attribute,recursive,loaddata,level) elseif ekat["parse"]=="text" then epdt[ek.ni]=xml.escaped(data) else +local settings=xmldata.settings +local savedresource=settings.currentresource +settings.currentresource=name local xi=xmlinheritedconvert(data,xmldata) if not xi then epdt[ek.ni]="" @@ -14395,6 +15091,7 @@ local function include(xmldata,pattern,attribute,recursive,loaddata,level) local child=xml.body(xi) child.__p__=ekrt child.__f__=name +child.cf=name epdt[ek.ni]=child local settings=xmldata.settings local inclusions=settings and settings.inclusions @@ -14415,6 +15112,7 @@ local function include(xmldata,pattern,attribute,recursive,loaddata,level) end end end +settings.currentresource=savedresource end end end @@ -14458,13 +15156,12 @@ end function xml.badinclusions(e,sorted) return getinclusions("badinclusions",e,sorted) end -local b_collapser=lpeg.patterns.b_collapser -local m_collapser=lpeg.patterns.m_collapser -local e_collapser=lpeg.patterns.e_collapser -local b_stripper=lpeg.patterns.b_stripper -local m_stripper=lpeg.patterns.m_stripper -local e_stripper=lpeg.patterns.e_stripper -local lpegmatch=lpeg.match +local b_collapser=lpegpatterns.b_collapser +local m_collapser=lpegpatterns.m_collapser +local e_collapser=lpegpatterns.e_collapser +local b_stripper=lpegpatterns.b_stripper +local m_stripper=lpegpatterns.m_stripper +local e_stripper=lpegpatterns.e_stripper local function stripelement(e,nolines,anywhere) local edt=e.dt if edt then @@ -14876,6 +15573,27 @@ function xml.totable(x,strip,flat) return convert(x,strip,flat) end end +function xml.rename(e,namespace,name,attributes) + if type(e)~="table" or not e.tg then + return + end + if type(name)=="table" then + attributes=name + name=namespace + namespace="" + elseif type(name)~="string" then + attributes={} + name=namespace + namespace="" + end + if type(attributes)~="table" then + attributes={} + end + e.ns=namespace + e.rn=namespace + e.tg=name + e.at=attributes +end end -- of closure @@ -14884,7 +15602,7 @@ do -- create closure to overcome 200 locals limit package.loaded["lxml-xml"] = package.loaded["lxml-xml"] or true --- original size: 10274, stripped down to: 7538 +-- original size: 10412, stripped down to: 7669 if not modules then modules={} end modules ['lxml-xml']={ version=1.001, @@ -14893,6 +15611,7 @@ if not modules then modules={} end modules ['lxml-xml']={ copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" } +local tonumber,next=tonumber,next local concat=table.concat local find,lower,upper=string.find,string.lower,string.upper local xml=xml @@ -15012,6 +15731,9 @@ local function xmltotext(root) return xmlserialize(root,xmltexthandler) or "" end end +function xml.serializetotext(root) + return root and xmlserialize(root,xmltexthandler) or "" +end local function text(collected) if collected then local e=collected[1] or collected @@ -15684,7 +16406,7 @@ do -- create closure to overcome 200 locals limit package.loaded["data-exp"] = package.loaded["data-exp"] or true --- original size: 17958, stripped down to: 10705 +-- original size: 18105, stripped down to: 11207 if not modules then modules={} end modules ['data-exp']={ version=1.001, @@ -15883,38 +16605,41 @@ local nofscans=0 local scancache={} local fullcache={} local nofsharedscans=0 +local addcasecraptoo=true local function scan(files,remap,spec,path,n,m,r,onlyone,tolerant) local full=path=="" and spec or (spec..path..'/') - local dirs={} + local dirlist={} local nofdirs=0 local pattern=tolerant and lessweird or weird + local filelist={} + local noffiles=0 for name in directory(full) do if not lpegmatch(pattern,name) then local mode=attributes(full..name,"mode") if mode=="file" then n=n+1 - local lower=lower(name) - local paths=files[lower] - if paths then - if onlyone then - else - if type(paths)=="string" then - files[lower]={ paths,path } - else - paths[#paths+1]=path - end - if name~=lower then - local rl=remap[lower] - if not rl then - remap[lower]=name - r=r+1 - elseif trace_globbing and rl~=name then - report_globbing("confusing filename, name: %a, lower: %a, already: %a",name,lower,rl) - end - end - end - else - files[lower]=path + noffiles=noffiles+1 + filelist[noffiles]=name + elseif mode=="directory" then + m=m+1 + nofdirs=nofdirs+1 + if path~="" then + dirlist[nofdirs]=path.."/"..name + else + dirlist[nofdirs]=name + end + end + end + end + if noffiles>0 then + sort(filelist) + for i=1,noffiles do + local name=filelist[i] + local lower=lower(name) + local paths=files[lower] + if paths then + if onlyone then + else if name~=lower then local rl=remap[lower] if not rl then @@ -15923,23 +16648,41 @@ local function scan(files,remap,spec,path,n,m,r,onlyone,tolerant) elseif trace_globbing and rl~=name then report_globbing("confusing filename, name: %a, lower: %a, already: %a",name,lower,rl) end + if addcasecraptoo then + local paths=files[name] + if not paths then + files[name]=path + elseif type(paths)=="string" then + files[name]={ paths,path } + else + paths[#paths+1]=path + end + end + end + if type(paths)=="string" then + files[lower]={ paths,path } + else + paths[#paths+1]=path end end - elseif mode=="directory" then - m=m+1 - nofdirs=nofdirs+1 - if path~="" then - dirs[nofdirs]=path.."/"..name - else - dirs[nofdirs]=name + else + files[lower]=path + if name~=lower then + local rl=remap[lower] + if not rl then + remap[lower]=name + r=r+1 + elseif trace_globbing and rl~=name then + report_globbing("confusing filename, name: %a, lower: %a, already: %a",name,lower,rl) + end end end end end if nofdirs>0 then - sort(dirs) + sort(dirlist) for i=1,nofdirs do - files,remap,n,m,r=scan(files,remap,spec,dirs[i],n,m,r,onlyonce,tolerant) + files,remap,n,m,r=scan(files,remap,spec,dirlist[i],n,m,r,onlyonce,tolerant) end end scancache[sub(full,1,-2)]=files @@ -16068,7 +16811,7 @@ do -- create closure to overcome 200 locals limit package.loaded["data-env"] = package.loaded["data-env"] or true --- original size: 9342, stripped down to: 6887 +-- original size: 9360, stripped down to: 6903 if not modules then modules={} end modules ['data-env']={ version=1.001, @@ -16078,6 +16821,7 @@ if not modules then modules={} end modules ['data-env']={ license="see context related readme files", } local lower,gsub=string.lower,string.gsub +local next=next local resolvers=resolvers local allocate=utilities.storage.allocate local setmetatableindex=table.setmetatableindex @@ -16352,7 +17096,7 @@ do -- create closure to overcome 200 locals limit package.loaded["data-tmp"] = package.loaded["data-tmp"] or true --- original size: 16088, stripped down to: 11435 +-- original size: 16116, stripped down to: 11459 if not modules then modules={} end modules ['data-tmp']={ version=1.100, @@ -16366,6 +17110,7 @@ local concat=table.concat local mkdirs,isdir,isfile=dir.mkdirs,lfs.isdir,lfs.isfile local addsuffix,is_writable,is_readable=file.addsuffix,file.is_writable,file.is_readable local formatters=string.formatters +local next,type=next,type local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end) local trace_cache=false trackers.register("resolvers.cache",function(v) trace_cache=v end) local report_caches=logs.reporter("resolvers","caches") @@ -16500,7 +17245,7 @@ function caches.usedpaths(separator) end end function caches.configfiles() - return concat(resolvers.instance.specification,";") + return concat(resolvers.configurationfiles(),";") end function caches.hashed(tree) tree=gsub(tree,"[\\/]+$","") @@ -16838,7 +17583,7 @@ do -- create closure to overcome 200 locals limit package.loaded["data-res"] = package.loaded["data-res"] or true --- original size: 67524, stripped down to: 46632 +-- original size: 68263, stripped down to: 47789 if not modules then modules={} end modules ['data-res']={ version=1.001, @@ -16912,8 +17657,7 @@ local usertypes=resolvers.usertypes local dangerous=resolvers.dangerous local suffixmap=resolvers.suffixmap resolvers.defaultsuffixes={ "tex" } -resolvers.instance=resolvers.instance or nil -local instance=resolvers.instance or nil +local instance=nil function resolvers.setenv(key,value,raw) if instance then instance.environment[key]=value @@ -16948,27 +17692,30 @@ local variableresolver=Cs((variable+P(1))^0) local function expandedvariable(var) return lpegmatch(variableexpander,var) or var end -function resolvers.newinstance() +function resolvers.reset() if trace_locating then report_resolving("creating instance") end - local environment,variables,expansions,order=allocate(),allocate(),allocate(),allocate() - local newinstance={ + local environment={} + local variables={} + local expansions={} + local order={} + instance={ environment=environment, variables=variables, expansions=expansions, order=order, - files=allocate(), - setups=allocate(), - found=allocate(), - foundintrees=allocate(), - hashes=allocate(), - hashed=allocate(), + files={}, + setups={}, + found={}, + foundintrees={}, + hashes={}, + hashed={}, pathlists=false, - specification=allocate(), - lists=allocate(), - data=allocate(), - fakepaths=allocate(), + specification={}, + lists={}, + data={}, + fakepaths={}, remember=true, diskcache=true, renewcache=false, @@ -17015,15 +17762,9 @@ function resolvers.newinstance() t[k]=v return v end) - return newinstance -end -function resolvers.setinstance(someinstance) - instance=someinstance - resolvers.instance=someinstance - return someinstance end -function resolvers.reset() - return resolvers.setinstance(resolvers.newinstance()) +function resolvers.initialized() + return instance~=nil end local function reset_hashes() instance.lists={} @@ -17192,8 +17933,12 @@ local function load_configuration_files() report_resolving("warning: no lua configuration files found") end end +function resolvers.configurationfiles() + return instance.specification or {} +end local function load_file_databases() - instance.loaderror,instance.files=false,allocate() + instance.loaderror=false + instance.files={} if not instance.renewcache then local hashes=instance.hashes for k=1,#hashes do @@ -17404,7 +18149,7 @@ function resolvers.stackpath() return currentpath~="" and currentpath or nil end local done={} -function resolvers.resetextrapath() +function resolvers.resetextrapaths() local ep=instance.extra_paths if not ep then done={} @@ -17414,6 +18159,9 @@ function resolvers.resetextrapath() reset_caches() end end +function resolvers.getextrapaths() + return instance.extra_paths or {} +end function resolvers.registerextrapath(paths,subpaths) if not subpaths or subpaths=="" then if not paths or path=="" then @@ -17573,9 +18321,8 @@ function resolvers.cleanedpathlist(v) end return t end -function resolvers.expandbraces(str) - local ori=str - local pth=expandedpathfromlist(resolvers.splitpath(ori)) +function resolvers.expandbraces(str) + local pth=expandedpathfromlist(resolvers.splitpath(str)) return joinpath(pth) end function resolvers.registerfilehash(name,content,someerror) @@ -17588,6 +18335,17 @@ function resolvers.registerfilehash(name,content,someerror) end end end +function resolvers.getfilehashes() + return instance and instance.files or {} +end +function resolvers.gethashes() + return instance and instance.hashes or {} +end +function resolvers.renewcache() + if instance then + instance.renewcache=true + end +end local function isreadable(name) local readable=isfile(name) if trace_detail then @@ -17602,7 +18360,7 @@ end local function collect_files(names) local filelist={} local noffiles=0 - local function check(hash,root,pathname,path,name) + local function check(hash,root,pathname,path,basename,name) if not pathname or find(path,pathname) then local variant=hash.type local search=filejoin(root,path,name) @@ -17641,10 +18399,10 @@ local function collect_files(names) local metadata=content.metadata local realroot=metadata and metadata.path or hashname if type(path)=="string" then - check(hash,realroot,pathname,path,name) + check(hash,realroot,pathname,path,basename,name) else for i=1,#path do - check(hash,realroot,pathname,path[i],name) + check(hash,realroot,pathname,path[i],basename,name) end end end @@ -17660,17 +18418,26 @@ function resolvers.registerintrees(filename,format,filetype,usedmethod,foundname local foundintrees=instance.foundintrees if usedmethod=="direct" and filename==foundname and fit[foundname] then else + local collapsed=collapsepath(foundname,true) local t={ filename=filename, - format=format~="" and format or nil, + format=format~="" and format or nil, filetype=filetype~="" and filetype or nil, usedmethod=usedmethod, foundname=foundname, + fullname=collapsed, } fit[foundname]=t foundintrees[#foundintrees+1]=t end end +function resolvers.foundintrees() + return instance.foundintrees or {} +end +function resolvers.foundintree(fullname) + local f=fit[fullname] + return f and f.usedmethod=="database" +end local function can_be_dir(name) local fakepaths=instance.fakepaths if not fakepaths[name] then @@ -17685,10 +18452,12 @@ end local preparetreepattern=Cs((P(".")/"%%."+P("-")/"%%-"+P(1))^0*Cc("$")) local collect_instance_files local function find_analyze(filename,askedformat,allresults) - local filetype,wantedfiles,ext='',{},suffixonly(filename) + local filetype='' + local filesuffix=suffixonly(filename) + local wantedfiles={} wantedfiles[#wantedfiles+1]=filename if askedformat=="" then - if ext=="" or not suffixmap[ext] then + if filesuffix=="" or not suffixmap[filesuffix] then local defaultsuffixes=resolvers.defaultsuffixes local formatofsuffix=resolvers.formatofsuffix for i=1,#defaultsuffixes do @@ -17706,7 +18475,7 @@ local function find_analyze(filename,askedformat,allresults) end end else - if ext=="" or not suffixmap[ext] then + if filesuffix=="" or not suffixmap[filesuffix] then local format_suffixes=suffixes[askedformat] if format_suffixes then for i=1,#format_suffixes do @@ -17851,7 +18620,7 @@ end local function find_intree(filename,filetype,wantedfiles,allresults) local pathlists=instance.pathlists if not pathlists then - pathlists=setmetatableindex(allocate(),makepathlist) + pathlists=setmetatableindex({},makepathlist) instance.pathlists=pathlists end local pathlist=pathlists[filetype] @@ -18254,15 +19023,21 @@ function resolvers.findwildcardfile(filename) end function resolvers.automount() end -function resolvers.load(option) +function resolvers.starttiming() statistics.starttiming(instance) +end +function resolvers.stoptiming() + statistics.stoptiming(instance) +end +function resolvers.load(option) + resolvers.starttiming() identify_configuration_files() load_configuration_files() if option~="nofiles" then load_databases() resolvers.automount() end - statistics.stoptiming(instance) + resolvers.stoptiming() local files=instance.files return files and next(files) and true end @@ -18354,7 +19129,6 @@ function resolvers.booleanvariable(str,default) end end function resolvers.dowithfilesintree(pattern,handle,before,after) - local instance=resolvers.instance local hashes=instance.hashes for i=1,#hashes do local hash=hashes[i] @@ -18392,6 +19166,31 @@ local obsolete=resolvers.obsolete or {} resolvers.obsolete=obsolete resolvers.find_file=resolvers.findfile obsolete.find_file=resolvers.findfile resolvers.find_files=resolvers.findfiles obsolete.find_files=resolvers.findfiles +function resolvers.knownvariables(pattern) + if instance then + local environment=instance.environment + local variables=instance.variables + local expansions=instance.expansions + local order=instance.order + local pattern=upper(pattern or "") + local result={} + for i=1,#order do + for key in next,order[i] do + if result[key]==nil and key~="" and (pattern=="" or find(upper(key),pattern)) then + result[key]={ + environment=rawget(environment,key), + variable=key, + expansion=expansions[key], + resolved=resolveprefix(expansions[key]), + } + end + end + end + return result + else + return {} + end +end end -- of closure @@ -18802,7 +19601,7 @@ do -- create closure to overcome 200 locals limit package.loaded["data-use"] = package.loaded["data-use"] or true --- original size: 4045, stripped down to: 3110 +-- original size: 4272, stripped down to: 3289 if not modules then modules={} end modules ['data-use']={ version=1.001, @@ -18822,7 +19621,7 @@ function resolvers.automount(usecache) mountpaths=caches.getreadablepaths("mount") end if mountpaths and #mountpaths>0 then - statistics.starttiming(resolvers.instance) + resolvers.starttiming() for k=1,#mountpaths do local root=mountpaths[k] local f=io.open(root.."/url.tmi") @@ -18842,7 +19641,7 @@ function resolvers.automount(usecache) f:close() end end - statistics.stoptiming(resolvers.instance) + resolvers.stoptiming() end end statistics.register("used config file",function() return caches.configfiles() end) @@ -18856,6 +19655,7 @@ function statistics.savefmtstatus(texname,formatbanner,sourcefile,kind,banner) formatbanner=formatbanner, sourcehash=md5.hex(io.loaddata(resolvers.findfile(sourcefile)) or "unknown"), sourcefile=sourcefile, + luaversion=LUAVERSION, } io.savedata(luvname,table.serialize(luvdata,true)) lua.registerfinalizer(function() @@ -18880,6 +19680,10 @@ function statistics.checkfmtstatus(texname) if luvhash~=sourcehash then return format("source mismatch (luv: %s <> bin: %s)",luvhash,sourcehash) end + local luvluaversion=luv.luaversion or 0 + if luvluaversion~=LUAVERSION then + return format("lua mismatch (luv: %s <> bin: %s)",luvluaversion,LUAVERSION) + end else return "invalid status file" end @@ -18897,7 +19701,7 @@ do -- create closure to overcome 200 locals limit package.loaded["data-zip"] = package.loaded["data-zip"] or true --- original size: 8772, stripped down to: 6841 +-- original size: 8716, stripped down to: 6795 if not modules then modules={} end modules ['data-zip']={ version=1.001, @@ -19070,17 +19874,16 @@ function resolvers.usezipfile(archive) if archive and not registeredfiles[archive] then local z=zip.openarchive(archive) if z then - local instance=resolvers.instance local tree=url.query(specification.query).tree or "" if trace_locating then report_zip("registering: archive %a",archive) end - statistics.starttiming(instance) + resolvers.starttiming() resolvers.prependhash('zip',archive) resolvers.extendtexmfvariable(archive) registeredfiles[archive]=z - instance.files[archive]=resolvers.registerzipfile(z,tree) - statistics.stoptiming(instance) + resolvers.registerfilehash(archive,resolvers.registerzipfile(z,tree)) + resolvers.stoptiming() elseif trace_locating then report_zip("registering: unknown archive %a",archive) end @@ -19323,7 +20126,7 @@ do -- create closure to overcome 200 locals limit package.loaded["data-sch"] = package.loaded["data-sch"] or true --- original size: 6653, stripped down to: 5467 +-- original size: 6753, stripped down to: 5511 if not modules then modules={} end modules ['data-sch']={ version=1.001, @@ -19332,13 +20135,14 @@ if not modules then modules={} end modules ['data-sch']={ copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" } -local load=load +local load,tonumber=load,tonumber local gsub,concat,format=string.gsub,table.concat,string.format local finders,openers,loaders=resolvers.finders,resolvers.openers,resolvers.loaders local trace_schemes=false trackers.register("resolvers.schemes",function(v) trace_schemes=v end) local report_schemes=logs.reporter("resolvers","schemes") local http=require("socket.http") local ltn12=require("ltn12") +if mbox then mbox=nil end local resolvers=resolvers local schemes=resolvers.schemes or {} resolvers.schemes=schemes @@ -19378,7 +20182,7 @@ local runner=sandbox.registerrunner { name="curl resolver", method="execute", program="curl", - template="--silent -- insecure --create-dirs --output %cachename% %original%", + template="--silent --insecure --create-dirs --output %cachename% %original%", checkers={ cachename="cache", original="url", @@ -19624,7 +20428,7 @@ do -- create closure to overcome 200 locals limit package.loaded["data-aux"] = package.loaded["data-aux"] or true --- original size: 2431, stripped down to: 1996 +-- original size: 2438, stripped down to: 2003 if not modules then modules={} end modules ['data-aux']={ version=1.001, @@ -19660,7 +20464,7 @@ function resolvers.updatescript(oldname,newname) if trace_locating then report_scripts("old and new script are the same") end - elseif not find(newscript,scriptpath) then + elseif not find(newscript,scriptpath,1,true) then if trace_locating then report_scripts("new script should come from %a",scriptpath) end @@ -19747,7 +20551,7 @@ do -- create closure to overcome 200 locals limit package.loaded["data-lst"] = package.loaded["data-lst"] or true --- original size: 2734, stripped down to: 2354 +-- original size: 1823, stripped down to: 1591 if not modules then modules={} end modules ['data-lst']={ version=1.001, @@ -19756,14 +20560,14 @@ if not modules then modules={} end modules ['data-lst']={ copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" } -local rawget,type,next=rawget,type,next -local find,concat,upper=string.find,table.concat,string.upper -local fastcopy,sortedpairs=table.fastcopy,table.sortedpairs +local type=type +local concat,sortedhash=table.concat,table.sortedhash local resolvers=resolvers local listers=resolvers.listers or {} resolvers.listers=listers local resolveprefix=resolvers.resolve local report_lists=logs.reporter("resolvers","lists") +local report_resolved=logs.reporter("system","resolved") local function tabstr(str) if type(str)=='table' then return concat(str," | ") @@ -19772,39 +20576,17 @@ local function tabstr(str) end end function listers.variables(pattern) - local instance=resolvers.instance - local environment=instance.environment - local variables=instance.variables - local expansions=instance.expansions - local pattern=upper(pattern or "") - local configured={} - local order=instance.order - for i=1,#order do - for k,v in next,order[i] do - if v~=nil and configured[k]==nil then - configured[k]=v - end - end - end - local env=fastcopy(environment) - local var=fastcopy(variables) - local exp=fastcopy(expansions) - for key,value in sortedpairs(configured) do - if key~="" and (pattern=="" or find(upper(key),pattern)) then - report_lists(key) - report_lists(" env: %s",tabstr(rawget(environment,key)) or "unset") - report_lists(" var: %s",tabstr(configured[key]) or "unset") - report_lists(" exp: %s",tabstr(expansions[key]) or "unset") - report_lists(" res: %s",tabstr(resolveprefix(expansions[key])) or "unset") - end - end - instance.environment=fastcopy(env) - instance.variables=fastcopy(var) - instance.expansions=fastcopy(exp) + local result=resolvers.knownvariables(pattern) + for key,value in sortedhash(result) do + report_lists(key) + report_lists(" env: %s",tabstr(value.environment or "unset")) + report_lists(" var: %s",tabstr(value.variable or "unset")) + report_lists(" exp: %s",tabstr(value.expansion or "unset")) + report_lists(" res: %s",tabstr(value.resolved or "unset")) + end end -local report_resolved=logs.reporter("system","resolved") function listers.configurations() - local configurations=resolvers.instance.specification + local configurations=resolvers.configurationfiles() for i=1,#configurations do report_resolved("file : %s",resolveprefix(configurations[i])) end @@ -19827,7 +20609,7 @@ do -- create closure to overcome 200 locals limit package.loaded["util-lib"] = package.loaded["util-lib"] or true --- original size: 13595, stripped down to: 7500 +-- original size: 14943, stripped down to: 8305 if not modules then modules={} end modules ['util-lib']={ version=1.001, @@ -19846,6 +20628,7 @@ local pathpart=file.pathpart local nameonly=file.nameonly local joinfile=file.join local removesuffix=file.removesuffix +local addsuffix=file.addsuffix local findfile=resolvers.findfile local findfiles=resolvers.findfiles local expandpaths=resolvers.expandedpathlistfromvariable @@ -19865,13 +20648,20 @@ local function locate(required,version,trace,report,action) local required_path=pathpart(required_full) local required_base=nameonly(required_full) if qualifiedpath(required) then - if isfile(required) then + if isfile(addsuffix(required,os.libsuffix)) then + if trace then + report("qualified name %a found",required) + end found_library=required + else + if trace then + report("qualified name %a not found",required) + end end else local required_name=required_base.."."..os.libsuffix local version=type(version)=="string" and version~="" and version or false - local engine=environment.ownmain or false + local engine="luatex" if trace and not done then local list=expandpaths("lib") for i=1,#list do @@ -19930,9 +20720,11 @@ local function locate(required,version,trace,report,action) end package.extralibpath(environment.ownpath) local paths=package.libpaths() + local pattern="/[^/]+%."..os.libsuffix.."$" for i=1,#paths do - local found=check(lfs.isfile) - if found and (not checkpattern or find(found,checkpattern)) then + required_path=gsub(paths[i],pattern,"") + local found=check(lfs.isfound) + if type(found)=="string" and (not checkpattern or find(found,checkpattern)) then return found end end @@ -19962,18 +20754,20 @@ local function locate(required,version,trace,report,action) if trace then report("found: %a",found_library) end - local message,result=action(found_library,required_base) + local result,message=action(found_library,required_base) if result then library=result else library=false - report("load error: message %a, library %a",tostring(message),found_library or "no library") + report("load error: message %a, library %a",tostring(message or "unknown"),found_library or "no library") end end - if not library then - report("unknown: %a",required) - elseif trace then - report("stored: %a",required) + if trace then + if not library then + report("unknown library: %a",required) + else + report("stored library: %a",required) + end end return library end @@ -20000,13 +20794,12 @@ do local libtype=type(library) if libtype=="function" then library=library() - message=true else report_swiglib("load error: %a returns %a, message %a, library %a",opener,libtype,(string.gsub(message or "no message","[%s]+$","")),found_library or "no library") library=false end popdir() - return message,library + return library end) loadedlibs[required]=library or false end @@ -20050,29 +20843,48 @@ if FFISUPPORTED and ffi and ffi.load then local trace_ffilib=false local savedffiload=ffi.load trackers.register("resolvers.ffilib",function(v) trace_ffilib=v end) + local loaded={} local function locateindeed(name) - local message,library=pcall(savedffiload,removesuffix(name)) - if type(library)=="userdata" then - return library - else - return false + name=removesuffix(name) + local l=loaded[name] + if l==nil then + local message,library=pcall(savedffiload,name) + if type(message)=="userdata" then + l=message + elseif type(library)=="userdata" then + l=library + else + l=false + end + loaded[name]=l + elseif trace_ffilib then + report_ffilib("reusing already loaded %a",name) end + return l end - function ffilib(required,version) - if version=="system" then + function ffilib(name,version) + name=removesuffix(name) + local l=loaded[name] + if l~=nil then + if trace_ffilib then + report_ffilib("reusing already loaded %a",name) + end + return l + elseif version=="system" then return locateindeed(name) else - return locate(required,version,trace_ffilib,report_ffilib,locateindeed) + return locate(name,version,trace_ffilib,report_ffilib,locateindeed) end end function ffi.load(name) local library=ffilib(name) if type(library)=="userdata" then return library - else + end + if trace_ffilib then report_ffilib("trying to load %a using normal loader",name) - return savedffiload(name) end + return savedffiload(name) end end @@ -20186,7 +20998,7 @@ do -- create closure to overcome 200 locals limit package.loaded["luat-fmt"] = package.loaded["luat-fmt"] or true --- original size: 9144, stripped down to: 7291 +-- original size: 9268, stripped down to: 7401 if not modules then modules={} end modules ['luat-fmt']={ version=1.001, @@ -20225,6 +21037,9 @@ local function secondaryflags() if arguments.silent then flags[#flags+1]="--c:silent" end + if arguments.errors then + flags[#flags+1]="--c:errors" + end if arguments.jit then flags[#flags+1]="--c:jiton" end @@ -20261,6 +21076,7 @@ local runners={ function environment.make_format(name,arguments) local engine=environment.ownmain or "luatex" local silent=environment.arguments.silent + local errors=environment.arguments.errors local olddir=dir.current() local path=caches.getwritablepath("formats",engine) or "" if path~="" then @@ -20416,10 +21232,10 @@ end end -- of closure --- used libraries : l-lua.lua l-sandbox.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-fil.lua util-sac.lua util-sto.lua util-prs.lua util-fmt.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-tpl.lua util-sbx.lua util-mrg.lua util-env.lua luat-env.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.lua data-ini.lua data-exp.lua data-env.lua data-tmp.lua data-met.lua data-res.lua data-pre.lua data-inp.lua data-out.lua data-fil.lua data-con.lua data-use.lua data-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua util-lib.lua luat-sta.lua luat-fmt.lua +-- used libraries : l-lua.lua l-macro.lua l-sandbox.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-fil.lua util-sac.lua util-sto.lua util-prs.lua util-fmt.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-tpl.lua util-sbx.lua util-mrg.lua util-env.lua luat-env.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.lua data-ini.lua data-exp.lua data-env.lua data-tmp.lua data-met.lua data-res.lua data-pre.lua data-inp.lua data-out.lua data-fil.lua data-con.lua data-use.lua data-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua util-lib.lua luat-sta.lua luat-fmt.lua -- skipped libraries : - --- original bytes : 842443 --- stripped bytes : 306317 +-- original bytes : 874849 +-- stripped bytes : 317531 -- end library merge @@ -20443,6 +21259,7 @@ local owntree = environment and environment.ownpath or ownpath local ownlibs = { -- order can be made better 'l-lua.lua', + 'l-macro.lua', 'l-sandbox.lua', 'l-package.lua', 'l-lpeg.lua', @@ -20607,30 +21424,37 @@ local e_verbose = false -- some common flags (also passed through environment) local e_silent = environment.argument("silent") +local e_errors = environment.argument("errors") local e_noconsole = environment.argument("noconsole") local e_trackers = environment.argument("trackers") local e_directives = environment.argument("directives") local e_experiments = environment.argument("experiments") -if e_silent == true then - e_silent = "*" +local t = { } + +if type(e_directives) == "string" then + t[#t+1] = e_directives end if type(e_silent) == "string" then - if type(e_directives) == "string" then - e_directives = format("%s,logs.blocked={%s}",e_directives,e_silent) - else - e_directives = format("logs.blocked={%s}",e_silent) - end + t[#t+1] = format("logs.blocked={%s}",e_silent) +elseif e_silent == true then + t[#t+1] = "logs.blocked" +end + +if type(e_errors) == "string" then + t[#t+1] = format("logs.errors={%s}",e_errors) +elseif e_errors == true then + t[#t+1] = "logs.errors" end if e_noconsole then - if type(e_directives) == "string" then - e_directives = format("%s,logs.target=file",e_directives) - else - e_directives = format("logs.target=file") - end + t[#t+1] = format("logs.target=file") +end + +if #t > 0 then + e_directives = concat(t,",") end if e_trackers then trackers .enable(e_trackers) end @@ -20643,7 +21467,7 @@ if not environment.experiments then environment.experiments = e_experiments end -- -local instance = resolvers.reset() +resolvers.reset() local helpinfo = [[ <?xml version="1.0" ?> @@ -20651,7 +21475,7 @@ local helpinfo = [[ <metadata> <entry name="name">mtxrun</entry> <entry name="detail">ConTeXt TDS Runner Tool</entry> - <entry name="version">1.32</entry> + <entry name="version">1.33</entry> </metadata> <flags> <category name="basic"> @@ -21199,7 +22023,7 @@ function runners.execute_ctx_script(filename,...) end -- retry after generate but only if --autogenerate if fullname == "" and environment.argument("autogenerate") then -- might become the default - instance.renewcache = true + resolvers.renewcache() trackers.enable("resolvers.locating") resolvers.load() -- @@ -21224,7 +22048,7 @@ function runners.execute_ctx_script(filename,...) end filename = environment.files[1] if e_verbose then - report("using script: %s\n",fullname) + report("using script: %s (if --path is used don't run on path where mtxrun lives)\n",fullname) end environment.ownscript = fullname dofile(fullname) @@ -21378,8 +22202,6 @@ local before, after = environment.splitarguments(filename) environment.arguments_before, environment.arguments_after = before, after environment.initializearguments(before) -instance.lsrmode = environment.argument("lsr") or false - e_verbose = environment.arguments["verbose"] -- delayed till here (we need the ones before script) if e_verbose then @@ -21466,7 +22288,7 @@ else function runners.loadbase(...) if not resolvers.load(...) then report("forcing cache reload") - instance.renewcache = true + resolvers.renewcache() trackers.enable("resolvers.locating") if not resolvers.load(...) then report("the resolver databases are not present or outdated") @@ -21480,6 +22302,42 @@ end -- joke .. reminds me of messing with gigi terminals +do + + local a_locale = e_argument("locale") + + if a_locale then + + -- I really hate this crap but am too tired of discussing it over and over + -- again so for the sake of usiage outside context we will provide ways to + -- use locales in an otherwise supposed to be locale agnostic system. And + -- forget about support in case of interferences. + + report() + report(what == "force" and "forcing locale:" or "original locale:") + report() + report(" collate : %s",status.lc_collate or "<unset>") + report(" ctype : %s",status.lc_ctype or "<unset>") + report(" monetary : %s",status.lc_monetary or "<unset>") + report(" numeric : %s",status.lc_numeric or "<unset>") + report(" time : %s",status.lc_time or "<unset>") + report() + + end + + if a_locale == "force" then + os.setlocale(status.lc_collate ,"collate") + os.setlocale(status.lc_ctype ,"ctype") + os.setlocale(status.lc_monetary,"monetary") + os.setlocale(status.lc_numeric ,"numeric") + os.setlocale(status.lc_time ,"time") + else + function os.setlocale() + end + end + +end + if e_argument("ansi") then logs.setformatters("ansi") @@ -21673,7 +22531,7 @@ elseif e_argument("find-path") then -- luatools: runners.execute_ctx_script("mtx-base","--find-path",filename) resolvers.load() - local path = resolvers.findpath(filename, instance.my_format) + local path = resolvers.findpath(filename) if e_verbose then report(path) else @@ -21754,7 +22612,7 @@ elseif e_argument("generate") then trackers.enable("resolvers.locating") resolvers.renew(filename) else - instance.renewcache = true + resolvers.renewcache() trackers.enable("resolvers.locating") resolvers.load() end @@ -21814,6 +22672,10 @@ elseif e_argument("systeminfo") then runners.systeminfo() +elseif e_argument("locale") then + + -- already done + elseif e_argument("help") or filename=='help' or filename == "" then application.help() diff --git a/scripts/context/stubs/setup/setuptex b/scripts/context/stubs/setup/setuptex index d41e36707..78128ee8b 100644 --- a/scripts/context/stubs/setup/setuptex +++ b/scripts/context/stubs/setup/setuptex @@ -22,53 +22,59 @@ system=`uname -s` cpu=`uname -m` case "$system" in - # linux - Linux) - case "$cpu" in - i*86) platform="linux" ;; - x86_64|ia64) platform="linux-64" ;; - # a little bit of cheating with ppc64 (won't work on Gentoo) - ppc|ppc64) platform="linux-ppc" ;; - *) platform="unknown" ;; - esac ;; - # Mac OS X - Darwin) - case "$cpu" in - i*86) platform="osx-intel" ;; - x86_64) platform="osx-64" ;; - ppc*|powerpc|power*|Power*) platform="osx-ppc" ;; - *) platform="unknown" ;; - esac ;; - # FreeBSD - FreeBSD|freebsd) - case "$cpu" in - i*86) platform="freebsd" ;; - x86_64) platform="freebsd" ;; - amd64) platform="freebsd-amd64" ;; - *) platform="unknown" ;; - esac ;; - # kFreeBSD (Debian) - GNU/kFreeBSD) - case "$cpu" in - i*86) platform="kfreebsd-i386" ;; - x86_64|amd64) platform="kfreebsd-amd64" ;; - *) platform="unknown" ;; - esac ;; - # cygwin - CYGWIN) - case "$cpu" in - i*86) platform="cygwin" ;; - x86_64|ia64) platform="cygwin-64" ;; - *) platform="unknown" ;; - esac ;; - # SunOS/Solaris - SunOS) - case "$cpu" in - sparc) platform="solaris-sparc" ;; - i86pc) platform="solaris-intel" ;; - *) platform="unknown" ;; - esac ;; - *) platform="unknown" + # linux + Linux) + case "$cpu" in + i*86) platform="linux" ;; + x86_64|ia64) platform="linux-64" ;; + # a little bit of cheating with ppc64 (won't work on Gentoo) + ppc|ppc64) platform="linux-ppc" ;; + *) platform="unknown" ;; + esac ;; + # Mac OS X + Darwin) + case "$cpu" in + i*86) platform="osx-intel" ;; + x86_64) platform="osx-64" ;; + ppc*|powerpc|power*|Power*) platform="osx-ppc" ;; + *) platform="unknown" ;; + esac ;; + # FreeBSD + FreeBSD|freebsd) + case "$cpu" in + i*86) platform="freebsd" ;; + x86_64) platform="freebsd" ;; + amd64) platform="freebsd-amd64" ;; + *) platform="unknown" ;; + esac ;; + # kFreeBSD (Debian) + GNU/kFreeBSD) + case "$cpu" in + i*86) platform="kfreebsd-i386" ;; + x86_64|amd64) platform="kfreebsd-amd64" ;; + *) platform="unknown" ;; + esac ;; + # MSYS2|MSYS_NT-10.0) + case "$cpu" in + i*86) platform="win32" ;; + x86_64) platform="win64" ;; + *) platform="unknown" ;; + esac ;; + # cygwin + CYGWIN) + case "$cpu" in + i*86) platform="cygwin" ;; + x86_64|ia64) platform="cygwin-64" ;; + *) platform="unknown" ;; + esac ;; + # SunOS/Solaris + SunOS) + case "$cpu" in + sparc) platform="solaris-sparc" ;; + i86pc) platform="solaris-intel" ;; + *) platform="unknown" ;; + esac ;; + *) platform="unknown" esac # temporary fix for Snow Leopard diff --git a/scripts/context/stubs/unix/mtxrun b/scripts/context/stubs/unix/mtxrun index 873770cac..3374a364a 100644 --- a/scripts/context/stubs/unix/mtxrun +++ b/scripts/context/stubs/unix/mtxrun @@ -56,7 +56,7 @@ do -- create closure to overcome 200 locals limit package.loaded["l-lua"] = package.loaded["l-lua"] or true --- original size: 5125, stripped down to: 2881 +-- original size: 6230, stripped down to: 3662 if not modules then modules={} end modules ['l-lua']={ version=1.001, @@ -65,14 +65,16 @@ if not modules then modules={} end modules ['l-lua']={ copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" } -_MAJORVERSION,_MINORVERSION=string.match(_VERSION,"^[^%d]+(%d+)%.(%d+).*$") -_MAJORVERSION=tonumber(_MAJORVERSION) or 5 -_MINORVERSION=tonumber(_MINORVERSION) or 1 -_LUAVERSION=_MAJORVERSION+_MINORVERSION/10 -if _LUAVERSION<5.2 and jit then - _MINORVERSION=2 - _LUAVERSION=5.2 -end +local next,type,tonumber=next,type,tonumber +LUAMAJORVERSION,LUAMINORVERSION=string.match(_VERSION,"^[^%d]+(%d+)%.(%d+).*$") +LUAMAJORVERSION=tonumber(LUAMAJORVERSION) or 5 +LUAMINORVERSION=tonumber(LUAMINORVERSION) or 1 +LUAVERSION=LUAMAJORVERSION+LUAMINORVERSION/10 +if LUAVERSION<5.2 and jit then + MINORVERSION=2 + LUAVERSION=5.2 +end +_LUAVERSION=LUAVERSION if not lpeg then lpeg=require("lpeg") end @@ -172,6 +174,166 @@ if not FFISUPPORTED then elseif not ffi.number then ffi.number=tonumber end +if not bit32 then + bit32=require("l-bit32") +end +local loaded=package.loaded +if not loaded["socket"] then loaded["socket"]=loaded["socket.core"] end +if not loaded["mime"] then loaded["mime"]=loaded["mime.core"] end +if not socket.mime then socket.mime=package.loaded["mime"] end +if not loaded["socket.mime"] then loaded["socket.mime"]=socket.mime end +if not loaded["socket.http"] then loaded["socket.http"]=socket.http end +if not loaded["socket.ftp"] then loaded["socket.ftp"]=socket.ftp end +if not loaded["socket.smtp"] then loaded["socket.smtp"]=socket.smtp end +if not loaded["socket.tp"] then loaded["socket.tp"]=socket.tp end +if not loaded["socket.url"] then loaded["socket.url"]=socket.url end + + +end -- of closure + +do -- create closure to overcome 200 locals limit + +package.loaded["l-macro"] = package.loaded["l-macro"] or true + +-- original size: 6393, stripped down to: 3659 + +if not modules then modules={} end modules ['l-macros']={ + version=1.001, + comment="companion to luat-lib.mkiv", + author="Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright="PRAGMA ADE / ConTeXt Development Team", + license="see context related readme files" +} +local S,P,R,V,C,Cs,Cc,Ct,Carg=lpeg.S,lpeg.P,lpeg.R,lpeg.V,lpeg.C,lpeg.Cs,lpeg.Cc,lpeg.Ct,lpeg.Carg +local lpegmatch=lpeg.match +local concat=table.concat +local next=next +local newline=S("\n\r")^1 +local continue=P("\\")*newline +local spaces=S(" \t")+continue +local name=R("az","AZ","__","09")^1 +local body=((1+continue/"")-newline)^1 +local lparent=P("(") +local rparent=P(")") +local noparent=1-(lparent+rparent) +local nested=P { lparent*(noparent+V(1))^0*rparent } +local escaped=P("\\")*P(1) +local squote=P("'") +local dquote=P('"') +local quoted=dquote*(escaped+(1-dquote))^0*dquote+squote*(escaped+(1-squote))^0*squote +local arguments=lparent*Ct((Cs((nested+(quoted+1-S("),")))^1)+S(", "))^0)*rparent +local macros=lua.macros or {} +lua.macros=macros +local patterns={} +local definitions={} +local resolve +local subparser +resolve=C(C(name)*arguments^-1)/function(raw,s,a) + local d=definitions[s] + if d then + if a then + local n=#a + local p=patterns[s][n] + if p then + local d=d[n] + for i=1,n do + a[i]=lpegmatch(subparser,a[i]) or a[i] + end + return lpegmatch(p,d,1,a) or d + else + return raw + end + else + return d[0] or raw + end + elseif a then + for i=1,#a do + a[i]=lpegmatch(subparser,a[i]) or a[i] + end + return s.."("..concat(a,",")..")" + else + return raw + end +end +subparser=Cs((resolve+P(1))^1) +local enddefine=P("#enddefine")/"" +local beginregister=(C(name)*spaces^0*(arguments+Cc(false))*C((1-enddefine)^1)*enddefine)/function(k,a,v) + local n=0 + if a then + n=#a + local pattern=P(false) + for i=1,n do + pattern=pattern+(P(a[i])*Carg(1))/function(t) return t[i] end + end + pattern=Cs((pattern+P(1))^1) + local p=patterns[k] + if not p then + p={ [0]=false,false,false,false,false,false,false,false,false } + patterns[k]=p + end + p[n]=pattern + end + local d=definitions[k] + if not d then + d={ [0]=false,false,false,false,false,false,false,false,false } + definitions[k]=d + end + d[n]=lpegmatch(subparser,v) or v + return "" +end +local register=(C(name)*spaces^0*(arguments+Cc(false))*spaces^0*C(body))/function(k,a,v) + local n=0 + if a then + n=#a + local pattern=P(false) + for i=1,n do + pattern=pattern+(P(a[i])*Carg(1))/function(t) return t[i] end + end + pattern=Cs((pattern+P(1))^1) + local p=patterns[k] + if not p then + p={ [0]=false,false,false,false,false,false,false,false,false } + patterns[k]=p + end + p[n]=pattern + end + local d=definitions[k] + if not d then + d={ [0]=false,false,false,false,false,false,false,false,false } + definitions[k]=d + end + d[n]=lpegmatch(subparser,v) or v + return "" +end +local unregister=(C(name)*spaces^0*(arguments+Cc(false)))/function(k,a) + local n=0 + if a then + n=#a + local p=patterns[k] + if p then + p[n]=false + end + end + local d=definitions[k] + if d then + d[n]=false + end + return "" +end +local begindefine=(P("begindefine")*spaces^0/"")*beginregister +local define=(P("define" )*spaces^0/"")*register +local undefine=(P("undefine" )*spaces^0/"")*unregister +local parser=Cs((((P("#")/"")*(define+begindefine+undefine)*(newline^0/"") )+resolve+P(1) )^0 ) +function macros.reset() + definitions={} + patterns={} +end +function macros.resolvestring(str) + return lpegmatch(parser,str) or str +end +function macros.resolving() + return next(patterns) +end end -- of closure @@ -180,7 +342,7 @@ do -- create closure to overcome 200 locals limit package.loaded["l-sandbox"] = package.loaded["l-sandbox"] or true --- original size: 9667, stripped down to: 6678 +-- original size: 9678, stripped down to: 6688 if not modules then modules={} end modules ['l-sandbox']={ version=1.001, @@ -193,7 +355,7 @@ local global=_G local next=next local unpack=unpack or table.unpack local type=type -local tprint=texio.write_nl or print +local tprint=texio and texio.write_nl or print local tostring=tostring local format=string.format local concat=table.concat @@ -447,7 +609,7 @@ do -- create closure to overcome 200 locals limit package.loaded["l-package"] = package.loaded["l-package"] or true --- original size: 10587, stripped down to: 7815 +-- original size: 11564, stripped down to: 8625 if not modules then modules={} end modules ['l-package']={ version=1.001, @@ -461,6 +623,7 @@ local gsub,format,find=string.gsub,string.format,string.find local P,S,Cs,lpegmatch=lpeg.P,lpeg.S,lpeg.Cs,lpeg.match local package=package local searchers=package.searchers or package.loaders +local insert,remove=table.insert,table.remove local filejoin=file and file.join or function(path,name) return path.."/"..name end local isreadable=file and file.is_readable or function(name) local f=io.open(name) if f then f:close() return true end end local addsuffix=file and file.addsuffix or function(name,suffix) return name.."."..suffix end @@ -594,15 +757,43 @@ local function registerpath(tag,what,target,...) add(path) end end - return paths +end +local function pushpath(tag,what,target,path) + local path=helpers.cleanpath(path) + insert(target,1,path) + if helpers.trace then + helpers.report("pushing %s path in front: %s",tag,path) + end +end +local function poppath(tag,what,target) + local path=remove(target,1) + if helpers.trace then + if path then + helpers.report("popping %s path from front: %s",tag,path) + else + helpers.report("no %s path to pop",tag) + end + end end helpers.registerpath=registerpath function package.extraluapath(...) registerpath("extra lua","lua",extraluapaths,...) end +function package.pushluapath(path) + pushpath("extra lua","lua",extraluapaths,path) +end +function package.popluapath() + poppath("extra lua","lua",extraluapaths) +end function package.extralibpath(...) registerpath("extra lib","lib",extralibpaths,...) end +function package.pushlibpath(path) + pushpath("extra lib","lib",extralibpaths,path) +end +function package.poplibpath() + poppath("extra lib","lua",extralibpaths) +end local function loadedaslib(resolved,rawname) local base=gsub(rawname,"%.","_") local init="luaopen_"..gsub(base,"%.","_") @@ -737,7 +928,7 @@ do -- create closure to overcome 200 locals limit package.loaded["l-lpeg"] = package.loaded["l-lpeg"] or true --- original size: 37748, stripped down to: 20111 +-- original size: 38582, stripped down to: 20518 if not modules then modules={} end modules ['l-lpeg']={ version=1.001, @@ -746,7 +937,8 @@ if not modules then modules={} end modules ['l-lpeg']={ copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" } -lpeg=require("lpeg") +lpeg=require("lpeg") +local lpeg=lpeg if not lpeg.print then function lpeg.print(...) print(lpeg.pcode(...)) end end local type,next,tostring=type,next,tostring local byte,char,gmatch,format=string.byte,string.char,string.gmatch,string.format @@ -768,11 +960,14 @@ patterns.alwaysmatched=alwaysmatched local sign=S('+-') local zero=P('0') local digit=R('09') +local digits=digit^1 local octdigit=R("07") +local octdigits=octdigit^1 local lowercase=R("az") local uppercase=R("AZ") local underscore=P("_") local hexdigit=digit+lowercase+uppercase +local hexdigits=hexdigit^1 local cr,lf,crlf=P("\r"),P("\n"),P("\r\n") local newline=P("\r")*(P("\n")+P(true))+P("\n") local escaped=P("\\")*anything @@ -874,27 +1069,30 @@ patterns.singlequoted=squote*patterns.nosquote*squote patterns.doublequoted=dquote*patterns.nodquote*dquote patterns.quoted=patterns.doublequoted+patterns.singlequoted patterns.digit=digit +patterns.digits=digits patterns.octdigit=octdigit +patterns.octdigits=octdigits patterns.hexdigit=hexdigit +patterns.hexdigits=hexdigits patterns.sign=sign -patterns.cardinal=digit^1 -patterns.integer=sign^-1*digit^1 -patterns.unsigned=digit^0*period*digit^1 +patterns.cardinal=digits +patterns.integer=sign^-1*digits +patterns.unsigned=digit^0*period*digits patterns.float=sign^-1*patterns.unsigned -patterns.cunsigned=digit^0*comma*digit^1 -patterns.cpunsigned=digit^0*(period+comma)*digit^1 +patterns.cunsigned=digit^0*comma*digits +patterns.cpunsigned=digit^0*(period+comma)*digits patterns.cfloat=sign^-1*patterns.cunsigned patterns.cpfloat=sign^-1*patterns.cpunsigned patterns.number=patterns.float+patterns.integer patterns.cnumber=patterns.cfloat+patterns.integer patterns.cpnumber=patterns.cpfloat+patterns.integer -patterns.oct=zero*octdigit^1 +patterns.oct=zero*octdigits patterns.octal=patterns.oct patterns.HEX=zero*P("X")*(digit+uppercase)^1 patterns.hex=zero*P("x")*(digit+lowercase)^1 -patterns.hexadecimal=zero*S("xX")*hexdigit^1 -patterns.hexafloat=sign^-1*zero*S("xX")*(hexdigit^0*period*hexdigit^1+hexdigit^1*period*hexdigit^0+hexdigit^1)*(S("pP")*sign^-1*hexdigit^1)^-1 -patterns.decafloat=sign^-1*(digit^0*period*digit^1+digit^1*period*digit^0+digit^1)*S("eE")*sign^-1*digit^1 +patterns.hexadecimal=zero*S("xX")*hexdigits +patterns.hexafloat=sign^-1*zero*S("xX")*(hexdigit^0*period*hexdigits+hexdigits*period*hexdigit^0+hexdigits)*(S("pP")*sign^-1*hexdigits)^-1 +patterns.decafloat=sign^-1*(digit^0*period*digits+digits*period*digit^0+digits)*S("eE")*sign^-1*digits patterns.propername=(uppercase+lowercase+underscore)*(uppercase+lowercase+underscore+digit)^0*endofstring patterns.somecontent=(anything-newline-space)^1 patterns.beginline=#(1-newline) @@ -1141,11 +1339,13 @@ function lpeg.balancer(left,right) left,right=P(left),P(right) return P { left*((1-left-right)+V(1))^0*right } end -local nany=utf8char/"" -function lpeg.counter(pattern) - pattern=Cs((P(pattern)/" "+nany)^0) - return function(str) - return #lpegmatch(pattern,str) +function lpeg.counter(pattern,action) + local n=0 + local pattern=(P(pattern)/function() n=n+1 end+anything)^0 + if action then + return function(str) n=0;lpegmatch(pattern,str);action(n) end + else + return function(str) n=0;lpegmatch(pattern,str);return n end end end utf=utf or (unicode and unicode.utf8) or {} @@ -1306,7 +1506,13 @@ function lpeg.append(list,pp,delayed,checked) end local p_false=P(false) local p_true=P(true) -local function make(t,rest) +local lower=utf and utf.lower or string.lower +local upper=utf and utf.upper or string.upper +function lpeg.setutfcasers(l,u) + lower=l or lower + upper=u or upper +end +local function make1(t,rest) local p=p_false local keys=sortedkeys(t) for i=1,#keys do @@ -1317,7 +1523,7 @@ local function make(t,rest) p=p+P(k)*p_true elseif v==false then else - p=p+P(k)*make(v,v[""]) + p=p+P(k)*make1(v,v[""]) end end end @@ -1326,32 +1532,27 @@ local function make(t,rest) end return p end -local function collapse(t,x) - if type(t)~="table" then - return t,x - else - local n=next(t) - if n==nil then - return t,x - elseif next(t,n)==nil then - local k=n +local function make2(t,rest) + local p=p_false + local keys=sortedkeys(t) + for i=1,#keys do + local k=keys[i] + if k~="" then local v=t[k] - if type(v)=="table" then - return collapse(v,x..k) + if v==true then + p=p+(P(lower(k))+P(upper(k)))*p_true + elseif v==false then else - return v,x..k + p=p+(P(lower(k))+P(upper(k)))*make2(v,v[""]) end - else - local tt={} - for k,v in next,t do - local vv,kk=collapse(v,k) - tt[kk]=vv - end - return tt,x end end + if rest then + p=p+p_true + end + return p end -function lpeg.utfchartabletopattern(list) +function lpeg.utfchartabletopattern(list,insensitive) local tree={} local n=#list if n==0 then @@ -1422,7 +1623,7 @@ function lpeg.utfchartabletopattern(list) end end end - return make(tree) + return (insensitive and make2 or make1)(tree) end patterns.containseol=lpeg.finder(eol) local function nextstep(n,step,result) @@ -1456,7 +1657,7 @@ end local trailingzeros=zero^0*-digit local case_1=period*trailingzeros/"" local case_2=period*(digit-trailingzeros)^1*(trailingzeros/"") -local number=digit^1*(case_1+case_2) +local number=digits*(case_1+case_2) local stripper=Cs((number+1)^0) lpeg.patterns.stripzeros=stripper local byte_to_HEX={} @@ -1545,7 +1746,7 @@ do -- create closure to overcome 200 locals limit package.loaded["l-string"] = package.loaded["l-string"] or true --- original size: 6419, stripped down to: 3339 +-- original size: 6461, stripped down to: 3341 if not modules then modules={} end modules ['l-string']={ version=1.001, @@ -1647,9 +1848,9 @@ function string.tformat(fmt,...) end string.quote=string.quoted string.unquote=string.unquoted -if not string.bytetable then +if not string.bytetable then local limit=5000 - function string.bytetable(str) + function string.bytetable(str) local n=#str if n>limit then local t={ byte(str,1,limit) } @@ -1670,7 +1871,7 @@ do -- create closure to overcome 200 locals limit package.loaded["l-table"] = package.loaded["l-table"] or true --- original size: 39608, stripped down to: 23165 +-- original size: 40161, stripped down to: 23559 if not modules then modules={} end modules ['l-table']={ version=1.001, @@ -1679,7 +1880,7 @@ if not modules then modules={} end modules ['l-table']={ copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" } -local type,next,tostring,tonumber,ipairs,select=type,next,tostring,tonumber,ipairs,select +local type,next,tostring,tonumber,select=type,next,tostring,tonumber,select local table,string=table,string local concat,sort,insert,remove=table.concat,table.sort,table.insert,table.remove local format,lower,dump=string.format,string.lower,string.dump @@ -1688,6 +1889,9 @@ local getinfo=debug.getinfo local lpegmatch,patterns=lpeg.match,lpeg.patterns local floor=math.floor local stripper=patterns.stripper +function table.getn(t) + return t and #t +end function table.strip(tab) local lst,l={},0 for i=1,#tab do @@ -1981,7 +2185,7 @@ function table.tohash(t,value) local h={} if t then if value==nil then value=true end - for _,v in next,t do + for _,v in next,t do h[v]=value end end @@ -1989,7 +2193,7 @@ function table.tohash(t,value) end function table.fromhash(t) local hsh,h={},0 - for k,v in next,t do + for k,v in next,t do if v then h=h+1 hsh[h]=k @@ -2464,7 +2668,9 @@ function table.unnest(t) return unnest(t) end local function are_equal(a,b,n,m) - if a and b and #a==#b then + if a==b then + return true + elseif a and b and #a==#b then n=n or 1 m=m or #a for i=n,m do @@ -2484,15 +2690,17 @@ local function are_equal(a,b,n,m) end end local function identical(a,b) - for ka,va in next,a do - local vb=b[ka] - if va==vb then - elseif type(va)=="table" and type(vb)=="table" then - if not identical(va,vb) then + if a~=b then + for ka,va in next,a do + local vb=b[ka] + if va==vb then + elseif type(va)=="table" and type(vb)=="table" then + if not identical(va,vb) then + return false + end + else return false end - else - return false end end return true @@ -2714,6 +2922,24 @@ function table.filtered(t,pattern,sort,cmp) return nothing end end +if not table.move then + function table.move(a1,f,e,t,a2) + if a2 and a1~=a2 then + for i=f,e do + a2[t]=a1[i] + t=t+1 + end + return a2 + else + t=t+e-f + for i=e,f,-1 do + a1[t]=a1[i] + t=t-1 + end + return a1 + end + end +end end -- of closure @@ -2722,7 +2948,7 @@ do -- create closure to overcome 200 locals limit package.loaded["l-io"] = package.loaded["l-io"] or true --- original size: 11790, stripped down to: 6961 +-- original size: 11823, stripped down to: 6945 if not modules then modules={} end modules ['l-io']={ version=1.001, @@ -2735,16 +2961,15 @@ local io=io local open,flush,write,read=io.open,io.flush,io.write,io.read local byte,find,gsub,format=string.byte,string.find,string.gsub,string.format local concat=table.concat -local floor=math.floor local type=type if string.find(os.getenv("PATH"),";",1,true) then io.fileseparator,io.pathseparator="\\",";" else io.fileseparator,io.pathseparator="/",":" end -local large=2^24 -local medium=large/16 -local small=medium/8 +local large=0x01000000 +local medium=0x00100000 +local small=0x00020000 local function readall(f) local size=f:seek("end") if size>0 then @@ -3075,7 +3300,7 @@ do -- create closure to overcome 200 locals limit package.loaded["l-number"] = package.loaded["l-number"] or true --- original size: 5358, stripped down to: 3177 +-- original size: 5645, stripped down to: 2253 if not modules then modules={} end modules ['l-number']={ version=1.001, @@ -3091,33 +3316,6 @@ local lpegmatch=lpeg.match local floor=math.floor number=number or {} local number=number -if bit32 then - local btest,bor=bit32.btest,bit32.bor - function number.bit(p) - return 2^(p-1) - end - number.hasbit=btest - number.setbit=bor - function number.setbit(x,p) - return btest(x,p) and x or x+p - end - function number.clearbit(x,p) - return btest(x,p) and x-p or x - end -else - function number.bit(p) - return 2^(p-1) - end - function number.hasbit(x,p) - return x%(p+p)>=p - end - function number.setbit(x,p) - return (x%(p+p)>=p) and x or x+p - end - function number.clearbit(x,p) - return (x%(p+p)>=p) and x-p or x - end -end if bit32 then local bextract=bit32.extract local t={ @@ -3193,26 +3391,6 @@ function number.toevenhex(n) return "0"..s end end -local one=lpeg.C(1-lpeg.S('')/tonumber)^1 -function number.toset(n) - return lpegmatch(one,tostring(n)) -end -local function bits(n,i,...) - if n>0 then - local m=n%2 - local n=floor(n/2) - if m>0 then - return bits(n,i+1,i,...) - else - return bits(n,i+1,...) - end - else - return... - end -end -function number.bits(n) - return { bits(n,1) } -end function number.bytetodecimal(b) local d=floor(b*100/255+0.5) if d>100 then @@ -3689,7 +3867,7 @@ do -- create closure to overcome 200 locals limit package.loaded["l-file"] = package.loaded["l-file"] or true --- original size: 20997, stripped down to: 9986 +-- original size: 21616, stripped down to: 10359 if not modules then modules={} end modules ['l-file']={ version=1.001, @@ -3725,6 +3903,9 @@ end function lfs.isfile(name) return attributes(name,"mode")=="file" end +function lfs.isfound(name) + return attributes(name,"mode")=="file" and name or nil +end local colon=P(":") local period=P(".") local periods=P("..") @@ -4063,6 +4244,23 @@ function lfs.mkdirs(path) lfs.mkdir(full) end end +function file.withinbase(path) + local l=0 + if not find(path,"^/") then + path="/"..path + end + for dir in gmatch(path,"/([^/]+)") do + if dir==".." then + l=l-1 + elseif dir~="." then + l=l+1 + end + if l<0 then + return false + end + end + return true +end end -- of closure @@ -4215,7 +4413,7 @@ do -- create closure to overcome 200 locals limit package.loaded["l-url"] = package.loaded["l-url"] or true --- original size: 12531, stripped down to: 5721 +-- original size: 14755, stripped down to: 7236 if not modules then modules={} end modules ['l-url']={ version=1.001, @@ -4226,24 +4424,51 @@ if not modules then modules={} end modules ['l-url']={ } local char,format,byte=string.char,string.format,string.byte local concat=table.concat -local tonumber,type=tonumber,type +local tonumber,type,next=tonumber,type,next local P,C,R,S,Cs,Cc,Ct,Cf,Cg,V=lpeg.P,lpeg.C,lpeg.R,lpeg.S,lpeg.Cs,lpeg.Cc,lpeg.Ct,lpeg.Cf,lpeg.Cg,lpeg.V local lpegmatch,lpegpatterns,replacer=lpeg.match,lpeg.patterns,lpeg.replacer +local sortedhash=table.sortedhash url=url or {} local url=url -local tochar=function(s) return char(tonumber(s,16)) end +local unescapes={} +local escapes={} +setmetatable(unescapes,{ __index=function(t,k) + local v=char(tonumber(k,16)) + t[k]=v + return v +end }) +setmetatable(escapes,{ __index=function(t,k) + local v=format("%%%02X",byte(k)) + t[k]=v + return v +end }) local colon=P(":") local qmark=P("?") local hash=P("#") local slash=P("/") +local atsign=P("@") local percent=P("%") local endofstring=P(-1) local hexdigit=R("09","AF","af") local plus=P("+") local nothing=Cc("") -local escapedchar=(percent*C(hexdigit*hexdigit))/tochar +local okay=R("09","AZ","az")+S("-_.,:=+*~!'()@&$") +local escapedchar=(percent*C(hexdigit*hexdigit))/unescapes +local unescapedchar=P(1)/escapes local escaped=(plus/" ")+escapedchar local noslash=P("/")/"" +local plustospace=P("+")/" " +local decoder=Cs(( + plustospace+escapedchar+P("\r\n")/"\n"+P(1) + )^0 ) +local encoder=Cs(( + R("09","AZ","az")^1+S("-./_")^1+P(" ")/"+"+P("\n")/"\r\n"+unescapedchar + )^0 ) +lpegpatterns.urldecoder=decoder +lpegpatterns.urlencoder=encoder +function url.decode (str) return str and lpegmatch(decoder,str) or str end +function url.encode (str) return str and lpegmatch(encoder,str) or str end +function url.unescape(str) return str and lpegmatch(unescaper,str) or str end local schemestr=Cs((escaped+(1-colon-slash-qmark-hash))^2) local authoritystr=Cs((escaped+(1- slash-qmark-hash))^0) local pathstr=Cs((escaped+(1- qmark-hash))^0) @@ -4258,13 +4483,7 @@ local validurl=scheme*authority*path*query*fragment local parser=Ct(validurl) lpegpatterns.url=validurl lpegpatterns.urlsplitter=parser -local escapes={} -setmetatable(escapes,{ __index=function(t,k) - local v=format("%%%02X",byte(k)) - t[k]=v - return v -end }) -local escaper=Cs((R("09","AZ","az")^1+P(" ")/"%%20"+S("-./_")^1+P(1)/escapes)^0) +local escaper=Cs((R("09","AZ","az")^1+P(" ")/"%%20"+S("-./_:")^1+P(1)/escapes)^0) local unescaper=Cs((escapedchar+1)^0) local getcleaner=Cs((P("+++")/"%%2B"+P("+")/"%%20"+P(1))^1) lpegpatterns.urlunescaped=escapedchar @@ -4294,12 +4513,15 @@ local barswapper=replacer("|",":") local backslashswapper=replacer("\\","/") local equal=P("=") local amp=P("&") -local key=Cs(((escapedchar+1)-equal )^0) -local value=Cs(((escapedchar+1)-amp -endofstring)^0) +local key=Cs(((plustospace+escapedchar+1)-equal )^0) +local value=Cs(((plustospace+escapedchar+1)-amp-endofstring)^0) local splitquery=Cf (Ct("")*P { "sequence", sequence=V("pair")*(amp*V("pair"))^0, pair=Cg(key*equal*value), },rawset) +local userpart=(1-atsign-colon)^1 +local serverpart=(1-colon)^1 +local splitauthority=((Cs(userpart)*colon*Cs(userpart)+Cs(userpart)*Cc(nil))*atsign+Cc(nil)*Cc(nil))*Cs(serverpart)*(colon*(serverpart/tonumber)+Cc(nil)) local function hashed(str) if not str or str=="" then return { @@ -4332,7 +4554,14 @@ local function hashed(str) end local authority=detailed[2] local path=detailed[3] - local filename=nil + local filename + local username + local password + local host + local port + if authority~="" then + username,password,host,port=lpegmatch(splitauthority,authority) + end if authority=="" then filename=path elseif path=="" then @@ -4350,6 +4579,8 @@ local function hashed(str) original=str, noscheme=false, filename=filename, + host=host, + port=port, } end url.split=split @@ -4365,24 +4596,38 @@ function url.addscheme(str,scheme) end end function url.construct(hash) - local fullurl,f={},0 - local scheme,authority,path,query,fragment=hash.scheme,hash.authority,hash.path,hash.query,hash.fragment + local result,r={},0 + local scheme=hash.scheme + local authority=hash.authority + local path=hash.path + local queries=hash.queries + local fragment=hash.fragment if scheme and scheme~="" then - f=f+1;fullurl[f]=scheme.."://" + r=r+1;result[r]=lpegmatch(escaper,scheme) + r=r+1;result[r]="://" end if authority and authority~="" then - f=f+1;fullurl[f]=authority + r=r+1;result[r]=lpegmatch(escaper,authority) end if path and path~="" then - f=f+1;fullurl[f]="/"..path + r=r+1;result[r]="/" + r=r+1;result[r]=lpegmatch(escaper,path) end - if query and query~="" then - f=f+1;fullurl[f]="?"..query + if queries then + local done=false + for k,v in sortedhash(queries) do + r=r+1;result[r]=done and "&" or "?" + r=r+1;result[r]=lpegmatch(escaper,k) + r=r+1;result[r]="=" + r=r+1;result[r]=lpegmatch(escaper,v) + done=true + end end if fragment and fragment~="" then - f=f+1;fullurl[f]="#"..fragment + r=r+1;result[r]="#" + r=r+1;result[r]=lpegmatch(escaper,fragment) end - return lpegmatch(escaper,concat(fullurl)) + return concat(result) end local pattern=Cs(slash^-1/""*R("az","AZ")*((S(":|")/":")+P(":"))*slash*P(1)^0) function url.filename(filename) @@ -4998,7 +5243,7 @@ do -- create closure to overcome 200 locals limit package.loaded["l-unicode"] = package.loaded["l-unicode"] or true --- original size: 38263, stripped down to: 16330 +-- original size: 40036, stripped down to: 17837 if not modules then modules={} end modules ['l-unicode']={ version=1.001, @@ -5034,37 +5279,73 @@ if not unicode then unicode={ utf=utf } end if not utf.char then - local floor,char=math.floor,string.char - function utf.char(n) - if n<0x80 then - return char(n) - elseif n<0x800 then - return char( - 0xC0+floor(n/0x40), - 0x80+(n%0x40) - ) - elseif n<0x10000 then - return char( - 0xE0+floor(n/0x1000), - 0x80+(floor(n/0x40)%0x40), - 0x80+(n%0x40) - ) - elseif n<0x200000 then - return char( - 0xF0+floor(n/0x40000), - 0x80+(floor(n/0x1000)%0x40), - 0x80+(floor(n/0x40)%0x40), - 0x80+(n%0x40) - ) + utf.char=string.utfcharacter or (utf8 and utf8.char) + if not utf.char then + local char=string.char + if bit32 then + local rshift=bit32.rshift + function utf.char(n) + if n<0x80 then + return char(n) + elseif n<0x800 then + return char( + 0xC0+rshift(n,6), + 0x80+(n%0x40) + ) + elseif n<0x10000 then + return char( + 0xE0+rshift(n,12), + 0x80+(rshift(n,6)%0x40), + 0x80+(n%0x40) + ) + elseif n<0x200000 then + return char( + 0xF0+rshift(n,18), + 0x80+(rshift(n,12)%0x40), + 0x80+(rshift(n,6)%0x40), + 0x80+(n%0x40) + ) + else + return "" + end + end else - return "" + local floor=math.floor + function utf.char(n) + if n<0x80 then + return char(n) + elseif n<0x800 then + return char( + 0xC0+floor(n/0x40), + 0x80+(n%0x40) + ) + elseif n<0x10000 then + return char( + 0xE0+floor(n/0x1000), + 0x80+(floor(n/0x40)%0x40), + 0x80+(n%0x40) + ) + elseif n<0x200000 then + return char( + 0xF0+floor(n/0x40000), + 0x80+(floor(n/0x1000)%0x40), + 0x80+(floor(n/0x40)%0x40), + 0x80+(n%0x40) + ) + else + return "" + end + end end end end if not utf.byte then - local utf8byte=patterns.utf8byte - function utf.byte(c) - return lpegmatch(utf8byte,c) + utf.byte=string.utfvalue or (utf8 and utf8.codepoint) + if not utf.byte then + local utf8byte=patterns.utf8byte + function utf.byte(c) + return lpegmatch(utf8byte,c) + end end end local utfchar,utfbyte=utf.char,utf.byte @@ -5115,19 +5396,22 @@ function utf.is_valid(str) return type(str)=="string" and lpegmatch(validatedutf,str) or false end if not utf.len then - local n,f=0,1 - local utfcharcounter=patterns.utfbom^-1*Cmt ( - Cc(1)*patterns.utf8one^1+Cc(2)*patterns.utf8two^1+Cc(3)*patterns.utf8three^1+Cc(4)*patterns.utf8four^1, - function(_,t,d) - n=n+(t-f)/d - f=t - return true + utf.len=string.utflength or (utf8 and utf8.len) + if not utf.len then + local n,f=0,1 + local utfcharcounter=patterns.utfbom^-1*Cmt ( + Cc(1)*patterns.utf8one^1+Cc(2)*patterns.utf8two^1+Cc(3)*patterns.utf8three^1+Cc(4)*patterns.utf8four^1, + function(_,t,d) + n=n+(t-f)/d + f=t + return true + end + )^0 + function utf.len(str) + n,f=0,1 + lpegmatch(utfcharcounter,str or "") + return n end - )^0 - function utf.len(str) - n,f=0,1 - lpegmatch(utfcharcounter,str or "") - return n end end utf.length=utf.len @@ -5475,20 +5759,22 @@ function utf.utf32_to_utf8_t(t,endian) end local function little(b) if b<0x10000 then - return char(b%256,b/256) + return char(b%256,rshift(b,8)) else b=b-0x10000 - local b1,b2=b/1024+0xD800,b%1024+0xDC00 - return char(b1%256,b1/256,b2%256,b2/256) + local b1=rshift(b,10)+0xD800 + local b2=b%1024+0xDC00 + return char(b1%256,rshift(b1,8),b2%256,rshift(b2,8)) end end local function big(b) if b<0x10000 then - return char(b/256,b%256) + return char(rshift(b,8),b%256) else b=b-0x10000 - local b1,b2=b/1024+0xD800,b%1024+0xDC00 - return char(b1/256,b1%256,b2/256,b2%256) + local b1=rshift(b,10)+0xD800 + local b2=b%1024+0xDC00 + return char(rshift(b1,8),b1%256,rshift(b2,8),b2%256) end end local l_remap=Cs((p_utf8byte/little+P(1)/"")^0) @@ -5609,22 +5895,43 @@ function utf.chrlen(u) (u<0xFC and 5) or (u<0xFE and 6) or 0 end -local extract=bit32.extract -local char=string.char -function unicode.toutf32string(n) - if n<=0xFF then - return - char(n).."\000\000\000" - elseif n<=0xFFFF then - return - char(extract(n,0,8))..char(extract(n,8,8)).."\000\000" - elseif n<=0xFFFFFF then - return - char(extract(n,0,8))..char(extract(n,8,8))..char(extract(n,16,8)).."\000" - else - return - char(extract(n,0,8))..char(extract(n,8,8))..char(extract(n,16,8))..char(extract(n,24,8)) +if bit32 then + local extract=bit32.extract + local char=string.char + function unicode.toutf32string(n) + if n<=0xFF then + return + char(n).."\000\000\000" + elseif n<=0xFFFF then + return + char(extract(n,0,8))..char(extract(n,8,8)).."\000\000" + elseif n<=0xFFFFFF then + return + char(extract(n,0,8))..char(extract(n,8,8))..char(extract(n,16,8)).."\000" + else + return + char(extract(n,0,8))..char(extract(n,8,8))..char(extract(n,16,8))..char(extract(n,24,8)) + end + end +end +local len=utf.len +local rep=rep +function string.utfpadd(s,n) + if n and n~=0 then + local l=len(s) + if n>0 then + local d=n-l + if d>0 then + return rep(c or " ",d)..s + end + else + local d=- n-l + if d>0 then + return s..rep(c or " ",d) + end + end end + return s end @@ -5634,7 +5941,7 @@ do -- create closure to overcome 200 locals limit package.loaded["l-math"] = package.loaded["l-math"] or true --- original size: 974, stripped down to: 890 +-- original size: 2555, stripped down to: 1900 if not modules then modules={} end modules ['l-math']={ version=1.001, @@ -5643,21 +5950,23 @@ if not modules then modules={} end modules ['l-math']={ copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" } -local floor,sin,cos,tan=math.floor,math.sin,math.cos,math.tan if not math.ceiling then math.ceiling=math.ceil end if not math.round then + local floor=math.floor function math.round(x) return floor(x+0.5) end end if not math.div then + local floor=math.floor function math.div(n,m) return floor(n/m) end end if not math.mod then function math.mod(n,m) return n%m end end -local pipi=2*math.pi/360 if not math.sind then + local sin,cos,tan=math.sin,math.cos,math.tan + local pipi=2*math.pi/360 function math.sind(d) return sin(d*pipi) end function math.cosd(d) return cos(d*pipi) end function math.tand(d) return tan(d*pipi) end @@ -5666,6 +5975,60 @@ if not math.odd then function math.odd (n) return n%2~=0 end function math.even(n) return n%2==0 end end +if not math.cosh then + local exp=math.exp + function math.cosh(x) + local xx=exp(x) + return (xx+1/xx)/2 + end + function math.sinh(x) + local xx=exp(x) + return (xx-1/xx)/2 + end + function math.tanh(x) + local xx=exp(x) + return (xx-1/xx)/(xx+1/xx) + end +end +if not math.pow then + function math.pow(x,y) + return x^y + end +end +if not math.atan2 then + math.atan2=math.atan +end +if not math.ldexp then + function math.ldexp(x,e) + return x*2.0^e + end +end +if not math.log10 then + local log=math.log + function math.log10(x) + return log(x,10) + end +end +if not math.type then + function math.type() + return "float" + end +end +if not math.tointeger then + math.mininteger=-0x4FFFFFFFFFFF + math.maxinteger=0x4FFFFFFFFFFF + local floor=math.floor + function math.tointeger(n) + local f=floor(n) + return f==n and f or nil + end +end +if not math.ult then + local floor=math.floor + function math.tointeger(m,n) + return floor(m)<floor(n) + end +end end -- of closure @@ -5674,7 +6037,7 @@ do -- create closure to overcome 200 locals limit package.loaded["util-str"] = package.loaded["util-str"] or true --- original size: 36148, stripped down to: 20179 +-- original size: 38725, stripped down to: 21726 if not modules then modules={} end modules ['util-str']={ version=1.001, @@ -5688,13 +6051,13 @@ utilities.strings=utilities.strings or {} local strings=utilities.strings local format,gsub,rep,sub,find=string.format,string.gsub,string.rep,string.sub,string.find local load,dump=load,string.dump -local tonumber,type,tostring=tonumber,type,tostring +local tonumber,type,tostring,next=tonumber,type,tostring,next local unpack,concat=table.unpack,table.concat local P,V,C,S,R,Ct,Cs,Cp,Carg,Cc=lpeg.P,lpeg.V,lpeg.C,lpeg.S,lpeg.R,lpeg.Ct,lpeg.Cs,lpeg.Cp,lpeg.Carg,lpeg.Cc local patterns,lpegmatch=lpeg.patterns,lpeg.match -local utfchar,utfbyte=utf.char,utf.byte +local utfchar,utfbyte,utflen=utf.char,utf.byte,utf.len local loadstripped=nil -if _LUAVERSION<5.2 then +if LUAVERSION<5.2 then loadstripped=function(str,shortcuts) return load(str) end @@ -5782,6 +6145,17 @@ local pattern=Carg(1)/function(t) function strings.tabtospace(str,tab) return lpegmatch(pattern,str,1,tab or 7) end +function string.utfpadding(s,n) + if not n or n==0 then + return "" + end + local l=utflen(s) + if n>0 then + return nspaces[n-l] + else + return nspaces[-n-l] + end +end local space=spacer^0 local nospace=space/"" local endofline=nospace*newline @@ -5888,6 +6262,21 @@ function number.formatted(n,sep1,sep2) return lpegmatch(splitter,s,1,sep1 or ",",sep2 or ".") end end +local p=Cs( + P("-")^0*(P("0")^1/"")^0*(1-P("."))^0*(P(".")*P("0")^1*P(-1)/""+P(".")^0)*P(1-P("0")^1*P(-1))^0 + ) +function number.compactfloat(n,fmt) + if n==0 then + return "0" + elseif n==1 then + return "1" + end + n=lpegmatch(p,format(fmt or "%0.3f",n)) + if n=="." or n=="" or n=="-" then + return "0" + end + return n +end local zero=P("0")^1/"" local plus=P("+")/"" local minus=P("-") @@ -5940,7 +6329,7 @@ local template=[[ return function(%s) return %s end ]] local preamble,environment="",{} -if _LUAVERSION<5.2 then +if LUAVERSION<5.2 then preamble=[[ local lpeg=lpeg local type=type @@ -5955,6 +6344,7 @@ local utfchar=utf.char local utfbyte=utf.byte local lpegmatch=lpeg.match local nspaces=string.nspaces +local utfpadding=string.utfpadding local tracedchar=string.tracedchar local autosingle=string.autosingle local autodouble=string.autodouble @@ -5979,6 +6369,7 @@ else utfbyte=utf.byte, lpegmatch=lpeg.match, nspaces=string.nspaces, + utfpadding=string.utfpadding, tracedchar=string.tracedchar, autosingle=string.autosingle, autodouble=string.autodouble, @@ -6014,9 +6405,32 @@ local format_S=function(f) return format("tostring(a%s)",n) end end +local format_right=function(f) + n=n+1 + f=tonumber(f) + if not f or f==0 then + return format("(a%s or '')",n) + elseif f>0 then + return format("utfpadding(a%s,%i)..a%s",n,f,n) + else + return format("a%s..utfpadding(a%s,%i)",n,n,f) + end +end +local format_left=function(f) + n=n+1 + f=tonumber(f) + if not f or f==0 then + return format("(a%s or '')",n) + end + if f<0 then + return format("utfpadding(a%s,%i)..a%s",n,-f,n) + else + return format("a%s..utfpadding(a%s,%i)",n,n,-f) + end +end local format_q=function() n=n+1 - return format("(a%s and format('%%q',a%s) or '')",n,n) + return format("(a%s ~= nil and format('%%q',tostring(a%s)) or '')",n,n) end local format_Q=function() n=n+1 @@ -6268,6 +6682,8 @@ local builder=Cs { "start", +V("j")+V("J") +V("m")+V("M") +V("z") ++V(">") ++V("<") )+V("*") )*(P(-1)+Carg(1)) )^0, @@ -6285,7 +6701,7 @@ local builder=Cs { "start", ["X"]=(prefix_any*P("X"))/format_X, ["o"]=(prefix_any*P("o"))/format_o, ["S"]=(prefix_any*P("S"))/format_S, - ["Q"]=(prefix_any*P("Q"))/format_S, + ["Q"]=(prefix_any*P("Q"))/format_Q, ["N"]=(prefix_any*P("N"))/format_N, ["k"]=(prefix_sub*P("k"))/format_k, ["c"]=(prefix_any*P("c"))/format_c, @@ -6311,6 +6727,8 @@ local builder=Cs { "start", ["z"]=(prefix_any*P("z"))/format_z, ["a"]=(prefix_any*P("a"))/format_a, ["A"]=(prefix_any*P("A"))/format_A, + ["<"]=(prefix_any*P("<"))/format_left, + [">"]=(prefix_any*P(">"))/format_right, ["*"]=Cs(((1-P("%"))^1+P("%%")/"%%")^1)/format_rest, ["?"]=Cs(((1-P("%"))^1 )^1)/format_rest, ["!"]=Carg(2)*prefix_any*P("!")*C((1-P("!"))^1)*P("!")/format_extension, @@ -6341,7 +6759,7 @@ local function use(t,fmt,...) return t[fmt](...) end strings.formatters={} -if _LUAVERSION<5.2 then +if LUAVERSION<5.2 then function strings.formatters.new(noconcat) local t={ _type_="formatter",_connector_=noconcat and "," or "..",_extensions_={},_preamble_=preamble,_environment_={} } setmetatable(t,{ __index=make,__call=use }) @@ -6378,7 +6796,7 @@ patterns.xmlescape=Cs((P("<")/"<"+P(">")/">"+P("&")/"&"+P('"')/"" patterns.texescape=Cs((C(S("#$%\\{}"))/"\\%1"+P(1))^0) patterns.luaescape=Cs(((1-S('"\n'))^1+P('"')/'\\"'+P('\n')/'\\n"')^0) patterns.luaquoted=Cs(Cc('"')*((1-S('"\n'))^1+P('"')/'\\"'+P('\n')/'\\n"')^0*Cc('"')) -if _LUAVERSION<5.2 then +if LUAVERSION<5.2 then add(formatters,"xml",[[lpegmatch(xmlescape,%s)]],"local xmlescape = lpeg.patterns.xmlescape") add(formatters,"tex",[[lpegmatch(texescape,%s)]],"local texescape = lpeg.patterns.texescape") add(formatters,"lua",[[lpegmatch(luaescape,%s)]],"local luaescape = lpeg.patterns.luaescape") @@ -6400,6 +6818,21 @@ local pattern=Cs((newline/(os.newline or "\r")+1)^0) function string.replacenewlines(str) return lpegmatch(pattern,str) end +function strings.newcollector() + local result,r={},0 + return + function(fmt,str,...) + r=r+1 + result[r]=str==nil and fmt or formatters[fmt](str,...) + end, + function(connector) + if result then + local str=concat(result,connector) + result,r={},0 + return str + end + end +end end -- of closure @@ -6408,7 +6841,7 @@ do -- create closure to overcome 200 locals limit package.loaded["util-tab"] = package.loaded["util-tab"] or true --- original size: 27407, stripped down to: 17116 +-- original size: 27665, stripped down to: 17051 if not modules then modules={} end modules ['util-tab']={ version=1.001, @@ -6788,11 +7221,6 @@ function table.drop(t,slow) return fastdrop(t) end end -function table.autokey(t,k) - local v={} - t[k]=v - return v -end local selfmapper={ __index=function(t,k) t[k]=k return k end } function table.twowaymapper(t) if not t then @@ -7037,7 +7465,7 @@ do -- create closure to overcome 200 locals limit package.loaded["util-fil"] = package.loaded["util-fil"] or true --- original size: 7567, stripped down to: 5575 +-- original size: 7787, stripped down to: 5858 if not modules then modules={} end modules ['util-fil']={ version=1.001, @@ -7048,8 +7476,6 @@ if not modules then modules={} end modules ['util-fil']={ } local byte=string.byte local char=string.char -local extract=bit32 and bit32.extract -local floor=math.floor utilities=utilities or {} local files={} utilities.files=files @@ -7066,7 +7492,10 @@ function files.close(f) f:close() end function files.size(f) - return f:seek("end") + local current=f:seek() + local size=f:seek("end") + f:seek("set",current) + return size end files.getsize=files.size function files.setposition(f,n) @@ -7216,7 +7645,7 @@ function files.readfixed4(f) return (0x100*a+b )+(0x100*c+d)/0x10000 end end -if extract then +if bit32 then local extract=bit32.extract local band=bit32.band function files.read2dot14(f) @@ -7236,19 +7665,30 @@ end function files.skiplong(f,n) f:read(4*(n or 1)) end -function files.writecardinal2(f,n) - local a=char(n%256) - n=floor(n/256) - local b=char(n%256) - f:write(b,a) +if bit32 then + local rshift=bit32.rshift + function files.writecardinal2(f,n) + local a=char(n%256) + n=rshift(n,8) + local b=char(n%256) + f:write(b,a) + end +else + local floor=math.floor + function files.writecardinal2(f,n) + local a=char(n%256) + n=floor(n/256) + local b=char(n%256) + f:write(b,a) + end end function files.writecardinal4(f,n) local a=char(n%256) - n=floor(n/256) + n=rshift(n,8) local b=char(n%256) - n=floor(n/256) + n=rshift(n,8) local c=char(n%256) - n=floor(n/256) + n=rshift(n,8) local d=char(n%256) f:write(d,c,b,a) end @@ -7267,6 +7707,8 @@ if fio and fio.readcardinal1 then files.readinteger2=fio.readinteger2 files.readinteger3=fio.readinteger3 files.readinteger4=fio.readinteger4 + files.readfixed2=fio.readfixed2 + files.readfixed4=fio.readfixed4 files.read2dot14=fio.read2dot14 files.setposition=fio.setposition files.getposition=fio.getposition @@ -7634,7 +8076,7 @@ do -- create closure to overcome 200 locals limit package.loaded["util-sto"] = package.loaded["util-sto"] or true --- original size: 3926, stripped down to: 2742 +-- original size: 6449, stripped down to: 3069 if not modules then modules={} end modules ['util-sto']={ version=1.001, @@ -7643,7 +8085,7 @@ if not modules then modules={} end modules ['util-sto']={ copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" } -local setmetatable,getmetatable,type=setmetatable,getmetatable,type +local setmetatable,getmetatable,rawset,type=setmetatable,getmetatable,rawset,type utilities=utilities or {} utilities.storage=utilities.storage or {} local storage=utilities.storage @@ -7753,6 +8195,25 @@ function table.setmetatablecall(t,f) end return t end +function table.setmetatableindices(t,f,n,c) + if type(t)~="table" then + f,t=t,{} + end + local m=getmetatable(t) + local i=f_index[f] or f + if m then + m.__index=i + m.__newindex=n + m.__call=c + else + setmetatable(t,{ + __index=i, + __newindex=n, + __call=c, + }) + end + return t +end function table.setmetatablekey(t,key,value) local m=getmetatable(t) if not m then @@ -7774,7 +8235,7 @@ do -- create closure to overcome 200 locals limit package.loaded["util-prs"] = package.loaded["util-prs"] or true --- original size: 22883, stripped down to: 16045 +-- original size: 22956, stripped down to: 16106 if not modules then modules={} end modules ['util-prs']={ version=1.001, @@ -8192,14 +8653,16 @@ function parsers.rfc4180splitter(specification) local field=escaped+non_escaped+Cc("") local record=Ct(field*(separator*field)^1) local headerline=record*Cp() - local wholeblob=Ct((newline^(specification.strict and -1 or 1)*record)^0) + local morerecords=(newline^(specification.strict and -1 or 1)*record)^0 + local headeryes=Ct(morerecords) + local headernop=Ct(record*morerecords) return function(data,getheader) if getheader then local header,position=lpegmatch(headerline,data) - local data=lpegmatch(wholeblob,data,position) + local data=lpegmatch(headeryes,data,position) return data,header else - return lpegmatch(wholeblob,data) + return lpegmatch(headernop,data) end end end @@ -8220,8 +8683,8 @@ end local cardinal=lpegpatterns.cardinal/tonumber local spacers=lpegpatterns.spacer^0 local endofstring=lpegpatterns.endofstring -local stepper=spacers*(C(cardinal)*(spacers*S(":-")*spacers*(C(cardinal)+Cc(true) )+Cc(false) )*Carg(1)*Carg(2)/ranger*S(", ")^0 )^1 -local stepper=spacers*(C(cardinal)*(spacers*S(":-")*spacers*(C(cardinal)+(P("*")+endofstring)*Cc(true) )+Cc(false) )*Carg(1)*Carg(2)/ranger*S(", ")^0 )^1*endofstring +local stepper=spacers*(cardinal*(spacers*S(":-")*spacers*(cardinal+Cc(true) )+Cc(false) )*Carg(1)*Carg(2)/ranger*S(", ")^0 )^1 +local stepper=spacers*(cardinal*(spacers*S(":-")*spacers*(cardinal+(P("*")+endofstring)*Cc(true) )+Cc(false) )*Carg(1)*Carg(2)/ranger*S(", ")^0 )^1*endofstring function parsers.stepper(str,n,action) if type(n)=="function" then lpegmatch(stepper,str,1,false,n or print) @@ -8408,7 +8871,7 @@ do -- create closure to overcome 200 locals limit package.loaded["trac-set"] = package.loaded["trac-set"] or true --- original size: 12454, stripped down to: 8840 +-- original size: 13044, stripped down to: 9231 if not modules then modules={} end modules ['trac-set']={ version=1.001, @@ -8417,8 +8880,8 @@ if not modules then modules={} end modules ['trac-set']={ copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" } -local type,next,tostring=type,next,tostring -local concat=table.concat +local type,next,tostring,tonumber=type,next,tostring,tonumber +local concat,sortedhash=table.concat,table.sortedhash local format,find,lower,gsub,topattern=string.format,string.find,string.lower,string.gsub,string.topattern local is_boolean=string.is_boolean local settings_to_hash=utilities.parsers.settings_to_hash @@ -8435,7 +8898,7 @@ function setters.initialize(filename,name,values) frozen=true local data=setter.data if data then - for key,newvalue in next,values do + for key,newvalue in sortedhash(values) do local newvalue=is_boolean(newvalue,newvalue,true) local functions=data[key] if functions then @@ -8484,7 +8947,7 @@ local function set(t,what,newvalue) done={} t.done=done end - for w,value in next,what do + for w,value in sortedhash(what) do if value=="" then value=newvalue elseif not value then @@ -8493,7 +8956,7 @@ local function set(t,what,newvalue) value=is_boolean(value,value,true) end w=topattern(w,true,true) - for name,functions in next,data do + for name,functions in sortedhash(data) do if done[name] then elseif find(name,w) then done[name]=true @@ -8509,7 +8972,7 @@ end local function reset(t) local data=t.data if not data.frozen then - for name,functions in next,data do + for name,functions in sortedthash(data) do for i=1,#functions do functions[i](false) end @@ -8600,13 +9063,30 @@ function setters.show(t) local name=list[k] local functions=t.data[name] if functions then - local value,default,modules=functions.value,functions.default,#functions - value=value==nil and "unset" or tostring(value) - default=default==nil and "unset" or tostring(default) - t.report("%-50s modules: %2i default: %-12s value: %-12s",name,modules,default,value) + local value=functions.value + local default=functions.default + local modules=#functions + if default==nil then + default="unset" + elseif type(default)=="table" then + default=concat(default,"|") + else + default=tostring(default) + end + if value==nil then + value="unset" + elseif type(value)=="table" then + value=concat(value,"|") + else + value=tostring(value) + end + t.report(name) + t.report(" modules : %i",modules) + t.report(" default : %s",default) + t.report(" value : %s",value) + t.report() end end - t.report() end local enable,disable,register,list,show=setters.enable,setters.disable,setters.register,setters.list,setters.show function setters.report(setter,...) @@ -8720,7 +9200,7 @@ do -- create closure to overcome 200 locals limit package.loaded["trac-log"] = package.loaded["trac-log"] or true --- original size: 30007, stripped down to: 20818 +-- original size: 32737, stripped down to: 22946 if not modules then modules={} end modules ['trac-log']={ version=1.001, @@ -8739,7 +9219,8 @@ local datetime=os.date local openfile=io.open local setmetatableindex=table.setmetatableindex local formatters=string.formatters -local texgetcount=tex and tex.getcount +local settings_to_hash=utilities.parsers.settings_to_hash +local sortedkeys=table.sortedkeys local variant="default" logs=logs or {} local logs=logs @@ -9166,14 +9647,14 @@ logs.direct=direct logs.subdirect=subdirect logs.writer=writer logs.newline=newline -local data,states={},nil +local data={} +local states=nil +local force=false function logs.reporter(category,subcategory) local logger=data[category] if not logger then - local state=false - if states==true then - state=true - elseif type(states)=="table" then + local state=states==true + if not state and type(states)=="table" then for c,_ in next,states do if find(category,c) then state=true @@ -9191,7 +9672,7 @@ function logs.reporter(category,subcategory) if not reporter then if subcategory then reporter=function(...) - if not logger.state then + if force or not logger.state then subreport(category,subcategory,...) end end @@ -9199,7 +9680,7 @@ function logs.reporter(category,subcategory) else local tag=category reporter=function(...) - if not logger.state then + if force or not logger.state then report(category,...) end end @@ -9225,7 +9706,7 @@ function logs.messenger(category,subcategory) end end local function setblocked(category,value) - if category==true then + if category==true or category=="all" then category,value="*",true elseif category==false then category,value="*",false @@ -9238,7 +9719,8 @@ local function setblocked(category,value) v.state=value end else - states=utilities.parsers.settings_to_hash(category,type(states)=="table" and states or nil) + alllocked=false + states=settings_to_hash(category,type(states)=="table" and states or nil) for c in next,states do local v=data[c] if v then @@ -9261,7 +9743,7 @@ function logs.enable(category) setblocked(category,false) end function logs.categories() - return table.sortedkeys(data) + return sortedkeys(data) end function logs.show() local n,c,s,max=0,0,0,0 @@ -9283,7 +9765,7 @@ function logs.show() max=m end end - local subcategories=concat(table.sortedkeys(reporters),", ") + local subcategories=concat(sortedkeys(reporters),", ") if state==true then state="disabled" elseif state==false then @@ -9310,54 +9792,57 @@ end) directives.register("logs.target",function(v) settarget(v) end) -local report_pages=logs.reporter("pages") -local real,user,sub -function logs.start_page_number() - real=texgetcount("realpageno") - user=texgetcount("userpageno") - sub=texgetcount("subpageno") -end -local timing=false -local starttime=nil -local lasttime=nil -trackers.register("pages.timing",function(v) - starttime=os.clock() - timing=true -end) -function logs.stop_page_number() - if timing then - local elapsed,average - local stoptime=os.clock() - if not lasttime or real<2 then - elapsed=stoptime - average=stoptime - starttime=stoptime - else - elapsed=stoptime-lasttime - average=(stoptime-starttime)/(real-1) - end - lasttime=stoptime - if real<=0 then - report_pages("flushing page, time %0.04f / %0.04f",elapsed,average) - elseif user<=0 then - report_pages("flushing realpage %s, time %0.04f / %0.04f",real,elapsed,average) - elseif sub<=0 then - report_pages("flushing realpage %s, userpage %s, time %0.04f / %0.04f",real,user,elapsed,average) - else - report_pages("flushing realpage %s, userpage %s, subpage %s, time %0.04f / %0.04f",real,user,sub,elapsed,average) - end - else - if real<=0 then - report_pages("flushing page") - elseif user<=0 then - report_pages("flushing realpage %s",real) - elseif sub<=0 then - report_pages("flushing realpage %s, userpage %s",real,user) +if tex then + local report=logs.reporter("pages") + local texgetcount=tex and tex.getcount + local real,user,sub + function logs.start_page_number() + real=texgetcount("realpageno") + user=texgetcount("userpageno") + sub=texgetcount("subpageno") + end + local timing=false + local starttime=nil + local lasttime=nil + trackers.register("pages.timing",function(v) + starttime=os.clock() + timing=true + end) + function logs.stop_page_number() + if timing then + local elapsed,average + local stoptime=os.clock() + if not lasttime or real<2 then + elapsed=stoptime + average=stoptime + starttime=stoptime + else + elapsed=stoptime-lasttime + average=(stoptime-starttime)/(real-1) + end + lasttime=stoptime + if real<=0 then + report("flushing page, time %0.04f / %0.04f",elapsed,average) + elseif user<=0 then + report("flushing realpage %s, time %0.04f / %0.04f",real,elapsed,average) + elseif sub<=0 then + report("flushing realpage %s, userpage %s, time %0.04f / %0.04f",real,user,elapsed,average) + else + report("flushing realpage %s, userpage %s, subpage %s, time %0.04f / %0.04f",real,user,sub,elapsed,average) + end else - report_pages("flushing realpage %s, userpage %s, subpage %s",real,user,sub) + if real<=0 then + report("flushing page") + elseif user<=0 then + report("flushing realpage %s",real) + elseif sub<=0 then + report("flushing realpage %s, userpage %s",real,user) + else + report("flushing realpage %s, userpage %s, subpage %s",real,user,sub) + end end + logs.flush() end - logs.flush() end local nesting=0 local verbose=false @@ -9512,6 +9997,92 @@ io.stderr:setvbuf('no') if package.helpers.report then package.helpers.report=logs.reporter("package loader") end +if tex then + local finalactions={} + local fatalerrors={} + local possiblefatal={} + local loggingerrors=false + function logs.loggingerrors() + return loggingerrors + end + directives.register("logs.errors",function(v) + loggingerrors=v + if type(v)=="string" then + fatalerrors=settings_to_hash(v) + else + fatalerrors={} + end + end) + function logs.registerfinalactions(...) + insert(finalactions,...) + end + local what=nil + local report=nil + local state=nil + local target=nil + local function startlogging(t,r,w,s) + target=t + state=force + force=true + report=type(r)=="function" and r or logs.reporter(r) + what=w + pushtarget(target) + newline() + if s then + report("start %s: %s",what,s) + else + report("start %s",what) + end + if target=="logfile" then + newline() + end + return report + end + local function stoplogging() + if target=="logfile" then + newline() + end + report("stop %s",what) + if target=="logfile" then + newline() + end + poptarget() + state=oldstate + end + function logs.startfilelogging(...) + return startlogging("logfile",...) + end + logs.stopfilelogging=stoplogging + local done=false + function logs.starterrorlogging(r,w,...) + if not done then + pushtarget("terminal") + newline() + logs.report("error logging","start possible issues") + poptarget() + done=true + end + if fatalerrors[w] then + possiblefatal[w]=true + end + return startlogging("terminal",r,w,...) + end + logs.stoperrorlogging=stoplogging + function logs.finalactions() + if #finalactions>0 then + for i=1,#finalactions do + finalactions[i]() + end + if done then + pushtarget("terminal") + newline() + logs.report("error logging","stop possible issues") + poptarget() + end + return next(possiblefatal) and sortedkeys(possiblefatal) or false + end + end +end end -- of closure @@ -9520,7 +10091,7 @@ do -- create closure to overcome 200 locals limit package.loaded["trac-inf"] = package.loaded["trac-inf"] or true --- original size: 8036, stripped down to: 5567 +-- original size: 8284, stripped down to: 5698 if not modules then modules={} end modules ['trac-inf']={ version=1.001, @@ -9556,7 +10127,7 @@ local ticks=clock local seconds=function(n) return n or 0 end local function starttiming(instance) local timer=timers[instance or "notimer"] - local it=timer.timing or 0 + local it=timer.timing if it==0 then timer.starttime=ticks() if not timer.loadtime then @@ -9586,7 +10157,7 @@ local function stoptiming(instance) end local function elapsed(instance) if type(instance)=="number" then - return instance or 0 + return instance else local timer=timers[instance or "notimer"] return timer and seconds(timer.loadtime) or 0 @@ -9627,8 +10198,9 @@ function statistics.show() return format("%s, type: %s, binary subtree: %s", os.platform or "unknown",os.type or "unknown",environment.texos or "unknown") end) - register("luatex banner",function() - return lower(status.banner) + register("used engine",function() + return format("%s version %s with functionality level %s, banner: %s", + LUATEXENGINE,LUATEXVERSION,LUATEXFUNCTIONALITY,lower(status.banner)) end) register("control sequences",function() return format("%s of %s + %s",status.cs_count,status.hash_size,status.hash_extra) @@ -9650,8 +10222,9 @@ function statistics.show() local hashchar=tonumber(status.luatex_hashchars) local hashtype=status.luatex_hashtype local mask=lua.mask or "ascii" - return format("engine: %s, used memory: %s, hash type: %s, hash chars: min(%s,40), symbol mask: %s (%s)", + return format("engine: %s %s, used memory: %s, hash type: %s, hash chars: min(%i,40), symbol mask: %s (%s)", jit and "luajit" or "lua", + LUAVERSION, statistics.memused(), hashtype or "default", hashchar and 2^hashchar or "unknown", @@ -9707,7 +10280,7 @@ do -- create closure to overcome 200 locals limit package.loaded["trac-pro"] = package.loaded["trac-pro"] or true --- original size: 5829, stripped down to: 3501 +-- original size: 5841, stripped down to: 3511 if not modules then modules={} end modules ['trac-pro']={ version=1.001, @@ -9716,7 +10289,7 @@ if not modules then modules={} end modules ['trac-pro']={ copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" } -local getmetatable,setmetatable,rawset,type=getmetatable,setmetatable,rawset,type +local getmetatable,setmetatable,rawset,type,next=getmetatable,setmetatable,rawset,type,next local trace_namespaces=false trackers.register("system.namespaces",function(v) trace_namespaces=v end) local report_system=logs.reporter("system","protection") namespaces=namespaces or {} @@ -9854,7 +10427,7 @@ do -- create closure to overcome 200 locals limit package.loaded["util-lua"] = package.loaded["util-lua"] or true --- original size: 5396, stripped down to: 3708 +-- original size: 6921, stripped down to: 4998 if not modules then modules={} end modules ['util-lua']={ version=1.001, @@ -9865,13 +10438,14 @@ if not modules then modules={} end modules ['util-lua']={ license="see context related readme files" } local rep,sub,byte,dump,format=string.rep,string.sub,string.byte,string.dump,string.format -local load,loadfile,type=load,loadfile,type +local load,loadfile,type,collectgarbage=load,loadfile,type,collectgarbage utilities=utilities or {} utilities.lua=utilities.lua or {} local luautilities=utilities.lua local report_lua=logs.reporter("system","lua") +local report_mem=logs.reporter("system","lua memory") local tracestripping=false -local forcestupidcompile=true +local tracememory=false luautilities.stripcode=true luautilities.alwaysstripcode=false luautilities.nofstrippedchunks=0 @@ -9915,11 +10489,19 @@ local function stupidcompile(luafile,lucfile,strip) end return false,0 end -function luautilities.loadedluacode(fullname,forcestrip,name) +function luautilities.loadedluacode(fullname,forcestrip,name,macros) name=name or fullname local code,message - if environment.loadpreprocessedfile then - code,message=environment.loadpreprocessedfile(fullname) + if macros then + macros=lua.macros + end + if macros and macros.enabled then + local f=io.open(fullname,"rb") local c=f:read("*a") f:close() + local n=c and macros.resolvestring("--[["..fullname.."]] "..c) + if n and #n~=#c then + report_lua("preprocessed file %a: %i => %i bytes",fullname,#c,#n) + end + code,message=load(n or c) else code,message=loadfile(fullname) end @@ -9945,7 +10527,7 @@ function luautilities.loadedluacode(fullname,forcestrip,name) return code,0 end end -function luautilities.strippedloadstring(code,forcestrip,name) +function luautilities.strippedloadstring(code,name,forcestrip) local code,message=load(code) if not code then report_lua("loading of file %a failed:\n\t%s",name,message or "no message") @@ -9957,6 +10539,13 @@ function luautilities.strippedloadstring(code,forcestrip,name) return code,0 end end +function luautilities.loadstring(code,name) + local code,message=load(code) + if not code then + report_lua("loading of file %a failed:\n\t%s",name,message or "no message") + end + return code,0 +end function luautilities.compile(luafile,lucfile,cleanup,strip,fallback) report_lua("compiling %a into %a",luafile,lucfile) os.remove(lucfile) @@ -9987,6 +10576,26 @@ setmetatable(finalizers,{ function luautilities.registerfinalizer(f) finalizers[#finalizers+1]=f end +function luautilities.checkmemory(previous,threshold,trace) + local current=collectgarbage("count") + if previous then + local checked=(threshold or 64)*1024 + local delta=current-previous + if current-previous>checked then + collectgarbage("collect") + local afterwards=collectgarbage("count") + if trace or tracememory then + report_mem("previous %i MB, current %i MB, delta %i MB, threshold %i MB, afterwards %i MB", + previous/1024,current/1024,delta/1024,threshold,afterwards) + end + return afterwards + elseif trace or tracememory then + report_mem("previous %i MB, current %i MB, delta %i MB, threshold %i MB", + previous/1024,current/1024,delta/1024,threshold) + end + end + return current +end end -- of closure @@ -9995,7 +10604,7 @@ do -- create closure to overcome 200 locals limit package.loaded["util-deb"] = package.loaded["util-deb"] or true --- original size: 8911, stripped down to: 6504 +-- original size: 8984, stripped down to: 6573 if not modules then modules={} end modules ['util-deb']={ version=1.001, @@ -10121,7 +10730,8 @@ function debugger.showstats(printer,threshold) local functions=0 local dataset={} local length=0 - local wholetime=0 + local realtime=0 + local totaltime=0 local threshold=threshold or 0 for name,sources in next,names do for source,lines in next,sources do @@ -10138,8 +10748,9 @@ function debugger.showstats(printer,threshold) if real<0 then real=0 end - wholetime=wholetime+real + realtime=realtime+real end + totaltime=totaltime+total if line<0 then line=0 end @@ -10174,7 +10785,7 @@ function debugger.showstats(printer,threshold) if length>50 then length=50 end - local fmt=string.formatters["%4.9k %4.9k %3.3k %8i %-"..length.."s %4i %s"] + local fmt=string.formatters["%4.9k s %3.3k %% %4.9k s %3.3k %% %8i # %-"..length.."s %4i %s"] for i=1,#dataset do local data=dataset[i] local real=data[1] @@ -10183,14 +10794,13 @@ function debugger.showstats(printer,threshold) local name=data[4] local source=data[5] local line=data[6] - local percent=real/wholetime calls=calls+count functions=functions+1 name=gsub(name,"%s+"," ") if #name>length then name=sub(name,1,length) end - printer(fmt(seconds(total),seconds(real),percent,count,name,line,source)) + printer(fmt(seconds(total),100*total/totaltime,seconds(real),100*real/realtime,count,name,line,source)) end printer("") printer(format("functions : %i",functions)) @@ -10254,7 +10864,7 @@ do -- create closure to overcome 200 locals limit package.loaded["util-tpl"] = package.loaded["util-tpl"] or true --- original size: 7100, stripped down to: 3978 +-- original size: 7112, stripped down to: 3988 if not modules then modules={} end modules ['util-tpl']={ version=1.001, @@ -10267,7 +10877,7 @@ utilities.templates=utilities.templates or {} local templates=utilities.templates local trace_template=false trackers.register("templates.trace",function(v) trace_template=v end) local report_template=logs.reporter("template") -local tostring=tostring +local tostring,next=tostring,next local format,sub,byte=string.format,string.sub,string.byte local P,C,R,Cs,Cc,Carg,lpegmatch,lpegpatterns=lpeg.P,lpeg.C,lpeg.R,lpeg.Cs,lpeg.Cc,lpeg.Carg,lpeg.match,lpeg.patterns local replacer @@ -10399,7 +11009,7 @@ do -- create closure to overcome 200 locals limit package.loaded["util-sbx"] = package.loaded["util-sbx"] or true --- original size: 20309, stripped down to: 13848 +-- original size: 20393, stripped down to: 13924 if not modules then modules={} end modules ['util-sbx']={ version=1.001, @@ -10424,6 +11034,7 @@ local concat=string.concat local unquoted=string.unquoted local optionalquoted=string.optionalquoted local basename=file.basename +local nameonly=file.nameonly local sandbox=sandbox local validroots={} local validrunners={} @@ -10503,9 +11114,9 @@ local function registerlibrary(name) return end if validlibraries==true then - validlibraries={ [name]=true } + validlibraries={ [nameonly(name)]=true } else - validlibraries[name]=true + validlibraries[nameonly(name)]=true end elseif name==true then validlibraries={} @@ -10780,7 +11391,7 @@ function sandbox.getrunner(name) return name and validrunners[name] end local function suspicious(str) - return (find(str,"[/\\]") or find(command,"%.%.")) and true or false + return (find(str,"[/\\]") or find(command,"..",1,true)) and true or false end local function binaryrunner(action,command,...) if validbinaries==false then @@ -10830,15 +11441,15 @@ if FFISUPPORTED and ffi then end end end - local load=ffi.load - if load then + local fiiload=ffi.load + if fiiload then local reported={} function ffi.load(name,...) if validlibraries==false then elseif validlibraries==true then - return load(name,...) - elseif validlibraries[name] then - return load(name,...) + return fiiload(name,...) + elseif validlibraries[nameonly(name)] then + return fiiload(name,...) else end if not reported[name] then @@ -11083,7 +11694,7 @@ do -- create closure to overcome 200 locals limit package.loaded["util-env"] = package.loaded["util-env"] or true --- original size: 9246, stripped down to: 5038 +-- original size: 9400, stripped down to: 5499 if not modules then modules={} end modules ['util-env']={ version=1.001, @@ -11098,8 +11709,21 @@ local unquoted,quoted,optionalquoted=string.unquoted,string.quoted,string.option local concat,insert,remove=table.concat,table.insert,table.remove environment=environment or {} local environment=environment -os.setlocale(nil,nil) -function os.setlocale() +local setlocale=os.setlocale +setlocale(nil,nil) +local report=logs.reporter("system") +function os.setlocale(a,b) + if a or b then + if report then + report() + report("You're messing with os.locale in a supposedly locale neutral enviroment. From") + report("now on are on your own and without support. Crashes or unexpected side effects") + report("can happen but don't bother the luatex and context developer team with it.") + report() + report=nil + end + setlocale(a,b) + end end local validengines=allocate { ["luatex"]=true, @@ -11270,7 +11894,7 @@ do -- create closure to overcome 200 locals limit package.loaded["luat-env"] = package.loaded["luat-env"] or true --- original size: 6174, stripped down to: 4141 +-- original size: 5820, stripped down to: 4155 if not modules then modules={} end modules ['luat-env']={ version=1.001, @@ -11344,11 +11968,11 @@ local function strippable(filename) return false end end -function environment.luafilechunk(filename,silent) +function environment.luafilechunk(filename,silent,macros) filename=file.replacesuffix(filename,"lua") local fullname=environment.luafile(filename) if fullname and fullname~="" then - local data=luautilities.loadedluacode(fullname,strippable,filename) + local data=luautilities.loadedluacode(fullname,strippable,filename,macros) if not silent then report_lua("loading file %a %s",fullname,not data and "failed" or "succeeded") end @@ -11423,7 +12047,7 @@ do -- create closure to overcome 200 locals limit package.loaded["lxml-tab"] = package.loaded["lxml-tab"] or true --- original size: 57003, stripped down to: 35696 +-- original size: 59638, stripped down to: 37936 if not modules then modules={} end modules ['lxml-tab']={ version=1.001, @@ -11469,8 +12093,17 @@ local entities,parameters local strip,utfize,resolve,cleanup,resolve_predefined,unify_predefined local dcache,hcache,acache local mt,dt,nt +local currentfilename,currentline,linenumbers +local grammar_parsed_text_one +local grammar_parsed_text_two +local grammar_unparsed_text +local handle_hex_entity +local handle_dec_entity +local handle_any_entity_dtd +local handle_any_entity_text local function preparexmlstate(settings) if settings then + linenumbers=settings.linenumbers stack={} level=0 top={} @@ -11487,6 +12120,8 @@ local function preparexmlstate(settings) unify_predefined=settings.unify_predefined_entities cleanup=settings.text_cleanup entities=settings.entities or {} + currentfilename=settings.currentresource + currentline=1 parameters={} reported_at_errors={} dcache={} @@ -11501,6 +12136,7 @@ local function preparexmlstate(settings) resolve_predefined=true end else + linenumbers=false stack=nil level=nil top=nil @@ -11522,6 +12158,8 @@ local function preparexmlstate(settings) dcache=nil hcache=nil acache=nil + currentfilename=nil + currentline=1 end end local function initialize_mt(root) @@ -11559,14 +12197,24 @@ local function add_empty(spacing,namespace,tag) top=stack[level] dt=top.dt nt=#dt+1 - local t={ + local t=linenumbers and { + ns=namespace or "", + rn=resolved, + tg=tag, + at=at, + dt={}, + ni=nt, + cf=currentfilename, + cl=currentline, + __p__=top, + } or { ns=namespace or "", rn=resolved, tg=tag, at=at, dt={}, ni=nt, - __p__=top + __p__=top, } dt[nt]=t setmetatable(t,mt) @@ -11581,18 +12229,28 @@ local function add_begin(spacing,namespace,tag) dt[nt]=spacing end local resolved=namespace=="" and xmlns[#xmlns] or nsremap[namespace] or namespace - top={ + dt={} + top=linenumbers and { ns=namespace or "", rn=resolved, tg=tag, at=at, - dt={}, + dt=dt, + ni=nil, + cf=currentfilename, + cl=currentline, + __p__=stack[level], + } or { + ns=namespace or "", + rn=resolved, + tg=tag, + at=at, + dt=dt, ni=nil, - __p__=stack[level] + __p__=stack[level], } setmetatable(top,mt) - dt=top.dt - nt=#dt + nt=0 level=level+1 stack[level]=top at={} @@ -11660,7 +12318,15 @@ local function add_special(what,spacing,text) if strip and (what=="@cm@" or what=="@dt@") then else nt=nt+1 - dt[nt]={ + dt[nt]=linenumbers and { + special=true, + ns="", + tg=what, + ni=nil, + dt={ text }, + cf=currentfilename, + cl=currentline, + } or { special=true, ns="", tg=what, @@ -11688,12 +12354,6 @@ local function attribute_specification_error(str) end return str end -local grammar_parsed_text_one -local grammar_parsed_text_two -local handle_hex_entity -local handle_dec_entity -local handle_any_entity_dtd -local handle_any_entity_text do local badentity="&" xml.placeholders={ @@ -12095,7 +12755,13 @@ local function handle_crap_error(chr) add_text(chr) return chr end +local function handlenewline() + currentline=currentline+1 +end +local spacetab=S(' \t') local space=S(' \r\n\t') +local newline=lpegpatterns.newline/handlenewline +local anything=P(1) local open=P('<') local close=P('>') local squote=S("'") @@ -12111,43 +12777,9 @@ local name_nop=C(P(true))*C(valid^1) local name=name_yes+name_nop local utfbom=lpegpatterns.utfbom local spacing=C(space^0) -local anyentitycontent=(1-open-semicolon-space-close-ampersand)^0 -local hexentitycontent=R("AF","af","09")^1 -local decentitycontent=R("09")^1 -local parsedentity=P("#")/""*( - P("x")/""*(hexentitycontent/handle_hex_entity)+(decentitycontent/handle_dec_entity) - )+(anyentitycontent/handle_any_entity_dtd) -local parsedentity_text=P("#")/""*( - P("x")/""*(hexentitycontent/handle_hex_entity)+(decentitycontent/handle_dec_entity) - )+(anyentitycontent/handle_any_entity_text) -local entity=(ampersand/"")*parsedentity*(semicolon/"")+ampersand*(anyentitycontent/handle_end_entity) -local entity_text=(ampersand/"")*parsedentity_text*(semicolon/"")+ampersand*(anyentitycontent/handle_end_entity) -local text_unparsed=C((1-open)^1) -local text_parsed=(Cs((1-open-ampersand)^1)/add_text+Cs(entity_text)/add_text)^1 -local somespace=space^1 -local optionalspace=space^0 -local value=(squote*Cs((entity+(1-squote))^0)*squote)+(dquote*Cs((entity+(1-dquote))^0)*dquote) -local endofattributes=slash*close+close -local whatever=space*name*optionalspace*equal -local wrongvalue=Cs(P(entity+(1-space-endofattributes))^1)/attribute_value_error -local attributevalue=value+wrongvalue -local attribute=(somespace*name*optionalspace*equal*optionalspace*attributevalue)/add_attribute -local attributes=(attribute+somespace^-1*(((1-endofattributes)^1)/attribute_specification_error))^0 -local parsedtext=text_parsed -local unparsedtext=text_unparsed/add_text -local balanced=P { "["*((1-S"[]")+V(1))^0*"]" } -local emptyelement=(spacing*open*name*attributes*optionalspace*slash*close)/add_empty -local beginelement=(spacing*open*name*attributes*optionalspace*close)/add_begin -local endelement=(spacing*open*slash*name*optionalspace*close)/add_end -local begincomment=open*P("!--") -local endcomment=P("--")*close -local begininstruction=open*P("?") -local endinstruction=P("?")*close -local begincdata=open*P("![CDATA[") -local endcdata=P("]]")*close -local someinstruction=C((1-endinstruction)^0) -local somecomment=C((1-endcomment )^0) -local somecdata=C((1-endcdata )^0) +local space_nl=spacetab+newline +local spacing_nl=Cs((space_nl)^0) +local anything_nl=newline+P(1) local function weirdentity(k,v) if trace_entities then report_xml("registering %s entity %a as %a","weird",k,v) @@ -12172,59 +12804,114 @@ local function publicentity(k,v,n) end entities[k]=v end -local begindoctype=open*P("!DOCTYPE") -local enddoctype=close -local beginset=P("[") -local endset=P("]") -local wrdtypename=C((1-somespace-P(";"))^1) -local doctypename=C((1-somespace-close)^0) -local elementdoctype=optionalspace*P("<!ELEMENT")*(1-close)^0*close -local basiccomment=begincomment*((1-endcomment)^0)*endcomment -local weirdentitytype=P("%")*(somespace*doctypename*somespace*value)/weirdentity -local normalentitytype=(doctypename*somespace*value)/normalentity -local publicentitytype=(doctypename*somespace*P("PUBLIC")*somespace*value)/publicentity -local systementitytype=(doctypename*somespace*P("SYSTEM")*somespace*value*somespace*P("NDATA")*somespace*doctypename)/systementity -local entitydoctype=optionalspace*P("<!ENTITY")*somespace*(systementitytype+publicentitytype+normalentitytype+weirdentitytype)*optionalspace*close -local function weirdresolve(s) - lpegmatch(entitydoctype,parameters[s]) -end -local function normalresolve(s) - lpegmatch(entitydoctype,entities[s]) -end -local entityresolve=P("%")*(wrdtypename/weirdresolve )*P(";")+P("&")*(wrdtypename/normalresolve)*P(";") -entitydoctype=entitydoctype+entityresolve -local doctypeset=beginset*optionalspace*P(elementdoctype+entitydoctype+entityresolve+basiccomment+space)^0*optionalspace*endset -local definitiondoctype=doctypename*somespace*doctypeset -local publicdoctype=doctypename*somespace*P("PUBLIC")*somespace*value*somespace*value*somespace*doctypeset -local systemdoctype=doctypename*somespace*P("SYSTEM")*somespace*value*somespace*doctypeset -local simpledoctype=(1-close)^1 -local somedoctype=C((somespace*(publicdoctype+systemdoctype+definitiondoctype+simpledoctype)*optionalspace)^0) -local instruction=(spacing*begininstruction*someinstruction*endinstruction)/function(...) add_special("@pi@",...) end -local comment=(spacing*begincomment*somecomment*endcomment )/function(...) add_special("@cm@",...) end -local cdata=(spacing*begincdata*somecdata*endcdata )/function(...) add_special("@cd@",...) end -local doctype=(spacing*begindoctype*somedoctype*enddoctype )/function(...) add_special("@dt@",...) end -local crap_parsed=1-beginelement-endelement-emptyelement-begininstruction-begincomment-begincdata-ampersand -local crap_unparsed=1-beginelement-endelement-emptyelement-begininstruction-begincomment-begincdata -local parsedcrap=Cs((crap_parsed^1+entity_text)^1)/handle_crap_error -local parsedcrap=Cs((crap_parsed^1+entity_text)^1)/handle_crap_error -local unparsedcrap=Cs((crap_unparsed )^1)/handle_crap_error -local trailer=space^0*(text_unparsed/set_message)^0 -grammar_parsed_text_one=P { "preamble", - preamble=utfbom^0*instruction^0*(doctype+comment+instruction)^0, -} -grammar_parsed_text_two=P { "followup", - followup=V("parent")*trailer, - parent=beginelement*V("children")^0*endelement, - children=parsedtext+V("parent")+emptyelement+comment+cdata+instruction+parsedcrap, -} -local grammar_unparsed_text=P { "preamble", - preamble=utfbom^0*instruction^0*(doctype+comment+instruction)^0*V("parent")*trailer, - parent=beginelement*V("children")^0*endelement, - children=unparsedtext+V("parent")+emptyelement+comment+cdata+instruction+unparsedcrap, -} -local function _xmlconvert_(data,settings) +local function install(spacenewline,spacing,anything) + local anyentitycontent=(1-open-semicolon-space-close-ampersand)^0 + local hexentitycontent=R("AF","af","09")^1 + local decentitycontent=R("09")^1 + local parsedentity=P("#")/""*( + P("x")/""*(hexentitycontent/handle_hex_entity)+(decentitycontent/handle_dec_entity) + )+(anyentitycontent/handle_any_entity_dtd) + local parsedentity_text=P("#")/""*( + P("x")/""*(hexentitycontent/handle_hex_entity)+(decentitycontent/handle_dec_entity) + )+(anyentitycontent/handle_any_entity_text) + local entity=(ampersand/"")*parsedentity*(semicolon/"")+ampersand*(anyentitycontent/handle_end_entity) + local entity_text=(ampersand/"")*parsedentity_text*(semicolon/"")+ampersand*(anyentitycontent/handle_end_entity) + local text_unparsed=Cs((anything-open)^1) + local text_parsed=(Cs((anything-open-ampersand)^1)/add_text+Cs(entity_text)/add_text)^1 + local somespace=(spacenewline)^1 + local optionalspace=(spacenewline)^0 + local value=(squote*Cs((entity+(anything-squote))^0)*squote)+(dquote*Cs((entity+(anything-dquote))^0)*dquote) + local endofattributes=slash*close+close + local whatever=space*name*optionalspace*equal + local wrongvalue=Cs(P(entity+(1-space-endofattributes))^1)/attribute_value_error + local attributevalue=value+wrongvalue + local attribute=(somespace*name*optionalspace*equal*optionalspace*attributevalue)/add_attribute + local attributes=(attribute+somespace^-1*(((anything-endofattributes)^1)/attribute_specification_error))^0 + local parsedtext=text_parsed + local unparsedtext=text_unparsed/add_text + local balanced=P { "["*((anything-S"[]")+V(1))^0*"]" } + local emptyelement=(spacing*open*name*attributes*optionalspace*slash*close)/add_empty + local beginelement=(spacing*open*name*attributes*optionalspace*close)/add_begin + local endelement=(spacing*open*slash*name*optionalspace*close)/add_end + local begincomment=open*P("!--") + local endcomment=P("--")*close + local begininstruction=open*P("?") + local endinstruction=P("?")*close + local begincdata=open*P("![CDATA[") + local endcdata=P("]]")*close + local someinstruction=C((anything-endinstruction)^0) + local somecomment=C((anything-endcomment )^0) + local somecdata=C((anything-endcdata )^0) + local begindoctype=open*P("!DOCTYPE") + local enddoctype=close + local beginset=P("[") + local endset=P("]") + local wrdtypename=C((anything-somespace-P(";"))^1) + local doctypename=C((anything-somespace-close)^0) + local elementdoctype=optionalspace*P("<!ELEMENT")*(anything-close)^0*close + local basiccomment=begincomment*((anything-endcomment)^0)*endcomment + local weirdentitytype=P("%")*(somespace*doctypename*somespace*value)/weirdentity + local normalentitytype=(doctypename*somespace*value)/normalentity + local publicentitytype=(doctypename*somespace*P("PUBLIC")*somespace*value)/publicentity + local systementitytype=(doctypename*somespace*P("SYSTEM")*somespace*value*somespace*P("NDATA")*somespace*doctypename)/systementity + local entitydoctype=optionalspace*P("<!ENTITY")*somespace*(systementitytype+publicentitytype+normalentitytype+weirdentitytype)*optionalspace*close + local function weirdresolve(s) + lpegmatch(entitydoctype,parameters[s]) + end + local function normalresolve(s) + lpegmatch(entitydoctype,entities[s]) + end + local entityresolve=P("%")*(wrdtypename/weirdresolve )*P(";")+P("&")*(wrdtypename/normalresolve)*P(";") + entitydoctype=entitydoctype+entityresolve + local doctypeset=beginset*optionalspace*P(elementdoctype+entitydoctype+entityresolve+basiccomment+space)^0*optionalspace*endset + local definitiondoctype=doctypename*somespace*doctypeset + local publicdoctype=doctypename*somespace*P("PUBLIC")*somespace*value*somespace*value*somespace*doctypeset + local systemdoctype=doctypename*somespace*P("SYSTEM")*somespace*value*somespace*doctypeset + local simpledoctype=(anything-close)^1 + local somedoctype=C((somespace*(publicdoctype+systemdoctype+definitiondoctype+simpledoctype)*optionalspace)^0) + local instruction=(spacing*begininstruction*someinstruction*endinstruction)/function(...) add_special("@pi@",...) end + local comment=(spacing*begincomment*somecomment*endcomment )/function(...) add_special("@cm@",...) end + local cdata=(spacing*begincdata*somecdata*endcdata )/function(...) add_special("@cd@",...) end + local doctype=(spacing*begindoctype*somedoctype*enddoctype )/function(...) add_special("@dt@",...) end + local crap_parsed=anything-beginelement-endelement-emptyelement-begininstruction-begincomment-begincdata-ampersand + local crap_unparsed=anything-beginelement-endelement-emptyelement-begininstruction-begincomment-begincdata + local parsedcrap=Cs((crap_parsed^1+entity_text)^1)/handle_crap_error + local parsedcrap=Cs((crap_parsed^1+entity_text)^1)/handle_crap_error + local unparsedcrap=Cs((crap_unparsed )^1)/handle_crap_error + local trailer=space^0*(text_unparsed/set_message)^0 + local grammar_parsed_text_one=P { "preamble", + preamble=utfbom^0*instruction^0*(doctype+comment+instruction)^0, + } + local grammar_parsed_text_two=P { "followup", + followup=V("parent")*trailer, + parent=beginelement*V("children")^0*endelement, + children=parsedtext+V("parent")+emptyelement+comment+cdata+instruction+parsedcrap, + } + local grammar_unparsed_text=P { "preamble", + preamble=utfbom^0*instruction^0*(doctype+comment+instruction)^0*V("parent")*trailer, + parent=beginelement*V("children")^0*endelement, + children=unparsedtext+V("parent")+emptyelement+comment+cdata+instruction+unparsedcrap, + } + return grammar_parsed_text_one,grammar_parsed_text_two,grammar_unparsed_text +end +grammar_parsed_text_one_nop, +grammar_parsed_text_two_nop, +grammar_unparsed_text_nop=install(space,spacing,anything) +grammar_parsed_text_one_yes, +grammar_parsed_text_two_yes, +grammar_unparsed_text_yes=install(space_nl,spacing_nl,anything_nl) +local function _xmlconvert_(data,settings,detail) settings=settings or {} preparexmlstate(settings) + if settings.linenumbers then + grammar_parsed_text_one=grammar_parsed_text_one_yes + grammar_parsed_text_two=grammar_parsed_text_two_yes + grammar_unparsed_text=grammar_unparsed_text_yes + else + grammar_parsed_text_one=grammar_parsed_text_one_nop + grammar_parsed_text_two=grammar_parsed_text_two_nop + grammar_unparsed_text=grammar_unparsed_text_nop + end local preprocessor=settings.preprocessor if data and data~="" and type(preprocessor)=="function" then data=preprocessor(data,settings) or data @@ -12241,6 +12928,8 @@ local function _xmlconvert_(data,settings) nt=0 if not data or data=="" then errorstr="empty xml file" + elseif data==true then + errorstr=detail or "problematic xml file" elseif utfize or resolve then local m=lpegmatch(grammar_parsed_text_one,data) if m then @@ -12272,7 +12961,7 @@ local function _xmlconvert_(data,settings) if errorhandler then local currentresource=settings.currentresource if currentresource and currentresource~="" then - xml.errorhandler(formatters["load error in [%s]: %s"](currentresource,errorstr)) + xml.errorhandler(formatters["load error in [%s]: %s"](currentresource,errorstr),currentresource) else xml.errorhandler(formatters["load error: %s"](errorstr)) end @@ -12315,8 +13004,10 @@ local function xmlconvert(data,settings) local ok,result=pcall(function() return _xmlconvert_(data,settings) end) if ok then return result + elseif type(result)=="string" then + return _xmlconvert_(true,settings,result) else - return _xmlconvert_("",settings) + return _xmlconvert_(true,settings) end end xml.convert=xmlconvert @@ -13945,7 +14636,7 @@ do -- create closure to overcome 200 locals limit package.loaded["lxml-mis"] = package.loaded["lxml-mis"] or true --- original size: 3684, stripped down to: 1957 +-- original size: 3574, stripped down to: 1863 if not modules then modules={} end modules ['lxml-mis']={ version=1.001, @@ -13955,8 +14646,8 @@ if not modules then modules={} end modules ['lxml-mis']={ license="see context related readme files" } local xml,lpeg,string=xml,lpeg,string +local type=type local concat=table.concat -local type,next,tonumber,tostring,setmetatable,loadstring=type,next,tonumber,tostring,setmetatable,loadstring local format,gsub,match=string.format,string.gsub,string.match local lpegmatch,lpegpatterns=lpeg.match,lpeg.patterns local P,S,R,C,V,Cc,Cs=lpeg.P,lpeg.S,lpeg.R,lpeg.C,lpeg.V,lpeg.Cc,lpeg.Cs @@ -14014,7 +14705,7 @@ do -- create closure to overcome 200 locals limit package.loaded["lxml-aux"] = package.loaded["lxml-aux"] or true --- original size: 29835, stripped down to: 21174 +-- original size: 30650, stripped down to: 21793 if not modules then modules={} end modules ['lxml-aux']={ version=1.001, @@ -14034,7 +14725,7 @@ local type,next,setmetatable,getmetatable=type,next,setmetatable,getmetatable local insert,remove,fastcopy,concat=table.insert,table.remove,table.fastcopy,table.concat local gmatch,gsub,format,find,strip=string.gmatch,string.gsub,string.format,string.find,string.strip local utfbyte=utf.byte -local lpegmatch=lpeg.match +local lpegmatch,lpegpatterns=lpeg.match,lpeg.patterns local striplinepatterns=utilities.strings.striplinepatterns local function report(what,pattern,c,e) report_xml("%s element %a, root %a, position %a, index %a, pattern %a",what,xmlname(e),xmlname(e.__p__),c,e.ni,pattern) @@ -14375,7 +15066,9 @@ local function include(xmldata,pattern,attribute,recursive,loaddata,level) end local data=nil if name and name~="" then - data=loaddata(name) or "" + local d,n=loaddata(name) + data=d or "" + name=n or name if trace_inclusions then report_xml("including %s bytes from %a at level %s by pattern %a and attribute %a (%srecursing)",#data,name,level,pattern,attribute or "",recursive and "" or "not ") end @@ -14385,6 +15078,9 @@ local function include(xmldata,pattern,attribute,recursive,loaddata,level) elseif ekat["parse"]=="text" then epdt[ek.ni]=xml.escaped(data) else +local settings=xmldata.settings +local savedresource=settings.currentresource +settings.currentresource=name local xi=xmlinheritedconvert(data,xmldata) if not xi then epdt[ek.ni]="" @@ -14395,6 +15091,7 @@ local function include(xmldata,pattern,attribute,recursive,loaddata,level) local child=xml.body(xi) child.__p__=ekrt child.__f__=name +child.cf=name epdt[ek.ni]=child local settings=xmldata.settings local inclusions=settings and settings.inclusions @@ -14415,6 +15112,7 @@ local function include(xmldata,pattern,attribute,recursive,loaddata,level) end end end +settings.currentresource=savedresource end end end @@ -14458,13 +15156,12 @@ end function xml.badinclusions(e,sorted) return getinclusions("badinclusions",e,sorted) end -local b_collapser=lpeg.patterns.b_collapser -local m_collapser=lpeg.patterns.m_collapser -local e_collapser=lpeg.patterns.e_collapser -local b_stripper=lpeg.patterns.b_stripper -local m_stripper=lpeg.patterns.m_stripper -local e_stripper=lpeg.patterns.e_stripper -local lpegmatch=lpeg.match +local b_collapser=lpegpatterns.b_collapser +local m_collapser=lpegpatterns.m_collapser +local e_collapser=lpegpatterns.e_collapser +local b_stripper=lpegpatterns.b_stripper +local m_stripper=lpegpatterns.m_stripper +local e_stripper=lpegpatterns.e_stripper local function stripelement(e,nolines,anywhere) local edt=e.dt if edt then @@ -14876,6 +15573,27 @@ function xml.totable(x,strip,flat) return convert(x,strip,flat) end end +function xml.rename(e,namespace,name,attributes) + if type(e)~="table" or not e.tg then + return + end + if type(name)=="table" then + attributes=name + name=namespace + namespace="" + elseif type(name)~="string" then + attributes={} + name=namespace + namespace="" + end + if type(attributes)~="table" then + attributes={} + end + e.ns=namespace + e.rn=namespace + e.tg=name + e.at=attributes +end end -- of closure @@ -14884,7 +15602,7 @@ do -- create closure to overcome 200 locals limit package.loaded["lxml-xml"] = package.loaded["lxml-xml"] or true --- original size: 10274, stripped down to: 7538 +-- original size: 10412, stripped down to: 7669 if not modules then modules={} end modules ['lxml-xml']={ version=1.001, @@ -14893,6 +15611,7 @@ if not modules then modules={} end modules ['lxml-xml']={ copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" } +local tonumber,next=tonumber,next local concat=table.concat local find,lower,upper=string.find,string.lower,string.upper local xml=xml @@ -15012,6 +15731,9 @@ local function xmltotext(root) return xmlserialize(root,xmltexthandler) or "" end end +function xml.serializetotext(root) + return root and xmlserialize(root,xmltexthandler) or "" +end local function text(collected) if collected then local e=collected[1] or collected @@ -15684,7 +16406,7 @@ do -- create closure to overcome 200 locals limit package.loaded["data-exp"] = package.loaded["data-exp"] or true --- original size: 17958, stripped down to: 10705 +-- original size: 18105, stripped down to: 11207 if not modules then modules={} end modules ['data-exp']={ version=1.001, @@ -15883,38 +16605,41 @@ local nofscans=0 local scancache={} local fullcache={} local nofsharedscans=0 +local addcasecraptoo=true local function scan(files,remap,spec,path,n,m,r,onlyone,tolerant) local full=path=="" and spec or (spec..path..'/') - local dirs={} + local dirlist={} local nofdirs=0 local pattern=tolerant and lessweird or weird + local filelist={} + local noffiles=0 for name in directory(full) do if not lpegmatch(pattern,name) then local mode=attributes(full..name,"mode") if mode=="file" then n=n+1 - local lower=lower(name) - local paths=files[lower] - if paths then - if onlyone then - else - if type(paths)=="string" then - files[lower]={ paths,path } - else - paths[#paths+1]=path - end - if name~=lower then - local rl=remap[lower] - if not rl then - remap[lower]=name - r=r+1 - elseif trace_globbing and rl~=name then - report_globbing("confusing filename, name: %a, lower: %a, already: %a",name,lower,rl) - end - end - end - else - files[lower]=path + noffiles=noffiles+1 + filelist[noffiles]=name + elseif mode=="directory" then + m=m+1 + nofdirs=nofdirs+1 + if path~="" then + dirlist[nofdirs]=path.."/"..name + else + dirlist[nofdirs]=name + end + end + end + end + if noffiles>0 then + sort(filelist) + for i=1,noffiles do + local name=filelist[i] + local lower=lower(name) + local paths=files[lower] + if paths then + if onlyone then + else if name~=lower then local rl=remap[lower] if not rl then @@ -15923,23 +16648,41 @@ local function scan(files,remap,spec,path,n,m,r,onlyone,tolerant) elseif trace_globbing and rl~=name then report_globbing("confusing filename, name: %a, lower: %a, already: %a",name,lower,rl) end + if addcasecraptoo then + local paths=files[name] + if not paths then + files[name]=path + elseif type(paths)=="string" then + files[name]={ paths,path } + else + paths[#paths+1]=path + end + end + end + if type(paths)=="string" then + files[lower]={ paths,path } + else + paths[#paths+1]=path end end - elseif mode=="directory" then - m=m+1 - nofdirs=nofdirs+1 - if path~="" then - dirs[nofdirs]=path.."/"..name - else - dirs[nofdirs]=name + else + files[lower]=path + if name~=lower then + local rl=remap[lower] + if not rl then + remap[lower]=name + r=r+1 + elseif trace_globbing and rl~=name then + report_globbing("confusing filename, name: %a, lower: %a, already: %a",name,lower,rl) + end end end end end if nofdirs>0 then - sort(dirs) + sort(dirlist) for i=1,nofdirs do - files,remap,n,m,r=scan(files,remap,spec,dirs[i],n,m,r,onlyonce,tolerant) + files,remap,n,m,r=scan(files,remap,spec,dirlist[i],n,m,r,onlyonce,tolerant) end end scancache[sub(full,1,-2)]=files @@ -16068,7 +16811,7 @@ do -- create closure to overcome 200 locals limit package.loaded["data-env"] = package.loaded["data-env"] or true --- original size: 9342, stripped down to: 6887 +-- original size: 9360, stripped down to: 6903 if not modules then modules={} end modules ['data-env']={ version=1.001, @@ -16078,6 +16821,7 @@ if not modules then modules={} end modules ['data-env']={ license="see context related readme files", } local lower,gsub=string.lower,string.gsub +local next=next local resolvers=resolvers local allocate=utilities.storage.allocate local setmetatableindex=table.setmetatableindex @@ -16352,7 +17096,7 @@ do -- create closure to overcome 200 locals limit package.loaded["data-tmp"] = package.loaded["data-tmp"] or true --- original size: 16088, stripped down to: 11435 +-- original size: 16116, stripped down to: 11459 if not modules then modules={} end modules ['data-tmp']={ version=1.100, @@ -16366,6 +17110,7 @@ local concat=table.concat local mkdirs,isdir,isfile=dir.mkdirs,lfs.isdir,lfs.isfile local addsuffix,is_writable,is_readable=file.addsuffix,file.is_writable,file.is_readable local formatters=string.formatters +local next,type=next,type local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end) local trace_cache=false trackers.register("resolvers.cache",function(v) trace_cache=v end) local report_caches=logs.reporter("resolvers","caches") @@ -16500,7 +17245,7 @@ function caches.usedpaths(separator) end end function caches.configfiles() - return concat(resolvers.instance.specification,";") + return concat(resolvers.configurationfiles(),";") end function caches.hashed(tree) tree=gsub(tree,"[\\/]+$","") @@ -16838,7 +17583,7 @@ do -- create closure to overcome 200 locals limit package.loaded["data-res"] = package.loaded["data-res"] or true --- original size: 67524, stripped down to: 46632 +-- original size: 68263, stripped down to: 47789 if not modules then modules={} end modules ['data-res']={ version=1.001, @@ -16912,8 +17657,7 @@ local usertypes=resolvers.usertypes local dangerous=resolvers.dangerous local suffixmap=resolvers.suffixmap resolvers.defaultsuffixes={ "tex" } -resolvers.instance=resolvers.instance or nil -local instance=resolvers.instance or nil +local instance=nil function resolvers.setenv(key,value,raw) if instance then instance.environment[key]=value @@ -16948,27 +17692,30 @@ local variableresolver=Cs((variable+P(1))^0) local function expandedvariable(var) return lpegmatch(variableexpander,var) or var end -function resolvers.newinstance() +function resolvers.reset() if trace_locating then report_resolving("creating instance") end - local environment,variables,expansions,order=allocate(),allocate(),allocate(),allocate() - local newinstance={ + local environment={} + local variables={} + local expansions={} + local order={} + instance={ environment=environment, variables=variables, expansions=expansions, order=order, - files=allocate(), - setups=allocate(), - found=allocate(), - foundintrees=allocate(), - hashes=allocate(), - hashed=allocate(), + files={}, + setups={}, + found={}, + foundintrees={}, + hashes={}, + hashed={}, pathlists=false, - specification=allocate(), - lists=allocate(), - data=allocate(), - fakepaths=allocate(), + specification={}, + lists={}, + data={}, + fakepaths={}, remember=true, diskcache=true, renewcache=false, @@ -17015,15 +17762,9 @@ function resolvers.newinstance() t[k]=v return v end) - return newinstance -end -function resolvers.setinstance(someinstance) - instance=someinstance - resolvers.instance=someinstance - return someinstance end -function resolvers.reset() - return resolvers.setinstance(resolvers.newinstance()) +function resolvers.initialized() + return instance~=nil end local function reset_hashes() instance.lists={} @@ -17192,8 +17933,12 @@ local function load_configuration_files() report_resolving("warning: no lua configuration files found") end end +function resolvers.configurationfiles() + return instance.specification or {} +end local function load_file_databases() - instance.loaderror,instance.files=false,allocate() + instance.loaderror=false + instance.files={} if not instance.renewcache then local hashes=instance.hashes for k=1,#hashes do @@ -17404,7 +18149,7 @@ function resolvers.stackpath() return currentpath~="" and currentpath or nil end local done={} -function resolvers.resetextrapath() +function resolvers.resetextrapaths() local ep=instance.extra_paths if not ep then done={} @@ -17414,6 +18159,9 @@ function resolvers.resetextrapath() reset_caches() end end +function resolvers.getextrapaths() + return instance.extra_paths or {} +end function resolvers.registerextrapath(paths,subpaths) if not subpaths or subpaths=="" then if not paths or path=="" then @@ -17573,9 +18321,8 @@ function resolvers.cleanedpathlist(v) end return t end -function resolvers.expandbraces(str) - local ori=str - local pth=expandedpathfromlist(resolvers.splitpath(ori)) +function resolvers.expandbraces(str) + local pth=expandedpathfromlist(resolvers.splitpath(str)) return joinpath(pth) end function resolvers.registerfilehash(name,content,someerror) @@ -17588,6 +18335,17 @@ function resolvers.registerfilehash(name,content,someerror) end end end +function resolvers.getfilehashes() + return instance and instance.files or {} +end +function resolvers.gethashes() + return instance and instance.hashes or {} +end +function resolvers.renewcache() + if instance then + instance.renewcache=true + end +end local function isreadable(name) local readable=isfile(name) if trace_detail then @@ -17602,7 +18360,7 @@ end local function collect_files(names) local filelist={} local noffiles=0 - local function check(hash,root,pathname,path,name) + local function check(hash,root,pathname,path,basename,name) if not pathname or find(path,pathname) then local variant=hash.type local search=filejoin(root,path,name) @@ -17641,10 +18399,10 @@ local function collect_files(names) local metadata=content.metadata local realroot=metadata and metadata.path or hashname if type(path)=="string" then - check(hash,realroot,pathname,path,name) + check(hash,realroot,pathname,path,basename,name) else for i=1,#path do - check(hash,realroot,pathname,path[i],name) + check(hash,realroot,pathname,path[i],basename,name) end end end @@ -17660,17 +18418,26 @@ function resolvers.registerintrees(filename,format,filetype,usedmethod,foundname local foundintrees=instance.foundintrees if usedmethod=="direct" and filename==foundname and fit[foundname] then else + local collapsed=collapsepath(foundname,true) local t={ filename=filename, - format=format~="" and format or nil, + format=format~="" and format or nil, filetype=filetype~="" and filetype or nil, usedmethod=usedmethod, foundname=foundname, + fullname=collapsed, } fit[foundname]=t foundintrees[#foundintrees+1]=t end end +function resolvers.foundintrees() + return instance.foundintrees or {} +end +function resolvers.foundintree(fullname) + local f=fit[fullname] + return f and f.usedmethod=="database" +end local function can_be_dir(name) local fakepaths=instance.fakepaths if not fakepaths[name] then @@ -17685,10 +18452,12 @@ end local preparetreepattern=Cs((P(".")/"%%."+P("-")/"%%-"+P(1))^0*Cc("$")) local collect_instance_files local function find_analyze(filename,askedformat,allresults) - local filetype,wantedfiles,ext='',{},suffixonly(filename) + local filetype='' + local filesuffix=suffixonly(filename) + local wantedfiles={} wantedfiles[#wantedfiles+1]=filename if askedformat=="" then - if ext=="" or not suffixmap[ext] then + if filesuffix=="" or not suffixmap[filesuffix] then local defaultsuffixes=resolvers.defaultsuffixes local formatofsuffix=resolvers.formatofsuffix for i=1,#defaultsuffixes do @@ -17706,7 +18475,7 @@ local function find_analyze(filename,askedformat,allresults) end end else - if ext=="" or not suffixmap[ext] then + if filesuffix=="" or not suffixmap[filesuffix] then local format_suffixes=suffixes[askedformat] if format_suffixes then for i=1,#format_suffixes do @@ -17851,7 +18620,7 @@ end local function find_intree(filename,filetype,wantedfiles,allresults) local pathlists=instance.pathlists if not pathlists then - pathlists=setmetatableindex(allocate(),makepathlist) + pathlists=setmetatableindex({},makepathlist) instance.pathlists=pathlists end local pathlist=pathlists[filetype] @@ -18254,15 +19023,21 @@ function resolvers.findwildcardfile(filename) end function resolvers.automount() end -function resolvers.load(option) +function resolvers.starttiming() statistics.starttiming(instance) +end +function resolvers.stoptiming() + statistics.stoptiming(instance) +end +function resolvers.load(option) + resolvers.starttiming() identify_configuration_files() load_configuration_files() if option~="nofiles" then load_databases() resolvers.automount() end - statistics.stoptiming(instance) + resolvers.stoptiming() local files=instance.files return files and next(files) and true end @@ -18354,7 +19129,6 @@ function resolvers.booleanvariable(str,default) end end function resolvers.dowithfilesintree(pattern,handle,before,after) - local instance=resolvers.instance local hashes=instance.hashes for i=1,#hashes do local hash=hashes[i] @@ -18392,6 +19166,31 @@ local obsolete=resolvers.obsolete or {} resolvers.obsolete=obsolete resolvers.find_file=resolvers.findfile obsolete.find_file=resolvers.findfile resolvers.find_files=resolvers.findfiles obsolete.find_files=resolvers.findfiles +function resolvers.knownvariables(pattern) + if instance then + local environment=instance.environment + local variables=instance.variables + local expansions=instance.expansions + local order=instance.order + local pattern=upper(pattern or "") + local result={} + for i=1,#order do + for key in next,order[i] do + if result[key]==nil and key~="" and (pattern=="" or find(upper(key),pattern)) then + result[key]={ + environment=rawget(environment,key), + variable=key, + expansion=expansions[key], + resolved=resolveprefix(expansions[key]), + } + end + end + end + return result + else + return {} + end +end end -- of closure @@ -18802,7 +19601,7 @@ do -- create closure to overcome 200 locals limit package.loaded["data-use"] = package.loaded["data-use"] or true --- original size: 4045, stripped down to: 3110 +-- original size: 4272, stripped down to: 3289 if not modules then modules={} end modules ['data-use']={ version=1.001, @@ -18822,7 +19621,7 @@ function resolvers.automount(usecache) mountpaths=caches.getreadablepaths("mount") end if mountpaths and #mountpaths>0 then - statistics.starttiming(resolvers.instance) + resolvers.starttiming() for k=1,#mountpaths do local root=mountpaths[k] local f=io.open(root.."/url.tmi") @@ -18842,7 +19641,7 @@ function resolvers.automount(usecache) f:close() end end - statistics.stoptiming(resolvers.instance) + resolvers.stoptiming() end end statistics.register("used config file",function() return caches.configfiles() end) @@ -18856,6 +19655,7 @@ function statistics.savefmtstatus(texname,formatbanner,sourcefile,kind,banner) formatbanner=formatbanner, sourcehash=md5.hex(io.loaddata(resolvers.findfile(sourcefile)) or "unknown"), sourcefile=sourcefile, + luaversion=LUAVERSION, } io.savedata(luvname,table.serialize(luvdata,true)) lua.registerfinalizer(function() @@ -18880,6 +19680,10 @@ function statistics.checkfmtstatus(texname) if luvhash~=sourcehash then return format("source mismatch (luv: %s <> bin: %s)",luvhash,sourcehash) end + local luvluaversion=luv.luaversion or 0 + if luvluaversion~=LUAVERSION then + return format("lua mismatch (luv: %s <> bin: %s)",luvluaversion,LUAVERSION) + end else return "invalid status file" end @@ -18897,7 +19701,7 @@ do -- create closure to overcome 200 locals limit package.loaded["data-zip"] = package.loaded["data-zip"] or true --- original size: 8772, stripped down to: 6841 +-- original size: 8716, stripped down to: 6795 if not modules then modules={} end modules ['data-zip']={ version=1.001, @@ -19070,17 +19874,16 @@ function resolvers.usezipfile(archive) if archive and not registeredfiles[archive] then local z=zip.openarchive(archive) if z then - local instance=resolvers.instance local tree=url.query(specification.query).tree or "" if trace_locating then report_zip("registering: archive %a",archive) end - statistics.starttiming(instance) + resolvers.starttiming() resolvers.prependhash('zip',archive) resolvers.extendtexmfvariable(archive) registeredfiles[archive]=z - instance.files[archive]=resolvers.registerzipfile(z,tree) - statistics.stoptiming(instance) + resolvers.registerfilehash(archive,resolvers.registerzipfile(z,tree)) + resolvers.stoptiming() elseif trace_locating then report_zip("registering: unknown archive %a",archive) end @@ -19323,7 +20126,7 @@ do -- create closure to overcome 200 locals limit package.loaded["data-sch"] = package.loaded["data-sch"] or true --- original size: 6653, stripped down to: 5467 +-- original size: 6753, stripped down to: 5511 if not modules then modules={} end modules ['data-sch']={ version=1.001, @@ -19332,13 +20135,14 @@ if not modules then modules={} end modules ['data-sch']={ copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" } -local load=load +local load,tonumber=load,tonumber local gsub,concat,format=string.gsub,table.concat,string.format local finders,openers,loaders=resolvers.finders,resolvers.openers,resolvers.loaders local trace_schemes=false trackers.register("resolvers.schemes",function(v) trace_schemes=v end) local report_schemes=logs.reporter("resolvers","schemes") local http=require("socket.http") local ltn12=require("ltn12") +if mbox then mbox=nil end local resolvers=resolvers local schemes=resolvers.schemes or {} resolvers.schemes=schemes @@ -19378,7 +20182,7 @@ local runner=sandbox.registerrunner { name="curl resolver", method="execute", program="curl", - template="--silent -- insecure --create-dirs --output %cachename% %original%", + template="--silent --insecure --create-dirs --output %cachename% %original%", checkers={ cachename="cache", original="url", @@ -19624,7 +20428,7 @@ do -- create closure to overcome 200 locals limit package.loaded["data-aux"] = package.loaded["data-aux"] or true --- original size: 2431, stripped down to: 1996 +-- original size: 2438, stripped down to: 2003 if not modules then modules={} end modules ['data-aux']={ version=1.001, @@ -19660,7 +20464,7 @@ function resolvers.updatescript(oldname,newname) if trace_locating then report_scripts("old and new script are the same") end - elseif not find(newscript,scriptpath) then + elseif not find(newscript,scriptpath,1,true) then if trace_locating then report_scripts("new script should come from %a",scriptpath) end @@ -19747,7 +20551,7 @@ do -- create closure to overcome 200 locals limit package.loaded["data-lst"] = package.loaded["data-lst"] or true --- original size: 2734, stripped down to: 2354 +-- original size: 1823, stripped down to: 1591 if not modules then modules={} end modules ['data-lst']={ version=1.001, @@ -19756,14 +20560,14 @@ if not modules then modules={} end modules ['data-lst']={ copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" } -local rawget,type,next=rawget,type,next -local find,concat,upper=string.find,table.concat,string.upper -local fastcopy,sortedpairs=table.fastcopy,table.sortedpairs +local type=type +local concat,sortedhash=table.concat,table.sortedhash local resolvers=resolvers local listers=resolvers.listers or {} resolvers.listers=listers local resolveprefix=resolvers.resolve local report_lists=logs.reporter("resolvers","lists") +local report_resolved=logs.reporter("system","resolved") local function tabstr(str) if type(str)=='table' then return concat(str," | ") @@ -19772,39 +20576,17 @@ local function tabstr(str) end end function listers.variables(pattern) - local instance=resolvers.instance - local environment=instance.environment - local variables=instance.variables - local expansions=instance.expansions - local pattern=upper(pattern or "") - local configured={} - local order=instance.order - for i=1,#order do - for k,v in next,order[i] do - if v~=nil and configured[k]==nil then - configured[k]=v - end - end - end - local env=fastcopy(environment) - local var=fastcopy(variables) - local exp=fastcopy(expansions) - for key,value in sortedpairs(configured) do - if key~="" and (pattern=="" or find(upper(key),pattern)) then - report_lists(key) - report_lists(" env: %s",tabstr(rawget(environment,key)) or "unset") - report_lists(" var: %s",tabstr(configured[key]) or "unset") - report_lists(" exp: %s",tabstr(expansions[key]) or "unset") - report_lists(" res: %s",tabstr(resolveprefix(expansions[key])) or "unset") - end - end - instance.environment=fastcopy(env) - instance.variables=fastcopy(var) - instance.expansions=fastcopy(exp) + local result=resolvers.knownvariables(pattern) + for key,value in sortedhash(result) do + report_lists(key) + report_lists(" env: %s",tabstr(value.environment or "unset")) + report_lists(" var: %s",tabstr(value.variable or "unset")) + report_lists(" exp: %s",tabstr(value.expansion or "unset")) + report_lists(" res: %s",tabstr(value.resolved or "unset")) + end end -local report_resolved=logs.reporter("system","resolved") function listers.configurations() - local configurations=resolvers.instance.specification + local configurations=resolvers.configurationfiles() for i=1,#configurations do report_resolved("file : %s",resolveprefix(configurations[i])) end @@ -19827,7 +20609,7 @@ do -- create closure to overcome 200 locals limit package.loaded["util-lib"] = package.loaded["util-lib"] or true --- original size: 13595, stripped down to: 7500 +-- original size: 14943, stripped down to: 8305 if not modules then modules={} end modules ['util-lib']={ version=1.001, @@ -19846,6 +20628,7 @@ local pathpart=file.pathpart local nameonly=file.nameonly local joinfile=file.join local removesuffix=file.removesuffix +local addsuffix=file.addsuffix local findfile=resolvers.findfile local findfiles=resolvers.findfiles local expandpaths=resolvers.expandedpathlistfromvariable @@ -19865,13 +20648,20 @@ local function locate(required,version,trace,report,action) local required_path=pathpart(required_full) local required_base=nameonly(required_full) if qualifiedpath(required) then - if isfile(required) then + if isfile(addsuffix(required,os.libsuffix)) then + if trace then + report("qualified name %a found",required) + end found_library=required + else + if trace then + report("qualified name %a not found",required) + end end else local required_name=required_base.."."..os.libsuffix local version=type(version)=="string" and version~="" and version or false - local engine=environment.ownmain or false + local engine="luatex" if trace and not done then local list=expandpaths("lib") for i=1,#list do @@ -19930,9 +20720,11 @@ local function locate(required,version,trace,report,action) end package.extralibpath(environment.ownpath) local paths=package.libpaths() + local pattern="/[^/]+%."..os.libsuffix.."$" for i=1,#paths do - local found=check(lfs.isfile) - if found and (not checkpattern or find(found,checkpattern)) then + required_path=gsub(paths[i],pattern,"") + local found=check(lfs.isfound) + if type(found)=="string" and (not checkpattern or find(found,checkpattern)) then return found end end @@ -19962,18 +20754,20 @@ local function locate(required,version,trace,report,action) if trace then report("found: %a",found_library) end - local message,result=action(found_library,required_base) + local result,message=action(found_library,required_base) if result then library=result else library=false - report("load error: message %a, library %a",tostring(message),found_library or "no library") + report("load error: message %a, library %a",tostring(message or "unknown"),found_library or "no library") end end - if not library then - report("unknown: %a",required) - elseif trace then - report("stored: %a",required) + if trace then + if not library then + report("unknown library: %a",required) + else + report("stored library: %a",required) + end end return library end @@ -20000,13 +20794,12 @@ do local libtype=type(library) if libtype=="function" then library=library() - message=true else report_swiglib("load error: %a returns %a, message %a, library %a",opener,libtype,(string.gsub(message or "no message","[%s]+$","")),found_library or "no library") library=false end popdir() - return message,library + return library end) loadedlibs[required]=library or false end @@ -20050,29 +20843,48 @@ if FFISUPPORTED and ffi and ffi.load then local trace_ffilib=false local savedffiload=ffi.load trackers.register("resolvers.ffilib",function(v) trace_ffilib=v end) + local loaded={} local function locateindeed(name) - local message,library=pcall(savedffiload,removesuffix(name)) - if type(library)=="userdata" then - return library - else - return false + name=removesuffix(name) + local l=loaded[name] + if l==nil then + local message,library=pcall(savedffiload,name) + if type(message)=="userdata" then + l=message + elseif type(library)=="userdata" then + l=library + else + l=false + end + loaded[name]=l + elseif trace_ffilib then + report_ffilib("reusing already loaded %a",name) end + return l end - function ffilib(required,version) - if version=="system" then + function ffilib(name,version) + name=removesuffix(name) + local l=loaded[name] + if l~=nil then + if trace_ffilib then + report_ffilib("reusing already loaded %a",name) + end + return l + elseif version=="system" then return locateindeed(name) else - return locate(required,version,trace_ffilib,report_ffilib,locateindeed) + return locate(name,version,trace_ffilib,report_ffilib,locateindeed) end end function ffi.load(name) local library=ffilib(name) if type(library)=="userdata" then return library - else + end + if trace_ffilib then report_ffilib("trying to load %a using normal loader",name) - return savedffiload(name) end + return savedffiload(name) end end @@ -20186,7 +20998,7 @@ do -- create closure to overcome 200 locals limit package.loaded["luat-fmt"] = package.loaded["luat-fmt"] or true --- original size: 9144, stripped down to: 7291 +-- original size: 9268, stripped down to: 7401 if not modules then modules={} end modules ['luat-fmt']={ version=1.001, @@ -20225,6 +21037,9 @@ local function secondaryflags() if arguments.silent then flags[#flags+1]="--c:silent" end + if arguments.errors then + flags[#flags+1]="--c:errors" + end if arguments.jit then flags[#flags+1]="--c:jiton" end @@ -20261,6 +21076,7 @@ local runners={ function environment.make_format(name,arguments) local engine=environment.ownmain or "luatex" local silent=environment.arguments.silent + local errors=environment.arguments.errors local olddir=dir.current() local path=caches.getwritablepath("formats",engine) or "" if path~="" then @@ -20416,10 +21232,10 @@ end end -- of closure --- used libraries : l-lua.lua l-sandbox.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-fil.lua util-sac.lua util-sto.lua util-prs.lua util-fmt.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-tpl.lua util-sbx.lua util-mrg.lua util-env.lua luat-env.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.lua data-ini.lua data-exp.lua data-env.lua data-tmp.lua data-met.lua data-res.lua data-pre.lua data-inp.lua data-out.lua data-fil.lua data-con.lua data-use.lua data-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua util-lib.lua luat-sta.lua luat-fmt.lua +-- used libraries : l-lua.lua l-macro.lua l-sandbox.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-fil.lua util-sac.lua util-sto.lua util-prs.lua util-fmt.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-tpl.lua util-sbx.lua util-mrg.lua util-env.lua luat-env.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.lua data-ini.lua data-exp.lua data-env.lua data-tmp.lua data-met.lua data-res.lua data-pre.lua data-inp.lua data-out.lua data-fil.lua data-con.lua data-use.lua data-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua util-lib.lua luat-sta.lua luat-fmt.lua -- skipped libraries : - --- original bytes : 842443 --- stripped bytes : 306317 +-- original bytes : 874849 +-- stripped bytes : 317531 -- end library merge @@ -20443,6 +21259,7 @@ local owntree = environment and environment.ownpath or ownpath local ownlibs = { -- order can be made better 'l-lua.lua', + 'l-macro.lua', 'l-sandbox.lua', 'l-package.lua', 'l-lpeg.lua', @@ -20607,30 +21424,37 @@ local e_verbose = false -- some common flags (also passed through environment) local e_silent = environment.argument("silent") +local e_errors = environment.argument("errors") local e_noconsole = environment.argument("noconsole") local e_trackers = environment.argument("trackers") local e_directives = environment.argument("directives") local e_experiments = environment.argument("experiments") -if e_silent == true then - e_silent = "*" +local t = { } + +if type(e_directives) == "string" then + t[#t+1] = e_directives end if type(e_silent) == "string" then - if type(e_directives) == "string" then - e_directives = format("%s,logs.blocked={%s}",e_directives,e_silent) - else - e_directives = format("logs.blocked={%s}",e_silent) - end + t[#t+1] = format("logs.blocked={%s}",e_silent) +elseif e_silent == true then + t[#t+1] = "logs.blocked" +end + +if type(e_errors) == "string" then + t[#t+1] = format("logs.errors={%s}",e_errors) +elseif e_errors == true then + t[#t+1] = "logs.errors" end if e_noconsole then - if type(e_directives) == "string" then - e_directives = format("%s,logs.target=file",e_directives) - else - e_directives = format("logs.target=file") - end + t[#t+1] = format("logs.target=file") +end + +if #t > 0 then + e_directives = concat(t,",") end if e_trackers then trackers .enable(e_trackers) end @@ -20643,7 +21467,7 @@ if not environment.experiments then environment.experiments = e_experiments end -- -local instance = resolvers.reset() +resolvers.reset() local helpinfo = [[ <?xml version="1.0" ?> @@ -20651,7 +21475,7 @@ local helpinfo = [[ <metadata> <entry name="name">mtxrun</entry> <entry name="detail">ConTeXt TDS Runner Tool</entry> - <entry name="version">1.32</entry> + <entry name="version">1.33</entry> </metadata> <flags> <category name="basic"> @@ -21199,7 +22023,7 @@ function runners.execute_ctx_script(filename,...) end -- retry after generate but only if --autogenerate if fullname == "" and environment.argument("autogenerate") then -- might become the default - instance.renewcache = true + resolvers.renewcache() trackers.enable("resolvers.locating") resolvers.load() -- @@ -21224,7 +22048,7 @@ function runners.execute_ctx_script(filename,...) end filename = environment.files[1] if e_verbose then - report("using script: %s\n",fullname) + report("using script: %s (if --path is used don't run on path where mtxrun lives)\n",fullname) end environment.ownscript = fullname dofile(fullname) @@ -21378,8 +22202,6 @@ local before, after = environment.splitarguments(filename) environment.arguments_before, environment.arguments_after = before, after environment.initializearguments(before) -instance.lsrmode = environment.argument("lsr") or false - e_verbose = environment.arguments["verbose"] -- delayed till here (we need the ones before script) if e_verbose then @@ -21466,7 +22288,7 @@ else function runners.loadbase(...) if not resolvers.load(...) then report("forcing cache reload") - instance.renewcache = true + resolvers.renewcache() trackers.enable("resolvers.locating") if not resolvers.load(...) then report("the resolver databases are not present or outdated") @@ -21480,6 +22302,42 @@ end -- joke .. reminds me of messing with gigi terminals +do + + local a_locale = e_argument("locale") + + if a_locale then + + -- I really hate this crap but am too tired of discussing it over and over + -- again so for the sake of usiage outside context we will provide ways to + -- use locales in an otherwise supposed to be locale agnostic system. And + -- forget about support in case of interferences. + + report() + report(what == "force" and "forcing locale:" or "original locale:") + report() + report(" collate : %s",status.lc_collate or "<unset>") + report(" ctype : %s",status.lc_ctype or "<unset>") + report(" monetary : %s",status.lc_monetary or "<unset>") + report(" numeric : %s",status.lc_numeric or "<unset>") + report(" time : %s",status.lc_time or "<unset>") + report() + + end + + if a_locale == "force" then + os.setlocale(status.lc_collate ,"collate") + os.setlocale(status.lc_ctype ,"ctype") + os.setlocale(status.lc_monetary,"monetary") + os.setlocale(status.lc_numeric ,"numeric") + os.setlocale(status.lc_time ,"time") + else + function os.setlocale() + end + end + +end + if e_argument("ansi") then logs.setformatters("ansi") @@ -21673,7 +22531,7 @@ elseif e_argument("find-path") then -- luatools: runners.execute_ctx_script("mtx-base","--find-path",filename) resolvers.load() - local path = resolvers.findpath(filename, instance.my_format) + local path = resolvers.findpath(filename) if e_verbose then report(path) else @@ -21754,7 +22612,7 @@ elseif e_argument("generate") then trackers.enable("resolvers.locating") resolvers.renew(filename) else - instance.renewcache = true + resolvers.renewcache() trackers.enable("resolvers.locating") resolvers.load() end @@ -21814,6 +22672,10 @@ elseif e_argument("systeminfo") then runners.systeminfo() +elseif e_argument("locale") then + + -- already done + elseif e_argument("help") or filename=='help' or filename == "" then application.help() diff --git a/scripts/context/stubs/win64/mtxrun.lua b/scripts/context/stubs/win64/mtxrun.lua index 873770cac..3374a364a 100644 --- a/scripts/context/stubs/win64/mtxrun.lua +++ b/scripts/context/stubs/win64/mtxrun.lua @@ -56,7 +56,7 @@ do -- create closure to overcome 200 locals limit package.loaded["l-lua"] = package.loaded["l-lua"] or true --- original size: 5125, stripped down to: 2881 +-- original size: 6230, stripped down to: 3662 if not modules then modules={} end modules ['l-lua']={ version=1.001, @@ -65,14 +65,16 @@ if not modules then modules={} end modules ['l-lua']={ copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" } -_MAJORVERSION,_MINORVERSION=string.match(_VERSION,"^[^%d]+(%d+)%.(%d+).*$") -_MAJORVERSION=tonumber(_MAJORVERSION) or 5 -_MINORVERSION=tonumber(_MINORVERSION) or 1 -_LUAVERSION=_MAJORVERSION+_MINORVERSION/10 -if _LUAVERSION<5.2 and jit then - _MINORVERSION=2 - _LUAVERSION=5.2 -end +local next,type,tonumber=next,type,tonumber +LUAMAJORVERSION,LUAMINORVERSION=string.match(_VERSION,"^[^%d]+(%d+)%.(%d+).*$") +LUAMAJORVERSION=tonumber(LUAMAJORVERSION) or 5 +LUAMINORVERSION=tonumber(LUAMINORVERSION) or 1 +LUAVERSION=LUAMAJORVERSION+LUAMINORVERSION/10 +if LUAVERSION<5.2 and jit then + MINORVERSION=2 + LUAVERSION=5.2 +end +_LUAVERSION=LUAVERSION if not lpeg then lpeg=require("lpeg") end @@ -172,6 +174,166 @@ if not FFISUPPORTED then elseif not ffi.number then ffi.number=tonumber end +if not bit32 then + bit32=require("l-bit32") +end +local loaded=package.loaded +if not loaded["socket"] then loaded["socket"]=loaded["socket.core"] end +if not loaded["mime"] then loaded["mime"]=loaded["mime.core"] end +if not socket.mime then socket.mime=package.loaded["mime"] end +if not loaded["socket.mime"] then loaded["socket.mime"]=socket.mime end +if not loaded["socket.http"] then loaded["socket.http"]=socket.http end +if not loaded["socket.ftp"] then loaded["socket.ftp"]=socket.ftp end +if not loaded["socket.smtp"] then loaded["socket.smtp"]=socket.smtp end +if not loaded["socket.tp"] then loaded["socket.tp"]=socket.tp end +if not loaded["socket.url"] then loaded["socket.url"]=socket.url end + + +end -- of closure + +do -- create closure to overcome 200 locals limit + +package.loaded["l-macro"] = package.loaded["l-macro"] or true + +-- original size: 6393, stripped down to: 3659 + +if not modules then modules={} end modules ['l-macros']={ + version=1.001, + comment="companion to luat-lib.mkiv", + author="Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright="PRAGMA ADE / ConTeXt Development Team", + license="see context related readme files" +} +local S,P,R,V,C,Cs,Cc,Ct,Carg=lpeg.S,lpeg.P,lpeg.R,lpeg.V,lpeg.C,lpeg.Cs,lpeg.Cc,lpeg.Ct,lpeg.Carg +local lpegmatch=lpeg.match +local concat=table.concat +local next=next +local newline=S("\n\r")^1 +local continue=P("\\")*newline +local spaces=S(" \t")+continue +local name=R("az","AZ","__","09")^1 +local body=((1+continue/"")-newline)^1 +local lparent=P("(") +local rparent=P(")") +local noparent=1-(lparent+rparent) +local nested=P { lparent*(noparent+V(1))^0*rparent } +local escaped=P("\\")*P(1) +local squote=P("'") +local dquote=P('"') +local quoted=dquote*(escaped+(1-dquote))^0*dquote+squote*(escaped+(1-squote))^0*squote +local arguments=lparent*Ct((Cs((nested+(quoted+1-S("),")))^1)+S(", "))^0)*rparent +local macros=lua.macros or {} +lua.macros=macros +local patterns={} +local definitions={} +local resolve +local subparser +resolve=C(C(name)*arguments^-1)/function(raw,s,a) + local d=definitions[s] + if d then + if a then + local n=#a + local p=patterns[s][n] + if p then + local d=d[n] + for i=1,n do + a[i]=lpegmatch(subparser,a[i]) or a[i] + end + return lpegmatch(p,d,1,a) or d + else + return raw + end + else + return d[0] or raw + end + elseif a then + for i=1,#a do + a[i]=lpegmatch(subparser,a[i]) or a[i] + end + return s.."("..concat(a,",")..")" + else + return raw + end +end +subparser=Cs((resolve+P(1))^1) +local enddefine=P("#enddefine")/"" +local beginregister=(C(name)*spaces^0*(arguments+Cc(false))*C((1-enddefine)^1)*enddefine)/function(k,a,v) + local n=0 + if a then + n=#a + local pattern=P(false) + for i=1,n do + pattern=pattern+(P(a[i])*Carg(1))/function(t) return t[i] end + end + pattern=Cs((pattern+P(1))^1) + local p=patterns[k] + if not p then + p={ [0]=false,false,false,false,false,false,false,false,false } + patterns[k]=p + end + p[n]=pattern + end + local d=definitions[k] + if not d then + d={ [0]=false,false,false,false,false,false,false,false,false } + definitions[k]=d + end + d[n]=lpegmatch(subparser,v) or v + return "" +end +local register=(C(name)*spaces^0*(arguments+Cc(false))*spaces^0*C(body))/function(k,a,v) + local n=0 + if a then + n=#a + local pattern=P(false) + for i=1,n do + pattern=pattern+(P(a[i])*Carg(1))/function(t) return t[i] end + end + pattern=Cs((pattern+P(1))^1) + local p=patterns[k] + if not p then + p={ [0]=false,false,false,false,false,false,false,false,false } + patterns[k]=p + end + p[n]=pattern + end + local d=definitions[k] + if not d then + d={ [0]=false,false,false,false,false,false,false,false,false } + definitions[k]=d + end + d[n]=lpegmatch(subparser,v) or v + return "" +end +local unregister=(C(name)*spaces^0*(arguments+Cc(false)))/function(k,a) + local n=0 + if a then + n=#a + local p=patterns[k] + if p then + p[n]=false + end + end + local d=definitions[k] + if d then + d[n]=false + end + return "" +end +local begindefine=(P("begindefine")*spaces^0/"")*beginregister +local define=(P("define" )*spaces^0/"")*register +local undefine=(P("undefine" )*spaces^0/"")*unregister +local parser=Cs((((P("#")/"")*(define+begindefine+undefine)*(newline^0/"") )+resolve+P(1) )^0 ) +function macros.reset() + definitions={} + patterns={} +end +function macros.resolvestring(str) + return lpegmatch(parser,str) or str +end +function macros.resolving() + return next(patterns) +end end -- of closure @@ -180,7 +342,7 @@ do -- create closure to overcome 200 locals limit package.loaded["l-sandbox"] = package.loaded["l-sandbox"] or true --- original size: 9667, stripped down to: 6678 +-- original size: 9678, stripped down to: 6688 if not modules then modules={} end modules ['l-sandbox']={ version=1.001, @@ -193,7 +355,7 @@ local global=_G local next=next local unpack=unpack or table.unpack local type=type -local tprint=texio.write_nl or print +local tprint=texio and texio.write_nl or print local tostring=tostring local format=string.format local concat=table.concat @@ -447,7 +609,7 @@ do -- create closure to overcome 200 locals limit package.loaded["l-package"] = package.loaded["l-package"] or true --- original size: 10587, stripped down to: 7815 +-- original size: 11564, stripped down to: 8625 if not modules then modules={} end modules ['l-package']={ version=1.001, @@ -461,6 +623,7 @@ local gsub,format,find=string.gsub,string.format,string.find local P,S,Cs,lpegmatch=lpeg.P,lpeg.S,lpeg.Cs,lpeg.match local package=package local searchers=package.searchers or package.loaders +local insert,remove=table.insert,table.remove local filejoin=file and file.join or function(path,name) return path.."/"..name end local isreadable=file and file.is_readable or function(name) local f=io.open(name) if f then f:close() return true end end local addsuffix=file and file.addsuffix or function(name,suffix) return name.."."..suffix end @@ -594,15 +757,43 @@ local function registerpath(tag,what,target,...) add(path) end end - return paths +end +local function pushpath(tag,what,target,path) + local path=helpers.cleanpath(path) + insert(target,1,path) + if helpers.trace then + helpers.report("pushing %s path in front: %s",tag,path) + end +end +local function poppath(tag,what,target) + local path=remove(target,1) + if helpers.trace then + if path then + helpers.report("popping %s path from front: %s",tag,path) + else + helpers.report("no %s path to pop",tag) + end + end end helpers.registerpath=registerpath function package.extraluapath(...) registerpath("extra lua","lua",extraluapaths,...) end +function package.pushluapath(path) + pushpath("extra lua","lua",extraluapaths,path) +end +function package.popluapath() + poppath("extra lua","lua",extraluapaths) +end function package.extralibpath(...) registerpath("extra lib","lib",extralibpaths,...) end +function package.pushlibpath(path) + pushpath("extra lib","lib",extralibpaths,path) +end +function package.poplibpath() + poppath("extra lib","lua",extralibpaths) +end local function loadedaslib(resolved,rawname) local base=gsub(rawname,"%.","_") local init="luaopen_"..gsub(base,"%.","_") @@ -737,7 +928,7 @@ do -- create closure to overcome 200 locals limit package.loaded["l-lpeg"] = package.loaded["l-lpeg"] or true --- original size: 37748, stripped down to: 20111 +-- original size: 38582, stripped down to: 20518 if not modules then modules={} end modules ['l-lpeg']={ version=1.001, @@ -746,7 +937,8 @@ if not modules then modules={} end modules ['l-lpeg']={ copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" } -lpeg=require("lpeg") +lpeg=require("lpeg") +local lpeg=lpeg if not lpeg.print then function lpeg.print(...) print(lpeg.pcode(...)) end end local type,next,tostring=type,next,tostring local byte,char,gmatch,format=string.byte,string.char,string.gmatch,string.format @@ -768,11 +960,14 @@ patterns.alwaysmatched=alwaysmatched local sign=S('+-') local zero=P('0') local digit=R('09') +local digits=digit^1 local octdigit=R("07") +local octdigits=octdigit^1 local lowercase=R("az") local uppercase=R("AZ") local underscore=P("_") local hexdigit=digit+lowercase+uppercase +local hexdigits=hexdigit^1 local cr,lf,crlf=P("\r"),P("\n"),P("\r\n") local newline=P("\r")*(P("\n")+P(true))+P("\n") local escaped=P("\\")*anything @@ -874,27 +1069,30 @@ patterns.singlequoted=squote*patterns.nosquote*squote patterns.doublequoted=dquote*patterns.nodquote*dquote patterns.quoted=patterns.doublequoted+patterns.singlequoted patterns.digit=digit +patterns.digits=digits patterns.octdigit=octdigit +patterns.octdigits=octdigits patterns.hexdigit=hexdigit +patterns.hexdigits=hexdigits patterns.sign=sign -patterns.cardinal=digit^1 -patterns.integer=sign^-1*digit^1 -patterns.unsigned=digit^0*period*digit^1 +patterns.cardinal=digits +patterns.integer=sign^-1*digits +patterns.unsigned=digit^0*period*digits patterns.float=sign^-1*patterns.unsigned -patterns.cunsigned=digit^0*comma*digit^1 -patterns.cpunsigned=digit^0*(period+comma)*digit^1 +patterns.cunsigned=digit^0*comma*digits +patterns.cpunsigned=digit^0*(period+comma)*digits patterns.cfloat=sign^-1*patterns.cunsigned patterns.cpfloat=sign^-1*patterns.cpunsigned patterns.number=patterns.float+patterns.integer patterns.cnumber=patterns.cfloat+patterns.integer patterns.cpnumber=patterns.cpfloat+patterns.integer -patterns.oct=zero*octdigit^1 +patterns.oct=zero*octdigits patterns.octal=patterns.oct patterns.HEX=zero*P("X")*(digit+uppercase)^1 patterns.hex=zero*P("x")*(digit+lowercase)^1 -patterns.hexadecimal=zero*S("xX")*hexdigit^1 -patterns.hexafloat=sign^-1*zero*S("xX")*(hexdigit^0*period*hexdigit^1+hexdigit^1*period*hexdigit^0+hexdigit^1)*(S("pP")*sign^-1*hexdigit^1)^-1 -patterns.decafloat=sign^-1*(digit^0*period*digit^1+digit^1*period*digit^0+digit^1)*S("eE")*sign^-1*digit^1 +patterns.hexadecimal=zero*S("xX")*hexdigits +patterns.hexafloat=sign^-1*zero*S("xX")*(hexdigit^0*period*hexdigits+hexdigits*period*hexdigit^0+hexdigits)*(S("pP")*sign^-1*hexdigits)^-1 +patterns.decafloat=sign^-1*(digit^0*period*digits+digits*period*digit^0+digits)*S("eE")*sign^-1*digits patterns.propername=(uppercase+lowercase+underscore)*(uppercase+lowercase+underscore+digit)^0*endofstring patterns.somecontent=(anything-newline-space)^1 patterns.beginline=#(1-newline) @@ -1141,11 +1339,13 @@ function lpeg.balancer(left,right) left,right=P(left),P(right) return P { left*((1-left-right)+V(1))^0*right } end -local nany=utf8char/"" -function lpeg.counter(pattern) - pattern=Cs((P(pattern)/" "+nany)^0) - return function(str) - return #lpegmatch(pattern,str) +function lpeg.counter(pattern,action) + local n=0 + local pattern=(P(pattern)/function() n=n+1 end+anything)^0 + if action then + return function(str) n=0;lpegmatch(pattern,str);action(n) end + else + return function(str) n=0;lpegmatch(pattern,str);return n end end end utf=utf or (unicode and unicode.utf8) or {} @@ -1306,7 +1506,13 @@ function lpeg.append(list,pp,delayed,checked) end local p_false=P(false) local p_true=P(true) -local function make(t,rest) +local lower=utf and utf.lower or string.lower +local upper=utf and utf.upper or string.upper +function lpeg.setutfcasers(l,u) + lower=l or lower + upper=u or upper +end +local function make1(t,rest) local p=p_false local keys=sortedkeys(t) for i=1,#keys do @@ -1317,7 +1523,7 @@ local function make(t,rest) p=p+P(k)*p_true elseif v==false then else - p=p+P(k)*make(v,v[""]) + p=p+P(k)*make1(v,v[""]) end end end @@ -1326,32 +1532,27 @@ local function make(t,rest) end return p end -local function collapse(t,x) - if type(t)~="table" then - return t,x - else - local n=next(t) - if n==nil then - return t,x - elseif next(t,n)==nil then - local k=n +local function make2(t,rest) + local p=p_false + local keys=sortedkeys(t) + for i=1,#keys do + local k=keys[i] + if k~="" then local v=t[k] - if type(v)=="table" then - return collapse(v,x..k) + if v==true then + p=p+(P(lower(k))+P(upper(k)))*p_true + elseif v==false then else - return v,x..k + p=p+(P(lower(k))+P(upper(k)))*make2(v,v[""]) end - else - local tt={} - for k,v in next,t do - local vv,kk=collapse(v,k) - tt[kk]=vv - end - return tt,x end end + if rest then + p=p+p_true + end + return p end -function lpeg.utfchartabletopattern(list) +function lpeg.utfchartabletopattern(list,insensitive) local tree={} local n=#list if n==0 then @@ -1422,7 +1623,7 @@ function lpeg.utfchartabletopattern(list) end end end - return make(tree) + return (insensitive and make2 or make1)(tree) end patterns.containseol=lpeg.finder(eol) local function nextstep(n,step,result) @@ -1456,7 +1657,7 @@ end local trailingzeros=zero^0*-digit local case_1=period*trailingzeros/"" local case_2=period*(digit-trailingzeros)^1*(trailingzeros/"") -local number=digit^1*(case_1+case_2) +local number=digits*(case_1+case_2) local stripper=Cs((number+1)^0) lpeg.patterns.stripzeros=stripper local byte_to_HEX={} @@ -1545,7 +1746,7 @@ do -- create closure to overcome 200 locals limit package.loaded["l-string"] = package.loaded["l-string"] or true --- original size: 6419, stripped down to: 3339 +-- original size: 6461, stripped down to: 3341 if not modules then modules={} end modules ['l-string']={ version=1.001, @@ -1647,9 +1848,9 @@ function string.tformat(fmt,...) end string.quote=string.quoted string.unquote=string.unquoted -if not string.bytetable then +if not string.bytetable then local limit=5000 - function string.bytetable(str) + function string.bytetable(str) local n=#str if n>limit then local t={ byte(str,1,limit) } @@ -1670,7 +1871,7 @@ do -- create closure to overcome 200 locals limit package.loaded["l-table"] = package.loaded["l-table"] or true --- original size: 39608, stripped down to: 23165 +-- original size: 40161, stripped down to: 23559 if not modules then modules={} end modules ['l-table']={ version=1.001, @@ -1679,7 +1880,7 @@ if not modules then modules={} end modules ['l-table']={ copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" } -local type,next,tostring,tonumber,ipairs,select=type,next,tostring,tonumber,ipairs,select +local type,next,tostring,tonumber,select=type,next,tostring,tonumber,select local table,string=table,string local concat,sort,insert,remove=table.concat,table.sort,table.insert,table.remove local format,lower,dump=string.format,string.lower,string.dump @@ -1688,6 +1889,9 @@ local getinfo=debug.getinfo local lpegmatch,patterns=lpeg.match,lpeg.patterns local floor=math.floor local stripper=patterns.stripper +function table.getn(t) + return t and #t +end function table.strip(tab) local lst,l={},0 for i=1,#tab do @@ -1981,7 +2185,7 @@ function table.tohash(t,value) local h={} if t then if value==nil then value=true end - for _,v in next,t do + for _,v in next,t do h[v]=value end end @@ -1989,7 +2193,7 @@ function table.tohash(t,value) end function table.fromhash(t) local hsh,h={},0 - for k,v in next,t do + for k,v in next,t do if v then h=h+1 hsh[h]=k @@ -2464,7 +2668,9 @@ function table.unnest(t) return unnest(t) end local function are_equal(a,b,n,m) - if a and b and #a==#b then + if a==b then + return true + elseif a and b and #a==#b then n=n or 1 m=m or #a for i=n,m do @@ -2484,15 +2690,17 @@ local function are_equal(a,b,n,m) end end local function identical(a,b) - for ka,va in next,a do - local vb=b[ka] - if va==vb then - elseif type(va)=="table" and type(vb)=="table" then - if not identical(va,vb) then + if a~=b then + for ka,va in next,a do + local vb=b[ka] + if va==vb then + elseif type(va)=="table" and type(vb)=="table" then + if not identical(va,vb) then + return false + end + else return false end - else - return false end end return true @@ -2714,6 +2922,24 @@ function table.filtered(t,pattern,sort,cmp) return nothing end end +if not table.move then + function table.move(a1,f,e,t,a2) + if a2 and a1~=a2 then + for i=f,e do + a2[t]=a1[i] + t=t+1 + end + return a2 + else + t=t+e-f + for i=e,f,-1 do + a1[t]=a1[i] + t=t-1 + end + return a1 + end + end +end end -- of closure @@ -2722,7 +2948,7 @@ do -- create closure to overcome 200 locals limit package.loaded["l-io"] = package.loaded["l-io"] or true --- original size: 11790, stripped down to: 6961 +-- original size: 11823, stripped down to: 6945 if not modules then modules={} end modules ['l-io']={ version=1.001, @@ -2735,16 +2961,15 @@ local io=io local open,flush,write,read=io.open,io.flush,io.write,io.read local byte,find,gsub,format=string.byte,string.find,string.gsub,string.format local concat=table.concat -local floor=math.floor local type=type if string.find(os.getenv("PATH"),";",1,true) then io.fileseparator,io.pathseparator="\\",";" else io.fileseparator,io.pathseparator="/",":" end -local large=2^24 -local medium=large/16 -local small=medium/8 +local large=0x01000000 +local medium=0x00100000 +local small=0x00020000 local function readall(f) local size=f:seek("end") if size>0 then @@ -3075,7 +3300,7 @@ do -- create closure to overcome 200 locals limit package.loaded["l-number"] = package.loaded["l-number"] or true --- original size: 5358, stripped down to: 3177 +-- original size: 5645, stripped down to: 2253 if not modules then modules={} end modules ['l-number']={ version=1.001, @@ -3091,33 +3316,6 @@ local lpegmatch=lpeg.match local floor=math.floor number=number or {} local number=number -if bit32 then - local btest,bor=bit32.btest,bit32.bor - function number.bit(p) - return 2^(p-1) - end - number.hasbit=btest - number.setbit=bor - function number.setbit(x,p) - return btest(x,p) and x or x+p - end - function number.clearbit(x,p) - return btest(x,p) and x-p or x - end -else - function number.bit(p) - return 2^(p-1) - end - function number.hasbit(x,p) - return x%(p+p)>=p - end - function number.setbit(x,p) - return (x%(p+p)>=p) and x or x+p - end - function number.clearbit(x,p) - return (x%(p+p)>=p) and x-p or x - end -end if bit32 then local bextract=bit32.extract local t={ @@ -3193,26 +3391,6 @@ function number.toevenhex(n) return "0"..s end end -local one=lpeg.C(1-lpeg.S('')/tonumber)^1 -function number.toset(n) - return lpegmatch(one,tostring(n)) -end -local function bits(n,i,...) - if n>0 then - local m=n%2 - local n=floor(n/2) - if m>0 then - return bits(n,i+1,i,...) - else - return bits(n,i+1,...) - end - else - return... - end -end -function number.bits(n) - return { bits(n,1) } -end function number.bytetodecimal(b) local d=floor(b*100/255+0.5) if d>100 then @@ -3689,7 +3867,7 @@ do -- create closure to overcome 200 locals limit package.loaded["l-file"] = package.loaded["l-file"] or true --- original size: 20997, stripped down to: 9986 +-- original size: 21616, stripped down to: 10359 if not modules then modules={} end modules ['l-file']={ version=1.001, @@ -3725,6 +3903,9 @@ end function lfs.isfile(name) return attributes(name,"mode")=="file" end +function lfs.isfound(name) + return attributes(name,"mode")=="file" and name or nil +end local colon=P(":") local period=P(".") local periods=P("..") @@ -4063,6 +4244,23 @@ function lfs.mkdirs(path) lfs.mkdir(full) end end +function file.withinbase(path) + local l=0 + if not find(path,"^/") then + path="/"..path + end + for dir in gmatch(path,"/([^/]+)") do + if dir==".." then + l=l-1 + elseif dir~="." then + l=l+1 + end + if l<0 then + return false + end + end + return true +end end -- of closure @@ -4215,7 +4413,7 @@ do -- create closure to overcome 200 locals limit package.loaded["l-url"] = package.loaded["l-url"] or true --- original size: 12531, stripped down to: 5721 +-- original size: 14755, stripped down to: 7236 if not modules then modules={} end modules ['l-url']={ version=1.001, @@ -4226,24 +4424,51 @@ if not modules then modules={} end modules ['l-url']={ } local char,format,byte=string.char,string.format,string.byte local concat=table.concat -local tonumber,type=tonumber,type +local tonumber,type,next=tonumber,type,next local P,C,R,S,Cs,Cc,Ct,Cf,Cg,V=lpeg.P,lpeg.C,lpeg.R,lpeg.S,lpeg.Cs,lpeg.Cc,lpeg.Ct,lpeg.Cf,lpeg.Cg,lpeg.V local lpegmatch,lpegpatterns,replacer=lpeg.match,lpeg.patterns,lpeg.replacer +local sortedhash=table.sortedhash url=url or {} local url=url -local tochar=function(s) return char(tonumber(s,16)) end +local unescapes={} +local escapes={} +setmetatable(unescapes,{ __index=function(t,k) + local v=char(tonumber(k,16)) + t[k]=v + return v +end }) +setmetatable(escapes,{ __index=function(t,k) + local v=format("%%%02X",byte(k)) + t[k]=v + return v +end }) local colon=P(":") local qmark=P("?") local hash=P("#") local slash=P("/") +local atsign=P("@") local percent=P("%") local endofstring=P(-1) local hexdigit=R("09","AF","af") local plus=P("+") local nothing=Cc("") -local escapedchar=(percent*C(hexdigit*hexdigit))/tochar +local okay=R("09","AZ","az")+S("-_.,:=+*~!'()@&$") +local escapedchar=(percent*C(hexdigit*hexdigit))/unescapes +local unescapedchar=P(1)/escapes local escaped=(plus/" ")+escapedchar local noslash=P("/")/"" +local plustospace=P("+")/" " +local decoder=Cs(( + plustospace+escapedchar+P("\r\n")/"\n"+P(1) + )^0 ) +local encoder=Cs(( + R("09","AZ","az")^1+S("-./_")^1+P(" ")/"+"+P("\n")/"\r\n"+unescapedchar + )^0 ) +lpegpatterns.urldecoder=decoder +lpegpatterns.urlencoder=encoder +function url.decode (str) return str and lpegmatch(decoder,str) or str end +function url.encode (str) return str and lpegmatch(encoder,str) or str end +function url.unescape(str) return str and lpegmatch(unescaper,str) or str end local schemestr=Cs((escaped+(1-colon-slash-qmark-hash))^2) local authoritystr=Cs((escaped+(1- slash-qmark-hash))^0) local pathstr=Cs((escaped+(1- qmark-hash))^0) @@ -4258,13 +4483,7 @@ local validurl=scheme*authority*path*query*fragment local parser=Ct(validurl) lpegpatterns.url=validurl lpegpatterns.urlsplitter=parser -local escapes={} -setmetatable(escapes,{ __index=function(t,k) - local v=format("%%%02X",byte(k)) - t[k]=v - return v -end }) -local escaper=Cs((R("09","AZ","az")^1+P(" ")/"%%20"+S("-./_")^1+P(1)/escapes)^0) +local escaper=Cs((R("09","AZ","az")^1+P(" ")/"%%20"+S("-./_:")^1+P(1)/escapes)^0) local unescaper=Cs((escapedchar+1)^0) local getcleaner=Cs((P("+++")/"%%2B"+P("+")/"%%20"+P(1))^1) lpegpatterns.urlunescaped=escapedchar @@ -4294,12 +4513,15 @@ local barswapper=replacer("|",":") local backslashswapper=replacer("\\","/") local equal=P("=") local amp=P("&") -local key=Cs(((escapedchar+1)-equal )^0) -local value=Cs(((escapedchar+1)-amp -endofstring)^0) +local key=Cs(((plustospace+escapedchar+1)-equal )^0) +local value=Cs(((plustospace+escapedchar+1)-amp-endofstring)^0) local splitquery=Cf (Ct("")*P { "sequence", sequence=V("pair")*(amp*V("pair"))^0, pair=Cg(key*equal*value), },rawset) +local userpart=(1-atsign-colon)^1 +local serverpart=(1-colon)^1 +local splitauthority=((Cs(userpart)*colon*Cs(userpart)+Cs(userpart)*Cc(nil))*atsign+Cc(nil)*Cc(nil))*Cs(serverpart)*(colon*(serverpart/tonumber)+Cc(nil)) local function hashed(str) if not str or str=="" then return { @@ -4332,7 +4554,14 @@ local function hashed(str) end local authority=detailed[2] local path=detailed[3] - local filename=nil + local filename + local username + local password + local host + local port + if authority~="" then + username,password,host,port=lpegmatch(splitauthority,authority) + end if authority=="" then filename=path elseif path=="" then @@ -4350,6 +4579,8 @@ local function hashed(str) original=str, noscheme=false, filename=filename, + host=host, + port=port, } end url.split=split @@ -4365,24 +4596,38 @@ function url.addscheme(str,scheme) end end function url.construct(hash) - local fullurl,f={},0 - local scheme,authority,path,query,fragment=hash.scheme,hash.authority,hash.path,hash.query,hash.fragment + local result,r={},0 + local scheme=hash.scheme + local authority=hash.authority + local path=hash.path + local queries=hash.queries + local fragment=hash.fragment if scheme and scheme~="" then - f=f+1;fullurl[f]=scheme.."://" + r=r+1;result[r]=lpegmatch(escaper,scheme) + r=r+1;result[r]="://" end if authority and authority~="" then - f=f+1;fullurl[f]=authority + r=r+1;result[r]=lpegmatch(escaper,authority) end if path and path~="" then - f=f+1;fullurl[f]="/"..path + r=r+1;result[r]="/" + r=r+1;result[r]=lpegmatch(escaper,path) end - if query and query~="" then - f=f+1;fullurl[f]="?"..query + if queries then + local done=false + for k,v in sortedhash(queries) do + r=r+1;result[r]=done and "&" or "?" + r=r+1;result[r]=lpegmatch(escaper,k) + r=r+1;result[r]="=" + r=r+1;result[r]=lpegmatch(escaper,v) + done=true + end end if fragment and fragment~="" then - f=f+1;fullurl[f]="#"..fragment + r=r+1;result[r]="#" + r=r+1;result[r]=lpegmatch(escaper,fragment) end - return lpegmatch(escaper,concat(fullurl)) + return concat(result) end local pattern=Cs(slash^-1/""*R("az","AZ")*((S(":|")/":")+P(":"))*slash*P(1)^0) function url.filename(filename) @@ -4998,7 +5243,7 @@ do -- create closure to overcome 200 locals limit package.loaded["l-unicode"] = package.loaded["l-unicode"] or true --- original size: 38263, stripped down to: 16330 +-- original size: 40036, stripped down to: 17837 if not modules then modules={} end modules ['l-unicode']={ version=1.001, @@ -5034,37 +5279,73 @@ if not unicode then unicode={ utf=utf } end if not utf.char then - local floor,char=math.floor,string.char - function utf.char(n) - if n<0x80 then - return char(n) - elseif n<0x800 then - return char( - 0xC0+floor(n/0x40), - 0x80+(n%0x40) - ) - elseif n<0x10000 then - return char( - 0xE0+floor(n/0x1000), - 0x80+(floor(n/0x40)%0x40), - 0x80+(n%0x40) - ) - elseif n<0x200000 then - return char( - 0xF0+floor(n/0x40000), - 0x80+(floor(n/0x1000)%0x40), - 0x80+(floor(n/0x40)%0x40), - 0x80+(n%0x40) - ) + utf.char=string.utfcharacter or (utf8 and utf8.char) + if not utf.char then + local char=string.char + if bit32 then + local rshift=bit32.rshift + function utf.char(n) + if n<0x80 then + return char(n) + elseif n<0x800 then + return char( + 0xC0+rshift(n,6), + 0x80+(n%0x40) + ) + elseif n<0x10000 then + return char( + 0xE0+rshift(n,12), + 0x80+(rshift(n,6)%0x40), + 0x80+(n%0x40) + ) + elseif n<0x200000 then + return char( + 0xF0+rshift(n,18), + 0x80+(rshift(n,12)%0x40), + 0x80+(rshift(n,6)%0x40), + 0x80+(n%0x40) + ) + else + return "" + end + end else - return "" + local floor=math.floor + function utf.char(n) + if n<0x80 then + return char(n) + elseif n<0x800 then + return char( + 0xC0+floor(n/0x40), + 0x80+(n%0x40) + ) + elseif n<0x10000 then + return char( + 0xE0+floor(n/0x1000), + 0x80+(floor(n/0x40)%0x40), + 0x80+(n%0x40) + ) + elseif n<0x200000 then + return char( + 0xF0+floor(n/0x40000), + 0x80+(floor(n/0x1000)%0x40), + 0x80+(floor(n/0x40)%0x40), + 0x80+(n%0x40) + ) + else + return "" + end + end end end end if not utf.byte then - local utf8byte=patterns.utf8byte - function utf.byte(c) - return lpegmatch(utf8byte,c) + utf.byte=string.utfvalue or (utf8 and utf8.codepoint) + if not utf.byte then + local utf8byte=patterns.utf8byte + function utf.byte(c) + return lpegmatch(utf8byte,c) + end end end local utfchar,utfbyte=utf.char,utf.byte @@ -5115,19 +5396,22 @@ function utf.is_valid(str) return type(str)=="string" and lpegmatch(validatedutf,str) or false end if not utf.len then - local n,f=0,1 - local utfcharcounter=patterns.utfbom^-1*Cmt ( - Cc(1)*patterns.utf8one^1+Cc(2)*patterns.utf8two^1+Cc(3)*patterns.utf8three^1+Cc(4)*patterns.utf8four^1, - function(_,t,d) - n=n+(t-f)/d - f=t - return true + utf.len=string.utflength or (utf8 and utf8.len) + if not utf.len then + local n,f=0,1 + local utfcharcounter=patterns.utfbom^-1*Cmt ( + Cc(1)*patterns.utf8one^1+Cc(2)*patterns.utf8two^1+Cc(3)*patterns.utf8three^1+Cc(4)*patterns.utf8four^1, + function(_,t,d) + n=n+(t-f)/d + f=t + return true + end + )^0 + function utf.len(str) + n,f=0,1 + lpegmatch(utfcharcounter,str or "") + return n end - )^0 - function utf.len(str) - n,f=0,1 - lpegmatch(utfcharcounter,str or "") - return n end end utf.length=utf.len @@ -5475,20 +5759,22 @@ function utf.utf32_to_utf8_t(t,endian) end local function little(b) if b<0x10000 then - return char(b%256,b/256) + return char(b%256,rshift(b,8)) else b=b-0x10000 - local b1,b2=b/1024+0xD800,b%1024+0xDC00 - return char(b1%256,b1/256,b2%256,b2/256) + local b1=rshift(b,10)+0xD800 + local b2=b%1024+0xDC00 + return char(b1%256,rshift(b1,8),b2%256,rshift(b2,8)) end end local function big(b) if b<0x10000 then - return char(b/256,b%256) + return char(rshift(b,8),b%256) else b=b-0x10000 - local b1,b2=b/1024+0xD800,b%1024+0xDC00 - return char(b1/256,b1%256,b2/256,b2%256) + local b1=rshift(b,10)+0xD800 + local b2=b%1024+0xDC00 + return char(rshift(b1,8),b1%256,rshift(b2,8),b2%256) end end local l_remap=Cs((p_utf8byte/little+P(1)/"")^0) @@ -5609,22 +5895,43 @@ function utf.chrlen(u) (u<0xFC and 5) or (u<0xFE and 6) or 0 end -local extract=bit32.extract -local char=string.char -function unicode.toutf32string(n) - if n<=0xFF then - return - char(n).."\000\000\000" - elseif n<=0xFFFF then - return - char(extract(n,0,8))..char(extract(n,8,8)).."\000\000" - elseif n<=0xFFFFFF then - return - char(extract(n,0,8))..char(extract(n,8,8))..char(extract(n,16,8)).."\000" - else - return - char(extract(n,0,8))..char(extract(n,8,8))..char(extract(n,16,8))..char(extract(n,24,8)) +if bit32 then + local extract=bit32.extract + local char=string.char + function unicode.toutf32string(n) + if n<=0xFF then + return + char(n).."\000\000\000" + elseif n<=0xFFFF then + return + char(extract(n,0,8))..char(extract(n,8,8)).."\000\000" + elseif n<=0xFFFFFF then + return + char(extract(n,0,8))..char(extract(n,8,8))..char(extract(n,16,8)).."\000" + else + return + char(extract(n,0,8))..char(extract(n,8,8))..char(extract(n,16,8))..char(extract(n,24,8)) + end + end +end +local len=utf.len +local rep=rep +function string.utfpadd(s,n) + if n and n~=0 then + local l=len(s) + if n>0 then + local d=n-l + if d>0 then + return rep(c or " ",d)..s + end + else + local d=- n-l + if d>0 then + return s..rep(c or " ",d) + end + end end + return s end @@ -5634,7 +5941,7 @@ do -- create closure to overcome 200 locals limit package.loaded["l-math"] = package.loaded["l-math"] or true --- original size: 974, stripped down to: 890 +-- original size: 2555, stripped down to: 1900 if not modules then modules={} end modules ['l-math']={ version=1.001, @@ -5643,21 +5950,23 @@ if not modules then modules={} end modules ['l-math']={ copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" } -local floor,sin,cos,tan=math.floor,math.sin,math.cos,math.tan if not math.ceiling then math.ceiling=math.ceil end if not math.round then + local floor=math.floor function math.round(x) return floor(x+0.5) end end if not math.div then + local floor=math.floor function math.div(n,m) return floor(n/m) end end if not math.mod then function math.mod(n,m) return n%m end end -local pipi=2*math.pi/360 if not math.sind then + local sin,cos,tan=math.sin,math.cos,math.tan + local pipi=2*math.pi/360 function math.sind(d) return sin(d*pipi) end function math.cosd(d) return cos(d*pipi) end function math.tand(d) return tan(d*pipi) end @@ -5666,6 +5975,60 @@ if not math.odd then function math.odd (n) return n%2~=0 end function math.even(n) return n%2==0 end end +if not math.cosh then + local exp=math.exp + function math.cosh(x) + local xx=exp(x) + return (xx+1/xx)/2 + end + function math.sinh(x) + local xx=exp(x) + return (xx-1/xx)/2 + end + function math.tanh(x) + local xx=exp(x) + return (xx-1/xx)/(xx+1/xx) + end +end +if not math.pow then + function math.pow(x,y) + return x^y + end +end +if not math.atan2 then + math.atan2=math.atan +end +if not math.ldexp then + function math.ldexp(x,e) + return x*2.0^e + end +end +if not math.log10 then + local log=math.log + function math.log10(x) + return log(x,10) + end +end +if not math.type then + function math.type() + return "float" + end +end +if not math.tointeger then + math.mininteger=-0x4FFFFFFFFFFF + math.maxinteger=0x4FFFFFFFFFFF + local floor=math.floor + function math.tointeger(n) + local f=floor(n) + return f==n and f or nil + end +end +if not math.ult then + local floor=math.floor + function math.tointeger(m,n) + return floor(m)<floor(n) + end +end end -- of closure @@ -5674,7 +6037,7 @@ do -- create closure to overcome 200 locals limit package.loaded["util-str"] = package.loaded["util-str"] or true --- original size: 36148, stripped down to: 20179 +-- original size: 38725, stripped down to: 21726 if not modules then modules={} end modules ['util-str']={ version=1.001, @@ -5688,13 +6051,13 @@ utilities.strings=utilities.strings or {} local strings=utilities.strings local format,gsub,rep,sub,find=string.format,string.gsub,string.rep,string.sub,string.find local load,dump=load,string.dump -local tonumber,type,tostring=tonumber,type,tostring +local tonumber,type,tostring,next=tonumber,type,tostring,next local unpack,concat=table.unpack,table.concat local P,V,C,S,R,Ct,Cs,Cp,Carg,Cc=lpeg.P,lpeg.V,lpeg.C,lpeg.S,lpeg.R,lpeg.Ct,lpeg.Cs,lpeg.Cp,lpeg.Carg,lpeg.Cc local patterns,lpegmatch=lpeg.patterns,lpeg.match -local utfchar,utfbyte=utf.char,utf.byte +local utfchar,utfbyte,utflen=utf.char,utf.byte,utf.len local loadstripped=nil -if _LUAVERSION<5.2 then +if LUAVERSION<5.2 then loadstripped=function(str,shortcuts) return load(str) end @@ -5782,6 +6145,17 @@ local pattern=Carg(1)/function(t) function strings.tabtospace(str,tab) return lpegmatch(pattern,str,1,tab or 7) end +function string.utfpadding(s,n) + if not n or n==0 then + return "" + end + local l=utflen(s) + if n>0 then + return nspaces[n-l] + else + return nspaces[-n-l] + end +end local space=spacer^0 local nospace=space/"" local endofline=nospace*newline @@ -5888,6 +6262,21 @@ function number.formatted(n,sep1,sep2) return lpegmatch(splitter,s,1,sep1 or ",",sep2 or ".") end end +local p=Cs( + P("-")^0*(P("0")^1/"")^0*(1-P("."))^0*(P(".")*P("0")^1*P(-1)/""+P(".")^0)*P(1-P("0")^1*P(-1))^0 + ) +function number.compactfloat(n,fmt) + if n==0 then + return "0" + elseif n==1 then + return "1" + end + n=lpegmatch(p,format(fmt or "%0.3f",n)) + if n=="." or n=="" or n=="-" then + return "0" + end + return n +end local zero=P("0")^1/"" local plus=P("+")/"" local minus=P("-") @@ -5940,7 +6329,7 @@ local template=[[ return function(%s) return %s end ]] local preamble,environment="",{} -if _LUAVERSION<5.2 then +if LUAVERSION<5.2 then preamble=[[ local lpeg=lpeg local type=type @@ -5955,6 +6344,7 @@ local utfchar=utf.char local utfbyte=utf.byte local lpegmatch=lpeg.match local nspaces=string.nspaces +local utfpadding=string.utfpadding local tracedchar=string.tracedchar local autosingle=string.autosingle local autodouble=string.autodouble @@ -5979,6 +6369,7 @@ else utfbyte=utf.byte, lpegmatch=lpeg.match, nspaces=string.nspaces, + utfpadding=string.utfpadding, tracedchar=string.tracedchar, autosingle=string.autosingle, autodouble=string.autodouble, @@ -6014,9 +6405,32 @@ local format_S=function(f) return format("tostring(a%s)",n) end end +local format_right=function(f) + n=n+1 + f=tonumber(f) + if not f or f==0 then + return format("(a%s or '')",n) + elseif f>0 then + return format("utfpadding(a%s,%i)..a%s",n,f,n) + else + return format("a%s..utfpadding(a%s,%i)",n,n,f) + end +end +local format_left=function(f) + n=n+1 + f=tonumber(f) + if not f or f==0 then + return format("(a%s or '')",n) + end + if f<0 then + return format("utfpadding(a%s,%i)..a%s",n,-f,n) + else + return format("a%s..utfpadding(a%s,%i)",n,n,-f) + end +end local format_q=function() n=n+1 - return format("(a%s and format('%%q',a%s) or '')",n,n) + return format("(a%s ~= nil and format('%%q',tostring(a%s)) or '')",n,n) end local format_Q=function() n=n+1 @@ -6268,6 +6682,8 @@ local builder=Cs { "start", +V("j")+V("J") +V("m")+V("M") +V("z") ++V(">") ++V("<") )+V("*") )*(P(-1)+Carg(1)) )^0, @@ -6285,7 +6701,7 @@ local builder=Cs { "start", ["X"]=(prefix_any*P("X"))/format_X, ["o"]=(prefix_any*P("o"))/format_o, ["S"]=(prefix_any*P("S"))/format_S, - ["Q"]=(prefix_any*P("Q"))/format_S, + ["Q"]=(prefix_any*P("Q"))/format_Q, ["N"]=(prefix_any*P("N"))/format_N, ["k"]=(prefix_sub*P("k"))/format_k, ["c"]=(prefix_any*P("c"))/format_c, @@ -6311,6 +6727,8 @@ local builder=Cs { "start", ["z"]=(prefix_any*P("z"))/format_z, ["a"]=(prefix_any*P("a"))/format_a, ["A"]=(prefix_any*P("A"))/format_A, + ["<"]=(prefix_any*P("<"))/format_left, + [">"]=(prefix_any*P(">"))/format_right, ["*"]=Cs(((1-P("%"))^1+P("%%")/"%%")^1)/format_rest, ["?"]=Cs(((1-P("%"))^1 )^1)/format_rest, ["!"]=Carg(2)*prefix_any*P("!")*C((1-P("!"))^1)*P("!")/format_extension, @@ -6341,7 +6759,7 @@ local function use(t,fmt,...) return t[fmt](...) end strings.formatters={} -if _LUAVERSION<5.2 then +if LUAVERSION<5.2 then function strings.formatters.new(noconcat) local t={ _type_="formatter",_connector_=noconcat and "," or "..",_extensions_={},_preamble_=preamble,_environment_={} } setmetatable(t,{ __index=make,__call=use }) @@ -6378,7 +6796,7 @@ patterns.xmlescape=Cs((P("<")/"<"+P(">")/">"+P("&")/"&"+P('"')/"" patterns.texescape=Cs((C(S("#$%\\{}"))/"\\%1"+P(1))^0) patterns.luaescape=Cs(((1-S('"\n'))^1+P('"')/'\\"'+P('\n')/'\\n"')^0) patterns.luaquoted=Cs(Cc('"')*((1-S('"\n'))^1+P('"')/'\\"'+P('\n')/'\\n"')^0*Cc('"')) -if _LUAVERSION<5.2 then +if LUAVERSION<5.2 then add(formatters,"xml",[[lpegmatch(xmlescape,%s)]],"local xmlescape = lpeg.patterns.xmlescape") add(formatters,"tex",[[lpegmatch(texescape,%s)]],"local texescape = lpeg.patterns.texescape") add(formatters,"lua",[[lpegmatch(luaescape,%s)]],"local luaescape = lpeg.patterns.luaescape") @@ -6400,6 +6818,21 @@ local pattern=Cs((newline/(os.newline or "\r")+1)^0) function string.replacenewlines(str) return lpegmatch(pattern,str) end +function strings.newcollector() + local result,r={},0 + return + function(fmt,str,...) + r=r+1 + result[r]=str==nil and fmt or formatters[fmt](str,...) + end, + function(connector) + if result then + local str=concat(result,connector) + result,r={},0 + return str + end + end +end end -- of closure @@ -6408,7 +6841,7 @@ do -- create closure to overcome 200 locals limit package.loaded["util-tab"] = package.loaded["util-tab"] or true --- original size: 27407, stripped down to: 17116 +-- original size: 27665, stripped down to: 17051 if not modules then modules={} end modules ['util-tab']={ version=1.001, @@ -6788,11 +7221,6 @@ function table.drop(t,slow) return fastdrop(t) end end -function table.autokey(t,k) - local v={} - t[k]=v - return v -end local selfmapper={ __index=function(t,k) t[k]=k return k end } function table.twowaymapper(t) if not t then @@ -7037,7 +7465,7 @@ do -- create closure to overcome 200 locals limit package.loaded["util-fil"] = package.loaded["util-fil"] or true --- original size: 7567, stripped down to: 5575 +-- original size: 7787, stripped down to: 5858 if not modules then modules={} end modules ['util-fil']={ version=1.001, @@ -7048,8 +7476,6 @@ if not modules then modules={} end modules ['util-fil']={ } local byte=string.byte local char=string.char -local extract=bit32 and bit32.extract -local floor=math.floor utilities=utilities or {} local files={} utilities.files=files @@ -7066,7 +7492,10 @@ function files.close(f) f:close() end function files.size(f) - return f:seek("end") + local current=f:seek() + local size=f:seek("end") + f:seek("set",current) + return size end files.getsize=files.size function files.setposition(f,n) @@ -7216,7 +7645,7 @@ function files.readfixed4(f) return (0x100*a+b )+(0x100*c+d)/0x10000 end end -if extract then +if bit32 then local extract=bit32.extract local band=bit32.band function files.read2dot14(f) @@ -7236,19 +7665,30 @@ end function files.skiplong(f,n) f:read(4*(n or 1)) end -function files.writecardinal2(f,n) - local a=char(n%256) - n=floor(n/256) - local b=char(n%256) - f:write(b,a) +if bit32 then + local rshift=bit32.rshift + function files.writecardinal2(f,n) + local a=char(n%256) + n=rshift(n,8) + local b=char(n%256) + f:write(b,a) + end +else + local floor=math.floor + function files.writecardinal2(f,n) + local a=char(n%256) + n=floor(n/256) + local b=char(n%256) + f:write(b,a) + end end function files.writecardinal4(f,n) local a=char(n%256) - n=floor(n/256) + n=rshift(n,8) local b=char(n%256) - n=floor(n/256) + n=rshift(n,8) local c=char(n%256) - n=floor(n/256) + n=rshift(n,8) local d=char(n%256) f:write(d,c,b,a) end @@ -7267,6 +7707,8 @@ if fio and fio.readcardinal1 then files.readinteger2=fio.readinteger2 files.readinteger3=fio.readinteger3 files.readinteger4=fio.readinteger4 + files.readfixed2=fio.readfixed2 + files.readfixed4=fio.readfixed4 files.read2dot14=fio.read2dot14 files.setposition=fio.setposition files.getposition=fio.getposition @@ -7634,7 +8076,7 @@ do -- create closure to overcome 200 locals limit package.loaded["util-sto"] = package.loaded["util-sto"] or true --- original size: 3926, stripped down to: 2742 +-- original size: 6449, stripped down to: 3069 if not modules then modules={} end modules ['util-sto']={ version=1.001, @@ -7643,7 +8085,7 @@ if not modules then modules={} end modules ['util-sto']={ copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" } -local setmetatable,getmetatable,type=setmetatable,getmetatable,type +local setmetatable,getmetatable,rawset,type=setmetatable,getmetatable,rawset,type utilities=utilities or {} utilities.storage=utilities.storage or {} local storage=utilities.storage @@ -7753,6 +8195,25 @@ function table.setmetatablecall(t,f) end return t end +function table.setmetatableindices(t,f,n,c) + if type(t)~="table" then + f,t=t,{} + end + local m=getmetatable(t) + local i=f_index[f] or f + if m then + m.__index=i + m.__newindex=n + m.__call=c + else + setmetatable(t,{ + __index=i, + __newindex=n, + __call=c, + }) + end + return t +end function table.setmetatablekey(t,key,value) local m=getmetatable(t) if not m then @@ -7774,7 +8235,7 @@ do -- create closure to overcome 200 locals limit package.loaded["util-prs"] = package.loaded["util-prs"] or true --- original size: 22883, stripped down to: 16045 +-- original size: 22956, stripped down to: 16106 if not modules then modules={} end modules ['util-prs']={ version=1.001, @@ -8192,14 +8653,16 @@ function parsers.rfc4180splitter(specification) local field=escaped+non_escaped+Cc("") local record=Ct(field*(separator*field)^1) local headerline=record*Cp() - local wholeblob=Ct((newline^(specification.strict and -1 or 1)*record)^0) + local morerecords=(newline^(specification.strict and -1 or 1)*record)^0 + local headeryes=Ct(morerecords) + local headernop=Ct(record*morerecords) return function(data,getheader) if getheader then local header,position=lpegmatch(headerline,data) - local data=lpegmatch(wholeblob,data,position) + local data=lpegmatch(headeryes,data,position) return data,header else - return lpegmatch(wholeblob,data) + return lpegmatch(headernop,data) end end end @@ -8220,8 +8683,8 @@ end local cardinal=lpegpatterns.cardinal/tonumber local spacers=lpegpatterns.spacer^0 local endofstring=lpegpatterns.endofstring -local stepper=spacers*(C(cardinal)*(spacers*S(":-")*spacers*(C(cardinal)+Cc(true) )+Cc(false) )*Carg(1)*Carg(2)/ranger*S(", ")^0 )^1 -local stepper=spacers*(C(cardinal)*(spacers*S(":-")*spacers*(C(cardinal)+(P("*")+endofstring)*Cc(true) )+Cc(false) )*Carg(1)*Carg(2)/ranger*S(", ")^0 )^1*endofstring +local stepper=spacers*(cardinal*(spacers*S(":-")*spacers*(cardinal+Cc(true) )+Cc(false) )*Carg(1)*Carg(2)/ranger*S(", ")^0 )^1 +local stepper=spacers*(cardinal*(spacers*S(":-")*spacers*(cardinal+(P("*")+endofstring)*Cc(true) )+Cc(false) )*Carg(1)*Carg(2)/ranger*S(", ")^0 )^1*endofstring function parsers.stepper(str,n,action) if type(n)=="function" then lpegmatch(stepper,str,1,false,n or print) @@ -8408,7 +8871,7 @@ do -- create closure to overcome 200 locals limit package.loaded["trac-set"] = package.loaded["trac-set"] or true --- original size: 12454, stripped down to: 8840 +-- original size: 13044, stripped down to: 9231 if not modules then modules={} end modules ['trac-set']={ version=1.001, @@ -8417,8 +8880,8 @@ if not modules then modules={} end modules ['trac-set']={ copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" } -local type,next,tostring=type,next,tostring -local concat=table.concat +local type,next,tostring,tonumber=type,next,tostring,tonumber +local concat,sortedhash=table.concat,table.sortedhash local format,find,lower,gsub,topattern=string.format,string.find,string.lower,string.gsub,string.topattern local is_boolean=string.is_boolean local settings_to_hash=utilities.parsers.settings_to_hash @@ -8435,7 +8898,7 @@ function setters.initialize(filename,name,values) frozen=true local data=setter.data if data then - for key,newvalue in next,values do + for key,newvalue in sortedhash(values) do local newvalue=is_boolean(newvalue,newvalue,true) local functions=data[key] if functions then @@ -8484,7 +8947,7 @@ local function set(t,what,newvalue) done={} t.done=done end - for w,value in next,what do + for w,value in sortedhash(what) do if value=="" then value=newvalue elseif not value then @@ -8493,7 +8956,7 @@ local function set(t,what,newvalue) value=is_boolean(value,value,true) end w=topattern(w,true,true) - for name,functions in next,data do + for name,functions in sortedhash(data) do if done[name] then elseif find(name,w) then done[name]=true @@ -8509,7 +8972,7 @@ end local function reset(t) local data=t.data if not data.frozen then - for name,functions in next,data do + for name,functions in sortedthash(data) do for i=1,#functions do functions[i](false) end @@ -8600,13 +9063,30 @@ function setters.show(t) local name=list[k] local functions=t.data[name] if functions then - local value,default,modules=functions.value,functions.default,#functions - value=value==nil and "unset" or tostring(value) - default=default==nil and "unset" or tostring(default) - t.report("%-50s modules: %2i default: %-12s value: %-12s",name,modules,default,value) + local value=functions.value + local default=functions.default + local modules=#functions + if default==nil then + default="unset" + elseif type(default)=="table" then + default=concat(default,"|") + else + default=tostring(default) + end + if value==nil then + value="unset" + elseif type(value)=="table" then + value=concat(value,"|") + else + value=tostring(value) + end + t.report(name) + t.report(" modules : %i",modules) + t.report(" default : %s",default) + t.report(" value : %s",value) + t.report() end end - t.report() end local enable,disable,register,list,show=setters.enable,setters.disable,setters.register,setters.list,setters.show function setters.report(setter,...) @@ -8720,7 +9200,7 @@ do -- create closure to overcome 200 locals limit package.loaded["trac-log"] = package.loaded["trac-log"] or true --- original size: 30007, stripped down to: 20818 +-- original size: 32737, stripped down to: 22946 if not modules then modules={} end modules ['trac-log']={ version=1.001, @@ -8739,7 +9219,8 @@ local datetime=os.date local openfile=io.open local setmetatableindex=table.setmetatableindex local formatters=string.formatters -local texgetcount=tex and tex.getcount +local settings_to_hash=utilities.parsers.settings_to_hash +local sortedkeys=table.sortedkeys local variant="default" logs=logs or {} local logs=logs @@ -9166,14 +9647,14 @@ logs.direct=direct logs.subdirect=subdirect logs.writer=writer logs.newline=newline -local data,states={},nil +local data={} +local states=nil +local force=false function logs.reporter(category,subcategory) local logger=data[category] if not logger then - local state=false - if states==true then - state=true - elseif type(states)=="table" then + local state=states==true + if not state and type(states)=="table" then for c,_ in next,states do if find(category,c) then state=true @@ -9191,7 +9672,7 @@ function logs.reporter(category,subcategory) if not reporter then if subcategory then reporter=function(...) - if not logger.state then + if force or not logger.state then subreport(category,subcategory,...) end end @@ -9199,7 +9680,7 @@ function logs.reporter(category,subcategory) else local tag=category reporter=function(...) - if not logger.state then + if force or not logger.state then report(category,...) end end @@ -9225,7 +9706,7 @@ function logs.messenger(category,subcategory) end end local function setblocked(category,value) - if category==true then + if category==true or category=="all" then category,value="*",true elseif category==false then category,value="*",false @@ -9238,7 +9719,8 @@ local function setblocked(category,value) v.state=value end else - states=utilities.parsers.settings_to_hash(category,type(states)=="table" and states or nil) + alllocked=false + states=settings_to_hash(category,type(states)=="table" and states or nil) for c in next,states do local v=data[c] if v then @@ -9261,7 +9743,7 @@ function logs.enable(category) setblocked(category,false) end function logs.categories() - return table.sortedkeys(data) + return sortedkeys(data) end function logs.show() local n,c,s,max=0,0,0,0 @@ -9283,7 +9765,7 @@ function logs.show() max=m end end - local subcategories=concat(table.sortedkeys(reporters),", ") + local subcategories=concat(sortedkeys(reporters),", ") if state==true then state="disabled" elseif state==false then @@ -9310,54 +9792,57 @@ end) directives.register("logs.target",function(v) settarget(v) end) -local report_pages=logs.reporter("pages") -local real,user,sub -function logs.start_page_number() - real=texgetcount("realpageno") - user=texgetcount("userpageno") - sub=texgetcount("subpageno") -end -local timing=false -local starttime=nil -local lasttime=nil -trackers.register("pages.timing",function(v) - starttime=os.clock() - timing=true -end) -function logs.stop_page_number() - if timing then - local elapsed,average - local stoptime=os.clock() - if not lasttime or real<2 then - elapsed=stoptime - average=stoptime - starttime=stoptime - else - elapsed=stoptime-lasttime - average=(stoptime-starttime)/(real-1) - end - lasttime=stoptime - if real<=0 then - report_pages("flushing page, time %0.04f / %0.04f",elapsed,average) - elseif user<=0 then - report_pages("flushing realpage %s, time %0.04f / %0.04f",real,elapsed,average) - elseif sub<=0 then - report_pages("flushing realpage %s, userpage %s, time %0.04f / %0.04f",real,user,elapsed,average) - else - report_pages("flushing realpage %s, userpage %s, subpage %s, time %0.04f / %0.04f",real,user,sub,elapsed,average) - end - else - if real<=0 then - report_pages("flushing page") - elseif user<=0 then - report_pages("flushing realpage %s",real) - elseif sub<=0 then - report_pages("flushing realpage %s, userpage %s",real,user) +if tex then + local report=logs.reporter("pages") + local texgetcount=tex and tex.getcount + local real,user,sub + function logs.start_page_number() + real=texgetcount("realpageno") + user=texgetcount("userpageno") + sub=texgetcount("subpageno") + end + local timing=false + local starttime=nil + local lasttime=nil + trackers.register("pages.timing",function(v) + starttime=os.clock() + timing=true + end) + function logs.stop_page_number() + if timing then + local elapsed,average + local stoptime=os.clock() + if not lasttime or real<2 then + elapsed=stoptime + average=stoptime + starttime=stoptime + else + elapsed=stoptime-lasttime + average=(stoptime-starttime)/(real-1) + end + lasttime=stoptime + if real<=0 then + report("flushing page, time %0.04f / %0.04f",elapsed,average) + elseif user<=0 then + report("flushing realpage %s, time %0.04f / %0.04f",real,elapsed,average) + elseif sub<=0 then + report("flushing realpage %s, userpage %s, time %0.04f / %0.04f",real,user,elapsed,average) + else + report("flushing realpage %s, userpage %s, subpage %s, time %0.04f / %0.04f",real,user,sub,elapsed,average) + end else - report_pages("flushing realpage %s, userpage %s, subpage %s",real,user,sub) + if real<=0 then + report("flushing page") + elseif user<=0 then + report("flushing realpage %s",real) + elseif sub<=0 then + report("flushing realpage %s, userpage %s",real,user) + else + report("flushing realpage %s, userpage %s, subpage %s",real,user,sub) + end end + logs.flush() end - logs.flush() end local nesting=0 local verbose=false @@ -9512,6 +9997,92 @@ io.stderr:setvbuf('no') if package.helpers.report then package.helpers.report=logs.reporter("package loader") end +if tex then + local finalactions={} + local fatalerrors={} + local possiblefatal={} + local loggingerrors=false + function logs.loggingerrors() + return loggingerrors + end + directives.register("logs.errors",function(v) + loggingerrors=v + if type(v)=="string" then + fatalerrors=settings_to_hash(v) + else + fatalerrors={} + end + end) + function logs.registerfinalactions(...) + insert(finalactions,...) + end + local what=nil + local report=nil + local state=nil + local target=nil + local function startlogging(t,r,w,s) + target=t + state=force + force=true + report=type(r)=="function" and r or logs.reporter(r) + what=w + pushtarget(target) + newline() + if s then + report("start %s: %s",what,s) + else + report("start %s",what) + end + if target=="logfile" then + newline() + end + return report + end + local function stoplogging() + if target=="logfile" then + newline() + end + report("stop %s",what) + if target=="logfile" then + newline() + end + poptarget() + state=oldstate + end + function logs.startfilelogging(...) + return startlogging("logfile",...) + end + logs.stopfilelogging=stoplogging + local done=false + function logs.starterrorlogging(r,w,...) + if not done then + pushtarget("terminal") + newline() + logs.report("error logging","start possible issues") + poptarget() + done=true + end + if fatalerrors[w] then + possiblefatal[w]=true + end + return startlogging("terminal",r,w,...) + end + logs.stoperrorlogging=stoplogging + function logs.finalactions() + if #finalactions>0 then + for i=1,#finalactions do + finalactions[i]() + end + if done then + pushtarget("terminal") + newline() + logs.report("error logging","stop possible issues") + poptarget() + end + return next(possiblefatal) and sortedkeys(possiblefatal) or false + end + end +end end -- of closure @@ -9520,7 +10091,7 @@ do -- create closure to overcome 200 locals limit package.loaded["trac-inf"] = package.loaded["trac-inf"] or true --- original size: 8036, stripped down to: 5567 +-- original size: 8284, stripped down to: 5698 if not modules then modules={} end modules ['trac-inf']={ version=1.001, @@ -9556,7 +10127,7 @@ local ticks=clock local seconds=function(n) return n or 0 end local function starttiming(instance) local timer=timers[instance or "notimer"] - local it=timer.timing or 0 + local it=timer.timing if it==0 then timer.starttime=ticks() if not timer.loadtime then @@ -9586,7 +10157,7 @@ local function stoptiming(instance) end local function elapsed(instance) if type(instance)=="number" then - return instance or 0 + return instance else local timer=timers[instance or "notimer"] return timer and seconds(timer.loadtime) or 0 @@ -9627,8 +10198,9 @@ function statistics.show() return format("%s, type: %s, binary subtree: %s", os.platform or "unknown",os.type or "unknown",environment.texos or "unknown") end) - register("luatex banner",function() - return lower(status.banner) + register("used engine",function() + return format("%s version %s with functionality level %s, banner: %s", + LUATEXENGINE,LUATEXVERSION,LUATEXFUNCTIONALITY,lower(status.banner)) end) register("control sequences",function() return format("%s of %s + %s",status.cs_count,status.hash_size,status.hash_extra) @@ -9650,8 +10222,9 @@ function statistics.show() local hashchar=tonumber(status.luatex_hashchars) local hashtype=status.luatex_hashtype local mask=lua.mask or "ascii" - return format("engine: %s, used memory: %s, hash type: %s, hash chars: min(%s,40), symbol mask: %s (%s)", + return format("engine: %s %s, used memory: %s, hash type: %s, hash chars: min(%i,40), symbol mask: %s (%s)", jit and "luajit" or "lua", + LUAVERSION, statistics.memused(), hashtype or "default", hashchar and 2^hashchar or "unknown", @@ -9707,7 +10280,7 @@ do -- create closure to overcome 200 locals limit package.loaded["trac-pro"] = package.loaded["trac-pro"] or true --- original size: 5829, stripped down to: 3501 +-- original size: 5841, stripped down to: 3511 if not modules then modules={} end modules ['trac-pro']={ version=1.001, @@ -9716,7 +10289,7 @@ if not modules then modules={} end modules ['trac-pro']={ copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" } -local getmetatable,setmetatable,rawset,type=getmetatable,setmetatable,rawset,type +local getmetatable,setmetatable,rawset,type,next=getmetatable,setmetatable,rawset,type,next local trace_namespaces=false trackers.register("system.namespaces",function(v) trace_namespaces=v end) local report_system=logs.reporter("system","protection") namespaces=namespaces or {} @@ -9854,7 +10427,7 @@ do -- create closure to overcome 200 locals limit package.loaded["util-lua"] = package.loaded["util-lua"] or true --- original size: 5396, stripped down to: 3708 +-- original size: 6921, stripped down to: 4998 if not modules then modules={} end modules ['util-lua']={ version=1.001, @@ -9865,13 +10438,14 @@ if not modules then modules={} end modules ['util-lua']={ license="see context related readme files" } local rep,sub,byte,dump,format=string.rep,string.sub,string.byte,string.dump,string.format -local load,loadfile,type=load,loadfile,type +local load,loadfile,type,collectgarbage=load,loadfile,type,collectgarbage utilities=utilities or {} utilities.lua=utilities.lua or {} local luautilities=utilities.lua local report_lua=logs.reporter("system","lua") +local report_mem=logs.reporter("system","lua memory") local tracestripping=false -local forcestupidcompile=true +local tracememory=false luautilities.stripcode=true luautilities.alwaysstripcode=false luautilities.nofstrippedchunks=0 @@ -9915,11 +10489,19 @@ local function stupidcompile(luafile,lucfile,strip) end return false,0 end -function luautilities.loadedluacode(fullname,forcestrip,name) +function luautilities.loadedluacode(fullname,forcestrip,name,macros) name=name or fullname local code,message - if environment.loadpreprocessedfile then - code,message=environment.loadpreprocessedfile(fullname) + if macros then + macros=lua.macros + end + if macros and macros.enabled then + local f=io.open(fullname,"rb") local c=f:read("*a") f:close() + local n=c and macros.resolvestring("--[["..fullname.."]] "..c) + if n and #n~=#c then + report_lua("preprocessed file %a: %i => %i bytes",fullname,#c,#n) + end + code,message=load(n or c) else code,message=loadfile(fullname) end @@ -9945,7 +10527,7 @@ function luautilities.loadedluacode(fullname,forcestrip,name) return code,0 end end -function luautilities.strippedloadstring(code,forcestrip,name) +function luautilities.strippedloadstring(code,name,forcestrip) local code,message=load(code) if not code then report_lua("loading of file %a failed:\n\t%s",name,message or "no message") @@ -9957,6 +10539,13 @@ function luautilities.strippedloadstring(code,forcestrip,name) return code,0 end end +function luautilities.loadstring(code,name) + local code,message=load(code) + if not code then + report_lua("loading of file %a failed:\n\t%s",name,message or "no message") + end + return code,0 +end function luautilities.compile(luafile,lucfile,cleanup,strip,fallback) report_lua("compiling %a into %a",luafile,lucfile) os.remove(lucfile) @@ -9987,6 +10576,26 @@ setmetatable(finalizers,{ function luautilities.registerfinalizer(f) finalizers[#finalizers+1]=f end +function luautilities.checkmemory(previous,threshold,trace) + local current=collectgarbage("count") + if previous then + local checked=(threshold or 64)*1024 + local delta=current-previous + if current-previous>checked then + collectgarbage("collect") + local afterwards=collectgarbage("count") + if trace or tracememory then + report_mem("previous %i MB, current %i MB, delta %i MB, threshold %i MB, afterwards %i MB", + previous/1024,current/1024,delta/1024,threshold,afterwards) + end + return afterwards + elseif trace or tracememory then + report_mem("previous %i MB, current %i MB, delta %i MB, threshold %i MB", + previous/1024,current/1024,delta/1024,threshold) + end + end + return current +end end -- of closure @@ -9995,7 +10604,7 @@ do -- create closure to overcome 200 locals limit package.loaded["util-deb"] = package.loaded["util-deb"] or true --- original size: 8911, stripped down to: 6504 +-- original size: 8984, stripped down to: 6573 if not modules then modules={} end modules ['util-deb']={ version=1.001, @@ -10121,7 +10730,8 @@ function debugger.showstats(printer,threshold) local functions=0 local dataset={} local length=0 - local wholetime=0 + local realtime=0 + local totaltime=0 local threshold=threshold or 0 for name,sources in next,names do for source,lines in next,sources do @@ -10138,8 +10748,9 @@ function debugger.showstats(printer,threshold) if real<0 then real=0 end - wholetime=wholetime+real + realtime=realtime+real end + totaltime=totaltime+total if line<0 then line=0 end @@ -10174,7 +10785,7 @@ function debugger.showstats(printer,threshold) if length>50 then length=50 end - local fmt=string.formatters["%4.9k %4.9k %3.3k %8i %-"..length.."s %4i %s"] + local fmt=string.formatters["%4.9k s %3.3k %% %4.9k s %3.3k %% %8i # %-"..length.."s %4i %s"] for i=1,#dataset do local data=dataset[i] local real=data[1] @@ -10183,14 +10794,13 @@ function debugger.showstats(printer,threshold) local name=data[4] local source=data[5] local line=data[6] - local percent=real/wholetime calls=calls+count functions=functions+1 name=gsub(name,"%s+"," ") if #name>length then name=sub(name,1,length) end - printer(fmt(seconds(total),seconds(real),percent,count,name,line,source)) + printer(fmt(seconds(total),100*total/totaltime,seconds(real),100*real/realtime,count,name,line,source)) end printer("") printer(format("functions : %i",functions)) @@ -10254,7 +10864,7 @@ do -- create closure to overcome 200 locals limit package.loaded["util-tpl"] = package.loaded["util-tpl"] or true --- original size: 7100, stripped down to: 3978 +-- original size: 7112, stripped down to: 3988 if not modules then modules={} end modules ['util-tpl']={ version=1.001, @@ -10267,7 +10877,7 @@ utilities.templates=utilities.templates or {} local templates=utilities.templates local trace_template=false trackers.register("templates.trace",function(v) trace_template=v end) local report_template=logs.reporter("template") -local tostring=tostring +local tostring,next=tostring,next local format,sub,byte=string.format,string.sub,string.byte local P,C,R,Cs,Cc,Carg,lpegmatch,lpegpatterns=lpeg.P,lpeg.C,lpeg.R,lpeg.Cs,lpeg.Cc,lpeg.Carg,lpeg.match,lpeg.patterns local replacer @@ -10399,7 +11009,7 @@ do -- create closure to overcome 200 locals limit package.loaded["util-sbx"] = package.loaded["util-sbx"] or true --- original size: 20309, stripped down to: 13848 +-- original size: 20393, stripped down to: 13924 if not modules then modules={} end modules ['util-sbx']={ version=1.001, @@ -10424,6 +11034,7 @@ local concat=string.concat local unquoted=string.unquoted local optionalquoted=string.optionalquoted local basename=file.basename +local nameonly=file.nameonly local sandbox=sandbox local validroots={} local validrunners={} @@ -10503,9 +11114,9 @@ local function registerlibrary(name) return end if validlibraries==true then - validlibraries={ [name]=true } + validlibraries={ [nameonly(name)]=true } else - validlibraries[name]=true + validlibraries[nameonly(name)]=true end elseif name==true then validlibraries={} @@ -10780,7 +11391,7 @@ function sandbox.getrunner(name) return name and validrunners[name] end local function suspicious(str) - return (find(str,"[/\\]") or find(command,"%.%.")) and true or false + return (find(str,"[/\\]") or find(command,"..",1,true)) and true or false end local function binaryrunner(action,command,...) if validbinaries==false then @@ -10830,15 +11441,15 @@ if FFISUPPORTED and ffi then end end end - local load=ffi.load - if load then + local fiiload=ffi.load + if fiiload then local reported={} function ffi.load(name,...) if validlibraries==false then elseif validlibraries==true then - return load(name,...) - elseif validlibraries[name] then - return load(name,...) + return fiiload(name,...) + elseif validlibraries[nameonly(name)] then + return fiiload(name,...) else end if not reported[name] then @@ -11083,7 +11694,7 @@ do -- create closure to overcome 200 locals limit package.loaded["util-env"] = package.loaded["util-env"] or true --- original size: 9246, stripped down to: 5038 +-- original size: 9400, stripped down to: 5499 if not modules then modules={} end modules ['util-env']={ version=1.001, @@ -11098,8 +11709,21 @@ local unquoted,quoted,optionalquoted=string.unquoted,string.quoted,string.option local concat,insert,remove=table.concat,table.insert,table.remove environment=environment or {} local environment=environment -os.setlocale(nil,nil) -function os.setlocale() +local setlocale=os.setlocale +setlocale(nil,nil) +local report=logs.reporter("system") +function os.setlocale(a,b) + if a or b then + if report then + report() + report("You're messing with os.locale in a supposedly locale neutral enviroment. From") + report("now on are on your own and without support. Crashes or unexpected side effects") + report("can happen but don't bother the luatex and context developer team with it.") + report() + report=nil + end + setlocale(a,b) + end end local validengines=allocate { ["luatex"]=true, @@ -11270,7 +11894,7 @@ do -- create closure to overcome 200 locals limit package.loaded["luat-env"] = package.loaded["luat-env"] or true --- original size: 6174, stripped down to: 4141 +-- original size: 5820, stripped down to: 4155 if not modules then modules={} end modules ['luat-env']={ version=1.001, @@ -11344,11 +11968,11 @@ local function strippable(filename) return false end end -function environment.luafilechunk(filename,silent) +function environment.luafilechunk(filename,silent,macros) filename=file.replacesuffix(filename,"lua") local fullname=environment.luafile(filename) if fullname and fullname~="" then - local data=luautilities.loadedluacode(fullname,strippable,filename) + local data=luautilities.loadedluacode(fullname,strippable,filename,macros) if not silent then report_lua("loading file %a %s",fullname,not data and "failed" or "succeeded") end @@ -11423,7 +12047,7 @@ do -- create closure to overcome 200 locals limit package.loaded["lxml-tab"] = package.loaded["lxml-tab"] or true --- original size: 57003, stripped down to: 35696 +-- original size: 59638, stripped down to: 37936 if not modules then modules={} end modules ['lxml-tab']={ version=1.001, @@ -11469,8 +12093,17 @@ local entities,parameters local strip,utfize,resolve,cleanup,resolve_predefined,unify_predefined local dcache,hcache,acache local mt,dt,nt +local currentfilename,currentline,linenumbers +local grammar_parsed_text_one +local grammar_parsed_text_two +local grammar_unparsed_text +local handle_hex_entity +local handle_dec_entity +local handle_any_entity_dtd +local handle_any_entity_text local function preparexmlstate(settings) if settings then + linenumbers=settings.linenumbers stack={} level=0 top={} @@ -11487,6 +12120,8 @@ local function preparexmlstate(settings) unify_predefined=settings.unify_predefined_entities cleanup=settings.text_cleanup entities=settings.entities or {} + currentfilename=settings.currentresource + currentline=1 parameters={} reported_at_errors={} dcache={} @@ -11501,6 +12136,7 @@ local function preparexmlstate(settings) resolve_predefined=true end else + linenumbers=false stack=nil level=nil top=nil @@ -11522,6 +12158,8 @@ local function preparexmlstate(settings) dcache=nil hcache=nil acache=nil + currentfilename=nil + currentline=1 end end local function initialize_mt(root) @@ -11559,14 +12197,24 @@ local function add_empty(spacing,namespace,tag) top=stack[level] dt=top.dt nt=#dt+1 - local t={ + local t=linenumbers and { + ns=namespace or "", + rn=resolved, + tg=tag, + at=at, + dt={}, + ni=nt, + cf=currentfilename, + cl=currentline, + __p__=top, + } or { ns=namespace or "", rn=resolved, tg=tag, at=at, dt={}, ni=nt, - __p__=top + __p__=top, } dt[nt]=t setmetatable(t,mt) @@ -11581,18 +12229,28 @@ local function add_begin(spacing,namespace,tag) dt[nt]=spacing end local resolved=namespace=="" and xmlns[#xmlns] or nsremap[namespace] or namespace - top={ + dt={} + top=linenumbers and { ns=namespace or "", rn=resolved, tg=tag, at=at, - dt={}, + dt=dt, + ni=nil, + cf=currentfilename, + cl=currentline, + __p__=stack[level], + } or { + ns=namespace or "", + rn=resolved, + tg=tag, + at=at, + dt=dt, ni=nil, - __p__=stack[level] + __p__=stack[level], } setmetatable(top,mt) - dt=top.dt - nt=#dt + nt=0 level=level+1 stack[level]=top at={} @@ -11660,7 +12318,15 @@ local function add_special(what,spacing,text) if strip and (what=="@cm@" or what=="@dt@") then else nt=nt+1 - dt[nt]={ + dt[nt]=linenumbers and { + special=true, + ns="", + tg=what, + ni=nil, + dt={ text }, + cf=currentfilename, + cl=currentline, + } or { special=true, ns="", tg=what, @@ -11688,12 +12354,6 @@ local function attribute_specification_error(str) end return str end -local grammar_parsed_text_one -local grammar_parsed_text_two -local handle_hex_entity -local handle_dec_entity -local handle_any_entity_dtd -local handle_any_entity_text do local badentity="&" xml.placeholders={ @@ -12095,7 +12755,13 @@ local function handle_crap_error(chr) add_text(chr) return chr end +local function handlenewline() + currentline=currentline+1 +end +local spacetab=S(' \t') local space=S(' \r\n\t') +local newline=lpegpatterns.newline/handlenewline +local anything=P(1) local open=P('<') local close=P('>') local squote=S("'") @@ -12111,43 +12777,9 @@ local name_nop=C(P(true))*C(valid^1) local name=name_yes+name_nop local utfbom=lpegpatterns.utfbom local spacing=C(space^0) -local anyentitycontent=(1-open-semicolon-space-close-ampersand)^0 -local hexentitycontent=R("AF","af","09")^1 -local decentitycontent=R("09")^1 -local parsedentity=P("#")/""*( - P("x")/""*(hexentitycontent/handle_hex_entity)+(decentitycontent/handle_dec_entity) - )+(anyentitycontent/handle_any_entity_dtd) -local parsedentity_text=P("#")/""*( - P("x")/""*(hexentitycontent/handle_hex_entity)+(decentitycontent/handle_dec_entity) - )+(anyentitycontent/handle_any_entity_text) -local entity=(ampersand/"")*parsedentity*(semicolon/"")+ampersand*(anyentitycontent/handle_end_entity) -local entity_text=(ampersand/"")*parsedentity_text*(semicolon/"")+ampersand*(anyentitycontent/handle_end_entity) -local text_unparsed=C((1-open)^1) -local text_parsed=(Cs((1-open-ampersand)^1)/add_text+Cs(entity_text)/add_text)^1 -local somespace=space^1 -local optionalspace=space^0 -local value=(squote*Cs((entity+(1-squote))^0)*squote)+(dquote*Cs((entity+(1-dquote))^0)*dquote) -local endofattributes=slash*close+close -local whatever=space*name*optionalspace*equal -local wrongvalue=Cs(P(entity+(1-space-endofattributes))^1)/attribute_value_error -local attributevalue=value+wrongvalue -local attribute=(somespace*name*optionalspace*equal*optionalspace*attributevalue)/add_attribute -local attributes=(attribute+somespace^-1*(((1-endofattributes)^1)/attribute_specification_error))^0 -local parsedtext=text_parsed -local unparsedtext=text_unparsed/add_text -local balanced=P { "["*((1-S"[]")+V(1))^0*"]" } -local emptyelement=(spacing*open*name*attributes*optionalspace*slash*close)/add_empty -local beginelement=(spacing*open*name*attributes*optionalspace*close)/add_begin -local endelement=(spacing*open*slash*name*optionalspace*close)/add_end -local begincomment=open*P("!--") -local endcomment=P("--")*close -local begininstruction=open*P("?") -local endinstruction=P("?")*close -local begincdata=open*P("![CDATA[") -local endcdata=P("]]")*close -local someinstruction=C((1-endinstruction)^0) -local somecomment=C((1-endcomment )^0) -local somecdata=C((1-endcdata )^0) +local space_nl=spacetab+newline +local spacing_nl=Cs((space_nl)^0) +local anything_nl=newline+P(1) local function weirdentity(k,v) if trace_entities then report_xml("registering %s entity %a as %a","weird",k,v) @@ -12172,59 +12804,114 @@ local function publicentity(k,v,n) end entities[k]=v end -local begindoctype=open*P("!DOCTYPE") -local enddoctype=close -local beginset=P("[") -local endset=P("]") -local wrdtypename=C((1-somespace-P(";"))^1) -local doctypename=C((1-somespace-close)^0) -local elementdoctype=optionalspace*P("<!ELEMENT")*(1-close)^0*close -local basiccomment=begincomment*((1-endcomment)^0)*endcomment -local weirdentitytype=P("%")*(somespace*doctypename*somespace*value)/weirdentity -local normalentitytype=(doctypename*somespace*value)/normalentity -local publicentitytype=(doctypename*somespace*P("PUBLIC")*somespace*value)/publicentity -local systementitytype=(doctypename*somespace*P("SYSTEM")*somespace*value*somespace*P("NDATA")*somespace*doctypename)/systementity -local entitydoctype=optionalspace*P("<!ENTITY")*somespace*(systementitytype+publicentitytype+normalentitytype+weirdentitytype)*optionalspace*close -local function weirdresolve(s) - lpegmatch(entitydoctype,parameters[s]) -end -local function normalresolve(s) - lpegmatch(entitydoctype,entities[s]) -end -local entityresolve=P("%")*(wrdtypename/weirdresolve )*P(";")+P("&")*(wrdtypename/normalresolve)*P(";") -entitydoctype=entitydoctype+entityresolve -local doctypeset=beginset*optionalspace*P(elementdoctype+entitydoctype+entityresolve+basiccomment+space)^0*optionalspace*endset -local definitiondoctype=doctypename*somespace*doctypeset -local publicdoctype=doctypename*somespace*P("PUBLIC")*somespace*value*somespace*value*somespace*doctypeset -local systemdoctype=doctypename*somespace*P("SYSTEM")*somespace*value*somespace*doctypeset -local simpledoctype=(1-close)^1 -local somedoctype=C((somespace*(publicdoctype+systemdoctype+definitiondoctype+simpledoctype)*optionalspace)^0) -local instruction=(spacing*begininstruction*someinstruction*endinstruction)/function(...) add_special("@pi@",...) end -local comment=(spacing*begincomment*somecomment*endcomment )/function(...) add_special("@cm@",...) end -local cdata=(spacing*begincdata*somecdata*endcdata )/function(...) add_special("@cd@",...) end -local doctype=(spacing*begindoctype*somedoctype*enddoctype )/function(...) add_special("@dt@",...) end -local crap_parsed=1-beginelement-endelement-emptyelement-begininstruction-begincomment-begincdata-ampersand -local crap_unparsed=1-beginelement-endelement-emptyelement-begininstruction-begincomment-begincdata -local parsedcrap=Cs((crap_parsed^1+entity_text)^1)/handle_crap_error -local parsedcrap=Cs((crap_parsed^1+entity_text)^1)/handle_crap_error -local unparsedcrap=Cs((crap_unparsed )^1)/handle_crap_error -local trailer=space^0*(text_unparsed/set_message)^0 -grammar_parsed_text_one=P { "preamble", - preamble=utfbom^0*instruction^0*(doctype+comment+instruction)^0, -} -grammar_parsed_text_two=P { "followup", - followup=V("parent")*trailer, - parent=beginelement*V("children")^0*endelement, - children=parsedtext+V("parent")+emptyelement+comment+cdata+instruction+parsedcrap, -} -local grammar_unparsed_text=P { "preamble", - preamble=utfbom^0*instruction^0*(doctype+comment+instruction)^0*V("parent")*trailer, - parent=beginelement*V("children")^0*endelement, - children=unparsedtext+V("parent")+emptyelement+comment+cdata+instruction+unparsedcrap, -} -local function _xmlconvert_(data,settings) +local function install(spacenewline,spacing,anything) + local anyentitycontent=(1-open-semicolon-space-close-ampersand)^0 + local hexentitycontent=R("AF","af","09")^1 + local decentitycontent=R("09")^1 + local parsedentity=P("#")/""*( + P("x")/""*(hexentitycontent/handle_hex_entity)+(decentitycontent/handle_dec_entity) + )+(anyentitycontent/handle_any_entity_dtd) + local parsedentity_text=P("#")/""*( + P("x")/""*(hexentitycontent/handle_hex_entity)+(decentitycontent/handle_dec_entity) + )+(anyentitycontent/handle_any_entity_text) + local entity=(ampersand/"")*parsedentity*(semicolon/"")+ampersand*(anyentitycontent/handle_end_entity) + local entity_text=(ampersand/"")*parsedentity_text*(semicolon/"")+ampersand*(anyentitycontent/handle_end_entity) + local text_unparsed=Cs((anything-open)^1) + local text_parsed=(Cs((anything-open-ampersand)^1)/add_text+Cs(entity_text)/add_text)^1 + local somespace=(spacenewline)^1 + local optionalspace=(spacenewline)^0 + local value=(squote*Cs((entity+(anything-squote))^0)*squote)+(dquote*Cs((entity+(anything-dquote))^0)*dquote) + local endofattributes=slash*close+close + local whatever=space*name*optionalspace*equal + local wrongvalue=Cs(P(entity+(1-space-endofattributes))^1)/attribute_value_error + local attributevalue=value+wrongvalue + local attribute=(somespace*name*optionalspace*equal*optionalspace*attributevalue)/add_attribute + local attributes=(attribute+somespace^-1*(((anything-endofattributes)^1)/attribute_specification_error))^0 + local parsedtext=text_parsed + local unparsedtext=text_unparsed/add_text + local balanced=P { "["*((anything-S"[]")+V(1))^0*"]" } + local emptyelement=(spacing*open*name*attributes*optionalspace*slash*close)/add_empty + local beginelement=(spacing*open*name*attributes*optionalspace*close)/add_begin + local endelement=(spacing*open*slash*name*optionalspace*close)/add_end + local begincomment=open*P("!--") + local endcomment=P("--")*close + local begininstruction=open*P("?") + local endinstruction=P("?")*close + local begincdata=open*P("![CDATA[") + local endcdata=P("]]")*close + local someinstruction=C((anything-endinstruction)^0) + local somecomment=C((anything-endcomment )^0) + local somecdata=C((anything-endcdata )^0) + local begindoctype=open*P("!DOCTYPE") + local enddoctype=close + local beginset=P("[") + local endset=P("]") + local wrdtypename=C((anything-somespace-P(";"))^1) + local doctypename=C((anything-somespace-close)^0) + local elementdoctype=optionalspace*P("<!ELEMENT")*(anything-close)^0*close + local basiccomment=begincomment*((anything-endcomment)^0)*endcomment + local weirdentitytype=P("%")*(somespace*doctypename*somespace*value)/weirdentity + local normalentitytype=(doctypename*somespace*value)/normalentity + local publicentitytype=(doctypename*somespace*P("PUBLIC")*somespace*value)/publicentity + local systementitytype=(doctypename*somespace*P("SYSTEM")*somespace*value*somespace*P("NDATA")*somespace*doctypename)/systementity + local entitydoctype=optionalspace*P("<!ENTITY")*somespace*(systementitytype+publicentitytype+normalentitytype+weirdentitytype)*optionalspace*close + local function weirdresolve(s) + lpegmatch(entitydoctype,parameters[s]) + end + local function normalresolve(s) + lpegmatch(entitydoctype,entities[s]) + end + local entityresolve=P("%")*(wrdtypename/weirdresolve )*P(";")+P("&")*(wrdtypename/normalresolve)*P(";") + entitydoctype=entitydoctype+entityresolve + local doctypeset=beginset*optionalspace*P(elementdoctype+entitydoctype+entityresolve+basiccomment+space)^0*optionalspace*endset + local definitiondoctype=doctypename*somespace*doctypeset + local publicdoctype=doctypename*somespace*P("PUBLIC")*somespace*value*somespace*value*somespace*doctypeset + local systemdoctype=doctypename*somespace*P("SYSTEM")*somespace*value*somespace*doctypeset + local simpledoctype=(anything-close)^1 + local somedoctype=C((somespace*(publicdoctype+systemdoctype+definitiondoctype+simpledoctype)*optionalspace)^0) + local instruction=(spacing*begininstruction*someinstruction*endinstruction)/function(...) add_special("@pi@",...) end + local comment=(spacing*begincomment*somecomment*endcomment )/function(...) add_special("@cm@",...) end + local cdata=(spacing*begincdata*somecdata*endcdata )/function(...) add_special("@cd@",...) end + local doctype=(spacing*begindoctype*somedoctype*enddoctype )/function(...) add_special("@dt@",...) end + local crap_parsed=anything-beginelement-endelement-emptyelement-begininstruction-begincomment-begincdata-ampersand + local crap_unparsed=anything-beginelement-endelement-emptyelement-begininstruction-begincomment-begincdata + local parsedcrap=Cs((crap_parsed^1+entity_text)^1)/handle_crap_error + local parsedcrap=Cs((crap_parsed^1+entity_text)^1)/handle_crap_error + local unparsedcrap=Cs((crap_unparsed )^1)/handle_crap_error + local trailer=space^0*(text_unparsed/set_message)^0 + local grammar_parsed_text_one=P { "preamble", + preamble=utfbom^0*instruction^0*(doctype+comment+instruction)^0, + } + local grammar_parsed_text_two=P { "followup", + followup=V("parent")*trailer, + parent=beginelement*V("children")^0*endelement, + children=parsedtext+V("parent")+emptyelement+comment+cdata+instruction+parsedcrap, + } + local grammar_unparsed_text=P { "preamble", + preamble=utfbom^0*instruction^0*(doctype+comment+instruction)^0*V("parent")*trailer, + parent=beginelement*V("children")^0*endelement, + children=unparsedtext+V("parent")+emptyelement+comment+cdata+instruction+unparsedcrap, + } + return grammar_parsed_text_one,grammar_parsed_text_two,grammar_unparsed_text +end +grammar_parsed_text_one_nop, +grammar_parsed_text_two_nop, +grammar_unparsed_text_nop=install(space,spacing,anything) +grammar_parsed_text_one_yes, +grammar_parsed_text_two_yes, +grammar_unparsed_text_yes=install(space_nl,spacing_nl,anything_nl) +local function _xmlconvert_(data,settings,detail) settings=settings or {} preparexmlstate(settings) + if settings.linenumbers then + grammar_parsed_text_one=grammar_parsed_text_one_yes + grammar_parsed_text_two=grammar_parsed_text_two_yes + grammar_unparsed_text=grammar_unparsed_text_yes + else + grammar_parsed_text_one=grammar_parsed_text_one_nop + grammar_parsed_text_two=grammar_parsed_text_two_nop + grammar_unparsed_text=grammar_unparsed_text_nop + end local preprocessor=settings.preprocessor if data and data~="" and type(preprocessor)=="function" then data=preprocessor(data,settings) or data @@ -12241,6 +12928,8 @@ local function _xmlconvert_(data,settings) nt=0 if not data or data=="" then errorstr="empty xml file" + elseif data==true then + errorstr=detail or "problematic xml file" elseif utfize or resolve then local m=lpegmatch(grammar_parsed_text_one,data) if m then @@ -12272,7 +12961,7 @@ local function _xmlconvert_(data,settings) if errorhandler then local currentresource=settings.currentresource if currentresource and currentresource~="" then - xml.errorhandler(formatters["load error in [%s]: %s"](currentresource,errorstr)) + xml.errorhandler(formatters["load error in [%s]: %s"](currentresource,errorstr),currentresource) else xml.errorhandler(formatters["load error: %s"](errorstr)) end @@ -12315,8 +13004,10 @@ local function xmlconvert(data,settings) local ok,result=pcall(function() return _xmlconvert_(data,settings) end) if ok then return result + elseif type(result)=="string" then + return _xmlconvert_(true,settings,result) else - return _xmlconvert_("",settings) + return _xmlconvert_(true,settings) end end xml.convert=xmlconvert @@ -13945,7 +14636,7 @@ do -- create closure to overcome 200 locals limit package.loaded["lxml-mis"] = package.loaded["lxml-mis"] or true --- original size: 3684, stripped down to: 1957 +-- original size: 3574, stripped down to: 1863 if not modules then modules={} end modules ['lxml-mis']={ version=1.001, @@ -13955,8 +14646,8 @@ if not modules then modules={} end modules ['lxml-mis']={ license="see context related readme files" } local xml,lpeg,string=xml,lpeg,string +local type=type local concat=table.concat -local type,next,tonumber,tostring,setmetatable,loadstring=type,next,tonumber,tostring,setmetatable,loadstring local format,gsub,match=string.format,string.gsub,string.match local lpegmatch,lpegpatterns=lpeg.match,lpeg.patterns local P,S,R,C,V,Cc,Cs=lpeg.P,lpeg.S,lpeg.R,lpeg.C,lpeg.V,lpeg.Cc,lpeg.Cs @@ -14014,7 +14705,7 @@ do -- create closure to overcome 200 locals limit package.loaded["lxml-aux"] = package.loaded["lxml-aux"] or true --- original size: 29835, stripped down to: 21174 +-- original size: 30650, stripped down to: 21793 if not modules then modules={} end modules ['lxml-aux']={ version=1.001, @@ -14034,7 +14725,7 @@ local type,next,setmetatable,getmetatable=type,next,setmetatable,getmetatable local insert,remove,fastcopy,concat=table.insert,table.remove,table.fastcopy,table.concat local gmatch,gsub,format,find,strip=string.gmatch,string.gsub,string.format,string.find,string.strip local utfbyte=utf.byte -local lpegmatch=lpeg.match +local lpegmatch,lpegpatterns=lpeg.match,lpeg.patterns local striplinepatterns=utilities.strings.striplinepatterns local function report(what,pattern,c,e) report_xml("%s element %a, root %a, position %a, index %a, pattern %a",what,xmlname(e),xmlname(e.__p__),c,e.ni,pattern) @@ -14375,7 +15066,9 @@ local function include(xmldata,pattern,attribute,recursive,loaddata,level) end local data=nil if name and name~="" then - data=loaddata(name) or "" + local d,n=loaddata(name) + data=d or "" + name=n or name if trace_inclusions then report_xml("including %s bytes from %a at level %s by pattern %a and attribute %a (%srecursing)",#data,name,level,pattern,attribute or "",recursive and "" or "not ") end @@ -14385,6 +15078,9 @@ local function include(xmldata,pattern,attribute,recursive,loaddata,level) elseif ekat["parse"]=="text" then epdt[ek.ni]=xml.escaped(data) else +local settings=xmldata.settings +local savedresource=settings.currentresource +settings.currentresource=name local xi=xmlinheritedconvert(data,xmldata) if not xi then epdt[ek.ni]="" @@ -14395,6 +15091,7 @@ local function include(xmldata,pattern,attribute,recursive,loaddata,level) local child=xml.body(xi) child.__p__=ekrt child.__f__=name +child.cf=name epdt[ek.ni]=child local settings=xmldata.settings local inclusions=settings and settings.inclusions @@ -14415,6 +15112,7 @@ local function include(xmldata,pattern,attribute,recursive,loaddata,level) end end end +settings.currentresource=savedresource end end end @@ -14458,13 +15156,12 @@ end function xml.badinclusions(e,sorted) return getinclusions("badinclusions",e,sorted) end -local b_collapser=lpeg.patterns.b_collapser -local m_collapser=lpeg.patterns.m_collapser -local e_collapser=lpeg.patterns.e_collapser -local b_stripper=lpeg.patterns.b_stripper -local m_stripper=lpeg.patterns.m_stripper -local e_stripper=lpeg.patterns.e_stripper -local lpegmatch=lpeg.match +local b_collapser=lpegpatterns.b_collapser +local m_collapser=lpegpatterns.m_collapser +local e_collapser=lpegpatterns.e_collapser +local b_stripper=lpegpatterns.b_stripper +local m_stripper=lpegpatterns.m_stripper +local e_stripper=lpegpatterns.e_stripper local function stripelement(e,nolines,anywhere) local edt=e.dt if edt then @@ -14876,6 +15573,27 @@ function xml.totable(x,strip,flat) return convert(x,strip,flat) end end +function xml.rename(e,namespace,name,attributes) + if type(e)~="table" or not e.tg then + return + end + if type(name)=="table" then + attributes=name + name=namespace + namespace="" + elseif type(name)~="string" then + attributes={} + name=namespace + namespace="" + end + if type(attributes)~="table" then + attributes={} + end + e.ns=namespace + e.rn=namespace + e.tg=name + e.at=attributes +end end -- of closure @@ -14884,7 +15602,7 @@ do -- create closure to overcome 200 locals limit package.loaded["lxml-xml"] = package.loaded["lxml-xml"] or true --- original size: 10274, stripped down to: 7538 +-- original size: 10412, stripped down to: 7669 if not modules then modules={} end modules ['lxml-xml']={ version=1.001, @@ -14893,6 +15611,7 @@ if not modules then modules={} end modules ['lxml-xml']={ copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" } +local tonumber,next=tonumber,next local concat=table.concat local find,lower,upper=string.find,string.lower,string.upper local xml=xml @@ -15012,6 +15731,9 @@ local function xmltotext(root) return xmlserialize(root,xmltexthandler) or "" end end +function xml.serializetotext(root) + return root and xmlserialize(root,xmltexthandler) or "" +end local function text(collected) if collected then local e=collected[1] or collected @@ -15684,7 +16406,7 @@ do -- create closure to overcome 200 locals limit package.loaded["data-exp"] = package.loaded["data-exp"] or true --- original size: 17958, stripped down to: 10705 +-- original size: 18105, stripped down to: 11207 if not modules then modules={} end modules ['data-exp']={ version=1.001, @@ -15883,38 +16605,41 @@ local nofscans=0 local scancache={} local fullcache={} local nofsharedscans=0 +local addcasecraptoo=true local function scan(files,remap,spec,path,n,m,r,onlyone,tolerant) local full=path=="" and spec or (spec..path..'/') - local dirs={} + local dirlist={} local nofdirs=0 local pattern=tolerant and lessweird or weird + local filelist={} + local noffiles=0 for name in directory(full) do if not lpegmatch(pattern,name) then local mode=attributes(full..name,"mode") if mode=="file" then n=n+1 - local lower=lower(name) - local paths=files[lower] - if paths then - if onlyone then - else - if type(paths)=="string" then - files[lower]={ paths,path } - else - paths[#paths+1]=path - end - if name~=lower then - local rl=remap[lower] - if not rl then - remap[lower]=name - r=r+1 - elseif trace_globbing and rl~=name then - report_globbing("confusing filename, name: %a, lower: %a, already: %a",name,lower,rl) - end - end - end - else - files[lower]=path + noffiles=noffiles+1 + filelist[noffiles]=name + elseif mode=="directory" then + m=m+1 + nofdirs=nofdirs+1 + if path~="" then + dirlist[nofdirs]=path.."/"..name + else + dirlist[nofdirs]=name + end + end + end + end + if noffiles>0 then + sort(filelist) + for i=1,noffiles do + local name=filelist[i] + local lower=lower(name) + local paths=files[lower] + if paths then + if onlyone then + else if name~=lower then local rl=remap[lower] if not rl then @@ -15923,23 +16648,41 @@ local function scan(files,remap,spec,path,n,m,r,onlyone,tolerant) elseif trace_globbing and rl~=name then report_globbing("confusing filename, name: %a, lower: %a, already: %a",name,lower,rl) end + if addcasecraptoo then + local paths=files[name] + if not paths then + files[name]=path + elseif type(paths)=="string" then + files[name]={ paths,path } + else + paths[#paths+1]=path + end + end + end + if type(paths)=="string" then + files[lower]={ paths,path } + else + paths[#paths+1]=path end end - elseif mode=="directory" then - m=m+1 - nofdirs=nofdirs+1 - if path~="" then - dirs[nofdirs]=path.."/"..name - else - dirs[nofdirs]=name + else + files[lower]=path + if name~=lower then + local rl=remap[lower] + if not rl then + remap[lower]=name + r=r+1 + elseif trace_globbing and rl~=name then + report_globbing("confusing filename, name: %a, lower: %a, already: %a",name,lower,rl) + end end end end end if nofdirs>0 then - sort(dirs) + sort(dirlist) for i=1,nofdirs do - files,remap,n,m,r=scan(files,remap,spec,dirs[i],n,m,r,onlyonce,tolerant) + files,remap,n,m,r=scan(files,remap,spec,dirlist[i],n,m,r,onlyonce,tolerant) end end scancache[sub(full,1,-2)]=files @@ -16068,7 +16811,7 @@ do -- create closure to overcome 200 locals limit package.loaded["data-env"] = package.loaded["data-env"] or true --- original size: 9342, stripped down to: 6887 +-- original size: 9360, stripped down to: 6903 if not modules then modules={} end modules ['data-env']={ version=1.001, @@ -16078,6 +16821,7 @@ if not modules then modules={} end modules ['data-env']={ license="see context related readme files", } local lower,gsub=string.lower,string.gsub +local next=next local resolvers=resolvers local allocate=utilities.storage.allocate local setmetatableindex=table.setmetatableindex @@ -16352,7 +17096,7 @@ do -- create closure to overcome 200 locals limit package.loaded["data-tmp"] = package.loaded["data-tmp"] or true --- original size: 16088, stripped down to: 11435 +-- original size: 16116, stripped down to: 11459 if not modules then modules={} end modules ['data-tmp']={ version=1.100, @@ -16366,6 +17110,7 @@ local concat=table.concat local mkdirs,isdir,isfile=dir.mkdirs,lfs.isdir,lfs.isfile local addsuffix,is_writable,is_readable=file.addsuffix,file.is_writable,file.is_readable local formatters=string.formatters +local next,type=next,type local trace_locating=false trackers.register("resolvers.locating",function(v) trace_locating=v end) local trace_cache=false trackers.register("resolvers.cache",function(v) trace_cache=v end) local report_caches=logs.reporter("resolvers","caches") @@ -16500,7 +17245,7 @@ function caches.usedpaths(separator) end end function caches.configfiles() - return concat(resolvers.instance.specification,";") + return concat(resolvers.configurationfiles(),";") end function caches.hashed(tree) tree=gsub(tree,"[\\/]+$","") @@ -16838,7 +17583,7 @@ do -- create closure to overcome 200 locals limit package.loaded["data-res"] = package.loaded["data-res"] or true --- original size: 67524, stripped down to: 46632 +-- original size: 68263, stripped down to: 47789 if not modules then modules={} end modules ['data-res']={ version=1.001, @@ -16912,8 +17657,7 @@ local usertypes=resolvers.usertypes local dangerous=resolvers.dangerous local suffixmap=resolvers.suffixmap resolvers.defaultsuffixes={ "tex" } -resolvers.instance=resolvers.instance or nil -local instance=resolvers.instance or nil +local instance=nil function resolvers.setenv(key,value,raw) if instance then instance.environment[key]=value @@ -16948,27 +17692,30 @@ local variableresolver=Cs((variable+P(1))^0) local function expandedvariable(var) return lpegmatch(variableexpander,var) or var end -function resolvers.newinstance() +function resolvers.reset() if trace_locating then report_resolving("creating instance") end - local environment,variables,expansions,order=allocate(),allocate(),allocate(),allocate() - local newinstance={ + local environment={} + local variables={} + local expansions={} + local order={} + instance={ environment=environment, variables=variables, expansions=expansions, order=order, - files=allocate(), - setups=allocate(), - found=allocate(), - foundintrees=allocate(), - hashes=allocate(), - hashed=allocate(), + files={}, + setups={}, + found={}, + foundintrees={}, + hashes={}, + hashed={}, pathlists=false, - specification=allocate(), - lists=allocate(), - data=allocate(), - fakepaths=allocate(), + specification={}, + lists={}, + data={}, + fakepaths={}, remember=true, diskcache=true, renewcache=false, @@ -17015,15 +17762,9 @@ function resolvers.newinstance() t[k]=v return v end) - return newinstance -end -function resolvers.setinstance(someinstance) - instance=someinstance - resolvers.instance=someinstance - return someinstance end -function resolvers.reset() - return resolvers.setinstance(resolvers.newinstance()) +function resolvers.initialized() + return instance~=nil end local function reset_hashes() instance.lists={} @@ -17192,8 +17933,12 @@ local function load_configuration_files() report_resolving("warning: no lua configuration files found") end end +function resolvers.configurationfiles() + return instance.specification or {} +end local function load_file_databases() - instance.loaderror,instance.files=false,allocate() + instance.loaderror=false + instance.files={} if not instance.renewcache then local hashes=instance.hashes for k=1,#hashes do @@ -17404,7 +18149,7 @@ function resolvers.stackpath() return currentpath~="" and currentpath or nil end local done={} -function resolvers.resetextrapath() +function resolvers.resetextrapaths() local ep=instance.extra_paths if not ep then done={} @@ -17414,6 +18159,9 @@ function resolvers.resetextrapath() reset_caches() end end +function resolvers.getextrapaths() + return instance.extra_paths or {} +end function resolvers.registerextrapath(paths,subpaths) if not subpaths or subpaths=="" then if not paths or path=="" then @@ -17573,9 +18321,8 @@ function resolvers.cleanedpathlist(v) end return t end -function resolvers.expandbraces(str) - local ori=str - local pth=expandedpathfromlist(resolvers.splitpath(ori)) +function resolvers.expandbraces(str) + local pth=expandedpathfromlist(resolvers.splitpath(str)) return joinpath(pth) end function resolvers.registerfilehash(name,content,someerror) @@ -17588,6 +18335,17 @@ function resolvers.registerfilehash(name,content,someerror) end end end +function resolvers.getfilehashes() + return instance and instance.files or {} +end +function resolvers.gethashes() + return instance and instance.hashes or {} +end +function resolvers.renewcache() + if instance then + instance.renewcache=true + end +end local function isreadable(name) local readable=isfile(name) if trace_detail then @@ -17602,7 +18360,7 @@ end local function collect_files(names) local filelist={} local noffiles=0 - local function check(hash,root,pathname,path,name) + local function check(hash,root,pathname,path,basename,name) if not pathname or find(path,pathname) then local variant=hash.type local search=filejoin(root,path,name) @@ -17641,10 +18399,10 @@ local function collect_files(names) local metadata=content.metadata local realroot=metadata and metadata.path or hashname if type(path)=="string" then - check(hash,realroot,pathname,path,name) + check(hash,realroot,pathname,path,basename,name) else for i=1,#path do - check(hash,realroot,pathname,path[i],name) + check(hash,realroot,pathname,path[i],basename,name) end end end @@ -17660,17 +18418,26 @@ function resolvers.registerintrees(filename,format,filetype,usedmethod,foundname local foundintrees=instance.foundintrees if usedmethod=="direct" and filename==foundname and fit[foundname] then else + local collapsed=collapsepath(foundname,true) local t={ filename=filename, - format=format~="" and format or nil, + format=format~="" and format or nil, filetype=filetype~="" and filetype or nil, usedmethod=usedmethod, foundname=foundname, + fullname=collapsed, } fit[foundname]=t foundintrees[#foundintrees+1]=t end end +function resolvers.foundintrees() + return instance.foundintrees or {} +end +function resolvers.foundintree(fullname) + local f=fit[fullname] + return f and f.usedmethod=="database" +end local function can_be_dir(name) local fakepaths=instance.fakepaths if not fakepaths[name] then @@ -17685,10 +18452,12 @@ end local preparetreepattern=Cs((P(".")/"%%."+P("-")/"%%-"+P(1))^0*Cc("$")) local collect_instance_files local function find_analyze(filename,askedformat,allresults) - local filetype,wantedfiles,ext='',{},suffixonly(filename) + local filetype='' + local filesuffix=suffixonly(filename) + local wantedfiles={} wantedfiles[#wantedfiles+1]=filename if askedformat=="" then - if ext=="" or not suffixmap[ext] then + if filesuffix=="" or not suffixmap[filesuffix] then local defaultsuffixes=resolvers.defaultsuffixes local formatofsuffix=resolvers.formatofsuffix for i=1,#defaultsuffixes do @@ -17706,7 +18475,7 @@ local function find_analyze(filename,askedformat,allresults) end end else - if ext=="" or not suffixmap[ext] then + if filesuffix=="" or not suffixmap[filesuffix] then local format_suffixes=suffixes[askedformat] if format_suffixes then for i=1,#format_suffixes do @@ -17851,7 +18620,7 @@ end local function find_intree(filename,filetype,wantedfiles,allresults) local pathlists=instance.pathlists if not pathlists then - pathlists=setmetatableindex(allocate(),makepathlist) + pathlists=setmetatableindex({},makepathlist) instance.pathlists=pathlists end local pathlist=pathlists[filetype] @@ -18254,15 +19023,21 @@ function resolvers.findwildcardfile(filename) end function resolvers.automount() end -function resolvers.load(option) +function resolvers.starttiming() statistics.starttiming(instance) +end +function resolvers.stoptiming() + statistics.stoptiming(instance) +end +function resolvers.load(option) + resolvers.starttiming() identify_configuration_files() load_configuration_files() if option~="nofiles" then load_databases() resolvers.automount() end - statistics.stoptiming(instance) + resolvers.stoptiming() local files=instance.files return files and next(files) and true end @@ -18354,7 +19129,6 @@ function resolvers.booleanvariable(str,default) end end function resolvers.dowithfilesintree(pattern,handle,before,after) - local instance=resolvers.instance local hashes=instance.hashes for i=1,#hashes do local hash=hashes[i] @@ -18392,6 +19166,31 @@ local obsolete=resolvers.obsolete or {} resolvers.obsolete=obsolete resolvers.find_file=resolvers.findfile obsolete.find_file=resolvers.findfile resolvers.find_files=resolvers.findfiles obsolete.find_files=resolvers.findfiles +function resolvers.knownvariables(pattern) + if instance then + local environment=instance.environment + local variables=instance.variables + local expansions=instance.expansions + local order=instance.order + local pattern=upper(pattern or "") + local result={} + for i=1,#order do + for key in next,order[i] do + if result[key]==nil and key~="" and (pattern=="" or find(upper(key),pattern)) then + result[key]={ + environment=rawget(environment,key), + variable=key, + expansion=expansions[key], + resolved=resolveprefix(expansions[key]), + } + end + end + end + return result + else + return {} + end +end end -- of closure @@ -18802,7 +19601,7 @@ do -- create closure to overcome 200 locals limit package.loaded["data-use"] = package.loaded["data-use"] or true --- original size: 4045, stripped down to: 3110 +-- original size: 4272, stripped down to: 3289 if not modules then modules={} end modules ['data-use']={ version=1.001, @@ -18822,7 +19621,7 @@ function resolvers.automount(usecache) mountpaths=caches.getreadablepaths("mount") end if mountpaths and #mountpaths>0 then - statistics.starttiming(resolvers.instance) + resolvers.starttiming() for k=1,#mountpaths do local root=mountpaths[k] local f=io.open(root.."/url.tmi") @@ -18842,7 +19641,7 @@ function resolvers.automount(usecache) f:close() end end - statistics.stoptiming(resolvers.instance) + resolvers.stoptiming() end end statistics.register("used config file",function() return caches.configfiles() end) @@ -18856,6 +19655,7 @@ function statistics.savefmtstatus(texname,formatbanner,sourcefile,kind,banner) formatbanner=formatbanner, sourcehash=md5.hex(io.loaddata(resolvers.findfile(sourcefile)) or "unknown"), sourcefile=sourcefile, + luaversion=LUAVERSION, } io.savedata(luvname,table.serialize(luvdata,true)) lua.registerfinalizer(function() @@ -18880,6 +19680,10 @@ function statistics.checkfmtstatus(texname) if luvhash~=sourcehash then return format("source mismatch (luv: %s <> bin: %s)",luvhash,sourcehash) end + local luvluaversion=luv.luaversion or 0 + if luvluaversion~=LUAVERSION then + return format("lua mismatch (luv: %s <> bin: %s)",luvluaversion,LUAVERSION) + end else return "invalid status file" end @@ -18897,7 +19701,7 @@ do -- create closure to overcome 200 locals limit package.loaded["data-zip"] = package.loaded["data-zip"] or true --- original size: 8772, stripped down to: 6841 +-- original size: 8716, stripped down to: 6795 if not modules then modules={} end modules ['data-zip']={ version=1.001, @@ -19070,17 +19874,16 @@ function resolvers.usezipfile(archive) if archive and not registeredfiles[archive] then local z=zip.openarchive(archive) if z then - local instance=resolvers.instance local tree=url.query(specification.query).tree or "" if trace_locating then report_zip("registering: archive %a",archive) end - statistics.starttiming(instance) + resolvers.starttiming() resolvers.prependhash('zip',archive) resolvers.extendtexmfvariable(archive) registeredfiles[archive]=z - instance.files[archive]=resolvers.registerzipfile(z,tree) - statistics.stoptiming(instance) + resolvers.registerfilehash(archive,resolvers.registerzipfile(z,tree)) + resolvers.stoptiming() elseif trace_locating then report_zip("registering: unknown archive %a",archive) end @@ -19323,7 +20126,7 @@ do -- create closure to overcome 200 locals limit package.loaded["data-sch"] = package.loaded["data-sch"] or true --- original size: 6653, stripped down to: 5467 +-- original size: 6753, stripped down to: 5511 if not modules then modules={} end modules ['data-sch']={ version=1.001, @@ -19332,13 +20135,14 @@ if not modules then modules={} end modules ['data-sch']={ copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" } -local load=load +local load,tonumber=load,tonumber local gsub,concat,format=string.gsub,table.concat,string.format local finders,openers,loaders=resolvers.finders,resolvers.openers,resolvers.loaders local trace_schemes=false trackers.register("resolvers.schemes",function(v) trace_schemes=v end) local report_schemes=logs.reporter("resolvers","schemes") local http=require("socket.http") local ltn12=require("ltn12") +if mbox then mbox=nil end local resolvers=resolvers local schemes=resolvers.schemes or {} resolvers.schemes=schemes @@ -19378,7 +20182,7 @@ local runner=sandbox.registerrunner { name="curl resolver", method="execute", program="curl", - template="--silent -- insecure --create-dirs --output %cachename% %original%", + template="--silent --insecure --create-dirs --output %cachename% %original%", checkers={ cachename="cache", original="url", @@ -19624,7 +20428,7 @@ do -- create closure to overcome 200 locals limit package.loaded["data-aux"] = package.loaded["data-aux"] or true --- original size: 2431, stripped down to: 1996 +-- original size: 2438, stripped down to: 2003 if not modules then modules={} end modules ['data-aux']={ version=1.001, @@ -19660,7 +20464,7 @@ function resolvers.updatescript(oldname,newname) if trace_locating then report_scripts("old and new script are the same") end - elseif not find(newscript,scriptpath) then + elseif not find(newscript,scriptpath,1,true) then if trace_locating then report_scripts("new script should come from %a",scriptpath) end @@ -19747,7 +20551,7 @@ do -- create closure to overcome 200 locals limit package.loaded["data-lst"] = package.loaded["data-lst"] or true --- original size: 2734, stripped down to: 2354 +-- original size: 1823, stripped down to: 1591 if not modules then modules={} end modules ['data-lst']={ version=1.001, @@ -19756,14 +20560,14 @@ if not modules then modules={} end modules ['data-lst']={ copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" } -local rawget,type,next=rawget,type,next -local find,concat,upper=string.find,table.concat,string.upper -local fastcopy,sortedpairs=table.fastcopy,table.sortedpairs +local type=type +local concat,sortedhash=table.concat,table.sortedhash local resolvers=resolvers local listers=resolvers.listers or {} resolvers.listers=listers local resolveprefix=resolvers.resolve local report_lists=logs.reporter("resolvers","lists") +local report_resolved=logs.reporter("system","resolved") local function tabstr(str) if type(str)=='table' then return concat(str," | ") @@ -19772,39 +20576,17 @@ local function tabstr(str) end end function listers.variables(pattern) - local instance=resolvers.instance - local environment=instance.environment - local variables=instance.variables - local expansions=instance.expansions - local pattern=upper(pattern or "") - local configured={} - local order=instance.order - for i=1,#order do - for k,v in next,order[i] do - if v~=nil and configured[k]==nil then - configured[k]=v - end - end - end - local env=fastcopy(environment) - local var=fastcopy(variables) - local exp=fastcopy(expansions) - for key,value in sortedpairs(configured) do - if key~="" and (pattern=="" or find(upper(key),pattern)) then - report_lists(key) - report_lists(" env: %s",tabstr(rawget(environment,key)) or "unset") - report_lists(" var: %s",tabstr(configured[key]) or "unset") - report_lists(" exp: %s",tabstr(expansions[key]) or "unset") - report_lists(" res: %s",tabstr(resolveprefix(expansions[key])) or "unset") - end - end - instance.environment=fastcopy(env) - instance.variables=fastcopy(var) - instance.expansions=fastcopy(exp) + local result=resolvers.knownvariables(pattern) + for key,value in sortedhash(result) do + report_lists(key) + report_lists(" env: %s",tabstr(value.environment or "unset")) + report_lists(" var: %s",tabstr(value.variable or "unset")) + report_lists(" exp: %s",tabstr(value.expansion or "unset")) + report_lists(" res: %s",tabstr(value.resolved or "unset")) + end end -local report_resolved=logs.reporter("system","resolved") function listers.configurations() - local configurations=resolvers.instance.specification + local configurations=resolvers.configurationfiles() for i=1,#configurations do report_resolved("file : %s",resolveprefix(configurations[i])) end @@ -19827,7 +20609,7 @@ do -- create closure to overcome 200 locals limit package.loaded["util-lib"] = package.loaded["util-lib"] or true --- original size: 13595, stripped down to: 7500 +-- original size: 14943, stripped down to: 8305 if not modules then modules={} end modules ['util-lib']={ version=1.001, @@ -19846,6 +20628,7 @@ local pathpart=file.pathpart local nameonly=file.nameonly local joinfile=file.join local removesuffix=file.removesuffix +local addsuffix=file.addsuffix local findfile=resolvers.findfile local findfiles=resolvers.findfiles local expandpaths=resolvers.expandedpathlistfromvariable @@ -19865,13 +20648,20 @@ local function locate(required,version,trace,report,action) local required_path=pathpart(required_full) local required_base=nameonly(required_full) if qualifiedpath(required) then - if isfile(required) then + if isfile(addsuffix(required,os.libsuffix)) then + if trace then + report("qualified name %a found",required) + end found_library=required + else + if trace then + report("qualified name %a not found",required) + end end else local required_name=required_base.."."..os.libsuffix local version=type(version)=="string" and version~="" and version or false - local engine=environment.ownmain or false + local engine="luatex" if trace and not done then local list=expandpaths("lib") for i=1,#list do @@ -19930,9 +20720,11 @@ local function locate(required,version,trace,report,action) end package.extralibpath(environment.ownpath) local paths=package.libpaths() + local pattern="/[^/]+%."..os.libsuffix.."$" for i=1,#paths do - local found=check(lfs.isfile) - if found and (not checkpattern or find(found,checkpattern)) then + required_path=gsub(paths[i],pattern,"") + local found=check(lfs.isfound) + if type(found)=="string" and (not checkpattern or find(found,checkpattern)) then return found end end @@ -19962,18 +20754,20 @@ local function locate(required,version,trace,report,action) if trace then report("found: %a",found_library) end - local message,result=action(found_library,required_base) + local result,message=action(found_library,required_base) if result then library=result else library=false - report("load error: message %a, library %a",tostring(message),found_library or "no library") + report("load error: message %a, library %a",tostring(message or "unknown"),found_library or "no library") end end - if not library then - report("unknown: %a",required) - elseif trace then - report("stored: %a",required) + if trace then + if not library then + report("unknown library: %a",required) + else + report("stored library: %a",required) + end end return library end @@ -20000,13 +20794,12 @@ do local libtype=type(library) if libtype=="function" then library=library() - message=true else report_swiglib("load error: %a returns %a, message %a, library %a",opener,libtype,(string.gsub(message or "no message","[%s]+$","")),found_library or "no library") library=false end popdir() - return message,library + return library end) loadedlibs[required]=library or false end @@ -20050,29 +20843,48 @@ if FFISUPPORTED and ffi and ffi.load then local trace_ffilib=false local savedffiload=ffi.load trackers.register("resolvers.ffilib",function(v) trace_ffilib=v end) + local loaded={} local function locateindeed(name) - local message,library=pcall(savedffiload,removesuffix(name)) - if type(library)=="userdata" then - return library - else - return false + name=removesuffix(name) + local l=loaded[name] + if l==nil then + local message,library=pcall(savedffiload,name) + if type(message)=="userdata" then + l=message + elseif type(library)=="userdata" then + l=library + else + l=false + end + loaded[name]=l + elseif trace_ffilib then + report_ffilib("reusing already loaded %a",name) end + return l end - function ffilib(required,version) - if version=="system" then + function ffilib(name,version) + name=removesuffix(name) + local l=loaded[name] + if l~=nil then + if trace_ffilib then + report_ffilib("reusing already loaded %a",name) + end + return l + elseif version=="system" then return locateindeed(name) else - return locate(required,version,trace_ffilib,report_ffilib,locateindeed) + return locate(name,version,trace_ffilib,report_ffilib,locateindeed) end end function ffi.load(name) local library=ffilib(name) if type(library)=="userdata" then return library - else + end + if trace_ffilib then report_ffilib("trying to load %a using normal loader",name) - return savedffiload(name) end + return savedffiload(name) end end @@ -20186,7 +20998,7 @@ do -- create closure to overcome 200 locals limit package.loaded["luat-fmt"] = package.loaded["luat-fmt"] or true --- original size: 9144, stripped down to: 7291 +-- original size: 9268, stripped down to: 7401 if not modules then modules={} end modules ['luat-fmt']={ version=1.001, @@ -20225,6 +21037,9 @@ local function secondaryflags() if arguments.silent then flags[#flags+1]="--c:silent" end + if arguments.errors then + flags[#flags+1]="--c:errors" + end if arguments.jit then flags[#flags+1]="--c:jiton" end @@ -20261,6 +21076,7 @@ local runners={ function environment.make_format(name,arguments) local engine=environment.ownmain or "luatex" local silent=environment.arguments.silent + local errors=environment.arguments.errors local olddir=dir.current() local path=caches.getwritablepath("formats",engine) or "" if path~="" then @@ -20416,10 +21232,10 @@ end end -- of closure --- used libraries : l-lua.lua l-sandbox.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-fil.lua util-sac.lua util-sto.lua util-prs.lua util-fmt.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-tpl.lua util-sbx.lua util-mrg.lua util-env.lua luat-env.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.lua data-ini.lua data-exp.lua data-env.lua data-tmp.lua data-met.lua data-res.lua data-pre.lua data-inp.lua data-out.lua data-fil.lua data-con.lua data-use.lua data-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua util-lib.lua luat-sta.lua luat-fmt.lua +-- used libraries : l-lua.lua l-macro.lua l-sandbox.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-fil.lua util-sac.lua util-sto.lua util-prs.lua util-fmt.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-tpl.lua util-sbx.lua util-mrg.lua util-env.lua luat-env.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.lua data-ini.lua data-exp.lua data-env.lua data-tmp.lua data-met.lua data-res.lua data-pre.lua data-inp.lua data-out.lua data-fil.lua data-con.lua data-use.lua data-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua util-lib.lua luat-sta.lua luat-fmt.lua -- skipped libraries : - --- original bytes : 842443 --- stripped bytes : 306317 +-- original bytes : 874849 +-- stripped bytes : 317531 -- end library merge @@ -20443,6 +21259,7 @@ local owntree = environment and environment.ownpath or ownpath local ownlibs = { -- order can be made better 'l-lua.lua', + 'l-macro.lua', 'l-sandbox.lua', 'l-package.lua', 'l-lpeg.lua', @@ -20607,30 +21424,37 @@ local e_verbose = false -- some common flags (also passed through environment) local e_silent = environment.argument("silent") +local e_errors = environment.argument("errors") local e_noconsole = environment.argument("noconsole") local e_trackers = environment.argument("trackers") local e_directives = environment.argument("directives") local e_experiments = environment.argument("experiments") -if e_silent == true then - e_silent = "*" +local t = { } + +if type(e_directives) == "string" then + t[#t+1] = e_directives end if type(e_silent) == "string" then - if type(e_directives) == "string" then - e_directives = format("%s,logs.blocked={%s}",e_directives,e_silent) - else - e_directives = format("logs.blocked={%s}",e_silent) - end + t[#t+1] = format("logs.blocked={%s}",e_silent) +elseif e_silent == true then + t[#t+1] = "logs.blocked" +end + +if type(e_errors) == "string" then + t[#t+1] = format("logs.errors={%s}",e_errors) +elseif e_errors == true then + t[#t+1] = "logs.errors" end if e_noconsole then - if type(e_directives) == "string" then - e_directives = format("%s,logs.target=file",e_directives) - else - e_directives = format("logs.target=file") - end + t[#t+1] = format("logs.target=file") +end + +if #t > 0 then + e_directives = concat(t,",") end if e_trackers then trackers .enable(e_trackers) end @@ -20643,7 +21467,7 @@ if not environment.experiments then environment.experiments = e_experiments end -- -local instance = resolvers.reset() +resolvers.reset() local helpinfo = [[ <?xml version="1.0" ?> @@ -20651,7 +21475,7 @@ local helpinfo = [[ <metadata> <entry name="name">mtxrun</entry> <entry name="detail">ConTeXt TDS Runner Tool</entry> - <entry name="version">1.32</entry> + <entry name="version">1.33</entry> </metadata> <flags> <category name="basic"> @@ -21199,7 +22023,7 @@ function runners.execute_ctx_script(filename,...) end -- retry after generate but only if --autogenerate if fullname == "" and environment.argument("autogenerate") then -- might become the default - instance.renewcache = true + resolvers.renewcache() trackers.enable("resolvers.locating") resolvers.load() -- @@ -21224,7 +22048,7 @@ function runners.execute_ctx_script(filename,...) end filename = environment.files[1] if e_verbose then - report("using script: %s\n",fullname) + report("using script: %s (if --path is used don't run on path where mtxrun lives)\n",fullname) end environment.ownscript = fullname dofile(fullname) @@ -21378,8 +22202,6 @@ local before, after = environment.splitarguments(filename) environment.arguments_before, environment.arguments_after = before, after environment.initializearguments(before) -instance.lsrmode = environment.argument("lsr") or false - e_verbose = environment.arguments["verbose"] -- delayed till here (we need the ones before script) if e_verbose then @@ -21466,7 +22288,7 @@ else function runners.loadbase(...) if not resolvers.load(...) then report("forcing cache reload") - instance.renewcache = true + resolvers.renewcache() trackers.enable("resolvers.locating") if not resolvers.load(...) then report("the resolver databases are not present or outdated") @@ -21480,6 +22302,42 @@ end -- joke .. reminds me of messing with gigi terminals +do + + local a_locale = e_argument("locale") + + if a_locale then + + -- I really hate this crap but am too tired of discussing it over and over + -- again so for the sake of usiage outside context we will provide ways to + -- use locales in an otherwise supposed to be locale agnostic system. And + -- forget about support in case of interferences. + + report() + report(what == "force" and "forcing locale:" or "original locale:") + report() + report(" collate : %s",status.lc_collate or "<unset>") + report(" ctype : %s",status.lc_ctype or "<unset>") + report(" monetary : %s",status.lc_monetary or "<unset>") + report(" numeric : %s",status.lc_numeric or "<unset>") + report(" time : %s",status.lc_time or "<unset>") + report() + + end + + if a_locale == "force" then + os.setlocale(status.lc_collate ,"collate") + os.setlocale(status.lc_ctype ,"ctype") + os.setlocale(status.lc_monetary,"monetary") + os.setlocale(status.lc_numeric ,"numeric") + os.setlocale(status.lc_time ,"time") + else + function os.setlocale() + end + end + +end + if e_argument("ansi") then logs.setformatters("ansi") @@ -21673,7 +22531,7 @@ elseif e_argument("find-path") then -- luatools: runners.execute_ctx_script("mtx-base","--find-path",filename) resolvers.load() - local path = resolvers.findpath(filename, instance.my_format) + local path = resolvers.findpath(filename) if e_verbose then report(path) else @@ -21754,7 +22612,7 @@ elseif e_argument("generate") then trackers.enable("resolvers.locating") resolvers.renew(filename) else - instance.renewcache = true + resolvers.renewcache() trackers.enable("resolvers.locating") resolvers.load() end @@ -21814,6 +22672,10 @@ elseif e_argument("systeminfo") then runners.systeminfo() +elseif e_argument("locale") then + + -- already done + elseif e_argument("help") or filename=='help' or filename == "" then application.help() diff --git a/tex/context/base/mkii/cont-fil.mkii b/tex/context/base/mkii/cont-fil.mkii index 604ea233d..1f2923a69 100644 --- a/tex/context/base/mkii/cont-fil.mkii +++ b/tex/context/base/mkii/cont-fil.mkii @@ -100,6 +100,8 @@ \definefilesynonym [abr-pseudocaps] [abr-01] \definefilesynonym [abr-smallcaps] [abr-02] +\definefilesynonym [abr-03] [abr-01] +\definefilesynonym [abr-04] [abr-01] \definefilesynonym [chinese] [chi-00] \definefilesynonym [japanese] [jap-00] diff --git a/tex/context/base/mkii/cont-new.mkii b/tex/context/base/mkii/cont-new.mkii index b23a010d9..30c27eb44 100644 --- a/tex/context/base/mkii/cont-new.mkii +++ b/tex/context/base/mkii/cont-new.mkii @@ -11,7 +11,7 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\newcontextversion{2017.05.15 21:48} +\newcontextversion{2018.03.15 15:27} %D This file is loaded at runtime, thereby providing an %D excellent place for hacks, patches, extensions and new diff --git a/tex/context/base/mkii/context.mkii b/tex/context/base/mkii/context.mkii index 9b79652fe..dfa109af4 100644 --- a/tex/context/base/mkii/context.mkii +++ b/tex/context/base/mkii/context.mkii @@ -20,7 +20,7 @@ %D your styles an modules. \edef\contextformat {\jobname} -\edef\contextversion{2017.05.15 21:48} +\edef\contextversion{2018.03.15 15:27} %D For those who want to use this: diff --git a/tex/context/base/mkii/mult-cs.mkii b/tex/context/base/mkii/mult-cs.mkii index 837a397fb..9a4cc112b 100644 --- a/tex/context/base/mkii/mult-cs.mkii +++ b/tex/context/base/mkii/mult-cs.mkii @@ -185,6 +185,7 @@ \setinterfacevariable{extremestretch}{extremestretch} \setinterfacevariable{fact}{fakt} \setinterfacevariable{february}{unor} +\setinterfacevariable{field}{field} \setinterfacevariable{figure}{obrazek} \setinterfacevariable{figures}{obrazky} \setinterfacevariable{file}{soubor} @@ -376,6 +377,7 @@ \setinterfacevariable{norepeat}{norepeat} \setinterfacevariable{normal}{normalni} \setinterfacevariable{nospacing}{nospacing} +\setinterfacevariable{nostopper}{nostopper} \setinterfacevariable{not}{ne} \setinterfacevariable{notation}{notation} \setinterfacevariable{note}{note} @@ -621,6 +623,10 @@ \setinterfaceconstant{align}{zarovnani} \setinterfaceconstant{aligncharacter}{aligncharacter} \setinterfaceconstant{alignmentcharacter}{alignmentcharacter} +\setinterfaceconstant{alignmentleftsample}{alignmentleftsample} +\setinterfaceconstant{alignmentleftwidth}{alignmentleftwidth} +\setinterfaceconstant{alignmentrightsample}{alignmentrightsample} +\setinterfaceconstant{alignmentrightwidth}{alignmentrightwidth} \setinterfaceconstant{alignsymbol}{alignsymbol} \setinterfaceconstant{aligntitle}{zarovnejtitul} \setinterfaceconstant{alternative}{alternativa} @@ -687,6 +693,7 @@ \setinterfaceconstant{bottomoffset}{offsetspodku} \setinterfaceconstant{bottomspace}{bottomspace} \setinterfaceconstant{bottomstate}{statusspodku} +\setinterfaceconstant{break}{break} \setinterfaceconstant{buffer}{buffer} \setinterfaceconstant{cache}{cache} \setinterfaceconstant{calculate}{pocitat} @@ -752,6 +759,7 @@ \setinterfaceconstant{direction}{smer} \setinterfaceconstant{directory}{adresar} \setinterfaceconstant{display}{obrazovka} +\setinterfaceconstant{displaythreshold}{displaythreshold} \setinterfaceconstant{distance}{vzdalenost} \setinterfaceconstant{domain}{domain} \setinterfaceconstant{dot}{tecka} @@ -794,6 +802,7 @@ \setinterfaceconstant{fieldoffset}{offsetpole} \setinterfaceconstant{file}{soubor} \setinterfaceconstant{filler}{filler} +\setinterfaceconstant{filter}{filter} \setinterfaceconstant{filtercommand}{filtercommand} \setinterfaceconstant{finalnamesep}{finalnamesep} \setinterfaceconstant{finalpagesep}{finalpagesep} @@ -841,6 +850,7 @@ \setinterfaceconstant{headerstate}{statuszahlavi} \setinterfaceconstant{headlabel}{popisekhlavicky} \setinterfaceconstant{headnumber}{cislonadpisu} +\setinterfaceconstant{headseparator}{headseparator} \setinterfaceconstant{headstyle}{stylhlavicky} \setinterfaceconstant{height}{vyska} \setinterfaceconstant{hfactor}{vfaktor} @@ -861,6 +871,7 @@ \setinterfaceconstant{index}{index} \setinterfaceconstant{indicator}{indikator} \setinterfaceconstant{initialsep}{initialsep} +\setinterfaceconstant{inlinethreshold}{inlinethreshold} \setinterfaceconstant{inner}{vnitrni} \setinterfaceconstant{innermargin}{innermargin} \setinterfaceconstant{inputfile}{inputfile} @@ -903,6 +914,7 @@ \setinterfaceconstant{leftoffset}{levyoffset} \setinterfaceconstant{leftquotation}{citacevlevo} \setinterfaceconstant{leftquote}{citovatvlevo} +\setinterfaceconstant{leftsample}{leftsample} \setinterfaceconstant{leftsentence}{vetavlevo} \setinterfaceconstant{leftspeech}{leftspeech} \setinterfaceconstant{leftstyle}{stylvlevo} @@ -975,6 +987,7 @@ \setinterfaceconstant{nlines}{nradky} \setinterfaceconstant{norm}{norm} \setinterfaceconstant{note}{note} +\setinterfaceconstant{notes}{notes} \setinterfaceconstant{nr}{nr} \setinterfaceconstant{nright}{nvpravo} \setinterfaceconstant{ntop}{nvrsek} @@ -994,6 +1007,7 @@ \setinterfaceconstant{numberset}{numberset} \setinterfaceconstant{numberstarter}{numberstarter} \setinterfaceconstant{numberstopper}{numberstopper} +\setinterfaceconstant{numberstrut}{numberstrut} \setinterfaceconstant{numberstyle}{stylcisla} \setinterfaceconstant{numberwidth}{numberwidth} \setinterfaceconstant{nx}{nx} @@ -1063,6 +1077,7 @@ \setinterfaceconstant{preview}{nahled} \setinterfaceconstant{previous}{predchozi} \setinterfaceconstant{previousnumber}{predchozicislo} +\setinterfaceconstant{print}{print} \setinterfaceconstant{printable}{tisknutelne} \setinterfaceconstant{process}{process} \setinterfaceconstant{profile}{profile} @@ -1105,6 +1120,7 @@ \setinterfaceconstant{rightoffset}{pravyoffset} \setinterfaceconstant{rightquotation}{citacevpravo} \setinterfaceconstant{rightquote}{citovatvpravo} +\setinterfaceconstant{rightsample}{rightsample} \setinterfaceconstant{rightsentence}{vetavpravo} \setinterfaceconstant{rightspeech}{rightspeech} \setinterfaceconstant{rightstyle}{stylvpravo} @@ -1147,7 +1163,10 @@ \setinterfaceconstant{sidemethod}{sidemethod} \setinterfaceconstant{sidespaceafter}{bocnimezeraza} \setinterfaceconstant{sidespacebefore}{bocnimezerapred} +\setinterfaceconstant{sidespaceinbetween}{sidespaceinbetween} +\setinterfaceconstant{sidethreshold}{sidethreshold} \setinterfaceconstant{sign}{znak} +\setinterfaceconstant{simplecommand}{simplecommand} \setinterfaceconstant{size}{velikost} \setinterfaceconstant{slantedfeatures}{slantedfeatures} \setinterfaceconstant{slantedfont}{slantedfont} @@ -1160,7 +1179,9 @@ \setinterfaceconstant{source}{zdroj} \setinterfaceconstant{space}{mezera} \setinterfaceconstant{spaceafter}{mezeraza} +\setinterfaceconstant{spaceafterside}{spaceafterside} \setinterfaceconstant{spacebefore}{mezerapred} +\setinterfaceconstant{spacebeforeside}{spacebeforeside} \setinterfaceconstant{spaceinbetween}{spaceinbetween} \setinterfaceconstant{spacing}{mezerovani} \setinterfaceconstant{specification}{specification} @@ -1225,6 +1246,7 @@ \setinterfaceconstant{titledistance}{vzdalenosttitulek} \setinterfaceconstant{titleleft}{titleleft} \setinterfaceconstant{titleright}{titleright} +\setinterfaceconstant{titlestrut}{titlestrut} \setinterfaceconstant{titlestyle}{styltitulek} \setinterfaceconstant{to}{na} \setinterfaceconstant{toffset}{toffset} diff --git a/tex/context/base/mkii/mult-de.mkii b/tex/context/base/mkii/mult-de.mkii index ec1fb10f4..a5269ff3f 100644 --- a/tex/context/base/mkii/mult-de.mkii +++ b/tex/context/base/mkii/mult-de.mkii @@ -185,6 +185,7 @@ \setinterfacevariable{extremestretch}{extremestretch} \setinterfacevariable{fact}{gegeben} \setinterfacevariable{february}{februar} +\setinterfacevariable{field}{field} \setinterfacevariable{figure}{abbildung} \setinterfacevariable{figures}{abbildungen} \setinterfacevariable{file}{datei} @@ -376,6 +377,7 @@ \setinterfacevariable{norepeat}{norepeat} \setinterfacevariable{normal}{normal} \setinterfacevariable{nospacing}{nospacing} +\setinterfacevariable{nostopper}{nostopper} \setinterfacevariable{not}{nicht} \setinterfacevariable{notation}{notation} \setinterfacevariable{note}{note} @@ -621,6 +623,10 @@ \setinterfaceconstant{align}{ausrichtung} \setinterfaceconstant{aligncharacter}{aligncharacter} \setinterfaceconstant{alignmentcharacter}{alignmentcharacter} +\setinterfaceconstant{alignmentleftsample}{alignmentleftsample} +\setinterfaceconstant{alignmentleftwidth}{alignmentleftwidth} +\setinterfaceconstant{alignmentrightsample}{alignmentrightsample} +\setinterfaceconstant{alignmentrightwidth}{alignmentrightwidth} \setinterfaceconstant{alignsymbol}{alignsymbol} \setinterfaceconstant{aligntitle}{titelausrichten} \setinterfaceconstant{alternative}{alternative} @@ -687,6 +693,7 @@ \setinterfaceconstant{bottomoffset}{untenoffset} \setinterfaceconstant{bottomspace}{bottomspace} \setinterfaceconstant{bottomstate}{untenstatus} +\setinterfaceconstant{break}{break} \setinterfaceconstant{buffer}{buffer} \setinterfaceconstant{cache}{cache} \setinterfaceconstant{calculate}{berechnen} @@ -752,6 +759,7 @@ \setinterfaceconstant{direction}{richtung} \setinterfaceconstant{directory}{verzeichnis} \setinterfaceconstant{display}{bildschirm} +\setinterfaceconstant{displaythreshold}{displaythreshold} \setinterfaceconstant{distance}{abstand} \setinterfaceconstant{domain}{domain} \setinterfaceconstant{dot}{punkt} @@ -794,6 +802,7 @@ \setinterfaceconstant{fieldoffset}{feldoffset} \setinterfaceconstant{file}{datei} \setinterfaceconstant{filler}{filler} +\setinterfaceconstant{filter}{filter} \setinterfaceconstant{filtercommand}{filtercommand} \setinterfaceconstant{finalnamesep}{finalnamesep} \setinterfaceconstant{finalpagesep}{finalpagesep} @@ -841,6 +850,7 @@ \setinterfaceconstant{headerstate}{kopfzeilenstatus} \setinterfaceconstant{headlabel}{headlabel} \setinterfaceconstant{headnumber}{kopfnummer} +\setinterfaceconstant{headseparator}{headseparator} \setinterfaceconstant{headstyle}{kopfstil} \setinterfaceconstant{height}{hoehe} \setinterfaceconstant{hfactor}{hfaktor} @@ -861,6 +871,7 @@ \setinterfaceconstant{index}{index} \setinterfaceconstant{indicator}{indikator} \setinterfaceconstant{initialsep}{initialsep} +\setinterfaceconstant{inlinethreshold}{inlinethreshold} \setinterfaceconstant{inner}{innen} \setinterfaceconstant{innermargin}{innermargin} \setinterfaceconstant{inputfile}{inputfile} @@ -903,6 +914,7 @@ \setinterfaceconstant{leftoffset}{linkeroffset} \setinterfaceconstant{leftquotation}{linkerzitat} \setinterfaceconstant{leftquote}{linkerzitieren} +\setinterfaceconstant{leftsample}{leftsample} \setinterfaceconstant{leftsentence}{linkersatz} \setinterfaceconstant{leftspeech}{leftspeech} \setinterfaceconstant{leftstyle}{linkerstil} @@ -975,6 +987,7 @@ \setinterfaceconstant{nlines}{zzeile} \setinterfaceconstant{norm}{norm} \setinterfaceconstant{note}{note} +\setinterfaceconstant{notes}{notes} \setinterfaceconstant{nr}{nr} \setinterfaceconstant{nright}{nrechts} \setinterfaceconstant{ntop}{noben} @@ -994,6 +1007,7 @@ \setinterfaceconstant{numberset}{numberset} \setinterfaceconstant{numberstarter}{numberstarter} \setinterfaceconstant{numberstopper}{numberstopper} +\setinterfaceconstant{numberstrut}{numberstrut} \setinterfaceconstant{numberstyle}{nummernstil} \setinterfaceconstant{numberwidth}{numberwidth} \setinterfaceconstant{nx}{nx} @@ -1063,6 +1077,7 @@ \setinterfaceconstant{preview}{vorschau} \setinterfaceconstant{previous}{vorige} \setinterfaceconstant{previousnumber}{vorigenummer} +\setinterfaceconstant{print}{print} \setinterfaceconstant{printable}{druckbar} \setinterfaceconstant{process}{process} \setinterfaceconstant{profile}{profile} @@ -1105,6 +1120,7 @@ \setinterfaceconstant{rightoffset}{rechterabstand} \setinterfaceconstant{rightquotation}{rechterzitat} \setinterfaceconstant{rightquote}{rechterzitieren} +\setinterfaceconstant{rightsample}{rightsample} \setinterfaceconstant{rightsentence}{rechtersatz} \setinterfaceconstant{rightspeech}{rightspeech} \setinterfaceconstant{rightstyle}{rechterstil} @@ -1147,7 +1163,10 @@ \setinterfaceconstant{sidemethod}{sidemethod} \setinterfaceconstant{sidespaceafter}{nebennachspatium} \setinterfaceconstant{sidespacebefore}{nebenvorspatium} +\setinterfaceconstant{sidespaceinbetween}{sidespaceinbetween} +\setinterfaceconstant{sidethreshold}{sidethreshold} \setinterfaceconstant{sign}{zeichen} +\setinterfaceconstant{simplecommand}{simplecommand} \setinterfaceconstant{size}{groesse} \setinterfaceconstant{slantedfeatures}{slantedfeatures} \setinterfaceconstant{slantedfont}{slantedfont} @@ -1160,7 +1179,9 @@ \setinterfaceconstant{source}{quelle} \setinterfaceconstant{space}{spatium} \setinterfaceconstant{spaceafter}{nachspatium} +\setinterfaceconstant{spaceafterside}{spaceafterside} \setinterfaceconstant{spacebefore}{vorspatium} +\setinterfaceconstant{spacebeforeside}{spacebeforeside} \setinterfaceconstant{spaceinbetween}{spaceinbetween} \setinterfaceconstant{spacing}{spatiumausgleich} \setinterfaceconstant{specification}{specification} @@ -1225,6 +1246,7 @@ \setinterfaceconstant{titledistance}{titelabstand} \setinterfaceconstant{titleleft}{titleleft} \setinterfaceconstant{titleright}{titleright} +\setinterfaceconstant{titlestrut}{titlestrut} \setinterfaceconstant{titlestyle}{titelstil} \setinterfaceconstant{to}{zu} \setinterfaceconstant{toffset}{toffset} diff --git a/tex/context/base/mkii/mult-en.mkii b/tex/context/base/mkii/mult-en.mkii index a4838128b..5c233a0c4 100644 --- a/tex/context/base/mkii/mult-en.mkii +++ b/tex/context/base/mkii/mult-en.mkii @@ -185,6 +185,7 @@ \setinterfacevariable{extremestretch}{extremestretch} \setinterfacevariable{fact}{fact} \setinterfacevariable{february}{february} +\setinterfacevariable{field}{field} \setinterfacevariable{figure}{figure} \setinterfacevariable{figures}{figures} \setinterfacevariable{file}{file} @@ -376,6 +377,7 @@ \setinterfacevariable{norepeat}{norepeat} \setinterfacevariable{normal}{normal} \setinterfacevariable{nospacing}{nospacing} +\setinterfacevariable{nostopper}{nostopper} \setinterfacevariable{not}{not} \setinterfacevariable{notation}{notation} \setinterfacevariable{note}{note} @@ -621,6 +623,10 @@ \setinterfaceconstant{align}{align} \setinterfaceconstant{aligncharacter}{aligncharacter} \setinterfaceconstant{alignmentcharacter}{alignmentcharacter} +\setinterfaceconstant{alignmentleftsample}{alignmentleftsample} +\setinterfaceconstant{alignmentleftwidth}{alignmentleftwidth} +\setinterfaceconstant{alignmentrightsample}{alignmentrightsample} +\setinterfaceconstant{alignmentrightwidth}{alignmentrightwidth} \setinterfaceconstant{alignsymbol}{alignsymbol} \setinterfaceconstant{aligntitle}{aligntitle} \setinterfaceconstant{alternative}{alternative} @@ -687,6 +693,7 @@ \setinterfaceconstant{bottomoffset}{bottomoffset} \setinterfaceconstant{bottomspace}{bottomspace} \setinterfaceconstant{bottomstate}{bottomstate} +\setinterfaceconstant{break}{break} \setinterfaceconstant{buffer}{buffer} \setinterfaceconstant{cache}{cache} \setinterfaceconstant{calculate}{calculate} @@ -752,6 +759,7 @@ \setinterfaceconstant{direction}{direction} \setinterfaceconstant{directory}{directory} \setinterfaceconstant{display}{display} +\setinterfaceconstant{displaythreshold}{displaythreshold} \setinterfaceconstant{distance}{distance} \setinterfaceconstant{domain}{domain} \setinterfaceconstant{dot}{dot} @@ -794,6 +802,7 @@ \setinterfaceconstant{fieldoffset}{fieldoffset} \setinterfaceconstant{file}{file} \setinterfaceconstant{filler}{filler} +\setinterfaceconstant{filter}{filter} \setinterfaceconstant{filtercommand}{filtercommand} \setinterfaceconstant{finalnamesep}{finalnamesep} \setinterfaceconstant{finalpagesep}{finalpagesep} @@ -841,6 +850,7 @@ \setinterfaceconstant{headerstate}{headerstate} \setinterfaceconstant{headlabel}{headlabel} \setinterfaceconstant{headnumber}{headnumber} +\setinterfaceconstant{headseparator}{headseparator} \setinterfaceconstant{headstyle}{headstyle} \setinterfaceconstant{height}{height} \setinterfaceconstant{hfactor}{hfactor} @@ -861,6 +871,7 @@ \setinterfaceconstant{index}{index} \setinterfaceconstant{indicator}{indicator} \setinterfaceconstant{initialsep}{initialsep} +\setinterfaceconstant{inlinethreshold}{inlinethreshold} \setinterfaceconstant{inner}{inner} \setinterfaceconstant{innermargin}{innermargin} \setinterfaceconstant{inputfile}{inputfile} @@ -903,6 +914,7 @@ \setinterfaceconstant{leftoffset}{leftoffset} \setinterfaceconstant{leftquotation}{leftquotation} \setinterfaceconstant{leftquote}{leftquote} +\setinterfaceconstant{leftsample}{leftsample} \setinterfaceconstant{leftsentence}{leftsentence} \setinterfaceconstant{leftspeech}{leftspeech} \setinterfaceconstant{leftstyle}{leftstyle} @@ -975,6 +987,7 @@ \setinterfaceconstant{nlines}{nlines} \setinterfaceconstant{norm}{norm} \setinterfaceconstant{note}{note} +\setinterfaceconstant{notes}{notes} \setinterfaceconstant{nr}{nr} \setinterfaceconstant{nright}{nright} \setinterfaceconstant{ntop}{ntop} @@ -994,6 +1007,7 @@ \setinterfaceconstant{numberset}{numberset} \setinterfaceconstant{numberstarter}{numberstarter} \setinterfaceconstant{numberstopper}{numberstopper} +\setinterfaceconstant{numberstrut}{numberstrut} \setinterfaceconstant{numberstyle}{numberstyle} \setinterfaceconstant{numberwidth}{numberwidth} \setinterfaceconstant{nx}{nx} @@ -1063,6 +1077,7 @@ \setinterfaceconstant{preview}{preview} \setinterfaceconstant{previous}{previous} \setinterfaceconstant{previousnumber}{previousnumber} +\setinterfaceconstant{print}{print} \setinterfaceconstant{printable}{printable} \setinterfaceconstant{process}{process} \setinterfaceconstant{profile}{profile} @@ -1105,6 +1120,7 @@ \setinterfaceconstant{rightoffset}{rightoffset} \setinterfaceconstant{rightquotation}{rightquotation} \setinterfaceconstant{rightquote}{rightquote} +\setinterfaceconstant{rightsample}{rightsample} \setinterfaceconstant{rightsentence}{rightsentence} \setinterfaceconstant{rightspeech}{rightspeech} \setinterfaceconstant{rightstyle}{rightstyle} @@ -1147,7 +1163,10 @@ \setinterfaceconstant{sidemethod}{sidemethod} \setinterfaceconstant{sidespaceafter}{sidespaceafter} \setinterfaceconstant{sidespacebefore}{sidespacebefore} +\setinterfaceconstant{sidespaceinbetween}{sidespaceinbetween} +\setinterfaceconstant{sidethreshold}{sidethreshold} \setinterfaceconstant{sign}{sign} +\setinterfaceconstant{simplecommand}{simplecommand} \setinterfaceconstant{size}{size} \setinterfaceconstant{slantedfeatures}{slantedfeatures} \setinterfaceconstant{slantedfont}{slantedfont} @@ -1160,7 +1179,9 @@ \setinterfaceconstant{source}{source} \setinterfaceconstant{space}{space} \setinterfaceconstant{spaceafter}{spaceafter} +\setinterfaceconstant{spaceafterside}{spaceafterside} \setinterfaceconstant{spacebefore}{spacebefore} +\setinterfaceconstant{spacebeforeside}{spacebeforeside} \setinterfaceconstant{spaceinbetween}{spaceinbetween} \setinterfaceconstant{spacing}{spacing} \setinterfaceconstant{specification}{specification} @@ -1225,6 +1246,7 @@ \setinterfaceconstant{titledistance}{titledistance} \setinterfaceconstant{titleleft}{titleleft} \setinterfaceconstant{titleright}{titleright} +\setinterfaceconstant{titlestrut}{titlestrut} \setinterfaceconstant{titlestyle}{titlestyle} \setinterfaceconstant{to}{to} \setinterfaceconstant{toffset}{toffset} diff --git a/tex/context/base/mkii/mult-fr.mkii b/tex/context/base/mkii/mult-fr.mkii index 318bfc31c..7cf1bc684 100644 --- a/tex/context/base/mkii/mult-fr.mkii +++ b/tex/context/base/mkii/mult-fr.mkii @@ -185,6 +185,7 @@ \setinterfacevariable{extremestretch}{extremestretch} \setinterfacevariable{fact}{fait} \setinterfacevariable{february}{fevrier} +\setinterfacevariable{field}{field} \setinterfacevariable{figure}{figure} \setinterfacevariable{figures}{figures} \setinterfacevariable{file}{fichier} @@ -376,6 +377,7 @@ \setinterfacevariable{norepeat}{norepeat} \setinterfacevariable{normal}{normal} \setinterfacevariable{nospacing}{sansespacement} +\setinterfacevariable{nostopper}{nostopper} \setinterfacevariable{not}{pas} \setinterfacevariable{notation}{notation} \setinterfacevariable{note}{note} @@ -621,6 +623,10 @@ \setinterfaceconstant{align}{alignement} \setinterfaceconstant{aligncharacter}{caracterealigne} \setinterfaceconstant{alignmentcharacter}{alignementcaractere} +\setinterfaceconstant{alignmentleftsample}{alignmentleftsample} +\setinterfaceconstant{alignmentleftwidth}{alignmentleftwidth} +\setinterfaceconstant{alignmentrightsample}{alignmentrightsample} +\setinterfaceconstant{alignmentrightwidth}{alignmentrightwidth} \setinterfaceconstant{alignsymbol}{alignsymbol} \setinterfaceconstant{aligntitle}{alignementtitre} \setinterfaceconstant{alternative}{alternative} @@ -687,6 +693,7 @@ \setinterfaceconstant{bottomoffset}{decalageinf} \setinterfaceconstant{bottomspace}{espaceinf} \setinterfaceconstant{bottomstate}{etatinf} +\setinterfaceconstant{break}{break} \setinterfaceconstant{buffer}{buffer} \setinterfaceconstant{cache}{cache} \setinterfaceconstant{calculate}{calculer} @@ -752,6 +759,7 @@ \setinterfaceconstant{direction}{direction} \setinterfaceconstant{directory}{repertoire} \setinterfaceconstant{display}{affichage} +\setinterfaceconstant{displaythreshold}{displaythreshold} \setinterfaceconstant{distance}{distance} \setinterfaceconstant{domain}{domain} \setinterfaceconstant{dot}{point} @@ -794,6 +802,7 @@ \setinterfaceconstant{fieldoffset}{offsetchamp} \setinterfaceconstant{file}{fichier} \setinterfaceconstant{filler}{filler} +\setinterfaceconstant{filter}{filter} \setinterfaceconstant{filtercommand}{filtercommand} \setinterfaceconstant{finalnamesep}{finalnamesep} \setinterfaceconstant{finalpagesep}{finalpagesep} @@ -841,6 +850,7 @@ \setinterfaceconstant{headerstate}{etatentete} \setinterfaceconstant{headlabel}{etiquettetete} \setinterfaceconstant{headnumber}{numerotete} +\setinterfaceconstant{headseparator}{headseparator} \setinterfaceconstant{headstyle}{styletete} \setinterfaceconstant{height}{hauteur} \setinterfaceconstant{hfactor}{facteurhauteur} @@ -861,6 +871,7 @@ \setinterfaceconstant{index}{index} \setinterfaceconstant{indicator}{indicateur} \setinterfaceconstant{initialsep}{initialsep} +\setinterfaceconstant{inlinethreshold}{inlinethreshold} \setinterfaceconstant{inner}{interieur} \setinterfaceconstant{innermargin}{margeinterieure} \setinterfaceconstant{inputfile}{fichierentree} @@ -903,6 +914,7 @@ \setinterfaceconstant{leftoffset}{decalagegauche} \setinterfaceconstant{leftquotation}{citationgauche} \setinterfaceconstant{leftquote}{citergauche} +\setinterfaceconstant{leftsample}{leftsample} \setinterfaceconstant{leftsentence}{phrasegauche} \setinterfaceconstant{leftspeech}{leftspeech} \setinterfaceconstant{leftstyle}{leftstyle} @@ -975,6 +987,7 @@ \setinterfaceconstant{nlines}{nlignes} \setinterfaceconstant{norm}{norme} \setinterfaceconstant{note}{note} +\setinterfaceconstant{notes}{notes} \setinterfaceconstant{nr}{nr} \setinterfaceconstant{nright}{ndroite} \setinterfaceconstant{ntop}{nsup} @@ -994,6 +1007,7 @@ \setinterfaceconstant{numberset}{numberset} \setinterfaceconstant{numberstarter}{numberstarter} \setinterfaceconstant{numberstopper}{numberstopper} +\setinterfaceconstant{numberstrut}{numberstrut} \setinterfaceconstant{numberstyle}{stylenumero} \setinterfaceconstant{numberwidth}{numberwidth} \setinterfaceconstant{nx}{nx} @@ -1063,6 +1077,7 @@ \setinterfaceconstant{preview}{previsualisation} \setinterfaceconstant{previous}{precedent} \setinterfaceconstant{previousnumber}{numeroprecedent} +\setinterfaceconstant{print}{print} \setinterfaceconstant{printable}{editable} \setinterfaceconstant{process}{process} \setinterfaceconstant{profile}{profile} @@ -1105,6 +1120,7 @@ \setinterfaceconstant{rightoffset}{rightoffset} \setinterfaceconstant{rightquotation}{citationdroite} \setinterfaceconstant{rightquote}{citerdroite} +\setinterfaceconstant{rightsample}{rightsample} \setinterfaceconstant{rightsentence}{phrasedroite} \setinterfaceconstant{rightspeech}{rightspeech} \setinterfaceconstant{rightstyle}{styledroit} @@ -1147,7 +1163,10 @@ \setinterfaceconstant{sidemethod}{sidemethod} \setinterfaceconstant{sidespaceafter}{espacelateralapres} \setinterfaceconstant{sidespacebefore}{espacelateralavant} +\setinterfaceconstant{sidespaceinbetween}{sidespaceinbetween} +\setinterfaceconstant{sidethreshold}{sidethreshold} \setinterfaceconstant{sign}{signe} +\setinterfaceconstant{simplecommand}{simplecommand} \setinterfaceconstant{size}{dimension} \setinterfaceconstant{slantedfeatures}{slantedfeatures} \setinterfaceconstant{slantedfont}{slantedfont} @@ -1160,7 +1179,9 @@ \setinterfaceconstant{source}{origine} \setinterfaceconstant{space}{espace} \setinterfaceconstant{spaceafter}{espaceapres} +\setinterfaceconstant{spaceafterside}{spaceafterside} \setinterfaceconstant{spacebefore}{espaceavant} +\setinterfaceconstant{spacebeforeside}{spacebeforeside} \setinterfaceconstant{spaceinbetween}{spaceinbetween} \setinterfaceconstant{spacing}{espacement} \setinterfaceconstant{specification}{specification} @@ -1225,6 +1246,7 @@ \setinterfaceconstant{titledistance}{distancetitre} \setinterfaceconstant{titleleft}{titleleft} \setinterfaceconstant{titleright}{titleright} +\setinterfaceconstant{titlestrut}{titlestrut} \setinterfaceconstant{titlestyle}{styletitre} \setinterfaceconstant{to}{vers} \setinterfaceconstant{toffset}{toffset} diff --git a/tex/context/base/mkii/mult-it.mkii b/tex/context/base/mkii/mult-it.mkii index 269d1e545..38fb2de40 100644 --- a/tex/context/base/mkii/mult-it.mkii +++ b/tex/context/base/mkii/mult-it.mkii @@ -185,6 +185,7 @@ \setinterfacevariable{extremestretch}{extremestretch} \setinterfacevariable{fact}{fatto} \setinterfacevariable{february}{febbraio} +\setinterfacevariable{field}{field} \setinterfacevariable{figure}{figura} \setinterfacevariable{figures}{figure} \setinterfacevariable{file}{file} @@ -376,6 +377,7 @@ \setinterfacevariable{norepeat}{norepeat} \setinterfacevariable{normal}{normale} \setinterfacevariable{nospacing}{nospacing} +\setinterfacevariable{nostopper}{nostopper} \setinterfacevariable{not}{non} \setinterfacevariable{notation}{notation} \setinterfacevariable{note}{note} @@ -621,6 +623,10 @@ \setinterfaceconstant{align}{allinea} \setinterfaceconstant{aligncharacter}{allineacarattere} \setinterfaceconstant{alignmentcharacter}{carattereallineamento} +\setinterfaceconstant{alignmentleftsample}{alignmentleftsample} +\setinterfaceconstant{alignmentleftwidth}{alignmentleftwidth} +\setinterfaceconstant{alignmentrightsample}{alignmentrightsample} +\setinterfaceconstant{alignmentrightwidth}{alignmentrightwidth} \setinterfaceconstant{alignsymbol}{alignsymbol} \setinterfaceconstant{aligntitle}{allineatitolo} \setinterfaceconstant{alternative}{alternativa} @@ -687,6 +693,7 @@ \setinterfaceconstant{bottomoffset}{offsetfondo} \setinterfaceconstant{bottomspace}{spaziofondo} \setinterfaceconstant{bottomstate}{statofondo} +\setinterfaceconstant{break}{break} \setinterfaceconstant{buffer}{buffer} \setinterfaceconstant{cache}{cache} \setinterfaceconstant{calculate}{calcola} @@ -752,6 +759,7 @@ \setinterfaceconstant{direction}{direzione} \setinterfaceconstant{directory}{directory} \setinterfaceconstant{display}{display} +\setinterfaceconstant{displaythreshold}{displaythreshold} \setinterfaceconstant{distance}{distanza} \setinterfaceconstant{domain}{domain} \setinterfaceconstant{dot}{punto} @@ -794,6 +802,7 @@ \setinterfaceconstant{fieldoffset}{offsetcampo} \setinterfaceconstant{file}{file} \setinterfaceconstant{filler}{filler} +\setinterfaceconstant{filter}{filter} \setinterfaceconstant{filtercommand}{filtercommand} \setinterfaceconstant{finalnamesep}{finalnamesep} \setinterfaceconstant{finalpagesep}{finalpagesep} @@ -841,6 +850,7 @@ \setinterfaceconstant{headerstate}{statointestazione} \setinterfaceconstant{headlabel}{etichettatesta} \setinterfaceconstant{headnumber}{numerotesta} +\setinterfaceconstant{headseparator}{headseparator} \setinterfaceconstant{headstyle}{stiletesta} \setinterfaceconstant{height}{altezza} \setinterfaceconstant{hfactor}{hfactor} @@ -861,6 +871,7 @@ \setinterfaceconstant{index}{index} \setinterfaceconstant{indicator}{indicatore} \setinterfaceconstant{initialsep}{initialsep} +\setinterfaceconstant{inlinethreshold}{inlinethreshold} \setinterfaceconstant{inner}{interno} \setinterfaceconstant{innermargin}{margineinterno} \setinterfaceconstant{inputfile}{inputfile} @@ -903,6 +914,7 @@ \setinterfaceconstant{leftoffset}{offsetsinistro} \setinterfaceconstant{leftquotation}{citazionesinistra} \setinterfaceconstant{leftquote}{menzionesinistra} +\setinterfaceconstant{leftsample}{leftsample} \setinterfaceconstant{leftsentence}{frasesinistra} \setinterfaceconstant{leftspeech}{leftspeech} \setinterfaceconstant{leftstyle}{stilesinistra} @@ -975,6 +987,7 @@ \setinterfaceconstant{nlines}{nrighe} \setinterfaceconstant{norm}{norma} \setinterfaceconstant{note}{note} +\setinterfaceconstant{notes}{notes} \setinterfaceconstant{nr}{nr} \setinterfaceconstant{nright}{ndestra} \setinterfaceconstant{ntop}{ncima} @@ -994,6 +1007,7 @@ \setinterfaceconstant{numberset}{numberset} \setinterfaceconstant{numberstarter}{numberstarter} \setinterfaceconstant{numberstopper}{numberstopper} +\setinterfaceconstant{numberstrut}{numberstrut} \setinterfaceconstant{numberstyle}{stilenumero} \setinterfaceconstant{numberwidth}{numberwidth} \setinterfaceconstant{nx}{nx} @@ -1063,6 +1077,7 @@ \setinterfaceconstant{preview}{anteprima} \setinterfaceconstant{previous}{precedente} \setinterfaceconstant{previousnumber}{numeroprecedente} +\setinterfaceconstant{print}{print} \setinterfaceconstant{printable}{stampabile} \setinterfaceconstant{process}{process} \setinterfaceconstant{profile}{profile} @@ -1105,6 +1120,7 @@ \setinterfaceconstant{rightoffset}{offsetdestro} \setinterfaceconstant{rightquotation}{citazionedestra} \setinterfaceconstant{rightquote}{menzionedestra} +\setinterfaceconstant{rightsample}{rightsample} \setinterfaceconstant{rightsentence}{frasedestra} \setinterfaceconstant{rightspeech}{rightspeech} \setinterfaceconstant{rightstyle}{stiledestra} @@ -1147,7 +1163,10 @@ \setinterfaceconstant{sidemethod}{sidemethod} \setinterfaceconstant{sidespaceafter}{spaziolateraledopo} \setinterfaceconstant{sidespacebefore}{spaziolateraleprima} +\setinterfaceconstant{sidespaceinbetween}{sidespaceinbetween} +\setinterfaceconstant{sidethreshold}{sidethreshold} \setinterfaceconstant{sign}{segno} +\setinterfaceconstant{simplecommand}{simplecommand} \setinterfaceconstant{size}{dimensione} \setinterfaceconstant{slantedfeatures}{slantedfeatures} \setinterfaceconstant{slantedfont}{slantedfont} @@ -1160,7 +1179,9 @@ \setinterfaceconstant{source}{origine} \setinterfaceconstant{space}{spazio} \setinterfaceconstant{spaceafter}{spaziodopo} +\setinterfaceconstant{spaceafterside}{spaceafterside} \setinterfaceconstant{spacebefore}{spazioprima} +\setinterfaceconstant{spacebeforeside}{spacebeforeside} \setinterfaceconstant{spaceinbetween}{spaceinbetween} \setinterfaceconstant{spacing}{spaziatura} \setinterfaceconstant{specification}{specification} @@ -1225,6 +1246,7 @@ \setinterfaceconstant{titledistance}{distanzatitolo} \setinterfaceconstant{titleleft}{titleleft} \setinterfaceconstant{titleright}{titleright} +\setinterfaceconstant{titlestrut}{titlestrut} \setinterfaceconstant{titlestyle}{stiletitolo} \setinterfaceconstant{to}{verso} \setinterfaceconstant{toffset}{toffset} diff --git a/tex/context/base/mkii/mult-nl.mkii b/tex/context/base/mkii/mult-nl.mkii index 30703e4a6..ba7c5a42c 100644 --- a/tex/context/base/mkii/mult-nl.mkii +++ b/tex/context/base/mkii/mult-nl.mkii @@ -376,6 +376,7 @@ \setinterfacevariable{norepeat}{norepeat} \setinterfacevariable{normal}{normaal} \setinterfacevariable{nospacing}{geenspatiering} +\setinterfacevariable{nostopper}{geenafsluiter} \setinterfacevariable{not}{niet} \setinterfacevariable{notation}{notation} \setinterfacevariable{note}{note} @@ -621,6 +622,10 @@ \setinterfaceconstant{align}{uitlijnen} \setinterfaceconstant{aligncharacter}{karakteruitlijnen} \setinterfaceconstant{alignmentcharacter}{uitlijnkarakter} +\setinterfaceconstant{alignmentleftsample}{alignmentleftsample} +\setinterfaceconstant{alignmentleftwidth}{alignmentleftwidth} +\setinterfaceconstant{alignmentrightsample}{alignmentrightsample} +\setinterfaceconstant{alignmentrightwidth}{alignmentrightwidth} \setinterfaceconstant{alignsymbol}{alignsymbol} \setinterfaceconstant{aligntitle}{titeluitlijnen} \setinterfaceconstant{alternative}{variant} @@ -687,6 +692,7 @@ \setinterfaceconstant{bottomoffset}{onderoffset} \setinterfaceconstant{bottomspace}{bodemwit} \setinterfaceconstant{bottomstate}{onderstatus} +\setinterfaceconstant{break}{break} \setinterfaceconstant{buffer}{buffer} \setinterfaceconstant{cache}{cache} \setinterfaceconstant{calculate}{bereken} @@ -752,6 +758,7 @@ \setinterfaceconstant{direction}{richting} \setinterfaceconstant{directory}{directory} \setinterfaceconstant{display}{scherm} +\setinterfaceconstant{displaythreshold}{displaythreshold} \setinterfaceconstant{distance}{afstand} \setinterfaceconstant{domain}{domain} \setinterfaceconstant{dot}{punt} @@ -794,6 +801,7 @@ \setinterfaceconstant{fieldoffset}{veldoffset} \setinterfaceconstant{file}{file} \setinterfaceconstant{filler}{filler} +\setinterfaceconstant{filter}{filter} \setinterfaceconstant{filtercommand}{filtercommand} \setinterfaceconstant{finalnamesep}{finalnamesep} \setinterfaceconstant{finalpagesep}{finalpagesep} @@ -861,6 +869,7 @@ \setinterfaceconstant{index}{index} \setinterfaceconstant{indicator}{aanduiding} \setinterfaceconstant{initialsep}{initialsep} +\setinterfaceconstant{inlinethreshold}{inlinethreshold} \setinterfaceconstant{inner}{binnen} \setinterfaceconstant{innermargin}{binnenmarge} \setinterfaceconstant{inputfile}{inputfile} @@ -903,6 +912,7 @@ \setinterfaceconstant{leftoffset}{linkeroffset} \setinterfaceconstant{leftquotation}{linkercitaat} \setinterfaceconstant{leftquote}{linkerciteer} +\setinterfaceconstant{leftsample}{leftsample} \setinterfaceconstant{leftsentence}{linkerzin} \setinterfaceconstant{leftspeech}{linkeruitspraak} \setinterfaceconstant{leftstyle}{linkerletter} @@ -974,7 +984,8 @@ \setinterfaceconstant{nleft}{nlinks} \setinterfaceconstant{nlines}{nregels} \setinterfaceconstant{norm}{norm} -\setinterfaceconstant{note}{note} +\setinterfaceconstant{note}{noot} +\setinterfaceconstant{notes}{noten} \setinterfaceconstant{nr}{nr} \setinterfaceconstant{nright}{nrechts} \setinterfaceconstant{ntop}{nboven} @@ -994,6 +1005,7 @@ \setinterfaceconstant{numberset}{numberset} \setinterfaceconstant{numberstarter}{numberstarter} \setinterfaceconstant{numberstopper}{numberstopper} +\setinterfaceconstant{numberstrut}{nummerstrut} \setinterfaceconstant{numberstyle}{nummerletter} \setinterfaceconstant{numberwidth}{nummerbreedte} \setinterfaceconstant{nx}{nx} @@ -1105,6 +1117,7 @@ \setinterfaceconstant{rightoffset}{rechteroffset} \setinterfaceconstant{rightquotation}{rechtercitaat} \setinterfaceconstant{rightquote}{rechterciteer} +\setinterfaceconstant{rightsample}{rightsample} \setinterfaceconstant{rightsentence}{rechterzin} \setinterfaceconstant{rightspeech}{rechteruitspraak} \setinterfaceconstant{rightstyle}{rechterletter} @@ -1147,6 +1160,7 @@ \setinterfaceconstant{sidemethod}{zijmethode} \setinterfaceconstant{sidespaceafter}{zijnawit} \setinterfaceconstant{sidespacebefore}{zijvoorwit} +\setinterfaceconstant{sidethreshold}{sidethreshold} \setinterfaceconstant{sign}{teken} \setinterfaceconstant{size}{formaat} \setinterfaceconstant{slantedfeatures}{slantedfeatures} @@ -1160,7 +1174,9 @@ \setinterfaceconstant{source}{bron} \setinterfaceconstant{space}{spatie} \setinterfaceconstant{spaceafter}{nawit} +\setinterfaceconstant{spaceafterside}{witnazij} \setinterfaceconstant{spacebefore}{voorwit} +\setinterfaceconstant{spacebeforeside}{witvoorzij} \setinterfaceconstant{spaceinbetween}{tussenwit} \setinterfaceconstant{spacing}{spatiering} \setinterfaceconstant{specification}{specification} @@ -1225,6 +1241,7 @@ \setinterfaceconstant{titledistance}{titelafstand} \setinterfaceconstant{titleleft}{titellinks} \setinterfaceconstant{titleright}{titelrechts} +\setinterfaceconstant{titlestrut}{titelstrut} \setinterfaceconstant{titlestyle}{titelletter} \setinterfaceconstant{to}{aan} \setinterfaceconstant{toffset}{toffset} diff --git a/tex/context/base/mkii/mult-pe.mkii b/tex/context/base/mkii/mult-pe.mkii index 8b300ae73..534c239da 100644 --- a/tex/context/base/mkii/mult-pe.mkii +++ b/tex/context/base/mkii/mult-pe.mkii @@ -185,6 +185,7 @@ \setinterfacevariable{extremestretch}{extremestretch} \setinterfacevariable{fact}{fact} \setinterfacevariable{february}{فوریه} +\setinterfacevariable{field}{field} \setinterfacevariable{figure}{شکل} \setinterfacevariable{figures}{شکلها} \setinterfacevariable{file}{پرونده} @@ -376,6 +377,7 @@ \setinterfacevariable{norepeat}{norepeat} \setinterfacevariable{normal}{نرمال} \setinterfacevariable{nospacing}{بدونفضاگذاری} +\setinterfacevariable{nostopper}{nostopper} \setinterfacevariable{not}{بدون} \setinterfacevariable{notation}{notation} \setinterfacevariable{note}{note} @@ -621,6 +623,10 @@ \setinterfaceconstant{align}{تنظیم} \setinterfaceconstant{aligncharacter}{حرفتنظیم} \setinterfaceconstant{alignmentcharacter}{حرفتنظیمکردن} +\setinterfaceconstant{alignmentleftsample}{alignmentleftsample} +\setinterfaceconstant{alignmentleftwidth}{alignmentleftwidth} +\setinterfaceconstant{alignmentrightsample}{alignmentrightsample} +\setinterfaceconstant{alignmentrightwidth}{alignmentrightwidth} \setinterfaceconstant{alignsymbol}{alignsymbol} \setinterfaceconstant{aligntitle}{عنوانتنظیم} \setinterfaceconstant{alternative}{جایگزین} @@ -687,6 +693,7 @@ \setinterfaceconstant{bottomoffset}{آفستپایین} \setinterfaceconstant{bottomspace}{فضایپایین} \setinterfaceconstant{bottomstate}{وضعیتپایین} +\setinterfaceconstant{break}{break} \setinterfaceconstant{buffer}{buffer} \setinterfaceconstant{cache}{میانگیر} \setinterfaceconstant{calculate}{محاسبه} @@ -752,6 +759,7 @@ \setinterfaceconstant{direction}{جهت} \setinterfaceconstant{directory}{پوشه} \setinterfaceconstant{display}{نمایش} +\setinterfaceconstant{displaythreshold}{displaythreshold} \setinterfaceconstant{distance}{فاصله} \setinterfaceconstant{domain}{domain} \setinterfaceconstant{dot}{نقطه} @@ -794,6 +802,7 @@ \setinterfaceconstant{fieldoffset}{آفستمیدان} \setinterfaceconstant{file}{پرونده} \setinterfaceconstant{filler}{filler} +\setinterfaceconstant{filter}{filter} \setinterfaceconstant{filtercommand}{filtercommand} \setinterfaceconstant{finalnamesep}{finalnamesep} \setinterfaceconstant{finalpagesep}{finalpagesep} @@ -841,6 +850,7 @@ \setinterfaceconstant{headerstate}{وضعیتسربرگ} \setinterfaceconstant{headlabel}{برچسبسر} \setinterfaceconstant{headnumber}{شمارهسر} +\setinterfaceconstant{headseparator}{headseparator} \setinterfaceconstant{headstyle}{سبکسر} \setinterfaceconstant{height}{ارتفاع} \setinterfaceconstant{hfactor}{عاملارتفاع} @@ -861,6 +871,7 @@ \setinterfaceconstant{index}{index} \setinterfaceconstant{indicator}{اندیکاتور} \setinterfaceconstant{initialsep}{initialsep} +\setinterfaceconstant{inlinethreshold}{inlinethreshold} \setinterfaceconstant{inner}{داخلی} \setinterfaceconstant{innermargin}{حاشیهداخلی} \setinterfaceconstant{inputfile}{پروندهورودی} @@ -903,6 +914,7 @@ \setinterfaceconstant{leftoffset}{آفستچپ} \setinterfaceconstant{leftquotation}{نقلقولچپ} \setinterfaceconstant{leftquote}{نقلچپ} +\setinterfaceconstant{leftsample}{leftsample} \setinterfaceconstant{leftsentence}{جملهچپ} \setinterfaceconstant{leftspeech}{سخنرانیچپ} \setinterfaceconstant{leftstyle}{سبکچپ} @@ -975,6 +987,7 @@ \setinterfaceconstant{nlines}{nlines} \setinterfaceconstant{norm}{norm} \setinterfaceconstant{note}{note} +\setinterfaceconstant{notes}{notes} \setinterfaceconstant{nr}{nr} \setinterfaceconstant{nright}{nright} \setinterfaceconstant{ntop}{ntop} @@ -994,6 +1007,7 @@ \setinterfaceconstant{numberset}{numberset} \setinterfaceconstant{numberstarter}{numberstarter} \setinterfaceconstant{numberstopper}{numberstopper} +\setinterfaceconstant{numberstrut}{numberstrut} \setinterfaceconstant{numberstyle}{سبکشماره} \setinterfaceconstant{numberwidth}{عرضشماره} \setinterfaceconstant{nx}{nx} @@ -1063,6 +1077,7 @@ \setinterfaceconstant{preview}{پیشدید} \setinterfaceconstant{previous}{قبلی} \setinterfaceconstant{previousnumber}{شمارهقبلی} +\setinterfaceconstant{print}{print} \setinterfaceconstant{printable}{قابلچاپ} \setinterfaceconstant{process}{پردازش} \setinterfaceconstant{profile}{profile} @@ -1105,6 +1120,7 @@ \setinterfaceconstant{rightoffset}{آفستراست} \setinterfaceconstant{rightquotation}{نقلقولراست} \setinterfaceconstant{rightquote}{نقلراست} +\setinterfaceconstant{rightsample}{rightsample} \setinterfaceconstant{rightsentence}{جملهراست} \setinterfaceconstant{rightspeech}{سخنرانیراست} \setinterfaceconstant{rightstyle}{سبکراست} @@ -1147,7 +1163,10 @@ \setinterfaceconstant{sidemethod}{روشکنار} \setinterfaceconstant{sidespaceafter}{فضایکناریبعد} \setinterfaceconstant{sidespacebefore}{فضایکناریقبل} +\setinterfaceconstant{sidespaceinbetween}{sidespaceinbetween} +\setinterfaceconstant{sidethreshold}{sidethreshold} \setinterfaceconstant{sign}{علامت} +\setinterfaceconstant{simplecommand}{simplecommand} \setinterfaceconstant{size}{اندازه} \setinterfaceconstant{slantedfeatures}{slantedfeatures} \setinterfaceconstant{slantedfont}{slantedfont} @@ -1160,7 +1179,9 @@ \setinterfaceconstant{source}{منبع} \setinterfaceconstant{space}{فضا} \setinterfaceconstant{spaceafter}{فضابعداز} +\setinterfaceconstant{spaceafterside}{spaceafterside} \setinterfaceconstant{spacebefore}{فضاقبلاز} +\setinterfaceconstant{spacebeforeside}{spacebeforeside} \setinterfaceconstant{spaceinbetween}{فضادربین} \setinterfaceconstant{spacing}{فضاگذاری} \setinterfaceconstant{specification}{specification} @@ -1225,6 +1246,7 @@ \setinterfaceconstant{titledistance}{فاصلهعنوان} \setinterfaceconstant{titleleft}{عنوانچپ} \setinterfaceconstant{titleright}{عنوانراست} +\setinterfaceconstant{titlestrut}{titlestrut} \setinterfaceconstant{titlestyle}{سبکعنوان} \setinterfaceconstant{to}{به} \setinterfaceconstant{toffset}{toffset} diff --git a/tex/context/base/mkii/mult-ro.mkii b/tex/context/base/mkii/mult-ro.mkii index 26d0cd9c6..46b61c882 100644 --- a/tex/context/base/mkii/mult-ro.mkii +++ b/tex/context/base/mkii/mult-ro.mkii @@ -185,6 +185,7 @@ \setinterfacevariable{extremestretch}{extremestretch} \setinterfacevariable{fact}{fapt} \setinterfacevariable{february}{februarie} +\setinterfacevariable{field}{field} \setinterfacevariable{figure}{figura} \setinterfacevariable{figures}{figure} \setinterfacevariable{file}{fisier} @@ -376,6 +377,7 @@ \setinterfacevariable{norepeat}{norepeat} \setinterfacevariable{normal}{normal} \setinterfacevariable{nospacing}{nospacing} +\setinterfacevariable{nostopper}{nostopper} \setinterfacevariable{not}{nu} \setinterfacevariable{notation}{notation} \setinterfacevariable{note}{note} @@ -621,6 +623,10 @@ \setinterfaceconstant{align}{aliniere} \setinterfaceconstant{aligncharacter}{aliniazacaracter} \setinterfaceconstant{alignmentcharacter}{alierecaracter} +\setinterfaceconstant{alignmentleftsample}{alignmentleftsample} +\setinterfaceconstant{alignmentleftwidth}{alignmentleftwidth} +\setinterfaceconstant{alignmentrightsample}{alignmentrightsample} +\setinterfaceconstant{alignmentrightwidth}{alignmentrightwidth} \setinterfaceconstant{alignsymbol}{alignsymbol} \setinterfaceconstant{aligntitle}{alinieretitlu} \setinterfaceconstant{alternative}{alternativ} @@ -687,6 +693,7 @@ \setinterfaceconstant{bottomoffset}{offsetjos} \setinterfaceconstant{bottomspace}{spatiujos} \setinterfaceconstant{bottomstate}{starejos} +\setinterfaceconstant{break}{break} \setinterfaceconstant{buffer}{buffer} \setinterfaceconstant{cache}{cache} \setinterfaceconstant{calculate}{calculeaza} @@ -752,6 +759,7 @@ \setinterfaceconstant{direction}{directie} \setinterfaceconstant{directory}{director} \setinterfaceconstant{display}{display} +\setinterfaceconstant{displaythreshold}{displaythreshold} \setinterfaceconstant{distance}{distanta} \setinterfaceconstant{domain}{domain} \setinterfaceconstant{dot}{punct} @@ -794,6 +802,7 @@ \setinterfaceconstant{fieldoffset}{offsetcamp} \setinterfaceconstant{file}{fisier} \setinterfaceconstant{filler}{filler} +\setinterfaceconstant{filter}{filter} \setinterfaceconstant{filtercommand}{filtercommand} \setinterfaceconstant{finalnamesep}{finalnamesep} \setinterfaceconstant{finalpagesep}{finalpagesep} @@ -841,6 +850,7 @@ \setinterfaceconstant{headerstate}{stareantet} \setinterfaceconstant{headlabel}{etichetatitlu} \setinterfaceconstant{headnumber}{numartitlu} +\setinterfaceconstant{headseparator}{headseparator} \setinterfaceconstant{headstyle}{stiltitlu} \setinterfaceconstant{height}{inaltime} \setinterfaceconstant{hfactor}{hfactor} @@ -861,6 +871,7 @@ \setinterfaceconstant{index}{index} \setinterfaceconstant{indicator}{indicator} \setinterfaceconstant{initialsep}{initialsep} +\setinterfaceconstant{inlinethreshold}{inlinethreshold} \setinterfaceconstant{inner}{intern} \setinterfaceconstant{innermargin}{innermargin} \setinterfaceconstant{inputfile}{inputfile} @@ -903,6 +914,7 @@ \setinterfaceconstant{leftoffset}{offsetstanga} \setinterfaceconstant{leftquotation}{citatstanga} \setinterfaceconstant{leftquote}{minicitatstanga} +\setinterfaceconstant{leftsample}{leftsample} \setinterfaceconstant{leftsentence}{propozitiestanga} \setinterfaceconstant{leftspeech}{leftspeech} \setinterfaceconstant{leftstyle}{stilstanga} @@ -975,6 +987,7 @@ \setinterfaceconstant{nlines}{nlinii} \setinterfaceconstant{norm}{norm} \setinterfaceconstant{note}{note} +\setinterfaceconstant{notes}{notes} \setinterfaceconstant{nr}{nr} \setinterfaceconstant{nright}{ndreapta} \setinterfaceconstant{ntop}{nsus} @@ -994,6 +1007,7 @@ \setinterfaceconstant{numberset}{numberset} \setinterfaceconstant{numberstarter}{numberstarter} \setinterfaceconstant{numberstopper}{numberstopper} +\setinterfaceconstant{numberstrut}{numberstrut} \setinterfaceconstant{numberstyle}{stilnumar} \setinterfaceconstant{numberwidth}{numberwidth} \setinterfaceconstant{nx}{nx} @@ -1063,6 +1077,7 @@ \setinterfaceconstant{preview}{previzualizare} \setinterfaceconstant{previous}{precendent} \setinterfaceconstant{previousnumber}{numarprecedent} +\setinterfaceconstant{print}{print} \setinterfaceconstant{printable}{tiparibil} \setinterfaceconstant{process}{process} \setinterfaceconstant{profile}{profile} @@ -1105,6 +1120,7 @@ \setinterfaceconstant{rightoffset}{offsetdreapta} \setinterfaceconstant{rightquotation}{citatdreapta} \setinterfaceconstant{rightquote}{minicitatdreapta} +\setinterfaceconstant{rightsample}{rightsample} \setinterfaceconstant{rightsentence}{propozitiedreapta} \setinterfaceconstant{rightspeech}{rightspeech} \setinterfaceconstant{rightstyle}{stildreapta} @@ -1147,7 +1163,10 @@ \setinterfaceconstant{sidemethod}{sidemethod} \setinterfaceconstant{sidespaceafter}{spatiulateraldupa} \setinterfaceconstant{sidespacebefore}{spatiulateralinainte} +\setinterfaceconstant{sidespaceinbetween}{sidespaceinbetween} +\setinterfaceconstant{sidethreshold}{sidethreshold} \setinterfaceconstant{sign}{semn} +\setinterfaceconstant{simplecommand}{simplecommand} \setinterfaceconstant{size}{dimensiune} \setinterfaceconstant{slantedfeatures}{slantedfeatures} \setinterfaceconstant{slantedfont}{slantedfont} @@ -1160,7 +1179,9 @@ \setinterfaceconstant{source}{sursa} \setinterfaceconstant{space}{spatiu} \setinterfaceconstant{spaceafter}{spatiudupa} +\setinterfaceconstant{spaceafterside}{spaceafterside} \setinterfaceconstant{spacebefore}{spatiuinainte} +\setinterfaceconstant{spacebeforeside}{spacebeforeside} \setinterfaceconstant{spaceinbetween}{spaceinbetween} \setinterfaceconstant{spacing}{spatiere} \setinterfaceconstant{specification}{specification} @@ -1225,6 +1246,7 @@ \setinterfaceconstant{titledistance}{distantatitlu} \setinterfaceconstant{titleleft}{titleleft} \setinterfaceconstant{titleright}{titleright} +\setinterfaceconstant{titlestrut}{titlestrut} \setinterfaceconstant{titlestyle}{stiltitlu} \setinterfaceconstant{to}{catre} \setinterfaceconstant{toffset}{toffset} diff --git a/tex/context/base/mkiv/anch-bck.mkvi b/tex/context/base/mkiv/anch-bck.mkvi index 207f64537..348ea0ad1 100644 --- a/tex/context/base/mkiv/anch-bck.mkvi +++ b/tex/context/base/mkiv/anch-bck.mkvi @@ -159,6 +159,9 @@ % todo \backgroundvariable\c!variant +% criterium determines when we fall back on text +% always is always forcing paragraphs + \let\anch_backgrounds_text_start_indeed\relax \let\anch_backgrounds_text_stop_indeed \relax @@ -167,7 +170,7 @@ \let\anch_backgrounds_text_stop_indeed \anch_backgrounds_text_stop_txt} \setvalue{\??textbackgroundlevel\v!paragraph}% - {\ifnum\c_anch_backgrounds_text_level>\plusone + {\ifnum\c_anch_backgrounds_text_level>\textbackgroundparameter\c!criterium\relax \let\anch_backgrounds_text_start_indeed\anch_backgrounds_text_start_txt \let\anch_backgrounds_text_stop_indeed \anch_backgrounds_text_stop_txt \else @@ -175,6 +178,10 @@ \let\anch_backgrounds_text_stop_indeed \anch_backgrounds_text_stop_par \fi} +\setvalue{\??textbackgroundlevel\v!always}% + {\let\anch_backgrounds_text_start_indeed\anch_backgrounds_text_start_par + \let\anch_backgrounds_text_stop_indeed \anch_backgrounds_text_stop_par} + \setvalue{\??textbackgroundlevel\v!none}% {\anch_backgrounds_text_preset_nop} @@ -513,6 +520,7 @@ \c!rightoffset=\textbackgroundparameter\c!leftoffset, \c!topoffset=\!!zeropoint, % \v!medium, \c!bottomoffset=\textbackgroundparameter\c!topoffset, + \c!criterium=\plusone, \c!level=-1, \c!alternative=0, \c!align=, diff --git a/tex/context/base/mkiv/anch-pgr.lua b/tex/context/base/mkiv/anch-pgr.lua index 8a63c5b54..18a915692 100644 --- a/tex/context/base/mkiv/anch-pgr.lua +++ b/tex/context/base/mkiv/anch-pgr.lua @@ -16,7 +16,7 @@ if not modules then modules = { } end modules ['anch-pgr'] = { -- been replaced. Background code is still not perfect, but some day ... the details manual -- will discuss this issue. -local abs, div, floor, round, min, max = math.abs, math.div, math.floor, math.round, math.min, math.max +local tonumber = tonumber local sort, concat = table.sort, table.concat local splitter = lpeg.splitat(":") local lpegmatch = lpeg.match @@ -971,8 +971,8 @@ local function freemultipar(pagedata,frees) -- ,k if trace_free then report_free("case 4, inside, right") end - n = n + 1 temp[n] = { xmin, lly } n = n + 1 temp[n] = { xmin, uly } + n = n + 1 temp[n] = { xmin, lly } done = true else -- case 0 diff --git a/tex/context/base/mkiv/anch-pgr.mkiv b/tex/context/base/mkiv/anch-pgr.mkiv index 1a583142e..e49d18b8f 100644 --- a/tex/context/base/mkiv/anch-pgr.mkiv +++ b/tex/context/base/mkiv/anch-pgr.mkiv @@ -16,7 +16,7 @@ %D Before we come to graphics support, we have to make sure of the reference point %D on the page. The next macros do so and are hooked into the page building routine. -\registerctxluafile{anch-pgr}{1.001} +\registerctxluafile{anch-pgr}{} \unprotect diff --git a/tex/context/base/mkiv/anch-pos.lua b/tex/context/base/mkiv/anch-pos.lua index 2ba9e2420..e5f58c36c 100644 --- a/tex/context/base/mkiv/anch-pos.lua +++ b/tex/context/base/mkiv/anch-pos.lua @@ -22,11 +22,11 @@ more efficient.</p> local tostring, next, rawget, rawset, setmetatable, tonumber = tostring, next, rawget, rawset, setmetatable, tonumber local sort, sortedhash, sortedkeys = table.sort, table.sortedhash, table.sortedkeys -local format, gmatch, match, find = string.format, string.gmatch, string.match, string.find +local format, gmatch = string.format, string.gmatch local rawget = rawget local lpegmatch = lpeg.match local insert, remove = table.insert, table.remove -local allocate, mark = utilities.storage.allocate, utilities.storage.mark +local allocate = utilities.storage.allocate local report = logs.reporter("positions") @@ -56,8 +56,6 @@ local setmetatablenewindex = table.setmetatablenewindex local nuts = nodes.nuts -local getfield = nuts.getfield -local setfield = nuts.setfield local setlink = nuts.setlink local getlist = nuts.getlist local setlist = nuts.setlist diff --git a/tex/context/base/mkiv/anch-pos.mkiv b/tex/context/base/mkiv/anch-pos.mkiv index 8b33dfce8..ab199eb1e 100644 --- a/tex/context/base/mkiv/anch-pos.mkiv +++ b/tex/context/base/mkiv/anch-pos.mkiv @@ -17,7 +17,7 @@ %D early, but starting in 2012 more dramatic changes started to happen, especially %D in relation to background graphics. It will probably take some time to settle. -\registerctxluafile{anch-pos}{1.001} +\registerctxluafile{anch-pos}{} \unprotect diff --git a/tex/context/base/mkiv/attr-col.lua b/tex/context/base/mkiv/attr-col.lua index c3b644bda..28e63b177 100644 --- a/tex/context/base/mkiv/attr-col.lua +++ b/tex/context/base/mkiv/attr-col.lua @@ -60,6 +60,8 @@ local formatters = string.formatters local interfaces = interfaces local implement = interfaces.implement +local texgetattribute = tex.getattribute + -- We can distinguish between rules and glyphs but it's not worth the trouble. A -- first implementation did that and while it saves a bit for glyphs and rules, it -- costs more resourses for transparencies. So why bother. @@ -356,7 +358,7 @@ local function reviver(data,n) else local model = colors.forcedmodel(v[1]) if model == 2 then - local gray= graycolor(v[2]) + local gray = graycolor(v[2]) d = { gray, gray, gray, gray } elseif model == 3 then local gray, rgb, cmyk = graycolor(v[2]), rgbcolor(v[3],v[4],v[5]), cmykcolor(v[6],v[7],v[8],v[9]) @@ -448,6 +450,12 @@ function colors.forcesupport(value) -- can move to attr-div colors.enable(value) end +function colors.toattributes(name) + local mc = list[a_color][name] + local mm = texgetattribute(a_selector) + return (mm == unsetvalue and 1) or mm or 1, mc or list[a_color][1] or unsetvalue +end + -- transparencies local a_transparency = attributes.private('transparency') @@ -554,6 +562,10 @@ function transparencies.forcesupport(value) -- can move to attr-div transparencies.enable(value) end +function transparencies.toattribute(name) + return list[a_transparency][name] or unsetvalue +end + --- colorintents: overprint / knockout attributes.colorintents = attributes.colorintents or { } diff --git a/tex/context/base/mkiv/attr-col.mkiv b/tex/context/base/mkiv/attr-col.mkiv index 6231755e9..db4eea9e9 100644 --- a/tex/context/base/mkiv/attr-col.mkiv +++ b/tex/context/base/mkiv/attr-col.mkiv @@ -13,7 +13,7 @@ \writestatus{loading}{ConTeXt Attribute Macros / Color} -\registerctxluafile{attr-col}{1.001} +\registerctxluafile{attr-col}{} \unprotect diff --git a/tex/context/base/mkiv/attr-eff.mkiv b/tex/context/base/mkiv/attr-eff.mkiv index 859814ebc..66721aa5e 100644 --- a/tex/context/base/mkiv/attr-eff.mkiv +++ b/tex/context/base/mkiv/attr-eff.mkiv @@ -13,7 +13,7 @@ \writestatus{loading}{ConTeXt Attribute Macros / Effects} -\registerctxluafile{attr-eff}{1.001} +\registerctxluafile{attr-eff}{} \unprotect diff --git a/tex/context/base/mkiv/attr-ini.mkiv b/tex/context/base/mkiv/attr-ini.mkiv index 77959c988..d537cebfa 100644 --- a/tex/context/base/mkiv/attr-ini.mkiv +++ b/tex/context/base/mkiv/attr-ini.mkiv @@ -19,7 +19,7 @@ \unprotect -\registerctxluafile{attr-ini}{1.001} +\registerctxluafile{attr-ini}{} \installcorenamespace{attributecount} % the counter representing the attribute (attrdef'd) \installcorenamespace{attributeid} % the internal number diff --git a/tex/context/base/mkiv/attr-lay.mkiv b/tex/context/base/mkiv/attr-lay.mkiv index 14ef4a6d4..ae5c12f97 100644 --- a/tex/context/base/mkiv/attr-lay.mkiv +++ b/tex/context/base/mkiv/attr-lay.mkiv @@ -22,7 +22,7 @@ \unprotect -\registerctxluafile{attr-lay}{1.001} +\registerctxluafile{attr-lay}{} % needs to work over stopitemize grouping etc diff --git a/tex/context/base/mkiv/attr-mkr.mkiv b/tex/context/base/mkiv/attr-mkr.mkiv index c8818ebae..544558dcf 100644 --- a/tex/context/base/mkiv/attr-mkr.mkiv +++ b/tex/context/base/mkiv/attr-mkr.mkiv @@ -15,7 +15,7 @@ \unprotect -\registerctxluafile{attr-mkr}{1.001} +\registerctxluafile{attr-mkr}{} \unexpanded\def\definemarker [#1]{\defineattribute[\s!marker:#1]} \unexpanded\def\setmarker [#1]#2[#3]{\dosetattribute{\s!marker:#1}{#3}} diff --git a/tex/context/base/mkiv/attr-neg.mkiv b/tex/context/base/mkiv/attr-neg.mkiv index ff1f52a96..465f2b2e7 100644 --- a/tex/context/base/mkiv/attr-neg.mkiv +++ b/tex/context/base/mkiv/attr-neg.mkiv @@ -13,7 +13,7 @@ \writestatus{loading}{ConTeXt Attribute Macros / Negation} -\registerctxluafile{attr-neg}{1.001} +\registerctxluafile{attr-neg}{} \unprotect diff --git a/tex/context/base/mkiv/back-exp.lua b/tex/context/base/mkiv/back-exp.lua index da7ec202f..2d51d933d 100644 --- a/tex/context/base/mkiv/back-exp.lua +++ b/tex/context/base/mkiv/back-exp.lua @@ -39,7 +39,7 @@ local validstring = string.valid local lpegmatch = lpeg.match local utfchar, utfvalues = utf.char, utf.values local concat, insert, remove, merge, sort = table.concat, table.insert, table.remove, table.merge, table.sort -local sortedhash = table.sortedhash +local sortedhash, sortedkeys = table.sortedhash, table.sortedkeys local formatters = string.formatters local todimen = number.todimen local replacetemplate = utilities.templates.replace @@ -74,6 +74,7 @@ local implement = interfaces.implement local included = backends.included local settings_to_array = utilities.parsers.settings_to_array +local settings_to_hash = utilities.parsers.settings_to_hash local setmetatableindex = table.setmetatableindex local tasks = nodes.tasks @@ -121,7 +122,6 @@ local getdisc = nuts.getdisc local getcomponents = nuts.getcomponents local getlist = nuts.getlist local getid = nuts.getid -local getfield = nuts.getfield local getattr = nuts.getattr local setattr = nuts.setattr -- maybe use properties local isglyph = nuts.isglyph @@ -149,7 +149,7 @@ local overloads = fonts.mappings.overloads -- todo: more locals (and optimize) -local exportversion = "0.34" +local exportversion = "0.35" local mathmlns = "http://www.w3.org/1998/Math/MathML" local contextns = "http://www.contextgarden.net/context/export" -- whatever suits local cssnamespaceurl = "@namespace context url('%namespace%') ;" @@ -347,16 +347,17 @@ do -- /* text-align : justify ; */ local documenttemplate = [[ -document, %namespace%div.document { +document, +%namespace%div.document { font-size : %size% !important ; max-width : %width% !important ; text-width : %align% !important ; hyphens : %hyphens% !important ; -} -]] +}]] local styletemplate = [[ -%element%[detail="%detail%"], %namespace%div.%element%.%detail% { +%element%[detail="%detail%"], +%namespace%div.%element%.%detail% { display : inline ; font-style : %style% ; font-variant : %variant% ; @@ -416,7 +417,7 @@ local styletemplate = [[ }) -- local colorspecification = xml.css.colorspecification - local fontspecification = xml.css.fontspecification + local fontspecification = xml.css.fontspecification for element, details in sortedhash(usedstyles) do for detail, data in sortedhash(details) do local s = fontspecification(data.style) @@ -431,6 +432,7 @@ local styletemplate = [[ weight = s.weight or "inherit", family = s.family or "inherit", color = c or "inherit", + display = s.display and "block" or nil, }) end end @@ -550,7 +552,7 @@ end do - local fields = { "title", "subtitle", "author", "keywords" } + local fields = { "title", "subtitle", "author", "keywords", "url", "version" } local function checkdocument(root) local data = root.data @@ -717,16 +719,32 @@ end do + local strippedtag = structurestags.strip -- we assume global styles + local highlight = { } - usedstyles.highlight = highlight + local construct = { } - local strippedtag = structurestags.strip -- we assume global styles + usedstyles.highlight = highlight + usedstyles.construct = construct + + function structurestags.sethighlight(name,style,color,mode) + if not highlight[name] then + highlight[name] = { + style = style, + color = color, + mode = mode == 1 and "display" or nil, + } + end + end - function structurestags.sethighlight(style,color) - highlight[strippedtag(locatedtag("highlight"))] = { - style = style, -- xml.css.fontspecification(style), - color = color, -- xml.css.colorspec(color), - } + function structurestags.setconstruct(name,style,color,mode) + if not construct[name] then + construct[name] = { + style = style, + color = color, + mode = mode == 1 and "display" or nil, + } + end end end @@ -801,16 +819,20 @@ do function structurestags.setfigure(name,used,page,width,height,label) local fulltag = locatedtag("image") local spec = specifications[fulltag] - local page = tonumber(page) - image[fulltag] = { - id = f_id(spec.tagname,spec.tagindex), - name = name, - used = used, - page = page and page > 1 and page or nil, - width = todimen(width, "cm","%0.3F%s"), - height = todimen(height,"cm","%0.3F%s"), - label = label, - } + if spec then + local page = tonumber(page) + image[fulltag] = { + id = f_id(spec.tagname,spec.tagindex), + name = name, + used = used, + page = page and page > 1 and page or nil, + width = todimen(width, "cm","%0.3F%s"), + height = todimen(height,"cm","%0.3F%s"), + label = label, + } + else + -- we ignore images in layers in the background / pagebody + end end function extras.image(di,element,n,fulltag) @@ -1155,6 +1177,7 @@ do mfrac = true, mroot = true, msqrt = true, + mtable = true, mi = true, mo = true, mn = true, @@ -1189,14 +1212,14 @@ do -- sub.__o__, sup.__o__ = subscript, superscript sub.__i__, sup.__i__ = superscript, subscript end --- elseif roottg == "msup" or roottg == "msub" then --- -- m$^2$ --- if ndata == 1 then --- local d = data[1] --- data[2] = d --- d.__i__ = 2 --- data[1] = dummy_nucleus --- end + -- elseif roottg == "msup" or roottg == "msub" then + -- -- m$^2$ + -- if ndata == 1 then + -- local d = data[1] + -- data[2] = d + -- d.__i__ = 2 + -- data[1] = dummy_nucleus + -- end elseif roottg == "mfenced" then local s = specifications[root.fulltag] local l, m, r = s.left, s.middle, s.right @@ -1220,17 +1243,22 @@ do } end if ndata == 0 then +root.skip = "comment" -- get rid of weird artefacts +root.nota = "weird" return elseif ndata == 1 then local d = data[1] - if not d then + if not d or d == "" then +root.skip = "comment" return elseif d.content then return - elseif #root.data == 1 then + else -- if ndata == 1 then local tg = d.tg - if automathrows and roottg == "mrow" then +-- if automathrows and roottg == "mrow" then +if automathrows and (roottg == "mrow" or roottg == "mtext") then -- maybe just always ! check spec first +-- or we can have chesks.* for each as we then can flatten if no_mrow[tg] then root.skip = "comment" end @@ -1400,8 +1428,10 @@ do } elseif di.tg == "math" then local di = di.data[1] - data[i] = di - checkmath(di) + if di then + data[i] = di + checkmath(di) + end end end di.element = "mrow" @@ -1561,55 +1591,156 @@ do if #data > 0 then return di end --- end end - -- could be integrated but is messy then --- while roottg == "mrow" and #data == 1 do --- data = data[1] --- for k, v in next, data do --- root[k] = v --- end --- roottg = data.tg --- end end end function checks.math(di) - local specification = specifications[di.fulltag] - local mode = specification and specification.mode == "display" and "block" or "inline" - di.attributes = { - ["display"] = mode, - ["xmlns:m"] = mathmlns, - } - -- can be option if needed: - if mode == "inline" then - -- di.nature = "mixed" -- else spacing problem (maybe inline) - di.nature = "inline" -- we need to catch x$X$x and x $X$ x + if di.skip == "comment" then + -- already done, kind of weird, happens in mathmatrix, maybe some collapse + -- issue that i need to look into else - di.nature = "display" + local specification = specifications[di.fulltag] + local mode = specification and specification.mode == "display" and "block" or "inline" + di.attributes = { + ["display"] = mode, + ["xmlns:m"] = mathmlns, + } + -- can be option if needed: + if mode == "inline" then + -- di.nature = "mixed" -- else spacing problem (maybe inline) + di.nature = "inline" -- we need to catch x$X$x and x $X$ x + else + di.nature = "display" + end + if automathstrip then + stripmath(di) + end + checkmath(di) end - if automathstrip then - stripmath(di) + end + + -- this one can replace some of the previous code .. todo (test on mathmatrix) + + -- ignore with no data can be removed + + local function checked(d) + local n = #d + if n == 1 then + local di = d[1] + local tg = di.tg + if tg == "ignore" then + -- todo: we can move ignore's data one level up + return 1 + elseif di.content then + return 1 + else + local dd = di.data + if #dd > 0 and checked(dd) > 0 then + return 1 + else + return 0 + end + end + else + local m = 0 + for i=1,n do + local di = d[i] + local tg = di.tg + if tg == "ignore" then + -- skip + elseif di.content then + m = m + 1 + d[m] = di + else + local dd = di.data + if #dd > 0 and checked(dd) > 0 then + m = m + 1 + d[m] = di + end + end + end + if m < n then + for i=n,m+1,-1 do + d[i] = nil + end + end + return m end - checkmath(di) end - local a, z, A, Z = 0x61, 0x7A, 0x41, 0x5A + function checks.mrow(di) +-- local d = di.data +-- if d then +-- checked(d) +-- end + end + + -- we can move more checks here - function extras.mi(di,element,n,fulltag) -- check with content - local str = di.data[1].content - if str and sub(str,1,1) ~= "&" then -- hack but good enough (maybe gsub op eerste) - for v in utfvalues(str) do - if (v >= a and v <= z) or (v >= A and v <= Z) then - local a = di.attributes - if a then - a.mathvariant = "normal" + local function flatten(di) + local r = di.__p__ + while r do + local d = r.data + local n = #d + if d and n > 1 then + n = checked(d) + end + local tg = r.tg + if n == 1 and (tg == "mtext" or tg == "mrow") then + r.skip = "comment" -- weird error + r = r.__p__ + else + break + end + end + end + + function checks.mtable(di) + flatten(di) + local d = di.data + for i=1,#d do + local d = d[i] + if d.tg == "mtr" then + local d = d.data + for i=1,#d do + local d = d[i] + if d.tg == "mtd" then + -- okay + elseif d.content then + d.content = "" else - di.attributes = { mathvariant = "normal" } + d.skip = "comment" -- weird error + end + end + elseif d.content then + d.content = "" + else + d.skip = "comment" -- weird error + end + end + end + + do + + local a, z, A, Z = 0x61, 0x7A, 0x41, 0x5A + + function extras.mi(di,element,n,fulltag) -- check with content + local str = di.data[1].content + if str and sub(str,1,1) ~= "&" then -- hack but good enough (maybe gsub op eerste) + for v in utfvalues(str) do + if (v >= a and v <= z) or (v >= A and v <= Z) then + local a = di.attributes + if a then + a.mathvariant = "normal" + else + di.attributes = { mathvariant = "normal" } + end end end end end + end function extras.msub(di,element,n,fulltag) @@ -1660,7 +1791,35 @@ do resolve(di,element,n,fulltag) end - extras.float = resolve + local floats = { } + + function structurestags.setfloat(options,method) + floats[locatedtag("float")] = { + options = options, + method = method, + } + end + + function extras.float(di,element,n,fulltag) + local hash = floats[fulltag] + if hash then + local method = hash.method + if not method or method == "" then + method = "here" + end + setattribute(di,"method",method) + local options = hash.options + if options and options ~= "" then + options = settings_to_hash(options) + options[method] = nil + options = concat(sortedkeys(options),",") + if #options > 0 then + setattribute(di,"options",options) + end + end + end + resolve(di,element,n,fulltag) + end -- todo: internal is already hashed @@ -1735,21 +1894,26 @@ do local function hascontent(data) for i=1,#data do local di = data[i] - if not di then + if not di or di.tg == "ignore" then -- - elseif di.content then - return true else - local d = di.data - if d and #d > 0 and hascontent(d) then + local content = di.content + if content == " " then + -- + elseif content then return true + else + local d = di.data + if d and #d > 0 and hascontent(d) then + return true + end end end end end function structurestags.settablecell(rows,columns,align) - if align > 0 or rows > 1 or columns > 1 then + if align > 0 or rows > 1 or columns > 1 then -- or kind > 0 tabledata[locatedtag("tablecell")] = { rows = rows, columns = columns, @@ -1784,10 +1948,11 @@ do local tabulatedata = { } - function structurestags.settabulatecell(align) - if align > 0 then + function structurestags.settabulatecell(align,kind) + if align > 0 or kind > 0 then tabulatedata[locatedtag("tabulatecell")] = { align = align, + kind = kind, -- 1 = bold head } end end @@ -1815,6 +1980,12 @@ do elseif align == 3 then setattribute(di,"align","middle") end + local kind = hash.kind + if kind == 1 then + setattribute(di,"kind","strong") + elseif kind == 2 then + setattribute(di,"kind","equals") + end end end @@ -1891,13 +2062,6 @@ do local depth = 0 local inline = 0 - local function bpar(result) - result[#result+1] = "\n<p>" - end - local function epar(result) - result[#result+1] = "</p>\n" - end - local function emptytag(result,embedded,element,nature,di) -- currently only break but at some point local a = di.attributes -- we might add detail etc if a then -- happens seldom @@ -1919,6 +2083,34 @@ do end end + -- local function stripspaces(di) + -- local d = di.data + -- local n = #d + -- local m = 0 + -- for i=1,n do + -- local di = d[i] + -- if di.tg then + -- m = m + 1 + -- d[m] = di + -- end + -- end + -- for i=n,m+1,-1 do + -- d[i] = nil + -- end + -- end + -- + -- -- simpler: + + local function stripspaces(di) + local d = di.data + for i=1,#d do + local di = d[i] + if not di.tg then + di.content = "" + end + end + end + local function begintag(result,embedded,element,nature,di,skip) local index = di.n local fulltag = di.fulltag @@ -1972,6 +2164,11 @@ do if extra then extra(di,element,index,fulltag) end + -- + if di.record then + stripspaces(di) + end + -- if exportproperties then local p = specification.userdata if not p then @@ -2044,7 +2241,9 @@ do if metadata then result[#result+1] = f_metadata_begin(depth) for k, v in table.sortedpairs(metadata) do - result[#result+1] = f_metadata(depth+1,k,lpegmatch(p_entity,v)) + if v ~= "" then + result[#result+1] = f_metadata(depth+1,k,lpegmatch(p_entity,v)) + end end result[#result+1] = f_metadata_end(depth) end @@ -2315,7 +2514,7 @@ do if check then check(d) end - checktree(d) + checktree(d) -- so parts can pass twice end end end @@ -2333,7 +2532,7 @@ end -- collector code local function push(fulltag,depth) - local tg, n, detail + local tg, n, detail, element, nature, record local specification = specifications[fulltag] if specification then tg = specification.tagname @@ -2344,9 +2543,12 @@ local function push(fulltag,depth) tg, n = lpegmatch(tagsplitter,fulltag) n = tonumber(n) -- to tonumber in tagsplitter end - local p = properties[tg] - local element = p and p.export or tg - local nature = p and p.nature or "inline" -- defaultnature + local p = properties[tg] + if p then + element = p.export or tg + nature = p.nature or "inline" -- defaultnature + record = p.record + end local treedata = tree.data local t = { -- maybe we can use the tag table tg = tg, @@ -2358,6 +2560,7 @@ local function push(fulltag,depth) data = { }, attribute = currentattribute, parnumber = currentparagraph, + record = record, -- we can consider storing properties } treedata[#treedata+1] = t currentdepth = currentdepth + 1 @@ -2541,6 +2744,8 @@ local function finishexport() end end +-- inserts ? + local function collectresults(head,list,pat,pap) -- is last used (we also have currentattribute) local p for n in traverse_nodes(head) do @@ -2859,19 +3064,6 @@ function nodes.handlers.export(head) -- hooks into the page builder end -- continueexport() restart = true - --- local function f(head,depth,pat) --- for n in node.traverse(head) do --- local a = n[a_tagged] or pat --- local t = taglist[a] --- print(depth,n,a,t and table.concat(t," ")) --- if n.id == hlist_code or n.id == vlist_code and n.list then --- f(n.list,depth+1,a) --- end --- end --- end --- f(head,1) - collectresults(tonut(head)) if trace_export then report_export("%w<!-- stop flushing page -->",currentdepth) @@ -2886,7 +3078,7 @@ function builders.paragraphs.tag(head) local subtype = getsubtype(n) if subtype == line_code then setattr(n,a_textblock,noftextblocks) - elseif subtype == glue_code or subtype == kern_code then + elseif subtype == glue_code or subtype == kern_code then -- no need to set fontkerns setattr(n,a_textblock,0) end end @@ -2895,6 +3087,9 @@ end do + local xmlcollected = xml.collected + local xmlsetcomment = xml.setcomment + local xmlpreamble = [[ <?xml version="1.0" encoding="UTF-8" standalone="%standalone%" ?> @@ -2955,14 +3150,16 @@ local cssheadlink = [[ local elementtemplate = [[ /* element="%element%" detail="%detail%" chain="%chain%" */ -%element%, %namespace%div.%element% { +%element%, +%namespace%div.%element% { display: %display% ; }]] local detailtemplate = [[ /* element="%element%" detail="%detail%" chain="%chain%" */ -%element%[detail=%detail%], %namespace%div.%element%.%detail% { +%element%[detail=%detail%], +%namespace%div.%element%.%detail% { display: %display% ; }]] @@ -2983,7 +3180,7 @@ local htmltemplate = [[ </head> <body> - <div xmlns="http://www.pragma-ade.com/context/export"> + <div class="document" xmlns="http://www.pragma-ade.com/context/export"> <div class="warning">Rendering can be suboptimal because there is no default/fallback css loaded.</div> @@ -3061,7 +3258,7 @@ local htmltemplate = [[ local implicits = { } local explicits = { } local overloads = { } - for e in xml.collected(xmltree,"*") do + for e in xmlcollected(xmltree,"*") do local at = e.at if at then local explicit = at.explicit @@ -3082,7 +3279,7 @@ local htmltemplate = [[ end end end - for e in xml.collected(xmltree,"*") do + for e in xmlcollected(xmltree,"*") do local at = e.at if at then local internal = at.internal @@ -3214,7 +3411,7 @@ local htmltemplate = [[ local function remap(specification,source,target) local comment = nil -- share comments - for c in xml.collected(source,"*") do + for c in xmlcollected(source,"*") do if not c.special then local tg = c.tg local ns = c.ns @@ -3226,44 +3423,45 @@ local htmltemplate = [[ -- elseif tg == "a" then -- c.ns = "" else - -- if tg == "tabulatecell" or tg == "tablecell" then - local dt = c.dt - local nt = #dt - if nt == 0 or (nt == 1 and dt[1] == "") then - if comment then - c.dt = comment - else - xml.setcomment(c,"empty") - comment = c.dt - end + local dt = c.dt + local nt = #dt + if nt == 0 or (nt == 1 and dt[1] == "") then + if comment then + c.dt = comment + else + xmlsetcomment(c,"empty") + comment = c.dt end - -- end + end local at = c.at local class = nil + local label = nil if tg == "document" then at.href = nil at.detail = nil at.chain = nil elseif tg == "metavariable" then - at.detail = "metaname-" .. at.name + label = at.name + at.detail = "metaname-" .. label class = makeclass(tg,at) else class = makeclass(tg,at) end local id = at.id local href = at.href + local attr = nil if id then - id = lpegmatch(p_cleanid, id) or id + id = lpegmatch(p_cleanid, id) or id if href then href = lpegmatch(p_cleanhref,href) or href - c.at = { + attr = { class = class, id = id, href = href, onclick = addclicks and f_onclick(href) or nil, } else - c.at = { + attr = { class = class, id = id, } @@ -3271,18 +3469,22 @@ local htmltemplate = [[ else if href then href = lpegmatch(p_cleanhref,href) or href - c.at = { + attr = { class = class, href = href, onclick = addclicks and f_onclick(href) or nil, } else - c.at = { + attr = { class = class, } end end c.tg = "div" + c.at = attr + if label then + attr.label = label + end end end end @@ -3292,11 +3494,19 @@ local htmltemplate = [[ local addsuffix = file.addsuffix local joinfile = file.join + local nameonly = file.nameonly + local basename = file.basename local embedfile = false directives.register("export.embed",function(v) embedfile = v end) local embedmath = false - local function stopexport(v) + function structurestags.finishexport() + + if exporting then + exporting = false + else + return + end starttiming(treehash) -- @@ -3314,10 +3524,8 @@ local htmltemplate = [[ -- wrapups.hashlistdata() -- - if type(v) ~= "string" or v == v_yes or v == "" then - v = tex.jobname - end - + local askedname = finetuning.file + -- -- we use a dedicated subpath: -- -- ./jobname-export @@ -3333,14 +3541,18 @@ local htmltemplate = [[ -- ./jobname-export/styles/jobname-images.css -- ./jobname-export/styles/jobname-templates.css - local basename = file.basename(v) - local basepath = basename .. "-export" + if type(askedname) ~= "string" or askedname == v_yes or askedname == "" then + askedname = tex.jobname + end + + local usedname = nameonly(askedname) + local basepath = usedname .. "-export" local imagepath = joinfile(basepath,"images") local stylepath = joinfile(basepath,"styles") local function validpath(what,pathname) if lfs.isdir(pathname) then - report_export("using exiting %s path %a",what,pathname) + report_export("using existing %s path %a",what,pathname) return pathname end lfs.mkdir(pathname) @@ -3358,21 +3570,23 @@ local htmltemplate = [[ end -- we're now on the dedicated export subpath so we can't clash names + -- + -- a xhtml suffix no longer seems to be work well with browsers - local xmlfilebase = addsuffix(basename .. "-raw","xml" ) - local xhtmlfilebase = addsuffix(basename .. "-tag","xhtml") - local htmlfilebase = addsuffix(basename .. "-div","xhtml") - local specificationfilebase = addsuffix(basename .. "-pub","lua" ) + local xmlfilebase = addsuffix(usedname .. "-raw","xml" ) + local xhtmlfilebase = addsuffix(usedname .. "-tag","xhtml") + local htmlfilebase = addsuffix(usedname .. "-div","html") + local specificationfilebase = addsuffix(usedname .. "-pub","lua" ) local xmlfilename = joinfile(basepath, xmlfilebase ) local xhtmlfilename = joinfile(basepath, xhtmlfilebase ) local htmlfilename = joinfile(basepath, htmlfilebase ) local specificationfilename = joinfile(basepath, specificationfilebase) -- - local defaultfilebase = addsuffix(basename .. "-defaults", "css") - local imagefilebase = addsuffix(basename .. "-images", "css") - local stylefilebase = addsuffix(basename .. "-styles", "css") - local templatefilebase = addsuffix(basename .. "-templates","css") + local defaultfilebase = addsuffix(usedname .. "-defaults", "css") + local imagefilebase = addsuffix(usedname .. "-images", "css") + local stylefilebase = addsuffix(usedname .. "-styles", "css") + local templatefilebase = addsuffix(usedname .. "-templates","css") -- local defaultfilename = joinfile(stylepath,defaultfilebase ) local imagefilename = joinfile(stylepath,imagefilebase ) @@ -3410,7 +3624,7 @@ local htmltemplate = [[ local list = table.unique(settings_to_array(cssfile)) for i=1,#list do local source = addsuffix(list[i],"css") - local target = joinfile(stylepath,file.basename(source)) + local target = joinfile(stylepath,basename(source)) cssfiles[#cssfiles+1] = source if not lfs.isfile(source) then source = joinfile("../",source) @@ -3445,7 +3659,7 @@ local htmltemplate = [[ -- only for testing attach { data = concat{ wholepreamble(true), result }, - name = file.basename(xmlfilename), + name = basename(xmlfilename), registered = "export", title = "raw xml export", method = v_hidden, @@ -3457,8 +3671,8 @@ local htmltemplate = [[ -- for k, v in sortedhash(embedded) do -- attach { -- data = v, - -- file = file.basename(k), - -- name = file.addsuffix(k,"xml"), + -- file = basename(k), + -- name = addsuffix(k,"xml"), -- registered = k, -- reference = k, -- title = "xml export snippet: " .. k, @@ -3483,13 +3697,13 @@ local htmltemplate = [[ io.savedata(xmlfilename,result) report_export("saving css image definitions in %a",imagefilename) - io.savedata(imagefilename,wrapups.allusedimages(basename)) + io.savedata(imagefilename,wrapups.allusedimages(usedname)) report_export("saving css style definitions in %a",stylefilename) - io.savedata(stylefilename,wrapups.allusedstyles(basename)) + io.savedata(stylefilename,wrapups.allusedstyles(usedname)) report_export("saving css template in %a",templatefilename) - io.savedata(templatefilename,allusedelements(basename)) + io.savedata(templatefilename,allusedelements(usedname)) -- additionally we save an xhtml file; for that we load the file as xml tree @@ -3497,6 +3711,15 @@ local htmltemplate = [[ local xmltree = cleanxhtmltree(xml.convert(result)) +-- local xmltree = xml.convert(result) +-- for c in xml.collected(xmltree,"m:mtext[lastindex()=1]/m:mrow") do +-- print(c) +-- end +-- for c in xml.collected(xmltree,"mtext/mrow") do +-- print(c) +-- end +-- local xmltree = cleanxhtmltree(xmltree) + xml.save(xmltree,xhtmlfilename) -- now we save a specification file that can b eused for generating an epub file @@ -3505,9 +3728,10 @@ local htmltemplate = [[ -- at the tex end local identity = interactions.general.getidentity() + local metadata = structures.tags.getmetadata() local specification = { - name = file.removesuffix(v), + name = usedname, identifier = os.uuid(), images = wrapups.uniqueusedimages(), imagefile = joinfile("styles",imagefilebase), @@ -3524,6 +3748,7 @@ local htmltemplate = [[ author = validstring(finetuning.author) or validstring(identity.author), firstpage = validstring(finetuning.firstpage), lastpage = validstring(finetuning.lastpage), + metadata = metadata, } report_export("saving specification in %a",specificationfilename,specificationfilename) @@ -3537,10 +3762,15 @@ local htmltemplate = [[ remap(specification,xmltree) + -- believe it or not, but a <title/> can prevent viewing in browsers + local title = specification.title if not title or title == "" then - title = "no title" -- believe it or not, but a <title/> can prevent viewing in browsers + title = metadata.title + if not title or title == "" then + title = usedname -- was: "no title" + end end local variables = { @@ -3555,7 +3785,7 @@ local htmltemplate = [[ -- finally we report how an epub file can be made (using the specification) report_export("") - report_export('create epub with: mtxrun --script epub --make "%s" [--purge --rename --svgmath]',file.nameonly(basename)) + report_export('create epub with: mtxrun --script epub --make "%s" [--purge --rename --svgmath]',usedname) report_export("") stoptiming(treehash) @@ -3564,17 +3794,8 @@ local htmltemplate = [[ local appendaction = nodes.tasks.appendaction local enableaction = nodes.tasks.enableaction - function structurestags.setupexport(t) - merge(finetuning,t) - keephyphens = finetuning.hyphen == v_yes - exportproperties = finetuning.properties - if exportproperties == v_no then - exportproperties = false - end - end - - local function startexport(v) - if v and not exporting then + function structurestags.initializeexport() + if not exporting then report_export("enabling export to xml") -- not yet known in task-ini appendaction("shipouts","normalizers", "nodes.handlers.export") @@ -3584,19 +3805,19 @@ local htmltemplate = [[ -- appendaction("finalizers","lists","builders.paragraphs.tag") -- enableaction("finalizers","builders.paragraphs.tag") luatex.registerstopactions(structurestags.finishexport) - exporting = v + exporting = true end end - function structurestags.finishexport() - if exporting then - stopexport(exporting) - exporting = false + function structurestags.setupexport(t) + merge(finetuning,t) + keephyphens = finetuning.hyphen == v_yes + exportproperties = finetuning.properties + if exportproperties == v_no then + exportproperties = false end end - directives.register("backend.export",startexport) -- maybe .name - statistics.register("xml exporting time", function() if exporting then return string.format("%s seconds, version %s", statistics.elapsedtime(treehash),exportversion) @@ -3624,6 +3845,7 @@ implement { { "lastpage" }, { "svgstyle" }, { "cssfile" }, + { "file" }, } } } @@ -3634,6 +3856,12 @@ implement { } implement { + name = "initializeexport", + actions = structurestags.initializeexport, +} + + +implement { name = "settagitemgroup", actions = structurestags.setitemgroup, arguments = { "boolean", "integer", "string" } @@ -3646,6 +3874,12 @@ implement { } implement { + name = "settagfloat", + actions = structurestags.setfloat, + arguments = { "string", "string" } +} + +implement { name = "settagdelimitedsymbol", actions = structurestags.settagdelimitedsymbol, arguments = "string" @@ -3684,7 +3918,13 @@ implement { implement { name = "settaghighlight", actions = structurestags.sethighlight, - arguments = { "string", "integer" } + arguments = { "string", "string", "integer", "integer" } +} + +implement { + name = "settagconstruct", + actions = structurestags.setconstruct, + arguments = { "string", "string", "integer", "integer" } } implement { @@ -3708,7 +3948,7 @@ implement { implement { name = "settagtabulatecell", actions = structurestags.settabulatecell, - arguments = "integer" + arguments = { "integer", "integer" }, } implement { diff --git a/tex/context/base/mkiv/back-exp.mkiv b/tex/context/base/mkiv/back-exp.mkiv index 48f4d3c48..ad5ba8371 100644 --- a/tex/context/base/mkiv/back-exp.mkiv +++ b/tex/context/base/mkiv/back-exp.mkiv @@ -13,7 +13,7 @@ \writestatus{loading}{ConTeXt Backend Macros / XML export} -\registerctxluafile{back-exp.lua}{1.001} +\registerctxluafile{back-exp}{} %D This is an experimental exporter and a logical follow up on tagging. The %D exporter assumes a properly tagged document. Some elements get a couple @@ -94,7 +94,9 @@ \appendtoks \unexpanded\def\dotagtabulatecell - {\iftrialtypesetting\else\clf_settagtabulatecell\c_tabl_tabulate_align\fi}% + {\iftrialtypesetting\else + \clf_settagtabulatecell\c_tabl_tabulate_align\c_tabl_tabulate_kind + \fi}% \unexpanded\def\dotagtabulatesignal {\dontleavehmode\signalcharacter\ignorespaces}% \to \everyenableelements @@ -110,9 +112,26 @@ \to \everyenableelements \appendtoks % frozen and assumed global per highlight class + \unexpanded\def\dotagconstruct + {\iftrialtypesetting\else + \clf_settagconstruct + {\currentstartstop}% + {\startstopparameter\c!style}% + \attribute\colorattribute + \ifvmode\plusone\else\zerocount\fi + \relax + \fi}% +\to \everyenableelements + +\appendtoks % frozen and assumed global per highlight class \unexpanded\def\dotaghighlight {\iftrialtypesetting\else - \clf_settaghighlight{\highlightparameter\c!style}\attribute\colorattribute\relax + \clf_settaghighlight + {\currenthighlight}% + {\highlightparameter\c!style} + \attribute\colorattribute + \ifvmode\plusone\else\zerocount\fi + \relax \fi}% \to \everyenableelements @@ -209,6 +228,13 @@ \to \everyenableelements \appendtoks + \unexpanded\def\dotagregisterfloat#1#2% + {\iftrialtypesetting\else + \clf_settagfloat{#1}{#2}\relax + \fi}% +\to \everyenableelements + +\appendtoks \let\specialfixedspace \explicitfixedspace \let\specialobeyedspace \explicitobeyedspace \let\specialstretchedspace\explicitstretchedspace @@ -239,10 +265,27 @@ \c!properties=\v!no, % no: ignore, yes: as attribute, otherwise: use as prefix \c!hyphen=\v!no, \c!svgstyle=, - \c!cssfile=] + \c!cssfile=, + \c!file={\backendparameter\c!export}] % downward compatibility + +\resetsystemmode\v!export + +\unexpanded\def\doinitializeexport + {\edef\p_export{\backendparameter\c!export}% + \ifx\p_export\empty \else + \setuptagging[\c!state=\v!start]% + \clf_initializeexport + \setsystemmode\v!export + \exportingtrue + \writestatus\m!backend\empty % so messages will stand out a bit + \the\everyinitializeexport + \writestatus\m!backend\empty % so messages will stand out a bit + \glet\doinitializeexport\relax + \fi} -\def\dosynchronizeexport - {\let\currentexport\empty +\unexpanded\def\dostartexport + {%\glet\dostartexport\relax + \let\currentexport\empty \clf_setupexport align {\exportparameter\c!align}% bodyfont \dimexpr\exportparameter\c!bodyfont\relax @@ -256,37 +299,35 @@ lastpage {\exportparameter\c!lastpage}% svgstyle {\exportparameter\c!svgstyle}% cssfile {\exportparameter\c!cssfile}% + file {\exportparameter\c!file}% \relax} +\unexpanded\def\dostopexport + {\glet\dostopexport\relax + \clf_finishexport} + +\appendtoks + \doinitializeexport +\to \everysetupbackend + \appendtoks - \doifsomething{\backendparameter\c!export}\dosynchronizeexport + \ifexporting + \dostartexport + \fi \to \everystarttext % better (before pdf gets closed, so we can embed), but it needs testing: \appendtoks - \clf_finishexport + \ifexporting + \dostopexport + \fi \to \everystoptext \appendtoks - \doifsomething{\backendparameter\c!export}\dosynchronizeexport % in case it is done inside \starttext + \ifexporting + \dostartexport % in case it is done inside \starttext + \fi \to \everysetupdocument -% \appendtoks -% \doifsomething{\backendparameter\c!xhtml} -% {\enabledirectives[backend.export.xhtml=\backendparameter\c!xhtml]}% -% \doifsomething{\backendparameter\c!css} -% {\enabledirectives[backend.export.css={\backendparameter\c!css}]}% -% \doifsomething{\backendparameter\c!alternative} -% {\enabledirectives[backend.export.alternative={\backendparameter\c!alternative}]}% -% \to \everysetupbackend - -\appendtoks - \doifelsenothing{\backendparameter\c!export} - {\resetsystemmode\v!export} - {\setuptagging[\c!state=\v!start]% - \enabledirectives[backend.export=\backendparameter\c!export]% - \setsystemmode\v!export}% -\to \everysetupbackend - \protect \endinput diff --git a/tex/context/base/mkiv/back-ini.mkiv b/tex/context/base/mkiv/back-ini.mkiv index 9859f026a..e810ecde5 100644 --- a/tex/context/base/mkiv/back-ini.mkiv +++ b/tex/context/base/mkiv/back-ini.mkiv @@ -16,7 +16,7 @@ \writestatus{loading}{ConTeXt Backend Macros / Initialization} -\registerctxluafile{back-ini}{1.001} +\registerctxluafile{back-ini}{} %D We currently have a curious mix between tex and lua backend %D handling but eventually most will move to lua. diff --git a/tex/context/base/mkiv/back-pdf.lua b/tex/context/base/mkiv/back-pdf.lua index a3f7ffff7..f45783e51 100644 --- a/tex/context/base/mkiv/back-pdf.lua +++ b/tex/context/base/mkiv/back-pdf.lua @@ -8,7 +8,6 @@ if not modules then modules = { } end modules ['back-pdf'] = { -- we could do \pdfmatrix sx <> sy <> etc -local tonumber = tonumber local sind, cosd = math.sind, math.cosd local insert, remove = table.insert, table.remove @@ -149,12 +148,7 @@ scanners.pdfstartmirroring = function() end if environment.arguments.nocompression then - pdf.setcompresslevel(0) - pdf.setobjcompresslevel(0) - function pdf.setcompresslevel() - -- blocked from now on - end - pdf.setobjcompresslevel = pdf.setcompresslevel + lpdf.setcompression(0,0,true) end scanners.pdfstopmirroring = scanners.pdfstartmirroring @@ -176,10 +170,7 @@ implement { implement { name = "setpdfcompression", arguments = { "integer", "integer" }, - actions = function(c,o) - pdf.setcompresslevel(c) - pdf.setobjcompresslevel(o) - end + actions = lpdf.setcompression, } local report = logs.reporter("backend","pdftex primitives") @@ -272,7 +263,7 @@ scanners.pdfdest = function() view = "xyz" if scankeyword("zoom") then report("\\pdfdest zoom is ignored") - zoom = scancount() + zoom = scancount() -- will be divided by 1000 in the backend end elseif scankeyword("fitbh") then view = "fitbh" diff --git a/tex/context/base/mkiv/back-pdf.mkiv b/tex/context/base/mkiv/back-pdf.mkiv index f59b59c29..3b0dd7852 100644 --- a/tex/context/base/mkiv/back-pdf.mkiv +++ b/tex/context/base/mkiv/back-pdf.mkiv @@ -11,34 +11,39 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. +%D The less ther ei shere, the better. + \writestatus{loading}{ConTeXt Backend Macros / PDF} -%registerctxluafile{lpdf-aux}{1.001} % common helpers -\registerctxluafile{lpdf-ini}{1.001} -\registerctxluafile{lpdf-nod}{1.001} -\registerctxluafile{lpdf-col}{1.000} -\registerctxluafile{lpdf-xmp}{1.001} -\registerctxluafile{lpdf-ano}{1.001} -\registerctxluafile{lpdf-res}{1.001} -\registerctxluafile{lpdf-mis}{1.001} -\registerctxluafile{lpdf-ren}{1.001} -\registerctxluafile{lpdf-grp}{1.001} -\registerctxluafile{lpdf-wid}{1.001} -\registerctxluafile{lpdf-fld}{1.001} -\registerctxluafile{lpdf-mov}{1.001} -\registerctxluafile{lpdf-u3d}{1.001} -\registerctxluafile{lpdf-swf}{1.001} -\registerctxluafile{lpdf-tag}{1.001} -\registerctxluafile{lpdf-fmt}{1.001} -\registerctxluafile{lpdf-epd}{1.001} -\registerctxluafile{lpdf-epa}{1.001} - -\registerctxluafile{back-pdf}{1.001} % some code will move to lpdf-* +%registerctxluafile{lpdf-aux}{optimize} % common helpers +\registerctxluafile{lpdf-ini}{optimize} +\registerctxluafile{lpdf-nod}{} +\registerctxluafile{lpdf-col}{} +\registerctxluafile{lpdf-xmp}{} +\registerctxluafile{lpdf-ano}{} +\registerctxluafile{lpdf-res}{} +\registerctxluafile{lpdf-mis}{} +\registerctxluafile{lpdf-ren}{} +\registerctxluafile{lpdf-grp}{} +\registerctxluafile{lpdf-wid}{} +\registerctxluafile{lpdf-fld}{} +\registerctxluafile{lpdf-mov}{} +\registerctxluafile{lpdf-u3d}{} % this will become a module +\registerctxluafile{lpdf-swf}{} % this will become a module +\registerctxluafile{lpdf-tag}{} +\registerctxluafile{lpdf-fmt}{} +\registerctxluafile{lpdf-epd}{} +\registerctxluafile{lpdf-epa}{} + +\registerctxluafile{back-pdf}{} % some code will move to lpdf-* + +\loadmarkfile{back-u3d} % this will become a module +\loadmarkfile{back-swf} % this will become a module \unprotect -%D We will minimize the number of calls to \PDF\ specific primitives -%D and delegate all management and injection of code to the backend. +%D We will minimize the number of calls to \PDF\ specific primitives and delegate +%D all management and injection of code to the backend. %D %D Here we initialize some internal quantities. We also protect them. @@ -68,11 +73,11 @@ \unexpanded\def\pdffontattr {\unsupportedpdfprimitive\pdffontattr} \unexpanded\def\pdfglyphtounicode{\unsupportedpdfprimitive\pdfglyphtounicode} -\unexpanded\def\pdfannot{\clf_pdfannot} -\unexpanded\def\pdfdest {\clf_pdfdest} +\unexpanded\def\pdfannot {\clf_pdfannot} +\unexpanded\def\pdfdest {\clf_pdfdest} -%D Here we do intercept (silently) what gets passed. One should use the -%D \CONTEXT\ interfaces instead. +%D Here we do intercept (silently) what gets passed. One should use the \CONTEXT\ +%D interfaces instead. \let\pdfcatalog \relax \newtoks\pdfcatalog \let\pdfinfo \relax \newtoks\pdfinfo @@ -84,8 +89,8 @@ \let\pdfxformattr \relax \newtoks\pdfxformattr \let\pdfxformresources\relax \newtoks\pdfxformresources -%D We use the \LUA\ interface (which then permits more control over -%D possible pdf/x extensions). +%D We use the \LUA\ interface (which then permits more control over possible pdf/x +%D extensions). \let\pdfcompresslevel \relax \newcount\pdfcompresslevel \let\pdfobjcompresslevel\relax \newcount\pdfobjcompresslevel @@ -104,11 +109,11 @@ %D We don't support these directives, at least not this way. If they are needed %D by third party modules we can provide some interface. -\let\pdfcreationdate \relax \newtoks \pdfcreationdate +% \pdfcreationdate \let\pdfdecimaldigits \relax \newcount\pdfdecimaldigits -\let\pdfdestmargin \relax \newcount\pdfdestmargin -\let\pdffontname \relax \newcount\pdffontname -\let\pdffontobjnum \relax \newcount\pdffontobjnum +\let\pdfdestmargin \relax \newdimen\pdfdestmargin +% \pdffontname +% \pdffontobjnum \let\pdffontsize \relax \newcount\pdffontsize \let\pdfgamma \relax \newcount\pdfgamma \let\pdfgentounicode \relax \newcount\pdfgentounicode @@ -123,26 +128,27 @@ \let\pdfinclusioncopyfonts \relax \newcount\pdfinclusioncopyfonts \let\pdfinclusionerrorlevel \relax \newcount\pdfinclusionerrorlevel \let\pdfinfoomitdate \relax \newcount\pdfinfoomitdate -\let\pdflastannot \relax \newcount\pdflastannot -\let\pdflastlink \relax \newcount\pdflastlink -\let\pdflinkmargin \relax \newcount\pdflinkmargin +% \pdflastannot +% \pdflastlink +\let\pdflinkmargin \relax \newdimen\pdflinkmargin +\let\pdfmajorversion \relax \newcount\pdfmajorversion \let\pdfminorversion \relax \newcount\pdfminorversion \let\pdfpagebox \relax \newcount\pdfpagebox -\let\pdfpageref \relax \newcount\pdfpageref +% \pdfpageref \let\pdfpkfixeddpi \relax \newcount\pdfpkfixeddpi \let\pdfpkmode \relax \newtoks \pdfpkmode \let\pdfpkresolution \relax \newcount\pdfpkresolution -\let\pdfretval \relax \newcount\pdfretval +% \pdfretval \let\pdfsuppressoptionalinfo \relax \newcount\pdfsuppressoptionalinfo \let\pdfsuppressptexinfo \relax \newcount\pdfsuppressptexinfo -\let\pdftexrevision \relax \newcount\pdftexrevision -\let\pdftexversion \relax \newcount\pdftexversion -\let\pdfthreadmargin \relax \newcount\pdfthreadmargin +% \pdftexrevision +% \pdftexversion +\let\pdfthreadmargin \relax \newdimen\pdfthreadmargin \let\pdftrailerid \relax \newtoks \pdftrailerid \let\pdfuniqueresname \relax \newcount\pdfuniqueresname \let\pdfvorigin \relax \newcount\pdfvorigin -\let\pdfxformmargin \relax \newcount\pdfxformmargin -\let\pdfxformname \relax \newcount\pdfxformname +\let\pdfxformmargin \relax \newdimen\pdfxformmargin +% \pdfxformname %D These are still accepted but are normally not needed. @@ -157,9 +163,8 @@ \let\pdfxform \saveboxresource \let\pdfximage \saveimageresource -%D For the moment we keep these as they are but they will become \LUA\ -%D calls eventually, after which we will nil the three \type {\pdf} -%D interface primitives. +%D For the moment we keep these as they are but they will become \LUA\ calls +%D eventually, after which we will nil the three \type {\pdf} interface primitives. \normalprotected\def\pdfliteral {\pdfextension literal } \normalprotected\def\pdfobj {\pdfextension obj } @@ -169,8 +174,7 @@ \normalprotected\def\pdfsave {\pdfextension save\relax} \normalprotected\def\pdfsetmatrix{\pdfextension setmatrix } -%D This one can be consulted by users although the suffix is also -%D a system mode. +%D This one can be consulted by users although the suffix is also a system mode. \back_job_set_suffix{pdf} @@ -303,8 +307,8 @@ \unexpanded\def\dostartclipping#1#2#3% we can move this to lua and only set a box here {\forcecolorhack - \PointsToBigPoints{#2}\width - \PointsToBigPoints{#3}\height + \edef\width {\tobigpoints#2}% + \edef\height{\tobigpoints#3}% \meta_grab_clip_path{#1}\width\height{% 0 0 m % \width\space 0 l % @@ -323,252 +327,221 @@ %def\TransparencyHack{\ctxlua{backends.codeinjections.addtransparencygroup()}} \def\TransparencyHack{\setupcolors[\c!pagecolormodel=\v!auto]} -% \let\lastpredefinedsymbol\empty % some day we can do more at the lua end -% -% \unexpanded\def\predefinesymbol[#1]% -% {\begingroup -% \xdef\lastpredefinedsymbol{#1}% -% \settightobject{SYM}{#1}\hbox{\symbol[#1]}% to be checked ... maybe only fitting -% \dogetobjectreference{SYM}{#1}\m_back_object_reference -% \clf_registerbackendsymbol{#1}\m_back_object_reference\relax -% \endgroup} - % Still here: %D \macros %D {back_ovalbox} %D -%D Drawing frames with round corners is inherited from the -%D main module. -%D -%D For drawing ovals we use quite raw \PDF\ code. The next -%D implementation does not differ that much from the one -%D implemented in the \POSTSCRIPT\ driver. This code is -%D somewhat obsolete as we now have metapost embedded. - -% \def\back_oval_calculate#1#2#3% -% {\PointsToBigPoints{\dimexpr#2+#3\relax}#1} +%D Drawing frames with round corners is inherited from the main module. For drawing +%D ovals we use quite raw \PDF\ code. The next implementation does not differ that +%D much from the one implemented in the \POSTSCRIPT\ driver. This code is somewhat +%D obsolete as we now have metapost embedded. \unexpanded\def\back_ovalbox#1#2#3#4#5#6#7#8% {\forcecolorhack \bgroup -% \scratchdimen#4% -% \divide\scratchdimen\plustwo -% \back_oval_calculate\xmin \zeropoint\scratchdimen -% \back_oval_calculate\xmax {#1}{-\scratchdimen}% -% \back_oval_calculate\ymax {#2}{-\scratchdimen}% -% \back_oval_calculate\ymin {-#3}\scratchdimen -% \advance\scratchdimen by #5% -% \back_oval_calculate\xxmin \zeropoint\scratchdimen -% \back_oval_calculate\xxmax {#1}{-\scratchdimen}% -% \back_oval_calculate\yymax {#2}{-\scratchdimen}% -% \back_oval_calculate\yymin {-#3}\scratchdimen -% \back_oval_calculate\stroke{#4}\zeropoint -% \back_oval_calculate\radius{#5}\zeropoint - % - \PointsToBigPoints{#4} \stroke - \PointsToBigPoints{#5} \radius + \edef\stroke{\tobigpoints\dimexpr#4\relax\space}% + \edef\radius{\tobigpoints\dimexpr#5\relax\space}% \scratchdimen\dimexpr#4/\plustwo\relax - \PointsToBigPoints \scratchdimen \xmin - \PointsToBigPoints{\dimexpr #1-\scratchdimen}\xmax - \PointsToBigPoints{\dimexpr #2-\scratchdimen}\ymax - \PointsToBigPoints{\dimexpr-#3+\scratchdimen}\ymin + \edef\xmin {\tobigpoints \scratchdimen \space}% + \edef\xmax {\tobigpoints\dimexpr #1-\scratchdimen\relax\space}% + \edef\ymax {\tobigpoints\dimexpr #2-\scratchdimen\relax\space}% + \edef\ymin {\tobigpoints\dimexpr-#3+\scratchdimen\relax\space}% \advance\scratchdimen by #5\relax - \PointsToBigPoints \scratchdimen \xxmin - \PointsToBigPoints{\dimexpr #1-\scratchdimen}\xxmax - \PointsToBigPoints{\dimexpr #2-\scratchdimen}\yymax - \PointsToBigPoints{\dimexpr-#3+\scratchdimen}\yymin + \edef\xxmin{\tobigpoints \scratchdimen \space}% + \edef\xxmax{\tobigpoints\dimexpr #1-\scratchdimen\relax\space}% + \edef\yymax{\tobigpoints\dimexpr #2-\scratchdimen\relax\space}% + \edef\yymin{\tobigpoints\dimexpr-#3+\scratchdimen\relax\space}% % \edef\dostroke{\number#6}% - \edef\dofill{\number#7}% - \edef\mode{\number#8}% - % no \ifcase, else \relax in pdfcode + \edef\dofill {\number#7}% + \scratchcounter#8\relax \setbox\scratchbox\naturalhpack {\ifnum\dostroke\dofill>\zerocount \pdfliteral {q - \stroke\space w - \ifcase\mode\space - \xxmin\space \ymin \space m - \xxmax\space \ymin \space l - \xmax \space \ymin \space \xmax \space \yymin\space y - \xmax \space \yymax\space l - \xmax \space \ymax \space \xxmax\space \ymax \space y - \xxmin\space \ymax \space l - \xmin \space \ymax \space \xmin \space \yymax\space y - \xmin \space \yymin\space l - \xmin \space \ymin \space \xxmin\space \ymin \space y + \stroke w + \ifcase\scratchcounter + \xxmin \ymin m + \xxmax \ymin l + \xmax \ymin \xmax \yymin y + \xmax \yymax l + \xmax \ymax \xxmax \ymax y + \xxmin \ymax l + \xmin \ymax \xmin \yymax y + \xmin \yymin l + \xmin \ymin \xxmin \ymin y h \or % 1 - \xxmin\space \ymin \space m - \xxmax\space \ymin \space l - \xmax \space \ymin \space \xmax \space \yymin\space y - \xmax \space \ymax \space l - \xmin \space \ymax \space l - \xmin \space \yymin\space l - \xmin \space \ymin \space \xxmin\space \ymin \space y + \xxmin \ymin m + \xxmax \ymin l + \xmax \ymin \xmax \yymin y + \xmax \ymax l + \xmin \ymax l + \xmin \yymin l + \xmin \ymin \xxmin \ymin y h \or % 2 - \xxmin\space \ymin \space m - \xmax \space \ymin \space l - \xmax \space \ymax \space l - \xxmin\space \ymax \space l - \xmin \space \ymax \space \xmin \space \yymax\space y - \xmin \space \yymin\space l - \xmin \space \ymin \space \xxmin\space \ymin \space y + \xxmin \ymin m + \xmax \ymin l + \xmax \ymax l + \xxmin \ymax l + \xmin \ymax \xmin \yymax y + \xmin \yymin l + \xmin \ymin \xxmin \ymin y h \or % 3 - \xmin \space \ymin \space m - \xmax \space \ymin \space l - \xmax \space \yymax\space l - \xmax \space \ymax \space \xxmax\space \ymax \space y - \xxmin\space \ymax \space l - \xmin \space \ymax \space \xmin \space \yymax\space y - \xmin \space \ymin \space l + \xmin \ymin m + \xmax \ymin l + \xmax \yymax l + \xmax \ymax \xxmax \ymax y + \xxmin \ymax l + \xmin \ymax \xmin \yymax y + \xmin \ymin l h \or % 4 - \xmin \space \ymin \space m - \xxmax\space \ymin \space l - \xmax \space \ymin \space \xmax \space \yymin\space y - \xmax \space \yymax\space l - \xmax \space \ymax \space \xxmax\space \ymax \space y - \xmin \space \ymax \space l - \xmin \space \ymin\space l + \xmin \ymin m + \xxmax \ymin l + \xmax \ymin \xmax \yymin y + \xmax \yymax l + \xmax \ymax \xxmax \ymax y + \xmin \ymax l + \xmin \ymin l h \or % 5 - \xmin \space \ymin \space m - \xmax \space \ymin \space l - \xmax \space \yymax\space l - \xmax \space \ymax \space \xxmax\space \ymax \space y - \xmin \space \ymax \space l - \xmin \space \ymin \space l + \xmin \ymin m + \xmax \ymin l + \xmax \yymax l + \xmax \ymax \xxmax \ymax y + \xmin \ymax l + \xmin \ymin l h \or % 6 - \xmin \space \ymin \space m - \xxmax\space \ymin \space l - \xmax \space \ymin \space \xmax \space \yymin\space y - \xmax \space \ymax \space l - \xmin \space \ymax \space l - \xmin \space \ymin \space l + \xmin \ymin m + \xxmax \ymin l + \xmax \ymin \xmax \yymin y + \xmax \ymax l + \xmin \ymax l + \xmin \ymin l h - \or - \xxmin\space \ymin \space m - \xmax \space \ymin \space l - \xmax \space \ymax \space l - \xmin \space \ymax \space l - \xmin \space \yymin\space l - \xmin \space \ymin \space \xxmin\space \ymin \space y + \or % 7 + \xxmin \ymin m + \xmax \ymin l + \xmax \ymax l + \xmin \ymax l + \xmin \yymin l + \xmin \ymin \xxmin \ymin y h - \or - \xmin \space \ymin \space m - \xmax \space \ymin \space l - \xmax \space \ymax \space l - \xxmin\space \ymax \space l - \xmin \space \ymax \space \xmin \space \yymax\space y - \xmin \space \ymin \space l + \or % 8 + \xmin \ymin m + \xmax \ymin l + \xmax \ymax l + \xxmin \ymax l + \xmin \ymax \xmin \yymax y + \xmin \ymin l h \or % 9 top open - \xmin \space \ymax \space m - \xmin \space \yymin\space l - \xmin \space \ymin \space \xxmin\space \ymin \space y - \xxmax\space \ymin \space l - \xmax \space \ymin \space \xmax \space \yymin\space y - \xmax \space \ymax \space l + \xmin \ymax m + \xmin \yymin l + \xmin \ymin \xxmin \ymin y + \xxmax \ymin l + \xmax \ymin \xmax \yymin y + \xmax \ymax l \or % 10 right open - \xmax \space \ymax \space m - \xxmin\space \ymax \space l - \xmin \space \ymax \space \xmin \space \yymax\space y - \xmin \space \yymin\space l - \xmin \space \ymin \space \xxmin\space \ymin \space y - \xmax\space \ymin \space l + \xmax \ymax m + \xxmin \ymax l + \xmin \ymax \xmin \yymax y + \xmin \yymin l + \xmin \ymin \xxmin \ymin y + \xmax \ymin l \or % 11 bottom open - \xmax \space \ymin \space m - \xmax \space \yymax\space l - \xmax \space \ymax \space \xxmax \space \ymax\space y - \xxmin\space \ymax \space l - \xmin \space \ymax \space \xmin \space \yymax\space y - \xmin \space \ymin \space l + \xmax \ymin m + \xmax \yymax l + \xmax \ymax \xxmax \ymax y + \xxmin \ymax l + \xmin \ymax \xmin \yymax y + \xmin \ymin l \or % 12 left open - \xmin \space \ymax \space m - \xxmax\space \ymax \space l - \xmax \space \ymax \space \xmax \space \yymax\space y - \xmax \space \yymin\space l - \xmax \space \ymin \space \xxmax\space \ymin \space y - \xmin \space \ymin \space l + \xmin \ymax m + \xxmax \ymax l + \xmax \ymax \xmax \yymax y + \xmax \yymin l + \xmax \ymin \xxmax \ymin y + \xmin \ymin l \or % 13 - \xmin \space \ymax \space m - \xxmax\space \ymax \space l - \xmax \space \ymax \space \xmax \space \yymax\space y - \xmax\space \ymin \space l + \xmin \ymax m + \xxmax \ymax l + \xmax \ymax \xmax \yymax y + \xmax \ymin l \or % 14 - \xmax \space \ymax \space m - \xmax \space \yymin\space l - \xmax \space \ymin \space \xxmax\space \ymin \space y - \xmin \space \ymin \space l + \xmax \ymax m + \xmax \yymin l + \xmax \ymin \xxmax \ymin y + \xmin \ymin l \or % 15 - \xmax \space \ymin \space m - \xxmin\space \ymin \space l - \xmin \space \ymin \space \xmin \space \yymin\space y - \xmin \space \ymax \space l + \xmax \ymin m + \xxmin \ymin l + \xmin \ymin \xmin \yymin y + \xmin \ymax l \or % 16 - \xmin \space \ymin \space m - \xmin \space \yymax\space l - \xmin \space \ymax \space \xxmin\space \ymax \space y - \xmax \space \ymax \space l + \xmin \ymin m + \xmin \yymax l + \xmin \ymax \xxmin \ymax y + \xmax \ymax l \or % 17 - \xxmax\space \ymax \space m - \xmax \space \ymax \space \xmax \space \yymax\space y + \xxmax \ymax m + \xmax \ymax \xmax \yymax y \or % 18 - \xmax \space \yymin\space m - \xmax \space \ymin \space \xxmax\space \ymin \space y + \xmax \yymin m + \xmax \ymin \xxmax \ymin y \or % 19 - \xxmin\space \ymin \space m - \xmin \space \ymin \space \xmin \space \yymin\space y + \xxmin \ymin m + \xmin \ymin \xmin \yymin y \or % 20 - \xmin \space \yymax\space m - \xmin \space \ymax \space \xxmin\space \ymax \space y + \xmin \yymax m + \xmin \ymax \xxmin \ymax y \or % 21 - \xxmax\space \ymax \space m - \xmax \space \ymax \space \xmax \space \yymax\space y - \xmin \space \yymax\space m - \xmin \space \ymax \space \xxmin\space \ymax \space y + \xxmax \ymax m + \xmax \ymax \xmax \yymax y + \xmin \yymax m + \xmin \ymax \xxmin \ymax y \or % 22 - \xxmax\space \ymax \space m - \xmax \space \ymax \space \xmax \space \yymax\space y - \xmax \space \yymin\space m - \xmax \space \ymin \space \xxmax\space \ymin \space y + \xxmax \ymax m + \xmax \ymax \xmax \yymax y + \xmax \yymin m + \xmax \ymin \xxmax \ymin y \or % 23 - \xmax \space \yymin\space m - \xmax \space \ymin \space \xxmax\space \ymin \space y - \xxmin\space \ymin \space m - \xmin \space \ymin \space \xmin \space \yymin\space y + \xmax \yymin m + \xmax \ymin \xxmax \ymin y + \xxmin \ymin m + \xmin \ymin \xmin \yymin y \or % 24 - \xxmin\space \ymin \space m - \xmin \space \ymin \space \xmin \space \yymin\space y - \xmin \space \yymax\space m - \xmin \space \ymax \space \xxmin\space \ymax \space y + \xxmin \ymin m + \xmin \ymin \xmin \yymin y + \xmin \yymax m + \xmin \ymax \xxmin \ymax y \or % 25 - \xxmax\space \ymax \space m - \xmax \space \ymax \space \xmax \space \yymax\space y - \xmax \space \yymin\space m - \xmax \space \ymin \space \xxmax\space \ymin \space y - \xxmin\space \ymin \space m - \xmin \space \ymin \space \xmin \space \yymin\space y - \xmin \space \yymax\space m - \xmin \space \ymax \space \xxmin\space \ymax \space y + \xxmax \ymax m + \xmax \ymax \xmax \yymax y + \xmax \yymin m + \xmax \ymin \xxmax \ymin y + \xxmin \ymin m + \xmin \ymin \xmin \yymin y + \xmin \yymax m + \xmin \ymax \xxmin \ymax y \or % 26 - \xmax \space \yymin\space m - \xmax \space \ymin \space \xxmax\space \ymin \space y - \xmin \space \yymax\space m - \xmin \space \ymax \space \xxmin\space \ymax \space y + \xmax \yymin m + \xmax \ymin \xxmax \ymin y + \xmin \yymax m + \xmin \ymax \xxmin \ymax y \or % 27 - \xxmax\space \ymax \space m - \xmax \space \ymax \space \xmax \space \yymax\space y - \xxmin\space \ymin \space m - \xmin \space \ymin \space \xmin \space \yymin\space y + \xxmax \ymax m + \xmax \ymax \xmax \yymax y + \xxmin \ymin m + \xmin \ymin \xmin \yymin y \or % 28 \fi - \ifnum\mode>\pluseight\space + \ifnum\scratchcounter>\pluseight S \else \ifnum\dostroke=\plusone S \fi @@ -594,14 +567,3 @@ % \stoptext \protect \endinput - -% \chapter{FIRST} -% -% \goto{bar}[bar] -% -% HERE \pdfannot width 20pt height 20pt depth 20pt {/Subtype /Link /Dest (bar) /Border [1 1 1] /F 4}\par -% HERE \pdfannot width 20pt height 20pt depth 20pt {/Subtype /Link /Dest (foo) /Border [1 1 1] /F 4}\par -% -% \chapter[bar]{SECOND} -% -% THERE \pdfdest name {foo} \par diff --git a/tex/context/base/mkiv/back-swf.mkiv b/tex/context/base/mkiv/back-swf.mkiv index 09745e0f9..0a53a8fd2 100644 --- a/tex/context/base/mkiv/back-swf.mkiv +++ b/tex/context/base/mkiv/back-swf.mkiv @@ -41,7 +41,145 @@ %D \stopTEXpage %D \stoptyping -\endinput +%D Embedding (and using) movies used to be a breeze in acrobat but depended +%D on a plugin. Then we got renditions that depended on the built-in flash +%D player. And now we have rich media, depending on whatever and being able +%D to use the flash player as well ... but it's an erratic and soon obsolete +%D adventure. So \unknown\ we do provide the user the means but stay away +%D from it ourselves: it's a dead end. The following tricks use the already +%D present shockwave (flash) trickery. +%D +%D At some point we will no longer provide this in the core but load it at +%D runtime. +%D +%D \starttyping +%D \externalfigure +%D [shockwave] +%D [file=test.mp4, +%D label=foo] +%D +%D \goto{START} [JS(StartShockwave{foo})] +%D \goto{REWIND}[JS(RewindShockwave{foo})] +%D \goto{PAUSE} [JS(PauseShockwave{foo})] +%D \goto{STOP} [JS(StopShockwave{foo})] +%D +%D \useexternalrendering[foo][application/x-shockwave-flash][test.swf][embed=yes,width=100pt,height=100pt] +%D \definerenderingwindow[foo][width=100pt,height=100pt] +%D +%D \placerenderingwindow[foo][foo] +%D +%D \goto{START}[StartRendering{foo}] +%D \goto{STOP} [StopRendering{foo}] +%D \goto{PAUSE}[PauseRendering{foo}] +%D +%D % \useexternalrendering[foo][audio/mpeg][t:/sources/akkerman.mp3][embed=yes] +%D % \definerenderingwindow[foo][width=0pt,height=0pt] +%D % % \placerenderingwindow[foo][foo] +%D % \setupbackgrounds[page][background=resources] +%D % \setlayer[resources]{\placerenderingwindow[foo][foo]} +%D % \goto{START}[StartRendering{foo}] +%D % \goto{STOP} [StopRendering{foo}] +%D % \goto{PAUSE}[PauseRendering{foo}] +%D \stoptyping + +\unprotect + +\startluaparameterset[shockwave:display] + toolbar = true, + -- preview = "somefile", + open = "click", + close = "focus", +\stopluaparameterset + +% using vplayer9.swf from ctan: + +\useexternalfigure + [shockwave] + [vplayer9.swf] +% [arguments=\luaparameterset{shockwave:arguments}{src="\externalfigureparameter\v!file",source="\externalfigureparameter\v!file"}, + [\c!arguments=\luaparameterset{shockwave:arguments}{source="\externalfigureparameter\v!file",autoPlay=true}, + \c!resources=\luaparameterset{shockwave:resources}{files={"\externalfigureparameter\v!file"}}, + \c!display=shockwave:display] + +\startJSpreamble shockwave used now + function StartShockwave(label) { + var rm = this.getAnnotsRichMedia(this.pageNum,label)[0] ; + if (rm.activated) { + // ok + } else { + rm.activated = true ; + } + rm.callAS("rewind") ; + rm.callAS("playPause") ; + } + function StopShockwave(label) { + var rm = this.getAnnotsRichMedia(this.pageNum,label)[0] ; + if (rm.activated) { + rm.callAS("pause") ; + rm.callAS("rewind") ; + } + } + function RewindShockwave(label) { + var rm = this.getAnnotsRichMedia(this.pageNum,label)[0] ; + if (rm.activated) { + rm.callAS("rewind") ; + } + } + function PauseShockwave(label) { + var rm = this.getAnnotsRichMedia(this.pageNum,label)[0] ; + if (rm.activated) { + rm.callAS("playPause") ; + } + } +\stopJSpreamble + +% using videoplayer.swf from adobe or strobemediaplayback.swf from sourceforge: + +%\useexternalfigure +% [shockwave] +% [videoplayer.swf] +% [\c!arguments=\luaparameterset{shockwave:arguments}{source="\externalfigureparameter\v!file"}, +% \c!resources=\luaparameterset{shockwave:resources}{files={"\externalfigureparameter\v!file"}}, +% \c!display=shockwave:display] + +\startJSpreamble shockwave used now + function StartShockwave(label) { + var rm = this.getAnnotsRichMedia(this.pageNum,label)[0] ; + if (rm.activated) { + rm.callAS("multimedia_play") ; + } else { + rm.activated = true ; + } + } + function StopShockwave(label) { + var rm = this.getAnnotsRichMedia(this.pageNum,label)[0] ; + if (rm.activated) { + rm.callAS("multimedia_pause") ; + rm.callAS("multimedia_rewind") ; + } + } + function RewindShockwave(label) { + var rm = this.getAnnotsRichMedia(this.pageNum,label)[0] ; + if (rm.activated) { + rm.callAS("multimedia_rewind") ; + } + } + function PauseShockwave(label) { + var rm = this.getAnnotsRichMedia(this.pageNum,label)[0] ; + if (rm.activated) { + rm.callAS("multimedia_pause") ; + } + } +\stopJSpreamble + +% \useexternalfigure +% [shockwave] +% [strobemediaplayback.swf] +% [arguments=\luaparameterset{shockwave:arguments}{src="\externalfigureparameter\v!file"}, +% resources=\luaparameterset{shockwave:resources}{files={"\externalfigureparameter\v!file"}}, +% display=shockwave:display] + +\protect \endinput \starttext diff --git a/tex/context/base/mkiv/bibl-bib.mkiv b/tex/context/base/mkiv/bibl-bib.mkiv index f5d911ea7..784c87a02 100644 --- a/tex/context/base/mkiv/bibl-bib.mkiv +++ b/tex/context/base/mkiv/bibl-bib.mkiv @@ -13,7 +13,7 @@ \writestatus{loading}{ConTeXt Bibliography Support / Experimental BibTeX} -\registerctxluafile{bibl-bib}{1.001} +\registerctxluafile{bibl-bib}{} \unprotect diff --git a/tex/context/base/mkiv/bibl-tra.mkiv b/tex/context/base/mkiv/bibl-tra.mkiv index 93f84872a..3ff07ead5 100644 --- a/tex/context/base/mkiv/bibl-tra.mkiv +++ b/tex/context/base/mkiv/bibl-tra.mkiv @@ -34,7 +34,7 @@ \definefilesynonym[bib][obsolete] -\registerctxluafile{bibl-tra}{1.001} +\registerctxluafile{bibl-tra}{} %D The original was developed independantly by Taco Hoekwater while still working for Kluwer %D Academic publishers (it still used the dutch interface then). Development continued after diff --git a/tex/context/base/mkiv/blob-ini.mkiv b/tex/context/base/mkiv/blob-ini.mkiv index 64582c0db..3cee3ff2f 100644 --- a/tex/context/base/mkiv/blob-ini.mkiv +++ b/tex/context/base/mkiv/blob-ini.mkiv @@ -18,8 +18,8 @@ %D down the road (close to version 1.00 of \LUATEX). Typesetting in %D pure \LUA\ sometimes makes sense. -\registerctxluafile{node-typ}{1.001} % experimental -\registerctxluafile{blob-ini}{1.001} +\registerctxluafile{node-typ}{} % experimental +\registerctxluafile{blob-ini}{} %D For the moment here: diff --git a/tex/context/base/mkiv/buff-imp-default.mkiv b/tex/context/base/mkiv/buff-imp-default.mkiv index 5cff34c70..a4ad788bb 100644 --- a/tex/context/base/mkiv/buff-imp-default.mkiv +++ b/tex/context/base/mkiv/buff-imp-default.mkiv @@ -11,7 +11,7 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\registerctxluafile{buff-imp-default.lua}{1.001} +\registerctxluafile{buff-imp-default}{} \unprotect diff --git a/tex/context/base/mkiv/buff-imp-escaped.mkiv b/tex/context/base/mkiv/buff-imp-escaped.mkiv index 13850475a..bbd8b7bac 100644 --- a/tex/context/base/mkiv/buff-imp-escaped.mkiv +++ b/tex/context/base/mkiv/buff-imp-escaped.mkiv @@ -11,7 +11,7 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\registerctxluafile{buff-imp-escaped.lua}{1.001} +\registerctxluafile{buff-imp-escaped}{} \unprotect diff --git a/tex/context/base/mkiv/buff-imp-lua.lua b/tex/context/base/mkiv/buff-imp-lua.lua index e873a34d1..b4e9342ed 100644 --- a/tex/context/base/mkiv/buff-imp-lua.lua +++ b/tex/context/base/mkiv/buff-imp-lua.lua @@ -9,7 +9,7 @@ if not modules then modules = { } end modules ['buff-imp-lua'] = { -- borrowed from ctx scite lexers -- add goto/label scanning -- --- depricated: +-- deprecated: -- -- gcinfo unpack getfenv setfenv loadlib -- table.maxn table.getn table.setn @@ -82,6 +82,7 @@ local LuaSnippetQuote = verbatim.LuaSnippetQuote local LuaSnippetString = verbatim.LuaSnippetString local LuaSnippetSpecial = verbatim.LuaSnippetSpecial local LuaSnippetComment = verbatim.LuaSnippetComment +local LuaSnippetCommentText = verbatim.LuaSnippetCommentText local LuaSnippetNameCore = verbatim.LuaSnippetNameCore local LuaSnippetNameBase = verbatim.LuaSnippetNameBase local LuaSnippetNameLibraries = verbatim.LuaSnippetNameLibraries @@ -127,6 +128,7 @@ local handler = visualizers.newhandler { boundary = function(s) LuaSnippetBoundary(s) end, special = function(s) LuaSnippetSpecial(s) end, comment = function(s) LuaSnippetComment(s) end, + commenttext = function(s) LuaSnippetCommentText(s) end, quote = function(s) LuaSnippetQuote(s) end, string = function(s) LuaSnippetString(s) end, period = function(s) verbatim(s) end, @@ -135,7 +137,12 @@ local handler = visualizers.newhandler { name_c = visualizename_c, } -local comment = P("--") +----- comment = P("--") +local comment = P("--") * (patterns.anything - patterns.newline)^0 +local comment_lb = P("--[[") +local comment_le = P("--]]") +local comment_lt = patterns.utf8char - comment_le - patterns.newline + local name = (patterns.letter + patterns.underscore) * (patterns.letter + patterns.underscore + patterns.digit)^0 local boundary = S('()[]{}') @@ -168,11 +175,12 @@ local grammar = visualizers.newgrammar("default", { "visualizer", longstring = longstring / long, comment = - makepattern(handler,"comment",comment) - * (V("space") + V("content"))^0, - longcomment = - makepattern(handler,"comment",comment) - * longstring / long, + makepattern(handler, "comment", comment_lb) + * ( makepattern(handler, "commenttext", comment_lt) + + V("whitespace") + )^0 + * makepattern(handler, "comment", comment_le) + + makepattern(handler,"comment",comment), name = makepattern(handler,"name_a",name) * ( V("optionalwhitespace") @@ -187,8 +195,7 @@ local grammar = visualizers.newgrammar("default", { "visualizer", )^0, pattern = - V("longcomment") - + V("comment") + V("comment") + V("longstring") + V("dstring") + V("sstring") diff --git a/tex/context/base/mkiv/buff-imp-lua.mkiv b/tex/context/base/mkiv/buff-imp-lua.mkiv index dc601bd7b..9d1f459ab 100644 --- a/tex/context/base/mkiv/buff-imp-lua.mkiv +++ b/tex/context/base/mkiv/buff-imp-lua.mkiv @@ -11,7 +11,7 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\registerctxluafile{buff-imp-lua.lua}{1.001} +\registerctxluafile{buff-imp-lua}{} \unprotect @@ -62,6 +62,10 @@ [\c!color=darkyellow, \c!style=boldface] +\definestartstop + [LuaSnippetCommentText] + [\c!color=darkyellow] + \definetyping [LUA] [\c!option=lua] diff --git a/tex/context/base/mkiv/buff-imp-mp.lua b/tex/context/base/mkiv/buff-imp-mp.lua index bcd18dd47..daf8187ae 100644 --- a/tex/context/base/mkiv/buff-imp-mp.lua +++ b/tex/context/base/mkiv/buff-imp-mp.lua @@ -36,6 +36,7 @@ local MetapostSnippetConstructor = verbatim.MetapostSnippetConstructor local MetapostSnippetBoundary = verbatim.MetapostSnippetBoundary local MetapostSnippetSpecial = verbatim.MetapostSnippetSpecial local MetapostSnippetComment = verbatim.MetapostSnippetComment +local MetapostSnippetCommentText = verbatim.MetapostSnippetCommentText local MetapostSnippetQuote = verbatim.MetapostSnippetQuote local MetapostSnippetString = verbatim.MetapostSnippetString local MetapostSnippetNamePrimitive = verbatim.MetapostSnippetNamePrimitive @@ -80,12 +81,13 @@ local handler = visualizers.newhandler { boundary = function(s) MetapostSnippetBoundary(s) end, special = function(s) MetapostSnippetSpecial(s) end, comment = function(s) MetapostSnippetComment(s) end, + commenttext = function(s) MetapostSnippetCommentText(s) end, string = function(s) MetapostSnippetString(s) end, quote = function(s) MetapostSnippetQuote(s) end, name = visualizename, } -local comment = S("%") +local comment = P("%") local name = (patterns.letter + S("_"))^1 local constructor = S("$@#") local boundary = S('()[]:=<>;"') @@ -94,7 +96,7 @@ local special = S("-+/*|`!?^&%.,") local grammar = visualizers.newgrammar("default", { "visualizer", comment = makepattern(handler,"comment",comment) - * (V("space") + V("content"))^0, + * makepattern(handler,"commenttext",(patterns.anything - patterns.newline)^0), dstring = makepattern(handler,"quote",patterns.dquote) * makepattern(handler,"string",patterns.nodquote) * makepattern(handler,"quote",patterns.dquote), diff --git a/tex/context/base/mkiv/buff-imp-mp.mkiv b/tex/context/base/mkiv/buff-imp-mp.mkiv index a40eb6c30..d535dad54 100644 --- a/tex/context/base/mkiv/buff-imp-mp.mkiv +++ b/tex/context/base/mkiv/buff-imp-mp.mkiv @@ -11,7 +11,7 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\registerctxluafile{buff-imp-mp.lua}{1.001} +\registerctxluafile{buff-imp-mp}{} \unprotect @@ -69,6 +69,10 @@ [\c!color=darkyellow, \c!style=boldface] +\definestartstop + [MetapostSnippetCommentText] + [\c!color=darkyellow] + \definetyping [MP] [\c!option=mp] diff --git a/tex/context/base/mkiv/buff-imp-nested.mkiv b/tex/context/base/mkiv/buff-imp-nested.mkiv index 7815086db..f6a25b5f8 100644 --- a/tex/context/base/mkiv/buff-imp-nested.mkiv +++ b/tex/context/base/mkiv/buff-imp-nested.mkiv @@ -11,7 +11,7 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\registerctxluafile{buff-imp-nested.lua}{1.001} +\registerctxluafile{buff-imp-nested}{} \unprotect diff --git a/tex/context/base/mkiv/buff-imp-parsed-xml.lua b/tex/context/base/mkiv/buff-imp-parsed-xml.lua index b18fb65aa..b098a4989 100644 --- a/tex/context/base/mkiv/buff-imp-parsed-xml.lua +++ b/tex/context/base/mkiv/buff-imp-parsed-xml.lua @@ -6,6 +6,7 @@ if not modules then modules = { } end modules ['buff-imp-parsed-xml'] = { license = "see context related readme files" } +local next = next local format = string.format local context = context diff --git a/tex/context/base/mkiv/buff-imp-parsed-xml.mkiv b/tex/context/base/mkiv/buff-imp-parsed-xml.mkiv index bd348a67d..29e42d083 100644 --- a/tex/context/base/mkiv/buff-imp-parsed-xml.mkiv +++ b/tex/context/base/mkiv/buff-imp-parsed-xml.mkiv @@ -13,7 +13,7 @@ % todo: color specific elements -\registerctxluafile{buff-imp-parsed-xml.lua}{1.001} +\registerctxluafile{buff-imp-parsed-xml}{} \unprotect diff --git a/tex/context/base/mkiv/buff-imp-tex.lua b/tex/context/base/mkiv/buff-imp-tex.lua index 097dff212..606c31d36 100644 --- a/tex/context/base/mkiv/buff-imp-tex.lua +++ b/tex/context/base/mkiv/buff-imp-tex.lua @@ -10,21 +10,22 @@ if not modules then modules = { } end modules ['buff-imp-tex'] = { local P, S, V, patterns = lpeg.P, lpeg.S, lpeg.V, lpeg.patterns -local context = context -local verbatim = context.verbatim -local makepattern = visualizers.makepattern -local makenested = visualizers.makenested -local getvisualizer = visualizers.getvisualizer - -local TexSnippet = context.TexSnippet -local startTexSnippet = context.startTexSnippet -local stopTexSnippet = context.stopTexSnippet - -local TexSnippetName = verbatim.TexSnippetName -local TexSnippetGroup = verbatim.TexSnippetGroup -local TexSnippetBoundary = verbatim.TexSnippetBoundary -local TexSnippetSpecial = verbatim.TexSnippetSpecial -local TexSnippetComment = verbatim.TexSnippetComment +local context = context +local verbatim = context.verbatim +local makepattern = visualizers.makepattern +local makenested = visualizers.makenested +local getvisualizer = visualizers.getvisualizer + +local TexSnippet = context.TexSnippet +local startTexSnippet = context.startTexSnippet +local stopTexSnippet = context.stopTexSnippet + +local TexSnippetName = verbatim.TexSnippetName +local TexSnippetGroup = verbatim.TexSnippetGroup +local TexSnippetBoundary = verbatim.TexSnippetBoundary +local TexSnippetSpecial = verbatim.TexSnippetSpecial +local TexSnippetComment = verbatim.TexSnippetComment +local TexSnippetCommentText = verbatim.TexSnippetCommentText local handler = visualizers.newhandler { startinline = function() TexSnippet(false,"{") end, @@ -36,19 +37,20 @@ local handler = visualizers.newhandler { boundary = function(s) TexSnippetBoundary(s) end, special = function(s) TexSnippetSpecial(s) end, comment = function(s) TexSnippetComment(s) end, + commenttext = function(s) TexSnippetCommentText(s) end, } -- todo: unicode letters in control sequences (slow as we need to test the nature) local comment = S("%") -local name = P("\\") * (patterns.letter + S("@!?_"))^1 +local name = P("\\") * (patterns.letter + S("@!?_") + patterns.utf8two + patterns.utf8three + patterns.utf8four)^1 local escape = P("\\") * (patterns.anything - patterns.newline)^-1 -- else we get \n local group = S("${}") local boundary = S('[]()<>#="') local special = S("/^_-&+'`|") local p_comment = makepattern(handler,"comment",comment) - * (V("space") + V("content"))^0 + * makepattern(handler,"commenttext",(patterns.anything - patterns.newline)^0) local p_name = makepattern(handler,"name",name) local p_escape = makepattern(handler,"name",escape) local p_group = makepattern(handler,"group",group) diff --git a/tex/context/base/mkiv/buff-imp-tex.mkiv b/tex/context/base/mkiv/buff-imp-tex.mkiv index c582523d5..c4b3df735 100644 --- a/tex/context/base/mkiv/buff-imp-tex.mkiv +++ b/tex/context/base/mkiv/buff-imp-tex.mkiv @@ -11,7 +11,7 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\registerctxluafile{buff-imp-tex.lua}{1.001} +\registerctxluafile{buff-imp-tex}{} \unprotect @@ -44,6 +44,10 @@ [\c!color=darkyellow, \c!style=boldface] +\definestartstop + [TexSnippetCommentText] + [\c!color=darkyellow] + \definetyping [TEX] [\c!option=tex] diff --git a/tex/context/base/mkiv/buff-imp-xml.mkiv b/tex/context/base/mkiv/buff-imp-xml.mkiv index f880ab882..0e3c251eb 100644 --- a/tex/context/base/mkiv/buff-imp-xml.mkiv +++ b/tex/context/base/mkiv/buff-imp-xml.mkiv @@ -11,7 +11,7 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\registerctxluafile{buff-imp-xml.lua}{1.001} +\registerctxluafile{buff-imp-xml}{} \unprotect diff --git a/tex/context/base/mkiv/buff-ini.lua b/tex/context/base/mkiv/buff-ini.lua index fd5b047af..2bbec2e4a 100644 --- a/tex/context/base/mkiv/buff-ini.lua +++ b/tex/context/base/mkiv/buff-ini.lua @@ -68,6 +68,13 @@ local txtcatcodes = catcodenumbers.txtcatcodes local setdata = job.datasets.setdata local getdata = job.datasets.getdata +local ctx_viafile = context.viafile +local ctx_getbuffer = context.getbuffer +local ctx_pushcatcodetable = context.pushcatcodetable +local ctx_popcatcodetable = context.popcatcodetable +local ctx_setcatcodetable = context.setcatcodetable +local ctx_printlines = context.printlines + buffers = buffers or { } local buffers = buffers @@ -209,21 +216,21 @@ implement { arguments = "string" } -local anything = patterns.anything -local alwaysmatched = patterns.alwaysmatched -local utf8character = patterns.utf8character - -local function countnesting(b,e) - local n - local g = P(b) / function() n = n + 1 end - + P(e) / function() n = n - 1 end - -- + anything - + utf8character - local p = alwaysmatched / function() n = 0 end - * g^0 - * alwaysmatched / function() return n end - return p -end +-- local anything = patterns.anything +-- local alwaysmatched = patterns.alwaysmatched +-- local utf8character = patterns.utf8character +-- +-- local function countnesting(b,e) +-- local n +-- local g = P(b) / function() n = n + 1 end +-- + P(e) / function() n = n - 1 end +-- -- + anything +-- + utf8character +-- local p = alwaysmatched / function() n = 0 end +-- * g^0 +-- * alwaysmatched / function() return n end +-- return p +-- end local counters = { } local nesting = 0 @@ -286,7 +293,7 @@ local getmargin = (emptyline + normalline)^1 local function undent(str) -- new version, needs testing: todo: not always needed, like in xtables nofspaces = #str local margin = lpegmatch(getmargin,str) - if nofspaces == #str or nofspaces ==0 then + if nofspaces == #str or nofspaces == 0 then return str end local stripper = strippers[nofspaces] @@ -609,30 +616,32 @@ local function runbuffer(name,encapsulate,runnername,suffixes) return resultname -- first result end +local f_getbuffer = formatters["buffer.%s"] + local function getbuffer(name) local str = getcontent(name) if str ~= "" then -- characters.showstring(str) - context.viafile(str,formatters["buffer.%s"](validstring(name,"noname"))) + ctx_viafile(str,f_getbuffer(validstring(name,"noname"))) end end local function getbuffermkvi(name) -- rather direct ! - context.viafile(resolvers.macros.preprocessed(getcontent(name)),formatters["buffer.%s.mkiv"](validstring(name,"noname"))) + ctx_viafile(resolvers.macros.preprocessed(getcontent(name)),formatters["buffer.%s.mkiv"](validstring(name,"noname"))) end local function gettexbuffer(name) local buffer = name and cache[name] if buffer and buffer.data ~= "" then - context.pushcatcodetable() + ctx_pushcatcodetable() if buffer.catcodes == txtcatcodes then - context.setcatcodetable(txtcatcodes) + ctx_setcatcodetable(txtcatcodes) else - context.setcatcodetable(ctxcatcodes) + ctx_setcatcodetable(ctxcatcodes) end - -- context(function() context.viafile(buffer.data) end) - context.getbuffer { name } -- viafile flushes too soon - context.popcatcodetable() + -- context(function() ctx_viafile(buffer.data) end) + ctx_getbuffer { name } -- viafile flushes too soon + ctx_popcatcodetable() end end @@ -643,6 +652,12 @@ implement { name = "getbuffer", actions = getbuffer, arguments = "stri implement { name = "getbuffermkvi", actions = getbuffermkvi, arguments = "string" } implement { name = "gettexbuffer", actions = gettexbuffer, arguments = "string" } +interfaces.implement { + name = "getbuffercontent", + arguments = "string", + actions = { getcontent, context }, +} + implement { name = "typesetbuffer", actions = { runbuffer, context }, @@ -667,29 +682,29 @@ implement { implement { name = "feedback", -- bad name, maybe rename to injectbuffercontent - actions = { collectcontent, context.printlines }, + actions = { collectcontent, ctx_printlines }, arguments = "string" } do - local context = context - local ctxcore = context.core + local context = context + local ctxcore = context.core - local startbuffer = ctxcore.startbuffer - local stopbuffer = ctxcore.stopbuffer + local ctx_startbuffer = ctxcore.startbuffer + local ctx_stopbuffer = ctxcore.stopbuffer - local startcollecting = context.startcollecting - local stopcollecting = context.stopcollecting + local ctx_startcollecting = context.startcollecting + local ctx_stopcollecting = context.stopcollecting function ctxcore.startbuffer(...) - startcollecting() - startbuffer(...) + ctx_startcollecting() + ctx_startbuffer(...) end function ctxcore.stopbuffer() - stopbuffer() - stopcollecting() + ctx_stopbuffer() + ctx_stopcollecting() end end diff --git a/tex/context/base/mkiv/buff-ini.mkiv b/tex/context/base/mkiv/buff-ini.mkiv index 7cc6cdbd4..1a5ce4591 100644 --- a/tex/context/base/mkiv/buff-ini.mkiv +++ b/tex/context/base/mkiv/buff-ini.mkiv @@ -13,7 +13,7 @@ \writestatus{loading}{ConTeXt Buffer Macros / Buffers} -\registerctxluafile{buff-ini}{1.001} +\registerctxluafile{buff-ini}{} \unprotect diff --git a/tex/context/base/mkiv/buff-par.lua b/tex/context/base/mkiv/buff-par.lua index 9c75b90e7..33ed4baf0 100644 --- a/tex/context/base/mkiv/buff-par.lua +++ b/tex/context/base/mkiv/buff-par.lua @@ -6,6 +6,7 @@ if not modules then modules = { } end modules ['buff-par'] = { license = "see context related readme files" } +local tonumber = tonumber local insert, remove, find, gmatch, match = table.insert, table.remove, string.find, string.gmatch, string.match local fullstrip, formatters = string.fullstrip, string.formatters diff --git a/tex/context/base/mkiv/buff-par.mkvi b/tex/context/base/mkiv/buff-par.mkvi index 189e68eec..0ee66dd01 100644 --- a/tex/context/base/mkiv/buff-par.mkvi +++ b/tex/context/base/mkiv/buff-par.mkvi @@ -13,7 +13,7 @@ \writestatus{loading}{ConTeXt Buffer Macros / Parallel} -\registerctxluafile{buff-par}{1.001} +\registerctxluafile{buff-par}{} %D This module is made for Thomas Schmitz as part of a project. There is %D no documentation yet. Also, this code is unfinished and not tested well. diff --git a/tex/context/base/mkiv/buff-ver.lua b/tex/context/base/mkiv/buff-ver.lua index ed0e327a1..d9178b1df 100644 --- a/tex/context/base/mkiv/buff-ver.lua +++ b/tex/context/base/mkiv/buff-ver.lua @@ -14,7 +14,7 @@ if not modules then modules = { } end modules ['buff-ver'] = { -- todo: update to match context scite lexing local type, next, rawset, rawget, setmetatable, getmetatable, tonumber = type, next, rawset, rawget, setmetatable, getmetatable, tonumber -local format, lower, upper,match, find, sub = string.format, string.lower, string.upper, string.match, string.find, string.sub +local lower, upper,match, find, sub = string.lower, string.upper, string.match, string.find, string.sub local splitlines = string.splitlines local concat = table.concat local C, P, R, S, V, Carg, Cc, Cs = lpeg.C, lpeg.P, lpeg.R, lpeg.S, lpeg.V, lpeg.Carg, lpeg.Cc, lpeg.Cs @@ -33,6 +33,8 @@ local context = context local commands = commands local implement = interfaces.implement +local formatters = string.formatters + local tabtospace = utilities.strings.tabtospace local variables = interfaces.variables local settings_to_array = utilities.parsers.settings_to_array @@ -44,6 +46,8 @@ local v_yes = variables.yes local v_last = variables.last local v_all = variables.all local v_absolute = variables.absolute +----- v_inline = variables.inline -- not ! +----- v_display = variables.display -- not ! -- beware, all macros have an argument: @@ -235,12 +239,13 @@ function visualizers.load(name) name = lower(name) if rawget(specifications,name) == nil then name = lower(name) - local texname = findfile(format("buff-imp-%s.mkiv",name)) - local luaname = findfile(format("buff-imp-%s.lua" ,name)) + local impname = "buff-imp-"..name + local texname = findfile(addsuffix(impname,"mkiv")) + local luaname = findfile(addsuffix(impname,"lua")) if texname == "" or luaname == "" then -- assume a user specific file luaname = findfile(addsuffix(name,"mkiv")) - texname = findfile(addsuffix(name,"lua" )) + texname = findfile(addsuffix(name,"lua")) end if texname == "" or luaname == "" then if trace_visualize then @@ -265,14 +270,15 @@ function visualizers.register(name,specification) report_visualizers("registering visualizer %a",name) end specifications[name] = specification - local parser, handler = specification.parser, specification.handler - local displayparser = specification.display or parser - local inlineparser = specification.inline or parser - local isparser = is_lpeg(parser) + local parser = specification.parser + local handler = specification.handler + local displayparser = specification.display or parser + local inlineparser = specification.inline or parser + local isparser = is_lpeg(parser) local start, stop if isparser then start = makepattern(handler,"start",patterns.alwaysmatched) - stop = makepattern(handler,"stop",patterns.alwaysmatched) + stop = makepattern(handler,"stop", patterns.alwaysmatched) end if handler then if isparser then @@ -373,7 +379,7 @@ function visualizers.registerescapepattern(name,befores,afters,normalmethod,esca name,i,before,after,processor or "default") end before = P(before) * space_pattern - after = space_pattern * P(after) + after = space_pattern * P(after) local action if processor then action = function(s) apply_processor(processor,s) end @@ -450,15 +456,16 @@ function visualizers.registerescapecommand(name,token,normalmethod,escapecommand return escapepattern end -local escapedvisualizers = { } +local escapedvisualizers = { } +local f_escapedvisualizer = formatters["%s : %s"] local function visualize(content,settings) -- maybe also method in settings if content and content ~= "" then local method = lower(settings.method or "default") - local m + local m = specifications[method] or specifications.default local e = settings.escape - if e and e ~= "" then - local newname = format("%s : %s",method,e) + if e and e ~= "" and not m.handler.noescape then + local newname = f_escapedvisualizer(method,e) local newspec = specifications[newname] if newspec then m = newspec @@ -482,9 +489,10 @@ local function visualize(content,settings) -- maybe also method in settings end end end - local oldvisualizer = specifications[method] or specifications.default - local oldparser = oldvisualizer.direct - local newparser + local oldm = m + local oldparser = oldm.direct + local newhandler = oldm.handler + local newparser = oldm.parser -- nil if starts[1] and stops[1] ~= "" then newparser = visualizers.registerescapepattern(newname,starts,stops,oldparser,nil,processors) elseif starts[1] then @@ -494,7 +502,7 @@ local function visualize(content,settings) -- maybe also method in settings end m = visualizers.register(newname, { parser = newparser, - handler = oldvisualizer.handler, + handler = newhandler, }) end else @@ -789,8 +797,8 @@ local nospace = space^1/"" local endstring = P(-1) local compactors = { - [v_all] = Cs((backslash * (1-backslash-space)^1 * nospace * (endstring + fences) + 1)^0), - [v_absolute] = Cs((backslash * (1-symbols -space)^1 * nospace * (symbols+backslash) + 1) ^0), + [v_all] = Cs((backslash * (1-backslash-space)^1 * nospace * (endstring+fences) + 1)^0), + [v_absolute] = Cs((backslash * (1-symbols -space)^1 * nospace * (symbols +backslash) + 1) ^0), [v_last] = Cs((space^1 * endstring/"" + 1)^0), } diff --git a/tex/context/base/mkiv/buff-ver.mkiv b/tex/context/base/mkiv/buff-ver.mkiv index 27535dba9..558049dcc 100644 --- a/tex/context/base/mkiv/buff-ver.mkiv +++ b/tex/context/base/mkiv/buff-ver.mkiv @@ -15,7 +15,7 @@ \writestatus{loading}{ConTeXt Buffer Macros / Verbatim} -\registerctxluafile{buff-ver}{1.001} +\registerctxluafile{buff-ver}{} \unprotect @@ -41,7 +41,7 @@ \resetcharacterspacing \to \everyinitializeverbatim -\def\setverbatimspaceskip % to be checked: must happen after font switch +\unexpanded\def\setverbatimspaceskip % to be checked: must happen after font switch {\spaceskip\fontcharwd\font`x\relax \xspaceskip\spaceskip} @@ -799,21 +799,6 @@ \setuevalue{\e!type\currenttyping\v!buffer}{\buff_verbatim_type_buffer_class{\currenttyping}}% \to \everydefinetyping -% \unexpanded\def\buff_verbatim_type_buffer[#1][#2]% -% {\begingroup -% \ifsecondargument -% \setuptyping[\v!buffer][#2]% -% \processcommalist[#1]{\buff_verbatim_type_buffer_indeed\v!buffer}% [name] [settings] -% \else\iffirstargument -% \doifelseassignment{#1} -% {\setuptyping[\v!buffer][#1]% -% \buff_verbatim_type_buffer_indeed\v!buffer\empty}% [settings] -% {\processcommalist[#1]{\buff_verbatim_type_buffer_indeed\v!buffer}}% [name] -% \else -% \buff_verbatim_type_buffer_indeed\v!buffer\empty% [] -% \fi\fi -% \endgroup} - \unexpanded\def\buff_verbatim_type_buffer[#1][#2]% {\ifsecondargument \setupcurrenttyping[#2]% @@ -859,7 +844,7 @@ tab {\typingparameter\c!tab}% method {\p_buff_option}% escape {\typingparameter\c!escape}% - % nature {display}% + nature {display}% \relax \dostoptagged \endofverbatimlines @@ -867,6 +852,27 @@ \stoppacked \typingparameter\c!after} +\unexpanded\def\typeinlinebuffer + {\dontleavehmode + \begingroup + \let\buff_verbatim_type_buffer_indeed\buff_verbatim_type_buffer_indeed_inline + \let\setupcurrenttyping\setupcurrenttype % a terrible hack but it saves code + \let\currenttype\empty + \dodoubleempty\buff_verbatim_type_buffer} + +\unexpanded\def\buff_verbatim_type_buffer_indeed_inline#1#2% category name + {\edef\currenttype{#1}% + \buff_verbatim_initialize_type_one + \dostarttaggedchained\t!verbatim\currenttype\??type + \clf_typebuffer + name {#2}% + strip {\v!yes}% + regime {\currentregime}% + method {\p_buff_option}% + nature {inline}% is default anyway + \relax + \dostoptagged} + % get : before/after of buffer % typing : before/after of typing % process : no before/after (special case anyway) diff --git a/tex/context/base/mkiv/catc-ini.mkiv b/tex/context/base/mkiv/catc-ini.mkiv index 440d53efe..471e4d1c8 100644 --- a/tex/context/base/mkiv/catc-ini.mkiv +++ b/tex/context/base/mkiv/catc-ini.mkiv @@ -14,7 +14,7 @@ %D We've split the functionality of syst-cat.* over more files %D now so that we can load more selectively. -\registerctxluafile{catc-ini}{1.001} +\registerctxluafile{catc-ini}{} \unprotect diff --git a/tex/context/base/mkiv/char-cjk.lua b/tex/context/base/mkiv/char-cjk.lua index 3db90386e..ac41fa882 100644 --- a/tex/context/base/mkiv/char-cjk.lua +++ b/tex/context/base/mkiv/char-cjk.lua @@ -1282,11 +1282,40 @@ local cjk_ideograph_extension_b_range = { extender = cjk_ideograph_extension_b_extender, } +-- Nushu (when we skip them in mtx-unicode) + +-- local nushu_metatable = { +-- __index = { +-- category = "lo", +-- cjkwd = "w", +-- description = "<NUSHU CHARACTER>", +-- direction = "l", +-- linebreak = "id", +-- } +-- } +-- +-- local nushu_extender = function(k) +-- local t = { +-- -- shcode = shcode, +-- unicodeslot = k, +-- variants = variants[k], +-- description = formatters["NUSHU CHARACTER-%05X"](k) +-- } +-- setmetatable(t,nushu_metatable) +-- return t +-- end +-- +-- local nushu_range = { +-- name = "nushu character", +-- first = 0x1B170, +-- last = 0x1B2FF, +-- extender = nushu_extender, +-- } + -- Ranges insert(ranges, hangul_syllable_range) insert(ranges, cjk_ideograph_range) insert(ranges, cjk_ideograph_extension_a_range) insert(ranges, cjk_ideograph_extension_b_range) - --- Japanese +------(ranges, nushu_range) diff --git a/tex/context/base/mkiv/char-def.lua b/tex/context/base/mkiv/char-def.lua index 76c51a6b4..a305ee202 100644 --- a/tex/context/base/mkiv/char-def.lua +++ b/tex/context/base/mkiv/char-def.lua @@ -475,12 +475,7 @@ characters.data={ direction="cs", linebreak="is", mathclass="punctuation", - mathspec={ - { - class="punctuation", - name="ldotp", - }, - }, + mathname="ldotp", synonyms={ "decimal point", "dot", "period" }, unicodeslot=0x2E, }, @@ -492,14 +487,7 @@ characters.data={ description="SOLIDUS", direction="cs", linebreak="sy", - mathspec={ - { - class="middle", - }, - { - class="ordinary", - }, - }, + mathclass="middle", synonyms={ "slash", "virgule" }, unicodeslot=0x2F, }, @@ -7813,7 +7801,7 @@ characters.data={ direction="on", linebreak="ai", mathclass="topaccent", - mathname="mathring", + mathname="ring", specials={ "compat", 0x20, 0x30A }, unicodeslot=0x2DA, }, @@ -15335,42 +15323,47 @@ characters.data={ [0x600]={ arabic="u", category="cf", + contextname="arabicnumber", description="ARABIC NUMBER SIGN", direction="an", linebreak="al", unicodeslot=0x600, - visible="yes", + visible=true, }, [0x601]={ arabic="u", category="cf", + contextname="arabicsanah", description="ARABIC SIGN SANAH", direction="an", linebreak="al", unicodeslot=0x601, - visible="yes", + visible=true, }, [0x602]={ arabic="u", category="cf", + contextname="arabicfootnotemarker", description="ARABIC FOOTNOTE MARKER", direction="an", linebreak="al", unicodeslot=0x602, - visible="yes", + visible=true, }, [0x603]={ arabic="u", category="cf", + contextname="arabicsafha", description="ARABIC SIGN SAFHA", direction="an", linebreak="al", unicodeslot=0x603, - visible="yes", + visible=true, }, [0x604]={ arabic="u", category="cf", + contextname="arabicsamvat", description="ARABIC SIGN SAMVAT", direction="an", linebreak="al", @@ -15379,6 +15372,7 @@ characters.data={ [0x605]={ arabic="u", category="cf", + contextname="arabicnumberabove", description="ARABIC NUMBER MARK ABOVE", direction="an", linebreak="al", @@ -15386,6 +15380,7 @@ characters.data={ }, [0x606]={ category="sm", + contextname="arabiccuberoot", description="ARABIC-INDIC CUBE ROOT", direction="on", linebreak="al", @@ -15393,6 +15388,7 @@ characters.data={ }, [0x607]={ category="sm", + contextname="arabicfourthroot", description="ARABIC-INDIC FOURTH ROOT", direction="on", linebreak="al", @@ -15401,6 +15397,7 @@ characters.data={ [0x608]={ arabic="u", category="sm", + contextname="arabicray", description="ARABIC RAY", direction="al", linebreak="al", @@ -15408,6 +15405,7 @@ characters.data={ }, [0x609]={ category="po", + contextname="arabicpermille", description="ARABIC-INDIC PER MILLE SIGN", direction="et", linebreak="po", @@ -15415,6 +15413,7 @@ characters.data={ }, [0x60A]={ category="po", + contextname="arabicpertenthousand", description="ARABIC-INDIC PER TEN THOUSAND SIGN", direction="et", linebreak="po", @@ -15423,6 +15422,7 @@ characters.data={ [0x60B]={ arabic="u", category="sc", + contextname="afghanicurrency", description="AFGHANI SIGN", direction="al", linebreak="po", @@ -15430,6 +15430,7 @@ characters.data={ }, [0x60C]={ adobename="commaarabic", + contextname="arabiccomma", category="po", description="ARABIC COMMA", direction="cs", @@ -15438,6 +15439,7 @@ characters.data={ }, [0x60D]={ category="po", + contextname="arabicdateseparator", description="ARABIC DATE SEPARATOR", direction="al", linebreak="is", @@ -15445,6 +15447,7 @@ characters.data={ }, [0x60E]={ category="so", + contextname="arabicpoeticverse", description="ARABIC POETIC VERSE SIGN", direction="on", linebreak="al", @@ -15452,6 +15455,7 @@ characters.data={ }, [0x60F]={ category="so", + contextname="arabicmisra", description="ARABIC SIGN MISRA", direction="on", linebreak="al", @@ -15460,6 +15464,7 @@ characters.data={ [0x610]={ category="mn", combining=0xE6, + contextname="arabichighsallallahou", description="ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM", direction="nsm", linebreak="cm", @@ -15468,6 +15473,7 @@ characters.data={ [0x611]={ category="mn", combining=0xE6, + contextname="arabichighalayheassallam", description="ARABIC SIGN ALAYHE ASSALLAM", direction="nsm", linebreak="cm", @@ -15476,6 +15482,7 @@ characters.data={ [0x612]={ category="mn", combining=0xE6, + contextname="arabichighrahmatullahalayhe", description="ARABIC SIGN RAHMATULLAH ALAYHE", direction="nsm", linebreak="cm", @@ -15484,6 +15491,7 @@ characters.data={ [0x613]={ category="mn", combining=0xE6, + contextname="arabichighradiallahouanhu", description="ARABIC SIGN RADI ALLAHOU ANHU", direction="nsm", linebreak="cm", @@ -15492,6 +15500,7 @@ characters.data={ [0x614]={ category="mn", combining=0xE6, + contextname="arabichightakhallus", description="ARABIC SIGN TAKHALLUS", direction="nsm", linebreak="cm", @@ -15500,6 +15509,7 @@ characters.data={ [0x615]={ category="mn", combining=0xE6, + contextname="arabichightah", description="ARABIC SMALL HIGH TAH", direction="nsm", linebreak="cm", @@ -15516,6 +15526,7 @@ characters.data={ [0x617]={ category="mn", combining=0xE6, + contextname="arabichighzain", description="ARABIC SMALL HIGH ZAIN", direction="nsm", linebreak="cm", @@ -15548,6 +15559,7 @@ characters.data={ [0x61B]={ adobename="semicolonarabic", category="po", + contextname="arabicsemicolon", description="ARABIC SEMICOLON", direction="al", linebreak="ex", @@ -15555,6 +15567,7 @@ characters.data={ }, [0x61C]={ category="cf", + contextname="arabiclettermark", description="ARABIC LETTER MARK", direction="al", linebreak="cm", @@ -15562,6 +15575,7 @@ characters.data={ }, [0x61E]={ category="po", + contextname="arabictripledot", description="ARABIC TRIPLE DOT PUNCTUATION MARK", direction="al", linebreak="ex", @@ -15570,6 +15584,7 @@ characters.data={ [0x61F]={ adobename="questionarabic", category="po", + contextname="arabicquestion", description="ARABIC QUESTION MARK", direction="al", linebreak="ex", @@ -16226,6 +16241,7 @@ characters.data={ [0x66A]={ adobename="percentarabic", category="po", + contextname="arabicpercent", description="ARABIC PERCENT SIGN", direction="et", linebreak="po", @@ -16234,6 +16250,7 @@ characters.data={ [0x66B]={ adobename="decimalseparatorpersian", category="po", + contextname="persiandecimalseparator", description="ARABIC DECIMAL SEPARATOR", direction="an", linebreak="nu", @@ -16242,6 +16259,7 @@ characters.data={ [0x66C]={ adobename="thousandsseparatorpersian", category="po", + contextname="persianthousandsseparator", description="ARABIC THOUSANDS SEPARATOR", direction="an", linebreak="nu", @@ -16251,6 +16269,7 @@ characters.data={ [0x66D]={ adobename="asteriskarabic", category="po", + contextname="arabicasterisk", description="ARABIC FIVE POINTED STAR", direction="al", linebreak="al", @@ -17147,6 +17166,7 @@ characters.data={ }, [0x6D4]={ category="po", + contextname="arabicperiod", description="ARABIC FULL STOP", direction="al", linebreak="ex", @@ -17164,6 +17184,7 @@ characters.data={ [0x6D6]={ category="mn", combining=0xE6, + contextname="arabichighesala", description="ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA", direction="nsm", linebreak="cm", @@ -17172,6 +17193,7 @@ characters.data={ [0x6D7]={ category="mn", combining=0xE6, + contextname="arabichigheqala", description="ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA", direction="nsm", linebreak="cm", @@ -17180,6 +17202,7 @@ characters.data={ [0x6D8]={ category="mn", combining=0xE6, + contextname="arabichighmeemshort", description="ARABIC SMALL HIGH MEEM INITIAL FORM", direction="nsm", linebreak="cm", @@ -17188,6 +17211,7 @@ characters.data={ [0x6D9]={ category="mn", combining=0xE6, + contextname="arabichighlamalef", description="ARABIC SMALL HIGH LAM ALEF", direction="nsm", linebreak="cm", @@ -17196,6 +17220,7 @@ characters.data={ [0x6DA]={ category="mn", combining=0xE6, + contextname="arabichighjeem", description="ARABIC SMALL HIGH JEEM", direction="nsm", linebreak="cm", @@ -17204,6 +17229,7 @@ characters.data={ [0x6DB]={ category="mn", combining=0xE6, + contextname="arabicshighthreedots", description="ARABIC SMALL HIGH THREE DOTS", direction="nsm", linebreak="cm", @@ -17212,6 +17238,7 @@ characters.data={ [0x6DC]={ category="mn", combining=0xE6, + contextname="arabichighseen", description="ARABIC SMALL HIGH SEEN", direction="nsm", linebreak="cm", @@ -17220,14 +17247,16 @@ characters.data={ [0x6DD]={ arabic="u", category="cf", + contextname="arabicendofayah", description="ARABIC END OF AYAH", direction="an", linebreak="al", unicodeslot=0x6DD, - visible="yes", + visible=true, }, [0x6DE]={ category="me", + contextname="arabicstartofrubc", description="ARABIC START OF RUB EL HIZB", direction="on", linebreak="al", @@ -17260,6 +17289,7 @@ characters.data={ [0x6E2]={ category="mn", combining=0xE6, + contextname="arabichighmeemlong", description="ARABIC SMALL HIGH MEEM ISOLATED FORM", direction="nsm", linebreak="cm", @@ -17268,6 +17298,7 @@ characters.data={ [0x6E3]={ category="mn", combining=0xDC, + contextname="arabiclowseen", description="ARABIC SMALL LOW SEEN", direction="nsm", linebreak="cm", @@ -17276,6 +17307,7 @@ characters.data={ [0x6E4]={ category="mn", combining=0xE6, + contextname="arabichighmadda", description="ARABIC SMALL HIGH MADDA", direction="nsm", linebreak="cm", @@ -17283,6 +17315,7 @@ characters.data={ }, [0x6E5]={ category="lm", + contextname="arabicvowelwaw", description="ARABIC SMALL WAW", direction="al", linebreak="al", @@ -17290,6 +17323,7 @@ characters.data={ }, [0x6E6]={ category="lm", + contextname="arabicvowelyeh", description="ARABIC SMALL YEH", direction="al", linebreak="al", @@ -17298,6 +17332,7 @@ characters.data={ [0x6E7]={ category="mn", combining=0xE6, + contextname="arabichighyeh", description="ARABIC SMALL HIGH YEH", direction="nsm", linebreak="cm", @@ -17306,6 +17341,7 @@ characters.data={ [0x6E8]={ category="mn", combining=0xE6, + contextname="arabichighnoon", description="ARABIC SMALL HIGH NOON", direction="nsm", linebreak="cm", @@ -17313,6 +17349,7 @@ characters.data={ }, [0x6E9]={ category="so", + contextname="arabicsajdah", description="ARABIC PLACE OF SAJDAH", direction="on", linebreak="al", @@ -17345,6 +17382,7 @@ characters.data={ [0x6ED]={ category="mn", combining=0xDC, + contextname="arabiclowmeemlong", description="ARABIC SMALL LOW MEEM", direction="nsm", linebreak="cm", @@ -17603,7 +17641,7 @@ characters.data={ linebreak="al", synonyms={ "syriac sam" }, unicodeslot=0x70F, - visible="yes", + visible=true, }, [0x710]={ arabic="r", @@ -20000,6 +20038,94 @@ characters.data={ linebreak="al", unicodeslot=0x85E, }, + [0x860]={ + arabic="d", + category="lo", + description="SYRIAC LETTER MALAYALAM NGA", + direction="al", + linebreak="al", + unicodeslot=0x860, + }, + [0x861]={ + arabic="u", + category="lo", + description="SYRIAC LETTER MALAYALAM JA", + direction="al", + linebreak="al", + unicodeslot=0x861, + }, + [0x862]={ + arabic="d", + category="lo", + description="SYRIAC LETTER MALAYALAM NYA", + direction="al", + linebreak="al", + unicodeslot=0x862, + }, + [0x863]={ + arabic="d", + category="lo", + description="SYRIAC LETTER MALAYALAM TTA", + direction="al", + linebreak="al", + unicodeslot=0x863, + }, + [0x864]={ + arabic="d", + category="lo", + description="SYRIAC LETTER MALAYALAM NNA", + direction="al", + linebreak="al", + unicodeslot=0x864, + }, + [0x865]={ + arabic="d", + category="lo", + description="SYRIAC LETTER MALAYALAM NNNA", + direction="al", + linebreak="al", + unicodeslot=0x865, + }, + [0x866]={ + arabic="u", + category="lo", + description="SYRIAC LETTER MALAYALAM BHA", + direction="al", + linebreak="al", + unicodeslot=0x866, + }, + [0x867]={ + arabic="r", + category="lo", + description="SYRIAC LETTER MALAYALAM RA", + direction="al", + linebreak="al", + unicodeslot=0x867, + }, + [0x868]={ + arabic="d", + category="lo", + description="SYRIAC LETTER MALAYALAM LLA", + direction="al", + linebreak="al", + unicodeslot=0x868, + }, + [0x869]={ + arabic="r", + category="lo", + description="SYRIAC LETTER MALAYALAM LLLA", + direction="al", + linebreak="al", + unicodeslot=0x869, + }, + [0x86A]={ + arabic="r", + category="lo", + description="SYRIAC LETTER MALAYALAM SSA", + direction="al", + linebreak="al", + unicodeslot=0x86A, + }, [0x8A0]={ arabic="d", category="lo", @@ -20235,6 +20361,7 @@ characters.data={ [0x8D4]={ category="mn", combining=0xE6, + contextname="arabichighrubc", description="ARABIC SMALL HIGH WORD AR-RUB", direction="nsm", linebreak="cm", @@ -20243,6 +20370,7 @@ characters.data={ [0x8D5]={ category="mn", combining=0xE6, + contextname="arabichighsad", description="ARABIC SMALL HIGH SAD", direction="nsm", linebreak="cm", @@ -20251,6 +20379,7 @@ characters.data={ [0x8D6]={ category="mn", combining=0xE6, + contextname="arabichighain", description="ARABIC SMALL HIGH AIN", direction="nsm", linebreak="cm", @@ -20259,6 +20388,7 @@ characters.data={ [0x8D7]={ category="mn", combining=0xE6, + contextname="arabichighqaf", description="ARABIC SMALL HIGH QAF", direction="nsm", linebreak="cm", @@ -20267,6 +20397,7 @@ characters.data={ [0x8D8]={ category="mn", combining=0xE6, + contextname="arabichighnoonkasra", description="ARABIC SMALL HIGH NOON WITH KASRA", direction="nsm", linebreak="cm", @@ -20275,6 +20406,7 @@ characters.data={ [0x8D9]={ category="mn", combining=0xE6, + contextname="arabiclownoonkasra", description="ARABIC SMALL LOW NOON WITH KASRA", direction="nsm", linebreak="cm", @@ -20283,6 +20415,7 @@ characters.data={ [0x8DA]={ category="mn", combining=0xE6, + contextname="arabichighthalatha", description="ARABIC SMALL HIGH WORD ATH-THALATHA", direction="nsm", linebreak="cm", @@ -20291,6 +20424,7 @@ characters.data={ [0x8DB]={ category="mn", combining=0xE6, + contextname="arabichighsajda", description="ARABIC SMALL HIGH WORD AS-SAJDA", direction="nsm", linebreak="cm", @@ -20299,6 +20433,7 @@ characters.data={ [0x8DC]={ category="mn", combining=0xE6, + contextname="arabichighnisf", description="ARABIC SMALL HIGH WORD AN-NISF", direction="nsm", linebreak="cm", @@ -20307,6 +20442,7 @@ characters.data={ [0x8DD]={ category="mn", combining=0xE6, + contextname="arabichighsakta", description="ARABIC SMALL HIGH WORD SAKTA", direction="nsm", linebreak="cm", @@ -20315,6 +20451,7 @@ characters.data={ [0x8DE]={ category="mn", combining=0xE6, + contextname="arabichighqif", description="ARABIC SMALL HIGH WORD QIF", direction="nsm", linebreak="cm", @@ -20323,6 +20460,7 @@ characters.data={ [0x8DF]={ category="mn", combining=0xE6, + contextname="arabichighwaqf", description="ARABIC SMALL HIGH WORD WAQFA", direction="nsm", linebreak="cm", @@ -20331,6 +20469,7 @@ characters.data={ [0x8E0]={ category="mn", combining=0xE6, + contextname="arabichighfootnotemarker", description="ARABIC SMALL HIGH FOOTNOTE MARKER", direction="nsm", linebreak="cm", @@ -20339,6 +20478,7 @@ characters.data={ [0x8E1]={ category="mn", combining=0xE6, + contextname="arabichighsmallsafha", description="ARABIC SMALL HIGH SIGN SAFHA", direction="nsm", linebreak="cm", @@ -20347,6 +20487,7 @@ characters.data={ [0x8E2]={ arabic="u", category="cf", + contextname="arabicdisputedendofayah", description="ARABIC DISPUTED END OF AYAH", direction="an", linebreak="al", @@ -22356,6 +22497,20 @@ characters.data={ linebreak="pr", unicodeslot=0x9FB, }, + [0x9FC]={ + category="lo", + description="BENGALI LETTER VEDIC ANUSVARA", + direction="l", + linebreak="al", + unicodeslot=0x9FC, + }, + [0x9FD]={ + category="po", + description="BENGALI ABBREVIATION SIGN", + direction="l", + linebreak="al", + unicodeslot=0x9FD, + }, [0xA01]={ category="mn", description="GURMUKHI SIGN ADAK BINDI", @@ -23665,6 +23820,48 @@ characters.data={ linebreak="al", unicodeslot=0xAF9, }, + [0xAFA]={ + category="mn", + description="GUJARATI SIGN SUKUN", + direction="nsm", + linebreak="cm", + unicodeslot=0xAFA, + }, + [0xAFB]={ + category="mn", + description="GUJARATI SIGN SHADDA", + direction="nsm", + linebreak="cm", + unicodeslot=0xAFB, + }, + [0xAFC]={ + category="mn", + description="GUJARATI SIGN MADDAH", + direction="nsm", + linebreak="cm", + unicodeslot=0xAFC, + }, + [0xAFD]={ + category="mn", + description="GUJARATI SIGN THREE-DOT NUKTA ABOVE", + direction="nsm", + linebreak="cm", + unicodeslot=0xAFD, + }, + [0xAFE]={ + category="mn", + description="GUJARATI SIGN CIRCLE NUKTA ABOVE", + direction="nsm", + linebreak="cm", + unicodeslot=0xAFE, + }, + [0xAFF]={ + category="mn", + description="GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE", + direction="nsm", + linebreak="cm", + unicodeslot=0xAFF, + }, [0xB01]={ category="mn", description="ORIYA SIGN CANDRABINDU", @@ -26120,6 +26317,13 @@ characters.data={ linebreak="al", unicodeslot=0xCF2, }, + [0xD00]={ + category="mn", + description="MALAYALAM SIGN COMBINING ANUSVARA ABOVE", + direction="nsm", + linebreak="cm", + unicodeslot=0xD00, + }, [0xD01]={ category="mn", description="MALAYALAM SIGN CANDRABINDU", @@ -26505,6 +26709,22 @@ characters.data={ linebreak="al", unicodeslot=0xD3A, }, + [0xD3B]={ + category="mn", + combining=0x9, + description="MALAYALAM SIGN VERTICAL BAR VIRAMA", + direction="nsm", + linebreak="cm", + unicodeslot=0xD3B, + }, + [0xD3C]={ + category="mn", + combining=0x9, + description="MALAYALAM SIGN CIRCULAR VIRAMA", + direction="nsm", + linebreak="cm", + unicodeslot=0xD3C, + }, [0xD3D]={ category="lo", description="MALAYALAM SIGN AVAGRAHA", @@ -51598,6 +51818,13 @@ characters.data={ linebreak="al", unicodeslot=0x1CF6, }, + [0x1CF7]={ + category="mc", + description="VEDIC SIGN ATIKRAMA", + direction="l", + linebreak="cm", + unicodeslot=0x1CF7, + }, [0x1CF8]={ category="mn", combining=0xE6, @@ -53527,6 +53754,38 @@ characters.data={ linebreak="cm", unicodeslot=0x1DF5, }, + [0x1DF6]={ + category="mn", + combining=0xE8, + description="COMBINING KAVYKA ABOVE RIGHT", + direction="nsm", + linebreak="cm", + unicodeslot=0x1DF6, + }, + [0x1DF7]={ + category="mn", + combining=0xE4, + description="COMBINING KAVYKA ABOVE LEFT", + direction="nsm", + linebreak="cm", + unicodeslot=0x1DF7, + }, + [0x1DF8]={ + category="mn", + combining=0xE4, + description="COMBINING DOT ABOVE LEFT", + direction="nsm", + linebreak="cm", + unicodeslot=0x1DF8, + }, + [0x1DF9]={ + category="mn", + combining=0xDC, + description="COMBINING WIDE INVERTED BRIDGE BELOW", + direction="nsm", + linebreak="cm", + unicodeslot=0x1DF9, + }, [0x1DFB]={ category="mn", combining=0xE6, @@ -58938,6 +59197,7 @@ characters.data={ }, [0x2000]={ category="zs", + contextname="enquad", description="EN QUAD", direction="ws", linebreak="ba", @@ -58946,6 +59206,7 @@ characters.data={ }, [0x2001]={ category="zs", + contextname="emquad", description="EM QUAD", direction="ws", linebreak="ba", @@ -59153,6 +59414,7 @@ characters.data={ description="DOUBLE VERTICAL LINE", direction="on", linebreak="ai", + mathlist={ 0x7C, 0x7C }, mathspec={ { class="delimiter", @@ -60623,6 +60885,13 @@ characters.data={ synonyms={ "georgian currency" }, unicodeslot=0x20BE, }, + [0x20BF]={ + category="sc", + description="BITCOIN SIGN", + direction="et", + linebreak="pr", + unicodeslot=0x20BF, + }, [0x20D0]={ category="mn", combining=0xE6, @@ -61012,6 +61281,7 @@ characters.data={ specials={ "font", 0x67 }, synonyms={ "real number symbol" }, unicodeslot=0x210A, + visual="it", }, [0x210B]={ category="lu", @@ -61020,6 +61290,7 @@ characters.data={ linebreak="al", specials={ "font", 0x48 }, unicodeslot=0x210B, + visual="it", }, [0x210C]={ category="lu", @@ -61073,6 +61344,7 @@ characters.data={ linebreak="al", specials={ "font", 0x49 }, unicodeslot=0x2110, + visual="it", }, [0x2111]={ adobename="Ifraktur", @@ -61094,11 +61366,13 @@ characters.data={ specials={ "font", 0x4C }, synonyms={ "laplace transform" }, unicodeslot=0x2112, + visual="it", }, [0x2113]={ adobename="lsquare", category="ll", cjkwd="a", + comment="not: MATHEMATICAL SCRIPT SMALL L", description="SCRIPT SMALL L", direction="l", linebreak="ai", @@ -61187,6 +61461,7 @@ characters.data={ specials={ "font", 0x52 }, synonyms={ "riemann integral" }, unicodeslot=0x211B, + visual="it", }, [0x211C]={ adobename="Rfraktur", @@ -61358,6 +61633,7 @@ characters.data={ specials={ "font", 0x42 }, synonyms={ "bernoulli function" }, unicodeslot=0x212C, + visual="it", }, [0x212D]={ category="lu", @@ -61383,6 +61659,7 @@ characters.data={ specials={ "font", 0x65 }, synonyms={ "error", "natural exponent" }, unicodeslot=0x212F, + visual="it", }, [0x2130]={ category="lu", @@ -61392,6 +61669,7 @@ characters.data={ specials={ "font", 0x45 }, synonyms={ "electromotive force", "emf" }, unicodeslot=0x2130, + visual="it", }, [0x2131]={ category="lu", @@ -61401,6 +61679,7 @@ characters.data={ specials={ "font", 0x46 }, synonyms={ "fourier transform" }, unicodeslot=0x2131, + visual="it", }, [0x2132]={ category="lu", @@ -61421,6 +61700,7 @@ characters.data={ specials={ "font", 0x4D }, synonyms={ "german mark pre-wwii", "m-matrix" }, unicodeslot=0x2133, + visual="it", }, [0x2134]={ category="ll", @@ -61430,6 +61710,7 @@ characters.data={ specials={ "font", 0x6F }, synonyms={ "order" }, unicodeslot=0x2134, + visual="it", }, [0x2135]={ adobename="aleph", @@ -62290,6 +62571,7 @@ characters.data={ linebreak="ai", mathextensible="l", mathfiller="leftarrowfill", + mathlist={ 0x3C, 0x2212 }, mathspec={ { class="relation", @@ -62333,6 +62615,7 @@ characters.data={ linebreak="ai", mathextensible="r", mathfiller="rightarrowfill", + mathlist={ 0x2212, 0x3E }, mathspec={ { class="relation", @@ -62377,6 +62660,7 @@ characters.data={ linebreak="ai", mathclass="relation", mathextensible="h", + mathlist={ 0x3C, 0x2212, 0x3E }, mathname="leftrightarrow", synonyms={ "relation" }, unicodeslot=0x2194, @@ -63049,6 +63333,7 @@ characters.data={ linebreak="al", mathclass="relation", mathextensible="l", + mathlist={ 0x3C, 0x3D, 0x3D }, mathname="Leftarrow", unicodeslot=0x21D0, }, @@ -63071,6 +63356,7 @@ characters.data={ direction="on", linebreak="ai", mathextensible="r", + mathlist={ 0x3D, 0x3D, 0x3E }, mathspec={ { class="relation", @@ -63103,6 +63389,7 @@ characters.data={ linebreak="ai", mathclass="relation", mathextensible="h", + mathlist={ 0x3C, 0x3D, 0x3D, 0x3E }, mathname="Leftrightarrow", unicodeslot=0x21D4, }, @@ -63858,7 +64145,6 @@ characters.data={ direction="on", linebreak="al", mathclass="binary", - mathname="bullet", unicodeslot=0x2219, }, [0x221A]={ @@ -64248,6 +64534,7 @@ characters.data={ direction="on", linebreak="ai", mathclass="relation", + mathlist={ 0x3A, 0x3A }, mathname="squaredots", unicodeslot=0x2237, }, @@ -64267,6 +64554,7 @@ characters.data={ direction="on", linebreak="al", mathclass="relation", + mathlist={ 0x2212, 0x3A }, mathname="minuscolon", unicodeslot=0x2239, }, @@ -64551,8 +64839,8 @@ characters.data={ direction="on", linebreak="al", mathclass="relation", + mathlist={ 0x3A, 0x3D }, mathname="colonequals", - mathpair={ 0x3A, 0x3D }, mirror=0x2255, unicodeslot=0x2254, }, @@ -64562,8 +64850,8 @@ characters.data={ direction="on", linebreak="al", mathclass="relation", + mathlist={ 0x3D, 0x3A }, mathname="equalscolon", - mathpair={ 0x3D, 0x3A }, mirror=0x2254, unicodeslot=0x2255, }, @@ -64665,6 +64953,7 @@ characters.data={ description="NOT EQUAL TO", direction="on", linebreak="ai", + mathlist={ 0x2F, 0x3D }, mathspec={ { class="relation", @@ -64687,6 +64976,7 @@ characters.data={ linebreak="ai", mathclass="relation", mathextensible="h", + mathlist={ 0x3D, 0x3D }, mathname="equiv", unicodeslot=0x2261, }, @@ -64699,6 +64989,7 @@ characters.data={ mathclass="relation", mathextensible="h", mathfiller="triplerelfill", + mathlist={ 0x2F, 0x3D, 0x3D }, mathname="nequiv", specials={ "char", 0x2261, 0x338 }, unicodeslot=0x2262, @@ -64719,7 +65010,7 @@ characters.data={ description="LESS-THAN OR EQUAL TO", direction="on", linebreak="ai", - mathpair={ 0x3C, 0x3D }, + mathlist={ 0x3C, 0x3D }, mathspec={ { class="relation", @@ -64740,7 +65031,7 @@ characters.data={ description="GREATER-THAN OR EQUAL TO", direction="on", linebreak="ai", - mathpair={ 0x3E, 0x3D }, + mathlist={ 0x3E, 0x3D }, mathspec={ { class="relation", @@ -64812,6 +65103,7 @@ characters.data={ direction="on", linebreak="ai", mathclass="relation", + mathlist={ 0x3C, 0x3C }, mathname="ll", mirror=0x226B, unicodeslot=0x226A, @@ -64824,6 +65116,7 @@ characters.data={ direction="on", linebreak="ai", mathclass="relation", + mathlist={ 0x3E, 0x3E }, mathname="gg", mirror=0x226A, unicodeslot=0x226B, @@ -64844,6 +65137,7 @@ characters.data={ direction="on", linebreak="al", mathclass="relation", + mathlist={ 0x2F, 0x224D }, mathname="nasymp", specials={ "char", 0x224D, 0x338 }, unicodeslot=0x226D, @@ -64856,6 +65150,7 @@ characters.data={ direction="on", linebreak="ai", mathclass="relation", + mathlist={ 0x2F, 0x3C }, mathname="nless", mirror=0x226F, specials={ "char", 0x3C, 0x338 }, @@ -64869,6 +65164,7 @@ characters.data={ direction="on", linebreak="ai", mathclass="relation", + mathlist={ 0x2F, 0x3E }, mathname="ngtr", mirror=0x226E, specials={ "char", 0x3E, 0x338 }, @@ -64881,6 +65177,7 @@ characters.data={ direction="on", linebreak="al", mathclass="relation", + mathlist={ 0x2F, 0x3C, 0x3D }, mathname="nleq", mirror=0x2271, specials={ "char", 0x2264, 0x338 }, @@ -64893,6 +65190,7 @@ characters.data={ direction="on", linebreak="al", mathclass="relation", + mathlist={ 0x2F, 0x3E, 0x3D }, mathname="ngeq", mirror=0x2270, specials={ "char", 0x2265, 0x338 }, @@ -65980,6 +66278,7 @@ characters.data={ description="VERY MUCH LESS-THAN", direction="on", linebreak="al", + mathlist={ 0x3C, 0x3C, 0x3C }, mathspec={ { class="relation", @@ -65998,6 +66297,7 @@ characters.data={ description="VERY MUCH GREATER-THAN", direction="on", linebreak="al", + mathlist={ 0x3E, 0x3E, 0x3E }, mathspec={ { class="relation", @@ -66045,6 +66345,7 @@ characters.data={ direction="on", linebreak="al", mathclass="relation", + mathlist={ 0x3D, 0x3C }, mathname="eqless", mirror=0x22DD, unicodeslot=0x22DC, @@ -66055,6 +66356,7 @@ characters.data={ direction="on", linebreak="al", mathclass="relation", + mathlist={ 0x3D, 0x3E }, mathname="eqgtr", mirror=0x22DC, unicodeslot=0x22DD, @@ -68296,6 +68598,13 @@ characters.data={ linebreak="al", unicodeslot=0x23FE, }, + [0x23FF]={ + category="so", + description="OBSERVER EYE SYMBOL", + direction="on", + linebreak="al", + unicodeslot=0x23FF, + }, [0x2400]={ category="so", description="SYMBOL FOR NULL", @@ -76323,6 +76632,7 @@ characters.data={ linebreak="al", mathclass="relation", mathextensible="l", + mathlist={ 0x3C, 0x2212, 0x2212 }, mathname="longleftarrow", unicodeslot=0x27F5, }, @@ -76335,6 +76645,7 @@ characters.data={ mathclass="relation", mathextensible="r", mathfiller="rightarrowfill", + mathlist={ 0x2212, 0x2212, 0x3E }, mathname="longrightarrow", mathparent=0x2192, unicodeslot=0x27F6, @@ -76348,6 +76659,7 @@ characters.data={ mathclass="relation", mathextensible="h", mathfiller="leftrightarrowfill", + mathlist={ 0x3C, 0x2212, 0x2212, 0x3E }, mathname="longleftrightarrow", mathparent=0x2190, unicodeslot=0x27F7, @@ -76360,17 +76672,20 @@ characters.data={ mathclass="relation", mathextensible="l", mathfiller="Leftarrowfill", + mathlist={ 0x3C, 0x3D, 0x3D, 0x3D }, mathname="Longleftarrow", unicodeslot=0x27F8, }, [0x27F9]={ category="sm", + comment="watch the virtual mathpair", description="LONG RIGHTWARDS DOUBLE ARROW", direction="on", linebreak="al", mathclass="relation", mathextensible="r", mathfiller="Rightarrowfill", + mathlist={ 0x3D, 0x3D, 0x3D, 0x3E }, mathname="Longrightarrow", unicodeslot=0x27F9, }, @@ -76382,6 +76697,7 @@ characters.data={ mathclass="relation", mathextensible="h", mathfiller="Leftrightarrowfill", + mathlist={ 0x3C, 0x3D, 0x3D, 0x3D, 0x3E }, mathname="Longleftrightarrow", unicodeslot=0x27FA, }, @@ -79214,6 +79530,7 @@ characters.data={ description="TRIPLE VERTICAL BAR DELIMITER", direction="on", linebreak="al", + mathlist={ 0x7C, 0x7C, 0x7C }, mathspec={ { class="delimiter", @@ -81085,6 +81402,8 @@ characters.data={ description="TWO CONSECUTIVE EQUALS SIGNS", direction="on", linebreak="al", + mathclass="relation", + mathname="eqeq", specials={ "compat", 0x3D, 0x3D }, unicodeslot=0x2A75, }, @@ -81093,6 +81412,8 @@ characters.data={ description="THREE CONSECUTIVE EQUALS SIGNS", direction="on", linebreak="al", + mathclass="relation", + mathname="eqeqeq", specials={ "compat", 0x3D, 0x3D, 0x3D }, unicodeslot=0x2A76, }, @@ -81268,6 +81589,7 @@ characters.data={ direction="on", linebreak="al", mathclass="relation", + mathlist={ 0x3C, 0x3D, 0x3E }, mathname="lesseqqgtr", mirror=0x2A8C, unicodeslot=0x2A8B, @@ -81278,6 +81600,7 @@ characters.data={ direction="on", linebreak="al", mathclass="relation", + mathlist={ 0x3E, 0x3D, 0x3C }, mathname="gtreqqless", mirror=0x2A8B, unicodeslot=0x2A8C, @@ -83659,6 +83982,13 @@ characters.data={ linebreak="al", unicodeslot=0x2BD1, }, + [0x2BD2]={ + category="so", + description="GROUP MARK", + direction="on", + linebreak="al", + unicodeslot=0x2BD2, + }, [0x2BEC]={ category="so", description="LEFTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS", @@ -87705,6 +88035,41 @@ characters.data={ linebreak="ba", unicodeslot=0x2E44, }, + [0x2E45]={ + category="po", + description="INVERTED LOW KAVYKA", + direction="on", + linebreak="ba", + unicodeslot=0x2E45, + }, + [0x2E46]={ + category="po", + description="INVERTED LOW KAVYKA WITH KAVYKA ABOVE", + direction="on", + linebreak="ba", + unicodeslot=0x2E46, + }, + [0x2E47]={ + category="po", + description="LOW KAVYKA", + direction="on", + linebreak="ba", + unicodeslot=0x2E47, + }, + [0x2E48]={ + category="po", + description="LOW KAVYKA WITH DOT", + direction="on", + linebreak="ba", + unicodeslot=0x2E48, + }, + [0x2E49]={ + category="po", + description="DOUBLE STACKED COMMA", + direction="on", + linebreak="ba", + unicodeslot=0x2E49, + }, [0x2E80]={ category="so", cjkwd="w", @@ -93905,6 +94270,14 @@ characters.data={ linebreak="id", unicodeslot=0x312D, }, + [0x312E]={ + category="lo", + cjkwd="w", + description="BOPOMOFO LETTER O WITH DOT ABOVE", + direction="l", + linebreak="id", + unicodeslot=0x312E, + }, [0x3131]={ adobename="kiyeokkorean", category="lo", @@ -131372,6 +131745,7 @@ characters.data={ [0xFD3E]={ adobename="parenleftaltonearabic", category="ps", + contextname="arabicparenleft", description="ORNATE LEFT PARENTHESIS", direction="on", linebreak="cl", @@ -131380,6 +131754,7 @@ characters.data={ [0xFD3F]={ adobename="parenrightaltonearabic", category="pe", + contextname="arabicparenright", description="ORNATE RIGHT PARENTHESIS", direction="on", linebreak="op", @@ -132332,6 +132707,7 @@ characters.data={ }, [0xFDF0]={ category="lo", + contextname="arabicsalla", description="ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM", direction="al", linebreak="al", @@ -132340,6 +132716,7 @@ characters.data={ }, [0xFDF1]={ category="lo", + contextname="arabicqala", description="ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM", direction="al", linebreak="al", @@ -132349,6 +132726,7 @@ characters.data={ [0xFDF2]={ adobename="lamlamhehisolatedarabic", category="lo", + contextname="arabicallah", description="ARABIC LIGATURE ALLAH ISOLATED FORM", direction="al", linebreak="al", @@ -132357,6 +132735,7 @@ characters.data={ }, [0xFDF3]={ category="lo", + contextname="arabicakbar", description="ARABIC LIGATURE AKBAR ISOLATED FORM", direction="al", linebreak="al", @@ -132365,6 +132744,7 @@ characters.data={ }, [0xFDF4]={ category="lo", + contextname="arabicmuhammad", description="ARABIC LIGATURE MOHAMMAD ISOLATED FORM", direction="al", linebreak="al", @@ -132373,6 +132753,7 @@ characters.data={ }, [0xFDF5]={ category="lo", + contextname="arabicslcm", description="ARABIC LIGATURE SALAM ISOLATED FORM", direction="al", linebreak="al", @@ -132381,6 +132762,7 @@ characters.data={ }, [0xFDF6]={ category="lo", + contextname="arabicrasoul", description="ARABIC LIGATURE RASOUL ISOLATED FORM", direction="al", linebreak="al", @@ -132389,6 +132771,7 @@ characters.data={ }, [0xFDF7]={ category="lo", + contextname="arabicalayhe", description="ARABIC LIGATURE ALAYHE ISOLATED FORM", direction="al", linebreak="al", @@ -132397,6 +132780,7 @@ characters.data={ }, [0xFDF8]={ category="lo", + contextname="arabicwasallam", description="ARABIC LIGATURE WASALLAM ISOLATED FORM", direction="al", linebreak="al", @@ -132405,6 +132789,7 @@ characters.data={ }, [0xFDF9]={ category="lo", + contextname="arabicsalla", description="ARABIC LIGATURE SALLA ISOLATED FORM", direction="al", linebreak="al", @@ -132414,6 +132799,7 @@ characters.data={ [0xFDFA]={ adobename="sallallahoualayhewasallamarabic", category="lo", + contextname="arabicallallahou", description="ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM", direction="al", linebreak="al", @@ -132422,6 +132808,7 @@ characters.data={ }, [0xFDFB]={ category="lo", + contextname="arabicjallajalalouhou", description="ARABIC LIGATURE JALLAJALALOUHOU", direction="al", linebreak="al", @@ -132430,6 +132817,7 @@ characters.data={ }, [0xFDFC]={ category="sc", + contextname="arabicrialsign", description="RIAL SIGN", direction="al", linebreak="po", @@ -132439,6 +132827,7 @@ characters.data={ }, [0xFDFD]={ category="so", + contextname="arabicbasmalah", description="ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM", direction="on", linebreak="al", @@ -140676,6 +141065,27 @@ characters.data={ linebreak="al", unicodeslot=0x10323, }, + [0x1032D]={ + category="lo", + description="OLD ITALIC LETTER YE", + direction="l", + linebreak="al", + unicodeslot=0x1032D, + }, + [0x1032E]={ + category="lo", + description="OLD ITALIC LETTER NORTHERN TSE", + direction="l", + linebreak="al", + unicodeslot=0x1032E, + }, + [0x1032F]={ + category="lo", + description="OLD ITALIC LETTER SOUTHERN TSE", + direction="l", + linebreak="al", + unicodeslot=0x1032F, + }, [0x10330]={ category="lo", description="GOTHIC LETTER AHSA", @@ -161728,6 +162138,1073 @@ characters.data={ linebreak="al", unicodeslot=0x118FF, }, + [0x11A00]={ + category="lo", + description="ZANABAZAR SQUARE LETTER A", + direction="l", + linebreak="al", + unicodeslot=0x11A00, + }, + [0x11A01]={ + category="mn", + description="ZANABAZAR SQUARE VOWEL SIGN I", + direction="nsm", + linebreak="cm", + unicodeslot=0x11A01, + }, + [0x11A02]={ + category="mn", + description="ZANABAZAR SQUARE VOWEL SIGN UE", + direction="nsm", + linebreak="cm", + unicodeslot=0x11A02, + }, + [0x11A03]={ + category="mn", + description="ZANABAZAR SQUARE VOWEL SIGN U", + direction="nsm", + linebreak="cm", + unicodeslot=0x11A03, + }, + [0x11A04]={ + category="mn", + description="ZANABAZAR SQUARE VOWEL SIGN E", + direction="nsm", + linebreak="cm", + unicodeslot=0x11A04, + }, + [0x11A05]={ + category="mn", + description="ZANABAZAR SQUARE VOWEL SIGN OE", + direction="nsm", + linebreak="cm", + unicodeslot=0x11A05, + }, + [0x11A06]={ + category="mn", + description="ZANABAZAR SQUARE VOWEL SIGN O", + direction="nsm", + linebreak="cm", + unicodeslot=0x11A06, + }, + [0x11A07]={ + category="mc", + description="ZANABAZAR SQUARE VOWEL SIGN AI", + direction="l", + linebreak="cm", + unicodeslot=0x11A07, + }, + [0x11A08]={ + category="mc", + description="ZANABAZAR SQUARE VOWEL SIGN AU", + direction="l", + linebreak="cm", + unicodeslot=0x11A08, + }, + [0x11A09]={ + category="mn", + description="ZANABAZAR SQUARE VOWEL SIGN REVERSED I", + direction="nsm", + linebreak="cm", + unicodeslot=0x11A09, + }, + [0x11A0A]={ + category="mn", + description="ZANABAZAR SQUARE VOWEL LENGTH MARK", + direction="nsm", + linebreak="cm", + unicodeslot=0x11A0A, + }, + [0x11A0B]={ + category="lo", + description="ZANABAZAR SQUARE LETTER KA", + direction="l", + linebreak="al", + unicodeslot=0x11A0B, + }, + [0x11A0C]={ + category="lo", + description="ZANABAZAR SQUARE LETTER KHA", + direction="l", + linebreak="al", + unicodeslot=0x11A0C, + }, + [0x11A0D]={ + category="lo", + description="ZANABAZAR SQUARE LETTER GA", + direction="l", + linebreak="al", + unicodeslot=0x11A0D, + }, + [0x11A0E]={ + category="lo", + description="ZANABAZAR SQUARE LETTER GHA", + direction="l", + linebreak="al", + unicodeslot=0x11A0E, + }, + [0x11A0F]={ + category="lo", + description="ZANABAZAR SQUARE LETTER NGA", + direction="l", + linebreak="al", + unicodeslot=0x11A0F, + }, + [0x11A10]={ + category="lo", + description="ZANABAZAR SQUARE LETTER CA", + direction="l", + linebreak="al", + unicodeslot=0x11A10, + }, + [0x11A11]={ + category="lo", + description="ZANABAZAR SQUARE LETTER CHA", + direction="l", + linebreak="al", + unicodeslot=0x11A11, + }, + [0x11A12]={ + category="lo", + description="ZANABAZAR SQUARE LETTER JA", + direction="l", + linebreak="al", + unicodeslot=0x11A12, + }, + [0x11A13]={ + category="lo", + description="ZANABAZAR SQUARE LETTER NYA", + direction="l", + linebreak="al", + unicodeslot=0x11A13, + }, + [0x11A14]={ + category="lo", + description="ZANABAZAR SQUARE LETTER TTA", + direction="l", + linebreak="al", + unicodeslot=0x11A14, + }, + [0x11A15]={ + category="lo", + description="ZANABAZAR SQUARE LETTER TTHA", + direction="l", + linebreak="al", + unicodeslot=0x11A15, + }, + [0x11A16]={ + category="lo", + description="ZANABAZAR SQUARE LETTER DDA", + direction="l", + linebreak="al", + unicodeslot=0x11A16, + }, + [0x11A17]={ + category="lo", + description="ZANABAZAR SQUARE LETTER DDHA", + direction="l", + linebreak="al", + unicodeslot=0x11A17, + }, + [0x11A18]={ + category="lo", + description="ZANABAZAR SQUARE LETTER NNA", + direction="l", + linebreak="al", + unicodeslot=0x11A18, + }, + [0x11A19]={ + category="lo", + description="ZANABAZAR SQUARE LETTER TA", + direction="l", + linebreak="al", + unicodeslot=0x11A19, + }, + [0x11A1A]={ + category="lo", + description="ZANABAZAR SQUARE LETTER THA", + direction="l", + linebreak="al", + unicodeslot=0x11A1A, + }, + [0x11A1B]={ + category="lo", + description="ZANABAZAR SQUARE LETTER DA", + direction="l", + linebreak="al", + unicodeslot=0x11A1B, + }, + [0x11A1C]={ + category="lo", + description="ZANABAZAR SQUARE LETTER DHA", + direction="l", + linebreak="al", + unicodeslot=0x11A1C, + }, + [0x11A1D]={ + category="lo", + description="ZANABAZAR SQUARE LETTER NA", + direction="l", + linebreak="al", + unicodeslot=0x11A1D, + }, + [0x11A1E]={ + category="lo", + description="ZANABAZAR SQUARE LETTER PA", + direction="l", + linebreak="al", + unicodeslot=0x11A1E, + }, + [0x11A1F]={ + category="lo", + description="ZANABAZAR SQUARE LETTER PHA", + direction="l", + linebreak="al", + unicodeslot=0x11A1F, + }, + [0x11A20]={ + category="lo", + description="ZANABAZAR SQUARE LETTER BA", + direction="l", + linebreak="al", + unicodeslot=0x11A20, + }, + [0x11A21]={ + category="lo", + description="ZANABAZAR SQUARE LETTER BHA", + direction="l", + linebreak="al", + unicodeslot=0x11A21, + }, + [0x11A22]={ + category="lo", + description="ZANABAZAR SQUARE LETTER MA", + direction="l", + linebreak="al", + unicodeslot=0x11A22, + }, + [0x11A23]={ + category="lo", + description="ZANABAZAR SQUARE LETTER TSA", + direction="l", + linebreak="al", + unicodeslot=0x11A23, + }, + [0x11A24]={ + category="lo", + description="ZANABAZAR SQUARE LETTER TSHA", + direction="l", + linebreak="al", + unicodeslot=0x11A24, + }, + [0x11A25]={ + category="lo", + description="ZANABAZAR SQUARE LETTER DZA", + direction="l", + linebreak="al", + unicodeslot=0x11A25, + }, + [0x11A26]={ + category="lo", + description="ZANABAZAR SQUARE LETTER DZHA", + direction="l", + linebreak="al", + unicodeslot=0x11A26, + }, + [0x11A27]={ + category="lo", + description="ZANABAZAR SQUARE LETTER ZHA", + direction="l", + linebreak="al", + unicodeslot=0x11A27, + }, + [0x11A28]={ + category="lo", + description="ZANABAZAR SQUARE LETTER ZA", + direction="l", + linebreak="al", + unicodeslot=0x11A28, + }, + [0x11A29]={ + category="lo", + description="ZANABAZAR SQUARE LETTER -A", + direction="l", + linebreak="al", + unicodeslot=0x11A29, + }, + [0x11A2A]={ + category="lo", + description="ZANABAZAR SQUARE LETTER YA", + direction="l", + linebreak="al", + unicodeslot=0x11A2A, + }, + [0x11A2B]={ + category="lo", + description="ZANABAZAR SQUARE LETTER RA", + direction="l", + linebreak="al", + unicodeslot=0x11A2B, + }, + [0x11A2C]={ + category="lo", + description="ZANABAZAR SQUARE LETTER LA", + direction="l", + linebreak="al", + unicodeslot=0x11A2C, + }, + [0x11A2D]={ + category="lo", + description="ZANABAZAR SQUARE LETTER VA", + direction="l", + linebreak="al", + unicodeslot=0x11A2D, + }, + [0x11A2E]={ + category="lo", + description="ZANABAZAR SQUARE LETTER SHA", + direction="l", + linebreak="al", + unicodeslot=0x11A2E, + }, + [0x11A2F]={ + category="lo", + description="ZANABAZAR SQUARE LETTER SSA", + direction="l", + linebreak="al", + unicodeslot=0x11A2F, + }, + [0x11A30]={ + category="lo", + description="ZANABAZAR SQUARE LETTER SA", + direction="l", + linebreak="al", + unicodeslot=0x11A30, + }, + [0x11A31]={ + category="lo", + description="ZANABAZAR SQUARE LETTER HA", + direction="l", + linebreak="al", + unicodeslot=0x11A31, + }, + [0x11A32]={ + category="lo", + description="ZANABAZAR SQUARE LETTER KSSA", + direction="l", + linebreak="al", + unicodeslot=0x11A32, + }, + [0x11A33]={ + category="mn", + description="ZANABAZAR SQUARE FINAL CONSONANT MARK", + direction="nsm", + linebreak="cm", + unicodeslot=0x11A33, + }, + [0x11A34]={ + category="mn", + combining=0x9, + description="ZANABAZAR SQUARE SIGN VIRAMA", + direction="nsm", + linebreak="cm", + unicodeslot=0x11A34, + }, + [0x11A35]={ + category="mn", + description="ZANABAZAR SQUARE SIGN CANDRABINDU", + direction="nsm", + linebreak="cm", + unicodeslot=0x11A35, + }, + [0x11A36]={ + category="mn", + description="ZANABAZAR SQUARE SIGN CANDRABINDU WITH ORNAMENT", + direction="nsm", + linebreak="cm", + unicodeslot=0x11A36, + }, + [0x11A37]={ + category="mn", + description="ZANABAZAR SQUARE SIGN CANDRA WITH ORNAMENT", + direction="nsm", + linebreak="cm", + unicodeslot=0x11A37, + }, + [0x11A38]={ + category="mn", + description="ZANABAZAR SQUARE SIGN ANUSVARA", + direction="nsm", + linebreak="cm", + unicodeslot=0x11A38, + }, + [0x11A39]={ + category="mc", + description="ZANABAZAR SQUARE SIGN VISARGA", + direction="l", + linebreak="cm", + unicodeslot=0x11A39, + }, + [0x11A3A]={ + category="lo", + description="ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA", + direction="l", + linebreak="al", + unicodeslot=0x11A3A, + }, + [0x11A3B]={ + category="mn", + description="ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA", + direction="nsm", + linebreak="cm", + unicodeslot=0x11A3B, + }, + [0x11A3C]={ + category="mn", + description="ZANABAZAR SQUARE CLUSTER-FINAL LETTER RA", + direction="nsm", + linebreak="cm", + unicodeslot=0x11A3C, + }, + [0x11A3D]={ + category="mn", + description="ZANABAZAR SQUARE CLUSTER-FINAL LETTER LA", + direction="nsm", + linebreak="cm", + unicodeslot=0x11A3D, + }, + [0x11A3E]={ + category="mn", + description="ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA", + direction="nsm", + linebreak="cm", + unicodeslot=0x11A3E, + }, + [0x11A3F]={ + category="po", + description="ZANABAZAR SQUARE INITIAL HEAD MARK", + direction="l", + linebreak="bb", + unicodeslot=0x11A3F, + }, + [0x11A40]={ + category="po", + description="ZANABAZAR SQUARE CLOSING HEAD MARK", + direction="l", + linebreak="al", + unicodeslot=0x11A40, + }, + [0x11A41]={ + category="po", + description="ZANABAZAR SQUARE MARK TSHEG", + direction="l", + linebreak="ba", + unicodeslot=0x11A41, + }, + [0x11A42]={ + category="po", + description="ZANABAZAR SQUARE MARK SHAD", + direction="l", + linebreak="ba", + unicodeslot=0x11A42, + }, + [0x11A43]={ + category="po", + description="ZANABAZAR SQUARE MARK DOUBLE SHAD", + direction="l", + linebreak="ba", + unicodeslot=0x11A43, + }, + [0x11A44]={ + category="po", + description="ZANABAZAR SQUARE MARK LONG TSHEG", + direction="l", + linebreak="ba", + unicodeslot=0x11A44, + }, + [0x11A45]={ + category="po", + description="ZANABAZAR SQUARE INITIAL DOUBLE-LINED HEAD MARK", + direction="l", + linebreak="bb", + unicodeslot=0x11A45, + }, + [0x11A46]={ + category="po", + description="ZANABAZAR SQUARE CLOSING DOUBLE-LINED HEAD MARK", + direction="l", + linebreak="al", + unicodeslot=0x11A46, + }, + [0x11A47]={ + category="mn", + combining=0x9, + description="ZANABAZAR SQUARE SUBJOINER", + direction="nsm", + linebreak="cm", + unicodeslot=0x11A47, + }, + [0x11A50]={ + category="lo", + description="SOYOMBO LETTER A", + direction="l", + linebreak="al", + unicodeslot=0x11A50, + }, + [0x11A51]={ + category="mn", + description="SOYOMBO VOWEL SIGN I", + direction="nsm", + linebreak="cm", + unicodeslot=0x11A51, + }, + [0x11A52]={ + category="mn", + description="SOYOMBO VOWEL SIGN UE", + direction="nsm", + linebreak="cm", + unicodeslot=0x11A52, + }, + [0x11A53]={ + category="mn", + description="SOYOMBO VOWEL SIGN U", + direction="nsm", + linebreak="cm", + unicodeslot=0x11A53, + }, + [0x11A54]={ + category="mn", + description="SOYOMBO VOWEL SIGN E", + direction="nsm", + linebreak="cm", + unicodeslot=0x11A54, + }, + [0x11A55]={ + category="mn", + description="SOYOMBO VOWEL SIGN O", + direction="nsm", + linebreak="cm", + unicodeslot=0x11A55, + }, + [0x11A56]={ + category="mn", + description="SOYOMBO VOWEL SIGN OE", + direction="nsm", + linebreak="cm", + unicodeslot=0x11A56, + }, + [0x11A57]={ + category="mc", + description="SOYOMBO VOWEL SIGN AI", + direction="l", + linebreak="cm", + unicodeslot=0x11A57, + }, + [0x11A58]={ + category="mc", + description="SOYOMBO VOWEL SIGN AU", + direction="l", + linebreak="cm", + unicodeslot=0x11A58, + }, + [0x11A59]={ + category="mn", + description="SOYOMBO VOWEL SIGN VOCALIC R", + direction="nsm", + linebreak="cm", + unicodeslot=0x11A59, + }, + [0x11A5A]={ + category="mn", + description="SOYOMBO VOWEL SIGN VOCALIC L", + direction="nsm", + linebreak="cm", + unicodeslot=0x11A5A, + }, + [0x11A5B]={ + category="mn", + description="SOYOMBO VOWEL LENGTH MARK", + direction="nsm", + linebreak="cm", + unicodeslot=0x11A5B, + }, + [0x11A5C]={ + category="lo", + description="SOYOMBO LETTER KA", + direction="l", + linebreak="al", + unicodeslot=0x11A5C, + }, + [0x11A5D]={ + category="lo", + description="SOYOMBO LETTER KHA", + direction="l", + linebreak="al", + unicodeslot=0x11A5D, + }, + [0x11A5E]={ + category="lo", + description="SOYOMBO LETTER GA", + direction="l", + linebreak="al", + unicodeslot=0x11A5E, + }, + [0x11A5F]={ + category="lo", + description="SOYOMBO LETTER GHA", + direction="l", + linebreak="al", + unicodeslot=0x11A5F, + }, + [0x11A60]={ + category="lo", + description="SOYOMBO LETTER NGA", + direction="l", + linebreak="al", + unicodeslot=0x11A60, + }, + [0x11A61]={ + category="lo", + description="SOYOMBO LETTER CA", + direction="l", + linebreak="al", + unicodeslot=0x11A61, + }, + [0x11A62]={ + category="lo", + description="SOYOMBO LETTER CHA", + direction="l", + linebreak="al", + unicodeslot=0x11A62, + }, + [0x11A63]={ + category="lo", + description="SOYOMBO LETTER JA", + direction="l", + linebreak="al", + unicodeslot=0x11A63, + }, + [0x11A64]={ + category="lo", + description="SOYOMBO LETTER JHA", + direction="l", + linebreak="al", + unicodeslot=0x11A64, + }, + [0x11A65]={ + category="lo", + description="SOYOMBO LETTER NYA", + direction="l", + linebreak="al", + unicodeslot=0x11A65, + }, + [0x11A66]={ + category="lo", + description="SOYOMBO LETTER TTA", + direction="l", + linebreak="al", + unicodeslot=0x11A66, + }, + [0x11A67]={ + category="lo", + description="SOYOMBO LETTER TTHA", + direction="l", + linebreak="al", + unicodeslot=0x11A67, + }, + [0x11A68]={ + category="lo", + description="SOYOMBO LETTER DDA", + direction="l", + linebreak="al", + unicodeslot=0x11A68, + }, + [0x11A69]={ + category="lo", + description="SOYOMBO LETTER DDHA", + direction="l", + linebreak="al", + unicodeslot=0x11A69, + }, + [0x11A6A]={ + category="lo", + description="SOYOMBO LETTER NNA", + direction="l", + linebreak="al", + unicodeslot=0x11A6A, + }, + [0x11A6B]={ + category="lo", + description="SOYOMBO LETTER TA", + direction="l", + linebreak="al", + unicodeslot=0x11A6B, + }, + [0x11A6C]={ + category="lo", + description="SOYOMBO LETTER THA", + direction="l", + linebreak="al", + unicodeslot=0x11A6C, + }, + [0x11A6D]={ + category="lo", + description="SOYOMBO LETTER DA", + direction="l", + linebreak="al", + unicodeslot=0x11A6D, + }, + [0x11A6E]={ + category="lo", + description="SOYOMBO LETTER DHA", + direction="l", + linebreak="al", + unicodeslot=0x11A6E, + }, + [0x11A6F]={ + category="lo", + description="SOYOMBO LETTER NA", + direction="l", + linebreak="al", + unicodeslot=0x11A6F, + }, + [0x11A70]={ + category="lo", + description="SOYOMBO LETTER PA", + direction="l", + linebreak="al", + unicodeslot=0x11A70, + }, + [0x11A71]={ + category="lo", + description="SOYOMBO LETTER PHA", + direction="l", + linebreak="al", + unicodeslot=0x11A71, + }, + [0x11A72]={ + category="lo", + description="SOYOMBO LETTER BA", + direction="l", + linebreak="al", + unicodeslot=0x11A72, + }, + [0x11A73]={ + category="lo", + description="SOYOMBO LETTER BHA", + direction="l", + linebreak="al", + unicodeslot=0x11A73, + }, + [0x11A74]={ + category="lo", + description="SOYOMBO LETTER MA", + direction="l", + linebreak="al", + unicodeslot=0x11A74, + }, + [0x11A75]={ + category="lo", + description="SOYOMBO LETTER TSA", + direction="l", + linebreak="al", + unicodeslot=0x11A75, + }, + [0x11A76]={ + category="lo", + description="SOYOMBO LETTER TSHA", + direction="l", + linebreak="al", + unicodeslot=0x11A76, + }, + [0x11A77]={ + category="lo", + description="SOYOMBO LETTER DZA", + direction="l", + linebreak="al", + unicodeslot=0x11A77, + }, + [0x11A78]={ + category="lo", + description="SOYOMBO LETTER ZHA", + direction="l", + linebreak="al", + unicodeslot=0x11A78, + }, + [0x11A79]={ + category="lo", + description="SOYOMBO LETTER ZA", + direction="l", + linebreak="al", + unicodeslot=0x11A79, + }, + [0x11A7A]={ + category="lo", + description="SOYOMBO LETTER -A", + direction="l", + linebreak="al", + unicodeslot=0x11A7A, + }, + [0x11A7B]={ + category="lo", + description="SOYOMBO LETTER YA", + direction="l", + linebreak="al", + unicodeslot=0x11A7B, + }, + [0x11A7C]={ + category="lo", + description="SOYOMBO LETTER RA", + direction="l", + linebreak="al", + unicodeslot=0x11A7C, + }, + [0x11A7D]={ + category="lo", + description="SOYOMBO LETTER LA", + direction="l", + linebreak="al", + unicodeslot=0x11A7D, + }, + [0x11A7E]={ + category="lo", + description="SOYOMBO LETTER VA", + direction="l", + linebreak="al", + unicodeslot=0x11A7E, + }, + [0x11A7F]={ + category="lo", + description="SOYOMBO LETTER SHA", + direction="l", + linebreak="al", + unicodeslot=0x11A7F, + }, + [0x11A80]={ + category="lo", + description="SOYOMBO LETTER SSA", + direction="l", + linebreak="al", + unicodeslot=0x11A80, + }, + [0x11A81]={ + category="lo", + description="SOYOMBO LETTER SA", + direction="l", + linebreak="al", + unicodeslot=0x11A81, + }, + [0x11A82]={ + category="lo", + description="SOYOMBO LETTER HA", + direction="l", + linebreak="al", + unicodeslot=0x11A82, + }, + [0x11A83]={ + category="lo", + description="SOYOMBO LETTER KSSA", + direction="l", + linebreak="al", + unicodeslot=0x11A83, + }, + [0x11A86]={ + category="lo", + description="SOYOMBO CLUSTER-INITIAL LETTER RA", + direction="l", + linebreak="al", + unicodeslot=0x11A86, + }, + [0x11A87]={ + category="lo", + description="SOYOMBO CLUSTER-INITIAL LETTER LA", + direction="l", + linebreak="al", + unicodeslot=0x11A87, + }, + [0x11A88]={ + category="lo", + description="SOYOMBO CLUSTER-INITIAL LETTER SHA", + direction="l", + linebreak="al", + unicodeslot=0x11A88, + }, + [0x11A89]={ + category="lo", + description="SOYOMBO CLUSTER-INITIAL LETTER SA", + direction="l", + linebreak="al", + unicodeslot=0x11A89, + }, + [0x11A8A]={ + category="mn", + description="SOYOMBO FINAL CONSONANT SIGN G", + direction="nsm", + linebreak="cm", + unicodeslot=0x11A8A, + }, + [0x11A8B]={ + category="mn", + description="SOYOMBO FINAL CONSONANT SIGN K", + direction="nsm", + linebreak="cm", + unicodeslot=0x11A8B, + }, + [0x11A8C]={ + category="mn", + description="SOYOMBO FINAL CONSONANT SIGN NG", + direction="nsm", + linebreak="cm", + unicodeslot=0x11A8C, + }, + [0x11A8D]={ + category="mn", + description="SOYOMBO FINAL CONSONANT SIGN D", + direction="nsm", + linebreak="cm", + unicodeslot=0x11A8D, + }, + [0x11A8E]={ + category="mn", + description="SOYOMBO FINAL CONSONANT SIGN N", + direction="nsm", + linebreak="cm", + unicodeslot=0x11A8E, + }, + [0x11A8F]={ + category="mn", + description="SOYOMBO FINAL CONSONANT SIGN B", + direction="nsm", + linebreak="cm", + unicodeslot=0x11A8F, + }, + [0x11A90]={ + category="mn", + description="SOYOMBO FINAL CONSONANT SIGN M", + direction="nsm", + linebreak="cm", + unicodeslot=0x11A90, + }, + [0x11A91]={ + category="mn", + description="SOYOMBO FINAL CONSONANT SIGN R", + direction="nsm", + linebreak="cm", + unicodeslot=0x11A91, + }, + [0x11A92]={ + category="mn", + description="SOYOMBO FINAL CONSONANT SIGN L", + direction="nsm", + linebreak="cm", + unicodeslot=0x11A92, + }, + [0x11A93]={ + category="mn", + description="SOYOMBO FINAL CONSONANT SIGN SH", + direction="nsm", + linebreak="cm", + unicodeslot=0x11A93, + }, + [0x11A94]={ + category="mn", + description="SOYOMBO FINAL CONSONANT SIGN S", + direction="nsm", + linebreak="cm", + unicodeslot=0x11A94, + }, + [0x11A95]={ + category="mn", + description="SOYOMBO FINAL CONSONANT SIGN -A", + direction="nsm", + linebreak="cm", + unicodeslot=0x11A95, + }, + [0x11A96]={ + category="mn", + description="SOYOMBO SIGN ANUSVARA", + direction="nsm", + linebreak="cm", + unicodeslot=0x11A96, + }, + [0x11A97]={ + category="mc", + description="SOYOMBO SIGN VISARGA", + direction="l", + linebreak="cm", + unicodeslot=0x11A97, + }, + [0x11A98]={ + category="mn", + description="SOYOMBO GEMINATION MARK", + direction="nsm", + linebreak="cm", + unicodeslot=0x11A98, + }, + [0x11A99]={ + category="mn", + combining=0x9, + description="SOYOMBO SUBJOINER", + direction="nsm", + linebreak="cm", + unicodeslot=0x11A99, + }, + [0x11A9A]={ + category="po", + description="SOYOMBO MARK TSHEG", + direction="l", + linebreak="ba", + unicodeslot=0x11A9A, + }, + [0x11A9B]={ + category="po", + description="SOYOMBO MARK SHAD", + direction="l", + linebreak="ba", + unicodeslot=0x11A9B, + }, + [0x11A9C]={ + category="po", + description="SOYOMBO MARK DOUBLE SHAD", + direction="l", + linebreak="ba", + unicodeslot=0x11A9C, + }, + [0x11A9E]={ + category="po", + description="SOYOMBO HEAD MARK WITH MOON AND SUN AND TRIPLE FLAME", + direction="l", + linebreak="bb", + unicodeslot=0x11A9E, + }, + [0x11A9F]={ + category="po", + description="SOYOMBO HEAD MARK WITH MOON AND SUN AND FLAME", + direction="l", + linebreak="bb", + unicodeslot=0x11A9F, + }, + [0x11AA0]={ + category="po", + description="SOYOMBO HEAD MARK WITH MOON AND SUN", + direction="l", + linebreak="bb", + unicodeslot=0x11AA0, + }, + [0x11AA1]={ + category="po", + description="SOYOMBO TERMINAL MARK-1", + direction="l", + linebreak="ba", + unicodeslot=0x11AA1, + }, + [0x11AA2]={ + category="po", + description="SOYOMBO TERMINAL MARK-2", + direction="l", + linebreak="ba", + unicodeslot=0x11AA2, + }, [0x11AC0]={ category="lo", description="PAU CIN HAU LETTER PA", @@ -163283,6 +164760,534 @@ characters.data={ linebreak="cm", unicodeslot=0x11CB6, }, + [0x11D00]={ + category="lo", + description="MASARAM GONDI LETTER A", + direction="l", + linebreak="al", + unicodeslot=0x11D00, + }, + [0x11D01]={ + category="lo", + description="MASARAM GONDI LETTER AA", + direction="l", + linebreak="al", + unicodeslot=0x11D01, + }, + [0x11D02]={ + category="lo", + description="MASARAM GONDI LETTER I", + direction="l", + linebreak="al", + unicodeslot=0x11D02, + }, + [0x11D03]={ + category="lo", + description="MASARAM GONDI LETTER II", + direction="l", + linebreak="al", + unicodeslot=0x11D03, + }, + [0x11D04]={ + category="lo", + description="MASARAM GONDI LETTER U", + direction="l", + linebreak="al", + unicodeslot=0x11D04, + }, + [0x11D05]={ + category="lo", + description="MASARAM GONDI LETTER UU", + direction="l", + linebreak="al", + unicodeslot=0x11D05, + }, + [0x11D06]={ + category="lo", + description="MASARAM GONDI LETTER E", + direction="l", + linebreak="al", + unicodeslot=0x11D06, + }, + [0x11D08]={ + category="lo", + description="MASARAM GONDI LETTER AI", + direction="l", + linebreak="al", + unicodeslot=0x11D08, + }, + [0x11D09]={ + category="lo", + description="MASARAM GONDI LETTER O", + direction="l", + linebreak="al", + unicodeslot=0x11D09, + }, + [0x11D0B]={ + category="lo", + description="MASARAM GONDI LETTER AU", + direction="l", + linebreak="al", + unicodeslot=0x11D0B, + }, + [0x11D0C]={ + category="lo", + description="MASARAM GONDI LETTER KA", + direction="l", + linebreak="al", + unicodeslot=0x11D0C, + }, + [0x11D0D]={ + category="lo", + description="MASARAM GONDI LETTER KHA", + direction="l", + linebreak="al", + unicodeslot=0x11D0D, + }, + [0x11D0E]={ + category="lo", + description="MASARAM GONDI LETTER GA", + direction="l", + linebreak="al", + unicodeslot=0x11D0E, + }, + [0x11D0F]={ + category="lo", + description="MASARAM GONDI LETTER GHA", + direction="l", + linebreak="al", + unicodeslot=0x11D0F, + }, + [0x11D10]={ + category="lo", + description="MASARAM GONDI LETTER NGA", + direction="l", + linebreak="al", + unicodeslot=0x11D10, + }, + [0x11D11]={ + category="lo", + description="MASARAM GONDI LETTER CA", + direction="l", + linebreak="al", + unicodeslot=0x11D11, + }, + [0x11D12]={ + category="lo", + description="MASARAM GONDI LETTER CHA", + direction="l", + linebreak="al", + unicodeslot=0x11D12, + }, + [0x11D13]={ + category="lo", + description="MASARAM GONDI LETTER JA", + direction="l", + linebreak="al", + unicodeslot=0x11D13, + }, + [0x11D14]={ + category="lo", + description="MASARAM GONDI LETTER JHA", + direction="l", + linebreak="al", + unicodeslot=0x11D14, + }, + [0x11D15]={ + category="lo", + description="MASARAM GONDI LETTER NYA", + direction="l", + linebreak="al", + unicodeslot=0x11D15, + }, + [0x11D16]={ + category="lo", + description="MASARAM GONDI LETTER TTA", + direction="l", + linebreak="al", + unicodeslot=0x11D16, + }, + [0x11D17]={ + category="lo", + description="MASARAM GONDI LETTER TTHA", + direction="l", + linebreak="al", + unicodeslot=0x11D17, + }, + [0x11D18]={ + category="lo", + description="MASARAM GONDI LETTER DDA", + direction="l", + linebreak="al", + unicodeslot=0x11D18, + }, + [0x11D19]={ + category="lo", + description="MASARAM GONDI LETTER DDHA", + direction="l", + linebreak="al", + unicodeslot=0x11D19, + }, + [0x11D1A]={ + category="lo", + description="MASARAM GONDI LETTER NNA", + direction="l", + linebreak="al", + unicodeslot=0x11D1A, + }, + [0x11D1B]={ + category="lo", + description="MASARAM GONDI LETTER TA", + direction="l", + linebreak="al", + unicodeslot=0x11D1B, + }, + [0x11D1C]={ + category="lo", + description="MASARAM GONDI LETTER THA", + direction="l", + linebreak="al", + unicodeslot=0x11D1C, + }, + [0x11D1D]={ + category="lo", + description="MASARAM GONDI LETTER DA", + direction="l", + linebreak="al", + unicodeslot=0x11D1D, + }, + [0x11D1E]={ + category="lo", + description="MASARAM GONDI LETTER DHA", + direction="l", + linebreak="al", + unicodeslot=0x11D1E, + }, + [0x11D1F]={ + category="lo", + description="MASARAM GONDI LETTER NA", + direction="l", + linebreak="al", + unicodeslot=0x11D1F, + }, + [0x11D20]={ + category="lo", + description="MASARAM GONDI LETTER PA", + direction="l", + linebreak="al", + unicodeslot=0x11D20, + }, + [0x11D21]={ + category="lo", + description="MASARAM GONDI LETTER PHA", + direction="l", + linebreak="al", + unicodeslot=0x11D21, + }, + [0x11D22]={ + category="lo", + description="MASARAM GONDI LETTER BA", + direction="l", + linebreak="al", + unicodeslot=0x11D22, + }, + [0x11D23]={ + category="lo", + description="MASARAM GONDI LETTER BHA", + direction="l", + linebreak="al", + unicodeslot=0x11D23, + }, + [0x11D24]={ + category="lo", + description="MASARAM GONDI LETTER MA", + direction="l", + linebreak="al", + unicodeslot=0x11D24, + }, + [0x11D25]={ + category="lo", + description="MASARAM GONDI LETTER YA", + direction="l", + linebreak="al", + unicodeslot=0x11D25, + }, + [0x11D26]={ + category="lo", + description="MASARAM GONDI LETTER RA", + direction="l", + linebreak="al", + unicodeslot=0x11D26, + }, + [0x11D27]={ + category="lo", + description="MASARAM GONDI LETTER LA", + direction="l", + linebreak="al", + unicodeslot=0x11D27, + }, + [0x11D28]={ + category="lo", + description="MASARAM GONDI LETTER VA", + direction="l", + linebreak="al", + unicodeslot=0x11D28, + }, + [0x11D29]={ + category="lo", + description="MASARAM GONDI LETTER SHA", + direction="l", + linebreak="al", + unicodeslot=0x11D29, + }, + [0x11D2A]={ + category="lo", + description="MASARAM GONDI LETTER SSA", + direction="l", + linebreak="al", + unicodeslot=0x11D2A, + }, + [0x11D2B]={ + category="lo", + description="MASARAM GONDI LETTER SA", + direction="l", + linebreak="al", + unicodeslot=0x11D2B, + }, + [0x11D2C]={ + category="lo", + description="MASARAM GONDI LETTER HA", + direction="l", + linebreak="al", + unicodeslot=0x11D2C, + }, + [0x11D2D]={ + category="lo", + description="MASARAM GONDI LETTER LLA", + direction="l", + linebreak="al", + unicodeslot=0x11D2D, + }, + [0x11D2E]={ + category="lo", + description="MASARAM GONDI LETTER KSSA", + direction="l", + linebreak="al", + unicodeslot=0x11D2E, + }, + [0x11D2F]={ + category="lo", + description="MASARAM GONDI LETTER JNYA", + direction="l", + linebreak="al", + unicodeslot=0x11D2F, + }, + [0x11D30]={ + category="lo", + description="MASARAM GONDI LETTER TRA", + direction="l", + linebreak="al", + unicodeslot=0x11D30, + }, + [0x11D31]={ + category="mn", + description="MASARAM GONDI VOWEL SIGN AA", + direction="nsm", + linebreak="cm", + unicodeslot=0x11D31, + }, + [0x11D32]={ + category="mn", + description="MASARAM GONDI VOWEL SIGN I", + direction="nsm", + linebreak="cm", + unicodeslot=0x11D32, + }, + [0x11D33]={ + category="mn", + description="MASARAM GONDI VOWEL SIGN II", + direction="nsm", + linebreak="cm", + unicodeslot=0x11D33, + }, + [0x11D34]={ + category="mn", + description="MASARAM GONDI VOWEL SIGN U", + direction="nsm", + linebreak="cm", + unicodeslot=0x11D34, + }, + [0x11D35]={ + category="mn", + description="MASARAM GONDI VOWEL SIGN UU", + direction="nsm", + linebreak="cm", + unicodeslot=0x11D35, + }, + [0x11D36]={ + category="mn", + description="MASARAM GONDI VOWEL SIGN VOCALIC R", + direction="nsm", + linebreak="cm", + unicodeslot=0x11D36, + }, + [0x11D3A]={ + category="mn", + description="MASARAM GONDI VOWEL SIGN E", + direction="nsm", + linebreak="cm", + unicodeslot=0x11D3A, + }, + [0x11D3C]={ + category="mn", + description="MASARAM GONDI VOWEL SIGN AI", + direction="nsm", + linebreak="cm", + unicodeslot=0x11D3C, + }, + [0x11D3D]={ + category="mn", + description="MASARAM GONDI VOWEL SIGN O", + direction="nsm", + linebreak="cm", + unicodeslot=0x11D3D, + }, + [0x11D3F]={ + category="mn", + description="MASARAM GONDI VOWEL SIGN AU", + direction="nsm", + linebreak="cm", + unicodeslot=0x11D3F, + }, + [0x11D40]={ + category="mn", + description="MASARAM GONDI SIGN ANUSVARA", + direction="nsm", + linebreak="cm", + unicodeslot=0x11D40, + }, + [0x11D41]={ + category="mn", + description="MASARAM GONDI SIGN VISARGA", + direction="nsm", + linebreak="cm", + unicodeslot=0x11D41, + }, + [0x11D42]={ + category="mn", + combining=0x7, + description="MASARAM GONDI SIGN NUKTA", + direction="nsm", + linebreak="cm", + unicodeslot=0x11D42, + }, + [0x11D43]={ + category="mn", + description="MASARAM GONDI SIGN CANDRA", + direction="nsm", + linebreak="cm", + unicodeslot=0x11D43, + }, + [0x11D44]={ + category="mn", + combining=0x9, + description="MASARAM GONDI SIGN HALANTA", + direction="nsm", + linebreak="cm", + unicodeslot=0x11D44, + }, + [0x11D45]={ + category="mn", + combining=0x9, + description="MASARAM GONDI VIRAMA", + direction="nsm", + linebreak="cm", + unicodeslot=0x11D45, + }, + [0x11D46]={ + category="lo", + description="MASARAM GONDI REPHA", + direction="l", + linebreak="al", + unicodeslot=0x11D46, + }, + [0x11D47]={ + category="mn", + description="MASARAM GONDI RA-KARA", + direction="nsm", + linebreak="cm", + unicodeslot=0x11D47, + }, + [0x11D50]={ + category="nd", + description="MASARAM GONDI DIGIT ZERO", + direction="l", + linebreak="nu", + unicodeslot=0x11D50, + }, + [0x11D51]={ + category="nd", + description="MASARAM GONDI DIGIT ONE", + direction="l", + linebreak="nu", + unicodeslot=0x11D51, + }, + [0x11D52]={ + category="nd", + description="MASARAM GONDI DIGIT TWO", + direction="l", + linebreak="nu", + unicodeslot=0x11D52, + }, + [0x11D53]={ + category="nd", + description="MASARAM GONDI DIGIT THREE", + direction="l", + linebreak="nu", + unicodeslot=0x11D53, + }, + [0x11D54]={ + category="nd", + description="MASARAM GONDI DIGIT FOUR", + direction="l", + linebreak="nu", + unicodeslot=0x11D54, + }, + [0x11D55]={ + category="nd", + description="MASARAM GONDI DIGIT FIVE", + direction="l", + linebreak="nu", + unicodeslot=0x11D55, + }, + [0x11D56]={ + category="nd", + description="MASARAM GONDI DIGIT SIX", + direction="l", + linebreak="nu", + unicodeslot=0x11D56, + }, + [0x11D57]={ + category="nd", + description="MASARAM GONDI DIGIT SEVEN", + direction="l", + linebreak="nu", + unicodeslot=0x11D57, + }, + [0x11D58]={ + category="nd", + description="MASARAM GONDI DIGIT EIGHT", + direction="l", + linebreak="nu", + unicodeslot=0x11D58, + }, + [0x11D59]={ + category="nd", + description="MASARAM GONDI DIGIT NINE", + direction="l", + linebreak="nu", + unicodeslot=0x11D59, + }, [0x12000]={ category="lo", description="CUNEIFORM SIGN A", @@ -189877,6 +191882,14 @@ characters.data={ linebreak="ns", unicodeslot=0x16FE0, }, + [0x16FE1]={ + category="lm", + cjkwd="w", + description="NUSHU ITERATION MARK", + direction="l", + linebreak="ns", + unicodeslot=0x16FE1, + }, [0x18800]={ category="lo", cjkwd="w", @@ -195933,6 +197946,5454 @@ characters.data={ linebreak="id", unicodeslot=0x1B001, }, + [0x1B002]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER A-1", + direction="l", + linebreak="id", + unicodeslot=0x1B002, + }, + [0x1B003]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER A-2", + direction="l", + linebreak="id", + unicodeslot=0x1B003, + }, + [0x1B004]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER A-3", + direction="l", + linebreak="id", + unicodeslot=0x1B004, + }, + [0x1B005]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER A-WO", + direction="l", + linebreak="id", + unicodeslot=0x1B005, + }, + [0x1B006]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER I-1", + direction="l", + linebreak="id", + unicodeslot=0x1B006, + }, + [0x1B007]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER I-2", + direction="l", + linebreak="id", + unicodeslot=0x1B007, + }, + [0x1B008]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER I-3", + direction="l", + linebreak="id", + unicodeslot=0x1B008, + }, + [0x1B009]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER I-4", + direction="l", + linebreak="id", + unicodeslot=0x1B009, + }, + [0x1B00A]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER U-1", + direction="l", + linebreak="id", + unicodeslot=0x1B00A, + }, + [0x1B00B]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER U-2", + direction="l", + linebreak="id", + unicodeslot=0x1B00B, + }, + [0x1B00C]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER U-3", + direction="l", + linebreak="id", + unicodeslot=0x1B00C, + }, + [0x1B00D]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER U-4", + direction="l", + linebreak="id", + unicodeslot=0x1B00D, + }, + [0x1B00E]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER U-5", + direction="l", + linebreak="id", + unicodeslot=0x1B00E, + }, + [0x1B00F]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER E-2", + direction="l", + linebreak="id", + unicodeslot=0x1B00F, + }, + [0x1B010]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER E-3", + direction="l", + linebreak="id", + unicodeslot=0x1B010, + }, + [0x1B011]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER E-4", + direction="l", + linebreak="id", + unicodeslot=0x1B011, + }, + [0x1B012]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER E-5", + direction="l", + linebreak="id", + unicodeslot=0x1B012, + }, + [0x1B013]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER E-6", + direction="l", + linebreak="id", + unicodeslot=0x1B013, + }, + [0x1B014]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER O-1", + direction="l", + linebreak="id", + unicodeslot=0x1B014, + }, + [0x1B015]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER O-2", + direction="l", + linebreak="id", + unicodeslot=0x1B015, + }, + [0x1B016]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER O-3", + direction="l", + linebreak="id", + unicodeslot=0x1B016, + }, + [0x1B017]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER KA-1", + direction="l", + linebreak="id", + unicodeslot=0x1B017, + }, + [0x1B018]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER KA-2", + direction="l", + linebreak="id", + unicodeslot=0x1B018, + }, + [0x1B019]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER KA-3", + direction="l", + linebreak="id", + unicodeslot=0x1B019, + }, + [0x1B01A]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER KA-4", + direction="l", + linebreak="id", + unicodeslot=0x1B01A, + }, + [0x1B01B]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER KA-5", + direction="l", + linebreak="id", + unicodeslot=0x1B01B, + }, + [0x1B01C]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER KA-6", + direction="l", + linebreak="id", + unicodeslot=0x1B01C, + }, + [0x1B01D]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER KA-7", + direction="l", + linebreak="id", + unicodeslot=0x1B01D, + }, + [0x1B01E]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER KA-8", + direction="l", + linebreak="id", + unicodeslot=0x1B01E, + }, + [0x1B01F]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER KA-9", + direction="l", + linebreak="id", + unicodeslot=0x1B01F, + }, + [0x1B020]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER KA-10", + direction="l", + linebreak="id", + unicodeslot=0x1B020, + }, + [0x1B021]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER KA-11", + direction="l", + linebreak="id", + unicodeslot=0x1B021, + }, + [0x1B022]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER KA-KE", + direction="l", + linebreak="id", + unicodeslot=0x1B022, + }, + [0x1B023]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER KI-1", + direction="l", + linebreak="id", + unicodeslot=0x1B023, + }, + [0x1B024]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER KI-2", + direction="l", + linebreak="id", + unicodeslot=0x1B024, + }, + [0x1B025]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER KI-3", + direction="l", + linebreak="id", + unicodeslot=0x1B025, + }, + [0x1B026]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER KI-4", + direction="l", + linebreak="id", + unicodeslot=0x1B026, + }, + [0x1B027]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER KI-5", + direction="l", + linebreak="id", + unicodeslot=0x1B027, + }, + [0x1B028]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER KI-6", + direction="l", + linebreak="id", + unicodeslot=0x1B028, + }, + [0x1B029]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER KI-7", + direction="l", + linebreak="id", + unicodeslot=0x1B029, + }, + [0x1B02A]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER KI-8", + direction="l", + linebreak="id", + unicodeslot=0x1B02A, + }, + [0x1B02B]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER KU-1", + direction="l", + linebreak="id", + unicodeslot=0x1B02B, + }, + [0x1B02C]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER KU-2", + direction="l", + linebreak="id", + unicodeslot=0x1B02C, + }, + [0x1B02D]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER KU-3", + direction="l", + linebreak="id", + unicodeslot=0x1B02D, + }, + [0x1B02E]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER KU-4", + direction="l", + linebreak="id", + unicodeslot=0x1B02E, + }, + [0x1B02F]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER KU-5", + direction="l", + linebreak="id", + unicodeslot=0x1B02F, + }, + [0x1B030]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER KU-6", + direction="l", + linebreak="id", + unicodeslot=0x1B030, + }, + [0x1B031]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER KU-7", + direction="l", + linebreak="id", + unicodeslot=0x1B031, + }, + [0x1B032]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER KE-1", + direction="l", + linebreak="id", + unicodeslot=0x1B032, + }, + [0x1B033]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER KE-2", + direction="l", + linebreak="id", + unicodeslot=0x1B033, + }, + [0x1B034]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER KE-3", + direction="l", + linebreak="id", + unicodeslot=0x1B034, + }, + [0x1B035]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER KE-4", + direction="l", + linebreak="id", + unicodeslot=0x1B035, + }, + [0x1B036]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER KE-5", + direction="l", + linebreak="id", + unicodeslot=0x1B036, + }, + [0x1B037]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER KE-6", + direction="l", + linebreak="id", + unicodeslot=0x1B037, + }, + [0x1B038]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER KO-1", + direction="l", + linebreak="id", + unicodeslot=0x1B038, + }, + [0x1B039]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER KO-2", + direction="l", + linebreak="id", + unicodeslot=0x1B039, + }, + [0x1B03A]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER KO-3", + direction="l", + linebreak="id", + unicodeslot=0x1B03A, + }, + [0x1B03B]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER KO-KI", + direction="l", + linebreak="id", + unicodeslot=0x1B03B, + }, + [0x1B03C]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER SA-1", + direction="l", + linebreak="id", + unicodeslot=0x1B03C, + }, + [0x1B03D]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER SA-2", + direction="l", + linebreak="id", + unicodeslot=0x1B03D, + }, + [0x1B03E]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER SA-3", + direction="l", + linebreak="id", + unicodeslot=0x1B03E, + }, + [0x1B03F]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER SA-4", + direction="l", + linebreak="id", + unicodeslot=0x1B03F, + }, + [0x1B040]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER SA-5", + direction="l", + linebreak="id", + unicodeslot=0x1B040, + }, + [0x1B041]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER SA-6", + direction="l", + linebreak="id", + unicodeslot=0x1B041, + }, + [0x1B042]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER SA-7", + direction="l", + linebreak="id", + unicodeslot=0x1B042, + }, + [0x1B043]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER SA-8", + direction="l", + linebreak="id", + unicodeslot=0x1B043, + }, + [0x1B044]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER SI-1", + direction="l", + linebreak="id", + unicodeslot=0x1B044, + }, + [0x1B045]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER SI-2", + direction="l", + linebreak="id", + unicodeslot=0x1B045, + }, + [0x1B046]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER SI-3", + direction="l", + linebreak="id", + unicodeslot=0x1B046, + }, + [0x1B047]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER SI-4", + direction="l", + linebreak="id", + unicodeslot=0x1B047, + }, + [0x1B048]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER SI-5", + direction="l", + linebreak="id", + unicodeslot=0x1B048, + }, + [0x1B049]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER SI-6", + direction="l", + linebreak="id", + unicodeslot=0x1B049, + }, + [0x1B04A]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER SU-1", + direction="l", + linebreak="id", + unicodeslot=0x1B04A, + }, + [0x1B04B]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER SU-2", + direction="l", + linebreak="id", + unicodeslot=0x1B04B, + }, + [0x1B04C]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER SU-3", + direction="l", + linebreak="id", + unicodeslot=0x1B04C, + }, + [0x1B04D]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER SU-4", + direction="l", + linebreak="id", + unicodeslot=0x1B04D, + }, + [0x1B04E]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER SU-5", + direction="l", + linebreak="id", + unicodeslot=0x1B04E, + }, + [0x1B04F]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER SU-6", + direction="l", + linebreak="id", + unicodeslot=0x1B04F, + }, + [0x1B050]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER SU-7", + direction="l", + linebreak="id", + unicodeslot=0x1B050, + }, + [0x1B051]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER SU-8", + direction="l", + linebreak="id", + unicodeslot=0x1B051, + }, + [0x1B052]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER SE-1", + direction="l", + linebreak="id", + unicodeslot=0x1B052, + }, + [0x1B053]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER SE-2", + direction="l", + linebreak="id", + unicodeslot=0x1B053, + }, + [0x1B054]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER SE-3", + direction="l", + linebreak="id", + unicodeslot=0x1B054, + }, + [0x1B055]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER SE-4", + direction="l", + linebreak="id", + unicodeslot=0x1B055, + }, + [0x1B056]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER SE-5", + direction="l", + linebreak="id", + unicodeslot=0x1B056, + }, + [0x1B057]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER SO-1", + direction="l", + linebreak="id", + unicodeslot=0x1B057, + }, + [0x1B058]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER SO-2", + direction="l", + linebreak="id", + unicodeslot=0x1B058, + }, + [0x1B059]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER SO-3", + direction="l", + linebreak="id", + unicodeslot=0x1B059, + }, + [0x1B05A]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER SO-4", + direction="l", + linebreak="id", + unicodeslot=0x1B05A, + }, + [0x1B05B]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER SO-5", + direction="l", + linebreak="id", + unicodeslot=0x1B05B, + }, + [0x1B05C]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER SO-6", + direction="l", + linebreak="id", + unicodeslot=0x1B05C, + }, + [0x1B05D]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER SO-7", + direction="l", + linebreak="id", + unicodeslot=0x1B05D, + }, + [0x1B05E]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER TA-1", + direction="l", + linebreak="id", + unicodeslot=0x1B05E, + }, + [0x1B05F]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER TA-2", + direction="l", + linebreak="id", + unicodeslot=0x1B05F, + }, + [0x1B060]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER TA-3", + direction="l", + linebreak="id", + unicodeslot=0x1B060, + }, + [0x1B061]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER TA-4", + direction="l", + linebreak="id", + unicodeslot=0x1B061, + }, + [0x1B062]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER TI-1", + direction="l", + linebreak="id", + unicodeslot=0x1B062, + }, + [0x1B063]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER TI-2", + direction="l", + linebreak="id", + unicodeslot=0x1B063, + }, + [0x1B064]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER TI-3", + direction="l", + linebreak="id", + unicodeslot=0x1B064, + }, + [0x1B065]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER TI-4", + direction="l", + linebreak="id", + unicodeslot=0x1B065, + }, + [0x1B066]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER TI-5", + direction="l", + linebreak="id", + unicodeslot=0x1B066, + }, + [0x1B067]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER TI-6", + direction="l", + linebreak="id", + unicodeslot=0x1B067, + }, + [0x1B068]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER TI-7", + direction="l", + linebreak="id", + unicodeslot=0x1B068, + }, + [0x1B069]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER TU-1", + direction="l", + linebreak="id", + unicodeslot=0x1B069, + }, + [0x1B06A]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER TU-2", + direction="l", + linebreak="id", + unicodeslot=0x1B06A, + }, + [0x1B06B]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER TU-3", + direction="l", + linebreak="id", + unicodeslot=0x1B06B, + }, + [0x1B06C]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER TU-4", + direction="l", + linebreak="id", + unicodeslot=0x1B06C, + }, + [0x1B06D]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER TU-TO", + direction="l", + linebreak="id", + unicodeslot=0x1B06D, + }, + [0x1B06E]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER TE-1", + direction="l", + linebreak="id", + unicodeslot=0x1B06E, + }, + [0x1B06F]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER TE-2", + direction="l", + linebreak="id", + unicodeslot=0x1B06F, + }, + [0x1B070]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER TE-3", + direction="l", + linebreak="id", + unicodeslot=0x1B070, + }, + [0x1B071]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER TE-4", + direction="l", + linebreak="id", + unicodeslot=0x1B071, + }, + [0x1B072]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER TE-5", + direction="l", + linebreak="id", + unicodeslot=0x1B072, + }, + [0x1B073]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER TE-6", + direction="l", + linebreak="id", + unicodeslot=0x1B073, + }, + [0x1B074]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER TE-7", + direction="l", + linebreak="id", + unicodeslot=0x1B074, + }, + [0x1B075]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER TE-8", + direction="l", + linebreak="id", + unicodeslot=0x1B075, + }, + [0x1B076]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER TE-9", + direction="l", + linebreak="id", + unicodeslot=0x1B076, + }, + [0x1B077]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER TO-1", + direction="l", + linebreak="id", + unicodeslot=0x1B077, + }, + [0x1B078]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER TO-2", + direction="l", + linebreak="id", + unicodeslot=0x1B078, + }, + [0x1B079]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER TO-3", + direction="l", + linebreak="id", + unicodeslot=0x1B079, + }, + [0x1B07A]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER TO-4", + direction="l", + linebreak="id", + unicodeslot=0x1B07A, + }, + [0x1B07B]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER TO-5", + direction="l", + linebreak="id", + unicodeslot=0x1B07B, + }, + [0x1B07C]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER TO-6", + direction="l", + linebreak="id", + unicodeslot=0x1B07C, + }, + [0x1B07D]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER TO-RA", + direction="l", + linebreak="id", + unicodeslot=0x1B07D, + }, + [0x1B07E]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER NA-1", + direction="l", + linebreak="id", + unicodeslot=0x1B07E, + }, + [0x1B07F]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER NA-2", + direction="l", + linebreak="id", + unicodeslot=0x1B07F, + }, + [0x1B080]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER NA-3", + direction="l", + linebreak="id", + unicodeslot=0x1B080, + }, + [0x1B081]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER NA-4", + direction="l", + linebreak="id", + unicodeslot=0x1B081, + }, + [0x1B082]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER NA-5", + direction="l", + linebreak="id", + unicodeslot=0x1B082, + }, + [0x1B083]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER NA-6", + direction="l", + linebreak="id", + unicodeslot=0x1B083, + }, + [0x1B084]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER NA-7", + direction="l", + linebreak="id", + unicodeslot=0x1B084, + }, + [0x1B085]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER NA-8", + direction="l", + linebreak="id", + unicodeslot=0x1B085, + }, + [0x1B086]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER NA-9", + direction="l", + linebreak="id", + unicodeslot=0x1B086, + }, + [0x1B087]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER NI-1", + direction="l", + linebreak="id", + unicodeslot=0x1B087, + }, + [0x1B088]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER NI-2", + direction="l", + linebreak="id", + unicodeslot=0x1B088, + }, + [0x1B089]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER NI-3", + direction="l", + linebreak="id", + unicodeslot=0x1B089, + }, + [0x1B08A]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER NI-4", + direction="l", + linebreak="id", + unicodeslot=0x1B08A, + }, + [0x1B08B]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER NI-5", + direction="l", + linebreak="id", + unicodeslot=0x1B08B, + }, + [0x1B08C]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER NI-6", + direction="l", + linebreak="id", + unicodeslot=0x1B08C, + }, + [0x1B08D]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER NI-7", + direction="l", + linebreak="id", + unicodeslot=0x1B08D, + }, + [0x1B08E]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER NI-TE", + direction="l", + linebreak="id", + unicodeslot=0x1B08E, + }, + [0x1B08F]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER NU-1", + direction="l", + linebreak="id", + unicodeslot=0x1B08F, + }, + [0x1B090]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER NU-2", + direction="l", + linebreak="id", + unicodeslot=0x1B090, + }, + [0x1B091]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER NU-3", + direction="l", + linebreak="id", + unicodeslot=0x1B091, + }, + [0x1B092]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER NE-1", + direction="l", + linebreak="id", + unicodeslot=0x1B092, + }, + [0x1B093]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER NE-2", + direction="l", + linebreak="id", + unicodeslot=0x1B093, + }, + [0x1B094]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER NE-3", + direction="l", + linebreak="id", + unicodeslot=0x1B094, + }, + [0x1B095]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER NE-4", + direction="l", + linebreak="id", + unicodeslot=0x1B095, + }, + [0x1B096]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER NE-5", + direction="l", + linebreak="id", + unicodeslot=0x1B096, + }, + [0x1B097]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER NE-6", + direction="l", + linebreak="id", + unicodeslot=0x1B097, + }, + [0x1B098]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER NE-KO", + direction="l", + linebreak="id", + unicodeslot=0x1B098, + }, + [0x1B099]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER NO-1", + direction="l", + linebreak="id", + unicodeslot=0x1B099, + }, + [0x1B09A]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER NO-2", + direction="l", + linebreak="id", + unicodeslot=0x1B09A, + }, + [0x1B09B]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER NO-3", + direction="l", + linebreak="id", + unicodeslot=0x1B09B, + }, + [0x1B09C]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER NO-4", + direction="l", + linebreak="id", + unicodeslot=0x1B09C, + }, + [0x1B09D]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER NO-5", + direction="l", + linebreak="id", + unicodeslot=0x1B09D, + }, + [0x1B09E]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER HA-1", + direction="l", + linebreak="id", + unicodeslot=0x1B09E, + }, + [0x1B09F]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER HA-2", + direction="l", + linebreak="id", + unicodeslot=0x1B09F, + }, + [0x1B0A0]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER HA-3", + direction="l", + linebreak="id", + unicodeslot=0x1B0A0, + }, + [0x1B0A1]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER HA-4", + direction="l", + linebreak="id", + unicodeslot=0x1B0A1, + }, + [0x1B0A2]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER HA-5", + direction="l", + linebreak="id", + unicodeslot=0x1B0A2, + }, + [0x1B0A3]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER HA-6", + direction="l", + linebreak="id", + unicodeslot=0x1B0A3, + }, + [0x1B0A4]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER HA-7", + direction="l", + linebreak="id", + unicodeslot=0x1B0A4, + }, + [0x1B0A5]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER HA-8", + direction="l", + linebreak="id", + unicodeslot=0x1B0A5, + }, + [0x1B0A6]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER HA-9", + direction="l", + linebreak="id", + unicodeslot=0x1B0A6, + }, + [0x1B0A7]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER HA-10", + direction="l", + linebreak="id", + unicodeslot=0x1B0A7, + }, + [0x1B0A8]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER HA-11", + direction="l", + linebreak="id", + unicodeslot=0x1B0A8, + }, + [0x1B0A9]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER HI-1", + direction="l", + linebreak="id", + unicodeslot=0x1B0A9, + }, + [0x1B0AA]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER HI-2", + direction="l", + linebreak="id", + unicodeslot=0x1B0AA, + }, + [0x1B0AB]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER HI-3", + direction="l", + linebreak="id", + unicodeslot=0x1B0AB, + }, + [0x1B0AC]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER HI-4", + direction="l", + linebreak="id", + unicodeslot=0x1B0AC, + }, + [0x1B0AD]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER HI-5", + direction="l", + linebreak="id", + unicodeslot=0x1B0AD, + }, + [0x1B0AE]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER HI-6", + direction="l", + linebreak="id", + unicodeslot=0x1B0AE, + }, + [0x1B0AF]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER HI-7", + direction="l", + linebreak="id", + unicodeslot=0x1B0AF, + }, + [0x1B0B0]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER HU-1", + direction="l", + linebreak="id", + unicodeslot=0x1B0B0, + }, + [0x1B0B1]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER HU-2", + direction="l", + linebreak="id", + unicodeslot=0x1B0B1, + }, + [0x1B0B2]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER HU-3", + direction="l", + linebreak="id", + unicodeslot=0x1B0B2, + }, + [0x1B0B3]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER HE-1", + direction="l", + linebreak="id", + unicodeslot=0x1B0B3, + }, + [0x1B0B4]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER HE-2", + direction="l", + linebreak="id", + unicodeslot=0x1B0B4, + }, + [0x1B0B5]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER HE-3", + direction="l", + linebreak="id", + unicodeslot=0x1B0B5, + }, + [0x1B0B6]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER HE-4", + direction="l", + linebreak="id", + unicodeslot=0x1B0B6, + }, + [0x1B0B7]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER HE-5", + direction="l", + linebreak="id", + unicodeslot=0x1B0B7, + }, + [0x1B0B8]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER HE-6", + direction="l", + linebreak="id", + unicodeslot=0x1B0B8, + }, + [0x1B0B9]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER HE-7", + direction="l", + linebreak="id", + unicodeslot=0x1B0B9, + }, + [0x1B0BA]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER HO-1", + direction="l", + linebreak="id", + unicodeslot=0x1B0BA, + }, + [0x1B0BB]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER HO-2", + direction="l", + linebreak="id", + unicodeslot=0x1B0BB, + }, + [0x1B0BC]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER HO-3", + direction="l", + linebreak="id", + unicodeslot=0x1B0BC, + }, + [0x1B0BD]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER HO-4", + direction="l", + linebreak="id", + unicodeslot=0x1B0BD, + }, + [0x1B0BE]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER HO-5", + direction="l", + linebreak="id", + unicodeslot=0x1B0BE, + }, + [0x1B0BF]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER HO-6", + direction="l", + linebreak="id", + unicodeslot=0x1B0BF, + }, + [0x1B0C0]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER HO-7", + direction="l", + linebreak="id", + unicodeslot=0x1B0C0, + }, + [0x1B0C1]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER HO-8", + direction="l", + linebreak="id", + unicodeslot=0x1B0C1, + }, + [0x1B0C2]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER MA-1", + direction="l", + linebreak="id", + unicodeslot=0x1B0C2, + }, + [0x1B0C3]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER MA-2", + direction="l", + linebreak="id", + unicodeslot=0x1B0C3, + }, + [0x1B0C4]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER MA-3", + direction="l", + linebreak="id", + unicodeslot=0x1B0C4, + }, + [0x1B0C5]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER MA-4", + direction="l", + linebreak="id", + unicodeslot=0x1B0C5, + }, + [0x1B0C6]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER MA-5", + direction="l", + linebreak="id", + unicodeslot=0x1B0C6, + }, + [0x1B0C7]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER MA-6", + direction="l", + linebreak="id", + unicodeslot=0x1B0C7, + }, + [0x1B0C8]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER MA-7", + direction="l", + linebreak="id", + unicodeslot=0x1B0C8, + }, + [0x1B0C9]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER MI-1", + direction="l", + linebreak="id", + unicodeslot=0x1B0C9, + }, + [0x1B0CA]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER MI-2", + direction="l", + linebreak="id", + unicodeslot=0x1B0CA, + }, + [0x1B0CB]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER MI-3", + direction="l", + linebreak="id", + unicodeslot=0x1B0CB, + }, + [0x1B0CC]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER MI-4", + direction="l", + linebreak="id", + unicodeslot=0x1B0CC, + }, + [0x1B0CD]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER MI-5", + direction="l", + linebreak="id", + unicodeslot=0x1B0CD, + }, + [0x1B0CE]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER MI-6", + direction="l", + linebreak="id", + unicodeslot=0x1B0CE, + }, + [0x1B0CF]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER MI-7", + direction="l", + linebreak="id", + unicodeslot=0x1B0CF, + }, + [0x1B0D0]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER MU-1", + direction="l", + linebreak="id", + unicodeslot=0x1B0D0, + }, + [0x1B0D1]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER MU-2", + direction="l", + linebreak="id", + unicodeslot=0x1B0D1, + }, + [0x1B0D2]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER MU-3", + direction="l", + linebreak="id", + unicodeslot=0x1B0D2, + }, + [0x1B0D3]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER MU-4", + direction="l", + linebreak="id", + unicodeslot=0x1B0D3, + }, + [0x1B0D4]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER ME-1", + direction="l", + linebreak="id", + unicodeslot=0x1B0D4, + }, + [0x1B0D5]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER ME-2", + direction="l", + linebreak="id", + unicodeslot=0x1B0D5, + }, + [0x1B0D6]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER ME-MA", + direction="l", + linebreak="id", + unicodeslot=0x1B0D6, + }, + [0x1B0D7]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER MO-1", + direction="l", + linebreak="id", + unicodeslot=0x1B0D7, + }, + [0x1B0D8]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER MO-2", + direction="l", + linebreak="id", + unicodeslot=0x1B0D8, + }, + [0x1B0D9]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER MO-3", + direction="l", + linebreak="id", + unicodeslot=0x1B0D9, + }, + [0x1B0DA]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER MO-4", + direction="l", + linebreak="id", + unicodeslot=0x1B0DA, + }, + [0x1B0DB]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER MO-5", + direction="l", + linebreak="id", + unicodeslot=0x1B0DB, + }, + [0x1B0DC]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER MO-6", + direction="l", + linebreak="id", + unicodeslot=0x1B0DC, + }, + [0x1B0DD]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER YA-1", + direction="l", + linebreak="id", + unicodeslot=0x1B0DD, + }, + [0x1B0DE]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER YA-2", + direction="l", + linebreak="id", + unicodeslot=0x1B0DE, + }, + [0x1B0DF]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER YA-3", + direction="l", + linebreak="id", + unicodeslot=0x1B0DF, + }, + [0x1B0E0]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER YA-4", + direction="l", + linebreak="id", + unicodeslot=0x1B0E0, + }, + [0x1B0E1]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER YA-5", + direction="l", + linebreak="id", + unicodeslot=0x1B0E1, + }, + [0x1B0E2]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER YA-YO", + direction="l", + linebreak="id", + unicodeslot=0x1B0E2, + }, + [0x1B0E3]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER YU-1", + direction="l", + linebreak="id", + unicodeslot=0x1B0E3, + }, + [0x1B0E4]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER YU-2", + direction="l", + linebreak="id", + unicodeslot=0x1B0E4, + }, + [0x1B0E5]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER YU-3", + direction="l", + linebreak="id", + unicodeslot=0x1B0E5, + }, + [0x1B0E6]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER YU-4", + direction="l", + linebreak="id", + unicodeslot=0x1B0E6, + }, + [0x1B0E7]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER YO-1", + direction="l", + linebreak="id", + unicodeslot=0x1B0E7, + }, + [0x1B0E8]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER YO-2", + direction="l", + linebreak="id", + unicodeslot=0x1B0E8, + }, + [0x1B0E9]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER YO-3", + direction="l", + linebreak="id", + unicodeslot=0x1B0E9, + }, + [0x1B0EA]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER YO-4", + direction="l", + linebreak="id", + unicodeslot=0x1B0EA, + }, + [0x1B0EB]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER YO-5", + direction="l", + linebreak="id", + unicodeslot=0x1B0EB, + }, + [0x1B0EC]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER YO-6", + direction="l", + linebreak="id", + unicodeslot=0x1B0EC, + }, + [0x1B0ED]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER RA-1", + direction="l", + linebreak="id", + unicodeslot=0x1B0ED, + }, + [0x1B0EE]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER RA-2", + direction="l", + linebreak="id", + unicodeslot=0x1B0EE, + }, + [0x1B0EF]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER RA-3", + direction="l", + linebreak="id", + unicodeslot=0x1B0EF, + }, + [0x1B0F0]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER RA-4", + direction="l", + linebreak="id", + unicodeslot=0x1B0F0, + }, + [0x1B0F1]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER RI-1", + direction="l", + linebreak="id", + unicodeslot=0x1B0F1, + }, + [0x1B0F2]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER RI-2", + direction="l", + linebreak="id", + unicodeslot=0x1B0F2, + }, + [0x1B0F3]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER RI-3", + direction="l", + linebreak="id", + unicodeslot=0x1B0F3, + }, + [0x1B0F4]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER RI-4", + direction="l", + linebreak="id", + unicodeslot=0x1B0F4, + }, + [0x1B0F5]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER RI-5", + direction="l", + linebreak="id", + unicodeslot=0x1B0F5, + }, + [0x1B0F6]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER RI-6", + direction="l", + linebreak="id", + unicodeslot=0x1B0F6, + }, + [0x1B0F7]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER RI-7", + direction="l", + linebreak="id", + unicodeslot=0x1B0F7, + }, + [0x1B0F8]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER RU-1", + direction="l", + linebreak="id", + unicodeslot=0x1B0F8, + }, + [0x1B0F9]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER RU-2", + direction="l", + linebreak="id", + unicodeslot=0x1B0F9, + }, + [0x1B0FA]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER RU-3", + direction="l", + linebreak="id", + unicodeslot=0x1B0FA, + }, + [0x1B0FB]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER RU-4", + direction="l", + linebreak="id", + unicodeslot=0x1B0FB, + }, + [0x1B0FC]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER RU-5", + direction="l", + linebreak="id", + unicodeslot=0x1B0FC, + }, + [0x1B0FD]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER RU-6", + direction="l", + linebreak="id", + unicodeslot=0x1B0FD, + }, + [0x1B0FE]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER RE-1", + direction="l", + linebreak="id", + unicodeslot=0x1B0FE, + }, + [0x1B0FF]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER RE-2", + direction="l", + linebreak="id", + unicodeslot=0x1B0FF, + }, + [0x1B100]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER RE-3", + direction="l", + linebreak="id", + unicodeslot=0x1B100, + }, + [0x1B101]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER RE-4", + direction="l", + linebreak="id", + unicodeslot=0x1B101, + }, + [0x1B102]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER RO-1", + direction="l", + linebreak="id", + unicodeslot=0x1B102, + }, + [0x1B103]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER RO-2", + direction="l", + linebreak="id", + unicodeslot=0x1B103, + }, + [0x1B104]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER RO-3", + direction="l", + linebreak="id", + unicodeslot=0x1B104, + }, + [0x1B105]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER RO-4", + direction="l", + linebreak="id", + unicodeslot=0x1B105, + }, + [0x1B106]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER RO-5", + direction="l", + linebreak="id", + unicodeslot=0x1B106, + }, + [0x1B107]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER RO-6", + direction="l", + linebreak="id", + unicodeslot=0x1B107, + }, + [0x1B108]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER WA-1", + direction="l", + linebreak="id", + unicodeslot=0x1B108, + }, + [0x1B109]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER WA-2", + direction="l", + linebreak="id", + unicodeslot=0x1B109, + }, + [0x1B10A]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER WA-3", + direction="l", + linebreak="id", + unicodeslot=0x1B10A, + }, + [0x1B10B]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER WA-4", + direction="l", + linebreak="id", + unicodeslot=0x1B10B, + }, + [0x1B10C]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER WA-5", + direction="l", + linebreak="id", + unicodeslot=0x1B10C, + }, + [0x1B10D]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER WI-1", + direction="l", + linebreak="id", + unicodeslot=0x1B10D, + }, + [0x1B10E]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER WI-2", + direction="l", + linebreak="id", + unicodeslot=0x1B10E, + }, + [0x1B10F]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER WI-3", + direction="l", + linebreak="id", + unicodeslot=0x1B10F, + }, + [0x1B110]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER WI-4", + direction="l", + linebreak="id", + unicodeslot=0x1B110, + }, + [0x1B111]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER WI-5", + direction="l", + linebreak="id", + unicodeslot=0x1B111, + }, + [0x1B112]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER WE-1", + direction="l", + linebreak="id", + unicodeslot=0x1B112, + }, + [0x1B113]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER WE-2", + direction="l", + linebreak="id", + unicodeslot=0x1B113, + }, + [0x1B114]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER WE-3", + direction="l", + linebreak="id", + unicodeslot=0x1B114, + }, + [0x1B115]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER WE-4", + direction="l", + linebreak="id", + unicodeslot=0x1B115, + }, + [0x1B116]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER WO-1", + direction="l", + linebreak="id", + unicodeslot=0x1B116, + }, + [0x1B117]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER WO-2", + direction="l", + linebreak="id", + unicodeslot=0x1B117, + }, + [0x1B118]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER WO-3", + direction="l", + linebreak="id", + unicodeslot=0x1B118, + }, + [0x1B119]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER WO-4", + direction="l", + linebreak="id", + unicodeslot=0x1B119, + }, + [0x1B11A]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER WO-5", + direction="l", + linebreak="id", + unicodeslot=0x1B11A, + }, + [0x1B11B]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER WO-6", + direction="l", + linebreak="id", + unicodeslot=0x1B11B, + }, + [0x1B11C]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER WO-7", + direction="l", + linebreak="id", + unicodeslot=0x1B11C, + }, + [0x1B11D]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER N-MU-MO-1", + direction="l", + linebreak="id", + unicodeslot=0x1B11D, + }, + [0x1B11E]={ + category="lo", + cjkwd="w", + description="HENTAIGANA LETTER N-MU-MO-2", + direction="l", + linebreak="id", + unicodeslot=0x1B11E, + }, + [0x1B170]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B170", + direction="l", + linebreak="id", + unicodeslot=0x1B170, + }, + [0x1B171]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B171", + direction="l", + linebreak="id", + unicodeslot=0x1B171, + }, + [0x1B172]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B172", + direction="l", + linebreak="id", + unicodeslot=0x1B172, + }, + [0x1B173]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B173", + direction="l", + linebreak="id", + unicodeslot=0x1B173, + }, + [0x1B174]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B174", + direction="l", + linebreak="id", + unicodeslot=0x1B174, + }, + [0x1B175]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B175", + direction="l", + linebreak="id", + unicodeslot=0x1B175, + }, + [0x1B176]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B176", + direction="l", + linebreak="id", + unicodeslot=0x1B176, + }, + [0x1B177]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B177", + direction="l", + linebreak="id", + unicodeslot=0x1B177, + }, + [0x1B178]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B178", + direction="l", + linebreak="id", + unicodeslot=0x1B178, + }, + [0x1B179]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B179", + direction="l", + linebreak="id", + unicodeslot=0x1B179, + }, + [0x1B17A]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B17A", + direction="l", + linebreak="id", + unicodeslot=0x1B17A, + }, + [0x1B17B]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B17B", + direction="l", + linebreak="id", + unicodeslot=0x1B17B, + }, + [0x1B17C]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B17C", + direction="l", + linebreak="id", + unicodeslot=0x1B17C, + }, + [0x1B17D]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B17D", + direction="l", + linebreak="id", + unicodeslot=0x1B17D, + }, + [0x1B17E]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B17E", + direction="l", + linebreak="id", + unicodeslot=0x1B17E, + }, + [0x1B17F]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B17F", + direction="l", + linebreak="id", + unicodeslot=0x1B17F, + }, + [0x1B180]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B180", + direction="l", + linebreak="id", + unicodeslot=0x1B180, + }, + [0x1B181]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B181", + direction="l", + linebreak="id", + unicodeslot=0x1B181, + }, + [0x1B182]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B182", + direction="l", + linebreak="id", + unicodeslot=0x1B182, + }, + [0x1B183]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B183", + direction="l", + linebreak="id", + unicodeslot=0x1B183, + }, + [0x1B184]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B184", + direction="l", + linebreak="id", + unicodeslot=0x1B184, + }, + [0x1B185]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B185", + direction="l", + linebreak="id", + unicodeslot=0x1B185, + }, + [0x1B186]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B186", + direction="l", + linebreak="id", + unicodeslot=0x1B186, + }, + [0x1B187]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B187", + direction="l", + linebreak="id", + unicodeslot=0x1B187, + }, + [0x1B188]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B188", + direction="l", + linebreak="id", + unicodeslot=0x1B188, + }, + [0x1B189]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B189", + direction="l", + linebreak="id", + unicodeslot=0x1B189, + }, + [0x1B18A]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B18A", + direction="l", + linebreak="id", + unicodeslot=0x1B18A, + }, + [0x1B18B]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B18B", + direction="l", + linebreak="id", + unicodeslot=0x1B18B, + }, + [0x1B18C]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B18C", + direction="l", + linebreak="id", + unicodeslot=0x1B18C, + }, + [0x1B18D]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B18D", + direction="l", + linebreak="id", + unicodeslot=0x1B18D, + }, + [0x1B18E]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B18E", + direction="l", + linebreak="id", + unicodeslot=0x1B18E, + }, + [0x1B18F]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B18F", + direction="l", + linebreak="id", + unicodeslot=0x1B18F, + }, + [0x1B190]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B190", + direction="l", + linebreak="id", + unicodeslot=0x1B190, + }, + [0x1B191]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B191", + direction="l", + linebreak="id", + unicodeslot=0x1B191, + }, + [0x1B192]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B192", + direction="l", + linebreak="id", + unicodeslot=0x1B192, + }, + [0x1B193]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B193", + direction="l", + linebreak="id", + unicodeslot=0x1B193, + }, + [0x1B194]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B194", + direction="l", + linebreak="id", + unicodeslot=0x1B194, + }, + [0x1B195]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B195", + direction="l", + linebreak="id", + unicodeslot=0x1B195, + }, + [0x1B196]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B196", + direction="l", + linebreak="id", + unicodeslot=0x1B196, + }, + [0x1B197]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B197", + direction="l", + linebreak="id", + unicodeslot=0x1B197, + }, + [0x1B198]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B198", + direction="l", + linebreak="id", + unicodeslot=0x1B198, + }, + [0x1B199]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B199", + direction="l", + linebreak="id", + unicodeslot=0x1B199, + }, + [0x1B19A]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B19A", + direction="l", + linebreak="id", + unicodeslot=0x1B19A, + }, + [0x1B19B]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B19B", + direction="l", + linebreak="id", + unicodeslot=0x1B19B, + }, + [0x1B19C]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B19C", + direction="l", + linebreak="id", + unicodeslot=0x1B19C, + }, + [0x1B19D]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B19D", + direction="l", + linebreak="id", + unicodeslot=0x1B19D, + }, + [0x1B19E]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B19E", + direction="l", + linebreak="id", + unicodeslot=0x1B19E, + }, + [0x1B19F]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B19F", + direction="l", + linebreak="id", + unicodeslot=0x1B19F, + }, + [0x1B1A0]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1A0", + direction="l", + linebreak="id", + unicodeslot=0x1B1A0, + }, + [0x1B1A1]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1A1", + direction="l", + linebreak="id", + unicodeslot=0x1B1A1, + }, + [0x1B1A2]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1A2", + direction="l", + linebreak="id", + unicodeslot=0x1B1A2, + }, + [0x1B1A3]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1A3", + direction="l", + linebreak="id", + unicodeslot=0x1B1A3, + }, + [0x1B1A4]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1A4", + direction="l", + linebreak="id", + unicodeslot=0x1B1A4, + }, + [0x1B1A5]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1A5", + direction="l", + linebreak="id", + unicodeslot=0x1B1A5, + }, + [0x1B1A6]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1A6", + direction="l", + linebreak="id", + unicodeslot=0x1B1A6, + }, + [0x1B1A7]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1A7", + direction="l", + linebreak="id", + unicodeslot=0x1B1A7, + }, + [0x1B1A8]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1A8", + direction="l", + linebreak="id", + unicodeslot=0x1B1A8, + }, + [0x1B1A9]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1A9", + direction="l", + linebreak="id", + unicodeslot=0x1B1A9, + }, + [0x1B1AA]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1AA", + direction="l", + linebreak="id", + unicodeslot=0x1B1AA, + }, + [0x1B1AB]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1AB", + direction="l", + linebreak="id", + unicodeslot=0x1B1AB, + }, + [0x1B1AC]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1AC", + direction="l", + linebreak="id", + unicodeslot=0x1B1AC, + }, + [0x1B1AD]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1AD", + direction="l", + linebreak="id", + unicodeslot=0x1B1AD, + }, + [0x1B1AE]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1AE", + direction="l", + linebreak="id", + unicodeslot=0x1B1AE, + }, + [0x1B1AF]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1AF", + direction="l", + linebreak="id", + unicodeslot=0x1B1AF, + }, + [0x1B1B0]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1B0", + direction="l", + linebreak="id", + unicodeslot=0x1B1B0, + }, + [0x1B1B1]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1B1", + direction="l", + linebreak="id", + unicodeslot=0x1B1B1, + }, + [0x1B1B2]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1B2", + direction="l", + linebreak="id", + unicodeslot=0x1B1B2, + }, + [0x1B1B3]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1B3", + direction="l", + linebreak="id", + unicodeslot=0x1B1B3, + }, + [0x1B1B4]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1B4", + direction="l", + linebreak="id", + unicodeslot=0x1B1B4, + }, + [0x1B1B5]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1B5", + direction="l", + linebreak="id", + unicodeslot=0x1B1B5, + }, + [0x1B1B6]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1B6", + direction="l", + linebreak="id", + unicodeslot=0x1B1B6, + }, + [0x1B1B7]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1B7", + direction="l", + linebreak="id", + unicodeslot=0x1B1B7, + }, + [0x1B1B8]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1B8", + direction="l", + linebreak="id", + unicodeslot=0x1B1B8, + }, + [0x1B1B9]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1B9", + direction="l", + linebreak="id", + unicodeslot=0x1B1B9, + }, + [0x1B1BA]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1BA", + direction="l", + linebreak="id", + unicodeslot=0x1B1BA, + }, + [0x1B1BB]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1BB", + direction="l", + linebreak="id", + unicodeslot=0x1B1BB, + }, + [0x1B1BC]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1BC", + direction="l", + linebreak="id", + unicodeslot=0x1B1BC, + }, + [0x1B1BD]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1BD", + direction="l", + linebreak="id", + unicodeslot=0x1B1BD, + }, + [0x1B1BE]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1BE", + direction="l", + linebreak="id", + unicodeslot=0x1B1BE, + }, + [0x1B1BF]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1BF", + direction="l", + linebreak="id", + unicodeslot=0x1B1BF, + }, + [0x1B1C0]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1C0", + direction="l", + linebreak="id", + unicodeslot=0x1B1C0, + }, + [0x1B1C1]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1C1", + direction="l", + linebreak="id", + unicodeslot=0x1B1C1, + }, + [0x1B1C2]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1C2", + direction="l", + linebreak="id", + unicodeslot=0x1B1C2, + }, + [0x1B1C3]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1C3", + direction="l", + linebreak="id", + unicodeslot=0x1B1C3, + }, + [0x1B1C4]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1C4", + direction="l", + linebreak="id", + unicodeslot=0x1B1C4, + }, + [0x1B1C5]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1C5", + direction="l", + linebreak="id", + unicodeslot=0x1B1C5, + }, + [0x1B1C6]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1C6", + direction="l", + linebreak="id", + unicodeslot=0x1B1C6, + }, + [0x1B1C7]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1C7", + direction="l", + linebreak="id", + unicodeslot=0x1B1C7, + }, + [0x1B1C8]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1C8", + direction="l", + linebreak="id", + unicodeslot=0x1B1C8, + }, + [0x1B1C9]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1C9", + direction="l", + linebreak="id", + unicodeslot=0x1B1C9, + }, + [0x1B1CA]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1CA", + direction="l", + linebreak="id", + unicodeslot=0x1B1CA, + }, + [0x1B1CB]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1CB", + direction="l", + linebreak="id", + unicodeslot=0x1B1CB, + }, + [0x1B1CC]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1CC", + direction="l", + linebreak="id", + unicodeslot=0x1B1CC, + }, + [0x1B1CD]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1CD", + direction="l", + linebreak="id", + unicodeslot=0x1B1CD, + }, + [0x1B1CE]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1CE", + direction="l", + linebreak="id", + unicodeslot=0x1B1CE, + }, + [0x1B1CF]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1CF", + direction="l", + linebreak="id", + unicodeslot=0x1B1CF, + }, + [0x1B1D0]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1D0", + direction="l", + linebreak="id", + unicodeslot=0x1B1D0, + }, + [0x1B1D1]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1D1", + direction="l", + linebreak="id", + unicodeslot=0x1B1D1, + }, + [0x1B1D2]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1D2", + direction="l", + linebreak="id", + unicodeslot=0x1B1D2, + }, + [0x1B1D3]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1D3", + direction="l", + linebreak="id", + unicodeslot=0x1B1D3, + }, + [0x1B1D4]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1D4", + direction="l", + linebreak="id", + unicodeslot=0x1B1D4, + }, + [0x1B1D5]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1D5", + direction="l", + linebreak="id", + unicodeslot=0x1B1D5, + }, + [0x1B1D6]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1D6", + direction="l", + linebreak="id", + unicodeslot=0x1B1D6, + }, + [0x1B1D7]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1D7", + direction="l", + linebreak="id", + unicodeslot=0x1B1D7, + }, + [0x1B1D8]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1D8", + direction="l", + linebreak="id", + unicodeslot=0x1B1D8, + }, + [0x1B1D9]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1D9", + direction="l", + linebreak="id", + unicodeslot=0x1B1D9, + }, + [0x1B1DA]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1DA", + direction="l", + linebreak="id", + unicodeslot=0x1B1DA, + }, + [0x1B1DB]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1DB", + direction="l", + linebreak="id", + unicodeslot=0x1B1DB, + }, + [0x1B1DC]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1DC", + direction="l", + linebreak="id", + unicodeslot=0x1B1DC, + }, + [0x1B1DD]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1DD", + direction="l", + linebreak="id", + unicodeslot=0x1B1DD, + }, + [0x1B1DE]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1DE", + direction="l", + linebreak="id", + unicodeslot=0x1B1DE, + }, + [0x1B1DF]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1DF", + direction="l", + linebreak="id", + unicodeslot=0x1B1DF, + }, + [0x1B1E0]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1E0", + direction="l", + linebreak="id", + unicodeslot=0x1B1E0, + }, + [0x1B1E1]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1E1", + direction="l", + linebreak="id", + unicodeslot=0x1B1E1, + }, + [0x1B1E2]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1E2", + direction="l", + linebreak="id", + unicodeslot=0x1B1E2, + }, + [0x1B1E3]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1E3", + direction="l", + linebreak="id", + unicodeslot=0x1B1E3, + }, + [0x1B1E4]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1E4", + direction="l", + linebreak="id", + unicodeslot=0x1B1E4, + }, + [0x1B1E5]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1E5", + direction="l", + linebreak="id", + unicodeslot=0x1B1E5, + }, + [0x1B1E6]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1E6", + direction="l", + linebreak="id", + unicodeslot=0x1B1E6, + }, + [0x1B1E7]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1E7", + direction="l", + linebreak="id", + unicodeslot=0x1B1E7, + }, + [0x1B1E8]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1E8", + direction="l", + linebreak="id", + unicodeslot=0x1B1E8, + }, + [0x1B1E9]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1E9", + direction="l", + linebreak="id", + unicodeslot=0x1B1E9, + }, + [0x1B1EA]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1EA", + direction="l", + linebreak="id", + unicodeslot=0x1B1EA, + }, + [0x1B1EB]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1EB", + direction="l", + linebreak="id", + unicodeslot=0x1B1EB, + }, + [0x1B1EC]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1EC", + direction="l", + linebreak="id", + unicodeslot=0x1B1EC, + }, + [0x1B1ED]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1ED", + direction="l", + linebreak="id", + unicodeslot=0x1B1ED, + }, + [0x1B1EE]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1EE", + direction="l", + linebreak="id", + unicodeslot=0x1B1EE, + }, + [0x1B1EF]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1EF", + direction="l", + linebreak="id", + unicodeslot=0x1B1EF, + }, + [0x1B1F0]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1F0", + direction="l", + linebreak="id", + unicodeslot=0x1B1F0, + }, + [0x1B1F1]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1F1", + direction="l", + linebreak="id", + unicodeslot=0x1B1F1, + }, + [0x1B1F2]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1F2", + direction="l", + linebreak="id", + unicodeslot=0x1B1F2, + }, + [0x1B1F3]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1F3", + direction="l", + linebreak="id", + unicodeslot=0x1B1F3, + }, + [0x1B1F4]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1F4", + direction="l", + linebreak="id", + unicodeslot=0x1B1F4, + }, + [0x1B1F5]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1F5", + direction="l", + linebreak="id", + unicodeslot=0x1B1F5, + }, + [0x1B1F6]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1F6", + direction="l", + linebreak="id", + unicodeslot=0x1B1F6, + }, + [0x1B1F7]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1F7", + direction="l", + linebreak="id", + unicodeslot=0x1B1F7, + }, + [0x1B1F8]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1F8", + direction="l", + linebreak="id", + unicodeslot=0x1B1F8, + }, + [0x1B1F9]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1F9", + direction="l", + linebreak="id", + unicodeslot=0x1B1F9, + }, + [0x1B1FA]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1FA", + direction="l", + linebreak="id", + unicodeslot=0x1B1FA, + }, + [0x1B1FB]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1FB", + direction="l", + linebreak="id", + unicodeslot=0x1B1FB, + }, + [0x1B1FC]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1FC", + direction="l", + linebreak="id", + unicodeslot=0x1B1FC, + }, + [0x1B1FD]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1FD", + direction="l", + linebreak="id", + unicodeslot=0x1B1FD, + }, + [0x1B1FE]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1FE", + direction="l", + linebreak="id", + unicodeslot=0x1B1FE, + }, + [0x1B1FF]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B1FF", + direction="l", + linebreak="id", + unicodeslot=0x1B1FF, + }, + [0x1B200]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B200", + direction="l", + linebreak="id", + unicodeslot=0x1B200, + }, + [0x1B201]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B201", + direction="l", + linebreak="id", + unicodeslot=0x1B201, + }, + [0x1B202]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B202", + direction="l", + linebreak="id", + unicodeslot=0x1B202, + }, + [0x1B203]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B203", + direction="l", + linebreak="id", + unicodeslot=0x1B203, + }, + [0x1B204]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B204", + direction="l", + linebreak="id", + unicodeslot=0x1B204, + }, + [0x1B205]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B205", + direction="l", + linebreak="id", + unicodeslot=0x1B205, + }, + [0x1B206]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B206", + direction="l", + linebreak="id", + unicodeslot=0x1B206, + }, + [0x1B207]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B207", + direction="l", + linebreak="id", + unicodeslot=0x1B207, + }, + [0x1B208]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B208", + direction="l", + linebreak="id", + unicodeslot=0x1B208, + }, + [0x1B209]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B209", + direction="l", + linebreak="id", + unicodeslot=0x1B209, + }, + [0x1B20A]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B20A", + direction="l", + linebreak="id", + unicodeslot=0x1B20A, + }, + [0x1B20B]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B20B", + direction="l", + linebreak="id", + unicodeslot=0x1B20B, + }, + [0x1B20C]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B20C", + direction="l", + linebreak="id", + unicodeslot=0x1B20C, + }, + [0x1B20D]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B20D", + direction="l", + linebreak="id", + unicodeslot=0x1B20D, + }, + [0x1B20E]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B20E", + direction="l", + linebreak="id", + unicodeslot=0x1B20E, + }, + [0x1B20F]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B20F", + direction="l", + linebreak="id", + unicodeslot=0x1B20F, + }, + [0x1B210]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B210", + direction="l", + linebreak="id", + unicodeslot=0x1B210, + }, + [0x1B211]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B211", + direction="l", + linebreak="id", + unicodeslot=0x1B211, + }, + [0x1B212]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B212", + direction="l", + linebreak="id", + unicodeslot=0x1B212, + }, + [0x1B213]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B213", + direction="l", + linebreak="id", + unicodeslot=0x1B213, + }, + [0x1B214]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B214", + direction="l", + linebreak="id", + unicodeslot=0x1B214, + }, + [0x1B215]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B215", + direction="l", + linebreak="id", + unicodeslot=0x1B215, + }, + [0x1B216]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B216", + direction="l", + linebreak="id", + unicodeslot=0x1B216, + }, + [0x1B217]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B217", + direction="l", + linebreak="id", + unicodeslot=0x1B217, + }, + [0x1B218]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B218", + direction="l", + linebreak="id", + unicodeslot=0x1B218, + }, + [0x1B219]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B219", + direction="l", + linebreak="id", + unicodeslot=0x1B219, + }, + [0x1B21A]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B21A", + direction="l", + linebreak="id", + unicodeslot=0x1B21A, + }, + [0x1B21B]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B21B", + direction="l", + linebreak="id", + unicodeslot=0x1B21B, + }, + [0x1B21C]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B21C", + direction="l", + linebreak="id", + unicodeslot=0x1B21C, + }, + [0x1B21D]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B21D", + direction="l", + linebreak="id", + unicodeslot=0x1B21D, + }, + [0x1B21E]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B21E", + direction="l", + linebreak="id", + unicodeslot=0x1B21E, + }, + [0x1B21F]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B21F", + direction="l", + linebreak="id", + unicodeslot=0x1B21F, + }, + [0x1B220]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B220", + direction="l", + linebreak="id", + unicodeslot=0x1B220, + }, + [0x1B221]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B221", + direction="l", + linebreak="id", + unicodeslot=0x1B221, + }, + [0x1B222]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B222", + direction="l", + linebreak="id", + unicodeslot=0x1B222, + }, + [0x1B223]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B223", + direction="l", + linebreak="id", + unicodeslot=0x1B223, + }, + [0x1B224]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B224", + direction="l", + linebreak="id", + unicodeslot=0x1B224, + }, + [0x1B225]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B225", + direction="l", + linebreak="id", + unicodeslot=0x1B225, + }, + [0x1B226]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B226", + direction="l", + linebreak="id", + unicodeslot=0x1B226, + }, + [0x1B227]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B227", + direction="l", + linebreak="id", + unicodeslot=0x1B227, + }, + [0x1B228]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B228", + direction="l", + linebreak="id", + unicodeslot=0x1B228, + }, + [0x1B229]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B229", + direction="l", + linebreak="id", + unicodeslot=0x1B229, + }, + [0x1B22A]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B22A", + direction="l", + linebreak="id", + unicodeslot=0x1B22A, + }, + [0x1B22B]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B22B", + direction="l", + linebreak="id", + unicodeslot=0x1B22B, + }, + [0x1B22C]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B22C", + direction="l", + linebreak="id", + unicodeslot=0x1B22C, + }, + [0x1B22D]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B22D", + direction="l", + linebreak="id", + unicodeslot=0x1B22D, + }, + [0x1B22E]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B22E", + direction="l", + linebreak="id", + unicodeslot=0x1B22E, + }, + [0x1B22F]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B22F", + direction="l", + linebreak="id", + unicodeslot=0x1B22F, + }, + [0x1B230]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B230", + direction="l", + linebreak="id", + unicodeslot=0x1B230, + }, + [0x1B231]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B231", + direction="l", + linebreak="id", + unicodeslot=0x1B231, + }, + [0x1B232]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B232", + direction="l", + linebreak="id", + unicodeslot=0x1B232, + }, + [0x1B233]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B233", + direction="l", + linebreak="id", + unicodeslot=0x1B233, + }, + [0x1B234]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B234", + direction="l", + linebreak="id", + unicodeslot=0x1B234, + }, + [0x1B235]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B235", + direction="l", + linebreak="id", + unicodeslot=0x1B235, + }, + [0x1B236]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B236", + direction="l", + linebreak="id", + unicodeslot=0x1B236, + }, + [0x1B237]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B237", + direction="l", + linebreak="id", + unicodeslot=0x1B237, + }, + [0x1B238]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B238", + direction="l", + linebreak="id", + unicodeslot=0x1B238, + }, + [0x1B239]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B239", + direction="l", + linebreak="id", + unicodeslot=0x1B239, + }, + [0x1B23A]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B23A", + direction="l", + linebreak="id", + unicodeslot=0x1B23A, + }, + [0x1B23B]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B23B", + direction="l", + linebreak="id", + unicodeslot=0x1B23B, + }, + [0x1B23C]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B23C", + direction="l", + linebreak="id", + unicodeslot=0x1B23C, + }, + [0x1B23D]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B23D", + direction="l", + linebreak="id", + unicodeslot=0x1B23D, + }, + [0x1B23E]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B23E", + direction="l", + linebreak="id", + unicodeslot=0x1B23E, + }, + [0x1B23F]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B23F", + direction="l", + linebreak="id", + unicodeslot=0x1B23F, + }, + [0x1B240]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B240", + direction="l", + linebreak="id", + unicodeslot=0x1B240, + }, + [0x1B241]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B241", + direction="l", + linebreak="id", + unicodeslot=0x1B241, + }, + [0x1B242]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B242", + direction="l", + linebreak="id", + unicodeslot=0x1B242, + }, + [0x1B243]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B243", + direction="l", + linebreak="id", + unicodeslot=0x1B243, + }, + [0x1B244]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B244", + direction="l", + linebreak="id", + unicodeslot=0x1B244, + }, + [0x1B245]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B245", + direction="l", + linebreak="id", + unicodeslot=0x1B245, + }, + [0x1B246]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B246", + direction="l", + linebreak="id", + unicodeslot=0x1B246, + }, + [0x1B247]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B247", + direction="l", + linebreak="id", + unicodeslot=0x1B247, + }, + [0x1B248]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B248", + direction="l", + linebreak="id", + unicodeslot=0x1B248, + }, + [0x1B249]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B249", + direction="l", + linebreak="id", + unicodeslot=0x1B249, + }, + [0x1B24A]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B24A", + direction="l", + linebreak="id", + unicodeslot=0x1B24A, + }, + [0x1B24B]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B24B", + direction="l", + linebreak="id", + unicodeslot=0x1B24B, + }, + [0x1B24C]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B24C", + direction="l", + linebreak="id", + unicodeslot=0x1B24C, + }, + [0x1B24D]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B24D", + direction="l", + linebreak="id", + unicodeslot=0x1B24D, + }, + [0x1B24E]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B24E", + direction="l", + linebreak="id", + unicodeslot=0x1B24E, + }, + [0x1B24F]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B24F", + direction="l", + linebreak="id", + unicodeslot=0x1B24F, + }, + [0x1B250]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B250", + direction="l", + linebreak="id", + unicodeslot=0x1B250, + }, + [0x1B251]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B251", + direction="l", + linebreak="id", + unicodeslot=0x1B251, + }, + [0x1B252]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B252", + direction="l", + linebreak="id", + unicodeslot=0x1B252, + }, + [0x1B253]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B253", + direction="l", + linebreak="id", + unicodeslot=0x1B253, + }, + [0x1B254]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B254", + direction="l", + linebreak="id", + unicodeslot=0x1B254, + }, + [0x1B255]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B255", + direction="l", + linebreak="id", + unicodeslot=0x1B255, + }, + [0x1B256]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B256", + direction="l", + linebreak="id", + unicodeslot=0x1B256, + }, + [0x1B257]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B257", + direction="l", + linebreak="id", + unicodeslot=0x1B257, + }, + [0x1B258]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B258", + direction="l", + linebreak="id", + unicodeslot=0x1B258, + }, + [0x1B259]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B259", + direction="l", + linebreak="id", + unicodeslot=0x1B259, + }, + [0x1B25A]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B25A", + direction="l", + linebreak="id", + unicodeslot=0x1B25A, + }, + [0x1B25B]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B25B", + direction="l", + linebreak="id", + unicodeslot=0x1B25B, + }, + [0x1B25C]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B25C", + direction="l", + linebreak="id", + unicodeslot=0x1B25C, + }, + [0x1B25D]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B25D", + direction="l", + linebreak="id", + unicodeslot=0x1B25D, + }, + [0x1B25E]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B25E", + direction="l", + linebreak="id", + unicodeslot=0x1B25E, + }, + [0x1B25F]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B25F", + direction="l", + linebreak="id", + unicodeslot=0x1B25F, + }, + [0x1B260]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B260", + direction="l", + linebreak="id", + unicodeslot=0x1B260, + }, + [0x1B261]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B261", + direction="l", + linebreak="id", + unicodeslot=0x1B261, + }, + [0x1B262]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B262", + direction="l", + linebreak="id", + unicodeslot=0x1B262, + }, + [0x1B263]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B263", + direction="l", + linebreak="id", + unicodeslot=0x1B263, + }, + [0x1B264]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B264", + direction="l", + linebreak="id", + unicodeslot=0x1B264, + }, + [0x1B265]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B265", + direction="l", + linebreak="id", + unicodeslot=0x1B265, + }, + [0x1B266]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B266", + direction="l", + linebreak="id", + unicodeslot=0x1B266, + }, + [0x1B267]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B267", + direction="l", + linebreak="id", + unicodeslot=0x1B267, + }, + [0x1B268]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B268", + direction="l", + linebreak="id", + unicodeslot=0x1B268, + }, + [0x1B269]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B269", + direction="l", + linebreak="id", + unicodeslot=0x1B269, + }, + [0x1B26A]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B26A", + direction="l", + linebreak="id", + unicodeslot=0x1B26A, + }, + [0x1B26B]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B26B", + direction="l", + linebreak="id", + unicodeslot=0x1B26B, + }, + [0x1B26C]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B26C", + direction="l", + linebreak="id", + unicodeslot=0x1B26C, + }, + [0x1B26D]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B26D", + direction="l", + linebreak="id", + unicodeslot=0x1B26D, + }, + [0x1B26E]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B26E", + direction="l", + linebreak="id", + unicodeslot=0x1B26E, + }, + [0x1B26F]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B26F", + direction="l", + linebreak="id", + unicodeslot=0x1B26F, + }, + [0x1B270]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B270", + direction="l", + linebreak="id", + unicodeslot=0x1B270, + }, + [0x1B271]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B271", + direction="l", + linebreak="id", + unicodeslot=0x1B271, + }, + [0x1B272]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B272", + direction="l", + linebreak="id", + unicodeslot=0x1B272, + }, + [0x1B273]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B273", + direction="l", + linebreak="id", + unicodeslot=0x1B273, + }, + [0x1B274]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B274", + direction="l", + linebreak="id", + unicodeslot=0x1B274, + }, + [0x1B275]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B275", + direction="l", + linebreak="id", + unicodeslot=0x1B275, + }, + [0x1B276]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B276", + direction="l", + linebreak="id", + unicodeslot=0x1B276, + }, + [0x1B277]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B277", + direction="l", + linebreak="id", + unicodeslot=0x1B277, + }, + [0x1B278]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B278", + direction="l", + linebreak="id", + unicodeslot=0x1B278, + }, + [0x1B279]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B279", + direction="l", + linebreak="id", + unicodeslot=0x1B279, + }, + [0x1B27A]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B27A", + direction="l", + linebreak="id", + unicodeslot=0x1B27A, + }, + [0x1B27B]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B27B", + direction="l", + linebreak="id", + unicodeslot=0x1B27B, + }, + [0x1B27C]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B27C", + direction="l", + linebreak="id", + unicodeslot=0x1B27C, + }, + [0x1B27D]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B27D", + direction="l", + linebreak="id", + unicodeslot=0x1B27D, + }, + [0x1B27E]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B27E", + direction="l", + linebreak="id", + unicodeslot=0x1B27E, + }, + [0x1B27F]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B27F", + direction="l", + linebreak="id", + unicodeslot=0x1B27F, + }, + [0x1B280]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B280", + direction="l", + linebreak="id", + unicodeslot=0x1B280, + }, + [0x1B281]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B281", + direction="l", + linebreak="id", + unicodeslot=0x1B281, + }, + [0x1B282]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B282", + direction="l", + linebreak="id", + unicodeslot=0x1B282, + }, + [0x1B283]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B283", + direction="l", + linebreak="id", + unicodeslot=0x1B283, + }, + [0x1B284]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B284", + direction="l", + linebreak="id", + unicodeslot=0x1B284, + }, + [0x1B285]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B285", + direction="l", + linebreak="id", + unicodeslot=0x1B285, + }, + [0x1B286]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B286", + direction="l", + linebreak="id", + unicodeslot=0x1B286, + }, + [0x1B287]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B287", + direction="l", + linebreak="id", + unicodeslot=0x1B287, + }, + [0x1B288]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B288", + direction="l", + linebreak="id", + unicodeslot=0x1B288, + }, + [0x1B289]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B289", + direction="l", + linebreak="id", + unicodeslot=0x1B289, + }, + [0x1B28A]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B28A", + direction="l", + linebreak="id", + unicodeslot=0x1B28A, + }, + [0x1B28B]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B28B", + direction="l", + linebreak="id", + unicodeslot=0x1B28B, + }, + [0x1B28C]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B28C", + direction="l", + linebreak="id", + unicodeslot=0x1B28C, + }, + [0x1B28D]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B28D", + direction="l", + linebreak="id", + unicodeslot=0x1B28D, + }, + [0x1B28E]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B28E", + direction="l", + linebreak="id", + unicodeslot=0x1B28E, + }, + [0x1B28F]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B28F", + direction="l", + linebreak="id", + unicodeslot=0x1B28F, + }, + [0x1B290]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B290", + direction="l", + linebreak="id", + unicodeslot=0x1B290, + }, + [0x1B291]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B291", + direction="l", + linebreak="id", + unicodeslot=0x1B291, + }, + [0x1B292]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B292", + direction="l", + linebreak="id", + unicodeslot=0x1B292, + }, + [0x1B293]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B293", + direction="l", + linebreak="id", + unicodeslot=0x1B293, + }, + [0x1B294]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B294", + direction="l", + linebreak="id", + unicodeslot=0x1B294, + }, + [0x1B295]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B295", + direction="l", + linebreak="id", + unicodeslot=0x1B295, + }, + [0x1B296]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B296", + direction="l", + linebreak="id", + unicodeslot=0x1B296, + }, + [0x1B297]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B297", + direction="l", + linebreak="id", + unicodeslot=0x1B297, + }, + [0x1B298]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B298", + direction="l", + linebreak="id", + unicodeslot=0x1B298, + }, + [0x1B299]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B299", + direction="l", + linebreak="id", + unicodeslot=0x1B299, + }, + [0x1B29A]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B29A", + direction="l", + linebreak="id", + unicodeslot=0x1B29A, + }, + [0x1B29B]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B29B", + direction="l", + linebreak="id", + unicodeslot=0x1B29B, + }, + [0x1B29C]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B29C", + direction="l", + linebreak="id", + unicodeslot=0x1B29C, + }, + [0x1B29D]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B29D", + direction="l", + linebreak="id", + unicodeslot=0x1B29D, + }, + [0x1B29E]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B29E", + direction="l", + linebreak="id", + unicodeslot=0x1B29E, + }, + [0x1B29F]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B29F", + direction="l", + linebreak="id", + unicodeslot=0x1B29F, + }, + [0x1B2A0]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2A0", + direction="l", + linebreak="id", + unicodeslot=0x1B2A0, + }, + [0x1B2A1]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2A1", + direction="l", + linebreak="id", + unicodeslot=0x1B2A1, + }, + [0x1B2A2]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2A2", + direction="l", + linebreak="id", + unicodeslot=0x1B2A2, + }, + [0x1B2A3]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2A3", + direction="l", + linebreak="id", + unicodeslot=0x1B2A3, + }, + [0x1B2A4]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2A4", + direction="l", + linebreak="id", + unicodeslot=0x1B2A4, + }, + [0x1B2A5]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2A5", + direction="l", + linebreak="id", + unicodeslot=0x1B2A5, + }, + [0x1B2A6]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2A6", + direction="l", + linebreak="id", + unicodeslot=0x1B2A6, + }, + [0x1B2A7]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2A7", + direction="l", + linebreak="id", + unicodeslot=0x1B2A7, + }, + [0x1B2A8]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2A8", + direction="l", + linebreak="id", + unicodeslot=0x1B2A8, + }, + [0x1B2A9]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2A9", + direction="l", + linebreak="id", + unicodeslot=0x1B2A9, + }, + [0x1B2AA]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2AA", + direction="l", + linebreak="id", + unicodeslot=0x1B2AA, + }, + [0x1B2AB]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2AB", + direction="l", + linebreak="id", + unicodeslot=0x1B2AB, + }, + [0x1B2AC]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2AC", + direction="l", + linebreak="id", + unicodeslot=0x1B2AC, + }, + [0x1B2AD]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2AD", + direction="l", + linebreak="id", + unicodeslot=0x1B2AD, + }, + [0x1B2AE]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2AE", + direction="l", + linebreak="id", + unicodeslot=0x1B2AE, + }, + [0x1B2AF]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2AF", + direction="l", + linebreak="id", + unicodeslot=0x1B2AF, + }, + [0x1B2B0]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2B0", + direction="l", + linebreak="id", + unicodeslot=0x1B2B0, + }, + [0x1B2B1]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2B1", + direction="l", + linebreak="id", + unicodeslot=0x1B2B1, + }, + [0x1B2B2]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2B2", + direction="l", + linebreak="id", + unicodeslot=0x1B2B2, + }, + [0x1B2B3]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2B3", + direction="l", + linebreak="id", + unicodeslot=0x1B2B3, + }, + [0x1B2B4]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2B4", + direction="l", + linebreak="id", + unicodeslot=0x1B2B4, + }, + [0x1B2B5]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2B5", + direction="l", + linebreak="id", + unicodeslot=0x1B2B5, + }, + [0x1B2B6]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2B6", + direction="l", + linebreak="id", + unicodeslot=0x1B2B6, + }, + [0x1B2B7]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2B7", + direction="l", + linebreak="id", + unicodeslot=0x1B2B7, + }, + [0x1B2B8]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2B8", + direction="l", + linebreak="id", + unicodeslot=0x1B2B8, + }, + [0x1B2B9]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2B9", + direction="l", + linebreak="id", + unicodeslot=0x1B2B9, + }, + [0x1B2BA]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2BA", + direction="l", + linebreak="id", + unicodeslot=0x1B2BA, + }, + [0x1B2BB]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2BB", + direction="l", + linebreak="id", + unicodeslot=0x1B2BB, + }, + [0x1B2BC]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2BC", + direction="l", + linebreak="id", + unicodeslot=0x1B2BC, + }, + [0x1B2BD]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2BD", + direction="l", + linebreak="id", + unicodeslot=0x1B2BD, + }, + [0x1B2BE]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2BE", + direction="l", + linebreak="id", + unicodeslot=0x1B2BE, + }, + [0x1B2BF]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2BF", + direction="l", + linebreak="id", + unicodeslot=0x1B2BF, + }, + [0x1B2C0]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2C0", + direction="l", + linebreak="id", + unicodeslot=0x1B2C0, + }, + [0x1B2C1]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2C1", + direction="l", + linebreak="id", + unicodeslot=0x1B2C1, + }, + [0x1B2C2]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2C2", + direction="l", + linebreak="id", + unicodeslot=0x1B2C2, + }, + [0x1B2C3]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2C3", + direction="l", + linebreak="id", + unicodeslot=0x1B2C3, + }, + [0x1B2C4]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2C4", + direction="l", + linebreak="id", + unicodeslot=0x1B2C4, + }, + [0x1B2C5]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2C5", + direction="l", + linebreak="id", + unicodeslot=0x1B2C5, + }, + [0x1B2C6]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2C6", + direction="l", + linebreak="id", + unicodeslot=0x1B2C6, + }, + [0x1B2C7]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2C7", + direction="l", + linebreak="id", + unicodeslot=0x1B2C7, + }, + [0x1B2C8]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2C8", + direction="l", + linebreak="id", + unicodeslot=0x1B2C8, + }, + [0x1B2C9]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2C9", + direction="l", + linebreak="id", + unicodeslot=0x1B2C9, + }, + [0x1B2CA]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2CA", + direction="l", + linebreak="id", + unicodeslot=0x1B2CA, + }, + [0x1B2CB]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2CB", + direction="l", + linebreak="id", + unicodeslot=0x1B2CB, + }, + [0x1B2CC]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2CC", + direction="l", + linebreak="id", + unicodeslot=0x1B2CC, + }, + [0x1B2CD]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2CD", + direction="l", + linebreak="id", + unicodeslot=0x1B2CD, + }, + [0x1B2CE]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2CE", + direction="l", + linebreak="id", + unicodeslot=0x1B2CE, + }, + [0x1B2CF]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2CF", + direction="l", + linebreak="id", + unicodeslot=0x1B2CF, + }, + [0x1B2D0]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2D0", + direction="l", + linebreak="id", + unicodeslot=0x1B2D0, + }, + [0x1B2D1]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2D1", + direction="l", + linebreak="id", + unicodeslot=0x1B2D1, + }, + [0x1B2D2]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2D2", + direction="l", + linebreak="id", + unicodeslot=0x1B2D2, + }, + [0x1B2D3]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2D3", + direction="l", + linebreak="id", + unicodeslot=0x1B2D3, + }, + [0x1B2D4]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2D4", + direction="l", + linebreak="id", + unicodeslot=0x1B2D4, + }, + [0x1B2D5]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2D5", + direction="l", + linebreak="id", + unicodeslot=0x1B2D5, + }, + [0x1B2D6]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2D6", + direction="l", + linebreak="id", + unicodeslot=0x1B2D6, + }, + [0x1B2D7]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2D7", + direction="l", + linebreak="id", + unicodeslot=0x1B2D7, + }, + [0x1B2D8]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2D8", + direction="l", + linebreak="id", + unicodeslot=0x1B2D8, + }, + [0x1B2D9]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2D9", + direction="l", + linebreak="id", + unicodeslot=0x1B2D9, + }, + [0x1B2DA]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2DA", + direction="l", + linebreak="id", + unicodeslot=0x1B2DA, + }, + [0x1B2DB]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2DB", + direction="l", + linebreak="id", + unicodeslot=0x1B2DB, + }, + [0x1B2DC]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2DC", + direction="l", + linebreak="id", + unicodeslot=0x1B2DC, + }, + [0x1B2DD]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2DD", + direction="l", + linebreak="id", + unicodeslot=0x1B2DD, + }, + [0x1B2DE]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2DE", + direction="l", + linebreak="id", + unicodeslot=0x1B2DE, + }, + [0x1B2DF]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2DF", + direction="l", + linebreak="id", + unicodeslot=0x1B2DF, + }, + [0x1B2E0]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2E0", + direction="l", + linebreak="id", + unicodeslot=0x1B2E0, + }, + [0x1B2E1]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2E1", + direction="l", + linebreak="id", + unicodeslot=0x1B2E1, + }, + [0x1B2E2]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2E2", + direction="l", + linebreak="id", + unicodeslot=0x1B2E2, + }, + [0x1B2E3]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2E3", + direction="l", + linebreak="id", + unicodeslot=0x1B2E3, + }, + [0x1B2E4]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2E4", + direction="l", + linebreak="id", + unicodeslot=0x1B2E4, + }, + [0x1B2E5]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2E5", + direction="l", + linebreak="id", + unicodeslot=0x1B2E5, + }, + [0x1B2E6]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2E6", + direction="l", + linebreak="id", + unicodeslot=0x1B2E6, + }, + [0x1B2E7]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2E7", + direction="l", + linebreak="id", + unicodeslot=0x1B2E7, + }, + [0x1B2E8]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2E8", + direction="l", + linebreak="id", + unicodeslot=0x1B2E8, + }, + [0x1B2E9]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2E9", + direction="l", + linebreak="id", + unicodeslot=0x1B2E9, + }, + [0x1B2EA]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2EA", + direction="l", + linebreak="id", + unicodeslot=0x1B2EA, + }, + [0x1B2EB]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2EB", + direction="l", + linebreak="id", + unicodeslot=0x1B2EB, + }, + [0x1B2EC]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2EC", + direction="l", + linebreak="id", + unicodeslot=0x1B2EC, + }, + [0x1B2ED]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2ED", + direction="l", + linebreak="id", + unicodeslot=0x1B2ED, + }, + [0x1B2EE]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2EE", + direction="l", + linebreak="id", + unicodeslot=0x1B2EE, + }, + [0x1B2EF]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2EF", + direction="l", + linebreak="id", + unicodeslot=0x1B2EF, + }, + [0x1B2F0]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2F0", + direction="l", + linebreak="id", + unicodeslot=0x1B2F0, + }, + [0x1B2F1]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2F1", + direction="l", + linebreak="id", + unicodeslot=0x1B2F1, + }, + [0x1B2F2]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2F2", + direction="l", + linebreak="id", + unicodeslot=0x1B2F2, + }, + [0x1B2F3]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2F3", + direction="l", + linebreak="id", + unicodeslot=0x1B2F3, + }, + [0x1B2F4]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2F4", + direction="l", + linebreak="id", + unicodeslot=0x1B2F4, + }, + [0x1B2F5]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2F5", + direction="l", + linebreak="id", + unicodeslot=0x1B2F5, + }, + [0x1B2F6]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2F6", + direction="l", + linebreak="id", + unicodeslot=0x1B2F6, + }, + [0x1B2F7]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2F7", + direction="l", + linebreak="id", + unicodeslot=0x1B2F7, + }, + [0x1B2F8]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2F8", + direction="l", + linebreak="id", + unicodeslot=0x1B2F8, + }, + [0x1B2F9]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2F9", + direction="l", + linebreak="id", + unicodeslot=0x1B2F9, + }, + [0x1B2FA]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2FA", + direction="l", + linebreak="id", + unicodeslot=0x1B2FA, + }, + [0x1B2FB]={ + category="lo", + cjkwd="w", + description="NUSHU CHARACTER-1B2FB", + direction="l", + linebreak="id", + unicodeslot=0x1B2FB, + }, [0x1BC00]={ category="lo", description="DUPLOYAN LETTER H", @@ -202977,6 +210438,7 @@ characters.data={ linebreak="al", specials={ "font", 0x41 }, unicodeslot=0x1D49C, + visual="it", }, [0x1D49E]={ category="lu", @@ -202985,6 +210447,7 @@ characters.data={ linebreak="al", specials={ "font", 0x43 }, unicodeslot=0x1D49E, + visual="it", }, [0x1D49F]={ category="lu", @@ -202993,6 +210456,7 @@ characters.data={ linebreak="al", specials={ "font", 0x44 }, unicodeslot=0x1D49F, + visual="it", }, [0x1D4A2]={ category="lu", @@ -203001,6 +210465,7 @@ characters.data={ linebreak="al", specials={ "font", 0x47 }, unicodeslot=0x1D4A2, + visual="it", }, [0x1D4A5]={ category="lu", @@ -203009,6 +210474,7 @@ characters.data={ linebreak="al", specials={ "font", 0x4A }, unicodeslot=0x1D4A5, + visual="it", }, [0x1D4A6]={ category="lu", @@ -203017,6 +210483,7 @@ characters.data={ linebreak="al", specials={ "font", 0x4B }, unicodeslot=0x1D4A6, + visual="it", }, [0x1D4A9]={ category="lu", @@ -203025,6 +210492,7 @@ characters.data={ linebreak="al", specials={ "font", 0x4E }, unicodeslot=0x1D4A9, + visual="it", }, [0x1D4AA]={ category="lu", @@ -203033,6 +210501,7 @@ characters.data={ linebreak="al", specials={ "font", 0x4F }, unicodeslot=0x1D4AA, + visual="it", }, [0x1D4AB]={ category="lu", @@ -203042,6 +210511,7 @@ characters.data={ specials={ "font", 0x50 }, synonyms={ "power set" }, unicodeslot=0x1D4AB, + visual="it", }, [0x1D4AC]={ category="lu", @@ -203050,6 +210520,7 @@ characters.data={ linebreak="al", specials={ "font", 0x51 }, unicodeslot=0x1D4AC, + visual="it", }, [0x1D4AE]={ category="lu", @@ -203058,6 +210529,7 @@ characters.data={ linebreak="al", specials={ "font", 0x53 }, unicodeslot=0x1D4AE, + visual="it", }, [0x1D4AF]={ category="lu", @@ -203066,6 +210538,7 @@ characters.data={ linebreak="al", specials={ "font", 0x54 }, unicodeslot=0x1D4AF, + visual="it", }, [0x1D4B0]={ category="lu", @@ -203074,6 +210547,7 @@ characters.data={ linebreak="al", specials={ "font", 0x55 }, unicodeslot=0x1D4B0, + visual="it", }, [0x1D4B1]={ category="lu", @@ -203082,6 +210556,7 @@ characters.data={ linebreak="al", specials={ "font", 0x56 }, unicodeslot=0x1D4B1, + visual="it", }, [0x1D4B2]={ category="lu", @@ -203090,6 +210565,7 @@ characters.data={ linebreak="al", specials={ "font", 0x57 }, unicodeslot=0x1D4B2, + visual="it", }, [0x1D4B3]={ category="lu", @@ -203098,6 +210574,7 @@ characters.data={ linebreak="al", specials={ "font", 0x58 }, unicodeslot=0x1D4B3, + visual="it", }, [0x1D4B4]={ category="lu", @@ -203106,6 +210583,7 @@ characters.data={ linebreak="al", specials={ "font", 0x59 }, unicodeslot=0x1D4B4, + visual="it", }, [0x1D4B5]={ category="lu", @@ -203114,6 +210592,7 @@ characters.data={ linebreak="al", specials={ "font", 0x5A }, unicodeslot=0x1D4B5, + visual="it", }, [0x1D4B6]={ category="ll", @@ -203122,6 +210601,7 @@ characters.data={ linebreak="al", specials={ "font", 0x61 }, unicodeslot=0x1D4B6, + visual="it", }, [0x1D4B7]={ category="ll", @@ -203130,6 +210610,7 @@ characters.data={ linebreak="al", specials={ "font", 0x62 }, unicodeslot=0x1D4B7, + visual="it", }, [0x1D4B8]={ category="ll", @@ -203138,6 +210619,7 @@ characters.data={ linebreak="al", specials={ "font", 0x63 }, unicodeslot=0x1D4B8, + visual="it", }, [0x1D4B9]={ category="ll", @@ -203146,6 +210628,7 @@ characters.data={ linebreak="al", specials={ "font", 0x64 }, unicodeslot=0x1D4B9, + visual="it", }, [0x1D4BB]={ category="ll", @@ -203154,6 +210637,7 @@ characters.data={ linebreak="al", specials={ "font", 0x66 }, unicodeslot=0x1D4BB, + visual="it", }, [0x1D4BD]={ category="ll", @@ -203162,6 +210646,7 @@ characters.data={ linebreak="al", specials={ "font", 0x68 }, unicodeslot=0x1D4BD, + visual="it", }, [0x1D4BE]={ category="ll", @@ -203170,6 +210655,7 @@ characters.data={ linebreak="al", specials={ "font", 0x69 }, unicodeslot=0x1D4BE, + visual="it", }, [0x1D4BF]={ category="ll", @@ -203178,6 +210664,7 @@ characters.data={ linebreak="al", specials={ "font", 0x6A }, unicodeslot=0x1D4BF, + visual="it", }, [0x1D4C0]={ category="ll", @@ -203186,6 +210673,7 @@ characters.data={ linebreak="al", specials={ "font", 0x6B }, unicodeslot=0x1D4C0, + visual="it", }, [0x1D4C1]={ category="ll", @@ -203194,6 +210682,7 @@ characters.data={ linebreak="al", specials={ "font", 0x6C }, unicodeslot=0x1D4C1, + visual="it", }, [0x1D4C2]={ category="ll", @@ -203202,6 +210691,7 @@ characters.data={ linebreak="al", specials={ "font", 0x6D }, unicodeslot=0x1D4C2, + visual="it", }, [0x1D4C3]={ category="ll", @@ -203210,6 +210700,7 @@ characters.data={ linebreak="al", specials={ "font", 0x6E }, unicodeslot=0x1D4C3, + visual="it", }, [0x1D4C5]={ category="ll", @@ -203218,6 +210709,7 @@ characters.data={ linebreak="al", specials={ "font", 0x70 }, unicodeslot=0x1D4C5, + visual="it", }, [0x1D4C6]={ category="ll", @@ -203226,6 +210718,7 @@ characters.data={ linebreak="al", specials={ "font", 0x71 }, unicodeslot=0x1D4C6, + visual="it", }, [0x1D4C7]={ category="ll", @@ -203234,6 +210727,7 @@ characters.data={ linebreak="al", specials={ "font", 0x72 }, unicodeslot=0x1D4C7, + visual="it", }, [0x1D4C8]={ category="ll", @@ -203242,6 +210736,7 @@ characters.data={ linebreak="al", specials={ "font", 0x73 }, unicodeslot=0x1D4C8, + visual="it", }, [0x1D4C9]={ category="ll", @@ -203250,6 +210745,7 @@ characters.data={ linebreak="al", specials={ "font", 0x74 }, unicodeslot=0x1D4C9, + visual="it", }, [0x1D4CA]={ category="ll", @@ -203258,6 +210754,7 @@ characters.data={ linebreak="al", specials={ "font", 0x75 }, unicodeslot=0x1D4CA, + visual="it", }, [0x1D4CB]={ category="ll", @@ -203266,6 +210763,7 @@ characters.data={ linebreak="al", specials={ "font", 0x76 }, unicodeslot=0x1D4CB, + visual="it", }, [0x1D4CC]={ category="ll", @@ -203274,6 +210772,7 @@ characters.data={ linebreak="al", specials={ "font", 0x77 }, unicodeslot=0x1D4CC, + visual="it", }, [0x1D4CD]={ category="ll", @@ -203282,6 +210781,7 @@ characters.data={ linebreak="al", specials={ "font", 0x78 }, unicodeslot=0x1D4CD, + visual="it", }, [0x1D4CE]={ category="ll", @@ -203290,6 +210790,7 @@ characters.data={ linebreak="al", specials={ "font", 0x79 }, unicodeslot=0x1D4CE, + visual="it", }, [0x1D4CF]={ category="ll", @@ -203298,6 +210799,7 @@ characters.data={ linebreak="al", specials={ "font", 0x7A }, unicodeslot=0x1D4CF, + visual="it", }, [0x1D4D0]={ category="lu", @@ -203306,7 +210808,7 @@ characters.data={ linebreak="al", specials={ "font", 0x41 }, unicodeslot=0x1D4D0, - visual="bf", + visual="bi", }, [0x1D4D1]={ category="lu", @@ -203315,7 +210817,7 @@ characters.data={ linebreak="al", specials={ "font", 0x42 }, unicodeslot=0x1D4D1, - visual="bf", + visual="bi", }, [0x1D4D2]={ category="lu", @@ -203324,7 +210826,7 @@ characters.data={ linebreak="al", specials={ "font", 0x43 }, unicodeslot=0x1D4D2, - visual="bf", + visual="bi", }, [0x1D4D3]={ category="lu", @@ -203333,7 +210835,7 @@ characters.data={ linebreak="al", specials={ "font", 0x44 }, unicodeslot=0x1D4D3, - visual="bf", + visual="bi", }, [0x1D4D4]={ category="lu", @@ -203342,7 +210844,7 @@ characters.data={ linebreak="al", specials={ "font", 0x45 }, unicodeslot=0x1D4D4, - visual="bf", + visual="bi", }, [0x1D4D5]={ category="lu", @@ -203351,7 +210853,7 @@ characters.data={ linebreak="al", specials={ "font", 0x46 }, unicodeslot=0x1D4D5, - visual="bf", + visual="bi", }, [0x1D4D6]={ category="lu", @@ -203360,7 +210862,7 @@ characters.data={ linebreak="al", specials={ "font", 0x47 }, unicodeslot=0x1D4D6, - visual="bf", + visual="bi", }, [0x1D4D7]={ category="lu", @@ -203369,7 +210871,7 @@ characters.data={ linebreak="al", specials={ "font", 0x48 }, unicodeslot=0x1D4D7, - visual="bf", + visual="bi", }, [0x1D4D8]={ category="lu", @@ -203378,7 +210880,7 @@ characters.data={ linebreak="al", specials={ "font", 0x49 }, unicodeslot=0x1D4D8, - visual="bf", + visual="bi", }, [0x1D4D9]={ category="lu", @@ -203387,7 +210889,7 @@ characters.data={ linebreak="al", specials={ "font", 0x4A }, unicodeslot=0x1D4D9, - visual="bf", + visual="bi", }, [0x1D4DA]={ category="lu", @@ -203396,7 +210898,7 @@ characters.data={ linebreak="al", specials={ "font", 0x4B }, unicodeslot=0x1D4DA, - visual="bf", + visual="bi", }, [0x1D4DB]={ category="lu", @@ -203405,7 +210907,7 @@ characters.data={ linebreak="al", specials={ "font", 0x4C }, unicodeslot=0x1D4DB, - visual="bf", + visual="bi", }, [0x1D4DC]={ category="lu", @@ -203414,7 +210916,7 @@ characters.data={ linebreak="al", specials={ "font", 0x4D }, unicodeslot=0x1D4DC, - visual="bf", + visual="bi", }, [0x1D4DD]={ category="lu", @@ -203423,7 +210925,7 @@ characters.data={ linebreak="al", specials={ "font", 0x4E }, unicodeslot=0x1D4DD, - visual="bf", + visual="bi", }, [0x1D4DE]={ category="lu", @@ -203432,7 +210934,7 @@ characters.data={ linebreak="al", specials={ "font", 0x4F }, unicodeslot=0x1D4DE, - visual="bf", + visual="bi", }, [0x1D4DF]={ category="lu", @@ -203441,7 +210943,7 @@ characters.data={ linebreak="al", specials={ "font", 0x50 }, unicodeslot=0x1D4DF, - visual="bf", + visual="bi", }, [0x1D4E0]={ category="lu", @@ -203450,7 +210952,7 @@ characters.data={ linebreak="al", specials={ "font", 0x51 }, unicodeslot=0x1D4E0, - visual="bf", + visual="bi", }, [0x1D4E1]={ category="lu", @@ -203459,7 +210961,7 @@ characters.data={ linebreak="al", specials={ "font", 0x52 }, unicodeslot=0x1D4E1, - visual="bf", + visual="bi", }, [0x1D4E2]={ category="lu", @@ -203468,7 +210970,7 @@ characters.data={ linebreak="al", specials={ "font", 0x53 }, unicodeslot=0x1D4E2, - visual="bf", + visual="bi", }, [0x1D4E3]={ category="lu", @@ -203477,7 +210979,7 @@ characters.data={ linebreak="al", specials={ "font", 0x54 }, unicodeslot=0x1D4E3, - visual="bf", + visual="bi", }, [0x1D4E4]={ category="lu", @@ -203486,7 +210988,7 @@ characters.data={ linebreak="al", specials={ "font", 0x55 }, unicodeslot=0x1D4E4, - visual="bf", + visual="bi", }, [0x1D4E5]={ category="lu", @@ -203495,7 +210997,7 @@ characters.data={ linebreak="al", specials={ "font", 0x56 }, unicodeslot=0x1D4E5, - visual="bf", + visual="bi", }, [0x1D4E6]={ category="lu", @@ -203504,7 +211006,7 @@ characters.data={ linebreak="al", specials={ "font", 0x57 }, unicodeslot=0x1D4E6, - visual="bf", + visual="bi", }, [0x1D4E7]={ category="lu", @@ -203513,7 +211015,7 @@ characters.data={ linebreak="al", specials={ "font", 0x58 }, unicodeslot=0x1D4E7, - visual="bf", + visual="bi", }, [0x1D4E8]={ category="lu", @@ -203522,7 +211024,7 @@ characters.data={ linebreak="al", specials={ "font", 0x59 }, unicodeslot=0x1D4E8, - visual="bf", + visual="bi", }, [0x1D4E9]={ category="lu", @@ -203531,7 +211033,7 @@ characters.data={ linebreak="al", specials={ "font", 0x5A }, unicodeslot=0x1D4E9, - visual="bf", + visual="bi", }, [0x1D4EA]={ category="ll", @@ -203540,7 +211042,7 @@ characters.data={ linebreak="al", specials={ "font", 0x61 }, unicodeslot=0x1D4EA, - visual="bf", + visual="bi", }, [0x1D4EB]={ category="ll", @@ -203549,7 +211051,7 @@ characters.data={ linebreak="al", specials={ "font", 0x62 }, unicodeslot=0x1D4EB, - visual="bf", + visual="bi", }, [0x1D4EC]={ category="ll", @@ -203558,7 +211060,7 @@ characters.data={ linebreak="al", specials={ "font", 0x63 }, unicodeslot=0x1D4EC, - visual="bf", + visual="bi", }, [0x1D4ED]={ category="ll", @@ -203567,7 +211069,7 @@ characters.data={ linebreak="al", specials={ "font", 0x64 }, unicodeslot=0x1D4ED, - visual="bf", + visual="bi", }, [0x1D4EE]={ category="ll", @@ -203576,7 +211078,7 @@ characters.data={ linebreak="al", specials={ "font", 0x65 }, unicodeslot=0x1D4EE, - visual="bf", + visual="bi", }, [0x1D4EF]={ category="ll", @@ -203585,7 +211087,7 @@ characters.data={ linebreak="al", specials={ "font", 0x66 }, unicodeslot=0x1D4EF, - visual="bf", + visual="bi", }, [0x1D4F0]={ category="ll", @@ -203594,7 +211096,7 @@ characters.data={ linebreak="al", specials={ "font", 0x67 }, unicodeslot=0x1D4F0, - visual="bf", + visual="bi", }, [0x1D4F1]={ category="ll", @@ -203603,7 +211105,7 @@ characters.data={ linebreak="al", specials={ "font", 0x68 }, unicodeslot=0x1D4F1, - visual="bf", + visual="bi", }, [0x1D4F2]={ category="ll", @@ -203612,7 +211114,7 @@ characters.data={ linebreak="al", specials={ "font", 0x69 }, unicodeslot=0x1D4F2, - visual="bf", + visual="bi", }, [0x1D4F3]={ category="ll", @@ -203621,7 +211123,7 @@ characters.data={ linebreak="al", specials={ "font", 0x6A }, unicodeslot=0x1D4F3, - visual="bf", + visual="bi", }, [0x1D4F4]={ category="ll", @@ -203630,7 +211132,7 @@ characters.data={ linebreak="al", specials={ "font", 0x6B }, unicodeslot=0x1D4F4, - visual="bf", + visual="bi", }, [0x1D4F5]={ category="ll", @@ -203639,7 +211141,7 @@ characters.data={ linebreak="al", specials={ "font", 0x6C }, unicodeslot=0x1D4F5, - visual="bf", + visual="bi", }, [0x1D4F6]={ category="ll", @@ -203648,7 +211150,7 @@ characters.data={ linebreak="al", specials={ "font", 0x6D }, unicodeslot=0x1D4F6, - visual="bf", + visual="bi", }, [0x1D4F7]={ category="ll", @@ -203657,7 +211159,7 @@ characters.data={ linebreak="al", specials={ "font", 0x6E }, unicodeslot=0x1D4F7, - visual="bf", + visual="bi", }, [0x1D4F8]={ category="ll", @@ -203666,7 +211168,7 @@ characters.data={ linebreak="al", specials={ "font", 0x6F }, unicodeslot=0x1D4F8, - visual="bf", + visual="bi", }, [0x1D4F9]={ category="ll", @@ -203675,7 +211177,7 @@ characters.data={ linebreak="al", specials={ "font", 0x70 }, unicodeslot=0x1D4F9, - visual="bf", + visual="bi", }, [0x1D4FA]={ category="ll", @@ -203684,7 +211186,7 @@ characters.data={ linebreak="al", specials={ "font", 0x71 }, unicodeslot=0x1D4FA, - visual="bf", + visual="bi", }, [0x1D4FB]={ category="ll", @@ -203693,7 +211195,7 @@ characters.data={ linebreak="al", specials={ "font", 0x72 }, unicodeslot=0x1D4FB, - visual="bf", + visual="bi", }, [0x1D4FC]={ category="ll", @@ -203702,7 +211204,7 @@ characters.data={ linebreak="al", specials={ "font", 0x73 }, unicodeslot=0x1D4FC, - visual="bf", + visual="bi", }, [0x1D4FD]={ category="ll", @@ -203711,7 +211213,7 @@ characters.data={ linebreak="al", specials={ "font", 0x74 }, unicodeslot=0x1D4FD, - visual="bf", + visual="bi", }, [0x1D4FE]={ category="ll", @@ -203720,7 +211222,7 @@ characters.data={ linebreak="al", specials={ "font", 0x75 }, unicodeslot=0x1D4FE, - visual="bf", + visual="bi", }, [0x1D4FF]={ category="ll", @@ -203729,7 +211231,7 @@ characters.data={ linebreak="al", specials={ "font", 0x76 }, unicodeslot=0x1D4FF, - visual="bf", + visual="bi", }, [0x1D500]={ category="ll", @@ -203738,7 +211240,7 @@ characters.data={ linebreak="al", specials={ "font", 0x77 }, unicodeslot=0x1D500, - visual="bf", + visual="bi", }, [0x1D501]={ category="ll", @@ -203747,7 +211249,7 @@ characters.data={ linebreak="al", specials={ "font", 0x78 }, unicodeslot=0x1D501, - visual="bf", + visual="bi", }, [0x1D502]={ category="ll", @@ -203756,7 +211258,7 @@ characters.data={ linebreak="al", specials={ "font", 0x79 }, unicodeslot=0x1D502, - visual="bf", + visual="bi", }, [0x1D503]={ category="ll", @@ -203765,7 +211267,7 @@ characters.data={ linebreak="al", specials={ "font", 0x7A }, unicodeslot=0x1D503, - visual="bf", + visual="bi", }, [0x1D504]={ category="lu", @@ -222452,6 +229954,54 @@ characters.data={ specials={ "circle", 0x53EF }, unicodeslot=0x1F251, }, + [0x1F260]={ + category="so", + cjkwd="w", + description="ROUNDED SYMBOL FOR FU", + direction="on", + linebreak="id", + unicodeslot=0x1F260, + }, + [0x1F261]={ + category="so", + cjkwd="w", + description="ROUNDED SYMBOL FOR LU", + direction="on", + linebreak="id", + unicodeslot=0x1F261, + }, + [0x1F262]={ + category="so", + cjkwd="w", + description="ROUNDED SYMBOL FOR SHOU", + direction="on", + linebreak="id", + unicodeslot=0x1F262, + }, + [0x1F263]={ + category="so", + cjkwd="w", + description="ROUNDED SYMBOL FOR XI", + direction="on", + linebreak="id", + unicodeslot=0x1F263, + }, + [0x1F264]={ + category="so", + cjkwd="w", + description="ROUNDED SYMBOL FOR SHUANGXI", + direction="on", + linebreak="id", + unicodeslot=0x1F264, + }, + [0x1F265]={ + category="so", + cjkwd="w", + description="ROUNDED SYMBOL FOR CAI", + direction="on", + linebreak="id", + unicodeslot=0x1F265, + }, [0x1F300]={ category="so", cjkwd="w", @@ -224008,7 +231558,7 @@ characters.data={ cjkwd="w", description="SNOWBOARDER", direction="on", - linebreak="id", + linebreak="eb", unicodeslot=0x1F3C2, }, [0x1F3C3]={ @@ -224048,7 +231598,7 @@ characters.data={ cjkwd="w", description="HORSE RACING", direction="on", - linebreak="id", + linebreak="eb", unicodeslot=0x1F3C7, }, [0x1F3C8]={ @@ -224087,7 +231637,7 @@ characters.data={ category="so", description="GOLFER", direction="on", - linebreak="id", + linebreak="eb", unicodeslot=0x1F3CC, variants=variants_emoji, }, @@ -227468,7 +235018,7 @@ characters.data={ category="so", description="MAN IN BUSINESS SUIT LEVITATING", direction="on", - linebreak="id", + linebreak="eb", unicodeslot=0x1F574, variants=variants_emoji, }, @@ -230074,7 +237624,7 @@ characters.data={ cjkwd="w", description="SLEEPING ACCOMMODATION", direction="on", - linebreak="id", + linebreak="eb", unicodeslot=0x1F6CC, }, [0x1F6CD]={ @@ -230127,6 +237677,20 @@ characters.data={ synonyms={ "shopping cart" }, unicodeslot=0x1F6D2, }, + [0x1F6D3]={ + category="so", + description="STUPA", + direction="on", + linebreak="id", + unicodeslot=0x1F6D3, + }, + [0x1F6D4]={ + category="so", + description="PAGODA", + direction="on", + linebreak="id", + unicodeslot=0x1F6D4, + }, [0x1F6E0]={ category="so", description="HAMMER AND WRENCH", @@ -230281,6 +237845,22 @@ characters.data={ linebreak="id", unicodeslot=0x1F6F6, }, + [0x1F6F7]={ + category="so", + cjkwd="w", + description="SLED", + direction="on", + linebreak="id", + unicodeslot=0x1F6F7, + }, + [0x1F6F8]={ + category="so", + cjkwd="w", + description="FLYING SAUCER", + direction="on", + linebreak="id", + unicodeslot=0x1F6F8, + }, [0x1F700]={ category="so", description="ALCHEMICAL SYMBOL FOR QUINTESSENCE", @@ -232725,6 +240305,90 @@ characters.data={ linebreak="al", unicodeslot=0x1F8AD, }, + [0x1F900]={ + category="so", + description="CIRCLED CROSS FORMEE WITH FOUR DOTS", + direction="on", + linebreak="al", + unicodeslot=0x1F900, + }, + [0x1F901]={ + category="so", + description="CIRCLED CROSS FORMEE WITH TWO DOTS", + direction="on", + linebreak="al", + unicodeslot=0x1F901, + }, + [0x1F902]={ + category="so", + description="CIRCLED CROSS FORMEE", + direction="on", + linebreak="al", + unicodeslot=0x1F902, + }, + [0x1F903]={ + category="so", + description="LEFT HALF CIRCLE WITH FOUR DOTS", + direction="on", + linebreak="al", + unicodeslot=0x1F903, + }, + [0x1F904]={ + category="so", + description="LEFT HALF CIRCLE WITH THREE DOTS", + direction="on", + linebreak="al", + unicodeslot=0x1F904, + }, + [0x1F905]={ + category="so", + description="LEFT HALF CIRCLE WITH TWO DOTS", + direction="on", + linebreak="al", + unicodeslot=0x1F905, + }, + [0x1F906]={ + category="so", + description="LEFT HALF CIRCLE WITH DOT", + direction="on", + linebreak="al", + unicodeslot=0x1F906, + }, + [0x1F907]={ + category="so", + description="LEFT HALF CIRCLE", + direction="on", + linebreak="al", + unicodeslot=0x1F907, + }, + [0x1F908]={ + category="so", + description="DOWNWARD FACING HOOK", + direction="on", + linebreak="al", + unicodeslot=0x1F908, + }, + [0x1F909]={ + category="so", + description="DOWNWARD FACING NOTCHED HOOK", + direction="on", + linebreak="al", + unicodeslot=0x1F909, + }, + [0x1F90A]={ + category="so", + description="DOWNWARD FACING HOOK WITH DOT", + direction="on", + linebreak="al", + unicodeslot=0x1F90A, + }, + [0x1F90B]={ + category="so", + description="DOWNWARD FACING NOTCHED HOOK WITH DOT", + direction="on", + linebreak="al", + unicodeslot=0x1F90B, + }, [0x1F910]={ category="so", cjkwd="w", @@ -232834,7 +240498,7 @@ characters.data={ cjkwd="w", description="HANDSHAKE", direction="on", - linebreak="eb", + linebreak="id", unicodeslot=0x1F91D, }, [0x1F91E]={ @@ -232846,6 +240510,15 @@ characters.data={ synonyms={ "crossed fingers", "fingers crossed" }, unicodeslot=0x1F91E, }, + [0x1F91F]={ + category="so", + cjkwd="w", + description="I LOVE YOU HAND SIGN", + direction="on", + linebreak="eb", + synonyms={ "hand sign love" }, + unicodeslot=0x1F91F, + }, [0x1F920]={ category="so", cjkwd="w", @@ -232911,6 +240584,70 @@ characters.data={ linebreak="id", unicodeslot=0x1F927, }, + [0x1F928]={ + category="so", + cjkwd="w", + description="FACE WITH ONE EYEBROW RAISED", + direction="on", + linebreak="id", + unicodeslot=0x1F928, + }, + [0x1F929]={ + category="so", + cjkwd="w", + description="GRINNING FACE WITH STAR EYES", + direction="on", + linebreak="id", + unicodeslot=0x1F929, + }, + [0x1F92A]={ + category="so", + cjkwd="w", + description="GRINNING FACE WITH ONE LARGE AND ONE SMALL EYE", + direction="on", + linebreak="id", + unicodeslot=0x1F92A, + }, + [0x1F92B]={ + category="so", + cjkwd="w", + description="FACE WITH FINGER COVERING CLOSED LIPS", + direction="on", + linebreak="id", + unicodeslot=0x1F92B, + }, + [0x1F92C]={ + category="so", + cjkwd="w", + description="SERIOUS FACE WITH SYMBOLS COVERING MOUTH", + direction="on", + linebreak="id", + unicodeslot=0x1F92C, + }, + [0x1F92D]={ + category="so", + cjkwd="w", + description="SMILING FACE WITH SMILING EYES AND HAND COVERING MOUTH", + direction="on", + linebreak="id", + unicodeslot=0x1F92D, + }, + [0x1F92E]={ + category="so", + cjkwd="w", + description="FACE WITH OPEN MOUTH VOMITING", + direction="on", + linebreak="id", + unicodeslot=0x1F92E, + }, + [0x1F92F]={ + category="so", + cjkwd="w", + description="SHOCKED FACE WITH EXPLODING HEAD", + direction="on", + linebreak="id", + unicodeslot=0x1F92F, + }, [0x1F930]={ category="so", cjkwd="w", @@ -232919,6 +240656,22 @@ characters.data={ linebreak="eb", unicodeslot=0x1F930, }, + [0x1F931]={ + category="so", + cjkwd="w", + description="BREAST-FEEDING", + direction="on", + linebreak="eb", + unicodeslot=0x1F931, + }, + [0x1F932]={ + category="so", + cjkwd="w", + description="PALMS UP TOGETHER", + direction="on", + linebreak="eb", + unicodeslot=0x1F932, + }, [0x1F933]={ category="so", cjkwd="w", @@ -232996,7 +240749,7 @@ characters.data={ cjkwd="w", description="WRESTLERS", direction="on", - linebreak="eb", + linebreak="id", unicodeslot=0x1F93C, }, [0x1F93D]={ @@ -233114,6 +240867,14 @@ characters.data={ linebreak="id", unicodeslot=0x1F94B, }, + [0x1F94C]={ + category="so", + cjkwd="w", + description="CURLING STONE", + direction="on", + linebreak="id", + unicodeslot=0x1F94C, + }, [0x1F950]={ category="so", cjkwd="w", @@ -233235,6 +240996,110 @@ characters.data={ linebreak="id", unicodeslot=0x1F95E, }, + [0x1F95F]={ + category="so", + cjkwd="w", + description="DUMPLING", + direction="on", + linebreak="id", + unicodeslot=0x1F95F, + }, + [0x1F960]={ + category="so", + cjkwd="w", + description="FORTUNE COOKIE", + direction="on", + linebreak="id", + unicodeslot=0x1F960, + }, + [0x1F961]={ + category="so", + cjkwd="w", + description="TAKEOUT BOX", + direction="on", + linebreak="id", + unicodeslot=0x1F961, + }, + [0x1F962]={ + category="so", + cjkwd="w", + description="CHOPSTICKS", + direction="on", + linebreak="id", + unicodeslot=0x1F962, + }, + [0x1F963]={ + category="so", + cjkwd="w", + description="BOWL WITH SPOON", + direction="on", + linebreak="id", + unicodeslot=0x1F963, + }, + [0x1F964]={ + category="so", + cjkwd="w", + description="CUP WITH STRAW", + direction="on", + linebreak="id", + unicodeslot=0x1F964, + }, + [0x1F965]={ + category="so", + cjkwd="w", + description="COCONUT", + direction="on", + linebreak="id", + unicodeslot=0x1F965, + }, + [0x1F966]={ + category="so", + cjkwd="w", + description="BROCCOLI", + direction="on", + linebreak="id", + unicodeslot=0x1F966, + }, + [0x1F967]={ + category="so", + cjkwd="w", + description="PIE", + direction="on", + linebreak="id", + unicodeslot=0x1F967, + }, + [0x1F968]={ + category="so", + cjkwd="w", + description="PRETZEL", + direction="on", + linebreak="id", + unicodeslot=0x1F968, + }, + [0x1F969]={ + category="so", + cjkwd="w", + description="CUT OF MEAT", + direction="on", + linebreak="id", + unicodeslot=0x1F969, + }, + [0x1F96A]={ + category="so", + cjkwd="w", + description="SANDWICH", + direction="on", + linebreak="id", + unicodeslot=0x1F96A, + }, + [0x1F96B]={ + category="so", + cjkwd="w", + description="CANNED FOOD", + direction="on", + linebreak="id", + unicodeslot=0x1F96B, + }, [0x1F980]={ category="so", cjkwd="w", @@ -233379,6 +241244,55 @@ characters.data={ linebreak="id", unicodeslot=0x1F991, }, + [0x1F992]={ + category="so", + cjkwd="w", + description="GIRAFFE FACE", + direction="on", + linebreak="id", + unicodeslot=0x1F992, + }, + [0x1F993]={ + category="so", + cjkwd="w", + description="ZEBRA FACE", + direction="on", + linebreak="id", + unicodeslot=0x1F993, + }, + [0x1F994]={ + category="so", + cjkwd="w", + description="HEDGEHOG", + direction="on", + linebreak="id", + unicodeslot=0x1F994, + }, + [0x1F995]={ + category="so", + cjkwd="w", + description="SAUROPOD", + direction="on", + linebreak="id", + unicodeslot=0x1F995, + }, + [0x1F996]={ + category="so", + cjkwd="w", + description="T-REX", + direction="on", + linebreak="id", + synonyms={ "tyrannosaurus rex" }, + unicodeslot=0x1F996, + }, + [0x1F997]={ + category="so", + cjkwd="w", + description="CRICKET", + direction="on", + linebreak="id", + unicodeslot=0x1F997, + }, [0x1F9C0]={ category="so", cjkwd="w", @@ -233387,6 +241301,190 @@ characters.data={ linebreak="id", unicodeslot=0x1F9C0, }, + [0x1F9D0]={ + category="so", + cjkwd="w", + description="FACE WITH MONOCLE", + direction="on", + linebreak="id", + unicodeslot=0x1F9D0, + }, + [0x1F9D1]={ + category="so", + cjkwd="w", + description="ADULT", + direction="on", + linebreak="eb", + unicodeslot=0x1F9D1, + }, + [0x1F9D2]={ + category="so", + cjkwd="w", + description="CHILD", + direction="on", + linebreak="eb", + unicodeslot=0x1F9D2, + }, + [0x1F9D3]={ + category="so", + cjkwd="w", + description="OLDER ADULT", + direction="on", + linebreak="eb", + unicodeslot=0x1F9D3, + }, + [0x1F9D4]={ + category="so", + cjkwd="w", + description="BEARDED PERSON", + direction="on", + linebreak="eb", + unicodeslot=0x1F9D4, + }, + [0x1F9D5]={ + category="so", + cjkwd="w", + description="PERSON WITH HEADSCARF", + direction="on", + linebreak="eb", + unicodeslot=0x1F9D5, + }, + [0x1F9D6]={ + category="so", + cjkwd="w", + description="PERSON IN STEAMY ROOM", + direction="on", + linebreak="eb", + unicodeslot=0x1F9D6, + }, + [0x1F9D7]={ + category="so", + cjkwd="w", + description="PERSON CLIMBING", + direction="on", + linebreak="eb", + unicodeslot=0x1F9D7, + }, + [0x1F9D8]={ + category="so", + cjkwd="w", + description="PERSON IN LOTUS POSITION", + direction="on", + linebreak="eb", + unicodeslot=0x1F9D8, + }, + [0x1F9D9]={ + category="so", + cjkwd="w", + description="MAGE", + direction="on", + linebreak="eb", + unicodeslot=0x1F9D9, + }, + [0x1F9DA]={ + category="so", + cjkwd="w", + description="FAIRY", + direction="on", + linebreak="eb", + unicodeslot=0x1F9DA, + }, + [0x1F9DB]={ + category="so", + cjkwd="w", + description="VAMPIRE", + direction="on", + linebreak="eb", + unicodeslot=0x1F9DB, + }, + [0x1F9DC]={ + category="so", + cjkwd="w", + description="MERPERSON", + direction="on", + linebreak="eb", + unicodeslot=0x1F9DC, + }, + [0x1F9DD]={ + category="so", + cjkwd="w", + description="ELF", + direction="on", + linebreak="eb", + unicodeslot=0x1F9DD, + }, + [0x1F9DE]={ + category="so", + cjkwd="w", + description="GENIE", + direction="on", + linebreak="id", + unicodeslot=0x1F9DE, + }, + [0x1F9DF]={ + category="so", + cjkwd="w", + description="ZOMBIE", + direction="on", + linebreak="id", + unicodeslot=0x1F9DF, + }, + [0x1F9E0]={ + category="so", + cjkwd="w", + description="BRAIN", + direction="on", + linebreak="id", + unicodeslot=0x1F9E0, + }, + [0x1F9E1]={ + category="so", + cjkwd="w", + description="ORANGE HEART", + direction="on", + linebreak="id", + unicodeslot=0x1F9E1, + }, + [0x1F9E2]={ + category="so", + cjkwd="w", + description="BILLED CAP", + direction="on", + linebreak="id", + unicodeslot=0x1F9E2, + }, + [0x1F9E3]={ + category="so", + cjkwd="w", + description="SCARF", + direction="on", + linebreak="id", + unicodeslot=0x1F9E3, + }, + [0x1F9E4]={ + category="so", + cjkwd="w", + description="GLOVES", + direction="on", + linebreak="id", + unicodeslot=0x1F9E4, + }, + [0x1F9E5]={ + category="so", + cjkwd="w", + description="COAT", + direction="on", + linebreak="id", + unicodeslot=0x1F9E5, + }, + [0x1F9E6]={ + category="so", + cjkwd="w", + description="SOCKS", + direction="on", + linebreak="id", + unicodeslot=0x1F9E6, + }, [0x2F800]={ category="lo", cjkwd="w", diff --git a/tex/context/base/mkiv/char-enc.mkiv b/tex/context/base/mkiv/char-enc.mkiv index 86ab2591a..d0dd3d20a 100644 --- a/tex/context/base/mkiv/char-enc.mkiv +++ b/tex/context/base/mkiv/char-enc.mkiv @@ -13,6 +13,6 @@ \writestatus{loading}{ConTeXt Character Support / Encodings} -\registerctxluafile{char-enc}{1.001} +\registerctxluafile{char-enc}{} \endinput diff --git a/tex/context/base/mkiv/char-fio.lua b/tex/context/base/mkiv/char-fio.lua index fa69d9356..9939bf041 100644 --- a/tex/context/base/mkiv/char-fio.lua +++ b/tex/context/base/mkiv/char-fio.lua @@ -29,10 +29,10 @@ disableaction(textfileactions, "characters.filters.utf.reorder") appendaction (textlineactions,"system","characters.filters.utf.reorder") disableaction(textlineactions, "characters.filters.utf.reorder") -appendaction (textfileactions,"system","characters.filters.utf.collapse") +appendaction (textfileactions,"system","characters.filters.utf.collapse") -- not per line disableaction(textfileactions, "characters.filters.utf.collapse") -appendaction (textfileactions,"system","characters.filters.utf.decompose") +appendaction (textfileactions,"system","characters.filters.utf.decompose") -- not per line disableaction(textfileactions, "characters.filters.utf.decompose") local report = logs.reporter("unicode filter") @@ -65,12 +65,14 @@ function utffilters.enable() end local function configure(what,v) - if v == "line" then + if v == "" then + report("%a unset",what) + elseif v == "line" then disableaction(textfileactions,what) enableaction (textlineactions,what) elseif not toboolean(v) then if reporting ~= "never" then - report("%a disabled",k) + report("%a disabled",what) reporting = "yes" end enforced[what] = false @@ -82,6 +84,10 @@ local function configure(what,v) end end +-- first line: +-- +-- % directives="filters.utf.collapse=true" + directives.register("filters.utf.reorder", function(v) configure("characters.filters.utf.reorder", v) end) directives.register("filters.utf.collapse", function(v) configure("characters.filters.utf.collapse", v) end) directives.register("filters.utf.decompose", function(v) configure("characters.filters.utf.decompose",v) end) diff --git a/tex/context/base/mkiv/char-ini.lua b/tex/context/base/mkiv/char-ini.lua index 8fe852b58..c308a2c0f 100644 --- a/tex/context/base/mkiv/char-ini.lua +++ b/tex/context/base/mkiv/char-ini.lua @@ -14,7 +14,7 @@ if not modules then modules = { } end modules ['char-ini'] = { local utfchar, utfbyte, utfvalues, ustring, utotable = utf.char, utf.byte, utf.values, utf.ustring, utf.totable local concat, unpack, tohash, insert = table.concat, table.unpack, table.tohash, table.insert local next, tonumber, type, rawget, rawset = next, tonumber, type, rawget, rawset -local format, lower, gsub, find, match = string.format, string.lower, string.gsub, string.find, string.match +local format, lower, gsub, find = string.format, string.lower, string.gsub, string.find local P, R, S, C, Cs, Ct, Cc, V = lpeg.P, lpeg.R, lpeg.S, lpeg.C, lpeg.Cs, lpeg.Ct, lpeg.Cc, lpeg.V local formatters = string.formatters @@ -63,6 +63,20 @@ else end --[[ldx-- +Extending the table. +--ldx]]-- + +if context and not characters.private then + + require("char-prv") + + for unicode, d in next, characters.private do + data[unicode] = d + end + +end + +--[[ldx-- <p>This converts a string (if given) into a number.</p> --ldx]]-- @@ -233,6 +247,7 @@ local blocks = allocate { ["cjkunifiedideographsextensionc"] = { first = 0x2A700, last = 0x2B73F, description = "CJK Unified Ideographs Extension C" }, ["cjkunifiedideographsextensiond"] = { first = 0x2B740, last = 0x2B81F, description = "CJK Unified Ideographs Extension D" }, ["cjkunifiedideographsextensione"] = { first = 0x2B820, last = 0x2CEAF, description = "CJK Unified Ideographs Extension E" }, + ["cjkunifiedideographsextensionf"] = { first = 0x2CEB0, last = 0x2EBEF, description = "CJK Unified Ideographs Extension F" }, ["combiningdiacriticalmarks"] = { first = 0x00300, last = 0x0036F, description = "Combining Diacritical Marks" }, ["combiningdiacriticalmarksextended"] = { first = 0x01AB0, last = 0x01AFF, description = "Combining Diacritical Marks Extended" }, ["combiningdiacriticalmarksforsymbols"] = { first = 0x020D0, last = 0x020FF, description = "Combining Diacritical Marks for Symbols" }, @@ -328,6 +343,7 @@ local blocks = allocate { ["ipaextensions"] = { first = 0x00250, last = 0x002AF, description = "IPA Extensions" }, ["javanese"] = { first = 0x0A980, last = 0x0A9DF, description = "Javanese" }, ["kaithi"] = { first = 0x11080, last = 0x110CF, description = "Kaithi" }, + ["kanaextendeda"] = { first = 0x1B100, last = 0x1B12F, description = "Kana Extended-A" }, ["kanasupplement"] = { first = 0x1B000, last = 0x1B0FF, description = "Kana Supplement" }, ["kanbun"] = { first = 0x03190, last = 0x0319F, description = "Kanbun" }, ["kangxiradicals"] = { first = 0x02F00, last = 0x02FDF, description = "Kangxi Radicals" }, @@ -384,6 +400,7 @@ local blocks = allocate { ["mandaic"] = { first = 0x00840, last = 0x0085F, otf="mand", description = "Mandaic" }, ["manichaean"] = { first = 0x10AC0, last = 0x10AFF, description = "Manichaean" }, ["marchen"] = { first = 0x11C70, last = 0x11CBF, description = "Marchen" }, + ["masaramgondi"] = { first = 0x11D00, last = 0x11D5F, description = "Masaram Gondi" }, ["mathematicalalphanumericsymbols"] = { first = 0x1D400, last = 0x1D7FF, math = true, description = "Mathematical Alphanumeric Symbols" }, ["mathematicaloperators"] = { first = 0x02200, last = 0x022FF, math = true, description = "Mathematical Operators" }, ["meeteimayek"] = { first = 0x0ABC0, last = 0x0ABFF, description = "Meetei Mayek" }, @@ -413,6 +430,7 @@ local blocks = allocate { ["newtailue"] = { first = 0x01980, last = 0x019DF, description = "New Tai Lue" }, ["nko"] = { first = 0x007C0, last = 0x007FF, otf="nko", description = "NKo" }, ["numberforms"] = { first = 0x02150, last = 0x0218F, description = "Number Forms" }, + ["nushu"] = { first = 0x1B170, last = 0x1B2FF, description = "Nushu" }, ["ogham"] = { first = 0x01680, last = 0x0169F, otf="ogam", description = "Ogham" }, ["olchiki"] = { first = 0x01C50, last = 0x01C7F, description = "Ol Chiki" }, ["oldhungarian"] = { first = 0x10C80, last = 0x10CFF, description = "Old Hungarian" }, @@ -451,6 +469,7 @@ local blocks = allocate { ["sinhalaarchaicnumbers"] = { first = 0x111E0, last = 0x111FF, description = "Sinhala Archaic Numbers" }, ["smallformvariants"] = { first = 0x0FE50, last = 0x0FE6F, description = "Small Form Variants" }, ["sorasompeng"] = { first = 0x110D0, last = 0x110FF, description = "Sora Sompeng" }, + ["soyombo"] = { first = 0x11A50, last = 0x11AAF, description = "Soyombo" }, ["spacingmodifierletters"] = { first = 0x002B0, last = 0x002FF, description = "Spacing Modifier Letters" }, ["specials"] = { first = 0x0FFF0, last = 0x0FFFF, description = "Specials" }, ["sundanese"] = { first = 0x01B80, last = 0x01BBF, description = "Sundanese" }, @@ -467,6 +486,7 @@ local blocks = allocate { ["suttonsignwriting"] = { first = 0x1D800, last = 0x1DAAF, description = "Sutton SignWriting" }, ["sylotinagri"] = { first = 0x0A800, last = 0x0A82F, otf="sylo", description = "Syloti Nagri" }, ["syriac"] = { first = 0x00700, last = 0x0074F, otf="syrc", description = "Syriac" }, + ["syriacsupplement"] = { first = 0x00860, last = 0x0086F, description = "Syriac Supplement" }, ["tagalog"] = { first = 0x01700, last = 0x0171F, otf="tglg", description = "Tagalog" }, ["tagbanwa"] = { first = 0x01760, last = 0x0177F, otf="tagb", description = "Tagbanwa" }, ["tags"] = { first = 0xE0000, last = 0xE007F, description = "Tags" }, @@ -492,7 +512,7 @@ local blocks = allocate { ["uppercaseboldfraktur"] = { first = 0x1D56C, last = 0x1D585, math = true }, ["uppercasebolditalic"] = { first = 0x1D468, last = 0x1D481, math = true }, ["uppercaseboldscript"] = { first = 0x1D4D0, last = 0x1D4E9, math = true }, - ["uppercasedoublestruck"] = { first = 0x1D538, last = 0x1D551, math = true }, + ["uppercasedoublestruck"] = { first = 0x1D538, last = 0x1D551, math = true }, -- gaps are filled in elsewhere ["uppercasefraktur"] = { first = 0x1D504, last = 0x1D51D, math = true }, ["uppercasegreekbold"] = { first = 0x1D6A8, last = 0x1D6C1, math = true }, ["uppercasegreekbolditalic"] = { first = 0x1D71C, last = 0x1D735, math = true }, @@ -517,6 +537,53 @@ local blocks = allocate { ["yijinghexagramsymbols"] = { first = 0x04DC0, last = 0x04DFF, otf="yi", description = "Yijing Hexagram Symbols" }, ["yiradicals"] = { first = 0x0A490, last = 0x0A4CF, otf="yi", description = "Yi Radicals" }, ["yisyllables"] = { first = 0x0A000, last = 0x0A48F, otf="yi", description = "Yi Syllables" }, + ["zanabazarsquare"] = { first = 0x11A00, last = 0x11A4F, description = "Zanabazar Square" }, +} + +-- moved from math-act.lua to here: + +-- operators : 0x02200 +-- symbolsa : 0x02701 +-- symbolsb : 0x02901 +-- supplemental : 0x02A00 + +blocks.lowercaseitalic.gaps = { + [0x1D455] = 0x0210E, -- ℎ h +} + +blocks.uppercasescript.gaps = { + [0x1D49D] = 0x0212C, -- ℬ script B + [0x1D4A0] = 0x02130, -- ℰ script E + [0x1D4A1] = 0x02131, -- ℱ script F + [0x1D4A3] = 0x0210B, -- ℋ script H + [0x1D4A4] = 0x02110, -- ℐ script I + [0x1D4A7] = 0x02112, -- ℒ script L + [0x1D4A8] = 0x02133, -- ℳ script M + [0x1D4AD] = 0x0211B, -- ℛ script R +} + +blocks.lowercasescript.gaps = { + [0x1D4BA] = 0x0212F, -- ℯ script e + [0x1D4BC] = 0x0210A, -- ℊ script g + [0x1D4C4] = 0x02134, -- ℴ script o +} + +blocks.uppercasefraktur.gaps = { + [0x1D506] = 0x0212D, -- ℭ fraktur C + [0x1D50B] = 0x0210C, -- ℌ fraktur H + [0x1D50C] = 0x02111, -- ℑ fraktur I + [0x1D515] = 0x0211C, -- ℜ fraktur R + [0x1D51D] = 0x02128, -- ℨ fraktur Z +} + +blocks.uppercasedoublestruck.gaps = { + [0x1D53A] = 0x02102, -- ℂ bb C + [0x1D53F] = 0x0210D, -- ℍ bb H + [0x1D545] = 0x02115, -- ℕ bb N + [0x1D547] = 0x02119, -- ℙ bb P + [0x1D548] = 0x0211A, -- ℚ bb Q + [0x1D549] = 0x0211D, -- ℝ bb R + [0x1D551] = 0x02124, -- ℤ bb Z } characters.blocks = blocks @@ -704,7 +771,7 @@ setmetatableindex(characters.is_punctuation,mti) -- -- comments taken from standard: -characters.linebreaks = { +characters.linebreaks = allocate { -- non-tailorable line breaking classes @@ -799,7 +866,7 @@ table we derive a few more.</p> if not characters.fallbacks then - characters.fallbacks = { + characters.fallbacks = allocate { [0x0308] = 0x00A8, [0x00A8] = 0x0308, -- dieresiscmb dieresis [0x0304] = 0x00AF, [0x00AF] = 0x0304, -- macroncmb macron [0x0301] = 0x00B4, [0x00B4] = 0x0301, -- acutecomb acute @@ -999,7 +1066,7 @@ setmetatableindex(descriptions, function(t,k) for u, c in next, data do local d = c.description if d then - if find(d," ") then + if find(d," ",1,true) then d = gsub(d," ","") end d = lower(d) @@ -1017,7 +1084,7 @@ setmetatableindex(synonyms, function(t,k) for u, c in next, data do local s = c.synonyms if s then - if find(s," ") then + if find(s," ",1,true) then s = gsub(s," ","") end -- s = lower(s) -- is already lowercase @@ -1544,35 +1611,35 @@ local cache = setmetatable({ }, { __mode = "k" } ) if h then return h end -local h = cache[name] -if h then - return h -elseif h == false then - return -end + local h = cache[name] + if h then + return h + elseif h == false then + return + end -- expand shortcuts local name = lpegmatch(pattern_0,name) or name -- expand some 25K variants local h = lpegmatch(p_special,name) if h then -cache[name] = h + cache[name] = h return h end -- simplify local s = lpegmatch(pattern_1,name) local h = hash[s] if h then -cache[name] = h + cache[name] = h return h end -- simplify local s = lpegmatch(pattern_2,name) local h = hash[s] if h then -cache[name] = h + cache[name] = h return h end -cache[name] = false + cache[name] = false end function emoji.known() diff --git a/tex/context/base/mkiv/char-ini.mkiv b/tex/context/base/mkiv/char-ini.mkiv index 8f5a8da8f..9c41df673 100644 --- a/tex/context/base/mkiv/char-ini.mkiv +++ b/tex/context/base/mkiv/char-ini.mkiv @@ -13,10 +13,10 @@ \writestatus{loading}{ConTeXt Character Support / Initialization} -\registerctxluafile{char-fio}{1.001} -\registerctxluafile{char-map}{1.001} % maybe we will load this someplace else -\registerctxluafile{char-tex}{1.001} -\registerctxluafile{char-ent}{1.001} +\registerctxluafile{char-fio}{} +\registerctxluafile{char-map}{} % maybe we will load this someplace else +\registerctxluafile{char-tex}{} +\registerctxluafile{char-ent}{} \unprotect diff --git a/tex/context/base/mkiv/char-obs.lua b/tex/context/base/mkiv/char-obs.lua deleted file mode 100644 index 0f0e43d3c..000000000 --- a/tex/context/base/mkiv/char-obs.lua +++ /dev/null @@ -1,269 +0,0 @@ ------------------------- ------ char-ini.lua ----- ------------------------- - --- local template_a = "\\startextendcatcodetable{%s}\\chardef\\l=11\\chardef\\a=13\\let\\c\\catcode%s\\let\\a\\undefined\\let\\l\\undefined\\let\\c\\undefined\\stopextendcatcodetable" --- local template_b = "\\chardef\\l=11\\chardef\\a=13\\let\\c\\catcode%s\\let\\a\\undefined\\let\\l\\undefined\\let\\c\\undefined" --- --- function characters.define(tobelettered, tobeactivated) -- catcodetables --- local lettered, activated, l, a = { }, { }, 0, 0 --- for u, chr in next, data do --- -- we can use a macro instead of direct settings --- local fallback = chr.fallback --- if fallback then --- -- texprint(format("{\\catcode %s=13\\unexpanded\\gdef %s{\\checkedchar{%s}{%s}}}",u,utfchar(u),u,fallback)) --- texsprint("{\\catcode",u,"=13\\unexpanded\\gdef ",utfchar(u),"{\\checkedchar{",u,"}{",fallback,"}}}") -- no texprint --- a = a + 1 --- activated[a] = "\\c"..u.."\\a" --- else --- local contextname = chr.contextname --- local category = chr.category --- if contextname then --- if is_character[category] then --- -- by this time, we're still in normal catcode mode --- -- subtle: not "\\",contextname but "\\"..contextname --- if chr.unicodeslot < 128 then --- texprint(ctxcatcodes,format("\\chardef\\%s=%s",contextname,u)) --- else --- texprint(ctxcatcodes,format("\\let\\%s=%s",contextname,utfchar(u))) --- if is_letter[category] then --- l = l + 1 --- lettered[l] = "\\c"..u.."\\l" --- end --- end --- elseif is_command[category] then --- -- this might change: contextcommand ipv contextname --- -- texprint(format("{\\catcode %s=13\\unexpanded\\gdef %s{\\%s}}",u,utfchar(u),contextname)) --- texsprint("{\\catcode",u,"=13\\unexpanded\\gdef ",utfchar(u),"{\\"..contextname,"}}") -- no texprint --- a = a + 1 --- activated[a] = "\\c"..u.."\\a" --- end --- elseif is_letter[category] then --- if u >= 128 and u <= 65536 then -- catch private mess --- l = l + 1 --- lettered[l] = "\\c"..u.."\\l" --- end --- end --- end --- local range = chr.range --- if range then --- l = l + 1 --- lettered[l] = format('\\dofastrecurse{"%05X}{"%05X}{1}{\\c\\fastrecursecounter\\l}',range.first,range.last) --- end --- end --- -- if false then --- l = l + 1 --- lettered[l] = "\\c"..0x200C.."\\l" -- non-joiner --- l = l + 1 --- lettered[l] = "\\c"..0x200D.."\\l" -- joiner --- -- fi --- if tobelettered then --- lettered = concat(lettered) --- if true then --- texsprint(ctxcatcodes,format(template_b,lettered)) -- global --- else --- for l=1,#tobelettered do --- texsprint(ctxcatcodes,format(template_a,tobelettered[l],lettered)) --- end --- end --- end --- if tobeactivated then --- activated = concat(activated) --- for a=1,#tobeactivated do --- texsprint(ctxcatcodes,format(template_a,tobeactivated[a],activated)) --- end --- end --- end --- --- function characters.setcodes() --- for code, chr in next, data do --- local cc = chr.category --- if cc == 'll' or cc == 'lu' or cc == 'lt' then --- local lc, uc = chr.lccode, chr.uccode --- if not lc then chr.lccode, lc = code, code end --- if not uc then chr.uccode, uc = code, code end --- texsprint(ctxcatcodes,format("\\setcclcuc{%i}{%i}{%i}",code,lc,uc)) --- end --- if cc == "lu" then --- texprint(ctxcatcodes,"\\sfcode ",code,"999 ") --- end --- if cc == "lo" then --- local range = chr.range --- if range then --- texsprint(ctxcatcodes,format('\\dofastrecurse{"%05X}{"%05X}{1}{\\setcclcucself\\fastrecursecounter}',range.first,range.last)) --- end --- end --- end --- end - --- --[[ldx-- --- <p>The next variant has lazy token collecting, on a 140 page mk.tex this saves --- about .25 seconds, which is understandable because we have no graphemes and --- not collecting tokens is not only faster but also saves garbage collecting. --- </p> --- --ldx]]-- --- --- function utffilters.collapse(str,filename) -- we can make high a seperate pass (never needed with collapse) --- if skippable[filesuffix(filename)] then --- return str --- -- elseif find(filename,"^virtual://") then --- -- return str --- -- else --- -- -- print("\n"..filename) --- end --- if str and str ~= "" then --- local nstr = #str --- if nstr > 1 then --- if initialize then -- saves a call --- initialize() --- end --- local tokens, t, first, done, n = { }, 0, false, false, 0 --- for second in utfcharacters(str) do --- if done then --- if first then --- if second == " " then --- t = t + 1 --- tokens[t] = first --- first = second --- else --- -- local crs = high[second] --- -- if crs then --- -- t = t + 1 --- -- tokens[t] = first --- -- first = crs --- -- else --- local cgf = graphemes[first] --- if cgf and cgf[second] then --- first = cgf[second] --- else --- t = t + 1 --- tokens[t] = first --- first = second --- end --- -- end --- end --- elseif second == " " then --- first = second --- else --- -- local crs = high[second] --- -- if crs then --- -- first = crs --- -- else --- first = second --- -- end --- end --- elseif second == " " then --- first = nil --- n = n + 1 --- else --- -- local crs = high[second] --- -- if crs then --- -- for s in utfcharacters(str) do --- -- if n == 1 then --- -- break --- -- else --- -- t = t + 1 --- -- tokens[t] = s --- -- n = n - 1 --- -- end --- -- end --- -- if first then --- -- t = t + 1 --- -- tokens[t] = first --- -- end --- -- first = crs --- -- done = true --- -- else --- local cgf = graphemes[first] --- if cgf and cgf[second] then --- for s in utfcharacters(str) do --- if n == 1 then --- break --- else --- t = t + 1 --- tokens[t] = s --- n = n - 1 --- end --- end --- first = cgf[second] --- done = true --- else --- first = second --- n = n + 1 --- end --- -- end --- end --- end --- if done then --- if first then --- t = t + 1 --- tokens[t] = first --- end --- return concat(tokens) -- seldom called --- end --- elseif nstr > 0 then --- return high[str] or str -- this will go from here --- end --- end --- return str --- end - --- function utffilters.decompose(str) --- if str and str ~= "" then --- local nstr = #str --- if nstr > 1 then --- -- if initialize then -- saves a call --- -- initialize() --- -- end --- local tokens, t, done, n = { }, 0, false, 0 --- for s in utfcharacters(str) do --- local dec = decomposed[s] --- if dec then --- if not done then --- if n > 0 then --- for s in utfcharacters(str) do --- if n == 0 then --- break --- else --- t = t + 1 --- tokens[t] = s --- n = n - 1 --- end --- end --- end --- done = true --- end --- t = t + 1 --- tokens[t] = dec --- elseif done then --- t = t + 1 --- tokens[t] = s --- else --- n = n + 1 --- end --- end --- if done then --- return concat(tokens) -- seldom called --- end --- end --- end --- return str --- end - --- local replacer = nil --- local finder = nil --- --- function utffilters.decompose(str) -- 3 to 4 times faster than the above --- if not replacer then --- if initialize then --- initialize() --- end --- local tree = utfchartabletopattern(decomposed) --- finder = lpeg.finder(tree,false,true) --- replacer = lpeg.replacer(tree,decomposed,false,true) --- end --- if str and str ~= "" and #str > 1 and lpegmatch(finder,str) then --- return lpegmatch(replacer,str) --- end --- return str --- end diff --git a/tex/context/base/mkiv/char-prv.lua b/tex/context/base/mkiv/char-prv.lua new file mode 100644 index 000000000..9a4f44dd2 --- /dev/null +++ b/tex/context/base/mkiv/char-prv.lua @@ -0,0 +1,223 @@ +if not modules then modules = { } end modules ['char-prv'] = { + version = 1.001, + comment = "companion to char-ini.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files", + dataonly = true, +} + +characters = characters or { } + +-- 0xFE302 -- 0xFE320 for accents (gone with new lm/gyre) +-- 0xFE321 -- 0xFE340 for missing characters + +-- [0xFE302] = { +-- category = "mn", +-- description = "WIDE MATHEMATICAL HAT", +-- direction = "nsm", +-- linebreak = "cm", +-- mathclass = "topaccent", +-- mathname = "widehat", +-- mathstretch = "h", +-- unicodeslot = 0xFE302, +-- nextinsize = { 0x00302, 0x0005E }, +-- }, +-- [0xFE303] = { +-- category = "mn", +-- cjkwd = "a", +-- description = "WIDE MATHEMATICAL TILDE", +-- direction = "nsm", +-- linebreak = "cm", +-- mathclass = "topaccent", +-- mathname = "widetilde", +-- mathstretch = "h", +-- unicodeslot = 0xFE303, +-- nextinsize = { 0x00303, 0x0007E }, +-- }, +-- [0xFE304] = { +-- category = "sm", +-- description = "TOP AND BOTTOM PARENTHESES", +-- direction = "on", +-- linebreak = "al", +-- mathclass = "doubleaccent", +-- mathname = "doubleparent", +-- unicodeslot = 0xFE304, +-- accents = { 0x023DC, 0x023DD }, +-- }, +-- [0xFE305] = { +-- category = "sm", +-- description = "TOP AND BOTTOM BRACES", +-- direction = "on", +-- linebreak = "al", +-- mathclass = "doubleaccent", +-- mathname = "doublebrace", +-- unicodeslot = 0xFE305, +-- accents = { 0x023DE, 0x023DF }, +-- }, +-- [0xFE941]={ +-- category = "sm", +-- description = "EXTREMELY IDENTICAL TO", +-- mathclass = "relation", +-- mathextensible = "h", +-- mathname = "eqequiv", +-- mathpair = { 0x2261, 0x3D }, +-- unicodeslot = 0xFE941, +-- }, + +characters.private={ + [0xFE302]={ + description="EXTENSIBLE OF 0x0302", + mathclass="topaccent", + mathstretch="h", + unicodeslot=0xFE302, + }, + [0xFE303]={ + description="EXTENSIBLE OF 0x0303", + mathclass="topaccent", + mathstretch="h", + unicodeslot=0xFE303, + }, + [0xFE321]={ + category="sm", + description="MATHEMATICAL SHORT BAR", + mathclass="relation", + mathname="mapstochar", + unicodeslot=0xFE321, + }, + [0xFE322]={ + category="sm", + description="MATHEMATICAL LEFT HOOK", + mathclass="relation", + mathname="lhook", + unicodeslot=0xFE322, + }, + [0xFE323]={ + category="sm", + description="MATHEMATICAL RIGHT HOOK", + mathclass="relation", + mathname="rhook", + unicodeslot=0xFE323, + }, + [0xFE324]={ + category="sm", + description="MATHEMATICAL SHORT BAR MIRRORED", + mathclass="relation", + mathname="mapsfromchar", + unicodeslot=0xFE324, + }, + [0xFE33E]={ + description="TOP OF 0x023E", + mathclass="topaccent", + mathextensible="r", + mathstretch="h", + unicodeslot=0xFE33E, + }, + [0xFE33F]={ + description="BOTTOM OF 0x023E", + mathclass="botaccent", + mathextensible="r", + mathstretch="h", + unicodeslot=0xFE33E, + }, + [0xFE350]={ + category="sm", + description="MATHEMATICAL DOUBLE ARROW LEFT END", + mathclass="relation", + mathname="ctxdoublearrowfillleftend", + unicodeslot=0xFE350, + }, + [0xFE351]={ + category="sm", + description="MATHEMATICAL DOUBLE ARROW MIDDLE PART", + mathclass="relation", + mathname="ctxdoublearrowfillmiddlepart", + unicodeslot=0xFE351, + }, + [0xFE352]={ + category="sm", + description="MATHEMATICAL DOUBLE ARROW RIGHT END", + mathclass="relation", + mathname="ctxdoublearrowfillrightend", + unicodeslot=0xFE352, + }, + [0xFE3B4]={ + description="EXTENSIBLE OF 0x03B4", + mathclass="topaccent", + mathextensible="r", + mathstretch="h", + unicodeslot=0xFE3B4, + }, + [0xFE3B5]={ + description="EXTENSIBLE OF 0x03B5", + mathclass="botaccent", + mathextensible="r", + mathstretch="h", + unicodeslot=0xFE3B5, + }, + [0xFE3DC]={ + description="EXTENSIBLE OF 0x03DC", + mathclass="topaccent", + mathextensible="r", + mathstretch="h", + unicodeslot=0xFE3DC, + }, + [0xFE3DD]={ + description="EXTENSIBLE OF 0x03DD", + mathclass="botaccent", + mathextensible="r", + mathstretch="h", + unicodeslot=0xFE3DD, + }, + [0xFE3DE]={ + description="EXTENSIBLE OF 0x03DE", + mathclass="topaccent", + mathextensible="r", + mathstretch="h", + unicodeslot=0xFE3DE, + }, + [0xFE3DF]={ + description="EXTENSIBLE OF 0x03DF", + mathclass="botaccent", + mathextensible="r", + mathstretch="h", + unicodeslot=0xFE3DF, + }, + [0xFE932]={ + description="SMASHED PRIME 0x02032", + unicodeslot=0xFE932, + }, + [0xFE933]={ + description="SMASHED PRIME 0x02033", + unicodeslot=0xFE933, + }, + [0xFE934]={ + description="SMASHED PRIME 0x02034", + unicodeslot=0xFE934, + }, + [0xFE935]={ + description="SMASHED BACKWARD PRIME 0x02035", + unicodeslot=0xFE935, + }, + [0xFE936]={ + description="SMASHED BACKWARD PRIME 0x02036", + unicodeslot=0xFE936, + }, + [0xFE937]={ + description="SMASHED BACKWARD PRIME 0x02037", + unicodeslot=0xFE937, + }, + [0xFE940]={ + category="mn", + description="SMALL ANNUITY SYMBOL", + mathclass="topaccent", + mathname="smallactuarial", + unicodeslot=0xFE940, + }, + [0xFE957]={ + description="SMASHED PRIME 0x02057", + unicodeslot=0xFE957, + }, +} + +-- print(table.serialize(characters.private,"characters.private", { hexify = true, noquotes = true })) diff --git a/tex/context/base/mkiv/char-tex.lua b/tex/context/base/mkiv/char-tex.lua index 3e0d02bc1..f123f0092 100644 --- a/tex/context/base/mkiv/char-tex.lua +++ b/tex/context/base/mkiv/char-tex.lua @@ -6,9 +6,8 @@ if not modules then modules = { } end modules ['char-tex'] = { license = "see context related readme files" } - local lpeg = lpeg -local next, type = next, type +local tonumber, next, type = tonumber, next, type local format, find, gmatch = string.format, string.find, string.gmatch local utfchar, utfbyte = utf.char, utf.byte local concat, tohash = table.concat, table.tohash @@ -329,7 +328,7 @@ local ligaturemapping = allocate { -- } -- -- function texcharacters.toutf(str,strip) --- if not find(str,"\\") then +-- if not find(str,"\\",1,true) then -- return str -- elseif strip then -- return lpegmatch(both_1,str) @@ -381,7 +380,7 @@ end function texcharacters.toutf(str,strip) if str == "" then return str - elseif not find(str,"\\") then + elseif not find(str,"\\",1,true) then return str -- elseif strip then else @@ -430,6 +429,9 @@ local texsetcatcode = tex.setcatcode local contextsprint = context.sprint local ctxcatcodes = catcodes.numbers.ctxcatcodes +local texsetmacro = tokens.setters.macro +local texsetchar = tokens.setters.char + function texcharacters.defineaccents() local ctx_dodefineaccentcommand = context.dodefineaccentcommand local ctx_dodefineaccent = context.dodefineaccent @@ -485,12 +487,38 @@ tex.uprint = commands.utfchar -- in contect we don't use lc and uc codes (in fact in luatex we should have a hf code) -- so at some point we might drop this -local forbidden = tohash { -- at least now - 0x00A0, - 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A, 0x200B, 0x200C, 0x200D, - 0x202F, - 0x205F, - -- 0xFEFF, +-- The following get set at the TeX end: + +local forbidden = tohash { + 0x000A0, -- zs nobreakspace <self> + 0x000AD, -- cf softhyphen <self> + -- 0x00600, -- cf arabicnumber <self> + -- 0x00601, -- cf arabicsanah <self> + -- 0x00602, -- cf arabicfootnotemarker <self> + -- 0x00603, -- cf arabicsafha <self> + -- 0x00604, -- cf arabicsamvat <self> + -- 0x00605, -- cf arabicnumberabove <self> + -- 0x0061C, -- cf arabiclettermark <self> + -- 0x006DD, -- cf arabicendofayah <self> + -- 0x008E2, -- cf arabicdisputedendofayah <self> + 0x02000, -- zs enquad <self> + 0x02001, -- zs emquad <self> + 0x02002, -- zs enspace \kern .5\emwidth + 0x02003, -- zs emspace \hskip \emwidth + 0x02004, -- zs threeperemspace <self> + 0x02005, -- zs fourperemspace <self> + 0x02006, -- zs sixperemspace <self> + 0x02007, -- zs figurespace <self> + 0x02008, -- zs punctuationspace <self> + 0x02009, -- zs breakablethinspace <self> + 0x0200A, -- zs hairspace <self> + 0x0200B, -- cf zerowidthspace <self> + 0x0200C, -- cf zwnj <self> + 0x0200D, -- cf zwj <self> + 0x0202F, -- zs narrownobreakspace <self> + 0x0205F, -- zs medspace \textormathspace +\medmuskip 2 + -- 0x03000, -- zs ideographicspace <self> + -- 0x0FEFF, -- cf zerowidthnobreakspace \penalty \plustenthousand \kern \zeropoint } local csletters = characters.csletters -- also a signal that we have initialized @@ -549,18 +577,15 @@ if not csletters then if is_character[category] then if chr.unicodeslot < 128 then if isletter then - -- setmacro local c = utfchar(u) - contextsprint(ctxcatcodes,format("\\def\\%s{%s}",contextname,c)) -- has no s + texsetmacro(contextname,c) csletters[c] = u else - -- setchar - contextsprint(ctxcatcodes,format("\\chardef\\%s=%s",contextname,u)) -- has no s + texsetchar(contextname,u) end else - -- setmacro local c = utfchar(u) - contextsprint(ctxcatcodes,format("\\def\\%s{%s}",contextname,c)) -- has no s + texsetmacro(contextname,c) if isletter and u >= 32 and u <= 65536 then csletters[c] = u end @@ -585,9 +610,10 @@ if not csletters then end -- elseif is_command[category] and not forbidden[u] then - -- set - contextsprint("{\\catcode",u,"=13\\unexpanded\\gdef ",utfchar(u),"{\\"..contextname,"}}") - activated[#activated+1] = u + -- contextsprint("{\\catcode",u,"=13\\unexpanded\\gdef ",utfchar(u),"{\\",contextname,"}}") + -- activated[#activated+1] = u + local c = utfchar(u) + texsetmacro(contextname,c) elseif is_mark[category] then texsetlccode(u,u,u) -- for hyphenation end @@ -623,11 +649,25 @@ if not csletters then -- this slows down format generation by over 10 percent for k, v in next, blocks do if v.catcode == "letter" then - for u=v.first,v.last do - csletters[utfchar(u)] = u - -- - -- texsetlccode(u,u,u) -- self self - -- + local first = v.first + local last = v.last + local gaps = v.gaps + if first and last then + for u=first,last do + csletters[utfchar(u)] = u + -- + -- texsetlccode(u,u,u) -- self self + -- + end + end + if gaps then + for i=1,#gaps do + local u = gaps[i] + csletters[utfchar(u)] = u + -- + -- texsetlccode(u,u,u) -- self self + -- + end end end end diff --git a/tex/context/base/mkiv/char-utf.lua b/tex/context/base/mkiv/char-utf.lua index 5702f2087..8f46ae98f 100644 --- a/tex/context/base/mkiv/char-utf.lua +++ b/tex/context/base/mkiv/char-utf.lua @@ -22,6 +22,7 @@ over a string.</p> educational purposes.</p> --ldx]]-- +local next, type = next, type local gsub, find = string.gsub, string.find local concat, sortedhash, keys, sort = table.concat, table.sortedhash, table.keys, table.sort local utfchar, utfbyte, utfcharacters, utfvalues = utf.char, utf.byte, utf.characters, utf.values @@ -39,6 +40,7 @@ local utfchartabletopattern = lpeg.utfchartabletopattern local formatters = string.formatters local allocate = utilities.storage.allocate or function() return { } end +local mark = utilities.storage.mark or allocate local charfromnumber = characters.fromnumber @@ -84,17 +86,23 @@ characters.decomposed = decomposed local graphemes = characters.graphemes local collapsed = characters.collapsed -local mathpairs = characters.mathpairs +local mathlists = characters.mathlists -if not graphemes then +if graphemes then + + mark(graphemes) + mark(collapsed) + mark(mathlists) + +else graphemes = allocate() collapsed = allocate() - mathpairs = allocate() + mathlists = allocate() characters.graphemes = graphemes characters.collapsed = collapsed - characters.mathpairs = mathpairs + characters.mathlists = mathlists local function backtrack(v,last,target) local vs = v.specials @@ -106,57 +114,70 @@ if not graphemes then end end - local function setpair(one,two,unicode,first,second,combination) - local mps = mathpairs[one] - if not mps then - mps = { [two] = unicode } - mathpairs[one] = mps - else - mps[two] = unicode - end - local mps = mathpairs[first] - if not mps then - mps = { [second] = combination } - mathpairs[first] = mps - else - mps[second] = combination + local function setlist(unicode,list,start,category) + if list[start] ~= 0x20 then + local t = mathlists + for i=start,#list do + local l = list[i] + local f = t[l] + if f then + t = f + else + f = { } + t[l] = f + t = f + end + end + t[category] = unicode end end + local mlists = { } + for unicode, v in next, data do local vs = v.specials - if vs and #vs == 3 and vs[1] == "char" then - -- - local one, two = vs[2], vs[3] - local first, second, combination = utfchar(one), utfchar(two), utfchar(unicode) - -- - collapsed[first..second] = combination - backtrack(data[one],second,combination) - -- sort of obsolete: - local cgf = graphemes[first] - if not cgf then - cgf = { [second] = combination } - graphemes[first] = cgf - else - cgf[second] = combination + if vs then + local kind = vs[1] + local size = #vs + if kind == "char" and size == 3 then -- what if more than 3 + -- + local one, two = vs[2], vs[3] + local first, second, combination = utfchar(one), utfchar(two), utfchar(unicode) + -- + collapsed[first..second] = combination + backtrack(data[one],second,combination) + -- sort of obsolete: + local cgf = graphemes[first] + if not cgf then + cgf = { [second] = combination } + graphemes[first] = cgf + else + cgf[second] = combination + end + -- end - -- - if v.mathclass or v.mathspec then - setpair(two,one,unicode,second,first,combination) -- watch order + if (kind == "char" or kind == "compat") and (size > 2) and (v.mathclass or v.mathspec) then + setlist(unicode,vs,2,"specials") end end - local mp = v.mathpair - if mp then - local one, two = mp[1], mp[2] - local first, second, combination = utfchar(one), utfchar(two), utfchar(unicode) - setpair(one,two,unicode,first,second,combination) + local ml = v.mathlist + if ml then + mlists[unicode] = ml end end + -- these win: + + for unicode, ml in next, mlists do + setlist(unicode,ml,1,"mathlist") + end + + mlists = nil + if storage then - storage.register("characters/graphemes", characters.graphemes, "characters.graphemes") - storage.register("characters/collapsed", characters.collapsed, "characters.collapsed") - storage.register("characters/mathpairs", characters.mathpairs, "characters.mathpairs") + storage.register("characters/graphemes", graphemes, "characters.graphemes") + storage.register("characters/collapsed", collapsed, "characters.collapsed") + storage.register("characters/mathlists", mathlists, "characters.mathlists") end end @@ -183,14 +204,15 @@ local p_collapse = nil -- so we can reset if needed local function prepare() local tree = utfchartabletopattern(collapsed) - p_collapse = Cs((tree/collapsed + p_utf8character)^0 * P(-1)) -- the P(1) is needed in order to accept non utf + -- p_collapse = Cs((tree/collapsed + p_utf8character)^0 * P(-1)) + p_collapse = Cs((tree/collapsed + p_utf8character)^0) end function utffilters.collapse(str,filename) if not p_collapse then prepare() end - if not str or #str == "" or #str == 1 then + if not str or str == "" or #str == 1 then return str elseif filename and skippable[filesuffix(filename)] then -- we could hash the collapsables or do a quicker test return str @@ -213,7 +235,7 @@ function utffilters.decompose(str,filename) -- 3 to 4 times faster than the abov if str and str ~= "" and #str > 1 then return lpegmatch(p_decompose,str) end - if not str or #str == "" or #str < 2 then + if not str or str == "" or #str < 2 then return str elseif filename and skippable[filesuffix(filename)] then return str @@ -338,7 +360,7 @@ function utffilters.reorder(str,filename) if not p_reorder then prepare() end - if not str or #str == "" or #str < 2 then + if not str or str == "" or #str < 2 then return str elseif filename and skippable[filesuffix(filename)] then return str diff --git a/tex/context/base/mkiv/char-utf.mkiv b/tex/context/base/mkiv/char-utf.mkiv index 3b77771a7..ccca72a18 100644 --- a/tex/context/base/mkiv/char-utf.mkiv +++ b/tex/context/base/mkiv/char-utf.mkiv @@ -22,10 +22,10 @@ \unprotect -\registerctxluafile{char-def}{1.001} -\registerctxluafile{char-ini}{1.001} -\registerctxluafile{char-utf}{1.001} -\registerctxluafile{char-cjk}{1.001} +\registerctxluafile{char-def}{} +\registerctxluafile{char-ini}{} +\registerctxluafile{char-utf}{} +\registerctxluafile{char-cjk}{} %D We enable collapsing (combining characters) by default, but %D since the source files are rather simple, we postpone the diff --git a/tex/context/base/mkiv/chem-ini.mkiv b/tex/context/base/mkiv/chem-ini.mkiv index d18ba47a1..c3569eea5 100644 --- a/tex/context/base/mkiv/chem-ini.mkiv +++ b/tex/context/base/mkiv/chem-ini.mkiv @@ -14,7 +14,7 @@ \writestatus{loading}{ConTeXt Chemistry Macros / Initialization} % might become Inline -\registerctxluafile{chem-ini}{1.001} +\registerctxluafile{chem-ini}{} \unprotect diff --git a/tex/context/base/mkiv/chem-str.lua b/tex/context/base/mkiv/chem-str.lua index a40ca76b0..1ad16564c 100644 --- a/tex/context/base/mkiv/chem-str.lua +++ b/tex/context/base/mkiv/chem-str.lua @@ -32,6 +32,7 @@ local directive_strictindex = false directives.register("chemistry.strictindex" local report_chemistry = logs.reporter("chemistry") +local tonumber = tonumber local format, gmatch, match, lower, gsub = string.format, string.gmatch, string.match, string.lower, string.gsub local concat, insert, remove, unique, sorted = table.concat, table.insert, table.remove, table.unique, table.sorted local processor_tostring = typesetters and typesetters.processors.tostring diff --git a/tex/context/base/mkiv/chem-str.mkiv b/tex/context/base/mkiv/chem-str.mkiv index 2ff229b12..646cf13f1 100644 --- a/tex/context/base/mkiv/chem-str.mkiv +++ b/tex/context/base/mkiv/chem-str.mkiv @@ -17,7 +17,7 @@ \writestatus{loading}{ConTeXt Chemistry Macros / Structure} -\registerctxluafile{chem-str}{1.001} +\registerctxluafile{chem-str}{} % We have a slightly different interface. This is unchanged: % diff --git a/tex/context/base/mkiv/cldf-bas.lua b/tex/context/base/mkiv/cldf-bas.lua index 2387793c8..070546637 100644 --- a/tex/context/base/mkiv/cldf-bas.lua +++ b/tex/context/base/mkiv/cldf-bas.lua @@ -22,6 +22,7 @@ if not modules then modules = { } end modules ['cldf-bas'] = { -- flush(ctxcatcodes,"}") -- end +local tonumber = tonumber local type = type local format = string.format local utfchar = utf.char diff --git a/tex/context/base/mkiv/cldf-bas.mkiv b/tex/context/base/mkiv/cldf-bas.mkiv index f8b5b5d6a..962db5209 100644 --- a/tex/context/base/mkiv/cldf-bas.mkiv +++ b/tex/context/base/mkiv/cldf-bas.mkiv @@ -13,7 +13,7 @@ \writestatus{loading}{ConTeXt Lua Documents / Basics} -\registerctxluafile{cldf-bas}{1.001} -\registerctxluafile{cldf-prs}{1.001} +\registerctxluafile{cldf-bas}{} +\registerctxluafile{cldf-prs}{} \endinput diff --git a/tex/context/base/mkiv/cldf-com.mkiv b/tex/context/base/mkiv/cldf-com.mkiv index 491909888..a1e442872 100644 --- a/tex/context/base/mkiv/cldf-com.mkiv +++ b/tex/context/base/mkiv/cldf-com.mkiv @@ -13,7 +13,7 @@ \writestatus{loading}{ConTeXt Lua Documents / Functions} -\registerctxluafile{cldf-com}{1.001} -\registerctxluafile{cldf-ver}{1.001} +\registerctxluafile{cldf-com}{} +\registerctxluafile{cldf-ver}{} \endinput diff --git a/tex/context/base/mkiv/cldf-ini.lua b/tex/context/base/mkiv/cldf-ini.lua index 3c91f5fba..a2814877d 100644 --- a/tex/context/base/mkiv/cldf-ini.lua +++ b/tex/context/base/mkiv/cldf-ini.lua @@ -319,7 +319,7 @@ local interfacescanners = setmetatablenewindex(function(t,k,v) rawset(t,k,v) end) -interfaces.scanners = interfacescanners +interfaces.scanners = storage.mark(interfacescanners) context.functions = { register = registerfunction, @@ -603,6 +603,32 @@ function context.printlines(str,raw) -- todo: see if via file is useable end end +-- function context.printtable(t,separator) -- todo: see if via file is useable +-- if separator == nil or separator == true then +-- separator = "\r" +-- elseif separator == "" then +-- separator = false +-- end +-- for i=1,#t do +-- context(t[i]) -- we need to go through catcode handling +-- if separator then +-- context(separator) +-- end +-- end +-- end + +function context.printtable(t,separator) -- todo: see if via file is useable + if separator == nil or separator == true then + separator = "\r" + elseif separator == "" or separator == false then + separator = "" + end + local s = concat(t,separator) + if s ~= "" then + context(s) + end +end + -- -- -- "{" .. ti .. "}" is somewhat slower in a cld-mkiv run than "{",ti,"}" local containseol = patterns.containseol @@ -905,22 +931,22 @@ local defaultcaller = caller setmetatableindex(context,indexer) setmetatablecall (context,caller) -function context.sprint(...) -- takes catcodes as first argument +function context.sprint(...) -- takes catcodes as first argument flush(...) end -function context.fprint(fmt,first,...) - if type(catcodes) == "number" then - if first then - flush(currentcatcodes,formatters[fmt](first,...)) +function context.fprint(first,second,third,...) + if type(first) == "number" then + if third then + flush(first,formatters[second](third,...)) else - flush(currentcatcodes,fmt) + flush(first,second) end else - if fmt then - flush(formatters[catcodes](fmt,first,...)) + if second then + flush(formatters[first](second,third,...)) else - flush(catcodes) + flush(first) end end end diff --git a/tex/context/base/mkiv/cldf-ini.mkiv b/tex/context/base/mkiv/cldf-ini.mkiv index a985f204e..27ce42aa2 100644 --- a/tex/context/base/mkiv/cldf-ini.mkiv +++ b/tex/context/base/mkiv/cldf-ini.mkiv @@ -13,7 +13,7 @@ \writestatus{loading}{ConTeXt Lua Documents / Initialization} -\registerctxluafile{cldf-ini}{1.001} +\registerctxluafile{cldf-ini}{} %D With each new update of \MKIV\ we can join Within Temptation in %D singing: diff --git a/tex/context/base/mkiv/cldf-int.mkiv b/tex/context/base/mkiv/cldf-int.mkiv index da684694a..d30ce6811 100644 --- a/tex/context/base/mkiv/cldf-int.mkiv +++ b/tex/context/base/mkiv/cldf-int.mkiv @@ -13,7 +13,7 @@ \writestatus{loading}{ConTeXt Multilingual Macros / Lua} -\registerctxluafile{cldf-int}{1.001} +\registerctxluafile{cldf-int}{} \unprotect diff --git a/tex/context/base/mkiv/cldf-scn.lua b/tex/context/base/mkiv/cldf-scn.lua index 4a90c5b7e..beeb8c8c9 100644 --- a/tex/context/base/mkiv/cldf-scn.lua +++ b/tex/context/base/mkiv/cldf-scn.lua @@ -6,7 +6,7 @@ if not modules then modules = { } end modules ['cldf-scn'] = { license = "see context related readme files" } -local load, type = load, type +local load, type, tostring = load, type, tostring local formatters = string.formatters local char = string.char diff --git a/tex/context/base/mkiv/cldf-stp.lua b/tex/context/base/mkiv/cldf-stp.lua index eeed47594..2ce6341b3 100644 --- a/tex/context/base/mkiv/cldf-stp.lua +++ b/tex/context/base/mkiv/cldf-stp.lua @@ -18,8 +18,8 @@ if not modules then modules = { } end modules ['cldf-stp'] = { -- ... -- context.step(nil|...) -- ... --- context.step(nil|...) --- ... +-- context.step(nil|...) +-- ... -- end) -- ... -- context.step(nil|...) @@ -28,6 +28,8 @@ if not modules then modules = { } end modules ['cldf-stp'] = { -- ... -- end) +local context = context + local create = coroutine.create local yield = coroutine.yield local resume = coroutine.resume @@ -53,17 +55,50 @@ interfaces.implement { local ctx_resume = context.protected.cs.clf_step -function context.step(first,...) - if first ~= nil then - context(first,...) +local closeinput = texio.closeinput -- experiment +local closeindeed = true +local stepsindeed = true + +directives.register("context.steps.nosteps",function(v) stepsindeed = not v end) +directives.register("context.steps.noclose",function(v) closeindeed = not v end) + +if closeinput then + + function context.step(first,...) + if first ~= nil then + context(first,...) + end +if stepper then + ctx_resume() + yield() + if closeindeed then + closeinput() + end +end end - ctx_resume() - yield() + +else + + function context.step(first,...) + if first ~= nil then + context(first,...) + end +if stepper then + ctx_resume() + yield() +end + end + end function context.stepwise(f) - depth = depth + 1 - stack[depth] = stepper - stepper = create(f) - ctx_resume(stepper) + if stepsindeed then + depth = depth + 1 + stack[depth] = stepper + stepper = create(f) + -- ctx_resume(stepper) + ctx_resume() + else + f() + end end diff --git a/tex/context/base/mkiv/cldf-ver.mkiv b/tex/context/base/mkiv/cldf-ver.mkiv index 8e009035d..0ff63810e 100644 --- a/tex/context/base/mkiv/cldf-ver.mkiv +++ b/tex/context/base/mkiv/cldf-ver.mkiv @@ -13,6 +13,6 @@ \writestatus{loading}{ConTeXt Lua Documents / Verbatim} -\registerctxluafile{cldf-ver}{1.001} +\registerctxluafile{cldf-ver}{} \endinput diff --git a/tex/context/base/mkiv/colo-grp.mkiv b/tex/context/base/mkiv/colo-grp.mkiv index e296bbc33..fddf65c79 100644 --- a/tex/context/base/mkiv/colo-grp.mkiv +++ b/tex/context/base/mkiv/colo-grp.mkiv @@ -104,7 +104,7 @@ %D %D \showsetup{showcolorgroup} -\fetchruntimecommand \showcolorgroup {\f!colorprefix\s!run} +\fetchruntimecommand \showcolorgroup \f!colo_run %D There are ten predefined color groups, like %D \color[green]{\em groen}, \color[red]{\em rood}, @@ -163,6 +163,6 @@ %D %D \showsetup{comparecolorgroup} -\fetchruntimecommand \comparecolorgroup {\f!colorprefix\s!run} +\fetchruntimecommand \comparecolorgroup \f!colo_run \protect \endinput diff --git a/tex/context/base/mkiv/colo-icc.lua b/tex/context/base/mkiv/colo-icc.lua index f7ed561c1..06a913e17 100644 --- a/tex/context/base/mkiv/colo-icc.lua +++ b/tex/context/base/mkiv/colo-icc.lua @@ -8,7 +8,8 @@ if not modules then modules = { } end modules ['colo-icc'] = { local char, byte, gsub, match, format, strip = string.char, string.byte, string.gsub, string.match, string.format, string.strip local readstring, readnumber = io.readstring, io.readnumber -local formatters = string.formatters +local band = bit32.band +local next = next local colors = attributes and attributes.colors or { } -- when used in mtxrun @@ -79,10 +80,10 @@ function colors.iccprofile(filename,verbose) o == 1 and "dependent" or "unknown" local d = header.deviceattributes header.deviceattributes = { - [number.hasbit(d,1) and "transparency" or "reflective"] = true, - [number.hasbit(d,2) and "mate" or "glossy" ] = true, - [number.hasbit(d,3) and "negative" or "positive" ] = true, - [number.hasbit(d,4) and "bw" or "color" ] = true, + [band(d,1) ~= 0 and "transparency" or "reflective"] = true, + [band(d,2) ~= 0 and "mate" or "glossy" ] = true, + [band(d,3) ~= 0 and "negative" or "positive" ] = true, + [band(d,4) ~= 0 and "bw" or "color" ] = true, } local r = header.renderingintent header.renderingintent = diff --git a/tex/context/base/mkiv/colo-imp-rgb.mkiv b/tex/context/base/mkiv/colo-imp-rgb.mkiv index 934071ed9..85122cb44 100644 --- a/tex/context/base/mkiv/colo-imp-rgb.mkiv +++ b/tex/context/base/mkiv/colo-imp-rgb.mkiv @@ -59,6 +59,19 @@ \definecolor [darkgray] [s=.40] \definecolor [middlegray] [s=.625] \definecolor [lightgray] [s=.85] +\definecolor [palegray] [s=.75] + +% new per 2017-10-15 (for mp named colors) + +\definecolor [gray-1] [s=.1] +\definecolor [gray-2] [s=.2] +\definecolor [gray-3] [s=.3] +\definecolor [gray-4] [s=.4] +\definecolor [gray-5] [s=.5] +\definecolor [gray-6] [s=.6] +\definecolor [gray-7] [s=.7] +\definecolor [gray-8] [s=.8] +\definecolor [gray-9] [s=.9] %D These colors are mapped to interface dependant colornames. diff --git a/tex/context/base/mkiv/colo-ini.lua b/tex/context/base/mkiv/colo-ini.lua index c074d3407..ca00ae72f 100644 --- a/tex/context/base/mkiv/colo-ini.lua +++ b/tex/context/base/mkiv/colo-ini.lua @@ -6,7 +6,7 @@ if not modules then modules = { } end modules ['colo-ini'] = { license = "see context related readme files" } -local type, tonumber = type, tonumber +local type, tonumber, tostring = type, tonumber, tostring local concat, insert, remove = table.concat, table.insert, table.remove local format, gmatch, gsub, lower, match, find = string.format, string.gmatch, string.gsub, string.lower, string.match, string.find local P, R, C, Cc = lpeg.P, lpeg.R, lpeg.C, lpeg.Cc diff --git a/tex/context/base/mkiv/colo-ini.mkiv b/tex/context/base/mkiv/colo-ini.mkiv index 54ad1e9f9..daee8ada6 100644 --- a/tex/context/base/mkiv/colo-ini.mkiv +++ b/tex/context/base/mkiv/colo-ini.mkiv @@ -32,8 +32,8 @@ \installcorenamespace{colorconversions} \installcorenamespace{colornumber} -\registerctxluafile{colo-ini}{1.000} -\registerctxluafile{colo-icc}{1.000} +\registerctxluafile{colo-ini}{} +\registerctxluafile{colo-icc}{} \unprotect @@ -623,7 +623,7 @@ %D %D \showsetup{showpalet} -\fetchruntimecommand \showpalet {\f!colorprefix\s!run} +\fetchruntimecommand \showpalet \f!colo_run %D \macros %D {showcolorcomponents} @@ -632,7 +632,7 @@ %D \showcolorcomponents[color-1,color-2] %D \stoptyping -\fetchruntimecommand \showcolorcomponents {\f!colorprefix\s!run} +\fetchruntimecommand \showcolorcomponents \f!colo_run %D \macros %D {comparepalet} @@ -655,7 +655,7 @@ %D %D \showsetup{comparepalet} -\fetchruntimecommand \comparepalet {\f!colorprefix\s!run} +\fetchruntimecommand \comparepalet \f!colo_run %D \macros %D {showcolor} @@ -671,7 +671,7 @@ %D %D \showsetup{showcolor} -\fetchruntimecommand \showcolor {\f!colorprefix\s!run} +\fetchruntimecommand \showcolor \f!colo_run %D It would make sense to put the following code in \type %D {colo-mps}, but it it rather low level. @@ -1415,6 +1415,47 @@ \definetransparency [color] [15] \definetransparency [luminosity] [16] +%D Some common ones: + +\definecolor[trace:0][s=.4] +\definecolor[trace:1][r=.6] +\definecolor[trace:2][g=.6] +\definecolor[trace:3][b=.6] +\definecolor[trace:4][r=.6,g=.6] +\definecolor[trace:5][r=.6,b=.6] +\definecolor[trace:6][g=.6,b=.6] +\definecolor[trace:7][r=.8,g=.4] +\definecolor[trace:8][r=.8,b=.4] +\definecolor[trace:9][g=.4,b=.8] + +\definecolor[trace:w][s=1] +\definecolor[trace:r][r=.75,t=.5,a=1] +\definecolor[trace:g][g=.75,t=.5,a=1] +\definecolor[trace:b][b=.75,t=.5,a=1] +%definecolor[trace:c][c=.75,t=.5,a=1] +\definecolor[trace:c][g=.75,b=.75,t=.5,a=1] +%definecolor[trace:m][m=.75,t=.5,a=1] +\definecolor[trace:m][r=.75,b=.75,t=.5,a=1] +%definecolor[trace:y][y=.75,t=.5,a=1] +\definecolor[trace:y][r=.75,g=.75,t=.5,a=1] +\definecolor[trace:s][s=.75,t=.5,a=1] +\definecolor[trace:d][s=.25,t=.5,a=1] +\definecolor[trace:o][r=1,g=.6,b=.1,t=.5,a=1] + +\definecolor[trace:dw][s=1] +\definecolor[trace:dr][r=.75,t=.75,a=1] +\definecolor[trace:dg][g=.75,t=.75,a=1] +\definecolor[trace:db][b=.75,t=.75,a=1] +%definecolor[trace:dc][c=.75,t=.75,a=1] +\definecolor[trace:dc][g=.75,b=.75,t=.75,a=1] +%definecolor[trace:dm][m=.75,t=.75,a=1] +\definecolor[trace:dm][r=.75,b=.75,t=.75,a=1] +%definecolor[trace:dy][y=.75,t=.75,a=1] +\definecolor[trace:y][r=.75,g=.75,t=.75,a=1] +\definecolor[trace:ds][s=.75,t=.75,a=1] +\definecolor[trace:dd][s=.25,t=.75,a=1] +\definecolor[trace:do][r=1,g=.6,b=.1,t=.75,a=1] + \setupcolors [\c!state=\v!stop, % color will be enabled later on \c!conversion=\v!yes, diff --git a/tex/context/base/mkiv/colo-run.mkiv b/tex/context/base/mkiv/colo-run.mkiv index 37a9de190..24f7cc052 100644 --- a/tex/context/base/mkiv/colo-run.mkiv +++ b/tex/context/base/mkiv/colo-run.mkiv @@ -11,7 +11,7 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\registerctxluafile{colo-run}{1.000} +\registerctxluafile{colo-run}{} \unprotect diff --git a/tex/context/base/mkiv/cont-fil.mkiv b/tex/context/base/mkiv/cont-fil.mkiv index e2c7f401e..9257e2e1e 100644 --- a/tex/context/base/mkiv/cont-fil.mkiv +++ b/tex/context/base/mkiv/cont-fil.mkiv @@ -74,7 +74,8 @@ \definefilesynonym [pre-balls] [present-balls] \definefilesynonym [pre-15] [present-balls] \definefilesynonym [pre-knot] [pre-16] -\definefilesynonym [pre-weird] [pre-17] +\definefilesynonym [pre-17] [present-weird] +\definefilesynonym [pre-weird] [present-weird] \definefilesynonym [pre-shade] [pre-18] \definefilesynonym [pre-organic] [pre-19] \definefilesynonym [pre-speckle] [pre-20] @@ -100,11 +101,19 @@ \definefilesynonym [pre-random] [present-random] \definefilesynonym [pre-71] [present-random] -\definefilesynonym [abr-pseudocaps] [abr-01] -\definefilesynonym [abr-smallcaps] [abr-02] +\definefilesynonym [abr-01] [abbreviations-pseudocaps] +\definefilesynonym [abr-02] [abbreviations-smallcaps] +\definefilesynonym [abr-03] [abbreviations-words] +\definefilesynonym [abr-04] [abbreviations-mixed] -\definefilesynonym [pracjourn] [ptj-01] -\definefilesynonym [maps] [map-10] +\definefilesynonym [art-01] [article-basic] +\definefilesynonym [article] [article-basic] +\definefilesynonym [mag-01] [magazine-basic] +\definefilesynonym [magazine] [magazine-basic] +\definefilesynonym [mod-01] [module-basic] +\definefilesynonym [module] [module-basic] + +\definefilesynonym [map-10] [maps] % for a while \definefilesynonym [mml] [mathml] \definefilesynonym [cml] [chemml] @@ -113,22 +122,28 @@ \definefilesynonym [memo] [cor-02] \definefilesynonym [resume] [cor-03] -% downward compatible mapping: - -\definefilesynonym [pre-41] [present-tiles] -\definefilesynonym [fnt-29] [fonts-shapes] -\definefilesynonym [fnt-33] [math-coverage] -\definefilesynonym [mat-12] [math-parameters] -\definefilesynonym [mat-20] [math-parameters] +\definefilesynonym [fnt-10] [fonts-complete] +\definefilesynonym [fnt-11] [fonts-system] +\definefilesynonym [fnt-20] [fonts-steps] +\definefilesynonym [fnt-21] [fonts-steps] +\definefilesynonym [fnt-22] [fonts-engines] +\definefilesynonym [fnt-23] [fonts-shapes] +\definefilesynonym [fnt-24] [fonts-cjk] \definefilesynonym [fnt-25] [math-characters] \definefilesynonym [fnt-28] [fonts-goodies] +\definefilesynonym [fnt-29] [fonts-shapes] \definefilesynonym [fnt-31] [fonts-coverage] +\definefilesynonym [fnt-33] [math-coverage] + \definefilesynonym [mat-10] [math-characters] \definefilesynonym [mat-11] [math-characters] -\definefilesynonym [fnt-11] [fonts-system] -\definefilesynonym [fnt-23] [fonts-shapes] +\definefilesynonym [mat-12] [math-parameters] +\definefilesynonym [mat-20] [math-parameters] + \definefilesynonym [syn-01] [syntax] +\definefilesynonym [reg-01] [regimes-list] + \definefilesynonym [set-11] [setups-basics] \definefilesynonym [set-12] [setups-overview] %definefilesynonym [set-13] [setups-proofing] diff --git a/tex/context/base/mkiv/cont-log.mkiv b/tex/context/base/mkiv/cont-log.mkiv index 11cdfb9b8..8b4660f3a 100644 --- a/tex/context/base/mkiv/cont-log.mkiv +++ b/tex/context/base/mkiv/cont-log.mkiv @@ -22,23 +22,26 @@ \unexpanded\def\TeX {\dontleavehmode \begingroup - \setbox\scratchbox\hbox{M}% T% + \setbox\scratchbox\hbox{M}% \kern-.1667\wd\scratchbox \lower.5\exheight\hbox{E}% \kern-.125\wd\scratchbox X% \endgroup} +\unexpanded\def\TeXsuffix{\wordboundary\TeX} +\unexpanded\def\TeXprefix{\TeX\wordboundary} + \unexpanded\def\ConTeXt {\dontleavehmode \begingroup Con% + \wordboundary \setbox\scratchboxone\hbox{T\kern\zeropoint e}% \setbox\scratchboxtwo\hbox{Te}% \discretionary{-}{}{\kern\dimexpr\wd\scratchboxtwo-\wd\scratchboxone\relax}% - \TeX - t% + \TeX t% \endgroup} \unexpanded\def\PPCHTeX{ppch\TeX} @@ -196,12 +199,12 @@ %D Some placeholders: \unexpanded\def\eTeX {\mathematics{\varepsilon}-\TeX} -\unexpanded\def\pdfTeX {pdf\TeX} -\unexpanded\def\pdfeTeX {pdfe-\TeX} -\unexpanded\def\luaTeX {lua\TeX} +\unexpanded\def\pdfTeX {pdf\wordboundary\TeX} +\unexpanded\def\pdfeTeX {pdfe-\wordboundary\TeX} +\unexpanded\def\luaTeX {lua\wordboundary\TeX} \unexpanded\def\Lua {Lua} -\unexpanded\def\luajitTeX{luajit\TeX} -\unexpanded\def\metaTeX {meta\TeX} +\unexpanded\def\luajitTeX{luajit\wordboundary\TeX} +\unexpanded\def\metaTeX {meta\wordboundary\TeX} \unexpanded\def\XeTeX {X\lower.5\exheight\hbox{\kern-.15\emwidth\mirror{E}}\kern-.1667\emwidth\TeX} % Adapted from a patch by Mojca: @@ -320,8 +323,11 @@ \def\MetaFont {MetaFont}% \def\MetaFun {MetaFun}% \def\TeX {TeX}% + \def\TeXsuffix{TeX}% + \def\TeXprefix{TeX}% \def\LuaTeX {LuaTeX}% \def\LuajitTeX{LuajitTeX}% + \let\wordboundary\empty \to \everysimplifycommands \protect \endinput diff --git a/tex/context/base/mkiv/cont-new.mkiv b/tex/context/base/mkiv/cont-new.mkiv index cad08c512..3951d8e3f 100644 --- a/tex/context/base/mkiv/cont-new.mkiv +++ b/tex/context/base/mkiv/cont-new.mkiv @@ -11,131 +11,13 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\newcontextversion{2017.05.15 21:48} +\newcontextversion{2018.03.15 15:27} %D This file is loaded at runtime, thereby providing an excellent place for %D hacks, patches, extensions and new features. -% \usemodule[newotf] -% \usemodule[oldotf] - \unprotect % \writestatus\m!system{beware: some patches loaded from cont-new.mkiv} -% \attribute152\zerocount : marks ... lots of sweeps so best early in list - -%D Maybe: - -% \appendtoks -% \inheritmaintextcolor -% \to \everybeforenoteinsert - -% \appendtoks -% \inheritmaintextcolor -% \to \everymargindatacontent - -% This is experimental; if this changes we need to adapt the mb-mp style too. It's -% not in the core yet. -% -% \def\ActionY{\blank\inleftmargin{\shownofparlines}} -% \def\ActionN{\inleftmargin{\shownofparlines}} -% -% \saveparnumber -% ... -% \checknofparlines -% \ifnum\nofparlines<2 -% \ActionY -% \else -% \ActionN -% \fi -% ... - -\newcount\c_typo_par_current -\newcount\c_typo_par_saved -\newcount\c_typo_par_lines -\newcount\c_typo_par_temp - -\appendtoks - \advance\c_typo_par_current\plusone % local - %\llap{\infofont[\the\c_typo_par_saved:\the\c_typo_par_current]\quad}% -\to \everypar - -\unexpanded\def\saveparnumber % the upcoming number - {\c_typo_par_saved\c_typo_par_current} % local - -\def\savedparnumber {\number\c_typo_par_saved} -\def\currentparnumber{\number\c_typo_par_current} -\def\nofparlines {\number\c_typo_par_lines} -\let\savedparstate \empty - -\unexpanded\def\shownofparlines - {\dontleavehmode\hbox\bgroup - \infofont[\savedparstate]% - \egroup} - -\unexpanded\def\checknofparlines - {\c_typo_par_temp\numexpr\c_typo_par_saved+\plusone\relax - \ifhmode - \c_typo_par_lines\zerocount - \edef\savedparstate{\number\c_typo_par_temp:\number\c_typo_par_current\space-}% - \else\ifnum\c_typo_par_current=\c_typo_par_temp - \c_typo_par_lines\prevgraf - \edef\savedparstate{\number\c_typo_par_temp:\number\c_typo_par_current\space\number\prevgraf}% - \else\ifnum\c_typo_par_temp>\c_typo_par_current - \c_typo_par_lines\zerocount - \edef\savedparstate{\number\c_typo_par_temp:\number\c_typo_par_current\space-}% - \else - \c_typo_par_lines\maxdimen - \edef\savedparstate{\number\c_typo_par_temp:\number\c_typo_par_current\space+}% - \fi\fi\fi} - -%D Maybe: - -\unexpanded\def\tightvbox{\dowithnextbox{\dp\nextbox\zeropoint\box\nextbox}\vbox} -\unexpanded\def\tightvtop{\dowithnextbox{\ht\nextbox\zeropoint\box\nextbox}\vtop} - -%D Needs some work: - -\unexpanded\def\startgridcorrection - {\dosingleempty\spac_grid_correction_start} - -\def\spac_grid_correction_start[#1]% - {\ifgridsnapping - \snaptogrid[#1]\vbox\bgroup - \else - \startbaselinecorrection - \fi} - -\unexpanded\def\stopgridcorrection - {\ifgridsnapping - \egroup - \else - \stopbaselinecorrection - \fi} - -\unexpanded\def\checkgridsnapping - {\lineskip\ifgridsnapping\zeropoint\else\normallineskip\fi} - -%D Probably obsolete: - -\unexpanded\def\startcolumnmakeup % don't change - {\bgroup - \getrawnoflines\textheight % raw as we cna have topskip - \setbox\scratchbox\vbox to \dimexpr\noflines\lineheight-\lineheight+\topskip\relax - \bgroup - \forgetall} - -\unexpanded\def\stopcolumnmakeup - {\egroup - \dp\scratchbox\zeropoint - \wd\scratchbox\textwidth - \box\scratchbox - \egroup - \page_otr_command_synchronize_hsize} - -%D Till we fixed all styles: - -\let\\=\crlf - \protect \endinput diff --git a/tex/context/base/mkiv/cont-run.lua b/tex/context/base/mkiv/cont-run.lua index 2225a0fb2..9bd252e60 100644 --- a/tex/context/base/mkiv/cont-run.lua +++ b/tex/context/base/mkiv/cont-run.lua @@ -34,9 +34,9 @@ local logfilename = "sandbox.log" local function registerstats() statistics.register("sandboxing", function() if trace_files then - return string.format("%s calls, %s rejected, logdata in '%s'",nofcalls,nofrejected,logfilename) + return string.format("%i calls, %i rejected, logdata in '%s'",nofcalls,nofrejected,logfilename) else - return string.format("%s calls, %s rejected",nofcalls,nofrejected) + return string.format("%i calls, %i rejected",nofcalls,nofrejected) end end) registerstats = false @@ -180,10 +180,48 @@ local function processjob() local suffix = environment.suffix local filename = environment.filename -- hm, not inputfilename ! - if arguments.synctex then - directives.enable("system.synctex="..tostring(arguments.synctex)) + if arguments.nosynctex then + luatex.synctex.setup { + state = interfaces.variables.never, + } + elseif arguments.synctex then + luatex.synctex.setup { + state = interfaces.variables.start, + method = interfaces.variables.max, + } end + -- -- todo: move from mtx-context to here: + -- + -- local timing = arguments.timing + -- if type(timing) == "string" then + -- context.usemodule { timing } + -- end + -- local nodates = arguments.nodates + -- if nodates then + -- context.enabledirectives { "backend.date=" .. (type(nodates) == "string" and nodates or "no") } + -- end + -- local trailerid = arguments.trailerid + -- if type(trailerid) == "string" then + -- context.enabledirectives { "backend.trailerid=" .. trailerid } + -- end + -- local profile = arguments.profile + -- if profile then + -- context.enabledirectives { "system.profile=" .. tonumber(profile) or 0 } + -- end + + -- -- already done in mtxrun / mtx-context, has to happen very early + -- + -- if arguments.silent then + -- directives.enable("logs.blocked",arguments.silent) + -- end + -- + -- -- already done in mtxrun / mtx-context, can as well happen here + -- + -- if arguments.errors then + -- directives.enable("logs.errors",arguments.errors) + -- end + if not filename or filename == "" then -- skip elseif suffix == "xml" or arguments.forcexml then @@ -232,6 +270,16 @@ local function processjob() -- context.input(filename) -- context.stoptext() + elseif suffix == "mps" or arguments.forcemps then + + report("processing metapost output: %s",filename) + + context.starttext() + context.startTEXpage() + context.externalfigure { filename } + context.stopTEXpage() + context.stoptext() + else -- \writestatus{system}{processing as tex} diff --git a/tex/context/base/mkiv/cont-run.mkiv b/tex/context/base/mkiv/cont-run.mkiv index 490c6bee2..b650be67d 100644 --- a/tex/context/base/mkiv/cont-run.mkiv +++ b/tex/context/base/mkiv/cont-run.mkiv @@ -13,9 +13,34 @@ \writestatus{loading}{ConTeXt Core Macros / Runner} +\registerctxluafile{cont-run}{} + +% \enabletrackers[system.synctex.visualize] +% \enabletrackers[system.synctex.xml] +% \enabledirectives[system.synctex.details] +% \setupsynctex[state=start] + \unprotect -\registerctxluafile{node-syn}{1.001} -\registerctxluafile{cont-run}{1.001} +\let\synctexsetfilename \clf_synctexsetfilename +\let\synctexresetfilename\clf_synctexresetfilename +\let\synctexblockfilename\clf_synctexblockfilename +\let\synctexpause \clf_synctexpause +\let\synctexresume \clf_synctexresume + +\appendtoks\clf_synctexpause \to\everybeforeoutput +\appendtoks\clf_synctexresume\to\everyafteroutput + +\unexpanded\def\setupsynctex[#1]% + {\begingroup + \getdummyparameters[\c!state=\v!stop,\c!method=\v!max,#1]% + \clf_setupsynctex + state {\dummyparameter\c!state}% + method {\dummyparameter\c!method}% + \relax + \endgroup} + +\unexpanded\def\blocksynctexfile[#1]% + {\processcommacommand{#1}\synctexblockfilename} \protect \endinput diff --git a/tex/context/base/mkiv/context-base.lmx b/tex/context/base/mkiv/context-base.lmx index 482d43e88..af8c3c127 100644 --- a/tex/context/base/mkiv/context-base.lmx +++ b/tex/context/base/mkiv/context-base.lmx @@ -25,6 +25,9 @@ <style type="text/css"> <?lua inject(variables.cssdata) ?> </style> + <?lua if variables.javascriptfiles then for k, v in ipairs(variables.javascriptfiles) do ?> + <script src="<?lua inject(v) ?>"></script> + <?lua end end ?> <?lua if variables.styles then for k, v in ipairs(variables.styles) do ?> <link rel="StyleSheet" href="<?lua inject(v) ?>" type="text/css" /> <?lua end end ?> @@ -36,10 +39,14 @@ </script> <![endif]--> <?lua end ?> + <body> <?lua if variables.action then ?> - <form action="<?lua inject(variables.action) ?>" enctype="multi-part/form-data" method="post"> + <?lua if variables.formmethod == "get" then ?> + <form action="<?lua inject(variables.action) ?>" method="get"> + <?lua else ?> + <form action="<?lua inject(variables.action) ?>" enctype="multi-part/form-data" method="post"> + <?lua end ?> <?lua end ?> - <body> <div id="top"><?lua if variables.title then ?> <div id="top-one"> <div id="top-two"><?lua @@ -81,8 +88,8 @@ <?lua inject(variables.maintext) ?> </div> </div> - </body> <?lua if variables.action then ?> </form> <?lua end ?> + </body> </html> diff --git a/tex/context/base/mkiv/context.mkiv b/tex/context/base/mkiv/context.mkiv index 509077bc9..6a3eddf9f 100644 --- a/tex/context/base/mkiv/context.mkiv +++ b/tex/context/base/mkiv/context.mkiv @@ -22,6 +22,8 @@ % on network shares cq. when no files are cached by the os it's of course % much worse. A zero run is .27 sec with luajittex. +% http://build.contextgarden.net/waterfall?tag=c/luatex + % Welcome to context, pronounced as kontekst (rather dutch) and not as % conτεχt. @@ -36,10 +38,11 @@ % \everypar{\writestatus{!!!!}{some spurious input in line \the\inputlineno}\wait} %D The order of loading will change when all modules have been cleaned -%D up and the dependencies are more consistent. +%D up and the dependencies are more consistent. beware, the version number +%D has to match \type {YYYY.MM.DD HH:MM} format. \edef\contextformat {\jobname} -\edef\contextversion{2017.05.15 21:48} +\edef\contextversion{2018.03.15 15:27} \edef\contextkind {beta} %D For those who want to use this: @@ -74,8 +77,8 @@ %D We just quit if new functionality is expected. -\ifnum\luatexversion<70 % also change message - \writestatus{!!!!}{Your luatex binary is too old, you need at least version 0.70!} +\ifnum\luatexversion<105 % also change message + \writestatus{!!!!}{Your luatex binary is too old, you need at least version 1.05!} \expandafter\end \fi @@ -182,13 +185,8 @@ \loadmarkfile{supp-box} -%loadmarkfile{supp-vis} % replaced by trac-vis -%loadmarkfile{supp-fun} % mostly replaced - \loadmarkfile{supp-ran} \loadmarkfile{supp-mat} -%loadmarkfile{spac-cha} % obsolete -%loadmarkfile{supp-num} % obsolete \loadmarkfile{core-uti} \loadmkvifile{file-job} @@ -228,7 +226,7 @@ \loadmarkfile{node-bck} % overloads anch-pgr (experimental and undocumented) -\loadmarkfile{pack-cut} % leftovers from trac-vis +\loadmarkfile{pack-cut} \loadmarkfile{lang-mis} \loadmarkfile{lang-url} @@ -272,7 +270,7 @@ \loadmarkfile{spac-hor} \loadmarkfile{spac-ali} \loadmarkfile{spac-flr} -\loadmarkfile{spac-ver} +\loadmarkfile{spac-ver} % beware, hooks into strc-sec \loadmarkfile{spac-lin} \loadmarkfile{spac-pag} \loadmarkfile{spac-par} @@ -308,7 +306,6 @@ \loadmarkfile{page-brk} \loadmarkfile{page-col} \loadmarkfile{page-inf} -\loadmarkfile{page-grd} \loadmarkfile{page-flt} \loadmarkfile{page-bck} \loadmarkfile{page-not} @@ -325,6 +322,7 @@ \loadmarkfile{page-mul} % partly overloaded \loadmarkfile{page-mix} % new \loadmarkfile{page-set} +\loadmarkfile{page-pcl} % new \loadmarkfile{pack-lyr} \loadmarkfile{pack-pos} \loadmkvifile{page-mak} @@ -437,6 +435,7 @@ \loadmarkfile{typo-chr} \loadmarkfile{typo-rub} \loadmkivfile{typo-fkr} +\loadmkivfile{typo-pnc} \loadmkvifile{type-ini} \loadmarkfile{type-set} @@ -458,6 +457,8 @@ \loadmarkfile{meta-pag} \loadmarkfile{meta-grd} \loadmarkfile{meta-fnt} +\loadmarkfile{meta-nod} +\loadmarkfile{meta-lua} \loadmarkfile{page-mrk} % depends on mp @@ -501,7 +502,7 @@ \loadmarkfile{typo-scr} \loadmarkfile{phys-dim} -\loadmarkfile{node-rul} +\loadmarkfile{node-rul} % beware, defined \underbar so after math \loadmkvifile{font-sol} % font solutions \loadmkvifile{strc-not} @@ -522,8 +523,12 @@ \loadmarkfile{page-app} \loadmarkfile{meta-fig} +\loadmarkfile{page-ffl} + \loadmarkfile{lang-spa} % will become obsolete +\loadmarkfile{typo-ovl} % fuzzy project (tracing) code + % old bibtex support: (will be m-oldbibtex.mkiv) % \loadmarkfile{bibl-bib} diff --git a/tex/context/base/mkiv/core-con.lua b/tex/context/base/mkiv/core-con.lua index 10f8fc2ed..edba24f10 100644 --- a/tex/context/base/mkiv/core-con.lua +++ b/tex/context/base/mkiv/core-con.lua @@ -20,8 +20,8 @@ local floor, date, time, concat = math.floor, os.date, os.time, table.concat local lower, upper, rep, match, gsub = string.lower, string.upper, string.rep, string.match, string.gsub local utfchar, utfbyte = utf.char, utf.byte local tonumber, tostring, type, rawset = tonumber, tostring, type, rawset -local P, S, R, Cc, Cf, Cg, Ct, Cs, C = lpeg.P, lpeg.S, lpeg.R, lpeg.Cc, lpeg.Cf, lpeg.Cg, lpeg.Ct, lpeg.Cs, lpeg.C -local lpegmatch = lpeg.match +local P, S, R, Cc, Cf, Cg, Ct, Cs, C, V, Carg = lpeg.P, lpeg.S, lpeg.R, lpeg.Cc, lpeg.Cf, lpeg.Cg, lpeg.Ct, lpeg.Cs, lpeg.C, lpeg.V, lpeg.Carg +local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns local context = context local commands = commands @@ -44,7 +44,6 @@ local languages = languages local ctx_labeltext = context.labeltext local ctx_LABELTEXT = context.LABELTEXT -local ctx_WORD = context.WORD local ctx_space = context.space local ctx_convertnumber = context.convertnumber local ctx_highordinalstr = context.highordinalstr @@ -902,39 +901,39 @@ converters.verbose = verbose -- verbose english local words = { - [0] = "zero", - [1] = "one", - [2] = "two", - [3] = "three", - [4] = "four", - [5] = "five", - [6] = "six", - [7] = "seven", - [8] = "eight", - [9] = "nine", - [10] = "ten", - [11] = "eleven", - [12] = "twelve", - [13] = "thirteen", - [14] = "fourteen", - [15] = "fifteen", - [16] = "sixteen", - [17] = "seventeen", - [18] = "eighteen", - [19] = "nineteen", - [20] = "twenty", - [30] = "thirty", - [40] = "forty", - [50] = "fifty", - [60] = "sixty", - [70] = "seventy", - [80] = "eighty", - [90] = "ninety", - [100] = "hundred", - [1000] = "thousand", - [1000^2] = "million", - [1000^3] = "billion", - [1000^4] = "trillion", + [0] = "zero", + [1] = "one", + [2] = "two", + [3] = "three", + [4] = "four", + [5] = "five", + [6] = "six", + [7] = "seven", + [8] = "eight", + [9] = "nine", + [10] = "ten", + [11] = "eleven", + [12] = "twelve", + [13] = "thirteen", + [14] = "fourteen", + [15] = "fifteen", + [16] = "sixteen", + [17] = "seventeen", + [18] = "eighteen", + [19] = "nineteen", + [20] = "twenty", + [30] = "thirty", + [40] = "forty", + [50] = "fifty", + [60] = "sixty", + [70] = "seventy", + [80] = "eighty", + [90] = "ninety", + [100] = "hundred", + [1000] = "thousand", + [1000000] = "million", + [1000000000] = "billion", + [1000000000000] = "trillion", } local function translate(n) @@ -980,10 +979,10 @@ local function translate(n) end return n end - n = compose_two(n,1000^4) - n = compose_two(n,1000^3) - n = compose_two(n,1000^2) - n = compose_two(n,1000^1) + n = compose_two(n,1000000000000) + n = compose_two(n,1000000000) + n = compose_two(n,1000000) + n = compose_two(n,1000) if n > 0 then compose_one(n) end @@ -1008,55 +1007,55 @@ data.en = data.english -- verbose spanish (unchecked) local words = { - [1] = "uno", - [2] = "dos", - [3] = "tres", - [4] = "cuatro", - [5] = "cinco", - [6] = "seis", - [7] = "siete", - [8] = "ocho", - [9] = "nueve", - [10] = "diez", - [11] = "once", - [12] = "doce", - [13] = "trece", - [14] = "catorce", - [15] = "quince", - [16] = "dieciséis", - [17] = "diecisiete", - [18] = "dieciocho", - [19] = "diecinueve", - [20] = "veinte", - [21] = "veintiuno", - [22] = "veintidós", - [23] = "veintitrés", - [24] = "veinticuatro", - [25] = "veinticinco", - [26] = "veintiséis", - [27] = "veintisiete", - [28] = "veintiocho", - [29] = "veintinueve", - [30] = "treinta", - [40] = "cuarenta", - [50] = "cincuenta", - [60] = "sesenta", - [70] = "setenta", - [80] = "ochenta", - [90] = "noventa", - [100] = "ciento", - [200] = "doscientos", - [300] = "trescientos", - [400] = "cuatrocientos", - [500] = "quinientos", - [600] = "seiscientos", - [700] = "setecientos", - [800] = "ochocientos", - [900] = "novecientos", - [1000] = "mil", - [1000^2] = "millón", - [1000^3] = "mil millones", - [1000^4] = "billón", + [1] = "uno", + [2] = "dos", + [3] = "tres", + [4] = "cuatro", + [5] = "cinco", + [6] = "seis", + [7] = "siete", + [8] = "ocho", + [9] = "nueve", + [10] = "diez", + [11] = "once", + [12] = "doce", + [13] = "trece", + [14] = "catorce", + [15] = "quince", + [16] = "dieciséis", + [17] = "diecisiete", + [18] = "dieciocho", + [19] = "diecinueve", + [20] = "veinte", + [21] = "veintiuno", + [22] = "veintidós", + [23] = "veintitrés", + [24] = "veinticuatro", + [25] = "veinticinco", + [26] = "veintiséis", + [27] = "veintisiete", + [28] = "veintiocho", + [29] = "veintinueve", + [30] = "treinta", + [40] = "cuarenta", + [50] = "cincuenta", + [60] = "sesenta", + [70] = "setenta", + [80] = "ochenta", + [90] = "noventa", + [100] = "ciento", + [200] = "doscientos", + [300] = "trescientos", + [400] = "cuatrocientos", + [500] = "quinientos", + [600] = "seiscientos", + [700] = "setecientos", + [800] = "ochocientos", + [900] = "novecientos", + [1000] = "mil", + [1000000] = "millón", + [1000000000] = "mil millones", + [1000000000000] = "billón", } local function translate(n) @@ -1079,7 +1078,7 @@ local function translate(n) t[#t+1] = words[1000] -- x hundred (n.b. this will not give thirteen hundred because -- compose_one(n) is only called after - -- `n = compose(two(n, 1000^1))`. + -- n = compose(two(n, 1000)) elseif a > 0 then t[#t+1] = words[a*100] end @@ -1107,10 +1106,10 @@ local function translate(n) end return n end - n = compose_two(n,1000^4) - n = compose_two(n,1000^3) - n = compose_two(n,1000^2) - n = compose_two(n,1000^1) + n = compose_two(n,1000000000000) + n = compose_two(n,1000000000) + n = compose_two(n,1000000) + n = compose_two(n,1000) if n > 0 then compose_one(n) end @@ -1149,15 +1148,19 @@ implement { -- These are just helpers but not really for the tex end. Do we have to -- use translate here? -local whitespace = lpeg.patterns.whitespace -local word = lpeg.patterns.utf8uppercharacter^-1 * (1-whitespace)^1 +local whitespace = lpegpatterns.whitespace +local word = lpegpatterns.utf8uppercharacter^-1 * (1-whitespace)^1 local pattern_one = Cs( whitespace^0 * word^-1 * P(1)^0) local pattern_all = Cs((whitespace^1 + word)^1) function converters.word (s) return s end -- dummies for typos function converters.words(s) return s end -- dummies for typos -function converters.Word (s) return lpegmatch(pattern_one,s) or s end -function converters.Words(s) return lpegmatch(pattern_all,s) or s end + +local function Word (s) return lpegmatch(pattern_one,s) or s end +local function Words(s) return lpegmatch(pattern_all,s) or s end + +converters.Word = Word +converters.Words = Words converters.upper = characters.upper converters.lower = characters.lower @@ -1324,7 +1327,7 @@ local function currentdate(str,currentlanguage) -- second argument false : no la context("%02i",year % 100) elseif tag == v_month or tag == "m" then if currentlanguage == false then - context(months[month]) + context(Word(months[month])) elseif mnemonic then ctx_labeltext(variables[mnemonic[month]]) else @@ -1332,7 +1335,7 @@ local function currentdate(str,currentlanguage) -- second argument false : no la end elseif tag == v_MONTH then if currentlanguage == false then - ctx_WORD(variables[months[month]]) + context(Word(variables[months[month]])) elseif mnemonic then ctx_LABELTEXT(variables[mnemonic[month]]) else @@ -1344,7 +1347,7 @@ local function currentdate(str,currentlanguage) -- second argument false : no la context(month) elseif tag == v_day or tag == "d" then if currentlanguage == false then - context(days[day]) + context(day) else ctx_convertnumber(v_day,day) -- why not direct end @@ -1358,14 +1361,14 @@ local function currentdate(str,currentlanguage) -- second argument false : no la elseif tag == v_weekday or tag == "w" then local wd = weekday(day,month,year) if currentlanguage == false then - context(days[wd]) + context(Word(days[wd])) else ctx_labeltext(variables[days[wd]]) end elseif tag == v_WEEKDAY then local wd = weekday(day,month,year) if currentlanguage == false then - ctx_WORD(days[wd]) + context(Word(days[wd])) else ctx_LABELTEXT(variables[days[wd]]) end @@ -1391,30 +1394,31 @@ local function currentdate(str,currentlanguage) -- second argument false : no la end end -implement { - name = "currentdate", - actions = currentdate, - arguments = { "string", "string" } -} + implement { - name = "rawdate", - actions = currentdate, - arguments = { "string", false } + name = "currentdate", + arguments = { "string", "string", "string" }, + actions = function(pattern,default,language) + currentdate( + pattern == "" and default or pattern, + language == "" and false or language + ) + end, } implement { name = "unihex", + arguments = "integer", actions = { formatters["U+%05X"], context }, - arguments = "integer" } -local n = lpeg.R("09")^1 / tonumber +local n = R("09")^1 / tonumber local p = Cf( Ct("") * Cg(Cc("year") * (n )) * P("-")^-1 * Cg(Cc("month") * (n + Cc( 1))) * P("-")^-1 - * Cg(Cc("day") * (n + Cc( 1))) * lpeg.patterns.whitespace^-1 + * Cg(Cc("day") * (n + Cc( 1))) * whitespace^-1 * Cg(Cc("hour") * (n + Cc( 0))) * P(":")^-1 * Cg(Cc("min") * (n + Cc( 0))) , rawset) @@ -1444,3 +1448,141 @@ function converters.settime(t) texset("time", (t.hour or 0) * 60 + (t.min or 0)) end end + +-- taken from x-asciimath (where we needed it for a project) + +local d_one = lpegpatterns.digit +local d_two = d_one * d_one +local d_three = d_two * d_one +local d_four = d_three * d_one +local d_split = P(-1) + Carg(2) * (lpegpatterns.period /"") + +local d_spaced = (Carg(1) * d_three)^1 + +local digitized_1 = Cs ( ( + d_three * d_spaced * d_split + + d_two * d_spaced * d_split + + d_one * d_spaced * d_split + + P(1) + )^1 ) + +local p_fourbefore = d_four * d_split +local p_fourafter = d_four * P(-1) + +local p_beforesplit = d_three * d_spaced^0 * d_split + + d_two * d_spaced^0 * d_split + + d_one * d_spaced^0 * d_split + + d_one * d_split + +local p_aftersplit = p_fourafter + + d_three * d_spaced + + d_two * d_spaced + + d_one * d_spaced + +local digitized_2 = Cs ( + p_fourbefore * (p_aftersplit^0) + + p_beforesplit * ((p_aftersplit + d_one^1)^0) + ) + +local p_fourbefore = d_four * d_split +local p_fourafter = d_four +local d_spaced = (Carg(1) * (d_three + d_two + d_one))^1 +local p_aftersplit = p_fourafter * P(-1) + + d_three * d_spaced * P(1)^0 + + d_one^1 + +local digitized_3 = Cs((p_fourbefore + p_beforesplit) * p_aftersplit^0) + +local digits_space = utfchar(0x2008) + +local splitmethods = { + digitized_1, + digitized_2, + digitized_3, +} + +local replacers = table.setmetatableindex(function(t,k) + local v = lpeg.replacer(".",k) + t[k] = v + return v +end) + +function converters.spaceddigits(settings,data) + local data = tostring(data or settings.data or "") + if data ~= "" then + local method = settings.method + local split = splitmethods[tonumber(method) or 1] + if split then + local symbol = settings.symbol + local separator = settings.separator + if not symbol or symbol == "" then + symbol = "." + end + if type(separator) ~= "string" or separator == "" then + separator = digits_space + end + local result = lpegmatch(split,data,1,separator,symbol) + if not result and symbol ~= "." then + result = lpegmatch(replacers[symbol],data) + end + if result then + -- print(method,symbol,separator,data,result) + return result + end + end + end + return str +end + +-- method 2 : split 3 before and 3 after +-- method 3 : split 3 before and 3 after with > 4 before + +-- symbols is extra split (in addition to period) + +-- local setup = { splitmethod = 3, symbol = "," } +-- local setup = { splitmethod = 2, symbol = "," } +-- local setup = { splitmethod = 1, symbol = "," } +-- +-- local t = { +-- "0.00002", +-- "1", "12", "123", "1234", "12345", "123456", "1234567", "12345678", "123456789", +-- "1.1", +-- "12.12", +-- "123.123", +-- "1234.123", +-- "1234.1234", +-- "12345.1234", +-- "1234.12345", +-- "12345.12345", +-- "123456.123456", +-- "1234567.1234567", +-- "12345678.12345678", +-- "123456789.123456789", +-- "0.1234", +-- "1234.0", +-- "1234.00", +-- "0.123456789", +-- "100.00005", +-- "0.80018", +-- "10.80018", +-- "100.80018", +-- "1000.80018", +-- "10000.80018", +-- } +-- +-- for i=1,#t do +-- print(formatters["%-20s : [%s]"](t[i],converters.spaceddigits(setup,t[i]))) +-- end + +implement { + name = "spaceddigits", + actions = { converters.spaceddigits, context }, + arguments = { + { + { "symbol" }, + { "separator" }, + { "data" }, + { "method" }, + } + } +} diff --git a/tex/context/base/mkiv/core-con.mkiv b/tex/context/base/mkiv/core-con.mkiv index a4d358e04..b4f247fcb 100644 --- a/tex/context/base/mkiv/core-con.mkiv +++ b/tex/context/base/mkiv/core-con.mkiv @@ -13,7 +13,7 @@ \writestatus{loading}{ConTeXt Core Macros / Conversion} -\registerctxluafile{core-con}{1.001} +\registerctxluafile{core-con}{} % todo: iso date ranges (from/to) @@ -416,8 +416,7 @@ \def\syst_converters_current_date[#1]% {\begingroup \the\everycurrentdate - \doifsomething{#1}{\edef\currentdatespecification{#1}}% - \clf_currentdate{\currentdatespecification}{\labellanguage}% + \clf_currentdate{#1}{\currentdatespecification}{\labellanguage}% \endgroup} \unexpanded\def\date @@ -438,7 +437,7 @@ \endgroup} \def\rawdate[#1]% expandable and no labels - {\clf_rawdate{\currentdatespecification}} + {\clf_currentdate{#1}{\currentdatespecification}{}} %D \macros %D {currenttime} @@ -875,4 +874,18 @@ [\v!continued] [\continuednumber] +%D Taken from x-asciimath (see digits-001.tex for an example): + +\let\spaceddigitsmethod \empty % alternative methods : 1 default, 2 and 3 only when > 4 +\let\spaceddigitssymbol \empty % extra splitter symbol : {,} +\let\spaceddigitsseparator\empty % separator symbol : {\Uchar{"2008}} + +\unexpanded\def\spaceddigits#1% + {\clf_spaceddigits + method {\spaceddigitsmethod}% + symbol {\spaceddigitssymbol}% + separator {\spaceddigitsseparator}% + data {#1}% + \relax} + \protect \endinput diff --git a/tex/context/base/mkiv/core-ctx.lua b/tex/context/base/mkiv/core-ctx.lua index 3362e43b9..1c39b6581 100644 --- a/tex/context/base/mkiv/core-ctx.lua +++ b/tex/context/base/mkiv/core-ctx.lua @@ -33,6 +33,7 @@ millisecond it's not that much of a burden. local trace_prepfiles = false trackers.register("system.prepfiles", function(v) trace_prepfiles = v end) +local tostring = tostring local gsub, find, match, validstring = string.gsub, string.find, string.match, string.valid local concat = table.concat local xmltext = xml.text diff --git a/tex/context/base/mkiv/core-ctx.mkiv b/tex/context/base/mkiv/core-ctx.mkiv index e6372d099..77fb0f139 100644 --- a/tex/context/base/mkiv/core-ctx.mkiv +++ b/tex/context/base/mkiv/core-ctx.mkiv @@ -13,7 +13,7 @@ \writestatus{loading}{ConTeXt Core Macros / Job Control} -\registerctxluafile{core-ctx}{1.000} +\registerctxluafile{core-ctx}{} \unprotect diff --git a/tex/context/base/mkiv/core-dat.mkiv b/tex/context/base/mkiv/core-dat.mkiv index 26b1f14b5..3bb923af4 100644 --- a/tex/context/base/mkiv/core-dat.mkiv +++ b/tex/context/base/mkiv/core-dat.mkiv @@ -32,7 +32,7 @@ \unprotect -\registerctxluafile{core-dat}{1.001} +\registerctxluafile{core-dat}{} \installcorenamespace{dataset} diff --git a/tex/context/base/mkiv/core-def.mkiv b/tex/context/base/mkiv/core-def.mkiv index acd411fac..9dbb16f5c 100644 --- a/tex/context/base/mkiv/core-def.mkiv +++ b/tex/context/base/mkiv/core-def.mkiv @@ -53,9 +53,9 @@ \flushnotes \to \everydisplay -\appendtoks - \adjustsidefloatdisplaylines -\to \everydisplay +% \appendtoks +% \adjustsidefloatdisplaylines +% \to \everydisplay % \appendtoks % \flushpostponednodedata @@ -167,4 +167,8 @@ % \setbreakpoints[compound] +%D Till we fixed all styles: + +\let\\=\crlf + \protect \endinput diff --git a/tex/context/base/mkiv/core-env.lua b/tex/context/base/mkiv/core-env.lua index 583a6ed1e..0ef37a6d6 100644 --- a/tex/context/base/mkiv/core-env.lua +++ b/tex/context/base/mkiv/core-env.lua @@ -57,7 +57,7 @@ setmetatableindex(texmodes, function(t,k) local m = modes[k] if m then return m() - else + elseif k then local n = "mode>" .. k if cache[n].mode == 0 then return false @@ -65,6 +65,8 @@ setmetatableindex(texmodes, function(t,k) rawset(modes,k, function() return texgetcount(n) == 1 end) return texgetcount(n) == 1 -- 2 is prevented end + else + return false end end) setmetatablenewindex(texmodes, function(t,k) diff --git a/tex/context/base/mkiv/core-env.mkiv b/tex/context/base/mkiv/core-env.mkiv index 0b8894265..c93350db0 100644 --- a/tex/context/base/mkiv/core-env.mkiv +++ b/tex/context/base/mkiv/core-env.mkiv @@ -13,7 +13,7 @@ \writestatus{loading}{ConTeXt Core Macros / Environments} -\registerctxluafile{core-env}{1.001} +\registerctxluafile{core-env}{} \unprotect diff --git a/tex/context/base/mkiv/core-ini.mkiv b/tex/context/base/mkiv/core-ini.mkiv index 0407409a3..cb8881c22 100644 --- a/tex/context/base/mkiv/core-ini.mkiv +++ b/tex/context/base/mkiv/core-ini.mkiv @@ -87,6 +87,10 @@ \newtoks \everyinsidefloat +%D Exporting: + +\newtoks\everyinitializeexport + %D Sectioning: %newtoks \everyheadstart @@ -171,6 +175,7 @@ \newif \ifinsidefloat \newif \ifdoingblocks \newif \ifgridsnapping +\newif \ifexporting \newconstant\pageduplexmode % 0 single 1 double 2 mix \newconstant\pagebodymode % 0 not 1 normal pagebody 2 spread diff --git a/tex/context/base/mkiv/core-sys.lua b/tex/context/base/mkiv/core-sys.lua index 0dbe76685..523b47298 100644 --- a/tex/context/base/mkiv/core-sys.lua +++ b/tex/context/base/mkiv/core-sys.lua @@ -75,8 +75,7 @@ statistics.register("result saved in file", function() local outputfilename = environment.outputfilename or environment.jobname or tex.jobname or "<unset>" if (tex.pdfoutput or tex.outputmode) > 0 then return format("%s.%s, compresslevel %s, objectcompresslevel %s",outputfilename,"pdf", - pdf.getcompresslevel(), - pdf.getobjcompresslevel() + lpdf.getcompression() ) else return format("%s.%s",outputfilename,"dvi") -- hard to imagine diff --git a/tex/context/base/mkiv/core-sys.mkiv b/tex/context/base/mkiv/core-sys.mkiv index 172cb7a38..4d99d8647 100644 --- a/tex/context/base/mkiv/core-sys.mkiv +++ b/tex/context/base/mkiv/core-sys.mkiv @@ -15,7 +15,7 @@ \writestatus{loading}{ConTeXt Core Macros / System} -\registerctxluafile{core-sys}{1.001} +\registerctxluafile{core-sys}{} \unprotect @@ -208,6 +208,8 @@ \setuevalue {\currentstartstop}{\syst_startstop_indeed{\currentstartstop}}% \to \everydefinestartstop +\ifdefined\dotagconstruct \else \let\dotagconstruct\relax \fi + \unexpanded\def\syst_startstop_start#1% {\namedstartstopparameter{#1}\c!before\relax \bgroup @@ -217,7 +219,8 @@ % this is the new method: \usesetupsparameter\startstopparameter\relax % only in the display version \dostarttagged\t!construct\currentstartstop - \usestartstopstyleandcolor\c!style\c!color} + \usestartstopstyleandcolor\c!style\c!color + \dotagconstruct} \unexpanded\def\syst_startstop_stop#1% {\dostoptagged @@ -231,7 +234,7 @@ \dostarttagged\t!construct\currentstartstop \usestartstopstyleandcolor\c!style\c!color \startstopparameter\c!left\relax} - {\def\currentstartstop{#1}% safeguard, nto really needed + {\def\currentstartstop{#1}% safeguard, not really needed \startstopparameter\c!right\relax \dostoptagged \startstopparameter\c!inbetween\relax}} diff --git a/tex/context/base/mkiv/core-two.lua b/tex/context/base/mkiv/core-two.lua index bb1afa7db..5192677b2 100644 --- a/tex/context/base/mkiv/core-two.lua +++ b/tex/context/base/mkiv/core-two.lua @@ -6,6 +6,7 @@ if not modules then modules = { } end modules ['core-two'] = { license = "see context related readme files" } +local next = next local remove, concat = table.remove, table.concat local allocate = utilities.storage.allocate diff --git a/tex/context/base/mkiv/core-two.mkiv b/tex/context/base/mkiv/core-two.mkiv index 5a791dea2..f83d63042 100644 --- a/tex/context/base/mkiv/core-two.mkiv +++ b/tex/context/base/mkiv/core-two.mkiv @@ -71,7 +71,7 @@ \unprotect -\registerctxluafile{core-two}{1.001} +\registerctxluafile{core-two}{} \def\immediatesavetwopassdata #1#2#3{\normalexpanded{\noexpand\clf_savetwopassdata{#1}{#3}}} \def\savetwopassdata #1#2#3{\normalexpanded{\noexpand\ctxlatecommand{savetwopassdata('#1',"#3")}}} diff --git a/tex/context/base/mkiv/core-uti.lua b/tex/context/base/mkiv/core-uti.lua index a2869e6ea..fda66ed73 100644 --- a/tex/context/base/mkiv/core-uti.lua +++ b/tex/context/base/mkiv/core-uti.lua @@ -19,7 +19,7 @@ saves much runtime but at the cost of more memory usage.</p> local math = math local format, match = string.format, string.match -local next, type, tostring = next, type, tostring +local next, type, tostring, tonumber = next, type, tostring, tonumber local concat = table.concat local definetable = utilities.tables.definetable @@ -297,14 +297,16 @@ function job.load(filename) local target = list[1] local initializer = list[3] local result = accesstable(target,utilitydata) - local done = packers.unpack(result,jobpacker,true) - if done then - migratetable(target,mark(result)) - if type(initializer) == "function" then - handlers[#handlers+1] = { initializer, result } + if result then + local done = packers.unpack(result,jobpacker,true) + if done then + migratetable(target,mark(result)) + if type(initializer) == "function" then + handlers[#handlers+1] = { initializer, result } + end + else + report_passes("pack version mismatch") end - else - report_passes("pack version mismatch") end end -- so we have all tables available (unpacked) diff --git a/tex/context/base/mkiv/core-uti.mkiv b/tex/context/base/mkiv/core-uti.mkiv index c50a0eacc..68965707f 100644 --- a/tex/context/base/mkiv/core-uti.mkiv +++ b/tex/context/base/mkiv/core-uti.mkiv @@ -15,7 +15,7 @@ \unprotect -\registerctxluafile{core-uti}{1.001} +\registerctxluafile{core-uti}{} \def\savecurrentvalue#1#2% immediate, so not \unexpanded {\clf_savevariable{\csstring#1}{#2}} diff --git a/tex/context/base/mkiv/data-aux.lua b/tex/context/base/mkiv/data-aux.lua index dae96ce62..1e020d1e8 100644 --- a/tex/context/base/mkiv/data-aux.lua +++ b/tex/context/base/mkiv/data-aux.lua @@ -38,7 +38,7 @@ function resolvers.updatescript(oldname,newname) -- oldname -> own.name, not per if trace_locating then report_scripts("old and new script are the same") end - elseif not find(newscript,scriptpath) then + elseif not find(newscript,scriptpath,1,true) then if trace_locating then report_scripts("new script should come from %a",scriptpath) end diff --git a/tex/context/base/mkiv/data-crl.lua b/tex/context/base/mkiv/data-crl.lua index ec517fba3..dec9972f1 100644 --- a/tex/context/base/mkiv/data-crl.lua +++ b/tex/context/base/mkiv/data-crl.lua @@ -26,7 +26,7 @@ local runner = sandbox.registerrunner { name = "curl resolver", method = "execute", program = "curl", - template = "--silent -- insecure --create-dirs --output %cachename% %original%", + template = "--silent --insecure --create-dirs --output %cachename% %original%", checkers = { cachename = "cache", original = "url", diff --git a/tex/context/base/mkiv/data-env.lua b/tex/context/base/mkiv/data-env.lua index 8bb25036d..1b31caab6 100644 --- a/tex/context/base/mkiv/data-env.lua +++ b/tex/context/base/mkiv/data-env.lua @@ -7,6 +7,7 @@ if not modules then modules = { } end modules ['data-env'] = { } local lower, gsub = string.lower, string.gsub +local next = next local resolvers = resolvers diff --git a/tex/context/base/mkiv/data-exp.lua b/tex/context/base/mkiv/data-exp.lua index e34c52efb..76fd3c7b0 100644 --- a/tex/context/base/mkiv/data-exp.lua +++ b/tex/context/base/mkiv/data-exp.lua @@ -332,43 +332,46 @@ local scancache = { } local fullcache = { } ----- simplecache = { } local nofsharedscans = 0 +local addcasecraptoo = true -- experiment to let case matter a bit (still fuzzy) -- So, we assume either a lowercase name or a mixed case one but only one such case -- as having Foo fOo foo FoO FOo etc on the system is braindead in any sane project. local function scan(files,remap,spec,path,n,m,r,onlyone,tolerant) - local full = path == "" and spec or (spec .. path .. '/') - local dirs = { } - local nofdirs = 0 - local pattern = tolerant and lessweird or weird + local full = path == "" and spec or (spec .. path .. '/') + local dirlist = { } + local nofdirs = 0 + local pattern = tolerant and lessweird or weird + local filelist = { } + local noffiles = 0 for name in directory(full) do if not lpegmatch(pattern,name) then local mode = attributes(full..name,"mode") if mode == "file" then n = n + 1 - local lower = lower(name) - local paths = files[lower] - if paths then - if onlyone then - -- forget about it - else - if type(paths) == "string" then - files[lower] = { paths, path } - else - paths[#paths+1] = path - end - if name ~= lower then - local rl = remap[lower] - if not rl then - remap[lower] = name - r = r + 1 - elseif trace_globbing and rl ~= name then - report_globbing("confusing filename, name: %a, lower: %a, already: %a",name,lower,rl) - end - end - end - else -- probably unique anyway - files[lower] = path + noffiles = noffiles + 1 + filelist[noffiles] = name + elseif mode == "directory" then + m = m + 1 + nofdirs = nofdirs + 1 + if path ~= "" then + dirlist[nofdirs] = path .. "/" .. name + else + dirlist[nofdirs] = name + end + end + end + end + if noffiles > 0 then + sort(filelist) + for i=1,noffiles do + local name = filelist[i] + local lower = lower(name) + local paths = files[lower] + if paths then + if onlyone then + -- forget about it + else if name ~= lower then local rl = remap[lower] if not rl then @@ -377,23 +380,41 @@ local function scan(files,remap,spec,path,n,m,r,onlyone,tolerant) elseif trace_globbing and rl ~= name then report_globbing("confusing filename, name: %a, lower: %a, already: %a",name,lower,rl) end + if addcasecraptoo then + local paths = files[name] + if not paths then + files[name] = path + elseif type(paths) == "string" then + files[name] = { paths, path } + else + paths[#paths+1] = path + end + end + end + if type(paths) == "string" then + files[lower] = { paths, path } + else + paths[#paths+1] = path end end - elseif mode == "directory" then - m = m + 1 - nofdirs = nofdirs + 1 - if path ~= "" then - dirs[nofdirs] = path .. "/" .. name - else - dirs[nofdirs] = name + else -- probably unique anyway + files[lower] = path + if name ~= lower then + local rl = remap[lower] + if not rl then + remap[lower] = name + r = r + 1 + elseif trace_globbing and rl ~= name then + report_globbing("confusing filename, name: %a, lower: %a, already: %a",name,lower,rl) + end end end end end if nofdirs > 0 then - sort(dirs) + sort(dirlist) for i=1,nofdirs do - files, remap, n, m, r = scan(files,remap,spec,dirs[i],n,m,r,onlyonce,tolerant) + files, remap, n, m, r = scan(files,remap,spec,dirlist[i],n,m,r,onlyonce,tolerant) end end scancache[sub(full,1,-2)] = files @@ -490,6 +511,12 @@ function resolvers.get_from_content(content,path,name) -- or (content,name) else -- this one does a lookup and resolves a remapped name local name = path +-- if addcasecraptoo then +-- local path = files[name] +-- if path then +-- return path, name +-- end +-- end local used = lower(name) local path = files[used] if path then @@ -500,28 +527,6 @@ end local nothing = function() end --- function resolvers.filtered_from_content(content,pattern) --- if content and type(pattern) == "string" then --- local pattern = lower(pattern) --- local files = content.files --- local remap = content.remap --- if files and remap then --- local n = next(files) --- local function iterator() --- while n do --- local k = n --- n = next(files,k) --- if find(k,pattern) then --- return files[k], remap and remap[k] or k --- end --- end --- end --- return iterator --- end --- end --- return nothing --- end - function resolvers.filtered_from_content(content,pattern) if content and type(pattern) == "string" then local pattern = lower(pattern) diff --git a/tex/context/base/mkiv/data-lst.lua b/tex/context/base/mkiv/data-lst.lua index e4621a6e1..f061393e5 100644 --- a/tex/context/base/mkiv/data-lst.lua +++ b/tex/context/base/mkiv/data-lst.lua @@ -8,18 +8,17 @@ if not modules then modules = { } end modules ['data-lst'] = { -- used in mtxrun, can be loaded later .. todo -local rawget, type, next = rawget, type, next +local type = type +local concat, sortedhash = table.concat,table.sortedhash -local find, concat, upper = string.find, table.concat, string.upper -local fastcopy, sortedpairs = table.fastcopy, table.sortedpairs +local resolvers = resolvers +local listers = resolvers.listers or { } +resolvers.listers = listers -local resolvers = resolvers -local listers = resolvers.listers or { } -resolvers.listers = listers +local resolveprefix = resolvers.resolve -local resolveprefix = resolvers.resolve - -local report_lists = logs.reporter("resolvers","lists") +local report_lists = logs.reporter("resolvers","lists") +local report_resolved = logs.reporter("system","resolved") local function tabstr(str) if type(str) == 'table' then @@ -30,41 +29,18 @@ local function tabstr(str) end function listers.variables(pattern) - local instance = resolvers.instance - local environment = instance.environment - local variables = instance.variables - local expansions = instance.expansions - local pattern = upper(pattern or "") - local configured = { } - local order = instance.order - for i=1,#order do - for k, v in next, order[i] do - if v ~= nil and configured[k] == nil then - configured[k] = v - end - end + local result = resolvers.knownvariables(pattern) + for key, value in sortedhash(result) do + report_lists(key) + report_lists(" env: %s",tabstr(value.environment or "unset")) + report_lists(" var: %s",tabstr(value.variable or "unset")) + report_lists(" exp: %s",tabstr(value.expansion or "unset")) + report_lists(" res: %s",tabstr(value.resolved or "unset")) end - local env = fastcopy(environment) - local var = fastcopy(variables) - local exp = fastcopy(expansions) - for key, value in sortedpairs(configured) do - if key ~= "" and (pattern == "" or find(upper(key),pattern)) then - report_lists(key) - report_lists(" env: %s",tabstr(rawget(environment,key)) or "unset") - report_lists(" var: %s",tabstr(configured[key]) or "unset") - report_lists(" exp: %s",tabstr(expansions[key]) or "unset") - report_lists(" res: %s",tabstr(resolveprefix(expansions[key])) or "unset") - end - end - instance.environment = fastcopy(env) - instance.variables = fastcopy(var) - instance.expansions = fastcopy(exp) end -local report_resolved = logs.reporter("system","resolved") - function listers.configurations() - local configurations = resolvers.instance.specification + local configurations = resolvers.configurationfiles() for i=1,#configurations do report_resolved("file : %s",resolveprefix(configurations[i])) end diff --git a/tex/context/base/mkiv/data-res.lua b/tex/context/base/mkiv/data-res.lua index 4f171c445..9fb33f88d 100644 --- a/tex/context/base/mkiv/data-res.lua +++ b/tex/context/base/mkiv/data-res.lua @@ -6,15 +6,6 @@ if not modules then modules = { } end modules ['data-res'] = { license = "see context related readme files", } --- In practice we will work within one tds tree, but i want to keep --- the option open to build tools that look at multiple trees, which is --- why we keep the tree specific data in a table. We used to pass the --- instance but for practical purposes we now avoid this and use a --- instance variable. We always have one instance active (sort of global). - --- I will reimplement this module ... way too fuzzy now and we can work --- with some sensible constraints as it is only is used for context. - -- todo: cache:/// home:/// selfautoparent:/// (sometime end 2012) local gsub, find, lower, upper, match, gmatch = string.gsub, string.find, string.lower, string.upper, string.match, string.gmatch @@ -154,8 +145,7 @@ local suffixmap = resolvers.suffixmap resolvers.defaultsuffixes = { "tex" } -- "mkiv", "cld" -- too tricky -resolvers.instance = resolvers.instance or nil -- the current one (slow access) -local instance = resolvers.instance or nil -- the current one (fast access) +local instance = nil -- the current one (fast access) -- An instance has an environment (coming from the outside, kept raw), variables -- (coming from the configuration file), and expansions (variables with nested @@ -218,7 +208,7 @@ local function expandedvariable(var) return lpegmatch(variableexpander,var) or var end -function resolvers.newinstance() -- todo: all vars will become lowercase and alphanum only +function resolvers.reset() -- normally we only need one instance but for special cases we can (re)load one so -- we stick to this model. @@ -227,24 +217,27 @@ function resolvers.newinstance() -- todo: all vars will become lowercase and alp report_resolving("creating instance") end - local environment, variables, expansions, order = allocate(), allocate(), allocate(), allocate() + local environment = { } + local variables = { } + local expansions = { } + local order = { } - local newinstance = { + instance = { environment = environment, variables = variables, expansions = expansions, order = order, - files = allocate(), - setups = allocate(), - found = allocate(), - foundintrees = allocate(), - hashes = allocate(), - hashed = allocate(), + files = { }, + setups = { }, + found = { }, + foundintrees = { }, + hashes = { }, + hashed = { }, pathlists = false,-- delayed - specification = allocate(), - lists = allocate(), - data = allocate(), -- only for loading - fakepaths = allocate(), + specification = { }, + lists = { }, + data = { }, -- only for loading + fakepaths = { }, remember = true, diskcache = true, renewcache = false, @@ -295,18 +288,10 @@ function resolvers.newinstance() -- todo: all vars will become lowercase and alp return v end) - return newinstance - -end - -function resolvers.setinstance(someinstance) -- only one instance is active - instance = someinstance - resolvers.instance = someinstance - return someinstance end -function resolvers.reset() - return resolvers.setinstance(resolvers.newinstance()) +function resolvers.initialized() + return instance ~= nil end local function reset_hashes() @@ -501,10 +486,15 @@ local function load_configuration_files() end end +function resolvers.configurationfiles() + return instance.specification or { } +end + -- scheme magic ... database loading local function load_file_databases() - instance.loaderror, instance.files = false, allocate() + instance.loaderror = false + instance.files = { } if not instance.renewcache then local hashes = instance.hashes for k=1,#hashes do @@ -693,13 +683,13 @@ function resolvers.datastate() end function resolvers.variable(name) - local name = name and lpegmatch(dollarstripper,name) + local name = name and lpegmatch(dollarstripper,name) local result = name and instance.variables[name] return result ~= nil and result or "" end function resolvers.expansion(name) - local name = name and lpegmatch(dollarstripper,name) + local name = name and lpegmatch(dollarstripper,name) local result = name and instance.expansions[name] return result ~= nil and result or "" end @@ -745,7 +735,7 @@ end local done = { } -function resolvers.resetextrapath() +function resolvers.resetextrapaths() local ep = instance.extra_paths if not ep then done = { } @@ -756,6 +746,10 @@ function resolvers.resetextrapath() end end +function resolvers.getextrapaths() + return instance.extra_paths or { } +end + function resolvers.registerextrapath(paths,subpaths) if not subpaths or subpaths == "" then if not paths or path == "" then @@ -932,11 +926,7 @@ function resolvers.cleanedpathlist(v) -- can be cached if needed end function resolvers.expandbraces(str) -- output variable and brace expansion of STRING --- local ori = resolvers.variable(str) --- if ori == "" then - local ori = str --- end - local pth = expandedpathfromlist(resolvers.splitpath(ori)) + local pth = expandedpathfromlist(resolvers.splitpath(str)) return joinpath(pth) end @@ -951,6 +941,20 @@ function resolvers.registerfilehash(name,content,someerror) end end +function resolvers.getfilehashes() + return instance and instance.files or { } +end + +function resolvers.gethashes() + return instance and instance.hashes or { } +end + +function resolvers.renewcache() + if instance then + instance.renewcache = true + end +end + local function isreadable(name) local readable = isfile(name) -- not file.is_readable(name) asit can be a dir if trace_detail then @@ -968,7 +972,7 @@ end local function collect_files(names) -- potential files .. sort of too much when asking for just one file local filelist = { } -- but we need it for pattern matching later on local noffiles = 0 - local function check(hash,root,pathname,path,name) + local function check(hash,root,pathname,path,basename,name) if not pathname or find(path,pathname) then local variant = hash.type local search = filejoin(root,path,name) -- funny no concatinator @@ -1007,10 +1011,10 @@ local function collect_files(names) -- potential files .. sort of too much when local metadata = content.metadata local realroot = metadata and metadata.path or hashname if type(path) == "string" then - check(hash,realroot,pathname,path,name) + check(hash,realroot,pathname,path,basename,name) else for i=1,#path do - check(hash,realroot,pathname,path[i],name) + check(hash,realroot,pathname,path[i],basename,name) end end end @@ -1029,18 +1033,29 @@ function resolvers.registerintrees(filename,format,filetype,usedmethod,foundname if usedmethod == "direct" and filename == foundname and fit[foundname] then -- just an extra lookup after a test on presence else + local collapsed = collapsepath(foundname,true) local t = { filename = filename, - format = format ~= "" and format or nil, + format = format ~= "" and format or nil, filetype = filetype ~= "" and filetype or nil, usedmethod = usedmethod, foundname = foundname, + fullname = collapsed, } fit[foundname] = t foundintrees[#foundintrees+1] = t end end +function resolvers.foundintrees() + return instance.foundintrees or { } +end + +function resolvers.foundintree(fullname) + local f = fit[fullname] + return f and f.usedmethod == "database" +end + -- split the next one up for readability (but this module needs a cleanup anyway) local function can_be_dir(name) -- can become local @@ -1062,15 +1077,17 @@ local preparetreepattern = Cs((P(".")/"%%." + P("-")/"%%-" + P(1))^0 * Cc("$")) local collect_instance_files local function find_analyze(filename,askedformat,allresults) - local filetype, wantedfiles, ext = '', { }, suffixonly(filename) + local filetype = '' + local filesuffix = suffixonly(filename) + local wantedfiles = { } -- too tricky as filename can be bla.1.2.3: -- - -- if not suffixmap[ext] then + -- if not suffixmap[filesuffix] then -- wantedfiles[#wantedfiles+1] = filename -- end wantedfiles[#wantedfiles+1] = filename if askedformat == "" then - if ext == "" or not suffixmap[ext] then + if filesuffix == "" or not suffixmap[filesuffix] then local defaultsuffixes = resolvers.defaultsuffixes local formatofsuffix = resolvers.formatofsuffix for i=1,#defaultsuffixes do @@ -1088,7 +1105,7 @@ local function find_analyze(filename,askedformat,allresults) end end else - if ext == "" or not suffixmap[ext] then + if filesuffix == "" or not suffixmap[filesuffix] then local format_suffixes = suffixes[askedformat] if format_suffixes then for i=1,#format_suffixes do @@ -1160,11 +1177,10 @@ local function find_qualified(filename,allresults,askedformat,alsostripped) -- t if alsostripped and suffix and suffix ~= "" then -- try to find in tree (no suffix manipulation), here we search for the -- matching last part of the name - local basename = filebasename(filename) - local pattern = lpegmatch(preparetreepattern,filename) - -- messy .. to be sorted out + local basename = filebasename(filename) + local pattern = lpegmatch(preparetreepattern,filename) local savedformat = askedformat - local format = savedformat or "" + local format = savedformat or "" if format == "" then askedformat = resolvers.formatofsuffix(suffix) end @@ -1269,7 +1285,7 @@ end local function find_intree(filename,filetype,wantedfiles,allresults) local pathlists = instance.pathlists if not pathlists then - pathlists = setmetatableindex(allocate(),makepathlist) + pathlists = setmetatableindex({ },makepathlist) instance.pathlists = pathlists end local pathlist = pathlists[filetype] @@ -1588,9 +1604,9 @@ function resolvers.findpath(filename,filetype) end local function findgivenfiles(filename,allresults) - local base = filebasename(filename) - local result = { } - local hashes = instance.hashes + local base = filebasename(filename) + local result = { } + local hashes = instance.hashes -- local function okay(hash,path,name) local found = methodhandler('concatinators',hash.type,hash.name,path,name) @@ -1645,12 +1661,12 @@ end -- why bother local function findwildcardfiles(filename,allresults,result) - local result = result or { } - local base = filebasename(filename) - local dirn = filedirname(filename) - local path = lower(lpegmatch(makewildcard,dirn) or dirn) - local name = lower(lpegmatch(makewildcard,base) or base) - local files = instance.files + local result = result or { } + local base = filebasename(filename) + local dirn = filedirname(filename) + local path = lower(lpegmatch(makewildcard,dirn) or dirn) + local name = lower(lpegmatch(makewildcard,base) or base) + local files = instance.files -- if find(name,"*",1,true) then local hashes = instance.hashes @@ -1736,15 +1752,23 @@ function resolvers.automount() -- implemented later end -function resolvers.load(option) +function resolvers.starttiming() statistics.starttiming(instance) +end + +function resolvers.stoptiming() + statistics.stoptiming(instance) +end + +function resolvers.load(option) + resolvers.starttiming() identify_configuration_files() load_configuration_files() if option ~= "nofiles" then load_databases() resolvers.automount() end - statistics.stoptiming(instance) + resolvers.stoptiming() local files = instance.files return files and next(files) and true end @@ -1851,7 +1875,6 @@ function resolvers.booleanvariable(str,default) end function resolvers.dowithfilesintree(pattern,handle,before,after) -- will move, can be a nice iterator instead - local instance = resolvers.instance local hashes = instance.hashes for i=1,#hashes do local hash = hashes[i] @@ -1891,3 +1914,31 @@ resolvers.obsolete = obsolete resolvers.find_file = resolvers.findfile obsolete.find_file = resolvers.findfile resolvers.find_files = resolvers.findfiles obsolete.find_files = resolvers.findfiles + +-- moved here + +function resolvers.knownvariables(pattern) + if instance then + local environment = instance.environment + local variables = instance.variables + local expansions = instance.expansions + local order = instance.order + local pattern = upper(pattern or "") + local result = { } + for i=1,#order do + for key in next, order[i] do + if result[key] == nil and key ~= "" and (pattern == "" or find(upper(key),pattern)) then + result[key] = { + environment = rawget(environment,key), + variable = key, + expansion = expansions[key], + resolved = resolveprefix(expansions[key]), + } + end + end + end + return result + else + return { } + end +end diff --git a/tex/context/base/mkiv/data-sch.lua b/tex/context/base/mkiv/data-sch.lua index 23ecdc122..2e880e997 100644 --- a/tex/context/base/mkiv/data-sch.lua +++ b/tex/context/base/mkiv/data-sch.lua @@ -6,7 +6,7 @@ if not modules then modules = { } end modules ['data-sch'] = { license = "see context related readme files" } -local load = load +local load, tonumber = load, tonumber local gsub, concat, format = string.gsub, table.concat, string.format local finders, openers, loaders = resolvers.finders, resolvers.openers, resolvers.loaders @@ -16,6 +16,8 @@ local report_schemes = logs.reporter("resolvers","schemes") local http = require("socket.http") local ltn12 = require("ltn12") +if mbox then mbox = nil end -- useless and even bugged (helper overwrites lib) + local resolvers = resolvers local schemes = resolvers.schemes or { } resolvers.schemes = schemes @@ -70,7 +72,7 @@ local runner = sandbox.registerrunner { name = "curl resolver", method = "execute", program = "curl", - template = "--silent -- insecure --create-dirs --output %cachename% %original%", + template = "--silent --insecure --create-dirs --output %cachename% %original%", checkers = { cachename = "cache", original = "url", @@ -149,7 +151,7 @@ local function http_handler(specification,cachename) local tempname = cachename .. ".tmp" local f = io.open(tempname,"wb") local status, message = http.request { - url = specification.original, + url = specification.original, sink = ltn12.sink.file(f) } if not status then diff --git a/tex/context/base/mkiv/data-tex.lua b/tex/context/base/mkiv/data-tex.lua index b6b97a0a9..2d2c9b24d 100644 --- a/tex/context/base/mkiv/data-tex.lua +++ b/tex/context/base/mkiv/data-tex.lua @@ -57,6 +57,33 @@ resolvers.inputstack = resolvers.inputstack or { } local inputstack = resolvers.inputstack +---------------------------------------- + +local lpegmatch = lpeg.match +local newline = lpeg.patterns.newline +local tsplitat = lpeg.tsplitat + +local linesplitters = { + tsplitat(newline), -- default since we started + tsplitat(lpeg.S(" ")^0 * newline), + tsplitat(lpeg.S(" \t")^0 * newline), + tsplitat(lpeg.S(" \f\t")^0 * newline), -- saves a bit of space at the cost of runtime + -- tsplitat(lpeg.S(" \v\f\t")^0 * newline), + -- tsplitat(lpeg.R("\0\31")^0 * newline), +} + +local linesplitter = linesplitters[1] + +directives.register("system.linesplitmethod",function(v) + linesplitter = linesplitters[tonumber(v) or 1] or linesplitters[1] +end) + +local function splitlines(str) + return lpegmatch(linesplitter,str) +end + +----------------------------------------- + function helpers.textopener(tag,filename,filehandle,coding) local lines local t_filehandle = type(filehandle) diff --git a/tex/context/base/mkiv/data-tmp.lua b/tex/context/base/mkiv/data-tmp.lua index eabfce96e..948827161 100644 --- a/tex/context/base/mkiv/data-tmp.lua +++ b/tex/context/base/mkiv/data-tmp.lua @@ -28,6 +28,7 @@ local concat = table.concat local mkdirs, isdir, isfile = dir.mkdirs, lfs.isdir, lfs.isfile local addsuffix, is_writable, is_readable = file.addsuffix, file.is_writable, file.is_readable local formatters = string.formatters +local next, type = next, type local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end) local trace_cache = false trackers.register("resolvers.cache", function(v) trace_cache = v end) @@ -190,7 +191,7 @@ function caches.usedpaths(separator) end function caches.configfiles() - return concat(resolvers.instance.specification,";") + return concat(resolvers.configurationfiles(),";") end function caches.hashed(tree) diff --git a/tex/context/base/mkiv/data-use.lua b/tex/context/base/mkiv/data-use.lua index 930c5739f..ff25c803a 100644 --- a/tex/context/base/mkiv/data-use.lua +++ b/tex/context/base/mkiv/data-use.lua @@ -24,7 +24,7 @@ function resolvers.automount(usecache) mountpaths = caches.getreadablepaths("mount") end if mountpaths and #mountpaths > 0 then - statistics.starttiming(resolvers.instance) + resolvers.starttiming() for k=1,#mountpaths do local root = mountpaths[k] local f = io.open(root.."/url.tmi") @@ -45,7 +45,7 @@ function resolvers.automount(usecache) f:close() end end - statistics.stoptiming(resolvers.instance) + resolvers.stoptiming() end end @@ -65,6 +65,7 @@ function statistics.savefmtstatus(texname,formatbanner,sourcefile,kind,banner) - formatbanner = formatbanner, sourcehash = md5.hex(io.loaddata(resolvers.findfile(sourcefile)) or "unknown"), sourcefile = sourcefile, + luaversion = LUAVERSION, } io.savedata(luvname,table.serialize(luvdata,true)) lua.registerfinalizer(function() @@ -94,6 +95,10 @@ function statistics.checkfmtstatus(texname) if luvhash ~= sourcehash then return format("source mismatch (luv: %s <> bin: %s)",luvhash,sourcehash) end + local luvluaversion = luv.luaversion or 0 + if luvluaversion ~= LUAVERSION then + return format("lua mismatch (luv: %s <> bin: %s)",luvluaversion,LUAVERSION) + end else return "invalid status file" end diff --git a/tex/context/base/mkiv/data-zip.lua b/tex/context/base/mkiv/data-zip.lua index 2be88e0fc..32666bef2 100644 --- a/tex/context/base/mkiv/data-zip.lua +++ b/tex/context/base/mkiv/data-zip.lua @@ -203,17 +203,16 @@ function resolvers.usezipfile(archive) if archive and not registeredfiles[archive] then local z = zip.openarchive(archive) if z then - local instance = resolvers.instance local tree = url.query(specification.query).tree or "" if trace_locating then report_zip("registering: archive %a",archive) end - statistics.starttiming(instance) + resolvers.starttiming() resolvers.prependhash('zip',archive) resolvers.extendtexmfvariable(archive) -- resets hashes too registeredfiles[archive] = z - instance.files[archive] = resolvers.registerzipfile(z,tree) - statistics.stoptiming(instance) + resolvers.registerfilehash(archive,resolvers.registerzipfile(z,tree)) + resolvers.stoptiming() elseif trace_locating then report_zip("registering: unknown archive %a",archive) end diff --git a/tex/context/base/mkiv/enco-ini.mkiv b/tex/context/base/mkiv/enco-ini.mkiv index 50375251a..f78643975 100644 --- a/tex/context/base/mkiv/enco-ini.mkiv +++ b/tex/context/base/mkiv/enco-ini.mkiv @@ -537,10 +537,39 @@ \hbox\bgroup \enco_periods_nop} +%D Was missing: + +\unexpanded\def\ampersand{\mathortext\mathampersand\textampersand} + %D Left-overs: \appendtoks \let\buildtextaccent\secondoftwoarguments \to \everysimplifycommands +%D A plain one: + +% \unexpanded\def\t#1{% +% \dontleavehmode +% \begingroup +% \setbox\scratchboxone\hpack{#1}% +% \setbox\scratchboxtwo\hpack\bgroup +% \iffontchar\font"0361\relax +% \char"0361\relax +% \else +% \iffontchar\font"2040\relax\else +% \the\textfont0 +% \fi +% \char"2040 +% \fi +% \egroup +% \scratchdimenone\wd\ifdim\wd\scratchboxone>\wd\scratchboxtwo\scratchboxone\else\scratchboxtwo\fi +% \scratchdimentwo\dimexpr-\ht\scratchboxtwo+\ht\scratchboxone+.45\exheight\relax +% \hpack to \scratchdimenone\bgroup +% \hpack to \scratchdimenone{\hss\box\scratchboxone\hss}% +% \hskip -\scratchdimenone +% \hpack to \scratchdimenone{\hss\raise\scratchdimentwo\box\scratchboxtwo\hss}% +% \egroup +% \endgroup} + \protect \endinput diff --git a/tex/context/base/mkiv/export-example.css b/tex/context/base/mkiv/export-example.css index 8c7ae3bfc..812873afc 100644 --- a/tex/context/base/mkiv/export-example.css +++ b/tex/context/base/mkiv/export-example.css @@ -28,6 +28,8 @@ context|div.figure { } *[chain~='figure'] { } context|div.figure.myfloatb { } *[chain~='figure'][detail='myfloatb'] { } + Inheritance when using div seems to be stronger so we need to take more precautions. + */ @namespace context url('http://www.pragma-ade.com/context/export') ; @@ -35,35 +37,42 @@ /* ignore : mixed */ /* metadata: display */ -ignore, context|div.ignore { +ignore, +context|div.ignore { display : none ; } -ignore, context|div.private { +ignore, +context|div.private { display : none ; } -xmetadata, context|div.xmetadata { +xmetadata, +context|div.xmetadata { display : none ; } -xmetavariable, context|div.xmetavariable { +xmetavariable, +context|div.xmetavariable { display : none ; } /* document : display */ -document:before, context|div.document:before { +document:before, +context|div.document:before { content : attr(title) ; font-size : 44pt ; font-weight : bold ; margin-bottom : 1em ; } -document, context|div.document { +document, +context|div.document { font-family : "DejaVu Serif", "Lucida Bright", serif ; font-size : 12pt ; - line-height : 14.4pt; + /* line-height : 14.4pt; */ + line-height : 2.8ex; max-width : 50em ; padding : 1em ; /* text-align : justify ; */ @@ -72,35 +81,59 @@ document, context|div.document { /* text-justify : inter-word ; */ } -document>metadata, context|div.document context|div.metadata { +document>metadata, +context|div.document context|div.metadata { font-family : "DejaVu Sans Mono", "Lucida Console", monospace ; - margin-bottom : 2em ; + margin-bottom : 3ex ; } -document>metadata>metavariable[name="title"]:before, - context|div.document context|div.metadata context|div.metavariable.name-title:before { - content : "title\00A0\00A0\00A0:\00A0" ; +/* + document>metadata>metavariable[name="X"]:before, + context|div.document context|div.metadata context|div.metavariable.metaname-X:before { + content : "X\00A0\00A0\00A0:\00A0" ; + } +*/ + +document>metadata, +context|div.document context|div.metadata { + display : flex ; + flex-flow : column ; } -document>metadata>metavariable[name="author"]:before, - context|div.document context|div.metadata context|div.metavariable.name-author:before { - content : "author\00A0\00A0:\00A0" ; +document>metadata>metavariable:before, +context|div.document context|div.metadata context|div.metavariable:before { + display : inline ; + content : attr(label); + width : 8em ; + float : left ; + font-weight : bold ; } -document>metadata>metavariable[name="version"]:before, - context|div.document context|div.metadata context|div.metavariable.name-version:before { - content : "version\00A0:\00A0" ; +document>metadata>metavariable[name="title"], +context|div.document context|div.metadata context|div.metavariable.metaname-title { + order : -1 ; + display : block ; + width : 50em ; + float : left ; + font-family : "DejaVu Serif", "Lucida Bright", serif ; + font-weight : bold ; + font-size : 3em ; + text-align : left ; + margin-bottom : 2ex ; } -document>metadata>metavariable[name="title"], document>metadata>metavariable[name="author"], document>metadata>metavariable[name="version"], - context|div.document context|div.metadata context|div.metavariable.name-title, context|div.document context|div.metadata context|div.metavariable.name-author, context|div.document context|div.metadata context|div.metavariable.name-version { - display : block ; +document>metadata>metavariable[name="title"]:before, +context|div.document context|div.metadata context|div.metavariable.metaname-title:before { + content : none ; } /* paragraph : mixed */ /* p : mixed */ -paragraph, p, context|div.paragraph, context|div.p { +paragraph, +p, +context|div.paragraph, +context|div.p { display : block ; margin-top : 0.5em ; margin-bottom : 0.5em ; @@ -108,7 +141,8 @@ paragraph, p, context|div.paragraph, context|div.p { /* break : display */ -break, context|div.break { +break, +context|div.break { display : block ; margin-bottom : 0.5em ; } @@ -116,14 +150,17 @@ break, context|div.break { /* construct : inline */ /* highlight : inline */ -construct, context|div.construct { +construct, +context|div.construct { } -construct[detail="important"], context|div.construct.important { +construct[detail="important"], +context|div.construct.important { font-weight : bold ; } -highlight, context|div.highlight { /* todo: style and color */ +highlight, +context|div.highlight { /* todo: style and color */ display : inline ; } @@ -132,95 +169,167 @@ highlight, context|div.highlight { /* todo: style and color */ /* sectionnumber : mixed */ /* sectioncontent : display */ -section, context|div.section { +section, +context|div.section { display : block ; } -sectioncontent, context|div.sectioncontent { - display : block ; - margin-top : 1em ; - margin-bottom : 1em ; +sectioncaption, +context|div.sectioncaption { + display : block ; + text-align : left ; + page-break-after : avoid ; + margin-top : 3ex ; + margin-bottom : 2ex ; } -section[detail="chapter"], section[detail="title"], - context|div.section.chapter, context|div.section.title { - page-break-before : always ; - page-break-after : avoid ; - margin-top : 3em ; - margin-bottom : 2em ; +sectioncontent, +context|div.sectioncontent { + display : block ; } -section[detail="section"], section[detail="subject"], - context|div.section.section, context|div.section.subject { - page-break-after : avoid ; - margin-top : 2.5em ; - margin-bottom : 2.5em ; +sectionnumber, +context|div.sectionnumber { + display : inline ; + margin-right : 1em ; } -section[detail="subsection"], section[detail="subsubject"], - context|div.section.subsection, context|div.section.subsubject { - page-break-after : avoid ; - margin-top : 2em ; - margin-bottom : 2em ; +sectionnumber, +context|div.sectiontitle { + display : inline ; } -section[detail="subsubsection"], section[detail="subsubsubject"], - context|div.section.subsubsection, context|div.section.subsubsubject { - page-break-after : avoid ; - margin-top : 1em ; - margin-bottom : 0em ; +/* we need to use level as selector because section is used twice */ + +/* chapter | title */ + +section[detail="chapter"]>sectioncaption, +section[detail="title"]>sectioncaption, +context|div.level-2.chapter context|div.sectioncaption , +context|div.level-2.title context|div.sectioncaption { + font-size : 2em ; + font-weight : bold ; } -section[detail="summary"], section[detail="subsummary"], - context|div.section.summary, context|div.section.subsummary { - margin-top : 1em ; - margin-bottom : 1em ; +section[detail="chapter"], +section[detail="title"], +context|div.level-2.chapter, +context|div.level-2.title { + page-break-before : always ; + margin-top : 4ex ; } -section[detail="chapter"]>sectionnumber, - context|div.section.chapter context|div.sectionnumber { - display : inline-block ; - margin-right : 1em ; - font-size : 3em ; - font-weight : bold ; +section[detail="chapter"]>sectioncaption>sectionnumber, +context|div.level-2.chapter context|div.sectioncaption context|div.sectionnumber { + /* nothing */ } -section[detail="chapter"]>sectiontitle, section[detail="title"]>sectiontitle, - context|div.section.chapter context|div.sectiontitle, context|div.section.title context|div.sectiontitle { - display : inline-block ; - font-size : 3em ; - font-weight : bold ; +section[detail="chapter"]>sectioncaption>sectiontitle, +section[detail="title"]>sectioncaption>sectiontitle, +context|div.level-2.chapter context|div.sectioncaption context|div.sectiontitle, +context|div.level-2.title context|div.sectioncaption context|div.sectiontitle { + /* nothing */ } -section[detail="section"]>sectiontitle, section[detail="subject"]>sectiontitle, - context|div.section.section context|div.sectiontitle, context|div.section.subject context|div.sectiontitle { - display : inline-block ; - font-size : 2.5em ; +/* section | subject */ + +section[detail="section"]>sectioncaption, +section[detail="subject"]>sectioncaption, +context|div.level-3.section context|div.sectioncaption, +context|div.level-3.subject context|div.sectioncaption { + font-size : 1.75em ; font-weight : bold ; } -section[detail="subsection"]>sectiontitle, section[detail="subsubject"]>sectiontitle, - context|div.section.subsection context|div.sectiontitle, context|div.section.subsubject context|div.sectiontitle { - display : inline-block ; - font-size : 2em ; +section[detail="section"], +section[detail="subject"], +context|div.level-3.section, +context|div.level-3.subject { + /* nothing */ +} + +section[detail="section"]>sectioncaption>sectionnumber, +context|div.level-3.section context|div.sectioncaption context|div.sectionnumber { + /* nothing */ +} + +section[detail="section"]>sectioncaption>sectiontitle, +section[detail="subject"]>sectioncaption>sectiontitle, +context|div.level-3.section context|div.sectioncaption context|div.sectiontitle, +context|div.level-3.subject context|div.sectioncaption context|div.sectiontitle { + /* nothing */ +} + +/* subsection | subsubject */ + +section[detail="subsection"]>sectioncaption, +section[detail="subsubject"]>sectioncaption, +context|div.level-4.subsection context|div.sectioncaption, +context|div.level-4.subsubject context|div.sectioncaption { + font-size : 1.5em ; font-weight : bold ; } -section[detail="subsubsection"]>sectiontitle, section[detail="subsubsubject"]>sectiontitle, - context|div.section.subsubsection context|div.sectiontitle, context|div.section.subsubsubject context|div.sectiontitle { - display : inline-block ; - font-size : 1em ; +section[detail="subsection"], +section[detail="subsubject"], +context|div.level-4.subsection, +context|div.level-4.subsubject { + /* nothing */ +} + +section[detail="subsection"]>sectioncaption>sectionnumber, +context|div.level-4.subsection context|div.sectioncaption context|div.sectionnumber { + /* nothing */ +} + +section[detail="subsection"]>sectioncaption>sectiontitle, +section[detail="subsubject"]>sectioncaption>sectiontitle, +context|div.level-4.subsection context|div.sectioncaption context|div.sectiontitle, +context|div.level-4.subsubject context|div.sectioncaption context|div.sectiontitle { + /* nothing */ +} + +/* subsubsection | subsubsubject */ + +section[detail="subsubsection"]>sectioncaption, +section[detail="subsubsubject"]>sectioncaption, +context|div.level-5.subsubsection context|div.sectioncaption, +context|div.level-5.subsubsubject context|div.sectioncaption { + font-size : 1.25em ; font-weight : bold ; } -section[detail="section"]>sectionnumber, context|div.section.section context|div.sectionnumber { - display : inline-block ; - margin-right : 1em ; - font-size : 2.5em ; - font-weight : bold ; +section[detail="subsubsection"], +section[detail="subsubsubject"], +context|div.level-5.subsubsection, +context|div.level-5.subsubsubject { + /* nothing */ +} + +section[detail="subsubsection"]>sectioncaption>sectionnumber, +context|div.level-5.subsubsection context|div.sectioncaption context|div.sectionnumber { + /* nothing */ +} + +section[detail="subsubsection"]>sectioncaption>sectiontitle, +section[detail="subsubsubject"]>sectioncaption>sectiontitle, +context|div.level-5.subsubsection context|div.sectioncaption context|div.sectiontitle, +context|div.level-5.subsubsubject context|div.sectioncaption context|div.sectiontitle { + /* nothing */ +} + +/* summary | subsummary*/ + +section[detail="summary"], +section[detail="subsummary"], +context|div.section.summary, +context|div.section.subsummary { + margin-top : 1em ; + margin-bottom : 1em ; } -section[detail="summary"]>sectiontitle, context|div.section.summary context|div.sectiontitle { +section[detail="summary"]>sectioncaption>sectiontitle, +context|div.section.summary context|div.sectioncaption context|div.sectiontitle { display : block ; margin-top : 1em ; margin-bottom : 1em ; @@ -228,16 +337,11 @@ section[detail="summary"]>sectiontitle, context|div.section.summary context|div. border-bottom-style : solid ; border-color : rgb(50%,50%,100%) ; border-width : .15em; + text-align : left ; } -section[detail="subsection"]>sectionnumber, context|div.section.subsection context|div.sectionnumber { - display : inline-block ; - margin-right : 1em ; - font-size : 1em ; - font-weight : bold ; -} - -section[detail="subsummary"]>sectiontitle, context|div.section.subsummary context|div.sectiontitle { +section[detail="subsummary"]>sectioncaption>sectiontitle, +context|div.section.subsummary context|div.sectioncaption context|div.sectiontitle { display : block ; margin-top : 1em ; margin-bottom : 1em ; @@ -245,6 +349,7 @@ section[detail="subsummary"]>sectiontitle, context|div.section.subsummary contex border-color : rgb(50%,50%,100%) ; border-bottom-style : dotted ; border-width : .15em ; + text-align : left ; } /* itemgroup : display */ @@ -265,7 +370,8 @@ section[detail="subsummary"]>sectiontitle, context|div.section.subsummary contex glyphs : 'Α' 'B' 'Γ' 'Δ' 'Ε' 'Ζ' 'Η' 'Θ' 'Ι' 'Κ' 'Λ' 'Μ' 'Ν' 'Ξ' 'Ο' 'Π' 'Ρ' 'Σ' 'Τ' 'Υ' 'Φ' 'Χ' 'Ψ' 'Ω' ; } -itemgroup, context|div.itemgroup { +itemgroup, +context|div.itemgroup { display : block ; margin-bottom : 0.5em ; margin-top : 0.5em ; @@ -284,18 +390,21 @@ itemgroup[symbol="n"], context|div.itemgroup.symbol-n { list-style-type : decima itemgroup[symbol="g"], context|div.itemgroup.symbol-g { list-style-type : lower-greek ; } itemgroup[symbol="G"], context|div.itemgroup.symbol-G { list-style-type : upper-greek ; } -item, context|div.item { +item, +context|div.item { display : list-item ; margin-left : 1em ; margin-bottom : 0.5em ; margin-top : 0.5em ; } -itemtag, context|div.item { +itemtag, +context|div.item { display: none ; } -itemcontent, context|div.itemcontent { +itemcontent, +context|div.itemcontent { } /* description : display */ @@ -303,13 +412,15 @@ itemcontent, context|div.itemcontent { /* descriptioncontent : mixed */ /* descriptionsymbol : inline */ -description, context|div.description { +description, +context|div.description { display : block ; margin-bottom : 1em ; margin-top : 1em ; } -descriptiontag, context|div.descriptiontag { +descriptiontag, +context|div.descriptiontag { display : inline ; float : left ; clear : left ; @@ -318,10 +429,12 @@ descriptiontag, context|div.descriptiontag { font-weight : bold ; } -descriptioncontent, context|div.descriptioncontent { +descriptioncontent, +context|div.descriptioncontent { } -descriptionsymbol, context|div.descriptionsymbol { +descriptionsymbol, +context|div.descriptionsymbol { display : inline ; } @@ -330,7 +443,8 @@ descriptionsymbol, context|div.descriptionsymbol { /* verbatimline : mixed */ /* verbatim : inline */ -verbatimblock, context|div.verbatimblock { +verbatimblock, +context|div.verbatimblock { background-color : rgb(50%,50%,100%) ; display : block ; padding : 1em ; @@ -339,17 +453,20 @@ verbatimblock, context|div.verbatimblock { font-family : "DejaVu Sans Mono", "Lucida Console", monospace ; } -verbatimlines+verbatimlines, context|div.verbatimlines+context|div.verbatimlines { +verbatimlines+verbatimlines, +context|div.verbatimlines+context|div.verbatimlines { display : block ; margin-top : 1em ; } -verbatimline, context|div.verbatimline { +verbatimline, +context|div.verbatimline { display : block ; white-space : pre-wrap ; } -verbatim, context|div.verbatim { +verbatim, +context|div.verbatim { display : inline ; white-space : pre-wrap ; color : rgb(60%,60%,0%) ; @@ -359,18 +476,21 @@ verbatim, context|div.verbatim { /* lines : display */ /* line : mixed */ -lines, context|div.lines { +lines, +context|div.lines { display : block ; margin-bottom : 1em ; margin-top : 1em ; } -lines+lines, context|div.lines+context|div.lines { +lines+lines, +context|div.lines+context|div.lines { display : block ; margin-top : 1em ; } -line, context|div.line { +line, +context|div.line { display : block ; white-space : pre-wrap ; } @@ -378,7 +498,10 @@ line, context|div.line { /* synonym : inline */ /* sorting : inline */ -sorting, synonym, context|div.sorting, context|div.synonym { +sorting, +synonym, +context|div.sorting, +context|div.synonym { display : inline ; font-variant : small-caps ; } @@ -393,15 +516,18 @@ sorting, synonym, context|div.sorting, context|div.synonym { /* registerpage : inline */ /* registerpagerange : mixed */ -register, context|div.register { +register, +context|div.register { display: none ; } -registerlocation, context|div.registerlocation { +registerlocation, +context|div.registerlocation { display: inline ; } -registerlocation:after, context|div.registerlocation:after { +registerlocation:after, +context|div.registerlocation:after { content : "\25B6\00A0\00A0" ; color : rgb(40%,40%,40%) ; font-size : x-small ; @@ -414,33 +540,39 @@ registerlocation:after, context|div.registerlocation:after { /* tablerow : display */ /* tablecell : mixed */ -table, context|div.table { +table, +context|div.table { display : table ; } -tablerow, context|div.tablerow { +tablerow, +context|div.tablerow { display : table-row ; } -tablecell[align="middle"], context|div.tablecell.align-middle { +tablecell[align="middle"], +context|div.tablecell.align-middle { display : table-cell ; text-align : center ; padding : .1em ; } -tablecell[align="flushleft"], context|div.tablecell.align-flushleft { +tablecell[align="flushleft"], +context|div.tablecell.align-flushleft { display : table-cell ; text-align : left ; padding : .1em ; } -tablecell[align="flushright"], context|div.tablecell.align-flushright { +tablecell[align="flushright"], +context|div.tablecell.align-flushright { display : table-cell ; text-align : right ; padding : .1em ; } -tablecell, context|div.tablecell { +tablecell, +context|div.tablecell { display : table-cell ; text-align : left ; padding : .1em ; @@ -450,73 +582,97 @@ tablecell, context|div.tablecell { /* tabulaterow : display */ /* tabulatecell : mixed */ -tabulate, context|div.tabulate { +tabulate, +context|div.tabulate { display : table ; margin-top : 1em ; margin-bottom : 1em ; margin-left : 2.5em ; } -floatcontent>tabulate, context|div.floatcontent context|div.tabulate { +floatcontent>tabulate, +context|div.floatcontent context|div.tabulate { margin-left : 0em ; } -tabulaterow, context|div.tabulaterow { +tabulaterow, +context|div.tabulaterow { display : table-row ; } -tabulatecell[align="middle"], context|div.tabulatecell.align-middle { +tabulatecell[align="middle"], +context|div.tabulatecell.align-middle { display : table-cell ; text-align : center ; padding-right : 1em ; } -tabulatecell[align="flushleft"], context|div.tabulatecell.align-flushleft { +tabulatecell[align="flushleft"], +context|div.tabulatecell.align-flushleft { display : table-cell ; text-align : left ; padding-right : 1em ; } -tabulatecell[align="flushright"], context|div.tabulatecell.align-flushright { +tabulatecell[align="flushright"], +context|div.tabulatecell.align-flushright { display : table-cell ; text-align : right ; padding-right : 1em ; } -tabulatecell, context|div.tabulatecell { +tabulatecell, +context|div.tabulatecell { display : table-cell ; text-align : left ; padding-right : 1em ; } +tabulatecell[kind="strong"], +context|div.tabulatecell.kind-strong { + font-weight : bold ; +} + +tabulatecell[kind="equals"]:before, +context|div.tabulatecell.kind-equals:before { + display : inline-block ; + clear : left ; + margin-left : -.6em ; + width : .6em ; + content : ":" ; +} + /* combination : display */ /* combinationpair : display */ /* combinationcontent : mixed */ /* combinationcaption : mixed */ -combination, context|div.combination { +combination, +context|div.combination { display : table ; margin-top : 0em ; margin-bottom : 0em ; } -combinationpair, context|div.combinationpair { +combinationpair, +context|div.combinationpair { display : table-cell ; padding-right : 1em ; } -combinationcontent, context|div.combinationcontent { +combinationcontent, +context|div.combinationcontent { display : table-row ; text-align : center ; } -combinationcaption, context|div.combinationcaption { +combinationcaption, +context|div.combinationcaption { display : table-row ; padding-top : 1ex ; text-align : center ; } - /* list : display */ /* listitem : display */ /* listtag : mixed */ @@ -524,39 +680,81 @@ combinationcaption, context|div.combinationcaption { /* listdata : mixed */ /* listpage : mixed */ -list, context|div.list { - display : block ; +list, +context|div.list { + display : block ; + text-align : left ; } -listitem[detail="chapter"], context|div.listitem.chapter { +listitem[detail="chapter"], +context|div.listitem.chapter { display : block ; margin-top : 1em ; + margin-left : 5em ; font-weight : bold ; } -listitem[detail="section"], context|div.listitem.section { - display : block ; +listitem[detail="section"], +context|div.listitem.section { + display : block ; + margin-left : 5em ; } -listitem[detail="subsection"], context|div.listitem.subsection { - display : block ; - display : inline-block ; +listitem[detail="subsection"], +context|div.listitem.subsection { + display : block ; + margin-left : 5em ; } -listtag, context|div.listtag { - display : inline-block ; - width : 5em ; +/* +listitem[detail="subsection"], +context|div.listitem.subsection { + display : inline-block ; + margin-left : -5em ; } -listcontent, context|div.listcontent { - display : inline-block ; +listitem[detail="subsection"]>listtag, +context|div.listitem.subsection context|div.listtag { + margin-right : 1em ; } +*/ -listdata, context|div.listdata { - display : inline-block ; +listitem[detail="chapter"]>listtag, +context|div.listitem.chapter context|div.listtag { + display : inline-block ; + margin-left : -5em ; + float : left ; + clear : left ; +} + +listitem[detail="section"]>listtag, +context|div.listitem.section context|div.listtag { + display : inline-block ; + margin-left : -5em ; + float : left ; + clear : left ; +} + +listitem[detail="subsection"]>listtag, +context|div.listitem.subsection context|div.listtag { + display : inline-block ; + margin-left : -5em ; + float : left ; + clear : left ; +} + +listcontent, +context|div.listcontent { + display : inline ; +} + +listdata, +context|div.listdata { + display : inline ; } -listpage, context|div.listpage { +listpage, +context|div.listpage { display : none ; } @@ -570,59 +768,77 @@ listpage, context|div.listpage { /* :lang(en) */ -delimited[detail="quotation"]:before, delimitedblock[detail="quotation"]:before, - context|div.delimited.quotation:before, context|div.delimitedblock.quotation:before { +delimited[detail="quotation"]:before, +delimitedblock[detail="quotation"]:before, +context|div.delimited.quotation:before, +context|div.delimitedblock.quotation:before { /* content : "\201C" ; */ font-style : italic ; } -delimited[detail="quotation"]:after, delimitedblock[detail="quotation"]:after, - context|div.delimited.quotation:after, context|div.delimitedblock.quotation:after { +delimited[detail="quotation"]:after, +delimitedblock[detail="quotation"]:after, +context|div.delimited.quotation:after, +context|div.delimitedblock.quotation:after { /* content : "\201D" ; */ font-style : italic ; } -delimited[detail="quote"]:before, delimitedblock[detail="quote"]:before, - context|div.delimited.quote:before, context|div.delimitedblock.quote:before { +delimited[detail="quote"]:before, +delimitedblock[detail="quote"]:before, +context|div.delimited.quote:before, +context|div.delimitedblock.quote:before { /* content : "\2018" ; */ font-style : italic ; } -delimited[detail="quote"]:after, delimitedblock[detail="quote"]:after, - context|div.delimited.quote:after, context|div.delimitedblock.quote:after { +delimited[detail="quote"]:after, +delimitedblock[detail="quote"]:after, +context|div.delimited.quote:after, +context|div.delimitedblock.quote:after { /* content : "\2019" ; */ font-style : italic ; } -delimited, context|div.delimited { +delimited, +context|div.delimited { display : inline } -delimitedcontent, context|div.delimitedcontent { +delimitedcontent, +context|div.delimitedcontent { display : inline } -delimitedsymbol, context|div.delimitedsymbol { +delimitedsymbol, +context|div.delimitedsymbol { display : inline } -delimitedblock, context|div.delimitedblock { +delimitedblock, +context|div.delimitedblock { display : block } -subsentence:before, subsentence:after, context|div.subsentence:before, context|div.subsentence:after { +subsentence:before, +subsentence:after, +context|div.subsentence:before, +context|div.subsentence:after { content : "\2014" ; } -subsentence, context|div.subsentence { +subsentence, +context|div.subsentence { display : inline } -subsentencecontent, context|div.subsentencecontent { +subsentencecontent, +context|div.subsentencecontent { display : inline } -subsentencesymbol, context|div.subsentencesymbol { +subsentencesymbol, +context|div.subsentencesymbol { display : inline } @@ -636,36 +852,42 @@ subsentencesymbol, context|div.subsentencesymbol { /* floattext : mixed */ /* floatcontent : mixed */ -float, context|div.float { +float, +context|div.float { display : block ; margin-top : 1em ; margin-bottom : 1em ; margin-left : 2.5em ; } -floatcaption, context|div.floatcaption { +floatcaption, +context|div.floatcaption { display : block ; margin-top : 0.5em ; color : rgb(60%,60%,0%) ; } -floatlabel, context|div.floatlabel { +floatlabel, +context|div.floatlabel { display : inline-block ; font-weight : bold ; margin-right : 0.25em ; } -floatnumber, context|div.floatnumber { +floatnumber, +context|div.floatnumber { display : inline ; font-weight : bold ; margin-right : 0.25em ; } -floattext, context|div.floattext { +floattext, +context|div.floattext { display : inline ; } -floatcontent, context|div.floatcontent { +floatcontent, +context|div.floatcontent { } /* image : mixed */ @@ -679,11 +901,14 @@ floatcontent, context|div.floatcontent { height : 5.994cm ; } */ -mpgraphic:before, context|div.mpgraphic:before { /* does not work with empty element */ +mpgraphic:before, +context|div.mpgraphic:before { + /* does not work with empty element */ content : "[runtime metapost graphic]" ; } -mpgraphic, context|div.mpgraphic { +mpgraphic, +context|div.mpgraphic { display : inline ; } @@ -695,63 +920,73 @@ mpgraphic, context|div.mpgraphic { /* formulanumber : mixed */ /* formulacontent : display */ -formula, context|div.formula { +formula, +context|div.formula { display : block ; margin-top : 1em ; margin-bottom : 1em ; margin-left : 2.5em ; } -subformula, context|div.subformula { /* todo */ +subformula, +context|div.subformula { /* todo */ display : block ; margin-top : 1em ; margin-bottom : 1em ; margin-left : 2.5em ; } -formulaset, context|div.formulaset { /* todo */ +formulaset, +context|div.formulaset { /* todo */ display : block ; margin-top : 1em ; margin-bottom : 1em ; margin-left : 2.5em ; } -formulacaption, context|div.formulacaption { /* todo */ +formulacaption, +context|div.formulacaption { /* todo */ display : block ; margin-top : 0.5em ; color : rgb(60%,60%,0%) ; } -formulalabel, context|div.formulalabel { +formulalabel, +context|div.formulalabel { display : inline ; font-weight : bold ; margin-right : .25em ; } -formulanumber, context|div.formulanumber { +formulanumber, +context|div.formulanumber { display : inline ; font-weight : bold ; } -formulacontent, context|div.formulacontent { +formulacontent, +context|div.formulacontent { display : block ; } -link, context|div.link { +link, +context|div.link { display : inline ; } /* margintextblock : inline */ /* margintext : inline */ -margintext, context|div.margintext { +margintext, +context|div.margintext { display : block ; font-weight : bold ; margin-top : 1em ; margin-bottom : 1em ; } -margintext:before, context|div.margintext:before { +margintext:before, +context|div.margintext:before { content : "\25B6\00A0\00A0" ; color : rgb(40%,40%,40%) ; } @@ -793,15 +1028,18 @@ context|div.math-display { /* unit : inline */ /* number : inline */ -quantity, context|div.quantity { +quantity, +context|div.quantity { display : inline-block ; } -quantity>unit, context|div.quantity>context|div.unit { +quantity>unit, +context|div.quantity>context|div.unit { display : inline ; } -quantity>number, context|div.quantity>context|div.number { +quantity>number, +context|div.quantity>context|div.number { display : inline ; } @@ -809,24 +1047,28 @@ quantity>number, context|div.quantity>context|div.number { /* sup : inline */ /* subsup : inline */ -sup, context|div.sup { +sup, +context|div.sup { display : inline-block ; font-size : xx-small ; vertical-align : super ; } -sub, context|div.sub { +sub, +context|div.sub { display : inline-block ; font-size : xx-small ; vertical-align : sub ; } -subsup>sup, context|div.subsup>context|div.sup { +subsup>sup, +context|div.subsup>context|div.sup { display : inline ; vertical-align : top ; } -subsup>sub, context|div.subsup>context|div.sub { +subsup>sub, +context|div.subsup>context|div.sub { display : inline ; vertical-align : bottom ; } @@ -840,11 +1082,13 @@ context|div[href]:hover { /* setups */ -setup, context|div.setup { +setup, +context|div.setup { display : block ; } -comment, context|div.comment { +comment, +context|div.comment { background-color : rgb(50%,75%,100%) ; display : block ; padding : 1em ; @@ -855,10 +1099,12 @@ comment, context|div.comment { /* special */ -c, context|div.c { +c, +context|div.c { display : inline ; } -warning, context|div.warning { +warning, +context|div.warning { display : none ; } diff --git a/tex/context/base/mkiv/file-ini.mkvi b/tex/context/base/mkiv/file-ini.mkvi index 9f12e9a3b..225b6b40d 100644 --- a/tex/context/base/mkiv/file-ini.mkvi +++ b/tex/context/base/mkiv/file-ini.mkvi @@ -28,7 +28,7 @@ \writestatus{loading}{ConTeXt File Macros / Helpers} -\registerctxluafile{file-ini}{1.001} +\registerctxluafile{file-ini}{} \unprotect diff --git a/tex/context/base/mkiv/file-job.lua b/tex/context/base/mkiv/file-job.lua index c7c36a03f..af15eff56 100644 --- a/tex/context/base/mkiv/file-job.lua +++ b/tex/context/base/mkiv/file-job.lua @@ -9,11 +9,12 @@ if not modules then modules = { } end modules ['file-job'] = { -- in retrospect dealing it's not that bad to deal with the nesting -- and push/poppign at the tex end -local rawget = rawget +local next, rawget, tostring, tonumber = next, rawget, tostring, tonumber local gsub, match, find = string.gsub, string.match, string.find local insert, remove, concat = table.insert, table.remove, table.concat local validstring, formatters = string.valid, string.formatters local sortedhash = table.sortedhash +local setmetatableindex, setmetatablenewindex = table.setmetatableindex, table.setmetatablenewindex local commands = commands local resolvers = resolvers @@ -25,6 +26,7 @@ local implement = interfaces.implement local trace_jobfiles = false trackers.register("system.jobfiles", function(v) trace_jobfiles = v end) +local report = logs.reporter("system") local report_jobfiles = logs.reporter("system","jobfiles") local report_functions = logs.reporter("system","functions") @@ -32,9 +34,6 @@ local texsetcount = tex.setcount local elements = interfaces.elements local constants = interfaces.constants local variables = interfaces.variables -local logsnewline = logs.newline -local logspushtarget = logs.pushtarget -local logspoptarget = logs.poptarget local settings_to_array = utilities.parsers.settings_to_array local allocate = utilities.storage.allocate @@ -55,7 +54,8 @@ local hasscheme = url.hasscheme local jobresolvers = resolvers.jobs local registerextrapath = resolvers.registerextrapath -local resetextrapath = resolvers.resetextrapath +local resetextrapaths = resolvers.resetextrapaths +local getextrapaths = resolvers.getextrapath local pushextrapath = resolvers.pushextrapath local popextrapath = resolvers.popextrapath @@ -147,14 +147,14 @@ implement { name = "resetpath", actions = function() report_jobfiles("resetting path") - resetextrapath() + resetextrapaths() end } implement { name = "allinputpaths", actions = function() - context(concat(resolvers.instance.extra_paths or { },",")) + context(concat(getextrapaths(),",")) end } @@ -170,8 +170,6 @@ implement { end } -local report_system = logs.reporter("system") - -- moved from tex to lua: local texpatterns = { "%s.mkvi", "%s.mkiv", "%s.tex" } @@ -223,7 +221,7 @@ implement { local function startprocessing(name,notext) if not notext then - -- report_system("begin file %a at line %a",name,status.linenumber or 0) + -- report("begin file %a at line %a",name,status.linenumber or 0) context.dostarttextfile(name) end end @@ -231,7 +229,7 @@ end local function stopprocessing(notext) if not notext then context.dostoptextfile() - -- report_system("end file %a at line %a",name,status.linenumber or 0) + -- report("end file %a at line %a",name,status.linenumber or 0) end end @@ -239,12 +237,28 @@ end local typestack = { } local currenttype = v_text +local nofmissing = 0 +local missing = { + tex = setmetatableindex("number"), + lua = setmetatableindex("number"), + cld = setmetatableindex("number"), + xml = setmetatableindex("number"), +} --- +local function reportfailure(kind,name) + nofmissing = nofmissing + 1 + missing[kind][name] = true + report_jobfiles("unknown %s file %a",kind,name) +end -local action = function(name,foundname) input(foundname) end -local failure = function(name,foundname) report_jobfiles("unknown %s file %a","tex",name) end +-- +local function action(name,foundname) + input(foundname) +end +local function failure(name,foundname) + reportfailure("tex",name) +end local function usetexfile(name,onlyonce,notext) startprocessing(name,notext) uselibrary { @@ -257,9 +271,12 @@ local function usetexfile(name,onlyonce,notext) stopprocessing(notext) end -local action = function(name,foundname) dofile(foundname) end -local failure = function(name,foundname) report_jobfiles("unknown %s file %a","lua",name) end - +local function action(name,foundname) + dofile(foundname) +end +local function failure(name,foundname) + reportfailure("lua",name) +end local function useluafile(name,onlyonce,notext) uselibrary { name = name, @@ -270,9 +287,12 @@ local function useluafile(name,onlyonce,notext) } end -local action = function(name,foundname) dofile(foundname) end -local failure = function(name,foundname) report_jobfiles("unknown %s file %a","cld",name) end - +local function action(name,foundname) + dofile(foundname) +end +local function failure(name,foundname) + reportfailure("cld",name) +end local function usecldfile(name,onlyonce,notext) startprocessing(name,notext) uselibrary { @@ -285,9 +305,12 @@ local function usecldfile(name,onlyonce,notext) stopprocessing(notext) end -local action = function(name,foundname) context.xmlprocess(foundname,"main","") end -local failure = function(name,foundname) report_jobfiles("unknown %s file %a","xml",name) end - +local function action(name,foundname) + context.xmlprocess(foundname,"main","") +end +local function failure(name,foundname) + reportfailure("xml",name) +end local function usexmlfile(name,onlyonce,notext) startprocessing(name,notext) uselibrary { @@ -352,7 +375,7 @@ local textlevel = 0 -- inaccessible for user, we need to define counter textleve local function dummyfunction() end local function startstoperror() - report_system("invalid \\%s%s ... \\%s%s structure",elements.start,v_text,elements.stop,v_text) + report("invalid \\%s%s ... \\%s%s structure",elements.start,v_text,elements.stop,v_text) startstoperror = dummyfunction end @@ -398,9 +421,9 @@ implement { arguments = "string", actions = function(reason) if reason then - report_system("forcing quit: %s",reason) + report("forcing quit: %s",reason) else - report_system("forcing quit") + report("forcing quit") end context.batchmode() while textlevel >= 0 do @@ -412,7 +435,7 @@ implement { implement { name = "forceendjob", actions = function() - report_system([[don't use \end to finish a document]]) + report([[don't use \end to finish a document]]) context.stoptext() end } @@ -421,7 +444,7 @@ implement { name = "autostarttext", actions = function() if textlevel == 0 then - report_system([[auto \starttext ... \stoptext]]) + report([[auto \starttext ... \stoptext]]) end context.starttext() end @@ -471,9 +494,6 @@ local stacks = { -- -local report_structures = logs.reporter("system","structure") -local report_structure = logs.reporter("used structure") - local function pushtree(what,name) local t = { } top[#top+1] = { type = what, name = name, branches = t } @@ -486,29 +506,38 @@ local function poptree() -- inspect(top) end -local function log_tree(top,depth) - report_structure("%s%s: %s",depth,top.type,top.name) - local branches = top.branches - if #branches > 0 then - depth = depth .. " " - for i=1,#branches do - log_tree(branches[i],depth) +do + + local function log_tree(report,top,depth) + report("%s%s: %s",depth,top.type,top.name) + local branches = top.branches + if #branches > 0 then + depth = depth .. " " + for i=1,#branches do + log_tree(report,branches[i],depth) + end end end -end -luatex.registerstopactions(function() - logspushtarget("logfile") - logsnewline() - report_structures("start used structure") - logsnewline() - root.name = environment.jobname - log_tree(root,"") - logsnewline() - report_structures("stop used structure") - logsnewline() - logspoptarget() -end) + logs.registerfinalactions(function() + root.name = environment.jobname + -- + logs.startfilelogging(report,"used files") + log_tree(report,root,"") + logs.stopfilelogging() + -- + if nofmissing > 0 and logs.loggingerrors() then + logs.starterrorlogging(report,"missing files") + for kind, list in sortedhash(missing) do + for name in sortedhash(list) do + report("%w%s %s",6,kind,name) + end + end + logs.stoperrorlogging() + end + end) + +end local jobstructure = job.structure or { } job.structure = jobstructure @@ -1094,113 +1123,76 @@ implement { name = "setdocumentmodules", actions = document.setmodules, implement { name = "setdocumentenvironments", actions = document.setenvironments, onlyonce = true } implement { name = "setdocumentfilenames", actions = document.setfilenames, onlyonce = true } -local report_files = logs.reporter("system","files") -local report_options = logs.reporter("system","options") -local report_file = logs.reporter("used file") -local report_option = logs.reporter("used option") - -luatex.registerstopactions(function() - local foundintrees = resolvers.instance.foundintrees - if #foundintrees > 0 then - logspushtarget("logfile") - logsnewline() - report_files("start used files") - logsnewline() - for i=1,#foundintrees do - report_file("%4i: % T",i,foundintrees[i]) +do + + logs.registerfinalactions(function() + local foundintrees = resolvers.foundintrees() + if #foundintrees > 0 then + logs.startfilelogging(report,"used files") + for i=1,#foundintrees do + report("%4i: % T",i,foundintrees[i]) + end + logs.stopfilelogging() end - logsnewline() - report_files("stop used files") - logsnewline() - logspoptarget() - end -end) + end) -luatex.registerstopactions(function() - local files = document.files -- or environment.files - local arguments = document.arguments -- or environment.arguments - -- - logspushtarget("logfile") - logsnewline() - report_options("start commandline options") - logsnewline() - if arguments and next(arguments) then - for argument, value in sortedhash(arguments) do - report_option("%s=%A",argument,value) + logs.registerfinalactions(function() + local files = document.files -- or environment.files + local arguments = document.arguments -- or environment.arguments + -- + logs.startfilelogging(report,"commandline options") + if arguments and next(arguments) then + for argument, value in sortedhash(arguments) do + report("%s=%A",argument,value) + end + else + report("no arguments") end - else - report_file("no arguments") - end - logsnewline() - report_options("stop commandline options") - logsnewline() - report_options("start commandline files") - logsnewline() - if files and #files > 0 then - for i=1,#files do - report_file("% 4i: %s",i,files[i]) + logs.stopfilelogging() + -- + logs.startfilelogging(report,"commandline files") + if files and #files > 0 then + for i=1,#files do + report("% 4i: %s",i,files[i]) + end + else + report("no files") end - else - report_file("no files") - end - logsnewline() - report_options("stop commandline files") - logsnewline() - logspoptarget() -end) + logs.stopfilelogging() + end) + +end if environment.initex then - local report_storage = logs.reporter("system","storage") - local report_table = logs.reporter("stored table") - local report_module = logs.reporter("stored module") - local report_attribute = logs.reporter("stored attribute") - local report_catcodetable = logs.reporter("stored catcodetable") - local report_corenamespace = logs.reporter("stored corenamespace") - - luatex.registerstopactions(function() - logspushtarget("logfile") - logsnewline() - report_storage("start stored tables") - logsnewline() + logs.registerfinalactions(function() + local startfilelogging = logs.startfilelogging + local stopfilelogging = logs.stopfilelogging + startfilelogging(report,"stored tables") for k,v in sortedhash(storage.data) do - report_table("%03i %s",k,v[1]) + report("%03i %s",k,v[1]) end - logsnewline() - report_storage("stop stored tables") - logsnewline() - report_storage("start stored modules") - logsnewline() + stopfilelogging() + startfilelogging(report,"stored modules") for k,v in sortedhash(lua.bytedata) do - report_module("%03i %s %s",k,v[2],v[1]) + report("%03i %s %s",k,v.name) end - logsnewline() - report_storage("stop stored modules") - logsnewline() - report_storage("start stored attributes") - logsnewline() + stopfilelogging() + startfilelogging(report,"stored attributes") for k,v in sortedhash(attributes.names) do - report_attribute("%03i %s",k,v) + report("%03i %s",k,v) end - logsnewline() - report_storage("stop stored attributes") - logsnewline() - report_storage("start stored catcodetables") - logsnewline() + stopfilelogging() + startfilelogging(report,"stored catcodetables") for k,v in sortedhash(catcodes.names) do - report_catcodetable("%03i % t",k,v) + report("%03i % t",k,v) end - logsnewline() - report_storage("stop stored catcodetables") - logsnewline() - report_storage("start stored corenamespaces") + stopfilelogging() + startfilelogging(report,"stored corenamespaces") for k,v in sortedhash(interfaces.corenamespaces) do - report_corenamespace("%03i %s",k,v) + report("%03i %s",k,v) end - logsnewline() - report_storage("stop stored corenamespaces") - logsnewline() - logspoptarget() + stopfilelogging() end) end @@ -1217,7 +1209,7 @@ implement { continue = inpnamefull == basename(inpfilefull) end if continue then - report_system("continuing input file %a",inpname) + report("continuing input file %a",inpname) end ctx_doifelse(continue) end diff --git a/tex/context/base/mkiv/file-job.mkvi b/tex/context/base/mkiv/file-job.mkvi index 75362d5a9..e1ea405c0 100644 --- a/tex/context/base/mkiv/file-job.mkvi +++ b/tex/context/base/mkiv/file-job.mkvi @@ -17,7 +17,7 @@ \unprotect -\registerctxluafile{file-job}{1.001} +\registerctxluafile{file-job}{} % processing @@ -345,4 +345,14 @@ %S The document: namespace will be used elsewhere too. +% Bonus: + +\installcorenamespace{samplefile} + +\unexpanded\def\samplefile#1% + {\ifcsname\??samplefile#1\endcsname \else + \setxvalue{\??samplefile#1}{\cldloadfile{#1}}% + \fi + \lastnamedcs} + \protect \endinput diff --git a/tex/context/base/mkiv/file-lib.mkvi b/tex/context/base/mkiv/file-lib.mkvi index 76137ce15..c2ec555cf 100644 --- a/tex/context/base/mkiv/file-lib.mkvi +++ b/tex/context/base/mkiv/file-lib.mkvi @@ -15,6 +15,6 @@ \unprotect -\registerctxluafile{file-lib}{1.001} +\registerctxluafile{file-lib}{} \protect \endinput diff --git a/tex/context/base/mkiv/file-mod.lua b/tex/context/base/mkiv/file-mod.lua index 7f3763c5d..81320f96e 100644 --- a/tex/context/base/mkiv/file-mod.lua +++ b/tex/context/base/mkiv/file-mod.lua @@ -19,11 +19,13 @@ at the <l n='tex'/> side.</p> --ldx]]-- local format, find, concat, tonumber = string.format, string.find, table.concat, tonumber +local sortedhash = table.sortedhash +local basename = file.basename local trace_modules = false trackers .register("modules.loading", function(v) trace_modules = v end) local permit_unprefixed = false directives.register("modules.permitunprefixed", function(v) permit_unprefixed = v end) -local report_modules = logs.reporter("resolvers","modules") +local report = logs.reporter("modules") local commands = commands local context = context @@ -54,6 +56,7 @@ local suffixes = { } local modstatus = { } +local missing = false local function usemodule(name,hasscheme) local foundname @@ -62,19 +65,19 @@ local function usemodule(name,hasscheme) -- so we only add one if missing local fullname = file.addsuffix(name,"tex") if trace_modules then - report_modules("checking url %a",fullname) + report("checking url %a",fullname) end foundname = resolvers.findtexfile(fullname) or "" elseif file.suffix(name) ~= "" then if trace_modules then - report_modules("checking file %a",name) + report("checking file %a",name) end foundname = findbyscheme("any",name) or "" else for i=1,#suffixes do local fullname = file.addsuffix(name,suffixes[i]) if trace_modules then - report_modules("checking file %a",fullname) + report("checking file %a",fullname) end foundname = findbyscheme("any",fullname) or "" if foundname ~= "" then @@ -84,7 +87,7 @@ local function usemodule(name,hasscheme) end if foundname ~= "" then if trace_modules then - report_modules("loading file %a",foundname) + report("loading file %a",foundname) end context.startreadingfile() resolvers.jobs.usefile(foundname,true) -- once, notext @@ -107,7 +110,7 @@ function environment.usemodules(prefix,askedname,truename) status = status + 1 else if trace_modules then - report_modules("locating, prefix %a, askedname %a, truename %a",prefix,askedname,truename) + report("locating, prefix %a, askedname %a, truename %a",prefix,askedname,truename) end local hasscheme = url.hasscheme(truename) if hasscheme then @@ -134,12 +137,12 @@ function environment.usemodules(prefix,askedname,truename) end if status then -- ok, don't change - elseif find(truename,"%-") and usemodule(truename) then + elseif find(truename,"-",1,true) and usemodule(truename) then -- assume a user namespace - report_modules("using user prefixed file %a",truename) + report("using user prefixed file %a",truename) status = 1 elseif permit_unprefixed and usemodule(truename) then - report_modules("using unprefixed file %a",truename) + report("using unprefixed file %a",truename) status = 1 else status = 0 @@ -147,11 +150,12 @@ function environment.usemodules(prefix,askedname,truename) end end if status == 0 then - report_modules("%a is not found",askedname) + missing = true + report("%a is not found",askedname) elseif status == 1 then - report_modules("%a is loaded",trace_modules and truename or askedname) + report("%a is loaded",trace_modules and truename or askedname) else - report_modules("%a is already loaded",trace_modules and truename or askedname) + report("%a is already loaded",trace_modules and truename or askedname) end modstatus[hashname] = status end @@ -159,14 +163,14 @@ end statistics.register("loaded tex modules", function() if next(modstatus) then local t, f, nt, nf = { }, { }, 0, 0 - for k, v in table.sortedhash(modstatus) do - k = file.basename(k) + for k, v in sortedhash(modstatus) do + local b = basename(k) if v == 0 then nf = nf + 1 - f[nf] = k + f[nf] = b else nt = nt + 1 - t[nt] = k + t[nt] = b end end if nf == 0 then @@ -181,6 +185,23 @@ statistics.register("loaded tex modules", function() end end) +logs.registerfinalactions(function() + logs.startfilelogging(report,"used modules") + for k, v in sortedhash(modstatus) do + report(v == 0 and "missing: %s" or "loaded : %s",basename(k)) + end + logs.stopfilelogging() + if missing and logs.loggingerrors() then + logs.starterrorlogging(report,"missing modules") + for k, v in sortedhash(modstatus) do + if v == 0 then + report("%w%s",6,basename(k)) + end + end + logs.stoperrorlogging() + end +end) + -- moved from syst-lua.lua: local lpegmatch = lpeg.match diff --git a/tex/context/base/mkiv/file-mod.mkvi b/tex/context/base/mkiv/file-mod.mkvi index ebd741d42..a2a3b7793 100644 --- a/tex/context/base/mkiv/file-mod.mkvi +++ b/tex/context/base/mkiv/file-mod.mkvi @@ -15,7 +15,7 @@ \unprotect -\registerctxluafile{file-mod}{1.001} +\registerctxluafile{file-mod}{} %D \macros %D {usemodule} @@ -73,13 +73,16 @@ \let\currentmoduleparameters\empty \let\currentmodule \s!unknown +\newcount \c_syst_modules_nesting + \newtoks\everysetupmodule \unexpanded\def\startmodule {\doifelsenextoptionalcs\syst_modules_start_yes\syst_modules_start_nop} \def\syst_modules_start_yes[#name]% - {\pushmacro\currentmodule + {\global\advance\c_syst_modules_nesting\plusone + \pushmacro\currentmodule \pushmacro\currentmoduleparameters \def\currentmodule{#name}} @@ -87,8 +90,13 @@ {\syst_modules_start_yes[#name]} \unexpanded\def\stopmodule - {\popmacro\currentmoduleparameters - \popmacro\currentmodule} + {\ifcase\c_syst_modules_nesting + \writestatus\m!system{module wrapping error in '\currentmodule'}% + \else + \popmacro\currentmoduleparameters + \popmacro\currentmodule + \global\advance\c_syst_modules_nesting\minusone + \fi} \unexpanded\def\setupmodule {\dodoubleempty\syst_modules_setup} @@ -183,7 +191,7 @@ %D bene: such runtime definitions are to be defined global. %D %D \starttyping -%D \fetchruntimecommand\showaccents{\f!colorprefix ...} +%D \fetchruntimecommand \showaccents \f!file_run % last is a file name %D \stoptyping \installcorenamespace{runtimeloaded} diff --git a/tex/context/base/mkiv/file-res.lua b/tex/context/base/mkiv/file-res.lua index 44117ed46..cf76d2d8b 100644 --- a/tex/context/base/mkiv/file-res.lua +++ b/tex/context/base/mkiv/file-res.lua @@ -6,6 +6,7 @@ if not modules then modules = { } end modules ['file-res'] = { license = "see context related readme files" } +local tonumber = tonumber local format, find = string.format, string.find local isfile = lfs.isfile local is_qualified_path = file.is_qualified_path @@ -78,7 +79,7 @@ local function readfilename(specification,backtrack,treetoo) end end if not fnd then - local paths = resolvers.instance.extra_paths + local paths = resolvers.getextrapaths() if paths then for i=1,#paths do for i=1,#names do diff --git a/tex/context/base/mkiv/file-res.mkvi b/tex/context/base/mkiv/file-res.mkvi index 17f4cf44c..c5bef27a9 100644 --- a/tex/context/base/mkiv/file-res.mkvi +++ b/tex/context/base/mkiv/file-res.mkvi @@ -15,7 +15,7 @@ \unprotect -\registerctxluafile{file-res}{1.001} +\registerctxluafile{file-res}{} %D \macros %D {readfile,ReadFile} diff --git a/tex/context/base/mkiv/file-syn.mkvi b/tex/context/base/mkiv/file-syn.mkvi index 52ecd0d71..f25861772 100644 --- a/tex/context/base/mkiv/file-syn.mkvi +++ b/tex/context/base/mkiv/file-syn.mkvi @@ -15,7 +15,7 @@ \unprotect -\registerctxluafile{file-syn}{1.001} +\registerctxluafile{file-syn}{} %D \macros %D {definefilesynonym,definefilefallback} diff --git a/tex/context/base/mkiv/font-afk.lua b/tex/context/base/mkiv/font-afk.lua index 8b65b0631..761016d34 100644 --- a/tex/context/base/mkiv/font-afk.lua +++ b/tex/context/base/mkiv/font-afk.lua @@ -1,6 +1,6 @@ if not modules then modules = { } end modules ['font-afk'] = { version = 1.001, - comment = "companion to font-afm.lua", + comment = "companion to font-lib.mkiv", author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", copyright = "PRAGMA ADE / ConTeXt Development Team", license = "see context related readme files", diff --git a/tex/context/base/mkiv/font-afm.lua b/tex/context/base/mkiv/font-afm.lua deleted file mode 100644 index a9fbe89f1..000000000 --- a/tex/context/base/mkiv/font-afm.lua +++ /dev/null @@ -1,1232 +0,0 @@ -if not modules then modules = { } end modules ['font-afm'] = { - version = 1.001, - comment = "companion to font-ini.mkiv", - author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", - copyright = "PRAGMA ADE / ConTeXt Development Team", - license = "see context related readme files" -} - ---[[ldx-- -<p>Some code may look a bit obscure but this has to do with the -fact that we also use this code for testing and much code evolved -in the transition from <l n='tfm'/> to <l n='afm'/> to <l -n='otf'/>.</p> - -<p>The following code still has traces of intermediate font support -where we handles font encodings. Eventually font encoding goes -away.</p> - -<p>The embedding of a font involves creating temporary files and -depending on your system setup that can fail. It took more than a -day to figure out why sometimes embedding failed in mingw luatex -where running on a real path like c:\... failed while running on -say e:\... being a link worked well. The native windows binaries -don't have this issue.</p> - ---ldx]]-- - -local fonts, logs, trackers, containers, resolvers = fonts, logs, trackers, containers, resolvers - -local next, type, tonumber = next, type, tonumber -local match, gmatch, lower, gsub, strip, find = string.match, string.gmatch, string.lower, string.gsub, string.strip, string.find -local char, byte, sub = string.char, string.byte, string.sub -local abs = math.abs -local bxor, rshift = bit32.bxor, bit32.rshift -local P, S, R, Cmt, C, Ct, Cs, Cg, Cf, lpegmatch, patterns = lpeg.P, lpeg.S, lpeg.R, lpeg.Cmt, lpeg.C, lpeg.Ct, lpeg.Cs, lpeg.Cg, lpeg.Cf, lpeg.match, lpeg.patterns -local derivetable = table.derive - -local trace_features = false trackers.register("afm.features", function(v) trace_features = v end) -local trace_indexing = false trackers.register("afm.indexing", function(v) trace_indexing = v end) -local trace_loading = false trackers.register("afm.loading", function(v) trace_loading = v end) -local trace_defining = false trackers.register("fonts.defining", function(v) trace_defining = v end) - -local report_afm = logs.reporter("fonts","afm loading") -local report_pfb = logs.reporter("fonts","pfb loading") - -local setmetatableindex = table.setmetatableindex - -local findbinfile = resolvers.findbinfile - -local definers = fonts.definers -local readers = fonts.readers -local constructors = fonts.constructors - -local afm = constructors.handlers.afm -local pfb = constructors.handlers.pfb - -local afmfeatures = constructors.features.afm -local registerafmfeature = afmfeatures.register - -afm.version = 1.501 -- incrementing this number one up will force a re-cache -afm.cache = containers.define("fonts", "afm", afm.version, true) -afm.autoprefixed = true -- this will become false some day (catches texnansi-blabla.*) - -afm.helpdata = { } -- set later on so no local for this -afm.syncspace = true -- when true, nicer stretch values -afm.addligatures = true -- best leave this set to true -afm.addtexligatures = true -- best leave this set to true -afm.addkerns = true -- best leave this set to true - -local overloads = fonts.mappings.overloads - -local applyruntimefixes = fonts.treatments and fonts.treatments.applyfixes - -local function setmode(tfmdata,value) - if value then - tfmdata.properties.mode = lower(value) - end -end - -registerafmfeature { - name = "mode", - description = "mode", - initializers = { - base = setmode, - node = setmode, - } -} - ---[[ldx-- -<p>We start with the basic reader which we give a name similar to the -built in <l n='tfm'/> and <l n='otf'/> reader.</p> ---ldx]]-- - ---~ Comment FONTIDENTIFIER LMMATHSYMBOLS10 ---~ Comment CODINGSCHEME TEX MATH SYMBOLS ---~ Comment DESIGNSIZE 10.0 pt ---~ Comment CHECKSUM O 4261307036 ---~ Comment SPACE 0 plus 0 minus 0 ---~ Comment QUAD 1000 ---~ Comment EXTRASPACE 0 ---~ Comment NUM 676.508 393.732 443.731 ---~ Comment DENOM 685.951 344.841 ---~ Comment SUP 412.892 362.892 288.889 ---~ Comment SUB 150 247.217 ---~ Comment SUPDROP 386.108 ---~ Comment SUBDROP 50 ---~ Comment DELIM 2390 1010 ---~ Comment AXISHEIGHT 250 - -local comment = P("Comment") -local spacing = patterns.spacer -- S(" \t")^1 -local lineend = patterns.newline -- S("\n\r") -local words = C((1 - lineend)^1) -local number = C((R("09") + S("."))^1) / tonumber * spacing^0 -local data = lpeg.Carg(1) - -local pattern = ( -- needs testing ... not used anyway as we no longer need math afm's - comment * spacing * - ( - data * ( - ("CODINGSCHEME" * spacing * words ) / function(fd,a) end + - ("DESIGNSIZE" * spacing * number * words ) / function(fd,a) fd[ 1] = a end + - ("CHECKSUM" * spacing * number * words ) / function(fd,a) fd[ 2] = a end + - ("SPACE" * spacing * number * "plus" * number * "minus" * number) / function(fd,a,b,c) fd[ 3], fd[ 4], fd[ 5] = a, b, c end + - ("QUAD" * spacing * number ) / function(fd,a) fd[ 6] = a end + - ("EXTRASPACE" * spacing * number ) / function(fd,a) fd[ 7] = a end + - ("NUM" * spacing * number * number * number ) / function(fd,a,b,c) fd[ 8], fd[ 9], fd[10] = a, b, c end + - ("DENOM" * spacing * number * number ) / function(fd,a,b ) fd[11], fd[12] = a, b end + - ("SUP" * spacing * number * number * number ) / function(fd,a,b,c) fd[13], fd[14], fd[15] = a, b, c end + - ("SUB" * spacing * number * number ) / function(fd,a,b) fd[16], fd[17] = a, b end + - ("SUPDROP" * spacing * number ) / function(fd,a) fd[18] = a end + - ("SUBDROP" * spacing * number ) / function(fd,a) fd[19] = a end + - ("DELIM" * spacing * number * number ) / function(fd,a,b) fd[20], fd[21] = a, b end + - ("AXISHEIGHT" * spacing * number ) / function(fd,a) fd[22] = a end - ) - + (1-lineend)^0 - ) - + (1-comment)^1 -)^0 - -local function scan_comment(str) - local fd = { } - lpegmatch(pattern,str,1,fd) - return fd -end - --- On a rainy day I will rewrite this in lpeg ... or we can use the (slower) fontloader --- as in now supports afm/pfb loading but it's not too bad to have different methods --- for testing approaches. - -local keys = { } - -function keys.FontName (data,line) data.metadata.fontname = strip (line) -- get rid of spaces - data.metadata.fullname = strip (line) end -function keys.ItalicAngle (data,line) data.metadata.italicangle = tonumber (line) end -function keys.IsFixedPitch(data,line) data.metadata.monospaced = toboolean(line,true) end -function keys.CharWidth (data,line) data.metadata.charwidth = tonumber (line) end -function keys.XHeight (data,line) data.metadata.xheight = tonumber (line) end -function keys.Descender (data,line) data.metadata.descender = tonumber (line) end -function keys.Ascender (data,line) data.metadata.ascender = tonumber (line) end -function keys.Comment (data,line) - -- Comment DesignSize 12 (pts) - -- Comment TFM designsize: 12 (in points) - line = lower(line) - local designsize = match(line,"designsize[^%d]*(%d+)") - if designsize then data.metadata.designsize = tonumber(designsize) end -end - -local function get_charmetrics(data,charmetrics,vector) - local characters = data.characters - local chr, ind = { }, 0 - for k, v in gmatch(charmetrics,"([%a]+) +(.-) *;") do - if k == 'C' then - v = tonumber(v) - if v < 0 then - ind = ind + 1 -- ? - else - ind = v - end - chr = { - index = ind - } - elseif k == 'WX' then - chr.width = tonumber(v) - elseif k == 'N' then - characters[v] = chr - elseif k == 'B' then - local llx, lly, urx, ury = match(v,"^ *(.-) +(.-) +(.-) +(.-)$") - chr.boundingbox = { tonumber(llx), tonumber(lly), tonumber(urx), tonumber(ury) } - elseif k == 'L' then - local plus, becomes = match(v,"^(.-) +(.-)$") - local ligatures = chr.ligatures - if ligatures then - ligatures[plus] = becomes - else - chr.ligatures = { [plus] = becomes } - end - end - end -end - -local function get_kernpairs(data,kernpairs) - local characters = data.characters - for one, two, value in gmatch(kernpairs,"KPX +(.-) +(.-) +(.-)\n") do - local chr = characters[one] - if chr then - local kerns = chr.kerns - if kerns then - kerns[two] = tonumber(value) - else - chr.kerns = { [two] = tonumber(value) } - end - end - end -end - -local function get_variables(data,fontmetrics) - for key, rest in gmatch(fontmetrics,"(%a+) *(.-)[\n\r]") do - local keyhandler = keys[key] - if keyhandler then - keyhandler(data,rest) - end - end -end - -local get_indexes - -do - - -- old font loader - - local fontloader = fontloader - local get_indexes_old = false - - if fontloader then - - local font_to_table = fontloader.to_table - local open_font = fontloader.open - local close_font = fontloader.close - - get_indexes_old = function(data,pfbname) - local pfbblob = open_font(pfbname) - if pfbblob then - local characters = data.characters - local pfbdata = font_to_table(pfbblob) - if pfbdata then - local glyphs = pfbdata.glyphs - if glyphs then - if trace_loading then - report_afm("getting index data from %a",pfbname) - end - for index, glyph in next, glyphs do - local name = glyph.name - if name then - local char = characters[name] - if char then - if trace_indexing then - report_afm("glyph %a has index %a",name,index) - end - char.index = index - end - end - end - elseif trace_loading then - report_afm("no glyph data in pfb file %a",pfbname) - end - elseif trace_loading then - report_afm("no data in pfb file %a",pfbname) - end - close_font(pfbblob) - elseif trace_loading then - report_afm("invalid pfb file %a",pfbname) - end - end - - end - - -- new (unfinished) font loader but i see no differences between - -- old and new (one bad vector with old) - - local n, m - - local progress = function(str,position,name,size) - local forward = position + tonumber(size) + 3 + 2 - n = n + 1 - if n >= m then - return #str, name - elseif forward < #str then - return forward, name - else - return #str, name - end - end - - local initialize = function(str,position,size) - n = 0 - m = size -- % tonumber(size) - return position + 1 - end - - local charstrings = P("/CharStrings") - local encoding = P("/Encoding") - local dup = P("dup") - local put = P("put") - local array = P("array") - local name = P("/") * C((R("az")+R("AZ")+R("09")+S("-_."))^1) - local digits = R("09")^1 - local cardinal = digits / tonumber - local spaces = P(" ")^1 - local spacing = patterns.whitespace^0 - - local p_filternames = Ct ( - (1-charstrings)^0 * charstrings * spaces * Cmt(cardinal,initialize) - * (Cmt(name * spaces * cardinal, progress) + P(1))^1 - ) - - -- /Encoding 256 array - -- 0 1 255 {1 index exch /.notdef put} for - -- dup 0 /Foo put - - local p_filterencoding = - (1-encoding)^0 * encoding * spaces * digits * spaces * array * (1-dup)^0 - * Cf( - Ct("") * Cg(spacing * dup * spaces * cardinal * spaces * name * spaces * put)^1 - ,rawset) - - -- if one of first 4 not 0-9A-F then binary else hex - - local decrypt - - do - - local r, c1, c2, n = 0, 0, 0, 0 - - local function step(c) - local cipher = byte(c) - local plain = bxor(cipher,rshift(r,8)) - r = ((cipher + r) * c1 + c2) % 65536 - return char(plain) - end - - decrypt = function(binary) - r, c1, c2, n = 55665, 52845, 22719, 4 - binary = gsub(binary,".",step) - return sub(binary,n+1) - end - - -- local pattern = Cs((P(1) / step)^1) - -- - -- decrypt = function(binary) - -- r, c1, c2, n = 55665, 52845, 22719, 4 - -- binary = lpegmatch(pattern,binary) - -- return sub(binary,n+1) - -- end - - end - - local function loadpfbvector(filename) - -- for the moment limited to encoding only - - local data = io.loaddata(resolvers.findfile(filename)) - - if not data then - report_pfb("no data in %a",filename) - return - end - - if not (find(data,"!PS%-AdobeFont%-") or find(data,"%%!FontType1")) then - report_pfb("no font in %a",filename) - return - end - - local ascii, binary = match(data,"(.*)eexec%s+......(.*)") - - if not binary then - report_pfb("no binary data in %a",filename) - return - end - - binary = decrypt(binary,4) - - local vector = lpegmatch(p_filternames,binary) - - if vector[1] == ".notdef" then - -- tricky - vector[0] = table.remove(vector,1) - end - - if not vector then - report_pfb("no vector in %a",filename) - return - end - - local encoding = lpegmatch(p_filterencoding,ascii) - - return vector, encoding - - end - - local pfb = handlers.pfb or { } - handlers.pfb = pfb - pfb.loadvector = loadpfbvector - - get_indexes = function(data,pfbname) - local vector = loadpfbvector(pfbname) - if vector then - local characters = data.characters - if trace_loading then - report_afm("getting index data from %a",pfbname) - end - for index=1,#vector do - local name = vector[index] - local char = characters[name] - if char then - if trace_indexing then - report_afm("glyph %a has index %a",name,index) - end - char.index = index - end - end - end - end - - if get_indexes_old then - - afm.use_new_indexer = true - get_indexes_new = get_indexes - - get_indexes = function(data,pfbname) - if afm.use_new_indexer then - return get_indexes_new(data,pfbname) - else - return get_indexes_old(data,pfbname) - end - end - - end - - -end - -local function readafm(filename) - local ok, afmblob, size = resolvers.loadbinfile(filename) -- has logging - if ok and afmblob then - local data = { - resources = { - filename = resolvers.unresolve(filename), - version = afm.version, - creator = "context mkiv", - }, - properties = { - hasitalics = false, - }, - goodies = { - }, - metadata = { - filename = file.removesuffix(file.basename(filename)) - }, - characters = { - -- a temporary store - }, - descriptions = { - -- the final store - }, - } - afmblob = gsub(afmblob,"StartCharMetrics(.-)EndCharMetrics", function(charmetrics) - if trace_loading then - report_afm("loading char metrics") - end - get_charmetrics(data,charmetrics,vector) - return "" - end) - afmblob = gsub(afmblob,"StartKernPairs(.-)EndKernPairs", function(kernpairs) - if trace_loading then - report_afm("loading kern pairs") - end - get_kernpairs(data,kernpairs) - return "" - end) - afmblob = gsub(afmblob,"StartFontMetrics%s+([%d%.]+)(.-)EndFontMetrics", function(version,fontmetrics) - if trace_loading then - report_afm("loading variables") - end - data.afmversion = version - get_variables(data,fontmetrics) - data.fontdimens = scan_comment(fontmetrics) -- todo: all lpeg, no time now - return "" - end) - return data - else - if trace_loading then - report_afm("no valid afm file %a",filename) - end - return nil - end -end - ---[[ldx-- -<p>We cache files. Caching is taken care of in the loader. We cheat a bit -by adding ligatures and kern information to the afm derived data. That -way we can set them faster when defining a font.</p> ---ldx]]-- - -local addkerns, addligatures, addtexligatures, unify, normalize, fixnames -- we will implement these later - -function afm.load(filename) - -- hm, for some reasons not resolved yet - filename = resolvers.findfile(filename,'afm') or "" - if filename ~= "" and not fonts.names.ignoredfile(filename) then - local name = file.removesuffix(file.basename(filename)) - local data = containers.read(afm.cache,name) - local attr = lfs.attributes(filename) - local size, time = attr.size or 0, attr.modification or 0 - -- - local pfbfile = file.replacesuffix(name,"pfb") - local pfbname = resolvers.findfile(pfbfile,"pfb") or "" - if pfbname == "" then - pfbname = resolvers.findfile(file.basename(pfbfile),"pfb") or "" - end - local pfbsize, pfbtime = 0, 0 - if pfbname ~= "" then - local attr = lfs.attributes(pfbname) - pfbsize = attr.size or 0 - pfbtime = attr.modification or 0 - end - if not data or data.size ~= size or data.time ~= time or data.pfbsize ~= pfbsize or data.pfbtime ~= pfbtime then - report_afm("reading %a",filename) - data = readafm(filename) - if data then - if pfbname ~= "" then - data.resources.filename = resolvers.unresolve(pfbname) - get_indexes(data,pfbname) - elseif trace_loading then - report_afm("no pfb file for %a",filename) - -- data.resources.filename = "unset" -- better than loading the afm file - end - report_afm("unifying %a",filename) - unify(data,filename) - if afm.addligatures then - report_afm("add ligatures") - addligatures(data) - end - if afm.addtexligatures then - report_afm("add tex ligatures") - addtexligatures(data) - end - if afm.addkerns then - report_afm("add extra kerns") - addkerns(data) - end - normalize(data) - fixnames(data) - report_afm("add tounicode data") - fonts.mappings.addtounicode(data,filename) - data.size = size - data.time = time - data.pfbsize = pfbsize - data.pfbtime = pfbtime - report_afm("saving %a in cache",name) - data.resources.unicodes = nil -- consistent with otf but here we save not much - data = containers.write(afm.cache, name, data) - data = containers.read(afm.cache,name) - end - if applyruntimefixes and data then - applyruntimefixes(filename,data) - end - end - return data - else - return nil - end -end - -local uparser = fonts.mappings.makenameparser() - -unify = function(data, filename) - local unicodevector = fonts.encodings.agl.unicodes -- loaded runtime in context - local unicodes = { } - local names = { } - local private = constructors.privateoffset - local descriptions = data.descriptions - for name, blob in next, data.characters do - local code = unicodevector[name] -- or characters.name_to_unicode[name] - if not code then - code = lpegmatch(uparser,name) - if not code then - code = private - private = private + 1 - report_afm("assigning private slot %U for unknown glyph name %a",code,name) - end - end - local index = blob.index - unicodes[name] = code - names[name] = index - blob.name = name - descriptions[code] = { - boundingbox = blob.boundingbox, - width = blob.width, - kerns = blob.kerns, - index = index, - name = name, - } - end - for unicode, description in next, descriptions do - local kerns = description.kerns - if kerns then - local krn = { } - for name, kern in next, kerns do - local unicode = unicodes[name] - if unicode then - krn[unicode] = kern - else - -- print(unicode,name) - end - end - description.kerns = krn - end - end - data.characters = nil - local resources = data.resources - local filename = resources.filename or file.removesuffix(file.basename(filename)) - resources.filename = resolvers.unresolve(filename) -- no shortcut - resources.unicodes = unicodes -- name to unicode - resources.marks = { } -- todo - -- resources.names = names -- name to index - resources.private = private -end - -local everywhere = { ["*"] = { ["*"] = true } } -- or: { ["*"] = { "*" } } -local noflags = { false, false, false, false } - -afm.experimental_normalize = false - -normalize = function(data) - if type(afm.experimental_normalize) == "function" then - afm.experimental_normalize(data) - end -end - -fixnames = function(data) - for k, v in next, data.descriptions do - local n = v.name - local r = overloads[n] - if r then - local name = r.name - if trace_indexing then - report_afm("renaming characters %a to %a",n,name) - end - v.name = name - v.unicode = r.unicode - end - end -end - ---[[ldx-- -<p>These helpers extend the basic table with extra ligatures, texligatures -and extra kerns. This saves quite some lookups later.</p> ---ldx]]-- - -local addthem = function(rawdata,ligatures) - if ligatures then - local descriptions = rawdata.descriptions - local resources = rawdata.resources - local unicodes = resources.unicodes - -- local names = resources.names - for ligname, ligdata in next, ligatures do - local one = descriptions[unicodes[ligname]] - if one then - for _, pair in next, ligdata do - local two, three = unicodes[pair[1]], unicodes[pair[2]] - if two and three then - local ol = one.ligatures - if ol then - if not ol[two] then - ol[two] = three - end - else - one.ligatures = { [two] = three } - end - end - end - end - end - end -end - -addligatures = function(rawdata) addthem(rawdata,afm.helpdata.ligatures ) end -addtexligatures = function(rawdata) addthem(rawdata,afm.helpdata.texligatures) end - ---[[ldx-- -<p>We keep the extra kerns in separate kerning tables so that we can use -them selectively.</p> ---ldx]]-- - --- This is rather old code (from the beginning when we had only tfm). If --- we unify the afm data (now we have names all over the place) then --- we can use shcodes but there will be many more looping then. But we --- could get rid of the tables in char-cmp then. Als, in the generic version --- we don't use the character database. (Ok, we can have a context specific --- variant). - -addkerns = function(rawdata) -- using shcodes is not robust here - local descriptions = rawdata.descriptions - local resources = rawdata.resources - local unicodes = resources.unicodes - local function do_it_left(what) - if what then - for unicode, description in next, descriptions do - local kerns = description.kerns - if kerns then - local extrakerns - for complex, simple in next, what do - complex = unicodes[complex] - simple = unicodes[simple] - if complex and simple then - local ks = kerns[simple] - if ks and not kerns[complex] then - if extrakerns then - extrakerns[complex] = ks - else - extrakerns = { [complex] = ks } - end - end - end - end - if extrakerns then - description.extrakerns = extrakerns - end - end - end - end - end - local function do_it_copy(what) - if what then - for complex, simple in next, what do - complex = unicodes[complex] - simple = unicodes[simple] - if complex and simple then - local complexdescription = descriptions[complex] - if complexdescription then -- optional - local simpledescription = descriptions[complex] - if simpledescription then - local extrakerns - local kerns = simpledescription.kerns - if kerns then - for unicode, kern in next, kerns do - if extrakerns then - extrakerns[unicode] = kern - else - extrakerns = { [unicode] = kern } - end - end - end - local extrakerns = simpledescription.extrakerns - if extrakerns then - for unicode, kern in next, extrakerns do - if extrakerns then - extrakerns[unicode] = kern - else - extrakerns = { [unicode] = kern } - end - end - end - if extrakerns then - complexdescription.extrakerns = extrakerns - end - end - end - end - end - end - end - -- add complex with values of simplified when present - do_it_left(afm.helpdata.leftkerned) - do_it_left(afm.helpdata.bothkerned) - -- copy kerns from simple char to complex char unless set - do_it_copy(afm.helpdata.bothkerned) - do_it_copy(afm.helpdata.rightkerned) -end - ---[[ldx-- -<p>The copying routine looks messy (and is indeed a bit messy).</p> ---ldx]]-- - -local function adddimensions(data) -- we need to normalize afm to otf i.e. indexed table instead of name - if data then - for unicode, description in next, data.descriptions do - local bb = description.boundingbox - if bb then - local ht, dp = bb[4], -bb[2] - if ht == 0 or ht < 0 then - -- no need to set it and no negative heights, nil == 0 - else - description.height = ht - end - if dp == 0 or dp < 0 then - -- no negative depths and no negative depths, nil == 0 - else - description.depth = dp - end - end - end - end -end - -local function copytotfm(data) - if data and data.descriptions then - local metadata = data.metadata - local resources = data.resources - local properties = derivetable(data.properties) - local descriptions = derivetable(data.descriptions) - local goodies = derivetable(data.goodies) - local characters = { } - local parameters = { } - local unicodes = resources.unicodes - -- - for unicode, description in next, data.descriptions do -- use parent table - characters[unicode] = { } - end - -- - local filename = constructors.checkedfilename(resources) - local fontname = metadata.fontname or metadata.fullname - local fullname = metadata.fullname or metadata.fontname - local endash = 0x0020 -- space - local emdash = 0x2014 - local spacer = "space" - local spaceunits = 500 - -- - local monospaced = metadata.monospaced - local charwidth = metadata.charwidth - local italicangle = metadata.italicangle - local charxheight = metadata.xheight and metadata.xheight > 0 and metadata.xheight - properties.monospaced = monospaced - parameters.italicangle = italicangle - parameters.charwidth = charwidth - parameters.charxheight = charxheight - -- same as otf - if properties.monospaced then - if descriptions[endash] then - spaceunits, spacer = descriptions[endash].width, "space" - end - if not spaceunits and descriptions[emdash] then - spaceunits, spacer = descriptions[emdash].width, "emdash" - end - if not spaceunits and charwidth then - spaceunits, spacer = charwidth, "charwidth" - end - else - if descriptions[endash] then - spaceunits, spacer = descriptions[endash].width, "space" - end - if not spaceunits and charwidth then - spaceunits, spacer = charwidth, "charwidth" - end - end - spaceunits = tonumber(spaceunits) - if spaceunits < 200 then - -- todo: warning - end - -- - parameters.slant = 0 - parameters.space = spaceunits - parameters.space_stretch = 500 - parameters.space_shrink = 333 - parameters.x_height = 400 - parameters.quad = 1000 - -- - if italicangle and italicangle ~= 0 then - parameters.italicangle = italicangle - parameters.italicfactor = math.cos(math.rad(90+italicangle)) - parameters.slant = - math.tan(italicangle*math.pi/180) - end - if monospaced then - parameters.space_stretch = 0 - parameters.space_shrink = 0 - elseif afm.syncspace then - parameters.space_stretch = spaceunits/2 - parameters.space_shrink = spaceunits/3 - end - parameters.extra_space = parameters.space_shrink - if charxheight then - parameters.x_height = charxheight - else - -- same as otf - local x = 0x0078 -- x - if x then - local x = descriptions[x] - if x then - parameters.x_height = x.height - end - end - -- - end - local fd = data.fontdimens - if fd and fd[8] and fd[9] and fd[10] then -- math - for k,v in next, fd do - parameters[k] = v - end - end - -- - parameters.designsize = (metadata.designsize or 10)*65536 - parameters.ascender = abs(metadata.ascender or 0) - parameters.descender = abs(metadata.descender or 0) - parameters.units = 1000 - -- - properties.spacer = spacer - properties.encodingbytes = 2 - properties.format = fonts.formats[filename] or "type1" - properties.filename = filename - properties.fontname = fontname - properties.fullname = fullname - properties.psname = fullname - properties.name = filename or fullname or fontname - -- - if next(characters) then - return { - characters = characters, - descriptions = descriptions, - parameters = parameters, - resources = resources, - properties = properties, - goodies = goodies, - } - end - end - return nil -end - ---[[ldx-- -<p>Originally we had features kind of hard coded for <l n='afm'/> -files but since I expect to support more font formats, I decided -to treat this fontformat like any other and handle features in a -more configurable way.</p> ---ldx]]-- - -function afm.setfeatures(tfmdata,features) - local okay = constructors.initializefeatures("afm",tfmdata,features,trace_features,report_afm) - if okay then - return constructors.collectprocessors("afm",tfmdata,features,trace_features,report_afm) - else - return { } -- will become false - end -end - -local function addtables(data) - local resources = data.resources - local lookuptags = resources.lookuptags - local unicodes = resources.unicodes - if not lookuptags then - lookuptags = { } - resources.lookuptags = lookuptags - end - setmetatableindex(lookuptags,function(t,k) - local v = type(k) == "number" and ("lookup " .. k) or k - t[k] = v - return v - end) - if not unicodes then - unicodes = { } - resources.unicodes = unicodes - setmetatableindex(unicodes,function(t,k) - setmetatableindex(unicodes,nil) - for u, d in next, data.descriptions do - local n = d.name - if n then - t[n] = u - end - end - return rawget(t,k) - end) - end - constructors.addcoreunicodes(unicodes) -- do we really need this? -end - -local function afmtotfm(specification) - local afmname = specification.filename or specification.name - if specification.forced == "afm" or specification.format == "afm" then -- move this one up - if trace_loading then - report_afm("forcing afm format for %a",afmname) - end - else - local tfmname = findbinfile(afmname,"ofm") or "" - if tfmname ~= "" then - if trace_loading then - report_afm("fallback from afm to tfm for %a",afmname) - end - return -- just that - end - end - if afmname ~= "" then - -- weird, isn't this already done then? - local features = constructors.checkedfeatures("afm",specification.features.normal) - specification.features.normal = features - constructors.hashinstance(specification,true) -- also weird here - -- - specification = definers.resolve(specification) -- new, was forgotten - local cache_id = specification.hash - local tfmdata = containers.read(constructors.cache, cache_id) -- cache with features applied - if not tfmdata then - local rawdata = afm.load(afmname) - if rawdata and next(rawdata) then - addtables(rawdata) - adddimensions(rawdata) - tfmdata = copytotfm(rawdata) - if tfmdata and next(tfmdata) then - local shared = tfmdata.shared - if not shared then - shared = { } - tfmdata.shared = shared - end - shared.rawdata = rawdata - shared.features = features - shared.processes = afm.setfeatures(tfmdata,features) - end - elseif trace_loading then - report_afm("no (valid) afm file found with name %a",afmname) - end - tfmdata = containers.write(constructors.cache,cache_id,tfmdata) - end - return tfmdata - end -end - ---[[ldx-- -<p>As soon as we could intercept the <l n='tfm'/> reader, I implemented an -<l n='afm'/> reader. Since traditional <l n='pdftex'/> could use <l n='opentype'/> -fonts with <l n='afm'/> companions, the following method also could handle -those cases, but now that we can handle <l n='opentype'/> directly we no longer -need this features.</p> ---ldx]]-- - -local function read_from_afm(specification) - local tfmdata = afmtotfm(specification) - if tfmdata then - tfmdata.properties.name = specification.name - tfmdata = constructors.scale(tfmdata, specification) - local allfeatures = tfmdata.shared.features or specification.features.normal - constructors.applymanipulators("afm",tfmdata,allfeatures,trace_features,report_afm) - fonts.loggers.register(tfmdata,'afm',specification) - end - return tfmdata -end - ---[[ldx-- -<p>Here comes the implementation of a few features. We only implement -those that make sense for this format.</p> ---ldx]]-- - -local function prepareligatures(tfmdata,ligatures,value) - if value then - local descriptions = tfmdata.descriptions - local hasligatures = false - for unicode, character in next, tfmdata.characters do - local description = descriptions[unicode] - local dligatures = description.ligatures - if dligatures then - local cligatures = character.ligatures - if not cligatures then - cligatures = { } - character.ligatures = cligatures - end - for unicode, ligature in next, dligatures do - cligatures[unicode] = { - char = ligature, - type = 0 - } - end - hasligatures = true - end - end - tfmdata.properties.hasligatures = hasligatures - end -end - -local function preparekerns(tfmdata,kerns,value) - if value then - local rawdata = tfmdata.shared.rawdata - local resources = rawdata.resources - local unicodes = resources.unicodes - local descriptions = tfmdata.descriptions - local haskerns = false - for u, chr in next, tfmdata.characters do - local d = descriptions[u] - local newkerns = d[kerns] - if newkerns then - local kerns = chr.kerns - if not kerns then - kerns = { } - chr.kerns = kerns - end - for k,v in next, newkerns do - local uk = unicodes[k] - if uk then - kerns[uk] = v - end - end - haskerns = true - end - end - tfmdata.properties.haskerns = haskerns - end -end - -local list = { - -- [0x0022] = 0x201D, - [0x0027] = 0x2019, - -- [0x0060] = 0x2018, -} - -local function texreplacements(tfmdata,value) - local descriptions = tfmdata.descriptions - local characters = tfmdata.characters - for k, v in next, list do - characters [k] = characters [v] -- we forget about kerns - descriptions[k] = descriptions[v] -- we forget about kerns - end -end - -local function ligatures (tfmdata,value) prepareligatures(tfmdata,'ligatures', value) end -local function texligatures(tfmdata,value) prepareligatures(tfmdata,'texligatures',value) end -local function kerns (tfmdata,value) preparekerns (tfmdata,'kerns', value) end -local function extrakerns (tfmdata,value) preparekerns (tfmdata,'extrakerns', value) end - -registerafmfeature { - name = "liga", - description = "traditional ligatures", - initializers = { - base = ligatures, - node = ligatures, - } -} - -registerafmfeature { - name = "kern", - description = "intercharacter kerning", - initializers = { - base = kerns, - node = kerns, - } -} - -registerafmfeature { - name = "extrakerns", - description = "additional intercharacter kerning", - initializers = { - base = extrakerns, - node = extrakerns, - } -} - -registerafmfeature { - name = 'tlig', - description = 'tex ligatures', - initializers = { - base = texligatures, - node = texligatures, - } -} - -registerafmfeature { - name = 'trep', - description = 'tex replacements', - initializers = { - base = texreplacements, - node = texreplacements, - } -} - --- readers - -fonts.formats.afm = "type1" -fonts.formats.pfb = "type1" - -local function check_afm(specification,fullname) - local foundname = findbinfile(fullname, 'afm') or "" -- just to be sure - if foundname == "" then - foundname = fonts.names.getfilename(fullname,"afm") or "" - end - if foundname == "" and afm.autoprefixed then - local encoding, shortname = match(fullname,"^(.-)%-(.*)$") -- context: encoding-name.* - if encoding and shortname and fonts.encodings.known[encoding] then - shortname = findbinfile(shortname,'afm') or "" -- just to be sure - if shortname ~= "" then - foundname = shortname - if trace_defining then - report_afm("stripping encoding prefix from filename %a",afmname) - end - end - end - end - if foundname ~= "" then - specification.filename = foundname - specification.format = "afm" - return read_from_afm(specification) - end -end - -function readers.afm(specification,method) - local fullname, tfmdata = specification.filename or "", nil - if fullname == "" then - local forced = specification.forced or "" - if forced ~= "" then - tfmdata = check_afm(specification,specification.name .. "." .. forced) - end - if not tfmdata then - local check_tfm = readers.check_tfm - method = (check_tfm and (method or definers.method or "afm or tfm")) or "afm" - if method == "tfm" then - tfmdata = check_tfm(specification,specification.name) - elseif method == "afm" then - tfmdata = check_afm(specification,specification.name) - elseif method == "tfm or afm" then - tfmdata = check_tfm(specification,specification.name) or check_afm(specification,specification.name) - else -- method == "afm or tfm" or method == "" then - tfmdata = check_afm(specification,specification.name) or check_tfm(specification,specification.name) - end - end - else - tfmdata = check_afm(specification,fullname) - end - return tfmdata -end - -function readers.pfb(specification,method) -- only called when forced - local original = specification.specification - if trace_defining then - report_afm("using afm reader for %a",original) - end - specification.specification = gsub(original,"%.pfb",".afm") - specification.forced = "afm" - return readers.afm(specification,method) -end diff --git a/tex/context/base/mkiv/font-agl.lua b/tex/context/base/mkiv/font-agl.lua index ec6c519ee..49b85421f 100644 --- a/tex/context/base/mkiv/font-agl.lua +++ b/tex/context/base/mkiv/font-agl.lua @@ -6,7 +6,10 @@ if not modules then modules = { } end modules ['font-agl'] = { original = "Adobe Glyph List, version 2.0, September 20, 2002", } +local next = next + local allocate = utilities.storage.allocate +local mark = utilities.storage.mark fonts = fonts or { } local encodings = fonts.encodings or { } @@ -16,7 +19,7 @@ fonts.encodings.agl = agl table.setmetatableindex(agl,nil) -- prevent recursive lookups otherwise when autoloaded -local synonyms = { +local synonyms = allocate { Acyrillic = 0x0410, Becyrillic = 0x0411, Cdot = 0x010A, @@ -644,7 +647,13 @@ local names = agl.names local unicodes = agl.unicodes local ctxcodes = agl.ctxcodes -if not names then +if names then + + mark(names) + mark(unicodes) + mark(ctxcodes) + +else names = allocate { } -- filled from char-def.lua unicodes = allocate { } @@ -678,9 +687,9 @@ if not names then end if storage then - storage.register("encodings/names", names, "fonts.encodings.names") - storage.register("encodings/unicodes", unicodes, "fonts.encodings.unicodes") - storage.register("encodings/ctxcodes", ctxcodes, "fonts.encodings.ctxcodes") + storage.register("encodings/names", names, "fonts.encodings.agl.names") + storage.register("encodings/unicodes", unicodes, "fonts.encodings.agl.unicodes") + storage.register("encodings/ctxcodes", ctxcodes, "fonts.encodings.agl.ctxcodes") end end diff --git a/tex/context/base/mkiv/font-aux.lua b/tex/context/base/mkiv/font-aux.lua index fc6c90bc1..fcbcd6d32 100644 --- a/tex/context/base/mkiv/font-aux.lua +++ b/tex/context/base/mkiv/font-aux.lua @@ -6,7 +6,7 @@ if not modules then modules = { } end modules ['font-aux'] = { license = "see context related readme files" } -local tonumber, type = tonumber, type +local tonumber, type, next = tonumber, type, next ----- wrap, yield = coroutine.wrap, coroutine.yield local fonts, font = fonts, font diff --git a/tex/context/base/mkiv/font-cft.lua b/tex/context/base/mkiv/font-cft.lua index 63c056022..30221cbaa 100644 --- a/tex/context/base/mkiv/font-cft.lua +++ b/tex/context/base/mkiv/font-cft.lua @@ -7,18 +7,20 @@ if not modules then modules = { } end modules ['font-cft'] = { } -- context font tables - +-- -- todo: extra: -- -- extra_space => space.extra -- space => space.width -- space_stretch => space.stretch -- space_shrink => space.shrink - +-- -- We do keep the x-height, extra_space, space_shrink and space_stretch -- around as these are low level official names. +-- +-- Needs to be checked and updated. -local type = type +local type, tonumber = type, tonumber local fonts = fonts or { } local tables = fonts.tables or { } diff --git a/tex/context/base/mkiv/font-chk.lua b/tex/context/base/mkiv/font-chk.lua index d9e88c91e..3613432c1 100644 --- a/tex/context/base/mkiv/font-chk.lua +++ b/tex/context/base/mkiv/font-chk.lua @@ -10,12 +10,18 @@ if not modules then modules = { } end modules ['font-chk'] = { -- move to the nodes namespace local next = next +local floor = math.floor + +local context = context local formatters = string.formatters local bpfactor = number.dimenfactors.bp local fastcopy = table.fastcopy +local sortedkeys = table.sortedkeys +local sortedhash = table.sortedhash -local report_fonts = logs.reporter("fonts","checking") -- replace +local report = logs.reporter("fonts") +local report_checking = logs.reporter("fonts","checking") local allocate = utilities.storage.allocate @@ -28,6 +34,9 @@ local fonthashes = fonts.hashes local fontdata = fonthashes.identifiers local fontcharacters = fonthashes.characters +local currentfont = font.current +local addcharacters = font.addcharacters + local helpers = fonts.helpers local addprivate = helpers.addprivate @@ -52,7 +61,7 @@ local implement = interfaces.implement local glyph_code = nodes.nodecodes.glyph -local new_special = nodes.pool.special +local new_special = nodes.pool.special -- todo: literal local hpack_node = node.hpack local nuts = nodes.nuts @@ -62,7 +71,6 @@ local tonode = nuts.tonode local getfont = nuts.getfont local getchar = nuts.getchar -local setfield = nuts.setfield local setchar = nuts.setchar local traverse_id = nuts.traverse_id @@ -78,7 +86,11 @@ local action = false local function onetimemessage(font,char,message) -- char == false returns table local tfmdata = fontdata[font] - local shared = tfmdata.shared + local shared = tfmdata.shared + if not shared then + shared = { } + tfmdata.shared = shared + end local messages = shared.messages if not messages then messages = { } @@ -90,10 +102,14 @@ local function onetimemessage(font,char,message) -- char == false returns table messages[message] = category end if char == false then - return table.sortedkeys(category) - elseif not category[char] then - report_fonts("char %C in font %a with id %a: %s",char,tfmdata.properties.fullname,font,message) - category[char] = true + return sortedkeys(category), category + end + local cc = category[char] + if not cc then + report_checking("char %C in font %a with id %a: %s",char,tfmdata.properties.fullname,font,message) + category[char] = 1 + else + category[char] = cc + 1 end end @@ -180,13 +196,13 @@ local variants = allocate { { tag = "yellow", r = .6, g = .6, b = 0 }, } -local pdf_blob = "pdf: q %0.6F 0 0 %0.6F 0 0 cm %s %s %s rg %s %s %s RG 10 M 1 j 1 J 0.05 w %s Q" +local pdf_blob = "pdf: q %.6F 0 0 %.6F 0 0 cm %s %s %s rg %s %s %s RG 10 M 1 j 1 J 0.05 w %s Q" local cache = { } -- saves some tables but not that impressive local function missingtonode(tfmdata,character) - local commands = character.commands - local fake = hpack_node(new_special(commands[1][2])) + local commands = character.commands + local fake = hpack_node(new_special(commands[1][2])) -- todo: literal fake.width = character.width fake.height = character.height fake.depth = character.depth @@ -198,7 +214,11 @@ local function addmissingsymbols(tfmdata) -- we can have an alternative with rul local properties = tfmdata.properties local size = tfmdata.parameters.size local scale = size * bpfactor - local tonode = properties.finalized and missingtonode or nil + local tonode = nil + local collected = { } + if properties.finalized and not addcharacters then + tonode = missingtonode + end for i=1,#variants do local v = variants[i] local tag, r, g, b = v.tag, v.r, v.g, v.b @@ -207,7 +227,7 @@ local function addmissingsymbols(tfmdata) -- we can have an alternative with rul local name = fake.name local privatename = formatters["placeholder %s %s"](name,tag) if not hasprivate(tfmdata,privatename) then - local hash = formatters["%s_%s_%s_%s_%s_%s"](name,tag,r,g,b,size) + local hash = formatters["%s_%s_%1.3f_%1.3f_%1.3f_%i"](name,tag,r,g,b,floor(size)) local char = cache[hash] if not char then char = { @@ -220,10 +240,19 @@ local function addmissingsymbols(tfmdata) -- we can have an alternative with rul } cache[hash] = char end - addprivate(tfmdata, privatename, char) + local u = addprivate(tfmdata, privatename, char) + if not tonode then + collected[u] = char + end end end end + if #collected > 0 then + addcharacters(properties.id, { + type = "real", + characters = collected, + }) + end end registerotffeature { @@ -239,18 +268,19 @@ fonts.loggers.add_placeholders = function(id) addmissingsymbols(fontdata[ fonts.loggers.category_to_placeholder = mapping function commands.getplaceholderchar(name) - local id = font.current() + local id = currentfont() addmissingsymbols(fontdata[id]) context(getprivatenode(fontdata[id],name)) end -- todo in luatex: option to add characters (just slots, no kerns etc) +-- we can do that now so ... local function placeholder(font,char) local tfmdata = fontdata[font] local category = chardata[char].category local fakechar = mapping[category] - local slot = getprivateslot(font,fakechar) + local slot = getprivateslot(font,fakechar) if not slot then addmissingsymbols(tfmdata) slot = getprivateslot(font,fakechar) @@ -268,9 +298,9 @@ function checkers.missing(head) local char = getchar(n) if font ~= lastfont then characters = fontcharacters[font] - lastfont = font + lastfont = font end - if not characters[char] and is_character[chardata[char].category] then + if font > 0 and not characters[char] and is_character[chardata[char].category] then if action == "remove" then onetimemessage(font,char,"missing (will be deleted)") elseif action == "replace" then @@ -318,9 +348,9 @@ local relevant = { local function getmissing(id) if id then - local list = getmissing(font.current()) + local list = getmissing(currentfont()) if list then - local _, list = next(getmissing(font.current())) + local _, list = next(getmissing(currentfont())) return list else return { } @@ -328,73 +358,91 @@ local function getmissing(id) else local t = { } for id, d in next, fontdata do - local shared = d.shared - local messages = shared.messages + local shared = d.shared + local messages = shared and shared.messages if messages then - local tf = t[d.properties.filename] or { } + local filename = d.properties.filename + local tf = t[filename] or { } for i=1,#relevant do local tm = messages[relevant[i]] if tm then - tf = table.merged(tf,tm) + for k, v in next, tm do + tf[k] = (tf[k] or 0) + v + end end end if next(tf) then - t[d.properties.filename] = tf + t[filename] = tf end end end + local l = { } for k, v in next, t do - t[k] = table.sortedkeys(v) + l[k] = sortedkeys(v) end - return t + return l, t end end checkers.getmissing = getmissing -local tracked = false -trackers.register("fonts.missing", function(v) - if v then - enableaction("processors","fonts.checkers.missing") - tracked = true - else - disableaction("processors","fonts.checkers.missing") - end - if v == "replace" then - otffeatures.defaults.missing = true - end - action = v -end) - -local report_characters = logs.reporter("fonts","characters") -local report_character = logs.reporter("missing") - -local logsnewline = logs.newline -local logspushtarget = logs.pushtarget -local logspoptarget = logs.poptarget - -luatex.registerstopactions(function() - if tracked then - local collected = checkers.getmissing() - if next(collected) then - logspushtarget("logfile") - for filename, list in table.sortedhash(collected) do - logsnewline() - report_characters("start missing characters: %s",filename) - logsnewline() - for i=1,#list do - local u = list[i] - report_character("%U %c %s",u,u,chardata[u].description) - end - logsnewline() - report_characters("stop missing characters") - logsnewline() +do + + local reported = true + local tracked = false + + callback.register("glyph_not_found",function(font,char) + if font > 0 then + if char > 0 then + onetimemessage(font,char,"missing") + else + -- we have a special case end - logspoptarget() + elseif not reported then + report("nullfont is used, maybe no bodyfont is defined") + reported = true end - end -end) + end) + + trackers.register("fonts.missing", function(v) + if v then + enableaction("processors","fonts.checkers.missing") + tracked = true + else + disableaction("processors","fonts.checkers.missing") + end + if v == "replace" then + otffeatures.defaults.missing = true + end + action = v + end) + + logs.registerfinalactions(function() +-- if tracked then + local collected, details = getmissing() + if next(collected) then + for filename, list in sortedhash(details) do + logs.startfilelogging(report,"missing characters",filename) + for u, v in sortedhash(list) do + report("%4i %U %c %s",v,u,u,chardata[u].description) + end + logs.stopfilelogging() + end + if logs.loggingerrors() then + for filename, list in sortedhash(details) do + logs.starterrorlogging(report,"missing characters",filename) + for u, v in sortedhash(list) do + report("%4i %U %c %s",v,u,u,chardata[u].description) + end + logs.stoperrorlogging() + end + end + end +-- end + end) + +end -- for the moment here @@ -459,7 +507,3 @@ local dummies_specification = { registerotffeature(dummies_specification) registerafmfeature(dummies_specification) - --- callback.register("char_exists",function(f,c) -- to slow anyway as called often so we should flag in tfmdata --- return true --- end) diff --git a/tex/context/base/mkiv/font-chk.mkiv b/tex/context/base/mkiv/font-chk.mkiv index 4c8967532..303acea43 100644 --- a/tex/context/base/mkiv/font-chk.mkiv +++ b/tex/context/base/mkiv/font-chk.mkiv @@ -13,7 +13,7 @@ \writestatus{loading}{ConTeXt Font Macros / Checking} -\registerctxluafile{font-chk}{1.001} +\registerctxluafile{font-chk}{} \tracinglostchars\zerocount diff --git a/tex/context/base/mkiv/font-cid.lua b/tex/context/base/mkiv/font-cid.lua index 0eaacdfbd..781bc9fec 100644 --- a/tex/context/base/mkiv/font-cid.lua +++ b/tex/context/base/mkiv/font-cid.lua @@ -1,6 +1,6 @@ if not modules then modules = { } end modules ['font-cid'] = { version = 1.001, - comment = "companion to font-otf.lua (cidmaps)", + comment = "companion to font-ini.mkiv", author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", copyright = "PRAGMA ADE / ConTeXt Development Team", license = "see context related readme files" diff --git a/tex/context/base/mkiv/font-col.lua b/tex/context/base/mkiv/font-col.lua index bce16fae7..8d3152df4 100644 --- a/tex/context/base/mkiv/font-col.lua +++ b/tex/context/base/mkiv/font-col.lua @@ -13,9 +13,10 @@ local context, commands, trackers, logs = context, commands, trackers, logs local node, nodes, fonts, characters = node, nodes, fonts, characters local file, lpeg, table, string = file, lpeg, table, string -local type, next, toboolean = type, next, toboolean +local type, next, tonumber, toboolean = type, next, tonumber, toboolean local gmatch = string.gmatch local fastcopy = table.fastcopy +local formatters = string.formatters local nuts = nodes.nuts local tonut = nuts.tonut @@ -23,7 +24,6 @@ local tonut = nuts.tonut local getfont = nuts.getfont local getchar = nuts.getchar -local setfield = nuts.setfield local setfont = nuts.setfont local traverse_id = nuts.traverse_id @@ -47,9 +47,19 @@ collections.definitions = definitions local vectors = collections.vectors or { } collections.vectors = vectors -local fontdata = fonts.hashes.identifiers -local chardata = fonts.hashes.characters +local fonthashes = fonts.hashes +local fonthelpers = fonts.helpers + +local fontdata = fonthashes.identifiers +local fontquads = fonthashes.quads +local chardata = fonthashes.characters +local propdata = fonthashes.properties + +local addprivate = fonthelpers.addprivate +local hasprivate = fonthelpers.hasprivate + local currentfont = font.current +local addcharacters = font.addcharacters local fontpatternhassize = fonts.helpers.fontpatternhassize @@ -133,6 +143,7 @@ function collections.define(name,font,ranges,details) rscale = tonumber (details.rscale) or 1, force = toboolean(details.force,true), check = toboolean(details.check,true), + factor = tonumber(details.factor), features = details.features, } end @@ -172,6 +183,10 @@ function collections.clonevector(name) local cloneid = list[i] local oldchars = fontdata[current].characters local newchars = fontdata[cloneid].characters + local factor = definition.factor + if factor then + vector.factor = factor + end if trace_collecting then report_fonts("remapping font %a to %a for range %U - %U",current,cloneid,start,stop) end @@ -220,13 +235,15 @@ function collections.prepare(name) -- we can do this in lua now .. todo if vectors[current] then return end - if fontdata[current].mathparameters then + local properties = propdata[current] + local mathsize = properties.mathsize + if mathsize == 1 or mathsize == 2 or mathsize == 3 then return end local d = definitions[name] if d then if trace_collecting then - local filename = file.basename(fontdata[current].properties.filename or "?") + local filename = file.basename(properties.filename or "?") report_fonts("applying collection %a to %a, file %a",name,current,filename) end list = { } @@ -246,9 +263,6 @@ function collections.prepare(name) -- we can do this in lua now .. todo context.font_fallbacks_prepare_clone_vectors(name) context.font_fallbacks_stop_cloning() context.popcatcodes() -- context.protect() - elseif trace_collecting then - local filename = file.basename(fontdata[current].properties.filename or "?") - report_fonts("error while applying collection %a to %a, file %a",name,current,filename) end end @@ -258,6 +272,41 @@ function collections.report(message) end end +local function monoslot(font,char,parent,factor) + local tfmdata = fontdata[font] + local privatename = formatters["faked mono %s"](char) + local privateslot = hasprivate(tfmdata,privatename) + if privateslot then + return privateslot + else + local characters = tfmdata.characters + local properties = tfmdata.properties + local width = factor * fontquads[parent] + local character = characters[char] + if character then + local data = { + width = width, + height = character.height, + depth = character.depth, + commands = { + { "right", (width - character.width or 0)/2 }, + { "slot", 0, char } + } + } + local u = addprivate(tfmdata, privatename, data) + addcharacters(properties.id, { + type = "real", + characters = { + [u] = data + }, + } ) + return u + else + return char + end + end +end + function collections.process(head) -- this way we keep feature processing local done = false for n in traverse_char(tonut(head)) do @@ -279,12 +328,17 @@ function collections.process(head) -- this way we keep feature processing setfont(n,newfont,newchar) done = true else + local fakemono = vector.factor if trace_collecting then report_fonts("remapping font %a to %a for character %C%s", font,vect,char,not chardata[vect][char] and " (missing)" or "" ) end - setfont(n,vect) + if fakemono then + setfont(n,vect,monoslot(vect,char,font,fakemono)) + else + setfont(n,vect) + end done = true end end diff --git a/tex/context/base/mkiv/font-col.mkvi b/tex/context/base/mkiv/font-col.mkvi index b13047e50..a9c461e44 100644 --- a/tex/context/base/mkiv/font-col.mkvi +++ b/tex/context/base/mkiv/font-col.mkvi @@ -26,7 +26,7 @@ \writestatus{loading}{ConTeXt Font Macros / Collections} -\registerctxluafile{font-col}{1.001} +\registerctxluafile{font-col}{} \unprotect diff --git a/tex/context/base/mkiv/font-con.lua b/tex/context/base/mkiv/font-con.lua index 85ac33a10..9cffa5927 100644 --- a/tex/context/base/mkiv/font-con.lua +++ b/tex/context/base/mkiv/font-con.lua @@ -8,12 +8,14 @@ if not modules then modules = { } end modules ['font-con'] = { -- some names of table entries will be changed (no _) -local next, tostring, rawget = next, tostring, rawget +local next, tostring, tonumber, rawget = next, tostring, tonumber, rawget local format, match, lower, gsub, find = string.format, string.match, string.lower, string.gsub, string.find local sort, insert, concat = table.sort, table.insert, table.concat local sortedkeys, sortedhash, serialize, fastcopy = table.sortedkeys, table.sortedhash, table.serialize, table.fastcopy local derivetable = table.derive local ioflush = io.flush +local round = math.round +local setmetatable, getmetatable, rawget, rawset = setmetatable, getmetatable, rawget, rawset local trace_defining = false trackers.register("fonts.defining", function(v) trace_defining = v end) local trace_scaling = false trackers.register("fonts.scaling", function(v) trace_scaling = v end) @@ -44,7 +46,7 @@ constructors.namemode = "fullpath" -- will be a function constructors.version = 1.01 constructors.cache = containers.define("fonts", "constructors", constructors.version, false) -constructors.privateoffset = 0xF0000 -- 0x10FFFF +constructors.privateoffset = 0xF0000 -- 0x10FFFF | context also uses privates: 0xE000-0xEFFF constructors.cacheintex = true -- so we see the original table in fonts.font @@ -89,6 +91,13 @@ function constructors.scaled(scaledpoints, designsize) -- handles designsize in end end +function constructors.getprivate(tfmdata) + local properties = tfmdata.properties + local private = properties.private + properties.private = private + 1 + return private +end + --[[ldx-- <p>Beware, the boundingbox is passed as reference so we may not overwrite it in the process; numbers are of course copies. Here 65536 equals 1pt. (Due to @@ -222,27 +231,87 @@ function constructors.trytosharefont(target,tfmdata) end end +-- function constructors.enhanceparameters(parameters) +-- local xheight = parameters.x_height +-- local quad = parameters.quad +-- local space = parameters.space +-- local stretch = parameters.space_stretch +-- local shrink = parameters.space_shrink +-- local extra = parameters.extra_space +-- local slant = parameters.slant +-- -- synonyms +-- parameters.xheight = xheight +-- parameters.spacestretch = stretch +-- parameters.spaceshrink = shrink +-- parameters.extraspace = extra +-- parameters.em = quad +-- parameters.ex = xheight +-- parameters.slantperpoint = slant +-- parameters.spacing = { +-- width = space, +-- stretch = stretch, +-- shrink = shrink, +-- extra = extra, +-- } +-- end + +local synonyms = { + exheight = "x_height", + xheight = "x_height", + ex = "x_height", + emwidth = "quad", + em = "quad", + spacestretch = "space_stretch", + stretch = "space_stretch", + spaceshrink = "space_shrink", + shrink = "space_shrink", + extraspace = "extra_space", + xspace = "extra_space", + slantperpoint = "slant", +} + function constructors.enhanceparameters(parameters) - local xheight = parameters.x_height - local quad = parameters.quad - local space = parameters.space - local stretch = parameters.space_stretch - local shrink = parameters.space_shrink - local extra = parameters.extra_space - local slant = parameters.slant - parameters.xheight = xheight - parameters.spacestretch = stretch - parameters.spaceshrink = shrink - parameters.extraspace = extra - parameters.em = quad - parameters.ex = xheight - parameters.slantperpoint = slant - parameters.spacing = { - width = space, - stretch = stretch, - shrink = shrink, - extra = extra, - } + local mt = getmetatable(parameters) + local getter = function(t,k) + if not k then + return nil + end + local s = synonyms[k] + if s then + return rawget(t,s) or (mt and mt[s]) or nil + end + if k == "spacing" then + return { + width = t.space, + stretch = t.space_stretch, + shrink = t.space_shrink, + extra = t.extra_space, + } + end + return mt and mt[k] or nil + end + local setter = function(t,k,v) + if not k then + return 0 + end + local s = synonyms[k] + if s then + rawset(t,s,v) + elseif k == "spacing" then + if type(v) == "table" then + rawset(t,"space",v.width or 0) + rawset(t,"space_stretch",v.stretch or 0) + rawset(t,"space_shrink",v.shrink or 0) + rawset(t,"extra_space",v.extra or 0) + end + else + rawset(t,k,v) + end + end + setmetatable(parameters, { + __index = getter, + __newindex = setter, + }) end local function mathkerns(v,vdelta) @@ -264,7 +333,7 @@ local psfake = 0 local function fixedpsname(psname,fallback) local usedname = psname if psname and psname ~= "" then - if find(psname," ") then + if find(psname," ",1,true) then usedname = gsub(psname,"[%s]+","-") else -- we assume that the name is sane enough (we might sanitize completely some day) @@ -322,7 +391,7 @@ function constructors.scale(tfmdata,specification) -- local mathsize = tonumber(specification.mathsize) or 0 local textsize = tonumber(specification.textsize) or scaledpoints - local forcedsize = tonumber(parameters.mathsize ) or 0 + local forcedsize = tonumber(parameters.mathsize ) or 0 -- can be set by the feature "mathsize" local extrafactor = tonumber(specification.factor ) or 1 if (mathsize == 2 or forcedsize == 2) and parameters.scriptpercentage then scaledpoints = parameters.scriptpercentage * textsize / 100 @@ -330,6 +399,8 @@ function constructors.scale(tfmdata,specification) scaledpoints = parameters.scriptscriptpercentage * textsize / 100 elseif forcedsize > 1000 then -- safeguard scaledpoints = forcedsize + else + -- in context x and xx also use mathsize end targetparameters.mathsize = mathsize -- context specific targetparameters.textsize = textsize -- context specific @@ -343,10 +414,6 @@ function constructors.scale(tfmdata,specification) local defaultdepth = resources.defaultdepth or 0 local units = parameters.units or 1000 -- - if target.fonts then - target.fonts = fastcopy(target.fonts) -- maybe we virtualize more afterwards - end - -- -- boundary keys are no longer needed as we now have a string 'right_boundary' -- that can be used in relevant tables (kerns and ligatures) ... not that I ever -- used them @@ -406,15 +473,9 @@ function constructors.scale(tfmdata,specification) -- expansion (hz) local expansion = parameters.expansion if expansion then - target.stretch = expansion.stretch - target.shrink = expansion.shrink - target.step = expansion.step - target.auto_expand = expansion.auto - end - -- protrusion - local protrusion = parameters.protrusion - if protrusion then - target.auto_protrude = protrusion.auto + target.stretch = expansion.stretch + target.shrink = expansion.shrink + target.step = expansion.step end -- widening local extendfactor = parameters.extendfactor or 0 @@ -440,7 +501,7 @@ function constructors.scale(tfmdata,specification) targetparameters.scaledpoints = askedscaledpoints -- local isvirtual = properties.virtualized or tfmdata.type == "virtual" - local hasquality = target.auto_expand or target.auto_protrude + local hasquality = parameters.expansion or parameters.protrusion local hasitalics = properties.hasitalics local autoitalicamount = properties.autoitalicamount local stackmath = not properties.nostackmath @@ -451,6 +512,13 @@ function constructors.scale(tfmdata,specification) local writingmode = properties.writingmode or "horizontal" local identity = properties.identity or "horizontal" -- + local vfonts = target.fonts + if vfonts and #vfonts > 0 then + target.fonts = fastcopy(vfonts) -- maybe we virtualize more afterwards + elseif isvirtual then + target.fonts = { { id = 0 } } -- catch error + end + -- if changed and not next(changed) then changed = false end @@ -486,7 +554,7 @@ function constructors.scale(tfmdata,specification) targetparameters.descender = delta * descender end -- - constructors.enhanceparameters(targetparameters) -- official copies for us + constructors.enhanceparameters(targetparameters) -- official copies for us, now virtual -- local protrusionfactor = (targetquad ~= 0 and 1000/targetquad) or 0 local scaledwidth = defaultwidth * hdelta @@ -549,10 +617,15 @@ function constructors.scale(tfmdata,specification) local chr, description, index if changed then local c = changed[unicode] - if c then - description = descriptions[c] or descriptions[unicode] or character - character = characters[c] or character - index = description.index or c + if c and c ~= unicode then + if c then + description = descriptions[c] or descriptions[unicode] or character + character = characters[c] or character + index = description.index or c + else + description = descriptions[unicode] or character + index = description.index or unicode + end else description = descriptions[unicode] or character index = description.index or unicode @@ -768,7 +841,7 @@ function constructors.scale(tfmdata,specification) local ok = false for i=1,#vc do local key = vc[i][1] - if key == "right" or key == "down" then + if key == "right" or key == "down" or key == "rule" then ok = true break end @@ -804,6 +877,21 @@ function constructors.scale(tfmdata,specification) -- constructors.trytosharefont(target,tfmdata) -- + -- catch inconsistencies + -- + local vfonts = target.fonts + if isvirtual then + if not vfonts or #vfonts == 0 then + target.fonts = { { id = 0 } } + end + elseif vfonts then + properties.virtualized = true + target.type = "virtual" + if #vfonts == 0 then + target.fonts = { { id = 0 } } + end + end + -- return target end @@ -827,16 +915,9 @@ function constructors.finalize(tfmdata) -- if not parameters.expansion then parameters.expansion = { - stretch = tfmdata.stretch or 0, - shrink = tfmdata.shrink or 0, - step = tfmdata.step or 0, - auto = tfmdata.auto_expand or false, - } - end - -- - if not parameters.protrusion then - parameters.protrusion = { - auto = auto_protrude + stretch = tfmdata.stretch or 0, + shrink = tfmdata.shrink or 0, + step = tfmdata.step or 0, } end -- @@ -940,8 +1021,6 @@ function constructors.finalize(tfmdata) tfmdata.stretch = nil tfmdata.shrink = nil tfmdata.step = nil - tfmdata.auto_expand = nil - tfmdata.auto_protrude = nil tfmdata.extend = nil tfmdata.slant = nil tfmdata.units = nil @@ -965,8 +1044,6 @@ function constructors.hashfeatures(specification) -- will be overloaded local features = specification.features if features then local t, n = { }, 0 --- inspect(features) --- for category, list in next, features do for category, list in sortedhash(features) do if next(list) then local hasher = hashmethods[category] @@ -1006,7 +1083,7 @@ hashmethods.normal = function(list) end --[[ldx-- -<p>In principle we can share tfm tables when we are in node for a font, but then +<p>In principle we can share tfm tables when we are in need for a font, but then we need to define a font switch as an id/attr switch which is no fun, so in that case users can best use dynamic features ... so, we will not use that speedup. Okay, when we get rid of base mode we can optimize even further by sharing, but then we @@ -1020,13 +1097,15 @@ function constructors.hashinstance(specification,force) specification.hash = hash end if size < 1000 and designsizes[hash] then - size = math.round(constructors.scaled(size,designsizes[hash])) - specification.size = size + size = round(constructors.scaled(size,designsizes[hash])) + else + size = round(size) end + specification.size = size if fallbacks then - return hash .. ' @ ' .. tostring(size) .. ' @ ' .. fallbacks + return hash .. ' @ ' .. size .. ' @ ' .. fallbacks else - return hash .. ' @ ' .. tostring(size) + return hash .. ' @ ' .. size end end @@ -1235,11 +1314,13 @@ do if not enhancers then - local actions = allocate() - local before = allocate() - local after = allocate() - local order = allocate() - local patches = { before = before, after = after } + local actions = allocate() -- no need to allocate thee + local before = allocate() + local after = allocate() + local order = allocate() + local known = { } + local nofsteps = 0 + local patches = { before = before, after = after } local trace = false local report = logs.reporter("fonts",format .. " enhancing") @@ -1265,7 +1346,7 @@ do report("%s enhancing file %a","start",filename) end ioflush() -- we want instant messages - for e=1,#order do + for e=1,nofsteps do local enhancer = order[e] local b = before[enhancer] if b then @@ -1275,7 +1356,7 @@ do end end end - enhance(enhancer,data,filename,raw) + enhance(enhancer,data,filename,raw) -- we have one installed: check extra features local a = after[enhancer] if a then for pattern, action in next, a do @@ -1297,7 +1378,9 @@ do if actions[what] then -- overloading, e.g."check extra features" else - order[#order+1] = what + nofsteps = nofsteps + 1 + order[nofsteps] = what + known[what] = nofsteps end actions[what] = action else @@ -1305,7 +1388,19 @@ do end end - -- fonts.constructors.otf.enhancers.patch("before","migrate metadata","cambria",function() end) + -- We used to have a lot of enhancers but no longer with the new font loader. The order of enhancers + -- is the order of definition. The before/after patches are there for old times sake and happen + -- before or after a (named) enhancer. An example of a set enhancer is "check extra features" so one + -- one set patches before or after that is applied. Unknown enhancers are auto-registered. It's a bit + -- messy but we keep it for compatibility reasons. + -- + -- fonts.handlers.otf.enhancers.patches.register("before","some patches","somefont",function(data,filename) + -- print("!!!!!!!") -- before | after + -- end) + -- + -- fonts.handlers.otf.enhancers.register("more patches",function(data,filename) + -- print("???????") -- enhance + -- end) local function patch(what,where,pattern,action) local pw = patches[what] @@ -1314,7 +1409,12 @@ do if ww then ww[pattern] = action else - pw[where] = { [pattern] = action} + pw[where] = { [pattern] = action } + if not known[where] then + nofsteps = nofsteps + 1 + order[nofsteps] = where + known[where] = nofsteps + end end end end @@ -1323,7 +1423,11 @@ do register = register, apply = apply, patch = patch, - patches = { register = patch }, -- for old times sake + report = report, + patches = { + register = patch, + report = report, + }, -- for old times sake } handler.enhancers = enhancers diff --git a/tex/context/base/mkiv/font-ctx.lua b/tex/context/base/mkiv/font-ctx.lua index 578babc75..bc562d0d0 100644 --- a/tex/context/base/mkiv/font-ctx.lua +++ b/tex/context/base/mkiv/font-ctx.lua @@ -17,7 +17,7 @@ local context, commands = context, commands local format, gmatch, match, find, lower, upper, gsub, byte, topattern = string.format, string.gmatch, string.match, string.find, string.lower, string.upper, string.gsub, string.byte, string.topattern local concat, serialize, sort, fastcopy, mergedtable = table.concat, table.serialize, table.sort, table.fastcopy, table.merged local sortedhash, sortedkeys, sequenced = table.sortedhash, table.sortedkeys, table.sequenced -local settings_to_hash, hash_to_string = utilities.parsers.settings_to_hash, utilities.parsers.hash_to_string +local settings_to_hash, hash_to_string, settings_to_array = utilities.parsers.settings_to_hash, utilities.parsers.hash_to_string, utilities.parsers.settings_to_array local formatcolumns = utilities.formatters.formatcolumns local mergehashes = utilities.parsers.mergehashes local formatters = string.formatters @@ -37,12 +37,12 @@ local trace_mapfiles = false trackers.register("fonts.mapfiles", functio local trace_automode = false trackers.register("fonts.automode", function(v) trace_automode = v end) local trace_merge = false trackers.register("fonts.merge", function(v) trace_merge = v end) +local report = logs.reporter("fonts") local report_features = logs.reporter("fonts","features") local report_cummulative = logs.reporter("fonts","cummulative") local report_defining = logs.reporter("fonts","defining") local report_status = logs.reporter("fonts","status") local report_mapfiles = logs.reporter("fonts","mapfiles") -local report_newline = logs.newline local setmetatableindex = table.setmetatableindex @@ -75,8 +75,6 @@ local aglunicodes = nil -- delayed loading local nuts = nodes.nuts local tonut = nuts.tonut -local getfield = nuts.getfield -local setfield = nuts.setfield local getattr = nuts.getattr local setattr = nuts.setattr local getprop = nuts.getprop @@ -160,7 +158,7 @@ helpers.name = getfontname local addformatter = utilities.strings.formatters.add -if _LUAVERSION < 5.2 then +if LUAVERSION < 5.2 then addformatter(formatters,"font:name", [["'"..fontname(%s).."'"]], "local fontname = fonts.helpers.name") addformatter(formatters,"font:features",[["'"..sequenced(%s," ",true).."'"]],"local sequenced = table.sequenced") @@ -587,9 +585,10 @@ local function presetcontext(name,parent,features) -- will go to con and shared if s then for k, v in next, s do -- no, as then we cannot overload: e.g. math,mathextra --- if features[k] == nil then +-- reverted, so we only take from parent when not set + if features[k] == nil then features[k] = v --- end + end end else -- just ignore an undefined one .. i.e. we can refer to not yet defined @@ -1057,7 +1056,6 @@ do -- else too many locals local scanboolean = scanners.boolean local setmacro = tokens.setters.macro - local scanners = interfaces.scanners -- function commands.definefont_one(str) @@ -1262,7 +1260,6 @@ do -- else too many locals -- -- characters[0x2007] = { width = characters[0x0030] and characters[0x0030].width or parameters.space } -- figure -- -- characters[0x2008] = { width = characters[0x002E] and characters[0x002E].width or parameters.space } -- period -- -- --- constructors.checkvirtualids(tfmdata) -- experiment, will become obsolete when slots can selfreference -- local id = definefont(tfmdata) -- csnames[id] = specification.cs -- tfmdata.properties.id = id @@ -1299,6 +1296,8 @@ do -- else too many locals -- stoptiming(fonts) -- end + local busy = false + scanners.definefont_two = function() local global = scanboolean() -- \ifx\fontclass\empty\s!false\else\s!true\fi @@ -1420,48 +1419,61 @@ do -- else too many locals -- setting the extra characters will move elsewhere local characters = tfmdata.characters local parameters = tfmdata.parameters + local properties = tfmdata.properties -- we use char0 as signal; cf the spec pdf can handle this (no char in slot) characters[0] = nil -- characters[0x00A0] = { width = parameters.space } -- characters[0x2007] = { width = characters[0x0030] and characters[0x0030].width or parameters.space } -- figure -- characters[0x2008] = { width = characters[0x002E] and characters[0x002E].width or parameters.space } -- period -- - constructors.checkvirtualids(tfmdata) -- experiment, will become obsolete when slots can selfreference local fallbacks = specification.fallbacks - if fallbacks and fallbacks ~= "" and tfmdata.properties.hasmath then + local mathsize = (mathsize == 1 or mathsize == 2 or mathsize == 3) and mathsize or nil -- can be unset so we test 1 2 3 + if fallbacks and fallbacks ~= "" and mathsize and not busy then + busy = true -- We need this ugly hack in order to resolve fontnames (at the \TEX end). Originally -- math was done in Lua after loading (plugged into aftercopying). -- - -- After tl 2017 I'll also do text falbacks this way (although backups there are done + -- After tl 2017 I'll also do text fallbacks this way (although backups there are done -- in a completely different way. + if trace_defining then + report_defining("defining %a, id %a, target %a, features %a / %a, fallbacks %a / %a, step %a", + name,id,nice_cs(cs),classfeatures,fontfeatures,classfallbacks,fontfallbacks,1) + end mathematics.resolvefallbacks(tfmdata,specification,fallbacks) context(function() + busy = false mathematics.finishfallbacks(tfmdata,specification,fallbacks) local id = definefont(tfmdata) csnames[id] = specification.cs - tfmdata.properties.id = id + properties.id = id definers.register(tfmdata,id) -- to be sure, normally already done texdefinefont(global,cs,id) constructors.cleanuptable(tfmdata) constructors.finalize(tfmdata) if trace_defining then - report_defining("defining %a, id %a, target %a, features %a / %a, fallbacks %a / %a", - name,id,nice_cs(cs),classfeatures,fontfeatures,classfallbacks,fontfallbacks) + report_defining("defining %a, id %a, target %a, features %a / %a, fallbacks %a / %a, step %a", + name,id,nice_cs(cs),classfeatures,fontfeatures,classfallbacks,fontfallbacks,2) end -- resolved (when designsize is used): - local size = tfmdata.parameters.size or 655360 + local size = round(tfmdata.parameters.size or 655360) setmacro("somefontsize",size.."sp") -- ctx_setsomefontsize(size .. "sp") texsetcount("scaledfontsize",size) lastfontid = id -- + if trace_defining then + report_defining("memory usage after: %s",statistics.memused()) + report_defining("stop stage two") + end + -- texsetcount("global","lastfontid",lastfontid) specifiers[lastfontid] = { str, size } if not mathsize then - -- forget about it + -- forget about it (can't happen here) elseif mathsize == 0 then - lastmathids[1] = lastfontid + -- can't happen (here) else + -- maybe only 1 2 3 (we already test for this) lastmathids[mathsize] = lastfontid end stoptiming(fonts) @@ -1470,17 +1482,17 @@ do -- else too many locals else local id = definefont(tfmdata) csnames[id] = specification.cs - tfmdata.properties.id = id + properties.id = id definers.register(tfmdata,id) -- to be sure, normally already done texdefinefont(global,cs,id) constructors.cleanuptable(tfmdata) constructors.finalize(tfmdata) if trace_defining then - report_defining("defining %a, id %a, target %a, features %a / %a, fallbacks %a / %a", - name,id,nice_cs(cs),classfeatures,fontfeatures,classfallbacks,fontfallbacks) + report_defining("defining %a, id %a, target %a, features %a / %a, fallbacks %a / %a, step %a", + name,id,nice_cs(cs),classfeatures,fontfeatures,classfallbacks,fontfallbacks,"-") end -- resolved (when designsize is used): - local size = tfmdata.parameters.size or 655360 + local size = round(tfmdata.parameters.size or 655360) setmacro("somefontsize",size.."sp") -- ctx_setsomefontsize(size .. "sp") texsetcount("scaledfontsize",size) @@ -1494,7 +1506,7 @@ do -- else too many locals csnames[tfmdata] = specification.cs texdefinefont(global,cs,tfmdata) -- resolved (when designsize is used): - local size = fontdata[tfmdata].parameters.size or 0 + local size = round(fontdata[tfmdata].parameters.size or 0) -- ctx_setsomefontsize(size .. "sp") setmacro("somefontsize",size.."sp") texsetcount("scaledfontsize",size) @@ -1515,8 +1527,9 @@ do -- else too many locals if not mathsize then -- forget about it elseif mathsize == 0 then - lastmathids[1] = lastfontid + -- can't happen (here) else + -- maybe only 1 2 3 lastmathids[mathsize] = lastfontid end -- @@ -1595,7 +1608,6 @@ do -- else too many locals end return tfmdata, fontdata[tfmdata] else - constructors.checkvirtualids(tfmdata) -- experiment, will become obsolete when slots can selfreference local id = definefont(tfmdata) tfmdata.properties.id = id definers.register(tfmdata,id) @@ -1655,11 +1667,20 @@ do -- else too many locals function fonts.infofont() if infofont == 0 then - infofont = definers.define { name = "dejavusansmono", size = tex.sp("6pt") } + infofont = definers.define { name = "dejavusansmono", size = texsp("6pt") } end return infofont end + -- abstract interfacing + + implement { name = "tf", actions = function() setmacro("fontalternative","tf") end } + implement { name = "bf", actions = function() setmacro("fontalternative","bf") end } + implement { name = "it", actions = function() setmacro("fontalternative","it") end } + implement { name = "sl", actions = function() setmacro("fontalternative","sl") end } + implement { name = "bi", actions = function() setmacro("fontalternative","bi") end } + implement { name = "bs", actions = function() setmacro("fontalternative","bs") end } + end local enable_auto_r_scale = false @@ -1704,7 +1725,7 @@ function constructors.calculatescale(tfmdata,scaledpoints,relativeid,specificati -- scaledpoints = rscale * scaledpoints -- end -- end - return scaledpoints, delta + return round(scaledpoints), round(delta) end local designsizes = constructors.designsizes @@ -1722,17 +1743,19 @@ function constructors.hashinstance(specification,force) end if size < 1000 and designsizes[hash] then size = round(constructors.scaled(size,designsizes[hash])) - specification.size = size + else + size = round(size) end + specification.size = size if fallbacks then - return hash .. ' @ ' .. tostring(size) .. ' @ ' .. fallbacks + return hash .. ' @ ' .. size .. ' @ ' .. fallbacks else local scalemode = specification.scalemode local special = scalemode and specialscale[scalemode] if special then - return hash .. ' @ ' .. tostring(size) .. ' @ ' .. special + return hash .. ' @ ' .. size .. ' @ ' .. special else - return hash .. ' @ ' .. tostring(size) + return hash .. ' @ ' .. size end end end @@ -1774,7 +1797,7 @@ function definers.resolve(specification) -- overload function in font-con.lua end -- so far for goodie hacks local hash = hashfeatures(specification) - local name = specification.name + local name = specification.name or "badfont" local sub = specification.sub if sub and sub ~= "" then specification.hash = lower(name .. " @ " .. sub .. ' @ ' .. hash) @@ -2094,29 +2117,27 @@ function loggers.reportdefinedfonts() local parameters = data.parameters or { } tn = tn + 1 t[tn] = { - format("%03i",id or 0), - format("%09i",parameters.size or 0), - properties.type or "real", - properties.format or "unknown", - properties.name or "", - properties.psname or "", - properties.fullname or "", - properties.sharedwith or "", + formatters["%03i"](id or 0), + formatters["%p" ](parameters.size or 0), + properties.type or "real", + properties.format or "unknown", + properties.name or "", + properties.psname or "", + properties.fullname or "", + properties.sharedwith or "", } end formatcolumns(t," ") - logs.pushtarget("logfile") - report_newline() - report_status("defined fonts:") - report_newline() + -- + logs.startfilelogging(report,"defined fonts") for k=1,tn do - report_status(t[k]) + report(t[k]) end - logs.poptarget() + logs.stopfilelogging() end end -luatex.registerstopactions(loggers.reportdefinedfonts) +logs.registerfinalactions(loggers.reportdefinedfonts) function loggers.reportusedfeatures() -- numbers, setups, merged @@ -2131,18 +2152,15 @@ function loggers.reportusedfeatures() setup.number = n -- restore it (normally not needed as we're done anyway) end formatcolumns(t," ") - logs.pushtarget("logfile") - report_newline() - report_status("defined featuresets:") - report_newline() + logs.startfilelogging(report,"defined featuresets") for k=1,n do - report_status(t[k]) + report(t[k]) end - logs.poptarget() + logs.stopfilelogging() end end -luatex.registerstopactions(loggers.reportusedfeatures) +logs.registerfinalactions(loggers.reportusedfeatures) -- maybe move this to font-log.lua: @@ -2366,65 +2384,6 @@ dimenfactors.pct = nil to scale virtual characters.</p> --ldx]]-- --- in versions > 0.82 0 is supported as equivalent of self - -function constructors.checkvirtualids(tfmdata) - -- begin of experiment: we can use { "slot", 0, number } in virtual fonts - local fonts = tfmdata.fonts - local selfid = font.nextid() - if fonts and #fonts > 0 then - for i=1,#fonts do - local fi = fonts[i] - if fi[2] == 0 then - fi[2] = selfid - elseif fi.id == 0 then - fi.id = selfid - end - end - else - -- tfmdata.fonts = { "id", selfid } -- conflicts with other next id's (vf math), too late anyway - end - -- end of experiment -end - --- function constructors.getvirtualid(tfmdata) --- -- since we don't know the id yet, we use 0 as signal --- local tf = tfmdata.fonts --- if not tf then --- local properties = tfmdata.properties --- if properties then --- properties.virtualized = true --- else --- tfmdata.properties = { virtualized = true } --- end --- tf = { } --- tfmdata.fonts = tf --- end --- local ntf = #tf + 1 --- tf[ntf] = { id = 0 } --- return ntf --- end --- --- function constructors.checkvirtualid(tfmdata, id) -- will go --- local properties = tfmdata.properties --- if tfmdata and tfmdata.type == "virtual" or (properties and properties.virtualized) then --- local vfonts = tfmdata.fonts --- if not vffonts or #vfonts == 0 then --- if properties then --- properties.virtualized = false --- end --- tfmdata.fonts = nil --- else --- for f=1,#vfonts do --- local fnt = vfonts[f] --- if fnt.id and fnt.id == 0 then --- fnt.id = id --- end --- end --- end --- end --- end - do local setmacro = tokens.setters.macro @@ -2587,25 +2546,7 @@ end -- a fontkern plug: -do - - local kerncodes = nodes.kerncodes - local copy_node = nuts.copy - local kern = nuts.pool.register(nuts.pool.kern()) - - setattr(kern,attributes.private('fontkern'),1) -- no gain in setprop as it's shared - - nodes.injections.installnewkern(function(k) - local c = copy_node(kern) - setfield(c,"kern",k) - return c - end) - - directives.register("fonts.injections.fontkern", function(v) - setsubtype(kern,v and kerncodes.fontkern or kerncodes.userkern) - end) - -end +-- nodes.injections.installnewkern(nuts.pool.fontkern) do @@ -2661,7 +2602,7 @@ do local unsetvalue = attributes.unsetvalue - local traverse_id = nuts.traverse_id + local traverse_char = nuts.traverse_char local a_color = attributes.private('color') local a_colormodel = attributes.private('colormodel') @@ -2690,7 +2631,7 @@ do if head then head = tonut(head) local model = getattr(head,a_colormodel) or 1 - for glyph in traverse_id(glyph_code,head) do + for glyph in traverse_char(head) do local a = getprop(glyph,a_state) if a then local name = colornames[a] @@ -2741,7 +2682,7 @@ do function methods.nocolor(head,font,attr) - for n in traverse_id(glyph_code,head) do + for n in traverse_char(head) do if not font or getfont(n) == font then setattr(n,a_color,unsetvalue) end @@ -3074,3 +3015,82 @@ do } end + +-- for the moment here (and not in font-con.lua): + +local identical = table.identical +local copy = table.copy +local fontdata = fonts.hashes.identifiers +local addcharacters = font.addcharacters + +-- This helper is mostly meant to add last-resort (virtual) characters +-- or runtime generated fonts (so we forget about features and such). It +-- will probably take a while before it get used. + +local trace_adding = false +local report_adding = logs.reporter("fonts","add characters") + +trackers.register("fonts.addcharacters",function(v) trace_adding = v end) + +if addcharacters then + + function fonts.constructors.addcharacters(id,list) + local newchar = list.characters + if newchar then + local data = fontdata[id] + local newfont = list.fonts + local oldchar = data.characters + local oldfont = data.fonts + addcharacters(id, { + characters = newchar, + fonts = newfont, + nomath = not data.properties.hasmath, + }) + -- this is just for tracing, as the assignment only uses the fonts list + -- and doesn't store it otherwise + if newfont then + if oldfont then + local oldn = #oldfont + local newn = #newfont + for n=1,newn do + local ok = false + local nf = newfont[n] + for o=1,oldn do + if identical(nf,oldfont[o]) then + ok = true + break + end + end + if not ok then + oldn = oldn + 1 + oldfont[oldn] = newfont[i] + end + end + else + data.fonts = newfont + end + end + -- this is because we need to know what goes on and also might + -- want to access character data + for u, c in next, newchar do + if trace_adding then + report_adding("adding character %U to font %!font:name!",u,id) + end + oldchar[u] = c + end + end + end + +else + function fonts.constructors.addcharacters(id,list) + report_adding("adding characters to %!font:name! is not yet supported",id) + end +end + +implement { + name = "addfontpath", + arguments = "string", + actions = function(list) + names.addruntimepath(settings_to_array(list)) + end +} diff --git a/tex/context/base/mkiv/font-def.lua b/tex/context/base/mkiv/font-def.lua index c8394badf..97d25f180 100644 --- a/tex/context/base/mkiv/font-def.lua +++ b/tex/context/base/mkiv/font-def.lua @@ -21,7 +21,6 @@ local trace_defining = false trackers .register("fonts.defining", function local directive_embedall = false directives.register("fonts.embedall", function(v) directive_embedall = v end) trackers.register("fonts.loading", "fonts.defining", "otf.loading", "afm.loading", "tfm.loading") -trackers.register("fonts.all", "fonts.*", "otf.*", "afm.*", "tfm.*") local report_defining = logs.reporter("fonts","defining") @@ -416,10 +415,6 @@ function definers.loadfont(specification) return tfmdata end -function constructors.checkvirtualids() - -- dummy in plain version -end - function constructors.readanddefine(name,size) -- no id -- maybe a dummy first local specification = definers.analyze(name,size) local method = specification.method @@ -433,7 +428,6 @@ function constructors.readanddefine(name,size) -- no id -- maybe a dummy first local tfmdata = definers.loadfont(specification) if tfmdata then tfmdata.properties.hash = hash - constructors.checkvirtualids(tfmdata) -- experiment, will become obsolete when slots can selfreference id = font.define(tfmdata) definers.register(tfmdata,id) else @@ -518,7 +512,7 @@ function definers.read(specification,size,id) -- id can be optional, name can al local properties = tfmdata.properties or { } local parameters = tfmdata.parameters or { } report_defining("using %a font with id %a, name %a, size %a, bytes %a, encoding %a, fullname %a, filename %a", - properties.format or "unknown", id, properties.name, parameters.size, properties.encodingbytes, + properties.format or "unknown", id or "-", properties.name, parameters.size, properties.encodingbytes, properties.encodingname, properties.fullname, basename(properties.filename)) end statistics.stoptiming(fonts) diff --git a/tex/context/base/mkiv/font-dsp.lua b/tex/context/base/mkiv/font-dsp.lua index b46e1b82c..02e5a7df6 100644 --- a/tex/context/base/mkiv/font-dsp.lua +++ b/tex/context/base/mkiv/font-dsp.lua @@ -52,7 +52,6 @@ if not modules then modules = { } end modules ['font-dsp'] = { -- multi-gig videos pass through our networks and storage and memory is abundant. local next, type = next, type -local bittest = bit32.btest local band = bit32.band local extract = bit32.extract local bor = bit32.bor @@ -273,7 +272,7 @@ local lookupnames = { -- local lookupstate = setmetatableindex(function(t,k) -- local v = { } -- for kk, vv in next, lookupbits do --- if bittest(k,kk) then +-- if band(k,kk) ~= 0 then -- v[vv] = true -- end -- end @@ -283,10 +282,10 @@ local lookupnames = { local lookupflags = setmetatableindex(function(t,k) local v = { - bittest(k,0x0008) and true or false, -- ignoremarks - bittest(k,0x0004) and true or false, -- ignoreligatures - bittest(k,0x0002) and true or false, -- ignorebaseglyphs - bittest(k,0x0001) and true or false, -- r2l + band(k,0x0008) ~= 0 and true or false, -- ignoremarks + band(k,0x0004) ~= 0 and true or false, -- ignoreligatures + band(k,0x0002) ~= 0 and true or false, -- ignorebaseglyphs + band(k,0x0001) ~= 0 and true or false, -- r2l } t[k] = v return v @@ -690,13 +689,13 @@ end local function readposition(f,format,mainoffset,getdelta) if format == 0 then - return + return false end -- a few happen often if format == 0x04 then local h = readshort(f) if h == 0 then - return + return true -- all zero else return { 0, 0, h, 0 } end @@ -705,7 +704,7 @@ local function readposition(f,format,mainoffset,getdelta) local x = readshort(f) local h = readshort(f) if x == 0 and h == 0 then - return + return true -- all zero else return { x, 0, h, 0 } end @@ -724,7 +723,7 @@ local function readposition(f,format,mainoffset,getdelta) skipshort(f,1) end if h == 0 then - return + return true -- all zero else return { 0, 0, h, 0 } end @@ -738,15 +737,15 @@ local function readposition(f,format,mainoffset,getdelta) -- .... -- end -- - local x = bittest(format,0x01) and readshort(f) or 0 -- x placement - local y = bittest(format,0x02) and readshort(f) or 0 -- y placement - local h = bittest(format,0x04) and readshort(f) or 0 -- h advance - local v = bittest(format,0x08) and readshort(f) or 0 -- v advance + local x = band(format,0x1) ~= 0 and readshort(f) or 0 -- x placement + local y = band(format,0x2) ~= 0 and readshort(f) or 0 -- y placement + local h = band(format,0x4) ~= 0 and readshort(f) or 0 -- h advance + local v = band(format,0x8) ~= 0 and readshort(f) or 0 -- v advance if format >= 0x10 then - local X = bittest(format,0x10) and skipshort(f) or 0 - local Y = bittest(format,0x20) and skipshort(f) or 0 - local H = bittest(format,0x40) and skipshort(f) or 0 - local V = bittest(format,0x80) and skipshort(f) or 0 + local X = band(format,0x10) ~= 0 and skipshort(f) or 0 + local Y = band(format,0x20) ~= 0 and skipshort(f) or 0 + local H = band(format,0x40) ~= 0 and skipshort(f) or 0 + local V = band(format,0x80) ~= 0 and skipshort(f) or 0 local s = skips[extract(format,4,4)] if s > 0 then skipshort(f,s) @@ -779,7 +778,7 @@ local function readposition(f,format,mainoffset,getdelta) end return { x, y, h, v } elseif x == 0 and y == 0 and h == 0 and v == 0 then - return + return true -- all zero else return { x, y, h, v } end @@ -1393,12 +1392,14 @@ function gsubhandlers.reversechainedcontextsingle(f,fontdata,lookupid,lookupoffs before = readcoveragearray(f,tableoffset,before,true) after = readcoveragearray(f,tableoffset,after,true) return { - coverage = { - format = "reversecoverage", -- reversesub - before = before, - current = current, - after = after, - replacements = replacements, + format = "reversecoverage", -- reversesub + rules = { + { + before = before, + current = current, + after = after, + replacements = replacements, + } } }, "reversechainedcontextsingle" else @@ -1463,10 +1464,10 @@ function gposhandlers.single(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofg local value = readposition(f,format,tableoffset,getdelta) local coverage = readcoverage(f,tableoffset+coverage) for index, newindex in next, coverage do - coverage[index] = value + coverage[index] = value -- will be packed and shared anyway end return { - format = "pair", + format = "single", coverage = coverage, } elseif subtype == 2 then @@ -1482,7 +1483,7 @@ function gposhandlers.single(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofg coverage[index] = values[newindex+1] end return { - format = "pair", + format = "single", coverage = coverage, } else @@ -1495,8 +1496,6 @@ end -- ValueFormat1 applies to the ValueRecord of the first glyph in each pair. ValueRecords for all first glyphs must use ValueFormat1. If ValueFormat1 is set to zero (0), the corresponding glyph has no ValueRecord and, therefore, should not be repositioned. -- ValueFormat2 applies to the ValueRecord of the second glyph in each pair. ValueRecords for all second glyphs must use ValueFormat2. If ValueFormat2 is set to null, then the second glyph of the pair is the “next” glyph for which a lookup should be performed. --- !!!!! this needs checking: when both false, we have no hit so then we might need to fall through - function gposhandlers.pair(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs) local tableoffset = lookupoffset + offset setposition(f,tableoffset) @@ -1519,9 +1518,9 @@ function gposhandlers.pair(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofgly local first = value[2] local second = value[3] if first or second then - hash[other] = { first, second } -- needs checking + hash[other] = { first, second or nil } -- needs checking else - hash[other] = nil + hash[other] = nil -- what if set, maybe warning end end end @@ -1555,7 +1554,7 @@ function gposhandlers.pair(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofgly local first = offsets[1] local second = offsets[2] if first or second then - hash[paired] = { first, second } + hash[paired] = { first, second or nil } else -- upto the next lookup for this combination end @@ -1589,18 +1588,27 @@ function gposhandlers.cursive(f,fontdata,lookupid,lookupoffset,offset,glyphs,nof local entry = readushort(f) local exit = readushort(f) records[i] = { - entry = entry ~= 0 and (tableoffset + entry) or false, - exit = exit ~= 0 and (tableoffset + exit ) or false, + -- entry = entry ~= 0 and (tableoffset + entry) or false, + -- exit = exit ~= 0 and (tableoffset + exit ) or nil, + entry ~= 0 and (tableoffset + entry) or false, + exit ~= 0 and (tableoffset + exit ) or nil, } end + -- slot 1 will become hash after loading and it must be unique because we + -- pack the tables (packed we turn the cc-* into a zero) + local cc = (fontdata.temporary.cursivecount or 0) + 1 + fontdata.temporary.cursivecount = cc + cc = "cc-" .. cc coverage = readcoverage(f,coverage) for i=1,nofrecords do local r = records[i] - -- slot 1 will become hash after loading (must be unique per lookup when packed) records[i] = { - 1, - readanchor(f,r.entry,getdelta) or nil, - readanchor(f,r.exit, getdelta) or nil, + -- 1, + cc, + -- readanchor(f,r.entry,getdelta) or false, + -- readanchor(f,r.exit, getdelta) or nil, + readanchor(f,r[1],getdelta) or false, + readanchor(f,r[2],getdelta) or nil, } end for index, newindex in next, coverage do @@ -2011,7 +2019,7 @@ do subtables[j] = offset + readushort(f) -- we can probably put lookupoffset here end -- which one wins? - local markclass = bittest(flagbits,0x0010) -- usemarkfilteringset + local markclass = band(flagbits,0x0010) ~= 0 -- usemarkfilteringset if markclass then markclass = readushort(f) -- + 1 end @@ -2037,8 +2045,8 @@ do local function resolvelookups(f,lookupoffset,fontdata,lookups,lookuptypes,lookuphandlers,what,tableoffset) - local sequences = fontdata.sequences or { } - local sublookuplist = fontdata.sublookups or { } + local sequences = fontdata.sequences or { } + local sublookuplist = fontdata.sublookups or { } fontdata.sequences = sequences fontdata.sublookups = sublookuplist local nofsublookups = #sublookuplist @@ -2053,6 +2061,8 @@ do local noflookups = #lookups local lookupprefix = sub(what,2,2) -- g[s|p][ub|os] -- + local usedlookups = false -- setmetatableindex("number") + -- for lookupid=1,noflookups do local lookup = lookups[lookupid] local lookuptype = lookup.type @@ -2063,7 +2073,7 @@ do local nofsubtables = #subtables local order = lookup.order local flags = lookup.flags - -- this is expected in th efont handler (faster checking) + -- this is expected in the font handler (faster checking) if flags[1] then flags[1] = "mark" end if flags[2] then flags[2] = "ligature" end if flags[3] then flags[3] = "base" end @@ -2091,10 +2101,11 @@ do local rules = step.rules if rules then for i=1,#rules do - local rule = rules[i] - local before = rule.before - local current = rule.current - local after = rule.after + local rule = rules[i] + local before = rule.before + local current = rule.current + local after = rule.after + local replacements = rule.replacements if before then for i=1,#before do before[i] = tohash(before[i]) @@ -2103,15 +2114,44 @@ do rule.before = reversed(before) end if current then - for i=1,#current do - current[i] = tohash(current[i]) + if replacements then + -- We have a reverse lookup and therefore only one current entry. We might need + -- to reverse the order in the before and after lists so that needs checking. + local first = current[1] + local hash = { } + local repl = { } + for i=1,#first do + local c = first[i] + hash[c] = true + repl[c] = replacements[i] + end + rule.current = { hash } + rule.replacements = repl + else + for i=1,#current do + current[i] = tohash(current[i]) + end end + else + -- weird lookup end if after then for i=1,#after do after[i] = tohash(after[i]) end end + if usedlookups then + local lookups = rule.lookups + if lookups then + for k, v in next, lookups do + if v then + for k, v in next, v do + usedlookups[v] = usedlookups[v] + 1 + end + end + end + end + end end end end @@ -2163,6 +2203,10 @@ do end end + if usedlookups then + report("used %s lookups: % t",what,sortedkeys(usedlookups)) + end + -- When we have a context, we have sublookups that resolve into lookups for which we need to -- know the type. We split the main lookuptable in two parts: sequences (the main lookups) -- and subtable lookups (simple specs with no features). We could keep them merged and might do @@ -2218,7 +2262,7 @@ do if d then nofsublookups = nofsublookups + 1 -- report("registering %i as sublookup %i",lookupid,nofsublookups) - h = { + local l = { index = nofsublookups, -- handy for tracing name = f_lookupname(lookupprefix,"d",lookupid+lookupidoffset), derived = true, -- handy for tracing @@ -2229,7 +2273,7 @@ do flags = d.flags, -- chain = d.chain, } - sublookuplist[nofsublookups] = copy(h) -- we repack later + sublookuplist[nofsublookups] = copy(l) -- we repack later sublookuphash[lookupid] = nofsublookups sublookupcheck[lookupid] = 1 h = nofsublookups @@ -2252,7 +2296,9 @@ do end end end +-- report("before : % t",rlookups[index]) rlookups[index] = noffound > 0 and found or false +-- report("after : % t",rlookups[index]) else rlookups[index] = false end @@ -2417,7 +2463,7 @@ do local length = readushort(f) local coverage = readushort(f) -- bit 8-15 of coverage: format 0 or 2 - local format = bit32.rshift(coverage,8) -- is this ok + local format = rshift(coverage,8) -- is this ok if format == 0 then local nofpairs = readushort(f) local searchrange = readushort(f) @@ -2457,7 +2503,6 @@ do }, nofsteps = 1, type = "gpos_pair", - -- type = "gpos_single", -- maybe better flags = { false, false, false, false }, order = { name }, features = { [name] = feature }, @@ -2493,12 +2538,12 @@ function readers.gdef(f,fontdata,specification) local tableoffset = datatable.offset setposition(f,tableoffset) local version = readulong(f) - local classoffset = tableoffset + readushort(f) - local attachmentoffset = tableoffset + readushort(f) -- used for bitmaps - local ligaturecarets = tableoffset + readushort(f) -- used in editors (maybe nice for tracing) - local markclassoffset = tableoffset + readushort(f) - local marksetsoffset = version >= 0x00010002 and (tableoffset + readushort(f)) - local varsetsoffset = version >= 0x00010003 and (tableoffset + readulong(f)) + local classoffset = readushort(f) + local attachmentoffset = readushort(f) -- used for bitmaps + local ligaturecarets = readushort(f) -- used in editors (maybe nice for tracing) + local markclassoffset = readushort(f) + local marksetsoffset = version >= 0x00010002 and readushort(f) or 0 + local varsetsoffset = version >= 0x00010003 and readulong(f) or 0 local glyphs = fontdata.glyphs local marks = { } local markclasses = setmetatableindex("table") @@ -2507,56 +2552,61 @@ function readers.gdef(f,fontdata,specification) fontdata.markclasses = markclasses fontdata.marksets = marksets -- class definitions - setposition(f,classoffset) - local classformat = readushort(f) - if classformat == 1 then - local firstindex = readushort(f) - local lastindex = firstindex + readushort(f) - 1 - for index=firstindex,lastindex do - local class = classes[readushort(f)] - if class == "mark" then - marks[index] = true - end - glyphs[index].class = class - end - elseif classformat == 2 then - local nofranges = readushort(f) - for i=1,nofranges do + if classoffset ~= 0 then + setposition(f,tableoffset + classoffset) + local classformat = readushort(f) + if classformat == 1 then local firstindex = readushort(f) - local lastindex = readushort(f) - local class = classes[readushort(f)] - if class then - for index=firstindex,lastindex do - glyphs[index].class = class - if class == "mark" then - marks[index] = true + local lastindex = firstindex + readushort(f) - 1 + for index=firstindex,lastindex do + local class = classes[readushort(f)] + if class == "mark" then + marks[index] = true + end + glyphs[index].class = class + end + elseif classformat == 2 then + local nofranges = readushort(f) + for i=1,nofranges do + local firstindex = readushort(f) + local lastindex = readushort(f) + local class = classes[readushort(f)] + if class then + for index=firstindex,lastindex do + glyphs[index].class = class + if class == "mark" then + marks[index] = true + end end end end end end -- mark classes - setposition(f,markclassoffset) - local classformat = readushort(f) - if classformat == 1 then - local firstindex = readushort(f) - local lastindex = firstindex + readushort(f) - 1 - for index=firstindex,lastindex do - markclasses[readushort(f)][index] = true - end - elseif classformat == 2 then - local nofranges = readushort(f) - for i=1,nofranges do + if markclassoffset ~= 0 then + setposition(f,tableoffset + markclassoffset) + local classformat = readushort(f) + if classformat == 1 then local firstindex = readushort(f) - local lastindex = readushort(f) - local class = markclasses[readushort(f)] + local lastindex = firstindex + readushort(f) - 1 for index=firstindex,lastindex do - class[index] = true + markclasses[readushort(f)][index] = true + end + elseif classformat == 2 then + local nofranges = readushort(f) + for i=1,nofranges do + local firstindex = readushort(f) + local lastindex = readushort(f) + local class = markclasses[readushort(f)] + for index=firstindex,lastindex do + class[index] = true + end end end end -- mark sets : todo: just make the same as class sets above - if marksetsoffset and marksetsoffset > tableoffset then -- zero offset means no table + if marksetsoffset ~= 0 then + marksetsoffset = tableoffset + marksetsoffset setposition(f,marksetsoffset) local format = readushort(f) if format == 1 then @@ -2576,9 +2626,9 @@ function readers.gdef(f,fontdata,specification) local factors = specification.factors - if (specification.variable or factors) and varsetsoffset and varsetsoffset > tableoffset then + if (specification.variable or factors) and varsetsoffset ~= 0 then - local regions, deltas = readvariationdata(f,varsetsoffset,factors) + local regions, deltas = readvariationdata(f,tableoffset+varsetsoffset,factors) -- setvariabledata(fontdata,"gregions",regions) @@ -2866,7 +2916,7 @@ local function readmathvariants(f,fontdata,offset) advance = readushort(f), } local flags = readushort(f) - if bittest(flags,0x0001) then + if band(flags,0x0001) ~= 0 then p.extender = 1 -- true end parts[i] = p @@ -3269,9 +3319,10 @@ function readers.stat(f,fontdata,specification) local values = { } setposition(f,tableoffset+axisoffset) for i=1,nofaxis do + local tag = readtag(f) axis[i] = { - tag = readtag(f), - name = lower(extras[readushort(f)]), + tag = tag, + name = lower(extras[readushort(f)] or tag), ordering = readushort(f), -- maybe gaps variants = { } } @@ -3291,7 +3342,7 @@ function readers.stat(f,fontdata,specification) local format = readushort(f) local index = readushort(f) + 1 local flags = readushort(f) - local name = lower(extras[readushort(f)]) + local name = lower(extras[readushort(f)] or "no name") local value = readfixed(f) local variant if format == 1 then diff --git a/tex/context/base/mkiv/font-emp.mkvi b/tex/context/base/mkiv/font-emp.mkvi index 8f87ff7a1..1b6d46798 100644 --- a/tex/context/base/mkiv/font-emp.mkvi +++ b/tex/context/base/mkiv/font-emp.mkvi @@ -62,6 +62,16 @@ \else \ifx\fontalternative\s!sl\bs \else \bf\fi\fi} +\unexpanded\def\normalitalicface % public + {\relax\ifx\fontalternative\s!tf\it + \else \ifx\fontalternative\s!bf\bi + \else \tf\fi\fi} + +\unexpanded\def\normalslantedface % public + {\relax\ifx\fontalternative\s!tf\sl + \else \ifx\fontalternative\s!bf\bs + \else \tf\fi\fi} + \unexpanded\def\normaltypeface % public {\relax \ifx\fontalternative\s!bi \it \else @@ -77,9 +87,11 @@ \ifx\fontalternative\s!bi \bf \else \emphasistypeface \fi\fi\fi\fi\fi} -\let\typeface\normaltypeface % public -\let\boldface\normalboldface % public -\let\swapface\swaptypeface % public +\let\typeface \normaltypeface % public +\let\boldface \normalboldface % public +\let\slantedface\normalslantedface % public +\let\italicface \normalitalicface % public +\let\swapface \swaptypeface % public %D To be set with the default body font environment: \type %D {em} being \type {slanted} or \type {italic}. diff --git a/tex/context/base/mkiv/font-enc.lua b/tex/context/base/mkiv/font-enc.lua index 1470f3b8d..f448685a6 100644 --- a/tex/context/base/mkiv/font-enc.lua +++ b/tex/context/base/mkiv/font-enc.lua @@ -13,6 +13,9 @@ local match, gmatch, gsub = string.match, string.gmatch, string.gsub local setmetatableindex = table.setmetatableindex +local allocate = utilities.storage.allocate +local mark = utilities.storage.mark + --[[ldx-- <p>Because encodings are going to disappear, we don't bother defining them in tables. But we may do so some day, for consistency.</p> @@ -25,7 +28,7 @@ fonts.encodings = encodings encodings.version = 1.03 encodings.cache = containers.define("fonts", "enc", fonts.encodings.version, true) -encodings.known = utilities.storage.allocate { -- sort of obsolete +encodings.known = allocate { -- sort of obsolete texnansi = true, ec = true, qx = true, @@ -152,7 +155,7 @@ if not encodings.agl then -- font is loaded for caching. Once we're further along the route we can also -- delay it in the generic version (which doesn't use this file). - encodings.agl = { } + encodings.agl = allocate { } setmetatableindex(encodings.agl, function(t,k) report_encoding("loading (extended) adobe glyph list") diff --git a/tex/context/base/mkiv/font-ext.lua b/tex/context/base/mkiv/font-ext.lua index 965b6e6dc..f9db5e0d9 100644 --- a/tex/context/base/mkiv/font-ext.lua +++ b/tex/context/base/mkiv/font-ext.lua @@ -7,9 +7,9 @@ if not modules then modules = { } end modules ['font-ext'] = { } local next, type, tonumber = next, type, tonumber -local formatters = string.formatters -local byte = string.byte +local byte, find, formatters = string.byte, string.find, string.formatters local utfchar = utf.char +local sortedhash, sortedkeys, sort = table.sortedhash, table.sortedkeys, table.sort local context = context local fonts = fonts @@ -37,8 +37,12 @@ local registerafmfeature = handlers.afm.features.register local fontdata = hashes.identifiers local fontproperties = hashes.properties +local constructors = fonts.constructors +local getprivate = constructors.getprivate + local allocate = utilities.storage.allocate local settings_to_array = utilities.parsers.settings_to_array +local settings_to_hash = utilities.parsers.settings_to_hash local getparameters = utilities.parsers.getparameters local gettexdimen = tex.getdimen local family_font = node.family_font @@ -46,6 +50,13 @@ local family_font = node.family_font local setmetatableindex = table.setmetatableindex local implement = interfaces.implement +local variables = interfaces.variables + + +local v_background = variables.background +local v_frame = variables.frame +local v_empty = variables.empty +local v_none = variables.none -- -- -- -- -- -- -- shared @@ -122,7 +133,6 @@ local function initializeexpansion(tfmdata,value) shrink = 10 * shrink, step = 10 * step, factor = factor, - auto = true, } local data = characters and characters.data for i, chr in next, tfmdata.characters do @@ -397,15 +407,6 @@ local function map_opbd_onto_protrusion(tfmdata,value,opbd) end end end - local parameters = tfmdata.parameters - local protrusion = tfmdata.protrusion - if not protrusion then - parameters.protrusion = { - auto = true - } - else - protrusion.auto = true - end end -- The opbd test is just there because it was discussed on the context development list. However, @@ -435,7 +436,6 @@ local function initializeprotrusion(tfmdata,value) factor = factor, left = left, right = right, - auto = true, } for i, chr in next, tfmdata.characters do local v, pl, pr = vector[i], nil, nil @@ -645,32 +645,41 @@ local function manipulatedimensions(tfmdata,key,value) local parameters = tfmdata.parameters local emwidth = parameters.quad local exheight = parameters.xheight - local width = 0 - local height = 0 - local depth = 0 + local newwidth = false + local newheight = false + local newdepth = false if value == "strut" then - height = gettexdimen("strutht") - depth = gettexdimen("strutdp") + newheight = gettexdimen("strutht") + newdepth = gettexdimen("strutdp") + elseif value == "mono" then + newwidth = emwidth else local spec = settings_to_array(value) - width = (spec[1] or 0) * emwidth - height = (spec[2] or 0) * exheight - depth = (spec[3] or 0) * exheight + newwidth = tonumber(spec[1]) + newheight = tonumber(spec[2]) + newdepth = tonumber(spec[3]) + if newwidth then newwidth = newwidth * emwidth end + if newheight then newheight = newheight * exheight end + if newdepth then newdepth = newdepth * exheight end end - if width > 0 then - local resources = tfmdata.resources + if newwidth or newheight or newdepth then local additions = { } - local private = resources.private for unicode, old_c in next, characters do - local oldwidth = old_c.width + local oldwidth = old_c.width + local oldheight = old_c.height + local olddepth = old_c.depth + local width = newwidth or oldwidth or 0 + local height = newheight or oldheight or 0 + local depth = newdepth or olddepth or 0 if oldwidth ~= width then -- Defining the tables in one step is more efficient -- than adding fields later. - private = private + 1 + local private = getprivate(tfmdata) local new_c local commands = { { "right", (width - oldwidth) / 2 }, { "slot", 1, private }, + -- { "slot", 0, private }, } if height > 0 then if depth > 0 then @@ -703,13 +712,12 @@ local function manipulatedimensions(tfmdata,key,value) end setmetatableindex(new_c,old_c) characters[unicode] = new_c - additions[private] = old_c + additions[private] = old_c end end for k, v in next, additions do characters[k] = v end - resources.private = private elseif height > 0 and depth > 0 then for unicode, old_c in next, characters do old_c.height = height @@ -739,6 +747,53 @@ local dimensions_specification = { registerotffeature(dimensions_specification) registerafmfeature(dimensions_specification) +-------------------------------------------------------------------------------------------------------------- + +-- local function fakemonospace(tfmdata) +-- local resources = tfmdata.resources +-- local gposfeatures = resources.features.gpos +-- local characters = tfmdata.characters +-- local descriptions = tfmdata.descriptions +-- local sequences = resources.sequences +-- local coverage = { } +-- local units = tfmdata.shared.rawdata.metadata.units +-- for k, v in next, characters do +-- local w = descriptions[k].width +-- local d = units - w +-- coverage[k] = { -d/2, 0, units, 0 } +-- end +-- local f = { dflt = { dflt = true } } +-- local s = #sequences + 1 +-- local t = { +-- features = { fakemono = f }, +-- flags = { false, false, false, false }, +-- index = s, +-- name = "p_s_" .. s, +-- nofsteps = 1, +-- order = { "fakemono" }, +-- skiphash = false, +-- type = "gpos_single", +-- steps = { +-- { +-- format = "single", +-- coverage = coverage, +-- } +-- } +-- } +-- gposfeatures["fakemono"] = f +-- sequences[s] = t +-- end +-- +-- fonts.constructors.features.otf.register { +-- name = "fakemono", +-- description = "fake monospaced", +-- initializers = { +-- node = fakemonospace, +-- }, +-- } + +-------------------------------------------------------------------------------------------------------------- + -- for zhichu chen (see mailing list archive): we might add a few more variants -- in due time -- @@ -748,79 +803,175 @@ registerafmfeature(dimensions_specification) -- -- \definecolor[DummyColor][s=.75,t=.5,a=1] {\DummyColor test} \nopdfcompression -- --- local gray = { "special", "pdf: /Tr1 gs .75 g" } --- local black = { "special", "pdf: /Tr0 gs 0 g" } +-- local gray = { "pdf", "origin", "/Tr1 gs .75 g" } +-- local black = { "pdf", "origin", "/Tr0 gs 0 g" } --- sort of obsolete as we now have \showglyphs + +-- boundingbox={yes|background|frame|empty|<color>} local push = { "push" } local pop = { "pop" } -local gray = { "special", "pdf: .75 g" } -local black = { "special", "pdf: 0 g" } -local downcache = { } -- handy for huge cjk fonts -local rulecache = { } -- handy for huge cjk fonts +----- gray = { "pdf", "origin", ".75 g .75 G" } +----- black = { "pdf", "origin", "0 g 0 G" } +----- gray = { "pdf", ".75 g" } +----- black = { "pdf", "0 g" } -setmetatableindex(downcache,function(t,d) - local v = { "down", d } - t[d] = v +-- local bp = number.dimenfactors.bp +-- +-- local downcache = setmetatableindex(function(t,d) +-- local v = { "down", d } +-- t[d] = v +-- return v +-- end) +-- +-- local backcache = setmetatableindex(function(t,h) +-- local h = h * bp +-- local v = setmetatableindex(function(t,w) +-- -- local v = { "rule", h, w } +-- local v = { "pdf", "origin", formatters["0 0 %.6F %.6F re F"](w*bp,h) } +-- t[w] = v +-- return v +-- end) +-- t[h] = v +-- return v +-- end) +-- +-- local forecache = setmetatableindex(function(t,h) +-- local h = h * bp +-- local v = setmetatableindex(function(t,w) +-- local v = { "pdf", "origin", formatters["%.6F w 0 0 %.6F %.6F re S"](0.25*65536*bp,w*bp,h) } +-- t[w] = v +-- return v +-- end) +-- t[h] = v +-- return v +-- end) + +local bp = number.dimenfactors.bp +local r = 16384 * bp -- 65536 // 4 + +local backcache = setmetatableindex(function(t,h) + local h = h * bp + local v = setmetatableindex(function(t,d) + local d = d * bp + local v = setmetatableindex(function(t,w) + local v = { "pdf", "origin", formatters["%.6F w 0 %.6F %.6F %.6F re f"](r,-d,w*bp,h+d) } + t[w] = v + return v + end) + t[d] = v + return v + end) + t[h] = v return v end) -setmetatableindex(rulecache,function(t,h) - local v = { } - t[h] = v - setmetatableindex(v,function(t,w) - local v = { "rule", h, w } - t[w] = v +local forecache = setmetatableindex(function(t,h) + local h = h * bp + local v = setmetatableindex(function(t,d) + local d = d * bp + local v = setmetatableindex(function(t,w) + -- the frame goes through the boundingbox + -- local v = { "pdf", "origin", formatters["[] 0 d 0 J %.6F w %.6F %.6F %.6F re S"](r,-d,w*bp,h+d) } + local v = { "pdf", "origin", formatters["[] 0 d 0 J %.6F w %.6F %.6F %.6F %.6F re S"](r,r/2,-d+r/2,w*bp-r,h+d-r) } + t[w] = v + return v + end) + t[d] = v return v end) + t[h] = v return v end) +local startcolor = nil +local stopcolor = nil + local function showboundingbox(tfmdata,key,value) if value then - local vfspecials = backends.pdf.tables.vfspecials - local gray = vfspecials and (vfspecials.rulecolors[value] or vfspecials.rulecolors.palegray) or gray + if not backcolors then + local vfspecials = backends.pdf.tables.vfspecials + startcolor = vfspecials.startcolor + stopcolor = vfspecials.stopcolor + end local characters = tfmdata.characters - local resources = tfmdata.resources local additions = { } - local private = resources.private + local rulecache = backcache + local showchar = true + local color = "palegray" + if type(value) == "string" then + value = settings_to_array(value) + for i=1,#value do + local v = value[i] + if v == v_frame then + rulecache = forecache + elseif v == v_background then + rulecache = backcache + elseif v == v_empty then + showchar = false + elseif v == v_none then + color = nil + else + color = v + end + end + end + local gray = color and startcolor(color) or nil + local black = gray and stopcolor or nil for unicode, old_c in next, characters do - private = private + 1 - local width = old_c.width or 0 - local height = old_c.height or 0 - local depth = old_c.depth or 0 - local new_c - if depth == 0 then - new_c = { - width = width, - height = height, - commands = { - push, - gray, - rulecache[height][width], - black, - pop, - { "slot", 1, private }, - } - } - else - new_c = { - width = width, - height = height, - depth = depth, - commands = { - push, - downcache[depth], - gray, - rulecache[height+depth][width], - black, - pop, - { "slot", 1, private }, - } + local private = getprivate(tfmdata) + local width = old_c.width or 0 + local height = old_c.height or 0 + local depth = old_c.depth or 0 + local char = showchar and { "slot", 1, private } or nil -- { "slot", 0, private } + -- local new_c + -- if depth == 0 then + -- new_c = { + -- width = width, + -- height = height, + -- commands = { + -- push, + -- gray, + -- rulecache[height][width], + -- black, + -- pop, + -- char, + -- } + -- } + -- else + -- new_c = { + -- width = width, + -- height = height, + -- depth = depth, + -- commands = { + -- push, + -- downcache[depth], + -- gray, + -- rulecache[height+depth][width], + -- black, + -- pop, + -- char, + -- } + -- } + -- end + local rule = rulecache[height][depth][width] + local new_c = { + width = width, + height = height, + depth = depth, + commands = gray and { + -- push, + gray, + rule, + black, + -- pop, + char, + } or { + rule, + char, } - end + } setmetatableindex(new_c,old_c) characters[unicode] = new_c additions[private] = old_c @@ -828,7 +979,6 @@ local function showboundingbox(tfmdata,key,value) for k, v in next, additions do characters[k] = v end - resources.private = private end end @@ -884,6 +1034,58 @@ registerotffeature { -- -- end +do + + local P, lpegpatterns, lpegmatch = lpeg.P, lpeg.patterns, lpeg.match + + local amount, stretch, shrink, extra + + local factor = lpegpatterns.unsigned + local space = lpegpatterns.space + local pattern = ( + (factor / function(n) amount = tonumber(n) or amount end) + + (P("+") + P("plus" )) * space^0 * (factor / function(n) stretch = tonumber(n) or stretch end) + + (P("-") + P("minus")) * space^0 * (factor / function(n) shrink = tonumber(n) or shrink end) + + ( P("extra")) * space^0 * (factor / function(n) extra = tonumber(n) or extra end) + + space^1 + )^1 + + local function initialize(tfmdata,key,value) + local characters = tfmdata.characters + local parameters = tfmdata.parameters + if type(value) == "string" then + local emwidth = parameters.quad + amount, stretch, shrink, extra = 0, 0, 0, false + lpegmatch(pattern,value) + if not extra then + if shrink ~= 0 then + extra = shrink + elseif stretch ~= 0 then + extra = stretch + else + extra = amount + end + end + parameters.space = amount * emwidth + parameters.space_stretch = stretch * emwidth + parameters.space_shrink = shrink * emwidth + parameters.extra_space = extra * emwidth + end + end + + -- 1.1 + 1.2 - 1.3 minus 1.4 plus 1.1 extra 1.4 -- last one wins + + registerotffeature { + name = "spacing", + description = "space settings", + manipulators = { + base = initialize, + node = initialize, + } + } + +end + -- -- historic stuff, move from font-ota (handled differently, typo-rep) -- -- local delete_node = nodes.delete @@ -1069,7 +1271,7 @@ local function getprivatecharornode(tfmdata,name) local font = properties.id local slot = getprivateslot(font,name) if slot then - -- todo: set current attribibutes + -- todo: set current attributes local char = tfmdata.characters[slot] local tonode = char.tonode if tonode then @@ -1121,7 +1323,7 @@ do end end - fonts.constructors.newfeatures.otf.register { + constructors.newfeatures.otf.register { name = "extraprivates", description = "extra privates", default = true, @@ -1257,21 +1459,21 @@ do -- another hack for a crappy font local function additalictowidth(tfmdata,key,value) local characters = tfmdata.characters - local resources = tfmdata.resources local additions = { } - local private = resources.private for unicode, old_c in next, characters do -- maybe check for math local oldwidth = old_c.width local olditalic = old_c.italic if olditalic and olditalic ~= 0 then - private = private + 1 + local private = getprivate(tfmdata) local new_c = { width = oldwidth + olditalic, height = old_c.height, depth = old_c.depth, commands = { - { "slot", 1, private }, + -- { "slot", 1, private }, + -- { "slot", 0, private }, + { "char", private }, { "right", olditalic }, }, } @@ -1283,7 +1485,6 @@ do -- another hack for a crappy font for k, v in next, additions do characters[k] = v end - resources.private = private end registerotffeature { @@ -1345,3 +1546,163 @@ do } end + +do + + -- This is a rather special test-only feature that I added for the sake of testing + -- Idris's husayni. We wanted to know if uniscribe obeys the order of lookups in a + -- font, in spite of what the description of handling arabic suggests. And indeed, + -- mixed-in lookups of other features (like all these ss* in husayni) are handled + -- the same in context as in uniscribe. If one sets reorderlookups=arab then we sort + -- according to the "assumed" order so e.g. the ss* move to after the standard + -- features. The observed difference in rendering is an indication that uniscribe is + -- quite faithful to the font (while e.g. tests with the hb plugin demonstrate some + -- interference, apart from some hard coded init etc expectations). Anyway, it means + -- that we're okay with the (generic) node processor. A pitfall is that in context + -- we can actually control more, so we can trigger an analyze pass with e.g. + -- dflt/dflt while the libraries depend on the script settings for that. Uniscribe + -- probably also parses the string and when seeing arabic will follow a different + -- code path, although it seems to treat all features equal. + + local trace_reorder = trackers.register("fonts.reorderlookups",function(v) trace_reorder = v end) + local report_reorder = logs.reporter("fonts","reorder") + + local vectors = { } + + vectors.arab = { + gsub = { + ccmp = 1, + isol = 2, + fina = 3, + medi = 4, + init = 5, + rlig = 6, + rclt = 7, + calt = 8, + liga = 9, + dlig = 10, + cswh = 11, + mset = 12, + }, + gpos = { + curs = 1, + kern = 2, + mark = 3, + mkmk = 4, + }, + } + + function otf.reorderlookups(tfmdata,vector) + local order = vectors[vector] + if not order then + return + end + local oldsequences = tfmdata.resources.sequences + if oldsequences then + local sequences = { } + for i=1,#oldsequences do + sequences[i] = oldsequences[i] + end + for i=1,#sequences do + local s = sequences[i] + local features = s.features + local kind = s.type + local index = s.index + if features then + local when + local what + for feature in sortedhash(features) do + if not what then + what = find(kind,"^gsub") and "gsub" or "gpos" + end + local newwhen = order[what][feature] + if not newwhen then + -- skip + elseif not when then + when = newwhen + elseif newwhen < when then + when = newwhen + end + end + s.ondex = s.index + s.index = i + s.what = what == "gsub" and 1 or 2 + s.when = when or 99 + else + s.ondex = s.index + s.index = i + s.what = 1 + s.when = 99 + end + end + sort(sequences,function(a,b) + local what_a = a.what + local what_b = b.what + if what_a ~= what_b then + return a.index < b.index + end + local when_a = a.when + local when_b = b.when + if when_a == when_b then + return a.index < b.index + else + return when_a < when_b + end + end) + local swapped = 0 + for i=1,#sequences do + local sequence = sequences[i] + local features = sequence.features + if features then + local index = sequence.index + if index ~= i then + swapped = swapped + 1 + end + if trace_reorder then + if swapped == 1 then + report_reorder() + report_reorder("start swapping lookups in font %!font:name!",tfmdata) + report_reorder() + report_reorder("gsub order: % t",table.swapped(order.gsub)) + report_reorder("gpos order: % t",table.swapped(order.gpos)) + report_reorder() + end + report_reorder("%03i : lookup %03i, type %s, sorted %2i, moved %s, % t", + i,index,sequence.what == 1 and "gsub" or "gpos",sequence.when or 99, + (index > i and "-") or (index < i and "+") or "=",sortedkeys(features)) + end + end + sequence.what = nil + sequence.when = nil + sequence.index = sequence.ondex + end + if swapped > 0 then + if trace_reorder then + report_reorder() + report_reorder("stop swapping lookups, %i lookups swapped",swapped) + report_reorder() + end +-- tfmdata.resources.sequences = sequences + tfmdata.shared.reorderedsequences = sequences + end + end + end + + -- maybe delay till ra is filled + + local function reorderlookups(tfmdata,key,value) + if value then + otf.reorderlookups(tfmdata,value) + end + end + + registerotffeature { + name = "reorderlookups", + description = "reorder lookups", + manipulators = { + base = reorderlookups, + node = reorderlookups, + } + } + +end diff --git a/tex/context/base/mkiv/font-fbk.lua b/tex/context/base/mkiv/font-fbk.lua index 3734e8071..79ebc3f25 100644 --- a/tex/context/base/mkiv/font-fbk.lua +++ b/tex/context/base/mkiv/font-fbk.lua @@ -8,6 +8,7 @@ if not modules then modules = { } end modules ['font-fbk'] = { local cos, tan, rad, format = math.cos, math.tan, math.rad, string.format local utfbyte, utfchar = utf.byte, utf.char +local next = next --[[ldx-- <p>This is very experimental code!</p> @@ -65,10 +66,10 @@ local function composecharacters(tfmdata) local vfspecials = backends.tables.vfspecials --brr local red, green, blue, black if trace_combining_visualize then - red = vfspecials.red - green = vfspecials.green - blue = vfspecials.blue - black = vfspecials.black + red = vfspecials.startcolor("red") + green = vfspecials.startcolor("green") + blue = vfspecials.startcolor("blue") + black = vfspecials.stopcolor end local compose = fonts.goodies.getcompositions(tfmdata) if compose and trace_combining_visualize then @@ -106,8 +107,9 @@ local function composecharacters(tfmdata) end local chr_t = cache[chr] if not chr_t then - chr_t = { "slot", 1, chr } - -- will be: chr_t = { "slot", 0, chr } + -- chr_t = { "slot", 1, chr } + -- chr_t = { "slot", 0, chr } + chr_t = { "char", chr } cache[chr] = chr_t end if charsacc then @@ -116,8 +118,9 @@ local function composecharacters(tfmdata) end local acc_t = cache[acc] if not acc_t then - acc_t = { "slot", 1, acc } - -- will be: acc_t = { "slot", 0, acc } + -- acc_t = { "slot", 1, acc } + -- acc_t = { "slot", 0, acc } + acc_t = { "char", acc } cache[acc] = acc_t end local cb = descriptions[chr].boundingbox @@ -212,15 +215,15 @@ local function composecharacters(tfmdata) dy = - deltaxheight + extraxheight end if trace_combining_visualize then - t.commands = { push, {"right", dx+dd}, {"down", dy}, green, acc_t, black, pop, chr_t } + t.commands = { push, { "right", dx+dd }, { "down", dy }, green, acc_t, black, pop, chr_t } else - t.commands = { push, {"right", dx+dd}, {"down", dy}, acc_t, pop, chr_t } + t.commands = { push, { "right", dx+dd }, { "down", dy }, acc_t, pop, chr_t } end else if trace_combining_visualize then - t.commands = { push, {"right", dx+dd}, blue, acc_t, black, pop, chr_t } + t.commands = { push, { "right", dx+dd }, blue, acc_t, black, pop, chr_t } else - t.commands = { push, {"right", dx+dd}, acc_t, pop, chr_t } + t.commands = { push, { "right", dx+dd }, acc_t, pop, chr_t } end end end @@ -298,11 +301,11 @@ end -- vf builder --- {'special', 'pdf: q ' .. s .. ' 0 0 '.. s .. ' 0 0 cm'}, --- {'special', 'pdf: q 1 0 0 1 ' .. -w .. ' ' .. -h .. ' cm'}, --- {'special', 'pdf: /Fm\XX\space Do'}, --- {'special', 'pdf: Q'}, --- {'special', 'pdf: Q'}, +-- { "pdf", "origin", "q " .. s .. " 0 0 " .. s .. " 0 0 cm" }, +-- { "pdf", "origin", "q 1 0 0 1 " .. -w .. " " .. -h .. " cm" }, +-- { "pdf", "origin", "/Fm\XX\space Do" }, +-- { "pdf", "origin", "Q" }, +-- { "pdf", "origin", "Q" }, -- new and experimental diff --git a/tex/context/base/mkiv/font-fea.mkvi b/tex/context/base/mkiv/font-fea.mkvi index 840b64e9c..5f65543ab 100644 --- a/tex/context/base/mkiv/font-fea.mkvi +++ b/tex/context/base/mkiv/font-fea.mkvi @@ -139,6 +139,10 @@ \attribute\zerocount\zerocount % first in list, so fast match +\prependtoks + \attribute\zerocount\attributeunsetvalue % new per 2017-08-30 +\to \t_attr_list_local + % beware: these are global features on top of existing font features \let\currentfeature \s!current diff --git a/tex/context/base/mkiv/font-fil.mkvi b/tex/context/base/mkiv/font-fil.mkvi index ba9d5e2c6..01fa4a338 100644 --- a/tex/context/base/mkiv/font-fil.mkvi +++ b/tex/context/base/mkiv/font-fil.mkvi @@ -461,13 +461,21 @@ % we can pack them +% \unexpanded\def\savefontclassparameters#style#rscale#features#fallbacks#goodies#designsize#direction% +% {\setxvalue{\??fontclass\fontclass#style\s!rscale }{#rscale}% +% \setxvalue{\??fontclass\fontclass#style\s!features }{#features}% +% \setxvalue{\??fontclass\fontclass#style\s!fallbacks }{#fallbacks}% +% \setxvalue{\??fontclass\fontclass#style\s!goodies }{#goodies}% +% \setxvalue{\??fontclass\fontclass#style\s!designsize}{#designsize}% +% \setxvalue{\??fontclass\fontclass#style\s!direction }{#direction}} + \unexpanded\def\savefontclassparameters#style#rscale#features#fallbacks#goodies#designsize#direction% - {\setxvalue{\??fontclass\fontclass#style\s!rscale }{#rscale}% - \setxvalue{\??fontclass\fontclass#style\s!features }{#features}% - \setxvalue{\??fontclass\fontclass#style\s!fallbacks }{#fallbacks}% - \setxvalue{\??fontclass\fontclass#style\s!goodies }{#goodies}% - \setxvalue{\??fontclass\fontclass#style\s!designsize}{#designsize}% - \setxvalue{\??fontclass\fontclass#style\s!direction }{#direction}} + {\letgvalue{\??fontclass\fontclass#style\s!rscale }#rscale% + \letgvalue{\??fontclass\fontclass#style\s!features }#features% + \letgvalue{\??fontclass\fontclass#style\s!fallbacks }#fallbacks% + \letgvalue{\??fontclass\fontclass#style\s!goodies }#goodies% + \letgvalue{\??fontclass\fontclass#style\s!designsize}#designsize% + \letgvalue{\??fontclass\fontclass#style\s!direction }#direction} % math % bonus diff --git a/tex/context/base/mkiv/font-gbn.lua b/tex/context/base/mkiv/font-gbn.lua index 1f8df642c..8f1acac65 100644 --- a/tex/context/base/mkiv/font-gbn.lua +++ b/tex/context/base/mkiv/font-gbn.lua @@ -13,6 +13,8 @@ if context then os.exit() end +local next = next + local fonts = fonts local nodes = nodes @@ -71,7 +73,8 @@ function nodes.handlers.setbasemodepass(v) basemodepass = v end -function nodes.handlers.nodepass(head) +-------- nodes.handlers.nodepass(head) +function nodes.handlers.nodepass(head,groupcode,size,packtype,direction) local fontdata = fonts.hashes.identifiers if fontdata then local nuthead = tonut(head) @@ -81,6 +84,7 @@ function nodes.handlers.nodepass(head) local basefont = nil local variants = nil local redundant = nil + local nofused = 0 for n in traverse_id(glyph_code,nuthead) do local font = getfont(n) if font ~= prevfont then @@ -97,6 +101,7 @@ function nodes.handlers.nodepass(head) local processors = shared.processes if processors and #processors > 0 then usedfonts[font] = processors + nofused = nofused + 1 elseif basemodepass then basefont = { n, nil } basefonts[#basefonts+1] = basefont @@ -178,6 +183,7 @@ function nodes.handlers.nodepass(head) local processors = shared.processes if processors and #processors > 0 then usedfonts[font] = processors + nofused = nofused + 1 end end end @@ -189,7 +195,7 @@ function nodes.handlers.nodepass(head) if next(usedfonts) then for font, processors in next, usedfonts do for i=1,#processors do - head = processors[i](head,font,0) or head + head = processors[i](head,font,0,direction,nofused) or head end end end @@ -229,7 +235,7 @@ function nodes.handlers.nodepass(head) end function nodes.handlers.basepass(head) - if not basemodepass then + if basemodepass then head = n_ligaturing(head) head = n_kerning(head) end @@ -241,9 +247,9 @@ local basepass = nodes.handlers.basepass local injectpass = nodes.injections.handler local protectpass = nodes.handlers.protectglyphs -function nodes.simple_font_handler(head) +function nodes.simple_font_handler(head,groupcode,size,packtype,direction) if head then - head = nodepass(head) + head = nodepass(head,groupcode,size,packtype,direction) head = injectpass(head) if not basemodepass then head = basepass(head) diff --git a/tex/context/base/mkiv/font-gds.mkvi b/tex/context/base/mkiv/font-gds.mkvi index e9c34e807..549ede46f 100644 --- a/tex/context/base/mkiv/font-gds.mkvi +++ b/tex/context/base/mkiv/font-gds.mkvi @@ -13,7 +13,7 @@ \writestatus{loading}{ConTeXt Font Support / Colorschemes} -%registerctxluafile{font-gds}{1.001} +%registerctxluafile{font-gds}{} \unprotect diff --git a/tex/context/base/mkiv/font-hsh.lua b/tex/context/base/mkiv/font-hsh.lua index 12f7bdfc2..60a27c043 100644 --- a/tex/context/base/mkiv/font-hsh.lua +++ b/tex/context/base/mkiv/font-hsh.lua @@ -61,8 +61,8 @@ hashes.originals = originals hashes.modes = modes hashes.variants = variants -local nodepool = nodes.pool -local dummyglyph = nodepool.register(nodepool.glyph()) +local nodepool = nodes and nodes.pool +local dummyglyph = nodepool and nodepool.register(nodepool.glyph()) local nulldata = allocate { name = "nullfont", @@ -239,7 +239,7 @@ setmetatableindex(quads, function(t,k) local quad if parameters then quad = parameters.quad - else + elseif dummyglyph then dummyglyph.font = k dummyglyph.char = 0x2014 -- emdash quad = dummyglyph.width -- dirty trick @@ -260,7 +260,7 @@ setmetatableindex(xheights, function(t,k) local xheight if parameters then xheight = parameters.xheight - else + elseif dummyglyph then dummyglyph.font = k dummyglyph.char = 0x78 -- x xheight = dummyglyph.height -- dirty trick @@ -359,4 +359,4 @@ function font.getfont(id) return identifiers[id] end -font.setfont = currentfont -- bah, no native 'setfont' as name +-- font.setfont = currentfont -- bah, no native 'setfont' as name diff --git a/tex/context/base/mkiv/font-ini.lua b/tex/context/base/mkiv/font-ini.lua index abc319484..3d5dd27a2 100644 --- a/tex/context/base/mkiv/font-ini.lua +++ b/tex/context/base/mkiv/font-ini.lua @@ -10,21 +10,22 @@ if not modules then modules = { } end modules ['font-ini'] = { <p>Not much is happening here.</p> --ldx]]-- -local allocate = utilities.storage.allocate +local allocate = utilities.storage.allocate -fonts = fonts or { } -local fonts = fonts +fonts = fonts or { } +local fonts = fonts -fonts.hashes = { identifiers = allocate() } +fonts.hashes = fonts.hashes or { identifiers = allocate() } +fonts.tables = fonts.tables or { } +fonts.helpers = fonts.helpers or { } +fonts.tracers = fonts.tracers or { } -- for the moment till we have move to moduledata +fonts.specifiers = fonts.specifiers or { } -- in format ! -fonts.tables = fonts.tables or { } -fonts.helpers = fonts.helpers or { } -fonts.tracers = fonts.tracers or { } -- for the moment till we have move to moduledata -fonts.specifiers = fonts.specifiers or { } -- in format ! +fonts.analyzers = { } -- not needed here +fonts.readers = { } +fonts.definers = { methods = { } } +fonts.loggers = { register = function() end } -fonts.analyzers = { } -- not needed here -fonts.readers = { } -fonts.definers = { methods = { } } -fonts.loggers = { register = function() end } - -fontloader.totable = fontloader.to_table -- not used +if context then + fontloader = nil +end diff --git a/tex/context/base/mkiv/font-ini.mkvi b/tex/context/base/mkiv/font-ini.mkvi index 2697dff2e..ee20d7b32 100644 --- a/tex/context/base/mkiv/font-ini.mkvi +++ b/tex/context/base/mkiv/font-ini.mkvi @@ -835,7 +835,7 @@ \fi \font_helpers_update_font_parameters \font_helpers_update_font_class_parameters - % \writestatus{fonts}{low level define: #csname/\somefontfile/\number\d_font_scaled_font_size/\fontface/\number\d_font_scaled_text_face}% + %\writestatus{fonts}{low level define: #csname/\somefontfile/\number\d_font_scaled_font_size/\fontface/\number\d_font_scaled_text_face}% \clf_definefont_two \ifx\fontclass\empty\s!false\else\s!true\fi {#csname}% @@ -919,6 +919,8 @@ \newif\ifskipfontcharacteristics \skipfontcharacteristicstrue +\tracingfonts\plussix % <id: name @ size> + %D When fontclasses are used, we define the font global, since namespaces are %D used. Otherwise we parse the specs each time. @@ -2713,6 +2715,18 @@ \def\saveddefinedfontid {\number\fontid\font} \def\saveddefinedfontname{\fontname\font} +%D Ugly helper: + +\unexpanded\def\saverunningstyleandcolor + {\unexpanded\edef\restorerunningstyleandcolor + {\setfontid \number\fontid\font + \attribute\colormodelattribute \the\attribute\colormodelattribute + \attribute\colorattribute \the\attribute\colorattribute + \attribute\transparencyattribute\the\attribute\transparencyattribute + \relax}} + +\let\restorerunningstyleandcolor\relax + %D Handy for defining additional glyphs: \let\getprivateglyphslot\clf_getprivateglyphslot % kind of private macro @@ -2818,4 +2832,12 @@ % \let\fontalternative#alternative% % \font_helpers_synchronize_font}} +%D \macros +%D {addfontpath} +%D +%D A way to add a path at runtime (no need to generate database): + +\unexpanded\def\usefontpath[#1]% + {\clf_addfontpath{#1}} + \protect \endinput diff --git a/tex/context/base/mkiv/font-inj.lua b/tex/context/base/mkiv/font-inj.lua deleted file mode 100644 index ccc41d3f3..000000000 --- a/tex/context/base/mkiv/font-inj.lua +++ /dev/null @@ -1,1194 +0,0 @@ -if not modules then modules = { } end modules ['font-inj'] = { - version = 1.001, - comment = "companion to font-lib.mkiv", - author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", - copyright = "PRAGMA ADE / ConTeXt Development Team", - license = "see context related readme files", -} - --- This property based variant is not faster but looks nicer than the attribute one. We --- need to use rawget (which is apbout 4 times slower than a direct access but we cannot --- get/set that one for our purpose! This version does a bit more with discretionaries --- (and Kai has tested it with his collection of weird fonts.) - --- There is some duplicate code here (especially in the the pre/post/replace branches) but --- we go for speed. We could store a list of glyph and mark nodes when registering but it's --- cleaner to have an identification pass here. Also, I need to keep tracing in mind so --- being too clever here is dangerous. - --- The subtype test is not needed as there will be no (new) properties set, given that we --- reset the properties. - -if not nodes.properties then return end - -local next, rawget = next, rawget -local fastcopy = table.fastcopy - -local trace_injections = false trackers.register("fonts.injections", function(v) trace_injections = v end) - -local report_injections = logs.reporter("fonts","injections") - -local attributes, nodes, node = attributes, nodes, node - -fonts = fonts -local fontdata = fonts.hashes.identifiers - -nodes.injections = nodes.injections or { } -local injections = nodes.injections - -local nodecodes = nodes.nodecodes -local glyph_code = nodecodes.glyph -local disc_code = nodecodes.disc -local kern_code = nodecodes.kern - -local nuts = nodes.nuts -local nodepool = nuts.pool - -local newkern = nodepool.kern - -local tonode = nuts.tonode -local tonut = nuts.tonut - -local getfield = nuts.getfield -local setfield = nuts.setfield -local getnext = nuts.getnext -local getprev = nuts.getprev -local getid = nuts.getid -local getfont = nuts.getfont -local getsubtype = nuts.getsubtype -local getchar = nuts.getchar - -local traverse_id = nuts.traverse_id -local insert_node_before = nuts.insert_before -local insert_node_after = nuts.insert_after -local find_tail = nuts.tail - -local properties = nodes.properties.data - -function injections.installnewkern(nk) - newkern = nk or newkern -end - -local nofregisteredkerns = 0 -local nofregisteredpairs = 0 -local nofregisteredmarks = 0 -local nofregisteredcursives = 0 -local keepregisteredcounts = false - -function injections.keepcounts() - keepregisteredcounts = true -end - -function injections.resetcounts() - nofregisteredkerns = 0 - nofregisteredpairs = 0 - nofregisteredmarks = 0 - nofregisteredcursives = 0 - keepregisteredcounts = false -end - --- We need to make sure that a possible metatable will not kick in unexpectedly. - --- function injections.reset(n) --- local p = rawget(properties,n) --- if p and rawget(p,"injections") then --- p.injections = nil --- end --- end - --- function injections.copy(target,source) --- local sp = rawget(properties,source) --- if sp then --- local tp = rawget(properties,target) --- local si = rawget(sp,"injections") --- if si then --- si = fastcopy(si) --- if tp then --- tp.injections = si --- else --- propertydata[target] = { --- injections = si, --- } --- end --- else --- if tp then --- tp.injections = nil --- end --- end --- end --- end - -function injections.reset(n) - local p = rawget(properties,n) - if p then - p.injections = false -- { } - else - properties[n] = false -- { injections = { } } - end -end - -function injections.copy(target,source) - local sp = rawget(properties,source) - if sp then - local tp = rawget(properties,target) - local si = rawget(sp,"injections") - if si then - si = fastcopy(si) - if tp then - tp.injections = si - else - propertydata[target] = { - injections = si, - } - end - elseif tp then - tp.injections = false -- { } - else - properties[target] = { injections = { } } - end - else - local tp = rawget(properties,target) - if tp then - tp.injections = false -- { } - else - properties[target] = false -- { injections = { } } - end - end -end - -function injections.setligaindex(n,index) - local p = rawget(properties,n) - if p then - local i = rawget(p,"injections") - if i then - i.ligaindex = index - else - p.injections = { - ligaindex = index - } - end - else - properties[n] = { - injections = { - ligaindex = index - } - } - end -end - -function injections.getligaindex(n,default) - local p = rawget(properties,n) - if p then - local i = rawget(p,"injections") - if i then - return i.ligaindex or default - end - end - return default -end - -function injections.setcursive(start,nxt,factor,rlmode,exit,entry,tfmstart,tfmnext) -- hm: nuts or nodes - local dx = factor*(exit[1]-entry[1]) - local dy = -factor*(exit[2]-entry[2]) - local ws = tfmstart.width - local wn = tfmnext.width - nofregisteredcursives = nofregisteredcursives + 1 - if rlmode < 0 then - dx = -(dx + wn) - else - dx = dx - ws - end - -- - local p = rawget(properties,start) - if p then - local i = rawget(p,"injections") - if i then - i.cursiveanchor = true - else - p.injections = { - cursiveanchor = true, - } - end - else - properties[start] = { - injections = { - cursiveanchor = true, - }, - } - end - local p = rawget(properties,nxt) - if p then - local i = rawget(p,"injections") - if i then - i.cursivex = dx - i.cursivey = dy - else - p.injections = { - cursivex = dx, - cursivey = dy, - } - end - else - properties[nxt] = { - injections = { - cursivex = dx, - cursivey = dy, - }, - } - end - return dx, dy, nofregisteredcursives -end - -function injections.setpair(current,factor,rlmode,r2lflag,spec,injection) -- r2lflag & tfmchr not used - local x = factor*spec[1] - local y = factor*spec[2] - local w = factor*spec[3] - local h = factor*spec[4] - if x ~= 0 or w ~= 0 or y ~= 0 or h ~= 0 then -- okay? - local yoffset = y - h - local leftkern = x -- both kerns are set in a pair kern compared - local rightkern = w - x -- to normal kerns where we set only leftkern - if leftkern ~= 0 or rightkern ~= 0 or yoffset ~= 0 then - nofregisteredpairs = nofregisteredpairs + 1 - if rlmode and rlmode < 0 then - leftkern, rightkern = rightkern, leftkern - end - if not injection then - injection = "injections" - end - local p = rawget(properties,current) - if p then - local i = rawget(p,injection) - if i then - if leftkern ~= 0 then - i.leftkern = (i.leftkern or 0) + leftkern - end - if rightkern ~= 0 then - i.rightkern = (i.rightkern or 0) + rightkern - end - if yoffset ~= 0 then - i.yoffset = (i.yoffset or 0) + yoffset - end - elseif leftkern ~= 0 or rightkern ~= 0 then - p[injection] = { - leftkern = leftkern, - rightkern = rightkern, - yoffset = yoffset, - } - else - p[injection] = { - yoffset = yoffset, - } - end - elseif leftkern ~= 0 or rightkern ~= 0 then - properties[current] = { - [injection] = { - leftkern = leftkern, - rightkern = rightkern, - yoffset = yoffset, - }, - } - else - properties[current] = { - [injection] = { - yoffset = yoffset, - }, - } - end - return x, y, w, h, nofregisteredpairs - end - end - return x, y, w, h -- no bound -end - --- This needs checking for rl < 0 but it is unlikely that a r2l script uses kernclasses between --- glyphs so we're probably safe (KE has a problematic font where marks interfere with rl < 0 in --- the previous case) - -function injections.setkern(current,factor,rlmode,x,injection) - local dx = factor * x - if dx ~= 0 then - nofregisteredkerns = nofregisteredkerns + 1 - local p = rawget(properties,current) - if not injection then - injection = "injections" - end - if p then - local i = rawget(p,injection) - if i then - i.leftkern = dx + (i.leftkern or 0) - else - p[injection] = { - leftkern = dx, - } - end - else - properties[current] = { - [injection] = { - leftkern = dx, - }, - } - end - return dx, nofregisteredkerns - else - return 0, 0 - end -end - -function injections.setmark(start,base,factor,rlmode,ba,ma,tfmbase,mkmk) -- ba=baseanchor, ma=markanchor - local dx, dy = factor*(ba[1]-ma[1]), factor*(ba[2]-ma[2]) - nofregisteredmarks = nofregisteredmarks + 1 - -- markanchors[nofregisteredmarks] = base - if rlmode >= 0 then - dx = tfmbase.width - dx -- see later commented ox - end - local p = rawget(properties,start) - -- hm, dejavu serif does a sloppy mark2mark before mark2base - if p then - local i = rawget(p,"injections") - if i then - if i.markmark then - -- out of order mkmk: yes or no or option - else - i.markx = dx - i.marky = dy - i.markdir = rlmode or 0 - i.markbase = nofregisteredmarks - i.markbasenode = base - i.markmark = mkmk - end - else - p.injections = { - markx = dx, - marky = dy, - markdir = rlmode or 0, - markbase = nofregisteredmarks, - markbasenode = base, - markmark = mkmk, - } - end - else - properties[start] = { - injections = { - markx = dx, - marky = dy, - markdir = rlmode or 0, - markbase = nofregisteredmarks, - markbasenode = base, - markmark = mkmk, - }, - } - end - return dx, dy, nofregisteredmarks -end - -local function dir(n) - return (n and n<0 and "r-to-l") or (n and n>0 and "l-to-r") or "unset" -end - -local function showchar(n,nested) - local char = getchar(n) - report_injections("%wfont %s, char %U, glyph %c",nested and 2 or 0,getfont(n),char,char) -end - -local function show(n,what,nested,symbol) - if n then - local p = rawget(properties,n) - if p then - local i = rawget(p,what) - if i then - local leftkern = i.leftkern or 0 - local rightkern = i.rightkern or 0 - local yoffset = i.yoffset or 0 - local markx = i.markx or 0 - local marky = i.marky or 0 - local markdir = i.markdir or 0 - local markbase = i.markbase or 0 - local cursivex = i.cursivex or 0 - local cursivey = i.cursivey or 0 - local ligaindex = i.ligaindex or 0 - local cursbase = i.cursiveanchor - local margin = nested and 4 or 2 - -- - if rightkern ~= 0 or yoffset ~= 0 then - report_injections("%w%s pair: lx %p, rx %p, dy %p",margin,symbol,leftkern,rightkern,yoffset) - elseif leftkern ~= 0 then - report_injections("%w%s kern: dx %p",margin,symbol,leftkern) - end - if markx ~= 0 or marky ~= 0 or markbase ~= 0 then - report_injections("%w%s mark: dx %p, dy %p, dir %s, base %s",margin,symbol,markx,marky,markdir,markbase ~= 0 and "yes" or "no") - end - if cursivex ~= 0 or cursivey ~= 0 then - if cursbase then - report_injections("%w%s curs: base dx %p, dy %p",margin,symbol,cursivex,cursivey) - else - report_injections("%w%s curs: dx %p, dy %p",margin,symbol,cursivex,cursivey) - end - elseif cursbase then - report_injections("%w%s curs: base",margin,symbol) - end - if ligaindex ~= 0 then - report_injections("%w%s liga: index %i",margin,symbol,ligaindex) - end - end - end - end -end - -local function showsub(n,what,where) - report_injections("begin subrun: %s",where) - for n in traverse_id(glyph_code,n) do - showchar(n,where) - show(n,what,where," ") - end - report_injections("end subrun") -end - -local function trace(head,where) - report_injections("begin run %s: %s kerns, %s pairs, %s marks and %s cursives registered", - where or "",nofregisteredkerns,nofregisteredpairs,nofregisteredmarks,nofregisteredcursives) - local n = head - while n do - local id = getid(n) - if id == glyph_code then - showchar(n) - show(n,"injections",false," ") - show(n,"preinjections",false,"<") - show(n,"postinjections",false,">") - show(n,"replaceinjections",false,"=") - elseif id == disc_code then - local pre = getfield(n,"pre") - local post = getfield(n,"post") - local replace = getfield(n,"replace") - if pre then - showsub(pre,"preinjections","pre") - end - if post then - showsub(post,"postinjections","post") - end - if replace then - showsub(replace,"replaceinjections","replace") - end - end - n = getnext(n) - end - report_injections("end run") -end - -local function show_result(head) - local current = head - local skipping = false - while current do - local id = getid(current) - if id == glyph_code then - report_injections("char: %C, width %p, xoffset %p, yoffset %p", - getchar(current),getfield(current,"width"),getfield(current,"xoffset"),getfield(current,"yoffset")) - skipping = false - elseif id == kern_code then - report_injections("kern: %p",getfield(current,"kern")) - skipping = false - elseif not skipping then - report_injections() - skipping = true - end - current = getnext(current) - end -end - -local function collect_glyphs(head,offsets) - local glyphs, glyphi, nofglyphs = { }, { }, 0 - local marks, marki, nofmarks = { }, { }, 0 - local nf, tm = nil, nil - local n = head - - local function identify(n,what) - local f = getfont(n) - if f ~= nf then - nf = f - -- other hash in ctx: - tm = fontdata[nf].resources - if tm then - tm = tm.marks - end - end - if tm and tm[getchar(n)] then - nofmarks = nofmarks + 1 - marks[nofmarks] = n - marki[nofmarks] = "injections" - else - nofglyphs = nofglyphs + 1 - glyphs[nofglyphs] = n - glyphi[nofglyphs] = what - end - if offsets then - -- yoffsets can influence curs steps - local p = rawget(properties,n) - if p then - local i = rawget(p,what) - if i then - local yoffset = i.yoffset - if yoffset and yoffset ~= 0 then - setfield(n,"yoffset",yoffset) - end - end - end - end - end - - while n do -- only needed for relevant fonts - local id = getid(n) - if id == glyph_code then - identify(n,"injections") - elseif id == disc_code then - local d = getfield(n,"pre") - if d then - for n in traverse_id(glyph_code,d) do - if getsubtype(n) < 256 then - identify(n,"preinjections") - end - end - end - local d = getfield(n,"post") - if d then - for n in traverse_id(glyph_code,d) do - if getsubtype(n) < 256 then - identify(n,"postinjections") - end - end - end - local d = getfield(n,"replace") - if d then - for n in traverse_id(glyph_code,d) do - if getsubtype(n) < 256 then - identify(n,"replaceinjections") - end - end - end - end - n = getnext(n) - end - - return glyphs, glyphi, nofglyphs, marks, marki, nofmarks -end - -local function inject_marks(marks,marki,nofmarks) - for i=1,nofmarks do - local n = marks[i] - local pn = rawget(properties,n) - if pn then - local ni = marki[i] - local pn = rawget(pn,ni) - if pn then - local p = pn.markbasenode - if p then - local px = getfield(p,"xoffset") - local ox = 0 - local rightkern = nil - local pp = rawget(properties,p) - if pp then - pp = rawget(pp,ni) - if pp then - rightkern = pp.rightkern - end - end - if rightkern then -- x and w ~= 0 - if pn.markdir < 0 then - -- kern(w-x) glyph(p) kern(x) mark(n) - ox = px - pn.markx - rightkern - -- report_injections("r2l case 1: %p",ox) - else - -- kern(x) glyph(p) kern(w-x) mark(n) - -- ox = px - getfield(p,"width") + pn.markx - pp.leftkern - -- - -- According to Kai we don't need to handle leftkern here but I'm - -- pretty sure I've run into a case where it was needed so maybe - -- some day we need something more clever here. - -- - if false then - -- a mark with kerning - local leftkern = pp.leftkern - if leftkern then - ox = px - pn.markx - leftkern - else - ox = px - pn.markx - end - else - ox = px - pn.markx - end - end - else - -- we need to deal with fonts that have marks with width - -- if pn.markdir < 0 then - -- ox = px - pn.markx - -- -- report_injections("r2l case 3: %p",ox) - -- else - -- -- ox = px - getfield(p,"width") + pn.markx - ox = px - pn.markx - -- report_injections("l2r case 3: %p",ox) - -- end - local wn = getfield(n,"width") -- in arial marks have widths - if wn ~= 0 then - -- bad: we should center - -- insert_node_before(head,n,newkern(-wn/2)) - -- insert_node_after(head,n,newkern(-wn/2)) - pn.leftkern = -wn/2 - pn.rightkern = -wn/2 - -- wx[n] = { 0, -wn/2, 0, -wn } - end - end - setfield(n,"xoffset",ox) - -- - local py = getfield(p,"yoffset") - -- local oy = 0 - -- if marks[p] then - -- oy = py + pn.marky - -- else - -- oy = getfield(n,"yoffset") + py + pn.marky - -- end - local oy = getfield(n,"yoffset") + py + pn.marky - setfield(n,"yoffset",oy) - else - -- normally this can't happen (only when in trace mode which is a special case anyway) - -- report_injections("missing mark anchor %i",pn.markbase or 0) - end - end - end - end -end - -local function inject_cursives(glyphs,glyphi,nofglyphs) - local cursiveanchor, lastanchor = nil, nil - local minc, maxc, last = 0, 0, nil - for i=1,nofglyphs do - local n = glyphs[i] - local pn = rawget(properties,n) - if pn then - pn = rawget(pn,glyphi[i]) - end - if pn then - local cursivex = pn.cursivex - if cursivex then - if cursiveanchor then - if cursivex ~= 0 then - pn.leftkern = (pn.leftkern or 0) + cursivex - end - if lastanchor then - if maxc == 0 then - minc = lastanchor - end - maxc = lastanchor - properties[cursiveanchor].cursivedy = pn.cursivey - end - last = n - else - maxc = 0 - end - elseif maxc > 0 then - local ny = getfield(n,"yoffset") - for i=maxc,minc,-1 do - local ti = glyphs[i] - ny = ny + properties[ti].cursivedy - setfield(ti,"yoffset",ny) -- why not add ? - end - maxc = 0 - end - if pn.cursiveanchor then - cursiveanchor = n - lastanchor = i - else - cursiveanchor = nil - lastanchor = nil - if maxc > 0 then - local ny = getfield(n,"yoffset") - for i=maxc,minc,-1 do - local ti = glyphs[i] - ny = ny + properties[ti].cursivedy - setfield(ti,"yoffset",ny) -- why not add ? - end - maxc = 0 - end - end - elseif maxc > 0 then - local ny = getfield(n,"yoffset") - for i=maxc,minc,-1 do - local ti = glyphs[i] - ny = ny + properties[ti].cursivedy - setfield(ti,"yoffset",getfield(ti,"yoffset") + ny) -- ? - end - maxc = 0 - cursiveanchor = nil - lastanchor = nil - end - -- if maxc > 0 and not cursiveanchor then - -- local ny = getfield(n,"yoffset") - -- for i=maxc,minc,-1 do - -- local ti = glyphs[i][1] - -- ny = ny + properties[ti].cursivedy - -- setfield(ti,"yoffset",ny) -- why not add ? - -- end - -- maxc = 0 - -- end - end - if last and maxc > 0 then - local ny = getfield(last,"yoffset") - for i=maxc,minc,-1 do - local ti = glyphs[i] - ny = ny + properties[ti].cursivedy - setfield(ti,"yoffset",ny) -- why not add ? - end - end -end - --- G +D-pre G --- D-post+ --- +D-replace+ --- --- G +D-pre +D-pre --- D-post +D-post --- +D-replace +D-replace - -local function inject_kerns(head,glist,ilist,length) -- not complete ! compare with inject_kerns_only (but unlikely disc here) - for i=1,length do - local n = glist[i] - local pn = rawget(properties,n) - if pn then - local dp = nil - local dr = nil - local ni = ilist[i] - local p = nil - if ni == "injections" then - p = getprev(n) - if p then - local id = getid(p) - if id == disc_code then - dp = getfield(p,"post") - dr = getfield(p,"replace") - end - end - end - if dp then - local i = rawget(pn,"postinjections") - if i then - local leftkern = i.leftkern - if leftkern and leftkern ~= 0 then - local t = find_tail(dp) - insert_node_after(dp,t,newkern(leftkern)) - setfield(p,"post",dp) -- currently we need to force a tail refresh - end - end - end - if dr then - local i = rawget(pn,"replaceinjections") - if i then - local leftkern = i.leftkern - if leftkern and leftkern ~= 0 then - local t = find_tail(dr) - insert_node_after(dr,t,newkern(leftkern)) - setfield(p,"replace",dr) -- currently we need to force a tail refresh - end - end - else - local i = rawget(pn,ni) - if i then - local leftkern = i.leftkern - if leftkern and leftkern ~= 0 then - insert_node_before(head,n,newkern(leftkern)) -- type 0/2 - end - local rightkern = i.rightkern - if rightkern and rightkern ~= 0 then - insert_node_after(head,n,newkern(rightkern)) -- type 0/2 - end - end - end - end - end -end - -local function inject_everything(head,where) - head = tonut(head) - if trace_injections then - trace(head,"everything") - end - local glyphs, glyphi, nofglyphs, marks, marki, nofmarks = collect_glyphs(head,nofregisteredpairs > 0) - if nofglyphs > 0 then - if nofregisteredcursives > 0 then - inject_cursives(glyphs,glyphi,nofglyphs) - end - if nofregisteredmarks > 0 then -- and nofmarks > 0 - inject_marks(marks,marki,nofmarks) - end - inject_kerns(head,glyphs,glyphi,nofglyphs) - end - if nofmarks > 0 then - inject_kerns(head,marks,marki,nofmarks) - end - if keepregisteredcounts then - keepregisteredcounts = false - else - nofregisteredkerns = 0 - nofregisteredpairs = 0 - nofregisteredmarks = 0 - nofregisteredcursives = 0 - end - return tonode(head), true -end - --- G +D-pre G --- D-post+ --- +D-replace+ --- --- G +D-pre +D-pre --- D-post +D-post --- +D-replace +D-replace - -local function inject_kerns_only(head,where) - head = tonut(head) - if trace_injections then - trace(head,"kerns") - end - local n = head - local p = nil -- disc node when non-nil - while n do - local id = getid(n) - if id == glyph_code then - if getsubtype(n) < 256 then - local pn = rawget(properties,n) - if pn then - if p then - local d = getfield(p,"post") - if d then - local i = rawget(pn,"postinjections") - if i then - local leftkern = i.leftkern - if leftkern and leftkern ~= 0 then - local t = find_tail(d) - insert_node_after(d,t,newkern(leftkern)) - setfield(p,"post",d) -- currently we need to force a tail refresh - end - end - end - local d = getfield(p,"replace") - if d then - local i = rawget(pn,"replaceinjections") - if i then - local leftkern = i.leftkern - if leftkern and leftkern ~= 0 then - local t = find_tail(d) - insert_node_after(d,t,newkern(leftkern)) - setfield(p,"replace",d) -- currently we need to force a tail refresh - end - end - else - local i = rawget(pn,"injections") - if i then - local leftkern = i.leftkern - if leftkern and leftkern ~= 0 then - setfield(p,"replace",newkern(leftkern)) - end - end - end - else - -- this is the most common case - local i = rawget(pn,"injections") - if i then - local leftkern = i.leftkern - if leftkern and leftkern ~= 0 then - head = insert_node_before(head,n,newkern(leftkern)) - end - end - end - end - end - p = nil - elseif id == disc_code then - local d = getfield(n,"pre") - if d then - local h = d - for n in traverse_id(glyph_code,d) do - if getsubtype(n) < 256 then - local pn = rawget(properties,n) - if pn then - local i = rawget(pn,"preinjections") - if i then - local leftkern = i.leftkern - if leftkern and leftkern ~= 0 then - h = insert_node_before(h,n,newkern(leftkern)) - end - end - end - else - break - end - end - if h ~= d then - setfield(n,"pre",h) - end - end - local d = getfield(n,"post") - if d then - local h = d - for n in traverse_id(glyph_code,d) do - if getsubtype(n) < 256 then - local pn = rawget(properties,n) - if pn then - local i = rawget(pn,"postinjections") - if i then - local leftkern = i.leftkern - if leftkern and leftkern ~= 0 then - h = insert_node_before(h,n,newkern(leftkern)) - end - end - end - else - break - end - end - if h ~= d then - setfield(n,"post",h) - end - end - local d = getfield(n,"replace") - if d then - local h = d - for n in traverse_id(glyph_code,d) do - if getsubtype(n) < 256 then - local pn = rawget(properties,n) - if pn then - local i = rawget(pn,"replaceinjections") - if i then - local leftkern = i.leftkern - if leftkern and leftkern ~= 0 then - h = insert_node_before(h,n,newkern(leftkern)) - end - end - end - else - break - end - end - if h ~= d then - setfield(n,"replace",h) - end - end - p = n - else - p = nil - end - n = getnext(n) - end - -- - if keepregisteredcounts then - keepregisteredcounts = false - else - nofregisteredkerns = 0 - end - return tonode(head), true -end - -local function inject_pairs_only(head,where) - head = tonut(head) - if trace_injections then - trace(head,"pairs") - end - local n = head - local p = nil -- disc node when non-nil - while n do - local id = getid(n) - if id == glyph_code then - if getsubtype(n) < 256 then - local pn = rawget(properties,n) - if pn then - if p then - local d = getfield(p,"post") - if d then - local i = rawget(pn,"postinjections") - if i then - local leftkern = i.leftkern - if leftkern and leftkern ~= 0 then - local t = find_tail(d) - insert_node_after(d,t,newkern(leftkern)) - setfield(p,"post",d) -- currently we need to force a tail refresh - end - -- local rightkern = i.rightkern - -- if rightkern and rightkern ~= 0 then - -- insert_node_after(head,n,newkern(rightkern)) - -- n = getnext(n) -- to be checked - -- end - end - end - local d = getfield(p,"replace") - if d then - local i = rawget(pn,"replaceinjections") - if i then - local leftkern = i.leftkern - if leftkern and leftkern ~= 0 then - local t = find_tail(d) - insert_node_after(d,t,newkern(leftkern)) - setfield(p,"replace",d) -- currently we need to force a tail refresh - end - -- local rightkern = i.rightkern - -- if rightkern and rightkern ~= 0 then - -- insert_node_after(head,n,newkern(rightkern)) - -- n = getnext(n) -- to be checked - -- end - end - else - local i = rawget(pn,"injections") - if i then - local leftkern = i.leftkern - if leftkern and leftkern ~= 0 then - setfield(p,"replace",newkern(leftkern)) - end - -- local rightkern = i.rightkern - -- if rightkern and rightkern ~= 0 then - -- insert_node_after(head,n,newkern(rightkern)) - -- n = getnext(n) -- to be checked - -- end - end - end - else - -- this is the most common case - local i = rawget(pn,"injections") - if i then - local leftkern = i.leftkern - if leftkern and leftkern ~= 0 then - head = insert_node_before(head,n,newkern(leftkern)) - end - local rightkern = i.rightkern - if rightkern and rightkern ~= 0 then - insert_node_after(head,n,newkern(rightkern)) - n = getnext(n) -- to be checked - end - local yoffset = i.yoffset - if yoffset and yoffset ~= 0 then - setfield(n,"yoffset",yoffset) - end - end - end - end - end - p = nil - elseif id == disc_code then - local d = getfield(n,"pre") - if d then - local h = d - for n in traverse_id(glyph_code,d) do - if getsubtype(n) < 256 then - local pn = rawget(properties,n) - if pn then - local i = rawget(pn,"preinjections") - if i then - local leftkern = i.leftkern - if leftkern and leftkern ~= 0 then - h = insert_node_before(h,n,newkern(leftkern)) - end - local rightkern = i.rightkern - if rightkern and rightkern ~= 0 then - insert_node_after(head,n,newkern(rightkern)) - n = getnext(n) -- to be checked - end - local yoffset = i.yoffset - if yoffset and yoffset ~= 0 then - setfield(n,"yoffset",yoffset) - end - end - end - else - break - end - end - if h ~= d then - setfield(n,"pre",h) - end - end - local d = getfield(n,"post") - if d then - local h = d - for n in traverse_id(glyph_code,d) do - if getsubtype(n) < 256 then - local pn = rawget(properties,n) - if pn then - local i = rawget(pn,"postinjections") - if i then - local leftkern = i.leftkern - if leftkern and leftkern ~= 0 then - h = insert_node_before(h,n,newkern(leftkern)) - end - local rightkern = i.rightkern - if rightkern and rightkern ~= 0 then - insert_node_after(head,n,newkern(rightkern)) - n = getnext(n) -- to be checked - end - local yoffset = i.yoffset - if yoffset and yoffset ~= 0 then - setfield(n,"yoffset",yoffset) - end - end - end - else - break - end - end - if h ~= d then - setfield(n,"post",h) - end - end - local d = getfield(n,"replace") - if d then - local h = d - for n in traverse_id(glyph_code,d) do - if getsubtype(n) < 256 then - local pn = rawget(properties,n) - if pn then - local i = rawget(pn,"replaceinjections") - if i then - local leftkern = i.leftkern - if leftkern and leftkern ~= 0 then - h = insert_node_before(h,n,newkern(leftkern)) - end - local rightkern = i.rightkern - if rightkern and rightkern ~= 0 then - insert_node_after(head,n,newkern(rightkern)) - n = getnext(n) -- to be checked - end - local yoffset = i.yoffset - if yoffset and yoffset ~= 0 then - setfield(n,"yoffset",yoffset) - end - end - end - else - break - end - end - if h ~= d then - setfield(n,"replace",h) - end - end - p = n - else - p = nil - end - n = getnext(n) - end - -- - if keepregisteredcounts then - keepregisteredcounts = false - else - nofregisteredpairs = 0 - nofregisteredkerns = 0 - end - return tonode(head), true -end - -function injections.handler(head,where) - if nofregisteredmarks > 0 or nofregisteredcursives > 0 then - return inject_everything(head,where) - elseif nofregisteredpairs > 0 then - return inject_pairs_only(head,where) - elseif nofregisteredkerns > 0 then - return inject_kerns_only(head,where) - else - return head, false - end -end diff --git a/tex/context/base/mkiv/font-ldr.lua b/tex/context/base/mkiv/font-ldr.lua deleted file mode 100644 index 175b4d0cc..000000000 --- a/tex/context/base/mkiv/font-ldr.lua +++ /dev/null @@ -1,70 +0,0 @@ -if not modules then modules = { } end modules ['font-ldr'] = { - version = 1.001, - comment = "companion to font-ini.mkiv", - author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", - copyright = "PRAGMA ADE / ConTeXt Development Team", - license = "see context related readme files" -} - --- This module provides an experimental replacement for fontloader.to_table --- but is not used that much. - -local fields = fontloader.fields - -if fields then - - local glyphfields - - local function get_glyphs(r) - local t = { } - local g = r.glyphs - for i=1,r.glyphmax-1 do - local gi = g[i] - if gi then - if not glyphfields then - glyphfields = fields(gi) - end - local h = { } - for i=1,#glyphfields do - local s = glyphfields[i] - h[s] = gi[s] - end - t[i] = h - end - end - return t - end - - local function to_table(r) - local f = fields(r) - if f then - local t = { } - for i=1,#f do - local fi = f[i] - local ri = r[fi] - if not ri then - -- skip - elseif fi == "glyphs" then - t.glyphs = get_glyphs(r) - elseif fi == "subfonts" then - t[fi] = ri - ri.glyphs = get_glyphs(ri) - else - t[fi] = r[fi] - end - end - return t - end - end - - -- currently glyphs, subfont-glyphs and the main table are userdata - - function fonts.to_table(raw) - return to_table(raw) - end - -else - - fonts.to_table = fontloader.to_table - -end diff --git a/tex/context/base/mkiv/font-lib.mkvi b/tex/context/base/mkiv/font-lib.mkvi index d9cae503b..24ab68781 100644 --- a/tex/context/base/mkiv/font-lib.mkvi +++ b/tex/context/base/mkiv/font-lib.mkvi @@ -15,92 +15,84 @@ \unprotect -\registerctxluafile{font-ini}{1.001} -\registerctxluafile{font-log}{1.001} -\registerctxluafile{font-con}{1.001} -\registerctxluafile{font-cft}{1.001} -\registerctxluafile{font-enc}{1.001} -\registerctxluafile{font-agl}{1.001} % if needed we can comment this and delay loading -\registerctxluafile{font-cid}{1.001} % cid maps -\registerctxluafile{font-map}{1.001} +\registerctxluafile{font-ini}{} +\registerctxluafile{font-log}{} +\registerctxluafile{font-con}{} +\registerctxluafile{font-cft}{} +\registerctxluafile{font-enc}{} +\registerctxluafile{font-agl}{} % if needed we can comment this and delay loading +\registerctxluafile{font-cid}{} % cid maps +\registerctxluafile{font-map}{optimize} % the otf font loader: -\registerctxluafile{font-otr}{1.001} % opentype fontloader -\registerctxluafile{font-web}{1.001} % opentype fontloader -\registerctxluafile{font-cff}{1.001} % quadratic outlines -\registerctxluafile{font-ttf}{1.001} % cubic outlines -%registerctxluafile{font-tmp}{1.001} % temporary placeholder -\registerctxluafile{font-dsp}{1.001} % ... for this one -\registerctxluafile{font-off}{1.001} % the old loader - -% \registerctxluafile{font-tfm}{1.001} - -\registerctxluafile{font-hsh}{1.001} % hashes used by context -\registerctxluafile{font-nod}{1.001} - -\registerctxluafile{font-oti}{1.001} % otf initialization -\registerctxluafile{font-ott}{1.001} % otf tables (first) - -\registerctxluafile{font-otl}{1.001} -\registerctxluafile{font-oto}{1.001} -\registerctxluafile{font-otj}{1.001} -\registerctxluafile{font-oup}{1.001} -\registerctxluafile{font-ota}{1.001} -\registerctxluafile{font-ots}{1.001} -\registerctxluafile{font-otd}{1.001} -\registerctxluafile{font-otc}{1.001} -\registerctxluafile{font-oth}{1.001} -\registerctxluafile{font-osd}{1.001} -\registerctxluafile{font-ocl}{1.001} +\registerctxluafile{font-otr}{optimize} % opentype fontloader +\registerctxluafile{font-web}{} % opentype fontloader +\registerctxluafile{font-cff}{optimize} % quadratic outlines +\registerctxluafile{font-ttf}{optimize} % cubic outlines +\registerctxluafile{font-dsp}{optimize} % ... for this one +\registerctxluafile{font-hsh}{} % hashes used by context +\registerctxluafile{font-nod}{} +\registerctxluafile{font-oti}{} % otf initialization +\registerctxluafile{font-ott}{} % otf tables (first) +\registerctxluafile{font-otl}{} +\registerctxluafile{font-oto}{} +\registerctxluafile{font-otj}{} +\registerctxluafile{font-oup}{} +\registerctxluafile{font-ota}{} +\registerctxluafile{font-ots}{} +\registerctxluafile{font-otd}{} +\registerctxluafile{font-otc}{} +\registerctxluafile{font-oth}{} +\registerctxluafile{font-osd}{} +\registerctxluafile{font-ocl}{} % we use otf code for type one -\registerctxluafile{font-onr}{1.001} -\registerctxluafile{font-one}{1.001} -%registerctxluafile{font-afm}{1.001} -\registerctxluafile{font-afk}{1.001} +\registerctxluafile{font-onr}{optimize} +\registerctxluafile{font-one}{optimize} +\registerctxluafile{font-afk}{} % tfm -\registerctxluafile{font-tfm}{1.001} +\registerctxluafile{font-tfm}{} % name database -\registerctxluafile{font-syn}{1.001} -\registerctxluafile{font-trt}{1.001} +\registerctxluafile{font-syn}{} +\registerctxluafile{font-trt}{} % shapes -\registerctxluafile{font-shp}{1.001} +\registerctxluafile{font-shp}{} % so far -\registerctxluafile{font-pat}{1.001} % patchers +\registerctxluafile{font-pat}{} % patchers -\registerctxluafile{node-fnt}{1.001} % here +\registerctxluafile{node-fnt}{} % here -\registerctxluafile{font-mps}{1.001} % outline fun +\registerctxluafile{font-mps}{} % outline fun -\registerctxluafile{font-lua}{1.001} +\registerctxluafile{font-lua}{} -\registerctxluafile{font-vf} {1.001} -\registerctxluafile{font-enh}{1.001} +\registerctxluafile{font-vir}{} +\registerctxluafile{font-enh}{} -\registerctxluafile{good-ini}{1.001} -\registerctxluafile{good-gen}{1.001} -\registerctxluafile{good-ctx}{1.001} -\registerctxluafile{good-mth}{1.001} +\registerctxluafile{good-ini}{} +\registerctxluafile{good-gen}{} +\registerctxluafile{good-ctx}{} +\registerctxluafile{good-mth}{} -\registerctxluafile{font-def}{1.001} -\registerctxluafile{font-ctx}{1.001} % after def as it overloads +\registerctxluafile{font-def}{} +\registerctxluafile{font-ctx}{} % after def as it overloads -\registerctxluafile{font-ext}{1.001} -\registerctxluafile{font-fbk}{1.001} +\registerctxluafile{font-ext}{} +\registerctxluafile{font-fbk}{} -\registerctxluafile{font-aux}{1.001} +\registerctxluafile{font-aux}{} -\registerctxluafile{font-lig}{1.001} % only for experiments so try to avoid it +\registerctxluafile{font-lig}{} % only for experiments so try to avoid it %D Some low level helpers %D diff --git a/tex/context/base/mkiv/font-lig.lua b/tex/context/base/mkiv/font-lig.lua index bb9ee0096..1aed9fc5b 100644 --- a/tex/context/base/mkiv/font-lig.lua +++ b/tex/context/base/mkiv/font-lig.lua @@ -9,6 +9,8 @@ if not modules then modules = { } end modules ['font-lig'] = { -- This module is not loaded but generated a file for plain TeX as a substitute -- for collapsing the input: "luatex-fonts-lig.lua" with "collapse=yes". +local next = next + local standalone = not characters if standalone then diff --git a/tex/context/base/mkiv/font-map.lua b/tex/context/base/mkiv/font-map.lua index 706c5b709..d4a1b4594 100644 --- a/tex/context/base/mkiv/font-map.lua +++ b/tex/context/base/mkiv/font-map.lua @@ -10,9 +10,9 @@ local tonumber, next, type = tonumber, next, type local match, format, find, concat, gsub, lower = string.match, string.format, string.find, table.concat, string.gsub, string.lower local P, R, S, C, Ct, Cc, lpegmatch = lpeg.P, lpeg.R, lpeg.S, lpeg.C, lpeg.Ct, lpeg.Cc, lpeg.match -local floor = math.floor local formatters = string.formatters local sortedhash, sortedkeys = table.sortedhash, table.sortedkeys +local rshift = bit32.rshift local trace_loading = false trackers.register("fonts.loading", function(v) trace_loading = v end) local trace_mapping = false trackers.register("fonts.mapping", function(v) trace_mapping = v end) @@ -78,6 +78,9 @@ end local f_single = formatters["%04X"] local f_double = formatters["%04X%04X"] +-- floor(x/256) => rshift(x, 8) +-- floor(x/1024) => rshift(x,10) + -- 0.684 0.661 0,672 0.650 : cache at lua end (more mem) -- 0.682 0,672 0.698 0.657 : no cache (moderate mem i.e. lua strings) -- 0.644 0.647 0.655 0.645 : convert in c (less mem in theory) @@ -88,7 +91,7 @@ local f_double = formatters["%04X%04X"] -- s = f_single(unicode) -- else -- unicode = unicode - 0x10000 --- s = f_double(floor(unicode/1024)+0xD800,unicode%1024+0xDC00) +-- s = f_double(rshift(unicode,10)+0xD800,unicode%1024+0xDC00) -- end -- t[unicode] = s -- return s @@ -147,7 +150,7 @@ local function tounicode16(unicode) return f_single(unicode) else unicode = unicode - 0x10000 - return f_double(floor(unicode/1024)+0xD800,unicode%1024+0xDC00) + return f_double(rshift(unicode,10)+0xD800,unicode%1024+0xDC00) end end @@ -159,13 +162,13 @@ local function tounicode16sequence(unicodes) t[l] = f_single(u) else u = u - 0x10000 - t[l] = f_double(floor(u/1024)+0xD800,u%1024+0xDC00) + t[l] = f_double(rshift(u,10)+0xD800,u%1024+0xDC00) end end return concat(t) end -local function tounicode(unicode,name) +local function tounicode(unicode) if type(unicode) == "table" then local t = { } for l=1,#unicode do @@ -174,7 +177,7 @@ local function tounicode(unicode,name) t[l] = f_single(u) else u = u - 0x10000 - t[l] = f_double(floor(u/1024)+0xD800,u%1024+0xDC00) + t[l] = f_double(rshift(u,10)+0xD800,u%1024+0xDC00) end end return concat(t) @@ -183,7 +186,7 @@ local function tounicode(unicode,name) return f_single(unicode) else unicode = unicode - 0x10000 - return f_double(floor(unicode/1024)+0xD800,unicode%1024+0xDC00) + return f_double(rshift(unicode,10)+0xD800,unicode%1024+0xDC00) end end end @@ -196,7 +199,7 @@ end -- v = f_single(u) -- else -- u = u - 0x10000 --- v = f_double(floor(u/1024)+0xD800,u%1024+0xDC00) +-- v = f_double(rshift(u,10)+0xD800,u%1024+0xDC00) -- end -- t[u] = v -- return v @@ -269,7 +272,7 @@ local namesplitter = Ct(C((1 - ligseparator - varseparator)^1) * (ligseparator * do - local overloads = allocate { + local overloads = { IJ = { name = "I_J", unicode = { 0x49, 0x4A }, mess = 0x0132 }, ij = { name = "i_j", unicode = { 0x69, 0x6A }, mess = 0x0133 }, ff = { name = "f_f", unicode = { 0x66, 0x66 }, mess = 0xFB00 }, @@ -284,7 +287,7 @@ do -- emdash = { name = "emdash", unicode = 0x2014, mess = 0x2014 }, } - local o = { } + local o = allocate { } for k, v in next, overloads do local name = v.name diff --git a/tex/context/base/mkiv/font-mat.mkvi b/tex/context/base/mkiv/font-mat.mkvi index cbc78aca8..0134f3fe6 100644 --- a/tex/context/base/mkiv/font-mat.mkvi +++ b/tex/context/base/mkiv/font-mat.mkvi @@ -21,21 +21,21 @@ \ifdefined\??fontinstancebasic \else \installcorenamespace{fontinstancebasic} \fi \ifdefined\??fontinstanceclass \else \installcorenamespace{fontinstanceclass} \fi +%D The order 3 2 1 of siuze matters: needed for math-fbk relative size storage! + %D \macros %D {textonly} %D -%D Traditionally math has a big impact on font definitions, mainly -%D because we need to define alphabet variants using families and -%D fonts. This means that one can easily get 10 fonts loaded per -%D math size. In \MKIV\ we use a different approach: one family -%D which has either a virtual font made of traditional fonts, or -%D an \OPENTYPE\ font that has it all. +%D Traditionally math has a big impact on font definitions, mainly because we need +%D to define alphabet variants using families and fonts. This means that one can +%D easily get 10 fonts loaded per math size. In \MKIV\ we use a different approach: +%D one family which has either a virtual font made of traditional fonts, or an +%D \OPENTYPE\ font that has it all. %D -%D We currently use only one math family but in the future we -%D might consider using a second one for bold math. For the -%D moment we keep the \MKII\ method of using a token register -%D for definitions but we already dropped the text and symbols -%D ones since they now live in the same family. +%D We currently use only one math family but in the future we might consider using a +%D second one for bold math. For the moment we keep the \MKII\ method of using a +%D token register for definitions but we already dropped the text and symbols ones +%D since they now live in the same family. \newtoks \t_font_math_strategies \newconditional\c_font_synchronize_math_fonts \settrue\c_font_synchronize_math_fonts @@ -45,14 +45,12 @@ \unexpanded\def\textonly{\setfalse\c_font_synchronize_math_fonts} % document this -%D The main math font definer. We have removed some optimized -%D code simply because we now always have a fontclass. We could -%D check for fontclass being default or empty and save a few -%D tests but it does not help us when no math is defined. - -%D Because we want to keep mr=.. and mb=... settings (read: not -%D break downward compatibility by enforcing mrlr etc) we need a -%D bit more code that optimal. +%D The main math font definer. We have removed some optimized code simply because we +%D now always have a fontclass. We could check for fontclass being default or empty +%D and save a few tests but it does not help us when no math is defined. +%D +%D Because we want to keep mr=.. and mb=... settings (read: not break downward +%D compatibility by enforcing mrlr etc) we need a bit more code that optimal. % todo: \c_font_fam_mr @@ -75,33 +73,9 @@ \def\mathsizesuffix{\ifcase\fontface\or\mathtextsuffix\or\mathscriptsuffix\or\mathscriptscriptsuffix\fi} -% Beware: truefontname also does a fallback on defaultfontclass so there -% can be some interference here, which is why we use a different method -% for bold. - -% \def\font_helpers_set_math_family_a -% {\ifcsname\??fontinstanceready\fontclass -\fontbody-\s!mm-\fontfamily-\fontsize\endcsname \setfalse\c_font_auto_size -% \csname\??fontinstanceready\fontclass -\fontbody-\s!mm-\fontfamily-\fontsize\endcsname \else -% \ifcsname\??fontinstanceready\fontclass -\fontbody-\s!mm-\fontfamily \endcsname \settrue \c_font_auto_size -% \csname\??fontinstanceready\fontclass -\fontbody-\s!mm-\fontfamily \endcsname \else -% \font_helpers_set_math_family_b -% \fi\fi} - -% \def\font_helpers_set_math_family_b -% {\ifcsname\??fontinstanceready\defaultfontclass-\fontbody-\s!mm-\fontfamily-\fontsize\endcsname \setfalse\c_font_auto_size -% \csname\??fontinstanceready\defaultfontclass-\fontbody-\s!mm-\fontfamily-\fontsize\endcsname \else -% \ifcsname\??fontinstanceready\defaultfontclass-\fontbody-\s!mm-\fontfamily \endcsname \settrue \c_font_auto_size -% \csname\??fontinstanceready\defaultfontclass-\fontbody-\s!mm-\fontfamily \endcsname \else -% \font_helpers_set_math_family_c -% \fi\fi} - -% \def\font_helpers_set_math_family_c -% {\ifcsname\??fontinstanceready \fontbody-\s!mm-\fontfamily-\fontsize\endcsname \setfalse\c_font_auto_size -% \csname\??fontinstanceready \fontbody-\s!mm-\fontfamily-\fontsize\endcsname \else -% \ifcsname\??fontinstanceready \fontbody-\s!mm-\fontfamily \endcsname \settrue \c_font_auto_size -% \csname\??fontinstanceready \fontbody-\s!mm-\fontfamily \endcsname \else -% \settrue \c_font_auto_size -% \fi\fi} +%D Beware: truefontname also does a fallback on defaultfontclass so there +%D can be some interference here, which is why we use a different method +%D for bold. \def\font_helpers_set_math_family_a {\ifcsname\??fontinstanceready\fontclass -\fontbody-\s!mm-\fontfamily-\fontsize\endcsname \setfalse\c_font_auto_size @@ -133,21 +107,20 @@ {\let\savedfontbody\fontbody \let\fontfamily#family% % the order is important as we depend on known id's when completing fonts - \let\mathsizesuffix\mathscriptscriptsuffix\let\fontface\!!plusthree\font_helpers_set_math_family_a\scriptscriptfont#mrtag\font - \let\mathsizesuffix\mathscriptsuffix \let\fontface\!!plustwo \font_helpers_set_math_family_a\scriptfont #mrtag\font - \let\mathsizesuffix\mathtextsuffix \let\fontface\!!plusone \font_helpers_set_math_family_a\textfont #mrtag\font + % enabling is needed when we have fallbacks which spoils the families + \let\mathsizesuffix\mathscriptscriptsuffix\let\fontface\!!plusthree + \font_helpers_set_math_family_a\scriptscriptfont#mrtag\font % defines + \font_helpers_set_math_family_a\scriptscriptfont#mrtag\font % enables + \let\mathsizesuffix\mathscriptsuffix \let\fontface\!!plustwo + \font_helpers_set_math_family_a\scriptfont #mrtag\font % defines + \font_helpers_set_math_family_a\scriptfont #mrtag\font % enables + \let\mathsizesuffix\mathtextsuffix \let\fontface\!!plusone + \font_helpers_set_math_family_a\textfont #mrtag\font % defines + \font_helpers_set_math_family_a\textfont #mrtag\font % enables \let\mathsizesuffix\empty \let\fontface\!!zerocount \let\fontbody\savedfontbody \setfalse\c_font_auto_size} -% \def\font_helpers_set_math_family_bold_a#font#mbfam#mrfam% -% {\ifcsname\??fontinstanceready\fontclass-\fontbody-\s!mm-\fontfamily-\fontsize\endcsname \setfalse\c_font_auto_size -% \csname\??fontinstanceready\fontclass-\fontbody-\s!mm-\fontfamily-\fontsize\endcsname #font#mbfam\font \else -% \ifcsname\??fontinstanceready\fontclass-\fontbody-\s!mm-\fontfamily \endcsname \settrue \c_font_auto_size -% \csname\??fontinstanceready\fontclass-\fontbody-\s!mm-\fontfamily \endcsname #font#mbfam\font \else -% #font#mbfam#font#mrfam% -% \fi\fi} - \def\font_helpers_set_math_family_bold_a#font#mbfam#mrfam% {\ifcsname\??fontinstanceready\fontclass-\fontbody-\s!mm-\fontfamily-\fontsize\endcsname \setfalse\c_font_auto_size \lastnamedcs #font#mbfam\font \else @@ -161,9 +134,15 @@ \let\defaultfontclass\fontclass % else truefontname falls back on the wrong one \let\savedfontbody\fontbody \let\fontfamily#familytag% - \let\mathsizesuffix\mathscriptscriptsuffix\let\fontface\!!plusthree\font_helpers_set_math_family_bold_a\scriptscriptfont#mbfam#mrfam% - \let\mathsizesuffix\mathscriptsuffix \let\fontface\!!plustwo \font_helpers_set_math_family_bold_a\scriptfont #mbfam#mrfam% - \let\mathsizesuffix\mathtextsuffix \let\fontface\!!plusone \font_helpers_set_math_family_bold_a\textfont #mbfam#mrfam% + \let\mathsizesuffix\mathscriptscriptsuffix\let\fontface\!!plusthree + \font_helpers_set_math_family_bold_a\scriptscriptfont#mbfam#mrfam% defines + \font_helpers_set_math_family_bold_a\scriptscriptfont#mbfam#mrfam% enables + \let\mathsizesuffix\mathscriptsuffix \let\fontface\!!plustwo + \font_helpers_set_math_family_bold_a\scriptfont #mbfam#mrfam% defines + \font_helpers_set_math_family_bold_a\scriptfont #mbfam#mrfam% enables + \let\mathsizesuffix\mathtextsuffix \let\fontface\!!plusone + \font_helpers_set_math_family_bold_a\textfont #mbfam#mrfam% defines + \font_helpers_set_math_family_bold_a\textfont #mbfam#mrfam% enables \let\mathsizesuffix\empty \let\fontface\!!zerocount \let\fontbody\savedfontbody \let\defaultfontclass\savedfontclass @@ -203,9 +182,8 @@ \font_helpers_set_math_family_bold_indeed#mbfam#familytag#mrfam% \fi} -%D It can happen that we use a bodyfont with no math in which case -%D we have a problem with setting the global bodyfont size in the -%D page builder. For instance in: +%D It can happen that we use a bodyfont with no math in which case we have a problem +%D with setting the global bodyfont size in the page builder. For instance in: %D %D \starttext %D \definetypeface[test][rm][serif][pagella][default] @@ -213,9 +191,9 @@ %D test %D \stoptext %D -%D This is why we need the check. At the cost of some extra checking we gain a little -%D in restoring global states and, what's more important, we get rid of large math parameter -%D push/pop in tracingall when not needed. +%D This is why we need the check. At the cost of some extra checking we gain a +%D little in restoring global states and, what's more important, we get rid of large +%D math parameter push/pop in tracingall when not needed. \def\font_helpers_preset_math_family_indeed#fam#familytag% {\expandafter\let\expandafter\v_font_math_one\csname\??fontinstanceclass\fontclass-\fontbody-\s!mm-#familytag-\fontsize-1\endcsname @@ -235,13 +213,14 @@ \let\font_helpers_reset_fontclass_math_families\gobbleoneargument -% It would be nice if characters could be defined in a neutral way (say fam 255) and -% be mapped to a real family during noad list construction. However, this changes -% tex in critical places so for the moment we simulate this using manipulation. - -% For tracing purposes we use three families but in l2r mode 1 and 2 are copies of 0 -% while in rl mode 0 is a copy of 1. There is no real overhead involved in this. This -% also permits different font definitions for normal and mixed. +%D It would be nice if characters could be defined in a neutral way (say fam 255) +%D and be mapped to a real family during noad list construction. However, this +%D changes tex in critical places so for the moment we simulate this using +%D manipulation. +%D +%D For tracing purposes we use three families but in l2r mode 1 and 2 are copies of +%D 0 while in rl mode 0 is a copy of 1. There is no real overhead involved in this. +%D This also permits different font definitions for normal and mixed. \let\m_font_class_direction\empty \let\m_font_class_features \empty @@ -439,10 +418,10 @@ \font_helpers_synchronize_math_bold_strategy \to \everymathematics -% Bold is somewhat special as we might want both full-bold-math mixed -% regular-math, as well as automatic adaption to outer bold (in titles -% and inline text bold) so we will need explicit switches as well as -% an automatic one. (We will use lucida as an example.) +%D Bold is somewhat special as we might want both full-bold-math mixed regular-math, +%D as well as automatic adaption to outer bold (in titles and inline text bold) so +%D we will need explicit switches as well as an automatic one. (We will use lucida +%D as an example.) \ifdefined\mathdefault \else \let\mathdefault\relax \fi diff --git a/tex/context/base/mkiv/font-mis.lua b/tex/context/base/mkiv/font-mis.lua index 6d5c9fbf2..e1f158c83 100644 --- a/tex/context/base/mkiv/font-mis.lua +++ b/tex/context/base/mkiv/font-mis.lua @@ -21,23 +21,37 @@ local readers = otf.readers if readers then - otf.version = otf.version or 3.029 + otf.version = otf.version or 3.103 otf.cache = otf.cache or containers.define("fonts", "otl", otf.version, true) function fonts.helpers.getfeatures(name,save) local filename = resolvers.findfile(name) or "" if filename ~= "" then - local name = file.removesuffix(file.basename(filename)) - local cleanname = containers.cleanname(name) - local data = containers.read(otf.cache,cleanname) - if data then - readers.unpack(data) - else - data = readers.loadfont(filename) - if data and save then - containers.write(otf.cache,cleanname,data) - end - end +-- local name = file.removesuffix(file.basename(filename)) +-- local cleanname = containers.cleanname(name) +-- local data = containers.read(otf.cache,cleanname) +-- if data then +-- readers.unpack(data) +-- else +-- data = readers.loadfont(filename) -- we can do a more minimal load +-- -- if data and save then +-- -- -- keep this in sync with font-otl +-- -- readers.compact(data) +-- -- readers.rehash(data,"unicodes") +-- -- readers.addunicodetable(data) +-- -- readers.extend(data) +-- -- readers.pack(data) +-- -- -- till here +-- -- containers.write(otf.cache,cleanname,data) +-- -- end +-- end +-- if not data then +-- data = readers.loadfont(filename) -- we can do a more minimal load +-- end +-- if data then +-- readers.unpack(data) +-- end +local data = otf.load(filename) return data and data.resources and data.resources.features end end diff --git a/tex/context/base/mkiv/font-mps.lua b/tex/context/base/mkiv/font-mps.lua index 69b2af68c..cde34f2ae 100644 --- a/tex/context/base/mkiv/font-mps.lua +++ b/tex/context/base/mkiv/font-mps.lua @@ -21,9 +21,9 @@ fonts = fonts or { } local metapost = fonts.metapost or { } fonts.metapost = metapost -local f_moveto = formatters["(%F,%F)"] -local f_lineto = formatters["--(%F,%F)"] -local f_curveto = formatters["..controls(%F,%F)and(%F,%F)..(%F,%F)"] +local f_moveto = formatters["(%.6F,%.6F)"] +local f_lineto = formatters["--(%.6F,%.6F)"] +local f_curveto = formatters["..controls(%.6F,%.6F)and(%.6F,%.6F)..(%.6F,%.6F)"] local s_cycle = "--cycle" local f_nofill = formatters["nofill %s;"] @@ -32,8 +32,8 @@ local f_dofill = formatters["fill %s;"] local f_draw_trace = formatters["drawpathonly %s;"] local f_draw = formatters["draw %s;"] -local f_boundingbox = formatters["((%F,%F)--(%F,%F)--(%F,%F)--(%F,%F)--cycle)"] -local f_vertical = formatters["((%F,%F)--(%F,%F))"] +local f_boundingbox = formatters["((%.6F,%.6F)--(%.6F,%.6F)--(%.6F,%.6F)--(%.6F,%.6F)--cycle)"] +local f_vertical = formatters["((%.6F,%.6F)--(%.6F,%.6F))"] function metapost.boundingbox(d,factor) local bounds = d.boundingbox @@ -275,9 +275,9 @@ local parameters = fonts.hashes.parameters local shapes = fonts.hashes.shapes local topaths = metapost.paths -local f_code = formatters["mfun_do_outline_text_flush(%q,%i,%F,%F)(%,t);"] -local f_rule = formatters["mfun_do_outline_rule_flush(%q,%F,%F,%F,%F);"] -local f_bounds = formatters["checkbounds(%F,%F,%F,%F);"] +local f_code = formatters["mfun_do_outline_text_flush(%q,%i,%.6F,%.6F)(%,t);"] +local f_rule = formatters["mfun_do_outline_rule_flush(%q,%.6F,%.6F,%.6F,%.6F);"] +local f_bounds = formatters["checkbounds(%.6F,%.6F,%.6F,%.6F);"] local s_nothing = "(origin scaled 10)" local sc = 10 diff --git a/tex/context/base/mkiv/font-nod.lua b/tex/context/base/mkiv/font-nod.lua index 9166970b8..2670a924b 100644 --- a/tex/context/base/mkiv/font-nod.lua +++ b/tex/context/base/mkiv/font-nod.lua @@ -11,7 +11,6 @@ if not modules then modules = { } end modules ['font-nod'] = { might become a runtime module instead. This module will be cleaned up!</p> --ldx]]-- -local tonumber, tostring, rawget = tonumber, tostring, rawget local utfchar = utf.char local concat, fastcopy = table.concat, table.fastcopy local match, rep = string.match, string.rep @@ -19,7 +18,10 @@ local match, rep = string.match, string.rep fonts = fonts or { } nodes = nodes or { } -local fonts, nodes, node, context = fonts, nodes, node, context + +local fonts = fonts +local nodes = nodes +local context = context local tracers = nodes.tracers or { } nodes.tracers = tracers @@ -69,7 +71,6 @@ local getkern = nuts.getkern local getdir = nuts.getdir local getwidth = nuts.getwidth -local setfield = nuts.setfield local setbox = nuts.setbox local setchar = nuts.setchar local setsubtype = nuts.setsubtype @@ -78,7 +79,7 @@ local copy_node_list = nuts.copy_list local hpack_node_list = nuts.hpack local flush_node_list = nuts.flush_list local traverse_nodes = nuts.traverse -local traverse_id = nuts.traverse_id +----- traverse_id = nuts.traverse_id local protect_glyphs = nuts.protect_glyphs local nodepool = nuts.pool @@ -135,22 +136,22 @@ function char_tracers.collect(head,list,tag,n) l[#l+1] = { c, f } elseif id == disc_code then -- skip --- local pre, post, replace = getdisc(head) --- if replace then --- for n in traverse_id(glyph_code,replace) do --- l[#l+1] = { c, f } --- end --- end --- if pre then --- for n in traverse_id(glyph_code,pre) do --- l[#l+1] = { c, f } --- end --- end --- if post then --- for n in traverse_id(glyph_code,post) do --- l[#l+1] = { c, f } --- end --- end + -- local pre, post, replace = getdisc(head) + -- if replace then + -- for n in traverse_id(glyph_code,replace) do + -- l[#l+1] = { c, f } + -- end + -- end + -- if pre then + -- for n in traverse_id(glyph_code,pre) do + -- l[#l+1] = { c, f } + -- end + -- end + -- if post then + -- for n in traverse_id(glyph_code,post) do + -- l[#l+1] = { c, f } + -- end + -- end else ok = false end @@ -298,24 +299,41 @@ function step_tracers.features() local f = collection[1] while f do if getid(f) == glyph_code then - local tfmdata, t = fontidentifiers[getfont(f)], { } + local tfmdata = fontidentifiers[getfont(f)] + local features = tfmdata.resources.features + local result_1 = { } + local result_2 = { } + local gpos = features and features.gpos or { } + local gsub = features and features.gsub or { } for feature, value in table.sortedhash(tfmdata.shared.features) do if feature == "number" or feature == "features" then - -- private + value = false elseif type(value) == "boolean" then if value then - t[#t+1] = formatters["%s=yes"](feature) + value = "yes" else - -- skip + value = false end else - t[#t+1] = formatters["%s=%s"](feature,value) + -- use value + end + if value then + if gpos[feature] or gsub[feature] or feature == "language" or feature == "script" then + result_1[#result_1+1] = formatters["%s=%s"](feature,value) + else + result_2[#result_2+1] = formatters["%s=%s"](feature,value) + end end end - if #t > 0 then - context(concat(t,", ")) + if #result_1 > 0 then + context("{\\bf[basic:} %, t{\\bf]} ",result_1) + else + context("{\\bf[}no basic features{\\bf]} ") + end + if #result_2 > 0 then + context("{\\bf[extra:} %, t{\\bf]}",result_2) else - context("no features") + context("{\\bf[}no extra features{\\bf]}") end return end @@ -366,7 +384,7 @@ function step_tracers.codes(i,command,space) local d = d and d[c] context[command](f,c,d and d.class or "") else - context("[%s:U+%05X]",f,c) + context("[%s:U+%X]",f,c) end end diff --git a/tex/context/base/mkiv/font-ocl.lua b/tex/context/base/mkiv/font-ocl.lua index 2ecf1ba42..b17cf991d 100644 --- a/tex/context/base/mkiv/font-ocl.lua +++ b/tex/context/base/mkiv/font-ocl.lua @@ -1,6 +1,6 @@ if not modules then modules = { } end modules ['font-ocl'] = { version = 1.001, - comment = "companion to font-otf.lua (context)", + comment = "companion to font-ini.mkiv", author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", copyright = "PRAGMA ADE / ConTeXt Development Team", license = "see context related readme files" @@ -8,7 +8,7 @@ if not modules then modules = { } end modules ['font-ocl'] = { -- todo : user list of colors -local tostring, next, format = tostring, next, string.format +local tostring, tonumber, next = tostring, tonumber, next local round, max = math.round, math.round local sortedkeys, sortedhash = table.sortedkeys, table.sortedhash local setmetatableindex = table.setmetatableindex @@ -18,8 +18,8 @@ local tounicode = fonts.mappings.tounicode local otf = fonts.handlers.otf -local f_color = formatters["pdf:direct:%f %f %f rg"] -local f_gray = formatters["pdf:direct:%f g"] +local f_color = formatters["%.3f %.3f %.3f rg"] +local f_gray = formatters["%.3f g"] if context then @@ -49,7 +49,7 @@ end local sharedpalettes = { } local hash = setmetatableindex(function(t,k) - local v = { "special", k } + local v = { "pdf", "direct", k } t[k] = v return v end) @@ -76,11 +76,11 @@ if context then t = transparencies[v] end if c and t then - values[i] = hash["pdf:direct:" .. lpdf.color(1,c) .. " " .. lpdf.transparency(t)] + values[i] = hash[lpdf.color(1,c) .. " " .. lpdf.transparency(t)] elseif c then - values[i] = hash["pdf:direct:" .. lpdf.color(1,c)] + values[i] = hash[lpdf.color(1,c)] elseif t then - values[i] = hash["pdf:direct:" .. lpdf.color(1,t)] + values[i] = hash[lpdf.color(1,t)] end end end @@ -101,12 +101,11 @@ else -- for generic end --- We need to force page first because otherwise the q's get outside --- the font switch and as a consequence the next character has no font --- set (well, it has: the preceding one). As a consequence these fonts --- are somewhat inefficient as each glyph gets the font set. It's a --- side effect of the fact that a font is handled when a character gets --- flushed. +-- We need to force page first because otherwise the q's get outside the font switch and +-- as a consequence the next character has no font set (well, it has: the preceding one). As +-- a consequence these fonts are somewhat inefficient as each glyph gets the font set. It's +-- a side effect of the fact that a font is handled when a character gets flushed. Okay, from +-- now on we can use text as literal mode. local function convert(t,k) local v = { } @@ -123,6 +122,105 @@ local function convert(t,k) return v end +local start = { "pdf", "mode", "font" } -- force text mode (so get q Q right) +----- stop = { "pdf", "mode", "page" } -- force page mode (else overlap) +local push = { "pdf", "page", "q" } +local pop = { "pdf", "page", "Q" } + +if not LUATEXFUNCTIONALITY or LUATEXFUNCTIONALITY < 6472 then + start = { "nop" } + ----- = stop +end + +-- -- This one results in color directives inside BT ET but has less q Q pairs. It +-- -- only shows the first glyph in acrobat and nothing more. No problem with other +-- -- renderers. +-- +-- local function initializecolr(tfmdata,kind,value) -- hm, always value +-- if value then +-- local resources = tfmdata.resources +-- local palettes = resources.colorpalettes +-- if palettes then +-- -- +-- local converted = resources.converted +-- if not converted then +-- converted = setmetatableindex(convert) +-- resources.converted = converted +-- end +-- local colorvalues = sharedpalettes[value] or converted[palettes[tonumber(value) or 1] or palettes[1]] or { } +-- local classes = #colorvalues +-- if classes == 0 then +-- return +-- end +-- -- +-- local characters = tfmdata.characters +-- local descriptions = tfmdata.descriptions +-- local properties = tfmdata.properties +-- -- +-- properties.virtualized = true +-- tfmdata.fonts = { +-- { id = 0 } +-- } +-- local widths = setmetatableindex(function(t,k) +-- local v = { "right", -k } +-- t[k] = v +-- return v +-- end) +-- -- +-- local getactualtext = otf.getactualtext +-- local default = colorvalues[#colorvalues] +-- local b, e = getactualtext(tounicode(0xFFFD)) +-- local actualb = { "pdf", "page", b } -- saves tables +-- local actuale = { "pdf", "page", e } -- saves tables +-- -- +-- local cache = setmetatableindex(function(t,k) +-- local v = { "char", k } -- could he a weak shared hash +-- t[k] = v +-- return v +-- end) +-- -- +-- for unicode, character in next, characters do +-- local description = descriptions[unicode] +-- if description then +-- local colorlist = description.colors +-- if colorlist then +-- local u = description.unicode or characters[unicode].unicode +-- local w = character.width or 0 +-- local s = #colorlist +-- local goback = w ~= 0 and widths[w] or nil -- needs checking: are widths the same +-- local t = { +-- start, +-- not u and actualb or { "pdf", "page", (getactualtext(tounicode(u))) } +-- } +-- local n = 2 +-- local l = nil +-- n = n + 1 t[n] = push +-- for i=1,s do +-- local entry = colorlist[i] +-- local v = colorvalues[entry.class] or default +-- if v and l ~= v then +-- n = n + 1 t[n] = v +-- l = v +-- end +-- n = n + 1 t[n] = cache[entry.slot] +-- if s > 1 and i < s and goback then +-- n = n + 1 t[n] = goback +-- end +-- end +-- n = n + 1 t[n] = pop +-- n = n + 1 t[n] = actuale +-- n = n + 1 t[n] = stop +-- character.commands = t +-- end +-- end +-- end +-- end +-- end +-- end +-- +-- -- Here we have no color change in BT .. ET and more q Q pairs but even then acrobat +-- -- fails displaying the overlays correctly. Other renderers do it right. + local function initializecolr(tfmdata,kind,value) -- hm, always value if value then local resources = tfmdata.resources @@ -157,13 +255,11 @@ local function initializecolr(tfmdata,kind,value) -- hm, always value local getactualtext = otf.getactualtext local default = colorvalues[#colorvalues] local b, e = getactualtext(tounicode(0xFFFD)) - local start = { "special", "pdf:page:q" } - local stop = { "special", "pdf:raw:Q" } - local actualb = { "special", "pdf:page:" .. b } -- saves tables - local actuale = { "special", "pdf:page:" .. e } -- saves tables + local actualb = { "pdf", "page", b } -- saves tables + local actuale = { "pdf", "page", e } -- saves tables -- local cache = setmetatableindex(function(t,k) - local v = { "char", k } + local v = { "char", k } -- could he a weak shared hash t[k] = v return v end) @@ -178,15 +274,21 @@ local function initializecolr(tfmdata,kind,value) -- hm, always value local s = #colorlist local goback = w ~= 0 and widths[w] or nil -- needs checking: are widths the same local t = { - start, - not u and actualb or { "special", "pdf:raw:" .. getactualtext(tounicode(u)) } + start, -- really needed + not u and actualb or { "pdf", "page", (getactualtext(tounicode(u))) } } local n = 2 local l = nil + local f = false for i=1,s do local entry = colorlist[i] local v = colorvalues[entry.class] or default if v and l ~= v then + if f then + n = n + 1 t[n] = pop + end + n = n + 1 t[n] = push + f = true n = n + 1 t[n] = v l = v end @@ -195,8 +297,11 @@ local function initializecolr(tfmdata,kind,value) -- hm, always value n = n + 1 t[n] = goback end end + if f then + n = n + 1 t[n] = pop + end n = n + 1 t[n] = actuale - n = n + 1 t[n] = stop + -- n = n + 1 t[n] = stop -- not needed character.commands = t end end @@ -301,7 +406,9 @@ local function pdftovirtual(tfmdata,pdfshapes,kind) -- kind = sbix|svg local getactualtext = otf.getactualtext local storepdfdata = otf.storepdfdata -- - -- local nop = { "nop" } + local b, e = getactualtext(tounicode(0xFFFD)) + local actualb = { "pdf", "page", b } -- saves tables + local actuale = { "pdf", "page", e } -- saves tables -- for unicode, character in sortedhash(characters) do -- sort is nicer for svg local index = character.index @@ -323,18 +430,18 @@ local function pdftovirtual(tfmdata,pdfshapes,kind) -- kind = sbix|svg if data then local setcode, name, nilcode = storepdfdata(data) if name then - local bt, et = getactualtext(unicode) + local bt = unicode and getactualtext(unicode) local wd = character.width or 0 local ht = character.height or 0 local dp = character.depth or 0 character.commands = { - { "special", "pdf:direct:" .. bt }, + not unicode and actualb or { "pdf", "page", (getactualtext(unicode)) }, { "down", dp + dy * hfactor }, { "right", dx * hfactor }, -- setcode and { "lua", setcode } or nop, { "image", { filename = name, width = wd, height = ht, depth = dp } }, -- nilcode and { "lua", nilcode } or nop, - { "special", "pdf:direct:" .. et }, + actuale, } character[kind] = true end diff --git a/tex/context/base/mkiv/font-odk.lua b/tex/context/base/mkiv/font-odk.lua deleted file mode 100644 index c34efc120..000000000 --- a/tex/context/base/mkiv/font-odk.lua +++ /dev/null @@ -1,904 +0,0 @@ --- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --- We keep the original around for a while so that we can check it -- --- when the above code does it wrong (data tables are not included). -- --- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - --- author : Kai Eigner, TAT Zetwerk --- copyright : TAT Zetwerk --- comment : see font-odv.lua for current implementation - --- local state = attributes.private('state') --- local sylnr = attributes.private('syllabe') --- --- local function install_dev(tfmdata) --- local features = tfmdata.resources.features --- local sequences = tfmdata.resources.sequences --- --- local insertpos = 1 --- for s=1,#sequences do -- classify chars --- for k in pairs(basic_shaping_forms) do --- if sequences[s].features and ( sequences[s].features[k] or sequences[s].features.locl ) then insertpos = s + 1 end --- end --- end --- --- features.gsub["dev2_reorder_matras"] = { ["dev2"] = { ["dflt"] = true } } --- features.gsub["dev2_reorder_reph"] = { ["dev2"] = { ["dflt"] = true } } --- features.gsub["dev2_reorder_pre_base_reordering_consonants"] = { ["dev2"] = { ["dflt"] = true } } --- features.gsub["remove_joiners"] = { ["deva"] = { ["dflt"] = true }, ["dev2"] = { ["dflt"] = true } } --- --- local sequence_dev2_reorder_matras = { --- chain = 0, --- features = { dev2_reorder_matras = { dev2 = { dflt = true } } }, --- flags = { false, false, false, false }, --- name = "dev2_reorder_matras", --- subtables = { "dev2_reorder_matras" }, --- type = "dev2_reorder_matras", --- } --- local sequence_dev2_reorder_reph = { --- chain = 0, --- features = { dev2_reorder_reph = { dev2 = { dflt = true } } }, --- flags = { false, false, false, false }, --- name = "dev2_reorder_reph", --- subtables = { "dev2_reorder_reph" }, --- type = "dev2_reorder_reph", --- } --- local sequence_dev2_reorder_pre_base_reordering_consonants = { --- chain = 0, --- features = { dev2_reorder_pre_base_reordering_consonants = { dev2 = { dflt = true } } }, --- flags = { false, false, false, false }, --- name = "dev2_reorder_pre_base_reordering_consonants", --- subtables = { "dev2_reorder_pre_base_reordering_consonants" }, --- type = "dev2_reorder_pre_base_reordering_consonants", --- } --- local sequence_remove_joiners = { --- chain = 0, --- features = { remove_joiners = { deva = { dflt = true }, dev2 = { dflt = true } } }, --- flags = { false, false, false, false }, --- name = "remove_joiners", --- subtables = { "remove_joiners" }, --- type = "remove_joiners", --- } --- table.insert(sequences, insertpos, sequence_dev2_reorder_pre_base_reordering_consonants) --- table.insert(sequences, insertpos, sequence_dev2_reorder_reph) --- table.insert(sequences, insertpos, sequence_dev2_reorder_matras) --- table.insert(sequences, insertpos, sequence_remove_joiners) --- end --- --- local function deva_reorder(head,start,stop,font,attr) --- local tfmdata = fontdata[font] --- local lookuphash = tfmdata.resources.lookuphash --- local sequences = tfmdata.resources.sequences --- --- if not lookuphash["remove_joiners"] then install_dev(tfmdata) end --install Devanagari-features --- --- local sharedfeatures = tfmdata.shared.features --- sharedfeatures["remove_joiners"] = true --- local datasets = otf.dataset(tfmdata,font,attr) --- --- lookuphash["remove_joiners"] = { [0x200C] = true, [0x200D] = true } --- --- local current, n, base, firstcons, lastcons, basefound = start, start.next, nil, nil, nil, false --- local reph, vattu = false, false --- for s=1,#sequences do --- local dataset = datasets[s] --- featurevalue = dataset and dataset[1] --- if featurevalue and dataset[4] == "rphf" then reph = true end --- if featurevalue and dataset[4] == "blwf" then vattu = true end --- end --- if ra[start.char] and halant[n.char] and reph then -- if syllable starts with Ra + H and script has 'Reph' then exclude Reph from candidates for base consonants --- if n == stop then return head, stop end --- if zwj[n.next.char] then --- current = start --- else --- current = n.next --- set_attribute(start,state,5) -- rphf --- end --- end --- --- if nbsp[current.char] then --Stand Alone cluster --- if current == stop then --- stop = stop.prev --- head = node.remove(head, current) --- node.free(current) --- return head, stop --- else --- base, firstcons, lastcons = current, current, current --- current = current.next --- if current ~= stop then --- if nukta[current.char] then current = current.next end --- if zwj[current.char] then --- if current ~= stop and current.next ~= stop and halant[current.next.char] then --- current = current.next --- local tmp = current.next.next --- local changestop = current.next == stop --- local tempcurrent = node.copy(current.next) --- tempcurrent.next = node.copy(current) --- tempcurrent.next.prev = tempcurrent --- set_attribute(tempcurrent,state,8) --blwf --- tempcurrent = nodes.handlers.characters(tempcurrent) --- unset_attribute(tempcurrent,state) --- if current.next.char == tempcurrent.char then --- node.flush_list(tempcurrent) --- local n = node.copy(current) --- current.char = dotted_circle --- head = node.insert_after(head, current, n) --- else --- current.char = tempcurrent.char -- (assumes that result of blwf consists of one node) --- local freenode = current.next --- current.next = tmp --- tmp.prev = current --- node.free(freenode) --- node.flush_list(tempcurrent) --- if changestop then stop = current end --- end --- end --- end --- end --- end --- end --- --- while not basefound do -- find base consonant --- if consonant[current.char] then --- set_attribute(current, state, 6) -- half --- if not firstcons then firstcons = current end --- lastcons = current --- if not base then --- base = current --- else --check whether consonant has below-base (or post-base) form --- local baseform = true --- for s=1,#sequences do --- local sequence = sequences[s] --- local dataset = datasets[s] --- featurevalue = dataset and dataset[1] --- if featurevalue and dataset[4] == "blwf" then --- local subtables = sequence.subtables --- for i=1,#subtables do --- local lookupname = subtables[i] --- local lookupcache = lookuphash[lookupname] --- if lookupcache then --- local lookupmatch = lookupcache[current.char] --- if lookupmatch then --- set_attribute(current, state, 8) -- blwf --- baseform = false --- end --- end --- end --- end --- end --- if baseform then base = current end --- end --- end --- basefound = current == stop --- current = current.next --- end --- if base ~= lastcons then -- if base consonant is not last one then move halant from base consonant to last one --- n = base.next --- if nukta[n.char] then n = n.next end --- if halant[n.char] then --- if lastcons ~= stop then --- local ln = lastcons.next --- if nukta[ln.char] then lastcons = ln end --- end --- local np, nn, ln = n.prev, n.next, lastcons.next --- np.next = n.next --- nn.prev = n.prev --- lastcons.next = n --- if ln then ln.prev = n end --- n.next = ln --- n.prev = lastcons --- if lastcons == stop then stop = n end --- end --- end --- --- n = start.next --- if ra[start.char] and halant[n.char] and not ( n ~= stop and ( zwj[n.next.char] or zwnj[n.next.char] ) ) then -- if syllable starts with Ra + H then move this combination so that it follows either: the post-base 'matra' (if any) or the base consonant --- local matra = base --- if base ~= stop and dependent_vowel[base.next.char] then matra = base.next end --- local sp, nn, mn = start.prev, n.next, matra.next --- if sp then sp.next = nn end --- nn.prev = sp --- matra.next = start --- start.prev = matra --- n.next = mn --- if mn then mn.prev = n end --- if head == start then head = nn end --- start = nn --- if matra == stop then stop = n end --- end --- --- local current = start --- while current ~= stop do --- if halant[current.next.char] and current.next ~= stop and zwnj[current.next.next.char] then unset_attribute(current, state) end --- current = current.next --- end --- --- if has_attribute(base, state) and base ~= stop and halant[base.next.char] and not ( base.next ~= stop and zwj[base.next.next.char] ) then unset_attribute(base, state) end --- --- local current, allreordered, moved = start, false, { [base] = true } --- local a, b, p, bn = base, base, base, base.next --- if base ~= stop and nukta[bn.char] then a, b, p = bn, bn, bn end --- while not allreordered do --- local c, n, l = current, current.next, nil --current is always consonant --- if c ~= stop and nukta[n.char] then c = n n = n.next end --- if c ~= stop and halant[n.char] then c = n n = n.next end --- while c ~= stop and dependent_vowel[n.char] do c = n n = n.next end --- if c ~= stop and vowel_modifier[n.char] then c = n n = n.next end --- if c ~= stop and stress_tone_mark[n.char] then c = n n = n.next end --- local bp, cn = firstcons.prev, current.next --- while cn ~= c.next do -- move pre-base matras... --- if pre_mark[cn.char] then --- if bp then bp.next = cn end --- cn.prev.next = cn.next --- if cn.next then cn.next.prev = cn.prev end --- if cn == stop then stop = cn.prev end --- cn.prev = bp --- cn.next = firstcons --- firstcons.prev = cn --- if firstcons == start then --- if head == start then head = cn end --- start = cn --- end --- break --- end --- cn = cn.next --- end --- allreordered = c == stop --- current = c.next --- end --- --- if reph or vattu then --- local current, cns = start, nil --- while current ~= stop do --- local c, n = current, current.next --- if ra[current.char] and halant[n.char] then --- c, n = n, n.next --- local b, bn = base, base --- while bn ~= stop do --- if dependent_vowel[bn.next.char] then b = bn.next end --- bn = bn.next --- end --- if has_attribute(current,state,attribute) == 5 then -- position Reph (Ra + H) after post-base 'matra' (if any) since these become marks on the 'matra', not on the base glyph --- if b ~= current then --- if current == start then --- if head == start then head = n end --- start = n --- end --- if b == stop then stop = c end --- if current.prev then current.prev.next = n end --- if n then n.prev = current.prev end --- c.next = b.next --- if b.next then b.next.prev = c end --- b.next = current --- current.prev = b --- end --- elseif cns and cns.next ~= current then -- position below-base Ra (vattu) following the consonants on which it is placed (either the base consonant or one of the pre-base consonants) --- local cp, cnsn = current.prev, cns.next --- if cp then cp.next = n end --- if n then n.prev = cp end --- cns.next = current --- current.prev = cns --- c.next = cnsn --- if cnsn then cnsn.prev = c end --- if c == stop then stop = cp break end --- current = n.prev --- end --- elseif consonant[current.char] or nbsp[current.char] then --- cns = current --- if halant[cns.next.char] then cns = cns.next end --- end --- current = current.next --- end --- end --- --- if nbsp[base.char] then --- head = node.remove(head, base) --- node.free(base) --- end --- --- return head, stop --- end --- --- function dev2_reorder_matras(start,kind,lookupname,replacement) --- local current = start --- while current and current.id == glyph and current.subtype<256 and current.font == start.font and has_attribute(current, sylnr) == has_attribute(start, sylnr) do --- if halant[current.char] and not has_attribute(current, state) then --- if current.next and current.next.id == glyph and current.next.subtype<256 and current.next.font == start.font and has_attribute(current.next, sylnr) == has_attribute(start, sylnr) and ( zwj[current.next.char] or zwnj[current.next.char] ) then current = current.next end --- local sn = start.next --- start.next.prev = start.prev --- if start.prev then start.prev.next = start.next end --- if current.next then current.next.prev = start end --- start.next = current.next --- current.next = start --- start.prev = current --- start = sn --- break --- end --- current = current.next --- end --- return start, true --- end --- --- function dev2_reorder_reph(start,kind,lookupname,replacement) --- local current, sn = start.next, nil --- while current and current.id == glyph and current.subtype<256 and current.font == start.font and has_attribute(current, sylnr) == has_attribute(start, sylnr) do --step 2 --- if halant[current.char] and not has_attribute(current, state) then --- if current.next and current.next.id == glyph and current.next.subtype<256 and current.next.font == start.font and has_attribute(current.next, sylnr) == has_attribute(start, sylnr) and ( zwj[current.next.char] or zwnj[current.next.char] ) then current = current.next end --- sn = start.next --- start.next.prev = start.prev --- if start.prev then start.prev.next = start.next end --- if current.next then current.next.prev = start end --- start.next = current.next --- current.next = start --- start.prev = current --- start = sn --- break --- end --- current = current.next --- end --- if not sn then --- current = start.next --- while current and current.id == glyph and current.subtype<256 and current.font == start.font and has_attribute(current, sylnr) == has_attribute(start, sylnr) do --step 4 --- if has_attribute(current, state) == 9 then --post-base --- sn = start.next --- start.next.prev = start.prev --- if start.prev then start.prev.next = start.next end --- start.prev = current.prev --- current.prev.next = start --- start.next = current --- current.prev = start --- start = sn --- break --- end --- current = current.next --- end --- end --- if not sn then --- current = start.next --- local c = nil --- while current and current.id == glyph and current.subtype<256 and current.font == start.font and has_attribute(current, sylnr) == has_attribute(start, sylnr) do --step 5 --- if not c and ( above_mark[current.char] or below_mark[current.char] or post_mark[current.char] ) and ReorderClass[current.char] ~= "after subscript" then c = current end --- current = current.next --- end --- if c then --- sn = start.next --- start.next.prev = start.prev --- if start.prev then start.prev.next = start.next end --- start.prev = c.prev --- c.prev.next = start --- start.next = c --- c.prev = start --- start = sn --- end --- end --- if not sn then --- current = start --- while current.next and current.next.id == glyph and current.next.subtype<256 and current.next.font == start.font and has_attribute(current.next, sylnr) == has_attribute(start, sylnr) do --step 6 --- current = current.next --- end --- if start ~= current then --- sn = start.next --- start.next.prev = start.prev --- if start.prev then start.prev.next = start.next end --- if current.next then current.next.prev = start end --- start.next = current.next --- current.next = start --- start.prev = current --- start = sn --- end --- end --- return start, true --- end --- --- function dev2_reorder_pre_base_reordering_consonants(start,kind,lookupname,replacement) --- local current, sn = start, nil --- while current and current.id == glyph and current.subtype<256 and current.font == start.font and has_attribute(current, sylnr) == has_attribute(start, sylnr) do --- if halant[current.char] and not has_attribute(current, state) then --- if current.next and current.next.id == glyph and current.next.subtype<256 and current.next.font == start.font and has_attribute(current.next, sylnr) == has_attribute(start, sylnr) and ( zwj[current.next.char] or zwnj[current.next.char] ) then current = current.next end --- sn = start.next --- start.next.prev = start.prev --- if start.prev then start.prev.next = start.next end --- if current.next then current.next.prev = start end --- start.next = current.next --- current.next = start --- start.prev = current --- start = sn --- break --- end --- current = current.next --- end --- if not sn then --- current = start.next --- while current and current.id == glyph and current.subtype<256 and current.font == start.font and has_attribute(current, sylnr) == has_attribute(start, sylnr) do --- if not consonant[current.char] and has_attribute(current, state) then --main --- sn = start.next --- start.next.prev = start.prev --- if start.prev then start.prev.next = start.next end --- start.prev = current.prev --- current.prev.next = start --- start.next = current --- current.prev = start --- start = sn --- break --- end --- current = current.next --- end --- end --- return start, true --- end --- --- function remove_joiners(start,kind,lookupname,replacement) --- local stop = start.next --- while stop and stop.id == glyph and stop.subtype<256 and stop.font == start.font and (zwj[stop.char] or zwnj[stop.char]) do stop = stop.next end --- if stop then stop.prev.next = nil stop.prev = start.prev end --- if start.prev then start.prev.next = stop end --- node.flush_list(start) --- return stop, true --- end --- --- local function dev2_reorder(head,start,stop,font,attr) --- local tfmdata = fontdata[font] --- local lookuphash = tfmdata.resources.lookuphash --- local sequences = tfmdata.resources.sequences --- --- if not lookuphash["remove_joiners"] then install_dev(tfmdata) end --install Devanagari-features --- --- local sharedfeatures = tfmdata.shared.features --- sharedfeatures["dev2_reorder_matras"] = true --- sharedfeatures["dev2_reorder_reph"] = true --- sharedfeatures["dev2_reorder_pre_base_reordering_consonants"] = true --- sharedfeatures["remove_joiners"] = true --- local datasets = otf.dataset(tfmdata,font,attr) --- --- local reph, pre_base_reordering_consonants = false, nil --- local halfpos, basepos, subpos, postpos = nil, nil, nil, nil --- local locl = { } --- --- for s=1,#sequences do -- classify chars --- local sequence = sequences[s] --- local dataset = datasets[s] --- featurevalue = dataset and dataset[1] --- if featurevalue and dataset[4] then --- local subtables = sequence.subtables --- for i=1,#subtables do --- local lookupname = subtables[i] --- local lookupcache = lookuphash[lookupname] --- if lookupcache then --- if dataset[4] == "rphf" then --- if dataset[3] ~= 0 then --rphf is result of of chain --- else --- reph = lookupcache[0x0930] and lookupcache[0x0930][0x094D] and lookupcache[0x0930][0x094D]["ligature"] --- end --- end --- if dataset[4] == "pref" and not pre_base_reordering_consonants then --- for k, v in pairs(lookupcache[0x094D]) do --- pre_base_reordering_consonants[k] = v and v["ligature"] --ToDo: reph might also be result of chain --- end --- end --- local current = start --- while current ~= stop.next do --- if dataset[4] == "locl" then locl[current] = lookupcache[current.char] end --ToDo: locl might also be result of chain --- if current ~= stop then --- local c, n = locl[current] or current.char, locl[current.next] or current.next.char --- if dataset[4] == "rphf" and lookupcache[c] and lookupcache[c][n] then --above-base: rphf Consonant + Halant --- if current.next ~= stop and ( zwj[current.next.next.char] or zwnj[current.next.next.char] ) then --ZWJ and ZWNJ prevent creation of reph --- current = current.next --- elseif current == start then --- set_attribute(current,state,5) --- end --- current = current.next --- end --- if dataset[4] == "half" and lookupcache[c] and lookupcache[c][n] then --half forms: half Consonant + Halant --- if current.next ~= stop and zwnj[current.next.next.char] then --ZWNJ prevent creation of half --- current = current.next --- else --- set_attribute(current,state,6) --- if not halfpos then halfpos = current end --- end --- current = current.next --- end --- if dataset[4] == "pref" and lookupcache[c] and lookupcache[c][n] then --pre-base: pref Halant + Consonant --- set_attribute(current,state,7) --- set_attribute(current.next,state,7) --- current = current.next --- end --- if dataset[4] == "blwf" and lookupcache[c] and lookupcache[c][n] then --below-base: blwf Halant + Consonant --- set_attribute(current,state,8) --- set_attribute(current.next,state,8) --- current = current.next --- subpos = current --- end --- if dataset[4] == "pstf" and lookupcache[c] and lookupcache[c][n] then --post-base: pstf Halant + Consonant --- set_attribute(current,state,9) --- set_attribute(current.next,state,9) --- current = current.next --- postpos = current --- end --- end --- current = current.next --- end --- end --- end --- end --- end --- --- lookuphash["dev2_reorder_matras"] = pre_mark --- lookuphash["dev2_reorder_reph"] = { [reph] = true } --- lookuphash["dev2_reorder_pre_base_reordering_consonants"] = pre_base_reordering_consonants or { } --- lookuphash["remove_joiners"] = { [0x200C] = true, [0x200D] = true } --- --- local current, base, firstcons = start, nil, nil --- if has_attribute(start,state) == 5 then current = start.next.next end -- if syllable starts with Ra + H and script has 'Reph' then exclude Reph from candidates for base consonants --- --- if current ~= stop.next and nbsp[current.char] then --Stand Alone cluster --- if current == stop then --- stop = stop.prev --- head = node.remove(head, current) --- node.free(current) --- return head, stop --- else --- base = current --- current = current.next --- if current ~= stop then --- if nukta[current.char] then current = current.next end --- if zwj[current.char] then --- if current ~= stop and current.next ~= stop and halant[current.next.char] then --- current = current.next --- local tmp = current.next.next --- local changestop = current.next == stop --- current.next.next = nil --- set_attribute(current,state,7) --pref --- current = nodes.handlers.characters(current) --- set_attribute(current,state,8) --blwf --- current = nodes.handlers.characters(current) --- set_attribute(current,state,9) --pstf --- current = nodes.handlers.characters(current) --- unset_attribute(current,state) --- if halant[current.char] then --- current.next.next = tmp --- local nc = node.copy(current) --- current.char = dotted_circle --- head = node.insert_after(head, current, nc) --- else --- current.next = tmp -- (assumes that result of pref, blwf, or pstf consists of one node) --- if changestop then stop = current end --- end --- end --- end --- end --- end --- else --not Stand Alone cluster --- while current ~= stop.next do -- find base consonant --- if consonant[current.char] and not ( current ~= stop and halant[current.next.char] and current.next ~= stop and zwj[current.next.next.char] ) then --- if not firstcons then firstcons = current end --- if not ( has_attribute(current, state) == 7 or has_attribute(current, state) == 8 or has_attribute(current, state) == 9 ) then base = current end --check whether consonant has below-base or post-base form or is pre-base reordering Ra --- end --- current = current.next --- end --- if not base then --- base = firstcons --- end --- end --- --- if not base then --- if has_attribute(start, state) == 5 then unset_attribute(start, state) end --- return head, stop --- else --- if has_attribute(base, state) then unset_attribute(base, state) end --- basepos = base --- end --- if not halfpos then halfpos = base end --- if not subpos then subpos = base end --- if not postpos then postpos = subpos or base end --- --- --Matra characters are classified and reordered by which consonant in a conjunct they have affinity for --- local moved = { } --- current = start --- while current ~= stop.next do --- local char, target, cn = locl[current] or current.char, nil, current.next --- if not moved[current] and dependent_vowel[char] then --- if pre_mark[char] then -- Before first half form in the syllable --- moved[current] = true --- if current.prev then current.prev.next = current.next end --- if current.next then current.next.prev = current.prev end --- if current == stop then stop = current.prev end --- if halfpos == start then --- if head == start then head = current end --- start = current --- end --- if halfpos.prev then halfpos.prev.next = current end --- current.prev = halfpos.prev --- halfpos.prev = current --- current.next = halfpos --- halfpos = current --- elseif above_mark[char] then -- After main consonant --- target = basepos --- if subpos == basepos then subpos = current end --- if postpos == basepos then postpos = current end --- basepos = current --- elseif below_mark[char] then -- After subjoined consonants --- target = subpos --- if postpos == subpos then postpos = current end --- subpos = current --- elseif post_mark[char] then -- After post-form consonant --- target = postpos --- postpos = current --- end --- if ( above_mark[char] or below_mark[char] or post_mark[char] ) and current.prev ~= target then --- if current.prev then current.prev.next = current.next end --- if current.next then current.next.prev = current.prev end --- if current == stop then stop = current.prev end --- if target.next then target.next.prev = current end --- current.next = target.next --- target.next = current --- current.prev = target --- end --- end --- current = cn --- end --- --- --Reorder marks to canonical order: Adjacent nukta and halant or nukta and vedic sign are always repositioned if necessary, so that the nukta is first. --- local current, c = start, nil --- while current ~= stop do --- if halant[current.char] or stress_tone_mark[current.char] then --- if not c then c = current end --- else --- c = nil --- end --- if c and nukta[current.next.char] then --- if head == c then head = current.next end --- if stop == current.next then stop = current end --- if c.prev then c.prev.next = current.next end --- current.next.prev = c.prev --- current.next = current.next.next --- if current.next.next then current.next.next.prev = current end --- c.prev = current.next --- current.next.next = c --- end --- if stop == current then break end --- current = current.next --- end --- --- if nbsp[base.char] then --- head = node.remove(head, base) --- node.free(base) --- end --- --- return head, stop --- end --- --- function fonts.analyzers.methods.deva(head,font,attr) --- local orighead = head --- local current, start, done = head, true, false --- while current do --- if current.id == glyph and current.subtype<256 and current.font == font then --- done = true --- local syllablestart, syllableend = current, nil --- --- local c = current --Checking Stand Alone cluster (this behavior is copied from dev2) --- if ra[c.char] and c.next and c.next.id == glyph and c.next.subtype<256 and c.next.font == font and halant[c.next.char] and c.next.next and c.next.next.id == glyph and c.next.next.subtype<256 and c.next.next.font == font then c = c.next.next end --- if nbsp[c.char] and ( not current.prev or current.prev.id ~= glyph or current.prev.subtype>=256 or current.prev.font ~= font or --- ( not consonant[current.prev.char] and not independent_vowel[current.prev.char] and not dependent_vowel[current.prev.char] and --- not vowel_modifier[current.prev.char] and not stress_tone_mark[current.prev.char] and not nukta[current.prev.char] and not halant[current.prev.char] ) --- ) then --Stand Alone cluster (at the start of the word only): #[Ra+H]+NBSP+[N]+[<[<ZWJ|ZWNJ>]+H+C>]+[{M}+[N]+[H]]+[SM]+[(VD)] --- if c.next and c.next.id == glyph and c.next.subtype<256 and c.next.font == font and nukta[c.next.char] then c = c.next end --- local n = c.next --- if n and n.id == glyph and n.subtype<256 and n.font == font then --- local ni = n.next --- if ( zwj[n.char] or zwnj[n.char] ) and ni and ni.id == glyph and ni.subtype<256 and ni.font == font then n = ni ni = ni.next end --- if halant[n.char] and ni and ni.id == glyph and ni.subtype<256 and ni.font == font and consonant[ni.char] then c = ni end --- end --- while c.next and c.next.id == glyph and c.next.subtype<256 and c.next.font == font and dependent_vowel[c.next.char] do c = c.next end --- if c.next and c.next.id == glyph and c.next.subtype<256 and c.next.font == font and nukta[c.next.char] then c = c.next end --- if c.next and c.next.id == glyph and c.next.subtype<256 and c.next.font == font and halant[c.next.char] then c = c.next end --- if c.next and c.next.id == glyph and c.next.subtype<256 and c.next.font == font and vowel_modifier[c.next.char] then c = c.next end --- if c.next and c.next.id == glyph and c.next.subtype<256 and c.next.font == font and stress_tone_mark[c.next.char] then c = c.next end --- if c.next and c.next.id == glyph and c.next.subtype<256 and c.next.font == font and stress_tone_mark[c.next.char] then c = c.next end --- current = c.next --- syllableend = c --- if syllablestart ~= syllableend then --- head, current = deva_reorder(head, syllablestart,syllableend,font,attr) --- current = current.next --- end --- elseif consonant[current.char] then -- syllable containing consonant --- prevc = true --- while prevc do --- prevc = false --- local n = current.next --- if n and n.id == glyph and n.subtype<256 and n.font == font and nukta[n.char] then n = n.next end --- if n and n.id == glyph and n.subtype<256 and n.font == font and halant[n.char] then --- local n = n.next --- if n and n.id == glyph and n.subtype<256 and n.font == font and ( zwj[n.char] or zwnj[n.char] ) then n = n.next end --- if n and n.id == glyph and n.subtype<256 and n.font == font and consonant[n.char] then --- prevc = true --- current = n --- end --- end --- end --- if current.next and current.next.id == glyph and current.next.subtype<256 and current.next.font == font and nukta[current.next.char] then current = current.next end -- nukta (not specified in Microsft Devanagari OpenType specification) --- syllableend = current --- current = current.next --- if current and current.id == glyph and current.subtype<256 and current.font == font and halant[current.char] then -- syllable containing consonant without vowels: {C + [Nukta] + H} + C + H --- if current.next and current.next.id == glyph and current.next.subtype<256 and current.next.font == font and ( zwj[current.next.char] or zwnj[current.next.char] ) then current = current.next end --- syllableend = current --- current = current.next --- else -- syllable containing consonant with vowels: {C + [Nukta] + H} + C + [M] + [VM] + [SM] --- if current and current.id == glyph and current.subtype<256 and current.font == font and dependent_vowel[current.char] then --- syllableend = current --- current = current.next --- end --- if current and current.id == glyph and current.subtype<256 and current.font == font and vowel_modifier[current.char] then --- syllableend = current --- current = current.next --- end --- if current and current.id == glyph and current.subtype<256 and current.font == font and stress_tone_mark[current.char] then --- syllableend = current --- current = current.next --- end --- end --- if syllablestart ~= syllableend then --- head, current = deva_reorder(head,syllablestart,syllableend,font,attr) --- current = current.next --- end --- elseif current.id == glyph and current.subtype<256 and current.font == font and independent_vowel[current.char] then -- syllable without consonants: VO + [VM] + [SM] --- syllableend = current --- current = current.next --- if current and current.id == glyph and current.subtype<256 and current.font == font and vowel_modifier[current.char] then --- syllableend = current --- current = current.next --- end --- if current and current.id == glyph and current.subtype<256 and current.font == font and stress_tone_mark[current.char] then --- syllableend = current --- current = current.next --- end --- else -- Syntax error --- if pre_mark[current.char] or above_mark[current.char] or below_mark[current.char] or post_mark[current.char] then --- local n = node.copy(current) --- if pre_mark[current.char] then --- n.char = dotted_circle --- else --- current.char = dotted_circle --- end --- head, current = node.insert_after(head, current, n) --- end --- current = current.next --- end --- else --- current = current.next --- end --- start = false --- end --- --- return head, done --- end --- --- function fonts.analyzers.methods.dev2(head,font,attr) --- local current, start, done, syl_nr = head, true, false, 0 --- while current do --- local syllablestart, syllableend = nil, nil --- if current.id == glyph and current.subtype<256 and current.font == font then --- syllablestart = current --- done = true --- local c, n = current, current.next --- if ra[current.char] and n and n.id == glyph and n.subtype<256 and n.font == font and halant[n.char] and n.next and n.next.id == glyph and n.next.subtype<256 and n.next.font == font then c = n.next end --- if independent_vowel[c.char] then --Vowel-based syllable: [Ra+H]+V+[N]+[<[<ZWJ|ZWNJ>]+H+C|ZWJ+C>]+[{M}+[N]+[H]]+[SM]+[(VD)] --- n = c.next --- local ni, nii = nil, nil --- if n and n.id == glyph and n.subtype<256 and n.font == font and nukta[n.char] then n = n.next end --- if n and n.id == glyph and n.subtype<256 and n.font == font then local ni = n.next end --- if ni and ni.id == glyph and ni.subtype<256 and ni.font == font and ni.next and ni.next.id == glyph and ni.next.subtype<256 and ni.next.font == font then --- nii = ni.next --- if zwj[ni.char] and consonant[nii.char] then --- c = nii --- elseif (zwj[ni.char] or zwnj[ni.char]) and halant[nii.char] and nii.next and nii.next.id == glyph and nii.next.subtype<256 and nii.next.font == font and consonant[nii.next.char] then --- c = nii.next --- end --- end --- if c.next and c.next.id == glyph and c.next.subtype<256 and c.next.font == font and dependent_vowel[c.next.char] then c = c.next end --- if c.next and c.next.id == glyph and c.next.subtype<256 and c.next.font == font and nukta[c.next.char] then c = c.next end --- if c.next and c.next.id == glyph and c.next.subtype<256 and c.next.font == font and halant[c.next.char] then c = c.next end --- if c.next and c.next.id == glyph and c.next.subtype<256 and c.next.font == font and vowel_modifier[c.next.char] then c = c.next end --- if c.next and c.next.id == glyph and c.next.subtype<256 and c.next.font == font and stress_tone_mark[c.next.char] then c = c.next end --- if c.next and c.next.id == glyph and c.next.subtype<256 and c.next.font == font and stress_tone_mark[c.next.char] then c = c.next end --- current = c --- syllableend = c --- elseif nbsp[c.char] and ( not current.prev or current.prev.id ~= glyph or current.prev.subtype>=256 or current.prev.font ~= font or --- ( not consonant[current.prev.char] and not independent_vowel[current.prev.char] and not dependent_vowel[current.prev.char] and --- not vowel_modifier[current.prev.char] and not stress_tone_mark[current.prev.char] and not nukta[current.prev.char] and not halant[current.prev.char] ) --- ) then --Stand Alone cluster (at the start of the word only): #[Ra+H]+NBSP+[N]+[<[<ZWJ|ZWNJ>]+H+C>]+[{M}+[N]+[H]]+[SM]+[(VD)] --- if c.next and c.next.id == glyph and c.next.subtype<256 and c.next.font == font and nukta[c.next.char] then c = c.next end --- n = c.next --- if n and n.id == glyph and n.subtype<256 and n.font == font then --- local ni = n.next --- if ( zwj[n.char] or zwnj[n.char] ) and ni and ni.id == glyph and ni.subtype<256 and ni.font == font then n = ni ni = ni.next end --- if halant[n.char] and ni and ni.id == glyph and ni.subtype<256 and ni.font == font and consonant[ni.char] then c = ni end --- end --- if c.next and c.next.id == glyph and c.next.subtype<256 and c.next.font == font and dependent_vowel[c.next.char] then c = c.next end --- if c.next and c.next.id == glyph and c.next.subtype<256 and c.next.font == font and nukta[c.next.char] then c = c.next end --- if c.next and c.next.id == glyph and c.next.subtype<256 and c.next.font == font and halant[c.next.char] then c = c.next end --- if c.next and c.next.id == glyph and c.next.subtype<256 and c.next.font == font and vowel_modifier[c.next.char] then c = c.next end --- if c.next and c.next.id == glyph and c.next.subtype<256 and c.next.font == font and stress_tone_mark[c.next.char] then c = c.next end --- if c.next and c.next.id == glyph and c.next.subtype<256 and c.next.font == font and stress_tone_mark[c.next.char] then c = c.next end --- current = c --- syllableend = c --- elseif consonant[current.char] then --Consonant syllable: {C+[N]+<H+[<ZWNJ|ZWJ>]|<ZWNJ|ZWJ>+H>} + C+[N]+[A] + [< H+[<ZWNJ|ZWJ>] | {M}+[N]+[H]>]+[SM]+[(VD)] --- c = current --- if c.next and c.next.id == glyph and c.next.subtype<256 and c.next.font == font and nukta[c.next.char] then c = c.next end --- n = c --- while n.next and n.next.id == glyph and n.next.subtype<256 and n.next.font == font and ( halant[n.next.char] or zwnj[n.next.char] or zwj[n.next.char] ) do --- if halant[n.next.char] then --- n = n.next --- if n.next and n.next.id == glyph and n.next.subtype<256 and n.next.font == font and ( zwnj[n.next.char] or zwj[n.next.char] ) then n = n.next end --- else --- if n.next.next and n.next.next.id == glyph and n.next.next.subtype<256 and n.next.next.font == font and halant[n.next.next.char] then n = n.next.next end --- end --- if n.next and n.next.id == glyph and n.next.subtype<256 and n.next.font == font and consonant[n.next.char] then --- n = n.next --- if n.next and n.next.id == glyph and n.next.subtype<256 and n.next.font == font and nukta[n.next.char] then n = n.next end --- c = n --- else --- break --- end --- end --- if c.next and c.next.id == glyph and c.next.subtype<256 and c.next.font == font and anudatta[c.next.char] then c = c.next end --- if c.next and c.next.id == glyph and c.next.subtype<256 and c.next.font == font and halant[c.next.char] then --- c = c.next --- if c.next and c.next.id == glyph and c.next.subtype<256 and c.next.font == font and ( zwnj[c.next.char] or zwj[c.next.char] ) then c = c.next end --- else --- if c.next and c.next.id == glyph and c.next.subtype<256 and c.next.font == font and dependent_vowel[c.next.char] then c = c.next end --- if c.next and c.next.id == glyph and c.next.subtype<256 and c.next.font == font and nukta[c.next.char] then c = c.next end --- if c.next and c.next.id == glyph and c.next.subtype<256 and c.next.font == font and halant[c.next.char] then c = c.next end --- end --- if c.next and c.next.id == glyph and c.next.subtype<256 and c.next.font == font and vowel_modifier[c.next.char] then c = c.next end --- if c.next and c.next.id == glyph and c.next.subtype<256 and c.next.font == font and stress_tone_mark[c.next.char] then c = c.next end --- if c.next and c.next.id == glyph and c.next.subtype<256 and c.next.font == font and stress_tone_mark[c.next.char] then c = c.next end --- current = c --- syllableend = c --- end --- end --- --- if syllableend then --- syl_nr = syl_nr + 1 --- c = syllablestart --- while c ~= syllableend.next do --- set_attribute(c,sylnr,syl_nr) --- c = c.next --- end --- end --- if syllableend and syllablestart ~= syllableend then --- head, current = dev2_reorder(head,syllablestart,syllableend,font,attr) --- end --- --- if not syllableend and not has_attribute(current, state) and current.id == glyph and current.subtype<256 and current.font == font then -- Syntax error --- if pre_mark[current.char] or above_mark[current.char] or below_mark[current.char] or post_mark[current.char] then --- local n = node.copy(current) --- if pre_mark[current.char] then --- n.char = dotted_circle --- else --- current.char = dotted_circle --- end --- head, current = node.insert_after(head, current, n) --- end --- end --- --- start = false --- current = current.next --- end --- --- return head, done --- end --- --- function otf.handlers.dev2_reorder_matras(start,kind,lookupname,replacement) --- return dev2_reorder_matras(start,kind,lookupname,replacement) --- end --- --- function otf.handlers.dev2_reorder_reph(start,kind,lookupname,replacement) --- return dev2_reorder_reph(start,kind,lookupname,replacement) --- end --- --- function otf.handlers.dev2_reorder_pre_base_reordering_consonants(start,kind,lookupname,replacement) --- return dev2_reorder_pre_base_reordering_consonants(start,kind,lookupname,replacement) --- end --- --- function otf.handlers.remove_joiners(start,kind,lookupname,replacement) --- return remove_joiners(start,kind,lookupname,replacement) --- end diff --git a/tex/context/base/mkiv/font-odv.lua b/tex/context/base/mkiv/font-odv.lua deleted file mode 100644 index 345b17a52..000000000 --- a/tex/context/base/mkiv/font-odv.lua +++ /dev/null @@ -1,2380 +0,0 @@ -if not modules then modules = { } end modules ['font-odv'] = { - version = 1.001, - comment = "companion to font-ini.mkiv", - author = "Kai Eigner, TAT Zetwerk / Hans Hagen, PRAGMA ADE", - copyright = "TAT Zetwerk / PRAGMA ADE / ConTeXt Development Team", - license = "see context related readme files" -} - --- One day I'll speed this up ... char swapping and properties. - --- A few remarks: --- --- This code is a partial rewrite of the code that deals with devanagari. The data and logic --- is by Kai Eigner and based based on Microsoft's OpenType specifications for specific --- scripts, but with a few improvements. More information can be found at: --- --- deva: http://www.microsoft.com/typography/OpenType%20Dev/devanagari/introO.mspx --- dev2: http://www.microsoft.com/typography/OpenType%20Dev/devanagari/intro.mspx --- --- Rajeesh Nambiar provided patches for the malayalam variant. Thansk to feedback from --- the mailing list some aspects could be improved. --- --- As I touched nearly all code, reshuffled it, optimized a lot, etc. etc. (imagine how --- much can get messed up in over a week work) it could be that I introduced bugs. There --- is more to gain (esp in the functions applied to a range) but I'll do that when --- everything works as expected. Kai's original code is kept in font-odk.lua as a reference --- so blame me (HH) for bugs. --- --- Interesting is that Kai managed to write this on top of the existing otf handler. Only a --- few extensions were needed, like a few more analyzing states and dealing with changed --- head nodes in the core scanner as that only happens here. There's a lot going on here --- and it's only because I touched nearly all code that I got a bit of a picture of what --- happens. For in-depth knowledge one needs to consult Kai. --- --- The rewrite mostly deals with efficiency, both in terms of speed and code. We also made --- sure that it suits generic use as well as use in ConTeXt. I removed some buglets but can --- as well have messed up the logic by doing this. For this we keep the original around --- as that serves as reference. Due to the lots of reshuffling glyphs quite some leaks --- occur(red) but once I'm satisfied with the rewrite I'll weed them. I also integrated --- initialization etc into the regular mechanisms. --- --- In the meantime, we're down from 25.5-3.5=22 seconds to 17.7-3.5=14.2 seconds for a 100 --- page sample (mid 2012) with both variants so it's worth the effort. Some more speedup is --- to be expected. Due to the method chosen it will never be real fast. If I ever become a --- power user I'll have a go at some further speed up. I will rename some functions (and --- features) once we don't need to check the original code. We now use a special subset --- sequence for use inside the analyzer (after all we could can store this in the dataset --- and save redundant analysis). --- --- I might go for an array approach with respect to attributes (and reshuffling). Easier. --- --- Some data will move to char-def.lua (some day). --- --- Hans Hagen, PRAGMA-ADE, Hasselt NL --- --- We could have c_nukta, c_halant, c_ra is we know that they are never used mixed within --- one script .. yes or no? --- --- Matras: according to Microsoft typography specifications "up to one of each type: --- pre-, above-, below- or post- base", but that does not seem to be right. It could --- become an option. --- --- The next code looks weird anyway: the "and boolean" should move inside the if --- or we should check differently (case vs successive). --- --- local function ms_matra(c) --- local prebase, abovebase, belowbase, postbase = true, true, true, true --- local n = getnext(c) --- while n and getid(n) == glyph_code and getsubtype(n) < 256 and getfont(n) == font do --- local char = getchar(n) --- if not dependent_vowel[char] then --- break --- elseif pre_mark[char] and prebase then --- prebase = false --- elseif above_mark[char] and abovebase then --- abovebase = false --- elseif below_mark[char] and belowbase then --- belowbase = false --- elseif post_mark[char] and postbase then --- postbase = false --- else --- return c --- end --- c = getnext(c) --- end --- return c --- end - --- todo: first test for font then for subtype - -local insert, imerge = table.insert, table.imerge -local next = next - -local report_devanagari = logs.reporter("otf","devanagari") - -fonts = fonts or { } -fonts.analyzers = fonts.analyzers or { } -fonts.analyzers.methods = fonts.analyzers.methods or { node = { otf = { } } } - -local otf = fonts.handlers.otf - -local nodecodes = nodes.nodecodes -local glyph_code = nodecodes.glyph - -local handlers = otf.handlers -local methods = fonts.analyzers.methods - -local otffeatures = fonts.constructors.features.otf -local registerotffeature = otffeatures.register - -local nuts = nodes.nuts -local tonode = nuts.tonode -local tonut = nuts.tonut - -local getnext = nuts.getnext -local setnext = nuts.setnext -local getprev = nuts.getprev -local setprev = nuts.setprev -local getid = nuts.getid -local getchar = nuts.getchar -local setchar = nuts.setchar -local getfont = nuts.getfont -local getsubtype = nuts.getsubtype -local getprop = nuts.getprop -local setprop = nuts.setprop - -local insert_node_after = nuts.insert_after -local copy_node = nuts.copy -local remove_node = nuts.remove -local flush_list = nuts.flush_list -local flush_node = nuts.flush_node - -local copyinjection = nodes.injections.copy -- KE: is this necessary? HH: probably not as positioning comes later and we rawget/set - -local unsetvalue = attributes.unsetvalue - -local fontdata = fonts.hashes.identifiers - -local a_state = attributes.private('state') -local a_syllabe = attributes.private('syllabe') - -local dotted_circle = 0x25CC - -local states = fonts.analyzers.states -- not features - -local s_rphf = states.rphf -local s_half = states.half -local s_pref = states.pref -local s_blwf = states.blwf -local s_pstf = states.pstf - -local replace_all_nbsp = nil - -replace_all_nbsp = function(head) -- delayed definition - replace_all_nbsp = typesetters and typesetters.characters and typesetters.characters.replacenbspaces or function(head) - return head - end - return replace_all_nbsp(head) -end - -local xprocesscharacters = nil - -if context then - xprocesscharacters = function(head,font) - xprocesscharacters = nodes.handlers.characters - return xprocesscharacters(head,font) - end -else - xprocesscharacters = function(head,font) - xprocesscharacters = nodes.handlers.nodepass -- generic - return xprocesscharacters(head,font) - end -end - -local function processcharacters(head,font) - return tonut(xprocesscharacters(tonode(head))) -end - --- local fontprocesses = fonts.hashes.processes --- --- function processcharacters(head,font) --- local processors = fontprocesses[font] --- for i=1,#processors do --- head = processors[i](head,font,0) --- end --- return head, true --- end - --- In due time there will be entries here for scripts like Bengali, Gujarati, --- Gurmukhi, Kannada, Malayalam, Oriya, Tamil, Telugu. Feel free to provide the --- code points. - --- We can assume that script are not mixed in the source but if that is the case --- we might need to have consonants etc per script and initialize a local table --- pointing to the right one. - --- new, to be checked: --- --- U+00978 : DEVANAGARI LETTER MARWARI DDA --- U+00980 : BENGALI ANJI --- U+00C00 : TELUGU SIGN COMBINING CANDRABINDU ABOVE --- U+00C34 : TELUGU LETTER LLLA --- U+00C81 : KANNADA SIGN CANDRABINDU --- U+00D01 : MALAYALAM SIGN CANDRABINDU --- U+00DE6 : SINHALA LITH DIGIT ZERO --- U+00DE7 : SINHALA LITH DIGIT ONE --- U+00DE8 : SINHALA LITH DIGIT TWO --- U+00DE9 : SINHALA LITH DIGIT THREE --- U+00DEA : SINHALA LITH DIGIT FOUR --- U+00DEB : SINHALA LITH DIGIT FIVE --- U+00DEC : SINHALA LITH DIGIT SIX --- U+00DED : SINHALA LITH DIGIT SEVEN --- U+00DEE : SINHALA LITH DIGIT EIGHT --- U+00DEF : SINHALA LITH DIGIT NINE - -local consonant = { - -- devanagari - [0x0915] = true, [0x0916] = true, [0x0917] = true, [0x0918] = true, - [0x0919] = true, [0x091A] = true, [0x091B] = true, [0x091C] = true, - [0x091D] = true, [0x091E] = true, [0x091F] = true, [0x0920] = true, - [0x0921] = true, [0x0922] = true, [0x0923] = true, [0x0924] = true, - [0x0925] = true, [0x0926] = true, [0x0927] = true, [0x0928] = true, - [0x0929] = true, [0x092A] = true, [0x092B] = true, [0x092C] = true, - [0x092D] = true, [0x092E] = true, [0x092F] = true, [0x0930] = true, - [0x0931] = true, [0x0932] = true, [0x0933] = true, [0x0934] = true, - [0x0935] = true, [0x0936] = true, [0x0937] = true, [0x0938] = true, - [0x0939] = true, [0x0958] = true, [0x0959] = true, [0x095A] = true, - [0x095B] = true, [0x095C] = true, [0x095D] = true, [0x095E] = true, - [0x095F] = true, [0x0979] = true, [0x097A] = true, - -- kannada - [0x0C95] = true, [0x0C96] = true, [0x0C97] = true, [0x0C98] = true, - [0x0C99] = true, [0x0C9A] = true, [0x0C9B] = true, [0x0C9C] = true, - [0x0C9D] = true, [0x0C9E] = true, [0x0C9F] = true, [0x0CA0] = true, - [0x0CA1] = true, [0x0CA2] = true, [0x0CA3] = true, [0x0CA4] = true, - [0x0CA5] = true, [0x0CA6] = true, [0x0CA7] = true, [0x0CA8] = true, - [0x0CA9] = true, [0x0CAA] = true, [0x0CAB] = true, [0x0CAC] = true, - [0x0CAD] = true, [0x0CAE] = true, [0x0CAF] = true, [0x0CB0] = true, - [0x0CB1] = true, [0x0CB2] = true, [0x0CB3] = true, [0x0CB4] = true, - [0x0CB5] = true, [0x0CB6] = true, [0x0CB7] = true, [0x0CB8] = true, - [0x0CB9] = true, - [0x0CDE] = true, -- obsolete - -- malayalam - [0x0D15] = true, [0x0D16] = true, [0x0D17] = true, [0x0D18] = true, - [0x0D19] = true, [0x0D1A] = true, [0x0D1B] = true, [0x0D1C] = true, - [0x0D1D] = true, [0x0D1E] = true, [0x0D1F] = true, [0x0D20] = true, - [0x0D21] = true, [0x0D22] = true, [0x0D23] = true, [0x0D24] = true, - [0x0D25] = true, [0x0D26] = true, [0x0D27] = true, [0x0D28] = true, - [0x0D29] = true, [0x0D2A] = true, [0x0D2B] = true, [0x0D2C] = true, - [0x0D2D] = true, [0x0D2E] = true, [0x0D2F] = true, [0x0D30] = true, - [0x0D31] = true, [0x0D32] = true, [0x0D33] = true, [0x0D34] = true, - [0x0D35] = true, [0x0D36] = true, [0x0D37] = true, [0x0D38] = true, - [0x0D39] = true, [0x0D3A] = true, -} - -local independent_vowel = { - -- devanagari - [0x0904] = true, [0x0905] = true, [0x0906] = true, [0x0907] = true, - [0x0908] = true, [0x0909] = true, [0x090A] = true, [0x090B] = true, - [0x090C] = true, [0x090D] = true, [0x090E] = true, [0x090F] = true, - [0x0910] = true, [0x0911] = true, [0x0912] = true, [0x0913] = true, - [0x0914] = true, [0x0960] = true, [0x0961] = true, [0x0972] = true, - [0x0973] = true, [0x0974] = true, [0x0975] = true, [0x0976] = true, - [0x0977] = true, - -- kannada - [0x0C85] = true, [0x0C86] = true, [0x0C87] = true, [0x0C88] = true, - [0x0C89] = true, [0x0C8A] = true, [0x0C8B] = true, [0x0C8C] = true, - [0x0C8D] = true, [0x0C8E] = true, [0x0C8F] = true, [0x0C90] = true, - [0x0C91] = true, [0x0C92] = true, [0x0C93] = true, [0x0C94] = true, - -- malayalam - [0x0D05] = true, [0x0D06] = true, [0x0D07] = true, [0x0D08] = true, - [0x0D09] = true, [0x0D0A] = true, [0x0D0B] = true, [0x0D0C] = true, - [0x0D0E] = true, [0x0D0F] = true, [0x0D10] = true, [0x0D12] = true, - [0x0D13] = true, [0x0D14] = true, -} - -local dependent_vowel = { -- matra - -- devanagari - [0x093A] = true, [0x093B] = true, [0x093E] = true, [0x093F] = true, - [0x0940] = true, [0x0941] = true, [0x0942] = true, [0x0943] = true, - [0x0944] = true, [0x0945] = true, [0x0946] = true, [0x0947] = true, - [0x0948] = true, [0x0949] = true, [0x094A] = true, [0x094B] = true, - [0x094C] = true, [0x094E] = true, [0x094F] = true, [0x0955] = true, - [0x0956] = true, [0x0957] = true, [0x0962] = true, [0x0963] = true, - -- kannada - [0x0CBE] = true, [0x0CBF] = true, [0x0CC0] = true, [0x0CC1] = true, - [0x0CC2] = true, [0x0CC3] = true, [0x0CC4] = true, [0x0CC5] = true, - [0x0CC6] = true, [0x0CC7] = true, [0x0CC8] = true, [0x0CC9] = true, - [0x0CCA] = true, [0x0CCB] = true, [0x0CCC] = true, - -- malayalam - [0x0D3E] = true, [0x0D3F] = true, [0x0D40] = true, [0x0D41] = true, - [0x0D42] = true, [0x0D43] = true, [0x0D44] = true, [0x0D46] = true, - [0x0D47] = true, [0x0D48] = true, [0x0D4A] = true, [0x0D4B] = true, - [0x0D4C] = true, [0x0D57] = true, -} - -local vowel_modifier = { - -- devanagari - [0x0900] = true, [0x0901] = true, [0x0902] = true, [0x0903] = true, - -- A8E0 - A8F1 are cantillation marks for the Samaveda and may not belong here. - [0xA8E0] = true, [0xA8E1] = true, [0xA8E2] = true, [0xA8E3] = true, - [0xA8E4] = true, [0xA8E5] = true, [0xA8E6] = true, [0xA8E7] = true, - [0xA8E8] = true, [0xA8E9] = true, [0xA8EA] = true, [0xA8EB] = true, - [0xA8EC] = true, [0xA8ED] = true, [0xA8EE] = true, [0xA8EF] = true, - [0xA8F0] = true, [0xA8F1] = true, - -- malayalam - [0x0D02] = true, [0x0D03] = true, -} - -local stress_tone_mark = { - [0x0951] = true, [0x0952] = true, [0x0953] = true, [0x0954] = true, - -- kannada - [0x0CCD] = true, - -- malayalam - [0x0D4D] = true, -} - -local nukta = { - -- devanagari - [0x093C] = true, - -- kannada: - [0x0CBC] = true, -} - -local halant = { - -- devanagari - [0x094D] = true, - -- kannada - [0x0CCD] = true, - -- malayalam - [0x0D4D] = true, -} - -local ra = { - -- devanagari - [0x0930] = true, - -- kannada - [0x0CB0] = true, - -- malayalam - [0x0D30] = true, -} - -local c_anudatta = 0x0952 -- used to be tables -local c_nbsp = 0x00A0 -- used to be tables -local c_zwnj = 0x200C -- used to be tables -local c_zwj = 0x200D -- used to be tables - -local zw_char = { -- could also be inlined - [0x200C] = true, - [0x200D] = true, -} - --- 0C82 anusvara --- 0C83 visarga --- 0CBD avagraha --- 0CD5 length mark --- 0CD6 ai length mark --- 0CE0 letter ll --- 0CE1 letter rr --- 0CE2 vowel sign l --- 0CE2 vowel sign ll --- 0CF1 sign --- 0CF2 sign --- OCE6 - OCEF digits - -local pre_mark = { - [0x093F] = true, [0x094E] = true, - -- malayalam - [0x0D46] = true, [0x0D47] = true, [0x0D48] = true, -} - -local above_mark = { - [0x0900] = true, [0x0901] = true, [0x0902] = true, [0x093A] = true, - [0x0945] = true, [0x0946] = true, [0x0947] = true, [0x0948] = true, - [0x0951] = true, [0x0953] = true, [0x0954] = true, [0x0955] = true, - [0xA8E0] = true, [0xA8E1] = true, [0xA8E2] = true, [0xA8E3] = true, - [0xA8E4] = true, [0xA8E5] = true, [0xA8E6] = true, [0xA8E7] = true, - [0xA8E8] = true, [0xA8E9] = true, [0xA8EA] = true, [0xA8EB] = true, - [0xA8EC] = true, [0xA8ED] = true, [0xA8EE] = true, [0xA8EF] = true, - [0xA8F0] = true, [0xA8F1] = true, - -- malayalam - [0x0D4E] = true, -} - -local below_mark = { - [0x093C] = true, [0x0941] = true, [0x0942] = true, [0x0943] = true, - [0x0944] = true, [0x094D] = true, [0x0952] = true, [0x0956] = true, - [0x0957] = true, [0x0962] = true, [0x0963] = true, -} - -local post_mark = { - [0x0903] = true, [0x093B] = true, [0x093E] = true, [0x0940] = true, - [0x0949] = true, [0x094A] = true, [0x094B] = true, [0x094C] = true, - [0x094F] = true, -} - -local twopart_mark = { - -- malayalam - [0x0D4A] = { 0x0D46, 0x0D3E, }, -- ൊ - [0x0D4B] = { 0x0D47, 0x0D3E, }, -- ോ - [0x0D4C] = { 0x0D46, 0x0D57, }, -- ൌ -} - -local mark_four = { } -- As we access these frequently an extra hash is used. - -for k, v in next, pre_mark do mark_four[k] = pre_mark end -for k, v in next, above_mark do mark_four[k] = above_mark end -for k, v in next, below_mark do mark_four[k] = below_mark end -for k, v in next, post_mark do mark_four[k] = post_mark end - -local mark_above_below_post = { } - -for k, v in next, above_mark do mark_above_below_post[k] = above_mark end -for k, v in next, below_mark do mark_above_below_post[k] = below_mark end -for k, v in next, post_mark do mark_above_below_post[k] = post_mark end - --- Again, this table can be extended for other scripts than devanagari. Actually, --- for ConTeXt this kind of data is kept elsewhere so eventually we might move --- tables to someplace else. - -local reorder_class = { - -- devanagari - [0x0930] = "before postscript", - [0x093F] = "before half", - [0x0940] = "after subscript", - [0x0941] = "after subscript", - [0x0942] = "after subscript", - [0x0943] = "after subscript", - [0x0944] = "after subscript", - [0x0945] = "after subscript", - [0x0946] = "after subscript", - [0x0947] = "after subscript", - [0x0948] = "after subscript", - [0x0949] = "after subscript", - [0x094A] = "after subscript", - [0x094B] = "after subscript", - [0x094C] = "after subscript", - [0x0962] = "after subscript", - [0x0963] = "after subscript", - [0x093E] = "after subscript", - -- kannada: - [0x0CB0] = "after postscript", -- todo in code below - [0x0CBF] = "before subscript", -- todo in code below - [0x0CC6] = "before subscript", -- todo in code below - [0x0CCC] = "before subscript", -- todo in code below - [0x0CBE] = "before subscript", -- todo in code below - [0x0CE2] = "before subscript", -- todo in code below - [0x0CE3] = "before subscript", -- todo in code below - [0x0CC1] = "before subscript", -- todo in code below - [0x0CC2] = "before subscript", -- todo in code below - [0x0CC3] = "after subscript", - [0x0CC4] = "after subscript", - [0x0CD5] = "after subscript", - [0x0CD6] = "after subscript", - -- malayalam -} - --- We use some pseudo features as we need to manipulate the nodelist based --- on information in the font as well as already applied features. - -local dflt_true = { - dflt = true -} - -local dev2_defaults = { - dev2 = dflt_true, -} - -local deva_defaults = { - dev2 = dflt_true, - deva = dflt_true, -} - -local false_flags = { false, false, false, false } - -local both_joiners_true = { - [0x200C] = true, - [0x200D] = true, -} - -local sequence_reorder_matras = { - chain = 0, - features = { dv01 = dev2_defaults }, - flags = false_flags, - name = "dv01_reorder_matras", - order = { "dv01" }, - subtables = { "dv01_reorder_matras" }, - type = "devanagari_reorder_matras", -} - -local sequence_reorder_reph = { - chain = 0, - features = { dv02 = dev2_defaults }, - flags = false_flags, - name = "dv02_reorder_reph", - order = { "dv02" }, - subtables = { "dv02_reorder_reph" }, - type = "devanagari_reorder_reph", -} - -local sequence_reorder_pre_base_reordering_consonants = { - chain = 0, - features = { dv03 = dev2_defaults }, - flags = false_flags, - name = "dv03_reorder_pre_base_reordering_consonants", - order = { "dv03" }, - subtables = { "dv03_reorder_pre_base_reordering_consonants" }, - type = "devanagari_reorder_pre_base_reordering_consonants", -} - -local sequence_remove_joiners = { - chain = 0, - features = { dv04 = deva_defaults }, - flags = false_flags, - name = "dv04_remove_joiners", - order = { "dv04" }, - subtables = { "dv04_remove_joiners" }, - type = "devanagari_remove_joiners", -} - --- Looping over feature twice as efficient as looping over basic forms (some --- 350 checks instead of 750 for one font). This is something to keep an eye on --- as it might depends on the font. Not that it's a bottleneck. - -local basic_shaping_forms = { - nukt = true, - akhn = true, - rphf = true, - pref = true, - rkrf = true, - blwf = true, - half = true, - pstf = true, - vatu = true, - cjct = true, -} - -local function initializedevanagi(tfmdata) - local script, language = otf.scriptandlanguage(tfmdata,attr) -- todo: take fast variant - if script == "deva" or script == "dev2" or script =="mlym" or script == "mlm2" then - local resources = tfmdata.resources - local lookuphash = resources.lookuphash - if not lookuphash["dv01"] then - report_devanagari("adding devanagari features to font") - -- - local features = resources.features - local gsubfeatures = features.gsub - local sequences = resources.sequences - local sharedfeatures = tfmdata.shared.features - -- - local lastmatch = 0 - for s=1,#sequences do -- classify chars - local features = sequences[s].features - if features then - for k, v in next, features do - if basic_shaping_forms[k] then - lastmatch = s - end - end - end - end - local insertindex = lastmatch + 1 - -- - lookuphash["dv04_remove_joiners"] = both_joiners_true - -- - gsubfeatures["dv01"] = dev2_defaults -- reorder matras - gsubfeatures["dv02"] = dev2_defaults -- reorder reph - gsubfeatures["dv03"] = dev2_defaults -- reorder pre base reordering consonants - gsubfeatures["dv04"] = deva_defaults -- remove joiners - -- - insert(sequences,insertindex,sequence_reorder_pre_base_reordering_consonants) - insert(sequences,insertindex,sequence_reorder_reph) - insert(sequences,insertindex,sequence_reorder_matras) - insert(sequences,insertindex,sequence_remove_joiners) - -- - if script == "deva" then - sharedfeatures["dv04"] = true -- dv04_remove_joiners - elseif script == "dev2" then - sharedfeatures["dv01"] = true -- dv01_reorder_matras - sharedfeatures["dv02"] = true -- dv02_reorder_reph - sharedfeatures["dv03"] = true -- dv03_reorder_pre_base_reordering_consonants - sharedfeatures["dv04"] = true -- dv04_remove_joiners - elseif script == "mlym" then - sharedfeatures["pstf"] = true - elseif script == "mlm2" then - sharedfeatures["pstf"] = true - sharedfeatures["pref"] = true - sharedfeatures["dv03"] = true -- dv03_reorder_pre_base_reordering_consonants - gsubfeatures["dv03"] = dev2_defaults -- reorder pre base reordering consonants - insert(sequences,insertindex,sequence_reorder_pre_base_reordering_consonants) - end - end - end -end - -registerotffeature { - name = "devanagari", - description = "inject additional features", - default = true, - initializers = { - node = initializedevanagi, - }, -} - --- hm, this is applied to one character: - -local function deva_initialize(font,attr) - - local tfmdata = fontdata[font] - local resources = tfmdata.resources - local lookuphash = resources.lookuphash - - local datasets = otf.dataset(tfmdata,font,attr) - local devanagaridata = datasets.devanagari - - if devanagaridata then -- maybe also check for e.g. reph - - return lookuphash, devanagaridata.reph, devanagaridata.vattu, devanagaridata.blwfcache - - else - - devanagaridata = { } - datasets.devanagari = devanagaridata - - local reph = false - local vattu = false - local blwfcache = { } - - local sequences = resources.sequences - - for s=1,#sequences do -- triggers creation of dataset - -- local sequence = sequences[s] - local dataset = datasets[s] - if dataset and dataset[1] then -- value - local kind = dataset[4] - if kind == "rphf" then - -- deva - reph = true - elseif kind == "blwf" then - -- deva - vattu = true - -- dev2 - local subtables = dataset[3].subtables - for i=1,#subtables do - local lookupname = subtables[i] - local lookupcache = lookuphash[lookupname] - if lookupcache then - for k, v in next, lookupcache do - blwfcache[k] = blwfcache[k] or v - end - end - end - end - end - end - - devanagaridata.reph = reph - devanagaridata.vattu = vattu - devanagaridata.blwfcache = blwfcache - - return lookuphash, reph, vattu, blwfcache - - end - -end - -local function deva_reorder(head,start,stop,font,attr,nbspaces) - - local lookuphash, reph, vattu, blwfcache = deva_initialize(font,attr) -- could be inlines but ugly - - local current = start - local n = getnext(start) - local base = nil - local firstcons = nil - local lastcons = nil - local basefound = false - - if ra[getchar(start)] and halant[getchar(n)] and reph then - -- if syllable starts with Ra + H and script has 'Reph' then exclude Reph - -- from candidates for base consonants - if n == stop then - return head, stop, nbspaces - end - if getchar(getnext(n)) == c_zwj then - current = start - else - current = getnext(n) - setprop(start,a_state,s_rphf) - end - end - - if getchar(current) == c_nbsp then - -- Stand Alone cluster - if current == stop then - stop = getprev(stop) - head = remove_node(head,current) - flush_node(current) - return head, stop, nbspaces - else - nbspaces = nbspaces + 1 - base = current - firstcons = current - lastcons = current - current = getnext(current) - if current ~= stop then - if nukta[getchar(current)] then - current = getnext(current) - end - if getchar(current) == c_zwj then - if current ~= stop then - local next = getnext(current) - if next ~= stop and halant[getchar(next)] then - current = next - next = getnext(current) - local tmp = next and getnext(next) or nil -- needs checking - local changestop = next == stop - local tempcurrent = copy_node(next) - copyinjection(tempcurrent,next) - local nextcurrent = copy_node(current) - copyinjection(nextcurrent,current) -- KE: necessary? HH: probably not as positioning comes later and we rawget/set - setnext(tempcurrent,nextcurrent) - setprev(nextcurrent,tempcurrent) - setprop(tempcurrent,a_state,s_blwf) - tempcurrent = processcharacters(tempcurrent,font) - setprop(tempcurrent,a_state,unsetvalue) - if getchar(next) == getchar(tempcurrent) then - flush_list(tempcurrent) - local n = copy_node(current) - copyinjection(n,current) -- KE: necessary? HH: probably not as positioning comes later and we rawget/set - setchar(current,dotted_circle) - head = insert_node_after(head, current, n) - else - setchar(current,getchar(tempcurrent)) -- we assumes that the result of blwf consists of one node - local freenode = getnext(current) - setnext(current,tmp) - if tmp then - setprev(tmp,current) - end - flush_node(freenode) - flush_list(tempcurrent) - if changestop then - stop = current - end - end - end - end - end - end - end - end - - while not basefound do - -- find base consonant - if consonant[getchar(current)] then - setprop(current,a_state,s_half) - if not firstcons then - firstcons = current - end - lastcons = current - if not base then - base = current - elseif blwfcache[getchar(current)] then - -- consonant has below-base (or post-base) form - setprop(current,a_state,s_blwf) - else - base = current - end - end - basefound = current == stop - current = getnext(current) - end - - if base ~= lastcons then - -- if base consonant is not last one then move halant from base consonant to last one - local np = base - local n = getnext(base) - if nukta[getchar(n)] then - np = n - n = getnext(n) - end - if halant[getchar(n)] then - if lastcons ~= stop then - local ln = getnext(lastcons) - if nukta[getchar(ln)] then - lastcons = ln - end - end - -- local np = getprev(n) - local nn = getnext(n) - local ln = getnext(lastcons) -- what if lastcons is nn ? - setnext(np,nn) - setprev(nn,np) - setnext(lastcons,n) - if ln then - setprev(ln,n) - end - setnext(n,ln) - setprev(n,lastcons) - if lastcons == stop then - stop = n - end - end - end - - n = getnext(start) - if n ~= stop and ra[getchar(start)] and halant[getchar(n)] and not zw_char[getchar(getnext(n))] then - -- if syllable starts with Ra + H then move this combination so that it follows either: - -- the post-base 'matra' (if any) or the base consonant - local matra = base - if base ~= stop then - local next = getnext(base) - if dependent_vowel[getchar(next)] then - matra = next - end - end - -- [sp][start][n][nn] [matra|base][?] - -- [matra|base][start] [n][?] [sp][nn] - local sp = getprev(start) - local nn = getnext(n) - local mn = getnext(matra) - if sp then - setnext(sp,nn) - end - setprev(nn,sp) - setnext(matra,start) - setprev(start,matra) - setnext(n,mn) - if mn then - setprev(mn,n) - end - if head == start then - head = nn - end - start = nn - if matra == stop then - stop = n - end - end - - local current = start - while current ~= stop do - local next = getnext(current) - if next ~= stop and halant[getchar(next)] and getchar(getnext(next)) == c_zwnj then - setprop(current,a_state,unsetvalue) - end - current = next - end - - if base ~= stop and getprop(base,a_state) then - local next = getnext(base) - if halant[getchar(next)] and not (next ~= stop and getchar(getnext(next)) == c_zwj) then - setprop(base,a_state,unsetvalue) - end - end - - -- ToDo: split two- or three-part matras into their parts. Then, move the left 'matra' part to the beginning of the syllable. - -- Not necessary for Devanagari. However it is necessay for other scripts, such as Tamil (e.g. TAMIL VOWEL SIGN O - 0BCA) - - -- classify consonants and 'matra' parts as pre-base, above-base (Reph), below-base or post-base, and group elements of the syllable (consonants and 'matras') according to this classification - - local current, allreordered, moved = start, false, { [base] = true } - local a, b, p, bn = base, base, base, getnext(base) - if base ~= stop and nukta[getchar(bn)] then - a, b, p = bn, bn, bn - end - while not allreordered do - -- current is always consonant - local c = current - local n = getnext(current) - local l = nil -- used ? - if c ~= stop then - if nukta[getchar(n)] then - c = n - n = getnext(n) - end - if c ~= stop then - if halant[getchar(n)] then - c = n - n = getnext(n) - end - while c ~= stop and dependent_vowel[getchar(n)] do - c = n - n = getnext(n) - end - if c ~= stop then - if vowel_modifier[getchar(n)] then - c = n - n = getnext(n) - end - if c ~= stop and stress_tone_mark[getchar(n)] then - c = n - n = getnext(n) - end - end - end - end - local bp = getprev(firstcons) - local cn = getnext(current) - local last = getnext(c) - while cn ~= last do - -- move pre-base matras... - if pre_mark[getchar(cn)] then - if bp then - setnext(bp,cn) - end - local next = getnext(cn) - local prev = getprev(cn) - if next then - setprev(next,prev) - end - setnext(prev,next) - if cn == stop then - stop = prev - end - setprev(cn,bp) - setnext(cn,firstcons) - setprev(firstcons,cn) - if firstcons == start then - if head == start then - head = cn - end - start = cn - end - break - end - cn = getnext(cn) - end - allreordered = c == stop - current = getnext(c) - end - - if reph or vattu then - local current, cns = start, nil - while current ~= stop do - local c = current - local n = getnext(current) - if ra[getchar(current)] and halant[getchar(n)] then - c = n - n = getnext(n) - local b, bn = base, base - while bn ~= stop do - local next = getnext(bn) - if dependent_vowel[getchar(next)] then - b = next - end - bn = next - end - if getprop(current,a_state) == s_rphf then - -- position Reph (Ra + H) after post-base 'matra' (if any) since these - -- become marks on the 'matra', not on the base glyph - if b ~= current then - if current == start then - if head == start then - head = n - end - start = n - end - if b == stop then - stop = c - end - local prev = getprev(current) - if prev then - setnext(prev,n) - end - if n then - setprev(n,prev) - end - local next = getnext(b) - setnext(c,next) - if next then - setprev(next,c) - end - setnext(c,next) - setnext(b,current) - setprev(current,b) - end - elseif cns and getnext(cns) ~= current then -- todo: optimize next - -- position below-base Ra (vattu) following the consonants on which it is placed (either the base consonant or one of the pre-base consonants) - local cp, cnsn = getprev(current), getnext(cns) - if cp then - setnext(cp,n) - end - if n then - setprev(n,cp) - end - setnext(cns,current) - setprev(current,cns) - setnext(c,cnsn) - if cnsn then - setprev(cnsn,c) - end - if c == stop then - stop = cp - break - end - current = getprev(n) - end - else - local char = getchar(current) - if consonant[char] then - cns = current - local next = getnext(cns) - if halant[getchar(next)] then - cns = next - end - elseif char == c_nbsp then - nbspaces = nbspaces + 1 - cns = current - local next = getnext(cns) - if halant[getchar(next)] then - cns = next - end - end - end - current = getnext(current) - end - end - - if getchar(base) == c_nbsp then - nbspaces = nbspaces - 1 - head = remove_node(head,base) - flush_node(base) - end - - return head, stop, nbspaces -end - --- If a pre-base matra character had been reordered before applying basic features, --- the glyph can be moved closer to the main consonant based on whether half-forms had been formed. --- Actual position for the matra is defined as “after last standalone halant glyph, --- after initial matra position and before the main consonant”. --- If ZWJ or ZWNJ follow this halant, position is moved after it. - --- so we break out ... this is only done for the first 'word' (if we feed words we can as --- well test for non glyph. - -function handlers.devanagari_reorder_matras(head,start,kind,lookupname,replacement) -- no leak - local current = start -- we could cache attributes here - local startfont = getfont(start) - local startattr = getprop(start,a_syllabe) - -- can be fast loop - while current and getid(current) == glyph_code and getsubtype(current) < 256 and getfont(current) == font and getprop(current,a_syllabe) == startattr do - local next = getnext(current) - if halant[getchar(current)] and not getprop(current,a_state) then - if next and getid(next) == glyph_code and getsubtype(next) < 256 and getfont(next) == font and getprop(next,a_syllabe) == startattr and zw_char[getchar(next)] then - current = next - end - local startnext = getnext(start) - head = remove_node(head,start) - local next = getnext(current) - if next then - setprev(next,start) - end - setnext(start,next) - setnext(current,start) - setprev(start,current) - start = startnext - break - end - current = next - end - return head, start, true -end - --- todo: way more caching of attributes and font - --- Reph’s original position is always at the beginning of the syllable, (i.e. it is not reordered at the character reordering stage). --- However, it will be reordered according to the basic-forms shaping results. --- Possible positions for reph, depending on the script, are; after main, before post-base consonant forms, --- and after post-base consonant forms. - --- 1 If reph should be positioned after post-base consonant forms, proceed to step 5. --- 2 If the reph repositioning class is not after post-base: target position is after the first explicit halant glyph between --- the first post-reph consonant and last main consonant. If ZWJ or ZWNJ are following this halant, position is moved after it. --- If such position is found, this is the target position. Otherwise, proceed to the next step. --- Note: in old-implementation fonts, where classifications were fixed in shaping engine, --- there was no case where reph position will be found on this step. --- 3 If reph should be repositioned after the main consonant: from the first consonant not ligated with main, --- or find the first consonant that is not a potential pre-base reordering Ra. --- 4 If reph should be positioned before post-base consonant, find first post-base classified consonant not ligated with main. --- If no consonant is found, the target position should be before the first matra, syllable modifier sign or vedic sign. --- 5 If no consonant is found in steps 3 or 4, move reph to a position immediately before the first post-base matra, --- syllable modifier sign or vedic sign that has a reordering class after the intended reph position. --- For example, if the reordering position for reph is post-main, it will skip above-base matras that also have a post-main position. --- 6 Otherwise, reorder reph to the end of the syllable. - --- hm, this only looks at the start of a nodelist ... is this supposed to be line based? - -function handlers.devanagari_reorder_reph(head,start,kind,lookupname,replacement) - -- since in Devanagari reph has reordering position 'before postscript' dev2 only follows step 2, 4, and 6, - -- the other steps are still ToDo (required for scripts other than dev2) - local current = getnext(start) - local startnext = nil - local startprev = nil - local startfont = getfont(start) - local startattr = getprop(start,a_syllabe) - while current and getid(current) == glyph_code and getsubtype(current) < 256 and getfont(current) == startfont and getprop(current,a_syllabe) == startattr do --step 2 - if halant[getchar(current)] and not getprop(current,a_state) then - local next = getnext(current) - if next and getid(next) == glyph_code and getsubtype(next) < 256 and getfont(next) == startfont and getprop(next,a_syllabe) == startattr and zw_char[getchar(next)] then - current = next - end - startnext = getnext(start) - head = remove_node(head,start) - local next = getnext(current) - if next then - setprev(next,start) - end - setnext(start,next) - setnext(current,start) - setprev(start,current) - start = startnext - startattr = getprop(start,a_syllabe) - break - end - current = getnext(current) - end - if not startnext then - current = getnext(start) - while current and getid(current) == glyph_code and getsubtype(current) < 256 and getfont(current) == startfont and getprop(current,a_syllabe) == startattr do --step 4 - if getprop(current,a_state) == s_pstf then --post-base - startnext = getnext(start) - head = remove_node(head,start) - local prev = getprev(current) - setprev(start,prev) - setnext(prev,start) - setnext(start,current) - setprev(current,start) - start = startnext - startattr = getprop(start,a_syllabe) - break - end - current = getnext(current) - end - end - -- ToDo: determine position for reph with reordering position other than 'before postscript' - -- (required for scripts other than dev2) - -- leaks - if not startnext then - current = getnext(start) - local c = nil - while current and getid(current) == glyph_code and getsubtype(current) < 256 and getfont(current) == startfont and getprop(current,a_syllabe) == startattr do --step 5 - if not c then - local char = getchar(current) - -- todo: combine in one - if mark_above_below_post[char] and reorder_class[char] ~= "after subscript" then - c = current - end - end - current = getnext(current) - end - -- here we can loose the old start node: maybe best split cases - if c then - startnext = getnext(start) - head = remove_node(head,start) - local prev = getprev(c) - setprev(start,prev) - setnext(prev,start) - setnext(start,c) - setprev(c,start) - -- end - start = startnext - startattr = getprop(start,a_syllabe) - end - end - -- leaks - if not startnext then - current = start - local next = getnext(current) - while next and getid(next) == glyph_code and getsubtype(next) < 256 and getfont(next) == startfont and getprop(next,a_syllabe) == startattr do --step 6 - current = next - next = getnext(current) - end - if start ~= current then - startnext = getnext(start) - head = remove_node(head,start) - local next = getnext(current) - if next then - setprev(next,start) - end - setnext(star,next) - setnext(current,start) - setprev(start,current) - start = startnext - end - end - -- - return head, start, true -end - --- we can cache some checking (v) - --- If a pre-base reordering consonant is found, reorder it according to the following rules: --- --- 1 Only reorder a glyph produced by substitution during application of the feature. --- (Note that a font may shape a Ra consonant with the feature generally but block it in certain contexts.) --- 2 Try to find a target position the same way as for pre-base matra. If it is found, reorder pre-base consonant glyph. --- 3 If position is not found, reorder immediately before main consonant. - --- UNTESTED: NOT CALLED IN EXAMPLE - -function handlers.devanagari_reorder_pre_base_reordering_consonants(head,start,kind,lookupname,replacement) - local current = start - local startnext = nil - local startprev = nil - local startfont = getfont(start) - local startattr = getprop(start,a_syllabe) - -- can be fast for loop + caching state - while current and getid(current) == glyph_code and getsubtype(current) < 256 and getfont(current) == startfont and getprop(current,a_syllabe) == startattr do - local next = getnext(current) - if halant[getchar(current)] and not getprop(current,a_state) then - if next and getid(next) == glyph_code and getsubtype(next) < 256 and getfont(next) == font and getprop(next,a_syllabe) == startattr then - local char = getchar(next) - if char == c_zwnj or char == c_zwj then - current = next - end - end - startnext = getnext(start) - removenode(start,start) - local next = getnext(current) - if next then - setprev(next,start) - end - setnext(start,next) - setnext(current,start) - setprev(start,current) - start = startnext - break - end - current = next - end - if not startnext then - current = getnext(start) - startattr = getprop(start,a_syllabe) - while current and getid(current) == glyph_code and getsubtype(current) < 256 and getfont(current) == startfont and getprop(current,a_syllabe) == startattr do - if not consonant[getchar(current)] and getprop(current,a_state) then --main - startnext = getnext(start) - removenode(start,start) - local prev = getprev(current) - setprev(start,prev) - setnext(prev,start) - setnext(start,current) - setprev(current,start) - start = startnext - break - end - current = getnext(current) - end - end - return head, start, true -end - -function handlers.devanagari_remove_joiners(head,start,kind,lookupname,replacement) - local stop = getnext(start) - local startfont = getfont(start) - while stop and getid(stop) == glyph_code and getsubtype(stop) < 256 and getfont(stop) == startfont do - local char = getchar(stop) - if char == c_zwnj or char == c_zwj then - stop = getnext(stop) - else - break - end - end - if stop then - setnext(getprev(stop),nil) - setprev(stop,getprev(start)) - end - local prev = getprev(start) - if prev then - setnext(prev,stop) - end - if head == start then - head = stop - end - flush_list(start) - return head, stop, true -end - -local valid = { - akhn = true, -- malayalam - rphf = true, - pref = true, - half = true, - blwf = true, - pstf = true, - pres = true, -- malayalam - blws = true, -- malayalam - psts = true, -- malayalam -} - -local function dev2_initialize(font,attr) - - local tfmdata = fontdata[font] - local resources = tfmdata.resources - local lookuphash = resources.lookuphash - - local datasets = otf.dataset(tfmdata,font,attr) - local devanagaridata = datasets.devanagari - - if devanagaridata then -- maybe also check for e.g. seqsubset - - return lookuphash, devanagaridata.seqsubset - - else - - devanagaridata = { } - datasets.devanagari = devanagaridata - - local seqsubset = { } - devanagaridata.seqsubset = seqsubset - - local sequences = resources.sequences - - for s=1,#sequences do - -- local sequence = sequences[s] - local dataset = datasets[s] - if dataset and dataset[1] then -- featurevalue - local kind = dataset[4] - if kind and valid[kind] then - -- could become a function call - local subtables = dataset[3].subtables - for i=1,#subtables do - local lookupname = subtables[i] - local lookupcache = lookuphash[lookupname] - if lookupcache then - local reph = false - local chain = dataset[3] - if chain ~= 0 then --rphf is result of of chain - -- rphf might be result of other handler/chainproc - else - -- rphf acts on consonant + halant - for k, v in next, ra do - local r = lookupcache[k] - if r then - local h = false - for k, v in next, halant do - local h = r[k] - if h then - reph = h.ligature or false - break - end - end - if reph then - break - end - end - end - end - seqsubset[#seqsubset+1] = { kind, lookupcache, reph } - end - end - end - end - end - - lookuphash["dv01_reorder_matras"] = pre_mark -- move to initializer ? - - return lookuphash, seqsubset - - end - -end - --- this one will be merged into the caller: it saves a call, but we will then make function --- of the actions - -local function dev2_reorder(head,start,stop,font,attr,nbspaces) -- maybe do a pass over (determine stop in sweep) - - local lookuphash, seqsubset = dev2_initialize(font,attr) - - local pre_base_reordering_consonants = { } -- was nil ... probably went unnoticed because never assigned - - local reph = false -- was nil ... probably went unnoticed because never assigned - local halfpos = nil - local basepos = nil - local subpos = nil - local postpos = nil - local locl = { } - - for i=1,#seqsubset do - - -- maybe quit if start == stop - - local subset = seqsubset[i] - local kind = subset[1] - local lookupcache = subset[2] - if kind == "rphf" then - for k, v in next, ra do - local r = lookupcache[k] - if r then - for k, v in next, halant do - local h = r[k] - if h then - reph = h.ligature or false - break - end - end - if reph then - break - end - end - end - local current = start - local last = getnext(stop) - while current ~= last do - if current ~= stop then - local c = locl[current] or getchar(current) - local found = lookupcache[c] - if found then - local next = getnext(current) - local n = locl[next] or getchar(next) - if found[n] then --above-base: rphf Consonant + Halant - local afternext = next ~= stop and getnext(next) - if afternext and zw_char[getchar(afternext)] then -- ZWJ and ZWNJ prevent creation of reph - current = next - current = getnext(current) - elseif current == start then - setprop(current,a_state,s_rphf) - current = next - else - current = next - end - end - end - end - current = getnext(current) - end - elseif kind == "pref" then - -- why not global? pretty ineffient this way - -- this will move to the initializer and we will store the hash in dataset - -- todo: reph might also be result of chain - for k, v in next, halant do - local h = lookupcache[k] - if h then - local found = false - for k, v in next, h do - found = v and v.ligature - if found then - pre_base_reordering_consonants[k] = found - break - end - end - if found then - break - end - end - end - -- - local current = start - local last = getnext(stop) - while current ~= last do - if current ~= stop then - local c = locl[current] or getchar(current) - local found = lookupcache[c] - if found then - local next = getnext(current) - local n = locl[next] or getchar(next) - if found[n] then - setprop(current,a_state,s_pref) - setprop(next,a_state,s_pref) - current = next - end - end - end - current = getnext(current) - end - elseif kind == "half" then -- half forms: half / Consonant + Halant - local current = start - local last = getnext(stop) - while current ~= last do - if current ~= stop then - local c = locl[current] or getchar(current) - local found = lookupcache[c] - if found then - local next = getnext(current) - local n = locl[next] or getchar(next) - if found[n] then - if next ~= stop and getchar(getnext(next)) == c_zwnj then -- zwnj prevent creation of half - current = next - else - setprop(current,a_state,s_half) - if not halfpos then - halfpos = current - end - end - current = getnext(current) - end - end - end - current = getnext(current) - end - elseif kind == "blwf" then -- below-base: blwf / Halant + Consonant - local current = start - local last = getnext(stop) - while current ~= last do - if current ~= stop then - local c = locl[current] or getchar(current) - local found = lookupcache[c] - if found then - local next = getnext(current) - local n = locl[next] or getchar(next) - if found[n] then - setprop(current,a_state,s_blwf) - setprop(next,a_state,s_blwf) - current = next - subpos = current - end - end - end - current = getnext(current) - end - elseif kind == "pstf" then -- post-base: pstf / Halant + Consonant - local current = start - local last = getnext(stop) - while current ~= last do - if current ~= stop then - local c = locl[current] or getchar(current) - local found = lookupcache[c] - if found then - local next = getnext(current) - local n = locl[next] or getchar(next) - if found[n] then - setprop(current,a_state,s_pstf) - setprop(next,a_state,s_pstf) - current = next - postpos = current - end - end - end - current = getnext(current) - end - end - end - - -- this one changes per word - - lookuphash["dv02_reorder_reph"] = { [reph] = true } - lookuphash["dv03_reorder_pre_base_reordering_consonants"] = pre_base_reordering_consonants - - local current, base, firstcons = start, nil, nil - - if getprop(start,a_state) == s_rphf then - -- if syllable starts with Ra + H and script has 'Reph' then exclude Reph from candidates for base consonants - current = getnext(getnext(start)) - end - - if current ~= getnext(stop) and getchar(current) == c_nbsp then - -- Stand Alone cluster - if current == stop then - stop = getprev(stop) - head = remove_node(head,current) - flush_node(current) - return head, stop, nbspaces - else - nbspaces = nbspaces + 1 - base = current - current = getnext(current) - if current ~= stop then - local char = getchar(current) - if nukta[char] then - current = getnext(current) - char = getchar(current) - end - if char == c_zwj then - local next = getnext(current) - if current ~= stop and next ~= stop and halant[getchar(next)] then - current = next - next = getnext(current) - local tmp = getnext(next) - local changestop = next == stop - setnext(next,nil) - setprop(current,a_state,s_pref) - current = processcharacters(current,font) - setprop(current,a_state,s_blwf) - current = processcharacters(current,font) - setprop(current,a_state,s_pstf) - current = processcharacters(current,font) - setprop(current,a_state,unsetvalue) - if halant[getchar(current)] then - setnext(getnext(current),tmp) - local nc = copy_node(current) - copyinjection(nc,current) - setchar(current,dotted_circle) - head = insert_node_after(head,current,nc) - else - setnext(current,tmp) -- assumes that result of pref, blwf, or pstf consists of one node - if changestop then - stop = current - end - end - end - end - end - end - else -- not Stand Alone cluster - local last = getnext(stop) - while current ~= last do -- find base consonant - local next = getnext(current) - if consonant[getchar(current)] then - if not (current ~= stop and next ~= stop and halant[getchar(next)] and getchar(getnext(next)) == c_zwj) then - if not firstcons then - firstcons = current - end - -- check whether consonant has below-base or post-base form or is pre-base reordering Ra - local a = getprop(current,a_state) - if not (a == s_pref or a == s_blwf or a == s_pstf) then - base = current - end - end - end - current = next - end - if not base then - base = firstcons - end - end - - if not base then - if getprop(start,a_state) == s_rphf then - setprop(start,a_state,unsetvalue) - end - return head, stop, nbspaces - else - if getprop(base,a_state) then - setprop(base,a_state,unsetvalue) - end - basepos = base - end - if not halfpos then - halfpos = base - end - if not subpos then - subpos = base - end - if not postpos then - postpos = subpos or base - end - - -- Matra characters are classified and reordered by which consonant in a conjunct they have affinity for - - local moved = { } - local current = start - local last = getnext(stop) - while current ~= last do - local char, target, cn = locl[current] or getchar(current), nil, getnext(current) - -- not so efficient (needed for malayalam) - local tpm = twopart_mark[char] - if tpm then - local extra = copy_node(current) - copyinjection(extra,current) - char = tpm[1] - setchar(current,char) - setchar(extra,tpm[2]) - head = insert_node_after(head,current,extra) - end - -- - if not moved[current] and dependent_vowel[char] then - if pre_mark[char] then -- Before first half form in the syllable - moved[current] = true - local prev = getprev(current) - local next = getnext(current) - if prev then - setnext(prev,next) - end - if next then - setprev(next,prev) - end - if current == stop then - stop = getprev(current) - end - if halfpos == start then - if head == start then - head = current - end - start = current - end - local prev = getprev(halfpos) - if prev then - setnext(prev,current) - end - setprev(current,prev) - setprev(halfpos,current) - setnext(current,halfpos) - halfpos = current - elseif above_mark[char] then -- After main consonant - target = basepos - if subpos == basepos then - subpos = current - end - if postpos == basepos then - postpos = current - end - basepos = current - elseif below_mark[char] then -- After subjoined consonants - target = subpos - if postpos == subpos then - postpos = current - end - subpos = current - elseif post_mark[char] then -- After post-form consonant - target = postpos - postpos = current - end - if mark_above_below_post[char] then - local prev = getprev(current) - if prev ~= target then - local next = getnext(current) - if prev then -- not needed, already tested with target - setnext(prev,next) - end - if next then - setprev(next,prev) - end - if current == stop then - stop = prev - end - local next = getnext(target) - if next then - setprev(next,current) - end - setnext(current,next) - setnext(target,current) - setprev(current,target) - end - end - end - current = cn - end - - -- Reorder marks to canonical order: Adjacent nukta and halant or nukta and vedic sign are always repositioned if necessary, so that the nukta is first. - - local current, c = start, nil - while current ~= stop do - local char = getchar(current) - if halant[char] or stress_tone_mark[char] then - if not c then - c = current - end - else - c = nil - end - local next = getnext(current) - if c and nukta[getchar(next)] then - if head == c then - head = next - end - if stop == next then - stop = current - end - local prev = getprev(c) - if prev then - setnext(prev,next) - end - setprev(next,prev) - local nextnext = getnext(next) - setnext(current,nextnext) - local nextnextnext = getnext(nextnext) - if nextnextnext then - setprev(nextnextnext,current) - end - setprev(c,nextnext) - setnext(nextnext,c) - end - if stop == current then break end - current = getnext(current) - end - - if getchar(base) == c_nbsp then - nbspaces = nbspaces - 1 - head = remove_node(head, base) - flush_node(base) - end - - return head, stop, nbspaces -end - --- cleaned up and optimized ... needs checking (local, check order, fixes, extra hash, etc) - -local separator = { } - -imerge(separator,consonant) -imerge(separator,independent_vowel) -imerge(separator,dependent_vowel) -imerge(separator,vowel_modifier) -imerge(separator,stress_tone_mark) - -for k, v in next, nukta do separator[k] = true end -for k, v in next, halant do separator[k] = true end - -local function analyze_next_chars_one(c,font,variant) -- skip one dependent vowel - -- why two variants ... the comment suggests that it's the same ruleset - local n = getnext(c) - if not n then - return c - end - if variant == 1 then - local v = getid(n) == glyph_code and getsubtype(n) < 256 and getfont(n) == font - if v and nukta[getchar(n)] then - n = getnext(n) - if n then - v = getid(n) == glyph_code and getsubtype(n) < 256 and getfont(n) == font - end - end - if n and v then - local nn = getnext(n) - if nn and getid(nn) == glyph_code and getsubtype(nn) < 256 and getfont(nn) == font then - local nnn = getnext(nn) - if nnn and getid(nnn) == glyph_code and getsubtype(nnn) < 256 and getfont(nnn) == font then - local nnc = getchar(nn) - local nnnc = getchar(nnn) - if nnc == c_zwj and consonant[nnnc] then - c = nnn - elseif (nnc == c_zwnj or nnc == c_zwj) and halant[nnnc] then - local nnnn = getnext(nnn) - if nnnn and getid(nnnn) == glyph_code and consonant[getchar(nnnn)] and getsubtype(nnnn) < 256 and getfont(nnnn) == font then - c = nnnn - end - end - end - end - end - elseif variant == 2 then - if getid(n) == glyph_code and nukta[getchar(n)] and getsubtype(n) < 256 and getfont(n) == font then - c = n - end - n = getnext(c) - if n and getid(n) == glyph_code and getsubtype(n) < 256 and getfont(n) == font then - local nn = getnext(n) - if nn then - local nv = getid(nn) == glyph_code and getsubtype(nn) < 256 and getfont(nn) == font - if nv and zw_char[getchar(n)] then - n = nn - nn = getnext(nn) - nv = nn and getid(nn) == glyph_code and getsubtype(nn) < 256 and getfont(nn) == font - end - if nv and halant[getchar(n)] and consonant[getchar(nn)] then - c = nn - end - end - end - end - -- c = ms_matra(c) - local n = getnext(c) - if not n then - return c - end - local v = getid(n) == glyph_code and getsubtype(n) < 256 and getfont(n) == font - if not v then - return c - end - local char = getchar(n) - if dependent_vowel[char] then - c = getnext(c) - n = getnext(c) - if not n then - return c - end - v = getid(n) == glyph_code and getsubtype(n) < 256 and getfont(n) == font - if not v then - return c - end - char = getchar(n) - end - if nukta[char] then - c = getnext(c) - n = getnext(c) - if not n then - return c - end - v = getid(n) == glyph_code and getsubtype(n) < 256 and getfont(n) == font - if not v then - return c - end - char = getchar(n) - end - if halant[char] then - c = getnext(c) - n = getnext(c) - if not n then - return c - end - v = getid(n) == glyph_code and getsubtype(n) < 256 and getfont(n) == font - if not v then - return c - end - char = getchar(n) - end - if vowel_modifier[char] then - c = getnext(c) - n = getnext(c) - if not n then - return c - end - v = getid(n) == glyph_code and getsubtype(n) < 256 and getfont(n) == font - if not v then - return c - end - char = getchar(n) - end - if stress_tone_mark[char] then - c = getnext(c) - n = getnext(c) - if not n then - return c - end - v = getid(n) == glyph_code and getsubtype(n) < 256 and getfont(n) == font - if not v then - return c - end - char = getchar(n) - end - if stress_tone_mark[char] then - return n - else - return c - end -end - -local function analyze_next_chars_two(c,font) - local n = getnext(c) - if not n then - return c - end - if getid(n) == glyph_code and nukta[getchar(n)] and getsubtype(n) < 256 and getfont(n) == font then - c = n - end - n = c - while true do - local nn = getnext(n) - if nn and getid(nn) == glyph_code and getsubtype(nn) < 256 and getfont(nn) == font then - local char = getchar(nn) - if halant[char] then - n = nn - local nnn = getnext(nn) - if nnn and getid(nnn) == glyph_code and zw_char[getchar(nnn)] and getsubtype(nnn) < 256 and getfont(nnn) == font then - n = nnn - end - elseif char == c_zwnj or char == c_zwj then - -- n = nn -- not here (?) - local nnn = getnext(nn) - if nnn and getid(nnn) == glyph_code and halant[getchar(nnn)] and getsubtype(nnn) < 256 and getfont(nnn) == font then - n = nnn - end - else - break - end - local nn = getnext(n) - if nn and getid(nn) == glyph_code and consonant[getchar(nn)] and getsubtype(nn) < 256 and getfont(nn) == font then - n = nn - local nnn = getnext(nn) - if nnn and getid(nnn) == glyph_code and nukta[getchar(nnn)] and getsubtype(nnn) < 256 and getfont(nnn) == font then - n = nnn - end - c = n - else - break - end - else - break - end - end - -- - if not c then - -- This shouldn't happen I guess. - return - end - local n = getnext(c) - if not n then - return c - end - local v = getid(n) == glyph_code and getsubtype(n) < 256 and getfont(n) == font - if not v then - return c - end - local char = getchar(n) - if char == c_anudatta then - c = n - n = getnext(c) - if not n then - return c - end - v = getid(n) == glyph_code and getsubtype(n) < 256 and getfont(n) == font - if not v then - return c - end - char = getchar(n) - end - if halant[char] then - c = getnext(c) - n = getnext(c) - if not n then - return c - end - v = getid(n) == glyph_code and getsubtype(n) < 256 and getfont(n) == font - if not v then - return c - end - char = getchar(n) - if char == c_zwnj or char == c_zwj then - c = getnext(c) - n = getnext(c) - if not n then - return c - end - v = getid(n) == glyph_code and getsubtype(n) < 256 and getfont(n) == font - if not v then - return c - end - char = getchar(n) - end - else - -- c = ms_matra(c) - -- same as one - if dependent_vowel[char] then - c = getnext(c) - n = getnext(c) - if not n then - return c - end - v = getid(n) == glyph_code and getsubtype(n) < 256 and getfont(n) == font - if not v then - return c - end - char = getchar(n) - end - if nukta[char] then - c = getnext(c) - n = getnext(c) - if not n then - return c - end - v = getid(n) == glyph_code and getsubtype(n) < 256 and getfont(n) == font - if not v then - return c - end - char = getchar(n) - end - if halant[char] then - c = getnext(c) - n = getnext(c) - if not n then - return c - end - v = getid(n) == glyph_code and getsubtype(n) < 256 and getfont(n) == font - if not v then - return c - end - char = getchar(n) - end - end - -- same as one - if vowel_modifier[char] then - c = getnext(c) - n = getnext(c) - if not n then - return c - end - v = getid(n) == glyph_code and getsubtype(n) < 256 and getfont(n) == font - if not v then - return c - end - char = getchar(n) - end - if stress_tone_mark[char] then - c = getnext(c) - n = getnext(c) - if not n then - return c - end - v = getid(n) == glyph_code and getsubtype(n) < 256 and getfont(n) == font - if not v then - return c - end - char = getchar(n) - end - if stress_tone_mark[char] then - return n - else - return c - end -end - -local function inject_syntax_error(head,current,mark) - local signal = copy_node(current) - copyinjection(signal,current) - if mark == pre_mark then - setchar(signal,dotted_circle) - else - setchar(current,dotted_circle) - end - return insert_node_after(head,current,signal) -end - --- It looks like these two analyzers were written independently but they share --- a lot. Common code has been synced. - -function methods.deva(head,font,attr) - head = tonut(head) - local current = head - local start = true - local done = false - local nbspaces = 0 - while current do - if getid(current) == glyph_code and getsubtype(current) < 256 and getfont(current) == font then - done = true - local syllablestart = current - local syllableend = nil - local c = current - local n = getnext(c) - if n and ra[getchar(c)] and getid(n) == glyph_code and halant[getchar(n)] and getsubtype(n) < 256 and getfont(n) == font then - local n = getnext(n) - if n and getid(n) == glyph_code and getsubtype(n) < 256 and getfont(n) == font then - c = n - end - end - local standalone = getchar(c) == c_nbsp - if standalone then - local prev = getprev(current) - if not prev then - -- begin of paragraph or box - elseif getid(prev) ~= glyph_code or getsubtype(prev) >= 256 or getfont(prev) ~= font then - -- different font or language so quite certainly a different word - elseif not separator[getchar(prev)] then - -- something that separates words - else - standalone = false - end - end - if standalone then - -- stand alone cluster (at the start of the word only): #[Ra+H]+NBSP+[N]+[<[<ZWJ|ZWNJ>]+H+C>]+[{M}+[N]+[H]]+[SM]+[(VD)] - local syllableend = analyze_next_chars_one(c,font,2) - current = getnext(syllableend) - if syllablestart ~= syllableend then - head, current, nbspaces = deva_reorder(head,syllablestart,syllableend,font,attr,nbspaces) - current = getnext(current) - end - else - -- we can delay the getsubtype(n) and getfont(n) and test for say halant first - -- as an table access is faster than two function calls (subtype and font are - -- pseudo fields) but the code becomes messy (unless we make it a function) - local char = getchar(current) - if consonant[char] then - -- syllable containing consonant - local prevc = true - while prevc do - prevc = false - local n = getnext(current) - if not n then - break - end - local v = getid(n) == glyph_code and getsubtype(n) < 256 and getfont(n) == font - if not v then - break - end - local c = getchar(n) - if nukta[c] then - n = getnext(n) - if not n then - break - end - v = getid(n) == glyph_code and getsubtype(n) < 256 and getfont(n) == font - if not v then - break - end - c = getchar(n) - end - if halant[c] then - n = getnext(n) - if not n then - break - end - v = getid(n) == glyph_code and getsubtype(n) < 256 and getfont(n) == font - if not v then - break - end - c = getchar(n) - if c == c_zwnj or c == c_zwj then - n = getnext(n) - if not n then - break - end - v = getid(n) == glyph_code and getsubtype(n) < 256 and getfont(n) == font - if not v then - break - end - c = getchar(n) - end - if consonant[c] then - prevc = true - current = n - end - end - end - local n = getnext(current) - if n and getid(n) == glyph_code and nukta[getchar(n)] and getsubtype(n) < 256 and getfont(n) == font then - -- nukta (not specified in Microsft Devanagari OpenType specification) - current = n - n = getnext(current) - end - syllableend = current - current = n - if current then - local v = getid(current) == glyph_code and getsubtype(current) < 256 and getfont(current) == font - if v then - if halant[getchar(current)] then - -- syllable containing consonant without vowels: {C + [Nukta] + H} + C + H - local n = getnext(current) - if n and getid(n) == glyph_code and zw_char[getchar(n)] and getsubtype(n) < 256 and getfont(n) == font then - -- code collapsed, probably needs checking with intention - syllableend = n - current = getnext(n) - else - syllableend = current - current = n - end - else - -- syllable containing consonant with vowels: {C + [Nukta] + H} + C + [M] + [VM] + [SM] - local c = getchar(current) - if dependent_vowel[c] then - syllableend = current - current = getnext(current) - v = current and getid(current) == glyph_code and getsubtype(current) < 256 and getfont(current) == font - if v then - c = getchar(current) - end - end - if v and vowel_modifier[c] then - syllableend = current - current = getnext(current) - v = current and getid(current) == glyph_code and getsubtype(current) < 256 and getfont(current) == font - if v then - c = getchar(current) - end - end - if v and stress_tone_mark[c] then - syllableend = current - current = getnext(current) - end - end - end - end - if syllablestart ~= syllableend then - head, current, nbspaces = deva_reorder(head,syllablestart,syllableend,font,attr,nbspaces) - current = getnext(current) - end - elseif independent_vowel[char] then - -- syllable without consonants: VO + [VM] + [SM] - syllableend = current - current = getnext(current) - if current then - local v = getid(current) == glyph_code and getsubtype(current) < 256 and getfont(current) == font - if v then - local c = getchar(current) - if vowel_modifier[c] then - syllableend = current - current = getnext(current) - v = current and getid(current) == glyph_code and getsubtype(current) < 256 and getfont(current) == font - if v then - c = getchar(current) - end - end - if v and stress_tone_mark[c] then - syllableend = current - current = getnext(current) - end - end - end - else - local mark = mark_four[char] - if mark then - head, current = inject_syntax_error(head,current,mark) - end - current = getnext(current) - end - end - else - current = getnext(current) - end - start = false - end - - if nbspaces > 0 then - head = replace_all_nbsp(head) - end - - head = tonode(head) - - return head, done -end - --- there is a good change that when we run into one with subtype < 256 that the rest is also done --- so maybe we can omit this check (it's pretty hard to get glyphs in the stream out of the blue) - --- handler(head,start,kind,lookupname,lookupmatch,sequence,lookuphash,1) - -function methods.dev2(head,font,attr) - head = tonut(head) - local current = head - local start = true - local done = false - local syllabe = 0 - local nbspaces = 0 - while current do - local syllablestart, syllableend = nil, nil - if getid(current) == glyph_code and getsubtype(current) < 256 and getfont(current) == font then - done = true - syllablestart = current - local c = current - local n = getnext(current) - if n and ra[getchar(c)] and getid(n) == glyph_code and halant[getchar(n)] and getsubtype(n) < 256 and getfont(n) == font then - local n = getnext(n) - if n and getid(n) == glyph_code and getsubtype(n) < 256 and getfont(n) == font then - c = n - end - end - local char = getchar(c) - if independent_vowel[char] then - -- vowel-based syllable: [Ra+H]+V+[N]+[<[<ZWJ|ZWNJ>]+H+C|ZWJ+C>]+[{M}+[N]+[H]]+[SM]+[(VD)] - current = analyze_next_chars_one(c,font,1) - syllableend = current - else - local standalone = char == c_nbsp - if standalone then - nbspaces = nbspaces + 1 - local p = getprev(current) - if not p then - -- begin of paragraph or box - elseif getid(p) ~= glyph_code or getsubtype(p) >= 256 or getfont(p) ~= font then - -- different font or language so quite certainly a different word - elseif not separator[getchar(p)] then - -- something that separates words - else - standalone = false - end - end - if standalone then - -- Stand Alone cluster (at the start of the word only): #[Ra+H]+NBSP+[N]+[<[<ZWJ|ZWNJ>]+H+C>]+[{M}+[N]+[H]]+[SM]+[(VD)] - current = analyze_next_chars_one(c,font,2) - syllableend = current - elseif consonant[getchar(current)] then - -- WHY current INSTEAD OF c ? - - -- Consonant syllable: {C+[N]+<H+[<ZWNJ|ZWJ>]|<ZWNJ|ZWJ>+H>} + C+[N]+[A] + [< H+[<ZWNJ|ZWJ>] | {M}+[N]+[H]>]+[SM]+[(VD)] - current = analyze_next_chars_two(current,font) -- not c ! - syllableend = current - end - end - end - if syllableend then - syllabe = syllabe + 1 - local c = syllablestart - local n = getnext(syllableend) - while c ~= n do - setprop(c,a_syllabe,syllabe) - c = getnext(c) - end - end - if syllableend and syllablestart ~= syllableend then - head, current, nbspaces = dev2_reorder(head,syllablestart,syllableend,font,attr,nbspaces) - end - if not syllableend and getid(current) == glyph_code and getsubtype(current) < 256 and getfont(current) == font and not getprop(current,a_state) then - local mark = mark_four[getchar(current)] - if mark then - head, current = inject_syntax_error(head,current,mark) - end - end - start = false - current = getnext(current) - end - - if nbspaces > 0 then - head = replace_all_nbsp(head) - end - - head = tonode(head) - - return head, done -end - -methods.mlym = methods.deva -methods.mlm2 = methods.dev2 diff --git a/tex/context/base/mkiv/font-off.lua b/tex/context/base/mkiv/font-off.lua index b8fadb634..7e509c2c3 100644 --- a/tex/context/base/mkiv/font-off.lua +++ b/tex/context/base/mkiv/font-off.lua @@ -6,6 +6,7 @@ if not modules then modules = { } end modules ['font-off'] = { license = "see context related readme files" } +local tonumber = tonumber local lower = string.lower local round = math.round local setmetatableindex = table.setmetatableindex diff --git a/tex/context/base/mkiv/font-one.lua b/tex/context/base/mkiv/font-one.lua index d9b9c65df..a3dc7b038 100644 --- a/tex/context/base/mkiv/font-one.lua +++ b/tex/context/base/mkiv/font-one.lua @@ -22,12 +22,11 @@ add features.</p> local fonts, logs, trackers, containers, resolvers = fonts, logs, trackers, containers, resolvers local next, type, tonumber, rawget = next, type, tonumber, rawget -local match, gmatch, lower, gsub, strip, find = string.match, string.gmatch, string.lower, string.gsub, string.strip, string.find -local char, byte, sub = string.char, string.byte, string.sub +local match, gsub = string.match, string.gsub local abs = math.abs -local bxor, rshift = bit32.bxor, bit32.rshift local P, S, R, Cmt, C, Ct, Cs, Carg = lpeg.P, lpeg.S, lpeg.R, lpeg.Cmt, lpeg.C, lpeg.Ct, lpeg.Cs, lpeg.Carg local lpegmatch, patterns = lpeg.match, lpeg.patterns +local sortedhash = table.sortedhash local trace_features = false trackers.register("afm.features", function(v) trace_features = v end) local trace_indexing = false trackers.register("afm.indexing", function(v) trace_indexing = v end) @@ -41,6 +40,8 @@ local derivetable = table.derive local findbinfile = resolvers.findbinfile +local privateoffset = fonts.constructors and fonts.constructors.privateoffset or 0xF0000 -- 0x10FFFF + local definers = fonts.definers local readers = fonts.readers local constructors = fonts.constructors @@ -58,7 +59,7 @@ local registerafmfeature = afmfeatures.register local afmenhancers = constructors.enhancers.afm local registerafmenhancer = afmenhancers.register -afm.version = 1.512 -- incrementing this number one up will force a re-cache +afm.version = 1.513 -- incrementing this number one up will force a re-cache afm.cache = containers.define("fonts", "one", afm.version, true) afm.autoprefixed = true -- this will become false some day (catches texnansi-blabla.*) @@ -139,9 +140,9 @@ local function enhance_unify_names(data, filename) local unicodevector = fonts.encodings.agl.unicodes -- loaded runtime in context local unicodes = { } local names = { } - local private = constructors.privateoffset + local private = data.private or privateoffset local descriptions = data.descriptions - for name, blob in next, data.characters do + for name, blob in sortedhash(data.characters) do -- sorting is nicer for privates local code = unicodevector[name] -- or characters.name_to_unicode[name] if not code then code = lpegmatch(uparser,name) @@ -179,13 +180,13 @@ local function enhance_unify_names(data, filename) end end data.characters = nil + data.private = private local resources = data.resources - local filename = resources.filename or file.removesuffix(file.basename(filename)) + local filename = resources.filename or file.removesuffix(file.basename(filename)) resources.filename = resolvers.unresolve(filename) -- no shortcut resources.unicodes = unicodes -- name to unicode - resources.marks = { } -- todo - -- resources.names = names -- name to index - resources.private = private + resources.marks = { } -- todo + -- resources.names = names -- name to index end local everywhere = { ["*"] = { ["*"] = true } } -- or: { ["*"] = { "*" } } @@ -587,6 +588,7 @@ local function copytotfm(data) properties.fullname = fullname properties.psname = fullname properties.name = filename or fullname or fontname + properties.private = properties.private or data.private or privateoffset -- if next(characters) then return { diff --git a/tex/context/base/mkiv/font-onr.lua b/tex/context/base/mkiv/font-onr.lua index 85d3604b7..26a782649 100644 --- a/tex/context/base/mkiv/font-onr.lua +++ b/tex/context/base/mkiv/font-onr.lua @@ -41,7 +41,7 @@ handlers.afm = afm local readers = afm.readers or { } afm.readers = readers -afm.version = 1.512 -- incrementing this number one up will force a re-cache +afm.version = 1.513 -- incrementing this number one up will force a re-cache --[[ldx-- <p>We start with the basic reader which we give a name similar to the built in <l n='tfm'/> @@ -89,7 +89,7 @@ do local dup = P("dup") local put = P("put") local array = P("array") - local name = P("/") * C((R("az")+R("AZ")+R("09")+S("-_."))^1) + local name = P("/") * C((R("az","AZ","09")+S("-_."))^1) local digits = R("09")^1 local cardinal = digits / tonumber local spaces = P(" ")^1 @@ -103,32 +103,40 @@ do return position + 1 end - local setroutine = function(str,position,index,size) + local setroutine = function(str,position,index,size,filename) local forward = position + tonumber(size) local stream = decrypt(sub(str,position+1,forward),4330,4) routines[index] = { byte(stream,1,#stream) } return forward end - local setvector = function(str,position,name,size) + local setvector = function(str,position,name,size,filename) local forward = position + tonumber(size) if n >= m then return #str elseif forward < #str then + if n == 0 and name ~= ".notdef" then + report_pfb("reserving .notdef at index 0 in %a",filename) -- luatex needs that + n = n + 1 + end vector[n] = name - n = n + 1 -- we compensate for notdef at the cff loader end + n = n + 1 return forward else return #str end end - local setshapes = function(str,position,name,size) + local setshapes = function(str,position,name,size,filename) local forward = position + tonumber(size) local stream = sub(str,position+1,forward) if n > m then return #str elseif forward < #str then + if n == 0 and name ~= ".notdef" then + report_pfb("reserving .notdef at index 0 in %a",filename) -- luatex needs that + n = n + 1 + end vector[n] = name n = n + 1 chars [n] = decrypt(stream,4330,4) @@ -144,15 +152,15 @@ do local p_filterroutines = -- dup <i> <n> RD or -| <n encrypted bytes> NP or | (1-subroutines)^0 * subroutines * spaces * Cmt(cardinal,initialize) - * (Cmt(cardinal * spaces * cardinal * p_rd, setroutine) * p_np + P(1))^1 + * (Cmt(cardinal * spaces * cardinal * p_rd * Carg(1), setroutine) * p_np + P(1))^1 local p_filtershapes = -- /foo <n> RD <n encrypted bytes> ND (1-charstrings)^0 * charstrings * spaces * Cmt(cardinal,initialize) - * (Cmt(name * spaces * cardinal * p_rd, setshapes) * p_nd + P(1))^1 + * (Cmt(name * spaces * cardinal * p_rd * Carg(1) , setshapes) * p_nd + P(1))^1 local p_filternames = Ct ( (1-charstrings)^0 * charstrings * spaces * Cmt(cardinal,initialize) - * (Cmt(name * spaces * cardinal, setvector) + P(1))^1 + * (Cmt(name * spaces * cardinal * Carg(1), setvector) + P(1))^1 ) -- /Encoding 256 array @@ -177,7 +185,7 @@ do return end - if not (find(data,"!PS%-AdobeFont%-") or find(data,"%%!FontType1")) then + if not (find(data,"!PS-AdobeFont-",1,true) or find(data,"%!FontType1",1,true)) then report_pfb("no font in %a",filename) return end @@ -196,10 +204,9 @@ do local glyphs = { } routines, vector, chars = { }, { }, { } - if shapestoo then - lpegmatch(p_filterroutines,binary) - lpegmatch(p_filtershapes,binary) + lpegmatch(p_filterroutines,binary,1,filename) + lpegmatch(p_filtershapes,binary,1,filename) local data = { dictionaries = { { @@ -211,7 +218,7 @@ do } fonts.handlers.otf.readers.parsecharstrings(false,data,glyphs,true,true) else - lpegmatch(p_filternames,binary) + lpegmatch(p_filternames,binary,1,filename) end names = vector @@ -233,7 +240,7 @@ do if trace_loading then report_afm("getting index data from %a",pfbname) end - for index=1,#vector do + for index=0,#vector do -- hm, zero, often space or notdef local name = vector[index] local char = characters[name] if char then @@ -241,6 +248,10 @@ do report_afm("glyph %a has index %a",name,index) end char.index = index + else + if trace_indexing then + report_afm("glyph %a has index %a but no data",name,index) + end end end end @@ -410,10 +421,6 @@ local fullparser = ( P("StartFontMetrics") * fontdata * name / start ) * ( p_charmetrics + p_kernpairs + p_parameters + (1-P("EndFontMetrics")) )^0 * ( P("EndFontMetrics") / stop ) -local fullparser = ( P("StartFontMetrics") * fontdata * name / start ) - * ( p_charmetrics + p_kernpairs + p_parameters + (1-P("EndFontMetrics")) )^0 - * ( P("EndFontMetrics") / stop ) - local infoparser = ( P("StartFontMetrics") * fontdata * name / start ) * ( p_parameters + (1-P("EndFontMetrics")) )^0 * ( P("EndFontMetrics") / stop ) diff --git a/tex/context/base/mkiv/font-osd.lua b/tex/context/base/mkiv/font-osd.lua index ca20f6782..04fbf88f5 100644 --- a/tex/context/base/mkiv/font-osd.lua +++ b/tex/context/base/mkiv/font-osd.lua @@ -6,13 +6,6 @@ if not modules then modules = { } end modules ['font-osd'] = { -- script devanag license = "see context related readme files" } --- I'll optimize this one with ischar (much faster) when I see a reason (read: I need a --- proper test case first). - --- This is a version of font-odv.lua adapted to the new font loader and more --- direct hashing. The initialization code has been adapted (more efficient). One day --- I'll speed this up ... char swapping and properties. - -- A few remarks: -- -- This code is a partial rewrite of the code that deals with devanagari. The data and logic @@ -29,7 +22,8 @@ if not modules then modules = { } end modules ['font-osd'] = { -- script devanag -- much can get messed up in over a week work) it could be that I introduced bugs. There -- is more to gain (esp in the functions applied to a range) but I'll do that when -- everything works as expected. Kai's original code is kept in font-odk.lua as a reference --- so blame me (HH) for bugs. +-- so blame me (HH) for bugs. (We no longer ship that file as the code below has diverted +-- too much and in the meantime has more than doubled in size.) -- -- Interesting is that Kai managed to write this on top of the existing otf handler. Only a -- few extensions were needed, like a few more analyzing states and dealing with changed @@ -467,7 +461,6 @@ local sequence_reorder_matras = { nofsteps = 1, steps = { { - osdstep = true, coverage = pre_mark, } } @@ -482,7 +475,6 @@ local sequence_reorder_reph = { nofsteps = 1, steps = { { - osdstep = true, coverage = { }, } } @@ -497,7 +489,6 @@ local sequence_reorder_pre_base_reordering_consonants = { nofsteps = 1, steps = { { - osdstep = true, coverage = { }, } } @@ -511,7 +502,7 @@ local sequence_remove_joiners = { type = "devanagari_remove_joiners", nofsteps = 1, steps = { - { osdstep = true, + { coverage = both_joiners_true, }, } @@ -639,35 +630,22 @@ local function initializedevanagi(tfmdata) if coverage then local reph = false if kind == "rphf" then - -- - -- KE: I don't understand the rationale behind osdstep. The original if - -- statement checked whether coverage is contextual chaining. - -- - -- HH: The osdstep signals that we deal with our own feature here, not - -- one in the font itself so it was just a safeguard against us overloading - -- something driven by the font. - -- - -- if step.osdstep then -- selective - if true then -- always - -- rphf acts on consonant + halant - for k, v in next, ra do - local r = coverage[k] - if r then - local h = false - for k, v in next, halant do - local h = r[k] - if h then - reph = h.ligature or false - break - end - end - if reph then + -- rphf acts on consonant + halant + for k, v in next, ra do + local r = coverage[k] + if r then + local h = false + for k, v in next, halant do + local h = r[k] + if h then + reph = h.ligature or false break end end + if reph then + break + end end - else - -- rphf might be result of other handler/chainproc end end seqsubset[#seqsubset+1] = { kind, coverage, reph } @@ -1140,7 +1118,7 @@ function handlers.devanagari_reorder_matras(head,start) -- no leak head = remove_node(head,start) setlink(start,next) setlink(current,start) - -- setlink(current,start,next) -- maybe + -- setlink(current,start,next) -- maybe start = startnext break end @@ -1200,7 +1178,7 @@ function handlers.devanagari_reorder_reph(head,start) head = remove_node(head,start) setlink(start,next) setlink(current,start) - -- setlink(current,start,next) -- maybe + -- setlink(current,start,next) -- maybe start = startnext startattr = getprop(start,a_syllabe) break @@ -1220,7 +1198,7 @@ function handlers.devanagari_reorder_reph(head,start) head = remove_node(head,start) setlink(getprev(current),start) setlink(start,current) - -- setlink(getprev(current),start,current) -- maybe + -- setlink(getprev(current),start,current) -- maybe start = startnext startattr = getprop(start,a_syllabe) break @@ -1254,7 +1232,7 @@ function handlers.devanagari_reorder_reph(head,start) head = remove_node(head,start) setlink(getprev(c),start) setlink(start,c) - -- setlink(getprev(c),start,c) -- maybe + -- setlink(getprev(c),start,c) -- maybe -- end start = startnext startattr = getprop(start,a_syllabe) @@ -1278,7 +1256,7 @@ function handlers.devanagari_reorder_reph(head,start) head = remove_node(head,start) setlink(start,getnext(current)) setlink(current,start) - -- setlink(current,start,getnext(current)) -- maybe + -- setlink(current,start,getnext(current)) -- maybe start = startnext end end @@ -1295,7 +1273,11 @@ end -- 2 Try to find a target position the same way as for pre-base matra. If it is found, reorder pre-base consonant glyph. -- 3 If position is not found, reorder immediately before main consonant. --- UNTESTED: NOT CALLED IN EXAMPLE +-- Here we implement a few handlers: +-- +-- function(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step) +-- return head, start, done +-- end function handlers.devanagari_reorder_pre_base_reordering_consonants(head,start) local current = start @@ -1322,7 +1304,7 @@ function handlers.devanagari_reorder_pre_base_reordering_consonants(head,start) removenode(start,start) setlink(start,next) setlink(current,start) - -- setlink(current,start,next) -- maybe + -- setlink(current,start,next) -- maybe start = startnext break end @@ -1355,32 +1337,6 @@ function handlers.devanagari_reorder_pre_base_reordering_consonants(head,start) return head, start, true end --- function handlers.devanagari_remove_joiners(head,start,kind,lookupname,replacement) --- local stop = getnext(start) --- local font = getfont(start) --- while stop do --- local char = ischar(stop) --- if char and (char == c_zwnj or char == c_zwj) then --- stop = getnext(stop) --- else --- break --- end --- end --- if stop then --- setnext(getprev(stop)) --- setprev(stop,getprev(start)) --- end --- local prev = getprev(start) --- if prev then --- setnext(prev,stop) --- end --- if head == start then --- head = stop --- end --- flush_list(start) --- return head, stop, true --- end - function handlers.devanagari_remove_joiners(head,start,kind,lookupname,replacement) local stop = getnext(start) local font = getfont(start) @@ -1592,7 +1548,7 @@ local function dev2_reorder(head,start,stop,font,attr,nbspaces) -- maybe do a pa next = getnext(current) local tmp = getnext(next) local changestop = next == stop - setnext(next,nil) + setnext(next) setprop(current,a_state,s_pref) current = processcharacters(current,font) setprop(current,a_state,s_blwf) diff --git a/tex/context/base/mkiv/font-ota.lua b/tex/context/base/mkiv/font-ota.lua index 232c2586a..9c6ee7403 100644 --- a/tex/context/base/mkiv/font-ota.lua +++ b/tex/context/base/mkiv/font-ota.lua @@ -1,6 +1,6 @@ if not modules then modules = { } end modules ['font-ota'] = { version = 1.001, - comment = "companion to font-otf.lua (analysing)", + comment = "companion to font-ini.mkiv", author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", copyright = "PRAGMA ADE / ConTeXt Development Team", license = "see context related readme files" @@ -71,7 +71,7 @@ local s_isol = 4 local s_blwf = 10 local s_mark = 5 local s_pstf = 11 local s_rest = 6 -local states = { +local states = allocate { init = s_init, medi = s_medi, med2 = s_medi, @@ -88,7 +88,7 @@ local states = { pstf = s_pstf, } -local features = { +local features = allocate { init = s_init, medi = s_medi, med2 = s_medi, @@ -247,7 +247,7 @@ local function warning(current,what) end end -local mappers = { +local mappers = allocate { l = s_init, -- left d = s_medi, -- double c = s_medi, -- joiner diff --git a/tex/context/base/mkiv/font-otb.lua b/tex/context/base/mkiv/font-otb.lua deleted file mode 100644 index a31079225..000000000 --- a/tex/context/base/mkiv/font-otb.lua +++ /dev/null @@ -1,705 +0,0 @@ -if not modules then modules = { } end modules ['font-otb'] = { - version = 1.001, - comment = "companion to font-ini.mkiv", - author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", - copyright = "PRAGMA ADE / ConTeXt Development Team", - license = "see context related readme files" -} -local concat = table.concat -local format, gmatch, gsub, find, match, lower, strip = string.format, string.gmatch, string.gsub, string.find, string.match, string.lower, string.strip -local type, next, tonumber, tostring, rawget = type, next, tonumber, tostring, rawget - -local trace_baseinit = false trackers.register("otf.baseinit", function(v) trace_baseinit = v end) -local trace_singles = false trackers.register("otf.singles", function(v) trace_singles = v end) -local trace_multiples = false trackers.register("otf.multiples", function(v) trace_multiples = v end) -local trace_alternatives = false trackers.register("otf.alternatives", function(v) trace_alternatives = v end) -local trace_ligatures = false trackers.register("otf.ligatures", function(v) trace_ligatures = v end) -local trace_ligatures_detail = false trackers.register("otf.ligatures.detail", function(v) trace_ligatures_detail = v end) -local trace_kerns = false trackers.register("otf.kerns", function(v) trace_kerns = v end) -local trace_preparing = false trackers.register("otf.preparing", function(v) trace_preparing = v end) - -local report_prepare = logs.reporter("fonts","otf prepare") - -local fonts = fonts -local otf = fonts.handlers.otf - -local otffeatures = otf.features -local registerotffeature = otffeatures.register - -otf.defaultbasealternate = "none" -- first last - -local wildcard = "*" -local default = "dflt" - -local formatters = string.formatters -local f_unicode = formatters["%U"] -local f_uniname = formatters["%U (%s)"] -local f_unilist = formatters["% t (% t)"] - -local function gref(descriptions,n) - if type(n) == "number" then - local name = descriptions[n].name - if name then - return f_uniname(n,name) - else - return f_unicode(n) - end - elseif n then - local num, nam, j = { }, { }, 0 - for i=1,#n do - local ni = n[i] - if tonumber(ni) then -- first is likely a key - j = j + 1 - local di = descriptions[ni] - num[j] = f_unicode(ni) - nam[j] = di and di.name or "-" - end - end - return f_unilist(num,nam) - else - return "<error in base mode tracing>" - end -end - -local function cref(feature,lookuptags,lookupname) - if lookupname then - return formatters["feature %a, lookup %a"](feature,lookuptags[lookupname]) - else - return formatters["feature %a"](feature) - end -end - -local function report_alternate(feature,lookuptags,lookupname,descriptions,unicode,replacement,value,comment) - report_prepare("%s: base alternate %s => %s (%S => %S)", - cref(feature,lookuptags,lookupname), - gref(descriptions,unicode), - replacement and gref(descriptions,replacement), - value, - comment) -end - -local function report_substitution(feature,lookuptags,lookupname,descriptions,unicode,substitution) - report_prepare("%s: base substitution %s => %S", - cref(feature,lookuptags,lookupname), - gref(descriptions,unicode), - gref(descriptions,substitution)) -end - -local function report_ligature(feature,lookuptags,lookupname,descriptions,unicode,ligature) - report_prepare("%s: base ligature %s => %S", - cref(feature,lookuptags,lookupname), - gref(descriptions,ligature), - gref(descriptions,unicode)) -end - -local function report_kern(feature,lookuptags,lookupname,descriptions,unicode,otherunicode,value) - report_prepare("%s: base kern %s + %s => %S", - cref(feature,lookuptags,lookupname), - gref(descriptions,unicode), - gref(descriptions,otherunicode), - value) -end - -local basemethods = { } -local basemethod = "<unset>" - -local function applybasemethod(what,...) - local m = basemethods[basemethod][what] - if m then - return m(...) - end -end - --- We need to make sure that luatex sees the difference between --- base fonts that have different glyphs in the same slots in fonts --- that have the same fullname (or filename). LuaTeX will merge fonts --- eventually (and subset later on). If needed we can use a more --- verbose name as long as we don't use <()<>[]{}/%> and the length --- is < 128. - -local basehash, basehashes, applied = { }, 1, { } - -local function registerbasehash(tfmdata) - local properties = tfmdata.properties - local hash = concat(applied," ") - local base = basehash[hash] - if not base then - basehashes = basehashes + 1 - base = basehashes - basehash[hash] = base - end - properties.basehash = base - properties.fullname = properties.fullname .. "-" .. base - -- report_prepare("fullname base hash '%a, featureset %a",tfmdata.properties.fullname,hash) - applied = { } -end - -local function registerbasefeature(feature,value) - applied[#applied+1] = feature .. "=" .. tostring(value) -end - --- The original basemode ligature builder used the names of components --- and did some expression juggling to get the chain right. The current --- variant starts with unicodes but still uses names to make the chain. --- This is needed because we have to create intermediates when needed --- but use predefined snippets when available. To some extend the --- current builder is more stupid but I don't worry that much about it --- as ligatures are rather predicatable. --- --- Personally I think that an ff + i == ffi rule as used in for instance --- latin modern is pretty weird as no sane person will key that in and --- expect a glyph for that ligature plus the following character. Anyhow, --- as we need to deal with this, we do, but no guarantes are given. --- --- latin modern dejavu --- --- f+f 102 102 102 102 --- f+i 102 105 102 105 --- f+l 102 108 102 108 --- f+f+i 102 102 105 --- f+f+l 102 102 108 102 102 108 --- ff+i 64256 105 64256 105 --- ff+l 64256 108 --- --- As you can see here, latin modern is less complete than dejavu but --- in practice one will not notice it. --- --- The while loop is needed because we need to resolve for instance --- pseudo names like hyphen_hyphen to endash so in practice we end --- up with a bit too many definitions but the overhead is neglectable. --- --- We can have changed[first] or changed[second] but it quickly becomes --- messy if we need to take that into account. - -local trace = false - -local function finalize_ligatures(tfmdata,ligatures) - local nofligatures = #ligatures - if nofligatures > 0 then - local characters = tfmdata.characters - local descriptions = tfmdata.descriptions - local resources = tfmdata.resources - local unicodes = resources.unicodes -- we use rawget in order to avoid bulding the table - local private = resources.private - local alldone = false - while not alldone do - local done = 0 - for i=1,nofligatures do - local ligature = ligatures[i] - if ligature then - local unicode, lookupdata = ligature[1], ligature[2] - if trace_ligatures_detail then - report_prepare("building % a into %a",lookupdata,unicode) - end - local size = #lookupdata - local firstcode = lookupdata[1] -- [2] - local firstdata = characters[firstcode] - local okay = false - if firstdata then - local firstname = "ctx_" .. firstcode - for i=1,size-1 do -- for i=2,size-1 do - local firstdata = characters[firstcode] - if not firstdata then - firstcode = private - if trace_ligatures_detail then - report_prepare("defining %a as %a",firstname,firstcode) - end - unicodes[firstname] = firstcode - firstdata = { intermediate = true, ligatures = { } } - characters[firstcode] = firstdata - descriptions[firstcode] = { name = firstname } - private = private + 1 - end - local target - local secondcode = lookupdata[i+1] - local secondname = firstname .. "_" .. secondcode - if i == size - 1 then - target = unicode - if not rawget(unicodes,secondname) then - unicodes[secondname] = unicode -- map final ligature onto intermediates - end - okay = true - else - target = rawget(unicodes,secondname) - if not target then - break - end - end - if trace_ligatures_detail then - report_prepare("codes (%a,%a) + (%a,%a) -> %a",firstname,firstcode,secondname,secondcode,target) - end - local firstligs = firstdata.ligatures - if firstligs then - firstligs[secondcode] = { char = target } - else - firstdata.ligatures = { [secondcode] = { char = target } } - end - firstcode = target - firstname = secondname - end - elseif trace_ligatures_detail then - report_prepare("no glyph (%a,%a) for building %a",firstname,firstcode,target) - end - if okay then - ligatures[i] = false - done = done + 1 - end - end - end - alldone = done == 0 - end - if trace_ligatures_detail then - for k, v in table.sortedhash(characters) do - if v.ligatures then - table.print(v,k) - end - end - end - resources.private = private - return true - end -end - -local function preparesubstitutions(tfmdata,feature,value,validlookups,lookuplist) - local characters = tfmdata.characters - local descriptions = tfmdata.descriptions - local resources = tfmdata.resources - local properties = tfmdata.properties - local changed = tfmdata.changed - local lookuphash = resources.lookuphash - local lookuptypes = resources.lookuptypes - local lookuptags = resources.lookuptags - - local ligatures = { } - local alternate = tonumber(value) or true and 1 - local defaultalt = otf.defaultbasealternate - - local trace_singles = trace_baseinit and trace_singles - local trace_alternatives = trace_baseinit and trace_alternatives - local trace_ligatures = trace_baseinit and trace_ligatures - - local actions = { - substitution = function(lookupdata,lookuptags,lookupname,description,unicode) - if trace_singles then - report_substitution(feature,lookuptags,lookupname,descriptions,unicode,lookupdata) - end - changed[unicode] = lookupdata - end, - alternate = function(lookupdata,lookuptags,lookupname,description,unicode) - local replacement = lookupdata[alternate] - if replacement then - changed[unicode] = replacement - if trace_alternatives then - report_alternate(feature,lookuptags,lookupname,descriptions,unicode,replacement,value,"normal") - end - elseif defaultalt == "first" then - replacement = lookupdata[1] - changed[unicode] = replacement - if trace_alternatives then - report_alternate(feature,lookuptags,lookupname,descriptions,unicode,replacement,value,defaultalt) - end - elseif defaultalt == "last" then - replacement = lookupdata[#data] - if trace_alternatives then - report_alternate(feature,lookuptags,lookupname,descriptions,unicode,replacement,value,defaultalt) - end - else - if trace_alternatives then - report_alternate(feature,lookuptags,lookupname,descriptions,unicode,replacement,value,"unknown") - end - end - end, - ligature = function(lookupdata,lookuptags,lookupname,description,unicode) - if trace_ligatures then - report_ligature(feature,lookuptags,lookupname,descriptions,unicode,lookupdata) - end - ligatures[#ligatures+1] = { unicode, lookupdata } - end, - } - - for unicode, character in next, characters do - local description = descriptions[unicode] - local lookups = description.slookups - if lookups then - for l=1,#lookuplist do - local lookupname = lookuplist[l] - local lookupdata = lookups[lookupname] - if lookupdata then - local lookuptype = lookuptypes[lookupname] - local action = actions[lookuptype] - if action then - action(lookupdata,lookuptags,lookupname,description,unicode) - end - end - end - end - local lookups = description.mlookups - if lookups then - for l=1,#lookuplist do - local lookupname = lookuplist[l] - local lookuplist = lookups[lookupname] - if lookuplist then - local lookuptype = lookuptypes[lookupname] - local action = actions[lookuptype] - if action then - for i=1,#lookuplist do - action(lookuplist[i],lookuptags,lookupname,description,unicode) - end - end - end - end - end - end - properties.hasligatures = finalize_ligatures(tfmdata,ligatures) -end - -local function preparepositionings(tfmdata,feature,value,validlookups,lookuplist) -- todo what kind of kerns, currently all - local characters = tfmdata.characters - local descriptions = tfmdata.descriptions - local resources = tfmdata.resources - local properties = tfmdata.properties - local lookuptags = resources.lookuptags - local sharedkerns = { } - local traceindeed = trace_baseinit and trace_kerns - local haskerns = false - for unicode, character in next, characters do - local description = descriptions[unicode] - local rawkerns = description.kerns -- shared - if rawkerns then - local s = sharedkerns[rawkerns] - if s == false then - -- skip - elseif s then - character.kerns = s - else - local newkerns = character.kerns - local done = false - for l=1,#lookuplist do - local lookup = lookuplist[l] - local kerns = rawkerns[lookup] - if kerns then - for otherunicode, value in next, kerns do - if value == 0 then - -- maybe no 0 test here - elseif not newkerns then - newkerns = { [otherunicode] = value } - done = true - if traceindeed then - report_kern(feature,lookuptags,lookup,descriptions,unicode,otherunicode,value) - end - elseif not newkerns[otherunicode] then -- first wins - newkerns[otherunicode] = value - done = true - if traceindeed then - report_kern(feature,lookuptags,lookup,descriptions,unicode,otherunicode,value) - end - end - end - end - end - if done then - sharedkerns[rawkerns] = newkerns - character.kerns = newkerns -- no empty assignments - haskerns = true - else - sharedkerns[rawkerns] = false - end - end - end - end - properties.haskerns = haskerns -end - -basemethods.independent = { - preparesubstitutions = preparesubstitutions, - preparepositionings = preparepositionings, -} - -local function makefake(tfmdata,name,present) - local resources = tfmdata.resources - local private = resources.private - local character = { intermediate = true, ligatures = { } } - resources.unicodes[name] = private - tfmdata.characters[private] = character - tfmdata.descriptions[private] = { name = name } - resources.private = private + 1 - present[name] = private - return character -end - -local function make_1(present,tree,name) - for k, v in next, tree do - if k == "ligature" then - present[name] = v - else - make_1(present,v,name .. "_" .. k) - end - end -end - -local function make_2(present,tfmdata,characters,tree,name,preceding,unicode,done,lookuptags,lookupname) - for k, v in next, tree do - if k == "ligature" then - local character = characters[preceding] - if not character then - if trace_baseinit then - report_prepare("weird ligature in lookup %a, current %C, preceding %C",lookuptags[lookupname],v,preceding) - end - character = makefake(tfmdata,name,present) - end - local ligatures = character.ligatures - if ligatures then - ligatures[unicode] = { char = v } - else - character.ligatures = { [unicode] = { char = v } } - end - if done then - local d = done[lookupname] - if not d then - done[lookupname] = { "dummy", v } - else - d[#d+1] = v - end - end - else - local code = present[name] or unicode - local name = name .. "_" .. k - make_2(present,tfmdata,characters,v,name,code,k,done,lookuptags,lookupname) - end - end -end - -local function preparesubstitutions(tfmdata,feature,value,validlookups,lookuplist) - local characters = tfmdata.characters - local descriptions = tfmdata.descriptions - local resources = tfmdata.resources - local changed = tfmdata.changed - local lookuphash = resources.lookuphash - local lookuptypes = resources.lookuptypes - local lookuptags = resources.lookuptags - - local ligatures = { } - local alternate = tonumber(value) or true and 1 - local defaultalt = otf.defaultbasealternate - - local trace_singles = trace_baseinit and trace_singles - local trace_alternatives = trace_baseinit and trace_alternatives - local trace_ligatures = trace_baseinit and trace_ligatures - - for l=1,#lookuplist do - local lookupname = lookuplist[l] - local lookupdata = lookuphash[lookupname] - local lookuptype = lookuptypes[lookupname] - for unicode, data in next, lookupdata do - if lookuptype == "substitution" then - if trace_singles then - report_substitution(feature,lookuptags,lookupname,descriptions,unicode,data) - end - changed[unicode] = data - elseif lookuptype == "alternate" then - local replacement = data[alternate] - if replacement then - changed[unicode] = replacement - if trace_alternatives then - report_alternate(feature,lookuptags,lookupname,descriptions,unicode,replacement,value,"normal") - end - elseif defaultalt == "first" then - replacement = data[1] - changed[unicode] = replacement - if trace_alternatives then - report_alternate(feature,lookuptags,lookupname,descriptions,unicode,replacement,value,defaultalt) - end - elseif defaultalt == "last" then - replacement = data[#data] - if trace_alternatives then - report_alternate(feature,lookuptags,lookupname,descriptions,unicode,replacement,value,defaultalt) - end - else - if trace_alternatives then - report_alternate(feature,lookuptags,lookupname,descriptions,unicode,replacement,value,"unknown") - end - end - elseif lookuptype == "ligature" then - ligatures[#ligatures+1] = { unicode, data, lookupname } - if trace_ligatures then - report_ligature(feature,lookuptags,lookupname,descriptions,unicode,data) - end - end - end - end - - local nofligatures = #ligatures - - if nofligatures > 0 then - - local characters = tfmdata.characters - local present = { } - local done = trace_baseinit and trace_ligatures and { } - - for i=1,nofligatures do - local ligature = ligatures[i] - local unicode, tree = ligature[1], ligature[2] - make_1(present,tree,"ctx_"..unicode) - end - - for i=1,nofligatures do - local ligature = ligatures[i] - local unicode, tree, lookupname = ligature[1], ligature[2], ligature[3] - make_2(present,tfmdata,characters,tree,"ctx_"..unicode,unicode,unicode,done,lookuptags,lookupname) - end - - end - -end - -local function preparepositionings(tfmdata,feature,value,validlookups,lookuplist) - local characters = tfmdata.characters - local descriptions = tfmdata.descriptions - local resources = tfmdata.resources - local properties = tfmdata.properties - local lookuphash = resources.lookuphash - local lookuptags = resources.lookuptags - local traceindeed = trace_baseinit and trace_kerns - -- check out this sharedkerns trickery - for l=1,#lookuplist do - local lookupname = lookuplist[l] - local lookupdata = lookuphash[lookupname] - for unicode, data in next, lookupdata do - local character = characters[unicode] - local kerns = character.kerns - if not kerns then - kerns = { } - character.kerns = kerns - end - if traceindeed then - for otherunicode, kern in next, data do - if not kerns[otherunicode] and kern ~= 0 then - kerns[otherunicode] = kern - report_kern(feature,lookuptags,lookup,descriptions,unicode,otherunicode,kern) - end - end - else - for otherunicode, kern in next, data do - if not kerns[otherunicode] and kern ~= 0 then - kerns[otherunicode] = kern - end - end - end - end - end - -end - -local function initializehashes(tfmdata) - nodeinitializers.features(tfmdata) -end - -basemethods.shared = { - initializehashes = initializehashes, - preparesubstitutions = preparesubstitutions, - preparepositionings = preparepositionings, -} - -basemethod = "independent" - -local function featuresinitializer(tfmdata,value) - if true then -- value then - local starttime = trace_preparing and os.clock() - local features = tfmdata.shared.features - local fullname = tfmdata.properties.fullname or "?" - if features then - applybasemethod("initializehashes",tfmdata) - local collectlookups = otf.collectlookups - local rawdata = tfmdata.shared.rawdata - local properties = tfmdata.properties - local script = properties.script -- or "dflt" -- can be nil - local language = properties.language -- or "dflt" -- can be nil - local basesubstitutions = rawdata.resources.features.gsub - local basepositionings = rawdata.resources.features.gpos - -- - -- if basesubstitutions then - -- for feature, data in next, basesubstitutions do - -- local value = features[feature] - -- if value then - -- local validlookups, lookuplist = collectlookups(rawdata,feature,script,language) - -- if validlookups then - -- applybasemethod("preparesubstitutions",tfmdata,feature,value,validlookups,lookuplist) - -- registerbasefeature(feature,value) - -- end - -- end - -- end - -- end - -- if basepositionings then - -- for feature, data in next, basepositionings do - -- local value = features[feature] - -- if value then - -- local validlookups, lookuplist = collectlookups(rawdata,feature,script,language) - -- if validlookups then - -- applybasemethod("preparepositionings",tfmdata,feature,features[feature],validlookups,lookuplist) - -- registerbasefeature(feature,value) - -- end - -- end - -- end - -- end - -- - if basesubstitutions or basepositionings then - local sequences = tfmdata.resources.sequences - for s=1,#sequences do - local sequence = sequences[s] - local sfeatures = sequence.features - if sfeatures then - local order = sequence.order - if order then - for i=1,#order do -- - local feature = order[i] - local value = features[feature] - if value then - local validlookups, lookuplist = collectlookups(rawdata,feature,script,language) - if not validlookups then - -- skip - elseif basesubstitutions and basesubstitutions[feature] then - if trace_preparing then - report_prepare("filtering base %s feature %a for %a with value %a","sub",feature,fullname,value) - end - applybasemethod("preparesubstitutions",tfmdata,feature,value,validlookups,lookuplist) - registerbasefeature(feature,value) - elseif basepositionings and basepositionings[feature] then - if trace_preparing then - report_prepare("filtering base %a feature %a for %a with value %a","pos",feature,fullname,value) - end - applybasemethod("preparepositionings",tfmdata,feature,value,validlookups,lookuplist) - registerbasefeature(feature,value) - end - end - end - end - end - end - end - -- - registerbasehash(tfmdata) - end - if trace_preparing then - report_prepare("preparation time is %0.3f seconds for %a",os.clock()-starttime,fullname) - end - end -end - -registerotffeature { - name = "features", - description = "features", - default = true, - initializers = { - -- position = 1, -- after setscript (temp hack ... we need to force script / language to 1 - base = featuresinitializer, - } -} - --- independent : collect lookups independently (takes more runtime ... neglectable) --- shared : shares lookups with node mode (takes more memory unless also a node mode variant is used ... noticeable) - -directives.register("fonts.otf.loader.basemethod", function(v) - if basemethods[v] then - basemethod = v - end -end) diff --git a/tex/context/base/mkiv/font-otc.lua b/tex/context/base/mkiv/font-otc.lua index 5d879ec1d..2bad62d60 100644 --- a/tex/context/base/mkiv/font-otc.lua +++ b/tex/context/base/mkiv/font-otc.lua @@ -1,6 +1,6 @@ if not modules then modules = { } end modules ['font-otc'] = { version = 1.001, - comment = "companion to font-otf.lua (context)", + comment = "companion to font-ini.mkiv", author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", copyright = "PRAGMA ADE / ConTeXt Development Team", license = "see context related readme files" @@ -10,6 +10,8 @@ local format, insert, sortedkeys, tohash = string.format, table.insert, table.so local type, next = type, next local lpegmatch = lpeg.match local utfbyte, utflen, utfsplit = utf.byte, utf.len, utf.split +local match = string.match +local sortedhash = table.sortedhash -- we assume that the other otf stuff is loaded already @@ -21,6 +23,10 @@ local otf = fonts.handlers.otf local registerotffeature = otf.features.register local setmetatableindex = table.setmetatableindex +local checkmerge = fonts.helpers.checkmerge +local checkflags = fonts.helpers.checkflags +local checksteps = fonts.helpers.checksteps + local normalized = { substitution = "substitution", single = "substitution", @@ -29,6 +35,7 @@ local normalized = { multiple = "multiple", kern = "kern", pair = "pair", + single = "single", chainsubstitution = "chainsubstitution", chainposition = "chainposition", } @@ -40,6 +47,7 @@ local types = { multiple = "gsub_multiple", kern = "gpos_pair", pair = "gpos_pair", + single = "gpos_single", chainsubstitution = "gsub_contextchain", chainposition = "gpos_contextchain", } @@ -403,16 +411,16 @@ local function addfeature(data,feature,specifications) return coverage end + local prepare_single = prepare_pair -- we could have a better test on the spec + local function prepare_chain(list,featuretype,sublookups) -- todo: coveractions local rules = list.rules local coverage = { } if rules then - local rulehash = { } - local rulesize = 0 - local sequence = { } - local nofsequences = 0 - local lookuptype = types[featuretype] + local rulehash = { } + local rulesize = 0 + local lookuptype = types[featuretype] for nofrules=1,#rules do local rule = rules[nofrules] local current = rule.current @@ -442,7 +450,7 @@ local function addfeature(data,feature,specifications) local lookups = rule.lookups or false local subtype = nil if lookups and sublookups then - for k, v in next, lookups do + for k, v in sortedhash(lookups) do local t = type(v) if t == "table" then -- already ok @@ -460,10 +468,10 @@ local function addfeature(data,feature,specifications) subtype = lookup.type end else - lookups[k] = false -- new + lookups[k] = false -- { false } -- new end else - lookups[k] = false -- new + lookups[k] = false -- { false } -- new end end end @@ -494,14 +502,17 @@ local function addfeature(data,feature,specifications) replacements, -- 7 subtype, -- 8 } - for unic in next, sequence[start] do +-- for unic in next, sequence[start] do + for unic in sortedhash(sequence[start]) do local cu = coverage[unic] if not cu then coverage[unic] = rulehash -- can now be done cleaner i think end end + sequence.n = nofsequences end end + rulehash.n = rulesize end return coverage end @@ -542,9 +553,9 @@ local function addfeature(data,feature,specifications) local s = sequences[i] local f = s.features if f then - for k in next, f do + for k in sortedhash(f) do -- next, f do if k == position then - index = i + index = i break end end @@ -600,6 +611,9 @@ local function addfeature(data,feature,specifications) local steps = { } local sublookups = specification.lookups local category = nil + -- + checkflags(specification,resources) + -- if sublookups then local s = { } for i=1,#sublookups do @@ -621,18 +635,25 @@ local function addfeature(data,feature,specifications) coverage = prepare_alternate(list,featuretype,nocheck) elseif featuretype == "multiple" then coverage = prepare_multiple(list,featuretype,nocheck) - elseif featuretype == "kern" then - format = "kern" + elseif featuretype == "kern" or featuretype == "move" then + format = featuretype coverage = prepare_kern(list,featuretype) elseif featuretype == "pair" then format = "pair" coverage = prepare_pair(list,featuretype) + elseif featuretype == "single" then + format = "single" + coverage = prepare_single(list,featuretype) end if coverage and next(coverage) then nofsteps = nofsteps + 1 steps[nofsteps] = register(coverage,featuretype,format,feature,nofsteps,descriptions,resources) end end + -- + checkmerge(specification) + checksteps(specification) + -- s[i] = { [stepkey] = steps, nofsteps = nofsteps, @@ -658,14 +679,18 @@ local function addfeature(data,feature,specifications) elseif featuretype == "multiple" then category = "gsub" coverage = prepare_multiple(list,featuretype,nocheck) - elseif featuretype == "kern" then + elseif featuretype == "kern" or featuretype == "move" then category = "gpos" - format = "kern" + format = featuretype coverage = prepare_kern(list,featuretype) elseif featuretype == "pair" then category = "gpos" format = "pair" coverage = prepare_pair(list,featuretype) + elseif featuretype == "single" then + category = "gpos" + format = "single" + coverage = prepare_single(list,featuretype) elseif featuretype == "chainsubstitution" then category = "gsub" coverage = prepare_chain(list,featuretype,sublookups) @@ -688,6 +713,7 @@ local function addfeature(data,feature,specifications) askedfeatures[k] = tohash(v) end end + -- if featureflags[1] then featureflags[1] = "mark" end if featureflags[2] then featureflags[2] = "ligature" end if featureflags[3] then featureflags[3] = "base" end @@ -702,6 +728,10 @@ local function addfeature(data,feature,specifications) nofsteps = nofsteps, type = steptype, } + -- + checkflags(sequence,resources) + checkmerge(sequence) + checksteps(sequence) -- position | prepend | append local first, last = getrange(sequences,category) inject(specification,sequences,sequence,first,last,category,feature) @@ -1004,7 +1034,8 @@ registerotffeature { local lookups = { } local protect = { } local revert = { } -local zwj = { 0x200C } +local zwjchar = 0x200C +local zwj = { zwjchar } otf.addfeature { name = "blockligatures", @@ -1048,31 +1079,59 @@ registerotffeature { local settings_to_array = utilities.parsers and utilities.parsers.settings_to_array or function(s) return string.split(s,",") end -- for generic +local splitter = lpeg.splitat(":") + local function blockligatures(str) local t = settings_to_array(str) for i=1,#t do - local ti = utfsplit(t[i]) - if #ti > 1 then - local one = ti[1] - local two = ti[2] - lookups[one] = { one, 0x200C } + local ti = t[i] + local before, current, after = lpegmatch(splitter,ti) + if current and after then -- before is returned when no match + -- experimental joke + if before then + before = utfsplit(before) + for i=1,#before do + before[i] = { before[i] } + end + end + if current then + current = utfsplit(current) + end + if after then + after = utfsplit(after) + for i=1,#after do + after[i] = { after[i] } + end + end + else + before = nil + current = utfsplit(ti) + after = nil + end + if #current > 1 then + local one = current[1] + local two = current[2] + lookups[one] = { one, zwjchar } local one = { one } local two = { two } local new = #protect + 1 protect[new] = { + before = before, current = { one, two }, + after = after, lookups = { 1 }, -- not shared ! } revert[new] = { + -- before = before, current = { one, zwj }, + -- after = { two, unpack(after) }, after = { two }, lookups = { 1 }, -- not shared ! } end end - end -- blockligatures("\0\0") @@ -1081,6 +1140,7 @@ otf.helpers.blockligatures = blockligatures -- blockligatures("fi,ff") -- blockligatures("fl") +-- blockligatures("u:fl:age") if context then diff --git a/tex/context/base/mkiv/font-otd.lua b/tex/context/base/mkiv/font-otd.lua index 64cb1bcb4..2633c6cae 100644 --- a/tex/context/base/mkiv/font-otd.lua +++ b/tex/context/base/mkiv/font-otd.lua @@ -142,6 +142,7 @@ local function initialize(sequence,script,language,s_enabled,a_enabled,font,attr local order = sequence.order if order then local featuretype = featuretypes[sequence.type or "unknown"] + local lookupdone = false for i=1,#order do -- local kind = order[i] -- local e_e @@ -152,16 +153,14 @@ local function initialize(sequence,script,language,s_enabled,a_enabled,font,attr e_e = s_enabled and s_enabled[kind] -- the value (font) end if e_e then + local usedattribute, usedscript, usedlanguage, usedlookup local valid = type(e_e) == "string" and lpegmatch(pattern,e_e) if valid then -- we have hit always - local attribute = autofeatures[kind] or false - if trace_applied then - report_process( - "font %s, dynamic %a (%a), feature %a, script %a, language %a, lookup %a, value %a", - font,attr or 0,dynamic,kind,"*","*",sequence.name,valid) - end - ra[#ra+1] = { valid, attribute, sequence, kind } + usedattribute = autofeatures[kind] or false + usedlanguage = "*" + usedscript = "*" + usedlookup = { valid, usedattribute, sequence, kind } else -- we already checked for e_e local scripts = features[kind] -- @@ -170,7 +169,7 @@ local function initialize(sequence,script,language,s_enabled,a_enabled,font,attr langages = defaultscript(featuretype,autoscript,scripts) end if languages then - -- we need detailed control over default becase we want to trace + -- we need detailed control over default because we want to trace -- only first attribute match check, so we assume simple fina's -- local valid = false if languages[language] then @@ -182,14 +181,30 @@ local function initialize(sequence,script,language,s_enabled,a_enabled,font,attr end end if valid then - local attribute = autofeatures[kind] or false - if trace_applied then - report_process( - "font %s, dynamic %a (%a), feature %a, script %a, language %a, lookup %a, value %a", - font,attr or 0,dynamic,kind,script,language,sequence.name,valid) - end - ra[#ra+1] = { valid, attribute, sequence, kind } + usedattribute = autofeatures[kind] or false + usedlanguage = script + usedscript = language + usedlookup = { valid, usedattribute, sequence, kind } + end + end + if not usedlookup then + -- go on + elseif lookupdone then + if trace_applied then + report_process( + "font %s, dynamic %a (%a), feature %a, script %a, language %a, lookup %a, value %a, nofsteps %a, lookup already set by %a", + font,attr or 0,dynamic,kind,usedscript,usedlanguage,sequence.name,valid,sequence.nofsteps,ra[#ra][4]) + end + else + ra[#ra+1] = usedlookup + if trace_applied then + report_process( + "font %s, dynamic %a (%a), feature %a, script %a, language %a, lookup %a, value %a, nofsteps %a", + font,attr or 0,dynamic,kind,usedscript,usedlanguage,sequence.name,valid,sequence.nofsteps) + else + return -- no need to look further end + lookupdone = true end end end @@ -253,7 +268,7 @@ function otf.dataset(tfmdata,font,attr) -- attr only when explicit (as in specia -- indexed but we can also add specific data by key in: } rl[attr] = ra - local sequences = tfmdata.resources.sequences + local sequences = tfmdata.shared.reorderedsequences or tfmdata.resources.sequences if sequences then local autoscript = (s_enabled and s_enabled.autoscript ) or (a_enabled and a_enabled.autoscript ) local autolanguage = (s_enabled and s_enabled.autolanguage) or (a_enabled and a_enabled.autolanguage) diff --git a/tex/context/base/mkiv/font-otf.lua b/tex/context/base/mkiv/font-otf.lua deleted file mode 100644 index 1db80272e..000000000 --- a/tex/context/base/mkiv/font-otf.lua +++ /dev/null @@ -1,2968 +0,0 @@ -if not modules then modules = { } end modules ['font-otf'] = { - version = 1.001, - comment = "companion to font-ini.mkiv", - author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", - copyright = "PRAGMA ADE / ConTeXt Development Team", - license = "see context related readme files" -} - --- langs -> languages enz --- anchor_classes vs kernclasses --- modification/creationtime in subfont is runtime dus zinloos --- to_table -> totable --- ascent descent - --- to be checked: combinations like: --- --- current="ABCD" with [A]=nothing, [BC]=ligature, [D]=single (applied to result of BC so funny index) --- --- unlikely but possible - --- more checking against low level calls of functions - -local gmatch, gsub, find, match, lower, strip = string.gmatch, string.gsub, string.find, string.match, string.lower, string.strip -local type, next, tonumber, tostring = type, next, tonumber, tostring -local abs = math.abs -local reversed, concat, insert, remove, sortedkeys = table.reversed, table.concat, table.insert, table.remove, table.sortedkeys -local fastcopy, tohash, derivetable, copy = table.fastcopy, table.tohash, table.derive, table.copy -local formatters = string.formatters -local P, R, S, C, Ct, lpegmatch = lpeg.P, lpeg.R, lpeg.S, lpeg.C, lpeg.Ct, lpeg.match - -local setmetatableindex = table.setmetatableindex -local allocate = utilities.storage.allocate -local registertracker = trackers.register -local registerdirective = directives.register -local starttiming = statistics.starttiming -local stoptiming = statistics.stoptiming -local elapsedtime = statistics.elapsedtime -local findbinfile = resolvers.findbinfile - -local trace_private = false registertracker("otf.private", function(v) trace_private = v end) -local trace_subfonts = false registertracker("otf.subfonts", function(v) trace_subfonts = v end) -local trace_loading = false registertracker("otf.loading", function(v) trace_loading = v end) -local trace_features = false registertracker("otf.features", function(v) trace_features = v end) -local trace_dynamics = false registertracker("otf.dynamics", function(v) trace_dynamics = v end) -local trace_sequences = false registertracker("otf.sequences", function(v) trace_sequences = v end) -local trace_markwidth = false registertracker("otf.markwidth", function(v) trace_markwidth = v end) -local trace_defining = false registertracker("fonts.defining", function(v) trace_defining = v end) - -local compact_lookups = true registertracker("otf.compactlookups", function(v) compact_lookups = v end) -local purge_names = true registertracker("otf.purgenames", function(v) purge_names = v end) - -local report_otf = logs.reporter("fonts","otf loading") - -local fonts = fonts -local otf = fonts.handlers.otf - -otf.glists = { "gsub", "gpos" } - -otf.version = 2.826 -- beware: also sync font-mis.lua and in mtx-fonts -otf.cache = containers.define("fonts", "otf", otf.version, true) - -local hashes = fonts.hashes -local definers = fonts.definers -local readers = fonts.readers -local constructors = fonts.constructors - -local fontdata = hashes and hashes.identifiers -local chardata = characters and characters.data -- not used - -local otffeatures = constructors.features.otf -local registerotffeature = otffeatures.register - -local otfenhancers = constructors.enhancers.otf -local registerotfenhancer = otfenhancers.register - -local forceload = false -local cleanup = 0 -- mk: 0=885M 1=765M 2=735M (regular run 730M) -local packdata = true -local syncspace = true -local forcenotdef = false -local includesubfonts = false -local overloadkerns = false -- experiment - -local applyruntimefixes = fonts.treatments and fonts.treatments.applyfixes - -local wildcard = "*" -local default = "dflt" - -local fontloader = fontloader -local open_font = fontloader.open -local close_font = fontloader.close -local font_fields = fontloader.fields -local apply_featurefile = fontloader.apply_featurefile - -local mainfields = nil -local glyphfields = nil -- not used yet - -local formats = fonts.formats - -formats.otf = "opentype" -formats.ttf = "truetype" -formats.ttc = "truetype" -formats.dfont = "truetype" - -registerdirective("fonts.otf.loader.cleanup", function(v) cleanup = tonumber(v) or (v and 1) or 0 end) -registerdirective("fonts.otf.loader.force", function(v) forceload = v end) -registerdirective("fonts.otf.loader.pack", function(v) packdata = v end) -registerdirective("fonts.otf.loader.syncspace", function(v) syncspace = v end) -registerdirective("fonts.otf.loader.forcenotdef", function(v) forcenotdef = v end) -registerdirective("fonts.otf.loader.overloadkerns", function(v) overloadkerns = v end) ------------------("fonts.otf.loader.alldimensions", function(v) alldimensions = v end) - -function otf.fileformat(filename) - local leader = lower(io.loadchunk(filename,4)) - local suffix = lower(file.suffix(filename)) - if leader == "otto" then - return formats.otf, suffix == "otf" - elseif leader == "ttcf" then - return formats.ttc, suffix == "ttc" - -- elseif leader == "true" then - -- return formats.ttf, suffix == "ttf" - elseif suffix == "ttc" then - return formats.ttc, true - elseif suffix == "dfont" then - return formats.dfont, true - else - return formats.ttf, suffix == "ttf" - end -end - --- local function otf_format(filename) --- -- return formats[lower(file.suffix(filename))] --- end - -local function otf_format(filename) - local format, okay = otf.fileformat(filename) - if not okay then - report_otf("font %a is actually an %a file",filename,format) - end - return format -end - -local function load_featurefile(raw,featurefile) - if featurefile and featurefile ~= "" then - if trace_loading then - report_otf("using featurefile %a", featurefile) - end - apply_featurefile(raw, featurefile) - end -end - -local function showfeatureorder(rawdata,filename) - local sequences = rawdata.resources.sequences - if sequences and #sequences > 0 then - if trace_loading then - report_otf("font %a has %s sequences",filename,#sequences) - report_otf(" ") - end - for nos=1,#sequences do - local sequence = sequences[nos] - local typ = sequence.type or "no-type" - local name = sequence.name or "no-name" - local subtables = sequence.subtables or { "no-subtables" } - local features = sequence.features - if trace_loading then - report_otf("%3i %-15s %-20s [% t]",nos,name,typ,subtables) - end - if features then - for feature, scripts in next, features do - local tt = { } - if type(scripts) == "table" then - for script, languages in next, scripts do - local ttt = { } - for language, _ in next, languages do - ttt[#ttt+1] = language - end - tt[#tt+1] = formatters["[%s: % t]"](script,ttt) - end - if trace_loading then - report_otf(" %s: % t",feature,tt) - end - else - if trace_loading then - report_otf(" %s: %S",feature,scripts) - end - end - end - end - end - if trace_loading then - report_otf("\n") - end - elseif trace_loading then - report_otf("font %a has no sequences",filename) - end -end - ---[[ldx-- -<p>We start with a lot of tables and related functions.</p> ---ldx]]-- - -local valid_fields = table.tohash { - -- "anchor_classes", - "ascent", - -- "cache_version", - "cidinfo", - "copyright", - -- "creationtime", - "descent", - "design_range_bottom", - "design_range_top", - "design_size", - "encodingchanged", - "extrema_bound", - "familyname", - "fontname", - "fontstyle_id", - "fontstyle_name", - "fullname", - -- "glyphs", - "hasvmetrics", - -- "head_optimized_for_cleartype", - "horiz_base", - "issans", - "isserif", - "italicangle", - -- "kerns", - -- "lookups", - "macstyle", - -- "modificationtime", - "notdef_loc", - "onlybitmaps", - "origname", - "os2_version", - "pfminfo", - -- "private", - "serifcheck", - "sfd_version", - -- "size", - "strokedfont", - "strokewidth", - -- "subfonts", - "table_version", - -- "tables", - -- "ttf_tab_saved", - "ttf_tables", - "uni_interp", - "uniqueid", - "units_per_em", - "upos", - "use_typo_metrics", - "uwidth", - "validation_state", - "version", - "vert_base", - "weight", - "weight_width_slope_only", - -- "xuid", - -- "truetype", -- maybe as check -} - -local function adddimensions(data,filename) - -- todo: forget about the width if it's the defaultwidth (saves mem) - -- we could also build the marks hash here (instead of storing it) - if data then - local descriptions = data.descriptions - local resources = data.resources - local defaultwidth = resources.defaultwidth or 0 - local defaultheight = resources.defaultheight or 0 - local defaultdepth = resources.defaultdepth or 0 - local basename = trace_markwidth and file.basename(filename) - for _, d in next, descriptions do - local bb, wd = d.boundingbox, d.width - if not wd then - -- or bb? - d.width = defaultwidth - elseif trace_markwidth and wd ~= 0 and d.class == "mark" then - report_otf("mark %a with width %b found in %a",d.name or "<noname>",wd,basename) - -- d.width = -wd - end - if bb then - local ht = bb[4] - local dp = -bb[2] - -- if alldimensions then - -- if ht ~= 0 then - -- d.height = ht - -- end - -- if dp ~= 0 then - -- d.depth = dp - -- end - -- else - if ht == 0 or ht < 0 then - -- not set - else - d.height = ht - end - if dp == 0 or dp < 0 then - -- not set - else - d.depth = dp - end - -- end - end - end - end -end - -function otf.load(filename,sub,featurefile) -- second argument (format) is gone ! - local base = file.basename(file.removesuffix(filename)) - local name = file.removesuffix(base) - local attr = lfs.attributes(filename) - local size = attr and attr.size or 0 - local time = attr and attr.modification or 0 - if featurefile then - name = name .. "@" .. file.removesuffix(file.basename(featurefile)) - end - -- or: sub = tonumber(sub) - if sub == "" then - sub = false - end - local hash = name - if sub then - hash = hash .. "-" .. sub - end - hash = containers.cleanname(hash) - local featurefiles - if featurefile then - featurefiles = { } - for s in gmatch(featurefile,"[^,]+") do - local name = resolvers.findfile(file.addsuffix(s,'fea'),'fea') or "" - if name == "" then - report_otf("loading error, no featurefile %a",s) - else - local attr = lfs.attributes(name) - featurefiles[#featurefiles+1] = { - name = name, - size = attr and attr.size or 0, - time = attr and attr.modification or 0, - } - end - end - if #featurefiles == 0 then - featurefiles = nil - end - end - local data = containers.read(otf.cache,hash) - local reload = not data or data.size ~= size or data.time ~= time - if forceload then - report_otf("forced reload of %a due to hard coded flag",filename) - reload = true - end - if not reload then - local featuredata = data.featuredata - if featurefiles then - if not featuredata or #featuredata ~= #featurefiles then - reload = true - else - for i=1,#featurefiles do - local fi, fd = featurefiles[i], featuredata[i] - if fi.name ~= fd.name or fi.size ~= fd.size or fi.time ~= fd.time then - reload = true - break - end - end - end - elseif featuredata then - reload = true - end - if reload then - report_otf("loading: forced reload due to changed featurefile specification %a",featurefile) - end - end - if reload then - starttiming("fontloader") - report_otf("loading %a, hash %a",filename,hash) - local fontdata, messages - if sub then - fontdata, messages = open_font(filename,sub) - else - fontdata, messages = open_font(filename) - end - if fontdata then - mainfields = mainfields or (font_fields and font_fields(fontdata)) - end - if trace_loading and messages and #messages > 0 then - if type(messages) == "string" then - report_otf("warning: %s",messages) - else - for m=1,#messages do - report_otf("warning: %S",messages[m]) - end - end - else - report_otf("loading done") - end - if fontdata then - if featurefiles then - for i=1,#featurefiles do - load_featurefile(fontdata,featurefiles[i].name) - end - end - local unicodes = { - -- names to unicodes - } - local splitter = lpeg.splitter(" ",unicodes) - data = { - size = size, - time = time, - subfont = sub, - format = otf_format(filename), - featuredata = featurefiles, - resources = { - filename = resolvers.unresolve(filename), -- no shortcut - version = otf.version, - creator = "context mkiv", - unicodes = unicodes, - indices = { - -- index to unicodes - }, - duplicates = { - -- alternative unicodes - }, - variants = { - -- alternative unicodes (variants) - }, - lookuptypes = { - }, - }, - warnings = { - }, - metadata = { - -- raw metadata, not to be used - }, - properties = { - -- normalized metadata - }, - descriptions = { - }, - goodies = { - }, - helpers = { -- might go away - tounicodelist = splitter, - tounicodetable = Ct(splitter), - }, - } - report_otf("file size: %s", size) - otfenhancers.apply(data,filename,fontdata) - local packtime = { } - if packdata then - if cleanup > 0 then - collectgarbage("collect") - end - starttiming(packtime) - otf.packdata(data,filename,nil) -- implemented elsewhere - stoptiming(packtime) - end - report_otf("saving %a in cache",filename) - data = containers.write(otf.cache, hash, data) - if cleanup > 1 then - collectgarbage("collect") - end - stoptiming("fontloader") - if elapsedtime then - report_otf("loading, optimizing, packing and caching time %s, pack time %s", - elapsedtime("fontloader"),packdata and elapsedtime(packtime) or 0) - end - close_font(fontdata) -- free memory - if cleanup > 3 then - collectgarbage("collect") - end - data = containers.read(otf.cache, hash) -- this frees the old table and load the sparse one - if cleanup > 2 then - collectgarbage("collect") - end - else - stoptiming("fontloader") - data = nil - report_otf("loading failed due to read error") - end - end - if data then - if trace_defining then - report_otf("loading from cache using hash %a",hash) - end - otf.unpackdata(data,filename,nil,false) -- implemented elsewhere - -- - local resources = data.resources - local lookuptags = resources.lookuptags - local unicodes = resources.unicodes - if not lookuptags then - lookuptags = { } - resources.lookuptags = lookuptags - end - setmetatableindex(lookuptags,function(t,k) - local v = type(k) == "number" and ("lookup " .. k) or k - t[k] = v - return v - end) - if not unicodes then - unicodes = { } - resources.unicodes = unicodes - setmetatableindex(unicodes,function(t,k) - -- use rawget when no table has to be built - setmetatableindex(unicodes,nil) - for u, d in next, data.descriptions do - local n = d.name - if n then - t[n] = u - -- report_otf("accessing known name %a",k) - else - -- report_otf("accessing unknown name %a",k) - end - end - return rawget(t,k) - end) - end - constructors.addcoreunicodes(unicodes) -- do we really need this? - -- - if applyruntimefixes then - applyruntimefixes(filename,data) - end - adddimensions(data,filename,nil,false) - if trace_sequences then - showfeatureorder(data,filename) - end - end - return data -end - -local mt = { - __index = function(t,k) -- maybe set it - if k == "height" then - local ht = t.boundingbox[4] - return ht < 0 and 0 or ht - elseif k == "depth" then - local dp = -t.boundingbox[2] - return dp < 0 and 0 or dp - elseif k == "width" then - return 0 - elseif k == "name" then -- or maybe uni* - return forcenotdef and ".notdef" - end - end -} - -local function enhance_prepare_tables(data,filename,raw) - data.properties.hasitalics = false -end - -local function somecopy(old) -- fast one - if old then - local new = { } - if type(old) == "table" then - for k, v in next, old do - if k == "glyphs" then - -- skip - elseif type(v) == "table" then - new[k] = somecopy(v) - else - new[k] = v - end - end - else - for i=1,#mainfields do - local k = mainfields[i] - local v = old[k] - if k == "glyphs" then - -- skip - elseif type(v) == "table" then - new[k] = somecopy(v) - else - new[k] = v - end - end - end - return new - else - return { } - end -end - --- not setting hasitalics and class (when nil) during table construction can save some mem - -local function enhance_prepare_glyphs(data,filename,raw) - local rawglyphs = raw.glyphs - local rawsubfonts = raw.subfonts - local rawcidinfo = raw.cidinfo - local criterium = constructors.privateoffset - local private = criterium - local resources = data.resources - local metadata = data.metadata - local properties = data.properties - local descriptions = data.descriptions - local unicodes = resources.unicodes -- name to unicode - local indices = resources.indices -- index to unicode - local duplicates = resources.duplicates - local variants = resources.variants - local notdefindex = -1 - - if rawsubfonts then - - metadata.subfonts = includesubfonts and { } - properties.cidinfo = rawcidinfo - - if rawcidinfo.registry then - local cidmap = fonts.cid.getmap(rawcidinfo) - if cidmap then - rawcidinfo.usedname = cidmap.usedname - local nofnames = 0 - local nofunicodes = 0 - local cidunicodes = cidmap.unicodes - local cidnames = cidmap.names - local cidtotal = 0 - local unique = trace_subfonts and { } - for cidindex=1,#rawsubfonts do - local subfont = rawsubfonts[cidindex] - local cidglyphs = subfont.glyphs - if includesubfonts then - metadata.subfonts[cidindex] = somecopy(subfont) - end - local cidcnt = subfont.glyphcnt - local cidmin = subfont.glyphmin - local cidmax = subfont.glyphmax - local notdef = (tonumber(raw.table_version) or 0) > 0.4 and subfont.notdef_loc or -1 - if notdeffound == -1 and notdef >= 0 then - notdeffound = notdef - end - if trace_subfonts then - local cidtot = cidmax - cidmin + 1 - cidtotal = cidtotal + cidtot - report_otf("subfont: %i, min: %i, max: %i, cnt: %i, n: %i",cidindex,cidmin,cidmax,cidtot,cidcnt) - end - if cidcnt > 0 then - for index=cidmin,cidmax do - local glyph = cidglyphs[index] - if glyph then - if trace_subfonts then - unique[index] = true - end - local unicode = glyph.unicode - if unicode >= 0x00E000 and unicode <= 0x00F8FF then - unicode = -1 - elseif unicode >= 0x0F0000 and unicode <= 0x0FFFFD then - unicode = -1 - elseif unicode >= 0x100000 and unicode <= 0x10FFFD then - unicode = -1 - end - local name = glyph.name or cidnames[index] - if not unicode or unicode == -1 then -- or unicode >= criterium then - unicode = cidunicodes[index] - end - if unicode and descriptions[unicode] then - if trace_private then - report_otf("preventing glyph %a at index %H to overload unicode %U",name or "noname",index,unicode) - end - unicode = -1 - end - if not unicode or unicode == -1 then -- or unicode >= criterium then - if not name then - name = formatters["u%06X.ctx"](private) - end - unicode = private - unicodes[name] = private - if trace_private then - report_otf("glyph %a at index %H is moved to private unicode slot %U",name,index,private) - end - private = private + 1 - nofnames = nofnames + 1 - else - -- if unicode > criterium then - -- local taken = descriptions[unicode] - -- if taken then - -- private = private + 1 - -- descriptions[private] = taken - -- unicodes[taken.name] = private - -- indices[taken.index] = private - -- if trace_private then - -- report_otf("slot %U is moved to %U due to private in font",unicode) - -- end - -- end - -- end - if not name then - name = formatters["u%06X.ctx"](unicode) - end - unicodes[name] = unicode - nofunicodes = nofunicodes + 1 - end - indices[index] = unicode -- each index is unique (at least now) - local description = { - -- width = glyph.width, - boundingbox = glyph.boundingbox, - -- name = glyph.name or name or "unknown", -- uniXXXX - name = name or "unknown", -- uniXXXX - -- cidindex = cidindex, - index = index, - glyph = glyph, - } - descriptions[unicode] = description - local altuni = glyph.altuni - if altuni then - -- local d - for i=1,#altuni do - local a = altuni[i] - local u = a.unicode - if u ~= unicode then - local v = a.variant - if v then - -- tricky: no addition to d? needs checking but in practice such dups are either very simple - -- shapes or e.g cjk with not that many features - local vv = variants[v] - if vv then - vv[u] = unicode - else -- xits-math has some: - vv = { [u] = unicode } - variants[v] = vv - end - -- elseif d then - -- d[#d+1] = u - -- else - -- d = { u } - end - end - end - -- if d then - -- duplicates[unicode] = d -- is this needed ? - -- end - end - end - end - else - report_otf("potential problem: no glyphs found in subfont %i",cidindex) - end - end - if trace_subfonts then - report_otf("nofglyphs: %i, unique: %i",cidtotal,table.count(unique)) - end - if trace_loading then - report_otf("cid font remapped, %s unicode points, %s symbolic names, %s glyphs",nofunicodes, nofnames, nofunicodes+nofnames) - end - elseif trace_loading then - report_otf("unable to remap cid font, missing cid file for %a",filename) - end - elseif trace_loading then - report_otf("font %a has no glyphs",filename) - end - - else - - local cnt = raw.glyphcnt or 0 - local min = raw.glyphmin or 0 - local max = raw.glyphmax or (raw.glyphcnt - 1) - notdeffound = (tonumber(raw.table_version) or 0) > 0.4 and raw.notdef_loc or -1 - if cnt > 0 then - for index=min,max do - local glyph = rawglyphs[index] - if glyph then - local unicode = glyph.unicode - local name = glyph.name - if not unicode or unicode == -1 then -- or unicode >= criterium then - unicode = private - unicodes[name] = private - if trace_private then - report_otf("glyph %a at index %H is moved to private unicode slot %U",name,index,private) - end - private = private + 1 - else - -- We have a font that uses and exposes the private area. As this is rather unreliable it's - -- advised no to trust slots here (better use glyphnames). Anyway, we need a double check: - -- we need to move already moved entries and we also need to bump the next private to after - -- the (currently) last slot. This could leave us with a hole but we have holes anyway. - if unicode > criterium then - -- \definedfont[file:HANBatang-LVT.ttf] \fontchar{uF0135} \char"F0135 - local taken = descriptions[unicode] - if taken then - if unicode >= private then - private = unicode + 1 -- restart private (so we can have mixed now) - else - private = private + 1 -- move on - end - descriptions[private] = taken - unicodes[taken.name] = private - indices[taken.index] = private - if trace_private then - report_otf("slot %U is moved to %U due to private in font",unicode) - end - else - if unicode >= private then - private = unicode + 1 -- restart (so we can have mixed now) - end - end - end - unicodes[name] = unicode - end - indices[index] = unicode - -- if not name then - -- name = formatters["u%06X"](unicode) -- u%06X.ctx - -- end - descriptions[unicode] = { - -- width = glyph.width, - boundingbox = glyph.boundingbox, - name = name, - index = index, - glyph = glyph, - } - local altuni = glyph.altuni - if altuni then - -- local d - for i=1,#altuni do - local a = altuni[i] - local u = a.unicode - if u ~= unicode then - local v = a.variant - if v then - -- tricky: no addition to d? needs checking but in practice such dups are either very simple - -- shapes or e.g cjk with not that many features - local vv = variants[v] - if vv then - vv[u] = unicode - else -- xits-math has some: - vv = { [u] = unicode } - variants[v] = vv - end - -- elseif d then - -- d[#d+1] = u - -- else - -- d = { u } - end - end - end - -- if d then - -- duplicates[unicode] = d -- is this needed ? - -- end - end - else - report_otf("potential problem: glyph %U is used but empty",index) - end - end - else - report_otf("potential problem: no glyphs found") - end - - end - - if notdeffound == -1 then - report_otf("warning: no .notdef found in %a",filename) - elseif notdeffound ~= 0 then - report_otf("warning: .notdef found at position %a in %a",notdeffound,filename) - end - metadata.notdef = notdeffound - - resources.private = private - -end - --- the next one is still messy but will get better when we have --- flattened map/enc tables in the font loader - --- the next one is not using a valid base for unicode privates --- --- PsuedoEncodeUnencoded(EncMap *map,struct ttfinfo *info) - -local function enhance_check_encoding(data,filename,raw) - local descriptions = data.descriptions - local resources = data.resources - local properties = data.properties - local unicodes = resources.unicodes -- name to unicode - local indices = resources.indices -- index to unicodes - local duplicates = resources.duplicates - - -- begin of messy (not needed when cidmap) - - local mapdata = raw.map or { } - local unicodetoindex = mapdata and mapdata.map or { } - local indextounicode = mapdata and mapdata.backmap or { } - -- local encname = lower(data.enc_name or raw.enc_name or mapdata.enc_name or "") - local encname = lower(data.enc_name or mapdata.enc_name or "") - local criterium = 0xFFFF -- for instance cambria has a lot of mess up there - local privateoffset = constructors.privateoffset - - -- end of messy - - if find(encname,"unicode") then -- unicodebmp, unicodefull, ... - if trace_loading then - report_otf("checking embedded unicode map %a",encname) - end - local reported = { } - -- we loop over the original unicode->index mapping but we - -- need to keep in mind that that one can have weird entries - -- so we need some extra checking - for maybeunicode, index in next, unicodetoindex do - if descriptions[maybeunicode] then - -- we ignore invalid unicodes (unicode = -1) (ff can map wrong to non private) - else - local unicode = indices[index] - if not unicode then - -- weird (cjk or so?) - elseif maybeunicode == unicode then - -- no need to add - elseif unicode > privateoffset then - -- we have a non-unicode - else - local d = descriptions[unicode] - if d then - local c = d.copies - if c then - c[maybeunicode] = true - else - d.copies = { [maybeunicode] = true } - end - elseif index and not reported[index] then - report_otf("missing index %i",index) - reported[index] = true - end - end - end - end - for unicode, data in next, descriptions do - local d = data.copies - if d then - duplicates[unicode] = sortedkeys(d) - data.copies = nil - end - end - elseif properties.cidinfo then - report_otf("warning: no unicode map, used cidmap %a",properties.cidinfo.usedname) - else - report_otf("warning: non unicode map %a, only using glyph unicode data",encname or "whatever") - end - - if mapdata then - mapdata.map = { } -- clear some memory (virtual and created each time anyway) - mapdata.backmap = { } -- clear some memory (virtual and created each time anyway) - end -end - --- for the moment we assume that a font with lookups will not use --- altuni so we stick to kerns only .. alternatively we can always --- do an indirect lookup uni_to_uni . but then we need that in --- all lookups - -local function enhance_add_duplicates(data,filename,raw) - local descriptions = data.descriptions - local resources = data.resources - local properties = data.properties - local unicodes = resources.unicodes -- name to unicode - local indices = resources.indices -- index to unicodes - local duplicates = resources.duplicates - -- for unicode, d in next, duplicates do - for unicode, d in table.sortedhash(duplicates) do -- nicer for log - local nofduplicates = #d - if nofduplicates > 4 then - if trace_loading then - report_otf("ignoring excessive duplicates of %U (n=%s)",unicode,nofduplicates) - end - else - -- local validduplicates = { } - for i=1,nofduplicates do - local u = d[i] - if not descriptions[u] then - local description = descriptions[unicode] - local n = 0 - for _, description in next, descriptions do - local kerns = description.kerns - if kerns then - for _, k in next, kerns do - local ku = k[unicode] - if ku then - k[u] = ku - n = n + 1 - end - end - end - -- todo: lookups etc - end - if u > 0 then -- and - local duplicate = copy(description) -- else packing problem - duplicate.comment = formatters["copy of %U"](unicode) - descriptions[u] = duplicate - -- validduplicates[#validduplicates+1] = u - if trace_loading then - report_otf("duplicating %06U to %06U with index %H (%s kerns)",unicode,u,description.index,n) - end - end - end - end - -- duplicates[unicode] = #validduplicates > 0 and validduplicates or nil - end - end -end - --- class : nil base mark ligature component (maybe we don't need it in description) --- boundingbox: split into ht/dp takes more memory (larger tables and less sharing) - -local function enhance_analyze_glyphs(data,filename,raw) -- maybe integrate this in the previous - local descriptions = data.descriptions - local resources = data.resources - local metadata = data.metadata - local properties = data.properties - local hasitalics = false - local widths = { } - local marks = { } -- always present (saves checking) - for unicode, description in next, descriptions do - local glyph = description.glyph - local italic = glyph.italic_correction -- only in a math font (we also have vert/horiz) - if not italic then - -- skip - elseif italic == 0 then - -- skip - else - description.italic = italic - hasitalics = true - end - local width = glyph.width - widths[width] = (widths[width] or 0) + 1 - local class = glyph.class - if class then - if class == "mark" then - marks[unicode] = true - end - description.class = class - end - end - -- flag italic - properties.hasitalics = hasitalics - -- flag marks - resources.marks = marks - -- share most common width for cjk fonts - local wd, most = 0, 1 - for k,v in next, widths do - if v > most then - wd, most = k, v - end - end - if most > 1000 then -- maybe 500 - if trace_loading then - report_otf("most common width: %s (%s times), sharing (cjk font)",wd,most) - end - for unicode, description in next, descriptions do - if description.width == wd then - -- description.width = nil - else - description.width = description.glyph.width - end - end - resources.defaultwidth = wd - else - for unicode, description in next, descriptions do - description.width = description.glyph.width - end - end -end - -local function enhance_reorganize_mark_classes(data,filename,raw) - local mark_classes = raw.mark_classes - if mark_classes then - local resources = data.resources - local unicodes = resources.unicodes - local markclasses = { } - resources.markclasses = markclasses -- reversed - for name, class in next, mark_classes do - local t = { } - for s in gmatch(class,"[^ ]+") do - t[unicodes[s]] = true - end - markclasses[name] = t - end - end -end - -local function enhance_reorganize_features(data,filename,raw) -- combine with other - local features = { } - data.resources.features = features - for k=1,#otf.glists do - local what = otf.glists[k] - local dw = raw[what] - if dw then - local f = { } - features[what] = f - for i=1,#dw do - local d= dw[i] - local dfeatures = d.features - if dfeatures then - for i=1,#dfeatures do - local df = dfeatures[i] - local tag = strip(lower(df.tag)) - local ft = f[tag] - if not ft then - ft = { } - f[tag] = ft - end - local dscripts = df.scripts - for i=1,#dscripts do - local d = dscripts[i] - local languages = d.langs - local script = strip(lower(d.script)) - local fts = ft[script] if not fts then fts = {} ft[script] = fts end - for i=1,#languages do - fts[strip(lower(languages[i]))] = true - end - end - end - end - end - end - end -end - -local function enhance_reorganize_anchor_classes(data,filename,raw) - local resources = data.resources - local anchor_to_lookup = { } - local lookup_to_anchor = { } - resources.anchor_to_lookup = anchor_to_lookup - resources.lookup_to_anchor = lookup_to_anchor - local classes = raw.anchor_classes -- anchor classes not in final table - if classes then - for c=1,#classes do - local class = classes[c] - local anchor = class.name - local lookups = class.lookup - if type(lookups) ~= "table" then - lookups = { lookups } - end - local a = anchor_to_lookup[anchor] - if not a then - a = { } - anchor_to_lookup[anchor] = a - end - for l=1,#lookups do - local lookup = lookups[l] - local l = lookup_to_anchor[lookup] - if l then - l[anchor] = true - else - l = { [anchor] = true } - lookup_to_anchor[lookup] = l - end - a[lookup] = true - end - end - end -end - --- local function checklookups(data,missing,nofmissing) --- local resources = data.resources --- local unicodes = resources.unicodes --- local lookuptypes = resources.lookuptypes --- if not unicodes or not lookuptypes then --- return --- elseif nofmissing <= 0 then --- return --- end --- local descriptions = data.descriptions --- local private = fonts.constructors and fonts.constructors.privateoffset or 0xF0000 -- 0x10FFFF --- -- --- local ns, nl = 0, 0 --- --- local guess = { } --- -- helper --- local function check(gname,code,unicode) --- local description = descriptions[code] --- -- no need to add a self reference --- local variant = description.name --- if variant == gname then --- return --- end --- -- the variant already has a unicode (normally that results in a default tounicode to self) --- local unic = unicodes[variant] --- if unic == -1 or unic >= private or (unic >= 0xE000 and unic <= 0xF8FF) or unic == 0xFFFE or unic == 0xFFFF then --- -- no default mapping and therefore maybe no tounicode yet --- else --- return --- end --- -- the variant already has a tounicode --- if descriptions[code].unicode then --- return --- end --- -- add to the list --- local g = guess[variant] --- -- local r = overloads[unicode] --- -- if r then --- -- unicode = r.unicode --- -- end --- if g then --- g[gname] = unicode --- else --- guess[variant] = { [gname] = unicode } --- end --- end --- -- --- for unicode, description in next, descriptions do --- local slookups = description.slookups --- if slookups then --- local gname = description.name --- for tag, data in next, slookups do --- local lookuptype = lookuptypes[tag] --- if lookuptype == "alternate" then --- for i=1,#data do --- check(gname,data[i],unicode) --- end --- elseif lookuptype == "substitution" then --- check(gname,data,unicode) --- end --- end --- end --- local mlookups = description.mlookups --- if mlookups then --- local gname = description.name --- for tag, list in next, mlookups do --- local lookuptype = lookuptypes[tag] --- if lookuptype == "alternate" then --- for i=1,#list do --- local data = list[i] --- for i=1,#data do --- check(gname,data[i],unicode) --- end --- end --- elseif lookuptype == "substitution" then --- for i=1,#list do --- check(gname,list[i],unicode) --- end --- end --- end --- end --- end --- -- resolve references --- local done = true --- while done do --- done = false --- for k, v in next, guess do --- if type(v) ~= "number" then --- for kk, vv in next, v do --- if vv == -1 or vv >= private or (vv >= 0xE000 and vv <= 0xF8FF) or vv == 0xFFFE or vv == 0xFFFF then --- local uu = guess[kk] --- if type(uu) == "number" then --- guess[k] = uu --- done = true --- end --- else --- guess[k] = vv --- done = true --- end --- end --- end --- end --- end --- -- wrap up --- local orphans = 0 --- local guessed = 0 --- for k, v in next, guess do --- if type(v) == "number" then --- descriptions[unicodes[k]].unicode = descriptions[v].unicode or v -- can also be a table --- guessed = guessed + 1 --- else --- local t = nil --- local l = lower(k) --- local u = unicodes[l] --- if not u then --- orphans = orphans + 1 --- elseif u == -1 or u >= private or (u >= 0xE000 and u <= 0xF8FF) or u == 0xFFFE or u == 0xFFFF then --- local unicode = descriptions[u].unicode --- if unicode then --- descriptions[unicodes[k]].unicode = unicode --- guessed = guessed + 1 --- else --- orphans = orphans + 1 --- end --- else --- orphans = orphans + 1 --- end --- end --- end --- if trace_loading and orphans > 0 or guessed > 0 then --- report_otf("%s glyphs with no related unicode, %s guessed, %s orphans",guessed+orphans,guessed,orphans) --- end --- end - -local function enhance_prepare_tounicode(data,filename,raw) - fonts.mappings.addtounicode(data,filename) -end - -local g_directions = { - gsub_contextchain = 1, - gpos_contextchain = 1, - -- gsub_context = 1, - -- gpos_context = 1, - gsub_reversecontextchain = -1, - gpos_reversecontextchain = -1, -} --- The following is no longer needed as AAT is ignored per end October 2013. --- --- -- Research by Khaled Hosny has demonstrated that the font loader merges --- -- regular and AAT features and that these can interfere (especially because --- -- we dropped checking for valid features elsewhere. So, we just check for --- -- the special flag and drop the feature if such a tag is found. --- --- local function supported(features) --- for i=1,#features do --- if features[i].ismac then --- return false --- end --- end --- return true --- end - -local function enhance_reorganize_subtables(data,filename,raw) - local resources = data.resources - local sequences = { } - local lookups = { } - local chainedfeatures = { } - resources.sequences = sequences - resources.lookups = lookups -- we also have lookups in data itself - for k=1,#otf.glists do - local what = otf.glists[k] - local dw = raw[what] - if dw then - for k=1,#dw do - local gk = dw[k] - local features = gk.features - -- if not features or supported(features) then -- not always features ! - local typ = gk.type - local chain = g_directions[typ] or 0 - local subtables = gk.subtables - if subtables then - local t = { } - for s=1,#subtables do - t[s] = subtables[s].name - end - subtables = t - end - local flags, markclass = gk.flags, nil - if flags then - local t = { -- forcing false packs nicer - (flags.ignorecombiningmarks and "mark") or false, - (flags.ignoreligatures and "ligature") or false, - (flags.ignorebaseglyphs and "base") or false, - flags.r2l or false, - } - markclass = flags.mark_class - if markclass then - markclass = resources.markclasses[markclass] - end - flags = t - end - -- - local name = gk.name - -- - if not name then - -- in fact an error - report_otf("skipping weird lookup number %s",k) - elseif features then - -- scripts, tag, ismac - local f = { } - local o = { } - for i=1,#features do - local df = features[i] - local tag = strip(lower(df.tag)) - local ft = f[tag] - if not ft then - ft = { } - f[tag] = ft - o[#o+1] = tag - end - local dscripts = df.scripts - for i=1,#dscripts do - local d = dscripts[i] - local languages = d.langs - local script = strip(lower(d.script)) - local fts = ft[script] if not fts then fts = {} ft[script] = fts end - for i=1,#languages do - fts[strip(lower(languages[i]))] = true - end - end - end - sequences[#sequences+1] = { - type = typ, - chain = chain, - flags = flags, - name = name, - subtables = subtables, - markclass = markclass, - features = f, - order = o, - } - else - lookups[name] = { - type = typ, - chain = chain, - flags = flags, - subtables = subtables, - markclass = markclass, - } - end - -- end - end - end - end -end - -local function enhance_prepare_lookups(data,filename,raw) - local lookups = raw.lookups - if lookups then - data.lookups = lookups - end -end - --- The reverse handler does a bit redundant splitting but it's seldom --- seen so we don't bother too much. We could store the replacement --- in the current list (value instead of true) but it makes other code --- uglier. Maybe some day. - -local function t_uncover(splitter,cache,covers) - local result = { } - for n=1,#covers do - local cover = covers[n] - local uncovered = cache[cover] - if not uncovered then - uncovered = lpegmatch(splitter,cover) - cache[cover] = uncovered - end - result[n] = uncovered - end - return result -end - -local function s_uncover(splitter,cache,cover) - if cover == "" then - return nil - else - local uncovered = cache[cover] - if not uncovered then - uncovered = lpegmatch(splitter,cover) - -- for i=1,#uncovered do - -- uncovered[i] = { [uncovered[i]] = true } - -- end - cache[cover] = uncovered - end - return { uncovered } - end -end - -local function t_hashed(t,cache) - if t then - local ht = { } - for i=1,#t do - local ti = t[i] - local tih = cache[ti] - if not tih then - local tn = #ti - if tn == 1 then - tih = { [ti[1]] = true } - else - tih = { } - for i=1,tn do - tih[ti[i]] = true - end - end - cache[ti] = tih - end - ht[i] = tih - end - return ht - else - return nil - end -end - --- local s_hashed = t_hashed - -local function s_hashed(t,cache) - if t then - local tf = t[1] - local nf = #tf - if nf == 1 then - return { [tf[1]] = true } - else - local ht = { } - for i=1,nf do - ht[i] = { [tf[i]] = true } - end - return ht - end - else - return nil - end -end - -local function r_uncover(splitter,cache,cover,replacements) - if cover == "" then - return nil - else - -- we always have current as { } even in the case of one - local uncovered = cover[1] - local replaced = cache[replacements] - if not replaced then - replaced = lpegmatch(splitter,replacements) - cache[replacements] = replaced - end - local nu, nr = #uncovered, #replaced - local r = { } - if nu == nr then - for i=1,nu do - r[uncovered[i]] = replaced[i] - end - end - return r - end -end - -local function enhance_reorganize_lookups(data,filename,raw) -- we could check for "" and n == 0 - -- we prefer the before lookups in a normal order - if data.lookups then - local helpers = data.helpers - local duplicates = data.resources.duplicates - local splitter = helpers.tounicodetable - local t_u_cache = { } - local s_u_cache = t_u_cache -- string keys - local t_h_cache = { } - local s_h_cache = t_h_cache -- table keys (so we could use one cache) - local r_u_cache = { } -- maybe shared - helpers.matchcache = t_h_cache -- so that we can add duplicates - -- - for _, lookup in next, data.lookups do - local rules = lookup.rules - if rules then - local format = lookup.format - if format == "class" then - local before_class = lookup.before_class - if before_class then - before_class = t_uncover(splitter,t_u_cache,reversed(before_class)) - end - local current_class = lookup.current_class - if current_class then - current_class = t_uncover(splitter,t_u_cache,current_class) - end - local after_class = lookup.after_class - if after_class then - after_class = t_uncover(splitter,t_u_cache,after_class) - end - for i=1,#rules do - local rule = rules[i] - local class = rule.class - local before = class.before - if before then - for i=1,#before do - before[i] = before_class[before[i]] or { } - end - rule.before = t_hashed(before,t_h_cache) - end - local current = class.current - local lookups = rule.lookups - if current then - for i=1,#current do - current[i] = current_class[current[i]] or { } - -- let's not be sparse - if lookups and not lookups[i] then - lookups[i] = "" -- (was: false) e.g. we can have two lookups and one replacement - end - -- end of fix - end - rule.current = t_hashed(current,t_h_cache) - end - local after = class.after - if after then - for i=1,#after do - after[i] = after_class[after[i]] or { } - end - rule.after = t_hashed(after,t_h_cache) - end - rule.class = nil - end - lookup.before_class = nil - lookup.current_class = nil - lookup.after_class = nil - lookup.format = "coverage" - elseif format == "coverage" then - for i=1,#rules do - local rule = rules[i] - local coverage = rule.coverage - if coverage then - local before = coverage.before - if before then - before = t_uncover(splitter,t_u_cache,reversed(before)) - rule.before = t_hashed(before,t_h_cache) - end - local current = coverage.current - if current then - current = t_uncover(splitter,t_u_cache,current) - -- let's not be sparse - local lookups = rule.lookups - if lookups then - for i=1,#current do - if not lookups[i] then - lookups[i] = "" -- fix sparse array - end - end - end - -- - rule.current = t_hashed(current,t_h_cache) - end - local after = coverage.after - if after then - after = t_uncover(splitter,t_u_cache,after) - rule.after = t_hashed(after,t_h_cache) - end - rule.coverage = nil - end - end - elseif format == "reversecoverage" then -- special case, single substitution only - for i=1,#rules do - local rule = rules[i] - local reversecoverage = rule.reversecoverage - if reversecoverage then - local before = reversecoverage.before - if before then - before = t_uncover(splitter,t_u_cache,reversed(before)) - rule.before = t_hashed(before,t_h_cache) - end - local current = reversecoverage.current - if current then - current = t_uncover(splitter,t_u_cache,current) - rule.current = t_hashed(current,t_h_cache) - end - local after = reversecoverage.after - if after then - after = t_uncover(splitter,t_u_cache,after) - rule.after = t_hashed(after,t_h_cache) - end - local replacements = reversecoverage.replacements - if replacements then - rule.replacements = r_uncover(splitter,r_u_cache,current,replacements) - end - rule.reversecoverage = nil - end - end - elseif format == "glyphs" then - -- I could store these more efficient (as not we use a nested tables for before, - -- after and current but this features happens so seldom that I don't bother - -- about it right now. - for i=1,#rules do - local rule = rules[i] - local glyphs = rule.glyphs - if glyphs then - local fore = glyphs.fore - if fore and fore ~= "" then - fore = s_uncover(splitter,s_u_cache,fore) - rule.after = s_hashed(fore,s_h_cache) - end - local back = glyphs.back - if back then - back = s_uncover(splitter,s_u_cache,back) - rule.before = s_hashed(back,s_h_cache) - end - local names = glyphs.names - if names then - names = s_uncover(splitter,s_u_cache,names) - rule.current = s_hashed(names,s_h_cache) - end - rule.glyphs = nil - local lookups = rule.lookups - if lookups then - for i=1,#names do - if not lookups[i] then - lookups[i] = "" -- fix sparse array - end - end - end - end - end - end - end - end - end -end - -local function enhance_expand_lookups(data,filename,raw) -- we could check for "" and n == 0 - if data.lookups then - local cache = data.helpers.matchcache - if cache then - local duplicates = data.resources.duplicates - for key, hash in next, cache do - local done = nil - for key in next, hash do - local unicode = duplicates[key] - if not unicode then - -- no duplicate - elseif type(unicode) == "table" then - -- multiple duplicates - for i=1,#unicode do - local u = unicode[i] - if hash[u] then - -- already in set - elseif done then - done[u] = key - else - done = { [u] = key } - end - end - else - -- one duplicate - if hash[unicode] then - -- already in set - elseif done then - done[unicode] = key - else - done = { [unicode] = key } - end - end - end - if done then - for u in next, done do - hash[u] = true - end - end - end - end - end -end - -local function check_variants(unicode,the_variants,splitter,unicodes) - local variants = the_variants.variants - if variants then -- use splitter - local glyphs = lpegmatch(splitter,variants) - local done = { [unicode] = true } - local n = 0 - for i=1,#glyphs do - local g = glyphs[i] - if done[g] then - if i > 1 then - report_otf("skipping cyclic reference %U in math variant %U",g,unicode) - end - else - if n == 0 then - n = 1 - variants = { g } - else - n = n + 1 - variants[n] = g - end - done[g] = true - end - end - if n == 0 then - variants = nil - end - end - local parts = the_variants.parts - if parts then - local p = #parts - if p > 0 then - for i=1,p do - local pi = parts[i] - pi.glyph = unicodes[pi.component] or 0 - pi.component = nil - end - else - parts = nil - end - end - local italic = the_variants.italic - if italic and italic == 0 then - italic = nil - end - return variants, parts, italic -end - -local function enhance_analyze_math(data,filename,raw) - if raw.math then - data.metadata.math = raw.math - local unicodes = data.resources.unicodes - local splitter = data.helpers.tounicodetable - for unicode, description in next, data.descriptions do - local glyph = description.glyph - local mathkerns = glyph.mathkern -- singular - local hvariants = glyph.horiz_variants - local vvariants = glyph.vert_variants - local accent = glyph.top_accent - local italic = glyph.italic_correction - if mathkerns or hvariants or vvariants or accent or italic then - local math = { } - if accent then - math.accent = accent - end - if mathkerns then - local topright = mathkerns.top_right - local topleft = mathkerns.top_left - local bottomright = mathkerns.bottom_right - local bottomleft = mathkerns.bottom_left - math.kerns = { - topright = topright and next(topright) and topright or nil, - topleft = topleft and next(topleft) and topleft or nil, - bottomright = bottomright and next(bottomright) and bottomright or nil, - bottomleft = bottomleft and next(bottomleft) and bottomleft or nil, - } - end - if hvariants then - math.hvariants, math.hparts, math.hitalic = check_variants(unicode,hvariants,splitter,unicodes) - end - if vvariants then - math.vvariants, math.vparts, math.vitalic = check_variants(unicode,vvariants,splitter,unicodes) - end - if italic and italic ~= 0 then - math.italic = italic - end - description.math = math - end - end - end -end - -local function enhance_reorganize_glyph_kerns(data,filename,raw) - local descriptions = data.descriptions - local resources = data.resources - local unicodes = resources.unicodes - for unicode, description in next, descriptions do - local kerns = description.glyph.kerns - if kerns then - local newkerns = { } - for k, kern in next, kerns do - local name = kern.char - local offset = kern.off - local lookup = kern.lookup - if name and offset and lookup then - local unicode = unicodes[name] - if unicode then - if type(lookup) == "table" then - for l=1,#lookup do - local lookup = lookup[l] - local lookupkerns = newkerns[lookup] - if lookupkerns then - lookupkerns[unicode] = offset - else - newkerns[lookup] = { [unicode] = offset } - end - end - else - local lookupkerns = newkerns[lookup] - if lookupkerns then - lookupkerns[unicode] = offset - else - newkerns[lookup] = { [unicode] = offset } - end - end - elseif trace_loading then - report_otf("problems with unicode %a of kern %a of glyph %U",name,k,unicode) - end - end - end - description.kerns = newkerns - end - end -end - -local function enhance_merge_kern_classes(data,filename,raw) - local gposlist = raw.gpos - if gposlist then - local descriptions = data.descriptions - local resources = data.resources - local unicodes = resources.unicodes - local splitter = data.helpers.tounicodetable - local ignored = 0 - local blocked = 0 - for gp=1,#gposlist do - local gpos = gposlist[gp] - local subtables = gpos.subtables - if subtables then - local first_done = { } -- could become an option so that we can deal with buggy fonts that don't get fixed - local split = { } -- saves time .. although probably not that much any more in the fixed luatex kernclass table - for s=1,#subtables do - local subtable = subtables[s] - local kernclass = subtable.kernclass -- name is inconsistent with anchor_classes - local lookup = subtable.lookup or subtable.name - if kernclass then -- the next one is quite slow - -- as fas as i can see the kernclass is a table with one entry and offsets - -- have no [1] so we could remov eon elevel (kernclass) and start offsets - -- at 1 but we're too far down the road now to fix that - if #kernclass > 0 then - kernclass = kernclass[1] - lookup = type(kernclass.lookup) == "string" and kernclass.lookup or lookup - report_otf("fixing kernclass table of lookup %a",lookup) - end - local firsts = kernclass.firsts - local seconds = kernclass.seconds - local offsets = kernclass.offsets - -- if offsets[1] == nil then - -- offsets[1] = "" -- defaults ? - -- end - for n, s in next, firsts do - split[s] = split[s] or lpegmatch(splitter,s) - end - local maxseconds = 0 - for n, s in next, seconds do - if n > maxseconds then - maxseconds = n - end - split[s] = split[s] or lpegmatch(splitter,s) - end - for fk=1,#firsts do -- maxfirsts ? - local fv = firsts[fk] - local splt = split[fv] - if splt then - local extrakerns = { } - local baseoffset = (fk-1) * maxseconds - -- for sk, sv in next, seconds do - for sk=2,maxseconds do - local sv = seconds[sk] - if sv then - local splt = split[sv] - if splt then -- redundant test - local offset = offsets[baseoffset + sk] - if offset then - for i=1,#splt do - extrakerns[splt[i]] = offset - end - end - end - end - end - for i=1,#splt do - local first_unicode = splt[i] - if first_done[first_unicode] then - report_otf("lookup %a: ignoring further kerns of %C",lookup,first_unicode) - blocked = blocked + 1 - else - first_done[first_unicode] = true - local description = descriptions[first_unicode] - if description then - local kerns = description.kerns - if not kerns then - kerns = { } -- unicode indexed ! - description.kerns = kerns - end - local lookupkerns = kerns[lookup] - if not lookupkerns then - lookupkerns = { } - kerns[lookup] = lookupkerns - end - if overloadkerns then - for second_unicode, kern in next, extrakerns do - lookupkerns[second_unicode] = kern - end - else - for second_unicode, kern in next, extrakerns do - local k = lookupkerns[second_unicode] - if not k then - lookupkerns[second_unicode] = kern - elseif k ~= kern then - if trace_loading then - report_otf("lookup %a: ignoring overload of kern between %C and %C, rejecting %a, keeping %a",lookup,first_unicode,second_unicode,k,kern) - end - ignored = ignored + 1 - end - end - end - elseif trace_loading then - report_otf("no glyph data for %U", first_unicode) - end - end - end - end - end - subtable.kernclass = { } - end - end - end - end - if ignored > 0 then - report_otf("%s kern overloads ignored",ignored) - end - if blocked > 0 then - report_otf("%s successive kerns blocked",blocked) - end - end -end - -local function enhance_check_glyphs(data,filename,raw) - for unicode, description in next, data.descriptions do - description.glyph = nil - end -end - --- future versions will remove _ - -local valid = (R("\x00\x7E") - S("(){}[]<>%/ \n\r\f\v"))^0 * P(-1) - -local function valid_ps_name(str) - return str and str ~= "" and #str < 64 and lpegmatch(valid,str) and true or false -end - -local function enhance_check_metadata(data,filename,raw) - local metadata = data.metadata - for _, k in next, mainfields do - if valid_fields[k] then - local v = raw[k] - if not metadata[k] then - metadata[k] = v - end - end - end - -- metadata.pfminfo = raw.pfminfo -- not already done? - local ttftables = metadata.ttf_tables - if ttftables then - for i=1,#ttftables do - ttftables[i].data = "deleted" - end - end - -- - local state = metadata.validation_state - local names = raw.names - -- - if state and table.contains(state,"bad_ps_fontname") then - -- the ff library does a bit too much (and wrong) checking ... so we need to catch this - -- at least for now - local function valid(what) - if names then - for i=1,#names do - local list = names[i] - local names = list.names - if names then - local name = names[what] - if name and valid_ps_name(name) then - return name - end - end - end - end - end - local function check(what) - local oldname = metadata[what] - if valid_ps_name(oldname) then - report_otf("ignoring warning %a because %s %a is proper ASCII","bad_ps_fontname",what,oldname) - else - local newname = valid(what) - if not newname then - newname = formatters["bad-%s-%s"](what,file.nameonly(filename)) - end - local warning = formatters["overloading %s from invalid ASCII name %a to %a"](what,oldname,newname) - data.warnings[#data.warnings+1] = warning - report_otf(warning) - metadata[what] = newname - end - end - check("fontname") - check("fullname") - end - -- - if names then - local psname = metadata.psname - if not psname or psname == "" then - for i=1,#names do - local name = names[i] - -- Currently we use the same restricted search as in the new context (specific) font loader - -- but we might add more lang checks (it worked ok in the new loaded so now we're in sync) - -- This check here is also because there are (esp) cjk fonts out there with psnames different - -- from fontnames (gives a bad lookup in backend). - if lower(name.lang) == "english (us)" then - local specification = name.names - if specification then - local postscriptname = specification.postscriptname - if postscriptname then - psname = postscriptname - end - end - end - break - end - end - if psname ~= metadata.fontname then - report_otf("fontname %a, fullname %a, psname %a",metadata.fontname,metadata.fullname,psname) - end - metadata.psname = psname - end - -- - if state and table.contains(state,"bad_cmap_table") then - report_otf("fontfile %a has bad cmap tables",filename) - end -end - -local function enhance_cleanup_tables(data,filename,raw) - local duplicates = data.resources.duplicates - if duplicates then - for k, v in next, duplicates do - if #v == 1 then - duplicates[k] = v[1] - end - end - end - data.resources.indices = nil -- not needed - data.resources.unicodes = nil -- delayed - data.helpers = nil -- tricky as we have no unicodes any more -end - --- kern: ttf has a table with kerns --- --- Weird, as maxfirst and maxseconds can have holes, first seems to be indexed, but --- seconds can start at 2 .. this need to be fixed as getn as well as # are sort of --- unpredictable alternatively we could force an [1] if not set (maybe I will do that --- anyway). - --- we can share { } as it is never set - --- ligatures have an extra specification.char entry that we don't use - --- mlookups only with pairs and ligatures - -local function enhance_reorganize_glyph_lookups(data,filename,raw) - local resources = data.resources - local unicodes = resources.unicodes - local descriptions = data.descriptions - local splitter = data.helpers.tounicodelist - - local lookuptypes = resources.lookuptypes - - for unicode, description in next, descriptions do - local lookups = description.glyph.lookups - if lookups then - for tag, lookuplist in next, lookups do - for l=1,#lookuplist do - local lookup = lookuplist[l] - local specification = lookup.specification - local lookuptype = lookup.type - local lt = lookuptypes[tag] - if not lt then - lookuptypes[tag] = lookuptype - elseif lt ~= lookuptype then - report_otf("conflicting lookuptypes, %a points to %a and %a",tag,lt,lookuptype) - end - if lookuptype == "ligature" then - lookuplist[l] = { lpegmatch(splitter,specification.components) } - elseif lookuptype == "alternate" then - lookuplist[l] = { lpegmatch(splitter,specification.components) } - elseif lookuptype == "substitution" then - lookuplist[l] = unicodes[specification.variant] - elseif lookuptype == "multiple" then - lookuplist[l] = { lpegmatch(splitter,specification.components) } - elseif lookuptype == "position" then - lookuplist[l] = { - specification.x or 0, - specification.y or 0, - specification.h or 0, - specification.v or 0 - } - elseif lookuptype == "pair" then - local one = specification.offsets[1] - local two = specification.offsets[2] - local paired = unicodes[specification.paired] - if one then - if two then - lookuplist[l] = { paired, { one.x or 0, one.y or 0, one.h or 0, one.v or 0 }, { two.x or 0, two.y or 0, two.h or 0, two.v or 0 } } - else - lookuplist[l] = { paired, { one.x or 0, one.y or 0, one.h or 0, one.v or 0 } } - end - else - if two then - lookuplist[l] = { paired, { }, { two.x or 0, two.y or 0, two.h or 0, two.v or 0} } -- maybe nil instead of { } - else - lookuplist[l] = { paired } - end - end - end - end - end - local slookups, mlookups - for tag, lookuplist in next, lookups do - if #lookuplist == 1 then - if slookups then - slookups[tag] = lookuplist[1] - else - slookups = { [tag] = lookuplist[1] } - end - else - if mlookups then - mlookups[tag] = lookuplist - else - mlookups = { [tag] = lookuplist } - end - end - end - if slookups then - description.slookups = slookups - end - if mlookups then - description.mlookups = mlookups - end - -- description.lookups = nil - end - end -end - -local zero = { 0, 0 } - -local function enhance_reorganize_glyph_anchors(data,filename,raw) - local descriptions = data.descriptions - for unicode, description in next, descriptions do - local anchors = description.glyph.anchors - if anchors then - for class, data in next, anchors do - if class == "baselig" then - for tag, specification in next, data do - -- for i=1,#specification do - -- local si = specification[i] - -- specification[i] = { si.x or 0, si.y or 0 } - -- end - -- can be sparse so we need to fill the holes - local n = 0 - for k, v in next, specification do - if k > n then - n = k - end - local x, y = v.x, v.y - if x or y then - specification[k] = { x or 0, y or 0 } - else - specification[k] = zero - end - end - local t = { } - for i=1,n do - t[i] = specification[i] or zero - end - data[tag] = t -- so # is okay (nicer for packer) - end - else - for tag, specification in next, data do - local x, y = specification.x, specification.y - if x or y then - data[tag] = { x or 0, y or 0 } - else - data[tag] = zero - end - end - end - end - description.anchors = anchors - end - end -end - -local bogusname = (P("uni") + P("u")) * R("AF","09")^4 - + (P("index") + P("glyph") + S("Ii") * P("dentity") * P(".")^0) * R("09")^1 -local uselessname = (1-bogusname)^0 * bogusname - -local function enhance_purge_names(data,filename,raw) -- not used yet - if purge_names then - local n = 0 - for u, d in next, data.descriptions do - if lpegmatch(uselessname,d.name) then - n = n + 1 - d.name = nil - end - -- d.comment = nil - end - if n > 0 then - report_otf("%s bogus names removed",n) - end - end -end - -local function enhance_compact_lookups(data,filename,raw) - if not compact_lookups then - report_otf("not compacting") - return - end - -- create keyhash - local last = 0 - local tags = table.setmetatableindex({ }, - function(t,k) - last = last + 1 - t[k] = last - return last - end - ) - -- - local descriptions = data.descriptions - local resources = data.resources - -- - for u, d in next, descriptions do - -- - -- -- we can also compact anchors and cursives (basechar basemark baselig mark) - -- - local slookups = d.slookups - if type(slookups) == "table" then - local s = { } - for k, v in next, slookups do - s[tags[k]] = v - end - d.slookups = s - end - -- - local mlookups = d.mlookups - if type(mlookups) == "table" then - local m = { } - for k, v in next, mlookups do - m[tags[k]] = v - end - d.mlookups = m - end - -- - local kerns = d.kerns - if type(kerns) == "table" then - local t = { } - for k, v in next, kerns do - t[tags[k]] = v - end - d.kerns = t - end - end - -- - local lookups = data.lookups - if lookups then - local l = { } - for k, v in next, lookups do - local rules = v.rules - if rules then - for i=1,#rules do - local l = rules[i].lookups - if type(l) == "table" then - for i=1,#l do - l[i] = tags[l[i]] - end - end - end - end - l[tags[k]] = v - end - data.lookups = l - end - -- - local lookups = resources.lookups - if lookups then - local l = { } - for k, v in next, lookups do - local s = v.subtables - if type(s) == "table" then - for i=1,#s do - s[i] = tags[s[i]] - end - end - l[tags[k]] = v - end - resources.lookups = l - end - -- - local sequences = resources.sequences - if sequences then - for i=1,#sequences do - local s = sequences[i] - local n = s.name - if n then - s.name = tags[n] - end - local t = s.subtables - if type(t) == "table" then - for i=1,#t do - t[i] = tags[t[i]] - end - end - end - end - -- - local lookuptypes = resources.lookuptypes - if lookuptypes then - local l = { } - for k, v in next, lookuptypes do - l[tags[k]] = v - end - resources.lookuptypes = l - end - -- - local anchor_to_lookup = resources.anchor_to_lookup - if anchor_to_lookup then - for anchor, lookups in next, anchor_to_lookup do - local l = { } - for lookup, value in next, lookups do - l[tags[lookup]] = value - end - anchor_to_lookup[anchor] = l - end - end - -- - local lookup_to_anchor = resources.lookup_to_anchor - if lookup_to_anchor then - local l = { } - for lookup, value in next, lookup_to_anchor do - l[tags[lookup]] = value - end - resources.lookup_to_anchor = l - end - -- - tags = table.swapped(tags) - -- - report_otf("%s lookup tags compacted",#tags) - -- - resources.lookuptags = tags -end - --- modes: node, base, none - -function otf.setfeatures(tfmdata,features) - local okay = constructors.initializefeatures("otf",tfmdata,features,trace_features,report_otf) - if okay then - return constructors.collectprocessors("otf",tfmdata,features,trace_features,report_otf) - else - return { } -- will become false - end -end - --- the first version made a top/mid/not extensible table, now we just --- pass on the variants data and deal with it in the tfm scaler (there --- is no longer an extensible table anyway) --- --- we cannot share descriptions as virtual fonts might extend them (ok, --- we could use a cache with a hash --- --- we already assign an empty tabel to characters as we can add for --- instance protruding info and loop over characters; one is not supposed --- to change descriptions and if one does so one should make a copy! - -local function copytotfm(data,cache_id) - if data then - local metadata = data.metadata - local warnings = data.warnings - local resources = data.resources - local properties = derivetable(data.properties) - local descriptions = derivetable(data.descriptions) - local goodies = derivetable(data.goodies) - local characters = { } - local parameters = { } - local mathparameters = { } - -- - local pfminfo = metadata.pfminfo or { } - local resources = data.resources - local unicodes = resources.unicodes - -- local mode = data.mode or "base" - local spaceunits = 500 - local spacer = "space" - local designsize = metadata.designsize or metadata.design_size or 100 - local minsize = metadata.minsize or metadata.design_range_bottom or designsize - local maxsize = metadata.maxsize or metadata.design_range_top or designsize - local mathspecs = metadata.math - -- - if designsize == 0 then - designsize = 100 - minsize = 100 - maxsize = 100 - end - if mathspecs then - for name, value in next, mathspecs do - mathparameters[name] = value - end - end - for unicode, _ in next, data.descriptions do -- use parent table - characters[unicode] = { } - end - if mathspecs then - -- we could move this to the scaler but not that much is saved - -- and this is cleaner - for unicode, character in next, characters do - local d = descriptions[unicode] - local m = d.math - if m then - -- watch out: luatex uses horiz_variants for the parts - -- - local italic = m.italic - local vitalic = m.vitalic - -- - local variants = m.hvariants - local parts = m.hparts - -- local done = { [unicode] = true } - if variants then - local c = character - for i=1,#variants do - local un = variants[i] - -- if done[un] then - -- -- report_otf("skipping cyclic reference %U in math variant %U",un,unicode) - -- else - c.next = un - c = characters[un] - -- done[un] = true - -- end - end -- c is now last in chain - c.horiz_variants = parts - elseif parts then - character.horiz_variants = parts - italic = m.hitalic - end - -- - local variants = m.vvariants - local parts = m.vparts - -- local done = { [unicode] = true } - if variants then - local c = character - for i=1,#variants do - local un = variants[i] - -- if done[un] then - -- -- report_otf("skipping cyclic reference %U in math variant %U",un,unicode) - -- else - c.next = un - c = characters[un] - -- done[un] = true - -- end - end -- c is now last in chain - c.vert_variants = parts - elseif parts then - character.vert_variants = parts - end - -- - if italic and italic ~= 0 then - character.italic = italic -- overload - end - if vitalic and vitalic ~= 0 then - character.vert_italic = vitalic - end - -- - local accent = m.accent - if accent then - character.accent = accent - end - -- - local kerns = m.kerns - if kerns then - character.mathkerns = kerns - end - end - end - end - -- end math - -- we need a runtime lookup because of running from cdrom or zip, brrr (shouldn't we use the basename then?) - local filename = constructors.checkedfilename(resources) - local fontname = metadata.fontname - local fullname = metadata.fullname or fontname - local psname = metadata.psname or fontname or fullname - local units = metadata.units or metadata.units_per_em or 1000 - -- - if units == 0 then -- catch bugs in fonts - units = 1000 -- maybe 2000 when ttf - metadata.units = 1000 - report_otf("changing %a units to %a",0,units) - end - -- - local monospaced = metadata.monospaced or metadata.isfixedpitch or (pfminfo.panose and pfminfo.panose.proportion == "Monospaced") - local charwidth = pfminfo.avgwidth -- or unset - local charxheight = pfminfo.os2_xheight and pfminfo.os2_xheight > 0 and pfminfo.os2_xheight --- charwidth = charwidth * units/1000 --- charxheight = charxheight * units/1000 - local italicangle = metadata.italicangle - properties.monospaced = monospaced - parameters.italicangle = italicangle - parameters.charwidth = charwidth - parameters.charxheight = charxheight - -- - local space = 0x0020 - local emdash = 0x2014 - if monospaced then - if descriptions[space] then - spaceunits, spacer = descriptions[space].width, "space" - end - if not spaceunits and descriptions[emdash] then - spaceunits, spacer = descriptions[emdash].width, "emdash" - end - if not spaceunits and charwidth then - spaceunits, spacer = charwidth, "charwidth" - end - else - if descriptions[space] then - spaceunits, spacer = descriptions[space].width, "space" - end - if not spaceunits and descriptions[emdash] then - spaceunits, spacer = descriptions[emdash].width/2, "emdash/2" - end - if not spaceunits and charwidth then - spaceunits, spacer = charwidth, "charwidth" - end - end - spaceunits = tonumber(spaceunits) or units/2 - -- - parameters.slant = 0 - parameters.space = spaceunits -- 3.333 (cmr10) - parameters.space_stretch = units/2 -- 500 -- 1.666 (cmr10) - parameters.space_shrink = 1*units/3 -- 333 -- 1.111 (cmr10) - parameters.x_height = 2*units/5 -- 400 - parameters.quad = units -- 1000 - if spaceunits < 2*units/5 then - -- todo: warning - end - if italicangle and italicangle ~= 0 then - parameters.italicangle = italicangle - parameters.italicfactor = math.cos(math.rad(90+italicangle)) - parameters.slant = - math.tan(italicangle*math.pi/180) - end - if monospaced then - parameters.space_stretch = 0 - parameters.space_shrink = 0 - elseif syncspace then -- - parameters.space_stretch = spaceunits/2 - parameters.space_shrink = spaceunits/3 - end - parameters.extra_space = parameters.space_shrink -- 1.111 (cmr10) - if charxheight then - parameters.x_height = charxheight - else - local x = 0x0078 - if x then - local x = descriptions[x] - if x then - parameters.x_height = x.height - end - end - end - -- - parameters.designsize = (designsize/10)*65536 - parameters.minsize = (minsize /10)*65536 - parameters.maxsize = (maxsize /10)*65536 - parameters.ascender = abs(metadata.ascender or metadata.ascent or 0) - parameters.descender = abs(metadata.descender or metadata.descent or 0) - parameters.units = units - -- - properties.space = spacer - properties.encodingbytes = 2 - properties.format = data.format or otf_format(filename) or formats.otf - properties.noglyphnames = true - properties.filename = filename - properties.fontname = fontname - properties.fullname = fullname - properties.psname = psname - properties.name = filename or fullname - -- - -- properties.name = specification.name - -- properties.sub = specification.sub - -- - if warnings and #warnings > 0 then - report_otf("warnings for font: %s",filename) - report_otf() - for i=1,#warnings do - report_otf(" %s",warnings[i]) - end - report_otf() - end - return { - characters = characters, - descriptions = descriptions, - parameters = parameters, - mathparameters = mathparameters, - resources = resources, - properties = properties, - goodies = goodies, - warnings = warnings, - } - end -end - -local function otftotfm(specification) - local cache_id = specification.hash - local tfmdata = containers.read(constructors.cache,cache_id) - if not tfmdata then - local name = specification.name - local sub = specification.sub - local filename = specification.filename - -- local format = specification.format - local features = specification.features.normal - local rawdata = otf.load(filename,sub,features and features.featurefile) - if rawdata and next(rawdata) then - local descriptions = rawdata.descriptions - local duplicates = rawdata.resources.duplicates - if duplicates then - local nofduplicates, nofduplicated = 0, 0 - for parent, list in next, duplicates do - if type(list) == "table" then - local n = #list - for i=1,n do - local unicode = list[i] - if not descriptions[unicode] then - descriptions[unicode] = descriptions[parent] -- or copy - nofduplicated = nofduplicated + 1 - end - end - nofduplicates = nofduplicates + n - else - if not descriptions[list] then - descriptions[list] = descriptions[parent] -- or copy - nofduplicated = nofduplicated + 1 - end - nofduplicates = nofduplicates + 1 - end - end - if trace_otf and nofduplicated ~= nofduplicates then - report_otf("%i extra duplicates copied out of %i",nofduplicated,nofduplicates) - end - end - rawdata.lookuphash = { } - tfmdata = copytotfm(rawdata,cache_id) - if tfmdata and next(tfmdata) then - -- at this moment no characters are assigned yet, only empty slots - local features = constructors.checkedfeatures("otf",features) - local shared = tfmdata.shared - if not shared then - shared = { } - tfmdata.shared = shared - end - shared.rawdata = rawdata - -- shared.features = features -- default - shared.dynamics = { } - -- shared.processes = { } - tfmdata.changed = { } - shared.features = features - shared.processes = otf.setfeatures(tfmdata,features) - end - end - containers.write(constructors.cache,cache_id,tfmdata) - end - return tfmdata -end - -local function read_from_otf(specification) - local tfmdata = otftotfm(specification) - if tfmdata then - -- this late ? .. needs checking - tfmdata.properties.name = specification.name - tfmdata.properties.sub = specification.sub - -- - tfmdata = constructors.scale(tfmdata,specification) - local allfeatures = tfmdata.shared.features or specification.features.normal - constructors.applymanipulators("otf",tfmdata,allfeatures,trace_features,report_otf) - constructors.setname(tfmdata,specification) -- only otf? - fonts.loggers.register(tfmdata,file.suffix(specification.filename),specification) - end - return tfmdata -end - -local function checkmathsize(tfmdata,mathsize) - local mathdata = tfmdata.shared.rawdata.metadata.math - local mathsize = tonumber(mathsize) - if mathdata then -- we cannot use mathparameters as luatex will complain - local parameters = tfmdata.parameters - parameters.scriptpercentage = mathdata.ScriptPercentScaleDown - parameters.scriptscriptpercentage = mathdata.ScriptScriptPercentScaleDown - parameters.mathsize = mathsize - end -end - -registerotffeature { - name = "mathsize", - description = "apply mathsize specified in the font", - initializers = { - base = checkmathsize, - node = checkmathsize, - } -} - --- helpers - -function otf.collectlookups(rawdata,kind,script,language) - local sequences = rawdata.resources.sequences - if sequences then - local featuremap, featurelist = { }, { } - for s=1,#sequences do - local sequence = sequences[s] - local features = sequence.features - features = features and features[kind] - features = features and (features[script] or features[default] or features[wildcard]) - features = features and (features[language] or features[default] or features[wildcard]) - if features then - local subtables = sequence.subtables - if subtables then - for s=1,#subtables do - local ss = subtables[s] - if not featuremap[s] then - featuremap[ss] = true - featurelist[#featurelist+1] = ss - end - end - end - end - end - if #featurelist > 0 then - return featuremap, featurelist - end - end - return nil, nil -end - --- readers (a bit messy, this forced so I might redo that bit: foo.ttf FOO.ttf foo.TTF FOO.TTF) - -local function check_otf(forced,specification,suffix) - local name = specification.name - if forced then - name = specification.forcedname -- messy - end - local fullname = findbinfile(name,suffix) or "" - if fullname == "" then - fullname = fonts.names.getfilename(name,suffix) or "" - end - if fullname ~= "" and not fonts.names.ignoredfile(fullname) then - specification.filename = fullname - return read_from_otf(specification) - end -end - -local function opentypereader(specification,suffix) - local forced = specification.forced or "" - if formats[forced] then - return check_otf(true,specification,forced) - else - return check_otf(false,specification,suffix) - end -end - -readers.opentype = opentypereader -- kind of useless and obsolete - -function readers.otf (specification) return opentypereader(specification,"otf") end -function readers.ttf (specification) return opentypereader(specification,"ttf") end -function readers.ttc (specification) return opentypereader(specification,"ttf") end -function readers.dfont(specification) return opentypereader(specification,"ttf") end - --- this will be overloaded - -function otf.scriptandlanguage(tfmdata,attr) - local properties = tfmdata.properties - return properties.script or "dflt", properties.language or "dflt" -end - --- a little bit of abstraction - -local function justset(coverage,unicode,replacement) - coverage[unicode] = replacement -end - -otf.coverup = { - stepkey = "subtables", - actions = { - substitution = justset, - alternate = justset, - multiple = justset, - ligature = justset, - kern = justset, - pair = justset, - chainsubstitution = justset, - chainposition = justset, - }, - register = function(coverage,lookuptype,format,feature,n,descriptions,resources) - local name = formatters["ctx_%s_%s_%s"](feature,lookuptype,n) -- we can have a mix of types - if lookuptype == "kern" then - resources.lookuptypes[name] = "position" - else - resources.lookuptypes[name] = lookuptype - end - for u, c in next, coverage do - local description = descriptions[u] - local slookups = description.slookups - if slookups then - slookups[name] = c - else - description.slookups = { [name] = c } - end - end - return name - end -} - --- moved from font-oth.lua - -local function getgsub(tfmdata,k,kind) - local description = tfmdata.descriptions[k] - if description then - local slookups = description.slookups -- we assume only slookups (we can always extend) - if slookups then - local shared = tfmdata.shared - local rawdata = shared and shared.rawdata - if rawdata then - local lookuptypes = rawdata.resources.lookuptypes - if lookuptypes then - local properties = tfmdata.properties - -- we could cache these - local validlookups, lookuplist = otf.collectlookups(rawdata,kind,properties.script,properties.language) - if validlookups then - for l=1,#lookuplist do - local lookup = lookuplist[l] - local found = slookups[lookup] - if found then - return found, lookuptypes[lookup] - end - end - end - end - end - end - end -end - -otf.getgsub = getgsub -- returns value, gsub_kind - -function otf.getsubstitution(tfmdata,k,kind,value) - local found, kind = getgsub(tfmdata,k,kind) - if not found then - -- - elseif kind == "substitution" then - return found - elseif kind == "alternate" then - local choice = tonumber(value) or 1 -- no random here (yet) - return found[choice] or found[1] or k - end - return k -end - -otf.getalternate = otf.getsubstitution - -function otf.getmultiple(tfmdata,k,kind) - local found, kind = getgsub(tfmdata,k,kind) - if found and kind == "multiple" then - return found - end - return { k } -end - -function otf.getkern(tfmdata,left,right,kind) - local kerns = getgsub(tfmdata,left,kind or "kern",true) -- for now we use getsub - if kerns then - local found = kerns[right] - local kind = type(found) - if kind == "table" then - found = found[1][3] -- can be more clever - elseif kind ~= "number" then - found = false - end - if found then - return found * tfmdata.parameters.factor - end - end - return 0 -end - - -registerotfenhancer("prepare tables", enhance_prepare_tables) - -registerotfenhancer("prepare glyphs", enhance_prepare_glyphs) -registerotfenhancer("prepare lookups", enhance_prepare_lookups) - -registerotfenhancer("analyze glyphs", enhance_analyze_glyphs) -registerotfenhancer("analyze math", enhance_analyze_math) - -registerotfenhancer("reorganize lookups", enhance_reorganize_lookups) -registerotfenhancer("reorganize mark classes", enhance_reorganize_mark_classes) -registerotfenhancer("reorganize anchor classes", enhance_reorganize_anchor_classes) - -registerotfenhancer("reorganize glyph kerns", enhance_reorganize_glyph_kerns) -registerotfenhancer("reorganize glyph lookups", enhance_reorganize_glyph_lookups) -registerotfenhancer("reorganize glyph anchors", enhance_reorganize_glyph_anchors) - -registerotfenhancer("merge kern classes", enhance_merge_kern_classes) - -registerotfenhancer("reorganize features", enhance_reorganize_features) -registerotfenhancer("reorganize subtables", enhance_reorganize_subtables) - -registerotfenhancer("check glyphs", enhance_check_glyphs) -registerotfenhancer("check metadata", enhance_check_metadata) - -registerotfenhancer("prepare tounicode", enhance_prepare_tounicode) - -registerotfenhancer("check encoding", enhance_check_encoding) -registerotfenhancer("add duplicates", enhance_add_duplicates) - -registerotfenhancer("expand lookups", enhance_expand_lookups) - -registerotfenhancer("check extra features", function() end) --placeholder, will be overloaded - -registerotfenhancer("cleanup tables", enhance_cleanup_tables) - -registerotfenhancer("compact lookups", enhance_compact_lookups) -registerotfenhancer("purge names", enhance_purge_names) diff --git a/tex/context/base/mkiv/font-otj.lua b/tex/context/base/mkiv/font-otj.lua index 2c79500e7..1f9fd1ac1 100644 --- a/tex/context/base/mkiv/font-otj.lua +++ b/tex/context/base/mkiv/font-otj.lua @@ -7,7 +7,7 @@ if not modules then modules = { } end modules ['font-otj'] = { } -- This property based variant is not faster but looks nicer than the attribute one. We --- need to use rawget (which is apbout 4 times slower than a direct access but we cannot +-- need to use rawget (which is about 4 times slower than a direct access but we cannot -- get/set that one for our purpose! This version does a bit more with discretionaries -- (and Kai has tested it with his collection of weird fonts.) @@ -21,7 +21,13 @@ if not modules then modules = { } end modules ['font-otj'] = { -- The use_advance code was just a test and is meant for testing and manuals. There is no -- performance (or whatever) gain and using kerns is somewhat cleaner (at least for now). --- Maybe: subtype fontkern when pure kerns. +-- An alternative is to have a list per base of all marks and then do a run over the node +-- list that resolves the accumulated l/r/x/y and then do an inject pass. + +-- if needed we can flag a kern node as immutable + +-- The thing with these positioning options is that it is not clear what Uniscribe does with +-- the 2rl flag and we keep oscillating a between experiments. if not nodes.properties then return end @@ -43,6 +49,7 @@ local attributes, nodes, node = attributes, nodes, node fonts = fonts local hashes = fonts.hashes local fontdata = hashes.identifiers +local fontmarks = hashes.marks ----- parameters = fonts.hashes.parameters -- not in generic ----- resources = fonts.hashes.resources -- not in generic @@ -62,12 +69,9 @@ local glue_code = nodecodes.glue local nuts = nodes.nuts local nodepool = nuts.pool -local newkern = nodepool.kern - local tonode = nuts.tonode local tonut = nuts.tonut -local getfield = nuts.getfield local setfield = nuts.setfield local getnext = nuts.getnext local getprev = nuts.getprev @@ -93,65 +97,70 @@ local insert_node_after = nuts.insert_after local properties = nodes.properties.data -function injections.installnewkern(nk) - newkern = nk or newkern -end +local fontkern = nuts.pool and nuts.pool.fontkern -- context +local italickern = nuts.pool and nuts.pool.italickern -- context + +local useitalickerns = false + +directives.register("fonts.injections.useitalics", function(v) + if v then + report_injections("using italics for space kerns (tracing only)") + end + useitalickerns = v +end) + +do if not fontkern then -- generic + + local thekern = nuts.new("kern",0) -- fontkern + local setkern = nuts.setkern + local copy_node = nuts.copy_node -local nofregisteredkerns = 0 -local nofregisteredpairs = 0 -local nofregisteredmarks = 0 -local nofregisteredcursives = 0 -local keepregisteredcounts = false + fontkern = function(k) + local n = copy_node(thekern) + setkern(n,k) + return n + end + + local thekern = nuts.new("kern",3) -- italiccorrection + local setkern = nuts.setkern + local copy_node = nuts.copy_node + + italickern = function(k) + local n = copy_node(thekern) + setkern(n,k) + return n + end + +end end + +function injections.installnewkern() end -- obsolete + +local nofregisteredkerns = 0 +local nofregisteredpositions = 0 +local nofregisteredmarks = 0 +local nofregisteredcursives = 0 +local keepregisteredcounts = false function injections.keepcounts() keepregisteredcounts = true end function injections.resetcounts() - nofregisteredkerns = 0 - nofregisteredpairs = 0 - nofregisteredmarks = 0 - nofregisteredcursives = 0 - keepregisteredcounts = false + nofregisteredkerns = 0 + nofregisteredpositions = 0 + nofregisteredmarks = 0 + nofregisteredcursives = 0 + keepregisteredcounts = false end -- We need to make sure that a possible metatable will not kick in unexpectedly. --- function injections.reset(n) --- local p = rawget(properties,n) --- if p and rawget(p,"injections") then --- p.injections = nil --- end --- end - --- function injections.copy(target,source) --- local sp = rawget(properties,source) --- if sp then --- local tp = rawget(properties,target) --- local si = rawget(sp,"injections") --- if si then --- si = fastcopy(si) --- if tp then --- tp.injections = si --- else --- properties[target] = { --- injections = si, --- } --- end --- else --- if tp then --- tp.injections = nil --- end --- end --- end --- end - function injections.reset(n) local p = rawget(properties,n) if p then - p.injections = false -- { } + p.injections = false -- { } -- nil should work too as we use rawget else - properties[n] = false -- { injections = { } } + properties[n] = false -- { injections = { } } -- nil should work too as we use rawget end end @@ -159,7 +168,6 @@ function injections.copy(target,source) local sp = rawget(properties,source) if sp then local tp = rawget(properties,target) - -- local si = rawget(sp,"injections") local si = sp.injections if si then si = fastcopy(si) @@ -185,10 +193,9 @@ function injections.copy(target,source) end end -function injections.setligaindex(n,index) +function injections.setligaindex(n,index) -- todo: don't set when 0 local p = rawget(properties,n) if p then - -- local i = rawget(p,"injections") local i = p.injections if i then i.ligaindex = index @@ -209,7 +216,6 @@ end function injections.getligaindex(n,default) local p = rawget(properties,n) if p then - -- local i = rawget(p,"injections") local i = p.injections if i then return i.ligaindex or default @@ -218,7 +224,15 @@ function injections.getligaindex(n,default) return default end -function injections.setcursive(start,nxt,factor,rlmode,exit,entry,tfmstart,tfmnext) -- hm: nuts or nodes +function injections.setcursive(start,nxt,factor,rlmode,exit,entry,tfmstart,tfmnext,r2lflag) + + -- The standard says something about the r2lflag related to the first in a series: + -- + -- When this bit is set, the last glyph in a given sequence to which the cursive + -- attachment lookup is applied, will be positioned on the baseline. + -- + -- But it looks like we don't need to consider it. + local dx = factor*(exit[1]-entry[1]) local dy = -factor*(exit[2]-entry[2]) local ws = tfmstart.width @@ -236,7 +250,6 @@ function injections.setcursive(start,nxt,factor,rlmode,exit,entry,tfmstart,tfmne -- local p = rawget(properties,start) if p then - -- local i = rawget(p,"injections") local i = p.injections if i then i.cursiveanchor = true @@ -254,7 +267,6 @@ function injections.setcursive(start,nxt,factor,rlmode,exit,entry,tfmstart,tfmne end local p = rawget(properties,nxt) if p then - -- local i = rawget(p,"injections") local i = p.injections if i then i.cursivex = dx @@ -276,7 +288,9 @@ function injections.setcursive(start,nxt,factor,rlmode,exit,entry,tfmstart,tfmne return dx, dy, nofregisteredcursives end -function injections.setpair(current,factor,rlmode,r2lflag,spec,injection) -- r2lflag & tfmchr not used +-- kind: 0=single 1=first of pair, 2=second of pair + +function injections.setposition(kind,current,factor,rlmode,spec,injection) local x = factor*spec[1] local y = factor*spec[2] local w = factor*spec[3] @@ -286,7 +300,7 @@ function injections.setpair(current,factor,rlmode,r2lflag,spec,injection) -- r2l local leftkern = x -- both kerns are set in a pair kern compared local rightkern = w - x -- to normal kerns where we set only leftkern if leftkern ~= 0 or rightkern ~= 0 or yoffset ~= 0 then - nofregisteredpairs = nofregisteredpairs + 1 + nofregisteredpositions = nofregisteredpositions + 1 if rlmode and rlmode < 0 then leftkern, rightkern = rightkern, leftkern end @@ -295,8 +309,7 @@ function injections.setpair(current,factor,rlmode,r2lflag,spec,injection) -- r2l end local p = rawget(properties,current) if p then - -- local i = p[injection] - local i = rawget(p,injection) + local i = p[injection] if i then if leftkern ~= 0 then i.leftkern = (i.leftkern or 0) + leftkern @@ -333,15 +346,15 @@ function injections.setpair(current,factor,rlmode,r2lflag,spec,injection) -- r2l }, } end - return x, y, w, h, nofregisteredpairs + return x, y, w, h, nofregisteredpositions end end return x, y, w, h -- no bound end --- This needs checking for rl < 0 but it is unlikely that a r2l script uses kernclasses between --- glyphs so we're probably safe (KE has a problematic font where marks interfere with rl < 0 in --- the previous case) +-- The next one is used for simple kerns coming from a truetype kern table. The r2l +-- variant variant needs checking but it is unlikely that a r2l script uses thsi +-- feature. function injections.setkern(current,factor,rlmode,x,injection) local dx = factor * x @@ -352,8 +365,7 @@ function injections.setkern(current,factor,rlmode,x,injection) injection = "injections" end if p then - -- local i = rawget(p,injection) - local i = rawget(p,injection) + local i = p[injection] if i then i.leftkern = dx + (i.leftkern or 0) else @@ -374,8 +386,62 @@ function injections.setkern(current,factor,rlmode,x,injection) end end -function injections.setmark(start,base,factor,rlmode,ba,ma,tfmbase,mkmk,checkmark) -- ba=baseanchor, ma=markanchor +-- This one is an optimization of pairs where we have only a "w" entry. This one is +-- potentially different from the previous one wrt r2l. It needs checking. The +-- optimization relates to smaller tma files. +function injections.setmove(current,factor,rlmode,x,injection) + local dx = factor * x + if dx ~= 0 then + nofregisteredkerns = nofregisteredkerns + 1 + local p = rawget(properties,current) + if not injection then + injection = "injections" + end + if rlmode and rlmode < 0 then + -- we need to swap with a single so then we also need to to it here + -- as move is just a simple single + if p then + local i = p[injection] + if i then + i.rightkern = dx + (i.rightkern or 0) + else + p[injection] = { + rightkern = dx, + } + end + else + properties[current] = { + [injection] = { + rightkern = dx, + }, + } + end + else + if p then + local i = p[injection] + if i then + i.leftkern = dx + (i.leftkern or 0) + else + p[injection] = { + leftkern = dx, + } + end + else + properties[current] = { + [injection] = { + leftkern = dx, + }, + } + end + end + return dx, nofregisteredkerns + else + return 0, 0 + end +end + +function injections.setmark(start,base,factor,rlmode,ba,ma,tfmbase,mkmk,checkmark) -- ba=baseanchor, ma=markanchor local dx, dy = factor*(ba[1]-ma[1]), factor*(ba[2]-ma[2]) nofregisteredmarks = nofregisteredmarks + 1 if rlmode >= 0 then @@ -384,15 +450,20 @@ function injections.setmark(start,base,factor,rlmode,ba,ma,tfmbase,mkmk,checkmar local p = rawget(properties,start) -- hm, dejavu serif does a sloppy mark2mark before mark2base if p then - -- local i = rawget(p,"injections") local i = p.injections if i then if i.markmark then -- out of order mkmk: yes or no or option else - i.markx = dx - i.marky = dy - i.markdir = rlmode or 0 + if dx ~= 0 then + i.markx = dx + end + if y ~= 0 then + i.marky = dy + end + if rlmode then + i.markdir = rlmode + end i.markbase = nofregisteredmarks i.markbasenode = base i.markmark = mkmk @@ -438,7 +509,7 @@ local function show(n,what,nested,symbol) if n then local p = rawget(properties,n) if p then - local i = rawget(p,what) + local i = p[what] if i then local leftkern = i.leftkern or 0 local rightkern = i.rightkern or 0 @@ -480,7 +551,7 @@ end local function showsub(n,what,where) report_injections("begin subrun: %s",where) - for n in traverse_id(glyph_code,n) do + for n in traverse_char(n) do showchar(n,where) show(n,what,where," ") end @@ -488,8 +559,9 @@ local function showsub(n,what,where) end local function trace(head,where) - report_injections("begin run %s: %s kerns, %s pairs, %s marks and %s cursives registered", - where or "",nofregisteredkerns,nofregisteredpairs,nofregisteredmarks,nofregisteredcursives) + report_injections() + report_injections("begin run %s: %s kerns, %s positions, %s marks and %s cursives registered", + where or "",nofregisteredkerns,nofregisteredpositions,nofregisteredmarks,nofregisteredcursives) local n = head while n do local id = getid(n) @@ -537,6 +609,7 @@ local function show_result(head) end current = getnext(current) end + report_injections() end -- G +D-pre G @@ -556,7 +629,7 @@ local function inject_kerns_only(head,where) local prev = nil local next = nil local prevdisc = nil - local prevglyph = nil + -- local prevglyph = nil local pre = nil -- saves a lookup local post = nil -- saves a lookup local replace = nil -- saves a lookup @@ -569,46 +642,42 @@ local function inject_kerns_only(head,where) if char then local p = rawget(properties,current) if p then - -- local i = rawget(p,"injections") local i = p.injections if i then -- left|glyph|right local leftkern = i.leftkern if leftkern and leftkern ~= 0 then - head = insert_node_before(head,current,newkern(leftkern)) + head = insert_node_before(head,current,fontkern(leftkern)) end end if prevdisc then local done = false if post then - -- local i = rawget(p,"postinjections") local i = p.postinjections if i then local leftkern = i.leftkern if leftkern and leftkern ~= 0 then - setlink(posttail,newkern(leftkern)) + setlink(posttail,fontkern(leftkern)) done = true end end end if replace then - -- local i = rawget(p,"replaceinjections") local i = p.replaceinjections if i then local leftkern = i.leftkern if leftkern and leftkern ~= 0 then - setlink(replacetail,newkern(leftkern)) + setlink(replacetail,fontkern(leftkern)) done = true end end else - -- local i = rawget(p,"emptyinjections") local i = p.emptyinjections if i then -- glyph|disc|glyph (special case) local leftkern = i.leftkern if leftkern and leftkern ~= 0 then - setfield(prev,"replace",newkern(leftkern)) -- maybe also leftkern + setfield(prev,"replace",fontkern(leftkern)) -- maybe also leftkern end end end @@ -618,11 +687,11 @@ local function inject_kerns_only(head,where) end end prevdisc = nil - prevglyph = current + -- prevglyph = current elseif char == false then -- other font prevdisc = nil - prevglyph = current + -- prevglyph = current elseif id == disc_code then pre, post, replace, pretail, posttail, replacetail = getdisc(current,true) local done = false @@ -631,12 +700,11 @@ local function inject_kerns_only(head,where) for n in traverse_char(pre) do local p = rawget(properties,n) if p then - -- local i = rawget(p,"injections") or rawget(p,"preinjections") local i = p.injections or p.preinjections if i then local leftkern = i.leftkern if leftkern and leftkern ~= 0 then - pre = insert_node_before(pre,n,newkern(leftkern)) + pre = insert_node_before(pre,n,fontkern(leftkern)) done = true end end @@ -648,12 +716,11 @@ local function inject_kerns_only(head,where) for n in traverse_char(post) do local p = rawget(properties,n) if p then - -- local i = rawget(p,"injections") or rawget(p,"postinjections") local i = p.injections or p.postinjections if i then local leftkern = i.leftkern if leftkern and leftkern ~= 0 then - post = insert_node_before(post,n,newkern(leftkern)) + post = insert_node_before(post,n,fontkern(leftkern)) done = true end end @@ -665,12 +732,11 @@ local function inject_kerns_only(head,where) for n in traverse_char(replace) do local p = rawget(properties,n) if p then - -- local i = rawget(p,"injections") or rawget(p,"replaceinjections") local i = p.injections or p.replaceinjections if i then local leftkern = i.leftkern if leftkern and leftkern ~= 0 then - replace = insert_node_before(replace,n,newkern(leftkern)) + replace = insert_node_before(replace,n,fontkern(leftkern)) done = true end end @@ -680,10 +746,10 @@ local function inject_kerns_only(head,where) if done then setdisc(current,pre,post,replace) end - prevglyph = nil + -- prevglyph = nil prevdisc = current else - prevglyph = nil + -- prevglyph = nil prevdisc = nil end prev = current @@ -695,13 +761,16 @@ local function inject_kerns_only(head,where) else nofregisteredkerns = 0 end + if trace_injections then + show_result(head) + end return tonode(head), true end -local function inject_pairs_only(head,where) +local function inject_positions_only(head,where) head = tonut(head) if trace_injections then - trace(head,"pairs") + trace(head,"positions") end local current = head local prev = nil @@ -720,7 +789,6 @@ local function inject_pairs_only(head,where) if char then local p = rawget(properties,current) if p then - -- local i = rawget(p,"injections") local i = p.injections if i then -- left|glyph|right @@ -728,27 +796,30 @@ local function inject_pairs_only(head,where) if yoffset and yoffset ~= 0 then setoffsets(current,false,yoffset) end - local leftkern = i.leftkern + local leftkern = i.leftkern + local rightkern = i.rightkern if leftkern and leftkern ~= 0 then - head = insert_node_before(head,current,newkern(leftkern)) + if rightkern and leftkern == -rightkern then + setoffsets(current,leftkern,false) + rightkern = 0 + else + head = insert_node_before(head,current,fontkern(leftkern)) + end end - local rightkern = i.rightkern if rightkern and rightkern ~= 0 then - insert_node_after(head,current,newkern(rightkern)) + insert_node_after(head,current,fontkern(rightkern)) end else - -- local i = rawget(p,"emptyinjections") local i = p.emptyinjections if i then -- glyph|disc|glyph (special case) --- is this okay? local rightkern = i.rightkern if rightkern and rightkern ~= 0 then if next and getid(next) == disc_code then if replace then -- error, we expect an empty one else - setfield(next,"replace",newkern(rightkern)) -- maybe also leftkern + setfield(next,"replace",fontkern(rightkern)) -- maybe also leftkern end end end @@ -757,23 +828,21 @@ local function inject_pairs_only(head,where) if prevdisc then local done = false if post then - -- local i = rawget(p,"postinjections") local i = p.postinjections if i then local leftkern = i.leftkern if leftkern and leftkern ~= 0 then - setlink(posttail,newkern(leftkern)) + setlink(posttail,fontkern(leftkern)) done = true end end end if replace then - -- local i = rawget(p,"replaceinjections") local i = p.replaceinjections if i then local leftkern = i.leftkern if leftkern and leftkern ~= 0 then - setlink(replacetail,newkern(leftkern)) + setlink(replacetail,fontkern(leftkern)) done = true end end @@ -783,7 +852,7 @@ local function inject_pairs_only(head,where) -- new .. okay? local leftkern = i.leftkern if leftkern and leftkern ~= 0 then - setfield(prev,"replace",newkern(leftkern)) -- maybe also leftkern + setfield(prev,"replace",fontkern(leftkern)) -- maybe also leftkern end end end @@ -805,7 +874,6 @@ local function inject_pairs_only(head,where) for n in traverse_char(pre) do local p = rawget(properties,n) if p then - -- local i = rawget(p,"injections") or rawget(p,"preinjections") local i = p.injections or p.preinjections if i then local yoffset = i.yoffset @@ -814,12 +882,12 @@ local function inject_pairs_only(head,where) end local leftkern = i.leftkern if leftkern and leftkern ~= 0 then - pre = insert_node_before(pre,n,newkern(leftkern)) + pre = insert_node_before(pre,n,fontkern(leftkern)) done = true end local rightkern = i.rightkern if rightkern and rightkern ~= 0 then - insert_node_after(pre,n,newkern(rightkern)) + insert_node_after(pre,n,fontkern(rightkern)) done = true end end @@ -831,7 +899,6 @@ local function inject_pairs_only(head,where) for n in traverse_char(post) do local p = rawget(properties,n) if p then - -- local i = rawget(p,"injections") or rawget(p,"postinjections") local i = p.injections or p.postinjections if i then local yoffset = i.yoffset @@ -840,12 +907,12 @@ local function inject_pairs_only(head,where) end local leftkern = i.leftkern if leftkern and leftkern ~= 0 then - post = insert_node_before(post,n,newkern(leftkern)) + post = insert_node_before(post,n,fontkern(leftkern)) done = true end local rightkern = i.rightkern if rightkern and rightkern ~= 0 then - insert_node_after(post,n,newkern(rightkern)) + insert_node_after(post,n,fontkern(rightkern)) done = true end end @@ -857,7 +924,6 @@ local function inject_pairs_only(head,where) for n in traverse_char(replace) do local p = rawget(properties,n) if p then - -- local i = rawget(p,"injections") or rawget(p,"replaceinjections") local i = p.injections or p.replaceinjections if i then local yoffset = i.yoffset @@ -866,12 +932,12 @@ local function inject_pairs_only(head,where) end local leftkern = i.leftkern if leftkern and leftkern ~= 0 then - replace = insert_node_before(replace,n,newkern(leftkern)) + replace = insert_node_before(replace,n,fontkern(leftkern)) done = true end local rightkern = i.rightkern if rightkern and rightkern ~= 0 then - insert_node_after(replace,n,newkern(rightkern)) + insert_node_after(replace,n,fontkern(rightkern)) done = true end end @@ -882,13 +948,12 @@ local function inject_pairs_only(head,where) if pre then local p = rawget(properties,prevglyph) if p then - -- local i = rawget(p,"preinjections") local i = p.preinjections if i then -- glyph|pre glyphs local rightkern = i.rightkern if rightkern and rightkern ~= 0 then - pre = insert_node_before(pre,pre,newkern(rightkern)) + pre = insert_node_before(pre,pre,fontkern(rightkern)) done = true end end @@ -897,13 +962,12 @@ local function inject_pairs_only(head,where) if replace then local p = rawget(properties,prevglyph) if p then - -- local i = rawget(p,"replaceinjections") local i = p.replaceinjections if i then -- glyph|replace glyphs local rightkern = i.rightkern if rightkern and rightkern ~= 0 then - replace = insert_node_before(replace,replace,newkern(rightkern)) + replace = insert_node_before(replace,replace,fontkern(rightkern)) done = true end end @@ -926,7 +990,10 @@ local function inject_pairs_only(head,where) if keepregisteredcounts then keepregisteredcounts = false else - nofregisteredkerns = 0 + nofregisteredpositions = 0 + end + if trace_injections then + show_result(head) end return tonode(head), true end @@ -934,9 +1001,7 @@ end local function showoffset(n,flag) local x, y = getoffsets(n) if x ~= 0 or y ~= 0 then - setcolor(n,flag and "darkred" or "darkgreen") - else - resetcolor(n) + setcolor(n,"darkgray") end end @@ -950,8 +1015,6 @@ local function inject_everything(head,where) -- local current = head local last = nil - local font = font - local markdata = nil local prev = nil local next = nil local prevdisc = nil @@ -979,46 +1042,46 @@ local function inject_everything(head,where) local rightkern = nil local pp = rawget(properties,p) if pp then - -- pp = rawget(pp,"injections") pp = pp.injections if pp then rightkern = pp.rightkern end end + local markdir = pn.markdir if rightkern then -- x and w ~= 0 - if pn.markdir < 0 then + ox = px - (pn.markx or 0) - rightkern + if markdir and markdir < 0 then -- kern(w-x) glyph(p) kern(x) mark(n) - ox = px - pn.markx - rightkern - -- report_injections("r2l case 1: %p",ox) + if not pn.markmark then + ox = ox + (pn.leftkern or 0) + end else -- kern(x) glyph(p) kern(w-x) mark(n) - -- ox = px - getwidth(p) + pn.markx - pp.leftkern -- -- According to Kai we don't need to handle leftkern here but I'm -- pretty sure I've run into a case where it was needed so maybe -- some day we need something more clever here. -- + -- maybe we need to apply both then + -- if false then - -- a mark with kerning + -- a mark with kerning (maybe husayni needs it ) local leftkern = pp.leftkern if leftkern then - ox = px - pn.markx - leftkern - else - ox = px - pn.markx + ox = ox - leftkern end - else - ox = px - pn.markx - rightkern -- seguiemj needs the rightkern end end else - -- if pn.markdir < 0 then - -- ox = px - pn.markx - -- -- report_injections("r2l case 3: %p",ox) - -- else - -- -- ox = px - getwidth(p) + pn.markx - ox = px - pn.markx - -- report_injections("l2r case 3: %p",ox) - -- end + ox = px - (pn.markx or 0) + if markdir and markdir < 0 then + if not pn.markmark then + local leftkern = pn.leftkern + if leftkern then + ox = ox + leftkern -- husayni needs it + end + end + end if pn.checkmark then local wn = getwidth(n) -- in arial marks have widths if wn and wn ~= 0 then @@ -1027,34 +1090,99 @@ local function inject_everything(head,where) report_injections("correcting non zero width mark %C",getchar(n)) end -- -- bad: we should center + -- -- pn.leftkern = -wn -- pn.rightkern = -wn - -- -- we're too late anyway as kerns are already injected so - -- -- we do it the ugly way (no checking if the previous is - -- -- already a kern) .. maybe we should fix the font instead - -- hm, no head ? - insert_node_before(n,n,newkern(-wn)) - insert_node_after(n,n,newkern(-wn)) + -- + -- -- we're too late anyway as kerns are already injected so we do it the + -- -- ugly way (no checking if the previous is already a kern) .. maybe we + -- -- should fix the font instead + -- + -- todo: head and check for prev / next kern + -- + insert_node_before(n,n,fontkern(-wn)) + insert_node_after(n,n,fontkern(-wn)) end end end - local oy = ny + py + pn.marky + local oy = ny + py + (pn.marky or 0) + if not pn.markmark then + local yoffset = pn.yoffset + if yoffset then + oy = oy + yoffset -- husayni needs it + end + end setoffsets(n,ox,oy) if trace_marks then showoffset(n,true) end end - -- todo: marks in disc + -- begin of temp fix -- + local base = nil -- bah, some arabic fonts have no mark anchoring + -- end of temp fix -- while current do local next = getnext(current) local char, id = ischar(current) if char then local p = rawget(properties,current) + -- begin of temp fix -- + if hascursives then + if not p then + local m = fontmarks[getfont(current)] + if m and m[char] then + if base then + p = { injections = { markbasenode = base } } + nofmarks = nofmarks + 1 + marks[nofmarks] = current + properties[current] = p + hasmarks = true + end + else + base = current + end + end + end + -- end of temp fix if p then - -- local i = rawget(p,"injections") local i = p.injections + -- begin of temp fix -- + if hascursives then + if not i then + local m = fontmarks[getfont(current)] + if m and m[char] then + if base then + i = { markbasenode = base } + nofmarks = nofmarks + 1 + marks[nofmarks] = current + p.injections = i + hasmarks = true + end + else + base = current + end + end + end + -- end of temp fix -- if i then local pm = i.markbasenode + -- begin of temp fix -- + if hascursives then + if not pm then + local m = fontmarks[getfont(current)] + if m and m[char] then + if base then + pm = base + i.markbasenode = pm + hasmarks = true + end + else + base = current + end + else + base = current + end + end + -- end of temp fix -- if pm then nofmarks = nofmarks + 1 marks[nofmarks] = current @@ -1115,28 +1243,31 @@ local function inject_everything(head,where) end end -- left|glyph|right - local leftkern = i.leftkern + local leftkern = i.leftkern + local rightkern = i.rightkern if leftkern and leftkern ~= 0 then - head = insert_node_before(head,current,newkern(leftkern)) + if rightkern and leftkern == -rightkern then + setoffsets(current,leftkern,false) + rightkern = 0 + else + head = insert_node_before(head,current,fontkern(leftkern)) + end end - local rightkern = i.rightkern if rightkern and rightkern ~= 0 then - insert_node_after(head,current,newkern(rightkern)) + insert_node_after(head,current,fontkern(rightkern)) end end else - -- local i = rawget(p,"emptyinjections") local i = p.emptyinjections if i then -- glyph|disc|glyph (special case) - -- okay? local rightkern = i.rightkern if rightkern and rightkern ~= 0 then if next and getid(next) == disc_code then if replace then -- error, we expect an empty one else - setfield(next,"replace",newkern(rightkern)) -- maybe also leftkern + setfield(next,"replace",fontkern(rightkern)) -- maybe also leftkern end end end @@ -1146,33 +1277,30 @@ local function inject_everything(head,where) if p then local done = false if post then - -- local i = rawget(p,"postinjections") local i = p.postinjections if i then local leftkern = i.leftkern if leftkern and leftkern ~= 0 then - setlink(posttail,newkern(leftkern)) + setlink(posttail,fontkern(leftkern)) done = true end end end if replace then - -- local i = rawget(p,"replaceinjections") local i = p.replaceinjections if i then local leftkern = i.leftkern if leftkern and leftkern ~= 0 then - setlink(replacetail,newkern(leftkern)) + setlink(replacetail,fontkern(leftkern)) done = true end end else - -- local i = rawget(p,"emptyinjections") local i = p.emptyinjections if i then local leftkern = i.leftkern if leftkern and leftkern ~= 0 then - setfield(prev,"replace",newkern(leftkern)) -- maybe also leftkern + setfield(prev,"replace",fontkern(leftkern)) -- maybe also leftkern end end end @@ -1208,7 +1336,6 @@ local function inject_everything(head,where) for n in traverse_char(pre) do local p = rawget(properties,n) if p then - -- local i = rawget(p,"injections") or rawget(p,"preinjections") local i = p.injections or p.preinjections if i then local yoffset = i.yoffset @@ -1217,12 +1344,12 @@ local function inject_everything(head,where) end local leftkern = i.leftkern if leftkern and leftkern ~= 0 then - pre = insert_node_before(pre,n,newkern(leftkern)) + pre = insert_node_before(pre,n,fontkern(leftkern)) done = true end local rightkern = i.rightkern if rightkern and rightkern ~= 0 then - insert_node_after(pre,n,newkern(rightkern)) + insert_node_after(pre,n,fontkern(rightkern)) done = true end if hasmarks then @@ -1240,7 +1367,6 @@ local function inject_everything(head,where) for n in traverse_char(post) do local p = rawget(properties,n) if p then - -- local i = rawget(p,"injections") or rawget(p,"postinjections") local i = p.injections or p.postinjections if i then local yoffset = i.yoffset @@ -1249,12 +1375,12 @@ local function inject_everything(head,where) end local leftkern = i.leftkern if leftkern and leftkern ~= 0 then - post = insert_node_before(post,n,newkern(leftkern)) + post = insert_node_before(post,n,fontkern(leftkern)) done = true end local rightkern = i.rightkern if rightkern and rightkern ~= 0 then - insert_node_after(post,n,newkern(rightkern)) + insert_node_after(post,n,fontkern(rightkern)) done = true end if hasmarks then @@ -1272,7 +1398,6 @@ local function inject_everything(head,where) for n in traverse_char(replace) do local p = rawget(properties,n) if p then - -- local i = rawget(p,"injections") or rawget(p,"replaceinjections") local i = p.injections or p.replaceinjections if i then local yoffset = i.yoffset @@ -1281,12 +1406,12 @@ local function inject_everything(head,where) end local leftkern = i.leftkern if leftkern and leftkern ~= 0 then - replace = insert_node_before(replace,n,newkern(leftkern)) + replace = insert_node_before(replace,n,fontkern(leftkern)) done = true end local rightkern = i.rightkern if rightkern and rightkern ~= 0 then - insert_node_after(replace,n,newkern(rightkern)) + insert_node_after(replace,n,fontkern(rightkern)) done = true end if hasmarks then @@ -1303,13 +1428,12 @@ local function inject_everything(head,where) if pre then local p = rawget(properties,prevglyph) if p then - -- local i = rawget(p,"preinjections") local i = p.preinjections if i then -- glyph|pre glyphs local rightkern = i.rightkern if rightkern and rightkern ~= 0 then - pre = insert_node_before(pre,pre,newkern(rightkern)) + pre = insert_node_before(pre,pre,fontkern(rightkern)) done = true end end @@ -1318,13 +1442,12 @@ local function inject_everything(head,where) if replace then local p = rawget(properties,prevglyph) if p then - -- local i = rawget(p,"replaceinjections") local i = p.replaceinjections if i then -- glyph|replace glyphs local rightkern = i.rightkern if rightkern and rightkern ~= 0 then - replace = insert_node_before(replace,replace,newkern(rightkern)) + replace = insert_node_before(replace,replace,fontkern(rightkern)) done = true end end @@ -1339,6 +1462,7 @@ local function inject_everything(head,where) else prevglyph = nil prevdisc = nil +base = nil end prev = current current = next @@ -1360,7 +1484,6 @@ local function inject_everything(head,where) for i=1,nofmarks do local m = marks[i] local p = rawget(properties,m) - -- local i = rawget(p,"injections") local i = p.injections local b = i.markbasenode processmark(b,m,i) @@ -1372,10 +1495,13 @@ local function inject_everything(head,where) if keepregisteredcounts then keepregisteredcounts = false else - nofregisteredkerns = 0 - nofregisteredpairs = 0 - nofregisteredmarks = 0 - nofregisteredcursives = 0 + nofregisteredkerns = 0 + nofregisteredpositions = 0 + nofregisteredmarks = 0 + nofregisteredcursives = 0 + end + if trace_injections then + show_result(head) end return tonode(head), true end @@ -1468,7 +1594,6 @@ local function injectspaces(head) if not triggers then return head, false end - local lastfont = nil local spacekerns = nil local leftkerns = nil @@ -1477,6 +1602,7 @@ local function injectspaces(head) local threshold = 0 local leftkern = false local rightkern = false + local nuthead = tonut(head) local function updatefont(font,trig) leftkerns = trig.left @@ -1486,7 +1612,7 @@ local function injectspaces(head) factor = getthreshold(font) end - for n in traverse_id(glue_code,tonut(head)) do + for n in traverse_id(glue_code,nuthead) do local prev, next = getspaceboth(n) local prevchar = prev and ischar(prev) local nextchar = next and ischar(next) @@ -1518,29 +1644,59 @@ local function injectspaces(head) local old = getwidth(n) if old > threshold then if rightkern then - local new = old + (leftkern + rightkern) * factor - if trace_spaces then - report_spaces("%C [%p -> %p] %C",prevchar,old,new,nextchar) + if useitalickerns then + local lnew = leftkern * factor + local rnew = rightkern * factor + if trace_spaces then + report_spaces("%C [%p + %p + %p] %C",prevchar,lnew,old,rnew,nextchar) + end + local h = insert_node_before(nuthead,n,italickern(lnew)) + if h == nuthead then + head = tonode(h) + nuthead = h + end + insert_node_after(nuthead,n,italickern(rnew)) + else + local new = old + (leftkern + rightkern) * factor + if trace_spaces then + report_spaces("%C [%p -> %p] %C",prevchar,old,new,nextchar) + end + setwidth(n,new) end - setwidth(n,new) - leftkern = false + rightkern = false else - local new = old + leftkern * factor - if trace_spaces then - report_spaces("%C [%p -> %p]",prevchar,old,new) + if useitalickerns then + local new = leftkern * factor + if trace_spaces then + report_spaces("%C [%p + %p]",prevchar,old,new) + end + insert_node_after(nuthead,n,italickern(new)) -- tricky with traverse but ok + else + local new = old + leftkern * factor + if trace_spaces then + report_spaces("%C [%p -> %p]",prevchar,old,new) + end + setwidth(n,new) end - setwidth(n,new) end end leftkern = false elseif rightkern then local old = getwidth(n) if old > threshold then - local new = old + rightkern * factor - if trace_spaces then - report_spaces("[%p -> %p] %C",nextchar,old,new) + if useitalickerns then + local new = rightkern * factor + if trace_spaces then + report_spaces("%C [%p + %p]",nextchar,old,new) + end + insert_node_after(nuthead,n,italickern(new)) + else + local new = old + rightkern * factor + if trace_spaces then + report_spaces("[%p -> %p] %C",nextchar,old,new) + end + setwidth(n,new) end - setwidth(n,new) end rightkern = false end @@ -1562,11 +1718,11 @@ function injections.handler(head,where) report_injections("injection variant %a","everything") end return inject_everything(head,where) - elseif nofregisteredpairs > 0 then + elseif nofregisteredpositions > 0 then if trace_injections then - report_injections("injection variant %a","pairs") + report_injections("injection variant %a","positions") end - return inject_pairs_only(head,where) + return inject_positions_only(head,where) elseif nofregisteredkerns > 0 then if trace_injections then report_injections("injection variant %a","kerns") diff --git a/tex/context/base/mkiv/font-otl.lua b/tex/context/base/mkiv/font-otl.lua index 9400096a0..a71e3ad98 100644 --- a/tex/context/base/mkiv/font-otl.lua +++ b/tex/context/base/mkiv/font-otl.lua @@ -52,7 +52,7 @@ local report_otf = logs.reporter("fonts","otf loading") local fonts = fonts local otf = fonts.handlers.otf -otf.version = 3.029 -- beware: also sync font-mis.lua and in mtx-fonts +otf.version = 3.103 -- beware: also sync font-mis.lua and in mtx-fonts otf.cache = containers.define("fonts", "otl", otf.version, true) otf.svgcache = containers.define("fonts", "svg", otf.version, true) otf.sbixcache = containers.define("fonts", "sbix", otf.version, true) @@ -79,6 +79,8 @@ local cleanup = 0 -- mk: 0=885M 1=765M 2=735M (regular run 730M) local syncspace = true local forcenotdef = false +local privateoffset = fonts.constructors and fonts.constructors.privateoffset or 0xF0000 -- 0x10FFFF + local applyruntimefixes = fonts.treatments and fonts.treatments.applyfixes local wildcard = "*" @@ -99,6 +101,33 @@ registerdirective("fonts.otf.loader.forcenotdef", function(v) forcenotdef = registerotfenhancer("check extra features", function() end) -- placeholder +-- Kai has memory problems on osx so here is an experiment (I only tested on windows as +-- my test mac is old and gets no updates and is therefore rather useless.): + +local checkmemory = utilities.lua and utilities.lua.checkmemory +local threshold = 100 -- MB +local tracememory = false + +registertracker("fonts.otf.loader.memory",function(v) tracememory = v end) + +if not checkmemory then -- we need a generic plug (this code might move): + + local collectgarbage = collectgarbage + + checkmemory = function(previous,threshold) -- threshold in MB + local current = collectgarbage("count") + if previous then + local checked = (threshold or 64)*1024 + if current - previous > checked then + collectgarbage("collect") + current = collectgarbage("count") + end + end + return current + end + +end + function otf.load(filename,sub,instance) local base = file.basename(file.removesuffix(filename)) local name = file.removesuffix(base) -- already no suffix @@ -130,9 +159,13 @@ function otf.load(filename,sub,instance) data = otfreaders.loadfont(filename,sub or 1,instance) -- we can pass the number instead (if it comes from a name search) if data then -- todo: make this a plugin + local used = checkmemory() local resources = data.resources local svgshapes = resources.svgshapes local sbixshapes = resources.sbixshapes + if cleanup == 0 then + checkmemory(used,threshold,tracememory) + end if svgshapes then resources.svgshapes = nil if otf.svgenabled then @@ -147,6 +180,11 @@ function otf.load(filename,sub,instance) timestamp = timestamp, } end + if cleanup > 1 then + collectgarbage("collect") + else + checkmemory(used,threshold,tracememory) + end end if sbixshapes then resources.sbixshapes = nil @@ -162,18 +200,31 @@ function otf.load(filename,sub,instance) timestamp = timestamp, } end + if cleanup > 1 then + collectgarbage("collect") + else + checkmemory(used,threshold,tracememory) + end end -- otfreaders.compact(data) + if cleanup == 0 then + checkmemory(used,threshold,tracememory) + end otfreaders.rehash(data,"unicodes") otfreaders.addunicodetable(data) otfreaders.extend(data) + if cleanup == 0 then + checkmemory(used,threshold,tracememory) + end otfreaders.pack(data) report_otf("loading done") report_otf("saving %a in cache",filename) data = containers.write(otf.cache, hash, data) if cleanup > 1 then collectgarbage("collect") + else + checkmemory(used,threshold,tracememory) end stoptiming(otfreaders) if elapsedtime then @@ -181,10 +232,14 @@ function otf.load(filename,sub,instance) end if cleanup > 3 then collectgarbage("collect") + else + checkmemory(used,threshold,tracememory) end data = containers.read(otf.cache,hash) -- this frees the old table and load the sparse one if cleanup > 2 then collectgarbage("collect") + else + checkmemory(used,threshold,tracememory) end else data = nil @@ -200,12 +255,12 @@ function otf.load(filename,sub,instance) otfreaders.expand(data) -- inline tables otfreaders.addunicodetable(data) -- only when not done yet -- - otfenhancers.apply(data,filename,data) + otfenhancers.apply(data,filename,data) -- in context one can also use treatments -- -- constructors.addcoreunicodes(data.resources.unicodes) -- still needed ? -- if applyruntimefixes then - applyruntimefixes(filename,data) + applyruntimefixes(filename,data) -- e.g. see treatments.lfg end -- data.metadata.math = data.resources.mathconstants @@ -285,7 +340,7 @@ local function copytotfm(data,cache_id) end if mathspecs then for unicode, character in next, characters do - local d = descriptions[unicode] + local d = descriptions[unicode] -- we could use parent table here local m = d.math if m then -- watch out: luatex uses horiz_variants for the parts @@ -448,6 +503,8 @@ local function copytotfm(data,cache_id) -- properties.name = specification.name -- properties.sub = specification.sub -- + properties.private = properties.private or data.private or privateoffset + -- return { characters = characters, descriptions = descriptions, @@ -558,7 +615,7 @@ local function checkmathsize(tfmdata,mathsize) local parameters = tfmdata.parameters parameters.scriptpercentage = mathdata.ScriptPercentScaleDown parameters.scriptscriptpercentage = mathdata.ScriptScriptPercentScaleDown - parameters.mathsize = mathsize + parameters.mathsize = mathsize -- only when a number ! end end @@ -768,6 +825,7 @@ otf.coverup = { multiple = justset, kern = justset, pair = justset, + single = justset, ligature = function(coverage,unicode,ligature) local first = ligature[1] local tree = coverage[first] diff --git a/tex/context/base/mkiv/font-otn.lua b/tex/context/base/mkiv/font-otn.lua deleted file mode 100644 index ace7bf12b..000000000 --- a/tex/context/base/mkiv/font-otn.lua +++ /dev/null @@ -1,3929 +0,0 @@ -if not modules then modules = { } end modules ['font-otn'] = { - version = 1.001, - comment = "companion to font-ini.mkiv", - author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", - copyright = "PRAGMA ADE / ConTeXt Development Team", - license = "see context related readme files", -} - --- this is a context version which can contain experimental code, but when we --- have serious patches we also need to change the other two font-otn files - --- at some point i might decide to convert the whole list into a table and then --- run over that instead (but it has some drawbacks as we also need to deal with --- attributes and such so we need to keep a lot of track - which is why i rejected --- that method - although it has become a bit easier in the meantime so it might --- become an alternative (by that time i probably have gone completely lua) .. the --- usual chicken-egg issues ... maybe mkix as it's no real tex any more then - --- preprocessors = { "nodes" } - --- anchor class : mark, mkmk, curs, mklg (todo) --- anchor type : mark, basechar, baselig, basemark, centry, cexit, max (todo) - --- this is still somewhat preliminary and it will get better in due time; --- much functionality could only be implemented thanks to the husayni font --- of Idris Samawi Hamid to who we dedicate this module. - --- in retrospect it always looks easy but believe it or not, it took a lot --- of work to get proper open type support done: buggy fonts, fuzzy specs, --- special made testfonts, many skype sessions between taco, idris and me, --- torture tests etc etc ... unfortunately the code does not show how much --- time it took ... - --- todo: --- --- extension infrastructure (for usage out of context) --- sorting features according to vendors/renderers --- alternative loop quitters --- check cursive and r2l --- find out where ignore-mark-classes went --- default features (per language, script) --- handle positions (we need example fonts) --- handle gpos_single (we might want an extra width field in glyph nodes because adding kerns might interfere) --- mark (to mark) code is still not what it should be (too messy but we need some more extreem husayni tests) --- remove some optimizations (when I have a faster machine) --- --- beware: --- --- we do some disc jugling where we need to keep in mind that the --- pre, post and replace fields can have prev pointers to a nesting --- node ... i wonder if that is still needed --- --- not possible: --- --- \discretionary {alpha-} {betagammadelta} --- {\discretionary {alphabeta-} {gammadelta} --- {\discretionary {alphabetagamma-} {delta} --- {alphabetagammadelta}}} - ---[[ldx-- -<p>This module is a bit more split up that I'd like but since we also want to test -with plain <l n='tex'/> it has to be so. This module is part of <l n='context'/> -and discussion about improvements and functionality mostly happens on the -<l n='context'/> mailing list.</p> - -<p>The specification of OpenType is kind of vague. Apart from a lack of a proper -free specifications there's also the problem that Microsoft and Adobe -may have their own interpretation of how and in what order to apply features. -In general the Microsoft website has more detailed specifications and is a -better reference. There is also some information in the FontForge help files.</p> - -<p>Because there is so much possible, fonts might contain bugs and/or be made to -work with certain rederers. These may evolve over time which may have the side -effect that suddenly fonts behave differently.</p> - -<p>After a lot of experiments (mostly by Taco, me and Idris) we're now at yet another -implementation. Of course all errors are mine and of course the code can be -improved. There are quite some optimizations going on here and processing speed -is currently acceptable. Not all functions are implemented yet, often because I -lack the fonts for testing. Many scripts are not yet supported either, but I will -look into them as soon as <l n='context'/> users ask for it.</p> - -<p>The specification leaves room for interpretation. In case of doubt the microsoft -implementation is the reference as it is the most complete one. As they deal with -lots of scripts and fonts, Kai and Ivo did a lot of testing of the generic code and -their suggestions help improve the code. I'm aware that not all border cases can be -taken care of, unless we accept excessive runtime, and even then the interference -with other mechanisms (like hyphenation) are not trivial.</p> - -<p>Glyphs are indexed not by unicode but in their own way. This is because there is no -relationship with unicode at all, apart from the fact that a font might cover certain -ranges of characters. One character can have multiple shapes. However, at the -<l n='tex'/> end we use unicode so and all extra glyphs are mapped into a private -space. This is needed because we need to access them and <l n='tex'/> has to include -then in the output eventually.</p> - -<p>The raw table as it coms from <l n='fontforge'/> gets reorganized in to fit out needs. -In <l n='context'/> that table is packed (similar tables are shared) and cached on disk -so that successive runs can use the optimized table (after loading the table is -unpacked). The flattening code used later is a prelude to an even more compact table -format (and as such it keeps evolving).</p> - -<p>This module is sparsely documented because it is a moving target. The table format -of the reader changes and we experiment a lot with different methods for supporting -features.</p> - -<p>As with the <l n='afm'/> code, we may decide to store more information in the -<l n='otf'/> table.</p> - -<p>Incrementing the version number will force a re-cache. We jump the number by one -when there's a fix in the <l n='fontforge'/> library or <l n='lua'/> code that -results in different tables.</p> ---ldx]]-- - --- action handler chainproc --- --- gsub_single ok ok --- gsub_multiple ok ok --- gsub_alternate ok ok --- gsub_ligature ok ok --- gsub_context ok -- --- gsub_contextchain ok -- --- gsub_reversecontextchain ok -- --- chainsub -- ok --- reversesub -- ok --- gpos_mark2base ok ok --- gpos_mark2ligature ok ok --- gpos_mark2mark ok ok --- gpos_cursive ok untested --- gpos_single ok ok --- gpos_pair ok ok --- gpos_context ok -- --- gpos_contextchain ok -- --- --- todo: contextpos --- --- actions: --- --- handler : actions triggered by lookup --- chainproc : actions triggered by contextual lookup --- chainmore : multiple substitutions triggered by contextual lookup (e.g. fij -> f + ij) --- --- remark: the 'not implemented yet' variants will be done when we have fonts that use them - --- We used to have independent hashes for lookups but as the tags are unique --- we now use only one hash. If needed we can have multiple again but in that --- case I will probably prefix (i.e. rename) the lookups in the cached font file. - --- Todo: make plugin feature that operates on char/glyphnode arrays - -local type, next, tonumber = type, next, tonumber -local random = math.random -local formatters = string.formatters - -local logs, trackers, nodes, attributes = logs, trackers, nodes, attributes - -local registertracker = trackers.register -local registerdirective = directives.register - -local fonts = fonts -local otf = fonts.handlers.otf - -local trace_lookups = false registertracker("otf.lookups", function(v) trace_lookups = v end) -local trace_singles = false registertracker("otf.singles", function(v) trace_singles = v end) -local trace_multiples = false registertracker("otf.multiples", function(v) trace_multiples = v end) -local trace_alternatives = false registertracker("otf.alternatives", function(v) trace_alternatives = v end) -local trace_ligatures = false registertracker("otf.ligatures", function(v) trace_ligatures = v end) -local trace_contexts = false registertracker("otf.contexts", function(v) trace_contexts = v end) -local trace_marks = false registertracker("otf.marks", function(v) trace_marks = v end) -local trace_kerns = false registertracker("otf.kerns", function(v) trace_kerns = v end) -local trace_cursive = false registertracker("otf.cursive", function(v) trace_cursive = v end) -local trace_preparing = false registertracker("otf.preparing", function(v) trace_preparing = v end) -local trace_bugs = false registertracker("otf.bugs", function(v) trace_bugs = v end) -local trace_details = false registertracker("otf.details", function(v) trace_details = v end) -local trace_applied = false registertracker("otf.applied", function(v) trace_applied = v end) -local trace_steps = false registertracker("otf.steps", function(v) trace_steps = v end) -local trace_skips = false registertracker("otf.skips", function(v) trace_skips = v end) -local trace_directions = false registertracker("otf.directions", function(v) trace_directions = v end) - -local trace_kernruns = false registertracker("otf.kernruns", function(v) trace_kernruns = v end) -local trace_discruns = false registertracker("otf.discruns", function(v) trace_discruns = v end) -local trace_compruns = false registertracker("otf.compruns", function(v) trace_compruns = v end) - -local quit_on_no_replacement = true -- maybe per font -local zwnjruns = true - -registerdirective("otf.zwnjruns", function(v) zwnjruns = v end) -registerdirective("otf.chain.quitonnoreplacement",function(value) quit_on_no_replacement = value end) - -local report_direct = logs.reporter("fonts","otf direct") -local report_subchain = logs.reporter("fonts","otf subchain") -local report_chain = logs.reporter("fonts","otf chain") -local report_process = logs.reporter("fonts","otf process") -local report_prepare = logs.reporter("fonts","otf prepare") -local report_run = logs.reporter("fonts","otf run") - -registertracker("otf.verbose_chain", function(v) otf.setcontextchain(v and "verbose") end) -registertracker("otf.normal_chain", function(v) otf.setcontextchain(v and "normal") end) - -registertracker("otf.replacements", "otf.singles,otf.multiples,otf.alternatives,otf.ligatures") -registertracker("otf.positions","otf.marks,otf.kerns,otf.cursive") -registertracker("otf.actions","otf.replacements,otf.positions") -registertracker("otf.injections","nodes.injections") - -registertracker("*otf.sample","otf.steps,otf.actions,otf.analyzing") - -local nuts = nodes.nuts -local tonode = nuts.tonode -local tonut = nuts.tonut - -local getfield = nuts.getfield -local setfield = nuts.setfield -local getnext = nuts.getnext -local setnext = nuts.setnext -local getprev = nuts.getprev -local setprev = nuts.setprev -local getid = nuts.getid -local getattr = nuts.getattr -local setattr = nuts.setattr -local getprop = nuts.getprop -local setprop = nuts.setprop -local getfont = nuts.getfont -local getsubtype = nuts.getsubtype -local setsubtype = nuts.setsubtype -local getchar = nuts.getchar -local setchar = nuts.setchar - -local insert_node_after = nuts.insert_after -local copy_node = nuts.copy -local copy_node_list = nuts.copy_list -local find_node_tail = nuts.tail -local flush_node_list = nuts.flush_list -local flush_node = nuts.flush_node -local end_of_math = nuts.end_of_math -local traverse_nodes = nuts.traverse -local traverse_id = nuts.traverse_id - -local setmetatableindex = table.setmetatableindex - -local zwnj = 0x200C -local zwj = 0x200D -local wildcard = "*" -local default = "dflt" - -local nodecodes = nodes.nodecodes -local glyphcodes = nodes.glyphcodes -local disccodes = nodes.disccodes - -local glyph_code = nodecodes.glyph -local disc_code = nodecodes.disc -local math_code = nodecodes.math -local dir_code = nodecodes.dir -local localpar_code = nodecodes.localpar - -local discretionary_code = disccodes.discretionary -local ligature_code = glyphcodes.ligature - -local privateattribute = attributes.private - --- Something is messed up: we have two mark / ligature indices, one at the injection --- end and one here ... this is based on KE's patches but there is something fishy --- there as I'm pretty sure that for husayni we need some connection (as it's much --- more complex than an average font) but I need proper examples of all cases, not --- of only some. - -local a_state = privateattribute('state') -local a_cursbase = privateattribute('cursbase') -- to be checked, probably can go - -local injections = nodes.injections -local setmark = injections.setmark -local setcursive = injections.setcursive -local setkern = injections.setkern -local setpair = injections.setpair -local resetinjection = injections.reset -local copyinjection = injections.copy -local setligaindex = injections.setligaindex -local getligaindex = injections.getligaindex - -local cursonce = true - -local fonthashes = fonts.hashes -local fontdata = fonthashes.identifiers - -local otffeatures = fonts.constructors.features.otf -local registerotffeature = otffeatures.register - -local onetimemessage = fonts.loggers.onetimemessage or function() end - -local getrandom = utilities and utilities.randomizer and utilities.randomizer.get - -otf.defaultnodealternate = "none" -- first last - --- we share some vars here, after all, we have no nested lookups and less code - -local tfmdata = false -local characters = false -local descriptions = false -local resources = false -local marks = false -local currentfont = false -local lookuptable = false -local anchorlookups = false -local lookuptypes = false -local lookuptags = false -local handlers = { } -local rlmode = 0 -local featurevalue = false - -local sweephead = { } -local sweepnode = nil -local sweepprev = nil -local sweepnext = nil - -local notmatchpre = { } -local notmatchpost = { } -local notmatchreplace = { } - --- we use this for special testing and documentation - -local checkstep = (nodes and nodes.tracers and nodes.tracers.steppers.check) or function() end -local registerstep = (nodes and nodes.tracers and nodes.tracers.steppers.register) or function() end -local registermessage = (nodes and nodes.tracers and nodes.tracers.steppers.message) or function() end - -local function logprocess(...) - if trace_steps then - registermessage(...) - end - report_direct(...) -end - -local function logwarning(...) - report_direct(...) -end - -local f_unicode = formatters["%U"] -local f_uniname = formatters["%U (%s)"] -local f_unilist = formatters["% t (% t)"] - -local function gref(n) -- currently the same as in font-otb - if type(n) == "number" then - local description = descriptions[n] - local name = description and description.name - if name then - return f_uniname(n,name) - else - return f_unicode(n) - end - elseif n then - local num, nam = { }, { } - for i=1,#n do - local ni = n[i] - if tonumber(ni) then -- later we will start at 2 - local di = descriptions[ni] - num[i] = f_unicode(ni) - nam[i] = di and di.name or "-" - end - end - return f_unilist(num,nam) - else - return "<error in node mode tracing>" - end -end - -local function cref(kind,chainname,chainlookupname,lookupname,index) -- not in the mood to alias f_ - if index then - return formatters["feature %a, chain %a, sub %a, lookup %a, index %a"](kind,chainname,chainlookupname,lookuptags[lookupname],index) - elseif lookupname then - return formatters["feature %a, chain %a, sub %a, lookup %a"](kind,chainname,chainlookupname,lookuptags[lookupname]) - elseif chainlookupname then - return formatters["feature %a, chain %a, sub %a"](kind,lookuptags[chainname],lookuptags[chainlookupname]) - elseif chainname then - return formatters["feature %a, chain %a"](kind,lookuptags[chainname]) - else - return formatters["feature %a"](kind) - end -end - -local function pref(kind,lookupname) - return formatters["feature %a, lookup %a"](kind,lookuptags[lookupname]) -end - --- We can assume that languages that use marks are not hyphenated. We can also assume --- that at most one discretionary is present. - --- We do need components in funny kerning mode but maybe I can better reconstruct then --- as we do have the font components info available; removing components makes the --- previous code much simpler. Also, later on copying and freeing becomes easier. --- However, for arabic we need to keep them around for the sake of mark placement --- and indices. - -local function copy_glyph(g) -- next and prev are untouched ! - local components = getfield(g,"components") - if components then - setfield(g,"components",nil) - local n = copy_node(g) - copyinjection(n,g) -- we need to preserve the lig indices - setfield(g,"components",components) - return n - else - local n = copy_node(g) - copyinjection(n,g) -- we need to preserve the lig indices - return n - end -end - -local function flattendisk(head,disc) - local replace = getfield(disc,"replace") - setfield(disc,"replace",nil) - flush_node(disc) - if head == disc then - local next = getnext(disc) - if replace then - if next then - local tail = find_node_tail(replace) - setnext(tail,next) - setprev(next,tail) - end - return replace, replace - elseif next then - return next, next - else - return -- maybe warning - end - else - local next = getnext(disc) - local prev = getprev(disc) - if replace then - local tail = find_node_tail(replace) - if next then - setnext(tail,next) - setprev(next,tail) - end - setnext(prev,replace) - setprev(replace,prev) - return head, replace - else - if next then - setprev(next,prev) - end - setnext(prev,next) - return head, next - end - end -end - -local function appenddisc(disc,list) - local post = getfield(disc,"post") - local replace = getfield(disc,"replace") - local phead = list - local rhead = copy_node_list(list) - local ptail = find_node_tail(post) - local rtail = find_node_tail(replace) - if post then - setnext(ptail,phead) - setprev(phead,ptail) - else - setfield(disc,"post",phead) - end - if replace then - setnext(rtail,rhead) - setprev(rhead,rtail) - else - setfield(disc,"replace",rhead) - end -end - --- start is a mark and we need to keep that one - -local function markstoligature(kind,lookupname,head,start,stop,char) - if start == stop and getchar(start) == char then - return head, start - else - local prev = getprev(start) - local next = getnext(stop) - setprev(start,nil) - setnext(stop,nil) - local base = copy_glyph(start) - if head == start then - head = base - end - resetinjection(base) - setchar(base,char) - setsubtype(base,ligature_code) - setfield(base,"components",start) - if prev then - setnext(prev,base) - end - if next then - setprev(next,base) - end - setnext(base,next) - setprev(base,prev) - return head, base - end -end - --- The next code is somewhat complicated by the fact that some fonts can have ligatures made --- from ligatures that themselves have marks. This was identified by Kai in for instance --- arabtype: KAF LAM SHADDA ALEF FATHA (0x0643 0x0644 0x0651 0x0627 0x064E). This becomes --- KAF LAM-ALEF with a SHADDA on the first and a FATHA op de second component. In a next --- iteration this becomes a KAF-LAM-ALEF with a SHADDA on the second and a FATHA on the --- third component. - -local function getcomponentindex(start) -- we could store this offset in the glyph (nofcomponents) - if getid(start) ~= glyph_code then -- and then get rid of all components - return 0 - elseif getsubtype(start) == ligature_code then - local i = 0 - local components = getfield(start,"components") - while components do - i = i + getcomponentindex(components) - components = getnext(components) - end - return i - elseif not marks[getchar(start)] then - return 1 - else - return 0 - end -end - -local a_noligature = attributes.private("noligature") - -local function toligature(kind,lookupname,head,start,stop,char,markflag,discfound) -- brr head - if getattr(start,a_noligature) == 1 then - -- so we can do: e\noligature{ff}e e\noligature{f}fie (we only look at the first) - return head, start - end - if start == stop and getchar(start) == char then - resetinjection(start) - setchar(start,char) - return head, start - end - -- needs testing (side effects): - local components = getfield(start,"components") - if components then - -- we get a double free .. needs checking - -- flush_node_list(components) - end - -- - local prev = getprev(start) - local next = getnext(stop) - local comp = start - setprev(start,nil) - setnext(stop,nil) - local base = copy_glyph(start) - if start == head then - head = base - end - resetinjection(base) - setchar(base,char) - setsubtype(base,ligature_code) - setfield(base,"components",comp) -- start can have components ... do we need to flush? - if prev then - setnext(prev,base) - end - if next then - setprev(next,base) - end - setprev(base,prev) - setnext(base,next) - if not discfound then - local deletemarks = markflag ~= "mark" - local components = start - local baseindex = 0 - local componentindex = 0 - local head = base - local current = base - -- first we loop over the glyphs in start .. stop - while start do - local char = getchar(start) - if not marks[char] then - baseindex = baseindex + componentindex - componentindex = getcomponentindex(start) - elseif not deletemarks then -- quite fishy - setligaindex(start,baseindex + getligaindex(start,componentindex)) - if trace_marks then - logwarning("%s: keep mark %s, gets index %s",pref(kind,lookupname),gref(char),getligaindex(start)) - end - local n = copy_node(start) - copyinjection(n,start) - head, current = insert_node_after(head,current,n) -- unlikely that mark has components - elseif trace_marks then - logwarning("%s: delete mark %s",pref(kind,lookupname),gref(char)) - end - start = getnext(start) - end - -- we can have one accent as part of a lookup and another following - -- local start = components -- was wrong (component scanning was introduced when more complex ligs in devanagari was added) - local start = getnext(current) - while start and getid(start) == glyph_code do - local char = getchar(start) - if marks[char] then - setligaindex(start,baseindex + getligaindex(start,componentindex)) - if trace_marks then - logwarning("%s: set mark %s, gets index %s",pref(kind,lookupname),gref(char),getligaindex(start)) - end - else - break - end - start = getnext(start) - end - else - -- discfound ... forget about marks .. probably no scripts that hyphenate and have marks - local discprev = getprev(discfound) - local discnext = getnext(discfound) - if discprev and discnext then - -- we assume normalization in context, and don't care about generic ... especially - -- \- can give problems as there we can have a negative char but that won't match - -- anyway - local pre = getfield(discfound,"pre") - local post = getfield(discfound,"post") - local replace = getfield(discfound,"replace") - if not replace then -- todo: signal simple hyphen - local prev = getprev(base) - local copied = copy_node_list(comp) - setprev(discnext,nil) -- also blocks funny assignments - setnext(discprev,nil) -- also blocks funny assignments - if pre then - setnext(discprev,pre) - setprev(pre,discprev) - end - pre = comp - if post then - local tail = find_node_tail(post) - setnext(tail,discnext) - setprev(discnext,tail) - setprev(post,nil) - else - post = discnext - end - setnext(prev,discfound) - setprev(discfound,prev) - setnext(discfound,next) - setprev(next,discfound) - setnext(base,nil) - setprev(base,nil) - setfield(base,"components",copied) - setfield(discfound,"pre",pre) - setfield(discfound,"post",post) - setfield(discfound,"replace",base) - setsubtype(discfound,discretionary_code) - base = prev -- restart - end - end - end - return head, base -end - -local function multiple_glyphs(head,start,multiple,ignoremarks) - local nofmultiples = #multiple - if nofmultiples > 0 then - resetinjection(start) - setchar(start,multiple[1]) - if nofmultiples > 1 then - local sn = getnext(start) - for k=2,nofmultiples do -- todo: use insert_node --- untested: --- --- while ignoremarks and marks[getchar(sn)] then --- local sn = getnext(sn) --- end - local n = copy_node(start) -- ignore components - resetinjection(n) - setchar(n,multiple[k]) - setprev(n,start) - setnext(n,sn) - if sn then - setprev(sn,n) - end - setnext(start,n) - start = n - end - end - return head, start, true - else - if trace_multiples then - logprocess("no multiple for %s",gref(getchar(start))) - end - return head, start, false - end -end - -local function get_alternative_glyph(start,alternatives,value,trace_alternatives) - local n = #alternatives - if value == "random" then - local r = getrandom and getrandom("glyph",1,n) or random(1,n) - return alternatives[r], trace_alternatives and formatters["value %a, taking %a"](value,r) - elseif value == "first" then - return alternatives[1], trace_alternatives and formatters["value %a, taking %a"](value,1) - elseif value == "last" then - return alternatives[n], trace_alternatives and formatters["value %a, taking %a"](value,n) - else - value = tonumber(value) - if type(value) ~= "number" then - return alternatives[1], trace_alternatives and formatters["invalid value %s, taking %a"](value,1) - elseif value > n then - local defaultalt = otf.defaultnodealternate - if defaultalt == "first" then - return alternatives[n], trace_alternatives and formatters["invalid value %s, taking %a"](value,1) - elseif defaultalt == "last" then - return alternatives[1], trace_alternatives and formatters["invalid value %s, taking %a"](value,n) - else - return false, trace_alternatives and formatters["invalid value %a, %s"](value,"out of range") - end - elseif value == 0 then - return getchar(start), trace_alternatives and formatters["invalid value %a, %s"](value,"no change") - elseif value < 1 then - return alternatives[1], trace_alternatives and formatters["invalid value %a, taking %a"](value,1) - else - return alternatives[value], trace_alternatives and formatters["value %a, taking %a"](value,value) - end - end -end - --- handlers - -function handlers.gsub_single(head,start,kind,lookupname,replacement) - if trace_singles then - logprocess("%s: replacing %s by single %s",pref(kind,lookupname),gref(getchar(start)),gref(replacement)) - end - resetinjection(start) - setchar(start,replacement) - return head, start, true -end - -function handlers.gsub_alternate(head,start,kind,lookupname,alternative,sequence) - local value = featurevalue == true and tfmdata.shared.features[kind] or featurevalue - local choice, comment = get_alternative_glyph(start,alternative,value,trace_alternatives) - if choice then - if trace_alternatives then - logprocess("%s: replacing %s by alternative %a to %s, %s",pref(kind,lookupname),gref(getchar(start)),choice,gref(choice),comment) - end - resetinjection(start) - setchar(start,choice) - else - if trace_alternatives then - logwarning("%s: no variant %a for %s, %s",pref(kind,lookupname),value,gref(getchar(start)),comment) - end - end - return head, start, true -end - -function handlers.gsub_multiple(head,start,kind,lookupname,multiple,sequence) - if trace_multiples then - logprocess("%s: replacing %s by multiple %s",pref(kind,lookupname),gref(getchar(start)),gref(multiple)) - end - return multiple_glyphs(head,start,multiple,sequence.flags[1]) -end - -function handlers.gsub_ligature(head,start,kind,lookupname,ligature,sequence) - local s, stop = getnext(start), nil - local startchar = getchar(start) - if marks[startchar] then - while s do - local id = getid(s) - if id == glyph_code and getfont(s) == currentfont and getsubtype(s)<256 then - local lg = ligature[getchar(s)] - if lg then - stop = s - ligature = lg - s = getnext(s) - else - break - end - else - break - end - end - if stop then - local lig = ligature.ligature - if lig then - if trace_ligatures then - local stopchar = getchar(stop) - head, start = markstoligature(kind,lookupname,head,start,stop,lig) - logprocess("%s: replacing %s upto %s by ligature %s case 1",pref(kind,lookupname),gref(startchar),gref(stopchar),gref(getchar(start))) - else - head, start = markstoligature(kind,lookupname,head,start,stop,lig) - end - return head, start, true, false - else - -- ok, goto next lookup - end - end - else - local skipmark = sequence.flags[1] - local discfound = false - local lastdisc = nil - while s do - local id = getid(s) - if id == glyph_code and getsubtype(s)<256 then -- not needed - if getfont(s) == currentfont then -- also not needed only when mark - local char = getchar(s) - if skipmark and marks[char] then - s = getnext(s) - else -- ligature is a tree - local lg = ligature[char] -- can there be multiple in a row? maybe in a bad font - if lg then - if not discfound and lastdisc then - discfound = lastdisc - lastdisc = nil - end - stop = s -- needed for fake so outside then - ligature = lg - s = getnext(s) - else - break - end - end - else - break - end - elseif id == disc_code then - lastdisc = s - s = getnext(s) - else - break - end - end - local lig = ligature.ligature -- can't we get rid of this .ligature? - if lig then - if stop then - if trace_ligatures then - local stopchar = getchar(stop) - head, start = toligature(kind,lookupname,head,start,stop,lig,skipmark,discfound) - logprocess("%s: replacing %s upto %s by ligature %s case 2",pref(kind,lookupname),gref(startchar),gref(stopchar),gref(getchar(start))) - else - head, start = toligature(kind,lookupname,head,start,stop,lig,skipmark,discfound) - end - else - -- weird but happens (in some arabic font) - resetinjection(start) - setchar(start,lig) - if trace_ligatures then - logprocess("%s: replacing %s by (no real) ligature %s case 3",pref(kind,lookupname),gref(startchar),gref(lig)) - end - end - return head, start, true, discfound - else - -- weird but happens, pseudo ligatures ... just the components - end - end - return head, start, false, discfound -end - -function handlers.gpos_single(head,start,kind,lookupname,kerns,sequence,lookuphash,i,injection) - local startchar = getchar(start) - local dx, dy, w, h = setpair(start,tfmdata.parameters.factor,rlmode,sequence.flags[4],kerns,injection) -- ,characters[startchar]) - if trace_kerns then - logprocess("%s: shifting single %s by (%p,%p) and correction (%p,%p)",pref(kind,lookupname),gref(startchar),dx,dy,w,h) - end - return head, start, false -end - -function handlers.gpos_pair(head,start,kind,lookupname,kerns,sequence,lookuphash,i,injection) - -- todo: kerns in disc nodes: pre, post, replace -> loop over disc too - -- todo: kerns in components of ligatures - local snext = getnext(start) - if not snext then - return head, start, false - else - local prev = start - local done = false - local factor = tfmdata.parameters.factor - local lookuptype = lookuptypes[lookupname] - while snext and getid(snext) == glyph_code and getfont(snext) == currentfont and getsubtype(snext)<256 do - local nextchar = getchar(snext) - local krn = kerns[nextchar] - if not krn and marks[nextchar] then - prev = snext - snext = getnext(snext) - else - if not krn then - -- skip - elseif type(krn) == "table" then - if lookuptype == "pair" then -- probably not needed - local a, b = krn[2], krn[3] - if a and #a > 0 then - local x, y, w, h = setpair(start,factor,rlmode,sequence.flags[4],a,injection) -- characters[startchar]) - if trace_kerns then - local startchar = getchar(start) - logprocess("%s: shifting first of pair %s and %s by (%p,%p) and correction (%p,%p)",pref(kind,lookupname),gref(startchar),gref(nextchar),x,y,w,h) - end - end - if b and #b > 0 then - local x, y, w, h = setpair(snext,factor,rlmode,sequence.flags[4],b,injection) -- characters[nextchar]) - if trace_kerns then - local startchar = getchar(start) - logprocess("%s: shifting second of pair %s and %s by (%p,%p) and correction (%p,%p)",pref(kind,lookupname),gref(startchar),gref(nextchar),x,y,w,h) - end - end - else -- wrong ... position has different entries - report_process("%s: check this out (old kern stuff)",pref(kind,lookupname)) - -- local a, b = krn[2], krn[6] - -- if a and a ~= 0 then - -- local k = setkern(snext,factor,rlmode,a) - -- if trace_kerns then - -- logprocess("%s: inserting first kern %s between %s and %s",pref(kind,lookupname),k,gref(getchar(prev)),gref(nextchar)) - -- end - -- end - -- if b and b ~= 0 then - -- logwarning("%s: ignoring second kern xoff %s",pref(kind,lookupname),b*factor) - -- end - end - done = true - elseif krn ~= 0 then - local k = setkern(snext,factor,rlmode,krn,injection) - if trace_kerns then - logprocess("%s: inserting kern %s between %s and %s",pref(kind,lookupname),k,gref(getchar(prev)),gref(nextchar)) -- prev? - end - done = true - end - break - end - end - return head, start, done - end -end - ---[[ldx-- -<p>We get hits on a mark, but we're not sure if the it has to be applied so -we need to explicitly test for basechar, baselig and basemark entries.</p> ---ldx]]-- - -function handlers.gpos_mark2base(head,start,kind,lookupname,markanchors,sequence) - local markchar = getchar(start) - if marks[markchar] then - local base = getprev(start) -- [glyph] [start=mark] - if base and getid(base) == glyph_code and getfont(base) == currentfont and getsubtype(base)<256 then - local basechar = getchar(base) - if marks[basechar] then - while true do - base = getprev(base) - if base and getid(base) == glyph_code and getfont(base) == currentfont and getsubtype(base)<256 then - basechar = getchar(base) - if not marks[basechar] then - break - end - else - if trace_bugs then - logwarning("%s: no base for mark %s",pref(kind,lookupname),gref(markchar)) - end - return head, start, false - end - end - end - local baseanchors = descriptions[basechar] - if baseanchors then - baseanchors = baseanchors.anchors - end - if baseanchors then - local baseanchors = baseanchors['basechar'] - if baseanchors then - local al = anchorlookups[lookupname] - for anchor,ba in next, baseanchors do - if al[anchor] then - local ma = markanchors[anchor] - if ma then - local dx, dy, bound = setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma,characters[basechar]) - if trace_marks then - logprocess("%s, anchor %s, bound %s: anchoring mark %s to basechar %s => (%p,%p)", - pref(kind,lookupname),anchor,bound,gref(markchar),gref(basechar),dx,dy) - end - return head, start, true - end - end - end - if trace_bugs then - logwarning("%s, no matching anchors for mark %s and base %s",pref(kind,lookupname),gref(markchar),gref(basechar)) - end - end - elseif trace_bugs then - -- logwarning("%s: char %s is missing in font",pref(kind,lookupname),gref(basechar)) - onetimemessage(currentfont,basechar,"no base anchors",report_fonts) - end - elseif trace_bugs then - logwarning("%s: prev node is no char",pref(kind,lookupname)) - end - elseif trace_bugs then - logwarning("%s: mark %s is no mark",pref(kind,lookupname),gref(markchar)) - end - return head, start, false -end - -function handlers.gpos_mark2ligature(head,start,kind,lookupname,markanchors,sequence) - -- check chainpos variant - local markchar = getchar(start) - if marks[markchar] then - local base = getprev(start) -- [glyph] [optional marks] [start=mark] - if base and getid(base) == glyph_code and getfont(base) == currentfont and getsubtype(base)<256 then - local basechar = getchar(base) - if marks[basechar] then - while true do - base = getprev(base) - if base and getid(base) == glyph_code and getfont(base) == currentfont and getsubtype(base)<256 then - basechar = getchar(base) - if not marks[basechar] then - break - end - else - if trace_bugs then - logwarning("%s: no base for mark %s",pref(kind,lookupname),gref(markchar)) - end - return head, start, false - end - end - end - local index = getligaindex(start) - local baseanchors = descriptions[basechar] - if baseanchors then - baseanchors = baseanchors.anchors - if baseanchors then - local baseanchors = baseanchors['baselig'] - if baseanchors then - local al = anchorlookups[lookupname] - for anchor, ba in next, baseanchors do - if al[anchor] then - local ma = markanchors[anchor] - if ma then - ba = ba[index] - if ba then - local dx, dy, bound = setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma,characters[basechar]) -- index - if trace_marks then - logprocess("%s, anchor %s, index %s, bound %s: anchoring mark %s to baselig %s at index %s => (%p,%p)", - pref(kind,lookupname),anchor,index,bound,gref(markchar),gref(basechar),index,dx,dy) - end - return head, start, true - else - if trace_bugs then - logwarning("%s: no matching anchors for mark %s and baselig %s with index %a",pref(kind,lookupname),gref(markchar),gref(basechar),index) - end - end - end - end - end - if trace_bugs then - logwarning("%s: no matching anchors for mark %s and baselig %s",pref(kind,lookupname),gref(markchar),gref(basechar)) - end - end - end - elseif trace_bugs then - -- logwarning("%s: char %s is missing in font",pref(kind,lookupname),gref(basechar)) - onetimemessage(currentfont,basechar,"no base anchors",report_fonts) - end - elseif trace_bugs then - logwarning("%s: prev node is no char",pref(kind,lookupname)) - end - elseif trace_bugs then - logwarning("%s: mark %s is no mark",pref(kind,lookupname),gref(markchar)) - end - return head, start, false -end - -function handlers.gpos_mark2mark(head,start,kind,lookupname,markanchors,sequence) - local markchar = getchar(start) - if marks[markchar] then - local base = getprev(start) -- [glyph] [basemark] [start=mark] - local slc = getligaindex(start) - if slc then -- a rather messy loop ... needs checking with husayni - while base do - local blc = getligaindex(base) - if blc and blc ~= slc then - base = getprev(base) - else - break - end - end - end - if base and getid(base) == glyph_code and getfont(base) == currentfont and getsubtype(base)<256 then -- subtype test can go - local basechar = getchar(base) - local baseanchors = descriptions[basechar] - if baseanchors then - baseanchors = baseanchors.anchors - if baseanchors then - baseanchors = baseanchors['basemark'] - if baseanchors then - local al = anchorlookups[lookupname] - for anchor,ba in next, baseanchors do - if al[anchor] then - local ma = markanchors[anchor] - if ma then - local dx, dy, bound = setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma,characters[basechar],true) - if trace_marks then - logprocess("%s, anchor %s, bound %s: anchoring mark %s to basemark %s => (%p,%p)", - pref(kind,lookupname),anchor,bound,gref(markchar),gref(basechar),dx,dy) - end - return head, start, true - end - end - end - if trace_bugs then - logwarning("%s: no matching anchors for mark %s and basemark %s",pref(kind,lookupname),gref(markchar),gref(basechar)) - end - end - end - elseif trace_bugs then - -- logwarning("%s: char %s is missing in font",pref(kind,lookupname),gref(basechar)) - onetimemessage(currentfont,basechar,"no base anchors",report_fonts) - end - elseif trace_bugs then - logwarning("%s: prev node is no mark",pref(kind,lookupname)) - end - elseif trace_bugs then - logwarning("%s: mark %s is no mark",pref(kind,lookupname),gref(markchar)) - end - return head, start, false -end - -function handlers.gpos_cursive(head,start,kind,lookupname,exitanchors,sequence) -- to be checked - local alreadydone = cursonce and getprop(start,a_cursbase) - if not alreadydone then - local done = false - local startchar = getchar(start) - if marks[startchar] then - if trace_cursive then - logprocess("%s: ignoring cursive for mark %s",pref(kind,lookupname),gref(startchar)) - end - else - local nxt = getnext(start) - while not done and nxt and getid(nxt) == glyph_code and getfont(nxt) == currentfont and getsubtype(nxt)<256 do - local nextchar = getchar(nxt) - if marks[nextchar] then - -- should not happen (maybe warning) - nxt = getnext(nxt) - else - local entryanchors = descriptions[nextchar] - if entryanchors then - entryanchors = entryanchors.anchors - if entryanchors then - entryanchors = entryanchors['centry'] - if entryanchors then - local al = anchorlookups[lookupname] - for anchor, entry in next, entryanchors do - if al[anchor] then - local exit = exitanchors[anchor] - if exit then - local dx, dy, bound = setcursive(start,nxt,tfmdata.parameters.factor,rlmode,exit,entry,characters[startchar],characters[nextchar]) - if trace_cursive then - logprocess("%s: moving %s to %s cursive (%p,%p) using anchor %s and bound %s in rlmode %s",pref(kind,lookupname),gref(startchar),gref(nextchar),dx,dy,anchor,bound,rlmode) - end - done = true - break - end - end - end - end - end - elseif trace_bugs then - -- logwarning("%s: char %s is missing in font",pref(kind,lookupname),gref(startchar)) - onetimemessage(currentfont,startchar,"no entry anchors",report_fonts) - end - break - end - end - end - return head, start, done - else - if trace_cursive and trace_details then - logprocess("%s, cursive %s is already done",pref(kind,lookupname),gref(getchar(start)),alreadydone) - end - return head, start, false - end -end - ---[[ldx-- -<p>I will implement multiple chain replacements once I run into a font that uses -it. It's not that complex to handle.</p> ---ldx]]-- - -local chainprocs = { } - -local function logprocess(...) - if trace_steps then - registermessage(...) - end - report_subchain(...) -end - -local logwarning = report_subchain - -local function logprocess(...) - if trace_steps then - registermessage(...) - end - report_chain(...) -end - -local logwarning = report_chain - --- We could share functions but that would lead to extra function calls with many --- arguments, redundant tests and confusing messages. - -function chainprocs.chainsub(head,start,stop,kind,chainname,currentcontext,lookuphash,lookuplist,chainlookupname) - logwarning("%s: a direct call to chainsub cannot happen",cref(kind,chainname,chainlookupname)) - return head, start, false -end - --- The reversesub is a special case, which is why we need to store the replacements --- in a bit weird way. There is no lookup and the replacement comes from the lookup --- itself. It is meant mostly for dealing with Urdu. - -function chainprocs.reversesub(head,start,stop,kind,chainname,currentcontext,lookuphash,replacements) - local char = getchar(start) - local replacement = replacements[char] - if replacement then - if trace_singles then - logprocess("%s: single reverse replacement of %s by %s",cref(kind,chainname),gref(char),gref(replacement)) - end - resetinjection(start) - setchar(start,replacement) - return head, start, true - else - return head, start, false - end -end - ---[[ldx-- -<p>This chain stuff is somewhat tricky since we can have a sequence of actions to be -applied: single, alternate, multiple or ligature where ligature can be an invalid -one in the sense that it will replace multiple by one but not neccessary one that -looks like the combination (i.e. it is the counterpart of multiple then). For -example, the following is valid:</p> - -<typing> -<line>xxxabcdexxx [single a->A][multiple b->BCD][ligature cde->E] xxxABCDExxx</line> -</typing> - ---[[ldx-- -<p>Here we replace start by a single variant.</p> ---ldx]]-- - -function chainprocs.gsub_single(head,start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname,chainindex) - -- todo: marks ? - local current = start - local subtables = currentlookup.subtables - if #subtables > 1 then - logwarning("todo: check if we need to loop over the replacements: % t",subtables) - end - while current do - if getid(current) == glyph_code then - local currentchar = getchar(current) - local lookupname = subtables[1] -- only 1 - local replacement = lookuphash[lookupname] - if not replacement then - if trace_bugs then - logwarning("%s: no single hits",cref(kind,chainname,chainlookupname,lookupname,chainindex)) - end - else - replacement = replacement[currentchar] - if not replacement or replacement == "" then - if trace_bugs then - logwarning("%s: no single for %s",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(currentchar)) - end - else - if trace_singles then - logprocess("%s: replacing single %s by %s",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(currentchar),gref(replacement)) - end - resetinjection(current) - setchar(current,replacement) - end - end - return head, start, true - elseif current == stop then - break - else - current = getnext(current) - end - end - return head, start, false -end - ---[[ldx-- -<p>Here we replace start by a sequence of new glyphs.</p> ---ldx]]-- - -function chainprocs.gsub_multiple(head,start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname) - -- local head, n = delete_till_stop(head,start,stop) - local startchar = getchar(start) - local subtables = currentlookup.subtables - local lookupname = subtables[1] - local replacements = lookuphash[lookupname] - if not replacements then - if trace_bugs then - logwarning("%s: no multiple hits",cref(kind,chainname,chainlookupname,lookupname)) - end - else - replacements = replacements[startchar] - if not replacements or replacement == "" then - if trace_bugs then - logwarning("%s: no multiple for %s",cref(kind,chainname,chainlookupname,lookupname),gref(startchar)) - end - else - if trace_multiples then - logprocess("%s: replacing %s by multiple characters %s",cref(kind,chainname,chainlookupname,lookupname),gref(startchar),gref(replacements)) - end - return multiple_glyphs(head,start,replacements,currentlookup.flags[1]) - end - end - return head, start, false -end - ---[[ldx-- -<p>Here we replace start by new glyph. First we delete the rest of the match.</p> ---ldx]]-- - --- char_1 mark_1 -> char_x mark_1 (ignore marks) --- char_1 mark_1 -> char_x - --- to be checked: do we always have just one glyph? --- we can also have alternates for marks --- marks come last anyway --- are there cases where we need to delete the mark - -function chainprocs.gsub_alternate(head,start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname) - local current = start - local subtables = currentlookup.subtables - local value = featurevalue == true and tfmdata.shared.features[kind] or featurevalue - while current do - if getid(current) == glyph_code then -- is this check needed? - local currentchar = getchar(current) - local lookupname = subtables[1] - local alternatives = lookuphash[lookupname] - if not alternatives then - if trace_bugs then - logwarning("%s: no alternative hit",cref(kind,chainname,chainlookupname,lookupname)) - end - else - alternatives = alternatives[currentchar] - if alternatives then - local choice, comment = get_alternative_glyph(current,alternatives,value,trace_alternatives) - if choice then - if trace_alternatives then - logprocess("%s: replacing %s by alternative %a to %s, %s",cref(kind,chainname,chainlookupname,lookupname),gref(char),choice,gref(choice),comment) - end - resetinjection(start) - setchar(start,choice) - else - if trace_alternatives then - logwarning("%s: no variant %a for %s, %s",cref(kind,chainname,chainlookupname,lookupname),value,gref(char),comment) - end - end - elseif trace_bugs then - logwarning("%s: no alternative for %s, %s",cref(kind,chainname,chainlookupname,lookupname),gref(currentchar),comment) - end - end - return head, start, true - elseif current == stop then - break - else - current = getnext(current) - end - end - return head, start, false -end - ---[[ldx-- -<p>When we replace ligatures we use a helper that handles the marks. I might change -this function (move code inline and handle the marks by a separate function). We -assume rather stupid ligatures (no complex disc nodes).</p> ---ldx]]-- - -function chainprocs.gsub_ligature(head,start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname,chainindex) - local startchar = getchar(start) - local subtables = currentlookup.subtables - local lookupname = subtables[1] - local ligatures = lookuphash[lookupname] - if not ligatures then - if trace_bugs then - logwarning("%s: no ligature hits",cref(kind,chainname,chainlookupname,lookupname,chainindex)) - end - else - ligatures = ligatures[startchar] - if not ligatures then - if trace_bugs then - logwarning("%s: no ligatures starting with %s",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(startchar)) - end - else - local s = getnext(start) - local discfound = false - local last = stop - local nofreplacements = 1 - local skipmark = currentlookup.flags[1] - while s do - local id = getid(s) - if id == disc_code then - if not discfound then - discfound = s - end - if s == stop then - break -- okay? or before the disc - else - s = getnext(s) - end - else - local schar = getchar(s) - if skipmark and marks[schar] then -- marks - s = getnext(s) - else - local lg = ligatures[schar] - if lg then - ligatures, last, nofreplacements = lg, s, nofreplacements + 1 - if s == stop then - break - else - s = getnext(s) - end - else - break - end - end - end - end - local l2 = ligatures.ligature - if l2 then - if chainindex then - stop = last - end - if trace_ligatures then - if start == stop then - logprocess("%s: replacing character %s by ligature %s case 3",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(startchar),gref(l2)) - else - logprocess("%s: replacing character %s upto %s by ligature %s case 4",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(startchar),gref(getchar(stop)),gref(l2)) - end - end - head, start = toligature(kind,lookupname,head,start,stop,l2,currentlookup.flags[1],discfound) - return head, start, true, nofreplacements, discfound - elseif trace_bugs then - if start == stop then - logwarning("%s: replacing character %s by ligature fails",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(startchar)) - else - logwarning("%s: replacing character %s upto %s by ligature fails",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(startchar),gref(getchar(stop))) - end - end - end - end - return head, start, false, 0, false -end - -function chainprocs.gpos_single(head,start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname,chainindex,sequence) - -- untested .. needs checking for the new model - local startchar = getchar(start) - local subtables = currentlookup.subtables - local lookupname = subtables[1] - local kerns = lookuphash[lookupname] - if kerns then - kerns = kerns[startchar] -- needed ? - if kerns then - local dx, dy, w, h = setpair(start,tfmdata.parameters.factor,rlmode,sequence.flags[4],kerns) -- ,characters[startchar]) - if trace_kerns then - logprocess("%s: shifting single %s by (%p,%p) and correction (%p,%p)",cref(kind,chainname,chainlookupname),gref(startchar),dx,dy,w,h) - end - end - end - return head, start, false -end - -function chainprocs.gpos_pair(head,start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname,chainindex,sequence) - local snext = getnext(start) - if snext then - local startchar = getchar(start) - local subtables = currentlookup.subtables - local lookupname = subtables[1] - local kerns = lookuphash[lookupname] - if kerns then - kerns = kerns[startchar] - if kerns then - local lookuptype = lookuptypes[lookupname] - local prev, done = start, false - local factor = tfmdata.parameters.factor - while snext and getid(snext) == glyph_code and getfont(snext) == currentfont and getsubtype(snext)<256 do - local nextchar = getchar(snext) - local krn = kerns[nextchar] - if not krn and marks[nextchar] then - prev = snext - snext = getnext(snext) - else - if not krn then - -- skip - elseif type(krn) == "table" then - if lookuptype == "pair" then - local a, b = krn[2], krn[3] - if a and #a > 0 then - local startchar = getchar(start) - local x, y, w, h = setpair(start,factor,rlmode,sequence.flags[4],a) -- ,characters[startchar]) - if trace_kerns then - logprocess("%s: shifting first of pair %s and %s by (%p,%p) and correction (%p,%p)",cref(kind,chainname,chainlookupname),gref(startchar),gref(nextchar),x,y,w,h) - end - end - if b and #b > 0 then - local startchar = getchar(start) - local x, y, w, h = setpair(snext,factor,rlmode,sequence.flags[4],b) -- ,characters[nextchar]) - if trace_kerns then - logprocess("%s: shifting second of pair %s and %s by (%p,%p) and correction (%p,%p)",cref(kind,chainname,chainlookupname),gref(startchar),gref(nextchar),x,y,w,h) - end - end - else - report_process("%s: check this out (old kern stuff)",cref(kind,chainname,chainlookupname)) - -- local a, b = krn[2], krn[6] - -- if a and a ~= 0 then - -- local k = setkern(snext,factor,rlmode,a) - -- if trace_kerns then - -- logprocess("%s: inserting first kern %s between %s and %s",cref(kind,chainname,chainlookupname),k,gref(getchar(prev)),gref(nextchar)) - -- end - -- end - -- if b and b ~= 0 then - -- logwarning("%s: ignoring second kern xoff %s",cref(kind,chainname,chainlookupname),b*factor) - -- end - end - done = true - elseif krn ~= 0 then - local k = setkern(snext,factor,rlmode,krn) - if trace_kerns then - logprocess("%s: inserting kern %s between %s and %s",cref(kind,chainname,chainlookupname),k,gref(getchar(prev)),gref(nextchar)) - end - done = true - end - break - end - end - return head, start, done - end - end - end - return head, start, false -end - -function chainprocs.gpos_mark2base(head,start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname) - local markchar = getchar(start) - if marks[markchar] then - local subtables = currentlookup.subtables - local lookupname = subtables[1] - local markanchors = lookuphash[lookupname] - if markanchors then - markanchors = markanchors[markchar] - end - if markanchors then - local base = getprev(start) -- [glyph] [start=mark] - if base and getid(base) == glyph_code and getfont(base) == currentfont and getsubtype(base)<256 then - local basechar = getchar(base) - if marks[basechar] then - while true do - base = getprev(base) - if base and getid(base) == glyph_code and getfont(base) == currentfont and getsubtype(base)<256 then - basechar = getchar(base) - if not marks[basechar] then - break - end - else - if trace_bugs then - logwarning("%s: no base for mark %s",pref(kind,lookupname),gref(markchar)) - end - return head, start, false - end - end - end - local baseanchors = descriptions[basechar].anchors - if baseanchors then - local baseanchors = baseanchors['basechar'] - if baseanchors then - local al = anchorlookups[lookupname] - for anchor,ba in next, baseanchors do - if al[anchor] then - local ma = markanchors[anchor] - if ma then - local dx, dy, bound = setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma,characters[basechar]) - if trace_marks then - logprocess("%s, anchor %s, bound %s: anchoring mark %s to basechar %s => (%p,%p)", - cref(kind,chainname,chainlookupname,lookupname),anchor,bound,gref(markchar),gref(basechar),dx,dy) - end - return head, start, true - end - end - end - if trace_bugs then - logwarning("%s, no matching anchors for mark %s and base %s",cref(kind,chainname,chainlookupname,lookupname),gref(markchar),gref(basechar)) - end - end - end - elseif trace_bugs then - logwarning("%s: prev node is no char",cref(kind,chainname,chainlookupname,lookupname)) - end - elseif trace_bugs then - logwarning("%s: mark %s has no anchors",cref(kind,chainname,chainlookupname,lookupname),gref(markchar)) - end - elseif trace_bugs then - logwarning("%s: mark %s is no mark",cref(kind,chainname,chainlookupname),gref(markchar)) - end - return head, start, false -end - -function chainprocs.gpos_mark2ligature(head,start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname) - local markchar = getchar(start) - if marks[markchar] then - local subtables = currentlookup.subtables - local lookupname = subtables[1] - local markanchors = lookuphash[lookupname] - if markanchors then - markanchors = markanchors[markchar] - end - if markanchors then - local base = getprev(start) -- [glyph] [optional marks] [start=mark] - if base and getid(base) == glyph_code and getfont(base) == currentfont and getsubtype(base)<256 then - local basechar = getchar(base) - if marks[basechar] then - while true do - base = getprev(base) - if base and getid(base) == glyph_code and getfont(base) == currentfont and getsubtype(base)<256 then - basechar = getchar(base) - if not marks[basechar] then - break - end - else - if trace_bugs then - logwarning("%s: no base for mark %s",cref(kind,chainname,chainlookupname,lookupname),markchar) - end - return head, start, false - end - end - end - -- todo: like marks a ligatures hash - local index = getligaindex(start) - local baseanchors = descriptions[basechar].anchors - if baseanchors then - local baseanchors = baseanchors['baselig'] - if baseanchors then - local al = anchorlookups[lookupname] - for anchor,ba in next, baseanchors do - if al[anchor] then - local ma = markanchors[anchor] - if ma then - ba = ba[index] - if ba then - local dx, dy, bound = setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma,characters[basechar]) - if trace_marks then - logprocess("%s, anchor %s, bound %s: anchoring mark %s to baselig %s at index %s => (%p,%p)", - cref(kind,chainname,chainlookupname,lookupname),anchor,a or bound,gref(markchar),gref(basechar),index,dx,dy) - end - return head, start, true - end - end - end - end - if trace_bugs then - logwarning("%s: no matching anchors for mark %s and baselig %s",cref(kind,chainname,chainlookupname,lookupname),gref(markchar),gref(basechar)) - end - end - end - elseif trace_bugs then - logwarning("feature %s, lookup %s: prev node is no char",kind,lookupname) - end - elseif trace_bugs then - logwarning("%s: mark %s has no anchors",cref(kind,chainname,chainlookupname,lookupname),gref(markchar)) - end - elseif trace_bugs then - logwarning("%s: mark %s is no mark",cref(kind,chainname,chainlookupname),gref(markchar)) - end - return head, start, false -end - -function chainprocs.gpos_mark2mark(head,start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname) - local markchar = getchar(start) - if marks[markchar] then - -- local markanchors = descriptions[markchar].anchors markanchors = markanchors and markanchors.mark - local subtables = currentlookup.subtables - local lookupname = subtables[1] - local markanchors = lookuphash[lookupname] - if markanchors then - markanchors = markanchors[markchar] - end - if markanchors then - local base = getprev(start) -- [glyph] [basemark] [start=mark] - local slc = getligaindex(start) - if slc then -- a rather messy loop ... needs checking with husayni - while base do - local blc = getligaindex(base) - if blc and blc ~= slc then - base = getprev(base) - else - break - end - end - end - if base and getid(base) == glyph_code and getfont(base) == currentfont and getsubtype(base)<256 then -- subtype test can go - local basechar = getchar(base) - local baseanchors = descriptions[basechar].anchors - if baseanchors then - baseanchors = baseanchors['basemark'] - if baseanchors then - local al = anchorlookups[lookupname] - for anchor,ba in next, baseanchors do - if al[anchor] then - local ma = markanchors[anchor] - if ma then - local dx, dy, bound = setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma,characters[basechar],true) - if trace_marks then - logprocess("%s, anchor %s, bound %s: anchoring mark %s to basemark %s => (%p,%p)", - cref(kind,chainname,chainlookupname,lookupname),anchor,bound,gref(markchar),gref(basechar),dx,dy) - end - return head, start, true - end - end - end - if trace_bugs then - logwarning("%s: no matching anchors for mark %s and basemark %s",gref(kind,chainname,chainlookupname,lookupname),gref(markchar),gref(basechar)) - end - end - end - elseif trace_bugs then - logwarning("%s: prev node is no mark",cref(kind,chainname,chainlookupname,lookupname)) - end - elseif trace_bugs then - logwarning("%s: mark %s has no anchors",cref(kind,chainname,chainlookupname,lookupname),gref(markchar)) - end - elseif trace_bugs then - logwarning("%s: mark %s is no mark",cref(kind,chainname,chainlookupname),gref(markchar)) - end - return head, start, false -end - -function chainprocs.gpos_cursive(head,start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname) - local alreadydone = cursonce and getprop(start,a_cursbase) - if not alreadydone then - local startchar = getchar(start) - local subtables = currentlookup.subtables - local lookupname = subtables[1] - local exitanchors = lookuphash[lookupname] - if exitanchors then - exitanchors = exitanchors[startchar] - end - if exitanchors then - local done = false - if marks[startchar] then - if trace_cursive then - logprocess("%s: ignoring cursive for mark %s",pref(kind,lookupname),gref(startchar)) - end - else - local nxt = getnext(start) - while not done and nxt and getid(nxt) == glyph_code and getfont(nxt) == currentfont and getsubtype(nxt)<256 do - local nextchar = getchar(nxt) - if marks[nextchar] then - -- should not happen (maybe warning) - nxt = getnext(nxt) - else - local entryanchors = descriptions[nextchar] - if entryanchors then - entryanchors = entryanchors.anchors - if entryanchors then - entryanchors = entryanchors['centry'] - if entryanchors then - local al = anchorlookups[lookupname] - for anchor, entry in next, entryanchors do - if al[anchor] then - local exit = exitanchors[anchor] - if exit then - local dx, dy, bound = setcursive(start,nxt,tfmdata.parameters.factor,rlmode,exit,entry,characters[startchar],characters[nextchar]) - if trace_cursive then - logprocess("%s: moving %s to %s cursive (%p,%p) using anchor %s and bound %s in rlmode %s",pref(kind,lookupname),gref(startchar),gref(nextchar),dx,dy,anchor,bound,rlmode) - end - done = true - break - end - end - end - end - end - elseif trace_bugs then - -- logwarning("%s: char %s is missing in font",pref(kind,lookupname),gref(startchar)) - onetimemessage(currentfont,startchar,"no entry anchors",report_fonts) - end - break - end - end - end - return head, start, done - else - if trace_cursive and trace_details then - logprocess("%s, cursive %s is already done",pref(kind,lookupname),gref(getchar(start)),alreadydone) - end - return head, start, false - end - end - return head, start, false -end - --- what pointer to return, spec says stop --- to be discussed ... is bidi changer a space? --- elseif char == zwnj and sequence[n][32] then -- brrr - --- somehow l or f is global --- we don't need to pass the currentcontext, saves a bit --- make a slow variant then can be activated but with more tracing - -local function show_skip(kind,chainname,char,ck,class) - if ck[9] then - logwarning("%s: skipping char %s, class %a, rule %a, lookuptype %a, %a => %a",cref(kind,chainname),gref(char),class,ck[1],ck[2],ck[9],ck[10]) - else - logwarning("%s: skipping char %s, class %a, rule %a, lookuptype %a",cref(kind,chainname),gref(char),class,ck[1],ck[2]) - end -end - --- A previous version had disc collapsing code in the (single sub) handler plus some --- checking in the main loop, but that left the pre/post sequences undone. The best --- solution is to add some checking there and backtrack when a replace/post matches --- but it takes a bit of work to figure out an efficient way (this is what the sweep* --- names refer to). I might look into that variant one day again as it can replace --- some other code too. In that approach we can have a special version for gub and pos --- which gains some speed. This method does the test and passes info to the handlers --- (sweepnode, sweepmode, sweepprev, sweepnext, etc). Here collapsing is handled in the --- main loop which also makes code elsewhere simpler (i.e. no need for the other special --- runners and disc code in ligature building). I also experimented with pushing preceding --- glyphs sequences in the replace/pre fields beforehand which saves checking afterwards --- but at the cost of duplicate glyphs (memory) but it's too much overhead (runtime). --- --- In the meantime Kai had moved the code from the single chain into a more general handler --- and this one (renamed to chaindisk) is used now. I optimized the code a bit and brought --- it in sycn with the other code. Hopefully I didn't introduce errors. Note: this somewhat --- complex approach is meant for fonts that implement (for instance) ligatures by character --- replacement which to some extend is not that suitable for hyphenation. I also use some --- helpers. This method passes some states but reparses the list. There is room for a bit of --- speed up but that will be done in the context version. (In fact a partial rewrite of all --- code can bring some more efficientry.) --- --- I didn't test it with extremes but successive disc nodes still can give issues but in --- order to handle that we need more complex code which also slows down even more. The main --- loop variant could deal with that: test, collapse, backtrack. - -local function chaindisk(head,start,last,kind,chainname,ck,lookuphash,chainlookup,chainlookupname,chainindex,sequence,chainproc) - - if not start then - return head, start, false - end - - local startishead = start == head - local seq = ck[3] - local f = ck[4] - local l = ck[5] - local s = #seq - local done = false - local sweepnode = sweepnode - local sweeptype = sweeptype - local sweepoverflow = false - local checkdisc = getprev(head) -- hm bad name head - local keepdisc = not sweepnode - local lookaheaddisc = nil - local backtrackdisc = nil - local current = start - local last = start - local prev = getprev(start) - - -- fishy: so we can overflow and then go on in the sweep? - - local i = f - while i <= l do - local id = getid(current) - if id == glyph_code then - i = i + 1 - last = current - current = getnext(current) - elseif id == disc_code then - if keepdisc then - keepdisc = false - if notmatchpre[current] ~= notmatchreplace[current] then - lookaheaddisc = current - end - local replace = getfield(current,"replace") - while replace and i <= l do - if getid(replace) == glyph_code then - i = i + 1 - end - replace = getnext(replace) - end - last = current - current = getnext(c) - else - head, current = flattendisk(head,current) - end - else - last = current - current = getnext(current) - end - if current then - -- go on - elseif sweepoverflow then - -- we already are folling up on sweepnode - break - elseif sweeptype == "post" or sweeptype == "replace" then - current = getnext(sweepnode) - if current then - sweeptype = nil - sweepoverflow = true - else - break - end - else - break -- added - end - end - - if sweepoverflow then - local prev = current and getprev(current) - if not current or prev ~= sweepnode then - local head = getnext(sweepnode) - local tail = nil - if prev then - tail = prev - setprev(current,sweepnode) - else - tail = find_node_tail(head) - end - setnext(sweepnode,current) - setprev(head,nil) - setnext(tail,nil) - appenddisc(sweepnode,head) - end - end - - if l < s then - local i = l - local t = sweeptype == "post" or sweeptype == "replace" - while current and i < s do - local id = getid(current) - if id == glyph_code then - i = i + 1 - current = getnext(current) - elseif id == disc_code then - if keepdisc then - keepdisc = false - if notmatchpre[current] ~= notmatchreplace[current] then - lookaheaddisc = current - end - local replace = getfield(c,"replace") - while replace and i < s do - if getid(replace) == glyph_code then - i = i + 1 - end - replace = getnext(replace) - end - current = getnext(current) - elseif notmatchpre[current] ~= notmatchreplace[current] then - head, current = flattendisk(head,current) - else - current = getnext(current) -- HH - end - else - current = getnext(current) - end - if not current and t then - current = getnext(sweepnode) - if current then - sweeptype = nil - end - end - end - end - - if f > 1 then - local current = prev - local i = f - local t = sweeptype == "pre" or sweeptype == "replace" - if not current and t and current == checkdisk then - current = getprev(sweepnode) - end - while current and i > 1 do -- missing getprev added / moved outside - local id = getid(current) - if id == glyph_code then - i = i - 1 - elseif id == disc_code then - if keepdisc then - keepdisc = false - if notmatchpost[current] ~= notmatchreplace[current] then - backtrackdisc = current - end - local replace = getfield(current,"replace") - while replace and i > 1 do - if getid(replace) == glyph_code then - i = i - 1 - end - replace = getnext(replace) - end - elseif notmatchpost[current] ~= notmatchreplace[current] then - head, current = flattendisk(head,current) - end - end - current = getprev(current) - if t and current == checkdisk then - current = getprev(sweepnode) - end - end - end - - local ok = false - if lookaheaddisc then - - local cf = start - local cl = getprev(lookaheaddisc) - local cprev = getprev(start) - local insertedmarks = 0 - - while cprev and getid(cf) == glyph_code and getfont(cf) == currentfont and getsubtype(cf) < 256 and marks[getchar(cf)] do - insertedmarks = insertedmarks + 1 - cf = cprev - startishead = cf == head - cprev = getprev(cprev) - end - - setprev(lookaheaddisc,cprev) - if cprev then - setnext(cprev,lookaheaddisc) - end - setprev(cf,nil) - setnext(cl,nil) - if startishead then - head = lookaheaddisc - end - - local replace = getfield(lookaheaddisc,"replace") - local pre = getfield(lookaheaddisc,"pre") - local new = copy_node_list(cf) - local cnew = new - for i=1,insertedmarks do - cnew = getnext(cnew) - end - local clast = cnew - for i=f,l do - clast = getnext(clast) - end - if not notmatchpre[lookaheaddisc] then - cf, start, ok = chainproc(cf,start,last,kind,chainname,ck,lookuphash,chainlookup,chainlookupname,nil,sequence) - end - if not notmatchreplace[lookaheaddisc] then - new, cnew, ok = chainproc(new,cnew,clast,kind,chainname,ck,lookuphash,chainlookup,chainlookupname,nil,sequence) - end - if pre then - setnext(cl,pre) - setprev(pre,cl) - end - if replace then - local tail = find_node_tail(new) - setnext(tail,replace) - setprev(replace,tail) - end - setfield(lookaheaddisc,"pre",cf) -- also updates tail - setfield(lookaheaddisc,"replace",new) -- also updates tail - - start = getprev(lookaheaddisc) - sweephead[cf] = getnext(clast) - sweephead[new] = getnext(last) - - elseif backtrackdisc then - - local cf = getnext(backtrackdisc) - local cl = start - local cnext = getnext(start) - local insertedmarks = 0 - - while cnext and getid(cnext) == glyph_code and getfont(cnext) == currentfont and getsubtype(cnext) < 256 and marks[getchar(cnext)] do - insertedmarks = insertedmarks + 1 - cl = cnext - cnext = getnext(cnext) - end - if cnext then - setprev(cnext,backtrackdisc) - end - setnext(backtrackdisc,cnext) - setprev(cf,nil) - setnext(cl,nil) - local replace = getfield(backtrackdisc,"replace") - local post = getfield(backtrackdisc,"post") - local new = copy_node_list(cf) - local cnew = find_node_tail(new) - for i=1,insertedmarks do - cnew = getprev(cnew) - end - local clast = cnew - for i=f,l do - clast = getnext(clast) - end - if not notmatchpost[backtrackdisc] then - cf, start, ok = chainproc(cf,start,last,kind,chainname,ck,lookuphash,chainlookup,chainlookupname,nil,sequence) - end - if not notmatchreplace[backtrackdisc] then - new, cnew, ok = chainproc(new,cnew,clast,kind,chainname,ck,lookuphash,chainlookup,chainlookupname,nil,sequence) - end - if post then - local tail = find_node_tail(post) - setnext(tail,cf) - setprev(cf,tail) - else - post = cf - end - if replace then - local tail = find_node_tail(replace) - setnext(tail,new) - setprev(new,tail) - else - replace = new - end - setfield(backtrackdisc,"post",post) -- also updates tail - setfield(backtrackdisc,"replace",replace) -- also updates tail - start = getprev(backtrackdisc) - sweephead[post] = getnext(clast) - sweephead[replace] = getnext(last) - - else - - head, start, ok = chainproc(head,start,last,kind,chainname,ck,lookuphash,chainlookup,chainlookupname,nil,sequence) - - end - - return head, start, ok -end - -local function normal_handle_contextchain(head,start,kind,chainname,contexts,sequence,lookuphash) - local sweepnode = sweepnode - local sweeptype = sweeptype - local diskseen = false - local checkdisc = getprev(head) - local flags = sequence.flags - local done = false - local skipmark = flags[1] - local skipligature = flags[2] - local skipbase = flags[3] - local markclass = sequence.markclass - local skipped = false - - for k=1,#contexts do -- i've only seen ccmp having > 1 (e.g. dejavu) - local match = true - local current = start - local last = start - local ck = contexts[k] - local seq = ck[3] - local s = #seq - -- f..l = mid string - if s == 1 then - -- never happens - match = getid(current) == glyph_code and getfont(current) == currentfont and getsubtype(current)<256 and seq[1][getchar(current)] - else - -- maybe we need a better space check (maybe check for glue or category or combination) - -- we cannot optimize for n=2 because there can be disc nodes - local f = ck[4] - local l = ck[5] - -- current match - if f == 1 and f == l then -- current only - -- already a hit - -- match = true - else -- before/current/after | before/current | current/after - -- no need to test first hit (to be optimized) - if f == l then -- new, else last out of sync (f is > 1) - -- match = true - else - local discfound = nil - local n = f + 1 - last = getnext(last) - while n <= l do - if not last and (sweeptype == "post" or sweeptype == "replace") then - last = getnext(sweepnode) - sweeptype = nil - end - if last then - local id = getid(last) - if id == glyph_code then - if getfont(last) == currentfont and getsubtype(last)<256 then - local char = getchar(last) - local ccd = descriptions[char] - if ccd then - local class = ccd.class or "base" - if class == skipmark or class == skipligature or class == skipbase or (markclass and class == "mark" and not markclass[char]) then - skipped = true - if trace_skips then - show_skip(kind,chainname,char,ck,class) - end - last = getnext(last) - elseif seq[n][char] then - if n < l then - last = getnext(last) - end - n = n + 1 - else - if discfound then - notmatchreplace[discfound] = true - match = not notmatchpre[discfound] - else - match = false - end - break - end - else - if discfound then - notmatchreplace[discfound] = true - match = not notmatchpre[discfound] - else - match = false - end - break - end - else - if discfound then - notmatchreplace[discfound] = true - match = not notmatchpre[discfound] - else - match = false - end - break - end - elseif id == disc_code then - diskseen = true - discfound = last - notmatchpre[last] = nil - notmatchpost[last] = true - notmatchreplace[last] = nil - local pre = getfield(last,"pre") - local replace = getfield(last,"replace") - if pre then - local n = n - while pre do - if seq[n][getchar(pre)] then - n = n + 1 - pre = getnext(pre) - if n > l then - break - end - else - notmatchpre[last] = true - break - end - end - if n <= l then - notmatchpre[last] = true - end - else - notmatchpre[last] = true - end - if replace then - -- so far we never entered this branch - while replace do - if seq[n][getchar(replace)] then - n = n + 1 - replace = getnext(replace) - if n > l then - break - end - else - notmatchreplace[last] = true - match = not notmatchpre[last] - break - end - end - match = not notmatchpre[last] - end - last = getnext(last) - else - match = false - break - end - else - match = false - break - end - end - end - end - -- before - if match and f > 1 then - local prev = getprev(start) - if prev then - if prev == checkdisc and (sweeptype == "pre" or sweeptype == "replace") then - prev = getprev(sweepnode) - -- sweeptype = nil - end - if prev then - local discfound = nil - local n = f - 1 - while n >= 1 do - if prev then - local id = getid(prev) - if id == glyph_code then - if getfont(prev) == currentfont and getsubtype(prev)<256 then -- normal char - local char = getchar(prev) - local ccd = descriptions[char] - if ccd then - local class = ccd.class - if class == skipmark or class == skipligature or class == skipbase or (markclass and class == "mark" and not markclass[char]) then - skipped = true - if trace_skips then - show_skip(kind,chainname,char,ck,class) - end - elseif seq[n][char] then - n = n -1 - else - if discfound then - notmatchreplace[discfound] = true - match = not notmatchpost[discfound] - else - match = false - end - break - end - else - if discfound then - notmatchreplace[discfound] = true - match = not notmatchpost[discfound] - else - match = false - end - break - end - else - if discfound then - notmatchreplace[discfound] = true - match = not notmatchpost[discfound] - else - match = false - end - break - end - elseif id == disc_code then - -- the special case: f i where i becomes dottless i .. - diskseen = true - discfound = prev - notmatchpre[prev] = true - notmatchpost[prev] = nil - notmatchreplace[prev] = nil - local pre = getfield(prev,"pre") - local post = getfield(prev,"post") - local replace = getfield(prev,"replace") - if pre ~= start and post ~= start and replace ~= start then - if post then - local n = n - local posttail = find_node_tail(post) - while posttail do - if seq[n][getchar(posttail)] then - n = n - 1 - if posttail == post then - break - else - posttail = getprev(posttail) - if n < 1 then - break - end - end - else - notmatchpost[prev] = true - break - end - end - if n >= 1 then - notmatchpost[prev] = true - end - else - notmatchpost[prev] = true - end - if replace then - -- we seldom enter this branch (e.g. on brill efficient) - local replacetail = find_node_tail(replace) - while replacetail do - if seq[n][getchar(replacetail)] then - n = n - 1 - if replacetail == replace then - break - else - replacetail = getprev(replacetail) - if n < 1 then - break - end - end - else - notmatchreplace[prev] = true - match = not notmatchpost[prev] - break - end - end - if not match then - break - end - else - -- skip 'm - end - else - -- skip 'm - end - elseif seq[n][32] then - n = n -1 - else - match = false - break - end - prev = getprev(prev) - elseif seq[n][32] then -- somewhat special, as zapfino can have many preceding spaces - n = n - 1 - else - match = false - break - end - end - else - match = false - end - else - match = false - end - end - -- after - if match and s > l then - local current = last and getnext(last) - if not current then - if sweeptype == "post" or sweeptype == "replace" then - current = getnext(sweepnode) - -- sweeptype = nil - end - end - if current then - local discfound = nil - -- removed optimization for s-l == 1, we have to deal with marks anyway - local n = l + 1 - while n <= s do - if current then - local id = getid(current) - if id == glyph_code then - if getfont(current) == currentfont and getsubtype(current)<256 then -- normal char - local char = getchar(current) - local ccd = descriptions[char] - if ccd then - local class = ccd.class - if class == skipmark or class == skipligature or class == skipbase or (markclass and class == "mark" and not markclass[char]) then - skipped = true - if trace_skips then - show_skip(kind,chainname,char,ck,class) - end - elseif seq[n][char] then - n = n + 1 - else - if discfound then - notmatchreplace[discfound] = true - match = not notmatchpre[discfound] - else - match = false - end - break - end - else - if discfound then - notmatchreplace[discfound] = true - match = not notmatchpre[discfound] - else - match = false - end - break - end - else - if discfound then - notmatchreplace[discfound] = true - match = not notmatchpre[discfound] - else - match = false - end - break - end - elseif id == disc_code then - diskseen = true - discfound = current - notmatchpre[current] = nil - notmatchpost[current] = true - notmatchreplace[current] = nil - local pre = getfield(current,"pre") - local replace = getfield(current,"replace") - if pre then - local n = n - while pre do - if seq[n][getchar(pre)] then - n = n + 1 - pre = getnext(pre) - if n > s then - break - end - else - notmatchpre[current] = true - break - end - end - if n <= s then - notmatchpre[current] = true - end - else - notmatchpre[current] = true - end - if replace then - -- so far we never entered this branch - while replace do - if seq[n][getchar(replace)] then - n = n + 1 - replace = getnext(replace) - if n > s then - break - end - else - notmatchreplace[current] = true - match = notmatchpre[current] - break - end - end - if not match then - break - end - else - -- skip 'm - end - elseif seq[n][32] then -- brrr - n = n + 1 - else - match = false - break - end - current = getnext(current) - elseif seq[n][32] then - n = n + 1 - else - match = false - break - end - end - else - match = false - end - end - end - if match then - -- can lookups be of a different type ? - local diskchain = diskseen or sweepnode - if trace_contexts then - local rule, lookuptype, f, l = ck[1], ck[2], ck[4], ck[5] - local char = getchar(start) - if ck[9] then - logwarning("%s: rule %s matches at char %s for (%s,%s,%s) chars, lookuptype %a, %a => %a", - cref(kind,chainname),rule,gref(char),f-1,l-f+1,s-l,lookuptype,ck[9],ck[10]) - else - logwarning("%s: rule %s matches at char %s for (%s,%s,%s) chars, lookuptype %a", - cref(kind,chainname),rule,gref(char),f-1,l-f+1,s-l,lookuptype) - end - end - local chainlookups = ck[6] - if chainlookups then - local nofchainlookups = #chainlookups - -- we can speed this up if needed - if nofchainlookups == 1 then - local chainlookupname = chainlookups[1] - local chainlookup = lookuptable[chainlookupname] - if chainlookup then - local chainproc = chainprocs[chainlookup.type] - if chainproc then - local ok - if diskchain then - head, start, ok = chaindisk(head,start,last,kind,chainname,ck,lookuphash,chainlookup,chainlookupname,nil,sequence,chainproc) - else - head, start, ok = chainproc(head,start,last,kind,chainname,ck,lookuphash,chainlookup,chainlookupname,nil,sequence) - end - if ok then - done = true - end - else - logprocess("%s: %s is not yet supported",cref(kind,chainname,chainlookupname),chainlookup.type) - end - else -- shouldn't happen - logprocess("%s is not yet supported",cref(kind,chainname,chainlookupname)) - end - else - local i = 1 - while start and true do - if skipped then - while true do -- todo: use properties - local char = getchar(start) - local ccd = descriptions[char] - if ccd then - local class = ccd.class or "base" - if class == skipmark or class == skipligature or class == skipbase or (markclass and class == "mark" and not markclass[char]) then - start = getnext(start) - else - break - end - else - break - end - end - end - -- see remark in ms standard under : LookupType 5: Contextual Substitution Subtable - local chainlookupname = chainlookups[i] - local chainlookup = lookuptable[chainlookupname] - if not chainlookup then - -- we just advance - i = i + 1 - else - local chainproc = chainprocs[chainlookup.type] - if not chainproc then - -- actually an error - logprocess("%s: %s is not yet supported",cref(kind,chainname,chainlookupname),chainlookup.type) - i = i + 1 - else - local ok, n - if diskchain then - head, start, ok = chaindisk(head,start,last,kind,chainname,ck,lookuphash,chainlookup,chainlookupname,nil,sequence,chainproc) - else - head, start, ok, n = chainproc(head,start,last,kind,chainname,ck,lookuphash,chainlookup,chainlookupname,i,sequence) - end - -- messy since last can be changed ! - if ok then - done = true - if n and n > 1 then - -- we have a ligature (cf the spec we advance one but we really need to test it - -- as there are fonts out there that are fuzzy and have too many lookups: - -- - -- U+1105 U+119E U+1105 U+119E : sourcehansansklight: script=hang ccmp=yes - -- - if i + n > nofchainlookups then - -- if trace_contexts then - -- logprocess("%s: quitting lookups",cref(kind,chainname)) - -- end - break - else - -- we need to carry one - end - end - end - i = i + 1 - end - end - if i > nofchainlookups or not start then - break - elseif start then - start = getnext(start) - end - end - end - else - local replacements = ck[7] - if replacements then - head, start, done = chainprocs.reversesub(head,start,last,kind,chainname,ck,lookuphash,replacements) -- sequence - else - done = quit_on_no_replacement -- can be meant to be skipped / quite inconsistent in fonts - if trace_contexts then - logprocess("%s: skipping match",cref(kind,chainname)) - end - end - end - if done then - break -- out of contexts (new, needs checking) - end - end - end - if diskseen then -- maybe move up so that we can turn checking on/off - notmatchpre = { } - notmatchpost = { } - notmatchreplace = { } - end - return head, start, done -end - --- Because we want to keep this elsewhere (an because speed is less an issue) we --- pass the font id so that the verbose variant can access the relevant helper tables. - -local verbose_handle_contextchain = function(font,...) - logwarning("no verbose handler installed, reverting to 'normal'") - otf.setcontextchain() - return normal_handle_contextchain(...) -end - -otf.chainhandlers = { - normal = normal_handle_contextchain, - verbose = verbose_handle_contextchain, -} - -local handle_contextchain = nil - --- normal_handle_contextchain(head,start,kind,chainname,contexts,sequence,lookuphash) - -local function chained_contextchain(head,start,stop,...) - local steps = currentlookup.steps - local nofsteps = currentlookup.nofsteps - if nofsteps > 1 then - reportmoresteps(dataset,sequence) - end - return handle_contextchain(head,start,...) -end - -function otf.setcontextchain(method) - if not method or method == "normal" or not otf.chainhandlers[method] then - if handle_contextchain then -- no need for a message while making the format - logwarning("installing normal contextchain handler") - end - handle_contextchain = normal_handle_contextchain - else - logwarning("installing contextchain handler %a",method) - local handler = otf.chainhandlers[method] - handle_contextchain = function(...) - return handler(currentfont,...) -- hm, get rid of ... - end - end - - handlers.gsub_context = handle_contextchain - handlers.gsub_contextchain = handle_contextchain - handlers.gsub_reversecontextchain = handle_contextchain - handlers.gpos_contextchain = handle_contextchain - handlers.gpos_context = handle_contextchain - - handlers.contextchain = handle_contextchain - -end - -chainprocs.gsub_context = chained_contextchain -chainprocs.gsub_contextchain = chained_contextchain -chainprocs.gsub_reversecontextchain = chained_contextchain -chainprocs.gpos_contextchain = chained_contextchain -chainprocs.gpos_context = chained_contextchain - -otf.setcontextchain() - -local missing = { } -- we only report once - -local function logprocess(...) - if trace_steps then - registermessage(...) - end - report_process(...) -end - -local logwarning = report_process - -local function report_missing_cache(typ,lookup) - local f = missing[currentfont] if not f then f = { } missing[currentfont] = f end - local t = f[typ] if not t then t = { } f[typ] = t end - if not t[lookup] then - t[lookup] = true - logwarning("missing cache for lookup %a, type %a, font %a, name %a",lookup,typ,currentfont,tfmdata.properties.fullname) - end -end - -local resolved = { } -- we only resolve a font,script,language pair once - --- todo: pass all these 'locals' in a table - -local lookuphashes = { } - -setmetatableindex(lookuphashes, function(t,font) - local lookuphash = fontdata[font].resources.lookuphash - if not lookuphash or not next(lookuphash) then - lookuphash = false - end - t[font] = lookuphash - return lookuphash -end) - --- fonts.hashes.lookups = lookuphashes - -local autofeatures = fonts.analyzers.features -local featuretypes = otf.tables.featuretypes -local defaultscript = otf.features.checkeddefaultscript -local defaultlanguage = otf.features.checkeddefaultlanguage - -local function initialize(sequence,script,language,enabled,autoscript,autolanguage) - local features = sequence.features - if features then - local order = sequence.order - if order then - local featuretype = featuretypes[sequence.type or "unknown"] - for i=1,#order do - local kind = order[i] - local valid = enabled[kind] - if valid then - local scripts = features[kind] - local languages = scripts and ( - scripts[script] or - scripts[wildcard] or - (autoscript and defaultscript(featuretype,autoscript,scripts)) - ) - local enabled = languages and ( - languages[language] or - languages[wildcard] or - (autolanguage and defaultlanguage(featuretype,autolanguage,languages)) - ) - if enabled then - return { valid, autofeatures[kind] or false, sequence, kind } - end - end - end - else - -- can't happen - end - end - return false -end - -function otf.dataset(tfmdata,font) -- generic variant, overloaded in context - local shared = tfmdata.shared - local properties = tfmdata.properties - local language = properties.language or "dflt" - local script = properties.script or "dflt" - local enabled = shared.features - local autoscript = enabled and enabled.autoscript - local autolanguage = enabled and enabled.autolanguage - local res = resolved[font] - if not res then - res = { } - resolved[font] = res - end - local rs = res[script] - if not rs then - rs = { } - res[script] = rs - end - local rl = rs[language] - if not rl then - rl = { - -- indexed but we can also add specific data by key - } - rs[language] = rl - local sequences = tfmdata.resources.sequences - if sequences then - for s=1,#sequences do - local v = enabled and initialize(sequences[s],script,language,enabled,autoscript,autolanguage) - if v then - rl[#rl+1] = v - end - end - end - end - return rl -end - --- assumptions: --- --- * languages that use complex disc nodes - -local function kernrun(disc,run) - -- - -- we catch <font 1><disc font 2> - -- - if trace_kernruns then - report_run("kern") -- will be more detailed - end - -- - local prev = getprev(disc) -- todo, keep these in the main loop - local next = getnext(disc) -- todo, keep these in the main loop - -- - local pre = getfield(disc,"pre") - local post = getfield(disc,"post") - local replace = getfield(disc,"replace") - -- - local prevmarks = prev - -- - -- can be optional, because why on earth do we get a disc after a mark (okay, maybe when a ccmp - -- has happened but then it should be in the disc so basically this test indicates an error) - -- - while prevmarks and getid(prevmarks) == glyph_code and marks[getchar(prevmarks)] and getfont(prevmarks) == currentfont and getsubtype(prevmarks) < 256 do - prevmarks = getprev(prevmarks) - end - -- - if prev and (pre or replace) and not (getid(prev) == glyph_code and getfont(prev) == currentfont and getsubtype(prev)<256) then - prev = false - end - if next and (post or replace) and not (getid(next) == glyph_code and getfont(next) == currentfont and getsubtype(next)<256) then - next = false - end - -- - if not pre then - -- go on - elseif prev then - local nest = getprev(pre) - setprev(pre,prev) - setnext(prev,pre) - run(prevmarks,"preinjections") - setprev(pre,nest) - setnext(prev,disc) - else - run(pre,"preinjections") - end - -- - if not post then - -- go on - elseif next then - local tail = find_node_tail(post) - setnext(tail,next) - setprev(next,tail) - run(post,"postinjections",next) - setnext(tail,nil) - setprev(next,disc) - else - run(post,"postinjections") - end - -- - if not replace and prev and next then - -- this should be already done by discfound - setnext(prev,next) - setprev(next,prev) - run(prevmarks,"injections",next) - setnext(prev,disc) - setprev(next,disc) - elseif prev and next then - local tail = find_node_tail(replace) - local nest = getprev(replace) - setprev(replace,prev) - setnext(prev,replace) - setnext(tail,next) - setprev(next,tail) - run(prevmarks,"replaceinjections",next) - setprev(replace,nest) - setnext(prev,disc) - setnext(tail,nil) - setprev(next,disc) - elseif prev then - local nest = getprev(replace) - setprev(replace,prev) - setnext(prev,replace) - run(prevmarks,"replaceinjections") - setprev(replace,nest) - setnext(prev,disc) - elseif next then - local tail = find_node_tail(replace) - setnext(tail,next) - setprev(next,tail) - run(replace,"replaceinjections",next) - setnext(tail,nil) - setprev(next,disc) - else - run(replace,"replaceinjections") - end -end - --- the if new test might be dangerous as luatex will check / set some tail stuff --- in a temp node - -local function comprun(disc,run) - if trace_compruns then - report_run("comp: %s",languages.serializediscretionary(disc)) - end - -- - local pre = getfield(disc,"pre") - if pre then - sweepnode = disc - sweeptype = "pre" -- in alternative code preinjections is used (also used then for proeprties, saves a variable) - local new, done = run(pre) - if done then - setfield(disc,"pre",new) - end - end - -- - local post = getfield(disc,"post") - if post then - sweepnode = disc - sweeptype = "post" - local new, done = run(post) - if done then - setfield(disc,"post",new) - end - end - -- - local replace = getfield(disc,"replace") - if replace then - sweepnode = disc - sweeptype = "replace" - local new, done = run(replace) - if done then - setfield(disc,"replace",new) - end - end - sweepnode = nil - sweeptype = nil -end - -local function testrun(disc,trun,crun) -- use helper - local next = getnext(disc) - if next then - local replace = getfield(disc,"replace") - if replace then - local prev = getprev(disc) - if prev then - -- only look ahead - local tail = find_node_tail(replace) - -- local nest = getprev(replace) - setnext(tail,next) - setprev(next,tail) - if trun(replace,next) then - setfield(disc,"replace",nil) -- beware, side effects of nest so first - setnext(prev,replace) - setprev(replace,prev) - setprev(next,tail) - setnext(tail,next) - setprev(disc,nil) - setnext(disc,nil) - flush_node_list(disc) - return replace -- restart - else - setnext(tail,nil) - setprev(next,disc) - end - else - -- weird case - end - else - -- no need - end - else - -- weird case - end - comprun(disc,crun) - return next -end - -local function discrun(disc,drun,krun) - local next = getnext(disc) - local prev = getprev(disc) - if trace_discruns then - report_run("disc") -- will be more detailed - end - if next and prev then - setnext(prev,next) - -- setprev(next,prev) - drun(prev) - setnext(prev,disc) - -- setprev(next,disc) - end - -- - local pre = getfield(disc,"pre") - if not pre then - -- go on - elseif prev then - local nest = getprev(pre) - setprev(pre,prev) - setnext(prev,pre) - krun(prev,"preinjections") - setprev(pre,nest) - setnext(prev,disc) - else - krun(pre,"preinjections") - end - return next -end - --- todo: maybe run lr and rl stretches - -local function featuresprocessor(head,font,attr) - - local lookuphash = lookuphashes[font] -- we can also check sequences here - - if not lookuphash then - return head, false - end - - head = tonut(head) - - if trace_steps then - checkstep(head) - end - - tfmdata = fontdata[font] - descriptions = tfmdata.descriptions - characters = tfmdata.characters - resources = tfmdata.resources - - marks = resources.marks - anchorlookups = resources.lookup_to_anchor - lookuptable = resources.lookups - lookuptypes = resources.lookuptypes - lookuptags = resources.lookuptags - - currentfont = font - rlmode = 0 - sweephead = { } - - local sequences = resources.sequences - local done = false - local datasets = otf.dataset(tfmdata,font,attr) - - local dirstack = { } -- could move outside function - - -- We could work on sub start-stop ranges instead but I wonder if there is that - -- much speed gain (experiments showed that it made not much sense) and we need - -- to keep track of directions anyway. Also at some point I want to play with - -- font interactions and then we do need the full sweeps. - - -- Keeping track of the headnode is needed for devanagari (I generalized it a bit - -- so that multiple cases are also covered.) - - -- We don't goto the next node of a disc node is created so that we can then treat - -- the pre, post and replace. It's abit of a hack but works out ok for most cases. - - -- there can be less subtype and attr checking in the comprun etc helpers - - for s=1,#datasets do - local dataset = datasets[s] - featurevalue = dataset[1] -- todo: pass to function instead of using a global - local attribute = dataset[2] - local sequence = dataset[3] -- sequences[s] -- also dataset[5] - local kind = dataset[4] - ----- chain = dataset[5] -- sequence.chain or 0 - local rlparmode = 0 - local topstack = 0 - local success = false - local typ = sequence.type - local gpossing = typ == "gpos_single" or typ == "gpos_pair" -- maybe all of them - local subtables = sequence.subtables - local handler = handlers[typ] - if typ == "gsub_reversecontextchain" then -- chain < 0 - -- this is a limited case, no special treatments like 'init' etc - -- we need to get rid of this slide! probably no longer needed in latest luatex - local start = find_node_tail(head) -- slow (we can store tail because there's always a skip at the end): todo - while start do - local id = getid(start) - if id == glyph_code then - if getfont(start) == font and getsubtype(start) < 256 then - local a = getattr(start,0) - if a then - a = a == attr - else - a = true - end - if a then - local char = getchar(start) - for i=1,#subtables do - local lookupname = subtables[i] - local lookupcache = lookuphash[lookupname] - if lookupcache then - local lookupmatch = lookupcache[char] - if lookupmatch then - -- todo: disc? - head, start, success = handler(head,start,kind,lookupname,lookupmatch,sequence,lookuphash,i) - if success then - break - end - end - else - report_missing_cache(typ,lookupname) - end - end - if start then start = getprev(start) end - else - start = getprev(start) - end - else - start = getprev(start) - end - else - start = getprev(start) - end - end - else - local ns = #subtables - local start = head -- local ? - rlmode = 0 -- to be checked ? - if ns == 1 then -- happens often - local lookupname = subtables[1] - local lookupcache = lookuphash[lookupname] - if not lookupcache then -- also check for empty cache - report_missing_cache(typ,lookupname) - else - - local function c_run(head) -- no need to check for 256 and attr probably also the same - local done = false - local start = sweephead[head] - if start then - sweephead[head] = nil - else - start = head - end - while start do - local id = getid(start) - if id ~= glyph_code then - -- very unlikely - start = getnext(start) - elseif getfont(start) == font and getsubtype(start) < 256 then - local a = getattr(start,0) - if a then - a = (a == attr) and (not attribute or getprop(start,a_state) == attribute) - else - a = not attribute or getprop(start,a_state) == attribute - end - if a then - local lookupmatch = lookupcache[getchar(start)] - if lookupmatch then - -- sequence kan weg - local ok - head, start, ok = handler(head,start,kind,lookupname,lookupmatch,sequence,lookuphash,1) - if ok then - done = true - end - end - if start then start = getnext(start) end - else - start = getnext(start) - end - else - return head, false - end - end - if done then - success = true -- needed in this subrun? - end - return head, done - end - - local function t_run(start,stop) - while start ~= stop do - local id = getid(start) - if id == glyph_code and getfont(start) == font and getsubtype(start) < 256 then - local a = getattr(start,0) - if a then - a = (a == attr) and (not attribute or getprop(start,a_state) == attribute) - else - a = not attribute or getprop(start,a_state) == attribute - end - if a then - local lookupmatch = lookupcache[getchar(start)] - if lookupmatch then -- hm, hyphens can match (tlig) so we need to really check - -- if we need more than ligatures we can outline the code and use functions - local s = getnext(start) - local l = nil - while s do - local lg = lookupmatch[getchar(s)] - if lg then - l = lg - s = getnext(s) - else - break - end - end - if l and l.ligature then - return true - end - end - end - start = getnext(start) - else - break - end - end - end - - local function d_run(prev) -- we can assume that prev and next are glyphs - local a = getattr(prev,0) - if a then - a = (a == attr) and (not attribute or getprop(prev,a_state) == attribute) - else - a = not attribute or getprop(prev,a_state) == attribute - end - if a then - local lookupmatch = lookupcache[getchar(prev)] - if lookupmatch then - -- sequence kan weg - local h, d, ok = handler(head,prev,kind,lookupname,lookupmatch,sequence,lookuphash,1) - if ok then - done = true - success = true - end - end - end - end - - local function k_run(sub,injection,last) - local a = getattr(sub,0) - if a then - a = (a == attr) and (not attribute or getprop(sub,a_state) == attribute) - else - a = not attribute or getprop(sub,a_state) == attribute - end - if a then - -- sequence kan weg - for n in traverse_nodes(sub) do -- only gpos - if n == last then - break - end - local id = getid(n) - if id == glyph_code then - local lookupmatch = lookupcache[getchar(n)] - if lookupmatch then - local h, d, ok = handler(sub,n,kind,lookupname,lookupmatch,sequence,lookuphash,1,injection) - if ok then - done = true - success = true - end - end - else - -- message - end - end - end - end - - while start do - local id = getid(start) - if id == glyph_code then - if getfont(start) == font and getsubtype(start) < 256 then -- why a 256 test ... - local a = getattr(start,0) - if a then - a = (a == attr) and (not attribute or getprop(start,a_state) == attribute) - else - a = not attribute or getprop(start,a_state) == attribute - end - if a then - local char = getchar(start) - local lookupmatch = lookupcache[char] - if lookupmatch then - -- sequence kan weg - local ok - head, start, ok = handler(head,start,kind,lookupname,lookupmatch,sequence,lookuphash,1) - if ok then - success = true - elseif gpossing and zwnjruns and char == zwnj then - discrun(start,d_run) - end - elseif gpossing and zwnjruns and char == zwnj then - discrun(start,d_run) - end - if start then start = getnext(start) end - else - start = getnext(start) - end - else - start = getnext(start) - end - elseif id == disc_code then - if gpossing then - kernrun(start,k_run) - start = getnext(start) - elseif typ == "gsub_ligature" then - start = testrun(start,t_run,c_run) - else - comprun(start,c_run) - start = getnext(start) - end - elseif id == math_code then - start = getnext(end_of_math(start)) - elseif id == dir_code then - local dir = getfield(start,"dir") - if dir == "+TLT" then - topstack = topstack + 1 - dirstack[topstack] = dir - rlmode = 1 - elseif dir == "+TRT" then - topstack = topstack + 1 - dirstack[topstack] = dir - rlmode = -1 - elseif dir == "-TLT" or dir == "-TRT" then - topstack = topstack - 1 - rlmode = dirstack[topstack] == "+TRT" and -1 or 1 - else - rlmode = rlparmode - end - if trace_directions then - report_process("directions after txtdir %a: parmode %a, txtmode %a, # stack %a, new dir %a",dir,rlparmode,rlmode,topstack,newdir) - end - start = getnext(start) - elseif id == localpar_code then - local dir = getfield(start,"dir") - if dir == "TRT" then - rlparmode = -1 - elseif dir == "TLT" then - rlparmode = 1 - else - rlparmode = 0 - end - -- one might wonder if the par dir should be looked at, so we might as well drop the next line - rlmode = rlparmode - if trace_directions then - report_process("directions after pardir %a: parmode %a, txtmode %a",dir,rlparmode,rlmode) - end - start = getnext(start) - else - start = getnext(start) - end - end - end - - else - - local function c_run(head) - local done = false - local start = sweephead[head] - if start then - sweephead[head] = nil - else - start = head - end - while start do - local id = getid(start) - if id ~= glyph_code then - -- very unlikely - start = getnext(start) - elseif getfont(start) == font and getsubtype(start) < 256 then - local a = getattr(start,0) - if a then - a = (a == attr) and (not attribute or getprop(start,a_state) == attribute) - else - a = not attribute or getprop(start,a_state) == attribute - end - if a then - local char = getchar(start) - for i=1,ns do - local lookupname = subtables[i] - local lookupcache = lookuphash[lookupname] - if lookupcache then - local lookupmatch = lookupcache[char] - if lookupmatch then - -- we could move all code inline but that makes things even more unreadable - local ok - head, start, ok = handler(head,start,kind,lookupname,lookupmatch,sequence,lookuphash,i) - if ok then - done = true - break - elseif not start then - -- don't ask why ... shouldn't happen - break - end - end - else - report_missing_cache(typ,lookupname) - end - end - if start then start = getnext(start) end - else - start = getnext(start) - end - else - return head, false - end - end - if done then - success = true - end - return head, done - end - - local function d_run(prev) - local a = getattr(prev,0) - if a then - a = (a == attr) and (not attribute or getprop(prev,a_state) == attribute) - else - a = not attribute or getprop(prev,a_state) == attribute - end - if a then - -- brr prev can be disc - local char = getchar(prev) - for i=1,ns do - local lookupname = subtables[i] - local lookupcache = lookuphash[lookupname] - if lookupcache then - local lookupmatch = lookupcache[char] - if lookupmatch then - -- we could move all code inline but that makes things even more unreadable - local h, d, ok = handler(head,prev,kind,lookupname,lookupmatch,sequence,lookuphash,i) - if ok then - done = true - break - end - end - else - report_missing_cache(typ,lookupname) - end - end - end - end - - local function k_run(sub,injection,last) - local a = getattr(sub,0) - if a then - a = (a == attr) and (not attribute or getprop(sub,a_state) == attribute) - else - a = not attribute or getprop(sub,a_state) == attribute - end - if a then - for n in traverse_nodes(sub) do -- only gpos - if n == last then - break - end - local id = getid(n) - if id == glyph_code then - local char = getchar(n) - for i=1,ns do - local lookupname = subtables[i] - local lookupcache = lookuphash[lookupname] - if lookupcache then - local lookupmatch = lookupcache[char] - if lookupmatch then - local h, d, ok = handler(head,n,kind,lookupname,lookupmatch,sequence,lookuphash,i,injection) - if ok then - done = true - break - end - end - else - report_missing_cache(typ,lookupname) - end - end - else - -- message - end - end - end - end - - local function t_run(start,stop) - while start ~= stop do - local id = getid(start) - if id == glyph_code and getfont(start) == font and getsubtype(start) < 256 then - local a = getattr(start,0) - if a then - a = (a == attr) and (not attribute or getprop(start,a_state) == attribute) - else - a = not attribute or getprop(start,a_state) == attribute - end - if a then - local char = getchar(start) - for i=1,ns do - local lookupname = subtables[i] - local lookupcache = lookuphash[lookupname] - if lookupcache then - local lookupmatch = lookupcache[char] - if lookupmatch then - -- if we need more than ligatures we can outline the code and use functions - local s = getnext(start) - local l = nil - while s do - local lg = lookupmatch[getchar(s)] - if lg then - l = lg - s = getnext(s) - else - break - end - end - if l and l.ligature then - return true - end - end - else - report_missing_cache(typ,lookupname) - end - end - end - start = getnext(start) - else - break - end - end - end - - while start do - local id = getid(start) - if id == glyph_code then - if getfont(start) == font and getsubtype(start) < 256 then - local a = getattr(start,0) - if a then - a = (a == attr) and (not attribute or getprop(start,a_state) == attribute) - else - a = not attribute or getprop(start,a_state) == attribute - end - if a then - for i=1,ns do - local lookupname = subtables[i] - local lookupcache = lookuphash[lookupname] - if lookupcache then - local char = getchar(start) - local lookupmatch = lookupcache[char] - if lookupmatch then - -- we could move all code inline but that makes things even more unreadable - local ok - head, start, ok = handler(head,start,kind,lookupname,lookupmatch,sequence,lookuphash,i) - if ok then - success = true - break - elseif not start then - -- don't ask why ... shouldn't happen - break - elseif gpossing and zwnjruns and char == zwnj then - discrun(start,d_run) - end - elseif gpossing and zwnjruns and char == zwnj then - discrun(start,d_run) - end - else - report_missing_cache(typ,lookupname) - end - end - if start then start = getnext(start) end - else - start = getnext(start) - end - else - start = getnext(start) - end - elseif id == disc_code then - if gpossing then - kernrun(start,k_run) - start = getnext(start) - elseif typ == "gsub_ligature" then - start = testrun(start,t_run,c_run) - else - comprun(start,c_run) - start = getnext(start) - end - elseif id == math_code then - start = getnext(end_of_math(start)) - elseif id == dir_code then - local dir = getfield(start,"dir") - if dir == "+TLT" then - topstack = topstack + 1 - dirstack[topstack] = dir - rlmode = 1 - elseif dir == "+TRT" then - topstack = topstack + 1 - dirstack[topstack] = dir - rlmode = -1 - elseif dir == "-TLT" or dir == "-TRT" then - topstack = topstack - 1 - rlmode = dirstack[topstack] == "+TRT" and -1 or 1 - else - rlmode = rlparmode - end - if trace_directions then - report_process("directions after txtdir %a: parmode %a, txtmode %a, # stack %a, new dir %a",dir,rlparmode,rlmode,topstack,newdir) - end - start = getnext(start) - elseif id == localpar_code then - local dir = getfield(start,"dir") - if dir == "TRT" then - rlparmode = -1 - elseif dir == "TLT" then - rlparmode = 1 - else - rlparmode = 0 - end - rlmode = rlparmode - if trace_directions then - report_process("directions after pardir %a: parmode %a, txtmode %a",dir,rlparmode,rlmode) - end - start = getnext(start) - else - start = getnext(start) - end - end - end - end - if success then - done = true - end - if trace_steps then -- ? - registerstep(head) - end - - end - - head = tonode(head) - - return head, done -end - --- this might move to the loader - -local function generic(lookupdata,lookupname,unicode,lookuphash) - local target = lookuphash[lookupname] - if target then - target[unicode] = lookupdata - else - lookuphash[lookupname] = { [unicode] = lookupdata } - end -end - -local function ligature(lookupdata,lookupname,unicode,lookuphash) - local target = lookuphash[lookupname] - if not target then - target = { } - lookuphash[lookupname] = target - end - for i=1,#lookupdata do - local li = lookupdata[i] - local tu = target[li] - if not tu then - tu = { } - target[li] = tu - end - target = tu - end - target.ligature = unicode -end - --- this is not ok .. it doesn't work for the old loader with new loader extension --- specs - -local function pair(lookupdata,lookupname,unicode,lookuphash) - local target = lookuphash[lookupname] - if not target then - target = { } - lookuphash[lookupname] = target - end - local others = target[unicode] - local paired = lookupdata[1] - if not paired then - -- something is wrong - elseif others then - others[paired] = lookupdata - else - others = { [paired] = lookupdata } - target[unicode] = others - end -end - -local action = { - substitution = generic, - multiple = generic, - alternate = generic, - position = generic, - ligature = ligature, - pair = pair, - kern = pair, -} - -local function prepare_lookups(tfmdata) - - local rawdata = tfmdata.shared.rawdata - local resources = rawdata.resources - local lookuphash = resources.lookuphash - local anchor_to_lookup = resources.anchor_to_lookup - local lookup_to_anchor = resources.lookup_to_anchor - local lookuptypes = resources.lookuptypes - local characters = tfmdata.characters - local descriptions = tfmdata.descriptions - local duplicates = resources.duplicates - - -- we cannot free the entries in the descriptions as sometimes we access - -- then directly (for instance anchors) ... selectively freeing does save - -- much memory as it's only a reference to a table and the slot in the - -- description hash is not freed anyway - - -- we can delay this using metatables so that we don't make the hashes for - -- features we don't use but then we need to loop over the characters - -- many times so we gain nothing - - for unicode, character in next, characters do -- we cannot loop over descriptions ! - - local description = descriptions[unicode] - - if description then - - local lookups = description.slookups - if lookups then - for lookupname, lookupdata in next, lookups do - action[lookuptypes[lookupname]](lookupdata,lookupname,unicode,lookuphash,duplicates) - end - end - - local lookups = description.mlookups - if lookups then - for lookupname, lookuplist in next, lookups do - local lookuptype = lookuptypes[lookupname] - for l=1,#lookuplist do - local lookupdata = lookuplist[l] - action[lookuptype](lookupdata,lookupname,unicode,lookuphash,duplicates) - end - end - end - - local list = description.kerns - if list then - for lookup, krn in next, list do -- ref to glyph, saves lookup - local target = lookuphash[lookup] - if target then - target[unicode] = krn - else - lookuphash[lookup] = { [unicode] = krn } - end - end - end - - local list = description.anchors - if list then - for typ, anchors in next, list do -- types - if typ == "mark" or typ == "cexit" then -- or entry? - for name, anchor in next, anchors do - local lookups = anchor_to_lookup[name] - if lookups then - for lookup in next, lookups do - local target = lookuphash[lookup] - if target then - target[unicode] = anchors - else - lookuphash[lookup] = { [unicode] = anchors } - end - end - end - end - end - end - end - - end - - end - -end - --- so far - -local function split(replacement,original) - local result = { } - for i=1,#replacement do - result[original[i]] = replacement[i] - end - return result -end - -local valid = { -- does contextpos work? - coverage = { chainsub = true, chainpos = true, contextsub = true, contextpos = true }, - reversecoverage = { reversesub = true }, - glyphs = { chainsub = true, chainpos = true, contextsub = true, contextpos = true }, -} - -local function prepare_contextchains(tfmdata) - local rawdata = tfmdata.shared.rawdata - local resources = rawdata.resources - local lookuphash = resources.lookuphash - local lookuptags = resources.lookuptags - local lookups = rawdata.lookups - if lookups then - for lookupname, lookupdata in next, rawdata.lookups do - local lookuptype = lookupdata.type - if lookuptype then - local rules = lookupdata.rules - if rules then - local format = lookupdata.format - local validformat = valid[format] - if not validformat then - report_prepare("unsupported format %a",format) - elseif not validformat[lookuptype] then - -- todo: dejavu-serif has one (but i need to see what use it has) - report_prepare("unsupported format %a, lookuptype %a, lookupname %a",format,lookuptype,lookuptags[lookupname]) - else - local contexts = lookuphash[lookupname] - if not contexts then - contexts = { } - lookuphash[lookupname] = contexts - end - local t, nt = { }, 0 - for nofrules=1,#rules do - local rule = rules[nofrules] - local current = rule.current - local before = rule.before - local after = rule.after - local replacements = rule.replacements - local sequence = { } - local nofsequences = 0 - -- Eventually we can store start, stop and sequence in the cached file - -- but then less sharing takes place so best not do that without a lot - -- of profiling so let's forget about it. - if before then - for n=1,#before do - nofsequences = nofsequences + 1 - sequence[nofsequences] = before[n] - end - end - local start = nofsequences + 1 - for n=1,#current do - nofsequences = nofsequences + 1 - sequence[nofsequences] = current[n] - end - local stop = nofsequences - if after then - for n=1,#after do - nofsequences = nofsequences + 1 - sequence[nofsequences] = after[n] - end - end - if sequence[1] then - -- Replacements only happen with reverse lookups as they are single only. We - -- could pack them into current (replacement value instead of true) and then - -- use sequence[start] instead but it's somewhat ugly. - nt = nt + 1 - t[nt] = { nofrules, lookuptype, sequence, start, stop, rule.lookups, replacements } - for unic in next, sequence[start] do - local cu = contexts[unic] - if not cu then - contexts[unic] = t - end - end - end - end - end - else - -- no rules - end - else - report_prepare("missing lookuptype for lookupname %a",lookuptags[lookupname]) - end - end - end -end - --- we can consider lookuphash == false (initialized but empty) vs lookuphash == table - -local function featuresinitializer(tfmdata,value) - if true then -- value then - -- beware we need to use the topmost properties table - local rawdata = tfmdata.shared.rawdata - local properties = rawdata.properties - if not properties.initialized then - local starttime = trace_preparing and os.clock() - local resources = rawdata.resources - resources.lookuphash = resources.lookuphash or { } - prepare_contextchains(tfmdata) - prepare_lookups(tfmdata) - properties.initialized = true - if trace_preparing then - report_prepare("preparation time is %0.3f seconds for %a",os.clock()-starttime,tfmdata.properties.fullname) - end - end - end -end - -registerotffeature { - name = "features", - description = "features", - default = true, - initializers = { - position = 1, - node = featuresinitializer, - }, - processors = { - node = featuresprocessor, - } -} - --- This can be used for extra handlers, but should be used with care! - -otf.handlers = handlers diff --git a/tex/context/base/mkiv/font-oto.lua b/tex/context/base/mkiv/font-oto.lua index 13568799b..4b986bd3b 100644 --- a/tex/context/base/mkiv/font-oto.lua +++ b/tex/context/base/mkiv/font-oto.lua @@ -6,10 +6,6 @@ if not modules then modules = { } end modules ['font-oto'] = { -- original tex license = "see context related readme files" } --- This is a version of font-otb adapted to the new fontloader code. We used to have two --- base initialization methods but now we have only one. This means that instead of the --- old default (independent) we now use the one more similar to node node (shared). - local concat, unpack = table.concat, table.unpack local insert, remove = table.insert, table.remove local format, gmatch, gsub, find, match, lower, strip = string.format, string.gmatch, string.gsub, string.find, string.match, string.lower, string.strip @@ -34,6 +30,8 @@ local registerotffeature = otffeatures.register otf.defaultbasealternate = "none" -- first last +local getprivate = fonts.constructors.getprivate + local wildcard = "*" local default = "dflt" @@ -71,21 +69,32 @@ local function cref(feature,sequence) return formatters["feature %a, type %a, chain lookup %a"](feature,sequence.type,sequence.name) end - -local function report_alternate(feature,sequence,descriptions,unicode,replacement,value,comment) - report_prepare("%s: base alternate %s => %s (%S => %S)", - cref(feature,sequence), - gref(descriptions,unicode), - replacement and gref(descriptions,replacement), - value, - comment) +local function report_substitution(feature,sequence,descriptions,unicode,substitution) + if unicode == substitution then + report_prepare("%s: base substitution %s maps onto itself", + cref(feature,sequence), + gref(descriptions,unicode)) + else + report_prepare("%s: base substitution %s => %S", + cref(feature,sequence), + gref(descriptions,unicode), + gref(descriptions,substitution)) + end end -local function report_substitution(feature,sequence,descriptions,unicode,substitution) - report_prepare("%s: base substitution %s => %S", - cref(feature,sequence), - gref(descriptions,unicode), - gref(descriptions,substitution)) +local function report_alternate(feature,sequence,descriptions,unicode,replacement,value,comment) + if unicode == replacement then + report_prepare("%s: base alternate %s maps onto itself", + cref(feature,sequence), + gref(descriptions,unicode)) + else + report_prepare("%s: base alternate %s => %s (%S => %S)", + cref(feature,sequence), + gref(descriptions,unicode), + replacement and gref(descriptions,replacement), + value, + comment) + end end local function report_ligature(feature,sequence,descriptions,unicode,ligature) @@ -158,13 +167,11 @@ end -- messy if we need to take that into account. local function makefake(tfmdata,name,present) - local resources = tfmdata.resources - local private = resources.private + local private = getprivate(tfmdata) local character = { intermediate = true, ligatures = { } } resources.unicodes[name] = private tfmdata.characters[private] = character tfmdata.descriptions[private] = { name = name } - resources.private = private + 1 present[name] = private return character end @@ -225,6 +232,9 @@ local function preparesubstitutions(tfmdata,feature,value,validlookups,lookuplis local trace_alternatives = trace_baseinit and trace_alternatives local trace_ligatures = trace_baseinit and trace_ligatures + -- A chain of changes is handled in font-con which is clesner because + -- we can have shared changes and such. + if not changed then changed = { } tfmdata.changed = changed @@ -237,39 +247,44 @@ local function preparesubstitutions(tfmdata,feature,value,validlookups,lookuplis if kind == "gsub_single" then for i=1,#steps do for unicode, data in next, steps[i].coverage do - -- if not changed[unicode] then -- fails for multiple subs in some math fonts - if trace_singles then - report_substitution(feature,sequence,descriptions,unicode,data) - end + if unicode ~= data then changed[unicode] = data - -- end + end + if trace_singles then + report_substitution(feature,sequence,descriptions,unicode,data) + end end end elseif kind == "gsub_alternate" then for i=1,#steps do for unicode, data in next, steps[i].coverage do - if not changed[unicode] then - local replacement = data[alternate] - if replacement then + local replacement = data[alternate] + if replacement then + if unicode ~= replacement then changed[unicode] = replacement - if trace_alternatives then - report_alternate(feature,sequence,descriptions,unicode,replacement,value,"normal") - end - elseif defaultalt == "first" then - replacement = data[1] + end + if trace_alternatives then + report_alternate(feature,sequence,descriptions,unicode,replacement,value,"normal") + end + elseif defaultalt == "first" then + replacement = data[1] + if unicode ~= replacement then + changed[unicode] = replacement + end + if trace_alternatives then + report_alternate(feature,sequence,descriptions,unicode,replacement,value,defaultalt) + end + elseif defaultalt == "last" then + replacement = data[#data] + if unicode ~= replacement then changed[unicode] = replacement - if trace_alternatives then - report_alternate(feature,sequence,descriptions,unicode,replacement,value,defaultalt) - end - elseif defaultalt == "last" then - replacement = data[#data] - if trace_alternatives then - report_alternate(feature,sequence,descriptions,unicode,replacement,value,defaultalt) - end - else - if trace_alternatives then - report_alternate(feature,sequence,descriptions,unicode,replacement,value,"unknown") - end + end + if trace_alternatives then + report_alternate(feature,sequence,descriptions,unicode,replacement,value,defaultalt) + end + else + if trace_alternatives then + report_alternate(feature,sequence,descriptions,unicode,replacement,value,"unknown") end end end @@ -289,7 +304,6 @@ local function preparesubstitutions(tfmdata,feature,value,validlookups,lookuplis local nofligatures = #ligatures if nofligatures > 0 then - local characters = tfmdata.characters local present = { } local done = trace_baseinit and trace_ligatures and { } @@ -324,8 +338,9 @@ local function preparepositionings(tfmdata,feature,value,validlookups,lookuplist local format = sequence.format if kind == "gpos_pair" then for i=1,#steps do - local step = steps[i] - if step.format == "kern" then + local step = steps[i] + local format = step.format + if format == "kern" or format == "move" then for unicode, data in next, steps[i].coverage do local character = characters[unicode] local kerns = character.kerns @@ -353,9 +368,13 @@ local function preparepositionings(tfmdata,feature,value,validlookups,lookuplist local character = characters[unicode] local kerns = character.kerns for otherunicode, kern in next, data do - if not kern[2] and not (kerns and kerns[otherunicode]) then + -- kern[2] is true (all zero) or a table + local other = kern[2] + if other == true or (not other and not (kerns and kerns[otherunicode])) then local kern = kern[1] - if kern[1] ~= 0 or kern[2] ~= 0 or kern[4] ~= 0 then + if kern == true then + -- all zero + elseif kern[1] ~= 0 or kern[2] ~= 0 or kern[4] ~= 0 then -- a complex pair not suitable for basemode else kern = kern[3] @@ -385,6 +404,53 @@ local function initializehashes(tfmdata) -- already done end +local function checkmathreplacements(tfmdata,fullname,fixitalics) + if tfmdata.mathparameters then + local characters = tfmdata.characters + local changed = tfmdata.changed + if next(changed) then + if trace_preparing or trace_baseinit then + report_prepare("checking math replacements for %a",fullname) + end + for unicode, replacement in next, changed do + local u = characters[unicode] + local r = characters[replacement] + local n = u.next + local v = u.vert_variants + local h = u.horiz_variants + if fixitalics then + -- quite some warnings on stix ... + local ui = u.italic + if ui and not r.italic then + if trace_preparing then + report_prepare("using %i units of italic correction from %C for %U",ui,unicode,replacement) + end + r.italic = ui -- print(ui,ri) + end + end + if n and not r.next then + if trace_preparing then + report_prepare("forcing %s for %C substituted by %U","incremental step",unicode,replacement) + end + r.next = n + end + if v and not r.vert_variants then + if trace_preparing then + report_prepare("forcing %s for %C substituted by %U","vertical variants",unicode,replacement) + end + r.vert_variants = v + end + if h and not r.horiz_variants then + if trace_preparing then + report_prepare("forcing %s for %C substituted by %U","horizontal variants",unicode,replacement) + end + r.horiz_variants = h + end + end + end + end +end + local function featuresinitializer(tfmdata,value) if true then -- value then local starttime = trace_preparing and os.clock() @@ -401,6 +467,8 @@ local function featuresinitializer(tfmdata,value) local rawfeatures = rawresources and rawresources.features local basesubstitutions = rawfeatures and rawfeatures.gsub local basepositionings = rawfeatures and rawfeatures.gpos + local substitutionsdone = false + local positioningsdone = false -- if basesubstitutions or basepositionings then local sequences = tfmdata.resources.sequences @@ -423,12 +491,14 @@ local function featuresinitializer(tfmdata,value) end preparesubstitutions(tfmdata,feature,value,validlookups,lookuplist) registerbasefeature(feature,value) + substitutionsdone = true elseif basepositionings and basepositionings[feature] then if trace_preparing then report_prepare("filtering base %a feature %a for %a with value %a","pos",feature,fullname,value) end preparepositionings(tfmdata,feature,value,validlookups,lookuplist) registerbasefeature(feature,value) + positioningsdone = true end end end @@ -437,6 +507,10 @@ local function featuresinitializer(tfmdata,value) end end -- + if substitutionsdone then + checkmathreplacements(tfmdata,fullname,features.fixitalics) + end + -- registerbasehash(tfmdata) end if trace_preparing then diff --git a/tex/context/base/mkiv/font-otp.lua b/tex/context/base/mkiv/font-otp.lua deleted file mode 100644 index c52e574b9..000000000 --- a/tex/context/base/mkiv/font-otp.lua +++ /dev/null @@ -1,894 +0,0 @@ -if not modules then modules = { } end modules ['font-otp'] = { - version = 1.001, - comment = "companion to font-otf.lua (packing)", - author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", - copyright = "PRAGMA ADE / ConTeXt Development Team", - license = "see context related readme files" -} - --- todo: pack math (but not that much to share) --- --- pitfall 5.2: hashed tables can suddenly become indexed with nil slots --- --- unless we sort all hashes we can get a different pack order (no big deal but size can differ) - -local next, type, tostring = next, type, tostring -local sort, concat = table.sort, table.concat - -local trace_packing = false trackers.register("otf.packing", function(v) trace_packing = v end) -local trace_loading = false trackers.register("otf.loading", function(v) trace_loading = v end) - -local report_otf = logs.reporter("fonts","otf loading") - --- also used in other scripts so we need to check some tables: - -fonts = fonts or { } - -local handlers = fonts.handlers or { } -fonts.handlers = handlers - -local otf = handlers.otf or { } -handlers.otf = otf - -local glists = otf.glists or { "gsub", "gpos" } -otf.glists = glists - -local criterium = 1 -local threshold = 0 - -local function tabstr_normal(t) - local s = { } - local n = 0 - for k, v in next, t do - n = n + 1 - if type(v) == "table" then - s[n] = k .. ">" .. tabstr_normal(v) - elseif v == true then - s[n] = k .. "+" -- "=true" - elseif v then - s[n] = k .. "=" .. v - else - s[n] = k .. "-" -- "=false" - end - end - if n == 0 then - return "" - elseif n == 1 then - return s[1] - else - sort(s) -- costly but needed (occasional wrong hit otherwise) - return concat(s,",") - end -end - -local function tabstr_flat(t) - local s = { } - local n = 0 - for k, v in next, t do - n = n + 1 - s[n] = k .. "=" .. v - end - if n == 0 then - return "" - elseif n == 1 then - return s[1] - else - sort(s) -- costly but needed (occasional wrong hit otherwise) - return concat(s,",") - end -end - -local function tabstr_mixed(t) -- indexed - local s = { } - local n = #t - if n == 0 then - return "" - elseif n == 1 then - local k = t[1] - if k == true then - return "++" -- we need to distinguish from "true" - elseif k == false then - return "--" -- we need to distinguish from "false" - else - return tostring(k) -- number or string - end - else - for i=1,n do - local k = t[i] - if k == true then - s[i] = "++" -- we need to distinguish from "true" - elseif k == false then - s[i] = "--" -- we need to distinguish from "false" - else - s[i] = k -- number or string - end - end - return concat(s,",") - end -end - -local function tabstr_boolean(t) - local s = { } - local n = 0 - for k, v in next, t do - n = n + 1 - if v then - s[n] = k .. "+" - else - s[n] = k .. "-" - end - end - if n == 0 then - return "" - elseif n == 1 then - return s[1] - else - sort(s) -- costly but needed (occasional wrong hit otherwise) - return concat(s,",") - end -end - --- tabstr_boolean_x = tabstr_boolean - --- tabstr_boolean = function(t) --- local a = tabstr_normal(t) --- local b = tabstr_boolean_x(t) --- print(a) --- print(b) --- return b --- end - --- beware: we cannot unpack and repack the same table because then sharing --- interferes (we could catch this if needed) .. so for now: save, reload --- and repack in such cases (never needed anyway) .. a tricky aspect is that --- we then need to sort more thanks to random hashing - -function otf.packdata(data) - - if data then - -- stripdata(data) - local h, t, c = { }, { }, { } - local hh, tt, cc = { }, { }, { } - local nt, ntt = 0, 0 - local function pack_normal(v) - local tag = tabstr_normal(v) - local ht = h[tag] - if ht then - c[ht] = c[ht] + 1 - return ht - else - nt = nt + 1 - t[nt] = v - h[tag] = nt - c[nt] = 1 - return nt - end - end - local function pack_flat(v) - local tag = tabstr_flat(v) - local ht = h[tag] - if ht then - c[ht] = c[ht] + 1 - return ht - else - nt = nt + 1 - t[nt] = v - h[tag] = nt - c[nt] = 1 - return nt - end - end - local function pack_boolean(v) - local tag = tabstr_boolean(v) - local ht = h[tag] - if ht then - c[ht] = c[ht] + 1 - return ht - else - nt = nt + 1 - t[nt] = v - h[tag] = nt - c[nt] = 1 - return nt - end - end - local function pack_indexed(v) - local tag = concat(v," ") - local ht = h[tag] - if ht then - c[ht] = c[ht] + 1 - return ht - else - nt = nt + 1 - t[nt] = v - h[tag] = nt - c[nt] = 1 - return nt - end - end - local function pack_mixed(v) - local tag = tabstr_mixed(v) - local ht = h[tag] - if ht then - c[ht] = c[ht] + 1 - return ht - else - nt = nt + 1 - t[nt] = v - h[tag] = nt - c[nt] = 1 - return nt - end - end - local function pack_final(v) - -- v == number - if c[v] <= criterium then - return t[v] - else - -- compact hash - local hv = hh[v] - if hv then - return hv - else - ntt = ntt + 1 - tt[ntt] = t[v] - hh[v] = ntt - cc[ntt] = c[v] - return ntt - end - end - end - local function success(stage,pass) - if nt == 0 then - if trace_loading or trace_packing then - report_otf("pack quality: nothing to pack") - end - return false - elseif nt >= threshold then - local one, two, rest = 0, 0, 0 - if pass == 1 then - for k,v in next, c do - if v == 1 then - one = one + 1 - elseif v == 2 then - two = two + 1 - else - rest = rest + 1 - end - end - else - for k,v in next, cc do - if v > 20 then - rest = rest + 1 - elseif v > 10 then - two = two + 1 - else - one = one + 1 - end - end - data.tables = tt - end - if trace_loading or trace_packing then - report_otf("pack quality: stage %s, pass %s, %s packed, 1-10:%s, 11-20:%s, rest:%s (criterium: %s)", stage, pass, one+two+rest, one, two, rest, criterium) - end - return true - else - if trace_loading or trace_packing then - report_otf("pack quality: stage %s, pass %s, %s packed, aborting pack (threshold: %s)", stage, pass, nt, threshold) - end - return false - end - end - local function packers(pass) - if pass == 1 then - return pack_normal, pack_indexed, pack_flat, pack_boolean, pack_mixed - else - return pack_final, pack_final, pack_final, pack_final, pack_final - end - end - local resources = data.resources - local lookuptypes = resources.lookuptypes - for pass=1,2 do - if trace_packing then - report_otf("start packing: stage 1, pass %s",pass) - end - local pack_normal, pack_indexed, pack_flat, pack_boolean, pack_mixed = packers(pass) - for unicode, description in next, data.descriptions do - local boundingbox = description.boundingbox - if boundingbox then - description.boundingbox = pack_indexed(boundingbox) - end - local slookups = description.slookups - if slookups then - for tag, slookup in next, slookups do - local what = lookuptypes[tag] - if what == "pair" then - local t = slookup[2] if t then slookup[2] = pack_indexed(t) end - local t = slookup[3] if t then slookup[3] = pack_indexed(t) end - elseif what ~= "substitution" then - slookups[tag] = pack_indexed(slookup) -- true is new - end - end - end - local mlookups = description.mlookups - if mlookups then - for tag, mlookup in next, mlookups do - local what = lookuptypes[tag] - if what == "pair" then - for i=1,#mlookup do - local lookup = mlookup[i] - local t = lookup[2] if t then lookup[2] = pack_indexed(t) end - local t = lookup[3] if t then lookup[3] = pack_indexed(t) end - end - elseif what ~= "substitution" then - for i=1,#mlookup do - mlookup[i] = pack_indexed(mlookup[i]) -- true is new - end - end - end - end - local kerns = description.kerns - if kerns then - for tag, kern in next, kerns do - kerns[tag] = pack_flat(kern) - end - end - local math = description.math - if math then - local kerns = math.kerns - if kerns then - for tag, kern in next, kerns do - kerns[tag] = pack_normal(kern) - end - end - end - local anchors = description.anchors - if anchors then - for what, anchor in next, anchors do - if what == "baselig" then - for _, a in next, anchor do - for k=1,#a do - a[k] = pack_indexed(a[k]) - end - end - else - for k, v in next, anchor do - anchor[k] = pack_indexed(v) - end - end - end - end - local altuni = description.altuni - if altuni then - for i=1,#altuni do - altuni[i] = pack_flat(altuni[i]) - end - end - end - local lookups = data.lookups - if lookups then - for _, lookup in next, lookups do - local rules = lookup.rules - if rules then - for i=1,#rules do - local rule = rules[i] - local r = rule.before if r then for i=1,#r do r[i] = pack_boolean(r[i]) end end - local r = rule.after if r then for i=1,#r do r[i] = pack_boolean(r[i]) end end - local r = rule.current if r then for i=1,#r do r[i] = pack_boolean(r[i]) end end - local r = rule.replacements if r then rule.replacements = pack_flat (r) end -- can have holes - local r = rule.lookups if r then rule.lookups = pack_indexed(r) end -- can have "" - -- local r = rule.lookups if r then rule.lookups = pack_flat(r) end -- can have holes (already taken care of some cases) - end - end - end - end - local anchor_to_lookup = resources.anchor_to_lookup - if anchor_to_lookup then - for anchor, lookup in next, anchor_to_lookup do - anchor_to_lookup[anchor] = pack_normal(lookup) - end - end - local lookup_to_anchor = resources.lookup_to_anchor - if lookup_to_anchor then - for lookup, anchor in next, lookup_to_anchor do - lookup_to_anchor[lookup] = pack_normal(anchor) - end - end - local sequences = resources.sequences - if sequences then - for feature, sequence in next, sequences do - local flags = sequence.flags - if flags then - sequence.flags = pack_normal(flags) - end - local subtables = sequence.subtables - if subtables then - sequence.subtables = pack_normal(subtables) - end - local features = sequence.features - if features then - for script, feature in next, features do - features[script] = pack_normal(feature) - end - end - local order = sequence.order - if order then - sequence.order = pack_indexed(order) - end - local markclass = sequence.markclass - if markclass then - sequence.markclass = pack_boolean(markclass) - end - end - end - local lookups = resources.lookups - if lookups then - for name, lookup in next, lookups do - local flags = lookup.flags - if flags then - lookup.flags = pack_normal(flags) - end - local subtables = lookup.subtables - if subtables then - lookup.subtables = pack_normal(subtables) - end - end - end - local features = resources.features - if features then - for _, what in next, glists do - local list = features[what] - if list then - for feature, spec in next, list do - list[feature] = pack_normal(spec) - end - end - end - end - if not success(1,pass) then - return - end - end - if nt > 0 then - for pass=1,2 do - if trace_packing then - report_otf("start packing: stage 2, pass %s",pass) - end - local pack_normal, pack_indexed, pack_flat, pack_boolean, pack_mixed = packers(pass) - for unicode, description in next, data.descriptions do - local kerns = description.kerns - if kerns then - description.kerns = pack_normal(kerns) - end - local math = description.math - if math then - local kerns = math.kerns - if kerns then - math.kerns = pack_normal(kerns) - end - end - local anchors = description.anchors - if anchors then - description.anchors = pack_normal(anchors) - end - local mlookups = description.mlookups - if mlookups then - for tag, mlookup in next, mlookups do - mlookups[tag] = pack_normal(mlookup) - end - end - local altuni = description.altuni - if altuni then - description.altuni = pack_normal(altuni) - end - end - local lookups = data.lookups - if lookups then - for _, lookup in next, lookups do - local rules = lookup.rules - if rules then - for i=1,#rules do -- was next loop - local rule = rules[i] - local r = rule.before if r then rule.before = pack_normal(r) end - local r = rule.after if r then rule.after = pack_normal(r) end - local r = rule.current if r then rule.current = pack_normal(r) end - end - end - end - end - local sequences = resources.sequences - if sequences then - for feature, sequence in next, sequences do - sequence.features = pack_normal(sequence.features) - end - end - if not success(2,pass) then - -- return - end - end - - for pass=1,2 do - local pack_normal, pack_indexed, pack_flat, pack_boolean, pack_mixed = packers(pass) - for unicode, description in next, data.descriptions do - local slookups = description.slookups - if slookups then - description.slookups = pack_normal(slookups) - end - local mlookups = description.mlookups - if mlookups then - description.mlookups = pack_normal(mlookups) - end - end - end - - end - end -end - -local unpacked_mt = { - __index = - function(t,k) - t[k] = false - return k -- next time true - end -} - -function otf.unpackdata(data) - - if data then - local tables = data.tables - if tables then - local resources = data.resources - local lookuptypes = resources.lookuptypes - local unpacked = { } - setmetatable(unpacked,unpacked_mt) - for unicode, description in next, data.descriptions do - local tv = tables[description.boundingbox] - if tv then - description.boundingbox = tv - end - local slookups = description.slookups - if slookups then - local tv = tables[slookups] - if tv then - description.slookups = tv - slookups = unpacked[tv] - end - if slookups then - for tag, lookup in next, slookups do - local what = lookuptypes[tag] - if what == "pair" then - local tv = tables[lookup[2]] - if tv then - lookup[2] = tv - end - local tv = tables[lookup[3]] - if tv then - lookup[3] = tv - end - elseif what ~= "substitution" then - local tv = tables[lookup] - if tv then - slookups[tag] = tv - end - end - end - end - end - local mlookups = description.mlookups - if mlookups then - local tv = tables[mlookups] - if tv then - description.mlookups = tv - mlookups = unpacked[tv] - end - if mlookups then - for tag, list in next, mlookups do - local tv = tables[list] - if tv then - mlookups[tag] = tv - list = unpacked[tv] - end - if list then - local what = lookuptypes[tag] - if what == "pair" then - for i=1,#list do - local lookup = list[i] - local tv = tables[lookup[2]] - if tv then - lookup[2] = tv - end - local tv = tables[lookup[3]] - if tv then - lookup[3] = tv - end - end - elseif what ~= "substitution" then - for i=1,#list do - local tv = tables[list[i]] - if tv then - list[i] = tv - end - end - end - end - end - end - end - local kerns = description.kerns - if kerns then - local tm = tables[kerns] - if tm then - description.kerns = tm - kerns = unpacked[tm] - end - if kerns then - for k, kern in next, kerns do - local tv = tables[kern] - if tv then - kerns[k] = tv - end - end - end - end - local math = description.math - if math then - local kerns = math.kerns - if kerns then - local tm = tables[kerns] - if tm then - math.kerns = tm - kerns = unpacked[tm] - end - if kerns then - for k, kern in next, kerns do - local tv = tables[kern] - if tv then - kerns[k] = tv - end - end - end - end - end - local anchors = description.anchors - if anchors then - local ta = tables[anchors] - if ta then - description.anchors = ta - anchors = unpacked[ta] - end - if anchors then - for tag, anchor in next, anchors do - if tag == "baselig" then - for _, list in next, anchor do - for i=1,#list do - local tv = tables[list[i]] - if tv then - list[i] = tv - end - end - end - else - for a, data in next, anchor do - local tv = tables[data] - if tv then - anchor[a] = tv - end - end - end - end - end - end - local altuni = description.altuni - if altuni then - local altuni = tables[altuni] - if altuni then - description.altuni = altuni - for i=1,#altuni do - local tv = tables[altuni[i]] - if tv then - altuni[i] = tv - end - end - end - end - end - local lookups = data.lookups - if lookups then - for _, lookup in next, lookups do - local rules = lookup.rules - if rules then - for i=1,#rules do -- was next loop - local rule = rules[i] - local before = rule.before - if before then - local tv = tables[before] - if tv then - rule.before = tv - before = unpacked[tv] - end - if before then - for i=1,#before do - local tv = tables[before[i]] - if tv then - before[i] = tv - end - end - end - end - local after = rule.after - if after then - local tv = tables[after] - if tv then - rule.after = tv - after = unpacked[tv] - end - if after then - for i=1,#after do - local tv = tables[after[i]] - if tv then - after[i] = tv - end - end - end - end - local current = rule.current - if current then - local tv = tables[current] - if tv then - rule.current = tv - current = unpacked[tv] - end - if current then - for i=1,#current do - local tv = tables[current[i]] - if tv then - current[i] = tv - end - end - end - end - local replacements = rule.replacements - if replacements then - local tv = tables[replacements] - if tv then - rule.replacements = tv - end - end - -- local fore = rule.fore - -- if fore then - -- local tv = tables[fore] - -- if tv then - -- rule.fore = tv - -- end - -- end - -- local back = rule.back - -- if back then - -- local tv = tables[back] - -- if tv then - -- rule.back = tv - -- end - -- end - -- local names = rule.names - -- if names then - -- local tv = tables[names] - -- if tv then - -- rule.names = tv - -- end - -- end - -- - local lookups = rule.lookups - if lookups then - local tv = tables[lookups] - if tv then - rule.lookups = tv - end - end - end - end - end - end - local anchor_to_lookup = resources.anchor_to_lookup - if anchor_to_lookup then - for anchor, lookup in next, anchor_to_lookup do - local tv = tables[lookup] - if tv then - anchor_to_lookup[anchor] = tv - end - end - end - local lookup_to_anchor = resources.lookup_to_anchor - if lookup_to_anchor then - for lookup, anchor in next, lookup_to_anchor do - local tv = tables[anchor] - if tv then - lookup_to_anchor[lookup] = tv - end - end - end - local ls = resources.sequences - if ls then - for _, feature in next, ls do - local flags = feature.flags - if flags then - local tv = tables[flags] - if tv then - feature.flags = tv - end - end - local subtables = feature.subtables - if subtables then - local tv = tables[subtables] - if tv then - feature.subtables = tv - end - end - local features = feature.features - if features then - local tv = tables[features] - if tv then - feature.features = tv - features = unpacked[tv] - end - if features then - for script, data in next, features do - local tv = tables[data] - if tv then - features[script] = tv - end - end - end - end - local order = feature.order - if order then - local tv = tables[order] - if tv then - feature.order = tv - end - end - local markclass = feature.markclass - if markclass then - local tv = tables[markclass] - if tv then - feature.markclass = tv - end - end - end - end - local lookups = resources.lookups - if lookups then - for _, lookup in next, lookups do - local flags = lookup.flags - if flags then - local tv = tables[flags] - if tv then - lookup.flags = tv - end - end - local subtables = lookup.subtables - if subtables then - local tv = tables[subtables] - if tv then - lookup.subtables = tv - end - end - end - end - local features = resources.features - if features then - for _, what in next, glists do - local feature = features[what] - if feature then - for tag, spec in next, feature do - local tv = tables[spec] - if tv then - feature[tag] = tv - end - end - end - end - end - data.tables = nil - end - end -end diff --git a/tex/context/base/mkiv/font-otr.lua b/tex/context/base/mkiv/font-otr.lua index 4f93c5579..5bac75052 100644 --- a/tex/context/base/mkiv/font-otr.lua +++ b/tex/context/base/mkiv/font-otr.lua @@ -65,11 +65,12 @@ if not modules then modules = { } end modules ['font-otr'] = { -- require("char-ini") -- end -local next, type = next, type +local next, type, tonumber = next, type, tonumber local byte, lower, char, gsub = string.byte, string.lower, string.char, string.gsub local floor, round = math.floor, math.round local P, R, S, C, Cs, Cc, Ct, Carg, Cmt = lpeg.P, lpeg.R, lpeg.S, lpeg.C, lpeg.Cs, lpeg.Cc, lpeg.Ct, lpeg.Carg, lpeg.Cmt local lpegmatch = lpeg.match +local rshift = bit32.rshift local setmetatableindex = table.setmetatableindex local formatters = string.formatters @@ -660,12 +661,10 @@ local widths = { setmetatableindex(weights, function(t,k) local r = floor((k + 50) / 100) * 100 local v = (r > 900 and "black") or rawget(t,r) or "normal" --- print("weight:",k,r,v) return v end) setmetatableindex(widths,function(t,k) --- print("width:",k) return "normal" end) @@ -1346,7 +1345,7 @@ formatreaders[4] = function(f,fontdata,offset) offsets[i] = readushort(f) end -- format length language nofsegments searchrange entryselector rangeshift 4-tables - local size = (length - 2 * 2 - 5 * 2 - 4 * nofsegments * 2) / 2 + local size = (length - 2 * 2 - 5 * 2 - 4 * 2 * nofsegments) / 2 for i=1,size-1 do indices[i] = readushort(f) end @@ -1514,7 +1513,7 @@ end formatreaders[13] = function(f,fontdata,offset) -- - -- this fector is only used for simple fallback fonts + -- this vector is only used for simple fallback fonts -- setposition(f,offset+2+2+4+4) -- skip format reserved length language local mapping = fontdata.mapping @@ -1811,7 +1810,7 @@ function readers.kern(f,fontdata,specification) local length = readushort(f) local coverage = readushort(f) -- bit 8-15 of coverage: format 0 or 2 - local format = bit32.rshift(coverage,8) -- is this ok? + local format = rshift(coverage,8) -- is this ok? if format == 0 then local nofpairs = readushort(f) local searchrange = readushort(f) @@ -2130,9 +2129,9 @@ local function readdata(f,offset,specification) if factors then specification.factors = factors fontdata.factors = factors - report("factors: % t",factors) - else - report("bad factors") + -- report("factors: % t",factors) + -- else + -- report("bad factors") end else -- report("unknown instance") diff --git a/tex/context/base/mkiv/font-ots.lua b/tex/context/base/mkiv/font-ots.lua index 04ecaa923..3e338f614 100644 --- a/tex/context/base/mkiv/font-ots.lua +++ b/tex/context/base/mkiv/font-ots.lua @@ -108,45 +108,59 @@ mechanisms. Both put some constraints on the code here.</p> -- Remark: We can provide a fast loop when there are no disc nodes (tests show a 1% -- gain). Smaller functions might perform better cache-wise. But ... memory becomes -- faster anyway, so ... +-- +-- Remark: Some optimizations made sense for 5.2 but seem less important for 5.3 but +-- anyway served their purpose. +-- +-- Todo: just (0=l2r and 1=r2l) or maybe (r2l = true) local type, next, tonumber = type, next, tonumber local random = math.random local formatters = string.formatters local insert = table.insert -local registertracker = trackers.register - -local logs = logs -local trackers = trackers -local nodes = nodes -local attributes = attributes -local fonts = fonts - -local otf = fonts.handlers.otf -local tracers = nodes.tracers - -local trace_singles = false registertracker("otf.singles", function(v) trace_singles = v end) -local trace_multiples = false registertracker("otf.multiples", function(v) trace_multiples = v end) -local trace_alternatives = false registertracker("otf.alternatives", function(v) trace_alternatives = v end) -local trace_ligatures = false registertracker("otf.ligatures", function(v) trace_ligatures = v end) -local trace_contexts = false registertracker("otf.contexts", function(v) trace_contexts = v end) -local trace_marks = false registertracker("otf.marks", function(v) trace_marks = v end) -local trace_kerns = false registertracker("otf.kerns", function(v) trace_kerns = v end) -local trace_cursive = false registertracker("otf.cursive", function(v) trace_cursive = v end) -local trace_preparing = false registertracker("otf.preparing", function(v) trace_preparing = v end) -local trace_bugs = false registertracker("otf.bugs", function(v) trace_bugs = v end) -local trace_details = false registertracker("otf.details", function(v) trace_details = v end) -local trace_steps = false registertracker("otf.steps", function(v) trace_steps = v end) -local trace_skips = false registertracker("otf.skips", function(v) trace_skips = v end) -local trace_directions = false registertracker("otf.directions", function(v) trace_directions = v end) -local trace_plugins = false registertracker("otf.plugins", function(v) trace_plugins = v end) - -local trace_kernruns = false registertracker("otf.kernruns", function(v) trace_kernruns = v end) -local trace_discruns = false registertracker("otf.discruns", function(v) trace_discruns = v end) -local trace_compruns = false registertracker("otf.compruns", function(v) trace_compruns = v end) -local trace_testruns = false registertracker("otf.testruns", function(v) trace_testruns = v end) - -local optimizekerns = true +local registertracker = trackers.register + +local logs = logs +local trackers = trackers +local nodes = nodes +local attributes = attributes +local fonts = fonts + +local otf = fonts.handlers.otf +local tracers = nodes.tracers + +local trace_singles = false registertracker("otf.singles", function(v) trace_singles = v end) +local trace_multiples = false registertracker("otf.multiples", function(v) trace_multiples = v end) +local trace_alternatives = false registertracker("otf.alternatives", function(v) trace_alternatives = v end) +local trace_ligatures = false registertracker("otf.ligatures", function(v) trace_ligatures = v end) +local trace_contexts = false registertracker("otf.contexts", function(v) trace_contexts = v end) +local trace_marks = false registertracker("otf.marks", function(v) trace_marks = v end) +local trace_kerns = false registertracker("otf.kerns", function(v) trace_kerns = v end) +local trace_cursive = false registertracker("otf.cursive", function(v) trace_cursive = v end) +local trace_preparing = false registertracker("otf.preparing", function(v) trace_preparing = v end) +local trace_bugs = false registertracker("otf.bugs", function(v) trace_bugs = v end) +local trace_details = false registertracker("otf.details", function(v) trace_details = v end) +local trace_steps = false registertracker("otf.steps", function(v) trace_steps = v end) +local trace_skips = false registertracker("otf.skips", function(v) trace_skips = v end) +local trace_plugins = false registertracker("otf.plugins", function(v) trace_plugins = v end) +local trace_chains = false registertracker("otf.chains", function(v) trace_chains = v end) + +local trace_kernruns = false registertracker("otf.kernruns", function(v) trace_kernruns = v end) +----- trace_discruns = false registertracker("otf.discruns", function(v) trace_discruns = v end) +local trace_compruns = false registertracker("otf.compruns", function(v) trace_compruns = v end) +local trace_testruns = false registertracker("otf.testruns", function(v) trace_testruns = v end) + +local forcediscretionaries = false +local forcepairadvance = false -- for testing + +directives.register("otf.forcediscretionaries",function(v) + forcediscretionaries = v +end) + +directives.register("otf.forcepairadvance",function(v) + forcepairadvance = v +end) local report_direct = logs.reporter("fonts","otf direct") local report_subchain = logs.reporter("fonts","otf subchain") @@ -155,18 +169,17 @@ local report_process = logs.reporter("fonts","otf process") local report_warning = logs.reporter("fonts","otf warning") local report_run = logs.reporter("fonts","otf run") -registertracker("otf.replacements", "otf.singles,otf.multiples,otf.alternatives,otf.ligatures") -registertracker("otf.positions","otf.marks,otf.kerns,otf.cursive") -registertracker("otf.actions","otf.replacements,otf.positions") -registertracker("otf.injections","nodes.injections") -registertracker("otf.sample","otf.steps,otf.actions,otf.analyzing") +registertracker("otf.substitutions", "otf.singles","otf.multiples","otf.alternatives","otf.ligatures") +registertracker("otf.positions", "otf.marks","otf.kerns","otf.cursive") +registertracker("otf.actions", "otf.substitutions","otf.positions") +registertracker("otf.sample", "otf.steps","otf.substitutions","otf.positions","otf.analyzing") +registertracker("otf.sample.silent", "otf.steps=silent","otf.substitutions","otf.positions","otf.analyzing") local nuts = nodes.nuts local tonode = nuts.tonode local tonut = nuts.tonut local getfield = nuts.getfield -local setfield = nuts.setfield local getnext = nuts.getnext local setnext = nuts.setnext local getprev = nuts.getprev @@ -192,22 +205,25 @@ local getdir = nuts.getdir local getwidth = nuts.getwidth local ischar = nuts.is_char +local usesfont = nuts.uses_font local insert_node_after = nuts.insert_after local copy_node = nuts.copy local copy_node_list = nuts.copy_list +local remove_node = nuts.remove local find_node_tail = nuts.tail local flush_node_list = nuts.flush_list local flush_node = nuts.flush_node local end_of_math = nuts.end_of_math local traverse_nodes = nuts.traverse -local traverse_id = nuts.traverse_id +----- traverse_id = nuts.traverse_id local set_components = nuts.set_components local take_components = nuts.take_components local count_components = nuts.count_components local copy_no_components = nuts.copy_no_components local copy_only_glyphs = nuts.copy_only_glyphs +local setmetatable = setmetatable local setmetatableindex = table.setmetatableindex ----- zwnj = 0x200C @@ -234,7 +250,8 @@ local injections = nodes.injections local setmark = injections.setmark local setcursive = injections.setcursive local setkern = injections.setkern -local setpair = injections.setpair +local setmove = injections.setmove +local setposition = injections.setposition local resetinjection = injections.reset local copyinjection = injections.copy local setligaindex = injections.setligaindex @@ -265,14 +282,15 @@ local factor = 0 local threshold = 0 local checkmarks = false +local discs = false +local spaces = false + local sweepnode = nil -local sweepprev = nil -local sweepnext = nil -local sweephead = { } +local sweephead = { } -- we don't nil entries but false them (no collection and such) -local notmatchpre = { } -local notmatchpost = { } -local notmatchreplace = { } +local notmatchpre = { } -- to be checked: can we use false instead of nil / what if a == b tests +local notmatchpost = { } -- to be checked: can we use false instead of nil / what if a == b tests +local notmatchreplace = { } -- to be checked: can we use false instead of nil / what if a == b tests local handlers = { } @@ -283,16 +301,19 @@ local checkstep = (tracers and tracers.steppers.check) or function() local registerstep = (tracers and tracers.steppers.register) or function() end local registermessage = (tracers and tracers.steppers.message) or function() end -local function checkdisccontent(d) - local pre, post, replace = getdisc(d) - if pre then for n in traverse_id(glue_code,pre) do print("pre",nodes.idstostring(pre)) break end end - if post then for n in traverse_id(glue_code,post) do print("pos",nodes.idstostring(post)) break end end - if replace then for n in traverse_id(glue_code,replace) do print("rep",nodes.idstostring(replace)) break end end -end +-- local function checkdisccontent(d) +-- local pre, post, replace = getdisc(d) +-- if pre then for n in traverse_id(glue_code,pre) do report("pre: %s",nodes.idstostring(pre)) break end end +-- if post then for n in traverse_id(glue_code,post) do report("pos: %s",nodes.idstostring(post)) break end end +-- if replace then for n in traverse_id(glue_code,replace) do report("rep: %s",nodes.idstostring(replace)) break end end +-- end local function logprocess(...) if trace_steps then registermessage(...) + if trace_steps == "silent" then + return + end end report_direct(...) end @@ -301,56 +322,67 @@ local function logwarning(...) report_direct(...) end -local f_unicode = formatters["%U"] -local f_uniname = formatters["%U (%s)"] -local f_unilist = formatters["% t (% t)"] +local gref do -local function gref(n) -- currently the same as in font-otb - if type(n) == "number" then - local description = descriptions[n] - local name = description and description.name - if name then - return f_uniname(n,name) - else - return f_unicode(n) - end - elseif n then - local num, nam = { }, { } - for i=1,#n do - local ni = n[i] - if tonumber(ni) then -- later we will start at 2 - local di = descriptions[ni] - num[i] = f_unicode(ni) - nam[i] = di and di.name or "-" + local f_unicode = formatters["U+%X"] -- was ["%U"] + local f_uniname = formatters["U+%X (%s)"] -- was ["%U (%s)"] + local f_unilist = formatters["% t"] + + gref = function(n) -- currently the same as in font-otb + if type(n) == "number" then + local description = descriptions[n] + local name = description and description.name + if name then + return f_uniname(n,name) + else + return f_unicode(n) + end + elseif n then + local t = { } + for i=1,#n do + local ni = n[i] + if tonumber(ni) then -- later we will start at 2 + local di = descriptions[ni] + local nn = di and di.name + if nn then + t[#t+1] = f_uniname(ni,nn) + else + t[#t+1] = f_unicode(ni) + end + end end + return f_unilist(t) + else + return "<error in node mode tracing>" end - return f_unilist(num,nam) - else - return "<error in node mode tracing>" end + end local function cref(dataset,sequence,index) if not dataset then return "no valid dataset" - elseif index then - return formatters["feature %a, type %a, chain lookup %a, index %a"](dataset[4],sequence.type,sequence.name,index) + end + local merged = sequence.merged and "merged " or "" + if index then + return formatters["feature %a, type %a, %schain lookup %a, index %a"]( + dataset[4],sequence.type,merged,sequence.name,index) else - return formatters["feature %a, type %a, chain lookup %a"](dataset[4],sequence.type,sequence.name) + return formatters["feature %a, type %a, %schain lookup %a"]( + dataset[4],sequence.type,merged,sequence.name) end end local function pref(dataset,sequence) - return formatters["feature %a, type %a, lookup %a"](dataset[4],sequence.type,sequence.name) + return formatters["feature %a, type %a, %slookup %a"]( + dataset[4],sequence.type,sequence.merged and "merged " or "",sequence.name) end local function mref(rlmode) - if not rlmode or rlmode == 0 then - return "---" - elseif rlmode == -1 or rlmode == "+TRT" then - return "r2l" - else + if not rlmode or rlmode >= 0 then return "l2r" + else + return "r2l" end end @@ -391,7 +423,7 @@ local function flattendisk(head,disc) elseif next then return next, next else - return -- maybe warning + -- return -- maybe warning end else if replace then @@ -469,124 +501,15 @@ local function markstoligature(head,start,stop,char) end end --- local function toligature(head,start,stop,char,dataset,sequence,markflag,discfound) -- brr head --- if getattr(start,a_noligature) == 1 then --- -- so we can do: e\noligature{ff}e e\noligature{f}fie (we only look at the first) --- return head, start --- end --- if start == stop and getchar(start) == char then --- resetinjection(start) --- setchar(start,char) --- return head, start --- end --- local prev = getprev(start) --- local next = getnext(stop) --- local comp = start --- setprev(start) --- setnext(stop) --- local base = copy_no_components(start,copyinjection) --- if start == head then --- head = base --- end --- resetinjection(base) --- setchar(base,char) --- setsubtype(base,ligature_code) --- set_components(base,comp) --- setlink(prev,base,next) --- if not discfound then --- local deletemarks = markflag ~= "mark" --- local components = start --- local baseindex = 0 --- local componentindex = 0 --- local head = base --- local current = base --- -- first we loop over the glyphs in start .. stop --- while start do --- local char = getchar(start) --- if not marks[char] then --- baseindex = baseindex + componentindex --- componentindex = getcomponentindex(start,marks) --- elseif not deletemarks then -- quite fishy --- setligaindex(start,baseindex + getligaindex(start,componentindex)) --- if trace_marks then --- logwarning("%s: keep mark %s, gets index %s",pref(dataset,sequence),gref(char),getligaindex(start)) --- end --- local n = copy_node(start) --- copyinjection(n,start) --- head, current = insert_node_after(head,current,n) -- unlikely that mark has components --- elseif trace_marks then --- logwarning("%s: delete mark %s",pref(dataset,sequence),gref(char)) --- end --- start = getnext(start) --- end --- -- we can have one accent as part of a lookup and another following --- -- local start = components -- was wrong (component scanning was introduced when more complex ligs in devanagari was added) --- local start = getnext(current) --- while start do --- local char = ischar(start) --- if char then --- if marks[char] then --- setligaindex(start,baseindex + getligaindex(start,componentindex)) --- if trace_marks then --- logwarning("%s: set mark %s, gets index %s",pref(dataset,sequence),gref(char),getligaindex(start)) --- end --- start = getnext(start) --- else --- break --- end --- else --- break --- end --- end --- else --- -- discfound ... forget about marks .. probably no scripts that hyphenate and have marks --- local discprev, discnext = getboth(discfound) --- if discprev and discnext then --- -- we assume normalization in context, and don't care about generic ... especially --- -- \- can give problems as there we can have a negative char but that won't match --- -- anyway --- local pre, post, replace, pretail, posttail, replacetail = getdisc(discfound,true) --- if not replace then -- todo: signal simple hyphen --- local prev = getprev(base) --- local current = comp --- local previous = nil --- local copied = nil --- while current do --- if getid(current) == glyph_code then --- local n = copy_node(current) --- if copied then --- setlink(previous,n) --- else --- copied = n --- end --- previous = n --- end --- current = getnext(current) --- end --- setprev(discnext) -- also blocks funny assignments --- setnext(discprev) -- also blocks funny assignments --- if pre then --- setlink(discprev,pre) --- end --- pre = comp --- if post then --- setlink(posttail,discnext) --- setprev(post) --- else --- post = discnext --- end --- setlink(prev,discfound,next) --- setboth(base) --- set_components(base,copied) --- setdisc(discfound,pre,post,base) -- was discretionary_code --- base = prev -- restart --- end --- end --- end --- return head, base --- end +-- Remark for Kai: (some arabic fonts do mark + mark = other mark and such) +-- +-- The hasmarks is needed for ligatures of marks that are part of a ligature in +-- which case we assume that we can delete the marks anyway (we can always become +-- more clever if needed) .. in fact the whole logic here should be redone. We're +-- in the not discfound branch then. We now have skiphash too so we can be more +-- selective if needed (todo). -local function toligature(head,start,stop,char,dataset,sequence,markflag,discfound) -- brr head +local function toligature(head,start,stop,char,dataset,sequence,skiphash,discfound,hasmarks) -- brr head if getattr(start,a_noligature) == 1 then -- so we can do: e\noligature{ff}e e\noligature{f}fie (we only look at the first) return head, start @@ -611,25 +534,28 @@ local function toligature(head,start,stop,char,dataset,sequence,markflag,discfou set_components(base,comp) setlink(prev,base,next) if not discfound then - local deletemarks = markflag ~= "mark" + local deletemarks = not skiphash or hasmarks local components = start local baseindex = 0 local componentindex = 0 local head = base local current = base - -- first we loop over the glyphs in start .. stop + -- first we loop over the glyphs in start ... stop while start do local char = getchar(start) if not marks[char] then baseindex = baseindex + componentindex componentindex = count_components(start,marks) - elseif not deletemarks then -- quite fishy + -- we can be more clever here: "not deletemarks or (skiphash and not skiphash[char])" + -- and such: + elseif not deletemarks then + -- we can get a loop when the font expects otherwise (i.e. unexpected deletemarks) setligaindex(start,baseindex + getligaindex(start,componentindex)) if trace_marks then logwarning("%s: keep mark %s, gets index %s",pref(dataset,sequence),gref(char),getligaindex(start)) end local n = copy_node(start) - copyinjection(n,start) + copyinjection(n,start) -- is this ok ? we position later anyway head, current = insert_node_after(head,current,n) -- unlikely that mark has components elseif trace_marks then logwarning("%s: delete mark %s",pref(dataset,sequence),gref(char)) @@ -641,6 +567,7 @@ local function toligature(head,start,stop,char,dataset,sequence,markflag,discfou while start do local char = ischar(start) if char then + -- also something skiphash here? if marks[char] then setligaindex(start,baseindex + getligaindex(start,componentindex)) if trace_marks then @@ -684,7 +611,11 @@ local function toligature(head,start,stop,char,dataset,sequence,markflag,discfou -- here components have a pointer so we can't free it! set_components(base,copied) replace = base - setdisc(discfound,pre,post,replace) -- was discretionary_code + if forcediscretionaries then + setdisc(discfound,pre,post,replace,discretionary_code) + else + setdisc(discfound,pre,post,replace) + end base = prev end end @@ -692,7 +623,7 @@ local function toligature(head,start,stop,char,dataset,sequence,markflag,discfou return head, base end -local function multiple_glyphs(head,start,multiple,ignoremarks,what) +local function multiple_glyphs(head,start,multiple,skiphash,what) -- what to do with skiphash matches here local nofmultiples = #multiple if nofmultiples > 0 then resetinjection(start) @@ -804,21 +735,25 @@ function handlers.gsub_alternate(head,start,dataset,sequence,alternative) return head, start, true end -function handlers.gsub_multiple(head,start,dataset,sequence,multiple) +function handlers.gsub_multiple(head,start,dataset,sequence,multiple,rlmode,skiphash) if trace_multiples then logprocess("%s: replacing %s by multiple %s",pref(dataset,sequence),gref(getchar(start)),gref(multiple)) end - return multiple_glyphs(head,start,multiple,sequence.flags[1],dataset[1]) + return multiple_glyphs(head,start,multiple,skiphash,dataset[1]) end -function handlers.gsub_ligature(head,start,dataset,sequence,ligature) +-- Don't we deal with disc otherwise now? I need to check if the next one can be +-- simplified. Anyway, it can be way messier: marks that get removed as well as +-- marks that are kept. + +function handlers.gsub_ligature(head,start,dataset,sequence,ligature,rlmode,skiphash) local current = getnext(start) if not current then return head, start, false, nil end local stop = nil local startchar = getchar(start) - if marks[startchar] then + if skiphash and skiphash[startchar] then while current do local char = ischar(current,currentfont) if char then @@ -849,15 +784,16 @@ function handlers.gsub_ligature(head,start,dataset,sequence,ligature) -- ok, goto next lookup end end - else - local skipmark = sequence.flags[1] + else -- is the check for disc still valid here ? and why only replace then local discfound = false local lastdisc = nil + local hasmarks = marks[startchar] while current do local char, id = ischar(current,currentfont) if char then - if skipmark and marks[char] then + if skiphash and skiphash[char] then current = getnext(current) + -- if stop then stop = current end -- ? else -- ligature is a tree local lg = ligature[char] -- can there be multiple in a row? maybe in a bad font if lg then @@ -865,6 +801,9 @@ function handlers.gsub_ligature(head,start,dataset,sequence,ligature) discfound = lastdisc lastdisc = nil end + if marks[char] then + hasmarks = true + end stop = current -- needed for fake so outside then ligature = lg current = getnext(current) @@ -876,8 +815,20 @@ function handlers.gsub_ligature(head,start,dataset,sequence,ligature) -- kind of weird break elseif id == disc_code then - -- tricky .. we also need to do pre here - local replace = getfield(current,"replace") + -- + -- Kai: see chainprocs, we probably could do the same here or was there a reason + -- why we kept the replace check here. + -- + -- if not discfound then + -- discfound = current + -- end + -- if current == stop then + -- break -- okay? or before the disc + -- else + -- current = getnext(current) + -- end + -- + local replace = getfield(current,"replace") -- hm: pre and post if replace then -- of{f-}{}{f}e o{f-}{}{f}fe o{-}{}{ff}e (oe and ff ligature) -- we can end up here when we have a start run .. testruns start at a disc but @@ -887,6 +838,9 @@ function handlers.gsub_ligature(head,start,dataset,sequence,ligature) if char then local lg = ligature[char] -- can there be multiple in a row? maybe in a bad font if lg then + if marks[char] then + hasmarks = true -- very unlikely + end ligature = lg replace = getnext(replace) else @@ -909,10 +863,10 @@ function handlers.gsub_ligature(head,start,dataset,sequence,ligature) if stop then if trace_ligatures then local stopchar = getchar(stop) - head, start = toligature(head,start,stop,lig,dataset,sequence,skipmark,discfound) + head, start = toligature(head,start,stop,lig,dataset,sequence,skiphash,discfound,hasmarks) logprocess("%s: replacing %s upto %s by ligature %s case 2",pref(dataset,sequence),gref(startchar),gref(stopchar),gref(lig)) else - head, start = toligature(head,start,stop,lig,dataset,sequence,skipmark,discfound) + head, start = toligature(head,start,stop,lig,dataset,sequence,skiphash,discfound,hasmarks) end else -- weird but happens (in some arabic font) @@ -930,24 +884,24 @@ function handlers.gsub_ligature(head,start,dataset,sequence,ligature) return head, start, false, discfound end -function handlers.gpos_single(head,start,dataset,sequence,kerns,rlmode,step,i,injection) +function handlers.gpos_single(head,start,dataset,sequence,kerns,rlmode,skiphash,step,injection) local startchar = getchar(start) - if step.format == "pair" then - local dx, dy, w, h = setpair(start,factor,rlmode,sequence.flags[4],kerns,injection) + local format = step.format + if format == "single" or type(kerns) == "table" then -- the table check can go + local dx, dy, w, h = setposition(0,start,factor,rlmode,kerns,injection) if trace_kerns then - logprocess("%s: shifting single %s by (%p,%p) and correction (%p,%p)",pref(dataset,sequence),gref(startchar),dx,dy,w,h) + logprocess("%s: shifting single %s by %s xy (%p,%p) and wh (%p,%p)",pref(dataset,sequence),gref(startchar),format,dx,dy,w,h) end else - -- needs checking .. maybe no kerns format for single - local k = setkern(start,factor,rlmode,kerns,injection) + local k = (format == "move" and setmove or setkern)(start,factor,rlmode,kerns,injection) if trace_kerns then - logprocess("%s: shifting single %s by %p",pref(dataset,sequence),gref(startchar),k) + logprocess("%s: shifting single %s by %s %p",pref(dataset,sequence),gref(startchar),format,k) end end - return head, start, false + return head, start, true end -function handlers.gpos_pair(head,start,dataset,sequence,kerns,rlmode,step,i,injection) +function handlers.gpos_pair(head,start,dataset,sequence,kerns,rlmode,skiphash,step,injection) local snext = getnext(start) if not snext then return head, start, false @@ -956,48 +910,49 @@ function handlers.gpos_pair(head,start,dataset,sequence,kerns,rlmode,step,i,inje while snext do local nextchar = ischar(snext,currentfont) if nextchar then - local krn = kerns[nextchar] - if not krn and marks[nextchar] then - prev = snext + if skiphash and skiphash[nextchar] then -- includes marks too when flag + prev = snext snext = getnext(snext) - elseif not krn then - break - elseif step.format == "pair" then - local a, b = krn[1], krn[2] - if optimizekerns then - -- this permits a mixed table, but we could also decide to optimize this - -- in the loader and use format 'kern' - if not b and a[1] == 0 and a[2] == 0 and a[4] == 0 then - local k = setkern(snext,factor,rlmode,a[3],injection) + else + local krn = kerns[nextchar] + if not krn then + break + end + local format = step.format + if format == "pair" then + local a, b = krn[1], krn[2] + if a == true then + -- zero + elseif a then -- #a > 0 + local x, y, w, h = setposition(1,start,factor,rlmode,a,injection) if trace_kerns then - logprocess("%s: shifting single %s by %p",pref(dataset,sequence),gref(nextchar),k) + local startchar = getchar(start) + logprocess("%s: shifting first of pair %s and %s by xy (%p,%p) and wh (%p,%p) as %s",pref(dataset,sequence),gref(startchar),gref(nextchar),x,y,w,h,injection or "injections") end - return head, start, true end - end - if a and #a > 0 then - local x, y, w, h = setpair(start,factor,rlmode,sequence.flags[4],a,injection) - if trace_kerns then - local startchar = getchar(start) - logprocess("%s: shifting first of pair %s and %s by (%p,%p) and correction (%p,%p) as %s",pref(dataset,sequence),gref(startchar),gref(nextchar),x,y,w,h,injection or "injections") + if b == true then + -- zero + start = snext -- cf spec + elseif b then -- #b > 0 + local x, y, w, h = setposition(2,snext,factor,rlmode,b,injection) + if trace_kerns then + local startchar = getchar(snext) + logprocess("%s: shifting second of pair %s and %s by xy (%p,%p) and wh (%p,%p) as %s",pref(dataset,sequence),gref(startchar),gref(nextchar),x,y,w,h,injection or "injections") + end + start = snext -- cf spec + elseif forcepairadvance then + start = snext -- for testing, not cf spec end - end - if b and #b > 0 then - local x, y, w, h = setpair(snext,factor,rlmode,sequence.flags[4],b,injection) + return head, start, true + elseif krn ~= 0 then + local k = (format == "move" and setmove or setkern)(snext,factor,rlmode,krn,injection) if trace_kerns then - local startchar = getchar(snext) - logprocess("%s: shifting second of pair %s and %s by (%p,%p) and correction (%p,%p) as %s",pref(dataset,sequence),gref(startchar),gref(nextchar),x,y,w,h,injection or "injections") + logprocess("%s: inserting %s %p between %s and %s as %s",pref(dataset,sequence),format,k,gref(getchar(prev)),gref(nextchar),injection or "injections") end + return head, start, true + else -- can't happen + break end - return head, start, true - elseif krn ~= 0 then - local k = setkern(snext,factor,rlmode,krn,injection) - if trace_kerns then - logprocess("%s: inserting kern %p between %s and %s as %s",pref(dataset,sequence),k,gref(getchar(prev)),gref(nextchar),injection or "injections") - end - return head, start, true - else -- can't happen - break end else break @@ -1012,7 +967,7 @@ end we need to explicitly test for basechar, baselig and basemark entries.</p> --ldx]]-- -function handlers.gpos_mark2base(head,start,dataset,sequence,markanchors,rlmode) +function handlers.gpos_mark2base(head,start,dataset,sequence,markanchors,rlmode,skiphash) local markchar = getchar(start) if marks[markchar] then local base = getprev(start) -- [glyph] [start=mark] @@ -1047,10 +1002,13 @@ function handlers.gpos_mark2base(head,start,dataset,sequence,markanchors,rlmode) local ma = markanchors[2] local dx, dy, bound = setmark(start,base,factor,rlmode,ba,ma,characters[basechar],false,checkmarks) if trace_marks then - logprocess("%s, anchor %s, bound %s: anchoring mark %s to basechar %s => (%p,%p)", - pref(dataset,sequence),anchor,bound,gref(markchar),gref(basechar),dx,dy) + logprocess("%s, bound %s, anchoring mark %s to basechar %s => (%p,%p)", + pref(dataset,sequence),bound,gref(markchar),gref(basechar),dx,dy) end return head, start, true + elseif trace_bugs then + -- onetimemessage(currentfont,basechar,"no base anchors",report_fonts) + logwarning("%s: mark %s is not anchored to %s",pref(dataset,sequence),gref(markchar),gref(basechar)) end elseif trace_bugs then logwarning("%s: nothing preceding, case %i",pref(dataset,sequence),1) @@ -1064,7 +1022,7 @@ function handlers.gpos_mark2base(head,start,dataset,sequence,markanchors,rlmode) return head, start, false end -function handlers.gpos_mark2ligature(head,start,dataset,sequence,markanchors,rlmode) +function handlers.gpos_mark2ligature(head,start,dataset,sequence,markanchors,rlmode,skiphash) local markchar = getchar(start) if marks[markchar] then local base = getprev(start) -- [glyph] [optional marks] [start=mark] @@ -1103,8 +1061,8 @@ function handlers.gpos_mark2ligature(head,start,dataset,sequence,markanchors,rlm if ba then local dx, dy, bound = setmark(start,base,factor,rlmode,ba,ma,characters[basechar],false,checkmarks) if trace_marks then - logprocess("%s, anchor %s, index %s, bound %s: anchoring mark %s to baselig %s at index %s => (%p,%p)", - pref(dataset,sequence),anchor,index,bound,gref(markchar),gref(basechar),index,dx,dy) + logprocess("%s, index %s, bound %s, anchoring mark %s to baselig %s at index %s => (%p,%p)", + pref(dataset,sequence),index,bound,gref(markchar),gref(basechar),index,dx,dy) end return head, start, true else @@ -1129,7 +1087,7 @@ function handlers.gpos_mark2ligature(head,start,dataset,sequence,markanchors,rlm return head, start, false end -function handlers.gpos_mark2mark(head,start,dataset,sequence,markanchors,rlmode) +function handlers.gpos_mark2mark(head,start,dataset,sequence,markanchors,rlmode,skiphash) local markchar = getchar(start) if marks[markchar] then local base = getprev(start) -- [glyph] [basemark] [start=mark] @@ -1152,8 +1110,8 @@ function handlers.gpos_mark2mark(head,start,dataset,sequence,markanchors,rlmode) local ma = markanchors[2] local dx, dy, bound = setmark(start,base,factor,rlmode,ba,ma,characters[basechar],true,checkmarks) if trace_marks then - logprocess("%s, anchor %s, bound %s: anchoring mark %s to basemark %s => (%p,%p)", - pref(dataset,sequence),anchor,bound,gref(markchar),gref(basechar),dx,dy) + logprocess("%s, bound %s, anchoring mark %s to basemark %s => (%p,%p)", + pref(dataset,sequence),bound,gref(markchar),gref(basechar),dx,dy) end return head, start, true end @@ -1165,7 +1123,7 @@ function handlers.gpos_mark2mark(head,start,dataset,sequence,markanchors,rlmode) return head, start, false end -function handlers.gpos_cursive(head,start,dataset,sequence,exitanchors,rlmode,step,i) -- to be checked +function handlers.gpos_cursive(head,start,dataset,sequence,exitanchors,rlmode,skiphash,step) -- to be checked local startchar = getchar(start) if marks[startchar] then if trace_cursive then @@ -1177,8 +1135,7 @@ function handlers.gpos_cursive(head,start,dataset,sequence,exitanchors,rlmode,st local nextchar = ischar(nxt,currentfont) if not nextchar then break - elseif marks[nextchar] then - -- should not happen (maybe warning) + elseif marks[nextchar] then -- always sequence.flags[1] nxt = getnext(nxt) else local exit = exitanchors[3] @@ -1187,9 +1144,10 @@ function handlers.gpos_cursive(head,start,dataset,sequence,exitanchors,rlmode,st if entry then entry = entry[2] if entry then - local dx, dy, bound = setcursive(start,nxt,factor,rlmode,exit,entry,characters[startchar],characters[nextchar]) + local r2lflag = sequence.flags[4] -- mentioned in the standard + local dx, dy, bound = setcursive(start,nxt,factor,rlmode,exit,entry,characters[startchar],characters[nextchar],r2lflag) if trace_cursive then - logprocess("%s: moving %s to %s cursive (%p,%p) using anchor %s and bound %s in %s mode",pref(dataset,sequence),gref(startchar),gref(nextchar),dx,dy,anchor,bound,mref(rlmode)) + logprocess("%s: moving %s to %s cursive (%p,%p) using bound %s in %s mode",pref(dataset,sequence),gref(startchar),gref(nextchar),dx,dy,bound,mref(rlmode)) end return head, start, true end @@ -1212,6 +1170,9 @@ local chainprocs = { } local function logprocess(...) if trace_steps then registermessage(...) + if trace_steps == "silent" then + return + end end report_subchain(...) end @@ -1221,6 +1182,9 @@ local logwarning = report_subchain local function logprocess(...) if trace_steps then registermessage(...) + if trace_steps == "silent" then + return + end end report_chain(...) end @@ -1234,7 +1198,7 @@ local logwarning = report_chain -- in a bit weird way. There is no lookup and the replacement comes from the lookup -- itself. It is meant mostly for dealing with Urdu. -local function reversesub(head,start,stop,dataset,sequence,replacements,rlmode) +local function reversesub(head,start,stop,dataset,sequence,replacements,rlmode,skiphash) local char = getchar(start) local replacement = replacements[char] if replacement then @@ -1288,17 +1252,31 @@ end -- logwarning("%s: bad step, no proper return values",cref(dataset,sequence)) -- end -function chainprocs.gsub_single(head,start,stop,dataset,sequence,currentlookup,chainindex) +local function getmapping(dataset,sequence,currentlookup) local steps = currentlookup.steps local nofsteps = currentlookup.nofsteps - if nofsteps > 1 then - reportmoresteps(dataset,sequence) - end if nofsteps == 0 then reportzerosteps(dataset,sequence) + currentlookup.mapping = false + return false else - local current = start + if nofsteps > 1 then + reportmoresteps(dataset,sequence) + end local mapping = steps[1].coverage + currentlookup.mapping = mapping + currentlookup.format = steps[1].format + return mapping + end +end + +function chainprocs.gsub_single(head,start,stop,dataset,sequence,currentlookup,rlmode,skiphash,chainindex) + local mapping = currentlookup.mapping + if mapping == nil then + mapping = getmapping(dataset,sequence,currentlookup) + end + if mapping then + local current = start while current do local currentchar = ischar(current) if currentchar then @@ -1329,35 +1307,6 @@ function chainprocs.gsub_single(head,start,stop,dataset,sequence,currentlookup,c end --[[ldx-- -<p>Here we replace start by a sequence of new glyphs.</p> ---ldx]]-- - -function chainprocs.gsub_multiple(head,start,stop,dataset,sequence,currentlookup) - local steps = currentlookup.steps - local nofsteps = currentlookup.nofsteps - if nofsteps > 1 then - reportmoresteps(dataset,sequence) - end - if nofsteps == 0 then - reportzerosteps(dataset,sequence) - else - local startchar = getchar(start) - local replacement = steps[1].coverage[startchar] - if not replacement or replacement == "" then - if trace_bugs then - logwarning("%s: no multiple for %s",cref(dataset,sequence),gref(startchar)) - end - else - if trace_multiples then - logprocess("%s: replacing %s by multiple characters %s",cref(dataset,sequence),gref(startchar),gref(replacement)) - end - return multiple_glyphs(head,start,replacement,sequence.flags[1],dataset[1]) - end - end - return head, start, false -end - ---[[ldx-- <p>Here we replace start by new glyph. First we delete the rest of the match.</p> --ldx]]-- @@ -1369,20 +1318,16 @@ end -- marks come last anyway -- are there cases where we need to delete the mark -function chainprocs.gsub_alternate(head,start,stop,dataset,sequence,currentlookup) - local steps = currentlookup.steps - local nofsteps = currentlookup.nofsteps - if nofsteps > 1 then - reportmoresteps(dataset,sequence) +function chainprocs.gsub_alternate(head,start,stop,dataset,sequence,currentlookup,rlmode,skiphash,chainindex) + local mapping = currentlookup.mapping + if mapping == nil then + mapping = getmapping(dataset,sequence,currentlookup) end - if nofsteps == 0 then - reportzerosteps(dataset,sequence) - else + if mapping then local kind = dataset[4] local what = dataset[1] local value = what == true and tfmdata.shared.features[kind] or what -- todo: optimize in ctx local current = start - local mapping = steps[1].coverage while current do local currentchar = ischar(current) if currentchar then @@ -1391,13 +1336,13 @@ function chainprocs.gsub_alternate(head,start,stop,dataset,sequence,currentlooku local choice, comment = get_alternative_glyph(current,alternatives,value) if choice then if trace_alternatives then - logprocess("%s: replacing %s by alternative %a to %s, %s",cref(dataset,sequence),gref(char),choice,gref(choice),comment) + logprocess("%s: replacing %s by alternative %a to %s, %s",cref(dataset,sequence),gref(currentchar),choice,gref(choice),comment) end resetinjection(start) setchar(start,choice) else if trace_alternatives then - logwarning("%s: no variant %a for %s, %s",cref(dataset,sequence),value,gref(char),comment) + logwarning("%s: no variant %a for %s, %s",cref(dataset,sequence),value,gref(currentchar),comment) end end end @@ -1416,32 +1361,57 @@ function chainprocs.gsub_alternate(head,start,stop,dataset,sequence,currentlooku end --[[ldx-- +<p>Here we replace start by a sequence of new glyphs.</p> +--ldx]]-- + +function chainprocs.gsub_multiple(head,start,stop,dataset,sequence,currentlookup,rlmode,skiphash,chainindex) + local mapping = currentlookup.mapping + if mapping == nil then + mapping = getmapping(dataset,sequence,currentlookup) + end + if mapping then + local startchar = getchar(start) + local replacement = mapping[startchar] + if not replacement or replacement == "" then + if trace_bugs then + logwarning("%s: no multiple for %s",cref(dataset,sequence),gref(startchar)) + end + else + if trace_multiples then + logprocess("%s: replacing %s by multiple characters %s",cref(dataset,sequence),gref(startchar),gref(replacement)) + end + return multiple_glyphs(head,start,replacement,skiphash,dataset[1]) + end + end + return head, start, false +end + +--[[ldx-- <p>When we replace ligatures we use a helper that handles the marks. I might change this function (move code inline and handle the marks by a separate function). We assume rather stupid ligatures (no complex disc nodes).</p> --ldx]]-- -function chainprocs.gsub_ligature(head,start,stop,dataset,sequence,currentlookup,chainindex) - local steps = currentlookup.steps - local nofsteps = currentlookup.nofsteps - if nofsteps > 1 then - reportmoresteps(dataset,sequence) +-- compare to handlers.gsub_ligature which is more complex ... why + +function chainprocs.gsub_ligature(head,start,stop,dataset,sequence,currentlookup,rlmode,skiphash,chainindex) + local mapping = currentlookup.mapping + if mapping == nil then + mapping = getmapping(dataset,sequence,currentlookup) end - if nofsteps == 0 then - reportzerosteps(dataset,sequence) - else + if mapping then local startchar = getchar(start) - local ligatures = steps[1].coverage[startchar] + local ligatures = mapping[startchar] if not ligatures then if trace_bugs then logwarning("%s: no ligatures starting with %s",cref(dataset,sequence,chainindex),gref(startchar)) end else + local hasmarks = marks[startchar] local current = getnext(start) local discfound = false local last = stop local nofreplacements = 1 - local skipmark = currentlookup.flags[1] -- sequence.flags? while current do -- todo: ischar ... can there really be disc nodes here? local id = getid(current) @@ -1456,7 +1426,7 @@ function chainprocs.gsub_ligature(head,start,stop,dataset,sequence,currentlookup end else local schar = getchar(current) - if skipmark and marks[schar] then -- marks + if skiphash and skiphash[schar] then -- marks -- if current == stop then -- maybe add this -- break -- else @@ -1468,6 +1438,9 @@ function chainprocs.gsub_ligature(head,start,stop,dataset,sequence,currentlookup ligatures = lg last = current nofreplacements = nofreplacements + 1 + if marks[char] then + hasmarks = true + end if current == stop then break else @@ -1491,7 +1464,7 @@ function chainprocs.gsub_ligature(head,start,stop,dataset,sequence,currentlookup logprocess("%s: replacing character %s upto %s by ligature %s case 4",cref(dataset,sequence,chainindex),gref(startchar),gref(getchar(stop)),gref(ligature)) end end - head, start = toligature(head,start,stop,ligature,dataset,sequence,skipmark,discfound) + head, start = toligature(head,start,stop,ligature,dataset,sequence,skiphash,discfound,hasmarks) return head, start, true, nofreplacements, discfound elseif trace_bugs then if start == stop then @@ -1505,49 +1478,43 @@ function chainprocs.gsub_ligature(head,start,stop,dataset,sequence,currentlookup return head, start, false, 0, false end -function chainprocs.gpos_single(head,start,stop,dataset,sequence,currentlookup,rlmode,chainindex) - local steps = currentlookup.steps - local nofsteps = currentlookup.nofsteps - if nofsteps > 1 then - reportmoresteps(dataset,sequence) +function chainprocs.gpos_single(head,start,stop,dataset,sequence,currentlookup,rlmode,skiphash,chainindex) + local mapping = currentlookup.mapping + if mapping == nil then + mapping = getmapping(dataset,sequence,currentlookup) end - if nofsteps == 0 then - reportzerosteps(dataset,sequence) - else + if mapping then local startchar = getchar(start) - local step = steps[1] - local kerns = step.coverage[startchar] - if not kerns then - -- skip - elseif step.format == "pair" then - local dx, dy, w, h = setpair(start,factor,rlmode,sequence.flags[4],kerns) -- currentlookup.flags ? - if trace_kerns then - logprocess("%s: shifting single %s by (%p,%p) and correction (%p,%p)",cref(dataset,sequence),gref(startchar),dx,dy,w,h) - end - else -- needs checking .. maybe no kerns format for single - local k = setkern(start,factor,rlmode,kerns,injection) - if trace_kerns then - logprocess("%s: shifting single %s by %p",cref(dataset,sequence),gref(startchar),k) + local kerns = mapping[startchar] + if kerns then + local format = currentlookup.format + if format == "single" then + local dx, dy, w, h = setposition(0,start,factor,rlmode,kerns) -- currentlookup.flags ? + if trace_kerns then + logprocess("%s: shifting single %s by %s (%p,%p) and correction (%p,%p)",cref(dataset,sequence),gref(startchar),format,dx,dy,w,h) + end + else -- needs checking .. maybe no kerns format for single + local k = (format == "move" and setmove or setkern)(start,factor,rlmode,kerns,injection) + if trace_kerns then + logprocess("%s: shifting single %s by %s %p",cref(dataset,sequence),gref(startchar),format,k) + end end + return head, start, true end end return head, start, false end -function chainprocs.gpos_pair(head,start,stop,dataset,sequence,currentlookup,rlmode,chainindex) -- todo: injections ? - local steps = currentlookup.steps - local nofsteps = currentlookup.nofsteps - if nofsteps > 1 then - reportmoresteps(dataset,sequence) +function chainprocs.gpos_pair(head,start,stop,dataset,sequence,currentlookup,rlmode,skiphash,chainindex) -- todo: injections ? + local mapping = currentlookup.mapping + if mapping == nil then + mapping = getmapping(dataset,sequence,currentlookup) end - if nofsteps == 0 then - reportzerosteps(dataset,sequence) - else + if mapping then local snext = getnext(start) if snext then local startchar = getchar(start) - local step = steps[1] - local kerns = step.coverage[startchar] -- always 1 step + local kerns = mapping[startchar] -- always 1 step if kerns then local prev = start while snext do @@ -1555,48 +1522,49 @@ function chainprocs.gpos_pair(head,start,stop,dataset,sequence,currentlookup,rlm if not nextchar then break end - local krn = kerns[nextchar] - if not krn and marks[nextchar] then - prev = snext + if skiphash and skiphash[nextchar] then + prev = snext snext = getnext(snext) - elseif not krn then - break - elseif step.format == "pair" then - local a, b = krn[1], krn[2] - if optimizekerns then - -- this permits a mixed table, but we could also decide to optimize this - -- in the loader and use format 'kern' - if not b and a[1] == 0 and a[2] == 0 and a[4] == 0 then - local k = setkern(snext,factor,rlmode,a[3],"injections") + else + local krn = kerns[nextchar] + if not krn then + break + end + local format = currentlookup.format + if format == "pair" then + local a, b = krn[1], krn[2] + if a == true then + -- zero + elseif a then + local x, y, w, h = setposition(1,start,factor,rlmode,a,"injections") -- currentlookups flags? if trace_kerns then - logprocess("%s: shifting single %s by %p",cref(dataset,sequence),gref(startchar),k) + local startchar = getchar(start) + logprocess("%s: shifting first of pair %s and %s by (%p,%p) and correction (%p,%p)",cref(dataset,sequence),gref(startchar),gref(nextchar),x,y,w,h) end - return head, start, true end - end - if a and #a > 0 then - local startchar = getchar(start) - local x, y, w, h = setpair(start,factor,rlmode,sequence.flags[4],a,"injections") -- currentlookups flags? - if trace_kerns then - logprocess("%s: shifting first of pair %s and %s by (%p,%p) and correction (%p,%p)",cref(dataset,sequence),gref(startchar),gref(nextchar),x,y,w,h) + if b == true then + -- zero + start = snext -- cf spec + elseif b then -- #b > 0 + local x, y, w, h = setposition(2,snext,factor,rlmode,b,"injections") + if trace_kerns then + local startchar = getchar(start) + logprocess("%s: shifting second of pair %s and %s by (%p,%p) and correction (%p,%p)",cref(dataset,sequence),gref(startchar),gref(nextchar),x,y,w,h) + end + start = snext -- cf spec + elseif forcepairadvance then + start = snext -- for testing, not cf spec end - end - if b and #b > 0 then - local startchar = getchar(start) - local x, y, w, h = setpair(snext,factor,rlmode,sequence.flags[4],b,"injections") + return head, start, true + elseif krn ~= 0 then + local k = (format == "move" and setmove or setkern)(snext,factor,rlmode,krn) if trace_kerns then - logprocess("%s: shifting second of pair %s and %s by (%p,%p) and correction (%p,%p)",cref(dataset,sequence),gref(startchar),gref(nextchar),x,y,w,h) + logprocess("%s: inserting %s %p between %s and %s",cref(dataset,sequence),format,k,gref(getchar(prev)),gref(nextchar)) end + return head, start, true + else + break end - return head, start, true - elseif krn ~= 0 then - local k = setkern(snext,factor,rlmode,krn) - if trace_kerns then - logprocess("%s: inserting kern %s between %s and %s",cref(dataset,sequence),k,gref(getchar(prev)),gref(nextchar)) - end - return head, start, true - else - break end end end @@ -1605,18 +1573,15 @@ function chainprocs.gpos_pair(head,start,stop,dataset,sequence,currentlookup,rlm return head, start, false end -function chainprocs.gpos_mark2base(head,start,stop,dataset,sequence,currentlookup,rlmode) - local steps = currentlookup.steps - local nofsteps = currentlookup.nofsteps - if nofsteps > 1 then - reportmoresteps(dataset,sequence) +function chainprocs.gpos_mark2base(head,start,stop,dataset,sequence,currentlookup,rlmode,skiphash,chainindex) + local mapping = currentlookup.mapping + if mapping == nil then + mapping = getmapping(dataset,sequence,currentlookup) end - if nofsteps == 0 then - reportzerosteps(dataset,sequence) - else + if mapping then local markchar = getchar(start) if marks[markchar] then - local markanchors = steps[1].coverage[markchar] -- always 1 step + local markanchors = mapping[markchar] -- always 1 step if markanchors then local base = getprev(start) -- [glyph] [start=mark] if base then @@ -1651,8 +1616,8 @@ function chainprocs.gpos_mark2base(head,start,stop,dataset,sequence,currentlooku if ma then local dx, dy, bound = setmark(start,base,factor,rlmode,ba,ma,characters[basechar],false,checkmarks) if trace_marks then - logprocess("%s, anchor %s, bound %s: anchoring mark %s to basechar %s => (%p,%p)", - cref(dataset,sequence),anchor,bound,gref(markchar),gref(basechar),dx,dy) + logprocess("%s, bound %s, anchoring mark %s to basechar %s => (%p,%p)", + cref(dataset,sequence),bound,gref(markchar),gref(basechar),dx,dy) end return head, start, true end @@ -1673,18 +1638,15 @@ function chainprocs.gpos_mark2base(head,start,stop,dataset,sequence,currentlooku return head, start, false end -function chainprocs.gpos_mark2ligature(head,start,stop,dataset,sequence,currentlookup,rlmode) - local steps = currentlookup.steps - local nofsteps = currentlookup.nofsteps - if nofsteps > 1 then - reportmoresteps(dataset,sequence) +function chainprocs.gpos_mark2ligature(head,start,stop,dataset,sequence,currentlookup,rlmode,skiphash,chainindex) + local mapping = currentlookup.mapping + if mapping == nil then + mapping = getmapping(dataset,sequence,currentlookup) end - if nofsteps == 0 then - reportzerosteps(dataset,sequence) - else + if mapping then local markchar = getchar(start) if marks[markchar] then - local markanchors = steps[1].coverage[markchar] -- always 1 step + local markanchors = mapping[markchar] -- always 1 step if markanchors then local base = getprev(start) -- [glyph] [optional marks] [start=mark] if base then @@ -1722,8 +1684,8 @@ function chainprocs.gpos_mark2ligature(head,start,stop,dataset,sequence,currentl if ba then local dx, dy, bound = setmark(start,base,factor,rlmode,ba,ma,characters[basechar],false,checkmarks) if trace_marks then - logprocess("%s, anchor %s, bound %s: anchoring mark %s to baselig %s at index %s => (%p,%p)", - cref(dataset,sequence),anchor,a or bound,gref(markchar),gref(basechar),index,dx,dy) + logprocess("%s, bound %s, anchoring mark %s to baselig %s at index %s => (%p,%p)", + cref(dataset,sequence),a or bound,gref(markchar),gref(basechar),index,dx,dy) end return head, start, true end @@ -1745,18 +1707,15 @@ function chainprocs.gpos_mark2ligature(head,start,stop,dataset,sequence,currentl return head, start, false end -function chainprocs.gpos_mark2mark(head,start,stop,dataset,sequence,currentlookup,rlmode) - local steps = currentlookup.steps - local nofsteps = currentlookup.nofsteps - if nofsteps > 1 then - reportmoresteps(dataset,sequence) +function chainprocs.gpos_mark2mark(head,start,stop,dataset,sequence,currentlookup,rlmode,skiphash,chainindex) + local mapping = currentlookup.mapping + if mapping == nil then + mapping = getmapping(dataset,sequence,currentlookup) end - if nofsteps == 0 then - reportzerosteps(dataset,sequence) - else + if mapping then local markchar = getchar(start) if marks[markchar] then - local markanchors = steps[1].coverage[markchar] -- always 1 step + local markanchors = mapping[markchar] -- always 1 step if markanchors then local base = getprev(start) -- [glyph] [basemark] [start=mark] local slc = getligaindex(start) @@ -1779,8 +1738,8 @@ function chainprocs.gpos_mark2mark(head,start,stop,dataset,sequence,currentlooku if ma then local dx, dy, bound = setmark(start,base,factor,rlmode,ba,ma,characters[basechar],true,checkmarks) if trace_marks then - logprocess("%s, anchor %s, bound %s: anchoring mark %s to basemark %s => (%p,%p)", - cref(dataset,sequence),anchor,bound,gref(markchar),gref(basechar),dx,dy) + logprocess("%s, bound %s, anchoring mark %s to basemark %s => (%p,%p)", + cref(dataset,sequence),bound,gref(markchar),gref(basechar),dx,dy) end return head, start, true end @@ -1801,17 +1760,14 @@ function chainprocs.gpos_mark2mark(head,start,stop,dataset,sequence,currentlooku return head, start, false end -function chainprocs.gpos_cursive(head,start,stop,dataset,sequence,currentlookup,rlmode) - local steps = currentlookup.steps - local nofsteps = currentlookup.nofsteps - if nofsteps > 1 then - reportmoresteps(dataset,sequence) +function chainprocs.gpos_cursive(head,start,stop,dataset,sequence,currentlookup,rlmode,skiphash,chainindex) + local mapping = currentlookup.mapping + if mapping == nil then + mapping = getmapping(dataset,sequence,currentlookup) end - if nofsteps == 0 then - reportzerosteps(dataset,sequence) - else + if mapping then local startchar = getchar(start) - local exitanchors = steps[1].coverage[startchar] -- always 1 step + local exitanchors = mapping[startchar] -- always 1 step if exitanchors then if marks[startchar] then if trace_cursive then @@ -1833,9 +1789,10 @@ function chainprocs.gpos_cursive(head,start,stop,dataset,sequence,currentlookup, if entry then entry = entry[2] if entry then - local dx, dy, bound = setcursive(start,nxt,factor,rlmode,exit,entry,characters[startchar],characters[nextchar]) + local r2lflag = sequence.flags[4] -- mentioned in the standard + local dx, dy, bound = setcursive(start,nxt,factor,rlmode,exit,entry,characters[startchar],characters[nextchar],r2lflag) if trace_cursive then - logprocess("%s: moving %s to %s cursive (%p,%p) using anchor %s and bound %s in %s mode",pref(dataset,sequence),gref(startchar),gref(nextchar),dx,dy,anchor,bound,mref(rlmode)) + logprocess("%s: moving %s to %s cursive (%p,%p) using bound %s in %s mode",pref(dataset,sequence),gref(startchar),gref(nextchar),dx,dy,bound,mref(rlmode)) end return head, start, true end @@ -1865,36 +1822,50 @@ end -- A previous version had disc collapsing code in the (single sub) handler plus some -- checking in the main loop, but that left the pre/post sequences undone. The best -- solution is to add some checking there and backtrack when a replace/post matches --- but it takes a bit of work to figure out an efficient way (this is what the sweep* --- names refer to). I might look into that variant one day again as it can replace --- some other code too. In that approach we can have a special version for gub and pos --- which gains some speed. This method does the test and passes info to the handlers --- (sweepnode, sweepmode, sweepprev, sweepnext, etc). Here collapsing is handled in the --- main loop which also makes code elsewhere simpler (i.e. no need for the other special --- runners and disc code in ligature building). I also experimented with pushing preceding --- glyphs sequences in the replace/pre fields beforehand which saves checking afterwards --- but at the cost of duplicate glyphs (memory) but it's too much overhead (runtime). +-- but it takes a bit of work to figure out an efficient way (this is what the +-- sweep* names refer to). I might look into that variant one day again as it can +-- replace some other code too. In that approach we can have a special version for +-- gub and pos which gains some speed. This method does the test and passes info to +-- the handlers. Here collapsing is handled in the main loop which also makes code +-- elsewhere simpler (i.e. no need for the other special runners and disc code in +-- ligature building). I also experimented with pushing preceding glyphs sequences +-- in the replace/pre fields beforehand which saves checking afterwards but at the +-- cost of duplicate glyphs (memory) but it's too much overhead (runtime). -- --- In the meantime Kai had moved the code from the single chain into a more general handler --- and this one (renamed to chaindisk) is used now. I optimized the code a bit and brought --- it in sycn with the other code. Hopefully I didn't introduce errors. Note: this somewhat --- complex approach is meant for fonts that implement (for instance) ligatures by character --- replacement which to some extend is not that suitable for hyphenation. I also use some --- helpers. This method passes some states but reparses the list. There is room for a bit of --- speed up but that will be done in the context version. (In fact a partial rewrite of all --- code can bring some more efficientry.) +-- In the meantime Kai had moved the code from the single chain into a more general +-- handler and this one (renamed to chaindisk) is used now. I optimized the code a +-- bit and brought it in sycn with the other code. Hopefully I didn't introduce +-- errors. Note: this somewhat complex approach is meant for fonts that implement +-- (for instance) ligatures by character replacement which to some extend is not +-- that suitable for hyphenation. I also use some helpers. This method passes some +-- states but reparses the list. There is room for a bit of speed up but that will +-- be done in the context version. (In fact a partial rewrite of all code can bring +-- some more efficiency.) -- --- I didn't test it with extremes but successive disc nodes still can give issues but in --- order to handle that we need more complex code which also slows down even more. The main --- loop variant could deal with that: test, collapse, backtrack. +-- I didn't test it with extremes but successive disc nodes still can give issues +-- but in order to handle that we need more complex code which also slows down even +-- more. The main loop variant could deal with that: test, collapse, backtrack. + +local userkern = nuts.pool and nuts.pool.newkern -- context + +do if not userkern then -- generic + + local thekern = nuts.new("kern",1) -- userkern + local setkern = nuts.setkern -- not injections.setkern + + userkern = function(k) + local n = copy_node(thekern) + setkern(n,k) + return n + end -local new_kern = nuts.pool.kern +end end local function checked(head) local current = head while current do if getid(current) == glue_code then - local kern = new_kern(getwidth(current)) + local kern = userkern(getwidth(current)) if head == current then local next = getnext(current) if next then @@ -1925,23 +1896,23 @@ end local noflags = { false, false, false, false } -local function chainrun(head,start,last,dataset,sequence,rlmode,ck,skipped) +local function chainrun(head,start,last,dataset,sequence,rlmode,skiphash,ck) local size = ck[5] - ck[4] + 1 - local flags = sequence.flags or noflags - local done = false - local skipmark = flags[1] local chainlookups = ck[6] + local done = false -- current match if chainlookups then - local nofchainlookups = #chainlookups -- Lookups can be like { 1, false, 3 } or { false, 2 } or basically anything and -- #lookups can be less than #current + if size == 1 then + -- if nofchainlookups > size then -- -- bad rules -- end + local chainlookup = chainlookups[1] for j=1,#chainlookup do local chainstep = chainlookup[j] @@ -1949,7 +1920,7 @@ local function chainrun(head,start,last,dataset,sequence,rlmode,ck,skipped) local chainproc = chainprocs[chainkind] if chainproc then local ok - head, start, ok = chainproc(head,start,last,dataset,sequence,chainstep,rlmode,1) + head, start, ok = chainproc(head,start,last,dataset,sequence,chainstep,rlmode,skiphash) if ok then done = true end @@ -1957,7 +1928,9 @@ local function chainrun(head,start,last,dataset,sequence,rlmode,ck,skipped) logprocess("%s: %s is not yet supported (1)",cref(dataset,sequence),chainkind) end end + else + -- See LookupType 5: Contextual Substitution Subtable. Now it becomes messy. The -- easiest case is where #current maps on #lookups i.e. one-to-one. But what if -- we have a ligature. Cf the spec we then need to advance one character but we @@ -1968,14 +1941,19 @@ local function chainrun(head,start,last,dataset,sequence,rlmode,ck,skipped) -- -- Even worse are these family emoji shapes as they can have multiple lookups -- per slot (probably only for gpos). + + -- It's very unlikely that we will have skip classes here but still ... we seldom + -- enter this branch anyway. + local i = 1 + local laststart = start + local nofchainlookups = #chainlookups -- useful? while start do - if skipped then + if skiphash then -- hm, so we know we skip some while start do - local char = getchar(start) - local class = classes[char] - if class then - if class == skipmark or class == skipligature or class == skipbase or (markclass and class == "mark" and not markclass[char]) then + local char = ischar(start,currentfont) + if char then + if skiphash and skiphash[char] then start = getnext(start) else break @@ -1993,12 +1971,13 @@ local function chainrun(head,start,last,dataset,sequence,rlmode,ck,skipped) local chainproc = chainprocs[chainkind] if chainproc then local ok, n - head, start, ok, n = chainproc(head,start,last,dataset,sequence,chainstep,rlmode,i) + head, start, ok, n = chainproc(head,start,last,dataset,sequence,chainstep,rlmode,skiphash,i) -- messy since last can be changed ! if ok then done = true if n and n > 1 and i + n > nofchainlookups then -- this is a safeguard, we just ignore the rest of the lookups + i = size -- prevents an advance break end end @@ -2012,15 +1991,20 @@ local function chainrun(head,start,last,dataset,sequence,rlmode,ck,skipped) if i > size or not start then break elseif start then + laststart = start start = getnext(start) end end + if not start then + start = laststart + end + end else -- todo: needs checking for holes in the replacements local replacements = ck[7] if replacements then - head, start, done = reversesub(head,start,last,dataset,sequence,replacements,rlmode) + head, start, done = reversesub(head,start,last,dataset,sequence,replacements,rlmode,skiphash) else done = true if trace_contexts then @@ -2031,7 +2015,7 @@ local function chainrun(head,start,last,dataset,sequence,rlmode,ck,skipped) return head, start, done end -local function chaindisk(head,start,dataset,sequence,rlmode,ck,skipped) +local function chaindisk(head,start,dataset,sequence,rlmode,skiphash,ck) if not start then return head, start, false @@ -2098,7 +2082,7 @@ local function chaindisk(head,start,dataset,sequence,rlmode,ck,skipped) if current then -- go on elseif sweepoverflow then - -- we already are folling up on sweepnode + -- we already are following up on sweepnode break elseif sweeptype == "post" or sweeptype == "replace" then current = getnext(sweepnode) @@ -2213,7 +2197,6 @@ local function chaindisk(head,start,dataset,sequence,rlmode,ck,skipped) end end end - local done = false if lookaheaddisc then @@ -2241,7 +2224,7 @@ local function chaindisk(head,start,dataset,sequence,rlmode,ck,skipped) head = lookaheaddisc end local pre, post, replace = getdisc(lookaheaddisc) - local new = copy_node_list(cf) + local new = copy_node_list(cf) -- br, how often does that happen local cnew = new if pre then setlink(find_node_tail(cf),pre) @@ -2261,14 +2244,14 @@ local function chaindisk(head,start,dataset,sequence,rlmode,ck,skipped) end if not notmatchpre[lookaheaddisc] then local ok = false - cf, start, ok = chainrun(cf,start,cl,dataset,sequence,rlmode,ck,skipped) + cf, start, ok = chainrun(cf,start,cl,dataset,sequence,rlmode,skiphash,ck) if ok then done = true end end if not notmatchreplace[lookaheaddisc] then local ok = false - new, cnew, ok = chainrun(new,cnew,clast,dataset,sequence,rlmode,ck,skipped) + new, cnew, ok = chainrun(new,cnew,clast,dataset,sequence,rlmode,skiphash,ck) if ok then done = true end @@ -2279,8 +2262,8 @@ local function chaindisk(head,start,dataset,sequence,rlmode,ck,skipped) setdisc(lookaheaddisc,cf,post,new) end start = getprev(lookaheaddisc) - sweephead[cf] = getnext(clast) - sweephead[new] = getnext(cl) + sweephead[cf] = getnext(clast) or false + sweephead[new] = getnext(cl) or false elseif backtrackdisc then @@ -2299,10 +2282,7 @@ local function chaindisk(head,start,dataset,sequence,rlmode,ck,skipped) break end end - if cnext then - setprev(cnext,backtrackdisc) - end - setnext(backtrackdisc,cnext) + setlink(backtrackdisc,cnext) setprev(cf) setnext(cl) local pre, post, replace, pretail, posttail, replacetail = getdisc(backtrackdisc,true) @@ -2317,14 +2297,14 @@ local function chaindisk(head,start,dataset,sequence,rlmode,ck,skipped) end if not notmatchpost[backtrackdisc] then local ok = false - cf, start, ok = chainrun(cf,start,last,dataset,sequence,rlmode,ck,skipped) + cf, start, ok = chainrun(cf,start,last,dataset,sequence,rlmode,skiphash,ck) if ok then done = true end end if not notmatchreplace[backtrackdisc] then local ok = false - new, cnew, ok = chainrun(new,cnew,clast,dataset,sequence,rlmode,ck,skipped) + new, cnew, ok = chainrun(new,cnew,clast,dataset,sequence,rlmode,skiphash,ck) if ok then done = true end @@ -2345,13 +2325,13 @@ local function chaindisk(head,start,dataset,sequence,rlmode,ck,skipped) setdisc(backtrackdisc,pre,post,replace) end start = getprev(backtrackdisc) - sweephead[post] = getnext(clast) - sweephead[replace] = getnext(last) + sweephead[post] = getnext(clast) or false + sweephead[replace] = getnext(last) or false else local ok = false - head, start, ok = chainrun(head,start,last,dataset,sequence,rlmode,ck,skipped) + head, start, ok = chainrun(head,start,last,dataset,sequence,rlmode,skiphash,ck) if ok then done = true end @@ -2361,463 +2341,464 @@ local function chaindisk(head,start,dataset,sequence,rlmode,ck,skipped) return head, start, done end -local function chaintrac(head,start,dataset,sequence,rlmode,ck,skipped) +local function chaintrac(head,start,dataset,sequence,rlmode,skiphash,ck,match,discseen,sweepnode) local rule = ck[1] local lookuptype = ck[8] or ck[2] local nofseq = #ck[3] local first = ck[4] local last = ck[5] local char = getchar(start) - logwarning("%s: rule %s matches at char %s for (%s,%s,%s) chars, lookuptype %a", - cref(dataset,sequence),rule,gref(char),first-1,last-first+1,nofseq-last,lookuptype) + logwarning("%s: rule %s %s at char %s for (%s,%s,%s) chars, lookuptype %a, %sdisc seen, %ssweeping", + cref(dataset,sequence),rule,match and "matches" or "nomatch", + gref(char),first-1,last-first+1,nofseq-last,lookuptype, + discseen and "" or "no ", sweepnode and "" or "not ") end -local function handle_contextchain(head,start,dataset,sequence,contexts,rlmode) +-- The next one is quite optimized but still somewhat slow, fonts like ebgaramond +-- are real torture tests because they have many steps with one context (having +-- multiple contexts makes more sense) also because we (can) reduce them. Instead of +-- a match boolean variable and check for that I decided to use a goto with labels +-- instead. This is one of the cases where it makes the code more readable and we +-- might even gain a bit performance. + +-- when we have less replacements (lookups) then current matches we can push too much into +-- the previous disc .. such be it (<before><disc><current=fl><after> with only f done) + +local function handle_contextchain(head,start,dataset,sequence,contexts,rlmode,skiphash) + -- optimizing for rlmode gains nothing local sweepnode = sweepnode local sweeptype = sweeptype + local postreplace + local prereplace + local checkdisc + local discseen -- = false + if sweeptype then + if sweeptype == "replace" then + postreplace = true + prereplace = true + else + postreplace = sweeptype == "post" + prereplace = sweeptype == "pre" + end + checkdisc = getprev(head) + end local currentfont = currentfont - local diskseen = false - local checkdisc = sweeptype and getprev(head) - local flags = sequence.flags or noflags - local done = false - local skipmark = flags[1] - local skipligature = flags[2] - local skipbase = flags[3] - local markclass = sequence.markclass - local skipped = false + + local skipped -- = false + local startprev, startnext = getboth(start) - for k=1,#contexts do -- i've only seen ccmp having > 1 (e.g. dejavu) - local match = true + local done -- = false + + -- we can have multiple hits and as we scan (currently) all we need to check + -- if we have a match ... contextchains have no real coverage table (with + -- unique entries) + + -- fonts can have many steps (each doing one check) or many contexts + + -- todo: make a per-char cache so that we have small contexts (when we have a context + -- n == 1 and otherwise it can be more so we can even distingish n == 1 or more) + + local nofcontexts = contexts.n -- #contexts + + local startchar = nofcontext == 1 or ischar(start,currentfont) -- only needed in a chain + + for k=1,nofcontexts do -- does this disc mess work well with n > 1 + + local ck = contexts[k] + local seq = ck[3] + local f = ck[4] -- first current + if not startchar or not seq[f][startchar] then + -- report("no hit in %a at %i of %i contexts",sequence.type,k,nofcontexts) + goto next + end + local s = seq.n -- or #seq + local l = ck[5] -- last current local current = start local last = start - local ck = contexts[k] - local seq = ck[3] - local s = #seq - local size = 1 - -- f..l = mid string - if s == 1 then - -- this seldom happens as it makes no sense (bril, ebgaramond, husayni, minion) - local char = ischar(current,currentfont) - if char then - if not seq[1][char] then - match = false + + -- current match + + if l > f then + -- before/current/after | before/current | current/after + local discfound -- = nil + local n = f + 1 + last = startnext -- the second in current (first already matched) + while n <= l do + if postreplace and not last then + last = getnext(sweepnode) + sweeptype = nil end - end - else - -- maybe we need a better space check (maybe check for glue or category or combination) - -- we cannot optimize for n=2 because there can be disc nodes - local f = ck[4] - local l = ck[5] - -- current match - size = l - f + 1 - if size > 1 then - -- before/current/after | before/current | current/after - local discfound -- = nil - local n = f + 1 - -- last = getnext(last) -- the second in current (first already matched) - last = startnext -- the second in current (first already matched) - while n <= l do - if not last and (sweeptype == "post" or sweeptype == "replace") then - last = getnext(sweepnode) - sweeptype = nil - end - if last then - local char, id = ischar(last,currentfont) - if char then - local class = classes[char] - if class then - if class == skipmark or class == skipligature or class == skipbase or (markclass and class == "mark" and not markclass[char]) then - skipped = true - if trace_skips then - show_skip(dataset,sequence,char,ck,class) - end - last = getnext(last) - elseif seq[n][char] then - if n < l then - last = getnext(last) - end - n = n + 1 - else - if discfound then - notmatchreplace[discfound] = true - if notmatchpre[discfound] then - match = false - end - else - match = false - end - break - end + if last then + local char, id = ischar(last,currentfont) + if char then + if skiphash and skiphash[char] then + skipped = true + if trace_skips then + show_skip(dataset,sequence,char,ck,classes[char]) + end + last = getnext(last) + elseif seq[n][char] then + if n < l then + last = getnext(last) + end + n = n + 1 + elseif discfound then + notmatchreplace[discfound] = true + if notmatchpre[discfound] then + goto next else - if discfound then - notmatchreplace[discfound] = true - if notmatchpre[discfound] then - match = false - end - else - match = false - end break end - elseif char == false then - if discfound then - notmatchreplace[discfound] = true - if notmatchpre[discfound] then - match = false - end + else + goto next + end + elseif char == false then + if discfound then + notmatchreplace[discfound] = true + if notmatchpre[discfound] then + goto next else - match = false + break end - break - elseif id == disc_code then - diskseen = true - discfound = last - notmatchpre[last] = nil - notmatchpost[last] = true - notmatchreplace[last] = nil - local pre, post, replace = getdisc(last) - if pre then - local n = n - while pre do - if seq[n][getchar(pre)] then - n = n + 1 - pre = getnext(pre) - if n > l then - break - end - else - notmatchpre[last] = true + else + goto next + end + elseif id == disc_code then + -- elseif id == disc_code and (not discs or discs[last]) then + discseen = true + discfound = last + notmatchpre[last] = nil + notmatchpost[last] = true + notmatchreplace[last] = nil + local pre, post, replace = getdisc(last) + if pre then + local n = n + while pre do + if seq[n][getchar(pre)] then + n = n + 1 + if n > l then break end - end - if n <= l then + pre = getnext(pre) + else notmatchpre[last] = true + break end - else - notmatchpre[last] = true end - if replace then - -- so far we never entered this branch - while replace do - if seq[n][getchar(replace)] then - n = n + 1 - replace = getnext(replace) - if n > l then - break - end + -- commented, for Kai to check + -- if n <= l then + -- notmatchpre[last] = true + -- end + else + notmatchpre[last] = true + end + if replace then + -- so far we never entered this branch + while replace do + if seq[n][getchar(replace)] then + n = n + 1 + if n > l then + break + end + replace = getnext(replace) + else + notmatchreplace[last] = true + if notmatchpre[last] then + goto next else - notmatchreplace[last] = true - if notmatchpre[last] then - match = false - end break end end - -- why here again - if notmatchpre[last] then - match = false - end end - -- maybe only if match - last = getnext(last) - else - match = false - break + -- why here again + if notmatchpre[last] then + goto next + end end + -- maybe only if match + last = getnext(last) else - match = false - break + goto next end + else + goto next end end - -- before - if match and f > 1 then - -- local prev = getprev(start) - -- if prev then - if startprev then - local prev = startprev - if prev == checkdisc and (sweeptype == "pre" or sweeptype == "replace") then - prev = getprev(sweepnode) - -- sweeptype = nil - end - if prev then - local discfound -- = nil - local n = f - 1 - while n >= 1 do - if prev then - local char, id = ischar(prev,currentfont) - if char then - local class = classes[char] - if class then - if class == skipmark or class == skipligature or class == skipbase or (markclass and class == "mark" and not markclass[char]) then - skipped = true - if trace_skips then - show_skip(dataset,sequence,char,ck,class) - end - prev = getprev(prev) - elseif seq[n][char] then - if n > 1 then - prev = getprev(prev) - end - n = n - 1 - else - if discfound then - notmatchreplace[discfound] = true - if notmatchpost[discfound] then - match = false - end - else - match = false - end - break - end + end + + -- before + + if f > 1 then + if startprev then + local prev = startprev + if prereplace and prev == checkdisc then + prev = getprev(sweepnode) + end + if prev then + local discfound -- = nil + local n = f - 1 + while n >= 1 do + if prev then + local char, id = ischar(prev,currentfont) + if char then + if skiphash and skiphash[char] then + skipped = true + if trace_skips then + show_skip(dataset,sequence,char,ck,classes[char]) + end + prev = getprev(prev) + elseif seq[n][char] then + if n > 1 then + prev = getprev(prev) + end + n = n - 1 + elseif discfound then + notmatchreplace[discfound] = true + if notmatchpost[discfound] then + goto next else - if discfound then - notmatchreplace[discfound] = true - if notmatchpost[discfound] then - match = false - end - else - match = false - end break end - elseif char == false then - if discfound then - notmatchreplace[discfound] = true - if notmatchpost[discfound] then - match = false - end - else - match = false + else + goto next + end + elseif char == false then + if discfound then + notmatchreplace[discfound] = true + if notmatchpost[discfound] then + goto next end - break - elseif id == disc_code then - -- the special case: f i where i becomes dottless i .. - diskseen = true - discfound = prev - notmatchpre[prev] = true - notmatchpost[prev] = nil - notmatchreplace[prev] = nil - local pre, post, replace, pretail, posttail, replacetail = getdisc(prev,true) - if pre ~= start and post ~= start and replace ~= start then - if post then - local n = n - while posttail do - if seq[n][getchar(posttail)] then - n = n - 1 - if posttail == post then - break - else - posttail = getprev(posttail) - if n < 1 then - break - end - end - else - notmatchpost[prev] = true + else + goto next + end + break + elseif id == disc_code then + -- elseif id == disc_code and (not discs or discs[prev]) then + -- the special case: f i where i becomes dottless i .. + discseen = true + discfound = prev + notmatchpre[prev] = true + notmatchpost[prev] = nil + notmatchreplace[prev] = nil + local pre, post, replace, pretail, posttail, replacetail = getdisc(prev,true) + -- weird test: needs checking + if pre ~= start and post ~= start and replace ~= start then + if post then + local n = n + while posttail do + if seq[n][getchar(posttail)] then + n = n - 1 + if posttail == post or n < 1 then break + else + posttail = getprev(posttail) end - end - if n >= 1 then + else notmatchpost[prev] = true + break end - else + end + if n >= 1 then notmatchpost[prev] = true end - if replace then - -- we seldom enter this branch (e.g. on brill efficient) - while replacetail do - if seq[n][getchar(replacetail)] then - n = n - 1 - if replacetail == replace then - break - else - replacetail = getprev(replacetail) - if n < 1 then - break - end - end + else + notmatchpost[prev] = true + end + if replace then + -- we seldom enter this branch (e.g. on brill efficient) + while replacetail do + if seq[n][getchar(replacetail)] then + n = n - 1 + if replacetail == replace or n < 1 then + break + else + replacetail = getprev(replacetail) + end + else + notmatchreplace[prev] = true + if notmatchpost[prev] then + goto next else - notmatchreplace[prev] = true - if notmatchpost[prev] then - match = false - end break end end - if not match then - break - end end + else + notmatchreplace[prev] = true -- new, for Kai to check end - -- maybe only if match - prev = getprev(prev) - elseif id == glue_code and seq[n][32] and isspace(prev,threshold,id) then + end + prev = getprev(prev) + -- elseif id == glue_code and seq[n][32] and isspace(prev,threshold,id) then + -- elseif seq[n][32] and spaces[prev] then + -- n = n - 1 + -- prev = getprev(prev) + elseif id == glue_code then + local sn = seq[n] + if (sn[32] and spaces[prev]) or sn[0xFFFC] then n = n - 1 prev = getprev(prev) else - match = false - break + goto next end + elseif seq[n][0xFFFC] then + n = n - 1 + prev = getprev(prev) else - match = false - break + goto next end + else + goto next end - else - match = false end else - match = false + goto next end + else + goto next end - -- after - if match and s > l then - local current = last and getnext(last) - if not current and (sweeptype == "post" or sweeptype == "replace") then - current = getnext(sweepnode) - -- sweeptype = nil - end - if current then - local discfound -- = nil - -- removed optimization for s-l == 1, we have to deal with marks anyway - local n = l + 1 - while n <= s do - if current then - local char, id = ischar(current,currentfont) - if char then - local class = classes[char] - if class then - if class == skipmark or class == skipligature or class == skipbase or (markclass and class == "mark" and not markclass[char]) then - skipped = true - if trace_skips then - show_skip(dataset,sequence,char,ck,class) - end - current = getnext(current) -- was absent - elseif seq[n][char] then - if n < s then -- new test - current = getnext(current) -- was absent - end - n = n + 1 - else - if discfound then - notmatchreplace[discfound] = true - if notmatchpre[discfound] then - match = false - end - else - match = false - end - break - end + end + + -- after + + if s > l then + local current = last and getnext(last) + if not current and postreplace then + current = getnext(sweepnode) + end + if current then + local discfound -- = nil + local n = l + 1 + while n <= s do + if current then + local char, id = ischar(current,currentfont) + if char then + if skiphash and skiphash[char] then + skipped = true + if trace_skips then + show_skip(dataset,sequence,char,ck,classes[char]) + end + current = getnext(current) -- was absent + elseif seq[n][char] then + if n < s then -- new test + current = getnext(current) -- was absent + end + n = n + 1 + elseif discfound then + notmatchreplace[discfound] = true + if notmatchpre[discfound] then + goto next else - if discfound then - notmatchreplace[discfound] = true - if notmatchpre[discfound] then - match = false - end - else - match = false - end break end - elseif char == false then - if discfound then - notmatchreplace[discfound] = true - if notmatchpre[discfound] then - match = false - end + else + goto next + end + elseif char == false then + if discfound then + notmatchreplace[discfound] = true + if notmatchpre[discfound] then + goto next else - match = false + break end - break - elseif id == disc_code then - diskseen = true - discfound = current - notmatchpre[current] = nil - notmatchpost[current] = true - notmatchreplace[current] = nil - local pre, post, replace = getdisc(current) - if pre then - local n = n - while pre do - if seq[n][getchar(pre)] then - n = n + 1 - pre = getnext(pre) - if n > s then - break - end - else - notmatchpre[current] = true + else + goto next + end + elseif id == disc_code then + -- elseif id == disc_code and (not discs or discs[current]) then + discseen = true + discfound = current + notmatchpre[current] = nil + notmatchpost[current] = true + notmatchreplace[current] = nil + local pre, post, replace = getdisc(current) + if pre then + local n = n + while pre do + if seq[n][getchar(pre)] then + n = n + 1 + if n > s then break + else + pre = getnext(pre) end - end - if n <= s then + else notmatchpre[current] = true + break end - else + end + if n <= s then notmatchpre[current] = true end - if replace then - -- so far we never entered this branch - while replace do - if seq[n][getchar(replace)] then - n = n + 1 + else + notmatchpre[current] = true + end + if replace then + -- so far we never entered this branch + while replace do + if seq[n][getchar(replace)] then + n = n + 1 + if n > s then + break + else replace = getnext(replace) - if n > s then - break - end + end + else + notmatchreplace[current] = true + if notmatchpre[current] then + goto next else - notmatchreplace[current] = true - -- different than others, needs checking if "not" is okay - if not notmatchpre[current] then - match = false - end break end end - if not match then - break - end - else - -- skip 'm end - -- maybe only if match - current = getnext(current) - elseif id == glue_code and seq[n][32] and isspace(current,threshold,id) then + else + notmatchreplace[current] = true -- new, for Kai to check + end + current = getnext(current) + elseif id == glue_code then + local sn = seq[n] + if (sn[32] and spaces[current]) or sn[0xFFFC] then n = n + 1 current = getnext(current) else - match = false - break + goto next end + elseif seq[n][0xFFFC] then + n = n + 1 + current = getnext(current) else - match = false - break + goto next end + else + goto next end - else - match = false end - end - end - if match then - if trace_contexts then - chaintrac(head,start,dataset,sequence,rlmode,ck,skipped) - end - if diskseen or sweepnode then - head, start, done = chaindisk(head,start,dataset,sequence,rlmode,ck,skipped) else - head, start, done = chainrun(head,start,last,dataset,sequence,rlmode,ck,skipped) - end - if done then - break -- out of contexts (new, needs checking) + goto next end end + + if trace_contexts then + chaintrac(head,start,dataset,sequence,rlmode,skipped and skiphash,ck,true,discseen,sweepnode) + end + if discseen or sweepnode then + head, start, done = chaindisk(head,start,dataset,sequence,rlmode,skipped and skiphash,ck) + else + head, start, done = chainrun(head,start,last,dataset,sequence,rlmode,skipped and skiphash,ck) + end + if done then + break + -- else + -- next context + end + ::next:: + -- if trace_chains then + -- chaintrac(head,start,dataset,sequence,rlmode,skipped and skiphash,ck,false,discseen,sweepnode) + -- end end - if diskseen then + if discseen then notmatchpre = { } notmatchpost = { } notmatchreplace = { } @@ -2833,13 +2814,19 @@ handlers.gpos_context = handle_contextchain -- this needs testing -local function chained_contextchain(head,start,stop,dataset,sequence,currentlookup,rlmode) +local function chained_contextchain(head,start,stop,dataset,sequence,currentlookup,rlmode,skiphash) local steps = currentlookup.steps local nofsteps = currentlookup.nofsteps if nofsteps > 1 then reportmoresteps(dataset,sequence) end - return handle_contextchain(head,start,dataset,sequence,currentlookup,rlmode) + -- probably wrong + local l = steps[1].coverage[getchar(start)] + if l then + return handle_contextchain(head,start,dataset,sequence,l,rlmode,skiphash) + else + return head, start, false + end end chainprocs.gsub_context = chained_contextchain @@ -2848,16 +2835,18 @@ chainprocs.gsub_reversecontextchain = chained_contextchain chainprocs.gpos_contextchain = chained_contextchain chainprocs.gpos_context = chained_contextchain +------------------------------ + -- experiment (needs no handler in font-otc so not now): -- -- function otf.registerchainproc(name,f) -- -- chainprocs[name] = f --- chainprocs[name] = function(head,start,stop,dataset,sequence,currentlookup,rlmode) +-- chainprocs[name] = function(head,start,stop,dataset,sequence,currentlookup,rlmode,skiphash) -- local done = currentlookup.nofsteps > 0 -- if not done then -- reportzerosteps(dataset,sequence) -- else --- head, start, done = f(head,start,stop,dataset,sequence,currentlookup,rlmode) +-- head, start, done = f(head,start,stop,dataset,sequence,currentlookup,rlmode,skiphash) -- if not head or not start then -- reportbadsteps(dataset,sequence) -- end @@ -2866,28 +2855,20 @@ chainprocs.gpos_context = chained_contextchain -- end -- end -local missing = setmetatableindex("table") +local missing = setmetatableindex("table") +local logwarning = report_process +local resolved = { } -- we only resolve a font,script,language pair once local function logprocess(...) if trace_steps then registermessage(...) + if trace_steps == "silent" then + return + end end report_process(...) end -local logwarning = report_process - -local function report_missing_coverage(dataset,sequence) - local t = missing[currentfont] - if not t[sequence] then - t[sequence] = true - logwarning("missing coverage for feature %a, lookup %a, type %a, font %a, name %a", - dataset[4],sequence.name,sequence.type,currentfont,tfmdata.properties.fullname) - end -end - -local resolved = { } -- we only resolve a font,script,language pair once - -- todo: pass all these 'locals' in a table local sequencelists = setmetatableindex(function(t,font) @@ -3038,14 +3019,12 @@ local function kernrun(disc,k_run,font,attr,...) done = true end if prev then - local nest = getprev(pre) setlink(prev,pre) if k_run(prevmarks,"preinjections",pre,font,attr,...) then -- or prev? done = true end - setprev(pre,nest) --- setprev(pre) - setnext(prev,disc) + setprev(pre) + setlink(prev,disc) end end -- @@ -3059,7 +3038,7 @@ local function kernrun(disc,k_run,font,attr,...) done = true end setnext(posttail) - setprev(next,disc) + setlink(disc,next) end end -- @@ -3068,14 +3047,12 @@ local function kernrun(disc,k_run,font,attr,...) done = true end if prev then - local nest = getprev(replace) setlink(prev,replace) if k_run(prevmarks,"replaceinjections",replace,font,attr,...) then -- getnext(replace)) done = true end - setprev(replace,nest) - -- setprev(replace) - setnext(prev,disc) + setprev(replace) + setlink(prev,disc) end if next then setlink(replacetail,next) @@ -3083,7 +3060,7 @@ local function kernrun(disc,k_run,font,attr,...) done = true end setnext(replacetail) - setprev(next,disc) + setlink(disc,next) end elseif prev and next then setlink(prev,next) @@ -3092,6 +3069,9 @@ local function kernrun(disc,k_run,font,attr,...) end setlink(prev,disc,next) end + if done and trace_testruns then + report_disc("done",disc) + end return nextstart, done end @@ -3108,7 +3088,7 @@ local function comprun(disc,c_run,...) -- vararg faster than the whole list -- if pre then sweepnode = disc - sweeptype = "pre" -- in alternative code preinjections is uc_c_sed (also used then for properties, saves a variable) + sweeptype = "pre" -- in alternative code preinjections is used (also used then for properties, saves a variable) local new, done = c_run(pre,...) if done then pre = new @@ -3139,88 +3119,17 @@ local function comprun(disc,c_run,...) -- vararg faster than the whole list sweepnode = nil sweeptype = nil if renewed then + if trace_testruns then + report_disc("done",disc) + end setdisc(disc,pre,post,replace) end -- return getnext(disc), renewed end --- local function testrun(disc,t_run,c_run,...) --- if trace_testruns then --- report_disc("test",disc) --- end --- local prev, next = getboth(disc) --- if not next then --- -- weird discretionary --- return --- end --- local pre, post, replace, pretail, posttail, replacetail = getdisc(disc,true) --- local done = false --- if replace and prev then --- -- this is a bit strange as we only do replace here and not post --- -- anyway, we only look ahead ... the idea is that we discard a --- -- disc when there is a ligature crossing the replace boundary --- setlink(replacetail,next) --- local ok, overflow = t_run(replace,next,...) --- if ok and overflow then --- -- so, we can have crossed the boundary --- setfield(disc,"replace") --- setlink(prev,replace) --- -- setlink(replacetail,next) --- setboth(disc) --- flush_node_list(disc) --- return replace, true -- restart .. tricky ! --- else --- -- we stay inside the disc --- setnext(replacetail) --- setprev(next,disc) --- end --- -- pre, post, replace, pretail, posttail, replacetail = getdisc(disc,true) --- end --- -- --- -- like comprun --- -- --- local renewed = false --- -- --- if pre then --- sweepnode = disc --- sweeptype = "pre" --- local new, ok = c_run(pre,...) --- if ok then --- pre = new --- renewed = true --- end --- end --- -- --- if post then --- sweepnode = disc --- sweeptype = "post" --- local new, ok = c_run(post,...) --- if ok then --- post = new --- renewed = true --- end --- end --- -- --- if replace then --- sweepnode = disc --- sweeptype = "replace" --- local new, ok = c_run(replace,...) --- if ok then --- replace = new --- renewed = true --- end --- end --- -- --- sweepnode = nil --- sweeptype = nil --- if renewed then --- setdisc(disc,pre,post,replace) --- return next, true --- else --- return next, done --- end --- end +-- if we can hyphenate in a lig then unlikely a lig so we +-- could have a option here to ignore lig local function testrun(disc,t_run,c_run,...) if trace_testruns then @@ -3232,7 +3141,7 @@ local function testrun(disc,t_run,c_run,...) return end local pre, post, replace, pretail, posttail, replacetail = getdisc(disc,true) - local done = false + local renewed = false if (post or replace) and prev then if post then setlink(posttail,next) @@ -3246,19 +3155,23 @@ local function testrun(disc,t_run,c_run,...) end local d_post = t_run(post,next,...) local d_replace = t_run(replace,next,...) - if (d_post and d_post > 0) or (d_replace and d_replace > 0) then - local d = d_replace or d_post - if d_post and d < d_post then - d = d_post - end - local head, tail = getnext(disc), disc + if d_post > 0 or d_replace > 0 then + local d = d_replace > d_post and d_replace or d_post + local head = getnext(disc) -- is: next + local tail = head for i=1,d do - tail = getnext(tail) - if getid(tail) == disc_code then - head, tail = flattendisk(head,tail) + local nx = getnext(tail) + local id = getid(nx) + if id == disc_code then + head, tail = flattendisk(head,nx) + elseif id == glyph_code then + tail = nx + else + -- we can have overrun into a glue + break end end - local next = getnext(tail) + next = getnext(tail) setnext(tail) setprev(head) local new = copy_node_list(head) @@ -3272,7 +3185,6 @@ local function testrun(disc,t_run,c_run,...) else replace = new end - setlink(disc,next) else -- we stay inside the disc if posttail then @@ -3280,20 +3192,21 @@ local function testrun(disc,t_run,c_run,...) else post = nil end - setnext(replacetail) if replacetail then setnext(replacetail) else replace = nil end - setprev(next,disc) end + setlink(disc,next) -- pre, post, replace, pretail, posttail, replacetail = getdisc(disc,true) end -- -- like comprun -- - local renewed = false + if trace_testruns then + report_disc("more",disc) + end -- if pre then sweepnode = disc @@ -3329,10 +3242,12 @@ local function testrun(disc,t_run,c_run,...) sweeptype = nil if renewed then setdisc(disc,pre,post,replace) - return next, true - else - return next, done + if trace_testruns then + report_disc("done",disc) + end end + -- next can have changed (copied list) + return getnext(disc), renewed end -- We can make some assumptions with respect to discretionaries. First of all it is very @@ -3360,20 +3275,20 @@ end -- 1{2{\oldstyle\discretionary{3}{4}{5}}6}7\par -- 1{2\discretionary{3{\oldstyle3}}{{\oldstyle4}4}{5{\oldstyle5}5}6}7\par - local nesting = 0 -local function c_run_single(head,font,attr,lookupcache,step,dataset,sequence,rlmode,handler) +local function c_run_single(head,font,attr,lookupcache,step,dataset,sequence,rlmode,skiphash,handler) local done = false local sweep = sweephead[head] if sweep then start = sweep - sweephead[head] = nil + -- sweephead[head] = nil + sweephead[head] = false else start = head end while start do - local char = ischar(start,font) + local char, id = ischar(start,font) if char then local a -- happens often so no assignment is faster if attr then @@ -3383,7 +3298,7 @@ local function c_run_single(head,font,attr,lookupcache,step,dataset,sequence,rlm local lookupmatch = lookupcache[char] if lookupmatch then local ok - head, start, ok = handler(head,start,dataset,sequence,lookupmatch,rlmode,step,1) + head, start, ok = handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step) if ok then done = true end @@ -3408,49 +3323,7 @@ local function c_run_single(head,font,attr,lookupcache,step,dataset,sequence,rlm return head, done end --- local function t_run_single(start,stop,font,attr,lookupcache) --- while start ~= stop do --- local char = ischar(start,font) --- if char then --- local a -- happens often so no assignment is faster --- if attr then --- a = getattr(start,0) --- end --- local startnext = getnext(start) --- if not a or (a == attr) then --- local lookupmatch = lookupcache[char] --- if lookupmatch then -- hm, hyphens can match (tlig) so we need to really check --- -- if we need more than ligatures we can outline the code and use functions --- local s = startnext --- local l = nil --- local d = 0 --- while s do --- if s == stop then --- d = 1 --- elseif d > 0 then --- d = d + 1 --- end --- local lg = lookupmatch[getchar(s)] --- if lg then --- l = lg --- s = getnext(s) --- else --- break --- end --- end --- if l and l.ligature then --- return true, d > 1 --- end --- end --- else --- -- go on can be a mixed one --- end --- start = starttnext --- else --- break --- end --- end --- end +-- only replace? local function t_run_single(start,stop,font,attr,lookupcache) local lastd = nil @@ -3473,6 +3346,8 @@ local function t_run_single(start,stop,font,attr,lookupcache) s = ss ss = nil end + -- a bit weird: why multiple ... anyway we can't have a disc in a disc + -- how about post ... we can probably merge this into the while while getid(s) == disc_code do ss = getnext(s) s = getfield(s,"replace") @@ -3484,38 +3359,48 @@ local function t_run_single(start,stop,font,attr,lookupcache) local l = nil local d = 0 while s do - local lg = lookupmatch[getchar(s)] - if lg then - if sstop then - d = 1 - elseif d > 0 then - d = d + 1 - end - l = lg - s = getnext(s) - sstop = s == stop - if not s then - s = ss - ss = nil - end - while getid(s) == disc_code do - ss = getnext(s) - s = getfield(s,"replace") + local char = ischar(s,font) + if char then + local lg = lookupmatch[char] + if lg then + if sstop then + d = 1 + elseif d > 0 then + d = d + 1 + end + l = lg + s = getnext(s) + sstop = s == stop if not s then s = ss ss = nil end + while getid(s) == disc_code do + ss = getnext(s) + s = getfield(s,"replace") + if not s then + s = ss + ss = nil + end + end + else + break end else break end end - if l and l.ligature then + if l and l.ligature then -- so we test for ligature lastd = d end +-- why not: if not l then break elseif l.ligature then return d end + else +-- why not: break + -- no match (yet) end else -- go on can be a mixed one +-- why not: break end if lastd then return lastd @@ -3525,9 +3410,10 @@ local function t_run_single(start,stop,font,attr,lookupcache) break end end + return 0 end -local function k_run_single(sub,injection,last,font,attr,lookupcache,step,dataset,sequence,rlmode,handler) +local function k_run_single(sub,injection,last,font,attr,lookupcache,step,dataset,sequence,rlmode,skiphash,handler) local a -- happens often so no assignment is faster if attr then a = getattr(sub,0) @@ -3541,7 +3427,7 @@ local function k_run_single(sub,injection,last,font,attr,lookupcache,step,datase if char then local lookupmatch = lookupcache[char] if lookupmatch then - local h, d, ok = handler(sub,n,dataset,sequence,lookupmatch,rlmode,step,1,injection) + local h, d, ok = handler(sub,n,dataset,sequence,lookupmatch,rlmode,skiphash,step,injection) if ok then return true end @@ -3551,12 +3437,13 @@ local function k_run_single(sub,injection,last,font,attr,lookupcache,step,datase end end -local function c_run_multiple(head,font,attr,steps,nofsteps,dataset,sequence,rlmode,handler) +local function c_run_multiple(head,font,attr,steps,nofsteps,dataset,sequence,rlmode,skiphash,handler) local done = false local sweep = sweephead[head] if sweep then start = sweep - sweephead[head] = nil + -- sweephead[head] = nil + sweephead[head] = false else start = head end @@ -3571,22 +3458,18 @@ local function c_run_multiple(head,font,attr,steps,nofsteps,dataset,sequence,rlm for i=1,nofsteps do local step = steps[i] local lookupcache = step.coverage - if lookupcache then - local lookupmatch = lookupcache[char] - if lookupmatch then - -- we could move all code inline but that makes things even more unreadable - local ok - head, start, ok = handler(head,start,dataset,sequence,lookupmatch,rlmode,step,i) - if ok then - done = true - break - elseif not start then - -- don't ask why ... shouldn't happen - break - end + local lookupmatch = lookupcache[char] + if lookupmatch then + -- we could move all code inline but that makes things even more unreadable + local ok + head, start, ok = handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step) + if ok then + done = true + break + elseif not start then + -- don't ask why ... shouldn't happen + break end - else - report_missing_coverage(dataset,sequence) end end if start then @@ -3610,58 +3493,6 @@ local function c_run_multiple(head,font,attr,steps,nofsteps,dataset,sequence,rlm return head, done end --- local function t_run_multiple(start,stop,font,attr,steps,nofsteps) --- while start ~= stop do --- local char = ischar(start,font) --- if char then --- local a -- happens often so no assignment is faster --- if attr then --- a = getattr(start,0) --- end --- local startnext = getnext(start) --- if not a or (a == attr) then --- for i=1,nofsteps do --- local step = steps[i] --- local lookupcache = step.coverage --- if lookupcache then --- local lookupmatch = lookupcache[char] --- if lookupmatch then --- -- if we need more than ligatures we can outline the code and use functions --- local s = startnext --- local l = nil --- local d = 0 --- while s do --- if s == stop then --- d = 1 --- elseif d > 0 then --- d = d + 1 --- end --- local lg = lookupmatch[getchar(s)] --- if lg then --- l = lg --- s = getnext(s) --- else --- break --- end --- end --- if l and l.ligature then --- return true, d > 1 --- end --- end --- else --- report_missing_coverage(dataset,sequence) --- end --- end --- else --- -- go on can be a mixed one --- end --- start = startnext --- else --- break --- end --- end --- end - local function t_run_multiple(start,stop,font,attr,steps,nofsteps) local lastd = nil while start ~= stop do @@ -3676,29 +3507,30 @@ local function t_run_multiple(start,stop,font,attr,steps,nofsteps) for i=1,nofsteps do local step = steps[i] local lookupcache = step.coverage - if lookupcache then - local lookupmatch = lookupcache[char] - if lookupmatch then - -- if we need more than ligatures we can outline the code and use functions - local s = startnext - local ss = nil - local sstop = s == stop + local lookupmatch = lookupcache[char] + if lookupmatch then + -- if we need more than ligatures we can outline the code and use functions + local s = startnext + local ss = nil + local sstop = s == stop + if not s then + s = ss + ss = nil + end + while getid(s) == disc_code do + ss = getnext(s) + s = getfield(s,"replace") if not s then s = ss ss = nil end - while getid(s) == disc_code do - ss = getnext(s) - s = getfield(s,"replace") - if not s then - s = ss - ss = nil - end - end - local l = nil - local d = 0 - while s do - local lg = lookupmatch[getchar(s)] + end + local l = nil + local d = 0 + while s do + local char = ischar(s) + if char then + local lg = lookupmatch[char] if lg then if sstop then d = 1 @@ -3723,13 +3555,13 @@ local function t_run_multiple(start,stop,font,attr,steps,nofsteps) else break end - end - if l and l.ligature then - lastd = d + else + break end end - else - report_missing_coverage(dataset,sequence) + if l and l.ligature then + lastd = d + end end end else @@ -3743,9 +3575,10 @@ local function t_run_multiple(start,stop,font,attr,steps,nofsteps) break end end + return 0 end -local function k_run_multiple(sub,injection,last,font,attr,steps,nofsteps,dataset,sequence,rlmode,handler) +local function k_run_multiple(sub,injection,last,font,attr,steps,nofsteps,dataset,sequence,rlmode,skiphash,handler) local a -- happens often so no assignment is faster if attr then a = getattr(sub,0) @@ -3760,16 +3593,12 @@ local function k_run_multiple(sub,injection,last,font,attr,steps,nofsteps,datase for i=1,nofsteps do local step = steps[i] local lookupcache = step.coverage - if lookupcache then - local lookupmatch = lookupcache[char] - if lookupmatch then - local h, d, ok = handler(head,n,dataset,sequence,lookupmatch,step,rlmode,i,injection) - if ok then - return true - end + local lookupmatch = lookupcache[char] + if lookupmatch then + local h, d, ok = handler(sub,n,dataset,sequence,lookupmatch,rlmode,skiphash,step,injection) -- sub was head + if ok then + return true end - else - report_missing_coverage(dataset,sequence) end end end @@ -3780,44 +3609,127 @@ end -- to be checked, nowadays we probably can assume properly matched directions -- so maybe we no longer need a stack +-- local function txtdirstate(start,stack,top,rlparmode) +-- local dir = getdir(start) +-- local new = 1 +-- if dir == "+TRT" then +-- top = top + 1 +-- stack[top] = dir +-- new = -1 +-- elseif dir == "+TLT" then +-- top = top + 1 +-- stack[top] = dir +-- elseif dir == "-TRT" or dir == "-TLT" then +-- if top == 1 then +-- top = 0 +-- new = rlparmode +-- else +-- top = top - 1 +-- if stack[top] == "+TRT" then +-- new = -1 +-- end +-- end +-- else +-- new = rlparmode +-- end +-- return getnext(start), top, new +-- end +-- +-- local function pardirstate(start) +-- local dir = getdir(start) +-- local new = 0 +-- if dir == "TLT" then +-- new = 1 +-- elseif dir == "TRT" then +-- new = -1 +-- end +-- return getnext(start), new, new +-- end + local function txtdirstate(start,stack,top,rlparmode) + local nxt = getnext(start) local dir = getdir(start) - local new = 1 if dir == "+TRT" then top = top + 1 stack[top] = dir - new = -1 + return nxt, top, -1 elseif dir == "+TLT" then top = top + 1 stack[top] = dir + return nxt, top, 1 elseif dir == "-TRT" or dir == "-TLT" then - top = top - 1 - if stack[top] == "+TRT" then - new = -1 + if top == 1 then + return nxt, 0, rlparmode + else + top = top - 1 + if stack[top] == "+TRT" then + return nxt, top, -1 + else + return nxt, top, 1 + end end else - new = rlparmode + return nxt, top, rlparmode end - if trace_directions then - report_process("directions after txtdir %a: parmode %a, txtmode %a, level %a",dir,mref(rlparmode),mref(new),top) - end - return getnext(start), top, new end local function pardirstate(start) + local nxt = getnext(start) local dir = getdir(start) - local new = 0 if dir == "TLT" then - new = 1 + return nxt, 1, 1 elseif dir == "TRT" then - new = -1 - end - if trace_directions then - report_process("directions after pardir %a: parmode %a",dir,mref(new)) + return nxt, -1, -1 + else + return nxt, 0, 0 end - return getnext(start), new, new end +-- -- this will become: +-- +-- local getdirection = nuts.getdirection +-- +-- local function txtdirstate1(start,stack,top,rlparmode) +-- local nxt = getnext(start) +-- local dir, sub = getdirection(start) +-- if sub then +-- if top == 1 then +-- return nxt, 0, rlparmode +-- elseif dir < 2 then +-- top = top - 1 +-- if stack[top] == 1 then +-- return nxt, top, -1 +-- else +-- return nxt, top, 1 +-- end +-- else +-- return nxt, top, rlparmode +-- end +-- elseif dir == 1 then +-- top = top + 1 +-- stack[top] = 1 +-- return nxt, top, -1 +-- elseif dir == 0 then +-- top = top + 1 +-- stack[top] = 0 +-- return nxt, top, 1 +-- else +-- return nxt, top, rlparmode +-- end +-- end +-- +-- local function pardirstate1(start) +-- local nxt = getnext(start) +-- local dir = getdirection(start) +-- if dir == 0 then +-- return nxt, 1, 1 +-- elseif dir == 1 then +-- return nxt, -1, -1 +-- else +-- return nxt, 0, 0 +-- end +-- end + otf.helpers = otf.helpers or { } otf.helpers.txtdirstate = txtdirstate otf.helpers.pardirstate = pardirstate @@ -3830,182 +3742,245 @@ otf.helpers.pardirstate = pardirstate -- optimizations the principles of processing the features hasn't changed much since -- the beginning. -local function featuresprocessor(head,font,attr,direction) - - local sequences = sequencelists[font] -- temp hack +do - if not sequencelists then - return head, false - end - - nesting = nesting + 1 - - if nesting == 1 then - currentfont = font - tfmdata = fontdata[font] - descriptions = tfmdata.descriptions -- only needed in gref so we could pass node there instead - characters = tfmdata.characters -- but this branch is not entered that often anyway - local resources = tfmdata.resources - marks = resources.marks - classes = resources.classes - threshold, - factor = getthreshold(font) - checkmarks = tfmdata.properties.checkmarks + -- reference: + -- + -- local a = attr and getattr(start,0) + -- if a then + -- a = (a == attr) and (not attribute or getprop(start,a_state) == attribute) + -- else + -- a = not attribute or getprop(start,a_state) == attribute + -- end + -- + -- used: + -- + -- local a -- happens often so no assignment is faster + -- if attr then + -- if getattr(start,0) == attr and (not attribute or getprop(start,a_state) == attribute) then + -- a = true + -- end + -- elseif not attribute or getprop(start,a_state) == attribute then + -- a = true + -- end + + -- This is a measurable experimental speedup (only with hyphenated text and multiple + -- fonts per processor call), especially for fonts with lots of contextual lookups. + + local fastdisc = true + local testdics = false + + directives.register("otf.fastdisc",function(v) fastdisc = v end) -- normally enabled + + -- using a merged combined hash as first test saves some 30% on ebgaramond and + -- about 15% on arabtype .. then moving the a test also saves a bit (even when + -- often a is not set at all so that one is a bit debatable + + local otfdataset = nil -- todo: make an installer + + local getfastdisc = { __index = function(t,k) + local v = usesfont(k,currentfont) + t[k] = v + return v + end } + + local getfastspace = { __index = function(t,k) + -- we don't pass the id so that one can overload isspace + local v = isspace(k,threshold) or false + t[k] = v + return v + end } + + function otf.featuresprocessor(head,font,attr,direction,n) + + local sequences = sequencelists[font] -- temp hack + + nesting = nesting + 1 + + if nesting == 1 then + currentfont = font + tfmdata = fontdata[font] + descriptions = tfmdata.descriptions -- only needed in gref so we could pass node there instead + characters = tfmdata.characters -- but this branch is not entered that often anyway + local resources = tfmdata.resources + marks = resources.marks + classes = resources.classes + threshold, + factor = getthreshold(font) + checkmarks = tfmdata.properties.checkmarks + + if not otfdataset then + otfdataset = otf.dataset + end - elseif currentfont ~= font then + discs = fastdisc and n and n > 1 and setmetatable({},getfastdisc) -- maybe inline + spaces = setmetatable({},getfastspace) - report_warning("nested call with a different font, level %s, quitting",nesting) - nesting = nesting - 1 - return head, false + elseif currentfont ~= font then - end + report_warning("nested call with a different font, level %s, quitting",nesting) + nesting = nesting - 1 + return head, false - -- some 10% faster when no dynamics but hardly measureable on real runs .. but: it only - -- works when we have no other dynamics as otherwise the zero run will be applied to the - -- whole stream for which we then need to pass another variable which we won't + end - -- if attr == 0 then - -- attr = false - -- end + -- some 10% faster when no dynamics but hardly measureable on real runs .. but: it only + -- works when we have no other dynamics as otherwise the zero run will be applied to the + -- whole stream for which we then need to pass another variable which we won't - head = tonut(head) + -- if attr == 0 then + -- attr = false + -- end - if trace_steps then - checkstep(head) - end + local head = tonut(head) - local initialrl = direction == "TRT" and -1 or 0 + if trace_steps then + checkstep(head) + end - local done = false - local datasets = otf.dataset(tfmdata,font,attr) - local dirstack = { } -- could move outside function but we can have local runs - sweephead = { } - - -- Keeping track of the headnode is needed for devanagari. (I generalized it a bit - -- so that multiple cases are also covered.) We could prepend a temp node. - - -- We don't goto the next node when a disc node is created so that we can then treat - -- the pre, post and replace. It's a bit of a hack but works out ok for most cases. - - for s=1,#datasets do - local dataset = datasets[s] - ----- featurevalue = dataset[1] -- todo: pass to function instead of using a global - local attribute = dataset[2] - local sequence = dataset[3] -- sequences[s] -- also dataset[5] - local rlparmode = initialrl - local topstack = 0 - local typ = sequence.type - local gpossing = typ == "gpos_single" or typ == "gpos_pair" -- store in dataset - local handler = handlers[typ] - local steps = sequence.steps - local nofsteps = sequence.nofsteps - if not steps then - -- this permits injection, watch the different arguments - local h, d, ok = handler(head,head,dataset,sequence,nil,nil,nil,0,font,attr) - if ok then - done = true - if h then + local initialrl = direction == "TRT" and -1 or 0 + -- local initialrl = (direction == 1 or direction == "TRT") and -1 or 0 + + local done = false + -- local datasets = otf.dataset(tfmdata,font,attr) + local datasets = otfdataset(tfmdata,font,attr) + local dirstack = { } -- could move outside function but we can have local runs + sweephead = { } + + -- Keeping track of the headnode is needed for devanagari. (I generalized it a bit + -- so that multiple cases are also covered.) We could prepend a temp node. + + -- We don't goto the next node when a disc node is created so that we can then treat + -- the pre, post and replace. It's a bit of a hack but works out ok for most cases. + + for s=1,#datasets do + local dataset = datasets[s] + local attribute = dataset[2] + local sequence = dataset[3] -- sequences[s] -- also dataset[5] + local rlparmode = initialrl + local topstack = 0 + local typ = sequence.type + local gpossing = typ == "gpos_single" or typ == "gpos_pair" -- store in dataset + local forcetestrun = typ == "gsub_ligature" -- testrun is only for ligatures + local handler = handlers[typ] -- store in dataset + local steps = sequence.steps + local nofsteps = sequence.nofsteps + local skiphash = sequence.skiphash + + if not steps then + -- This permits injection, watch the different arguments. Watch out, the arguments passed + -- are not frozen as we might extend or change this. Is this used at all apart from some + -- experiments? + local h, ok = handler(head,dataset,sequence,initialrl,font,attr) -- less arguments now + if ok then + done = true + end + if h and h ~= head then head = h end - end - elseif typ == "gsub_reversecontextchain" then - -- this is a limited case, no special treatments like 'init' etc - local start = find_node_tail(head) - local rlmode = 0 -- how important is this .. do we need to check for dir? - while start do - local char = ischar(start,font) - if char then - local a -- happens often so no assignment is faster - if attr then - a = getattr(start,0) - end - if not a or (a == attr) then - for i=1,nofsteps do - local step = steps[i] - local lookupcache = step.coverage - if lookupcache then - local lookupmatch = lookupcache[char] - if lookupmatch then - -- todo: disc? - local ok - head, start, ok = handler(head,start,dataset,sequence,lookupmatch,rlmode,step,i) - if ok then - done = true - break + elseif typ == "gsub_reversecontextchain" then + -- + -- This might need a check: if we have #before or #after > 0 then we might need to reverse + -- the before and after lists in the loader. But first I need to see a font that uses multiple + -- matches. + -- + local start = find_node_tail(head) + local rlmode = 0 -- how important is this .. do we need to check for dir? + local merged = steps.merged + while start do + local char = ischar(start,font) + if char then + local m = merged[char] + if m then + local a -- happens often so no assignment is faster + if attr then + a = getattr(start,0) + end + if not a or (a == attr) then + for i=m[1],m[2] do + local step = steps[i] + -- for i=1,#m do + -- local step = m[i] + local lookupcache = step.coverage + local lookupmatch = lookupcache[char] + if lookupmatch then + local ok + head, start, ok = handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step) + if ok then + done = true + break + end end end + if start then + start = getprev(start) + end else - report_missing_coverage(dataset,sequence) + start = getprev(start) end - end - if start then + else start = getprev(start) end else start = getprev(start) end - else - start = getprev(start) end - end - else - local start = head - local rlmode = initialrl - if nofsteps == 1 then -- happens often - local step = steps[1] - local lookupcache = step.coverage - if not lookupcache then - report_missing_coverage(dataset,sequence) - else + else + local start = head + local rlmode = initialrl + if nofsteps == 1 then -- happens often + local step = steps[1] + local lookupcache = step.coverage while start do local char, id = ischar(start,font) if char then - -- local a = attr and getattr(start,0) - -- if a then - -- a = (a == attr) and (not attribute or getprop(start,a_state) == attribute) - -- else - -- a = not attribute or getprop(start,a_state) == attribute - -- end - local a -- happens often so no assignment is faster - if attr then - if getattr(start,0) == attr and (not attribute or getprop(start,a_state) == attribute) then - a = true - end - elseif not attribute or getprop(start,a_state) == attribute then - a = true - end - if a then + if skiphash and skiphash[char] then -- we never needed it here but let's try + start = getnext(start) + else local lookupmatch = lookupcache[char] if lookupmatch then - local ok - head, start, ok = handler(head,start,dataset,sequence,lookupmatch,rlmode,step,1) - if ok then - done = true + local a -- happens often so no assignment is faster + if attr then + if getattr(start,0) == attr and (not attribute or getprop(start,a_state) == attribute) then + a = true + end + elseif not attribute or getprop(start,a_state) == attribute then + a = true end + if a then + local ok + head, start, ok = handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step) + if ok then + done = true + end + if start then + start = getnext(start) + end + else + start = getnext(start) + end + else + start = getnext(start) end - if start then - start = getnext(start) - end - else - start = getnext(start) end - elseif char == false then - -- whatever glyph - start = getnext(start) - elseif id == glue_code then - -- happens often - start = getnext(start) + elseif char == false or id == glue_code then + -- a different font|state or glue (happens often) + start = getnext(start) elseif id == disc_code then - local ok - if gpossing then - start, ok = kernrun(start,k_run_single, font,attr,lookupcache,step,dataset,sequence,rlmode,handler) - elseif typ == "gsub_ligature" then - start, ok = testrun(start,t_run_single,c_run_single,font,attr,lookupcache,step,dataset,sequence,rlmode,handler) + if not discs or discs[start] == true then + local ok + if gpossing then + start, ok = kernrun(start,k_run_single, font,attr,lookupcache,step,dataset,sequence,rlmode,skiphash,handler) + elseif forcetestrun then + start, ok = testrun(start,t_run_single,c_run_single,font,attr,lookupcache,step,dataset,sequence,rlmode,skiphash,handler) + else + start, ok = comprun(start,c_run_single, font,attr,lookupcache,step,dataset,sequence,rlmode,skiphash,handler) + end + if ok then + done = true + end else - start, ok = comprun(start,c_run_single, font,attr,lookupcache,step,dataset,sequence,rlmode,handler) - end - if ok then - done = true + start = getnext(start) end elseif id == math_code then start = getnext(end_of_math(start)) @@ -4017,95 +3992,200 @@ local function featuresprocessor(head,font,attr,direction) start = getnext(start) end end - end - - else - while start do - local char, id = ischar(start,font) - if char then - -- local a = attr and getattr(start,0) - -- if a then - -- a = (a == attr) and (not attribute or getprop(start,a_state) == attribute) - -- else - -- a = not attribute or getprop(start,a_state) == attribute - -- end - local a -- happens often so no assignment is faster - if attr then - if getattr(start,0) == attr and (not attribute or getprop(start,a_state) == attribute) then - a = true - end - elseif not attribute or getprop(start,a_state) == attribute then - a = true - end - if a then - for i=1,nofsteps do - local step = steps[i] - local lookupcache = step.coverage - if lookupcache then - local lookupmatch = lookupcache[char] - if lookupmatch then - -- we could move all code inline but that makes things even more unreadable - local ok - head, start, ok = handler(head,start,dataset,sequence,lookupmatch,rlmode,step,i) - if ok then - done = true - break - elseif not start then - -- don't ask why ... shouldn't happen - break + else + local merged = steps.merged + while start do + local char, id = ischar(start,font) + if char then + if skiphash and skiphash[char] then -- we never needed it here but let's try + start = getnext(start) + else + local m = merged[char] + if m then + local a -- happens often so no assignment is faster + if attr then + if getattr(start,0) == attr and (not attribute or getprop(start,a_state) == attribute) then + a = true + end + elseif not attribute or getprop(start,a_state) == attribute then + a = true + end + if a then + for i=m[1],m[2] do + local step = steps[i] + -- for i=1,#m do + -- local step = m[i] + local lookupcache = step.coverage + local lookupmatch = lookupcache[char] + if lookupmatch then + -- we could move all code inline but that makes things even more unreadable + local ok + head, start, ok = handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step) + if ok then + done = true + break + elseif not start then + -- don't ask why ... shouldn't happen + break + end + end + end + if start then + start = getnext(start) end + else + start = getnext(start) end else - report_missing_coverage(dataset,sequence) + start = getnext(start) end end - if start then + elseif char == false or id == glue_code then + -- a different font|state or glue (happens often) + start = getnext(start) + elseif id == disc_code then + if not discs or discs[start] == true then + local ok + if gpossing then + start, ok = kernrun(start,k_run_multiple, font,attr,steps,nofsteps,dataset,sequence,rlmode,skiphash,handler) + elseif forcetestrun then + start, ok = testrun(start,t_run_multiple,c_run_multiple,font,attr,steps,nofsteps,dataset,sequence,rlmode,skiphash,handler) + else + start, ok = comprun(start,c_run_multiple, font,attr,steps,nofsteps,dataset,sequence,rlmode,skiphash,handler) + end + if ok then + done = true + end + else start = getnext(start) end + elseif id == math_code then + start = getnext(end_of_math(start)) + elseif id == dir_code then + start, topstack, rlmode = txtdirstate(start,dirstack,topstack,rlparmode) + elseif id == localpar_code then + start, rlparmode, rlmode = pardirstate(start) else start = getnext(start) end - elseif char == false then - -- whatever glyph - start = getnext(start) - elseif id == glue_code then - -- happens often + end + end + end + + if trace_steps then -- ? + registerstep(head) + end + + end + + nesting = nesting - 1 + head = tonode(head) + + return head, done + end + + -- This is not an official helpoer and used for tracing experiments. It can be changed as I like + -- at any moment. At some point it might be used in a module that can help font development. + + function otf.datasetpositionprocessor(head,font,direction,dataset) + + currentfont = font + tfmdata = fontdata[font] + descriptions = tfmdata.descriptions -- only needed in gref so we could pass node there instead + characters = tfmdata.characters -- but this branch is not entered that often anyway + local resources = tfmdata.resources + marks = resources.marks + classes = resources.classes + threshold, + factor = getthreshold(font) + checkmarks = tfmdata.properties.checkmarks + + if type(dataset) == "number" then + dataset = otfdataset(tfmdata,font,0)[dataset] + end + + local sequence = dataset[3] -- sequences[s] -- also dataset[5] + local typ = sequence.type + -- local gpossing = typ == "gpos_single" or typ == "gpos_pair" -- store in dataset + + -- gpos_contextchain gpos_context + + -- if not gpossing then + -- return head, false + -- end + + local handler = handlers[typ] -- store in dataset + local steps = sequence.steps + local nofsteps = sequence.nofsteps + + local head = tonut(head) + local done = false + local dirstack = { } -- could move outside function but we can have local runs + local start = head + local initialrl = direction == "TRT" and -1 or 0 + -- local initialrl = (direction == 1 or direction == "TRT") and -1 or 0 + local rlmode = initialrl + local rlparmode = initialrl + local topstack = 0 + local merged = steps.merged + + -- local matches = false + local position = 0 + + while start do + local char, id = ischar(start,font) + if char then + position = position + 1 + local m = merged[char] + if m then + if skiphash and skiphash[char] then -- we never needed it here but let's try start = getnext(start) - elseif id == disc_code then - local ok - if gpossing then - start, ok = kernrun(start,k_run_multiple, font,attr,steps,nofsteps,dataset,sequence,rlmode,handler) - elseif typ == "gsub_ligature" then - start, ok = testrun(start,t_run_multiple,c_run_multiple,font,attr,steps,nofsteps,dataset,sequence,rlmode,handler) - else - start, ok = comprun(start,c_run_multiple, font,attr,steps,nofsteps,dataset,sequence,rlmode,handler) + else + for i=m[1],m[2] do + local step = steps[i] + local lookupcache = step.coverage + local lookupmatch = lookupcache[char] + if lookupmatch then + local ok + head, start, ok = handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step) + if ok then + -- if matches then + -- matches[position] = i + -- else + -- matches = { [position] = i } + -- end + break + elseif not start then + break + end + end end - if ok then - done = true + if start then + start = getnext(start) end - elseif id == math_code then - start = getnext(end_of_math(start)) - elseif id == dir_code then - start, topstack, rlmode = txtdirstate(start,dirstack,topstack,rlparmode) - elseif id == localpar_code then - start, rlparmode, rlmode = pardirstate(start) - else - start = getnext(start) end + else + start = getnext(start) end + elseif char == false or id == glue_code then + -- a different font|state or glue (happens often) + start = getnext(start) + elseif id == math_code then + start = getnext(end_of_math(start)) + elseif id == dir_code then + start, topstack, rlmode = txtdirstate(start,dirstack,topstack,rlparmode) + elseif id == localpar_code then + start, rlparmode, rlmode = pardirstate(start) + else + start = getnext(start) end end - if trace_steps then -- ? - registerstep(head) - end - + return tonode(head) -- , matches end - nesting = nesting - 1 - head = tonode(head) + -- end of experiment - return head, done end -- so far @@ -4119,26 +4199,26 @@ function otf.registerplugin(name,f) end end -local function plugininitializer(tfmdata,value) +function otf.plugininitializer(tfmdata,value) if type(value) == "string" then tfmdata.shared.plugin = plugins[value] end end -local function pluginprocessor(head,font) +function otf.pluginprocessor(head,font,attr,direction) -- n local s = fontdata[font].shared local p = s and s.plugin if p then if trace_plugins then report_process("applying plugin %a",p[1]) end - return p[2](head,font) + return p[2](head,font,attr,direction) else return head, false end end -local function featuresinitializer(tfmdata,value) +function otf.featuresinitializer(tfmdata,value) -- nothing done here any more end @@ -4148,67 +4228,113 @@ registerotffeature { default = true, initializers = { position = 1, - node = featuresinitializer, - plug = plugininitializer, + node = otf.featuresinitializer, + plug = otf.plugininitializer, }, processors = { - node = featuresprocessor, - plug = pluginprocessor, + node = otf.featuresprocessor, + plug = otf.pluginprocessor, } } -otf.nodemodeinitializer = featuresinitializer -otf.featuresprocessor = featuresprocessor - --- This can be used for extra handlers, but should be used with care! - -otf.handlers = handlers -- used in devanagari +-- This can be used for extra handlers, but should be used with care! We implement one +-- here but some more can be found in the osd (script devanagary) file. Now watch out: +-- when a handlers has steps, it is called as the other ones, but when we have no steps, +-- we use a different call: +-- +-- function(head,dataset,sequence,initialrl,font,attr) +-- return head, done +-- end +-- +-- Also see (!!). --- We implement one here: +otf.handlers = handlers local setspacekerns = nodes.injections.setspacekerns if not setspacekerns then os.exit() end +local tag = "kern" -- maybe some day a merge + if fontfeatures then - function otf.handlers.trigger_space_kerns(head,start,dataset,sequence,_,_,_,_,font,attr) + function handlers.trigger_space_kerns(head,dataset,sequence,initialrl,font,attr) local features = fontfeatures[font] - local enabled = features and features.spacekern and features.kern + local enabled = features and features.spacekern and features[tag] if enabled then setspacekerns(font,sequence) end - return head, start, enabled + return head, enabled end else -- generic (no hashes) - function otf.handlers.trigger_space_kerns(head,start,dataset,sequence,_,_,_,_,font,attr) + function handlers.trigger_space_kerns(head,dataset,sequence,initialrl,font,attr) local shared = fontdata[font].shared local features = shared and shared.features - local enabled = features and features.spacekern and features.kern + local enabled = features and features.spacekern and features[tag] if enabled then setspacekerns(font,sequence) end - return head, start, enabled + return head, enabled end end +-- There are fonts out there that change the space but we don't do that kind of +-- things in TeX. + local function hasspacekerns(data) - local sequences = data.resources.sequences - for i=1,#sequences do - local sequence = sequences[i] - local steps = sequence.steps - if steps and sequence.features.kern then - for i=1,#steps do - local coverage = steps[i].coverage - if not coverage then - -- maybe an issue - elseif coverage[32] then - return true - else - for k, v in next, coverage do - if v[32] then - return true + local resources = data.resources + local sequences = resources.sequences + local validgpos = resources.features.gpos + if validgpos and sequences then + for i=1,#sequences do + local sequence = sequences[i] + local steps = sequence.steps + if steps and sequence.features[tag] then + local kind = sequence.type + if kind == "gpos_pair" or kind == "gpos_single" then + for i=1,#steps do + local step = steps[i] + local coverage = step.coverage + local rules = step.rules + if rules then + -- not now: analyze (simple) rules + elseif not coverage then + -- nothing to do + elseif kind == "gpos_single" then + -- maybe a message that we ignore + elseif kind == "gpos_pair" then + local format = step.format + if format == "move" or format == "kern" then + local kerns = coverage[32] + if kerns then + return true + end + for k, v in next, coverage do + if v[32] then + return true + end + end + elseif format == "pair" then + local kerns = coverage[32] + if kerns then + for k, v in next, kerns do + local one = v[1] + if one and one ~= true then + return true + end + end + end + for k, v in next, coverage do + local kern = v[32] + if kern then + local one = kern[1] + if one and one ~= true then + return true + end + end + end + end end end end @@ -4225,112 +4351,120 @@ otf.readers.registerextender { end } --- we merge the lookups but we still honor the language / script - local function spaceinitializer(tfmdata,value) -- attr local resources = tfmdata.resources local spacekerns = resources and resources.spacekerns - local properties = tfmdata.properties if value and spacekerns == nil then + local rawdata = tfmdata.shared and tfmdata.shared.rawdata + local properties = rawdata.properties if properties and properties.hasspacekerns then local sequences = resources.sequences - local left = { } - local right = { } - local last = 0 - local feat = nil - for i=1,#sequences do - local sequence = sequences[i] - local steps = sequence.steps - if steps then - local kern = sequence.features.kern - if kern then - if feat then - for script, languages in next, kern do - local f = feat[script] - if f then - for l in next, languages do - f[l] = true - end - else - feat[script] = languages - end - end - else - feat = kern - end - for i=1,#steps do - local step = steps[i] - local coverage = step.coverage - local rules = step.rules - local format = step.format - if rules then - -- not now: analyze (simple) rules - elseif coverage then - -- what to do if we have no [1] but only [2] - local single = format == gpos_single - local kerns = coverage[32] - if kerns then - for k, v in next, kerns do - if type(v) ~= "table" then - right[k] = v - elseif single then - right[k] = v[3] - else - local one = v[1] - if one then - right[k] = one[3] + local validgpos = resources.features.gpos + if validgpos and sequences then + local left = { } + local right = { } + local last = 0 + local feat = nil + for i=1,#sequences do + local sequence = sequences[i] + local steps = sequence.steps + if steps then + -- we don't support space kerns in other features + local kern = sequence.features[tag] + if kern then + local kind = sequence.type + if kind == "gpos_pair" or kind == "gpos_single" then + if feat then + for script, languages in next, kern do + local f = feat[script] + if f then + for l in next, languages do + f[l] = true end + else + feat[script] = languages end end + else + feat = kern end - for k, v in next, coverage do - local kern = v[32] - if kern then - if type(kern) ~= "table" then - left[k] = kern - elseif single then - left[k] = kern[3] - else - local one = kern[1] - if one then - left[k] = one[3] + for i=1,#steps do + local step = steps[i] + local coverage = step.coverage + local rules = step.rules + if rules then + -- not now: analyze (simple) rules + elseif not coverage then + -- nothng to do + elseif kind == "gpos_single" then + -- makes no sense in TeX + elseif kind == "gpos_pair" then + local format = step.format + if format == "move" or format == "kern" then + local kerns = coverage[32] + if kerns then + for k, v in next, kerns do + right[k] = v + end + end + for k, v in next, coverage do + local kern = v[32] + if kern then + left[k] = kern + end + end + elseif format == "pair" then + local kerns = coverage[32] + if kerns then + for k, v in next, kerns do + local one = v[1] + if one and one ~= true then + right[k] = one[3] + end + end + end + for k, v in next, coverage do + local kern = v[32] + if kern then + local one = kern[1] + if one and one ~= true then + left[k] = one[3] + end + end end end end end + last = i end + else + -- no steps ... needed for old one ... we could use the basekerns + -- instead end - last = i end - else - -- no steps ... needed for old one ... we could use the basekerns - -- instead end - end - left = next(left) and left or false - right = next(right) and right or false - if left or right then - spacekerns = { - left = left, - right = right, - } - if last > 0 then - local triggersequence = { - features = { kern = feat or { dflt = { dflt = true, } } }, - flags = noflags, - name = "trigger_space_kerns", - order = { "kern" }, - type = "trigger_space_kerns", - left = left, - right = right, + left = next(left) and left or false + right = next(right) and right or false + if left or right then + spacekerns = { + left = left, + right = right, } - insert(sequences,last,triggersequence) + if last > 0 then + local triggersequence = { + -- no steps, see (!!) + features = { [tag] = feat or { dflt = { dflt = true, } } }, + flags = noflags, + name = "trigger_space_kerns", + order = { tag }, + type = "trigger_space_kerns", + left = left, + right = right, + } + insert(sequences,last,triggersequence) + end end - else - spacekerns = false end - else - spacekerns = false end resources.spacekerns = spacekerns end diff --git a/tex/context/base/mkiv/font-ott.lua b/tex/context/base/mkiv/font-ott.lua index cba3758dc..59d92f40d 100644 --- a/tex/context/base/mkiv/font-ott.lua +++ b/tex/context/base/mkiv/font-ott.lua @@ -1,6 +1,6 @@ -if not modules then modules = { } end modules ['font-ott'] = { +if not modules then modules = { } end modules ["font-ott"] = { version = 1.001, - comment = "companion to font-otf.lua (tables)", + comment = "companion to font-ini.mkiv", author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", copyright = "PRAGMA ADE / ConTeXt Development Team", license = "see context related readme files", @@ -26,118 +26,118 @@ local statistics = otf.statistics or { } otf.statistics = statistics local scripts = allocate { - ['arab'] = 'arabic', - ['armi'] = 'imperial aramaic', - ['armn'] = 'armenian', - ['avst'] = 'avestan', - ['bali'] = 'balinese', - ['bamu'] = 'bamum', - ['batk'] = 'batak', - ['beng'] = 'bengali', - ['bng2'] = 'bengali variant 2', - ['bopo'] = 'bopomofo', - ['brah'] = 'brahmi', - ['brai'] = 'braille', - ['bugi'] = 'buginese', - ['buhd'] = 'buhid', - ['byzm'] = 'byzantine music', - ['cakm'] = 'chakma', - ['cans'] = 'canadian syllabics', - ['cari'] = 'carian', - ['cham'] = 'cham', - ['cher'] = 'cherokee', - ['copt'] = 'coptic', - ['cprt'] = 'cypriot syllabary', - ['cyrl'] = 'cyrillic', - ['deva'] = 'devanagari', - ['dev2'] = 'devanagari variant 2', - ['dsrt'] = 'deseret', - ['egyp'] = 'egyptian heiroglyphs', - ['ethi'] = 'ethiopic', - ['geor'] = 'georgian', - ['glag'] = 'glagolitic', - ['goth'] = 'gothic', - ['grek'] = 'greek', - ['gujr'] = 'gujarati', - ['gjr2'] = 'gujarati variant 2', - ['guru'] = 'gurmukhi', - ['gur2'] = 'gurmukhi variant 2', - ['hang'] = 'hangul', - ['hani'] = 'cjk ideographic', - ['hano'] = 'hanunoo', - ['hebr'] = 'hebrew', - ['ital'] = 'old italic', - ['jamo'] = 'hangul jamo', - ['java'] = 'javanese', - ['kali'] = 'kayah li', - ['kana'] = 'hiragana and katakana', - ['khar'] = 'kharosthi', - ['khmr'] = 'khmer', - ['knda'] = 'kannada', - ['knd2'] = 'kannada variant 2', - ['kthi'] = 'kaithi', - ['lana'] = 'tai tham', - ['lao' ] = 'lao', - ['latn'] = 'latin', - ['lepc'] = 'lepcha', - ['limb'] = 'limbu', - ['linb'] = 'linear b', - ['lisu'] = 'lisu', - ['lyci'] = 'lycian', - ['lydi'] = 'lydian', - ['mand'] = 'mandaic and mandaean', - ['math'] = 'mathematical alphanumeric symbols', - ['merc'] = 'meroitic cursive', - ['mero'] = 'meroitic hieroglyphs', - ['mlym'] = 'malayalam', - ['mlm2'] = 'malayalam variant 2', - ['mong'] = 'mongolian', - ['mtei'] = 'meitei Mayek', - ['musc'] = 'musical symbols', - ['mym2'] = 'myanmar variant 2', - ['mymr'] = 'myanmar', - ['nko' ] = "n'ko", - ['ogam'] = 'ogham', - ['olck'] = 'ol chiki', - ['orkh'] = 'old turkic and orkhon runic', - ['orya'] = 'oriya', - ['ory2'] = 'odia variant 2', - ['osma'] = 'osmanya', - ['phag'] = 'phags-pa', - ['phli'] = 'inscriptional pahlavi', - ['phnx'] = 'phoenician', - ['prti'] = 'inscriptional parthian', - ['rjng'] = 'rejang', - ['runr'] = 'runic', - ['samr'] = 'samaritan', - ['sarb'] = 'old south arabian', - ['saur'] = 'saurashtra', - ['shaw'] = 'shavian', - ['shrd'] = 'sharada', - ['sinh'] = 'sinhala', - ['sora'] = 'sora sompeng', - ['sund'] = 'sundanese', - ['sylo'] = 'syloti nagri', - ['syrc'] = 'syriac', - ['tagb'] = 'tagbanwa', - ['takr'] = 'takri', - ['tale'] = 'tai le', - ['talu'] = 'tai lu', - ['taml'] = 'tamil', - ['tavt'] = 'tai viet', - ['telu'] = 'telugu', - ['tel2'] = 'telugu variant 2', - ['tfng'] = 'tifinagh', - ['tglg'] = 'tagalog', - ['thaa'] = 'thaana', - ['thai'] = 'thai', - ['tibt'] = 'tibetan', - ['tml2'] = 'tamil variant 2', - ['ugar'] = 'ugaritic cuneiform', - ['vai' ] = 'vai', - ['xpeo'] = 'old persian cuneiform', - ['xsux'] = 'sumero-akkadian cuneiform', - ['yi' ] = 'yi', + ["arab"] = "arabic", + ["armi"] = "imperial aramaic", + ["armn"] = "armenian", + ["avst"] = "avestan", + ["bali"] = "balinese", + ["bamu"] = "bamum", + ["batk"] = "batak", + ["beng"] = "bengali", + ["bng2"] = "bengali variant 2", + ["bopo"] = "bopomofo", + ["brah"] = "brahmi", + ["brai"] = "braille", + ["bugi"] = "buginese", + ["buhd"] = "buhid", + ["byzm"] = "byzantine music", + ["cakm"] = "chakma", + ["cans"] = "canadian syllabics", + ["cari"] = "carian", + ["cham"] = "cham", + ["cher"] = "cherokee", + ["copt"] = "coptic", + ["cprt"] = "cypriot syllabary", + ["cyrl"] = "cyrillic", + ["deva"] = "devanagari", + ["dev2"] = "devanagari variant 2", + ["dsrt"] = "deseret", + ["egyp"] = "egyptian heiroglyphs", + ["ethi"] = "ethiopic", + ["geor"] = "georgian", + ["glag"] = "glagolitic", + ["goth"] = "gothic", + ["grek"] = "greek", + ["gujr"] = "gujarati", + ["gjr2"] = "gujarati variant 2", + ["guru"] = "gurmukhi", + ["gur2"] = "gurmukhi variant 2", + ["hang"] = "hangul", + ["hani"] = "cjk ideographic", + ["hano"] = "hanunoo", + ["hebr"] = "hebrew", + ["ital"] = "old italic", + ["jamo"] = "hangul jamo", + ["java"] = "javanese", + ["kali"] = "kayah li", + ["kana"] = "hiragana and katakana", + ["khar"] = "kharosthi", + ["khmr"] = "khmer", + ["knda"] = "kannada", + ["knd2"] = "kannada variant 2", + ["kthi"] = "kaithi", + ["lana"] = "tai tham", + ["lao" ] = "lao", + ["latn"] = "latin", + ["lepc"] = "lepcha", + ["limb"] = "limbu", + ["linb"] = "linear b", + ["lisu"] = "lisu", + ["lyci"] = "lycian", + ["lydi"] = "lydian", + ["mand"] = "mandaic and mandaean", + ["math"] = "mathematical alphanumeric symbols", + ["merc"] = "meroitic cursive", + ["mero"] = "meroitic hieroglyphs", + ["mlym"] = "malayalam", + ["mlm2"] = "malayalam variant 2", + ["mong"] = "mongolian", + ["mtei"] = "meitei Mayek", + ["musc"] = "musical symbols", + ["mym2"] = "myanmar variant 2", + ["mymr"] = "myanmar", + ["nko" ] = 'n"ko', + ["ogam"] = "ogham", + ["olck"] = "ol chiki", + ["orkh"] = "old turkic and orkhon runic", + ["orya"] = "oriya", + ["ory2"] = "odia variant 2", + ["osma"] = "osmanya", + ["phag"] = "phags-pa", + ["phli"] = "inscriptional pahlavi", + ["phnx"] = "phoenician", + ["prti"] = "inscriptional parthian", + ["rjng"] = "rejang", + ["runr"] = "runic", + ["samr"] = "samaritan", + ["sarb"] = "old south arabian", + ["saur"] = "saurashtra", + ["shaw"] = "shavian", + ["shrd"] = "sharada", + ["sinh"] = "sinhala", + ["sora"] = "sora sompeng", + ["sund"] = "sundanese", + ["sylo"] = "syloti nagri", + ["syrc"] = "syriac", + ["tagb"] = "tagbanwa", + ["takr"] = "takri", + ["tale"] = "tai le", + ["talu"] = "tai lu", + ["taml"] = "tamil", + ["tavt"] = "tai viet", + ["telu"] = "telugu", + ["tel2"] = "telugu variant 2", + ["tfng"] = "tifinagh", + ["tglg"] = "tagalog", + ["thaa"] = "thaana", + ["thai"] = "thai", + ["tibt"] = "tibetan", + ["tml2"] = "tamil variant 2", + ["ugar"] = "ugaritic cuneiform", + ["vai" ] = "vai", + ["xpeo"] = "old persian cuneiform", + ["xsux"] = "sumero-akkadian cuneiform", + ["yi" ] = "yi", } local languages = allocate { @@ -302,7 +302,7 @@ local languages = allocate { ["gez" ] = "ge'ez", ["gih" ] = "githabul", ["gil" ] = "gilyak", - ["gil0"] = " kiribati (gilbertese)", + ["gil0"] = "kiribati (gilbertese)", ["gkp" ] = "kpelle (guinea)", ["glk" ] = "gilaki", ["gmz" ] = "gumuz", @@ -726,165 +726,166 @@ local languages = allocate { } local features = allocate { - ['aalt'] = 'access all alternates', - ['abvf'] = 'above-base forms', - ['abvm'] = 'above-base mark positioning', - ['abvs'] = 'above-base substitutions', - ['afrc'] = 'alternative fractions', - ['akhn'] = 'akhands', - ['blwf'] = 'below-base forms', - ['blwm'] = 'below-base mark positioning', - ['blws'] = 'below-base substitutions', - ['c2pc'] = 'petite capitals from capitals', - ['c2sc'] = 'small capitals from capitals', - ['calt'] = 'contextual alternates', - ['case'] = 'case-sensitive forms', - ['ccmp'] = 'glyph composition/decomposition', - ['cfar'] = 'conjunct form after ro', - ['cjct'] = 'conjunct forms', - ['clig'] = 'contextual ligatures', - ['cpct'] = 'centered cjk punctuation', - ['cpsp'] = 'capital spacing', - ['cswh'] = 'contextual swash', - ['curs'] = 'cursive positioning', - ['dflt'] = 'default processing', - ['dist'] = 'distances', - ['dlig'] = 'discretionary ligatures', - ['dnom'] = 'denominators', - ['dtls'] = 'dotless forms', -- math - ['expt'] = 'expert forms', - ['falt'] = 'final glyph alternates', - ['fin2'] = 'terminal forms #2', - ['fin3'] = 'terminal forms #3', - ['fina'] = 'terminal forms', - ['flac'] = 'flattened accents over capitals', -- math - ['frac'] = 'fractions', - ['fwid'] = 'full width', - ['half'] = 'half forms', - ['haln'] = 'halant forms', - ['halt'] = 'alternate half width', - ['hist'] = 'historical forms', - ['hkna'] = 'horizontal kana alternates', - ['hlig'] = 'historical ligatures', - ['hngl'] = 'hangul', - ['hojo'] = 'hojo kanji forms', - ['hwid'] = 'half width', - ['init'] = 'initial forms', - ['isol'] = 'isolated forms', - ['ital'] = 'italics', - ['jalt'] = 'justification alternatives', - ['jp04'] = 'jis2004 forms', - ['jp78'] = 'jis78 forms', - ['jp83'] = 'jis83 forms', - ['jp90'] = 'jis90 forms', - ['kern'] = 'kerning', - ['lfbd'] = 'left bounds', - ['liga'] = 'standard ligatures', - ['ljmo'] = 'leading jamo forms', - ['lnum'] = 'lining figures', - ['locl'] = 'localized forms', - ['ltra'] = 'left-to-right alternates', - ['ltrm'] = 'left-to-right mirrored forms', - ['mark'] = 'mark positioning', - ['med2'] = 'medial forms #2', - ['medi'] = 'medial forms', - ['mgrk'] = 'mathematical greek', - ['mkmk'] = 'mark to mark positioning', - ['mset'] = 'mark positioning via substitution', - ['nalt'] = 'alternate annotation forms', - ['nlck'] = 'nlc kanji forms', - ['nukt'] = 'nukta forms', - ['numr'] = 'numerators', - ['onum'] = 'old style figures', - ['opbd'] = 'optical bounds', - ['ordn'] = 'ordinals', - ['ornm'] = 'ornaments', - ['palt'] = 'proportional alternate width', - ['pcap'] = 'petite capitals', - ['pkna'] = 'proportional kana', - ['pnum'] = 'proportional figures', - ['pref'] = 'pre-base forms', - ['pres'] = 'pre-base substitutions', - ['pstf'] = 'post-base forms', - ['psts'] = 'post-base substitutions', - ['pwid'] = 'proportional widths', - ['qwid'] = 'quarter widths', - ['rand'] = 'randomize', - ['rclt'] = 'required contextual alternates', - ['rkrf'] = 'rakar forms', - ['rlig'] = 'required ligatures', - ['rphf'] = 'reph form', - ['rtbd'] = 'right bounds', - ['rtla'] = 'right-to-left alternates', - ['rtlm'] = 'right to left math', -- math - ['ruby'] = 'ruby notation forms', - ['salt'] = 'stylistic alternates', - ['sinf'] = 'scientific inferiors', - ['size'] = 'optical size', - ['smcp'] = 'small capitals', - ['smpl'] = 'simplified forms', - -- ['ss01'] = 'stylistic set 1', - -- ['ss02'] = 'stylistic set 2', - -- ['ss03'] = 'stylistic set 3', - -- ['ss04'] = 'stylistic set 4', - -- ['ss05'] = 'stylistic set 5', - -- ['ss06'] = 'stylistic set 6', - -- ['ss07'] = 'stylistic set 7', - -- ['ss08'] = 'stylistic set 8', - -- ['ss09'] = 'stylistic set 9', - -- ['ss10'] = 'stylistic set 10', - -- ['ss11'] = 'stylistic set 11', - -- ['ss12'] = 'stylistic set 12', - -- ['ss13'] = 'stylistic set 13', - -- ['ss14'] = 'stylistic set 14', - -- ['ss15'] = 'stylistic set 15', - -- ['ss16'] = 'stylistic set 16', - -- ['ss17'] = 'stylistic set 17', - -- ['ss18'] = 'stylistic set 18', - -- ['ss19'] = 'stylistic set 19', - -- ['ss20'] = 'stylistic set 20', - ['ssty'] = 'script style', -- math - ['stch'] = 'stretching glyph decomposition', - ['subs'] = 'subscript', - ['sups'] = 'superscript', - ['swsh'] = 'swash', - ['titl'] = 'titling', - ['tjmo'] = 'trailing jamo forms', - ['tnam'] = 'traditional name forms', - ['tnum'] = 'tabular figures', - ['trad'] = 'traditional forms', - ['twid'] = 'third widths', - ['unic'] = 'unicase', - ['valt'] = 'alternate vertical metrics', - ['vatu'] = 'vattu variants', - ['vert'] = 'vertical writing', - ['vhal'] = 'alternate vertical half metrics', - ['vjmo'] = 'vowel jamo forms', - ['vkna'] = 'vertical kana alternates', - ['vkrn'] = 'vertical kerning', - ['vpal'] = 'proportional alternate vertical metrics', - ['vrt2'] = 'vertical rotation', - ['zero'] = 'slashed zero', + ["aalt"] = "access all alternates", + ["abvf"] = "above-base forms", + ["abvm"] = "above-base mark positioning", + ["abvs"] = "above-base substitutions", + ["afrc"] = "alternative fractions", + ["akhn"] = "akhands", + ["blwf"] = "below-base forms", + ["blwm"] = "below-base mark positioning", + ["blws"] = "below-base substitutions", + ["c2pc"] = "petite capitals from capitals", + ["c2sc"] = "small capitals from capitals", + ["calt"] = "contextual alternates", + ["case"] = "case-sensitive forms", + ["ccmp"] = "glyph composition/decomposition", + ["cfar"] = "conjunct form after ro", + ["cjct"] = "conjunct forms", + ["clig"] = "contextual ligatures", + ["cpct"] = "centered cjk punctuation", + ["cpsp"] = "capital spacing", + ["cswh"] = "contextual swash", + ["curs"] = "cursive positioning", + ["dflt"] = "default processing", + ["dist"] = "distances", + ["dlig"] = "discretionary ligatures", + ["dnom"] = "denominators", + ["dtls"] = "dotless forms", -- math + ["expt"] = "expert forms", + ["falt"] = "final glyph alternates", + ["fin2"] = "terminal forms #2", + ["fin3"] = "terminal forms #3", + ["fina"] = "terminal forms", + ["flac"] = "flattened accents over capitals", -- math + ["frac"] = "fractions", + ["fwid"] = "full width", + ["half"] = "half forms", + ["haln"] = "halant forms", + ["halt"] = "alternate half width", + ["hist"] = "historical forms", + ["hkna"] = "horizontal kana alternates", + ["hlig"] = "historical ligatures", + ["hngl"] = "hangul", + ["hojo"] = "hojo kanji forms", + ["hwid"] = "half width", + ["init"] = "initial forms", + ["isol"] = "isolated forms", + ["ital"] = "italics", + ["jalt"] = "justification alternatives", + ["jp04"] = "jis2004 forms", + ["jp78"] = "jis78 forms", + ["jp83"] = "jis83 forms", + ["jp90"] = "jis90 forms", + ["kern"] = "kerning", + ["lfbd"] = "left bounds", + ["liga"] = "standard ligatures", + ["ljmo"] = "leading jamo forms", + ["lnum"] = "lining figures", + ["locl"] = "localized forms", + ["ltra"] = "left-to-right alternates", + ["ltrm"] = "left-to-right mirrored forms", + ["mark"] = "mark positioning", + ["med2"] = "medial forms #2", + ["medi"] = "medial forms", + ["mgrk"] = "mathematical greek", + ["mkmk"] = "mark to mark positioning", + ["mset"] = "mark positioning via substitution", + ["nalt"] = "alternate annotation forms", + ["nlck"] = "nlc kanji forms", + ["nukt"] = "nukta forms", + ["numr"] = "numerators", + ["onum"] = "old style figures", + ["opbd"] = "optical bounds", + ["ordn"] = "ordinals", + ["ornm"] = "ornaments", + ["palt"] = "proportional alternate width", + ["pcap"] = "petite capitals", + ["pkna"] = "proportional kana", + ["pnum"] = "proportional figures", + ["pref"] = "pre-base forms", + ["pres"] = "pre-base substitutions", + ["pstf"] = "post-base forms", + ["psts"] = "post-base substitutions", + ["pwid"] = "proportional widths", + ["qwid"] = "quarter widths", + ["rand"] = "randomize", + ["rclt"] = "required contextual alternates", + ["rkrf"] = "rakar forms", + ["rlig"] = "required ligatures", + ["rphf"] = "reph form", + ["rtbd"] = "right bounds", + ["rtla"] = "right-to-left alternates", + ["rtlm"] = "right to left mirrored forms", + ["rvrn"] = "required variation alternates", + ["ruby"] = "ruby notation forms", + ["salt"] = "stylistic alternates", + ["sinf"] = "scientific inferiors", + ["size"] = "optical size", -- now stat table + ["smcp"] = "small capitals", + ["smpl"] = "simplified forms", + -- ["ss01"] = "stylistic set 1", + -- ["ss02"] = "stylistic set 2", + -- ["ss03"] = "stylistic set 3", + -- ["ss04"] = "stylistic set 4", + -- ["ss05"] = "stylistic set 5", + -- ["ss06"] = "stylistic set 6", + -- ["ss07"] = "stylistic set 7", + -- ["ss08"] = "stylistic set 8", + -- ["ss09"] = "stylistic set 9", + -- ["ss10"] = "stylistic set 10", + -- ["ss11"] = "stylistic set 11", + -- ["ss12"] = "stylistic set 12", + -- ["ss13"] = "stylistic set 13", + -- ["ss14"] = "stylistic set 14", + -- ["ss15"] = "stylistic set 15", + -- ["ss16"] = "stylistic set 16", + -- ["ss17"] = "stylistic set 17", + -- ["ss18"] = "stylistic set 18", + -- ["ss19"] = "stylistic set 19", + -- ["ss20"] = "stylistic set 20", + ["ssty"] = "script style", -- math + ["stch"] = "stretching glyph decomposition", + ["subs"] = "subscript", + ["sups"] = "superscript", + ["swsh"] = "swash", + ["titl"] = "titling", + ["tjmo"] = "trailing jamo forms", + ["tnam"] = "traditional name forms", + ["tnum"] = "tabular figures", + ["trad"] = "traditional forms", + ["twid"] = "third widths", + ["unic"] = "unicase", + ["valt"] = "alternate vertical metrics", + ["vatu"] = "vattu variants", + ["vert"] = "vertical writing", + ["vhal"] = "alternate vertical half metrics", + ["vjmo"] = "vowel jamo forms", + ["vkna"] = "vertical kana alternates", + ["vkrn"] = "vertical kerning", + ["vpal"] = "proportional alternate vertical metrics", + ["vrt2"] = "vertical rotation", + ["zero"] = "slashed zero", - ['trep'] = 'traditional tex replacements', - ['tlig'] = 'traditional tex ligatures', + ["trep"] = "traditional tex replacements", + ["tlig"] = "traditional tex ligatures", - ['ss..'] = 'stylistic set ..', - ['cv..'] = 'character variant ..', - ['js..'] = 'justification ..', + ["ss.."] = "stylistic set ..", + ["cv.."] = "character variant ..", + ["js.."] = "justification ..", ["dv.."] = "devanagari ..", ["ml.."] = "malayalam ..", } local baselines = allocate { - ['hang'] = 'hanging baseline', - ['icfb'] = 'ideographic character face bottom edge baseline', - ['icft'] = 'ideographic character face tope edige baseline', - ['ideo'] = 'ideographic em-box bottom edge baseline', - ['idtp'] = 'ideographic em-box top edge baseline', - ['math'] = 'mathematical centered baseline', - ['romn'] = 'roman baseline' + ["hang"] = "hanging baseline", + ["icfb"] = "ideographic character face bottom edge baseline", + ["icft"] = "ideographic character face tope edige baseline", + ["ideo"] = "ideographic em-box bottom edge baseline", + ["idtp"] = "ideographic em-box top edge baseline", + ["math"] = "mathematical centered baseline", + ["romn"] = "roman baseline" } tables.scripts = scripts diff --git a/tex/context/base/mkiv/font-oup.lua b/tex/context/base/mkiv/font-oup.lua index 75ae08526..79ac76abe 100644 --- a/tex/context/base/mkiv/font-oup.lua +++ b/tex/context/base/mkiv/font-oup.lua @@ -15,6 +15,7 @@ local formatters = string.formatters local sortedkeys = table.sortedkeys local sortedhash = table.sortedhash local tohash = table.tohash +local setmetatableindex = table.setmetatableindex local report = logs.reporter("otf reader") @@ -29,8 +30,8 @@ local f_index = formatters["I%05X"] local f_character_y = formatters["%C"] local f_character_n = formatters["[ %C ]"] -local check_duplicates = true -- can become an option (pseudo feature) / aways needed anyway -local check_soft_hyphen = false -- can become an option (pseudo feature) / needed for tagging +local check_duplicates = true -- can become an option (pseudo feature) / aways needed anyway +local check_soft_hyphen = true -- can become an option (pseudo feature) / needed for tagging directives.register("otf.checksofthyphen",function(v) check_soft_hyphen = v @@ -370,6 +371,7 @@ local function copyduplicates(fontdata) local duplicates = resources.duplicates if check_soft_hyphen then -- ebgaramond has a zero width empty soft hyphen + -- antykwatorunsks lacks a soft hyphen local ds = descriptions[0xAD] if not ds or ds.width == 0 then if ds then @@ -621,7 +623,7 @@ local function checklookups(fontdata,missing,nofmissing) end end if next(done) then - report("not unicoded: % t",table.sortedkeys(done)) + report("not unicoded: % t",sortedkeys(done)) end end end @@ -632,7 +634,6 @@ local function unifymissing(fontdata) require("font-agl") end local unicodes = { } - local private = fontdata.private local resources = fontdata.resources resources.unicodes = unicodes for unicode, d in next, fontdata.descriptions do @@ -1066,13 +1067,14 @@ function readers.pack(data) end end - local function pack_flat(v) - local tag = tabstr_flat(v) + local function pack_normal_cc(v) + local tag = tabstr_normal(v) local ht = h[tag] if ht then c[ht] = c[ht] + 1 return ht else + v[1] = 0 nt = nt + 1 t[nt] = v h[tag] = nt @@ -1081,8 +1083,8 @@ function readers.pack(data) end end - local function pack_boolean(v) - local tag = tabstr_boolean(v) + local function pack_flat(v) + local tag = tabstr_flat(v) local ht = h[tag] if ht then c[ht] = c[ht] + 1 @@ -1126,6 +1128,84 @@ function readers.pack(data) end end + -- saves a lot on noto sans + + -- can be made more clever + + local function pack_boolean(v) + local tag = tabstr_boolean(v) + local ht = h[tag] + if ht then + c[ht] = c[ht] + 1 + return ht + else + nt = nt + 1 + t[nt] = v + h[tag] = nt + c[nt] = 1 + return nt + end + end + + -- -- This was an experiment to see if we can bypass the luajit limits but loading is + -- -- still an issue due to other limits so we don't use this ... actually it can + -- -- prevent a luajittex crash but i don't care too much about that as we can't use + -- -- that engine anyway then. + -- + -- local function check(t) + -- if type(t) == "table" then + -- local s = sortedkeys(t) + -- local n = #s + -- if n <= 10 then + -- return + -- end + -- local ranges = { } + -- local first, last + -- for i=1,#s do + -- local ti = s[i] + -- if not first then + -- first = ti + -- last = ti + -- elseif ti == last + 1 then + -- last = ti + -- elseif last - first < 10 then + -- -- we could permits a few exceptions + -- return + -- else + -- ranges[#ranges+1] = { first, last } + -- first, last = nil, nil + -- end + -- end + -- if #ranges > 0 then + -- return { + -- ranges = ranges + -- } + -- end + -- end + -- end + -- + -- local function pack_boolean(v) + -- local tag + -- local r = check(v) + -- if r then + -- v = r + -- tag = tabstr_normal(v) + -- else + -- tag = tabstr_boolean(v) + -- end + -- local ht = h[tag] + -- if ht then + -- c[ht] = c[ht] + 1 + -- return ht + -- else + -- nt = nt + 1 + -- t[nt] = v + -- h[tag] = nt + -- c[nt] = 1 + -- return nt + -- end + -- end + local function pack_final(v) -- v == number if c[v] <= criterium then @@ -1145,6 +1225,25 @@ function readers.pack(data) end end + local function pack_final_cc(v) + -- v == number + if c[v] <= criterium then + return t[v] + else + -- compact hash + local hv = hh[v] + if hv then + return hv + else + ntt = ntt + 1 + tt[ntt] = t[v] + hh[v] = ntt + cc[ntt] = c[v] + return ntt + end + end + end + local function success(stage,pass) if nt == 0 then if trace_loading or trace_packing then @@ -1191,9 +1290,9 @@ function readers.pack(data) local function packers(pass) if pass == 1 then - return pack_normal, pack_indexed, pack_flat, pack_boolean, pack_mixed + return pack_normal, pack_indexed, pack_flat, pack_boolean, pack_mixed, pack_normal_cc else - return pack_final, pack_final, pack_final, pack_final, pack_final + return pack_final, pack_final, pack_final, pack_final, pack_final, pack_final_cc end end @@ -1211,15 +1310,13 @@ function readers.pack(data) return end - -- - for pass=1,2 do if trace_packing then report_otf("start packing: stage 1, pass %s",pass) end - local pack_normal, pack_indexed, pack_flat, pack_boolean, pack_mixed = packers(pass) + local pack_normal, pack_indexed, pack_flat, pack_boolean, pack_mixed, pack_normal_cc = packers(pass) for unicode, description in next, descriptions do local boundingbox = description.boundingbox @@ -1259,28 +1356,30 @@ function readers.pack(data) if kind == "gpos_pair" then local c = step.coverage if c then - if step.format == "kern" then + if step.format == "pair" then for g1, d1 in next, c do - c[g1] = pack_normal(d1) + for g2, d2 in next, d1 do + local f = d2[1] if f and f ~= true then d2[1] = pack_indexed(f) end + local s = d2[2] if s and s ~= true then d2[2] = pack_indexed(s) end + end end else for g1, d1 in next, c do - for g2, d2 in next, d1 do - local f = d2[1] if f then d2[1] = pack_indexed(f) end - local s = d2[2] if s then d2[2] = pack_indexed(s) end - end + c[g1] = pack_normal(d1) end end end elseif kind == "gpos_single" then local c = step.coverage if c then - if step.format == "kern" then - step.coverage = pack_normal(c) - else + if step.format == "single" then for g1, d1 in next, c do - c[g1] = pack_indexed(d1) + if d1 and d1 ~= true then + c[g1] = pack_indexed(d1) + end end + else + step.coverage = pack_normal(c) end end elseif kind == "gpos_cursive" then @@ -1399,7 +1498,7 @@ function readers.pack(data) for i=1,#deltas do local di = deltas[i] local d = di.deltas - local r = di.regions + -- local r = di.regions for j=1,#d do d[j] = pack_indexed(d[j]) end @@ -1439,7 +1538,7 @@ function readers.pack(data) report_otf("start packing: stage 2, pass %s",pass) end - local pack_normal, pack_indexed, pack_flat, pack_boolean, pack_mixed = packers(pass) + local pack_normal, pack_indexed, pack_flat, pack_boolean, pack_mixed, pack_normal_cc = packers(pass) for unicode, description in next, descriptions do local math = description.math @@ -1463,9 +1562,7 @@ function readers.pack(data) if kind == "gpos_pair" then local c = step.coverage if c then - if step.format == "kern" then - -- todo ! - else + if step.format == "pair" then for g1, d1 in next, c do for g2, d2 in next, d1 do d1[g2] = pack_normal(d2) @@ -1473,11 +1570,22 @@ function readers.pack(data) end end end --- elseif kind == "gpos_mark2base" or kind == "gpos_mark2mark" or kind == "gpos_mark2ligature" then --- local c = step.baseclasses --- for k, v in next, c do --- c[k] = pack_normal(v) --- end + -- elseif kind == "gpos_cursive" then + -- local c = step.coverage -- new + -- if c then + -- for g1, d1 in next, c do + -- c[g1] = pack_normal_cc(d1) + -- end + -- end + elseif kind == "gpos_mark2ligature" then + local c = step.baseclasses -- new + if c then + for g1, d1 in next, c do + for g2, d2 in next, d1 do + d1[g2] = pack_normal(d2) + end + end + end end local rules = step.rules if rules then @@ -1525,7 +1633,7 @@ function readers.pack(data) report_otf("start packing: stage 3, pass %s",pass) end - local pack_normal, pack_indexed, pack_flat, pack_boolean, pack_mixed = packers(pass) + local pack_normal, pack_indexed, pack_flat, pack_boolean, pack_mixed, pack_normal_cc = packers(pass) local function packthem(sequences) for i=1,#sequences do @@ -1539,18 +1647,23 @@ function readers.pack(data) if kind == "gpos_pair" then local c = step.coverage if c then - if step.format == "kern" then - -- todo ! - else + if step.format == "pair" then for g1, d1 in next, c do c[g1] = pack_normal(d1) end end end + elseif kind == "gpos_cursive" then + local c = step.coverage + if c then + for g1, d1 in next, c do + c[g1] = pack_normal_cc(d1) + end + end end end end - end + end end if sequences then @@ -1626,6 +1739,15 @@ function readers.unpack(data) -- end end + -- local function expandranges(t,ranges) + -- for i=1,#ranges do + -- local r = ranges[i] + -- for k=r[1],r[2] do + -- t[k] = true + -- end + -- end + -- end + local function unpackthem(sequences) for i=1,#sequences do local sequence = sequences[i] @@ -1635,20 +1757,26 @@ function readers.unpack(data) local features = sequence.features local flags = sequence.flags local markclass = sequence.markclass + if features then + local tv = tables[features] + if tv then + sequence.features = tv + features = tv + end + for script, feature in next, features do + local tv = tables[feature] + if tv then + features[script] = tv + end + end + end if steps then for i=1,#steps do local step = steps[i] if kind == "gpos_pair" then local c = step.coverage if c then - if step.format == "kern" then - for g1, d1 in next, c do - local tv = tables[d1] - if tv then - c[g1] = tv - end - end - else + if step.format == "pair" then for g1, d1 in next, c do local tv = tables[d1] if tv then @@ -1665,29 +1793,41 @@ function readers.unpack(data) local s = tables[d2[2]] if s then d2[2] = s end end end + else + for g1, d1 in next, c do + local tv = tables[d1] + if tv then + c[g1] = tv + end + end end end elseif kind == "gpos_single" then local c = step.coverage if c then - if step.format == "kern" then - local tv = tables[c] - if tv then - step.coverage = tv - end - else + if step.format == "single" then for g1, d1 in next, c do local tv = tables[d1] if tv then c[g1] = tv end end + else + local tv = tables[c] + if tv then + step.coverage = tv + end end end elseif kind == "gpos_cursive" then local c = step.coverage if c then for g1, d1 in next, c do + local tv = tables[d1] + if tv then + d1 = tv + c[g1] = d1 + end local f = tables[d1[2]] if f then d1[2] = f end local s = tables[d1[3]] if s then d1[3] = s end end @@ -1695,12 +1835,6 @@ function readers.unpack(data) elseif kind == "gpos_mark2base" or kind == "gpos_mark2mark" then local c = step.baseclasses if c then --- for k, v in next, c do --- local tv = tables[v] --- if tv then --- c[k] = tv --- end --- end for g1, d1 in next, c do for g2, d2 in next, d1 do local tv = tables[d2] @@ -1722,14 +1856,13 @@ function readers.unpack(data) elseif kind == "gpos_mark2ligature" then local c = step.baseclasses if c then --- for k, v in next, c do --- local tv = tables[v] --- if tv then --- c[k] = tv --- end --- end for g1, d1 in next, c do for g2, d2 in next, d1 do + local tv = tables[d2] -- new + if tv then + d2 = tv + d1[g2] = d2 + end for g3, d3 in next, d2 do local tv = tables[d2[g3]] if tv then @@ -1766,6 +1899,18 @@ function readers.unpack(data) before[i] = tv end end + -- for i=1,#before do + -- local bi = before[i] + -- local tv = tables[bi] + -- if tv then + -- bi = tv + -- before[i] = bi + -- end + -- local ranges = bi.ranges + -- if ranges then + -- expandranges(bi,ranges) + -- end + -- end end local after = rule.after if after then @@ -1780,6 +1925,18 @@ function readers.unpack(data) after[i] = tv end end + -- for i=1,#after do + -- local ai = after[i] + -- local tv = tables[ai] + -- if tv then + -- ai = tv + -- after[i] = ai + -- end + -- local ranges = ai.ranges + -- if ranges then + -- expandranges(ai,ranges) + -- end + -- end end local current = rule.current if current then @@ -1794,6 +1951,18 @@ function readers.unpack(data) current[i] = tv end end + -- for i=1,#current do + -- local ci = current[i] + -- local tv = tables[ci] + -- if tv then + -- ci = tv + -- current[i] = ci + -- end + -- local ranges = ci.ranges + -- if ranges then + -- expandranges(ci,ranges) + -- end + -- end end -- local lookups = rule.lookups -- if lookups then @@ -1813,19 +1982,6 @@ function readers.unpack(data) end end end - if features then - local tv = tables[features] - if tv then - sequence.features = tv - features = tv - end - for script, feature in next, features do - local tv = tables[feature] - if tv then - features[script] = tv - end - end - end if order then local tv = tables[order] if tv then @@ -1989,8 +2145,10 @@ local function mergesteps_1(lookup,strict) return nofsteps - 1 end - -local function mergesteps_2(lookup,strict) -- pairs +local function mergesteps_2(lookup) -- pairs + -- this can be tricky as we can have a match on a mark with no marks skip flag + -- in which case with multiple steps a hit can prevent a next step while in the + -- merged case we can hit differently (a messy font then anyway) local steps = lookup.steps local nofsteps = lookup.nofsteps local first = steps[1] @@ -2009,9 +2167,9 @@ local function mergesteps_2(lookup,strict) -- pairs for k, v in next, steps[i].coverage do local tk = target[k] if tk then - for k, v in next, v do - if not tk[k] then - tk[k] = v + for kk, vv in next, v do + if tk[kk] == nil then + tk[kk] = vv end end else @@ -2020,57 +2178,48 @@ local function mergesteps_2(lookup,strict) -- pairs end end lookup.nofsteps = 1 - lookup.steps = { first } + lookup.merged = true + lookup.steps = { first } return nofsteps - 1 end +-- we could have a coverage[first][second] = { } already here (because eventually +-- we also have something like that after loading) local function mergesteps_3(lookup,strict) -- marks local steps = lookup.steps local nofsteps = lookup.nofsteps - local first = steps[1] report("merging %a steps of %a lookup %a",nofsteps,lookup.type,lookup.name) - local baseclasses = { } - local coverage = { } - local used = { } + -- check first + local coverage = { } for i=1,nofsteps do - local offset = i*10 - local step = steps[i] - for k, v in sortedhash(step.baseclasses) do - baseclasses[offset+k] = v - end - for k, v in next, step.coverage do - local tk = coverage[k] + for k, v in next, steps[i].coverage do + local tk = coverage[k] -- { class, { x, y } } if tk then - for k, v in next, v do - if not tk[k] then - tk[k] = v - local c = offset + v[1] - v[1] = c - if not used[c] then - used[c] = true - end - end - end + report("quitting merge due to multiple checks") + return nofsteps else coverage[k] = v - local c = offset + v[1] - v[1] = c - if not used[c] then - used[c] = true - end end end end - for k, v in next, baseclasses do - if not used[k] then - baseclasses[k] = nil - report("discarding not used baseclass %i",k) + -- merge indeed + local first = steps[1] + local baseclasses = { } -- let's assume sparse step.baseclasses + for i=1,nofsteps do + local offset = i*10 -- we assume max 10 classes per step + local step = steps[i] + for k, v in sortedhash(step.baseclasses) do + baseclasses[offset+k] = v + end + for k, v in next, step.coverage do + v[1] = offset + v[1] end end first.baseclasses = baseclasses first.coverage = coverage lookup.nofsteps = 1 + lookup.merged = true lookup.steps = { first } return nofsteps - 1 end @@ -2113,62 +2262,137 @@ local function mergesteps_4(lookup) -- ligatures return nofsteps - 1 end +-- so we assume only one cursive entry and exit and even then the first one seems +-- to win anyway: no exit or entry quite the lookup match and then we take the +-- next step; this means that we can as well merge them + +local function mergesteps_5(lookup) -- cursive + local steps = lookup.steps + local nofsteps = lookup.nofsteps + local first = steps[1] + report("merging %a steps of %a lookup %a",nofsteps,lookup.type,lookup.name) + local target = first.coverage + local hash = nil + for k, v in next, target do + hash = v[1] + break + end + for i=2,nofsteps do + for k, v in next, steps[i].coverage do + local tk = target[k] + if tk then + if not tk[2] then + tk[2] = v[2] + end + if not tk[3] then + tk[3] = v[3] + end + else + target[k] = v + v[1] = hash + end + end + end + lookup.nofsteps = 1 + lookup.merged = true + lookup.steps = { first } + return nofsteps - 1 +end + local function checkkerns(lookup) local steps = lookup.steps local nofsteps = lookup.nofsteps + local kerned = 0 for i=1,nofsteps do local step = steps[i] if step.format == "pair" then local coverage = step.coverage local kerns = true for g1, d1 in next, coverage do - if d1[1] ~= 0 or d1[2] ~= 0 or d1[4] ~= 0 then + if d1 == true then + -- all zero + elseif not d1 then + -- null + elseif d1[1] ~= 0 or d1[2] ~= 0 or d1[4] ~= 0 then kerns = false break end end if kerns then report("turning pairs of step %a of %a lookup %a into kerns",i,lookup.type,lookup.name) + local c = { } for g1, d1 in next, coverage do - coverage[g1] = d1[3] + if d1 and d1 ~= true then + c[g1] = d1[3] + end end - step.format = "kern" + step.coverage = c + step.format = "move" + kerned = kerned + 1 end end end + return kerned end +-- There are several options to optimize but we have this somewhat fuzzy aspect of +-- advancing (depending on the second of a pair) so we need to retain that information. +-- +-- We can have: +-- +-- true, nil|false +-- +-- which effectively means: nothing to be done and advance to next (so not next of +-- next) and because coverage should be not overlapping we can wipe these. However, +-- checking for (true,nil) (false,nil) and omitting them doesn't gain much. + +-- Because we pack we cannot mix tables and numbers so we can only turn a whole set in +-- format kern instead of pair. + local function checkpairs(lookup) local steps = lookup.steps local nofsteps = lookup.nofsteps local kerned = 0 - for i=1,nofsteps do - local step = steps[i] - if step.format == "pair" then - local coverage = step.coverage - local kerns = true - for g1, d1 in next, coverage do - for g2, d2 in next, d1 do - if d2[2] then - kerns = false - break - else - local v = d2[1] - if v[1] ~= 0 or v[2] ~= 0 or v[4] ~= 0 then - kerns = false - break - end + + local function onlykerns(step) + local coverage = step.coverage + for g1, d1 in next, coverage do + for g2, d2 in next, d1 do + if d2[2] then + --- true or { a, b, c, d } + return false + else + local v = d2[1] + if v == true then + -- all zero + elseif v and (v[1] ~= 0 or v[2] ~= 0 or v[4] ~= 0) then + return false end end end - if kerns then + end + return coverage + end + + for i=1,nofsteps do + local step = steps[i] + if step.format == "pair" then + local coverage = onlykerns(step) + if coverage then report("turning pairs of step %a of %a lookup %a into kerns",i,lookup.type,lookup.name) for g1, d1 in next, coverage do + local d = { } for g2, d2 in next, d1 do - d1[g2] = d2[1][3] + local v = d2[1] + if v == true then + -- ignore -- d1[g2] = nil + elseif v then + d[g2] = v[3] -- d1[g2] = v[3] + end end + coverage[g1] = d end - step.format = "kern" + step.format = "move" kerned = kerned + 1 end end @@ -2176,6 +2400,30 @@ local function checkpairs(lookup) return kerned end +local compact_pairs = true +local compact_singles = true + +local merge_pairs = true +local merge_singles = true +local merge_substitutions = true +local merge_alternates = true +local merge_multiples = true +local merge_ligatures = true +local merge_cursives = true +local merge_marks = true + +directives.register("otf.compact.pairs", function(v) compact_pairs = v end) +directives.register("otf.compact.singles", function(v) compact_singles = v end) + +directives.register("otf.merge.pairs", function(v) merge_pairs = v end) +directives.register("otf.merge.singles", function(v) merge_singles = v end) +directives.register("otf.merge.substitutions", function(v) merge_substitutions = v end) +directives.register("otf.merge.alternates", function(v) merge_alternates = v end) +directives.register("otf.merge.multiples", function(v) merge_multiples = v end) +directives.register("otf.merge.ligatures", function(v) merge_ligatures = v end) +directives.register("otf.merge.cursives", function(v) merge_cursives = v end) +directives.register("otf.merge.marks", function(v) merge_marks = v end) + function readers.compact(data) if not data or data.compacted then return @@ -2192,23 +2440,65 @@ function readers.compact(data) for i=1,#lookups do local lookup = lookups[i] local nofsteps = lookup.nofsteps + local kind = lookup.type allsteps = allsteps + nofsteps if nofsteps > 1 then - local kind = lookup.type - if kind == "gsub_single" or kind == "gsub_alternate" or kind == "gsub_multiple" then - merged = merged + mergesteps_1(lookup) + local merg = merged + if kind == "gsub_single" then + if merge_substitutions then + merged = merged + mergesteps_1(lookup) + end + elseif kind == "gsub_alternate" then + if merge_alternates then + merged = merged + mergesteps_1(lookup) + end + elseif kind == "gsub_multiple" then + if merge_multiples then + merged = merged + mergesteps_1(lookup) + end elseif kind == "gsub_ligature" then - merged = merged + mergesteps_4(lookup) + if merge_ligatures then + merged = merged + mergesteps_4(lookup) + end elseif kind == "gpos_single" then - merged = merged + mergesteps_1(lookup,true) - checkkerns(lookup) + if merge_singles then + merged = merged + mergesteps_1(lookup,true) + end + if compact_singles then + kerned = kerned + checkkerns(lookup) + end elseif kind == "gpos_pair" then - merged = merged + mergesteps_2(lookup,true) - kerned = kerned + checkpairs(lookup) + if merge_pairs then + merged = merged + mergesteps_2(lookup) + end + if compact_pairs then + kerned = kerned + checkpairs(lookup) + end elseif kind == "gpos_cursive" then - merged = merged + mergesteps_2(lookup) + if merge_cursives then + merged = merged + mergesteps_5(lookup) + end elseif kind == "gpos_mark2mark" or kind == "gpos_mark2base" or kind == "gpos_mark2ligature" then - merged = merged + mergesteps_3(lookup) + if merge_marks then + merged = merged + mergesteps_3(lookup) + end + end + if merg ~= merged then + lookup.merged = true + end + elseif nofsteps == 1 then + local kern = kerned + if kind == "gpos_single" then + if compact_singles then + kerned = kerned + checkkerns(lookup) + end + elseif kind == "gpos_pair" then + if compact_pairs then + kerned = kerned + checkpairs(lookup) + end + end + if kern ~= kerned then + -- lookup.kerned = true end end end @@ -2226,6 +2516,79 @@ function readers.compact(data) end end +local function mergesteps(t,k) + if k == "merged" then + local merged = { } + for i=1,#t do + local step = t[i] + local coverage = step.coverage + for k in next, coverage do + local m = merged[k] + if m then + m[2] = i + -- m[#m+1] = step + else + merged[k] = { i, i } + -- merged[k] = { step } + end + end + end + t.merged = merged + return merged + end +end + +local function checkmerge(sequence) + local steps = sequence.steps + if steps then + setmetatableindex(steps,mergesteps) + end +end + +local function checkflags(sequence,resources) + if not sequence.skiphash then + local flags = sequence.flags + if flags then + local skipmark = flags[1] + local skipligature = flags[2] + local skipbase = flags[3] + local markclass = sequence.markclass + local skipsome = skipmark or skipligature or skipbase or markclass or false + if skipsome then + sequence.skiphash = setmetatableindex(function(t,k) + local c = resources.classes[k] -- delayed table + local v = c == skipmark + or (markclass and c == "mark" and not markclass[k]) + or c == skipligature + or c == skipbase + or false + t[k] = v + return v + end) + else + sequence.skiphash = false + end + else + sequence.skiphash = false + end + end +end + +local function checksteps(sequence) + local steps = sequence.steps + if steps then + for i=1,#steps do + steps[i].index = i + end + end +end + +if fonts.helpers then + fonts.helpers.checkmerge = checkmerge + fonts.helpers.checkflags = checkflags + fonts.helpers.checksteps = checksteps -- has to happen last +end + function readers.expand(data) if not data or data.expanded then return @@ -2267,6 +2630,11 @@ function readers.expand(data) end end end + + -- using a merged combined hash as first test saves some 30% on ebgaramond and + -- about 15% on arabtype .. then moving the a test also saves a bit (even when + -- often a is not set at all so that one is a bit debatable + local function expandlookups(sequences) if sequences then -- we also need to do sublookups @@ -2274,6 +2642,8 @@ function readers.expand(data) local sequence = sequences[i] local steps = sequence.steps if steps then + local nofsteps = sequence.nofsteps + local kind = sequence.type local markclass = sequence.markclass if markclass then @@ -2284,7 +2654,8 @@ function readers.expand(data) sequence.markclass = markclasses[markclass] end end - for i=1,sequence.nofsteps do + + for i=1,nofsteps do local step = steps[i] local baseclasses = step.baseclasses if baseclasses then @@ -2300,13 +2671,14 @@ function readers.expand(data) end local rules = step.rules if rules then - local rulehash = { } + local rulehash = { n = 0 } -- is contexts in font-ots local rulesize = 0 local coverage = { } local lookuptype = sequence.type + local nofrules = #rules step.coverage = coverage -- combined hits - for nofrules=1,#rules do - local rule = rules[nofrules] + for currentrule=1,nofrules do + local rule = rules[currentrule] local current = rule.current local before = rule.before local after = rule.after @@ -2337,7 +2709,7 @@ function readers.expand(data) for i=1,#lookups do local lookups = lookups[i] if lookups then - for k, v in next, lookups do + for k, v in next, lookups do -- actually this one is indexed local lookup = sublookups[v] if lookup then lookups[k] = lookup @@ -2352,9 +2724,9 @@ function readers.expand(data) end end if sequence[1] then -- we merge coverage into one - rulesize = rulesize + 1 - rulehash[rulesize] = { - nofrules, -- 1 + sequence.n = #sequence -- tiny speedup + local ruledata = { + currentrule, -- 1 -- original rule number, only use this for tracing! lookuptype, -- 2 sequence, -- 3 start, -- 4 @@ -2363,20 +2735,61 @@ function readers.expand(data) replacements, -- 7 subtype, -- 8 } - for unic in next, sequence[start] do - local cu = coverage[unic] - if not cu then - coverage[unic] = rulehash -- can now be done cleaner i think + -- + -- possible optimization: per [unic] a rulehash, but beware: + -- contexts have unique coverage and chains can have multiple + -- hits (rules) per coverage entry + -- + -- so: we can combine multiple steps as well as multiple rules + -- but that takes careful checking, in which case we can go the + -- step list approach and turn contexts into steps .. in fact, + -- if we turn multiple contexts into steps we're already ok as + -- steps gets a coverage hash by metatable + -- + rulesize = rulesize + 1 + rulehash[rulesize] = ruledata + rulehash.n = rulesize -- tiny speedup + -- + if true then -- nofrules > 1 + + for unic in next, sequence[start] do + local cu = coverage[unic] + if cu then + local n = #cu+1 + cu[n] = ruledata + cu.n = n + else + coverage[unic] = { ruledata, n = 1 } + end end + + else + + for unic in next, sequence[start] do + local cu = coverage[unic] + if cu then + -- we can have a contextchains with many matches which we + -- can actually optimize + else + coverage[unic] = rulehash + end + end + end end end end end + + checkmerge(sequence) + checkflags(sequence,resources) + checksteps(sequence) + end end end end + expandlookups(sequences) expandlookups(sublookups) end diff --git a/tex/context/base/mkiv/font-pre.mkiv b/tex/context/base/mkiv/font-pre.mkiv index 9336fa352..d09d871f0 100644 --- a/tex/context/base/mkiv/font-pre.mkiv +++ b/tex/context/base/mkiv/font-pre.mkiv @@ -19,7 +19,33 @@ % beware, base mode + dynamics can give weird effects -% rlig ccmp +% frac : with numr dnom +% +% vkrn valt vert vrt2 vpal : when vertical +% +% rtlm rtla : in r2l runs +% ltrm ltra : in l2r runs +% +% rvrn : variable fonts +% +% rtbd lfbd : opbd +% +% rkrf rphf vatu vjmo tjmo rclt psts pstf ljmo haln +% pres pref nukt +% abvs abvm blwm blws cjct blwf akhn (indic) +% half +% abvf cfar (khmer) +% +% ccmp locl calt clig liga rlig +% +% mkmk mark kern (palt pwid) curs (by choice but some fonts need it) +% +% init medi isol fina (unicode) +% fin3 fin2 med2 : syriac +% +% cpsp : percentage spacing (todo) +% +% dtls flac :math \definefontfeature [always] @@ -27,7 +53,10 @@ script=auto, % on speed; 'base' just doesn't play well with dynamics; some day we can even autoscript=position, autolanguage=position, +% ccmp=yes, kern=yes, % consider skipping the base passes when no base mode is used +% palt=yes, +% pwid=yes, mark=yes, mkmk=yes, curs=yes] @@ -36,6 +65,11 @@ [default] [always] [liga=yes, +% ccmp=yes, % maybe too +% locl=yes, % maybe too +% calt=yes, % maybe too +% clig=yes, % maybe too +% rlig=yes, % maybe too tlig=yes, trep=yes] % texligatures=yes,texquotes=yes @@ -101,6 +135,11 @@ [always] [compose=yes, liga=yes, +% ccmp=yes, +% locl=yes, +% calt=yes, +% clig=yes, +% rlig=yes, tlig=yes, trep=yes] @@ -114,6 +153,7 @@ [mode=node,analyze=yes,language=dflt,ccmp=yes, autoscript=position,autolanguage=position, init=yes,medi=yes,fina=yes,isol=yes, + % fin2=yes,fin3=yes,med2=yes, mark=yes,mkmk=yes,kern=yes,curs=yes, liga=yes,dlig=yes,rlig=yes,clig=yes,calt=yes] @@ -122,6 +162,7 @@ [mode=node,analyze=yes,language=dflt,ccmp=yes, autoscript=position,autolanguage=position, init=yes,medi=yes,fina=yes,isol=yes, + % fin2=yes,fin3=yes,med2=yes, mark=yes,mkmk=yes,kern=yes,curs=yes, rlig=yes,calt=yes] @@ -266,7 +307,8 @@ \fi \ifdefined\mathitalicsmode - \mathitalicsmode\plusone % experiment + \mathitalicsmode\plusone % simple noads become zero + % \mathitalicsmode\plustwo % idem but inner is kept (for testing) \fi % \adaptfontfeature[*math*][mathnolimitsmode=1000] % only subscript @@ -348,17 +390,6 @@ %D We define some colors that are used in tracing (for instance \OPENTYPE\ %D features). We cannot yet inherit because no colors are predefined. -\definecolor[trace:0][s=.4] -\definecolor[trace:1][r=.6] -\definecolor[trace:2][g=.6] -\definecolor[trace:3][b=.6] -\definecolor[trace:4][r=.6,g=.6] -\definecolor[trace:5][r=.6,b=.6] -\definecolor[trace:6][g=.6,b=.6] -\definecolor[trace:7][r=.8,g=.4] -\definecolor[trace:8][r=.8,b=.4] -\definecolor[trace:9][g=.4,b=.8] - \definecolor[font:init][r=.75] \definecolor[font:medi][g=.75] \definecolor[font:fina][b=.75] @@ -366,26 +397,6 @@ \definecolor[font:mark][r=.75,b=.75] % [m=.75] \definecolor[font:rest][b=.75,g=.75] % [c=.75] -\definecolor[trace:w][s=1] -\definecolor[trace:r][r=.75,t=.5,a=1] -\definecolor[trace:g][g=.75,t=.5,a=1] -\definecolor[trace:b][b=.75,t=.5,a=1] -\definecolor[trace:c][c=.75,t=.5,a=1] -\definecolor[trace:m][m=.75,t=.5,a=1] -\definecolor[trace:y][y=.75,t=.5,a=1] -\definecolor[trace:s][s=.75,t=.5,a=1] -\definecolor[trace:o][r=1,g=.6,b=.1,t=.5,a=1] - -\definecolor[trace:dw][s=1] -\definecolor[trace:dr][r=.75,t=.75,a=1] -\definecolor[trace:dg][g=.75,t=.75,a=1] -\definecolor[trace:db][b=.75,t=.75,a=1] -\definecolor[trace:dc][c=.75,t=.75,a=1] -\definecolor[trace:dm][m=.75,t=.75,a=1] -\definecolor[trace:dy][y=.75,t=.75,a=1] -\definecolor[trace:ds][s=.75,t=.75,a=1] -\definecolor[trace:do][r=1,g=.6,b=.1,t=.75,a=1] - \definecolor[font:0] [s=1] \definecolor[font:1] [r=.75] \definecolor[font:2] [g=.75] @@ -607,7 +618,7 @@ \definealternativestyle [\v!bigger] [\setbigbodyfont \tf] [] \definealternativestyle [\v!smaller] [\setsmallbodyfont\tf] [] -\definealternativestyle [\v!sans,\v!sansserif] [\ss] [] +\definealternativestyle [\v!sans,\v!sansserif] [\ss] \definealternativestyle [\v!roman,\v!serif,\v!regular] [\rm] \definealternativestyle [\v!handwritten] [\hw] \definealternativestyle [\v!calligraphic] [\cg] @@ -619,6 +630,12 @@ \definealternativestyle [\v!mononormal] [\tt\tf] [] \definealternativestyle [\v!monobold] [\tt\bf] [] +\definealternativestyle [typeface] [\typeface] [] % no translation here (quite basic) +\definealternativestyle [boldface] [\boldface] [] +\definealternativestyle [slantedface] [\slantedface] [] +\definealternativestyle [italicface] [\italicface] [] +\definealternativestyle [swapface] [\swapface] [] + % For Alan: \definealternativestyle @@ -689,6 +706,7 @@ \definefontfeature[f:oldstyle] [onum=yes] \definefontfeature[f:tabular] [tnum=yes] \definefontfeature[f:superiors][sups=yes] +\definefontfeature[f:inferiors][subs=yes] \definefontfeature[f:fractions][frac=yes] \definefontfeature[f:kern] [kern=yes] \definefontfeature[f:kerns] [kern=yes] @@ -732,11 +750,15 @@ %D don't want huge switches to the main bodyfont and style, so %D here too we use a direct method. -\let\infofont \relax % satisfy dep checker -\let\infofontbold\relax % satisfy dep checker +\let\infofont \relax +\let\infofontbold \relax +\let\smallinfofont \relax +\let\smallinfofontbold\relax -\definefont[infofont] [file:dejavusansmono at 6pt] % todo \the\everybodyfont -\definefont[infofontbold][file:dejavusansmono-bold at 6pt] % todo \the\everybodyfont +\definefont[infofont] [file:dejavusansmono*none at 6pt] +\definefont[infofontbold] [file:dejavusansmono-bold*none at 6pt] +\definefont[smallinfofont] [file:dejavusansmono*none at 3pt] +\definefont[smallinfofontbold][file:dejavusansmono-bold*none at 3pt] %D Optimization (later we overload in math). Also needed in order to get \type {\ss} %D properly defined. diff --git a/tex/context/base/mkiv/font-run.mkiv b/tex/context/base/mkiv/font-run.mkiv index ebb3a576c..610f2e62c 100644 --- a/tex/context/base/mkiv/font-run.mkiv +++ b/tex/context/base/mkiv/font-run.mkiv @@ -202,11 +202,13 @@ \scratchcounterthree\numexpr\charplane*256+\scratchcounter\relax \iffontchar\font\scratchcounterthree \setbox\scratchbox\ruledhpack{\char\scratchcounterthree}% + \bgroup \tf \startoverlay {\wrapbox\scratchbox} {\textbox\scratchnum} \stopoverlay + \egroup \else \copy\scratchboxthree \fi}}}% diff --git a/tex/context/base/mkiv/font-sel.lua b/tex/context/base/mkiv/font-sel.lua index b4dd9a555..0cf51cad3 100644 --- a/tex/context/base/mkiv/font-sel.lua +++ b/tex/context/base/mkiv/font-sel.lua @@ -6,6 +6,8 @@ if not modules then modules = { } end modules ['font-sel'] = { license = "GNU General Public License" } +local next, type = next, type + local context = context local cleanname = fonts.names.cleanname local gsub, splitup, find, lower = string.gsub, string.splitup, string.find, string.lower diff --git a/tex/context/base/mkiv/font-sel.mkvi b/tex/context/base/mkiv/font-sel.mkvi index a78742928..87617d2d1 100644 --- a/tex/context/base/mkiv/font-sel.mkvi +++ b/tex/context/base/mkiv/font-sel.mkvi @@ -10,7 +10,7 @@ \writestatus{loading}{ConTeXt User Module / Selectfont} -\registerctxluafile{font-sel}{1.001} +\registerctxluafile{font-sel}{} \unprotect diff --git a/tex/context/base/mkiv/font-shp.lua b/tex/context/base/mkiv/font-shp.lua index 6e21848a4..75a12ac82 100644 --- a/tex/context/base/mkiv/font-shp.lua +++ b/tex/context/base/mkiv/font-shp.lua @@ -6,7 +6,7 @@ if not modules then modules = { } end modules ['font-shp'] = { license = "see context related readme files" } -local tonumber = tonumber +local tonumber, next = tonumber, next local concat = table.concat local formatters = string.formatters @@ -362,7 +362,7 @@ local function addvariableshapes(tfmdata,key,value) -- we need inline in order to support color local bt, et = getactualtext(char.tounicode or char.unicode or unicode) char.commands = { - { "special", "pdf:" .. segmentstopdf(segments,factor,bt,et) } + { "pdf", "origin", segmentstopdf(segments,factor,bt,et) } } end end diff --git a/tex/context/base/mkiv/font-sol.lua b/tex/context/base/mkiv/font-sol.lua index 82fc3dc40..8967d88e6 100644 --- a/tex/context/base/mkiv/font-sol.lua +++ b/tex/context/base/mkiv/font-sol.lua @@ -67,6 +67,7 @@ local getsubtype = nuts.getsubtype local getlist = nuts.getlist local getdir = nuts.getdir local getwidth = nuts.getwidth +local getboxglue = nuts.getboxglue local setattr = nuts.setattr local setlink = nuts.setlink @@ -336,7 +337,6 @@ local splitter_one = usernodeids["splitters.one"] local splitter_two = usernodeids["splitters.two"] local a_word = attributes.private('word') -local a_fontkern = attributes.private('fontkern') local encapsulate = false @@ -395,7 +395,7 @@ function splitters.split(head) if m > max_more then max_more = m end start, stop, done = nil, nil, true end - while current do -- also nextid + while current do -- also ischar local next = getnext(current) local id = getid(current) if id == glyph_code then @@ -500,7 +500,7 @@ local function collect_words(list) -- can be made faster for attributes report_splitters("skipped: %C",current.char) end end - elseif id == kern_code and (getsubtype(current) == fontkern_code or getattr(current,a_fontkern)) then + elseif id == kern_code and getsubtype(current) == fontkern_code then if first then last = current else @@ -725,9 +725,7 @@ variants[v_random] = function(words,list,best,width,badness,line,set,listdir) end local function show_quality(current,what,line) - local set = getfield(current,"glue_set") - local sign = getfield(current,"glue_sign") - local order = getfield(current,"glue_order") + local set, order, sign = getboxglue(current) local amount = set * ((sign == 2 and -1) or 1) report_optimizers("line %a, category %a, amount %a, set %a, sign %a, how %a, order %a",line,what,amount,set,sign,how,order) end diff --git a/tex/context/base/mkiv/font-sol.mkvi b/tex/context/base/mkiv/font-sol.mkvi index d065b78ea..c908001ff 100644 --- a/tex/context/base/mkiv/font-sol.mkvi +++ b/tex/context/base/mkiv/font-sol.mkvi @@ -72,7 +72,7 @@ %D \disabletrackers[parbuilders.solutions.splitters.colors] %D \stoptyping -\registerctxluafile{font-sol}{1.001} +\registerctxluafile{font-sol}{} \unprotect diff --git a/tex/context/base/mkiv/font-sty.mkvi b/tex/context/base/mkiv/font-sty.mkvi index cf49cd5eb..2d00c5ec8 100644 --- a/tex/context/base/mkiv/font-sty.mkvi +++ b/tex/context/base/mkiv/font-sty.mkvi @@ -18,34 +18,33 @@ %D \macros %D {definealternativestyle} %D -%D In the main modules we are going to implement lots of -%D parameterized commands and one of these parameters will -%D concern the font to use. To suit consistent use of fonts we -%D here implement a mechanism for defining the keywords that -%D present a particular style or alternative. +%D In the main modules we are going to implement lots of parameterized commands and +%D one of these parameters will concern the font to use. To suit consistent use of +%D fonts we here implement a mechanism for defining the keywords that present a +%D particular style or alternative. %D %D \starttyping %D \definealternativestyle [keywords] [\style] [\nostyle] %D \stoptyping %D -%D The first command is used in the normal textflow, while the -%D second command takes care of headings and alike. Consider -%D the next two definitions: +%D The first command is used in the normal textflow, while the second command takes +%D care of headings and alike. Consider the next two definitions: %D %D \starttyping %D \definealternativestyle [bold] [\bf] [] %D \definealternativestyle [cap] [\cap] [\cap] %D \stoptyping %D -%D A change \type{\bf} in a heading which is to be set in -%D \type{\tfd} does not look that well, so therefore we leave -%D the second argument of \type{\definealternativestyle} empty. -%D When we capatalize characters using the pseudo small cap -%D command \type{\cap}, we want this to take effect in both -%D text and headings, which is accomplished by assigning both -%D arguments. +%D A change \type {\bf} in a heading which is to be set in \type {\tfd} does not look +%D that well, so therefore we leave the second argument of \type +%D {\definealternativestyle} empty. When we capatalize characters using the pseudo +%D small cap command \type {\cap}, we want this to take effect in both text and +%D headings, which is accomplished by assigning both arguments. -\installcorenamespace{alternativestyles} +\installcorenamespace{alternativestyles} % settings +\installcorenamespace{alternativestyle} % instances + +\installsetuponlycommandhandler \??alternativestyles {alternativestyles} \setnewconstant \c_font_current_alternative_style_index \plusone @@ -57,13 +56,21 @@ \let\definestyle\definealternativestyle % later redefined +\newconstant\c_fonts_basics_alternative_style_method + \def\font_basics_define_alternative_style_indeed#variantone#varianttwo#command% - {\ifcsname#command\endcsname + {\setvalue{\??alternativestyle#command}{\font_helpers_apply_alternative_style{#variantone}{#varianttwo}}% + \ifcsname#command\endcsname % no redefinition + \else\ifnum\c_fonts_basics_alternative_style_method=\plusone + \ifthirdargument + \setuevalue{#command}{\groupedcommand{\expandafter\noexpand\begincsname\??alternativestyle#command\endcsname}{}}% + \else + \setuvalue{#command}{\groupedcommand{#variantone}{}}% + \fi \else \setuvalue{#command}{\groupedcommand{#variantone}{}}% - \fi - \setvalue{\??alternativestyles#command}{\font_helpers_apply_alternative_style{#variantone}{#varianttwo}}}% + \fi\fi} \def\font_helpers_apply_alternative_style {\ifcase\c_font_current_alternative_style_index @@ -77,18 +84,24 @@ \fi} \def\applyalternativestyle#name% public - {\begincsname\??alternativestyles#name\endcsname} + {\begincsname\??alternativestyle#name\endcsname} + +\appendtoks + \doifelse{\alternativestylesparameter\c!method}\v!auto + {\c_fonts_basics_alternative_style_method\plusone}% + {\c_fonts_basics_alternative_style_method\zerocount}% +\to \everysetupalternativestyles -%D Maybe too geneneric, but probably ok is the following. (Maybe one -%D day we will use a dedicated grouped command for styles.) +%D Maybe too generic, but probably ok is the following. (Maybe one day we will use a +%D dedicated grouped command for styles.) % \appendtoks % \let\groupedcommand\thirdofthreearguments % \to \everysimplifycommands -%D This command also defines the keyword as command. This means -%D that the example definition of \type{bold} we gave before, -%D results in a command \type{\bold} which can be used as: +%D This command also defines the keyword as command. This means that the example +%D definition of \type {bold} we gave before, results in a command \type {\bold} +%D which can be used as: %D %D \startbuffer %D He's a \bold{bold} man with a {\bold head}. @@ -102,39 +115,33 @@ %D \definealternativestyle[bold][\bf][]\getbuffer %D \stopexample %D -%D Such definitions are of course unwanted for \type{\cap} -%D because this would result in an endless recursive call. -%D Therefore we check on the existance of both the command and -%D the substitution. The latter is needed because for instance -%D \type{\type} is an entirely diferent command. That command -%D handles verbatim, while the style command would just switch -%D to teletype font. This is just an example of a tricky -%D naming coincidence. - +%D Such definitions are of course unwanted for \type {\cap} because this would +%D result in an endless recursive call. Therefore we check on the existance of both +%D the command and the substitution. The latter is needed because for instance \type +%D {\type} is an entirely diferent command. That command handles verbatim, while the +%D style command would just switch to teletype font. This is just an example of a +%D tricky naming coincidence. +%D %D \macros %D {doconvertfont,noconvertfont, %D dontconvertfont,redoconvertfont} %D -%D After having defined such keywords, we can call for them by -%D using +%D After having defined such keywords, we can call for them by using %D %D \starttyping %D \doconvertfont{keyword}{text} %D \stoptyping %D -%D We deliberately pass an argument. This enables us to -%D assign converters that handle one argument, like -%D \type{\cap}. +%D We deliberately pass an argument. This enables us to assign converters that +%D handle one argument, like \type {\cap}. %D -%D By default the first specification is used to set the style, -%D exept when we say \type{\dontconvertfont}, after which the -%D second specification is used. We can also directly call for -%D \type{\noconvertfont}. In nested calls, we can restore the -%D conversion by saying \type{\redoconvertfont}. - -%D These commands are not grouped! Grouping is most probably -%D done by the calling macro's and would lead to unnecessary -%D overhead. +%D By default the first specification is used to set the style, exept when we say +%D \type {\dontconvertfont}, after which the second specification is used. We can +%D also directly call for \type {\noconvertfont}. In nested calls, we can restore +%D the conversion by saying \type {\redoconvertfont}. +%D +%D These commands are not grouped! Grouping is most probably done by the calling +%D macro's and would lead to unnecessary overhead. \let\m_current_convert_font \empty \let\m_current_convert_font_dt\empty @@ -149,7 +156,7 @@ \def\font_helpers_do_convert_font {\edef\m_current_convert_font_dt{\detokenize\expandafter{\m_current_convert_font}}% - \ifcsname\??alternativestyles\m_current_convert_font_dt\endcsname + \ifcsname\??alternativestyle\m_current_convert_font_dt\endcsname \expandafter\lastnamedcs \else\ifcsname\m_current_convert_font_dt\endcsname \doubleexpandafter\lastnamedcs @@ -157,8 +164,8 @@ \doubleexpandafter\m_current_convert_font \fi\fi} -%D Low level switches (downward compatible, but we keep them as one can use -%D them in styles): +%D Low level switches (downward compatible, but we keep them as one can use them in +%D styles): %D %D \starttyping %D \usemodule[abr-02] @@ -188,7 +195,7 @@ \unexpanded\def\dousecurrentstyleparameter % empty check outside here {\edef\detokenizedstyleparameter{\detokenize\expandafter{\currentstyleparameter}}% \settrue\fontattributeisset % reset is done elsewhere - \ifcsname\??alternativestyles\detokenizedstyleparameter\endcsname + \ifcsname\??alternativestyle\detokenizedstyleparameter\endcsname \lastnamedcs \else\ifcsname\detokenizedstyleparameter\endcsname \lastnamedcs @@ -392,8 +399,8 @@ \unexpanded\edef\vsone#character{#character\normalUchar"FE00 } % used \unexpanded\edef\vstwo#character{#character\normalUchar"FE01 } % not used but handy for testing -%D For historic reasons we keep the following around but they are no longer -%D that relevant for \MKIV. +%D For historic reasons we keep the following around but they are no longer that +%D relevant for \MKIV. \unexpanded\def\doattributes#1#2#3#4% {\begingroup % geen \bgroup, anders in mathmode lege \hbox diff --git a/tex/context/base/mkiv/font-syn.lua b/tex/context/base/mkiv/font-syn.lua index c4dcf0bcd..52f425db3 100644 --- a/tex/context/base/mkiv/font-syn.lua +++ b/tex/context/base/mkiv/font-syn.lua @@ -14,9 +14,11 @@ if not modules then modules = { } end modules ['font-syn'] = { -- old ff loader: 140 sec -- new lua loader: 5 sec +-- maybe find(...,strictname,1,true) + local next, tonumber, type, tostring = next, tonumber, type, tostring local sub, gsub, match, find, lower, upper = string.sub, string.gsub, string.match, string.find, string.lower, string.upper -local concat, sort, fastcopy = table.concat, table.sort, table.fastcopy +local concat, sort, fastcopy, tohash = table.concat, table.sort, table.fastcopy, table.tohash local serialize, sortedhash = table.serialize, table.sortedhash local lpegmatch = lpeg.match local unpack = unpack or table.unpack @@ -35,6 +37,7 @@ local splitname = file.splitname local basename = file.basename local nameonly = file.nameonly local pathpart = file.pathpart +local suffixonly = file.suffix local filejoin = file.join local is_qualified_path = file.is_qualified_path local exists = io.exists @@ -393,11 +396,11 @@ filters.ttc = filters.otf -- local hash = { } -- local okay = false -- for line in f:lines() do -- slow but only a few lines at the beginning --- if find(line,"dict begin") then +-- if find(line,"dict begin",1,true) then -- okay = true -- elseif not okay then -- -- go on --- elseif find(line,"currentdict end") then +-- elseif find(line,"currentdict end",1,true) then -- break -- else -- local key, value = lpegmatch(p_entry,line) @@ -423,8 +426,10 @@ filters.list = { -- to be considered: loop over paths per list entry (so first all otf ttf etc) -names.fontconfigfile = "fonts.conf" -- a bit weird format, bonus feature -names.osfontdirvariable = "OSFONTDIR" -- the official way, in minimals etc +names.fontconfigfile = "fonts.conf" -- a bit weird format, bonus feature +names.osfontdirvariable = "OSFONTDIR" -- the official way, in minimals etc +names.extrafontsvariable = "EXTRAFONTS" -- the official way, in minimals etc +names.runtimefontsvariable = "RUNTIMEFONTS" -- the official way, in minimals etc filters.paths = { } filters.names = { } @@ -436,7 +441,7 @@ function names.getpaths(trace) local v = cleanpath(t[i]) v = gsub(v,"/+$","") -- not needed any more local key = lower(v) - report_names("%a specifies path %a",where,v) + report_names("variable %a specifies path %a",where,v) if not hash[key] then r = r + 1 result[r] = v @@ -448,6 +453,10 @@ function names.getpaths(trace) if path ~= "" then collect(resolvers.expandedpathlist(path),path) end + local path = names.extrafontsvariable or "" + if path ~= "" then + collect(resolvers.expandedpathlist(path),path) + end if xml then local confname = resolvers.expansion("FONTCONFIG_FILE") or "" if confname == "" then @@ -539,23 +548,6 @@ names.cleanfilename = cleanfilename -- return result -- end -local function walk_tree(pathlist,suffix,identify) - if pathlist then - for i=1,#pathlist do - local path = pathlist[i] - path = cleanpath(path .. "/") - path = gsub(path,"/+","/") - local pattern = path .. "**." .. suffix -- ** forces recurse - report_names("globbing path %a",pattern) - local t = dir.glob(pattern) - sort(t,sorter) - for j=1,#t do - local completename = t[j] - identify(completename,basename(completename),suffix,completename) - end - end - end -end local function check_name(data,result,filename,modification,suffix,subfont) -- shortcuts @@ -1002,9 +994,11 @@ local function unpackreferences() end local function analyzefiles(olddata) + if not trace_warnings then report_names("warnings are disabled (tracker 'fonts.warnings')") end + local data = names.data local done = { } local totalnofread = 0 @@ -1020,6 +1014,26 @@ local function analyzefiles(olddata) local oldspecifications = olddata and olddata.specifications or { } local oldrejected = olddata and olddata.rejected or { } local treatmentdata = treatments.data or { } -- when used outside context + ----- walked = setmetatableindex("number") + + local function walk_tree(pathlist,suffix,identify) + if pathlist then + for i=1,#pathlist do + local path = pathlist[i] + path = cleanpath(path .. "/") + path = gsub(path,"/+","/") + local pattern = path .. "**." .. suffix -- ** forces recurse + report_names("globbing path %a",pattern) + local t = dir.glob(pattern) + sort(t,sorter) + for j=1,#t do + local completename = t[j] + identify(completename,basename(completename),suffix,completename) + end + -- walked[path] = walked[path] + #t + end + end + end local function identify(completename,name,suffix,storedname) local pathpart, basepart = splitbase(completename) @@ -1123,6 +1137,7 @@ local function analyzefiles(olddata) end logs.flush() -- a bit overkill for each font, maybe not needed here end + local function traverse(what, method) local list = filters.list for n=1,#list do @@ -1141,7 +1156,9 @@ local function analyzefiles(olddata) end logs.flush() end + -- problem .. this will not take care of duplicates + local function withtree(suffix) resolvers.dowithfilesintree(".*%." .. suffix .. "$", function(method,root,path,name) if method == "file" or method == "tree" then @@ -1158,16 +1175,20 @@ local function analyzefiles(olddata) report_names("%s entries found, %s %s files checked, %s okay",total,checked,suffix,done) end) end + local function withlsr(suffix) -- all trees -- we do this only for a stupid names run, not used for context itself, -- using the vars is too clumsy so we just stick to a full scan instead local pathlist = resolvers.splitpath(resolvers.showpath("ls-R") or "") walk_tree(pathlist,suffix,identify) end + local function withsystem(suffix) -- OSFONTDIR cum suis walk_tree(names.getpaths(trace),suffix,identify) end + traverse("tree",withtree) -- TEXTREE only + if not usesystemfonts then report_names("ignoring system fonts") elseif texconfig.kpse_init then @@ -1175,9 +1196,15 @@ local function analyzefiles(olddata) else traverse("system", withsystem) end + data.statistics.readfiles = totalnofread data.statistics.skippedfiles = totalnofskipped data.statistics.duplicatefiles = totalnofduplicates + + -- for k, v in sortedhash(walked) do + -- report_names("%s : %i",k,v) + -- end + end local function addfilenames() @@ -1492,10 +1519,54 @@ end -- end -- end +local runtimefiles = { } +local runtimedone = false + +local function addruntimepath(path) + names.load() + local paths = type(path) == "table" and path or { path } + local suffixes = tohash(filters.list) + for i=1,#paths do + local path = resolveprefix(paths[i]) + if path ~= "" then + local list = dir.glob(path.."/*") + for i=1,#list do + local fullname = list[i] + local suffix = lower(suffixonly(fullname)) + if suffixes[suffix] then + local c = cleanfilename(fullname) + runtimefiles[c] = fullname + if trace_names then + report_names("adding runtime filename %a for %a",c,fullname) + end + end + end + end + end +end + +local function addruntimefiles(variable) + local paths = variable and resolvers.expandedpathlistfromvariable(variable) + if paths and #paths > 0 then + addruntimepath(paths) + end +end + +names.addruntimepath = addruntimepath +names.addruntimefiles = addruntimefiles + function names.getfilename(askedname,suffix) -- last resort, strip funny chars + if not runtimedone then + addruntimefiles(names.runtimefontsvariable) + runtimedone = true + end + local cleanname = cleanfilename(askedname,suffix) + local found = runtimefiles[cleanname] + if found then + return found + end names.load() local files = names.data.files - local cleanname = cleanfilename(askedname,suffix) local found = files and files[cleanname] or "" if found == "" and is_reloaded() then files = names.data.files diff --git a/tex/context/base/mkiv/font-tfm.lua b/tex/context/base/mkiv/font-tfm.lua index 6584190ce..0059e6296 100644 --- a/tex/context/base/mkiv/font-tfm.lua +++ b/tex/context/base/mkiv/font-tfm.lua @@ -244,6 +244,8 @@ local function read_from_tfm(specification) -- constructors.enhanceparameters(parameters) -- official copies for us -- + properties.private = properties.private or tfmdata.private or privateoffset + -- if newtfmdata then -- -- We do nothing as we assume flat tfm files. It would become real messy @@ -436,7 +438,7 @@ do local originals = tfmdata.characters local indices = { } local parentfont = { "font", 1 } - local private = fonts.constructors.privateoffset + local private = tfmdata or fonts.constructors.privateoffset local reported = encdone[tfmfile][encfile] -- create characters table @@ -514,6 +516,7 @@ do tfmdata.tounicode = 1 tfmdata.embedding = "subset" tfmdata.usedbitmap = bitmap and virtualid + tfmdata.private = private return tfmdata end @@ -548,7 +551,9 @@ end local flushstreamobject = lpdf and lpdf.flushstreamobject local setfontattributes = pdf.setfontattributes - if not flushstreamobject then + if flushstreamobject then + -- we're in context + else flushstreamobject = function(data) return pdf.obj { immediate = true, diff --git a/tex/context/base/mkiv/font-tra.mkiv b/tex/context/base/mkiv/font-tra.mkiv index 38b172ba6..c51ba78fc 100644 --- a/tex/context/base/mkiv/font-tra.mkiv +++ b/tex/context/base/mkiv/font-tra.mkiv @@ -32,7 +32,7 @@ %D The implementation is rather straightforward in using %D \type{\halign}. -\fetchruntimecommand \showbodyfont {\f!fontprefix\s!run} +\fetchruntimecommand \showbodyfont \f!font_run %D \macros %D {showfontstrip, testminimalbaseline, showminimalbaseline} @@ -43,9 +43,9 @@ %D %D \showfontstrip \blank \showminimalbaseline -\fetchruntimecommand \showfontstrip {\f!fontprefix\s!run} -\fetchruntimecommand \testminimalbaseline {\f!fontprefix\s!run} -\fetchruntimecommand \showminimalbaseline {\f!fontprefix\s!run} +\fetchruntimecommand \showfontstrip \f!font_run +\fetchruntimecommand \testminimalbaseline \f!font_run +\fetchruntimecommand \showminimalbaseline \f!font_run %D \macros %D {showkerning} @@ -54,7 +54,7 @@ %D %D \showkerning{Can you guess what kerning is?} -\fetchruntimecommand \showkerning {\f!fontprefix\s!run} +\fetchruntimecommand \showkerning \f!font_run %D \macros %D {showbodyfontenvironment,showfont,showfontstyle,showligatures} @@ -67,7 +67,7 @@ %D %D \showsetup{showbodyfontenvironment} -\fetchruntimecommand \showbodyfontenvironment {\f!fontprefix\s!run} +\fetchruntimecommand \showbodyfontenvironment \f!font_run %D %D The following command generates a fontmap: @@ -79,12 +79,12 @@ %D \typebuffer %D \getbuffer -\fetchruntimecommand \showfont {\f!fontprefix\s!run} -\fetchruntimecommand \showfontstyle {\f!fontprefix\s!run} -\fetchruntimecommand \showligature {\f!fontprefix\s!run} -\fetchruntimecommand \showligatures {\f!fontprefix\s!run} -\fetchruntimecommand \showcharratio {\f!fontprefix\s!run} -\fetchruntimecommand \showfontparameters {\f!fontprefix\s!run} +\fetchruntimecommand \showfont \f!font_run +\fetchruntimecommand \showfontstyle \f!font_run +\fetchruntimecommand \showligature \f!font_run +\fetchruntimecommand \showligatures \f!font_run +\fetchruntimecommand \showcharratio \f!font_run +\fetchruntimecommand \showfontparameters \f!font_run \unexpanded\def\showchardata #1{\ctxcommand{showchardata("#1")}} \unexpanded\def\showfontdata {\ctxcommand{showfontparameters()}} @@ -124,7 +124,18 @@ \unexpanded\def\otfstepcharcommand#1#2#3% font char class {\otfstepspace - \doif{#3}{mark}{\underbar}{U+\hexnumber{#2}}:\ruledhbox{\ctxlua{nodes.tracers.fontchar(#1,#2)}}% + \doif{#3}{mark}{\underbar}{U+\hexnumber{#2}}:% + \setbox\scratchbox\hbox{\ctxlua{nodes.tracers.fontchar(#1,#2)}}% + \ifdim\wd\scratchbox=\zeropoint + \scratchwidth.125\onepoint + \scratchdistance\dimexpr(\emwidth/2-\scratchwidth)\relax + \kern\scratchdistance + \ruledhbox to \scratchwidth{\hss\box\scratchbox\hss}% + \kern-\scratchwidth + \hskip\scratchdistance + \else + \ruledhbox{\box\scratchbox}% + \fi \otfstepspace} \unexpanded\def\otfstepfontcommand#1#2#3% id font size @@ -187,6 +198,41 @@ % \blank}% % \endgroup} +\newconstant\showotfstepsmode \showotfstepsmode\plusfour + +\unexpanded\def\showotfsteps_n + {\blank + \begingroup + \advance\leftskip6\emwidth + \showotfstepmessages\recurselevel + \par + \endgroup + \blank + \dontleavehmode + \hbox to \hsize \bgroup + \hbox to 6\emwidth \bgroup + \bf + \ifnum\recurselevel=\scratchcounter result\else step \recurselevel\fi + \hss + \egroup + \vtop \bgroup + \hsize\dimexpr\hsize-6\emwidth\relax + \resetallattributes + \lefttoright + \dontleavehmode + \ifnum\recurselevel=\scratchcounter + \ruledhbox{\box\otfcompositionbox}% + \else + \ruledhbox{\showotfstepglyphs\recurselevel}% + \fi + \quad + \showotfstepchars\recurselevel + \hfill + \par + \egroup + \egroup + \blank} + \unexpanded\def\showotfsteps {\begingroup \veryraggedright @@ -215,41 +261,28 @@ \blank \scratchcounter\otfnoffeaturesteps\relax \dorecurse\scratchcounter - {\blank - \begingroup - \advance\leftskip6\emwidth - \showotfstepmessages\recurselevel - \par - \endgroup - \blank - \dontleavehmode - \hbox to \hsize \bgroup - \hbox to 6\emwidth \bgroup - \bf - \ifnum\recurselevel=\scratchcounter result\else step \recurselevel\fi - \hss - \egroup - \vtop \bgroup - \hsize\dimexpr\hsize-6\emwidth\relax - \resetallattributes - \pardir TLT\textdir TLT\relax - \dontleavehmode - \ifnum\recurselevel=\scratchcounter - \ruledhbox{\box\otfcompositionbox}% - \else - \ruledhbox{\showotfstepglyphs\recurselevel}% - \fi - \quad - \showotfstepchars\recurselevel - \hfill - \par - \egroup - \egroup - \blank}% + {\ifcase\showotfstepsmode + \or % 1 = only first + \ifnum\recurselevel=\plusone + \showotfsteps_n + \fi + \or % 2 = only last + \ifnum\recurselevel=\scratchcounter + \showotfsteps_n + \fi + \or % 3 = first and last + \ifnum\recurselevel=\plusone + \showotfsteps_n + \else\ifnum\recurselevel=\scratchcounter + \showotfsteps_n + \fi\fi + \else % everything + \showotfsteps_n + \fi}% \endgroup} \unexpanded\def\startotfsample - {\enabletrackers[*otf.sample]% beware, kind of global + {\enabletrackers[otf.sample.silent]% beware, kind of global \startotfcollecting \begingroup \veryraggedright @@ -259,7 +292,7 @@ \unexpanded\def\stopotfsample {\endgroup \stopotfcollecting - \disabletrackers[*otf.sample]% beware, kind of global: otf.sample + \disabletrackers[otf.sample]% beware, kind of global: otf.sample \showotfsteps \resetotfcollecting} @@ -275,6 +308,9 @@ \letvalue{\??otfcompositiondir +1}\lefttoright \letvalue{\??otfcompositiondir 1}\lefttoright +\unexpanded\def\setotfcompositiondirection#1% + {\begincsname\??otfcompositiondir#1\endcsname} + \unexpanded\def\showotfcomposition#1#2#3% {font*features at size}, rl=-1, text {\begingroup \forgetparindent @@ -283,10 +319,45 @@ \setupalign[\v!verytolerant,\v!flushleft]% \startotfsample \nohyphens - \global\setbox\otfcompositionbox\hbox{\definedfont[#1]\relax\getvalue{\??otfcompositiondir#2}\relax#3}% + \global\setbox\otfcompositionbox\hbox{\definedfont[#1]\relax\setotfcompositiondirection{#2}\relax#3}% \stopotfsample \endgroup} +%D \startbuffer +%D \startotfcompositionlist{Serif*default @ 11pt}{l2r}% +%D \showotfcompositionsample{effe} +%D \stopotfcompositionlist +%D \stopbuffer +%D +%D \typebuffer \getbuffer + +\unexpanded\def\showotfcompositionlist#1#2#3% + {\begingroup + \definedfont[#1]% + \setbox\scratchbox\hbox\bgroup + \setotfcompositiondirection{#2}% + #3% + \egroup + \strut + \def|##1|{\kern\onepoint\string|\kern\onepoint##1\kern\onepoint\string|\kern\onepoint}% + \cldcontext{nodes.listtoutf(tex.box[\number\scratchbox].list,"{\\kern\\onepoint}",true)}% + \endgroup} + +\unexpanded\def\startotfcompositionlist#1#2#3\stopotfcompositionlist + {\begingroup + \unexpanded\def\showotfcompositionsample##1% + {\NC\type{##1}% + \NC\showotfcompositionlist{Mono}{#2}{##1}% + \NC\showotfcompositionlist{#1}{#2}{##1}% + \NC\definedfont[#1]##1% + \NC\NR}% + \starttabulate[|||||]% + #3% + \stoptabulate + \endgroup} + +\let\stopotfcompositionlist\relax + % new \unexpanded\def\savefont[#1]% not yet in i-*.xml diff --git a/tex/context/base/mkiv/font-ttf.lua b/tex/context/base/mkiv/font-ttf.lua index 339764d4a..df08787f9 100644 --- a/tex/context/base/mkiv/font-ttf.lua +++ b/tex/context/base/mkiv/font-ttf.lua @@ -33,7 +33,7 @@ if not modules then modules = { } end modules ['font-ttf'] = { -- delta = (1-factor)*left + factor * right local next, type, unpack = next, type, unpack -local bittest, band, rshift = bit32.btest, bit32.band, bit32.rshift +local band, rshift = bit32.band, bit32.rshift local sqrt, round = math.sqrt, math.round local char = string.char local concat = table.concat @@ -698,7 +698,7 @@ local function readglyph(f,nofcontours) -- read deltas here, saves space while i <= nofpoints do local flag = readbyte(f) flags[i] = flag - if bittest(flag,0x08) then + if band(flag,0x08) ~= 0 then for j=1,readbyte(f) do i = i + 1 flags[i] = flag @@ -711,8 +711,8 @@ local function readglyph(f,nofcontours) -- read deltas here, saves space local x = 0 for i=1,nofpoints do local flag = flags[i] - local short = bittest(flag,0x02) - local same = bittest(flag,0x10) + local short = band(flag,0x02) ~= 0 + local same = band(flag,0x10) ~= 0 if short then if same then x = x + readbyte(f) @@ -724,13 +724,13 @@ local function readglyph(f,nofcontours) -- read deltas here, saves space else x = x + readshort(f) end - points[i] = { x, 0, bittest(flag,0x01) } + points[i] = { x, 0, band(flag,0x01) ~= 0 } end local y = 0 for i=1,nofpoints do local flag = flags[i] - local short = bittest(flag,0x04) - local same = bittest(flag,0x20) + local short = band(flag,0x04) ~= 0 + local same = band(flag,0x20) ~= 0 if short then if same then y = y + readbyte(f) @@ -759,19 +759,19 @@ local function readcomposite(f) while true do local flags = readushort(f) local index = readushort(f) - ----- f_words = bittest(flags,0x0001) - local f_xyarg = bittest(flags,0x0002) - ----- f_round = bittest(flags,0x0004+0x0002) - ----- f_scale = bittest(flags,0x0008) - ----- f_reserved = bittest(flags,0x0010) - ----- f_more = bittest(flags,0x0020) - ----- f_xyscale = bittest(flags,0x0040) - ----- f_matrix = bittest(flags,0x0080) - ----- f_instruct = bittest(flags,0x0100) - ----- f_usemine = bittest(flags,0x0200) - ----- f_overlap = bittest(flags,0x0400) - local f_offset = bittest(flags,0x0800) - ----- f_uoffset = bittest(flags,0x1000) + ----- f_words = band(flags,0x0001) ~= 0 + local f_xyarg = band(flags,0x0002) ~= 0 + ----- f_round = band(flags,0x0006) ~= 0 -- 2 + 4 + ----- f_scale = band(flags,0x0008) ~= 0 + ----- f_reserved = band(flags,0x0010) ~= 0 + ----- f_more = band(flags,0x0020) ~= 0 + ----- f_xyscale = band(flags,0x0040) ~= 0 + ----- f_matrix = band(flags,0x0080) ~= 0 + ----- f_instruct = band(flags,0x0100) ~= 0 + ----- f_usemine = band(flags,0x0200) ~= 0 + ----- f_overlap = band(flags,0x0400) ~= 0 + local f_offset = band(flags,0x0800) ~= 0 + ----- f_uoffset = band(flags,0x1000) ~= 0 local xscale = 1 local xrotate = 0 local yrotate = 0 @@ -781,7 +781,7 @@ local function readcomposite(f) local base = false local reference = false if f_xyarg then - if bittest(flags,0x0001) then -- f_words + if band(flags,0x0001) ~= 0 then -- f_words xoffset = readshort(f) yoffset = readshort(f) else @@ -789,7 +789,7 @@ local function readcomposite(f) yoffset = readchar(f) -- signed byte, stupid name end else - if bittest(flags,0x0001) then -- f_words + if band(flags,0x0001) ~= 0 then -- f_words base = readshort(f) reference = readshort(f) else @@ -797,21 +797,21 @@ local function readcomposite(f) reference = readchar(f) -- signed byte, stupid name end end - if bittest(flags,0x0008) then -- f_scale + if band(flags,0x0008) ~= 0 then -- f_scale xscale = read2dot14(f) yscale = xscale if f_xyarg and f_offset then xoffset = xoffset * xscale yoffset = yoffset * yscale end - elseif bittest(flags,0x0040) then -- f_xyscale + elseif band(flags,0x0040) ~= 0 then -- f_xyscale xscale = read2dot14(f) yscale = read2dot14(f) if f_xyarg and f_offset then xoffset = xoffset * xscale yoffset = yoffset * yscale end - elseif bittest(flags,0x0080) then -- f_matrix + elseif band(flags,0x0080) ~= 0 then -- f_matrix xscale = read2dot14(f) xrotate = read2dot14(f) yrotate = read2dot14(f) @@ -824,16 +824,16 @@ local function readcomposite(f) nofcomponents = nofcomponents + 1 components[nofcomponents] = { index = index, - usemine = bittest(flags,0x0200), -- f_usemine - round = bittest(flags,0x0006), -- f_round, + usemine = band(flags,0x0200) ~= 0, -- f_usemine + round = band(flags,0x0006) ~= 0, -- f_round, base = base, reference = reference, matrix = { xscale, xrotate, yrotate, yscale, xoffset, yoffset }, } - if bittest(flags,0x0100) then + if band(flags,0x0100) ~= 0 then instructions = true end - if not bittest(flags,0x0020) then -- f_more + if not band(flags,0x0020) ~= 0 then -- f_more break end end @@ -963,7 +963,7 @@ local function readpoints(f) else if count < 128 then -- no second byte, use count - elseif bittest(count,0x80) then + elseif band(count,0x80) ~= 0 then count = band(count,0x7F) * 256 + readbyte(f) else -- bad news @@ -973,7 +973,7 @@ local function readpoints(f) local n = 1 -- indices while p < count do local control = readbyte(f) - local runreader = bittest(control,0x80) and readushort or readbyte + local runreader = band(control,0x80) ~= 0 and readushort or readbyte local runlength = band(control,0x7F) for i=1,runlength+1 do n = n + runreader(f) @@ -994,12 +994,12 @@ local function readdeltas(f,nofpoints) if not control then break end - local allzero = bittest(control,0x80) + local allzero = band(control,0x80) ~= 0 local runlength = band(control,0x3F) + 1 if allzero then z = z + runlength else - local runreader = bittest(control,0x40) and readshort or readinteger + local runreader = band(control,0x40) ~= 0 and readshort or readinteger if z > 0 then for i=1,z do p = p + 1 @@ -1035,7 +1035,7 @@ local function readdeltas(f,nofpoints) while nofpoints > 0 do local control = readbyte(f) if control then - local allzero = bittest(control,0x80) + local allzero = band(control,0x80) ~= 0 local runlength = band(control,0x3F) + 1 if allzero then for i=1,runlength do @@ -1043,7 +1043,7 @@ local function readdeltas(f,nofpoints) deltas[p] = 0 end else - local runreader = bittest(control,0x40) and readshort or readinteger + local runreader = band(control,0x40) ~= 0 and readshort or readinteger for i=1,runlength do p = p + 1 deltas[p] = runreader(f) @@ -1088,7 +1088,7 @@ function readers.gvar(f,fontdata,specification,glyphdata,shapedata) local dowidth = not fontdata.variabledata.hvarwidths -- there is one more offset (so that one can calculate the size i suppose) -- so we could test for overflows but we simply assume sane font files - if bittest(flags,0x0001) then + if band(flags,0x0001) ~= 0 then for i=1,nofglyphs+1 do data[i] = dataoffset + readulong(f) end @@ -1130,7 +1130,7 @@ function readers.gvar(f,fontdata,specification,glyphdata,shapedata) local allpoints = (shape.nofpoints or 0) -- + 1 local shared = false local nofshared = 0 - if bittest(flags,0x8000) then -- has shared points + if band(flags,0x8000) ~= 0 then -- has shared points -- go to the packed stream (get them once) local current = getposition(f) setposition(f,offset) @@ -1143,9 +1143,9 @@ function readers.gvar(f,fontdata,specification,glyphdata,shapedata) local size = readushort(f) -- check local flags = readushort(f) local index = band(flags,0x0FFF) - local haspeak = bittest(flags,0x8000) - local intermediate = bittest(flags,0x4000) - local private = bittest(flags,0x2000) + local haspeak = band(flags,0x8000) ~= 0 + local intermediate = band(flags,0x4000) ~= 0 + local private = band(flags,0x2000) ~= 0 local peak = nil local start = nil local stop = nil diff --git a/tex/context/base/mkiv/font-unk.mkiv b/tex/context/base/mkiv/font-unk.mkiv index 988e5df3d..4b2615c20 100644 --- a/tex/context/base/mkiv/font-unk.mkiv +++ b/tex/context/base/mkiv/font-unk.mkiv @@ -52,17 +52,19 @@ \definefontsynonym [Handwriting] [unknown] \definefontsynonym [Calligraphic] [unknown] -%D This permit us to define (use) fonts that refer to the default -%D style (so, Bold may expand to SansBold or SerifBold, depending -%D on the default style in the typeface). - -\definefontsynonym[\s!Normal] [\noexpand\v_font_string_d] -\definefontsynonym[\s!Bold] [\noexpand\v_font_string_d\noexpand\s!Bold] -\definefontsynonym[\s!Italic] [\noexpand\v_font_string_d\noexpand\s!Italic] -\definefontsynonym[\s!Slanted] [\noexpand\v_font_string_d\noexpand\s!Slanted] -\definefontsynonym[\s!BoldItalic] [\noexpand\v_font_string_d\noexpand\s!BoldItalic] -\definefontsynonym[\s!BoldSlanted][\noexpand\v_font_string_d\noexpand\s!BoldSlanted] -\definefontsynonym[\s!Caps] [\noexpand\v_font_string_d\noexpand\s!Caps] +%D This permit us to define (use) fonts that refer to the default style (so, Bold +%D may expand to SansBold or SerifBold, depending on the default style in the +%D typeface). The \LUA\ call is used to set the current alternative in a +%D non|-|interfering way. This make sure that the CurrentFont synonym (in font-sym) +%D is working as expected (e.g.\ in MixedCaps). Yes, this is complicates stuff. + +\definefontsynonym[\s!Normal] [\noexpand\clf_tf\noexpand\v_font_string_d] +\definefontsynonym[\s!Bold] [\noexpand\clf_bf\noexpand\v_font_string_d\noexpand\s!Bold] +\definefontsynonym[\s!Italic] [\noexpand\clf_it\noexpand\v_font_string_d\noexpand\s!Italic] +\definefontsynonym[\s!Slanted] [\noexpand\clf_sl\noexpand\v_font_string_d\noexpand\s!Slanted] +\definefontsynonym[\s!BoldItalic] [\noexpand\clf_bi\noexpand\v_font_string_d\noexpand\s!BoldItalic] +\definefontsynonym[\s!BoldSlanted][\noexpand\clf_bs\noexpand\v_font_string_d\noexpand\s!BoldSlanted] +\definefontsynonym[\s!Caps] [\noexpand\clf_tf\noexpand\v_font_string_d\noexpand\s!Caps] %D Also handy: @@ -143,8 +145,7 @@ \definebodyfont [default] [cg] [\s!tf=Calligraphy sa 1] -%D These definitions come into action as soon as names are -%D mapped onto real file names (or names that themselves are -%D mapped). +%D These definitions come into action as soon as names are mapped onto real file +%D names (or names that themselves are mapped). \protect \endinput diff --git a/tex/context/base/mkiv/font-vf.lua b/tex/context/base/mkiv/font-vir.lua index 401e84956..03ad7fc85 100644 --- a/tex/context/base/mkiv/font-vf.lua +++ b/tex/context/base/mkiv/font-vir.lua @@ -1,4 +1,4 @@ -if not modules then modules = { } end modules ['font-vf'] = { +if not modules then modules = { } end modules ['font-vir'] = { version = 1.001, comment = "companion to font-ini.mkiv", author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", @@ -117,7 +117,7 @@ local function combine_assign(g, name, from, to, start, force) for i=from,to do if fc[i] and (force or not gc[i]) then gc[i] = fastcopy(fc[i],true) -- can be optimized - gc[i].commands = { { 'slot', hn, start } } + gc[i].commands = { { "slot", hn, start } } gd[i] = fd[i] end start = start + 1 @@ -144,7 +144,7 @@ local function combine_names(g,name,force) for k, v in next, fc do if force or not gc[k] then gc[k] = fastcopy(v,true) - gc[k].commands = { { 'slot', hn, k } } + gc[k].commands = { { "slot", hn, k } } gd[i] = fd[i] end end diff --git a/tex/context/base/mkiv/good-mth.lua b/tex/context/base/mkiv/good-mth.lua index 661189350..18a97976f 100644 --- a/tex/context/base/mkiv/good-mth.lua +++ b/tex/context/base/mkiv/good-mth.lua @@ -15,6 +15,7 @@ local trace_goodies = false trackers.register("fonts.goodies", function(v) local report_goodies = logs.reporter("fonts","goodies") local registerotffeature = fonts.handlers.otf.features.register + local fontgoodies = fonts.goodies or { } local fontcharacters = fonts.hashes.characters diff --git a/tex/context/base/mkiv/grph-con.lua b/tex/context/base/mkiv/grph-con.lua index 49b5952df..f106e1036 100644 --- a/tex/context/base/mkiv/grph-con.lua +++ b/tex/context/base/mkiv/grph-con.lua @@ -8,6 +8,7 @@ if not modules then modules = { } end modules ['grph-con'] = { local P, R, S, Cc, C, Cs, Ct, lpegmatch = lpeg.P, lpeg.R, lpeg.S, lpeg.Cc, lpeg.C, lpeg.Cs, lpeg.Ct, lpeg.match +local tonumber = tonumber local longtostring = string.longtostring local formatters = string.formatters local expandfilename = dir.expandname diff --git a/tex/context/base/mkiv/grph-epd.lua b/tex/context/base/mkiv/grph-epd.lua index 17f04d593..7855ce891 100644 --- a/tex/context/base/mkiv/grph-epd.lua +++ b/tex/context/base/mkiv/grph-epd.lua @@ -11,20 +11,39 @@ local settings_to_hash = utilities.parsers.settings_to_hash -- todo: page, name, file, url +-- I have some experimental code for including comments and fields but it's +-- unfinished and not included as it was just a proof of concept to get some idea +-- about what is needed and possible. But the placeholders are here already. + local codeinjections = backends.codeinjections -function figures.mergegoodies(optionlist) +local function mergegoodies(optionlist) local options = settings_to_hash(optionlist) - local all = options[variables.all] or options[variables.yes] + local all = options[variables.all] or options[variables.yes] if all or options[variables.reference] then codeinjections.mergereferences() end - if all or options[variables.layer] then - codeinjections.mergeviewerlayers() + if all or options[variables.comment] then + codeinjections.mergecomments() end if all or options[variables.bookmark] then codeinjections.mergebookmarks() end + if all or options[variables.field] then + codeinjections.mergefields() + end + if all or options[variables.layer] then + codeinjections.mergeviewerlayers() + end + codeinjections.flushmergelayer() +end + +function figures.mergegoodies(optionlist) + context.stepwise(function() + -- we use stepwise because we might need to define symbols + -- for stamps that have no default appearance + mergegoodies(optionlist) + end) end interfaces.implement { diff --git a/tex/context/base/mkiv/grph-epd.mkiv b/tex/context/base/mkiv/grph-epd.mkiv index 8152772aa..45c11795b 100644 --- a/tex/context/base/mkiv/grph-epd.mkiv +++ b/tex/context/base/mkiv/grph-epd.mkiv @@ -15,7 +15,7 @@ \unprotect -\registerctxluafile{grph-epd}{1.001} +\registerctxluafile{grph-epd}{} \def\figurereference{\clf_figurestatus{reference}{}} % might become private @@ -43,6 +43,34 @@ \fi \to \externalfigurepostprocessors +\defineframed + [epdfstampsymbol] + [\c!foregroundstyle=\v!mono, + \c!background=\c!color, + \c!rulethickness=.125\exheight, + \c!offset=.250\exheight, + \c!backgroundcolor=lightgray, % can be adapted before first usage + \c!framecolor=darkgray, % can be adapted before first usage + \c!corner=\v!round] + +\definesymbol[Stamped] [\epdfstampsymbol{Stamped}] + +\definesymbol[Approved] [\epdfstampsymbol{Approved}] +\definesymbol[Experimental] [\epdfstampsymbol{Experimental}] +\definesymbol[NotApproved] [\epdfstampsymbol{NotApproved}] +\definesymbol[AsIs] [\epdfstampsymbol{AsIs}] +\definesymbol[Expired] [\epdfstampsymbol{Expired}] +\definesymbol[NotForPublicRelease] [\epdfstampsymbol{NotForPublicRelease}] +\definesymbol[Confidential] [\epdfstampsymbol{Confidential}] +\definesymbol[Final] [\epdfstampsymbol{Final}] +\definesymbol[Sold] [\epdfstampsymbol{Sold}] +\definesymbol[Departmental] [\epdfstampsymbol{Departmental}] +\definesymbol[ForComment] [\epdfstampsymbol{ForComment}] +\definesymbol[TopSecret] [\epdfstampsymbol{TopSecret}] +\definesymbol[Draft] [\epdfstampsymbol{Draft}] +\definesymbol[ForPublicRelease] [\epdfstampsymbol{ForPublicRelease}] + + \protect \endinput % /Properties << /xxxx 22 0 R >> diff --git a/tex/context/base/mkiv/grph-fig.mkiv b/tex/context/base/mkiv/grph-fig.mkiv index 1fdc0caa0..3bf3248a6 100644 --- a/tex/context/base/mkiv/grph-fig.mkiv +++ b/tex/context/base/mkiv/grph-fig.mkiv @@ -67,7 +67,6 @@ \def\grph_buffers_run_indeed[#1][#2]% {\xdef\lasttypesetbuffer{\clf_runbuffer{#1}{#2}}} - % For manuals and such: % % \definetypesetting [name] [options] [settings-a] @@ -99,11 +98,13 @@ \grph_typesetting_process_indeed{}{#2}{#1}{}% \fi\fi\fi} +\defineexternalfigure[typesetting] % so one can set a frame and such + \def\grph_typesetting_process_indeed#1#2#3#4% options settings-a filename settings-b {\begingroup \edef\m_typesetting_name{\clf_runcontextjob{#3}{#1}}% \ifx\m_typesetting_name\empty \else - \expanded{\externalfigure[\m_typesetting_name]}[#2,#4]% + \expanded{\externalfigure[\m_typesetting_name][typesetting]}[#2,#4]% \fi \endgroup} diff --git a/tex/context/base/mkiv/grph-inc.lua b/tex/context/base/mkiv/grph-inc.lua index b5e74b4c1..47eb7bbbb 100644 --- a/tex/context/base/mkiv/grph-inc.lua +++ b/tex/context/base/mkiv/grph-inc.lua @@ -40,14 +40,17 @@ run TeX code from within Lua. Some more functionality will move to Lua. -- todo: store loaded pages per pdf file someplace +local tonumber, tostring, next = tonumber, tostring, next local format, lower, find, match, gsub = string.format, string.lower, string.find, string.match, string.gsub local longtostring = string.longtostring local contains = table.contains +local sortedhash = table.sortedhash local concat, insert, remove = table.concat, table.insert, table.remove local todimen = string.todimen local collapsepath = file.collapsepath local formatters = string.formatters local formatcolumns = utilities.formatters.formatcolumns +local max, odd = math.max, math.odd local P, R, S, Cc, C, Cs, Ct, lpegmatch = lpeg.P, lpeg.R, lpeg.S, lpeg.Cc, lpeg.C, lpeg.Cs, lpeg.Ct, lpeg.match @@ -89,14 +92,8 @@ local trace_usage = false trackers.register ("graphics.usage", func local extra_check = false directives.register("graphics.extracheck", function(v) extra_check = v end) local auto_transform = true directives.register("graphics.autotransform", function(v) auto_transform = v end) -if LUATEXVERSION <= 1 then - auto_transform = false -end - +local report = logs.reporter("graphics") local report_inclusion = logs.reporter("graphics","inclusion") -local report_figures = logs.reporter("system","graphics") -local report_figure = logs.reporter("used graphic") -local report_newline = logs.newline local f_hash_part = formatters["%s->%s->%s->%s"] local f_hash_full = formatters["%s->%s->%s->%s->%s->%s->%s->%s"] @@ -107,7 +104,7 @@ local v_local = variables["local"] local v_default = variables.default local v_auto = variables.auto -local maxdimen = 2^30-1 +local maxdimen = 0x3FFFFFFF -- 2^30-1 local ctx_doscalefigure = context.doscalefigure local ctx_relocateexternalfigure = context.relocateexternalfigure @@ -116,7 +113,9 @@ local ctx_stopfoundexternalfigure = context.stopfoundexternalfigure local ctx_dosetfigureobject = context.dosetfigureobject local ctx_doboxfigureobject = context.doboxfigureobject -function images.check(figure) +-- extensions + +function checkimage(figure) if figure then local width = figure.width local height = figure.height @@ -164,8 +163,6 @@ local function imagetotable(imgtable) return result end -images.totable = imagetotable - function images.serialize(i,...) return table.serialize(imagetotable(i),...) end @@ -184,7 +181,7 @@ end local validsizes = table.tohash(images.boxes()) local validtypes = table.tohash(images.types()) -function images.checksize(size) +local function checkimagesize(size) if size then size = gsub(size,"box","") return validsizes[size] and size or "crop" @@ -193,6 +190,17 @@ function images.checksize(size) end end +local newimage = images.new +local scanimage = images.scan +local copyimage = images.copy +local cloneimage = images.clone +local imagetonode = images.node + +images.check = checkimage +images.checksize = checkimagesize +images.tonode = imagetonode +images.totable = imagetotable + local indexed = { } function images.ofindex(n) @@ -211,6 +219,7 @@ figures.defaultwidth = 0 figures.defaultheight = 0 figures.defaultdepth = 0 figures.nofprocessed = 0 +figures.nofmissing = 0 figures.preferquality = true -- quality over location local figures_loaded = allocate() figures.loaded = figures_loaded @@ -305,31 +314,38 @@ function figures.badname(name) end end -luatex.registerstopactions(function() +logs.registerfinalactions(function() + local done = false if trace_usage and figures.nofprocessed > 0 then - logs.pushtarget("logfile") - report_newline() - report_figures("start names") - for _, data in table.sortedhash(figures_found) do - report_newline() - report_figure("asked : %s",data.askedname) + logs.startfilelogging(report,"names") + for _, data in sortedhash(figures_found) do + if done then + report() + else + done = true + end + report("asked : %s",data.askedname) if data.found then - report_figure("format : %s",data.format) - report_figure("found : %s",data.foundname) - report_figure("used : %s",data.fullname) + report("format : %s",data.format) + report("found : %s",data.foundname) + report("used : %s",data.fullname) if data.badname then - report_figure("comment : %s","bad name") + report("comment : %s","bad name") elseif data.comment then - report_figure("comment : %s",data.comment) + report("comment : %s",data.comment) end else - report_figure("comment : %s","not found") + report("comment : %s","not found") end end - report_newline() - report_figures("stop names") - report_newline() - logs.poptarget() + logs.stopfilelogging() + end + if figures.nofmissing > 0 and logs.loggingerrors() then + logs.starterrorlogging(report,"missing figures") + for _, data in sortedhash(figures_found) do + report("%w%s",6,data.askedname) + end + logs.stoperrorlogging() end end) @@ -542,11 +558,13 @@ function figures.initialize(request) -- can be determined; at some point the handlers might set them to numbers instead local w = tonumber(request.width) or 0 local h = tonumber(request.height) or 0 + local p = tonumber(request.page) or 0 request.width = w > 0 and w or nil request.height = h > 0 and h or nil -- - request.page = math.max(tonumber(request.page) or 1,1) - request.size = images.checksize(request.size) + request.page = p > 0 and p or 1 + request.keepopen = p > 0 + request.size = checkimagesize(request.size) request.object = request.object == v_yes request["repeat"] = request["repeat"] == v_yes request.preview = request.preview == v_yes @@ -844,6 +862,9 @@ local function register(askedname,specification) specification.arguments or "" ) figures_found[askedhash] = specification + if not specification.found then + figures.nofmissing = figures.nofmissing + 1 + end return specification end @@ -896,7 +917,6 @@ local function locate(request) -- name, format, cache askedname = path end else - -- local fname = methodhandler('finders',pathname .. "/" .. wantedfiles[k]) local foundname = resolvers.findbinfile(askedname) if not foundname or not lfs.isfile(foundname) then -- foundname can be dummy if trace_figures then @@ -1187,7 +1207,7 @@ statistics.register("used graphics",function() local filename = file.nameonly(environment.jobname) .. "-figures-usage.lua" if next(figures_found) then local found = { } - for _, data in table.sortedhash(figures_found) do + for _, data in sortedhash(figures_found) do found[#found+1] = data for k, v in next, data do if v == false or v == "" then @@ -1259,7 +1279,7 @@ function figures.done(data) ds.yscale = 1 end -- sort of redundant but can be limited - ds.page = ds.page or du.page or dr.page + ds.page = ds.page or du.page or dr.page return data end @@ -1331,7 +1351,7 @@ local function checktransform(figure,forced) local orientation = (forced ~= "" and forced ~= v_auto and forced) or figure.orientation or 0 local transform = transforms["orientation-"..orientation] figure.transform = transform - if math.odd(transform) then + if odd(transform) then return figure.height, figure.width else return figure.width, figure.height @@ -1339,6 +1359,8 @@ local function checktransform(figure,forced) end end +local pagecount = { } + function checkers.generic(data) local dr, du, ds = data.request, data.used, data.status local name = du.fullname or "unknown generic" @@ -1370,16 +1392,27 @@ function checkers.generic(data) ) local figure = figures_loaded[hash] if figure == nil then - figure = images.new { + figure = newimage { filename = name, page = page, pagebox = dr.size, + keepopen = dr.keepopen or false, -- visiblefilename = "", -- this prohibits the full filename ending up in the file } codeinjections.setfigurecolorspace(data,figure) codeinjections.setfiguremask(data,figure) if figure then - local f, comment = images.check(images.scan(figure)) + -- new, bonus check + if page and page > 1 then + local f = scanimage{ filename = name } + if f.page and f.pages < page then + report_inclusion("no page %i in %a, using page 1",page,name) + page = 1 + figure.page = page + end + end + -- till here + local f, comment = checkimage(scanimage(figure)) if not f then ds.comment = comment ds.found = false @@ -1441,8 +1474,8 @@ function includers.generic(data) if figure == nil then figure = ds.private if figure then - figure = images.copy(figure) - figure = figure and images.clone(figure,data.request) or false + figure = copyimage(figure) + figure = figure and cloneimage(figure,data.request) or false end figures_used[hash] = figure end @@ -1450,13 +1483,13 @@ function includers.generic(data) local nr = figures.boxnumber nofimages = nofimages + 1 ds.pageindex = nofimages - local image = images.node(figure) + local image = imagetonode(figure) local pager = new_latelua(function() pofimages[nofimages] = pofimages[nofimages] or tex.count.realpageno -- so when reused we register the first one only end) image.next = pager pager.prev = image - local box = hpack(image) -- images.node(figure) not longer valid + local box = hpack(image) -- imagetonode(figure) not longer valid indexed[figure.index] = figure box.width, box.height, box.depth = figure.width, figure.height, 0 -- new, hm, tricky, we need to do that in tex (yet) @@ -1775,7 +1808,7 @@ end local function bases_locate(askedlabel) for i=1,#bases_list do local entry = bases_list[i] - local t = bases_find(entry[1],askedlabel) + local t = bases_find(entry[1],askedlabel,1,true) if t then return t end @@ -1865,11 +1898,39 @@ end -- end, -- } --- local fig = figures.push { name = pdffile } --- figures.identify() --- figures.check() --- local nofpages = fig.used.pages --- figures.pop() +-- local n = "foo.pdf" +-- local d = figures.getinfo(n) +-- if d then +-- for i=1,d.used.pages do +-- local p = figures.getinfo(n,i) +-- if p then +-- local u = p.used +-- print(u.width,u.height,u.orientation) +-- end +-- end +-- end + +function figures.getinfo(name,page) + if type(name) == "string" then + name = { name = name, page = page } + end + if name.name then + local data = figures.push(name) + figures.identify() + figures.check() + figures.pop() + return data + end +end + +function figures.getpdfinfo(name,page,metadata) + -- not that useful but as we have it for detailed inclusion we can as + -- we expose it + if type(name) ~= "table" then + name = { name = name, page = page, metadata = metadata } + end + return codeinjections.getinfo(name) +end -- interfacing @@ -1882,6 +1943,7 @@ implement { { "name" }, { "label" }, { "page" }, + { "file" }, { "size" }, { "object" }, { "prefix" }, @@ -1950,7 +2012,7 @@ local registered = { } local ctx_doexternalfigurerepeat = context.doexternalfigurerepeat -interfaces.implement { +implement { name = "figure_register_page", arguments = { "string", "string", "string" }, actions = function(a,b,c) @@ -1959,14 +2021,14 @@ interfaces.implement { end } -interfaces.implement { +implement { name = "figure_nof_registered_pages", actions = function() context(#registered) end } -interfaces.implement { +implement { name = "figure_flush_registered_pages", arguments = "string", actions = function(n) diff --git a/tex/context/base/mkiv/grph-inc.mkiv b/tex/context/base/mkiv/grph-inc.mkiv index 25058b3f7..677883fbb 100644 --- a/tex/context/base/mkiv/grph-inc.mkiv +++ b/tex/context/base/mkiv/grph-inc.mkiv @@ -20,12 +20,12 @@ \writestatus{loading}{ConTeXt Graphic Macros / Figure Inclusion} -\registerctxluafile{grph-inc}{1.001} -\registerctxluafile{grph-con}{1.001} -\registerctxluafile{grph-fil}{1.001} -\registerctxluafile{grph-mem}{1.001} -\registerctxluafile{grph-u3d}{1.001} % this will change -\registerctxluafile{grph-swf}{1.001} % this will change +\registerctxluafile{grph-inc}{} +\registerctxluafile{grph-con}{} +\registerctxluafile{grph-fil}{} +\registerctxluafile{grph-mem}{} +\registerctxluafile{grph-u3d}{} % this will become a module +\registerctxluafile{grph-swf}{} % this will become a module \unprotect @@ -56,6 +56,7 @@ \c!prefix =, \c!cache =, \c!page =\zerocount, + \c!file =, \c!display =, \c!mask =, \c!preset =\v!yes, @@ -65,8 +66,8 @@ \c!symbol =\v!no, \c!controls =\v!no, \c!resources =, - \c!preview =\v!no - \c!repeat =\v!no + \c!preview =\v!no, + \c!repeat =\v!no, \c!foregroundcolor=, \c!interaction =\v!none, \c!hfactor =, @@ -113,19 +114,19 @@ \newtoks \everyexternalfigureresets % for the moment still public \newtoks \everyexternalfigurechecks % for the moment still public -% \useexternalfigure[alpha][koe] -% \useexternalfigure[beta] [koe] [breedte=1cm] -% \useexternalfigure[gamma][koe][alpha] -% \useexternalfigure[delta][koe][alpha][breedte=2cm] +% \useexternalfigure[alpha][cow] +% \useexternalfigure[beta] [cow] [width=1cm] +% \useexternalfigure[gamma][cow][alpha] +% \useexternalfigure[delta][cow][alpha][width=2cm] % -% volle breedte: \externalfigure[koe] \par -% 3cm breed: \externalfigure[koe] [breedte=3cm] \par -% volle breedte: \externalfigure[alpha] \par -% 1cm breed: \externalfigure[beta] \par -% volle breedte: \externalfigure[gamma] \par -% 2cm breed: \externalfigure[delta] \par -% 4cm breed: \externalfigure[beta] [breedte=4cm] \par -% 5cm breed: \externalfigure[gamma][breedte=5cm] \par +% full width : \externalfigure[cow] \par +% 3cm width : \externalfigure[cow] [width=3cm] \par +% full width : \externalfigure[alpha] \par +% 1cm width : \externalfigure[beta] \par +% full width : \externalfigure[gamma] \par +% 2cm width : \externalfigure[delta] \par +% 4cm width : \externalfigure[beta] [width=4cm] \par +% 5cm width : \externalfigure[gamma][width=5cm] \par % % \defineexternalfigure[a][width=10cm] % \defineexternalfigure[b][width=5cm] @@ -153,14 +154,13 @@ % % \defineexternalfigure[name][settings] -%D Defining is persistent, i.e.\ when you redefine an instance, -%D the already set parameters need to be set again or otherwise -%D the old values will be used. - +%D Defining is persistent, i.e.\ when you redefine an instance, the already set +%D parameters need to be set again or otherwise the old values will be used. +%D %D New: \type {method=auto}: strips suffix and uses \quote {order} which is handy in -%D some of four workflows where sources are used for web and print and where -%D the web tools need a suffix (like gif) which we don't want as we want a high -%D quality format. +%D some of four workflows where sources are used for web and print and where the web +%D tools need a suffix (like gif) which we don't want as we want a high quality +%D format. \newconditional\c_grph_include_trace_inheritance @@ -320,6 +320,7 @@ name {\p_grph_include_name}% label {\ifx\p_label\empty\p_grph_include_label\else\p_label\fi}% page {\externalfigureparameter\c!page}% + file {\externalfigureparameter\c!file}% size {\externalfigureparameter\c!size}% object {\externalfigureparameter\c!object}% prefix {\externalfigureparameter\c!prefix}% @@ -703,8 +704,6 @@ \letexternalfigureparameter\c!offset\v!overlay \letexternalfigureparameter\c!width \figurewidth \letexternalfigureparameter\c!height\figureheight -% \letexternalfigureparameter\c!align \v!middle -% \letexternalfigureparameter\c!autowidth\v!no \inheritedexternalfigureframed{\box\foundexternalfigure}% \fi \fi\fi @@ -857,9 +856,6 @@ % \eTABLE % \stoptext -\unexpanded\def\showexternalfigures - {\writestatus\m!system{the \string\showexternalfigures\space command is not (yet) implemented in mkiv}} - \unexpanded\def\overlayfigure#1% {\externalfigure[#1][\c!width=\d_overlay_width,\c!height=\d_overlay_height]} @@ -876,18 +872,28 @@ [\v!inline] [\c!height=\lineheight] -\defineexternalfigure +\definemeasure [\v!combination] - [\c!width=\dimexpr(% - \textwidth-\effectiveleftskip-\effectiverightskip + [(\textwidth + -\effectiveleftskip + -\effectiverightskip -\numexpr\combinationparameter\c!nx-\plusone\relax\dimexpr\combinationparameter\c!distance\relax - )/\combinationparameter\c!nx\relax] + )/\combinationparameter\c!nx] + +\defineexternalfigure + [\v!combination] + [\c!width=\measure{\v!combination}] % \startcombination[nx=2,ny=1] % {\externalfigure[dummy][combination]} {} % {\externalfigure[dummy][combination]} {} % \stopcombination +% \startcombination[nx=2,ny=1] +% {\externalfigure[dummy][width=\measure{combination}]} {} +% {\externalfigure[dummy][width=\measure{combination}]} {} +% \stopcombination + % \startcombination[nx=2,ny=2] % {\externalfigure[dummy][combination]} {} % {\externalfigure[dummy][combination]} {} @@ -912,9 +918,10 @@ \protect \endinput -% Moved here because this already old code is nowhere documents (so I need to -% check it: +%D Moved here because this already old code is nowhere documents (so I need to check +%D it: % +% \starttyping % \starttext % % \startluaparameterset [u3d:myset:controls:1] diff --git a/tex/context/base/mkiv/grph-pat.lua b/tex/context/base/mkiv/grph-pat.lua index c5e4b9f64..89b29906d 100644 --- a/tex/context/base/mkiv/grph-pat.lua +++ b/tex/context/base/mkiv/grph-pat.lua @@ -37,7 +37,7 @@ interfaces.implement { if not name or name == "" then return end - nodes.handlers.finalize(box) + nodes.handlers.finalize(box,"object") names[name] = lpdf.registerpattern { number = number, width = specification.width or box.width, diff --git a/tex/context/base/mkiv/grph-pat.mkiv b/tex/context/base/mkiv/grph-pat.mkiv index 0126647cc..c5f5fe7cf 100644 --- a/tex/context/base/mkiv/grph-pat.mkiv +++ b/tex/context/base/mkiv/grph-pat.mkiv @@ -22,7 +22,7 @@ \unprotect -\registerctxluafile{grph-pat}{1.001} +\registerctxluafile{grph-pat}{} \unexpanded\def\registerpattern {\begingroup diff --git a/tex/context/base/mkiv/grph-raw.mkiv b/tex/context/base/mkiv/grph-raw.mkiv index 8978ba267..4029c7cbd 100644 --- a/tex/context/base/mkiv/grph-raw.mkiv +++ b/tex/context/base/mkiv/grph-raw.mkiv @@ -39,7 +39,7 @@ %D draw textext("\bitmapimage[x=200,y=50]{\TestBitmap{50}{200}}") xsized 10cm ; %D \stopMPcode -\registerctxluafile{grph-raw}{1.001} +\registerctxluafile{grph-raw}{} \unprotect diff --git a/tex/context/base/mkiv/grph-rul.lua b/tex/context/base/mkiv/grph-rul.lua index e3d1d8963..03f678973 100644 --- a/tex/context/base/mkiv/grph-rul.lua +++ b/tex/context/base/mkiv/grph-rul.lua @@ -6,6 +6,8 @@ if not modules then modules = { } end modules ['grph-rul'] = { license = "see context related readme files" } +local tonumber, next, type = tonumber, next, type + local attributes = attributes local nodes = nodes local context = context @@ -127,13 +129,17 @@ end do - local f_rectangle = formatters["%F w %F %F %F %F re %s"] + -- maybe %.6F + + local f_rectangle = formatters["%.6F w %.6F %.6F %.6F %.6F re %s"] + local f_baselined = formatters["%.6F w %.6F %.6F %.6F %.6F re s %.6F %.6F m %.6F %.6F l s"] + local f_dashlined = formatters["%.6F w %.6F %.6F %.6F %.6F re s [%.6F %.6F] 2 d %.6F %.6F m %.6F %.6F l s"] local f_radtangle = formatters[ [[ - %F w %F %F m - %F %F l %F %F %F %F y - %F %F l %F %F %F %F y - %F %F l %F %F %F %F y - %F %F l %F %F %F %F y + %.6F w %.6F %.6F m + %.6F %.6F l %.6F %.6F %.6F %.6F y + %.6F %.6F l %.6F %.6F %.6F %.6F y + %.6F %.6F l %.6F %.6F %.6F %.6F y + %.6F %.6F l %.6F %.6F %.6F %.6F y h %s ]] ] @@ -160,6 +166,30 @@ do ruleactions.draw = ruleactions.fill ruleactions.stroke = ruleactions.fill + local getwhd = nodes.nuts.getwhd + + ruleactions.box = function(p,h,v,i,n) + local w, h, d = getwhd(n) + local line = p.line or 65536 + local l = line *bpfactor + local w = w * bpfactor + local h = h * bpfactor + local d = d * bpfactor + local o = l / 2 + if (d >= 0 and h >= 0) or (d <= 0 and h <= 0) then + local dashed = tonumber(p.dashed) + if dashed and dashed > 5*line then + dashed = dashed * bpfactor + local delta = (w - 2*dashed*floor(w/(2*dashed)))/2 + pdfprint("direct",f_dashlined(l,o,o,w-l,h+d-l,dashed,dashed,delta,d,w-delta,d)) + else + pdfprint("direct",f_baselined(l,o,o,w-l,h+d-l,0,d,w,d)) + end + else + pdfprint("direct",f_rectangle(l,o,o,w-l,h+d-l)) + end + end + end interfaces.implement { diff --git a/tex/context/base/mkiv/grph-rul.mkiv b/tex/context/base/mkiv/grph-rul.mkiv index 98aab3650..cdf39ae42 100644 --- a/tex/context/base/mkiv/grph-rul.mkiv +++ b/tex/context/base/mkiv/grph-rul.mkiv @@ -13,7 +13,7 @@ \writestatus{loading}{ConTeXt Graphic Macros / Rule Trickery} -\registerctxluafile{grph-rul}{1.001} +\registerctxluafile{grph-rul}{} \unprotect diff --git a/tex/context/base/mkiv/grph-swf.lua b/tex/context/base/mkiv/grph-swf.lua index 8c28b76af..30089cdc4 100644 --- a/tex/context/base/mkiv/grph-swf.lua +++ b/tex/context/base/mkiv/grph-swf.lua @@ -84,6 +84,7 @@ function figures.checkers.swf(data) controls = dr.controls, -- label = dr.label, resources = dr.resources, + arguments = dr.arguments, } context.stopfoundexternalfigure() return data diff --git a/tex/context/base/mkiv/grph-trf.mkiv b/tex/context/base/mkiv/grph-trf.mkiv index 099efa114..6bd0e65cc 100644 --- a/tex/context/base/mkiv/grph-trf.mkiv +++ b/tex/context/base/mkiv/grph-trf.mkiv @@ -15,16 +15,14 @@ \unprotect -%D We probably use too many dimens as the width calculations can -%D go away. Some of this is an inheritance of limited backends -%D (some supported fractions, some 1000's, some dimentions) so -%D we calculate all of them. Nowadays scaling is always available -%D so we could simplify the code. On the other hand, we now get -%D some extra values for free. +%D We probably use too many dimens as the width calculations can go away. Some of +%D this is an inheritance of limited backends (some supported fractions, some +%D 1000's, some dimentions) so we calculate all of them. Nowadays scaling is always +%D available so we could simplify the code. On the other hand, we now get some extra +%D values for free. %D -%D We could move the calculations to \LUA\ and clean up this -%D lot anyway. On the other hand, there is some danger of messing -%D up so it has a real low priority. +%D We could move the calculations to \LUA\ and clean up this lot anyway. On the +%D other hand, there is some danger of messing up so it has a real low priority. % local: @@ -40,6 +38,8 @@ \newconditional\c_grph_scale_scaling_done \newconditional\c_grph_scale_limit_factors \settrue\c_grph_scale_limit_factors +\newconditional\c_grph_scale_swap_factor + \newdimen\d_grph_scale_wd \newdimen\d_grph_scale_ht \newdimen\d_grph_scale_dp @@ -75,6 +75,7 @@ \installcorenamespace{scale} \installcorenamespace{scalegrid} \installcorenamespace{scalenorm} +\installcorenamespace{scalefact} \installcommandhandler \??scale {scale} \??scale % we can have instances @@ -99,8 +100,6 @@ \unexpanded\def\scale{\dodoubleempty\grph_scale} -% we could have: \freezeparameter\c!scale etc (less backtracking when used multiple) - \def\grph_scale[#1][#2]% {\bgroup % this is quite common so we might make this a helper @@ -223,42 +222,6 @@ \let\grph_scale_calculations_report\relax -% \def\grph_scale_calculations_report -% {\writestatus -% {scaled}% -% {wd:\finalscaleboxwidth,ht:\finalscaleboxheight -% ,xscale:\finalscaleboxxscale,yscale:\finalscaleboxyscale}} - -% \def\grph_scale_calculations_yes -% {\settrue\c_grph_scale_done -% % initial values -% \d_grph_scale_x_offset\zeropoint -% \d_grph_scale_y_offset\zeropoint -% \d_grph_scale_x_size \d_grph_scale_wd -% \d_grph_scale_y_size \d_grph_scale_ht % alleen ht wordt geschaald! -% % final values -% \global\d_grph_scale_used_x_size \zeropoint % see note * (core-fig) -% \global\d_grph_scale_used_y_size \zeropoint % see note * (core-fig) -% \c_grph_scale_used_x_scale \plusone % see note * (core-fig) -% \c_grph_scale_used_y_scale \plusone % see note * (core-fig) -% \let\m_grph_scale_used_x_scale \!!plusone -% \let\m_grph_scale_used_y_scale \!!plusone -% % preparations -% \setfalse\c_grph_scale_scaling_done -% \grph_scale_check_parameters -% % calculators -% % beware, they operate in sequence, and calculate missing dimensions / messy -% % grph_scale_by_nature % when? needed? -% \ifconditional\c_grph_scale_scaling_done\else\grph_scale_by_factor \fi -% \ifconditional\c_grph_scale_scaling_done\else\grph_scale_by_scale \fi -% \ifconditional\c_grph_scale_scaling_done\else\grph_scale_by_dimension\fi -% % used in actual scaling -% \xdef\finalscaleboxwidth {\the\d_grph_scale_used_x_size}% -% \xdef\finalscaleboxheight {\the\d_grph_scale_used_y_size}% -% \xdef\finalscaleboxxscale {\luaexpr{\number\c_grph_scale_used_x_scale/1000}}% -% \xdef\finalscaleboxyscale {\luaexpr{\number\c_grph_scale_used_y_scale/1000}}% -% \grph_scale_calculations_report} - \def\grph_scale_calculations_yes {\settrue\c_grph_scale_done % initial values @@ -315,7 +278,19 @@ % \placefigure{none}{\rotate[frame=on,offset=overlay]{\externalfigure[t:/sources/cow.pdf][width-6]}} \page % \placefigure{none}{\framed[frame=on,offset=overlay]{\externalfigure[t:/sources/cow.pdf][width-7]}} -\def\m_grph_scale_factor_set{\v!max,\v!fit,\v!broad,\v!auto} % can be an \edef +%D The \typpe {min} option makes sure that the smallest available space determines +%D the max size (so we can get a bleed on the other axis): +%D +%D \startlinecorrection +%D \startcombination[nx=2,ny=2,distance=4cm] +%D {\externalfigure[hacker][factor=max,maxwidth=6cm,maxheight=6cm]} {} +%D {\externalfigure[mill] [factor=max,maxwidth=6cm,maxheight=6cm]} {} +%D {\externalfigure[hacker][factor=min,maxwidth=6cm,maxheight=6cm]} {} +%D {\externalfigure[mill] [factor=min,maxwidth=6cm,maxheight=6cm]} {} +%D \stopcombination +%D \stoplinecorrection + +\def\m_grph_scale_factor_set{\v!min,\v!max,\v!fit,\v!broad,\v!auto} % can be an \edef \def\grph_scale_by_factor {\doifelseinset\p_factor\m_grph_scale_factor_set @@ -326,37 +301,9 @@ \grph_scale_by_factor_c \grph_scale_by_factor_d}}} -% \def\grph_scale_by_factor_a -% {\grph_scale_apply_size -% \ifdim\d_grph_scale_x_size>\d_grph_scale_y_size -% \grph_scale_calculate_norm \d_grph_scale_used_x_size\p_factor\p_maxwidth\hsize\d_grph_scale_h_size -% \grph_scale_calculate_scales\d_grph_scale_used_x_size\d_grph_scale_x_size\d_grph_scale_used_y_size\d_grph_scale_y_size -% \else -% \grph_scale_calculate_norm \d_grph_scale_used_y_size\p_factor\p_maxheight\d_grph_scale_outer_v_size\d_grph_scale_v_size -% \grph_scale_calculate_scales\d_grph_scale_used_y_size\d_grph_scale_y_size\d_grph_scale_used_x_size\d_grph_scale_x_size -% \fi -% \grph_scale_by_factor_indeed} -% -% \def\grph_scale_by_factor_b -% {\grph_scale_apply_size -% \grph_scale_calculate_norm \d_grph_scale_used_y_size\p_hfactor\p_maxheight\d_grph_scale_outer_v_size\d_grph_scale_v_size -% \grph_scale_calculate_scales\d_grph_scale_used_y_size\d_grph_scale_y_size\d_grph_scale_used_x_size\d_grph_scale_x_size -% \grph_scale_by_factor_indeed} -% -% \def\grph_scale_by_factor_c -% {\grph_scale_apply_size -% \grph_scale_calculate_norm \d_grph_scale_used_x_size\p_wfactor\p_maxwidth\hsize\d_grph_scale_h_size -% \grph_scale_calculate_scales\d_grph_scale_used_x_size\d_grph_scale_x_size\d_grph_scale_used_y_size\d_grph_scale_y_size -% \grph_scale_by_factor_indeed} -% -% \def\grph_scale_by_factor_d -% {\grph_scale_calculate_norm\d_grph_scale_used_y_size\p_factor \p_height \textheight\d_grph_scale_v_size -% \grph_scale_calculate_norm\d_grph_scale_used_y_size\p_hfactor\p_height \textheight\d_grph_scale_v_size -% \grph_scale_calculate_norm\d_grph_scale_used_x_size\p_wfactor\p_width \hsize \hsize} - \def\grph_scale_by_factor_a {\grph_scale_apply_size - \ifdim\d_grph_scale_x_size>\d_grph_scale_y_size + \ifdim\d_grph_scale_x_size >\d_grph_scale_y_size \grph_scale_calculate_norm \d_grph_scale_used_x_size\p_factor\p_maxwidth\hsize\d_grph_scale_h_size \grph_scale_calculate_scales\d_grph_scale_used_x_size\d_grph_scale_x_size \d_grph_scale_used_y_size\m_grph_scale_used_x_scale\d_grph_scale_y_size @@ -387,39 +334,19 @@ \grph_scale_calculate_norm\d_grph_scale_used_x_size\p_wfactor\p_width \hsize \hsize} \def\grph_scale_by_factor_indeed - {\settrue\c_grph_scale_scaling_done + {\grph_scale_calculate_fact\p_factor + \settrue\c_grph_scale_scaling_done \ifconditional\c_grph_scale_limit_factors - \ifdim\d_grph_scale_used_x_size>\d_grph_scale_h_size + \ifdim\d_grph_scale_used_x_size\ifconditional\c_grph_scale_swap_factor<\else>\fi\d_grph_scale_h_size \global\d_grph_scale_used_y_size\zeropoint \global\d_grph_scale_used_x_size\d_grph_scale_h_size - \else\ifdim\d_grph_scale_used_y_size>\d_grph_scale_v_size + \else\ifdim\d_grph_scale_used_y_size\ifconditional\c_grph_scale_swap_factor<\else>\fi\d_grph_scale_v_size \global\d_grph_scale_used_x_size\zeropoint \global\d_grph_scale_used_y_size\d_grph_scale_v_size \fi\fi \fi \grph_scale_by_dimension} -% \def\grph_scale_by_scale -% {\edef\m_grph_scale_temp{\p_scale\p_xscale\p_yscale}% -% \ifx\m_grph_scale_temp\empty \else -% \grph_scale_apply_scale\d_grph_scale_used_x_size\d_grph_scale_x_size\c_grph_scale_used_x_scale\p_xscale -% \grph_scale_apply_scale\d_grph_scale_used_y_size\d_grph_scale_y_size\c_grph_scale_used_y_scale\p_yscale -% \global\d_grph_scale_used_x_size\zeropoint -% \global\d_grph_scale_used_y_size\zeropoint -% \ifx\p_maxwidth\empty -% \ifx\p_maxheight\empty -% \else -% \ifdim\d_grph_scale_y_size>\p_maxheight\relax -% \global\d_grph_scale_used_y_size\p_maxheight -% \fi -% \fi -% \else -% \ifdim\d_grph_scale_x_size>\p_maxwidth\relax -% \global\d_grph_scale_used_x_size\p_maxwidth -% \fi -% \fi -% \fi} - \def\grph_scale_by_scale {\edef\m_grph_scale_temp{\p_scale\p_xscale\p_yscale}% \ifx\m_grph_scale_temp\empty \else @@ -460,34 +387,6 @@ \fi \fi} -% \def\grph_scale_by_dimension_a -% {\grph_scale_by_dimension_indeed -% {\grph_scale_calculate_scale\d_grph_scale_used_y_size\d_grph_scale_y_size\c_grph_scale_used_y_scale -% \grph_scale_calculate_scale\d_grph_scale_used_x_size\d_grph_scale_x_size\c_grph_scale_used_x_scale}% -% {\grph_scale_calculate_scale\d_grph_scale_used_y_size\d_grph_scale_y_size\c_grph_scale_used_y_scale -% \grph_scale_calculate_scale\d_grph_scale_used_x_size\d_grph_scale_x_size\c_grph_scale_used_x_scale}% -% {\grph_scale_calculate_scale\d_grph_scale_used_y_size\d_grph_scale_y_size\c_grph_scale_used_y_scale -% \grph_scale_calculate_scale\d_grph_scale_used_x_size\d_grph_scale_x_size\c_grph_scale_used_x_scale}} -% -% \def\grph_scale_by_dimension_b -% {\grph_scale_by_dimension_indeed -% {\grph_scale_calculate_scales\d_grph_scale_used_x_size\d_grph_scale_x_size\d_grph_scale_used_y_size\d_grph_scale_y_size}% -% {\grph_scale_calculate_scales\d_grph_scale_used_x_size\d_grph_scale_x_size\d_grph_scale_used_y_size\d_grph_scale_y_size}% -% {\grph_scale_calculate_scales\d_grph_scale_used_x_size\d_grph_scale_x_size\d_grph_scale_used_y_size\d_grph_scale_y_size}} -% -% \def\grph_scale_by_dimension_c -% {\grph_scale_by_dimension_indeed -% {\grph_scale_calculate_scales\d_grph_scale_used_y_size\d_grph_scale_y_size\d_grph_scale_used_x_size\d_grph_scale_x_size}% -% {\grph_scale_calculate_scales\d_grph_scale_used_y_size\d_grph_scale_y_size\d_grph_scale_used_x_size\d_grph_scale_x_size}% -% {\grph_scale_calculate_scales\d_grph_scale_used_y_size\d_grph_scale_y_size\d_grph_scale_used_x_size\d_grph_scale_x_size}} -% -% \def\grph_scale_by_dimension_d -% {\grph_scale_by_dimension_indeed -% {\grph_scale_apply_scale\d_grph_scale_used_x_size\d_grph_scale_x_size\c_grph_scale_used_x_scale\p_xscale -% \grph_scale_apply_scale\d_grph_scale_used_y_size\d_grph_scale_y_size\c_grph_scale_used_y_scale\p_yscale}% -% {\grph_scale_calculate_scales\d_grph_scale_used_x_size\d_grph_scale_x_size\d_grph_scale_used_y_size\d_grph_scale_y_size}% -% {\grph_scale_calculate_scales\d_grph_scale_used_y_size\d_grph_scale_y_size\d_grph_scale_used_x_size\d_grph_scale_x_size}} - \def\grph_scale_by_dimension_a {\grph_scale_by_dimension_indeed {\grph_scale_calculate_scale\m_grph_scale_used_y_scale\d_grph_scale_used_y_size\d_grph_scale_y_size @@ -544,6 +443,10 @@ \def\grph_scale_calculate_norm#1#2% todo: swap 1 and 2 and pass one less {\csname\??scalenorm\ifcsname\??scalenorm#2\endcsname#2\else\s!unknown\fi\endcsname#1#2} +\def\grph_scale_calculate_fact#1% + {\csname\??scalefact\ifcsname\??scalefact#1\endcsname#1\else\s!unknown\fi\endcsname} + +%setvalue{\??scalenorm\v!min }#1#2#3#4#5{\global#1#4} \setvalue{\??scalenorm\v!max }#1#2#3#4#5{\global#1#4} \setvalue{\??scalenorm\v!fit }#1#2#3#4#5{\global#1#5} \setvalue{\??scalenorm\v!broad }#1#2#3#4#5{\global#1\dimexpr#5-4\externalfigureparameter\c!bodyfont\relax} @@ -552,44 +455,30 @@ \setvalue{\??scalenorm\empty }#1#2#3#4#5{\ifx#3\empty\else\global#1#3\fi} \setvalue{\??scalenorm\s!default}#1#2#3#4#5{\ifx#3\empty\else\global#1#3\fi} -% \def\grph_scale_calculate_scales#1#2#3#4% -% {\scratchdimen\dimexpr#1/\dimexpr#2/\plusthousand\relax\relax -% \c_grph_scale_used_x_scale\scratchdimen -% \c_grph_scale_used_y_scale\scratchdimen -% %\writestatus{!!!!}{\the#3/\luaexpr{\number\dimexpr#1\relax/\number\dimexpr#2/1000}}% -% #3\dimexpr\c_grph_scale_used_x_scale\dimexpr#4/\plusthousand\relax\relax} -% -% \def\grph_scale_calculate_scale#1#2#3% -% {#3\dimexpr#1/\dimexpr#2/\plusthousand\relax\relax} -% -% \def\grph_scale_apply_scale#1#2#3#4% #4 = parameter / scale can be empty -% {\ifcase0#4\relax -% \ifcase0\p_scale\relax -% #3=\plusthousand -% \else -% #3=\p_scale -% \fi +\setvalue{\??scalefact\v!min }{\global\settrue \c_grph_scale_swap_factor} +\setvalue{\??scalefact\s!unknown}{\global\setfalse\c_grph_scale_swap_factor} + +% \setvalue{\??scalenorm\v!min }#1#2#3#4#5% an ugly hack +% {\ifdim\d_grph_scale_used_x_size>\d_grph_scale_h_size +% \d_grph_scale_used_y_size\vsize % \else -% #3=#4% -% \fi -% \relax % important ! still ? -% \global#1\ifnum#3=\plusthousand#2\else\dimexpr#3\dimexpr#2/\plusthousand\relax\relax\fi -% \relax} +% \d_grph_scale_used_x_size\hsize +% \fi} + +\setvalue{\??scalenorm\v!min}#1#2#3#4#5% an ugly hack + {\d_grph_scale_used_x_size\hsize + \d_grph_scale_used_y_size\vsize} \def\grph_scale_calculate_scales#1#2% {\edef\m_grph_scale_used_x_scale{\luaexpr{\number#1/\number#2}}% \let\m_grph_scale_used_y_scale\m_grph_scale_used_x_scale} -% we could inline this: -% -% \grph_scale_calculate_scale\m_grph_scale_used_x_scale#1#2 -% \let\m_grph_scale_used_y_scale\m_grph_scale_used_x_scale - \def\grph_scale_calculate_scale#1#2#3% {\edef#1{\luaexpr{\number#2/\number#3}}} \def\grph_scale_apply_scale#1#2% #1 = parameter / scale can be empty - {\edef#1{\luaexpr + {% no overflow + \edef#1{\luaexpr {\number \ifx#2\empty \ifx \p_scale \empty \plusthousand \else @@ -642,31 +531,6 @@ \d_grph_scale_h_size\p_width \fi} -%\def\grph_scale_convert_large_scale#1#2#3#4% -% {\scratchdimen#1\relax -% \ifnum#3=\plusthousand -% % == scale 1 -% \else -% % better 1000 100 10 ranges, evt round 2sp -% \divide\scratchdimen \plusthousand -% \multiply\scratchdimen #3\relax -% \fi -% \scratchdimen-\scratchdimen % beter hier - dan in driver -% \edef#2{\the\scratchdimen}% -% \scratchcounter#3\relax -% \ifnum\scratchcounter>\plustenthousand -% \divide\scratchcounter\plusten -% \scratchdimen\the\scratchcounter\points % \the ? -% \else -% \scratchdimen\the\scratchcounter\points % \the ? -% \divide\scratchdimen\plusten -% \fi -% \edef#4{\withoutpt\the\scratchdimen}} -% -% \def\grph_scale_convert_large_scale#1#2#3#4% less overflow -% {\edef#2{\ifnum#3=\plusthousand-\the\dimexpr#1\else\luaexpr{-\number#3*\number\dimexpr#1/1000}sp\fi}% -% \edef#4{\luaexpr{\number#3/10}}} - % \startcombination % {\externalfigure[cow.pdf] [frame=on,height=3cm,equalwidth=6cm]} {a cow} % {\externalfigure[mill.png][frame=on,height=3cm,equalwidth=6cm]} {a mill} @@ -722,9 +586,8 @@ %D \macros %D {clip, setupclipping} %D -%D Although related to figures, clipping can be applied to -%D arbitrary content. We can use \METAPOST\ to provide a non -%D rectangular clipping path. +%D Although related to figures, clipping can be applied to arbitrary content. We can +%D use \METAPOST\ to provide a non rectangular clipping path. %D %D \starttyping %D \startMPclip{fun} @@ -739,8 +602,7 @@ %D \clip[x=2,y=1]{\externalfigure[photo]} %D \stoptyping %D -%D When we want to clip to the oval we defined a few lines ago, -%D we say: +%D When we want to clip to the oval we defined a few lines ago, we say: %D %D \starttyping %D \clip[nx=1,ny=1,x=1,y=1,mp=fun]{\externalfigure[photo]} @@ -769,57 +631,6 @@ \grph_clip_yes_finish \grph_clip_nop_finish} -% \def\grph_clip_yes_finish -% {\ifdim\@@cpwidth>\zeropoint -% \!!dimena\@@cpwidth -% \!!dimenc\@@cphoffset -% \else -% \!!dimena\wd\nextbox -% \divide\!!dimena \@@cpnx -% \!!dimenc\@@cpx\!!dimena -% \advance\!!dimenc -\!!dimena -% \!!dimena\@@cpsx\!!dimena -% \fi -% \relax % sure -% \ifdim\@@cpheight>\zeropoint -% \!!dimenb\@@cpheight -% \!!dimend\ht\nextbox -% \advance\!!dimend -\@@cpvoffset -% \advance\!!dimend -\!!dimenb -% \else -% \!!dimenb\ht\nextbox -% \divide\!!dimenb \@@cpny -% \!!dimend-\@@cpy\!!dimenb -% \advance\!!dimend -\@@cpsy\!!dimenb -% \advance\!!dimend \!!dimenb -% \!!dimenb\@@cpsy\!!dimenb -% \advance\!!dimend \ht\nextbox % dimend ! -% \fi -% \setbox\nextbox\hbox % old -% {\advance\!!dimenc -\@@cpleftoffset % new ! -% \advance\!!dimend -\@@cpbottomoffset % new ! % - added -% \hskip-\!!dimenc\lower\!!dimend\box\nextbox}% old -% \wd\nextbox\zeropoint -% \ht\nextbox\zeropoint -% \dp\nextbox\zeropoint -% \setbox\nextbox\hbox -% {\advance\!!dimena \@@cpleftoffset % new ! -% \advance\!!dimena \@@cprightoffset % new ! -% \advance\!!dimenb \@@cpbottomoffset % new ! -% \advance\!!dimenb \@@cptopoffset % new ! -% \dostartclipping\@@cpmp\!!dimena\!!dimenb % old -% \box\nextbox -% \dostopclipping}% -% \setbox\nextbox\hbox % new ! -% {\!!dimena-\@@cpleftoffset % new ! -% \!!dimenb \@@cpbottomoffset % new ! % - removed -% \hskip\!!dimena\lower\!!dimenb\box\nextbox}% new ! -% \wd\nextbox\!!dimena -% \ht\nextbox\!!dimenb -% \dp\nextbox\zeropoint -% \box\nextbox -% \egroup} - \def\grph_clip_yes_finish {\ifdim\clippingparameter\c!width>\zeropoint \scratchwidth \clippingparameter\c!width @@ -917,8 +728,7 @@ \box\nextbox \egroup} -%D A couple of examples, demonstrating how the depth is -%D taken care of: +%D A couple of examples, demonstrating how the depth is taken care of: %D %D \startbuffer %D test\rotate[frame=on, rotation=0] {gans}% @@ -929,27 +739,20 @@ %D \stopbuffer %D %D \typebuffer \getbuffer - -% When we rotate over arbitrary angles, we need to relocate the -% resulting box because rotation brings that box onto the negative -% axis. The calculations (mostly sin and cosine) need to be tuned for -% the way a box is packages (i.e. the refence point). A typical example -% of drawing, scribbling, and going back to the days of school math. -% -% We do a bit more calculations than needed, simply because that way -% it's easier to debug the code. - -% Cleanup in progress ... todo: less boxing +%D +%D When we rotate over arbitrary angles, we need to relocate the resulting box +%D because rotation brings that box onto the negative axis. The calculations (mostly +%D sin and cosine) need to be tuned for the way a box is packages (i.e. the refence +%D point). A typical example of drawing, scribbling, and going back to the days of +%D school math. +%D +%D We do a bit more calculations than needed, simply because that way it's easier to +%D debug the code. \installcorenamespace {rotate} \installcorenamespace {rotatelocation} \installcorenamespace {rotatepreset} -% we can alias these to \d_layers-* to save some dimens or maybe have a generic -% set of scratch variables - -% maybe just \rotation_... - \newdimen\d_grph_rotate_x_size \newdimen\d_grph_rotate_y_size \newdimen\d_grph_rotate_x_offset diff --git a/tex/context/base/mkiv/hand-ini.mkiv b/tex/context/base/mkiv/hand-ini.mkiv index d4bffdb14..f678a88da 100644 --- a/tex/context/base/mkiv/hand-ini.mkiv +++ b/tex/context/base/mkiv/hand-ini.mkiv @@ -60,6 +60,7 @@ \def\font_expansion_enable {\normaladjustspacing\plusthree} \def\font_expansion_enable_k{\normaladjustspacing\plustwo} +\def\font_expansion_enable_n{\normaladjustspacing\plusone} \def\font_expansion_disable {\normaladjustspacing\zerocount} \def\font_protruding_enable {\normalprotrudechars\plustwo } diff --git a/tex/context/base/mkiv/java-ini.mkiv b/tex/context/base/mkiv/java-ini.mkiv index d6fe4dd8a..25b8ba600 100644 --- a/tex/context/base/mkiv/java-ini.mkiv +++ b/tex/context/base/mkiv/java-ini.mkiv @@ -13,7 +13,7 @@ \writestatus{loading}{ConTeXt JavaScript Macros / Initialization} -\registerctxluafile{java-ini}{1.001} +\registerctxluafile{java-ini}{} \unprotect diff --git a/tex/context/base/mkiv/l-bit32.lua b/tex/context/base/mkiv/l-bit32.lua new file mode 100644 index 000000000..5f35b8fee --- /dev/null +++ b/tex/context/base/mkiv/l-bit32.lua @@ -0,0 +1,150 @@ +if not modules then modules = { } end modules ['l-bit32'] = { + version = 1.001, + license = "the same as regular Lua", + source = "bitwise.lua, v 1.24 2014/12/26 17:20:53 roberto", + comment = "drop-in for bit32, adapted a bit by Hans Hagen", + +} + +-- Lua 5.3 has bitwise operators built in but code meant for 5.2 can expect the +-- bit32 library to be present. For the moment (and maybe forever) we will ship +-- the bit32 library as part of LuaTeX bit just in case it is missing, here is a +-- drop-in. The code is an adapted version of code by Roberto. The Luajit variant +-- is a mixture of mapping and magic. + +if bit32 then + + -- lua 5.2: we're okay + +elseif utf8 then + + -- lua 5.3: bitwise.lua, v 1.24 2014/12/26 17:20:53 roberto + + bit32 = load ( [[ +local select = select -- instead of: arg = { ... } + +bit32 = { + bnot = function (a) + return ~a & 0xFFFFFFFF + end, + band = function (x, y, z, ...) + if not z then + return ((x or -1) & (y or -1)) & 0xFFFFFFFF + else + local res = x & y & z + for i=1,select("#",...) do + res = res & select(i,...) + end + return res & 0xFFFFFFFF + end + end, + bor = function (x, y, z, ...) + if not z then + return ((x or 0) | (y or 0)) & 0xFFFFFFFF + else + local res = x | y | z + for i=1,select("#",...) do + res = res | select(i,...) + end + return res & 0xFFFFFFFF + end + end, + bxor = function (x, y, z, ...) + if not z then + return ((x or 0) ~ (y or 0)) & 0xFFFFFFFF + else + local res = x ~ y ~ z + for i=1,select("#",...) do + res = res ~ select(i,...) + end + return res & 0xFFFFFFFF + end + end, + btest = function (x, y, z, ...) + if not z then + return (((x or -1) & (y or -1)) & 0xFFFFFFFF) ~= 0 + else + local res = x & y & z + for i=1,select("#",...) do + res = res & select(i,...) + end + return (res & 0xFFFFFFFF) ~= 0 + end + end, + lshift = function (a, b) + return ((a & 0xFFFFFFFF) << b) & 0xFFFFFFFF + end, + rshift = function (a, b) + return ((a & 0xFFFFFFFF) >> b) & 0xFFFFFFFF + end, + arshift = function (a, b) + a = a & 0xFFFFFFFF + if b <= 0 or (a & 0x80000000) == 0 then + return (a >> b) & 0xFFFFFFFF + else + return ((a >> b) | ~(0xFFFFFFFF >> b)) & 0xFFFFFFFF + end + end, + lrotate = function (a ,b) + b = b & 31 + a = a & 0xFFFFFFFF + a = (a << b) | (a >> (32 - b)) + return a & 0xFFFFFFFF + end, + rrotate = function (a, b) + b = -b & 31 + a = a & 0xFFFFFFFF + a = (a << b) | (a >> (32 - b)) + return a & 0xFFFFFFFF + end, + extract = function (a, f, w) + return (a >> f) & ~(-1 << (w or 1)) + end, + replace = function (a, v, f, w) + local mask = ~(-1 << (w or 1)) + return ((a & ~(mask << f)) | ((v & mask) << f)) & 0xFFFFFFFF + end, +} + ]] ) + +elseif bit then + + -- luajit (for now) + + bit32 = load ( [[ +local band, bnot, rshift, lshift = bit.band, bit.bnot, bit.rshift, bit.lshift + +bit32 = { + arshift = bit.arshift, + band = band, + bnot = bnot, + bor = bit.bor, + bxor = bit.bxor, + btest = function(...) + return band(...) ~= 0 + end, + extract = function(a,f,w) + return band(rshift(a,f),2^(w or 1)-1) + end, + lrotate = bit.rol, + lshift = lshift, + replace = function(a,v,f,w) + local mask = 2^(w or 1)-1 + return band(a,bnot(lshift(mask,f)))+lshift(band(v,mask),f) + end, + rrotate = bit.ror, + rshift = rshift, +} + ]] ) + +else + + -- hope for the best or fail + + -- bit32 = require("bit32") + + xpcall(function() local _, t = require("bit32") if t then bit32 = t end return end,function() end) + +end + +return bit32 or false diff --git a/tex/context/base/mkiv/l-file.lua b/tex/context/base/mkiv/l-file.lua index f2a27ad18..5fec0040f 100644 --- a/tex/context/base/mkiv/l-file.lua +++ b/tex/context/base/mkiv/l-file.lua @@ -96,6 +96,10 @@ function lfs.isfile(name) return attributes(name,"mode") == "file" end +function lfs.isfound(name) + return attributes(name,"mode") == "file" and name or nil +end + local colon = P(":") local period = P(".") local periods = P("..") @@ -699,3 +703,25 @@ function lfs.mkdirs(path) lfs.mkdir(full) end end + +-- here is oen i ran into when messign around with xavante code (keppler project) +-- where it's called in_base .. no gain in using lpeg here + +function file.withinbase(path) -- don't go beyond root + local l = 0 + if not find(path,"^/") then + path = "/" .. path + end + for dir in gmatch(path,"/([^/]+)") do + if dir == ".." then + l = l - 1 + elseif dir ~= "." then + l = l + 1 + end + if l < 0 then + return false + end + end + return true +end + diff --git a/tex/context/base/mkiv/l-io.lua b/tex/context/base/mkiv/l-io.lua index 75e704a34..fa3ad3c4c 100644 --- a/tex/context/base/mkiv/l-io.lua +++ b/tex/context/base/mkiv/l-io.lua @@ -10,7 +10,7 @@ local io = io local open, flush, write, read = io.open, io.flush, io.write, io.read local byte, find, gsub, format = string.byte, string.find, string.gsub, string.format local concat = table.concat -local floor = math.floor +----- floor = math.floor local type = type if string.find(os.getenv("PATH"),";",1,true) then @@ -27,9 +27,9 @@ end -- to less intermediate large allocations. This phenomena was discussed on the -- luatex dev list. -local large = 2^24 -- 16 MB -local medium = large / 16 -- 1 MB -local small = medium / 8 +local large = 0x01000000 -- 2^24 16.777.216 +local medium = 0x00100000 -- 2^20 1.048.576 +local small = 0x00020000 -- 2^17 131.072 -- local function readall(f) -- local size = f:seek("end") @@ -54,7 +54,7 @@ local small = medium / 8 -- end local function readall(f) --- return f:read("*all") + -- return f:read("*all") local size = f:seek("end") if size > 0 then f:seek("set",0) diff --git a/tex/context/base/mkiv/l-lpeg.lua b/tex/context/base/mkiv/l-lpeg.lua index c34ba6ad4..a7ebd567d 100644 --- a/tex/context/base/mkiv/l-lpeg.lua +++ b/tex/context/base/mkiv/l-lpeg.lua @@ -6,6 +6,10 @@ if not modules then modules = { } end modules ['l-lpeg'] = { license = "see context related readme files" } +-- we can get too many captures (e.g. on largexml files) which makes me wonder +-- if P(foo)/"" can't be simplfied to N(foo) i.e. some direct instruction to the +-- lpeg virtual machine to ignore it + -- lpeg 12 vs lpeg 10: slower compilation, similar parsing speed (i need to check -- if i can use new features like capture / 2 and .B (at first sight the xml -- parser is some 5% slower) @@ -17,7 +21,13 @@ if not modules then modules = { } end modules ['l-lpeg'] = { -- move utf -> l-unicode -- move string -> l-string or keep it here -lpeg = require("lpeg") +-- lpeg.B : backward without consumption +-- lpeg.F = getmetatable(lpeg.P(1)).__len : forward without consumption + + +lpeg = require("lpeg") -- does lpeg register itself global? + +local lpeg = lpeg -- The latest lpeg doesn't have print any more, and even the new ones are not -- available by default (only when debug mode is enabled), which is a pitty as @@ -103,11 +113,14 @@ patterns.alwaysmatched = alwaysmatched local sign = S('+-') local zero = P('0') local digit = R('09') +local digits = digit^1 local octdigit = R("07") +local octdigits = octdigit^1 local lowercase = R("az") local uppercase = R("AZ") local underscore = P("_") local hexdigit = digit + lowercase + uppercase +local hexdigits = hexdigit^1 local cr, lf, crlf = P("\r"), P("\n"), P("\r\n") ----- newline = crlf + S("\r\n") -- cr + lf local newline = P("\r") * (P("\n") + P(true)) + P("\n") -- P("\r")^-1 * P("\n")^-1 @@ -240,33 +253,36 @@ patterns.doublequoted = dquote * patterns.nodquote * dquote patterns.quoted = patterns.doublequoted + patterns.singlequoted patterns.digit = digit +patterns.digits = digits patterns.octdigit = octdigit +patterns.octdigits = octdigits patterns.hexdigit = hexdigit +patterns.hexdigits = hexdigits patterns.sign = sign -patterns.cardinal = digit^1 -patterns.integer = sign^-1 * digit^1 -patterns.unsigned = digit^0 * period * digit^1 +patterns.cardinal = digits +patterns.integer = sign^-1 * digits +patterns.unsigned = digit^0 * period * digits patterns.float = sign^-1 * patterns.unsigned -patterns.cunsigned = digit^0 * comma * digit^1 -patterns.cpunsigned = digit^0 * (period + comma) * digit^1 +patterns.cunsigned = digit^0 * comma * digits +patterns.cpunsigned = digit^0 * (period + comma) * digits patterns.cfloat = sign^-1 * patterns.cunsigned patterns.cpfloat = sign^-1 * patterns.cpunsigned patterns.number = patterns.float + patterns.integer patterns.cnumber = patterns.cfloat + patterns.integer patterns.cpnumber = patterns.cpfloat + patterns.integer -patterns.oct = zero * octdigit^1 +patterns.oct = zero * octdigits patterns.octal = patterns.oct patterns.HEX = zero * P("X") * (digit+uppercase)^1 patterns.hex = zero * P("x") * (digit+lowercase)^1 -patterns.hexadecimal = zero * S("xX") * hexdigit^1 +patterns.hexadecimal = zero * S("xX") * hexdigits patterns.hexafloat = sign^-1 * zero * S("xX") - * (hexdigit^0 * period * hexdigit^1 + hexdigit^1 * period * hexdigit^0 + hexdigit^1) - * (S("pP") * sign^-1 * hexdigit^1)^-1 + * (hexdigit^0 * period * hexdigits + hexdigits * period * hexdigit^0 + hexdigits) + * (S("pP") * sign^-1 * hexdigits)^-1 patterns.decafloat = sign^-1 - * (digit^0 * period * digit^1 + digit^1 * period * digit^0 + digit^1) - * S("eE") * sign^-1 * digit^1 + * (digit^0 * period * digits + digits * period * digit^0 + digits) + * S("eE") * sign^-1 * digits patterns.propername = (uppercase + lowercase + underscore) * (uppercase + lowercase + underscore + digit)^0 * endofstring @@ -597,19 +613,27 @@ end -- print(7,lpegmatch(lpeg.secondofsplit(":"),"bc")) -- print(9,lpegmatch(lpeg.secondofsplit(":","123"),"bc")) --- -- slower: +-- this was slower but lpeg has been sped up in the meantime, so we no longer +-- use this (still seems somewhat faster on long strings) +-- +-- local nany = utf8char/"" -- -- function lpeg.counter(pattern) --- local n, pattern = 0, (lpeg.P(pattern)/function() n = n + 1 end + lpeg.anything)^0 --- return function(str) n = 0 ; lpegmatch(pattern,str) ; return n end +-- pattern = Cs((P(pattern)/" " + nany)^0) +-- return function(str) +-- return #lpegmatch(pattern,str) +-- end -- end -local nany = utf8char/"" - -function lpeg.counter(pattern) - pattern = Cs((P(pattern)/" " + nany)^0) - return function(str) - return #lpegmatch(pattern,str) +function lpeg.counter(pattern,action) + local n = 0 + local pattern = (P(pattern) / function() n = n + 1 end + anything)^0 + ----- pattern = (P(pattern) * (P(true) / function() n = n + 1 end) + anything)^0 + ----- pattern = (P(pattern) * P(function() n = n + 1 end) + anything)^0 + if action then + return function(str) n = 0 ; lpegmatch(pattern,str) ; action(n) end + else + return function(str) n = 0 ; lpegmatch(pattern,str) ; return n end end end @@ -841,48 +865,42 @@ end local p_false = P(false) local p_true = P(true) --- local function making(t) --- local p = p_false --- local keys = sortedkeys(t) --- for i=1,#keys do --- local k = keys[i] --- if k ~= "" then +-- local function collapse(t,x) +-- if type(t) ~= "table" then +-- return t, x +-- else +-- local n = next(t) +-- if n == nil then +-- return t, x +-- elseif next(t,n) == nil then +-- -- one entry +-- local k = n -- local v = t[k] --- if v == true then --- p = p + P(k) * p_true --- elseif v == false then --- -- can't happen +-- if type(v) == "table" then +-- return collapse(v,x..k) -- else --- p = p + P(k) * making(v) +-- return v, x .. k -- end --- end --- end --- if t[""] then --- p = p + p_true --- end --- return p --- end - --- local function make(t) --- local p = p_false --- local keys = sortedkeys(t) --- for i=1,#keys do --- local k = keys[i] --- if k ~= "" then --- local v = t[k] --- if v == true then --- p = p + P(k) * p_true --- elseif v == false then --- -- can't happen --- else --- p = p + P(k) * making(v) +-- else +-- local tt = { } +-- for k, v in next, t do +-- local vv, kk = collapse(v,k) +-- tt[kk] = vv -- end +-- return tt, x -- end -- end --- return p -- end -local function make(t,rest) +local lower = utf and utf.lower or string.lower +local upper = utf and utf.upper or string.upper + +function lpeg.setutfcasers(l,u) + lower = l or lower + upper = u or upper +end + +local function make1(t,rest) local p = p_false local keys = sortedkeys(t) for i=1,#keys do @@ -894,7 +912,7 @@ local function make(t,rest) elseif v == false then -- can't happen else - p = p + P(k) * make(v,v[""]) + p = p + P(k) * make1(v,v[""]) end end end @@ -904,34 +922,29 @@ local function make(t,rest) return p end -local function collapse(t,x) - if type(t) ~= "table" then - return t, x - else - local n = next(t) - if n == nil then - return t, x - elseif next(t,n) == nil then - -- one entry - local k = n +local function make2(t,rest) -- only ascii + local p = p_false + local keys = sortedkeys(t) + for i=1,#keys do + local k = keys[i] + if k ~= "" then local v = t[k] - if type(v) == "table" then - return collapse(v,x..k) + if v == true then + p = p + (P(lower(k))+P(upper(k))) * p_true + elseif v == false then + -- can't happen else - return v, x .. k - end - else - local tt = { } - for k, v in next, t do - local vv, kk = collapse(v,k) - tt[kk] = vv + p = p + (P(lower(k))+P(upper(k))) * make2(v,v[""]) end - return tt, x end end + if rest then + p = p + p_true + end + return p end -function lpeg.utfchartabletopattern(list) -- goes to util-lpg +function lpeg.utfchartabletopattern(list,insensitive) -- goes to util-lpg local tree = { } local n = #list if n == 0 then @@ -1004,9 +1017,9 @@ function lpeg.utfchartabletopattern(list) -- goes to util-lpg end end end --- collapse(tree,"") -- needs testing, maybe optional, slightly faster because P("x")*P("X") seems slower than P"(xX") (why) --- inspect(tree) - return make(tree) + -- collapse(tree,"") -- needs testing, maybe optional, slightly faster because P("x")*P("X") seems slower than P"(xX") (why) + -- inspect(tree) + return (insensitive and make2 or make1)(tree) end -- local t = { "start", "stoep", "staart", "paard" } @@ -1112,7 +1125,7 @@ end local trailingzeros = zero^0 * -digit -- suggested by Roberto R local case_1 = period * trailingzeros / "" local case_2 = period * (digit - trailingzeros)^1 * (trailingzeros / "") -local number = digit^1 * (case_1 + case_2) +local number = digits * (case_1 + case_2) local stripper = Cs((number + 1)^0) lpeg.patterns.stripzeros = stripper diff --git a/tex/context/base/mkiv/l-lua.lua b/tex/context/base/mkiv/l-lua.lua index 88cde6d1e..426706f06 100644 --- a/tex/context/base/mkiv/l-lua.lua +++ b/tex/context/base/mkiv/l-lua.lua @@ -17,28 +17,37 @@ if not modules then modules = { } end modules ['l-lua'] = { -- utf.* -- bit32 --- compatibility hacksand helpers +local next, type, tonumber = next, type, tonumber -_MAJORVERSION, _MINORVERSION = string.match(_VERSION,"^[^%d]+(%d+)%.(%d+).*$") +-- compatibility hacks and helpers -_MAJORVERSION = tonumber(_MAJORVERSION) or 5 -_MINORVERSION = tonumber(_MINORVERSION) or 1 -_LUAVERSION = _MAJORVERSION + _MINORVERSION/10 +LUAMAJORVERSION, LUAMINORVERSION = string.match(_VERSION,"^[^%d]+(%d+)%.(%d+).*$") -if _LUAVERSION < 5.2 and jit then +LUAMAJORVERSION = tonumber(LUAMAJORVERSION) or 5 +LUAMINORVERSION = tonumber(LUAMINORVERSION) or 1 +LUAVERSION = LUAMAJORVERSION + LUAMINORVERSION/10 + +if LUAVERSION < 5.2 and jit then -- -- we want loadstring cum suis to behave like 5.2 -- - _MINORVERSION = 2 - _LUAVERSION = 5.2 + MINORVERSION = 2 + LUAVERSION = 5.2 end +_LUAVERSION = LUAVERSION -- for old times sake, will go away + -- lpeg if not lpeg then lpeg = require("lpeg") end +-- if utf8 then +-- utf8lua = utf8 +-- utf8 = nil +-- end + -- basics: if loadstring then @@ -220,3 +229,24 @@ if not FFISUPPORTED then elseif not ffi.number then ffi.number = tonumber end + +if not bit32 then -- and utf8 then + -- bit32 = load ( [[ -- replacement code with 5.3 syntax so that 5.2 doesn't bark on it ]] ) + bit32 = require("l-bit32") +end + +-- We need this due a bug in luatex socket loading: + +local loaded = package.loaded + +if not loaded["socket"] then loaded["socket"] = loaded["socket.core"] end +if not loaded["mime"] then loaded["mime"] = loaded["mime.core"] end + +if not socket.mime then socket.mime = package.loaded["mime"] end + +if not loaded["socket.mime"] then loaded["socket.mime"] = socket.mime end +if not loaded["socket.http"] then loaded["socket.http"] = socket.http end +if not loaded["socket.ftp"] then loaded["socket.ftp"] = socket.ftp end +if not loaded["socket.smtp"] then loaded["socket.smtp"] = socket.smtp end +if not loaded["socket.tp"] then loaded["socket.tp"] = socket.tp end +if not loaded["socket.url"] then loaded["socket.url"] = socket.url end diff --git a/tex/context/base/mkiv/l-macro-imp-optimize.lua b/tex/context/base/mkiv/l-macro-imp-optimize.lua new file mode 100644 index 000000000..e04b37eab --- /dev/null +++ b/tex/context/base/mkiv/l-macro-imp-optimize.lua @@ -0,0 +1,62 @@ +if not modules then modules = { } end modules ['l-macro-imp-optimize'] = { + version = 1.001, + comment = "companion to luat-lib.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +-- This is for ConTeXt only and used in development. Only in rare cases we +-- will use this to gain a bit of performance or adapt to specific versions +-- of Lua. + +-- There is no real gain as we hardly use these: +-- +-- lua.macros.resolvestring [[ +-- #define div(a,b) floor(a/b) +-- #define mod(a,b) (a % b) +-- #define odd(a) (a % 2 ~= 0) +-- #define even(a) (a % 2 == 0) +-- #define pow(x,y) (x^y) +-- ]] + +if LUAVERSION >= 5.3 and lua.macros then + + -- For the moment we only optimize in Lua 5.3: + + lua.macros.enabled = true + + -- This indirect method makes it possible to use both the functions + -- and the inline variant (which often looks better). Also, a mixed + -- 5,2 and 5.3 source is not possible because the 5.2 doesn't deal + -- with the newer 5.3 syntax. + + -- We need to check for 64 usage: 0xFFFFFFFFFFFFFFFF (-1) + + -- lua.macros.resolvestring [[ + -- #define band(a,b) (a & b) + -- #define bnot(a) (~a & 0xFFFFFFFF) + -- #define bor(a,b) ((a | b) & 0xFFFFFFFF) + -- #define btest(a,b) ((a & b) ~= 0) + -- #define bxor(a,b) ((a ~ b) & 0xFFFFFFFF) + -- #define rshift(a,b) ((a & b) ~= 0) + -- #define extract(a,b,c) ((a >> b) & ~(-1 << c)) + -- #define extract(a,b) ((a >> b) & 0x1)) + -- #define lshift(a,b) ((a << b) & 0xFFFFFFFF) + -- #define rshift(a,b) ((a >> b) & 0xFFFFFFFF) + -- ]] + + lua.macros.resolvestring [[ + #define band(a,b) (a&b) + #define bnot(a) (~a&0xFFFFFFFF) + #define bor(a,b) ((a|b)&0xFFFFFFFF) + #define btest(a,b) ((a&b)~=0) + #define bxor(a,b) ((a~b)&0xFFFFFFFF) + #define rshift(a,b) ((a&b)~=0) + #define extract(a,b,c) ((a>>b)&~(-1<<c)) + #define extract(a,b) ((a>>b)&0x1)) + #define lshift(a,b) ((a<<b)&0xFFFFFFFF) + #define rshift(a,b) ((a>>b)&0xFFFFFFFF) + ]] + +end diff --git a/tex/context/base/mkiv/l-macro.lua b/tex/context/base/mkiv/l-macro.lua new file mode 100644 index 000000000..d2b8c7ae4 --- /dev/null +++ b/tex/context/base/mkiv/l-macro.lua @@ -0,0 +1,225 @@ +if not modules then modules = { } end modules ['l-macros'] = { + version = 1.001, + comment = "companion to luat-lib.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +-- This is actually rather old code that I made as a demo for Luigi but that +-- now comes in handy when we switch to Lua 5.3. The reason for using it (in +-- in transition) is that we cannot mix 5.3 bit operators in files that get +-- loaded in 5.2 (parsing happens before conditional testing). + +local S, P, R, V, C, Cs, Cc, Ct, Carg = lpeg.S, lpeg.P, lpeg.R, lpeg.V, lpeg.C, lpeg.Cs, lpeg.Cc, lpeg.Ct, lpeg.Carg +local lpegmatch = lpeg.match +local concat = table.concat +local next = next + +local newline = S("\n\r")^1 +local continue = P("\\") * newline +local spaces = S(" \t") + continue +local name = R("az","AZ","__","09")^1 +local body = ((1+continue/"")-newline)^1 +local lparent = P("(") +local rparent = P(")") +local noparent = 1 - (lparent + rparent) +local nested = P { lparent * (noparent + V(1))^0 * rparent } +local escaped = P("\\") * P(1) +local squote = P("'") +local dquote = P('"') +local quoted = dquote * (escaped + (1-dquote))^0 * dquote + + squote * (escaped + (1-squote))^0 * squote + +local arguments = lparent * Ct((Cs((nested+(quoted + 1 - S("),")))^1) + S(", "))^0) * rparent + +local macros = lua.macros or { } +lua.macros = macros + +local patterns = { } +local definitions = { } +local resolve +local subparser + +-- todo: zero case + +resolve = C(C(name) * arguments^-1) / function(raw,s,a) + local d = definitions[s] + if d then + if a then + local n = #a + local p = patterns[s][n] + if p then + local d = d[n] + for i=1,n do + a[i] = lpegmatch(subparser,a[i]) or a[i] + end + return lpegmatch(p,d,1,a) or d + else + return raw + end + else + return d[0] or raw + end + elseif a then + for i=1,#a do + a[i] = lpegmatch(subparser,a[i]) or a[i] + end + return s .. "(" .. concat(a,",") .. ")" + else + return raw + end +end + +subparser = Cs((resolve + P(1))^1) + +local enddefine = P("#enddefine") / "" + +local beginregister = (C(name) * spaces^0 * (arguments + Cc(false)) * C((1-enddefine)^1) * enddefine) / function(k,a,v) + local n = 0 + if a then + n = #a + local pattern = P(false) + for i=1,n do + pattern = pattern + (P(a[i]) * Carg(1)) / function(t) return t[i] end + end + pattern = Cs((pattern + P(1))^1) + local p = patterns[k] + if not p then + p = { [0] = false, false, false, false, false, false, false, false, false } + patterns[k] = p + end + p[n] = pattern + end + local d = definitions[k] + if not d then + d = { [0] = false, false, false, false, false, false, false, false, false } + definitions[k] = d + end + d[n] = lpegmatch(subparser,v) or v + return "" +end + +local register = (C(name) * spaces^0 * (arguments + Cc(false)) * spaces^0 * C(body)) / function(k,a,v) + local n = 0 + if a then + n = #a + local pattern = P(false) + for i=1,n do + pattern = pattern + (P(a[i]) * Carg(1)) / function(t) return t[i] end + end + pattern = Cs((pattern + P(1))^1) + local p = patterns[k] + if not p then + p = { [0] = false, false, false, false, false, false, false, false, false } + patterns[k] = p + end + p[n] = pattern + end + local d = definitions[k] + if not d then + d = { [0] = false, false, false, false, false, false, false, false, false } + definitions[k] = d + end + d[n] = lpegmatch(subparser,v) or v + return "" +end + +local unregister = (C(name) * spaces^0 * (arguments + Cc(false))) / function(k,a) + local n = 0 + if a then + n = #a + local p = patterns[k] + if p then + p[n] = false + end + end + local d = definitions[k] + if d then + d[n] = false + end + return "" +end + +local begindefine = (P("begindefine") * spaces^0 / "") * beginregister +local define = (P("define" ) * spaces^0 / "") * register +local undefine = (P("undefine" ) * spaces^0 / "") * unregister + +local parser = Cs( ( ( (P("#")/"") * (define + begindefine + undefine) * (newline^0/"") ) + resolve + P(1) )^0 ) + +function macros.reset() + definitions = { } + patterns = { } +end + +function macros.resolvestring(str) + return lpegmatch(parser,str) or str +end + +function macros.resolving() + return next(patterns) +end + +-- local str = [[ +-- #define check(p,q) (p ~= 0) and (p > q) +-- +-- #define oeps a > 10 +-- +-- #define whatever oeps +-- +-- if whatever and check(1,2) then print("!") end +-- if whatever and check(1,3) then print("!") end +-- if whatever and check(1,4) then print("!") end +-- if whatever and check(1,5) then print("!") end +-- if whatever and check(1,6) then print("!") end +-- if whatever and check(1,7) then print("!") end +-- ]] +-- +-- print(macros.resolvestring(str)) +-- +-- macros.resolvestring(io.loaddata("mymacros.lua")) +-- loadstring(macros.resolvestring(io.loaddata("mytestcode.lua"))) + +-- local luamacros = [[ +-- #begindefine setnodecodes +-- local nodecodes = nodes.codes +-- local hlist_code = nodecodes.hlist +-- local vlist_code = nodecodes.vlist +-- local glyph_code = nodecodes.glyph +-- #enddefine +-- +-- #define hlist(id) id == hlist_code +-- #define vlist(id) id == vlist_code +-- #define glyph(id) id == glyph_code +-- ]] +-- +-- local luacode = [[ +-- setnodecodes +-- +-- if hlist(id) or vlist(id) then +-- print("we have a list") +-- elseif glyph(id) then +-- print("we have a glyph") +-- else +-- print("i'm stymied") +-- end +-- +-- local z = band(0x23,x) +-- local z = btest(0x23,x) +-- local z = rshift(0x23,x) +-- local z = lshift(0x23,x) +-- ]] +-- +-- require("l-macros-test-001") +-- +-- macros.resolvestring(luamacros) +-- +-- local newcode = macros.resolvestring(luacode) +-- +-- print(newcode) +-- +-- macros.reset() + +-- local d = io.loaddata("t:/sources/font-otr.lua") +-- local n = macros.resolvestring(d) +-- io.savedata("r:/tmp/o.lua",n) diff --git a/tex/context/base/mkiv/l-math.lua b/tex/context/base/mkiv/l-math.lua index ec62919b4..e5668a5db 100644 --- a/tex/context/base/mkiv/l-math.lua +++ b/tex/context/base/mkiv/l-math.lua @@ -6,33 +6,144 @@ if not modules then modules = { } end modules ['l-math'] = { license = "see context related readme files" } -local floor, sin, cos, tan = math.floor, math.sin, math.cos, math.tan - if not math.ceiling then + math.ceiling = math.ceil + end if not math.round then + + local floor = math.floor + function math.round(x) return floor(x + 0.5) end + end if not math.div then + + local floor = math.floor + function math.div(n,m) return floor(n/m) end + end if not math.mod then + function math.mod(n,m) return n % m end -end -local pipi = 2*math.pi/360 +end if not math.sind then + + local sin, cos, tan = math.sin, math.cos, math.tan + + local pipi = 2*math.pi/360 + function math.sind(d) return sin(d*pipi) end function math.cosd(d) return cos(d*pipi) end function math.tand(d) return tan(d*pipi) end + end if not math.odd then + function math.odd (n) return n % 2 ~= 0 end function math.even(n) return n % 2 == 0 end + +end + +if not math.cosh then + + local exp = math.exp + + function math.cosh(x) + local xx = exp(x) + return (xx+1/xx)/2 + end + function math.sinh(x) + local xx = exp(x) + return (xx-1/xx)/2 + end + function math.tanh(x) + local xx = exp(x) + return (xx-1/xx)/(xx+1/xx) + end + +end + +if not math.pow then + + function math.pow(x,y) + return x^y + end + +end + +if not math.atan2 then + + math.atan2 = math.atan + +end + +if not math.ldexp then + + function math.ldexp(x,e) + return x * 2.0^e + end + +end + +-- if not math.frexp then +-- +-- -- not a oneliner so use a math library instead +-- +-- function math.frexp(x,e) +-- -- returns m and e such that x = m2e, e is an integer and the absolute +-- -- value of m is in the range [0.5, 1) (or zero when x is zero) +-- end +-- +-- end + +if not math.log10 then + + local log = math.log + + function math.log10(x) + return log(x,10) + end + +end + +if not math.type then + + function math.type() + return "float" + end + +end + +if not math.tointeger then + + math.mininteger = -0x4FFFFFFFFFFF + math.maxinteger = 0x4FFFFFFFFFFF + + local floor = math.floor + + function math.tointeger(n) + local f = floor(n) + return f == n and f or nil + end + +end + +if not math.ult then + + local floor = math.floor + + function math.tointeger(m,n) + -- not ok but i'm not motivated to look into it now + return floor(m) < floor(n) -- unsigned comparison needed + end + end diff --git a/tex/context/base/mkiv/l-number.lua b/tex/context/base/mkiv/l-number.lua index c6f1e3359..a83e8f8f9 100644 --- a/tex/context/base/mkiv/l-number.lua +++ b/tex/context/base/mkiv/l-number.lua @@ -18,46 +18,50 @@ local floor = math.floor number = number or { } local number = number -if bit32 then -- I wonder if this is faster +-- begin obsolete code -- - local btest, bor = bit32.btest, bit32.bor - - function number.bit(p) - return 2 ^ (p - 1) -- 1-based indexing - end - - number.hasbit = btest - number.setbit = bor - - function number.setbit(x,p) -- why not bor? - return btest(x,p) and x or x + p - end - - function number.clearbit(x,p) - return btest(x,p) and x - p or x - end - -else - - -- http://ricilake.blogspot.com/2007/10/iterating-bits-in-lua.html - - function number.bit(p) - return 2 ^ (p - 1) -- 1-based indexing - end - - function number.hasbit(x, p) -- typical call: if hasbit(x, bit(3)) then ... - return x % (p + p) >= p - end - - function number.setbit(x, p) - return (x % (p + p) >= p) and x or x + p - end - - function number.clearbit(x, p) - return (x % (p + p) >= p) and x - p or x - end +-- if bit32 then +-- +-- local btest, bor = bit32.btest, bit32.bor +-- +-- function number.bit(p) +-- return 2 ^ (p - 1) -- 1-based indexing +-- end +-- +-- number.hasbit = btest +-- number.setbit = bor +-- +-- function number.setbit(x,p) -- why not bor? +-- return btest(x,p) and x or x + p +-- end +-- +-- function number.clearbit(x,p) +-- return btest(x,p) and x - p or x +-- end +-- +-- else +-- +-- -- http://ricilake.blogspot.com/2007/10/iterating-bits-in-lua.html +-- +-- function number.bit(p) +-- return 2 ^ (p - 1) -- 1-based indexing +-- end +-- +-- function number.hasbit(x, p) -- typical call: if hasbit(x, bit(3)) then ... +-- return x % (p + p) >= p +-- end +-- +-- function number.setbit(x, p) +-- return (x % (p + p) >= p) and x or x + p +-- end +-- +-- function number.clearbit(x, p) +-- return (x % (p + p) >= p) and x - p or x +-- end +-- +-- end -end +-- end obsolete code -- -- print(number.tobitstring(8)) -- print(number.tobitstring(14)) @@ -152,60 +156,60 @@ function number.toevenhex(n) end end --- a,b,c,d,e,f = number.toset(100101) +-- -- a,b,c,d,e,f = number.toset(100101) +-- -- +-- -- function number.toset(n) +-- -- return match(tostring(n),"(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?)") +-- -- end +-- -- +-- -- -- the lpeg way is slower on 8 digits, but faster on 4 digits, some 7.5% +-- -- -- on +-- -- +-- -- for i=1,1000000 do +-- -- local a,b,c,d,e,f,g,h = number.toset(12345678) +-- -- local a,b,c,d = number.toset(1234) +-- -- local a,b,c = number.toset(123) +-- -- local a,b,c = number.toset("123") +-- -- end +-- +-- local one = lpeg.C(1-lpeg.S('')/tonumber)^1 -- -- function number.toset(n) --- return match(tostring(n),"(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?)") +-- return lpegmatch(one,tostring(n)) -- end -- --- -- the lpeg way is slower on 8 digits, but faster on 4 digits, some 7.5% --- -- on +-- -- function number.bits(n,zero) +-- -- local t, i = { }, (zero and 0) or 1 +-- -- while n > 0 do +-- -- local m = n % 2 +-- -- if m > 0 then +-- -- insert(t,1,i) +-- -- end +-- -- n = floor(n/2) +-- -- i = i + 1 +-- -- end +-- -- return t +-- -- end +-- -- +-- -- -- a bit faster -- --- for i=1,1000000 do --- local a,b,c,d,e,f,g,h = number.toset(12345678) --- local a,b,c,d = number.toset(1234) --- local a,b,c = number.toset(123) --- local a,b,c = number.toset("123") --- end - -local one = lpeg.C(1-lpeg.S('')/tonumber)^1 - -function number.toset(n) - return lpegmatch(one,tostring(n)) -end - --- function number.bits(n,zero) --- local t, i = { }, (zero and 0) or 1 --- while n > 0 do +-- local function bits(n,i,...) +-- if n > 0 then -- local m = n % 2 +-- local n = floor(n/2) -- if m > 0 then --- insert(t,1,i) +-- return bits(n, i+1, i, ...) +-- else +-- return bits(n, i+1, ...) -- end --- n = floor(n/2) --- i = i + 1 +-- else +-- return ... -- end --- return t -- end -- --- -- a bit faster - -local function bits(n,i,...) - if n > 0 then - local m = n % 2 - local n = floor(n/2) - if m > 0 then - return bits(n, i+1, i, ...) - else - return bits(n, i+1, ...) - end - else - return ... - end -end - -function number.bits(n) - return { bits(n,1) } -end +-- function number.bits(n) +-- return { bits(n,1) } +-- end function number.bytetodecimal(b) local d = floor(b * 100 / 255 + 0.5) diff --git a/tex/context/base/mkiv/l-package.lua b/tex/context/base/mkiv/l-package.lua index 075fcde25..d43c5c5c6 100644 --- a/tex/context/base/mkiv/l-package.lua +++ b/tex/context/base/mkiv/l-package.lua @@ -23,6 +23,10 @@ local P, S, Cs, lpegmatch = lpeg.P, lpeg.S, lpeg.Cs, lpeg.match local package = package local searchers = package.searchers or package.loaders +local insert, remove = table.insert, table.remove + +-------.loaders = nil -- old stuff that we don't want +-------.seeall = nil -- old stuff that we don't want -- dummies @@ -191,7 +195,25 @@ local function registerpath(tag,what,target,...) add(path) end end - return paths +end + +local function pushpath(tag,what,target,path) + local path = helpers.cleanpath(path) + insert(target,1,path) + if helpers.trace then + helpers.report("pushing %s path in front: %s",tag,path) + end +end + +local function poppath(tag,what,target) + local path = remove(target,1) + if helpers.trace then + if path then + helpers.report("popping %s path from front: %s",tag,path) + else + helpers.report("no %s path to pop",tag) + end + end end helpers.registerpath = registerpath @@ -199,10 +221,22 @@ helpers.registerpath = registerpath function package.extraluapath(...) registerpath("extra lua","lua",extraluapaths,...) end +function package.pushluapath(path) + pushpath("extra lua","lua",extraluapaths,path) +end +function package.popluapath() + poppath("extra lua","lua",extraluapaths) +end function package.extralibpath(...) registerpath("extra lib","lib",extralibpaths,...) end +function package.pushlibpath(path) + pushpath("extra lib","lib",extralibpaths,path) +end +function package.poplibpath() + poppath("extra lib","lua",extralibpaths) +end -- lib loader (used elsewhere) diff --git a/tex/context/base/mkiv/l-sandbox.lua b/tex/context/base/mkiv/l-sandbox.lua index 7a89aa8cd..2ecec0023 100644 --- a/tex/context/base/mkiv/l-sandbox.lua +++ b/tex/context/base/mkiv/l-sandbox.lua @@ -17,7 +17,7 @@ local global = _G local next = next local unpack = unpack or table.unpack local type = type -local tprint = texio.write_nl or print +local tprint = texio and texio.write_nl or print local tostring = tostring local format = string.format -- no formatters yet local concat = table.concat @@ -310,3 +310,4 @@ if supported("lfs") then lfs.shortname = register(lfs.shortname, "lfs.shortname") lfs.symlinkattributes = register(lfs.symlinkattributes,"lfs.symlinkattributes") end + diff --git a/tex/context/base/mkiv/l-string.lua b/tex/context/base/mkiv/l-string.lua index e0fb28445..8ae8d8d1d 100644 --- a/tex/context/base/mkiv/l-string.lua +++ b/tex/context/base/mkiv/l-string.lua @@ -18,7 +18,7 @@ local P, S, C, Ct, Cc, Cs = lpeg.P, lpeg.S, lpeg.C, lpeg.Ct, lpeg.Cc, lpeg.Cs -- -- function string.split(str,pattern) -- local t = { } --- if #str > 0 then +-- if str ~= "" then -- local n = 1 -- for s in gmatch(str..pattern,"(.-)"..pattern) do -- t[n] = s @@ -220,11 +220,11 @@ string.unquote = string.unquoted -- new -if not string.bytetable then +if not string.bytetable then -- used in font-cff.lua local limit = 5000 -- we can go to 8000 in luajit and much higher in lua if needed - function string.bytetable(str) + function string.bytetable(str) -- from a string local n = #str if n > limit then local t = { byte(str,1,limit) } diff --git a/tex/context/base/mkiv/l-table.lua b/tex/context/base/mkiv/l-table.lua index 3c1ce6daf..9d7152544 100644 --- a/tex/context/base/mkiv/l-table.lua +++ b/tex/context/base/mkiv/l-table.lua @@ -6,7 +6,7 @@ if not modules then modules = { } end modules ['l-table'] = { license = "see context related readme files" } -local type, next, tostring, tonumber, ipairs, select = type, next, tostring, tonumber, ipairs, select +local type, next, tostring, tonumber, select = type, next, tostring, tonumber, select local table, string = table, string local concat, sort, insert, remove = table.concat, table.sort, table.insert, table.remove local format, lower, dump = string.format, string.lower, string.dump @@ -22,6 +22,10 @@ local floor = math.floor local stripper = patterns.stripper +function table.getn(t) + return t and #t -- for very old times sake +end + function table.strip(tab) local lst, l = { }, 0 for i=1,#tab do @@ -460,7 +464,7 @@ function table.tohash(t,value) local h = { } if t then if value == nil then value = true end - for _, v in next, t do -- no ipairs here + for _, v in next, t do h[v] = value end end @@ -469,7 +473,7 @@ end function table.fromhash(t) local hsh, h = { }, 0 - for k, v in next, t do -- no ipairs here + for k, v in next, t do if v then h = h + 1 hsh[h] = k @@ -1092,7 +1096,9 @@ function table.unnest(t) -- bad name end local function are_equal(a,b,n,m) -- indexed - if a and b and #a == #b then + if a == b then + return true + elseif a and b and #a == #b then n = n or 1 m = m or #a for i=n,m do @@ -1114,16 +1120,18 @@ local function are_equal(a,b,n,m) -- indexed end local function identical(a,b) -- assumes same structure - for ka, va in next, a do - local vb = b[ka] - if va == vb then - -- same - elseif type(va) == "table" and type(vb) == "table" then - if not identical(va,vb) then + if a ~= b then + for ka, va in next, a do + local vb = b[ka] + if va == vb then + -- same + elseif type(va) == "table" and type(vb) == "table" then + if not identical(va,vb) then + return false + end + else return false end - else - return false end end return true @@ -1388,3 +1396,26 @@ function table.filtered(t,pattern,sort,cmp) return nothing end end + +-- lua 5.3: + +if not table.move then + + function table.move(a1,f,e,t,a2) + if a2 and a1 ~= a2 then + for i=f,e do + a2[t] = a1[i] + t = t + 1 + end + return a2 + else + t = t + e - f + for i=e,f,-1 do + a1[t] = a1[i] + t = t - 1 + end + return a1 + end + end + +end diff --git a/tex/context/base/mkiv/l-unicode.lua b/tex/context/base/mkiv/l-unicode.lua index b913d0cfc..b5f52d312 100644 --- a/tex/context/base/mkiv/l-unicode.lua +++ b/tex/context/base/mkiv/l-unicode.lua @@ -6,6 +6,9 @@ if not modules then modules = { } end modules ['l-unicode'] = { license = "see context related readme files" } +-- floor(b/256) => rshift(b, 8) +-- floor(b/1024) => rshift(b,10) + -- in lua 5.3: -- utf8.char(···) : concatinated @@ -18,6 +21,9 @@ if not modules then modules = { } end modules ['l-unicode'] = { -- todo: utf.sub replacement (used in syst-aux) -- we put these in the utf namespace: +-- used : byte char gmatch len lower sub upper +-- not used : dump find format gfind gsub match rep reverse + utf = utf or (unicode and unicode.utf8) or { } utf.characters = utf.characters or string.utfcharacters @@ -29,6 +35,9 @@ utf.values = utf.values or string.utfvalues -- string.characterpairs -- string.bytes -- string.bytepairs +-- string.utflength +-- string.utfvalues +-- string.utfcharacters local type = type local char, byte, format, sub, gmatch = string.char, string.byte, string.format, string.sub, string.gmatch @@ -64,53 +73,103 @@ end if not utf.char then - local floor, char = math.floor, string.char - - function utf.char(n) - if n < 0x80 then - -- 0aaaaaaa : 0x80 - return char(n) - elseif n < 0x800 then - -- 110bbbaa : 0xC0 : n >> 6 - -- 10aaaaaa : 0x80 : n & 0x3F - return char( - 0xC0 + floor(n/0x40), - 0x80 + (n % 0x40) - ) - elseif n < 0x10000 then - -- 1110bbbb : 0xE0 : n >> 12 - -- 10bbbbaa : 0x80 : (n >> 6) & 0x3F - -- 10aaaaaa : 0x80 : n & 0x3F - return char( - 0xE0 + floor(n/0x1000), - 0x80 + (floor(n/0x40) % 0x40), - 0x80 + (n % 0x40) - ) - elseif n < 0x200000 then - -- 11110ccc : 0xF0 : n >> 18 - -- 10ccbbbb : 0x80 : (n >> 12) & 0x3F - -- 10bbbbaa : 0x80 : (n >> 6) & 0x3F - -- 10aaaaaa : 0x80 : n & 0x3F - -- dddd : ccccc - 1 - return char( - 0xF0 + floor(n/0x40000), - 0x80 + (floor(n/0x1000) % 0x40), - 0x80 + (floor(n/0x40) % 0x40), - 0x80 + (n % 0x40) - ) + utf.char = string.utfcharacter or (utf8 and utf8.char) + + if not utf.char then + + -- no multiples + + local char = string.char + + if bit32 then + + local rshift = bit32.rshift + + function utf.char(n) + if n < 0x80 then + -- 0aaaaaaa : 0x80 + return char(n) + elseif n < 0x800 then + -- 110bbbaa : 0xC0 : n >> 6 + -- 10aaaaaa : 0x80 : n & 0x3F + return char( + 0xC0 + rshift(n,6), + 0x80 + (n % 0x40) + ) + elseif n < 0x10000 then + -- 1110bbbb : 0xE0 : n >> 12 + -- 10bbbbaa : 0x80 : (n >> 6) & 0x3F + -- 10aaaaaa : 0x80 : n & 0x3F + return char( + 0xE0 + rshift(n,12), + 0x80 + (rshift(n,6) % 0x40), + 0x80 + (n % 0x40) + ) + elseif n < 0x200000 then + -- 11110ccc : 0xF0 : n >> 18 + -- 10ccbbbb : 0x80 : (n >> 12) & 0x3F + -- 10bbbbaa : 0x80 : (n >> 6) & 0x3F + -- 10aaaaaa : 0x80 : n & 0x3F + -- dddd : ccccc - 1 + return char( + 0xF0 + rshift(n,18), + 0x80 + (rshift(n,12) % 0x40), + 0x80 + (rshift(n,6) % 0x40), + 0x80 + (n % 0x40) + ) + else + return "" + end + end + else - return "" + + local floor = math.floor + + function utf.char(n) + if n < 0x80 then + return char(n) + elseif n < 0x800 then + return char( + 0xC0 + floor(n/0x40), + 0x80 + (n % 0x40) + ) + elseif n < 0x10000 then + return char( + 0xE0 + floor(n/0x1000), + 0x80 + (floor(n/0x40) % 0x40), + 0x80 + (n % 0x40) + ) + elseif n < 0x200000 then + return char( + 0xF0 + floor(n/0x40000), + 0x80 + (floor(n/0x1000) % 0x40), + 0x80 + (floor(n/0x40) % 0x40), + 0x80 + (n % 0x40) + ) + else + return "" + end + end + end + end end if not utf.byte then - local utf8byte = patterns.utf8byte + utf.byte = string.utfvalue or (utf8 and utf8.codepoint) + + if not utf.byte then + + local utf8byte = patterns.utf8byte + + function utf.byte(c) + return lpegmatch(utf8byte,c) + end - function utf.byte(c) - return lpegmatch(utf8byte,c) end end @@ -171,43 +230,6 @@ local one = P(1) local two = C(1) * C(1) local four = C(R(utfchar(0xD8),utfchar(0xFF))) * C(1) * C(1) * C(1) --- actually one of them is already utf ... sort of useless this one - --- function utf.char(n) --- if n < 0x80 then --- return char(n) --- elseif n < 0x800 then --- return char( --- 0xC0 + floor(n/0x40), --- 0x80 + (n % 0x40) --- ) --- elseif n < 0x10000 then --- return char( --- 0xE0 + floor(n/0x1000), --- 0x80 + (floor(n/0x40) % 0x40), --- 0x80 + (n % 0x40) --- ) --- elseif n < 0x40000 then --- return char( --- 0xF0 + floor(n/0x40000), --- 0x80 + floor(n/0x1000), --- 0x80 + (floor(n/0x40) % 0x40), --- 0x80 + (n % 0x40) --- ) --- else --- -- return char( --- -- 0xF1 + floor(n/0x1000000), --- -- 0x80 + floor(n/0x40000), --- -- 0x80 + floor(n/0x1000), --- -- 0x80 + (floor(n/0x40) % 0x40), --- -- 0x80 + (n % 0x40) --- -- ) --- return "?" --- end --- end --- --- merge into: - local pattern = P("\254\255") * Cs( ( four / function(a,b,c,d) local ab = 0xFF * byte(a) + byte(b) @@ -253,83 +275,89 @@ end if not utf.len then - -- -- alternative 1: 0.77 - -- - -- local utfcharcounter = utfbom^-1 * Cs((p_utf8char/'!')^0) - -- - -- function utf.len(str) - -- return #lpegmatch(utfcharcounter,str or "") - -- end - -- - -- -- alternative 2: 1.70 - -- - -- local n = 0 - -- - -- local utfcharcounter = utfbom^-1 * (p_utf8char/function() n = n + 1 end)^0 -- slow - -- - -- function utf.length(str) - -- n = 0 - -- lpegmatch(utfcharcounter,str or "") - -- return n - -- end - -- - -- -- alternative 3: 0.24 (native unicode.utf8.len: 0.047) - - -- local n = 0 - -- - -- -- local utfcharcounter = lpeg.patterns.utfbom^-1 * P ( ( Cp() * ( - -- -- patterns.utf8one ^1 * Cc(1) - -- -- + patterns.utf8two ^1 * Cc(2) - -- -- + patterns.utf8three^1 * Cc(3) - -- -- + patterns.utf8four ^1 * Cc(4) ) * Cp() / function(f,d,t) n = n + (t - f)/d end - -- -- )^0 ) -- just as many captures as below - -- - -- -- local utfcharcounter = lpeg.patterns.utfbom^-1 * P ( ( - -- -- (Cmt(patterns.utf8one ^1,function(_,_,s) n = n + #s return true end)) - -- -- + (Cmt(patterns.utf8two ^1,function(_,_,s) n = n + #s/2 return true end)) - -- -- + (Cmt(patterns.utf8three^1,function(_,_,s) n = n + #s/3 return true end)) - -- -- + (Cmt(patterns.utf8four ^1,function(_,_,s) n = n + #s/4 return true end)) - -- -- )^0 ) -- not interesting as it creates strings but sometimes faster - -- - -- -- The best so far: - -- - -- local utfcharcounter = utfbom^-1 * P ( ( - -- Cp() * (patterns.utf8one )^1 * Cp() / function(f,t) n = n + t - f end - -- + Cp() * (patterns.utf8two )^1 * Cp() / function(f,t) n = n + (t - f)/2 end - -- + Cp() * (patterns.utf8three)^1 * Cp() / function(f,t) n = n + (t - f)/3 end - -- + Cp() * (patterns.utf8four )^1 * Cp() / function(f,t) n = n + (t - f)/4 end - -- )^0 ) - - -- function utf.len(str) - -- n = 0 - -- lpegmatch(utfcharcounter,str or "") - -- return n - -- end - - local n, f = 0, 1 + utf.len = string.utflength or (utf8 and utf8.len) + + if not utf.len then + + -- -- alternative 1: 0.77 + -- + -- local utfcharcounter = utfbom^-1 * Cs((p_utf8char/'!')^0) + -- + -- function utf.len(str) + -- return #lpegmatch(utfcharcounter,str or "") + -- end + -- + -- -- alternative 2: 1.70 + -- + -- local n = 0 + -- + -- local utfcharcounter = utfbom^-1 * (p_utf8char/function() n = n + 1 end)^0 -- slow + -- + -- function utf.length(str) + -- n = 0 + -- lpegmatch(utfcharcounter,str or "") + -- return n + -- end + -- + -- -- alternative 3: 0.24 (native unicode.utf8.len: 0.047) + + -- local n = 0 + -- + -- -- local utfcharcounter = lpeg.patterns.utfbom^-1 * P ( ( Cp() * ( + -- -- patterns.utf8one ^1 * Cc(1) + -- -- + patterns.utf8two ^1 * Cc(2) + -- -- + patterns.utf8three^1 * Cc(3) + -- -- + patterns.utf8four ^1 * Cc(4) ) * Cp() / function(f,d,t) n = n + (t - f)/d end + -- -- )^0 ) -- just as many captures as below + -- + -- -- local utfcharcounter = lpeg.patterns.utfbom^-1 * P ( ( + -- -- (Cmt(patterns.utf8one ^1,function(_,_,s) n = n + #s return true end)) + -- -- + (Cmt(patterns.utf8two ^1,function(_,_,s) n = n + #s/2 return true end)) + -- -- + (Cmt(patterns.utf8three^1,function(_,_,s) n = n + #s/3 return true end)) + -- -- + (Cmt(patterns.utf8four ^1,function(_,_,s) n = n + #s/4 return true end)) + -- -- )^0 ) -- not interesting as it creates strings but sometimes faster + -- + -- -- The best so far: + -- + -- local utfcharcounter = utfbom^-1 * P ( ( + -- Cp() * (patterns.utf8one )^1 * Cp() / function(f,t) n = n + t - f end + -- + Cp() * (patterns.utf8two )^1 * Cp() / function(f,t) n = n + (t - f)/2 end + -- + Cp() * (patterns.utf8three)^1 * Cp() / function(f,t) n = n + (t - f)/3 end + -- + Cp() * (patterns.utf8four )^1 * Cp() / function(f,t) n = n + (t - f)/4 end + -- )^0 ) + + -- function utf.len(str) + -- n = 0 + -- lpegmatch(utfcharcounter,str or "") + -- return n + -- end + + local n, f = 0, 1 + + local utfcharcounter = patterns.utfbom^-1 * Cmt ( + Cc(1) * patterns.utf8one ^1 + + Cc(2) * patterns.utf8two ^1 + + Cc(3) * patterns.utf8three^1 + + Cc(4) * patterns.utf8four ^1, + function(_,t,d) -- due to Cc no string captures, so faster + n = n + (t - f)/d + f = t + return true + end + )^0 - local utfcharcounter = patterns.utfbom^-1 * Cmt ( - Cc(1) * patterns.utf8one ^1 - + Cc(2) * patterns.utf8two ^1 - + Cc(3) * patterns.utf8three^1 - + Cc(4) * patterns.utf8four ^1, - function(_,t,d) -- due to Cc no string captures, so faster - n = n + (t - f)/d - f = t - return true + function utf.len(str) + n, f = 0, 1 + lpegmatch(utfcharcounter,str or "") + return n end - )^0 - function utf.len(str) - n, f = 0, 1 - lpegmatch(utfcharcounter,str or "") - return n - end + -- -- these are quite a bit slower: - -- -- these are quite a bit slower: + -- utfcharcounter = utfbom^-1 * (Cmt(P(1) * R("\128\191")^0, function() n = n + 1 return true end))^0 -- 50+ times slower + -- utfcharcounter = utfbom^-1 * (Cmt(P(1), function() n = n + 1 return true end) * R("\128\191")^0)^0 -- 50- times slower - -- utfcharcounter = utfbom^-1 * (Cmt(P(1) * R("\128\191")^0, function() n = n + 1 return true end))^0 -- 50+ times slower - -- utfcharcounter = utfbom^-1 * (Cmt(P(1), function() n = n + 1 return true end) * R("\128\191")^0)^0 -- 50- times slower + end end @@ -1041,21 +1069,23 @@ end local function little(b) if b < 0x10000 then - return char(b%256,b/256) + return char(b%256,rshift(b,8)) else b = b - 0x10000 - local b1, b2 = b/1024 + 0xD800, b%1024 + 0xDC00 - return char(b1%256,b1/256,b2%256,b2/256) + local b1 = rshift(b,10) + 0xD800 + local b2 = b%1024 + 0xDC00 + return char(b1%256,rshift(b1,8),b2%256,rshift(b2,8)) end end local function big(b) if b < 0x10000 then - return char(b/256,b%256) + return char(rshift(b,8),b%256) else b = b - 0x10000 - local b1, b2 = b/1024 + 0xD800, b%1024 + 0xDC00 - return char(b1/256,b1%256,b2/256,b2%256) + local b1 = rshift(b,10) + 0xD800 + local b2 = b%1024 + 0xDC00 + return char(rshift(b1,8),b1%256,rshift(b2,8),b2%256) end end @@ -1275,30 +1305,57 @@ end -- -- local utf32 = table.setmetatableindex(function(t,k) local v = toutf32(k) t[k] = v return v end) -local extract = bit32.extract -local char = string.char - -function unicode.toutf32string(n) - if n <= 0xFF then - return - char(n) .. - "\000\000\000" - elseif n <= 0xFFFF then - return - char(extract(n, 0,8)) .. - char(extract(n, 8,8)) .. - "\000\000" - elseif n <= 0xFFFFFF then - return - char(extract(n, 0,8)) .. - char(extract(n, 8,8)) .. - char(extract(n,16,8)) .. - "\000" - else - return - char(extract(n, 0,8)) .. - char(extract(n, 8,8)) .. - char(extract(n,16,8)) .. - char(extract(n,24,8)) +if bit32 then + + local extract = bit32.extract + local char = string.char + + function unicode.toutf32string(n) + if n <= 0xFF then + return + char(n) .. + "\000\000\000" + elseif n <= 0xFFFF then + return + char(extract(n, 0,8)) .. + char(extract(n, 8,8)) .. + "\000\000" + elseif n <= 0xFFFFFF then + return + char(extract(n, 0,8)) .. + char(extract(n, 8,8)) .. + char(extract(n,16,8)) .. + "\000" + else + return + char(extract(n, 0,8)) .. + char(extract(n, 8,8)) .. + char(extract(n,16,8)) .. + char(extract(n,24,8)) + end + end + +end + +-- goodie: + +local len = utf.len +local rep = rep + +function string.utfpadd(s,n) + if n and n ~= 0 then + local l = len(s) + if n > 0 then + local d = n - l + if d > 0 then + return rep(c or " ",d) .. s + end + else + local d = - n - l + if d > 0 then + return s .. rep(c or " ",d) + end + end end + return s end diff --git a/tex/context/base/mkiv/l-url.lua b/tex/context/base/mkiv/l-url.lua index b189ec5bb..6f834d778 100644 --- a/tex/context/base/mkiv/l-url.lua +++ b/tex/context/base/mkiv/l-url.lua @@ -8,9 +8,10 @@ if not modules then modules = { } end modules ['l-url'] = { local char, format, byte = string.char, string.format, string.byte local concat = table.concat -local tonumber, type = tonumber, type +local tonumber, type, next = tonumber, type, next local P, C, R, S, Cs, Cc, Ct, Cf, Cg, V = lpeg.P, lpeg.C, lpeg.R, lpeg.S, lpeg.Cs, lpeg.Cc, lpeg.Ct, lpeg.Cf, lpeg.Cg, lpeg.V local lpegmatch, lpegpatterns, replacer = lpeg.match, lpeg.patterns, lpeg.replacer +local sortedhash = table.sortedhash -- from wikipedia: -- @@ -32,22 +33,61 @@ local lpegmatch, lpegpatterns, replacer = lpeg.match, lpeg.patterns, lpeg.replac url = url or { } local url = url -local tochar = function(s) return char(tonumber(s,16)) end +local unescapes = { } +local escapes = { } + +setmetatable(unescapes, { __index = function(t,k) + local v = char(tonumber(k,16)) + t[k] = v + return v +end }) + +setmetatable(escapes, { __index = function(t,k) + local v = format("%%%02X",byte(k)) + t[k] = v + return v +end }) + +-- okay: local colon = P(":") local qmark = P("?") local hash = P("#") local slash = P("/") +local atsign = P("@") local percent = P("%") local endofstring = P(-1) - local hexdigit = R("09","AF","af") local plus = P("+") local nothing = Cc("") -local escapedchar = (percent * C(hexdigit * hexdigit)) / tochar -local escaped = (plus / " ") + escapedchar -- so no loc://foo++.tex - -local noslash = P("/") / "" +local okay = R("09","AZ","az") + S("-_.,:=+*~!'()@&$") + +local escapedchar = (percent * C(hexdigit * hexdigit)) / unescapes +local unescapedchar = P(1) / escapes +local escaped = (plus / " ") + escapedchar -- so no loc://foo++.tex +local noslash = P("/") / "" +local plustospace = P("+")/" " + +local decoder = Cs( ( + plustospace + + escapedchar + + P("\r\n")/"\n" + + P(1) + )^0 ) +local encoder = Cs( ( + R("09","AZ","az")^1 + + S("-./_")^1 + + P(" ")/"+" + + P("\n")/"\r\n" + + unescapedchar + )^0 ) + +lpegpatterns.urldecoder = decoder +lpegpatterns.urlencoder = encoder + +function url.decode (str) return str and lpegmatch(decoder, str) or str end +function url.encode (str) return str and lpegmatch(encoder, str) or str end +function url.unescape(str) return str and lpegmatch(unescaper,str) or str end -- we assume schemes with more than 1 character (in order to avoid problems with windows disks) -- we also assume that when we have a scheme, we also have an authority @@ -73,17 +113,9 @@ local parser = Ct(validurl) lpegpatterns.url = validurl lpegpatterns.urlsplitter = parser -local escapes = { } - -setmetatable(escapes, { __index = function(t,k) - local v = format("%%%02X",byte(k)) - t[k] = v - return v -end }) - -local escaper = Cs((R("09","AZ","az")^1 + P(" ")/"%%20" + S("-./_")^1 + P(1) / escapes)^0) -- space happens most +local escaper = Cs((R("09","AZ","az")^1 + P(" ")/"%%20" + S("-./_:")^1 + P(1) / escapes)^0) -- space happens most local unescaper = Cs((escapedchar + 1)^0) -local getcleaner = Cs((P("+++") / "%%2B" + P("+") / "%%20" + P(1))^1) +local getcleaner = Cs((P("+++")/"%%2B" + P("+")/"%%20" + P(1))^1) lpegpatterns.urlunescaped = escapedchar lpegpatterns.urlescaper = escaper @@ -134,8 +166,8 @@ local backslashswapper = replacer("\\","/") local equal = P("=") local amp = P("&") -local key = Cs(((escapedchar+1)-equal )^0) -local value = Cs(((escapedchar+1)-amp -endofstring)^0) +local key = Cs(((plustospace + escapedchar + 1) - equal )^0) +local value = Cs(((plustospace + escapedchar + 1) - amp - endofstring)^0) local splitquery = Cf ( Ct("") * P { "sequence", sequence = V("pair") * (amp * V("pair"))^0, @@ -144,6 +176,11 @@ local splitquery = Cf ( Ct("") * P { "sequence", -- hasher +local userpart = (1-atsign-colon)^1 +local serverpart = (1-colon)^1 +local splitauthority = ((Cs(userpart) * colon * Cs(userpart) + Cs(userpart) * Cc(nil)) * atsign + Cc(nil) * Cc(nil)) + * Cs(serverpart) * (colon * (serverpart/tonumber) + Cc(nil)) + local function hashed(str) -- not yet ok (/test?test) if not str or str == "" then return { @@ -177,12 +214,21 @@ local function hashed(str) -- not yet ok (/test?test) -- not always a filename but handy anyway local authority = detailed[2] local path = detailed[3] - local filename = nil + local filename -- = nil + local username -- = nil + local password -- = nil + local host -- = nil + local port -- = nil + if authority ~= "" then + -- these can be invalid + username, password, host, port = lpegmatch(splitauthority,authority) + end if authority == "" then filename = path elseif path == "" then filename = "" else + -- this one can be can be invalid filename = authority .. "/" .. path end return { @@ -195,6 +241,11 @@ local function hashed(str) -- not yet ok (/test?test) original = str, noscheme = false, filename = filename, + -- + host = host, + port = port, + -- usename = username, + -- password = password, } end @@ -236,24 +287,38 @@ function url.addscheme(str,scheme) -- no authority end function url.construct(hash) -- dodo: we need to escape ! - local fullurl, f = { }, 0 - local scheme, authority, path, query, fragment = hash.scheme, hash.authority, hash.path, hash.query, hash.fragment + local result, r = { }, 0 + local scheme = hash.scheme + local authority = hash.authority + local path = hash.path + local queries = hash.queries + local fragment = hash.fragment if scheme and scheme ~= "" then - f = f + 1 ; fullurl[f] = scheme .. "://" + r = r + 1 ; result[r] = lpegmatch(escaper,scheme) + r = r + 1 ; result[r] = "://" end if authority and authority ~= "" then - f = f + 1 ; fullurl[f] = authority + r = r + 1 ; result[r] = lpegmatch(escaper,authority) end if path and path ~= "" then - f = f + 1 ; fullurl[f] = "/" .. path + r = r + 1 ; result[r] = "/" + r = r + 1 ; result[r] = lpegmatch(escaper,path) end - if query and query ~= "" then - f = f + 1 ; fullurl[f] = "?".. query + if queries then + local done = false + for k, v in sortedhash(queries) do + r = r + 1 ; result[r] = done and "&" or "?" + r = r + 1 ; result[r] = lpegmatch(escaper,k) -- is this escaped + r = r + 1 ; result[r] = "=" + r = r + 1 ; result[r] = lpegmatch(escaper,v) -- is this escaped + done = true + end end if fragment and fragment ~= "" then - f = f + 1 ; fullurl[f] = "#".. fragment + r = r + 1 ; result[r] = "#" + r = r + 1 ; result[r] = lpegmatch(escaper,fragment) end - return lpegmatch(escaper,concat(fullurl)) + return concat(result) end local pattern = Cs(slash^-1/"" * R("az","AZ") * ((S(":|")/":") + P(":")) * slash * P(1)^0) diff --git a/tex/context/base/mkiv/lang-def.mkiv b/tex/context/base/mkiv/lang-def.mkiv index 96bb88767..28245e591 100644 --- a/tex/context/base/mkiv/lang-def.mkiv +++ b/tex/context/base/mkiv/lang-def.mkiv @@ -381,6 +381,23 @@ % Anatolian Languages +% Hebrew + +\installlanguage % same as arabic now .. someone needs to fix this + [\s!he] + [\c!spacing=\v!broad, + \c!leftsentence=\emdash, + \c!rightsentence=\emdash, + \c!leftsubsentence=\emdash, + \c!rightsubsentence=\emdash, + \c!leftquote=\upperleftsinglesixquote, + \c!rightquote=\upperrightsingleninequote, + \c!leftquotation=\upperleftdoublesixquote, + \c!rightquotation=\upperrightdoubleninequote, + \c!date={\v!day,\space,\v!month,{،\space},\v!year}] + +\installlanguage [\s!hebrew] [\s!he] + % Arabic Languages \installlanguage diff --git a/tex/context/base/mkiv/lang-dis.lua b/tex/context/base/mkiv/lang-dis.lua index e2c0d220e..65a53a702 100644 --- a/tex/context/base/mkiv/lang-dis.lua +++ b/tex/context/base/mkiv/lang-dis.lua @@ -8,6 +8,7 @@ if not modules then modules = { } end modules ['lang-dis'] = { local concat = table.concat +local tex = tex local nodes = nodes local tasks = nodes.tasks @@ -19,7 +20,6 @@ local setaction = tasks.setaction local tonode = nuts.tonode local tonut = nuts.tonut -local getfield = nuts.getfield local setfield = nuts.setfield local getnext = nuts.getnext local getprev = nuts.getprev @@ -44,6 +44,8 @@ local traverse_id = nuts.traverse_id local flush_list = nuts.flush_list local flush_node = nuts.flush_node +local new_disc = nuts.pool.disc + local nodecodes = nodes.nodecodes local disccodes = nodes.disccodes @@ -59,161 +61,11 @@ local a_visualize = attributes.private("visualizediscretionary") local setattribute = tex.setattribute local getlanguagedata = languages.getdata +local prehyphenchar = lang.prehyphenchar +local posthyphenchar = lang.posthyphenchar local check_regular = true -local expanders -- this will go away - --- the penalty has been determined by the mode (currently we force 1): --- --- 0 : exhyphenpenalty --- 1 : hyphenpenalty --- 2 : automatichyphenpenalty --- --- following a - : the pre and post chars are already appended and set --- so we have pre=preex and post=postex .. however, the previous --- hyphen is already injected ... downside: the font handler sees this --- so this is another argument for doing a hyphenation pass in context - -if LUATEXVERSION < 1.005 then - - expanders = { - [discretionary_code] = function(d,template) - -- \discretionary - return template - end, - [explicit_code] = function(d,template) - -- \- - local pre, post, replace = getdisc(d) - local done = false - if pre then - local char = isglyph(pre) - if char and char <= 0 then - done = true - flush_list(pre) - pre = nil - end - end - if post then - local char = isglyph(post) - if char and char <= 0 then - done = true - flush_list(post) - post = nil - end - end - if done then - -- todo: take existing penalty - setdisc(d,pre,post,replace,explicit_code,tex.exhyphenpenalty) - else - setsubtype(d,explicit_code) - end - return template - end, - [automatic_code] = function(d,template) - local pre, post, replace = getdisc(d) - if pre then - -- we have a preex characters and want that one to replace the - -- character in front which is the trigger - if not template then - -- can there be font kerns already? - template = getprev(d) - if template and getid(template) ~= glyph_code then - template = getnext(d) - if template and getid(template) ~= glyph_code then - template = nil - end - end - end - if template then - local pseudohead = getprev(template) - if pseudohead then - while template ~= d do - pseudohead, template, removed = remove_node(pseudohead,template) - -- free old replace ? - replace = removed - -- break ? - end - else - -- can't happen - end - setdisc(d,pre,post,replace,automatic_code,tex.hyphenpenalty) - else - -- print("lone regular discretionary ignored") - end - else - setdisc(d,pre,post,replace,automatic_code,tex.hyphenpenalty) - end - return template - end, - [regular_code] = function(d,template) - if check_regular then - -- simple - if not template then - -- can there be font kerns already? - template = getprev(d) - if template and getid(template) ~= glyph_code then - template = getnext(d) - if template and getid(template) ~= glyph_code then - template = nil - end - end - end - if template then - local language = template and getlang(template) - local data = getlanguagedata(language) - local prechar = data.prehyphenchar - local postchar = data.posthyphenchar - local pre, post, replace = getdisc(d) -- pre can be set - local done = false - if prechar and prechar > 0 then - done = true - pre = copy_node(template) - setchar(pre,prechar) - end - if postchar and postchar > 0 then - done = true - post = copy_node(template) - setchar(post,postchar) - end - if done then - setdisc(d,pre,post,replace,regular_code,tex.hyphenpenalty) - end - else - -- print("lone regular discretionary ignored") - end - return template - end - end, - [disccodes.first] = function() - -- forget about them - end, - [disccodes.second] = function() - -- forget about them - end, - } - - function languages.expand(d,template,subtype) - if not subtype then - subtype = getsubtype(d) - end - if subtype ~= discretionary_code then - return expanders[subtype](d,template) - end - end - -else - - function languages.expand() - -- nothing to be fixed - end - -end - -languages.expanders = expanders - --- -- -- -- -- - local setlistcolor = nodes.tracers.colors.setlist function languages.visualizediscretionaries(head) @@ -252,55 +104,83 @@ interfaces.implement { actions = languages.showdiscretionaries } -local toutf = nodes.listtoutf +do + + local toutf = nodes.listtoutf + local utfchar = utf.char + local f_disc = string.formatters["{%s}{%s}{%s}"] + local replace = lpeg.replacer( { + [utfchar(0x200C)] = "|", + [utfchar(0x200D)] = "|", + }, nil, true) + + local function convert(list) + return list and replace(toutf(list)) or "" + end + + function languages.serializediscretionary(d) -- will move to tracer + local pre, post, replace = getdisc(d) + return f_disc(convert(pre),convert(post),convert(replace)) + end -function languages.serializediscretionary(d) -- will move to tracer - local pre, post, replace = getdisc(d) - return string.formatters["{%s}{%s}{%s}"]( - pre and toutf(pre) or "", - post and toutf(post) or "", - replace and toutf(replace) or "" - ) end -- -- local wiped = 0 -local function wipe(head,delayed) - local p, n = getboth(delayed) - local _, _, h, _, _, t = getdisc(delayed,true) - if p or n then - if h then - setlink(p,h) - setlink(t,n) - setfield(delayed,"replace") - else - setlink(p,n) - end +local flatten_discretionaries = node.flatten_discretionaries -- todo in nodes + +if flatten_discretionaries then + + -- This is not that much faster than the lua variant simply because there is + -- seldom a replace list but it fits in the picture. See luatex-todo.w for the + -- code. + + function languages.flatten(head) + local h, n = flatten_discretionaries(head) + wiped = wiped + n + return h, n > 0 end - if head == delayed then - head = h + +else + + local function wipe(head,delayed) + local p, n = getboth(delayed) + local _, _, h, _, _, t = getdisc(delayed,true) + if p or n then + if h then + setlink(p,h) + setlink(t,n) + setfield(delayed,"replace") + else + setlink(p,n) + end + end + if head == delayed then + head = h + end + wiped = wiped + 1 + flush_node(delayed) + return head end - wiped = wiped + 1 - flush_node(delayed) - return head -end -function languages.flatten(head) - local nuthead = tonut(head) - local delayed = nil - for d in traverse_id(disc_code,nuthead) do + function languages.flatten(head) + local nuthead = tonut(head) + local delayed = nil + for d in traverse_id(disc_code,nuthead) do + if delayed then + nuthead = wipe(nuthead,delayed) + end + delayed = d + end if delayed then - nuthead = wipe(nuthead,delayed) + return tonode(wipe(nuthead,delayed)), true + else + return head, false end - delayed = d - end - if delayed then - return tonode(wipe(nuthead,delayed)), true - else - return head, false end + end function languages.nofflattened() @@ -325,3 +205,28 @@ directives.register("hyphenator.flatten",function(v) setaction("processors","nodes.handlers.flatten",v) setaction("contributers","nodes.handlers.flattenline",v) end) + +-- moved here: + +function languages.explicithyphen(template) + local pre, post + local disc = new_disc() + if template then + local langdata = getlanguagedata(getlang(template)) + local instance = langdata and langdata.instance + if instance then + local prechr = prehyphenchar(instance) + local postchr = posthyphenchar(instance) + if prechr >= 0 then + pre = copy_node(template) + setchar(pre,prechr) + end + if postchr >= 0 then + post = copy_node(template) + setchar(post,postchr) + end + end + end + setdisc(disc,pre,post,nil,explicit_code,tex.exhyphenpenalty) + return disc +end diff --git a/tex/context/base/mkiv/lang-exc.lua b/tex/context/base/mkiv/lang-exc.lua new file mode 100644 index 000000000..bed328da8 --- /dev/null +++ b/tex/context/base/mkiv/lang-exc.lua @@ -0,0 +1,16 @@ +if not modules then modules = { } end modules ['lang-exc'] = { + version = 1.001, + comment = "companion to lang-ini.mkiv", + author = "Hans Hagen", + copyright = "ConTeXt Development Team", + license = "see context related readme files", + dataonly = true, +} + +-- Here we add common exceptions. This file can grow. For now we keep it +-- in the main base tree. We actually need a generic (shared) pattern or +-- exception file I guess. + +return { + "lua-jit", +} diff --git a/tex/context/base/mkiv/lang-exp.lua b/tex/context/base/mkiv/lang-exp.lua new file mode 100644 index 000000000..70fad48b0 --- /dev/null +++ b/tex/context/base/mkiv/lang-exp.lua @@ -0,0 +1,219 @@ +if not modules then modules = { } end modules ['lang-exp'] = { + version = 1.001, + comment = "companion to lang-ini.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +-- This module contains snippets that were used before we expanded +-- discretionaries in the engine which makes way more sense. This +-- code is nod used any more. + +if true then + return +end + +-- lang-dis.lua: + +local expanders -- this will go away + +-- the penalty has been determined by the mode (currently we force 1): +-- +-- 0 : exhyphenpenalty +-- 1 : hyphenpenalty +-- 2 : automatichyphenpenalty +-- +-- following a - : the pre and post chars are already appended and set +-- so we have pre=preex and post=postex .. however, the previous +-- hyphen is already injected ... downside: the font handler sees this +-- so this is another argument for doing a hyphenation pass in context + +if LUATEXVERSION < 1.005 then -- not loaded any more + + expanders = { + [discretionary_code] = function(d,template) + -- \discretionary + return template + end, + [explicit_code] = function(d,template) + -- \- + local pre, post, replace = getdisc(d) + local done = false + if pre then + local char = isglyph(pre) + if char and char <= 0 then + done = true + flush_list(pre) + pre = nil + end + end + if post then + local char = isglyph(post) + if char and char <= 0 then + done = true + flush_list(post) + post = nil + end + end + if done then + -- todo: take existing penalty + setdisc(d,pre,post,replace,explicit_code,tex.exhyphenpenalty) + else + setsubtype(d,explicit_code) + end + return template + end, + [automatic_code] = function(d,template) + local pre, post, replace = getdisc(d) + if pre then + -- we have a preex characters and want that one to replace the + -- character in front which is the trigger + if not template then + -- can there be font kerns already? + template = getprev(d) + if template and getid(template) ~= glyph_code then + template = getnext(d) + if template and getid(template) ~= glyph_code then + template = nil + end + end + end + if template then + local pseudohead = getprev(template) + if pseudohead then + while template ~= d do + pseudohead, template, removed = remove_node(pseudohead,template) + -- free old replace ? + replace = removed + -- break ? + end + else + -- can't happen + end + setdisc(d,pre,post,replace,automatic_code,tex.hyphenpenalty) + else + -- print("lone regular discretionary ignored") + end + else + setdisc(d,pre,post,replace,automatic_code,tex.hyphenpenalty) + end + return template + end, + [regular_code] = function(d,template) + if check_regular then + -- simple + if not template then + -- can there be font kerns already? + template = getprev(d) + if template and getid(template) ~= glyph_code then + template = getnext(d) + if template and getid(template) ~= glyph_code then + template = nil + end + end + end + if template then + local language = template and getlang(template) + local data = getlanguagedata(language) + local prechar = data.prehyphenchar + local postchar = data.posthyphenchar + local pre, post, replace = getdisc(d) -- pre can be set + local done = false + if prechar and prechar > 0 then + done = true + pre = copy_node(template) + setchar(pre,prechar) + end + if postchar and postchar > 0 then + done = true + post = copy_node(template) + setchar(post,postchar) + end + if done then + setdisc(d,pre,post,replace,regular_code,tex.hyphenpenalty) + end + else + -- print("lone regular discretionary ignored") + end + return template + end + end, + [disccodes.first] = function() + -- forget about them + end, + [disccodes.second] = function() + -- forget about them + end, + } + + function languages.expand(d,template,subtype) + if not subtype then + subtype = getsubtype(d) + end + if subtype ~= discretionary_code then + return expanders[subtype](d,template) + end + end + +else + + function languages.expand() + -- nothing to be fixed + end + +end + +languages.expanders = expanders + +-- lang-hyp.lua: + +----- expanders = languages.expanders -- gone in 1.005 +----- expand_explicit = expanders and expanders[explicit_code] +----- expand_automatic = expanders and expanders[automatic_code] + +if LUATEXVERSION < 1.005 then -- not loaded any more + + expanded = function(head) + local done = hyphenate(head) + if done then + for d in traverse_id(disc_code,tonut(head)) do + local s = getsubtype(d) + if s ~= discretionary_code then + expanders[s](d,template) + done = true + end + end + end + return head, done + end + +end + +-- if id == disc_code then +-- if expanded then +-- -- pre 1.005 +-- local subtype = getsubtype(current) +-- if subtype == discretionary_code then -- \discretionary +-- size = 0 +-- elseif subtype == explicit_code then -- \- => only here +-- -- automatic (-) : the old parser makes negative char entries +-- size = 0 +-- expand_explicit(current) +-- elseif subtype == automatic_code then -- - => only here +-- -- automatic (-) : the old hyphenator turns an exhyphen into glyph+disc +-- size = 0 +-- expand_automatic(current) +-- else +-- -- first : done by the hyphenator +-- -- second : done by the hyphenator +-- -- regular : done by the hyphenator +-- size = 0 +-- end +-- else +-- size = 0 +-- end +-- current = getnext(current) +-- if hyphenonly then +-- skipping = true +-- end diff --git a/tex/context/base/mkiv/lang-hyp.lua b/tex/context/base/mkiv/lang-hyp.lua index b85295f19..f73a51b3a 100644 --- a/tex/context/base/mkiv/lang-hyp.lua +++ b/tex/context/base/mkiv/lang-hyp.lua @@ -79,6 +79,8 @@ local type, rawset, tonumber, next = type, rawset, tonumber, next local P, R, S, Cg, Cf, Ct, Cc, C, Carg, Cs = lpeg.P, lpeg.R, lpeg.S, lpeg.Cg, lpeg.Cf, lpeg.Ct, lpeg.Cc, lpeg.C, lpeg.Carg, lpeg.Cs local lpegmatch = lpeg.match +local context = context + local concat = table.concat local insert = table.insert local remove = table.remove @@ -686,10 +688,6 @@ if context then local a_hyphenation = attributes.private("hyphenation") - local expanders = languages.expanders -- gone in 1.005 - local expand_explicit = expanders and expanders[explicit_code] - local expand_automatic = expanders and expanders[automatic_code] - local interwordpenalty = 5000 function traditional.loadpatterns(language) @@ -1044,6 +1042,7 @@ featureset.hyphenonly = hyphenonly == v_yes local extrachars = nil local hyphenchars = nil local language = nil + local lastfont = nil local start = nil local stop = nil local word = { } -- we reuse this table @@ -1406,6 +1405,8 @@ featureset.hyphenonly = hyphenonly == v_yes local skipping = false + -- In "word word word." the sequences "word" and "." can be a different font! + while current and current ~= last do -- and current local code, id = isglyph(current) if code then @@ -1413,7 +1414,8 @@ featureset.hyphenonly = hyphenonly == v_yes current = getnext(current) else local lang = getlang(current) - if lang ~= language then + local font = getfont(current) + if lang ~= language or font ~= lastfont then if dictionary and size > charmin and leftmin + rightmin <= size then -- only german has many words starting with an uppercase character if categories[word[1]] == "lu" and getfield(start,"uchyph") < 0 then @@ -1425,10 +1427,10 @@ featureset.hyphenonly = hyphenonly == v_yes end end end - language = lang - if language > 0 then + lastfont = font + if language ~= lang and lang > 0 then -- - dictionary = dictionaries[language] + dictionary = dictionaries[lang] instance = dictionary.instance characters = dictionary.characters unicodes = dictionary.unicodes @@ -1459,6 +1461,7 @@ featureset.hyphenonly = hyphenonly == v_yes else size = 0 end + language = lang elseif language <= 0 then -- elseif size > 0 then @@ -1541,28 +1544,7 @@ featureset.hyphenonly = hyphenonly == v_yes skipping = false end if id == disc_code then - if expanded then - -- pre 1.005 - local subtype = getsubtype(current) - if subtype == discretionary_code then -- \discretionary - size = 0 - elseif subtype == explicit_code then -- \- => only here - -- automatic (-) : the old parser makes negative char entries - size = 0 - expand_explicit(current) - elseif subtype == automatic_code then -- - => only here - -- automatic (-) : the old hyphenator turns an exhyphen into glyph+disc - size = 0 - expand_automatic(current) - else - -- first : done by the hyphenator - -- second : done by the hyphenator - -- regular : done by the hyphenator - size = 0 - end - else - size = 0 - end + size = 0 current = getnext(current) if hyphenonly then skipping = true @@ -1632,7 +1614,6 @@ featureset.hyphenonly = hyphenonly == v_yes -- local replaceaction = nodes.tasks.replaceaction -- no longer overload this way (too many local switches) local hyphenate = lang.hyphenate - local expanders = languages.expanders local methods = { } local usedmethod = false local stack = { } @@ -1642,29 +1623,6 @@ featureset.hyphenonly = hyphenonly == v_yes return head, done end - local expanded = function (head) - local done = hyphenate(head) - return head, done - end - - if LUATEXVERSION< 1.005 then - - expanded = function(head) - local done = hyphenate(head) - if done then - for d in traverse_id(disc_code,tonut(head)) do - local s = getsubtype(d) - if s ~= discretionary_code then - expanders[s](d,template) - done = true - end - end - end - return head, done - end - - end - local getcount = tex.getcount hyphenators.methods = methods @@ -1691,7 +1649,7 @@ featureset.hyphenonly = hyphenonly == v_yes methods.tex = original methods.original = original - methods.expanded = expanded -- obsolete starting with 1.005 + methods.expanded = original -- was expanded before 1.005 methods.traditional = languages.hyphenators.traditional.hyphenate methods.none = false -- function(head) return head, false end diff --git a/tex/context/base/mkiv/lang-hyp.mkiv b/tex/context/base/mkiv/lang-hyp.mkiv index c111bc31a..feec82659 100644 --- a/tex/context/base/mkiv/lang-hyp.mkiv +++ b/tex/context/base/mkiv/lang-hyp.mkiv @@ -30,8 +30,8 @@ \writestatus{loading}{ConTeXt Language Macros / Initialization} -\registerctxluafile{lang-dis}{1.001} -\registerctxluafile{lang-hyp}{1.001} +\registerctxluafile{lang-dis}{} +\registerctxluafile{lang-hyp}{} \unprotect diff --git a/tex/context/base/mkiv/lang-ini.lua b/tex/context/base/mkiv/lang-ini.lua index 6de951998..6d202ff5a 100644 --- a/tex/context/base/mkiv/lang-ini.lua +++ b/tex/context/base/mkiv/lang-ini.lua @@ -18,7 +18,7 @@ if not modules then modules = { } end modules ['lang-ini'] = { -- todo: no foo:bar but foo(bar,...) -local type, tonumber = type, tonumber +local type, tonumber, next = type, tonumber, next local utfbyte = utf.byte local format, gsub, gmatch, find = string.format, string.gsub, string.gmatch, string.find local concat, sortedkeys, sortedpairs, keys, insert = table.concat, table.sortedkeys, table.sortedpairs, table.keys, table.insert @@ -270,6 +270,8 @@ local function unique(tag,requested,loaded) end end +local shared = false + local function loaddefinitions(tag,specification) statistics.starttiming(languages) local data, instance = resolve(tag) @@ -295,6 +297,19 @@ local function loaddefinitions(tag,specification) local ok = false local resources = data.resources or { } data.resources = resources + if not shared then + local found = resolvers.findfile("lang-exc.lua") + if found then + shared = dofile(found) + if type(shared) == "table" then + shared = concat(shared," ") + else + shared = true + end + else + shared = true + end + end for i=1,#definitions do local definition = definitions[i] if definition == "" then @@ -344,13 +359,18 @@ local function loaddefinitions(tag,specification) end end if #ploaded > 0 then + -- why not always clear instance:clear_patterns() instance:patterns(unique(tag,requested,ploaded)) end if #eloaded > 0 then + -- why not always clear instance:clear_hyphenation() instance:hyphenation(concat(eloaded," ")) end + if type(shared) == "string" then + instance:hyphenation(shared) + end return ok elseif trace_patterns then report_initialization("no definitions for language %a",tag) diff --git a/tex/context/base/mkiv/lang-ini.mkiv b/tex/context/base/mkiv/lang-ini.mkiv index 947422710..7c83ae38f 100644 --- a/tex/context/base/mkiv/lang-ini.mkiv +++ b/tex/context/base/mkiv/lang-ini.mkiv @@ -22,9 +22,9 @@ \writestatus{loading}{ConTeXt Language Macros / Initialization} -\registerctxluafile{lang-ini}{1.001} -\registerctxluafile{lang-def}{1.001} -\registerctxluafile{lang-cnt}{1.001} +\registerctxluafile{lang-ini}{} +\registerctxluafile{lang-def}{} +\registerctxluafile{lang-cnt}{} \unprotect @@ -220,8 +220,8 @@ %D named: %D %D \starttyping -%D \f!languageprefix-identifier.\f!patternsextension -%D \f!languageprefix-identifier.\f!hyhensextension +%D lang-identifier.\f!patternsextension +%D lang-identifier.\f!hyhensextension %D \stoptyping %D %D The \type{spacing} variable specifies how the spaces after @@ -539,6 +539,12 @@ \fi \to \everylanguage +% new + +\appendtoks + \usebidiparameter\languageparameter +\to \everylanguage + % this will move to core-spa ! \appendtoks @@ -559,12 +565,14 @@ % \setuplanguage[\s!default][\s!font=\v!auto] % \setuplanguage[nl][\s!font=\v!auto] -\ifdefined\feature \else \let\feature\gobbleoneargument \fi - \appendtoks \edef\p_language_font{\languageparameter\s!font}% - \ifx\p_language_font\v!auto + \ifx\p_language_font\empty\else + \ifx\p_language_font\v!auto \doaddfeature\currentlanguage + \else + \doaddfeature\p_language_font + \fi \fi \to \everylanguage diff --git a/tex/context/base/mkiv/lang-lab.mkiv b/tex/context/base/mkiv/lang-lab.mkiv index 40845be4a..73637753d 100644 --- a/tex/context/base/mkiv/lang-lab.mkiv +++ b/tex/context/base/mkiv/lang-lab.mkiv @@ -13,8 +13,8 @@ \writestatus{loading}{ConTeXt Language Macros / Labels} -\registerctxluafile{lang-lab}{1.001} -\registerctxluafile{lang-txt}{1.001} +\registerctxluafile{lang-lab}{} +\registerctxluafile{lang-txt}{} \unprotect @@ -83,6 +83,8 @@ % hm, not interfaced +\let\thetextprefix\empty + \unexpanded\def\lang_labels_define_class_indeed#1#2#3#4#5#6#7#8#9% {\setuvalue{setup#1text}{\protecttextprefixes#2\def\currenttextprefixclass{#1}\dodoubleempty\lang_labels_text_prefix_setup}% \setuvalue{preset#1text}{\protecttextprefixes1\def\currenttextprefixclass{#1}\dodoubleempty\lang_labels_text_prefix_setup}% diff --git a/tex/context/base/mkiv/lang-mis.mkiv b/tex/context/base/mkiv/lang-mis.mkiv index ada8f81ea..eb7dc7d80 100644 --- a/tex/context/base/mkiv/lang-mis.mkiv +++ b/tex/context/base/mkiv/lang-mis.mkiv @@ -139,16 +139,13 @@ %D \stop %D \macros -%D {compoundhyphen, -%D beginofsubsentence,endofsubsentence} +%D {compoundhyphen} %D %D Now let's go to the macros. First we define some variables. In the main \CONTEXT\ %D modules these can be tuned by a setup command. Watch the (maybe) better looking %D compound hyphen. \ifx\compoundhyphen \undefined \unexpanded\def\compoundhyphen {\hbox{-\kern-.25ex-}} \fi -\ifx\beginofsubsentence\undefined \unexpanded\def\beginofsubsentence{\hbox{\emdash}} \fi -\ifx\endofsubsentence \undefined \unexpanded\def\endofsubsentence {\hbox{\emdash}} \fi %D The last two variables are needed for subsentences |<|like this one|>| which we %D did not yet mention. We want to enable breaking but at the same time don't want @@ -162,14 +159,17 @@ \unexpanded\def\permithyphenation{\ifhmode\prewordbreak\fi} % doesn't remove spaces %D \macros -%D {beginofsubsentencespacing,endofsubsentencespacing} +%D {beginofsubsentence,endofsubsentence, +%D beginofsubsentencespacing,endofsubsentencespacing} %D %D In the previous macros we provided two hooks which can be used to support nested %D sub||sentences. In \CONTEXT\ these hooks are used to insert a small space when %D needed. -\ifx\beginofsubsentencespacing\undefined \let\beginofsubsentencespacing\relax \fi -\ifx\endofsubsentencespacing \undefined \let\endofsubsentencespacing \relax \fi +% \ifx\beginofsubsentence \undefined \unexpanded\def\beginofsubsentence{\hbox{\emdash}} \fi +% \ifx\endofsubsentence \undefined \unexpanded\def\endofsubsentence {\hbox{\emdash}} \fi +% \ifx\beginofsubsentencespacing\undefined \let\beginofsubsentencespacing\relax \fi +% \ifx\endofsubsentencespacing \undefined \let\endofsubsentencespacing \relax \fi %D The following piece of code is a torture test compound handling. The \type %D {\relax} before the \type {\ifmmode} is needed because of the alignment scanner @@ -266,6 +266,9 @@ \futurelet\nextnext\next}% \next} +\let\discretionarytoken \relax +\let\textmodediscretionary\relax + \unexpanded\def\activedododotextmodediscretionary#1#2% {\edef\discretionarytoken{\detokenize{#2}}% \def\textmodediscretionary{\handletextmodediscretionary{#1}}% @@ -310,7 +313,7 @@ \prewordbreak\discretionary{\hbox{#2}}{}{\hbox{#2}}\allowbreak\postwordbreak \fi\fi \fi\fi - \nextnextnext} % lookahead in commands + \nextnextnext} %D \macros %D {directdiscretionary} @@ -409,14 +412,27 @@ {\prewordbreak\discretionary{\hbox{\normalstartimath|\normalstopimath}}{}{\hbox{\normalstartimath|\normalstopimath}}% \allowbreak\postwordbreak} % bugged +% \definetextmodediscretionary < +% {\beginofsubsentence\prewordbreak\beginofsubsentencespacing} +% +% \definetextmodediscretionary > +% {\endofsubsentencespacing\prewordbreak\endofsubsentence} +% +% \definetextmodediscretionary = +% {\prewordbreak\midsentence\prewordbreak} + \definetextmodediscretionary < - {\beginofsubsentence\prewordbreak\beginofsubsentencespacing} + {\beginofsubsentence\prewordbreak\beginofsubsentencespacing + \aftergroup\ignorespaces} % tricky, we need to go over the \nextnextnext \definetextmodediscretionary > - {\endofsubsentencespacing\prewordbreak\endofsubsentence} + {\removeunwantedspaces + \endofsubsentencespacing\prewordbreak\endofsubsentence} \definetextmodediscretionary = - {\prewordbreak\midsentence\prewordbreak} % {\prewordbreak\compoundhyphen} + {\removeunwantedspaces + \prewordbreak\midsentence\prewordbreak + \aftergroup\ignorespaces} % french diff --git a/tex/context/base/mkiv/lang-rep.lua b/tex/context/base/mkiv/lang-rep.lua index 6fde353f7..172454fc2 100644 --- a/tex/context/base/mkiv/lang-rep.lua +++ b/tex/context/base/mkiv/lang-rep.lua @@ -15,7 +15,8 @@ if not modules then modules = { } end modules ['lang-rep'] = { -- although (given experiences so far) we don't really need that. After all, each problem -- is somewhat unique. -local type, tonumber = type, tonumber +local type, tonumber, next = type, tonumber, next +local gmatch, gsub = string.gmatch, string.gsub local utfbyte, utfsplit = utf.byte, utf.split local P, C, U, Cc, Ct, Cs, lpegmatch = lpeg.P, lpeg.C, lpeg.patterns.utf8character, lpeg.Cc, lpeg.Ct, lpeg.Cs, lpeg.match local find = string.find @@ -51,8 +52,6 @@ local getid = nuts.getid local getchar = nuts.getchar local isglyph = nuts.isglyph -local setfield = nuts.setfield -local getfield = nuts.getfield local setattr = nuts.setattr local setlink = nuts.setlink local setnext = nuts.setnext @@ -78,6 +77,9 @@ local v_reset = interfaces.variables.reset local implement = interfaces.implement +local processors = typesetters.processors +local splitprocessor = processors.split + local replacements = languages.replacements or { } languages.replacements = replacements @@ -103,7 +105,8 @@ lists[v_reset].attribute = unsetvalue -- so we discard 0 -- todo: glue kern attr local function add(root,word,replacement) - local replacement = lpegmatch(stripper,replacement) or replacement + local processor, replacement = splitprocessor(replacement,true) -- no check + replacement = lpegmatch(stripper,replacement) or replacement local list = utfsplit(word,true) local size = #list for i=1,size do @@ -112,16 +115,12 @@ local function add(root,word,replacement) root[l] = { } end if i == size then - -- local newlist = utfsplit(replacement,true) - -- for i=1,#newlist do - -- newlist[i] = utfbyte(newlist[i]) - -- end local special = find(replacement,"{",1,true) local newlist = lpegmatch(splitter,replacement) - -- root[l].final = { word = word, replacement = replacement, + processor = processor, oldlength = size, newcodes = newlist, special = special, @@ -142,6 +141,26 @@ function replacements.add(category,word,replacement) end end +-- local strip = lpeg.stripper("{}") + +function languages.replacements.addlist(category,list) + local root = lists[category].list + if type(list) == "string" then + for new in gmatch(list,"%S+") do + local old = gsub(new,"[{}]","") + -- local old = lpegmatch(strip,new) + add(root,old,new) + end + else + for i=1,#list do + local new = list[i] + local old = gsub(new,"[{}]","") + -- local old = lpegmatch(strip,new) + add(root,old,new) + end + end +end + local function hit(a,head) local tree = trees[a] if tree then @@ -151,7 +170,10 @@ local function hit(a,head) local lastrun = false local lastfinal = false while current do - local char = isglyph(current) + local char, id = isglyph(current) + -- if not char and id == glue_code then + -- char = " " -- if needed we can also deal with spaces and special nbsp and such + -- end if char then local newroot = root[char] if not newroot then @@ -194,20 +216,21 @@ local function tonodes(list,template) return head end - function replacements.handler(head) head = tonut(head) - local current = head - local done = false + local current = head + local done = false + local overload = attributes.applyoverloads while current do if getid(current) == glyph_code then local a = getattr(current,a_replacements) if a then local last, final = hit(a,current) if last then - local oldlength = final.oldlength - local newcodes = final.newcodes - local newlength = #newcodes + local precurrent = getprev(current) or head + local oldlength = final.oldlength + local newcodes = final.newcodes + local newlength = newcodes and #newcodes or 0 if trace_replacement then report_replacement("replacing word %a by %a",final.word,final.replacement) end @@ -269,6 +292,9 @@ function replacements.handler(head) i = i + 1 end flush_list(list) + elseif newlength == 0 then + -- nothing gets replaced + current = getnext(last) elseif oldlength == newlength then -- #old == #new if final.word == final.replacement then -- nothing to do but skip @@ -298,10 +324,14 @@ function replacements.handler(head) current = getnext(current) end end + if overload then + overload(final,getnext(precurrent),getprev(current)) + end done = true end end end + -- we're one ahead now but we need to because we handle words current = getnext(current) end return tonode(head), done @@ -338,3 +368,9 @@ implement { actions = replacements.add, arguments = { "string", "string", "string" } } + +implement { + name = "addreplacementslist", + actions = replacements.addlist, + arguments = { "string", "string" } +} diff --git a/tex/context/base/mkiv/lang-rep.mkiv b/tex/context/base/mkiv/lang-rep.mkiv index 48e1fd44b..7864b029a 100644 --- a/tex/context/base/mkiv/lang-rep.mkiv +++ b/tex/context/base/mkiv/lang-rep.mkiv @@ -19,7 +19,7 @@ \unprotect -\registerctxluafile{lang-rep}{1.001} +\registerctxluafile{lang-rep}{} \definesystemattribute[replacements][public,global] @@ -57,12 +57,14 @@ {\attribute\replacementsattribute\attributeunsetvalue} \unexpanded\def\replaceword - {\dotripleargument\languages_replacements_replace} + {\dotripleempty\languages_replacements_replace} \unexpanded\def\languages_replacements_replace[#1][#2][#3]% {\ifthirdargument \clf_addreplacements{#1}{#2}{#3}% - \fi} + \else\ifsecondargument + \clf_addreplacementslist{#1}{#2}% + \fi\fi} \appendtoks \resetreplacements diff --git a/tex/context/base/mkiv/lang-txt.lua b/tex/context/base/mkiv/lang-txt.lua index b550ac2b4..b1f50bc80 100644 --- a/tex/context/base/mkiv/lang-txt.lua +++ b/tex/context/base/mkiv/lang-txt.lua @@ -252,7 +252,7 @@ data.labels={ ["sk"]="P", }, }, - ["acos"]={ + ["arccos"]={ ["labels"]={ ["cz"]="arccos", ["en"]="arccos", @@ -262,14 +262,14 @@ data.labels={ ["sk"]="arccos", }, }, - ["arccos"]={ + ["arccosh"]={ ["labels"]={ - ["cz"]="arccos", - ["en"]="arccos", - ["es"]="arc\\sixperemspace cos", - ["hr"]="arc\\sixperemspace cos", - ["pl"]="arc\\sixperemspace cos", - ["sk"]="arccos", + ["cz"]="arccosh", + ["en"]="arccosh", + ["es"]="arc\\sixperemspace cosh", + ["hr"]="arc\\sixperemspace cosh", + ["pl"]="arc\\sixperemspace cosh", + ["sk"]="arccosh", }, }, ["arcctg"]={ @@ -292,6 +292,16 @@ data.labels={ ["sk"]="arcsin", }, }, + ["arcsinh"]={ + ["labels"]={ + ["cz"]="arcsinh", + ["en"]="arcsinh", + ["es"]="arc\\sixperemspace senh", + ["hr"]="arc\\sixperemspace sinh", + ["pl"]="arc\\sixperemspace sinh", + ["sk"]="arcsinh", + }, + }, ["arctan"]={ ["labels"]={ ["cz"]="arctg", @@ -302,13 +312,13 @@ data.labels={ ["sk"]="arctg", }, }, - ["arctg"]={ + ["arctanh"]={ ["labels"]={ - ["cz"]="arctg", - ["en"]="arctan", - ["es"]="arc\\sixperemspace tan", - ["hr"]="arc\\sixperemspace tg", - ["pl"]="arc\\sixperemspace tg", + ["cz"]="arctgh", + ["en"]="arctanh", + ["es"]="arc\\sixperemspace tanh", + ["hr"]="arc\\sixperemspace tgh", + ["pl"]="arc\\sixperemspace tgh", ["sk"]="arctg", }, }, @@ -320,26 +330,6 @@ data.labels={ ["sk"]="arg", }, }, - ["asin"]={ - ["labels"]={ - ["cz"]="arcsin", - ["en"]="arcsin", - ["es"]="arc\\sixperemspace sen", - ["hr"]="arc\\sixperemspace sin", - ["pl"]="arc\\sixperemspace sin", - ["sk"]="arcsin", - }, - }, - ["atan"]={ - ["labels"]={ - ["cz"]="arctg", - ["en"]="arctan", - ["es"]="arc\\sixperemspace tan", - ["hr"]="arc\\sixperemspace tg", - ["pl"]="arc\\sixperemspace tg", - ["sk"]="arctg", - }, - }, ["cos"]={ ["labels"]={ ["cz"]="cos", @@ -619,16 +609,6 @@ data.labels={ ["sk"]="tgh", }, }, - ["tg"]={ - ["labels"]={ - ["cz"]="tg", - ["en"]="tan", - ["es"]="tan", - ["hr"]="tg", - ["pl"]="tg", - ["sk"]="tg", - }, - }, }, ["texts"]={ ["and"]={ @@ -3009,8 +2989,13 @@ data.labels={ local functions = data.labels.functions -functions.asin = functions.arcsin -functions.acos = functions.arccos -functions.atan = functions.arctan +functions.asin = functions.arcsin +functions.acos = functions.arccos +functions.atan = functions.arctan +functions.asinh = functions.arcsinh +functions.acosh = functions.arccosh +functions.atanh = functions.arctanh -table.save("e:/tmp/x.lua",data.labels) +functions.tg = functions.tan +functions.arctg = functions.arctan +functions.arctgh = functions.arctanh diff --git a/tex/context/base/mkiv/lang-url.lua b/tex/context/base/mkiv/lang-url.lua index 93c3c02a8..651c6bd52 100644 --- a/tex/context/base/mkiv/lang-url.lua +++ b/tex/context/base/mkiv/lang-url.lua @@ -8,6 +8,7 @@ if not modules then modules = { } end modules ['lang-url'] = { local utfcharacters, utfvalues, utfbyte, utfchar = utf.characters, utf.values, utf.byte, utf.char local min, max = math.min, math.max +local concat = table.concat local context = context @@ -80,13 +81,67 @@ directives.register("hyphenators.urls.packslashes",function(v) urls.packslashes = v end) -local ctx_a = context.a -local ctx_b = context.b -local ctx_d = context.d -local ctx_c = context.c -local ctx_l = context.l -local ctx_C = context.C -local ctx_L = context.L +-- local ctx_a = context.a +-- local ctx_b = context.b +-- local ctx_d = context.d +-- local ctx_c = context.c +-- local ctx_l = context.l +-- local ctx_C = context.C +-- local ctx_L = context.L + +-- local function action(hyphenatedurl,str,left,right,disc) +-- -- +-- left = max( left or urls.lefthyphenmin, 2) +-- right = min(#str-(right or urls.righthyphenmin)+2,#str) +-- disc = disc or urls.discretionary +-- -- +-- local word = nil +-- local prev = nil +-- local pack = urls.packslashes +-- local length = 0 +-- -- +-- for char in utfcharacters(str) do +-- length = length + 1 +-- char = mapping[char] or char +-- local b = utfbyte(char) +-- if prev == char and prev == "/" then +-- ctx_c(b) +-- elseif char == disc then +-- ctx_d() +-- else +-- if prev == "/" then +-- ctx_d() +-- end +-- local how = characters[char] +-- if how == v_before then +-- word = false +-- ctx_b(b) +-- elseif how == v_after then +-- word = false +-- ctx_a(b) +-- else +-- local letter = is_letter[char] +-- if length <= left or length >= right then +-- if word and letter then +-- ctx_L(b) +-- else +-- ctx_C(b) +-- end +-- elseif word and letter then +-- ctx_l(b) +-- else +-- ctx_c(b) +-- end +-- word = letter +-- end +-- end +-- if pack then +-- prev = char +-- else +-- prev = nil +-- end +-- end +-- end local function action(hyphenatedurl,str,left,right,disc) -- @@ -95,48 +150,51 @@ local function action(hyphenatedurl,str,left,right,disc) disc = disc or urls.discretionary -- local word = nil - local prev = nil local pack = urls.packslashes local length = 0 - -- - for char in utfcharacters(str) do - length = length + 1 - char = mapping[char] or char - if prev == char and prev == "/" then - ctx_c(utfbyte(char)) - elseif char == disc then - ctx_d() + local list = utf.split(str) + + for i=1,#list do + local what = nil + local dodi = false + local char = list[i] + length = length + 1 + char = mapping[char] or char + if char == disc then + dodi = true + elseif pack and char == "/" and list[i+1] == "/" then + what = "c" else - if prev == "/" then - ctx_d() - end local how = characters[char] if how == v_before then - word = false - ctx_b(utfbyte(char)) + what = "b" elseif how == v_after then word = false - ctx_a(utfbyte(char)) + what = "a" else local letter = is_letter[char] if length <= left or length >= right then if word and letter then - ctx_L(utfbyte(char)) + what = "L" else - ctx_C(utfbyte(char)) + what = "C" end elseif word and letter then - ctx_l(utfbyte(char)) + what = "l" else - ctx_c(utfbyte(char)) + what = "c" end word = letter end end - if pack then - prev = char + if dodi then + list[i] = "\\d" + else + list[i] = "\\" .. what .. "{" .. utfbyte(char) .. "}" end end + list = concat(list) + context(list) end -- urls.action = function(_,...) action(...) end -- sort of obsolete diff --git a/tex/context/base/mkiv/lang-url.mkiv b/tex/context/base/mkiv/lang-url.mkiv index 833a583f9..6afef63ce 100644 --- a/tex/context/base/mkiv/lang-url.mkiv +++ b/tex/context/base/mkiv/lang-url.mkiv @@ -11,7 +11,7 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\registerctxluafile{lang-url}{1.001} +\registerctxluafile{lang-url}{} \unprotect diff --git a/tex/context/base/mkiv/lang-wrd.lua b/tex/context/base/mkiv/lang-wrd.lua index 8b6e48401..b00375cc0 100644 --- a/tex/context/base/mkiv/lang-wrd.lua +++ b/tex/context/base/mkiv/lang-wrd.lua @@ -6,6 +6,7 @@ if not modules then modules = { } end modules ['lang-wrd'] = { license = "see context related readme files" } +local next, tonumber = next, tonumber local lower = string.lower local utfchar = utf.char local concat, setmetatableindex = table.concat, table.setmetatableindex @@ -32,17 +33,18 @@ local registered = languages.registered local nuts = nodes.nuts local tonut = nuts.tonut -local getfield = nuts.getfield +----- getfield = nuts.getfield local getnext = nuts.getnext local getid = nuts.getid -local getsubtype = nuts.getsubtype +----- getsubtype = nuts.getsubtype local getchar = nuts.getchar local setattr = nuts.setattr +----- getattr = nuts.getattr local getlang = nuts.getlang -local isglyph = nuts.isglyph +local ischar = nuts.ischar local traverse_nodes = nuts.traverse -local traverse_ids = nuts.traverse_id +----- traverse_ids = nuts.traverse_id local wordsdata = words.data local chardata = characters.data @@ -51,13 +53,14 @@ local enableaction = nodes.tasks.enableaction local unsetvalue = attributes.unsetvalue local nodecodes = nodes.nodecodes -local kerncodes = nodes.kerncodes +----- kerncodes = nodes.kerncodes local glyph_code = nodecodes.glyph -local disc_code = nodecodes.disc -local kern_code = nodecodes.kern +----- disc_code = nodecodes.disc +----- kern_code = nodecodes.kern + +----- fontkern_code = kerncodes.fontkern -local kerning_code = kerncodes.kerning local lowerchar = characters.lower local a_color = attributes.private('color') @@ -160,8 +163,8 @@ local function mark_words(head,whenfound) -- can be optimized and shared -- we haven't done the fonts yet so we have characters (otherwise -- we'd have to use the tounicodes) while current do - local code, id = isglyph(current) - if code then + local code, id = ischar(current) -- not isglyph because otherwise we can run into + if code then -- processed streams (\about[foo] does that) local a = getlang(current) if a then if a ~= language then @@ -183,21 +186,29 @@ local function mark_words(head,whenfound) -- can be optimized and shared elseif s > 0 then action() end - elseif id == disc_code then -- take the replace - if n > 0 then - local r = getfield(current,"replace") - if r then - for current in traverse_ids(glyph_code,r) do - local code = getchar(current) - n = n + 1 - nds[n] = current - s = s + 1 - str[s] = utfchar(code) - end - end - end - elseif id == kern_code and getsubtype(current) == kerning_code and s > 0 then - -- ok + -- elseif id == disc_code then + -- -- take the replace .. we kick in before we hyphenate so we're + -- -- not yet seeing many discs and we only handle explicit ones + -- -- in fact we could as well decide to ignore words with a disc + -- -- because we then have a compound word + -- if n > 0 then + -- local r = getfield(current,"replace") + -- if r then + -- -- also disc itself + -- n = n + 1 + -- nds[n] = current + -- -- + -- for current in traverse_ids(glyph_code,r) do + -- local code = getchar(current) + -- n = n + 1 + -- nds[n] = current + -- s = s + 1 + -- str[s] = utfchar(code) + -- end + -- end + -- end + -- elseif id == kern_code and getsubtype(current) == fontkern_code and s > 0 then + -- -- ok elseif s > 0 then action() end diff --git a/tex/context/base/mkiv/lang-wrd.mkiv b/tex/context/base/mkiv/lang-wrd.mkiv index 8c544773b..75eec48b1 100644 --- a/tex/context/base/mkiv/lang-wrd.mkiv +++ b/tex/context/base/mkiv/lang-wrd.mkiv @@ -15,7 +15,7 @@ \writestatus{loading}{ConTeXt Language Macros / Checking} -\registerctxluafile{lang-wrd}{1.001} +\registerctxluafile{lang-wrd}{} \unprotect diff --git a/tex/context/base/mkiv/layo-ini.mkiv b/tex/context/base/mkiv/layo-ini.mkiv index 9097265c9..fc0286fdd 100644 --- a/tex/context/base/mkiv/layo-ini.mkiv +++ b/tex/context/base/mkiv/layo-ini.mkiv @@ -26,6 +26,6 @@ \ifdefined\pagenoshift \else \newcount \pagenoshift \fi \ifdefined\realpageno \else \newcount \realpageno \fi -\registerctxluafile{layo-ini}{1.001} +\registerctxluafile{layo-ini}{} \protect \endinput diff --git a/tex/context/base/mkiv/lpdf-ano.lua b/tex/context/base/mkiv/lpdf-ano.lua index e89bda12b..01f015b72 100644 --- a/tex/context/base/mkiv/lpdf-ano.lua +++ b/tex/context/base/mkiv/lpdf-ano.lua @@ -13,7 +13,7 @@ if not modules then modules = { } end modules ['lpdf-ano'] = { -- internal references are indicated by a number (and turned into <autoprefix><number>) -- we only flush internal destinations that are referred -local next, tostring, tonumber, rawget = next, tostring, tonumber, rawget +local next, tostring, tonumber, rawget, type = next, tostring, tonumber, rawget, type local rep, format, find = string.rep, string.format, string.find local min = math.min local lpegmatch = lpeg.match @@ -28,9 +28,9 @@ local trace_bookmarks = false trackers.register("references.bookmarks", local log_destinations = false directives.register("destinations.log", function(v) log_destinations = v end) local untex_urls = true directives.register("references.untexurls", function(v) untex_urls = v end) -local report_reference = logs.reporter("backend","references") -local report_destination = logs.reporter("backend","destinations") -local report_bookmark = logs.reporter("backend","bookmarks") +local report_references = logs.reporter("backend","references") +local report_destinations = logs.reporter("backend","destinations") +local report_bookmarks = logs.reporter("backend","bookmarks") local variables = interfaces.variables local v_auto = variables.auto @@ -160,7 +160,7 @@ local pagedestinations = setmetatableindex(function(t,k) end local v = rawget(t,k) if v then - -- report_reference("page number expected, got %s: %a",type(k),k) + -- report_references("page number expected, got %s: %a",type(k),k) return v end local v = k > 0 and pdfarray { @@ -197,7 +197,7 @@ local destinations = { } -- to be used soon local function pdfregisterdestination(name,reference) local d = destinations[name] if d then - report_destination("ignoring duplicate destination %a with reference %a",name,reference) + report_destinations("ignoring duplicate destination %a with reference %a",name,reference) else destinations[name] = reference end @@ -207,25 +207,16 @@ lpdf.registerdestination = pdfregisterdestination local maxslice = 32 -- could be made configureable ... 64 is also ok -luatex.registerstopactions(function() +logs.registerfinalactions(function() if log_destinations and next(destinations) then - local logsnewline = logs.newline - local log_destinations = logs.reporter("system","references") - local log_destination = logs.reporter("destination") - logs.pushtarget("logfile") - logsnewline() - log_destinations("start used destinations") - logsnewline() + local report = logs.startfilelogging("references","used destinations") local n = 0 for destination, pagenumber in table.sortedhash(destinations) do - log_destination("% 4i : %-5s : %s",pagenumber,usedviews[destination] or defaultview,destination) + report("% 4i : %-5s : %s",pagenumber,usedviews[destination] or defaultview,destination) n = n + 1 end - logsnewline() - log_destinations("stop used destinations") - logsnewline() - logs.poptarget() - report_destination("%s destinations saved in log file",n) + logs.stopfilelogging() + report_destinations("%s destinations saved in log file",n) end end) @@ -433,7 +424,7 @@ function nodeinjections.destination(width,height,depth,names,view) -- todo check if begin end node / was comment view = view and mapping[view] or defaultview if trace_destinations then - report_destination("width %p, height %p, depth %p, names %|t, view %a",width,height,depth,names,view) + report_destinations("width %p, height %p, depth %p, names %|t, view %a",width,height,depth,names,view) end local method = references.innermethod local noview = view == defaultview @@ -567,13 +558,13 @@ local function pdffilelink(filename,destination,page,actions) return false end filename = file.addsuffix(filename,"pdf") - if not destination or destination == "" then + if (not destination or destination == "") or (references.outermethod == v_page) then destination = pdfarray { (page or 0) - 1, pdf_fit } end return pdfdictionary { S = pdf_gotor, -- can also be pdf_launch F = filename, - D = destination or defaultdestination, -- D is mandate + D = destination or defaultdestination, NewWindow = actions.newwindow and true or nil, } end @@ -674,7 +665,7 @@ end -- local function reference(width,height,depth,prerolled) -- keep this one -- if prerolled then -- if trace_references then --- report_reference("width %p, height %p, depth %p, prerolled %a",width,height,depth,prerolled) +-- report_references("width %p, height %p, depth %p, prerolled %a",width,height,depth,prerolled) -- end -- return pdfannotation_node(width,height,depth,prerolled) -- end @@ -715,6 +706,9 @@ local function finishreference(width,height,depth,prerolled) -- %0.2f looks okay end local function finishannotation(width,height,depth,prerolled,r) + if type(prerolled) == "function" then + prerolled = prerolled() + end local annot = f_annot(prerolled,pdfrectangle(width,height,depth)) if r then pdfdelayedobject(annot,r) @@ -728,7 +722,7 @@ end function nodeinjections.reference(width,height,depth,prerolled) if prerolled then if trace_references then - report_reference("link: width %p, height %p, depth %p, prerolled %a",width,height,depth,prerolled) + report_references("link: width %p, height %p, depth %p, prerolled %a",width,height,depth,prerolled) end return new_latelua(function() finishreference(width,height,depth,prerolled) end) end @@ -737,7 +731,8 @@ end function nodeinjections.annotation(width,height,depth,prerolled,r) if prerolled then if trace_references then - report_reference("special: width %p, height %p, depth %p, prerolled %a",width,height,depth,prerolled) + report_references("special: width %p, height %p, depth %p, prerolled %a",width,height,depth, + type(prerolled) == "string" and prerolled or "-") end return new_latelua(function() finishannotation(width,height,depth,prerolled,r or false) end) end @@ -822,7 +817,7 @@ runners["inner"] = function(var,actions) end runners["inner with arguments"] = function(var,actions) - report_reference("todo: inner with arguments") + report_references("todo: inner with arguments") return false end @@ -845,7 +840,7 @@ runners["special outer with operation"] = function(var,actions) end runners["special outer"] = function(var,actions) - report_reference("todo: special outer") + report_references("todo: special outer") return false end @@ -855,22 +850,22 @@ runners["special"] = function(var,actions) end runners["outer with inner with arguments"] = function(var,actions) - report_reference("todo: outer with inner with arguments") + report_references("todo: outer with inner with arguments") return false end runners["outer with special and operation and arguments"] = function(var,actions) - report_reference("todo: outer with special and operation and arguments") + report_references("todo: outer with special and operation and arguments") return false end runners["outer with special"] = function(var,actions) - report_reference("todo: outer with special") + report_references("todo: outer with special") return false end runners["outer with special and operation"] = function(var,actions) - report_reference("todo: outer with special and operation") + report_references("todo: outer with special and operation") return false end @@ -882,7 +877,7 @@ function specials.internal(var,actions) -- better resolve in strc-ref local v = i and references.internals[i] if not v then -- error - report_reference("no internal reference %a",i or "<unset>") + report_references("no internal reference %a",i or "<unset>") else flaginternals[i] = true return pdflinkinternal(i,v.references.realpage) @@ -1182,17 +1177,17 @@ local function build(levels,start,parent,method,nested) if entry then pdfflushobject(child,entry) else - report_bookmark("error 1") + report_bookmarks("error 1") end return i, n, first, last else - report_bookmark("confusing level change at level %a around %a",level,title) + report_bookmarks("confusing level change at level %a around %a",level,title) startlevel = level end end if level == startlevel then if trace_bookmarks then - report_bookmark("%3i %w%s %s",realpage,(level-1)*2,(opened and "+") or "-",title) + report_bookmarks("%3i %w%s %s",realpage,(level-1)*2,(opened and "+") or "-",title) end local prev = child child = pdfreserveobject() @@ -1231,7 +1226,7 @@ local function build(levels,start,parent,method,nested) entry.Last = pdfreference(l) end else - report_bookmark("error 2") + report_bookmarks("error 2") end else -- missing intermediate level but ok @@ -1244,7 +1239,7 @@ local function build(levels,start,parent,method,nested) end pdfflushobject(child,entry) else - report_bookmark("error 3") + report_bookmarks("error 3") end return i, n, first, last end diff --git a/tex/context/base/mkiv/lpdf-col.lua b/tex/context/base/mkiv/lpdf-col.lua index b5973ba88..d1a1af97d 100644 --- a/tex/context/base/mkiv/lpdf-col.lua +++ b/tex/context/base/mkiv/lpdf-col.lua @@ -16,15 +16,14 @@ local formatters = string.formatters local backends, lpdf, nodes = backends, lpdf, nodes local allocate = utilities.storage.allocate -local formatters = string.formatters local nodeinjections = backends.pdf.nodeinjections local codeinjections = backends.pdf.codeinjections local registrations = backends.pdf.registrations -local nodepool = nodes.pool +local nodepool = nodes.nuts.pool local register = nodepool.register -local pdfliteral = nodepool.pdfliteral +local pdfpageliteral = nodepool.pdfpageliteral local pdfconstant = lpdf.constant local pdfdictionary = lpdf.dictionary @@ -42,13 +41,20 @@ local adddocumentcolorspace = lpdf.adddocumentcolorspace local adddocumentextgstate = lpdf.adddocumentextgstate local colors = attributes.colors -local transparencies = attributes.transparencies -local registertransparancy = transparencies.register local registercolor = colors.register local colorsvalue = colors.value -local transparenciesvalue = transparencies.value local forcedmodel = colors.forcedmodel local getpagecolormodel = colors.getpagecolormodel +local colortoattributes = colors.toattributes + +local transparencies = attributes.transparencies +local registertransparancy = transparencies.register +local transparenciesvalue = transparencies.value +local transparencytoattribute = transparencies.toattribute + +local unsetvalue = attributes.unsetvalue + +local setmetatableindex = table.setmetatableindex local c_transparency = pdfconstant("Transparency") @@ -57,7 +63,7 @@ local f_rgb = formatters["%.3F %.3F %.3F rg %.3F %.3F %.3F RG"] local f_cmyk = formatters["%.3F %.3F %.3F %.3F k %.3F %.3F %.3F %.3F K"] local f_spot = formatters["/%s cs /%s CS %s SCN %s scn"] local f_tr = formatters["Tr%s"] -local f_cm = formatters["q %F %F %F %F %F %F cm"] +local f_cm = formatters["q %.6F %.6F %.6F %.6F %.6F %.6F cm"] local f_effect = formatters["%s Tc %s w %s Tr"] local f_tr_gs = formatters["/Tr%s gs"] local f_num_1 = tostring @@ -81,7 +87,7 @@ local transparencygroups = { } lpdf.colorspaceconstants = colorspaceconstants lpdf.transparencygroups = transparencygroups -table.setmetatableindex(transparencygroups, function(transparencygroups,colormodel) +setmetatableindex(transparencygroups, function(transparencygroups,colormodel) local cs = colorspaceconstants[colormodel] if cs then local d = pdfdictionary { @@ -116,26 +122,26 @@ lpdf.registerpagefinalizer(addpagegroup,3,"pagegroup") -- color injection function nodeinjections.rgbcolor(r,g,b) - return register(pdfliteral(f_rgb(r,g,b,r,g,b))) + return register(pdfpageliteral(f_rgb(r,g,b,r,g,b))) end function nodeinjections.cmykcolor(c,m,y,k) - return register(pdfliteral(f_cmyk(c,m,y,k,c,m,y,k))) + return register(pdfpageliteral(f_cmyk(c,m,y,k,c,m,y,k))) end function nodeinjections.graycolor(s) -- caching 0/1 does not pay off - return register(pdfliteral(f_gray(s,s))) + return register(pdfpageliteral(f_gray(s,s))) end function nodeinjections.spotcolor(n,f,d,p) if type(p) == "string" then p = gsub(p,","," ") -- brr misuse of spot end - return register(pdfliteral(f_spot(n,n,p,p))) + return register(pdfpageliteral(f_spot(n,n,p,p))) end function nodeinjections.transparency(n) - return register(pdfliteral(f_tr_gs(n))) + return register(pdfpageliteral(f_tr_gs(n))) end -- a bit weird but let's keep it here for a while @@ -154,7 +160,7 @@ function nodeinjections.effect(effect,stretch,rulethickness) -- always, no zero test (removed) rulethickness = bp * rulethickness effect = effects[effect] or effects['normal'] - return register(pdfliteral(f_effect(stretch,rulethickness,effect))) -- watch order + return register(pdfpageliteral(f_effect(stretch,rulethickness,effect))) -- watch order end -- spot- and indexcolors @@ -701,31 +707,113 @@ function lpdf.finishtransparencycode() end end --- this will move to lpdf-spe.lua +-- this will move to lpdf-spe.lua an dwe then can also add a metatable with +-- normal context colors + +do + + local pdfcolor = lpdf.color + local pdftransparency = lpdf.transparency + + local f_slant = formatters["q 1 0 %.6F 1 0 0 cm"] + + -- local fillcolors = { + -- red = { "pdf", "origin", "1 0 0 rg" }, + -- green = { "pdf", "origin", "0 1 0 rg" }, + -- blue = { "pdf", "origin", "0 0 1 rg" }, + -- gray = { "pdf", "origin", ".5 g" }, + -- black = { "pdf", "origin", "0 g" }, + -- palered = { "pdf", "origin", "1 .75 .75 rg" }, + -- palegreen = { "pdf", "origin", ".75 1 .75 rg" }, + -- paleblue = { "pdf", "origin", ".75 .75 1 rg" }, + -- palegray = { "pdf", "origin", ".75 g" }, + -- } + -- + -- local strokecolors = { + -- red = { "pdf", "origin", "1 0 0 RG" }, + -- green = { "pdf", "origin", "0 1 0 RG" }, + -- blue = { "pdf", "origin", "0 0 1 RG" }, + -- gray = { "pdf", "origin", ".5 G" }, + -- black = { "pdf", "origin", "0 G" }, + -- palered = { "pdf", "origin", "1 .75 .75 RG" }, + -- palegreen = { "pdf", "origin", ".75 1 .75 RG" }, + -- paleblue = { "pdf", "origin", ".75 .75 1 RG" }, + -- palegray = { "pdf", "origin", ".75 G" }, + -- } + -- + -- backends.pdf.tables.vfspecials = allocate { -- todo: distinguish between glyph and rule color + -- + -- red = { "pdf", "origin", "1 0 0 rg 1 0 0 RG" }, + -- green = { "pdf", "origin", "0 1 0 rg 0 1 0 RG" }, + -- blue = { "pdf", "origin", "0 0 1 rg 0 0 1 RG" }, + -- gray = { "pdf", "origin", ".75 g .75 G" }, + -- black = { "pdf", "origin", "0 g 0 G" }, + -- + -- -- rulecolors = fillcolors, + -- -- fillcolors = fillcolors, + -- -- strokecolors = strokecolors, + -- + -- startslant = function(a) return { "pdf", "origin", f_slant(a) } end, + -- stopslant = { "pdf", "origin", "Q" }, + -- + -- } + + local slants = setmetatableindex(function(t,k) + local v = { "pdf", "origin", f_slant(a) } + t[k] = v + return k + end) + + local function startslant(a) + return slants[a] + end -local f_slant = formatters["pdf: q 1 0 %F 1 0 0 cm"] + local c_cache = setmetatableindex(function(t,m) + local v = setmetatableindex(function(t,c) + local p = { "pdf", "origin", "q " .. pdfcolor(m,c) } + t[c] = p + return p + end) + t[m] = v + return v + end) -backends.pdf.tables.vfspecials = allocate { -- todo: distinguish between glyph and rule color + -- we inherit the outer transparency + + local t_cache = setmetatableindex(function(t,transparency) + local p = pdftransparency(transparency) + local v = setmetatableindex(function(t,colormodel) + local v = setmetatableindex(function(t,color) + local v = { "pdf", "origin", "q " .. pdfcolor(colormodel,color) .. " " .. p } + t[color] = v + return v + end) + t[colormodel] = v + return v + end) + t[transparency] = v + return v + end) - red = { "special", 'pdf: 1 0 0 rg 1 0 0 RG' }, - green = { "special", 'pdf: 0 1 0 rg 0 1 0 RG' }, - blue = { "special", 'pdf: 0 0 1 rg 0 0 1 RG' }, - gray = { "special", 'pdf: .75 g .75 G' }, - black = { "special", 'pdf: 0 g 0 G' }, + local function startcolor(k) + local m, c = colortoattributes(k) + local t = transparencytoattribute(k) + if t then + return t_cache[t][m][c] + else + return c_cache[m][c] + end + end - rulecolors = { - red = { "special", 'pdf: 1 0 0 rg' }, - green = { "special", 'pdf: 0 1 0 rg' }, - blue = { "special", 'pdf: 0 0 1 rg' }, - gray = { "special", 'pdf: .5 g' }, - black = { "special", 'pdf: 0 g' }, - palered = { "special", 'pdf: 1 .75 .75 rg' }, - palegreen = { "special", 'pdf: .75 1 .75 rg' }, - paleblue = { "special", 'pdf: .75 .75 1 rg' }, - palegray = { "special", 'pdf: .75 g' }, - }, + backends.pdf.tables.vfspecials = allocate { -- todo: distinguish between glyph and rule color - startslant = function(a) return { "special", f_slant(a) } end, - stopslant = { "special", "pdf: Q" }, + startcolor = startcolor, + -- stopcolor = { "pdf", "origin", "0 g 0 G Q" }, + stopcolor = { "pdf", "origin", "Q" }, -} + startslant = startslant, + stopslant = { "pdf", "origin", "Q" }, + + } + +end diff --git a/tex/context/base/mkiv/lpdf-epa.lua b/tex/context/base/mkiv/lpdf-epa.lua index c72e2a424..89b2c6e0e 100644 --- a/tex/context/base/mkiv/lpdf-epa.lua +++ b/tex/context/base/mkiv/lpdf-epa.lua @@ -6,13 +6,15 @@ if not modules then modules = { } end modules ['lpdf-epa'] = { license = "see context related readme files" } --- This is a rather experimental feature and the code will probably --- change. +-- This is a rather experimental feature and the code will probably change. local type, tonumber = type, tonumber local format, gsub, lower = string.format, string.gsub, string.lower local formatters = string.formatters local abs = math.abs +local expandname = file.expandname +local allocate = utilities.storage.allocate +local isfile = lfs.isfile ----- lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns @@ -20,6 +22,8 @@ local trace_links = false trackers.register("figures.links", function(v) local trace_outlines = false trackers.register("figures.outliness", function(v) trace_outlines = v end) local report_link = logs.reporter("backend","link") +local report_comment = logs.reporter("backend","comment") +local report_field = logs.reporter("backend","field") local report_outline = logs.reporter("backend","outline") local epdf = epdf @@ -39,12 +43,29 @@ local escapetex = characters.filters.utf.private.escape local bookmarks = structures.bookmarks -local maxdimen = 2^30-1 +local maxdimen = 0x3FFFFFFF -- 2^30-1 local layerspec = { -- predefining saves time "epdflinks" } +local collected = allocate() +local tobesaved = allocate() + +local jobembedded = { + collected = collected, + tobesaved = tobesaved, +} + +job.embedded = jobembedded + +local function initializer() + tobesaved = jobembedded.tobesaved + collected = jobembedded.collected +end + +job.register('job.embedded.collected',tobesaved,initializer) + local f_namespace = formatters["lpdf-epa-%s-"] local function makenamespace(filename) @@ -114,6 +135,16 @@ end -- (see section 3.10 in the 1.7 reference) so we need to test for string as well -- as a table. TH/20140916 +-- When embedded is set then files need to have page references which is seldom the +-- case but you can generate them with context: +-- +-- \setupinteraction[state=start,page={page,page}] +-- +-- see tests/mkiv/interaction/cross[1|2|3].tex for an example + +local embedded = false directives.register("figures.embedded", function(v) embedded = v end) +local reported = { } + local function link_file(x,y,w,h,document,annotation) local a = annotation.A if a then @@ -129,9 +160,20 @@ local function link_file(x,y,w,h,document,annotation) elseif type(destination) == "string" then add_link(x,y,w,h,formatters["%s::%s"](filename,destination),"file (named)") else - destination = destination[1] -- array - if tonumber(destination) then - add_link(x,y,w,h,formatters["%s::page(%s)"](filename,destination),"file (page)") + -- hm, zero offset so maybe: destination + 1 + destination = tonumber(destination[1]) -- array + if destination then + destination = destination + 1 + local loaded = collected[lower(expandname(filename))] + if embedded and loaded then + add_link(x,y,w,h,makenamespace(filename) .. destination,what) + else + if loaded and not reported[filename] then + report_link("reference to an also loaded file %a, consider using directive: figures.embedded",filename) + reported[filename] = true + end + add_link(x,y,w,h,formatters["%s::page(%s)"](filename,destination),"file (page)") + end else add_link(x,y,w,h,formatters["file(%s)"](filename),"file") end @@ -145,77 +187,82 @@ function codeinjections.mergereferences(specification) specification = figures and figures.current() specification = specification and specification.status end - if specification then - local fullname = specification.fullname - local document = loadpdffile(fullname) -- costs time - if document then - local pagenumber = specification.page or 1 - local xscale = specification.yscale or 1 - local yscale = specification.yscale or 1 - local size = specification.size or "crop" -- todo - local pagedata = document.pages[pagenumber] - local annotations = pagedata and pagedata.Annots - local namespace = makenamespace(fullname) - local reference = namespace .. pagenumber - if annotations and annotations.n > 0 then - local mediabox = pagedata.MediaBox - local llx = mediabox[1] - local lly = mediabox[2] - local urx = mediabox[3] - local ury = mediabox[4] - local width = xscale * (urx - llx) -- \\overlaywidth, \\overlayheight - local height = yscale * (ury - lly) -- \\overlaywidth, \\overlayheight - context.definelayer( { "epdflinks" }, { height = height.."bp" , width = width.."bp" }) - for i=1,annotations.n do - local annotation = annotations[i] - if annotation then - local subtype = annotation.Subtype - local rectangle = annotation.Rect - local a_llx = rectangle[1] - local a_lly = rectangle[2] - local a_urx = rectangle[3] - local a_ury = rectangle[4] - local x = xscale * (a_llx - llx) - local y = yscale * (a_lly - lly) - local w = xscale * (a_urx - a_llx) - local h = yscale * (a_ury - a_lly) - if subtype == "Link" then - local a = annotation.A - if not a then - report_link("missing link annotation") - elseif w > width or h > height or w < 0 or h < 0 or abs(x) > (maxdimen/2) or abs(y) > (maxdimen/2) then - report_link("broken link rectangle [%f %f %f %f] (max: %f)",a_llx,a_lly,a_urx,a_ury,maxdimen/2) - else - local linktype = a.S - if linktype == "GoTo" then - link_goto(x,y,w,h,document,annotation,pagedata,namespace) - elseif linktype == "GoToR" then - link_file(x,y,w,h,document,annotation) - elseif linktype == "URI" then - link_uri(x,y,w,h,document,annotation) - elseif trace_links then - report_link("unsupported link annotation %a",linktype) - end - end + if not specification then + return "" + end + local fullname = specification.fullname + local expanded = lower(expandname(fullname)) + -- we could add a check for duplicate page insertion + tobesaved[expanded] = true + --- but that is messy anyway so we forget about it + local document = loadpdffile(fullname) -- costs time + if not document then + return "" + end + local pagenumber = specification.page or 1 + local xscale = specification.yscale or 1 + local yscale = specification.yscale or 1 + local size = specification.size or "crop" -- todo + local pagedata = document.pages[pagenumber] + local annotations = pagedata and pagedata.Annots + local namespace = makenamespace(fullname) + local reference = namespace .. pagenumber + if annotations and annotations.n > 0 then + local mediabox = pagedata.MediaBox + local llx = mediabox[1] + local lly = mediabox[2] + local urx = mediabox[3] + local ury = mediabox[4] + local width = xscale * (urx - llx) -- \\overlaywidth, \\overlayheight + local height = yscale * (ury - lly) -- \\overlaywidth, \\overlayheight + context.definelayer( { "epdflinks" }, { height = height.."bp" , width = width.."bp" }) + for i=1,annotations.n do + local annotation = annotations[i] + if annotation then + local subtype = annotation.Subtype + local rectangle = annotation.Rect + local a_llx = rectangle[1] + local a_lly = rectangle[2] + local a_urx = rectangle[3] + local a_ury = rectangle[4] + local x = xscale * (a_llx - llx) + local y = yscale * (a_lly - lly) + local w = xscale * (a_urx - a_llx) + local h = yscale * (a_ury - a_lly) + if subtype == "Link" then + local a = annotation.A + if not a then + report_link("missing link annotation") + elseif w > width or h > height or w < 0 or h < 0 or abs(x) > (maxdimen/2) or abs(y) > (maxdimen/2) then + report_link("broken link rectangle [%.6F %.6F %.6F %.6F] (max: %.6F)",a_llx,a_lly,a_urx,a_ury,maxdimen/2) + else + local linktype = a.S + if linktype == "GoTo" then + link_goto(x,y,w,h,document,annotation,pagedata,namespace) + elseif linktype == "GoToR" then + link_file(x,y,w,h,document,annotation) + elseif linktype == "URI" then + link_uri(x,y,w,h,document,annotation) elseif trace_links then - report_link("unsupported annotation %a",subtype) + report_link("unsupported link annotation %a",linktype) end - elseif trace_links then - report_link("broken annotation, index %a",i) end + elseif trace_links then + report_link("unsupported annotation %a",subtype) end - context.flushlayer { "epdflinks" } - end - -- moved outside previous test - context.setgvalue("figurereference",reference) -- global - if trace_links then - report_link("setting figure reference to %a",reference) + elseif trace_links then + report_link("broken annotation, index %a",i) end - specification.reference = reference - return namespace end + context.flushlayer { "epdflinks" } end - return ""-- no namespace, empty, not nil + -- moved outside previous test + context.setgvalue("figurereference",reference) -- global + if trace_links then + report_link("setting figure reference to %a",reference) + end + specification.reference = reference + return namespace end function codeinjections.mergeviewerlayers(specification) @@ -280,7 +327,7 @@ function codeinjections.getbookmarks(filename) local document = nil - if lfs.isfile(filename) then + if isfile(filename) then document = loadpdffile(filename) else report_outline("unknown file %a",filename) @@ -303,15 +350,22 @@ function codeinjections.getbookmarks(filename) local subtype = action.S if subtype == "GoTo" then destination = action.D - if type(destination) == "string" then + local kind = type(destination) + if kind == "string" then entry.destination = destination destination = destinations[destination] local pagedata = destination and destination[1] if pagedata then entry.realpage = pagedata.number end - else - -- maybe + elseif kind == "table" then + local pageref = destination.n + if pageref then + local pagedata = pages[pageref] + if pagedata then + entry.realpage = pagedata.number + end + end end else -- maybe @@ -416,3 +470,82 @@ function codeinjections.mergebookmarks(specification) end end end + +-- placeholders: + +function codeinjections.mergecomments(specification) + report_comment("unfinished experimental code, not used yet") +end + +function codeinjections.mergefields(specification) + report_field("unfinished experimental code, not used yet") +end + +-- A bit more than a placeholder but in the same perspective as +-- inclusion of comments and fields: +-- +-- getinfo{ filename = "tt.pdf", metadata = true } +-- getinfo{ filename = "tt.pdf", page = 1, metadata = "xml" } +-- getinfo("tt.pdf") + +function codeinjections.getinfo(specification) + if type(specification) == "string" then + specification = { filename = specification } + end + local filename = specification.filename + if type(filename) == "string" and isfile(filename) then + local pdffile = loadpdffile(filename) + if pdffile then + local pagenumber = specification.page or 1 + local metadata = specification.metadata + local catalog = pdffile.Catalog + local info = pdffile.Info + local pages = pdffile.pages + local nofpages = pages.n + if metadata then + local m = catalog.Metadata + if m then + m = m() + if metadata == "xml" then + metadata = xml.convert(m) + else + metadata = m + end + else + metadata = nil + end + else + metadata = nil + end + if pagenumber > nofpages then + pagenumber = nofpages + end + local nobox = { 0, 0, 0, 0 } + local crop = nobox + local media = nobox + local page = pages[pagenumber] + if page then + crop = page.CropBox or nobox + media = page.MediaBox or crop or nobox + crop.n = nil -- nicer + media.n = nil -- nicer + end + local bbox = crop or media or nobox + return { + filename = filename, + pdfversion = tonumber(catalog.Version), + nofpages = nofpages, + title = info.Title, + creator = info.Creator, + producer = info.Producer, + creationdate = info.CreationDate, + modification = info.ModDate, + metadata = metadata, + width = bbox[4] - bbox[2], + height = bbox[3] - bbox[1], + cropbox = { crop[1], crop[2], crop[3], crop[4] }, -- we need access + mediabox = { media[1], media[2], media[3], media[4] } , -- we need access + } + end + end +end diff --git a/tex/context/base/mkiv/lpdf-epd.lua b/tex/context/base/mkiv/lpdf-epd.lua index 0f62d6189..2fcd28473 100644 --- a/tex/context/base/mkiv/lpdf-epd.lua +++ b/tex/context/base/mkiv/lpdf-epd.lua @@ -31,71 +31,86 @@ if not modules then modules = { } end modules ['lpdf-epd'] = { -- a safer bet is foo("Title") which will return a decoded string (or the original if it -- already was unicode). -local setmetatable, rawset, rawget, type = setmetatable, rawset, rawget, type +local setmetatable, rawset, rawget, type, next = setmetatable, rawset, rawget, type, next local tostring, tonumber = tostring, tonumber local lower, match, char, byte, find = string.lower, string.match, string.char, string.byte, string.find local abs = math.abs local concat = table.concat local toutf, toeight, utfchar = string.toutf, utf.toeight, utf.char +local setmetatableindex = table.setmetatableindex local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns local P, C, S, R, Ct, Cc, V, Carg, Cs, Cf, Cg = lpeg.P, lpeg.C, lpeg.S, lpeg.R, lpeg.Ct, lpeg.Cc, lpeg.V, lpeg.Carg, lpeg.Cs, lpeg.Cf, lpeg.Cg -local epdf = epdf - lpdf = lpdf or { } -local lpdf = lpdf -local lpdf_epdf = { } -lpdf.epdf = lpdf_epdf +local epdf = epdf + lpdf = lpdf or { } +local lpdf = lpdf +local lpdf_epdf = { } +lpdf.epdf = lpdf_epdf -local pdf_open = epdf.open +-- local getDict, getArray, getReal, getNum, getString, getBool, getName, getRef, getRefNum +-- local getType, getTypeName +-- local dictGetLength, dictGetVal, dictGetValNF, dictGetKey +-- local arrayGetLength, arrayGetNF, arrayGet +-- local streamReset, streamGetDict, streamGetChar -local report_epdf = logs.reporter("epdf") +-- We use as little as possible and also not an object interface. After all, we +-- don't know how the library (and its api) evolves so we better can be prepared +-- for wrappers. -local getDict, getArray, getReal, getNum, getString, getBool, getName, getRef, getRefNum -local getType, getTypeName -local dictGetLength, dictGetVal, dictGetValNF, dictGetKey -local arrayGetLength, arrayGetNF, arrayGet -local streamReset, streamGetDict, streamGetChar +local registry = debug.getregistry() -do - local object = epdf.Object() - -- - getDict = object.getDict - getArray = object.getArray - getReal = object.getReal - getNum = object.getNum - getString = object.getString - getBool = object.getBool - getName = object.getName - getRef = object.getRef - getRefNum = object.getRefNum - -- - getType = object.getType - getTypeName = object.getTypeName - -- - streamReset = object.streamReset - streamGetDict = object.streamGetDict - streamGetChar = object.streamGetChar - -- -end +local object = registry["epdf.Object"] +local dictionary = registry["epdf.Dict"] +local array = registry["epdf.Array"] +local xref = registry["epdf.XRef"] +local catalog = registry["epdf.Catalog"] +local pdfdoc = registry["epdf.PDFDoc"] -local function initialize_methods(xref) - local dictionary = epdf.Dict(xref) - local array = epdf.Array(xref) - -- - dictGetLength = dictionary.getLength - dictGetVal = dictionary.getVal - dictGetValNF = dictionary.getValNF - dictGetKey = dictionary.getKey - -- - arrayGetLength = array.getLength - arrayGetNF = array.getNF - arrayGet = array.get - -- - initialize_methods = function() - -- already done - end -end +local openPDF = epdf.open + +local getDict = object.getDict +local getArray = object.getArray +local getReal = object.getReal +local getInt = object.getInt +local getNum = object.getNum +local getString = object.getString +local getBool = object.getBool +local getName = object.getName +local getRef = object.getRef +local getRefNum = object.getRefNum + +local getType = object.getType +local getTypeName = object.getTypeName + +local streamReset = object.streamReset +local streamGetDict = object.streamGetDict +local streamGetChar = object.streamGetChar + +local dictGetLength = dictionary.getLength +local dictGetVal = dictionary.getVal +local dictGetValNF = dictionary.getValNF +local dictGetKey = dictionary.getKey + +local arrayGetLength = array.getLength +local arrayGetNF = array.getNF +local arrayGet = array.get + +-- these are kind of weird as they can't be accessed by (root) object + +local getNumPages = catalog.getNumPages +local getPageRef = catalog.getPageRef + +local getXRef = pdfdoc.getXRef +local getRawCatalog = pdfdoc.getCatalog + +local fetch = xref.fetch +local getCatalog = xref.getCatalog +local getDocInfo = xref.getDocInfo + +-- we're done with library shortcuts + +local report_epdf = logs.reporter("epdf") local typenames = { [0] = "boolean", @@ -139,15 +154,50 @@ local checked_access local frompdfdoc = lpdf.frompdfdoc -local function get_flagged(t,f,k) - local fk = f[k] - if not fk then - return t[k] - elseif fk == "rawtext" then - return frompdfdoc(t[k]) - else -- no other flags yet - return t[k] +local get_flagged + +if lpdf.dictionary then + + local pdfdictionary = lpdf.dictionary + local pdfarray = lpdf.array + local pdfconstant = lpdf.constant + local pdfstring = lpdf.string + local pdfunicode = lpdf.unicode + + get_flagged = function(t,f,k) + local tk = t[k] -- triggers resolve + local fk = f[k] + if not fk then + return tk + elseif fk == "name" then + return pdfconstant(tk) + elseif fk == "array" then + return pdfarray(tk) + elseif fk == "dictionary" then + return pdfarray(tk) + elseif fk == "rawtext" then + return pdfstring(tk) + elseif fk == "unicode" then + return pdfunicode(tk) + else + return tk + end end + +else + + get_flagged = function(t,f,k) + local tk = t[k] -- triggers resolve + local fk = f[k] + if not fk then + return tk + elseif fk == "rawtext" then + return frompdfdoc(tk) + else + return tk + end + end + end local function prepare(document,d,t,n,k,mt,flags) @@ -166,7 +216,7 @@ local function prepare(document,d,t,n,k,mt,flags) local cached = document.__cache__[objnum] if not cached then cached = checked_access[kind](v,document,objnum,mt) - if c then + if cached then document.__cache__[objnum] = cached document.__xrefs__[cached] = objnum end @@ -207,8 +257,11 @@ local function some_dictionary(d,document) __call = function(t,k) return get_flagged(t,f,k) end, + -- __kind = function(k) + -- return f[k] or type(t[k]) + -- end, } ) - return t + return t, "dictionary" end end @@ -225,8 +278,11 @@ local function get_dictionary(object,document,r,mt) __call = function(t,k) return get_flagged(t,f,k) end, + -- __kind = function(k) + -- return f[k] or type(t[k]) + -- end, } ) - return t + return t, "dictionary" end end @@ -260,8 +316,14 @@ local function prepare(document,a,t,n,k) fatal_error("error: invalid value at index %a in array of %a",i,document.filename) end end - getmetatable(t).__index = nil - return t[k] + local m = getmetatable(t) + if m then + m.__index = nil + m.__len = nil + end + if k then + return t[k] + end end local function some_array(a,document) @@ -270,10 +332,20 @@ local function some_array(a,document) local t = { n = n } setmetatable(t, { __index = function(t,k) - return prepare(document,a,t,n,k) - end + return prepare(document,a,t,n,k,_,_,f) + end, + __len = function(t) + prepare(document,a,t,n,_,_,f) + return n + end, + __call = function(t,k) + return get_flagged(t,f,k) + end, + -- __kind = function(k) + -- return f[k] or type(t[k]) + -- end, } ) - return t + return t, "array" end end @@ -282,12 +354,23 @@ local function get_array(object,document) local n = a and arrayGetLength(a) or 0 if n > 0 then local t = { n = n } + local f = { } setmetatable(t, { __index = function(t,k) - return prepare(document,a,t,n,k) - end + return prepare(document,a,t,n,k,_,_,f) + end, + __len = function(t) + prepare(document,a,t,n,_,_,f) + return n + end, + __call = function(t,k) + return get_flagged(t,f,k) + end, + -- __kind = function(k) + -- return f[k] or type(t[k]) + -- end, } ) - return t + return t, "array" end end @@ -335,7 +418,7 @@ local u_pattern = lpeg.patterns.utfbom_16_be * lpeg.patterns.utf16_to_utf8_be ----- b_pattern = lpeg.patterns.hextobytes local function get_string(v) - -- the toutf function only converts a utf16 string and leves the original + -- the toutf function only converts a utf16 string and leaves the original -- untouched otherwise; one might want to apply lpdf.frompdfdoc to a -- non-unicode string local s = getString(v) @@ -344,7 +427,7 @@ local function get_string(v) end local u = lpegmatch(u_pattern,s) if u then - return u -- , "unicode" + return u, "unicode" end -- this is too tricky and fails on e.g. reload of url www.pragma-ade.com) -- local b = lpegmatch(b_pattern,s) @@ -354,6 +437,10 @@ local function get_string(v) return s, "rawtext" end +local function get_name(v) + return getName(v), "name" +end + local function get_null() return nil end @@ -369,17 +456,17 @@ local function invalidaccess(k,document) end end -checked_access = table.setmetatableindex(function(t,k) +checked_access = setmetatableindex(function(t,k) return function(v,document) invalidaccess(k,document) end end) checked_access[typenumbers.boolean] = getBool -checked_access[typenumbers.integer] = getNum +checked_access[typenumbers.integer] = getInt checked_access[typenumbers.real] = getReal checked_access[typenumbers.string] = get_string -- getString -checked_access[typenumbers.name] = getName +checked_access[typenumbers.name] = get_name checked_access[typenumbers.null] = get_null checked_access[typenumbers.array] = get_array -- d,document,r checked_access[typenumbers.dictionary] = get_dictionary -- d,document,r @@ -468,20 +555,25 @@ local function getstructure(document) return document.Catalog.StructTreeRoot end +-- This is the only messy helper. We can't access the root as any object (it seems) +-- so we need a few low level acessors. It's anyway sort of simple enough to deal +-- with but it won't win a beauty contest. + local function getpages(document,Catalog) - local __data__ = document.__data__ - local __xrefs__ = document.__xrefs__ - local __cache__ = document.__cache__ - local __xref__ = document.__xref__ + local __data__ = document.__data__ + local __xrefs__ = document.__xrefs__ + local __cache__ = document.__cache__ + local __xref__ = document.__xref__ + -- + local rawcatalog = getRawCatalog(__data__) + local nofpages = getNumPages(rawcatalog) -- - local catalog = __data__:getCatalog() - local pages = { } - local nofpages = catalog:getNumPages() - local metatable = { __index = Catalog.Pages } + local pages = { } + local metatable = { __index = Catalog.Pages } -- somewhat empty -- for pagenumber=1,nofpages do - local pagereference = catalog:getPageRef(pagenumber).num - local pageobject = __xref__:fetch(pagereference,0) + local pagereference = getPageRef(rawcatalog,pagenumber).num + local pageobject = fetch(__xref__,pagereference,0) local pagedata = get_dictionary(pageobject,document,pagereference,metatable) if pagedata then -- rawset(pagedata,"number",pagenumber) @@ -496,59 +588,53 @@ local function getpages(document,Catalog) -- pages.n = nofpages -- + document.pages = pages return pages end --- loader - -local function delayed(document,tag,f) - local t = { } - setmetatable(t, { __index = function(t,k) - local result = f() - if result then - document[tag] = result - return result[k] - end - end } ) - return t +local function resolve(document,k) + local entry = nil + local Catalog = document.Catalog + local Names = Catalog.Names + if k == "pages" then + entry = getpages(document,Catalog) + elseif k == "destinations" then + entry = getnames(document,Names and Names.Dests) + elseif k == "javascripts" then + entry = getnames(document,Names and Names.JS) + elseif k == "widgets" then + entry = getnames(document,Names and Names.AcroForm) + elseif k == "embeddedfiles" then + entry = getnames(document,Names and Names.EmbeddedFiles) + elseif k == "layers" then + entry = getlayers(document) + elseif k == "structure" then + entry = getstructure(document) + end + document[k] = entry + return entry end --- local catobj = data:getXRef():fetch(data:getXRef():getRootNum(),data:getXRef():getRootGen()) --- print(catobj:getDict(),data:getXRef():getCatalog():getDict()) - local loaded = { } function lpdf_epdf.load(filename) local document = loaded[filename] if not document then statistics.starttiming(lpdf_epdf) - local __data__ = pdf_open(filename) -- maybe resolvers.find_file + local __data__ = openPDF(filename) -- maybe resolvers.find_file if __data__ then - local __xref__ = __data__:getXRef() + local __xref__ = getXRef(__data__) document = { filename = filename, __cache__ = { }, __xrefs__ = { }, __fonts__ = { }, __data__ = __data__, - __xref__ = __xref__, + __xref__ = __xref__ } - -- - initialize_methods(__xref__) - -- - local Catalog = some_dictionary(__xref__:getCatalog():getDict(),document) - local Info = some_dictionary(__xref__:getDocInfo():getDict(),document) - -- - document.Catalog = Catalog - document.Info = Info - -- a few handy helper tables - document.pages = delayed(document,"pages", function() return getpages(document,Catalog) end) - document.destinations = delayed(document,"destinations", function() return getnames(document,Catalog.Names and Catalog.Names.Dests) end) - document.javascripts = delayed(document,"javascripts", function() return getnames(document,Catalog.Names and Catalog.Names.JS) end) - document.widgets = delayed(document,"widgets", function() return getnames(document,Catalog.Names and Catalog.Names.AcroForm) end) - document.embeddedfiles = delayed(document,"embeddedfiles",function() return getnames(document,Catalog.Names and Catalog.Names.EmbeddedFiles) end) - document.layers = delayed(document,"layers", function() return getlayers(document) end) - document.structure = delayed(document,"structure", function() return getstructure(document) end) + document.Catalog = some_dictionary(getDict(getCatalog(__xref__)),document) + document.Info = some_dictionary(getDict(getDocInfo(__xref__)),document) + setmetatableindex(document,resolve) else document = false end @@ -663,7 +749,7 @@ local function analyzefonts(document,resources) -- unfinished fonts[id] = { tounicode = type(tounicode) == "table" and tounicode or { } } - table.setmetatableindex(fonts[id],"self") + setmetatableindex(fonts[id],"self") end end end @@ -787,7 +873,7 @@ function lpdf_epdf.contenttotext(document,list) -- maybe signal fonts local dy = abs(last_y - ty) if dy > linefactor*last_f then if last > 0 then - if find(text[last],softhyphen) then + if find(text[last],softhyphen,1,true) then -- ignore else last = last + 1 diff --git a/tex/context/base/mkiv/lpdf-fld.lua b/tex/context/base/mkiv/lpdf-fld.lua index bbafb299b..73de5eaf6 100644 --- a/tex/context/base/mkiv/lpdf-fld.lua +++ b/tex/context/base/mkiv/lpdf-fld.lua @@ -6,56 +6,52 @@ if not modules then modules = { } end modules ['lpdf-fld'] = { license = "see context related readme files" } --- The problem with widgets is that so far each version of acrobat --- has some rendering problem. I tried to keep up with this but --- it makes no sense to do so as one cannot rely on the viewer --- not changing. Especially Btn fields are tricky as their appearences --- need to be synchronized in the case of children but e.g. acrobat --- 10 does not retain the state and forces a check symbol. If you --- make a file in acrobat then it has MK entries that seem to overload --- the already present appearance streams (they're probably only meant for --- printing) as it looks like the viewer has some fallback on (auto --- generated) MK behaviour built in. So ... hard to test. Unfortunately --- not even the default appearance is generated. This will probably be --- solved at some point. +-- The problem with widgets is that so far each version of acrobat has some +-- rendering problem. I tried to keep up with this but it makes no sense to do so as +-- one cannot rely on the viewer not changing. Especially Btn fields are tricky as +-- their appearences need to be synchronized in the case of children but e.g. +-- acrobat 10 does not retain the state and forces a check symbol. If you make a +-- file in acrobat then it has MK entries that seem to overload the already present +-- appearance streams (they're probably only meant for printing) as it looks like +-- the viewer has some fallback on (auto generated) MK behaviour built in. So ... +-- hard to test. Unfortunately not even the default appearance is generated. This +-- will probably be solved at some point. -- --- Also, for some reason the viewer does not always show custom appearances --- when fields are being rolled over or clicked upon, and circles or checks --- pop up when you don't expect them. I fear that this kind of instability --- eventually will kill pdf forms. After all, the manual says: "individual --- annotation handlers may ignore this entry and provide their own appearances" --- and one might wonder what 'individual' means here, but effectively this --- renders the whole concept of appearances useless. +-- Also, for some reason the viewer does not always show custom appearances when +-- fields are being rolled over or clicked upon, and circles or checks pop up when +-- you don't expect them. I fear that this kind of instability eventually will kill +-- pdf forms. After all, the manual says: "individual annotation handlers may ignore +-- this entry and provide their own appearances" and one might wonder what +-- 'individual' means here, but effectively this renders the whole concept of +-- appearances useless. -- --- Okay, here is one observation. A pdf file contains objects and one might --- consider each one to be a static entity when read in. However, acrobat --- starts rendering and seems to manipulate (appearance streams) of objects --- in place (this is visible when the file is saved again). And, combined --- with some other caching and hashing, this might give side effects for --- shared objects. So, it seems that for some cases one can best be not too --- clever and not share but duplicate information. Of course this defeats the --- whole purpose of these objects. Of course I can be wrong. +-- Okay, here is one observation. A pdf file contains objects and one might consider +-- each one to be a static entity when read in. However, acrobat starts rendering +-- and seems to manipulate (appearance streams) of objects in place (this is visible +-- when the file is saved again). And, combined with some other caching and hashing, +-- this might give side effects for shared objects. So, it seems that for some cases +-- one can best be not too clever and not share but duplicate information. Of course +-- this defeats the whole purpose of these objects. Of course I can be wrong. -- -- A rarther weird side effect of the viewer is that the highlighting of fields --- obscures values, unless you uses one of the BS variants, and this makes --- custum appearances rather useless as there is no way to control this apart --- from changing the viewer preferences. It could of course be a bug but it would --- be nice if the highlighting was at least transparent. I have no clue why the --- built in shapes work ok (some xform based appearances are generated) while --- equally valid other xforms fail. It looks like acrobat appearances come on --- top (being refered to in the MK) while custom ones are behind the highlight --- rectangle. One can disable the "Show border hover color for fields" option --- in the preferences. If you load java-imp-rhh this side effect gets disabled --- and you get what you expect (it took me a while to figure out this hack). +-- obscures values, unless you uses one of the BS variants, and this makes custum +-- appearances rather useless as there is no way to control this apart from changing +-- the viewer preferences. It could of course be a bug but it would be nice if the +-- highlighting was at least transparent. I have no clue why the built in shapes +-- work ok (some xform based appearances are generated) while equally valid other +-- xforms fail. It looks like acrobat appearances come on top (being refered to in +-- the MK) while custom ones are behind the highlight rectangle. One can disable the +-- "Show border hover color for fields" option in the preferences. If you load +-- java-imp-rhh this side effect gets disabled and you get what you expect (it took +-- me a while to figure out this hack). -- --- When highlighting is enabled, those default symbols flash up, so it looks --- like we have some inteference between this setting and custom appearances. +-- When highlighting is enabled, those default symbols flash up, so it looks like we +-- have some inteference between this setting and custom appearances. -- --- Anyhow, the NeedAppearances is really needed in order to get a rendering --- for printing especially when highlighting (those colorfull foregrounds) is --- on. +-- Anyhow, the NeedAppearances is really needed in order to get a rendering for +-- printing especially when highlighting (those colorfull foregrounds) is on. -local tostring, next = tostring, next +local tostring, tonumber, next = tostring, tonumber, next local gmatch, lower, format, formatters = string.gmatch, string.lower, string.format, string.formatters local lpegmatch = lpeg.match local bpfactor, todimen = number.dimenfactors.bp, string.todimen @@ -92,6 +88,7 @@ local pdfshareobjectreference = lpdf.shareobjectreference local pdfshareobject = lpdf.shareobject local pdfreserveobject = lpdf.reserveobject local pdfaction = lpdf.action +local pdfmajorversion = lpdf.majorversion local pdfcolor = lpdf.color local pdfcolorvalues = lpdf.colorvalues @@ -124,39 +121,39 @@ function codeinjections.setformsmethod(name) end local flag = { -- /Ff - ReadOnly = 2^ 0, -- 1 - Required = 2^ 1, -- 2 - NoExport = 2^ 2, -- 3 - MultiLine = 2^12, -- 13 - Password = 2^13, -- 14 - NoToggleToOff = 2^14, -- 15 - Radio = 2^15, -- 16 - PushButton = 2^16, -- 17 - PopUp = 2^17, -- 18 - Edit = 2^18, -- 19 - Sort = 2^19, -- 20 - FileSelect = 2^20, -- 21 - DoNotSpellCheck = 2^22, -- 23 - DoNotScroll = 2^23, -- 24 - Comb = 2^24, -- 25 - RichText = 2^25, -- 26 - RadiosInUnison = 2^25, -- 26 - CommitOnSelChange = 2^26, -- 27 + ReadOnly = 0x00000001, -- 2^ 0 + Required = 0x00000002, -- 2^ 1 + NoExport = 0x00000004, -- 2^ 2 + MultiLine = 0x00001000, -- 2^12 + Password = 0x00002000, -- 2^13 + NoToggleToOff = 0x00004000, -- 2^14 + Radio = 0x00008000, -- 2^15 + PushButton = 0x00010000, -- 2^16 + PopUp = 0x00020000, -- 2^17 + Edit = 0x00040000, -- 2^18 + Sort = 0x00080000, -- 2^19 + FileSelect = 0x00100000, -- 2^20 + DoNotSpellCheck = 0x00400000, -- 2^22 + DoNotScroll = 0x00800000, -- 2^23 + Comb = 0x01000000, -- 2^24 + RichText = 0x02000000, -- 2^25 + RadiosInUnison = 0x02000000, -- 2^25 + CommitOnSelChange = 0x04000000, -- 2^26 } local plus = { -- /F - Invisible = 2^0, -- 1 - Hidden = 2^1, -- 2 - Printable = 2^2, -- 3 - Print = 2^2, -- 3 - NoZoom = 2^3, -- 4 - NoRotate = 2^4, -- 5 - NoView = 2^5, -- 6 - ReadOnly = 2^6, -- 7 - Locked = 2^7, -- 8 - ToggleNoView = 2^8, -- 9 - LockedContents = 2^9, -- 10, - AutoView = 2^8, -- 6 + 9 ? + Invisible = 0x00000001, -- 2^0 + Hidden = 0x00000002, -- 2^1 + Printable = 0x00000004, -- 2^2 + Print = 0x00000004, -- 2^2 + NoZoom = 0x00000008, -- 2^3 + NoRotate = 0x00000010, -- 2^4 + NoView = 0x00000020, -- 2^5 + ReadOnly = 0x00000040, -- 2^6 + Locked = 0x00000080, -- 2^7 + ToggleNoView = 0x00000100, -- 2^8 + LockedContents = 0x00000200, -- 2^9 + AutoView = 0x00000100, -- 2^8 } -- todo: check what is interfaced @@ -174,6 +171,9 @@ plus.hidden = plus.Hidden plus.printable = plus.Printable plus.auto = plus.AutoView +lpdf.flags.widgets = flag +lpdf.flags.annotations = plus + -- some day .. lpeg with function or table local function fieldflag(specification) -- /Ff @@ -360,6 +360,8 @@ local function fieldsurrounding(specification) return tostring(stream) end +codeinjections.fieldsurrounding = fieldsurrounding + local function registerfonts() if next(usedfonts) then checkpdfdocencoding() -- already done @@ -905,7 +907,7 @@ local function finishfields() end if #collected > 0 then local acroform = pdfdictionary { - NeedAppearances = true, + NeedAppearances = pdfmajorversion() == 1 or nil, Fields = pdfreference(pdfflushobject(collected)), CO = fieldsetlist(calculationset), } @@ -1294,78 +1296,18 @@ function methods.push(name,specification) end local function makeradioparent(field,specification) --- specification = enhance(specification,"Radio,RadiosInUnison") specification = enhance(specification,"Radio,RadiosInUnison,Print,NoToggleToOff") --- specification = enhance(specification,"Radio,Print,NoToggleToOff") local d = pdfdictionary { T = field.name, FT = pdf_btn, --- F = fieldplus(specification), + -- F = fieldplus(specification), Ff = fieldflag(specification), --- H = pdf_n, + -- H = pdf_n, V = fielddefault(field), } save_parent(field,specification,d,true) end --- local function makeradiochild(name,specification) --- local field, parent = clones[name], nil --- if field then --- field = radios[field.parent] --- parent = fields[field.parent] --- if not parent.pobj then --- if trace_fields then --- report_fields("forcing parent radio %a",parent.name) --- end --- makeradioparent(parent,parent) --- end --- else --- field = radios[name] --- if not field then --- report_fields("there is some problem with field %a",name) --- return nil --- end --- parent = fields[field.parent] --- if not parent.pobj then --- if trace_fields then --- report_fields("using parent radio %a",name) --- end --- makeradioparent(parent,parent) --- end --- end --- if trace_fields then --- report_fields("using child radio %a with values %a and default %a",name,field.values,field.default) --- end --- local fontsymbol = specification.fontsymbol --- fontsymbol="star" --- local d = pdfdictionary { --- Subtype = pdf_widget, --- Parent = pdfreference(parent.pobj), --- F = fieldplus(specification), --- OC = fieldlayer(specification), --- AA = fieldactions(specification), --- H = pdf_n, --- } --- if fontsymbol and fontsymbol ~= "" then --- local appearance, default, value = fieldstates_radio(field,true,false,false,name) -- false is also ok --- specification.fontsymbol = todingbat(fontsymbol) --- specification.fontstyle = "symbol" --- specification.fontalternative = "dingbats" --- d.DA = fieldsurrounding(specification) --- d.MK = fieldrendering(specification) --- d.AS = pdfconstant(value) -- default -- mandate when AP but confuses viewers --- d.AP = appearance --- return save_kid(parent,specification,d,value) --- -- return save_kid(parent,specification,d,name) --- else --- -- local appearance, default, value = fieldstates_radio(field,true) -- false is also ok --- local appearance, default, value = fieldstates_radio(field,true,false,false,name) -- false is also ok --- d.AS = default -- mandate when AP but confuses viewers --- d.AP = appearance --- return save_kid(parent,specification,d,value) --- end --- end - local function makeradiochild(name,specification) local field, parent = clones[name], nil if field then diff --git a/tex/context/base/mkiv/lpdf-fmt.lua b/tex/context/base/mkiv/lpdf-fmt.lua index 8bbd3374f..0830d2d8d 100644 --- a/tex/context/base/mkiv/lpdf-fmt.lua +++ b/tex/context/base/mkiv/lpdf-fmt.lua @@ -10,6 +10,7 @@ if not modules then modules = { } end modules ['lpdf-fmt'] = { -- context --directives="backend.format=PDF/X-1a:2001" --trackers=backend.format yourfile +local tonumber = tonumber local lower, gmatch, format, find = string.lower, string.gmatch, string.format, string.find local concat, serialize, sortedhash = table.concat, table.serialize, table.sortedhash @@ -354,7 +355,7 @@ local formats = utilities.storage.allocate { pdf_version = 1.7, format_name = "pdf/a-2a", xmp_file = "lpdf-pda.xml", - gts_flag = "GTS_PDFA2", + gts_flag = "GTS_PDFA1", gray_scale = true, cmyk_colors = true, rgb_colors = true, @@ -378,7 +379,7 @@ local formats = utilities.storage.allocate { pdf_version = 1.7, format_name = "pdf/a-3a", xmp_file = "lpdf-pda.xml", - gts_flag = "GTS_PDFA3", + gts_flag = "GTS_PDFA1", gray_scale = true, cmyk_colors = true, rgb_colors = true, @@ -732,17 +733,15 @@ function codeinjections.setformat(s) if not level then level = 3 -- good compromise, default anyway end - local pdf_version = spec.pdf_version * 10 - local inject_metadata = spec.inject_metadata - local majorversion = math.div(pdf_version,10) - local minorversion = math.mod(pdf_version,10) - local objectcompression = spec.object_compression and pdf_version >= 15 - local compresslevel = level or pdf.getcompresslevel() -- keep default - local objectcompresslevel = (objectcompression and (level or pdf.getobjcompresslevel())) or 0 - pdf.setcompresslevel (compresslevel) - pdf.setobjcompresslevel(objectcompresslevel) - pdf.setmajorversion (majorversion) - pdf.setminorversion (minorversion) + local pdf_version = spec.pdf_version * 10 + local inject_metadata = spec.inject_metadata + local majorversion = math.div(pdf_version,10) + local minorversion = math.mod(pdf_version,10) + local objectcompression = spec.object_compression and pdf_version >= 15 + local compresslevel = level or lpdf.compresslevel() -- keep default + local objectcompresslevel = (objectcompression and (level or lpdf.objectcompresslevel())) or 0 + lpdf.setcompression(compresslevel,objectcompresslevel) + lpdf.setversion(majorversion,minorversion) if objectcompression then report_backend("forcing pdf version %s.%s, compression level %s, object compression level %s", majorversion,minorversion,compresslevel,objectcompresslevel) @@ -753,9 +752,8 @@ function codeinjections.setformat(s) report_backend("forcing pdf version %s.%s, compression disabled", majorversion,minorversion) end - if pdf.setomitcidset then - pdf.setomitcidset(formatspecification.include_cidsets == false and 1 or 0) - end + -- + pdf.setomitcidset(formatspecification.include_cidsets == false and 1 or 0) -- -- context.setupcolors { -- not this way -- cmyk = spec.cmyk_colors and variables.yes or variables.no, @@ -805,8 +803,7 @@ function codeinjections.setformat(s) report_backend("error, format %a is not supported",format) end elseif level then - pdf.setcompresslevel(level) - pdf.setobjcompresslevel(level) + lpdf.setcompression(level,level) else -- we ignore this as we hook it in \everysetupbackend end diff --git a/tex/context/base/mkiv/lpdf-grp.lua b/tex/context/base/mkiv/lpdf-grp.lua index 1ebc9b23d..34925fddd 100644 --- a/tex/context/base/mkiv/lpdf-grp.lua +++ b/tex/context/base/mkiv/lpdf-grp.lua @@ -6,7 +6,7 @@ if not modules then modules = { } end modules ['lpdf-grp'] = { license = "see context related readme files" } -local type = type +local type, tonumber = type, tonumber local formatters, gsub = string.formatters, string.gsub local concat = table.concat local round = math.round @@ -270,7 +270,7 @@ function img.package(image) -- see lpdf-u3d ** local height = boundingbox[4] local xform = img.scan { attr = resources(), - stream = formatters["%F 0 0 %F 0 0 cm /%s Do"](width,height,imagetag), + stream = formatters["%.6F 0 0 %.6F 0 0 cm /%s Do"](width,height,imagetag), bbox = { 0, 0, width/basepoints, height/basepoints }, } img.immediatewrite(xform) @@ -280,7 +280,7 @@ end -- experimental local nofpatterns = 0 -local f_pattern = formatters["q /Pattern cs /%s scn 0 0 %F %F re f Q"] -- q Q is not really needed +local f_pattern = formatters["q /Pattern cs /%s scn 0 0 %.6F %.6F re f Q"] -- q Q is not really needed local texsavebox = tex.saveboxresource diff --git a/tex/context/base/mkiv/lpdf-ini.lua b/tex/context/base/mkiv/lpdf-ini.lua index 1b24269a6..f8cff2032 100644 --- a/tex/context/base/mkiv/lpdf-ini.lua +++ b/tex/context/base/mkiv/lpdf-ini.lua @@ -11,11 +11,12 @@ if not modules then modules = { } end modules ['lpdf-ini'] = { local setmetatable, getmetatable, type, next, tostring, tonumber, rawset = setmetatable, getmetatable, type, next, tostring, tonumber, rawset local char, byte, format, gsub, concat, match, sub, gmatch = string.char, string.byte, string.format, string.gsub, table.concat, string.match, string.sub, string.gmatch local utfchar, utfbyte, utfvalues = utf.char, utf.byte, utf.values -local sind, cosd, floor, max, min = math.sind, math.cosd, math.floor, math.max, math.min +local sind, cosd, max, min = math.sind, math.cosd, math.max, math.min local sort = table.sort local lpegmatch, P, C, R, S, Cc, Cs = lpeg.match, lpeg.P, lpeg.C, lpeg.R, lpeg.S, lpeg.Cc, lpeg.Cs local formatters = string.formatters local isboolean = string.is_boolean +local rshift = bit32.rshift local report_objects = logs.reporter("backend","objects") local report_finalizing = logs.reporter("backend","finalizing") @@ -24,6 +25,8 @@ local report_blocked = logs.reporter("backend","blocked") local implement = interfaces.implement local two_strings = interfaces.strings[2] +local context = context + -- In ConTeXt MkIV we use utf8 exclusively so all strings get mapped onto a hex -- encoded utf16 string type between <>. We could probably save some bytes by using -- strings between () but then we end up with escaped ()\ too. @@ -66,18 +69,9 @@ local two_strings = interfaces.strings[2] local pdf = pdf local factor = number.dimenfactors.bp -do - - local texget = tex.get - local texset = tex.set - - function pdf.setmajorversion (n) texset("global","pdfmajorversion", n) end - function pdf.getmajorversion ( ) return texget("pdfmajorversion") end - -end - local pdfsetinfo = pdf.setinfo local pdfsetcatalog = pdf.setcatalog +----- pdfsettrailerid = pdf.settrailerid ----- pdfsetnames = pdf.setnames ----- pdfsettrailer = pdf.settrailer @@ -109,6 +103,8 @@ pdfdisablecommand("setpageattributes") pdfdisablecommand("setpagesattributes") pdfdisablecommand("registerannot") +pdf.disablecommand = pdfdisablecommand + local trace_finalizers = false trackers.register("backend.finalizers", function(v) trace_finalizers = v end) local trace_resources = false trackers.register("backend.resources", function(v) trace_resources = v end) local trace_objects = false trackers.register("backend.objects", function(v) trace_objects = v end) @@ -126,6 +122,65 @@ backends.pdf = pdfbackend lpdf = lpdf or { } local lpdf = lpdf +lpdf.flags = lpdf.flags or { } -- will be filled later + +do + + local setmajorversion = pdf.setmajorversion + local setminorversion = pdf.setminorversion + local getmajorversion = pdf.getmajorversion + local getminorversion = pdf.getminorversion + + if not setmajorversion then + + setmajorversion = function() end + getmajorversion = function() return 1 end + + pdf.setmajorversion = setmajorversion + pdf.getmajorversion = getmajorversion + + end + + function lpdf.setversion(major,minor) + setmajorversion(major or 1) + setminorversion(minor or 7) + end + + function lpdf.getversion(major,minor) + return getmajorversion(), getminorversion() + end + + lpdf.majorversion = getmajorversion + lpdf.minorversion = getminorversion + +end + +do + + local setcompresslevel = pdf.setcompresslevel + local setobjectcompresslevel = pdf.setobjcompresslevel + local getcompresslevel = pdf.getcompresslevel + local getobjectcompresslevel = pdf.getobjcompresslevel + + local frozen = false + + function lpdf.setcompression(level,objectlevel,freeze) + if not frozen then + setcompresslevel(level or 3) + setobjectcompresslevel(objectlevel or level or 3) + frozen = freeze + end + end + + function lpdf.getcompression() + return getcompresslevel(), getobjectcompresslevel() + end + + lpdf.compresslevel = getcompresslevel + lpdf.objectcompresslevel = getobjectcompresslevel + +end + local codeinjections = pdfbackend.codeinjections local nodeinjections = pdfbackend.nodeinjections @@ -201,8 +256,7 @@ end -- if b < 0x10000 then -- r[n] = format("%04x",b) -- else --- -- r[n] = format("%04x%04x",b/1024+0xD800,b%1024+0xDC00) --- r[n] = format("%04x%04x",floor(b/1024),b%1024+0xDC00) --bit32.rshift(b,10) +-- r[n] = format("%04x%04x",rshift(b,10),b%1024+0xDC00) -- end -- end -- n = n + 1 @@ -216,8 +270,7 @@ local cache = table.setmetatableindex(function(t,k) -- can be made weak if v < 0x10000 then v = format("%04x",v) else - -- v = format("%04x%04x",v/1024+0xD800,v%1024+0xDC00) - v = format("%04x%04x",floor(v/1024),v%1024+0xDC00) + v = format("%04x%04x",rshift(v,10),v%1024+0xDC00) end t[k] = v return v @@ -543,6 +596,8 @@ function lpdf.escaped(str) return lpegmatch(escaped,str) or str end +local pdfnull, pdfboolean, pdfreference, pdfverbose + do local p_null = { } setmetatable(p_null, mt_z) @@ -618,9 +673,9 @@ function lpdf.reserveobject(name) return r end +-- lpdf.reserveobject = pdfreserveobject -- lpdf.immediateobject = pdfimmediateobject -- lpdf.deferredobject = pdfdeferredobject --- lpdf.object = pdfdeferredobject -- lpdf.referenceobject = pdfreferenceobject local pagereference = pdf.pageref -- tex.pdfpageref is obsolete @@ -891,6 +946,15 @@ do if not environment.initex then trace_flush("info") info.Type = nil + if lpdf.majorversion() > 1 then + for k, v in next, info do + if k == "CreationDate" or k == "ModDate" then + -- mandate >= 2.0 + else + info[k] = nil + end + end + end pdfsetinfo(info()) end end @@ -1011,7 +1075,7 @@ end function lpdf.rotationcm(a) local s, c = sind(a), cosd(a) - return format("%0.6F %0.6F %0.6F %0.6F 0 0 cm",c,s,-s,c) + return format("%.6F %.6F %.6F %.6F 0 0 cm",c,s,-s,c) end -- ! -> universaltime @@ -1201,15 +1265,17 @@ do local f_actual_text = formatters["/Span <</ActualText %s >> BDC"] local context = context - local pdfdirect = nodes.pool.pdfdirect + local pdfdirect = nodes.pool.pdfdirectliteral -- todo: use tounicode from the font mapper + -- floor(unicode/1024) => rshift(unicode,10) -- better for 5.3 + function codeinjections.unicodetoactualtext(unicode,pdfcode) if unicode < 0x10000 then return f_actual_text_one(unicode,pdfcode) else - return f_actual_text_two(unicode/1024+0xD800,unicode%1024+0xDC00,pdfcode) + return f_actual_text_two(rshift(unicode,10)+0xD800,unicode%1024+0xDC00,pdfcode) end end @@ -1219,7 +1285,7 @@ do elseif unicode < 0x10000 then return f_actual_text_one_b(unicode) else - return f_actual_text_two_b(unicode/1024+0xD800,unicode%1024+0xDC00) + return f_actual_text_two_b(rshift(unicode,10)+0xD800,unicode%1024+0xDC00) end end @@ -1233,7 +1299,7 @@ do elseif unicode < 0x10000 then return f_actual_text_one_b_not(unicode) else - return f_actual_text_two_b_not(unicode/1024+0xD800,unicode%1024+0xDC00) + return f_actual_text_two_b_not(rshift(unicode,10)+0xD800,unicode%1024+0xDC00) end end @@ -1272,3 +1338,63 @@ implement { name = "lpdf_adddocumentcolorspace", arguments = two_strings, action implement { name = "lpdf_adddocumentpattern", arguments = two_strings, actions = function(a,b) lpdf.adddocumentpattern (a,pdfverbose(b)) end } implement { name = "lpdf_adddocumentshade", arguments = two_strings, actions = function(a,b) lpdf.adddocumentshade (a,pdfverbose(b)) end } +-- more helpers: copy from lepd to lpdf + +function lpdf.copyconstant(v) + if v ~= nil then + return pdfconstant(v) + end +end + +function lpdf.copyboolean(v) + if v ~= nil then + return pdfboolean(v) + end +end + +function lpdf.copyunicode(v) + if v then + return pdfunicode(v) + end +end + +function lpdf.copyarray(a) + if a then + local t = pdfarray() + local k = a.__kind + for i=1,#a do + t[i] = a(i) + end +-- inspect(t) + return t + end +end + +function lpdf.copydictionary(d) + if d then + local t = pdfdictionary() + for k, v in next, d do + t[k] = d(k) + end +-- inspect(t) + return t + end +end + +function lpdf.copynumber(v) + return v +end + +function lpdf.copyinteger(v) + return v -- maybe checking or round ? +end + +function lpdf.copyfloat(v) + return v +end + +function lpdf.copystring(v) + if v then + return pdfstring(v) + end +end diff --git a/tex/context/base/mkiv/lpdf-mis.lua b/tex/context/base/mkiv/lpdf-mis.lua index dc3f8560a..07dc3dcf1 100644 --- a/tex/context/base/mkiv/lpdf-mis.lua +++ b/tex/context/base/mkiv/lpdf-mis.lua @@ -15,8 +15,9 @@ if not modules then modules = { } end modules ['lpdf-mis'] = { -- referencing and references had to be tracked in multiple passes. Of -- course there are a couple of more changes. -local next, tostring = next, tostring +local next, tostring, type = next, tostring, type local format, gsub, formatters = string.format, string.gsub, string.formatters +local flattened = table.flattened local texset, texget = tex.set, tex.get local backends, lpdf, nodes = backends, lpdf, nodes @@ -25,10 +26,11 @@ local nodeinjections = backends.pdf.nodeinjections local codeinjections = backends.pdf.codeinjections local registrations = backends.pdf.registrations -local copy_node = node.copy +local nuts = nodes.nuts +local copy_node = nuts.copy -local nodepool = nodes.pool -local pdfliteral = nodepool.pdfliteral +local nodepool = nuts.pool +local pdfpageliteral = nodepool.pdfpageliteral local register = nodepool.register local pdfdictionary = lpdf.dictionary @@ -41,6 +43,7 @@ local pdfstring = lpdf.string local pdfflushobject = lpdf.flushobject local pdfflushstreamobject = lpdf.flushstreamobject local pdfaction = lpdf.action +local pdfminorversion = lpdf.minorversion local formattedtimestamp = lpdf.pdftimestamp local adddocumentextgstate = lpdf.adddocumentextgstate @@ -65,11 +68,13 @@ local v_landscape = variables.landscape local v_portrait = variables.portrait local v_page = variables.page local v_paper = variables.paper +local v_attachment = variables.attachment +local v_layer = variables.layer -local positive = register(pdfliteral("/GSpositive gs")) -local negative = register(pdfliteral("/GSnegative gs")) -local overprint = register(pdfliteral("/GSoverprint gs")) -local knockout = register(pdfliteral("/GSknockout gs")) +local positive = register(pdfpageliteral("/GSpositive gs")) +local negative = register(pdfpageliteral("/GSnegative gs")) +local overprint = register(pdfpageliteral("/GSoverprint gs")) +local knockout = register(pdfpageliteral("/GSknockout gs")) local function initializenegative() local a = pdfarray { 0, 1 } @@ -261,15 +266,51 @@ lpdf.registerdocumentfinalizer(flushjavascripts,"javascripts") -- -- -- -local pagespecs = { - [v_none] = { - }, +local plusspecs = { [v_max] = { mode = "FullScreen", }, [v_bookmark] = { mode = "UseOutlines", }, + [v_attachment] = { + mode = "UseAttachments", + }, + [v_layer] = { + mode = "UseOC", + }, + [v_fit] = { + fit = true, + }, + [v_doublesided] = { + layout = "TwoColumnRight", + }, + [v_fixed] = { + fixed = true, + }, + [v_landscape] = { + duplex = "DuplexFlipShortEdge", + }, + [v_portrait] = { + duplex = "DuplexFlipLongEdge", + }, + [v_page] = { + duplex = "Simplex" , + }, + [v_paper] = { + paper = true, + }, +} + +local pagespecs = { + -- + [v_max] = plusspecs[v_max], + [v_bookmark] = plusspecs[v_bookmark], + [v_attachment] = plusspecs[v_attachment], + [v_layer] = plusspecs[v_layer], + -- + [v_none] = { + }, [v_fit] = { mode = "UseNone", fit = true, @@ -322,38 +363,9 @@ local pagespecs = { }, } -local plusspecs = { - [v_max] = { - mode = "FullScreen", - }, - [v_bookmark] = { - mode = "UseOutlines", - }, - [v_fit] = { - fit = true, - }, - [v_doublesided] = { - layout = "TwoColumnRight", - }, - [v_fixed] = { - fixed = true, - }, - [v_landscape] = { - duplex = "DuplexFlipShortEdge", - }, - [v_portrait] = { - duplex = "DuplexFlipLongEdge", - }, - [v_page] = { - duplex = "Simplex" , - }, - [v_paper] = { - paper = true, - }, -} - local pagespec, topoffset, leftoffset, height, width, doublesided = "default", 0, 0, 0, 0, false local cropoffset, bleedoffset, trimoffset, artoffset = 0, 0, 0, 0 +local marked = false local copies = false function codeinjections.setupcanvas(specification) @@ -371,6 +383,7 @@ function codeinjections.setupcanvas(specification) leftoffset = specification.leftoffset or 0 height = specification.height or texget("pageheight") width = specification.width or texget("pagewidth") + marked = specification.print -- copies = specification.copies if copies and copies < 2 then @@ -429,23 +442,36 @@ local function documentspecification() if mode then addtocatalog("PageMode",pdfconstant(mode)) end - if fit or fixed or duplex or copies or paper then + local prints = nil + if marked then + local pages = structures.pages + local marked = pages.allmarked(marked) + local nofmarked = marked and #marked or 0 + if nofmarked > 0 then + -- the spec is wrong in saying that numbering starts at 1 which of course makes + -- sense as most real documents start with page 0 .. sigh + for i=1,#marked do marked[i] = marked[i] - 1 end + prints = pdfarray(flattened(pages.toranges(marked))) + end + end + if fit or fixed or duplex or copies or paper or prints then addtocatalog("ViewerPreferences",pdfdictionary { FitWindow = fit and true or nil, PrintScaling = fixed and pdfconstant("None") or nil, Duplex = duplex and pdfconstant(duplex) or nil, NumCopies = copies and copies or nil, PickTrayByPDFSize = paper and true or nil, + PrintPageRange = prints or nil, }) end addtoinfo ("Trapped", pdfconstant("False")) -- '/Trapped' in /Info, 'Trapped' in XMP - addtocatalog("Version", pdfconstant(format("1.%s",pdf.getminorversion()))) + addtocatalog("Version", pdfconstant(format("1.%s",pdfminorversion()))) end -- temp hack: the mediabox is not under our control and has a precision of 5 digits local factor = number.dimenfactors.bp -local f_value = formatters["%0.5F"] +local f_value = formatters["%0.6F"] local function boxvalue(n) -- we could share them return pdfverbose(f_value(factor * n)) diff --git a/tex/context/base/mkiv/lpdf-mov.lua b/tex/context/base/mkiv/lpdf-mov.lua index 87375e4ce..42ba6fb00 100644 --- a/tex/context/base/mkiv/lpdf-mov.lua +++ b/tex/context/base/mkiv/lpdf-mov.lua @@ -8,7 +8,8 @@ if not modules then modules = { } end modules ['lpdf-mov'] = { local format = string.format -local lpdf = lpdf +local lpdf = lpdf +local context = context local nodeinjections = backends.pdf.nodeinjections local pdfconstant = lpdf.constant @@ -44,7 +45,7 @@ function nodeinjections.insertmovie(specification) end function nodeinjections.insertsound(specification) - -- rmanaged in interaction: repeat, label, foundname + -- managed in interaction: repeat, label, foundname local soundclip = interactions.soundclips.soundclip(specification.label) if soundclip then local controldict = pdfdictionary { diff --git a/tex/context/base/mkiv/lpdf-nod.lua b/tex/context/base/mkiv/lpdf-nod.lua index 985d05a82..e3c1778f2 100644 --- a/tex/context/base/mkiv/lpdf-nod.lua +++ b/tex/context/base/mkiv/lpdf-nod.lua @@ -24,10 +24,12 @@ local new_node = nuts.new local nodepool = nuts.pool local register = nodepool.register -local pdforiginliteral = register(new_node("whatsit", whatsitcodes.pdfliteral)) setfield(pdforiginliteral,"mode",0) -- set_origin_code -local pdfpageliteral = register(new_node("whatsit", whatsitcodes.pdfliteral)) setfield(pdfpageliteral, "mode",1) -- page_code -local pdfdirectliteral = register(new_node("whatsit", whatsitcodes.pdfliteral)) setfield(pdfdirectliteral,"mode",2) -- direct_code -local pdfrawliteral = register(new_node("whatsit", whatsitcodes.pdfliteral)) setfield(pdfrawliteral, "mode",3) -- raw_code +local literalvalues = nodes.literalvalues + +local pdforiginliteral = register(new_node("whatsit", whatsitcodes.pdfliteral)) setfield(pdforiginliteral,"mode",literalvalues.origin) +local pdfpageliteral = register(new_node("whatsit", whatsitcodes.pdfliteral)) setfield(pdfpageliteral, "mode",literalvalues.page) +local pdfdirectliteral = register(new_node("whatsit", whatsitcodes.pdfliteral)) setfield(pdfdirectliteral,"mode",literalvalues.direct) +local pdfrawliteral = register(new_node("whatsit", whatsitcodes.pdfliteral)) setfield(pdfrawliteral, "mode",literalvalues.raw) local pdfsave = register(new_node("whatsit", whatsitcodes.pdfsave)) local pdfrestore = register(new_node("whatsit", whatsitcodes.pdfrestore)) @@ -37,23 +39,12 @@ local pdfsetmatrix = register(new_node("whatsit", whatsitcodes.pdfsetmatrix) local variables = interfaces.variables -local views = { -- beware, we do support the pdf keys but this is *not* official - xyz = 0, [variables.standard] = 0, - fit = 1, [variables.fit] = 1, - fith = 2, [variables.width] = 2, - fitv = 3, [variables.height] = 3, - fitb = 4, - fitbh = 5, [variables.minwidth] = 5, - fitbv = 6, [variables.minheight] = 6, - fitr = 7, -} - function nodepool.pdforiginliteral(str) local t = copy_node(pdforiginliteral) setfield(t,"data",str) return t end function nodepool.pdfpageliteral (str) local t = copy_node(pdfpageliteral ) setfield(t,"data",str) return t end function nodepool.pdfdirectliteral(str) local t = copy_node(pdfdirectliteral) setfield(t,"data",str) return t end function nodepool.pdfrawliteral (str) local t = copy_node(pdfrawliteral ) setfield(t,"data",str) return t end -nodepool.pdfliteral = nodepool.pdfpageliteral +nodepool.pdfliteral = nodepool.pdfpageliteral -- best is to use a specific one: origin | page | direct | raw function nodepool.pdfsave() return copy_node(pdfsave) @@ -138,6 +129,17 @@ end -- -- so we need to force a matrix. +-- local views = { -- beware, we do support the pdf keys but this is *not* official +-- xyz = 0, [variables.standard] = 0, +-- fit = 1, [variables.fit] = 1, +-- fith = 2, [variables.width] = 2, +-- fitv = 3, [variables.height] = 3, +-- fitb = 4, +-- fitbh = 5, [variables.minwidth] = 5, +-- fitbv = 6, [variables.minheight] = 6, +-- fitr = 7, +-- } + function nodepool.pdfdestination(w,h,d,name,view,n) report("don't use node based destinations!") os.exit() diff --git a/tex/context/base/mkiv/lpdf-ren.lua b/tex/context/base/mkiv/lpdf-ren.lua index 47075ee08..e9b22f382 100644 --- a/tex/context/base/mkiv/lpdf-ren.lua +++ b/tex/context/base/mkiv/lpdf-ren.lua @@ -9,8 +9,8 @@ if not modules then modules = { } end modules ['lpdf-ren'] = { -- rendering local tostring, tonumber, next = tostring, tonumber, next -local format, rep = string.format, string.rep local concat = table.concat +local formatters = string.formatters local settings_to_array = utilities.parsers.settings_to_array local getrandom = utilities.randomizer.get @@ -49,9 +49,12 @@ local addtocatalog = lpdf.addtocatalog local escaped = lpdf.escaped -local nodepool = nodes.pool +local nuts = nodes.nuts +local copy_node = nuts.copy + +local nodepool = nuts.pool local register = nodepool.register -local pdfliteral = nodepool.pdfliteral +local pdfpageliteral = nodepool.pdfpageliteral local pdf_ocg = pdfconstant("OCG") local pdf_ocmd = pdfconstant("OCMD") @@ -62,8 +65,6 @@ local pdf_design = pdfconstant("Design") local pdf_toggle = pdfconstant("Toggle") local pdf_setocgstate = pdfconstant("SetOCGState") -local copy_node = node.copy - local pdf_print = { [v_yes] = pdfdictionary { PrintState = pdf_on }, [v_no ] = pdfdictionary { PrintState = pdf_off }, @@ -238,33 +239,38 @@ function executers.togglelayer(arguments) return setlayer(pdf_toggle,arguments) -- injection +local f_bdc = formatters["/OC /%s BDC"] +local s_emc = "EMC" + function codeinjections.startlayer(name) -- used in mp if not name then name = "unknown" end useviewerlayer(name) - return format("/OC /%s BDC",escapednames[name]) + return f_bdc(escapednames[name]) end function codeinjections.stoplayer(name) -- used in mp - return "EMC" + return s_emc end local cache = { } +local stop = nil function nodeinjections.startlayer(name) local c = cache[name] if not c then useviewerlayer(name) - c = register(pdfliteral(format("/OC /%s BDC",escapednames[name]))) + c = register(pdfpageliteral(f_bdc(escapednames[name]))) cache[name] = c end return copy_node(c) end -local stop = register(pdfliteral("EMC")) - function nodeinjections.stoplayer() + if not stop then + stop = register(pdfpageliteral(s_emc)) + end return copy_node(stop) end @@ -280,7 +286,7 @@ function nodeinjections.startstackedlayer(s,t,first,last) r[#r+1] = startlayer(values[t[i]]) end r = concat(r," ") - return pdfliteral(r) + return pdfpageliteral(r) end function nodeinjections.stopstackedlayer(s,t,first,last) @@ -289,7 +295,7 @@ function nodeinjections.stopstackedlayer(s,t,first,last) r[#r+1] = stoplayer() end r = concat(r," ") - return pdfliteral(r) + return pdfpageliteral(r) end function nodeinjections.changestackedlayer(s,t1,first1,last1,t2,first2,last2) @@ -301,7 +307,7 @@ function nodeinjections.changestackedlayer(s,t1,first1,last1,t2,first2,last2) r[#r+1] = startlayer(values[t2[i]]) end r = concat(r," ") - return pdfliteral(r) + return pdfpageliteral(r) end -- transitions diff --git a/tex/context/base/mkiv/lpdf-res.lua b/tex/context/base/mkiv/lpdf-res.lua index ac9478488..8b00835ef 100644 --- a/tex/context/base/mkiv/lpdf-res.lua +++ b/tex/context/base/mkiv/lpdf-res.lua @@ -21,8 +21,9 @@ local saveboxresource = tex.saveboxresource local useboxresource = tex.useboxresource local getboxresource = tex.getboxresourcedimensions -function codeinjections.registerboxresource(n) - return saveboxresource(n,nil,lpdf.collectedresources(),true) -- direct, todo: accept functions as attr/resources +function codeinjections.registerboxresource(n,offset) + local r = saveboxresource(n,nil,lpdf.collectedresources(),true,0,offset or 0) -- direct, todo: accept functions as attr/resources + return r end function codeinjections.restoreboxresource(index) diff --git a/tex/context/base/mkiv/lpdf-swf.lua b/tex/context/base/mkiv/lpdf-swf.lua index e40dc6378..0ac107f8b 100644 --- a/tex/context/base/mkiv/lpdf-swf.lua +++ b/tex/context/base/mkiv/lpdf-swf.lua @@ -10,17 +10,21 @@ if not modules then modules = { } end modules ['lpdf-swf'] = { -- was using tex code. This is the official implementation. local format, gsub = string.format, string.gsub +local concat = table.concat -local backends, lpdf = backends, lpdf +local backends = backends +local lpdf = lpdf +local context = context -local pdfconstant = lpdf.constant -local pdfstring = lpdf.string -local pdfdictionary = lpdf.dictionary -local pdfarray = lpdf.array -local pdfreference = lpdf.reference -local pdfflushobject = lpdf.flushobject +local pdfconstant = lpdf.constant +local pdfstring = lpdf.string +local pdfdictionary = lpdf.dictionary +local pdfarray = lpdf.array +local pdfreference = lpdf.reference +local pdfflushobject = lpdf.flushobject +local pdfsharedobject = lpdf.shareobjectreference -local checkedkey = lpdf.checkedkey +local checkedkey = lpdf.checkedkey local codeinjections = backends.pdf.codeinjections local nodeinjections = backends.pdf.nodeinjections @@ -45,17 +49,18 @@ table.setmetatableindex(activations, function() return activations .click end) table.setmetatableindex(deactivations,function() return deactivations.focus end) local function insertswf(spec) - local width = spec.width local height = spec.height local filename = spec.foundname local resources = spec.resources local display = spec.display local controls = spec.controls + local arguments = spec.arguments local resources = resources and parametersets[resources] local display = display and parametersets[display] - local controls = controls and parametersets[controls] -- not yet used + local controls = controls and parametersets[controls] -- not yet used + local arguments = arguments and parametersets[arguments] -- not yet used local preview = checkedkey(display,"preview","string") local toolbar = checkedkey(display,"toolbar","boolean") @@ -63,13 +68,16 @@ local function insertswf(spec) local embeddedreference = codeinjections.embedfile { file = filename } local flash = pdfdictionary { - Subtype = pdfconstant("Flash"), + Subtype = pdfconstant("RichMediaConfiguration"), Instances = pdfarray { pdfdictionary { - Asset = embeddedreference, - Params = pdfdictionary { - Binding = pdfconstant("Background") -- Foreground makes swf behave erratic - } + Type = pdfconstant("RichMediaInstance"), + Asset = embeddedreference, + Subtype = pdfconstant("Flash"), -- 3D Sound Video ... somehow still Flash too + Params = pdfsharedobject(pdfdictionary { + Binding = pdfconstant("Background"), -- Foreground makes swf behave erratic + FlashVars = arguments and pdfstring(table.sequenced(arguments,"&")) or nil, + }), }, }, } @@ -98,7 +106,6 @@ local function insertswf(spec) local root = file.dirname(filename) local relativepaths = nil local paths = nil - if resources then local names = configuration.Assets.Names local prefix = false @@ -190,7 +197,8 @@ local function insertswf(spec) Playcount = 1, }, Presentation = pdfdictionary { - PassContextClick = false, + -- PassContextClick = false, + PassContextClick = true, Style = pdfconstant("Embedded"), Toolbar = toolbar, NavigationPane = false, @@ -294,6 +302,7 @@ function backends.pdf.nodeinjections.insertswf(spec) display = spec.display, controls = spec.controls, resources = spec.resources, + arguments = spec.arguments, -- factor = spec.factor, -- label = spec.label, } diff --git a/tex/context/base/mkiv/lpdf-tag.lua b/tex/context/base/mkiv/lpdf-tag.lua index e33c8a811..f4ecfc8a6 100644 --- a/tex/context/base/mkiv/lpdf-tag.lua +++ b/tex/context/base/mkiv/lpdf-tag.lua @@ -55,7 +55,8 @@ local tonut = nuts.tonut local tonode = nuts.tonode local nodepool = nuts.pool -local pdfliteral = nodepool.pdfliteral +local pdfpageliteral = nodepool.pdfpageliteral +local register = nodepool.register local getid = nuts.getid local getattr = nuts.getattr @@ -63,14 +64,12 @@ local getprev = nuts.getprev local getnext = nuts.getnext local getlist = nuts.getlist -local setfield = nuts.setfield local setlink = nuts.setlink local setlist = nuts.setlist +local copy_node = nuts.copy local traverse_nodes = nuts.traverse local tosequence = nuts.tosequence -local insert_before = nuts.insert_before -local insert_after = nuts.insert_after local structure_stack = { } local structure_kids = pdfarray() @@ -150,13 +149,15 @@ local function finishstructure() pdfflushobject(structure_ref,structuretree) addtocatalog("StructTreeRoot",pdfreference(structure_ref)) -- - local markinfo = pdfdictionary { - Marked = pdfboolean(true), - -- UserProperties = pdfboolean(true), - -- Suspects = pdfboolean(true), - -- AF = #embeddedfilelist > 0 and pdfreference(pdfflushobject(embeddedfilelist)) or nil, - } - addtocatalog("MarkInfo",pdfreference(pdfflushobject(markinfo))) + if lpdf.majorversion() == 1 then + local markinfo = pdfdictionary { + Marked = pdfboolean(true) or nil, + -- UserProperties = pdfboolean(true), -- maybe some day + -- Suspects = pdfboolean(true) or nil, + -- AF = #embeddedfilelist > 0 and pdfreference(pdfflushobject(embeddedfilelist)) or nil, + } + addtocatalog("MarkInfo",pdfreference(pdfflushobject(markinfo))) + end -- for fulltag, element in sortedhash(elements) do -- sorting is easier on comparing pdf pdfflushobject(element.knum,element.kids) @@ -312,8 +313,14 @@ end -- no need to adapt head, as we always operate on lists +local EMCliteral = nil + function nodeinjections.addtags(head) + if not EMCliteral then + EMCliteral = register(pdfpageliteral("EMC")) + end + local last = nil local ranges = { } local range = nil @@ -321,8 +328,9 @@ function nodeinjections.addtags(head) local function collectranges(head,list) for n in traverse_nodes(head) do - local id = getid(n) -- 14: image, 8: literal (mp) + local id = getid(n) if id == glyph_code then + -- maybe also disc local at = getattr(n,a_tagged) if not at then range = nil @@ -344,8 +352,7 @@ function nodeinjections.addtags(head) end last = nil else - local nl = getlist(n) - collectranges(nl,n) + collectranges(getlist(n),n) end end end @@ -383,7 +390,6 @@ function nodeinjections.addtags(head) local taglist = specification.taglist local noftags = #taglist local common = 0 - if top then for i=1,noftags >= noftop and noftop or noftags do if top[i] == taglist[i] then @@ -412,12 +418,12 @@ function nodeinjections.addtags(head) prev = prv end end - if prev then - literal = pdfliteral(makecontent(prev,id,specification)) + literal = pdfpageliteral(makecontent(prev,id,specification)) elseif ignore then - literal = pdfliteral(makeignore(specification)) + literal = pdfpageliteral(makeignore(specification)) end + if literal then local prev = getprev(start) if prev then @@ -427,14 +433,27 @@ function nodeinjections.addtags(head) if list and getlist(list) == start then setlist(list,literal) end + local literal = copy_node(EMCliteral) -- use insert instead: - local literal = pdfliteral("EMC") local next = getnext(stop) if next then setlink(literal,next) end setlink(stop,literal) end + +-- if literal then +-- if list and getlist(list) == start then +-- setlink(literal,start) +-- setlist(list,literal) +-- else +-- setlink(getprev(start),literal,start) +-- end +-- -- use insert instead: +-- local literal = copy_node(EMCliteral) +-- setlink(stop,literal,getnext(stop)) +-- end + top = taglist noftop = noftags end @@ -558,9 +577,9 @@ end -- end -- -- if r > 0 then --- local literal = pdfliteral(concat(result,"\n")) +-- local literal = pdfpageliteral(concat(result,"\n")) -- -- use insert instead: --- local literal = pdfliteral(result) +-- local literal = pdfpageliteral(result) -- local prev = getprev(start) -- if prev then -- setlink(prev,literal) @@ -582,7 +601,7 @@ end -- for i=1,noftop do -- result[i] = "EMC" -- end --- local literal = pdfliteral(concat(result,"\n")) +-- local literal = pdfpageliteral(concat(result,"\n")) -- -- use insert instead: -- local next = getnext(last) -- if next then diff --git a/tex/context/base/mkiv/lpdf-u3d.lua b/tex/context/base/mkiv/lpdf-u3d.lua index c9f4a0369..dfd4c1b06 100644 --- a/tex/context/base/mkiv/lpdf-u3d.lua +++ b/tex/context/base/mkiv/lpdf-u3d.lua @@ -461,7 +461,7 @@ local function insert3d(spec) -- width, height, factor, display, controls, label }, ProcSet = pdfarray { pdfconstant("PDF"), pdfconstant("ImageC") }, } - local pwd = pdfflushstreamobject(formatters["q /GS gs %F 0 0 %F 0 0 cm /IM Do Q"](factor*width,factor*height),pw) + local pwd = pdfflushstreamobject(formatters["q /GS gs %.6F 0 0 %.6F 0 0 cm /IM Do Q"](factor*width,factor*height),pw) annot.AP = pdfdictionary { N = pdfreference(pwd) } diff --git a/tex/context/base/mkiv/lpdf-wid.lua b/tex/context/base/mkiv/lpdf-wid.lua index fceae49cb..03febbf01 100644 --- a/tex/context/base/mkiv/lpdf-wid.lua +++ b/tex/context/base/mkiv/lpdf-wid.lua @@ -6,7 +6,26 @@ if not modules then modules = { } end modules ['lpdf-wid'] = { license = "see context related readme files" } -local gmatch, gsub, find, lower, format = string.gmatch, string.gsub, string.find, string.lower, string.format +-- It's about time to give up on media in pdf and admit that pdf lost it to html. +-- First we had movies and sound, quite easy to deal with, but obsolete now. Then we +-- had renditions but they turned out to be unreliable from the start and look +-- obsolete too or at least they are bound to the (obsolete) flash technology for +-- rendering. They were already complex constructs. Now we have rich media which +-- instead of providing a robust future proof framework fo rgeneral media types +-- again seems to depend on viewers built in (yes, also kind of obsolete) flash +-- technology, and we cannot expect this non-open technology to show up in open +-- browsers. So, in the end we can best just use links to external resources to be +-- future proof. Just look at the viewer prferences pane to see how fragile support +-- is. Interestingly u3d support is kind of built in, while e.g. mp4 support relies +-- on wrapping in swf. We used to stay ahead of the pack with support of the fancy +-- pdf features but it backfires and is not worth the trouble. And yes, for control +-- (even simple like starting and stopping videos) one has to revert to JavaScript, +-- the other fragile bit. And, now that adobe quits flash in 2020 we're without any +-- video anyway. Also, it won't play on all platforms and devices so let's wait for +-- html5 media in pdf then. + +local tonumber, next = tonumber, next +local gmatch, gsub, find, lower = string.gmatch, string.gsub, string.find, string.lower local stripstring = string.strip local settings_to_array = utilities.parsers.settings_to_array local settings_to_hash = utilities.parsers.settings_to_hash @@ -137,8 +156,8 @@ comment_symbols.Default = Note local function analyzesymbol(symbol,collection) if not symbol or symbol == "" then - return collection.Default, nil - elseif collection[symbol] then + return collection and collection.Default, nil + elseif collection and collection[symbol] then return collection[symbol], nil else local setn, setr, setd @@ -160,6 +179,17 @@ local function analyzesymbol(symbol,collection) end end +local function analyzenormalsymbol(symbol) + local appearance = pdfdictionary { + N = registeredsymbol(symbol), + } + local appearanceref = pdfshareobjectreference(appearance) + return appearanceref +end + +codeinjections.analyzesymbol = analyzesymbol +codeinjections.analyzenormalsymbol = analyzenormalsymbol + local function analyzelayer(layer) -- todo: (specification.layer ~= "" and pdfreference(specification.layer)) or nil, -- todo: ref to layer end @@ -289,7 +319,8 @@ function codeinjections.embedfile(specification) local d = pdfdictionary { Type = pdfconstant("Filespec"), F = pdfstring(savename), - UF = pdfstring(savename), + -- UF = pdfstring(savename), + UF = pdfunicode(savename), EF = pdfdictionary { F = pdfreference(f) }, Desc = title ~= "" and pdfunicode(title) or nil, -- AFRelationship = pdfconstant("Source"), -- some day maybe, not mandate @@ -363,7 +394,7 @@ function nodeinjections.attachfile(specification) FS = aref, Contents = pdfunicode(title), Name = name, - NM = pdfstring(format("attachment:%s",nofattachments)), + NM = pdfstring("attachment:"..nofattachments), T = author ~= "" and pdfunicode(author) or nil, Subj = subtitle ~= "" and pdfunicode(subtitle) or nil, C = analyzecolor(specification.colorvalue,specification.colormodel), @@ -371,9 +402,13 @@ function nodeinjections.attachfile(specification) AP = appearance, OC = analyzelayer(specification.layer), } - local width, height, depth = specification.width or 0, specification.height or 0, specification.depth - local box = hpack_node(nodeinjections.annotation(width,height,depth,d())) - box.width, box.height, box.depth = width, height, depth + local width = specification.width or 0 + local height = specification.height or 0 + local depth = specification.depth or 0 + local box = hpack_node(nodeinjections.annotation(width,height,depth,d())) + box.width = width + box.height = height + box.depth = depth return box end end @@ -452,10 +487,12 @@ function nodeinjections.comment(specification) -- brrr: seems to be done twice CA = analyzetransparency(specification.transparencyvalue), OC = analyzelayer(specification.layer), Name = name, - NM = pdfstring(format("comment:%s",nofcomments)), + NM = pdfstring("comment:"..nofcomments), AP = appearance, } - local width, height, depth = specification.width or 0, specification.height or 0, specification.depth + local width = specification.width or 0 + local height = specification.height or 0 + local depth = specification.depth or 0 local box if usepopupcomments then -- rather useless as we can hide/vide @@ -473,7 +510,9 @@ function nodeinjections.comment(specification) -- brrr: seems to be done twice else box = hpack_node(nodeinjections.annotation(width,height,depth,d())) end - box.width, box.height, box.depth = width, height, depth -- redundant + box.width = width -- redundant + box.height = height -- redundant + box.depth = depth -- redundant return box end diff --git a/tex/context/base/mkiv/lpdf-xmp.lua b/tex/context/base/mkiv/lpdf-xmp.lua index 6153b198f..2eb573acb 100644 --- a/tex/context/base/mkiv/lpdf-xmp.lua +++ b/tex/context/base/mkiv/lpdf-xmp.lua @@ -98,6 +98,10 @@ pdf.setsuppressoptionalinfo( local included = backends.included +local pdfsettrailerid = pdf.settrailerid + +pdf.disablecommand("settrailerid") + function lpdf.settrailerid(v) if v then local b = toboolean(v) or v == "" @@ -112,7 +116,7 @@ function lpdf.settrailerid(v) else report_info("using hashed trailer id %a (%a)",v,h) end - pdf.settrailerid(format("[<%s> <%s>]",h,h)) + pdfsettrailerid(format("[<%s> <%s>]",h,h)) end end @@ -241,6 +245,8 @@ end -- flushing +local add_xmp_blob = true directives.register("backend.xmp",function(v) add_xmp_blob = v end) + local function flushxmpinfo() commands.pushrandomseed() commands.setrandomseed(os.time()) @@ -250,7 +256,8 @@ local function flushxmpinfo() local documentid = "no unique document id here" local instanceid = "no unique instance id here" - local producer = format("LuaTeX-%i.%i.%s",math.div(version,100),math.mod(version,100),revision) + -- local producer = format("LuaTeX-%i.%02i.%s",math.div(version,100),math.mod(version,100),revision) + local producer = format("LuaTeX-%0.2f.%s",version/100,revision) local creator = "LuaTeX + ConTeXt MkIV" local time = lpdf.timestamp() local fullbanner = status.banner @@ -260,42 +267,45 @@ local function flushxmpinfo() instanceid = "uuid:" .. os.uuid() end - pdfaddxmpinfo("DocumentID", documentid) - pdfaddxmpinfo("InstanceID", instanceid) - pdfaddxmpinfo("Producer", producer) - pdfaddxmpinfo("CreatorTool", creator) - pdfaddxmpinfo("CreateDate", time) - pdfaddxmpinfo("ModifyDate", time) - pdfaddxmpinfo("MetadataDate", time) - pdfaddxmpinfo("PTEX.Fullbanner", fullbanner) - pdfaddtoinfo("Producer", producer) pdfaddtoinfo("Creator", creator) pdfaddtoinfo("CreationDate", time) pdfaddtoinfo("ModDate", time) -- pdfaddtoinfo("PTEX.Fullbanner", fullbanner) -- no checking done on existence - local blob = xml.tostring(xml.first(xmp or valid_xmp(),"/x:xmpmeta")) - local md = pdfdictionary { - Subtype = pdfconstant("XML"), - Type = pdfconstant("Metadata"), - } - if trace_xmp then - report_xmp("data flushed, see log file") - logs.pushtarget("logfile") - report_xmp("start xmp blob") - logs.newline() - logs.writer(blob) - logs.newline() - report_xmp("stop xmp blob") - logs.poptarget() - end - blob = format(xpacket,blob) - if not verbose and pdf.getcompresslevel() > 0 then - blob = gsub(blob,">%s+<","><") + if add_xmp_blob then + + pdfaddxmpinfo("DocumentID", documentid) + pdfaddxmpinfo("InstanceID", instanceid) + pdfaddxmpinfo("Producer", producer) + pdfaddxmpinfo("CreatorTool", creator) + pdfaddxmpinfo("CreateDate", time) + pdfaddxmpinfo("ModifyDate", time) + pdfaddxmpinfo("MetadataDate", time) + pdfaddxmpinfo("PTEX.Fullbanner", fullbanner) + + local blob = xml.tostring(xml.first(xmp or valid_xmp(),"/x:xmpmeta")) + local md = pdfdictionary { + Subtype = pdfconstant("XML"), + Type = pdfconstant("Metadata"), + } + if trace_xmp then + report_xmp("data flushed, see log file") + logs.pushtarget("logfile") + report_xmp("start xmp blob") + logs.newline() + logs.writer(blob) + logs.newline() + report_xmp("stop xmp blob") + logs.poptarget() + end + blob = format(xpacket,blob) + if not verbose and lpdf.compresslevel() > 0 then + blob = gsub(blob,">%s+<","><") + end + local r = pdfflushstreamobject(blob,md,false) -- uncompressed + lpdf.addtocatalog("Metadata",pdfreference(r)) end - local r = pdfflushstreamobject(blob,md,false) -- uncompressed - lpdf.addtocatalog("Metadata",pdfreference(r)) commands.poprandomseed() -- hack end diff --git a/tex/context/base/mkiv/luat-bas.mkiv b/tex/context/base/mkiv/luat-bas.mkiv index cb00d8f55..b1af4da3e 100644 --- a/tex/context/base/mkiv/luat-bas.mkiv +++ b/tex/context/base/mkiv/luat-bas.mkiv @@ -13,35 +13,38 @@ \writestatus{loading}{ConTeXt Lua Macros / Basic Lua Libraries} -\registerctxluafile{l-lua} {1.001} % before sandbox -\registerctxluafile{l-sandbox} {1.001} -\registerctxluafile{l-package} {1.001} -\registerctxluafile{l-lpeg} {1.001} -\registerctxluafile{l-function}{1.001} -\registerctxluafile{l-string} {1.001} -\registerctxluafile{l-table} {1.001} -\registerctxluafile{l-boolean} {1.001} -\registerctxluafile{l-number} {1.001} -\registerctxluafile{l-math} {1.001} -%registerctxluafile{l-aux} {1.001} -\registerctxluafile{l-io} {1.001} -\registerctxluafile{l-os} {1.001} -\registerctxluafile{l-file} {1.001} -\registerctxluafile{l-gzip} {1.001} -\registerctxluafile{l-md5} {1.001} -\registerctxluafile{l-dir} {1.001} -\registerctxluafile{l-unicode} {1.001} -%registerctxluafile{l-utils} {1.001} -\registerctxluafile{l-url} {1.001} -\registerctxluafile{l-set} {1.001} +\registerctxluafile{l-lua} {} % before sandbox +\registerctxluafile{l-macro} {} +\registerctxluafile{l-sandbox} {} +\registerctxluafile{l-package} {} +\registerctxluafile{l-lpeg} {} +\registerctxluafile{l-function}{} +\registerctxluafile{l-string} {} +\registerctxluafile{l-table} {} +\registerctxluafile{l-boolean} {} +\registerctxluafile{l-number} {} +\registerctxluafile{l-math} {} +%registerctxluafile{l-aux} {} +\registerctxluafile{l-io} {} +\registerctxluafile{l-os} {} +\registerctxluafile{l-file} {} +\registerctxluafile{l-gzip} {} +\registerctxluafile{l-md5} {} +\registerctxluafile{l-dir} {} +\registerctxluafile{l-unicode} {optimize} +%registerctxluafile{l-utils} {} +\registerctxluafile{l-url} {} +\registerctxluafile{l-set} {} -% \registerctxluafile{socket.lua}{} -% \registerctxluafile{ltn12.lua} {} -% \registerctxluafile{mime.lua} {} -% \registerctxluafile{http.lua} {} -% \registerctxluafile{url.lua} {} -% \registerctxluafile{tp.lua} {} -% \registerctxluafile{ftp.lua} {} -% %registerctxluafile{smtp.lua} {} +\registerctxluafile{l-macro-imp-optimize}{} + +% \registerctxluafile{socket}{} +% \registerctxluafile{ltn12} {} +% \registerctxluafile{mime} {} +% \registerctxluafile{http} {} +% \registerctxluafile{url} {} +% \registerctxluafile{tp} {} +% \registerctxluafile{ftp} {} +% %registerctxluafile{smtp} {} \endinput diff --git a/tex/context/base/mkiv/luat-cnf.lua b/tex/context/base/mkiv/luat-cnf.lua index 4f2c6569e..b6ee15083 100644 --- a/tex/context/base/mkiv/luat-cnf.lua +++ b/tex/context/base/mkiv/luat-cnf.lua @@ -19,7 +19,7 @@ texconfig.shell_escape = 't' luatex = luatex or { } local luatex = luatex -texconfig.error_line = 79 -- frozen +texconfig.error_line = 79 -- frozen / large values can crash texconfig.expand_depth = 10000 texconfig.half_error_line = 50 -- frozen texconfig.hash_extra = 100000 @@ -67,7 +67,7 @@ function texconfig.init() "gzip", "zip", "zlib", "lfs", "ltn12", "mime", "socket", "md5", "fio", "unicode", "utf", }, extratex = { - "epdf", "fontloader", "kpse", "mplib", + "epdf", "kpse", "mplib", -- "fontloader", }, obsolete = { "fontloader", -- can be filled by luat-log @@ -119,16 +119,21 @@ function texconfig.init() -- shortcut and helper - local bytecode = lua.bytecode + local setbytecode = lua.setbytecode + local getbytecode = lua.getbytecode local function init(start) local i = start local t = os.clock() - while bytecode[i] do - bytecode[i]() ; - bytecode[i] = nil ; - i = i + 1 - -- collectgarbage('step') + while true do + local b = getbytecode(i) + if b then + b() ; + setbytecode(i,nil) ; + i = i + 1 + else + break + end end return i - start, os.clock() - t end diff --git a/tex/context/base/mkiv/luat-cod.lua b/tex/context/base/mkiv/luat-cod.lua index 31860db78..91bb7c2e1 100644 --- a/tex/context/base/mkiv/luat-cod.lua +++ b/tex/context/base/mkiv/luat-cod.lua @@ -7,27 +7,39 @@ if not modules then modules = { } end modules ['luat-cod'] = { } local type, loadfile, tonumber = type, loadfile, tonumber -local match, gsub, find, format = string.match, string.gsub, string.find, string.format +local match, gsub, find, format, gmatch = string.match, string.gsub, string.find, string.format, string.gmatch local texconfig, lua = texconfig, lua -- some basic housekeeping -texconfig.kpse_init = false -texconfig.shell_escape = 't' -texconfig.max_print_line = 100000 -texconfig.max_in_open = 1000 +texconfig.kpse_init = false +texconfig.shell_escape = 't' + +texconfig.error_line = 79 -- frozen / large values can crash +texconfig.expand_depth = 10000 +texconfig.half_error_line = 50 -- frozen +texconfig.max_in_open = 1000 +texconfig.max_print_line = 100000 +texconfig.max_strings = 500000 +texconfig.nest_size = 1000 +texconfig.param_size = 25000 +texconfig.save_size = 100000 +texconfig.stack_size = 10000 -- registering bytecode chunks -local bytecode = lua.bytecode or { } +----- bytecode = lua.bytecode or { } -- we use functions local bytedata = lua.bytedata or { } local bytedone = lua.bytedone or { } -lua.bytecode = bytecode -- built in anyway +---.bytecode = bytecode lua.bytedata = bytedata lua.bytedone = bytedone +local setbytecode = lua.setbytecode +local getbytecode = lua.getbytecode + lua.firstbytecode = 501 lua.lastbytecode = lua.lastbytecode or (lua.firstbytecode - 1) -- as we load ourselves again ... maybe return earlier @@ -35,24 +47,30 @@ function lua.registeredcodes() return lua.lastbytecode - lua.firstbytecode + 1 end --- no file.* functions yet +-- no file.* and utilities.parsers.* functions yet -function lua.registercode(filename,version) +function lua.registercode(filename,options) local barename = gsub(filename,"%.[%a%d]+$","") if barename == filename then filename = filename .. ".lua" end local basename = match(barename,"^.+[/\\](.-)$") or barename if not bytedone[basename] then - local code = environment.luafilechunk(filename) + local opts = { } + if type(options) == "string" and options ~= "" then + for s in gmatch(options,"([a-z]+)") do + opts[s] = true + end + end + local code = environment.luafilechunk(filename,false,opts.optimize) if code then bytedone[basename] = true if environment.initex then local n = lua.lastbytecode + 1 - bytedata[n] = { barename, version or "0.000" } - bytecode[n] = code + bytedata[n] = { name = barename, options = opts } + setbytecode(n,code) lua.lastbytecode = n end elseif environment.initex then - texio.write_nl("\nerror loading file: " .. filename .. " (aborting)") + texio.write_nl(format("\nerror loading file: %s (aborting)",filename)) os.exit() end end @@ -96,29 +114,39 @@ local targetpath = "." -- environment.jobname = tex.jobname -- environment.version = tostring(tex.toks.contextversiontoks) +-- traditionally the revision has been a one character string and only +-- pdftex went beyond "9" but anyway we test for it + +if LUATEXENGINE == nil then + LUATEXENGINE = status.luatex_engine and string.lower(status.luatex_engine) + or (find(status.banner,"LuajitTeX",1,true) and "luajittex" or "luatex") +end + if LUATEXVERION == nil then + LUATEXVERSION = status.luatex_revision LUATEXVERSION = status.luatex_version/100 - + tonumber(status.luatex_revision)/1000 + -- + tonumber(LUATEXVERSION)/1000 + + (tonumber(LUATEXVERSION) or (string.byte(LUATEXVERSION)-string.byte("a")+10))/1000 end -if LUATEXENGINE == nil then - LUATEXENGINE = status.luatex_engine and string.lower(status.luatex_engine) - or (find(status.banner,"LuajitTeX") and "luajittex" or "luatex") +if LUATEXFUNCTIONALITY == nil then + LUATEXFUNCTIONALITY = status.development_id or 6346 end if JITSUPPORTED == nil then - JITSUPPORTED = LUATEXENGINE == "luajittex" or jit + JITSUPPORTED = LUATEXENGINE == "luajittex" or jit end if INITEXMODE == nil then - INITEXMODE = status.ini_version + INITEXMODE = status.ini_version end -environment.initex = INITEXMODE -environment.initexmode = INITEXMODE -environment.luatexversion = LUATEXVERSION -environment.luatexengine = LUATEXENGINE -environment.jitsupported = JITSUPPORTED +environment.luatexengine = LUATEXENGINE +environment.luatexversion = LUATEXVERSION +environment.luatexfuncitonality = LUATEXFUNCTIONALITY +environment.jitsupported = JITSUPPORTED +environment.initex = INITEXMODE +environment.initexmode = INITEXMODE if not environment.luafilechunk then diff --git a/tex/context/base/mkiv/luat-cod.mkiv b/tex/context/base/mkiv/luat-cod.mkiv index 9ce6161c3..823b918c3 100644 --- a/tex/context/base/mkiv/luat-cod.mkiv +++ b/tex/context/base/mkiv/luat-cod.mkiv @@ -67,12 +67,12 @@ %D Reporting the version of \LUA\ that we use is done as follows: -\edef\luaversion{\ctxwrite{_VERSION}} +\def\luaversion{\ctxwrite{LUAVERSION}} \def\registerctxluafile#1#2{\ctxlua{lua.registercode("#1","#2")}} \def\ctxloadluafile #1{\ctxlua{lua.registercode("#1")}} -\registerctxluafile{luat-cod}{1.001} +\registerctxluafile{luat-cod}{} % \everydump\expandafter{\the\everydump\ctxlua{lua.finalize()}} diff --git a/tex/context/base/mkiv/luat-env.lua b/tex/context/base/mkiv/luat-env.lua index 5f2a0d281..5b46b4036 100644 --- a/tex/context/base/mkiv/luat-env.lua +++ b/tex/context/base/mkiv/luat-env.lua @@ -97,24 +97,16 @@ local function strippable(filename) end end -function environment.luafilechunk(filename,silent) -- used for loading lua bytecode in the format +function environment.luafilechunk(filename,silent,macros) -- used for loading lua bytecode in the format filename = file.replacesuffix(filename, "lua") local fullname = environment.luafile(filename) if fullname and fullname ~= "" then - local data = luautilities.loadedluacode(fullname,strippable,filename) -- can be overloaded --- if trace_locating then --- report_lua("loading file %a %s",fullname,not data and "failed" or "succeeded") --- elseif not silent then --- texio.write("<",data and "+ " or "- ",fullname,">") --- end + local data = luautilities.loadedluacode(fullname,strippable,filename,macros) if not silent then report_lua("loading file %a %s",fullname,not data and "failed" or "succeeded") end return data else --- if trace_locating then --- report_lua("unknown file %a",filename) --- end if not silent then report_lua("unknown file %a",filename) end diff --git a/tex/context/base/mkiv/luat-fio.lua b/tex/context/base/mkiv/luat-fio.lua index 302d17a66..806caefe6 100644 --- a/tex/context/base/mkiv/luat-fio.lua +++ b/tex/context/base/mkiv/luat-fio.lua @@ -15,12 +15,10 @@ texconfig.shell_escape = 't' texconfig.max_print_line = 100000 texconfig.max_in_open = 1000 -if not resolvers.instance then +if not resolvers.initialized() then resolvers.reset() - resolvers.instance.validfile = resolvers.validctxfile - -- we now load the file database as we might need files other than -- tex and lua file on the given path @@ -86,7 +84,7 @@ if not resolvers.instance then register('find_opentype_file' , function(name) return findbinfile(name,"otf") end, true) register('find_output_file' , function(name) return name end, true) register('find_pk_file' , findpk, true) - register('find_sfd_file' , function(name) return findbinfile(name,"sfd") end, true) + -- register('find_sfd_file' , function(name) return findbinfile(name,"sfd") end, true) register('find_truetype_file' , function(name) return findbinfile(name,"ttf") end, true) register('find_type1_file' , function(name) return findbinfile(name,"pfb") end, true) register('find_vf_file' , function(name) return findbinfile(name,"vf") end, true) @@ -100,7 +98,7 @@ if not resolvers.instance then register('read_map_file' , function(file) return loadbinfile(file,"map") end, true) -- output register('read_pk_file' , function(file) return loadbinfile(file,"pk") end, true) -- 600dpi/manfnt.720pk - register('read_sfd_file' , function(file) return loadbinfile(file,"sfd") end, true) + -- register('read_sfd_file' , function(file) return loadbinfile(file,"sfd") end, true) register('read_vf_file' , function(file) return loadbinfile(file,"vf" ) end, true) -- register('find_font_file' , function(name) return findbinfile(name,"ofm") end, true) @@ -128,7 +126,7 @@ statistics.register("resource resolver", function() scandata.n, scandata.time, scandata.shared, - #resolvers.instance.foundintrees, + #resolvers.foundintrees(), #scandata.paths > 0 and concat(scandata.paths," ") or "<none>" ) end) diff --git a/tex/context/base/mkiv/luat-fmt.lua b/tex/context/base/mkiv/luat-fmt.lua index f61c659fa..30c55eecc 100644 --- a/tex/context/base/mkiv/luat-fmt.lua +++ b/tex/context/base/mkiv/luat-fmt.lua @@ -39,6 +39,9 @@ local function secondaryflags() if arguments.silent then flags[#flags+1] = "--c:silent" end + if arguments.errors then + flags[#flags+1] = "--c:errors" + end if arguments.jit then flags[#flags+1] = "--c:jiton" end @@ -82,6 +85,7 @@ local runners = { function environment.make_format(name,arguments) local engine = environment.ownmain or "luatex" local silent = environment.arguments.silent + local errors = environment.arguments.errors -- change to format path (early as we need expanded paths) local olddir = dir.current() local path = caches.getwritablepath("formats",engine) or "" -- maybe platform diff --git a/tex/context/base/mkiv/luat-ini.lua b/tex/context/base/mkiv/luat-ini.lua index 3ea8551c8..de7254922 100644 --- a/tex/context/base/mkiv/luat-ini.lua +++ b/tex/context/base/mkiv/luat-ini.lua @@ -16,10 +16,10 @@ userdata = userdata or { } -- for users (e.g. functions etc) thirddata = thirddata or { } -- only for third party modules moduledata = moduledata or { } -- only for development team documentdata = documentdata or { } -- for users (e.g. raw data) -parametersets = parametersets or { } -- experimental for team +parametersets = parametersets or { } -- for special purposes -table.setmetatableindex(moduledata,table.autokey) -table.setmetatableindex(thirddata, table.autokey) +table.setmetatableindex(moduledata,"table") +table.setmetatableindex(thirddata, "table") if not global then global = _G @@ -29,8 +29,12 @@ LUATEXVERSION = status.luatex_version/100 + tonumber(status.luatex_revision)/1000 LUATEXENGINE = status.luatex_engine and string.lower(status.luatex_engine) - or (string.find(status.banner,"LuajitTeX") and "luajittex" or "luatex") + or (string.find(status.banner,"LuajitTeX",1,true) and "luajittex" or "luatex") JITSUPPORTED = LUATEXENGINE == "luajittex" or jit INITEXMODE = status.ini_version + +function os.setlocale() + -- no need for a message +end diff --git a/tex/context/base/mkiv/luat-ini.mkiv b/tex/context/base/mkiv/luat-ini.mkiv index e19b72d14..25ad7e139 100644 --- a/tex/context/base/mkiv/luat-ini.mkiv +++ b/tex/context/base/mkiv/luat-ini.mkiv @@ -98,8 +98,8 @@ {\setcatcodetable\luacatcodes \the\everyluacode} -\edef\luamajorversion{\ctxwrite{_MINORVERSION}} -\edef\luaminorversion{\ctxwrite{_MAJORVERSION}} +\edef\luamajorversion{\ctxwrite{LUAMINORVERSION}} +\edef\luaminorversion{\ctxwrite{LUAMAJORVERSION}} %D We need a way to pass strings safely to \LUA\ without the %D need for tricky escaping. Compare: diff --git a/tex/context/base/mkiv/luat-lib.mkiv b/tex/context/base/mkiv/luat-lib.mkiv index c75b9c6b1..0df31a4e5 100644 --- a/tex/context/base/mkiv/luat-lib.mkiv +++ b/tex/context/base/mkiv/luat-lib.mkiv @@ -13,80 +13,80 @@ \writestatus{loading}{ConTeXt Lua Macros / Libraries} -\registerctxluafile{util-str}{1.001} -\registerctxluafile{util-tab}{1.001} -\registerctxluafile{util-fil}{1.001} -\registerctxluafile{util-sac}{1.001} -\registerctxluafile{util-sto}{1.001} % could also be done in trac-deb.mkiv -\registerctxluafile{util-pck}{1.001} -\registerctxluafile{util-seq}{1.001} -%registerctxluafile{util-mrg}{1.001} % not needed in context itself, only mtxrun -%registerctxluafile{util-lua}{1.001} % moved -\registerctxluafile{util-prs}{1.001} -\registerctxluafile{util-fmt}{1.001} -\registerctxluafile{util-dim}{1.001} +\registerctxluafile{util-str}{} +\registerctxluafile{util-tab}{} +\registerctxluafile{util-fil}{optimize} +\registerctxluafile{util-sac}{optimize} +\registerctxluafile{util-sto}{} % could also be done in trac-deb.mkiv +\registerctxluafile{util-pck}{} +\registerctxluafile{util-seq}{} +%registerctxluafile{util-mrg}{} % not needed in context itself, only mtxrun +%registerctxluafile{util-lua}{} % moved +\registerctxluafile{util-prs}{} +\registerctxluafile{util-fmt}{} +\registerctxluafile{util-dim}{} -%registerctxluafile{trac-inf}{1.001} -\registerctxluafile{trac-set}{1.001} -\registerctxluafile{trac-log}{1.001} -\registerctxluafile{trac-inf}{1.001} -%registerctxluafile{trac-pro}{1.001} -\registerctxluafile{util-lua}{1.001} -\registerctxluafile{util-deb}{1.001} % could also be done in trac-deb.mkiv +%registerctxluafile{trac-inf}{} +\registerctxluafile{trac-set}{} +\registerctxluafile{trac-log}{} +\registerctxluafile{trac-inf}{} +%registerctxluafile{trac-pro}{} +\registerctxluafile{util-lua}{} +\registerctxluafile{util-deb}{} % could also be done in trac-deb.mkiv -\registerctxluafile{util-tpl}{1.001} % needs tracker +\registerctxluafile{util-tpl}{} % needs tracker -\registerctxluafile{util-sta}{1.001} +\registerctxluafile{util-sta}{} -\registerctxluafile{util-sbx}{1.001} % needs tracker and templates +\registerctxluafile{util-sbx}{} % needs tracker and templates -\registerctxluafile{data-ini}{1.001} -\registerctxluafile{data-exp}{1.001} -\registerctxluafile{data-env}{1.001} -\registerctxluafile{data-tmp}{1.001} -\registerctxluafile{data-met}{1.001} -\registerctxluafile{data-res}{1.001} -\registerctxluafile{data-inp}{1.001} -\registerctxluafile{data-out}{1.001} -\registerctxluafile{data-fil}{1.001} +\registerctxluafile{data-ini}{} +\registerctxluafile{data-exp}{} +\registerctxluafile{data-env}{} +\registerctxluafile{data-tmp}{} +\registerctxluafile{data-met}{} +\registerctxluafile{data-res}{} +\registerctxluafile{data-inp}{} +\registerctxluafile{data-out}{} +\registerctxluafile{data-fil}{} -\registerctxluafile{data-pre}{1.001} -\registerctxluafile{data-tex}{1.001} -\registerctxluafile{data-vir}{1.001} -\registerctxluafile{data-bin}{1.001} -\registerctxluafile{data-zip}{1.001} -%registerctxluafile{data-crl}{1.001} -\registerctxluafile{data-sch}{1.001} -\registerctxluafile{data-tre}{1.001} -\registerctxluafile{data-lua}{1.001} -\registerctxluafile{data-ctx}{1.001} -\registerctxluafile{data-con}{1.001} -\registerctxluafile{data-use}{1.001} -\registerctxluafile{data-aux}{1.001} +\registerctxluafile{data-pre}{} +\registerctxluafile{data-tex}{} +\registerctxluafile{data-vir}{} +\registerctxluafile{data-bin}{} +\registerctxluafile{data-zip}{} +%registerctxluafile{data-crl}{} +\registerctxluafile{data-sch}{} +\registerctxluafile{data-tre}{} +\registerctxluafile{data-lua}{} +\registerctxluafile{data-ctx}{} +\registerctxluafile{data-con}{} +\registerctxluafile{data-use}{} +\registerctxluafile{data-aux}{} -\registerctxluafile{util-lib}{1.001} +\registerctxluafile{util-lib}{} -\registerctxluafile{luat-cbk}{1.001} -\registerctxluafile{luat-run}{1.001} -\registerctxluafile{luat-fio}{1.001} -\registerctxluafile{luat-cnf}{1.001} -\registerctxluafile{luat-lua}{1.001} -\registerctxluafile{luat-sto}{1.001} -\registerctxluafile{luat-ini}{1.001} -\registerctxluafile{util-env}{1.001} -\registerctxluafile{luat-env}{1.001} -\registerctxluafile{luat-exe}{1.001} % simplified -\registerctxluafile{luat-iop}{1.001} % simplified -\registerctxluafile{luat-bwc}{1.001} -\registerctxluafile{trac-lmx}{1.001} % might become l-lmx or luat-lmx -\registerctxluafile{luat-mac}{1.001} -%registerctxluafile{luat-prp}{1.001} % for the moment of not much use +\registerctxluafile{luat-cbk}{} +\registerctxluafile{luat-run}{} +\registerctxluafile{luat-fio}{} +\registerctxluafile{luat-cnf}{} +\registerctxluafile{luat-lua}{} +\registerctxluafile{luat-sto}{} +\registerctxluafile{luat-ini}{} +\registerctxluafile{util-env}{} +\registerctxluafile{luat-env}{} +\registerctxluafile{luat-exe}{} % simplified +\registerctxluafile{luat-iop}{} % simplified +\registerctxluafile{luat-bwc}{} +\registerctxluafile{trac-lmx}{} % might become l-lmx or luat-lmx +\registerctxluafile{luat-mac}{} +%registerctxluafile{luat-prp}{} % for the moment of not much use -\registerctxluafile{lxml-tab}{1.001} -\registerctxluafile{lxml-lpt}{1.001} -\registerctxluafile{lxml-xml}{1.001} -\registerctxluafile{lxml-aux}{1.001} -\registerctxluafile{lxml-mis}{1.001} +\registerctxluafile{lxml-tab}{} +\registerctxluafile{lxml-lpt}{} +\registerctxluafile{lxml-xml}{} +\registerctxluafile{lxml-aux}{} +\registerctxluafile{lxml-mis}{} \normalprotected\def\writestatus#1#2{\ctxlua{logs.status([==[#1]==],[==[#2]==])}} \normalprotected\def\writestring #1{\ctxlua{logs.writer([==[#1]==],"\string\n")}} diff --git a/tex/context/base/mkiv/luat-mac.lua b/tex/context/base/mkiv/luat-mac.lua index 3f1fe6751..44630b194 100644 --- a/tex/context/base/mkiv/luat-mac.lua +++ b/tex/context/base/mkiv/luat-mac.lua @@ -215,9 +215,9 @@ end -- if filename and filesuffix(filename) == "mkvi" or lpegmatch(checker,str) == "mkvi" then -- local oldsize = #str -- str = lpegmatch(parser,str,1,true) or str --- pushtarget("log") +-- pushtarget("logfile") -- report_macros("processed mkvi file %a, delta %s",filename,oldsize-#str) --- poptarget("log") +-- poptarget() -- end -- return str -- end @@ -231,9 +231,9 @@ local processors = { } function processors.mkvi(str,filename) local oldsize = #str str = lpegmatch(parser,str,1,true) or str - pushtarget("log") + pushtarget("logfile") report_macros("processed mkvi file %a, delta %s",filename,oldsize-#str) - poptarget("log") + poptarget() return str end @@ -246,9 +246,9 @@ function processors.mkix(str,filename) -- we could intercept earlier so that cac end local oldsize = #str str = convertlmxstring(str,document.variables,false) or str - pushtarget("log") + pushtarget("logfile") report_macros("processed mkix file %a, delta %s",filename,oldsize-#str) - poptarget("log") + poptarget() return str end @@ -262,9 +262,9 @@ function processors.mkxi(str,filename) local oldsize = #str str = convertlmxstring(str,document.variables,false) or str str = lpegmatch(parser,str,1,true) or str - pushtarget("log") + pushtarget("logfile") report_macros("processed mkxi file %a, delta %s",filename,oldsize-#str) - poptarget("log") + poptarget() return str end @@ -283,9 +283,9 @@ function macros.processmkvi(str,filename) if filename and filesuffix(filename) == "mkvi" or lpegmatch(checker,str) == "mkvi" then local oldsize = #str str = lpegmatch(parser,str,1,true) or str - pushtarget("log") + pushtarget("logfile") report_macros("processed mkvi file %a, delta %s",filename,oldsize-#str) - poptarget("log") + poptarget() end return str end @@ -313,9 +313,9 @@ if resolvers.schemes then io.savedata(cachename,str) else local result = lpegmatch(parser,str,1,true) or str - pushtarget("log") + pushtarget("logfile") report_macros("processed scheme %a, delta %s",filename,#str-#result) - poptarget("log") + poptarget() io.savedata(cachename,result) end end diff --git a/tex/context/base/mkiv/luat-run.lua b/tex/context/base/mkiv/luat-run.lua index 372bbcbfa..59fb0b937 100644 --- a/tex/context/base/mkiv/luat-run.lua +++ b/tex/context/base/mkiv/luat-run.lua @@ -6,6 +6,7 @@ if not modules then modules = { } end modules ['luat-run'] = { license = "see context related readme files" } +local next = next local format, find = string.format, string.find local insert, remove = table.insert, table.remove @@ -20,11 +21,13 @@ local report_lua = logs.reporter("system","lua") local report_tex = logs.reporter("system","status") local report_tempfiles = logs.reporter("resolvers","tempfiles") -luatex = luatex or { } -local luatex = luatex +luatex = luatex or { } +local luatex = luatex +local synctex = luatex.synctex -if not luatex.synctex then - luatex.synctex = table.setmetatableindex(function() return function() end end) +if not synctex then + synctex = table.setmetatableindex(function() return function() end end) + luatex.synctex = synctex end local startactions = { } @@ -50,20 +53,33 @@ local function stop_run() for i=1,#stopactions do stopactions[i]() end + local quit = logs.finalactions() if trace_job_status then statistics.show() end if trace_tex_status then + logs.newline() for k, v in table.sortedhash(status.list()) do report_tex("%S=%S",k,v) end end + if quit then + if status.setexitcode then + status.setexitcode(1) + if type(quit) == "table" then + logs.newline() + report_tex("quitting due to: %, t",quit) + logs.newline() + end + end + end if logs.stop_run then logs.stop_run() end end local function start_shipout_page() + synctex.start() logs.start_page_number() end @@ -72,7 +88,7 @@ local function stop_shipout_page() for i=1,#pageactions do pageactions[i]() end - luatex.synctex.flush() + synctex.stop() end local function report_output_pages() @@ -95,24 +111,35 @@ local function pre_dump_actions() -- statistics.savefmtstatus("\jobname","\contextversion","context.tex") end +local function wrapup_synctex() + synctex.wrapup() +end + -- this can be done later -callbacks.register('start_run', start_run, "actions performed at the beginning of a run") -callbacks.register('stop_run', stop_run, "actions performed at the end of a run") +callbacks.register('start_run', start_run, "actions performed at the beginning of a run") +callbacks.register('stop_run', stop_run, "actions performed at the end of a run") + +---------.register('show_open', show_open, "actions performed when opening a file") +---------.register('show_close', show_close, "actions performed when closing a file") ----------.register('show_open', show_open, "actions performed when opening a file") ----------.register('show_close', show_close, "actions performed when closing a file") +callbacks.register('report_output_pages', report_output_pages, "actions performed when reporting pages") +callbacks.register('report_output_log', report_output_log, "actions performed when reporting log file") -callbacks.register('report_output_pages', report_output_pages, "actions performed when reporting pages") -callbacks.register('report_output_log', report_output_log, "actions performed when reporting log file") +callbacks.register('start_page_number', start_shipout_page, "actions performed at the beginning of a shipout") +callbacks.register('stop_page_number', stop_shipout_page, "actions performed at the end of a shipout") -callbacks.register('start_page_number', start_shipout_page, "actions performed at the beginning of a shipout") -callbacks.register('stop_page_number', stop_shipout_page, "actions performed at the end of a shipout") +callbacks.register('process_input_buffer', false, "actions performed when reading data") +callbacks.register('process_output_buffer', false, "actions performed when writing data") -callbacks.register('process_input_buffer', false, "actions performed when reading data") -callbacks.register('process_output_buffer', false, "actions performed when writing data") +callbacks.register("pre_dump", pre_dump_actions, "lua related finalizers called before we dump the format") -- comes after \everydump -callbacks.register("pre_dump", pre_dump_actions, "lua related finalizers called before we dump the format") -- comes after \everydump +if LUATEXFUNCTIONALITY and LUATEXFUNCTIONALITY > 6505 then + callbacks.register("finish_synctex", wrapup_synctex, "rename temporary synctex file") + callbacks.register('wrapup_run', false, "actions performed after closing files") +else + callbacks.register("finish_synctex_callback", wrapup_synctex, "rename temporary synctex file") +end -- an example: @@ -180,7 +207,7 @@ local function report_start(left,name) -- report_load("%s > %s",types[left],name or "?") report_load("type %a, name %a",types[left],name or "?") end - elseif find(name,"virtual://") then + elseif find(name,"virtual://",1,true) then insert(stack,false) else insert(stack,name) @@ -188,7 +215,7 @@ local function report_start(left,name) level = level + 1 -- report_open("%i > %i > %s",level,total,name or "?") report_open("level %i, order %i, name %a",level,total,name or "?") - luatex.synctex.setfilename(name) + synctex.setfilename(name) end end @@ -199,6 +226,7 @@ local function report_stop(right) -- report_close("%i > %i > %s",level,total,name or "?") report_close("level %i, order %i, name %a",level,total,name or "?") level = level - 1 + synctex.setfilename(stack[#stack] or tex.jobname) end end end diff --git a/tex/context/base/mkiv/luat-sto.lua b/tex/context/base/mkiv/luat-sto.lua index b04d655c2..e67830b0d 100644 --- a/tex/context/base/mkiv/luat-sto.lua +++ b/tex/context/base/mkiv/luat-sto.lua @@ -11,8 +11,9 @@ if not modules then modules = { } end modules ['luat-sto'] = { local type, next, setmetatable, getmetatable, collectgarbage = type, next, setmetatable, getmetatable, collectgarbage local gmatch, format = string.gmatch, string.format local serialize, concat, sortedhash = table.serialize, table.concat, table.sortedhash -local bytecode = lua.bytecode +local setbytecode = lua.setbytecode local strippedloadstring = utilities.lua.strippedloadstring +local loadstring = utilities.lua.loadstring local formatters = string.formatters local trace_storage = false @@ -53,36 +54,6 @@ local n = 0 -- is that one used ? if environment.initex then - -- local function dump() - -- local max = storage.max - -- for i=1,#data do - -- local d = data[i] - -- local message, original, target = d[1], d[2] ,d[3] - -- local c, code, name = 0, { }, nil - -- -- we have a nice definer for this - -- for str in gmatch(target,"([^%.]+)") do - -- if name then - -- name = name .. "." .. str - -- else - -- name = str - -- end - -- c = c + 1 ; code[c] = formatters["%s = %s or { }"](name,name) - -- end - -- max = max + 1 - -- if trace_storage then - -- c = c + 1 ; code[c] = formatters["print('restoring %s from slot %s')"](message,max) - -- end - -- c = c + 1 ; code[c] = serialize(original,name) - -- if trace_storage then - -- report_storage('saving %a in slot %a, size %s',message,max,#code[c]) - -- end - -- -- we don't need tracing in such tables - -- bytecode[max] = strippedloadstring(concat(code,"\n"),storage.strip,format("slot %s (%s)",max,name)) - -- collectgarbage("step") - -- end - -- storage.max = max - -- end - local function dump() local max = storage.max local strip = storage.strip @@ -105,7 +76,15 @@ if environment.initex then end -- we don't need tracing in such tables dumped = concat({ definition, comment, dumped },"\n") - bytecode[max] = strippedloadstring(dumped,strip,formatters["slot %s (%s)"](max,name)) + local code = nil + local name = formatters["slot %s (%s)"](max,name) + if LUAVERSION >= 5.3 and LUATEXFUNCTIONALITY >= 6454 then + local code = loadstring(dumped,name) + setbytecode(max,code,strip) + else + local code = strippedloadstring(dumped,name,strip) + setbytecode(max,code) + end collectgarbage("step") end storage.max = max @@ -131,18 +110,6 @@ function lua.collectgarbage(threshold) end end --- -- we also need to count at generation time (nicer for message) --- --- if lua.bytecode then -- from 0 upwards --- local i, b = storage.min, lua.bytecode --- while b[i] do --- storage.noftables = i --- b[i]() --- b[i] = nil --- i = i + 1 --- end --- end - statistics.register("stored bytecode data", function() local nofmodules = (storage.nofmodules > 0 and storage.nofmodules) or (status.luabytecodes - lua.firstbytecode - 1) local nofdumps = (storage.noftables > 0 and storage.noftables ) or storage.max-storage.min + 1 diff --git a/tex/context/base/mkiv/luat-usr.mkiv b/tex/context/base/mkiv/luat-usr.mkiv index 92d40010c..760de9f21 100644 --- a/tex/context/base/mkiv/luat-usr.mkiv +++ b/tex/context/base/mkiv/luat-usr.mkiv @@ -15,7 +15,7 @@ \unprotect -\registerctxluafile{luat-usr}{1.001} +\registerctxluafile{luat-usr}{} %D A few goodies: %D diff --git a/tex/context/base/mkiv/lxml-aux.lua b/tex/context/base/mkiv/lxml-aux.lua index ee0909cbf..78cf1d6bd 100644 --- a/tex/context/base/mkiv/lxml-aux.lua +++ b/tex/context/base/mkiv/lxml-aux.lua @@ -24,7 +24,7 @@ local type, next, setmetatable, getmetatable = type, next, setmetatable, getmeta local insert, remove, fastcopy, concat = table.insert, table.remove, table.fastcopy, table.concat local gmatch, gsub, format, find, strip = string.gmatch, string.gsub, string.format, string.find, string.strip local utfbyte = utf.byte -local lpegmatch = lpeg.match +local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns local striplinepatterns = utilities.strings.striplinepatterns local function report(what,pattern,c,e) @@ -412,7 +412,9 @@ local function include(xmldata,pattern,attribute,recursive,loaddata,level) end local data = nil if name and name ~= "" then - data = loaddata(name) or "" + local d, n = loaddata(name) + data = d or "" + name = n or name if trace_inclusions then report_xml("including %s bytes from %a at level %s by pattern %a and attribute %a (%srecursing)",#data,name,level,pattern,attribute or "",recursive and "" or "not ") end @@ -423,6 +425,9 @@ local function include(xmldata,pattern,attribute,recursive,loaddata,level) -- for the moment hard coded epdt[ek.ni] = xml.escaped(data) -- d[k] = xml.escaped(data) else +local settings = xmldata.settings +local savedresource = settings.currentresource +settings.currentresource = name local xi = xmlinheritedconvert(data,xmldata) if not xi then epdt[ek.ni] = "" -- xml.empty(d,k) @@ -433,6 +438,7 @@ local function include(xmldata,pattern,attribute,recursive,loaddata,level) local child = xml.body(xi) -- xml.assign(d,k,xi) child.__p__ = ekrt child.__f__ = name -- handy for tracing +child.cf = name epdt[ek.ni] = child local settings = xmldata.settings local inclusions = settings and settings.inclusions @@ -453,6 +459,7 @@ local function include(xmldata,pattern,attribute,recursive,loaddata,level) end end end +settings.currentresource = savedresource end end end @@ -502,15 +509,13 @@ function xml.badinclusions(e,sorted) return getinclusions("badinclusions",e,sorted) end -local b_collapser = lpeg.patterns.b_collapser -local m_collapser = lpeg.patterns.m_collapser -local e_collapser = lpeg.patterns.e_collapser +local b_collapser = lpegpatterns.b_collapser +local m_collapser = lpegpatterns.m_collapser +local e_collapser = lpegpatterns.e_collapser -local b_stripper = lpeg.patterns.b_stripper -local m_stripper = lpeg.patterns.m_stripper -local e_stripper = lpeg.patterns.e_stripper - -local lpegmatch = lpeg.match +local b_stripper = lpegpatterns.b_stripper +local m_stripper = lpegpatterns.m_stripper +local e_stripper = lpegpatterns.e_stripper local function stripelement(e,nolines,anywhere) local edt = e.dt @@ -1017,3 +1022,29 @@ function xml.totable(x,strip,flat) return convert(x,strip,flat) end end + +-- namespace, name, attributes +-- name, attributes +-- name + +function xml.rename(e,namespace,name,attributes) + if type(e) ~= "table" or not e.tg then + return + end + if type(name) == "table" then + attributes = name + name = namespace + namespace = "" + elseif type(name) ~= "string" then + attributes = { } + name = namespace + namespace = "" + end + if type(attributes) ~= "table" then + attributes = { } + end + e.ns = namespace + e.rn = namespace + e.tg = name + e.at = attributes +end diff --git a/tex/context/base/mkiv/lxml-css.lua b/tex/context/base/mkiv/lxml-css.lua index b2198f341..a4d15ba1f 100644 --- a/tex/context/base/mkiv/lxml-css.lua +++ b/tex/context/base/mkiv/lxml-css.lua @@ -12,10 +12,13 @@ local topattern, is_empty = string.topattern, string.is_empty local P, S, C, R, Cb, Cg, Carg, Ct, Cc, Cf, Cs = lpeg.P, lpeg.S, lpeg.C, lpeg.R, lpeg.Cb, lpeg.Cg, lpeg.Carg, lpeg.Ct, lpeg.Cc, lpeg.Cf, lpeg.Cs local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns local sort = table.sort +local setmetatableindex = table.setmetatableindex xml.css = xml.css or { } local css = xml.css +local getid = lxml.getid + if not number.dimenfactors then require("util-dim.lua") end @@ -26,6 +29,9 @@ local cmf = 1/dimenfactors.cm local mmf = 1/dimenfactors.mm local inf = 1/dimenfactors["in"] +local whitespace = lpegpatterns.whitespace +local skipspace = whitespace^0 + local percentage, exheight, emwidth, pixels if tex then @@ -62,7 +68,7 @@ local validdimen = Cg(lpegpatterns.number,'a') * ( + Cb('a') * Carg(1) / pixels ) -local pattern = (validdimen * lpegpatterns.whitespace^0)^1 +local pattern = (validdimen * skipspace)^1 -- todo: default if "" @@ -332,12 +338,12 @@ local function s_attribute(list,collected,c,negate,str,what,value) end elseif what == 2 then -- todo: lpeg - if find(v,value) then + if find(v,value) then -- value can be a pattern ok = not negate end elseif what == 3 then -- todo: lpeg - if find(v," ") then + if find(v," ",1,true) then for s in gmatch(v,"[^ ]+") do if s == value then ok = not negate @@ -645,9 +651,7 @@ end local P, R, S, C, Cs, Ct, Cc, Carg, lpegmatch = lpeg.P, lpeg.R, lpeg.S, lpeg.C, lpeg.Cs, lpeg.Ct, lpeg.Cc, lpeg.Carg, lpeg.match -local whitespace = lpegpatterns.whitespace local p_number = lpegpatterns.integer / tonumber -local p_space = whitespace^0 local p_key = C((R("az","AZ","09") + S("_-"))^1) local p_left = S("#.[],:()") @@ -657,10 +661,10 @@ local p_value = C((1-P("]"))^0) local p_unquoted = (P('"')/"") * C((1-P('"'))^0) * (P('"')/"") + (1-P("]"))^1 local p_element = Ct( ( - P(">") * p_space * Cc(s_element_a) + - P("+") * p_space * Cc(s_element_b) + - P("~") * p_space * Cc(s_element_c) + - Cc(s_element_d) + P(">") * skipspace * Cc(s_element_a) + + P("+") * skipspace * Cc(s_element_b) + + P("~") * skipspace * Cc(s_element_c) + + Cc(s_element_d) ) * p_tag ) local p_attribute = P("[") * Ct(Cc(s_attribute) * p_key * ( P("=" ) * Cc(1) * Cs( p_unquoted) @@ -670,16 +674,16 @@ local p_attribute = P("[") * Ct(Cc(s_attribute) * p_key * ( + P("~=") * Cc(3) * Cs( p_unquoted) )^0 * P("]")) -local p_separator = p_space * P(",") * p_space +local p_separator = skipspace * P(",") * skipspace -local p_formula = p_space * P("(") - * p_space +local p_formula = skipspace * P("(") + * skipspace * ( - p_number * p_space * (C("n") * p_space * (p_number + Cc(0)))^-1 + p_number * skipspace * (C("n") * skipspace * (p_number + Cc(0)))^-1 + P("even") * Cc(0) * Cc("n") * Cc(2) + P("odd") * Cc(-1) * Cc("n") * Cc(2) ) - * p_space + * skipspace * P(")") local p_step = P(".") * Ct(Cc(s_attribute) * Cc("class") * Cc(3) * p_tag) @@ -699,13 +703,13 @@ local p_step = P(".") * Ct(Cc(s_attribute) * Cc("class") * Cc(3) * p + P(":empty") * Ct(Cc(s_empty) ) + P(":root") * Ct(Cc(s_root) ) -local p_not = P(":not") * Cc(true) * p_space * P("(") * p_space * p_step * p_space * P(")") -local p_yes = Cc(false) * p_space * p_step +local p_not = P(":not") * Cc(true) * skipspace * P("(") * skipspace * p_step * skipspace * P(")") +local p_yes = Cc(false) * skipspace * p_step -local p_stepper = Ct((p_space * (p_not+p_yes))^1) -local p_steps = Ct((p_stepper * p_separator^0)^1) * p_space * (P(-1) + function() print("error") end) +local p_stepper = Ct((skipspace * (p_not+p_yes))^1) +local p_steps = Ct((p_stepper * p_separator^0)^1) * skipspace * (P(-1) + function() print("error") end) -local cache = table.setmetatableindex(function(t,k) +local cache = setmetatableindex(function(t,k) local v = lpegmatch(p_steps,k) or false t[k] = v return v @@ -877,10 +881,115 @@ xml.applyselector= selector -- local s = [[ g:empty ]] -- local s = [[ g:root ]] +-- local c = css.applyselector(xml.convert(t),s) for i=1,#c do print(xml.tostring(c[i])) end + function css.applyselector(x,str) -- the wrapping needs checking so this is a placeholder return applyselector({ x },str) end --- local c = css.applyselector(xml.convert(t),s) for i=1,#c do print(xml.tostring(c[i])) end +-- -- Some helpers to map e.g. style attributes: +-- +-- -- string based (2.52): +-- +-- local match = string.match +-- local topattern = string.topattern +-- +-- function css.stylevalue(root,name) +-- local list = getid(root).at.style +-- if list then +-- local pattern = topattern(name) .. ":%s*([^;]+)" +-- local value = match(list,pattern) +-- if value then +-- context(value) +-- end +-- end +-- end +-- +-- -- string based, cached (2.28 / 2.17 interfaced): +-- +-- local match = string.match +-- local topattern = string.topattern +-- +-- local patterns = table.setmetatableindex(function(t,k) +-- local v = topattern(k) .. ":%s*([^;]+)" +-- t[k] = v +-- return v +-- end) +-- +-- function css.stylevalue(root,name) +-- local list = getid(root).at.style +-- if list then +-- local value = match(list,patterns[name]) +-- if value then +-- context(value) +-- end +-- end +-- end +-- +-- -- lpeg based (4.26): +-- +-- the lpeg variant also removes trailing spaces and accepts spaces before a colon + +local ctx_sprint = context.sprint +local ctx_xmlvalue = context.xmlvalue + +local colon = P(":") +local semicolon = P(";") +local eos = P(-1) +local somevalue = (1 - (skipspace * (semicolon + eos)))^1 +local someaction = skipspace * colon * skipspace * (somevalue/ctx_sprint) + +-- function css.stylevalue(root,name) +-- local list = getid(root).at.style +-- if list then +-- lpegmatch(P(name * someaction + 1)^0,list) +-- end +-- end +-- -- cache patterns (2.13): + +local patterns= setmetatableindex(function(t,k) + local v = P(k * someaction + 1)^0 + t[k] = v + return v +end) + +function css.stylevalue(root,name) + local list = getid(root).at.style -- hard coded style + if list then + lpegmatch(patterns[name],list) + end +end + +local somevalue = (1 - whitespace - semicolon - eos)^1 +local someaction = skipspace * colon * (skipspace * Carg(1) * C(somevalue)/function(m,s) + ctx_xmlvalue(m,s,"") -- use one with two args +end)^1 + +local patterns= setmetatableindex(function(t,k) + local v = P(k * someaction + 1)^0 + t[k] = v + return v +end) + +function css.mappedstylevalue(root,map,name) + local list = getid(root).at.style -- hard coded style + if list then + lpegmatch(patterns[name],list,1,map) + end +end + +-- -- faster interface (1.02): + +interfaces.implement { + name = "xmlstylevalue", + actions = css.stylevalue, + arguments = { "string", "string" }, +} + +interfaces.implement { + name = "xmlmappedstylevalue", + actions = css.mappedstylevalue, + arguments = { "string", "string", "string" }, +} diff --git a/tex/context/base/mkiv/lxml-css.mkiv b/tex/context/base/mkiv/lxml-css.mkiv index 79de85c08..04000a6ca 100644 --- a/tex/context/base/mkiv/lxml-css.mkiv +++ b/tex/context/base/mkiv/lxml-css.mkiv @@ -11,7 +11,9 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\registerctxluafile{lxml-css}{1.001} +\registerctxluafile{lxml-css}{} + +\unprotect \def\ctxmodulecss#1{\ctxlua{moduledata.css.#1}} @@ -23,7 +25,7 @@ % \else % \edef\CellPadding{\cssgetsinglepadding{\xmlatt{#1}{cellpadding}}} % \fi - +% % \starttexdefinition cssgetsinglepadding #1 % \ctxlua { % context((moduledata.css.padding( @@ -36,4 +38,39 @@ % }sp % \stoptexdefinition -\endinput +% \startxmlsetups html:settings +% \xmlsetsetup{#1}{p}{html:p} +% \stopxmlsetups +% +% \xmlmapvalue{ctx-before} {one} {\page BEFORE\par} +% \xmlmapvalue{ctx-after} {two} {\par AFTER\page} +% \xmlmapvalue{text-decoration}{underline}{U} +% \xmlmapvalue{text-decoration}{overline} {O} +% +% \startxmlsetups html:p +% \testfeatureonce{100000}{ +% \edef\foo{\xmlcssstylevalue{#1}{ctx-before}\xmlcssstylevalue{#1}{ctx-after}} +% } +% \page {\tttf style="\xmlatt{#1}{style}"} : \elapsedtime\ s \page +% \xmlvalue{ctx-before}{\xmlcssstylevalue{#1}{ctx-before}}{} +% \xmlflush{#1} +% (\xmlcssstylevalue{#1}{text-decoration}) +% (\xmlcssmappedstylevalue{#1}{text-decoration}{text-decoration}) +% \xmlvalue{ctx-after} {\xmlcssstylevalue{#1}{ctx-after}}{} +% \stopxmlsetups +% +% \startbuffer[temp] +% <body> +% <p style='ctx-before: one; text-decoration: underline overline; ctx-after: two;'>foo 1</p> +% <p>foo 2</p> +% </body> +% \stopbuffer +% +% \xmlregistersetup{html:settings} +% \xmlprocessbuffer{main}{temp}{} + +\let\xmlcssstylevalue \clf_xmlstylevalue +\let\xmlcssmappedstylevalue\clf_xmlmappedstylevalue + +\protect \endinput + diff --git a/tex/context/base/mkiv/lxml-ctx.mkiv b/tex/context/base/mkiv/lxml-ctx.mkiv index 6691e36bb..e0beb22bf 100644 --- a/tex/context/base/mkiv/lxml-ctx.mkiv +++ b/tex/context/base/mkiv/lxml-ctx.mkiv @@ -16,7 +16,7 @@ \writestatus{loading}{ConTeXt XML Support / Goodies} -\registerctxluafile{lxml-ctx}{1.001} +\registerctxluafile{lxml-ctx}{} \unprotect diff --git a/tex/context/base/mkiv/lxml-ent.lua b/tex/context/base/mkiv/lxml-ent.lua index 93f48046b..df80a7985 100644 --- a/tex/context/base/mkiv/lxml-ent.lua +++ b/tex/context/base/mkiv/lxml-ent.lua @@ -6,7 +6,7 @@ if not modules then modules = { } end modules ['lxml-ent'] = { license = "see context related readme files" } -local type, next, tonumber = type, next, tonumber +local next = next local byte, format = string.byte, string.format local setmetatableindex = table.setmetatableindex diff --git a/tex/context/base/mkiv/lxml-inf.lua b/tex/context/base/mkiv/lxml-inf.lua index 8f1157c7d..8d99d6270 100644 --- a/tex/context/base/mkiv/lxml-inf.lua +++ b/tex/context/base/mkiv/lxml-inf.lua @@ -8,6 +8,7 @@ if not modules then modules = { } end modules ['lxml-inf'] = { -- This file will be loaded runtime by x-pending.tex. +local next, tostring, type = next, tostring, type local concat = table.concat local xmlwithelements = xml.withelements diff --git a/tex/context/base/mkiv/lxml-ini.lua b/tex/context/base/mkiv/lxml-ini.lua index 11f634739..f7f882cee 100644 --- a/tex/context/base/mkiv/lxml-ini.lua +++ b/tex/context/base/mkiv/lxml-ini.lua @@ -39,19 +39,15 @@ implement { name = "xmldoifelseselfempty", actions = lxml.doifelseempty, arg --------- { name = "xmlcontent", actions = lxml.content, arguments = "string" } --------- { name = "xmlflushstripped", actions = lxml.strip, arguments = { "string", true } } + implement { name = "xmlall", actions = lxml.all, arguments = { "string", "string" } } -implement { name = "xmllastmatch", actions = lxml.lastmatch } -implement { name = "xmlpushmatch", actions = lxml.pushmatch } -implement { name = "xmlpopmatch", actions = lxml.popmatch } implement { name = "xmlatt", actions = lxml.att, arguments = { "string", "string" } } -implement { name = "xmllastatt", actions = lxml.lastatt } implement { name = "xmlattdef", actions = lxml.att, arguments = { "string", "string", "string" } } implement { name = "xmlattribute", actions = lxml.attribute, arguments = { "string", "string", "string" } } implement { name = "xmlattributedef", actions = lxml.attribute, arguments = { "string", "string", "string", "string" } } -implement { name = "xmlpath", actions = lxml.path, arguments = { "string", "'/'" } } +implement { name = "xmlbadinclusions", actions = lxml.badinclusions, arguments = "string" } implement { name = "xmlchainatt", actions = lxml.chainattribute, arguments = { "string", "'/'", "string" } } implement { name = "xmlchainattdef", actions = lxml.chainattribute, arguments = { "string", "'/'", "string", "string" } } -implement { name = "xmlrefatt", actions = lxml.refatt, arguments = { "string", "string" } } implement { name = "xmlchecknamespace", actions = xml.checknamespace, arguments = { "lxmlid", "string", "string" } } implement { name = "xmlcommand", actions = lxml.command, arguments = { "string", "string", "string" } } implement { name = "xmlconcat", actions = lxml.concat, arguments = { "string", "string", "string" } } -- \detokenize{#3} @@ -71,16 +67,21 @@ implement { name = "xmlfirst", actions = lxml.first, arg implement { name = "xmlflush", actions = lxml.flush, arguments = "string" } implement { name = "xmlflushcontext", actions = lxml.context, arguments = "string" } implement { name = "xmlflushlinewise", actions = lxml.flushlinewise, arguments = "string" } +implement { name = "xmlflushpure", actions = lxml.pure, arguments = "string" } implement { name = "xmlflushspacewise", actions = lxml.flushspacewise, arguments = "string" } +implement { name = "xmlflushtext", actions = lxml.text, arguments = "string" } implement { name = "xmlfunction", actions = lxml.applyfunction, arguments = { "string", "string" } } implement { name = "xmlinclude", actions = lxml.include, arguments = { "string", "string", "string", true } } implement { name = "xmlincludeoptions", actions = lxml.include, arguments = { "string", "string", "string", "string" } } implement { name = "xmlinclusion", actions = lxml.inclusion, arguments = "string" } +implement { name = "xmlinclusionbase", actions = lxml.inclusion, arguments = { "string", false, true } } implement { name = "xmlinclusions", actions = lxml.inclusions, arguments = "string" } -implement { name = "xmlbadinclusions", actions = lxml.badinclusions, arguments = "string" } implement { name = "xmlindex", actions = lxml.index, arguments = { "string", "string", "string" } } -- can be integer but now we can alias implement { name = "xmlinlineverbatim", actions = lxml.inlineverbatim, arguments = "string" } implement { name = "xmllast", actions = lxml.last, arguments = { "string", "string" } } +implement { name = "xmllastatt", actions = lxml.lastatt } +implement { name = "xmllastmatch", actions = lxml.lastmatch } +implement { name = "xmllastpar", actions = lxml.lastpar } implement { name = "xmlload", actions = lxml.load, arguments = { "string", "string", "string" } } implement { name = "xmlloadbuffer", actions = lxml.loadbuffer, arguments = { "string", "string", "string" } } implement { name = "xmlloaddata", actions = lxml.loaddata, arguments = { "string", "string", "string" } } @@ -90,13 +91,24 @@ implement { name = "xmlmatch", actions = lxml.match, arg implement { name = "xmlname", actions = lxml.name, arguments = "string" } implement { name = "xmlnamespace", actions = lxml.namespace, arguments = "string" } implement { name = "xmlnonspace", actions = lxml.nonspace, arguments = { "string", "string" } } +implement { name = "xmlpar", actions = lxml.par, arguments = { "string", "string" } } +implement { name = "xmlparam", actions = lxml.param, arguments = { "string", "string", "string" } } +implement { name = "xmlpath", actions = lxml.path, arguments = { "string", "'/'" } } +implement { name = "xmlpopmatch", actions = lxml.popmatch } implement { name = "xmlpos", actions = lxml.pos, arguments = "string" } +implement { name = "xmlpure", actions = lxml.pure, arguments = { "string", "string" } } +implement { name = "xmlpushmatch", actions = lxml.pushmatch } implement { name = "xmlraw", actions = lxml.raw, arguments = { "string", "string" } } implement { name = "xmlrawtex", actions = lxml.rawtex, arguments = { "string", "string" } } +implement { name = "xmlrefatt", actions = lxml.refatt, arguments = { "string", "string" } } implement { name = "xmlregisterns", actions = xml.registerns, arguments = { "string", "string" } } implement { name = "xmlremapname", actions = xml.remapname, arguments = { "lxmlid", "string","string","string" } } implement { name = "xmlremapnamespace", actions = xml.renamespace, arguments = { "lxmlid", "string", "string" } } implement { name = "xmlsave", actions = lxml.save, arguments = { "string", "string" } } +implement { name = "xmlsetatt", actions = lxml.setatt, arguments = { "string", "string", "string" } } +implement { name = "xmlsetattribute", actions = lxml.setattribute, arguments = { "string", "string", "string", "string" } } +implement { name = "xmlsetpar", actions = lxml.setpar, arguments = { "string", "string", "string" } } +implement { name = "xmlsetparam", actions = lxml.setparam, arguments = { "string", "string", "string", "string" } } implement { name = "xmlsetsetup", actions = lxml.setsetup, arguments = { "string", "string", "string" } } implement { name = "xmlsnippet", actions = lxml.snippet, arguments = { "string", "string" } } implement { name = "xmlstrip", actions = lxml.strip, arguments = { "string", "string" } } @@ -106,11 +118,9 @@ implement { name = "xmlstripped", actions = lxml.stripped, arg implement { name = "xmlstrippednolines", actions = lxml.stripped, arguments = { "string", "string", true } } implement { name = "xmltag", actions = lxml.tag, arguments = "string" } implement { name = "xmltext", actions = lxml.text, arguments = { "string", "string" } } -implement { name = "xmlpure", actions = lxml.pure, arguments = { "string", "string" } } -implement { name = "xmlflushtext", actions = lxml.text, arguments = "string" } -implement { name = "xmlflushpure", actions = lxml.pure, arguments = "string" } implement { name = "xmltobuffer", actions = lxml.tobuffer, arguments = { "string", "string", "string" } } -implement { name = "xmltobufferverbose", actions = lxml.tobuffer, arguments = { "string", "string", "string", true } } +implement { name = "xmltobuffertextonly", actions = lxml.tobuffer, arguments = { "string", "string", "string", false } } +implement { name = "xmltobufferverbose", actions = lxml.tobuffer, arguments = { "string", "string", "string", true, true } } implement { name = "xmltofile", actions = lxml.tofile, arguments = { "string", "string", "string" } } implement { name = "xmltoparameters", actions = lxml.toparameters, arguments = "string" } implement { name = "xmlverbatim", actions = lxml.verbatim, arguments = "string" } diff --git a/tex/context/base/mkiv/lxml-ini.mkiv b/tex/context/base/mkiv/lxml-ini.mkiv index 6ba6bc8d4..6f64e545b 100644 --- a/tex/context/base/mkiv/lxml-ini.mkiv +++ b/tex/context/base/mkiv/lxml-ini.mkiv @@ -16,15 +16,15 @@ \writestatus{loading}{ConTeXt XML Support / Initialization} -%registerctxluafile{lxml-tab}{1.001} % loader -%registerctxluafile{lxml-lpt}{1.001} % parser -%registerctxluafile{lxml-xml}{1.001} % xml finalizers -%registerctxluafile{lxml-aux}{1.001} % extras using parser -%registerctxluafile{lxml-mis}{1.001} % extras independent of parser -\registerctxluafile{lxml-ent}{1.001} % entity hacks -\registerctxluafile{lxml-tex}{1.001} % tex finalizers -\registerctxluafile{lxml-dir}{1.001} % ctx hacks -\registerctxluafile{lxml-ini}{1.001} % interface +%registerctxluafile{lxml-tab}{} % loader +%registerctxluafile{lxml-lpt}{} % parser +%registerctxluafile{lxml-xml}{} % xml finalizers +%registerctxluafile{lxml-aux}{} % extras using parser +%registerctxluafile{lxml-mis}{} % extras independent of parser +\registerctxluafile{lxml-ent}{} % entity hacks +\registerctxluafile{lxml-tex}{} % tex finalizers +\registerctxluafile{lxml-dir}{} % ctx hacks +\registerctxluafile{lxml-ini}{} % interface \unprotect @@ -49,6 +49,7 @@ \let\xmlattdef \clf_xmlattdef \let\xmlattribute \clf_xmlattribute \let\xmlattributedef \clf_xmlattributedef +\let\xmlbadinclusions \clf_xmlbadinclusions \let\xmlchainatt \clf_xmlchainatt \let\xmlchainattdef \clf_xmlchainattdef \let\xmlchecknamespace \clf_xmlchecknamespace @@ -75,31 +76,38 @@ \let\xmlinclude \clf_xmlinclude \let\xmlincludeoptions \clf_xmlincludeoptions \let\xmlinclusion \clf_xmlinclusion +\let\xmlinclusionbase \clf_xmlinclusionbase \let\xmlinclusions \clf_xmlinclusions -\let\xmlbadinclusions \clf_xmlbadinclusions \let\xmlindex \clf_xmlindex \let\xmlinlineverbatim \clf_xmlinlineverbatim \let\xmllast \clf_xmllast \let\xmllastatt \clf_xmllastatt \let\xmllastmatch \clf_xmllastmatch -\let\xmlpushmatch \clf_xmlpushmatch -\let\xmlpopmatch \clf_xmlpopmatch +\let\xmllastpar \clf_xmllastpar \let\xmlloaddirectives \clf_xmlloaddirectives \let\xmlmain \clf_xmlmain \let\xmlmatch \clf_xmlmatch \let\xmlname \clf_xmlname \let\xmlnamespace \clf_xmlnamespace \let\xmlnonspace \clf_xmlnonspace +\let\xmlpar \clf_xmlpar +\let\xmlparam \clf_xmlparam \let\xmlpath \clf_xmlpath +\let\xmlpopmatch \clf_xmlpopmatch \let\xmlpos \clf_xmlpos \let\xmlposition \clf_xmlindex \let\xmlpure \clf_xmlpure +\let\xmlpushmatch \clf_xmlpushmatch \let\xmlraw \clf_xmlraw \let\xmlrefatt \clf_xmlrefatt \let\xmlregisterns \clf_xmlregisterns % document \let\xmlremapname \clf_xmlremapname % element \let\xmlremapnamespace \clf_xmlremapnamespace % document \let\xmlsave \clf_xmlsave +\let\xmlsetatt \clf_xmlsetatt +\let\xmlsetattribute \clf_xmlsetattribute +\let\xmlsetpar \clf_xmlsetpar +\let\xmlsetparam \clf_xmlsetparam \let\xmlsetsetup \clf_xmlsetsetup \let\xmlsnippet \clf_xmlsnippet \let\xmlstrip \clf_xmlstrip @@ -110,13 +118,14 @@ \let\xmltag \clf_xmltag \let\xmltext \clf_xmltext \let\xmltobuffer \clf_xmltobuffer % id pattern name +\let\xmltobuffertextonly \clf_xmltobuffertextonly % id pattern name \let\xmltobufferverbose \clf_xmltobufferverbose % id pattern name \let\xmltofile \clf_xmltofile % id pattern filename \let\xmltoparameters \clf_xmltoparameters \let\xmlverbatim \clf_xmlverbatim -\unexpanded\def\xmlinfo #1{\hbox{\ttxx[\clf_xmlname{#1}]}} -\unexpanded\def\xmlshow #1{\startpacked\ttx\xmlverbatim{#1}\stoppacked} +\unexpanded\def\xmlinfo#1{\hbox{\ttxx[\clf_xmlname{#1}]}} +\unexpanded\def\xmlshow#1{\startpacked\ttx\xmlverbatim{#1}\stoppacked} % the next one is handy for mode runs because it enforces a consistent % #1 indexing (needed when using \xmltext{main:123}{...} like calls @@ -129,14 +138,38 @@ % goodie: +\def\xmltempbuffername{xml-temp} + +\unexpanded\def\prettyprintbuffer#1#2% only used here + {\ifdefined\scitebuffer + \scitebuffer[#2][#1]% + \else + \typebuffer[#1][\c!option=#2]% + \fi} + \unexpanded\def\xmlprettyprint#1#2% - {\xmltobufferverbose{#1}{.}{xml-temp}% - \ifdefined\scitebuffer - \scitebuffer[#2][xml-temp]% + {\xmltobufferverbose{#1}{.}{\xmltempbuffername}% + \prettyprintbuffer\xmltempbuffername{#2}} + +\unexpanded\def\xmlprettyprinttext#1#2% + {\xmltobuffertextonly{#1}{.}{\xmltempbuffername}% + \prettyprintbuffer\xmltempbuffername{#2}} + +\unexpanded\def\inlineprettyprintbuffer#1#2% only used here + {\ifdefined\sciteinlinebuffer + \sciteinlinebuffer[#2][#1]% \else - \typebuffer[xml-temp][\c!option=#2]% + \typeinlinebuffer[#1][\c!option=#2]% \fi} +\unexpanded\def\xmlinlineprettyprint#1#2% + {\xmltobufferverbose{#1}{.}{\xmltempbuffername}% + \inlineprettyprintbuffer\xmltempbuffername{#2}} + +\unexpanded\def\xmlinlineprettyprinttext#1#2% + {\xmltobuffertextonly{#1}{.}{\xmltempbuffername}% + \inlineprettyprintbuffer\xmltempbuffername{#2}} + % kind of special: \let\xmlstartraw\clf_xmlstartraw diff --git a/tex/context/base/mkiv/lxml-mis.lua b/tex/context/base/mkiv/lxml-mis.lua index 94a26b974..04ba7b35c 100644 --- a/tex/context/base/mkiv/lxml-mis.lua +++ b/tex/context/base/mkiv/lxml-mis.lua @@ -8,8 +8,8 @@ if not modules then modules = { } end modules ['lxml-mis'] = { local xml, lpeg, string = xml, lpeg, string +local type = type local concat = table.concat -local type, next, tonumber, tostring, setmetatable, loadstring = type, next, tonumber, tostring, setmetatable, loadstring local format, gsub, match = string.format, string.gsub, string.match local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns local P, S, R, C, V, Cc, Cs = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.V, lpeg.Cc, lpeg.Cs @@ -39,7 +39,7 @@ local function xmlgsub(t,old,new) -- will be replaced end end ---~ xml.gsub = xmlgsub +-- xml.gsub = xmlgsub function xml.stripleadingspaces(dk,d,k) -- cosmetic, for manual if d and k then @@ -51,12 +51,12 @@ function xml.stripleadingspaces(dk,d,k) -- cosmetic, for manual end end ---~ xml.escapes = { ['&'] = '&', ['<'] = '<', ['>'] = '>', ['"'] = '"' } ---~ xml.unescapes = { } for k,v in next, xml.escapes do xml.unescapes[v] = k end +-- xml.escapes = { ['&'] = '&', ['<'] = '<', ['>'] = '>', ['"'] = '"' } +-- xml.unescapes = { } for k,v in next, xml.escapes do xml.unescapes[v] = k end ---~ function xml.escaped (str) return (gsub(str,"(.)" , xml.escapes )) end ---~ function xml.unescaped(str) return (gsub(str,"(&.-;)", xml.unescapes)) end ---~ function xml.cleansed (str) return (gsub(str,"<.->" , '' )) end -- "%b<>" +-- function xml.escaped (str) return (gsub(str,"(.)" , xml.escapes )) end +-- function xml.unescaped(str) return (gsub(str,"(&.-;)", xml.unescapes)) end +-- function xml.cleansed (str) return (gsub(str,"<.->" , '' )) end -- "%b<>" -- 100 * 2500 * "oeps< oeps> oeps&" : gsub:lpeg|lpeg|lpeg -- @@ -66,8 +66,8 @@ end -- -- 1559:0257:0288:0190 (last one suggested by roberto) --- escaped = Cs((S("<&>") / xml.escapes + 1)^0) --- escaped = Cs((S("<")/"<" + S(">")/">" + S("&")/"&" + 1)^0) +----- escaped = Cs((S("<&>") / xml.escapes + 1)^0) +----- escaped = Cs((S("<")/"<" + S(">")/">" + S("&")/"&" + 1)^0) local normal = (1 - S("<&>"))^0 local special = P("<")/"<" + P(">")/">" + P("&")/"&" local escaped = Cs(normal * (special * normal)^0) diff --git a/tex/context/base/mkiv/lxml-sor.lua b/tex/context/base/mkiv/lxml-sor.lua index aba1c3b8d..a30392b95 100644 --- a/tex/context/base/mkiv/lxml-sor.lua +++ b/tex/context/base/mkiv/lxml-sor.lua @@ -8,6 +8,7 @@ if not modules then modules = { } end modules ['lxml-sor'] = { local format, concat, rep = string.format, table.concat, string.rep local lpegmatch = lpeg.match +local next = next local xml = xml local lxml = lxml diff --git a/tex/context/base/mkiv/lxml-sor.mkiv b/tex/context/base/mkiv/lxml-sor.mkiv index 0d8eb6ba1..298828611 100644 --- a/tex/context/base/mkiv/lxml-sor.mkiv +++ b/tex/context/base/mkiv/lxml-sor.mkiv @@ -15,7 +15,7 @@ \writestatus{loading}{ConTeXt XML Support / Sorting} -\registerctxluafile{lxml-sor}{1.001} +\registerctxluafile{lxml-sor}{} \unprotect diff --git a/tex/context/base/mkiv/lxml-tab.lua b/tex/context/base/mkiv/lxml-tab.lua index 02228c7c5..8d4be58ab 100644 --- a/tex/context/base/mkiv/lxml-tab.lua +++ b/tex/context/base/mkiv/lxml-tab.lua @@ -160,9 +160,20 @@ local entities, parameters local strip, utfize, resolve, cleanup, resolve_predefined, unify_predefined local dcache, hcache, acache local mt, dt, nt +local currentfilename, currentline, linenumbers + +local grammar_parsed_text_one +local grammar_parsed_text_two +local grammar_unparsed_text + +local handle_hex_entity +local handle_dec_entity +local handle_any_entity_dtd +local handle_any_entity_text local function preparexmlstate(settings) if settings then + linenumbers = settings.linenumbers stack = { } level = 0 top = { } @@ -179,6 +190,8 @@ local function preparexmlstate(settings) unify_predefined = settings.unify_predefined_entities -- & -> & cleanup = settings.text_cleanup entities = settings.entities or { } + currentfilename = settings.currentresource + currentline = 1 parameters = { } reported_at_errors = { } dcache = { } @@ -193,6 +206,7 @@ local function preparexmlstate(settings) resolve_predefined = true end else + linenumbers = false stack = nil level = nil top = nil @@ -214,6 +228,8 @@ local function preparexmlstate(settings) dcache = nil hcache = nil acache = nil + currentfilename = nil + currentline = 1 end end @@ -258,14 +274,24 @@ local function add_empty(spacing, namespace, tag) top = stack[level] dt = top.dt nt = #dt + 1 - local t = { + local t = linenumbers and { ns = namespace or "", rn = resolved, tg = tag, at = at, dt = { }, ni = nt, -- set slot, needed for css filtering - __p__ = top + cf = currentfilename, + cl = currentline, + __p__ = top, + } or { + ns = namespace or "", + rn = resolved, + tg = tag, + at = at, + dt = { }, + ni = nt, -- set slot, needed for css filtering + __p__ = top, } dt[nt] = t setmetatable(t, mt) @@ -281,18 +307,28 @@ local function add_begin(spacing, namespace, tag) dt[nt] = spacing end local resolved = namespace == "" and xmlns[#xmlns] or nsremap[namespace] or namespace - top = { + dt = { } + top = linenumbers and { ns = namespace or "", rn = resolved, tg = tag, at = at, - dt = { }, + dt = dt, ni = nil, -- preset slot, needed for css filtering - __p__ = stack[level] + cf = currentfilename, + cl = currentline, + __p__ = stack[level], + } or { + ns = namespace or "", + rn = resolved, + tg = tag, + at = at, + dt = dt, + ni = nil, -- preset slot, needed for css filtering + __p__ = stack[level], } setmetatable(top, mt) - dt = top.dt - nt = #dt + nt = 0 level = level + 1 stack[level] = top at = { } @@ -372,7 +408,15 @@ local function add_special(what, spacing, text) -- forget it else nt = nt + 1 - dt[nt] = { + dt[nt] = linenumbers and { + special = true, + ns = "", + tg = what, + ni = nil, -- preset slot + dt = { text }, + cf = currentfilename, + cl = currentline, + } or { special = true, ns = "", tg = what, @@ -404,21 +448,13 @@ local function attribute_specification_error(str) return str end --- these will be set later - -local grammar_parsed_text_one -local grammar_parsed_text_two - -local handle_hex_entity -local handle_dec_entity -local handle_any_entity_dtd -local handle_any_entity_text - --- in order to overcome lua limitations we wrap entity stuff in a --- closure +-- I'm sure that this lpeg can be simplified (less captures) but it evolved ... +-- so i'm not going to change it now. do + -- In order to overcome lua limitations we wrap entity stuff in a closure. + local badentity = "&" -- was "&error;" xml.placeholders = { @@ -880,7 +916,14 @@ local function handle_crap_error(chr) return chr end +local function handlenewline() + currentline = currentline + 1 +end + +local spacetab = S(' \t') local space = S(' \r\n\t') +local newline = lpegpatterns.newline / handlenewline +local anything = P(1) local open = P('<') local close = P('>') local squote = S("'") @@ -897,67 +940,9 @@ local name = name_yes + name_nop local utfbom = lpegpatterns.utfbom -- no capture local spacing = C(space^0) ------ entitycontent = (1-open-semicolon)^0 -local anyentitycontent = (1-open-semicolon-space-close-ampersand)^0 -local hexentitycontent = R("AF","af","09")^1 -local decentitycontent = R("09")^1 -local parsedentity = P("#")/"" * ( - P("x")/"" * (hexentitycontent/handle_hex_entity) + - (decentitycontent/handle_dec_entity) - ) + (anyentitycontent/handle_any_entity_dtd) -- can be Cc(true) -local parsedentity_text= P("#")/"" * ( - P("x")/"" * (hexentitycontent/handle_hex_entity) + - (decentitycontent/handle_dec_entity) - ) + (anyentitycontent/handle_any_entity_text) -- can be Cc(false) ------ entity = ampersand/"" * parsedentity * ( (semicolon/"") + #(P(1)/handle_end_entity)) -local entity = (ampersand/"") * parsedentity * (semicolon/"") - + ampersand * (anyentitycontent / handle_end_entity) -local entity_text = (ampersand/"") * parsedentity_text * (semicolon/"") - + ampersand * (anyentitycontent / handle_end_entity) - -local text_unparsed = C((1-open)^1) -local text_parsed = (Cs((1-open-ampersand)^1)/add_text + Cs(entity_text)/add_text)^1 - -local somespace = space^1 -local optionalspace = space^0 - ------ value = (squote * C((1 - squote)^0) * squote) + (dquote * C((1 - dquote)^0) * dquote) -- ampersand and < also invalid in value -local value = (squote * Cs((entity + (1 - squote))^0) * squote) + (dquote * Cs((entity + (1 - dquote))^0) * dquote) -- ampersand and < also invalid in value - -local endofattributes = slash * close + close -- recovery of flacky html -local whatever = space * name * optionalspace * equal ------ wrongvalue = C(P(1-whatever-close)^1 + P(1-close)^1) / attribute_value_error ------ wrongvalue = C(P(1-whatever-endofattributes)^1 + P(1-endofattributes)^1) / attribute_value_error ------ wrongvalue = C(P(1-space-endofattributes)^1) / attribute_value_error -local wrongvalue = Cs(P(entity + (1-space-endofattributes))^1) / attribute_value_error - -local attributevalue = value + wrongvalue - -local attribute = (somespace * name * optionalspace * equal * optionalspace * attributevalue) / add_attribute ------ attributes = (attribute)^0 - -local attributes = (attribute + somespace^-1 * (((1-endofattributes)^1)/attribute_specification_error))^0 - -local parsedtext = text_parsed -- / add_text -local unparsedtext = text_unparsed / add_text -local balanced = P { "[" * ((1 - S"[]") + V(1))^0 * "]" } -- taken from lpeg manual, () example - -local emptyelement = (spacing * open * name * attributes * optionalspace * slash * close) / add_empty -local beginelement = (spacing * open * name * attributes * optionalspace * close) / add_begin -local endelement = (spacing * open * slash * name * optionalspace * close) / add_end - --- todo: combine the opens in: - -local begincomment = open * P("!--") -local endcomment = P("--") * close -local begininstruction = open * P("?") -local endinstruction = P("?") * close -local begincdata = open * P("![CDATA[") -local endcdata = P("]]") * close - -local someinstruction = C((1 - endinstruction)^0) -local somecomment = C((1 - endcomment )^0) -local somecdata = C((1 - endcdata )^0) +local space_nl = spacetab + newline +local spacing_nl = Cs((space_nl)^0) +local anything_nl = newline + P(1) local function weirdentity(k,v) if trace_entities then @@ -984,97 +969,177 @@ local function publicentity(k,v,n) entities[k] = v end --- todo: separate dtd parser +local function install(spacenewline,spacing,anything) -local begindoctype = open * P("!DOCTYPE") -local enddoctype = close -local beginset = P("[") -local endset = P("]") -local wrdtypename = C((1-somespace-P(";"))^1) -local doctypename = C((1-somespace-close)^0) -local elementdoctype = optionalspace * P("<!ELEMENT") * (1-close)^0 * close + local anyentitycontent = (1-open-semicolon-space-close-ampersand)^0 + local hexentitycontent = R("AF","af","09")^1 + local decentitycontent = R("09")^1 + local parsedentity = P("#")/"" * ( + P("x")/"" * (hexentitycontent/handle_hex_entity) + + (decentitycontent/handle_dec_entity) + ) + (anyentitycontent/handle_any_entity_dtd) -- can be Cc(true) + local parsedentity_text= P("#")/"" * ( + P("x")/"" * (hexentitycontent/handle_hex_entity) + + (decentitycontent/handle_dec_entity) + ) + (anyentitycontent/handle_any_entity_text) -- can be Cc(false) + local entity = (ampersand/"") * parsedentity * (semicolon/"") + + ampersand * (anyentitycontent / handle_end_entity) + local entity_text = (ampersand/"") * parsedentity_text * (semicolon/"") + + ampersand * (anyentitycontent / handle_end_entity) -local basiccomment = begincomment * ((1 - endcomment)^0) * endcomment + local text_unparsed = Cs((anything-open)^1) + local text_parsed = (Cs((anything-open-ampersand)^1)/add_text + Cs(entity_text)/add_text)^1 -local weirdentitytype = P("%") * (somespace * doctypename * somespace * value) / weirdentity -local normalentitytype = (doctypename * somespace * value) / normalentity -local publicentitytype = (doctypename * somespace * P("PUBLIC") * somespace * value)/publicentity -local systementitytype = (doctypename * somespace * P("SYSTEM") * somespace * value * somespace * P("NDATA") * somespace * doctypename)/systementity -local entitydoctype = optionalspace * P("<!ENTITY") * somespace * (systementitytype + publicentitytype + normalentitytype + weirdentitytype) * optionalspace * close + local somespace = (spacenewline)^1 + local optionalspace = (spacenewline)^0 -local function weirdresolve(s) - lpegmatch(entitydoctype,parameters[s]) -end + local value = (squote * Cs((entity + (anything - squote))^0) * squote) + (dquote * Cs((entity + (anything - dquote))^0) * dquote) -- ampersand and < also invalid in value -local function normalresolve(s) - lpegmatch(entitydoctype,entities[s]) -end + local endofattributes = slash * close + close -- recovery of flacky html + local whatever = space * name * optionalspace * equal + local wrongvalue = Cs(P(entity + (1-space-endofattributes))^1) / attribute_value_error -local entityresolve = P("%") * (wrdtypename/weirdresolve ) * P(";") - + P("&") * (wrdtypename/normalresolve) * P(";") + local attributevalue = value + wrongvalue -entitydoctype = entitydoctype + entityresolve + local attribute = (somespace * name * optionalspace * equal * optionalspace * attributevalue) / add_attribute --- we accept comments in doctypes +-- local attributes = (attribute + somespace^-1 * (((1-endofattributes)^1)/attribute_specification_error))^0 + local attributes = (attribute + somespace^-1 * (((anything-endofattributes)^1)/attribute_specification_error))^0 -local doctypeset = beginset * optionalspace * P(elementdoctype + entitydoctype + entityresolve + basiccomment + space)^0 * optionalspace * endset -local definitiondoctype= doctypename * somespace * doctypeset -local publicdoctype = doctypename * somespace * P("PUBLIC") * somespace * value * somespace * value * somespace * doctypeset -local systemdoctype = doctypename * somespace * P("SYSTEM") * somespace * value * somespace * doctypeset -local simpledoctype = (1-close)^1 -- * balanced^0 -local somedoctype = C((somespace * (publicdoctype + systemdoctype + definitiondoctype + simpledoctype) * optionalspace)^0) + local parsedtext = text_parsed -- / add_text + local unparsedtext = text_unparsed / add_text + local balanced = P { "[" * ((anything - S"[]") + V(1))^0 * "]" } -- taken from lpeg manual, () example -local instruction = (spacing * begininstruction * someinstruction * endinstruction) / function(...) add_special("@pi@",...) end -local comment = (spacing * begincomment * somecomment * endcomment ) / function(...) add_special("@cm@",...) end -local cdata = (spacing * begincdata * somecdata * endcdata ) / function(...) add_special("@cd@",...) end -local doctype = (spacing * begindoctype * somedoctype * enddoctype ) / function(...) add_special("@dt@",...) end + local emptyelement = (spacing * open * name * attributes * optionalspace * slash * close) / add_empty + local beginelement = (spacing * open * name * attributes * optionalspace * close) / add_begin + local endelement = (spacing * open * slash * name * optionalspace * close) / add_end -local crap_parsed = 1 - beginelement - endelement - emptyelement - begininstruction - begincomment - begincdata - ampersand -local crap_unparsed = 1 - beginelement - endelement - emptyelement - begininstruction - begincomment - begincdata -local parsedcrap = Cs((crap_parsed^1 + entity_text)^1) / handle_crap_error -local parsedcrap = Cs((crap_parsed^1 + entity_text)^1) / handle_crap_error -local unparsedcrap = Cs((crap_unparsed )^1) / handle_crap_error + -- todo: combine the opens in: --- nicer but slower: --- --- local instruction = (Cc("@pi@") * spacing * begininstruction * someinstruction * endinstruction) / add_special --- local comment = (Cc("@cm@") * spacing * begincomment * somecomment * endcomment ) / add_special --- local cdata = (Cc("@cd@") * spacing * begincdata * somecdata * endcdata ) / add_special --- local doctype = (Cc("@dt@") * spacing * begindoctype * somedoctype * enddoctype ) / add_special + local begincomment = open * P("!--") + local endcomment = P("--") * close + local begininstruction = open * P("?") + local endinstruction = P("?") * close + local begincdata = open * P("![CDATA[") + local endcdata = P("]]") * close -local trailer = space^0 * (text_unparsed/set_message)^0 + local someinstruction = C((anything - endinstruction)^0) + local somecomment = C((anything - endcomment )^0) + local somecdata = C((anything - endcdata )^0) --- comment + emptyelement + text + cdata + instruction + V("parent"), -- 6.5 seconds on 40 MB database file --- text + comment + emptyelement + cdata + instruction + V("parent"), -- 5.8 --- text + V("parent") + emptyelement + comment + cdata + instruction, -- 5.5 + -- todo: separate dtd parser --- local grammar_parsed_text = P { "preamble", --- preamble = utfbom^0 * instruction^0 * (doctype + comment + instruction)^0 * V("parent") * trailer, --- parent = beginelement * V("children")^0 * endelement, --- children = parsedtext + V("parent") + emptyelement + comment + cdata + instruction + parsedcrap, --- } + local begindoctype = open * P("!DOCTYPE") + local enddoctype = close + local beginset = P("[") + local endset = P("]") + local wrdtypename = C((anything-somespace-P(";"))^1) + local doctypename = C((anything-somespace-close)^0) + local elementdoctype = optionalspace * P("<!ELEMENT") * (anything-close)^0 * close -grammar_parsed_text_one = P { "preamble", - preamble = utfbom^0 * instruction^0 * (doctype + comment + instruction)^0, -} + local basiccomment = begincomment * ((anything - endcomment)^0) * endcomment -grammar_parsed_text_two = P { "followup", - followup = V("parent") * trailer, - parent = beginelement * V("children")^0 * endelement, - children = parsedtext + V("parent") + emptyelement + comment + cdata + instruction + parsedcrap, -} + local weirdentitytype = P("%") * (somespace * doctypename * somespace * value) / weirdentity + local normalentitytype = (doctypename * somespace * value) / normalentity + local publicentitytype = (doctypename * somespace * P("PUBLIC") * somespace * value)/publicentity + local systementitytype = (doctypename * somespace * P("SYSTEM") * somespace * value * somespace * P("NDATA") * somespace * doctypename)/systementity + local entitydoctype = optionalspace * P("<!ENTITY") * somespace * (systementitytype + publicentitytype + normalentitytype + weirdentitytype) * optionalspace * close -local grammar_unparsed_text = P { "preamble", - preamble = utfbom^0 * instruction^0 * (doctype + comment + instruction)^0 * V("parent") * trailer, - parent = beginelement * V("children")^0 * endelement, - children = unparsedtext + V("parent") + emptyelement + comment + cdata + instruction + unparsedcrap, -} + local function weirdresolve(s) + lpegmatch(entitydoctype,parameters[s]) + end + + local function normalresolve(s) + lpegmatch(entitydoctype,entities[s]) + end + + local entityresolve = P("%") * (wrdtypename/weirdresolve ) * P(";") + + P("&") * (wrdtypename/normalresolve) * P(";") + + entitydoctype = entitydoctype + entityresolve + + -- we accept comments in doctypes + + local doctypeset = beginset * optionalspace * P(elementdoctype + entitydoctype + entityresolve + basiccomment + space)^0 * optionalspace * endset + local definitiondoctype= doctypename * somespace * doctypeset + local publicdoctype = doctypename * somespace * P("PUBLIC") * somespace * value * somespace * value * somespace * doctypeset + local systemdoctype = doctypename * somespace * P("SYSTEM") * somespace * value * somespace * doctypeset + local simpledoctype = (anything-close)^1 -- * balanced^0 + local somedoctype = C((somespace * (publicdoctype + systemdoctype + definitiondoctype + simpledoctype) * optionalspace)^0) + + local instruction = (spacing * begininstruction * someinstruction * endinstruction) / function(...) add_special("@pi@",...) end + local comment = (spacing * begincomment * somecomment * endcomment ) / function(...) add_special("@cm@",...) end + local cdata = (spacing * begincdata * somecdata * endcdata ) / function(...) add_special("@cd@",...) end + local doctype = (spacing * begindoctype * somedoctype * enddoctype ) / function(...) add_special("@dt@",...) end + + local crap_parsed = anything - beginelement - endelement - emptyelement - begininstruction - begincomment - begincdata - ampersand + local crap_unparsed = anything - beginelement - endelement - emptyelement - begininstruction - begincomment - begincdata + + local parsedcrap = Cs((crap_parsed^1 + entity_text)^1) / handle_crap_error + local parsedcrap = Cs((crap_parsed^1 + entity_text)^1) / handle_crap_error + local unparsedcrap = Cs((crap_unparsed )^1) / handle_crap_error + + -- nicer but slower: + -- + -- local instruction = (Cc("@pi@") * spacing * begininstruction * someinstruction * endinstruction) / add_special + -- local comment = (Cc("@cm@") * spacing * begincomment * somecomment * endcomment ) / add_special + -- local cdata = (Cc("@cd@") * spacing * begincdata * somecdata * endcdata ) / add_special + -- local doctype = (Cc("@dt@") * spacing * begindoctype * somedoctype * enddoctype ) / add_special + + local trailer = space^0 * (text_unparsed/set_message)^0 + + -- comment + emptyelement + text + cdata + instruction + V("parent"), -- 6.5 seconds on 40 MB database file + -- text + comment + emptyelement + cdata + instruction + V("parent"), -- 5.8 + -- text + V("parent") + emptyelement + comment + cdata + instruction, -- 5.5 + + -- local grammar_parsed_text = P { "preamble", + -- preamble = utfbom^0 * instruction^0 * (doctype + comment + instruction)^0 * V("parent") * trailer, + -- parent = beginelement * V("children")^0 * endelement, + -- children = parsedtext + V("parent") + emptyelement + comment + cdata + instruction + parsedcrap, + -- } + + local grammar_parsed_text_one = P { "preamble", + preamble = utfbom^0 * instruction^0 * (doctype + comment + instruction)^0, + } + + local grammar_parsed_text_two = P { "followup", + followup = V("parent") * trailer, + parent = beginelement * V("children")^0 * endelement, + children = parsedtext + V("parent") + emptyelement + comment + cdata + instruction + parsedcrap, + } + + local grammar_unparsed_text = P { "preamble", + preamble = utfbom^0 * instruction^0 * (doctype + comment + instruction)^0 * V("parent") * trailer, + parent = beginelement * V("children")^0 * endelement, + children = unparsedtext + V("parent") + emptyelement + comment + cdata + instruction + unparsedcrap, + } + + return grammar_parsed_text_one, grammar_parsed_text_two, grammar_unparsed_text + +end + +grammar_parsed_text_one_nop , +grammar_parsed_text_two_nop , +grammar_unparsed_text_nop = install(space, spacing, anything) + +grammar_parsed_text_one_yes , +grammar_parsed_text_two_yes , +grammar_unparsed_text_yes = install(space_nl, spacing_nl, anything_nl) -- maybe we will add settings to result as well -local function _xmlconvert_(data,settings) +local function _xmlconvert_(data,settings,detail) settings = settings or { } -- no_root strip_cm_and_dt given_entities parent_root error_handler preparexmlstate(settings) + if settings.linenumbers then + grammar_parsed_text_one = grammar_parsed_text_one_yes + grammar_parsed_text_two = grammar_parsed_text_two_yes + grammar_unparsed_text = grammar_unparsed_text_yes + else + grammar_parsed_text_one = grammar_parsed_text_one_nop + grammar_parsed_text_two = grammar_parsed_text_two_nop + grammar_unparsed_text = grammar_unparsed_text_nop + end local preprocessor = settings.preprocessor if data and data ~= "" and type(preprocessor) == "function" then data = preprocessor(data,settings) or data -- settings.currentresource @@ -1091,6 +1156,8 @@ local function _xmlconvert_(data,settings) nt = 0 if not data or data == "" then errorstr = "empty xml file" + elseif data == true then + errorstr = detail or "problematic xml file" elseif utfize or resolve then local m = lpegmatch(grammar_parsed_text_one,data) if m then @@ -1113,7 +1180,7 @@ local function _xmlconvert_(data,settings) end local result if errorstr and errorstr ~= "" then - result = { dt = { { ns = "", tg = "error", dt = { errorstr }, at={ }, er = true } } } + result = { dt = { { ns = "", tg = "error", dt = { errorstr }, at = { }, er = true } } } setmetatable(result, mt) setmetatable(result.dt[1], mt) setmetatable(stack, mt) @@ -1125,7 +1192,7 @@ local function _xmlconvert_(data,settings) if errorhandler then local currentresource = settings.currentresource if currentresource and currentresource ~= "" then - xml.errorhandler(formatters["load error in [%s]: %s"](currentresource,errorstr)) + xml.errorhandler(formatters["load error in [%s]: %s"](currentresource,errorstr),currentresource) else xml.errorhandler(formatters["load error: %s"](errorstr)) end @@ -1172,8 +1239,10 @@ local function xmlconvert(data,settings) local ok, result = pcall(function() return _xmlconvert_(data,settings) end) if ok then return result + elseif type(result) == "string" then + return _xmlconvert_(true,settings,result) else - return _xmlconvert_("",settings) + return _xmlconvert_(true,settings) end end diff --git a/tex/context/base/mkiv/lxml-tex.lua b/tex/context/base/mkiv/lxml-tex.lua index 582185ba8..f1abab9e7 100644 --- a/tex/context/base/mkiv/lxml-tex.lua +++ b/tex/context/base/mkiv/lxml-tex.lua @@ -17,6 +17,7 @@ local lpegmatch = lpeg.match local P, S, C, Cc, Cs = lpeg.P, lpeg.S, lpeg.C, lpeg.Cc, lpeg.Cs local patterns = lpeg.patterns local setmetatableindex = table.setmetatableindex +local formatters, strip = string.formatters, string.strip local tex, xml = tex, xml local lowerchars, upperchars, lettered = characters.lower, characters.upper, characters.lettered @@ -25,68 +26,73 @@ local basename, dirname, joinfile = file.basename, file.dirname, file.join lxml = lxml or { } local lxml = lxml -local catcodenumbers = catcodes.numbers -local ctxcatcodes = catcodenumbers.ctxcatcodes -- todo: use different method -local notcatcodes = catcodenumbers.notcatcodes -- todo: use different method - -local commands = commands -local context = context -local contextsprint = context.sprint -- with catcodes (here we use fast variants, but with option for tracing) - -local implement = interfaces.implement - -local xmlelements = xml.elements -local xmlcollected = xml.collected -local xmlsetproperty = xml.setproperty -local xmlwithelements = xml.withelements -local xmlserialize = xml.serialize -local xmlcollect = xml.collect -local xmltext = xml.text -local xmltostring = xml.tostring -local xmlapplylpath = xml.applylpath -local xmlunspecialized = xml.unspecialized -local xmldespecialized = xml.despecialized -- nicer in expanded xml -local xmlprivatetoken = xml.privatetoken -local xmlstripelement = xml.stripelement -local xmlinclusion = xml.inclusion -local xmlinclusions = xml.inclusions -local xmlbadinclusions = xml.badinclusions -local xmlcontent = xml.content -local xmllastmatch = xml.lastmatch -local xmlpushmatch = xml.pushmatch -local xmlpopmatch = xml.popmatch +local catcodenumbers = catcodes.numbers +local ctxcatcodes = catcodenumbers.ctxcatcodes -- todo: use different method +local notcatcodes = catcodenumbers.notcatcodes -- todo: use different method + +local commands = commands +local context = context +local contextsprint = context.sprint -- with catcodes (here we use fast variants, but with option for tracing) + +local synctex = luatex.synctex + +local implement = interfaces.implement + +local xmlelements = xml.elements +local xmlcollected = xml.collected +local xmlsetproperty = xml.setproperty +local xmlwithelements = xml.withelements +local xmlserialize = xml.serialize +local xmlcollect = xml.collect +local xmltext = xml.text +local xmltostring = xml.tostring +local xmlapplylpath = xml.applylpath +local xmlunspecialized = xml.unspecialized +local xmldespecialized = xml.despecialized -- nicer in expanded xml +local xmlprivatetoken = xml.privatetoken +local xmlstripelement = xml.stripelement +local xmlinclusion = xml.inclusion +local xmlinclusions = xml.inclusions +local xmlbadinclusions = xml.badinclusions +local xmlcontent = xml.content +local xmllastmatch = xml.lastmatch +local xmlpushmatch = xml.pushmatch +local xmlpopmatch = xml.popmatch +local xmlstring = xml.string +local xmlserializetotext = xml.serializetotext +local xmlrename = xml.rename + +local variables = interfaces and interfaces.variables or { } + +local settings_to_hash = utilities.parsers.settings_to_hash +local settings_to_set = utilities.parsers.settings_to_set +local options_to_hash = utilities.parsers.options_to_hash +local options_to_array = utilities.parsers.options_to_array + +local insertbeforevalue = utilities.tables.insertbeforevalue +local insertaftervalue = utilities.tables.insertaftervalue + +local resolveprefix = resolvers.resolve + +local starttiming = statistics.starttiming +local stoptiming = statistics.stoptiming + +local trace_setups = false trackers.register("lxml.setups", function(v) trace_setups = v end) +local trace_loading = false trackers.register("lxml.loading", function(v) trace_loading = v end) +local trace_access = false trackers.register("lxml.access", function(v) trace_access = v end) +local trace_comments = false trackers.register("lxml.comments", function(v) trace_comments = v end) +local trace_entities = false trackers.register("xml.entities", function(v) trace_entities = v end) +local trace_selectors = false trackers.register("lxml.selectors",function(v) trace_selectors = v end) + +local report_lxml = logs.reporter("lxml","tex") +local report_xml = logs.reporter("xml","tex") + +local forceraw = false + +local p_texescape = patterns.texescape directives.enable("xml.path.keeplastmatch") -local variables = interfaces and interfaces.variables or { } - -local settings_to_hash = utilities.parsers.settings_to_hash -local settings_to_set = utilities.parsers.settings_to_set -local options_to_hash = utilities.parsers.options_to_hash -local options_to_array = utilities.parsers.options_to_array - -local insertbeforevalue = utilities.tables.insertbeforevalue -local insertaftervalue = utilities.tables.insertaftervalue - -local resolveprefix = resolvers.resolve - -local starttiming = statistics.starttiming -local stoptiming = statistics.stoptiming - -local trace_setups = false trackers.register("lxml.setups", function(v) trace_setups = v end) -local trace_loading = false trackers.register("lxml.loading", function(v) trace_loading = v end) -local trace_access = false trackers.register("lxml.access", function(v) trace_access = v end) -local trace_comments = false trackers.register("lxml.comments", function(v) trace_comments = v end) -local trace_entities = false trackers.register("xml.entities", function(v) trace_entities = v end) -local trace_selectors = false trackers.register("lxml.selectors",function(v) trace_selectors = v end) - -local report_lxml = logs.reporter("lxml","tex") -local report_xml = logs.reporter("xml","tex") - -local forceraw = false - -local p_texescape = patterns.texescape - -- tex entities lxml.entities = lxml.entities or { } @@ -196,8 +202,8 @@ end -- tex interface -lxml.loaded = lxml.loaded or { } -local loaded = lxml.loaded +local loaded = lxml.loaded or { } +lxml.loaded = loaded -- print(contextdirective("context-mathml-directive function reduction yes ")) -- print(contextdirective("context-mathml-directive function ")) @@ -317,6 +323,40 @@ end -- storage +do + + local noferrors = 0 + local errors = setmetatableindex("number") + local errorhandler = xml.errorhandler + + function xml.errorhandler(message,filename) + if filename and filename ~= "" then + noferrors = noferrors + 1 + errors[filename] = errors[filename] + 1 + end + errorhandler(filename) + end + + logs.registerfinalactions(function() + if noferrors > 0 then + local report = logs.startfilelogging("lxml","problematic xml files") + for k, v in table.sortedhash(errors) do + report("%4i %s",v,k) + end + logs.stopfilelogging() + -- + if logs.loggingerrors() then + logs.starterrorlogging(report,"problematic xml files") + for k, v in table.sortedhash(errors) do + report("%4i %s",v,k) + end + logs.stoperrorlogging() + end + end + end) + +end + function lxml.store(id,root,filename) loaded[id] = root xmlsetproperty(root,"name",id) @@ -481,13 +521,19 @@ end xml.originalload = xml.originalload or xml.load -local noffiles, nofconverted = 0, 0 +local noffiles = 0 +local nofconverted = 0 +local linenumbers = false + +synctex.registerenabler (function() linenumbers = true end) +synctex.registerdisabler(function() linenumbers = false end) function xml.load(filename,settings) noffiles, nofconverted = noffiles + 1, nofconverted + 1 starttiming(xml) local ok, data = resolvers.loadbinfile(filename) settings = settings or { } + settings.linenumbers = linenumbers settings.currentresource = filename local xmltable = xml.convert((ok and data) or "",settings) settings.currentresource = nil @@ -528,6 +574,7 @@ local function lxmlconvert(id,data,compress,currentresource) resolve_entities = function(str,ent) return entityconverter(id,str,ent) end, currentresource = tostring(currentresource or id), preprocessor = lxml.preprocessor, + linenumbers = linenumbers, } if compress and compress == variables.yes then settings.strip_cm_and_dt = true @@ -545,7 +592,8 @@ function lxml.load(id,filename,compress) noffiles, nofconverted = noffiles + 1, nofconverted + 1 starttiming(xml) local ok, data = resolvers.loadbinfile(filename) - local xmltable = lxmlconvert(id,(ok and data) or "",compress,format("id: %s, file: %s",id,filename)) + -- local xmltable = lxmlconvert(id,(ok and data) or "",compress,formatters["id: %s, file: %s"](id,filename)) + local xmltable = lxmlconvert(id,(ok and data) or "",compress,filename) stoptiming(xml) lxml.store(id,xmltable,filename) return xmltable, filename @@ -587,19 +635,19 @@ function lxml.include(id,pattern,attribute,options) filename = resolveprefix(filename) or filename end -- some protection - if options.rootpath then - if dirname(filename) == "" and root.filename then - local dn = dirname(root.filename) - if dn ~= "" then - filename = joinfile(dn,filename) - end + if options.rootpath and dirname(filename) == "" and root.filename then + local dn = dirname(root.filename) + if dn ~= "" then + filename = joinfile(dn,filename) end end if trace_loading then report_lxml("including file %a",filename) end noffiles, nofconverted = noffiles + 1, nofconverted + 1 - return resolvers.loadtexfile(filename) or "" + return + resolvers.loadtexfile(filename) or "", + resolvers.findtexfile(filename) or "" else return "" end @@ -607,10 +655,10 @@ function lxml.include(id,pattern,attribute,options) stoptiming(xml) end -function lxml.inclusion(id,default) +function lxml.inclusion(id,default,base) local inclusion = xmlinclusion(getid(id),default) if inclusion then - context(inclusion) + context(base and basename(inclusion) or inclusion) end end @@ -694,7 +742,32 @@ local default_element_handler = xml.gethandlers("verbose").functions["@el@"] -- return v -- end) +local setfilename = false +local trace_name = false +local report_name = logs.reporter("lxml") + +synctex.registerenabler (function() setfilename = synctex.setfilename end) +synctex.registerdisabler(function() setfilename = false end) + +local function syncfilename(e,where) + local cf = e.cf + if cf then + local cl = e.cl or 1 + if trace_name then + report_name("set filename, case %a, tag %a, file %a, line %a",where,e.tg,cf,cl) + end + setfilename(cf,cl); + end +end + +trackers.register("system.synctex.xml",function(v) + trace_name = v +end) + local function tex_element(e,handlers) + if setfilename then + syncfilename(e,"element") + end local command = e.command if command == nil then default_element_handler(e,handlers) @@ -895,11 +968,14 @@ function lxml.setaction(id,pattern,action) end end -local function sprint(root) -- check rawroot usage +local function sprint(root,p) -- check rawroot usage if root then local tr = type(root) if tr == "string" then -- can also be result of lpath -- rawroot = false -- ? + if setfilename and p then + syncfilename(p,"sprint s") + end root = xmlunspecialized(root) lpegmatch(xmltextcapture,root) elseif tr == "table" then @@ -910,12 +986,32 @@ local function sprint(root) -- check rawroot usage root = xmldespecialized(xmltostring(root)) lpegmatch(xmltextcapture,root) -- goes to toc else +if setfilename and p then -- and not root.cl + syncfilename(p,"sprint t") +end xmlserialize(root,xmltexhandler) end end end end +-- local function tprint(root) -- we can move sprint inline +-- local tr = type(root) +-- if tr == "table" then +-- local n = #root +-- if n == 0 then +-- -- skip +-- else +-- for i=1,n do +-- sprint(root[i]) +-- end +-- end +-- elseif tr == "string" then +-- root = xmlunspecialized(root) +-- lpegmatch(xmltextcapture,root) +-- end +-- end + local function tprint(root) -- we can move sprint inline local tr = type(root) if tr == "table" then @@ -924,7 +1020,24 @@ local function tprint(root) -- we can move sprint inline -- skip else for i=1,n do - sprint(root[i]) + -- sprint(root[i]) -- inlined because of filename: + local ri = root[i] + local tr = type(ri) + if tr == "string" then -- can also be result of lpath + if setfilename then + syncfilename(ri,"tprint") + end + root = xmlunspecialized(ri) + lpegmatch(xmltextcapture,ri) + elseif tr == "table" then + if forceraw then + rawroot = ri + root = xmldespecialized(xmltostring(ri)) + lpegmatch(xmltextcapture,ri) -- goes to toc + else + xmlserialize(ri,xmltexhandler) + end + end end end elseif tr == "string" then @@ -942,6 +1055,9 @@ local function cprint(root) -- content root = xmlunspecialized(root) lpegmatch(xmltextcapture,root) else + if setfilename then + syncfilename(root,"cprint") + end local rootdt = root.dt if forceraw then rawroot = root @@ -961,7 +1077,8 @@ xml.cprint = cprint local xmlcprint = cprint -- calls ct mathml -> will be re -- now we can flush function lxml.main(id) - xmlserialize(getid(id),xmltexhandler) -- the real root (@rt@) + local root = getid(id) + xmlserialize(root,xmltexhandler) -- the real root (@rt@) end -- -- lines (untested) @@ -1149,7 +1266,7 @@ function lxml.setsetup(id,pattern,setup) report_lxml("%s lpath matches for pattern: %s","no",pattern) end else - local a, b = match(setup,"^(.+:)([%*%-])$") + local a, b = match(setup,"^(.+:)([%*%-%+])$") if a and b then local collected = xmlapplylpath(getid(id),pattern) if collected then @@ -1327,7 +1444,7 @@ end local function command(collected,cmd,otherwise) local n = collected and #collected if n and n > 0 then - local wildcard = find(cmd,"%*") + local wildcard = find(cmd,"*",1,true) for c=1,n do -- maybe optimize for n=1 local e = collected[c] local ix = e.ix @@ -1351,7 +1468,7 @@ end -- local wildcards = setmetatableindex(function(t,k) -- local v = false --- if find(k,"%*") then +-- if find(k,"*",1,true) then -- v = setmetatableindex(function(t,kk) -- local v = gsub(k,"%*",kk) -- t[k] = v @@ -1400,6 +1517,18 @@ local function attribute(collected,a,default) end end +local function parameter(collected,p,default) + if collected and #collected > 0 then + local pa = collected[1].pa + local str = (pa and pa[p]) or default + if str and str ~= "" then + contextsprint(notcatcodes,str) + end + elseif default then + contextsprint(notcatcodes,default) + end +end + local function chainattribute(collected,arguments,default) -- todo: optional levels if collected and #collected > 0 then local e = collected[1] @@ -1556,6 +1685,8 @@ texfinalizers.reverse = reverse texfinalizers.count = count texfinalizers.command = command texfinalizers.attribute = attribute +texfinalizers.param = parameter +texfinalizers.parameter = parameter texfinalizers.text = text texfinalizers.stripped = stripped texfinalizers.lower = lower @@ -1690,6 +1821,15 @@ function lxml.attribute(id,pattern,a,default) end end +function lxml.parameter(id,pattern,p,default) + local collected = xmlapplylpath(getid(id),pattern) + if collected then + parameter(collected,p,default) + end +end + +lxml.param = lxml.parameter + function lxml.raw(id,pattern) -- the content, untouched by commands local collected = (pattern and xmlapplylpath(getid(id),pattern)) or getid(id) if collected and #collected > 0 then @@ -1794,45 +1934,6 @@ function lxml.pos(id) contextsprint(ctxcatcodes,e and e.ni or 0) end --- function lxml.att(id,a,default) --- local root = getid(id) --- if root then --- local at = root.at --- local str = (at and at[a]) or default --- if str and str ~= "" then --- contextsprint(notcatcodes,str) --- end --- elseif default then --- contextsprint(notcatcodes,default) --- end --- end --- --- no need for an assignment so: - --- function lxml.att(id,a,default) --- local e = getid(id) --- if e then --- local at = e.at --- if at then --- -- normally always true --- local str = at[a] --- if not str then --- if default and default ~= "" then --- contextsprint(notcatcodes,default) --- end --- elseif str ~= "" then --- contextsprint(notcatcodes,str) --- else --- -- explicit empty is valid --- end --- elseif default and default ~= "" then --- contextsprint(notcatcodes,default) --- end --- elseif default and default ~= "" then --- contextsprint(notcatcodes,default) --- end --- end - do local att @@ -1890,6 +1991,45 @@ do end +do + + local par + + function lxml.par(id,p,default) + local e = getid(id) + if e then + local pa = e.pa + if pa then + -- normally always true + par = pa[p] + if not par then + if default and default ~= "" then + par = default + contextsprint(notcatcodes,default) + end + elseif par ~= "" then + contextsprint(notcatcodes,par) + else + -- explicit empty is valid + end + elseif default and default ~= "" then + par = default + contextsprint(notcatcodes,default) + end + elseif default and default ~= "" then + par = default + contextsprint(notcatcodes,default) + else + par = "" + end + end + + function lxml.lastpar() + contextsprint(notcatcodes,par) + end + +end + function lxml.name(id) local e = getid(id) if e then @@ -1932,7 +2072,7 @@ function lxml.flush(id) if e then local dt = e.dt if dt then - xmlsprint(dt) + xmlsprint(dt,e) end end end @@ -1954,7 +2094,7 @@ function lxml.snippet(id,i) if dt then local dti = dt[i] if dti then - xmlsprint(dti) + xmlsprint(dti,e) end end end @@ -1999,33 +2139,37 @@ end -- testers -local found, empty = xml.found, xml.empty +do -local doif, doifnot, doifelse = commands.doif, commands.doifnot, commands.doifelse + local found, empty = xml.found, xml.empty -function lxml.doif (id,pattern) doif (found(getid(id),pattern)) end -function lxml.doifnot (id,pattern) doifnot (found(getid(id),pattern)) end -function lxml.doifelse (id,pattern) doifelse(found(getid(id),pattern)) end -function lxml.doiftext (id,pattern) doif (not empty(getid(id),pattern)) end -function lxml.doifnottext (id,pattern) doifnot (not empty(getid(id),pattern)) end -function lxml.doifelsetext (id,pattern) doifelse(not empty(getid(id),pattern)) end + local doif, doifnot, doifelse = commands.doif, commands.doifnot, commands.doifelse --- special case: "*" and "" -> self else lpath lookup + function lxml.doif (id,pattern) doif (found(getid(id),pattern)) end + function lxml.doifnot (id,pattern) doifnot (found(getid(id),pattern)) end + function lxml.doifelse (id,pattern) doifelse(found(getid(id),pattern)) end + function lxml.doiftext (id,pattern) doif (not empty(getid(id),pattern)) end + function lxml.doifnottext (id,pattern) doifnot (not empty(getid(id),pattern)) end + function lxml.doifelsetext (id,pattern) doifelse(not empty(getid(id),pattern)) end -local function checkedempty(id,pattern) - local e = getid(id) - if not pattern or pattern == "" then - local dt = e.dt - local nt = #dt - return (nt == 0) or (nt == 1 and dt[1] == "") - else - return empty(getid(id),pattern) + -- special case: "*" and "" -> self else lpath lookup + + local function checkedempty(id,pattern) + local e = getid(id) + if not pattern or pattern == "" then + local dt = e.dt + local nt = #dt + return (nt == 0) or (nt == 1 and dt[1] == "") + else + return empty(getid(id),pattern) + end end -end -function lxml.doifempty (id,pattern) doif (checkedempty(id,pattern)) end -function lxml.doifnotempty (id,pattern) doifnot (checkedempty(id,pattern)) end -function lxml.doifelseempty(id,pattern) doifelse(checkedempty(id,pattern)) end + function lxml.doifempty (id,pattern) doif (checkedempty(id,pattern)) end + function lxml.doifnotempty (id,pattern) doifnot (checkedempty(id,pattern)) end + function lxml.doifelseempty(id,pattern) doifelse(checkedempty(id,pattern)) end + +end -- status info @@ -2086,12 +2230,13 @@ function lxml.strip(id,pattern,nolines,anywhere) end function lxml.stripped(id,pattern,nolines) - local str = xmltext(getid(id),pattern) or "" + local root = getid(id) + local str = xmltext(root,pattern) or "" str = gsub(str,"^%s*(.-)%s*$","%1") if nolines then str = gsub(str,"%s+"," ") end - xmlsprint(str) + xmlsprint(str,root) end function lxml.delete(id,pattern) @@ -2154,13 +2299,23 @@ end texfinalizers.upperall = xmlfinalizers.upperall texfinalizers.lowerall = xmlfinalizers.lowerall -function lxml.tobuffer(id,pattern,name,unescaped) +function lxml.tobuffer(id,pattern,name,unescaped,contentonly) local collected = xmlapplylpath(getid(id),pattern) if collected then - if unescaped then - collected = xmlcontent(collected[1]) -- expanded entities ! + local collected = collected[1] + if unescaped == true then + -- expanded entities ! + if contentonly then + collected = xmlserializetotext(collected.dt) + else + collected = xmlcontent(collected) + end + elseif unescaped == false then + local t = { } + xmlstring(collected,function(s) t[#t+1] = s end) + collected = concat(t) else - collected = tostring(collected[1]) + collected = tostring(collected) end buffers.assign(name,collected) else @@ -2168,144 +2323,139 @@ function lxml.tobuffer(id,pattern,name,unescaped) end end --- relatively new: +-- parameters -local permitted = nil -local ctx_xmlinjector = context.xmlinjector +function lxml.setatt(id,name,value) + local e = getid(id) + if e then + local a = e.at + if a then + a[name] = value + else + e.at = { [name] = value } + end + end +end -xml.pihandlers["injector"] = function(category,rest,e) - local options = options_to_array(rest) - local action = options[1] - if not action then - return +function lxml.setpar(id,name,value) + local e = getid(id) + if e then + local p = e.pa + if p then + p[name] = value + else + e.pa = { [name] = value } + end end - local n = #options - if n > 1 then - local category = options[2] - if category == "*" then - ctx_xmlinjector(action) - elseif permitted then - if n == 2 then - if permitted[category] then - ctx_xmlinjector(action) - end - else - for i=2,n do - local category = options[i] - if category == "*" or permitted[category] then +end + +function lxml.setattribute(id,pattern,name,value) + local collected = xmlapplylpath(getid(id),pattern) + if collected then + for i=1,#collected do + setatt(collected[i],name,value) + end + end +end + +function lxml.setparameter(id,pattern,name,value) + local collected = xmlapplylpath(getid(id),pattern) + if collected then + for i=1,#collected do + setpar(collected[i],name,value) + end + end +end + +lxml.setparam = lxml.setparameter + +-- relatively new: + +do + + local permitted = nil + local ctx_xmlinjector = context.xmlinjector + + xml.pihandlers["injector"] = function(category,rest,e) + local options = options_to_array(rest) + local action = options[1] + if not action then + return + end + local n = #options + if n > 1 then + local category = options[2] + if category == "*" then + ctx_xmlinjector(action) + elseif permitted then + if n == 2 then + if permitted[category] then ctx_xmlinjector(action) - return + end + else + for i=2,n do + local category = options[i] + if category == "*" or permitted[category] then + ctx_xmlinjector(action) + return + end end end end + else + ctx_xmlinjector(action) end - else - ctx_xmlinjector(action) end -end -local pattern = P("context-") * C((1-patterns.whitespace)^1) * C(P(1)^1) + local pattern = P("context-") * C((1-patterns.whitespace)^1) * C(P(1)^1) -function lxml.applyselectors(id) - local root = getid(id) - local function filter(e) - local dt = e.dt - if not dt then - report_lxml("error in selector, no data in %a",e.tg or "?") - return - end - local ndt = #dt - local done = false - local i = 1 - while i <= ndt do - local dti = dt[i] - if type(dti) == "table" then - if dti.tg == "@pi@" then - local text = dti.dt[1] - local what, rest = lpegmatch(pattern,text) - if what == "select" then - local categories = options_to_hash(rest) - if categories["begin"] then - local okay = false - if permitted then - for k, v in next, permitted do - if categories[k] then - okay = k - break + function lxml.applyselectors(id) + local root = getid(id) + local function filter(e) + local dt = e.dt + if not dt then + report_lxml("error in selector, no data in %a",e.tg or "?") + return + end + local ndt = #dt + local done = false + local i = 1 + while i <= ndt do + local dti = dt[i] + if type(dti) == "table" then + if dti.tg == "@pi@" then + local text = dti.dt[1] + local what, rest = lpegmatch(pattern,text) + if what == "select" then + local categories = options_to_hash(rest) + if categories["begin"] then + local okay = false + if permitted then + for k, v in next, permitted do + if categories[k] then + okay = k + break + end end end - end - if okay then - if trace_selectors then - report_lxml("accepting selector: %s",okay) - end - else - categories.begin = false - if trace_selectors then - report_lxml("rejecting selector: % t",sortedkeys(categories)) - end - end - for j=i,ndt do - local dtj = dt[j] - if type(dtj) == "table" then - local tg = dtj.tg - if tg == "@pi@" then - local text = dtj.dt[1] - local what, rest = lpegmatch(pattern,text) - if what == "select" then - local categories = options_to_hash(rest) - if categories["end"] then - i = j - break - else - -- error - end - end - elseif not okay then - dtj.tg = "@cm@" + if okay then + if trace_selectors then + report_lxml("accepting selector: %s",okay) end else --- dt[j] = "" -- okay ? - end - end - end - elseif what == "include" then - local categories = options_to_hash(rest) - if categories["begin"] then - local okay = false - if permitted then - for k, v in next, permitted do - if categories[k] then - okay = k - break + categories.begin = false + if trace_selectors then + report_lxml("rejecting selector: % t",sortedkeys(categories)) end end - end - if okay then - if trace_selectors then - report_lxml("accepting include: %s",okay) - end - else - categories.begin = false - if trace_selectors then - report_lxml("rejecting include: % t",sortedkeys(categories)) - end - end - if okay then for j=i,ndt do local dtj = dt[j] if type(dtj) == "table" then local tg = dtj.tg - if tg == "@cm@" then - local content = dtj.dt[1] - local element = root and xml.toelement(content,root) - dt[j] = element - element.__p__ = dt -- needs checking - done = true - elseif tg == "@pi@" then + if tg == "@pi@" then local text = dtj.dt[1] local what, rest = lpegmatch(pattern,text) - if what == "include" then + if what == "select" then local categories = options_to_hash(rest) if categories["end"] then i = j @@ -2314,48 +2464,103 @@ function lxml.applyselectors(id) -- error end end + elseif not okay then + dtj.tg = "@cm@" + end + else + -- dt[j] = "" -- okay ? + end + end + end + elseif what == "include" then + local categories = options_to_hash(rest) + if categories["begin"] then + local okay = false + if permitted then + for k, v in next, permitted do + if categories[k] then + okay = k + break + end + end + end + if okay then + if trace_selectors then + report_lxml("accepting include: %s",okay) + end + else + categories.begin = false + if trace_selectors then + report_lxml("rejecting include: % t",sortedkeys(categories)) + end + end + if okay then + for j=i,ndt do + local dtj = dt[j] + if type(dtj) == "table" then + local tg = dtj.tg + if tg == "@cm@" then + local content = dtj.dt[1] + local element = root and xml.toelement(content,root) + dt[j] = element + element.__p__ = dt -- needs checking + done = true + elseif tg == "@pi@" then + local text = dtj.dt[1] + local what, rest = lpegmatch(pattern,text) + if what == "include" then + local categories = options_to_hash(rest) + if categories["end"] then + i = j + break + else + -- error + end + end + end end end end end + elseif dti then + filter(dti) end - elseif dti then - filter(dti) + end + if done then + -- probably not needed + xml.reindex(dt) end end - if done then - -- probably not needed - xml.reindex(dt) - end + i = i + 1 end - i = i + 1 end + xmlwithelements(root,filter) end - xmlwithelements(root,filter) -end -function xml.setinjectors(set) - local s = settings_to_set(set) - if permitted then - for k, v in next, s do - permitted[k] = true + function xml.setinjectors(set) + local s = settings_to_set(set) + if permitted then + for k, v in next, s do + permitted[k] = true + end + else + permitted = s end - else - permitted = s end -end -function xml.resetinjectors(set) - if permitted and set and set ~= "" then - local s = settings_to_set(set) - for k, v in next, s do - if v then - permitted[k] = nil + function xml.resetinjectors(set) + if permitted and set and set ~= "" then + local s = settings_to_set(set) + for k, v in next, s do + if v then + permitted[k] = nil + end end + else + permitted = nil end - else - permitted = nil end + end implement { @@ -2375,3 +2580,20 @@ implement { actions = lxml.applyselectors, arguments = "string" } + +-- bonus: see x-lmx-html.mkiv + +function texfinalizers.xml(collected,name,setup) + local root = collected[1] + if not root then + return + end + if not name or name == "" then + report_lxml("missing name in xml finalizer") + return + end + xmlrename(root,name) + name = "lmx:" .. name + buffers.assign(name,strip(xmltostring(root))) + context.xmlprocessbuffer(name,name,setup or (name..":setup")) +end diff --git a/tex/context/base/mkiv/lxml-xml.lua b/tex/context/base/mkiv/lxml-xml.lua index d0e256078..d1520800f 100644 --- a/tex/context/base/mkiv/lxml-xml.lua +++ b/tex/context/base/mkiv/lxml-xml.lua @@ -6,6 +6,7 @@ if not modules then modules = { } end modules ['lxml-xml'] = { license = "see context related readme files" } +local tonumber, next = tonumber, next local concat = table.concat local find, lower, upper = string.find, string.lower, string.upper @@ -161,6 +162,10 @@ local function xmltotext(root) end end +function xml.serializetotext(root) + return root and xmlserialize(root,xmltexthandler) or "" +end + -- local function text(collected) -- hybrid diff --git a/tex/context/base/mkiv/m-fonts-plugins.mkiv b/tex/context/base/mkiv/m-fonts-plugins.mkiv index ecb311694..b74b8c3d0 100644 --- a/tex/context/base/mkiv/m-fonts-plugins.mkiv +++ b/tex/context/base/mkiv/m-fonts-plugins.mkiv @@ -19,8 +19,10 @@ %D below should work in the generic loader too. It's anyhow an illustration of %D how \type {ffi} can work be used in a practical application. -\registerctxluafile{font-txt}{1.001} % generic text handler -\registerctxluafile{font-phb}{1.001} % harfbuzz plugin +% \enabletrackers[resolvers.ffilib] + +\registerctxluafile{font-txt}{} % generic text handler +\registerctxluafile{font-phb}{} % harfbuzz plugin \startluacode @@ -132,6 +134,8 @@ liga=yes, kern=yes] +% no tlig and no analyze + \definefontfeature [test-node] [mode=node, @@ -199,10 +203,11 @@ [arabic-uniscribe] [mode=plug, features=harfbuzz, - script=arab,language=dflt,ccmp=yes, - init=yes,medi=yes,fina=yes,isol=yes, - liga=yes,dlig=yes,rlig=yes,clig=yes,calt=yes, - mark=yes,mkmk=yes,kern=yes,curs=yes, + script=arab,language=dflt, +% ccmp=yes, +% init=yes,medi=yes,fina=yes,isol=yes, +% liga=yes,dlig=yes,rlig=yes,clig=yes,calt=yes, +% mark=yes,mkmk=yes,kern=yes,curs=yes, shaper=uniscribe] \starttexdefinition RunLatinTest #1#2#3#4#5 @@ -318,7 +323,7 @@ context.RunLatinTest (name, 100, "context", "base", "latin") context.RunLatinTest (name, 100, "context", "node", "latin") context.RunLatinTest (name, 100, "harfbuzz", "native", "latin") - -- context.RunLatinTest (name, 100, "harfbuzz", "uniscribe", "latin") + context.RunLatinTest (name, 100, "harfbuzz", "uniscribe", "latin") -- context.RunLatinTest (name, 1, "context", "text", "latin") -- context.RunLatinTest (name, 1, "harfbuzz", "binary", "latin") @@ -334,7 +339,8 @@ -- ARABIC local list = { - "arabtype" + "arabtype", + "husayni", } data.timings["arabic"] = { @@ -351,7 +357,7 @@ context.RunArabicTest (name, 100, "context", "base", "arabic") context.RunArabicTest (name, 100, "context", "node", "arabic") context.RunArabicTest (name, 100, "harfbuzz", "native", "arabic") - -- context.RunArabicTest (name, 100, "harfbuzz", "uniscribe", "arabic") + context.RunArabicTest (name, 100, "harfbuzz", "uniscribe", "arabic") -- context.RunArabicTest (name, 1, "context", "text", "arabic") -- context.RunArabicTest (name, 1, "harfbuzz", "binary", "arabic") @@ -367,7 +373,8 @@ -- MIXED local list = { - "arabtype" + "arabtype", + "husayni" } data.timings["mixed"] = { @@ -384,7 +391,7 @@ context.RunArabicTest (name, 100, "context", "base", "mixed") context.RunArabicTest (name, 100, "context", "node", "mixed") context.RunArabicTest (name, 100, "harfbuzz", "native", "mixed") - -- context.RunArabicTest (name, 100, "harfbuzz", "uniscribe", "mixed") + context.RunArabicTest (name, 100, "harfbuzz", "uniscribe", "mixed") -- context.RunArabicTest (name, 1, "context", "text", "mixed") -- context.RunArabicTest (name, 1, "harfbuzz", "binary", "mixed") diff --git a/tex/context/base/mkiv/m-oldotf.mkiv b/tex/context/base/mkiv/m-oldotf.mkiv deleted file mode 100644 index f860df712..000000000 --- a/tex/context/base/mkiv/m-oldotf.mkiv +++ /dev/null @@ -1,77 +0,0 @@ -%D \module -%D [ file=m-oldotf, -%D version=2015.07.08, -%D title=\CONTEXT\ Extra Modules, -%D subtitle=Traditional OTF Loader, -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] -%C -%C This module is part of the \CONTEXT\ macro||package and is -%C therefore copyrighted by \PRAGMA. See mreadme.pdf for -%C details. - -\unprotect - -\startluacode - local files = { - "font-otf", - "font-otb", - "font-inj", --- "font-ota", - "font-otn", - "font-otd", - "font-otp", - "font-otc", - "font-oth", - "font-odv", - "font-one", - "font-map", - "font-fbk", - } - local report = logs.reporter("oldotf") - local findfile = resolvers.findfile - local addsuffix = file.addsuffix - report() - report("using traditional font loader code") - report() - for i=1,#files do - local foundfile = findfile(addsuffix(files[i],"lua")) - if foundfile and foundfile ~= "" then - report("loading %a",foundfile) - dofile(foundfile) - end - end - report() - - -- needed for testing: - - local nuts = nodes.nuts - local copy_node = nuts.copy - local kern = nuts.pool.register(nuts.pool.kern()) - local setfield = nuts.setfield - - nuts.setattr(kern,attributes.private('fontkern'),1) -- we can have several, attributes are shared - - nodes.injections.installnewkern(function(k) - local c = copy_node(kern) - setfield(c,"kern",k) - return c - end) - - directives.register("fonts.injections.fontkern", function(v) setfield(kern,"subtype",v and 0 or 1) end) - - local fonts = fonts - local handlers = fonts.handlers - local otf = handlers.otf -- brrr - local afm = handlers.afm -- brrr - local getters = fonts.getters - - getters.kern .opentype = otf.getkern - getters.substitution.opentype = otf.getsubstitution - getters.alternate .opentype = otf.getalternate - getters.multiple .opentype = otf.getmultiple - -\stopluacode - -\protect \endinput diff --git a/tex/context/base/mkiv/math-acc.mkvi b/tex/context/base/mkiv/math-acc.mkvi index c3f8bad40..3411edd1a 100644 --- a/tex/context/base/mkiv/math-acc.mkvi +++ b/tex/context/base/mkiv/math-acc.mkvi @@ -190,7 +190,7 @@ \let\normalcheck \check \unexpanded\def\dotlesscheck #1{\normalcheck {\mathdotless#1}} \let\normalbreve \breve \unexpanded\def\dotlessbreve #1{\normalbreve {\mathdotless#1}} \let\normaldot \dot \unexpanded\def\dotlessdot #1{\normaldot {\mathdotless#1}} -\let\normalmathring\mathring \unexpanded\def\dotlessmathring#1{\normalmathring{\mathdotless#1}} +\let\normalring \ring \unexpanded\def\dotlessring #1{\normalring {\mathdotless#1}} \let\normaltilde \tilde \unexpanded\def\dotlesstilde #1{\normaltilde {\mathdotless#1}} \let\normaldddot \dddot \unexpanded\def\dotlessdddot #1{\normaldddot {\mathdotless#1}} @@ -205,8 +205,10 @@ \unexpanded\def\check {\math_accents_auto_dotless\normalcheck \dotlesscheck } \unexpanded\def\breve {\math_accents_auto_dotless\normalbreve \dotlessbreve } \unexpanded\def\dot {\math_accents_auto_dotless\normaldot \dotlessdot } -\unexpanded\def\mathring{\math_accents_auto_dotless\normalmathring\dotlessmathring} +\unexpanded\def\ring {\math_accents_auto_dotless\normalring \dotlessring } \unexpanded\def\tilde {\math_accents_auto_dotless\normaltilde \dotlesstilde } \unexpanded\def\dddot {\math_accents_auto_dotless\normaldddot \dotlessdddot } +\let\mathring\ring % for a while + \protect \endinput diff --git a/tex/context/base/mkiv/math-act.lua b/tex/context/base/mkiv/math-act.lua index ddc7510b1..77a355b22 100644 --- a/tex/context/base/mkiv/math-act.lua +++ b/tex/context/base/mkiv/math-act.lua @@ -91,8 +91,6 @@ function mathematics.scaleparameters(target,original) end end -sequencers.appendaction("mathparameters","system","mathematics.scaleparameters") - -- AccentBaseHeight vs FlattenedAccentBaseHeight function mathematics.checkaccentbaseheight(target,original) @@ -102,8 +100,6 @@ function mathematics.checkaccentbaseheight(target,original) end end -sequencers.appendaction("mathparameters","system","mathematics.checkaccentbaseheight") -- should go in lfg instead - function mathematics.checkprivateparameters(target,original) local mathparameters = target.mathparameters if mathparameters then @@ -131,8 +127,6 @@ function mathematics.checkprivateparameters(target,original) end end -sequencers.appendaction("mathparameters","system","mathematics.checkprivateparameters") - function mathematics.overloadparameters(target,original) local mathparameters = target.mathparameters if mathparameters and next(mathparameters) then @@ -176,8 +170,6 @@ function mathematics.overloadparameters(target,original) end end -sequencers.appendaction("mathparameters","system","mathematics.overloadparameters") - local function applytweaks(when,target,original) local goodies = original.goodies if goodies then @@ -185,9 +177,9 @@ local function applytweaks(when,target,original) local goodie = goodies[i] local mathematics = goodie.mathematics local tweaks = mathematics and mathematics.tweaks - if tweaks then + if type(tweaks) == "table" then tweaks = tweaks[when] - if tweaks then + if type(tweaks) == "table" then if trace_defining then report_math("tweaking math of %a @ %p (%s)",target.properties.fullname,target.parameters.size,when) end @@ -218,9 +210,16 @@ function mathematics.tweakaftercopyingfont(target,original) end end +sequencers.appendaction("mathparameters","system","mathematics.scaleparameters") +sequencers.appendaction("mathparameters","system","mathematics.checkaccentbaseheight") -- should go in lfg instead +sequencers.appendaction("mathparameters","system","mathematics.checkprivateparameters") -- after scaling ! +sequencers.appendaction("mathparameters","system","mathematics.overloadparameters") + sequencers.appendaction("beforecopyingcharacters","system","mathematics.tweakbeforecopyingfont") sequencers.appendaction("aftercopyingcharacters", "system","mathematics.tweakaftercopyingfont") +local virtualized = mathematics.virtualized + function mathematics.overloaddimensions(target,original,set) local goodies = target.goodies if goodies then @@ -232,15 +231,26 @@ function mathematics.overloaddimensions(target,original,set) if trace_defining then report_math("overloading dimensions in %a @ %p",target.properties.fullname,target.parameters.size) end - local characters = target.characters - local parameters = target.parameters - local factor = parameters.factor - local hfactor = parameters.hfactor - local vfactor = parameters.vfactor - local addprivate = fonts.helpers.addprivate + local characters = target.characters + local descriptions = target.descriptions + local parameters = target.parameters + local factor = parameters.factor + local hfactor = parameters.hfactor + local vfactor = parameters.vfactor + local addprivate = fonts.helpers.addprivate + -- to be sure + target.type = "virtual" + target.properties.virtualized = true + -- local function overload(dimensions) for unicode, data in next, dimensions do local character = characters[unicode] + if not character then + local c = virtualized[unicode] + if c then + character = characters[c] + end + end if character then -- local width = data.width @@ -249,26 +259,43 @@ function mathematics.overloaddimensions(target,original,set) if trace_defining and (width or height or depth) then report_math("overloading dimensions of %C, width %a, height %a, depth %a",unicode,width,height,depth) end - if width then character.width = width * hfactor end - if height then character.height = height * vfactor end - if depth then character.depth = depth * vfactor end + if width then character.width = width * hfactor end + if height then character.height = height * vfactor end + if depth then character.depth = depth * vfactor end -- local xoffset = data.xoffset local yoffset = data.yoffset - if xoffset then + if xoffset == "llx" then + local d = descriptions[unicode] + if d then + xoffset = - d.boundingbox[1] * hfactor + character.width = character.width + xoffset + xoffset = { "right", xoffset } + end + elseif xoffset then xoffset = { "right", xoffset * hfactor } end if yoffset then yoffset = { "down", -yoffset * vfactor } end if xoffset or yoffset then - local slot = { "slot", 1, addprivate(target,nil,fastcopy(character)) } - if xoffset and yoffset then - character.commands = { xoffset, yoffset, slot } - elseif xoffset then - character.commands = { xoffset, slot } + if character.commands then + if yoffset then + insert(character.commands,1,yoffset) + end + if xoffset then + insert(character.commands,1,xoffset) + end else - character.commands = { yoffset, slot } + -- local slot = { "slot", 1, addprivate(target,nil,fastcopy(character)) } + local slot = { "slot", 0, addprivate(target,nil,fastcopy(character)) } + if xoffset and yoffset then + character.commands = { xoffset, yoffset, slot } + elseif xoffset then + character.commands = { xoffset, slot } + else + character.commands = { yoffset, slot } + end end character.index = nil end @@ -502,12 +529,14 @@ local function horizontalcode(family,unicode) end elseif kind == e_right then local charlist = data[3].horiz_variants - local right = charlist[#charlist] - roffset = abs((right["start"] or 0) - (right["end"] or 0)) + if charlist then + local right = charlist[#charlist] + roffset = abs((right["start"] or 0) - (right["end"] or 0)) + end elseif kind == e_horizontal then local charlist = data[3].horiz_variants if charlist then - local left = charlist[1] + local left = charlist[1] local right = charlist[#charlist] loffset = abs((left ["start"] or 0) - (left ["end"] or 0)) roffset = abs((right["start"] or 0) - (right["end"] or 0)) @@ -541,54 +570,6 @@ interfaces.implement { -- check: when true, only set when present in font -- force: when false, then not set when already set -local blocks = characters.blocks -- this will move to char-ini - --- operators : 0x02200 --- symbolsa : 0x02701 --- symbolsb : 0x02901 --- supplemental : 0x02A00 - --- from mathematics.gaps: - -blocks["lowercaseitalic"].gaps = { - [0x1D455] = 0x0210E, -- ℎ h -} - -blocks["uppercasescript"].gaps = { - [0x1D49D] = 0x0212C, -- ℬ script B - [0x1D4A0] = 0x02130, -- ℰ script E - [0x1D4A1] = 0x02131, -- ℱ script F - [0x1D4A3] = 0x0210B, -- ℋ script H - [0x1D4A4] = 0x02110, -- ℐ script I - [0x1D4A7] = 0x02112, -- ℒ script L - [0x1D4A8] = 0x02133, -- ℳ script M - [0x1D4AD] = 0x0211B, -- ℛ script R -} - -blocks["lowercasescript"].gaps = { - [0x1D4BA] = 0x0212F, -- ℯ script e - [0x1D4BC] = 0x0210A, -- ℊ script g - [0x1D4C4] = 0x02134, -- ℴ script o -} - -blocks["uppercasefraktur"].gaps = { - [0x1D506] = 0x0212D, -- ℭ fraktur C - [0x1D50B] = 0x0210C, -- ℌ fraktur H - [0x1D50C] = 0x02111, -- ℑ fraktur I - [0x1D515] = 0x0211C, -- ℜ fraktur R - [0x1D51D] = 0x02128, -- ℨ fraktur Z -} - -blocks["uppercasedoublestruck"].gaps = { - [0x1D53A] = 0x02102, -- ℂ bb C - [0x1D53F] = 0x0210D, -- ℍ bb H - [0x1D545] = 0x02115, -- ℕ bb N - [0x1D547] = 0x02119, -- ℙ bb P - [0x1D548] = 0x0211A, -- ℚ bb Q - [0x1D549] = 0x0211D, -- ℝ bb R - [0x1D551] = 0x02124, -- ℤ bb Z -} - -- todo: tounicode -- function mathematics.injectfallbacks(target,original) @@ -758,6 +739,7 @@ function mathematics.finishfallbacks(target,specification,fallbacks) if gaps then for unic, unicode in next, gaps do remap(unic,unicode,true) + remap(unicode,unicode,true) end end end diff --git a/tex/context/base/mkiv/math-ali.mkiv b/tex/context/base/mkiv/math-ali.mkiv index 49a343ba0..083fb7645 100644 --- a/tex/context/base/mkiv/math-ali.mkiv +++ b/tex/context/base/mkiv/math-ali.mkiv @@ -15,38 +15,73 @@ \unprotect -%D The code here has been moved from other files. Beware: the \MKII\ and -%D \MKIV\ code is not gathered in files with the same name. In the -%D meantime this code has been adapted to \MKIV\ but mnore is possible. +%D The code here has been moved from other files. Beware: the \MKII\ and \MKIV\ code +%D is not gathered in files with the same name. In the meantime this code has been +%D adapted to \MKIV\ but more is possible. The code is somewhat complicated by the +%D fact that alignments are tricky with rspect to tagging. + +% export: +% +% alignment : ok +% cases : +% matrix : ok +% substack : %D \macros %D {definemathalignment, setupmathalignment, startmathalignment} %D -%D Modules may provide additional alignment features. The following -%D mechanisms are provided by the core. - -% why all these spans - -% n>1 ### needed, strange # interaction in recurse +%D Modules may provide additional alignment features. The following mechanisms are +%D provided by the core. \newtoks\t_math_align_a \newtoks\t_math_align_b \newtoks\t_math_align_c +\newskip\d_math_eqalign_distance + +\unexpanded\def\math_eqalign_distance + {\relax + \ifdim\d_math_eqalign_distance>\zeropoint + \hskip\d_math_eqalign_distance + \fi + \mathalignmentparameter\c!separator + \relax} + \def\displayopenupvalue{.25\bodyfontsize} +% \def\math_build_eqalign +% {\scratchtoks\emptytoks +% \d_math_eqalign_distance\mathalignmentparameter\c!distance +% \scratchcounterone\mathalignmentparameter\c!m +% \scratchcountertwo\mathalignmentparameter\c!n +% \normalexpanded{\scratchtoks{\the\scratchtoks\the\t_math_align_a}}% +% \scratchcounter\plusone +% \dorecurse{\numexpr\scratchcounterone*\scratchcountertwo-\plusone\relax} +% {\ifnum\scratchcounter=\scratchcountertwo +% \scratchcounter\plusone +% \scratchtoks\expandafter{\the\scratchtoks\math_eqalign_distance}% +% \else +% \advance\scratchcounter\plusone +% \fi +% \normalexpanded{\scratchtoks{\the\scratchtoks\the\t_math_align_b}}}% +% \normalexpanded{\scratchtoks{\the\scratchtoks\the\t_math_align_c}}} + \def\math_build_eqalign {\scratchtoks\emptytoks - \dorecurse{\mathalignmentparameter\c!m}\math_build_eqalign_step - \normalexpanded{\scratchtoks{\the\scratchtoks\the\t_math_align_c}}} - -\unexpanded\def\math_build_eqalign_step % make sure no expansion in tracing - {\ifnum\recurselevel>\plusone - \scratchtoks\expandafter{\the\scratchtoks\tabskip\mathalignmentparameter\c!distance\aligntab\tabskip\zeropoint}% - \fi - \normalexpanded{\scratchtoks{\the\scratchtoks\the\t_math_align_a}}% - \dorecurse{\numexpr\mathalignmentparameter\c!n-\plusone\relax} - {\normalexpanded{\scratchtoks{\the\scratchtoks\the\t_math_align_b}}}} + \d_math_eqalign_distance\mathalignmentparameter\c!distance + \scratchcounterone\mathalignmentparameter\c!m + \scratchcountertwo\mathalignmentparameter\c!n + \etoksapp\scratchtoks{\the\t_math_align_a}% + \scratchcounter\plusone + \dorecurse{\numexpr\scratchcounterone*\scratchcountertwo-\plusone\relax} + {\ifnum\scratchcounter=\scratchcountertwo + \scratchcounter\plusone + \etoksapp\scratchtoks{\math_eqalign_distance}% + \else + \advance\scratchcounter\plusone + \fi + \etoksapp\scratchtoks{\the\t_math_align_b}}% + \etoksapp\scratchtoks{\the\t_math_align_c}} \def\math_math_in_eqalign#1% {\startforceddisplaymath @@ -93,7 +128,7 @@ \aligntab \math_first_in_eqalign \hfil - \math_left_of_equalign + \math_left_of_eqalign \span \math_math_in_eqalign{\alignmark\alignmark}% \math_right_of_eqalign @@ -101,7 +136,7 @@ \t_math_align_b {\aligntab \math_next_in_eqalign - \math_left_of_equalign + \math_left_of_eqalign \span \math_math_in_eqalign{\alignmark\alignmark}% \math_right_of_eqalign @@ -142,7 +177,7 @@ \aligntab \math_first_in_eqalign \hfil - \math_left_of_equalign + \math_left_of_eqalign \span \math_math_in_eqalign{\alignmark\alignmark}% \math_right_of_eqalign @@ -150,7 +185,7 @@ \t_math_align_b {\aligntab \math_next_in_eqalign - \math_left_of_equalign + \math_left_of_eqalign \span \math_math_in_eqalign{\alignmark\alignmark}% \math_right_of_eqalign @@ -201,20 +236,31 @@ \math_halign_checked\expandafter\bgroup\the\scratchtoks\crcr#2\crcr\egroup \math_finish_eqalign_no} +\installcorenamespace {mathalignlocation} + +\setvalue{\??mathalignlocation\v!top }{\let\math_alignment_halign_method\halign\tpack} +\setvalue{\??mathalignlocation\v!bottom}{\let\math_alignment_halign_method\halign\vpack} +\setvalue{\??mathalignlocation\v!center}{\let\math_alignment_halign_method\halign\vcenter} + \def\math_both_eqalign_no_aligned#1% - {\ifmmode + {\let\math_alignment_halign_method\math_halign_checked + \ifmmode \the\mathdisplayaligntweaks \global\mathnumberstatus\plusone \ifcase\mathraggedstatus \def\math_finish_eqalign_no{\crcr\egroup}% - \else - % we're in a mathbox - \vcenter\bgroup + \else % we're in a mathbox + \ifcsname\??mathalignlocation\mathalignmentparameter\c!location\endcsname + \lastnamedcs % top|bottom|center as suggested by HM + \else + \vcenter + \fi + \bgroup \def\math_finish_eqalign_no{\crcr\egroup\egroup}% \fi \fi #1% - \math_halign_checked\expandafter\bgroup\the\scratchtoks\crcr} + \math_alignment_halign_method\expandafter\bgroup\the\scratchtoks\crcr} \def\math_rlap#1% {\setbox\scratchbox\hbox{#1}% @@ -236,68 +282,106 @@ %D Here we implement the user interface part. We start with basic math alignments: -\newcount\c_math_eqalign_column +\newcount \c_math_eqalign_column +\newconditional\c_math_eqalign_first \newtoks \everymathalignment +\newtoks \everymathalignmentdone -\def\math_alignment_NC_first#1\NR - {\glet\math_alignment_NC\math_alignment_NC_rest - \scratchtoks{\math_number_left_of_eqalign\aligntab#1\NR}% \math_number_left_of_eqalign not used yet - \dodoubleempty\math_alignment_NC_first_indeed} +\def\math_alignment_NN + {\dodirectdoubleempty\math_alignment_NN_indeed} -\def\math_alignment_NC_first_indeed[#1][#2]% - {\strc_formulas_place_number_nested{#1}{#2}\the\scratchtoks} +\def\math_alignment_NN_indeed[#1][#2]% + {\aligntab + \strc_formulas_place_number_nested{#1}{#2}} \def\math_alignment_NR + {\dodirectdoubleempty\math_alignment_NR_indeed} + +\def\math_alignment_NR_indeed[#1][#2]% {\aligntab \dostoptagged % finish cell + \strc_formulas_place_number_nested{#1}{#2}% \math_number_right_of_eqalign + \global\settrue\c_math_eqalign_first \crcr - \dostoptagged % finish row - \noalign{\glet\math_alignment_NC\math_alignment_NC_first}} % noalign used for change state, conditional does not work here + \dostoptagged} % finish row -\def\math_alignment_NC_rest - {\aligntab} +\def\math_alignment_NC + {\relax + \ifconditional\c_math_eqalign_first + \ifx\p_math_alignment_number\v!auto + \strc_formulas_place_number_nested{+}{}% + \fi + \global\setfalse\c_math_eqalign_first + \fi + \math_number_left_of_eqalign + \aligntab} \def\math_alignment_EQ {\NC=} \appendtoks - \glet\math_alignment_NC\math_alignment_NC_first - \unexpanded\def\NC{\math_alignment_NC}% messy, due to lookahead (we cannot use a flag) - \let\EQ\math_alignment_EQ - \let\NR\math_alignment_NR + \pushmacro\NC + \pushmacro\NN + \pushmacro\EQ + \pushmacro\NR + \let\NC\math_alignment_NC + \let\NN\math_alignment_NN + \let\EQ\math_alignment_EQ + \let\NR\math_alignment_NR + \global\settrue\c_math_eqalign_first \to \everymathalignment +\appendtoks + \popmacro\NR + \popmacro\EQ + \popmacro\NN + \popmacro\NC +\to \everymathalignmentdone + \let\math_alignment_snap_start\relax \let\math_alignment_snap_stop \relax -% experimental - -\def\math_alignment_snap_start - {\ifgridsnapping - \snaptogrid[\v!both]\vbox\bgroup - \fi} +% % experimental: +% +% \def\math_alignment_snap_start +% {\ifgridsnapping +% \edef\p_math_alignment_grid{\mathalignmentparameter\c!grid}% +% \ifx\p_math_alignment_grid\v!no\else +% \snaptogrid[\p_math_alignment_grid]\vbox\bgroup +% \fi +% \fi} +% +% \def\math_alignment_snap_stop +% {\ifgridsnapping +% \ifx\p_math_alignment_grid\v!no\else +% \egroup +% \fi +% \fi} +% +% % doesn't work well, so: -\def\math_alignment_snap_stop - {\ifgridsnapping - \egroup - \fi} +\let\math_alignment_snap_start\relax +\let\math_alignment_snap_stop \relax % end of experimental +\newconditional\c_math_alignment_auto_number + \unexpanded\def\math_alignment_start#1% {\edef\currentmathalignment{#1}% \dosingleempty\math_alignment_start_indeed} \def\math_alignment_start_indeed[#1]% {% \begingroup not permitted ($$...assignments...\halign... ) - \math_alignment_snap_start \iffirstargument \setupmathalignment[\currentmathalignment][#1]% bad! ungrouped \fi + \math_alignment_snap_start \the\everymathalignment \c_math_eqalign_column\zerocount + \edef\p_math_alignment_number{\mathalignmentparameter\c!number}% \processcommacommand [\mathalignmentparameter\c!align]% {\advance\c_math_eqalign_column\plusone\math_eqalign_set_column}% takes argument @@ -310,6 +394,7 @@ {\math_finish_eqalign_no \dostoptagged \dostoptagged + \the\everymathalignmentdone \math_alignment_snap_stop} \installcorenamespace{mathalignment} @@ -325,7 +410,8 @@ \setupmathalignment [\c!n=2, \c!m=1, - \c!distance=\emwidth] + \c!distance=\emwidth, + \c!grid=\v!math] \definemathalignment[align] % default case (this is what amstex users expect) \definemathalignment[\v!mathalignment] % prefered case (this is cleaner, less clashing) @@ -344,10 +430,13 @@ {\ifmmode \let\stopalign\align_math_normal_stop % cannot be an unexpanded def ... lookahead in align \expandafter\align_math_normal_start + \else\ifinformula + \let\stopalign\align_math_normal_stop + \doubleexpandafter\align_math_normal_start \else \let\stopalign\align_text_normal_stop - \expandafter\align_text_normal_start - \fi} + \doubleexpandafter\align_text_normal_start + \fi\fi} \let\stopalign\relax @@ -355,10 +444,13 @@ {\ifmmode \let\stopalignment\align_math_normal_stop % cannot be an unexpanded def ... lookahead in align \expandafter\align_math_normal_start + \else\ifinformula + \let\stopalignment\align_math_normal_stop % cannot be an unexpanded def ... lookahead in align + \doubleexpandafter\align_math_normal_start \else \let\stopalignment\align_text_normal_stop - \expandafter\align_text_normal_start - \fi} + \doubleexpandafter\align_text_normal_start + \fi\fi} \let\stopalignment\relax @@ -381,7 +473,7 @@ \dostoptagged % finish cell \dostarttagged\t!mathtablecell\empty} -\def\math_left_of_equalign +\def\math_left_of_eqalign {\ifcsname\??mathalignmentvariant\number\c_math_eqalign_column\endcsname \ifcase\lastnamedcs \or \relax \or \hfill \or \hfill \fi \fi} @@ -413,9 +505,13 @@ \fi \fi} +% \def\math_eqalign_set_column#1% we could just add to the preamble (as with other alignments) +% {\expandafter\let\csname\??mathalignmentvariant\number\c_math_eqalign_column\expandafter\endcsname +% \csname\??mathalignmentvariant\ifcsname\??mathalignmentvariant#1\endcsname#1\else\v!normal\fi\endcsname} + \def\math_eqalign_set_column#1% we could just add to the preamble (as with other alignments) - {\expandafter\let\csname\??mathalignmentvariant\number\c_math_eqalign_column\expandafter\endcsname - \csname\??mathalignmentvariant\ifcsname\??mathalignmentvariant#1\endcsname#1\else\v!normal\fi\endcsname} + {\expandafter\chardef\csname\??mathalignmentvariant\number\c_math_eqalign_column\expandafter\expandafter\expandafter\endcsname + \ifcsname\??mathalignmentvariant#1\endcsname\lastnamedcs\else\zerocount\fi\relax} \letvalue{\??mathalignmentvariant\v!normal}\zerocount \letvalue{\??mathalignmentvariant\v!left }\plusone @@ -704,7 +800,9 @@ %D \macros %D {definemathmatrix, setupmathmatrix, startmathmatrix} %D -%D Yet another one \unknown +%D Yet another one \unknown. This time we implement the lot a bit +%D different which is a side effect of getting the tagging right. In +%D retrospect the main alignment could be done this way but \unknown \installcorenamespace{mathmatrix} @@ -721,117 +819,199 @@ \setvalue {\e!stop \currentmathmatrix}{\math_matrix_stop}% no u else lookahead problem \to \everydefinemathmatrix -\let\math_matrix_NC\relax +\def\math_matrix_start_table + {\global\c_math_eqalign_column\zerocount + \dostarttagged\t!math\empty + \dostarttagged\t!mathtable\empty} -\unexpanded\def\math_matrix_start#1% - {\begingroup - \edef\currentmathmatrix{#1}% - \dosingleempty\math_matrix_start_indeed} +\def\math_matrix_stop_table + {\dostoptagged + \dostoptagged} -\unexpanded\def\math_matrix_start_indeed[#1]% - {\iffirstargument - \setupcurrentmathmatrix[#1]% +\def\math_matrix_start_row + {\noalign{\global\c_math_eqalign_column\zerocount}% + \dostarttagged\t!mathtablerow\empty} + +\def\math_matrix_stop_row + {\dostoptagged} + +\unexpanded\def\math_matrix_start_cell + {\dostarttagged\t!mathtablecell\empty + \hss + \math_left_of_eqalign + \startimath + \math_matrix_set_style + \tabskip\zeropoint + \everycr\emptytoks} + +\unexpanded\def\math_matrix_stop_cell + {\stopimath + \math_right_of_eqalign + \hss + \dostoptagged} + +% We could construct a preamble with alignment and such embedded but the number +% of matrices with many rows is normally so low that it doesn't pay of at all. + +\unexpanded\def\math_matrix_distance + {\relax + \ifdim\d_math_eqalign_distance>\zeropoint + \hskip\d_math_eqalign_distance \fi - % \emptyhbox % noted at 25-05-2014: what was that one doing here? it messed up spacing - \math_matrix_align_method_analyze + \relax} + +\def\math_matrix_preamble + {\math_matrix_strut + \global\advance\c_math_eqalign_column\plusone + \math_matrix_start_cell + \alignmark\alignmark + \math_matrix_stop_cell + \aligntab + \aligntab + \math_matrix_distance + \global\advance\c_math_eqalign_column\plusone + \math_matrix_start_cell + \alignmark\alignmark + \math_matrix_stop_cell} + +\newconditional\c_math_matrix_first + +\def\math_matrix_NR + {\aligntab\omit + \math_matrix_stop_row + \math_matrix_pickup + \crcr + \math_matrix_start_row} + +\def\math_matrix_NC + {\ifconditional\c_math_matrix_first + \expandafter\math_matrix_NC_yes + \else + \expandafter\math_matrix_NC_nop + \fi} + +\def\math_matrix_pickup{\global\settrue \c_math_matrix_first} +\def\math_matrix_NC_yes{\global\setfalse\c_math_matrix_first} +\def\math_matrix_NC_nop{\aligntab} % avoids lookahead + +% \def\math_matrix_stop_wrapup +% {\crcr +% \strut +% \crcr +% \noalign{\vskip-\struthtdp}} + +\def\math_matrix_start_processing + {\dontleavehmode + \bgroup + \tabskip\zeropoint + \math_matrix_pickup + \let\NR\math_matrix_NR + \let\NC\math_matrix_NC + \let\MC\math_matrix_NC + % + \let\endmath\relax + % + \setbox\nextbox\vbox\bgroup + \math_matrix_start_table + \halign \bgroup + % preamble + \span\math_matrix_preamble + % done + \crcr + \math_matrix_start_row} + +\def\math_matrix_stop_processing + {%\math_matrix_stop_wrapup % optional + \math_matrix_stop_row + \egroup + \math_matrix_stop_table + \egroup \mathmatrixleft - % new per 13-10-2014 - \edef\p_strut{\mathmatrixparameter\c!strut}% + \math_matrix_finish_nextbox + \mathmatrixright + \egroup} + +\let\math_matrix_strut \strut +\let\math_matrix_set_style\relax + +\def\math_matrix_check_settings + {\edef\p_strut{\mathmatrixparameter\c!strut}% \ifx\p_strut\v!no - \let\m_matrix_strut\relax + \let\math_matrix_strut\relax \else - \let\m_matrix_strut\strut + \let\math_matrix_strut\strut \ifx\p_strut\v!yes\else \spacing\p_strut \fi \fi - % - \mathmatrixbox\bgroup - \pushmacro\math_matrix_NC - \let\endmath\relax - \def\NC{\math_matrix_NC}% - \def\MC{\math_matrix_NC\ifmmode\else\startimath\let\endmath\stopimath\fi}% - \global\let\math_matrix_NC\math_matrix_NC_indeed - \def\NR{\endmath\global\let\math_matrix_NC\math_matrix_NC_indeed\m_matrix_strut \crcr}% - \normalbaselines + \d_math_eqalign_distance\mathmatrixparameter\c!distance\relax + \edef\math_matrix_set_style{\mathmatrixparameter\c!style}} + +\def\math_matrix_set_defaults + {\normalbaselines % hm, spacing ? \mathsurround\zeropoint - \everycr\emptytoks - \tabskip\zeropoint - \c_math_eqalign_column\zerocount - \processcommacommand - [\mathmatrixparameter\c!align] - {\advance\c_math_eqalign_column\plusone\math_eqalign_set_column}% - \scratchcounter\ifnum\c_math_eqalign_column>\zerocount \c_math_eqalign_column \else \plusone \fi - \global\c_math_eqalign_column\plusone - \math_matrix_prepare} + \tabskip\zeropoint} -\def\math_matrix_stop - {\crcr - % \ifgridsnapping \else - \mathstrut\crcr - \noalign{\vskip-\baselineskip}% - % \fi - \egroup - \popmacro\math_matrix_NC - \egroup - \mathmatrixright - \endgroup} +\def\math_matrix_set_columns_step + {\advance\c_math_eqalign_column\plusone + %\c_math_matrix_columns\c_math_eqalign_column + \math_eqalign_set_column} -\definemathmatrix[matrix] -\definemathmatrix[\v!mathmatrix] +\def\math_matrix_set_columns + {\c_math_eqalign_column\zerocount + \rawprocesscommacommand[\mathmatrixparameter\c!align]\math_matrix_set_columns_step} -\def\math_matrix_prepare - {\t_math_align_a{\strut\math_first_in_eqalign\math_left_of_equalign\span - \math_text_in_eqalign{\mathmatrixparameter\c!style\alignmark\alignmark}\math_right_of_eqalign}% - \t_math_align_b{\aligntab\hskip\mathmatrixparameter\c!distance - \math_next_in_eqalign\math_left_of_equalign\span - \math_text_in_eqalign{\mathmatrixparameter\c!style\alignmark\alignmark}\math_right_of_eqalign}% - \t_math_align_c{\aligntab\aligntab\hskip\mathmatrixparameter\c!distance - \math_left_of_equalign\span - \math_text_in_eqalign{\mathmatrixparameter\c!style\alignmark\alignmark}\math_right_of_eqalign}% - \scratchtoks\emptytoks - \normalexpanded{\scratchtoks{\the\scratchtoks\the\t_math_align_a}}% - \dorecurse{\numexpr\scratchcounter-\plusone\relax} - {\normalexpanded{\scratchtoks{\the\scratchtoks\the\t_math_align_b}}}% - \normalexpanded{\scratchtoks{\the\scratchtoks\the\t_math_align_c}}% - \halign \expandafter \bgroup\the\scratchtoks \crcr} +\unexpanded\def\math_matrix_start#1% + {\begingroup + \globalpushmacro\c_math_matrix_first + \edef\currentmathmatrix{#1}% + \dosingleempty\math_matrix_start_indeed} + +\unexpanded\def\math_matrix_start_indeed[#1]% + {\iffirstargument + \setupcurrentmathmatrix[#1]% + \fi + \math_matrix_check_settings + \math_matrix_set_defaults + \math_matrix_set_columns + \math_matrix_start_processing} + +\def\math_matrix_stop + {\math_matrix_stop_processing + \globalpopmacro\c_math_matrix_first + \endgroup} -\unexpanded\def\math_matrix_NC_indeed - {\gdef\math_matrix_NC{\endmath\aligntab}} +% vcenter: +% +% delta = (height(v) + depth(v))/2 +% axis = math_axis_size(cur_size) +% height(v) = delta + axis +% depth(v) = delta - axis -\installcorenamespace{mathmatrixalignmethod} +\installcorenamespace{mathmatrixalignlocation} \let\mathmatrixleft \empty % experimental hook \let\mathmatrixright\empty % experimental hook -\def\math_matrix_process#1#2% - {\dowithnextbox - {\scratchdimen\dimexpr(\nextboxdp-\nextboxht)/2 \ifcase#2\or+\mathaxisheight\textfont2\fi\relax - \ifcase#1\relax\or\lower\scratchdimen\or\or\raise\scratchdimen\fi\hbox\bgroup - \normalstartimath - \mathmatrixparameter\c!left - \vcenter{\unvbox\nextbox}% - \mathmatrixparameter\c!right - \normalstopimath - \egroup}% - \vbox} - -\unexpanded\def\installmathmatrixalignmethod#1#2% - {\setvalue{\??mathmatrixalignmethod#1}{#2}} - -\def\math_matrix_align_method_analyze - {\csname\??mathmatrixalignmethod\ifcsname\??mathmatrixalignmethod\mathmatrixparameter\c!location\endcsname - \mathmatrixparameter\c!location - \else - \v!normal - \fi\endcsname} +\setvalue{\??mathmatrixalignlocation\v!top }{\raise\dimexpr(\nextboxdp-\nextboxht)/2 +\mathaxisheight\textfont\zerocount\relax} +\setvalue{\??mathmatrixalignlocation\v!high }{\raise\dimexpr(\nextboxdp-\nextboxht)/2\relax} +\setvalue{\??mathmatrixalignlocation\v!center}{\relax} +\setvalue{\??mathmatrixalignlocation\v!lohi} {\relax} +\setvalue{\??mathmatrixalignlocation\v!normal}{\relax} +\setvalue{\??mathmatrixalignlocation\v!bottom}{\lower\dimexpr(\nextboxdp-\nextboxht)/2 +\mathaxisheight\textfont\zerocount\relax} +\setvalue{\??mathmatrixalignlocation\v!low }{\lower\dimexpr(\nextboxdp-\nextboxht)/2\relax} + +\def\math_matrix_finish_nextbox + {\begincsname\??mathmatrixalignlocation\mathmatrixparameter\c!location\endcsname\hbox\bgroup + \normalstartimath + \mathmatrixparameter\c!left + \vcenter{\box\nextbox}% + \mathmatrixparameter\c!right + \normalstopimath + \egroup} -\installmathmatrixalignmethod\v!top {\def\mathmatrixbox{\math_matrix_process\plusthree\plusone }} -\installmathmatrixalignmethod\v!high {\def\mathmatrixbox{\math_matrix_process\plusthree\zerocount}} -\installmathmatrixalignmethod\v!lohi {\def\mathmatrixbox{\math_matrix_process\plustwo \zerocount}} -\installmathmatrixalignmethod\v!low {\def\mathmatrixbox{\math_matrix_process\plusone \zerocount}} -\installmathmatrixalignmethod\v!bottom{\def\mathmatrixbox{\math_matrix_process\plusone \plusone }} -\installmathmatrixalignmethod\v!normal{\def\mathmatrixbox{\math_matrix_process\plustwo \zerocount}} % lohi +\definemathmatrix[matrix] +\definemathmatrix[\v!mathmatrix] %D \startbuffer %D \placeformula \startformula[-] \startmatrix @@ -958,6 +1138,84 @@ %D %D \typebuffer % does not run well: \getbuffer +%D Handy for the \type {m-matrix} module: + +\unexpanded\def\startnamedmatrix + {\dodoubleempty\math_matrix_start_named} + +\def\math_matrix_start_named[#1][#2]% + {\begingroup + \edef\currentmathmatrix{#1}% + \ifsecondargument + \setupcurrentmathmatrix[#2]% + \fi + \math_matrix_start\currentmathmatrix} + +\def\stopnamedmatrix + {\math_matrix_stop + \endgroup} + +%D The following code is derived from Aditya's simplematrix prototype but +%D adapted to regular mathmatrices (which saves some code so it can go into +%D the core): + +\def\math_matrix_simple_row#1% + {\rawprocesscommalist[#1]\math_matrix_simple_col + \toksapp\scratchtoks{\NR}} + +\def\math_matrix_simple_col#1% + {\toksapp\scratchtoks{\NC#1}} + +\unexpanded\def\math_matrix_simple[#1][#2]#3% + {\begingroup + \edef\currentmathmatrix{#1}% + \ifsecondargument + \setupcurrentmathmatrix[#2]% + \fi + \scratchtoks\emptytoks + \processlist[];\math_matrix_simple_row[#3]% + \math_matrix_start\currentmathmatrix + \the\scratchtoks + \math_matrix_stop + \endgroup} + +%D We hook it into the normal mathmatrix code: + +\appendtoks + \edef\p_simplecommand{\mathmatrixparameter\c!simplecommand}% + \ifx\p_simplecommand\empty\else + \setuevalue{\p_simplecommand}{\dodoubleempty\math_matrix_simple[\currentmathmatrix]}% + \fi +\to \everydefinemathmatrix + +%D And predefine some matrices: + +\definemathmatrix[matrix:parentheses][\c!left={\left(\mskip\thinmuskip},\c!right={\mskip\thinmuskip\right)},\c!align=\v!middle] +\definemathmatrix[matrix:brackets] [\c!left={\left[\mskip\thinmuskip},\c!right={\mskip\thinmuskip\right]},\c!align=\v!middle] +\definemathmatrix[matrix:bars] [\c!left={\left|\mskip\thinmuskip},\c!right={\mskip\thinmuskip\right|},\c!align=\v!middle] + +\definemathmatrix[thematrix][matrix:parentheses][\c!simplecommand=thematrix] + +%D \startbuffer +%D \startformula +%D \thematrix{1,2,3,4;5,6,7,8;9,10,11,12} +%D \stopformula +%D \stopbuffer +%D +%D \typebuffer \getbuffer +%D +%D \startbuffer +%D \startformula +%D \startthematrix +%D \NC 1\NC 2\NC 3\NC 4\NR +%D \NC 5\NC 6\NC 7\NC 8\NR +%D \NC 9\NC10\NC11\NC12\NR +%D \stopthematrix +%D \stopformula +%D \stopbuffer +%D +%D \typebuffer \getbuffer + %D \macros %D {startintertext} %D @@ -1015,52 +1273,50 @@ %D %D \typebuffer which gives \getbuffer +% no tagging yet : how is it supposed to be coded? + \unexpanded\def\startsubstack {\begingroup \vcenter\bgroup \baselineskip\mathstacktotal \lineskip\mathstackvgap \lineskiplimit\lineskip - \let\stopmathmode\relax - \def\NC{\math_matrix_NC}% - \def\MC{\math_matrix_NC\startmathmode}% - \global\let\math_matrix_NC\math_matrix_NC_indeed - \def\NR - {\stopmathmode - \global\let\math_matrix_NC\math_matrix_NC_indeed - \crcr}% \mathsurround\zeropoint \everycr\emptytoks + \let\NC\relax + \let\MC\relax + \let\NR\crcr \halign\bgroup\hfil\normalstartimath\scriptstyle\alignmark\alignmark\normalstopimath\hfil\crcr} -\def\stopsubstack +\def\stopsubstack % todo: \unexpanded and delayed {\crcr \egroup \egroup \endgroup} -%D \macros -%D {bordermatrix} -%D -%D In \PLAIN\ \TEX\ the width of a parenthesis is stored in -%D the \DIMENSION\ \type{\mathparentwd}. This value is derived from -%D the width of \type{\tenrm B}, so let's take care of it now: - -\ifx\mathparentwd\undefined \newdimen\mathparentwd \fi - -\let\normalbordermatrix\bordermatrix % move that code to here instead - -\def\bordermatrix - {\begingroup - \setbox\scratchbox\hbox{\mr\char"239C}% - \global\mathparentwd\wd\scratchbox - \endgroup - \normalbordermatrix} - -% to be tested +% %D \macros +% %D {bordermatrix} +% %D +% %D In \PLAIN\ \TEX\ the width of a parenthesis is stored in +% %D the \DIMENSION\ \type{\mathparentwd}. This value is derived from +% %D the width of \type{\tenrm B}, so let's take care of it now: +% +% \ifx\mathparentwd\undefined \newdimen\mathparentwd \fi +% +% \let\normalbordermatrix\bordermatrix % move that code to here instead +% +% \unexpanded\def\bordermatrix +% {\begingroup +% \setbox\scratchbox\hbox{\mr\char"239C}% +% \global\mathparentwd\wd\scratchbox +% \endgroup +% \normalbordermatrix} % % \def\bordermatrix -% {\begingroup\mr\global\mathparentwd\fontcharwd\font"239C\relax\endgroup +% {\begingroup +% \mr +% \global\mathparentwd\fontcharwd\font"239C\relax +% \endgroup % \normalbordermatrix} %D \macros{overset, underset} @@ -1135,10 +1391,12 @@ {\setvalue{\??mathinnerstart#1}{#2}% \setvalue{\??mathinnerstop #1}{#3}} -\newif\iftracemath +\installtextracker + {formulas.boxes} + {\let\math_hbox\ruledhbox} + {\let\math_hbox\hbox} -\def\math_hbox - {\iftracemath\ruledhbox\else\hbox\fi} +\let\math_hbox\hbox \newconstant\mathraggedstatus % normal left center right \newconstant\mathnumberstatus % nothing normal shift_right @@ -1170,6 +1428,8 @@ \newdimen \d_strc_math_display_width \newbox \b_strc_math_display \newconstant \c_strc_formulas_frame_mode +\newdimen \d_strc_math_indent +\newconditional\c_strc_math_indent \let\d_strc_math_framed_width\displaywidth @@ -1184,14 +1444,32 @@ % mode: 0=no frame | 1=number inside frame | 2=number outside frame \def\strc_math_flush_aligned - {\ifcase\mathraggedstatus\or\hfill\or\hfill\fi - \box\b_strc_math_display - \ifcase\mathraggedstatus\or\or\hfill\or\hfill\fi} + {\ifcase\c_strc_math_vertical + \ifcase\mathraggedstatus\or\hfill\or\hfill\fi + \box\b_strc_math_display + \ifcase\mathraggedstatus\or\or\hfill\or\hfill\fi + \else + \ifconditional\c_strc_math_indent + \ifdim\d_strc_math_indent=\zeropoint\else + \hangafter\plusone + \hangindent\d_strc_math_indent + \fi + \fi + \edef\p_interlinespace{\formulaparameter\c!interlinespace}% + \ifx\p_interlinespace\empty\else\baselineskip\p_interlinespace\fi + \global\d_strc_math_indent\zeropoint + \ifcase\mathraggedstatus\or\raggedleft\or\raggedcenter\or\raggedright\fi + \unhbox\b_strc_math_display + \fi} \def\strc_math_flush_box_normal - {\hbox to \displaywidth\bgroup + {\ifcase\c_strc_math_vertical + \hbox to \displaywidth\bgroup + \strc_math_flush_aligned + \egroup + \else \strc_math_flush_aligned - \egroup} + \fi} \def\strc_math_flush_box_framed_common {\setformulaframedparameter\c!align{\formulaparameter\c!align}% @@ -1420,74 +1698,85 @@ \startforceddisplaymath} \def\strc_math_flush_number_no - {\ifconditional\c_strc_math_display_overflow - \ifcase\c_strc_formulas_frame_mode - \strc_math_flush_box_normal - \else - \strc_math_flush_box_framed_fit_inline - \fi - \else - \ifcase\c_strc_formulas_frame_mode - %\ifconditional\c_strc_formulas_tight - % \strc_math_flush_box_normal - %\else + {\ifcase\c_strc_math_vertical + \ifconditional\c_strc_math_display_overflow + \ifcase\c_strc_formulas_frame_mode \strc_math_flush_box_normal - %\fi - \else - \ifconditional\c_strc_formulas_tight + \else \strc_math_flush_box_framed_fit_inline + \fi + \else + \ifcase\c_strc_formulas_frame_mode + %\ifconditional\c_strc_formulas_tight + % \strc_math_flush_box_normal + %\else + \strc_math_flush_box_normal + %\fi \else - \strc_math_flush_box_framed_display + \ifconditional\c_strc_formulas_tight + \strc_math_flush_box_framed_fit_inline + \else + \strc_math_flush_box_framed_display + \fi \fi \fi + \else + \strc_math_flush_box \fi} \def\strc_math_flush_number_left - {\ifconditional\c_strc_math_display_overflow - \ifcase\c_strc_formulas_frame_mode - \strc_math_number_left_overflow - \or - \strc_math_number_left_overflow_outside - \or - \strc_math_number_left_overflow_inside + {\ifcase\c_strc_math_vertical + \ifconditional\c_strc_math_display_overflow + \ifcase\c_strc_formulas_frame_mode + \strc_math_number_left_overflow + \or + \strc_math_number_left_overflow_outside + \or + \strc_math_number_left_overflow_inside + \fi + \else + \ifcase\c_strc_formulas_frame_mode + \strc_math_number_left_normal + \or + \strc_math_number_left_normal_outside + \or + \strc_math_number_left_normal_inside + \fi \fi \else - \ifcase\c_strc_formulas_frame_mode - \strc_math_number_left_normal - \or - \strc_math_number_left_normal_outside - \or - \strc_math_number_left_normal_inside - \fi + \box\b_strc_formulas_number + \hfill + \strc_math_flush_aligned \fi} \def\strc_math_flush_number_right - {\ifconditional\c_strc_math_display_overflow - \ifcase\c_strc_formulas_frame_mode - \strc_math_number_right_overflow - \or - \strc_math_number_right_overflow_outside - \or - \strc_math_number_right_overflow_inside + {\ifcase\c_strc_math_vertical + \ifconditional\c_strc_math_display_overflow + \ifcase\c_strc_formulas_frame_mode + \strc_math_number_right_overflow + \or + \strc_math_number_right_overflow_outside + \or + \strc_math_number_right_overflow_inside + \fi + \else + \ifcase\c_strc_formulas_frame_mode + \strc_math_number_right_normal + \or + \strc_math_number_right_normal_outside + \or + \strc_math_number_right_normal_inside + \fi \fi \else - \ifcase\c_strc_formulas_frame_mode - \strc_math_number_right_normal - \or - \strc_math_number_right_normal_outside - \or - \strc_math_number_right_normal_inside - \fi + \strc_math_flush_aligned + \hfill + \box\b_strc_formulas_number \fi} \unexpanded\def\strc_math_box_stop {\stopforceddisplaymath \egroup - % % not needed, attribute driven - % \ifgridsnapping - % \snaptogrid[\v!math]\vbox - % \fi - % \bgroup % check number \d_strc_math_number_width\wd\b_strc_formulas_number % @@ -1514,7 +1803,13 @@ \noindent % \noindentation % not \dontleavehmode \hskip\d_strc_formulas_display_margin_left % was kern but that doesn't indent \strc_math_traced_state - \hbox to \displaywidth \bgroup + \ifcase\c_strc_math_vertical + \hbox to \displaywidth \bgroup + \or + \vbox \bgroup \hsize\displaywidth + \or + \bgroup \hsize\displaywidth + \fi \ifcase\mathnumberstatus \strc_math_flush_box \or % status 1 @@ -1540,7 +1835,11 @@ \else \strc_math_flush_box \fi - % \egroup + \ifcase\c_strc_math_vertical + \or + \or + \par + \fi \egroup} \defineinnermathhandler\v!left {\strc_math_box_start\plusone }{\strc_math_box_stop} @@ -1580,7 +1879,24 @@ \setupmathematics [\c!textdistance=\zeropoint] -%D For documentation, see \type {math-mkiv.tex}. +%D This is an experiment. No fancy spacing and alignments here. If we ever +%D go that route it might result in incompatible rendering. + +\unexpanded\def\startsplitformula + {\ifhmode + \par + \fi + \begingroup + \beforedisplayspace + % subset of \everydisplay: + \attribute \mathmodeattribute \plusone + \settrue \indisplaymath + % end of subset + \informulatrue} + +\unexpanded\def\stopsplitformula + {\afterdisplayspace + \endgroup} \protect \endinput diff --git a/tex/context/base/mkiv/math-arr.mkiv b/tex/context/base/mkiv/math-arr.mkiv index 28aad8ada..a0dda66b9 100644 --- a/tex/context/base/mkiv/math-arr.mkiv +++ b/tex/context/base/mkiv/math-arr.mkiv @@ -99,7 +99,7 @@ \ifdim\wd4=\dimen0\else \setbox4\hbox to \dimen0{#3\displaystyle}% \fi - \mathrel{\mathop{\hbox to \dimen0{\hss\copy4\hss}}\limits\normalsuperscript{\box0}\normalsubscript{\box2}}% + \mathrel{\mathop{\hbox to \dimen0{\hss\copy4\hss}}\limits\normalsuperscript{\box0}\normalsubscript{\box2}}% pack ? \endgroup} \let\math_arrows_construct_single\math_arrows_construct @@ -279,8 +279,8 @@ \unexpanded\def\specrightarrowfill {\defaultmtharrowfill \relbar \relbar \rightarrow} \unexpanded\def\specleftarrowfill {\defaultmtharrowfill \leftarrow \relbar \relbar} -\unexpanded\def\rightarrowfill {\specrightarrowfill \textstyle} -\unexpanded\def\leftarrowfill {\specleftarrowfill \textstyle} +\unexpanded\def\rightarrowfill {\specrightarrowfill\textstyle} +\unexpanded\def\leftarrowfill {\specleftarrowfill \textstyle} \unexpanded\def\equalfill {\defaultmtharrowfill \Relbar \Relbar \Relbar} \unexpanded\def\Rightarrowfill {\defaultmtharrowfill \Relbar \Relbar \Rightarrow} diff --git a/tex/context/base/mkiv/math-def.mkiv b/tex/context/base/mkiv/math-def.mkiv index a8af5af5c..641f7411e 100644 --- a/tex/context/base/mkiv/math-def.mkiv +++ b/tex/context/base/mkiv/math-def.mkiv @@ -30,6 +30,9 @@ \definemathcommand [arccos] [nolop] {\mfunctionlabeltext{arccos}} \definemathcommand [arcsin] [nolop] {\mfunctionlabeltext{arcsin}} \definemathcommand [arctan] [nolop] {\mfunctionlabeltext{arctan}} +\definemathcommand [arccosh] [nolop] {\mfunctionlabeltext{arccosh}} +\definemathcommand [arcsinh] [nolop] {\mfunctionlabeltext{arcsinh}} +\definemathcommand [arctanh] [nolop] {\mfunctionlabeltext{arctanh}} \definemathcommand [acos] [nolop] {\mfunctionlabeltext{acos}} \definemathcommand [asin] [nolop] {\mfunctionlabeltext{asin}} \definemathcommand [atan] [nolop] {\mfunctionlabeltext{atan}} @@ -133,9 +136,9 @@ \definemathcommand [centercolon] [rel] {\mathstylevcenteredhbox\colon} \definemathcommand [colonminus] [rel] {\centercolon\colonsep\mathrel{-}} -\definemathcommand [minuscolon] [rel] {\mathrel{-}\colonsep\centercolon} % native char -\definemathcommand [colonequals] [rel] {\centercolon\colonsep=} % native char -\definemathcommand [equalscolon] [rel] {=\centercolon\colonsep} % native char +%definemathcommand [minuscolon] [rel] {\mathrel{-}\colonsep\centercolon} % native char +%definemathcommand [colonequals] [rel] {\centercolon\colonsep=} % native char +%definemathcommand [equalscolon] [rel] {=\centercolon\colonsep} % native char \definemathcommand [colonapprox] [rel] {\centercolon\colonsep\approx} \definemathcommand [approxcolon] [rel] {\approx\centercolon\colonsep} \definemathcommand [colonsim] [rel] {\centercolon\colonsep\sim} diff --git a/tex/context/base/mkiv/math-del.mkiv b/tex/context/base/mkiv/math-del.mkiv index 269b6946a..dd847d2f1 100644 --- a/tex/context/base/mkiv/math-del.mkiv +++ b/tex/context/base/mkiv/math-del.mkiv @@ -69,13 +69,16 @@ % A new experiment: -\installcorenamespace {mathextensible} +% Hm, we already have \definemathextensible so we need to preserve that one. We now +% use \definemathdelimiter. -\installcommandhandler \??mathextensible {mathextensible} \??mathextensible +\installcorenamespace {mathdelimiter} -\let\setupmathextensibles\setupmathextensible +\installcommandhandler \??mathdelimiter {mathdelimiter} \??mathdelimiter -\setupmathextensibles +\let\setupmathdelimiters\setupmathdelimiter + +\setupmathdelimiters [\c!symbol=0, \c!command=\v!yes, \c!factor=1.5, @@ -85,50 +88,50 @@ \c!depth=\exheight] \appendtoks - \edef\p_command{\mathextensibleparameter\c!command}% + \edef\p_command{\mathdelimiterparameter\c!command}% \ifx\p_command\v!yes - \setuevalue\currentmathextensible{\math_fenced_extensible[\currentmathextensible]}% + \setuevalue\currentmathdelimiter{\math_fenced_extensible[\currentmathdelimiter]}% \fi -\to \everydefinemathextensible +\to \everydefinemathdelimiter \unexpanded\def\math_fenced_extensible {\dodoubleempty\math_fenced_extensible_indeed} \unexpanded\def\math_fenced_extensible_indeed[#1][#2]% {\mathop - {\edef\currentmathextensible{#1}% - \edef\p_factor{\mathextensibleparameter\c!factor}% + {\edef\currentmathdelimiter{#1}% + \edef\p_factor{\mathdelimiterparameter\c!factor}% \ifsecondargument \doifassignmentelse{#2} - {\setupcurrentmathextensible[#2]% - \edef\p_factor{\mathextensibleparameter\c!factor}}% + {\setupcurrentmathdelimiter[#2]% + \edef\p_factor{\mathdelimiterparameter\c!factor}}% {\edef\p_factor{#2}}% \else - \edef\p_factor{\mathextensibleparameter\c!factor}% + \edef\p_factor{\mathdelimiterparameter\c!factor}% \fi - \edef\p_exact{\mathextensibleparameter\c!exact}% - \edef\p_axis {\mathextensibleparameter\c!axis}% - \edef\p_leftoffset{\mathextensibleparameter\c!leftoffset}% - \edef\p_rightoffset{\mathextensibleparameter\c!rightoffset}% + \edef\p_exact{\mathdelimiterparameter\c!exact}% + \edef\p_axis {\mathdelimiterparameter\c!axis}% + \edef\p_leftoffset{\mathdelimiterparameter\c!leftoffset}% + \edef\p_rightoffset{\mathdelimiterparameter\c!rightoffset}% \ifx\p_leftoffset\empty\else \mskip\p_leftoffset \fi \Uvextensible \ifx\p_exact\v!yes exact \fi \ifx\p_axis \v!yes axis \fi - height \p_factor\dimexpr\mathextensibleparameter\c!height\relax - depth \p_factor\dimexpr\mathextensibleparameter\c!depth \relax - \Udelimiter\zerocount\zerocount\mathextensibleparameter\c!symbol + height \p_factor\dimexpr\mathdelimiterparameter\c!height\relax + depth \p_factor\dimexpr\mathdelimiterparameter\c!depth \relax + \Udelimiter\zerocount\zerocount\mathdelimiterparameter\c!symbol \relax \ifx\p_rightoffset\empty\else \mskip\p_rightoffset \fi}} -\let\mathextensible\math_fenced_extensible +\let\mathdelimiter\math_fenced_extensible -\definemathextensible[integral][\c!symbol="222B] +\definemathdelimiter[integral][\c!symbol="222B] -% \setupmathextensible[integral][rightoffset=-3mu,exact=yes,factor=2] +% \setupmathdelimiter[integral][rightoffset=-3mu,exact=yes,factor=2] % % \let\inlineint \int % \let\displayint\integral diff --git a/tex/context/base/mkiv/math-dim.lua b/tex/context/base/mkiv/math-dim.lua index ba0235a5b..72b9d7e50 100644 --- a/tex/context/base/mkiv/math-dim.lua +++ b/tex/context/base/mkiv/math-dim.lua @@ -6,9 +6,6 @@ if not modules then modules = { } end modules ['math-dim'] = { license = "see context related readme files" } --- Beware: only Taco and Ulrik really understands in depth what these dimensions --- do so if you run into problems ask on the context list. - -- The radical_rule value is also used as a trigger. In luatex the accent -- placement happens either the opentype way (using top_accent cum suis) or the -- traditional way. In order to determine what method to use the \Umathradicalrule @@ -18,6 +15,8 @@ if not modules then modules = { } end modules ['math-dim'] = { -- which case the engine takes the rulethickness. In c-speak: -- -- int compat_mode = (radical_rule(cur_style) == undefined_math_parameter) ; +-- +-- In the meantime things have been updated and we now have two code paths. local abs, next = math.abs, next diff --git a/tex/context/base/mkiv/math-dir.lua b/tex/context/base/mkiv/math-dir.lua index cba991b84..759f1e797 100644 --- a/tex/context/base/mkiv/math-dir.lua +++ b/tex/context/base/mkiv/math-dir.lua @@ -33,7 +33,6 @@ local getid = nuts.getid local getlist = nuts.getlist local getattr = nuts.getattr -local setfield = nuts.setfield local setchar = nuts.setchar local setlist = nuts.setlist diff --git a/tex/context/base/mkiv/math-ext.lua b/tex/context/base/mkiv/math-ext.lua index b00d6cde2..a4b865713 100644 --- a/tex/context/base/mkiv/math-ext.lua +++ b/tex/context/base/mkiv/math-ext.lua @@ -6,6 +6,8 @@ if not modules then modules = { } end modules ['math-ext'] = { license = "see context related readme files" } +local rawget = rawget + local trace_virtual = false trackers.register("math.virtual", function(v) trace_virtual = v end) local basename = file.basename @@ -18,33 +20,40 @@ local report_math = logs.reporter("mathematics") mathematics.extras = mathematics.extras or { } local extras = mathematics.extras -characters.math = characters.math or { } -local mathdata = characters.math +local mathplus = { } local chardata = characters.data +local mathpairs = characters.mathpairs + +-- todo: store them and skip storage if already stored +-- todo: make a char-ctx.lua (or is this already side effect of save in format) -function extras.add(unicode,t) -- todo: if already stored ... - local min, max = mathematics.extrabase, mathematics.privatebase - 1 - -- if mathdata[unicode] or chardata[unicode] then - -- report_math("extra %U overloads existing character",unicode) - -- end +local function addextra(unicode) + local min = mathematics.extrabase + local max = mathematics.privatebase - 1 if unicode >= min and unicode <= max then - mathdata[unicode], chardata[unicode] = t, t + if chardata[unicode] then + mathplus[unicode] = true + else + report_math("extra %U is not a registered code point",unicode) + end else report_math("extra %U should be in range %U - %U",unicode,min,max) end end +extras.add = addextra + function extras.copy(target,original) local characters = target.characters local properties = target.properties local parameters = target.parameters - for unicode, extradesc in next, mathdata do - -- always, because in an intermediate step we can have a non math font - local extrachar = characters[unicode] + for unicode in table.sortedhash(mathplus) do + local extradesc = chardata[unicode] local nextinsize = extradesc.nextinsize if nextinsize then - local first = 1 - local charused = unicode + local extrachar = characters[unicode] + local first = 1 + local charused = unicode if not extrachar then for i=1,#nextinsize do local slot = nextinsize[i] @@ -104,94 +113,7 @@ end utilities.sequencers.appendaction(mathactions,"system","mathematics.extras.copy") --- 0xFE302 -- 0xFE320 for accents (gone with new lm/gyre) --- --- extras.add(0xFE302, { --- category="mn", --- description="WIDE MATHEMATICAL HAT", --- direction="nsm", --- linebreak="cm", --- mathclass="topaccent", --- mathname="widehat", --- mathstretch="h", --- unicodeslot=0xFE302, --- nextinsize={ 0x00302, 0x0005E }, --- } ) --- --- extras.add(0xFE303, { --- category="mn", --- cjkwd="a", --- description="WIDE MATHEMATICAL TILDE", --- direction="nsm", --- linebreak="cm", --- mathclass="topaccent", --- mathname="widetilde", --- mathstretch="h", --- unicodeslot=0xFE303, --- nextinsize={ 0x00303, 0x0007E }, --- } ) - --- 0xFE321 -- 0xFE340 for missing characters - -extras.add(0xFE321, { - category="sm", - description="MATHEMATICAL SHORT BAR", - -- direction="on", - -- linebreak="nu", - mathclass="relation", - mathname="mapstochar", - unicodeslot=0xFE321, -} ) - -extras.add(0xFE322, { - category="sm", - description="MATHEMATICAL LEFT HOOK", - mathclass="relation", - mathname="lhook", - unicodeslot=0xFE322, -} ) - -extras.add(0xFE323, { - category="sm", - description="MATHEMATICAL RIGHT HOOK", - mathclass="relation", - mathname="rhook", - unicodeslot=0xFE323, -} ) - -extras.add(0xFE324, { - category="sm", - description="MATHEMATICAL SHORT BAR MIRRORED", --- direction="on", --- linebreak="nu", - mathclass="relation", - mathname="mapsfromchar", - unicodeslot=0xFE324, -} ) - ---~ extras.add(0xFE304, { ---~ category="sm", ---~ description="TOP AND BOTTOM PARENTHESES", ---~ direction="on", ---~ linebreak="al", ---~ mathclass="doubleaccent", ---~ mathname="doubleparent", ---~ unicodeslot=0xFE304, ---~ accents={ 0x023DC, 0x023DD }, ---~ } ) - ---~ extras.add(0xFE305, { ---~ category="sm", ---~ description="TOP AND BOTTOM BRACES", ---~ direction="on", ---~ linebreak="al", ---~ mathclass="doubleaccent", ---~ mathname="doublebrace", ---~ unicodeslot=0xFE305, ---~ accents={ 0x023DE, 0x023DF }, ---~ } ) - ---~ \Umathchardef\braceld="0 "1 "FF07A ---~ \Umathchardef\bracerd="0 "1 "FF07B ---~ \Umathchardef\bracelu="0 "1 "FF07C ---~ \Umathchardef\braceru="0 "1 "FF07D +extras.add(0xFE321) +extras.add(0xFE322) +extras.add(0xFE323) +extras.add(0xFE324) diff --git a/tex/context/base/mkiv/math-fbk.lua b/tex/context/base/mkiv/math-fbk.lua index 564ece8d7..7aa8c437f 100644 --- a/tex/context/base/mkiv/math-fbk.lua +++ b/tex/context/base/mkiv/math-fbk.lua @@ -6,6 +6,8 @@ if not modules then modules = { } end modules ['math-fbk'] = { license = "see context related readme files" } +local next, type = next, type + local trace_fallbacks = false trackers.register("math.fallbacks", function(v) trace_fallbacks = v end) local report_fallbacks = logs.reporter("math","fallbacks") @@ -13,6 +15,7 @@ local report_fallbacks = logs.reporter("math","fallbacks") local formatters = string.formatters local fastcopy = table.fastcopy local byte = string.byte +local sortedhash = table.sortedhash local fallbacks = { } mathematics.fallbacks = fallbacks @@ -26,120 +29,114 @@ local lastmathids = fonts.hashes.lastmathids -- that order we could use their id's .. i.e. we could always add a font -- table with those id's .. in fact, we could also add a whole lot more -- as it doesn't hurt --- --- todo: use index 'true when luatex provides that feature (on the agenda) --- to be considered: --- --- in luatex provide reserve_id (and pass id as field of tfmdata) --- in context define three sizes but pass them later i.e. do virtualize afterwards +local scripscriptdelayed = { } -- 1.005 : add characters later +local scriptdelayed = { } -- 1.005 : add characters later function fallbacks.apply(target,original) - local mathparameters = target.mathparameters -- why not hasmath - if mathparameters then - local characters = target.characters - local parameters = target.parameters - local mathsize = parameters.mathsize - local size = parameters.size - local usedfonts = target.fonts - if not usedfonts then - usedfonts = { } - target.fonts = usedfonts - end - -- This is not okay yet ... we have no proper way to refer to 'self' - -- otherwise I will make my own id allocator). - local self = #usedfonts == 0 and font.nextid() or nil -- will be true - local textid, scriptid, scriptscriptid - local textindex, scriptindex, scriptscriptindex - local textdata, scriptdata, scriptscriptdata - if mathsize == 3 then - -- scriptscriptsize - -- textid = nil -- self - -- scriptid = nil -- no smaller - -- scriptscriptid = nil -- no smaller - textid = self - scriptid = self - scriptscriptid = self - elseif mathsize == 2 then - -- scriptsize - -- textid = nil -- self - textid = self - scriptid = lastmathids[3] - scriptscriptid = lastmathids[3] - else - -- textsize - -- textid = nil -- self - textid = self - scriptid = lastmathids[2] - scriptscriptid = lastmathids[3] - end - if textid then - textindex = #usedfonts + 1 - usedfonts[textindex] = { id = textid } --- textdata = identifiers[textid] or target - textdata = target - else - textdata = target - end - if scriptid then - scriptindex = #usedfonts + 1 - usedfonts[scriptindex] = { id = scriptid } - scriptdata = identifiers[scriptid] - else - scriptindex = textindex - scriptdata = textdata - end - if scriptscriptid then - scriptscriptindex = #usedfonts + 1 - usedfonts[scriptscriptindex] = { id = scriptscriptid } - scriptscriptdata = identifiers[scriptscriptid] - else - scriptscriptindex = scriptindex - scriptscriptdata = scriptdata - end - -- report_fallbacks("used textid: %S, used script id: %S, used scriptscript id: %S",textid,scriptid,scriptscriptid) - local data = { - textdata = textdata, - scriptdata = scriptdata, - scriptscriptdata = scriptscriptdata, - textindex = textindex, - scriptindex = scriptindex, - scriptscriptindex = scriptscriptindex, - textid = textid, - scriptid = scriptid, - scriptscriptid = scriptscriptid, - characters = characters, - unicode = k, - target = target, - original = original, - size = size, - mathsize = mathsize, - } - target.mathrelation = data - -- inspect(usedfonts) - for k, v in next, virtualcharacters do - if not characters[k] then - local tv = type(v) - local cd = nil - if tv == "table" then - cd = v - elseif tv == "number" then - cd = characters[v] - elseif tv == "function" then - cd = v(data) - end - if cd then - characters[k] = cd - else - -- something else - end - if trace_fallbacks and characters[k] then - report_fallbacks("extending math font %a with %U",target.properties.fullname,k) - end + local mathparameters = target.mathparameters + if not mathparameters or not next(mathparameters) then + return + end + -- we also have forcedsize ... at this moment we already passed through + -- constructors.scale so we have this set + local parameters = target.parameters + local mathsize = parameters.mathsize + if mathsize < 1 or mathsize > 3 then + return + end + local characters = target.characters + local size = parameters.size + local usedfonts = target.fonts + if not usedfonts then + usedfonts = { { id = 0 } } -- we need at least one entry (automatically done anyway) + target.fonts = usedfonts + end + -- not used + local textid, scriptid, scriptscriptid + local textindex, scriptindex, scriptscriptindex + local textdata, scriptdata, scriptscriptdata + if mathsize == 3 then + -- scriptscriptsize + textid = 0 + scriptid = 0 + scriptscriptid = 0 + elseif mathsize == 2 then + -- scriptsize + textid = 0 + scriptid = lastmathids[3] or 0 + scriptscriptid = lastmathids[3] or 0 + else + -- textsize + textid = 0 + scriptid = lastmathids[2] or 0 + scriptscriptid = lastmathids[3] or 0 + end + if textid and textid ~= 0 then + textindex = #usedfonts + 1 + textdata = target + usedfonts[textindex] = { id = textid } + else + textdata = target + end + if scriptid and scriptid ~= 0 then + scriptindex = #usedfonts + 1 + scriptdata = identifiers[scriptid] + usedfonts[scriptindex] = { id = scriptid } + else + scriptindex = textindex + scriptdata = textdata + end + if scriptscriptid and scriptscriptid ~= 0 then + scriptscriptindex = #usedfonts + 1 + scriptscriptdata = identifiers[scriptscriptid] + usedfonts[scriptscriptindex] = { id = scriptscriptid } + else + scriptscriptindex = scriptindex + scriptscriptdata = scriptdata + end + -- report_fallbacks("used textid: %S, used script id: %S, used scriptscript id: %S",textid,scriptid,scriptscriptid) + local data = { + textdata = textdata, + scriptdata = scriptdata, + scriptscriptdata = scriptscriptdata, + textindex = textindex, + scriptindex = scriptindex, + scriptscriptindex = scriptscriptindex, + textid = textid, + scriptid = scriptid, + scriptscriptid = scriptscriptid, + characters = characters, + unicode = k, + target = target, + original = original, + size = size, + mathsize = mathsize, + } + target.mathrelation = data + -- + for k, v in sortedhash(virtualcharacters) do + if not characters[k] then + local tv = type(v) + local cd = nil + if tv == "table" then + cd = v + elseif tv == "number" then + cd = characters[v] + elseif tv == "function" then + cd = v(data) -- ,k + end + if cd then + characters[k] = cd + else + -- something else + end + if trace_fallbacks and characters[k] then + report_fallbacks("extending math font %a with %U",target.properties.fullname,k) end end - data.unicode = nil end + data.unicode = nil end utilities.sequencers.appendaction("aftercopyingcharacters","system","mathematics.fallbacks.apply") @@ -160,7 +157,7 @@ end local function raised(data,down) local replacement = data.replacement - local character = data.scriptdata.characters[replacement] + local character = data.scriptdata.characters[replacement] if character then return { width = character.width, @@ -169,6 +166,7 @@ local function raised(data,down) commands = { { "down", down and data.size/4 or -data.size/2 }, -- maybe exheight reference(data.scriptindex,replacement) + -- { "slot", data.scriptindex or 0, char } -- hm, data.mathrelation.scriptindex } } end @@ -232,35 +230,18 @@ end local addextra = mathematics.extras.add -addextra(0xFE350, { - category="sm", - description="MATHEMATICAL DOUBLE ARROW LEFT END", - mathclass="relation", - mathname="ctxdoublearrowfillleftend", - unicodeslot=0xFE350, -} ) - -addextra(0xFE351, { - category="sm", - description="MATHEMATICAL DOUBLE ARROW MIDDLE PART", - mathclass="relation", - mathname="ctxdoublearrowfillmiddlepart", - unicodeslot=0xFE351, -} ) - -addextra(0xFE352, { - category="sm", - description="MATHEMATICAL DOUBLE ARROW RIGHT END", - mathclass="relation", - mathname="ctxdoublearrowfillrightend", - unicodeslot=0xFE352, -} ) +addextra(0xFE350) -- MATHEMATICAL DOUBLE ARROW LEFT END +addextra(0xFE351) -- MATHEMATICAL DOUBLE ARROW MIDDLE PART +addextra(0xFE352) -- MATHEMATICAL DOUBLE ARROW RIGHT END local push = { "push" } local pop = { "pop" } local leftarrow = { "char", 0x2190 } local relbar = { "char", 0x2212 } local rightarrow = { "char", 0x2192 } +-- local leftarrow = { "slot", 0, 0x2190 } +-- local relbar = { "slot", 0, 0x2212 } +-- local rightarrow = { "slot", 0, 0x2192 } virtualcharacters[0xFE350] = function(data) -- return combined(data,0x2190,0x2212) -- leftarrow relbar @@ -334,10 +315,10 @@ local function accent_to_extensible(target,newchr,original,oldchr,height,depth,s local characters = target.characters local olddata = characters[oldchr] -- brrr ... pagella has only next - if olddata and not olddata.commands and olddata.width > 0 then + if olddata and not olddata.commands then -- not: and olddata.width > 0 local addprivate = fonts.helpers.addprivate if swap then - swap = characters[swap] + swap = characters[swap] height = swap.depth or 0 depth = 0 else @@ -347,6 +328,7 @@ local function accent_to_extensible(target,newchr,original,oldchr,height,depth,s local correction = swap and { "down", (olddata.height or 0) - height } or { "down", olddata.height + (offset or 0)} local newdata = { commands = { correction, { "slot", 1, oldchr } }, + -- commands = { correction, { "slot", 0, oldchr } }, width = olddata.width, height = height, depth = depth, @@ -359,11 +341,13 @@ local function accent_to_extensible(target,newchr,original,oldchr,height,depth,s if oldnextdata then local newnextdata = { commands = { correction, { "slot", 1, nextglyph } }, + -- commands = { correction, { "slot", 0, nextglyph } }, width = oldnextdata.width, height = height, depth = depth, } - local newnextglyph = addprivate(target,formatters["M-N-%H"](nextglyph),newnextdata) +-- local newnextglyph = addprivate(target,formatters["M-N-%H"](nextglyph),newnextdata) + local newnextglyph = addprivate(target,nil,newnextdata) newdata.next = newnextglyph local nextnextglyph = oldnextdata.next if nextnextglyph == nextglyph then @@ -389,11 +373,13 @@ local function accent_to_extensible(target,newchr,original,oldchr,height,depth,s if olddata then local newdata = { commands = { correction, { "slot", 1, oldglyph } }, + -- commands = { correction, { "slot", 0, oldglyph } }, width = olddata.width, height = height, depth = depth, } - hvi.glyph = addprivate(target,formatters["M-H-%H"](oldglyph),newdata) +-- hvi.glyph = addprivate(target,formatters["M-H-%H"](oldglyph),newdata) + hvi.glyph = addprivate(target,nil,newdata) else report_fallbacks("error in fallback: no valid horiz_variants, slot %X, index %i",oldglyph,i) end @@ -405,24 +391,38 @@ local function accent_to_extensible(target,newchr,original,oldchr,height,depth,s end end -virtualcharacters[0x203E] = function(data) -- could be FE33E instead +virtualcharacters[0x203E] = function(data) local target = data.target local height, depth = 0, 0 - local mathparameters = target.mathparameters - if mathparameters then - height = mathparameters.OverbarVerticalGap - depth = mathparameters.UnderbarVerticalGap - else +-- local mathparameters = target.mathparameters +-- if mathparameters then +-- height = mathparameters.OverbarVerticalGap +-- depth = mathparameters.UnderbarVerticalGap +-- else height = target.parameters.xheight/4 depth = height - end +-- end return accent_to_extensible(target,0x203E,data.original,0x0305,height,depth,nil,nil,0x203E) end -virtualcharacters[0xFE33E] = virtualcharacters[0x203E] -- convenient -virtualcharacters[0xFE33F] = virtualcharacters[0x203E] -- convenient +-- virtualcharacters[0xFE33E] = virtualcharacters[0x203E] -- convenient +-- virtualcharacters[0xFE33F] = virtualcharacters[0x203E] -- convenient --- spacing +virtualcharacters[0xFE33E] = function(data) + local target = data.target + local height = 0 + local depth = target.parameters.xheight/4 + return accent_to_extensible(target,0xFE33E,data.original,0x0305,height,depth,nil,nil,0x203E) +end + +virtualcharacters[0xFE33F] = function(data) + local target = data.target + local height = target.parameters.xheight/8 + local depth = height + return accent_to_extensible(target,0xFE33F,data.original,0x0305,height,depth,nil,nil,0x203E) +end + +-- spacing (no need for a cache of widths) local c_zero = byte('0') local c_period = byte('.') @@ -431,7 +431,7 @@ local function spacefraction(data,fraction) local width = fraction * data.target.parameters.space return { width = width, - commands = { right = width } + commands = { { "right", width } } } end @@ -439,7 +439,7 @@ local function charfraction(data,char) local width = data.target.characters[char].width return { width = width, - commands = { right = width } + commands = { { "right", width } } } end @@ -447,7 +447,7 @@ local function quadfraction(data,fraction) local width = fraction * data.target.parameters.quad return { width = width, - commands = { right = width } + commands = { { "right", width } } } end @@ -480,17 +480,17 @@ local function smashed(data,unicode,swap,private) end end -addextra(0xFE3DE, { description="EXTENSIBLE OF 0x03DE", unicodeslot=0xFE3DE, mathextensible = "r", mathstretch = "h", mathclass = "topaccent" } ) -addextra(0xFE3DC, { description="EXTENSIBLE OF 0x03DC", unicodeslot=0xFE3DC, mathextensible = "r", mathstretch = "h", mathclass = "topaccent" } ) -addextra(0xFE3B4, { description="EXTENSIBLE OF 0x03B4", unicodeslot=0xFE3B4, mathextensible = "r", mathstretch = "h", mathclass = "topaccent" } ) +addextra(0xFE3DE) -- EXTENSIBLE OF 0x03DE +addextra(0xFE3DC) -- EXTENSIBLE OF 0x03DC +addextra(0xFE3B4) -- EXTENSIBLE OF 0x03B4 virtualcharacters[0xFE3DE] = function(data) return smashed(data,0x23DE,0x23DF,0xFE3DE) end virtualcharacters[0xFE3DC] = function(data) return smashed(data,0x23DC,0x23DD,0xFE3DC) end virtualcharacters[0xFE3B4] = function(data) return smashed(data,0x23B4,0x23B5,0xFE3B4) end -addextra(0xFE3DF, { description="EXTENSIBLE OF 0x03DF", unicodeslot=0xFE3DF, mathextensible = "r", mathstretch = "h", mathclass = "botaccent" } ) -addextra(0xFE3DD, { description="EXTENSIBLE OF 0x03DD", unicodeslot=0xFE3DD, mathextensible = "r", mathstretch = "h", mathclass = "botaccent" } ) -addextra(0xFE3B5, { description="EXTENSIBLE OF 0x03B5", unicodeslot=0xFE3B5, mathextensible = "r", mathstretch = "h", mathclass = "botaccent" } ) +addextra(0xFE3DF) -- EXTENSIBLE OF 0x03DF +addextra(0xFE3DD) -- EXTENSIBLE OF 0x03DD +addextra(0xFE3B5) -- EXTENSIBLE OF 0x03B5 virtualcharacters[0xFE3DF] = function(data) local c = data.target.characters[0x23DF] if c then c.unicode = 0x23DF return c end end virtualcharacters[0xFE3DD] = function(data) local c = data.target.characters[0x23DD] if c then c.unicode = 0x23DD return c end end @@ -498,8 +498,8 @@ virtualcharacters[0xFE3B5] = function(data) local c = data.target.characters[0x2 -- todo: add some more .. numbers might change -addextra(0xFE302, { description="EXTENSIBLE OF 0x0302", unicodeslot=0xFE302, mathstretch = "h", mathclass = "topaccent" } ) -addextra(0xFE303, { description="EXTENSIBLE OF 0x0303", unicodeslot=0xFE303, mathstretch = "h", mathclass = "topaccent" } ) +addextra(0xFE302) -- EXTENSIBLE OF 0x0302 +addextra(0xFE303) -- EXTENSIBLE OF 0x0303 local function smashed(data,unicode,private) local target = data.target @@ -519,18 +519,17 @@ virtualcharacters[0xFE303] = function(data) return smashed(data,0x0303,0xFE303) -- these primes in fonts are a real mess .. kind of a dead end, so don't wonder about -- the values below --- todo: check tounicodes - local function smashed(data,unicode,optional) local oldchar = data.characters[unicode] if oldchar then - local xheight = data.target.parameters.xheight - local height = 1.2 * xheight - local shift = oldchar.height - height + -- local height = 1.25 * data.target.parameters.xheight + local height = 0.85 * data.target.mathparameters.AccentBaseHeight + local shift = oldchar.height - height local newchar = { commands = { { "down", shift }, - { "char", unicode }, + { "slot", 0, unicode }, +-- { "char", unicode }, }, height = height, width = oldchar.width, @@ -541,38 +540,14 @@ local function smashed(data,unicode,optional) end end --- -- relocate all but less flexible so not used .. instead some noad hackery plus --- -- the above --- --- local function smashed(data,unicode,optional) --- local oldchar = data.characters[unicode] --- if oldchar then --- local xheight = data.target.parameters.xheight --- local height = oldchar.height --- local shift = oldchar.height < 1.5*xheight and -(1.8*xheight-height) or 0 --- local newchar = { --- commands = { --- { "down", shift }, --- { "char", unicode }, --- }, --- unicode = unicode, --- height = height, --- width = oldchar.width, --- } --- return newchar --- elseif not optional then --- report_fallbacks("missing %U prime in font %a",unicode,data.target.properties.fullname) --- end --- end - -addextra(0xFE932, { description="SMASHED PRIME 0x02032", unicodeslot=0xFE932 } ) -addextra(0xFE933, { description="SMASHED PRIME 0x02033", unicodeslot=0xFE933 } ) -addextra(0xFE934, { description="SMASHED PRIME 0x02034", unicodeslot=0xFE934 } ) -addextra(0xFE957, { description="SMASHED PRIME 0x02057", unicodeslot=0xFE957 } ) +addextra(0xFE932) -- SMASHED PRIME 0x02032 +addextra(0xFE933) -- SMASHED PRIME 0x02033 +addextra(0xFE934) -- SMASHED PRIME 0x02034 +addextra(0xFE957) -- SMASHED PRIME 0x02057 -addextra(0xFE935, { description="SMASHED BACKWARD PRIME 0x02035", unicodeslot=0xFE935 } ) -addextra(0xFE936, { description="SMASHED BACKWARD PRIME 0x02036", unicodeslot=0xFE936 } ) -addextra(0xFE937, { description="SMASHED BACKWARD PRIME 0x02037", unicodeslot=0xFE937 } ) +addextra(0xFE935) -- SMASHED BACKWARD PRIME 0x02035 +addextra(0xFE936) -- SMASHED BACKWARD PRIME 0x02036 +addextra(0xFE937) -- SMASHED BACKWARD PRIME 0x02037 virtualcharacters[0xFE932] = function(data) return smashed(data,0x02032) end virtualcharacters[0xFE933] = function(data) return smashed(data,0x02033) end @@ -583,9 +558,41 @@ virtualcharacters[0xFE935] = function(data) return smashed(data,0x02035,true) en virtualcharacters[0xFE936] = function(data) return smashed(data,0x02036,true) end virtualcharacters[0xFE937] = function(data) return smashed(data,0x02037,true) end +local hack = nil + +function mathematics.getridofprime(target,original) +-- local mathsize = specification.mathsize +-- if mathsize == 1 or mathsize == 2 or mathsize == 3) then + local mathparameters = original.mathparameters + if mathparameters and next(mathparameters) then + local changed = original.changed + if changed then + hack = changed[0x02032] + changed[0x02032] = nil + changed[0x02033] = nil + changed[0x02034] = nil + changed[0x02057] = nil + changed[0x02035] = nil + changed[0x02036] = nil + changed[0x02037] = nil + end + end +end + +function mathematics.setridofprime(target,original) + local mathparameters = original.mathparameters + if mathparameters and next(mathparameters) and original.changed then + target.characters[0xFE931] = target.characters[hack or 0x2032] + hack = nil + end +end + +utilities.sequencers.appendaction("beforecopyingcharacters","system","mathematics.getridofprime") +utilities.sequencers.appendaction("aftercopyingcharacters", "system","mathematics.setridofprime") + -- actuarian (beware: xits has an ugly one) -addextra(0xFE940, { category = "mn", description="SMALL ANNUITY SYMBOL", unicodeslot=0xFE940, mathclass="topaccent", mathname="smallactuarial" }) +addextra(0xFE940) -- SMALL ANNUITY SYMBOL local function actuarian(data) local characters = data.target.characters @@ -612,3 +619,49 @@ end virtualcharacters[0x020E7] = actuarian -- checked virtualcharacters[0xFE940] = actuarian -- unchecked + +local function equals(data,unicode,snippet,advance,n) -- mathpair needs them + local characters = data.target.characters + local parameters = data.target.parameters + local basechar = characters[snippet] + local advance = advance * parameters.quad + return { + unicode = unicode, + width = n*basechar.width + (n-1)*advance, + commands = { + { "char", snippet }, + { "right", advance }, + { "char", snippet }, + n > 2 and { "right", advance } or nil, + n > 2 and { "char", snippet } or nil, + }, + } +end + +virtualcharacters[0x2A75] = function(data) return equals(data,0x2A75,0x003D, 1/5,2) end -- == +virtualcharacters[0x2A76] = function(data) return equals(data,0x2A76,0x003D, 1/5,3) end -- === +virtualcharacters[0x2980] = function(data) return equals(data,0x2980,0x007C,-1/8,3) end -- ||| + +-- addextra(0xFE941) -- EXTREMELY IDENTICAL TO +-- +-- virtualcharacters[0xFE941] = function(data) -- this character is only needed for mathpairs +-- local characters = data.target.characters +-- local parameters = data.target.parameters +-- local basechar = characters[0x003D] +-- local width = basechar.width or 0 +-- local height = basechar.height or 0 +-- local depth = basechar.depth or 0 +-- return { +-- unicode = 0xFE941, +-- width = width, +-- height = height, -- we cheat (no time now) +-- depth = depth, -- we cheat (no time now) +-- commands = { +-- { "down", - height/2 }, -- sort of works +-- { "char", 0x003D }, +-- { "right", -width }, +-- { "down", height }, -- sort of works +-- { "char", 0x003D }, +-- }, +-- } +-- end diff --git a/tex/context/base/mkiv/math-fen.mkiv b/tex/context/base/mkiv/math-fen.mkiv index 320dffeb8..a32ea410e 100644 --- a/tex/context/base/mkiv/math-fen.mkiv +++ b/tex/context/base/mkiv/math-fen.mkiv @@ -15,6 +15,14 @@ \unprotect +% maybe always "method=auto" for: +% +% \switchtobodyfont[cambria] +% \ruledhbox{$f(x)$} +% \ruledhbox{\mathdelimitersmode6$f\left(x\right)$} +% \ruledhbox{\mathdelimitersmode7$f\left(x\right)$} +% \ruledhbox{$f\left(\frac{1}{x}\right)$} + % todo: mathstyle % \definemathfence [fancybracket] [bracket] [command=yes,color=blue] @@ -38,12 +46,14 @@ \let\setupmathfences\setupmathfence \setupmathfences - [\c!left=, + [\c!method=, % maybe always \v!auto + \c!left=, \c!right=, \c!middle=, \c!mathstyle=, \c!color=, \c!command=, + \c!mathclass=, \c!factor=\v!auto] \appendtoks @@ -61,17 +71,40 @@ {\ifx#1\empty #2.% \else + \edef\p_mathclass{\mathfenceparameter\c!mathclass}% \edef\p_factor{\mathfenceparameter\c!factor}% \ifx\p_factor\empty - #2% + \ifx\p_mathclass\empty + #2% + \else + #3% + \s!class\p_mathclass + \fi \else\ifx\p_factor\v!auto - #2% + \ifx\p_mathclass\empty + #2% + \else + #3% + \s!class\p_mathclass + \fi \else\ifx\p_factor\v!none - #3\s!height\zeropoint\s!depth\zeropoint\s!axis - #2% + #3% + \s!height\zeropoint + \s!depth\zeropoint + \ifx\p_mathclass\empty\else + \s!class\p_mathclass + \fi + \s!axis + % #2% \else \scratchdimen\dimexpr\p_factor\bodyfontsize/2\relax - #3\s!height\scratchdimen\s!depth\scratchdimen\s!axis + #3% + \s!height\scratchdimen + \s!depth\scratchdimen + \ifx\p_mathclass\empty\else + \s!class\p_mathclass + \fi + \s!axis \fi\fi\fi \Udelimiter#4\fam#1\relax \fi} @@ -94,7 +127,7 @@ \def\math_fenced_middle {\edef\p_middle - {\mathfenceparameter\c!middle}% + {\mathfenceparameter\c!middle}% \mskip\thinmuskip \math_fenced_color_push % \normalmiddle\ifx\p_middle\empty.\else\Udelimiter\plusfour\fam\p_middle\relax\fi @@ -771,14 +804,14 @@ \unexpanded\def\stopcheckedfences {\endgroup} -\appendtoks +% \appendtoks % maybe: safeguard against overloading % % \let\left \math_fences_used_left % \let\right \math_fences_used_right % \let\middle \math_fences_used_middle % \let\leftorright\math_fences_used_both -\to \everymathematics +% \to \everymathematics \appendtoks \ifx\currentmathfence\empty @@ -786,6 +819,19 @@ \fi \to \everysetupmathfence +\newconstant\c_math_fences_delimiters_mode \c_math_fences_delimiters_mode"16 % \numexpr"02+"04+"10\relax + +%unexpanded\def\enableautofencemode {\mathdelimitersmode\plussix} % the shift (1) is too fragile +\unexpanded\def\enableautofencemode {\mathdelimitersmode\c_math_fences_delimiters_mode} + +\unexpanded\def\disableautofencemode{\mathdelimitersmode\zerocount} + +\appendtoks + \ifx\currentmathfence\empty + \doifelse{\mathfenceparameter\c!method}\v!auto\enableautofencemode\disableautofencemode + \fi +\to \everysetupmathfence + % some day default: \setupmathfences[\c!state=\v!auto] %D The next characters were used for constructing nicer extensibles but diff --git a/tex/context/base/mkiv/math-frc.lua b/tex/context/base/mkiv/math-frc.lua index 639edc94b..5c4879527 100644 --- a/tex/context/base/mkiv/math-frc.lua +++ b/tex/context/base/mkiv/math-frc.lua @@ -6,15 +6,15 @@ if not modules then modules = { } end modules ['math-frc'] = { license = "see context related readme files" } -local utfchar = utf.char +local utfchar = utf.char -local context = context +local context = context local variables = interfaces.variables -local v_no = variables.no -local v_yes = variables.yes +local v_no = variables.no +local v_yes = variables.yes -local resolved = { +local resolved = { [0x007B] = "\\{", [0x007D] = "\\}", } diff --git a/tex/context/base/mkiv/math-frc.mkiv b/tex/context/base/mkiv/math-frc.mkiv index 16ea6e9e1..9a5ce62b0 100644 --- a/tex/context/base/mkiv/math-frc.mkiv +++ b/tex/context/base/mkiv/math-frc.mkiv @@ -26,7 +26,7 @@ %D This module is reimplemented in \MKIV\ style. -\registerctxluafile{math-frc}{1.001} +\registerctxluafile{math-frc}{} %D \macros %D {frac, xfrac, xxfrac} @@ -195,6 +195,11 @@ {\begingroup \edef\currentmathfraction{#1}% % + \edef\p_math_fraction_fences{\mathfractionparameter\c!fences}% + \ifx\p_math_fraction_fences\empty \else + \math_fenced_fenced_start\p_math_fraction_fences + \fi + % \d_math_fraction_margin\mathfractionparameter\c!margin % \edef\p_math_fractions_color{\mathfractionparameter\c!color}% @@ -212,6 +217,12 @@ \expandafter\math_frac_colored \fi} +\unexpanded\def\math_frac_wrapup + {\ifx\p_math_fraction_fences\empty \else + \math_fenced_fenced_stop\p_math_fraction_fences + \fi + \endgroup} + \unexpanded\def\math_frac_colored#1#2% {\savecolor \colo_helpers_activate\p_math_fractions_color @@ -222,11 +233,18 @@ % we use utfchar anyway so we can as well do all at the lua end +\def\math_frac_no_delim{0x2E} + \def\math_frac_command {\clf_mathfraction {\mathfractionparameter\c!rule}% - \mathfractionparameter\c!left\space - \mathfractionparameter\c!right\space + \ifx\p_math_fraction_fences\empty + \mathfractionparameter\c!left \space + \mathfractionparameter\c!right\space + \else + \math_frac_no_delim\space + \math_frac_no_delim\space + \fi \dimexpr\mathfractionparameter\c!rulethickness\relax \relax} @@ -235,6 +253,8 @@ % also makes testing easier. When left and right margins are needed we might merge the % variants again. After all, these are not real installers. +% the denominator is in cramped! + \setvalue{\??mathfractionalternative\v!inner}% {\ifcase\d_math_fraction_margin \expandafter\math_fraction_inner_normal @@ -265,7 +285,8 @@ \math_frac_command {\usemathstyleparameter\mathfractionparameter{\m_fractions_strut_bot#2}}% }% - }\endgroup} + }% + \math_frac_wrapup} \def\math_fraction_outer_normal#1#2% {\Ustack{% @@ -275,7 +296,8 @@ \math_frac_command {\m_fractions_strut_bot#2}% }% - }\endgroup} + }% + \math_frac_wrapup} \def\math_fraction_both_normal#1#2% {\Ustack{% @@ -285,7 +307,8 @@ \math_frac_command {\usemathstyleparameter\mathfractionparameter\m_fractions_strut_bot#2}% }% - }\endgroup} + }% + \math_frac_wrapup} \def\math_fraction_inner_margin#1#2% {\Ustack{% @@ -298,7 +321,8 @@ \usemathstyleparameter\mathfractionparameter{\m_fractions_strut_bot#2}% \kern\d_math_fraction_margin}% }% - }\endgroup} + }% + \math_frac_wrapup} \def\math_fraction_outer_margin#1#2% {\Ustack{% @@ -312,7 +336,8 @@ \m_fractions_strut_bot#2% \kern\d_math_fraction_margin}% }% - }\endgroup} + }% + \math_frac_wrapup} \def\math_fraction_both_margin#1#2% {\Ustack{% @@ -326,8 +351,8 @@ \usemathstyleparameter\mathfractionparameter\m_fractions_strut_bot#2% \kern\d_math_fraction_margin}% }% - }\endgroup} - + }% + \math_frac_wrapup} \definemathfraction[xfrac] [\c!alternative=\v!inner,\c!mathstyle=\s!script] \definemathfraction[xxfrac][\c!alternative=\v!inner,\c!mathstyle=\s!scriptscript] @@ -370,6 +395,47 @@ \fi \to \everymathematics +% theshold is new! + +\let\math_fraction_set_threshold_inline \relax +\let\math_fraction_set_threshold_display\relax + +\appendtoks + \math_fraction_set_threshold_inline + \math_fraction_set_threshold_display +\to \everymathematics + +\appendtoks + \ifx\currentmathfraction\empty + \edef\p_threshold{\mathfractionparameter\c!inlinethreshold}% + \ifx\p_threshold\empty + \let\math_fraction_set_threshold_inline\relax + \else\ifx\p_threshold\v!auto + \let\math_fraction_set_threshold_inline\relax + \else + \let\math_fraction_set_threshold_inline\math_fraction_set_theshold_inline + \fi\fi + \edef\p_threshold{\mathfractionparameter\c!displaythreshold}% + \ifx\p_threshold\empty + \let\math_fraction_set_threshold_display\relax + \else\ifx\p_threshold\v!auto + \let\math_fraction_set_threshold_display\relax + \else + \let\math_fraction_set_threshold_display\math_fraction_set_theshold_display + \fi\fi + \fi +\to \everysetupmathfraction + +\def\math_fraction_set_theshold_inline + {\edef\p_threshold{\mathfractionparameter\c!inlinethreshold}% + \Umathfractiondelsize\textstyle \p_threshold\dimexpr\textface\relax + \Umathfractiondelsize\scriptstyle \p_threshold\dimexpr\scriptface\relax + \Umathfractiondelsize\scriptscriptstyle\p_threshold\dimexpr\scriptscriptface\relax} + +\def\math_fraction_set_theshold_display + {\edef\p_threshold{\mathfractionparameter\c!displaythreshold}% + \Umathfractiondelsize\displaystyle \p_threshold\dimexpr\textface\relax} + %D \macros %D {dfrac, tfrac, frac, dbinom, tbinom, binom} %D @@ -451,9 +517,23 @@ % \unexpanded\def\dbinom#1#2{{\displaystyle{{#1}\normalabovewithdelims()\zeropoint{#2}}}} % \unexpanded\def\tbinom#1#2{{\textstyle {{#1}\normalabovewithdelims()\zeropoint{#2}}}} -\definemathfraction[binom] [\c!alternative=\v!outer,\c!rule=\v!no,\c!left=0x28,\c!right=0x29,\c!mathstyle=\s!auto] -\definemathfraction[dbinom][\c!alternative=\v!outer,\c!rule=\v!no,\c!left=0x28,\c!right=0x29,\c!mathstyle=\s!display] -\definemathfraction[tbinom][\c!alternative=\v!outer,\c!rule=\v!no,\c!left=0x28,\c!right=0x29,\c!mathstyle=\s!text] +\definemathfraction + [binom] + [\c!alternative=\v!outer, + \c!rule=\v!no, + \c!left=0x28, + \c!right=0x29, + \c!mathstyle=\s!auto] + +\definemathfraction + [dbinom] + [binom] + [\c!mathstyle=\s!display] + +\definemathfraction + [tbinom] + [binom] + [\c!mathstyle=\s!text] %D \macros %D {cfrac} diff --git a/tex/context/base/mkiv/math-ini.lua b/tex/context/base/mkiv/math-ini.lua index 2cb4e2413..b79ef8c8c 100644 --- a/tex/context/base/mkiv/math-ini.lua +++ b/tex/context/base/mkiv/math-ini.lua @@ -15,9 +15,11 @@ if not modules then modules = { } end modules ['math-ini'] = { -- to the fam when set ... we use other means .. ok, we could use it for spacing but -- then we also have to set the other characters (only a subset done now) +local next, type = next, type local formatters, find = string.formatters, string.find local utfchar, utfbyte, utflength = utf.char, utf.byte, utf.length -local floor = math.floor +----- floor = math.floor +local sortedhash = table.sortedhash local toboolean = toboolean local context = context @@ -132,11 +134,39 @@ local extensibles = allocate { table.setmetatableindex(extensibles,function(t,k) t[k] = 0 return 0 end) -mathematics.extensibles = extensibles -mathematics.classes = classes -mathematics.codes = codes ------------.accents = codes -mathematics.families = families +local virtualized = allocate { +} + +function mathematics.virtualize(unicode,virtual) + + local function virtualize(k,v) + local c = virtualized[k] + if c == v then + report_math("character %C is already virtualized to %C",k,v) + elseif c then + report_math("character %C is already virtualized to %C, ignoring mapping to %C",k,c,v) + else + virtualized[k] = v + end + end + + if type(unicode) == "table" then + for k, v in next, unicode do + virtualize(k,v) + end + elseif type(unicode) == "number" and type(virtual) == "number" then + virtualize(unicode,virtual) + -- else + -- error + end +end + +mathematics.extensibles = extensibles +mathematics.classes = classes +mathematics.codes = codes +-----------.accents = codes +mathematics.families = families +mathematics.virtualized = virtualized -- there will be proper functions soon (and we will move this code in-line) -- no need for " in class and family (saves space) @@ -257,7 +287,7 @@ function mathematics.define(family) family = family or 0 family = families[family] or family local data = characters.data - for unicode, character in next, data do + for unicode, character in sortedhash(data) do local symbol = character.mathsymbol local mset, dset = true, true if symbol then @@ -272,7 +302,8 @@ function mathematics.define(family) end local spec = other.mathspec if spec then - for i, m in next, spec do + for i=1,#spec do + local m = spec[i] local class = m.class if class then class = classes[class] or class -- no real checks needed @@ -284,14 +315,29 @@ function mathematics.define(family) local mathclass = character.mathclass local mathspec = character.mathspec if mathspec then - for i, m in next, mathspec do + if mathclass then + local name = character.mathname + if name then + report_math("fatal error, conlicting mathclass and mathspec for %C",unicode) + os.exit() + else + local class = classes[mathclass] or mathclass -- no real checks needed + if not class then + if trace_defining then + report("unknown",family,unicode) + end + else + if trace_defining then + report(class,family,unicode) + end + mset, dset = setmathcharacter(class,family,unicode,unicode,mset,dset) + end + end + end + for i=1,#mathspec do + local m = mathspec[i] local name = m.name local class = m.class - if not class then - class = mathclass - elseif not mathclass then - mathclass = class - end if class then class = classes[class] or class -- no real checks needed if name then @@ -300,7 +346,7 @@ function mathematics.define(family) end setmathsymbol(name,class,family,unicode) else - name = class == classes.variable or class == classes.number and character.adobename + name = (class == classes.variable or class == classes.number) and character.adobename -- bad if name and trace_defining then report(class,family,unicode,name) end @@ -308,17 +354,22 @@ function mathematics.define(family) mset, dset = setmathcharacter(class,family,unicode,m.unicode or unicode,mset,dset) -- see solidus end end - end - if mathclass then + elseif mathclass then local name = character.mathname local class = classes[mathclass] or mathclass -- no real checks needed - if name == false then + if not class then + if trace_defining then + report("unknown",family,unicode,name) + end + elseif name == false then if trace_defining then report(class,family,unicode,name) end - mset, dset = setmathcharacter(class,family,unicode,mset,dset) + mset, dset = setmathcharacter(class,family,unicode,unicode,mset,dset) else - name = name or character.contextname + -- if not name then + -- name = character.contextname -- too dangerous, we loose textslash and a few more + -- end if name then if trace_defining then report(class,family,unicode,name) diff --git a/tex/context/base/mkiv/math-ini.mkiv b/tex/context/base/mkiv/math-ini.mkiv index 8c682bdcb..17d900d74 100644 --- a/tex/context/base/mkiv/math-ini.mkiv +++ b/tex/context/base/mkiv/math-ini.mkiv @@ -64,18 +64,19 @@ % test [[\char948 \cldcontext{utf.char(948)}]] % test $[[\char948 \cldcontext{utf.char(948)}]]$ -\registerctxluafile{math-ini}{1.001} -\registerctxluafile{math-dim}{1.001} -\registerctxluafile{math-act}{1.001} -\registerctxluafile{math-ext}{1.001} -\registerctxluafile{math-vfu}{1.001} -\registerctxluafile{math-ttv}{1.001} -\registerctxluafile{math-map}{1.001} -\registerctxluafile{math-ren}{1.001} -\registerctxluafile{math-noa}{1.001} -\registerctxluafile{math-tag}{1.001} -\registerctxluafile{math-fbk}{1.001} -\registerctxluafile{math-dir}{1.001} +\registerctxluafile{math-ini}{} +\registerctxluafile{math-dim}{} +\registerctxluafile{math-act}{} +\registerctxluafile{math-ext}{} +\registerctxluafile{math-vfu}{} +\registerctxluafile{math-ttv}{} +\registerctxluafile{math-map}{optimize} +\registerctxluafile{math-ren}{} +\registerctxluafile{math-noa}{optimize} +\registerctxluafile{math-tag}{} +\registerctxluafile{math-fbk}{} +\registerctxluafile{math-dir}{} +\registerctxluafile{math-spa}{} %D A starter: %D @@ -121,6 +122,7 @@ \definesystemattribute[mathkernpairs] [public] \definesystemattribute[mathbidi] [public] \definesystemattribute[mathdomain] [public] +\definesystemattribute[mathcollapsing] [public] \definesystemattribute[displaymath] [public] @@ -167,6 +169,17 @@ {\endgroup \stopimath} +\unexpanded\def\startpickupmath % for the moment private + {\ifconditional\indisplaymath + \startforceddisplaymath + \let\stoppickupmath\stopforceddisplaymath + \else + \startimath + \let\stoppickupmath\stopimath + \fi} + +\let\stoppickupmath\relax + % \unexpanded\def\rawmathcharacter#1% slow but only for tracing % {\begingroup % \ifmmode @@ -288,31 +301,52 @@ % e.g.: \definemathematics[i:mp][setups=i:tight,openup=yes] -\newmuskip\defaultthickmuskip \defaultthickmuskip 5mu plus 5mu -\newmuskip\defaultmedmuskip \defaultmedmuskip 4mu plus 2mu minus 4mu -\newmuskip\defaultthinmuskip \defaultthinmuskip 3mu +\newmuskip\defaultthickmuskip \defaultthickmuskip 5mu plus 5mu +\newmuskip\defaultmedmuskip \defaultmedmuskip 4mu plus 2mu minus 4mu +\newmuskip\defaultthinmuskip \defaultthinmuskip 3mu -\newmuskip\halfthickmuskip \halfthickmuskip 2.5mu plus 2.5mu -\newmuskip\halfmedmuskip \halfmedmuskip 2.0mu plus 1.0mu minus 2.0mu -\newmuskip\halfthinmuskip \halfthinmuskip 1.5mu +\newmuskip\halfthickmuskip \halfthickmuskip 2.5mu plus 2.5mu +\newmuskip\halfmedmuskip \halfmedmuskip 2.0mu plus 1.0mu minus 2.0mu +\newmuskip\halfthinmuskip \halfthinmuskip 1.5mu -\newcount \defaultrelpenalty \defaultrelpenalty 500 -\newcount \defaultbinoppenalty \defaultbinoppenalty 700 +\newcount \defaultrelpenalty \defaultrelpenalty 500 +\newcount \defaultbinoppenalty \defaultbinoppenalty 700 +\newcount \defaultprerelpenalty \defaultprerelpenalty -100 +\newcount \defaultprebinoppenalty \defaultprebinoppenalty -100 + +% we need to control these otherwise: +% +% \prerelpenalty \defaultprerelpenalty +% \prebinoppenalty\defaultprebinoppenalty \startsetups math:spacing:default - \thickmuskip \defaultthickmuskip - \medmuskip \defaultmedmuskip - \thinmuskip \defaultthinmuskip - \relpenalty \defaultrelpenalty - \binoppenalty \defaultbinoppenalty + \thickmuskip \defaultthickmuskip + \medmuskip \defaultmedmuskip + \thinmuskip \defaultthinmuskip + \relpenalty \defaultrelpenalty + \binoppenalty \defaultbinoppenalty + \prebinoppenalty\maxdimen + \prerelpenalty \maxdimen +\stopsetups + +\startsetups math:spacing:split + \thickmuskip \defaultthickmuskip + \medmuskip \defaultmedmuskip + \thinmuskip \defaultthinmuskip + \relpenalty \defaultrelpenalty + \binoppenalty \defaultbinoppenalty + \prebinoppenalty\defaultprebinoppenalty + \prerelpenalty \defaultprerelpenalty \stopsetups \startsetups math:spacing:half - \thickmuskip \halfthickmuskip - \medmuskip \halfmedmuskip - \thinmuskip \halfthinmuskip - \relpenalty \defaultrelpenalty - \binoppenalty \defaultbinoppenalty + \thickmuskip \halfthickmuskip + \medmuskip \halfmedmuskip + \thinmuskip \halfthinmuskip + \relpenalty \defaultrelpenalty + \binoppenalty \defaultbinoppenalty + \prebinoppenalty\maxdimen + \prerelpenalty \maxdimen \stopsetups \startsetups math:spacing:tight @@ -325,8 +359,10 @@ \medmuskip 1\halfmedmuskip \thinmuskip 1\halfthinmuskip \fi - \relpenalty \defaultrelpenalty - \binoppenalty \maxdimen + \relpenalty \defaultrelpenalty + \binoppenalty \maxdimen + \prebinoppenalty\maxdimen + \prerelpenalty \maxdimen \stopsetups \startsetups math:spacing:fixed @@ -339,8 +375,10 @@ \medmuskip 1\halfmedmuskip \thinmuskip 1\halfthinmuskip \fi - \relpenalty \maxdimen - \binoppenalty \maxdimen + \relpenalty \maxdimen + \binoppenalty \maxdimen + \prebinoppenalty\maxdimen + \prerelpenalty \maxdimen \stopsetups % \dorecurse{80}{test \m[i:tight]{\red \fakeformula} test } @@ -632,7 +670,7 @@ \letcsnamecsname\csname#1\endcsname\csname\??mathcommand#1\endcsname} \unexpanded\def\mathcommand#1% - {\csname\??mathcommand#1\endcsname} + {\begincsname\??mathcommand#1\endcsname} %D Let's define a few comands here: @@ -757,29 +795,21 @@ \c!functionstyle=, % rm ss etc i.e. known alternatives, otherwise math \c!functioncolor=] -% \unexpanded\def\math_mfunction_styled -% {\edef\m_math_text_choice_face{\textstyleface\normalmathstyle}% -% \dowithnextbox -% {\mathop{\box\nextbox}}% -% \hbox\bgroup -% \usemathematicsstyleandcolor\c!functionstyle\c!functioncolor -% \m_math_text_choice_face -% \let\next} - \unexpanded\def\math_mfunction_styled {\begingroup \usemathematicscolorparameter\c!functioncolor \edef\p_functionstyle{\mathematicsparameter\c!functionstyle}% \ifx\p_functionstyle\empty \expandafter\math_mfunction_styled_none - \else\ifcsname\??alternativestyles\p_functionstyle\endcsname + \else\ifcsname\??alternativestyle\p_functionstyle\endcsname \doubleexpandafter\math_mfunction_styled_text \else \doubleexpandafter\math_mfunction_styled_math \fi\fi} \unexpanded\def\math_mfunction_styled_text#1% - {\mathoptext{\csname\??alternativestyles\p_functionstyle\endcsname#1}% + %{\mathoptext{\csname\??alternativestyle\p_functionstyle\endcsname#1}% + {\expandafter\mathoptext\expandafter{\lastnamedcs#1}% \endgroup} \unexpanded\def\math_mfunction_styled_math#1% @@ -920,6 +950,75 @@ \activatemathcharacter\underscoreasciicode \activatemathcharacter\ampersandasciicode +\appendtoks + \edef\p_ampersand{\mathematicsparameter\s!ampersand}% + \ifx\p_ampersand\v!normal + \let\specialmathaligntab\normalmathaligntab + \else + \let\specialmathaligntab\mathampersand + \fi +\to \everysetupmathematics + +%D A simplified version of this code is: +%D +%D \starttyping +%D \catcode"26=12 +%D +%D \bgroup +%D \global\mathcode"26="8000 +%D +%D \catcode"26=4 +%D +%D \xdef\normalmathaligntab{&} +%D +%D \catcode"26=13 +%D +%D \global\everymath{\def&{\normalmathaligntab}} +%D \egroup +%D \stoptyping +%D +%D The following works okay: +%D +%D \starttyping +%D A & B +%D \stoptyping +%D +%D As does: +%D +%D \starttyping +%D $A \Umathchar"2"0"26 B$ +%D \stoptyping +%D +%D But the next code: +%D +%D \starttyping +%D $A \char"26 B$ +%D \stoptyping +%D +%D fails with: \type{Misplaced alignment tab character &} and here is the +%D reason. +%D +%D When we have a letter or other category a check happens for an active +%D character and when it has one then it gets expanded and fed back into the +%D scanner (sort of). +%D +%D A \type {\char} is also fed back as raw character and again when it's letter +%D of other goes through the same process. +%D +%D This means that we cannot have a definition like: +%D +%D \starttyping +%D \def\AND{\char"26\relax} +%D \stoptyping +%D +%D that can be used in math mode, which is why the cweb macros do: +%D +%D \starttyping +%D \def\AND{\def\AND{\mathchar"2026\relax}\AND} +%D \stoptyping +%D +%D Maybe we need an option to treat chars like chars. + % \activatemathcharacter\primeasciicode % not used: @@ -1037,17 +1136,33 @@ % % \egroup +% $\char26$ gives an error because it expands to an active character that +% then becomes an & which is then seen as an alignment character; anyway, +% even when we switch like this the diufferen tmeaning only happens when +% we're in math mode which can be delayed till we're in a cell + \bgroup \catcode\underscoreasciicode\activecatcode \catcode\circumflexasciicode\activecatcode \catcode\ampersandasciicode \activecatcode + \glet\specialmathaligntab\normalmathaligntab + + \unexpanded\gdef\obeymathcatcodes + {\let _\normalsubscript + \let ^\normalsuperscript + \def &\specialmathaligntab + } + \doglobal \appendtoks \let _\normalsubscript \let ^\normalsuperscript - \let &\normalmathaligntab % use \def when it's \aligntab - \to \everymathematics + \let &\specialmathaligntab + \to \everymathematics + + % \unexpanded\gdef\normalmathampersands + % {\let\specialmathaligntab\mathampersand} \egroup @@ -1304,6 +1419,39 @@ \s!lcgreek=\v!italic, \s!ucgreek=\v!normal] % was: none +%D Math collapsing (ligatures) + +\installcorenamespace{mathcollapsing} + +\setnewconstant\c_math_collapsing_attribute\attributeunsetvalue + +\letvalue{\??mathcollapsing 1}\plusone % specials +\letvalue{\??mathcollapsing 2}\plustwo % specials + mathlist +\letvalue{\??mathcollapsing 3}\plusthree % mathlist + specials +\letvalue{\??mathcollapsing\v!none }\attributeunsetvalue +\letvalue{\??mathcollapsing\v!reset}\attributeunsetvalue + +\def\math_collapsing_initialize + {\ifnum\c_math_collapsing_attribute=\attributeunsetvalue \else + \clf_initializemathcollapsing % one time + \global\let\math_collapsing_initialize\relax + \fi} + +\appendtoks + \edef\p_collapsing{\mathematicsparameter\s!collapsing}% + \c_math_collapsing_attribute + \ifcsname\??mathcollapsing\p_collapsing\endcsname\lastnamedcs\else\attributeunsetvalue\fi + \relax +\to \everyswitchmathematics % only in mathematics + +\appendtoks + \math_collapsing_initialize + \attribute\mathcollapsingattribute\c_math_collapsing_attribute +\to \everymathematics + +\setupmathematics + [\s!collapsing=3] % mathlist wins over specials + %D Math italics (experiment) %D We need keys but what names to use and because we have hardcoded solution @@ -1326,14 +1474,6 @@ \global\let\math_italics_initialize\relax \fi} -% \appendtoks -% \edef\p_italics{\mathematicsparameter\s!italics}% -% \c_math_italics_attribute\csname\??mathitalics -% \ifcsname\??mathitalics\p_italics\endcsname\p_italics\else\v!none\fi -% \endcsname\relax -% % \math_italics_initialize -% \to \everyswitchmathematics % only in mathematics - \appendtoks \edef\p_italics{\mathematicsparameter\s!italics}% \c_math_italics_attribute @@ -1347,8 +1487,8 @@ \attribute\mathitalicsattribute\c_math_italics_attribute \to \everymathematics -\setupmathematics - [\s!italics=3] % 4 is probably better +% \setupmathematics % done later +% [\s!italics=3] % 4 is probably better % looks nicer but can generate bogus csnames % @@ -1466,44 +1606,50 @@ % % The next one is more efficient as it produces more flat noad lists for numbers. -\setnewconstant\c_math_comma "002C -\setnewconstant\c_math_period "002E -\setnewconstant\c_math_special"8000 +\setnewconstant\c_math_comma "002C +\setnewconstant\c_math_period "002E +%setnewconstant\c_math_colon "003A +\setnewconstant\c_math_semicolon"003B +\setnewconstant\c_math_special "8000 -\def\math_set_o_period{\Umathcode\c_math_period\mathordcode \zerocount\c_math_period} -\def\math_set_p_period{\Umathcode\c_math_period\mathpunctcode\zerocount\c_math_period} -\def\math_set_o_comma {\Umathcode\c_math_comma \mathordcode \zerocount\c_math_comma } -\def\math_set_p_comma {\Umathcode\c_math_comma \mathpunctcode\zerocount\c_math_comma } +\def\math_set_o_comma {\Umathcode\c_math_comma \mathordcode \zerocount\c_math_comma} +\def\math_set_p_comma {\Umathcode\c_math_comma \mathpunctcode\zerocount\c_math_comma} +\def\math_set_o_period {\Umathcode\c_math_period \mathordcode \zerocount\c_math_period} +\def\math_set_p_period {\Umathcode\c_math_period \mathpunctcode\zerocount\c_math_period} +\def\math_set_o_semicolon{\Umathcode\c_math_semicolon\mathordcode \zerocount\c_math_semicolon} +\def\math_set_p_semicolon{\Umathcode\c_math_semicolon\mathpunctcode\zerocount\c_math_semicolon} \edef\math_set_o_both {\math_set_o_period\math_set_o_comma} \edef\math_set_p_both {\math_set_p_period\math_set_p_comma} -\unexpanded\def\math_punctuation_nop_comma {\begingroup\math_set_p_comma ,\endgroup} -\unexpanded\def\math_punctuation_nop_period{\begingroup\math_set_o_period.\endgroup} +\unexpanded\def\math_punctuation_nop_comma {\begingroup\math_set_p_comma ,\endgroup} +\unexpanded\def\math_punctuation_nop_period {\begingroup\math_set_o_period .\endgroup} +\unexpanded\def\math_punctuation_nop_semicolon{\begingroup\math_set_p_semicolon;\endgroup} -\unexpanded\def\math_punctuation_all_comma {\futurelet\nexttoken\math_punctuation_comma_next} -\unexpanded\def\math_punctuation_all_period{\futurelet\nexttoken\math_punctuation_period_next} +\unexpanded\def\math_punctuation_all_comma {\futurelet\nexttoken\math_punctuation_comma_next} +\unexpanded\def\math_punctuation_all_period {\futurelet\nexttoken\math_punctuation_period_next} +\unexpanded\def\math_punctuation_all_semicolon{\futurelet\nexttoken\math_punctuation_semicolon_next} - \let\math_punctuation_yes_comma \math_punctuation_all_comma - \let\math_punctuation_yes_period\math_punctuation_nop_period + \let\math_punctuation_yes_comma \math_punctuation_all_comma + \let\math_punctuation_yes_period \math_punctuation_nop_period + \let\math_punctuation_yes_semicolon\math_punctuation_all_semicolon -\def\math_punctuation_comma_next {\begingroup\Umathcode\c_math_comma \ifx\nexttoken\blankspace\mathordcode\else\mathordcode\fi\zerocount\c_math_comma ,\endgroup} -\def\math_punctuation_period_next{\begingroup\Umathcode\c_math_period\ifx\nexttoken\blankspace\mathordcode\else\mathordcode\fi\zerocount\c_math_period.\endgroup} - -\setnewconstant\c_math_comma "002C -\setnewconstant\c_math_period "002E -\setnewconstant\c_math_special"8000 +\def\math_punctuation_comma_next {\begingroup\Umathcode\c_math_comma \ifx\nexttoken\blankspace\mathordcode\else\mathordcode\fi\zerocount\c_math_comma ,\endgroup} +\def\math_punctuation_period_next {\begingroup\Umathcode\c_math_period \ifx\nexttoken\blankspace\mathordcode\else\mathordcode\fi\zerocount\c_math_period .\endgroup} +\def\math_punctuation_semicolon_next{\begingroup\Umathcode\c_math_semicolon\ifx\nexttoken\blankspace\mathordcode\else\mathordcode\fi\zerocount\c_math_semicolon;\endgroup} \installcorenamespace {mathautopunctuation} \bgroup - \catcode\c_math_comma \activecatcode - \catcode\c_math_period\activecatcode + \catcode\c_math_comma \activecatcode + \catcode\c_math_period \activecatcode + \catcode\c_math_semicolon\activecatcode \setgvalue{\??mathautopunctuation\v!no}% {\let,\math_punctuation_nop_comma - \let.\math_punctuation_nop_period} + \let.\math_punctuation_nop_period + \let;\math_punctuation_nop_semicolon} % more efficient list: % @@ -1513,26 +1659,51 @@ \setgvalue{\??mathautopunctuation\v!yes}% {\let,\math_punctuation_yes_comma - \let.\math_punctuation_yes_period} + \let.\math_punctuation_yes_period + \let;\math_punctuation_nop_semicolon} \setgvalue{\??mathautopunctuation\v!all}% {\let,\math_punctuation_all_comma - \let.\math_punctuation_all_period} + \let.\math_punctuation_all_period + \let;\math_punctuation_nop_semicolon} + + \setgvalue{\??mathautopunctuation comma}% + {\let,\math_punctuation_yes_comma + \let.\math_punctuation_yes_period + \let;\math_punctuation_nop_semicolon} + + \setgvalue{\??mathautopunctuation\v!yes\string,semicolon}% + {\let,\math_punctuation_yes_comma + \let.\math_punctuation_yes_period + \let;\math_punctuation_yes_semicolon} + + \setgvalue{\??mathautopunctuation comma\string,semicolon}% + {\let,\math_punctuation_yes_comma + \let.\math_punctuation_yes_period + \let;\math_punctuation_yes_semicolon} + + \setgvalue{\??mathautopunctuation\v!all\string,semicolon}% + {\let,\math_punctuation_all_comma + \let.\math_punctuation_all_period + \let;\math_punctuation_all_semicolon} \egroup % \appendtoks -% \global\mathcode\c_math_comma \c_math_special -% \global\mathcode\c_math_period\c_math_special +% \global\mathcode\c_math_comma \c_math_special +% \global\mathcode\c_math_period \c_math_special +% \global\mathcode\c_math_semicolon\c_math_special % \to \everyjob % \activatemathcharacter\c_math_comma % \activatemathcharacter\c_math_period +% \activatemathcharacter\c_math_semicolon \appendtoks - \mathcode\c_math_comma \c_math_special - \mathcode\c_math_period\c_math_special - \csname\??mathautopunctuation\mathematicsparameter\v!autopunctuation\endcsname + \mathcode\c_math_comma \c_math_special + \mathcode\c_math_period \c_math_special + \mathcode\c_math_semicolon\c_math_special + \begincsname\??mathautopunctuation\mathematicsparameter\v!autopunctuation\endcsname \to \everymathematics \appendtoks @@ -1545,7 +1716,25 @@ \def\disablemathpunctuation{\csname\??mathautopunctuation\v!yes\endcsname} \setupmathematics - [\v!autopunctuation=\v!no] % no | yes | all + [\v!autopunctuation=\v!no] % no | yes | all | comma | yes,semicolon | all,semicolon + +%D The consequences of settign this are as follows: +%D +%D \def\TestA#1#2#3% +%D {\ifnum#1=0 \type{#2}\else\setupmathematics[autopunctuation={#2}]$#3$\fi} +%D \def\TestB#1#2% +%D {\NC \TestA{#1}{no} {#2} +%D \NC \TestA{#1}{yes} {#2} +%D \NC \TestA{#1}{yes,semicolon}{#2} +%D \NC \TestA{#1}{all} {#2} +%D \NC \TestA{#1}{all,semicolon}{#2} +%D \NC \NR} +%D \starttabulate[|c|c|c|c|c|] +%D \TestB{0}{} +%D \TestB{1}{(1,2)=(1, 2)} +%D \TestB{1}{(1.2)=(1. 2)} +%D \TestB{1}{(1;2)=(1; 2)} +%D \stoptabulate %D \macros %D {mathstyle} @@ -1610,6 +1799,19 @@ % error \fi} +\def\triggeredmathstyleparameter#1% to bypass the relax + {\ifcase\numexpr\normalmathstyle\relax + #1\displaystyle \or % 0 + #1\crampeddisplaystyle \or % 1 + #1\textstyle \or % 2 + #1\crampedtextstyle \or % 3 + #1\scriptstyle \or % 4 + #1\crampedscriptstyle \or % 5 + #1\scriptscriptstyle \or % 6 + #1\crampedscriptscriptstyle \else + % error + \fi} + \def\mathstylefont#1% #1 is number (\normalmathstyle) {\ifcase\numexpr#1\relax \textfont \or @@ -1621,7 +1823,20 @@ \scriptscriptfont \or \scriptscriptfont \else \textfont - \fi\zerocount} % hm, can ie other value as well + \fi\fam} % was \zerocount + +\def\somemathstylefont#1% #1 is number (\normalmathstyle) + {\ifcase\numexpr#1\relax + \textfont \or + \textfont \or + \textfont \or + \textfont \or + \scriptfont \or + \scriptfont \or + \scriptscriptfont \or + \scriptscriptfont \else + \textfont + \fi} \def\mathsmallstylefont#1% #1 is number (\normalmathstyle) {\ifcase\numexpr#1\relax @@ -1634,7 +1849,7 @@ \scriptscriptfont \or \scriptscriptfont \else \scriptfont - \fi\zerocount} % hm, can ie other value as well + \fi\fam} % was \zerocount \def\mathstyleface#1% #1 is number (\normalmathstyle) {\ifcase\numexpr#1\relax @@ -1701,6 +1916,46 @@ \unexpanded\def\showmathstyle{\verbosemathstyle\normalmathstyle} +%D Handy too: + +\def\mathcharwd{\fontcharwd\mathstylefont\normalmathstyle} +\def\mathcharht{\fontcharht\mathstylefont\normalmathstyle} +\def\mathchardp{\fontchardp\mathstylefont\normalmathstyle} + +%D Some dimension fun: + +\def\mathexheight + {\fontdimen + \plusfive + \ifcase\numexpr\normalmathstyle\relax + \textfont \or % 0 + \textfont \or % 1 + \textfont \or % 2 + \textfont \or % 3 + \scriptfont \or % 4 + \scriptfont \or % 5 + \scriptscriptfont \or % 6 + \scriptscriptfont \else + \textfont + \fi + \zeropoint} + +\def\mathemwidth + {\fontdimen + \plussix + \ifcase\numexpr\normalmathstyle\relax + \textfont \or % 0 + \textfont \or % 1 + \textfont \or % 2 + \textfont \or % 3 + \scriptfont \or % 4 + \scriptfont \or % 5 + \scriptscriptfont \or % 6 + \scriptscriptfont \else + \textfont + \fi + \zeropoint} + %D A plain inheritance: \def\mathpalette#1#2% @@ -1720,9 +1975,16 @@ % to be tested: {#1} but it could have side effects -\unexpanded\def\mathstylehbox#1% sensitive for: a \over b => {a\over b} or \frac{a}{b} - {\normalexpanded{\hbox\bgroup - \startimath\triggermathstyle\normalmathstyle}\mathsurround\zeropoint#1\stopimath\egroup} +% \unexpanded\def\mathstylehbox#1% sensitive for: a \over b => {a\over b} or \frac{a}{b} +% {\normalexpanded{\hbox\bgroup +% \startimath\triggermathstyle\normalmathstyle}\mathsurround\zeropoint#1\stopimath\egroup} + +\unexpanded\def\mathstylehbox#1#% sensitive for: a \over b => {a\over b} or \frac{a}{b} + {\math_style_hbox{#1}} + +\unexpanded\def\math_style_hbox#1#2% sensitive for: a \over b => {a\over b} or \frac{a}{b} + {\normalexpanded{\hbox#1\bgroup + \startimath\triggermathstyle\normalmathstyle}\mathsurround\zeropoint#2\stopimath\egroup} \unexpanded\def\mathstylevbox#1% {\normalexpanded{\vbox\bgroup @@ -2204,6 +2466,13 @@ % \ruledhbox{$\mathtext{abc ffi}$} % \ruledhbox{$\mathword{abc ffi}$} +% I need to decide: +% +%mathscriptboxmode\zerocount % no kerning +%mathscriptboxmode\plusone % lists +\mathscriptboxmode\plustwo % lists and boxes +%mathscriptboxmode\plusthree % lists and boxes with \boundary=1 (also for testing and demo) + \unexpanded\def\mathtext {\mathortext{\math_text_choice_font\relax}\hbox} \unexpanded\def\mathword {\mathortext{\math_text_choice_word\relax}\hbox} diff --git a/tex/context/base/mkiv/math-map.lua b/tex/context/base/mkiv/math-map.lua index cf9353e95..47e5cda0b 100644 --- a/tex/context/base/mkiv/math-map.lua +++ b/tex/context/base/mkiv/math-map.lua @@ -33,7 +33,6 @@ if not modules then modules = { } end modules ['math-map'] = { -- plus add them to the regular vectors below so that they honor \it etc local type, next = type, next -local floor, div = math.floor, math.div local merged, sortedhash = table.merged, table.sortedhash local extract = bit32.extract @@ -118,6 +117,7 @@ mathematics.gaps = allocate { [0x1D4AD] = 0x0211B, -- ℛ script R [0x1D4BA] = 0x0212F, -- ℯ script e [0x1D4BC] = 0x0210A, -- ℊ script g + -- [0x1D4C1] = 0x02113, -- exception: liter [0x1D4C4] = 0x02134, -- ℴ script o [0x1D506] = 0x0212D, -- ℭ fraktur C [0x1D50B] = 0x0210C, -- ℌ fraktur H @@ -741,17 +741,17 @@ function mathematics.remapalphabets(char,mathalphabet,mathgreek) if not isgreek[char] then -- nothing needed elseif islcgreek[char] then - local lc = extract(mathgreek,4,4) + local lc = extract(mathgreek,4,4) -- (mathgreek >> 4) & ~(-1 << 4) if lc > 1 then mathalphabet = remapgreek(mathalphabet,lc,"lowercase",char) end elseif isucgreek[char] then - local uc = extract(mathgreek,0,4) + local uc = extract(mathgreek,0,4) -- (mathgreek >> 0) & ~(-1 << 4) if uc > 1 then mathalphabet = remapgreek(mathalphabet,uc,"uppercase",char) end elseif issygreek[char] then - local sy = extract(mathgreek,8,4) + local sy = extract(mathgreek,8,4) -- (mathgreek >> 8) & ~(-1 << 4) if sy > 1 then mathalphabet = remapgreek(mathalphabet,sy,"symbol",char) end diff --git a/tex/context/base/mkiv/math-noa.lua b/tex/context/base/mkiv/math-noa.lua index f9e8c9f70..4c1997a64 100644 --- a/tex/context/base/mkiv/math-noa.lua +++ b/tex/context/base/mkiv/math-noa.lua @@ -29,7 +29,7 @@ local formatters, gmatch = string.formatters, string.gmatch local sortedhash = table.sortedhash local insert, remove = table.insert, table.remove local div = math.div -local setbit, hasbit = number.setbit, number.hasbit +local bor, band = bit32.bor, bit32.band local fonts = fonts local nodes = nodes @@ -47,11 +47,14 @@ local registerdirective = directives.register local logreporter = logs.reporter local setmetatableindex = table.setmetatableindex +local colortracers = nodes.tracers.colors + local trace_remapping = false registertracker("math.remapping", function(v) trace_remapping = v end) local trace_processing = false registertracker("math.processing", function(v) trace_processing = v end) local trace_analyzing = false registertracker("math.analyzing", function(v) trace_analyzing = v end) local trace_normalizing = false registertracker("math.normalizing", function(v) trace_normalizing = v end) local trace_collapsing = false registertracker("math.collapsing", function(v) trace_collapsing = v end) +local trace_fixing = false registertracker("math.fixing", function(v) trace_foxing = v end) local trace_patching = false registertracker("math.patching", function(v) trace_patching = v end) local trace_goodies = false registertracker("math.goodies", function(v) trace_goodies = v end) local trace_variants = false registertracker("math.variants", function(v) trace_variants = v end) @@ -62,12 +65,13 @@ local trace_domains = false registertracker("math.domains", function local trace_families = false registertracker("math.families", function(v) trace_families = v end) local trace_fences = false registertracker("math.fences", function(v) trace_fences = v end) -local check_coverage = true registerdirective("math.checkcoverage", function(v) check_coverage = v end) +local check_coverage = true registerdirective("math.checkcoverage", function(v) check_coverage = v end) local report_processing = logreporter("mathematics","processing") local report_remapping = logreporter("mathematics","remapping") local report_normalizing = logreporter("mathematics","normalizing") local report_collapsing = logreporter("mathematics","collapsing") +local report_fixing = logreporter("mathematics","fixing") local report_patching = logreporter("mathematics","patching") local report_goodies = logreporter("mathematics","goodies") local report_variants = logreporter("mathematics","variants") @@ -93,6 +97,7 @@ local setlist = nuts.setlist local setnext = nuts.setnext local setprev = nuts.setprev local setchar = nuts.setchar +local setfam = nuts.setfam local setsubtype = nuts.setsubtype local setattr = nuts.setattr @@ -104,6 +109,7 @@ local getid = nuts.getid local getsubtype = nuts.getsubtype local getchar = nuts.getchar local getfont = nuts.getfont +local getfam = nuts.getfam local getattr = nuts.getattr local getlist = nuts.getlist @@ -116,7 +122,6 @@ local setsub = nuts.setsub local setsup = nuts.setsup local flush_node = nuts.flush -local new_node = nuts.new -- todo: pool: math_noad math_sub local copy_node = nuts.copy local slide_nodes = nuts.slide local set_visual = nuts.setvisual @@ -126,6 +131,10 @@ local mlist_to_hlist = nodes.mlist_to_hlist local font_of_family = node.family_font local new_kern = nodepool.kern +local new_submlist = nodepool.submlist +local new_noad = nodepool.noad +local new_delimiter = nodepool.delimiter +local new_fence = nodepool.fence local fonthashes = fonts.hashes local fontdata = fonthashes.identifiers @@ -174,8 +183,8 @@ local math_noad = nodecodes.noad -- attr nucleus sub sup local math_accent = nodecodes.accent -- attr nucleus sub sup accent local math_radical = nodecodes.radical -- attr nucleus sub sup left degree local math_fraction = nodecodes.fraction -- attr nucleus sub sup left right -local math_box = nodecodes.subbox -- attr list -local math_sub = nodecodes.submlist -- attr list +local math_subbox = nodecodes.subbox -- attr list +local math_submlist = nodecodes.submlist -- attr list local math_char = nodecodes.mathchar -- attr fam char local math_textchar = nodecodes.mathtextchar -- attr fam char local math_delim = nodecodes.delim -- attr small_fam small_char large_fam large_char @@ -219,7 +228,7 @@ local function process(start,what,n,parent) elseif id == math_char then local char = getchar(start) local font = getfont(start) - local fam = getfield(start,"fam") + local fam = getfam(start) report_processing("%w%S, family %a, font %a, char %a, shape %c",n*2,nutstring(start),fam,font,char,char) else report_processing("%w%S",n*2,nutstring(start)) @@ -253,7 +262,7 @@ local function process(start,what,n,parent) noad = getsub (start) if noad then process(noad,what,n,start) end -- list elseif id == math_char or id == math_textchar or id == math_delim then break - elseif id == math_box or id == math_sub then + elseif id == math_subbox or id == math_submlist then local noad = getlist(start) if noad then process(noad,what,n,start) end -- list (not getlist !) elseif id == math_fraction then local noad = getfield(start,"num") if noad then process(noad,what,n,start) end -- list @@ -298,7 +307,7 @@ local function processnested(current,what,n) noad = getnucleus(current) if noad then process(noad,what,n,current) end -- list noad = getsup (current) if noad then process(noad,what,n,current) end -- list noad = getsub (current) if noad then process(noad,what,n,current) end -- list - elseif id == math_box or id == math_sub then + elseif id == math_subbox or id == math_submlist then noad = getlist(current) if noad then process(noad,what,n,current) end -- list (not getlist !) elseif id == math_fraction then noad = getfield(current,"num") if noad then process(noad,what,n,current) end -- list @@ -334,7 +343,7 @@ local function processstep(current,process,n,id) noad = getnucleus(current) if noad then process(noad,n,current) end -- list noad = getsup (current) if noad then process(noad,n,current) end -- list noad = getsub (current) if noad then process(noad,n,current) end -- list - elseif id == math_box or id == math_sub then + elseif id == math_subbox or id == math_submlist then noad = getlist(current) if noad then process(noad,n,current) end -- list (not getlist !) elseif id == math_fraction then noad = getfield(current,"num") if noad then process(noad,n,current) end -- list @@ -447,7 +456,7 @@ do } families[math_char] = function(pointer) - if getfield(pointer,"fam") == 0 then + if getfam(pointer) == 0 then local a = getattr(pointer,a_mathfamily) if a and a > 0 then setattr(pointer,a_mathfamily,0) @@ -459,13 +468,13 @@ do if trace_families then report_families("no bold replacement for %C, family %s with remap %s becomes %s with remap %s",char,a,familymap[a],newa,familymap[newa]) end - setfield(pointer,"fam",newa) + setfam(pointer,newa) elseif not fontcharacters[font_of_family(newa)][bold] then if trace_families then report_families("no bold character for %C, family %s with remap %s becomes %s with remap %s",char,a,familymap[a],newa,familymap[newa]) end if newa > 3 then - setfield(pointer,"fam",newa-3) + setfam(pointer,newa-3) end else setattr(pointer,a_exportstatus,char) @@ -473,7 +482,7 @@ do if trace_families then report_families("replacing %C by bold %C, family %s with remap %s becomes %s with remap %s",char,bold,a,familymap[a],newa,familymap[newa]) end - setfield(pointer,"fam",newa) + setfam(pointer,newa) end else local char = getchar(pointer) @@ -485,7 +494,7 @@ do if trace_families then report_families("family of %C becomes %s with remap %s",char,a,familymap[a]) end - setfield(pointer,"fam",a) + setfam(pointer,a) end end end @@ -522,6 +531,30 @@ do end end + -- will become: + + -- families[math_delim] = function(pointer) + -- if getfam(pointer) == 0 then + -- local a = getattr(pointer,a_mathfamily) + -- if a and a > 0 then + -- setattr(pointer,a_mathfamily,0) + -- if a > 5 then + -- -- no bold delimiters in unicode + -- a = a - 3 + -- end + -- local char = getchar(pointer) + -- local okay = fontcharacters[font_of_family(a)][char] + -- if okay then + -- setfam(pointer,a) + -- elseif a > 2 then + -- setfam(pointer,a-3) + -- end + -- else + -- setfam(pointer,0) + -- end + -- end + -- end + families[math_textchar] = families[math_char] function handlers.families(head,style,penalties) @@ -535,20 +568,20 @@ end do - local a_mathalphabet = privateattribute("mathalphabet") - local a_mathgreek = privateattribute("mathgreek") + local a_mathalphabet = privateattribute("mathalphabet") + local a_mathgreek = privateattribute("mathgreek") + + local relocate = { } - processors.relocate = { } + local remapalphabets = mathematics.remapalphabets + local fallbackstyleattr = mathematics.fallbackstyleattr + local setnodecolor = colortracers.set local function report_remap(tag,id,old,new,extra) report_remapping("remapping %s in font (%s,%s) from %C to %C%s", tag,id,fontdata[id].properties.fontname or "",old,new,extra) end - local remapalphabets = mathematics.remapalphabets - local fallbackstyleattr = mathematics.fallbackstyleattr - local setnodecolor = nodes.tracers.colors.set - local function checked(pointer) local char = getchar(pointer) local font = getfont(pointer) @@ -570,7 +603,7 @@ do end end - processors.relocate[math_char] = function(pointer) + relocate[math_char] = function(pointer) local g = getattr(pointer,a_mathgreek) or 0 local a = getattr(pointer,a_mathalphabet) or 0 local char = getchar(pointer) @@ -637,20 +670,20 @@ do end end - processors.relocate[math_textchar] = function(pointer) + relocate[math_textchar] = function(pointer) if trace_analyzing then setnodecolor(pointer,"font:init") end end - processors.relocate[math_delim] = function(pointer) + relocate[math_delim] = function(pointer) if trace_analyzing then setnodecolor(pointer,"font:fina") end end function handlers.relocate(head,style,penalties) - processnoads(head,processors.relocate,"relocate") + processnoads(head,relocate,"relocate") return true end @@ -658,32 +691,36 @@ end -- rendering (beware, not exported) -processors.render = { } - -local rendersets = mathematics.renderings.numbers or { } -- store +do -processors.render[math_char] = function(pointer) - local attr = getattr(pointer,a_mathrendering) - if attr and attr > 0 then - local char = getchar(pointer) - local renderset = rendersets[attr] - if renderset then - local newchar = renderset[char] - if newchar then - local font = getfont(pointer) - local characters = fontcharacters[font] - if characters and characters[newchar] then - setchar(pointer,newchar) - setattr(pointer,a_exportstatus,char) + local render = { } + + local rendersets = mathematics.renderings.numbers or { } -- store + + render[math_char] = function(pointer) + local attr = getattr(pointer,a_mathrendering) + if attr and attr > 0 then + local char = getchar(pointer) + local renderset = rendersets[attr] + if renderset then + local newchar = renderset[char] + if newchar then + local font = getfont(pointer) + local characters = fontcharacters[font] + if characters and characters[newchar] then + setchar(pointer,newchar) + setattr(pointer,a_exportstatus,char) + end end end end end -end -function handlers.render(head,style,penalties) - processnoads(head,processors.render,"render") - return true + function handlers.render(head,style,penalties) + processnoads(head,render,"render") + return true + end + end -- some resize options (this works ok because the content is @@ -696,347 +733,405 @@ end -- todo: just replace the character by an ord noad -- and remove the right delimiter as well -local a_mathsize = privateattribute("mathsize") -- this might move into other fence code -local resize = { } -processors.resize = resize +do + + local a_mathsize = privateattribute("mathsize") -- this might move into other fence code + local resize = { } -resize[math_fence] = function(pointer) - local subtype = getsubtype(pointer) - if subtype == left_fence_code or subtype == right_fence_code then - local a = getattr(pointer,a_mathsize) - if a and a > 0 then - local method, size = div(a,100), a % 100 - setattr(pointer,a_mathsize,0) - local delimiter = getfield(pointer,"delim") - local chr = getfield(delimiter,"small_char") - if chr > 0 then - local fam = getfield(delimiter,"small_fam") - local id = font_of_family(fam) - if id > 0 then - setfield(delimiter,"small_char",mathematics.big(fontdata[id],chr,size,method)) + resize[math_fence] = function(pointer) + local subtype = getsubtype(pointer) + if subtype == left_fence_code or subtype == right_fence_code then + local a = getattr(pointer,a_mathsize) + if a and a > 0 then + local method, size = div(a,100), a % 100 + setattr(pointer,a_mathsize,0) + local delimiter = getfield(pointer,"delim") + local chr = getfield(delimiter,"small_char") + if chr > 0 then + local fam = getfield(delimiter,"small_fam") + local id = font_of_family(fam) + if id > 0 then + setfield(delimiter,"small_char",mathematics.big(fontdata[id],chr,size,method)) + end end end end end -end -function handlers.resize(head,style,penalties) - processnoads(head,resize,"resize") - return true + -- will become: + + -- resize[math_fence] = function(pointer) + -- local subtype = getsubtype(pointer) + -- if subtype == left_fence_code or subtype == right_fence_code then + -- local a = getattr(pointer,a_mathsize) + -- if a and a > 0 then + -- local method, size = div(a,100), a % 100 + -- setattr(pointer,a_mathsize,0) + -- local delimiter = getfield(pointer,"delim") + -- local chr = getchar(delimiter) + -- if chr > 0 then + -- local fam = getfam(delimiter) + -- local id = font_of_family(fam) + -- if id > 0 then + -- setchar(delimiter,mathematics.big(fontdata[id],chr,size,method)) + -- end + -- end + -- end + -- end + -- end + + function handlers.resize(head,style,penalties) + processnoads(head,resize,"resize") + return true + end + end -- still not perfect: -local a_autofence = privateattribute("mathautofence") -local autofences = { } -processors.autofences = autofences -local dummyfencechar = 0x2E - -local function makefence(what,char) - local d = new_node(math_delim) - local f = new_node(math_fence) - if char then - local sym = getnucleus(char) - local chr = getchar(sym) - local fam = getfield(sym,"fam") - if chr == dummyfencechar then - chr = 0 +do + + local a_autofence = privateattribute("mathautofence") + local autofences = { } + local dummyfencechar = 0x2E + + local function makefence(what,char) + local d = new_delimiter() + local f = new_fence() + if char then + local sym = getnucleus(char) + local chr = getchar(sym) + local fam = getfam(sym) + if chr == dummyfencechar then + chr = 0 + end + setfield(d,"small_char",chr) + setfield(d,"small_fam",fam) + flush_node(sym) end - setfield(d,"small_char",chr) - setfield(d,"small_fam", fam) - flush_node(sym) - end - setsubtype(f,what) - setfield(f,"delim",d) - setfield(f,"class",-1) -- tex itself does this, so not fenceclasses[what] - return f -end + setsubtype(f,what) + setfield(f,"delim",d) + setfield(f,"class",-1) -- tex itself does this, so not fenceclasses[what] + return f + end -local function makelist(noad,f_o,o_next,c_prev,f_c,middle) - local list = new_node(math_sub) - setlist(list,f_o) - setsubtype(noad,noad_inner) - setnucleus(noad,list) - setlink(f_o,o_next) - setlink(c_prev,f_c) - if middle and next(middle) then - local prev = f_o - local current = o_next - while current ~= f_c do - local m = middle[current] - if m then - local next = getnext(current) - local fence = makefence(middle_fence_code,current) - setnucleus(current) - flush_node(current) - middle[current] = nil - -- replace_node - setlink(prev,fence,next) - prev = fence - current = next - else - prev = current - current = getnext(current) + -- will become + + -- local function makefence(what,char) + -- local d = new_delimiter() + -- local f = new_fence() + -- if char then + -- local sym = getnucleus(char) + -- local chr = getchar(sym) + -- local fam = getfam(sym) + -- if chr == dummyfencechar then + -- chr = 0 + -- end + -- setchar(d,chr) + -- setfam(d,fam) + -- flush_node(sym) + -- end + -- setsubtype(f,what) + -- setfield(f,"delim",d) + -- setfield(f,"class",-1) -- tex itself does this, so not fenceclasses[what] + -- return f + -- end + + local function makelist(noad,f_o,o_next,c_prev,f_c,middle) + local list = new_submlist() + setlist(list,f_o) + setsubtype(noad,noad_inner) + setnucleus(noad,list) + setlink(f_o,o_next) + setlink(c_prev,f_c) + if middle and next(middle) then + local prev = f_o + local current = o_next + while current ~= f_c do + local m = middle[current] + if m then + local next = getnext(current) + local fence = makefence(middle_fence_code,current) + setnucleus(current) + flush_node(current) + middle[current] = nil + -- replace_node + setlink(prev,fence,next) + prev = fence + current = next + else + prev = current + current = getnext(current) + end end end end -end -local function convert_both(open,close,middle) - local o_prev, o_next = getboth(open) - local c_prev, c_next = getboth(close) - if o_next == close then - return close - else + local function convert_both(open,close,middle) + local o_prev, o_next = getboth(open) + local c_prev, c_next = getboth(close) + if o_next == close then + return close + else + local f_o = makefence(left_fence_code,open) + local f_c = makefence(right_fence_code,close) + makelist(open,f_o,o_next,c_prev,f_c,middle) + setnucleus(close) + flush_node(close) + if c_next then + setprev(c_next,open) + end + setnext(open,c_next) + return open + end + end + + local function convert_open(open,last,middle) local f_o = makefence(left_fence_code,open) - local f_c = makefence(right_fence_code,close) - makelist(open,f_o,o_next,c_prev,f_c,middle) - setnucleus(close) - flush_node(close) - if c_next then - setprev(c_next,open) + local f_c = makefence(right_fence_code) + local o_prev, o_next = getboth(open) + local l_prev, l_next = getboth(last) + makelist(open,f_o,o_next,last,f_c,middle) + if l_next then + setprev(l_next,open) end - setnext(open,c_next) + setnext(open,l_next) return open end -end - -local function convert_open(open,last,middle) - local f_o = makefence(left_fence_code,open) - local f_c = makefence(right_fence_code) - local o_prev, o_next = getboth(open) - local l_prev, l_next = getboth(last) - makelist(open,f_o,o_next,last,f_c,middle) - if l_next then - setprev(l_next,open) - end - setnext(open,l_next) - return open -end -local function convert_close(close,first,middle) - local f_o = makefence(left_fence_code) - local f_c = makefence(right_fence_code,close) - local c_prev = getprev(close) - makelist(close,f_o,first,c_prev,f_c,middle) - return close -end + local function convert_close(close,first,middle) + local f_o = makefence(left_fence_code) + local f_c = makefence(right_fence_code,close) + local c_prev = getprev(close) + makelist(close,f_o,first,c_prev,f_c,middle) + return close + end -local stacks = setmetatableindex("table") - -local function processfences(pointer,n,parent) - local current = pointer - local last = pointer - local start = pointer - local done = false - local initial = pointer - local stack = nil - local middle = nil -- todo: use properties - while current do - local id = getid(current) - if id == math_noad then - local a = getattr(current,a_autofence) - if a and a > 0 then - local stack = stacks[n] - setattr(current,a_autofence,0) - if a == 1 or (a == 4 and (not stack or #stack == 0)) then - if trace_fences then - report_fences("%2i: pushing open on stack",n) - end - insert(stack,current) - elseif a == 2 or a == 4 then - local open = remove(stack) - if open then + local stacks = setmetatableindex("table") + + local function processfences(pointer,n,parent) + local current = pointer + local last = pointer + local start = pointer + local done = false + local initial = pointer + local stack = nil + local middle = nil -- todo: use properties + while current do + local id = getid(current) + if id == math_noad then + local a = getattr(current,a_autofence) + if a and a > 0 then + local stack = stacks[n] + setattr(current,a_autofence,0) + if a == 1 or (a == 4 and (not stack or #stack == 0)) then if trace_fences then - report_fences("%2i: handling %s, stack depth %i",n,"both",#stack+1) + report_fences("%2i: pushing open on stack",n) + end + insert(stack,current) + elseif a == 2 or a == 4 then + local open = remove(stack) + if open then + if trace_fences then + report_fences("%2i: handling %s, stack depth %i",n,"both",#stack+1) + end + current = convert_both(open,current,middle) + elseif current == start then + -- skip + else + if trace_fences then + report_fences("%2i: handling %s, stack depth %i",n,"close",#stack+1) + end + current = convert_close(current,initial,middle) + if not parent then + initial = current + end end - current = convert_both(open,current,middle) - elseif current == start then - -- skip - else if trace_fences then - report_fences("%2i: handling %s, stack depth %i",n,"close",#stack+1) + report_fences("%2i: popping close from stack",n) end - current = convert_close(current,initial,middle) - if not parent then - initial = current + elseif a == 3 then + if trace_fences then + report_fences("%2i: registering middle",n) + end + if middle then + middle[current] = last + else + middle = { [current] = last } end end - if trace_fences then - report_fences("%2i: popping close from stack",n) - end - elseif a == 3 then - if trace_fences then - report_fences("%2i: registering middle",n) - end - if middle then - middle[current] = last - else - middle = { [current] = last } - end + done = true + else + processstep(current,processfences,n+1,id) end - done = true else - processstep(current,processfences,n+1,id) + -- next at current level + processstep(current,processfences,n,id) end - else - -- next at current level - processstep(current,processfences,n,id) + last = current + current = getnext(current) end - last = current - current = getnext(current) - end - if done then - local stack = stacks[n] - local s = #stack - if s > 0 then - if trace_fences then - report_fences("%2i: handling %s stack levels",n,s) - end - for i=1,s do - local open = remove(stack) + if done then + local stack = stacks[n] + local s = #stack + if s > 0 then if trace_fences then - report_fences("%2i: handling %s, stack depth %i",n,"open",#stack) + report_fences("%2i: handling %s stack levels",n,s) + end + for i=1,s do + local open = remove(stack) + if trace_fences then + report_fences("%2i: handling %s, stack depth %i",n,"open",#stack) + end + last = convert_open(open,last,middle) end - last = convert_open(open,last,middle) end end end -end --- we can have a first changed node .. an option is to have a leading dummy node in math --- lists like the par node as it can save a lot of mess + -- we can have a first changed node .. an option is to have a leading dummy node in math + -- lists like the par node as it can save a lot of mess -local enabled = false + local enabled = false -implement { - name = "enableautofences", - onlyonce = true, - actions = function() - enableaction("math","noads.handlers.autofences") - enabled = true - end -} + implement { + name = "enableautofences", + onlyonce = true, + actions = function() + enableaction("math","noads.handlers.autofences") + enabled = true + end + } -function handlers.autofences(head,style,penalties) - if enabled then -- tex.modes.c_math_fences_auto - -- inspect(nodes.totree(head)) - processfences(tonut(head),1) - -- inspect(nodes.totree(head)) + function handlers.autofences(head,style,penalties) + if enabled then -- tex.modes.c_math_fences_auto + -- inspect(nodes.totree(head)) + processfences(tonut(head),1) + -- inspect(nodes.totree(head)) + end end + end -- normalize scripts -local unscript = { } noads.processors.unscript = unscript -local superscripts = characters.superscripts -local subscripts = characters.subscripts -local fractions = characters.fractions -local replaced = { } - -local function replace(pointer,what,n,parent) - pointer = parent -- we're following the parent list (chars trigger this) - local next = getnext(pointer) - local start_super, stop_super, start_sub, stop_sub - local mode = "unset" - while next and getid(next) == math_noad do - local nextnucleus = getnucleus(next) - if nextnucleus and getid(nextnucleus) == math_char and not getsub(next) and not getsup(next) then - local char = getchar(nextnucleus) - local s = superscripts[char] - if s then - if not start_super then - start_super = next - mode = "super" - elseif mode == "sub" then - break - end - stop_super = next - next = getnext(next) - setchar(nextnucleus,s) - replaced[char] = (replaced[char] or 0) + 1 - if trace_normalizing then - report_normalizing("superscript %C becomes %C",char,s) - end - else - local s = subscripts[char] +do + + local unscript = { } noads.processors.unscript = unscript + local superscripts = characters.superscripts + local subscripts = characters.subscripts + local fractions = characters.fractions + local replaced = { } + + local function replace(pointer,what,n,parent) + pointer = parent -- we're following the parent list (chars trigger this) + local next = getnext(pointer) + local start_super, stop_super, start_sub, stop_sub + local mode = "unset" + while next and getid(next) == math_noad do + local nextnucleus = getnucleus(next) + if nextnucleus and getid(nextnucleus) == math_char and not getsub(next) and not getsup(next) then + local char = getchar(nextnucleus) + local s = superscripts[char] if s then - if not start_sub then - start_sub = next - mode = "sub" - elseif mode == "super" then + if not start_super then + start_super = next + mode = "super" + elseif mode == "sub" then break end - stop_sub = next + stop_super = next next = getnext(next) setchar(nextnucleus,s) replaced[char] = (replaced[char] or 0) + 1 if trace_normalizing then - report_normalizing("subscript %C becomes %C",char,s) + report_normalizing("superscript %C becomes %C",char,s) end else - break + local s = subscripts[char] + if s then + if not start_sub then + start_sub = next + mode = "sub" + elseif mode == "super" then + break + end + stop_sub = next + next = getnext(next) + setchar(nextnucleus,s) + replaced[char] = (replaced[char] or 0) + 1 + if trace_normalizing then + report_normalizing("subscript %C becomes %C",char,s) + end + else + break + end end + else + break end - else - break - end - end - if start_super then - if start_super == stop_super then - setsup(pointer,getnucleus(start_super)) - else - local list = new_node(math_sub) -- todo attr - setlist(list,start_super) - setsup(pointer,list) - end - if mode == "super" then - setnext(pointer,getnext(stop_super)) end - setnext(stop_super) - end - if start_sub then - if start_sub == stop_sub then - setsub(pointer,getnucleus(start_sub)) - else - local list = new_node(math_sub) -- todo attr - setlist(list,start_sub) - setsub(pointer,list) + if start_super then + if start_super == stop_super then + setsup(pointer,getnucleus(start_super)) + else + local list = new_submlist() -- todo attr + setlist(list,start_super) + setsup(pointer,list) + end + if mode == "super" then + setnext(pointer,getnext(stop_super)) + end + setnext(stop_super) end - if mode == "sub" then - setnext(pointer,getnext(stop_sub)) + if start_sub then + if start_sub == stop_sub then + setsub(pointer,getnucleus(start_sub)) + else + local list = new_submlist() -- todo attr + setlist(list,start_sub) + setsub(pointer,list) + end + if mode == "sub" then + setnext(pointer,getnext(stop_sub)) + end + setnext(stop_sub) end - setnext(stop_sub) + -- we could return stop end - -- we could return stop -end -unscript[math_char] = replace -- not noads as we need to recurse + unscript[math_char] = replace -- not noads as we need to recurse + + function handlers.unscript(head,style,penalties) + processnoads(head,unscript,"unscript") + -- processnoads(head,checkers,"checkers") + return true + end -function handlers.unscript(head,style,penalties) - processnoads(head,unscript,"unscript") --- processnoads(head,checkers,"checkers") - return true end -local function collected(list) - if list and next(list) then - local n, t = 0, { } - for k, v in sortedhash(list) do - n = n + v - t[#t+1] = formatters["%C"](k) +do + + local function collected(list) + if list and next(list) then + local n, t = 0, { } + for k, v in sortedhash(list) do + n = n + 1 + t[n] = formatters["%C"](k) + end + return formatters["% t (n=%s)"](t,n) end - return formatters["% t (n=%s)"](t,n) end -end -statistics.register("math script replacements", function() - return collected(replaced) -end) + statistics.register("math script replacements", function() + return collected(replaced) + end) -statistics.register("unknown math characters", function() - return collected(unknowns) -end) + statistics.register("unknown math characters", function() + return collected(unknowns) + end) + +end -- math alternates: (in xits lgf: $ABC$ $\cal ABC$ $\mathalternate{cal}\cal ABC$) -- math alternates: (in lucidaot lgf: $ABC \mathalternate{italic} ABC$) @@ -1050,7 +1145,7 @@ do local last = 0 local known = setmetatableindex(function(t,k) - local v = setbit(0,2^last) + local v = bor(0,2^last) t[k] = v last = last + 1 return v @@ -1080,7 +1175,8 @@ do alternates = alternates, registered = registered, presets = { }, -hashes = setmetatableindex("table") + resets = { }, + hashes = setmetatableindex("table") } resources.mathalternates = mathalternates end @@ -1144,7 +1240,7 @@ hashes = setmetatableindex("table") local fontdata = fonts.hashes.identifiers local fontresources = fonts.hashes.resources - local function getalternate(fam,tag) + local function getalternate(fam,tag,current) local resources = fontresources[font_of_family(fam)] local attribute = unsetvalue if resources then @@ -1152,25 +1248,37 @@ hashes = setmetatableindex("table") if mathalternates then local presets = mathalternates.presets if presets then + local resets = mathalternates.resets attribute = presets[tag] if not attribute then attribute = 0 local alternates = mathalternates.alternates for s in gmatch(tag,"[^, ]+") do - local a = alternates[s] -- or known[s] - if a then - attribute = attribute + a + if s == v_reset then + resets[tag] = true + current = unsetvalue + else + local a = alternates[s] -- or known[s] + if a then + attribute = bor(attribute,a) + end end end if attribute == 0 then attribute = unsetvalue end presets[tag] = attribute + elseif resets[tag] then + current = unsetvalue end end end end - return attribute + if attribute > 0 and current and current > 0 then + return bor(current,attribute) + else + return attribute + end end local function presetalternate(fam,tag) @@ -1185,10 +1293,7 @@ hashes = setmetatableindex("table") local function setalternate(fam,tag) local a = texgetattribute(a_mathalternate) - local v = getalternate(fam,tag) - if a and a > 0 then - v = a + v - end + local v = getalternate(fam,tag,a) texsetattribute(a_mathalternate,v) end @@ -1212,7 +1317,7 @@ hashes = setmetatableindex("table") local hashes = mathalternates.hashes for i=1,#registered do local r = registered[i] - if hasbit(a,r) then + if band(a,r) ~= 0 then local char = getchar(pointer) local alt = hashes[i][char] if alt == nil then @@ -1259,66 +1364,59 @@ end -- some juggling that we want to avoid but we need to do something here (in fact, we could -- better fix the width of the character -local a_mathitalics = privateattribute("mathitalics") +do + + local a_mathitalics = privateattribute("mathitalics") -local italics = { } -local default_factor = 1/20 + local italics = { } + local default_factor = 1/20 -local setcolor = nodes.tracers.colors.set -local resetcolor = nodes.tracers.colors.reset -local italic_kern = new_kern -local c_positive_d = "trace:dg" -local c_negative_d = "trace:dr" + local setcolor = colortracers.set + local resetcolor = colortracers.reset + local italic_kern = new_kern -local function insert_kern(current,kern) - local sub = new_node(math_sub) -- todo: pool - local noad = new_node(math_noad) -- todo: pool - setlist(sub,kern) - setnext(kern,noad) - setnucleus(noad,current) - return sub -end + local c_positive_d = "trace:dg" + local c_negative_d = "trace:dr" -registertracker("math.italics.visualize", function(v) - if v then - italic_kern = function(k) - local n = new_kern(k) - set_visual(n,"italic") - return n - end - else - italic_kern = new_kern + local function insert_kern(current,kern) + local sub = new_submlist() + local noad = new_noad() + setlist(sub,kern) + setnext(kern,noad) + setnucleus(noad,current) + return sub end -end) -local function getcorrection(method,font,char) -- -- or character.italic -- (this one is for tex) + registertracker("math.italics.visualize", function(v) + if v then + italic_kern = function(k) + local n = new_kern(k) + set_visual(n,"italic") + return n + end + else + italic_kern = new_kern + end + end) - local visual = chardata[char].visual + local function getcorrection(method,font,char) -- -- or character.italic -- (this one is for tex) - if method == 1 then - -- check on state - local italics = fontitalics[font] - if italics then - local character = fontcharacters[font][char] - if character then - local correction = character.italic - if correction and correction ~= 0 then - return correction, visual + local visual = chardata[char].visual + + if method == 1 then + -- check on state + local italics = fontitalics[font] + if italics then + local character = fontcharacters[font][char] + if character then + local correction = character.italic + if correction and correction ~= 0 then + return correction, visual + end end end - end - elseif method == 2 then - -- no check - local character = fontcharacters[font][char] - if character then - local correction = character.italic - if correction and correction ~= 0 then - return correction, visual - end - end - elseif method == 3 then - -- check on visual - if visual == "it" or visual == "bi" then + elseif method == 2 then + -- no check local character = fontcharacters[font][char] if character then local correction = character.italic @@ -1326,109 +1424,121 @@ local function getcorrection(method,font,char) -- -- or character.italic -- (thi return correction, visual end end - end - elseif method == 4 then - -- combination of 1 and 3 - local italics = fontitalics[font] - if italics and (visual == "it" or visual == "bi") then - local character = fontcharacters[font][char] - if character then - local correction = character.italic - if correction and correction ~= 0 then - return correction, visual + elseif method == 3 then + -- check on visual + if visual == "it" or visual == "bi" then + local character = fontcharacters[font][char] + if character then + local correction = character.italic + if correction and correction ~= 0 then + return correction, visual + end + end + end + elseif method == 4 then + -- combination of 1 and 3 + local italics = fontitalics[font] + if italics and (visual == "it" or visual == "bi") then + local character = fontcharacters[font][char] + if character then + local correction = character.italic + if correction and correction ~= 0 then + return correction, visual + end end end end - end -end + end -italics[math_char] = function(pointer,what,n,parent) - local method = getattr(pointer,a_mathitalics) - if method and method > 0 and method < 100 then - local char = getchar(pointer) - local font = getfont(pointer) - local correction, visual = getcorrection(method,font,char) - if correction and correction ~= 0 then - local next_noad = getnext(parent) - if not next_noad then - if n == 1 then - -- only at the outer level .. will become an option (always,endonly,none) - if trace_italics then - report_italics("method %a, flagging italic correction %p between %C and end math",method,correction,char) - end - if correction > 0 then - correction = correction + 100 - else - correction = correction - 100 + italics[math_char] = function(pointer,what,n,parent) + local method = getattr(pointer,a_mathitalics) + if method and method > 0 and method < 100 then + local char = getchar(pointer) + local font = getfont(pointer) + local correction, visual = getcorrection(method,font,char) + if correction and correction ~= 0 then + local next_noad = getnext(parent) + if not next_noad then + if n == 1 then + -- only at the outer level .. will become an option (always,endonly,none) + if trace_italics then + report_italics("method %a, flagging italic correction %p between %C and end math",method,correction,char) + end + if correction > 0 then + correction = correction + 100 + else + correction = correction - 100 + end + setattr(pointer,a_mathitalics,correction) + setattr(parent,a_mathitalics,correction) + return -- so no reset later on end - setattr(pointer,a_mathitalics,correction) - setattr(parent,a_mathitalics,correction) end end end + setattr(pointer,a_mathitalics,unsetvalue) end -end - -function handlers.italics(head,style,penalties) - processnoads(head,italics,"italics") - return true -end -local enable + function handlers.italics(head,style,penalties) + processnoads(head,italics,"italics") + return true + end -enable = function() - enableaction("math", "noads.handlers.italics") - if trace_italics then - report_italics("enabling math italics") + local enable = function() + enableaction("math", "noads.handlers.italics") + if trace_italics then + report_italics("enabling math italics") + end + -- we enable math (unless already enabled elsewhere) + typesetters.italics.enablemath() + enable = false end - -- we enable math (unless already enabled elsewhere) - typesetters.italics.enablemath() - enable = false -end --- best do this only on math mode (less overhead) + -- best do this only on math mode (less overhead) -function mathematics.setitalics(name) - if enable then - enable() + function mathematics.setitalics(name) + if enable then + enable() + end + texsetattribute(a_mathitalics,name and name ~= v_reset and tonumber(name) or unsetvalue) -- maybe also v_none end - texsetattribute(a_mathitalics,name and name ~= v_reset and tonumber(name) or unsetvalue) -- maybe also v_none -end -function mathematics.getitalics(name) - if enable then - enable() + function mathematics.getitalics(name) + if enable then + enable() + end + context(name and name ~= v_reset and tonumber(name) or unsetvalue) end - context(name and name ~= v_reset and tonumber(name) or unsetvalue) -end -function mathematics.resetitalics() - texsetattribute(a_mathitalics,unsetvalue) -end + function mathematics.resetitalics() + texsetattribute(a_mathitalics,unsetvalue) + end -implement { - name = "initializemathitalics", - actions = enable, - onlyonce = true, -} + implement { + name = "initializemathitalics", + actions = enable, + onlyonce = true, + } -implement { - name = "setmathitalics", - actions = mathematics.setitalics, - arguments = "string", -} + implement { + name = "setmathitalics", + actions = mathematics.setitalics, + arguments = "string", + } -implement { - name = "getmathitalics", - actions = mathematics.getitalics, - arguments = "string", -} + implement { + name = "getmathitalics", + actions = mathematics.getitalics, + arguments = "string", + } -implement { - name = "resetmathitalics", - actions = mathematics.resetitalics -} + implement { + name = "resetmathitalics", + actions = mathematics.resetitalics + } + +end do @@ -1461,12 +1571,14 @@ do local hash = setmetatableindex(function(t,font) local g = fontdata[font].goodies - local m = g and g[1].mathematics + local m = g and g[1] and g[1].mathematics local k = m and m.kernpairs t[font] = k return k end) + -- no correction after prime because that moved to a superscript + kernpairs[math_char] = function(pointer,what,n,parent) if getattr(pointer,a_kernpairs) == 1 then local font = getfont(pointer) @@ -1506,243 +1618,372 @@ end -- primes and such -local collapse = { } processors.collapse = collapse +do + + -- is validpair stil needed? + + local a_mathcollapsing = privateattribute("mathcollapsing") + local collapse = { } + local mathlists = characters.mathlists + local validpair = { + [noad_ord] = true, + [noad_rel] = true, + [noad_bin] = true, -- new + [noad_open] = true, -- new + [noad_close] = true, -- new + [noad_punct] = true, -- new + [noad_opdisplaylimits] = true, + [noad_oplimits] = true, + [noad_opnolimits] = true, + } -local mathpairs = characters.mathpairs -- next will move to char-def + local reported = setmetatableindex("table") + + collapse[math_char] = function(pointer,what,n,parent) + + if parent and mathlists[getchar(pointer)] then + local found, last, lucleus, lsup, lsub, category + local tree = mathlists + local current = parent + while current and validpair[getsubtype(current)] do + local nucleus = getnucleus(current) -- == pointer + local sub = getsub(current) + local sup = getsup(current) + local char = getchar(nucleus) + if char then + local match = tree[char] + if match then + local method = getattr(current,a_mathcollapsing) + if method and method > 0 and method <= 3 then + local specials = match.specials + local mathlist = match.mathlist + local ligature + if method == 1 then + ligature = specials + elseif method == 2 then + ligature = specials or mathlist + else -- 3 + ligature = mathlist or specials + end + if ligature then + category = mathlist and "mathlist" or "specials" + found = ligature + last = current + lucleus = nucleus + lsup = sup + lsub = sub + end + tree = match + if sub or sup then + break + else + current = getnext(current) + end + else + break + end + else + break + end + else + break + end + end + if found and last and lucleus then + local id = getfont(lucleus) + local characters = fontcharacters[id] + local replace = characters and characters[found] + if not replace then + if not reported[id][found] then + reported[id][found] = true + report_collapsing("%s ligature %C from %s","ignoring",found,category) + end + elseif trace_collapsing then + report_collapsing("%s ligature %C from %s","creating",found,category) + end + setchar(pointer,found) + local l = getnext(last) + local c = getnext(parent) + if lsub then + setsub(parent,lsub) + setsub(last) + end + if lsup then + setsup(parent,lsup) + setsup(last) + end + while c ~= l do + local n = getnext(c) + flush_node(c) + c = n + end + setlink(parent,l) + end + end + end + + function noads.handlers.collapse(head,style,penalties) + processnoads(head,collapse,"collapse") + return true + end -mathpairs[0x2032] = { [0x2032] = 0x2033, [0x2033] = 0x2034, [0x2034] = 0x2057 } -- (prime,prime) (prime,doubleprime) (prime,tripleprime) -mathpairs[0x2033] = { [0x2032] = 0x2034, [0x2033] = 0x2057 } -- (doubleprime,prime) (doubleprime,doubleprime) -mathpairs[0x2034] = { [0x2032] = 0x2057 } -- (tripleprime,prime) + local enable = function() + enableaction("math", "noads.handlers.collapse") + if trace_collapsing then + report_collapsing("enabling math collapsing") + end + enable = false + end -mathpairs[0x2035] = { [0x2035] = 0x2036, [0x2036] = 0x2037 } -- (reversedprime,reversedprime) (reversedprime,doublereversedprime) -mathpairs[0x2036] = { [0x2035] = 0x2037 } -- (doublereversedprime,reversedprime) + implement { + name = "initializemathcollapsing", + actions = enable, + onlyonce = true, + } -mathpairs[0x222B] = { [0x222B] = 0x222C, [0x222C] = 0x222D } -mathpairs[0x222C] = { [0x222B] = 0x222D } +end -mathpairs[0x007C] = { [0x007C] = 0x2016, [0x2016] = 0x2980 } -- bar+bar=double bar+double=triple -mathpairs[0x2016] = { [0x007C] = 0x2980 } -- double+bar=triple +do + -- inner under over vcenter + + local fixscripts = { } + local movesub = { + -- primes + [0x2032] = 0xFE932, + [0x2033] = 0xFE933, + [0x2034] = 0xFE934, + [0x2057] = 0xFE957, + -- reverse primes + [0x2035] = 0xFE935, + [0x2036] = 0xFE936, + [0x2037] = 0xFE937, + } -local movesub = { - -- primes - [0x2032] = 0xFE932, - [0x2033] = 0xFE933, - [0x2034] = 0xFE934, - [0x2057] = 0xFE957, - -- reverse primes - [0x2035] = 0xFE935, - [0x2036] = 0xFE936, - [0x2037] = 0xFE937, -} + mathematics.virtualize(movesub) -local validpair = { - [noad_rel] = true, - [noad_ord] = true, - [noad_bin] = true, -- new - [noad_punct] = true, -- new - [noad_opdisplaylimits] = true, - [noad_oplimits] = true, - [noad_opnolimits] = true, -} + local options_supported = tokens.defined("Unosuperscript") -local function movesubscript(parent,current_nucleus,current_char) - local prev = getprev(parent) - if prev and getid(prev) == math_noad then - if not getsup(prev) and not getsub(prev) then - -- {f} {'}_n => f_n^' - setchar(current_nucleus,movesub[current_char or getchar(current_nucleus)]) - local nucleus = getnucleus(parent) - local sub = getsub(parent) - local sup = getsup(parent) - setsup(prev,nucleus) - setsub(prev,sub) - local dummy = copy_node(nucleus) - setchar(dummy,0) - setnucleus(parent,dummy) - setsub(parent) - if trace_collapsing then - report_collapsing("fixing subscript") + local function fixsupscript(parent,current,current_char,new_char) + if new_char ~= current_char and new_char ~= true then + setchar(current,new_char) + if trace_fixing then + report_fixing("fixing subscript, replacing superscript %U by %U",current_char,new_char) end - elseif not getsup(prev) then - -- {f} {'}_n => f_n^' - setchar(current_nucleus,movesub[current_char or getchar(current_nucleus)]) - local nucleus = getnucleus(parent) - local sup = getsup(parent) - setsup(prev,nucleus) - local dummy = copy_node(nucleus) - setchar(dummy,0) - setnucleus(parent,dummy) - if trace_collapsing then - report_collapsing("fixing subscript") + else + if trace_fixing then + report_fixing("fixing subscript, superscript %U",current_char) end end + if options_supported then + setfield(parent,"options",0x08+0x22) + end end -end -local function collapsepair(pointer,what,n,parent,nested) -- todo: switch to turn in on and off - if parent then - if validpair[getsubtype(parent)] then - local current_nucleus = getnucleus(parent) - if getid(current_nucleus) == math_char then - local current_char = getchar(current_nucleus) - if not getsub(parent) and not getsup(parent) then - local mathpair = mathpairs[current_char] - if mathpair then - local next_noad = getnext(parent) - if next_noad and getid(next_noad) == math_noad then - if validpair[getsubtype(next_noad)] then - local next_nucleus = getnucleus(next_noad) - local next_char = getchar(next_nucleus) - if getid(next_nucleus) == math_char then - local newchar = mathpair[next_char] - if newchar then - local id = getfont(current_nucleus) - local characters = fontcharacters[id] - if characters and characters[newchar] then - if trace_collapsing then - report_collapsing("%U + %U => %U",current_char,next_char,newchar) - end - setchar(current_nucleus,newchar) - local next_next_noad = getnext(next_noad) - if next_next_noad then - setlink(parent,next_next_noad) - else - setnext(parent) - end - setsup(parent,getsup(next_noad)) - setsub(parent,getsub(next_noad)) - setsup(next_noad) - setsub(next_noad) - flush_node(next_noad) - collapsepair(pointer,what,n,parent,true) - -- if not nested and movesub[current_char] then - -- movesubscript(parent,current_nucleus,current_char) - -- end - end - elseif not nested and movesub[current_char] then - movesubscript(parent,current_nucleus,current_char) - end + -- local function movesubscript(parent,current_nucleus,oldchar,newchar) + -- local prev = getprev(parent) + -- if prev and getid(prev) == math_noad then + -- local psup = getsup(prev) + -- local psub = getsub(prev) + -- if not psup and not psub then + -- fixsupscript(prev,current_nucleus,oldchar,newchar) + -- local nucleus = getnucleus(parent) + -- local sub = getsub(parent) + -- setsup(prev,nucleus) + -- setsub(prev,sub) + -- local dummy = copy_node(nucleus) + -- setchar(dummy,0) + -- setnucleus(parent,dummy) + -- setsub(parent) + -- elseif not psup then + -- fixsupscript(prev,current_nucleus,oldchar,newchar) + -- local nucleus = getnucleus(parent) + -- setsup(prev,nucleus) + -- local dummy = copy_node(nucleus) + -- setchar(dummy,0) + -- setnucleus(parent,dummy) + -- end + -- end + -- end + + local function move_none_none(parent,prev,nuc,oldchar,newchar) + fixsupscript(prev,nuc,oldchar,newchar) + local sub = getsub(parent) + setsup(prev,nuc) + setsub(prev,sub) + local dummy = copy_node(nuc) + setchar(dummy,0) + setnucleus(parent,dummy) + setsub(parent) + end + + local function move_none_psub(parent,prev,nuc,oldchar,newchar) + fixsupscript(prev,nuc,oldchar,newchar) + setsup(prev,nuc) + local dummy = copy_node(nuc) + setchar(dummy,0) + setnucleus(parent,dummy) + end + + fixscripts[math_char] = function(pointer,what,n,parent,nested) -- todo: switch to turn in on and off + if parent then + local oldchar = getchar(pointer) + local newchar = movesub[oldchar] + if newchar then + local nuc = getnucleus(parent) + if pointer == nuc then + local sub = getsub(pointer) + local sup = getsup(pointer) + if sub then + if sup then + -- print("[char] sub sup") + else + -- print("[char] sub ---") + end + elseif sup then + -- print("[char] --- sup") + else + local prev = getprev(parent) + if prev and getid(prev) == math_noad then + local psub = getsub(prev) + local psup = getsup(prev) + if psub then + if psup then + -- print("sub sup [char] --- ---") + else + -- print("sub --- [char] --- ---") + move_none_psub(parent,prev,nuc,oldchar,newchar) end + elseif psup then + -- print("--- sup [char] --- ---") + else + -- print("[char] --- ---") + move_none_none(parent,prev,nuc,oldchar,newchar) end - elseif not nested and movesub[current_char] then - movesubscript(parent,current_nucleus,current_char) + else + -- print("no prev [char]") end - elseif not nested and movesub[current_char] then - movesubscript(parent,current_nucleus,current_char) end - elseif not nested and movesub[current_char] then - movesubscript(parent,current_nucleus,current_char) + else + -- print("[char]") end end end end -end -collapse[math_char] = collapsepair + function noads.handlers.fixscripts(head,style,penalties) + processnoads(head,fixscripts,"fixscripts") + return true + end -function noads.handlers.collapse(head,style,penalties) - processnoads(head,collapse,"collapse") - return true end -- variants -local variants = { } - -local validvariants = { -- fast check on valid - [0x2229] = 0xFE00, [0x222A] = 0xFE00, - [0x2268] = 0xFE00, [0x2269] = 0xFE00, - [0x2272] = 0xFE00, [0x2273] = 0xFE00, - [0x228A] = 0xFE00, [0x228B] = 0xFE00, - [0x2293] = 0xFE00, [0x2294] = 0xFE00, - [0x2295] = 0xFE00, - [0x2297] = 0xFE00, - [0x229C] = 0xFE00, - [0x22DA] = 0xFE00, [0x22DB] = 0xFE00, - [0x2A3C] = 0xFE00, [0x2A3D] = 0xFE00, - [0x2A9D] = 0xFE00, [0x2A9E] = 0xFE00, - [0x2AAC] = 0xFE00, [0x2AAD] = 0xFE00, - [0x2ACB] = 0xFE00, [0x2ACC] = 0xFE00, -} +do -variants[math_char] = function(pointer,what,n,parent) -- also set export value - local char = getchar(pointer) - local selector = validvariants[char] - if selector then - local next = getnext(parent) - if next and getid(next) == math_noad then - local nucleus = getnucleus(next) - if nucleus and getid(nucleus) == math_char and getchar(nucleus) == selector then - local variant - local tfmdata = fontdata[getfont(pointer)] - local mathvariants = tfmdata.resources.variants -- and variantdata - if mathvariants then - mathvariants = mathvariants[selector] + local variants = { } + local validvariants = { -- fast check on valid + [0x2229] = 0xFE00, [0x222A] = 0xFE00, + [0x2268] = 0xFE00, [0x2269] = 0xFE00, + [0x2272] = 0xFE00, [0x2273] = 0xFE00, + [0x228A] = 0xFE00, [0x228B] = 0xFE00, + [0x2293] = 0xFE00, [0x2294] = 0xFE00, + [0x2295] = 0xFE00, + [0x2297] = 0xFE00, + [0x229C] = 0xFE00, + [0x22DA] = 0xFE00, [0x22DB] = 0xFE00, + [0x2A3C] = 0xFE00, [0x2A3D] = 0xFE00, + [0x2A9D] = 0xFE00, [0x2A9E] = 0xFE00, + [0x2AAC] = 0xFE00, [0x2AAD] = 0xFE00, + [0x2ACB] = 0xFE00, [0x2ACC] = 0xFE00, + } + + variants[math_char] = function(pointer,what,n,parent) -- also set export value + local char = getchar(pointer) + local selector = validvariants[char] + if selector then + local next = getnext(parent) + if next and getid(next) == math_noad then + local nucleus = getnucleus(next) + if nucleus and getid(nucleus) == math_char and getchar(nucleus) == selector then + local variant + local tfmdata = fontdata[getfont(pointer)] + local mathvariants = tfmdata.resources.variants -- and variantdata if mathvariants then - variant = mathvariants[char] - end - end - if variant then - setchar(pointer,variant) - setattr(pointer,a_exportstatus,char) -- we don't export the variant as it's visual markup - if trace_variants then - report_variants("variant (%U,%U) replaced by %U",char,selector,variant) + mathvariants = mathvariants[selector] + if mathvariants then + variant = mathvariants[char] + end end - else - if trace_variants then - report_variants("no variant (%U,%U)",char,selector) + if variant then + setchar(pointer,variant) + setattr(pointer,a_exportstatus,char) -- we don't export the variant as it's visual markup + if trace_variants then + report_variants("variant (%U,%U) replaced by %U",char,selector,variant) + end + else + if trace_variants then + report_variants("no variant (%U,%U)",char,selector) + end end + setprev(next,pointer) + setnext(parent,getnext(next)) + flush_node(next) end - setprev(next,pointer) - setnext(parent,getnext(next)) - flush_node(next) end end end -end -function handlers.variants(head,style,penalties) - processnoads(head,variants,"unicode variant") - return true + function handlers.variants(head,style,penalties) + processnoads(head,variants,"unicode variant") + return true + end + end -- for manuals -local classes = { } - -local colors = { - [noad_rel] = "trace:dr", - [noad_ord] = "trace:db", - [noad_bin] = "trace:dg", - [noad_open] = "trace:dm", - [noad_close] = "trace:dm", - [noad_punct] = "trace:dc", - -- [noad_opdisplaylimits] = "", - -- [noad_oplimits] = "", - -- [noad_opnolimits] = "", - -- [noad_inner = "", - -- [noad_under = "", - -- [noad_over = "", - -- [noad_vcenter = "", -} +do -classes[math_char] = function(pointer,what,n,parent) - local color = colors[getsubtype(parent)] - if color then - setcolor(pointer,color) - else - resetcolor(pointer) + local classes = { } + local colors = { + [noad_rel] = "trace:dr", + [noad_ord] = "trace:db", + [noad_bin] = "trace:dg", + [noad_open] = "trace:dm", + [noad_close] = "trace:dm", + [noad_punct] = "trace:dc", + -- [noad_opdisplaylimits] = "", + -- [noad_oplimits] = "", + -- [noad_opnolimits] = "", + -- [noad_inner = "", + -- [noad_under = "", + -- [noad_over = "", + -- [noad_vcenter = "", + } + + local setcolor = colortracers.set + local resetcolor = colortracers.reset + + classes[math_char] = function(pointer,what,n,parent) + local color = colors[getsubtype(parent)] + if color then + setcolor(pointer,color) + else + resetcolor(pointer) + end end -end -function handlers.classes(head,style,penalties) - processnoads(head,classes,"classes") - return true -end + function handlers.classes(head,style,penalties) + processnoads(head,classes,"classes") + return true + end -registertracker("math.classes",function(v) - setaction("math","noads.handlers.classes",v) -end) + registertracker("math.classes",function(v) + setaction("math","noads.handlers.classes",v) + end) + +end -- experimental @@ -1760,9 +2001,7 @@ do local categories = { } local numbers = { } local a_mathdomain = privateattribute("mathdomain") - mathematics.domains = categories - local permitted = { ordinary = noad_ord, binary = noad_bin, @@ -1915,22 +2154,44 @@ end) -- also for me -local applyvisuals = nuts.applyvisuals -local visual = false +do -function handlers.makeup(head) - applyvisuals(tonut(head),visual) -end + local applyvisuals = nuts.applyvisuals + local visual = false -registertracker("math.makeup",function(v) - visual = v - setaction("math","noads.handlers.makeup",v) -end) + function handlers.makeup(head) + applyvisuals(tonut(head),visual) + end + + registertracker("math.makeup",function(v) + visual = v + setaction("math","noads.handlers.makeup",v) + end) + +end -- the normal builder -function builders.kernel.mlist_to_hlist(head,style,penalties) - return mlist_to_hlist(head,style,penalties), true +do + + local force_penalties = false + + -- registertracker("math.penalties",function(v) + -- force_penalties = v + -- end) + + function builders.kernel.mlist_to_hlist(head,style,penalties) + return mlist_to_hlist(head,style,force_penalties or penalties), true + end + + implement { + name = "setmathpenalties", + arguments = "integer", + actions = function(p) + force_penalties = p > 0 + end, + } + end -- function builders.kernel.mlist_to_hlist(head,style,penalties) diff --git a/tex/context/base/mkiv/math-pln.mkiv b/tex/context/base/mkiv/math-pln.mkiv index 754cb6141..d0e7e377d 100644 --- a/tex/context/base/mkiv/math-pln.mkiv +++ b/tex/context/base/mkiv/math-pln.mkiv @@ -138,4 +138,114 @@ \normalstartimath\tabskip\zeroskip\everycr\emptytoks\hfil\displaystyle\alignmark\alignmark\hfil\normalstopimath}\crcr #1\crcr}} +%D This comes from plain but I gave it a \CONTEXT\ touch: + +\def\math_border_NC_indeed + {\gdef\math_border_NC{\aligntab}} + +\let\math_border_NC\math_border_NC_indeed + +\def\math_border_NR + {\glet\math_border_NC\math_border_NC_indeed + \cr} + +\unexpanded\def\math_border_matrix#1#2#3% adapted plain + {\begingroup + % + \pushmacro\cr + % + \setbox\scratchbox\hbox\bgroup + \mr B% + \egroup + \scratchdimenone\wd\scratchbox + % + \scratchdimentwo.2\bodyfontsize + % + \mathsurround\zeropoint + % + \def\NC{\math_border_NC}% + \def\NR{\math_border_NR}% + % + \setbox\scratchboxone\vbox\bgroup + \def\cr{% + \crcr + \noalign\bgroup + \kern\scratchdimentwo + \global\let\cr\endline + \egroup + }% + \ialign{% + \startimath\alignmark\alignmark\stopimath + \hfil + \kern\dimexpr\scratchdimentwo+\scratchdimenone\relax + \aligntab + \thinspace + \hfil + \startimath\alignmark\alignmark\stopimath + \hfil + \aligntab + \aligntab + \quad + \hfil + \startimath\alignmark\alignmark\stopimath + \hfil + \crcr + \omit + \strut + \hfil + \crcr + \noalign{\kern-\baselineskip}% + #3\crcr + \omit + \strut + \cr + }% + \egroup + \setbox\scratchboxtwo\vbox\bgroup + \unvcopy\scratchboxone + \global\setbox\globalscratchbox\lastbox + \egroup + \setbox\scratchboxtwo\hbox\bgroup + \unhbox\globalscratchbox + \unskip + \global\setbox\globalscratchbox\lastbox + \egroup + \setbox\scratchboxtwo\hbox\bgroup + \startimath + \kern\dimexpr\wd\globalscratchbox-\scratchdimenone\relax + \left#1\relax + \kern-\wd\globalscratchbox + \global\setbox\globalscratchbox\vbox\bgroup + \box\globalscratchbox + \kern\scratchdimentwo + \egroup + \vcenter\bgroup + \kern-\ht\globalscratchbox + \unvbox\scratchboxone + \kern-\baselineskip + \egroup + \thinspace + \right#2\relax + \stopimath + \egroup + \null + \thickspace + \vbox\bgroup + \kern\ht\globalscratchbox + \box\scratchboxtwo + \egroup + % + \popmacro\cr + % + \endgroup} + +\unexpanded\def\bordermatrix {\math_border_matrix()} +\unexpanded\def\bbordermatrix{\math_border_matrix[]} + +\unexpanded\def\startbordermatrix #1\stopbordermatrix {\math_border_matrix(){#1}} +\unexpanded\def\startbbordermatrix#1\stopbbordermatrix{\math_border_matrix[]{#1}} + +\let\stopbordermatrix \relax +\let\stopbbordermatrix\relax + \protect \endinput diff --git a/tex/context/base/mkiv/math-rad.mkvi b/tex/context/base/mkiv/math-rad.mkvi index 699a1a125..c0b128a61 100644 --- a/tex/context/base/mkiv/math-rad.mkvi +++ b/tex/context/base/mkiv/math-rad.mkvi @@ -240,13 +240,10 @@ \d_overlay_linewidth\linewidth \edef\overlaylinecolor{\mathornamentparameter\c!color}% \edef\p_mp{\mathornamentparameter\c!mp}% - % thw width of the graphic determines the width of the final result + % the width of the graphic determines the width of the final result \setbox\scratchbox\hpack{\uniqueMPgraphic{\p_mp}}% todo: add code key + tag - \scratchdimen \wd\scratchbox - % \scratchtopoffset \dimexpr\scratchoffset+\dp\nextbox\relax - % \scratchbottomoffset\dimexpr\scratchoffset+\ht\nextbox/2\relax - \hpack to \scratchdimen{\hss\box\nextbox\hss}% - \hskip-\scratchdimen + \hpack to \wd\scratchbox{\hss\box\nextbox\hss}% + \hskip-\wd\scratchbox \box\scratchbox \endgroup} diff --git a/tex/context/base/mkiv/math-spa.lua b/tex/context/base/mkiv/math-spa.lua new file mode 100644 index 000000000..92ee662b9 --- /dev/null +++ b/tex/context/base/mkiv/math-spa.lua @@ -0,0 +1,89 @@ +if not modules then modules = { } end modules ['math-spa'] = { + version = 1.001, + comment = "companion to math-ini.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +-- for the moment (when testing) we use a penalty 1 + +local penalty_code = nodes.nodecodes.penalty +local glue_code = nodes.nodecodes.glue + +local nuts = nodes.nuts +local tonut = nodes.tonut +local tonode = nodes.tonode +local getid = nuts.getid +local getnext = nuts.getnext +local getwidth = nuts.getwidth +local setglue = nuts.setglue +local getpenalty = nuts.getpenalty +local setpenalty = nuts.setpenalty + +local traverse_id = nuts.traverse_id +local get_dimensions = nuts.dimensions + + +local texsetdimen = tex.setdimen + +local v_none = interfaces.variables.none +local v_auto = interfaces.variables.auto + +local method = v_none +local distance = 0 + +function noads.handlers.align(l) + if method ~= v_none then + local h = tonut(l) + if method == v_auto then + local s = h + while s do + local id = getid(s) + local n = getnext(s) + if id == penalty_code and getpenalty(s) == 1 then + setpenalty(s,0) + if n and getid(n) == glue_code then + s = n + n = getnext(s) + end + local w = get_dimensions(h,n) + distance + texsetdimen("global","d_strc_math_indent",w) + break + end + s = n + end + else + texsetdimen("global","d_strc_math_indent",distance) + end + for n in traverse_id(glue_code,h) do + setglue(n,getwidth(n),0,0) + end + else + -- texsetdimen("global","d_strc_math_indent",0) + end + return l, true +end + +interfaces.implement { + name = "setmathhang", + arguments = { + { + { "method", "string" }, + { "distance", "dimension" }, + } + }, + actions = function(t) + method = t.method or v_none + distance = t.distance or 0 + end +} + +interfaces.implement { + name = "resetmathhang", + actions = function(t) + method = v_none + distance = 0 + end +} + diff --git a/tex/context/base/mkiv/math-stc.mkvi b/tex/context/base/mkiv/math-stc.mkvi index 208e756f6..c9d469d61 100644 --- a/tex/context/base/mkiv/math-stc.mkvi +++ b/tex/context/base/mkiv/math-stc.mkvi @@ -69,12 +69,20 @@ % currently no italic correction ... problem is that we don't know yet if we have an italic % below so we we need to postpone -\def\math_stackers_fallback - {\hbox to \scratchwidth{\csname\??mathextensiblefallbacks\ifcsname\??mathextensiblefallbacks\number\scratchunicode\endcsname\number\scratchunicode\fi\endcsname}} - %{\csname\??mathextensiblefallbacks\ifcsname\??mathextensiblefallbacks\number\scratchunicode\endcsname\number\scratchunicode\fi\endcsname } +% \def\math_stackers_fallback +% {\hbox to \scratchwidth{\csname\??mathextensiblefallbacks\ifcsname\??mathextensiblefallbacks\number\scratchunicode\endcsname\number\scratchunicode\fi\endcsname}} +% %{\csname\??mathextensiblefallbacks\ifcsname\??mathextensiblefallbacks\number\scratchunicode\endcsname\number\scratchunicode\fi\endcsname } -% \def\math_stackers_regular -% {\mathstylehbox{\Umathaccent\fam\zerocount\scratchunicode{\hskip\scratchwidth}}} +\def\math_stackers_fallback + {\mathstylehbox to \scratchwidth{\usemathstackerscolorparameter\c!color + \hss + \hskip\mathstackersparameter\c!topoffset\relax % for manual italic correction + \ifcsname\??mathextensiblefallbacks\number\scratchunicode\endcsname + \lastnamedcs + \else + \Umathchar \fam \zerocount \scratchunicode + \fi + \hss}} \def\math_stackers_regular {\mathstylehbox{\usemathstackerscolorparameter\c!color @@ -89,7 +97,8 @@ % $\Umathaccent 0 0 "2190{x}$ \par $\Umathaccent 0 0 "27F8{x}$\par % $\Udelimiterunder 0 "2190{x}$ \par $\Udelimiterunder 0 "27F8{x}$\par -\setvalue{\??mathextensiblefallbacks}{\hbox{\vrule\!!width\scratchwidth\!!height.1\exheight\!!depth\zeropoint}} +\setvalue{\??mathextensiblefallbacks}% + {\hpack{\vrule\s!width\scratchwidth\s!height.1\mathexheight\s!depth\zeropoint}} % \def\math_stackers_with_fallback#codepoint% % {\begingroup @@ -151,16 +160,13 @@ \c!right=, \c!mathclass=\s!rel, \c!alternative=\v!normal, - \c!mp=math:stacker:\number\scratchunicode, - \c!mpheight=\exheight, - \c!mpdepth=\exheight, - \c!mpoffset=.25\exheight, - \c!voffset=.25\exheight, - \c!hoffset=.5\emwidth, + \c!voffset=.25\mathexheight, + \c!hoffset=\zeropoint, + \c!topoffset=\zeropoint, % for manual italic correction \c!distance=\mathstackersparameter\c!voffset, % distance between symbol and base (can be different from voffset) - \c!minheight=\exheight, + \c!minheight=\mathexheight, \c!mindepth=\zeropoint, - \c!minwidth=.5\emwidth, + \c!minwidth=.5\mathemwidth, \c!order=\v!normal, \c!strut=, \c!color=, % todo: when I need it @@ -220,16 +226,46 @@ \letvalue{\??mathstackersalternative\v!normal }\math_stackers_content \letvalue{\??mathstackersalternative\v!default}\math_stackers_content +\setupmathstackers + [\c!mp=math:stacker:\number\scratchunicode, + \c!mpheight=\mathcharht\scratchunicode, + \c!mpdepth=\mathchardp\scratchunicode, + \c!mpoffset=.25\mathexheight] + +% \setvalue{\??mathstackersalternative\v!mp}% +% {\hbox\bgroup % todo: add code key + tag +% \d_overlay_width \scratchwidth +% \d_overlay_height \dimexpr\mathstackersparameter\c!mpheight +% \d_overlay_depth \dimexpr\mathstackersparameter\c!mpdepth +% \d_overlay_offset \dimexpr\mathstackersparameter\c!mpoffset +% \d_overlay_linewidth\linewidth +% \edef\overlaylinecolor{\mathstackersparameter\c!color}% +% \edef\p_mp{\mathstackersparameter\c!mp}% +% \uniqueMPgraphic{\p_mp}% +% \egroup} + \setvalue{\??mathstackersalternative\v!mp}% - {\hbox\bgroup % todo: add code key + tag + {\normalexpanded{\math_stackers_mp_box + {\the\dimexpr\mathstackersparameter\c!mpheight}% + {\the\dimexpr\mathstackersparameter\c!mpdepth}% + {\the\dimexpr\mathstackersparameter\c!mpoffset}% + {\the\dimexpr\triggeredmathstyleparameter\Umathfractionrule}% + {\the\dimexpr\triggeredmathstyleparameter\Umathaxis}% + {\the\mathexheight}% + {\the\mathemwidth}% + }} + +\unexpanded\def\math_stackers_mp_box#1#2#3#4#5#6#7% + {\hpack\bgroup % todo: add code key + tag + % we can speed up \mathexheight expansion a bit \d_overlay_width \scratchwidth - \d_overlay_height \dimexpr\mathstackersparameter\c!mpheight - \d_overlay_depth \dimexpr\mathstackersparameter\c!mpdepth - \d_overlay_offset \dimexpr\mathstackersparameter\c!mpoffset - \d_overlay_linewidth\linewidth + \d_overlay_height #1\relax + \d_overlay_depth #2\relax + \d_overlay_offset #3\relax + \d_overlay_linewidth#4\relax \edef\overlaylinecolor{\mathstackersparameter\c!color}% \edef\p_mp{\mathstackersparameter\c!mp}% - \uniqueMPgraphic{\p_mp}% + \uniqueMPgraphic{\p_mp}{axis=#5,ex=#6,em=#7}% \egroup} \def\math_stackers_check_unicode#codepoint% @@ -241,7 +277,7 @@ % heads/tails + hoffset \else\ifx\p_offset\v!min % heads/tails - hoffset - \advance\scratchleftoffset-\scratchhoffset + \advance\scratchleftoffset -\scratchhoffset \advance\scratchrightoffset-\scratchhoffset \else % \v!normal % hoffset @@ -288,15 +324,27 @@ \ifmmode\math_class_by_parameter\mathstackersparameter\else\dontleavehmode\fi {\edef\p_offset {\mathstackersparameter\c!offset}% \edef\p_location {\mathstackersparameter\c!location}% - \edef\p_order {\mathstackersparameter\c!order}% \edef\p_strut {\mathstackersparameter\c!strut}% \edef\p_alternative{\mathstackersparameter\c!alternative}% - \ifx\p_order\v!reverse - \edef\m_math_stackers_text_top {#bottomtext}% - \edef\m_math_stackers_text_bottom{#toptext}% - \else - \edef\m_math_stackers_text_top {#toptext}% - \edef\m_math_stackers_text_bottom{#bottomtext}% + % \ifx\p_order\v!reverse + % \ifsecondargument + % \edef\m_math_stackers_text_top {#bottomtext}% + % \edef\m_math_stackers_text_bottom{#toptext}% + % \else + % \edef\m_math_stackers_text_top {#toptext}% + % \let\m_math_stackers_text_bottom \empty + % \fi + % \else + % \edef\m_math_stackers_text_top {#toptext}% + % \edef\m_math_stackers_text_bottom{#bottomtext}% + % \fi + \edef\m_math_stackers_text_top {#toptext}% + \edef\m_math_stackers_text_bottom{#bottomtext}% + \ifsecondargument + \edef\p_order{\mathstackersparameter\c!order}% + \ifx\p_order\v!reverse + \swapmacros\m_math_stackers_text_top\m_math_stackers_text_bottom + \fi \fi \scratchleftoffset \zeropoint \scratchrightoffset\zeropoint @@ -317,13 +365,20 @@ \fi % \ifcase#method\relax - \scratchwidth\wd - \ifdim\wd\scratchboxone>\wd\scratchboxtwo - \scratchboxone - \else - \scratchboxtwo - \fi - \relax + % e.g. extensible + %\scratchwidth\wd + % \ifdim\wd\scratchboxone>\wd\scratchboxtwo + % \scratchboxone + % \else + % \scratchboxtwo + % \fi + %\relax + \scratchwidth\mathcharwd\scratchunicode + \ifdim\wd\scratchboxone>\scratchwidth + \scratchwidth\wd\scratchboxone + \else\ifdim\wd\scratchboxtwo>\scratchwidth + \scratchwidth\wd\scratchboxtwo + \fi\fi \else \ifx\m_math_stackers_text_middle\empty \setbox\scratchboxthree\emptyhbox @@ -645,21 +700,50 @@ \unexpanded\def\mathunder {\begingroup\dosingleempty\math_stackers_handle_under } \unexpanded\def\mathdouble{\begingroup\dodoubleempty\math_stackers_handle_double} -\def\math_stackers_handle_over[#category]% - {\math_stackers_direct_double\plusone\zerocount - {\iffirstargument#category\else\v!top \fi}} % will be defined later on +\unexpanded\def\definemathover {\dotripleargument \math_stackers_define_over } +\unexpanded\def\definemathunder {\dotripleargument \math_stackers_define_under } +\unexpanded\def\definemathdouble{\doquadrupleargument\math_stackers_define_double} + +\def\math_stackers_define_over[#category][#command][#topcode]% + {\setuvalue{#command}{\math_stackers_handle_direct\plusone\zerocount{#category}{#topcode}{0}}} -\def\math_stackers_handle_under[#category]% - {\math_stackers_direct_double\zerocount\plusone - {\iffirstargument#category\else\v!bottom\fi}} % will be defined later on +\def\math_stackers_define_under[#category][#command][#bottomcode]% + {\setuvalue{#command}{\math_stackers_handle_direct\zerocount\plusone{#category}{#bottomcode}{0}}} -\def\math_stackers_handle_double[#topcategory][#bottomcategory]% - {\math_stackers_direct_double\plusone\plusone - {\iffirstargument #topcategory\else\v!top \fi}% - {\ifsecondargument#bottomcategory\else\v!bottom\fi}} +\def\math_stackers_define_double[#category][#command][#topcode][#bottomcode]% + {\setuvalue{#command}{\math_stackers_handle_direct\plusone\plusone{#category}{#topcode}{#bottomcode}}} -\def\math_stackers_direct_double#top#bottom#category#codepoint#text% - {\math_stackers_make_double#top#bottom{#category}{#codepoint}{0}{#text}% +\unexpanded\def\mathover {\begingroup\dosingleempty\math_stackers_handle_over } +\unexpanded\def\mathunder {\begingroup\dosingleempty\math_stackers_handle_under } +\unexpanded\def\mathdouble{\begingroup\dosingleempty\math_stackers_handle_double} + +\def\math_stackers_handle_over[#category]#topcode#text% + {\math_stackers_make_double\plusone\zerocount + {\iffirstargument#category\else\v!top\fi}% + {#topcode}% + {0}% + {#text}% + \endgroup} + +\def\math_stackers_handle_under[#category]#bottomcode#text% + {\math_stackers_make_double\zerocount\plusone + {\iffirstargument#category\else\v!bottom\fi}% + {#bottomcode}% + {0}% + {#text}% + \endgroup} + +\def\math_stackers_handle_double[#category]#topcode#bottomcode#text% + {\math_stackers_make_double\plusone\plusone + {\iffirstargument#category\else\v!both\fi}% + {#topcode}% + {#bottomcode}% + {#text}% + \endgroup} + +\def\math_stackers_handle_direct#top#bottom#category#topcode#bottomcode#text% + {\begingroup + \math_stackers_make_double#top#bottom{#category}{#topcode}{#bottomcode}{#text}% \endgroup} %D A relative new one is a combination of accents and text (as needed in mathml): @@ -981,10 +1065,10 @@ %D Here come the new ones: \definemathstackers [\v!none] [\v!mathematics] [\c!hoffset=\zeropoint] -\definemathstackers [\v!normal] [\v!mathematics] [\c!hoffset=0.5\emwidth] % the default -\definemathstackers [\v!small] [\v!mathematics] [\c!hoffset=1\emwidth] -\definemathstackers [\v!medium] [\v!mathematics] [\c!hoffset=1.5\emwidth] -\definemathstackers [\v!big] [\v!mathematics] [\c!hoffset=2\emwidth] +\definemathstackers [\v!normal] [\v!mathematics] [\c!hoffset=0.5\mathemwidth] % the default +\definemathstackers [\v!small] [\v!mathematics] [\c!hoffset=1\mathemwidth] +\definemathstackers [\v!medium] [\v!mathematics] [\c!hoffset=1.5\mathemwidth] +\definemathstackers [\v!big] [\v!mathematics] [\c!hoffset=2\mathemwidth] \definemathextensible [\v!reverse] [xrel] ["002D] \definemathextensible [\v!reverse] [xequal] ["003D] @@ -1146,7 +1230,7 @@ [\c!offset=\v!max, \c!left=\enspace, \c!right=\enspace, - \c!hoffset=.5\emwidth] + \c!hoffset=.5\mathemwidth] \definemathextensible [\v!chemistry] [cleftarrow] ["2190] \definemathextensible [\v!chemistry] [crightarrow] ["2192] @@ -1197,14 +1281,14 @@ \unexpanded\def\defineextensiblefiller {\dodoubleargument\math_stackers_define_filler} -\def\math_stackers_define_filler[#1][#2]% - {\setuevalue{#1}{\leaders\number#2\hfill}} +% \def\math_stackers_define_filler[#1][#2]% +% {\setuevalue{#1}{\leaders\number#2\hfill}} -%D For the moment: +%D For the moment (needs checking): \def\math_stackers_define_filler[#1][#2]% {\expandafter\let\csname\??mathextensiblefallbacks\number#2\expandafter\endcsname\csname#1\endcsname - \expandafter\let\csname #1\expandafter\endcsname\csname#1\endcsname} + \expandafter\let\csname #1\expandafter\endcsname\csname#1\endcsname} % huh? \defineextensiblefiller [barfill] ["203E] \defineextensiblefiller [relfill] ["002D] @@ -1283,6 +1367,18 @@ \definemathunstacked [\v!wide] [implies] ["27F9] % \mathrel{\;\Longrightarrow\;} \definemathunstacked [\v!wide] [iff] ["27FA] % \mathrel{\;\Longleftrightarrow\;} +% New (an example of using \mathexheight): + +\definemathstackers + [\v!symbol] + [\c!voffset=-.3\mathexheight, + \c!hoffset=\zeropoint, + \c!mathclass=ord, + \c!topoffset=.4\mathemwidth, % poor man's italic correction + \c!middlecommand=\mathematics] + +\definemathover[\v!symbol][interiorset]["2218] + \protect \endinput % \mathrel{\mathop{\hbox to \dimen0{\hss\copy4\hss}} diff --git a/tex/context/base/mkiv/math-tag.lua b/tex/context/base/mkiv/math-tag.lua index 13c8fffc7..d1ed90d38 100644 --- a/tex/context/base/mkiv/math-tag.lua +++ b/tex/context/base/mkiv/math-tag.lua @@ -33,6 +33,10 @@ local setattr = nuts.setattr local getcomponents = nuts.getcomponents local getwidth = nuts.getwidth +local getnucleus = nuts.getnucleus +local getsub = nuts.getsub +local getsup = nuts.getsup + local set_attributes = nuts.setattributes local traverse_nodes = nuts.traverse @@ -60,6 +64,7 @@ local math_fixed_both = accentcodes.fixedboth local kerncodes = nodes.kerncodes local fontkern_code = kerncodes.fontkern +local italickern_code = kerncodes.italickern local hlist_code = nodecodes.hlist local vlist_code = nodecodes.vlist @@ -74,7 +79,6 @@ local processnoads = noads.process local a_tagged = attributes.private('tagged') local a_mathcategory = attributes.private('mathcategory') local a_mathmode = attributes.private('mathmode') -local a_fontkern = attributes.private('fontkern') local tags = structures.tags @@ -85,7 +89,7 @@ local taglist = tags.taglist local chardata = characters.data -local getmathcode = tex.getmathcode +local getmathcodes = tex.getmathcodes local mathcodes = mathematics.codes local ordinary_code = mathcodes.ordinary local variable_code = mathcodes.variable @@ -101,9 +105,9 @@ local function processsubsup(start) -- At some point we might need to add an attribute signaling the -- super- and subscripts because TeX and MathML use a different -- order. The mrows are needed to keep mn's separated. - local nucleus = getfield(start,"nucleus") - local sup = getfield(start,"sup") - local sub = getfield(start,"sub") + local nucleus = getnucleus(start) + local sup = getsup(start) + local sub = getsub(start) if sub then if sup then setattr(start,a_tagged,start_tagged("msubsup")) @@ -190,7 +194,7 @@ process = function(start) -- we cannot use the processor as we have no finalizer mtexttag = start_tagged("mtext") end setattr(start,a_tagged,mtexttag) - elseif mtexttag and id == kern_code and (getsubtype(start) == fontkern_code or getattr(start,a_fontkern)) then + elseif mtexttag and id == kern_code and (getsubtype(start) == fontkern_code or getsubtype(start) == italickern_code) then -- italickern setattr(start,a_tagged,mtexttag) else if mtexttag then @@ -199,10 +203,7 @@ process = function(start) -- we cannot use the processor as we have no finalizer end if id == math_char_code then local char = getchar(start) - local code = getmathcode(char) - if code then - code = code[1] - end + local code = getmathcodes(char) local tag if code == ordinary_code or code == variable_code then local ch = chardata[char] @@ -247,95 +248,102 @@ process = function(start) -- we cannot use the processor as we have no finalizer elseif id == math_box_code or id == hlist_code or id == vlist_code then -- keep an eye on math_box_code and see what ends up in there local attr = getattr(start,a_tagged) +if not attr then + -- just skip +else local specification = taglist[attr] - local tag = specification.tagname - if tag == "formulacaption" then - -- skip - elseif tag == "mstacker" then - local list = getlist(start) - if list then - process(list) - end - else - if tag ~= "mstackertop" and tag ~= "mstackermid" and tag ~= "mstackerbot" then - tag = "mtext" - end - local text = start_tagged(tag) - setattr(start,a_tagged,text) - local list = getlist(start) - if not list then - -- empty list - elseif not attr then - -- box comes from strange place - set_attributes(list,a_tagged,text) -- only the first node ? + if specification then + local tag = specification.tagname + if tag == "formulacaption" then + -- skip + elseif tag == "mstacker" then + local list = getlist(start) + if list then + process(list) + end else - -- Beware, the first node in list is the actual list so we definitely - -- need to nest. This approach is a hack, maybe I'll make a proper - -- nesting feature to deal with this at another level. Here we just - -- fake structure by enforcing the inner one. - -- - -- todo: have a local list with local tags that then get appended - -- - local tagdata = specification.taglist - local common = #tagdata + 1 - local function runner(list,depth) -- quite inefficient - local cache = { } -- we can have nested unboxed mess so best local to runner - local keep = nil - -- local keep = { } -- win case we might need to move keep outside - for n in traverse_nodes(list) do - local id = getid(n) - local mth = id == math_code and getsubtype(n) - if mth == 0 then - -- insert(keep,text) - keep = text - text = start_tagged("mrow") - common = common + 1 - end - local aa = getattr(n,a_tagged) - if aa then - local ac = cache[aa] - if not ac then - local tagdata = taglist[aa].taglist - local extra = #tagdata - if common <= extra then - for i=common,extra do - ac = restart_tagged(tagdata[i]) -- can be made faster - end - for i=common,extra do - stop_tagged() -- can be made faster + if tag ~= "mstackertop" and tag ~= "mstackermid" and tag ~= "mstackerbot" then + tag = "mtext" + end + local text = start_tagged(tag) + setattr(start,a_tagged,text) + local list = getlist(start) + if not list then + -- empty list + elseif not attr then + -- box comes from strange place + set_attributes(list,a_tagged,text) -- only the first node ? + else + -- Beware, the first node in list is the actual list so we definitely + -- need to nest. This approach is a hack, maybe I'll make a proper + -- nesting feature to deal with this at another level. Here we just + -- fake structure by enforcing the inner one. + -- + -- todo: have a local list with local tags that then get appended + -- + local tagdata = specification.taglist + local common = #tagdata + 1 + local function runner(list,depth) -- quite inefficient + local cache = { } -- we can have nested unboxed mess so best local to runner + local keep = nil + -- local keep = { } -- win case we might need to move keep outside + for n in traverse_nodes(list) do + local id = getid(n) + local mth = id == math_code and getsubtype(n) + if mth == 0 then + -- insert(keep,text) + keep = text + text = start_tagged("mrow") + common = common + 1 + end + local aa = getattr(n,a_tagged) + if aa then + local ac = cache[aa] + if not ac then + local tagdata = taglist[aa].taglist + local extra = #tagdata + if common <= extra then + for i=common,extra do + ac = restart_tagged(tagdata[i]) -- can be made faster + end + for i=common,extra do + stop_tagged() -- can be made faster + end + else + ac = text end - else - ac = text + cache[aa] = ac end - cache[aa] = ac + setattr(n,a_tagged,ac) + else + setattr(n,a_tagged,text) end - setattr(n,a_tagged,ac) - else - setattr(n,a_tagged,text) - end - if id == hlist_code or id == vlist_code then - runner(getlist(n),depth+1) - elseif id == glyph_code then - runner(getcomponents(n),depth+1) -- this should not be needed - elseif id == disc_code then - local pre, post, replace = getdisc(n) - runner(pre,depth+1) -- idem - runner(post,depth+1) -- idem - runner(replace,depth+1) -- idem - end - if mth == 1 then - stop_tagged() - -- text = remove(keep) - text = keep - common = common - 1 + if id == hlist_code or id == vlist_code then + runner(getlist(n),depth+1) + elseif id == glyph_code then + -- this should not be needed (todo: use tounicode info) + runner(getcomponents(n),depth+1) + elseif id == disc_code then + local pre, post, replace = getdisc(n) + runner(pre,depth+1) -- idem + runner(post,depth+1) -- idem + runner(replace,depth+1) -- idem + end + if mth == 1 then + stop_tagged() + -- text = remove(keep) + text = keep + common = common - 1 + end end end + runner(list,0) end - runner(list,0) + stop_tagged() end - stop_tagged() end +end elseif id == math_sub_code then -- normally a hbox local list = getlist(start) if list then @@ -420,7 +428,7 @@ process = function(start) -- we cannot use the processor as we have no finalizer -- left local properties = { } insert(fencesstack,properties) - setattr(start,a_tagged,start_tagged("mfenced",{ properties = properties })) -- needs checking + setattr(start,a_tagged,start_tagged("mfenced",properties)) -- needs checking if delim then start_tagged("ignore") local chr = getfield(delim,"small_char") diff --git a/tex/context/base/mkiv/math-vfu.lua b/tex/context/base/mkiv/math-vfu.lua index a8a789d28..4767ffa90 100644 --- a/tex/context/base/mkiv/math-vfu.lua +++ b/tex/context/base/mkiv/math-vfu.lua @@ -22,9 +22,8 @@ if not modules then modules = { } end modules ['math-vfu'] = { -- 20D6 -> 2190 -- 20D7 -> 2192 -local type, next = type, next +local type, next, tonumber = type, next, tonumber local max = math.max -local format = string.format local fastcopy = table.copy local fonts, nodes, mathematics = fonts, nodes, mathematics @@ -603,22 +602,24 @@ local function copy_glyph(main,target,original,unicode,slot) local olddata = original[unicode] if olddata then local newdata = { - width = olddata.width, - height = olddata.height, - depth = olddata.depth, - italic = olddata.italic, - kerns = olddata.kerns, - commands = { { "slot", slot, unicode } }, + width = olddata.width, + height = olddata.height, + depth = olddata.depth, + italic = olddata.italic, + kerns = olddata.kerns, + tounicode = olddata.tounicode, + commands = { { "slot", slot, unicode } }, } local glyphdata = newdata local nextglyph = olddata.next while nextglyph do local oldnextdata = original[nextglyph] local newnextdata = { - commands = { { "slot", slot, nextglyph } }, - width = oldnextdata.width, - height = oldnextdata.height, - depth = oldnextdata.depth, + width = oldnextdata.width, + height = oldnextdata.height, + depth = oldnextdata.depth, + tounicode = olddata.tounicode, + commands = { { "slot", slot, nextglyph } }, } local newnextglyph = addprivate(main,formatters["M-N-%H"](nextglyph),newnextdata) newdata.next = newnextglyph @@ -641,10 +642,11 @@ local function copy_glyph(main,target,original,unicode,slot) local oldglyph = hvi.glyph local olddata = original[oldglyph] local newdata = { - commands = { { "slot", slot, oldglyph } }, - width = olddata.width, - height = olddata.height, - depth = olddata.depth, + width = olddata.width, + height = olddata.height, + depth = olddata.depth, + tounicode = olddata.tounicode, + commands = { { "slot", slot, oldglyph } }, } hvi.glyph = addprivate(main,formatters["M-H-%H"](oldglyph),newdata) -- report_virtual("copied h variant: %X at index %i",hvi.glyph,i) @@ -659,10 +661,11 @@ local function copy_glyph(main,target,original,unicode,slot) local oldglyph = vvi.glyph local olddata = original[oldglyph] local newdata = { - commands = { { "slot", slot, oldglyph } }, - width = olddata.width, - height = olddata.height, - depth = olddata.depth, + width = olddata.width, + height = olddata.height, + depth = olddata.depth, + tounicode = olddata.tounicode, + commands = { { "slot", slot, oldglyph } }, } vvi.glyph = addprivate(main,formatters["M-V-%H"](oldglyph),newdata) -- report_virtual("copied v variant: %X at index %i",vvi.glyph,i) diff --git a/tex/context/base/mkiv/meta-fnt.lua b/tex/context/base/mkiv/meta-fnt.lua index 95bdfa6d9..d061c926a 100644 --- a/tex/context/base/mkiv/meta-fnt.lua +++ b/tex/context/base/mkiv/meta-fnt.lua @@ -6,6 +6,7 @@ if not modules then modules = { } end modules ['meta-fnt'] = { license = "see context related readme files" } +local next = next local concat = table.concat local format = string.format local formatters = string.formatters @@ -66,7 +67,7 @@ local flusher = { if inline then characters[slot] = { commands = { - { "special", "pdf:" .. code }, + { "pdf", "origin", code }, } } else @@ -190,7 +191,7 @@ statistics.register("metapost font generation", function() if total > 0 then local time = statistics.elapsedtime(flusher) if total > 0 then - return format("%i glyphs, %.3f seconds runtime, %i glyphs/second", total, time, total/time) + return format("%i glyphs, %.3f seconds runtime, %.1f glyphs/second", total, time, total/time) else return format("%i glyphs, %.3f seconds runtime", total, time) end @@ -201,7 +202,7 @@ statistics.register("metapost font loading",function() if variants > 0 then local time = statistics.elapsedtime(metapost.fonts) if variants > 0 then - return format("%.3f seconds, %i instances, %0.3f instances/second", time, variants, variants/time) + return format("%.3f seconds, %i instances, %.3f instances/second", time, variants, variants/time) else return format("%.3f seconds, %i instances", time, variants) end diff --git a/tex/context/base/mkiv/meta-fnt.mkiv b/tex/context/base/mkiv/meta-fnt.mkiv index e54c0be0a..c248f752b 100644 --- a/tex/context/base/mkiv/meta-fnt.mkiv +++ b/tex/context/base/mkiv/meta-fnt.mkiv @@ -13,7 +13,7 @@ \writestatus{loading}{MetaPost Graphics / Fonts} -\registerctxluafile{meta-fnt}{1.001} +\registerctxluafile{meta-fnt}{} \unprotect diff --git a/tex/context/base/mkiv/meta-fun.lua b/tex/context/base/mkiv/meta-fun.lua index 7aaaf2818..ddbbd9a52 100644 --- a/tex/context/base/mkiv/meta-fun.lua +++ b/tex/context/base/mkiv/meta-fun.lua @@ -10,7 +10,8 @@ if not modules then modules = { } end modules ['meta-fun'] = { local format, load, type = string.format, load, type -local metapost = metapost +local context = context +local metapost = metapost metapost.metafun = metapost.metafun or { } local metafun = metapost.metafun diff --git a/tex/context/base/mkiv/meta-fun.mkiv b/tex/context/base/mkiv/meta-fun.mkiv index c3a4ce8d4..e30660392 100644 --- a/tex/context/base/mkiv/meta-fun.mkiv +++ b/tex/context/base/mkiv/meta-fun.mkiv @@ -13,7 +13,7 @@ \writestatus{loading}{MetaPost Graphics / Goodies} -\registerctxluafile{meta-fun}{1.001} +\registerctxluafile{meta-fun}{} \unprotect diff --git a/tex/context/base/mkiv/meta-grd.mkiv b/tex/context/base/mkiv/meta-grd.mkiv index da410ba68..8b1a934d6 100644 --- a/tex/context/base/mkiv/meta-grd.mkiv +++ b/tex/context/base/mkiv/meta-grd.mkiv @@ -84,9 +84,9 @@ \def\typo_grid_base[#1]% {\hbox\bgroup \getdummyparameters - [\c!nx=10,\c!ny=10,\c!dx=.5,\c!dy=.5,\c!xstep=0,\c!ystep=0, - \c!unit=\s!cm,\c!scale=1,\c!factor=1, - \c!offset=.25ex,\c!xoffset=\directdummyparameter\c!offset,\c!yoffset=\directdummyparameter\c!offset, + [\c!nx=10,\c!ny=10,\c!dx=.5,\c!dy=.5,\c!xstep=0,\c!ystep=0,% + \c!unit=\s!cm,\c!scale=1,\c!factor=1,% + \c!offset=.25ex,\c!xoffset=\directdummyparameter\c!offset,\c!yoffset=\directdummyparameter\c!offset,% \c!align=, #1]% \usedummystyleandcolor\c!style\c!color diff --git a/tex/context/base/mkiv/meta-imp-mat.mkiv b/tex/context/base/mkiv/meta-imp-mat.mkiv index 8913845fd..11a9ded34 100644 --- a/tex/context/base/mkiv/meta-imp-mat.mkiv +++ b/tex/context/base/mkiv/meta-imp-mat.mkiv @@ -18,6 +18,7 @@ % / for cambria \startMPextensions + vardef math_stacker_overbracket_shape = image ( draw @@ -78,72 +79,107 @@ vardef math_stacker_underbar_shape = math_stacker_overbar_shape rotated 180 enddef ; - vardef math_stacker_arrow_shape = + + % arrows + + vardef math_stacker_arrow_shape(expr axis, ex, em) = image ( + interim ahlength := ex/2; drawarrow - (OverlayWidth,OverlayOffset) -- (0,OverlayOffset) + ((OverlayWidth,ex/2) -- (0,ex/2)) + withcolor + OverlayLineColor ; + setbounds currentpicture to unitsquare xysized(OverlayWidth,ex) ; + ) + enddef ; + vardef math_stacker_leftrightarrow_shape(expr axis, ex, em) = + image ( + interim ahlength := ex/2; + drawdblarrow + ((OverlayWidth,ex/2) -- (0,ex/2)) withcolor OverlayLineColor ; - setbounds currentpicture to boundingbox currentpicture bottomenlarged (OverlayOffset/2) topenlarged (OverlayOffset/2) ; + setbounds currentpicture to unitsquare xysized(OverlayWidth,ex) ; ) enddef ; - vardef math_stacker_leftarrow_shape = - math_stacker_arrow_shape + vardef math_stacker_rightoverleftarrow_shape(expr axis, ex, em) = + image ( + interim ahlength := ex/2; + drawdoublearrows + ((OverlayWidth,ex/2) -- (0,ex/2)) + withcolor + OverlayLineColor ; + setbounds currentpicture to unitsquare xysized(OverlayWidth,ex) ; + ) enddef ; - vardef math_stacker_rightarrow_shape = - math_stacker_arrow_shape rotated 180 + vardef math_stacker_leftarrow_shape(expr axis, ex, em) = + math_stacker_arrow_shape(axis,ex,em) enddef ; - def math_stacker_draw(expr p) = - draw - p - withpen - pencircle - xscaled (2OverlayLineWidth) - % yscaled (3OverlayLineWidth/4) - yscaled (3OverlayLineWidth) - % rotated 30 ; - rotated 45 ; + vardef math_stacker_rightarrow_shape(expr axis, ex, em) = + math_stacker_arrow_shape(axis,ex,em) rotated 180 + enddef ; + + % main handler + + def math_stacker_draw_accent(expr p) = + draw p withpen pencircle scaled OverlayLineWidth xyscaled (2,3) rotated 45 ; + enddef ; + + def math_stacker_draw_arrow(expr p) = + draw p withpen pencircle scaled OverlayLineWidth ; enddef ; \stopMPextensions -\startuniqueMPgraphic{math:stacker:\number"FE3B4} - math_stacker_draw(math_stacker_overbracket_shape) ; +\startuniqueMPgraphic{math:stacker:\number"FE3B4}{axis,ex,em} + math_stacker_draw_accent(math_stacker_overbracket_shape) ; +\stopuniqueMPgraphic + +\startuniqueMPgraphic{math:stacker:\number"FE3B5}{axis,ex,em} + math_stacker_draw_accent(math_stacker_underbracket_shape) ; +\stopuniqueMPgraphic + +\startuniqueMPgraphic{math:stacker:\number"FE3DC}{axis,ex,em} + math_stacker_draw_accent(math_stacker_overparent_shape) ; +\stopuniqueMPgraphic + +\startuniqueMPgraphic{math:stacker:\number"FE3DD}{axis,ex,em} + math_stacker_draw_accent(math_stacker_underparent_shape) ; \stopuniqueMPgraphic -\startuniqueMPgraphic{math:stacker:\number"FE3B5} - math_stacker_draw(math_stacker_underbracket_shape) ; +\startuniqueMPgraphic{math:stacker:\number"FE3DE}{axis,ex,em} + math_stacker_draw_accent(math_stacker_overbrace_shape) ; \stopuniqueMPgraphic -\startuniqueMPgraphic{math:stacker:\number"FE3DC} - math_stacker_draw(math_stacker_overparent_shape) ; +\startuniqueMPgraphic{math:stacker:\number"FE3DF}{axis,ex,em} + math_stacker_draw_accent(math_stacker_underbrace_shape) ; \stopuniqueMPgraphic -\startuniqueMPgraphic{math:stacker:\number"FE3DD} - math_stacker_draw(math_stacker_underparent_shape) ; +\startuniqueMPgraphic{math:stacker:\number"FE33E}{axis,ex,em} + math_stacker_draw_accent(math_stacker_overbar_shape) ; \stopuniqueMPgraphic -\startuniqueMPgraphic{math:stacker:\number"FE3DE} - math_stacker_draw(math_stacker_overbrace_shape) ; +\startuniqueMPgraphic{math:stacker:\number"FE33F}{axis,ex,em} + math_stacker_draw_accent(math_stacker_underbar_shape) ; \stopuniqueMPgraphic -\startuniqueMPgraphic{math:stacker:\number"FE3DF} - math_stacker_draw(math_stacker_underbrace_shape) ; +\startuniqueMPgraphic{math:stacker:\number"2190}{axis,ex,em} + math_stacker_draw_arrow(math_stacker_leftarrow_shape(\MPvar{axis},\MPvar{ex},\MPvar{em})) ; \stopuniqueMPgraphic -\startuniqueMPgraphic{math:stacker:\number"FE33E} - math_stacker_draw(math_stacker_overbar_shape) ; +\startuniqueMPgraphic{math:stacker:\number"2192}{axis,ex,em} + math_stacker_draw_arrow(math_stacker_rightarrow_shape(\MPvar{axis},\MPvar{ex},\MPvar{em})) ; \stopuniqueMPgraphic -\startuniqueMPgraphic{math:stacker:\number"FE33F} - math_stacker_draw(math_stacker_underbar_shape) ; +\startuniqueMPgraphic{math:stacker:\number"2194}{axis,ex,em} + math_stacker_draw_arrow(math_stacker_leftrightarrow_shape(\MPvar{axis},\MPvar{ex},\MPvar{em})) ; \stopuniqueMPgraphic -\startuniqueMPgraphic{math:stacker:\number"2190} - math_stacker_draw(math_stacker_leftarrow_shape) ; +\startuniqueMPgraphic{math:stacker:\number"27F7}{axis,ex,em} + math_stacker_draw_arrow(math_stacker_leftrightarrow_shape(\MPvar{axis},\MPvar{ex},\MPvar{em})) ; \stopuniqueMPgraphic -\startuniqueMPgraphic{math:stacker:\number"2192} - math_stacker_draw(math_stacker_rightarrow_shape) ; +\startuniqueMPgraphic{math:stacker:\number"21C4}{axis,ex,em} + math_stacker_draw_arrow(math_stacker_rightoverleftarrow_shape(\MPvar{axis},\MPvar{ex},\MPvar{em})) ; \stopuniqueMPgraphic %D Radicals: @@ -158,7 +194,7 @@ enddef ; \stopMPextensions -\startuniqueMPgraphic{math:radical:default}%{...} +\startuniqueMPgraphic{math:radical:default}{axis,ex,em} draw math_radical_simple(OverlayWidth,OverlayHeight,OverlayDepth,OverlayOffset) withpen pencircle xscaled (2OverlayLineWidth) yscaled (3OverlayLineWidth/4) rotated 30 diff --git a/tex/context/base/mkiv/meta-imp-nodes.mkiv b/tex/context/base/mkiv/meta-imp-nodes.mkiv deleted file mode 100644 index 2555fcaa2..000000000 --- a/tex/context/base/mkiv/meta-imp-nodes.mkiv +++ /dev/null @@ -1,34 +0,0 @@ -%D \module -%D [ file=meta-imp-nodes, -%D version=2016.11.23, -%D title=\METAPOST\ Graphics, -%D subtitle=Nodes, -%D author=Alan Braslau and Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] -%C -%C This module is part of the \CONTEXT\ macro||package and is -%C therefore copyrighted by \PRAGMA. See mreadme.pdf for -%C details. - -%D We might add more here. Also, the node module might get preloaded in -%D all instances. - -\unprotect - -\defineMPinstance - [nodes] - [\s!format=metafun, - \s!extensions=\v!yes, - \s!initializations=\v!yes, - \c!method=\s!double] - -\defineframed - [node] - [\c!frame=\v!off] - -\startMPdefinitions{nodes} - loadmodule "node" ; -\stopMPdefinitions - -\protect diff --git a/tex/context/base/mkiv/meta-imp-txt.mkiv b/tex/context/base/mkiv/meta-imp-txt.mkiv index b2a6d6d1d..56da9229d 100644 --- a/tex/context/base/mkiv/meta-imp-txt.mkiv +++ b/tex/context/base/mkiv/meta-imp-txt.mkiv @@ -11,15 +11,12 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -%D In this library some handy text manipulations are -%D defined. Some can and will be improved as soon as the -%D \TEX||\METAPOST\ interface is stable. Some of the -%D solutions may look weird, which is entirely my fault, -%D since I implemented them in the process of getting grip -%D on this kind of manipulations. Undoubtly better -%D \METAPOST\ code is possible, but my way of learning -%D this kind of trickery happens to be by \quote {trial -%D and error} and \quote {look and feel} (as well as +%D In this library some handy text manipulations are defined. Some can and will be +%D improved as soon as the \TEX||\METAPOST\ interface is stable. Some of the +%D solutions may look weird, which is entirely my fault, since I implemented them in +%D the process of getting grip on this kind of manipulations. Undoubtly better +%D \METAPOST\ code is possible, but my way of learning this kind of trickery happens +%D to be by \quote {trial and error} and \quote {look and feel} (as well as %D identifying tricks in Hobby's code). % textext ipv btex ... etex @@ -30,112 +27,102 @@ \definesystemvariable {sh} % ShapedText .. todo: commandhandler +\unexpanded\def\setupshapetexts + {\dodoubleempty\getparameters[\??sh]} + +\setupshapetexts + [\c!bodyfont=] + \startMPextensions loadmodule "text" ; \stopMPextensions -%%%%%%% - -% \def\newchar#1{\chardef#1=0 } - -\ifdefined\MPtoks \else \newtoks\MPtoks \fi -\ifdefined\MPbox \else \newbox \MPbox \fi - -\ifdefined\parwidth \else \newdimen\parwidth \fi -\ifdefined\parheight \else \newdimen\parheight \fi -\ifdefined\parvoffset \else \newdimen\parvoffset \fi -\ifdefined\parhoffset \else \newdimen\parhoffset \fi -\ifdefined\parlines \else \newcount\parlines \fi -\ifdefined\partoks \else \newtoks \partoks \fi -\ifdefined\shapetextbox \else \newbox \shapetextbox \fi - \newif \ifparseries -\ifdefined\parfirst \else \chardef \parfirst=0 \fi +\ifdefined\parwidth \else + \newdimen\parwidth + \newdimen\parheight + \newdimen\parvoffset + \newdimen\parhoffset + \newcount\parlines + \newtoks \partoks + \newbox \shapetextbox + \newcount\parfirst +\fi \unexpanded\def\startshapetext[#1]% {\global\newcounter\currentshapetext \global\setbox\shapetextbox\vbox\bgroup - \expanded{\switchtobodyfont[\@@shbodyfont]}% + \switchtobodyfont[\@@shbodyfont]% \dontcomplain \hsize\parwidth \setuptolerance[\v!verytolerant,\v!stretch]% - \!!counta\zerocount - \!!toksa\emptytoks + \scratchcounter\zerocount + \scratchtoks\emptytoks \def\docommand##1% {\setbox\scratchbox\hbox{\useMPgraphic{##1}}% - \global\chardef\parfirst\zerocount - \getMPdata % \readlocfile{\MPdatafile}{}{}% + \global\parfirst\zerocount + \getMPdata \setshapecharacteristics - \advance\!!counta by \parlines - \expandafter\appendtoks\the\partoks\to\!!toksa}% + \advance\scratchcounter by \parlines + \expandafter\appendtoks\the\partoks\to\scratchtoks}% \processcommalist[#1]\docommand - \global\parseriestrue - \xdef\totalparlines{\the\!!counta}% - \global\partoks\!!toksa - %\ifx\partoks\emptytoks\else % safeguard - \expanded{\parshape \the\!!counta \the\!!toksa}% - %\fi + \xdef\totalparlines{\the\scratchcounter}% + \global\partoks\scratchtoks + \parshape \the\scratchcounter \the\scratchtoks\relax \setshapecharacteristics % extra dummy - \ifparseries\def\par{\endgraf\adaptparshape}\fi - \EveryPar{\begstrut}} + \def\par{\endgraf\adaptparshape}% + \everypar{\begstrut}} \unexpanded\def\stopshapetext {\endstrut - %\removebottomthings \egroup \global\newcounter\currentshapetext \getshapecharacteristics} \unexpanded\def\adaptparshape {\def\docommand##1% - {\ifcase\!!counta - \expandafter\appendtoks\space##1 \to\!!toksa + {\ifcase\scratchcounter + \expandafter\appendtoks\space##1 \to\scratchtoks \else - \advance\!!counta \minusone + \advance\scratchcounter\minusone \fi}% - \!!counta\prevgraf - \doglobal\decrement(\totalparlines,\!!counta)% - \multiply\!!counta \plustwo - \!!toksa\emptytoks + \scratchcounter\prevgraf + \doglobal\decrement(\totalparlines,\scratchcounter)% + \multiply\scratchcounter\plustwo + \scratchtoks\emptytoks \expanded{\processseparatedlist[\the\partoks][\space]}\docommand - \global\partoks\!!toksa - %\ifx\partoks\emptytoks\else % safeguard - \expanded{\parshape\totalparlines\the\partoks}% - }%\fi} + \global\partoks\scratchtoks + \parshape\totalparlines\the\partoks\relax} \unexpanded\def\getshapecharacteristics {\doglobal\increment\currentshapetext \doifelsedefined{parlines:\currentshapetext} - {\global\parlines \getvalue{parlines:\currentshapetext}% - \global\chardef\parfirst \getvalue{parfirst:\currentshapetext}% - \global\parvoffset \getvalue{parvoffset:\currentshapetext}% - \global\parhoffset \getvalue{parhoffset:\currentshapetext}% - \global\parwidth \getvalue{parwidth:\currentshapetext}% - \global\parheight \getvalue{parheight:\currentshapetext}} - {\global\parlines \plusone - \global\chardef\parfirst \zerocount - \global\parvoffset \zeropoint - \global\parhoffset \zeropoint - \global\parwidth \hsize - \global\parheight \vsize}} + {\getvalue{parlines:\currentshapetext}} + {\global\parlines \plusone + \global\parfirst \zerocount + \global\parvoffset\zeropoint + \global\parhoffset\zeropoint + \global\parwidth \hsize + \global\parheight \vsize}} \unexpanded\def\setshapecharacteristics {\doglobal\increment\currentshapetext - \setxvalue{parlines:\currentshapetext }{\the\parlines}% - \setxvalue{parfirst:\currentshapetext }{\the\parfirst}% - \setxvalue{parvoffset:\currentshapetext}{\the\parvoffset}% - \setxvalue{parhoffset:\currentshapetext}{\the\parhoffset}% - \setxvalue{parwidth:\currentshapetext }{\the\parwidth}% - \setxvalue{parheight:\currentshapetext }{\the\parheight}} + \setxvalue{parlines:\currentshapetext}% + {\global\parlines \the\parlines + \global\parfirst \the\parfirst + \global\parvoffset\the\parvoffset + \global\parhoffset\the\parhoffset + \global\parwidth \the\parwidth + \global\parheight \the\parheight}} \unexpanded\def\getshapetext % option: unvbox {\vbox\bgroup \forgetall \dontcomplain \setbox\scratchbox\vbox to \parheight - {\expanded{\switchtobodyfont[\@@shbodyfont]}% evt strutheight en - \splittopskip\strutheight % lineheight opslaan - \vskip\parvoffset % scheelt switch en - \ifcase\parfirst\or\vskip\lineheight\fi % is ook veiliger + {\switchtobodyfont[\@@shbodyfont]% + \splittopskip\strutheight + \vskip\parvoffset + \ifcase\parfirst\else\vskip\lineheight\fi \hskip\parhoffset \hbox{\vsplit\shapetextbox to \parlines\lineheight}}% \wd\scratchbox\parwidth @@ -145,89 +132,8 @@ \getshapecharacteristics \egroup} -\unexpanded\def\setupshapetexts - {\dodoubleempty\getparameters[\??sh]} - -\setupshapetexts - [\c!bodyfont=] - \doifundefined{RotFont}{\definefont[RotFont][RegularBold*default]} -% \startuseMPgraphic{followtokens} -% % we default to nothing -% \stopuseMPgraphic - -% \unexpanded\def\processfollowingtoken#1% strut toegevoegd -% {\appendtoks#1\to\MPtoks -% \setbox\MPbox=\hbox{\RotFont\setstrut\strut\the\MPtoks}% -% \startMPdrawing -% n := n + 1 ; len[n] := \the\wd\MPbox ; -% \stopMPdrawing -% \startMPdrawing[-] -% % pic[n] := textext{\RotFont\setstrut\strut#1} ; % btex \RotFont\setstrut\strut#1 etex ; -% pic[n] := btex \RotFont\setstrut\strut#1 etex ; -% pic[n] := pic[n] shifted - llcorner pic[n] ; -% \stopMPdrawing} -% -% \unexpanded\def\dofollowtokens#1#2% -% {\vbox\bgroup -% \forgetall -% \dontcomplain -% \doifundefined{RotFont}{\definefont[RotFont][RegularBold*default]}% -% \MPtoks\emptytoks -% \resetMPdrawing -% \startMPdrawing -% \includeMPgraphic{followtokens} ; -% picture pic[] ; numeric len[], n ; n := 0 ; -% \stopMPdrawing -% \handletokens#2\with\processfollowingtoken -% \startMPdrawing -% if unknown RotPath : path RotPath ; RotPath := origin ; fi ; -% if unknown RotColor : color RotColor ; RotColor := black ; fi ; -% if unknown TraceRot : boolean TraceRot ; TraceRot := false ; fi ; -% if unknown ExtraRot : numeric ExtraRot ; ExtraRot := 0 ; fi ; -% numeric al, at, pl, pc, wid, pos ; pair ap, ad ; -% al := arclength RotPath ; -% if al=0 : -% al := len[n] + ExtraRot ; -% RotPath := origin -- (al,0) ; -% fi ; -% if al<len[n]: -% RotPath := RotPath scaled ((len[n]+ExtraRot)/al) ; -% al := arclength RotPath ; -% fi ; -% if \number#1 = 1 : -% pl := (al-len[n])/(if n>1 : (n-1) else : 1 fi) ; -% pc := 0 ; -% else : % centered / MP -% pl := 0 ; -% pc := arclength RotPath/2 - len[n]/2 ; -% fi ; -% if TraceRot : -% draw RotPath withpen pencircle scaled 1pt withcolor blue ; -% fi ; -% for i=1 upto n : -% wid := abs(xpart urcorner pic[i] - xpart llcorner pic[i]) ; -% pos := len[i]-wid/2 + (i-1)*pl + pc ; -% at := arctime pos of RotPath ; -% ap := point at of RotPath ; -% ad := direction at of RotPath ; -% draw pic[i] shifted (-wid/2,0) rotated(angle(ad)) shifted ap -% withcolor RotColor ; -% if TraceRot : -% draw boundingbox -% pic[i] shifted (-wid/2,0) rotated(angle(ad)) shifted ap -% withpen pencircle scaled .25pt withcolor red ; -% draw ap -% withpen pencircle scaled .50pt withcolor green ; -% fi ; -% endfor ; -% \stopMPdrawing -% \MPdrawingdonetrue -% \getMPdrawing -% \resetMPdrawing -% \egroup} - \unexpanded\def\getfollowtoken#1% {\hbox\bgroup \strut @@ -479,8 +385,7 @@ \setlocalhsize \noindent \reuseMPgraphic{EnglishRule} \stoplinecorrection} -%D The following macro returns a tight bound character -%D sequence. +%D The following macro returns a tight bound character sequence. %D %D \useMPlibrary[txt] %D diff --git a/tex/context/base/mkiv/meta-ini.lua b/tex/context/base/mkiv/meta-ini.lua index d3865c433..6c4768671 100644 --- a/tex/context/base/mkiv/meta-ini.lua +++ b/tex/context/base/mkiv/meta-ini.lua @@ -8,138 +8,144 @@ if not modules then modules = { } end modules ['meta-ini'] = { local tonumber = tonumber local format = string.format +local concat = table.concat local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns local P, Cs, R, S, C, Cc = lpeg.P, lpeg.Cs, lpeg.R, lpeg.S, lpeg.C, lpeg.Cc -local context = context - -metapost = metapost or { } - --- experimental +metapost = metapost or { } +local metapost = metapost +local context = context local colorhash = attributes.list[attributes.private('color')] - local textype = tex.type local MPcolor = context.MPcolor --- local validdimen = lpegpatterns.validdimen * P(-1) --- --- function commands.prepareMPvariable(v) -- slow but ok --- if v == "" then --- MPcolor("black") --- else --- local typ, var = match(v,"(.):(.*)") --- if not typ then --- -- parse --- if colorhash[v] then --- MPcolor(v) --- elseif tonumber(v) then --- context(v) --- elseif lpegmatch(validdimen,v) then --- return context("\\the\\dimexpr %s",v) --- else --- for s in gmatch(v,"\\([a-zA-Z]+)") do -- can have trailing space --- local t = textype(s) --- if t == "dimen" then --- return context("\\the\\dimexpr %s",v) --- elseif t == "count" then --- return context("\\the\\numexpr %s",v) --- end --- end --- context("\\number %s",v) -- 0.4 ... --- end --- elseif typ == "d" then -- to be documented --- -- dimension --- context("\\the\\dimexpr %s",var) --- elseif typ == "n" then -- to be documented --- -- number --- context("\\the\\numexpr %s",var) --- elseif typ == "s" then -- to be documented --- -- string --- context(var) --- elseif typ == "c" then -- to be documented --- -- color --- MPcolor(var) --- else --- context(var) --- end --- end --- end - --- we can actually get the dimen/count values here - -local dimenorname = - lpegpatterns.validdimen / function(s) - context("\\the\\dimexpr %s",s) - end - + (C(lpegpatterns.float) + Cc(1)) * lpegpatterns.space^0 * P("\\") * C(lpegpatterns.letter^1) / function(f,s) - local t = textype(s) - if t == "dimen" then - context("\\the\\dimexpr %s\\%s\\relax",f,s) - elseif t == "count" then - context("\\the\\numexpr \\%s * %s\\relax",s,f) -- <n>\scratchcounter is not permitted +do + + local dimenorname = + lpegpatterns.validdimen / function(s) + context("\\the\\dimexpr %s",s) + end + + (C(lpegpatterns.float) + Cc(1)) * lpegpatterns.space^0 * P("\\") * C(lpegpatterns.letter^1) / function(f,s) + local t = textype(s) + if t == "dimen" then + context("\\the\\dimexpr %s\\%s\\relax",f,s) + elseif t == "count" then + context("\\the\\numexpr \\%s * %s\\relax",s,f) -- <n>\scratchcounter is not permitted + end end - end -local splitter = lpeg.splitat("::",true) - -interfaces.implement { - name = "prepareMPvariable", - arguments = "string", - actions = function(v) - if v == "" then - -- MPcolor("black") - context("black") - else - local typ, var = lpegmatch(splitter,v) - if not var then - -- parse - if colorhash[v] then - -- MPcolor(v) + local splitter = lpeg.splitat("::",true) + + interfaces.implement { + name = "prepareMPvariable", + arguments = "string", + actions = function(v) + if v == "" then + -- MPcolor("black") + context("black") + else + local typ, var = lpegmatch(splitter,v) + if not var then + -- parse + if colorhash[v] then + -- MPcolor(v) + context("%q",var) + elseif tonumber(v) then + context(v) + elseif not lpegmatch(dimenorname,v) then + context("\\number %s",v) -- 0.4 ... + end + elseif typ == "d" then -- to be documented + -- dimension + context("\\the\\dimexpr %s\\relax",var) + elseif typ == "n" then -- to be documented + -- number + context("\\the\\numexpr %s\\relax",var) + elseif typ == "s" then -- to be documented + -- string + -- context(var) context("%q",var) - elseif tonumber(v) then - context(v) - elseif not lpegmatch(dimenorname,v) then - context("\\number %s",v) -- 0.4 ... + elseif typ == "c" then -- to be documented + -- color + -- MPcolor(var) + context("%q",var) + else + context(var) end - elseif typ == "d" then -- to be documented - -- dimension - context("\\the\\dimexpr %s\\relax",var) - elseif typ == "n" then -- to be documented - -- number - context("\\the\\numexpr %s\\relax",var) - elseif typ == "s" then -- to be documented - -- string - -- context(var) - context("%q",var) - elseif typ == "c" then -- to be documented - -- color - -- MPcolor(var) - context("%q",var) - else - context(var) end end + } + +end + +do + + local ctx_mathematics = context.mathematics + + -- function metapost.formatnumber(f,n) -- just lua format + -- f = gsub(f,"@(%d)","%%.%1") + -- f = gsub(f,"@","%%") + -- f = format(f,tonumber(n) or 0) + -- f = gsub(f,"e([%+%-%d]+)",function(s) + -- return format("\\times10^{%s}",tonumber(s) or s) -- strips leading zeros + -- end) + -- context.mathematics(f) + -- end + + -- formatters["\\times10^{%N}"](s) -- strips leading zeros too + + local one = Cs((P("@")/"%%." * (R("09")^1) + P("@")/"%%" + 1)^0) + local two = Cs((P("e")/"" * ((S("+-")^0 * R("09")^1) / function(s) + -- return format("\\times10^{%s}",tonumber(s) or s) + return "\\times10^{" .. (tonumber(s) or s) .."}" + end) + 1)^1) + + -- local two = Cs((P("e")/"" * ((S("+-")^0 * R("09")^1) / formatters["\\times10^{%N}"]) + 1)^1) + + function metapost.formatnumber(fmt,n) -- just lua format + ctx_mathematics(lpegmatch(two,format(lpegmatch(one,fmt),n))) end -} --- function metapost.formatnumber(f,n) -- just lua format --- f = gsub(f,"@(%d)","%%.%1") --- f = gsub(f,"@","%%") --- f = format(f,tonumber(n) or 0) --- f = gsub(f,"e([%+%-%d]+)",function(s) --- return format("\\times10^{%s}",tonumber(s) or s) -- strips leading zeros --- end) --- context.mathematics(f) --- end +end + +do --- formatters["\\times10^{%N}"](s) -- strips leading zeros too + -- this is an old pass-data-to-tex mechanism -local one = Cs((P("@")/"%%." * (R("09")^1) + P("@")/"%%" + 1)^0) -local two = Cs((P("e")/"" * ((S("+-")^0 * R("09")^1) / function(s) return format("\\times10^{%s}",tonumber(s) or s) end) + 1)^1) + local ctx_printtable = context.printtable --- local two = Cs((P("e")/"" * ((S("+-")^0 * R("09")^1) / formatters["\\times10^{%N}"]) + 1)^1) + local data = false + + function mp.start_saving_data(n) + data = { } + end + + function mp.stop_saving_data() + if data then + -- nothing + end + end + + function mp.finish_saving_data() + if data then + -- nothing + end + end + + function mp.save_data(str) + if data then + data[#data+1] = str + end + end + + interfaces.implement { + name = "getMPdata", + actions = function() + if data then + ctx_printtable(data,"\r") + end + end + } -function metapost.formatnumber(fmt,n) -- just lua format - context.mathematics(lpegmatch(two,format(lpegmatch(one,fmt),n))) end diff --git a/tex/context/base/mkiv/meta-ini.mkiv b/tex/context/base/mkiv/meta-ini.mkiv index 1d0fa11e0..5fc89e2f6 100644 --- a/tex/context/base/mkiv/meta-ini.mkiv +++ b/tex/context/base/mkiv/meta-ini.mkiv @@ -58,7 +58,7 @@ \writestatus{loading}{MetaPost Graphics / Initializations} -\registerctxluafile{meta-ini}{1.001} +\registerctxluafile{meta-ini}{} \unprotect @@ -84,9 +84,9 @@ \def \t_meta_inclusions {\csname\??mpinclusions \currentMPinstance\endcsname} % token register \def \t_meta_definitions {\csname\??mpdefinitions\currentMPinstance\endcsname} % token register -% The next command is, of course, dedicated to Mojca, who -% needs it for gnuplot. Anyway, the whole multiple engine -% mechanism is to keep her gnuplot from interfering. +%D The next command is, of course, dedicated to Mojca, who needs it for gnuplot. +%D Anyway, the whole multiple engine mechanism is to keep her gnuplot from +%D interfering. \unexpanded\def\startMPdefinitions {\dosinglegroupempty\meta_start_definitions} @@ -155,13 +155,6 @@ \global\t_meta_inclusions\expandafter{\the\t_meta_inclusions#2}% \let\currentMPinstance\m_meta_saved_instance} -% \def\meta_preset_definitions -% {\edef\overlaywidth {\overlaywidth \space}% -% \edef\overlayheight {\overlayheight \space}% -% \edef\overlaylinewidth{\overlaylinewidth\space}} - -\let\meta_preset_definitions\relax - \installcommandhandler \??mpinstance {MPinstance} \??mpinstance \setupMPinstance @@ -261,8 +254,6 @@ {\begingroup \meta_enable_include \the\everyMPgraphic - \meta_preset_definitions - %\setMPrandomseed % this has to change \edef\p_initializations{\MPinstanceparameter\s!initializations}% \ifx\p_initializations\v!yes \settrue \c_meta_include_initializations @@ -335,17 +326,6 @@ \meta_process_graphic{input "#1" ;}% \endgroup} -% \newif\ifsetMPrandomseed \setMPrandomseedtrue % false by default -% -% \let\theMPrandomseed\empty -% -% \def\setMPrandomseed -% {\ifsetMPrandomseed -% \def\theMPrandomseed{randomseed:=\mprandomnumber;}% -% \else -% \let\theMPrandomseed\empty -% \fi} - %D Calling up previously defined graphics. % \def\includeMPgraphic#1% gets expanded ! @@ -365,12 +345,11 @@ % % \useMPgraphic{x} % -% so we cannot overload unless we let back to the original meanings -% each graphic ... a better solution is: +% so we cannot overload unless we let back to the original meanings each graphic +% ... a better solution is: \def\includeMPgraphic#1% gets expanded ! {\ifcsname\??mpgraphic#1\endcsname - %\doubleexpandafter\fourthoffourarguments\csname\??mpgraphic#1\endcsname ; % ; is safeguard \doubleexpandafter\fourthoffourarguments\lastnamedcs ; % ; is safeguard \fi} @@ -408,7 +387,6 @@ {\relax \bgroup \meta_enable_include - \meta_preset_definitions % in case #2 has measures \doifelse{#1}{-}{\convertargument#2\to\asciia}{\def\asciia{#2}}% \xdef\MPdrawingdata{\MPdrawingdata\asciia}% \egroup} @@ -419,7 +397,6 @@ {\relax \bgroup \meta_enable_include - \meta_preset_definitions \xdef\MPdrawingdata{\MPdrawingdata#1}% \egroup} @@ -458,8 +435,8 @@ \relax}% \meta_stop_current_graphic} -%D Since we want lables to follow the document settings, we -%D also set the font related variables. +%D Since we want lables to follow the document settings, we also set the font +%D related variables. \unexpanded\def\MPfontsizehskip#1% {\dontleavehmode @@ -476,12 +453,6 @@ % defaultscale:=1; \stopMPinitializations -% watch out, this is a type1 font because mp can only handle 8 bit fonts - -% \startMPinitializations % scale is not yet ok -% defaultfont:="rm-lmtt10"; -% \stopMPinitializations - %D A signal that we're in combined \CONTEXT||\METAFUN mode: \startMPextensions @@ -496,12 +467,11 @@ %D \macros %D {setupMPvariables} %D -%D When we build collections of \METAPOST\ graphics, like -%D background and buttons, the need for passing settings -%D arises. By (mis|)|using the local prefix that belongs to -%D \type {\framed}, we get a rather natural interface to -%D backgrounds. To prevent conflicts, we will use the \type -%D {-} in \METAPOST\ specific variables, like: +%D When we build collections of \METAPOST\ graphics, like background and buttons, +%D the need for passing settings arises. By (mis|)|using the local prefix that +%D belongs to \type {\framed}, we get a rather natural interface to backgrounds. To +%D prevent conflicts, we will use the \type {-} in \METAPOST\ specific variables, +%D like: %D %D \starttyping %D \setupMPvariables[meta:button][size=20pt] @@ -510,9 +480,9 @@ % \lineheight 2pt 2 \scratchcounter red 0.4 .5\bodyfontsize % % see cont-loc for test code -% -% currently the inheritance of backgrounds does not work and -% we might drop it anyway (too messy) + +%D Currently the inheritance of backgrounds does not work and we might drop it +%D anyway (too messy) \newbox\b_meta_variable_box @@ -623,9 +593,9 @@ %D \macros %D {startuniqueMPgraphic, uniqueMPgraphic} %D -%D This macros is probably of most use to myself, since I like -%D to use graphics that adapt themselves. The next \METAPOST\ -%D kind of graphic is both unique and reused when possible. +%D This macros is probably of most use to myself, since I like to use graphics that +%D adapt themselves. The next \METAPOST\ kind of graphic is both unique and reused +%D when possible. %D %D \starttyping %D \defineoverlay[example][\uniqueMPgraphic{test}] @@ -644,19 +614,17 @@ \MPcolor\overlaycolor :% % todo, expand once \m_overlaycolor \MPcolor\overlaylinecolor} % todo, expand once \m_overlaylinecolor -%D A better approach is to let additional variables play a role -%D in determining the uniqueness. In the next macro, the -%D second, optional, argument is used to guarantee the -%D uniqueness, as well as prepare variables for passing them to +%D A better approach is to let additional variables play a role in determining the +%D uniqueness. In the next macro, the second, optional, argument is used to +%D guarantee the uniqueness, as well as prepare variables for passing them to %D \METAPOST. %D %D \starttyping %D \startuniqueMPgraphic{meta:hash}{gap,angle,...} %D \stoptyping %D -%D The calling macro also accepts a second argument. For -%D convenient use in overlay definitions, we use \type {{}} -%D instead of \type {[]}. +%D The calling macro also accepts a second argument. For convenient use in overlay +%D definitions, we use \type {{}} instead of \type {[]}. %D %D \starttyping %D \uniqueMPgraphic{meta:hash}{gap=10pt,angle=30} @@ -699,9 +667,6 @@ {\MPllx#2\MPlly#3\MPurx#4\MPury#5% \hpack{\forcecolorhack\getobject{MP}{#1}}} % else no proper color intent -% \unexpanded\def\meta_use_box -% {\setobject{MP}} - \unexpanded\def\meta_use_box {\setunreferencedobject{MP}} @@ -723,9 +688,6 @@ \unexpanded\def\startuniqueMPgraphic {\dodoublegroupempty\meta_start_unique_graphic} -% \def\meta_start_unique_graphic#1#2#3\stopuniqueMPgraphic -% {\setgvalue{\??mpgraphic#1}{\meta_handle_unique_graphic{#1}{#2}{#3}}} - \def\meta_start_unique_graphic#1% {\normalexpanded{\meta_start_unique_graphic_indeed{#1}}} @@ -888,12 +850,9 @@ %D {\edef\overlaystamp{\overlaystamp:\MPvariable{##1}}}% %D \processcommalist[#1]\docommand} %D \stoptyping - -%D Since we need to feed \METAPOST\ with expanded dimensions, -%D we introduce a dedicated expansion engine. - -%D We redefine \type {\extendMPoverlaystamp} to preprocess -%D variables using \type {\meta_prepare_variable}. +%D +%D Since we need to feed \METAPOST\ with expanded dimensions, we introduce a +%D dedicated expansion engine. We redefine \type {\extendMPoverlaystamp} to \unexpanded\def\extendMPoverlaystamp#1% {\processcommalist[#1]\meta_extend_overlay_stamp} @@ -909,40 +868,22 @@ % This will change ... -\def\MPdataMPDfile{\jobname-mpgraph.mpd} % this one will become obsolete -\def\MPdataMPOfile{\jobname-mpgraph.mpo} \def\MPdataMPYfile{\jobname-mpgraph.mpy} -% makempy.registerfile(filename) - -% % hm. extensions get expanded so the wrong names then end up in format -% -% \startMPinitializations -% boolean collapse_data; collapse_data:=true ; % will be obsolete -% def data_mpd_file = "\MPdataMPDfile" enddef ; % will go via lua -% def data_mpo_file = "\MPdataMPOfile" enddef ; -% def data_mpy_file = "\MPdataMPYfile" enddef ; -% \stopMPinitializations - \startMPextensions - boolean collapse_data; collapse_data:=true ; % will be obsolete - def data_mpd_file = "\noexpand\MPdataMPDfile" enddef ; % will go via lua - def data_mpo_file = "\noexpand\MPdataMPOfile" enddef ; def data_mpy_file = "\noexpand\MPdataMPYfile" enddef ; \stopMPextensions -\unexpanded\def\getMPdata - {\let\MPdata\secondoftwoarguments - \startreadingfile - % \startnointerference % no, else we need to do all data global - \readlocfile\MPdataMPDfile\donothing\donothing - % \stopnointerference - \stopreadingfile} +\unexpanded\def\getMPdata {\clf_getMPdata} + \let\rawMPdata \clf_getMPdata -% We need this trick because we need to make sure that the tex scanner -% sees newlines and does not quit. Also, we do need to flush the buffer -% under a normal catcode regime in order to expand embedded tex macros. -% As usual with buffers, \type {#1} can be a list. +\unexpanded\def\getMPstored{\clf_getMPstored} + \let\rawMPstored \clf_getMPstored + +%D We need this trick because we need to make sure that the tex scanner sees +%D newlines and does not quit. Also, we do need to flush the buffer under a normal +%D catcode regime in order to expand embedded tex macros. As usual with buffers, +%D \type {#1} can be a list. \unexpanded\def\processMPbuffer {\dosingleempty\meta_process_buffer} @@ -961,22 +902,8 @@ %D \macros %D {startMPenvironment, resetMPenvironment} %D -%D In order to synchronize the main \TEX\ run and the runs -%D local to \METAPOST, environments can be passed. - -% \unexpanded\def\startMPenvironment % second arg gobbles spaces, so that reset gives \emptytoks -% {\dodoubleempty\dostartMPenvironment} - -% \def\dostartMPenvironment[#1][#2]#3\stopMPenvironment -% {\edef\m_meta_option{#1} -% \ifx\m_meta_option\s!reset -% \resetMPenvironment % reset mp toks -% \else\ifx\m_meta_option\v!global -% #3% % use in main doc too -% \else\ifx\m_meta_option\!!plustoken -% #3% % use in main doc too -% \fi\fi\fi -% \ctxlua{metapost.tex.set(\!!bs\detokenize{#3}\!!es)}} +%D In order to synchronize the main \TEX\ run and the runs local to \METAPOST, +%D environments can be passed. \unexpanded\def\startMPenvironment {\begingroup @@ -1003,8 +930,7 @@ \unexpanded\def\useMPenvironmentbuffer[#1]% {\clf_mptexsetfrombuffer{#1}} -%D This command takes \type {[reset]} as optional -%D argument. +%D This command takes \type {[reset]} as optional argument. %D %D \starttyping %D \startMPenvironment @@ -1148,8 +1074,8 @@ \def\MPstring#1{"\begincsname\??mptext#1\endcsname\empty"} \def\MPbetex #1{btex \begincsname\??mptext#1\endcsname\space etex} -%D In order to communicate conveniently with the \TEX\ -%D engine, we introduce some typesetting variables. +%D In order to communicate conveniently with the \TEX\ engine, we introduce some +%D typesetting variables. % \setupcolors[state=stop,conversion=never] % quite tricky ... type mismatch @@ -1169,8 +1095,8 @@ % OverlayOffset:=\overlayoffset; % \stopMPinitializations -% A dirty trick, ** in colo-ini.lua (mpcolor). We cannot use a vardef, because -% that fails with spot colors. +%D A dirty trick, ** in colo-ini.lua (mpcolor). We cannot use a vardef, because +%D that fails with spot colors. \startMPinitializations def OverlayLineColor=\ifx\overlaylinecolor\empty black \else\MPcolor{\overlaylinecolor} \fi enddef; @@ -1241,21 +1167,11 @@ %D \macros %D {PDFMPformoffset} %D -%D In \PDF, forms are clipped and therefore we have to take -%D precautions to get this right. Since this is related to -%D objects, we use the same offset as used there. +%D In \PDF, forms are clipped and therefore we have to take precautions to get this +%D right. Since this is related to objects, we use the same offset as used there. \def\PDFMPformoffset{\objectoffset} -% %D \macros -% %D {insertMPfile} -% %D -% %D Bypassing the special driver and figure mechanism is not -% %D that nice but saves upto 5\% time in embedding \METAPOST\ -% %D graphics by using the low level \PDF\ converter directly, -% %D given of course that we use \PDFTEX. As a result we need to -% %D fool around with the object trigger. - \newtoks\everyinsertMPfile \startMPextensions @@ -1295,19 +1211,17 @@ % if unknown context_bare : input mp-bare.mpiv ; fi ; % \stopMPdefinitions -%D And some more. These are not really needed since we -%D don't use the normal figure inclusion macros any longer. +%D And some more. These are not really needed since we don't use the normal figure +%D inclusion macros any longer. \appendtoks \externalfigurepostprocessors\emptytoks % safeguard \to \everyinsertMPfile -%D We also take care of disabling fancy figure features, that -%D can terribly interfere when dealing with symbols, -%D background graphics and running (postponed) graphics. -%D You won't believe me if I tell you what funny side effects -%D can occur. One took me over a day to uncover when -%D processing the screen version of the \METAFUN\ manual. +%D We also take care of disabling fancy figure features, that can terribly interfere +%D when dealing with symbols, background graphics and running (postponed) graphics. +%D You won't believe me if I tell you what funny side effects can occur. One took me +%D over a day to uncover when processing the screen version of the \METAFUN\ manual. \def\doifelseMPgraphic#1% {\ifcsname\??mpgraphic #1\endcsname \expandafter \firstoftwoarguments \else @@ -1372,8 +1286,8 @@ %D \macros %D {startstaticMPfigure,useMPstaticfigure} %D -%D Static figures are processed only when there has been -%D something changed. Here is Aditya Mahajan's testcase: +%D Static figures are processed only when there has been something changed. Here is +%D Aditya Mahajan's testcase: %D %D \startbuffer %D \startstaticMPfigure{circle} @@ -1415,19 +1329,17 @@ \def\MPdivten[#1]{\withoutpt\the\dimexpr#1pt/10\relax} -%D There is no way to distinguish the black color that you get when -%D you issue a \type {draw} without color specification from a color -%D that has an explicit black specification unless you set the -%D variable \type {defaultcolormodel} to 1. Hoewever, in that case -%D you cannot distinguish that draw from one with a \type -%D {withoutcolor} specification. This means that we have to provide -%D multiple variants of inheritance. +%D There is no way to distinguish the black color that you get when you issue a +%D \type {draw} without color specification from a color that has an explicit black +%D specification unless you set the variable \type {defaultcolormodel} to 1. +%D Hoewever, in that case you cannot distinguish that draw from one with a \type +%D {withoutcolor} specification. This means that we have to provide multiple +%D variants of inheritance. %D -%D In any case we need to tell the converter what the inherited color -%D is to start with. Case~3 is kind of unpredictable as it closely -%D relates to the order in which paths are flushed. If you want to -%D inherit automatically from the surrounding, you can best stick to -%D variant 1. Variant 0 (an isolated graphic) is the default. +%D In any case we need to tell the converter what the inherited color is to start +%D with. Case~3 is kind of unpredictable as it closely relates to the order in which +%D paths are flushed. If you want to inherit automatically from the surrounding, you +%D can best stick to variant 1. Variant 0 (an isolated graphic) is the default. %D %D \startbuffer %D \startuseMPgraphic{test} @@ -1541,10 +1453,9 @@ \installsetuponlycommandhandler \??MPgraphics {MPgraphics} -%D Here we hook in the outer color. When \type {color} is set to \type -%D {global} we get the outer color automatically. If you change this -%D setting, you should do it grouped in order not to make other graphics -%D behave in unexpected ways. +%D Here we hook in the outer color. When \type {color} is set to \type {global} we +%D get the outer color automatically. If you change this setting, you should do it +%D grouped in order not to make other graphics behave in unexpected ways. \appendtoks \doifelse{\directMPgraphicsparameter\c!color}\v!global{\MPcolormethod\plusone}{\MPcolormethod\zerocount}% diff --git a/tex/context/base/mkiv/meta-lua.lua b/tex/context/base/mkiv/meta-lua.lua new file mode 100644 index 000000000..42d036630 --- /dev/null +++ b/tex/context/base/mkiv/meta-lua.lua @@ -0,0 +1,96 @@ +if not modules then modules = { } end modules ['meta-lua'] = { + version = 1.001, + comment = "companion to meta-lua.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files", +} + +-- Don't use this code yet. I use it in some experimental rendering of graphics +-- based on output from database queries. It's not that pretty but will be +-- considered when the (similar) lmx code is redone. Also, dropping the print +-- variant makes it nicer. This experiment is part of playing with several template +-- mechanisms. (Also see trac-lmx.) + +local P, V, Cs, lpegmatch = lpeg.P, lpeg.V, lpeg.Cs, lpeg.match +local formatters = string.formatters +local concat = table.concat +local load, pcall = load, pcall + +local errorformatter = formatters[ [[draw textext("\tttf error in template '%s'") ;]] ] +local concatformatter = formatters[ [[local _t = { } local _n = 0 local p = function(s) _n = _n + 1 _t[_n] = s end %s return table.concat(_t," ")]] ] +local appendformatter = formatters[ [[_n=_n+1 _t[_n]=%q]] ] + +local blua = P("blua ") / " " +local elua = P(" elua") / " " +local bluacode = P("<?lua ") / " " +local eluacode = P(" ?>") / " " + +local plua = (blua * (1 - elua)^1 * elua) +local pluacode = (bluacode * (1 - eluacode)^1 * eluacode) + +-- local methods = { +-- both = Cs { "start", +-- start = (V("bluacode") + V("blua") + V("rest"))^0, +-- blua = plua, +-- bluacode = pluacode, +-- rest = (1 - V("blua") - V("bluacode"))^1 / appendformatter, +-- }, +-- xml = Cs { "start", +-- start = (V("bluacode") + V("rest"))^0, +-- bluacode = pluacode, +-- rest = (1 - V("bluacode"))^1 / appendformatter, +-- }, +-- xml = Cs ((pluacode + (1 - pluacode)^1 / appendformatter)^0), +-- metapost = Cs { "start", +-- start = (V("blua") + V("rest"))^0, +-- blua = plua, +-- rest = (1 - V("blua"))^1 / appendformatter, +-- }, +-- } + +local methods = { + both = Cs ((pluacode + plua + (1 - plua - pluacode)^1 / appendformatter)^0), + xml = Cs ((pluacode + (1 - pluacode)^1 / appendformatter)^0), + metapost = Cs (( plua + (1 - plua )^1 / appendformatter)^0), +} + +methods.mp = methods.metapost + +-- Unfortunately mp adds a suffix ... also weird is that successive loading +-- of the same file gives issues. Maybe some weird buffering goes on (smells +-- similar to older write / read issues). + +mplib.finders.mpstemplate = function(specification,name,mode,ftype) + local authority = specification.authority + local queries = specification.queries + local nameonly = file.nameonly(queries.name or "") + local method = file.nameonly(queries.method or "") + local pattern = methods[method] or methods.both + local data = nil + if nameonly == "" then + data = errorformatter("no name") + elseif authority == "file" then + local foundname = resolvers.findfile(nameonly) + if foundname ~= "" then + data = io.loaddata(foundname) + end + elseif authority == "buffer" then + data = buffers.getcontent(nameonly) + end + data = data and lpegmatch(pattern,data) + data = data and concatformatter(data) + data = data and load(data) + if data then + local okay + okay, data = pcall(data) + end + if not data or data == "" then + data = errorformatter(nameonly) + end + local name = luatex.registertempfile(nameonly,true) + local data = metapost.checktexts(data) + io.savedata(name,data) + return name +end + diff --git a/tex/context/base/mkiv/meta-lua.mkiv b/tex/context/base/mkiv/meta-lua.mkiv new file mode 100644 index 000000000..e06677d5e --- /dev/null +++ b/tex/context/base/mkiv/meta-lua.mkiv @@ -0,0 +1,95 @@ +%D \module +%D [ file=meta-lua, +%D version=2012.07.23, +%D title=\METAPOST\ Integrated Graphics, +%D subtitle=Templates, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +%D Don't use this code yet. I use it in some experimental rendering of graphics +%D based on output from database queries. It's not that pretty but will be +%D considered when the (similar) lmx code is redone. Also, dropping the print +%D variant makes it nicer. This experiment is part of playing with several template +%D mechanisms. (Also see trac-lmx.) +%D +%D Note for myself: see if the (bar)chart code use in q2p can use this kind of +%D magic. Basically we then need a channel to data. + +\writestatus{loading}{MetaPost Library Graphics / Templates} + +\registerctxluafile{meta-lua}{} + +\continueifinputfile{meta-lua.mkiv} + +\starttext + +% conforming btex ... etex + +\startbuffer[test-a] + blua for i=1,100,5 do elua + draw fullcircle scaled (blua p(i) elua * cm) withcolor green withpen pencircle scaled 4 ; + blua end elua + + blua for i=1,100,10 do elua + draw fullcircle scaled (blua p(i) elua * cm) withcolor red withpen pencircle scaled 2 ; + blua end elua +\stopbuffer + +\startMPpage[offset=10pt] + input "mpstemplate://buffer?name=test-a" ; +\stopMPpage + +% conforming lmx + +\startbuffer[test-b] + <?lua for i=1,100,5 do ?> + draw fullcircle scaled (<?lua p(i) ?> * cm) withcolor green withpen pencircle scaled 4 ; + <?lua end ?> + + <?lua for i=1,100,10 do ?> + draw fullcircle scaled (<?lua p(i) ?> * cm) withcolor red withpen pencircle scaled 2 ; + <?lua end ?> +\stopbuffer + +\startMPpage[offset=10pt] + input "mpstemplate://buffer?name=test-b" ; +\stopMPpage + +\startMPpage[offset=10pt] + picture p[] ; % we can't input nested + input "mpstemplate://buffer?name=test-a&method=metapost" ; + p[1] := currentpicture ; currentpicture := nullpicture ; + input "mpstemplate://buffer?name=test-b&method=xml" ; + p[2] := currentpicture ; currentpicture := nullpicture ; + draw p[1] ysized 3cm ; + draw p[2] ysized 4cm shifted (4cm,0) ; +\stopMPpage + +% a mixture (using a wrapped input) + +\startMPpage[offset=10pt] + draw image (loadfile("mpstemplate://buffer?name=test-a&method=metapost")) ysized 3cm shifted (4cm,0cm) ; + draw image (loadfile("mpstemplate://buffer?name=test-b&method=xml")) ysized 3cm shifted (0cm,4cm) ; + draw loadimage ("mpstemplate://buffer?name=test-a&method=metapost") ysized 4cm shifted (4cm,4cm) ; + draw loadimage ("mpstemplate://buffer?name=test-b&method=xml") ysized 4cm shifted (0cm,0cm) ; +\stopMPpage + +% conforming myself + +\startluacode + context.startMPpage { offset = "10pt" } + for i=1,100,5 do + context("draw fullcircle scaled (%s * cm) withcolor green withpen pencircle scaled 4 ;",i) + end + for i=1,100,10 do + context("draw fullcircle scaled (%s * cm) withcolor red withpen pencircle scaled 2 ;",i) + end + context.stopMPpage() +\stopluacode + +\stoptext diff --git a/tex/context/base/mkiv/meta-nod.mkiv b/tex/context/base/mkiv/meta-nod.mkiv new file mode 100644 index 000000000..5c7b3d503 --- /dev/null +++ b/tex/context/base/mkiv/meta-nod.mkiv @@ -0,0 +1,241 @@ +%D \module +%D [ file=meta-nod, +%D version=2016.11.23, +%D title=\METAPOST\ Graphics, +%D subtitle=Nodes, +%D author={Alan Braslau and Hans Hagen}, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\unprotect + +\defineMPinstance + [nodes] + [\s!format=metafun, + \s!extensions=\v!yes, + \s!initializations=\v!yes, + \c!method=\s!double] + +\defineframed + [node] + [\c!frame=\v!off] + +\defineframed + [smallnode] + [node] + [\c!foregroundstyle=\small] + +% \startMPdefinitions{nodes} +% loadmodule "node" ; +% \stopMPdefinitions + +\protect + +%D This module provides a simple \TEX\ layer on top of the nodes library that +%D is preloaded in \METAFUN. More information can be found in the manual and +%D article. +%D +%D We strongly advice to use the \METAPOST\ interface and only provide this +%D \TEX\ variant as proof of concept. There are no plans to extend this module +%D because we see no advantage in using a \TEX\ interface over a \METAPOST\ +%D one. +%D +%D \startbuffer +%D \startnodes +%D \placenode[0,0]{A} +%D \placenode[1,0]{B} +%D \connectnodes [0,1] [option=doublearrow] +%D \stopnodes +%D +%D \startnodes[dx=2cm,rotation=45] +%D \placenode[0,0]{A} +%D \placenode[1,0]{B} +%D \placenode[1,1]{C} +%D \placenode[0,1]{D} +%D \connectnodes [0,2] [option=doublearrow,label=a,offset=.05] +%D \connectnodes [1,3] [option=doublearrows] +%D \stopnodes +%D +%D \startnodes[dx=2cm,dy=2cm] +%D \nodeMPcode{ahlength := 12pt ; ahangle := 30 ; ahvariant := 1 ;} +%D \mpcode{ahlength := 12pt ; ahangle := 30 ; ahvariant := 1 ;} +%D \placenode[0,1]{\node{A}} +%D \placenode[1,1]{\node{B}} +%D \placenode[0,0]{\node{C}} +%D \placenode[1,0]{\node{D}} +%D \connectnodes [0,3] [option=arrow,label={ }] +%D \connectnodes [1,2] [option=arrow] +%D \stopnodes +%D \stopbuffer +%D +%D \typebuffer +%D +%D \startlinecorrection \getbuffer \stoplinecorrection + +\unprotect + +\installcorenamespace{metanodes} +\installcorenamespace{metanodesoption} +\installcorenamespace{metanodesalternative} +\installcorenamespace{metanodesposition} + +% todo: maybe instances + +\installparameterhandler \??metanodes {metanodes} +\installsetuphandler \??metanodes {metanodes} + +\setupmetanodes + [\c!option =, + \c!alternative =, + \c!offset =0, + \c!position =, + \c!label =, + \c!dx =2\emwidth, + \c!dy =2\emwidth, + \c!rotation =90, + \c!rulethickness =.5pt, + \c!command =] + +\newtoks\t_every_meta_nodes +\newtoks\t_meta_nodes + +\let\stopnodes\relax + +\unexpanded\def\startnodes + {\dosingleempty\meta_nodes_start} + +\def\meta_nodes_start[#1]#2\stopnodes + {\hpack\bgroup + \iffirstargument + \setupcurrentmetanodes[#1]% + \fi + \edef\p_meta_option{\metanodesparameter\c!option}% + \edef\p_meta_alternative{\metanodesparameter\c!alternative}% + \the\t_every_meta_nodes + \t_meta_nodes\emptytoks + #2\removeunwantedspaces + % for alan, will be commented: + \writestatus{metanodes}{\detokenize\expandafter{\the\t_meta_nodes}}% + \startMPcode + mfun_node_init(% + \the\dimexpr\metanodesparameter\c!dx\relax,% + \the\dimexpr\metanodesparameter\c!dy\relax,% + \metanodesparameter\c!rotation% + ) ; + \the\t_meta_nodes ; + mfun_node_flush ; + \stopMPcode + \egroup} + +% \unexpanded\def\grph_nodes_node[#1,#2]#3% +% {\etoksapp\t_meta_nodes{mfun_node_make(\number#1,\number#2,"\metanodesparameter\c!command{#3}");}} + +\unexpanded\def\grph_nodes_node + {\dodoubleempty\grph_nodes_node_two} + +\def\grph_nodes_node_two[#1][#2]% + {\grph_nodes_node_two_indeed[#1][#2]} + +\def\grph_nodes_node_two_indeed[#1,#2][#3]#4% + {\begingroup + \ifsecondargument + \setupcurrentmetanodes[#3]% + \fi + \edef\p_label{#4}% + \normalexpanded{\endgroup\noexpand\etoksapp\t_meta_nodes{% + mfun_node_make(\number#1,\number#2% + \ifx\p_label\empty \else + ,"\metanodesparameter\c!command{\p_label}"% + \fi + );% + }}} + +\appendtoks + \let\placenode\grph_nodes_node +\to \t_every_meta_nodes + +\unexpanded\def\grph_nodes_fromto + {\dodoubleempty\grph_nodes_fromto_two} + +\def\grph_nodes_fromto_two[#1][#2]% + {\grph_nodes_fromto_two_indeed[#1][#2]}% get rid of {n,m} + +\letvalue{\??metanodesposition }\empty +\setvalue{\??metanodesposition top}{.top} +\setvalue{\??metanodesposition bottom}{.bot} +\setvalue{\??metanodesposition left}{.lft} +\setvalue{\??metanodesposition right}{.rt} +\setvalue{\??metanodesposition upperleft}{.ulft} +\setvalue{\??metanodesposition topleft}{.ulft} +\setvalue{\??metanodesposition lefttop}{.ulft} +\setvalue{\??metanodesposition upperright}{.urt} +\setvalue{\??metanodesposition topright}{.urt} +\setvalue{\??metanodesposition righttop}{.urt} +\setvalue{\??metanodesposition lowerleft}{.llft} +\setvalue{\??metanodesposition bottomleft}{.llft} +\setvalue{\??metanodesposition leftbottom}{.llft} +\setvalue{\??metanodesposition lowerright}{.lrt} +\setvalue{\??metanodesposition bottomright}{.lrt} +\setvalue{\??metanodesposition rightbottom}{.lrt} + +\def\grph_nodes_fromto_two_indeed[#1,#2][#3]% we can't group because etoksapp doesn't like that + {\begingroup + \ifsecondargument + \setupcurrentmetanodes[#3]% + \fi + \edef\p_label {\metanodesparameter\c!label}% + \edef\p_rulethickness{\metanodesparameter\c!rulethickness}% + \edef\p_command {\metanodesparameter\c!command}% better get an error early + \normalexpanded{\endgroup\noexpand\etoksapp\t_meta_nodes{% + \ifcsname\??metanodesalternative\metanodesparameter\c!alternative\endcsname + \lastnamedcs + \else + \csname\??metanodesalternative\endcsname + \fi + \space + mfun_nodes_fromto\begincsname\??metanodesposition\metanodesparameter\c!position\endcsname(% + \metanodesparameter\c!offset,% + \number#1,\number#2% + \ifx\p_label\empty \else + ,"\ifx\p_command\empty\p_label\else\p_command{\p_label}\fi"% + \fi + )% + \space + \ifcsname\??metanodesoption\metanodesparameter\c!option\endcsname + \lastnamedcs + \else + \csname\??metanodesoption\endcsname + \fi + \space + \ifx\p_rulethickness\empty \else + withpen pencircle scaled \the\dimexpr\p_rulethickness\relax + \fi + ;% + }}} + +\setvalue{\??metanodesalternative }{draw} +\setvalue{\??metanodesalternative arrow}{drawarrow} +\setvalue{\??metanodesalternative doublearrow}{drawdblarrow} +\setvalue{\??metanodesalternative doublearrows}{drawdoublearrows} + +\setvalue{\??metanodesoption }{} +\setvalue{\??metanodesoption dashed}{dashed evenly} +\setvalue{\??metanodesoption dotted}{dashed withdots scaled .5} + +\appendtoks + \let\connectnodes\grph_nodes_fromto +\to \t_every_meta_nodes + +\unexpanded\def\grph_nodes_code#1% + {\etoksapp\t_meta_nodes{#1}} + +\appendtoks + \let\nodeMPcode\grph_nodes_code + \let\mpcode\grph_nodes_code +\to \t_every_meta_nodes + +\protect \endinput diff --git a/tex/context/base/mkiv/meta-pdf.lua b/tex/context/base/mkiv/meta-pdf.lua index c17a2a4c7..4a185cebd 100644 --- a/tex/context/base/mkiv/meta-pdf.lua +++ b/tex/context/base/mkiv/meta-pdf.lua @@ -13,15 +13,19 @@ if not modules then modules = { } end modules ['meta-pdf'] = { -- We can make it even more efficient if needed, but as we don't use this -- code often in \MKIV\ it makes no sense. +local tonumber = tonumber local concat, unpack = table.concat, table.unpack local gsub, find, byte, gmatch, match = string.gsub, string.find, string.byte, string.gmatch, string.match local lpegmatch = lpeg.match local round = math.round local formatters, format = string.formatters, string.format -local report_mptopdf = logs.reporter("graphics","mptopdf") +local mplib = mplib +local metapost = metapost +local lpdf = lpdf +local context = context -local mplib, metapost, lpdf, context = mplib, metapost, lpdf, context +local report_mptopdf = logs.reporter("graphics","mptopdf") local texgetattribute = tex.getattribute @@ -31,7 +35,7 @@ local pdfgraycode = lpdf.graycode local pdfspotcode = lpdf.spotcode local pdftransparencycode = lpdf.transparencycode local pdffinishtransparencycode = lpdf.finishtransparencycode -local pdfliteral = nodes.pool.pdfliteral +----- pdfpageliteral = nodes.pool.pdfpageliteral metapost.mptopdf = metapost.mptopdf or { } local mptopdf = metapost.mptopdf @@ -64,7 +68,7 @@ resetall() -- -- comment hack -- -- local function pdfcode(str) --- context(pdfliteral(str)) +-- context(pdfpageliteral(str)) -- end local pdfcode = context.pdfliteral @@ -527,7 +531,7 @@ local captures_old = ( space + verbose + preamble )^0 local captures_new = ( space + verbose + procset + preamble )^0 local function parse(m_data) - if find(m_data,"%%%%BeginResource: procset mpost") then + if find(m_data,"%%BeginResource: procset mpost",1,true) then -- report_mptopdf("using sparse scanner, case 1") lpegmatch(captures_new,m_data) elseif find(m_data,"%%%%BeginProlog%s*%S+(.-)%%%%EndProlog") then diff --git a/tex/context/base/mkiv/meta-pdf.mkiv b/tex/context/base/mkiv/meta-pdf.mkiv index 14c97042e..38ffb72f8 100644 --- a/tex/context/base/mkiv/meta-pdf.mkiv +++ b/tex/context/base/mkiv/meta-pdf.mkiv @@ -11,7 +11,7 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\registerctxluafile{meta-pdf}{1.003} +\registerctxluafile{meta-pdf}{} \writestatus{loading}{MetaPost Graphics / MPS to PDF} diff --git a/tex/context/base/mkiv/meta-pdh.lua b/tex/context/base/mkiv/meta-pdh.lua index 5040715c4..afd1576cb 100644 --- a/tex/context/base/mkiv/meta-pdh.lua +++ b/tex/context/base/mkiv/meta-pdh.lua @@ -30,7 +30,9 @@ local concat, format, find, gsub, gmatch = table.concat, string.format, string.f local tostring, tonumber, select = tostring, tonumber, select local lpegmatch = lpeg.match -local metapost = metapost +metapost = metapost or { } +local metapost = metapost +local context = context metapost.mptopdf = metapost.mptopdf or { } local mptopdf = metapost.mptopdf @@ -98,7 +100,7 @@ function mptopdf.steps.strip() -- .3 per expr end local name, version = gmatch(preamble,"%%%%Creator: +(.-) +(.-) ") mptopdf.version = tostring(version or "0") - if find(preamble,"/hlw{0 dtransform") then + if find(preamble,"/hlw{0 dtransform",1,true) then mptopdf.shortcuts = true end -- the boundingbox specification needs to come before data, well, not really @@ -587,7 +589,7 @@ do local captures_new = ( space + procset + preamble + verbose )^0 function mptopdf.parsers.lpeg() - if find(mptopdf.data,"%%%%BeginResource: procset mpost") then + if find(mptopdf.data,"%%BeginResource: procset mpost",1,true) then lpegmatch(captures_new,mptopdf.data) else lpegmatch(captures_old,mptopdf.data) diff --git a/tex/context/base/mkiv/meta-pdh.mkiv b/tex/context/base/mkiv/meta-pdh.mkiv index 3787a5638..f9eff73ca 100644 --- a/tex/context/base/mkiv/meta-pdh.mkiv +++ b/tex/context/base/mkiv/meta-pdh.mkiv @@ -29,7 +29,7 @@ % % timings may differ now that we revamped the backend -\registerctxluafile{meta-pdf}{1.003} +\registerctxluafile{meta-pdf}{} %D We will clean up the color mess later. @@ -268,8 +268,8 @@ %D {0.001} is the first path and \type {0.010} the tenth. Since %D \METAPOST strips trailing zeros, we have to padd the string. -\newif\ifMPcmykcolors -\newif\ifMPspotcolors +% \newif\ifMPcmykcolors +% \newif\ifMPspotcolors %D Specials: diff --git a/tex/context/base/mkiv/meta-tex.lua b/tex/context/base/mkiv/meta-tex.lua index 71207975d..d66eab069 100644 --- a/tex/context/base/mkiv/meta-tex.lua +++ b/tex/context/base/mkiv/meta-tex.lua @@ -6,262 +6,161 @@ if not modules then modules = { } end modules ['meta-tex'] = { license = "see context related readme files" } -local tostring = tostring -local format, gsub, find, match = string.format, string.gsub, string.find, string.match +local tostring, tonumber = tostring, tonumber +local format = string.format local formatters = string.formatters local P, S, R, C, Cs, lpegmatch = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.Cs, lpeg.match -metapost = metapost or { } +metapost = metapost or { } +local metapost = metapost +local context = context local implement = interfaces.implement --- local left = P("[") --- local right = P("]") --- local space = P(" ") --- local argument = left * C((1-right)^1) * right --- local pattern = (argument + space)^0 +do --- function metapost.sometxt(optional,str) --- if optional == "" then --- context.sometxta(str) --- else --- local one, two = lpegmatch(pattern,optional) --- if two then --- context.sometxtc(one,two,str) --- elseif one then --- context.sometxtb(one,str) --- else --- context.sometxta(str) --- end --- end --- end + local pattern = Cs((P([[\"]]) + P([["]])/"\\quotedbl{}" + P(1))^0) -- or \char -local pattern = Cs((P([[\"]]) + P([["]])/"\\quotedbl{}" + P(1))^0) -- or \char - -function metapost.escaped(str) - context(lpegmatch(pattern,str)) -end - -implement { - name = "metapostescaped", - actions = metapost.escaped, - arguments = "string" -} - -local simplify = true - --- local function strip(n,e) --- -- get rid of e(0) --- -- get rid of e(+*) --- e = gsub(e,"^+","") --- -- remove leading zeros --- e = gsub(e,"^([+-]*)0+(%d)","%1%2") --- if not simplify then --- -- take it as it is --- elseif n == "1" then --- return format("10^{%s}",e) --- end --- return format("%s\\times10^{%s}",n,e) --- end --- --- function metapost.format_n(fmt,...) --- fmt = gsub(fmt,"@","%%") --- local initial, hasformat, final = match(fmt,"^(.-)(%%.-[%a])(.-)$") --- if hasformat then --- str = format(fmt,...) --- str = gsub(str,"(.-)e(.-)$",strip) --- str = format("%s\\mathematics{%s}%s",initial,str,final) --- elseif not find(fmt,"%%") then --- str = format("%"..fmt,...) --- str = gsub(str,"(.-)e(.-)$",strip) --- str = format("\\mathematics{%s}",str) --- end --- context(str) --- end - --- todo: proper lpeg - --- local function strip(n,e) --- -- get rid of e(0) --- -- get rid of e(+*) --- e = gsub(e,"^+","") --- -- remove leading zeros --- e = gsub(e,"^([+-]*)0+(%d)","%1%2") --- if not simplify then --- -- take it as it is --- elseif n == "1" then --- return format("\\mathematics{10^{%s}}",e) --- end --- return format("\\mathematics{%s\\times10^{%s}}",n,e) --- end --- --- function metapost.format_n(fmt,...) --- fmt = gsub(fmt,"@","%%") --- if find(fmt,"%%") then --- str = format(fmt,...) --- else -- yes or no --- str = format("%"..fmt,...) --- end --- str = gsub(str,"([%-%+]-[%.%d]+)e([%-%+]-[%.%d]+)",strip) --- context(str) --- end --- --- function metapost.format_v(fmt,str) --- metapost.format_n(fmt,metapost.untagvariable(str,false)) --- end + function metapost.escaped(str) + context(lpegmatch(pattern,str)) + end --- -- -- + implement { + name = "metapostescaped", + actions = metapost.escaped, + arguments = "string" + } -local number = C((S("+-")^0 * R("09","..")^1)) -local enumber = number * S("eE") * number +end -local cleaner = Cs((P("@@")/"@" + P("@")/"%%" + P(1))^0) +do -context = context or { exponent = function(...) print(...) end } + local simplify = true + local number = C((S("+-")^0 * R("09","..")^1)) + local enumber = number * S("eE") * number + local cleaner = Cs((P("@@")/"@" + P("@")/"%%" + P(1))^0) -function metapost.format_string(fmt,...) - context(lpegmatch(cleaner,fmt),...) -end - -function metapost.format_number(fmt,num) - if not num then - num = fmt - fmt = "%e" + local function format_string(fmt,...) + context(lpegmatch(cleaner,fmt),...) end - local number = tonumber(num) - if number then - local base, exponent = lpegmatch(enumber,formatters[lpegmatch(cleaner,fmt)](number)) - if base and exponent then - context.MPexponent(base,exponent) + + local function format_number(fmt,num) + if not num then + num = fmt + fmt = "%e" + end + local number = tonumber(num) + if number then + local base, exponent = lpegmatch(enumber,formatters[lpegmatch(cleaner,fmt)](number)) + if base and exponent then + context.MPexponent(base,exponent) + else + context(number) + end else - context(number) + context(tostring(num)) end - else - context(tostring(num)) end -end - --- This is experimental and will change! - -function metapost.svformat(fmt,str) - metapost.format_string(fmt,metapost.untagvariable(str,false)) -end -function metapost.nvformat(fmt,str) - metapost.format_number(fmt,metapost.untagvariable(str,false)) -end - -implement { name = "metapostformatted", actions = metapost.svformat, arguments = { "string", "string" } } -implement { name = "metapostgraphformat", actions = metapost.nvformat, arguments = { "string", "string" } } + -- This is experimental and will change! --- kind of new + metapost.format_string = format_string + metapost.format_number = format_number -local f_exponent = formatters["\\MPexponent{%s}{%s}"] + function metapost.svformat(fmt,str) + format_string(fmt,metapost.untagvariable(str,false)) + end -local mpformatters = table.setmetatableindex(function(t,k) - local v = formatters[lpegmatch(cleaner,k)] - t[k] = v - return v -end) + function metapost.nvformat(fmt,str) + format_number(fmt,metapost.untagvariable(str,false)) + end -function metapost.texexp(num,bfmt,efmt) - local number = tonumber(num) - if number then - local base, exponent = lpegmatch(enumber,format("%e",number)) - if base and exponent then - if bfmt then - -- base = formatters[lpegmatch(cleaner,bfmt)](base) - base = mpformatters[bfmt](base) - else - base = format("%f",base) - end - if efmt then - -- exponent = formatters[lpegmatch(cleaner,efmt)](exponent) - exponent = mpformatters[efmt](exponent) + local f_exponent = formatters["\\MPexponent{%s}{%s}"] + + -- can be a weak one: mpformatters + + local mpformatters = table.setmetatableindex(function(t,k) + local v = formatters[lpegmatch(cleaner,k)] + t[k] = v + return v + end) + + function metapost.texexp(num,bfmt,efmt) + local number = tonumber(num) + if number then + local base, exponent = lpegmatch(enumber,format("%e",number)) + if base and exponent then + if bfmt then + -- base = formatters[lpegmatch(cleaner,bfmt)](base) + base = mpformatters[bfmt](base) + else + base = format("%f",base) + end + if efmt then + -- exponent = formatters[lpegmatch(cleaner,efmt)](exponent) + exponent = mpformatters[efmt](exponent) + else + exponent = format("%i",exponent) + end + return f_exponent(base,exponent) + elseif bfmt then + -- return formatters[lpegmatch(cleaner,bfmt)](number) + return mpformatters[bfmt](number) else - exponent = format("%i",exponent) + return number end - return f_exponent(base,exponent) - elseif bfmt then - -- return formatters[lpegmatch(cleaner,bfmt)](number) - return mpformatters[bfmt](number) else - return number + return num end - else - return num end -end - --- not in context a namespace - -if _LUAVERSION < 5.2 then - utilities.strings.formatters.add(formatters,"texexp", [[texexp(...)]], "local texexp = metapost.texexp") -else - utilities.strings.formatters.add(formatters,"texexp", [[texexp(...)]], { texexp = metapost.texexp }) -end --- print(string.formatters["%!3.3!texexp!"](10.4345E30)) --- print(string.formatters["%3!texexp!"](10.4345E30,"%2.3f","%2i")) --- print(string.formatters["%2!texexp!"](10.4345E30,"%2.3f")) --- print(string.formatters["%1!texexp!"](10.4345E30)) --- print(string.formatters["%!texexp!"](10.4345E30)) + implement { + name = "metapostformatted", + actions = metapost.svformat, + arguments = { "string", "string" } + } --- local function test(fmt,n) --- logs.report("mp format test","fmt: %s, n: %s, result: %s, \\exponent{%s}{%s}",fmt,n, --- formatters[lpegmatch(cleaner,fmt)](n), --- lpegmatch(enumber,formatters[lpegmatch(cleaner,fmt)](n)) --- ) --- end --- --- test("@j","1e-8") --- test("@j",1e-8) --- test("@j","1e+8") --- test("@j","1e-10") --- test("@j",1e-10) --- test("@j","1e+10") --- test("@j","1e-12") --- test("@j","1e+12") --- test("@j","1e-0") --- test("@j","1e+0") --- test("@j","1") --- test("@j test","1") --- test("@j","-1") --- test("@j","1e-102") --- test("@1.4j","1e+102") --- test("@j","1.2e+102") --- test("@j","1.23e+102") --- test("@j","1.234e+102") + implement { + name = "metapostgraphformat", + actions = metapost.nvformat, + arguments = { "string", "string" } + } -local f_textext = formatters[ [[textext("%s")]] ] -local f_mthtext = formatters[ [[textext("\mathematics{%s}")]] ] -local f_exptext = formatters[ [[textext("\mathematics{%s\times10^{%s}}")]] ] + if LUAVERSION < 5.2 then + utilities.strings.formatters.add(formatters,"texexp", [[texexp(...)]], "local texexp = metapost.texexp") + else + utilities.strings.formatters.add(formatters,"texexp", [[texexp(...)]], { texexp = metapost.texexp }) + end --- local cleaner = Cs((P("\\")/"\\\\" + P("@@")/"@" + P("@")/"%%" + P(1))^0) + local f_textext = formatters[ [[textext("%s")]] ] + local f_mthtext = formatters[ [[textext("\mathematics{%s}")]] ] + local f_exptext = formatters[ [[textext("\mathematics{%s\times10^{%s}}")]] ] -local mpprint = mp.print + local mpprint = mp.print -function mp.format(fmt,str) -- bah, this overloads mp.format in mlib-lua.lua - fmt = lpegmatch(cleaner,fmt) - mpprint(f_textext(formatters[fmt](metapost.untagvariable(str,false)))) -end + function mp.format(fmt,str) -- bah, this overloads mp.format in mlib-lua.lua + fmt = lpegmatch(cleaner,fmt) + mpprint(f_textext(formatters[fmt](metapost.untagvariable(str,false)))) + end -function mp.formatted(fmt,...) -- svformat - fmt = lpegmatch(cleaner,fmt) - mpprint(f_textext(formatters[fmt](...))) -end + function mp.formatted(fmt,...) -- svformat + fmt = lpegmatch(cleaner,fmt) + mpprint(f_textext(formatters[fmt](...))) + end -function mp.graphformat(fmt,num) -- nvformat - fmt = lpegmatch(cleaner,fmt) - local number = tonumber(num) - if number then - local base, exponent = lpegmatch(enumber,number) - if base and exponent then - mpprint(f_exptext(base,exponent)) + function mp.graphformat(fmt,num) -- nvformat + fmt = lpegmatch(cleaner,fmt) + local number = tonumber(num) + if number then + local base, exponent = lpegmatch(enumber,number) + if base and exponent then + mpprint(f_exptext(base,exponent)) + else + mpprint(f_mthtext(num)) + end else - mpprint(f_mthtext(num)) + mpprint(f_textext(tostring(num))) end - else - mpprint(f_textext(tostring(num))) end + end diff --git a/tex/context/base/mkiv/meta-tex.mkiv b/tex/context/base/mkiv/meta-tex.mkiv index 8d24f687c..03ad5ee39 100644 --- a/tex/context/base/mkiv/meta-tex.mkiv +++ b/tex/context/base/mkiv/meta-tex.mkiv @@ -11,7 +11,7 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\registerctxluafile{meta-tex}{1.001} +\registerctxluafile{meta-tex}{} \unprotect diff --git a/tex/context/base/mkiv/metatex.lus b/tex/context/base/mkiv/metatex.lus deleted file mode 100644 index df7bc1914..000000000 --- a/tex/context/base/mkiv/metatex.lus +++ /dev/null @@ -1,9 +0,0 @@ -if not modules then modules = { } end modules ['metatex'] = { - version = 1.001, - comment = "companion to metatex.tex", - author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", - copyright = "PRAGMA ADE / ConTeXt Development Team", - license = "see context related readme files" -} - -return "luat-cod.lua" diff --git a/tex/context/base/mkiv/metatex.tex b/tex/context/base/mkiv/metatex.tex index b5f54c4ee..7c8a7ff01 100644 --- a/tex/context/base/mkiv/metatex.tex +++ b/tex/context/base/mkiv/metatex.tex @@ -22,144 +22,9 @@ %D A format is generated with the command; %D %D \starttyping -%D luatools --make --compile metatex +%D mtxrun --script metatex --make %D \stoptyping %D -%D Remark: this is far from complete. We will gradually add -%D more. Also, it's not yet clean what exactly will be part -%D of it. This is a prelude to a configureable macro package. - -\catcode`\{=1 \catcode`\}=2 \catcode`\#=6 - -\edef\metatexformat {\jobname} -\edef\metatexversion{2007.04.03 13:01} - -\let\fmtname \metatexformat -\let\fmtversion\metatexversion - -\ifx\normalinput\undefined \let\normalinput\input \fi - -\def\loadcorefile#1{\normalinput#1.tex \relax} -\def\loadmarkfile#1{\normalinput#1.mkiv\relax} - -\loadmarkfile{syst-ini} - -\ifnum\luatexversion<60 % also change message - \writestatus{!!!!}{Your luatex binary is too old, you need at least version 0.60!} - \expandafter\end -\fi - -\newtoks\metatexversiontoks \metatexversiontoks\expandafter{\metatexversion} % at the lua end - -\loadmarkfile{syst-pln} % plain tex initializations of internal registers (no further code) -\loadmarkfile{syst-mes} - -\loadmarkfile{luat-cod} % -\loadmarkfile{luat-bas} % -\loadmarkfile{luat-lib} % - -% needs stripping: - -\loadmarkfile{catc-ini} % catcode table management -\loadmarkfile{catc-act} % active character definition mechanisms -\loadmarkfile{catc-def} % some generic catcode tables -\loadmarkfile{catc-ctx} % a couple of context specific tables but expected by later modules -\loadmarkfile{catc-sym} % some definitions related to \letter<tokens> - -% helpers, maybe less - -\loadmarkfile{syst-aux} % a whole lot of auxiliary macros -%loadmarkfile{syst-lua} % some helpers using lua instead -%loadmarkfile{syst-con} % some rather basic conversions -%loadmarkfile{syst-fnt} -%loadmarkfile{syst-str} -%loadmarkfile{syst-rtp} - -% not needed - -% \loadmarkfile{supp-fil} -% \loadmarkfile{supp-dir} - -% characters - -\loadmarkfile{char-utf} -\loadmarkfile{char-ini} -\loadmarkfile{char-enc} % \registerctxluafile{char-enc}{1.001} - -% attributes - -\loadmarkfile{attr-ini} - -% nodes - -\loadmarkfile{node-ini} -%loadmarkfile{node-fin} -%loadmarkfile{node-par} - -% attributes, not needed: - -%loadmarkfile{attr-ini} - -% regimes - -% \loadmarkfile{regi-ini} -% \loadcorefile{regi-syn} - -% languages - -% fonts - -% \loadcorefile{enco-ini.mkiv} -% \loadcorefile{hand-ini.mkiv} - -\registerctxluafile{font-ini}{1.001} - -\registerctxluafile{node-fnt}{1.001} - -\registerctxluafile{font-enc}{1.001} -\registerctxluafile{font-map}{1.001} -\registerctxluafile{font-syn}{1.001} -\registerctxluafile{font-tfm}{1.001} -\registerctxluafile{font-afm}{1.001} -\registerctxluafile{font-cid}{1.001} -\registerctxluafile{font-ott}{1.001} -\registerctxluafile{font-otf}{1.001} -\registerctxluafile{font-otb}{1.001} -\registerctxluafile{font-otn}{1.001} -\registerctxluafile{font-ota}{1.001} -\registerctxluafile{font-otp}{1.001} -\registerctxluafile{font-otc}{1.001} -%registerctxluafile{font-vf} {1.001} -\registerctxluafile{font-def}{1.001} -%registerctxluafile{font-ctx}{1.001} -\registerctxluafile{font-xtx}{1.001} -%registerctxluafile{font-fbk}{1.001} -%registerctxluafile{font-ext}{1.001} -\registerctxluafile{font-pat}{1.001} -%registerctxluafile{font-chk}{1.001} - -%registerctxluafile{math-ini}{1.001} -%registerctxluafile{math-dim}{1.001} -%registerctxluafile{math-ent}{1.001} -%registerctxluafile{math-ext}{1.001} -%registerctxluafile{math-vfu}{1.001} -%registerctxluafile{math-map}{1.001} -%registerctxluafile{math-noa}{1.001} - -\registerctxluafile{task-ini}{1.001} - -%registerctxluafile{l-xml}{1.001} % needed for font database - -% why not ... - -\pdfoutput\plusone - -% too - -\appendtoks - \ctxlua{statistics.savefmtstatus("\jobname","\metatexversion","metatex.tex")}% can become automatic -\to \everydump - -% done - -\errorstopmode \dump \endinput +%D For the moment this is a placeholder. Maybe some day ... the old +%D file history/metatex/metatex.tex so I can pick up from there if +%D needed. diff --git a/tex/context/base/mkiv/mlib-ctx.lua b/tex/context/base/mkiv/mlib-ctx.lua index 96eb27cbd..0ff28c1c4 100644 --- a/tex/context/base/mkiv/mlib-ctx.lua +++ b/tex/context/base/mkiv/mlib-ctx.lua @@ -6,12 +6,10 @@ if not modules then modules = { } end modules ['mlib-ctx'] = { license = "see context related readme files", } --- for the moment we have the scanners here but they migh tbe moved to --- the other modules - local type, tostring = type, tostring local format, concat = string.format, table.concat local settings_to_hash = utilities.parsers.settings_to_hash +local formatters = string.formatters local report_metapost = logs.reporter("metapost") @@ -20,9 +18,8 @@ local stoptiming = statistics.stoptiming local mplib = mplib -metapost = metapost or {} +metapost = metapost or { } local metapost = metapost - local context = context local setters = tokens.setters @@ -87,10 +84,6 @@ function metapost.getextensions(instance,state) end end --- function commands.getmpextensions(instance,state) --- context(metapost.getextensions(instance,state)) --- end - implement { name = "setmpextensions", actions = metapost.setextensions, @@ -139,7 +132,7 @@ implement { end } --- metapost.variables = { } -- to be stacked +-- metapost.variables = { } -- to be stacked implement { name = "mprunvar", @@ -202,6 +195,39 @@ function metapost.graphic(specification) metapost.graphic_base_pass(setmpsformat(specification)) end +function metapost.startgraphic(t) + if not t then + t = { } + end + if not t.instance then + t.instance = metapost.defaultinstance + end + if not t.format then + t.format = metapost.defaultformat + end + if not t.method then + t.method = metapost.defaultmethod + end + if not t.definitions then + t.definitions = "" + end + t.data = { } + return t +end + +function metapost.stopgraphic(t) + if t then + t.data = concat(t.data or { },"\n") + metapost.graphic(t) + t.data = "" + end +end + +function metapost.tographic(t,f,s,...) + local d = t.data + d[#d+1] = s and formatters[f](s,...) or f +end + implement { name = "mpgraphic", actions = metapost.graphic, diff --git a/tex/context/base/mkiv/mlib-ctx.mkiv b/tex/context/base/mkiv/mlib-ctx.mkiv index a7bb612c8..1f05b6ef8 100644 --- a/tex/context/base/mkiv/mlib-ctx.mkiv +++ b/tex/context/base/mkiv/mlib-ctx.mkiv @@ -16,10 +16,10 @@ \writestatus{loading}{MetaPost Library Graphics / Initializations} -\registerctxluafile{mlib-run}{1.001} -\registerctxluafile{mlib-ctx}{1.001} -\registerctxluafile{mlib-lua}{1.001} -\registerctxluafile{mlib-int}{1.001} % here ? +\registerctxluafile{mlib-run}{} +\registerctxluafile{mlib-ctx}{} +\registerctxluafile{mlib-lua}{} +\registerctxluafile{mlib-int}{} % here ? \unprotect diff --git a/tex/context/base/mkiv/mlib-int.lua b/tex/context/base/mkiv/mlib-int.lua index 108002929..bd3ba213f 100644 --- a/tex/context/base/mkiv/mlib-int.lua +++ b/tex/context/base/mkiv/mlib-int.lua @@ -17,6 +17,8 @@ local mpcolor = attributes.colors.mpcolor local emwidths = fonts.hashes.emwidths local exheights = fonts.hashes.exheights +local mpgetdimen = mp.getdimen + function mp.PaperHeight () mpprint(getdimen("paperheight") *factor) end function mp.PaperWidth () mpprint(getdimen("paperwidth") *factor) end function mp.PrintPaperHeight () mpprint(getdimen("printpaperheight") *factor) end @@ -61,10 +63,15 @@ function mp.LayoutColumnWidth () mpprint(getdimen("layoutcolumnwidth") *fact function mp.SpineWidth () mpprint(getdimen("spinewidth") *factor) end function mp.PaperBleed () mpprint(getdimen("paperbleed") *factor) end -function mp.PageNumber () mpprint(getcount("pageno")) end function mp.RealPageNumber () mpprint(getcount("realpageno")) end +function mp.LastPageNumber () mpprint(getcount("lastpageno")) end + +function mp.PageNumber () mpprint(getcount("pageno")) end function mp.NOfPages () mpprint(getcount("lastpageno")) end +function mp.SubPageNumber () mpprint(getcount("subpageno")) end +function mp.NOfSubPages () mpprint(getcount("lastsubpageno")) end + function mp.CurrentColumn () mpprint(getcount("mofcolumns")) end function mp.NOfColumns () mpprint(getcount("nofcolumns")) end diff --git a/tex/context/base/mkiv/mlib-lua.lua b/tex/context/base/mkiv/mlib-lua.lua index 9831efc20..5e6be614b 100644 --- a/tex/context/base/mkiv/mlib-lua.lua +++ b/tex/context/base/mkiv/mlib-lua.lua @@ -13,11 +13,12 @@ if not modules then modules = { } end modules ['mlib-lua'] = { local type, tostring, select, loadstring = type, tostring, select, loadstring local find, match, gsub, gmatch = string.find, string.match, string.gsub, string.gmatch -local formatters = string.formatters -local concat = table.concat -local lpegmatch = lpeg.match +local formatters = string.formatters +local concat = table.concat +local lpegmatch = lpeg.match +local lpegpatterns = lpeg.patterns -local P, S, Ct = lpeg.P, lpeg.S, lpeg.Ct +local P, S, Ct, Cs, Cc, C = lpeg.P, lpeg.S, lpeg.Ct, lpeg.Cs, lpeg.Cc, lpeg.C local report_luarun = logs.reporter("metapost","lua") local report_message = logs.reporter("metapost") @@ -67,7 +68,7 @@ local f_pair = formatters["(%.16f,%.16f)"] local f_triplet = formatters["(%.16f,%.16f,%.16f)"] local f_quadruple = formatters["(%.16f,%.16f,%.16f,%.16f)"] -local function mpprint(...) +local function mpprint(...) -- we can optimize for n=1 for i=1,select("#",...) do local value = select(i,...) if value ~= nil then @@ -86,7 +87,44 @@ local function mpprint(...) end end -mp.print = mpprint +local r = P('%') / "percent" + + P('"') / "dquote" + + P('\n') / "crlf" + -- + P(' ') / "space" +local a = Cc("&") +local q = Cc('"') +local p = Cs(q * (r * a)^-1 * (a * r * (P(-1) + a) + P(1))^0 * q) + +local function mpvprint(...) -- variable print + for i=1,select("#",...) do + local value = select(i,...) + if value ~= nil then + n = n + 1 + local t = type(value) + if t == "number" then + buffer[n] = f_numeric(value) + elseif t == "string" then + buffer[n] = lpegmatch(p,value) + elseif t == "table" then + local m = #t + if m == 2 then + buffer[n] = f_pair(unpack(t)) + elseif m == 3 then + buffer[n] = f_triplet(unpack(t)) + elseif m == 4 then + buffer[n] = f_quadruple(unpack(t)) + else -- error + buffer[n] = "" + end + else -- boolean or whatever + buffer[n] = tostring(value) + end + end + end +end + +mp.print = mpprint +mp.vprint = mpvprint -- We had this: -- @@ -204,7 +242,7 @@ local replacer = lpeg.replacer("@","%%") function mp.fprint(fmt,...) n = n + 1 - if not find(fmt,"%%") then + if not find(fmt,"%",1,true) then fmt = lpegmatch(replacer,fmt) end buffer[n] = formatters[fmt](...) @@ -213,12 +251,14 @@ end local function mpquoted(fmt,s,...) n = n + 1 if s then - if not find(fmt,"%%") then + if not find(fmt,"%",1,true) then fmt = lpegmatch(replacer,fmt) end - buffer[n] = '"' .. formatters[fmt](s,...) .. '"' + -- buffer[n] = '"' .. formatters[fmt](s,...) .. '"' + buffer[n] = lpegmatch(p,formatters[fmt](s,...)) elseif fmt then - buffer[n] = '"' .. fmt .. '"' + -- buffer[n] = '"' .. fmt .. '"' + buffer[n] = lpegmatch(p,fmt) else -- something is wrong end @@ -230,8 +270,8 @@ function mp.n(t) return type(t) == "table" and #t or 0 end -local whitespace = lpeg.patterns.whitespace -local newline = lpeg.patterns.newline +local whitespace = lpegpatterns.whitespace +local newline = lpegpatterns.newline local setsep = newline^2 local comment = (S("#%") + P("--")) * (1-newline)^0 * (whitespace - setsep)^0 local value = (1-whitespace)^1 / tonumber @@ -274,24 +314,6 @@ end -- endfor ; -- \stopMPpage --- function metapost.runscript(code) --- local f = loadstring(f_code(code)) --- if f then --- local result = f() --- if result then --- local t = type(result) --- if t == "number" then --- return f_numeric(result) --- elseif t == "string" then --- return result --- else --- return tostring(result) --- end --- end --- end --- return "" --- end - local cache, n = { }, 0 -- todo: when > n then reset cache or make weak function metapost.runscript(code) @@ -339,7 +361,7 @@ function metapost.runscript(code) report_luarun("no result") end else - report_luarun("no result, invalid code") + report_luarun("no result, invalid code: %s",code) end return "" end @@ -479,13 +501,15 @@ function mp.prefix(str) mpquoted(match(str,"^(.-)[%d%[]") or str) end -function mp.dimensions(str) - local n = 0 - for s in gmatch(str,"%[?%-?%d+%]?") do --todo: lpeg - n = n + 1 - end - mpprint(n) -end +-- function mp.dimension(str) +-- local n = 0 +-- for s in gmatch(str,"%[?%-?%d+%]?") do --todo: lpeg +-- n = n + 1 +-- end +-- mpprint(n) +-- end + +mp.dimension = lpeg.counter(P("[") * lpegpatterns.integer * P("]") + lpegpatterns.integer,mpprint) -- faster and okay as we don't have many variables but probably only -- basename makes sense and even then it's not called that often @@ -647,3 +671,46 @@ do end end + +do + + local mpvprint = mp.vprint + + local stores = { } + + function mp.newstore(name) + stores[name] = { } + end + + function mp.disposestore(name) + stores[name] = nil + end + + function mp.tostore(name,key,value) + stores[name][key] = value + end + + function mp.fromstore(name,key) + mpvprint(stores[name][key]) -- type specific + end + + interfaces.implement { + name = "getMPstored", + arguments = { "string", "string" }, + actions = function(name,key) + context(stores[name][key]) + end + } + +end + +do + + local mpprint = mp.print + local texmodes = tex.modes + + function mp.processingmode(s) + mpprint(tostring(texmodes[s])) + end + +end diff --git a/tex/context/base/mkiv/mlib-pdf.lua b/tex/context/base/mkiv/mlib-pdf.lua index 0c2945316..75f810fb3 100644 --- a/tex/context/base/mkiv/mlib-pdf.lua +++ b/tex/context/base/mkiv/mlib-pdf.lua @@ -216,13 +216,14 @@ end local function flushnormalpath(path, t, open) local pth, ith, nt + local length = #path if t then nt = #t else t = { } nt = 0 end - for i=1,#path do + for i=1,length do nt = nt + 1 pth = path[i] if not ith then @@ -242,7 +243,7 @@ local function flushnormalpath(path, t, open) else t[nt] = f_l(one.x_coord,one.y_coord) end - elseif #path == 1 then + elseif length == 1 then -- special case .. draw point local one = path[1] nt = nt + 1 @@ -253,6 +254,7 @@ end local function flushconcatpath(path, t, open) local pth, ith, nt + local length = #path if t then nt = #t else @@ -261,7 +263,7 @@ local function flushconcatpath(path, t, open) end nt = nt + 1 t[nt] = f_cm(sx,rx,ry,sy,tx,ty) - for i=1,#path do + for i=1,length do nt = nt + 1 pth = path[i] if not ith then @@ -285,7 +287,7 @@ local function flushconcatpath(path, t, open) else t[nt] = f_l(mpconcat(one.x_coord,one.y_coord)) end - elseif #path == 1 then + elseif length == 1 then -- special case .. draw point nt = nt + 1 local one = path[1] @@ -576,7 +578,7 @@ function metapost.flush(result,flusher,askedfig) result[#result+1] = open and "S" or "h S" end elseif objecttype == "both" then - result[#result+1] = evenodd and "h B*" or "h B"-- B* = eo -- b includes closepath + result[#result+1] = evenodd and "h B*" or "h B" -- B* = eo -- b includes closepath end end if transformed then @@ -611,7 +613,7 @@ function metapost.flush(result,flusher,askedfig) elseif objecttype == "outline" then result[#result+1] = open and "S" or "h S" elseif objecttype == "both" then - result[#result+1] = evenodd and "h B*" or "h B"-- B* = eo -- b includes closepath + result[#result+1] = evenodd and "h B*" or "h B" -- B* = eo -- b includes closepath end if transformed then result[#result+1] = "Q" diff --git a/tex/context/base/mkiv/mlib-pdf.mkiv b/tex/context/base/mkiv/mlib-pdf.mkiv index 5875c7635..147b67f74 100644 --- a/tex/context/base/mkiv/mlib-pdf.mkiv +++ b/tex/context/base/mkiv/mlib-pdf.mkiv @@ -16,7 +16,7 @@ % We use bit more code that needed because we want to limit the % amount of boxing. -\registerctxluafile{mlib-pdf}{1.001} +\registerctxluafile{mlib-pdf}{} %D Some code is shared between MPLIB and MPS. The following variables %D are also available for introspection and other purposes. @@ -31,7 +31,7 @@ \ifdefined\MPbox \else \newbox \MPbox \fi -\def\setMPboundingbox#1#2#3#4% at some point we might pass them as base or scaled points +\unexpanded\def\setMPboundingbox#1#2#3#4% at some point we might pass them as base or scaled points {\global\MPllx #1\onebasepoint \global\MPlly #2\onebasepoint \global\MPurx #3\onebasepoint @@ -39,7 +39,7 @@ \global\MPwidth \dimexpr\MPurx-\MPllx\relax \global\MPheight\dimexpr\MPury-\MPlly\relax} -\def\resetMPboundingbox +\unexpanded\def\resetMPboundingbox {\global\MPwidth \zeropoint \global\MPheight\zeropoint \global\MPllx \zeropoint @@ -47,14 +47,14 @@ \global\MPurx \zeropoint \global\MPury \zeropoint} -\def\repositionMPboxindeed +\unexpanded\def\repositionMPboxindeed {\setbox\MPbox\hpack\bgroup \kern-\MPllx \raise-\MPlly \box\MPbox \egroup} -\def\repositionMPbox +\unexpanded\def\repositionMPbox {\ifzeropt\MPllx \ifzeropt\MPlly % okay @@ -65,7 +65,7 @@ \repositionMPboxindeed \fi} -\def\finalizeMPbox +\unexpanded\def\finalizeMPbox {\repositionMPbox \setbox\MPbox\vpack to \MPheight\bgroup \vfill @@ -76,7 +76,7 @@ \wd\MPbox\MPwidth \ht\MPbox\MPheight} -\def\MPtextext#1#2#3#4#5% beware: we use a different method now (see mlib-pps) +\unexpanded\def\MPtextext#1#2#3#4#5% beware: we use a different method now (see mlib-pps) {\begingroup \setbox\MPbox\hbox{\font\temp=#1\space at #2\onebasepoint \let\c\char \temp #3}% text \MPllx-#4\onebasepoint @@ -88,9 +88,9 @@ % MPLIB specific: -\def\MPLIBtoPDF{\clf_mpflushliteral} +\def\MPLIBtoPDF{\clf_mpflushliteral} % expanded -\def\startMPLIBtoPDF#1#2#3#4% +\unexpanded\def\startMPLIBtoPDF#1#2#3#4% {\meta_process_graphic_figure_start \dostarttagged\t!mpgraphic\empty \naturalhpack attr \imageattribute \plusone \bgroup @@ -100,7 +100,7 @@ % \forgetall % already done elsewhere \noindent} % forces the proper cm in the backend -\def\stopMPLIBtoPDF +\unexpanded\def\stopMPLIBtoPDF {\egroup \finalizeMPbox \box\MPbox @@ -128,8 +128,8 @@ \let\normalstartMPLIBtoPDF\startMPLIBtoPDF \let\normalstopMPLIBtoPDF \stopMPLIBtoPDF -\def\directstartMPLIBtoPDF{\startTEXpage\normalstartMPLIBtoPDF} -\def\directstopMPLIBtoPDF {\normalstopMPLIBtoPDF\stopTEXpage} +\unexpanded\def\directstartMPLIBtoPDF{\startTEXpage\normalstartMPLIBtoPDF} +\unexpanded\def\directstopMPLIBtoPDF {\normalstopMPLIBtoPDF\stopTEXpage} \unexpanded\def\directMPgraphic {\dodoublegroupempty\mlib_direct_graphic} diff --git a/tex/context/base/mkiv/mlib-pps.lua b/tex/context/base/mkiv/mlib-pps.lua index 9fc8fec35..bb5ce31e5 100644 --- a/tex/context/base/mkiv/mlib-pps.lua +++ b/tex/context/base/mkiv/mlib-pps.lua @@ -7,7 +7,7 @@ if not modules then modules = { } end modules ['mlib-pps'] = { } local format, gmatch, match, split = string.format, string.gmatch, string.match, string.split -local tonumber, type, unpack = tonumber, type, unpack +local tonumber, type, unpack, next = tonumber, type, unpack, next local round, sqrt, min, max = math.round, math.sqrt, math.min, math.max local insert, remove, concat = table.insert, table.remove, table.concat local Cs, Cf, C, Cg, Ct, P, S, V, Carg = lpeg.Cs, lpeg.Cf, lpeg.C, lpeg.Cg, lpeg.Ct, lpeg.P, lpeg.S, lpeg.V, lpeg.Carg diff --git a/tex/context/base/mkiv/mlib-pps.mkiv b/tex/context/base/mkiv/mlib-pps.mkiv index a2eb44826..c9d181bf9 100644 --- a/tex/context/base/mkiv/mlib-pps.mkiv +++ b/tex/context/base/mkiv/mlib-pps.mkiv @@ -13,7 +13,7 @@ \unprotect -\registerctxluafile{mlib-pps}{1.001} +\registerctxluafile{mlib-pps}{} %D Todo: catch nested graphics like external figures with dummies. diff --git a/tex/context/base/mkiv/mlib-run.lua b/tex/context/base/mkiv/mlib-run.lua index 93ce1fec2..18bc7e4da 100644 --- a/tex/context/base/mkiv/mlib-run.lua +++ b/tex/context/base/mkiv/mlib-run.lua @@ -29,7 +29,7 @@ approach is way faster than an external <l n='metapost'/> and processing time nears zero.</p> --ldx]]-- -local type, tostring, tonumber = type, tostring, tonumber +local type, tostring, tonumber, next = type, tostring, tonumber, next local gsub, match, find = string.gsub, string.match, string.find local striplines = utilities.strings.striplines local concat, insert, remove = table.concat, table.insert, table.remove diff --git a/tex/context/base/mkiv/mtx-context-arrange.tex b/tex/context/base/mkiv/mtx-context-arrange.tex index a3e6e9db3..e970ac450 100644 --- a/tex/context/base/mkiv/mtx-context-arrange.tex +++ b/tex/context/base/mkiv/mtx-context-arrange.tex @@ -27,8 +27,8 @@ % --printformat : 2UP, etc % --paperformat=spec : paper*print or paperxprint % -% example: context --extra=arrange --printformat=2UP --paperformat=A4*A3,landscape myfile -% +% example: context --extra=arrange --printformat=2UP --paperformat=A4*A3,landscape myfile +% context --extra=arrange --printformat=xy --paperformat=A4*A2 --nx=2 --ny=2 myfile % end help \input mtx-context-common.tex @@ -79,6 +79,20 @@ local printformat = document.arguments.printformat or "" if printformat == "" then printformat = "normal" + elseif string.find(printformat,"xy") then + if false then + context.setuplayout { + nx = document.arguments.nx or 1, + ny = document.arguments.ny or 1, + } + printformat = "XY,\\v!rotated" + else + context.setuppaper { + nx = document.arguments.nx or 1, + ny = document.arguments.ny or 1, + } + printformat = "XY" + end elseif string.find(printformat,".*up") then printformat = "2UP,\\v!rotated" elseif string.find(printformat,".*down") then @@ -107,7 +121,7 @@ local textwidth = arguments.textwidth or "0cm" for i=1,noffiles do local filename = files[i] - if not string.find(filename,"^mtx%-context%-") then + if not string.find(file.basename(filename),"^mtx%-context%-") then context.insertpages ( { filename }, { emptypages }, diff --git a/tex/context/base/mkiv/mtx-context-compare.tex b/tex/context/base/mkiv/mtx-context-compare.tex new file mode 100644 index 000000000..ffa744013 --- /dev/null +++ b/tex/context/base/mkiv/mtx-context-compare.tex @@ -0,0 +1,113 @@ +%D \module +%D [ file=mtx-context-compare, +%D version=2015.07.14, +%D title=\CONTEXT\ Extra Trickry, +%D subtitle=Compare Files, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +% begin help +% +% usage: context --extra=compare [options] file-1 file-2 +% +% example: context --extra=compare file1.pdf file-2.pdf +% +% end help + +\input mtx-context-common.tex + +\starttext + +\starttexdefinition unexpanded ShowBoth #1#2#3 + \startTEXpage + \startoverlay + {\externalfigure[#1][page=#3]} + {\externalfigure[#2][page=#3]} + \stopoverlay + \stopTEXpage +\stoptexdefinition + +\starttexdefinition unexpanded ShowPage #1#2 + \startTEXpage + \externalfigure[#1][page=#2] + \stopTEXpage +\stoptexdefinition + + +\startluacode + +local report = logs.reporter("compare") + +local fileone = document.files[1] or "" +local filetwo = document.files[2] or "" + +if fileone == "" or filetwo == "" then + report("provide two filenames") + os.exit() +end + +if not lfs.isfile(fileone) then + report("unknown file %a",fileone) + os.exit() +end + +if not lfs.isfile(filetwo) then + report("unknown file %a",filetwo) + os.exit() +end + +local function check(name) + local fig = figures.push { name = name } + figures.identify() + figures.check() + local used = fig.used + figures.pop() + return used +end + +local one = check(fileone) +local two = check(filetwo) + +if not one then + report("invalid file %a",fileone) + os.exit() +end + +if not two then + report("invalid file %a",filetwo) + os.exit() +end + +local n_one = tonumber(one.pages) +local n_two = tonumber(two.pages) + +if not n_one or n_one ~= n_two then + report("files have different nofpages (%s vs %s)",n_one or "?",n_two or "?") +end + +if n_one > n_two then + for i=1,n_two do + context.ShowBoth(fileone,filetwo,i) + end + for i=n_two+1,n_one do + context.ShowPage(fileone,i) + end +else + for i=1,n_one do + context.ShowBoth(fileone,filetwo,i) + end + for i=n_one+1,n_two do + context.ShowPage(filetwo,i) + end +end + +\stopluacode + +\stoptext + +\endinput diff --git a/tex/context/base/mkiv/mtx-context-domotica.tex b/tex/context/base/mkiv/mtx-context-domotica.tex index 62e6e8786..83562ee30 100644 --- a/tex/context/base/mkiv/mtx-context-domotica.tex +++ b/tex/context/base/mkiv/mtx-context-domotica.tex @@ -33,6 +33,36 @@ % % end help +%D In case one wonders what domotica has to do with ConTeXt, here is the short +%D story. One day I'll wrap up a long one. +%D +%D After years of keeping an eye on developments and techniques and being somewhat +%D disappointed by experiments, I decided to settle on a local approach for simple +%D domotica (criteria are: stability, full open source, decent scripting, future +%D safe). Eventually I decides to buy a few (overpriced) hue zigbee hubs: one +%D private and one for the office, so that I could create different lightning +%D setups, automatically control light to be turned on and off, etc. Unfortunately +%D those hubs are rather limited in functionality and performance, which is +%D surprising for an otherwise mature product. So (we're speaking mid 2015) I wrote +%D a couple of scripts in \LUA\ that would do the real magic, and only use the hub +%D for controlling the individual lights, buttons and sensors. That way I could +%D create complex arrangements (think of setups for working, reading, talking, +%D either of not in parts or rooms) driven by the available buttons and motion +%D sensors. I really needed multiple sensors and buttons per room, something (again +%D surprisingly) not supported by the hub at that time. It seems that more than a +%D year later functionality that I needed and wrote gets added stepwise to the hub: +%D multiple sensors, multiple use of buttons, etc. Compared to free \TEX\ +%D developments such commercial products evolve slow. +%D +%D In addition to these hubs I bought some zwave devices for controlling heating and +%D a few rf radio things for sunshades. For zwave I uses the same approach: buy a +%D decent hub (the nice popp hub) and control it via \LUA. In fact, I can now use +%D one set of scripts to control a mix of technologies. However, when programming +%D the lot, one needs to have an overview of devices and that is where this module +%D comes into view. In fact, \LUATEX\ was already in view as I wrote the scripts in +%D \LUA, using the \CONTEXT\ helper libraries. And the lots runs on a small low +%D power (<10W) fitlet using stock \LUATEX\ as \LUA\ engine. + % --pattern="e:/domotica/open-zwave/open-zwave-master/config/**.xml" \input mtx-context-common.tex diff --git a/tex/context/base/mkiv/mtx-context-listing.tex b/tex/context/base/mkiv/mtx-context-listing.tex index 41e468e1f..f7c3d2868 100644 --- a/tex/context/base/mkiv/mtx-context-listing.tex +++ b/tex/context/base/mkiv/mtx-context-listing.tex @@ -97,12 +97,15 @@ context.usemodule { "scite" } end - if #document.files > 0 then + local done = false + local files = document.files + + if #files > 0 then if document.arguments.sort then - table.sort(document.files) + table.sort(files) end - for i=1,#document.files do - local filename = document.files[i] + for i=1,#files do + local filename = files[i] if not string.find(filename,"^mtx%-context%-") then local pretty = document.arguments.pretty if pretty == true then @@ -129,9 +132,12 @@ else context.typefile(filename) end + done = true end end - else + end + + if not done then context("no files given") end diff --git a/tex/context/base/mkiv/mtx-context-meaning.tex b/tex/context/base/mkiv/mtx-context-meaning.tex new file mode 100644 index 000000000..88b81ef04 --- /dev/null +++ b/tex/context/base/mkiv/mtx-context-meaning.tex @@ -0,0 +1,87 @@ +%D \module +%D [ file=mtx-context-meaning, +%D version=2018.01.12, +%D title=\CONTEXT\ Extra Trickry, +%D subtitle=Show Meanings, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +% begin help +% +% usage: context --extra=meaning [options] list-of-commands +% +% --pattern : match given pattern +% +% example: context --extra=meaning --pattern=*paper* +% context --extra=meaning setuplayout +% context --extra=meaning setup_layout +% context --extra=meaning --once --noconsole --nostatistics setuplayout +% mtxrun --silent --script context --extra=meaning --once --noconsole --nostatistics setuplayout +% mtxrun --script interface --meaning setuplayout +% +% end help + +\input mtx-context-common.tex + +\setupbodyfont + [dejavu] + +\def\showmeaning#1% + {\ctxlua{logs.pushtarget("both")}% + \writestatus{meaning}{\strippedcsname#1}% + \writestring{}% + \writestring{\expandafter\meaning\begincsname#1\endcsname}% + \ctxlua{logs.poptarget()}} + +\starttext + +\usemodule[setups-macros] + +\startluacode + local h = tex.hashtokens() + + local function showmeaning(str) + local h = interfaces.macros.collect(str) + context("pattern: ") + context.type(str) + context.blank() + for i=1,#h do + local hi = h[i] + context.type(hi) + context.par() + context.showmeaning(hi) + end + context.page() + end + + local done = false + local pattern = document.arguments.pattern + + if pattern then + pattern = { pattern} + else + pattern = document.files + end + + if type(pattern) == "table" then + table.sort(pattern) + for i=1,#pattern do + local p = pattern[i] + if not string.find(p,"^mtx%-context%-") then + done = true + showmeaning(p) + end + end + end + + if not done then + context("no search pattern given") + end +\stopluacode + +\stoptext diff --git a/tex/context/base/mkiv/mtx-context-module.tex b/tex/context/base/mkiv/mtx-context-module.tex new file mode 100644 index 000000000..f8b6d0a54 --- /dev/null +++ b/tex/context/base/mkiv/mtx-context-module.tex @@ -0,0 +1,166 @@ +%D \module +%D [ file=mtx-context-modules, +%D version=2018.02.24, % very old stuff, now also as extra +%D title=\CONTEXT\ Extra Trickry, +%D subtitle=Module TYpesetting, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +%D This is a \TEXEXEC\ features that has been moved to \MKIV. + +% begin help +% +% usage: context --extra=listing [options] list-of-files +% +% end help + +\input mtx-context-common.tex + +\usemodule[scite] +\usemodule[module-basic] + +\dontcomplain + +\starttext + +\startluacode + local find, gsub, match, sub = string.find, string.gsub, string.match, string.sub + local formatters, strip, splitlines, is_empty = string.formatters, string.strip, string.splitlines, string.is_empty + + local types = { + mkiv = "tex", + mkii = "tex", + cld = "lua", + lfg = "lua", + mpiv = "mp", + mpii = "mp", + } + + local function process(inpname,filetype) + local data = io.loaddata(inpname) + if data and data ~= "" then + local result = { } + local skiplevel = 0 + local indocument = false + local indefinition = false + local started = false + local settings = formatters["type=%s"](filetype) + local preamble, n = lpeg.match(lpeg.Cs((1-lpeg.patterns.newline^2)^1) * lpeg.Cp(),data) + local r = 0 + if preamble then + preamble = match(preamble,"\\module.-%[(.-)%]") + if preamble then + preamble = gsub(preamble,"%%D *","") + preamble = gsub(preamble,"%%(.-)[\n\r]","") + preamble = gsub(preamble,"[\n\r]","") + preamble = strip(preamble) + settings = formatters["%s,%s"](settings,preamble) + data = sub(data,n,#data) + end + end + local lines = splitlines(data) + r = r + 1 ; result[r] = formatters["\\startmoduledocumentation[%s]"](settings) + for i=1,#lines do + local line = lines[i] + if find(line,"^%%D ") or find(line,"^%%D$") then + if skiplevel == 0 then + local someline = #line < 3 and "" or sub(line,4,#line) + if indocument then + r = r + 1 ; result[r] = someline + else + if indefinition then + r = r + 1 ; result[r] = "\\stopdefinition" + indefinition = false + end + if not indocument then + r = r + 1 ; result[r] = "\\startdocumentation" + end + r = r + 1 ; result[r] = someline + indocument = true + end + end + elseif find(line,"^%%M ") or find(line,"^%%M$") then + if skiplevel == 0 then + local someline = (#line < 3 and "") or sub(line,4,#line) + r = r + 1 ; result[r] = someline + end + elseif find(line,"^%%S B") then + skiplevel = skiplevel + 1 + elseif find(line,"^%%S E") then + skiplevel = skiplevel - 1 + elseif find(line,"^%%") then + -- nothing + elseif skiplevel == 0 then + inlocaldocument = indocument + inlocaldocument = false + local someline = line + if indocument then + r = r + 1 ; result[r] = "\\stopdocumentation" + indocument = false + end + if indefinition then + if is_empty(someline) then + r = r + 1 ; result[r] = "\\stopdefinition" + indefinition = false + else + r = r + 1 ; result[r] = someline + end + elseif not is_empty(someline) then + r = r + 1 ; result[r] = "\\startdefinition" + indefinition = true + if inlocaldocument then + -- nothing + else + r = r + 1 ; result[r] = someline + end + end + end + end + if indocument then + r = r + 1 ; result[r] = "\\stopdocumentation" + end + if indefinition then + r = r + 1 ; result[r] = "\\stopdefinition" + end + r = r + 1 ; result[r] = "\\stopmoduledocumentation" + result = table.concat(result,"\r") + buffers.assign("module",result) + context.getbuffer { "module" } + end + end + + local pattern = document.arguments.pattern + + if pattern then + document.files = dir.glob(pattern) + end + + local done = false + local files = document.files + + if #files > 0 then + if document.arguments.sort then + table.sort(files) + end + for i=1,#files do + local filename = files[i] + if not find(filename,"^mtx%-context%-") then + local suffix = file.extname(filename) or "" + process(filename,types[suffix] or suffix) + done = true + end + end + end + + if not done then + context("no files given") + end + +\stopluacode + +\stoptext diff --git a/tex/context/base/mkiv/mult-aux.lua b/tex/context/base/mkiv/mult-aux.lua index 353b5e69c..bcd5ae5be 100644 --- a/tex/context/base/mkiv/mult-aux.lua +++ b/tex/context/base/mkiv/mult-aux.lua @@ -7,6 +7,7 @@ if not modules then modules = { } end modules ['mult-aux'] = { } local find = string.find +local next = next interfaces.namespaces = interfaces.namespaces or { } local namespaces = interfaces.namespaces diff --git a/tex/context/base/mkiv/mult-aux.mkiv b/tex/context/base/mkiv/mult-aux.mkiv index a64e09305..96609c4f0 100644 --- a/tex/context/base/mkiv/mult-aux.mkiv +++ b/tex/context/base/mkiv/mult-aux.mkiv @@ -25,11 +25,13 @@ \writestatus{loading}{ConTeXt Multilingual Macros / Helpers} -\registerctxluafile{mult-aux}{1.001} +\registerctxluafile{mult-aux}{} \unprotect -\edef\??empty{\Uchar25} \letvalue{\Uchar25}\empty % cancel: dec:24 hex:18 +\edef\??empty{\Uchar25} \letvalue{\Uchar25}\empty % cancel: dec:24 hex:18 + +%edef\s!parent{\Uchar29} \letvalue{\Uchar29}\empty % + inlining is ugly, a tiny bit faster, but neglectable on a run %D \starttyping %D \unprotect @@ -209,39 +211,22 @@ % % \def\currenttest{oeps} \edef\hans{\detokenizedtestparameter{bagger}}\meaning\hans\par % \def\currenttest{oeps} \edef\hans{\detokenizedtestparameter{reggab}}\meaning\hans\par +% +% slower: \def#3##1{\csname\ifcsname#1#2:##1\endcsname\expandafter\csstring\lastnamedcs\else\expandafter#5\csname#1#2:\s!parent\endcsname{##1}\fi\endcsname}% +% +% pre-expansion can be a bit faster but handly any effect on a normal run so let's go for +% saving some memory \def\mult_interfaces_detokenize{\expandafter\expandafter\expandafter\detokenize\expandafter\expandafter\expandafter} -\unexpanded\def\mult_interfaces_install_parameter_handler#1#2#3#4#5#6#7#8#9% inlining \csname*\endcsname is more efficient (#3 and #6 only) - {\ifx#2\relax\let#2\empty\fi % it is hardly faster but produces less expansion tracing - %\def#3##1{\csname#4{#1#2}{##1}\endcsname}% +\unexpanded\def\mult_interfaces_install_parameter_handler#1#2#3#4#5#6#7#8% inlining \csname*\endcsname is more efficient (#3 and #6 only) + {\ifx#2\relax\let#2\empty\fi % it is hardly faster but produces less expansion tracing \def#3##1{\csname\ifcsname#1#2:##1\endcsname#1#2:##1\else\expandafter#5\csname#1#2:\s!parent\endcsname{##1}\fi\endcsname}% \def#4##1##2{\ifcsname##1:##2\endcsname##1:##2\else\expandafter#5\csname##1:\s!parent\endcsname{##2}\fi}% - %\def#5##1##2{\ifx##1\relax\s!empty\else#4{##1}{##2}\fi}% is {} needed around ##1 ? \def#5##1##2{\ifx##1\relax\??empty\else#4{##1}{##2}\fi}% is {} needed around ##1 ? \def#6##1##2{\csname\ifcsname#1##1:##2\endcsname#1##1:##2\else\expandafter#5\csname#1##1:\s!parent\endcsname{##2}\fi\endcsname}% \def#7##1{\detokenize\expandafter\expandafter\expandafter{\csname#1#2:##1\endcsname}}% always root, no backtrack - % \def#7##1{\mult_interfaces_detokenize{\csname#4{#1#2}{##1}\endcsname}}% compact version - % \def#7##1{\mult_interfaces_detokenize{\csname\ifcsname#1#2:##1\endcsname#1#2:##1\else\expandafter#5\csname#1#2:\s!parent\endcsname{##1}\fi\endcsname}}% -%% \def#8##1{\csname\ifcsname#1#2:##1\endcsname#1#2:##1\else\s!empty\fi\endcsname}% - \def#8##1{\begincsname#1#2:##1\endcsname}% - \def#9##1{\csname#1#2:##1\endcsname}} % can go when we use \begincsname - -% pre-expansion can be a bit faster but handly any effect on a normal run so let's go for -% saving some memory -% -% \unexpanded\def\mult_interfaces_install_parameter_handler#1#2#3#4#5#6#7#8#9% inlining \csname*\endcsname is more efficient (#3 and #6 only) -% {\ifx#2\relax\let#2\empty\fi % it is hardly faster but produces less expansion tracing -% %\def#3##1{\csname#4{#1#2}{##1}\endcsname}% -% \edef#3##1{\noexpand\csname\noexpand\ifcsname#1\noexpand#2:##1\endcsname#1\noexpand#2:##1\noexpand\else\noexpand\expandafter\noexpand#5\noexpand\csname#1\noexpand#2:\s!parent\endcsname{##1}\noexpand\fi\endcsname}% -% \edef#4##1##2{\noexpand\ifcsname##1:##2\endcsname##1:##2\noexpand\else\noexpand\expandafter\noexpand#5\noexpand\csname##1:\s!parent\endcsname{##2}\noexpand\fi}% -% \def #5##1##2{\ifx##1\relax\s!empty\else#4{##1}{##2}\fi}% is {} needed around ##1 ? -% \edef#6##1##2{\noexpand\csname\noexpand\ifcsname#1##1:##2\endcsname#1##1:##2\noexpand\else\noexpand\expandafter\noexpand#5\noexpand\csname#1##1:\s!parent\endcsname{##2}\noexpand\fi\endcsname}% -% \def#7##1{\detokenize\expandafter\expandafter\expandafter{\csname#1#2:##1\endcsname}}% always root, no backtrack -% % \def#7##1{\mult_interfaces_detokenize{\csname#4{#1#2}{##1}\endcsname}}% compact version -% % \def#7##1{\mult_interfaces_detokenize{\csname\ifcsname#1#2:##1\endcsname#1#2:##1\else\expandafter#5\csname#1#2:\s!parent\endcsname{##1}\fi\endcsname}}% -% \edef#8##1{\noexpand\csname\noexpand\ifcsname#1\noexpand#2:##1\endcsname#1\noexpand#2:##1\noexpand\else\s!empty\noexpand\fi\endcsname}% -% \edef#9##1{\noexpand\csname#1#2:##1\endcsname}} + \def#8##1{\begincsname#1#2:##1\endcsname}} \unexpanded\def\installparameterhandler#1#2% {\normalexpanded @@ -253,13 +238,10 @@ \expandafter\noexpand\csname do#2parentparameter\endcsname % or : #2_parent_parameter \expandafter\noexpand\csname named#2parameter\endcsname \expandafter\noexpand\csname detokenized#2parameter\endcsname - \expandafter\noexpand\csname strict#2parameter\endcsname % checked - \expandafter\noexpand\csname direct#2parameter\endcsname}} % unchecked + \expandafter\noexpand\csname direct#2parameter\endcsname}} % strict#2parameter is gone \unexpanded\def\mult_interfaces_install_root_parameter_handler#1#2#3% {\def#2##1{\detokenize\expandafter\expandafter\expandafter{\csname#1:##1\endcsname}}% always root - %\def#3##1{\csname\ifcsname#1:##1\endcsname#1:##1\else\s!empty\fi\endcsname}} - %\def#3##1{\csname\ifcsname#1:##1\endcsname#1:##1\else\??empty\fi\endcsname}} \def#3##1{\begincsname#1:##1\endcsname}} \unexpanded\def\installrootparameterhandler#1#2% @@ -628,7 +610,7 @@ {\def#3##1{\begincsname#1##1\endcsname}% \def#4##1{\detokenize\expandafter\expandafter\expandafter{\csname#1##1\endcsname}}% % \def#4##1{\mult_interfaces_detokenize{\csname\ifcsname#1#2:##1\endcsname#1#2:##1\else\expandafter#5\csname#1#2:\s!parent\endcsname{##1}\fi\endcsname}}% - \def#5##1{\csname#1##1\endcsname}} + \def#5##1{\begincsname#1##1\endcsname}} \unexpanded\def\installdirectparameterhandler#1#2% {\normalexpanded @@ -778,13 +760,13 @@ \newcount\c_mult_interfaces_n_of_namespaces %def\v_interfaces_prefix_template{\number \c_mult_interfaces_n_of_namespaces>} -\def\v_interfaces_prefix_template{\characters\c_mult_interfaces_n_of_namespaces>} +%def\v_interfaces_prefix_template{\characters\c_mult_interfaces_n_of_namespaces>} -\def\v_interfaces_prefix_template % consistently %03i> - {\ifnum\c_mult_interfaces_n_of_namespaces<\plusten00\else\ifnum\c_mult_interfaces_n_of_namespaces<\plushundred0\fi\fi - \number\c_mult_interfaces_n_of_namespaces>} +%def\v_interfaces_prefix_template % consistently %03i> +% {\ifnum\c_mult_interfaces_n_of_namespaces<\plusten00\else\ifnum\c_mult_interfaces_n_of_namespaces<\plushundred0\fi\fi +% \number\c_mult_interfaces_n_of_namespaces>} -\def\v_interfaces_prefix_template % consistently %03i> +\def\v_interfaces_prefix_template {\number\c_mult_interfaces_n_of_namespaces>} \unexpanded\def\installnamespace#1% for modules and users @@ -820,9 +802,8 @@ \letvalue\??dummy\empty -%% \def\dummyparameter #1{\csname\??dummy\ifcsname\??dummy#1\endcsname#1\fi\endcsname} \def\dummyparameter #1{\begincsname\??dummy#1\endcsname} - \def\directdummyparameter#1{\csname\??dummy#1\endcsname} + \def\directdummyparameter#1{\begincsname\??dummy#1\endcsname} \unexpanded\def\setdummyparameter #1{\expandafter\def\csname\??dummy#1\endcsname} \unexpanded\def\letdummyparameter #1{\expandafter\let\csname\??dummy#1\endcsname} diff --git a/tex/context/base/mkiv/mult-chk.mkiv b/tex/context/base/mkiv/mult-chk.mkiv index 9208a73e1..b3005b012 100644 --- a/tex/context/base/mkiv/mult-chk.mkiv +++ b/tex/context/base/mkiv/mult-chk.mkiv @@ -33,7 +33,7 @@ \unprotect -\registerctxluafile{mult-chk}{1.001} +\registerctxluafile{mult-chk}{} \unexpanded\def\setvalidparameterkeys{\dodoubleargument\mult_checkers_set_valid_parameter_keys} \unexpanded\def\addvalidparameterkeys{\dodoubleargument\mult_checkers_add_valid_parameter_keys} diff --git a/tex/context/base/mkiv/mult-def.lua b/tex/context/base/mkiv/mult-def.lua index 7cee595cd..925c22cd2 100644 --- a/tex/context/base/mkiv/mult-def.lua +++ b/tex/context/base/mkiv/mult-def.lua @@ -6589,6 +6589,18 @@ return { ["pe"]="حرفتنظیم", ["ro"]="aliniazacaracter", }, + ["alignmentleftwidth"]={ + ["en"]="alignmentleftwidth", + }, + ["alignmentrightwidth"]={ + ["en"]="alignmentrightwidth", + }, + ["alignmentleftsample"]={ + ["en"]="alignmentleftsample", + }, + ["alignmentrightsample"]={ + ["en"]="alignmentrightsample", + }, ["alignmentcharacter"]={ ["cs"]="alignmentcharacter", ["de"]="alignmentcharacter", @@ -7061,6 +7073,10 @@ return { ["pe"]="وضعیتپایین", ["ro"]="starejos", }, + ["break"]={ + ["en"]="break", + ["nl"]="break", + }, ["buffer"]={ ["en"]="buffer", ["nl"]="buffer", @@ -7813,6 +7829,7 @@ return { }, ["field"]={ ["en"]="field", + ["nl"]="veld", }, ["fieldbackgroundcolor"]={ ["cs"]="barvapozadipole", @@ -7867,6 +7884,9 @@ return { ["filler"]={ ["en"]="filler", }, + ["filter"]={ + ["en"]="filter", + }, ["filtercommand"]={ ["en"]="filtercommand", }, @@ -8183,6 +8203,10 @@ return { ["pe"]="تبدیلسر", ["ro"]="conversietitlu", }, + ["headseparator"]={ + ["en"]="headseparator", + ["nl"]="kopscheider", + }, ["header"]={ ["cs"]="zahlavi", ["de"]="kopfzeile", @@ -9264,6 +9288,11 @@ return { }, ["note"]={ ["en"]="note", + ["nl"]="noot", + }, + ["notes"]={ + ["en"]="notes", + ["nl"]="noten", }, ["nr"]={ ["cs"]="nr", @@ -9834,6 +9863,10 @@ return { ["pe"]="شمارهقبلی", ["ro"]="numarprecedent", }, + ["print"]={ + ["en"]="print", + ["nl"]="print", + }, ["printable"]={ ["cs"]="tisknutelne", ["de"]="druckbar", @@ -10271,6 +10304,12 @@ return { ["pe"]="همانصفحه", ["ro"]="aceeasipagina", }, + ["leftsample"]={ + ["en"]="leftsample", + }, + ["rightsample"]={ + ["en"]="rightsample", + }, ["sample"]={ ["cs"]="vzor", ["de"]="muster", @@ -10450,6 +10489,18 @@ return { ["pe"]="فضایکناریقبل", ["ro"]="spatiulateralinainte", }, + ["sidespaceinbetween"]={ + ["en"]="sidespaceinbetween", + ["nl"]="zijtussenwit", + }, + ["spaceafterside"]={ + ["en"]="spaceafterside", + ["nl"]="witnazij", + }, + ["spacebeforeside"]={ + ["en"]="spacebeforeside", + ["nl"]="witvoorzij", + }, ["sign"]={ ["cs"]="znak", ["de"]="zeichen", @@ -10713,6 +10764,14 @@ return { ["pe"]="بست", ["ro"]="strut", }, + ["numberstrut"]={ + ["en"]="numberstrut", + ["nl"]="nummerstrut", + }, + ["titlestrut"]={ + ["en"]="titlestrut", + ["nl"]="titelstrut", + }, ["style"]={ ["cs"]="pismeno", ["de"]="stil", @@ -11032,6 +11091,15 @@ return { ["threshold"]={ ["en"]="threshold", }, + ["sidethreshold"]={ + ["en"]="sidethreshold", + }, + ["displaythreshold"]={ + ["en"]="displaythreshold", + }, + ["inlinethreshold"]={ + ["en"]="inlinethreshold", + }, ["title"]={ ["cs"]="titul", ["de"]="titel", @@ -11052,6 +11120,10 @@ return { ["pe"]="رنگعنوان", ["ro"]="culoaretitlu", }, + ["simplecommand"]={ + ["en"]="simplecommand", + ["nl"]="simpelcommando", + }, ["titlecommand"]={ ["cs"]="titlecommand", ["de"]="titlecommand", @@ -13340,6 +13412,10 @@ return { ["pe"]="فوریه", ["ro"]="februarie", }, + ["field"]={ + ["en"]="field", + ["nl"]="veld", + }, ["figure"]={ ["cs"]="obrazek", ["de"]="abbildung", @@ -16351,6 +16427,10 @@ return { ["pe"]="ایست", ["ro"]="stopper", }, + ["nostopper"]={ + ["en"]="nostopper", + ["nl"]="geenafsluiter", + }, ["stretch"]={ ["cs"]="natahnout", ["de"]="strecken", diff --git a/tex/context/base/mkiv/mult-fun.lua b/tex/context/base/mkiv/mult-fun.lua index df127eb5c..9b7062605 100644 --- a/tex/context/base/mkiv/mult-fun.lua +++ b/tex/context/base/mkiv/mult-fun.lua @@ -11,7 +11,7 @@ return { -- "originlength", "tickstep ", "ticklength", -- "autoarrows", "ahfactor", -- "angleoffset", anglelength", anglemethod", - "ahvariant", "ahdimple", "ahfactor", + "ahvariant", "ahdimple", "ahfactor", "ahscale", "metapostversion", "maxdimensions", "drawoptionsfactor", @@ -19,11 +19,12 @@ return { "crossingscale", "crossingoption", }, commands = { - "loadmodule", "dispose", "nothing", "transparency", "tolist", "topath", "tocycle", + "loadfile", "loadimage", "loadmodule", + "dispose", "nothing", "transparency", "tolist", "topath", "tocycle", -- "sqr", "log", "ln", "exp", "inv", "pow", "pi", "radian", "tand", "cotd", "sin", "cos", "tan", "cot", "atan", "asin", "acos", - "invsin", "invcos", "invtan", "acosh", "asinh", "sinh", "cosh", + "invsin", "invcos", "invtan", "acosh", "asinh", "sinh", "cosh", "tanh", "zmod", "paired", "tripled", "unitcircle", "fulldiamond", "unitdiamond", "fullsquare", "unittriangle", "fulltriangle", @@ -35,10 +36,10 @@ return { "smoothed", "cornered", "superellipsed", "randomized", "randomizedcontrols", "squeezed", "enlonged", "shortened", "punked", "curved", "unspiked", "simplified", "blownup", "stretched", "enlarged", "leftenlarged", "topenlarged", "rightenlarged", "bottomenlarged", - "crossed", "laddered", "randomshifted", "interpolated", "paralleled", "cutends", "peepholed", + "crossed", "laddered", "randomshifted", "interpolated", "perpendicular", "paralleled", "cutends", "peepholed", "llenlarged", "lrenlarged", "urenlarged", "ulenlarged", "llmoved", "lrmoved", "urmoved", "ulmoved", - "rightarrow", "leftarrow", "centerarrow", + "rightarrow", "leftarrow", "centerarrow", "drawdoublearrows", "boundingbox", "innerboundingbox", "outerboundingbox", "pushboundingbox", "popboundingbox", "boundingradius", "boundingcircle", "boundingpoint", "crossingunder", "insideof", "outsideof", @@ -62,7 +63,7 @@ return { "checkedbounds", "checkbounds", "strut", "rule", "withmask", "bitmapimage", "colordecimals", "ddecimal", "dddecimal", "ddddecimal", "colordecimalslist", - "textext", "thetextext", "rawtextext", "textextoffset", "texbox", "thetexbox", "rawtexbox", + "textext", "thetextext", "rawtextext", "textextoffset", "texbox", "thetexbox", "rawtexbox", "istextext", "verbatim", "thelabel", "label", "autoalign", diff --git a/tex/context/base/mkiv/mult-ini.lua b/tex/context/base/mkiv/mult-ini.lua index 19585a7fa..b899d25f2 100644 --- a/tex/context/base/mkiv/mult-ini.lua +++ b/tex/context/base/mkiv/mult-ini.lua @@ -9,7 +9,7 @@ if not modules then modules = { } end modules ['mult-ini'] = { local format, gmatch, match, find, sub = string.format, string.gmatch, string.match, string.find, string.sub local lpegmatch = lpeg.match local serialize, concat = table.serialize, table.concat -local rawget, type = rawget, type +local rawget, type, tonumber, next = rawget, type, tonumber, next local context = context local commands = commands diff --git a/tex/context/base/mkiv/mult-ini.mkiv b/tex/context/base/mkiv/mult-ini.mkiv index 8fd0d9472..d66749d14 100644 --- a/tex/context/base/mkiv/mult-ini.mkiv +++ b/tex/context/base/mkiv/mult-ini.mkiv @@ -11,27 +11,25 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -%D This module is a stripped down version of \type {mult-ini.tex}, -%D which we keep around as \type {mult-kep.tex} for sentimental -%D reasons. There you will find some more historic information. +%D This module is a stripped down version of \type {mult-ini.tex}, which we keep +%D around as \type {mult-kep.tex} for sentimental reasons. There you will find some +%D more historic information. \writestatus{loading}{ConTeXt Multilingual Macros / Initialization} \unprotect -\registerctxluafile{mult-ini}{1.001} +\registerctxluafile{mult-ini}{} %D \macros %D [constanten,variabelen,commands] %D {v!,c!,k!,s!,e!,m!,l!,r!,f!,p!,x!,y!} %D -%D In the system modules we introduced some prefixed constants, -%D variables (both macros) and registers. Apart from a -%D tremendous saving in terms of memory and a gain in speed we -%D use from now on prefixes when possible for just another -%D reason: consistency and multi||linguality. Systematically -%D using prefixed macros enables us to implement a -%D multi||lingual user interface. Redefining these next set of +%D In the system modules we introduced some prefixed constants, variables (both +%D macros) and registers. Apart from a tremendous saving in terms of memory and a +%D gain in speed we use from now on prefixes when possible for just another reason: +%D consistency and multi||linguality. Systematically using prefixed macros enables +%D us to implement a multi||lingual user interface. Redefining these next set of %D prefixes therefore can have desastrous results. %D %D \startlinecorrection @@ -50,9 +48,9 @@ %D \stoptable %D \stoplinecorrection %D -%D In the single||lingual version we used \type{!}, \type{!!}, -%D \type{!!!} and \type{!!!!}. In the meantime some of these -%D are obsolete (we had some 12 originally). +%D In the single||lingual version we used \type {!}, \type {!!}, \type {!!!} and +%D \type {!!!!}. In the meantime some of these are obsolete (we had some 12 +%D originally). \def\c!prefix!{c!} \def\k!prefix!{k!} @@ -66,18 +64,16 @@ %D [constants,variables,commands] %D {@@,??} %D -%D Variables generated by the system can be recognized on their -%D prefix \type{@@}. They are composed of a command (class) -%D specific tag, which can be recognized on \type{??}, and a -%D system constant, which has the prefix \type{c!}. We'll se -%D some more of this. +%D Variables generated by the system can be recognized on their prefix \type {@@}. +%D They are composed of a command (class) specific tag, which can be recognized on +%D \type {??}, and a system constant, which has the prefix \type {c!}. We'll se some +%D more of this. \def\??prefix {??} \def\@@prefix {@@} -%D Just to be complete we repeat some of the already defined -%D system constants here. Maybe their prefix \type{\s!} now -%D falls into place. +%D Just to be complete we repeat some of the already defined system constants here. +%D Maybe their prefix \type {\s!} now falls into place. \def\s!next {next} \def\s!default {default} \def\s!dummy {dummy} \def\s!unknown {unknown} @@ -90,26 +86,24 @@ \def\s!true {true} \def\s!false {false} -%D The word \type{height} takes 6~token memory cells. The -%D control sequence \type{\height} on the other hand uses only -%D one. Knowing this, we can improve the performance of \TEX, -%D both is terms of speed and memory usage, by using control +%D The word \type {height} takes 6~token memory cells. The control sequence \type +%D {\height} on the other hand uses only one. Knowing this, we can improve the +%D performance of \TEX, both is terms of speed and memory usage, by using control %D sequences instead of the words written in full. %D -%D Where in the \ASCII\ file the second lines takes nine extra -%D characters, \TEX\ saves us 13~tokens. +%D Where in the \ASCII\ file the second lines takes nine extra characters, \TEX\ +%D saves us 13~tokens. %D %D \starttyping %D \hrule width 10pt height 2pt depth 1pt %D \hrule \s!width 10pt \s!height 2pt \s!depth 1pt %D \stoptyping %D -%D One condition is that we have defined \type {\s!height}, -%D \type {\s!width} and \type {\s!depth} as respectively -%D \type {height}, \type {width} and \type {depth}. Using this -%D scheme therefore only makes sense when a token sequence is -%D used more than once. Savings like this should of course be -%D implemented in english, just because \TEX\ is english. +%D One condition is that we have defined \type {\s!height}, \type {\s!width} and +%D \type {\s!depth} as respectively \type {height}, \type {width} and \type {depth}. +%D Using this scheme therefore only makes sense when a token sequence is used more +%D than once. Savings like this should of course be implemented in english, just +%D because \TEX\ is english. \def\s!width {width} \let\!!width \s!width % obsolete \def\s!height{height} \let\!!height\s!height % obsolete @@ -142,19 +136,16 @@ %D definemessageconstant, %D definefileconstant} %D -%D The first part of this module is dedicated to dealing with -%D multi||lingual constants and variables. When \CONTEXT\ grew -%D bigger and bigger in terms of bytes and used string space, -%D we switched to predefined constants. At the cost of more -%D hash table entries, the macros not only becase more compact, -%D they became much faster too. Maybe an even bigger advantage -%D was that mispelling could no longer lead to problems. Even a -%D multi||lingual interface became possible. +%D The first part of this module is dedicated to dealing with multi||lingual +%D constants and variables. When \CONTEXT\ grew bigger and bigger in terms of bytes +%D and used string space, we switched to predefined constants. At the cost of more +%D hash table entries, the macros not only becase more compact, they became much +%D faster too. Maybe an even bigger advantage was that mispelling could no longer +%D lead to problems. Even a multi||lingual interface became possible. %D -%D Constants --- we'll introduce the concept of variables later -%D on --- are preceded by a type specific prefix, followed by a -%D \type{!}. To force consistency, we provide a few commands -%D for defining such constants. +%D Constants |<|we'll introduce the concept of variables later on|>| are preceded by +%D a type specific prefix, followed by a \type {!}. To force consistency, we provide +%D a few commands for defining such constants. %D %D \starttyping %D \defineinterfaceconstant {name} {meaning} @@ -192,10 +183,9 @@ \unexpanded\def\definesystemconstant #1{\expandafter\def\csname\s!prefix!#1\endcsname{#1}} \unexpanded\def\definemessageconstant #1{\expandafter\def\csname\m!prefix!#1\endcsname{#1}} -%D In a parameter driven system, some parameters are shared -%D by more system components. In \CONTEXT\ we can distinguish -%D parameters by a unique prefix. Such a prefix is defined -%D with: +%D In a parameter driven system, some parameters are shared by more system +%D components. In \CONTEXT\ we can distinguish parameters by a unique prefix. Such a +%D prefix is defined with: %D %D \starttyping %D \definesystemvariable {name} @@ -209,16 +199,14 @@ %D {selectinterface, %D defaultinterface, currentinterface, currentresponses} %D -%D With \type{\selectinterface} we specify the language we are -%D going to use. The system asks for the language wanted, and -%D defaults to \type{\currentinterface} when we just give -%D \type{enter}. By default the message system uses the -%D current interface language, but \type{\currentresponses} -%D can specify another language too. +%D With \type {\selectinterface} we specify the language we are going to use. The +%D system asks for the language wanted, and defaults to \type {\currentinterface} +%D when we just give \type {enter}. By default the message system uses the current +%D interface language, but \type {\currentresponses} can specify another language +%D too. %D -%D Because we want to generate formats directly too, we do -%D not ask for interface specifications when these are already -%D defined (like in cont-nl.tex and alike). +%D Because we want to generate formats directly too, we do not ask for interface +%D specifications when these are already defined (like in cont-nl.tex and alike). \ifdefined\defaultinterface @@ -257,9 +245,8 @@ %D \macros %D {startinterface} %D -%D Sometimes we want to define things only for specific -%D interface languages. This can be done by means of the -%D selector: +%D Sometimes we want to define things only for specific interface languages. This +%D can be done by means of the selector: %D %D \starttyping %D \startinterface language @@ -273,24 +260,22 @@ {\doifnot{#1}{all}{\doifnotinset\currentinterface{#1}{\gobbleuntil\stopinterface}}} \let\stopinterface\relax - + %D \macros %D {startmessages, %D getmessage, %D showmessage, %D makemessage} %D -%D A package as large as \CONTEXT\ can hardly function without -%D a decent message mechanism. Due to its multi||lingual -%D interface, the message subsystem has to be multi||lingual -%D too. A major drawback of this feature is that we have to -%D code messages. As a result, the source becomes less self -%D documented. On the other hand, consistency will improve. +%D A package as large as \CONTEXT\ can hardly function without a decent message +%D mechanism. Due to its multi||lingual interface, the message subsystem has to be +%D multi||lingual too. A major drawback of this feature is that we have to code +%D messages. As a result, the source becomes less self documented. On the other +%D hand, consistency will improve. %D -%D Because the overhead in terms of entries in the (already -%D exhausted) hash table has to be minimal, messages are packed -%D in libraries. We can extract a message from such a library -%D in three ways: +%D Because the overhead in terms of entries in the (already exhausted) hash table +%D has to be minimal, messages are packed in libraries. We can extract a message +%D from such a library in three ways: %D %D \starttyping %D \getmessage {library} {tag} @@ -298,13 +283,11 @@ %D \makemessage {library} {tag} {data} %D \stoptyping %D -%D The first command gets the message \type{tag} from the -%D \type{library} specified. The other commands take an extra -%D argument: a list of items to be inserted in the message -%D text. While \type{\showmessage} shows the message at the -%D terminal, the other commands generate the message as text. -%D Before we explain the \type{data} argument, we give an -%D example of a library. +%D The first command gets the message \type {tag} from the \type {library} +%D specified. The other commands take an extra argument: a list of items to be +%D inserted in the message text. While \type {\showmessage} shows the message at the +%D terminal, the other commands generate the message as text. Before we explain the +%D \type {data} argument, we give an example of a library. %D %D \starttyping %D \startmessages english library: alfa @@ -332,12 +315,11 @@ %D something : second (and last) message to you %D \stoptyping %D -%D As we can see, the title entry is shown with the message. -%D The data fields are comma separated and are specified in the -%D message text by \type{--}. +%D As we can see, the title entry is shown with the message. The data fields are +%D comma separated and are specified in the message text by \type {--}. %D -%D It is not required to define all messages in a library at -%D once. We can add messages to a library in the following way: +%D It is not required to define all messages in a library at once. We can add +%D messages to a library in the following way: %D %D \starttyping %D \startmessages english library: alfa @@ -345,21 +327,17 @@ %D \stopmessages %D \stoptyping %D -%D Because such definitions can take place in different -%D modules, the system gives a warning when a tag occurs more -%D than once. The first occurrence takes preference over later -%D ones, so we had better use a save offset, as shown in the -%D example. As we can see, the title field is specified only -%D the first time! +%D Because such definitions can take place in different modules, the system gives a +%D warning when a tag occurs more than once. The first occurrence takes preference +%D over later ones, so we had better use a save offset, as shown in the example. As +%D we can see, the title field is specified only the first time! %D -%D Because we want to check for duplicate tags, the macros -%D are a bit more complicated than neccessary. The \NEWLINE\ -%D token is used as message separator. +%D Because we want to check for duplicate tags, the macros are a bit more +%D complicated than neccessary. The \NEWLINE\ token is used as message separator. +%D +%D For internal purposes one can use \type {\setmessagetext}, which puts the message +%D text asked for in \type {\currentmessagetext}. %D -%D For internal purposes one can use \type {\setmessagetext}, -%D which puts the message text asked for in \type -%D {\currentmessagetext}. - %D These will become obsolete: \unexpanded\def\startmessages #1 library: #2 % @@ -399,17 +377,16 @@ %D \macros %D {ifshowwarnings, ifshowmessages} %D -%D Sometimes displaying message can slow down processing -%D considerably. We therefore introduce warnings. Users can -%D turn of warnings and messages by saying: +%D Sometimes displaying message can slow down processing considerably. We therefore +%D introduce warnings. Users can turn of warnings and messages by saying: %D %D \starttyping %D \showwarningstrue %D \showmessagestrue %D \stoptyping %D -%D Turning off messages also turns off warnings, which is -%D quote logical because they are less important. +%D Turning off messages also turns off warnings, which is quote logical because they +%D are less important. % not yet mkiv @@ -435,13 +412,12 @@ %D \macros %D {dosetvalue,dosetevalue,dosetgvalue,dosetxvalue,docopyvalue,doresetvalue} % dogetvalue %D -%D We already defined these auxiliary macros in the system -%D modules. Starting with this module however, we have to take -%D multi||linguality a bit more serious. - -%D In due time, when we exclusively use the parameter handler code, we can drop -%D the backmapping (\type{\c!k...}) and make \type {\c!c...} similar to -%D \type {\v!...}. In that case we can simply the following setters. +%D We already defined these auxiliary macros in the system modules. Starting with +%D this module however, we have to take multi||linguality a bit more serious. +%D +%D In due time, when we exclusively use the parameter handler code, we can drop the +%D backmapping (\type{\c!k...}) and make \type {\c!c...} similar to \type {\v!...}. +%D In that case we can simply the following setters. \unexpanded\def\doletvalue #1#2{\expandafter\let \csname#1\ifcsname\k!prefix!#2\endcsname\csname\k!prefix!#2\endcsname\else#2\fi\endcsname} \unexpanded\def\dosetvalue #1#2{\expandafter\def \csname#1\ifcsname\k!prefix!#2\endcsname\csname\k!prefix!#2\endcsname\else#2\fi\endcsname} @@ -476,16 +452,16 @@ \stopinterface -%D We can now redefine some messages that will be -%D introduced in the multi||lingual system module. +%D We can now redefine some messages that will be introduced in the multi||lingual +%D system module. \unexpanded\def\showassignerror #1#2{\showmessage\m!check1{#1,#2}\waitonfatalerror} \unexpanded\def\showargumenterror#1#2{\showmessage\m!check2{#1,#2}\waitonfatalerror} \unexpanded\def\showdefinederror #1#2{\showmessage\m!check3{#1,#2}\waitonfatalerror} -%D \CONTEXT\ is a parameter driven package. This means that -%D users instruct the system by means of variables, values and -%D keywords. These instructions take the form: +%D \CONTEXT\ is a parameter driven package. This means that users instruct the +%D system by means of variables, values and keywords. These instructions take the +%D form: %D %D \starttyping %D \setupsomething[some variable=some value, another one=a keyword] @@ -497,13 +473,11 @@ %D \dosomething[this way,that way,no way] %D \stoptyping %D -%D Because the same variables can occur in more than one setup -%D command, we have to be able to distinguish them. This is -%D achieved by assigning them a unique prefix. +%D Because the same variables can occur in more than one setup command, we have to +%D be able to distinguish them. This is achieved by assigning them a unique prefix. %D -%D Imagine a setup command for boxed text, that enables us to -%D specify the height and width of the box. Behide the scenes -%D the command +%D Imagine a setup command for boxed text, that enables us to specify the height and +%D width of the box. Behide the scenes the command %D %D \starttyping %D \setupbox [width=12cm, height=3cm] @@ -517,16 +491,16 @@ %D \stoptyping %D %D while a similar command for specifying the page dimensions -%D of an \cap{A4} page results in: +%D of an \cap {A4} page results in: %D %D \starttyping %D \<page><width> {21.0cm} %D \<page><height> {27.9cm} %D \stoptyping %D -%D The prefixes \type{<box>} and \type{<page>} are hidden from -%D users and can therefore be language independant. Variables -%D on the other hand, differ for each language: +%D The prefixes \type {<box>} and \type {<page>} are hidden from users and can +%D therefore be language independant. Variables on the other hand, differ for each +%D language: %D %D \starttyping %D \<box><color> {<blue>} @@ -534,28 +508,24 @@ %D \<box><couleur> {<blue>} %D \stoptyping %D -%D In this example we can see that the assigned values or -%D keywords are language dependant too. This will be a -%D complication when defining multi||lingual setup files. +%D In this example we can see that the assigned values or keywords are language +%D dependant too. This will be a complication when defining multi||lingual setup +%D files. %D -%D A third phenomena is that variables and values can have a -%D similar meaning. +%D A third phenomena is that variables and values can have a similar meaning. %D %D \starttyping %D \<pagenumber><location> {<left>} %D \<skip><left> {12cm} %D \stoptyping %D -%D A (minor) complication is that where in english we use -%D \type{<left>}, in dutch we find both \type{<links>} and -%D \type{<linker>}. This means that when we use some sort of -%D translation table, we have to distinguish between the -%D variables at the left side and the fixed values at the -%D right. +%D A (minor) complication is that where in english we use \type {<left>}, in dutch +%D we find both \type {<links>} and \type {<linker>}. This means that when we use +%D some sort of translation table, we have to distinguish between the variables at +%D the left side and the fixed values at the right. %D -%D The same goes for commands that are composed of different -%D user supplied and/or language specific elements. In english -%D we can use: +%D The same goes for commands that are composed of different user supplied and/or +%D language specific elements. In english we can use: %D %D \starttyping %D \<empty><figure> @@ -569,14 +539,13 @@ %D \<leeg><intermezzo> %D \stoptyping %D -%D These subtle differences automatically lead to a solution -%D where variables, values, elements and other components have -%D a similar logical name (used in macro's) but a different -%D meaning (supplied by the user). +%D These subtle differences automatically lead to a solution where variables, +%D values, elements and other components have a similar logical name (used in +%D macro's) but a different meaning (supplied by the user). %D -%D Our solution is one in which the whole system is programmed -%D in terms of identifiers with language specific meanings. In -%D such an implementation, each fixed variable is available as: +%D Our solution is one in which the whole system is programmed in terms of +%D identifiers with language specific meanings. In such an implementation, each +%D fixed variable is available as: %D %D \starttyping %D \<prefix><variable> @@ -594,75 +563,66 @@ %D \def\boxwidth{12cm} %D \stoptyping %D -%D because we don't want to recode the source, a setup command -%D in another language has to expand to this variable, so: +%D because we don't want to recode the source, a setup command in another language +%D has to expand to this variable, so: %D %D \starttyping %D \setupblock[width=12cm] %D \stoptyping %D -%D has to result in the definition of \type{\boxwidth} too. -%D This method enables us to build compact, fast and readable -%D code. +%D has to result in the definition of \type {\boxwidth} too. This method enables us +%D to build compact, fast and readable code. %D -%D An alternative method, which we considered using, uses a -%D more indirect way. In this case, both calls generate a -%D different variable: +%D An alternative method, which we considered using, uses a more indirect way. In +%D this case, both calls generate a different variable: %D %D \starttyping %D \def\boxwidth {12cm} %D \def\boxbreedte {12cm} %D \stoptyping %D -%D And because we don't want to recode those megabytes of -%D already developed code, this variable has to be called with -%D something like: +%D And because we don't want to recode those megabytes of already developed code, +%D this variable has to be called with something like: %D %D \starttyping %D \valueof\box\width %D \stoptyping %D -%D where \type{\valueof} takes care of the translation of -%D \type{width} or \type{breedte} to \type{width} and -%D combining this with \type{box} to \type{\boxwidth}. +%D where \type {\valueof} takes care of the translation of \type {width} or \type +%D {breedte} to \type {width} and combining this with \type {box} to \type +%D {\boxwidth}. %D -%D One advantage of this other scheme is that, within certain -%D limits, we can implement an interface that can be switched -%D to another language at will, while the current approach -%D fixes the interface at startup. There are, by the way, -%D other reasons too for not choosing this scheme. Switching -%D user generated commands is for instance impossible and a -%D dual interface would therefore give a strange mix of -%D languages. +%D One advantage of this other scheme is that, within certain limits, we can +%D implement an interface that can be switched to another language at will, while +%D the current approach fixes the interface at startup. There are, by the way, other +%D reasons too for not choosing this scheme. Switching user generated commands is +%D for instance impossible and a dual interface would therefore give a strange mix +%D of languages. %D -%D Now let's work out the first scheme. Although the left hand -%D of the assignment is a variable from the users point of -%D view, it is a constant in terms of the system. Both -%D \type{width} and \type{breedte} expand to \type{width} -%D because in the source we only encounter \type{width}. Such -%D system constants are presented as +%D Now let's work out the first scheme. Although the left hand of the assignment is +%D a variable from the users point of view, it is a constant in terms of the system. +%D Both \type {width} and \type {breedte} expand to \type {width} because in the +%D source we only encounter \type {width}. Such system constants are presented as %D %D \starttyping %D \c!width %D \stoptyping %D -%D This constant is always equivalent to \type{width}. As we -%D can see, we use \type{c!} to mark this one as constant. Its -%D dutch counterpart is: +%D This constant is always equivalent to \type {width}. As we can see, we use \type +%D {c!} to mark this one as constant. Its dutch counterpart is: %D %D \starttyping %D breedte %D \stoptyping %D -%D When we interpret a setup command each variable is -%D translated to it's \type{c!} counterpart. This means that -%D \type{breedte} and \type{width} expand to \type{breedte} -%D and \type{\c!width} which both expand to \type{width}. That -%D way user variables become system constants. +%D When we interpret a setup command each variable is translated to it's \type{c!} +%D counterpart. This means that \type {breedte} and \type{width} expand to \type +%D {breedte} and \type {\c!width} which both expand to \type {width}. That way user +%D variables become system constants. %D -%D The interpretation is done by means of a general setup -%D command \type{\getparameters} that we introduced in the -%D system module. Let us define some simple setup command: +%D The interpretation is done by means of a general setup command \type +%D {\getparameters} that we introduced in the system module. Let us define some +%D simple setup command: %D %D \starttyping %D \unexpanded\def\setupbox[#1]% @@ -675,27 +635,25 @@ %D \setupbox [width=3cm, height=1cm] %D \stoptyping %D -%D Afterwards we have two variables \type{\@@bxwidth} and -%D \type{\@@bxheight} which have the values \type{3cm} and -%D \type{1cm} assigned. These variables are a combinatiom of -%D the setup prefix \type{\??bx}, which expands to \type{@@bx} -%D and the translated user supplied variables \type{width} and -%D \type{height} or \type{breedte} and \type{hoogte}, -%D depending on the actual language. In dutch we just say: +%D Afterwards we have two variables \type {\@@bxwidth} and \type {\@@bxheight} which +%D have the values \type {3cm} and \type {1cm} assigned. These variables are a +%D combinatiom of the setup prefix \type {\??bx}, which expands to \type {@@bx} and +%D the translated user supplied variables \type {width} and \type {height} or \type +%D {breedte} and \type {hoogte}, depending on the actual language. In dutch we just +%D say: %D %D \starttyping %D \stelblokin [breedte=3cm,hoogte=1cm] %D \stoptyping %D -%D and get ourselves \type{\@@bxwidth} and \type{\@@bxheight} -%D too. In the source of \CONTEXT, we can recognize constants -%D and variables on their leading \type{c!}, \type{v!} etc., -%D prefixes on \type{??} and composed variables on \type{@@}. +%D and get ourselves \type {\@@bxwidth} and \type {\@@bxheight} too. In the source +%D of \CONTEXT, we can recognize constants and variables on their leading \type +%D {c!}, \type {v!} etc., prefixes on \type {??} and composed variables on \type +%D {@@}. %D -%D We already saw that user supplied keywords need some -%D special treatment too. This time we don't translate the -%D keyword, but instead use in the source a variable which -%D meaning depends on the interface language. +%D We already saw that user supplied keywords need some special treatment too. This +%D time we don't translate the keyword, but instead use in the source a variable +%D which meaning depends on the interface language. %D %D \starttyping %D \v!left @@ -711,16 +669,14 @@ %D \v!right=>\dosomethingontheright] %D \stoptyping %D -%D Because variables like \type{\@@bxlocation} can have a lot -%D of meanings, including tricky expandable tokens, we cannot -%D translate this meaning when we compare. This means that -%D \type{\@@bxlocation} can be \type{left} of \type{links} of -%D whatever meaning suits the language. But because -%D \type{\v!left} also has a meaning that suits the language, -%D we are able to compare. +%D Because variables like \type {\@@bxlocation} can have a lot of meanings, +%D including tricky expandable tokens, we cannot translate this meaning when we +%D compare. This means that \type {\@@bxlocation} can be \type {left} of \type +%D {links} of whatever meaning suits the language. But because \type {\v!left} also +%D has a meaning that suits the language, we are able to compare. %D -%D Although we know it sounds confusing we want to state two -%D important characteristics of the interface as described: +%D Although we know it sounds confusing we want to state two important +%D characteristics of the interface as described: %D %D \startnarrower \em %D user variables become system constants @@ -731,11 +687,10 @@ %D \startnarrower \em %D user constants (keywords) become system variables %D \stopnarrower - -%D The \type {\c!internal} is a left over from the time that -%D the user interface documents were not using a specification -%D alongside a keyword specification but used a shared file in -%D which case we need to go in both directions. +%D +%D The \type {\c!internal} is a left over from the time that the user interface +%D documents were not using a specification alongside a keyword specification but +%D used a shared file in which case we need to go in both directions. % temporary mkiv hack (we can best just store the whole table in memory) @@ -750,10 +705,9 @@ %D \macros %D {defineinterfaceconstant} %D -%D Next we redefine a previously defined macro to take care of -%D interface translation too. It's a bit redundant, because -%D in these situations we could use the c||version, but for -%D documentation purposes the x||alternative comes in handy. +%D Next we redefine a previously defined macro to take care of interface translation +%D too. It's a bit redundant, because in these situations we could use the +%D c||version, but for documentation purposes the x||alternative comes in handy. \unexpanded\def\defineinterfaceconstant#1#2% {\expandafter\def\csname\c!prefix!#1\endcsname{#2}} @@ -761,16 +715,14 @@ %D \macros %D {startelements} %D -%D Due to the object oriented nature of \CONTEXT, we also need -%D to define the elements that are used to build commands. +%D Due to the object oriented nature of \CONTEXT, we also need to define the +%D elements that are used to build commands. %D -%D Such elements sometimes are the same in diferent -%D languages, but mostly they differ. Things can get even -%D confusing when we look at for instance the setup commands. -%D In english we say \type{\setup<something>}, but in dutch we -%D have: \type{\stel<iets>in}. Such split elements are no -%D problem, because we just define two elements. When no second -%D part is needed, we use a \type{-}: +%D Such elements sometimes are the same in different languages, but mostly they +%D differ. Things can get even confusing when we look at for instance the setup +%D commands. In english we say \type{\setup<something>}, but in dutch we have: \type +%D {\stel<iets>in}. Such split elements are no problem, because we just define two +%D elements. When no second part is needed, we use a \type {-}: \unexpanded\def\setinterfaceelement#1#2% {\clf_setinterfaceelement{#1}{#2}% @@ -820,15 +772,18 @@ \stopinterface -%D So much for the basic multi||lingual interface commands. The -%D macro's can be enhanced with more testing facilities, but -%D for the moment they suffice. +%D So much for the basic multi||lingual interface commands. The macro's can be +%D enhanced with more testing facilities, but for the moment they suffice. \ifdefined\zwnj \else \edef\zwnj{\directlua{utf.char(\number"200C)}} \fi % needed for cont-pe % maybe to char-utf.mkiv \ifdefined\zwj \else \edef\zwj {\directlua{utf.char(\number"200D)}} \fi % needed for cont-pe % maybe to char-utf.mkiv -%D Out of convenience we define the banners here. This might move -%D to the \LUA\ end. + +%D \macros +%D {contextversion, contextversionnumber, contextversionno, +%D contextbanner, showcontextbanner, formatversion} +%D +%D Out of convenience we define the banners here. This might move to the \LUA\ end. \def\contextbanner {ConTeXt \space @@ -837,28 +792,34 @@ int: \currentinterface/\currentresponses} \unexpanded\def\showcontextbanner - %{\writeline - % \writestring\contextbanner - % \writeline} {\writestatus\m!system\empty \writestatus\m!system\contextbanner \writestatus\m!system\empty} \edef\formatversion - {\the\normalyear .\the\normalmonth.\the\normalday} + {\the\normalyear.\the\normalmonth.\the\normalday} + +\newcount\contextversionno \ifx\contextversion\undefined - \def\contextversion {unknown} - \def\contextversionnumber{0} -\else - %\def\contextversionnumber#1.#2.#3 #4:#5\relax{#1\ifnum#2<10 0\fi#2\ifnum#3<10 0\fi#3 #4:#5} - \def\contextversionnumber#1.#2.#3 #4:#5\relax{#1\ifnum#2<10 0\fi\purenumber{#2}\ifnum#3<10 0\fi\purenumber{#3} #4:#5} - \edef\contextversionnumber{\expandafter\contextversionnumber\contextversion\relax\space\contextmark} + \edef\contextversion{\the\normalyear.\the\normalmonth.\the\normalday\space 00:00} \fi +% \def\contextversionnumber#1.#2.#3 #4:#5\relax{#1\ifnum#2<10 0\fi\purenumber{#2}\ifnum#3<10 0\fi\purenumber{#3} #4:#5} +% \edef\contextversionnumber{\expandafter\contextversionnumber\contextversion\relax\space\contextmark} + +\unexpanded\def \contextversionnumber #1.#2.#3 #4:#5\relax{#1#2#3} + \contextversionno \expandafter\contextversionnumber\contextversion\relax + \edef \contextversionnumber {\the\contextversionno\space\contextmark} + +%D \macros +%D {everydump} +%D +%D This one is only used when we generate the format. + \ifx\undefined\everydump - \newtoks\everydump - \def\dump{\the\everydump\normaldump} + \newtoks\everydump + \def\dump{\the\everydump\normaldump} \fi % \appendtoks \showcontextbanner \to \everydump diff --git a/tex/context/base/mkiv/mult-low.lua b/tex/context/base/mkiv/mult-low.lua index 4501afefb..84b4189dc 100644 --- a/tex/context/base/mkiv/mult-low.lua +++ b/tex/context/base/mkiv/mult-low.lua @@ -29,7 +29,7 @@ return { -- "bigskipamount", "medskipamount", "smallskipamount", -- - "fmtname", "fmtversion", "texengine", "texenginename", "texengineversion", + "fmtname", "fmtversion", "texengine", "texenginename", "texengineversion", "texenginefunctionality", "luatexengine", "pdftexengine", "xetexengine", "unknownengine", -- "etexversion", -- "pdftexversion", "pdftexrevision", @@ -85,6 +85,7 @@ return { -- "fontslantperpoint", "fontinterwordspace", "fontinterwordstretch", "fontinterwordshrink", "fontexheight", "fontemwidth", "fontextraspace", "slantperpoint", + "mathexheight", "mathemwidth", "interwordspace", "interwordstretch", "interwordshrink", "exheight", "emwidth", "extraspace", "mathsupdisplay", "mathsupnormal", "mathsupcramped", "mathsubnormal", "mathsubcombined", "mathaxisheight", "muquad", @@ -123,14 +124,15 @@ return { -- "luastringsep", "!!bs", "!!es", -- - "lefttorightmark", "righttoleftmark", + "lefttorightmark", "righttoleftmark", "lrm", "rlm", + "bidilre", "bidirle", "bidipop", "bidilro", "bidirlo", -- "breakablethinspace", "nobreakspace", "nonbreakablespace", "narrownobreakspace", "zerowidthnobreakspace", "ideographicspace", "ideographichalffillspace", "twoperemspace", "threeperemspace", "fourperemspace", "fiveperemspace", "sixperemspace", - "figurespace", "punctuationspace", "hairspace", + "figurespace", "punctuationspace", "hairspace", "enquad", "emquad", "zerowidthspace", "zerowidthnonjoiner", "zerowidthjoiner", "zwnj", "zwj", - "optionalspace", "asciispacechar", + "optionalspace", "asciispacechar", "softhyphen", -- "Ux", "eUx", "Umathaccents", -- @@ -178,7 +180,7 @@ return { -- "donetrue", "donefalse", "foundtrue", "foundfalse", -- - "inlineordisplaymath","indisplaymath","forcedisplaymath","startforceddisplaymath","stopforceddisplaymath","reqno", + "inlineordisplaymath","indisplaymath","forcedisplaymath","startforceddisplaymath","stopforceddisplaymath","startpickupmath","stoppickupmath","reqno", -- "mathortext", -- @@ -243,6 +245,7 @@ return { "doifelsenextoptional", "doifnextoptionalelse", "doifelsenextoptionalcs", "doifnextoptionalcselse", "doifelsefastoptionalcheck", "doiffastoptionalcheckelse", + "doifelsefastoptionalcheckcs", "doiffastoptionalcheckcselse", "doifelsenextbgroup", "doifnextbgroupelse", "doifelsenextbgroupcs", "doifnextbgroupcselse", "doifelsenextparenthesis", "doifnextparenthesiselse", @@ -260,6 +263,7 @@ return { "doifelsecommon", "doifcommonelse", "doifcommon", "doifnotcommon", "doifinstring", "doifnotinstring", "doifelseinstring", "doifinstringelse", "doifelseassignment", "doifassignmentelse", "docheckassignment", + "doiftext", "doifelsetext", "doiftextelse", "doifnottext", -- "tracingall", "tracingnone", "loggingall", -- @@ -274,7 +278,7 @@ return { "singleexpandafter", "doubleexpandafter", "tripleexpandafter", -- "dontleavehmode", "removelastspace", "removeunwantedspaces", "keepunwantedspaces", - "removepunctuation", + "removepunctuation", "ignoreparskip", "forcestrutdepth", -- "wait", "writestatus", "define", "defineexpandable", "redefine", -- @@ -312,7 +316,7 @@ return { "gobbleoneargument", "gobbletwoarguments", "gobblethreearguments", "gobblefourarguments", "gobblefivearguments", "gobblesixarguments", "gobblesevenarguments", "gobbleeightarguments", "gobbleninearguments", "gobbletenarguments", "gobbleoneoptional", "gobbletwooptionals", "gobblethreeoptionals", "gobblefouroptionals", "gobblefiveoptionals", -- - "dorecurse", "doloop", "exitloop", "dostepwiserecurse", "recurselevel", "recursedepth", "dofastloopcs", "dowith", + "dorecurse", "doloop", "exitloop", "dostepwiserecurse", "recurselevel", "recursedepth", "dofastloopcs", "fastloopindex", "fastloopfinal", "dowith", -- "newconstant", "setnewconstant", "setconstant", "setconstantvalue", "newconditional", "settrue", "setfalse", "settruevalue", "setfalsevalue", @@ -339,7 +343,7 @@ return { -- "offinterlineskip", "oninterlineskip", "nointerlineskip", -- - "strut", "halfstrut", "quarterstrut", "depthstrut", "setstrut", "strutbox", "strutht", "strutdp", "strutwd", "struthtdp", "begstrut", "endstrut", "lineheight", + "strut", "halfstrut", "quarterstrut", "depthstrut", "halflinestrut", "noheightstrut", "setstrut", "strutbox", "strutht", "strutdp", "strutwd", "struthtdp", "strutgap", "begstrut", "endstrut", "lineheight", "leftboundary", "rightboundary", "signalcharacter", -- "ordordspacing", "ordopspacing", "ordbinspacing", "ordrelspacing", @@ -370,7 +374,8 @@ return { -- "startimath", "stopimath", "normalstartimath", "normalstopimath", "startdmath", "stopdmath", "normalstartdmath", "normalstopdmath", - "normalsuperscript", "normalsubscript", + "normalsuperscript", "normalsubscript", "normalnosuperscript", "normalnosubscript", + "superscript", "subscript", "nosuperscript", "nosubscript", -- "uncramped", "cramped", "triggermathstyle", "mathstylefont", "mathsmallstylefont", "mathstyleface", "mathsmallstyleface", "mathstylecommand", "mathpalette", "mathstylehbox", "mathstylevbox", "mathstylevcenter", "mathstylevcenteredhbox", "mathstylevcenteredvbox", @@ -411,7 +416,9 @@ return { "rtlhbox", "ltrhbox", "rtlvbox", "ltrvbox", "rtlvtop", "ltrvtop", "autodirhbox", "autodirvbox", "autodirvtop", "leftorrighthbox", "leftorrightvbox", "leftorrightvtop", - "lefttoright", "righttoleft","synchronizelayoutdirection","synchronizedisplaydirection","synchronizeinlinedirection", + "lefttoright", "righttoleft", "checkedlefttoright", "checkedrighttoleft", + "synchronizelayoutdirection","synchronizedisplaydirection","synchronizeinlinedirection", + "dirlre", "dirrle", "dirlro", "dirrlo", -- "lesshyphens", "morehyphens", "nohyphens", "dohyphens", -- @@ -421,10 +428,12 @@ return { -- "nospace", "nospacing", "dospacing", -- - "naturalhbox", "naturalvbox", "naturalhpack", "naturalvpack", + "naturalhbox", "naturalvbox", "naturalvtop", "naturalhpack", "naturalvpack", -- "frule", -- "compoundhyphenpenalty", + -- + "start", "stop", } } diff --git a/tex/context/base/mkiv/mult-mes.lua b/tex/context/base/mkiv/mult-mes.lua index 979831726..1eb429763 100644 --- a/tex/context/base/mkiv/mult-mes.lua +++ b/tex/context/base/mkiv/mult-mes.lua @@ -490,6 +490,17 @@ return { no = "there is nothing to split", ro = "there is nothing to split", }, + ["floatblocks:14"] = { + en = "float locations will be forced to %a due to exporting", + nl = "blok plaatsing is altijd %a vanwege export", + }, + ["floatblocks:15"] = { + en = "location %a changed to %a due to exporting", + nl = "plaatsing %a vervangen door %a vanwege export", + }, + ["floatblocks:16"] = { + en = "anchor=orange, shift=red, box=green, dummy=blue, line=cyan, depth=magenta, prev=orange", + }, ["floatblocks:1"] = { en = "%a is empty", }, @@ -514,14 +525,14 @@ return { ro = "%a mutat", }, ["floatblocks:4"] = { - cs = "%a umisteno", - de = "%a plaziert", - en = "%a placed", - fr = "%a placé", - it = "%a sistemato", - nl = "%a geplaatst", - no = "%a plassert", - ro = "%a plasat", + cs = "%a umisteno (%s)", + de = "%a plaziert (%s)", + en = "%a placed (%s)", + fr = "%a placé (%s)", + it = "%a sistemato (%s)", + nl = "%a geplaatst (%s)", + no = "%a plassert (%s)", + ro = "%a plasat (%s)", }, ["floatblocks:5"] = { cs = "poradi prizpusobeno", diff --git a/tex/context/base/mkiv/mult-prm.lua b/tex/context/base/mkiv/mult-prm.lua index 956f83636..601a615a0 100644 --- a/tex/context/base/mkiv/mult-prm.lua +++ b/tex/context/base/mkiv/mult-prm.lua @@ -1,17 +1,8 @@ --- the tex table has overlap - return { ["aleph"]={ - "AlephVersion", "Alephminorversion", "Alephrevision", "Alephversion", - "Omegaminorversion", - "Omegarevision", - "Omegaversion", - "boxdir", - "pagebottomoffset", - "pagerightoffset", }, ["etex"]={ "botmarks", @@ -85,9 +76,7 @@ return { "Udelimiterover", "Udelimiterunder", "Uhextensible", - "Uleft", "Umathaccent", ---"Umathaccents", "Umathaxis", "Umathbinbinspacing", "Umathbinclosespacing", @@ -97,7 +86,6 @@ return { "Umathbinordspacing", "Umathbinpunctspacing", "Umathbinrelspacing", ---"Umathbotaccent", "Umathchar", "Umathcharclass", "Umathchardef", @@ -115,7 +103,6 @@ return { "Umathcloserelspacing", "Umathcode", "Umathcodenum", - "Umathcodenumdef", "Umathconnectoroverlapmin", "Umathfractiondelsize", "Umathfractiondenomdown", @@ -137,6 +124,8 @@ return { "Umathlimitbelowbgap", "Umathlimitbelowkern", "Umathlimitbelowvgap", + "Umathnolimitsubfactor", + "Umathnolimitsupfactor", "Umathopbinspacing", "Umathopclosespacing", "Umathopenbinspacing", @@ -210,12 +199,10 @@ return { "Umathunderbarvgap", "Umathunderdelimiterbgap", "Umathunderdelimitervgap", - "Umathnolimitsupfactor", - "Umathnolimitsubfactor", - "Umiddle", + "Unosubscript", + "Unosuperscript", "Uoverdelimiter", "Uradical", - "Uright", "Uroot", "Uskewed", "Uskewedwithdelims", @@ -233,18 +220,19 @@ return { "aligntab", "attribute", "attributedef", - "hyphenpenaltymode", + "automaticdiscretionary", "automatichyphenmode", "automatichyphenpenalty", - "automaticdiscretionary", - "explicithyphenpenalty", - "explicitdiscretionary", + "begincsname", "bodydir", - "boundary", + "bodydirection", "boxdir", + "boxdirection", + "breakafterdirmode", "catcodetable", "clearmarks", "copyfont", + "compoundhyphenmode", "crampeddisplaystyle", "crampedscriptscriptstyle", "crampedscriptstyle", @@ -254,19 +242,27 @@ return { "dvifeedback", "dvivariable", "efcode", - "hjcode", - "firstvalidlanguage", + "etoksapp", + "etokspre", + "expanded", + "expandglyphsinfont", + "explicitdiscretionary", + "explicithyphenpenalty", "fontid", "formatname", "gleaders", - "hyphenationmin", + "hjcode", "hyphenationbounds", + "hyphenationmin", + "hyphenpenaltymode", "ifabsdim", "ifabsnum", + "ifincsname", "ifprimitive", "ignoreligaturesinfont", "initcatcodetable", "insertht", + "lastnamedcs", "lastsavedboxresourceindex", "lastsavedimageresourceindex", "lastsavedimageresourcepages", @@ -278,57 +274,65 @@ return { "letcharcode", "letterspacefont", "linedir", + "linedirection", "localbrokenpenalty", "localinterlinepenalty", "localleftbox", "localrightbox", "lpcode", "luaescapestring", + "luafunction", "luatexbanner", "luatexrevision", "luatexversion", - "luafunction", + "mathdelimitersmode", "mathdir", + "mathdirection", "mathdisplayskipmode", "matheqnogapstep", "mathitalicsmode", "mathnolimitsmode", "mathoption", + "mathpenaltiesmode", + "mathrulesfam", + "mathrulesmode", "mathscriptsmode", + "mathscriptboxmode", "mathstyle", - "mathsurroundskip", "mathsurroundmode", - "mathrulesmode", - "mathrulesfam", - "noboundary", - "nokerns", + "mathsurroundskip", "nohrule", + "nokerns", "noligs", + "normaldeviate", "nospaces", "novrule", - "normaldeviate", "outputbox", "outputmode", + "pagebottomoffset", "pagedir", + "pagedirection", "pageheight", - "pagebottomoffset", "pageleftoffset", "pagerightoffset", "pagetopoffset", "pagewidth", "pardir", + "pardirection", "pdfextension", "pdffeedback", "pdfvariable", "postexhyphenchar", "posthyphenchar", + "prebinoppenalty", "predisplaygapfactor", "preexhyphenchar", "prehyphenchar", + "prerelpenalty", "primitive", "protrudechars", - "protrusionboundary", "pxdimen", + "quitvmode", "randomseed", "rightghost", "rightmarginkern", @@ -344,65 +348,29 @@ return { "suppressfontnotfounderror", "suppressifcsnameerror", "suppresslongerror", - "suppressoutererror", "suppressmathparerror", + "suppressoutererror", + "suppressprimitiveerror", "synctex", "tagcode", "textdir", + "textdirection", + "toksapp", + "tokspre", "tracingfonts", "uniformdeviate", "useboxresource", "useimageresource", - "wordboundary", - -- - "vpack", - "hpack", - "tpack", - "csstring", - "begincsname", - "lastnamedcs", - "toksapp", - "tokspre", - "etoksapp", - "etokspre", }, ["omega"]={ - "OmegaVersion", - "bodydir", - "chardp", - "charht", - "charit", - "charwd", - "leftghost", - "localbrokenpenalty", - "localinterlinepenalty", - "localleftbox", - "localrightbox", - "mathdir", - "odelcode", - "odelimiter", - "omathaccent", - "omathchar", - "omathchardef", - "omathcode", - "oradical", - "pagedir", - "pageheight", - "pagewidth", - "pardir", - "rightghost", - "textdir", + "Omegaminorversion", + "Omegarevision", + "Omegaversion", }, ["pdftex"]={ - "efcode", - "expanded", - "ifincsname", "ifpdfabsdim", "ifpdfabsnum", "ifpdfprimitive", - "leftmarginkern", - "letterspacefont", - "lpcode", "pdfadjustspacing", "pdfannot", "pdfcatalog", @@ -415,8 +383,8 @@ return { "pdfdest", "pdfdestmargin", "pdfdraftmode", - "pdfeachlineheight", "pdfeachlinedepth", + "pdfeachlineheight", "pdfendlink", "pdfendthread", "pdffirstlineheight", @@ -425,24 +393,22 @@ return { "pdffontname", "pdffontobjnum", "pdffontsize", - "pdfxformmargin", "pdfgamma", "pdfgentounicode", "pdfglyphtounicode", "pdfhorigin", "pdfignoreddimen", + "pdfignoreunknownimages", + "pdfimageaddfilename", "pdfimageapplygamma", "pdfimagegamma", "pdfimagehicolor", "pdfimageresolution", "pdfincludechars", "pdfinclusioncopyfonts", - "pdfignoreunknownimages", "pdfinclusionerrorlevel", - "pdfignoreunknownimages", "pdfinfo", "pdfinfoomitdate", - "pdftrailerid", "pdfinsertht", "pdflastannot", "pdflastlinedepth", @@ -457,6 +423,7 @@ return { "pdfliteral", "pdfmapfile", "pdfmapline", + "pdfmajorversion", "pdfminorversion", "pdfnames", "pdfnoligatures", @@ -472,9 +439,9 @@ return { "pdfpageresources", "pdfpagesattr", "pdfpagewidth", + "pdfpkfixeddpi", "pdfpkmode", "pdfpkresolution", - "pdfpkfixeddpi", "pdfprimitive", "pdfprotrudechars", "pdfpxdimen", @@ -491,188 +458,33 @@ return { "pdfsetrandomseed", "pdfstartlink", "pdfstartthread", + "pdfsuppressoptionalinfo", + "pdfsuppressptexinfo", "pdftexbanner", "pdftexrevision", "pdftexversion", - "pdfsuppressptexinfo", - "pdfsuppressoptionalinfo", "pdfthread", "pdfthreadmargin", "pdftracingfonts", "pdftrailer", + "pdftrailerid", "pdfuniformdeviate", "pdfuniqueresname", "pdfvorigin", "pdfxform", "pdfxformattr", + "pdfxformmargin", "pdfxformname", "pdfxformresources", "pdfximage", - "quitvmode", - "rightmarginkern", - "rpcode", - "tagcode", }, ["tex"]={ + " ", "-", "/", - "AlephVersion", - "Alephminorversion", - "Alephrevision", - "Alephversion", - "OmegaVersion", - "Omegaminorversion", - "Omegarevision", - "Omegaversion", - "Udelcode", - "Udelcodenum", - "Udelimiter", - "Udelimiterover", - "Udelimiterunder", - "Uhextensible", "Uleft", - "Umathaccent", ---"Umathaccents", - "Umathaxis", - "Umathbinbinspacing", - "Umathbinclosespacing", - "Umathbininnerspacing", - "Umathbinopenspacing", - "Umathbinopspacing", - "Umathbinordspacing", - "Umathbinpunctspacing", - "Umathbinrelspacing", ---"Umathbotaccent", - "Umathchar", - "Umathcharclass", - "Umathchardef", - "Umathcharfam", - "Umathcharnum", - "Umathcharnumdef", - "Umathcharslot", - "Umathclosebinspacing", - "Umathcloseclosespacing", - "Umathcloseinnerspacing", - "Umathcloseopenspacing", - "Umathcloseopspacing", - "Umathcloseordspacing", - "Umathclosepunctspacing", - "Umathcloserelspacing", - "Umathcode", - "Umathcodenum", - "Umathcodenumdef", - "Umathconnectoroverlapmin", - "Umathfractiondelsize", - "Umathfractiondenomdown", - "Umathfractiondenomvgap", - "Umathfractionnumup", - "Umathfractionnumvgap", - "Umathfractionrule", - "Umathinnerbinspacing", - "Umathinnerclosespacing", - "Umathinnerinnerspacing", - "Umathinneropenspacing", - "Umathinneropspacing", - "Umathinnerordspacing", - "Umathinnerpunctspacing", - "Umathinnerrelspacing", - "Umathlimitabovebgap", - "Umathlimitabovekern", - "Umathlimitabovevgap", - "Umathlimitbelowbgap", - "Umathlimitbelowkern", - "Umathlimitbelowvgap", - "Umathopbinspacing", - "Umathopclosespacing", - "Umathopenbinspacing", - "Umathopenclosespacing", - "Umathopeninnerspacing", - "Umathopenopenspacing", - "Umathopenopspacing", - "Umathopenordspacing", - "Umathopenpunctspacing", - "Umathopenrelspacing", - "Umathoperatorsize", - "Umathopinnerspacing", - "Umathopopenspacing", - "Umathopopspacing", - "Umathopordspacing", - "Umathoppunctspacing", - "Umathoprelspacing", - "Umathordbinspacing", - "Umathordclosespacing", - "Umathordinnerspacing", - "Umathordopenspacing", - "Umathordopspacing", - "Umathordordspacing", - "Umathordpunctspacing", - "Umathordrelspacing", - "Umathoverbarkern", - "Umathoverbarrule", - "Umathoverbarvgap", - "Umathoverdelimiterbgap", - "Umathoverdelimitervgap", - "Umathpunctbinspacing", - "Umathpunctclosespacing", - "Umathpunctinnerspacing", - "Umathpunctopenspacing", - "Umathpunctopspacing", - "Umathpunctordspacing", - "Umathpunctpunctspacing", - "Umathpunctrelspacing", - "Umathquad", - "Umathradicaldegreeafter", - "Umathradicaldegreebefore", - "Umathradicaldegreeraise", - "Umathradicalkern", - "Umathradicalrule", - "Umathradicalvgap", - "Umathrelbinspacing", - "Umathrelclosespacing", - "Umathrelinnerspacing", - "Umathrelopenspacing", - "Umathrelopspacing", - "Umathrelordspacing", - "Umathrelpunctspacing", - "Umathrelrelspacing", - "Umathskewedfractionhgap", - "Umathskewedfractionvgap", - "Umathspaceafterscript", - "Umathstackdenomdown", - "Umathstacknumup", - "Umathstackvgap", - "Umathsubshiftdown", - "Umathsubshiftdrop", - "Umathsubsupshiftdown", - "Umathsubsupvgap", - "Umathsubtopmax", - "Umathsupbottommin", - "Umathsupshiftdrop", - "Umathsupshiftup", - "Umathsupsubbottommax", - "Umathunderbarkern", - "Umathunderbarrule", - "Umathunderbarvgap", - "Umathunderdelimiterbgap", - "Umathunderdelimitervgap", - "Umathnolimitsupfactor", - "Umathnolimitsubfactor", "Umiddle", - "Uoverdelimiter", - "Uradical", "Uright", - "Uroot", - "Uskewed", - "Uskewedwithdelims", - "Ustack", - "Ustartdisplaymath", - "Ustartmath", - "Ustopdisplaymath", - "Ustopmath", - "Usubscript", - "Usuperscript", - "Uunderdelimiter", - "Uvextensible", "above", "abovedisplayshortskip", "abovedisplayskip", @@ -682,18 +494,8 @@ return { "advance", "afterassignment", "aftergroup", - "alignmark", - "aligntab", "atop", "atopwithdelims", - "attribute", - "attributedef", - "hyphenpenaltymode", - "automatichyphenmode", - "automatichyphenpenalty", - "automaticdiscretionary", - "explicithyphenpenalty", - "explicitdiscretionary", "badness", "baselineskip", "batchmode", @@ -701,44 +503,25 @@ return { "belowdisplayshortskip", "belowdisplayskip", "binoppenalty", - "bodydir", "botmark", - "botmarks", "boundary", "box", - "boxdir", "boxmaxdepth", "brokenpenalty", "catcode", - "catcodetable", "char", "chardef", ---"chardp", ---"charht", ---"charit", ---"charwd", "cleaders", - "clearmarks", "closein", "closeout", - "clubpenalties", "clubpenalty", "copy", - "copyfont", "count", "countdef", "cr", - "crampeddisplaystyle", - "crampedscriptscriptstyle", - "crampedscriptstyle", - "crampedtextstyle", "crcr", "csname", - "currentgrouplevel", - "currentgrouptype", - "currentifbranch", - "currentiflevel", - "currentiftype", + "csstring", "day", "deadcycles", "def", @@ -748,32 +531,20 @@ return { "delimiter", "delimiterfactor", "delimitershortfall", - "detokenize", "dimen", "dimendef", - "dimexpr", "directlua", "discretionary", "displayindent", "displaylimits", "displaystyle", - "displaywidowpenalties", "displaywidowpenalty", "displaywidth", "divide", "doublehyphendemerits", "dp", "dump", - "dviextension", - "dvifeedback", - "dvivariable", - "eTeXVersion", - "eTeXminorversion", - "eTeXrevision", - "eTeXversion", "edef", - "efcode", - "hjcode", "else", "emergencystretch", "end", @@ -789,7 +560,6 @@ return { "escapechar", "everycr", "everydisplay", - "everyeof", "everyhbox", "everyjob", "everymath", @@ -798,35 +568,19 @@ return { "exhyphenchar", "exhyphenpenalty", "expandafter", - "expanded", - "expandglyphsinfont", "fam", "fi", "finalhyphendemerits", "firstmark", - "firstmarks", + "firstvalidlanguage", "floatingpenalty", "font", - "fontchardp", - "fontcharht", - "fontcharic", - "fontcharwd", "fontdimen", - "firstvalidlanguage", - "fontid", "fontname", - "formatname", "futurelet", "gdef", - "gleaders", "global", "globaldefs", - "glueexpr", - "glueshrink", - "glueshrinkorder", - "gluestretch", - "gluestretchorder", - "gluetomu", "halign", "hangafter", "hangindent", @@ -838,6 +592,7 @@ return { "hfuzz", "hoffset", "holdinginserts", + "hpack", "hrule", "hsize", "hskip", @@ -846,94 +601,55 @@ return { "hyphenation", "hyphenchar", "hyphenpenalty", - "hyphenationmin", - "hyphenationbounds", "if", - "ifabsdim", - "ifabsnum", "ifcase", "ifcat", - "ifcsname", - "ifdefined", "ifdim", "ifeof", "iffalse", - "iffontchar", "ifhbox", "ifhmode", - "ifincsname", "ifinner", "ifmmode", "ifnum", "ifodd", - "ifpdfabsdim", - "ifpdfabsnum", - "ifpdfprimitive", - "ifprimitive", "iftrue", "ifvbox", "ifvmode", "ifvoid", "ifx", - "ignoreligaturesinfont", "ignorespaces", "immediate", "indent", - "initcatcodetable", "input", "inputlineno", "insert", "insertpenalties", - "interactionmode", - "interlinepenalties", "interlinepenalty", "jobname", "kern", "language", "lastbox", "lastkern", - "lastlinefit", - "lastnodetype", "lastpenalty", - "lastsavedboxresourceindex", - "lastsavedimageresourceindex", - "lastsavedimageresourcepages", "lastskip", - "lastxpos", - "lastypos", - "latelua", "lccode", "leaders", "left", - "leftghost", "lefthyphenmin", - "leftmarginkern", "leftskip", "leqno", "let", - "letcharcode", - "letterspacefont", "limits", - "linedir", "linepenalty", "lineskip", "lineskiplimit", - "localbrokenpenalty", - "localinterlinepenalty", - "localleftbox", - "localrightbox", "long", "looseness", "lower", "lowercase", - "lpcode", - "luaescapestring", - "luatexbanner", - "luatexrevision", - "luatexversion", "mag", "mark", - "marks", "mathaccent", "mathbin", "mathchar", @@ -941,24 +657,12 @@ return { "mathchoice", "mathclose", "mathcode", - "mathdir", - "mathdisplayskipmode", - "matheqnogapstep", "mathinner", - "mathitalicsmode", - "mathnolimitsmode", "mathop", "mathopen", - "mathoption", "mathord", "mathpunct", "mathrel", - "mathrulesmode", - "mathrulesfam", - "mathscriptsmode", - "mathstyle", - "mathsurroundskip", - "mathsurroundmode", "mathsurround", "maxdeadcycles", "maxdepth", @@ -971,225 +675,63 @@ return { "moveleft", "moveright", "mskip", - "muexpr", "multiply", "muskip", "muskipdef", - "mutoglue", "newlinechar", "noalign", "noboundary", "noexpand", "noindent", - "nokerns", - "nohrule", - "noligs", - "nospaces", - "novrule", "nolimits", - "nolocaldirs", - "nolocalwhatsits", "nonscript", "nonstopmode", - "normaldeviate", "nulldelimiterspace", "nullfont", "number", - "numexpr", - "odelcode", - "odelimiter", - "omathaccent", - "omathchar", - "omathchardef", - "omathcode", "omit", "openin", "openout", "or", - "oradical", "outer", "output", - "outputbox", "outputpenalty", "over", "overfullrule", "overline", "overwithdelims", - "pagebottomoffset", "pagedepth", - "pagedir", - "pagediscards", "pagefilllstretch", "pagefillstretch", "pagefilstretch", "pagegoal", - "pageheight", - "pageleftoffset", - "pagerightoffset", "pageshrink", "pagestretch", - "pagetopoffset", "pagetotal", - "pagewidth", "par", - "pardir", "parfillskip", "parindent", "parshape", - "parshapedimen", - "parshapeindent", - "parshapelength", "parskip", "patterns", "pausing", - "pdfadjustspacing", - "pdfannot", - "pdfcatalog", - "pdfcolorstack", - "pdfcolorstackinit", - "pdfcompresslevel", - "pdfcopyfont", - "pdfcreationdate", - "pdfdecimaldigits", - "pdfdest", - "pdfdestmargin", - "pdfdraftmode", - "pdfeachlineheight", - "pdfeachlinedepth", - "pdfendlink", - "pdfendthread", - "pdfextension", - "pdfvariable", - "pdffirstlineheight", - "pdffontattr", - "pdffontexpand", - "pdffontname", - "pdffontobjnum", - "pdffontsize", - "pdfxformmargin", - "pdfgamma", - "pdfgentounicode", - "pdfglyphtounicode", - "pdfhorigin", - "pdfignoreddimen", - "pdfimageaddfilename", - "pdfimageapplygamma", - "pdfimagegamma", - "pdfimagehicolor", - "pdfimageresolution", - "pdfincludechars", - "pdfinclusioncopyfonts", - "pdfinclusionerrorlevel", - "pdfignoreunknownimages", - "pdfinfo", - "pdfinfoomitdate", - "pdftrailerid", - "pdfinsertht", - "pdflastannot", - "pdflastlinedepth", - "pdflastlink", - "pdflastobj", - "pdflastxform", - "pdflastximage", - "pdflastximagepages", - "pdflastxpos", - "pdflastypos", - "pdflinkmargin", - "pdfliteral", - "pdfmapfile", - "pdfmapline", - "pdfminorversion", - "pdfnames", - "pdfnoligatures", - "pdfnormaldeviate", - "pdfobj", - "pdfobjcompresslevel", - "pdfoutline", - "pdfoutput", - "pdfpageattr", - "pdfpagebox", - "pdfpageheight", - "pdfpageref", - "pdfpageresources", - "pdfpagesattr", - "pdfpagewidth", - "pdfpkmode", - "pdfpkresolution", - "pdfpkfixeddpi", - "pdfprimitive", - "pdfprotrudechars", - "pdfpxdimen", - "pdfrandomseed", - "pdfrefobj", - "pdfrefxform", - "pdfrefximage", - "pdfreplacefont", - "pdfrestore", - "pdfretval", - "pdfsave", - "pdfsavepos", - "pdfsetmatrix", - "pdfsetrandomseed", - "pdfstartlink", - "pdfstartthread", - "pdftexbanner", - "pdftexrevision", - "pdftexversion", - "pdfsuppressptexinfo", - "pdfsuppressoptionalinfo", - "pdfthread", - "pdfthreadmargin", - "pdftracingfonts", - "pdftrailer", - "pdfuniformdeviate", - "pdfuniqueresname", - "pdfvorigin", - "pdfxform", - "pdfxformattr", - "pdfxformname", - "pdfxformresources", - "pdfximage", "penalty", "postdisplaypenalty", - "postexhyphenchar", - "posthyphenchar", - "predisplaydirection", - "predisplaygapfactor", "predisplaypenalty", "predisplaysize", - "preexhyphenchar", - "prehyphenchar", "pretolerance", "prevdepth", "prevgraf", - "primitive", - "protected", - "protrudechars", "protrusionboundary", - "pxdimen", - "quitvmode", "radical", "raise", - "randomseed", "read", - "readline", "relax", "relpenalty", "right", - "rightghost", "righthyphenmin", - "rightmarginkern", "rightskip", "romannumeral", - "rpcode", - "saveboxresource", - "saveimageresource", - "savepos", - "savecatcodetable", - "savinghyphcodes", - "savingvdiscards", - "scantextokens", - "scantokens", "scriptfont", "scriptscriptfont", "scriptscriptstyle", @@ -1197,46 +739,28 @@ return { "scriptstyle", "scrollmode", "setbox", - "setfontid", "setlanguage", - "setrandomseed", - "shapemode", "sfcode", "shipout", "show", "showbox", "showboxbreadth", "showboxdepth", - "showgroups", - "showifs", "showlists", "showthe", - "showtokens", "skewchar", "skip", "skipdef", ---"skipexpr", "spacefactor", "spaceskip", "span", "special", "splitbotmark", - "splitbotmarks", - "splitdiscards", "splitfirstmark", - "splitfirstmarks", "splitmaxdepth", "splittopskip", "string", - "suppressfontnotfounderror", - "suppressifcsnameerror", - "suppresslongerror", - "suppressoutererror", - "suppressmathparerror", - "synctex", "tabskip", - "tagcode", - "textdir", "textfont", "textstyle", "the", @@ -1247,39 +771,28 @@ return { "toksdef", "tolerance", "topmark", - "topmarks", "topskip", - "tracingassigns", + "tpack", "tracingcommands", - "tracingfonts", - "tracinggroups", - "tracingifs", "tracinglostchars", "tracingmacros", - "tracingnesting", "tracingonline", "tracingoutput", "tracingpages", "tracingparagraphs", "tracingrestores", - "tracingscantokens", "tracingstats", "uccode", "uchyph", "underline", - "unexpanded", "unhbox", "unhcopy", - "uniformdeviate", "unkern", - "unless", "unpenalty", "unskip", "unvbox", "unvcopy", "uppercase", - "useboxresource", - "useimageresource", "vadjust", "valign", "vbadness", @@ -1290,6 +803,7 @@ return { "vfilneg", "vfuzz", "voffset", + "vpack", "vrule", "vsize", "vskip", @@ -1297,7 +811,6 @@ return { "vss", "vtop", "wd", - "widowpenalties", "widowpenalty", "wordboundary", "write", @@ -1305,17 +818,6 @@ return { "xleaders", "xspaceskip", "year", - -- - "vpack", - "hpack", - "tpack", - "csstring", - "begincsname", - "lastnamedcs", - "toksapp", - "tokspre", - "etoksapp", - "etokspre", }, ["xetex"]={ "XeTeXversion", diff --git a/tex/context/base/mkiv/mult-prm.mkiv b/tex/context/base/mkiv/mult-prm.mkiv index e385341c2..1b9195f41 100644 --- a/tex/context/base/mkiv/mult-prm.mkiv +++ b/tex/context/base/mkiv/mult-prm.mkiv @@ -13,63 +13,95 @@ %D This file is only a helper for generating files that can be used in an %D editor for syntax highlighting. +% local all = table.load("mult-prm.lua") +% local tex = table.tohash(all.tex) +% for k, v in next, all do +% if k ~= "tex" then +% local h = table.tohash(v) +% for k, v in next, h do +% tex[k] = nil +% end +% all[k] = table.sortedkeys(h) +% end +% end +% all.tex = table.sortedkeys(tex) +% print((string.gsub(table.serialize(all,true),' "','\n "'))) + \startluacode context.starttext() - function table.sorted(t) - table.sort(t) - return t - end - local missing = { tex = { - "def", "catcode", "futurelet", "chardef", - "voffset", "hoffset", - "numexpr", "dimexpr", - "write", "dump", "skipdef," }, etex = { - "savingvdiscards", - }, - pdftex = { }, luatex = { }, - aleph = { - "AlephVersion", "Alephminorversion", "Alephrevision", "Alephversion", + pdftex = { -- maybe not complete + "ifpdfabsdim", "ifpdfabsnum", "ifpdfprimitive", "pdfadjustspacing", + "pdfannot", "pdfcatalog", "pdfcolorstack", "pdfcolorstackinit", + "pdfcompresslevel", "pdfcopyfont", "pdfcreationdate", + "pdfdecimaldigits", "pdfdest", "pdfdestmargin", "pdfdraftmode", + "pdfeachlinedepth", "pdfeachlineheight", "pdfendlink", + "pdfendthread", "pdffirstlineheight", "pdffontattr", "pdffontexpand", + "pdffontname", "pdffontobjnum", "pdffontsize", "pdfgamma", + "pdfgentounicode", "pdfglyphtounicode", "pdfhorigin", + "pdfignoreddimen", "pdfignoreunknownimages", "pdfimageaddfilename", + "pdfimageapplygamma", "pdfimagegamma", "pdfimagehicolor", + "pdfimageresolution", "pdfincludechars", "pdfinclusioncopyfonts", + "pdfinclusionerrorlevel", "pdfinfo", "pdfinfoomitdate", + "pdfinsertht", "pdflastannot", "pdflastlinedepth", "pdflastlink", + "pdflastobj", "pdflastxform", "pdflastximage", "pdflastximagepages", + "pdflastxpos", "pdflastypos", "pdflinkmargin", "pdfliteral", + "pdfmapfile", "pdfmapline", "pdfmajorversion", "pdfminorversion", "pdfnames", + "pdfnoligatures", "pdfnormaldeviate", "pdfobj", + "pdfobjcompresslevel", "pdfoutline", "pdfoutput", "pdfpageattr", + "pdfpagebox", "pdfpageheight", "pdfpageref", "pdfpageresources", + "pdfpagesattr", "pdfpagewidth", "pdfpkfixeddpi", "pdfpkmode", + "pdfpkresolution", "pdfprimitive", "pdfprotrudechars", "pdfpxdimen", + "pdfrandomseed", "pdfrefobj", "pdfrefxform", "pdfrefximage", + "pdfreplacefont", "pdfrestore", "pdfretval", "pdfsave", "pdfsavepos", + "pdfsetmatrix", "pdfsetrandomseed", "pdfstartlink", "pdfstartthread", + "pdfsuppressoptionalinfo", "pdfsuppressptexinfo", "pdftexbanner", + "pdftexrevision", "pdftexversion", "pdfthread", "pdfthreadmargin", + "pdftracingfonts", "pdftrailer", "pdftrailerid", "pdfuniformdeviate", + "pdfuniqueresname", "pdfvorigin", "pdfxform", "pdfxformattr", + "pdfxformmargin", "pdfxformname", "pdfxformresources", "pdfximage", }, - omega = { + aleph = { -- we don't bother + "Alephminorversion", "Alephrevision", "Alephversion", + }, + omega = { -- we don't bother "Omegaminorversion", "Omegarevision", "Omegaversion", - "omathcode", "odelcode", "omathchardef", "omathchar", "omathaccent", "odelimiter", "oradical", }, - xetex = { + xetex = { -- we don't bother "XeTeXversion", }, - plain = { - "TeX", - "bgroup", "egroup", "endgraf", "space", "empty", "null", - "newcount", "newdimen", "newskip", "newmuskip", "newbox", "newtoks", "newhelp", "newread", "newwrite", "newfam", "newlanguage", "newinsert", "newif", - "maxdimen", "magstephalf", "magstep", - "frenchspacing", "nonfrenchspacing", "normalbaselines", "obeylines", "obeyspaces", "raggedright", "ttraggedright", - "thinspace", "negthinspace", "enspace", "enskip", "quad", "qquad", - "smallskip", "medskip", "bigskip", "removelastskip", "topglue", "vglue", "hglue", - "break", "nobreak", "allowbreak", "filbreak", "goodbreak", "smallbreak", "medbreak", "bigbreak", - "line", "leftline", "rightline", "centerline", "rlap", "llap", "underbar", "strutbox", "strut", - "cases", "matrix", "pmatrix", "bordermatrix", "eqalign", "displaylines", "eqalignno", "leqalignno", - "pageno", "folio", "tracingall", "showhyphens", "fmtname", "fmtversion", - "hphantom", "vphantom", "phantom", "smash", - }, + -- plain = { + -- "TeX", + -- "bgroup", "egroup", "endgraf", "space", "empty", "null", + -- "newcount", "newdimen", "newskip", "newmuskip", "newbox", "newtoks", "newhelp", "newread", "newwrite", "newfam", "newlanguage", "newinsert", "newif", + -- "maxdimen", "magstephalf", "magstep", + -- "frenchspacing", "nonfrenchspacing", "normalbaselines", "obeylines", "obeyspaces", "raggedright", "ttraggedright", + -- "thinspace", "negthinspace", "enspace", "enskip", "quad", "qquad", + -- "smallskip", "medskip", "bigskip", "removelastskip", "topglue", "vglue", "hglue", + -- "break", "nobreak", "allowbreak", "filbreak", "goodbreak", "smallbreak", "medbreak", "bigbreak", + -- "line", "leftline", "rightline", "centerline", "rlap", "llap", "underbar", "strutbox", "strut", + -- "cases", "matrix", "pmatrix", "bordermatrix", "eqalign", "displaylines", "eqalignno", "leqalignno", + -- "pageno", "folio", "tracingall", "showhyphens", "fmtname", "fmtversion", + -- "hphantom", "vphantom", "phantom", "smash", + -- }, } local primitives = { - tex = table.sorted( table.merged( missing.tex , table.fromhash(tex.primitives()) ) ), - etex = table.sorted( table.merged( missing.etex , tex.extraprimitives('etex') ) ), - pdftex = table.sorted( table.merged( missing.pdftex, tex.extraprimitives('pdftex') ) ), - luatex = table.sorted( table.merged( missing.luatex, tex.extraprimitives('luatex') ) ), - aleph = table.sorted( table.merged( missing.aleph , tex.extraprimitives('aleph') ) ), - omega = table.sorted( table.merged( missing.omega , tex.extraprimitives('omega') ) ), - xetex = table.sorted( table.merged( missing.xetex , { } ) ), + tex = table.sorted( table.merged( missing.tex , tex.extraprimitives("core","tex") ) ), + etex = table.sorted( table.merged( missing.etex , tex.extraprimitives("etex") ) ), + pdftex = table.sorted( table.merged( missing.pdftex, { } ) ), + luatex = table.sorted( table.merged( missing.luatex, tex.extraprimitives("luatex") ) ), + aleph = table.sorted( table.merged( missing.aleph , { } ) ), + omega = table.sorted( table.merged( missing.omega , { } ) ), + xetex = table.sorted( table.merged( missing.xetex , { } ) ), } -- table.remove(primitives.tex,1) -- get rid of \- diff --git a/tex/context/base/mkiv/mult-sys.mkiv b/tex/context/base/mkiv/mult-sys.mkiv index bd3ff9b3d..7000eed7b 100644 --- a/tex/context/base/mkiv/mult-sys.mkiv +++ b/tex/context/base/mkiv/mult-sys.mkiv @@ -61,6 +61,7 @@ \definesystemconstant {gbenglish} \definesystemconstant {gb} \definesystemconstant {german} \definesystemconstant {de} \definesystemconstant {greek} \definesystemconstant {gr} +\definesystemconstant {hebrew} \definesystemconstant {he} \definesystemconstant {hungarian} \definesystemconstant {hu} \definesystemconstant {italian} \definesystemconstant {it} \definesystemconstant {japanese} \definesystemconstant {ja} @@ -268,6 +269,7 @@ \definesystemconstant {internal} \definesystemconstant {current} \definesystemconstant {chain} +\definesystemconstant {class} % translating setups is asking for a mess so we keep them as-is: @@ -302,8 +304,8 @@ \definesystemconstant {ucgreek} \definesystemconstant {sygreek} \definesystemconstant {italics} - -\definesystemconstant {run} +\definesystemconstant {ligatures} +\definesystemconstant {collapsing} \definesystemconstant {default} @@ -362,6 +364,8 @@ \definesystemconstant {kernpairs} \definesystemconstant {mixedcolumn} +\definesystemconstant {ampersand} + %definesystemconstant {property} %definesystemconstant {overprint} %definesystemconstant {layer} @@ -477,6 +481,7 @@ \definemessageconstant {metapost} \definemessageconstant {chemicals} \definemessageconstant {publications} +\definemessageconstant {backend} %D When we use numbers and dimensions the same applies as with the keywords like %D \type {width} and \type {plus} mentioned earlier. @@ -628,47 +633,11 @@ %D The setup files for the language, font, color and special subsystems have a common %D prefix. This means that we have at most three characters for unique filenames. -\definefileconstant {colorprefix} {colo-} -%definefileconstant {encodingprefix} {enco-} -%definefileconstant {filterprefix} {filt-} -\definefileconstant {fontprefix} {font-} -%definefileconstant {handlingprefix} {hand-} -%definefileconstant {javascriptprefix} {java-} -%definefileconstant {languageprefix} {lang-} -%definefileconstant {mathprefix} {math-} -%definefileconstant {metapostprefix} {meta-} -%definefileconstant {regimeprefix} {regi-} -%definefileconstant {specialprefix} {spec-} -\definefileconstant {symbolprefix} {symb-} -\definefileconstant {typeprefix} {type-} -%definefileconstant {xtagprefix} {xtag-} -%definefileconstant {propprefix} {prop-} -%definefileconstant {unicprefix} {unic-} -%definefileconstant {sortprefix} {sort-} -%definefileconstant {prettyprefix} {pret-} - -%definefileconstant {moduleprefix} {m-} -%definefileconstant {styleprefix} {s-} -%definefileconstant {xstyleprefix} {x-} -%definefileconstant {privateprefix} {p-} -%definefileconstant {thirdprefix} {t-} - -%definefileconstant {beforeprefix} {b-} -%definefileconstant {afterprefix} {a-} - -% for old times sake: - -% \defineinterfaceconstant {x} {x} -% \defineinterfaceconstant {xx} {xx} -% \defineinterfaceconstant {em} {em} % will go - -% \defineinterfaceconstant {tf} {tf} -% \defineinterfaceconstant {bf} {bf} -% \defineinterfaceconstant {bs} {bs} -% \defineinterfaceconstant {bi} {bi} -% \defineinterfaceconstant {sl} {sl} -% \defineinterfaceconstant {it} {it} -% \defineinterfaceconstant {sc} {sc} % keep, used elsewhere (or define in mult-def) +\definefileconstant {colo_run} {colo-run} +\definefileconstant {font_run} {font-run} +\definefileconstant {page_run} {page-run} +\definefileconstant {symb_run} {symb-run} +\definefileconstant {publ_tra} {publ-tra} %D For figure inclusion we need(ed): diff --git a/tex/context/base/mkiv/node-acc.lua b/tex/context/base/mkiv/node-acc.lua index dccd7b7c0..03f6d7476 100644 --- a/tex/context/base/mkiv/node-acc.lua +++ b/tex/context/base/mkiv/node-acc.lua @@ -16,13 +16,11 @@ local tonut = nodes.tonut local tonode = nodes.tonode local getid = nuts.getid -local getfield = nuts.getfield local getattr = nuts.getattr local getlist = nuts.getlist local getchar = nuts.getchar local getnext = nuts.getnext -local setfield = nuts.setfield local setattr = nuts.setattr local setlink = nuts.setlink local setchar = nuts.setchar @@ -136,6 +134,8 @@ end) -- -- tasks.appendaction("processors", "words", "nodes.injectspans") -- +-- local pdfpageliteral = nuts.pool.pdfpageliteral +-- -- local function injectspans(head) -- local done = false -- for n in traverse_nodes(tonut(head)) do @@ -144,8 +144,8 @@ end) -- local a = getattr(n,a_hyphenated) -- if a then -- local str = codes[a] --- local b = new_pdfliteral(format("/Span << /ActualText %s >> BDC", lpdf.tosixteen(str))) --- local e = new_pdfliteral("EMC") +-- local b = pdfpageliteral(format("/Span << /ActualText %s >> BDC", lpdf.tosixteen(str))) +-- local e = pdfpageliteral("EMC") -- insert_before(head,n,b) -- insert_after(head,n,e) -- done = true diff --git a/tex/context/base/mkiv/node-aux.lua b/tex/context/base/mkiv/node-aux.lua index c6b276337..84567068b 100644 --- a/tex/context/base/mkiv/node-aux.lua +++ b/tex/context/base/mkiv/node-aux.lua @@ -10,7 +10,8 @@ if not modules then modules = { } end modules ['node-aux'] = { local type, tostring = type, tostring -local nodes, node = nodes, node +local nodes = nodes +local context = context local utfvalues = utf.values @@ -34,11 +35,12 @@ local getlist = nuts.getlist local getfont = nuts.getfont local getchar = nuts.getchar local getattr = nuts.getattr -local getfield = nuts.getfield local getboth = nuts.getboth local getcomponents = nuts.getcomponents local getwidth = nuts.getwidth local setwidth = nuts.setwidth +local getboxglue = nuts.getboxglue +local setboxglue = nuts.setboxglue local setfield = nuts.setfield local setattr = nuts.setattr @@ -456,9 +458,8 @@ local function rehpack(n,width) local size = width or getwidth(n) local temp = hpack_nodes(head,size,"exactly") setwidth(n,size) - setfield(n,"glue_set", getfield(temp,"glue_set")) - setfield(n,"glue_sign", getfield(temp,"glue_sign")) - setfield(n,"glue_order",getfield(temp,"glue_order")) + local set, order, sign = getboxglue(temp) + setboxglue(n,set,order,sign) setlist(temp) flush_node(temp) return n diff --git a/tex/context/base/mkiv/node-bck.lua b/tex/context/base/mkiv/node-bck.lua index abb025b74..4ed5abe5e 100644 --- a/tex/context/base/mkiv/node-bck.lua +++ b/tex/context/base/mkiv/node-bck.lua @@ -26,7 +26,6 @@ local nodepool = nuts.pool local tonode = nuts.tonode local tonut = nuts.tonut -local getfield = nuts.getfield local getnext = nuts.getnext local getprev = nuts.getprev local getid = nuts.getid diff --git a/tex/context/base/mkiv/node-bck.mkiv b/tex/context/base/mkiv/node-bck.mkiv index 58edab668..6bfc43d6a 100644 --- a/tex/context/base/mkiv/node-bck.mkiv +++ b/tex/context/base/mkiv/node-bck.mkiv @@ -21,7 +21,7 @@ \unprotect -\registerctxluafile{node-bck}{1.001} +\registerctxluafile{node-bck}{} % \backgroundvbox[green] {\input tufte } \par % \backgroundvbox[blue] {\input ward } \par diff --git a/tex/context/base/mkiv/node-dir.lua b/tex/context/base/mkiv/node-dir.lua index 6ee5cd4b8..59564ac93 100644 --- a/tex/context/base/mkiv/node-dir.lua +++ b/tex/context/base/mkiv/node-dir.lua @@ -26,14 +26,14 @@ nodes.is_mirrored = allocate { -- RTT = false, } -nodes.is_rotated = allocate { +nodes.is_rotated = allocate { -- used -- TLT = false, -- TRT = false, -- LTL = false, RTT = true, ["+RTT"] = true, } -nodes.textdir_is_parallel = allocate { +nodes.textdir_is_parallel = allocate { -- used TLT = { TLT = true, ["+TLT"] = true, TRT = true, ["+TRT"] = true, @@ -114,7 +114,7 @@ nodes.pardir_is_opposite = allocate { }, } -nodes.textdir_is_opposite = allocate { +nodes.textdir_is_opposite = allocate { -- used TLT = { -- TLT = false, TRT = true, ["+TRT"] = true, @@ -168,7 +168,7 @@ nodes.glyphdir_is_opposite = allocate { }, } -nodes.pardir_is_equal = allocate { +nodes.pardir_is_equal = allocate { -- used TLT = { TLT = true, ["+TLT"] = true, TRT = true, ["+TRT"] = true, @@ -195,7 +195,7 @@ nodes.pardir_is_equal = allocate { }, } -nodes.textdir_is_equal = allocate { +nodes.textdir_is_equal = allocate { -- used TLT = { TLT = true, ["+TLT"] = true, -- TRT = false, @@ -222,7 +222,7 @@ nodes.textdir_is_equal = allocate { }, } -nodes.glyphdir_is_equal = allocate { +nodes.glyphdir_is_equal = allocate { -- used TLT = { TLT = true, ["+TLT"] = true, TRT = true, ["+TRT"] = true, @@ -290,14 +290,14 @@ nodes.glyphdir_is_orthogonal = allocate { -- RTT = false } -nodes.dir_is_pop = allocate { +nodes.dir_is_pop = allocate { -- used ["-TRT"] = true, ["-TLT"] = true, ["-LTL"] = true, ["-RTT"] = true, } -nodes.dir_negation = allocate { +nodes.dir_negation = allocate { -- used ["-TRT"] = "+TRT", ["-TLT"] = "+TLT", ["-LTL"] = "+LTL", diff --git a/tex/context/base/mkiv/node-fin.lua b/tex/context/base/mkiv/node-fin.lua index ffb2ae49e..975eb0bec 100644 --- a/tex/context/base/mkiv/node-fin.lua +++ b/tex/context/base/mkiv/node-fin.lua @@ -19,7 +19,6 @@ local nuts = nodes.nuts local tonode = nuts.tonode local tonut = nuts.tonut -local getfield = nuts.getfield local getnext = nuts.getnext local getprev = nuts.getprev local getid = nuts.getid @@ -124,12 +123,6 @@ function nodes.installattributehandler(plugin) return loadstripped(template)() end --- for the moment: - -local function copied(n) - return copy_node(tonut(n)) -end - -- the injectors local nsdata, nsnone, nslistwise, nsforced, nsselector, nstrigger @@ -163,13 +156,13 @@ function states.finalize(namespace,attribute,head) -- is this one ok? if id == hlist_code or id == vlist_code then local content = getlist(head) if content then - local list = insert_node_before(content,content,copied(nsnone)) -- two return values + local list = insert_node_before(content,content,copy_node(nsnone)) -- two return values if list ~= content then setlist(head,list) end end else - head = insert_node_before(head,head,copied(nsnone)) + head = insert_node_before(head,head,copy_node(nsnone)) end return tonode(head), true, true end @@ -178,17 +171,15 @@ end -- we need to deal with literals too (reset as well as oval) -local function process(namespace,attribute,head,inheritance,default) -- one attribute +local function process(attribute,head,inheritance,default) -- one attribute local stack = head local done = false local check = false local leader = nil while stack do local id = getid(stack) - if id == glyph_code then - check = true - elseif id == disc_code then - check = true -- no longer needed as we flatten replace + if id == glyph_code or id == disc_code then + check = true -- disc no longer needed as we flatten replace elseif id == glue_code then leader = getleader(stack) if leader then @@ -201,7 +192,7 @@ local function process(namespace,attribute,head,inheritance,default) -- one attr if nstrigger and getattr(stack,nstrigger) then local outer = getattr(stack,attribute) if outer ~= inheritance then - local list, ok = process(namespace,attribute,content,inheritance,outer) + local list, ok = process(attribute,content,inheritance,outer) if content ~= list then setlist(stack,list) end @@ -209,7 +200,7 @@ local function process(namespace,attribute,head,inheritance,default) -- one attr done = true end else - local list, ok = process(namespace,attribute,content,inheritance,default) + local list, ok = process(attribute,content,inheritance,default) if content ~= list then setlist(stack,list) end @@ -218,7 +209,7 @@ local function process(namespace,attribute,head,inheritance,default) -- one attr end end else - local list, ok = process(namespace,attribute,content,inheritance,default) + local list, ok = process(attribute,content,inheritance,default) if content ~= list then setlist(stack,list) end @@ -237,12 +228,12 @@ local function process(namespace,attribute,head,inheritance,default) -- one attr if c then if default and c == inheritance then if current ~= default then - head = insert_node_before(head,stack,copied(nsdata[default])) + head = insert_node_before(head,stack,copy_node(nsdata[default])) current = default done = true end elseif current ~= c then - head = insert_node_before(head,stack,copied(nsdata[c])) + head = insert_node_before(head,stack,copy_node(nsdata[c])) current = c done = true end @@ -259,7 +250,7 @@ local function process(namespace,attribute,head,inheritance,default) -- one attr if nstrigger and getattr(stack,nstrigger) then local outer = getattr(stack,attribute) if outer ~= inheritance then - local list, ok = process(namespace,attribute,leader,inheritance,outer) + local list, ok = process(attribute,leader,inheritance,outer) if leader ~= list then setleader(stack,list) end @@ -267,7 +258,7 @@ local function process(namespace,attribute,head,inheritance,default) -- one attr done = true end else - local list, ok = process(namespace,attribute,leader,inheritance,default) + local list, ok = process(attribute,leader,inheritance,default) if leader ~= list then setleader(stack,list) end @@ -276,7 +267,7 @@ local function process(namespace,attribute,head,inheritance,default) -- one attr end end else - local list, ok = process(namespace,attribute,leader,inheritance,default) + local list, ok = process(attribute,leader,inheritance,default) if leader ~= list then setleader(stack,list) end @@ -290,12 +281,12 @@ local function process(namespace,attribute,head,inheritance,default) -- one attr end elseif default and inheritance then if current ~= default then - head = insert_node_before(head,stack,copied(nsdata[default])) + head = insert_node_before(head,stack,copy_node(nsdata[default])) current = default done = true end elseif current > 0 then - head = insert_node_before(head,stack,copied(nsnone)) + head = insert_node_before(head,stack,copy_node(nsnone)) current = 0 done = true end @@ -307,7 +298,7 @@ local function process(namespace,attribute,head,inheritance,default) -- one attr end states.process = function(namespace,attribute,head,default) - local head, done = process(namespace,attribute,tonut(head),default) + local head, done = process(attribute,tonut(head),default) return tonode(head), done end @@ -317,17 +308,16 @@ end -- state changes while the main state stays the same (like two glyphs following -- each other with the same color but different color spaces e.g. \showcolor) -local function selective(namespace,attribute,head,inheritance,default) -- two attributes +local function selective(attribute,head,inheritance,default) -- two attributes + -- local head = head local stack = head local done = false local check = false local leader = nil while stack do local id = getid(stack) - if id == glyph_code then - check = true - elseif id == disc_code then - check = true -- not needed when we flatten replace + if id == glyph_code or id == disc_code then + check = true -- disc no longer needed as we flatten replace elseif id == glue_code then leader = getleader(stack) if leader then @@ -340,7 +330,7 @@ local function selective(namespace,attribute,head,inheritance,default) -- two at if nstrigger and getattr(stack,nstrigger) then local outer = getattr(stack,attribute) if outer ~= inheritance then - local list, ok = selective(namespace,attribute,content,inheritance,outer) + local list, ok = selective(attribute,content,inheritance,outer) if content ~= list then setlist(stack,list) end @@ -348,7 +338,7 @@ local function selective(namespace,attribute,head,inheritance,default) -- two at done = true end else - local list, ok = selective(namespace,attribute,content,inheritance,default) + local list, ok = selective(attribute,content,inheritance,default) if content ~= list then setlist(stack,list) end @@ -357,7 +347,7 @@ local function selective(namespace,attribute,head,inheritance,default) -- two at end end else - local list, ok = selective(namespace,attribute,content,inheritance,default) + local list, ok = selective(attribute,content,inheritance,default) if content ~= list then setlist(stack,list) end @@ -377,7 +367,7 @@ local function selective(namespace,attribute,head,inheritance,default) -- two at if default and c == inheritance then if current ~= default then local data = nsdata[default] - head = insert_node_before(head,stack,copied(data[nsforced or getattr(stack,nsselector) or nsselector])) + head = insert_node_before(head,stack,copy_node(data[nsforced or getattr(stack,nsselector) or nsselector])) current = default if ok then done = true @@ -385,9 +375,11 @@ local function selective(namespace,attribute,head,inheritance,default) -- two at end else local s = getattr(stack,nsselector) + -- local s = nsforced or getattr(stack,nsselector) if current ~= c or current_selector ~= s then local data = nsdata[c] - head = insert_node_before(head,stack,copied(data[nsforced or getattr(stack,nsselector) or nsselector])) + head = insert_node_before(head,stack,copy_node(data[nsforced or s or nsselector])) + -- head = insert_node_before(head,stack,copy_node(data[s or nsselector])) current = c current_selector = s if ok then @@ -398,9 +390,9 @@ local function selective(namespace,attribute,head,inheritance,default) -- two at if leader then -- begin nested if nstrigger and getattr(stack,nstrigger) then - local outer = getatribute(stack,attribute) + local outer = getattr(stack,attribute) if outer ~= inheritance then - local list, ok = selective(namespace,attribute,leader,inheritance,outer) + local list, ok = selective(attribute,leader,inheritance,outer) if leader ~= list then setleader(stack,list) end @@ -408,7 +400,7 @@ local function selective(namespace,attribute,head,inheritance,default) -- two at done = true end else - local list, ok = selective(namespace,attribute,leader,inheritance,default) + local list, ok = selective(attribute,leader,inheritance,default) if leader ~= list then setleader(stack,list) end @@ -417,7 +409,7 @@ local function selective(namespace,attribute,head,inheritance,default) -- two at end end else - local list, ok = selective(namespace,attribute,leader,inheritance,default) + local list, ok = selective(attribute,leader,inheritance,default) if leader ~= list then setleader(stack,list) end @@ -431,12 +423,12 @@ local function selective(namespace,attribute,head,inheritance,default) -- two at elseif default and inheritance then if current ~= default then local data = nsdata[default] - head = insert_node_before(head,stack,copied(data[nsforced or getattr(stack,nsselector) or nsselector])) + head = insert_node_before(head,stack,copy_node(data[nsforced or getattr(stack,nsselector) or nsselector])) current = default done = true end elseif current > 0 then - head = insert_node_before(head,stack,copied(nsnone)) + head = insert_node_before(head,stack,copy_node(nsnone)) current, current_selector, done = 0, 0, true end check = false @@ -447,8 +439,8 @@ local function selective(namespace,attribute,head,inheritance,default) -- two at end states.selective = function(namespace,attribute,head,default) - local head, done = selective(namespace,attribute,tonut(head),default) - return tonode(head), done + local head = selective(attribute,tonut(head),default) + return tonode(head), true end -- Ideally the next one should be merged with the previous but keeping it separate is @@ -460,7 +452,7 @@ end -- Todo: make a better stacker. Keep track (in attribute) about nesting level. Not -- entirely trivial and a generic solution is nicer (compares to the exporter). -local function stacked(namespace,attribute,head,default) -- no triggering, no inheritance, but list-wise +local function stacked(attribute,head,default) -- no triggering, no inheritance, but list-wise local stack = head local done = false local current = default or 0 @@ -485,16 +477,16 @@ local function stacked(namespace,attribute,head,default) -- no triggering, no in if a and current ~= a and nslistwise[a] then -- viewerlayer / needs checking, see below local p = current current = a - head = insert_node_before(head,stack,copied(nsdata[a])) - local list = stacked(namespace,attribute,content,current) -- two return values + head = insert_node_before(head,stack,copy_node(nsdata[a])) + local list = stacked(attribute,content,current) -- two return values if content ~= list then setlist(stack,list) end - head, stack = insert_node_after(head,stack,copied(nsnone)) + head, stack = insert_node_after(head,stack,copy_node(nsnone)) current = p done = true else - local list, ok = stacked(namespace,attribute,content,current) + local list, ok = stacked(attribute,content,current) if content ~= list then setlist(stack,list) -- only if ok end @@ -503,7 +495,7 @@ local function stacked(namespace,attribute,head,default) -- no triggering, no in end end else - local list, ok = stacked(namespace,attribute,content,current) + local list, ok = stacked(attribute,content,current) if content ~= list then setlist(stack,list) -- only if ok end @@ -520,13 +512,13 @@ local function stacked(namespace,attribute,head,default) -- no triggering, no in local a = getattr(stack,attribute) if a then if current ~= a then - head = insert_node_before(head,stack,copied(nsdata[a])) + head = insert_node_before(head,stack,copy_node(nsdata[a])) depth = depth + 1 current = a done = true end if leader then - local list, ok = stacked(namespace,attribute,content,current) + local list, ok = stacked(attribute,content,current) if leader ~= list then setleader(stack,list) -- only if ok end @@ -538,7 +530,7 @@ local function stacked(namespace,attribute,head,default) -- no triggering, no in elseif default > 0 then -- elseif current > 0 then - head = insert_node_before(head,stack,copied(nsnone)) + head = insert_node_before(head,stack,copy_node(nsnone)) depth = depth - 1 current = 0 done = true @@ -548,20 +540,20 @@ local function stacked(namespace,attribute,head,default) -- no triggering, no in stack = getnext(stack) end while depth > 0 do - head = insert_node_after(head,stack,copied(nsnone)) + head = insert_node_after(head,stack,copy_node(nsnone)) depth = depth - 1 end return head, done end states.stacked = function(namespace,attribute,head,default) - local head, done = stacked(namespace,attribute,tonut(head),default) + local head, done = stacked(attribute,tonut(head),default) return tonode(head), done end -- experimental -local function stacker(namespace,attribute,head,default) -- no triggering, no inheritance, but list-wise +local function stacker(attribute,head,default) -- no triggering, no inheritance, but list-wise -- nsbegin() local stacked = false @@ -589,15 +581,15 @@ local function stacker(namespace,attribute,head,default) -- no triggering, no in elseif nslistwise then local a = getattr(current,attribute) if a and attrib ~= a and nslistwise[a] then -- viewerlayer - head = insert_node_before(head,current,copied(nsdata[a])) - local list = stacker(namespace,attribute,content,a) + head = insert_node_before(head,current,copy_node(nsdata[a])) + local list = stacker(attribute,content,a) if list ~= content then setlist(current,list) end done = true - head, current = insert_node_after(head,current,copied(nsnone)) + head, current = insert_node_after(head,current,copy_node(nsnone)) else - local list, ok = stacker(namespace,attribute,content,attrib) + local list, ok = stacker(attribute,content,attrib) if content ~= list then setlist(current,list) end @@ -606,7 +598,7 @@ local function stacker(namespace,attribute,head,default) -- no triggering, no in end end else - local list, ok = stacker(namespace,attribute,content,default) + local list, ok = stacker(attribute,content,default) if list ~= content then setlist(current,list) end @@ -633,7 +625,7 @@ local function stacker(namespace,attribute,head,default) -- no triggering, no in done = true if leader then -- tricky as a leader has to be a list so we cannot inject before - local list, ok = stacker(namespace,attribute,leader,attrib) + local list, ok = stacker(attribute,leader,attrib) if ok then done = true end @@ -647,21 +639,19 @@ local function stacker(namespace,attribute,head,default) -- no triggering, no in current = getnext(current) end -if stacked then - - local n = nsend() - while n do - head = insert_node_after(head,previous,tonut(n)) - n = nsend() + if stacked then + local n = nsend() + while n do + head = insert_node_after(head,previous,tonut(n)) + n = nsend() + end end -end - return head, done end states.stacker = function(namespace,attribute,head,default) - local head, done = stacker(namespace,attribute,tonut(head),default) + local head, done = stacker(attribute,tonut(head),default) nsreset() return tonode(head), done end diff --git a/tex/context/base/mkiv/node-fin.mkiv b/tex/context/base/mkiv/node-fin.mkiv index 6c5bf17f1..4f1ff2aba 100644 --- a/tex/context/base/mkiv/node-fin.mkiv +++ b/tex/context/base/mkiv/node-fin.mkiv @@ -18,8 +18,8 @@ \unprotect -\registerctxluafile{node-shp}{1.001} -\registerctxluafile{node-fin}{1.001} % we might generalize this one +\registerctxluafile{node-shp}{} +\registerctxluafile{node-fin}{} % we might generalize this one % we might have two variants at some point (efficiency) diff --git a/tex/context/base/mkiv/node-fnt.lua b/tex/context/base/mkiv/node-fnt.lua index 8aa088f88..f846f996d 100644 --- a/tex/context/base/mkiv/node-fnt.lua +++ b/tex/context/base/mkiv/node-fnt.lua @@ -56,7 +56,7 @@ local getfield = nuts.getfield ----- getdisc = nuts.getdisc local setchar = nuts.setchar local setlink = nuts.setlink -local setfield = nuts.setfield +local setnext = nuts.setnext local setprev = nuts.setprev local isglyph = nuts.isglyph -- unchecked @@ -71,6 +71,9 @@ local disc_code = nodecodes.disc local boundary_code = nodecodes.boundary local word_boundary = nodes.boundarycodes.word +local protect_glyphs = nuts.protect_glyphs +local unprotect_glyphs = nuts.unprotect_glyphs + local setmetatableindex = table.setmetatableindex -- some tests with using an array of dynamics[id] and processes[id] demonstrated @@ -140,28 +143,28 @@ local ligaturing = nuts.ligaturing local kerning = nuts.kerning -- -- -- this will go away - -local disccodes = nodes.disccodes -local explicit_code = disccodes.explicit -local automatic_code = disccodes.automatic -local expanders = nil - -function fonts.setdiscexpansion(v) - if v == nil or v == true then - expanders = languages and languages.expanders - elseif type(v) == "table" then - expanders = v - else - expanders = false - end -end - -function fonts.getdiscexpansion() - return expanders and true or false -end - -fonts.setdiscexpansion(true) - +-- +-- local disccodes = nodes.disccodes +-- local explicit_code = disccodes.explicit +-- local automatic_code = disccodes.automatic +-- local expanders = nil +-- +-- function fonts.setdiscexpansion(v) +-- if v == nil or v == true then +-- expanders = languages and languages.expanders +-- elseif type(v) == "table" then +-- expanders = v +-- else +-- expanders = false +-- end +-- end +-- +-- function fonts.getdiscexpansion() +-- return expanders and true or false +-- end +-- +-- fonts.setdiscexpansion(true) +-- -- -- -- till here local function start_trace(head) @@ -193,9 +196,9 @@ local function stop_trace(u,usedfonts,a,attrfonts,b,basefonts,r,redundant,e,expa report_fonts("dynamics: %s",a > 0 and concat(keys(attrfonts)," ") or "none") report_fonts("built-in: %s",b > 0 and b or "none") report_fonts("removed : %s",r > 0 and r or "none") -if expanders then - report_fonts("expanded: %s",e > 0 and e or "none") -end + -- if expanders then + -- report_fonts("expanded: %s",e > 0 and e or "none") + -- end report_fonts() end @@ -212,8 +215,10 @@ function handlers.characters(head,groupcode,size,packtype,direction) local done = false local variants = nil local redundant = nil - local none = false local nuthead = tonut(head) + local lastfont = nil + local lastproc = nil + local lastnone = nil local a, u, b, r, e = 0, 0, 0, 0, 0 @@ -224,54 +229,91 @@ function handlers.characters(head,groupcode,size,packtype,direction) -- There is no gain in checking for a single glyph and then having a fast path. On the -- metafun manual (with some 2500 single char lists) the difference is just noise. + local function protectnone() + protect_glyphs(firstnone,lastnone) + firstnone = nil + end + + local function setnone(n) + if firstnone then + protectnone() + end + if basefont then + basefont[2] = getprev(n) + basefont = false + end + if not firstnone then + firstnone = n + end + lastnone = n + end + + local function setbase(n) + if firstnone then + protectnone() + end + if force_basepass then + if basefont then + basefont[2] = getprev(n) + end + b = b + 1 + basefont = { n, false } + basefonts[b] = basefont + end + end + + local function setnode(n,font,attr) -- we could use prevfont and prevattr when we set then first + if firstnone then + protectnone() + end + if basefont then + basefont[2] = getprev(n) + basefont = false + end + if attr > 0 then + local used = attrfonts[font] + if not used then + used = { } + attrfonts[font] = used + end + if not used[attr] then + local fd = setfontdynamics[font] + if fd then + used[attr] = fd[attr] + a = a + 1 + end + end + else + local used = usedfonts[font] + if not used then + lastfont = font + lastproc = fontprocesses[font] + if lastproc then + usedfonts[font] = lastproc + u = u + 1 + end + end + end + end + for n in traverse_char(nuthead) do local font = getfont(n) - local attr = (none and prevattr) or getattr(n,0) or 0 -- zero attribute is reserved for fonts in context + -- local attr = (none and prevattr) or getattr(n,0) or 0 -- zero attribute is reserved for fonts in context + local attr = getattr(n,0) or 0 -- zero attribute is reserved for fonts in context if font ~= prevfont or attr ~= prevattr then prevfont = font prevattr = attr variants = fontvariants[font] - none = fontmodes[font] == "none" - if none then - -- skip - -- variants = false - protect_glyph(n) + local fontmode = fontmodes[font] + if fontmode == "none" then + setnone(n) + elseif fontmode == "base" then + setbase(n) else - if basefont then - basefont[2] = getprev(n) - end - if attr > 0 then - local used = attrfonts[font] - if not used then - used = { } - attrfonts[font] = used - end - if not used[attr] then - local fd = setfontdynamics[font] - if fd then - used[attr] = fd[attr] - a = a + 1 - elseif force_basepass then - b = b + 1 - basefont = { n, false } - basefonts[b] = basefont - end - end - else - local used = usedfonts[font] - if not used then - local fp = fontprocesses[font] - if fp then - usedfonts[font] = fp - u = u + 1 - elseif force_basepass then - b = b + 1 - basefont = { n, false } - basefonts[b] = basefont - end - end - end + setnode(n,font,attr) end + elseif firstnone then + lastnone = n end if variants then local char = getchar(n) @@ -309,6 +351,10 @@ function handlers.characters(head,groupcode,size,packtype,direction) end end + if firstnone then + protectnone() + end + if force_boundaryrun then -- we can inject wordboundaries and then let the hyphenator do its work @@ -376,49 +422,35 @@ function handlers.characters(head,groupcode,size,packtype,direction) local none = false for n in traverse_char(r) do local font = getfont(n) - local attr = (none and prevattr) or getattr(n,0) or 0 -- zero attribute is reserved for fonts in context + local attr = getattr(n,0) or 0 -- zero attribute is reserved for fonts in context if font ~= prevfont or attr ~= prevattr then prevfont = font prevattr = attr - none = fontmodes[font] == "none" -- very unlikely that we run into disc nodes in none mode - if none then - -- skip - -- variants = false - protect_glyph(n) - elseif attr > 0 then - local used = attrfonts[font] - if not used then - used = { } - attrfonts[font] = used - end - if not used[attr] then - local fd = setfontdynamics[font] - if fd then - used[attr] = fd[attr] - a = a + 1 - end - end + local fontmode = fontmodes[font] + if fontmode == "none" then + setnone(n) + elseif fontmode == "base" then + setbase(n) else - local used = usedfonts[font] - if not used then - local fp = fontprocesses[font] - if fp then - usedfonts[font] = fp - u = u + 1 - end - end + setnode(n,font,attr) end + elseif firstnone then + -- lastnone = n + lastnone = nil end -- we assume one font for now (and if there are more and we get into issues then -- we can always remove the break) break end - elseif expanders then - local subtype = getsubtype(d) - if subtype == automatic_code or subtype == explicit_code then - expanders[subtype](d) - e = e + 1 + if firstnone then + protectnone() end + -- elseif expanders then + -- local subtype = getsubtype(d) + -- if subtype == automatic_code or subtype == explicit_code then + -- expanders[subtype](d) + -- e = e + 1 + -- end end end @@ -432,11 +464,9 @@ function handlers.characters(head,groupcode,size,packtype,direction) if u == 0 then -- skip elseif u == 1 then - local font, processors = next(usedfonts) - -- local attr = a == 0 and false or 0 -- 0 is the savest way local attr = a > 0 and 0 or false -- 0 is the savest way - for i=1,#processors do - local h, d = processors[i](head,font,attr,direction) + for i=1,#lastproc do + local h, d = lastproc[i](head,lastfont,attr,direction) if d then if h then head = h @@ -449,7 +479,7 @@ function handlers.characters(head,groupcode,size,packtype,direction) local attr = a > 0 and 0 or false -- 0 is the savest way for font, processors in next, usedfonts do -- unordered for i=1,#processors do - local h, d = processors[i](head,font,attr,direction) + local h, d = processors[i](head,font,attr,direction,u) if d then if h then head = h @@ -478,7 +508,7 @@ function handlers.characters(head,groupcode,size,packtype,direction) for font, dynamics in next, attrfonts do for attribute, processors in next, dynamics do -- unordered, attr can switch in between for i=1,#processors do - local h, d = processors[i](head,font,attribute,direction) + local h, d = processors[i](head,font,attribute,direction,a) if d then if h then head = h @@ -549,19 +579,5 @@ function handlers.characters(head,groupcode,size,packtype,direction) return head, true end -local d_protect_glyphs = nuts.protect_glyphs -local d_unprotect_glyphs = nuts.unprotect_glyphs - -handlers.protectglyphs = function(n) return d_protect_glyphs (tonut(n)) end -handlers.unprotectglyphs = function(n) return d_unprotect_glyphs(tonut(n)) end - --- function handlers.protectglyphs(h) --- local h = tonut(h) --- for n in traverse_id(disc_code,h) do --- local pre, post, replace = getdisc(n) --- if pre then d_protect_glyphs(pre) end --- if post then d_protect_glyphs(post) end --- if replace then d_protect_glyphs(replace) end --- end --- return d_protect_glyphs(h) --- end +handlers.protectglyphs = function(n) protect_glyphs (tonut(n)) return n, true end +handlers.unprotectglyphs = function(n) unprotect_glyphs(tonut(n)) return n, true end diff --git a/tex/context/base/mkiv/node-ini.lua b/tex/context/base/mkiv/node-ini.lua index bdccf8cba..50da140ce 100644 --- a/tex/context/base/mkiv/node-ini.lua +++ b/tex/context/base/mkiv/node-ini.lua @@ -68,6 +68,7 @@ local allocate = utilities.storage.allocate local formatcolumns = utilities.formatters.formatcolumns local getsubtypes = node.subtypes +local getvalues = node.values -- local listcodes = allocate { -- [0] = "unknown", @@ -99,6 +100,13 @@ if not rulecodes[5] then rulecodes[8] = "radical" end +-- local dircodes = mark(getsubtypes("dir")) + +dircodes = allocate { + [0] = "normal", + [1] = "cancel", +} + -- local glyphcodes = allocate { -- [0] = "character", -- [1] = "glyph", @@ -121,7 +129,7 @@ local glyphcodes = mark(getsubtypes("glyph")) local disccodes = mark(getsubtypes("disc")) --- local skipcodes = allocate { +-- local gluecodes = allocate { -- [ 0] = "userskip", -- [ 1] = "lineskip", -- [ 2] = "baselineskip", @@ -150,7 +158,7 @@ local disccodes = mark(getsubtypes("disc")) -- [103] = "gleaders", -- } -local skipcodes = mark(getsubtypes("glue")) +local gluecodes = mark(getsubtypes("glue")) -- local leadercodes = allocate { -- [100] = "leaders", @@ -276,12 +284,12 @@ local nodecodes = simplified(node.types()) local whatcodes = simplified(node.whatsits()) local usercodes = allocate { - [ 97] = "attributes", -- a + [ 97] = "attribute", -- a [100] = "number", -- d [108] = "lua", -- l - [110] = "nodes", -- n + [110] = "node", -- n [115] = "string", -- s - [116] = "tokens" -- t + [116] = "token" -- t } local noadoptions = allocate { @@ -296,52 +304,93 @@ local noadoptions = allocate { right = 0x14 + 0x08, } -skipcodes = allocate(swapped(skipcodes,skipcodes)) -boundarycodes = allocate(swapped(boundarycodes,boundarycodes)) -noadcodes = allocate(swapped(noadcodes,noadcodes)) -radicalcodes = allocate(swapped(radicalcodes,radicalcodes)) -nodecodes = allocate(swapped(nodecodes,nodecodes)) -whatcodes = allocate(swapped(whatcodes,whatcodes)) -listcodes = allocate(swapped(listcodes,listcodes)) -glyphcodes = allocate(swapped(glyphcodes,glyphcodes)) -kerncodes = allocate(swapped(kerncodes,kerncodes)) -penaltycodes = allocate(swapped(penaltycodes,penaltycodes)) -mathcodes = allocate(swapped(mathcodes,mathcodes)) -fillcodes = allocate(swapped(fillcodes,fillcodes)) -margincodes = allocate(swapped(margincodes,margincodes)) -disccodes = allocate(swapped(disccodes,disccodes)) -accentcodes = allocate(swapped(accentcodes,accentcodes)) -fencecodes = allocate(swapped(fencecodes,fencecodes)) -rulecodes = allocate(swapped(rulecodes,rulecodes)) -leadercodes = allocate(swapped(leadercodes,leadercodes)) -usercodes = allocate(swapped(usercodes,usercodes)) -noadoptions = allocate(swapped(noadoptions,noadoptions)) - -nodes.skipcodes = skipcodes -nodes.boundarycodes = boundarycodes -nodes.noadcodes = noadcodes -nodes.nodecodes = nodecodes -nodes.whatcodes = whatcodes -nodes.listcodes = listcodes -nodes.glyphcodes = glyphcodes -nodes.kerncodes = kerncodes -nodes.penaltycodes = penaltycodes -nodes.mathcodes = mathcodes -nodes.fillcodes = fillcodes -nodes.margincodes = margincodes -nodes.disccodes = disccodes -nodes.accentcodes = accentcodes -nodes.radicalcodes = radicalcodes -nodes.fencecodes = fencecodes -nodes.rulecodes = rulecodes -nodes.leadercodes = leadercodes -nodes.usercodes = usercodes -nodes.noadoptions = noadoptions - -nodes.gluecodes = skipcodes -- more official -nodes.whatsitcodes = whatcodes -- more official +-- local directionvalues = mark(getvalues("dir")) +-- local gluevalues = mark(getvalues("glue")) +-- local pdfliteralvalues = mark(getvalues("pdf_literal")) + +local dirvalues = allocate { + [0] = "TLT", + [1] = "TRT", + [2] = "LTL", + [3] = "RTT", +} + +local gluevalues = allocate { + [0] = "normal", + [1] = "fi", + [2] = "fil", + [3] = "fill", + [4] = "filll", +} + +local pdfliteralvalues = allocate { + [0] = "origin", + [1] = "page", + [2] = "always", + [3] = "raw", + [4] = "text", + [5] = "font", + [6] = "special", +} + +gluecodes = allocate(swapped(gluecodes,gluecodes)) +dircodes = allocate(swapped(dircodes,dircodes)) +boundarycodes = allocate(swapped(boundarycodes,boundarycodes)) +noadcodes = allocate(swapped(noadcodes,noadcodes)) +radicalcodes = allocate(swapped(radicalcodes,radicalcodes)) +nodecodes = allocate(swapped(nodecodes,nodecodes)) +whatcodes = allocate(swapped(whatcodes,whatcodes)) +listcodes = allocate(swapped(listcodes,listcodes)) +glyphcodes = allocate(swapped(glyphcodes,glyphcodes)) +kerncodes = allocate(swapped(kerncodes,kerncodes)) +penaltycodes = allocate(swapped(penaltycodes,penaltycodes)) +mathcodes = allocate(swapped(mathcodes,mathcodes)) +fillcodes = allocate(swapped(fillcodes,fillcodes)) +margincodes = allocate(swapped(margincodes,margincodes)) +disccodes = allocate(swapped(disccodes,disccodes)) +accentcodes = allocate(swapped(accentcodes,accentcodes)) +fencecodes = allocate(swapped(fencecodes,fencecodes)) +rulecodes = allocate(swapped(rulecodes,rulecodes)) +leadercodes = allocate(swapped(leadercodes,leadercodes)) +usercodes = allocate(swapped(usercodes,usercodes)) +noadoptions = allocate(swapped(noadoptions,noadoptions)) +dirvalues = allocate(swapped(dirvalues,dirvalues)) +gluevalues = allocate(swapped(gluevalues,gluevalues)) +pdfliteralvalues = allocate(swapped(pdfliteralvalues,pdfliteralvalues)) + +nodes.gluecodes = gluecodes +nodes.dircodes = dircodes +nodes.boundarycodes = boundarycodes +nodes.noadcodes = noadcodes +nodes.nodecodes = nodecodes +nodes.whatcodes = whatcodes +nodes.listcodes = listcodes +nodes.glyphcodes = glyphcodes +nodes.kerncodes = kerncodes +nodes.penaltycodes = penaltycodes +nodes.mathcodes = mathcodes +nodes.fillcodes = fillcodes +nodes.margincodes = margincodes +nodes.disccodes = disccodes +nodes.accentcodes = accentcodes +nodes.radicalcodes = radicalcodes +nodes.fencecodes = fencecodes +nodes.rulecodes = rulecodes +nodes.leadercodes = leadercodes +nodes.usercodes = usercodes +nodes.noadoptions = noadoptions +nodes.dirvalues = dirvalues +nodes.gluevalues = gluevalues +nodes.pdfliteralvalues = pdfliteralvalues + +nodes.skipcodes = gluecodes -- more friendly +nodes.directioncodes = dircodes -- more friendly +nodes.whatsitcodes = whatcodes -- more official nodes.marginkerncodes = margincodes nodes.discretionarycodes = disccodes +nodes.directionvalues = dirvalues -- more friendly +nodes.skipvalues = gluevalues -- more friendly +nodes.literalvalues = pdfliteralvalues -- more friendly listcodes.row = listcodes.alignment listcodes.column = listcodes.alignment @@ -350,6 +399,8 @@ kerncodes.kerning = kerncodes.fontkern kerncodes.italiccorrection = kerncodes.italiccorrection or 1 -- new +pdfliteralvalues.direct = pdfliteralvalues.always + nodes.codes = allocate { -- mostly for listing glue = skipcodes, boundary = boundarycodes, diff --git a/tex/context/base/mkiv/node-ini.mkiv b/tex/context/base/mkiv/node-ini.mkiv index 369b06ab2..8f1079163 100644 --- a/tex/context/base/mkiv/node-ini.mkiv +++ b/tex/context/base/mkiv/node-ini.mkiv @@ -17,25 +17,26 @@ \newcount\filterstate \filterstate\plusone % hm, public -\registerctxluafile{node-ini}{1.001} -\registerctxluafile{node-met}{1.001} -\registerctxluafile{node-nut}{1.001} -\registerctxluafile{node-res}{1.001} -\registerctxluafile{node-ppt}{1.001} % experimental -\registerctxluafile{node-dir}{1.001} -\registerctxluafile{node-aux}{1.001} -\registerctxluafile{node-tst}{1.001} -\registerctxluafile{node-tra}{1.001} % we might split it off (module) -\registerctxluafile{node-snp}{1.001} -\registerctxluafile{node-tsk}{1.001} -\registerctxluafile{node-tex}{1.001} -\registerctxluafile{node-pro}{1.001} -\registerctxluafile{node-ser}{1.001} -\registerctxluafile{node-ext}{1.001} -\registerctxluafile{node-acc}{1.001} % experimental -%registerctxluafile{node-prp}{1.001} % makes no sense (yet) -\registerctxluafile{node-ppt}{1.001} -\registerctxluafile{node-scn}{1.001} +\registerctxluafile{node-ini}{} +\registerctxluafile{node-met}{} +\registerctxluafile{node-nut}{} +\registerctxluafile{node-res}{} +\registerctxluafile{node-ppt}{} % experimental +\registerctxluafile{node-dir}{} +\registerctxluafile{node-aux}{} +\registerctxluafile{node-tst}{} +\registerctxluafile{node-tra}{} % we might split it off (module) +\registerctxluafile{node-snp}{} +\registerctxluafile{node-tsk}{} +\registerctxluafile{node-tex}{} +\registerctxluafile{node-pro}{} +\registerctxluafile{node-ser}{} +\registerctxluafile{node-ext}{} +\registerctxluafile{node-acc}{} % experimental +%registerctxluafile{node-prp}{} % makes no sense (yet) +\registerctxluafile{node-ppt}{} +\registerctxluafile{node-scn}{} +\registerctxluafile{node-syn}{} \newcount\c_node_tracers_show_box % box number diff --git a/tex/context/base/mkiv/node-ltp.lua b/tex/context/base/mkiv/node-ltp.lua index 22a4799ad..865f69c2c 100644 --- a/tex/context/base/mkiv/node-ltp.lua +++ b/tex/context/base/mkiv/node-ltp.lua @@ -134,10 +134,10 @@ if not modules then modules = { } end modules ['node-par'] = { ]]-- +local tonumber = tonumber local utfchar = utf.char local write, write_nl = texio.write, texio.write_nl local sub, formatters = string.sub, string.formatters -local round, floor = math.round, math.floor local insert, remove = table.insert, table.remove -- local fonts, nodes, node = fonts, nodes, node -- too many locals @@ -232,8 +232,8 @@ local setkern = nuts.setkern local setdir = nuts.setdir local setshift = nuts.setshift local setwidth = nuts.setwidth ------ getheight = nuts.getheight ------ getdepth = nuts.getdepth +----- setheight = nuts.setheight +----- setdepth = nuts.setdepth local slide_node_list = nuts.slide -- get rid of this, probably ok > 78.2 local find_tail = nuts.tail @@ -282,9 +282,10 @@ local leaders_code = gluecodes.leaders local localpar_code = nodecodes.localpar -local kerning_code = kerncodes.kerning -- font kern local userkern_code = kerncodes.userkern local italickern_code = kerncodes.italiccorrection +local fontkern_code = kerncodes.fontkern +local accentkern_code = kerncodes.accentkern local ligature_code = glyphcodes.ligature @@ -344,8 +345,6 @@ local dir_pops = nodes.dir_is_pop local dir_negations = nodes.dir_negation local is_skipable = nuts.protrusion_skippable -local a_fontkern = attributes.private('fontkern') - -- helpers -- -- It makes more sense to move the somewhat messy dir state tracking @@ -774,7 +773,7 @@ local function add_to_width(line_break_dir,checked_expansion,s) -- split into tw elseif id == kern_code then local kern = getkern(s) if kern ~= 0 then - if checked_expansion and expand_kerns and (getsubtype(s) == kerning_code or getattr(a_fontkern)) then + if checked_expansion and expand_kerns and getsubtype(s) == fontkern_code then local stretch, shrink = kern_stretch_shrink(s,kern) if expand_kerns == "stretch" then adjust_stretch = adjust_stretch + stretch @@ -1491,7 +1490,7 @@ local function post_line_break(par) break elseif id == kern_code then local subtype = getsubtype(next) - if subtype ~= userkern_code and subtype ~= italickern_code and not getattr(next,a_fontkern) then + if subtype == fontkern_code or subtype == accentkern_code then -- fontkerns and accent kerns as well as otf injections break end @@ -2394,7 +2393,7 @@ function constructors.methods.basic(head,d) local kern = getkern(current) if kern ~= 0 then active_width.size = active_width.size + kern - if checked_expansion and expand_kerns and (getsubtype(current) == kerning_code or getattr(current,a_fontkern)) then + if checked_expansion and expand_kerns and getsubtype(current) == fontkern_code then local stretch, shrink = kern_stretch_shrink(current,kern) if expand_kerns == "stretch" then active_width.adjust_stretch = active_width.adjust_stretch + stretch @@ -2555,7 +2554,7 @@ do write(target," ") elseif id == kern_code then local s = getsubtype(a) - if s == userkern_code or s == italickern_code or getattr(a,a_fontkern) then + if s == fontkern_code or s == accentkern_code then if verbose then write(target,"[|]") -- else @@ -2850,7 +2849,7 @@ do -- end -- elseif id == kern_code then -- local kern = getkern(current) - -- if kern ~= 0 and getsubtype(current) == kerning_code then + -- if kern ~= 0 and getsubtype(current) == fontkern_code then -- setkern(current,font_expand_ratio * kern) -- end -- end @@ -2873,7 +2872,7 @@ do -- end -- elseif id == kern_code then -- local kern = getkern(current) - -- if kern ~= 0 and getsubtype(current) == kerning_code then + -- if kern ~= 0 and getsubtype(current) == fontkern_code then -- setkern(current,font_expand_ratio * kern) -- end -- end @@ -2971,7 +2970,7 @@ do local kern = getkern(current) if kern == 0 then -- no kern - elseif getsubtype(current) == kerning_code then -- check getkern(p) + elseif getsubtype(current) == fontkern_code then -- check getkern(p) if cal_expand_ratio then local stretch, shrink = kern_stretch_shrink(current,kern) font_stretch = font_stretch + stretch diff --git a/tex/context/base/mkiv/node-met.lua b/tex/context/base/mkiv/node-met.lua index 9ebc8e411..12a9256bc 100644 --- a/tex/context/base/mkiv/node-met.lua +++ b/tex/context/base/mkiv/node-met.lua @@ -40,6 +40,11 @@ if not modules then modules = { } end modules ['node-nut'] = { -- As lots of testing and experimenting was part of this project, I could not have -- done without stacks of new \CD s and \DVD s. This time Porcupine Tree, No-Man -- and Archive were came to rescue. +-- +-- It all started with testing performance of: +-- +-- node.getfield = metatable.__index +-- node.setfield = metatable.__newindex local type, select = type, select local setmetatableindex = table.setmetatableindex @@ -110,51 +115,22 @@ nodes.set_attribute = node.set_attribute nodes.find_attribute = node.find_attribute nodes.unset_attribute = node.unset_attribute -nodes.protect_glyphs = node.protect_glyphs nodes.protect_glyph = node.protect_glyph +nodes.protect_glyphs = node.protect_glyphs +nodes.unprotect_glyph = node.unprotect_glyph nodes.unprotect_glyphs = node.unprotect_glyphs nodes.kerning = node.kerning nodes.ligaturing = node.ligaturing nodes.mlist_to_hlist = node.mlist_to_hlist -if not node.getwhd then - local getfield = node.getfield - function node.getwhd(n) - return getfield(n,"width"), getfield(n,"height"), getfield(n,"depth") - end -end - -if not node.setwhd then - local setfield = node.setfield - function node.setwhd(n,w,h,d) - setfield(n,"width",w or 0) - setfield(n,"height",h or 0) - setfield(n,"depth",d or 0) - end -end - -nodes.getwhd = node.getwhd -nodes.setwhd = node.setwhd - nodes.effective_glue = node.effective_glue nodes.getglue = node.getglue nodes.setglue = node.setglue nodes.is_zero_glue = node.is_zero_glue --- if not gonuts or not node.getfield then --- node.getfield = metatable.__index --- node.setfield = metatable.__newindex --- end - nodes.tonode = function(n) return n end nodes.tonut = function(n) return n end -local getfield = node.getfield -local setfield = node.setfield - -local getattr = node.get_attribute -local setattr = setfield - local n_getid = node.getid local n_getlist = node.getlist local n_getnext = node.getnext @@ -162,30 +138,27 @@ local n_getprev = node.getprev local n_getchar = node.getchar local n_getfont = node.getfont local n_getsubtype = node.getsubtype -local n_setfield = node.setfield local n_getfield = node.getfield -local n_setattr = node.setattr -local n_getattr = node.getattr +local n_getattr = node.get_attribute local n_getdisc = node.getdisc local n_getleader = node.getleader +local n_setfield = node.setfield +local n_setattr = n_setfield + local n_setnext = node.setnext or -- always function(c,n) - setfield(c,"next",n) + n_setfield(c,"next",n) end local n_setprev = node.setprev or -- always function(c,p) - setfield(c,"prev",p) + n_setfield(c,"prev",p) end local n_setlist = node.setlist or -- always function(c,l) - setfield(c,"list",l) + n_setfield(c,"list",l) end local n_setlink = node.setlink or -- always --- function(c1,c2) --- if c1 then setfield(c1,"next",c2) end --- if c2 then setfield(c2,"prev",c1) end --- end function(...) -- not that fast but not used often anyway local h = nil @@ -194,8 +167,8 @@ local n_setlink = node.setlink or -- always if not n then -- go on elseif h then - setfield(h,"next",n) - setfield(n,"prev",h) + n_setfield(h,"next",n) + n_setfield(n,"prev",h) else h = n end @@ -204,8 +177,8 @@ local n_setlink = node.setlink or -- always end local n_setboth = node.setboth or -- always function(c,p,n) - setfield(c,"prev",p) - setfield(c,"next",n) + n_setfield(c,"prev",p) + n_setfield(c,"next",n) end nodes.setnext = n_setnext @@ -230,6 +203,23 @@ nodes.getlist = n_getlist nodes.getleader = n_getleader nodes.getdisc = n_getdisc +if not node.getwhd then + function node.getwhd(n) + return n_getfield(n,"width"), n_getfield(n,"height"), n_getfield(n,"depth") + end +end + +if not node.setwhd then + function node.setwhd(n,w,h,d) + n_setfield(n,"width",w or 0) + n_setfield(n,"height",h or 0) + n_setfield(n,"depth",d or 0) + end +end + +nodes.getwhd = node.getwhd +nodes.setwhd = node.setwhd + nodes.is_char = node.is_char nodes.ischar = node.is_char @@ -670,38 +660,45 @@ end nodes.keys = keys -- [id][subtype] nodes.fields = nodefields -- (n) --- temporary hack +-- for the moment (pre 6380) -if LUATEXVERSION <= 1.002 then +if not nodes.unprotect_glyph then - local get = tex.get - local flush = node.free + local protect_glyph = nodes.protect_glyph + local protect_glyphs = nodes.protect_glyphs + local unprotect_glyph = nodes.unprotect_glyph + local unprotect_glyphs = nodes.unprotect_glyphs - function tex.get(name,split) - local s = get(name) - if split == true then - if s then - local width = s.width - local stretch = s.stretch - local shrink = s.shrink - local stretch_order = s.stretch_order - local shrink_order = s.shrink_order - flush(s) - return width, stretch, shrink, stretch_order, shrink_order - else - return 0, 0, 0, 0, 0 - end - elseif split == false then - if s then - local width = s.width - flush(s) - return width - else - return 0 - end + local getnext = nodes.getnext + local setnext = nodes.setnext + + function nodes.protectglyphs(first,last) + if first == last then + return protect_glyph(first) + elseif last then + local nxt = getnext(last) + setnext(last) + local f, b = protect_glyphs(first) + setnext(last,nxt) + return f, b + else + return protect_glyphs(first) + end + end + + function nodes.unprotectglyphs(first,last) + if first == last then + return unprotect_glyph(first) + elseif last then + local nxt = getnext(last) + setnext(last) + local f, b = unprotect_glyphs(first) + setnext(last,nxt) + return f, b else - return s + return unprotect_glyphs(first) end end end + diff --git a/tex/context/base/mkiv/node-mig.mkiv b/tex/context/base/mkiv/node-mig.mkiv index 143fd4466..010d009b3 100644 --- a/tex/context/base/mkiv/node-mig.mkiv +++ b/tex/context/base/mkiv/node-mig.mkiv @@ -40,7 +40,7 @@ \unprotect -\registerctxluafile{node-mig}{1.001} +\registerctxluafile{node-mig}{} \newtoks\everyautomigratefootnotes \newtoks\everyautomigratemarks diff --git a/tex/context/base/mkiv/node-nut.lua b/tex/context/base/mkiv/node-nut.lua index 7e5c3438b..3e9a08b48 100644 --- a/tex/context/base/mkiv/node-nut.lua +++ b/tex/context/base/mkiv/node-nut.lua @@ -115,106 +115,8 @@ nuts.tonut = tonut nodes.tonode = tonode nodes.tonut = tonut --- getters - -if not direct.getwhd then - local getfield = direct.getfield - function direct.getwhd(n) - return getfield(n,"width"), getfield(n,"height"), getfield(n,"depth") - end -end - -if not direct.setwhd then - local setfield = direct.setfield - function direct.setwhd(n,w,h,d) - setfield(n,"width",w or 0) - setfield(n,"height",h or 0) - setfield(n,"depth",d or 0) - end -end - -if not direct.getcomponents then - - local getfield = direct.getfield - local setfield = direct.setfield - local setsubtype = direct.setsubtype - - local attributelist_code = nodecodes.attributelist - - function direct.getcomponents(n) return getfield(n,"components") end - function direct.setcomponents(n,c) setfield(n,"components",c) end - function direct.getkern(n) return getfield(n,"kern") end - function direct.getwidth(n) return getfield(n,"width") end - function direct.setwidth(n,w) return setfield(n,"width",w) end - function direct.getheight(n) return getfield(n,"height") end - function direct.setheight(n,h) return setfield(n,"height",h) end - function direct.getdepth(n) return getfield(n,"depth") end - function direct.setdepth(n,d) return setfield(n,"depth",d) end - function direct.getshift(n) return getfield(n,"shift") end - function direct.setshift(n,s) return setfield(n,"shift",s) end - function direct.getpenalty(n) return getfield(n,"penalty") end - function direct.setpenalty(n,p) setfield(n,"penalty",p) end - function direct.getdir(n) return getfield(n,"dir") end - function direct.setdir(n,p) setfield(n,"dir",p) end - function direct.getlanguage(n) return getfield(n,"lang") end - function direct.setlanguage(n,l) return setfield(n,"lang",l) end - function direct.getattributelist(n) getfield(n,"attr") end - - function direct.getnucleus(n) return getfield(n,"nucleus") end - function direct.setnucleus(n,p) return setfield(n,"nucleus",p) end - function direct.getsup(n) return getfield(n,"sup") end - function direct.setsup(n,p) return setfield(n,"sup",p) end - function direct.getsub(n) return getfield(n,"sub") end - function direct.setsub(n,p) return setfield(n,"sub",p) end - - function direct.setattributelist(n,a) - if a and type(a) ~= attributelist_code then - a = getfield(a,"attr") - end - setfield(n,"attr",a) - end - - function direct.setkern(n,k,s) - setfield(n,"kern",k) - if s then - setsubtype(n,s) - end - end - - function direct.setfont(n,f,c) - setfield(n,"font",f) - if c then - setfield(n,"char",f) - end - end - - function direct.getoffsets(n) - return getfield(n,"xoffset"), getfield(n,"yoffset") - end - - function direct.setoffsets(n,x,y) - if x then - setfield(n,"xoffset",x) - end - if y then - setfield(n,"yoffset",y) - end - end - -end - -if LUATEXVERSION < 1.005 then - local getfield = direct.getfield - function direct.getnucleus(n) return getfield(n,"nucleus") end - function direct.getsub (n) return getfield(n,"sub") end - function direct.getsup (n) return getfield(n,"sup") end -end - --- if LUATEXVERSION < 1.004 then --- local gc = direct.getcomponents --- getcomponents = function(n) local c = gc(n) return c ~= 0 and c or nil end --- end - +-- -- some tracing: +-- -- local hash = table.setmetatableindex("number") -- local ga = direct.get_attribute -- function direct.get_attribute(n,a) @@ -224,7 +126,7 @@ end -- function nuts.reportattr() -- inspect(hash) -- end - +-- -- local function track(name) -- local n = 0 -- local f = nuts[name] @@ -236,13 +138,54 @@ end -- return f(...) -- end -- end - +-- -- track("getfield") --- setters - -- helpers +if not direct.getfam then -- LUATEXVERSION < 1.070 + + local getfield = direct.getfield + local setfield = direct.setfield + + direct.getfam = function(n) return getfield(n,"small_fam") end + direct.setfam = function(n,f) setfield(n,"small_fam",f) end + +end + +if not direct.getdirection then + + local getdir = direct.getdir + local setdir = direct.setdir + + direct.getdirection = function(n) + local d = getdir(n) + if d == "TLT" then return 0 end + if d == "+TLT" then return 0, false end + if d == "-TLT" then return 0, true end + if d == "TRT" then return 1 end + if d == "+TRT" then return 1, false end + if d == "-TRT" then return 1, true end + if d == "LTL" then return 2 end + if d == "+LTL" then return 2, false end + if d == "-LTL" then return 2, true end + if d == "RTT" then return 3 end + if d == "+RTT" then return 3, false end + if d == "-RTT" then return 3, true end + end + + direct.setdirection = function(n,d,c) + if d == 0 then if c == true then setdir(n,"-TLT") elseif c == false then setdir(n,"+TLT") else setdir(n,"TLT") end + elseif d == 1 then if c == true then setdir(n,"-TRT") elseif c == false then setdir(n,"+TRT") else setdir(n,"TRT") end + elseif d == 2 then if c == true then setdir(n,"-LTL") elseif c == false then setdir(n,"+LTL") else setdir(n,"LTL") end + elseif d == 3 then if c == true then setdir(n,"-RTT") elseif c == false then setdir(n,"+RTT") else setdir(n,"RTT") end + else if c == true then setdir(n,"-TLT") elseif c == false then setdir(n,"+TLT") else setdir(n,"TLT") end end + end + +end + +local nuts = nodes.nuts + nuts.tostring = direct.tostring nuts.copy = direct.copy nuts.copy_node = direct.copy @@ -288,8 +231,9 @@ nuts.has_attribute = direct.has_attribute nuts.set_attribute = direct.set_attribute nuts.unset_attribute = direct.unset_attribute -nuts.protect_glyphs = direct.protect_glyphs nuts.protect_glyph = direct.protect_glyph +nuts.protect_glyphs = direct.protect_glyphs +nuts.unprotect_glyph = direct.unprotect_glyph nuts.unprotect_glyphs = direct.unprotect_glyphs nuts.ligaturing = direct.ligaturing nuts.kerning = direct.kerning @@ -324,6 +268,8 @@ nuts.effective_glue = direct.effective_glue nuts.getglue = direct.getglue nuts.setglue = direct.setglue +nuts.getboxglue = direct.getglue +nuts.setboxglue = direct.setglue nuts.getdisc = direct.getdisc nuts.setdisc = direct.setdisc @@ -352,6 +298,8 @@ nuts.getchar = direct.getchar nuts.setchar = direct.setchar nuts.getfont = direct.getfont nuts.setfont = direct.setfont +nuts.getfam = direct.getfam +nuts.setfam = direct.setfam nuts.getboth = direct.getboth nuts.setboth = direct.setboth @@ -387,6 +335,9 @@ nuts.setkern = direct.setkern nuts.getdir = direct.getdir nuts.setdir = direct.setdir +nuts.getdirection = direct.getdirection +nuts.setdirection = direct.setdirection + nuts.getpenalty = direct.getpenalty nuts.setpenalty = direct.setpenalty @@ -415,17 +366,17 @@ local d_setboth = direct.setboth local d_getboth = direct.getboth local function remove(head,current,free_too) - local t = current - head, current = d_remove_node(head,current) - if not t then - -- forget about it - elseif free_too then - d_flush_node(t) - t = nil - else - d_setboth(t) -- (t,nil,nil) + if current then + local h, c = d_remove_node(head,current) + if free_too then + d_flush_node(current) + return h, c + else + d_setboth(current) + return h, c, current + end end - return head, current, t + return head, current end -- alias @@ -446,12 +397,6 @@ function nuts.replace(head,current,new) -- no head returned if false head, current, new = false, head, current end local prev, next = d_getboth(current) --- if next then --- d_setlink(new,next) --- end --- if prev then --- d_setlink(prev,new) --- end if prev or next then d_setlink(prev,new,next) end @@ -782,7 +727,7 @@ nodes.properties = { } ------.set_properties_mode(true,false) -- shallow copy ... problem: in fonts we then affect the originals too -direct.set_properties_mode(true,true) -- create metatable, slower but needed for font-inj.lua (unless we use an intermediate table) +direct.set_properties_mode(true,true) -- create metatable, slower but needed for font-otj.lua (unless we use an intermediate table) -- todo: -- @@ -858,8 +803,113 @@ end -- here: -nodes.set_synctex_line = node.set_synctex_line -nodes.set_synctex_tag = node.set_synctex_tag - nuts.get_synctex_fields = direct.get_synctex_fields nuts.set_synctex_fields = direct.set_synctex_fields + +-- for now + +nodes.uses_font = nodes.uses_font +nuts.uses_font = direct.uses_font + +if not nuts.uses_font then + + local glyph_code = nodecodes.glyph + local getdisc = nuts.getdisc + local getfont = nuts.getfont + local traverse_id = nuts.traverse_id + local tonut = nodes.tonut + + function nuts.uses_font(n,font) + local pre, post, replace = getdisc(n) + if pre then + -- traverse_char + for n in traverse_id(glyph_code,pre) do + if getfont(n) == font then + return true + end + end + end + if post then + for n in traverse_id(glyph_code,post) do + if getfont(n) == font then + return true + end + end + end + if replace then + for n in traverse_id(glyph_code,replace) do + if getfont(n) == font then + return true + end + end + end + return false + end + + function nodes.uses_font(n,font) + return nuts.uses_font(tonut(n),font) + end + +end + +-- for the moment (pre 6380) + +if not nuts.unprotect_glyph then + + local protect_glyph = nuts.protect_glyph + local protect_glyphs = nuts.protect_glyphs + local unprotect_glyph = nuts.unprotect_glyph + local unprotect_glyphs = nuts.unprotect_glyphs + + local getnext = nuts.getnext + local setnext = nuts.setnext + + function nuts.protectglyphs(first,last) + if first == last then + return protect_glyph(first) + elseif last then + local nxt = getnext(last) + setnext(last) + local f, b = protect_glyphs(first) + setnext(last,nxt) + return f, b + else + return protect_glyphs(first) + end + end + + function nuts.unprotectglyphs(first,last) + if first == last then + return unprotect_glyph(first) + elseif last then + local nxt = getnext(last) + setnext(last) + local f, b = unprotect_glyphs(first) + setnext(last,nxt) + return f, b + else + return unprotect_glyphs(first) + end + end + +end + +if LUATEXFUNCTIONALITY < 6384 then -- LUATEXVERSION < 1.070 + + local getfield = nuts.getfield + local setfield = nuts.setfield + + function nuts.getboxglue(n,glue_set,glue_order,glue_sign) + return + getfield(n,"glue_set"), + getfield(n,"glue_order"), + getfield(n,"glue_sign") + end + + function nuts.setboxglue(n,glue_set,glue_order,glue_sign) + setfield(n,"glue_set", glue_set or 0) + setfield(n,"glue_order",glue_order or 0) + setfield(n,"glue_sign", glue_sign or 0) + end + +end diff --git a/tex/context/base/mkiv/node-pag.mkiv b/tex/context/base/mkiv/node-pag.mkiv index b8ed197fe..970939dcf 100644 --- a/tex/context/base/mkiv/node-pag.mkiv +++ b/tex/context/base/mkiv/node-pag.mkiv @@ -15,6 +15,6 @@ \unprotect -\registerctxluafile{node-pag}{1.001} +\registerctxluafile{node-pag}{} \protect \endinput diff --git a/tex/context/base/mkiv/node-pro.lua b/tex/context/base/mkiv/node-pro.lua index 3251b0133..4509bac18 100644 --- a/tex/context/base/mkiv/node-pro.lua +++ b/tex/context/base/mkiv/node-pro.lua @@ -71,15 +71,16 @@ processors.enabled = true -- this will become a proper state (like trackers) do - local has_glyph = nodes.has_glyph + local has_glyph = nodes.has_glyph + local count_nodes = nodes.countall function processors.pre_linebreak_filter(head,groupcode) -- ,size,packtype,direction local found = force_processors or has_glyph(head) if found then if trace_callbacks then - local before = nodes.count(head,true) + local before = count_nodes(head,true) local head, done = actions(head,groupcode) -- ,size,packtype,direction - local after = nodes.count(head,true) + local after = count_nodes(head,true) if done then tracer("pre_linebreak","changed",head,groupcode,before,after,true) else @@ -91,7 +92,7 @@ do return done and head or true end elseif trace_callbacks then - local n = nodes.count(head,false) + local n = count_nodes(head,false) tracer("pre_linebreak","no chars",head,groupcode,n,n) end return true @@ -101,9 +102,9 @@ do local found = force_processors or has_glyph(head) if found then if trace_callbacks then - local before = nodes.count(head,true) + local before = count_nodes(head,true) local head, done = actions(head,groupcode,size,packtype,direction,attributes) - local after = nodes.count(head,true) + local after = count_nodes(head,true) if done then tracer("hpack","changed",head,groupcode,before,after,true) else @@ -115,7 +116,7 @@ do return done and head or true end elseif trace_callbacks then - local n = nodes.count(head,false) + local n = count_nodes(head,false) tracer("hpack","no chars",head,groupcode,n,n) end return true @@ -167,7 +168,8 @@ end do - local actions = tasks.actions("finalizers") -- head, where + local actions = tasks.actions("finalizers") -- head, where + local count_nodes = nodes.countall -- beware, these are packaged boxes so no first_glyph test -- maybe some day a hash with valid groupcodes @@ -178,9 +180,9 @@ do function processors.post_linebreak_filter(head,groupcode) if trace_callbacks then - local before = nodes.count(head,true) + local before = count_nodes(head,true) local head, done = actions(head,groupcode) - local after = nodes.count(head,true) + local after = count_nodes(head,true) if done then tracer("post_linebreak","changed",head,groupcode,before,after,true) else diff --git a/tex/context/base/mkiv/node-ref.lua b/tex/context/base/mkiv/node-ref.lua index b313a00b6..1ec77e83d 100644 --- a/tex/context/base/mkiv/node-ref.lua +++ b/tex/context/base/mkiv/node-ref.lua @@ -16,6 +16,7 @@ if not modules then modules = { } end modules ['node-ref'] = { -- is grouplevel still used? +local tonumber = tonumber local concat = table.concat local attributes, nodes, node = attributes, nodes, node @@ -51,7 +52,6 @@ local tonode = nuts.tonode local tonut = nuts.tonut local getfield = nuts.getfield -local setfield = nuts.setfield local setlink = nuts.setlink local setnext = nuts.setnext local setprev = nuts.setprev @@ -69,6 +69,7 @@ local getsubtype = nuts.getsubtype local getwhd = nuts.getwhd local getdir = nuts.getdir local setshift = nuts.setshift +local getboxglue = nuts.getboxglue local hpack_list = nuts.hpack local vpack_list = nuts.vpack @@ -283,18 +284,16 @@ local function inject_range(head,first,last,reference,make,stack,parent,pardir,t reference,pardir or "---",txtdir or "---", tosequence(first,last,true),width,height,depth) end -if first == last and getid(parent) == vlist_code and getid(first) == hlist_code then - if trace_areas then - -- think of a button without \dontleavehmode in the mvl - report_area("compensating for link in vlist") - end - setlink(result,getlist(first)) - setlist(first,result) -else - -- setlink(getprev(first),result) - -- setlink(result,first) - setlink(getprev(first),result,first) -end + if first == last and getid(parent) == vlist_code and getid(first) == hlist_code then + if trace_areas then + -- think of a button without \dontleavehmode in the mvl + report_area("compensating for link in vlist") + end + setlink(result,getlist(first)) + setlist(first,result) + else + setlink(getprev(first),result,first) + end return head, last end else @@ -320,10 +319,11 @@ local function inject_list(id,current,reference,make,stack,pardir,txtdir) if prev and getid(prev) == glue_code and getsubtype(prev) == parfillskip_code then width = dimensions(current,first,getprev(prev)) -- maybe not current as we already take care of it else + local set, order, sign = getboxglue(current) if moveright then - width = width - getfield(first,"stretch") * getfield(current,"glue_set") * getfield(current,"glue_sign") + width = width - getfield(first,"stretch") * set * sign end - width = width - getfield(last,"stretch") * getfield(current,"glue_set") * getfield(current,"glue_sign") + width = width - getfield(last,"stretch") * set * sign end end else @@ -351,8 +351,6 @@ local function inject_list(id,current,reference,make,stack,pardir,txtdir) setlist(current,result) elseif moveright then -- brr no prevs done -- result after first - -- setlink(result,getnext(first)) - -- setlink(first,result) setlink(first,result,getnext(first)) else -- first after result @@ -371,61 +369,30 @@ end -- we need to do vlists differently local function inject_areas(head,attribute,make,stack,done,skip,parent,pardir,txtdir) -- main - if head then - local current, first, last, firstdir, reference = head, nil, nil, nil, nil - pardir = pardir or "===" - txtdir = txtdir or "===" - while current do - local id = getid(current) - if id == hlist_code or id == vlist_code then - local r = getattr(current,attribute) - -- test \goto{test}[page(2)] test \gotobox{test}[page(2)] - -- test \goto{\TeX}[page(2)] test \gotobox{\hbox {x} \hbox {x}}[page(2)] - -- if r and (not skip or r >) skip then -- maybe no > test - -- inject_list(id,current,r,make,stack,pardir,txtdir) - -- end - if r then - if not reference then - reference, first, last, firstdir = r, current, current, txtdir - elseif r == reference then - -- same link - last = current - elseif (done[reference] or 0) == 0 then - if not skip or r > skip then -- maybe no > test - head, current = inject_range(head,first,last,reference,make,stack,parent,pardir,firstdir) - reference, first, last, firstdir = nil, nil, nil, nil - end - else - reference, first, last, firstdir = r, current, current, txtdir - end - done[r] = (done[r] or 0) + 1 - end - local list = getlist(current) - if list then - local h, ok - h, ok , pardir, txtdir = inject_areas(list,attribute,make,stack,done,r or skip or 0,current,pardir,txtdir) - if h ~= current then - setlist(current,h) - end - end - if r then - done[r] = done[r] - 1 - end - elseif id == dir_code then - txtdir = getdir(current) - elseif id == localpar_code then - pardir = getdir(current) - elseif id == glue_code and getsubtype(current) == leftskip_code then -- any glue at the left? - -- - else - local r = getattr(current,attribute) - if not r then - -- just go on, can be kerns - elseif not reference then + local first, last, firstdir, reference + if not pardir then + pardir = "===" + end + if not texdir then + txtdir = "===" + end + local current = head + while current do + local id = getid(current) + if id == hlist_code or id == vlist_code then + local r = getattr(current,attribute) + -- test \goto{test}[page(2)] test \gotobox{test}[page(2)] + -- test \goto{\TeX}[page(2)] test \gotobox{\hbox {x} \hbox {x}}[page(2)] + -- if r and (not skip or r >) skip then -- maybe no > test + -- inject_list(id,current,r,make,stack,pardir,txtdir) + -- end + if r then + if not reference then reference, first, last, firstdir = r, current, current, txtdir elseif r == reference then + -- same link last = current - elseif (done[reference] or 0) == 0 then -- or id == glue_code and getsubtype(current) == right_skip_code + elseif (done[reference] or 0) == 0 then if not skip or r > skip then -- maybe no > test head, current = inject_range(head,first,last,reference,make,stack,parent,pardir,firstdir) reference, first, last, firstdir = nil, nil, nil, nil @@ -433,53 +400,89 @@ local function inject_areas(head,attribute,make,stack,done,skip,parent,pardir,tx else reference, first, last, firstdir = r, current, current, txtdir end + done[r] = (done[r] or 0) + 1 end - current = getnext(current) - end - if reference and (done[reference] or 0) == 0 then - head = inject_range(head,first,last,reference,make,stack,parent,pardir,firstdir) - end - end - return head, true, pardir, txtdir -end - -local function inject_area(head,attribute,make,stack,done,parent,pardir,txtdir) -- singular ! - if head then - pardir = pardir or "===" - txtdir = txtdir or "===" - local current = head - while current do - local id = getid(current) - if id == hlist_code or id == vlist_code then - local r = getattr(current,attribute) - if r and not done[r] then - done[r] = true - inject_list(id,current,r,make,stack,pardir,txtdir) + local list = getlist(current) + if list then + local h, ok + h, ok, pardir, txtdir = inject_areas(list,attribute,make,stack,done,r or skip or 0,current,pardir,txtdir) + if h ~= current then + setlist(current,h) end - local list = getlist(current) - if list then - local h = inject_area(list,attribute,make,stack,done,current,pardir,txtdir) - if h ~= current then - setlist(current,h) - end + end + if r then + done[r] = done[r] - 1 + end + elseif id == glue_code and getsubtype(current) == leftskip_code then -- any glue at the left? + -- + elseif id == dir_code then + txtdir = getdir(current) + elseif id == localpar_code then -- only test at begin + pardir = getdir(current) + else + local r = getattr(current,attribute) + if not r then + -- just go on, can be kerns + elseif not reference then + reference, first, last, firstdir = r, current, current, txtdir + elseif r == reference then + last = current + elseif (done[reference] or 0) == 0 then -- or id == glue_code and getsubtype(current) == right_skip_code + if not skip or r > skip then -- maybe no > test + head, current = inject_range(head,first,last,reference,make,stack,parent,pardir,firstdir) + reference, first, last, firstdir = nil, nil, nil, nil end - elseif id == dir_code then - txtdir = getdir(current) - elseif id == localpar_code then - pardir = getdir(current) else - local r = getattr(current,attribute) - if r and not done[r] then - done[r] = true - head, current = inject_range(head,current,current,r,make,stack,parent,pardir,txtdir) - end + reference, first, last, firstdir = r, current, current, txtdir end - current = getnext(current) end + current = getnext(current) + end + if reference and (done[reference] or 0) == 0 then + head = inject_range(head,first,last,reference,make,stack,parent,pardir,firstdir) end - return head, true + return head, true, pardir, txtdir end +-- local function inject_area(head,attribute,make,stack,done,parent,pardir,txtdir) -- singular ! +-- if not pardir then +-- pardir = "===" +-- end +-- if not texdir then +-- txtdir = "===" +-- end +-- local current = head +-- while current do +-- local id = getid(current) +-- if id == hlist_code or id == vlist_code then +-- local r = getattr(current,attribute) +-- if r and not done[r] then +-- done[r] = true +-- inject_list(id,current,r,make,stack,pardir,txtdir) +-- end +-- local list = getlist(current) +-- if list then +-- local h = inject_area(list,attribute,make,stack,done,current,pardir,txtdir) +-- if h ~= current then +-- setlist(current,h) +-- end +-- end +-- elseif id == dir_code then +-- txtdir = getdir(current) +-- elseif id == localpar_code then +-- pardir = getdir(current) +-- else +-- local r = getattr(current,attribute) +-- if r and not done[r] then +-- done[r] = true +-- head, current = inject_range(head,current,current,r,make,stack,parent,pardir,txtdir) +-- end +-- end +-- current = getnext(current) +-- end +-- return head, true +-- end + -- tracing: todo: use predefined colors local register_color = colors.register @@ -555,8 +558,6 @@ local function colorize(width,height,depth,n,reference,what,sr,offset) local text = addstring(what,sr,shift) if text then local kern = new_kern(-getwidth(text)) - -- setlink(kern,text) - -- setlink(text,rule) setlink(kern,text,rule) return kern end @@ -669,17 +670,9 @@ local function makereference(width,height,depth,reference) -- height and depth a end end --- function nodes.references.handler(head) --- if topofstack > 0 then --- return inject_areas(head,attribute,makereference,stack,done) --- else --- return head, false --- end --- end - function nodes.references.handler(head) - if topofstack > 0 then - head = tonut(head) + if head and topofstack > 0 then + local head = tonut(head) local head, done = inject_areas(head,attribute,makereference,stack,done) return tonode(head), done else @@ -791,7 +784,7 @@ local function makedestination(width,height,depth,reference) end -- function nodes.destinations.handler(head) --- if topofstack > 0 then +-- if head and topofstack > 0 then -- return inject_area(head,attribute,makedestination,stack,done) -- singular -- else -- return head, false @@ -799,8 +792,8 @@ end -- end function nodes.destinations.handler(head) - if topofstack > 0 then - head = tonut(head) + if head and topofstack > 0 then + local head = tonut(head) local head, done = inject_areas(head,attribute,makedestination,stack,done) return tonode(head), done else @@ -808,7 +801,6 @@ function nodes.destinations.handler(head) end end - -- will move function references.mark(reference,h,d,view) diff --git a/tex/context/base/mkiv/node-res.lua b/tex/context/base/mkiv/node-res.lua index 8b7ec1a62..a6211e80e 100644 --- a/tex/context/base/mkiv/node-res.lua +++ b/tex/context/base/mkiv/node-res.lua @@ -7,7 +7,6 @@ if not modules then modules = { } end modules ['node-res'] = { } local gmatch, format = string.gmatch, string.format -local tonumber, round = tonumber, math.round --[[ldx-- <p>The next function is not that much needed but in <l n='context'/> we use @@ -26,6 +25,7 @@ local skipcodes = nodes.skipcodes local kerncodes = nodes.kerncodes local rulecodes = nodes.rulecodes local nodecodes = nodes.nodecodes +local gluecodes = nodes.gluecodes local boundarycodes = nodes.boundarycodes local usercodes = nodes.usercodes @@ -61,35 +61,37 @@ setmetatable(userids, { -- nuts overload -local nuts = nodes.nuts -local nutpool = { } -nuts.pool = nutpool - -local tonut = nuts.tonut -local tonode = nuts.tonode - -local getbox = nuts.getbox -local getfield = nuts.getfield -local getid = nuts.getid -local getlist = nuts.getlist -local getglue = nuts.getglue - -local setfield = nuts.setfield -local setchar = nuts.setchar -local setlist = nuts.setlist -local setwhd = nuts.setwhd -local setglue = nuts.setglue -local setdisc = nuts.setdisc -local setfont = nuts.setfont -local setkern = nuts.setkern -local setpenalty = nuts.setpenalty -local setdir = nuts.setdir -local setshift = nuts.setshift -local setwidth = nuts.setwidth - -local copy_nut = nuts.copy -local new_nut = nuts.new -local flush_nut = nuts.flush +local nuts = nodes.nuts +local nutpool = { } +nuts.pool = nutpool + +local tonut = nuts.tonut +local tonode = nuts.tonode + +local getbox = nuts.getbox +local getid = nuts.getid +local getlist = nuts.getlist +local getglue = nuts.getglue + +local setfield = nuts.setfield +local setchar = nuts.setchar +local setlist = nuts.setlist +local setwhd = nuts.setwhd +local setglue = nuts.setglue +local setdisc = nuts.setdisc +local setfont = nuts.setfont +local setkern = nuts.setkern +local setpenalty = nuts.setpenalty +local setdir = nuts.setdir +local setdirection = nuts.setdirection +local setshift = nuts.setshift +local setwidth = nuts.setwidth +local setsubtype = nuts.setsubtype +local setleader = nuts.setleader + +local copy_nut = nuts.copy +local new_nut = nuts.new +local flush_nut = nuts.flush -- at some point we could have a dual set (the overhead of tonut is not much larger than -- metatable associations at the lua/c end esp if we also take assignments into account @@ -162,11 +164,11 @@ local special = register_nut(new_nut("whatsit",whatsitcodes.special)) local user_node = new_nut("whatsit",whatsitcodes.userdefined) local user_number = register_nut(copy_nut(user_node)) setfield(user_number, "type",usercodes.number) -local user_nodes = register_nut(copy_nut(user_node)) setfield(user_nodes, "type",usercodes.nodes) +local user_nodes = register_nut(copy_nut(user_node)) setfield(user_nodes, "type",usercodes.node) local user_string = register_nut(copy_nut(user_node)) setfield(user_string, "type",usercodes.string) -local user_tokens = register_nut(copy_nut(user_node)) setfield(user_tokens, "type",usercodes.tokens) +local user_tokens = register_nut(copy_nut(user_node)) setfield(user_tokens, "type",usercodes.token) ----- user_lua = register_nut(copy_nut(user_node)) setfield(user_lua, "type",usercodes.lua) -- in > 0.95 -local user_attributes = register_nut(copy_nut(user_node)) setfield(user_attributes,"type",usercodes.attributes) +local user_attributes = register_nut(copy_nut(user_node)) setfield(user_attributes,"type",usercodes.attribute) local left_margin_kern = register_nut(new_nut("margin_kern",0)) local right_margin_kern = register_nut(new_nut("margin_kern",1)) @@ -179,10 +181,22 @@ local rightskip = register_nut(new_nut("glue",skipcodes.rightskip)) local temp = register_nut(new_nut("temp",0)) local noad = register_nut(new_nut("noad")) +local delimiter = register_nut(new_nut("delim")) +local fence = register_nut(new_nut("fence")) +local submlist = register_nut(new_nut("sub_mlist")) +local accent = register_nut(new_nut("accent")) +local radical = register_nut(new_nut("radical")) +local fraction = register_nut(new_nut("fraction")) +local subbox = register_nut(new_nut("sub_box")) +local mathchar = register_nut(new_nut("math_char")) +local mathtextchar = register_nut(new_nut("math_text_char")) +local choice = register_nut(new_nut("choice")) local boundary = register_nut(new_nut("boundary",boundarycodes.user)) local wordboundary = register_nut(new_nut("boundary",boundarycodes.word)) +local cleader = register_nut(copy_nut(glue)) setsubtype(cleader,gluecodes.cleaders) setglue(cleader,0,65536,0,2,0) + -- the dir field needs to be set otherwise crash: local rule = register_nut(new_nut("rule")) setdir(rule, "TLT") @@ -329,6 +343,18 @@ function nutpool.textdir(dir) return t end +function nutpool.direction(dir,swap) + local t = copy_nut(textdir) + if not dir then + -- just a l2r start node + elseif swap then + setdirection(t,dir,true) + else + setdirection(t,dir,false) + end + return t +end + function nutpool.rule(width,height,depth,dir) -- w/h/d == nil will let them adapt local n = copy_nut(rule) if width or height or depth then @@ -362,6 +388,17 @@ function nutpool.userrule(width,height,depth,dir) -- w/h/d == nil will let them return n end +function nutpool.leader(width,list) + local n = copy_nut(cleader) + if width then + setwidth(n,width) + end + if list then + setleader(n,list) + end + return n +end + function nutpool.latelua(code) local n = copy_nut(latelua) setfield(n,"string",code) @@ -404,9 +441,19 @@ function nutpool.temp() return copy_nut(temp) end -function nutpool.noad() - return copy_nut(noad) -end +function nutpool.noad() return copy_nut(noad) end +function nutpool.delimiter() return copy_nut(delimiter) end nutpool.delim = nutpool.delimiter +function nutpool.fence() return copy_nut(fence) end +function nutpool.submlist() return copy_nut(submlist) end +function nutpool.noad() return copy_nut(noad) end +function nutpool.fence() return copy_nut(fence) end +function nutpool.accent() return copy_nut(accent) end +function nutpool.radical() return copy_nut(radical) end +function nutpool.fraction() return copy_nut(fraction) end +function nutpool.subbox() return copy_nut(subbox) end +function nutpool.mathchar() return copy_nut(mathchar) end +function nutpool.mathtextchar() return copy_nut(mathtextchar) end +function nutpool.choice() return copy_nut(choice) end local function new_hlist(list,width,height,depth,shift) local n = copy_nut(hlist) diff --git a/tex/context/base/mkiv/node-rul.lua b/tex/context/base/mkiv/node-rul.lua index 4ec651d3b..2b0368c2b 100644 --- a/tex/context/base/mkiv/node-rul.lua +++ b/tex/context/base/mkiv/node-rul.lua @@ -17,6 +17,9 @@ if not modules then modules = { } end modules ['node-rul'] = { -- fill s withcolor .5white ; -- draw boundingbox s withcolor yellow; +local tonumber = tonumber + +local context = context local attributes = attributes local nodes = nodes local properties = nodes.properties @@ -28,13 +31,13 @@ local tonode = nuts.tonode local tonut = nuts.tonut local getfield = nuts.getfield -local setfield = nuts.setfield local setnext = nuts.setnext local setprev = nuts.setprev local setlink = nuts.setlink local getnext = nuts.getnext local getprev = nuts.getprev local getid = nuts.getid +local getdir = nuts.getdir local getattr = nuts.getattr local setattr = nuts.setattr local getfont = nuts.getfont @@ -57,6 +60,7 @@ local traverse_id = nuts.traverse_id local list_dimensions = nuts.rangedimensions local hpack_nodes = nuts.hpack local current_attr = nuts.current_attr +local copy_list = nuts.copy_list local nodecodes = nodes.nodecodes local rulecodes = nodes.rulecodes @@ -82,6 +86,7 @@ local nodepool = nuts.pool local new_rule = nodepool.rule local new_userrule = nodepool.userrule local new_kern = nodepool.kern +local new_leader = nodepool.leader local n_tostring = nodes.idstostring local n_tosequence = nodes.tosequence @@ -125,13 +130,16 @@ local rules = nodes.rules or { } nodes.rules = rules rules.data = rules.data or { } +local nutrules = nuts.rules or { } +nuts.rules = nutrules -- not that many + storage.register("nodes/rules/data", rules.data, "nodes.rules.data") local data = rules.data -- we implement user rules here as it takes less code this way -local function userrule(t,noattributes) +local function usernutrule(t,noattributes) local r = new_userrule(t.width or 0,t.height or 0,t.depth or 0) if noattributes == false or noattributes == nil then -- avoid fuzzy ones @@ -139,7 +147,13 @@ local function userrule(t,noattributes) setattrlist(r,current_attr()) end properties[r] = t - return tonode(r) + return r +end + +nutrules.userrule = usernutrule + +local function userrule(t,noattributes) + return tonode(usernutrule(t,noattributes)) end rules.userrule = userrule @@ -208,8 +222,19 @@ local trace_ruled = false trackers.register("nodes.rules", function(v) trace_ local report_ruled = logs.reporter("nodes","rules") function rules.define(settings) - data[#data+1] = settings - context(#data) + local nofdata = #data+1 + data[nofdata] = settings + local text = settings.text + if text then + local b = nuts.takebox(text) + if b then + nodepool.register(b) + settings.text = getlist(b) + else + settings.text = nil + end + end + context(nofdata) end local function flush_ruled(head,f,l,d,level,parent,strip) -- not that fast but acceptable for this purpose @@ -242,7 +267,6 @@ local function flush_ruled(head,f,l,d,level,parent,strip) -- not that fast but a local method = d.method local empty = d.empty == v_yes local offset = d.offset - local continue = d.continue local dy = d.dy local order = d.order local max = d.max @@ -322,18 +346,28 @@ local function flush_ruled(head,f,l,d,level,parent,strip) -- not that fast but a } inject(tonut(r),w,ht,dp) else - for i=1,level do - local ht = (offset+(i-1)*dy)*e + rulethickness - m - local dp = -(offset+(i-1)*dy)*e + rulethickness + m - local r = new_rule(w,ht,dp) - if color then - setattr(r,a_colormodel,colorspace) - setattr(r,a_color,color) - end - if transparency then - setattr(r,a_transparency,transparency) + local tx = d.text + if tx then + tx = copy_list(tx) + if d["repeat"] == v_yes then + tx = new_leader(w,tx) end + local r = hpack_nodes(tx,w,"exactly") inject(r,w,ht,dp) + else + for i=1,level do + local ht = (offset+(i-1)*dy)*e + rulethickness - m + local dp = -(offset+(i-1)*dy)*e + rulethickness + m + local r = new_rule(w,ht,dp) + if color then + setattr(r,a_colormodel,colorspace) + setattr(r,a_color,color) + end + if transparency then + setattr(r,a_transparency,transparency) + end + inject(r,w,ht,dp) + end end end return head @@ -617,6 +651,8 @@ implement { { "ta", "integer" }, { "mp" }, { "empty" }, + { "text", "integer" }, + { "repeat" }, } } } diff --git a/tex/context/base/mkiv/node-rul.mkiv b/tex/context/base/mkiv/node-rul.mkiv index bfdd17d30..643e93c42 100644 --- a/tex/context/base/mkiv/node-rul.mkiv +++ b/tex/context/base/mkiv/node-rul.mkiv @@ -71,7 +71,7 @@ %definesystemattribute[ruled] %definesystemattribute[shifted] -\registerctxluafile{node-rul}{1.001} +\registerctxluafile{node-rul}{} \installcorenamespace{bar} \installcorenamespace{barindex} @@ -108,8 +108,14 @@ \setuevalue\currentbar{\node_rules_direct{\currentbar}}% \to \everydefinebar +\newbox\b_node_rules + \unexpanded\def\node_rules_define {\edef\p_node_rules_color{\barparameter\c!color}% + \edef\p_node_text{\barparameter\c!text}% + \ifx\p_node_text\empty\else + \setbox\b_node_rules\hbox{\p_node_text}% + \fi \setevalue{\??barattribute\currentbar}{\number \clf_definerule continue {\barparameter\c!continue}% @@ -125,6 +131,11 @@ offset \barparameter\c!offset\space % number dy \barparameter\c!dy\space % number empty {\barparameter\c!empty}% + \ifx\p_node_text\empty\else + % not that useful and efficient, more for testing something + text \b_node_rules + repeat {\barparameter\c!repeat}% + \fi \relax}} \unexpanded\def\node_rules_redefine#1% diff --git a/tex/context/base/mkiv/node-scn.lua b/tex/context/base/mkiv/node-scn.lua index 67a0badec..b294b3013 100644 --- a/tex/context/base/mkiv/node-scn.lua +++ b/tex/context/base/mkiv/node-scn.lua @@ -48,14 +48,13 @@ local spaceskip_code = gluecodes.spaceskip local xspaceskip_code = gluecodes.xspaceskip local leader_code = gluecodes.leaders -local kerning_code = kerncodes.kern +local fontkern_code = kerncodes.fontkern local variables = interfaces.variables local privateattributes = attributes.private local a_runningtext = privateattributes('runningtext') -local a_fontkern = privateattributes('fontkern') local v_yes = variables.yes local v_all = variables.all @@ -173,7 +172,7 @@ local function processwords(attribute,data,flush,head,parent,skip) -- we have hl if f then l = n end - elseif id == kern_code and (getsubtype(n) == kerning_code or getattr(n,a_fontkern)) then + elseif id == kern_code and getsubtype(n) == fontkern_code then if f then l = n end @@ -276,7 +275,7 @@ local function processranges(attribute,flush,head,parent,depth,skip) else -- weird end - elseif id == kern_code and (getsubtype(n) == kerning_code or getattr(n,a_fontkern)) then + elseif id == kern_code and getsubtype(n) == fontkern_code then if f then l = n end diff --git a/tex/context/base/mkiv/node-ser.lua b/tex/context/base/mkiv/node-ser.lua index f1be21f84..7ed2b8d00 100644 --- a/tex/context/base/mkiv/node-ser.lua +++ b/tex/context/base/mkiv/node-ser.lua @@ -106,6 +106,7 @@ nodes.ignorablefields = ignore local function astable(n,sparse) -- not yet ok, might get obsolete anyway n = tonode(n) local f = getfields(n) + local t = { } for i=1,#f do local v = f[i] local d = n[v] diff --git a/tex/context/base/mkiv/node-shp.lua b/tex/context/base/mkiv/node-shp.lua index 216e6462a..2e7a3529a 100644 --- a/tex/context/base/mkiv/node-shp.lua +++ b/tex/context/base/mkiv/node-shp.lua @@ -37,7 +37,6 @@ local tonode = nuts.tonode local remove_node = nuts.remove local traverse_nodes = nuts.traverse -local getfield = nuts.getfield local setfield = nuts.setfield local setlink = nuts.setlink local setprev = nuts.setprev @@ -152,10 +151,10 @@ function handlers.cleanupbox(head) return tonode(cleanup_flushed(tonut(head))), true end -local actions = tasks.actions("shipouts") -- no extra arguments +local actions = tasks.actions("shipouts") -function handlers.finalize(head) -- problem, attr loaded before node, todo ... - return actions(head) +function handlers.finalize(head,where) -- problem, attr loaded before node, todo ... + return actions(head,where) end -- handlers.finalize = actions diff --git a/tex/context/base/mkiv/node-syn.lua b/tex/context/base/mkiv/node-syn.lua index 1b8e07382..9d716c44a 100644 --- a/tex/context/base/mkiv/node-syn.lua +++ b/tex/context/base/mkiv/node-syn.lua @@ -6,23 +6,124 @@ if not modules then modules = { } end modules ['node-syn'] = { license = "see context related readme files" } --- Because we have these fields in some node that are used by sunctex, I decided (because --- some users seem to like that feature) to implement a variant that might work out better --- for ConTeXt. This is experimental code. I don't use it myself so it will take a while --- to mature. There will be some helpers that one can use in more complex situations like --- included xml files. +-- Because we have these fields in some node that are used by synctex, and because +-- some users seem to like that feature, I decided to implement a variant that might +-- work out better for ConTeXt. This is experimental code. I don't use it myself so +-- it will take a while to mature. There will be some helpers that one can use in +-- more complex situations like included xml files. Currently (somewhere else) we +-- take care of valid files, that is: we prohibit access to files in the tree +-- because we don't want users to mess up styles. -- --- It is unclear how the output gets interpreted. For instance, we only need to be able to --- go back to a place where text is entered, but still we need all that redundant box --- wrapping. +-- It is unclear how the output gets interpreted but by reverse engineering (and +-- stripping) the file generated by generic synctex, I got there eventually. For +-- instance, we only need to be able to go back to a place where text is entered, +-- but still we need all that redundant box wrapping. Anyway, I was able to get a +-- minimal output and cross my fingers that the parser used in editors is not +-- changed in fundamental ways. -- --- Possible optimizations: pack whole lines. +-- I only tested SumatraPDF with SciTE, for which one needs to configure in the +-- viewer: +-- +-- InverseSearchCmdLine = c:\data\system\scite\wscite\scite.exe "%f" "-goto:%l" $ +-- +-- Unfortunately syntex always removes the files at the end and not at the start +-- (this happens in synctexterminate) so we need to work around that by using an +-- intermediate file. This is no big deal in context (which has a runner) but +-- definitely not nice. +-- +-- The visualizer code is only needed for testing so we don't use fancy colors or +-- provide more detail. After all we're only interested in rendered source text +-- anyway. We try to play safe which sometimes means that we'd better no go +-- somewhere than go someplace wrong. +-- +-- A previous version had a mode for exporting boxes and such but I removed that +-- as it made no sense. Also, collecting output in a table was not faster than +-- directly piping to the file, probably because the amount is not that large. We +-- keep some left-overs commented. +-- +-- A significate reduction in file size can be realized when reusing the same +-- values. Actually that triggered the current approach in ConTeXt. In the latest +-- synctex parser vertical positions can be repeated by an "=" sign but for some +-- reason only for that field. It's probably trivial to do that for all of "w h d v +-- h" but it currently not the case so I'll delay that till all are supported. (We +-- could benefit a lot from such a repetition scheme but not much from a "v" alone +-- which -alas- indicates that synctex is still mostly a latex targeted story.) +-- +-- It's kind of hard to fight the parser because it really wants to go to some file +-- but maybe some day I can figure it out. Some untagged text (in the pdf) somehow +-- gets seen as part of the last box. Anonymous content is simply not part of the +-- concept. Using a dummy name doesn't help either as the editor gets a signal to +-- open that dummy. Even an empty filename doesn't work. +-- +-- We output really simple and compact code, like: +-- +-- SyncTeX Version:1 +-- Input:1:e:/tmp/oeps.tex +-- Input:2:c:/data/develop/context/sources/klein.tex +-- Output:pdf +-- Magnification:1000 +-- Unit:1 +-- X Offset:0 +-- Y Offset:0 +-- Content: +-- !160 +-- {1 +-- h0,0:0,0,0,0,0 +-- v0,0:0,55380990:39158276,55380990,0 +-- h2,1:4661756,9176901:27969941,655360,327680 +-- h2,2:4661756,10125967:26048041,655360,327680 +-- h2,3:30962888,10125967:1668809,655360,327680 +-- h2,3:4661756,11075033:23142527,655360,327680 +-- h2,4:28046650,11075033:4585047,655360,327680 +-- h2,4:4661756,12024099:22913954,655360,327680 +-- h2,5:27908377,12024099:4723320,655360,327680 +-- h2,5:4661756,12973165:22918783,655360,327680 +-- h2,6:27884864,12973165:4746833,655360,327680 +-- h2,6:4661756,13922231:18320732,655360,327680 +-- ) +-- ] +-- !533 +-- }1 +-- Input:3:c:/data/develop/context/sources/ward.tex +-- !57 +-- {2 +-- h0,0:0,0,0,0,0 +-- v0,0:0,55380990:39158276,55380990,0 +-- h3,1:4661756,9176901:18813145,655360,327680 +-- h3,2:23713999,9176901:8917698,655360,327680 +-- h3,2:4661756,10125967:10512978,655360,327680 +-- h3,3:15457206,10125967:17174491,655360,327680 +-- h3,3:4661756,11075033:3571223,655360,327680 +-- h3,4:8459505,11075033:19885281,655360,327680 +-- h3,5:28571312,11075033:4060385,655360,327680 +-- h3,5:4661756,12024099:15344870,655360,327680 +-- ) +-- ] +-- !441 +-- }2 +-- !8 +-- Postamble: +-- Count:22 +-- !23 +-- Post scriptum: +-- +-- But for some reason, when the pdf file has some extra content (like page numbers) +-- the main document is consulted. Bah. It would be nice to have a mode for *only* +-- looking at marked areas. It somehow works not but maybe depends on the parser. +-- +-- Supporting reuseable objects makes not much sense as these are often graphics or +-- ornamental. They can not have hyperlinks etc (at least not without some hackery +-- which I'm not willing to do) so basically they are sort of useless for text. local type, rawset = type, rawset local concat = table.concat local formatters = string.formatters +local replacesuffix, suffixonly, nameonly = file.replacesuffix, file.suffix, file.nameonly +local openfile, renamefile, removefile = io.open, os.rename, os.remove + +local report_system = logs.reporter("system") -local trace = false trackers.register("system.syntex.visualize", function(v) trace = v end) +local tex = tex local nuts = nodes.nuts local tonut = nuts.tonut @@ -35,19 +136,18 @@ local getnext = nuts.getnext local getwhd = nuts.getwhd local getwidth = nuts.getwidth local getsubtype = nuts.getsubtype -local getattr = nuts.getattr local nodecodes = nodes.nodecodes local kerncodes = nodes.kerncodes +local glyph_code = nodecodes.glyph +local disc_code = nodecodes.disc local glue_code = nodecodes.glue +local penalty_code = nodecodes.penalty local kern_code = nodecodes.kern -local kern_disc = nodecodes.disc -local rule_code = nodecodes.rule ------ math_code = nodecodes.math +----- rule_code = nodecodes.rule local hlist_code = nodecodes.hlist local vlist_code = nodecodes.vlist -local glyph_code = nodecodes.glyph local fontkern_code = kerncodes.fontkern local insert_before = nuts.insert_before @@ -56,82 +156,131 @@ local insert_after = nuts.insert_after local nodepool = nuts.pool local new_latelua = nodepool.latelua local new_rule = nodepool.rule -local new_hlist = nodepool.hlist +local new_kern = nodepool.kern local getdimensions = nuts.dimensions local getrangedimensions = nuts.rangedimensions -local a_fontkern = attributes.private("fontkern") - local get_synctex_fields = nuts.get_synctex_fields local set_synctex_fields = nuts.set_synctex_fields -local set_syntex_tag = nodes.set_synctex_tag - -local getcount = tex.getcount -local setcount = tex.setcount +local set_synctex_line = tex.set_synctex_line +local set_synctex_tag = tex.set_synctex_tag +local force_synctex_tag = tex.force_synctex_tag +local force_synctex_line = tex.force_synctex_line +----- get_synctex_tag = tex.get_synctex_tag +----- get_synctex_line = tex.get_synctex_line +local set_synctex_mode = tex.set_synctex_mode local getpos = function() getpos = backends.codeinjections.getpos return getpos() end -local f_glue = formatters["g%i,%i:%i,%i"] -local f_glyph = formatters["x%i,%i:%i,%i"] -local f_kern = formatters["k%i,%i:%i,%i:%i"] -local f_rule = formatters["r%i,%i:%i,%i:%i,%i,%i"] -local f_hlist = formatters["[%i,%i:%i,%i:%i,%i,%i"] -local f_vlist = formatters["(%i,%i:%i,%i:%i,%i,%i"] -local s_hlist = "]" -local s_vlist = ")" -local f_hvoid = formatters["h%i,%i:%i,%i:%i,%i,%i"] -local f_vvoid = formatters["v%i,%i:%i,%i:%i,%i,%i"] +local foundintree = resolvers.foundintree + +local eol = "\010" + +----- f_glue = formatters["g%i,%i:%i,%i\010"] +----- f_glyph = formatters["x%i,%i:%i,%i\010"] +----- f_kern = formatters["k%i,%i:%i,%i:%i\010"] +----- f_rule = formatters["r%i,%i:%i,%i:%i,%i,%i\010"] +----- f_form = formatters["f%i,%i,%i\010"] +local z_hlist = "[0,0:0,0:0,0,0\010" +local z_vlist = "(0,0:0,0:0,0,0\010" +----- z_xform = "<0,0:0,0,0\010" -- or so +local s_hlist = "]\010" +local s_vlist = ")\010" +----- s_xform = ">\010" +local f_hlist_1 = formatters["h%i,%i:%i,%i:%i,%i,%i\010"] +local f_hlist_2 = formatters["h%i,%i:%i,%s:%i,%i,%i\010"] +local f_vlist_1 = formatters["v%i,%i:%i,%i:%i,%i,%i\010"] +local f_vlist_2 = formatters["v%i,%i:%i,%s:%i,%i,%i\010"] + +local synctex = luatex.synctex or { } +luatex.synctex = synctex -local characters = fonts.hashes.characters +-- status stuff -local synctex = { } -luatex.synctex = synctex +local enabled = false +local paused = 0 +local used = false +local never = false + +-- get rid of overhead + +if tex.set_synctex_no_files then + tex.set_synctex_no_files(1) +end -- the file name stuff local noftags = 0 local stnums = { } -local sttags = table.setmetatableindex(function(t,name) - noftags = noftags + 1 - t[name] = noftags - stnums[noftags] = name - return noftags +local nofblocked = 0 +local blockedfilenames = { } +local blockedsuffixes = { + mkii = true, + mkiv = true, + mkvi = true, + mkix = true, + mkxi = true, + -- lfg = true, +} + +local sttags = table.setmetatableindex(function(t,name) + if blockedsuffixes[suffixonly(name)] then + -- Just so that I don't get the ones on my development tree. + nofblocked = nofblocked + 1 + return 0 + elseif blockedfilenames[nameonly(name)] then + -- So we can block specific files. + nofblocked = nofblocked + 1 + return 0 + elseif foundintree(name) then + -- One shouldn't edit styles etc this way. + nofblocked = nofblocked + 1 + return 0 + else + noftags = noftags + 1 + t[name] = noftags + stnums[noftags] = name + return noftags + end end) -function synctex.setfilename(name) - if set_syntex_tag and name then - set_syntex_tag(sttags[name]) +function synctex.blockfilename(name) + blockedfilenames[nameonly(name)] = name +end + +function synctex.setfilename(name,line) + if paused == 0 and force_synctex_tag and name then + force_synctex_tag(sttags[name]) + if line then + force_synctex_line(line) + end end end function synctex.resetfilename() - if set_syntex_tag then - local name = luatex.currentfile() - if name then - set_syntex_tag(name) - end + if paused == 0 and force_synctex_tag then + force_synctex_tag(0) + force_synctex_line(0) end end -- the node stuff -local result = { } -local r = 0 -local f = nil -local nofsheets = 0 -local nofobjects = 0 -local last = 0 -local filesdone = 0 -local enabled = false -local compact = true +local filehandle = nil +local nofsheets = 0 +local nofobjects = 0 +local last = 0 +local filesdone = 0 +local tmpfile = false +local logfile = false local function writeanchor() - local size = f:seek("end") - f:write("!" .. (size-last) .. "\n") + local size = filehandle:seek("end") + filehandle:write("!",size-last,eol) last = size end @@ -139,291 +288,349 @@ local function writefiles() local total = #stnums if filesdone < total then for i=filesdone+1,total do - f:write("Input:"..i..":"..stnums[i].."\n") + filehandle:write("Input:",i,":",stnums[i],eol) end filesdone = total end end +local function makenames() + logfile = replacesuffix(tex.jobname,"synctex") + tmpfile = replacesuffix(logfile,"syncctx") +end + local function flushpreamble() - local jobname = tex.jobname - stnums[0] = jobname - f = io.open(file.replacesuffix(jobname,"syncctx"),"w") - f:write("SyncTeX Version:1\n") - f:write("Input:0:"..jobname.."\n") - writefiles() - f:write("Output:pdf\n") - f:write("Magnification:1000\n") - f:write("Unit:1\n") - f:write("X Offset:0\n") - f:write("Y Offset:0\n") - f:write("Content:\n") - flushpreamble = writefiles + makenames() + filehandle = openfile(tmpfile,"wb") + if filehandle then + filehandle:write("SyncTeX Version:1",eol) + writefiles() + filehandle:write("Output:pdf",eol) + filehandle:write("Magnification:1000",eol) + filehandle:write("Unit:1",eol) + filehandle:write("X Offset:0",eol) + filehandle:write("Y Offset:0",eol) + filehandle:write("Content:",eol) + flushpreamble = function() + writefiles() + return filehandle + end + else + enabled = false + end + return filehandle +end + +function synctex.wrapup() + if tmpfile then + renamefile(tmpfile,logfile) + end end local function flushpostamble() + if not filehandle then + return + end writeanchor() - f:write("Postamble:\n") - f:write("Count:"..nofobjects.."\n") + filehandle:write("Postamble:",eol) + filehandle:write("Count:",nofobjects,eol) writeanchor() - f:write("Post scriptum:\n") - f:close() + filehandle:write("Post scriptum:",eol) + filehandle:close() enabled = false end -local pageheight = 0 -- todo: set before we do this! +-- local function doaction(action,t,l,w,h,d) +-- local x, y = getpos() +-- filehandle:write(action(t,l,x,tex.pageheight-y,w,h,d)) +-- nofobjects = nofobjects + 1 +-- end +-- +-- local function noaction(action) +-- filehandle:write(action) +-- nofobjects = nofobjects + 1 +-- end +-- +-- local function b_vlist(head,current,t,l,w,h,d) +-- return insert_before(head,current,new_latelua(function() doaction(f_vlist,t,l,w,h,d) end)) +-- end +-- +-- local function b_hlist(head,current,t,l,w,h,d) +-- return insert_before(head,current,new_latelua(function() doaction(f_hlist,t,l,w,h,d) end)) +-- end +-- +-- local function e_vlist(head,current) +-- return insert_after(head,current,new_latelua(noaction(s_vlist))) +-- end +-- +-- local function e_hlist(head,current) +-- return insert_after(head,current,new_latelua(noaction(s_hlist))) +-- end +-- +-- local function x_vlist(head,current,t,l,w,h,d) +-- return insert_before(head,current,new_latelua(function() doaction(f_vlist_1,t,l,w,h,d) end)) +-- end +-- +-- local function x_hlist(head,current,t,l,w,h,d) +-- return insert_before(head,current,new_latelua(function() doaction(f_hlist_1,t,l,w,h,d) end)) +-- end +-- +-- generic +-- +-- local function doaction(t,l,w,h,d) +-- local x, y = getpos() +-- filehandle:write(f_hlist_1(t,l,x,tex.pageheight-y,w,h,d)) +-- nofobjects = nofobjects + 1 +-- end + +local x_hlist do -local function b_hlist(head,current,t,l,w,h,d) - return insert_before(head,current,new_latelua(function() + local function doaction_1(t,l,w,h,d) local x, y = getpos() - r = r + 1 - result[r] = f_hlist(t,l,x,tex.pageheight-y,w,h,d) + filehandle:write(f_hlist_1(t,l,x,tex.pageheight-y,w,h,d)) nofobjects = nofobjects + 1 - end)) -end + end -local function b_vlist(head,current,t,l,w,h,d) - return insert_before(head,current,new_latelua(function() + -- local lastx, lasty, lastw, lasth, lastd + -- + -- local function doaction_2(t,l,w,h,d) + -- local x, y = getpos() + -- y = tex.pageheight-y + -- filehandle:write(f_hlist_2(t,l, + -- x == lastx and "=" or x, + -- y == lasty and "=" or y, + -- w == lastw and "=" or w, + -- h == lasth and "=" or h, + -- d == lastd and "=" or d + -- )) + -- lastx, lasty, lastw, lasth, lastd = x, y, w, h, d + -- nofobjects = nofobjects + 1 + -- end + -- + -- but ... only y is supported: + + local lasty = false + + local function doaction_2(t,l,w,h,d) local x, y = getpos() - r = r + 1 - result[r] = f_vlist(t,l,x,tex.pageheight-y,w,h,d) + y = tex.pageheight - y + filehandle:write(f_hlist_2(t,l,x,y == lasty and "=" or y,w,h,d)) + lasty = y nofobjects = nofobjects + 1 - end)) -end + end -local function e_hlist(head,current) - return insert_after(head,current,new_latelua(function() - r = r + 1 - result[r] = s_hlist - nofobjects = nofobjects + 1 - end)) -end + local doaction = doaction_1 -local function e_vlist(head,current) - return insert_after(head,current,new_latelua(function() - r = r + 1 - result[r] = s_vlist - nofobjects = nofobjects + 1 - end)) -end + x_hlist = function(head,current,t,l,w,h,d) + return insert_before(head,current,new_latelua(function() doaction(t,l,w,h,d) end)) + end -local function x_hlist(head,current,t,l,w,h,d) - return insert_before(head,current,new_latelua(function() - local x, y = getpos() - r = r + 1 - result[r] = f_hvoid(t,l,x,tex.pageheight-y,w,h,d) - nofobjects = nofobjects + 1 - end)) -end + directives.register("system.synctex.compression", function(v) + doaction = tonumber(v) == 2 and doaction_2 or doaction_1 + end) -local function x_vlist(head,current,t,l,w,h,d) - return insert_before(head,current,new_latelua(function() - local x, y = getpos() - r = r + 1 - result[r] = f_vvoid(t,l,x,tex.pageheight-y,w,h,d) - nofobjects = nofobjects + 1 - end)) end --- local function x_glyph(head,current,t,l) --- return insert_before(head,current,new_latelua(function() --- local x, y = getpos() --- r = r + 1 --- result[r] = f_glyph(t,l,x,tex.pageheight-y) --- nofobjects = nofobjects + 1 --- end)) --- end +-- color is already handled so no colors --- local function x_glue(head,current,t,l) --- return insert_before(head,current,new_latelua(function() --- local x, y = getpos() --- r = r + 1 --- result[r] = f_glue(t,l,x,tex.pageheight-y) --- nofobjects = nofobjects + 1 --- end)) --- end +local collect = nil +local fulltrace = false +local trace = false +local height = 10 * 65536 +local depth = 5 * 65536 +local traceheight = 32768 +local tracedepth = 32768 --- local function x_kern(head,current,t,l,k) --- return insert_before(head,current,new_latelua(function() --- local x, y = getpos() --- r = r + 1 --- result[r] = f_kern(t,l,x,tex.pageheight-y,k) --- nofobjects = nofobjects + 1 --- end)) --- end +trackers.register("system.synctex.visualize", function(v) + trace = v + fulltrace = v == "real" +end) --- local function x_rule(head,current,t,l,w,h,d) --- return insert_before(head,current,new_latelua(function() --- local x, y = getpos() --- r = r + 1 --- result[r] = f_rule(t,l,x,tex.pageheight-y,w,h,d) --- nofobjects = nofobjects + 1 --- end)) --- end +local function inject(head,first,last,tag,line) + local w, h, d = getdimensions(first,getnext(last)) + if h < height then + h = height + end + if d < depth then + d = depth + end + if trace then + head = insert_before(head,first,new_rule(w,fulltrace and h or traceheight,fulltrace and d or tracedepth)) + head = insert_before(head,first,new_kern(-w)) + end + head = x_hlist(head,first,tag,line,w,h,d) + return head +end -local function collect(head,t,l) +local function collect_min(head) local current = head while current do local id = getid(current) if id == glyph_code then local first = current local last = current + local tag = 0 + local line = 0 while true do - id = getid(current) - if id == glyph_code or id == disc_code then + if id == glyph_code then + local tc, lc = get_synctex_fields(current) + if tc and tc > 0 then + tag = tc + line = lc + end last = current - elseif id == kern_code and (getsubtype(current) == fontkern_code or getattr(current,a_fontkern)) then + elseif id == disc_code or (id == kern_code and getsubtype(current) == fontkern_code) then last = current else - if id == glue_code then - -- we could go on when we're in the same t/l run - local tc, lc = get_synctex_fields(current) - if tc > 0 then - t, l = tc, lc - end - id = nil -- so no test later on - end - local w, h, d = getdimensions(first,getnext(last)) - -- local w, h, d = getrangedimensions(head,first,getnext(last)) - if trace then - -- color is already handled so no colors - head = insert_before(head,first,new_hlist(new_rule(w,32768,32768))) + if tag > 0 then + head = inject(head,first,last,tag,line) end -if h < 655360 then - h = 655360 -end -if d < 327680 then - d = 327680 -end - head = x_hlist(head,first,t,l,w,h,d) break end current = getnext(current) - if not current then - local w, h, d = getdimensions(first,getnext(last)) - -- local w, h, d = getrangedimensions(head,first,getnext(last)) - if trace then - -- color is already handled so no colors - head = insert_before(head,first,new_hlist(new_rule(w,32768,32768))) + if current then + id = getid(current) + else + if tag > 0 then + head = inject(head,first,last,tag,line) end -if h < 655360 then - h = 655360 -end -if d < 327680 then - d = 327680 -end - head = x_hlist(head,first,t,l,w,h,d) return head end end end - if id == hlist_code then + -- pick up (as id can have changed) + if id == hlist_code or id == vlist_code then local list = getlist(current) - local tc, lc = get_synctex_fields(current) - if tc > 0 then - t, l = tc, lc - end - if compact then - if list then - local l = collect(list,t,l) - if l ~= list then - setlist(current,l) - end + if list then + local l = collect(list) + if l ~= list then + setlist(current,l) end - else - local w, h, d = getwhd(current) - if w == 0 or (h == 0 and d == 0) then - if list then - local l = collect(list,t,l) - if l ~= list then - setlist(current,l) + end + end + current = getnext(current) + end + return head +end + +local function inject(parent,head,first,last,tag,line) + local w, h, d = getrangedimensions(parent,first,getnext(last)) + if h < height then + h = height + end + if d < depth then + d = depth + end + if trace then + head = insert_before(head,first,new_rule(w,fulltrace and h or traceheight,fulltrace and d or tracedepth)) + head = insert_before(head,first,new_kern(-w)) + end + head = x_hlist(head,first,tag,line,w,h,d) + return head +end + +local function collect_max(head,parent) + local current = head + while current do + local id = getid(current) + if id == glyph_code then + local first = current + local last = current + local tag = 0 + local line = 0 + while true do + if id == glyph_code then + local tc, lc = get_synctex_fields(current) + if tc and tc > 0 then + if tag > 0 and (tag ~= tc or line ~= lc) then + head = inject(parent,head,first,last,tag,line) + first = current end + tag = tc + line = lc + last = current + else + if tag > 0 then + head = inject(parent,head,first,last,tag,line) + tag = 0 + end + first = nil + last = nil end - elseif list then - -- head = b_hlist(head,current,t,l,w,h,d) - head = b_hlist(head,current,0,0,w,h,d) - local l = collect(list,t,l) - if l ~= list then - setlist(current,l) + elseif id == disc_code then + if not first then + first = current end - head, current = e_hlist(head,current) - else - -- head = x_hlist(head,current,t,l,w,h,d) - head = x_hlist(head,current,0,0,w,h,d) - end - end - elseif id == vlist_code then - local list = getlist(current) - local tc, lc = get_synctex_fields(current) - if tc > 0 then - t, l = tc, lc - end - if compact then - if list then - local l = collect(list,t,l) - if l ~= list then - setlist(current,l) + last = current + elseif id == kern_code and getsubtype(current) == fontkern_code then + if first then + last = current end - end - else - local w, h, d = getwhd(current) - if w == 0 or (h == 0 and d == 0) then - if list then - local l = collect(list,t,l) - if l ~= list then - setlist(current,l) + elseif id == glue_code then + if tag > 0 then + local tc, lc = get_synctex_fields(current) + if tc and tc > 0 then + if tag ~= tc or line ~= lc then + head = inject(parent,head,first,last,tag,line) + tag = 0 + break + end + else + head = inject(parent,head,first,last,tag,line) + tag = 0 + break end + else + tag = 0 + break end - elseif list then - -- head = b_vlist(head,current,t,l,w,h,d) - head = b_vlist(head,current,0,0,w,h,d) - local l = collect(list,t,l) - if l ~= list then - setlist(current,l) + id = nil -- so no test later on + elseif id == penalty_code then + -- go on (and be nice for math) + else + if tag > 0 then + head = inject(parent,head,first,last,tag,line) + tag = 0 end - head, current = e_vlist(head,current) + break + end + current = getnext(current) + if current then + id = getid(current) else - -- head = x_vlist(head,current,t,l,w,h,d) - head = x_vlist(head,current,0,0,w,h,d) + if tag > 0 then + head = inject(parent,head,first,last,tag,line) + end + return head end end - elseif id == glue_code then - local tc, lc = get_synctex_fields(current) - if tc > 0 then - t, l = tc, lc + end + -- pick up(as id can have changed) + if id == hlist_code or id == vlist_code then + local list = getlist(current) + if list then + local l = collect(list,current) + if l ~= list then + setlist(current,l) + end end - -- head = x_glue(head,current,t,l) - -- elseif id == kern_code then - -- local tc, lc = get_synctex_fields(current) - -- if tc > 0 then - -- t, l = tc, lc - -- end - -- -- local k = getwidth(current) - -- -- if k ~= 0 then - -- -- head = x_kern(head,current,t,l,k) - -- -- end - -- elseif id == rule_code then - -- local tc, lc = get_synctex_fields(current) - -- if tc > 0 then - -- t, l = tc, lc - -- end - -- -- if t > 0 and l > 0 then - -- -- local w, h, d = getwhd(current) - -- -- head = x_rule(head,current,t,l,w,h,d) - -- -- end end current = getnext(current) end return head end --- range of same numbers +collect = collect_max -function synctex.collect(head) +function synctex.collect(head,where) if enabled then - result, r = { }, 0 - head = collect(tonut(head),0,0) - return tonode(head), true + if where == "object" then + return head, false + else + local h = tonut(head) + h = collect(h,h) + return tonode(h), true + end else return head, false end @@ -431,74 +638,159 @@ end -- also no solution for bad first file resolving in sumatra -function synctex.flush() +function synctex.start() if enabled then nofsheets = nofsheets + 1 -- could be realpageno - flushpreamble() - writeanchor() - f:write("{"..nofsheets.."\n") - if compact then - f:write(f_vlist(0,0,0,0,tex.pagewidth,tex.pageheight,0)) - f:write("\n") - end - f:write(concat(result,"\n")) - if compact then - f:write("\n") - f:write(s_vlist) + if flushpreamble() then + writeanchor() + filehandle:write("{",nofsheets,eol) + -- this seems to work: + local h = tex.pageheight + local w = tex.pagewidth + filehandle:write(z_hlist) + filehandle:write(f_vlist_1(0,0,0,h,w,h,0)) end - f:write("\n") + end +end + +function synctex.stop() + if enabled then + filehandle:write(s_vlist,s_hlist) writeanchor() - f:write("}"..nofsheets.."\n") + filehandle:write("}",nofsheets,eol) nofobjects = nofobjects + 2 - result, r = { }, 0 end end +local enablers = { } +local disablers = { } + +function synctex.registerenabler(f) + enablers[#enablers+1] = f +end + +function synctex.registerdisabler(f) + disablers[#disablers+1] = f +end + function synctex.enable() - if not enabled and node.set_synctex_mode then + if not never and not enabled then enabled = true - node.set_synctex_mode(1) - tex.normalsynctex = 0 - nodes.tasks.appendaction("shipouts", "after", "nodes.synctex.collect") + set_synctex_mode(3) -- we want details + if not used then + nodes.tasks.appendaction("shipouts", "after", "luatex.synctex.collect") + report_system("synctex functionality is enabled, expect 5-10 pct runtime overhead!") + used = true + end + for i=1,#enablers do + enablers[i](true) + end + end +end + +function synctex.disable() + if enabled then + set_synctex_mode(0) + report_system("synctex functionality is disabled!") + enabled = false + for i=1,#disablers do + disablers[i](false) + end end end function synctex.finish() if enabled then flushpostamble() + else + makenames() + removefile(logfile) + removefile(tmpfile) end end +local filename = nil + +function synctex.pause() + paused = paused + 1 + if enabled and paused == 1 then + set_synctex_mode(0) + end +end + +function synctex.resume() + if enabled and paused == 1 then + set_synctex_mode(3) + end + paused = paused - 1 +end + -- not the best place luatex.registerstopactions(synctex.finish) -nodes.tasks.appendaction("shipouts", "after", "luatex.synctex.collect") - --- moved here +statistics.register("synctex tracing",function() + if used then + return string.format("%i referenced files, %i files ignored, %i objects flushed, logfile: %s", + noftags,nofblocked,nofobjects,logfile) + end +end) -local report_system = logs.reporter("system") -local synctex = false +local implement = interfaces.implement +local variables = interfaces.variables -directives.register("system.synctex", function(v) - if v == "context" then - luatex.synctex.enable() - setcount("normalsynctex",0) - synctex = true +function synctex.setup(t) + if t.state == variables.never then + synctex.disable() -- just in case + never = true + return + end + if t.method == variables.max then + collect = collect_max else - v = tonumber(v) or (toboolean(v,true) and 1) or (v == "zipped" and 1) or (v == "unzipped" and -1) or 0 - setcount("normalsynctex",v) - synctex = v ~= 0 + collect = collect_min end - if synctex then - report_system("synctex functionality is enabled (%s), expect runtime overhead!",tostring(v)) + if t.state == variables.start then + synctex.enable() else - report_system("synctex functionality is disabled!") + synctex.disable() end -end) +end -statistics.register("synctex tracing",function() - if synctex or getcount("normalsynctex") ~= 0 then - return "synctex has been enabled (extra log file generated)" - end -end) +implement { + name = "synctexblockfilename", + arguments = "string", + actions = synctex.blockfilename, +} + +implement { + name = "synctexsetfilename", + arguments = "string", + actions = synctex.setfilename, +} + +implement { + name = "synctexresetfilename", + actions = synctex.resetfilename, +} + +implement { + name = "setupsynctex", + actions = synctex.setup, + arguments = { + { + { "state" }, + { "method" }, + }, + }, +} + +implement { + name = "synctexpause", + actions = synctex.pause, +} + +implement { + name = "synctexresume", + actions = synctex.resume, +} diff --git a/tex/context/base/mkiv/node-tra.lua b/tex/context/base/mkiv/node-tra.lua index 8c79e0ab8..f12599866 100644 --- a/tex/context/base/mkiv/node-tra.lua +++ b/tex/context/base/mkiv/node-tra.lua @@ -11,6 +11,7 @@ if not modules then modules = { } end modules ['node-tra'] = { might become a runtime module instead. This module will be cleaned up!</p> --ldx]]-- +local next = next local utfchar = utf.char local format, match, gmatch, concat, rep = string.format, string.match, string.gmatch, table.concat, string.rep local lpegmatch = lpeg.match @@ -38,7 +39,6 @@ local nuts = nodes.nuts local tonut = nuts.tonut local tonode = nuts.tonode -local getfield = nuts.getfield local getnext = nuts.getnext local getprev = nuts.getprev local getid = nuts.getid @@ -298,34 +298,38 @@ nodes.showsimplelist = function(h,depth) showsimplelist(h,depth,0) end local function listtoutf(h,joiner,textonly,last,nodisc) local w = { } + local n = 0 while h do local c, id = isglyph(h) if c then - w[#w+1] = c >= 0 and utfchar(c) or formatters["<%i>"](c) + n = n + 1 ; w[n] = c >= 0 and utfchar(c) or formatters["<%i>"](c) if joiner then - w[#w+1] = joiner + n = n + 1 ; w[n] = joiner end elseif id == disc_code then local pre, pos, rep = getdisc(h) if not nodisc then - w[#w+1] = formatters["[%s|%s|%s]"] ( + n = n + 1 ; w[n] = formatters["[%s|%s|%s]"] ( pre and listtoutf(pre,joiner,textonly) or "", pos and listtoutf(pos,joiner,textonly) or "", rep and listtoutf(rep,joiner,textonly) or "" ) elseif rep then - w[#w+1] = listtoutf(rep,joiner,textonly) or "" + n = n + 1 ; w[n] = listtoutf(rep,joiner,textonly) or "" + end + if joiner then + n = n + 1 ; w[n] = joiner end elseif textonly then if id == glue_code then if getwidth(h) > 0 then - w[#w+1] = " " + n = n + 1 ; w[n] = " " end elseif id == hlist_code or id == vlist_code then - w[#w+1] = "[]" + n = n + 1 ; w[n] = "[]" end else - w[#w+1] = "[-]" + n = n + 1 ; w[n] = "[-]" end if h == last then break @@ -333,7 +337,7 @@ local function listtoutf(h,joiner,textonly,last,nodisc) h = getnext(h) end end - return concat(w) + return concat(w,"",1,(w[n] == joiner) and (n-1) or n) end function nodes.listtoutf(h,joiner,textonly,last,nodisc) @@ -376,8 +380,7 @@ local f_z_f = formatters["%0.5Fpt minus %0.5F%s"] local f_z_m = formatters["%0.5Fpt minus %0.5Fpt"] local f_z_z = formatters["%0.5Fpt"] -local tonut = nodes.tonut -local getfield = nodes.nuts.getfield +local tonut = nodes.tonut local function nodetodimen(n) n = tonut(n) diff --git a/tex/context/base/mkiv/node-tsk.lua b/tex/context/base/mkiv/node-tsk.lua index c33f0e9f4..1ce7ab1dc 100644 --- a/tex/context/base/mkiv/node-tsk.lua +++ b/tex/context/base/mkiv/node-tsk.lua @@ -386,7 +386,7 @@ tasks.new { tasks.new { name = "shipouts", - arguments = 0, + arguments = 1, -- nostate = true, -- maybe but only for main ones so little gain processor = nodeprocessor, sequence = { diff --git a/tex/context/base/mkiv/node-tst.lua b/tex/context/base/mkiv/node-tst.lua index 1109f28a3..7ad35bd71 100644 --- a/tex/context/base/mkiv/node-tst.lua +++ b/tex/context/base/mkiv/node-tst.lua @@ -26,7 +26,6 @@ local belowdisplayshortskip_code = skipcodes.belowdisplayshortskip local nuts = nodes.nuts -local getfield = nuts.getfield local getnext = nuts.getnext local getprev = nuts.getprev local getid = nuts.getid diff --git a/tex/context/base/mkiv/node-typ.lua b/tex/context/base/mkiv/node-typ.lua index dea48cda8..021bfefc2 100644 --- a/tex/context/base/mkiv/node-typ.lua +++ b/tex/context/base/mkiv/node-typ.lua @@ -15,12 +15,10 @@ local nuts = nodes.nuts local tonode = nuts.tonode local tonut = nuts.tonut -local setfield = nuts.setfield local setlink = nuts.setlink local setchar = nuts.setchar local setattrlist = nuts.setattrlist -local getfield = nuts.getfield local getfont = nuts.getfont local getattrlist = nuts.getattrlist diff --git a/tex/context/base/mkiv/pack-box.mkiv b/tex/context/base/mkiv/pack-box.mkiv index 8279fcd71..c53b4520c 100644 --- a/tex/context/base/mkiv/pack-box.mkiv +++ b/tex/context/base/mkiv/pack-box.mkiv @@ -1138,4 +1138,21 @@ \box\nextbox \egroup} +\unexpanded\def\overlayimage#1% + {\vpack to \overlayheight\bgroup + \vss + \hpack to \overlaywidth\bgroup + \hss + \externalfigure[#1][\c!factor=\v!min,\c!equalwidth=\overlaywidth,\c!equalheight=\overlayheight]% + \hss + \egroup + \vss + \egroup} + +\unexpanded\def\clippedoverlayimage#1% + {\clip + [\c!width=\overlaywidth,\c!height=\overlayheight] + {\overlayimage{#1}}} + + \protect \endinput diff --git a/tex/context/base/mkiv/pack-com.mkiv b/tex/context/base/mkiv/pack-com.mkiv index 8abee1daf..59354208e 100644 --- a/tex/context/base/mkiv/pack-com.mkiv +++ b/tex/context/base/mkiv/pack-com.mkiv @@ -78,7 +78,7 @@ \newcount\c_pack_combinations_nesting % local \newcount\c_pack_combinations_x % global -\newcount\c_pack_combinations_n % global +\newcount\c_pack_combinations_y % global \newcount\c_pack_combinations_max % global \newbox \b_pack_combinations_captions % global \newbox \b_pack_combinations_temp % global @@ -93,7 +93,7 @@ \initializeboxstack{\??combination temp} \newcount\c_pack_combinations_x_saved -\newcount\c_pack_combinations_n_saved +\newcount\c_pack_combinations_y_saved \newcount\c_pack_combinations_max_saved \newbox \b_pack_combinations_captions_saved \newbox \b_pack_combinations_temp_saved @@ -106,7 +106,7 @@ {\advance\c_pack_combinations_nesting\plusone \ifnum\c_pack_combinations_nesting>\plusone \c_pack_combinations_x_saved \c_pack_combinations_x - \c_pack_combinations_n_saved \c_pack_combinations_n + \c_pack_combinations_y_saved \c_pack_combinations_y \c_pack_combinations_max_saved\c_pack_combinations_max \setbox\b_pack_combinations_captions_saved\box\b_pack_combinations_captions \setbox\b_pack_combinations_temp_saved \box\b_pack_combinations_temp @@ -119,7 +119,7 @@ \def\pack_combinations_pop {\ifnum\c_pack_combinations_nesting>\plusone \global\c_pack_combinations_x \c_pack_combinations_x_saved - \global\c_pack_combinations_n \c_pack_combinations_n_saved + \global\c_pack_combinations_y \c_pack_combinations_y_saved \global\c_pack_combinations_max\c_pack_combinations_max_saved \global\setbox\b_pack_combinations_captions\box\b_pack_combinations_captions_saved \global\setbox\b_pack_combinations_temp \box\b_pack_combinations_temp_saved @@ -204,7 +204,7 @@ % \unexpanded\def\stopcombination % {\bgroup % \scratchtoks{{}}% -% \dorecurse\c_pack_combinations_n +% \dorecurse\c_pack_combinations_y % {\scratchtoks\expandafter{\the\scratchtoks{}{}}}% % \expandafter\egroup\the\scratchtoks % \egroup @@ -219,7 +219,7 @@ \unexpanded\def\pack_common_caption_stop {\removeunwantedspaces\egroup} \unexpanded\def\stopcombination - {\bgroup\normalexpanded{\egroup{}\ntimes{{}{}}\c_pack_combinations_n}% brr + {\bgroup\normalexpanded{\egroup{}\ntimes{{}{}}\c_pack_combinations_y}% brr \dostoptagged \egroup \pack_combinations_pop @@ -271,15 +271,20 @@ \let\combination\empty % permits \combination{}{} handy for cld \normalexpanded{\pack_combinations_start_indeed[\currentcombinationspec]}} +\let\pack_combinations_check_x_y\relax + \unexpanded\def\pack_combinations_start_indeed[#1*#2*#3]% {\global\c_pack_combinations_x#1\relax - \global\c_pack_combinations_n#2\relax + \global\c_pack_combinations_y#2\relax + \setexpandedcombinationparameter\c!nx{\the\c_pack_combinations_x}% in case we access it + \setexpandedcombinationparameter\c!ny{\the\c_pack_combinations_y}% in case we access it + \pack_combinations_check_x_y \dotagcombination \global\setbox\b_pack_combinations_captions\emptybox \global\c_pack_combinations_max\c_pack_combinations_x - \multiply\c_pack_combinations_n\c_pack_combinations_x + \multiply\c_pack_combinations_y\c_pack_combinations_x \tabskip\zeropoint - \halign \ifx\p_width\v!fit\else to \p_width \fi \bgroup + \halign \ifx\p_width\v!fit\else to \p_width \fi \bgroup % repetitive preamble \aligntab \m_pack_combinations_leftfiller \alignmark\alignmark @@ -382,8 +387,8 @@ \m_pack_combinations_valigner{\box\b_pack_combinations_content}% % we need to save the caption for a next alignment line \pack_combinations_save_caption}% - \ifnum\c_pack_combinations_n>\plusone - \global\advance\c_pack_combinations_n\minusone + \ifnum\c_pack_combinations_y>\plusone + \global\advance\c_pack_combinations_y\minusone \global\advance\c_pack_combinations_x\minusone \ifcase\c_pack_combinations_x \doubleexpandafter\pack_combinations_pickup_package_pair_a @@ -486,19 +491,40 @@ \let\stopfloatcombination\relax +\unexpanded\def\pack_combinations_float_hack_a#1% + {\strc_floats_build_box_separate_split{\getlocalfloat{#1}}% + \box\b_strc_floats_separate_content} + +\unexpanded\def\pack_combinations_float_hack_b#1% + {\box\b_strc_floats_separate_caption} + \def\pack_combinations_start_float[#1][#2]% {\ifinsidefloat\else\dontleavehmode\fi % tricky, floatcombinations fail to align well otherwise \vbox\bgroup + \strc_floats_build_box_separate_set %\insidecolumnstrue % trick, forces no centering, todo: proper switch/feature \postcenterfloatmethod\zerocount \forcelocalfloats \unexpanded\def\stopfloatcombination{\pack_combinations_stop_float{#1}}} +\def\pack_combinations_float_check_x_y + {\ifnum\numexpr\c_pack_combinations_x*\c_pack_combinations_y\relax<\noflocalfloats\relax + \global\c_pack_combinations_x\noflocalfloats + \global\c_pack_combinations_y\plusone + \fi + \let\pack_combinations_check_x_y\relax}% + \def\pack_combinations_stop_float#1% {\scratchtoks\emptytoks \dorecurse\noflocalfloats - {\appendetoks{\getlocalfloat{\recurselevel}}{}\to\scratchtoks}% brrr - \expanded{\startcombination[#1]\the\scratchtoks}\stopcombination + {\appendetoks + {\pack_combinations_float_hack_a{\recurselevel}}% + {\pack_combinations_float_hack_b{\recurselevel}}% + \to\scratchtoks}% brrr + \let\pack_combinations_check_x_y\pack_combinations_float_check_x_y + \doifassignmentelse{#1} + {\expanded{\startcombination[#1]\the\scratchtoks}\stopcombination}% + {\expanded{\startcombination[#1]\the\scratchtoks}\stopcombination}% \resetlocalfloats \egroup} @@ -771,25 +797,25 @@ \pairedboxparameter\c!inbetween \box\b_pack_pairedboxes_second} -\setvalue{\??pairedboxalign \v!left}% 0 +\setvalue{\??pairedboxalign\v!left}% 0 {\let\pack_pairedboxes_align_l\relax \let\pack_pairedboxes_align_r\hss \let\pack_pairedboxes_align_t\relax \let\pack_pairedboxes_align_b\relax} -\setvalue{\??pairedboxalign \v!right}% 1 +\setvalue{\??pairedboxalign\v!right}% 1 {\let\pack_pairedboxes_align_l\hss \let\pack_pairedboxes_align_r\relax \let\pack_pairedboxes_align_t\relax \let\pack_pairedboxes_align_b\relax} -\setvalue{\??pairedboxalign \v!high}% 2 +\setvalue{\??pairedboxalign\v!high}% 2 {\let\pack_pairedboxes_align_l\relax \let\pack_pairedboxes_align_r\relax \let\pack_pairedboxes_align_t\relax \let\pack_pairedboxes_align_b\vss} -\setvalue{\??pairedboxalign \v!low}% 3 +\setvalue{\??pairedboxalign\v!low}% 3 {\let\pack_pairedboxes_align_l\relax \let\pack_pairedboxes_align_r\relax \let\pack_pairedboxes_align_t\vss diff --git a/tex/context/base/mkiv/pack-obj.lua b/tex/context/base/mkiv/pack-obj.lua index cba0dcf8f..f68c1ba0c 100644 --- a/tex/context/base/mkiv/pack-obj.lua +++ b/tex/context/base/mkiv/pack-obj.lua @@ -27,6 +27,7 @@ local new_latelua = nuts.pool.latelua local settexdimen = tokens.setters.dimen local gettexbox = tokens.getters.box +local settexbox = tokens.setters.box local gettexdimen = tokens.getters.dimen local gettexcount = tokens.getters.count @@ -124,22 +125,37 @@ objects = { n = 0, } -function objects.register(ns,id,b,referenced) +local objects = objects + +function objects.register(ns,id,b,referenced,offset,mode) objects.n = objects.n + 1 - nodes.handlers.finalize(gettexbox(b)) - data[ns][id] = { - codeinjections.registerboxresource(b), -- a box number - gettexdimen("objectoff"), - referenced - } + nodes.handlers.finalize(gettexbox(b),"object") + if mode == 0 then + -- tex + data[ns][id] = { + codeinjections.registerboxresource(b), -- a box number + offset, + referenced or false, + mode, + } + else + -- box (backend) + data[ns][id] = { + codeinjections.registerboxresource(b,offset), -- a box number + false, + referenced, + mode, + } + end end -function objects.restore(ns,id) +function objects.restore(ns,id) -- why not just pass a box number here too (ok, we also set offset) local d = data[ns][id] if d then local index = d[1] local offset = d[2] local status = d[3] + local mode = d[4] local hbox = codeinjections.restoreboxresource(index) -- a nut ! if status then local list = getlist(hbox) @@ -149,10 +165,10 @@ function objects.restore(ns,id) setlink(list,page) end setbox("objectbox",hbox) - settexdimen("objectoff",offset) + settexdimen("objectoff",offset or 0) else setbox("objectbox",nil) - settexdimen("objectoff",0) + settexdimen("objectoff",0) -- for good old times end end @@ -161,7 +177,7 @@ function objects.dimensions(index) if d then return codeinjections.boxresourcedimensions(d[1]) else - return 0, 0, 0 + return 0, 0, 0, 0 end end @@ -184,13 +200,13 @@ end implement { name = "registerreferencedobject", - arguments = { "string", "string", "integer", true }, + arguments = { "string", "string", "integer", true, "dimension", "integer" }, actions = objects.register, } implement { name = "registerobject", - arguments = { "string", "string", "integer" }, + arguments = { "string", "string", "integer", false, "dimension", "integer" }, actions = objects.register, } @@ -238,15 +254,15 @@ implement { name = "getobjectdimensions", arguments = { "string", "string" }, actions = function(ns,id) - local o = data[ns][id] - local w, h, d = 0, 0, 0 - if d then - w, h, d = codeinjections.boxresourcedimensions(o[1]) + local object = data[ns][id] + local w, h, d, o = 0, 0, 0, 0 + if object then + w, h, d, o = codeinjections.boxresourcedimensions(object[1]) end settexdimen("objectwd",w or 0) settexdimen("objectht",h or 0) settexdimen("objectdp",d or 0) - settexdimen("objectoff",o[2]) + settexdimen("objectoff",o or #objects > 2 and object[2] or 0) end } diff --git a/tex/context/base/mkiv/pack-obj.mkiv b/tex/context/base/mkiv/pack-obj.mkiv index 23608846d..aeb5cb4f4 100644 --- a/tex/context/base/mkiv/pack-obj.mkiv +++ b/tex/context/base/mkiv/pack-obj.mkiv @@ -15,7 +15,7 @@ \unprotect -\registerctxluafile{pack-obj}{1.001} +\registerctxluafile{pack-obj}{} %D \macros %D {setobject,getobject,ifinobject} @@ -51,65 +51,79 @@ \newdimen\objectht \def\objectheight{\the\objectht} \newdimen\objectdp \def\objectdepth {\the\objectdp} -% If I have time I will use the unreferenced variant for e.g. mp reuse. +%D If I have time I will use the unreferenced variant for e.g. mp reuse. -% todo formmargin per obj - -\unexpanded\def\setreferencedobject #1#2{\begingroup\objectoff\objectoffset\inobjecttrue\dowithnextbox{\pack_objects_set_yes{#1}{#2}}} -\unexpanded\def\settightreferencedobject #1#2{\begingroup\objectoff\zeropoint \inobjecttrue\dowithnextbox{\pack_objects_set_yes{#1}{#2}}} -\unexpanded\def\setunreferencedobject #1#2{\begingroup\objectoff\objectoffset\inobjecttrue\dowithnextbox{\pack_objects_set_nop{#1}{#2}}} -\unexpanded\def\settightunreferencedobject#1#2{\begingroup\objectoff\zeropoint \inobjecttrue\dowithnextbox{\pack_objects_set_nop{#1}{#2}}} +\unexpanded\def\setreferencedobject #1#2{\begingroup\synctexpause\objectoff\objectoffset\inobjecttrue\dowithnextbox{\pack_objects_set_yes{#1}{#2}}} +\unexpanded\def\settightreferencedobject #1#2{\begingroup\synctexpause\objectoff\zeropoint \inobjecttrue\dowithnextbox{\pack_objects_set_yes{#1}{#2}}} +\unexpanded\def\setunreferencedobject #1#2{\begingroup\synctexpause\objectoff\objectoffset\inobjecttrue\dowithnextbox{\pack_objects_set_nop{#1}{#2}}} +\unexpanded\def\settightunreferencedobject#1#2{\begingroup\synctexpause\objectoff\zeropoint \inobjecttrue\dowithnextbox{\pack_objects_set_nop{#1}{#2}}} \let\setobject \setreferencedobject \let\settightobject\settightreferencedobject +%D We can get subtle differences in boundingboxes but both methods work ok. + +\newconstant\c_pack_objects_offset_mode % 0=tex 1=box + +\unexpanded\def\pack_objects_temp_check % this will go away + {\ifnum\texenginefunctionality<6401\relax + \c_pack_objects_offset_mode\zerocount + \fi} + \unexpanded\def\pack_objects_set_yes#1#2% - {\ifdim\objectoff>\zeropoint\relax - \pack_objects_package + {\pack_objects_temp_check % this will go away + \ifcase\c_pack_objects_offset_mode + \ifzeropt\objectoff + \pack_objects_package_nop\nextbox + \else + \pack_objects_package_yes\nextbox + \fi \else - \setbox\objectbox\box\nextbox + \pack_objects_package_nop\nextbox \fi - \clf_registerreferencedobject{#1}{#2}\objectbox + \clf_registerreferencedobject{#1}{#2}\objectbox\objectoff\c_pack_objects_offset_mode + \synctexresume \endgroup} \unexpanded\def\pack_objects_set_nop#1#2% - {\ifdim\objectoff>\zeropoint\relax - \pack_objects_package + {\pack_objects_temp_check % this will go away + \ifcase\c_pack_objects_offset_mode + \ifzeropt\objectoff + \pack_objects_package_nop\nextbox + \else + \pack_objects_package_yes\nextbox + \fi \else - \setbox\objectbox\box\nextbox + \pack_objects_package_nop\nextbox \fi - \clf_registerobject{#1}{#2}\objectbox + \clf_registerobject{#1}{#2}\objectbox\objectoff\c_pack_objects_offset_mode + \synctexresume \endgroup} -\def\pack_objects_package - {\objectwd\dimexpr\wd\nextbox+2\objectoff\relax - \objectht\dimexpr\ht\nextbox+ \objectoff\relax - \objectdp\dimexpr\dp\nextbox+ \objectoff\relax - \setbox\objectbox\hpack - {\hskip\objectoff - \box\nextbox}% - \wd\objectbox\objectwd - \ht\objectbox\objectht - \dp\objectbox\objectdp} +\def\pack_objects_package_nop#1% we pack because otherwise \ruledhbox is still tight + {\setbox\objectbox\hpack{\box#1}} -\def\pack_objects_repackage - {\objectwd\dimexpr\wd\objectbox-2\objectoff\relax - \objectht\dimexpr\ht\objectbox- \objectoff\relax - \objectdp\dimexpr\dp\objectbox- \objectoff\relax +\def\pack_objects_package_yes#1% + {\objectwd\dimexpr\wd#1+2\objectoff\relax + \objectht\dimexpr\ht#1+ \objectoff\relax + \objectdp\dimexpr\dp#1+ \objectoff\relax \setbox\objectbox\hpack - {\hskip-\objectoff - \box\objectbox}% + {\hskip\objectoff + \box#1}% \wd\objectbox\objectwd \ht\objectbox\objectht \dp\objectbox\objectdp} \unexpanded\def\getobject#1#2% {\begingroup + \synctexpause \clf_restoreobject{#1}{#2}% - \ifdim\objectoff>\zeropoint - \pack_objects_repackage + \ifzeropt\objectoff\else + \objectoff-\objectoff + \pack_objects_package_yes\objectbox \fi \box\objectbox + \synctexresume \endgroup} %D If needed one can ask for the dimensions of an object with: @@ -118,8 +132,8 @@ %D \getobjectdimensions{class}{name} %D \stoptyping %D -%D The results are reported in \type {\objectwidth}, \type -%D {\objectheight} and \type {\objectdepth}. +%D The results are reported in \type {\objectwidth}, \type {\objectheight} and \type +%D {\objectdepth} as well as \type {\objectoffset}. \unexpanded\def\getobjectdimensions#1#2% {\clf_getobjectdimensions{#1}{#2}} @@ -127,8 +141,7 @@ %D \macros %D {doifobjectfoundelse,doifobjectreferencefoundelse} %D -%D To prevent redundant definition of objects, one can use -%D the next tests: +%D To prevent redundant definition of objects, one can use the next tests: %D %D \starttyping %D \doifobjectfoundelse{class}{object}{do then}{do else} diff --git a/tex/context/base/mkiv/pack-rul.lua b/tex/context/base/mkiv/pack-rul.lua index 30eda7dd2..c9771546c 100644 --- a/tex/context/base/mkiv/pack-rul.lua +++ b/tex/context/base/mkiv/pack-rul.lua @@ -20,6 +20,8 @@ if not modules then modules = { } end modules ['pack-rul'] = { local type = type +local context = context + local hlist_code = nodes.nodecodes.hlist local vlist_code = nodes.nodecodes.vlist local box_code = nodes.listcodes.box @@ -33,8 +35,6 @@ local implement = interfaces.implement local nuts = nodes.nuts -local getfield = nuts.getfield -local setfield = nuts.setfield local getnext = nuts.getnext local getprev = nuts.getprev local getlist = nuts.getlist @@ -47,6 +47,8 @@ local getdir = nuts.getdir local setshift = nuts.setshift local setwidth = nuts.setwidth local getwidth = nuts.getwidth +local setboxglue = nuts.setboxglue +local getboxglue = nuts.getboxglue local hpack = nuts.hpack local traverse_id = nuts.traverse_id @@ -125,9 +127,8 @@ local function doreshapeframedbox(n) local subtype = getsubtype(h) if subtype == box_code or subtype == line_code then local p = hpack(l,maxwidth,'exactly',getdir(h)) -- multiple return value - setfield(h,"glue_set",getfield(p,"glue_set")) - setfield(h,"glue_order",getfield(p,"glue_order")) - setfield(h,"glue_sign",getfield(p,"glue_sign")) + local set, order, sign = getboxglue(p) + setboxglue(h,set,order,sign) setlist(p) flush_node(p) elseif checkformath and subtype == equation_code then diff --git a/tex/context/base/mkiv/pack-rul.mkiv b/tex/context/base/mkiv/pack-rul.mkiv index eec7b8cb3..c208baaf0 100644 --- a/tex/context/base/mkiv/pack-rul.mkiv +++ b/tex/context/base/mkiv/pack-rul.mkiv @@ -18,7 +18,7 @@ %D packaging and expansion we also keep tracing reasonable. For instance, multiple %D stacked backgrounds can slow down a run if not optimized this way. -\registerctxluafile{pack-rul}{1.001} +\registerctxluafile{pack-rul}{} \unprotect @@ -1127,6 +1127,12 @@ \let\delayedendstrut\relax \let\delayedstrut \relax +\let\localoffset\empty +\let\localwidth \empty +\let\localheight\empty +\let\localformat\empty +\let\localstrut \empty + \unexpanded\def\pack_framed_process_indeed {\d_framed_frameoffset\framedparameter\c!frameoffset \edef\p_framed_backgroundoffset{\framedparameter\c!backgroundoffset}% @@ -1806,7 +1812,7 @@ \dp\b_framed_normal\scratchdimen \hpack{\box\b_framed_normal}} -\installframedlocator \v!lohi +\installframedlocator \v!lohi % maybe also \v!center {\pack_framed_locator_before\v!middle} {\pack_framed_locator_after \v!middle} @@ -2470,6 +2476,7 @@ %D \dontcomplain %D %D \startbuffer +%D \unprotect %D \vbox to \vsize %D \bgroup %D \startalignment[middle] @@ -2503,6 +2510,7 @@ %D \vss %D \stopalignment %D \egroup +%D \protect %D \stopbuffer %D %D \getbuffer \page diff --git a/tex/context/base/mkiv/page-box.mkvi b/tex/context/base/mkiv/page-box.mkvi index fa85aef68..083a94390 100644 --- a/tex/context/base/mkiv/page-box.mkvi +++ b/tex/context/base/mkiv/page-box.mkvi @@ -133,6 +133,10 @@ \page_boxes_apply_negate#box% \fi\fi} +\let\p_page_layouts_scale\relax +\let\p_page_layouts_sx \relax +\let\p_page_layouts_sy \relax + \def\page_boxes_apply_scale#box% {\edef\p_page_layouts_scale{\layoutparameter\c!scale}% \ifdim\p_page_layouts_scale\points=\onepoint diff --git a/tex/context/base/mkiv/page-brk.mkiv b/tex/context/base/mkiv/page-brk.mkiv index b651cc8b4..e18c0d923 100644 --- a/tex/context/base/mkiv/page-brk.mkiv +++ b/tex/context/base/mkiv/page-brk.mkiv @@ -137,7 +137,7 @@ {\def\page_breaks_process[##1]{}} \installpagebreakmethod \s!dummy - {\page_otr_flush_all_floats + {\page_otr_command_flush_all_floats \page_otr_command_next_page \page_otr_insert_dummy_page} @@ -150,11 +150,11 @@ \unexpanded\def\page_breaks_unknown % how often called ? {\doifelseinstring{+}\page_breaks_current_option - {\page_otr_flush_all_floats + {\page_otr_command_flush_all_floats \page_otr_command_next_page \dorecurse\page_breaks_current_option\page_otr_insert_dummy_page} {\doifelsenumber\page_breaks_current_option - {\page_otr_flush_all_floats + {\page_otr_command_flush_all_floats \page_otr_command_next_page \doloop {\ifnum\userpageno<\page_breaks_current_option\relax @@ -179,7 +179,7 @@ \installpagebreakmethod \v!yes {\ifconditional\c_page_breaks_enabled - \page_otr_flush_all_floats + \page_otr_command_flush_all_floats \page_otr_command_next_page \ifinsidecolumns % this will move to MUL \page_otr_eject_page % otherwise sometimes no change @@ -229,12 +229,12 @@ {\resetcurrentstructuremarkswithpage\page_otr_insert_dummy_page} \installpagebreakmethod \v!left - {\page_otr_flush_all_floats + {\page_otr_command_flush_all_floats \page_otr_command_next_page_and_inserts \doifbothsidesoverruled\donothing\page_reset_marks_and_insert_dummy\donothing} \installpagebreakmethod \v!right - {\page_otr_flush_all_floats + {\page_otr_command_flush_all_floats \page_otr_command_next_page_and_inserts \doifbothsidesoverruled\donothing\donothing\page_reset_marks_and_insert_dummy} @@ -269,7 +269,7 @@ \fi} \installpagebreakmethod \v!last - {\page_otr_flush_all_floats + {\page_otr_command_flush_all_floats \page_otr_command_next_page_and_inserts \relax \doifbothsidesoverruled @@ -504,7 +504,7 @@ \ifdim\pagetotal<\pagegoal \relax \getnoflines\pagegoal \ifdim\dimexpr\page_check_amount-\noflines\lineheight\relax>-\lineheight - \pagecheckparameter\c!before + \pagecheckerparameter\c!before \penalty-\plustenthousand \pagecheckerparameter\c!after \else diff --git a/tex/context/base/mkiv/page-cst.lua b/tex/context/base/mkiv/page-cst.lua index 03707a312..8b8214ab3 100644 --- a/tex/context/base/mkiv/page-cst.lua +++ b/tex/context/base/mkiv/page-cst.lua @@ -8,8 +8,8 @@ if not modules then modules = { } end modules ["page-cst"] = { -- todo: check what is used -local next, type = next, type -local ceil, floor, odd, round = math.ceil, math.floor, math.odd, math.round +local next, type, tonumber = next, type, tonumber +local ceil, odd, round = math.ceil, math.odd, math.round local lower = string.lower local copy = table.copy @@ -42,8 +42,6 @@ local vpack = nuts.vpack local flushlist = nuts.flush_list ----- removenode = nuts.remove -local getfield = nuts.getfield -local setfield = nuts.setfield local setlink = nuts.setlink local setlist = nuts.setlist local setnext = nuts.setnext @@ -238,7 +236,7 @@ function columnsets.define(t) end end -- - texsetdimen("d_page_grid_column_width",dataset.width) + texsetdimen("d_page_grd_column_width",dataset.width) -- setstate(dataset,true) -- @@ -344,15 +342,15 @@ function columnsets.prepareflush(name) columns[c] = new_vlist(column[1],widths[c],height,0) -- linedepth end -- - texsetcount("c_page_grid_first_column",firstcolumn) - texsetcount("c_page_grid_last_column",lastcolumn) + texsetcount("c_page_grd_first_column",firstcolumn) + texsetcount("c_page_grd_last_column",lastcolumn) end function columnsets.flushcolumn(name,column) local dataset = data[name] local columns = dataset.columns local packed = columns[column] - setbox("b_page_grid_column",packed) + setbox("b_page_grd_column",packed) columns[column] = nil end @@ -639,10 +637,10 @@ function columnsets.check(t) r = dataset.currentrow end if c == 0 or r == 0 or c > nofcolumns or r > nofrows then - texsetcount("c_page_grid_reserved_state",5) + texsetcount("c_page_grd_reserved_state",5) return end --- report("checking width %p, height %p, depth %p, slot (%i,%i)",boxwidth,boxheight,boxdepth,c,r) + -- report("checking width %p, height %p, depth %p, slot (%i,%i)",boxwidth,boxheight,boxdepth,c,r) local nr = ceil(boxheight/(lineheight+linedepth)) -- local action = methods[method] @@ -668,9 +666,9 @@ function columnsets.check(t) dataset.reserved_r = rfound dataset.reserved_nc = nc dataset.reserved_nr = nr - texsetcount("c_page_grid_reserved_state",0) - texsetdimen("d_page_grid_reserved_height",ht) - texsetdimen("d_page_grid_reserved_width",wd) + texsetcount("c_page_grd_reserved_state",0) + texsetdimen("d_page_grd_reserved_height",ht) + texsetdimen("d_page_grd_reserved_width",wd) -- report("using (%i,%i) x (%i,%i) @ (%p,%p)",cfound,rfound,nc,nr,wd,ht) else dataset.reserved_ht = false @@ -679,9 +677,9 @@ function columnsets.check(t) dataset.reserved_r = false dataset.reserved_nc = false dataset.reserved_nr = false - texsetcount("c_page_grid_reserved_state",4) - -- texsetdimen("d_page_grid_reserved_height",0) - -- texsetdimen("d_page_grid_reserved_width",0) + texsetcount("c_page_grd_reserved_state",4) + -- texsetdimen("d_page_grd_reserved_height",0) + -- texsetdimen("d_page_grd_reserved_width",0) -- report("no slot found") end end @@ -768,7 +766,8 @@ end -- while head do -- local id = getid(head) -- if id == hlist_code or id == vlist_code or id == rule_code then -- <= rule_code --- used = used + getfield(head,"height") + getfield(head,"depth") +-- local wd, ht, dp = getwhd(head) +-- used = used + ht + dp -- line = true -- elseif id == glue_code then -- if line then @@ -860,7 +859,8 @@ end -- local id = getid(head) -- local hd = 0 -- if id == hlist_code or id == vlist_code or id == rule_code then -- <= rule_code --- hd = getfield(head,"height") + getfield(head,"depth") +-- local wd, ht, dp = getwhd(head) +-- hd = ht + dp -- elseif id == glue_code then -- hd = getwidth(head) -- elseif id == kern_code then @@ -1130,14 +1130,14 @@ function columnsets.setvsize(name) n = 0 end local gap = n*(dataset.lineheight+dataset.linedepth) - texsetdimen("d_page_grid_gap_height",gap) + texsetdimen("d_page_grd_gap_height",gap) -- can be integrated -- report("state %a, n %a, column %a, row %a",dataset.state,n,dataset.currentcolumn,dataset.currentrow) end function columnsets.sethsize(name) local dataset = data[name] - texsetdimen("d_page_grid_column_width",dataset.widths[dataset.currentcolumn]) + texsetdimen("d_page_grd_column_width",dataset.widths[dataset.currentcolumn]) end function columnsets.sethspan(name,span) @@ -1150,7 +1150,7 @@ function columnsets.sethspan(name,span) span = available end local width = dataset.spans[column][span] - texsetdimen("d_page_grid_span_width",width) + texsetdimen("d_page_grd_span_width",width) end function columnsets.setlines(t) @@ -1179,7 +1179,7 @@ end -- state : repeat | start -local ctx_page_grid_set_area = context.protected.page_grid_set_area +local ctx_page_grd_set_area = context.protected.page_grd_set_area function columnsets.flushareas(name) local nofareas = #areas @@ -1218,7 +1218,7 @@ function columnsets.flushareas(name) local used = nofcolumns - overflow left = dataset.spreads[column][used] + getdimen("backspace") end - ctx_page_grid_set_area(name,area.name,column,row,width,height,start,left) -- or via counters / dimens + ctx_page_grd_set_area(name,area.name,column,row,width,height,start,left) -- or via counters / dimens if area.state ~= v_repeat then area = nil end diff --git a/tex/context/base/mkiv/page-cst.mkiv b/tex/context/base/mkiv/page-cst.mkiv index ed4512561..f6eede68a 100644 --- a/tex/context/base/mkiv/page-cst.mkiv +++ b/tex/context/base/mkiv/page-cst.mkiv @@ -18,7 +18,7 @@ \writestatus{loading}{ConTeXt Page Macros / Page Grids} -\registerctxluafile{page-cst}{1.001} +\registerctxluafile{page-cst}{} \unprotect @@ -71,41 +71,41 @@ }% \to \everydefinepagegrid -\newdimen \d_page_grid_column_width -\newdimen \d_page_grid_max_height -\newdimen \d_page_grid_max_width -\newdimen \d_page_grid_distance +\newdimen \d_page_grd_column_width +\newdimen \d_page_grd_max_height +\newdimen \d_page_grd_max_width +\newdimen \d_page_grd_distance -\newdimen \d_page_grid_reserved_height -\newdimen \d_page_grid_reserved_width -\newcount \c_page_grid_reserved_state +\newdimen \d_page_grd_reserved_height +\newdimen \d_page_grd_reserved_width +\newcount \c_page_grd_reserved_state -\newdimen \d_page_grid_gap_height +\newdimen \d_page_grd_gap_height -\newcount \c_page_grid_n_of_left -\newcount \c_page_grid_n_of_right -\newcount \c_page_grid_n_of_rows -\newcount \c_page_grid_first_column -\newcount \c_page_grid_last_column +\newcount \c_page_grd_n_of_left +\newcount \c_page_grd_n_of_right +\newcount \c_page_grd_n_of_rows +\newcount \c_page_grd_first_column +\newcount \c_page_grd_last_column -\newbox \b_page_grid_collected -\newbox \b_page_grid_column_rest -\newbox \b_page_grid_column +\newbox \b_page_grd_collected +\newbox \b_page_grd_column_rest +\newbox \b_page_grd_column -\unexpanded\def\setuppagegridlines{\doquadrupleempty\page_grid_setup_lines} -\unexpanded\def\setuppagegridstart{\doquadrupleempty\page_grid_setup_start} +\unexpanded\def\setuppagegridlines{\doquadrupleempty\page_grd_setup_lines} +\unexpanded\def\setuppagegridstart{\doquadrupleempty\page_grd_setup_start} -\def\page_grid_setup_lines[#1][#2][#3][#4]% id page col value +\def\page_grd_setup_lines[#1][#2][#3][#4]% id page col value {\clf_setcolumnsetlines{name {#1} page #2 column #3 value #4}} -\def\page_grid_setup_start[#1][#2][#3][#4]% id page col value +\def\page_grd_setup_start[#1][#2][#3][#4]% id page col value {\clf_setcolumnsetstart{name {#1} page #2 column #3 value #4}} -\unexpanded\def\page_grid_check +\unexpanded\def\page_grd_check {\dorecurse{\numexpr\pagegridparameter\c!nleft+\pagegridparameter\c!nright} - {\page_grid_check_column{##1}}} + {\page_grd_check_column{##1}}} -\unexpanded\def\page_grid_check_column#1% +\unexpanded\def\page_grd_check_column#1% {\chaintocurrentpagegrid{\currentpagegrid:#1}% \edef\p_distance{\namedpagegridparameter{\currentpagegrid:#1}\c!distance}% \edef\p_width {\namedpagegridparameter{\currentpagegrid:#1}\c!width}% @@ -127,13 +127,13 @@ \unexpanded\def\startpagegrid {\bgroup - \dodoubleempty\page_grid_start} + \dodoubleempty\page_grd_start} -\def\page_grid_start_dummy[#1][#2]% - {\let\page_grid_stop\egroup} +\def\page_grd_start_dummy[#1][#2]% + {\let\page_grd_stop\egroup} -\def\page_grid_start[#1][#2]% - {\let\page_grid_start\page_grid_start_dummy +\def\page_grd_start[#1][#2]% + {\let\page_grd_start\page_grd_start_dummy \ifsecondargument \edef\currentpagegrid{#1}% \setupcurrentpagegrid[#2]% @@ -146,54 +146,54 @@ \let\currentpagegrid\empty \fi\fi \usepageparameter\pagegridparameter - \c_page_grid_n_of_left \pagegridparameter\c!nleft\relax - \c_page_grid_n_of_right\pagegridparameter\c!nright\relax - \c_page_grid_n_of_rows \pagegridparameter\c!lines\relax - \d_page_grid_max_width \pagegridparameter\c!maxwidth\relax - \d_page_grid_max_height\pagegridparameter\c!maxheight\relax - \d_page_grid_distance \pagegridparameter\c!distance\relax + \c_page_grd_n_of_left \pagegridparameter\c!nleft\relax + \c_page_grd_n_of_right\pagegridparameter\c!nright\relax + \c_page_grd_n_of_rows \pagegridparameter\c!lines\relax + \d_page_grd_max_width \pagegridparameter\c!maxwidth\relax + \d_page_grd_max_height\pagegridparameter\c!maxheight\relax + \d_page_grd_distance \pagegridparameter\c!distance\relax % - \ifcase\c_page_grid_n_of_rows - \getrawnoflines{\dimexpr\d_page_grid_max_height-\strutheight+\topskip\relax}% - \c_page_grid_n_of_rows\noflines + \ifcase\c_page_grd_n_of_rows + \getrawnoflines{\dimexpr\d_page_grd_max_height-\strutheight+\topskip\relax}% + \c_page_grd_n_of_rows\noflines \fi \edef\p_width{\pagegridparameter\c!width}% \insidecolumnstrue % will be different flag in addition \clf_resetcolumnset { name {\currentpagegrid} - nofrows \c_page_grid_n_of_rows - nofleft \c_page_grid_n_of_left - nofright \c_page_grid_n_of_right + nofrows \c_page_grd_n_of_rows + nofleft \c_page_grd_n_of_left + nofright \c_page_grd_n_of_right lineheight \strutht linedepth \strutdp \ifx\p_width\v!auto - % sets \d_page_grid_column_width + % sets \d_page_grd_column_width \else width \p_width \fi - distance \d_page_grid_distance - maxwidth \d_page_grid_max_width + distance \d_page_grd_distance + maxwidth \d_page_grd_max_width }% % - \page_grid_check + \page_grd_check % \clf_flushcolumnsetareas{\currentpagegrid}\relax \setupoutputroutine[\s!pagegrid]% - \page_grid_command_set_hsize - \page_grid_command_set_vsize + \page_grd_command_set_hsize + \page_grd_command_set_vsize }%\begingroup} \unexpanded\def\stoppagegrid - {\page_grid_stop} + {\page_grd_stop} -\def\page_grid_stop +\def\page_grd_stop {\endgraf % needed, else wrong vsize in one par case \vfill % otherwise weird \placenotes[endnotes] - \page_otr_command_set_vsize % needed + \page_grd_command_set_vsize % needed \penalty\c_page_otr_eject_penalty - \page_grid_command_flush_page + \page_grd_command_flush_page \page_otr_fill_and_eject_page - \page_otr_command_set_vsize % needed + \page_grd_command_set_vsize % why here \egroup \page_otr_command_set_vsize \page_otr_command_set_hsize} @@ -215,17 +215,17 @@ \endgroup} \unexpanded\def\setpagegrid - {\dosingleempty\page_grid_set} + {\dosingleempty\page_grd_set} -\unexpanded\def\page_grid_set[#1]% +\unexpanded\def\page_grd_set[#1]% {\begingroup \letdummyparameter\c!c\zerocount \letdummyparameter\c!r\zerocount \letdummyparameter\c!option\v!none \getdummyparameters[#1]% - \dowithnextboxcs\page_grid_set_indeed\hbox} + \dowithnextboxcs\page_grd_set_indeed\hbox} -\def\page_grid_set_indeed +\def\page_grd_set_indeed {\clf_checkcolumnset { name {\currentpagegrid} c \dummyparameter\c!c @@ -233,16 +233,16 @@ box \nextbox option {\dummyparameter\c!option} }% - \ifcase\c_page_grid_reserved_state - \setbox\nextbox\vpack to \d_page_grid_reserved_height \bgroup + \ifcase\c_page_grd_reserved_state + \setbox\nextbox\vpack to \d_page_grd_reserved_height \bgroup \vss - \hpack to \d_page_grid_reserved_width \bgroup + \hpack to \d_page_grd_reserved_width \bgroup \box\nextbox \hss \egroup \vss \egroup - \wd\nextbox\d_page_grid_reserved_width + \wd\nextbox\d_page_grd_reserved_width \clf_putincolumnset { name {\currentpagegrid} box \nextbox @@ -250,31 +250,31 @@ \fi \endgroup} -\unexpanded\def\page_grid_command_set_vsize +\unexpanded\def\page_grd_command_set_vsize {\clf_setvsizecolumnset{\currentpagegrid}% - \ifdim\d_page_grid_gap_height<\lineheight - \page_grid_command_flush_page + \ifdim\d_page_grd_gap_height<\lineheight + \page_grd_command_flush_page \page_otr_fill_and_eject_page \fi - \global\vsize\d_page_grid_gap_height + \global\vsize\d_page_grd_gap_height \pagegoal\vsize} -\unexpanded\def\page_grid_command_set_hsize +\unexpanded\def\page_grd_command_set_hsize {\clf_sethsizecolumnset{\currentpagegrid}% - \hsize\d_page_grid_column_width - \textwidth\d_page_grid_column_width} + \hsize\d_page_grd_column_width + \textwidth\d_page_grd_column_width} -\unexpanded\def\page_grid_command_routine +\unexpanded\def\page_grd_command_routine {\ifvoid\normalpagebox \else \clf_addtocolumnset{\currentpagegrid}\normalpagebox \fi - \page_grid_command_set_vsize - \page_grid_command_flush_saved_floats - \page_grid_command_set_vsize - \ifdim\d_page_grid_gap_height<\lineheight - \page_grid_command_flush_page + \page_grd_command_set_vsize + \page_grd_command_flush_saved_floats + \page_grd_command_set_vsize + \ifdim\d_page_grd_gap_height<\lineheight + \page_grd_command_flush_page \fi - \page_grid_command_set_vsize + \page_grd_command_set_vsize \clf_flushcolumnsetrest {\currentpagegrid}\normalpagebox \ifvoid\normalpagebox \else \unvbox\normalpagebox @@ -283,7 +283,7 @@ \installoutputroutine\synchronizepagegrid {\ifvoid\normalpagebox\else \clf_addtocolumnset{\currentpagegrid}\normalpagebox - \page_grid_command_set_vsize + \page_grd_command_set_vsize \clf_flushcolumnsetrest{\currentpagegrid}\normalpagebox \ifvoid\normalpagebox \else \unvbox\normalpagebox @@ -292,82 +292,82 @@ % todo line numbers and marks -\unexpanded\def\page_grid_command_flush_page_column#1% +\unexpanded\def\page_grd_command_flush_page_column#1% {\privatescratchcounter#1\relax \clf_flushcolumnsetcolumn{\currentpagegrid}\privatescratchcounter - \anch_mark_column_box\b_page_grid_column - \page_marks_synchronize_column\c_page_grid_first_column\c_page_grid_last_column\privatescratchcounter\b_page_grid_column - \ifnum\privatescratchcounter>\c_page_grid_n_of_left - \advance\privatescratchcounter-\c_page_grid_n_of_left - \page_lines_add_numbers_to_box\b_page_grid_column\privatescratchcounter\c_page_grid_n_of_right\plustwo + \anch_mark_column_box\b_page_grd_column + \page_marks_synchronize_column\c_page_grd_first_column\c_page_grd_last_column\privatescratchcounter\b_page_grd_column + \ifnum\privatescratchcounter>\c_page_grd_n_of_left + \advance\privatescratchcounter-\c_page_grd_n_of_left + \page_lines_add_numbers_to_box\b_page_grd_column\privatescratchcounter\c_page_grd_n_of_right\plustwo \else - \page_lines_add_numbers_to_box\b_page_grid_column\privatescratchcounter\c_page_grid_n_of_left\plustwo + \page_lines_add_numbers_to_box\b_page_grd_column\privatescratchcounter\c_page_grd_n_of_left\plustwo \fi \begingroup \edef\currentpagegrid{\currentpagegrid:#1}% - \inheritedpagegridframedbox\box\b_page_grid_column + \inheritedpagegridframedbox\box\b_page_grd_column \endgroup} -\unexpanded\def\page_grid_command_flush_page +\unexpanded\def\page_grd_command_flush_page {\deactivatecolor % puzzling, try ungrouped color \red or so - \setbox\b_page_grid_collected\hpack\bgroup + \setbox\b_page_grd_collected\hpack\bgroup \clf_preparecolumnsetflush{\currentpagegrid}% \letpagegridparameter\c!region\currentpagegrid \doifelse{\pagegridparameter\c!direction}\v!reverse - {\dostepwiserecurse\c_page_grid_last_column\c_page_grid_first_column\minusone - {\page_grid_command_flush_page_column{##1}% + {\dostepwiserecurse\c_page_grd_last_column\c_page_grd_first_column\minusone + {\page_grd_command_flush_page_column{##1}% \ifnum##1>\plusone \kern\namedpagegridparameter{\currentpagegrid:##1}\c!distance\relax \fi}}% - {\dostepwiserecurse\c_page_grid_first_column\c_page_grid_last_column\plusone - {\page_grid_command_flush_page_column{##1}% - \ifnum##1<\c_page_grid_last_column + {\dostepwiserecurse\c_page_grd_first_column\c_page_grd_last_column\plusone + {\page_grd_command_flush_page_column{##1}% + \ifnum##1<\c_page_grd_last_column \kern\namedpagegridparameter{\currentpagegrid:##1}\c!distance\relax \fi}}% \clf_finishcolumnsetflush{\currentpagegrid}% \egroup - \page_otr_construct_and_shipout\box\b_page_grid_collected + \page_otr_construct_and_shipout\box\b_page_grd_collected\zerocount % three arguments \clf_flushcolumnsetareas{\currentpagegrid}\relax - \page_grid_command_flush_saved_floats} + \page_grd_command_flush_saved_floats} % slow but robust -\unexpanded\def\page_grid_command_next_progress +\unexpanded\def\page_grd_command_next_progress {\strut - \page_otr_flush_all_floats + \page_grd_command_flush_all_floats \page_otr_eject_page \ifcase\clf_columnsetnoto\else - \expandafter\page_grid_command_next_progress + \expandafter\page_grd_command_next_progress \fi} -\unexpanded\def\page_grid_command_handle_column +\unexpanded\def\page_grd_command_handle_column {\ifcase\clf_columnsetgoto{\currentpagegrid}{\page_breaks_columns_current_option}\relax\else - \expandafter\page_grid_command_next_progress + \expandafter\page_grd_command_next_progress \fi} -\installcolumnbreakmethod\s!pagegrid\s!unknown {\page_grid_command_handle_column} -\installcolumnbreakmethod\s!pagegrid\v!yes {\page_grid_command_handle_column} +\installcolumnbreakmethod\s!pagegrid\s!unknown {\page_grd_command_handle_column} +\installcolumnbreakmethod\s!pagegrid\v!yes {\page_grd_command_handle_column} -\unexpanded\def\page_grid_command_next_page +\unexpanded\def\page_grd_command_next_page {\ifcase\clf_columnsetgoto{\currentpagegrid}{\v!page}\relax\else - \page_grid_command_flush_page + \page_grd_command_flush_page \fi} -\unexpanded\def\page_grid_command_next_page_and_inserts -% {\page_otr_eject_page_and_flush_inserts} - {\page_otr_flush_all_floats - \page_grid_command_next_page} +\unexpanded\def\page_grd_command_next_page_and_inserts + {\page_grd_command_flush_all_floats + \page_grd_command_next_page} -\let\page_grid_command_package_contents\page_one_command_package_contents +\let\page_grd_command_flush_all_floats\page_one_command_flush_all_floats +\let\page_grd_command_package_contents\page_one_command_package_contents -\unexpanded\def\page_grid_command_flush_saved_floats +\unexpanded\def\page_grd_command_flush_saved_floats {\ifconditional\c_page_floats_flushing \else \ifconditional\c_page_floats_some_waiting - \page_grid_command_flush_saved_floats_indeed + \page_grd_command_flush_saved_floats_indeed \fi \fi} -\unexpanded\def\page_grid_command_flush_saved_floats_indeed +\unexpanded\def\page_grd_command_flush_saved_floats_indeed {\page_floats_flush\s!text\plusone \clf_checkcolumnset { name {\currentpagegrid} @@ -375,11 +375,11 @@ width \wd\floatbox height \ht\floatbox }% - \ifcase\c_page_grid_reserved_state - \page_grid_place_float_here_indeed - \page_grid_command_set_vsize % needed + \ifcase\c_page_grd_reserved_state + \page_grd_place_float_here_indeed + \page_grd_command_set_vsize % needed \ifconditional\c_page_floats_some_waiting - \doubleexpandafter\page_grid_command_flush_saved_floats_indeed + \doubleexpandafter\page_grd_command_flush_saved_floats_indeed \fi \else \page_floats_resave\s!text @@ -387,48 +387,52 @@ % needs checking -\unexpanded\def\page_grid_command_flush_floats +\unexpanded\def\page_grd_command_flush_floats {\wait\global\settrue\c_page_floats_flushing \ifconditional\c_page_floats_some_waiting \par - \page_grid_command_flush_floats_indeed + \page_grd_command_flush_floats_indeed \fi \global\savednoffloats\zerocount \global\setfalse\c_page_floats_some_waiting \global\setfalse\c_page_floats_flushing} -\def\page_grid_command_flush_floats_indeed % much in common with OTRSET +\def\page_grd_command_flush_floats_indeed % much in common with OTRSET {\wait\ifconditional\c_page_floats_some_waiting \ifconditional\c_page_floats_pack_flushed - \setfalse\c_page_floats_center_box % not needed as we do call directly \page_floats_collect\s!text\hsize\emwidth - \global\setbox\floatbox\hbox to \hsize - {\hfil - \dorecurse\nofcollectedfloats - {\ifcase\columndirection % nog document wide - \page_floats_flush\s!text\plusone - \else - \page_floats_flush\s!text{\the\numexpr\nofcollectedfloats-\recurselevel+1\relax}% - \fi - \ifdim\wd\floatbox>\makeupwidth % \hsize - \hbox to \makeupwidth{\hss\box\floatbox\hss}% - \else - \box\floatbox - \fi - \ifnum\recurselevel<\nofcollectedfloats - \hfil - \fi}% - \hfil}% + \ifcase\nofcollectedfloats + \page_floats_get + \else + \setfalse\c_page_floats_center_box % not needed as we do call directly + \global\setbox\floatbox\hbox to \hsize + {\hfil + \dorecurse\nofcollectedfloats + {\ifcase\columndirection % nog document wide + \page_floats_flush\s!text\plusone + \else + \page_floats_flush\s!text{\the\numexpr\nofcollectedfloats-\recurselevel+1\relax}% + \fi + \ifdim\wd\floatbox>\makeupwidth % \hsize + \hbox to \makeupwidth{\hss\box\floatbox\hss}% + \else + \box\floatbox + \fi + \ifnum\recurselevel<\nofcollectedfloats + \hfil + \fi}% + \hfil}% + \fi \else \page_floats_get \fi \doplacefloatbox - \expandafter\page_grid_command_flush_floats_indeed + \expandafter\page_grd_command_flush_floats_indeed \fi} % so far -\unexpanded\def\page_grid_command_check_if_float_fits +\unexpanded\def\page_grd_command_check_if_float_fits {\clf_checkcolumnset { name {\currentpagegrid} method {\floatmethod} @@ -436,16 +440,16 @@ % r \zerocount box \floatbox }% - \ifcase\c_page_grid_reserved_state + \ifcase\c_page_grd_reserved_state \global\settrue\c_page_floats_room \else \global\setfalse\c_page_floats_room \fi} -\unexpanded\def\page_grid_place_float_here_indeed - {\setbox\floatbox\vpack to \d_page_grid_reserved_height \bgroup +\unexpanded\def\page_grd_place_float_here_indeed + {\setbox\floatbox\vpack to \d_page_grd_reserved_height \bgroup \vss - \hpack to \d_page_grid_reserved_width \bgroup + \hpack to \d_page_grd_reserved_width \bgroup % \hss % no \box\floatbox \hss @@ -457,7 +461,7 @@ box \floatbox }} -\def\page_grid_place_float_slot +\def\page_grd_place_float_slot {% safeguard \ifx\floatmethod\empty \let\floatmethod\v!here @@ -466,7 +470,7 @@ \penalty\c_page_otr_eject_penalty % push \setbox\savedfloatbox\box\floatbox - \page_grid_command_flush_saved_floats + \page_grd_command_flush_saved_floats \setbox\floatbox\box\savedfloatbox % pop \ifconditional\c_page_floats_some_waiting @@ -484,15 +488,15 @@ \fi box \floatbox }% - \ifcase\c_page_grid_reserved_state - \page_grid_place_float_here_indeed + \ifcase\c_page_grd_reserved_state + \page_grd_place_float_here_indeed \else \page_floats_save\s!text \nonoindentation \fi \fi} -\def\page_grid_place_float_fixed % todo: fallback on here +\def\page_grd_place_float_fixed % todo: fallback on here {\ifx\floatcolumn\empty \let\floatmethod\v!here \else\ifx\floatrow\empty @@ -500,9 +504,9 @@ \else \let\floatmethod\v!fixed \fi\fi - \page_grid_place_float_slot} + \page_grd_place_float_slot} -\def\page_grid_place_float_force +\def\page_grd_place_float_force {% synchronize \penalty\c_page_otr_eject_penalty \clf_checkcolumnset { @@ -510,30 +514,30 @@ method {\floatmethod} box \floatbox }% - \ifcase\c_page_grid_reserved_state - \page_grid_place_float_here_indeed + \ifcase\c_page_grd_reserved_state + \page_grd_place_float_here_indeed \else \page_floats_save\s!text \nonoindentation \fi} -\def\page_grid_place_float_page {\page_grid_place_float_slot} % todo: fallback on here +\def\page_grd_place_float_page {\page_grd_place_float_slot} % todo: fallback on here -\def\page_grid_place_float_here {\let\floatmethod\v!here\page_grid_place_float_slot} -\def\page_grid_place_float_top {\page_grid_place_float_slot} -\def\page_grid_place_float_bottom{\page_grid_place_float_slot} +\def\page_grd_place_float_here {\let\floatmethod\v!here\page_grd_place_float_slot} +\def\page_grd_place_float_top {\page_grd_place_float_slot} +\def\page_grd_place_float_bottom{\page_grd_place_float_slot} -\installfloatmethod \s!pagegrid \v!here \page_grid_place_float_here -\installfloatmethod \s!pagegrid \v!force \page_grid_place_float_force % todo +\installfloatmethod \s!pagegrid \v!here \page_grd_place_float_here +\installfloatmethod \s!pagegrid \v!force \page_grd_place_float_force % todo %installfloatmethod \s!pagegrid \v!left %installfloatmethod \s!pagegrid \v!right %installfloatmethod \s!pagegrid \v!text -\installfloatmethod \s!pagegrid \v!top \page_grid_place_float_top -\installfloatmethod \s!pagegrid \v!bottom \page_grid_place_float_bottom +\installfloatmethod \s!pagegrid \v!top \page_grd_place_float_top +\installfloatmethod \s!pagegrid \v!bottom \page_grd_place_float_bottom %installfloatmethod \s!pagegrid \v!auto %installfloatmethod \s!pagegrid \v!margin %installfloatmethod \s!pagegrid \v!opposite -\installfloatmethod \s!pagegrid \v!page \page_grid_place_float_page +\installfloatmethod \s!pagegrid \v!page \page_grd_place_float_page %installfloatmethod \s!pagegrid \v!leftpage %installfloatmethod \s!pagegrid \v!rightpage %installfloatmethod \s!pagegrid \v!inmargin @@ -546,54 +550,58 @@ %installfloatmethod \s!pagegrid \v!somewhere %installfloatmethod \s!pagegrid \v!backspace %installfloatmethod \s!pagegrid \v!cutspace -\installfloatmethod \s!pagegrid \s!tblr \page_grid_place_float_slot -\installfloatmethod \s!pagegrid \s!lrtb \page_grid_place_float_slot -\installfloatmethod \s!pagegrid \s!tbrl \page_grid_place_float_slot -\installfloatmethod \s!pagegrid \s!rltb \page_grid_place_float_slot -\installfloatmethod \s!pagegrid \s!fxtb \page_grid_place_float_slot -\installfloatmethod \s!pagegrid \s!btlr \page_grid_place_float_slot -\installfloatmethod \s!pagegrid \s!lrbt \page_grid_place_float_slot -\installfloatmethod \s!pagegrid \s!btrl \page_grid_place_float_slot -\installfloatmethod \s!pagegrid \s!rlbt \page_grid_place_float_slot -\installfloatmethod \s!pagegrid \s!fxbt \page_grid_place_float_slot -\installfloatmethod \s!pagegrid \s!fixd \page_grid_place_float_fixed +\installfloatmethod \s!pagegrid \s!tblr \page_grd_place_float_slot +\installfloatmethod \s!pagegrid \s!lrtb \page_grd_place_float_slot +\installfloatmethod \s!pagegrid \s!tbrl \page_grd_place_float_slot +\installfloatmethod \s!pagegrid \s!rltb \page_grd_place_float_slot +\installfloatmethod \s!pagegrid \s!fxtb \page_grd_place_float_slot +\installfloatmethod \s!pagegrid \s!btlr \page_grd_place_float_slot +\installfloatmethod \s!pagegrid \s!lrbt \page_grd_place_float_slot +\installfloatmethod \s!pagegrid \s!btrl \page_grd_place_float_slot +\installfloatmethod \s!pagegrid \s!rlbt \page_grd_place_float_slot +\installfloatmethod \s!pagegrid \s!fxbt \page_grd_place_float_slot +\installfloatmethod \s!pagegrid \s!fixd \page_grd_place_float_fixed % -\unexpanded\def\page_grid_command_side_float_output +\unexpanded\def\page_grd_command_side_float_output {} % nothing, reset anyway -\unexpanded\def\page_grid_command_flush_side_floats +\unexpanded\def\page_grd_command_flush_side_floats {\page_sides_forget_floats} -\unexpanded\def\page_grid_command_synchronize_side_floats +\unexpanded\def\page_grd_command_synchronize_side_floats {\page_sides_forget_floats} -\unexpanded\def\page_grid_command_synchronize_hsize - {\page_grid_command_set_hsize} +\unexpanded\def\page_grd_command_synchronize_hsize + {\page_grd_command_set_hsize} + +\unexpanded\def\page_grd_command_flush_all_floats + {\page_one_command_flush_all_floats} \defineoutputroutine [\s!pagegrid] - [\s!page_otr_command_routine =\page_grid_command_routine, - \s!page_otr_command_package_contents =\page_grid_command_package_contents, - \s!page_otr_command_set_vsize =\page_grid_command_set_vsize, - \s!page_otr_command_set_hsize =\page_grid_command_set_hsize, % tricky, goes wrong - \s!page_otr_command_next_page =\page_grid_command_next_page, - \s!page_otr_command_next_page_and_inserts =\page_grid_command_next_page_and_inserts, - \s!page_otr_command_synchronize_hsize =\page_grid_command_synchronize_hsize, - % \s!page_otr_command_set_top_insertions =\page_grid_command_set_top_insertions, - % \s!page_otr_command_set_bottom_insertions =\page_grid_command_set_bottom_insertions, - % \s!page_otr_command_flush_top_insertions =\page_grid_command_flush_top_insertions, - % \s!page_otr_command_flush_bottom_insertions =\page_grid_command_flush_bottom_insertions, - % \s!page_otr_command_set_float_hsize =\page_grid_command_set_float_hsize, - \s!page_otr_command_check_if_float_fits =\page_grid_command_check_if_float_fits, - % \s!page_otr_command_flush_float_box =\page_grid_command_flush_float_box, - \s!page_otr_command_synchronize_side_floats =\page_grid_command_synchronize_side_floats, - \s!page_otr_command_side_float_output =\page_grid_command_side_float_output, - \s!page_otr_command_flush_floats =\page_grid_command_flush_floats, - \s!page_otr_command_flush_side_floats =\page_grid_command_flush_side_floats, - \s!page_otr_command_flush_saved_floats =\page_grid_command_flush_saved_floats - % \s!page_otr_command_flush_margin_blocks =\page_grid_command_flush_margin_blocks, % not used + [\s!page_otr_command_routine =\page_grd_command_routine, + \s!page_otr_command_package_contents =\page_grd_command_package_contents, + \s!page_otr_command_set_vsize =\page_grd_command_set_vsize, + \s!page_otr_command_set_hsize =\page_grd_command_set_hsize, % tricky, goes wrong + \s!page_otr_command_synchronize_hsize =\page_grd_command_synchronize_hsize, + \s!page_otr_command_next_page =\page_grd_command_next_page, + \s!page_otr_command_next_page_and_inserts =\page_grd_command_next_page_and_inserts, + % \s!page_otr_command_set_top_insertions =\page_grd_command_set_top_insertions, + % \s!page_otr_command_set_bottom_insertions =\page_grd_command_set_bottom_insertions, + % \s!page_otr_command_flush_top_insertions =\page_grd_command_flush_top_insertions, + % \s!page_otr_command_flush_bottom_insertions =\page_grd_command_flush_bottom_insertions, + \s!page_otr_command_check_if_float_fits =\page_grd_command_check_if_float_fits, + % \s!page_otr_command_set_float_hsize =\page_grd_command_set_float_hsize, + % \s!page_otr_command_flush_float_box =\page_grd_command_flush_float_box, + \s!page_otr_command_synchronize_side_floats =\page_grd_command_synchronize_side_floats, + \s!page_otr_command_side_float_output =\page_grd_command_side_float_output, + \s!page_otr_command_flush_floats =\page_grd_command_flush_floats, + \s!page_otr_command_flush_side_floats =\page_grd_command_flush_side_floats, + \s!page_otr_command_flush_saved_floats =\page_grd_command_flush_saved_floats, + \s!page_otr_command_flush_all_floats =\page_grd_command_flush_all_floats, + % \s!page_otr_command_flush_margin_blocks =\page_grd_command_flush_margin_blocks, % not used ] % spans @@ -613,18 +621,18 @@ \c!n=\plustwo, \c!nlines=\zerocount, \c!align=\v!normal, - \c!width=\d_page_grid_span_width, + \c!width=\d_page_grd_span_width, \c!indenting=, \c!indentnext=\v!yes, \c!default=\v!here, \c!alternative=\v!a] -\newdimen\d_page_grid_span_width +\newdimen\d_page_grd_span_width \unexpanded\def\startpagegridspan - {\dotripleempty\page_grid_span_start} + {\dotripleempty\page_grd_span_start} -\def\page_grid_span_start[#1][#2][#3]% [#3] gobbles space +\def\page_grd_span_start[#1][#2][#3]% [#3] gobbles space {\endgraf % else rubish output if forgotten \synchronizepagegrid \bgroup @@ -652,9 +660,9 @@ \def\pagegridspanwidth#1% assumes equal distances {\the\dimexpr - #1\d_page_grid_column_width - +#1\d_page_grid_distance - - \d_page_grid_distance + #1\d_page_grd_column_width + +#1\d_page_grd_distance + - \d_page_grd_distance \relax} % areas @@ -702,15 +710,15 @@ \to \everydefinepagegridarea \unexpanded\def\setuppagegridareatext - {\dodoubleargument\page_grid_set_area_text} + {\dodoubleargument\page_grd_set_area_text} -\def\page_grid_set_area_text[#1][#2]% +\def\page_grd_set_area_text[#1][#2]% {\edef\currentpagegridarea{#1}% \setpagegridareaparameter\c!text{#2}} % maybe move the left/right correction to the tex end or the offset to lua -\unexpanded\def\page_grid_set_area#1#2#3#4#5#6#7#8% can be optimized +\unexpanded\def\page_grd_set_area#1#2#3#4#5#6#7#8% can be optimized {\begingroup \edef\currentpagegridarea{#2}% \setpagegridareaparameter\c!width {#5\scaledpoint}% @@ -753,7 +761,7 @@ \fi \endgroup} -\let\setpagegridarea\page_grid_set_area +\let\setpagegridarea\page_grd_set_area % state start | repeat diff --git a/tex/context/base/mkiv/page-ffl.mkiv b/tex/context/base/mkiv/page-ffl.mkiv new file mode 100644 index 000000000..5536371a7 --- /dev/null +++ b/tex/context/base/mkiv/page-ffl.mkiv @@ -0,0 +1,211 @@ +%D \module +%D [ file=page-ffl, +%D version=2018.01.04, +%D title=\CONTEXT\ Page Macros, +%D subtitle=Facing floats, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\writestatus{loading}{ConTeXt Page Macros / Facing floats} + +%D The code below comes from a module made for Thomas Schmitz and is now part of the +%D core. A simple example is given here: +%D +%D \starttyping +%D \definefacingfloat +%D [whatever] +%D +%D \setupfacingfloat +%D [whatever] +%D [style=bold, +%D color=white] +%D +%D \setupfacingfloat +%D [whatever:left] +%D [background=color, +%D backgroundcolor=red] +%D +%D \setupfacingfloat +%D [whatever:right] +%D [background=color, +%D backgroundcolor=green] +%D +%D \startfacingfloat[whatever] +%D {\dorecurse{10}{\samplefile{tufte} }} +%D {\dorecurse{10}{\samplefile{ward} }} +%D {\dorecurse{10}{\samplefile{tufte} }} +%D {\dorecurse{10}{\samplefile{ward} }} +%D \stopfacingfloat +%D +%D \startfacingfloat[whatever] +%D \startcontent \dorecurse{10}{\samplefile{tufte} } \stopcontent +%D \startcontent \dorecurse{10}{\samplefile{ward} } \stopcontent +%D \startcontent \dorecurse{10}{\samplefile{tufte} } \stopcontent +%D \startcontent \dorecurse{10}{\samplefile{ward} } \stopcontent +%D \stopfacingfloat +%D +%D \dorecurse{10}{\samplefile{sapolsky} } +%D \stoptyping +%D +%D The idea is to flush related floats more or less in parallel. + +\unprotect + +\installcorenamespace {facingfloat} + +\installframedcommandhandler \??facingfloat {facingfloat} \??facingfloat + +\setupfacingfloat + [\c!spaceinbetween=\v!big, + \c!inbetween={\blank[\v!big]}, + %\c!style, + %\c!color, + \c!page=\v!yes] + +\appendtoks + \ifx\currentfacingfloatparent\empty + \normalexpanded{\definefacingfloat[\currentfacingfloat:\v!left ][\currentfacingfloat]}% + \normalexpanded{\definefacingfloat[\currentfacingfloat:\v!right][\currentfacingfloat]}% + \fi +\to \everydefinefacingfloat + +\newcount\c_strc_floats_saved +\newcount\c_strc_floats_flushed + +\newbox\b_strc_floats_facing_l +\newbox\b_strc_floats_facing_r + +\let\m_strc_floats_state\relax + +\def\strc_floats_facing_flush + {\ifnum\c_strc_floats_flushed<\c_strc_floats_saved + \global\advance\c_strc_floats_flushed\plusone + \floatingpenalty\zerocount + \insert\namedinsertionnumber\s!topfloat\bgroup + \forgetall + \ifconditional\c_page_one_top_of_insert + \ifconditional\c_page_one_correct_top_insert + \topskipcorrection % [xx] new: see icare topbleed + \kern-\lineskip + \par + \prevdepth\maxdimen + \fi + \fi + \directboxfromcache{\currentfacingfloat}{\number\c_strc_floats_flushed}% + \vskip\s_page_one_between_top_insert + \egroup + \ifnum\c_strc_floats_saved=\c_strc_floats_flushed + \global\c_strc_floats_saved \zerocount + \global\c_strc_floats_flushed\zerocount + \resetboxesincache{\currentfacingfloat}% + \fi + \fi} + +\unexpanded\def\strc_floats_facing_setup + {\edef\currentfacingfloat{\currentfacingfloat:\m_strc_floats_state}% + \usefacingfloatstyleandcolor\c!style\v!color} + +\unexpanded\def\strc_floats_facing_collect + {\ifx\m_strc_floats_state\v!left + \ifvoid\nextbox\else\ifzeropt\wd\nextbox\else + \ifvoid\b_strc_floats_facing_l + \setbox\b_strc_floats_facing_l\box\nextbox + \else + \setbox\b_strc_floats_facing_l\vbox\bgroup + \unvbox\b_strc_floats_facing_l + \facingfloatparameter\c!inbetween + \unvbox\nextbox + \egroup + \fi + \fi\fi + \let\m_strc_floats_state\v!right + \else\ifx\m_strc_floats_state\v!right + \ifvoid\nextbox\else\ifzeropt\wd\nextbox\else + \ifvoid\b_strc_floats_facing_r + \setbox\b_strc_floats_facing_r\box\nextbox + \else + \setbox\b_strc_floats_facing_r\vbox\bgroup + \unvbox\b_strc_floats_facing_r + \facingfloatparameter\c!inbetween + \unvbox\nextbox + \egroup + \fi + \fi\fi + \let\m_strc_floats_state\v!left + \else + \let\m_strc_floats_state\v!left + \fi\fi} + +\unexpanded\def\strc_floats_facing_handle + {\strc_floats_facing_collect + \doifnextbgroupelse + \strc_floats_facing_handle_indeed + \strc_floats_wrap_up} + +\unexpanded\def\strc_floats_facing_handle_indeed + {\dowithnextboxcontent + \strc_floats_facing_setup + \strc_floats_facing_handle + \vbox} + +\unexpanded\def\startfacingfloat[#1]% + {\begingroup + % todo: \usepageparameter + \edef\p_page{\facingfloatparameter\c!page}% + \ifx\p_page\empty + \page[\p_page]% + \fi + % + \let\startcontent\bgroup + \let\stopcontent\egroup + \def\currentfacingfloat{#1}% + \strc_floats_facing_handle} + +\unexpanded\def\stopfacingfloat + {\endgroup} + +\unexpanded\def\strc_floats_wrap_up + {\edef\p_spaceinbetween{\facingfloatparameter\c!spaceinbetween}% + \ifx\p_spaceinbetween\empty + \scratchdimen\zeropoint + \else + \setbox\scratchbox\vbox{\directvspacing\p_spaceinbetween}% + \scratchdimen\htdp\scratchbox + \fi + \doloop{% + \strc_floats_facing_flush_wrap\b_strc_floats_facing_l\v!left + \strc_floats_facing_flush_wrap\b_strc_floats_facing_r\v!right + \ifvoid\b_strc_floats_facing_l\relax\ifvoid\b_strc_floats_facing_r\relax + \exitloop + \fi\fi}} + +\def\strc_floats_facing_flush_wrap#1#2% + {\ifvoid#1\relax + % todo + \else + \begingroup + \setbox\scratchbox\vsplit#1 upto \textheight + \setbox\scratchbox\hpack\bgroup + \edef\currentfacingfloat{\currentfacingfloat:#2}% + \inheritedfacingfloatframed{\box\scratchbox}% + \egroup + \ifdim\ht\scratchbox<\dimexpr\textheight-\scratchdimen\relax + \setbox\scratchbox\vbox{\box\scratchbox\directvspacing\p_spaceinbetween}% + \else + \setbox\scratchbox\vbox to \textheight{\box\scratchbox\vss}% + \fi + \global\advance\c_strc_floats_saved\plusone + \putboxincache{\currentfacingfloat}{\number\c_strc_floats_saved}\scratchbox + \endgroup + \fi} + +\appendtoks + \strc_floats_facing_flush +\to \everyafteroutput + +\protect \endinput diff --git a/tex/context/base/mkiv/page-flt.lua b/tex/context/base/mkiv/page-flt.lua index 53780e420..41a35d47b 100644 --- a/tex/context/base/mkiv/page-flt.lua +++ b/tex/context/base/mkiv/page-flt.lua @@ -9,12 +9,17 @@ if not modules then modules = { } end modules ['page-flt'] = { -- floats -> managers.floats -- some functions are a tex/lua mix so we need a separation +local next = next +local tostring = tostring local insert, remove = table.insert, table.remove local find = string.find +local abs = math.abs -local trace_floats = false trackers.register("graphics.floats", function(v) trace_floats = v end) -- name might change +local trace_floats = false trackers.register("floats.caching", function(v) trace_floats = v end) +local trace_collecting = false trackers.register("floats.collecting", function(v) trace_collecting = v end) -local report_floats = logs.reporter("structure","floats") +local report_floats = logs.reporter("floats","caching") +local report_collecting = logs.reporter("floats","collecting") local C, S, P, lpegmatch = lpeg.C, lpeg.S, lpeg.P, lpeg.match @@ -22,6 +27,7 @@ local C, S, P, lpegmatch = lpeg.C, lpeg.S, lpeg.P, lpeg.match -- text page leftpage rightpage (todo: top, bottom, margin, order) local setdimen = tex.setdimen +local getdimen = tex.getdimen local setcount = tex.setcount local texsetbox = tex.setbox local textakebox = nodes.takebox @@ -78,14 +84,25 @@ function floats.pop() end end -local function setdimensions(b) - local w, h, d = 0, 0, 0 +local function setdimensions(t,b) + local bw, bh, bd = 0, 0, 0 + local nw, nh, nd = 0, 0, 0 if b then - w, h, d = b.width, b.height, b.depth + bw = b.width + bh = b.height + bd = b.depth end - setdimen("global","floatwidth", w) - setdimen("global","floatheight", h+d) - return w, h, d + if t then + nw = t.width or bw + nh = t.height or bh + nd = t.depth or bd + end + setdimen("global","floatwidth", bw) + setdimen("global","floatheight", bh+bd) + setdimen("global","naturalfloatwd", nw) + setdimen("global","naturalfloatht", nh) + setdimen("global","naturalfloatdp", nd) + return bw, bh, bd, nw, nh, dp end local function get(stack,n,bylabel) @@ -115,9 +132,12 @@ function floats.save(which,data) local stack = stacks[which] noffloats = noffloats + 1 local t = { - n = noffloats, - data = data or { }, - box = b, + n = noffloats, + data = data or { }, + width = getdimen("naturalfloatwd"), + height = getdimen("naturalfloatht"), + depth = getdimen("naturalfloatdp"), + box = b, } insert(stack,t) -- inspect(stacks) @@ -138,9 +158,11 @@ function floats.resave(which) which = which or default local stack = stacks[which] local b = textakebox("floatbox") + if not b then + report_floats("resaved float is empty") + end last.box = b insert(stack,1,last) --- inspect(stacks) setcount("global","savednoffloats",#stacks[default]) if trace_floats then report_floats("%s, category %a, number %a, slot %a width %p, height %p, depth %p","resaving", @@ -155,15 +177,14 @@ end function floats.flush(which,n,bylabel) which = which or default --- inspect(stacks) local stack = stacks[which] local t, b, n = get(stack,n or 1,bylabel) if t then if not b then showmessage("floatblocks",1,t.n) end + local w, h, d = setdimensions(t,b) if trace_floats then - local w, h, d = setdimensions(b) -- ? report_floats("%s, category %a, number %a, slot %a width %p, height %p, depth %p","flushing", which,t.n,n,w,h,d) else @@ -172,7 +193,7 @@ function floats.flush(which,n,bylabel) texsetbox("floatbox",b) last = remove(stack,n) last.box = nil - setcount("global","savednoffloats",#stacks[default]) -- default? + setcount("global","savednoffloats",#stacks[which]) -- default? else setdimensions() end @@ -183,7 +204,7 @@ function floats.consult(which,n) local stack = stacks[which] local t, b, n = get(stack,n) if t then - local w, h, d = setdimensions(b) + local w, h, d = setdimensions(t,b) if trace_floats then report_floats("%s, category %a, number %a, slot %a width %p, height %p, depth %p","consulting", which,t.n,n,w,h,d) @@ -198,16 +219,46 @@ function floats.consult(which,n) end function floats.collect(which,maxwidth,distance) - which = which or default - local stack = stacks[which] - local n, m = #stack, 0 - for i=1,n do + local usedwhich = which or default + local stack = stacks[usedwhich] + local stacksize = #stack + local collected = 0 + local maxheight = 0 + local maxdepth = 0 + + local function register() + collected = collected + 1 + maxwidth = rest + if h > maxheight then + maxheight = h + end + if d > maxdepth then + maxdepth = d + end + end + + for i=1,stacksize do local t, b, n = get(stack,i) if t then - local w, h, d = setdimensions(b) - if w + distance < maxwidth then - m = m + 1 - maxwidth = maxwidth - w - distance + local w, h, d, nw = setdimensions(t,b) + -- we use the real width + w = nw + -- which could be an option + local rest = maxwidth - w - (1 == 1 and 0 or distance) + local fits = rest > -10 + if trace_collecting then + report_collecting("%s, category %a, number %a, slot %a width %p, rest %p, fit %a","collecting", + usedwhich,t.n,n,w,rest,fits) + end + if fits then + collected = collected + 1 + maxwidth = rest + if h > maxheight then + maxheight = h + end + if d > maxdepth then + maxdepth = d + end else break end @@ -215,10 +266,8 @@ function floats.collect(which,maxwidth,distance) break end end - if m == 0 then - m = 1 - end - setcount("global","nofcollectedfloats",m) + setcount("global","nofcollectedfloats",collected) + setdimen("global","maxcollectedfloatstotal",maxheight+maxdepth) end function floats.getvariable(name,default) diff --git a/tex/context/base/mkiv/page-flt.mkiv b/tex/context/base/mkiv/page-flt.mkiv index c514496df..a06c90ec1 100644 --- a/tex/context/base/mkiv/page-flt.mkiv +++ b/tex/context/base/mkiv/page-flt.mkiv @@ -16,26 +16,43 @@ %D This module has code that previously was in other modules. There is %D also float related code in \type {strc-flt.mkiv}. -\registerctxluafile{page-flt}{1.001} +\registerctxluafile{page-flt}{} \unprotect \ifdefined\s!topfloat \else \def\s!topfloat {topfloat} \fi \ifdefined\s!bottomfloat \else \def\s!bottomfloat{bottomfloat} \fi +\ifdefined\s!pagefloat \else \def\s!pagefloat {pagefloat} \fi \defineinsertion[\s!topfloat] \defineinsertion[\s!bottomfloat] +\defineinsertion[\s!pagefloat] \newdimen \d_page_floats_inserted_bottom \newdimen \d_page_floats_inserted_top +\newdimen \d_page_floats_inserted_page \newcount \c_page_floats_n_of_top \c_page_floats_n_of_top \plustwo \newcount \c_page_floats_n_of_bottom \c_page_floats_n_of_bottom\zerocount +\newcount \c_page_floats_n_of_page \c_page_floats_n_of_page \plustwo \newconstant\c_page_floats_insertions_topskip_mode % 1 = no topskip -%def\page_floats_report_saved {\showmessage\m!floatblocks2{\the\totalnoffloats}} -\def\page_floats_report_total {\showmessage\m!floatblocks4{\the\totalnoffloats}} -\def\page_floats_report_flushed{\showmessage\m!floatblocks3{\the\numexpr\totalnoffloats-\savednoffloats\relax}} +% \def\page_floats_report_saved +% {\showmessage\m!floatblocks2 +% {\the\totalnoffloats}} + +\def\page_floats_report_total + {\showmessage\m!floatblocks4% + {\the\totalnoffloats + \ifx\floatlocationmethod\empty + \ifx\floatlocation\empty\else,\floatlocation\fi + \else + ,\floatlocationmethod + \fi}} + +\def\page_floats_report_flushed + {\showmessage\m!floatblocks3% + {\the\numexpr\totalnoffloats-\savednoffloats\relax}} %D Extra float registers. @@ -50,11 +67,12 @@ %D For the moment we keep this but they will become private too. -\newcount\totalnoffloats % these will be redone ... handled at the lua end anyway -\newcount\savednoffloats % these will be redone ... handled at the lua end anyway -\newcount\nofcollectedfloats % communication channel +\newcount\totalnoffloats % these will be redone ... handled at the lua end anyway +\newcount\savednoffloats % these will be redone ... handled at the lua end anyway +\newcount\nofcollectedfloats % communication channel +\newdimen\maxcollectedfloatstotal % communication channel -\newcount\noffloatinserts % these will be redone ... handled at the lua end anyway +\newcount\noffloatinserts % these will be redone ... handled at the lua end anyway \newbox \floattext @@ -189,12 +207,14 @@ %D %D First we reimplement some helpers. +\def\page_floats_get_used_hsize{\hsize} + \unexpanded\def\page_floats_get {\ifconditional\c_page_floats_some_waiting \page_floats_flush\s!text\plusone \ifconditional\c_page_floats_center_box - \ifdim\wd\globalscratchbox<\hsize - \global\setbox\floatbox\hpack to \hsize{\hss\box\floatbox\hss}% + \ifdim\wd\globalscratchbox<\page_floats_get_used_hsize + \global\setbox\floatbox\hpack to \page_floats_get_used_hsize{\hss\box\floatbox\hss}% \else % retain special alignments \ifinsidecolumns @@ -264,6 +284,8 @@ \doifnotinset\v!low\floatspecification\vfill}% \page_otr_fill_and_eject_page} +\let\m_page_otf_checked_page_float\relax + \unexpanded\def\page_floats_flush_page_floats % used in postpone {\edef\m_page_otf_checked_page_float{\clf_checkedpagefloat}% \ifx\m_page_otf_checked_page_float\empty diff --git a/tex/context/base/mkiv/page-grd.mkiv b/tex/context/base/mkiv/page-grd.mkiv deleted file mode 100644 index 4125eb46a..000000000 --- a/tex/context/base/mkiv/page-grd.mkiv +++ /dev/null @@ -1,106 +0,0 @@ -%D \module -%D [ file=page-grd, % moved from page-ini -%D version=2011.12.07, % 2000.10.20, -%D title=\CONTEXT\ Page Macros, -%D subtitle=Grids, -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] -%C -%C This module is part of the \CONTEXT\ macro||package and is -%C therefore copyrighted by \PRAGMA. See mreadme.pdf for -%C details. - -\writestatus{loading}{ConTeXt Page Macros / Grids} - -\unprotect - -\newconstant\c_page_grids_location -\newconstant\c_page_grids_line_mode -\newconstant\c_page_grids_lineno_mode -\newconstant\c_page_grids_columns_mode - -\unexpanded\def\showgrid - {\dosingleempty\page_grids_show} - -\def\page_grids_show[#1]% - {\c_page_grids_location \plusone % downward compatible default - \c_page_grids_line_mode \plusone - \c_page_grids_lineno_mode \plusone - \c_page_grids_columns_mode\plusone - \processallactionsinset - [#1]% - [ \v!reset=>\c_page_grids_location \zerocount - \c_page_grids_columns_mode\zerocount, - \v!bottom=>\c_page_grids_location \plusone, - \v!top=>\c_page_grids_location \plustwo, - \v!none=>\c_page_grids_line_mode \zerocount, - \v!all=>\c_page_grids_line_mode \plusone, - \v!lines=>\c_page_grids_line_mode \plustwo, - \v!frame=>\c_page_grids_line_mode \plusthree, - \v!nonumber=>\c_page_grids_lineno_mode \zerocount, - \v!right=>\c_page_grids_lineno_mode \plusone, - \v!left=>\c_page_grids_lineno_mode \plustwo, - \v!outer=>\c_page_grids_lineno_mode \plusthree, - \v!columns=>\c_page_grids_columns_mode\plusone]% new option - \ifcase\c_page_grids_location - \let\page_grids_add_to_box\gobbleoneargument - \else % 1=bottom 2=top - \let\page_grids_add_to_box\page_grids_add_to_box_indeed - \fi - \ifcase\c_page_grids_columns_mode - \let\page_grids_add_to_one\gobbleoneargument - \let\page_grids_add_to_mix\gobbleoneargument - \else - \let\page_grids_add_to_one\page_grids_add_to_one_indeed - \let\page_grids_add_to_mix\page_grids_add_to_mix_indeed - \fi} - -% if really needed for speed we can cache the grid - -\let\page_grids_add_to_box\gobbleoneargument -\let\page_grids_add_to_one\gobbleoneargument -\let\page_grids_add_to_mix\gobbleoneargument - -\def\page_grids_add_to_box_indeed#1% to be checked for color and layer ..... use mp - {\startcolor[layout:grid]% - \resetvisualizers - \gridboxlinemode \c_page_grids_line_mode - \gridboxlinenomode\c_page_grids_lineno_mode - \setgridbox\scratchbox\makeupwidth\textheight % todo: check color - \global\setbox#1\hbox % global ? - {\ifcase\c_page_grids_location\or\or\box#1\hskip-\makeupwidth\fi - \begingroup % color - \ifcase\layoutcolumns\else - \gray - \setlayoutcomponentattribute{\v!grid:\v!columns}% - \hbox \layoutcomponentboxattribute to \makeupwidth - {\dorecurse\layoutcolumns - {\hskip\layoutcolumnwidth - \ifnum\recurselevel<\layoutcolumns - \vrule - \s!height\ht\scratchbox - \s!depth \dp\scratchbox - \s!width \layoutcolumndistance - \fi}}% - \hskip-\makeupwidth - \fi - \setlayoutcomponentattribute{\v!grid:\v!lines}% - \hbox \layoutcomponentboxattribute{\box\scratchbox}% - \endgroup - \ifcase\c_page_grids_location\or\hskip-\makeupwidth\box#1\fi}% - \stopcolor} - -\def\page_grids_add_to_one_indeed#1% - {\begingroup - \resetvisualizers - \global\setbox#1\vpack{\backgroundline[layout:one]{\box#1}}% - \endgroup} - -\def\page_grids_add_to_mix_indeed#1% - {\begingroup - \resetvisualizers - \global\setbox#1\vpack{\backgroundline[layout:mix]{\box#1}}% - \endgroup} - -\protect \endinput diff --git a/tex/context/base/mkiv/page-ini.lua b/tex/context/base/mkiv/page-ini.lua new file mode 100644 index 000000000..17723c421 --- /dev/null +++ b/tex/context/base/mkiv/page-ini.lua @@ -0,0 +1,203 @@ +if not modules then modules = { } end modules ['page-ini'] = { + version = 1.001, + comment = "companion to page-ini.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +local tonumber, rawget, type, next = tonumber, rawget, type, next +local match = string.match +local sort, tohash, insert, remove = table.sort, table.tohash, table.insert, table.remove +local settings_to_array, settings_to_hash = utilities.parsers.settings_to_array, utilities.parsers.settings_to_hash + +local texgetcount = tex.getcount + +local context = context +local ctx_testcase = commands.testcase + +local data = table.setmetatableindex("table") +local last = 0 +local pages = structures.pages +local autolist = { } +local report = logs.reporter("pages","mark") + +local trace = false trackers.register("pages.mark",function(v) trace = v end) + +function pages.mark(name,list) + local realpage = texgetcount("realpageno") + if not list or list == "" then + if trace then + report("marking current page %i as %a",realpage,name) + end + data[realpage][name] = true + return + end + if type(list) == "string" then + list = settings_to_array(list) + end + if type(list) == "table" then + for i=1,#list do + local page = list[i] + local sign = false + if type(page) == "string" then + local s, p = match(page,"([%+%-])(%d+)") + if s then + sign, page = s, p + end + end + page = tonumber(page) + if page then + if sign == "+" then + page = realpage + page + end + if sign == "-" then + report("negative page numbers are not supported") + else + if trace then + report("marking page %i as %a",page,name) + end + data[page][name] = true + end + end + end + else + if trace then + report("marking current page %i as %a",realpage,name) + end + data[realpage][name] = true + end +end + +function pages.marked(name) + local realpage = texgetcount("realpageno") + for i=last,realpage-1 do + data[i] = nil + end + local pagedata = rawget(data,realpage) + return pagedata and pagedata[name] +end + +local function toranges(marked) + local list = { } + local size = #marked + if size > 0 then + local first = marked[1] + local last = first + for i=2,size do + local page = marked[i] + if page > last + 1 then + list[#list+1] = { first, last } + first = page + end + last = page + end + list[#list+1] = { first, last } + end + return list +end + +pages.toranges = toranges + +local function allmarked(list) + if list then + local collected = pages.collected + if collected then + if type(list) == "string" then + list = settings_to_hash(list) + elseif type(list) == "table" and #list > 0 then + list = tohash(list) + end + if type(list) == "table" then + local found = { } + for name in next, list do + for page, list in next, data do + if list[name] and collected[page] then + found[#found+1] = page + end + end + end + if #found > 0 then + sort(found) + if trace then + local ranges = toranges(found) + for i=1,#ranges do + local range = ranges[i] + local first = range[1] + local last = range[2] + if first == last then + report("marked page : %i",first) + else + report("marked range: %i upto %i",first,last) + end + end + end + return found + end + end + end + end +end + +pages.allmarked = allmarked + +-- An alternative is to use an attribute and identify the state by parsing the node +-- list but that's a bit overkill for a hardly used feature like this. + +luatex.registerpageactions(function() + local nofauto = #autolist + if nofauto > 0 then + local realpage = texgetcount("realpageno") + for i=1,nofauto do + local names = autolist[i] + for j=1,#names do + local name = names[j] + data[realpage][name] = true + if trace then + report("automatically marking page %i as %a",realpage,name) + end + end + end + end +end) + +interfaces.implement { + name = "markpage", + arguments = { "string", "string" }, + actions = pages.mark +} + +interfaces.implement { + name = "doifelsemarkedpage", + arguments = "string", + actions = { marked, ctx_testcase } +} + +interfaces.implement { + name = "markedpages", + arguments = "string", + actions = function(name) + local t = allmarked(name) + if t then + context("%,t",t) + end + end +} + +interfaces.implement { + name = "startmarkpages", + arguments = "string", + actions = function(name) + insert(autolist,settings_to_array(name)) + end +} + +interfaces.implement { + name = "stopmarkpages", + arguments = "string", + actions = function(name) + if #autolist > 0 then + remove(autolist) + end + end +} diff --git a/tex/context/base/mkiv/page-ini.mkiv b/tex/context/base/mkiv/page-ini.mkiv index 6f6cb7180..dc94edf76 100644 --- a/tex/context/base/mkiv/page-ini.mkiv +++ b/tex/context/base/mkiv/page-ini.mkiv @@ -13,6 +13,8 @@ \writestatus{loading}{ConTeXt Page Macros / Initializations} +\registerctxluafile{page-ini}{} + %D The \type {\processpage} command has become obsolete. It's original %D purpose was to flush only parts of a document but nowadays we have %D project structure and modes. This is just one of those very early @@ -34,7 +36,7 @@ \newconditional\c_otr_shipout_enabled \settrue\c_otr_shipout_enabled -\unexpanded\def\page_otr_shipout +\unexpanded\def\page_otr_shipout % not used at all {\ifconditional\c_otr_shipout_enabled \expandafter\page_otr_shipout_yes \else @@ -65,17 +67,7 @@ \def\page_otr_flush_all_floats {%\flushnotes already done \ifconditional\c_page_floats_some_waiting - \begingroup - \c_page_floats_n_of_top\plusthousand - \c_page_floats_n_of_bottom\zerocount - % this is needed in case a float that has been stored - % ends up at the current page; this border case occurs when - % the calculated room is 'eps' smaller that the room available - % when just flushing; so now we have (maybe optional): - \pagebaselinecorrection % hm, needs checking, not needed when no floats - % alas, this is tricky but needed (first surfaced in prikkels) - \page_otr_command_flush_floats - \endgroup + \page_otr_command_flush_all_floats \fi} \def\page_otr_insert_dummy_page @@ -88,13 +80,57 @@ \fi} \def\page_otr_flush_pending_content - {\vskip\zeropoint\relax % brrr .. get rid of this + {\vskip\zeropoint\relax \ifvoid\normalpagebox \else \unvbox\normalpagebox \penalty\outputpenalty \fi} -\def\page_otr_construct_and_shipout#1#2% +\newconstant\c_page_postponed_mode % \c_page_postponed_mode\plusone +\newbox \b_page_otr_saved + +\installoutputroutine\savepagecontent + {\global\setbox\b_page_otr_saved\box\normalpagebox} + +\unexpanded\def\flushpagecontent + {\ifvoid\b_page_otr_saved\else\unvbox\b_page_otr_saved\fi} + +% Test case: assumes one group level for output routine, todo: +% a toks. +% +% \starttext +% +% \startbuffer[makeup] +% \startpagemakeup[pagestate=start,page=no] +% \color[red]{ +% \vfill +% \dorecurse{3}{ +% \samplefile{klein} +% \vfill +% } +% } +% \stoppagemakeup +% \stopbuffer +% +% \startcolor[green] +% \dorecurse{10}{ +% \dontleavehmode{\bf 1:#1:} \samplefile{sapolsky}\par +% } +% \stopcolor +% +% \startpostponing % [+3] +% \getbuffer[makeup] +% \stoppostponing +% +% \startcolor[blue] +% \dorecurse{25}{ +% \dontleavehmode{\bf 2:#1:} \samplefile{sapolsky}\par +% } +% \stopcolor +% +% \stoptext + +\def\page_otr_construct_and_shipout#1#2#3% {\forgetall \page_boxes_shipout{\page_boxes_constructed_page#1#2}% \hbox removed \page_otr_flush_pending_content @@ -110,7 +146,16 @@ \page_otr_check_for_pending_inserts \page_floats_flush_page_floats % before postponed blocks \page_spread_flush % defined later - \page_postponed_blocks_flush} + \ifnum#3=\plusone + % this is tricky! we need to make sure we are in the output group + \ifnum\c_page_postponed_mode=\plusone + \aftergroup\page_postponed_blocks_flush + \else + \page_postponed_blocks_flush + \fi + \else + \page_postponed_blocks_flush + \fi} % Can't we get rid of this hackery? It's used in some widgets % stuff so probably not. @@ -260,11 +305,49 @@ % \appendtoks % \ifvoid\thispageinsert\else\hbox{\smashedbox\thispageinsert}\fi % \to \everyshipout + +% not yet in i-* file + +\installcorenamespace{markedpage} + +\unexpanded\def\markpage + {\dodoubleempty\page_mark} + +\def\page_mark[#1][#2]% + {\clf_markpage{#1}{#2}} + +\def\markedpages[#1]% expandable + {\clf_markedpages{#1}} + +\unexpanded\def\doifelsemarkedpage#1% + {\clf_doifelsemarkedpage{#1}} + +\unexpanded\def\startmarkpages[#1]% + {\clf_startmarkpages{#1}} + +\unexpanded\def\stopmarkpages + {\clf_stopmarkpages} + +%D Experimental: + +\newconstant\c_page_force_strut_depth_trace_mode + +\installtextracker + {otr.forcestrutdepth} + {\c_page_force_strut_depth_trace_mode\plusone} + {\c_page_force_strut_depth_trace_mode\zerocount} + +\installoutputroutine\forcestrutdepth + {\clf_forcestrutdepth\normalpagebox\strutdp\c_page_force_strut_depth_trace_mode + \unvbox\normalpagebox} + +% maybe better: % -% %D Idea: +% \installoutputroutine\doforcestrutdepth +% {\clf_forcestrutdepth\normalpagebox\strutdp\c_page_force_strut_depth_trace_mode +% \unvbox\normalpagebox} % -% \definemarkedpage[nobackgrounds] -% \markpage[nobackgrounds] -% \doifmarkedpageelse{nobackgrounds} +% \unexpanded\def\forcestrutdepth +% {\par\ifvmode\ifinner\else\doforcestrutdepth\fi\fi} \protect \endinput diff --git a/tex/context/base/mkiv/page-inj.mkvi b/tex/context/base/mkiv/page-inj.mkvi index 03472fe55..e03569f23 100644 --- a/tex/context/base/mkiv/page-inj.mkvi +++ b/tex/context/base/mkiv/page-inj.mkvi @@ -20,7 +20,7 @@ \unprotect -\registerctxluafile{page-inj}{1.001} +\registerctxluafile{page-inj}{} \installcorenamespace {pageinjection} \installcorenamespace {pageinjectionalternative} diff --git a/tex/context/base/mkiv/page-ins.mkiv b/tex/context/base/mkiv/page-ins.mkiv index 09ba70b70..3b473343a 100644 --- a/tex/context/base/mkiv/page-ins.mkiv +++ b/tex/context/base/mkiv/page-ins.mkiv @@ -17,7 +17,7 @@ %D page builder. When multiple footnote classes were introduced, I decided to %D isolate some of the functionality in a module. -\registerctxluafile{page-ins}{1.001} +\registerctxluafile{page-ins}{} \unprotect diff --git a/tex/context/base/mkiv/page-lay.mkiv b/tex/context/base/mkiv/page-lay.mkiv index f2e39c660..7b80dadb9 100644 --- a/tex/context/base/mkiv/page-lay.mkiv +++ b/tex/context/base/mkiv/page-lay.mkiv @@ -125,7 +125,7 @@ \installswitchcommandhandler \??layout {layout} \??layout \appendtoks - \doifnothing{\strictlayoutparameter\c!state}{\letlayoutparameter\c!state\v!start}% + \doifnothing{\directlayoutparameter\c!state}{\letlayoutparameter\c!state\v!start}% \to \everydefinelayout \appendtoks @@ -473,11 +473,23 @@ [\page_paper_the_paper_size{#1}]% [\page_paper_the_print_size{#2}]}} -\setvalue{\??layoutpaper\v!reset }{\global\setfalse\c_page_target_paper_landscape - \global\setfalse\c_page_target_paper_mirror - \global\setfalse\c_page_target_paper_negate - \global\c_page_target_paper_orientation\uprotationangle - \global\c_page_target_paper_reverse \uprotationangle} +\unexpanded\def\page_paper_reset_paper + {\global\setfalse\c_page_target_paper_landscape + \global\setfalse\c_page_target_paper_mirror + \global\setfalse\c_page_target_paper_negate + \global\c_page_target_paper_orientation\uprotationangle + \global\c_page_target_paper_reverse \uprotationangle} + +\unexpanded\def\page_paper_reset_print + {\global\setfalse\c_page_target_print_landscape + \global\setfalse\c_page_target_print_mirror + \global\setfalse\c_page_target_print_negate + \global\c_page_target_print_orientation\uprotationangle + \global\c_page_target_print_reverse \uprotationangle} + +\letvalue{\??layoutpaper\v!reset}\page_paper_reset_paper +\letvalue{\??layoutprint\v!reset}\page_paper_reset_print + \setvalue{\??layoutpaper\v!landscape }{\global\settrue\c_page_target_paper_landscape} \setvalue{\??layoutpaper\v!mirrored }{\global\settrue\c_page_target_paper_mirror} \setvalue{\??layoutpaper\v!negative }{\global\settrue\c_page_target_paper_negate} @@ -490,11 +502,6 @@ \setvalue{\??layoutpaper\number\leftrotationangle }{\global\c_page_target_paper_orientation\leftrotationangle \global\c_page_target_paper_reverse \rightrotationangle} -\setvalue{\??layoutprint\v!reset }{\global\setfalse\c_page_target_print_landscape - \global\setfalse\c_page_target_print_mirror - \global\setfalse\c_page_target_print_negate - \global\c_page_target_print_orientation\uprotationangle - \global\c_page_target_print_reverse \uprotationangle} \setvalue{\??layoutprint\v!landscape }{\global\settrue\c_page_target_print_landscape} \setvalue{\??layoutprint\v!mirrored }{\global\settrue\c_page_target_print_mirror} \setvalue{\??layoutprint\v!negative }{\global\settrue\c_page_target_print_negate} @@ -519,18 +526,20 @@ \fi} \unexpanded\def\page_paper_set_current_indeed[#1][#2]% - {\edef\m_page_asked_paper{\v!reset,#1}% can be the restores - \edef\m_page_asked_print{\v!reset,#2}% + {\edef\m_page_asked_paper{#1}% can be the restores + \edef\m_page_asked_print{#2}% % \page_paper_set_restore\m_page_asked_paper\m_page_asked_print % % locate page target \let\currentlayouttarget\empty + \page_paper_reset_paper \processcommacommand[\m_page_asked_paper]\page_paper_identify_target \ifx\currentlayouttarget\empty \let\currentlayouttarget\currentpage \fi \global\let\papersize\currentlayouttarget + \page_paper_reset_paper \processcommacommand[\m_page_asked_paper]\page_paper_handle_page_option \global\paperwidth \layouttargetparameter\c!width \relax \global\paperheight\layouttargetparameter\c!height\relax @@ -550,8 +559,10 @@ % \page_paper_set_offsets % locate paper target + \page_paper_reset_print \processcommacommand[\m_page_asked_print]\page_paper_identify_target \global\let\printpapersize\currentlayouttarget + \page_paper_reset_print \processcommacommand[\m_page_asked_print]\page_paper_handle_print_option \global\printpaperwidth \layouttargetparameter\c!width \relax \global\printpaperheight\layouttargetparameter\c!height\relax @@ -948,7 +959,7 @@ {\setgvalue{\??layoutalternative#1}{#2}} \def\page_boxes_construct_content_default#1#2#3% targetbox flusher box - {\setbox#1\vbox + {\setbox#1\vpack % was \vbox {\offinterlineskip \begingroup % needed ? \uselayoutstyleandcolor\c!style\c!color @@ -1114,7 +1125,7 @@ \setsystemmode\v!footer \fi} -\def\calculatevsizes % name will change +\unexpanded\def\calculatevsizes % name will change {\textheight\makeupheight \doifelselayoutsomeline\v!header\compensatevsizeheader\donothing \doifelselayoutsomeline\v!footer\compensatevsizefooter\donothing @@ -1122,14 +1133,14 @@ \resetglobal \page_otr_command_set_vsize} -\def\calculateglobalvsizes % name will change +\unexpanded\def\calculateglobalvsizes % name will change {\global\textheight\makeupheight \doifelselayoutsomeline\v!header\globalcompensatevsizeheader\donothing \doifelselayoutsomeline\v!footer\globalcompensatevsizefooter\donothing \page_layouts_set_modes \page_otr_command_set_vsize} -\def\calculatereducedvsizes % name will change +\unexpanded\def\calculatereducedvsizes % name will change {\textheight\makeupheight \doifelselayoutsomeline\v!header\compensatevsizeheader\compensatevsizeheaderzero \doifelselayoutsomeline\v!footer\compensatevsizefooter\compensatevsizefooterzero} @@ -1142,7 +1153,7 @@ \def\compensatedinnermakeupmargin {\dimexpr\ifconditional\innermakeupcompensation+\innermakeupmargin\else\zeropoint\fi\relax} -\def\freezetextwidth % name will change % \makeupwidth may be set to \textwidth +\unexpanded\def\freezetextwidth % name will change % \makeupwidth may be set to \textwidth {\textwidth\makeupwidth % which is a tricky but valid value \edef\m_currentlayout_text_width {\layoutparameter\c!textwidth }% \edef\m_currentlayout_text_margin{\layoutparameter\c!textmargin}% @@ -1159,7 +1170,7 @@ \global\advance\innermakeupwidth-\scratchdimen \advance\textwidth-\scratchdimen} % local -\def\calculatehsizes % name will change +\unexpanded\def\calculatehsizes % name will change {\freezetextwidth \page_otr_command_set_hsize} @@ -1343,12 +1354,18 @@ %D \showsetup{showlayout} %D \showsetup{showsetups} %D %showsetup{showmargins} +%D %showsetup{showgrid} -\fetchruntimecommand \showprint {page-run} -\fetchruntimecommand \showframe {page-run} -\fetchruntimecommand \showlayout {page-run} -\fetchruntimecommand \showsetups {page-run} -\fetchruntimecommand \showmargins {page-run} +\fetchruntimecommand \showprint \f!page_run +\fetchruntimecommand \showframe \f!page_run +\fetchruntimecommand \showlayout \f!page_run +\fetchruntimecommand \showsetups \f!page_run +\fetchruntimecommand \showmargins \f!page_run +\fetchruntimecommand \showgrid \f!page_run + +\glet\page_grids_add_to_box\gobbleoneargument +\glet\page_grids_add_to_one\gobbleoneargument +\glet\page_grids_add_to_mix\gobbleoneargument %D The default dimensions are quite old and will not change. %D The funny fractions were introduced when we went from fixed @@ -1590,8 +1607,8 @@ \definepapersize [doubleoversized] - [ \c!width=\dimexpr \paperheight+\layouttargetparameter\c!distance\relax, - \c!height=\dimexpr2\paperwidth +\layouttargetparameter\c!distance\relax] + [ \c!width=\dimexpr \paperwidth +\layouttargetparameter\c!distance\relax, + \c!height=\dimexpr2\paperheight+\layouttargetparameter\c!distance\relax] \definepapersize [doublewide] @@ -1604,7 +1621,7 @@ \setuppapersize [A4] % [samesized] -%D A few goodies: +%D A few goodies, first a full page layout: \definelayout [\v!page] @@ -1631,9 +1648,24 @@ \c!lines=0, \c!grid=\v!no] +%D A quick and dirty one: + \definelayout [\v!middle] [\c!width=\v!middle, \c!height=\v!middle] +%D One for testing examples (5mm is often the non printable area): + +\definelayout + [\v!tight] + +\definelayout + [\v!tight] + [\v!page] + [\c!backspace=5mm, + \c!cutspace=5mm, + \c!topspace=5mm, + \c!bottomspace=5mm] + \protect \endinput diff --git a/tex/context/base/mkiv/page-lin.lua b/tex/context/base/mkiv/page-lin.lua index 8ec4ba5df..a6b6a12c4 100644 --- a/tex/context/base/mkiv/page-lin.lua +++ b/tex/context/base/mkiv/page-lin.lua @@ -71,7 +71,6 @@ local getattr = nuts.getattr local setattr = nuts.setattr local getlist = nuts.getlist local getbox = nuts.getbox -local getfield = nuts.getfield ----- getdir = nuts.getdir ----- getwidth = nuts.getwidth local getheight = nuts.getheight @@ -80,8 +79,6 @@ local getdepth = nuts.getdepth local setprop = nuts.setprop local getprop = nuts.getprop -local setfield = nuts.setfield - local traverse_id = nuts.traverse_id local traverse = nuts.traverse local copy_node = nuts.copy diff --git a/tex/context/base/mkiv/page-lin.mkvi b/tex/context/base/mkiv/page-lin.mkvi index 2692087cc..4348d6770 100644 --- a/tex/context/base/mkiv/page-lin.mkvi +++ b/tex/context/base/mkiv/page-lin.mkvi @@ -37,7 +37,7 @@ % % some line -\registerctxluafile{page-lin}{1.001} +\registerctxluafile{page-lin}{} \definesystemattribute[linenumber] [public] \definesystemattribute[linereference][public] diff --git a/tex/context/base/mkiv/page-mak.mkvi b/tex/context/base/mkiv/page-mak.mkvi index bbb7cc148..d64000542 100644 --- a/tex/context/base/mkiv/page-mak.mkvi +++ b/tex/context/base/mkiv/page-mak.mkvi @@ -201,6 +201,23 @@ \emptyhbox \page} +%D Probably obsolete (but used in one manual by Taco): + +\unexpanded\def\startcolumnmakeup % don't change + {\bgroup + \getrawnoflines\textheight % raw as we can have topskip + \setbox\scratchbox\vbox to \dimexpr\noflines\lineheight-\lineheight+\topskip\relax + \bgroup + \forgetall} + +\unexpanded\def\stopcolumnmakeup + {\egroup + \dp\scratchbox\zeropoint + \wd\scratchbox\textwidth + \box\scratchbox + \egroup + \page_otr_command_synchronize_hsize} + %D The text surrounding the main body text can be influenced %D by setting their associated status variables. The %D connection between them is made by the following macro diff --git a/tex/context/base/mkiv/page-mix.lua b/tex/context/base/mkiv/page-mix.lua index 524181c8e..107ac1410 100644 --- a/tex/context/base/mkiv/page-mix.lua +++ b/tex/context/base/mkiv/page-mix.lua @@ -8,8 +8,6 @@ if not modules then modules = { } end modules ["page-mix"] = { -- inserts.getname(name) --- getfield(l,"head") -> getlist - -- local node, tex = node, tex -- local nodes, interfaces, utilities = nodes, interfaces, utilities -- local trackers, logs, storage = trackers, logs, storage @@ -19,13 +17,15 @@ if not modules then modules = { } end modules ["page-mix"] = { local next, type = next, type local concat = table.concat -local ceil, floor = math.ceil, math.floor +local ceil = math.ceil local trace_state = false trackers.register("mixedcolumns.trace", function(v) trace_state = v end) local trace_detail = false trackers.register("mixedcolumns.detail", function(v) trace_detail = v end) local report_state = logs.reporter("mixed columns") +local context = context + local nodecodes = nodes.nodecodes local hlist_code = nodecodes.hlist @@ -47,7 +47,6 @@ local flushnode = nuts.flush local concatnodes = nuts.concat local slidenodes = nuts.slide -- ok here as we mess with prev links intermediately -local setfield = nuts.setfield local setlink = nuts.setlink local setlist = nuts.setlist local setnext = nuts.setnext @@ -57,7 +56,6 @@ local setwhd = nuts.setwhd local setheight = nuts.setheight local setdepth = nuts.setdepth -local getfield = nuts.getfield local getnext = nuts.getnext local getprev = nuts.getprev local getid = nuts.getid @@ -71,6 +69,8 @@ local getpenalty = nuts.getpenalty local getwidth = nuts.getwidth local getheight = nuts.getheight local getdepth = nuts.getdepth +local traverse_id = nuts.traverse_id +local traverse = nuts.traverse local theprop = nuts.theprop @@ -123,7 +123,7 @@ local function collectinserts(result,nxt,nxtid) if nxtid == insert_code then i = i + 1 result.i = i - inserttotal = inserttotal + getheight(nxt) -- height includes depth + inserttotal = inserttotal + getheight(nxt) -- height includes depth (hm, still? needs checking) local s = getsubtype(nxt) local c = inserts[s] if trace_detail then @@ -267,6 +267,7 @@ local function preparesplit(specification) -- a rather large function local height = 0 local depth = 0 local skip = 0 + local handlenotes = specification.notes or false local splitmethod = specification.splitmethod or false if splitmethod == v_none then splitmethod = false @@ -278,10 +279,14 @@ local function preparesplit(specification) -- a rather large function if nofcolumns == 0 then nofcolumns = 1 end - local preheight = specification.preheight or 0 - local extra = specification.extra or 0 - local maxheight = specification.maxheight - local optimal = originalheight/nofcolumns + local preheight = specification.preheight or 0 + local extra = specification.extra or 0 + local maxheight = specification.maxheight + local optimal = originalheight/nofcolumns + local noteheight = specification.noteheight or 0 + + maxheight = maxheight - noteheight + if specification.balance ~= v_yes then optimal = maxheight end @@ -630,7 +635,7 @@ local function preparesplit(specification) -- a rather large function if trace_state then report_state("%-8s > column %s, content: %s","line (1)",column,listtoutf(getlist(current),true,true)) end - if more then + if more and handlenotes then nxt, inserts, insertskips, nextskips, inserttotal = collectinserts(result,nxt,nxtid) end local state, skipped = checked(advance+inserttotal+insertskips,more and "line (2)" or "line only",lastlocked) @@ -753,7 +758,7 @@ local function preparesplit(specification) -- a rather large function specification.overflow = overflow specification.discarded = discarded - setlist(getbox(specification.box),nil) + setlist(getbox(specification.box)) return specification end @@ -776,9 +781,9 @@ local function finalize(result) end local t = r.tail if t then - setnext(t,nil) + setnext(t) else - setnext(h,nil) + setnext(h) r.tail = h end for c, list in next, r.inserts do @@ -786,11 +791,13 @@ local function finalize(result) for i=1,#list do local l = list[i] local h = new_hlist() + local g = getlist(l) t[i] = h - setlist(h,getlist(l)) - local wd, ht, dp = getwhd(l) - -- here ht is still ht + dp ! - setwhd(h,getwidth(h),ht,dp) + setlist(h,g) + local ht = getheight(l) + local dp = getdepth(l) + local wd = getwidth(g) + setwhd(h,wd,ht,dp) setlist(l) end setprev(t[1]) -- needs checking @@ -822,6 +829,23 @@ local function report_deltas(result,str) report_state("%s, cycles %s, deltas % | t",str,result.cycle or 1,t) end +-- local function xxcollectinserts(h) +-- local skips, total, order = 0, 0, 0 +-- print(h) +-- if h then +-- h = getlist(h) +-- for n in traverse(h) do +-- print(tonode(n)) +-- end +-- for n in traverse_id(insert_code,h) do +-- order = order + 1 +-- total = total + getheight(n) +-- skips = skips + structures.notes.check_spacing(getsubtype(n),order) +-- end +-- end +-- return skips, total +-- end + local function setsplit(specification) splitruns = splitruns + 1 if trace_state then @@ -910,7 +934,6 @@ local function getsplit(result,n) return s end end - if grid then -- print(n,result.maxtotal,r.total,r.extra) if isglobal then @@ -962,13 +985,11 @@ local function getsplit(result,n) end for c, list in next, r.inserts do - local l = concatnodes(list) for i=1,#list-1 do setdepth(list[i],0) end local b = vpack(l) -- multiple arguments, todo: fastvpack - -- setbox("global",c,b) setbox(c,b) r.inserts[c] = nil @@ -1025,6 +1046,7 @@ implement { { "box", "integer" }, { "nofcolumns", "integer" }, { "maxheight", "dimen" }, + { "noteheight", "dimen" }, { "step", "dimen" }, { "cycles", "integer" }, { "preheight", "dimen" }, @@ -1037,6 +1059,7 @@ implement { { "alternative" }, { "internalgrid" }, { "grid", "boolean" }, + { "notes", "boolean" }, } } } diff --git a/tex/context/base/mkiv/page-mix.mkiv b/tex/context/base/mkiv/page-mix.mkiv index 7defece12..684ebc585 100644 --- a/tex/context/base/mkiv/page-mix.mkiv +++ b/tex/context/base/mkiv/page-mix.mkiv @@ -35,7 +35,7 @@ % % \ctxlua{tex.setbox("global",0,node.hpack(nodes.pool.glyph("a",font.current())))}\box0 -\registerctxluafile{page-mix}{1.001} +\registerctxluafile{page-mix}{} \unprotect @@ -84,6 +84,7 @@ \c!step=.25\lineheight, % needs some experimenting %\c!splitmethod=\v!fixed, % will be default \c!direction=\v!normal, % new (also todo in the new columnsets) + \c!notes=\v!yes, \c!method=\ifinner\s!box\else\s!otr\fi] % automatic as suggested by WS \let\startmixedcolumns\relax % defined later @@ -123,6 +124,8 @@ \setnewconstant\c_page_mix_routine_balance \plusthree \setnewconstant\c_page_mix_routine_error \plusfour +\newconditional\c_page_mix_process_notes + %D The main environment is called as follows: %D %D \starttyping @@ -183,7 +186,8 @@ \c!splitmethod=\v!none, \c!grid=\v!tolerant, \c!internalgrid=\v!halfline, % new, we may still revert to \v!line - \c!balance=\v!yes] + \c!balance=\v!yes, + \c!notes=\v!no] % kind of hidden % better @@ -193,6 +197,17 @@ \c!grid=\v!yes, \c!internalgrid=\v!line] +% even better: + +\setupitemgroup + [\c!grid=\v!tolerant:10] % 10 pct tolerance in columns snapping + +\setupmixedcolumns + [\s!itemgroupcolumns] + [\c!grid=\itemgroupparameter\c!grid] + +% the fast hooks: + \unexpanded\def\strc_itemgroups_start_columns {\startmixedcolumns[\s!itemgroupcolumns]} % we could have a fast one @@ -239,7 +254,7 @@ \def\page_mix_routine_error {\showmessage\m!columns3\empty - \page_otr_construct_and_shipout\unvbox\normalpagebox} + \page_otr_construct_and_shipout\unvbox\normalpagebox\zerocount} % three arguments %D Some settings (and actions) depend on the current output routine and setting the %D hsize and vsize is among them. The calculation of the hsize is done elsewhere. @@ -464,18 +479,29 @@ \let\page_mix_fast_columns_stop\relax +\newtoks\t_page_mix_at_the_end + +\def\page_mix_finalize_columns + {\ifconditional\c_page_mix_process_notes \else + \global\t_page_mix_at_the_end{\stoppostponingnotes}% + \fi} + \unexpanded\def\page_mix_columns_stop_yes - {\begincsname\??mixedcolumnsstop \currentmixedcolumnsmethod\endcsname % no \relax + {\begincsname\??mixedcolumnsstop\currentmixedcolumnsmethod\endcsname % no \relax + \page_mix_finalize_columns \endgroup \begincsname\??mixedcolumnsafter\currentmixedcolumnsmethod\endcsname\relax \mixedcolumnsparameter\c!after\relax \popmacro\currentmixedcolumnsmethod - \popmacro\currentmixedcolumns} + \popmacro\currentmixedcolumns + \the\t_page_mix_at_the_end\global\t_page_mix_at_the_end\emptytoks} \unexpanded\def\page_mix_columns_stop_nop - {\endgroup + {\page_mix_finalize_columns + \endgroup \popmacro\currentmixedcolumnsmethod - \popmacro\currentmixedcolumns} + \popmacro\currentmixedcolumns + \the\t_page_mix_at_the_end\global\t_page_mix_at_the_end\emptytoks} % \unexpanded\def\page_mix_columns_stop_yes % {\begincsname\??mixedcolumnsstop \currentmixedcolumnsmethod\endcsname % no \relax @@ -528,6 +554,11 @@ \leftskip \zeropoint \rightskip\zeropoint % + \doifelse{\mixedcolumnsparameter\c!notes}\v!yes\settrue\setfalse\c_page_mix_process_notes + \ifconditional\c_page_mix_process_notes \else + \startpostponingnotes + \fi + % \d_page_mix_threshold\zeropoint % \d_page_mix_column_width\dimexpr(\d_page_mix_max_width-\d_page_mix_distance*\numexpr(\c_page_mix_n_of_columns-\plusone)\relax)/\c_page_mix_n_of_columns\relax @@ -634,10 +665,16 @@ \unexpanded\def\page_mix_routine_construct#1% {\d_page_mix_max_height\mixedcolumnsparameter\c!maxheight % can have changed due to header=high + \ifconditional\c_page_mix_process_notes + \totalnoteheight\zeropoint + \else + \settotalinsertionheight + \fi \clf_mixsetsplit box \b_page_mix_collected nofcolumns \c_page_mix_n_of_columns maxheight \d_page_mix_max_height + noteheight \totalnoteheight step \d_page_mix_balance_step cycles \c_page_mix_balance_cycles preheight \d_page_mix_preceding_height @@ -649,7 +686,8 @@ balance {#1}% alternative {\mixedcolumnsparameter\c!alternative}% internalgrid {\mixedcolumnsparameter\c!internalgrid}% - grid \ifgridsnapping true\else false\fi + grid \ifgridsnapping tru\else fals\fi e % + notes \ifconditional\c_page_mix_process_notes tru\else fals\fi e % \relax \deadcycles\zerocount} @@ -710,7 +748,13 @@ \fi}% \fi \egroup - \egroup} + \hskip\d_page_mix_rightskip + \egroup + \wd\b_page_mix_collected\dimexpr + \d_page_mix_max_width + +\d_page_mix_rightskip + +\d_page_mix_leftskip + \relax } \unexpanded\def\page_mix_command_package_column {\page_mix_hbox to \d_page_mix_column_width \bgroup @@ -719,7 +763,9 @@ \hskip-\d_page_mix_column_width \vbox \bgroup \hsize\d_page_mix_column_width - \placenoteinserts + \ifconditional\c_page_mix_process_notes + \placenoteinserts + \fi \egroup \hss \egroup} @@ -731,7 +777,7 @@ \setbox\b_page_mix_collected\vpack{\unvbox\normalpagebox}% brrr we need to make a tight box (combine this in lua) \page_mix_routine_construct\v!no \page_mix_routine_package - \page_otr_construct_and_shipout\box\b_page_mix_collected + \page_otr_construct_and_shipout\box\b_page_mix_collected\zerocount % three arguments \clf_mixflushrest \clf_mixcleanup \egroup} @@ -769,7 +815,7 @@ % 1 = we have stuff left, so flush and rebalance %writestatus\m!columns{flush continue}% \page_mix_routine_package - \page_otr_construct_and_shipout\box\b_page_mix_collected + \page_otr_construct_and_shipout\box\b_page_mix_collected\zerocount % three arguments \setbox\b_page_mix_collected\vpack{\clf_mixflushrest}% we could avoid this \clf_mixcleanup \ifdim\ht\b_page_mix_collected=\zeropoint @@ -932,10 +978,10 @@ \unexpanded\def\page_mix_place_float_force {\page_one_place_float_force} -\unexpanded\def\page_mix_command_side_float_output % hm - {\page_otr_construct_and_shipout\unvbox\normalpagebox} +\unexpanded\def\page_mix_command_side_float_output + {\page_otr_construct_and_shipout\unvbox\normalpagebox\zerocount} % three arguments -\unexpanded\def\page_mix_command_synchronize_side_floats % hm +\unexpanded\def\page_mix_command_synchronize_side_floats {\page_sides_forget_floats} \unexpanded\def\page_mix_command_flush_side_floats @@ -965,27 +1011,30 @@ %D We need to hook some handlers into the output routine and we define %D a dedicated one: +\let\page_mix_command_flush_all_floats\page_one_command_flush_all_floats + \defineoutputroutine [\s!mixedcolumn] [\s!page_otr_command_routine =\page_mix_command_routine, \s!page_otr_command_package_contents =\page_mix_command_package_contents, \s!page_otr_command_set_vsize =\page_mix_command_set_vsize, \s!page_otr_command_set_hsize =\page_mix_command_set_hsize, + % \s!page_otr_command_synchronize_hsize =\page_mix_command_synchronize_hsize, \s!page_otr_command_next_page =\page_mix_command_next_page, \s!page_otr_command_next_page_and_inserts =\page_mix_command_next_page_and_inserts, - % \s!page_otr_command_synchronize_hsize =\page_mix_command_synchronize_hsize, % \s!page_otr_command_set_top_insertions =\page_mix_command_set_top_insertions, % \s!page_otr_command_set_bottom_insertions =\page_mix_command_set_bottom_insertions, % \s!page_otr_command_flush_top_insertions =\page_mix_command_flush_top_insertions, % \s!page_otr_command_flush_bottom_insertions=\page_mix_command_flush_bottom_insertions, - % \s!page_otr_command_set_float_hsize =\page_mix_command_set_float_hsize, \s!page_otr_command_check_if_float_fits =\page_mix_command_check_if_float_fits, + % \s!page_otr_command_set_float_hsize =\page_mix_command_set_float_hsize, \s!page_otr_command_flush_float_box =\page_mix_command_flush_float_box, - \s!page_otr_command_synchronize_side_floats=\page_mix_command_synchronize_side_floats, \s!page_otr_command_side_float_output =\page_mix_command_side_float_output, + \s!page_otr_command_synchronize_side_floats=\page_mix_command_synchronize_side_floats, \s!page_otr_command_flush_floats =\page_mix_command_flush_floats, \s!page_otr_command_flush_side_floats =\page_mix_command_flush_side_floats, \s!page_otr_command_flush_saved_floats =\page_mix_command_flush_saved_floats, + \s!page_otr_command_flush_all_floats =\page_mix_command_flush_all_floats, % \s!page_otr_command_flush_margin_blocks =\page_mix_command_flush_margin_blocks, % not used \s!page_otr_command_test_column =\page_mix_command_test_column ] diff --git a/tex/context/base/mkiv/page-mrk.mkiv b/tex/context/base/mkiv/page-mrk.mkiv index 43116e84d..69746ea89 100644 --- a/tex/context/base/mkiv/page-mrk.mkiv +++ b/tex/context/base/mkiv/page-mrk.mkiv @@ -13,13 +13,19 @@ \writestatus{loading}{ConTeXt Page Macros / Cutmarks and Colorbars} -%D This module depends on \METAPOST. - \unprotect -% \def\pagecutmarksymbol {\the\realpageno} -% \let\pagecutmarktoptext \empty -% \let\pagecutmarkbottomtext \empty +%D This module implements curmarks and depends on \METAPOST. +%D +%D \starttyping +%D \setuplayout[marking=on,location=middle] +%D \setuplayout[marking=page,location=middle] +%D \setuplayout[marking=empty,location=middle] +%D \setuplayout[marking={color,page},location=middle] +%D \setuplayout[marking={one,page},location=middle] +%D \setuplayout[marking={two,page},location=middle] +%D \setuplayout[marking={four,page},location=middle] +%D \stoptyping \def\pagecutmarklength {5mm} \def\pagecutmarkoffset {3mm} % slightly larger than before, and now a fixed size @@ -49,7 +55,8 @@ \startuniqueMPgraphic{print:lines}{w,h,l,o,x,y} loadmodule "crop" ; - page_marks_add_lines(\MPvar w,\MPvar h,\MPvar l,\MPvar o,\MPvar x,\MPvar y) ; + page_marks_add_lines(\MPvar w,\MPvar h,\MPvar l,\MPvar o,\MPvar x,\MPvar y, + \ifconditional\c_page_marks_add_page_lines tru\else fals\fi e) ; \stopuniqueMPgraphic \startuseMPgraphic{print:number}{w,h,l,o,n} @@ -112,9 +119,7 @@ \scratchheight\ht#1% \scratchdepth \dp#1% \box#1\relax - \ifconditional\c_page_marks_add_page_lines - \page_marks_add_lines - \fi + \page_marks_add_lines \egroup} \def\page_marks_add_more_indeed#1% @@ -163,28 +168,29 @@ % \let\pagecutmarkbottomtext\extrapagecutmarkbottomtext} \installpagecutmark\v!on - {\settrue\c_page_marks_add_page_lines + {%settrue\c_page_marks_add_page_lines \settrue\c_page_marks_add_more_lines \settrue\c_page_marks_add_more_number} -\installpagecutmark\v!page % todo - {\settrue\c_page_marks_add_more_lines +\installpagecutmark\v!page + {\settrue\c_page_marks_add_page_lines + \settrue\c_page_marks_add_more_lines \settrue\c_page_marks_add_more_number} \installpagecutmark\v!empty - {\settrue\c_page_marks_add_page_lines + {%settrue\c_page_marks_add_page_lines \settrue\c_page_marks_add_more_lines} \installpagecutmark\v!color - {\settrue\c_page_marks_add_page_lines + {%settrue\c_page_marks_add_page_lines \settrue\c_page_marks_add_more_lines \settrue\c_page_marks_add_more_color \settrue\c_page_marks_add_more_marking \settrue\c_page_marks_add_more_number} -\installpagecutmark\v!one {\global\c_page_marks_max\plusone} -\installpagecutmark\v!two {\global\c_page_marks_max\plustwo} -\installpagecutmark\v!four{\global\c_page_marks_max\plusfour} +\installpagecutmark\v!one {\global\c_page_marks_max\plusone} % first page +\installpagecutmark\v!two {\global\c_page_marks_max\plustwo} % first two pages +\installpagecutmark\v!four{\global\c_page_marks_max\plusfour} % first four pages \unexpanded\def\page_marks_set#1% {\begincsname\??layoutmarking#1\endcsname} diff --git a/tex/context/base/mkiv/page-mul.mkiv b/tex/context/base/mkiv/page-mul.mkiv index fcad2c4c6..51af24b6a 100644 --- a/tex/context/base/mkiv/page-mul.mkiv +++ b/tex/context/base/mkiv/page-mul.mkiv @@ -15,6 +15,8 @@ % !!! there are some issues with hsize an vsize as well as flushing % !!! floats but this module will be redone anyway +% +% can have some vpack and hpack \writestatus{loading}{ConTeXt Page Macros / Simple Multi Column} @@ -84,7 +86,7 @@ {\page_one_place_float_force} \unexpanded\def\page_mul_command_side_float_output - {\page_otr_construct_and_shipout\unvbox\normalpagebox} + {\page_otr_construct_and_shipout\unvbox\normalpagebox\zerocount} % three arguments \unexpanded\def\page_mul_command_flush_side_floats {\page_sides_forget_floats} @@ -339,7 +341,7 @@ \def\page_mul_routine_error {\showmessage\m!columns3\empty - \page_otr_construct_and_shipout\unvbox\normalpagebox} + \page_otr_construct_and_shipout\unvbox\normalpagebox\zerocount} % three arguments %D When we leave the multi||column mode, we have to process the not yet shipped out %D part of the columns. When we don't balance, we simply force a continuous output, @@ -856,7 +858,7 @@ {\ht\currentcolumnbox\d_page_mul_balance_target}% redundant \fi \setbox\b_page_mul_preceding\vbox{\page_mul_flush_packaged_columns_continued}% - \page_otr_construct_and_shipout\box\b_page_mul_preceding + \page_otr_construct_and_shipout\box\b_page_mul_preceding\zerocount % three arguments \page_otr_command_set_hsize \page_otr_command_set_vsize \page_mul_flush_floats @@ -1818,6 +1820,7 @@ \let\page_mul_command_package_contents\page_one_command_package_contents \let\page_mul_command_flush_float_box \page_one_command_flush_float_box +\let\page_mul_command_flush_all_floats\page_one_command_flush_all_floats \defineoutputroutine [\s!multicolumn] @@ -1825,21 +1828,22 @@ \s!page_otr_command_package_contents =\page_mul_command_package_contents, \s!page_otr_command_set_vsize =\page_mul_command_set_vsize, \s!page_otr_command_set_hsize =\page_mul_command_set_hsize, + % \s!page_otr_command_synchronize_hsize =\page_mul_command_synchronize_hsize, \s!page_otr_command_next_page =\page_mul_command_next_page, \s!page_otr_command_next_page_and_inserts =\page_mul_command_next_page_and_inserts, - % \s!page_otr_command_synchronize_hsize =\page_mul_command_synchronize_hsize, % \s!page_otr_command_set_top_insertions =\page_mul_command_set_top_insertions, % \s!page_otr_command_set_bottom_insertions =\page_mul_command_set_bottom_insertions, \s!page_otr_command_flush_top_insertions =\page_mul_command_flush_top_insertions, % \s!page_otr_command_flush_bottom_insertions=\page_mul_command_flush_bottom_insertions, - % \s!page_otr_command_set_float_hsize =\page_mul_command_set_float_hsize, \s!page_otr_command_check_if_float_fits =\page_mul_command_check_if_float_fits, + % \s!page_otr_command_set_float_hsize =\page_mul_command_set_float_hsize, \s!page_otr_command_flush_float_box =\page_mul_command_flush_float_box, - \s!page_otr_command_synchronize_side_floats=\page_mul_command_synchronize_side_floats, \s!page_otr_command_side_float_output =\page_mul_command_side_float_output, + \s!page_otr_command_synchronize_side_floats=\page_mul_command_synchronize_side_floats, \s!page_otr_command_flush_floats =\page_mul_command_flush_floats, \s!page_otr_command_flush_side_floats =\page_mul_command_flush_side_floats, \s!page_otr_command_flush_saved_floats =\page_mul_command_flush_saved_floats, + \s!page_otr_command_flush_all_floats =\page_mul_command_flush_all_floats, % \s!page_otr_command_flush_margin_blocks =\page_mul_command_flush_margin_blocks, % not used \s!page_otr_command_test_column =\page_mul_command_test_column ] diff --git a/tex/context/base/mkiv/page-one.mkiv b/tex/context/base/mkiv/page-one.mkiv index 9bd6951f3..35233247b 100644 --- a/tex/context/base/mkiv/page-one.mkiv +++ b/tex/context/base/mkiv/page-one.mkiv @@ -1,4 +1,4 @@ - %D \module +%D \module %D [ file=page-one, %D version=2000.10.20, %D title=\CONTEXT\ Page Macros, @@ -192,7 +192,7 @@ \egroup} \unexpanded\def\page_one_command_side_float_output - {\page_otr_construct_and_shipout\unvbox\normalpagebox} + {\page_otr_construct_and_shipout\unvbox\normalpagebox\plusone} % three arguments, we need to be in the output group \unexpanded\def\page_one_command_routine {\page_sides_output_routine} @@ -365,29 +365,33 @@ \def\page_one_command_flush_floats_indeed % much in common with OTRSET {\ifconditional\c_page_floats_some_waiting \ifconditional\c_page_floats_pack_flushed - \setfalse\c_page_floats_center_box % not needed as we do call directly \page_floats_collect\s!text\hsize\emwidth - %% no longer (interferes with footnotes): - %% - %% \page_one_command_set_vsize % test 2011.06.24.001 - %% - \global\setbox\floatbox\hbox to \hsize - {\hfil - \dorecurse\nofcollectedfloats - {\ifcase\columndirection % nog document wide - \page_floats_flush\s!text\plusone - \else - \page_floats_flush\s!text{\the\numexpr\nofcollectedfloats-\recurselevel+1\relax}% - \fi - \ifdim\wd\floatbox>\makeupwidth % \hsize - \hbox to \makeupwidth{\hss\box\floatbox\hss}% - \else - \box\floatbox - \fi - \ifnum\recurselevel<\nofcollectedfloats - \hfil - \fi}% - \hfil}% + \ifcase\nofcollectedfloats + \page_floats_get + \else + \setfalse\c_page_floats_center_box % not needed as we do call directly + %% no longer (interferes with footnotes): + %% + %% \page_one_command_set_vsize % test 2011.06.24.001 + %% + \global\setbox\floatbox\hbox to \hsize + {\hfil + \dorecurse\nofcollectedfloats + {\ifcase\columndirection % nog document wide + \page_floats_flush\s!text\plusone + \else + \page_floats_flush\s!text{\the\numexpr\nofcollectedfloats-\recurselevel+1\relax}% + \fi + \ifdim\wd\floatbox>\makeupwidth % \hsize + \hpack to \makeupwidth{\hss\box\floatbox\hss}% + \else + \box\floatbox + \fi + \ifnum\recurselevel<\nofcollectedfloats + \hfil + \fi}% + \hfil}% + \fi \else \page_floats_get \fi @@ -423,20 +427,21 @@ \fi % should be an option \endgroup - \dimen0\dimexpr\pagetotal+\floatheight+\d_strc_floats_top-\pageshrink\relax - \dimen2\pagegoal + \scratchdimenone\dimexpr\pagetotal+\floatheight+\d_strc_floats_top-\pageshrink\relax + \scratchdimentwo\pagegoal \relax % needed \ifcase\c_page_one_float_method % method 0 : raw \or % method 1 : safe - \dimen2 .99\pagegoal + % too fuzzy as it can change and for a high page it's a lot : \scratchdimentwo .99\pagegoal + \advance\scratchdimentwo -\strutdp \or % method 2 : tight - \advance\dimen0 -\onepoint + \advance\scratchdimenone -\onepoint \fi \relax % really needed ! ! ! ! - \ifdim\dimen0>\dimen2 + \ifdim\scratchdimenone>\scratchdimentwo \global\setfalse\c_page_floats_room \else \global\settrue\c_page_floats_room @@ -456,7 +461,6 @@ \fi\fi \fi} - \def\page_one_place_float_here_indeed {\ifgridsnapping % otherwise real bad outcome @@ -596,27 +600,43 @@ \unexpanded\def\page_one_command_test_page {\testpage} +\unexpanded\def\page_one_command_flush_all_floats + {\ifconditional\c_page_floats_some_waiting + \begingroup + \c_page_floats_n_of_top\plusthousand + \c_page_floats_n_of_bottom\zerocount + % this is needed in case a float that has been stored + % ends up at the current page; this border case occurs when + % the calculated room is 'eps' smaller that the room available + % when just flushing; so now we have (maybe optional): + \pagebaselinecorrection % hm, needs checking, not needed when no floats + % alas, this is tricky but needed (first surfaced in prikkels) + \page_otr_command_flush_floats + \endgroup + \fi} + \defineoutputroutine [\s!singlecolumn] [\s!page_otr_command_routine =\page_one_command_routine, \s!page_otr_command_package_contents =\page_one_command_package_contents, \s!page_otr_command_set_vsize =\page_one_command_set_vsize, \s!page_otr_command_set_hsize =\page_one_command_set_hsize, + % \s!page_otr_command_synchronize_hsize =\page_one_command_synchronize_hsize, \s!page_otr_command_next_page =\page_one_command_next_page, \s!page_otr_command_next_page_and_inserts =\page_one_command_next_page_and_inserts, - % \s!page_otr_command_synchronize_hsize =\page_one_command_synchronize_hsize, \s!page_otr_command_set_top_insertions =\page_one_command_set_top_insertions, \s!page_otr_command_set_bottom_insertions =\page_one_command_set_bottom_insertions, \s!page_otr_command_flush_top_insertions =\page_one_command_flush_top_insertions, \s!page_otr_command_flush_bottom_insertions=\page_one_command_flush_bottom_insertions, - % \s!page_otr_command_set_float_hsize =\page_one_command_set_float_hsize, \s!page_otr_command_check_if_float_fits =\page_one_command_check_if_float_fits, + % \s!page_otr_command_set_float_hsize =\page_one_command_set_float_hsize, \s!page_otr_command_flush_float_box =\page_one_command_flush_float_box, - \s!page_otr_command_synchronize_side_floats=\page_one_command_synchronize_side_floats, \s!page_otr_command_side_float_output =\page_one_command_side_float_output, + \s!page_otr_command_synchronize_side_floats=\page_one_command_synchronize_side_floats, \s!page_otr_command_flush_floats =\page_one_command_flush_floats, \s!page_otr_command_flush_side_floats =\page_one_command_flush_side_floats, \s!page_otr_command_flush_saved_floats =\page_one_command_flush_saved_floats, + \s!page_otr_command_flush_all_floats =\page_one_command_flush_all_floats, \s!page_otr_command_flush_margin_blocks =\page_one_command_flush_margin_blocks, \s!page_otr_command_test_column =\page_one_command_test_page ] diff --git a/tex/context/base/mkiv/page-otr.mkvi b/tex/context/base/mkiv/page-otr.mkvi index ec38a06c1..ebaf17ebc 100644 --- a/tex/context/base/mkiv/page-otr.mkvi +++ b/tex/context/base/mkiv/page-otr.mkvi @@ -19,7 +19,7 @@ % When issuing two \par\penalty-\plustenthousand's, only the first % triggers the otr. Is this an obscure feature or an optimization? -\registerctxluafile{page-otr}{1.001} +\registerctxluafile{page-otr}{} \unprotect @@ -52,7 +52,7 @@ \to \everyswitchoutputroutine \unexpanded\def\page_otr_specifics_preset#name% - {\edef\page_otr_specifics_command{\strictoutputroutineparameter{#name}}% no inheritance of commands + {\edef\page_otr_specifics_command{\directoutputroutineparameter{#name}}% no inheritance of commands \ifx\page_otr_specifics_command\empty \writestatus{\currentoutputroutine}{- \expandafter\strippedcsname\csname#name\endcsname}% \expandafter\let\csname#name\endcsname\relax @@ -62,7 +62,7 @@ \fi} \unexpanded\def\page_otr_specifics_preset_normal#name% - {\edef\page_otr_specifics_command{\strictoutputroutineparameter{#name}}% no inheritance of commands + {\edef\page_otr_specifics_command{\directoutputroutineparameter{#name}}% no inheritance of commands \ifx\page_otr_specifics_command\empty \expandafter\let\csname#name\endcsname\relax \else @@ -70,7 +70,7 @@ \fi} \unexpanded\def\page_otr_specifics_preset_traced#name% - {\edef\page_otr_specifics_command{\strictoutputroutineparameter{#name}}% no inheritance of commands + {\edef\page_otr_specifics_command{\directoutputroutineparameter{#name}}% no inheritance of commands \ifx\page_otr_specifics_command\empty \writestatus{\currentoutputroutine}{preset: - \expandafter\strippedcsname\csname#name\endcsname}% \expandafter\let\csname#name\endcsname\relax @@ -114,8 +114,9 @@ c:\number\mofcolumns,\space v:\the\vsize ,\space g:\the\pagegoal ,\space - t:\the\pagetotal ,\space + t:\the\pagetotal \ifdim\pagetotal>\pagegoal + ,\space d:\the\dimexpr\pagetotal-\pagegoal\relax \fi}} @@ -166,12 +167,32 @@ #content\relax \the\everyafteroutput}} +% Just as fuzzy (and in 'one' we are okay with \aftergroup anyway): +% +% \ifdefined\everybeforeoutputgroup \else \newtoks\everybeforeoutputgroup \fi +% \ifdefined\everyafteroutputgroup \else \newtoks\everyafteroutputgroup \fi +% +% \def\page_otf_set_engine_output_routine#content% +% {\the\everybeforeoutputgroup +% \global\output +% {\inotrtrue +% \the\everybeforeoutput +% #content\relax +% \the\everyafteroutput +% \aftergroup\the\aftergroup\everyafteroutputgroup}} +% +% \appendtoks +% \ifnum\c_page_postponed_mode=\plusone +% \page_postponed_blocks_flush % and then not in \page_otr_construct_and_shipout +% \fi +% \to \everyafteroutputgroup + \page_otf_set_engine_output_routine\page_otr_triggered_output_routine -\installoutputroutine\synchronizeoutput +\installoutputroutine\synchronizeoutput % use \triggerpagebuilder instead {\ifvoid\normalpagebox\else \unvbox\normalpagebox - \pagediscards + % not \pagediscards as it does more harm than good \fi} \installoutputroutine\discardpage @@ -238,7 +259,9 @@ {\writestatus\m!system{Sorry, you're not done yet, so no goodbye!}} %D We define a few constants because that (1) provides some checking -%D and (2) is handier when aligning definitions (checks nicer). +%D and (2) is handier when aligning definitions (checks nicer). Most +%D routines will use ard codes names but sometimes we want to adapt, +%D which is why we have these: \definesystemconstant{page_otr_command_routine} \definesystemconstant{page_otr_command_package_contents} @@ -259,12 +282,14 @@ \definesystemconstant{page_otr_command_flush_floats} \definesystemconstant{page_otr_command_flush_side_floats} \definesystemconstant{page_otr_command_flush_saved_floats} +\definesystemconstant{page_otr_command_flush_all_floats} \definesystemconstant{page_otr_command_flush_margin_blocks} \definesystemconstant{page_otr_command_test_column} \definesystemconstant{singlecolumn} \definesystemconstant{multicolumn} % will move \definesystemconstant{columnset} % will move +\definesystemconstant{pagecolumn} % will move \defineoutputroutinecommand [\s!page_otr_command_routine, @@ -286,6 +311,7 @@ \s!page_otr_command_flush_floats, \s!page_otr_command_flush_side_floats, \s!page_otr_command_flush_saved_floats, + \s!page_otr_command_flush_all_floats, \s!page_otr_command_flush_margin_blocks, \s!page_otr_command_test_column] diff --git a/tex/context/base/mkiv/page-pcl.mkiv b/tex/context/base/mkiv/page-pcl.mkiv new file mode 100644 index 000000000..53d9f781d --- /dev/null +++ b/tex/context/base/mkiv/page-pcl.mkiv @@ -0,0 +1,812 @@ +%D \module +%D [ file=page-pcl, +%D version=2017.11.08, +%D title=\CONTEXT\ Page Macros, +%D subtitle=Page Columns, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\writestatus{loading}{ConTeXt Page Macros / Page Columns} + +%D This is very experimental code! We took a bit from the mixed columns and single +%D column page code. This one works acceptable with floats and is for whole double +%D column documents. We don't balance (yet). Footnotes are per column. One can have +%D side floats too. No balancing and other fancy features. +%D +%D Don't use this in production! Although the main approach will stay there might be +%D changes in the way floats are dealt with. Not much testing has been done but as +%D we stay close to the single column mode we expect most to just work. Only floats +%D are the (usual) pain. Backgrounds, line numbering, etc.\ not tested either. + +\unprotect + +\definemeasure[onecolumn] [\columnwidth] +\definemeasure[twocolumns] [\dimexpr\plustwo \columnwidth+ \columndistance\relax] +\definemeasure[threecolumns][\dimexpr\plusthree\columnwidth+\plustwo \columndistance\relax] +\definemeasure[fourcolumns] [\dimexpr\plusfour \columnwidth+\plusthree\columndistance\relax] + +\newcount\c_page_col_n_of_columns \c_page_col_n_of_columns\plusone +\newcount\c_page_col_current \c_page_col_current \plusone +\newdimen\d_page_col_distance +\newdimen\d_page_col_max_height +\newdimen\d_page_col_max_width +%newdimen\d_page_col_balance_step +\newdimen\d_page_col_column_width + +\newdimen\d_page_col_top_height +\newdimen\d_page_col_top_width + +\newdimen\d_page_col_available +\newdimen\d_page_col_sofar + +%D We need to step over empty columns. + +\unexpanded\def\page_col_command_next_page + {\page_col_eject_page} + +\unexpanded\def\page_col_column + {\page_otr_eject_page} + +\unexpanded\def\page_col_eject_page + {\begingroup + \scratchcountertwo \realpageno + \page_otr_eject_page + \scratchcounterone \c_page_col_current + \scratchcounterthree\zerocount + \doloop{% + \ifnum\scratchcounterthree>\plushundred + % too many attempts + \exitloop + \else\ifnum\realpageno>\scratchcountertwo + % we advanced at least one page so we're done + \exitloop + \else + \ifnum\scratchcounterone=\c_page_col_current + \dontleavehmode\null + \fi + \page_otr_eject_page + \scratchcounterone\c_page_col_current + \advance\scratchcounterthree\plusone + \fi\fi + }% + \endgroup} + +%D \unknown + +\unexpanded\def\page_col_command_next_page_and_inserts + {\page_otr_eject_page_and_flush_inserts} + +%D \unknown + +\unexpanded\def\page_col_command_set_hsize + {\global\hsize\d_page_col_column_width\relax + \global\d_page_col_available\dimexpr + \numexpr\c_page_col_n_of_columns-\c_page_col_current+\plusone\relax\d_page_col_column_width + + \numexpr\c_page_col_n_of_columns-\c_page_col_current \relax\d_page_col_distance + \relax + \global\d_page_col_sofar + \ifnum\c_page_col_n_of_columns=\plusone + \zeropoint + \else + \numexpr\c_page_col_n_of_columns-\plusone\relax + \dimexpr\d_page_col_column_width+\d_page_col_distance\relax + \fi} + +%D \unknown + +\unexpanded\def\page_col_command_set_vsize % \page_one_command_set_vsize minus the pagegoal setting + {\ifgridsnapping + \ifcase\layoutlines + \getrawnoflines\textheight + \else + \noflines\layoutlines + \fi + \global\vsize\noflines\openlineheight + \else + \global\vsize\textheight + \fi} + +%D \unknown + +\unexpanded\def\page_col_command_package_contents#1#2% \box<n> \unvbox<n> % this one will be redone (checked) + {\bgroup + \setbox\b_page_one_contents\vbox to \textheight + {\page_one_registered_text_area_a#1#2}% + \page_one_command_package_show_state + \ht\b_page_one_contents\textheight + \page_one_registered_text_area_b + {\box\b_page_one_contents}% + \egroup} + +\unexpanded\def\page_col_command_package_contents_one#1#2% \box<n> \unvbox<n> % this one will be redone (checked) + {\bgroup + \forgetall + % see one for comments as it is similar + \strc_notes_check_if_bottom_present + \d_page_one_natural_depth\dp#2\relax + \setbox\b_page_one_contents\vbox to \textheight + {\page_col_command_flush_top_insertions + \page_one_registered_text_area_a#1#2% + \hsize\d_page_col_column_width + \ifgridsnapping + \vskip\dimexpr\openstrutdepth-\d_page_one_natural_depth\relax + \prevdepth\openstrutdepth + \page_col_command_flush_bottom_insertions + \vfil + \else\ifcase\bottomraggednessmode + % ragged (default) + \vskip\dimexpr\openstrutdepth-\d_page_one_natural_depth\relax + \prevdepth\openstrutdepth + \page_col_command_flush_bottom_insertions + \vfil + \or + % align (normal) + \page_col_command_flush_bottom_insertions + \or + % baseline + \kern\dimexpr\maxdepth-\d_page_one_natural_depth\relax + \page_col_command_flush_bottom_insertions + \fi\fi + \fakepagenotes}% + \page_one_command_package_show_state + \ifconditional\c_notes_bottom_present + \ifgridsnapping + \ifcase\layoutlines + \getrawnoflines\textheight + \else + \noflines\layoutlines + \fi + \scratchoffset\dimexpr\numexpr\noflines-\plusone\relax\lineheight+\topskip\relax + \else + \scratchoffset\ht\b_page_one_contents + \fi + \setbox\b_page_one_bottom_notes\hpack + {\checksinglecolumnfootnotes % ? + \hsize\d_page_col_column_width + \setupnotes[\c!width=\textwidth]% + \lower\scratchoffset\vbox{\placebottomnotes\par\kern\zeropoint}}% + \ht\b_page_one_contents \zeropoint + \wd\b_page_one_contents \zeropoint + \ht\b_page_one_bottom_notes\zeropoint + \wd\b_page_one_bottom_notes\zeropoint + \wd\b_page_one_bottom_notes\d_page_col_column_width + \page_one_registered_text_area_b + {\vpack to \textheight + {\hbox{\box\b_page_one_contents\box\b_page_one_bottom_notes}}}% + \else + \ht\b_page_one_contents\textheight + \wd\b_page_one_contents\d_page_col_column_width + \page_one_registered_text_area_b + {\box\b_page_one_contents}% + \fi + \egroup} + +%D \unknown + +\unexpanded\def\page_col_command_side_float_output + {% % % + \ifvoid\namedinsertionnumber\s!topfloat\else + \scratchwidth\wd\namedinsertionnumber\s!topfloat + \ifdim\scratchwidth>\d_page_col_top_width + \global\d_page_col_top_width \scratchwidth + \fi + \global\d_page_col_top_height\ht\namedinsertionnumber\s!topfloat + \fi + % % % + \setbox\scratchbox\vbox\bgroup + \page_col_command_package_contents_one\unvbox\normalpagebox + \egroup + \putboxincache\s!pagecolumn{\number\c_page_col_current}\scratchbox + \ifnum\c_page_col_current=\c_page_col_n_of_columns + \page_col_routine_package + \page_otr_construct_and_shipout\box\normalpagebox\plusone + \global\c_page_col_current\plusone + \global\d_page_col_top_height\zeropoint + \global\d_page_col_top_width\zeropoint + % \page_col_command_flush_top_insertions + % \page_col_command_flush_floats + \else + \ifdim\d_page_col_top_width>\zeropoint + \ifdim\dimexpr\d_page_col_top_width>\d_page_col_sofar\relax + \begingroup + \floatingpenalty\zerocount + \insert\namedinsertionnumber\s!topfloat\bgroup + \vbox to \d_page_col_top_height{\vss} + % can be an option + \page_col_command_flush_top_insertions + \page_col_command_flush_floats + % so far till option + \egroup + \endgroup + \fi + \fi + \global\advance\c_page_col_current\plusone + \fi + % + \page_col_command_set_vsize + \page_col_command_set_hsize} + +% use \currentmixedcolumns instead of \recurselevel + +\def\page_col_routine_package_step + {% needs packaging anyway + \getboxfromcache{\s!pagecolumn}{\number\recurselevel}\scratchbox + \page_lines_add_numbers_to_box\scratchbox\recurselevel\c_page_col_n_of_columns\plusone % new + \page_marks_synchronize_column\plusone\c_page_col_n_of_columns\recurselevel\scratchbox + % backgrounds + \anch_mark_column_box\scratchbox + \mixedcolumnseparatorheight\ht\scratchbox + \mixedcolumnseparatordepth \dp\scratchbox + \inheritedpagecolumnsframedbox\recurselevel\scratchbox} + +\def\page_col_routine_package + {\global\setbox\normalpagebox\hbox to \makeupwidth\bgroup + \edef\p_separator{\pagecolumnsparameter\c!separator}% + \pagecolumnseparatorwidth\d_page_col_distance + \edef\p_direction{\pagecolumnsparameter\c!direction}% + \ifx\p_direction\v!reverse + \dostepwiserecurse\c_page_col_n_of_columns\plusone\minusone + {\page_col_routine_package_step + \ifnum\recurselevel>\plusone + \page_col_routine_package_separate + \fi}% + \else + \dorecurse\c_page_col_n_of_columns + {\page_col_routine_package_step + \ifnum\recurselevel<\c_page_col_n_of_columns + \page_col_routine_package_separate + \fi}% + \fi + \egroup + \resetboxesincache{\s!pagecolumn}} + +%D \unknown + +% \unexpanded\def\page_col_command_check_if_float_fits +% {\ifconditional\c_page_floats_not_permitted +% \global\setfalse\c_page_floats_room +% %\else\ifabsdim\dimexpr\d_page_col_available-\naturalfloatwd\relax<\onepoint +% \else\ifdim\dimexpr\d_page_col_available-\naturalfloatwd\relax>-\onepoint +% \global\settrue\c_page_floats_room +% \else +% \global\setfalse\c_page_floats_room +% \fi\fi +% \ifconditional\c_page_floats_room +% \begingroup +% \scratchdimen\dimexpr\pagetotal+\lineheight\relax +% \ifdim\scratchdimen>\pagegoal +% \goodbreak +% \ifdim\dimexpr\d_page_col_available-\naturalfloatwd\relax>\onepoint +% \global\setfalse\c_page_floats_room +% \else +% \global\settrue\c_page_floats_room +% \fi +% \fi +% \endgroup +% \fi +% \ifconditional\c_page_floats_room +% \ifdim\pagetotal>\zeropoint +% \scratchdimenone\dimexpr\pagetotal+\floatheight+\d_strc_floats_top-\pageshrink\relax +% \scratchdimentwo\pagegoal +% \relax % needed +% \ifcase\c_page_one_float_method +% % method 0 : raw +% \or +% % method 1 : safe +% \advance\scratchdimentwo -\strutdp +% \or +% % method 2 : tight +% \advance\scratchdimenone -\onepoint +% \fi +% \relax % really needed ! ! ! ! +% \ifdim\scratchdimenone>\scratchdimentwo +% \global\setfalse\c_page_floats_room +% \fi +% \fi +% \ifconditional\c_page_floats_room +% \global\setbox\floatbox\hpack to \d_page_col_available{\hss\box\floatbox\hss}% +% \fi +% \fi} + +\unexpanded\def\page_col_command_check_if_float_fits + {\ifconditional\c_page_floats_not_permitted + % forget about it anyway + \global\setfalse\c_page_floats_room + \else + % first we check the current column +% \ifdim\dimexpr\d_page_col_width-\naturalfloatwd\relax>-\onepoint + \ifdim\dimexpr\hsize-\naturalfloatwd\relax>-\onepoint + \global\settrue\c_page_floats_room + \else + \global\setfalse\c_page_floats_room + \fi + \ifconditional\c_page_floats_room + % we fit in the column but do we have room + \ifdim\dimexpr\pagetotal+\lineheight\relax>\pagegoal + % try again later + \goodbreak + \fi + \ifdim\pagetotal>\zeropoint + \scratchdimenone\dimexpr\pagetotal+\floatheight+\d_strc_floats_top-\pageshrink\relax + \scratchdimentwo\pagegoal + \relax % needed + \ifcase\c_page_one_float_method + % method 0 : raw + \or + % method 1 : safe + \advance\scratchdimentwo -\strutdp + \or + % method 2 : tight + \advance\scratchdimenone -\onepoint + \fi + \relax % really needed ! ! ! ! + \ifdim\scratchdimenone>\scratchdimentwo + % there is no room, give up + \global\setfalse\c_page_floats_room + % now we can decide on a top float +% \fi + \else +% \ifconditional\c_page_floats_room +% \global\setbox\floatbox\hpack to \d_page_col_float_available{\hss\box\floatbox\hss}% +% \fi + \fi + \fi + \fi + \fi} + +%D \unknown + +\def\page_col_set_float_pack_hsize + {\ifnum\c_page_col_current=\c_page_col_n_of_columns + \c_page_col_current\plusone + \else + \advance\c_page_col_current\plusone + \fi + \page_col_command_set_hsize + \hsize\d_page_col_available} + +\unexpanded\def\page_col_command_flush_floats + {\global\settrue\c_page_floats_flushing + \ifconditional\c_page_floats_some_waiting + \par + \page_col_set_float_pack_hsize + \page_col_command_flush_floats_indeed + \fi + \global\savednoffloats\zerocount + \global\setfalse\c_page_floats_some_waiting + \global\setfalse\c_page_floats_flushing} + +\def\page_floats_show_pack_state_indeed#1% + {\llap{\smash{\backgroundline[black]{\strut\smallinfofont\white#1\space\the\nofcollectedfloats\space of\space\the\savednoffloats:\the\hsize}}\hskip.25\emwidth}} + +\installtextracker + {floats.collecting} + {\let\page_floats_show_pack_state\page_floats_show_pack_state_indeed} + {\let\page_floats_show_pack_state\gobbleoneargument} + +\let\page_floats_show_pack_state\gobbleoneargument + +\def\page_col_command_flush_floats_indeed % much in common with OTRSET + {\ifconditional\c_page_floats_some_waiting + \ifconditional\c_page_floats_pack_flushed + \setfalse\c_page_floats_center_box % not needed as we do call directly + % + \page_floats_collect\s!text\hsize\emwidth + % + \ifnum\nofcollectedfloats=\plusone + \ifdim\naturalfloatwd>\hsize + \nofcollectedfloats\zerocount + \fi + \fi + \ifnum\nofcollectedfloats>\zerocount + \global\setbox\floatbox\hpack to \hsize + {\page_floats_show_pack_state F% + \hfil + \dorecurse\nofcollectedfloats + {\ifcase\columndirection % nog document wide + \page_floats_flush\s!text\plusone + \else + \page_floats_flush\s!text{\the\numexpr\nofcollectedfloats-\recurselevel+1\relax}% + \fi + % this could happen at the lua end instead + \scratchdimen\dimexpr\wd\floatbox-\naturalfloatwd\relax + \ifdim\scratchdimen<\zeropoint + \global\setbox\floatbox\hpack spread -\scratchdimen{\hss\box\floatbox\hss}% + \fi + % + \ifdim\wd\floatbox>\textwidth % \hsize + \hpack to \textwidth{\hss\box\floatbox\hss}% \textwidth + \else + \box\floatbox + \fi + \ifnum\recurselevel<\nofcollectedfloats + \hfil + \fi}% + \hfil}% + \doplacefloatbox + % \page_one_insert_top_float + \doubleexpandafter\page_col_command_flush_floats_indeed + \else + % todo + \fi + \else + \page_floats_get + % \page_one_insert_top_float + \doplacefloatbox + \doubleexpandafter\page_col_command_flush_floats_indeed + \fi + \fi} + +\unexpanded\def\page_col_command_flush_saved_floats % like one + {\global\d_page_floats_inserted_top\zeropoint + \global\d_page_floats_inserted_bottom\zeropoint + \ifconditional\c_page_floats_flushing \else + \page_col_command_set_top_insertions + \page_col_command_set_bottom_insertions + \ifconditional\c_page_floats_some_waiting + \doif{\rootfloatparameter\c!cache}\v!no\page_col_command_flush_floats % could be _otr_ + \else\ifconditional\c_page_margin_blocks_present + \page_col_command_flush_floats + \fi\fi + \fi} + +\unexpanded\def\page_col_command_set_top_insertions + {\bgroup + \ifconditional\c_page_floats_some_waiting + \noffloatinserts\zerocount + \let\totaltopinserted\!!zeropoint + \page_col_set_float_pack_hsize + \page_col_command_set_top_insertions_indeed + \ifnum\rootfloatparameter\c!nbottom=\zerocount + \ifnum\rootfloatparameter\c!nlines>\zerocount + \ifdim\totaltopinserted>\zeropoint\relax + \ifdim\dimexpr\rootfloatparameter\c!nlines\lineheight+\totaltopinserted\relax>\textheight + \showmessage\m!floatblocks8{\rootfloatparameter\c!nlines}% + \page_otr_fill_and_eject_page % was tripple: vfilll + \fi + \fi + \fi + \fi + \fi + \egroup} + +\def\d_page_col_collected_top_float_height % pseudo + {\dimexpr + \d_page_floats_inserted_top + + \maxcollectedfloatstotal + + \ifdim\d_strc_floats_top>\d_strc_floats_bottom + \d_strc_floats_top + \else + \d_strc_floats_bottom + \fi + \relax} + +\def\page_col_command_set_top_insertions_indeed + {\ifnum\noffloatinserts<\c_page_floats_n_of_top + \ifcase\savednoffloats + \let\page_col_command_set_top_insertions_indeed\relax + \else + \page_floats_collect\s!text\hsize\emwidth + \ifdim\d_page_col_collected_top_float_height<\textheight + \global\setbox\floatbox\hpack to \hsize + {\page_floats_show_pack_state T% + \hfil + \dorecurse\nofcollectedfloats + {\ifcase\columndirection % nog document wide + \page_floats_flush\s!text\plusone + \else + \page_floats_flush\s!text{\the\numexpr\nofcollectedfloats-\recurselevel+1\relax}% + \fi + % this could happen at the lua end instead + \scratchdimen\dimexpr\wd\floatbox-\naturalfloatwd\relax + \ifdim\scratchdimen<\zeropoint + \global\setbox\floatbox\hpack spread -\scratchdimen{\hss\box\floatbox\hss}% + \fi + % + \ifdim\wd\floatbox>\makeupwidth % \hsize + \hpack to \makeupwidth{\hss\box\floatbox\hss}% + \else + \box\floatbox + \fi + \ifnum\recurselevel<\nofcollectedfloats + \hfil + \fi}% + \hfil}% + \page_one_prepare_top_float + \xdef\totaltopinserted{\the\d_page_floats_inserted_top}% + \page_one_insert_top_float + \ifconditional\c_page_floats_some_waiting + \advance\noffloatinserts \plusone + \else + \noffloatinserts\c_page_floats_n_of_top\relax + \fi + \page_floats_report_flushed + \else + \let\page_col_command_set_top_insertions_indeed\relax + \fi + \fi + \else + \ifconditional\c_page_floats_some_waiting + \showmessage\m!floatblocks6{\the\c_page_floats_n_of_top}% + \fi + \let\page_col_command_set_top_insertions_indeed\relax + \fi + \page_col_command_set_top_insertions_indeed} + +\let\page_col_command_flush_top_insertions \page_one_command_flush_top_insertions +\let\page_col_command_flush_bottom_insertions\page_one_command_flush_bottom_insertions + +%let\page_col_command_set_top_insertions \page_one_command_set_top_insertions +\let\page_col_command_set_bottom_insertions \page_one_command_set_bottom_insertions + +%let\page_col_command_set_top_insertions_indeed \page_one_command_set_top_insertions +\let\page_col_command_set_bottom_insertions_indeed \page_one_command_set_botttom_insertions + +\let\page_col_command_flush_float_box \page_one_command_flush_float_box +\let\page_col_command_synchronize_side_floats \page_one_command_synchronize_side_floats +\let\page_col_command_flush_side_floats \page_one_command_flush_side_floats +\let\page_col_command_flush_margin_blocks \page_one_command_flush_margin_blocks +\let\page_col_command_test_page \page_one_command_test_page + +%D The separator code is more or less the same as mixed columns but we need +%D to compensate for the top floats so we comment a bit for now. + +\newdimen\pagecolumnseparatorheight +\newdimen\pagecolumnseparatordepth +\newdimen\pagecolumnseparatorwidth + +% \installcorenamespace{pagecolumnsseparator} +% +% \unexpanded\def\installpagecolumnseparator#1#2% +% {\setvalue{\??pagecolumnsseparator#1}{#2}} +% +% \installpagecolumnseparator\v!rule +% {\vrule +% \s!width \pagecolumnsparameter\c!rulethickness +% \s!height\pagecolumnseparatorheight +% \s!depth \pagecolumnseparatordepth +% \relax} +% +% \def\page_col_routine_package_separate +% {\ifcsname\??pagecolumnsseparator\p_separator\endcsname +% \page_col_command_inject_separator +% \else +% \hss +% \fi} +% +% \unexpanded\def\page_col_command_inject_separator +% {\begingroup +% \setbox\scratchbox\hbox to \zeropoint \bgroup +% \hss +% \starttextproperties +% \usepagecolumnscolorparameter\c!rulecolor +% \begincsname\??pagecolumnsseparator\p_separator\endcsname % was \c!rule +% \stoptextproperties +% \hss +% \egroup +% \ht\scratchbox\zeropoint +% \dp\scratchbox\zeropoint +% \hss +% \box\scratchbox +% \hss +% \endgroup} + +\def\page_col_routine_package_separate + {\hss} + +%D \unknown + +\unexpanded\def\page_col_command_routine + {\page_sides_output_routine} + +% % not: +% +% \unexpanded\def\page_col_command_routine +% {\ifconditional\c_page_sides_short +% \page_sides_output_routine_yes_column +% \else +% \page_sides_output_routine_nop_column +% \fi} +% +% \let\page_sides_output_routine_nop_column\page_sides_output_routine +% +% \def\page_sides_output_routine_yes_column % this might become the main one too +% {\unvbox\normalpagebox % bah, and the discards? +% %\page_col_column +% \column % \page +% % why was this \global\holdinginserts\zerocount +% \global\setfalse\c_page_sides_short} + +\let\page_col_command_flush_all_floats\relax + +%D \unknown + +\defineoutputroutine + [\s!pagecolumn] + [\s!page_otr_command_routine =\page_col_command_routine, + \s!page_otr_command_package_contents =\page_col_command_package_contents, + \s!page_otr_command_set_vsize =\page_col_command_set_vsize, + \s!page_otr_command_set_hsize =\page_col_command_set_hsize, + % \s!page_otr_command_synchronize_hsize =\page_col_command_synchronize_hsize, % not done + \s!page_otr_command_next_page =\page_col_command_next_page, + \s!page_otr_command_next_page_and_inserts =\page_col_command_next_page_and_inserts, + \s!page_otr_command_set_top_insertions =\page_col_command_set_top_insertions, + \s!page_otr_command_set_bottom_insertions =\page_col_command_set_bottom_insertions, + \s!page_otr_command_flush_top_insertions =\page_col_command_flush_top_insertions, + \s!page_otr_command_flush_bottom_insertions=\page_col_command_flush_bottom_insertions, + \s!page_otr_command_check_if_float_fits =\page_col_command_check_if_float_fits, + % \s!page_otr_command_set_float_hsize =\page_col_command_set_float_hsize, % not done + \s!page_otr_command_flush_float_box =\page_col_command_flush_float_box, + \s!page_otr_command_side_float_output =\page_col_command_side_float_output, + \s!page_otr_command_synchronize_side_floats=\page_col_command_synchronize_side_floats, + \s!page_otr_command_flush_floats =\page_col_command_flush_floats, + \s!page_otr_command_flush_side_floats =\page_col_command_flush_side_floats, + \s!page_otr_command_flush_saved_floats =\page_col_command_flush_saved_floats, + \s!page_otr_command_flush_all_floats =\page_col_command_flush_all_floats, + \s!page_otr_command_flush_margin_blocks =\page_col_command_flush_margin_blocks, + \s!page_otr_command_test_column =\page_col_command_test_page + ] + +%D \unknown + +\installfloatmethod \s!pagecolumn \v!here \page_one_place_float_here +\installfloatmethod \s!pagecolumn \v!force \page_one_place_float_force +\installfloatmethod \s!pagecolumn \v!left \page_one_place_float_left +\installfloatmethod \s!pagecolumn \v!right \page_one_place_float_right +\installfloatmethod \s!pagecolumn \v!text \page_one_place_float_text +\installfloatmethod \s!pagecolumn \v!top \page_one_place_float_top +\installfloatmethod \s!pagecolumn \v!bottom \page_one_place_float_bottom +\installfloatmethod \s!pagecolumn \v!auto \page_one_place_float_auto +\installfloatmethod \s!pagecolumn \v!margin \page_one_place_float_margin +\installfloatmethod \s!pagecolumn \v!opposite \page_one_place_float_face +\installfloatmethod \s!pagecolumn \v!page \page_one_place_float_page +\installfloatmethod \s!pagecolumn \v!leftpage \page_one_place_float_leftpage +\installfloatmethod \s!pagecolumn \v!rightpage \page_one_place_float_rightpage +\installfloatmethod \s!pagecolumn \v!inmargin \page_one_place_float_inmargin +\installfloatmethod \s!pagecolumn \v!inleft \page_one_place_float_leftmargin +\installfloatmethod \s!pagecolumn \v!inright \page_one_place_float_rightmargin +\installfloatmethod \s!pagecolumn \v!leftmargin \page_one_place_float_leftmargin +\installfloatmethod \s!pagecolumn \v!rightmargin \page_one_place_float_rightmargin +\installfloatmethod \s!pagecolumn \v!leftedge \page_one_place_float_leftedge +\installfloatmethod \s!pagecolumn \v!rightedge \page_one_place_float_rightedge +\installfloatmethod \s!pagecolumn \v!somewhere \page_one_place_float_somewhere +\installfloatmethod \s!pagecolumn \v!backspace \page_one_place_float_backspace +\installfloatmethod \s!pagecolumn \v!cutspace \page_one_place_float_cutspace +%installfloatmethod \s!pagecolumn \s!tblr \page_one_place_float_top +%installfloatmethod \s!pagecolumn \s!lrtb \page_one_place_float_top +%installfloatmethod \s!pagecolumn \s!tbrl \page_one_place_float_top +%installfloatmethod \s!pagecolumn \s!fxtb \page_one_place_float_top +%installfloatmethod \s!pagecolumn \s!rltb \page_one_place_float_top +%installfloatmethod \s!pagecolumn \s!btlr \page_one_place_float_bottom +%installfloatmethod \s!pagecolumn \s!lrbt \page_one_place_float_bottom +%installfloatmethod \s!pagecolumn \s!btrl \page_one_place_float_bottom +%installfloatmethod \s!pagecolumn \s!rlbt \page_one_place_float_bottom +%installfloatmethod \s!pagecolumn \s!fxbt \page_one_place_float_bottom +%installfloatmethod \s!pagecolumn \s!fixd \page_one_place_float_force + +\installfloatmethod \s!pagecolumn \v!local \somelocalfloat + +%D The main interface: + +\installcorenamespace{pagecolumns} + +\installframedcommandhandler \??pagecolumns {pagecolumns} \??pagecolumns + +\setuppagecolumns + [\c!distance=1.5\bodyfontsize, + \c!n=\plustwo, + %\c!align=, % inherit (also replaces tolerance) + %\c!before=, + %\c!after=, + %\c!separator=\v!none, + %\c!setups=, + %\c!balance=\v!no, + %\c!blank={\v!line,\v!fixed}, yes or no + \c!frame=\v!off, + \c!strut=\v!no, + \c!offset=\v!overlay, + %\c!maxheight=\textheight, + \c!maxwidth=\makeupwidth, + %\c!grid=\v!tolerant, + %\c!internalgrid=\v!line, + \c!direction=\v!normal] + +\let\startpagecolumns\relax % defined later +\let\stoppagecolumns \relax % defined later + +\appendtoks % could become an option + \setuevalue{\e!start\currentpagecolumns}{\startpagecolumns[\currentpagecolumns]}% + \setuevalue{\e!stop \currentpagecolumns}{\stoppagecolumns}% +\to \everydefinepagecolumns + +\ifdefined \columnwidth \else \newdimen\columnwidth \fi +\ifdefined \columndistance \else \newdimen\columndistance \fi + +\unexpanded\def\startpagecolumns + {\page + \begingroup + \begingroup + \dosingleempty\page_col_start} + +\unexpanded\def\page_col_start[#1]% + {\doifelseassignment{#1}% + {\let\currentpagecolumns\empty + \setuppagecolumns[#1]}% + {\edef\currentpagecolumns{#1}}% + \c_page_col_n_of_columns\pagecolumnsparameter\c!n\relax + \ifnum\c_page_col_n_of_columns>\plusone + \expandafter\page_col_start_yes + \else + \expandafter\page_col_start_nop + \fi} % public + +\unexpanded\def\page_col_start_yes + {\d_page_col_distance \pagecolumnsparameter\c!distance\relax + % \d_page_col_max_height \pagecolumnsparameter\c!maxheight + \d_page_col_max_width \pagecolumnsparameter\c!maxwidth + % \d_page_col_balance_step \pagecolumnsparameter\c!step + \c_page_col_current \plusone + % + \d_page_col_column_width\dimexpr(\d_page_col_max_width-\d_page_col_distance*\numexpr(\c_page_col_n_of_columns-\plusone)\relax)/\c_page_col_n_of_columns\relax + % + \columnwidth \d_page_col_column_width + \columndistance \d_page_col_distance + % + \nopenalties + % + % \insidecolumnstrue % NO! + % + \let\column\page_col_column + % + \def\page_floats_get_used_hsize{\makeupwidth} % a bit of a hack + % + \usealignparameter \pagecolumnsparameter + \useblankparameter \pagecolumnsparameter + % \useprofileparameter\pagecolumnsparameter + % + \usemixedcolumnscolorparameter\c!color + % + \setupnotes[\c!width=\textwidth]% + % + \usesetupsparameter\pagecolumnsparameter + % + \setupoutputroutine[\s!pagecolumn]% + % + \setupfloats[\c!ntop=\plusthousand]% + % \setupfloats[\c!nbottom=\plusthousand]% + % + \page_col_command_set_vsize + \page_col_command_set_hsize + % + \nofcolumns\c_page_mix_n_of_columns + % + \unexpanded\def\page_col_start[##1]% + {\page_col_start_nop}% + % + \let\stoppagecolumns\page_col_stop_yes} + +\unexpanded\def\page_col_start_nop + {\nofcolumns\c_page_mix_n_of_columns + \let\stoppagecolumns\page_col_stop_nop} + +\unexpanded\def\page_col_stop_yes + {\column % \page_otr_eject_page + \page + \endgroup + % \setupoutputroutine[\s!singlecolumn]% + \page_otr_command_set_vsize + \page_otr_command_set_hsize + \page + \endgroup} + +\unexpanded\def\page_col_stop_nop + {\page + \endgroup + \endgroup} + +\protect \endinput diff --git a/tex/context/base/mkiv/page-pst.mkiv b/tex/context/base/mkiv/page-pst.mkiv index f12663f66..746356495 100644 --- a/tex/context/base/mkiv/page-pst.mkiv +++ b/tex/context/base/mkiv/page-pst.mkiv @@ -13,7 +13,7 @@ \writestatus{loading}{ConTeXt Page Macros / Postponing} -\registerctxluafile{page-pst}{1.001} +\registerctxluafile{page-pst}{} \unprotect @@ -69,10 +69,15 @@ % officially we should flush again after a flush as there can be new future pages % but that will be looked into when we run into it +\c_page_postponed_mode\plusone + \unexpanded\def\page_postponed_blocks_flush_indeed {\begingroup \setsystemmode\v!postponing \settrue\c_page_postponed_busy + \ifnum\c_page_postponed_mode=\plusone + \savepagecontent + \fi \pagetotal\zeropoint % here? still needed? (was after flush pagefloats) \the\everytopofpage\relax %\flushrestfloats @@ -84,6 +89,9 @@ % page {123} \relax \page_otr_command_flush_floats % new but potential dangerous, maybe we need a classification + \ifnum\c_page_postponed_mode=\plusone + \flushpagecontent + \fi \endgroup} % of blocks: with and without flush \unexpanded\def\page_postponed_blocks_flush diff --git a/tex/context/base/mkiv/page-run.lua b/tex/context/base/mkiv/page-run.lua new file mode 100644 index 000000000..c0a2022b2 --- /dev/null +++ b/tex/context/base/mkiv/page-run.lua @@ -0,0 +1,188 @@ +if not modules then modules = { } end modules ['page-run'] = { + version = 1.001, + comment = "companion to page-run.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +local format, concat = string.format, table.concat +local todimen = number.todimen +local texdimen = tex.dimen + +local function asdimen(name,unit) + return todimen(texdimen[name],unit,"%0.4f") -- 4 is more than enough, even 3 would be okay +end + +local function checkedoptions(options) + if type(options) == "table" then + return options + elseif not options or options == "" then + options = "pt,cm" + end + options = utilities.parsers.settings_to_hash(options) + local n = 4 + for k, v in table.sortedhash(options) do + local m = tonumber(k) + if m then + n = m + end + end + options.n = n + return options +end + +function commands.showlayoutvariables(options) + + options = checkedoptions(options) + + local dimensions = { "pt", "bp", "cm", "mm", "dd", "cc", "pc", "nd", "nc", "sp", "in" } + + local n = 0 + for i=1,#dimensions do + if options[dimensions[i]] then + n = n + 1 + end + end + + if n == 0 then + options.pt = true + n = 1 + end + + local function showdimension(name) + context.NC() + context.tex(interfaces.interfacedcommand(name)) + context.NC() + for i=1,#dimensions do + local d = dimensions[i] + if options[d] then + context("%s%s",asdimen(name,d),d) + context.NC() + end + end + context.NR() + end + + local function showmacro(name) + context.NC() + context.tex(interfaces.interfacedcommand(name)) + context.NC() + context.getvalue(name) + context.NC() + context.NR() + end + + local function reportdimension(name) + local result = { } + for i=1,#dimensions do + local d = dimensions[i] + if options[d] then + result[#result+1] = format("%12s%s",asdimen(name,d),d) + end + end + commands.writestatus("layout",format("%-24s %s",interfaces.interfacedcommand(name),concat(result," "))) + end + + if tex.count.textlevel == 0 then + + -- especially for Luigi: + + reportdimension("paperheight") + reportdimension("paperwidth") + reportdimension("printpaperheight") + reportdimension("printpaperwidth") + reportdimension("topspace") + reportdimension("backspace") + reportdimension("makeupheight") + reportdimension("makeupwidth") + reportdimension("topheight") + reportdimension("topdistance") + reportdimension("headerheight") + reportdimension("headerdistance") + reportdimension("textheight") + reportdimension("footerdistance") + reportdimension("footerheight") + reportdimension("bottomdistance") + reportdimension("bottomheight") + reportdimension("leftedgewidth") + reportdimension("leftedgedistance") + reportdimension("leftmarginwidth") + reportdimension("leftmargindistance") + reportdimension("textwidth") + reportdimension("rightmargindistance") + reportdimension("rightmarginwidth") + reportdimension("rightedgedistance") + reportdimension("rightedgewidth") + reportdimension("bodyfontsize") + reportdimension("lineheight") + + else + + context.starttabulate { "|l|" .. string.rep("Tr|",n) } + + showdimension("paperheight") + showdimension("paperwidth") + showdimension("printpaperheight") + showdimension("printpaperwidth") + showdimension("topspace") + showdimension("backspace") + showdimension("makeupheight") + showdimension("makeupwidth") + showdimension("topheight") + showdimension("topdistance") + showdimension("headerheight") + showdimension("headerdistance") + showdimension("textheight") + showdimension("footerdistance") + showdimension("footerheight") + showdimension("bottomdistance") + showdimension("bottomheight") + showdimension("leftedgewidth") + showdimension("leftedgedistance") + showdimension("leftmarginwidth") + showdimension("leftmargindistance") + showdimension("textwidth") + showdimension("rightmargindistance") + showdimension("rightmarginwidth") + showdimension("rightedgedistance") + showdimension("rightedgewidth") + context.NR() + showdimension("bodyfontsize") + showdimension("lineheight") + context.NR() + showmacro("strutheightfactor") + showmacro("strutdepthfactor") + showmacro("topskipfactor") + showmacro("maxdepthfactor") + + context.stoptabulate() + + end + +end + +function commands.showlayout(options) + + options = checkedoptions(options) + + if tex.count.textlevel == 0 then + + commands.showlayoutvariables(options) + + else + + context.page() + context.bgroup() + context.showframe() + context.setuplayout { marking = interfaces.variables.on } + for i=1,(options.n or 4) do + commands.showlayoutvariables(options) + context.page() + end + context.egroup() + + end + +end + diff --git a/tex/context/base/mkiv/page-run.mkiv b/tex/context/base/mkiv/page-run.mkiv index 9adcb23c7..19adfaa9c 100644 --- a/tex/context/base/mkiv/page-run.mkiv +++ b/tex/context/base/mkiv/page-run.mkiv @@ -13,10 +13,11 @@ \writestatus{loading}{ConTeXt Page Macros / Runtime Macros} +\registerctxluafile{page-run}{} + \unprotect -\gdef\showprint - {\dotripleempty\page_layouts_show_print} +\unexpanded\gdef\showprint{\dotripleempty\page_layouts_show_print} \gdef\page_layouts_show_print[#1][#2][#3]% only english {\setbuffer[crap]% @@ -70,189 +71,9 @@ % {\showprint[mirrored] [mirrored] [location=middle]} {\type{mirrored}\break\type{mirrored}} % \stopcombination -% maybe we will have page-run.lua - -\startluacode -local format, concat = string.format, table.concat -local todimen = number.todimen -local texdimen = tex.dimen - -local function asdimen(name,unit) - return todimen(texdimen[name],unit,"%0.4f") -- 4 is more than enough, even 3 would be okay -end - -local function checkedoptions(options) - if type(options) == "table" then - return options - elseif not options or options == "" then - options = "pt,cm" - end - options = utilities.parsers.settings_to_hash(options) - local n = 4 - for k, v in table.sortedhash(options) do - local m = tonumber(k) - if m then - n = m - end - end - options.n = n - return options -end - -function commands.showlayoutvariables(options) - - options = checkedoptions(options) - - local dimensions = { "pt", "bp", "cm", "mm", "dd", "cc", "pc", "nd", "nc", "sp", "in" } - - local n = 0 - for i=1,#dimensions do - if options[dimensions[i]] then - n = n + 1 - end - end - - if n == 0 then - options.pt = true - n = 1 - end - - local function showdimension(name) - context.NC() - context.tex(interfaces.interfacedcommand(name)) - context.NC() - for i=1,#dimensions do - local d = dimensions[i] - if options[d] then - context("%s%s",asdimen(name,d),d) - context.NC() - end - end - context.NR() - end - - local function showmacro(name) - context.NC() - context.tex(interfaces.interfacedcommand(name)) - context.NC() - context.getvalue(name) - context.NC() - context.NR() - end - - local function reportdimension(name) - local result = { } - for i=1,#dimensions do - local d = dimensions[i] - if options[d] then - result[#result+1] = format("%12s%s",asdimen(name,d),d) - end - end - commands.writestatus("layout",format("%-24s %s",interfaces.interfacedcommand(name),concat(result," "))) - end - - if tex.count.textlevel == 0 then - - -- especially for Luigi: - - reportdimension("paperheight") - reportdimension("paperwidth") - reportdimension("printpaperheight") - reportdimension("printpaperwidth") - reportdimension("topspace") - reportdimension("backspace") - reportdimension("makeupheight") - reportdimension("makeupwidth") - reportdimension("topheight") - reportdimension("topdistance") - reportdimension("headerheight") - reportdimension("headerdistance") - reportdimension("textheight") - reportdimension("footerdistance") - reportdimension("footerheight") - reportdimension("bottomdistance") - reportdimension("bottomheight") - reportdimension("leftedgewidth") - reportdimension("leftedgedistance") - reportdimension("leftmarginwidth") - reportdimension("leftmargindistance") - reportdimension("textwidth") - reportdimension("rightmargindistance") - reportdimension("rightmarginwidth") - reportdimension("rightedgedistance") - reportdimension("rightedgewidth") - reportdimension("bodyfontsize") - reportdimension("lineheight") - - else - - context.starttabulate { "|l|" .. string.rep("Tr|",n) } - - showdimension("paperheight") - showdimension("paperwidth") - showdimension("printpaperheight") - showdimension("printpaperwidth") - showdimension("topspace") - showdimension("backspace") - showdimension("makeupheight") - showdimension("makeupwidth") - showdimension("topheight") - showdimension("topdistance") - showdimension("headerheight") - showdimension("headerdistance") - showdimension("textheight") - showdimension("footerdistance") - showdimension("footerheight") - showdimension("bottomdistance") - showdimension("bottomheight") - showdimension("leftedgewidth") - showdimension("leftedgedistance") - showdimension("leftmarginwidth") - showdimension("leftmargindistance") - showdimension("textwidth") - showdimension("rightmargindistance") - showdimension("rightmarginwidth") - showdimension("rightedgedistance") - showdimension("rightedgewidth") - context.NR() - showdimension("bodyfontsize") - showdimension("lineheight") - context.NR() - showmacro("strutheightfactor") - showmacro("strutdepthfactor") - showmacro("topskipfactor") - showmacro("maxdepthfactor") - - context.stoptabulate() - - end - -end - -function commands.showlayout(options) - - options = checkedoptions(options) - - if tex.count.textlevel == 0 then - - commands.showlayoutvariables(options) - - else - - context.page() - context.bgroup() - context.showframe() - context.setuplayout { marking = interfaces.variables.on } - for i=1,(options.n or 4) do - commands.showlayoutvariables(options) - context.page() - end - context.egroup() - - end - -end -\stopluacode +\unexpanded\gdef\showframe {\dodoubleempty\page_layouts_show_frame} +\unexpanded\gdef\showsetups{\dosingleempty\page_layouts_show_setups} +\unexpanded\gdef\showlayout{\dosingleempty\page_layouts_show_layout} \gdef\page_layouts_show_frame[#1][#2]% {\ifsecondargument @@ -293,10 +114,6 @@ end \gdef\page_layouts_show_layout[#1]% {\ctxcommand{showlayout("#1")}} -\unexpanded\gdef\showframe {\dodoubleempty\page_layouts_show_frame } -\unexpanded\gdef\showsetups{\dosingleempty\page_layouts_show_setups} -\unexpanded\gdef\showlayout{\dosingleempty\page_layouts_show_layout} - \unexpanded\gdef\showmargins {\starttabulate \NC asynchrone \NC \doifelseoddpage {odd} {even} \NC \NR @@ -307,4 +124,94 @@ end \NC inner margin \NC \the\innermarginwidth \NC \NR \stoptabulate} +%D Page grids: + +\newconstant\c_page_grids_location +\newconstant\c_page_grids_line_mode +\newconstant\c_page_grids_lineno_mode +\newconstant\c_page_grids_columns_mode + +\unexpanded\gdef\showgrid + {\dosingleempty\page_grids_show} + +\gdef\page_grids_show[#1]% + {\c_page_grids_location \plusone % downward compatible default + \c_page_grids_line_mode \plusone + \c_page_grids_lineno_mode \plusone + \c_page_grids_columns_mode\plusone + \processallactionsinset + [#1]% + [ \v!reset=>\c_page_grids_location \zerocount + \c_page_grids_columns_mode\zerocount, + \v!bottom=>\c_page_grids_location \plusone, + \v!top=>\c_page_grids_location \plustwo, + \v!none=>\c_page_grids_line_mode \zerocount, + \v!all=>\c_page_grids_line_mode \plusone, + \v!lines=>\c_page_grids_line_mode \plustwo, + \v!frame=>\c_page_grids_line_mode \plusthree, + \v!nonumber=>\c_page_grids_lineno_mode \zerocount, + \v!right=>\c_page_grids_lineno_mode \plusone, + \v!left=>\c_page_grids_lineno_mode \plustwo, + \v!outer=>\c_page_grids_lineno_mode \plusthree, + \v!columns=>\c_page_grids_columns_mode\plusone]% new option + \ifcase\c_page_grids_location + \let\page_grids_add_to_box\gobbleoneargument + \else % 1=bottom 2=top + \let\page_grids_add_to_box\page_grids_add_to_box_indeed + \fi + \ifcase\c_page_grids_columns_mode + \let\page_grids_add_to_one\gobbleoneargument + \let\page_grids_add_to_mix\gobbleoneargument + \else + \let\page_grids_add_to_one\page_grids_add_to_one_indeed + \let\page_grids_add_to_mix\page_grids_add_to_mix_indeed + \fi} + +% if really needed for speed we can cache the grid + +\glet\page_grids_add_to_box\gobbleoneargument +\glet\page_grids_add_to_one\gobbleoneargument +\glet\page_grids_add_to_mix\gobbleoneargument + +\gdef\page_grids_add_to_box_indeed#1% to be checked for color and layer ..... use mp + {\startcolor[layout:grid]% + \resetvisualizers + \gridboxlinemode \c_page_grids_line_mode + \gridboxlinenomode\c_page_grids_lineno_mode + \setgridbox\scratchbox\makeupwidth\textheight % todo: check color + \global\setbox#1\hbox % global ? + {\ifcase\c_page_grids_location\or\or\box#1\hskip-\makeupwidth\fi + \begingroup % color + \ifcase\layoutcolumns\else + \gray + \setlayoutcomponentattribute{\v!grid:\v!columns}% + \hbox \layoutcomponentboxattribute to \makeupwidth + {\dorecurse\layoutcolumns + {\hskip\layoutcolumnwidth + \ifnum\recurselevel<\layoutcolumns + \vrule + \s!height\ht\scratchbox + \s!depth \dp\scratchbox + \s!width \layoutcolumndistance + \fi}}% + \hskip-\makeupwidth + \fi + \setlayoutcomponentattribute{\v!grid:\v!lines}% + \hbox \layoutcomponentboxattribute{\box\scratchbox}% + \endgroup + \ifcase\c_page_grids_location\or\hskip-\makeupwidth\box#1\fi}% + \stopcolor} + +\gdef\page_grids_add_to_one_indeed#1% + {\begingroup + \resetvisualizers + \global\setbox#1\vpack{\backgroundline[layout:one]{\box#1}}% + \endgroup} + +\gdef\page_grids_add_to_mix_indeed#1% + {\begingroup + \resetvisualizers + \global\setbox#1\vpack{\backgroundline[layout:mix]{\box#1}}% + \endgroup} + \protect \endinput diff --git a/tex/context/base/mkiv/page-set.mkiv b/tex/context/base/mkiv/page-set.mkiv index 2cea31e1c..fb6f607a1 100644 --- a/tex/context/base/mkiv/page-set.mkiv +++ b/tex/context/base/mkiv/page-set.mkiv @@ -14,6 +14,8 @@ % not yet mkiv! probably namespace issues with localframed (only one left) % % getnoflines vs getrawnoflines +% +% can have some vpack and hpack % This is a rather old mechanism and we can best keep it as it is. If it gets % replaced by a more modern solution, it will be an extra mechanism. So, we @@ -410,7 +412,7 @@ \letcolumnsetparameter\c!height\!!heighta \letcolumnsetparameter\c!lines \empty \letcolumnsetparameter\c!region\currentcolumnset - \setbox\scratchbox\hbox\inheritedcolumnsetframed{}% maybe \fastlocalframed + \setbox\scratchbox\hpack\inheritedcolumnsetframed{}% maybe \fastlocalframed \wd\scratchbox\d_page_set_local_hsize \ht\scratchbox\!!heighta \ifcase\columndirection @@ -558,14 +560,14 @@ {\ifdim\ht\OTRfinalpagebox=\textheight \bgroup \ifcase\OTRSETbalancemethod - \page_otr_construct_and_shipout\box\OTRfinalpagebox + \page_otr_construct_and_shipout\box\OTRfinalpagebox\zerocount % three arguments \else\ifdim\OTRSETbalht>\zeropoint % catch a bordercase \scratchdimen\OTRSETbalht \advance\scratchdimen\lineheight\relax \ifdim\scratchdimen>\textheight % full page - \page_otr_construct_and_shipout\box\OTRfinalpagebox + \page_otr_construct_and_shipout\box\OTRfinalpagebox\zerocount % three arguments \else % same page \global\setbox\OTRfinalpagebox \iftracecolumnset\ruledvbox\else\vbox\fi to \OTRSETbalht @@ -574,7 +576,7 @@ \snaptogrid\vbox{\vskip\OTRSETbalht}% hack \fi \else - \page_otr_construct_and_shipout\box\OTRfinalpagebox + \page_otr_construct_and_shipout\box\OTRfinalpagebox\zerocount % three arguments \fi \fi \globallet\OTRSETbalht\zeropoint \egroup @@ -612,7 +614,7 @@ \ifinotr % else problems with floats, see extreme \pagegoal\vsize % niet nodig, tenzij binnen otr \fi - \synchronizeoutput % fails on example + \synchronizeoutput % fails on example, try \triggerpagebuilder instead % \allowbreak % hm \fi \synchronizenotes @@ -659,7 +661,7 @@ \installcolumnbreakmethod \s!columnset \v!local {\OTRSETcolumnhbreak - \page_otr_flush_all_floats + \page_set_command_flush_all_floats \page_otr_eject_page % no \page_set_command_set_hsize, can be mid smaller (like tabulate) % also, this one should be executed at the outer level @@ -2596,27 +2598,31 @@ \fi \fi} +\unexpanded\def\page_set_command_flush_all_floats + {\page_one_command_flush_all_floats} + \defineoutputroutine [\s!columnset] [\s!page_otr_command_routine =\page_set_command_routine, \s!page_otr_command_package_contents =\page_set_command_package_contents, \s!page_otr_command_set_vsize =\page_set_command_set_vsize, % \s!page_otr_command_set_hsize =\page_one_command_set_hsize, % tricky, goes wrong + \s!page_otr_command_synchronize_hsize =\page_set_command_synchronize_hsize, \s!page_otr_command_next_page =\page_set_command_next_page, \s!page_otr_command_next_page_and_inserts =\page_set_command_next_page_and_inserts, - \s!page_otr_command_synchronize_hsize =\page_set_command_synchronize_hsize, \s!page_otr_command_set_top_insertions =\page_set_command_set_top_insertions, \s!page_otr_command_set_bottom_insertions =\page_set_command_set_bottom_insertions, \s!page_otr_command_flush_top_insertions =\page_set_command_flush_top_insertions, \s!page_otr_command_flush_bottom_insertions =\page_set_command_flush_bottom_insertions, - \s!page_otr_command_set_float_hsize =\page_set_command_set_float_hsize, \s!page_otr_command_check_if_float_fits =\page_set_command_check_if_float_fits, + \s!page_otr_command_set_float_hsize =\page_set_command_set_float_hsize, \s!page_otr_command_flush_float_box =\page_set_command_flush_float_box, - \s!page_otr_command_synchronize_side_floats =\page_set_command_synchronize_side_floats, \s!page_otr_command_side_float_output =\page_set_command_side_float_output, + \s!page_otr_command_synchronize_side_floats =\page_set_command_synchronize_side_floats, \s!page_otr_command_flush_floats =\page_set_command_flush_floats, \s!page_otr_command_flush_side_floats =\page_set_command_flush_side_floats, - \s!page_otr_command_flush_saved_floats =\page_set_command_flush_saved_floats + \s!page_otr_command_flush_saved_floats =\page_set_command_flush_saved_floats, + \s!page_otr_command_flush_all_floats =\page_set_command_flush_all_floats, % \s!page_otr_command_flush_margin_blocks =\page_set_command_flush_margin_blocks, % not used ] diff --git a/tex/context/base/mkiv/page-sid.mkiv b/tex/context/base/mkiv/page-sid.mkiv index f32a443be..5742ce8c4 100644 --- a/tex/context/base/mkiv/page-sid.mkiv +++ b/tex/context/base/mkiv/page-sid.mkiv @@ -15,31 +15,32 @@ \unprotect -% These macro deal with side floats. We started with Daniel Comenetz macros as published -% in TUGBoat Volume 14 (1993), No.\ 1: Anchored Figures at Either Margin. I extended and -% patched the macros to suite our needs which results in a messy module. Therefore, this -% module badly needs an update because it's now a mixture of old and new macros. - -% Interesting cases where it goes wrong: -% -% \placefigure[left]{}{} \dorecurse{3}{\input ward } {\par} \input ward -% -% Here we get an unwanted carried over hangindent and parindent. A solution is to associate -% it with the local par node instead. This is something to discuss with Taco as it could be -% a new luatex/mkiv feature: explicitly set par properties. - -% Maybe I should just rewrite the lot. +%D These macro deal with side floats. We started with Daniel Comenetz macros as +%D published in TUGBoat Volume 14 (1993), No.\ 1: Anchored Figures at Either Margin. +%D I extended and patched the macros to suite our needs which results in a messy +%D module. +%D +%D A complication is that we need to deal with spacing differently before and after +%D the float. Also, whitespace can interfere as does the prevdepth. There is no real +%D universal solution. So, by now not much is left of that code, if only because we +%D need to match \CONTEXT\ spacing module, because we have more placement options +%D and control and because the math hackery is not suitable for \CONTEXT\ anyway. +%D +%D This code had been redone many times because we kept running into spacing issues +%D and it's not that much fun (or rewarding). It's probably the module that made +%D me go into distraciton mode most often (like watching amusing Walk of The +%D Earth, sophisticated Massive Attack video clips, impressive Davie504 movies +%D and so on). \newdimen \d_page_sides_height % includes the topskip \newdimen \d_page_sides_width \newdimen \d_page_sides_hsize \newdimen \d_page_sides_vsize -\newdimen \d_page_sides_vsize_reset \d_page_sides_vsize_reset -\onepoint % could be a \let +\newdimen \d_page_sides_vsize_reset \newdimen \d_page_sides_progress \newdimen \d_page_sides_page_total -\newdimen \d_page_sides_saved_depth -\newbox \b_page_sides_bottom +%newbox \b_page_sides_bottom \newcount \c_page_sides_lines_done \newcount \c_page_sides_checks_done @@ -47,12 +48,9 @@ \newcount \c_page_sides_n_of_hang \newconstant \c_page_sides_float_type -\newconditional \c_page_sides_short % needs checking .. best write this from scratch +\newconditional \c_page_sides_short \newconditional \c_page_sides_flag -\newconditional \c_page_sides_r_eq % messy, needs checking anyway -\newconditional \c_page_sides_l_eq % messy, needs checking anyway - \newdimen \d_page_sides_shift \newdimen \d_page_sides_extrashift \newdimen \d_page_sides_leftshift @@ -62,10 +60,43 @@ \newdimen \d_page_sides_maximum \newdimen \d_page_sides_topskip \newdimen \d_page_sides_bottomskip +\newdimen \d_page_sides_midskip \newdimen \d_page_sides_downshift +\newdimen \d_page_sides_pagetotal +\newdimen \d_page_sides_topoffset +\newdimen \d_page_sides_bottomoffset +\newdimen \d_page_sides_toptotal +\newdimen \d_page_sides_bottomtotal + +\newconstant \c_page_sides_align +\newconstant \c_page_sides_skipmode +\newconstant \c_page_sides_tolerance + +\newconstant \c_page_sides_method % sort of obsolete + +\newdimen \d_page_sides_progression -\setnewconstant \c_page_sides_method \plusone % 0=raw 1=safe (.99) 2=tight (-1pt) -\setnewconstant \c_page_sides_align \zerocount +\newif \iftracesidefloats % public (might change) + +%D Defaults: + +\d_page_sides_vsize_reset -\onepoint +%d_page_sides_vsize_reset \zeropoint % could be an option, needs testing + +%D We have some basic (and colorful) tracing: + +\def\page_sides_floats_legend + {\showmessage\m!floatblocks{16}\empty + \glet\page_sides_floats_legend\relax} + +\installtextracker{floats.anchoring} + {\page_sides_floats_legend + \tracesidefloatstrue} + {\tracesidefloatsfalse} + +%D The horizontal shifts depend on the location: left or right in the text, margin +%D or edge. These shifts are rather stable and don't interfere with the page flow +%D as much as the vertical ones do. \def\page_sides_process_float_backspace {\global\c_page_sides_float_type\plusone \page_sides_handle_float} \def\page_sides_process_float_leftedge {\global\c_page_sides_float_type\plustwo \page_sides_handle_float} @@ -77,14 +108,13 @@ \def\page_sides_process_float_cutspace {\global\c_page_sides_float_type\pluseight\page_sides_handle_float} \def\page_sides_process_float_margin {\global\c_page_sides_float_type\pluseight\page_sides_handle_float} -\let\logsidefloat\relax - -\newif\iftracesidefloats % public (might change) - -% end of public variables - -\def\page_sides_insert_info - {\page_floats_report_total} +\def\page_sides_check_horizontal_skips + {\ifcase\c_page_sides_skipmode + \or % high + \or % low + \or % fit + \global\d_strc_floats_margin\zeropoint + \fi} \def\page_sides_apply_horizontal_shift {\ifdim\d_page_sides_maximum>\zeropoint @@ -185,275 +215,14 @@ +\compensatedinnermakeupmargin \relax \fi - \ifdim\d_page_sides_rightskip>\zeropoint \global\advance\d_page_sides_rightskip\rightskip \fi - \ifdim\d_page_sides_leftskip >\zeropoint \global\advance\d_page_sides_leftskip \leftskip \fi} - -\def\page_sides_flush_floats - {\par - \ifnum\dimexpr\d_page_sides_vsize-\pagetotal\relax>\zeropoint - \page_sides_flush_floats_indeed + \ifdim\d_page_sides_rightskip>\zeropoint + \global\advance\d_page_sides_rightskip\rightskip \fi - % also here if used at all \global\holdinginserts\zerocount - \global\d_page_sides_vsize\d_page_sides_vsize_reset - \global\setfalse\c_page_sides_short - \global\setfalse\c_page_sides_flag} - -\unexpanded\def\doifelsesidefloat - {\par - \ifnum\dimexpr\d_page_sides_vsize-\pagetotal\relax>\zeropoint - \expandafter\firstoftwoarguments - \else - \expandafter\secondoftwoarguments - \fi} - -\let\doifsidefloatelse\doifelsesidefloat - -% \def\page_sides_flush_floats_indeed -% {\global\advance\d_page_sides_vsize-\d_page_sides_bottomskip -% \begingroup -% \let\page_sides_flush_floats\relax -% \forgetall -% \doloop -% {\strut -% \iftracesidefloats -% \color[darkgray]{\ruledhbox{\strut\kern\d_page_sides_width}}% -% \fi -% \par -% % \ifdim\dimexpr\d_page_sides_vsize-\pagetotal\relax>\zeropoint -% \ifdim\dimexpr\d_page_sides_vsize-\d_page_sides_bottomskip-\pagetotal\relax>\zeropoint -% \ifnum\recurselevel>\plushundred % safeguard, sort of deadcycles -% \exitloop -% \fi -% \else -% \exitloop -% \fi}% -% \endgroup -% \ifdim\parskip>\zeropoint % why this test ? -% \ifdim\d_page_sides_bottomskip>\parskip -% % \nowhitespace -% % \vskip\d_page_sides_bottomskip -% \blank[\v!nowhite,\the\dimexpr\d_page_sides_bottomskip] -% \fi -% \else -% \blank[\the\d_page_sides_bottomskip]% new, so needs checking -% \fi} - -\installcorenamespace{sidefloatsteps} - -\setvalue{\??sidefloatsteps\v!line }{\strut} -\setvalue{\??sidefloatsteps\v!big }{\strut} -\setvalue{\??sidefloatsteps\v!medium}{\halfstrut} -\setvalue{\??sidefloatsteps\v!small }{\quarterstrut} -\setvalue{\??sidefloatsteps\v!depth }{\depthstrut} - -% we don't officially know what kind of float we flush - -\def\page_sides_flush_floats_indeed - {\global\advance\d_page_sides_vsize-\d_page_sides_bottomskip - \begingroup - \let\page_sides_flush_floats\relax - \edef\m_pages_strut{\executeifdefined{\??sidefloatsteps\rootfloatparameter\c!step}\strut}% - \forgetall - \doloop - {\iftracesidefloats - \dontleavehmode - \ruledhpack{\m_pages_strut\kern\d_page_sides_width}% - \else - \m_pages_strut - \fi - \par - \nointerlineskip - % \ifdim\dimexpr\d_page_sides_vsize-\d_page_sides_bottomskip-\pagetotal\relax>\zeropoint - \ifdim\dimexpr\d_page_sides_vsize-\pagetotal\relax>\zeropoint - \ifnum\recurselevel>\plushundred % safeguard, sort of deadcycles - \exitloop - \fi - \else - \exitloop - \fi}% - \endgroup - \ifdim\parskip>\zeropoint % why this test ? - \ifdim\d_page_sides_bottomskip>\parskip - % \nowhitespace - % \vskip\d_page_sides_bottomskip -% \blank[\v!nowhite,\the\dimexpr\d_page_sides_bottomskip] - \blank[\v!nowhite,\rootfloatparameter\c!sidespaceafter] - \fi - \else -% \blank[\the\d_page_sides_bottomskip]% new, so needs checking - \blank[\rootfloatparameter\c!sidespaceafter]% new, so needs checking - \fi} - -% alternative method (unsnapped) -% -% \def\page_sides_flush_floats_indeed -% {\privatescratchdimen\dimexpr\d_page_sides_vsize-\d_page_sides_bottomskip-\pagetotal\relax -% \ifdim\parskip>\zeropoint % why this test ? -% \ifdim\privatescratchdimen>\parskip -% \blank[\v!nowhite,\the\privatescratchdimen] % better in stages -% \fi -% \else -% \blank[\the\privatescratchdimen] -% \fi} - -\def\page_sides_check_floats_after_par - {\page_sides_check_floats_indeed - \ifdim\oldpagetotal=\pagetotal \else - \global\let\page_sides_check_floats\page_sides_check_floats_indeed - \page_sides_flush_floats - \global\c_page_sides_n_of_lines\zerocount % here ! + \ifdim\d_page_sides_leftskip >\zeropoint + \global\advance\d_page_sides_leftskip \leftskip \fi} -\unexpanded\def\page_sides_flush_floats_after_par - {\xdef\oldpagetotal{\the\pagetotal}% - \global\let\page_sides_check_floats\page_sides_check_floats_after_par} - -\unexpanded\def\page_sides_forget_floats - {\global\d_page_sides_vsize\d_page_sides_vsize_reset - \global\c_page_sides_n_of_lines\zerocount - % also here if used at all \global\holdinginserts\zerocount - \global\setfalse\c_page_sides_short - \global\setfalse\c_page_sides_flag} - -\let\page_otr_sides_pop_penalties \relax -\let\page_otr_sides_push_penalties\relax - -% \def\page_otr_sides_push_penalties % needed ? and right -% {\widowpenalty\plusone -% \clubpenalty\plustwo -% \brokenpenalty\plusone -% \let\page_otr_sides_push_penalties\relax -% \edef\page_otr_sides_pop_penalties -% {\widowpenalty \the\widowpenalty -% \clubpenalty \the\clubpenalty -% \brokenpenalty\the\brokenpenalty -% \let\page_otr_sides_pop_penalties\relax}} -% -% shouldn't that be: -% -% \def\page_otr_sides_push_penalties % needed? -% {\let\page_otr_sides_push_penalties\relax -% \edef\page_otr_sides_pop_penalties -% {\widowpenalty \the\widowpenalty -% \clubpenalty \the\clubpenalty -% \brokenpenalty\the\brokenpenalty -% \let\page_otr_sides_pop_penalties\relax}% -% \widowpenalty\plusone -% \clubpenalty\plustwo -% \brokenpenalty\plusone} - -\def\page_sides_restore_output_penalty - {\ifnum\outputpenalty=\plustenthousand \else - \penalty\outputpenalty - \fi} - -\def\page_sides_output_routine - {\ifconditional\c_page_sides_short - \page_sides_output_routine_yes - \else - \page_sides_output_routine_nop - \fi} - -\def\page_sides_output_routine_nop - {\page_otr_command_side_float_output % otr specific - \global\d_page_sides_vsize\d_page_sides_vsize_reset - \global\c_page_sides_n_of_lines\zerocount - % we can end up in fig lock, so \global\holdinginserts\zerocount here too ? - \page_otr_sides_pop_penalties} - -\def\page_sides_output_routine_yes % we need to rework this ... add pagediscards and such - {\unvbox\normalpagebox % bah, and the discards? -% \pagediscards - \setbox\b_page_sides_bottom\lastbox - \ifdim\wd\b_page_sides_bottom>\d_page_sides_hsize - \penalty-201 % hm, i really need to write this from scatch - \box\b_page_sides_bottom - \else\ifvoid\b_page_sides_bottom - \else - \page_sides_restore_left_indent - \ifdim\wd\b_page_sides_bottom<\d_page_sides_hsize - \parskip\zeropoint - %\noindent - \ifinner\else - \vadjust{\penalty\minusone}% - \fi - \ifconditional\c_page_sides_l_eq - \global\setfalse\c_page_sides_l_eq - \else - \global\advance\d_page_sides_hsize -\wd\b_page_sides_bottom - \ifconditional\c_page_sides_r_eq - \global\setfalse\c_page_sides_r_eq - \else - \global\divide\d_page_sides_hsize \plustwo - \fi - \hskip\d_page_sides_hsize % \kern - \fi - \fi - \box\b_page_sides_bottom - \page_sides_restore_output_penalty - \fi\fi - % why was this \global\holdinginserts\zerocount - \global\setfalse\c_page_sides_short} - -\def\page_sides_restore_left_indent - {\relax - \ifnum\c_page_sides_float_type>\plusfour \else - \parskip\zeropoint % here ? - \ifdim\d_page_sides_width>\zeropoint % new, see prikkels - \noindent - \ifinner \else - \vadjust{\penalty\minusone}% - \fi - \hskip\d_page_sides_width\relax % \kern - %\else - % we have a margin or edge float - \fi - \fi} - -% The clean way: -% -% \global\setbox\floatbox\hbox -% {\ifcase\c_page_sides_float_type -% \vbox{#1}% -% \or % 1 -% \kern\d_page_sides_leftshift -% \kern\d_page_sides_shift -% \vbox{#1}% -% \kern-\d_page_sides_extrashift -% \or % 2 -% \kern\d_page_sides_shift -% \vbox{#1}% -% \kern-\d_page_sides_extrashift -% \or % 3 -% \kern\d_page_sides_shift -% \vbox{#1}% -% \kern-\d_page_sides_extrashift -% \or % 4 -% \kern\d_page_sides_leftshift -% \kern\d_page_sides_shift -% \vbox{#1\removedepth}% -% \kern-\d_page_sides_extrashift -% \or % 5 -% \kern-\d_page_sides_extrashift -% \vbox{#1}% -% \kern\d_page_sides_shift -% \kern\d_page_sides_rightshift -% \or % 6 -% \kern-\d_page_sides_extrashift -% \vbox{#1}% -% \kern\d_page_sides_shift -% \or % 7 -% \kern-\d_page_sides_extrashift -% \vbox{#1}% -% \kern\d_page_sides_shift -% \or % 8 -% \kern-\d_page_sides_extrashift -% \vbox{#1}% -% \kern\d_page_sides_shift -% \kern\d_page_sides_rightshift -% \fi} -% -% The compact way: +%D Shifts get applied to the float box: \def\page_sides_relocate_float#1% {\global\setbox\floatbox\hpack @@ -479,67 +248,347 @@ \kern\d_page_sides_rightshift \fi\fi}} +%D The vertical skips are a nightmare and this mechanism is about as complex +%D as one can get it. + +\def\page_sides_check_vertical_skips + {\ifdim\d_page_sides_topskip <\zeropoint\d_page_sides_topskip \zeropoint\fi + \ifdim\d_page_sides_bottomskip<\zeropoint\d_page_sides_bottomskip\zeropoint\fi + \ifdim\d_page_sides_midskip <\zeropoint\d_page_sides_midskip \zeropoint\fi + % + \global\d_page_sides_toptotal \dimexpr\d_page_sides_topskip +\d_page_sides_topoffset \relax + \global\d_page_sides_bottomtotal\dimexpr\d_page_sides_bottomskip+\d_page_sides_bottomoffset\relax + \ifcase\c_page_sides_skipmode + \or % high + \global\d_page_sides_toptotal \d_page_sides_topoffset + \or % low + \global\d_page_sides_bottomtotal\d_page_sides_bottomoffset + \or % fit + \global\d_page_sides_toptotal \d_page_sides_topoffset + \global\d_page_sides_bottomtotal\d_page_sides_bottomoffset + \fi} + +%D These shifts get (selectively) applied with a bit of optional tracing. + +\def\page_sides_apply_vertical_shift_normal + {\global\setbox\floatbox\hpack % why extra box + {\vpack + {\forgetall + \hsize\wd\floatbox + \vskip\privatescratchdimen + \offinterlineskip + \box\floatbox + % somehow we need this \scratchbox magic, but at least it's the same as the + % tracer now + \setbox\scratchbox\emptybox + \wd\scratchbox\hsize + \ht\scratchbox\d_page_sides_bottomtotal + \box\scratchbox + \vskip-\d_page_sides_bottomtotal + \ifnum\c_page_sides_align=\plusfive + \vskip-\lineheight + \fi}}} + +\def\page_sides_apply_vertical_shift_traced + {\global\setbox\floatbox\hpack % why extra box + {\backgroundline[trace:r]{\ruledhpack{\vpack + {\forgetall + \hsize\wd\floatbox + \vskip\privatescratchdimen + \offinterlineskip + \backgroundline + [trace:g]% + {\ruledhpack{\box\floatbox}}% + \par + \blackrule + [\c!color=trace:s,% + \c!height=\d_page_sides_bottomtotal,% + \c!depth=\zeropoint,% + \c!width=\hsize]% + \vskip-\d_page_sides_bottomtotal + \ifnum\c_page_sides_align=\plusfive + \vskip-\lineheight + \fi}}}}} + \def\page_sides_apply_vertical_shift {\ifnum\c_page_sides_align=\plusfour \getnoflines{\ht\floatbox}% - \privatescratchdimen\dimexpr\noflines\lineheight-\strutdepth\relax - \getrawnoflines\d_page_sides_topskip + \privatescratchdimen\dimexpr\noflines\lineheight-\strutdp\relax + \getrawnoflines\d_page_sides_toptotal \advance\privatescratchdimen\noflines\lineheight - % todo: maybe rounding problem here - % \global\setbox\floatbox\hbox{\lower\lineheight\box\floatbox}% - \global\setbox\floatbox\hpack{\lower\strutdepth\box\floatbox}% + \page_sides_force_depth \ht\floatbox\privatescratchdimen \dp\floatbox\zeropoint \fi \ifcase\c_page_sides_align \else - \global\d_page_sides_topskip\zeropoint + \global\d_page_sides_toptotal\zeropoint \fi \privatescratchdimen \ifnum\c_page_sides_float_type<\plusfour - \d_page_sides_topskip + \d_page_sides_toptotal \else\ifnum\c_page_sides_float_type>\plusfive - \d_page_sides_topskip + \d_page_sides_toptotal \else \zeropoint \fi\fi % the top of the box is at the previous baseline \ifcase\c_page_sides_align % 0 normal - \advance\privatescratchdimen\strutdepth % or \openstrutdepth + \advance\privatescratchdimen\strutdp % or \openstrutdepth \or % 1 height - \advance\privatescratchdimen\strutdepth % or \openstrutdepth + \advance\privatescratchdimen\strutdp % or \openstrutdepth \or % 2 line \or % 3 depth - \advance\privatescratchdimen\lineheight % or \openlineheight - \advance\privatescratchdimen\strutdepth % or \openstrutdepth + \advance\privatescratchdimen\lineheight % or \openlineheight + \advance\privatescratchdimen\strutdp % or \openstrutdepth \or % 4 grid \privatescratchdimen\zeropoint \or - \advance\privatescratchdimen\strutheight % or \openstrutheight + \advance\privatescratchdimen\strutht % or \openstrutheight \fi % new \global\c_page_sides_lines_done\zerocount \ifnum\c_page_sides_n_of_lines>\zerocount \advance\privatescratchdimen\c_page_sides_n_of_lines\lineheight \fi - \global\setbox\floatbox\hpack % why extra box - {\vbox - {\vskip\privatescratchdimen - \nointerlineskip - \box\floatbox - \ifnum\c_page_sides_align=\plusfive \vskip-\lineheight \fi}}% + \iftracesidefloats + \page_sides_apply_vertical_shift_traced % uses \privatescratchdimen + \else + \page_sides_apply_vertical_shift_normal % uses \privatescratchdimen + \fi \ifnum\c_page_sides_float_type<\plusfour - \global\d_page_sides_topskip\zeropoint + \global\d_page_sides_toptotal\zeropoint \else\ifnum\c_page_sides_float_type>\plusfive - \global\d_page_sides_topskip\zeropoint + \global\d_page_sides_toptotal\zeropoint \fi\fi \global\d_page_sides_downshift\zeropoint} -\def\page_sides_place_float - {\ifnum\c_page_sides_float_type=\plusfour \kern\d_page_sides_topskip \fi - \ifnum\c_page_sides_float_type=\plusfive \kern\d_page_sides_topskip \fi - \d_page_sides_saved_depth\prevdepth +%D We have a few virtual dimensions. I'm not sure what to do with \type +%D {\pagedepth} and \type {\pageshrink} in the next two. If we ever need +%D that it will become options. + +\def\e_page_sides_flush_criterium + {\dimexpr + \d_page_sides_vsize + -\d_page_sides_bottomtotal + -\pagetotal + \relax} + +\def\e_page_sides_room_criterium + {\dimexpr + \d_page_sides_vsize + -\d_page_sides_bottomtotal % added here too + -\pagetotal + \relax} + +%D In order to get a consistent spacing we force a strutdepth unless the +%D preceding material has more depth than that already. This way anchoring +%D becomes predictable. + +\unexpanded\def\page_sides_force_depth + {\iftracesidefloats + \begingroup + \c_page_force_strut_depth_trace_mode\plusone + \forcestrutdepth + \endgroup + \else + \forcestrutdepth + \fi} + +\def\page_sides_flush_floats + {\par + \ifdim\e_page_sides_flush_criterium>\zeropoint + \page_sides_flush_floats_progress + \page_sides_flush_floats_after_next + \fi + \page_sides_flush_floats_reset} + +\def\page_sides_flush_floats_text + {\par + % what with \c_anch_backgrounds_text_level>\plusone + \ifdim\e_page_sides_flush_criterium>\zeropoint + \page_sides_flush_floats_progress + \page_sides_flush_floats_after_none + \fi + \page_sides_flush_floats_reset} + +\def\page_sides_flush_floats_reset + {\global\d_page_sides_vsize\d_page_sides_vsize_reset + % also here if used at all \global\holdinginserts\zerocount + \global\setfalse\c_page_sides_short + \global\setfalse\c_page_sides_flag + \global\c_page_sides_checks_done\zerocount} + +\def\page_sides_flush_floats_after_none % we force a flush + {\ifdim\d_page_sides_midskip>\zeropoint + \blank[\the\d_page_sides_midskip] + \fi + \ignoreparskip + \blank[\v!disable]} + +\def\page_sides_flush_floats_after_next % we have two successive ones + {\ifdim\d_page_sides_bottomskip>\zeropoint + \blank[\the\d_page_sides_bottomskip] + \fi + \ignoreparskip + \blank[\v!disable]} + +%D A rudimentary checker: + +\unexpanded\def\doifelsesidefloat + {\par + \ifdim\e_page_sides_room_criterium>\zeropoint % -\pagedepth + \expandafter\firstoftwoarguments + \else + \expandafter\secondoftwoarguments + \fi} + +\let\doifsidefloatelse\doifelsesidefloat + +%D Sometimes we need to fill up the space alongside a side float and this +%D is where we define the helpers. A user can enforce a smaller step. We use +%D large steps when possible. + +\installcorenamespace{sidefloatsteps} + +\setvalue{\??sidefloatsteps\v!line }{\strut} +\setvalue{\??sidefloatsteps\v!big }{\strut} +\setvalue{\??sidefloatsteps\v!medium}{\halflinestrut} % was \halfstrut +\setvalue{\??sidefloatsteps\v!small }{\noheightstrut} % was \quarterstrut + +\def\page_sides_flush_floats_tracer + {\dontleavehmode + \ruledhpack\bgroup\backgroundline[trace:b]{% + \llap{\smash{\vrule\s!width4\points\s!height.4\points\s!depth.4\points}}% + \ifnum\recurselevel=\plusone + \llap{\smash{\smallinfofont\the\scratchdimen}\hskip.5\leftmargindistance}% + \else\ifodd\recurselevel + \llap{\smash{\smallinfofont\recurselevel}\hskip.5\leftmargindistance}% + \fi\fi + \page_sides_flush_floats_normal + \kern\hsize + \egroup}} + +\def\page_sides_flush_floats_normal + {\ifdim\scratchdimen>\htdp\strutbox + \strut + \else + \m_pages_strut + \fi} + +\def\page_sides_flush_floats_progress + {\begingroup + \page_sides_force_depth + \parskip\zeropoint + \let\page_sides_flush_floats\relax + \edef\m_pages_strut + {\ifcsname\??sidefloatsteps\rootfloatparameter\c!step\endcsname + \lastnamedcs + \else + \noheightstrut + \fi}% + \forgetall + \offinterlineskip + \doloop + {\scratchdimen\e_page_sides_flush_criterium + \ifdim\scratchdimen>\onepoint % good enough, can become configurable + \ifnum\recurselevel>\plushundred % safeguard, sort of deadcycles + \exitloop + \else\iftracesidefloats + \page_sides_flush_floats_tracer\par + \else + \page_sides_flush_floats_normal\par + \fi\fi + \else + \page_sides_force_depth + \exitloop + \fi}% + \endgroup} + +%D We force a parskip and ignore it afterwards. We can nil it by setting the +%D \type {spacebeforeside} parameter. We can have a leading blank so we need +%D to make sure that we use blank to inject the parskip and then ignore +%D the one injected by the engine. + +\def\page_sides_inject_before + {\page_sides_force_depth + \ifdim\parskip>\zeropoint + \ifdim\parskip>\d_strc_floats_top + \ifdim\d_strc_floats_top>\zeropoint + \ignoreparskip + \blank[\v!white]% + \else + \checkedblank[\rootfloatparameter\c!spacebeforeside]% + \fi + \else + \checkedblank[\rootfloatparameter\c!spacebeforeside]% + \fi + \else + \checkedblank[\rootfloatparameter\c!spacebeforeside]% + \fi} + +%D We are now done with \type {spacebefore} and the parskip is already +%D injected. The dummy line makes sure that we anchor properly and it +%D also can serve as tracer. + +\def\page_sides_inject_dummy_line_normal + {\hpack to \availablehsize{\strut\hss}} + +\def\page_sides_inject_dummy_line_traced + {\ruledhpack to \availablehsize{\backgroundline[trace:c]{\page_sides_inject_dummy_line_normal}}} + +\def\page_sides_inject_dummy_lines + {\par \nointerlineskip + \dontleavehmode + \iftracesidefloats + \page_sides_inject_dummy_line_traced + \else + \page_sides_inject_dummy_line_normal + \fi + \vskip-\dimexpr\lineheight+\strutdp\relax + \ignoreparskip + \blank[\v!samepage] + \blank[\v!disable]} + +%D Checkers: + +\def\page_sides_check_floats_after_par + {\page_sides_check_floats_indeed + \ifdim\d_page_sides_pagetotal=\pagetotal \else + \global\let\page_sides_check_floats\page_sides_check_floats_indeed + \page_sides_flush_floats + \global\c_page_sides_n_of_lines\zerocount % here ! + \fi} + +\unexpanded\def\page_sides_flush_floats_after_par + {\global\d_page_sides_pagetotal\pagetotal + \global\let\page_sides_check_floats\page_sides_check_floats_after_par} + +\unexpanded\def\page_sides_forget_floats + {\global\d_page_sides_vsize\d_page_sides_vsize_reset + \global\c_page_sides_n_of_lines\zerocount + % also here if used at all \global\holdinginserts\zerocount + \global\setfalse\c_page_sides_short + \global\setfalse\c_page_sides_flag} + +%D Here comes the output routine. We either go the fast route or we use the +%D normal one (stored in \type {\page_otr_command_side_float_output}. We no +%D longer have this fuzzy code around with penalties and indentation and +%D such. + +\def\page_sides_output_routine + {\page_otr_command_side_float_output + \ifconditional\c_page_sides_short + \global\setfalse\c_page_sides_short + \else + \global\d_page_sides_vsize\d_page_sides_vsize_reset + \global\c_page_sides_n_of_lines\zerocount + \fi} + +\def\page_sides_place_float + {\ifnum\c_page_sides_float_type=\plusfour \kern\d_page_sides_toptotal \fi + \ifnum\c_page_sides_float_type=\plusfive \kern\d_page_sides_toptotal \fi \ifgridsnapping \page_sides_place_float_grid \else @@ -548,21 +597,20 @@ \par \kern-\d_page_sides_height \penalty10001 % oeps, this will change - \normalbaselines - \prevdepth\d_page_sides_saved_depth} + \normalbaselines} \def\page_sides_place_float_normal {\page_sides_push_float_inline\firstofoneargument} -% The following needs some more work .. consider this a quick hack. We -% probably need an mkiv hanging grid option. +%D The following needs some more work .. consider this a quick hack. We probably +%D need an mkiv hanging grid option. \def\page_sides_place_snap_to_grid#1% {\edef\p_grid{\floatparameter\c!grid}% \ifx\p_grid\empty\else \snaptogrid[\p_grid]% \fi - \hbox{#1}} + \hpack{#1}} \def\page_sides_place_float_grid {\getrawnoflines\d_page_sides_height % raw ? @@ -575,10 +623,11 @@ {\begingroup \reseteverypar % needed ! \parskip\zeropoint % needed ! + \nointerlineskip \page_sides_set_skips - \page_sides_insert_info + \page_floats_report_total \relax - \lefttoright % \textdir TLT\relax % or \ifconditional\displaylefttoright below (more work) + \lefttoright \strc_floats_mark_par_as_free \ifcase\c_page_sides_float_type % invalid @@ -612,6 +661,7 @@ \def\page_sides_analyse_space {\global\settrue\c_page_sides_flag + \page_sides_force_depth \global\d_page_sides_page_total \pagetotal % global \ifnum\c_page_sides_float_type<\plusfour \global\d_page_sides_width \zeropoint @@ -624,79 +674,53 @@ \global\d_page_sides_width\zeropoint \fi \global\d_page_sides_hsize \dimexpr\hsize-\d_page_sides_width\relax - \global\d_page_sides_height\dimexpr\ht\floatbox+\dp\floatbox+\d_page_sides_topskip\relax + \global\d_page_sides_height\dimexpr\ht\floatbox+\dp\floatbox+\d_page_sides_toptotal\relax \global\d_page_sides_vsize \dimexpr\d_page_sides_height+\d_page_sides_page_total\relax - \dimen0\d_page_sides_vsize - \dimen2\pagegoal - \relax - \ifcase\c_page_sides_method - % method 0 : raw + \scratchdimenone\d_page_sides_vsize + \scratchdimentwo\pagegoal + \ifcase\c_page_sides_tolerance + \ifcase\c_page_sides_method + % method 0 : raw + \or + % method 1 : safe (default) + \advance\scratchdimentwo -\strutdp + \or + % method 2 : tight (grid default) + \advance\scratchdimenone -\onepoint + \fi \or - % method 1 : safe - \dimen2 .99\pagegoal + % tolerant + \advance\scratchdimentwo -.5\strutdp \or - % method 2 : tight - \advance\dimen0 -\onepoint + % verytolerant + % \advance\scratchdimenone -\onepoint (maybe) + \else + \advance\scratchdimentwo -\strutdp \fi - \relax % really needed ! ! ! ! - \ifdim\dimen0>\dimen2 + % how about \pagedepth + \ifdim\scratchdimenone>\scratchdimentwo \global\setfalse\c_page_floats_room \else - \ifdim\dimexpr\pagegoal-\d_page_sides_vsize\relax<\d_page_sides_bottomskip - % just weird: \global\advance\d_page_sides_vsize \dimen0 + \ifdim\dimexpr\pagegoal-\d_page_sides_vsize\relax<\d_page_sides_bottomtotal + % just weird: \global\advance\d_page_sides_vsize \scratchdimenone \global\settrue\c_page_sides_short - \page_otr_sides_push_penalties % why was this \global\holdinginserts\plusone \else - \global\advance\d_page_sides_vsize \d_page_sides_bottomskip + \global\advance\d_page_sides_vsize \d_page_sides_bottomtotal % wins over inbetween \global\setfalse\c_page_sides_short \fi \global\settrue\c_page_floats_room \fi} -% \def\page_sides_prepare_space -% {\par -% % no longer needed \whitespace -% \begingroup -% \forgetall -% \reseteverypar -% \verticalstrut -% \vskip-\struttotal -% \endgroup} - -% \installtextracker -% {sidefloats.anchor} -% {\let\page_sides_anchor\page_sides_anchor_yes} -% {\let\page_sides_anchor\page_sides_anchor_nop} -% -% \def\page_sides_anchor_yes -% {\darkred -% \hskip-5\emwidth -% \vrule\s!height.05\exheight\s!depth.05\exheight\s!width10\emwidth} -% -% \def\page_sides_anchor_nop -% {\strut} -% -% \let\page_sides_anchor\page_sides_anchor_nop -% -% \def\page_sides_prepare_space -% {\par -% \begingroup -% \reseteverypar -% \dontleavehmode\hpack to \zeropoint{\page_sides_anchor\hss\strut}% -% \vskip-\parskip -% \vskip-\struttotal -% \inhibitblank -% \endgroup} - -\def\page_sides_prepare_space - {\fakenextstrutline - \inhibitblank} +%D As we have no clear end of one or more paragraphs we only have pre float +%D skips. \def\page_sides_handle_float#1% grid (4) is rather experimental - {\page_sides_prepare_space + {\page_sides_check_horizontal_skips + \page_sides_check_vertical_skips \page_sides_apply_horizontal_shift \page_sides_check_previous_float + \page_sides_inject_before \page_sides_inject_dummy_lines \page_sides_relocate_float{#1}% \page_sides_apply_vertical_shift @@ -704,11 +728,18 @@ \ifconditional\c_page_floats_room \else \page_otr_fill_and_eject_page \page_sides_analyse_space + %\page_sides_inject_before \page_sides_inject_dummy_lines \fi \page_sides_place_float \page_sides_check_floats_reset - \ignorespaces} % not really needed + \page_sides_wrapup} + +\def\page_sides_wrapup + {% we need to do this aftergroup + \ignoreparskip \aftergroup\ignoreparskip + \ignorespaces \aftergroup\ignorespaces + } \def\page_sides_check_floats_indeed {\page_sides_analyse_progress @@ -717,16 +748,44 @@ \else \page_sides_check_floats_reset \fi - \parskip\s_spac_whitespace_parskip} + \parskip\s_spac_whitespace_parskip} % not needed \let\page_sides_check_floats\page_sides_check_floats_indeed +\unexpanded\def\page_sides_check_floats_tracer + {\begingroup + \dontleavehmode + \ifnum\c_page_sides_float_type>\plusfour + \rlap + {\hskip\availablehsize % d_page_sides_width % kern + \color[trace:o]% + {\rlap{\kern.25\bodyfontsize\showstruts\strut}% + \vrule\s!height.5\points\s!depth.5\points\s!width\d_page_sides_width}}% + \else + \hskip-\d_page_sides_width % kern + \color[trace:o]% + {\vrule\s!height.5\points\s!depth.5\points\s!width\d_page_sides_width + \llap{\showstruts\strut\kern.25\bodyfontsize}}% + \fi + \endgroup} + \unexpanded\def\page_sides_check_floats_set - {\privatescratchdimen\dimexpr\d_page_sides_progress+\strutht-\roundingeps\relax - \c_page_sides_n_of_hang\privatescratchdimen - \divide\c_page_sides_n_of_hang \baselineskip\relax + {\edef\p_sidethreshold{\floatparameter\c!sidethreshold}% + \ifx\p_sidethreshold\v!old + \d_page_sides_progression\dimexpr\d_page_sides_progress+\strutht-\roundingeps\relax + \c_page_sides_n_of_hang\d_page_sides_progression + \divide\c_page_sides_n_of_hang \baselineskip\relax + \else + \d_page_sides_progression + \ifx\p_sidethreshold\empty + \d_page_sides_progress + \else + \dimexpr\d_page_sides_progress-\p_sidethreshold\relax + \fi + \getnoflines\d_page_sides_progression + \c_page_sides_n_of_hang\noflines + \fi \ifnum\c_page_sides_n_of_hang>\zerocount - % new from here (needs test case, old code) \ifcase\c_page_sides_n_of_lines \else \ifcase\c_page_sides_lines_done @@ -737,40 +796,35 @@ \global\advance\c_page_sides_n_of_lines-\privatescratchcounter \fi \fi - % hm, when do we get the parshape branch? needs testing \ifnum\c_page_sides_n_of_lines>\zerocount \privatescratchtoks\emptytoks \privatescratchcounter\c_page_sides_n_of_lines \privatescratchdimen\dimexpr\hsize-\d_page_sides_width\relax \dorecurse\c_page_sides_n_of_lines - {\appendtoks \zeropoint \hsize \to \privatescratchtoks}% + {\toksapp\privatescratchtoks{\zeropoint\hsize}}% \ifnum\c_page_sides_n_of_hang>\c_page_sides_n_of_lines \advance\c_page_sides_n_of_hang -\c_page_sides_n_of_lines\relax \advance\privatescratchcounter\c_page_sides_n_of_hang \dorecurse\c_page_sides_n_of_hang % weird, shouldn't that be scratchcounter {\ifnum\c_page_sides_float_type>\plusfour - \appendtoks \zeropoint \privatescratchdimen \to \privatescratchtoks + \toksapp\privatescratchtoks{\zeropoint\privatescratchdimen}% \else - \appendtoks \d_page_sides_width\privatescratchdimen \to \privatescratchtoks + \toksapp\privatescratchtoks{\d_page_sides_width\privatescratchdimen}% \fi}% \fi \parshape \numexpr\privatescratchcounter+\plusone\relax - \the\privatescratchtoks % \privatescratchcounter - \zeropoint \hsize % \plusone + \the\privatescratchtoks + \zeropoint \hsize \relax \else - % new till here \hangindent \ifnum\c_page_sides_float_type>\plusfour -\fi\d_page_sides_width \hangafter-\c_page_sides_n_of_hang \fi \fi \global\advance\c_page_sides_checks_done \plusone \iftracesidefloats - \hskip-\d_page_sides_width % kern - \color[darkgray]% - {\vrule\s!height.5\points\s!depth.5\points\s!width\d_page_sides_width - \llap{\showstruts\strut\kern.25\bodyfontsize}}% + \page_sides_check_floats_tracer \fi} \unexpanded\def\page_sides_check_floats_reset @@ -792,72 +846,21 @@ \fi \fi} -\def\page_sides_inject_dummy_lines - {\begingroup - \privatescratchcounter\pageshrink - \divide\privatescratchcounter \baselineskip - \advance\privatescratchcounter \plusone - \parskip\zeropoint - \dorecurse\privatescratchcounter{\hpack to \hsize{}}% - \kern-\privatescratchcounter\baselineskip - \penalty\zerocount - \endgroup} - -% Display math -% -% If we need this, it will be redone but redefining -% these macros does not really work out in the current -% situation. +% \def\adjustsidefloatdisplaylines % public, will change +% {\aftergroup\page_sides_adjust_display_lines} % -% \ifx\normalleqno\undefined -% -% \let\floatrighteqo=\eqno -% \let\floatleftleqo=\leqno -% -% \else -% -% \let\floatrighteqo=\normaleqno -% \let\floatleftleqo=\normalleqno -% -% \fi -% -% \ifx\normaleqno\undefined -% -% \def\normaleqno -% {\ifconditional\c_page_sides_short -% \global\settrue\c_page_sides_r_eq -% \fi -% \floatrighteqo} -% -% \else -% -% \def\eqno -% {\ifconditional\c_page_sides_short -% \global\settrue\c_page_sides_r_eq -% \fi -% \floatrighteqo} -% -% \fi - -\def\adjustsidefloatdisplaylines % public, will change - {\aftergroup\page_sides_adjust_display_lines} - -\def\page_sides_adjust_display_lines - {\par - \noindent - \ignorespaces} - -% We need to hook it into the other otr's. This code will be adapted -% once we rename the callers. - -% \def as they can be redefined! +% \def\page_sides_adjust_display_lines +% {\par +% \noindent +% \ignorespaces} -% some will become obsolete +%D We need to hook it into the other otr's. This code will be adapted once we rename +%D the callers. We use \type {\def} as they can be redefined! Some will become obsolete -\def\checksidefloat {\page_sides_check_floats} -\def\flushsidefloats {\page_sides_flush_floats} -\def\flushsidefloatsafterpar{\page_sides_flush_floats_after_par} -\def\forgetsidefloats {\page_sides_forget_floats} -%def\synchronizesidefloats {\page_sides_synchronize_floats} +\unexpanded\def\checksidefloat {\page_sides_check_floats} +\unexpanded\def\flushsidefloats {\page_sides_flush_floats_text} +\unexpanded\def\flushsidefloatsafterpar{\page_sides_flush_floats_after_par} +\unexpanded\def\forgetsidefloats {\page_sides_forget_floats} +%unexpanded\def\synchronizesidefloats {\page_sides_synchronize_floats} \protect \endinput diff --git a/tex/context/base/mkiv/page-str.mkiv b/tex/context/base/mkiv/page-str.mkiv index b6b8d1cce..57a465603 100644 --- a/tex/context/base/mkiv/page-str.mkiv +++ b/tex/context/base/mkiv/page-str.mkiv @@ -29,7 +29,7 @@ %D %D Remark: marknotes are gone, at least for a while. -\registerctxluafile{page-str}{1.001} +\registerctxluafile{page-str}{} \unprotect diff --git a/tex/context/base/mkiv/page-txt.mkvi b/tex/context/base/mkiv/page-txt.mkvi index b67e3aa74..b043b60c7 100644 --- a/tex/context/base/mkiv/page-txt.mkvi +++ b/tex/context/base/mkiv/page-txt.mkvi @@ -482,6 +482,8 @@ \c!rightstyle\c!rightcolor\c!rightwidth{#one}}% \fi\fi\fi} +\let\currentlayoutelement\relax + \unexpanded\def\resettextcontent {\dotripleempty\page_layouts_reset_text_content} @@ -502,6 +504,8 @@ %D The placement of a whole line is handled by the next two macros. These are hooked %D into the general purpose token list registers mentioned before. +\let\currentlayouttextline\relax + \def\page_layouts_place_text_line_indeed#vertical#height% {\let\currentlayouttextline#vertical% \ifdim#height>\zeropoint\relax % prevents pagenumbers when zero height @@ -790,7 +794,7 @@ \ifx\p_strc_pagenumbers_width\empty \box\scratchbox\tfskip \else - \hbox to \p_strc_pagenumbers_width{\box\scratchbox\hss}% + \hpack to \p_strc_pagenumbers_width{\box\scratchbox\hss}% \fi \fi \endgroup} @@ -803,7 +807,7 @@ \ifx\p_strc_pagenumbers_width\empty \tfskip\box\scratchbox \else - \hbox to \p_strc_pagenumbers_width{\hss\box\scratchbox}% + \hpack to \p_strc_pagenumbers_width{\hss\box\scratchbox}% \fi \fi \endgroup} @@ -818,7 +822,7 @@ \def\page_layouts_insert_elements {\ifcase\pageornamentstate - \page_layouts_place_elements_indeed + \page_layouts_place_elements_indeed % we could have a special flag for always ignored \fi} \def\page_layouts_place_elements_indeed diff --git a/tex/context/base/mkiv/publ-aut.lua b/tex/context/base/mkiv/publ-aut.lua index 6ad8b1296..91d38a8d9 100644 --- a/tex/context/base/mkiv/publ-aut.lua +++ b/tex/context/base/mkiv/publ-aut.lua @@ -13,8 +13,8 @@ end local lpeg = lpeg -local type, next, tostring = type, next, tostring -local concat = table.concat +local type, next, tostring, tonumber = type, next, tostring, tonumber +local concat, sortedhash = table.concat, table.sortedhash local utfsub = utf.sub local formatters = string.formatters @@ -123,19 +123,22 @@ end local authormap = allocate() publications.authormap = authormap -local function splitauthor(author) - local detail = cache[author] - if detail then - return detail - end - local remapped = authormap[author] - if remapped then - report("remapping %a to %a",author,remapped) - local detail = cache[remapped] +local function splitauthor(author,justsplit) + local detail, remapped + if not justsplit then + detail = cache[author] if detail then - cache[author] = detail return detail end + remapped = authormap[author] + if remapped then + report("remapping %a to %a",author,remapped) + local detail = cache[remapped] + if detail then + cache[author] = detail + return detail + end + end end local author = remapped or author local firstnames, vons, surnames, initials, juniors, options @@ -253,8 +256,10 @@ local function splitauthor(author) if initials and #initials > 0 then detail.initials = initials end if juniors and #juniors > 0 then detail.juniors = juniors end if options and next(options) then detail.options = options end - cache[author] = detail - nofhits = nofhits + 1 + if not justsplit then + cache[author] = detail + nofhits = nofhits + 1 + end return detail end @@ -293,8 +298,8 @@ local function splitauthorstring(str) return authors end -publications.splitoneauthor = splitauthor -publications.splitauthor = splitauthorstring +publications.splitoneauthor = splitauthor +publications.splitauthor = splitauthorstring local function the_initials(initials,symbol,connector) if not symbol then @@ -307,6 +312,7 @@ local function the_initials(initials,symbol,connector) for i=1,#initials do local initial = initials[i] if type(initial) == "table" then + -- J.-J. local set, s = { }, 0 for i=1,#initial do if i > 1 then @@ -317,6 +323,7 @@ local function the_initials(initials,symbol,connector) end r = r + 1 ; result[r] = concat(set) else + -- J. r = r + 1 ; result[r] = initial .. symbol end end @@ -330,17 +337,20 @@ local ctx_btxsetfirstnames = context.btxsetfirstnames local ctx_btxsetvons = context.btxsetvons local ctx_btxsetsurnames = context.btxsetsurnames local ctx_btxsetjuniors = context.btxsetjuniors -local ctx_btxciteauthorsetup = context.btxciteauthorsetup -local ctx_btxlistauthorsetup = context.btxlistauthorsetup local ctx_btxsetauthorvariant = context.btxsetauthorvariant + local ctx_btxstartauthor = context.btxstartauthor local ctx_btxstopauthor = context.btxstopauthor +local ctx_btxciteauthorsetup = context.btxciteauthorsetup +local ctx_btxlistauthorsetup = context.btxlistauthorsetup + local concatstate = publications.concatstate local f_invalid = formatters["<invalid %s: %s>"] -local currentauthordata = nil -local currentauthorsymbol = nil +local currentauthordata = nil +local currentauthorsymbol = nil +local currentauthorconnector = nil local manipulators = typesetters.manipulators local splitmanipulation = manipulators.splitspecification @@ -359,7 +369,7 @@ local function value(i,field) end implement { name = "btxcurrentfirstnames", arguments = "integer", actions = function(i) local v = value(i,"firstnames") if v then context(concat(v," ")) end end } -implement { name = "btxcurrentinitials", arguments = "integer", actions = function(i) local v = value(i,"initials") if v then context(concat(the_initials(v,currentauthorsymbol))) end end } +implement { name = "btxcurrentinitials", arguments = "integer", actions = function(i) local v = value(i,"initials") if v then context(concat(the_initials(v,currentauthorsymbol,currentauthorconnector))) end end } implement { name = "btxcurrentjuniors", arguments = "integer", actions = function(i) local v = value(i,"juniors") if v then context(concat(v," ")) end end } implement { name = "btxcurrentsurnames", arguments = "integer", actions = function(i) local v = value(i,"surnames") if v then context(concat(v," ")) end end } implement { name = "btxcurrentvons", arguments = "integer", actions = function(i) local v = value(i,"vons") if v then context(concat(v," ")) end end } @@ -380,7 +390,7 @@ local function btxauthorfield(i,field) context(applymanipulation(manipulator,value) or value) end elseif field == "initials" then - context(concat(the_initials(value,currentauthorsymbol))) + context(concat(the_initials(value,currentauthorsymbol,currentauthorconnector))) else context(concat(value," ")) end @@ -408,6 +418,7 @@ local function btxauthor(dataset,tag,field,settings) local etallast = etaloption[v_last] local combiner = settings.combiner local symbol = settings.symbol + local connector = settings.connector local index = settings.index if not combiner or combiner == "" then combiner = "normal" @@ -421,8 +432,9 @@ local function btxauthor(dataset,tag,field,settings) else etallast = false end - currentauthordata = split - currentauthorsymbol = symbol + currentauthordata = split + currentauthorsymbol = symbol + currentauthorconnector = connector local function oneauthor(i,last,justone) local author = split[i] @@ -508,6 +520,7 @@ implement { { "etaldisplay" }, { "etaloption" }, { "symbol" }, + { "connector" }, } } } @@ -530,6 +543,9 @@ local collapsers = allocate { } publications.authorcollapsers = collapsers +-- making a constructor doesn't make the code nicer as the_initials is an +-- exception + local function default(author) -- one author local hash = author.hash if hash then @@ -707,8 +723,101 @@ authorhashers.normalshort = function(authors) end end -authorhashers.normalinverted = authorhashers.normal -authorhashers.invertedshort = authorhashers.normalshort +local sequentialhash = function(authors) + if type(authors) == "table" then + local n = #authors + if n == 0 then + return "" + end + local result = { } + local nofresult = 0 + for i=1,n do + local author = authors[i] + local vons = author.vons + local surnames = author.surnames + local firstnames = author.firstnames + local juniors = author.juniors + if firstnames and #firstnames > 0 then + for j=1,#firstnames do + nofresult = nofresult + 1 + result[nofresult] = firstnames[j] + end + end + if vons and #vons > 0 then + for j=1,#vons do + nofresult = nofresult + 1 + result[nofresult] = vons[j] + end + end + if surnames and #surnames > 0 then + for j=1,#surnames do + nofresult = nofresult + 1 + result[nofresult] = surnames[j] + end + end + if juniors and #juniors > 0 then + for j=1,#juniors do + nofresult = nofresult + 1 + result[nofresult] = juniors[j] + end + end + end + return concat(result," ") + else + return authors + end +end + +local sequentialshorthash = function(authors) + if type(authors) == "table" then + local n = #authors + if n == 0 then + return "" + end + local result = { } + local nofresult = 0 + for i=1,n do + local author = authors[i] + local vons = author.vons + local surnames = author.surnames + local initials = author.initials + local juniors = author.juniors + if initials and #initials > 0 then + initials = the_initials(initials) + for j=1,#initials do + nofresult = nofresult + 1 + result[nofresult] = initials[j] + end + end + if vons and #vons > 0 then + for j=1,#vons do + nofresult = nofresult + 1 + result[nofresult] = vons[j] + end + end + if surnames and #surnames > 0 then + for j=1,#surnames do + nofresult = nofresult + 1 + result[nofresult] = surnames[j] + end + end + if juniors and #juniors > 0 then + for j=1,#juniors do + nofresult = nofresult + 1 + result[nofresult] = juniors[j] + end + end + end + return concat(result," ") + else + return authors + end +end + +authorhashers.sequential = sequentialhash +authorhashers.sequentialshort = sequentialshorthash +authorhashers.normalinverted = authorhashers.normal +authorhashers.invertedshort = authorhashers.normalshort local p_clean = Cs ( ( P("\\btxcmd") / "" -- better keep the argument @@ -868,6 +977,31 @@ implement { name = "btxremapauthor", arguments = { "string", "string" }, actions = function(k,v) - publications.authormap[k] = v + local a = { splitauthor(k,true) } + local s1 = sequentialhash(a) + local s2 = sequentialshorthash(a) + if not authormap[k] then + authormap[k] = v + report("%a mapped onto %a",k,v) + end + if not authormap[s1] then + authormap[s1] = v + report("%a mapped onto %a, derived from %a",s1,v,k) + end + if not authormap[s2] then + authormap[s2] = v + report("%a mapped onto %a, derived from %a",s2,v,k) + end + end +} + +implement { + name = "btxshowauthorremapping", + actions = function(k,v) + report("start author remapping") + for k, v in sortedhash(authormap) do + report(" %s => %s",k,v) + end + report("stop author remapping") end } diff --git a/tex/context/base/mkiv/publ-dat.lua b/tex/context/base/mkiv/publ-dat.lua index 8eb923407..310df82f3 100644 --- a/tex/context/base/mkiv/publ-dat.lua +++ b/tex/context/base/mkiv/publ-dat.lua @@ -24,7 +24,7 @@ end local lower, find, sub = string.lower, string.find, string.sub local concat, copy, tohash = table.concat, table.copy, table.tohash -local next, type, rawget = next, type, rawget +local next, type, rawget, tonumber = next, type, rawget, tonumber local utfchar = utf.char local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns local textoutf = characters and characters.tex.toutf @@ -138,14 +138,15 @@ local virtuals = allocate { } local defaulttypes = allocate { - author = "author", - editor = "author", - publisher = "author", - page = "pagenumber", - pages = "pagenumber", - keywords = "keyword", - doi = "url", - url = "url", + author = "author", + editor = "author", + translator = "author", + -- publisher = "author", + page = "pagenumber", + pages = "pagenumber", + keywords = "keyword", + doi = "url", + url = "url", } local defaultsets = allocate { @@ -265,11 +266,13 @@ local specifications = setmetatableindex(function(t,name) local fullname = resolvers.findfile(filename) or "" if fullname == "" then report("no data definition file %a for %a",filename,name) + t[name] = default return default end local specification = table.load(fullname) if not specification then report("invalid data definition file %a for %a",fullname,name) + t[name] = default return default end -- @@ -320,7 +323,7 @@ end function publications.parenttag(dataset,tag) if not dataset or not tag then report("error in specification, dataset %a, tag %a",dataset,tag) - elseif find(tag,"%+") then + elseif find(tag,"+",1,true) then local tags = lpegmatch(p_splitter,tag) local parent = tags[1] local current = datasets[dataset] @@ -862,7 +865,7 @@ do publications.loadbibdata(dataset,data,fullname,kind) end - function loaders.lua(dataset,filename) -- if filename is a table we load that one + function loaders.lua(dataset,filename,loader) -- if filename is a table we load that one local current, data, fullname if type(filename) == "table" then current = datasets[dataset] @@ -873,7 +876,7 @@ do return end current = datasets[dataset] - data = table.load(fullname) + data = (loader or table.load)(fullname) end if data then local luadata = current.luadata @@ -888,6 +891,10 @@ do end end + function loaders.json(dataset,filename) + loaders.lua(dataset,filename,utilities.json.load) + end + function loaders.buffer(dataset,name) -- if filename is a table we load that one local current = datasets[dataset] local barename = file.removesuffix(name) diff --git a/tex/context/base/mkiv/publ-imp-apa.lua b/tex/context/base/mkiv/publ-imp-apa.lua index a725bf22f..65dee0717 100644 --- a/tex/context/base/mkiv/publ-imp-apa.lua +++ b/tex/context/base/mkiv/publ-imp-apa.lua @@ -84,11 +84,11 @@ local categories = specification.categories categories.article = { sets = { - author = { "author", "editor", "title" }, + author = { "author", "organization", "editor", "title" }, doi = generic.doi, }, required = { - "author" + "author", -- a set }, optional = { "withauthor", "translator", @@ -96,6 +96,13 @@ categories.article = { "subtitle", "type", "file", "journal", "volume", "number", "pages", "doi", "note", + -- APA ignores this: + -- + -- "month", + -- + -- fields defined in jabref but presently ignored: + -- + -- "issn", }, } @@ -123,7 +130,7 @@ categories.newspaper = categories.magazine categories.periodical = { sets = { - author = { "editor", "publisher" }, + author = { "editor", "publisher", "organization", }, doi = generic.doi, }, required = { @@ -175,6 +182,7 @@ categories.book = { "editionset", "series", "address", "doi", "note", + "abstract", }, } @@ -182,7 +190,7 @@ categories.book = { categories.inbook = { sets = { - author = { "author", "editor", "publisher", "title", }, + author = { "author", "organization", "editor", "publisher", "title", }, ineditor = { "editor" }, editionset = generic.editionset, doi = generic.doi, @@ -436,6 +444,7 @@ categories.unpublished = { categories.electronic = { sets = { doi = generic.doi, + author = { "author", "organization", }, }, required = { "title" diff --git a/tex/context/base/mkiv/publ-imp-apa.mkvi b/tex/context/base/mkiv/publ-imp-apa.mkvi index 182802331..cd78a8799 100644 --- a/tex/context/base/mkiv/publ-imp-apa.mkvi +++ b/tex/context/base/mkiv/publ-imp-apa.mkvi @@ -310,7 +310,8 @@ \c!etallimit=5, \c!etaldisplay=1, % TODO: when 2-4, show all first time, etaldisplay subsequently... \c!authorconversion=\v!name, - \c!sorttype=normal, + \c!sorttype=normal, % \v!normal ? + \c!style=, \c!compress=\v!yes, % note that cite sorts only work with compress=yes. \c!separator:names:3={\btxcomma\btxlabeltext{and}\space}, % not \textampersand \c!separator:names:4={\btxspace\btxlabeltext{and}\space}] % not \textampersand @@ -345,6 +346,18 @@ [apa:\s!cite] \definebtx + [apa:\s!cite:editor] + [apa:\s!cite:author] + +\definebtx + [apa:\s!cite:translator] + [apa:\s!cite:author] + +\definebtx + [apa:\s!cite:organization] + [apa:\s!cite] + +\definebtx [apa:\s!cite:authoryear] [apa:\s!cite:author] [\c!left={(}, @@ -562,7 +575,7 @@ apa:Editors=Éditeurs, apa:Volume=Volume, apa:Volumes=Volumes, - apa:nd={s.d.} % sans date + apa:nd={s.d.}, % sans date apa:supplement=Supplément, apa:MotionPicture={Film cinématographique}, apa:Writer=Scénariste, @@ -668,7 +681,7 @@ % used in publ-imp-page.mkvi -\startsetups [btx:apa:list:page-or-pages] +\startsetups btx:apa:list:page-or-pages \ifx\currentbtxlastpage\empty \btxlabeltext{p} \else @@ -828,6 +841,14 @@ \btxdoifelse {year} { \btxflush{year} \btxflushsuffix + \btxdoif {month} { % month and day optional in publ-imp-apa.lua + \btxcomma + \btxflush{month} + \btxdoif {day} { + \btxspace + \btxflush{day} + } + } } { \fastsetup{btx:apa:nd} % Hans: the following won't work but should. @@ -843,7 +864,11 @@ \starttexdefinition unexpanded btx:apa:author-or-editor #author \btxdoifelse {#author} { - \btxflush{#author} + \btxstartstyleandcolor[apa:\s!list:#author] + \btxusecommand[apa:\s!list:#author]{ + \btxflush{#author} + } + \btxstopstyleandcolor % use \processaction [] [] here? \doifelse {\btxfoundname{#author}} {editor} { \btxleftparenthesis @@ -889,7 +914,11 @@ \btxrightparenthesis \removeunwantedspaces \btxparameter{\c!separator:names:3} - \btxflush{director} + \btxstartstyleandcolor[apa:\s!list:director] + \btxusecommand[apa:\s!list:director]{ + \btxflush{director} + } + \btxstopstyleandcolor \btxleftparenthesis \btxsingularorplural {director} { \btxlabeltext{apa:Director} @@ -904,7 +933,11 @@ \btxleftparenthesis \btxlabeltext{with} \btxspace - \btxflush{withauthor} + \btxstartstyleandcolor[apa:\s!list:withauthor] + \btxusecommand[apa:\s!list:withauthor]{ + \btxflush{withauthor} + } + \btxstopstyleandcolor \btxrightparenthesis } } { @@ -950,6 +983,16 @@ } \stoptexdefinition +\starttexdefinition unexpanded btx:apa:organization-if-not-author + \btxdoif {organization} { + \doifnot {\btxfoundname{author}} {organization} { + \btxspace + \btxflush{organization} + \btxcomma + } + } +\stoptexdefinition + % TODO: The title is terminated with period. However, % we probably don't want this before the parenthesis. @@ -1165,21 +1208,25 @@ \removeunwantedspaces \stoptexdefinition +\starttexdefinition unexpanded btx:apa:type + \btxdoif {type} { + \btxleftbracket + \btxflush{type} + \btxrightbracketperiod + } +\stoptexdefinition + % Then setups, by category % An article from a journal -% Required fields: author or editor or title, journal, (year). +% Required fields: author or organization or editor or title, journal, (year). % Optional fields: volume, number, pages, type, doi, url, note. % Note that bibtex (and tools) do not include editor (e.g. special issue or section) \startsetups btx:apa:list:article \texdefinition{btx:apa:authoryear} \texdefinition{btx:apa:title-if-not-placed} - \btxdoif {type} { - \btxleftbracket - \btxflush{type} - \btxrightbracketperiod - } + \texdefinition{btx:apa:type} \texdefinition{btx:apa:journal-volume-number-pages} \texdefinition{btx:apa:url-doi-note} \stopsetups @@ -1230,6 +1277,7 @@ \startsetups btx:apa:list:book \texdefinition{btx:apa:authoryear} \texdefinition{btx:apa:title-if-not-placed} + \texdefinition{btx:apa:type} \texdefinition{btx:apa:editionset} \texdefinition{btx:apa:wherefrom-publisher} \texdefinition{btx:apa:url-doi-note} @@ -1247,6 +1295,7 @@ \startsetups btx:apa:list:inbook \texdefinition{btx:apa:authoryear} \texdefinition{btx:apa:title-if-not-placed} + \texdefinition{btx:apa:type} \texdefinition{btx:apa:editor-in} \texdefinition{btx:apa:editionset} \texdefinition{btx:apa:wherefrom-publisher} @@ -1280,11 +1329,7 @@ \texdefinition{btx:apa:title-if-not-placed} \texdefinition{btx:apa:editor-in} \texdefinition{btx:apa:editionset} - \btxdoif {organization} { - \btxspace - \btxflush{organization} - \btxcomma - } + \texdefinition{btx:apa:organization-if-not-author} \texdefinition{btx:apa:wherefrom-publisher} \texdefinition{btx:apa:url-doi-note} \stopsetups @@ -1386,7 +1431,11 @@ \btxflush{nationality} } \btxspace - \btxlabeltext{patent} + \btxdoifelse{type}{ + \btxflush{type} + }{ + \btxlabeltext{patent} + } \btxdoif {number} { \btxspace \btxlabeltext{apa:number} @@ -1411,11 +1460,8 @@ \startsetups btx:apa:list:electronic \texdefinition{btx:apa:authoryear} \texdefinition{btx:apa:title-if-not-placed} - \btxdoif {organization} { - \btxspace - \btxflush{organization} - \btxperiod - } + \texdefinition{btx:apa:type} + \texdefinition{btx:apa:organization-if-not-author} \btxdoif {howpublished} { \btxspace \btxflush{howpublished} @@ -1466,11 +1512,7 @@ \btxperiod } } - \btxdoif {type} { - \btxleftbracket - \btxflush{type} - \btxrightbracketperiod - } + \texdefinition{btx:apa:type} \texdefinition{btx:apa:wherefrom-publisher} \texdefinition{btx:apa:url-doi-note} \stopsetups @@ -1483,7 +1525,7 @@ \fastsetup{btx:apa:list:book} \stopsetups -% Use this type when nothing else fits. +% Use this category when nothing else fits. % Required fields: none. % Optional fields: author, title, howpublished, month, year, note. diff --git a/tex/context/base/mkiv/publ-imp-aps.lua b/tex/context/base/mkiv/publ-imp-aps.lua index c15ffe918..f5b33c777 100644 --- a/tex/context/base/mkiv/publ-imp-aps.lua +++ b/tex/context/base/mkiv/publ-imp-aps.lua @@ -412,6 +412,10 @@ categories.unpublished = { -- like misc below but includes organization. categories.electronic = { + sets = { + author = { "author", "collaboration", "organization", }, + howpublished = { "howpublished", "doi", "url", }, + }, required = { "title" }, @@ -420,8 +424,8 @@ categories.electronic = { "year", "month", "author", "collaboration", - "address", "organization", + "address", "howpublished", "doi", "url", "note", }, @@ -430,6 +434,10 @@ categories.electronic = { -- use this type when nothing else fits. categories.misc = { + sets = { + author = { "author", "collaboration", }, + howpublished = { "howpublished", "doi", "url", }, + }, required = { -- nothing is really important here }, diff --git a/tex/context/base/mkiv/publ-imp-aps.mkvi b/tex/context/base/mkiv/publ-imp-aps.mkvi index e9cbd7aaf..4180b6491 100644 --- a/tex/context/base/mkiv/publ-imp-aps.mkvi +++ b/tex/context/base/mkiv/publ-imp-aps.mkvi @@ -283,6 +283,10 @@ [aps:\s!cite] \definebtx + [aps:\s!cite:organization] + [aps:\s!cite] + +\definebtx [aps:\s!cite:authoryear] [aps:\s!cite:author] [\c!left={(}, @@ -551,9 +555,9 @@ \startsetups [btx:aps:list:page-or-pages] \ifx\currentbtxlastpage\empty - \btxlabeltext{p}. + \btxlabeltext{p} \else - \btxlabeltext{pp}. + \btxlabeltext{pp} \fi \btxnbsp \stopsetups @@ -651,6 +655,16 @@ \btxcomma \stoptexdefinition +\starttexdefinition unexpanded btx:aps:organization-if-not-author + \btxdoif {organization} { + \doifnot {\btxfoundname{author}} {organization} { + \btxspace + \btxflush{organization} + \btxcomma + } + } +\stoptexdefinition + \starttexdefinition unexpanded btx:aps:editor-in \btxdoif {booktitle} { \btxlabeltext{In} @@ -903,6 +917,7 @@ \texdefinition{btx:aps:title} \texdefinition{btx:aps:editor-in} \texdefinition{btx:aps:editionset} + %\texdefination{btx:aps:organization-if-not-author}% first check publ-imp-aps.lua \btxdoif {organization} { \btxspace \btxflush{organization} @@ -1035,11 +1050,7 @@ \startsetups btx:aps:list:electronic \texdefinition{btx:aps:author} \texdefinition{btx:aps:title} - \btxdoif {organization} { - \btxspace - \btxflush{organization} - \btxcomma - } + \texdefinition{btx:aps:organization-if-not-author} \btxdoif {howpublished} { \texdefinition{btx:aps:doi-url} {\btxspace\btxflush{howpublished}} } diff --git a/tex/context/base/mkiv/publ-imp-cite.mkvi b/tex/context/base/mkiv/publ-imp-cite.mkvi index be23326b8..8fe96429d 100644 --- a/tex/context/base/mkiv/publ-imp-cite.mkvi +++ b/tex/context/base/mkiv/publ-imp-cite.mkvi @@ -62,23 +62,25 @@ \stopsetups \startsetups btx:cite:lefttext - \ifx\currentbtxlefttext\empty - \else - \setbtxparameterset{\s!cite}{lefttext} - \btxparameter\c!left - \currentbtxlefttext - \btxparameter\c!right + \ifx\currentbtxlefttext\empty \else + \startbtxrunningstyleandcolor + \setbtxparameterset{\s!cite}{lefttext} + \btxparameter\c!left + \currentbtxlefttext + \btxparameter\c!right + \stopbtxrunningstyleandcolor \fi \stopsetups \startsetups btx:cite:righttext - \ifx\currentbtxrighttext\empty - \else - \setbtxparameterset{\s!cite}{righttext} - \btxparameter\c!left - \currentbtxrighttext - \btxparameter\c!right - \fi + \ifx\currentbtxrighttext\empty \else + \startbtxrunningstyleandcolor + \setbtxparameterset{\s!cite}{righttext} + \btxparameter\c!left + \currentbtxrighttext + \btxparameter\c!right + \stopbtxrunningstyleandcolor + \fi \stopsetups \startsetups btx:cite:invalid @@ -86,44 +88,17 @@ {\tt <\currentbtxreference>} \stopsetups -\starttexdefinition unexpanded btx:cite:concat - \btxparameter{\c!separator:\number\currentbtxconcat} -\stoptexdefinition +\startsetups btx:cite:concat + \startbtxrunningstyleandcolor + \btxparameter{\c!separator:\number\currentbtxconcat} + \stopbtxrunningstyleandcolor +\stopsetups % when we have an author-year combination, the first and seconds is not % fields data but something more complex (that itself calls for a setup) -% \startsetups btx:cite:normal -% \texdefinition{\s!btx:\s!cite:concat} -% \currentbtxlefttext -% \ifx\currentbtxfirst\empty -% \fastsetup{\s!btx:\s!cite:\s!empty} -% \else -% \texdefinition {\s!btx:\s!cite:inject} { -% \btxcitereference -% \btxusecommand [\currentbtxspecification:cite:\currentbtxcitealternative] { -% \currentbtxfirst -% } -% } -% \ifx\currentbtxsecond\empty -% \btxflushsuffix -% \else -% \btxparameter\c!inbetween -% \texdefinition {\s!btx:\s!cite:inject} { -% \btxusecommand [\currentbtxspecification:cite:\currentbtxcitealternative] { -% \currentbtxsecond -% } -% } -% % quite likely an error -% \btxflushsuffix -% \fi -% \fi -% \currentbtxrighttext -% \stopsetups - \startsetups btx:cite:normal - \texdefinition{\s!btx:\s!cite:concat} - %\currentbtxlefttext + \fastsetup{\s!btx:\s!cite:concat} \fastsetup{\s!btx:\s!cite:lefttext} \ifx\currentbtxfirst\empty \fastsetup{\s!btx:\s!cite:\s!empty} @@ -136,21 +111,6 @@ } } \else - % \texdefinition {\s!btx:\s!cite:inject} { - % \btxcitereference - % \btxusecommand [\currentbtxspecification:cite:\currentbtxcitealternative] { - % \currentbtxfirst - % } - % } - % \btxparameter\c!inbetween - % \texdefinition {\s!btx:\s!cite:inject} { - % \btxusecommand [\currentbtxspecification:cite:\currentbtxcitealternative] { - % \currentbtxsecond - % } - % } - % \btxflushsuffix - % - % probably better: \texdefinition {\s!btx:\s!cite:inject} { \btxcitereference \btxusecommand [\currentbtxspecification:cite:\currentbtxcitealternative] { @@ -161,13 +121,11 @@ } } \fi\fi - %\currentbtxrighttext \fastsetup{\s!btx:\s!cite:righttext} \stopsetups \startsetups btx:cite:range - \texdefinition{\s!btx:\s!cite:concat} - %\currentbtxlefttext + \fastsetup{\s!btx:\s!cite:concat} \fastsetup{\s!btx:\s!cite:lefttext} \ifx\currentbtxfirst\empty \fastsetup{\s!btx:\s!cite:\s!empty} @@ -184,15 +142,13 @@ } } \fi - %\currentbtxrighttext \fastsetup{\s!btx:\s!cite:righttext} \stopsetups % somehow related to keywords: \startsetups btx:cite:listelement - \texdefinition{\s!btx:\s!cite:concat} - %\currentbtxlefttext + \fastsetup{\s!btx:\s!cite:concat} \fastsetup{\s!btx:\s!cite:lefttext} \ifx\currentbtxfirst\empty \fastsetup{\s!btx:\s!cite:\s!empty} @@ -202,16 +158,13 @@ \currentbtxfirst } \fi - %\currentbtxrighttext \fastsetup{\s!btx:\s!cite:righttext} \stopsetups \startsetups \s!btx:\s!cite:entry - \texdefinition{\s!btx:\s!cite:concat} - %\currentbtxlefttext + \fastsetup{\s!btx:\s!cite:concat} \fastsetup{\s!btx:\s!cite:lefttext} \btxhandleciteentry - %\currentbtxrighttext \fastsetup{\s!btx:\s!cite:righttext} \stopsetups @@ -279,6 +232,9 @@ \startsetups \s!btx:\s!cite:pages \fastsetup{\s!btx:\s!cite:range} \stopsetups +\startsetups \s!btx:\s!cite:organization + \fastsetup{\s!btx:\s!cite:range} +\stopsetups % is the next one used? % Yes, bibtex is a mess and one can have pages or sometimes page diff --git a/tex/context/base/mkiv/publ-imp-default.lua b/tex/context/base/mkiv/publ-imp-default.lua index 61b08f30c..f77121c16 100644 --- a/tex/context/base/mkiv/publ-imp-default.lua +++ b/tex/context/base/mkiv/publ-imp-default.lua @@ -101,6 +101,7 @@ return { "title", "keywords", "journal", "volume", "number", "pages", + "note", }, }, book = { @@ -109,15 +110,16 @@ return { editionset = { "edition", "volume", "number" }, }, required = { - "author", -- a set "title", "year", }, optional = { + "author", -- a set "subtitle", "keywords", "publisher", "address", "editionset", + "note", }, }, }, diff --git a/tex/context/base/mkiv/publ-imp-default.mkvi b/tex/context/base/mkiv/publ-imp-default.mkvi index 564bfcf4e..22638c900 100644 --- a/tex/context/base/mkiv/publ-imp-default.mkvi +++ b/tex/context/base/mkiv/publ-imp-default.mkvi @@ -46,7 +46,7 @@ [\s!default:\s!cite] [\s!default] [\c!alternative=num, - [\c!compress=\v!yes, + \c!compress=\v!yes, \c!sorttype=normal, \c!authorconversion=\v!name] diff --git a/tex/context/base/mkiv/publ-imp-list.mkvi b/tex/context/base/mkiv/publ-imp-list.mkvi index 68ccaef01..b00c4bd40 100644 --- a/tex/context/base/mkiv/publ-imp-list.mkvi +++ b/tex/context/base/mkiv/publ-imp-list.mkvi @@ -13,8 +13,34 @@ \unprotect -\starttexdefinition unexpanded btx:list:inject #content - \ifconditional\btxinteractive +\starttexdefinition unexpanded btx:list:inject:text #content + \ifconditional\btxinteractivetext + \ifx\currentbtxinternal\empty + #content + \else + \goto { + #content + } [ + \s!internal(\currentbtxinternal) + ] + \fi + \else + #content + \fi +\stoptexdefinition + +\startsetups \s!btx:\s!list:text + \texdefinition {\s!btx:\s!list:inject:text} { + \btxflushlisttext + \ifx\currentbtxcombis\empty \else + \btxrenderingparameter\c!separator + \btxflushlistcombis + \fi + } +\stopsetups + +\starttexdefinition unexpanded btx:list:inject:number #content + \ifconditional\btxinteractivenumber \ifx\currentbtxinternal\empty #content \else @@ -33,64 +59,39 @@ \space \stoptexdefinition -\startsetups[\s!btx:\s!list:\s!page] - \texdefinition{\s!btx:\s!list:concat} - \texdefinition{\s!btx:\s!list:inject} { - % real pagenumber: todo, userpage - \currentbtxfirst - % order - \high{\currentbtxsecond} - } -\stopsetups - \startsetups[\s!btx:\s!list:\s!numbering] - \texdefinition {\s!btx:\s!list:inject} { + \texdefinition {\s!btx:\s!list:inject:number} { \currentbtxfirst \btxparameter\c!stopper } \stopsetups -% Hans: can the following setups be condensed to one using some variable? - -\startsetups[\s!btx:\s!list:\s!numbering:default] - \btxstartstyleandcolor [\currentbtxspecification:\s!list:\s!numbering:default] - \btxusecommand[\currentbtxspecification:\s!list:\s!numbering:default] { +\starttexdefinition unexpanded btx:list:numbering #variant + \btxstartstyleandcolor [\currentbtxspecification:\s!list:\s!numbering:#variant] + \btxusecommand[\currentbtxspecification:\s!list:\s!numbering:#variant] { \fastsetup{\s!btx:\s!list:\s!numbering} } \btxstopstyleandcolor +\stoptexdefinition + +\startsetups[\s!btx:\s!list:\s!numbering:default] + \texdefinition {\s!btx:\s!list:\s!numbering} {default} \stopsetups \startsetups[\s!btx:\s!list:\s!numbering:num] - \btxstartstyleandcolor [\currentbtxspecification:\s!list:\s!numbering:num] - \btxusecommand[\currentbtxspecification:\s!list:\s!numbering:num] { - \fastsetup{\s!btx:\s!list:\s!numbering} - } - \btxstopstyleandcolor + \texdefinition {\s!btx:\s!list:\s!numbering} {num} \stopsetups \startsetups[\s!btx:\s!list:\s!numbering:short] - \btxstartstyleandcolor [\currentbtxspecification:\s!list:\s!numbering:short] - \btxusecommand [\currentbtxspecification:\s!list:\s!numbering:short] { - \fastsetup{\s!btx:\s!list:\s!numbering} - \btxflushsuffix - } - \btxstopstyleandcolor + \texdefinition {\s!btx:\s!list:\s!numbering} {short} \stopsetups \startsetups[\s!btx:\s!list:\s!numbering:tag] - \btxstartstyleandcolor [\currentbtxspecification:\s!list:\s!numbering:tag] - \btxusecommand [\currentbtxspecification:\s!list:\s!numbering:tag] { - \fastsetup{\s!btx:\s!list:\s!numbering} - } - \btxstopstyleandcolor + \texdefinition {\s!btx:\s!list:\s!numbering} {tag} \stopsetups \startsetups[\s!btx:\s!list:\s!numbering:index] - \btxstartstyleandcolor [\currentbtxspecification:\s!list:\s!numbering:index] - \btxusecommand [\currentbtxspecification:\s!list:\s!numbering:index] { - \fastsetup{\s!btx:\s!list:\s!numbering} - } - \btxstopstyleandcolor + \texdefinition {\s!btx:\s!list:\s!numbering} {index} \stopsetups \protect diff --git a/tex/context/base/mkiv/publ-imp-page.mkvi b/tex/context/base/mkiv/publ-imp-page.mkvi index 2d9040b10..5bcfe6ea3 100644 --- a/tex/context/base/mkiv/publ-imp-page.mkvi +++ b/tex/context/base/mkiv/publ-imp-page.mkvi @@ -24,7 +24,7 @@ \startsetups [\s!btx:\s!list:\s!page] \fastsetup{\s!btx:\s!list:\s!page:concat} \fastsetup{\s!btx:\currentbtxspecification:\s!list:page-or-pages} - \ifconditional\btxinteractive + \ifconditional\btxinteractivepage \goto { \currentbtxfirstpage } [ diff --git a/tex/context/base/mkiv/publ-ini.lua b/tex/context/base/mkiv/publ-ini.lua index 52642c89d..038a15d5a 100644 --- a/tex/context/base/mkiv/publ-ini.lua +++ b/tex/context/base/mkiv/publ-ini.lua @@ -57,6 +57,8 @@ local enhancers = publications.enhancers local tracers = publications.tracers or { } publications.tracers = tracers +local setmacro = interfaces.setmacro -- todo +local setcounter = tex.setcounter -- todo local variables = interfaces.variables local v_local = variables["local"] @@ -77,10 +79,6 @@ local v_dataset = variables.dataset local conditionals = tex.conditionals -local logsnewline = logs.newline -local logspushtarget = logs.pushtarget -local logspoptarget = logs.poptarget - local isdefined = tex.isdefined ----- basicsorter = sorters.basicsorter -- (a,b) @@ -109,7 +107,6 @@ local ctx_doifnot = commands.doifnot local ctx_gobbletwoarguments = context.gobbletwoarguments local ctx_btxhandlelistentry = context.btxhandlelistentry -local ctx_btxhandlelisttextentry = context.btxhandlelisttextentry local ctx_btxhandlecombientry = context.btxhandlecombientry local ctx_btxchecklistentry = context.btxchecklistentry @@ -119,13 +116,8 @@ local ctx_btxsetnumber = context.btxsetnumber local ctx_btxsetlanguage = context.btxsetlanguage local ctx_btxsetcombis = context.btxsetcombis local ctx_btxsetcategory = context.btxsetcategory -local ctx_btxcitesetup = context.btxcitesetup -local ctx_btxsubcitesetup = context.btxsubcitesetup -local ctx_btxnumberingsetup = context.btxnumberingsetup -local ctx_btxpagesetup = context.btxpagesetup local ctx_btxsetfirst = context.btxsetfirst local ctx_btxsetsecond = context.btxsetsecond ------ ctx_btxsetthird = context.btxsetthird local ctx_btxsetsuffix = context.btxsetsuffix local ctx_btxsetinternal = context.btxsetinternal local ctx_btxsetlefttext = context.btxsetlefttext @@ -133,12 +125,31 @@ local ctx_btxsetrighttext = context.btxsetrighttext local ctx_btxsetbefore = context.btxsetbefore local ctx_btxsetafter = context.btxsetafter local ctx_btxsetbacklink = context.btxsetbacklink -local ctx_btxsetcount = context.btxsetcount -local ctx_btxsetconcat = context.btxsetconcat -local ctx_btxsetfirstpage = context.btxsetfirstpage -local ctx_btxsetlastpage = context.btxsetlastpage local ctx_btxsetfirstinternal = context.btxsetfirstinternal local ctx_btxsetlastinternal = context.btxsetlastinternal +local ctx_btxsetauthorfield = context.btxsetauthorfield + +-- local ctx_btxsetdataset = function(s) setmacro("currentbtxdataset", s) end -- context.btxsetdataset +-- local ctx_btxsettag = function(s) setmacro("currentbtxtag", s) end -- context.btxsettag +-- local ctx_btxsetnumber = function(s) setmacro("currentbtxnumber", s) end -- context.btxsetnumber +-- local ctx_btxsetlanguage = function(s) setmacro("currentbtxlanguage", s) end -- context.btxsetlanguage +-- local ctx_btxsetcombis = function(s) setmacro("currentbtxcombis", s) end -- context.btxsetcombis +-- local ctx_btxsetcategory = function(s) setmacro("currentbtxcategory", s) end -- context.btxsetcategory +-- local ctx_btxsetfirst = function(s) setmacro("currentbtxfirst", s) end -- context.btxsetfirst +-- local ctx_btxsetsecond = function(s) setmacro("currentbtxsecond", s) end -- context.btxsetsecond +-- local ctx_btxsetsuffix = function(s) setmacro("currentbtxsuffix", s) end -- context.btxsetsuffix +-- local ctx_btxsetinternal = function(s) setmacro("currentbtxinternal", s) end -- context.btxsetinternal +-- local ctx_btxsetlefttext = function(s) setmacro("currentbtxlefttext", s) end -- context.btxsetlefttext +-- local ctx_btxsetrighttext = function(s) setmacro("currentbtxrighttext", s) end -- context.btxsetrighttext +-- local ctx_btxsetbefore = function(s) setmacro("currentbtxbefore", s) end -- context.btxsetbefore +-- local ctx_btxsetafter = function(s) setmacro("currentbtxafter", s) end -- context.btxsetafter +-- local ctx_btxsetbacklink = function(s) setmacro("currentbtxbacklink", s) end -- context.btxsetbacklink +-- local ctx_btxsetfirstinternal = function(s) setmacro("currentbtxfirstinternal", s) end -- context.btxsetfirstinternal +-- local ctx_btxsetlastinternal = function(s) setmacro("currentbtxlastinternal", s) end -- context.btxsetlastinternal + +local ctx_btxsetfirstpage = context.btxsetfirstpage +local ctx_btxsetlastpage = context.btxsetlastpage + local ctx_btxstartcite = context.btxstartcite local ctx_btxstopcite = context.btxstopcite local ctx_btxstartciteauthor = context.btxstartciteauthor @@ -149,12 +160,22 @@ local ctx_btxstartlistentry = context.btxstartlistentry local ctx_btxstoplistentry = context.btxstoplistentry local ctx_btxstartcombientry = context.btxstartcombientry local ctx_btxstopcombientry = context.btxstopcombientry -local ctx_btxlistsetup = context.btxlistsetup + local ctx_btxflushauthor = context.btxflushauthor + local ctx_btxsetnoflistentries = context.btxsetnoflistentries local ctx_btxsetcurrentlistentry = context.btxsetcurrentlistentry local ctx_btxsetcurrentlistindex = context.btxsetcurrentlistindex +local ctx_btxsetcount = context.btxsetcount +local ctx_btxsetconcat = context.btxsetconcat + +local ctx_btxcitesetup = context.btxcitesetup +local ctx_btxsubcitesetup = context.btxsubcitesetup +local ctx_btxnumberingsetup = context.btxnumberingsetup +local ctx_btxpagesetup = context.btxpagesetup +local ctx_btxlistsetup = context.btxlistsetup + local trialtypesetting = context.trialtypesetting languages.data = languages.data or { } @@ -199,15 +220,13 @@ statistics.register("publications load time", function() end end) -luatex.registerstopactions(function() - local done = false +logs.registerfinalactions(function() + local done = false + local unknown = false for name, dataset in sortedhash(datasets) do for command, n in sortedhash(dataset.commands) do if not done then - logspushtarget("logfile") - logsnewline() - report("start used btx commands") - logsnewline() + logs.startfilelogging(report,"used btx commands") done = true end if isdefined[command] then @@ -216,14 +235,23 @@ luatex.registerstopactions(function() report("%-20s %-20s % 5i %s",name,command,n,"KNOWN") else report("%-20s %-20s % 5i %s",name,command,n,"unknown") + unknown = true end end end if done then - logsnewline() - report("stop used btx commands") - logsnewline() - logspoptarget() + logs.stopfilelogging() + end + if unknown and logs.loggingerrors() then + logs.starterrorlogging(report,"unknown btx commands") + for name, dataset in sortedhash(datasets) do + for command, n in sortedhash(dataset.commands) do + if not isdefined[command] and not isdefined[upper(command)] then + report("%-20s %-20s % 5i %s",name,command,n,"unknown") + end + end + end + logs.stoperrorlogging() end end) @@ -334,7 +362,7 @@ local listtolist = nil do - local initialize = nil + local initialize = nil -- we delay initialize = function(t) usedentries = allocate { } @@ -342,86 +370,75 @@ do listtocite = allocate { } listtolist = allocate { } local names = { } - local internals = structures.references.internals local p_collect = (C(R("09")^1) * Carg(1) / function(s,entry) listtocite[tonumber(s)] = entry end + P(1))^0 local nofunique = 0 local nofreused = 0 - for i=1,#internals do - local entry = internals[i] - if entry then - local metadata = entry.metadata - if metadata then - local kind = metadata.kind - if kind == "full" then - -- reference (in list) - local userdata = entry.userdata - if userdata then - local tag = userdata.btxref - if tag then - local set = userdata.btxset or v_default - local s = usedentries[set] - if s then - local u = s[tag] - if u then - u[#u+1] = entry - else - s[tag] = { entry } - end - nofreused = nofreused + 1 - else - usedentries[set] = { [tag] = { entry } } - nofunique = nofunique + 1 - end - -- alternative: collect prev in group - local bck = userdata.btxbck - if bck then - lpegmatch(p_collect,bck,1,entry) -- for s in string.gmatch(bck,"[^ ]+") do listtocite[tonumber(s)] = entry end - local lst = tonumber(userdata.btxlst) - if lst then - listtolist[lst] = entry - end + -- local internals = references.sortedinternals -- todo: when we need it more than once + -- for i=1,#internals do -- but currently we don't do this when not + -- local entry = internals[i] -- needed anyway so ... + local internals = structures.references.internals + for i, entry in sortedhash(internals) do + local metadata = entry.metadata + if metadata then + local kind = metadata.kind + if kind == "full" then + -- reference (in list) + local userdata = entry.userdata + if userdata then + local tag = userdata.btxref + if tag then + local set = userdata.btxset or v_default + local s = usedentries[set] + if s then + local u = s[tag] + if u then + u[#u+1] = entry else - local int = tonumber(userdata.btxint) - if int then - listtocite[int] = entry - end + s[tag] = { entry } end - local detail = datasets[set].details[tag] --- todo: these have to be pluggable - if detail then - local author = detail.author - if author then - for i=1,#author do - local a = author[i] - local s = a.surnames - if s then - local c = concat(s,"+") - local n = names[c] - if n then - n[#n+1] = a - break - else - names[c] = { a } - end + nofreused = nofreused + 1 + else + usedentries[set] = { [tag] = { entry } } + nofunique = nofunique + 1 + end + -- alternative: collect prev in group + local int = tonumber(userdata.btxint) + if int then + listtocite[int] = entry + end + local detail = datasets[set].details[tag] + -- todo: these have to be pluggable + if detail then + local author = detail.author + if author then + for i=1,#author do + local a = author[i] + local s = a.surnames + if s then + local c = concat(s,"+") + local n = names[c] + if n then + n[#n+1] = a + break + else + names[c] = { a } end end end end end end - elseif kind == "btx" or kind == "userdata" then -- will go: kind == "userdata" - -- list entry (each cite) - local userdata = entry.userdata - if userdata then - local int = tonumber(userdata.btxint) - if int then - citetolist[int] = entry - end + end + elseif kind == "btx" then + -- list entry (each cite) + local userdata = entry.userdata + if userdata then + local int = tonumber(userdata.btxint) + if int then + citetolist[int] = entry end end end - else - -- weird end end for k, v in sortedhash(names) do @@ -440,7 +457,7 @@ do end end if trace_detail then - report("%s unique bibentries: %s reused entries",nofunique,nofreused) + report("%s unique references, %s reused entries",nofunique,nofreused) end initialize = nil end @@ -471,7 +488,7 @@ end local findallused do local reported = { } - local finder = publications.finder + ----- finder = publications.finder findallused = function(dataset,reference,internal,forcethem) local current = datasets[dataset] @@ -481,6 +498,7 @@ local findallused do local todo = { } local okay = { } -- only if mark local allused = usedentries[dataset] or { } + -- local allused = usedentries[dataset] -- only test local luadata = current.luadata local details = current.details local ordered = current.ordered @@ -585,45 +603,69 @@ local findallused do end end end - else - if find then - tags = { } - for i=1,#ordered do - local entry = ordered[i] - if find(entry) then - local tag = entry.tag - local parent = details[tag].parent - if parent then - tag = parent - end - tags[#tags+1] = tag - todo[tag] = true - end - end - if #tags == 0 and not reported[reference] then - tags[1] = reference - reported[reference] = true - end - else - for i=1,#tags do - local tag = tags[i] + elseif find then + tags = { } + for i=1,#ordered do + local entry = ordered[i] + if find(entry) then + local tag = entry.tag local parent = details[tag].parent if parent then tag = parent - tags[i] = tag - end - if luadata[tag] then - todo[tag] = true - elseif not reported[tag] then - reported[tag] = true - report_cite("non-existent entry %a in %a",tag,dataset) end + tags[#tags+1] = tag + todo[tag] = true + -- okay[#okay+1] = entry -- only test + end + end + if #tags == 0 and not reported[reference] then + tags[1] = reference + reported[reference] = true + end + else + for i=1,#tags do + local tag = tags[i] + local parent = details[tag].parent + if parent then + tag = parent + tags[i] = tag + end + local entry = luadata[tag] + if entry then + todo[tag] = true + -- okay[#okay+1] = entry -- only test + elseif not reported[tag] then + reported[tag] = true + report_cite("non-existent entry %a in %a",tag,dataset) end end end return okay, todo, tags end + local firstoftwoarguments = context.firstoftwoarguments + local secondoftwoarguments = context.secondoftwoarguments + + implement { + name = "btxdoifelsematches", + arguments = { "string", "string", "string" }, + actions = function(dataset,tag,expression) + local find = publications.finder(dataset,expression) + local okay = false + if find then + local d = datasets[dataset] + if d then + local e = d.luadata[tag] + if e and find(e) then + firstoftwoarguments() + return + end + end + end + secondoftwoarguments() + end + } + end local function unknowncite(reference) @@ -1591,6 +1633,8 @@ end -- lists +local renderings = { } --- per dataset + do publications.lists = publications.lists or { } @@ -1604,8 +1648,6 @@ do -- per rendering - local renderings = { } --- per dataset - setmetatableindex(renderings,function(t,k) local v = { list = { }, @@ -1795,6 +1837,7 @@ do end local method = specification.method or v_none local ignored = specification.ignored or "" + local filter = specification.filter or "" rendering.method = method rendering.ignored = ignored ~= "" and settings_to_set(ignored) or nil rendering.list = { } @@ -1819,6 +1862,24 @@ do end filtermethod(dataset,rendering,keyword) local list = rendering.list + if list and filter ~= "" then + local find = publications.finder(dataset,filter) + if find then + local luadata = datasets[dataset].luadata + local matched = 0 + for i=1,#list do + local found = list[i] + local entry = luadata[found[1]] + if find(entry) then + matched = matched + 1 + list[matched] = found + end + end + for i=#list,matched + 1,-1 do + list[i] = nil + end + end + end ctx_btxsetnoflistentries(list and #list or 0) end @@ -2115,7 +2176,12 @@ do end end - function lists.flushentry(dataset,i,textmode) + function lists.flushtag(dataset,i) + local li = renderings[dataset].list[i] + ctx_btxsettag(li and li[1] or "") + end + + function lists.flushentry(dataset,i) local rendering = renderings[dataset] local list = rendering.list local li = list[i] @@ -2140,6 +2206,18 @@ do ctx_btxsetcategory(entry.category or "unknown") ctx_btxsettag(tag) ctx_btxsetnumber(n) + -- + local citation = citetolist[n] + if citation then + local references = citation.references + if references then + local internal = references.internal + if internal and internal > 0 then + ctx_btxsetinternal(internal) + end + end + end + -- if language then ctx_btxsetlanguage(language) end @@ -2163,11 +2241,7 @@ do ctx_btxsetsuffix(authorsuffix) end rendering.userdata = userdata - if textmode then - ctx_btxhandlelisttextentry() - else - ctx_btxhandlelistentry() - end + ctx_btxhandlelistentry() ctx_btxstoplistentry() -- -- context(function() @@ -2234,6 +2308,7 @@ do { "repeated" }, { "ignored" }, { "group" }, + { "filter" }, } } } @@ -2257,6 +2332,12 @@ do } implement { + name = "btxflushlisttag", + actions = lists.flushtag, + arguments = { "string", "integer" } + } + + implement { name = "btxflushlistcombi", actions = lists.flushcombi, arguments = { "string", "string" } @@ -2281,10 +2362,44 @@ do local citevariants = { } publications.citevariants = citevariants + local function btxvalidcitevariant(dataset,variant) + local citevariant = rawget(citevariants,variant) + if citevariant then + return citevariant + end + local s = datasets[dataset] + if s then + s = s.specifications + end + if s then + for k, v in sortedhash(s) do + s = k + break + end + end + if s then + s = specifications[s] + end + if s then + s = s.types + end + if s then + variant = s[variant] + if variant then + citevariant = rawget(citevariants,variant) + end + if citevariant then + return citevariant + end + end + return citevariants.default + end + local function btxhandlecite(specification) local dataset = specification.dataset or v_default local reference = specification.reference local variant = specification.variant + -- if not variant or variant == "" then variant = "default" end @@ -2323,7 +2438,9 @@ do -- ctx_btxsetdataset(dataset) -- - citevariants[variant](specification) -- we always fall back on default + local citevariant = btxvalidcitevariant(dataset,variant) + -- + citevariant(specification) -- we always fall back on default end local function btxhandlenocite(specification) @@ -2449,24 +2566,26 @@ do for i=1,#source do local entry = source[i] local current = entry.sortkey -- so we need a sortkey ! - if entry.suffix then - if not first then - first, last, firstr, lastr = current, current, entry, entry - else - flushrange() - first, last, firstr, lastr = current, current, entry, entry - end - else - if not first then - first, last, firstr, lastr = current, current, entry, entry - elseif current == last + 1 then - last, lastr = current, entry + if type(current) == "number" then + if entry.suffix then + if not first then + first, last, firstr, lastr = current, current, entry, entry + else + flushrange() + first, last, firstr, lastr = current, current, entry, entry + end else - flushrange() - first, last, firstr, lastr = current, current, entry, entry + if not first then + first, last, firstr, lastr = current, current, entry, entry + elseif current == last + 1 then + last, lastr = current, entry + else + flushrange() + first, last, firstr, lastr = current, current, entry, entry + end end + tags[#tags+1] = entry.tag end - tags[#tags+1] = entry.tag end if first and last then flushrange() @@ -2519,15 +2638,14 @@ do local setter = specification.setter local compressor = specification.compressor local method = specification.method + local varfield = specification.varfield -- local reference = publications.parenttag(dataset,reference) -- local found, todo, list = findallused(dataset,reference,internal,method == v_text or method == v_always) -- also when not in list -- --- inspect(found) --- inspect(todo) --- inspect(list) if not found or #found == 0 then +-- if not list or #list == 0 then report("no entry %a found in dataset %a",reference,dataset) elseif not setup then report("invalid reference for %a",reference) @@ -2549,6 +2667,7 @@ do language = ldata.language, dataset = dataset, tag = tag, + varfield = varfield, -- combis = entry.userdata.btxcom, -- luadata = ldata, } @@ -2579,6 +2698,11 @@ do ctx_btxsettag(tag) ctx_btxsetcategory(entry.category or "unknown") -- + local language = entry.language + if language then + ctx_btxsetlanguage(language) + end + -- if lefttext then local text = lefttext [i] ; if text and text ~= "" then ctx_btxsetlefttext (text) end end if righttext then local text = righttext[i] ; if text and text ~= "" then ctx_btxsetrighttext(text) end end if before then local text = before [i] ; if text and text ~= "" then ctx_btxsetbefore (text) end end @@ -2589,11 +2713,12 @@ do local bl = listtocite[currentcitation] if bl then -- we refer to a coming list entry - ctx_btxsetinternal(bl.references.internal or "") + bl = bl.references.internal else -- we refer to a previous list entry - ctx_btxsetinternal(entry.internal or "") + bl = entry.internal end + ctx_btxsetinternal(bl and bl > 0 and bl or "") end local language = entry.language if language then @@ -2665,11 +2790,15 @@ do local function simplegetter(first,last,field,specification) local value = first[field] if value then - ctx_btxsetfirst(value) - if last then - ctx_btxsetsecond(last[field]) + if type(value) == "string" then + ctx_btxsetfirst(value) + if last then + ctx_btxsetsecond(last[field]) + end + return true + else + report("missing data type definition for %a",field) end - return true end end @@ -2982,11 +3111,6 @@ do return keysorter(b,a) end - local currentbtxciteauthor = function() - context.currentbtxciteauthor() - return true -- needed? - end - local function authorcompressor(found,specification) -- HERE if specification.sorttype == v_normal then @@ -3080,10 +3204,6 @@ do ctx_btxstartciteauthor() local tag = entry.tag ctx_btxsettag(tag) - -- local currentcitation = markcite(entry.dataset,tag) - -- ctx_btxsetbacklink(currentcitation) - -- local bl = listtocite[currentcitation] - -- ctx_btxsetinternal(bl and bl.references.internal or "") ctx_btxsetfirst(entry[key] or "") -- f_missing(tag) if suffix then ctx_btxsetsuffix(entry.suffix) @@ -3098,9 +3218,13 @@ do local partialinteractive = false + local currentbtxciteauthor = function() + context.currentbtxciteauthorbyfield() + return true -- needed? + end + local function authorgetter(first,last,key,specification) -- only first - -- ctx_btxsetfirst(first.author) -- unformatted - -- ctx_btxsetfirst(currentbtxciteauthor) -- formatter (much slower) + ctx_btxsetauthorfield(first.varfield or "author") if first.type == "author" then ctx_btxsetfirst(currentbtxciteauthor) -- formatter (much slower) else @@ -3127,15 +3251,16 @@ do return true end - -- author + -- author (the varfield hack is for editor and translator i.e author type) local function setter(data,dataset,tag,entry) - data.author, data.field, data.type = getcasted(dataset,tag,"author") + data.author, data.field, data.type = getcasted(dataset,tag,data.varfield or "author") data.sortkey = text and lpegmatch(numberonly,text) data.authorhash = getdetail(dataset,tag,"authorhash") -- todo let getcasted return end local function getter(first,last,_,specification) + ctx_btxsetauthorfield(specification.varfield or "author") if first.type == "author" then ctx_btxsetfirst(currentbtxciteauthor) -- formatter (much slower) else @@ -3150,6 +3275,7 @@ do setup = "author", setter = setter, getter = getter, + varfield = presets.variant or "author", compressor = authorcompressor, }) end @@ -3239,7 +3365,10 @@ do local function btxlistvariant(dataset,block,tag,variant,listindex) local action = listvariants[variant] or listvariants.default if action then - action(dataset,block,tag,variant,tonumber(listindex) or 0) + listindex = tonumber(listindex) + if listindex then + action(dataset,block,tag,variant,listindex) + end end end @@ -3299,33 +3428,6 @@ do ctx_btxnumberingsetup(variant or "short") end - function listvariants.page(dataset,block,tag,variant,listindex) - local rendering = renderings[dataset] - local specification = rendering.list[listindex] - for i=3,#specification do - local backlink = tonumber(specification[i]) - if backlink then - local citation = citetolist[backlink] - if citation then - local references = citation.references - if references then - local internal = references.internal - local realpage = references.realpage - if internal and realpage then - ctx_btxsetconcat(i-2) - ctx_btxsetfirst(realpage) - ctx_btxsetsecond(backlink) - if trace_detail then - report("expanding %a list setup %a","page",variant) - end - ctx_btxlistsetup(variant) - end - end - end - end - end - end - end -- a helper @@ -3336,7 +3438,7 @@ do -- local lpegmatch = lpeg.match local splitter = lpeg.tsplitat(":") - interfaces.implement { + implement { name = "checkinterfacechain", arguments = { "string", "string" }, actions = function(str,command) diff --git a/tex/context/base/mkiv/publ-ini.mkiv b/tex/context/base/mkiv/publ-ini.mkiv index 5f9aaa692..9f970547d 100644 --- a/tex/context/base/mkiv/publ-ini.mkiv +++ b/tex/context/base/mkiv/publ-ini.mkiv @@ -45,15 +45,15 @@ \writestatus{loading}{ConTeXt Publication Support / Initialization} -\registerctxluafile{publ-dat}{1.001} -\registerctxluafile{publ-ini}{1.001} -\registerctxluafile{publ-sor}{1.001} -\registerctxluafile{publ-aut}{1.001} -\registerctxluafile{publ-usr}{1.001} -\registerctxluafile{publ-oth}{1.001} % this could become an option -\registerctxluafile{publ-fnd}{1.001} % new method (for the moment only local) -\registerctxluafile{publ-jrn}{1.001} -\registerctxluafile{publ-reg}{1.001} +\registerctxluafile{publ-dat}{} +\registerctxluafile{publ-ini}{} +\registerctxluafile{publ-sor}{} +\registerctxluafile{publ-aut}{} +\registerctxluafile{publ-usr}{} +\registerctxluafile{publ-oth}{} % this could become an option +\registerctxluafile{publ-fnd}{} % new method (for the moment only local) +\registerctxluafile{publ-jrn}{} +\registerctxluafile{publ-reg}{} \unprotect @@ -68,7 +68,6 @@ \def\s!btxset {btxset} \def\s!btxref {btxref} \def\s!btxint {btxint} -\def\s!btxbck {btxbck} \def\s!btxltx {btxltx} \def\s!btxrtx {btxrtx} \def\s!btxatx {btxatx} @@ -224,8 +223,7 @@ \installcommandhandler \??btxregister {btxregister} \??btxregister \installcommandhandler \??btxrendering {btxrendering} \??btxrendering -\let\currentbtxcitealternative\empty - +\let\currentbtxcitealternative \empty \let\currentbtxspecificationfallback\empty \unexpanded\def\setbtxparameterset#1#2% @@ -356,15 +354,6 @@ \unexpanded\def\definebtxcommand#1% {body} #1..#n{body} {\setuvalue{\??btxcommand\csstring#1}}% -% tracing - -\installtextracker - {publications.crosslinks} - {\let\btx_trace_list_cross\strc_references_tracer} - {\let\btx_trace_list_cross\gobbletwoarguments} - -\let\btx_trace_list_cross\gobbletwoarguments - % access \let\currentbtxtag \empty @@ -424,13 +413,11 @@ %D Variables: \let\currentbtxbacklink \empty \unexpanded\def\btxsetbacklink {\def\currentbtxbacklink} -\let\currentbtxbacktrace \empty \unexpanded\def\btxsetbacktrace {\def\currentbtxbacktrace} \let\currentbtxcategory \empty \unexpanded\def\btxsetcategory {\def\currentbtxcategory} \let\currentbtxcombis \empty \unexpanded\def\btxsetcombis {\def\currentbtxcombis} \let\currentbtxdataset \empty \unexpanded\def\btxsetdataset {\def\currentbtxdataset} \let\currentbtxfirst \empty \unexpanded\def\btxsetfirst {\def\currentbtxfirst} \let\currentbtxsecond \empty \unexpanded\def\btxsetsecond {\def\currentbtxsecond} -%let\currentbtxthird \empty \unexpanded\def\btxsetthird {\def\currentbtxthird} \let\currentbtxsuffix \empty \unexpanded\def\btxsetsuffix {\def\currentbtxsuffix} \let\currentbtxinternal \empty \unexpanded\def\btxsetinternal {\def\currentbtxinternal} \let\currentbtxlefttext \empty \unexpanded\def\btxsetlefttext {\def\currentbtxlefttext} @@ -440,13 +427,15 @@ \let\currentbtxlanguage \empty \unexpanded\def\btxsetlanguage {\def\currentbtxlanguage} \let\currentbtxtag \empty \unexpanded\def\btxsettag {\def\currentbtxtag} \let\currentbtxnumber \empty \unexpanded\def\btxsetnumber {\def\currentbtxnumber} -\let\currentbtxauthorvariant\v!normal \unexpanded\def\btxsetauthorvariant{\def\currentbtxauthorvariant} +\let\currentbtxfirstinternal\empty \unexpanded\def\btxsetfirstinternal{\def\currentbtxfirstinternal} +\let\currentbtxlastinternal \empty \unexpanded\def\btxsetlastinternal {\def\currentbtxlastinternal} -\let\currentbtxfirstnames \empty \unexpanded\def\btxsetfirstnames{\let\currentbtxfirstnames\currentbtxfirstnames_indeed} -\let\currentbtxinitials \empty \unexpanded\def\btxsetinitials {\let\currentbtxinitials \currentbtxinitials_indeed } -\let\currentbtxjuniors \empty \unexpanded\def\btxsetjuniors {\let\currentbtxjuniors \currentbtxjuniors_indeed } -\let\currentbtxsurnames \empty \unexpanded\def\btxsetsurnames {\let\currentbtxsurnames \currentbtxsurnames_indeed } -\let\currentbtxvons \empty \unexpanded\def\btxsetvons {\let\currentbtxvons \currentbtxvons_indeed } +\let\currentbtxauthorvariant\v!normal \unexpanded\def\btxsetauthorvariant{\def\currentbtxauthorvariant} +\let\currentbtxfirstnames \empty \unexpanded\def\btxsetfirstnames {\let\currentbtxfirstnames\currentbtxfirstnames_indeed} +\let\currentbtxinitials \empty \unexpanded\def\btxsetinitials {\let\currentbtxinitials \currentbtxinitials_indeed } +\let\currentbtxjuniors \empty \unexpanded\def\btxsetjuniors {\let\currentbtxjuniors \currentbtxjuniors_indeed } +\let\currentbtxsurnames \empty \unexpanded\def\btxsetsurnames {\let\currentbtxsurnames \currentbtxsurnames_indeed } +\let\currentbtxvons \empty \unexpanded\def\btxsetvons {\let\currentbtxvons \currentbtxvons_indeed } \newconstant\currentbtxoverflow \unexpanded\def\btxsetoverflow #1{\currentbtxoverflow #1\relax} \newconstant\currentbtxconcat \unexpanded\def\btxsetconcat #1{\currentbtxconcat #1\relax} @@ -461,10 +450,8 @@ \unexpanded\def\currentbtxsurnames_indeed {\clf_btxcurrentsurnames \numexpr\currentbtxauthorindex\relax} \unexpanded\def\currentbtxvons_indeed {\clf_btxcurrentvons \numexpr\currentbtxauthorindex\relax} -\let\currentbtxfirstpage \empty \unexpanded\def\btxsetfirstpage #1{\def\currentbtxfirstpage{\btx_page_number{#1}}} -\let\currentbtxlastpage \empty \unexpanded\def\btxsetlastpage #1{\def\currentbtxlastpage {\btx_page_number{#1}}} -\let\currentbtxfirstinternal\empty \unexpanded\def\btxsetfirstinternal {\def\currentbtxfirstinternal} -\let\currentbtxlastinternal \empty \unexpanded\def\btxsetlastinternal {\def\currentbtxlastinternal} +\let\currentbtxfirstpage \empty \unexpanded\def\btxsetfirstpage#1{\def\currentbtxfirstpage{\btx_page_number{#1}}} +\let\currentbtxlastpage \empty \unexpanded\def\btxsetlastpage #1{\def\currentbtxlastpage {\btx_page_number{#1}}} \def\currentbtxauthorvariant{normal} @@ -477,7 +464,6 @@ \let\currentbtxbefore \empty \let\currentbtxafter \empty \let\currentbtxbacklink \empty - \let\currentbtxbacktrace\empty \let\currentbtxlanguage \empty \let\currentbtxsuffix \empty %\let\currentbtxdataset \empty % will always be set @@ -494,7 +480,6 @@ \let \currentbtxbefore \empty \let \currentbtxafter \empty \let \currentbtxbacklink \empty - \let \currentbtxbacktrace \empty % not used here \let \currentbtxlanguage \empty %\let \currentbtxdataset \empty % will always be set, beware of local reset ~ %\let \currentbtxtag \empty % will always be set, beware of local reset ~ @@ -576,6 +561,7 @@ [\c!prefixstopper=:, \c!state=\v!start, \c!alternative=a, + \c!interaction=\v!none, %\c!alternative=\v!paragraph, %\c!width=\v!auto, %\c!distance=\emwidth, @@ -635,7 +621,7 @@ \btxparameter\c!right}% \endgroup} -\unexpanded\def\btxpagesetup#1% there will b eno left|right|command|style at this inner level +\unexpanded\def\btxpagesetup#1% there will be no left|right|command|style at this inner level {\begingroup \publ_fast_setup\plusfive\s!list\s!page \endgroup @@ -653,6 +639,22 @@ % end of page stuff +\unexpanded\def\btxflushlisttext + {\begingroup + \usebtxstyleandcolor\c!style\c!color + \ignorespaces + \publ_fast_setup\plusfour\s!list\currentbtxcategory + \removeunwantedspaces + \endgroup} + +\unexpanded\def\btxflushlistcombis + {\begingroup + \processcommacommand[\currentbtxcombis]\btx_entry_inject_combi % maybe in lua + \endgroup} + +\def\btx_entry_inject_list_text + {\publ_fast_setup\plusfour\s!list\s!text} + \unexpanded\def\btx_entry_inject {\begingroup \redoconvertfont % see (**) in strc-lst, this will become an configuration option @@ -661,19 +663,7 @@ \ifconditional\c_btx_list_texts \currentbtxbefore \fi - \begingroup - \usebtxstyleandcolor\c!style\c!color - \ignorespaces - \publ_fast_setup\plusfour\s!list\currentbtxcategory - \removeunwantedspaces - \endgroup - \ifx\currentbtxcombis\empty \else - \btxrenderingparameter\c!separator - % maybe move this loop to lua - \begingroup - \processcommacommand[\currentbtxcombis]\btx_entry_inject_combi - \endgroup - \fi + \btx_entry_inject_list_text \ifconditional\c_btx_list_pages \btx_entry_inject_pages \fi @@ -723,11 +713,12 @@ % \removeunwantedspaces % \endgroup} -\unexpanded\def\completebtxrendering{\dodoubleempty\publ_place_list_complete} \unexpanded\def\placebtxrendering {\dodoubleempty\publ_place_list_standard} +\unexpanded\def\completebtxrendering{\dodoubleempty\publ_place_list_complete} +\unexpanded\def\flushbtxrendering {\dodoubleempty\publ_place_list_special } -\let\completelistofpublications\completebtxrendering -\let\placelistofpublications \placebtxrendering +\let\completelistofpublications\completebtxrendering % for old times sake +\let\placelistofpublications \placebtxrendering % for old times sake \newtoks\everybtxlistrendering @@ -743,6 +734,8 @@ % \iflocation \letinteractionparameter\c!style\empty +% \letinteractionparameter\c!color\empty +% \letinteractionparameter\c!contrastcolor\empty \fi \to \everybtxlistrendering @@ -774,27 +767,27 @@ \let\btxdoifsameaspreviouselse \btxdoifelsesameasprevious \let\btxdoifcombiinlistelse \btxdoifelsecombiinlist -\def\publ_place_list_indeed#1[#2][#3]% +\def\publ_place_list_indeed#1#2[#3][#4]% {\begingroup \ifsecondargument % [rendering] [settings] - \edef\currentbtxrendering{#2}% - \setupcurrentbtxrendering[#3]% + \edef\currentbtxrendering{#3}% + \setupcurrentbtxrendering[#4]% \edef\p_specification{\btxrenderingparameter\c!specification}% \ifx\p_specification\empty\else \let\currentbtxspecification\p_specification \fi \else\iffirstargument - \doifelseassignment{#2} + \doifelseassignment{#3} {% [settings] \let\currentbtxrendering\currentbtxspecification - \setupcurrentbtxrendering[#2]% + \setupcurrentbtxrendering[#3]% \edef\p_specification{\btxrenderingparameter\c!specification}% \ifx\p_specification\empty\else \let\currentbtxspecification\p_specification \let\currentbtxrendering\currentbtxspecification % tricky \fi} - {\edef\currentbtxrendering{#2}% + {\edef\currentbtxrendering{#3}% \edef\p_specification{\btxrenderingparameter\c!specification}% \ifx\p_specification\empty\else \let\currentbtxspecification\p_specification @@ -815,13 +808,11 @@ \ifx\currentbtxrendering\empty \setbtxrendering % hm \fi - \btxrenderingparameter\c!before \edef\currentbtxdataset{\btxrenderingparameter\c!dataset}% \uselanguageparameter\btxdatasetparameter % new \setbtxlist \the\everystructurelist \the\everysetupbtxlistplacement - \forgetall % why not pass this with collect .. todo % here we just collect items \clf_btxcollectlistentries @@ -835,40 +826,135 @@ repeated {\btxrenderingparameter\c!repeat}% ignored {\btxrenderingparameter\c!ignore}% group {\btxrenderingparameter\c!group}% + filter {\btxrenderingparameter\c!filter}% \relax \ifnum\nofbtxlistentries>\zerocount - \startpacked[\v!blank]% - % sorting and so - \clf_btxpreparelistentries{\currentbtxdataset}% could be put in collect - % next we analyze the width - \ifx\currentbtxnumbering\empty \else - \edef\p_width{\listparameter\c!width}% - \ifx\p_width\v!auto - \setbox\scratchbox\vbox \bgroup - \settrialtypesetting - \clf_btxfetchlistentries{\currentbtxdataset}% - \egroup - \d_publ_number_width\wd\scratchbox - \letlistparameter\c!width\d_publ_number_width + \forgetall + \btxrenderingparameter\c!before + \ifconditional#2\relax + \edef\p_command{\btxrenderingparameter\c!command}% + \ifx\p_command\empty + \edef\p_setups{\btxrenderingparameter\c!setups}% + \ifx\p_setups\empty + \else + \directsetup{\p_setups}% + \fi + \else + \expandafter\p_command\expandafter{\number\nofbtxlistentries}\relax \fi + \else + \startpacked[\v!blank]% + % sorting and so + \clf_btxpreparelistentries{\currentbtxdataset}% could be put in collect + % next we analyze the width + \ifx\currentbtxnumbering\empty \else + \edef\p_width{\listparameter\c!width}% + \ifx\p_width\v!auto + \setbox\scratchbox\vbox \bgroup + \settrialtypesetting + \clf_btxfetchlistentries{\currentbtxdataset}% + \egroup + \d_publ_number_width\wd\scratchbox + \letlistparameter\c!width\d_publ_number_width + \fi + \fi + \doifelse{\listparameter\c!prefix}\v!yes\settrue\setfalse\c_publ_prefixed + % this actually typesets them, we loop here as otherwise the whole + % bunch gets flushed at once + \dorecurse\nofbtxlistentries + {\let\currentbtxlistentry\recurselevel + \clf_btxflushlistentry{\currentbtxdataset}\currentbtxlistentry\relax}% + \stoppacked \fi - \doifelse{\listparameter\c!prefix}\v!yes\settrue\setfalse\c_publ_prefixed - % this actually typesets them, we loop here as otherwise the whole - % bunch gets flushed at once - \dorecurse\nofbtxlistentries - {\let\currentbtxlistentry\recurselevel - \clf_btxflushlistentry{\currentbtxdataset}\currentbtxlistentry\relax}% - \stoppacked + \btxrenderingparameter\c!after \fi - \btxrenderingparameter\c!after - \global\advance\btxblock\plusone \ifconditional#1\relax \stopnamedsection \fi + \global\advance\btxblock\plusone \endgroup} -\def\publ_place_list_complete{\publ_place_list_indeed\conditionaltrue} -\def\publ_place_list_standard{\publ_place_list_indeed\conditionalfalse} +\def\publ_place_list_standard{\publ_place_list_indeed\conditionalfalse\conditionalfalse} +\def\publ_place_list_complete{\publ_place_list_indeed\conditionaltrue \conditionalfalse} +\def\publ_place_list_special {\publ_place_list_indeed\conditionalfalse\conditionaltrue} + +%D This is somewhat special (for Alan of course): +%D +%D \starttyping +%D % #1 is number of entries +%D +%D \starttexdefinition unexpanded btx:for:alan:wrapper #1 +%D \bTABLE +%D % we can have a command or setups +%D \flushbtxentries[command=\texdefinition{btx:for:alan:content}] +%D \eTABLE +%D \stoptexdefinition +%D +%D % #1 is tag +%D +%D \starttexdefinition unexpanded btx:for:alan:content #1 +%D \bTR +%D \bTD +%D \btxsettag{#1} +%D \btxfield{name} +%D \eTD +%D \eTR +%D \stoptexdefinition +%D +%D % we can have a command or setups +%D +%D \flushbtxrendering [method=dataset,command=\texdefinition{btx:for:alan:wrapper}] +%D \stoptyping +%D +%D Because we want to be ungrouped we use a special loop construct. + +\unexpanded\def\btxsetlisttag#1% + {\clf_btxflushlisttag{\currentbtxdataset}#1\relax} + +\newcount\c_btx_list_index +\let\m_btx_list_action\empty + +\def\publ_flush_list_step_command + {\btxsetlisttag{\c_btx_list_index} + \expandafter\m_btx_list_action\expandafter{\currentbtxtag}% + \ifnum\c_btx_list_index<\nofbtxlistentries + \advance\c_btx_list_index\plusone + \expandafter\publ_flush_list_step_command + \else + \glet\m_btx_list_action\relax + \fi} + +\def\publ_flush_list_step_setup + {\btxsetlisttag{\c_btx_list_index} + \directsetup{\m_btx_list_action}% + \ifnum\c_btx_list_index<\nofbtxlistentries + \advance\c_btx_list_index\plusone + \expandafter\publ_flush_list_step_setup + \else + \glet\m_btx_list_action\relax + \fi} + +\unexpanded\def\flushbtxentries[#1]% + {\begingroup + \getdummyparameters[\c!command=,\c!setups=,#1]% + \xdef\m_btx_list_action{\dummyparameter\c!command}% + \ifx\m_btx_list_action\empty + \xdef\m_btx_list_action{\dummyparameter\c!setups}% + \ifx\m_btx_list_action\empty + \endgroup + \c_btx_list_index\zerocount + \else + \endgroup + \c_btx_list_index\plusone + \doubleexpandafter\publ_flush_list_step_command + \fi + \else + \endgroup + \c_btx_list_index\plusone + \expandafter\publ_flush_list_step_command + \fi} + +%D So far. \def\currentbtxblock{\number\btxblock} @@ -924,7 +1010,7 @@ \unexpanded\def\btx_reference_indeed {\begingroup - % redundantm will go away: + % redundant will go away: \setbtxparameterset{\c!list:\s!numbering}\currentbtxnumbering % \ifx\currentbtxnumbering\empty @@ -976,16 +1062,16 @@ \endgroup} \def\btx_list_reference_inject_now - {\btx_trace_list_cross\empty\currentbtxbacktrace - \strc_references_direct_full_user + {\strc_references_direct_full_user {\ifx\currentbtxdataset\v!default\else\s!btxset=\currentbtxdataset,\fi% \s!btxref=\currentbtxtag,% \s!btxspc=\currentbtxspecification,% \s!btxlst=\number\c_btx_list_reference,% check if needed - %\ifx\currentbtxcombis\empty\else\s!btxcom={\currentbtxcombis},\fi% - \ifx\currentbtxbefore\empty\else\s!btxbtx={\currentbtxbefore},\fi% - \ifx\currentbtxafter \empty\else\s!btxatx={\currentbtxafter },\fi% - \ifx\currentbtxbacklink\currentbtxbacktrace\s!btxint=\currentbtxbacklink\else\s!btxbck=\currentbtxbacktrace\fi}% + %\ifx\currentbtxcombis \empty\else\s!btxcom={\currentbtxcombis},\fi% + \ifx\currentbtxbefore \empty\else\s!btxbtx={\currentbtxbefore},\fi% + \ifx\currentbtxafter \empty\else\s!btxatx={\currentbtxafter },\fi% + \ifx\currentbtxbacklink\empty\else\s!btxint=\number\currentbtxbacklink\fi + }% {\s!btx::\v!list::\number\c_btx_list_reference}% {\currentbtxnumber}} @@ -998,27 +1084,26 @@ \iftrialtypesetting \else \ifx\currentbtxbacklink\empty % can be made empty when combining author / year - \else + \else\ifnum\currentbtxbacklink>\zerocount \btx_cite_reference_inject_indeed \settrue\c_btx_cite_reference_injected - \fi + \fi\fi \fi \fi} \newtoks\t_btx_reference_inject \def\btx_cite_reference_inject_indeed - {\btx_trace_list_cross\currentbtxbacklink\empty - \the\t_btx_reference_inject + {\the\t_btx_reference_inject \strc_lists_inject_direct % todo: make like \btx_list_reference_inject_now with { } [\s!btx]% [\c!type=\s!btx]% \c!location=\v!none [\ifx\currentbtxdataset\v!default\else\s!btxset=\currentbtxdataset,\fi% \s!btxref=\currentbtxtag,% - %\ifx\currentbtxcombis\empty\else\s!btxcom={\currentbtxcombis},\fi% - \ifx\currentbtxbefore\empty\else\s!btxbtx={\currentbtxbefore},\fi% - \ifx\currentbtxafter \empty\else\s!btxatx={\currentbtxafter },\fi% - \s!btxint=\number\currentbtxbacklink + %\ifx\currentbtxcombis \empty\else\s!btxcom={\currentbtxcombis},\fi% + \ifx\currentbtxbefore \empty\else\s!btxbtx={\currentbtxbefore},\fi% + \ifx\currentbtxafter \empty\else\s!btxatx={\currentbtxafter },\fi% + \ifx\currentbtxbacklink\empty\else\s!btxint=\number\currentbtxbacklink,\fi \ifx\currentbtxciteuservariables\empty\else,\currentbtxciteuservariables\fi]} \def\currentbtxuservariable #1{\clf_btxuservariable {\currentbtxdataset}{#1}} @@ -1055,6 +1140,9 @@ \def\btx_remap_author[#1][#2]% {\clf_btxremapauthor{#1}{#2}} +\unexpanded\def\btxshowauthorremapping + {\clf_btxshowauthorremapping} + \unexpanded\def\btxflushauthor {\doifelsenextoptionalcs\btx_flush_author_yes\btx_flush_author_nop} @@ -1084,6 +1172,7 @@ etaldisplay {\btxparameter\c!etaldisplay}% etaloption {\btxparameter\c!etaloption}% symbol {\btxparameter{\c!stopper:initials}}% + connector {\btxparameter{\c!connector:initials}}% }% \relax \endgroup} @@ -1096,7 +1185,11 @@ \unexpanded\def\btxflushauthorinverted {\btx_flush_author{inverted}} % #1 \unexpanded\def\btxflushauthorinvertedshort{\btx_flush_author{invertedshort}} % #1 -\unexpanded\def\currentbtxciteauthor % always author +\let\currentbtxauthorfield\s!author + +\unexpanded\def\btxsetauthorfield#1{\edef\currentbtxauthorfield{#1}} + +\unexpanded\def\currentbtxciteauthorbyfield {\begingroup %\setbtxparameterset\s!cite\s!author % the alternatives inherit from cite:author @@ -1105,7 +1198,7 @@ \clf_btxauthor {\currentbtxdataset}% {\currentbtxtag}% - {\s!author}% + {\currentbtxauthorfield}% {% combiner {\btxparameter\c!authorconversion}% kind {cite}% @@ -1117,6 +1210,10 @@ \relax \endgroup} +\unexpanded\def\currentbtxciteauthor + {\let\currentbtxauthorfield\s!author + \currentbtxciteauthorbyfield} % always author + \unexpanded\def\btxstartauthor#1#2#3% a state > 0 signals that some authors can clash {\begingroup \currentbtxauthorindex#1\relax @@ -1140,43 +1237,50 @@ % \btxflushauthor{author} % \btxflushauthor{editor} -% -% \btxflushauthor[name]{author} -% \btxflushauthor[normal]{author} -% \btxflushauthor[normalshort]{author} -% \btxflushauthor[inverted]{author} -% \btxflushauthor[invertedshort]{author} % Interaction +% +% Because we have more complex entries in lists we don't use the normal list +% interaction features. \newconditional\btxinteractive -\newconditional\btx_interactive +\newconditional\btxinteractivenumber +\newconditional\btxinteractivetext +\newconditional\btxinteractivepage + +\let\currentbtxinteraction\empty + +\installcorenamespace{btxinteraction} -% of maybe modes? +\setvalue{\??btxinteraction\v!number}{\settrue\btxinteractivenumber} +\setvalue{\??btxinteraction\v!text }{\settrue\btxinteractivetext} +\setvalue{\??btxinteraction\v!page }{\settrue\btxinteractivepage} +\setvalue{\??btxinteraction\v!all }{\settrue\btxinteractivenumber + \settrue\btxinteractivetext + \settrue\btxinteractivepage} + +% \setupbtx[interaction=page] % or text or number or all +% \setupbtxrendering[pagestate=start] \appendtoks \iflocation - \edef\p_interaction{\btxparameter\c!interaction}% - \ifx\p_interaction\v!stop + \edef\currentbtxinteraction{\btxparameter\c!interaction}% + \ifx\currentbtxinteraction\v!stop \setfalse\btxinteractive \else + \let\structurelistlocation\empty \settrue\btxinteractive - \ifx\p_interaction\v!all - \settrue\btx_interactive - \else - \setfalse\btx_interactive - \fi + \begincsname\??btxinteraction\currentbtxinteraction\endcsname \fi \else \setfalse\btxinteractive - \setfalse\btx_interactive \fi \to \everysetupbtxlistplacement \appendtoks \iflocation - \edef\p_interaction{\btxparameter\c!interaction}% - \ifx\p_interaction\v!stop + \edef\currentbtxinteraction{\btxparameter\c!interaction}% + \ifx\currentbtxinteraction\v!stop \setfalse\btxinteractive \else \settrue\btxinteractive @@ -1223,6 +1327,7 @@ \let\p_publ_cite_righttext\empty \let\currentbtxciteuservariables\empty +\let\currentbtxcitealternative \empty \unexpanded\def\btxhybridcite % so one can alias the old {\dontleavehmode @@ -1262,6 +1367,11 @@ \let\currentbtxcitetag\p_reference \edef\currentbtxciteuservariables{#2}% \fi + \edef\p_specification{\dummyparameter\c!specification}% + \ifx\p_specification\empty + \else + \let\currentbtxspecification\p_specification + \fi \edef\p_alternative{\dummyparameter\c!alternative}% \ifx\p_alternative\empty \setbtxparametersetroot\s!cite @@ -1330,6 +1440,7 @@ \def\publ_cite_handle_variant_indeed[#1]% {\letbtxparameter\c!alternative\currentbtxcitealternative \edef\currentbtxreference{#1}% + \saverunningstyleandcolor \usebtxstyleandcolor\c!style\c!color \uselanguageparameter\btxdatasetparameter % new \btxparameter\c!left @@ -1393,8 +1504,9 @@ \unexpanded\def\citation {\doifelsenextoptionalcs\btxlistcitation \btxdirectlistcite} \unexpanded\def\nocitation{\doifelsenextoptionalcs\btxhiddencitation\btxdirecthiddencite} -\let\cite \citation -\let\nocite\nocitation +\let\cite \citation +\let\nocite \nocitation +\let\usecitation\nocitation \unexpanded\def\publ_entry_citation {\doifelsenextoptionalcs\btxlistcitation \btxdirectlistcite} \unexpanded\def\publ_entry_nocitation{\doifelsenextoptionalcs\btxhiddencitation\btxdirecthiddencite} @@ -1551,6 +1663,7 @@ \unexpanded\def\btxstartsubcite#1% {\begingroup \btx_reset_cite % todo: limited set + % \saverunningstyleandcolor % let's see when Alan needs it \def\currentbtxcitealternative{#1}% \setbtxparameterset\s!cite\currentbtxcitealternative \usebtxstyleandcolor\c!style\c!color @@ -1783,6 +1896,19 @@ \unexpanded\def\btxusecommand[#1]#2% using #2 permits space after [] {\namedbtxparameter{#1}\c!command{#2}} +\unexpanded\def\startbtxrunningstyleandcolor + {\dontleavehmode + \begingroup + \restorerunningstyleandcolor} + +\unexpanded\def\stopbtxrunningstyleandcolor + {\endgroup} + +%D Maybe handy: + +\unexpanded\def\btxdoifelsematches#1#2#3% + {\clf_btxdoifelsematches{#1}{#2}{#3}} + %D Defaults: \setupbtxrendering @@ -1801,7 +1927,7 @@ \c!pagestate=\v!stop, \c!textstate=\v!start, \c!width=\v!auto, - \c!separator={\btxsemicolon}, + \c!separator={\removepunctuation;\space}, \c!distance=1.5\emwidth] % Quite some interpunction and labels are the same of at least consistent within @@ -1860,4 +1986,13 @@ \loadbtxdefinitionfile [\s!default] +%D Delayed loading: + +\fetchruntimecommand \showbtxdatasetfields \f!publ_tra +\fetchruntimecommand \showbtxdatasetcompleteness \f!publ_tra +\fetchruntimecommand \showbtxdatasetauthors \f!publ_tra +\fetchruntimecommand \showbtxhashedauthors \f!publ_tra +\fetchruntimecommand \showbtxfields \f!publ_tra +\fetchruntimecommand \showbtxtables \f!publ_tra + \protect diff --git a/tex/context/base/mkiv/publ-tra.lua b/tex/context/base/mkiv/publ-tra.lua index b3d40be61..81bbc2fd3 100644 --- a/tex/context/base/mkiv/publ-tra.lua +++ b/tex/context/base/mkiv/publ-tra.lua @@ -103,7 +103,7 @@ function tracers.showdatasetcompleteness(settings) local preamble = { "|lTBw(5em)|lBTp(10em)|plT|" } - local function identified(tag,category,crossref,index) + local function do_identified(tag,category,crossref,index) ctx_NC() ctx_monobold(index) ctx_NC() ctx_monobold(category) ctx_NC() if crossref then @@ -114,7 +114,7 @@ function tracers.showdatasetcompleteness(settings) ctx_NC() ctx_NR() end - local function required(done,foundfields,key,value,indirect) + local function do_required(done,found,key,value,indirect) ctx_NC() if not done then ctx_monobold("required") end ctx_NC() context(key) ctx_NC() @@ -131,11 +131,11 @@ function tracers.showdatasetcompleteness(settings) context("\\darkred\\tttf [missing value]") end ctx_NC() ctx_NR() - foundfields[key] = nil + found[key] = nil return done or true end - local function optional(done,foundfields,key,value,indirect) + local function do_optional(done,found,key,value,indirect) ctx_NC() if not done then ctx_monobold("optional") end ctx_NC() context(key) ctx_NC() @@ -146,11 +146,11 @@ function tracers.showdatasetcompleteness(settings) ctx_verbatim(value) end ctx_NC() ctx_NR() - foundfields[key] = nil + found[key] = nil return done or true end - local function special(done,key,value) + local function do_special(done,key,value) ctx_NC() if not done then ctx_monobold("special") end ctx_NC() context(key) ctx_NC() if value then ctx_verbatim(value) end @@ -158,7 +158,7 @@ function tracers.showdatasetcompleteness(settings) return done or true end - local function extra(done,key,value) + local function do_extra(done,key,value) ctx_NC() if not done then ctx_monobold("extra") end ctx_NC() context(key) ctx_NC() if value then ctx_verbatim(value) end @@ -168,84 +168,112 @@ function tracers.showdatasetcompleteness(settings) if next(luadata) then for tag, entry in sortedhash(luadata) do - local category = entry.category - local fields = categories[category] - local foundfields = { } + local category = entry.category + local fields = categories[category] + local found = { } + local flushed = { } for k, v in next, entry do - foundfields[k] = true + found[k] = true end ctx_starttabulate(preamble) - identified(tag,category,entry.crossref,entry.index) + do_identified(tag,category,entry.crossref,entry.index) ctx_FL() if fields then - local requiredfields = fields.required - local sets = fields.sets or { } - local done = false - if requiredfields then - for i=1,#requiredfields do - local r = requiredfields[i] + local required = fields.required + local sets = fields.sets or { } + local done = false + if required then + for i=1,#required do + local r = required[i] local r = sets[r] or r if type(r) == "table" then local okay = false for i=1,#r do local ri = r[i] - if rawget(entry,ri) then - done = required(done,foundfields,ri,entry[ri]) - okay = true - elseif entry[ri] then - done = required(done,foundfields,ri,entry[ri],true) - okay = true + if not flushed[ri] then + -- already done + if rawget(entry,ri) then + done = do_required(done,found,ri,entry[ri]) + okay = true + flushed[ri] = true + elseif entry[ri] then + done = do_required(done,found,ri,entry[ri],true) + okay = true + flushed[ri] = true + end end end - if not okay then - done = required(done,foundfields,table.concat(r," {\\letterbar} ")) + if not okay and not flushed[r] then + done = do_required(done,found,concat(r," {\\letterbar} ")) + flushed[r] = true end elseif rawget(entry,r) then - done = required(done,foundfields,r,entry[r]) + if not flushed[r] then + done = do_required(done,found,r,entry[r]) + flushed[r] = true + end elseif entry[r] then - done = required(done,foundfields,r,entry[r],true) + if not flushed[r] then + done = do_required(done,found,r,entry[r],true) + flushed[r] = true + end else - done = required(done,foundfields,r) + if not flushed[r] then + done = do_required(done,found,r) + flushed[r] = true + end end end end - local optionalfields = fields.optional - local done = false - if optionalfields then - for i=1,#optionalfields do - local o = optionalfields[i] + local optional = fields.optional + local done = false + if optional then + for i=1,#optional do + local o = optional[i] local o = sets[o] or o if type(o) == "table" then for i=1,#o do local oi = o[i] - if rawget(entry,oi) then - done = optional(done,foundfields,oi,entry[oi]) - elseif entry[oi] then - done = optional(done,foundfields,oi,entry[oi],true) + if not flushed[oi] then + if rawget(entry,oi) then + done = do_optional(done,found,oi,entry[oi]) + flushed[oi] = true + elseif entry[oi] then + done = do_optional(done,found,oi,entry[oi],true) + flushed[oi] = true + end end end elseif rawget(entry,o) then - done = optional(done,foundfields,o,entry[o]) + if not flushed[o] then + done = do_optional(done,found,o,entry[o]) + flushed[o] = true + end elseif entry[o] then - done = optional(done,foundfields,o,entry[o],true) + if not flushed[o] then + done = do_optional(done,found,o,entry[o],true) + flushed[o] = true + end end end end end local done = false - for k, v in sortedhash(foundfields) do + for k, v in sortedhash(found) do if privates[k] then -- skip - elseif specials[k] then - done = special(done,k,entry[k]) + elseif specials[k] and not flushed[k] then + done = do_special(done,k,entry[k]) + flushed[k] = true end end local done = false - for k, v in sortedhash(foundfields) do + for k, v in sortedhash(found) do if privates[k] then -- skip - elseif not specials[k] then - done = extra(done,k,entry[k]) + elseif not specials[k] and not flushed[k] then + done = do_extra(done,k,entry[k]) + flushed[k] = true end end ctx_stoptabulate() diff --git a/tex/context/base/mkiv/publ-tra.mkiv b/tex/context/base/mkiv/publ-tra.mkiv index 6ef86ca59..e5f23259b 100644 --- a/tex/context/base/mkiv/publ-tra.mkiv +++ b/tex/context/base/mkiv/publ-tra.mkiv @@ -16,18 +16,18 @@ \writestatus{loading}{ConTeXt Publication Support / Tracing} -\registerctxluafile{publ-tra}{1.001} +\registerctxluafile{publ-tra}{} \unprotect -\unexpanded\def\showbtxdatasetfields {\dosingleempty\publ_show_dataset_fields} -\unexpanded\def\showbtxdatasetcompleteness{\dosingleempty\publ_show_dataset_completeness} -\unexpanded\def\showbtxdatasetauthors {\dosingleempty\publ_show_dataset_authors} -\unexpanded\def\showbtxhashedauthors {\dosingleempty\publ_show_hashed_authors} -\unexpanded\def\showbtxfields {\dosingleempty\publ_show_fields} -\unexpanded\def\showbtxtables {\dosingleempty\publ_show_tables} +\unexpanded\gdef\showbtxdatasetfields {\dosingleempty\publ_show_dataset_fields} +\unexpanded\gdef\showbtxdatasetcompleteness{\dosingleempty\publ_show_dataset_completeness} +\unexpanded\gdef\showbtxdatasetauthors {\dosingleempty\publ_show_dataset_authors} +\unexpanded\gdef\showbtxhashedauthors {\dosingleempty\publ_show_hashed_authors} +\unexpanded\gdef\showbtxfields {\dosingleempty\publ_show_fields} +\unexpanded\gdef\showbtxtables {\dosingleempty\publ_show_tables} -\def\publ_show_dataset_whatever#1[#2]% +\gdef\publ_show_dataset_whatever#1[#2]% {\begingroup \letdummyparameter\c!specification\currentbtxspecification \setdummyparameter\c!dataset {\currentbtxdataset}% @@ -46,11 +46,11 @@ }}% \endgroup} -\def\publ_show_dataset_fields {\publ_show_dataset_whatever{showbtxdatasetfields}} -\def\publ_show_dataset_completeness{\publ_show_dataset_whatever{showbtxdatasetcompleteness}} -\def\publ_show_dataset_authors {\publ_show_dataset_whatever{showbtxdatasetauthors}} +\gdef\publ_show_dataset_fields {\publ_show_dataset_whatever{showbtxdatasetfields}} +\gdef\publ_show_dataset_completeness{\publ_show_dataset_whatever{showbtxdatasetcompleteness}} +\gdef\publ_show_dataset_authors {\publ_show_dataset_whatever{showbtxdatasetauthors}} -\def\publ_show_fields[#1]% +\gdef\publ_show_fields[#1]% {\begingroup \setdummyparameter\c!rotation{90}% \doifelseassignment{#1}% @@ -65,12 +65,12 @@ }}% \endgroup} -\def\publ_show_tables[#1]% +\gdef\publ_show_tables[#1]% {\begingroup \ctxcommand{showbtxtables{}}% \endgroup} -\def\publ_show_hashed_authors[#1]% +\gdef\publ_show_hashed_authors[#1]% {\ctxcommand{showbtxhashedauthors{}}} \protect diff --git a/tex/context/base/mkiv/regi-ini.lua b/tex/context/base/mkiv/regi-ini.lua index be8fa1b1c..7691e8765 100644 --- a/tex/context/base/mkiv/regi-ini.lua +++ b/tex/context/base/mkiv/regi-ini.lua @@ -12,6 +12,8 @@ if not modules then modules = { } end modules ['regi-ini'] = { runtime.</p> --ldx]]-- +-- Todo: use regi-imp*.lua instead + local commands, context = commands, context local utfchar = utf.char @@ -134,6 +136,9 @@ end setmetatableindex(mapping, loadregime) setmetatableindex(backmapping,loadreverse) +regimes.mapping = mapping +regimes.backmapping = backmapping + local function fromregime(regime,line) if line and #line > 0 then local map = mapping[regime and synonyms[regime] or regime or currentregime] @@ -251,6 +256,22 @@ end regimes.push = push regimes.pop = pop +function regimes.list() + local name = resolvers.findfile(format("regi-ini.lua",regime)) or "" + local okay = { } + if name then + local list = dir.glob(file.join(file.dirname(name),"regi-*.lua")) + for i=1,#list do + local name = list[i] + if name ~= "regi-ini.lua" then + okay[#okay+1] = match(name,"regi%-(.-)%.lua") + end + table.sort(okay) + end + end + return okay +end + if sequencers then sequencers.prependaction(textlineactions,"system","regimes.process") diff --git a/tex/context/base/mkiv/regi-ini.mkiv b/tex/context/base/mkiv/regi-ini.mkiv index 6190393d8..532a4db0b 100644 --- a/tex/context/base/mkiv/regi-ini.mkiv +++ b/tex/context/base/mkiv/regi-ini.mkiv @@ -11,7 +11,7 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\registerctxluafile{regi-ini}{1.001} +\registerctxluafile{regi-ini}{} \unprotect diff --git a/tex/context/base/mkiv/scrn-bar.mkvi b/tex/context/base/mkiv/scrn-bar.mkvi index efb1a005b..7634398f8 100644 --- a/tex/context/base/mkiv/scrn-bar.mkvi +++ b/tex/context/base/mkiv/scrn-bar.mkvi @@ -201,7 +201,7 @@ \setupblackrules[\c!width=\scratchdimenone]% \setbox\scratchbox\hbox to \d_scrn_bar_width {\hskip2\emwidth - \setbox\scratchbox\hbox{\blackrule[\c!color=\interactionbarparameter\c!backgroundcolor]}% + \setbox\scratchbox\hpack{\blackrule[\c!color=\interactionbarparameter\c!backgroundcolor]}% \dorecurse\scratchcounter {\hss\normalexpanded{\directgotodumbbox{\copy\scratchbox}[page(\the\numexpr\recurselevel*\lastpage/\scratchcounter\relax)]}}% \hss @@ -288,7 +288,7 @@ \d_scrn_bar_height \interactionbarparameter\c!height \d_scrn_bar_depth \interactionbarparameter\c!depth \scratchdimenone\d_scrn_bar_width - \noindent\hbox{\scrn_bar_goto_x{\hskip\d_scrn_bar_distance}}% + \noindent\hbox{\scrn_bar_goto_x{\hskip\d_scrn_bar_distance}}% \hpack ? }\fi} \def\scrn_bar_alternative_e @@ -302,7 +302,7 @@ \ifdim\scratchdimenone<\d_scrn_bar_distance \scrn_bar_alternative_f \else - \noindent\hbox to \d_scrn_bar_width{\scrn_bar_goto_x{\hss}\unskip}% + \noindent\hbox to \d_scrn_bar_width{\scrn_bar_goto_x{\hss}\unskip}% \hpack ? \fi }\fi} diff --git a/tex/context/base/mkiv/scrn-but.mkvi b/tex/context/base/mkiv/scrn-but.mkvi index 65b0d2c4e..8bbd6eeda 100644 --- a/tex/context/base/mkiv/scrn-but.mkvi +++ b/tex/context/base/mkiv/scrn-but.mkvi @@ -16,7 +16,7 @@ \writestatus{loading}{ConTeXt Screen Macros / Buttons} -\registerctxluafile{scrn-but}{1.001} +\registerctxluafile{scrn-but}{} \unprotect @@ -75,13 +75,17 @@ {\iffirstargument \setupcurrentbutton[#settings]% \fi - \scrn_button_make - \buttonparameter - \inheritedbuttonframed - \letbuttonparameter - \setbuttonparameter - {#text}% - {#action}% + % no \dontleavehmode as it will force a vbox to \hsize which then + % spoils a tight box + \hpack\bgroup + \scrn_button_make + \buttonparameter + \inheritedbuttonframed + \letbuttonparameter + \setbuttonparameter + {#text}% + {#action}% + \egroup \endgroup} \def\scrn_button_direct_ignore[#settings]#text[#destination]% @@ -550,7 +554,7 @@ \setbox\b_scrn_menu\hbox to \d_scrn_menu_used_width {\ifx\currentinteractionmenustate\v!empty \else \interactionmenuparameter\c!left - \scrn_menu_package_vertical{\strictinteractionmenuparameter\c!menu}% + \scrn_menu_package_vertical{\directinteractionmenuparameter\c!menu}% \interactionmenuparameter\c!right \fi}% \edef\currentinteractionmenudistance{\interactionmenuparameter\c!distance}% @@ -571,7 +575,7 @@ {\ifx\currentinteractionmenustate\v!none \else \scrn_menu_top_align \interactionmenuparameter\c!before - \scrn_menu_package_horizontal{\strictinteractionmenuparameter\c!menu}% + \scrn_menu_package_horizontal{\directinteractionmenuparameter\c!menu}% \interactionmenuparameter\c!after \scrn_menu_bottom_align \fi}% @@ -784,7 +788,7 @@ \edef\currentinteractionmenu{#tag}% \doif{\interactionmenuparameter\c!state}\v!local {\letinteractionmenuparameter\c!state\v!start - \strictinteractionmenuparameter\c!menu}% + \directinteractionmenuparameter\c!menu}% \endgroup} %D Direct call (todo): diff --git a/tex/context/base/mkiv/scrn-fld.mkvi b/tex/context/base/mkiv/scrn-fld.mkvi index d69e7beb9..38c4e1461 100644 --- a/tex/context/base/mkiv/scrn-fld.mkvi +++ b/tex/context/base/mkiv/scrn-fld.mkvi @@ -21,7 +21,7 @@ \unprotect -\registerctxluafile{scrn-fld}{1.001} +\registerctxluafile{scrn-fld}{} %D In \MKII\ we had to cheat a bit with setups in order not to run %D out of memory with thousands of fields, which we happen to need at diff --git a/tex/context/base/mkiv/scrn-hlp.mkvi b/tex/context/base/mkiv/scrn-hlp.mkvi index 7466e5687..97c930669 100644 --- a/tex/context/base/mkiv/scrn-hlp.mkvi +++ b/tex/context/base/mkiv/scrn-hlp.mkvi @@ -18,7 +18,7 @@ %D upgraded and usage has changed a bit. We also use some %D \LUA\ magic in order to avoid multiple passes. -\registerctxluafile{scrn-hlp}{1.001} +\registerctxluafile{scrn-hlp}{} %D Using help boils down to plugging the placement macro %D someplace visible, like: @@ -114,7 +114,7 @@ \fi} \def\scrn_help_register#text% - {\setbox\b_scrn_help_box\hbox{\inheritedhelpframed{#text}}% + {\setbox\b_scrn_help_box\hbox{\inheritedhelpframed{#text}}% \hpack ? \definesymbol [\currenthelpname] [\copy\b_scrn_help_box]% diff --git a/tex/context/base/mkiv/scrn-ini.mkvi b/tex/context/base/mkiv/scrn-ini.mkvi index 93dde6962..e1be43f37 100644 --- a/tex/context/base/mkiv/scrn-ini.mkvi +++ b/tex/context/base/mkiv/scrn-ini.mkvi @@ -15,7 +15,7 @@ \unprotect -\registerctxluafile{scrn-ini}{1.001} +\registerctxluafile{scrn-ini}{} %D There is no interaction at all unless enabled by saying: %D diff --git a/tex/context/base/mkiv/scrn-pag.lua b/tex/context/base/mkiv/scrn-pag.lua index bd65e53d9..4f77a7d24 100644 --- a/tex/context/base/mkiv/scrn-pag.lua +++ b/tex/context/base/mkiv/scrn-pag.lua @@ -41,6 +41,7 @@ implement { { "artoffset", "dimen" }, { "trimoffset", "dimen" }, { "copies", "integer" }, + { "print", "string" }, -- , tohash } } } diff --git a/tex/context/base/mkiv/scrn-pag.mkvi b/tex/context/base/mkiv/scrn-pag.mkvi index b7e056e2b..d96d8d3c1 100644 --- a/tex/context/base/mkiv/scrn-pag.mkvi +++ b/tex/context/base/mkiv/scrn-pag.mkvi @@ -15,7 +15,7 @@ \writestatus{loading}{ConTeXt Screen Macros / Pages} -\registerctxluafile{scrn-pag}{1.001} +\registerctxluafile{scrn-pag}{} \unprotect @@ -228,6 +228,7 @@ bleedoffset \canvasbleedoffset artoffset \canvasartoffset copies \numexpr\interactionscreenparameter\c!copies\relax + print {\interactionscreenparameter\c!print}% \relax %\global\let\scrn_canvas_synchronize_simple \relax \global\let\scrn_canvas_synchronize_complex\relax} diff --git a/tex/context/base/mkiv/scrn-ref.mkvi b/tex/context/base/mkiv/scrn-ref.mkvi index c165e9131..bace13312 100644 --- a/tex/context/base/mkiv/scrn-ref.mkvi +++ b/tex/context/base/mkiv/scrn-ref.mkvi @@ -13,7 +13,7 @@ \writestatus{loading}{ConTeXt Screen Macros / References} -\registerctxluafile{scrn-ref}{1.001} +\registerctxluafile{scrn-ref}{} \unprotect @@ -29,7 +29,7 @@ \to \everysetupinteraction \def\scrn_reference_enable_page_destinations % no reset - {\clf_setinnerreferencemethod{\interactionparameter\c!page}} + {\clf_setreferencelinkmethod{\interactionparameter\c!page}} \setupinteraction % start fit page and reset form [\c!page=\v!no, diff --git a/tex/context/base/mkiv/scrn-wid.lua b/tex/context/base/mkiv/scrn-wid.lua index 3ce904349..636d547da 100644 --- a/tex/context/base/mkiv/scrn-wid.lua +++ b/tex/context/base/mkiv/scrn-wid.lua @@ -6,6 +6,23 @@ if not modules then modules = { } end modules ['scrn-wid'] = { license = "see context related readme files" } +-- Support for interactive features is handled elsewhere. Now that is some mess! In +-- the early days one had media features like sound and movies that were easy to set +-- up. Then at some point renditions came around which were more work and somewhat +-- unreliable. Now, both mechanism are obsolete and replaced by rich media which is +-- a huge mess and has no real concept of what media are supported. There's flash +-- cq. shockwave (basically obsolete too), and for instance mp4 needs to be handled +-- by a swf player, and there's u3d which somehow has its own specification. One +-- would expect native support for video and audio to be en-par with browsers but +-- alas ... pdf has lost the battle with html here due to a few decades of +-- unstability and changing support. So far we could catch on and even were ahead +-- but I wonder if we should keep doing that. As we can't trust support for media we +-- can better not embed anything and just use a hyperlink to an external resource. No +-- sane person will create media rich pdf's as long as it's that unpredictable. Just +-- look at the specification and viewer preferences and decide. + +local next = next + interactions = interactions or { } local interactions = interactions @@ -223,7 +240,7 @@ function soundclips.insert(tag) end implement { - name = registersoundclip, + name = "registersoundclip", actions = soundclips.register, arguments = { { @@ -234,7 +251,7 @@ implement { } implement { - name = insertsoundclip, + name = "insertsoundclip", actions = soundclips.insert, arguments = { { diff --git a/tex/context/base/mkiv/scrn-wid.mkvi b/tex/context/base/mkiv/scrn-wid.mkvi index f19da57f7..c74125c72 100644 --- a/tex/context/base/mkiv/scrn-wid.mkvi +++ b/tex/context/base/mkiv/scrn-wid.mkvi @@ -13,7 +13,7 @@ \writestatus{loading}{ConTeXt Interaction Macros / Widgets} -\registerctxluafile{scrn-wid}{1.001} +\registerctxluafile{scrn-wid}{} % todo: expansion in comments (default is expanded) % todo: check renderings ... acrobat crashes too easily on missing one @@ -86,7 +86,7 @@ %\c!method=, % \v!hidden = not in menu %\c!buffer= \c!symbol=, - \c!distance=1em, + \c!distance=\emwidth, \c!width=\v!fit, \c!height=\v!fit, \c!depth=\v!fit, @@ -223,6 +223,12 @@ tag {\currentattachment}% registered {\currentattachmentregistered}% method {\v!hidden}% + title {\attachmentparameter\c!title}% + subtitle {\attachmentparameter\c!subtitle}% + author {\attachmentparameter\c!author}% + file {\attachmentparameter\c!file}% + name {\attachmentparameter\c!name}% + buffer {\attachmentparameter\c!buffer}% \relax} \def\scrn_attachment_place @@ -243,7 +249,7 @@ {\global\setbox\b_scrn_attachment_collect\hbox\bgroup \ifvoid\b_scrn_attachment_collect\else \box\b_scrn_attachment_collect - \hskip\attachmentparameter\c!distance + \hskip\attachmentparameter\c!distance\relax \fi #content% \egroup} @@ -366,7 +372,7 @@ \setupcomment [\c!state=\v!start, - \c!distance=1em, + \c!distance=\emwidth, \c!color=\interactionparameter\c!color, \c!space=\v!no, \c!symbol=, @@ -499,7 +505,7 @@ {\global\setbox\b_scrn_comment_collect\hbox\bgroup \ifvoid\b_scrn_comment_collect\else \box\b_scrn_comment_collect - \hskip\commentparameter\c!distance + \hskip\commentparameter\c!distance\relax \fi \box\b_scrn_comment_link \egroup} @@ -592,7 +598,7 @@ option {#option}% \relax \let\objectoffset\zeropoint - \setobject{IRO}{#tag}\hbox{\box\nextbox}% + \setobject{IRO}{#tag}\hpack{\box\nextbox}% \egroup}% \hbox} @@ -649,7 +655,8 @@ % \handlereferenceactions{\renderingwindowparameter\c!closepageaction}\dosetuprenderingclosepageaction \letrenderingwindowparameter\c!offset\v!overlay \inheritedrenderingwindowframed - {\vfill + {\vfilll + \dontleavehmode \clf_insertrenderingwindow label {\currentrendering}% width \d_scrn_rendering_width @@ -696,7 +703,7 @@ % \iflocation % \edef\currentlinkedlist{#1}% % \ifcsname\??lk\currentlinkedlist\s!parent\endcsname -% \hskip\linkedlistparameter\c!distance +% \hskip\linkedlistparameter\c!distance\relax % \clf_addlinklistelement{\currentlinkedlist}% % \expanded{\ctxlatecommand{enhancelinkedlist("\currentlinkedlist",\currentlink)}}% can also be done at the lua end % \dogotosomepage {\??lk\currentlinkedlist}\gotobegincharacter \firstlink diff --git a/tex/context/base/mkiv/scrp-cjk.lua b/tex/context/base/mkiv/scrp-cjk.lua index d2ec201ca..b31dc335a 100644 --- a/tex/context/base/mkiv/scrp-cjk.lua +++ b/tex/context/base/mkiv/scrp-cjk.lua @@ -32,7 +32,6 @@ local getid = nuts.getid local getattr = nuts.getattr local getsubtype = nuts.getsubtype local getwidth = nuts.getwidth -local getfield = nuts.getfield local setchar = nuts.setchar diff --git a/tex/context/base/mkiv/scrp-ini.lua b/tex/context/base/mkiv/scrp-ini.lua index 02b289137..d5cad643f 100644 --- a/tex/context/base/mkiv/scrp-ini.lua +++ b/tex/context/base/mkiv/scrp-ini.lua @@ -9,7 +9,7 @@ if not modules then modules = { } end modules ['scrp-ini'] = { -- We need to rewrite this a bit ... rather old code ... will be done when japanese -- is finished. -local attributes, nodes, node = attributes, nodes, node +local tonumber, next = tonumber, next local trace_analyzing = false trackers.register("scripts.analyzing", function(v) trace_analyzing = v end) local trace_injections = false trackers.register("scripts.injections", function(v) trace_injections = v end) @@ -22,6 +22,10 @@ local report_splitting = logs.reporter("scripts","splitting") local utfbyte, utfsplit = utf.byte, utf.split local gmatch = string.gmatch +local attributes = attributes +local nodes = nodes +local context = context + local texsetattribute = tex.setattribute local nodecodes = nodes.nodecodes diff --git a/tex/context/base/mkiv/scrp-ini.mkiv b/tex/context/base/mkiv/scrp-ini.mkiv index cd060c02b..8f28f505d 100644 --- a/tex/context/base/mkiv/scrp-ini.mkiv +++ b/tex/context/base/mkiv/scrp-ini.mkiv @@ -13,10 +13,10 @@ % here we collect code from other places (was organized differently) -\registerctxluafile{scrp-ini}{1.001} -\registerctxluafile{scrp-cjk}{1.001} -\registerctxluafile{scrp-eth}{1.001} -\registerctxluafile{scrp-tha}{1.001} +\registerctxluafile{scrp-ini}{} +\registerctxluafile{scrp-cjk}{} +\registerctxluafile{scrp-eth}{} +\registerctxluafile{scrp-tha}{} \definesystemattribute[scriptinjection][public] \definesystemattribute[scriptsplitting][public] diff --git a/tex/context/base/mkiv/sort-ini.mkiv b/tex/context/base/mkiv/sort-ini.mkiv index b7b490255..d9f9628d5 100644 --- a/tex/context/base/mkiv/sort-ini.mkiv +++ b/tex/context/base/mkiv/sort-ini.mkiv @@ -13,7 +13,7 @@ \writestatus{loading}{ConTeXt Sorting Macros / Initialization} -\registerctxluafile{sort-ini}{1.001} -\registerctxluafile{sort-lan}{1.001} +\registerctxluafile{sort-ini}{} +\registerctxluafile{sort-lan}{} \endinput diff --git a/tex/context/base/mkiv/sort-lan.lua b/tex/context/base/mkiv/sort-lan.lua index 21aabf3eb..1aa173d1b 100644 --- a/tex/context/base/mkiv/sort-lan.lua +++ b/tex/context/base/mkiv/sort-lan.lua @@ -710,11 +710,11 @@ definitions["it"] = { entries = { ["a"] = "a", ["á"] = "a", ["b"] = "b", ["c"] = "c", ["d"] = "d", ["e"] = "e", ["é"] = "e", ["è"] = "e", ["f"] = "f", ["g"] = "g", - ["h"] = "h", ["i"] = "i", ["í"] = "i", ["ì"] = "i", ["j"] = "i", + ["h"] = "h", ["i"] = "i", ["í"] = "i", ["ì"] = "i", ["j"] = "j", ["k"] = "k", ["l"] = "l", ["m"] = "m", ["n"] = "n", ["o"] = "o", ["ó"] = "o", ["ò"] = "o", ["p"] = "p", ["q"] = "q", ["r"] = "r", ["s"] = "s", ["t"] = "t", ["u"] = "u", ["ú"] = "u", ["ù"] = "u", - ["v"] = "u", ["w"] = "w", ["x"] = "x", ["y"] = "y", ["z"] = "z", + ["v"] = "v", ["w"] = "w", ["x"] = "x", ["y"] = "y", ["z"] = "z", }, orders = { "a", "á", "b", "c", "d", "e", "é", "è", "f", "g", diff --git a/tex/context/base/mkiv/spac-adj.mkiv b/tex/context/base/mkiv/spac-adj.mkiv index 936e00624..d29d15c17 100644 --- a/tex/context/base/mkiv/spac-adj.mkiv +++ b/tex/context/base/mkiv/spac-adj.mkiv @@ -18,7 +18,7 @@ % Very nasty but needed for margin stuff inside colored % paragraphs. Obsolete for while . -\registerctxluafile{spac-adj}{1.001} +\registerctxluafile{spac-adj}{} \definesystemattribute [graphicvadjust] [public] diff --git a/tex/context/base/mkiv/spac-ali.lua b/tex/context/base/mkiv/spac-ali.lua index bc77090cf..640478d34 100644 --- a/tex/context/base/mkiv/spac-ali.lua +++ b/tex/context/base/mkiv/spac-ali.lua @@ -18,7 +18,6 @@ local nodepool = nuts.pool local tonode = nuts.tonode local tonut = nuts.tonut -local getfield = nuts.getfield local getnext = nuts.getnext local getprev = nuts.getprev local getid = nuts.getid diff --git a/tex/context/base/mkiv/spac-ali.mkiv b/tex/context/base/mkiv/spac-ali.mkiv index af02f76ae..fbcf45caa 100644 --- a/tex/context/base/mkiv/spac-ali.mkiv +++ b/tex/context/base/mkiv/spac-ali.mkiv @@ -27,7 +27,7 @@ % % but that also means myoption gets frozen due to caching. -\registerctxluafile{spac-ali}{1.001} +\registerctxluafile{spac-ali}{} \definesystemattribute[realign] [public] % might be combined with the next one \definesystemattribute[alignstate][public] % will make a single attributes for several states @@ -61,17 +61,15 @@ \newtoks\everyresetalign % todo -% We will not use bodydir and pagedir so we disable them. That way we get -% normal hyperlink support. +%D We will not use bodydir and pagedir so we disable them. That way we get +%D normal hyperlink support. We back on it (too hard to fake \type {\the}). -\let\spac_directions_normal_body_dir\normalbodydir -\let\spac_directions_normal_page_dir\normalpagedir +\unexpanded\def\syst_fatal_dir_error#1% + {\writestatus{fatal error}{\string#1\space is forbidden}% + \wait} -\unexpanded\def\bodydir{\afterassignment\spac_directions_bodydir_indeed\spac_directions_normal_body_dir} \let\normalbodydir\bodydir -\unexpanded\def\pagedir{\afterassignment\spac_directions_pagedir_indeed\spac_directions_normal_page_dir} \let\normalpagedir\pagedir - -\def\spac_directions_bodydir_indeed{\spac_directions_normal_body_dir TLT\relax} -\def\spac_directions_pagedir_indeed{\spac_directions_normal_page_dir TLT\relax} +\def\pagedir {\syst_fatal_dir_error\pagedir} \let\normalpagedir\pagedir +\def\bodydir {\syst_fatal_dir_error\bodydir} \let\normalbodydir\bodydir % This will become a more advanced layout controller soon: @@ -105,59 +103,45 @@ \textdir TRT\relax \pardir TRT\relax} -\newconditional\c_spac_auto_line_dir \settrue\c_spac_auto_line_dir - -\ifdefined\linedir - - \unexpanded\def\spac_directions_lefttoright_hmode - {\ifconditional\c_spac_auto_line_dir\linedir\else\textdir\fi TLT\relax % linedir keeps subtype - \setfalse\inlinerighttoleft} - - \unexpanded\def\spac_directions_righttoleft_hmode - {\ifconditional\c_spac_auto_line_dir\linedir\else\textdir\fi TRT\relax % linedir keeps subtype - \setfalse\inlinelefttoright} - -\else % keep this as reference - - \unexpanded\def\spac_directions_lefttoright_hmode - {\settrue\inlinelefttoright - \textdir TLT\relax} - - \unexpanded\def\spac_directions_righttoleft_hmode - {\textdir TRT\relax - \setfalse\inlinelefttoright} - - \unexpanded\def\spac_directions_lefttoright_hmode - {\ifconditional\c_spac_auto_line_dir - \ifzeropt\lastskip - \textdir TLT\relax - \else - \scratchskip\lastskip - \unskip - \textdir TLT\relax - \hskip\scratchskip - \fi - \else - \textdir TLT\relax - \fi - \setfalse\inlinerighttoleft} - - \unexpanded\def\spac_directions_righttoleft_hmode - {\ifconditional\c_spac_auto_line_dir - \ifzeropt\lastskip - \textdir TRT\relax - \else - \scratchskip\lastskip - \unskip - \textdir TRT\relax - \hskip\scratchskip - \fi - \else - \textdir TRT\relax - \fi - \setfalse\inlinelefttoright} +% % keep this as reference +% +% \unexpanded\def\spac_directions_lefttoright_hmode +% {\textdir TLT\relax +% \settrue\inlinelefttoright} +% +% \unexpanded\def\spac_directions_righttoleft_hmode +% {\textdir TRT\relax +% \setfalse\inlinelefttoright} +% +% \unexpanded\def\spac_directions_lefttoright_hmode +% {\ifzeropt\lastskip +% \textdir TLT\relax +% \else +% \scratchskip\lastskip +% \unskip +% \textdir TLT\relax +% \hskip\scratchskip +% \fi +% \settrue\inlinelefttoright} +% +% \unexpanded\def\spac_directions_righttoleft_hmode +% {\ifzeropt\lastskip +% \textdir TRT\relax +% \else +% \scratchskip\lastskip +% \unskip +% \textdir TRT\relax +% \hskip\scratchskip +% \fi +% \setfalse\inlinelefttoright} -\fi +\unexpanded\def\spac_directions_lefttoright_hmode + {\linedir TLT\relax % linedir keeps subtype of skip + \settrue\inlinelefttoright} + +\unexpanded\def\spac_directions_righttoleft_hmode + {\linedir TRT\relax % linedir keeps subtype of skip + \setfalse\inlinelefttoright} % \def\currentdirectionparameters % {\ifconditional\inlinelefttoright \else @@ -194,6 +178,38 @@ \unexpanded\def\synchronizeinlinedirection {\textdir T\ifconditional\inlinelefttoright L\else R\fi T\relax} +\unexpanded\def\checkedlefttoright + {\ifvmode + \spac_directions_lefttoright_vmode + \else + \spac_directions_lefttoright_hmode_checked + \fi} + +\unexpanded\def\checkedrighttoleft + {\ifvmode + \spac_directions_righttoleft_vmode + \else + \spac_directions_righttoleft_hmode_checked + \fi} + +\unexpanded\def\spac_directions_lefttoright_hmode_checked + {\ifconditional\inlinelefttoright\else + \lefttoright + \fi} + +\unexpanded\def\spac_directions_righttoleft_hmode_checked + {\ifconditional\inlinelefttoright + \righttoleft + \fi} + +\installcorenamespace{bidi} + +\letvalue{\??bidi\v!left }\checkedlefttoright \letvalue{\??bidi l2r}\checkedlefttoright +\letvalue{\??bidi\v!right}\checkedrighttoleft \letvalue{\??bidi r2l}\checkedrighttoleft + +\unexpanded\def\usebidiparameter#1% + {\begincsname\??bidi#1\c!bidi\endcsname} + % maybe some day: % % \newcount\postdirpenalty % \zerocount @@ -791,10 +807,20 @@ \setvalue{\??aligncommand\v!extremestretch }{\toksapp\t_spac_align_collected{\spac_align_set_extreme_stretch}} \setvalue{\??aligncommand \v!final}{\c_spac_align_state_par_fill\plusone} +\setvalue{\??aligncommand1*\v!final}{\c_spac_align_state_par_fill\plusone} \setvalue{\??aligncommand2*\v!final}{\c_spac_align_state_par_fill\plustwo} % hardcoded multiplier \setvalue{\??aligncommand3*\v!final}{\c_spac_align_state_par_fill\plusthree} \setvalue{\??aligncommand4*\v!final}{\c_spac_align_state_par_fill\plusfour} +% a one shot (only usefull in e.g. framed, also needs tolerance and stretch) + +\setvalue{\??aligncommand \v!more}{\toksapp\t_spac_align_collected{\looseness\plusone}} +\setvalue{\??aligncommand1*\v!more}{\toksapp\t_spac_align_collected{\looseness\plusone}} +\setvalue{\??aligncommand2*\v!more}{\toksapp\t_spac_align_collected{\looseness\plustwo}} + +% \setvalue{\??aligncommand ... }{\toksapp\t_spac_align_collected{\nopenalties}} +% \setvalue{\??aligncommand ... }{\toksapp\t_spac_align_collected{\setdefaultpenalties}} + \definehspace [\v!final] [\emspaceamount] \def\spac_align_flush_parfill @@ -963,13 +989,14 @@ \dontleavehmode \begingroup \inleftmargin{\vsmash{\infofont\framed[\c!align=\v!right]{\thepardata}}}% - \endgroup} + \endgroup + \let\showpardata\relax} \unexpanded\def\startshowpardata {\begingroup \showstruts \tracingparagraphs\maxdimen - \appendtoksonce\showpardata\let\showpardata\relax\to\everypar} + \appendtoksonce\showpardata\to\everypar} \unexpanded\def\stopshowpardata {\endgraf diff --git a/tex/context/base/mkiv/spac-chr.lua b/tex/context/base/mkiv/spac-chr.lua index fe402ed87..0fa639f92 100644 --- a/tex/context/base/mkiv/spac-chr.lua +++ b/tex/context/base/mkiv/spac-chr.lua @@ -30,16 +30,17 @@ local nuts = nodes.nuts local tonode = nuts.tonode local tonut = nuts.tonut -local getfield = nuts.getfield -local setfield = nuts.setfield local getnext = nuts.getnext local getprev = nuts.getprev local getattr = nuts.getattr local setattr = nuts.setattr +local getlang = nuts.getlang +local setchar = nuts.setchar local setattrlist = nuts.setattrlist local getfont = nuts.getfont local getchar = nuts.getchar local setsubtype = nuts.setsubtype +local setdisc = nuts.setdisc local isglyph = nuts.isglyph local setcolor = nodes.tracers.colors.set @@ -48,6 +49,9 @@ local insert_node_before = nuts.insert_before local insert_node_after = nuts.insert_after local remove_node = nuts.remove local traverse_id = nuts.traverse_id +local traverse_char = nuts.traverse_char + +local copy_node = nuts.copy local tasks = nodes.tasks @@ -56,12 +60,15 @@ local new_penalty = nodepool.penalty local new_glue = nodepool.glue local new_kern = nodepool.kern local new_rule = nodepool.rule +local new_disc = nodepool.disc local nodecodes = nodes.nodecodes local skipcodes = nodes.skipcodes -local glyph_code = nodecodes.glyph +local disccodes = nodes.disccodes -local space_skip_code = skipcodes["spaceskip"] +local glyph_code = nodecodes.glyph +local space_skip_code = skipcodes.spaceskip +local explicit_code = disccodes.explicit local chardata = characters.data local is_punctuation = characters.is_punctuation @@ -136,6 +143,7 @@ local function nbsp(head,current) setsubtype(current,space_skip_code) else head, current = inject_nobreak_space(0x00A0,head,current,para.space,para.spacestretch,para.spaceshrink) + setsubtype(current,space_skip_code) end return head, current end @@ -148,16 +156,37 @@ function characters.replacenbsp(head,original) return head, current end +-- function characters.replacenbspaces(head) +-- for current in traverse_id(glyph_code,head) do +-- if getchar(current) == 0x00A0 then +-- local h = nbsp(head,current) +-- if h then +-- head = remove_node(h,current,true) +-- end +-- end +-- end +-- return head +-- end + function characters.replacenbspaces(head) - for current in traverse_id(glyph_code,head) do + local head = tonut(head) + local wipe = false + for current in traverse_id(glyph_code,head) do -- can be anytiem so no traverse_char if getchar(current) == 0x00A0 then + if wipe then + head = remove_node(h,current,true) + wipe = false + end local h = nbsp(head,current) if h then - head = remove_node(h,current,true) + wipe = current end end end - return head + if wipe then + head = remove_node(h,current,true) + end + return tonode(head) end -- This initialization might move someplace else if we need more of it. The problem is that @@ -219,6 +248,10 @@ local methods = { return nbsp(head,current) end, + [0x00AD] = function(head,current) -- softhyphen + return insert_node_after(head,current,languages.explicithyphen(current)) + end, + [0x2000] = function(head,current) -- enquad return inject_quad_space(0x2000,head,current,1/2) end, @@ -272,9 +305,11 @@ local methods = { end, [0x205F] = function(head,current) -- math thinspace - return inject_nobreak_space(0x205F,head,current,fontparameters[getfont(current)].space/8) + return inject_nobreak_space(0x205F,head,current,4*fontquads[getfont(current)]/18) end, + -- The next one is also a bom so maybe only when we have glyphs around it + -- [0xFEFF] = function(head,current) -- zerowidthnobreakspace -- return head, current -- end, @@ -283,29 +318,64 @@ local methods = { characters.methods = methods -function characters.handler(head) -- todo: use traverse_id - head = tonut(head) - local current = head - local done = false - while current do - local char, id = isglyph(current) +-- function characters.handler(head) -- todo: use traverse_id +-- head = tonut(head) +-- local current = head +-- local done = false +-- while current do +-- local char, id = isglyph(current) +-- if char then +-- local next = getnext(current) +-- local method = methods[char] +-- if method then +-- if trace_characters then +-- report_characters("replacing character %C, description %a",char,lower(chardata[char].description)) +-- end +-- local h = method(head,current) +-- if h then +-- head = remove_node(h,current,true) +-- end +-- done = true +-- end +-- current = next +-- else +-- current = getnext(current) +-- end +-- end +-- return tonode(head), done +-- end + +-- for current, char, font in traverse_char_data(head) will save 0.015 on a 300 page doc + +-- this also works ok in math as we run over glyphs and these stay glyphs ... not sure +-- about scripts and such but that is not important anyway ... some day we can consider +-- special definitions in math + +function characters.handler(head) + local head = tonut(head) + local wipe = false + for current in traverse_char(head) do + local char = getchar(current) if char then - local next = getnext(current) local method = methods[char] if method then + if wipe then + head = remove_node(head,wipe,true) + wipe = false + end if trace_characters then report_characters("replacing character %C, description %a",char,lower(chardata[char].description)) end local h = method(head,current) if h then - head = remove_node(h,current,true) + wipe = current end done = true end - current = next - else - current = getnext(current) end end + if wipe then + head = remove_node(head,wipe,true) + end return tonode(head), done end diff --git a/tex/context/base/mkiv/spac-chr.mkiv b/tex/context/base/mkiv/spac-chr.mkiv index c4aadd49f..ed2cb47f9 100644 --- a/tex/context/base/mkiv/spac-chr.mkiv +++ b/tex/context/base/mkiv/spac-chr.mkiv @@ -15,7 +15,7 @@ \unprotect -\registerctxluafile{spac-chr}{1.001} +\registerctxluafile{spac-chr}{} \definesystemattribute[characters][public] @@ -56,8 +56,13 @@ % \nobreakspace {\begingroup\setalignstateattribute\normalUchar"00A0\endgroup} % 1 = left \edef\nobreakspace {\normalUchar"00A0} % space -\edef\ideographicspace {\normalUchar"2000} % quad/2 -\edef\ideographichalffillspace{\normalUchar"2001} % quad +\edef\softhyphen {\normalUchar"00AD} % softhyohen +\edef\enquad {\normalUchar"2000} % quad/2 +\edef\emquad {\normalUchar"2001} % quad + +\let\ideographicspace \enquad +\let\ideographichalffillspace \emquad + \edef\twoperemspace {\normalUchar"2002} % quad/2 % % "2003 % quad == \quad == \hskip\emwidth \edef\threeperemspace {\normalUchar"2004} % quad/3 @@ -79,9 +84,9 @@ \udef\zerowidthnobreakspace {\penalty\plustenthousand\kern\zeropoint} \udef\fiveperemspace {\hskip\dimexpr\emwidth/5\relax} -\let\zwnj\zerowidthnonjoiner -\let\zwj \zerowidthjoiner -\let\nbsp\nobreakspace +\let\zwnj \zerowidthnonjoiner +\let\zwj \zerowidthjoiner +\let\nbsp \nobreakspace \chardef\optionalspace"1F % will be space unless before punctuation diff --git a/tex/context/base/mkiv/spac-grd.mkiv b/tex/context/base/mkiv/spac-grd.mkiv index 899b6e890..73c6e0dd1 100644 --- a/tex/context/base/mkiv/spac-grd.mkiv +++ b/tex/context/base/mkiv/spac-grd.mkiv @@ -303,18 +303,7 @@ % This is new (and experimental) and might replace some of the above. beware it doesn't always work % out well, e.g. when used grouped and such (e.g. before display math doesn't work out well). -\unexpanded\def\spac_fake_next_line_new - {\par - \begingroup - \reseteverypar - \dontleavehmode\hpack{\strut}\par - \clf_fakenextstrutline - \ifdim\pagetotal>\lineheight - \pagetotal\dimexpr\pagetotal-\lineheight\relax - \fi - \endgroup} - -% \unexpanded\def\spac_fake_next_line_old +% \unexpanded\def\fakenextstrutline % {\par % \begingroup % \reseteverypar @@ -323,7 +312,24 @@ % \vskip-\struttotal % \endgroup} -%let\fakenextstrutline\spac_fake_next_line_old -\let\fakenextstrutline\spac_fake_next_line_new +% \unexpanded\def\fakenextstrutline +% {\par +% \begingroup +% \reseteverypar +% \dontleavehmode\hpack{\strut}\par +% \clf_fakenextstrutline +% \ifdim\pagetotal>\lineheight +% \pagetotal\dimexpr\pagetotal-\lineheight\relax +% \fi +% \endgroup} + +% \unexpanded\def\fakenextstrutline +% {\par +% \begingroup +% \reseteverypar +% \forgetall +% \dontleavehmode\hpack{\strut}\par +% \clf_removelastline +% \endgroup} \protect \endinput diff --git a/tex/context/base/mkiv/spac-hor.mkiv b/tex/context/base/mkiv/spac-hor.mkiv index 405abcb5d..ce747a202 100644 --- a/tex/context/base/mkiv/spac-hor.mkiv +++ b/tex/context/base/mkiv/spac-hor.mkiv @@ -15,7 +15,7 @@ \unprotect -\registerctxluafile{spac-hor}{1.001} +\registerctxluafile{spac-hor}{} \let \parfillrightskip \parfillskip \newskip\parfillleftskip @@ -381,9 +381,9 @@ %D \macros %D {frenchspacing,nonfrenchspacing} %D -%D Somehow \type{\frenchspacing} can lead to hyphenation between -%D dashes so we now have \type {\newfrenchspacing} (moved from -%D \type {syst-chr}). +%D Somehow \type{\frenchspacing} can lead to hyphenation between dashes so we now +%D have \type {\newfrenchspacing} (moved from \type {syst-chr}). Maybe it's not +%D needed any more. %D Hm ... todo: @@ -515,7 +515,7 @@ \fi \ifdefined\softhyphen \else - \let\softhyphen\- + \let\softhyphen\explicitdiscretionary \fi \cldcontext{"\string\\unexpanded\string\\def\string\\\string\n{\string\\space}"} @@ -680,6 +680,7 @@ \global \s_spac_narrower_middle \zeropoint \global \s_spac_narrower_right \zeropoint\relax} \installnarrowermethod \v!none {} +\installnarrowermethod \v!reverse {} % never seen \unexpanded\def\spac_narrower_start#1% {\begingroup @@ -693,19 +694,45 @@ \spac_narrower_start_apply{\narrowerparameter\v!default}% \fi} +\newskip\s_spac_narrower_left_last +\newskip\s_spac_narrower_right_last +\newconditional\s_spac_narrower_last_swap + \def\spac_narrower_start_apply#1% {\narrowerparameter\c!before \global\s_spac_narrower_left \zeropoint \global\s_spac_narrower_right \zeropoint \global\s_spac_narrower_middle\zeropoint - \normalexpanded{\processcommalistwithparameters[#1]}\spac_narrower_initialize - \advance\leftskip \dimexpr\s_spac_narrower_left +\s_spac_narrower_middle\relax - \advance\rightskip\dimexpr\s_spac_narrower_right+\s_spac_narrower_middle\relax + \edef\askednarrower{#1} + \ifx\askednarrower\v!reverse + \ifconditional\s_spac_narrower_last_swap + \leftskip \s_spac_narrower_right_last + \rightskip\s_spac_narrower_left_last + \setfalse\s_spac_narrower_last_swap + \else + \leftskip \s_spac_narrower_left_last + \rightskip\s_spac_narrower_right_last + \settrue\s_spac_narrower_last_swap + \fi + \else + \normalexpanded{\processcommalistwithparameters[\askednarrower]}\spac_narrower_initialize + \advance\leftskip \dimexpr\s_spac_narrower_left +\s_spac_narrower_middle\relax + \advance\rightskip\dimexpr\s_spac_narrower_right+\s_spac_narrower_middle\relax + \fi \seteffectivehsize} \unexpanded\def\spac_narrower_stop {\narrowerparameter\c!after - \endgroup} + \normalexpanded{% + \endgroup + \s_spac_narrower_left_last \the\leftskip \relax + \s_spac_narrower_right_last\the\rightskip\relax + \ifconditional\s_spac_narrower_last_swap + \setfalse\s_spac_narrower_last_swap + \else + \settrue\s_spac_narrower_last_swap + \fi + }} \unexpanded\def\startnarrower {\dosingleempty\spac_narrower_start_basic} @@ -822,14 +849,16 @@ \forgetbothskips \to \everyforgetall -\unexpanded\def\forgetparskip - {\s_spac_whitespace_parskip\zeropoint - \parskip\zeropoint - \let\v_spac_whitespace_current\v!none} - -\appendtoks - \forgetparskip -\to \everyforgetall +% in spac-ver.mkiv +% +% \unexpanded\def\forgetparskip +% {\s_spac_whitespace_parskip\zeropoint +% \parskip\zeropoint +% \let\v_spac_whitespace_current\v!none} +% +% \appendtoks +% \forgetparskip +% \to \everyforgetall %D Tolerance (can also be set with align): @@ -1013,19 +1042,22 @@ %D adapted to \type {\hspace}: \unexpanded\def\textormathspace #1#2#3{\ifmmode\mskip#1#2\else\kern #1\hspaceamount\empty{#3}\fi\relax} +\unexpanded\def\textormathspacecommand #1#2#3{\ifmmode\mskip#1#2\else#3\fi\relax} \unexpanded\def\breakabletextormathspace#1#2#3{\ifmmode\mskip#1#2\else\hskip#1\hspaceamount\empty{#3}\fi\relax} \newmuskip\hairmuskip \hairmuskip=.15mu \unexpanded\def\hairspace {\textormathspace+\hairmuskip{.5}} \unexpanded\def\thinspace {\textormathspace+\thinmuskip 1} -\unexpanded\def\medspace {\textormathspace+\medmuskip 2} +%unexpanded\def\medspace {\textormathspace+\medmuskip 2} % 4/18 em \unexpanded\def\thickspace {\textormathspace+\thickmuskip3} \unexpanded\def\neghairspace {\textormathspace-\thinmuskip{.5}} \unexpanded\def\negthinspace {\textormathspace-\thinmuskip 1} \unexpanded\def\negmedspace {\textormathspace-\medmuskip 2} \unexpanded\def\negthickspace{\textormathspace-\thickmuskip3} +\unexpanded\edef\medspace {\textormathspacecommand+\medmuskip{\Uchar"205F}} + % needed for unicode: %unexpanded\def\breakablethinspace {\breakabletextormathspace+\thinmuskip1} @@ -1043,10 +1075,10 @@ %unexpanded\def\zerowidthnobreakspace {\penalty\plustenthousand\kern\zeropoint} %unexpanded\def\zerowidthspace {\hskip\zeropoint} -\definehspace[.5][.1250\emspaceamount] % could also be [.1250\spaceamount] -\definehspace[1] [.1667\emspaceamount] -\definehspace[2] [.2222\emspaceamount] -\definehspace[3] [.2777\emspaceamount] +\definehspace[.5][.1250\emwidth] % hair +\definehspace[1] [.1667\emwidth] % thin +\definehspace[2] [.2222\emwidth] % med +\definehspace[3] [.2777\emwidth] % thick \let \, \thinspace \let \: \medspace diff --git a/tex/context/base/mkiv/spac-prf.lua b/tex/context/base/mkiv/spac-prf.lua index 841e5d271..a28f30593 100644 --- a/tex/context/base/mkiv/spac-prf.lua +++ b/tex/context/base/mkiv/spac-prf.lua @@ -57,8 +57,8 @@ local getshift = nuts.getshift local getwidth = nuts.getwidth local getheight = nuts.getheight local getdepth = nuts.getdepth +local getboxglue = nuts.getboxglue -local setfield = nuts.setfield local setlink = nuts.setlink local setlist = nuts.setlist local setattr = nuts.setattr @@ -118,9 +118,7 @@ local function getprofile(line,step) return end - local glue_sign = getfield(line,"glue_sign") - local glue_order = getfield(line,"glue_order") - local glue_set = getfield(line,"glue_set") + local glue_set, glue_order, glue_sign = getboxglue(line) local heights = { } local depths = { } @@ -474,8 +472,7 @@ local function inject(top,bot,amount) -- todo: look at penalties setattr(glue,a_profilemethod,0) setattr(glue,a_visual,getattr(top,a_visual)) -- - setlink(glue,bot) - setlink(top,glue) + setlink(top,glue,bot) end methods[v_none] = function() diff --git a/tex/context/base/mkiv/spac-prf.mkvi b/tex/context/base/mkiv/spac-prf.mkvi index 8d150f58d..9a00da395 100644 --- a/tex/context/base/mkiv/spac-prf.mkvi +++ b/tex/context/base/mkiv/spac-prf.mkvi @@ -21,7 +21,7 @@ \unprotect -\registerctxluafile{spac-prf}{1.001} +\registerctxluafile{spac-prf}{} \definesystemattribute[profilemethod][public] diff --git a/tex/context/base/mkiv/spac-ver.lua b/tex/context/base/mkiv/spac-ver.lua index 2f0191e6a..288630a5d 100644 --- a/tex/context/base/mkiv/spac-ver.lua +++ b/tex/context/base/mkiv/spac-ver.lua @@ -30,8 +30,6 @@ if not modules then modules = { } end modules ['spac-ver'] = { -- todo: strip baselineskip around display math --- todo: getglue(n,false) instead of getfield - local next, type, tonumber = next, type, tonumber local gmatch, concat = string.gmatch, table.concat local ceil, floor = math.ceil, math.floor @@ -42,7 +40,6 @@ local todimen = string.todimen local formatters = string.formatters local nodes = nodes -local node = node local trackers = trackers local attributes = attributes local context = context @@ -54,7 +51,11 @@ local texgetcount = tex.getcount local texgetdimen = tex.getdimen local texset = tex.set local texsetdimen = tex.setdimen +local texsetcount = tex.setcount local texnest = tex.nest +local texgetbox = tex.getbox + +local buildpage = tex.triggerbuildpage local variables = interfaces.variables local implement = interfaces.implement @@ -72,8 +73,8 @@ local v_noheight = variables.noheight local v_nodepth = variables.nodepth local v_line = variables.line local v_halfline = variables.halfline -local v_line_m = "-" .. variables.line -local v_halfline_m = "-" .. variables.halfline +local v_line_m = "-" .. v_line +local v_halfline_m = "-" .. v_halfline local v_first = variables.first local v_last = variables.last local v_top = variables.top @@ -118,8 +119,6 @@ local nuts = nodes.nuts local tonode = nuts.tonode local tonut = nuts.tonut -local getfield = nuts.getfield -local setfield = nuts.setfield local getnext = nuts.getnext local setlink = nuts.setlink local getprev = nuts.getprev @@ -150,6 +149,7 @@ local find_node_tail = nuts.tail local flush_node = nuts.flush_node local traverse_nodes = nuts.traverse local traverse_nodes_id = nuts.traverse_id +local insert_node_after = nuts.insert_after local insert_node_before = nuts.insert_before local remove_node = nuts.remove local count_nodes = nuts.countall @@ -171,6 +171,7 @@ local new_rule = nodepool.rule local nodecodes = nodes.nodecodes local skipcodes = nodes.skipcodes +local penaltycodes = nodes.penaltycodes local penalty_code = nodecodes.penalty local kern_code = nodecodes.kern @@ -180,16 +181,21 @@ local hlist_code = nodecodes.hlist local vlist_code = nodecodes.vlist local localpar_code = nodecodes.localpar -local userskip_code = skipcodes.userskip -local lineskip_code = skipcodes.lineskip -local baselineskip_code = skipcodes.baselineskip -local parskip_code = skipcodes.parskip +local linebreak_code = penaltycodes.linebreakpenalty + +local userskip_code = skipcodes.userskip +local lineskip_code = skipcodes.lineskip +local baselineskip_code = skipcodes.baselineskip +local parskip_code = skipcodes.parskip +local topskip_code = skipcodes.topskip +local splittopskip_code = skipcodes.splittopskip + local abovedisplayskip_code = skipcodes.abovedisplayskip local belowdisplayskip_code = skipcodes.belowdisplayskip local abovedisplayshortskip_code = skipcodes.abovedisplayshortskip local belowdisplayshortskip_code = skipcodes.belowdisplayshortskip -local topskip_code = skipcodes.topskip -local splittopskip_code = skipcodes.splittopskip + +local properties = nodes.properties.data local vspacing = builders.vspacing or { } builders.vspacing = vspacing @@ -695,20 +701,22 @@ local function snap_topskip(current,method) return w, 0 end -local categories = allocate { - [0] = 'discard', - [1] = 'largest', - [2] = 'force' , - [3] = 'penalty', - [4] = 'add' , - [5] = 'disable', - [6] = 'nowhite', - [7] = 'goback', - [8] = 'together', -- not used (?) - [9] = 'overlay', - [10] = 'notopskip', +local categories = { + [0] = "discard", + [1] = "largest", + [2] = "force", + [3] = "penalty", + [4] = "add", + [5] = "disable", + [6] = "nowhite", + [7] = "goback", + [8] = "packed", + [9] = "overlay", + [10] = "enable", + [11] = "notopskip", } +categories = allocate(table.swapped(categories,categories)) vspacing.categories = categories function vspacing.tocategories(str) @@ -740,14 +748,16 @@ storage.register("builders/vspacing/data/skip", vspacingdata.skip, "builders.vsp do -- todo: interface.variables and properties - local P, C, R, S, Cc = lpeg.P, lpeg.C, lpeg.R, lpeg.S, lpeg.Cc + local P, C, R, S, Cc, Cs = lpeg.P, lpeg.C, lpeg.R, lpeg.S, lpeg.Cc, lpeg.Cs vspacing.fixed = false local map = vspacingdata.map local skip = vspacingdata.skip - local multiplier = C(S("+-")^0 * R("09")^1) * P("*") + local sign = S("+-")^0 + local multiplier = C(sign * R("09")^1) * P("*") + local singlefier = Cs(sign * Cc(1)) local separator = S(", ") local category = P(":") * C((1-separator)^1) local keyword = C((1-category-separator)^1) @@ -773,6 +783,7 @@ do -- todo: interface.variables and properties local ctx_flushblankhandling = context.flushblankhandling local ctx_addpredefinedblankskip = context.addpredefinedblankskip local ctx_addaskedblankskip = context.addaskedblankskip + local ctx_setblankpacked = context.setblankpacked local ctx_pushlogger = context.pushlogger local ctx_startblankhandling = context.startblankhandling @@ -781,6 +792,8 @@ do -- todo: interface.variables and properties local pattern = nil + local packed = categories.packed + local function handler(amount, keyword, detail) if not keyword then report_vspacing("unknown directive %a",s) @@ -794,7 +807,9 @@ do -- todo: interface.variables and properties ctx_flexibleblankskip() elseif keyword == k_category then local category = tonumber(detail) - if category then + if category == packed then + ctx_setblankpacked() + elseif category then ctx_setblankcategory(category) ctx_flushblankhandling() end @@ -820,7 +835,7 @@ do -- todo: interface.variables and properties end end - local splitter = ((multiplier + Cc(1)) * keyword * (category + Cc(false))) / handler + local splitter = ((multiplier + singlefier) * keyword * (category + Cc(false))) / handler pattern = (splitter + separator^1)^0 function vspacing.analyze(str) @@ -951,14 +966,14 @@ function vspacing.snapbox(n,how) end else local h, d, ch, cd, lines, extra = snap_hlist("box",box,sv,ht,dp) -setprop(box,"snapper",{ - ht = h, - dp = d, - ch = ch, - cd = cd, - extra = extra, - current = current, -}) + setprop(box,"snapper",{ + ht = h, + dp = d, + ch = ch, + cd = cd, + extra = extra, + current = current, + }) setwhd(box,wd,ch,cd) if trace_vsnapping then report_snapper("box list snapped from (%p,%p) to (%p,%p) using method %a (%s) for %a (%s lines): %s", @@ -983,689 +998,702 @@ end -- We can register and copy the rule instead. -local w, h, d = 0, 0, 0 ------ w, h, d = 100*65536, 65536, 65536 +do + + local w, h, d = 0, 0, 0 + ----- w, h, d = 100*65536, 65536, 65536 -local function forced_skip(head,current,width,where,trace) -- looks old ... we have other tricks now - if head == current then - if getsubtype(head) == baselineskip_code then - width = width - getwidth(head) + local function forced_skip(head,current,width,where,trace) -- looks old ... we have other tricks now + if head == current then + if getsubtype(head) == baselineskip_code then + width = width - getwidth(head) + end end + if width == 0 then + -- do nothing + elseif where == "after" then + head, current = insert_node_after(head,current,new_rule(w,h,d)) + head, current = insert_node_after(head,current,new_kern(width)) + head, current = insert_node_after(head,current,new_rule(w,h,d)) + else + local c = current + head, current = insert_node_before(head,current,new_rule(w,h,d)) + head, current = insert_node_before(head,current,new_kern(width)) + head, current = insert_node_before(head,current,new_rule(w,h,d)) + current = c + end + if trace then + report_vspacing("inserting forced skip of %p",width) + end + return head, current end - if width == 0 then - -- do nothing - elseif where == "after" then - head, current = insert_node_after(head,current,new_rule(w,h,d)) - head, current = insert_node_after(head,current,new_kern(width)) - head, current = insert_node_after(head,current,new_rule(w,h,d)) - else - local c = current - head, current = insert_node_before(head,current,new_rule(w,h,d)) - head, current = insert_node_before(head,current,new_kern(width)) - head, current = insert_node_before(head,current,new_rule(w,h,d)) - current = c - end - if trace then - report_vspacing("inserting forced skip of %p",width) - end - return head, current -end --- penalty only works well when before skip + -- penalty only works well when before skip -local discard = 0 -local largest = 1 -local force = 2 -local penalty = 3 -local add = 4 -local disable = 5 -local nowhite = 6 -local goback = 7 -local together = 8 -- not used (?) -local overlay = 9 -local enable = 10 + local discard = categories.discard + local largest = categories.largest + local force = categories.force + local penalty = categories.penalty + local add = categories.add + local disable = categories.disable + local nowhite = categories.nowhite + local goback = categories.goback + local packed = categories.packed + local overlay = categories.overlay + local enable = categories.enable + local notopskip = categories.notopskip --- [whatsits][hlist][glue][glue][penalty] + -- [whatsits][hlist][glue][glue][penalty] -local special_penalty_min = 32250 -local special_penalty_max = 35000 -local special_penalty_xxx = 0 + local special_penalty_min = 32250 + local special_penalty_max = 35000 + local special_penalty_xxx = 0 --- this is rather messy and complex: we want to make sure that successive --- header don't break but also make sure that we have at least a decent --- break when we have succesive ones (often when testing) + -- this is rather messy and complex: we want to make sure that successive + -- header don't break but also make sure that we have at least a decent + -- break when we have succesive ones (often when testing) --- todo: mark headers as such so that we can recognize them + -- todo: mark headers as such so that we can recognize them -local specialmethods = { } -local specialmethod = 1 + local specialmethods = { } + local specialmethod = 1 -local properties = nodes.properties.data - -specialmethods[1] = function(pagehead,pagetail,start,penalty) - -- - if not pagehead or penalty < special_penalty_min or penalty > special_penalty_max then - return - end - local current = pagetail - -- - -- nodes.showsimplelist(pagehead,0) - -- - if trace_specials then - report_specials("checking penalty %a",penalty) - end - while current do - local id = getid(current) - if id == penalty_code then - local p = properties[current] - if p then - local p = p.special_penalty - if not p then - if trace_specials then - report_specials(" regular penalty, continue") - end - elseif p == penalty then - if trace_specials then - report_specials(" context penalty %a, same level, overloading",p) - end - return special_penalty_xxx - elseif p > special_penalty_min and p < special_penalty_max then - if penalty < p then + specialmethods[1] = function(pagehead,pagetail,start,penalty) + -- + if not pagehead or penalty < special_penalty_min or penalty > special_penalty_max then + return + end + local current = pagetail + -- + -- nodes.showsimplelist(pagehead,0) + -- + if trace_specials then + report_specials("checking penalty %a",penalty) + end + while current do + local id = getid(current) + if id == penalty_code then + local p = properties[current] + if p then + local p = p.special_penalty + if not p then if trace_specials then - report_specials(" context penalty %a, lower level, overloading",p) + report_specials(" regular penalty, continue") end - return special_penalty_xxx - else + elseif p == penalty then if trace_specials then - report_specials(" context penalty %a, higher level, quitting",p) + report_specials(" context penalty %a, same level, overloading",p) end - return - end - elseif trace_specials then - report_specials(" context penalty %a, higher level, continue",p) - end - else - local p = getpenalty(current) - if p < 10000 then - -- assume some other mechanism kicks in so we seem to have content - if trace_specials then - report_specials(" regular penalty %a, quitting",p) + return special_penalty_xxx + elseif p > special_penalty_min and p < special_penalty_max then + if penalty < p then + if trace_specials then + report_specials(" context penalty %a, lower level, overloading",p) + end + return special_penalty_xxx + else + if trace_specials then + report_specials(" context penalty %a, higher level, quitting",p) + end + return + end + elseif trace_specials then + report_specials(" context penalty %a, higher level, continue",p) end - break else - if trace_specials then - report_specials(" regular penalty %a, continue",p) + local p = getpenalty(current) + if p < 10000 then + -- assume some other mechanism kicks in so we seem to have content + if trace_specials then + report_specials(" regular penalty %a, quitting",p) + end + break + else + if trace_specials then + report_specials(" regular penalty %a, continue",p) + end end end end + current = getprev(current) end - current = getprev(current) - end - -- none found, so no reson to be special - if trace_specials then - if pagetail then - report_specials(" context penalty, discarding, nothing special") - else - report_specials(" context penalty, discarding, nothing preceding") + -- none found, so no reson to be special + if trace_specials then + if pagetail then + report_specials(" context penalty, discarding, nothing special") + else + report_specials(" context penalty, discarding, nothing preceding") + end end + return special_penalty_xxx end - return special_penalty_xxx -end --- specialmethods[2] : always put something before and use that as to-be-changed --- --- we could inject a vadjust to force a recalculation .. a mess --- --- So, the next is far from robust and okay but for the moment this overlaying --- has to do. Always test this with the examples in spec-ver.mkvi! - -local function check_experimental_overlay(head,current) - local p = nil - local c = current - local n = nil - local function overlay(p,n,mvl) - local p_wd, p_ht, p_dp = getwhd(p) - local n_wd, n_ht, n_dp = getwhd(n) - local skips = 0 - -- - -- We deal with this at the tex end .. we don't see spacing .. enabling this code - -- is probably harmless but then we need to test it. - -- - local c = getnext(p) - while c and c ~= n do - local id = getid(c) - if id == glue_code then - skips = skips + getwidth(c) - elseif id == kern_code then - skips = skips + getkern(c) + -- This will be replaced after 0.80+ when we have a more robust look-back and + -- can look at the bigger picture. + + -- todo: look back and when a special is there before a list is seen penalty keep ut + + -- we now look back a lot, way too often + + -- userskip + -- lineskip + -- baselineskip + -- parskip + -- abovedisplayskip + -- belowdisplayskip + -- abovedisplayshortskip + -- belowdisplayshortskip + -- topskip + -- splittopskip + + -- we could inject a vadjust to force a recalculation .. a mess + -- + -- So, the next is far from robust and okay but for the moment this overlaying + -- has to do. Always test this with the examples in spac-ver.mkvi! + + local function check_experimental_overlay(head,current) + local p = nil + local c = current + local n = nil + local function overlay(p,n,mvl) + local p_wd, p_ht, p_dp = getwhd(p) + local n_wd, n_ht, n_dp = getwhd(n) + local skips = 0 + -- + -- We deal with this at the tex end .. we don't see spacing .. enabling this code + -- is probably harmless but then we need to test it. + -- + -- we could calculate this before we call + -- + -- problem: prev list and next list can be unconnected + -- + local c = getnext(p) + local l = c + while c and c ~= n do + local id = getid(c) + if id == glue_code then + skips = skips + getwidth(c) + elseif id == kern_code then + skips = skips + getkern(c) + end + l = c + c = getnext(c) end - c = getnext(c) - end - -- - local delta = n_ht + skips + p_dp - texsetdimen("global","d_spac_overlay",-delta) -- for tracing - local k = new_kern(-delta) - if n_ht > p_ht then + local c = getprev(n) + while c and c ~= n and c ~= l do + local id = getid(c) + if id == glue_code then + skips = skips + getwidth(c) + elseif id == kern_code then + skips = skips + getkern(c) + end + c = getprev(c) + end + -- + local delta = n_ht + skips + p_dp + texsetdimen("global","d_spac_overlay",-delta) -- for tracing -- we should adapt pagetotal ! (need a hook for that) .. now we have the wrong pagebreak - setheight(p,n_ht) - end - insert_node_before(head,n,k) - if p == head then - head = k - end - if trace_vspacing then - report_vspacing("overlaying, prev height: %p, prev depth: %p, next height: %p, skips: %p, move up: %p",p_ht,p_dp,n_ht,skips,delta) + local k = new_kern(-delta) + head = insert_node_before(head,n,k) + if n_ht > p_ht then + local k = new_kern(n_ht-p_ht) + head = insert_node_before(head,p,k) + end + if trace_vspacing then + report_vspacing("overlaying, prev height: %p, prev depth: %p, next height: %p, skips: %p, move up: %p",p_ht,p_dp,n_ht,skips,delta) + end + return remove_node(head,current,true) end - return remove_node(head,current,true) - end - -- goto next line - while c do - local id = getid(c) - if id == glue_code or id == penalty_code or id == kern_code then - -- skip (actually, remove) - c = getnext(c) - elseif id == hlist_code then - n = c - break - else - break - end - end - if n then - -- we have a next line, goto prev line - c = current + -- goto next line while c do local id = getid(c) - if id == glue_code or id == penalty_code then - c = getprev(c) + if id == glue_code or id == penalty_code or id == kern_code then + -- skip (actually, remove) + c = getnext(c) elseif id == hlist_code then - p = c + n = c break else break end end - if not p then - if a_snapmethod == a_snapvbox then - -- quit, we're not on the mvl - else - local c = tonut(texlists.page_head) - while c and c ~= n do - local id = getid(c) - if id == hlist_code then - p = c - end - c = getnext(c) + if n then + -- we have a next line, goto prev line + c = current + while c do + local id = getid(c) + if id == glue_code or id == penalty_code then -- kern ? + c = getprev(c) + elseif id == hlist_code then + p = c + break + else + break end - if p and p ~= n then - return overlay(p,n,true) + end + if not p then + if a_snapmethod == a_snapvbox then + -- quit, we're not on the mvl + else + -- inefficient when we're at the end of a page + local c = tonut(texlists.page_head) + while c and c ~= n do + local id = getid(c) + if id == hlist_code then + p = c + end + c = getnext(c) + end + if p and p ~= n then + return overlay(p,n,true) + end end + elseif p ~= n then + return overlay(p,n,false) end - elseif p ~= n then - return overlay(p,n,false) end + -- in fact, we could try again later ... so then no remove (a few tries) + return remove_node(head, current, true) end - -- in fact, we could try again later ... so then no remove (a few tries) - return remove_node(head, current, true) -end - --- This will be replaced after 0.80+ when we have a more robust look-back and --- can look at the bigger picture. - --- todo: look back and when a special is there before a list is seen penalty keep ut - --- we now look back a lot, way too often - --- userskip --- lineskip --- baselineskip --- parskip --- abovedisplayskip --- belowdisplayskip --- abovedisplayshortskip --- belowdisplayshortskip --- topskip --- splittopskip - -local experiment = true directives.register("vspacing.experiment",function(v) experiment = v end) - -local function collapser(head,where,what,trace,snap,a_snapmethod) -- maybe also pass tail - if trace then - reset_tracing(head) - end - local current, oldhead = head, head - local glue_order, glue_data, force_glue = 0, nil, false - local penalty_order, penalty_data, natural_penalty, special_penalty = 0, nil, nil, nil - local parskip, ignore_parskip, ignore_following, ignore_whitespace, keep_together = nil, false, false, false, false - local lastsnap = nil - -- - -- todo: keep_together: between headers - -- - local pagehead = nil - local pagetail = nil - local function getpagelist() - if not pagehead then - pagehead = texlists.page_head - if pagehead then - pagehead = tonut(pagehead) - pagetail = find_node_tail(pagehead) -- no texlists.page_tail yet-- no texlists.page_tail yet - end - end - end - -- - local function compensate(n) - local g = 0 - while n and getid(n) == glue_code do - g = g + getwidth(n) - n = getnext(n) + local function collapser(head,where,what,trace,snap,a_snapmethod) -- maybe also pass tail + if trace then + reset_tracing(head) end - if n then - local p = getprop(n,"snapper") - if p then - local extra = p.extra - if extra and extra < 0 then -- hm, extra can be unset ... needs checking - local h = p.ch -- getheight(n) - -- maybe an extra check - -- if h - extra < g then - setheight(n,h-2*extra) - p.extra = 0 - if trace_vsnapping then - report_snapper("removed extra space at top: %p",extra) - end - -- end + local current, oldhead = head, head + local glue_order, glue_data, force_glue = 0, nil, false + local penalty_order, penalty_data, natural_penalty, special_penalty = 0, nil, nil, nil + local parskip, ignore_parskip, ignore_following, ignore_whitespace, keep_together = nil, false, false, false, false + local lastsnap = nil + -- + -- todo: keep_together: between headers + -- + local pagehead = nil + local pagetail = nil + + local function getpagelist() + if not pagehead then + pagehead = texlists.page_head + if pagehead then + pagehead = tonut(pagehead) + pagetail = find_node_tail(pagehead) -- no texlists.page_tail yet-- no texlists.page_tail yet end end - return n end - end - -- - local function removetopsnap() - getpagelist() - if pagehead then - local n = pagehead and compensate(pagehead) - if n and n ~= pagetail then - local p = getprop(pagetail,"snapper") + -- + local function compensate(n) + local g = 0 + while n and getid(n) == glue_code do + g = g + getwidth(n) + n = getnext(n) + end + if n then + local p = getprop(n,"snapper") if p then - local e = p.extra - if e and e < 0 then - local t = texget("pagetotal") - if t > 0 then - local g = texget("pagegoal") -- 1073741823 is signal - local d = g - t - if d < -e then - local penalty = new_penalty(1000000) - setlink(penalty,head) - head = penalty - report_snapper("force pagebreak due to extra space at bottom: %p",e) + local extra = p.extra + if extra and extra < 0 then -- hm, extra can be unset ... needs checking + local h = p.ch -- getheight(n) + -- maybe an extra check + -- if h - extra < g then + setheight(n,h-2*extra) + p.extra = 0 + if trace_vsnapping then + report_snapper("removed extra space at top: %p",extra) end - end + -- end end end + return n end - elseif head then - compensate(head) end - end - -- - local function getavailable() - getpagelist() - if pagehead then - local t = texget("pagetotal") - if t > 0 then - local g = texget("pagegoal") - return g - t + -- + local function removetopsnap() + getpagelist() + if pagehead then + local n = pagehead and compensate(pagehead) + if n and n ~= pagetail then + local p = getprop(pagetail,"snapper") + if p then + local e = p.extra + if e and e < 0 then + local t = texget("pagetotal") + if t > 0 then + local g = texget("pagegoal") -- 1073741823 is signal + local d = g - t + if d < -e then + local penalty = new_penalty(1000000) + setlink(penalty,head) + head = penalty + report_snapper("force pagebreak due to extra space at bottom: %p",e) + end + end + end + end + end + elseif head then + compensate(head) end end - return false - end - -- - local function flush(why) - if penalty_data then - local p = new_penalty(penalty_data) - if trace then - trace_done("flushed due to " .. why,p) - end - if penalty_data >= 10000 then -- or whatever threshold? - local prev = getprev(current) - if getid(prev) == glue_code then -- maybe go back more, or maybe even push back before any glue - -- tricky case: spacing/grid-007.tex: glue penalty glue - head = insert_node_before(head,prev,p) - else - head = insert_node_before(head,current,p) + -- + local function getavailable() + getpagelist() + if pagehead then + local t = texget("pagetotal") + if t > 0 then + local g = texget("pagegoal") + return g - t end - else - head = insert_node_before(head,current,p) - end - -- if penalty_data > special_penalty_min and penalty_data < special_penalty_max then - local props = properties[p] - if props then - props.special_penalty = special_penalty or penalty_data - else - properties[p] = { - special_penalty = special_penalty or penalty_data - } end - -- end + return false end - if glue_data then - if force_glue then + -- + local function flush(why) + if penalty_data then + local p = new_penalty(penalty_data) if trace then - trace_done("flushed due to forced " .. why,glue_data) + trace_done("flushed due to " .. why,p) end - head = forced_skip(head,current,getwidth(glue_data,width),"before",trace) - flush_node(glue_data) - else - local width, stretch, shrink = getglue(glue_data) - if width ~= 0 then - if trace then - trace_done("flushed due to non zero " .. why,glue_data) + if penalty_data >= 10000 then -- or whatever threshold? + local prev = getprev(current) + if getid(prev) == glue_code then -- maybe go back more, or maybe even push back before any glue + -- tricky case: spacing/grid-007.tex: glue penalty glue + head = insert_node_before(head,prev,p) + else + head = insert_node_before(head,current,p) end - head = insert_node_before(head,current,glue_data) - elseif stretch ~= 0 or shrink ~= 0 then + else + head = insert_node_before(head,current,p) + end + -- if penalty_data > special_penalty_min and penalty_data < special_penalty_max then + local props = properties[p] + if props then + props.special_penalty = special_penalty or penalty_data + else + properties[p] = { + special_penalty = special_penalty or penalty_data + } + end + -- end + end + if glue_data then + if force_glue then if trace then - trace_done("flushed due to stretch/shrink in" .. why,glue_data) + trace_done("flushed due to forced " .. why,glue_data) end - head = insert_node_before(head,current,glue_data) - else - -- report_vspacing("needs checking (%s): %p",skipcodes[getsubtype(glue_data)],w) + head = forced_skip(head,current,getwidth(glue_data,width),"before",trace) flush_node(glue_data) + else + local width, stretch, shrink = getglue(glue_data) + if width ~= 0 then + if trace then + trace_done("flushed due to non zero " .. why,glue_data) + end + head = insert_node_before(head,current,glue_data) + elseif stretch ~= 0 or shrink ~= 0 then + if trace then + trace_done("flushed due to stretch/shrink in" .. why,glue_data) + end + head = insert_node_before(head,current,glue_data) + else + -- report_vspacing("needs checking (%s): %p",skipcodes[getsubtype(glue_data)],w) + flush_node(glue_data) + end end end - end + if trace then + trace_node(current) + end + glue_order, glue_data, force_glue = 0, nil, false + penalty_order, penalty_data, natural_penalty = 0, nil, nil + parskip, ignore_parskip, ignore_following, ignore_whitespace = nil, false, false, false + end + -- + if trace_vsnapping then + report_snapper("global ht/dp = %p/%p, local ht/dp = %p/%p", + texgetdimen("globalbodyfontstrutheight"), + texgetdimen("globalbodyfontstrutdepth"), + texgetdimen("bodyfontstrutheight"), + texgetdimen("bodyfontstrutdepth") + ) + end if trace then - trace_node(current) + trace_info("start analyzing",where,what) end - glue_order, glue_data, force_glue = 0, nil, false - penalty_order, penalty_data, natural_penalty = 0, nil, nil - parskip, ignore_parskip, ignore_following, ignore_whitespace = nil, false, false, false - end - -- - if trace_vsnapping then - report_snapper("global ht/dp = %p/%p, local ht/dp = %p/%p", - texgetdimen("globalbodyfontstrutheight"), - texgetdimen("globalbodyfontstrutdepth"), - texgetdimen("bodyfontstrutheight"), - texgetdimen("bodyfontstrutdepth") - ) - end - if trace then - trace_info("start analyzing",where,what) - end - if snap and where == "page" then - removetopsnap() - end - while current do - local id = getid(current) - if id == hlist_code or id == vlist_code then - -- needs checking, why so many calls - if snap then - lastsnap = nil - local list = getlist(current) - local s = getattr(current,a_snapmethod) - if not s then - -- if trace_vsnapping then - -- report_snapper("mvl list not snapped") - -- end - elseif s == 0 then - if trace_vsnapping then - report_snapper("mvl %a not snapped, already done: %s",nodecodes[id],listtoutf(list)) - end - else - local sv = snapmethods[s] - if sv then - -- check if already snapped - local done = list and already_done(id,list,a_snapmethod) - if done then - -- assume that the box is already snapped - if trace_vsnapping then - local w, h, d = getwhd(current) - report_snapper("mvl list already snapped at (%p,%p): %s",h,d,listtoutf(list)) - end - else - local h, d, ch, cd, lines, extra = snap_hlist("mvl",current,sv,false,false) - lastsnap = { - ht = h, - dp = d, - ch = ch, - cd = cd, - extra = extra, - current = current, - } - setprop(current,"snapper",lastsnap) - if trace_vsnapping then - report_snapper("mvl %a snapped from (%p,%p) to (%p,%p) using method %a (%s) for %a (%s lines): %s", - nodecodes[id],h,d,ch,cd,sv.name,sv.specification,where,lines,listtoutf(list)) + if snap and where == "page" then + removetopsnap() + end + while current do + local id = getid(current) + if id == hlist_code or id == vlist_code then + -- needs checking, why so many calls + if snap then + lastsnap = nil + local list = getlist(current) + local s = getattr(current,a_snapmethod) + if not s then + -- if trace_vsnapping then + -- report_snapper("mvl list not snapped") + -- end + elseif s == 0 then + if trace_vsnapping then + report_snapper("mvl %a not snapped, already done: %s",nodecodes[id],listtoutf(list)) + end + else + local sv = snapmethods[s] + if sv then + -- check if already snapped + local done = list and already_done(id,list,a_snapmethod) + if done then + -- assume that the box is already snapped + if trace_vsnapping then + local w, h, d = getwhd(current) + report_snapper("mvl list already snapped at (%p,%p): %s",h,d,listtoutf(list)) + end + else + local h, d, ch, cd, lines, extra = snap_hlist("mvl",current,sv,false,false) + lastsnap = { + ht = h, + dp = d, + ch = ch, + cd = cd, + extra = extra, + current = current, + } + setprop(current,"snapper",lastsnap) + if trace_vsnapping then + report_snapper("mvl %a snapped from (%p,%p) to (%p,%p) using method %a (%s) for %a (%s lines): %s", + nodecodes[id],h,d,ch,cd,sv.name,sv.specification,where,lines,listtoutf(list)) + end end + elseif trace_vsnapping then + report_snapper("mvl %a not snapped due to unknown snap specification: %s",nodecodes[id],listtoutf(list)) end - elseif trace_vsnapping then - report_snapper("mvl %a not snapped due to unknown snap specification: %s",nodecodes[id],listtoutf(list)) + setattr(current,a_snapmethod,0) end - setattr(current,a_snapmethod,0) + else + -- end - else - -- - end - -- tex.prevdepth = 0 - flush("list") - current = getnext(current) - elseif id == penalty_code then - -- natural_penalty = getpenalty(current) - -- if trace then - -- trace_done("removed penalty",current) - -- end - -- head, current = remove_node(head, current, true) - current = getnext(current) - elseif id == kern_code then - if snap and trace_vsnapping and getkern(current) ~= 0 then - report_snapper("kern of %p kept",getkern(current)) - end - flush("kern") - current = getnext(current) - elseif id == glue_code then - local subtype = getsubtype(current) - if subtype == userskip_code then - local sc = getattr(current,a_skipcategory) -- has no default, no unset (yet) - local so = getattr(current,a_skiporder) or 1 -- has 1 default, no unset (yet) - local sp = getattr(current,a_skippenalty) -- has no default, no unset (yet) - if sp and sc == penalty then - if where == "page" then - getpagelist() - local p = specialmethods[specialmethod](pagehead,pagetail,current,sp) - if p then - -- todo: other tracer - -- - -- if trace then - -- trace_skip("previous special penalty %a is changed to %a using method %a",sp,p,specialmethod) - -- end - special_penalty = sp - sp = p + -- tex.prevdepth = 0 + flush("list") + current = getnext(current) + elseif id == penalty_code then + -- natural_penalty = getpenalty(current) + -- if trace then + -- trace_done("removed penalty",current) + -- end + -- head, current = remove_node(head, current, true) + current = getnext(current) + elseif id == kern_code then + if snap and trace_vsnapping and getkern(current) ~= 0 then + report_snapper("kern of %p kept",getkern(current)) + end + flush("kern") + current = getnext(current) + elseif id == glue_code then + local subtype = getsubtype(current) + if subtype == userskip_code then + local sc = getattr(current,a_skipcategory) -- has no default, no unset (yet) + local so = getattr(current,a_skiporder) or 1 -- has 1 default, no unset (yet) + local sp = getattr(current,a_skippenalty) -- has no default, no unset (yet) + if sp and sc == penalty then + if where == "page" then + getpagelist() + local p = specialmethods[specialmethod](pagehead,pagetail,current,sp) + if p then + -- todo: other tracer + -- + -- if trace then + -- trace_skip("previous special penalty %a is changed to %a using method %a",sp,p,specialmethod) + -- end + special_penalty = sp + sp = p + end end - end - if not penalty_data then - penalty_data = sp - elseif penalty_order < so then - penalty_order, penalty_data = so, sp - elseif penalty_order == so and sp > penalty_data then - penalty_data = sp - end - if trace then - trace_skip("penalty in skip",sc,so,sp,current) - end - head, current = remove_node(head, current, true) - elseif not sc then -- if not sc then - if glue_data then - if trace then - trace_done("flush",glue_data) + if not penalty_data then + penalty_data = sp + elseif penalty_order < so then + penalty_order, penalty_data = so, sp + elseif penalty_order == so and sp > penalty_data then + penalty_data = sp end - head = insert_node_before(head,current,glue_data) if trace then - trace_natural("natural",current) + trace_skip("penalty in skip",sc,so,sp,current) end - current = getnext(current) - else - -- not look back across head - -- todo: prev can be whatsit (latelua) - local previous = getprev(current) - if previous and getid(previous) == glue_code and getsubtype(previous) == userskip_code then - local pwidth, pstretch, pshrink, pstretch_order, pshrink_order = getglue(previous) - local cwidth, cstretch, cshrink, cstretch_order, cshrink_order = getglue(current) - if pstretch_order == 0 and pshrink_order == 0 and cstretch_order == 0 and cshrink_order == 0 then - setglue(previous,pwidth + cwidth, pstretch + cstretch, pshrink + cshrink) - if trace then - trace_natural("removed",current) - end - head, current = remove_node(head, current, true) - if trace then - trace_natural("collapsed",previous) + head, current = remove_node(head, current, true) + elseif not sc then -- if not sc then + if glue_data then + if trace then + trace_done("flush",glue_data) + end + head = insert_node_before(head,current,glue_data) + if trace then + trace_natural("natural",current) + end + current = getnext(current) + else + -- not look back across head + -- todo: prev can be whatsit (latelua) + local previous = getprev(current) + if previous and getid(previous) == glue_code and getsubtype(previous) == userskip_code then + local pwidth, pstretch, pshrink, pstretch_order, pshrink_order = getglue(previous) + local cwidth, cstretch, cshrink, cstretch_order, cshrink_order = getglue(current) + if pstretch_order == 0 and pshrink_order == 0 and cstretch_order == 0 and cshrink_order == 0 then + setglue(previous,pwidth + cwidth, pstretch + cstretch, pshrink + cshrink) + if trace then + trace_natural("removed",current) + end + head, current = remove_node(head, current, true) + if trace then + trace_natural("collapsed",previous) + end + else + if trace then + trace_natural("filler",current) + end + current = getnext(current) end else if trace then - trace_natural("filler",current) + trace_natural("natural (no prev)",current) end current = getnext(current) end - else + end + glue_order, glue_data = 0, nil + elseif sc == disable or sc == enable then + local next = getnext(current) + if next then + ignore_following = sc == disable if trace then - trace_natural("natural (no prev)",current) + trace_skip(sc == disable and "disable" or "enable",sc,so,sp,current) end - current = getnext(current) + head, current = remove_node(head, current, true) + else + current = next end - end - glue_order, glue_data = 0, nil - elseif sc == disable or sc == enable then - local next = getnext(current) - if not experiment or next then - ignore_following = sc == disable + elseif sc == packed then if trace then - trace_skip(sc == disable and "disable" or "enable",sc,so,sp,current) + trace_skip("packed",sc,so,sp,current) end + -- can't happen ! head, current = remove_node(head, current, true) - else - current = next - end - elseif sc == together then - local next = getnext(current) - if not experiment or next then - keep_together = true + elseif sc == nowhite then + local next = getnext(current) + if next then + ignore_whitespace = true + head, current = remove_node(head, current, true) + else + current = next + end + elseif sc == discard then if trace then - trace_skip("together",sc,so,sp,current) + trace_skip("discard",sc,so,sp,current) end head, current = remove_node(head, current, true) - else - current = next - end - elseif sc == nowhite then - local next = getnext(current) - if not experiment or next then - ignore_whitespace = true - head, current = remove_node(head, current, true) - else - current = next - end - elseif sc == discard then - if trace then - trace_skip("discard",sc,so,sp,current) - end - head, current = remove_node(head, current, true) - elseif sc == overlay then - -- todo (overlay following line over previous - if trace then - trace_skip("overlay",sc,so,sp,current) - end - -- beware: head can actually be after the affected nodes as - -- we look back ... some day head will the real head - head, current = check_experimental_overlay(head,current,a_snapmethod) - elseif ignore_following then - if trace then - trace_skip("disabled",sc,so,sp,current) - end - head, current = remove_node(head, current, true) - elseif not glue_data then - if trace then - trace_skip("assign",sc,so,sp,current) - end - glue_order = so - head, current, glue_data = remove_node(head, current) - elseif glue_order < so then - if trace then - trace_skip("force",sc,so,sp,current) - end - glue_order = so - flush_node(glue_data) - head, current, glue_data = remove_node(head, current) - elseif glue_order == so then - -- is now exclusive, maybe support goback as combi, else why a set - if sc == largest then - local cw = getwidth(current) - local gw = getwidth(glue_data) - if cw > gw then - if trace then - trace_skip("largest",sc,so,sp,current) - end - flush_node(glue_data) - head, current, glue_data = remove_node(head,current) - else - if trace then - trace_skip("remove smallest",sc,so,sp,current) - end - head, current = remove_node(head, current, true) + elseif sc == overlay then + -- todo (overlay following line over previous + if trace then + trace_skip("overlay",sc,so,sp,current) end - elseif sc == goback then + -- beware: head can actually be after the affected nodes as + -- we look back ... some day head will the real head + head, current = check_experimental_overlay(head,current,a_snapmethod) + elseif ignore_following then if trace then - trace_skip("goback",sc,so,sp,current) + trace_skip("disabled",sc,so,sp,current) end - flush_node(glue_data) - head, current, glue_data = remove_node(head,current) - elseif sc == force then - -- last one counts, some day we can provide an accumulator and largest etc - -- but not now + head, current = remove_node(head, current, true) + elseif not glue_data then if trace then - trace_skip("force",sc,so,sp,current) + trace_skip("assign",sc,so,sp,current) end - flush_node(glue_data) + glue_order = so head, current, glue_data = remove_node(head, current) - elseif sc == penalty then + elseif glue_order < so then if trace then - trace_skip("penalty",sc,so,sp,current) + trace_skip("force",sc,so,sp,current) end + glue_order = so flush_node(glue_data) - glue_data = nil - head, current = remove_node(head, current, true) - elseif sc == add then - if trace then - trace_skip("add",sc,so,sp,current) + head, current, glue_data = remove_node(head, current) + elseif glue_order == so then + -- is now exclusive, maybe support goback as combi, else why a set + if sc == largest then + local cw = getwidth(current) + local gw = getwidth(glue_data) + if cw > gw then + if trace then + trace_skip("largest",sc,so,sp,current) + end + flush_node(glue_data) + head, current, glue_data = remove_node(head,current) + else + if trace then + trace_skip("remove smallest",sc,so,sp,current) + end + head, current = remove_node(head, current, true) + end + elseif sc == goback then + if trace then + trace_skip("goback",sc,so,sp,current) + end + flush_node(glue_data) + head, current, glue_data = remove_node(head,current) + elseif sc == force then + -- last one counts, some day we can provide an accumulator and largest etc + -- but not now + if trace then + trace_skip("force",sc,so,sp,current) + end + flush_node(glue_data) + head, current, glue_data = remove_node(head, current) + elseif sc == penalty then + if trace then + trace_skip("penalty",sc,so,sp,current) + end + flush_node(glue_data) + glue_data = nil + head, current = remove_node(head, current, true) + elseif sc == add then + if trace then + trace_skip("add",sc,so,sp,current) + end + local cwidth, cstretch, cshrink = getglue(current) + local gwidth, gstretch, gshrink = getglue(glue_data) + setglue(old,gwidth + cwidth, gstretch + cstretch, gshrink + cshrink) + -- toto: order + head, current = remove_node(head, current, true) + else + if trace then + trace_skip("unknown",sc,so,sp,current) + end + head, current = remove_node(head, current, true) end - local cwidth, cstretch, cshrink = getglue(current) - local gwidth, gstretch, gshrink = getglue(glue_data) - setglue(old,gwidth + cwidth, gstretch + cstretch, gshrink + cshrink) - -- toto: order - head, current = remove_node(head, current, true) else if trace then trace_skip("unknown",sc,so,sp,current) end head, current = remove_node(head, current, true) end - else - if trace then - trace_skip("unknown",sc,so,sp,current) + if sc == force then + force_glue = true end - head, current = remove_node(head, current, true) - end - if sc == force then - force_glue = true - end - elseif subtype == lineskip_code then - if snap then - local s = getattr(current,a_snapmethod) - if s and s ~= 0 then - setattr(current,a_snapmethod,0) - setwidth(current,0) - if trace_vsnapping then - report_snapper("lineskip set to zero") + elseif subtype == lineskip_code then + if snap then + local s = getattr(current,a_snapmethod) + if s and s ~= 0 then + setattr(current,a_snapmethod,0) + setwidth(current,0) + if trace_vsnapping then + report_snapper("lineskip set to zero") + end + else + if trace then + trace_skip("lineskip",sc,so,sp,current) + end + flush("lineskip") end else if trace then @@ -1673,21 +1701,21 @@ local function collapser(head,where,what,trace,snap,a_snapmethod) -- maybe also end flush("lineskip") end - else - if trace then - trace_skip("lineskip",sc,so,sp,current) - end - flush("lineskip") - end - current = getnext(current) - elseif subtype == baselineskip_code then - if snap then - local s = getattr(current,a_snapmethod) - if s and s ~= 0 then - setattr(current,a_snapmethod,0) - setwidth(current,0) - if trace_vsnapping then - report_snapper("baselineskip set to zero") + current = getnext(current) + elseif subtype == baselineskip_code then + if snap then + local s = getattr(current,a_snapmethod) + if s and s ~= 0 then + setattr(current,a_snapmethod,0) + setwidth(current,0) + if trace_vsnapping then + report_snapper("baselineskip set to zero") + end + else + if trace then + trace_skip("baselineskip",sc,so,sp,current) + end + flush("baselineskip") end else if trace then @@ -1695,53 +1723,53 @@ local function collapser(head,where,what,trace,snap,a_snapmethod) -- maybe also end flush("baselineskip") end - else - if trace then - trace_skip("baselineskip",sc,so,sp,current) - end - flush("baselineskip") - end - current = getnext(current) - elseif subtype == parskip_code then - -- parskip always comes later - if ignore_whitespace then - if trace then - trace_natural("ignored parskip",current) - end - head, current = remove_node(head, current, true) - elseif glue_data then - local w = getwidth(current) - if (w ~= 0) and (w > getwidth(glue_data)) then - glue_data = current + current = getnext(current) + elseif subtype == parskip_code then + -- parskip always comes later + if ignore_whitespace then if trace then - trace_natural("taking parskip",current) + trace_natural("ignored parskip",current) + end + head, current = remove_node(head, current, true) + elseif glue_data then + local w = getwidth(current) + if (w ~= 0) and (w > getwidth(glue_data)) then + glue_data = current + if trace then + trace_natural("taking parskip",current) + end + head, current = remove_node(head, current) + else + if trace then + trace_natural("removed parskip",current) + end + head, current = remove_node(head, current, true) end - head, current = remove_node(head, current) else if trace then - trace_natural("removed parskip",current) + trace_natural("honored parskip",current) end - head, current = remove_node(head, current, true) + head, current, glue_data = remove_node(head, current) end - else - if trace then - trace_natural("honored parskip",current) + elseif subtype == topskip_code or subtype == splittopskip_code then + local next = getnext(current) + if next and getattr(next,a_skipcategory) == notopskip then + nuts.setglue(current) -- zero end - head, current, glue_data = remove_node(head, current) - end - elseif subtype == topskip_code or subtype == splittopskip_code then - local next = getnext(current) - if next and getattr(next,a_skipcategory) == 10 then -- no top skip - nuts.setglue(current) -- zero - end - if snap then - local s = getattr(current,a_snapmethod) - if s and s ~= 0 then - setattr(current,a_snapmethod,0) - local sv = snapmethods[s] - local w, cw = snap_topskip(current,sv) - if trace_vsnapping then - report_snapper("topskip snapped from %p to %p for %a",w,cw,where) + if snap then + local s = getattr(current,a_snapmethod) + if s and s ~= 0 then + setattr(current,a_snapmethod,0) + local sv = snapmethods[s] + local w, cw = snap_topskip(current,sv) + if trace_vsnapping then + report_snapper("topskip snapped from %p to %p for %a",w,cw,where) + end + else + if trace then + trace_skip("topskip",sc,so,sp,current) + end + flush("topskip") end else if trace then @@ -1749,198 +1777,201 @@ local function collapser(head,where,what,trace,snap,a_snapmethod) -- maybe also end flush("topskip") end - else + current = getnext(current) + elseif subtype == abovedisplayskip_code and remove_math_skips then + -- if trace then - trace_skip("topskip",sc,so,sp,current) + trace_skip("above display skip (normal)",sc,so,sp,current) end - flush("topskip") - end - current = getnext(current) - elseif subtype == abovedisplayskip_code and remove_math_skips then - -- - if trace then - trace_skip("above display skip (normal)",sc,so,sp,current) - end - flush("above display skip (normal)") - current = getnext(current) - -- - elseif subtype == belowdisplayskip_code and remove_math_skips then - -- - if trace then - trace_skip("below display skip (normal)",sc,so,sp,current) - end - flush("below display skip (normal)") - current = getnext(current) - -- - elseif subtype == abovedisplayshortskip_code and remove_math_skips then - -- - if trace then - trace_skip("above display skip (short)",sc,so,sp,current) - end - flush("above display skip (short)") - current = getnext(current) - -- - elseif subtype == belowdisplayshortskip_code and remove_math_skips then - -- - if trace then - trace_skip("below display skip (short)",sc,so,sp,current) - end - flush("below display skip (short)") - current = getnext(current) - -- - else -- other glue - if snap and trace_vsnapping then - local w = getwidth(current) - if w ~= 0 then - report_snapper("glue %p of type %a kept",w,skipcodes[subtype]) + flush("above display skip (normal)") + current = getnext(current) + -- + elseif subtype == belowdisplayskip_code and remove_math_skips then + -- + if trace then + trace_skip("below display skip (normal)",sc,so,sp,current) end + flush("below display skip (normal)") + current = getnext(current) + -- + elseif subtype == abovedisplayshortskip_code and remove_math_skips then + -- + if trace then + trace_skip("above display skip (short)",sc,so,sp,current) + end + flush("above display skip (short)") + current = getnext(current) + -- + elseif subtype == belowdisplayshortskip_code and remove_math_skips then + -- + if trace then + trace_skip("below display skip (short)",sc,so,sp,current) + end + flush("below display skip (short)") + current = getnext(current) + -- + else -- other glue + if snap and trace_vsnapping then + local w = getwidth(current) + if w ~= 0 then + report_snapper("glue %p of type %a kept",w,skipcodes[subtype]) + end + end + if trace then + trace_skip(formatters["glue of type %a"](subtype),sc,so,sp,current) + end + flush("some glue") + current = getnext(current) end - if trace then - trace_skip(formatters["glue of type %a"](subtype),sc,so,sp,current) - end - flush("some glue") + else + flush(formatters["node with id %a"](id)) current = getnext(current) end - else - flush(formatters["node with id %a"](id)) - current = getnext(current) end - end - if trace then - trace_info("stop analyzing",where,what) - end - -- if natural_penalty and (not penalty_data or natural_penalty > penalty_data) then - -- penalty_data = natural_penalty - -- end - if trace and (glue_data or penalty_data) then - trace_info("start flushing",where,what) - end - local tail - if penalty_data then - tail = find_node_tail(head) - local p = new_penalty(penalty_data) if trace then - trace_done("result",p) + trace_info("stop analyzing",where,what) + end + -- if natural_penalty and (not penalty_data or natural_penalty > penalty_data) then + -- penalty_data = natural_penalty + -- end + if trace and (glue_data or penalty_data) then + trace_info("start flushing",where,what) + end + local tail + if penalty_data then + tail = find_node_tail(head) + local p = new_penalty(penalty_data) + if trace then + trace_done("result",p) + end + setlink(tail,p) + -- if penalty_data > special_penalty_min and penalty_data < special_penalty_max then + local props = properties[p] + if props then + props.special_penalty = special_penalty or penalty_data + else + properties[p] = { + special_penalty = special_penalty or penalty_data + } + end + -- end end - setlink(tail,p) - -- if penalty_data > special_penalty_min and penalty_data < special_penalty_max then - local props = properties[p] - if props then - props.special_penalty = special_penalty or penalty_data + if glue_data then + if not tail then tail = find_node_tail(head) end + if trace then + trace_done("result",glue_data) + end + if force_glue then + head, tail = forced_skip(head,tail,getwidth(glue_data),"after",trace) + flush_node(glue_data) + glue_data = nil + elseif tail then + setlink(tail,glue_data) else - properties[p] = { - special_penalty = special_penalty or penalty_data - } + head = glue_data end - -- end - end - if glue_data then - if not tail then tail = find_node_tail(head) end + texnest[texnest.ptr].prevdepth = 0 -- appending to the list bypasses tex's prevdepth handler + end if trace then - trace_done("result",glue_data) - end - if force_glue then - head, tail = forced_skip(head,tail,getwidth(glue_data),"after",trace) - flush_node(glue_data) - glue_data = nil - elseif tail then - setlink(tail,glue_data) - else - head = glue_data + if glue_data or penalty_data then + trace_info("stop flushing",where,what) + end + show_tracing(head) + if oldhead ~= head then + trace_info("head has been changed from %a to %a",nodecodes[getid(oldhead)],nodecodes[getid(head)]) + end end - texnest[texnest.ptr].prevdepth = 0 -- appending to the list bypasses tex's prevdepth handler + return head, true end - if trace then - if glue_data or penalty_data then - trace_info("stop flushing",where,what) - end - show_tracing(head) - if oldhead ~= head then - trace_info("head has been changed from %a to %a",nodecodes[getid(oldhead)],nodecodes[getid(head)]) + + -- alignment after_output end box new_graf vmode_par hmode_par insert penalty before_display after_display + -- \par -> vmode_par + -- + -- status.best_page_break + -- tex.lists.best_page_break + -- tex.lists.best_size (natural size to best_page_break) + -- tex.lists.least_page_cost (badness of best_page_break) + -- tex.lists.page_head + -- tex.lists.contrib_head + + -- do + + local stackhead, stacktail, stackhack = nil, nil, false + + local function report(message,where,lst) + if lst and where then + report_vspacing(message,where,count_nodes(lst,true),nodeidstostring(lst)) + else + report_vspacing(message,count_nodes(lst,true),nodeidstostring(lst)) end end - return head, true -end --- alignment after_output end box new_graf vmode_par hmode_par insert penalty before_display after_display --- \par -> vmode_par --- --- status.best_page_break --- tex.lists.best_page_break --- tex.lists.best_size (natural size to best_page_break) --- tex.lists.least_page_cost (badness of best_page_break) --- tex.lists.page_head --- tex.lists.contrib_head - -local stackhead, stacktail, stackhack = nil, nil, false - -local function report(message,where,lst) - if lst and where then - report_vspacing(message,where,count_nodes(lst,true),nodeidstostring(lst)) - else - report_vspacing(message,count_nodes(lst,true),nodeidstostring(lst)) - end -end + -- ugly code: we get partial lists (check if this stack is still okay) ... and we run + -- into temp nodes (sigh) --- ugly code: we get partial lists (check if this stack is still okay) ... and we run --- into temp nodes (sigh) - -function vspacing.pagehandler(newhead,where) - -- local newhead = texlists.contrib_head - if newhead then - newhead = tonut(newhead) - local newtail = find_node_tail(newhead) -- best pass that tail, known anyway - local flush = false - stackhack = true -- todo: only when grid snapping once enabled - -- todo: fast check if head = tail - for n in traverse_nodes(newhead) do -- we could just look for glue nodes - local id = getid(n) - if id ~= glue_code then - flush = true - elseif getsubtype(n) == userskip_code then - if getattr(n,a_skipcategory) then - stackhack = true - else + function vspacing.pagehandler(newhead,where) + -- local newhead = texlists.contrib_head + if newhead then + newhead = tonut(newhead) + local newtail = find_node_tail(newhead) -- best pass that tail, known anyway + local flush = false + stackhack = true -- todo: only when grid snapping once enabled + -- todo: fast check if head = tail + for n in traverse_nodes(newhead) do -- we could just look for glue nodes + local id = getid(n) + if id ~= glue_code then flush = true + else + local subtype = getsubtype(n) + if subtype == userskip_code then + if getattr(n,a_skipcategory) then + stackhack = true + else + flush = true + end + elseif subtype == parskip_code then + -- if where == new_graf then ... end + if texgetcount("c_spac_vspacing_ignore_parskip") > 0 then +-- texsetcount("c_spac_vspacing_ignore_parskip",0) + setglue(n) + -- maybe removenode + end + end end - else - -- tricky end - end - if flush then - if stackhead then - if trace_collect_vspacing then report("%s > appending %s nodes to stack (final): %s",where,newhead) end - setlink(stacktail,newhead) - newhead = stackhead - stackhead, stacktail = nil, nil - end - if stackhack then - stackhack = false - if trace_collect_vspacing then report("%s > processing %s nodes: %s",where,newhead) end - -- texlists.contrib_head = collapser(newhead,"page",where,trace_page_vspacing,true,a_snapmethod) - newhead = collapser(newhead,"page",where,trace_page_vspacing,true,a_snapmethod) - else - if trace_collect_vspacing then report("%s > flushing %s nodes: %s",where,newhead) end - -- texlists.contrib_head = newhead - end - return tonode(newhead) - else - if stackhead then - if trace_collect_vspacing then report("%s > appending %s nodes to stack (intermediate): %s",where,newhead) end - setlink(stacktail,newhead) + texsetcount("c_spac_vspacing_ignore_parskip",0) + if flush then + if stackhead then + if trace_collect_vspacing then report("%s > appending %s nodes to stack (final): %s",where,newhead) end + setlink(stacktail,newhead) + newhead = stackhead + stackhead, stacktail = nil, nil + end + if stackhack then + stackhack = false + if trace_collect_vspacing then report("%s > processing %s nodes: %s",where,newhead) end + -- texlists.contrib_head = collapser(newhead,"page",where,trace_page_vspacing,true,a_snapmethod) + newhead = collapser(newhead,"page",where,trace_page_vspacing,true,a_snapmethod) + else + if trace_collect_vspacing then report("%s > flushing %s nodes: %s",where,newhead) end + -- texlists.contrib_head = newhead + end + return tonode(newhead) else - if trace_collect_vspacing then report("%s > storing %s nodes in stack (initial): %s",where,newhead) end - stackhead = newhead + if stackhead then + if trace_collect_vspacing then report("%s > appending %s nodes to stack (intermediate): %s",where,newhead) end + setlink(stacktail,newhead) + else + if trace_collect_vspacing then report("%s > storing %s nodes in stack (initial): %s",where,newhead) end + stackhead = newhead + end + stacktail = newtail + -- texlists.contrib_head = nil + -- newhead = nil end - stacktail = newtail - -- texlists.contrib_head = nil - -- newhead = nil end + return nil end - return nil -end - -do local ignore = table.tohash { "split_keep", @@ -1982,28 +2013,132 @@ end do - local outer = texnest[0] - local reset = true - local trace = false - local report = logs.reporter("vspacing") - - directives.register("vspacing.resetprevdepth",function(v) reset = v end) - trackers.register ("vspacing.resetprevdepth",function(v) trace = v end) - - function vspacing.resetprevdepth() - if reset then - local head = texlists.hold_head - local skip = 0 - while head and head.id == insert_code do - head = head.next - skip = skip + 1 - end + local outer = texnest[0] + local enabled = true + local count = true + local trace = false + local report = logs.reporter("vspacing") + + trackers.register("vspacing.synchronizepage",function(v) + trace = v + end) + + directives.register("vspacing.synchronizepage",function(v) + if v == true or v == "count" then + enabled = true + count = true + elseif v == "first" then + enabled = true + count = false + else + enabled = false + count = false + end + end) + + -- hm, check the old one + + -- function vspacing.synchronizepage() + -- if enabled then + -- local head = texlists.hold_head + -- local skip = 0 + -- while head and head.id == insert_code do + -- head = head.next + -- skip = skip + 1 + -- end + -- if head then + -- outer.prevdepth = 0 + -- end + -- if trace then + -- report("prevdepth %s at page %i, skipped %i, value %p", + -- head and "reset" or "kept",texgetcount("realpageno"),skip,outer.prevdepth) + -- end + -- end + -- end + + local ignoredepth = -65536000 + + function vspacing.synchronizepage() + if enabled then + local newdepth = outer.prevdepth + local olddepth = newdepth + local oldlines = outer.prevgraf + local newlines = 0 + local boxfound = false + local head = texlists.contrib_head if head then - outer.prevdepth = 0 + local tail = find_node_tail(tonut(head)) + while tail do + local id = getid(tail) + if id == hlist_code then + if not boxfound then + newdepth = getdepth(tail) + boxfound = true + end + newlines = newlines + 1 + if not count then + break + end + elseif id == vlist_code then + if not boxfound then + newdepth = getdepth(tail) + boxfound = true + end + break + elseif id == glue_code then + local subtype = getsubtype(tail) + if not (subtype == baselineskip_code or subtype == lineskip_code) then + break + elseif boxfound and not count then + break + end + elseif id == penalty_code then + if boxfound and not count then + break + end + else + -- ins, mark, kern, rule, boundary, whatsit + break + end + tail = getprev(tail) + end end + if boxfound then + -- what if newdepth ... + else + texset("prevdepth",ignoredepth) + outer.prevdepth = ignoredepth + end + texset("prevgraf", newlines) + outer.prevgraf = newlines if trace then - report("prevdepth %s at page %i, skipped %i, value %p", - head and "reset" or "kept",texgetcount("realpageno"),skip,outer.prevdepth) + report("page %i, prevdepth %p (last depth %p), prevgraf %i (from %i), %sboxes", + texgetcount("realpageno"),olddepth,newdepth,oldlines,newlines,boxfound and "" or "no ") + end + end + end + + local trace = false + + trackers.register("vspacing.forcestrutdepth",function(v) trace = v end) + + function vspacing.forcestrutdepth(n,depth,trace_mode) + local box = texgetbox(n) + if box then + box = tonut(box) + local head = getlist(box) + if head then + local tail = find_node_tail(head) + if tail and getid(tail) == hlist_code then + local dp = getdepth(tail) + if dp < depth then + setdepth(tail,depth) + outer.prevdepth = depth + if trace or trace_mode > 0 then + nuts.setvisual(tail,"depth") + end + end + end end end end @@ -2022,8 +2157,15 @@ do } implement { - name = "resetprevdepth", - actions = vspacing.resetprevdepth, + name = "synchronizepage", + actions = vspacing.synchronizepage, + scope = "private" + } + + implement { + name = "forcestrutdepth", + arguments = { "integer", "dimension", "integer" }, + actions = vspacing.forcestrutdepth, scope = "private" } @@ -2069,16 +2211,47 @@ do arguments = { "string", "string" } } - local remove_node = nodes.remove - local find_node_tail = nodes.tail + -- local remove_node = nodes.remove + -- local find_node_tail = nodes.tail + -- + -- interfaces.implement { + -- name = "fakenextstrutline", + -- actions = function() + -- local head = texlists.page_head + -- if head then + -- local head = remove_node(head,find_node_tail(head),true) + -- texlists.page_head = head + -- buildpage() + -- end + -- end + -- } interfaces.implement { - name = "fakenextstrutline", + name = "removelastline", actions = function() local head = texlists.page_head if head then - local head = remove_node(head,find_node_tail(head),true) - texlists.page_head = head + local tail = find_node_tail(head) + if tail then + -- maybe check for hlist subtype 1 + local head = remove_node(head,tail,true) + texlists.page_head = head + buildpage() + end + end + end + } + + interfaces.implement { + name = "showpagelist", -- will improve + actions = function() + local head = texlists.page_head + if head then + print("start") + while head do + print(" " .. tostring(head)) + head = head.next + end end end } diff --git a/tex/context/base/mkiv/spac-ver.mkiv b/tex/context/base/mkiv/spac-ver.mkiv index 229963997..b71e28219 100644 --- a/tex/context/base/mkiv/spac-ver.mkiv +++ b/tex/context/base/mkiv/spac-ver.mkiv @@ -15,7 +15,7 @@ \unprotect -\registerctxluafile{spac-ver}{1.001} +\registerctxluafile{spac-ver}{} % todo: use usernodes ? @@ -61,7 +61,7 @@ \newif\iflocalinterlinespace -\newskip\s_spac_vspacing_temp \s_spac_vspacing_temp\bigskipamount +\newskip \s_spac_vspacing_temp \s_spac_vspacing_temp\bigskipamount \def\skipfactor {.75} \def\skipgluefactor{.25} @@ -527,7 +527,6 @@ \unexpanded\def\spac_lines_start_correction[#1]% {\edef\m_spac_lines_around{#1}% - % todo: play with \fakenextstrutline \spac_lines_action_around \d_spac_prevdepth\prevdepth \spac_lines_initialize_corrections @@ -1050,6 +1049,24 @@ \box\scratchbox \endgroup} +\unexpanded\def\halflinestrut + {\relax + \dontleavehmode + \begingroup + \setbox\scratchbox\copy\strutbox + \ht\scratchbox\dimexpr\strutht-.5\strutht-.5\strutdp\relax + \box\scratchbox + \endgroup} + +\unexpanded\def\noheightstrut + {\relax + \dontleavehmode + \begingroup + \setbox\scratchbox\copy\strutbox + \ht\scratchbox\zeropoint + \box\scratchbox + \endgroup} + %D Sometimes a capstrut comes in handy %D %D \starttabulate[|Tl|l|l|] @@ -1291,7 +1308,7 @@ \let\normaloffinterlineskip\offinterlineskip % knuth's original \appendtoks - \ifvmode\clf_resetprevdepth\fi % a nasty hack (tested for a while now) + \ifvmode\clf_synchronizepage\fi % a nasty hack (tested for a while now) \to \everyafteroutput %D My own one: @@ -1355,17 +1372,21 @@ \global\let\restoreinterlinepenalty\spac_penalties_restore \fi} -\newif\ifgridsnapping % to be sure - -\def\defaultwidowpenalty {2000} % was: 1000 -\def\defaultclubpenalty {2000} % was: 800 -\def\defaultdisplaywidowpenalty {50} -\def\defaultbrokenpenalty {100} - -\def\defaultgridwidowpenalty {0} -\def\defaultgridclubpenalty {0} -\def\defaultgriddisplaywidowpenalty {0} -\def\defaultgridbrokenpenalty {0} +\def\defaultdisplaywidowpenalty {50} +\def\defaultwidowpenalty {2000} % was: 1000 +\def\defaultclubpenalty {2000} % was: 800 +\def\defaultbrokenpenalty {100} +\def\defaultdoublehyphendemerits {10000} +\def\defaultfinalhyphendemerits {5000} +\def\defaultadjdemerits {10000} + +\def\defaultgriddisplaywidowpenalty {0} +\def\defaultgridwidowpenalty {0} +\def\defaultgridclubpenalty {0} +\def\defaultgridbrokenpenalty {0} +\def\defaultgriddoublehyphendemerits{10000} % always was so +\def\defaultgridfinalhyphendemerits {5000} % always was so +\def\defaultgridadjdemerits {10000} % always was so \unexpanded\def\nopenalties {\widowpenalty \zerocount @@ -1390,10 +1411,13 @@ \directsetup{\systemsetupsprefix\s!reset} - \widowpenalty \defaultwidowpenalty - \clubpenalty \defaultclubpenalty - \displaywidowpenalty\defaultdisplaywidowpenalty - \brokenpenalty \defaultbrokenpenalty + \widowpenalty \defaultwidowpenalty + \clubpenalty \defaultclubpenalty + \displaywidowpenalty \defaultdisplaywidowpenalty + \brokenpenalty \defaultbrokenpenalty + \doublehyphendemerits\defaultdoublehyphendemerits + \finalhyphendemerits \defaultfinalhyphendemerits + \adjdemerits \defaultadjdemerits \stopsetups @@ -1401,10 +1425,13 @@ \directsetup{\systemsetupsprefix\s!reset} - \widowpenalty \defaultgridwidowpenalty - \clubpenalty \defaultgridclubpenalty - \displaywidowpenalty\defaultgriddisplaywidowpenalty - \brokenpenalty \defaultgridbrokenpenalty + \widowpenalty \defaultgridwidowpenalty + \clubpenalty \defaultgridclubpenalty + \displaywidowpenalty \defaultgriddisplaywidowpenalty + \brokenpenalty \defaultgridbrokenpenalty + \doublehyphendemerits\defaultgriddoublehyphendemerits + \finalhyphendemerits \defaultgridfinalhyphendemerits + \adjdemerits \defaultgridadjdemerits \stopsetups @@ -1414,9 +1441,12 @@ \directsetup{\systemsetupsprefix\s!reset} - \setpenalties\widowpenalties\plustwo\maxdimen - \setpenalties\clubpenalties \plustwo\maxdimen - \brokenpenalty \maxdimen + \setpenalties \widowpenalties \plustwo \maxdimen + \setpenalties \clubpenalties \plustwo \maxdimen + \brokenpenalty \maxdimen + \doublehyphendemerits \defaultdoublehyphendemerits + \finalhyphendemerits \defaultfinalhyphendemerits + \adjdemerits \defaultadjdemerits \stopsetups @@ -1515,6 +1545,17 @@ {%\gridsnappingtrue \begincsname\??gridsnappers#1\endcsname} +% maybe: +% +% \def\spac_grids_snap_value_set#1% +% {%\gridsnappingtrue +% \ifcsname\??gridsnappers#1\endcsname +% \lastnamedcs +% \else +% \definegridsnapping[#1][#1]% +% \begincsname\??gridsnappers#1\endcsname +% \fi} + \def\spac_grids_snap_value_auto#1% {\ifcsname\??gridsnappers#1\endcsname \lastnamedcs @@ -1545,35 +1586,41 @@ % min centers a box rounded downwards % max centers a box rounded upwards -%D We're not downward compatible with \MKII ! +%D We're not downward compatible with \MKII ! Not yet in interface file: + +\definegridsnapping[\v!normal] [\v!maxheight,\v!maxdepth,\v!strut] +\definegridsnapping[\v!standard] [\v!maxheight,\v!maxdepth,\v!strut] +\definegridsnapping[\v!yes] [\v!maxheight,\v!maxdepth,\v!strut] -\definegridsnapping[\v!normal] [\v!maxheight,\v!maxdepth,\v!strut] -\definegridsnapping[\v!standard] [\v!maxheight,\v!maxdepth,\v!strut] -\definegridsnapping[\v!yes] [\v!maxheight,\v!maxdepth,\v!strut] +\definegridsnapping[\v!strict] [\v!maxdepth:0.8,\v!maxheight:0.8,\v!strut] +\definegridsnapping[\v!tolerant] [\v!maxdepth:1.2,\v!maxheight:1.2,\v!strut] +\definegridsnapping[\v!verytolerant] [\v!maxdepth:1.4,\v!maxheight:1.4,\v!strut] -\definegridsnapping[\v!strict] [\v!maxdepth:0.8,\v!maxheight:0.8,\v!strut] -\definegridsnapping[\v!tolerant] [\v!maxdepth:1.2,\v!maxheight:1.2,\v!strut] +\definegridsnapping[\v!tolerant:10] [\v!maxdepth:1.1,\v!maxheight:1.1,\v!strut] % 10 pct tolerance +\definegridsnapping[\v!tolerant:20] [\v!maxdepth:1.2,\v!maxheight:1.2,\v!strut] % 20 pct tolerance +\definegridsnapping[\v!tolerant:30] [\v!maxdepth:1.3,\v!maxheight:1.3,\v!strut] % 30 pct tolerance +\definegridsnapping[\v!tolerant:40] [\v!maxdepth:1.4,\v!maxheight:1.4,\v!strut] % 40 pct tolerance -\definegridsnapping[\v!top] [\v!minheight,\v!maxdepth,\v!strut] -\definegridsnapping[\v!bottom] [\v!maxheight,\v!mindepth,\v!strut] -\definegridsnapping[\v!both] [\v!minheight,\v!mindepth,\v!strut] +\definegridsnapping[\v!top] [\v!minheight,\v!maxdepth,\v!strut] +\definegridsnapping[\v!bottom] [\v!maxheight,\v!mindepth,\v!strut] +\definegridsnapping[\v!both] [\v!minheight,\v!mindepth,\v!strut] -\definegridsnapping[\v!broad] [\v!maxheight,\v!maxdepth,\v!strut,0.8] % maybe 0.85 -\definegridsnapping[\v!fit] [\v!maxheight,\v!maxdepth,\v!strut,1.2] % tight 0.15 +\definegridsnapping[\v!broad] [\v!maxheight,\v!maxdepth,\v!strut,0.8] % maybe 0.85 +\definegridsnapping[\v!fit] [\v!maxheight,\v!maxdepth,\v!strut,1.2] % tight 0.15 -\definegridsnapping[\v!first] [\v!first] -\definegridsnapping[\v!last] [\v!last] -\definegridsnapping[\v!high] [\v!minheight,\v!maxdepth,\v!none] -\definegridsnapping[\v!one] [\v!minheight,\v!mindepth] -\definegridsnapping[\v!low] [\v!maxheight,\v!mindepth,\v!none] -\definegridsnapping[\v!none] [\v!none] -\definegridsnapping[\v!line] [\v!line] -\definegridsnapping[\v!strut] [\v!strut] -\definegridsnapping[\v!box] [\v!box] -\definegridsnapping[\v!min] [\v!min] -\definegridsnapping[\v!max] [\v!max] +\definegridsnapping[\v!first] [\v!first] +\definegridsnapping[\v!last] [\v!last] +\definegridsnapping[\v!high] [\v!minheight,\v!maxdepth,\v!none] +\definegridsnapping[\v!one] [\v!minheight,\v!mindepth] +\definegridsnapping[\v!low] [\v!maxheight,\v!mindepth,\v!none] +\definegridsnapping[\v!none] [\v!none] +\definegridsnapping[\v!line] [\v!line] +\definegridsnapping[\v!strut] [\v!strut] +\definegridsnapping[\v!box] [\v!box] +\definegridsnapping[\v!min] [\v!min] +\definegridsnapping[\v!max] [\v!max] -\definegridsnapping[\v!middle] [\v!maxheight,\v!maxdepth] % used in placement +\definegridsnapping[\v!middle] [\v!maxheight,\v!maxdepth] % used in placement \definegridsnapping[\v!math] [\v!maxdepth:1.05,\v!maxheight:1.05,\v!strut] % experimental, maybe 1.1 \definegridsnapping[\v!math:\v!line] [\v!math,\v!line,\v!split] @@ -1615,8 +1662,6 @@ \newif\ifgridsnapping -\let\showgridsnapping\relax - %unexpanded\def\moveongrid {\dosingleempty\spac_grids_move_on} \unexpanded\def\snaptogrid {\dosingleempty\spac_grids_snap_to} \unexpanded\def\placeongrid{\dosingleempty\spac_grids_place_on} @@ -1656,7 +1701,7 @@ \fi \doifelsenothing{#1}{\spac_grids_snap_value_set\v!normal}{\spac_grids_snap_value_set{#1}}% \clf_vspacingsnap\nextbox\attribute\snapmethodattribute\relax - \ifvbox\nextbox\vbox\else\hbox\fi attr \snapmethodattribute \zerocount {\box\nextbox}% pack ? + \ifvbox\nextbox\vbox\else\hbox\fi attr \snapmethodattribute \zerocount {\box\nextbox}% *pack ? \egroup} \def\spac_grids_check_nop @@ -1911,6 +1956,7 @@ \newconditional\c_space_vspacing_done \newconditional\c_space_vspacing_fixed +\newconditional\c_space_ignore_parskip \appendtoks \s_spac_vspacing_temp\zeropoint @@ -1933,6 +1979,9 @@ \relax \to \everyafterblankhandling +\unexpanded\def\setblankpacked + {\settrue\c_space_ignore_parskip} + \unexpanded\def\setblankcategory#1% {\settrue\c_space_vspacing_done \attribute\skipcategoryattribute#1\relax} @@ -1971,6 +2020,7 @@ \def\dostartblankhandling {\begingroup \setfalse\c_space_vspacing_done + \setfalse\c_space_ignore_parskip \the\everybeforeblankhandling} \unexpanded\def\stopblankhandling @@ -1978,7 +2028,11 @@ \ifconditional\c_space_vspacing_done \vskip\s_spac_vspacing_temp \fi - \endgroup} + \ifconditional\c_space_ignore_parskip + \endgroup\ignoreparskip + \else + \endgroup + \fi} \unexpanded\def\flushblankhandling {\the\everyafterblankhandling @@ -2117,10 +2171,6 @@ \definevspacingamount[\v!height] [\strutht] [\bodyfontstrutheight] \definevspacingamount[\v!depth] [\strutdp] [\bodyfontstrutdepth] -\definevspacingamount[-\v!line] [-\openlineheight] [-\bodyfontlineheight] -\definevspacingamount[-\v!halfline] [-.5\openlineheight] [-.5\bodyfontlineheight] -\definevspacingamount[-\v!quarterline][-.25\openlineheight][-.25\bodyfontlineheight] - \definevspacingamount[\v!standard] [.75\openlineheight] [.75\openlineheight] % mkii compatible \def\bodyfontwhitespace @@ -2169,23 +2219,35 @@ \definevspacing[\v!disable] [category:5] \definevspacing[\v!nowhite] [category:6] \definevspacing[\v!back] [category:7] -% together [category:8] +\definevspacing[\v!packed] [category:8] % noparskip (kind of special) \definevspacing[\v!overlay] [category:9] \definevspacing[\v!enable] [category:10] +%definevspacing[\v!noparskip] [category:8] +%definevspacing[\v!notopskip] [category:11] + \definevspacing[\v!weak] [order:0] \definevspacing[\v!strong] [order:100] \definevspacing[\s!default] [\v!white] % was big for a while -% \dorecurse{10} % todo: other values < 4000 -% {\normalexpanded{\definevspacing[\v!samepage-\recurselevel][penalty:\the\numexpr4000+250*\recurselevel\relax]}} - \newcount\c_spac_vspacing_special_base \c_spac_vspacing_special_base = 32250 % 4000 \newcount\c_spac_vspacing_special_step \c_spac_vspacing_special_step = 10 % 250 -\dorecurse{10} - {\normalexpanded{\definevspacing[\v!samepage-\recurselevel][penalty:\the\numexpr\c_spac_vspacing_special_base+\c_spac_vspacing_special_step*\recurselevel\relax]}} +\unexpanded\def\spac_vspacing_define_same_page#1% + {\normalexpanded{\definevspacing + [\v!samepage-#1]% + [penalty:\the\numexpr\c_spac_vspacing_special_base+\c_spac_vspacing_special_step*#1\relax]}} + +\dorecurse{20}{\spac_vspacing_define_same_page{#1}} + +\ifdefined\everydefinesection + \appendtoks + \spac_vspacing_define_same_page\maxstructuredepth + \to \everydefinesection +\else + % the order has changed so this code has to move to strf-def.mkiv then +\fi \definevspacing[\v!default] [\v!big] % todo: needs to adapt to \setupblank \definevspacing[\v!before] [\v!default] % but we need to avoid circular references @@ -2454,20 +2516,74 @@ \prevdepth\zeropoint -% not ok, so we need to figure out another way to fix this messy prevdepth-across-page issue -% as encountered in forced blank skips (see lua code) -% -% \appendtoks -% \ifvmode\clf_resetprevdepth\fi -% \to \everyafteroutput -% -% this should only happen when there is nothing left over (how to detemine that) .. testcase: -% -% \dorecurse{41}{line\par} -% \starttyping -% line 1 -% line 2 -% line 3 -% \stoptyping +%D Helper: + +\unexpanded\def\checkedblank[#1]% + {\edef\p_blank{#1}% + \ifx\p_blank\empty + % ignore + \else\ifx\p_blank\v!none + % ignore + \else + \blank[\p_blank]% + \fi\fi} + +% \unexpanded\def\applycheckedblankwith#1#2#3% +% {\edef\p_blank{#2}% +% \ifx\p_blank\empty +% % ignore +% \else\ifx\p_blank\v!none +% % ignore +% \else +% \edef\p_before{#1}% +% \edef\p_after {#3}% +% \blank[\ifx\p_before\empty\else\p_before,\fi\p_blank\ifx\p_after\empty\else,\p_after\fi]% +% \fi\fi} + +% \setupwhitespace[line] +% \prerollblank[2*line] \the\prerolledblank +% \prerollblank[-2*line] \the\prerolledblank + +\newskip\prerolledblank + +\unexpanded\def\prerollblank[#1]% + {\begingroup + \edef\p_blank{#1}% + \ifx\p_blank\empty + \global\prerolledblank\zeropoint + \else\ifx\p_blank\v!none + \global\prerolledblank\zeropoint + \else + % don't mess with \arskip here! + \scratchskip\plusten\lineheight + \setbox\scratchbox\vbox + {\vskip\scratchskip + \kern\zeropoint + \blank[\p_blank]}% + % \dimexpr doesn't work well with skips + \advance\scratchskip-\ht\scratchbox + \global\prerolledblank-\scratchskip + \fi\fi + \endgroup} + +\newcount\c_spac_vspacing_ignore_parskip + +% \setupwhitespace[line] +% \setuphead[subject][after={\blank[packed]},style=\bfb] +% \subject{foo} +% test \par +% test \par +% \blank[packed] % \ignoreparskip +% test \par +% test \par +% \ignoreparskip +% test \par +% test \par +% \setuphead[subject][after={\blank[nowhite]},style=\bfb] +% \subject{foo} +% test \par +% test \par + +\unexpanded\def\ignoreparskip{\c_spac_vspacing_ignore_parskip\plusone} \protect \endinput diff --git a/tex/context/base/mkiv/status-files.pdf b/tex/context/base/mkiv/status-files.pdf Binary files differindex 56ab3aa69..1351546fd 100644 --- a/tex/context/base/mkiv/status-files.pdf +++ b/tex/context/base/mkiv/status-files.pdf diff --git a/tex/context/base/mkiv/status-lua.pdf b/tex/context/base/mkiv/status-lua.pdf Binary files differindex 85a976f79..15354a5ea 100644 --- a/tex/context/base/mkiv/status-lua.pdf +++ b/tex/context/base/mkiv/status-lua.pdf diff --git a/tex/context/base/mkiv/status-mkiv.lua b/tex/context/base/mkiv/status-mkiv.lua deleted file mode 100644 index ab1419c98..000000000 --- a/tex/context/base/mkiv/status-mkiv.lua +++ /dev/null @@ -1,7441 +0,0 @@ -return { - ["core"]={ - { - ["category"]="mkvi", - ["filename"]="font-gds", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="cont-run", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["filename"]="font-sel", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="grph-pat", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="grph-rul", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="lang-rep", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="luat-usr", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="math-mis", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["filename"]="math-rad", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="page-cst", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["filename"]="page-inj", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["filename"]="page-lin", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["filename"]="publ-imp-author", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["filename"]="publ-imp-cite", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["filename"]="publ-imp-commands", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["filename"]="publ-imp-default", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["filename"]="publ-imp-definitions", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["filename"]="publ-imp-list", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["filename"]="publ-imp-page", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="spac-flr", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["filename"]="spac-prf", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["filename"]="strc-not", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="toks-map", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="toks-tra", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="typo-chr", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="typo-inj", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="typo-lig", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="typo-lin", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="typo-par", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="typo-wrp", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="syst-ini", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="norm-ctx", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="syst-pln", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="syst-mes", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="luat-cod", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="maybe combine (3)", - ["filename"]="luat-bas", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="maybe combine (3)", - ["filename"]="luat-lib", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="catc-ini", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="forward dependency", - ["filename"]="catc-act", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="catc-def", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="catc-ctx", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="catc-sym", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="only needed for mkii xml parser", - ["filename"]="catc-xml", - ["loading"]="module", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="maybe combine (1)", - ["filename"]="cldf-ini", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="syst-aux", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="maybe combine (1)", - ["filename"]="syst-lua", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="maybe combine (1)", - ["filename"]="syst-con", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="maybe combine (1)", - ["filename"]="syst-fnt", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="maybe combine (1)", - ["filename"]="syst-rtp", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["comment"]="maybe combine (2)", - ["filename"]="file-ini", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["comment"]="maybe combine (2)", - ["filename"]="file-res", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["filename"]="file-lib", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="supp-dir", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="char-ini", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="char-utf", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="forward dependency", - ["filename"]="char-act", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="mult-ini", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="mult-sys", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="mult-aux", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="mult-def", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="mult-chk", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["filename"]="mult-dim", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="cldf-int", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="luat-ini", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="toks-ini", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="attr-ini", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="attr-mkr", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="code might move from here", - ["filename"]="core-ini", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="might need more redoing", - ["filename"]="core-env", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="in due time more might move to here", - ["filename"]="layo-ini", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="maybe this becomes a runtime module", - ["filename"]="node-ini", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="maybe use context.generics/context.sprint here", - ["filename"]="cldf-bas", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="might need more redoing", - ["filename"]="node-fin", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="needs integration and configuration", - ["filename"]="node-mig", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="typo-bld", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="typo-sus", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="node-pag", - ["loading"]="never", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="back-ini", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="attr-col", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="attr-lay", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="attr-neg", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="attr-eff", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="needs more usage", - ["filename"]="trac-tex", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="trac-deb", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="trac-ctx", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="supp-box", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="supp-ran", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="will be moved to the math-* modules", - ["filename"]="supp-mat", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="will grow", - ["filename"]="typo-ini", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["filename"]="file-syn", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["filename"]="file-mod", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="core-con", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="cont-fil", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="cont-nop", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="cont-yes", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="regi-ini", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="enco-ini", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="hand-ini", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="lang-ini", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="namespace should be languages", - ["filename"]="lang-lab", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="lang-hyp", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="unic-ini", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="core-uti", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="maybe rename to core-two", - ["filename"]="core-two", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="core-dat", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="colo-ini", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="colo-ext", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="colo-grp", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="node-bck", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="pack-cut", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="lang-mis", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="lang-url", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="lang-def", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="lang-hyp", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="lang-frq", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="lang-frd", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="lang-wrd", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["comment"]="might need more redoing", - ["filename"]="file-job", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="symb-ini", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="sort-ini", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["filename"]="pack-mis", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="pack-rul", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="endpar experimental code", - ["filename"]="pack-mrl", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["filename"]="pack-bck", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="pack-fen", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="lxml-ini", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="lxml-sor", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["filename"]="typo-prc", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["filename"]="strc-ini", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="strc-tag", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="this module might go away when code has been moved", - ["filename"]="strc-doc", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="still some rough edges", - ["filename"]="strc-num", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="strc-mar", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="strc-sbe", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["filename"]="strc-lst", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="some of the local current and synchronization macros will be renamed", - ["filename"]="strc-sec", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="strc-pag", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="(support for) setups might get improved", - ["filename"]="strc-ren", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="this module might go away", - ["filename"]="strc-xml", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="strc-def", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["comment"]="some more low level names might change", - ["filename"]="strc-ref", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="use setups for rendering", - ["filename"]="strc-reg", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["filename"]="strc-lev", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="maybe some tuning is needed / will happen", - ["filename"]="spac-ali", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="probably needs some more work", - ["filename"]="spac-hor", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="maybe some changes will happen", - ["filename"]="spac-ver", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="could be improved if needed", - ["filename"]="spac-lin", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="this needs to be checked occasionally", - ["filename"]="spac-pag", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="spac-par", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="spac-def", - ["loading"]="always", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["comment"]="needs thinking and redoing", - ["filename"]="spac-grd", - ["loading"]="always", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["comment"]="in transition", - ["filename"]="anch-pos", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["comment"]="maybe change locationattribute names", - ["filename"]="scrn-ini", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["comment"]="namespace needs checking", - ["filename"]="scrn-ref", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="will change when we have objects at lua end", - ["filename"]="pack-obj", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["filename"]="strc-itm", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["comment"]="maybe more common counter code here and setups need to be improved", - ["filename"]="strc-con", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["filename"]="strc-des", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["comment"]="(interactive) coupling is not yet working", - ["filename"]="strc-enu", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="strc-ind", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="needs to be adapted when strc-con/des/enu changes", - ["filename"]="strc-lab", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="strc-syn", - ["loading"]="always", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["comment"]="a funny mix", - ["filename"]="core-sys", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="page-var", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["filename"]="page-otr", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="code might end up elsewhere", - ["filename"]="page-ini", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="dealing with insertions might change", - ["filename"]="page-ins", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="page-fac", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="otr commands will be redone", - ["filename"]="page-brk", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="helpers for columns", - ["filename"]="page-col", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="room for improvement and extension", - ["filename"]="page-inf", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="page-grd", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="will be extended when columns are redone", - ["filename"]="page-flt", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="page-bck", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="page-not", - ["loading"]="always", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["comment"]="can probably be improved", - ["filename"]="page-one", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="page-lay", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["filename"]="page-box", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["comment"]="a few things left", - ["filename"]="page-txt", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="page-sid", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["comment"]="in due time we need a further cleanup", - ["filename"]="strc-flt", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="page-pst", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["comment"]="might be extended", - ["filename"]="page-mbk", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="will be reimplemented", - ["filename"]="page-mul", - ["loading"]="always", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["comment"]="work in progress", - ["filename"]="page-mix", - ["loading"]="always", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["comment"]="will be reimplemented", - ["filename"]="page-set", - ["loading"]="always", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["filename"]="pack-lyr", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="pack-pos", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["filename"]="page-mak", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="might get extended", - ["filename"]="page-par", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="typo-pag", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="typo-mar", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="typo-itm", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="check other modules for buffer usage", - ["filename"]="buff-ini", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="check obsolete processbuffer", - ["filename"]="buff-ver", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["comment"]="experimental code", - ["filename"]="buff-par", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="symb-imp-cc", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="buff-imp-default", - ["loading"]="indirect", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="buff-imp-escaped", - ["loading"]="indirect", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="buff-imp-nested", - ["loading"]="indirect", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="strc-blk", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="page-imp", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["comment"]="maybe some extensions and delayed loading, needs checking", - ["filename"]="page-sel", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="page-com", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["comment"]="namespace needs checking", - ["filename"]="scrn-pag", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["comment"]="functionality needs checking", - ["filename"]="scrn-wid", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["comment"]="namespace needs checking", - ["filename"]="scrn-but", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["comment"]="namespace needs checking", - ["filename"]="scrn-bar", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="strc-bkm", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="typo-tal", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="somewhat weird", - ["filename"]="tabl-com", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="unchecked", - ["filename"]="tabl-pln", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="tabl-tab", - ["loading"]="always", - ["status"]="pending", - }, - { - ["category"]="mkiv", - ["comment"]="can probably be improved (names and such)", - ["filename"]="tabl-tbl", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="frozen functionaly so no drastic cleanup", - ["filename"]="tabl-ntb", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="tabl-mis", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="tabl-nte", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="will be redone when needed", - ["filename"]="tabl-ltb", - ["loading"]="always", - ["status"]="pending", - }, - { - ["category"]="mkiv", - ["comment"]="will be adapted when needed (and rest is done)", - ["filename"]="tabl-tsp", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["comment"]="namespace needs checking", - ["filename"]="tabl-xtb", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["comment"]="only when natural tables need a replacement", - ["filename"]="tabl-xnt", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="java-ini", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["comment"]="namespace needs checking", - ["filename"]="scrn-fld", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["comment"]="namespace needs checking", - ["filename"]="scrn-hlp", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="char-enc", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["filename"]="font-lib", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["filename"]="font-fil", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["filename"]="font-var", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["filename"]="font-fea", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["filename"]="font-mat", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["comment"]="needs occasional checking and upgrading", - ["filename"]="font-ini", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["filename"]="font-sym", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["filename"]="font-sty", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["filename"]="font-set", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["filename"]="font-emp", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["filename"]="font-col", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="font-pre", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="font-unk", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="likely this will become a module", - ["filename"]="font-tra", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="this could become a module", - ["filename"]="font-chk", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="this one might be merged", - ["filename"]="font-uni", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["filename"]="font-col", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["filename"]="font-aux", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="typo-lan", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="this is work in progress", - ["filename"]="lxml-css", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="spac-chr", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="work in progress", - ["filename"]="blob-ini", - ["loading"]="always", - ["status"]="pending", - }, - { - ["category"]="mkiv", - ["filename"]="trac-jus", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="trac-vis", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="typo-cln", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="typo-spa", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="do we keep the style and color or not", - ["filename"]="typo-krn", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["filename"]="typo-itc", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="maybe singular setup", - ["filename"]="typo-dir", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="typo-brk", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="typo-cap", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="typo-dig", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="typo-rep", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["comment"]="maybe there will be a nicer interface", - ["filename"]="typo-txt", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="typo-drp", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="typo-fln", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["filename"]="type-ini", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="type-set", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="type-def", - ["loading"]="type-set", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="type-fbk", - ["loading"]="type-set", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="type-lua", - ["loading"]="type-set", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="type-one", - ["loading"]="type-set", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="type-otf", - ["loading"]="type-set", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="type-siz", - ["loading"]="type-set", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="placeholder to prevent other loading", - ["filename"]="type-tmf", - ["loading"]="never", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="scrp-ini", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="this module is obsolete", - ["filename"]="prop-ini", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="mlib-ctx", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="metapost code is always evolving", - ["filename"]="meta-ini", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="code used in a project", - ["filename"]="meta-lua", - ["loading"]="experimental", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="meta-fnt", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="meta-tex", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="maybe this one will be merged", - ["filename"]="meta-fun", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="might get updated when mp code gets cleaned up", - ["filename"]="meta-pag", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="meta-grd", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="page-mrk", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="page-flw", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="page-spr", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="will be made better", - ["filename"]="page-plg", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="needs more work (and thinking)", - ["filename"]="page-str", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="in transition", - ["filename"]="anch-pgr", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["comment"]="in transition", - ["filename"]="anch-bck", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="will stay experimental for a while", - ["filename"]="anch-tab", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="anch-bar", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="interesting old mechanism to keep around (module?)", - ["filename"]="anch-snc", - ["loading"]="always", - ["status"]="pending", - }, - { - ["category"]="mkiv", - ["filename"]="math-ini", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="this file might merge into others", - ["filename"]="math-pln", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="math-for", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="eventually this will be split and spread", - ["filename"]="math-def", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="will be checked and improved", - ["filename"]="math-ali", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="needs testing", - ["filename"]="math-arr", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["filename"]="math-stc", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["filename"]="math-acc", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="at least for the moment", - ["filename"]="math-frc", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="math-scr", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="math-int", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="code get replaced (by autodelimiters)", - ["filename"]="math-del", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="math-fen", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="code might move to here", - ["filename"]="math-inl", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="code might move to here", - ["filename"]="math-dis", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="phys-dim", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="some more functionality will end up here", - ["filename"]="strc-mat", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="chem-ini", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="chem-str", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="typo-scr", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="maybe some cleanup is needed", - ["filename"]="node-rul", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["comment"]="needs testing", - ["filename"]="font-sol", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["filename"]="strc-not", - ["loading"]="always", - ["status"]="todo", - }, - { - ["category"]="mkvi", - ["comment"]="will be extended as part of crited", - ["filename"]="strc-lnt", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="pack-com", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="typo-del", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="grph-trf", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="grph-inc", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="grph-fig", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="grph-raw", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="pack-box", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="pack-bar", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="page-app", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="meta-fig", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="more or less obsolete", - ["filename"]="lang-spa", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="bibl-bib", - ["loading"]="on demand", - ["status"]="pending", - }, - { - ["category"]="mkiv", - ["filename"]="bibl-tra", - ["loading"]="on demand", - ["status"]="pending", - }, - { - ["category"]="mkiv", - ["comment"]="not needed", - ["filename"]="meta-xml", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="cont-log", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="task-ini", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="cldf-ver", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="cldf-com", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="core-ctx", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="will always be messy", - ["filename"]="core-def", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="object related code might move or change", - ["filename"]="back-pdf", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="no code, just an example of usage", - ["filename"]="back-swf", - ["loading"]="never", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="no code, just an example of usage", - ["filename"]="back-u3d", - ["loading"]="never", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="mlib-pdf", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="mlib-pps", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="meta-pdf", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="might need more work", - ["filename"]="grph-epd", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="some parameters might move from export to backend", - ["filename"]="back-exp", - ["loading"]="always", - ["status"]="okay", - }, - }, - ["extras"]={ - { - ["category"]="tex", - ["comment"]="add-on for mtx-context", - ["filename"]="mtx-context-arrange", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="tex", - ["comment"]="add-on for mtx-context", - ["filename"]="mtx-context-combine", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="tex", - ["comment"]="add-on for mtx-context", - ["filename"]="mtx-context-common", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="tex", - ["comment"]="add-on for mtx-context", - ["filename"]="mtx-context-ideas", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="tex", - ["comment"]="add-on for mtx-context", - ["filename"]="mtx-context-listing", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="tex", - ["comment"]="add-on for mtx-context", - ["filename"]="mtx-context-markdown", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="tex", - ["comment"]="add-on for mtx-context", - ["filename"]="mtx-context-select", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="tex", - ["comment"]="add-on for mtx-context", - ["filename"]="mtx-context-timing", - ["loading"]="on demand", - ["status"]="okay", - }, - }, - ["implementations"]={ - { - ["category"]="mkiv", - ["filename"]="symb-imp-fontawesome", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="type-imp-ebgaramond", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="type-imp-gentium", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="type-imp-ipaex", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="type-imp-lato", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="type-imp-libertinus", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="type-imp-mathdigits", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="type-imp-minion", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="type-imp-opendyslexic", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="type-imp-source", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="buff-imp-tex", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="buff-imp-mp", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="buff-imp-lua", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="buff-imp-xml", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="buff-imp-parsed-xml", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="meta-imp-grid", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="meta-imp-mat", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="meta-imp-outlines", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="meta-imp-tab", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["filename"]="publ-imp-apa", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["filename"]="publ-imp-aps", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="colo-imp-crayola", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="colo-imp-rainbow", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="colo-imp-ral", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="colo-imp-dem", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="colo-imp-ema", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="colo-imp-rgb", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="colo-imp-x11", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="colo-imp-xwi", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="java-imp-exa", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="java-imp-fil", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="java-imp-fld", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="java-imp-rhh", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="java-imp-stp", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="meta-imp-clp", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="meta-imp-dum", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="meta-imp-fen", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="meta-imp-mis", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="meta-imp-nav", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="meta-imp-pre", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="meta-imp-txt", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="symb-imp-cow", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="symb-imp-eur", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="symb-imp-jmn", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="symb-imp-mis", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="symb-imp-mvs", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="symb-imp-nav", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="type-imp-antykwa", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="type-imp-antykwapoltawskiego", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="type-imp-asana", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="type-imp-averia", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="type-imp-buy", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="type-imp-cambria", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="type-imp-charter", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="type-imp-cleartype", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="type-imp-computer-modern-unicode", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="type-imp-cow", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="type-imp-dejavu", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="type-imp-euler", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="type-imp-ghz", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="type-imp-hgz", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="type-imp-husayni", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="type-imp-hvmath", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="type-imp-inconsolata", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="type-imp-informal", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="type-imp-iwona", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="type-imp-kurier", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="type-imp-latinmodern", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="type-imp-liberation", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="type-imp-libertine", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="type-imp-lmnames", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="type-imp-lucida-opentype", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="type-imp-lucida-typeone", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="type-imp-mathdesign", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="type-imp-mathtimes", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="type-imp-mscore", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="type-imp-osx", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="type-imp-postscript", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="type-imp-punknova", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="type-imp-texgyre", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="type-imp-unfonts", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="type-imp-xits", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="type-imp-xitsbidi", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="publ-ini", - ["loading"]="always", - ["status"]="pending", - }, - { - ["category"]="mkiv", - ["filename"]="publ-old", - ["loading"]="always", - ["status"]="pending", - }, - { - ["category"]="mkiv", - ["filename"]="publ-tra", - ["loading"]="always", - ["status"]="pending", - }, - { - ["category"]="mkiv", - ["filename"]="publ-usr", - ["loading"]="always", - ["status"]="pending", - }, - { - ["category"]="mkiv", - ["filename"]="publ-xml", - ["loading"]="always", - ["status"]="pending", - }, - }, - ["lua"]={ - { - ["category"]="lua", - ["filename"]="anch-pgr", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="bibl-tst", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="char-fio", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="cldf-prs", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="cldf-scn", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="cldf-stp", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="cont-run", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="font-cff", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="font-cft", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="font-dsp", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="font-gbn", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="font-hsh", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="font-mps", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="font-nod", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="font-ocl", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="font-odk", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="font-odv", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="font-off", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="font-one", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="font-onr", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="font-osd", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="font-otj", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="font-otl", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="font-oto", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="font-otr", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="font-ots", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="font-oup", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="font-sel", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="font-shp", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="font-ttf", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="font-web", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="font-xtx", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="good-ctx", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="good-gen", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="good-ini", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="good-mth", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="grph-con", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="grph-mem", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="grph-pat", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="grph-rul", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="l-gzip", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="l-lua", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="l-package", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="l-sandbox", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="lang-cnt", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="lang-frq-de", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="lang-frq-en", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="lang-frq-nl", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="lang-frq-pt", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="lang-rep", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="luat-usr", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="lxml-ini", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="math-dir", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="mlib-int", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="mlib-lua", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="node-ltp", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="node-scn", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="node-met", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="node-nut", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="page-cst", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="page-inj", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="publ-imp-apa", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="publ-imp-aps", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="publ-imp-default", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="publ-imp-replacements", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="publ-jrn", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="publ-reg", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="publ-sor", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="regi-ibm", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="regi-pdfdoc", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="scrp-tha", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="spac-prf", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="toks-map", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="toks-tra", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="trac-par", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="typo-chr", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="typo-duc", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="typo-inj", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="typo-lin", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="typo-tal", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="typo-wrp", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="util-fil", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="util-lib-imp-gm", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="util-lib-imp-gs", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="util-ran", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="util-sac", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="util-sbx", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="util-sci", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="util-soc", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="util-sql-imp-client", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="util-sql-imp-library", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="util-sql-imp-sqlite", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="util-sql-imp-swiglib", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="util-sql-loggers", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="util-sql-sessions", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="util-sql-tickets", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="util-sql-tracers", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="util-sql-users", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="util-you", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="m-escrito", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="s-characters-properties", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="s-languages-words", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="s-xml-analyzers", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="x-math-svg", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="anch-pos", - ["loading"]="anch-pos", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="attr-col", - ["loading"]="attr-col", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="attr-eff", - ["loading"]="attr-eff", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="attr-ini", - ["loading"]="attr-ini", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="attr-lay", - ["loading"]="attr-lay", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="attr-neg", - ["loading"]="attr-neg", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="attr-mkr", - ["loading"]="attr-mkr", - ["status"]="okay", - }, - { - ["category"]="lua", - ["comment"]="experimental code, maybe some will move elsewhere", - ["filename"]="back-exp", - ["loading"]="back-exp", - ["status"]="pending", - }, - { - ["category"]="lua", - ["filename"]="back-ini", - ["loading"]="back-ini", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="back-pdf", - ["loading"]="back-pdf", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="bibl-bib", - ["loading"]="on demand", - }, - { - ["category"]="lua", - ["filename"]="bibl-tra", - ["loading"]="on demand", - }, - { - ["category"]="lua", - ["filename"]="blob-ini", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="buff-imp-default", - ["loading"]="buff-imp-default", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="buff-imp-escaped", - ["loading"]="buff-imp-escaped", - ["status"]="okay", - }, - { - ["category"]="lua", - ["comment"]="todo: colorization and nesting as in scite", - ["filename"]="buff-imp-lua", - ["loading"]="buff-imp-lua", - ["status"]="okay", - }, - { - ["category"]="lua", - ["comment"]="todo: colorization and nesting as in scite", - ["filename"]="buff-imp-mp", - ["loading"]="buff-imp-mp", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="buff-imp-nested", - ["loading"]="buff-imp-nested", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="buff-imp-parsed-xml", - ["loading"]="buff-imp-parsed-xml", - ["status"]="okay", - }, - { - ["category"]="lua", - ["comment"]="todo: colorization and nesting as in scite", - ["filename"]="buff-imp-tex", - ["loading"]="buff-imp-tex", - ["status"]="okay", - }, - { - ["category"]="lua", - ["comment"]="todo: colorization and nesting as in scite", - ["filename"]="buff-imp-xml", - ["loading"]="buff-imp-xml", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="buff-ini", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="buff-par", - ["status"]="okay", - }, - { - ["category"]="lua", - ["comment"]="maybe we will provide a few more (nesting) methods", - ["filename"]="buff-ver", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="catc-ini", - ["loading"]="catc-ini", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="char-cjk", - ["loading"]="char-ini", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="char-def", - ["loading"]="char-ini", - ["status"]="okay", - }, - { - ["category"]="lua", - ["comment"]="maybe dataonly", - ["filename"]="char-enc", - ["loading"]="char-enc", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="char-ent", - ["loading"]="char-ent", - ["status"]="okay", - }, - { - ["category"]="lua", - ["comment"]="maybe move blocks table to separate (dataonly) file", - ["filename"]="char-ini", - ["loading"]="char-ini", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="char-map", - ["loading"]="char-ini", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="char-tex", - ["loading"]="char-ini", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="char-utf", - ["loading"]="char-utf", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="chem-ini", - ["loading"]="chem-ini", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="chem-str", - ["loading"]="chem-str", - ["status"]="okay", - }, - { - ["category"]="lua", - ["comment"]="will be extended and can be optimized if needed", - ["filename"]="cldf-bas", - ["loading"]="cldf-bas", - ["status"]="okay", - }, - { - ["category"]="lua", - ["comment"]="might change or even go away", - ["filename"]="cldf-com", - ["loading"]="cldf-com", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="cldf-ini", - ["loading"]="cldf-ini", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="cldf-int", - ["loading"]="cldf-int", - ["status"]="pending", - }, - { - ["category"]="lua", - ["comment"]="maybe this code can be redone more efficiently/robust", - ["filename"]="cldf-ver", - ["loading"]="cldf-ver", - ["status"]="pending", - }, - { - ["category"]="lua", - ["comment"]="also used in mtx-*", - ["filename"]="colo-icc", - ["loading"]="colo-ini", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="colo-ini", - ["loading"]="colo-ini", - ["status"]="okay", - }, - { - ["category"]="lua", - ["comment"]="this code might move to a module", - ["filename"]="colo-run", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="core-con", - ["loading"]="core-con", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="core-ctx", - ["loading"]="core-ctx", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="core-dat", - ["loading"]="core-dat", - ["status"]="okay", - }, - { - ["category"]="lua", - ["comment"]="maybe abusing the tex namespace is wrong", - ["filename"]="core-env", - ["loading"]="core-env", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="core-sys", - ["loading"]="core-sys", - ["status"]="okay", - }, - { - ["category"]="lua", - ["commands"]="this is in fact replaced by core-dat", - ["filename"]="core-two", - ["loading"]="core-two", - ["status"]="okay", - }, - { - ["category"]="lua", - ["comment"]="some code will move to better places", - ["filename"]="core-uti", - ["loading"]="core-uti", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="data-aux", - ["loading"]="luat-lib", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="data-bin", - ["loading"]="luat-lib", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="data-con", - ["loading"]="luat-lib", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="data-crl", - ["loading"]="never", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="data-ctx", - ["loading"]="luat-lib", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="data-env", - ["loading"]="luat-lib", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="data-exp", - ["loading"]="luat-lib", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="data-fil", - ["loading"]="luat-lib", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="data-gen", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="data-ini", - ["loading"]="luat-lib", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="data-inp", - ["loading"]="luat-lib", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="data-lst", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="data-lua", - ["loading"]="luat-lib", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="data-met", - ["loading"]="luat-lib", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="data-out", - ["loading"]="luat-lib", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="data-pre", - ["loading"]="luat-lib", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="data-res", - ["loading"]="luat-lib", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="data-sch", - ["loading"]="luat-lib", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="data-tex", - ["loading"]="luat-lib", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="data-tmf", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="data-tmp", - ["loading"]="luat-lib", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="data-tre", - ["loading"]="luat-lib", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="data-use", - ["loading"]="luat-lib", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="data-vir", - ["loading"]="luat-lib", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="data-zip", - ["loading"]="luat-lib", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="file-ini", - ["loading"]="file-ini", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="file-job", - ["loading"]="file-job", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="file-lib", - ["loading"]="file-lib", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="file-mod", - ["loading"]="file-mod", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="file-res", - ["loading"]="file-res", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="file-syn", - ["loading"]="file-syn", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="font-afm", - ["loading"]="font-lib", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="font-afk", - ["loading"]="font-lib", - ["status"]="okay", - }, - { - ["category"]="lua", - ["comment"]="only used in luatex-fonts", - ["filename"]="font-age", - ["loading"]="never", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="font-agl", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["comment"]="needs some documentation in usage", - ["filename"]="font-aux", - ["loading"]="font-lib", - ["status"]="okay", - }, - { - ["category"]="lua", - ["comment"]="move more to the commands namespace", - ["filename"]="font-chk", - ["loading"]="font-chk", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="font-cid", - ["loading"]="font-lib", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="font-col", - ["loading"]="font-col", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="font-con", - ["loading"]="font-lib", - ["status"]="okay", - }, - { - ["category"]="lua", - ["comment"]="will be improved over time", - ["filename"]="font-ctx", - ["loading"]="font-lib", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="font-def", - ["loading"]="font-lib", - ["status"]="okay", - }, - { - ["category"]="lua", - ["comment"]="part of this code is obsolete", - ["filename"]="font-enc", - ["loading"]="font-lib", - ["status"]="okay", - }, - { - ["category"]="lua", - ["comment"]="needs documentation at the tex end", - ["filename"]="font-enh", - ["loading"]="font-lib", - ["status"]="okay", - }, - { - ["category"]="lua", - ["comment"]="maybe some data tables can be be external", - ["filename"]="font-ext", - ["loading"]="font-lib", - ["status"]="okay", - }, - { - ["category"]="lua", - ["comment"]="okay but can be improved", - ["filename"]="font-fbk", - ["loading"]="font-lib", - ["status"]="pending", - }, - { - ["category"]="lua", - ["filename"]="font-ini", - ["loading"]="font-lib", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="font-inj", - ["loading"]="font-lib", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="font-ldr", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="font-log", - ["loading"]="font-lib", - ["status"]="okay", - }, - { - ["category"]="lua", - ["comment"]="currently rather minimalistic", - ["filename"]="font-lua", - ["loading"]="font-lib", - ["status"]="okay", - }, - { - ["category"]="lua", - ["comment"]="the lum file support will be dropped / no map files anyway", - ["filename"]="font-map", - ["loading"]="font-lib", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="font-mis", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["comment"]="when more scripts are supported we might end up with imp files", - ["filename"]="font-ota", - ["loading"]="font-lib", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="font-otb", - ["loading"]="font-lib", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="font-otc", - ["loading"]="font-lib", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="font-otd", - ["loading"]="font-lib", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="font-otf", - ["loading"]="font-lib", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="font-oth", - ["loading"]="font-lib", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="font-oti", - ["loading"]="font-lib", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="font-otn", - ["loading"]="font-lib", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="font-otp", - ["loading"]="font-lib", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="font-ott", - ["loading"]="font-lib", - ["status"]="okay", - }, - { - ["category"]="lua", - ["comment"]="is mostly replaced by lfg files", - ["filename"]="font-pat", - ["loading"]="font-lib", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="font-sol", - ["loading"]="font-sol", - ["status"]="okay", - }, - { - ["category"]="lua", - ["comment"]="also loaded on demand", - ["filename"]="font-syn", - ["loading"]="font-lib", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="font-tfm", - ["loading"]="font-lib", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="font-trt", - ["loading"]="font-lib", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="font-vf", - ["loading"]="font-lib", - ["status"]="pending", - }, - { - ["category"]="lua", - ["filename"]="grph-epd", - ["loading"]="grph-epd", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="grph-fil", - ["loading"]="grph-inc", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="grph-inc", - ["loading"]="grph-inc", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="grph-raw", - ["loading"]="grph-raw", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="grph-swf", - ["loading"]="grph-swf", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="grph-u3d", - ["loading"]="grph-u3d", - ["status"]="okay", - }, - { - ["category"]="lua", - ["comment"]="experiment with graphic magick library", - ["filename"]="grph-wnd", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="java-ini", - ["loading"]="java-ini", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="l-boolean", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="l-dir", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="l-file", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="l-function", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="l-io", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="l-lpeg", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="l-math", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="l-md5", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="l-number", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="l-os", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="l-pdfview", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="l-set", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="l-string", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="l-table", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="l-unicode", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="l-url", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="l-xml", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="lang-def", - ["loading"]="lang-def", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="lang-dis", - ["loading"]="lang-ini", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="lang-hyp", - ["loading"]="lang-hyp", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="lang-ini", - ["loading"]="lang-ini", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="lang-lab", - ["loading"]="lang-lab", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="lang-hyp", - ["loading"]="lang-hyp", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="lang-txt", - ["loading"]="lang-lab", - ["status"]="okay", - }, - { - ["category"]="lua", - ["comment"]="maybe another approach is nicer", - ["filename"]="lang-url", - ["loading"]="lang-url", - ["status"]="pending", - }, - { - ["category"]="lua", - ["filename"]="lang-wrd", - ["loading"]="lang-wrd", - ["status"]="okay", - }, - { - ["category"]="lua", - ["comment"]="more will end up here", - ["filename"]="layo-ini", - ["loading"]="layo-ini", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="lpdf-ano", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="lpdf-res", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="lpdf-col", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="lpdf-enc", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="lpdf-epa", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="lpdf-epd", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="lpdf-fld", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="lpdf-fmt", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="lpdf-grp", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="lpdf-ini", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="lpdf-mis", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="lpdf-mov", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="lpdf-nod", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="lpdf-ren", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="lpdf-swf", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="lpdf-tag", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="lpdf-u3d", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="lpdf-wid", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="lpdf-xmp", - ["status"]="todo", - }, - { - ["category"]="lua", - ["comment"]="replacement code for wd/ht/dp", - ["filename"]="luat-bwc", - ["loading"]="luat-lib", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="luat-cbk", - ["loading"]="luat-lib", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="luat-cnf", - ["loading"]="luat-lib", - ["status"]="okay", - }, - { - ["category"]="lua", - ["comment"]="maybe some code should move", - ["filename"]="luat-cod", - ["loading"]="luat-cod", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="luat-env", - ["loading"]="luat-lib", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="luat-exe", - ["loading"]="luat-lib", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="luat-fio", - ["loading"]="luat-lib", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="luat-fmt", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["comment"]="will be upgraded when we have Lua 5.2", - ["filename"]="luat-ini", - ["loading"]="luat-lib", - ["status"]="pending", - }, - { - ["category"]="lua", - ["comment"]="will be upgraded when we have Lua 5.2", - ["filename"]="util-env", - ["loading"]="luat-lib", - ["status"]="pending", - }, - { - ["category"]="lua", - ["filename"]="luat-iop", - ["loading"]="luat-lib", - ["status"]="okay", - }, - { - ["category"]="lua", - ["comment"]="this is likely to change some day", - ["filename"]="luat-lua", - ["loading"]="luat-lib", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="luat-mac", - ["loading"]="luat-lib", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="luat-run", - ["loading"]="luat-lib", - ["status"]="okay", - }, - { - ["category"]="lua", - ["comment"]="related to the socket code", - ["filename"]="luat-soc", - ["loading"]="on demand", - ["status"]="pending", - }, - { - ["category"]="lua", - ["filename"]="luat-sta", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="luat-sto", - ["loading"]="luat-lib", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="lxml-aux", - ["loading"]="luat-lib", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="lxml-css", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="lxml-ctx", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="lxml-dir", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="lxml-ent", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="lxml-inf", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="lxml-lpt", - ["loading"]="luat-lib", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="lxml-mis", - ["loading"]="luat-lib", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="lxml-sor", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="lxml-tab", - ["loading"]="luat-lib", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="lxml-tex", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="lxml-xml", - ["loading"]="luat-lib", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="m-chart", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="m-database", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="m-nodechart", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="m-markdown", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="m-pstricks", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="m-spreadsheet", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="m-steps", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="math-act", - ["loading"]="math-ini", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="math-frc", - ["loading"]="math-frc", - ["status"]="okay", - }, - { - ["category"]="lua", - ["comment"]="could be made look nicer, but who cares", - ["filename"]="math-dim", - ["loading"]="math-ini", - ["status"]="okay", - }, - { - ["category"]="lua", - ["comment"]="the code is related to math-vfu", - ["filename"]="math-ext", - ["loading"]="math-ini", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="math-fbk", - ["loading"]="math-ini", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="math-frc", - ["loading"]="math-frc", - ["status"]="okay", - }, - { - ["category"]="lua", - ["comment"]="okay, but we might have a few more low level definers some day", - ["filename"]="math-ini", - ["loading"]="math-ini", - ["status"]="pending", - }, - { - ["category"]="lua", - ["filename"]="math-map", - ["loading"]="math-ini", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="math-noa", - ["loading"]="math-ini", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="math-ren", - ["loading"]="math-ini", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="math-tag", - ["loading"]="math-ini", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="math-ttv", - ["loading"]="math-ini", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="math-vfu", - ["loading"]="math-ini", - ["status"]="okay", - }, - { - ["category"]="lua", - ["comment"]="this is just a first version", - ["filename"]="meta-fun", - ["loading"]="meta-fun", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="meta-ini", - ["loading"]="meta-ini", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="meta-lua", - ["loading"]="meta-lua", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="meta-fnt", - ["loading"]="meta-fnt", - ["status"]="okay", - }, - { - ["category"]="lua", - ["comment"]="could be done nicer nowadays but who needs it", - ["filename"]="meta-pdf", - ["loading"]="meta-pdf", - ["status"]="okay", - }, - { - ["category"]="lua", - ["comment"]="this is historic code that we keep around", - ["filename"]="meta-pdh", - ["loading"]="never", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="meta-tex", - ["loading"]="meta-tex", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="mlib-ctx", - ["loading"]="mlib-ctx", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="mlib-pdf", - ["loading"]="mlib-pdf", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="mlib-pps", - ["loading"]="mlib-pdf", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="mlib-run", - ["loading"]="mlib-ctx", - ["status"]="okay", - }, - { - ["category"]="lua", - ["comment"]="this is an experiment, namespaces need to be dealt with properly", - ["filename"]="mult-aux", - ["loading"]="mult-aux", - ["status"]="pending", - }, - { - ["category"]="lua", - ["comment"]="this is an experiment", - ["filename"]="mult-chk", - ["loading"]="mult-chk", - ["status"]="pending", - }, - { - ["category"]="lua", - ["filename"]="mult-def", - ["loading"]="mult-ini", - ["status"]="okay", - }, - { - ["category"]="lua", - ["comment"]="used for generating editor lexing files", - ["filename"]="mult-fun", - ["loading"]="never", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="mult-ini", - ["loading"]="mult-ini", - ["status"]="okay", - }, - { - ["category"]="lua", - ["comment"]="used for generating editor lexing files", - ["filename"]="mult-low", - ["loading"]="never", - ["status"]="okay", - }, - { - ["category"]="lua", - ["comment"]="all messages need to be checked", - ["filename"]="mult-mes", - ["loading"]="mult-ini", - ["status"]="pending", - }, - { - ["category"]="lua", - ["comment"]="used for generating editor lexing files", - ["filename"]="mult-mps", - ["loading"]="never", - ["status"]="okay", - }, - { - ["category"]="lua", - ["comment"]="used for generating editor lexing files", - ["filename"]="mult-prm", - ["loading"]="never", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="node-acc", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="node-aux", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="node-bck", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="node-dir", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="node-ext", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="node-fin", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="node-fnt", - ["loading"]="font-lib", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="node-ini", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="node-mig", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="node-pag", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="node-ppt", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="node-pro", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="node-ref", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="node-res", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="node-rul", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="node-ser", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="node-shp", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="node-tex", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="node-tra", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="node-snp", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="node-tsk", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="node-tst", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="node-typ", - ["status"]="todo", - }, - { - ["category"]="lua", - ["comment"]="will be extended when we have opened up pdf objects", - ["filename"]="pack-obj", - ["loading"]="pack-obj", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="pack-rul", - ["loading"]="pack-rul", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="page-otr", - ["loading"]="page-otr", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="page-flt", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="page-ins", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="page-lin", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="page-mix", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="page-pst", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="page-str", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="phys-dim", - ["loading"]="phys-dim", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="regi-8859-1", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="regi-8859-10", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="regi-8859-11", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="regi-8859-13", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="regi-8859-14", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="regi-8859-15", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="regi-8859-16", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="regi-8859-2", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="regi-8859-3", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="regi-8859-4", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="regi-8859-5", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="regi-8859-6", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="regi-8859-7", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="regi-8859-8", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="regi-8859-9", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="regi-cp1250", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="regi-cp1251", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="regi-cp1252", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="regi-cp1253", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="regi-cp1254", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="regi-cp1255", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="regi-cp1256", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="regi-cp1257", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="regi-cp1258", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["comment"]="just a demo file", - ["filename"]="regi-demo", - ["loading"]="never", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="regi-ini", - ["loading"]="regi-ini", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="s-fonts-coverage", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="s-fonts-features", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="s-fonts-missing", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="s-fonts-shapes", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="s-fonts-system", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="s-fonts-tables", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="s-fonts-vectors", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="s-languages-counters", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="s-languages-frequencies", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="s-languages-hyphenation", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="s-languages-sorting", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="s-languages-system", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="s-math-characters", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="s-math-coverage", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="s-fonts-goodies", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="s-math-parameters", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="s-pre-71", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="s-sql-tables", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="scrn-but", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="scrn-fld", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="scrn-hlp", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="scrn-ini", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="scrn-pag", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="scrn-ref", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="scrn-wid", - ["status"]="todo", - }, - { - ["category"]="lua", - ["comment"]="we can speed this up", - ["filename"]="scrp-cjk", - ["loading"]="scrp-ini", - ["status"]="okay", - }, - { - ["category"]="lua", - ["comment"]="we can speed this up", - ["filename"]="scrp-eth", - ["loading"]="scrp-ini", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="scrp-ini", - ["loading"]="scrp-ini", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="sort-ini", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="sort-lan", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="spac-adj", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="spac-ali", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="spac-chr", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="spac-hor", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="spac-ver", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="status-mkiv", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="strc-bkm", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="strc-blk", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="strc-con", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="strc-doc", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="strc-flt", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="strc-ini", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="strc-itm", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="strc-lev", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="strc-lst", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="strc-mar", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="strc-mat", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="strc-not", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="strc-num", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="strc-pag", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="strc-ref", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="strc-reg", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="strc-rsc", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="strc-syn", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="strc-tag", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="supp-box", - ["loading"]="supp-box", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="supp-ran", - ["loading"]="supp-ran", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="symb-ini", - ["loading"]="symb-ini", - ["status"]="okay", - }, - { - ["category"]="lua", - ["comment"]="there will be more in here", - ["filename"]="syst-aux", - ["loading"]="syst-aux", - ["status"]="okay", - }, - { - ["category"]="lua", - ["comment"]="do some tests with speedups (sprint)", - ["filename"]="syst-con", - ["loading"]="syst-con", - ["status"]="pending", - }, - { - ["category"]="lua", - ["comment"]="do some tests with speedups (less tokens)", - ["filename"]="syst-lua", - ["loading"]="syst-lua", - ["status"]="pending", - }, - { - ["category"]="lua", - ["filename"]="tabl-tbl", - ["loading"]="tabl-tbl", - ["status"]="okay", - }, - { - ["category"]="lua", - ["comment"]="work in progress", - ["filename"]="tabl-xtb", - ["loading"]="tabl-xtb", - ["status"]="okay", - }, - { - ["category"]="lua", - ["comment"]="we need a well defined defintion moment", - ["filename"]="task-ini", - ["loading"]="task-ini", - ["status"]="pending", - }, - { - ["category"]="lua", - ["filename"]="toks-ini", - ["loading"]="toks-ini", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="toks-scn", - ["loading"]="toks-ini", - ["status"]="okay", - }, - { - ["category"]="lua", - ["comment"]="must be applied in more places", - ["filename"]="trac-ctx", - ["loading"]="trac-ctx", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="trac-deb", - ["loading"]="trac-deb", - ["status"]="okay", - }, - { - ["category"]="lua", - ["comment"]="for the moment somewhat private", - ["filename"]="trac-fil", - ["loading"]="never", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="trac-inf", - ["loading"]="luat-lib", - ["status"]="okay", - }, - { - ["category"]="lua", - ["comment"]="will be redone and extended", - ["filename"]="trac-lmx", - ["loading"]="luat-lib", - ["status"]="pending", - }, - { - ["category"]="lua", - ["filename"]="trac-log", - ["loading"]="luat-lib", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="trac-xml", - ["loading"]="mtxrun", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="trac-exp", - ["loading"]="mtxrun", - ["status"]="okay", - }, - { - ["category"]="lua", - ["comment"]="experimental code, will be redone when lua 5.2", - ["filename"]="trac-pro", - ["loading"]="luat-lib", - ["status"]="pending", - }, - { - ["category"]="lua", - ["comment"]="some code can better be in util-set", - ["filename"]="trac-set", - ["loading"]="luat-lib", - ["status"]="pending", - }, - { - ["category"]="lua", - ["filename"]="trac-tex", - ["loading"]="trac-tex", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="trac-tim", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="trac-vis", - ["loading"]="trac-vis", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="trac-jus", - ["loading"]="trac-jus", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="type-ini", - ["loading"]="type-ini", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="typo-bld", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="typo-sus", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="typo-brk", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="typo-cap", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="typo-cln", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="typo-dig", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="typo-dir", - ["loading"]="typo-dir", - ["status"]="okay", - }, - { - ["category"]="lua", - ["comment"]="work in progress", - ["filename"]="typo-dha", - ["loading"]="typo-dir", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="typo-dua", - ["loading"]="typo-dir", - ["status"]="okay", - }, - { - ["category"]="lua", - ["comment"]="work in progress", - ["filename"]="typo-dub", - ["loading"]="typo-dir", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="typo-ini", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["filename"]="typo-tal", - ["loading"]="typo-tal", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="typo-itc", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="typo-krn", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="typo-mar", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="typo-pag", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="typo-drp", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="typo-fln", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="typo-man", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="typo-prc", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="typo-lan", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="typo-rep", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="typo-spa", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="unic-ini", - ["loading"]="unic-ini", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="util-deb", - ["loading"]="luat-lib", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="util-dim", - ["loading"]="luat-lib", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="util-fmt", - ["loading"]="luat-lib", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="util-jsn", - ["loading"]="m-json", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="util-lua", - ["loading"]="luat-lib", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="util-lib", - ["loading"]="luat-lib", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="util-mrg", - ["loading"]="luat-lib", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="util-pck", - ["loading"]="luat-lib", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="util-prs", - ["loading"]="luat-lib", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="util-seq", - ["loading"]="luat-lib", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="util-sql", - ["loading"]="m-sql", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="util-sta", - ["loading"]="luat-lib", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="util-sto", - ["loading"]="luat-lib", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="util-str", - ["loading"]="luat-lib", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="util-tab", - ["loading"]="luat-lib", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="util-tpl", - ["loading"]="luat-lib", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="x-asciimath", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="x-calcmath", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="x-cals", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="x-chemml", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="x-ct", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="x-ldx", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="x-mathml", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="publ-ini", - ["loading"]="publ-ini.mkiv", - ["status"]="pending", - }, - { - ["category"]="lua", - ["filename"]="publ-aut", - ["loading"]="publ-ini.mkiv", - ["status"]="pending", - }, - { - ["category"]="lua", - ["filename"]="publ-dat", - ["loading"]="publ-ini.mkiv", - ["status"]="pending", - }, - { - ["category"]="lua", - ["filename"]="publ-oth", - ["loading"]="publ-ini.mkiv", - ["status"]="pending", - }, - { - ["category"]="lua", - ["filename"]="publ-fnd", - ["loading"]="publ-ini.mkiv", - ["status"]="pending", - }, - { - ["category"]="lua", - ["filename"]="publ-tra", - ["loading"]="publ-ini.mkiv", - ["status"]="pending", - }, - { - ["category"]="lua", - ["filename"]="publ-usr", - ["loading"]="publ-ini.mkiv", - ["status"]="pending", - }, - }, - ["main"]={ - { - ["category"]="mkiv", - ["filename"]="context", - ["loading"]="parent", - ["status"]="okay", - }, - { - ["category"]="lus", - ["comment"]="stub file for context", - ["filename"]="context", - ["loading"]="parent", - ["status"]="okay", - }, - { - ["category"]="tex", - ["filename"]="metatex", - ["loading"]="parent", - ["status"]="pending", - }, - { - ["category"]="lus", - ["comment"]="stub file for metatex", - ["filename"]="metatex", - ["loading"]="parent", - ["status"]="pending", - }, - { - ["category"]="mkiv", - ["filename"]="cont-cs", - ["loading"]="parent", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="cont-de", - ["loading"]="parent", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="cont-en", - ["loading"]="parent", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="cont-fr", - ["loading"]="parent", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="cont-gb", - ["loading"]="parent", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="cont-it", - ["loading"]="parent", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="cont-nl", - ["loading"]="parent", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="cont-pe", - ["loading"]="parent", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="cont-ro", - ["loading"]="parent", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="we keep this around for historic reasons", - ["filename"]="ppchtex", - ["loading"]="never", - ["status"]="okay", - }, - }, - ["metafun"]={ - { - ["category"]="mpiv", - ["comment"]="maybe more delayed loading", - ["filename"]="metafun", - ["loading"]="parent", - ["status"]="okay", - }, - { - ["category"]="mpiv", - ["filename"]="mp-base", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mpiv", - ["filename"]="mp-tool", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mpiv", - ["filename"]="mp-mlib", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mpiv", - ["comment"]="sort of obsolete", - ["filename"]="mp-core", - ["status"]="okay", - }, - { - ["category"]="mpiv", - ["comment"]="maybe some nicer synonyms", - ["filename"]="mp-page", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mpiv", - ["filename"]="mp-butt", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mpiv", - ["filename"]="mp-shap", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mpiv", - ["filename"]="mp-grph", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mpiv", - ["filename"]="mp-grid", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mpiv", - ["comment"]="a hack anyway", - ["filename"]="mp-form", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mpiv", - ["filename"]="mp-figs", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mpiv", - ["filename"]="mp-func", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mpiv", - ["filename"]="mp-text", - ["loading"]="on demand", - ["status"]="todo", - }, - { - ["category"]="mpiv", - ["filename"]="mp-crop", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mpiv", - ["comment"]="follows m-chart", - ["filename"]="mp-char", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mpiv", - ["comment"]="follows m-steps", - ["filename"]="mp-step", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mpiv", - ["filename"]="mp-chem", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mpiv", - ["comment"]="maybe some namespace changes", - ["filename"]="mp-abck", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mpiv", - ["comment"]="maybe some namespace changes", - ["filename"]="mp-apos", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mpiv", - ["comment"]="will be done when needed", - ["filename"]="mp-asnc", - ["loading"]="on demand", - ["status"]="todo", - }, - { - ["category"]="mpiv", - ["filename"]="mp-back", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mpiv", - ["filename"]="mp-bare", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mpiv", - ["filename"]="mp-cows", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mpiv", - ["filename"]="mp-fobg", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mpiv", - ["filename"]="mp-grap", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mpiv", - ["filename"]="mp-idea", - ["loading"]="on demand", - ["status"]="unknown", - }, - { - ["category"]="mpiv", - ["filename"]="mp-luas", - ["loading"]="always", - ["status"]="okay", - }, - { - ["category"]="mpiv", - ["filename"]="mp-symb", - ["loading"]="on demand", - ["status"]="okay", - }, - }, - ["modules"]={ - { - ["category"]="mkiv", - ["comment"]="best use m-zint instead", - ["filename"]="m-barcodes", - ["loading"]="module", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["filename"]="m-chart", - ["loading"]="module", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="this is a placeholder (chemistry is built-in)", - ["filename"]="m-chemic", - ["loading"]="never", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="m-cweb", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["filename"]="m-database", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["filename"]="m-nodechart", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="add-on for mtx-context", - ["filename"]="m-directives", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="m-educat", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["filename"]="m-fields", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["filename"]="m-format", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["filename"]="m-graph", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["filename"]="m-ipsum", - ["loading"]="module", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="m-json", - ["loading"]="module", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="m-layout", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["comment"]="add-on for mtx-context", - ["filename"]="m-logcategories", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="m-markdown", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["filename"]="m-mathcrap", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["filename"]="m-mkii", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["filename"]="m-mkivhacks", - ["status"]="todo", - }, - { - ["category"]="mkvi", - ["filename"]="m-morse", - ["loading"]="module", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="m-narrowtt", - ["loading"]="module", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="m-ntb-to-xtb", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="m-obsolete", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["filename"]="m-oldfun", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["filename"]="m-oldnum", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["filename"]="m-pictex", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["filename"]="m-pstricks", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["comment"]="keep an eye on changes in lua code", - ["filename"]="m-punk", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="m-spreadsheet", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["filename"]="m-steps", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["filename"]="m-subsub", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["filename"]="m-sql", - ["loading"]="module", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="m-timing", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="add-on for mtx-context", - ["filename"]="m-trackers", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="m-translate", - ["status"]="okay", - }, - { - ["category"]="xsd", - ["filename"]="x-chemml", - ["status"]="todo", - }, - { - ["category"]="xsd", - ["filename"]="x-contml", - ["status"]="todo", - }, - { - ["category"]="rng", - ["filename"]="x-corres", - ["status"]="todo", - }, - { - ["category"]="dtd", - ["filename"]="x-fig-00", - ["status"]="todo", - }, - { - ["category"]="xsd", - ["filename"]="x-fig-00", - ["status"]="todo", - }, - { - ["category"]="ctx", - ["filename"]="x-ldx", - ["status"]="todo", - }, - { - ["category"]="xsd", - ["filename"]="x-mathml", - ["status"]="todo", - }, - { - ["category"]="xsl", - ["filename"]="x-om2cml", - ["status"]="todo", - }, - { - ["category"]="xsl", - ["filename"]="x-openmath", - ["status"]="todo", - }, - { - ["category"]="ctx", - ["comment"]="runner for x-pfs-01", - ["filename"]="x-pfsense", - ["status"]="okay", - }, - { - ["category"]="xsd", - ["filename"]="x-physml", - ["status"]="todo", - }, - { - ["category"]="xsl", - ["filename"]="x-sm2om", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["filename"]="m-units", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["filename"]="m-visual", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["filename"]="m-zint", - ["status"]="okay", - }, - { - ["category"]="tex", - ["filename"]="s-abr-01", - ["status"]="todo", - }, - { - ["category"]="tex", - ["filename"]="s-abr-02", - ["status"]="todo", - }, - { - ["category"]="tex", - ["filename"]="s-abr-03", - ["status"]="todo", - }, - { - ["category"]="tex", - ["filename"]="s-abr-04", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["filename"]="s-art-01", - ["status"]="todo", - }, - { - ["category"]="tex", - ["filename"]="s-cdr-01", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["filename"]="s-def-01", - ["status"]="todo", - }, - { - ["category"]="tex", - ["filename"]="s-faq-00", - ["status"]="todo", - }, - { - ["category"]="tex", - ["filename"]="s-faq-01", - ["status"]="todo", - }, - { - ["category"]="tex", - ["filename"]="s-faq-02", - ["status"]="todo", - }, - { - ["category"]="tex", - ["filename"]="s-faq-03", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["filename"]="s-fnt-10", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["filename"]="s-fnt-20", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["filename"]="s-fnt-21", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["filename"]="s-fnt-24", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["filename"]="s-fonts-coverage", - ["loading"]="s-fonts-coverage", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="s-fonts-features", - ["loading"]="s-fonts-features", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="s-fonts-goodies", - ["loading"]="s-fonts-goodies", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="s-fonts-missing", - ["loading"]="s-fonts-missing", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="s-fonts-shapes", - ["loading"]="s-fonts-shapes", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="s-fonts-system", - ["loading"]="s-fonts-system", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="s-fonts-tables", - ["loading"]="s-fonts-tables", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="s-fonts-vectors", - ["loading"]="s-fonts-vectors", - ["status"]="okay", - }, - { - ["category"]="mkvi", - ["filename"]="s-inf-01", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="s-inf-02", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["filename"]="s-inf-03", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["filename"]="s-inf-04", - ["status"]="todo", - }, - { - ["category"]="lua", - ["filename"]="s-languages-counters", - ["loading"]="s-languages-counters", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="s-languages-frequencies", - ["loading"]="s-languages-frequencies", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="s-languages-hyphenation", - ["loading"]="s-languages-hyphenation", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="s-languages-sorting", - ["loading"]="s-languages-sorting", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="s-languages-system", - ["loading"]="s-languages-system", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="s-mag-01", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["filename"]="s-map-10", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["filename"]="s-math-characters", - ["loading"]="s-math-characters", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="s-math-coverage", - ["loading"]="s-math-coverage", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="s-math-extensibles", - ["loading"]="s-math-extensibles", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="s-math-parameters", - ["loading"]="s-math-parameters", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="s-math-repertoire", - ["loading"]="s-math-repertoire", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="s-mod-00", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["filename"]="s-mod-01", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["filename"]="s-mod-02", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["filename"]="s-pages-statistics", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="s-physics-units", - ["loading"]="s-physics-units", - ["status"]="okay", - }, - { - ["category"]="tex", - ["filename"]="s-pre-00", - ["status"]="todo", - }, - { - ["category"]="tex", - ["filename"]="s-pre-01", - ["status"]="todo", - }, - { - ["category"]="tex", - ["filename"]="s-pre-02", - ["status"]="todo", - }, - { - ["category"]="tex", - ["filename"]="s-pre-03", - ["status"]="todo", - }, - { - ["category"]="tex", - ["filename"]="s-pre-04", - ["status"]="todo", - }, - { - ["category"]="tex", - ["filename"]="s-pre-05", - ["status"]="todo", - }, - { - ["category"]="tex", - ["filename"]="s-pre-06", - ["status"]="todo", - }, - { - ["category"]="tex", - ["filename"]="s-pre-07", - ["status"]="todo", - }, - { - ["category"]="tex", - ["filename"]="s-pre-08", - ["status"]="todo", - }, - { - ["category"]="tex", - ["filename"]="s-pre-09", - ["status"]="todo", - }, - { - ["category"]="tex", - ["filename"]="s-pre-10", - ["status"]="todo", - }, - { - ["category"]="tex", - ["filename"]="s-pre-11", - ["status"]="todo", - }, - { - ["category"]="tex", - ["filename"]="s-pre-12", - ["status"]="todo", - }, - { - ["category"]="tex", - ["filename"]="s-pre-13", - ["status"]="todo", - }, - { - ["category"]="tex", - ["filename"]="s-pre-14", - ["status"]="todo", - }, - { - ["category"]="tex", - ["filename"]="s-pre-15", - ["status"]="todo", - }, - { - ["category"]="tex", - ["filename"]="s-pre-16", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["filename"]="s-pre-17", - ["status"]="todo", - }, - { - ["category"]="tex", - ["filename"]="s-pre-18", - ["status"]="todo", - }, - { - ["category"]="tex", - ["filename"]="s-pre-19", - ["status"]="todo", - }, - { - ["category"]="tex", - ["filename"]="s-pre-22", - ["status"]="todo", - }, - { - ["category"]="tex", - ["filename"]="s-pre-23", - ["status"]="todo", - }, - { - ["category"]="tex", - ["filename"]="s-pre-26", - ["status"]="todo", - }, - { - ["category"]="tex", - ["filename"]="s-pre-27", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["filename"]="s-pre-30", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["filename"]="s-present-tiles", - ["status"]="okay", - }, - { - ["category"]="tex", - ["filename"]="s-pre-50", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["filename"]="s-pre-60", - ["status"]="todo", - }, - { - ["category"]="tex", - ["filename"]="s-pre-61", - ["status"]="todo", - }, - { - ["category"]="tex", - ["filename"]="s-pre-62", - ["status"]="todo", - }, - { - ["category"]="tex", - ["filename"]="s-pre-63", - ["status"]="todo", - }, - { - ["category"]="tex", - ["filename"]="s-pre-64", - ["status"]="todo", - }, - { - ["category"]="tex", - ["filename"]="s-pre-66", - ["status"]="todo", - }, - { - ["category"]="tex", - ["filename"]="s-pre-67", - ["status"]="todo", - }, - { - ["category"]="tex", - ["filename"]="s-pre-68", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["filename"]="s-pre-69", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["filename"]="s-pre-70", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["filename"]="s-pre-71", - ["status"]="todo", - }, - { - ["category"]="tex", - ["filename"]="s-pre-93", - ["status"]="todo", - }, - { - ["category"]="tex", - ["filename"]="s-pre-96", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["filename"]="s-reg-01", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["filename"]="s-sql-tables", - ["loading"]="s-sql-tables", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="x-asciimath", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="x-calcmath", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["filename"]="x-cals", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["filename"]="x-chemml", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["filename"]="x-ct", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["filename"]="x-entities", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="x-foxet", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["filename"]="x-ldx", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["filename"]="x-mathml", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["filename"]="x-newmml", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["comment"]="pfsense xml configuration rendering", - ["filename"]="x-pfs-01", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="x-physml", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["filename"]="x-res-01", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["filename"]="x-res-50", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["filename"]="x-udhr", - ["status"]="okay", - }, - }, - ["optional"]={ - { - ["category"]="mkiv", - ["filename"]="bxml-apa", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["filename"]="colo-run", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="always needs some work", - ["filename"]="cont-new", - ["loading"]="runtime", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["filename"]="font-run", - ["loading"]="on demand", - ["status"]="todo", - }, - { - ["category"]="mkiv", - ["comment"]="this is an experimental module", - ["filename"]="lxml-ctx", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="this is historic code that we keep around", - ["filename"]="meta-pdh", - ["loading"]="never", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["comment"]="this is just a helper for generating files", - ["filename"]="mult-prm", - ["loading"]="never", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="page-run", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="mkiv", - ["filename"]="spac-adj", - ["loading"]="never", - ["status"]="obsolete", - }, - { - ["category"]="mkiv", - ["comment"]="replaced by a more modern variant", - ["filename"]="supp-vis", - ["loading"]="never", - ["status"]="obsolete", - }, - { - ["category"]="mkiv", - ["filename"]="symb-run", - ["loading"]="on demand", - ["status"]="okay", - }, - }, - ["patterns"]={ - { - ["category"]="lua", - ["filename"]="lang-af", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="lang-agr", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="lang-ala", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="lang-bg", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="lang-ca", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="lang-cs", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="lang-cy", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="lang-da", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="lang-de", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="lang-deo", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="lang-es", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="lang-et", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="lang-eu", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="lang-fi", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="lang-fr", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="lang-gb", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="lang-hr", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="lang-hu", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="lang-is", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="lang-it", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="lang-la", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="lang-lt", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="lang-lv", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="lang-ml", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="lang-mn", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="lang-nb", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="lang-nl", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="lang-nn", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="lang-pl", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="lang-pt", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="lang-ro", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="lang-ru", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="lang-sk", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="lang-sl", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="lang-sr", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="lang-sv", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="lang-th", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="lang-tk", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="lang-tr", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="lang-uk", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="lang-us", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="lang-zh", - ["loading"]="on demand", - ["status"]="okay", - }, - { - ["category"]="lua", - ["filename"]="word-xx", - ["loading"]="on demand", - ["status"]="okay", - }, - }, - ["resources"]={ - { - ["category"]="ori", - ["comment"]="template for a user configuration file (with suffix mkiv)", - ["filename"]="cont-sys", - ["loading"]="runtime", - ["status"]="okay", - }, - { - ["category"]="lmx", - ["filename"]="context-base", - ["status"]="todo", - }, - { - ["category"]="lmx", - ["filename"]="context-characters", - ["status"]="todo", - }, - { - ["category"]="lmx", - ["filename"]="context-debug", - ["status"]="todo", - }, - { - ["category"]="lmx", - ["filename"]="context-error", - ["status"]="todo", - }, - { - ["category"]="lmx", - ["filename"]="context-fonttest", - ["status"]="todo", - }, - { - ["category"]="lmx", - ["filename"]="context-help", - ["status"]="todo", - }, - { - ["category"]="lmx", - ["filename"]="context-timing", - ["status"]="todo", - }, - { - ["category"]="pdf", - ["filename"]="context-version", - ["status"]="todo", - }, - { - ["category"]="png", - ["filename"]="context-version", - ["status"]="todo", - }, - { - ["category"]="css", - ["comment"]="layout specification for debug and error pages and web services", - ["filename"]="context", - ["status"]="okay", - }, - { - ["category"]="rme", - ["comment"]="readme file", - ["filename"]="context", - ["status"]="okay", - }, - { - ["category"]="ctx", - ["comment"]="example of a ctx file (for mtx-context)", - ["filename"]="core-ctx", - ["status"]="okay", - }, - { - ["category"]="css", - ["filename"]="export-example", - ["status"]="todo", - }, - { - ["category"]="rng", - ["filename"]="export-example", - ["status"]="todo", - }, - { - ["category"]="tex", - ["filename"]="export-example", - ["status"]="todo", - }, - { - ["category"]="xml", - ["comment"]="this file is auto-generated by mtx-language", - ["filename"]="lang-all", - ["status"]="okay", - }, - { - ["category"]="xml", - ["filename"]="lpdf-pda", - ["status"]="todo", - }, - { - ["category"]="xml", - ["filename"]="lpdf-pdx", - ["status"]="todo", - }, - { - ["category"]="rlx", - ["filename"]="rlxcache", - ["status"]="todo", - }, - { - ["category"]="rlx", - ["filename"]="rlxtools", - ["status"]="todo", - }, - { - ["category"]="ctx", - ["filename"]="s-mod", - ["status"]="todo", - }, - { - ["category"]="pdf", - ["filename"]="status-files", - ["status"]="todo", - }, - { - ["category"]="pdf", - ["filename"]="status-lua", - ["status"]="todo", - }, - { - ["category"]="tex", - ["filename"]="status-mkiv", - ["status"]="todo", - }, - }, - ["todo"]={ - { - ["category"]="lua", - ["filename"]="core-run", - ["status"]="idea", - }, - }, -} diff --git a/tex/context/base/mkiv/status-mkiv.tex b/tex/context/base/mkiv/status-mkiv.tex deleted file mode 100644 index 8685c97ad..000000000 --- a/tex/context/base/mkiv/status-mkiv.tex +++ /dev/null @@ -1,328 +0,0 @@ -\usemodule[abr-02] - -\setupbodyfont - [dejavu,9pt] - -\setuppapersize - [A4,landscape] - -\setuplayout - [width=middle, - height=middle, - backspace=.5cm, - topspace=.5cm, - footer=0pt, - header=1.25cm] - -\setuphead - [title] - [style=\bfa, - page=yes, - after={\blank[line]}] - -\setuppagenumbering - [location=] - -\setupheadertexts - [\currentdate] - [MkIV Status / Page \pagenumber] - -% \showmakeup -% \showallmakeup - -\starttext - -% logs.report (immediate) versus logs.messenger (in flow) - -\starttitle[title=Todo] - -\startitemize[packed] - \startitem currently the new namespace prefixes are not consistent but this - will be done when we're satisfied with one scheme \stopitem - \startitem there will be additional columns in the table, like for namespace - so we need another round of checking then \stopitem - \startitem the lua code will be cleaned up upgraded as some is quite old - and experimental \stopitem - \startitem we need a proper dependency tree and better defined loading order \stopitem - \startitem all dotag.. will be moved to the tags_.. namespace \stopitem - \startitem we need to check what messages are gone (i.e.\ clean up mult-mes) \stopitem - \startitem some commands can go from mult-def (and the xml file) \stopitem - \startitem check for setuphandler vs simplesetuphandler \stopitem - \startitem for the moment we will go for \type {xxxx_} namespaces that (mostly) match - the filename but later we can replace these by longer names (via a script) so - module writers should {\bf not} use the core commands with \type{_} in the - name \stopitem - \startitem the message system will be unified \stopitem - \startitem maybe rename dowhatevertexcommand to fromluawhatevertexcommand \stopitem - \startitem consider moving setups directly to lua end (e.g. in characterspacing, breakpoint, bitmaps etc.) \stopitem - \startitem more local temporary \type {\temp...} will become \type {\p_...} \stopitem - \startitem check all ctxlua calls for ctxcommand \stopitem - \startitem rename all those \type {\current<whatever>}s in strc \stopitem - \startitem check \type {option} vs \type {options} \stopitem - \startitem check \type {type} vs \type {kind} \stopitem - \startitem check \type {label} vs \type {name} vs \type {tag} \stopitem - \startitem check \type {limop}, different limops should should be classes \stopitem - \startitem too many positions in simple files (itemize etc) \stopitem - \startitem math domains/dictionaries \stopitem - \startitem xtables don't span vertically with multilines (yet) \stopitem - \startitem notes in mixed columns \stopitem - \startitem floats in mixed columns \stopitem - \startitem check return values \type {os.execute} \stopitem - \startitem more r, d, k in xml code \stopitem - \startitem mathml, more in \LUA \stopitem - \startitem style: font-size, font, color handling in \HTML\ (lxml-css) \stopitem - \startitem a \type {\name {A.B.C DEF}} auto-nobreakspace \stopitem - \startitem redo \CWEB\ module with \LUA \stopitem - \startitem maybe move characters.blocks to its own file \stopitem - \startitem more local context = context in \LUA\ files \stopitem - \startitem check and optimize all storage.register and locals (cosmetics) \stopitem - \startitem check all used modules in \LUA\ (and local them) \stopitem - \startitem environment and basic lua helpers are now spread over too many files \stopitem - \startitem isolate tracers and showers \stopitem - \startitem check all possible usage of ctxcommand \stopitem - \startitem there are more s-* modules, like s-fnt-41 \stopitem - \startitem check (un)marked tables \stopitem -\stopitemize - -\stoptitle - -\starttitle[title=To keep an eye on] - -\startitemize[packed] - \startitem Currently lpeg replacements interpret the percent sign so we need to escape it. \stopitem - \startitem Currently numbers and strings are cast in comparisons bu tthat might change in the future. \stopitem -\stopitemize - -\stoptitle - -\definehighlight[notabenered] [color=darkred, style=bold] -\definehighlight[notabeneblue] [color=darkblue, style=bold] -\definehighlight[notabeneyellow] [color=darkyellow, style=bold] -\definehighlight[notabenemagenta][color=darkmagenta,style=bold] - -\startluacode - - local coremodules = dofile("status-mkiv.lua") - - local valid = table.tohash { - "toks", "attr", "page", "buff", "font", "colo", "phys", "supp", "typo", "strc", - "syst", "tabl", "spac", "scrn", "lang", "lxml", "mlib", "java", "pack", "math", - "symb", "grph", "anch", "luat", "mult", "back", "node", "meta", "norm", "catc", - "cldf", "file", "char", "core", "layo", "trac", "cont", "regi", "enco", "hand", - "unic", "sort", "blob", "type", "scrp", "prop", "chem", "bibl", "task", - "whatever", "mp", "s", "x", "m", "mtx", - } - - local specialcategories = { - mkvi = true, - } - - local what = { - "main", "core", "lua", "optional", "implementations", "extra", "extras", "metafun", "modules", "resources" - } - - local totaltodo = 0 - local totalpending = 0 - local totalobsolete = 0 - local totalloaded = 0 - - local function summary(nofloaded,noftodo,nofpending,nofobsolete) - - local nofdone = nofloaded - noftodo - nofpending - nofobsolete - - context.starttabulate { "|B|r|" } - context.HL() - context.NC() context("done") context.NC() context(nofdone) context.NC() context.NR() - context.NC() context("todo") context.NC() context(noftodo) context.NC() context.NR() - context.NC() context("pending") context.NC() context(nofpending) context.NC() context.NR() - context.NC() context("obsolete") context.NC() context(nofobsolete) context.NC() context.NR() - context.HL() - context.NC() context("loaded") context.NC() context(nofloaded) context.NC() context.NR() - context.HL() - context.stoptabulate() - - end - - if coremodules then - - local function tabelize(loaded,what) - - if loaded then - - local noftodo = 0 - local nofpending = 0 - local nofobsolete = 0 - local nofloaded = #loaded - local categories = { } - - for k, v in next, valid do - categories[k] = { } - end - - for i=1,nofloaded do - local l = loaded[i] - l.order = i - local category = string.match(l.filename,"([^%-]+)%-") or "whatever" - local c = categories[category] - if c then - c[#c+1] = l - end - end - - for k, loaded in table.sortedhash(categories) do - - local nofloaded = #loaded - - if nofloaded > 0 then - - table.sort(loaded,function(a,b) return a.filename < b.filename end) -- in place - - context.starttitle { title = string.format("%s: %s",what,k) } - - context.starttabulate { "|Tr|Tlw(3em)|Tlw(12em)|Tlw(12em)|Tlw(4em)|Tl|Tl|Tl|Tp|" } - context.NC() context.bold("order") - context.NC() context.bold("kind") - context.NC() context.bold("file") - context.NC() context.bold("loading") - context.NC() context.bold("status") - context.NC() context.bold("reference") - context.NC() context.bold("manual") - context.NC() context.bold("wiki") - context.NC() context.bold("comment") - context.NC() context.NR() - context.HL() - for i=1,nofloaded do - local module = loaded[i] - local status = module.status - local category = module.category - local filename = module.filename - context.NC() - context(module.order) - context.NC() - if specialcategories[category] then - context.notabeneblue(category) - else - context(category) - end - context.NC() - if #filename>20 then - context(string.sub(filename,1,18) .. "..") - else - context(filename) - end - context.NC() - context(module.loading) - context.NC() - if status == "todo" then - context.notabenered(status) - noftodo = noftodo + 1 - elseif status == "pending" then - context.notabeneyellow(status) - nofpending = nofpending + 1 - elseif status == "obsolete" then - context.notabenemagenta(status) - nofobsolete = nofobsolete + 1 - else - context(status) - end - context.NC() context(module.reference) - context.NC() context(module.manual) - context.NC() context(module.wiki) - context.NC() context(module.comment) - context.NC() context.NR() - end - context.stoptabulate() - - context.stoptitle() - - end - - end - - context.starttitle { title = string.format("summary of %s modules",what) } - - summary(nofloaded,noftodo,nofpending,nofobsolete) - - context.stoptitle() - - totaltodo = totaltodo + noftodo - totalpending = totalpending + nofpending - totalobsolete = totalobsolete + nofobsolete - totalloaded = totalloaded + nofloaded - - end - - end - - for i=1,#what do - tabelize(coremodules[what[i]],what[i]) - end - - end - - -- context.starttitle { title = "Valid prefixes" } - -- - -- for namespace, data in table.sortedhash(namespaces) do - -- if valid[namespace] then - -- context.type(namespace) - -- end - -- context.par() - -- end - -- - -- context.stoptitle() - - context.starttitle { title = string.format("summary of all",what) } - - summary(totalloaded,totaltodo,totalpending,totalobsolete) - - context.stoptitle() - - if io.exists("status-namespaces.lua") then - - context.starttitle { title = "messy namespaces" } - - local namespaces = dofile("status-namespaces.lua") - - for namespace, data in table.sortedhash(namespaces) do - if valid[namespace] then - else - context(namespace) - end - context.par() - end - - context.stoptitle() - - end - - if io.exists("status-registers.lua") then - - context.starttitle { title = "messy registers" } - - local registers = dofile("status-registers.lua") - - for register, data in table.sortedhash(registers) do - context(register) - context.par() - for name in table.sortedhash(data) do - context.quad() - context.type(name) - context.par() - end - context.par() - end - - context.stoptitle() - - end - - context.starttitle { title = "callbacks" } - - commands.showcallbacks() - - context.stoptitle() - -\stopluacode - - -\stoptext diff --git a/tex/context/base/mkiv/strc-bkm.mkiv b/tex/context/base/mkiv/strc-bkm.mkiv index 5a8dba562..8172030b1 100644 --- a/tex/context/base/mkiv/strc-bkm.mkiv +++ b/tex/context/base/mkiv/strc-bkm.mkiv @@ -13,7 +13,7 @@ \writestatus{loading}{ConTeXt Structure Macros / Bookmarks} -\registerctxluafile{strc-bkm}{1.001} +\registerctxluafile{strc-bkm}{} % \enabledirectives[references.bookmarks.preroll] diff --git a/tex/context/base/mkiv/strc-blk.lua b/tex/context/base/mkiv/strc-blk.lua index 0ababcfc0..492abc768 100644 --- a/tex/context/base/mkiv/strc-blk.lua +++ b/tex/context/base/mkiv/strc-blk.lua @@ -8,7 +8,7 @@ if not modules then modules = { } end modules ['strc-blk'] = { -- this one runs on top of buffers and structure -local type = type +local type, next = type, next local find, format, validstring = string.find, string.format, string.valid local settings_to_set, settings_to_array = utilities.parsers.settings_to_set, utilities.parsers.settings_to_array local allocate = utilities.storage.allocate diff --git a/tex/context/base/mkiv/strc-blk.mkiv b/tex/context/base/mkiv/strc-blk.mkiv index fe259d223..c42bb25ec 100644 --- a/tex/context/base/mkiv/strc-blk.mkiv +++ b/tex/context/base/mkiv/strc-blk.mkiv @@ -13,7 +13,7 @@ \writestatus{loading}{ConTeXt Structure Macros / Blockmoves} -\registerctxluafile{strc-blk}{1.001} +\registerctxluafile{strc-blk}{} \unprotect diff --git a/tex/context/base/mkiv/strc-con.mkvi b/tex/context/base/mkiv/strc-con.mkvi index 18ce17355..57b69cc7f 100644 --- a/tex/context/base/mkiv/strc-con.mkvi +++ b/tex/context/base/mkiv/strc-con.mkvi @@ -13,7 +13,7 @@ \writestatus{loading}{ConTeXt Structure Macros / Constructions} -\registerctxluafile{strc-con}{1.001} +\registerctxluafile{strc-con}{} % todo: check why \copy .. probably mkii leftover % @@ -73,6 +73,8 @@ \c!display=\v!yes, \c!width=7\emwidth, \c!distance=\emwidth, + \c!stretch=.50, + \c!shrink=.25, \c!titledistance=.5\emwidth, %c!hang=, %c!sample=, @@ -186,6 +188,27 @@ % \ifdefined\dotagsetconstruction \else \let\dotagsetconstruction\relax \fi +% \startuseMPgraphic{MyFrame} +% picture p ; numeric o ; path a, b ; pair c ; +% p := textext.rt("\FunnyFramed{\currentconstructiontext}") ; +% % p := textext.rt("\wrappedconstruction{\FunnyFramed{\currentconstructiontext}}") ; +% % p := textext.rt("\FunnyFramed{\wrappedconstruction{\currentconstructiontext}}") ; +% % p := textext.rt("\FunnyFramed{\wrappedcurrentconstruction}") ; +% ... +% \stopuseMPgraphic +% +% \defineoverlay[MyFrame][\useMPgraphic{MyFrame}] +% +% \defineframedtext +% [MyText] +% [frame=off, +% background=MyFrame] +% +% \defineenumeration[Theorem] +% [alternative=empty, +% before=\startMyText, +% after=\stopMyText] + \newtoks\everyconstruction \unexpanded\def\currentconstructiontext @@ -199,6 +222,24 @@ \p_strc_constructions_sample \endstrut} +\unexpanded\def\wrappedconstruction#1% + {\begingroup + \iftrialtypesetting \else + \currentconstructionsynchronize + \attribute\destinationattribute\currentconstructionattribute\relax + \fi + #1% + \endgroup} + +\unexpanded\def\wrappedcurrentconstruction + {\begingroup + \iftrialtypesetting \else + \currentconstructionsynchronize + \attribute\destinationattribute\currentconstructionattribute\relax + \fi + \currentconstructiontext + \endgroup} + \unexpanded\setvalue{\??constructionmainhandler\v!construction}#1% {\iftrialtypesetting \else \begingroup @@ -410,8 +451,12 @@ \installcommandhandler \??constructionalternative {constructionalternative} \??constructionalternative \setupconstructionalternative - [\c!width=\constructionparameter\c!width, - \c!distance=\constructionparameter\c!distance] + [%c!left=, % no inheritance + %c!right=,% no inheritance + \c!width=\constructionparameter\c!width, + \c!distance=\constructionparameter\c!distance, + \c!stretch=\constructionparameter\c!stretch, + \c!shrink=\constructionparameter\c!shrink] \defineconstructionalternative [\v!left] @@ -463,7 +508,7 @@ \defineconstructionalternative [\v!hanging] - [%\c!width=\v!fit, + [%\c!width=.75\emwidth \c!renderingsetup=\??constructionrenderings:\v!hanging] \defineconstructionalternative @@ -475,6 +520,15 @@ [\v!command] [\c!renderingsetup=\??constructionrenderings:\v!command] +\defineconstructionalternative + [\v!empty] + [\c!renderingsetup=\??constructionrenderings:\v!empty] + +\defineconstructionalternative + [\v!label] + [\c!renderingsetup=\??constructionrenderings:\v!label, + \c!width=] + \newbox \constructionheadbox \newskip \leftconstructionskip \newskip \rightconstructionskip @@ -778,7 +832,10 @@ \flushconstructionheadbox \ifconditional\c_strc_constructions_distance_none \else \nobreak - \hskip\constructionsheaddistance \s!plus .5\constructionsheaddistance \s!minus .25\constructionsheaddistance\relax + \hskip\constructionsheaddistance + \s!plus \constructionalternativeparameter\c!stretch\constructionsheaddistance + \s!minus\constructionalternativeparameter\c!shrink \constructionsheaddistance + \relax \fi \useconstructionstyleandcolor\c!style\c!color \ignorespaces @@ -822,9 +879,9 @@ \ifconditional\c_strc_constructions_distance_none \else % we used to have just a kern, but long lines look bad then \scratchdistance\ifdim\constructionsheaddistance=\zeropoint .75\emwidth\else\constructionsheaddistance\fi - \hskip \scratchdistance - \s!plus .25\scratchdistance - \s!minus.25\scratchdistance + \hskip \scratchdistance + \s!plus \constructionalternativeparameter\c!stretch\scratchdistance + \s!minus\constructionalternativeparameter\c!shrink \scratchdistance \fi \ifhmode \ifx\p_strc_constructions_width\v!line @@ -848,6 +905,19 @@ \ignorespaces \stopsetups +\startsetups[\??constructionrenderings:\v!empty] + \noindent + \useconstructionstyleandcolor\c!style\c!color + \ignorespaces +\stopsetups + +\startsetups[\??constructionrenderings:\v!label] + \dontleavehmode + \begingroup + \constructionparameter\c!headcommand{\flushconstructionheadbox} + \endgroup +\stopsetups + % you can use \placeclosesymbol or \qed to place a symbol at the end of a % construction diff --git a/tex/context/base/mkiv/strc-def.mkiv b/tex/context/base/mkiv/strc-def.mkiv index b2e86c140..8d1fa371f 100644 --- a/tex/context/base/mkiv/strc-def.mkiv +++ b/tex/context/base/mkiv/strc-def.mkiv @@ -12,7 +12,7 @@ \writestatus{loading}{ConTeXt Structure Macros / Definitions} -%registerctxluafile{strc-def}{1.001} +%registerctxluafile{strc-def}{} \unprotect @@ -181,6 +181,75 @@ [\v!appendix\c!label=\v!subsubsection, \v!bodypart\c!label=\v!subsubsection] % bijlageconversie=\Character +% extras + +\definesection[\s!section-8] % subsubsubsubsubsection +\definesection[\s!section-9] % subsubsubsubsubsubsection +\definesection[\s!section-10] % subsubsubsubsubsubsubsection +\definesection[\s!section-11] % subsubsubsubsubsubsubsubsection +\definesection[\s!section-12] % subsubsubsubsubsubsubsubsubsection + +\definehead + [\v!subsubsubsubsubsection] + [\c!section=\s!section-8, + \c!default=\v!subsubsubsubsection] + +\definehead + [\v!subsubsubsubsubsubsection] + [\c!section=\s!section-9, + \c!default=\v!subsubsubsubsubsection] + +\definehead + [\v!subsubsubsubsubsubsubsection] + [\c!section=\s!section-10, + \c!default=\v!subsubsubsubsubsubsection] + +\definehead + [\v!subsubsubsubsubsubsubsubsection] + [\c!section=\s!section-11, + \c!default=\v!subsubsubsubsubsubsubsection] + +\definehead + [\v!subsubsubsubsubsubsubsubsubsection] + [\c!section=\s!section-12, + \c!default=\v!subsubsubsubsubsubsubsubsection] + +\definehead + [\v!subsubsubsubsubsubject] + [\c!coupling=\v!subsubsubsubsubsection, + \c!default=\v!subsubsubsubsubsection, + \c!incrementnumber=\v!no] + +\definehead + [\v!subsubsubsubsubsubsubject] + [\c!coupling=\v!subsubsubsubsubsubsection, + \c!default=\v!subsubsubsubsubsubsection, + \c!incrementnumber=\v!no] + +\definehead + [\v!subsubsubsubsubsubsubsubject] + [\c!coupling=\v!subsubsubsubsubsubsubsection, + \c!default=\v!subsubsubsubsubsubsubsection, + \c!incrementnumber=\v!no] + +\definehead + [\v!subsubsubsubsubsubsubsubsubject] + [\c!coupling=\v!subsubsubsubsubsubsubsubsection, + \c!default=\v!subsubsubsubsubsubsubsubsection, + \c!incrementnumber=\v!no] + +\definehead + [\v!subsubsubsubsubsubsubsubsubsubject] + [\c!coupling=\v!subsubsubsubsubsubsubsubsubsection, + \c!default=\v!subsubsubsubsubsubsubsubsubsection, + \c!incrementnumber=\v!no] + +\defineprefixset + [\v!all] + [section-1,section-2,section-3,section-4,section-5,section-6,section-7,% + section-8,section-9,section-10,section-11,section-12] + [] + % \setuphead \setuphead diff --git a/tex/context/base/mkiv/strc-doc.lua b/tex/context/base/mkiv/strc-doc.lua index 57fff5a21..93d8db56b 100644 --- a/tex/context/base/mkiv/strc-doc.lua +++ b/tex/context/base/mkiv/strc-doc.lua @@ -129,8 +129,8 @@ sections.tobesaved = tobesaved -- -- job.register('structures.sections.collected', tobesaved, initializer) -sections.registered = sections.registered or allocate() -local registered = sections.registered +local registered = sections.registered or allocate() +sections.registered = registered storage.register("structures/sections/registered", registered, "structures.sections.registered") @@ -411,11 +411,6 @@ function sections.setentry(given) v[2](k) end end --- local n = { } --- for i=1,newdepth do --- n[i] = numbers[i] --- end --- numberdata.numbers = n numberdata.numbers = { unpack(numbers,1,newdepth) } if not numberdata.block then numberdata.block = getcurrentblock() -- also in references @@ -447,8 +442,9 @@ function sections.reportstructure() local d = status[depth] local o = concat(ownnumbers,".",1,depth) local n = (numbers and concat(numbers,".",1,min(depth,#numbers))) or 0 - local l = d.titledata.title or "" - local t = (l ~= "" and l) or d.titledata.title or "[no title]" + local t = d.titledata.title + local l = t or "" + local t = (l ~= "" and l) or t or "[no title]" local m = d.metadata.name if o and not find(o,"^%.*$") then report_structure("%s @ level %i : (%s) %s -> %s",m,depth,n,o,t) @@ -460,17 +456,24 @@ function sections.reportstructure() end end +-- function sections.setnumber(depth,n) +-- local forced, depth, new = data.forced, depth or data.depth, tonumber(n) or 0 +-- if type(n) == "string" then +-- if find(n,"^[%+%-]") then +-- forced[depth] = { "add", new } +-- else +-- forced[depth] = { "set", new } +-- end +-- else +-- forced[depth] = { "set", new } +-- end +-- end + function sections.setnumber(depth,n) - local forced, depth, new = data.forced, depth or data.depth, tonumber(n) - if type(n) == "string" then - if find(n,"^[%+%-]") then - forced[depth] = { "add", new } - else - forced[depth] = { "set", new } - end - else - forced[depth] = { "set", new } - end + data.forced[depth or data.depth] = { + type(n) == "string" and find(n,"^[%+%-]") and "add" or "set", + tonumber(n) or 0 + } end function sections.numberatdepth(depth) @@ -774,10 +777,13 @@ function sections.typesetnumber(entry,kind,...) -- kind='section','number','pref if number then local ownnumber = ownnumbers and ownnumbers[index] or "" if number > 0 or (ownnumber ~= "") then - if bb == 0 then bb = k end + if bb == 0 then + bb = k + end ee = k - else - bb, ee = 0, 0 + elseif criterium >= 0 then + bb = 0 + ee = 0 end else break @@ -1028,7 +1034,7 @@ implement { name = "namedstructureuservariable", actions = sections.userdata, implement { name = "setstructurelevel", actions = sections.setlevel, arguments = { "string", "string" } } implement { name = "getstructurelevel", actions = sections.getcurrentlevel, arguments = { "string" } } -implement { name = "setstructurenumber", actions = sections.setnumber, arguments = { "integer", "string" } } +implement { name = "setstructurenumber", actions = sections.setnumber, arguments = { "integer", "string" } } -- string as we support +- implement { name = "getstructurenumber", actions = sections.getnumber, arguments = { "integer" } } implement { name = "getsomestructurenumber", actions = sections.getnumber, arguments = { "integer", "string" } } implement { name = "getfullstructurenumber", actions = sections.fullnumber, arguments = { "integer" } } @@ -1099,6 +1105,7 @@ implement { { "segments" }, { "ownnumber" }, { "language" }, + { "criterium" }, }, }, { "userdata" }, diff --git a/tex/context/base/mkiv/strc-doc.mkiv b/tex/context/base/mkiv/strc-doc.mkiv index 5f40521fa..805525487 100644 --- a/tex/context/base/mkiv/strc-doc.mkiv +++ b/tex/context/base/mkiv/strc-doc.mkiv @@ -13,7 +13,7 @@ \writestatus{loading}{ConTeXt Structure Macros / Document Structure} -\registerctxluafile{strc-doc}{1.001} +\registerctxluafile{strc-doc}{} \unprotect diff --git a/tex/context/base/mkiv/strc-enu.mkvi b/tex/context/base/mkiv/strc-enu.mkvi index 8eff706bb..4680a3981 100644 --- a/tex/context/base/mkiv/strc-enu.mkvi +++ b/tex/context/base/mkiv/strc-enu.mkvi @@ -88,7 +88,7 @@ %\c!headcolor=, %\c!titlecolor=, \c!width=8\emwidth, - \c!distance=\zeropoint, + %\c!distance=\zeropoint, \c!distance=\emwidth, \c!titledistance=.5\emwidth, %\c!hang=, @@ -111,7 +111,6 @@ \c!expansion=\v!no, %\c!xmlsetup=, %\s!catcodes=, - % \c!way=\v!by\v!text, \c!prefix=\v!no, \c!prefixconnector=., diff --git a/tex/context/base/mkiv/strc-flt.mkvi b/tex/context/base/mkiv/strc-flt.mkvi index 3ad2e86fc..69881037e 100644 --- a/tex/context/base/mkiv/strc-flt.mkvi +++ b/tex/context/base/mkiv/strc-flt.mkvi @@ -15,7 +15,7 @@ \writestatus{loading}{ConTeXt Structure Macros / Float Numbering} -\registerctxluafile{strc-flt}{1.001} +\registerctxluafile{strc-flt}{} \unprotect @@ -97,17 +97,17 @@ \c!textcolor=, \c!align=, \c!number=\v!yes, - % \c!expansion=\v!no - % \c!prefix=\v!no, - % \c!prefixconnector=., - % \c!way=\v!by\v!chapter, - % \c!prefixsegments=2:2, - % \c!way=\@@nrway, - % \c!blockway=\@@nrblockway, - % \c!sectionnumber=\@@nrsectionnumber, - % \c!separator=\@@koseparator, - % \c!starter=\@@kostarter, - % \c!stopper=\@@kostopper, + % \c!expansion=, + % \c!prefix=, + % \c!prefixconnector=, + % \c!way=, + % \c!prefixsegments=, + % \c!way=, + % \c!blockway=, + % \c!sectionnumber=, + % \c!separator=, + % \c!starter=, + % \c!stopper=, \c!suffixseparator=, % currently rather hard coded \c!suffix=\floatcaptionsuffix, \c!distance=\emwidth, @@ -141,6 +141,9 @@ \c!spaceafter=\v!big, \c!sidespacebefore=\rootfloatparameter\c!spacebefore, \c!sidespaceafter=\rootfloatparameter\c!spaceafter, + \c!sidespaceinbetween=\rootfloatparameter\c!spacebefore, + \c!spacebeforeside=, % extra, not part of, can be used to add whitespace before text + \c!spaceafterside=, % idem \c!sidealign=\v!normal, \c!textmethod=\ifgridsnapping2\else0\fi, % 0=raw 1=safe (.99pg) 2=tight (-1pt) % THIS WILL CHANGE \c!sidemethod=\ifgridsnapping2\else1\fi, % 0=raw 1=safe (.99pg) 2=tight (-1pt) % THIS WILL CHANGE @@ -154,7 +157,7 @@ \c!outermargin=\zeropoint, % idem \c!leftmargindistance=\zeropoint, \c!rightmargindistance=\floatparameter\c!leftmargindistance, - \c!step=\v!big, % the flush side float step (big=line, medium=halfline, small=quarterline, depth=halfline with normaldepth) + \c!step=\v!small, % the flush side float step (big, medium, small : always depth) \c!ntop=2, \c!nbottom=0, \c!nlines=4, % used? @@ -165,6 +168,7 @@ %\c!bottombefore=, % e.g. \vfill %\c!bottomafter=, %\c!default=, % default location + \c!sidethreshold=.5\strutdp, % set to "old" to check with old method \c!numbering=\v!yes] %D Individial settings: @@ -341,7 +345,8 @@ \hbox{\usefloatcaptionstyleandcolor\c!headstyle\c!headcolor\thecurrentfloatnumber}% \ifnofloatcaption \else \ifemptyfloatcaption \else \doifelsenothing{\floatcaptionparameter\c!spaceinbetween} - {\scratchskip\floatcaptionparameter\c!distance\relax + {\floatcaptionparameter\c!headseparator\relax + \scratchskip\floatcaptionparameter\c!distance\relax \dotfskip\scratchskip\emergencystretch.5\scratchskip} {\blank[\floatcaptionparameter\c!spaceinbetween]}% \fi \fi @@ -358,11 +363,6 @@ \endgroup \doifsomething{\floatcaptionparameter\c!spaceafter}{\blank[\floatcaptionparameter\c!spaceafter]}} -% \newif\iftracecaptions -% -% \def\settracedcaptionbox -% {\iftracecaptions\setbox\b_strc_floats_caption\ruledhbox{\box\b_strc_floats_caption}\fi} - % \definefloat [figure-1] [figure] % \definefloat [figure-2] [figure] % \setupfloat [figure-1] [location=left,leftmargin=10mm] @@ -409,30 +409,6 @@ \fi \fi} -% The tricky part of getting float related two pass data is -% that we should fetch is early but can only save it with -% the composed float box; this determines the order: get it -% before saving it. - -% We had this: -% -% \definetwopasslist{\s!float\s!data} \newcounter\noffloatdata -% -% \let\strc_float_realpage\realpageno % used for odd/even determination, can be combined with nodelocation -% -% \def\strc_float_save_data % \expanded ... will change in mkiv -% {\doglobal\increment\noffloatdata -% \lazysavetaggedtwopassdata{\s!float\s!data}{\noffloatdata}{\noffloatpages}{\noexpand\realfolio}}% later {}{}{}{} and \getfirst... -% -% \def\strc_float_load_data % precedes save ! -% {\doglobal\increment\noffloatpages -% \findtwopassdata{\s!float\s!data}{\noffloatpages}% -% \ifconditional\twopassdatafound -% \globallet\strc_float_realpage\twopassdata -% \else -% \globallet\strc_float_realpage\realpageno % \realfolio -% \fi} - %D We can do this ... %D %D \starttyping @@ -510,13 +486,24 @@ \let\m_strc_floats_saved_userdata\empty \let\currentfloatcaption\currentfloat} +\let\askedfloatmethod \empty +\let\askedfloatoptions\empty + \def\strc_floats_reset_variables {\global\emptyfloatcaptionfalse \global\nofloatcaptionfalse - \global\nofloatnumberfalse} + \global\nofloatnumberfalse + \global\let\askedfloatmethod \empty + \global\let\askedfloatoptions\empty} % place +\let\floatlabel \empty +\let\floatcolumn \empty +\let\floatrow \empty +\let\floatlocation \empty +\let\floatlocationmethod\empty + \def\strc_floats_analyze_location {% moved here, will do more \let\floatlabel \empty @@ -538,11 +525,14 @@ \setupfloat[\c!spacebefore=\v!none,\c!spaceafter=\v!none]% \to \c_floats_every_table_float +\ifdefined\dotagregisterfloat \else \let\dotagregisterfloat\gobbletwoarguments \fi + \def\strc_floats_place_indeed[#location][#reference]#caption% {\strc_floats_reset_variables + \xdef\askedfloatoptions{#location}% \edef\floatlocation{#location}% \ifx\floatlocation\empty - \edef\floatlocation{\floatparameter\c!default}% beware of a clash between alignment locations + \edef\floatlocation{\floatparameter\c!default}% beware of a clash between alignment locations \fi \ifintable \the\c_floats_every_table_float @@ -731,6 +721,7 @@ \strc_floats_check_extra_actions \strc_floats_analyze_variables_two \strc_floats_place_packaged_boxes + \dotagregisterfloat\askedfloatoptions\askedfloatmethod \dostoptagged % tricky .... needs checking % we need to carry over the par because of side floats \global\d_page_sides_downshift \zeropoint @@ -743,6 +734,33 @@ % nicer is a bunch of states and one loop that sets those states +\newdimen\d_strc_floats_margin +\newdimen\d_strc_floats_top +\newdimen\d_strc_floats_bottom + +% \def\strc_floats_calculate_skip#target#skip% +% {\begingroup +% \edef\askedfloatskip{\rootfloatparameter#skip}% +% \ifx\askedfloatskip\empty +% \global#target\zeropoint +% \else\ifx\askedfloatskip\v!none +% \global#target\zeropoint +% \else +% \setbox\scratchbox\vbox{\whitespace\blank[\askedfloatskip]}% todo: move whitespace inside blank +% \global#target\ht\scratchbox +% \fi\fi +% \endgroup} + +\def\strc_floats_calculate_skip#target#skip% + {\begingroup + \edef\p_blank{\rootfloatparameter#skip}% + \ifx\p_blank\v!nowhite + \edef\p_blank{-\v!white}% + \fi + \prerollblank[\p_blank]% + \global#target\prerolledblank + \endgroup} + \def\strc_floats_analyze_variables_two {\ifinsidecolumns \global\setfalse\c_strc_floats_par_float @@ -751,13 +769,37 @@ {\global\settrue \c_strc_floats_par_float}% {\global\setfalse\c_strc_floats_par_float}% \fi - \global\d_page_sides_shift \zeropoint - \global\d_page_sides_maximum \zeropoint - \global\c_page_sides_method \floatparameter\c!sidemethod - \global\c_page_one_float_method \floatparameter\c!textmethod - \global\c_page_sides_align \zerocount - \global\c_strc_floats_rotation \zerocount - \strc_floats_calculate_skips + % variable initializations + \global\d_page_sides_shift \zeropoint + \global\d_page_sides_maximum \zeropoint + \global\c_page_sides_align \zerocount + \global\c_page_sides_tolerance \zerocount + \global\c_page_sides_skipmode \zerocount + \global\c_strc_floats_rotation \zerocount + \global\d_strc_floats_margin \rootfloatparameter\c!margin + \global\d_page_sides_leftshift \floatparameter \c!leftmargindistance + \global\d_page_sides_rightshift \floatparameter \c!rightmargindistance + \global\d_page_sides_topoffset \floatparameter \c!topoffset + \global\d_page_sides_bottomoffset\floatparameter \c!bottomoffset + \global\c_page_sides_method \floatparameter \c!sidemethod + \global\c_page_one_float_method \floatparameter \c!textmethod + \global\c_page_floats_n_of_top \rootfloatparameter\c!ntop + \global\c_page_floats_n_of_bottom\rootfloatparameter\c!nbottom + \ifconditional\c_strc_floats_par_float + \global\d_strc_floats_top \zeropoint + \global\d_strc_floats_bottom \zeropoint + \strc_floats_calculate_skip\d_page_sides_topskip \c!sidespacebefore + \strc_floats_calculate_skip\d_page_sides_bottomskip\c!sidespaceafter + \strc_floats_calculate_skip\d_page_sides_midskip \c!sidespaceinbetween + \strc_floats_calculate_skip\d_strc_floats_top \c!spacebeforeside + \strc_floats_calculate_skip\d_strc_floats_bottom \c!spaceafterside + \else + \global\d_page_sides_topskip \zeropoint + \global\d_page_sides_bottomskip \zeropoint + \strc_floats_calculate_skip\d_strc_floats_top \c!spacebefore + \strc_floats_calculate_skip\d_strc_floats_bottom\c!spaceafter + \fi + % keyword handling \ifconditional\c_strc_floats_par_float \processaction [\floatparameter\c!sidealign] @@ -773,14 +815,11 @@ \doifinset\v!grid \floatlocation{\global\c_page_sides_align\plusfour }% \doifinset\v!halfline\floatlocation{\global\c_page_sides_align\plusfive }% meant for 'none' \fi - \doifinset\v!high\floatlocation{\global\d_page_sides_topskip \zeropoint}% - \doifinset\v!low \floatlocation{\global\d_page_sides_bottomskip\zeropoint}% - \doifinset\v!fit \floatlocation - {\global\d_page_sides_topskip \zeropoint - \global\d_page_sides_bottomskip\zeropoint - \global\d_strc_floats_margin \zeropoint}% - \global\advance\d_page_sides_topskip \floatparameter\c!topoffset - \global\advance\d_page_sides_bottomskip\floatparameter\c!bottomoffset + \doifinset\v!high \floatlocation{\global\c_page_sides_skipmode \plusone }% + \doifinset\v!low \floatlocation{\global\c_page_sides_skipmode \plustwo }% + \doifinset\v!fit \floatlocation{\global\c_page_sides_skipmode \plusthree}% + \doifinset\v!tolerant \floatlocation{\global\c_page_sides_tolerance\plusone }% + \doifinset\v!verytolerant\floatlocation{\global\c_page_sides_tolerance\plustwo }% \else \processallactionsinset [\floatlocation]% @@ -822,14 +861,18 @@ {\setfalse\c_page_floats_center_box_global \setfalse\c_page_floats_center_box_local}} -\let\naturalfloatheight\!!zeropoint -\let\naturalfloatwidth \!!zeropoint -\let\naturalfloatdepth \!!zeropoint +\def\naturalfloatheight{\the\naturalfloatwd} +\def\naturalfloatwidth {\the\naturalfloatht} +\def\naturalfloatdepth {\the\naturalfloatdp} + +\newdimen\naturalfloatwd +\newdimen\naturalfloatht +\newdimen\naturalfloatdp \def\strc_floats_set_natural_dimensions#box% - {\xdef\naturalfloatheight{\the\ht#box}% - \xdef\naturalfloatwidth {\the\wd#box}% - \xdef\naturalfloatdepth {\the\dp#box}} + {\global\naturalfloatwd\wd#box\relax + \global\naturalfloatht\ht#box\relax + \global\naturalfloatdp\dp#box\relax} \def\doifelsemainfloatbody {\ifinsidesplitfloat @@ -1038,9 +1081,7 @@ \unexpanded\def\installfloatmovement#1#2{\setvalue{\??floatmovement#1}{#2}} \def\strc_floats_move_down#setting% - {\csname\??floatmovement - \ifcsname\??floatmovement#setting\endcsname#setting\fi - \endcsname} + {\begincsname\??floatmovement#setting\endcsname} \def\strc_floats_move_down_line#sign% {\if!!donea \else @@ -1162,34 +1203,6 @@ \unexpanded\def\placefloats {\page_otr_command_flush_floats} -\newdimen\d_strc_floats_margin -\newdimen\d_strc_floats_top -\newdimen\d_strc_floats_bottom - -\def\strc_floats_calculate_skip#target#skip% - {\edef\askedfloatskip{#skip}% - \ifx\askedfloatskip\empty - \global#target\zeropoint - \else\ifx\askedfloatskip\v!none - \global#target\zeropoint - \else - \setbox\scratchbox\vbox{\whitespace\blank[\askedfloatskip]}% todo: move whitespace inside blank - \global#target\ht\scratchbox - \fi\fi} - -\def\strc_floats_calculate_skips - {\begingroup - \strc_floats_calculate_skip\d_strc_floats_top {\rootfloatparameter\c!spacebefore }% - \strc_floats_calculate_skip\d_strc_floats_bottom {\rootfloatparameter\c!spaceafter }% - \strc_floats_calculate_skip\d_page_sides_topskip {\rootfloatparameter\c!sidespacebefore}% - \strc_floats_calculate_skip\d_page_sides_bottomskip{\rootfloatparameter\c!sidespaceafter }% - \global\d_strc_floats_margin \rootfloatparameter\c!margin - \global\d_page_sides_leftshift \floatparameter \c!leftmargindistance - \global\d_page_sides_rightshift \floatparameter \c!rightmargindistance - \global\c_page_floats_n_of_top \rootfloatparameter\c!ntop - \global\c_page_floats_n_of_bottom\rootfloatparameter\c!nbottom - \endgroup} - \unexpanded\def\betweenfloatblanko % assumes that spaceafter is present {\blank[\rootfloatparameter\c!spacebefore]} % or v!back,.... @@ -1266,7 +1279,7 @@ \hsize\floattextwidth \ignorespaces} -\def\strc_floats_stop_text_indeed +\def\strc_floats_stop_text_indeed % todo {\egroup \doifnotinset\v!tall\floatlocation {\floattextheight\ifdim\ht\floattext<\floatheight\floatheight\else\ht\floattext\fi}% @@ -1385,8 +1398,11 @@ \newdimen\d_strc_float_temp_height \newdimen\d_strc_float_temp_width -\def\captionminwidth {15\bodyfontsize} -\def\captionovershoot{2\emwidth} +\newconditional\c_floats_adapt_to_caption_width +\newconditional\c_floats_store_minimal_package + +\def\captionminwidth {15\bodyfontsize} % can become parameter (but what name) +\def\captionovershoot{2\emwidth} % can become parameter (but what name) \let\strc_floats_mark_pag_as_free\relax @@ -1426,7 +1442,9 @@ \or % manual \fi - \ifcase\c_strc_floats_rotation + \ifconditional\c_floats_store_minimal_package + % nothing + \else\ifcase\c_strc_floats_rotation \doifnotinset\v!margin\floatlocation % brr, really needed! see wm {\postcenterfloatbox\d_strc_floats_content \strc_floats_mark_pag_as_free}% @@ -1435,7 +1453,7 @@ \global\setbox\floatbox\vpack {\rotate[\c!rotation=\number\c_strc_floats_rotation]{\box\floatbox}}% \strc_floats_mark_pag_as_free - \fi + \fi\fi \egroup} \def\strc_floats_prepare_no_caption @@ -1544,6 +1562,10 @@ \fi \edef\captionhsize{\the\wd\b_strc_floats_content}% \scratchwidth\floatcaptionparameter\c!maxwidth\relax + \ifconditional\c_floats_adapt_to_caption_width + \let\captionminwidth \!!zeropoint + \let\captionovershoot\!!zeropoint + \fi \ifdim\captionhsize>\scratchwidth % float is wider than \hsize \setbox\b_strc_floats_caption\vbox @@ -1571,6 +1593,9 @@ \ifdim\captionhsize<\captionminwidth\relax \scratchdimen\captionminwidth % float smaller than min width \edef\captionhsize{\the\scratchdimen}% +% \ifconditional\c_floats_adapt_to_caption_width +% \setbox\b_strc_floats_content\hpack to \captionhsize{\hss\box\b_strc_floats_content\hss}% +% \fi \fi \setbox\scratchbox\vbox % test with overshoot {\settrialtypesetting @@ -1821,7 +1846,7 @@ \strc_floats_align_content{\box\b_strc_floats_content}% \fi}% \getnoflines{\dimexpr\htdp\scratchbox-10\scaledpoint\relax}% get rid of inaccuracy - \vbox to \noflines\lineheight{\unvbox\scratchbox}} + \vbox to \noflines\lineheight{\unvbox\scratchbox}} % \vpack ? \def\strc_floats_build_box_bottom_stack_grid {\dp\b_strc_floats_caption\strutdepth @@ -1838,7 +1863,7 @@ \strc_floats_locate_text_float{\box\b_strc_floats_caption}% \fi}% \getnoflines{\dimexpr\htdp\scratchbox-10\scaledpoint\relax}% get rid of inaccuracy - \vbox to \noflines\lineheight{\unvbox\scratchbox}} + \vbox to \noflines\lineheight{\unvbox\scratchbox}} % \vpack ? \def\strc_floats_build_box_top_stack_stretch {\dp\b_strc_floats_caption\strutdepth @@ -1903,14 +1928,52 @@ {\global\setbox\floatbox\vbox % pack ? probably not {\strc_floats_set_local_hsize \forgetall - \let\floatcaptionarrangement\s!default - \processcommacommand[\floatcaptionparameter\c!location]\strc_floats_build_box_step - \ifcsname\??floatbuilder\floatcaptionarrangement\endcsname - \lastnamedcs + \ifconditional\c_floats_store_minimal_package + \strc_floats_build_box_separate_make \else - \strc_floats_build_box_default + \let\floatcaptionarrangement\s!default + \processcommacommand[\floatcaptionparameter\c!location]\strc_floats_build_box_step + \ifcsname\??floatbuilder\floatcaptionarrangement\endcsname + \lastnamedcs + \else + \strc_floats_build_box_default + \fi \fi}} +% special purpose: used in floatcombinations + +\newbox\b_strc_floats_separate_content +\newbox\b_strc_floats_separate_caption + +\def\strc_floats_build_box_separate_set + {\settrue\c_floats_adapt_to_caption_width + \settrue\c_floats_store_minimal_package} + +\def\strc_floats_build_box_separate_make + {\offinterlineskip + \vpack to \onepoint{\box\b_strc_floats_content}\break + \vpack to \onepoint{\box\b_strc_floats_caption}} + +\def\strc_floats_build_box_separate_split#1% + {\setbox\scratchbox\vbox{% + \setbox\scratchbox\vpack{#1}% + \unvbox\scratchbox\relax + \setbox\scratchbox\lastbox + %\doloop{% + \unvbox\scratchbox + \setbox\scratchbox\lastbox + % \ifdim\ht\scratchbox=2\onepoint + \unvbox\scratchbox + \setbox\scratchbox\lastbox + % \exitloop + % \fi}% + \splittopskip\zeropoint + \global\setbox\b_strc_floats_separate_content\vsplit\scratchbox to \onepoint + \global\setbox\b_strc_floats_separate_caption\vsplit\scratchbox to \onepoint + \global\setbox\b_strc_floats_separate_content\vpack{\unvbox\b_strc_floats_separate_content\setbox0\lastbox\unvbox0}% + \global\setbox\b_strc_floats_separate_caption\tpack{\unvbox\b_strc_floats_separate_caption\setbox0\lastbox\unvbox0}% + }} + % \def\strc_floats_build_box_step#1% % {\doifdefined{\??floatbuilder#1}{\def\floatcaptionarrangement{#1}\quitcommalist}} @@ -2000,14 +2063,14 @@ \forgetall \postponenotes \dontcomplain - \setbox\b_strc_floats_content\vbox{\borderedfloatbox}% + \setbox\b_strc_floats_content\vbox{\borderedfloatbox}% \vpack >? %\page_backgrounds_add_local_to_box\b_strc_floats_content \ifnofloatcaption \global\setbox\floatbox\vpack{\box\b_strc_floats_content}% \else \strc_floats_check_caption_content \strc_floats_prepare_side_caption - \setbox\b_strc_floats_caption\hbox{\floatcaptionparameter\c!command{\box\b_strc_floats_caption}}% + \setbox\b_strc_floats_caption\hbox{\floatcaptionparameter\c!command{\box\b_strc_floats_caption}}% \hpack ? \moveboxontogrid\b_strc_floats_caption{\floatcaptionparameter\c!grid}\d_strc_floats_caption_height %\page_backgrounds_add_local_to_box\b_strc_floats_caption \strc_floats_build_side_box @@ -2116,13 +2179,17 @@ \fi \strc_floats_set_local_dimensions \global\advance\totalnoffloats\plusone - \setbox\floatbox\hpack{\strc_float_save_data\box\floatbox}% still needed? we will do renumbering differently + \ifconditional\c_floats_store_minimal_package \else + \setbox\floatbox\hpack{\strc_float_save_data\box\floatbox}% still needed? we will do renumbering differently + \fi \global\floatheight\htdp\floatbox \global\floatwidth\wd\floatbox - \doifnotinset\v!margin\floatlocation % gaat namelijk nog fout - {\setbox\floatbox\vpack - {\parindent\zeropoint - \box\floatbox}}% + \ifconditional\c_floats_store_minimal_package \else + \doifnotinset\v!margin\floatlocation % gaat namelijk nog fout + {\setbox\floatbox\vpack + {\parindent\zeropoint + \box\floatbox}}% + \fi \wd\floatbox\floatwidth \ifdim\dimexpr\floatheight+\lineheight\relax<\textheight \else \global\floatheight\dimexpr\textheight-\lineheight\relax @@ -2186,6 +2253,11 @@ \ifx\forcedfloatmethod\empty \else \let\floatmethod\forcedfloatmethod \fi +\let\askedfloatmethod\floatmethod +\ifexporting \ifx\askedfloatmethod\v!here \else + \showmessage\m!floatblocks{15}{\askedfloatmethod,\v!here}% + \let\floatlocation\v!here +\fi \fi % [] will go \edef\floatlocationmethod{\floatmethod,\floatlocation}% \csname\??floatmethods\currentoutputroutine:\floatmethod\endcsname diff --git a/tex/context/base/mkiv/strc-ini.mkvi b/tex/context/base/mkiv/strc-ini.mkvi index ad83cbc58..56621b6e6 100644 --- a/tex/context/base/mkiv/strc-ini.mkvi +++ b/tex/context/base/mkiv/strc-ini.mkvi @@ -13,7 +13,7 @@ \writestatus{loading}{ConTeXt Structure Macros / Initialization & Helpers} -\registerctxluafile{strc-ini}{1.001} +\registerctxluafile{strc-ini}{} \unprotect diff --git a/tex/context/base/mkiv/strc-itm.mkvi b/tex/context/base/mkiv/strc-itm.mkvi index a28193415..0bea62de8 100644 --- a/tex/context/base/mkiv/strc-itm.mkvi +++ b/tex/context/base/mkiv/strc-itm.mkvi @@ -13,7 +13,7 @@ \writestatus{loading}{ConTeXt Structure Macros / Itemgroups} -\registerctxluafile{strc-itm}{1.001} +\registerctxluafile{strc-itm}{} %D As we analyze/register widths and such we could as well push and pop the %D numbers at the \LUA\ end (which saves a few calls). @@ -410,8 +410,14 @@ \settrue\c_strc_itemgroups_pack \fi} +\def\strc_itemgroups_process_set_option_unpack + {\ifcase\c_strc_itemgroups_nesting\else + \setfalse\c_strc_itemgroups_pack + \fi} + \setvalue{\??itemgroupkeyword\!!zerocount }{} % ignore 0 \setvalue{\??itemgroupkeyword\v!packed }{\strc_itemgroups_process_set_option_pack} +\setvalue{\??itemgroupkeyword\v!unpacked }{\strc_itemgroups_process_set_option_unpack} \setvalue{\??itemgroupkeyword\v!intro }{\settrue\c_strc_itemgroups_intro} % here? not set to false \setvalue{\??itemgroupkeyword\v!autointro }{\settrue\c_strc_itemgroups_auto_intro} \setvalue{\??itemgroupkeyword\v!broad }{\ifx\itemgroupfirst\empty @@ -442,6 +448,7 @@ \setvalue{\??itemgroupkeyword\v!serried }{\edef\itemgroupfirst{-\ifx\itemgroupfirst\empty1\else\itemgroupfirst\fi}% \letitemgroupparameter\c!factor\itemgroupfirst} \setvalue{\??itemgroupkeyword\v!stopper }{\letitemgroupparameter\c!placestopper\v!yes} % keep {} +\setvalue{\??itemgroupkeyword\v!nostopper }{\letitemgroupparameter\c!placestopper\v!no} % keep {} \setvalue{\??itemgroupkeyword\v!repeat }{\settrue\c_strc_itemgroups_repeat} \setvalue{\??itemgroupkeyword\v!norepeat }{\setfalse\c_strc_itemgroups_repeat} \setvalue{\??itemgroupkeyword\v!reverse }{\settrue\c_strc_itemgroups_reverse} @@ -1125,19 +1132,21 @@ \strc_itemgroups_margin_symbol \let\strc_itemgroups_margin_symbol\relax \dostarttagged\t!itemcontent\empty - \strut + \begstrut % \strut \nobreak % else problems with intext items \seteffectivehsize % NEW ! \hskip\d_strc_itemgroups_signal % concat \itemgroupparameter\c!command} \unexpanded\def\stopitemgroupitem - {\ifconditional\c_strc_itemgroups_text + {\ifhmode + \endstrut % new per 2017-12-15 + \fi + \ifconditional\c_strc_itemgroups_text % nothing \else \endgraf \fi} - \unexpanded\def\startitemgrouphead {\dosingleempty\strc_itemgroups_start_head} @@ -1212,7 +1221,9 @@ \dotagsetitem\s!symbol} \unexpanded\def\strc_itemgroups_start_dummy - {\strc_itemgroups_start_symbol\strut\strut} % two ? + {\strc_itemgroups_start_symbol + %\strut\strut} % two ? + \begstrut} \unexpanded\def\strc_itemgroups_start_subitem {\settrue\c_strc_itemgroups_sub diff --git a/tex/context/base/mkiv/strc-lev.mkvi b/tex/context/base/mkiv/strc-lev.mkvi index 6e08e7c07..b8b633c32 100644 --- a/tex/context/base/mkiv/strc-lev.mkvi +++ b/tex/context/base/mkiv/strc-lev.mkvi @@ -19,7 +19,7 @@ %D it as core functionality. For the moment this an experiment that %D Alan and I conduct so it might evolve. -\registerctxluafile{strc-lev}{1.001} +\registerctxluafile{strc-lev}{} \unprotect diff --git a/tex/context/base/mkiv/strc-lst.lua b/tex/context/base/mkiv/strc-lst.lua index be8e07112..a235fac75 100644 --- a/tex/context/base/mkiv/strc-lst.lua +++ b/tex/context/base/mkiv/strc-lst.lua @@ -15,7 +15,7 @@ if not modules then modules = { } end modules ['strc-lst'] = { -- -- move more to commands -local tonumber, type = tonumber, type +local tonumber, type, next = tonumber, type, next local concat, insert, remove, sort = table.concat, table.insert, table.remove, table.sort local lpegmatch = lpeg.match diff --git a/tex/context/base/mkiv/strc-lst.mkvi b/tex/context/base/mkiv/strc-lst.mkvi index 08e56a700..153d879b7 100644 --- a/tex/context/base/mkiv/strc-lst.mkvi +++ b/tex/context/base/mkiv/strc-lst.mkvi @@ -13,7 +13,7 @@ \writestatus{loading}{ConTeXt Structure Macros / Lists} -\registerctxluafile{strc-lst}{1.001} +\registerctxluafile{strc-lst}{} % clean up in progress ... % @@ -144,7 +144,8 @@ \def\strc_lists_inject_nop[#dummya][#dummyb]% {\endgroup} -\unexpanded\def\strc_lists_inject_enhance#listindex#internal% +% \unexpanded +\def\strc_lists_inject_enhance#listindex#internal% {\normalexpanded{\ctxlatecommand{enhancelist(\number#listindex)}}} \unexpanded\def\strc_lists_inject_yes[#settings][#userdata]% can be used directly @@ -740,7 +741,7 @@ % {\hskip.25\emwidth\relax} \setuplistalternative - [\c!command=\strictlistparameter\c!command, + [\c!command=\directlistparameter\c!command, \c!symbol=.] \unexpanded\def\currentlistfiller @@ -1452,40 +1453,7 @@ \strc_lists_interaction_check_nop \fi} -% \def\strc_lists_interaction_check_yes -% {\edef\p_interaction_forward{\listparameter\c!interaction}% -% \ifcsname\??listinteractions\p_interaction_forward\endcsname -% \expandafter\let\expandafter\p_interaction_forward\csname\??listinteractions\p_interaction_forward\endcsname -% \strc_references_get_simple_reference{internal(\currentlistentrylocation)}% -% \a_strc_lists_reference\currentreferenceattribute -% \else -% \a_strc_lists_reference\attributeunsetvalue -% \fi -% \ifnum\a_strc_lists_reference=\attributeunsetvalue -% \let\strc_lists_get_reference_attribute\gobbleoneargument -% \let\strc_lists_set_reference_attribute\gobbleoneargument -% \let\strc_lists_set_style_color \strc_lists_set_style_color_normal -% \else -% \let\strc_lists_get_reference_attribute\strc_lists_get_reference_attribute_indeed -% \let\strc_lists_set_reference_attribute\strc_lists_set_reference_attribute_indeed -% \let\strc_lists_set_style_color \strc_lists_set_style_color_special -% \fi -% \edef\p_interaction_backward{\namedheadparameter\currentlist\c!interaction}% \namedheadparameter ! -% \ifx\p_interaction_backward\v!list -% \strc_references_set_simple_reference{*\currentlistentrylocation}% -% \a_strc_lists_destination\currentdestinationattribute -% \else -% \a_strc_lists_destination\attributeunsetvalue -% \fi -% \ifnum\a_strc_lists_destination=\attributeunsetvalue -% \let\strc_lists_get_destination_attribute\empty -% \let\strc_lists_set_destination_attribute\empty -% \else -% \let\strc_lists_get_destination_attribute\strc_lists_get_destination_attribute_indeed -% \let\strc_lists_set_destination_attribute\strc_lists_set_destination_attribute_indeed -% \fi} - -\def\strc_lists_interaction_check_yes +\def\strc_lists_interaction_check_yes_yes {\edef\p_interaction_forward{\listparameter\c!interaction}% \ifcsname\??listinteractions\p_interaction_forward\endcsname %\expandafter\let\expandafter\p_interaction_forward\csname\??listinteractions\p_interaction_forward\endcsname @@ -1496,13 +1464,13 @@ \a_strc_lists_reference\attributeunsetvalue \fi \ifnum\a_strc_lists_reference=\attributeunsetvalue - \let\strc_lists_get_reference_attribute\gobbleoneargument - \let\strc_lists_set_reference_attribute\gobbleoneargument - \let\strc_lists_set_style_color \strc_lists_set_style_color_normal + \let\strc_lists_get_reference_attribute\gobbleoneargument + \let\strc_lists_set_reference_attribute\gobbleoneargument + \let\strc_lists_set_style_color \strc_lists_set_style_color_normal \else - \let\strc_lists_get_reference_attribute\strc_lists_get_reference_attribute_indeed - \let\strc_lists_set_reference_attribute\strc_lists_set_reference_attribute_indeed - \let\strc_lists_set_style_color \strc_lists_set_style_color_special + \let\strc_lists_get_reference_attribute\strc_lists_get_reference_attribute_indeed + \let\strc_lists_set_reference_attribute\strc_lists_set_reference_attribute_indeed + \let\strc_lists_set_style_color \strc_lists_set_style_color_special \fi \edef\p_interaction_backward{\namedheadparameter\currentlist\c!interaction}% \namedheadparameter ! \ifx\p_interaction_backward\v!list @@ -1512,13 +1480,31 @@ \a_strc_lists_destination\attributeunsetvalue \fi \ifnum\a_strc_lists_destination=\attributeunsetvalue - \let\strc_lists_get_destination_attribute\empty - \let\strc_lists_set_destination_attribute\empty + \let\strc_lists_get_destination_attribute\empty + \let\strc_lists_set_destination_attribute\empty \else - \let\strc_lists_get_destination_attribute\strc_lists_get_destination_attribute_indeed - \let\strc_lists_set_destination_attribute\strc_lists_set_destination_attribute_indeed + \let\strc_lists_get_destination_attribute\strc_lists_get_destination_attribute_indeed + \let\strc_lists_set_destination_attribute\strc_lists_set_destination_attribute_indeed \fi} +\def\strc_lists_interaction_check_yes_nop + {\a_strc_lists_reference \attributeunsetvalue + \a_strc_lists_destination\attributeunsetvalue + \let\strc_lists_get_reference_attribute\gobbleoneargument + \let\strc_lists_set_reference_attribute\gobbleoneargument + \let\strc_lists_get_destination_attribute\empty + \let\strc_lists_set_destination_attribute\empty + \let\strc_lists_set_style_color\strc_lists_set_style_color_normal} + +\def\strc_lists_interaction_check_yes + {\ifx\currentlistentrylocation\empty + \strc_lists_interaction_check_yes_nop + \else\ifnum\currentlistentrylocation=\zerocount + \strc_lists_interaction_check_yes_nop + \else + \strc_lists_interaction_check_yes_yes + \fi\fi} + \def\strc_lists_interaction_check_nop {\let\strc_lists_get_reference_attribute \gobbleoneargument \let\strc_lists_set_reference_attribute \gobbleoneargument diff --git a/tex/context/base/mkiv/strc-mar.lua b/tex/context/base/mkiv/strc-mar.lua index 624972af4..80fcf126a 100644 --- a/tex/context/base/mkiv/strc-mar.lua +++ b/tex/context/base/mkiv/strc-mar.lua @@ -24,8 +24,6 @@ local setmetatableindex = table.setmetatableindex local nuts = nodes.nuts local tonut = nuts.tonut -local getfield = nuts.getfield -local setfield = nuts.setfield local getid = nuts.getid local getlist = nuts.getlist local getattr = nuts.getattr diff --git a/tex/context/base/mkiv/strc-mar.mkiv b/tex/context/base/mkiv/strc-mar.mkiv index 4e8df5f5d..df5cae692 100644 --- a/tex/context/base/mkiv/strc-mar.mkiv +++ b/tex/context/base/mkiv/strc-mar.mkiv @@ -13,7 +13,7 @@ \writestatus{loading}{ConTeXt Structure Macros / Markings} -\registerctxluafile{strc-mar}{1.001} +\registerctxluafile{strc-mar}{} \unprotect diff --git a/tex/context/base/mkiv/strc-mat.mkiv b/tex/context/base/mkiv/strc-mat.mkiv index 4308666f3..775d2aca1 100644 --- a/tex/context/base/mkiv/strc-mat.mkiv +++ b/tex/context/base/mkiv/strc-mat.mkiv @@ -14,7 +14,7 @@ \writestatus{loading}{ConTeXt Structure Macros / Math Numbering} -\registerctxluafile{strc-mat}{1.001} +\registerctxluafile{strc-mat}{} % -- we have potential for captions % -- this module will use the commandhandler @@ -46,6 +46,7 @@ \c!indentnext=\v!no, \c!alternative=\s!default, \c!strut=\v!no, + \c!numberstrut=\v!yes, % \v!no \v!yes \v!always \c!distance=2\emwidth] \setupformulaframed @@ -236,11 +237,14 @@ \global\setfalse\c_strc_formulas_inside_place_sub \to \everyresetformulas +\def\strc_formulas_place_number_noneed + {\doif{\formulaparameter\c!numberstrut}\v!always\strut} + \def\strc_formulas_place_numbering % place formula {\settrue\c_strc_formulas_handle_number \strc_formulas_check_reference\c_strc_formulas_place_number_mode\currentplaceformulareference \ifnum\c_strc_formulas_place_number_mode=\plustwo - \glet\strc_formulas_place_number\relax + \glet\strc_formulas_place_number\strc_formulas_place_number_noneed \else \glet\strc_formulas_place_number\strc_formulas_place_number_indeed \fi @@ -281,7 +285,12 @@ \begingroup \useformulastyleandcolor\c!numberstyle\c!numbercolor \formulaparameter\c!numbercommand - {\strut + {\edef\p_strut{\formulaparameter\c!numberstrut}% + \ifx\p_strut\v!always + \strut + \else\ifx\p_strut\v!yes + \strut + \fi\fi \formulaparameter\c!left \namedtaggedlabeltexts \t!formulalabel \v!formula @@ -295,8 +304,14 @@ \endgroup} \unexpanded\def\strc_formulas_place_current_number - {\strc_formulas_handle_current_references - \labeltexts\currentformula{\convertedcounter[\v!formula][]}} + {\ifx\namedformulaentry\empty + \strc_formulas_handle_current_references + \labeltexts\currentformula{\convertedcounter[\v!formula][]}% + \else + \expandafter % hm, the next one reset \namedformulaentry + \strc_formulas_handle_current_references + \namedformulaentry + \fi} \def\theformuladestinationattribute#1% {\iflocation\ifx#1\relax\else\ifx#1\empty\else @@ -395,8 +410,10 @@ % needs checking ... too many: \def\strc_formulas_handle_numbering_indeed - {\strc_counters_increment\v!formula - \doiftext\currentplaceformulasuffix{\strc_counters_setown_sub\v!formula\plustwo\currentplaceformulasuffix}% + {\ifx\namedformulaentry\empty + \strc_counters_increment\v!formula + \doiftext\currentplaceformulasuffix{\strc_counters_setown_sub\v!formula\plustwo\currentplaceformulasuffix}% + \fi \placecurrentformulanumber} \def\strc_formulas_handle_numbering @@ -546,8 +563,10 @@ \newconstant\c_strc_formulas_mode % this will go away \newconstant\c_strc_formulas_space_model +\newconstant\c_strc_math_vertical % experiment + \c_strc_formulas_mode \plustwo % 0=native 1=simple (old) 2=align (new) -\c_strc_formulas_space_model\plusthree % replaces \plusone +\c_strc_formulas_space_model\plusthree % replaces \plusone, we might use \plusfour in the future \newconditional\c_strc_formulas_tight @@ -622,35 +641,82 @@ \directvspacing\p_spaceafter \fi} -\def\strc_math_obey_depth - {\ifvmode\ifdim\prevdepth<\zeropoint\else\ifdim\prevdepth<\strutdp - % maybe add a tracing option here - \ifgridsnapping - \directvspacing\v!depth - \else - \kern\dimexpr\strutdp-\prevdepth\relax - \prevdepth\strutdp - \fi - \fi\fi\fi} - \setvalue{\??mathdisplayspacemodel\v!before:3}% {% not ok, try \stopformula\par\startformula vs \stopformula\startformula - \ifdim\lastskip>\zeropoint - % bah - \else - \strc_math_obey_depth % somehow \fakenextstrutline doesn't work here + \let\m_spacebefore\empty + \ifvmode + \ifdim\lastskip>\zeropoint\else + \ifdim\prevdepth<\zeropoint\else + \ifdim\prevdepth<\strutdp + % maybe add a tracing option here + \ifgridsnapping + \let\m_spacebefore\v!depth + \else + \edef\m_spacebefore{\the\dimexpr\strutdp-\prevdepth\relax}% + \fi + \fi + \fi + \fi \nointerlineskip \fi - \ifx\p_spacebefore\v!none + \ifx\m_spacebefore\empty + \ifx\p_spacebefore\v!none + % nothing + \else\ifx\p_spacebefore\empty + \directvspacing\currentvspacing + \else + \directvspacing{\p_spacebefore,\the\scratchdimen}% + \fi\fi + \else + \ifx\p_spacebefore\v!none + \directvspacing{\m_spacebefore}% + \else\ifx\p_spacebefore\empty + \directvspacing{\m_spacebefore,\currentvspacing}% + \else + \directvspacing{\m_spacebefore,\p_spacebefore}% + \fi\fi + \fi} + +\setvalue{\??mathdisplayspacemodel\v!after:3}% + {\prevdepth\strutdp % \directvspacing\v!depth + \ifx\p_spaceafter\v!none % nothing \else\ifx\p_spaceafter\empty \directvspacing\currentvspacing \else - \directvspacing\p_spacebefore + \directvspacing\p_spaceafter \fi\fi} -\setvalue{\??mathdisplayspacemodel\v!after:3}% - {\prevdepth\strutdp % \directvspacing\v!depth +\newconditional\c_math_model_four_indeed + +\setvalue{\??mathdisplayspacemodel\v!before:4}% + {% not ok, try \stopformula\par\startformula vs \stopformula\startformula + \ifvmode + \ifinner + \csname\??mathdisplayspacemodel\v!before:3\endcsname + \else + \settrue\c_math_model_four_indeed + \forcestrutdepth + \nointerlineskip + \ifx\p_spacebefore\v!none + % nothing + \else\ifx\p_spacebefore\empty + \directvspacing\currentvspacing + \else + \directvspacing{\p_spacebefore,\the\scratchdimen}% + \fi\fi + \fi + \else + \csname\??mathdisplayspacemodel\v!before:3\endcsname + \fi} + +\setvalue{\??mathdisplayspacemodel\v!after:4}% + {\ifconditional\c_math_model_four_indeed + \setfalse\c_math_model_four_indeed + \forcestrutdepth + \else + \prevdepth\strutdp % \directvspacing\v!depth + \fi \ifx\p_spaceafter\v!none % nothing \else\ifx\p_spaceafter\empty @@ -659,6 +725,11 @@ \directvspacing\p_spaceafter \fi\fi} +\unexpanded\def\setdisplaymathspacemodel[#1]% + {\ifcsname\??mathdisplayspacemodel\v!before:\number#1\endcsname + \c_strc_formulas_space_model#1\relax + \fi} + % \newtoks\everybeforedisplay % \appendtoks\page_sides_check_floats_indeed\to\everybeforedisplay @@ -730,6 +801,9 @@ {\d_strc_formulas_display_skip_left \zeropoint \d_strc_formulas_display_skip_right\zeropoint} +\setvalue{\??formulaoption\v!depth}% + {\c_strc_formulas_space_model\plusfour} + \setvalue{\??formulaoption\v!line}% {\ifgridsnapping \setformulaparameter\c!grid{\v!math:\v!line}% @@ -750,12 +824,64 @@ \setformulaparameter\c!grid{\v!math:-\v!halfline}% \fi} +% when we have 1.0.6 we wil use \mathpenaltiesmode +% +% \prebinoppenalty -100 +% \prerelpenalty -100 + +\def\strc_math_set_split + {\edef\p_split{\formulaparameter\c!split}% + \ifx\p_split\v!yes + \global\c_strc_math_vertical\plusone + \else\ifx\p_split\v!page + \global\c_strc_math_vertical\plustwo + \else + \global\c_strc_math_vertical\zerocount + \fi\fi + \ifcase\c_strc_math_vertical + % \mathpenaltiesmode \zerocount + \clf_setmathpenalties\zerocount + \clf_resetmathhang + \else + % \mathpenaltiesmode \plusone + \clf_setmathpenalties\plusone + \edef\p_hang{\formulaparameter\c!hang}% + \ifx\p_hang\v!none + \global\setfalse\c_strc_math_indent + \clf_resetmathhang + \else + \global\settrue\c_strc_math_indent + \clf_setmathhang {% + method {\p_hang}% + distance \formulaparameter\c!distance + }% + \fi + \fi} + +\setupformula + [\c!split=\v!no, + \c!distance=\zeropoint, + %\c!interlinespace=1.5\lineheight, + \c!interlinespace=, + \c!hang=\v!none] + +% for the moment (when testing) we use a penalty 1 + +\unexpanded\def\strc_math_align_here{\ifmmode\penalty\plusone\fi}% +\unexpanded\def\strc_math_break_here{\ifmmode\hfill\break \fi}% + +\appendtoks + \let\alignhere\strc_math_align_here + \let\breakhere\strc_math_break_here +\to \everymathematics + \unexpanded\def\strc_formulas_start_formula_indeed[#1][#2]% setting leftskip adaption is slow ! {\ifhmode \par \fi \bgroup % HERE \def\currentformula{#1}% + \strc_math_set_split \dostarttaggedchained\t!formula\currentformula\??formula \setfalse\c_strc_formulas_tight \d_strc_formulas_display_skip_left \leftskip diff --git a/tex/context/base/mkiv/strc-not.mkvi b/tex/context/base/mkiv/strc-not.mkvi index db27cb5af..8952f0e9c 100644 --- a/tex/context/base/mkiv/strc-not.mkvi +++ b/tex/context/base/mkiv/strc-not.mkvi @@ -13,7 +13,7 @@ \writestatus{loading}{ConTeXt Structure Macros / Note Handling} -\registerctxluafile{strc-not}{1.001} +\registerctxluafile{strc-not}{} \unprotect @@ -1381,23 +1381,30 @@ \penalty\zerocount % otherwise no split in columns, maybe just always (tex just adds it to accumulated) \fi} - \appendtoks \strc_notes_set_penalties - \forgetall + \forgetall % again \strc_notes_set_bodyfont \redoconvertfont % to undo \undo calls in in headings etc \splittopskip\strutht % not actually needed here \splitmaxdepth\strutdp % not actually needed here - % brrr -% \leftmargindistance \noteparameter\c!margindistance -% \rightmargindistance\leftmargindistance -% \ifnum\noteparameter\c!n=\zerocount % no ifcase new 31-07-99 ; always ? -% \doifnotinset{\noteparameter\c!width}{\v!fit,\v!broad}\setnotehsize % ? -% \fi + % not: +% \leftmargindistance \noteparameter\c!margindistance +% \rightmargindistance\leftmargindistance +% \ifnum\noteparameter\c!n=\zerocount % no ifcase new 31-07-99 ; always ? +% \doifnotinset{\noteparameter\c!width}{\v!fit,\v!broad}\setnotehsize % ? +% \fi + % \to \everyinsidenoteinsert -\appendtoks % only needed when columns +% maybe but better use [scope=local] here +% +% \appendtoks +% \setfalse\inhibitmargindata +% \to \everyinsidenoteinsert + +\appendtoks + % only needed when columns (could be three \set...) \setsimplecolumnshsize[\c!distance=\noteparameter\c!columndistance,\c!n=\noteparameter\c!n,\c!width=\noteparameter\c!width]% \to \everyinsidenoteinsert @@ -1550,11 +1557,27 @@ \let\flushnotes\relax +\unexpanded\def\startpostponingnotes % experimental, page-mix + {\ifconditional\postponingnotes\else + \global\settrue\postponingnotes + %\global\let\flushnotes\doflushnotes + \clf_postponenotes + \fi} + +\unexpanded\def\stoppostponingnotes % experimental, page-mix + {\doflushnotes} + \unexpanded\def\doflushnotes {\ifconditional\postponingnotes \begingroup \let\flushnotes \relax \let\postponenotes\relax + \ifconditional\postponednote + \ifhmode + % needed for tagging ... otherwise we get some weird node free error + \signalcharacter + \fi + \fi \clf_flushpostponednotes% this also resets the states ! \global\setfalse\postponednote \global\setfalse\postponingnotes diff --git a/tex/context/base/mkiv/strc-num.lua b/tex/context/base/mkiv/strc-num.lua index 98db1b42d..e1a133f4a 100644 --- a/tex/context/base/mkiv/strc-num.lua +++ b/tex/context/base/mkiv/strc-num.lua @@ -7,7 +7,7 @@ if not modules then modules = { } end modules ['strc-num'] = { } local format = string.format -local next, type = next, type +local next, type, tonumber = next, type, tonumber local min, max = math.min, math.max local insert, remove, copy = table.insert, table.remove, table.copy local texsetcount = tex.setcount @@ -15,6 +15,8 @@ local texsetcount = tex.setcount -- Counters are managed here. They can have multiple levels which makes it easier to synchronize -- them. Synchronization is sort of special anyway, as it relates to document structuring. +local context = context + local allocate = utilities.storage.allocate local setmetatableindex = table.setmetatableindex local setmetatablecall = table.setmetatablecall diff --git a/tex/context/base/mkiv/strc-num.mkiv b/tex/context/base/mkiv/strc-num.mkiv index 4b222801a..be35e7671 100644 --- a/tex/context/base/mkiv/strc-num.mkiv +++ b/tex/context/base/mkiv/strc-num.mkiv @@ -13,7 +13,7 @@ \writestatus{loading}{ConTeXt Structure Macros / Basic Numbering} -\registerctxluafile{strc-num}{1.001} +\registerctxluafile{strc-num}{} \unprotect diff --git a/tex/context/base/mkiv/strc-pag.mkiv b/tex/context/base/mkiv/strc-pag.mkiv index 21758d671..d56f0de54 100644 --- a/tex/context/base/mkiv/strc-pag.mkiv +++ b/tex/context/base/mkiv/strc-pag.mkiv @@ -13,7 +13,7 @@ \writestatus{loading}{ConTeXt Structure Macros / Pagenumbering} -\registerctxluafile{strc-pag}{1.001} +\registerctxluafile{strc-pag}{} \unprotect diff --git a/tex/context/base/mkiv/strc-ref.lua b/tex/context/base/mkiv/strc-ref.lua index a9a7c7121..73f1ca886 100644 --- a/tex/context/base/mkiv/strc-ref.lua +++ b/tex/context/base/mkiv/strc-ref.lua @@ -16,7 +16,7 @@ if not modules then modules = { } end modules ['strc-ref'] = { local format, find, gmatch, match, strip = string.format, string.find, string.gmatch, string.match, string.strip local floor = math.floor -local rawget, tonumber, type = rawget, tonumber, type +local rawget, tonumber, type, next = rawget, tonumber, type, next local lpegmatch = lpeg.match local insert, remove, copytable = table.insert, table.remove, table.copy local formatters = string.formatters @@ -37,10 +37,10 @@ local check_duplicates = true directives.register("structures.referencing.checkduplicates", function(v) check_duplicates = v end) local report_references = logs.reporter("references") -local report_unknown = logs.reporter("references","unknown") local report_identifying = logs.reporter("references","identifying") local report_importing = logs.reporter("references","importing") local report_empty = logs.reporter("references","empty") +local report = report_references local variables = interfaces.variables local v_page = variables.page @@ -59,11 +59,7 @@ local texconditionals = tex.conditionals local productcomponent = resolvers.jobs.productcomponent local justacomponent = resolvers.jobs.justacomponent -local logsnewline = logs.newline -local logspushtarget = logs.pushtarget -local logspoptarget = logs.poptarget - ------ settings_to_array = utilities.parsers.settings_to_array +local settings_to_array = utilities.parsers.settings_to_array local settings_to_table = utilities.parsers.settings_to_array_obey_fences local process_settings = utilities.parsers.process_stripped_settings local unsetvalue = attributes.unsetvalue @@ -123,6 +119,8 @@ local currentreference = nil local txtcatcodes = catcodes.numbers.txtcatcodes -- or just use "txtcatcodes" +local context = context + local ctx_pushcatcodes = context.pushcatcodes local ctx_popcatcodes = context.popcatcodes local ctx_dofinishreference = context.dofinishreference @@ -1517,7 +1515,7 @@ local function identify_outer(set,var,i) local inner = var.inner local external = externals[outer] if external then - local v = identify_inner(set,var,nil,external) + local v = identify_inner(set,var,"",external) if v then v.kind = "outer with inner" set.external = true @@ -1526,19 +1524,24 @@ local function identify_outer(set,var,i) end return v end - local v = identify_inner(set,var,var.outer,external) - if v then - v.kind = "outer with inner" - set.external = true - if trace_identifying then - report_identify_outer(set,v,i,"2b") + -- somewhat rubish: we use outer as first step in the externals table so it makes no + -- sense to have it as prefix so the next could be an option + local external = external[""] + if external then + local v = identify_inner(set,var,var.outer,external) + if v then + v.kind = "outer with inner" + set.external = true + if trace_identifying then + report_identify_outer(set,v,i,"2b") + end + return v end - return v end end local external = productdata.componentreferences[outer] if external then - local v = identify_inner(set,var,nil,external) + local v = identify_inner(set,var,"",external) if v then v.kind = "outer with inner" set.external = true @@ -1577,7 +1580,12 @@ local function identify_outer(set,var,i) end var.i = inner var.f = outer - var.r = (inner.references and inner.references.realpage) or (inner.pagedata and inner.pagedata.realpage) or 1 + if type(inner) == "table" then + -- can this really happen? + var.r = (inner.references and inner.references.realpage) or (inner.pagedata and inner.pagedata.realpage) or 1 + else + var.r = 1 + end if trace_identifying then report_identify_outer(set,var,i,"2e") end @@ -1869,52 +1877,68 @@ implement { } } -function references.reportproblems() -- might become local +logs.registerfinalactions(function() if nofunknowns > 0 then statistics.register("cross referencing", function() return format("%s identified, %s unknown",nofidentified,nofunknowns) end) - logspushtarget("logfile") - logsnewline() - report_references("start problematic references") - logsnewline() - for k, v in table.sortedpairs(unknowns) do - report_unknown("%4i: %s",v,k) + local sortedhash = table.sortedhash + logs.startfilelogging(report,"missing references") + for k, v in table.sortedhash(unknowns) do + report("%4i %s",v,k) + end + logs.stopfilelogging() + if logs.loggingerrors() then + logs.starterrorlogging(report,"missing references") + for k, v in table.sortedhash(unknowns) do + report("%4i %s",v,k) + end + logs.stoperrorlogging() end - logsnewline() - report_references("stop problematic references") - logsnewline() - logspoptarget() end -end - -luatex.registerstopactions(references.reportproblems) +end) -- The auto method will try to avoid named internals in a clever way which -- can make files smaller without sacrificing external references. Some of -- the housekeeping happens the backend side. local innermethod = v_auto -- only page|auto now +local outermethod = v_auto -- only page|auto now local defaultinnermethod = defaultinnermethod +local defaultoutermethod = defaultoutermethod references.innermethod = innermethod -- don't mess with this one directly +references.outermethod = outermethod -- don't mess with this one directly -function references.setinnermethod(m) - if toboolean(m) or m == v_page or m == v_yes then +function references.setlinkmethod(inner,outer) + if not outer and type(inner) == "string" then + local m = settings_to_array(inner) + inner = m[1] + outer = m[2] or v_auto + end + if toboolean(inner) or inner == v_page or inner == v_yes then innermethod = v_page - elseif m == v_name then + elseif inner == v_name then innermethod = v_name else innermethod = v_auto end + if toboolean(outer) or outer == v_page or outer == v_yes then + outermethod = v_page + elseif inner == v_name then + outermethod = v_name + else + outermethod = v_auto + end references.innermethod = innermethod - function references.setinnermethod() - report_references("inner method is already set and frozen to %a",innermethod) + references.outermethod = outermethod + function references.setlinkmethod() + report_references("link method is already set and frozen: inner %a, outer %a",innermethod,outermethod) end end implement { - name = "setinnerreferencemethod", - actions = references.setinnermethod, + name = "setreferencelinkmethod", + actions = references.setlinkmethod, arguments = "string", -- onlyonce = true } @@ -1923,8 +1947,12 @@ function references.getinnermethod() return innermethod or defaultinnermethod end +function references.getoutermethod() + return outermethod or defaultoutermethod +end + directives.register("references.linkmethod", function(v) -- page auto - references.setinnermethod(v) + references.setlinkmethod(v) end) -- we can call setinternalreference with an already known internal or with diff --git a/tex/context/base/mkiv/strc-ref.mkvi b/tex/context/base/mkiv/strc-ref.mkvi index 9f2a7b91c..d0752407c 100644 --- a/tex/context/base/mkiv/strc-ref.mkvi +++ b/tex/context/base/mkiv/strc-ref.mkvi @@ -27,28 +27,12 @@ \writestatus{loading}{ConTeXt Structure Macros / Cross Referencing} -\registerctxluafile{strc-rsc}{1.001} -\registerctxluafile{strc-ref}{1.001} -\registerctxluafile{node-ref}{1.001} +\registerctxluafile{strc-rsc}{} +\registerctxluafile{strc-ref}{} +\registerctxluafile{node-ref}{} \unprotect -%D This module is a (partial) rewrite of core-ref.tex for \MKIV. As -%D such it will be a moving target for a while. - -%D Later we will do a further cleanup and move much of the code to -%D \LUA\ (i.e.\ better backend integration). - -\let\mainreference\gobblefivearguments - -% this will go when we got rid of the tuo file - -\let\currentfolioreference \!!zerocount % only used in xml-fo -\let\resetreferences \relax -\let\setreferences \relax -\let\showcurrentreference \relax -\let\setexecutecommandcheck\gobbletwoarguments - % todo : unknown/illegal reference no arg % todo : +n pages check on 'samepage' (contrastcolor) % todo : multiple text in reference @@ -372,7 +356,7 @@ {\begingroup \dowithnextbox {\strc_references_set_page_only_destination_attribute{#1}% - \hbox + \hpack % \hbox \ifnum\lastdestinationattribute=\attributeunsetvalue\else attr \destinationattribute \lastdestinationattribute \fi {\box\b_strc_destination_nodes\box\nextbox}% \endgroup}} @@ -495,13 +479,13 @@ {\scratchwidth \wd\nextbox \scratchheight\ht\nextbox \scratchdepth \dp\nextbox - \setbox\nextbox\hbox + \setbox\nextbox\hbox % \hpack ? {\framed[\c!frame=\v!off,#2]{\box\nextbox}}% \strc_references_set_simple_reference{#1}% - \setbox\nextbox\hbox attr \destinationattribute \currentdestinationattribute + \setbox\nextbox\hbox attr \destinationattribute \currentdestinationattribute % \hpack ? {\strc_references_flush_destination_nodes \box\nextbox}% - \setbox\nextbox\hbox{\box\nextbox}% + \setbox\nextbox\hpack{\box\nextbox}% \wd\nextbox\scratchwidth \ht\nextbox\scratchheight \dp\nextbox\scratchdepth @@ -510,7 +494,7 @@ \def\strc_references_content_nop_finish#1#2% {\strc_references_set_simple_reference{#1}% - \hbox attr \destinationattribute \currentdestinationattribute + \hbox attr \destinationattribute \currentdestinationattribute % \hpack ? {\strc_references_flush_destination_nodes \box\nextbox}% \egroup} @@ -2252,27 +2236,6 @@ %D \in{figure}[match(mess)] %D \stoptyping -%D Tracing: - -\unexpanded\def\strc_references_tracer#1#2% \csleft csright - {\hbox to \zeropoint \bgroup - \hss - \infofont - \darkblue - \ifx#1\empty\else - \raise\strutht \hbox \s!to \zeropoint \bgroup - \hss#1\hskip.2\emwidth - \egroup - \fi - \vrule \s!height 1.5\strutht \s!depth \strutdp \s!width .1\emwidth - \ifx#2\empty\else - \raise\strutht \hbox \s!to \zeropoint \bgroup - \hskip.2\emwidth#2\hss - \egroup - \fi - \hss - \egroup}% - \protect \endinput % tricky: diff --git a/tex/context/base/mkiv/strc-reg.lua b/tex/context/base/mkiv/strc-reg.lua index 32924ad81..51771e3b8 100644 --- a/tex/context/base/mkiv/strc-reg.lua +++ b/tex/context/base/mkiv/strc-reg.lua @@ -6,7 +6,7 @@ if not modules then modules = { } end modules ['strc-reg'] = { license = "see context related readme files" } -local next, type = next, type +local next, type, tonumber = next, type, tonumber local format, gmatch = string.format, string.gmatch local equal, concat, remove = table.are_equal, table.concat, table.remove local lpegmatch, P, C, Ct = lpeg.match, lpeg.P, lpeg.C, lpeg.Ct @@ -387,6 +387,7 @@ local function initializer() end end end + -- references.sortedinternals = sortedkeys(internalreferences) -- todo: when we need it more than once end local function finalizer() diff --git a/tex/context/base/mkiv/strc-reg.mkiv b/tex/context/base/mkiv/strc-reg.mkiv index 380cc9f22..04fdef9ad 100644 --- a/tex/context/base/mkiv/strc-reg.mkiv +++ b/tex/context/base/mkiv/strc-reg.mkiv @@ -13,7 +13,7 @@ \writestatus{loading}{ConTeXt Structure Macros / Registers} -\registerctxluafile{strc-reg}{1.001} +\registerctxluafile{strc-reg}{} \unprotect diff --git a/tex/context/base/mkiv/strc-ren.mkiv b/tex/context/base/mkiv/strc-ren.mkiv index 132f0f115..89aa6f55a 100644 --- a/tex/context/base/mkiv/strc-ren.mkiv +++ b/tex/context/base/mkiv/strc-ren.mkiv @@ -151,7 +151,7 @@ \strc_rendering_stop_placement} \unexpanded\def\strc_rendering_place_head_empty - {\hbox \headreferenceattributes {\getheadsyncs}} + {\hbox\headreferenceattributes{\getheadsyncs}} % \hpack ? %D \starttyping %D \def\StretchedBox#1% @@ -221,24 +221,6 @@ \let\localheadsetup \strc_rendering_initialize_spacing % historic name \let\headsetupspacing\strc_rendering_initialize_spacing} -\def\strc_rendering_initialize_hsize_local - {\global\d_strc_rendering_local_leftoffset \leftskip - \global\d_strc_rendering_local_rightoffset\rightskip - % \forgetall - % \leftskip \d_strc_rendering_local_leftoffset % no stretch - % \rightskip\d_strc_rendering_local_rightoffset % no stretch - % \setlocalhsize - % \hsize\localhsize - % \forgetbothskips} - \scratchwidth\availablehsize - \forgetall - \hsize\scratchwidth} - -\def\strc_rendering_initialize_hsize_global - {\global\d_strc_rendering_local_leftoffset \zeropoint - \global\d_strc_rendering_local_rightoffset\zeropoint - \forgetall} - \def\strc_rendering_initialize_interaction {\resetinteractionparameter\c!style \resetinteractionparameter\c!color @@ -308,70 +290,33 @@ \d_strc_rendering_hang_height\zeropoint \fi} -% \def\strc_rendering_stop_placement -% {\n_strc_rendering_hang_lines\zerocount -% \ifconditional\headisdisplay -% \strc_rendering_initialize_line_hang -% % kind of special, we want to snap heads also according to local specs local -% \ifgridsnapping -% \hbox\bgroup % extra hbox will trigger global snapper on top of local -% \edef\p_grid{\headparameter\c!grid}% -% \ifconditional\headisdisplay -% \ifx\p_grid\empty\else -% \useheadstyleandcolor\c!style\c!color -% \setupinterlinespace -% \useheadstyleandcolor\c!textstyle\c!textcolor -% \setupinterlinespace -% \fi -% \fi -% \snaptogrid[\p_grid]\hbox -% {\hskip\dimexpr\d_strc_rendering_local_leftoffset+\headparameter\c!margin\relax\box\b_strc_rendering_head}% -% \egroup -% \else -% \hbox -% {\hskip\dimexpr\d_strc_rendering_local_leftoffset+\headparameter\c!margin\relax\box\b_strc_rendering_head}% -% \fi -% \flushnotes % new, not really needed -% \endgraf -% \ifvmode -% \ifnum\n_strc_rendering_hang_lines>\zerocount -% \dorecurse\n_strc_rendering_hang_lines{\nointerlineskip\dosomebreak\nobreak\strut\endgraf}% to be checked -% \fi -% \nointerlineskip -% \dosomebreak\nobreak -% \fi -% \getheadsyncs -% \else -% % somehow this goes ok even when we push in the margin probably because we gobble pars -% % in the process of collecting index entries etc -% \strut -% \flushnotes % new, here since we're in par mode -% \unhbox\b_strc_rendering_head -% \getheadsyncs -% \ifconditional\headissomewhere -% % nothing special -% \else -% %\hskip\headnumberdistance\s!plus\headnumberdistance\s!minus.25\dimexpr\headnumberdistance\relax -% \hskip\headtextdistance\relax -% \strc_sectioning_inject_continuous_signal -% \fi -% \fi -% \ifconditional\headisdisplay -% \ifvmode -% \ifgridsnapping % important, font related depth, see comment -% \prevdepth\strutdp -% \else -% \prevdepth\d_strc_rendering_local_depth -% \fi -% \fi -% \fi -% \egroup -% \egroup -% \ifconditional\headisdisplay -% \useindentnextparameter\headparameter -% \else -% \nonoindentation % recently added, was a bug -% \fi} +\def\strc_rendering_initialize_hsize_local + {\global\d_strc_rendering_local_leftoffset \leftskip + \global\d_strc_rendering_local_rightoffset\rightskip + % \forgetall + % \leftskip \d_strc_rendering_local_leftoffset % no stretch + % \rightskip\d_strc_rendering_local_rightoffset % no stretch + % \setlocalhsize + % \hsize\localhsize + % \forgetbothskips} + \scratchwidth\availablehsize + \forgetall + \hsize\scratchwidth} + +\def\strc_rendering_initialize_hsize_global + {\global\d_strc_rendering_local_leftoffset \zeropoint + \global\d_strc_rendering_local_rightoffset\zeropoint + \forgetall} + +% \def\strc_sectioning_stay_on_this_line +% {\directcheckedvspacing{-\v!line,\v!samepage,\v!nowhite}% +% \directcheckedvspacing\v!disable} +% +% we now use \ignoreparskip, so: + +\def\strc_sectioning_stay_on_this_line + {\directcheckedvspacing{-\v!line,\v!samepage}% + \directcheckedvspacing\v!disable} \def\strc_rendering_stop_placement {\n_strc_rendering_hang_lines\zerocount @@ -409,7 +354,7 @@ \unhbox\b_strc_rendering_head \getheadsyncs \ifconditional\headissomewhere - % nothing special + \strc_sectioning_stay_on_this_line % test case: alternative=margintext and \startparagraph .. \else %\hskip\headnumberdistance\s!plus\headnumberdistance\s!minus.25\dimexpr\headnumberdistance\relax \hskip\headtextdistance\relax @@ -430,7 +375,8 @@ \ifconditional\headisdisplay \useindentnextparameter\headparameter \else - \nonoindentation % recently added, was a bug + \ignoreparskip + \noindentation % recently added, was a bug \fi} % nice testcase diff --git a/tex/context/base/mkiv/strc-sec.mkiv b/tex/context/base/mkiv/strc-sec.mkiv index b0771b475..4e5115a7d 100644 --- a/tex/context/base/mkiv/strc-sec.mkiv +++ b/tex/context/base/mkiv/strc-sec.mkiv @@ -86,7 +86,8 @@ \c!sectionset=\headparameter\c!sectionset, \c!sectionsegments=\headparameter\c!sectionsegments, \c!reference=\headparameter\c!reference, - \c!referenceprefix=\headparameter\c!referenceprefix] + \c!referenceprefix=\headparameter\c!referenceprefix, + \c!criterium=\headparameter\c!criterium] % see lists/neat-001.tex for usage of: @@ -112,7 +113,14 @@ \globallet\currentstructurebookmark\tempstring \endgroup} -% so it's an experiment +% zeros: +% +% \setuphead[subsection][criterium=all] +% +% \dorecurse{3} { +% \chapter{Blabla} \subsection{bla 1 1} \subsection{bla 1 2} +% \section{bla 2} \subsection{bla 2 1} \subsection{bla 2 2} +% } \unexpanded\def\strc_sectioning_register#1#2#3% #1=interfaced-settings, #2=optional user data (not yet supported) {\begingroup @@ -236,6 +244,7 @@ segments {\structureparameter\c!sectionsegments} ownnumber {\currentstructureownnumber} language {\currentlanguage}% for the moment, needed for bookmarks conversion + criterium {\structureparameter\c!criterium} } userdata {\detokenize{#3}}% will be converted to table at the lua end \relax @@ -462,9 +471,11 @@ % compatible but better \appendtoks - \doifelse{\headparameter\c!ownnumber}\v!yes - {\setuevalue\currenthead{\strc_sectioning_handle_own[\currenthead]}} - {\setuevalue\currenthead{\strc_sectioning_handle_nop[\currenthead]}}% + \ifx\currenthead\empty \else + \doifelse{\headparameter\c!ownnumber}\v!yes + {\setuevalue\currenthead{\strc_sectioning_handle_own[\currenthead]}} + {\setuevalue\currenthead{\strc_sectioning_handle_nop[\currenthead]}}% + \fi \to \everysetuphead \unexpanded\def\doredefinehead#1#2% called at lua end @@ -585,10 +596,10 @@ % mkii compatible. Somewhat weird that it's part of the % top level structure but it will be flattened anyway. \let\currenthead\currentsection % - \setheadparameter\c!textstyle {\strictheadparameter\c!style}% - \setheadparameter\c!textcolor {\strictheadparameter\c!color}% - \setheadparameter\c!numberstyle{\strictheadparameter\c!style}% - \setheadparameter\c!numbercolor{\strictheadparameter\c!color}% + \setheadparameter\c!textstyle {\directheadparameter\c!style}% + \setheadparameter\c!textcolor {\directheadparameter\c!color}% + \setheadparameter\c!numberstyle{\directheadparameter\c!style}% + \setheadparameter\c!numbercolor{\directheadparameter\c!color}% \to \everydefinesection % head -> head @@ -660,6 +671,7 @@ \newconditional\c_strc_sectioning_place \newconditional\c_strc_sectioning_empty \newconditional\c_strc_sectioning_hidden +\newconditional\c_strc_sectioning_section \newconditional\headshownumber % public \newconditional\headisdisplay % public @@ -690,22 +702,32 @@ \setvalue{\??headplace\v!yes}% {\setfalse\c_strc_sectioning_empty \settrue \c_strc_sectioning_place - \setfalse\c_strc_sectioning_hidden} + \setfalse\c_strc_sectioning_hidden + \setfalse\c_strc_sectioning_section} \setvalue{\??headplace\v!empty}% {\settrue \c_strc_sectioning_empty \settrue \c_strc_sectioning_place - \setfalse\c_strc_sectioning_hidden} + \setfalse\c_strc_sectioning_hidden + \setfalse\c_strc_sectioning_section} \setvalue{\??headplace\v!no}% {\settrue \c_strc_sectioning_empty \setfalse\c_strc_sectioning_place - \setfalse\c_strc_sectioning_hidden} + \setfalse\c_strc_sectioning_hidden + \setfalse\c_strc_sectioning_section} \setvalue{\??headplace\v!hidden}% {\settrue \c_strc_sectioning_empty \setfalse\c_strc_sectioning_place - \settrue \c_strc_sectioning_hidden} + \settrue \c_strc_sectioning_hidden + \setfalse\c_strc_sectioning_section} + +\setvalue{\??headplace\v!section}% + {\settrue \c_strc_sectioning_empty + \setfalse\c_strc_sectioning_place + \settrue \c_strc_sectioning_hidden + \settrue \c_strc_sectioning_section} \unexpanded\def\strc_sectioning_initialize_placement {\expandnamespaceparameter\??headplace\headparameter\c!placehead\v!yes} @@ -747,7 +769,8 @@ % so we need a 'keep track of raw set option' (or maybe a funny internal prefix) \unexpanded\def\setheadmarking % li:: so that we can use \marking[section]{Taco needed this} - {\normalexpanded{\setmarking[\currenthead]{li::\currentstructurelistnumber}}} + {\strc_sectioning_delayed_flush + \normalexpanded{\setmarking[\currenthead]{li::\currentstructurelistnumber}}} \let\deepstructurenumbercommand\relax \let\deepstructuretitlecommand \relax @@ -852,6 +875,7 @@ \strc_sectioning_before_yes \strc_sectioning_register{#1}{#2}{#3}% after optional \page \strc_sectioning_report + \dostarttagged\t!sectioncaption\empty \let\getheadsyncs\theheadsynchonization \let\getheadtitle\fullheadtitle \ifconditional\headshownumber @@ -860,18 +884,27 @@ \else \strc_rendering_place_head_text \fi + \dostoptagged \strc_sectioning_after_yes \else\ifconditional\c_strc_sectioning_hidden \strc_sectioning_register{#1}{#2}{#3}% after optional \page \strc_sectioning_report + \dostarttagged\t!sectioncaption\empty \let\getheadsyncs\theheadsynchonization - \strc_rendering_place_head_hidden % only something when tracing + \ifconditional\c_strc_sectioning_section + \strc_rendering_place_head_section + \else + \strc_rendering_place_head_hidden % only something when tracing + \fi + \dostoptagged \else \strc_sectioning_before_nop % toegevoegd ivm subpaginanr / tug sheets \strc_sectioning_register{#1}{#2}{#3}% after optional \page \strc_sectioning_report + \dostarttagged\t!sectioncaption\empty \let\getheadsyncs\theheadsynchonization \strc_rendering_place_head_empty % just flush 'm + \dostoptagged \strc_sectioning_after_nop \fi\fi \else @@ -879,22 +912,32 @@ \strc_sectioning_before_yes \strc_sectioning_register{#1}{#2}{#3}% after optional \page \strc_sectioning_report + \dostarttagged\t!sectioncaption\empty \let\getheadsyncs\theheadsynchonization \let\getheadtitle\fullheadtitle \strc_rendering_place_head_text + \dostoptagged \strc_sectioning_after_yes \else\ifconditional\c_strc_sectioning_hidden \strc_sectioning_register{#1}{#2}{#3}% after optional \page \strc_sectioning_report \let\getheadsyncs\theheadsynchonization - \strc_rendering_place_head_hidden % only something when tracing + \dostarttagged\t!sectioncaption\empty + \ifconditional\c_strc_sectioning_section + \strc_rendering_place_head_section + \else + \strc_rendering_place_head_hidden % only something when tracing + \fi + \dostoptagged \else % do nothing / should be vbox to 0pt \strc_sectioning_before_nop \strc_sectioning_register{#1}{#2}{#3}% after optional \page \strc_sectioning_report + \dostarttagged\t!sectioncaption\empty \let\getheadsyncs\theheadsynchonization \strc_rendering_place_head_empty % just flush 'm + \dostoptagged \strc_sectioning_after_nop \fi\fi \fi @@ -930,13 +973,27 @@ % todo: when in the page builder we need to resolve the marking immediately % because otherwise we have an async +\newbox\b_sectioning_delayed + +\def\strc_sectioning_delayed_flush + {\ifvoid\b_sectioning_delayed\else + \smashboxed\b_sectioning_delayed + \fi} + +\unexpanded\def\strc_rendering_place_head_section % see hidden below + {\global\setbox\b_sectioning_delayed\hpack\bgroup + \setmarking[\currentheadcoupling]{li::\currentstructurelistnumber}% + \hpack\headreferenceattributes{}% + \currentstructuresynchronize + \egroup} + \unexpanded\def\strc_rendering_place_head_hidden % maybe trialtypesetting check {\setxvalue{\??hiddenheadattr\currenthead}% {\headreferenceattributes}% can be used when making a box \setxvalue{\??hiddenheadsync\currenthead}% {\noexpand\letgvalue{\??hiddenheadsync\currenthead}\relax \noexpand\setmarking[\currentheadcoupling]{li::\currentstructurelistnumber}% - \hbox\headreferenceattributes{}% otherwise no destination ... maybe tag ref as hidden and fall back on page reference + \hpack\headreferenceattributes{}% otherwise no destination ... maybe tag ref as hidden and fall back on page reference \currentstructuresynchronize}} % and it's a node anyway \def\synchronizehead #1{\csname\??hiddenheadsync#1\endcsname} @@ -1031,7 +1088,7 @@ {\ifconditional\headisdisplay \ifconditional\c_strc_sectioning_auto_break % \vspacing[\v!samepage-\currentheadlevel]% -\vspacing[\v!samepage]% + \vspacing[\v!samepage]% \fi \strc_sectioning_empty_correction \headparameter\c!after diff --git a/tex/context/base/mkiv/strc-syn.mkiv b/tex/context/base/mkiv/strc-syn.mkiv index 72c94d069..1fb079f04 100644 --- a/tex/context/base/mkiv/strc-syn.mkiv +++ b/tex/context/base/mkiv/strc-syn.mkiv @@ -13,7 +13,7 @@ \writestatus{loading}{ConTeXt Structure Macros / Synonyms and Sorting} -\registerctxluafile{strc-syn}{1.001} +\registerctxluafile{strc-syn}{} %D Although we could nowadays build this on top of regular lists we keep this %D more efficient variant around. Eventually we can add some options to lists @@ -162,9 +162,9 @@ %c!hang=, %c!sample=, \c!margin=\v!no, - \c!before=\blank, + \c!before=\startpacked, \c!inbetween=\blank, - \c!after=\blank, + \c!after=\stoppacked, %c!indentnext=, %c!indenting=, % @@ -335,14 +335,16 @@ [\c!alternative=\v!normal] \unexpanded\def\strc_synonyms_insert_meaning#1#2% name tag - {\begingroup + {\dontleavehmode % otherwise we don't get it right at the beginning of a par + \begingroup \def\currentsimplelist{#1}% \def\currentsynonymtag{#2}% \fastsetup{\??simplelistrenderings::\v!text}% \endgroup} \unexpanded\def\strc_synonyms_insert#1#2% name tag - {\begingroup + {\dontleavehmode % otherwise we don't get it right at the beginning of a par + \begingroup \edef\currentsimplelist{#1}% \let \currentsynonym\currentsimplelist % for a while \def \currentsynonymtag{#2}% @@ -353,7 +355,7 @@ \normalexpanded{\endgroup\simplelistparameter\c!next}} % \setupsimplelistalternative -% [\c!command=\strictsimplelistparameter\c!command] +% [\c!command=\directsimplelistparameter\c!command] \definesimplelistalternative [\v!normal] @@ -422,8 +424,9 @@ {\strc_constructions_initialize{#1}% \setupcurrentsimplelist[#2]% \let\synonymentry\strc_synonym_normal - \startpacked - \clf_processsynonyms + % so we can hook tabulate into before and after + \normalexpanded{\simplelistparameter\c!before + \noexpand\clf_processsynonyms {#1}% {% criterium {\simplelistparameter\c!criterium}% @@ -431,7 +434,8 @@ method {\simplelistparameter\c!method}% }% \relax - \stoppacked}% + \simplelistparameter\c!after}% + \relax}% {}% todo: message that invalid \endgroup} @@ -465,8 +469,8 @@ %\c!command=, % we test for defined ! %\c!criterium=, %\c!style=, - %\c!before=, - \c!after=\endgraf, + \c!before=\startpacked, + \c!after=\stoppacked, %\c!expansion=, \c!method=] @@ -549,7 +553,8 @@ [\c!alternative=\v!normal] \unexpanded\def\strc_sorting_insert#1#2% name tag - {\begingroup + {\dontleavehmode % otherwise we don't get it right at the beginning of a par + \begingroup % no kap currently, of .. we need to map cap onto WORD \edef\currentsorting{#1}% \def \currentsortingtag{#2}% @@ -593,6 +598,7 @@ \unexpanded\def\placelistofsorts {\dodoubleempty\strc_sorting_place_list} + \def\strc_sorting_place_list[#1][#2]% {\begingroup \edef\currentsimplelist{#1}% @@ -604,8 +610,9 @@ \else \let\synonymentry\strc_sorting_command \fi - \startpacked - \clf_processsynonyms + % so we can hook tabulate into before and after + \normalexpanded{\simplelistparameter\c!before + \noexpand\clf_processsynonyms {#1}% {% criterium {\simplelistparameter\c!criterium}% @@ -613,7 +620,7 @@ method {\simplelistparameter\c!method}% }% \relax - \stoppacked + \simplelistparameter\c!after}% \endgroup} \unexpanded\def\completelistofsorts diff --git a/tex/context/base/mkiv/strc-tag.lua b/tex/context/base/mkiv/strc-tag.lua index 9d1fec33e..1be44821e 100644 --- a/tex/context/base/mkiv/strc-tag.lua +++ b/tex/context/base/mkiv/strc-tag.lua @@ -60,7 +60,7 @@ tags.specifications = specifications local p_splitter = C((1-S(">"))^1) * P(">") * C(P(1)^1) tagpatterns.splitter = p_splitter -local properties = allocate { +local properties = allocate { -- todo: more "record = true" to improve formatting document = { pdf = "Div", nature = "display" }, @@ -71,6 +71,7 @@ local properties = allocate { highlight = { pdf = "Span", nature = "inline" }, section = { pdf = "Sect", nature = "display" }, + sectioncaption = { pdf = "Div", nature = "display", record = true }, sectiontitle = { pdf = "H", nature = "mixed" }, sectionnumber = { pdf = "H", nature = "mixed" }, sectioncontent = { pdf = "Div", nature = "display" }, @@ -282,6 +283,10 @@ function tags.registermetadata(data) end end +function tags.getmetadata() + return documentdata or { } +end + function tags.start(tag,specification) if not enabled then codeinjections.enabletags() diff --git a/tex/context/base/mkiv/strc-tag.mkiv b/tex/context/base/mkiv/strc-tag.mkiv index 7fdfd7afa..2ee71d67c 100644 --- a/tex/context/base/mkiv/strc-tag.mkiv +++ b/tex/context/base/mkiv/strc-tag.mkiv @@ -16,7 +16,7 @@ \writestatus{loading}{ConTeXt Structure Macros / Tags} -\registerctxluafile{strc-tag}{1.001} +\registerctxluafile{strc-tag}{} \unprotect @@ -32,6 +32,7 @@ \def\t!highlight {highlight} % Span \def\t!section {section} % Sect +\def\t!sectioncaption {sectioncaption} % Div \def\t!sectiontitle {sectiontitle} % H \def\t!sectionnumber {sectionnumber} % H \def\t!sectioncontent {sectioncontent} % Div @@ -362,6 +363,9 @@ \doifelse{\taggingparameter\c!state}\v!start{\the\everyenableelements}{\the\everydisableelements}% \to \everysetuptagging +\unexpanded\def\forgettagging + {\attribute\taggedattribute\attributeunsetvalue} + \setuptagging [\c!state=\v!stop, \c!method=\v!auto] @@ -535,4 +539,6 @@ \unexpanded\def\bpar{\dostarttagged\t!paragraph\empty\strc_tagged_saved_bpar} \unexpanded\def\epar{\strc_tagged_saved_epar\dostoptagged} +% \def\untagged{attr \taggedattribute\attributeunsetvalue} + \protect diff --git a/tex/context/base/mkiv/supp-box.lua b/tex/context/base/mkiv/supp-box.lua index b9bf0ccf0..664477cfc 100644 --- a/tex/context/base/mkiv/supp-box.lua +++ b/tex/context/base/mkiv/supp-box.lua @@ -8,10 +8,12 @@ if not modules then modules = { } end modules ['supp-box'] = { -- this is preliminary code, use insert_before etc -local lpegmatch = lpeg.match - local report_hyphenation = logs.reporter("languages","hyphenation") +local tonumber, next, type = tonumber, next, type + +local lpegmatch = lpeg.match + local tex = tex local context = context local nodes = nodes @@ -30,9 +32,10 @@ local nuts = nodes.nuts local tonut = nuts.tonut local tonode = nuts.tonode -local getfield = nuts.getfield +----- getfield = nuts.getfield local getnext = nuts.getnext local getprev = nuts.getprev +local getboth = nuts.getboth local getdisc = nuts.getdisc local getid = nuts.getid local getlist = nuts.getlist @@ -42,7 +45,7 @@ local getdir = nuts.getdir local getwidth = nuts.getwidth local takebox = nuts.takebox -local setfield = nuts.setfield +----- setfield = nuts.setfield local setlink = nuts.setlink local setboth = nuts.setboth local setnext = nuts.setnext @@ -78,9 +81,8 @@ local texsetdimen = tex.setdimen local function hyphenatedlist(head,usecolor) local current = head and tonut(head) while current do - local id = getid(current) - local next = getnext(current) - local prev = getprev(current) + local id = getid(current) + local prev, next = getboth(current) if id == disc_code then local pre, post, replace = getdisc(current) if not usecolor then @@ -97,31 +99,14 @@ local function hyphenatedlist(head,usecolor) flush_list(replace) end setdisc(current) - setboth(current) --- local list = setlink ( --- pre and new_penalty(10000), --- pre, --- current, --- post, --- post and new_penalty(10000) --- ) --- local tail = find_tail(list) --- if prev then --- setlink(prev,list) --- end --- if next then --- setlink(tail,next) --- end - setlink ( - prev, -- there had better be one - pre and new_penalty(10000), - pre, - current, - post, - post and new_penalty(10000), - next - ) - -- flush_node(current) + if pre then + setlink(prev,new_penalty(10000),pre) + setlink(find_tail(pre),current) + end + if post then + setlink(current,new_penalty(10000),post) + setlink(find_tail(post),next) + end elseif id == vlist_code or id == hlist_code then hyphenatedlist(getlist(current)) end @@ -164,8 +149,10 @@ end implement { name = "showhyphenatedinlist", arguments = "integer", - actions = function(box) - report_hyphenation("show: %s",listtoutf(checkedlist(n),false,true)) + actions = function(n) + -- we just hyphenate (as we pass a hpack) .. a bit too much casting but ... + local l = languages.hyphenators.handler(tonode(checkedlist(n))) + report_hyphenation("show: %s",listtoutf(l,false,true)) end } @@ -350,6 +337,7 @@ implement { local result = new_hlist() setlist(result,head) setbox(target,result) + -- setbox(target,new_hlist(head)) end } diff --git a/tex/context/base/mkiv/supp-box.mkiv b/tex/context/base/mkiv/supp-box.mkiv index 9d2817cee..fb9cbdf5d 100644 --- a/tex/context/base/mkiv/supp-box.mkiv +++ b/tex/context/base/mkiv/supp-box.mkiv @@ -15,7 +15,7 @@ \unprotect -\registerctxluafile{supp-box}{1.001} +\registerctxluafile{supp-box}{} % This file is partially cleaned up. @@ -79,6 +79,7 @@ \def\strutht {\ht\strutbox} \def\strutwd {\wd\strutbox} \def\struthtdp{\dimexpr\ht\strutbox+\dp\strutbox\relax} +\def\strutgap {\dimexpr\ht\strutbox-\dp\strutbox\relax} %D \macros %D {voidbox,nextbox} @@ -1071,8 +1072,8 @@ \unexpanded\def\doshowhyphenatednextbox {\clf_showhyphenatedinlist\nextbox} -\unexpanded\def\showhyphens - {\dowithnextboxcs\doshowhyphenatednextbox\hbox} +\unexpanded\def\showhyphens % hpack: so no processing (we hyphenate in lua) + {\dowithnextboxcs\doshowhyphenatednextbox\hpack} %D The following macros are seldom used but handy for tracing. %D @@ -2668,7 +2669,7 @@ %D A funny (but rather stupid) one, plus a redefinition. \unexpanded\def\removebottomthings - {\dorecurse5{\unskip\unkern\unpenalty}} + {\dorecurse\plusfive{\unskip\unkern\unpenalty}} \unexpanded\def\removelastskip % \ifvmode the plain tex one \fi {\ifvmode\ifzeropt\lastskip\else\vskip-\lastskip\fi\fi} @@ -2746,19 +2747,12 @@ %D And even rawer: -\let\naturalhbox \hbox -\let\naturalvbox \vbox -\let\naturalvtop \normalvtop -\let\naturalvcenter\normalvtop - -\ifdefined\textdir - - \unexpanded\def\naturalhbox {\hbox dir TLT} - \unexpanded\def\naturalvbox {\vbox dir TLT} - \unexpanded\def\naturalhpack{\hpack dir TLT} - \unexpanded\def\naturalvpack{\vpack dir TLT} - -\fi + \let\naturalvtop \normalvtop + \let\naturalvcenter\normalvtop +\unexpanded\def\naturalhbox {\hbox dir TLT} +\unexpanded\def\naturalvbox {\vbox dir TLT} +\unexpanded\def\naturalhpack {\hpack dir TLT} +\unexpanded\def\naturalvpack {\vpack dir TLT} %D \macros %D {vcenter} @@ -2973,7 +2967,12 @@ %D Who knows when this comes in handy: -\unexpanded\def\lastlinewidth{\dimexpr\clf_lastlinelength\scaledpoint\relax} +\unexpanded\def\lastlinewidth{\dimexpr\clf_lastlinewidth\scaledpoint\relax} + +%D Keep as reference: + +% \unexpanded\def\tightvbox{\dowithnextbox{\dp\nextbox\zeropoint\box\nextbox}\vbox} +% \unexpanded\def\tightvtop{\dowithnextbox{\ht\nextbox\zeropoint\box\nextbox}\vtop} \protect \endinput diff --git a/tex/context/base/mkiv/supp-dir.mkiv b/tex/context/base/mkiv/supp-dir.mkiv index 6251012b6..42a0aa37c 100644 --- a/tex/context/base/mkiv/supp-dir.mkiv +++ b/tex/context/base/mkiv/supp-dir.mkiv @@ -30,9 +30,7 @@ % \ifnum\thetextdir=0 L\else R\fi \textdir TRT \ifnum\thetextdir=0 L\else R\fi \unexpanded\def\showdirsinmargin - {\doifelse{\the\pardir}\!!TLT - {\inleft{\normalexpanded{\noexpand\hbox dir TLT{\ttxx[\the\pardir,\the\textdir]}}}} - {\inleft{\normalexpanded{\noexpand\hbox dir TLT{\ttxx[\the\pardir,\the\textdir]}}}}} + {\inleft{\normalexpanded{\noexpand\hbox dir TLT{\ttxx[\the\pardir,\the\textdir]}}}} \bgroup \catcode`L=\othercatcode \gdef\istltdir#1#2#3{\if#2L0\else1\fi} diff --git a/tex/context/base/mkiv/supp-mat.mkiv b/tex/context/base/mkiv/supp-mat.mkiv index b265a7c5a..176233ae5 100644 --- a/tex/context/base/mkiv/supp-mat.mkiv +++ b/tex/context/base/mkiv/supp-mat.mkiv @@ -314,4 +314,9 @@ % \def\startdisplay{\displaybreak\ignorespaces\startpacked} % \def\stopdisplay {\stoppacked\displaybreak\ignorespaces} +\let\superscript \Usuperscript +\let\subscript \Usubscript +\let\nosuperscript\Unosuperscript +\let\nosubscript \Unosubscript + \protect \endinput diff --git a/tex/context/base/mkiv/supp-ran.lua b/tex/context/base/mkiv/supp-ran.lua index 8bfc09e58..1ad9293ee 100644 --- a/tex/context/base/mkiv/supp-ran.lua +++ b/tex/context/base/mkiv/supp-ran.lua @@ -24,7 +24,7 @@ local randomseed = math.randomseed local round = math.round local stack = { } local last = 1 -local maxcount = 2^30-1 -- 1073741823 +local maxcount = 0x3FFFFFFF -- 2^30-1 math.random = function(...) local n = random(...) diff --git a/tex/context/base/mkiv/supp-ran.mkiv b/tex/context/base/mkiv/supp-ran.mkiv index 5b70a075f..59707836a 100644 --- a/tex/context/base/mkiv/supp-ran.mkiv +++ b/tex/context/base/mkiv/supp-ran.mkiv @@ -16,7 +16,7 @@ %D This module is downward compatible in the sense that we've kept %D the user interface (which uses intermediate variables). -\registerctxluafile{supp-ran}{1.001} +\registerctxluafile{supp-ran}{} \unprotect diff --git a/tex/context/base/mkiv/supp-vis.mkiv b/tex/context/base/mkiv/supp-vis.mkiv index e12c4c534..23dfcb5fa 100644 --- a/tex/context/base/mkiv/supp-vis.mkiv +++ b/tex/context/base/mkiv/supp-vis.mkiv @@ -11,6 +11,8 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. +\endinput + %D This module is no longer generic \unknown\ but who cares. Maybe %D the code will be moved out of the core (apart from ruled boxes). @@ -708,7 +710,7 @@ \newdimen\testrulewidth \testrulewidth=\boxrulewidth \newif\ifvisiblestretch \visiblestretchfalse - + %D \macros %D {ruledhss, %D ruledhfil,ruledhfilneg, @@ -892,7 +894,7 @@ \unexpanded\def\ruledvfill {\doruledvfiller\normalvfill \normalvfillneg{-12}} \unexpanded\def\ruledvfilneg {\doruledvfiller\normalvfilneg \normalvfil {8}} \unexpanded\def\ruledvfillneg{\doruledvfiller\normalvfillneg\normalvfill {16}} - + %D \macros %D {ruledhskip} %D @@ -1401,7 +1403,7 @@ \unexpanded\def\ruledvglue {\bgroup \afterassignment\supp_visualizers_vglue_indeed\scratchskip=} - + %D \macros %D {ruledmkern,ruledmskip} %D @@ -1696,8 +1698,6 @@ %D For those who want to manipulate the visual cues in detail, %D we have grouped them. -\newif\ifshowingcomposition % see later why we need this - \unexpanded\def\showfils {\showingcompositiontrue \let\hss \ruledhss diff --git a/tex/context/base/mkiv/symb-emj.mkiv b/tex/context/base/mkiv/symb-emj.mkiv index 22d8b4a07..e063b6a7a 100644 --- a/tex/context/base/mkiv/symb-emj.mkiv +++ b/tex/context/base/mkiv/symb-emj.mkiv @@ -13,7 +13,7 @@ \writestatus{loading}{ConTeXt Symbol Libraries / Emoji} -\registerctxluafile{symb-emj}{1.001} +\registerctxluafile{symb-emj}{} \unprotect diff --git a/tex/context/base/mkiv/symb-ini.mkiv b/tex/context/base/mkiv/symb-ini.mkiv index 23879b43a..e4950e09d 100644 --- a/tex/context/base/mkiv/symb-ini.mkiv +++ b/tex/context/base/mkiv/symb-ini.mkiv @@ -17,7 +17,7 @@ \writestatus{loading}{ConTeXt Symbol Libraries / Initialization} -\registerctxluafile{symb-ini}{1.001} +\registerctxluafile{symb-ini}{} \unprotect @@ -301,7 +301,7 @@ %D %D \showsetup{showsymbolset} -\fetchruntimecommand \showsymbolset {\f!symbolprefix\s!run} +\fetchruntimecommand \showsymbolset \f!symb_run %D \macros %D {usesymbols} diff --git a/tex/context/base/mkiv/syst-aux.lua b/tex/context/base/mkiv/syst-aux.lua index 34e5c4e88..06f6176b1 100644 --- a/tex/context/base/mkiv/syst-aux.lua +++ b/tex/context/base/mkiv/syst-aux.lua @@ -11,7 +11,7 @@ if not modules then modules = { } end modules ['syst-aux'] = { -- utfmatch(str,"(.?)(.*)$") -- utf.sub(str,1,1) -local tonumber = tonumber +local tonumber, next = tonumber, next local utfsub = utf.sub local P, S, R, C, Cc, Cs, Carg, lpegmatch = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.Cc, lpeg.Cs, lpeg.Carg, lpeg.match local next = next @@ -23,7 +23,7 @@ local formatters = string.formatters local setcatcode = tex.setcatcode local utf8character = lpeg.patterns.utf8character local settings_to_array = utilities.parsers.settings_to_array -local settings_to_set = utilities.parsers.settings_to_set +local settings_to_set = utilities.parsers.settings_to_set local setmacro = interfaces.setmacro local pattern = C(utf8character^-1) * C(P(1)^0) @@ -390,8 +390,8 @@ local function doifelsecommon(a,b) end return end - local ba = find(a,",") - local bb = find(b,",") + local ba = find(a,",",1,true) + local bb = find(b,",",1,true) if ba and bb then local ha = hash[a] local hb = hash[b] @@ -433,8 +433,8 @@ local function doifcommon(a,b) end return end - local ba = find(a,",") - local bb = find(b,",") + local ba = find(a,",",1,true) + local bb = find(b,",",1,true) if ba and bb then local ha = hash[a] local hb = hash[b] @@ -476,8 +476,8 @@ local function doifnotcommon(a,b) end return end - local ba = find(a,",") - local bb = find(b,",") + local ba = find(a,",",1,true) + local bb = find(b,",",1,true) if ba and bb then local ha = hash[a] local hb = hash[b] @@ -519,7 +519,7 @@ local function doifelseinset(a,b) end return end - local bb = find(b,",") + local bb = find(b,",",1,true) if bb then if hash[b][a] then -- if settings_to_set(b)[a] then @@ -542,7 +542,7 @@ local function doifinset(a,b) end return end - local bb = find(b,",") + local bb = find(b,",",1,true) if bb then if hash[b][a] then -- if settings_to_set(b)[a] then @@ -565,7 +565,7 @@ local function doifnotinset(a,b) end return end - local bb = find(b,",") + local bb = find(b,",",1,true) if bb then if hash[b][a] then -- if settings_to_set(b)[a] then @@ -652,3 +652,18 @@ implement { -- context(s) -- end -- } + +local bp = number.dimenfactors.bp + +interfaces.implement { + name = "tobigpoints", + actions = function(d) context("%.5F",bp * d) end, + arguments = "dimension", +} + +interfaces.implement { + name = "towholebigpoints", + actions = function(d) context("%r",bp * d) end, + arguments = "dimension", +} + diff --git a/tex/context/base/mkiv/syst-aux.mkiv b/tex/context/base/mkiv/syst-aux.mkiv index eb5b3b90a..77f947753 100644 --- a/tex/context/base/mkiv/syst-aux.mkiv +++ b/tex/context/base/mkiv/syst-aux.mkiv @@ -16,7 +16,7 @@ %D used. After all it's not that urgent and replacing helpers is a delicate process. %D Don't depend on it. -\registerctxluafile{syst-aux}{1.001} +\registerctxluafile{syst-aux}{} % A dedicated primitive \ifvoidmacro\cs == \ifx\cs\empty is some 10% faster but % probably not that noticeable in practice. An \ifvoidtoks might make sense but we @@ -181,7 +181,6 @@ %D These are not needed any more now that we have wide screens (and bytes come %D cheap). - \let\@EA \singleexpandafter \let\@EAEAEA \doubleexpandafter \let\@EAEAEAEAEAEA\tripleexpandafter @@ -282,6 +281,15 @@ %D {\localnext} because we don't want clashes with \type %D {\next}. +\let\next \relax +\let\nextnext \relax +\let\nextnextnext \relax +\let\nexttoken \relax +\let\charactertoken\relax + +\let\m_syst_action_yes\relax +\let\m_syst_action_nop\relax + \unexpanded\def\doifelsenextchar#1#2#3% #1 should not be {} ! {\let\charactertoken=#1% = needed here \def\m_syst_action_yes{#2}% @@ -1073,13 +1081,22 @@ \fi \relax} % this one preserved the next {} +% \def\syst_helpers_do_process_comma_list#1]#2% +% {\global\advance\commalevel \plusone +% \expandafter\def\csname\??nextcommalevel\the\commalevel\endcsname##1,% +% {#2{##1}\syst_helpers_do_process_comma_item}% +% \expandafter\syst_helpers_do_do_process_comma_item\gobbleoneargument#1,]\relax +% \global\advance\commalevel \minusone } + \def\syst_helpers_do_process_comma_list#1]#2% {\global\advance\commalevel \plusone \expandafter\def\csname\??nextcommalevel\the\commalevel\endcsname##1,% {#2{##1}\syst_helpers_do_process_comma_item}% - \expandafter\syst_helpers_do_do_process_comma_item\gobbleoneargument#1,]\relax + \syst_helpers_do_do_process_comma_item_gobble#1,]\relax \global\advance\commalevel \minusone } +\def\syst_helpers_do_do_process_comma_item_gobble#1{\syst_helpers_do_do_process_comma_item} + %D One way of quitting a commalist halfway is: \unexpanded\def\quitcommalist @@ -3090,25 +3107,6 @@ \let\immediatemessage\clf_immediatemessage % {} mandate %D \macros -%D {debuggerinfo} -%D -%D For debugging purposes we can enhance macros with the -%D next alternative. Here \type{debuggerinfo} stands for both -%D a macro accepting two arguments and a boolean (in fact a -%D few macro's too). - -% \newif\ifdebuggerinfo -% -% \unexpanded\def\debuggerinfo#1#2% -% {\ifdebuggerinfo -% \writestatus{debugger}{#1:: #2}% -% \fi} -% -% \ifdefined\writestatus \else \let\writestatus\normalwritestatus \fi - -% % % % % % % % % % % % % % % % % % % % % % % % - -%D \macros %D {rawgetparameters} %D %D A raw and dirty alternative for \type {\getparameters}; no @@ -6102,40 +6100,46 @@ %D \macros %D {ScaledPointsToBigPoints,ScaledPointsToWholeBigPoints} %D -%D One characteristic of \POSTSCRIPT\ and \PDF\ is that both -%D used big points (\TEX's bp). The next macros convert points -%D and scaled points into big points. +%D One characteristic of \POSTSCRIPT\ and \PDF\ is that both used big points (\TEX's +%D bp). The next macros convert points and scaled points into big points. The magic +%D factor $72/72.27$ can be found in most \TEX\ related books. %D %D \starttyping %D \ScaledPointsToBigPoints {number} \target %D \ScaledPointsToWholeBigPoints {number} \target %D \stoptyping %D -%D The magic factor $72/72.27$ can be found in most \TEX\ -%D related books. -% \PointsToBigPoints{10.53940pt}\test \test -% \PointsToBigPoints{10.53941pt}\test \test -% \PointsToBigPoints{10.53942pt}\test \test +%D In pure \TEX: -% \PointsToWholeBigPoints{10.53940pt}\test \test -% \PointsToWholeBigPoints{10.53941pt}\test \test -% \PointsToWholeBigPoints{10.53942pt}\test \test +% \unexpanded\def\PointsToBigPoints#1#2% +% {\edef#2{\withoutpt\the\dimexpr.996264\dimexpr#1\relax\relax}} +% +% \unexpanded\def\PointsToWholeBigPoints#1#2% +% {\edef#2{\the\numexpr\dimexpr.996264\dimexpr#1\relax\relax/\maxcard\relax}} +% +% \unexpanded\def\ScaledPointsToBigPoints#1% % #2 +% {\PointsToBigPoints{\number#1\scaledpoint}} % {#2} +% +% \unexpanded\def\ScaledPointsToWholeBigPoints#1% % #2 +% {\PointsToWholeBigPoints{\number#1\scaledpoint}} % {#2} -\unexpanded\def\PointsToBigPoints#1#2% - {\edef#2{\withoutpt\the\dimexpr.996264\dimexpr#1\relax\relax}} +%D This is slower but cleaner and more accurate too. The only place these are still +%D used is in a few backend related macros. -\unexpanded\def\PointsToWholeBigPoints#1#2% - {\edef#2{\the\numexpr\dimexpr.996264\dimexpr#1\relax\relax/\maxcard\relax}} +\let\tobigpoints \clf_tobigpoints +\let\towholebigpoints\clf_towholebigpoints -\unexpanded\def\ScaledPointsToBigPoints #1{\PointsToBigPoints {\number#1\scaledpoint}} -\unexpanded\def\ScaledPointsToWholeBigPoints#1{\PointsToWholeBigPoints{\number#1\scaledpoint}} +\unexpanded\def\PointsToBigPoints #1#2{\edef#2{\tobigpoints #1}} % can be avoided +\unexpanded\def\PointsToWholeBigPoints #1#2{\edef#2{\towholebigpoints#1}} % can be avoided +\unexpanded\def\ScaledPointsToBigPoints #1#2{\edef#2{\tobigpoints #1\scaledpoint}} % obsolete +\unexpanded\def\ScaledPointsToWholeBigPoints#1#2{\edef#2{\towholebigpoints#1\scaledpoint}} % obsolete %D \macros %D {PointsToReal} %D -%D Points can be stripped from their suffix by using -%D \type{\withoutpt}. The next macro enveloppes this macro. +%D Points can be stripped from their suffix by using \type {\withoutpt}. The next +%D macro enveloppes this macro. %D %D \starttyping %D \PointsToReal {dimension} \target @@ -7476,3 +7480,9 @@ % \appendtovaluelist{mylist}{mies} % % \showvalue{mylist} + +% \unexpanded\def\showtokenlist#1% +% {\begingroup +% \edef\tempstring{\the#1}% +% \tx\ttbf\string#1: \tttf\meaning\tempstring +% \endgroup} diff --git a/tex/context/base/mkiv/syst-con.mkiv b/tex/context/base/mkiv/syst-con.mkiv index 17c407819..afbdf8605 100644 --- a/tex/context/base/mkiv/syst-con.mkiv +++ b/tex/context/base/mkiv/syst-con.mkiv @@ -11,7 +11,7 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\registerctxluafile{syst-con}{1.001} +\registerctxluafile{syst-con}{} \unprotect diff --git a/tex/context/base/mkiv/syst-ini.mkiv b/tex/context/base/mkiv/syst-ini.mkiv index bbc856a5e..4b5cc616b 100644 --- a/tex/context/base/mkiv/syst-ini.mkiv +++ b/tex/context/base/mkiv/syst-ini.mkiv @@ -345,6 +345,11 @@ \newbox \scratchboxfour \newbox \scratchboxfive \newbox \scratchboxsix %D \macros +%D {tempstring} + +\let\tempstring\empty + +%D \macros %D {scratchwidth, scratchheight, scratchdepth, scratchoffset, scratchdistance} %D %D A few more scratch dimensions: @@ -1011,30 +1016,30 @@ % \chardef\pdfnotrapped = 256 % \chardef\pdfnoid = 512 -\def\pdftexversion {\numexpr\pdffeedback version} -\def\pdftexrevision {\pdffeedback revision} -\def\pdflastlink {\numexpr\pdffeedback lastlink} -\def\pdfretval {\numexpr\pdffeedback retval} -\def\pdflastobj {\numexpr\pdffeedback lastobj} -\def\pdflastannot {\numexpr\pdffeedback lastannot} -\def\pdfxformname {\numexpr\pdffeedback xformname} -\def\pdfcreationdate {\pdffeedback creationdate} -\def\pdffontname {\numexpr\pdffeedback fontname} -\def\pdffontobjnum {\numexpr\pdffeedback fontobjnum} -\def\pdffontsize {\dimexpr\pdffeedback fontsize} -\def\pdfpageref {\numexpr\pdffeedback pageref} -\def\pdfcolorstackinit {\pdffeedback colorstackinit} - -\let\pdfxform \saveboxresource -\let\pdflastxform \lastsavedboxresourceindex -\let\pdfrefxform \useboxresource -\let\pdfximage \saveimageresource -\let\pdflastximage \lastsavedimageresourceindex -\let\pdflastximagepages \lastsavedimageresourcepages -\let\pdfrefximage \useimageresource -\let\pdfsavepos \savepos -\let\pdflastxpos \lastxpos -\let\pdflastypos \lastypos +\def\pdftexversion {\numexpr\pdffeedback version\relax} +\def\pdftexrevision {\pdffeedback revision} +\def\pdflastlink {\numexpr\pdffeedback lastlink\relax} +\def\pdfretval {\numexpr\pdffeedback retval\relax} +\def\pdflastobj {\numexpr\pdffeedback lastobj\relax} +\def\pdflastannot {\numexpr\pdffeedback lastannot\relax} +\def\pdfxformname {\numexpr\pdffeedback xformname\relax} +\def\pdfcreationdate {\pdffeedback creationdate} +\def\pdffontname {\numexpr\pdffeedback fontname\relax} +\def\pdffontobjnum {\numexpr\pdffeedback fontobjnum\relax} +\def\pdffontsize {\dimexpr\pdffeedback fontsize\relax} +\def\pdfpageref {\numexpr\pdffeedback pageref\relax} +\def\pdfcolorstackinit {\pdffeedback colorstackinit} + +\let\pdfxform \saveboxresource +\let\pdflastxform \lastsavedboxresourceindex +\let\pdfrefxform \useboxresource +\let\pdfximage \saveimageresource +\let\pdflastximage \lastsavedimageresourceindex +\let\pdflastximagepages \lastsavedimageresourcepages +\let\pdfrefximage \useimageresource +\let\pdfsavepos \savepos +\let\pdflastxpos \lastxpos +\let\pdflastypos \lastypos \edef\pdfcompresslevel {\pdfvariable compresslevel} \pdfcompresslevel \plusnine \edef\pdfobjcompresslevel {\pdfvariable objcompresslevel} \pdfobjcompresslevel \plusone @@ -1050,6 +1055,7 @@ \edef\pdfinclusionerrorlevel {\pdfvariable inclusionerrorlevel} \pdfinclusionerrorlevel \zerocount \edef\pdfgentounicode {\pdfvariable gentounicode} \pdfgentounicode \plusone \edef\pdfpagebox {\pdfvariable pagebox} \pdfpagebox \zerocount +\edef\pdfmajorversion {\pdfvariable majorversion} % \pdfmajorversion \plusone \edef\pdfminorversion {\pdfvariable minorversion} \pdfminorversion \plusseven \edef\pdfuniqueresname {\pdfvariable uniqueresname} \pdfuniqueresname \zerocount \edef\pdfhorigin {\pdfvariable horigin} \pdfhorigin 1in @@ -1095,16 +1101,28 @@ \def\modulonumber#1#2{\the\numexpr#2-((((#2+(#1/2))/#1)-1)*#1)\relax} \def\dividenumber#1#2{\the\numexpr(#2-(#1/2))/#1\relax} -\def \texenginename {LuaTeX} -\edef\texengineversion{\dividenumber{100}\luatexversion.\modulonumber{100}\luatexversion.\luatexrevision} +\ifdefined\texenginename \else + %edef\texenginename{luatex} + \edef\texenginename{\directlua{tex.print(LUATEXENGINE)}} +\fi + +\ifdefined\texengineversion \else + %edef\texengineversion{\dividenumber{100}\luatexversion.\modulonumber{100}\luatexversion.\luatexrevision} + \edef\texengineversion{\directlua{tex.print(LUATEXVERSION)}} +\fi + +\ifdefined\texenginefunctionality \else + \edef\texenginefunctionality{\directlua{tex.print(LUATEXFUNCTIONALITY)}} +\fi %D We have no reason not to enable this: \savingvdiscards\plusone -%D We only can set this one via directives (system.synctex). +%D We only can set this one via directives (system.synctex) and we only support +%D the context variant. -\let\synctex\undefined \newcount\synctex +\let\synctex\undefined \newcount\synctex \let\normalsynctex\synctex %D We get rid of the funny \TEX\ offset defaults of one inch by setting them to zero. @@ -1156,22 +1174,26 @@ %D It makes more sense to have these here: -\let\normalsuperscript\Usuperscript -\let\normalsubscript \Usubscript -\let\normalstartimath \Ustartmath -\let\normalstopimath \Ustopmath -\let\normalstartdmath \Ustartdisplaymath -\let\normalstopdmath \Ustopdisplaymath +\let\normalsuperscript \Usuperscript +\let\normalsubscript \Usubscript +\let\normalnosuperscript\Unosuperscript +\let\normalnosubscript \Unosubscript +\let\normalstartimath \Ustartmath +\let\normalstopimath \Ustopmath +\let\normalstartdmath \Ustartdisplaymath +\let\normalstopdmath \Ustopdisplaymath %D For now: \ifdefined\protrusionboundary \else \let\protrusionboundary\boundary \fi \ifdefined\wordboundary \else \let\wordboundary \noboundary \fi -\ifdefined\mathrulesfam \else \newcount\mathrulesfam \fi -\ifdefined\mathrulesmode \else \newcount\mathrulesmode \fi -\ifdefined\mathsurroundmode \else \newcount\mathsurroundmode \fi -\ifdefined\mathitalicsmode \else \newcount\mathitalicsmode \fi +\ifdefined\mathrulesfam \else \newcount\mathrulesfam \fi +\ifdefined\mathrulesmode \else \newcount\mathrulesmode \fi +\ifdefined\mathsurroundmode \else \newcount\mathsurroundmode \fi +\ifdefined\mathitalicsmode \else \newcount\mathitalicsmode \fi +\ifdefined\mathdelimitersmode \else \newcount\mathdelimitersmode \fi +\ifdefined\mathscriptboxmode \else \newcount\mathscriptboxmode \fi \ifdefined\hyphenpenaltymode \else \newcount\hyphenpenaltymode \fi \ifdefined\automatichyphenpenalty \else \newcount\automatichyphenpenalty \fi @@ -1181,4 +1203,10 @@ \ifdefined\explicitdiscretionary \else \let\explicitdiscretionary \- \fi \ifdefined\automaticdiscretionary \else \def\automaticdiscretionary{\Uchar\exhyphenchar} \fi +\ifdefined\mathpenaltiesmode \else \newcount\mathpenaltiesmode \fi +\ifdefined\prebinoppenalty \else \newcount\prebinoppenalty \fi +\ifdefined\prerelpenalty \else \newcount\prerelpenalty \fi + +\ifdefined\breakafterdirmode \else \newcount\breakafterdirmode \fi + \protect \endinput diff --git a/tex/context/base/mkiv/syst-lua.lua b/tex/context/base/mkiv/syst-lua.lua index ee3b8c327..35cd22123 100644 --- a/tex/context/base/mkiv/syst-lua.lua +++ b/tex/context/base/mkiv/syst-lua.lua @@ -6,8 +6,7 @@ if not modules then modules = { } end modules ['syst-lua'] = { license = "see context related readme files" } -local find, match = string.find, string.match -local tonumber = tonumber +local find = string.find local S, C, P, lpegmatch, lpegtsplitat = lpeg.S, lpeg.C, lpeg.P, lpeg.match, lpeg.tsplitat commands = commands or { } diff --git a/tex/context/base/mkiv/syst-lua.mkiv b/tex/context/base/mkiv/syst-lua.mkiv index b5001ab62..ca5f9679f 100644 --- a/tex/context/base/mkiv/syst-lua.mkiv +++ b/tex/context/base/mkiv/syst-lua.mkiv @@ -11,7 +11,7 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\registerctxluafile{syst-lua}{1.001} +\registerctxluafile{syst-lua}{} \unprotect diff --git a/tex/context/base/mkiv/tabl-frm.mkiv b/tex/context/base/mkiv/tabl-frm.mkiv index 639d6f06d..c0f4b7cd1 100644 --- a/tex/context/base/mkiv/tabl-frm.mkiv +++ b/tex/context/base/mkiv/tabl-frm.mkiv @@ -134,6 +134,56 @@ {\framedparameter\c!after \endgroup} +% \unexpanded\def\startframedrow +% {\advance\c_tabl_framed_r\plusone +% \c_tabl_framed_c\zerocount +% \d_tabl_framed_h\zeropoint +% \bgroup +% \edef\currentframed{\number\c_tabl_framed_r}% +% \edef\currentframed +% {\??framedtablerow\currentframedtable +% \ifcsname\??framedtablerow\currentframedtable:\currentframed\endcsname +% :\currentframed +% \else\ifcsname\??framedtablerow\currentframedtable:\v!each\endcsname +% :\v!each +% \fi\fi}% +% \dosingleempty\pack_framed_start_framed_nop_indeed} +% +% \unexpanded\def\stopframedrow +% {\dofastloopcs\c_tabl_framed_c\tabl_framed_flush_row +% \stopframed +% \nointerlineskip +% \vskip\zeropoint\relax +% \framedparameter\c!inbetween} +% +% \unexpanded\def\tabl_framed_flush_row +% {\vpack to \d_tabl_framed_h{\flushbox\??framedtable{\number\fastloopindex}\vfill}% +% \ifdim\d_tabl_framed_d=\zeropoint\else\kern\d_tabl_framed_d\fi} +% +% \unexpanded\def\startframedcell +% {\advance\c_tabl_framed_c\plusone +% \setbox\b_tabl_framed\hpack\bgroup +% %\bgroup +% \edef\currentframed{\number\c_tabl_framed_c}% +% \edef\currentframed +% {\??framedtablecolumn\currentframedtable +% \ifcsname\??framedtablecolumn\currentframedtable:\currentframed\endcsname +% :\currentframed +% \else\ifcsname\??framedtablecolumn\currentframedtable:\v!each\endcsname +% :\v!each +% \fi\fi}% +% \dosingleempty\pack_framed_start_framed_nop_indeed} +% +% \unexpanded\def\stopframedcell +% {\stopframed +% %\egroup +% \ifdim\ht\b_tabl_framed>\d_tabl_framed_h +% \d_tabl_framed_h\ht\b_tabl_framed +% \fi +% \savebox\??framedtable{\number\c_tabl_framed_c}{\box\b_tabl_framed}} + +% a two pass variant that deals with the height .. so no catcode changes here + \unexpanded\def\startframedrow {\advance\c_tabl_framed_r\plusone \c_tabl_framed_c\zerocount @@ -160,6 +210,52 @@ {\vpack to \d_tabl_framed_h{\flushbox\??framedtable{\number\fastloopindex}\vfill}% \ifdim\d_tabl_framed_d=\zeropoint\else\kern\d_tabl_framed_d\fi} +\newcount\c_tabl_framed_pass + +\let\stopframedrow\relax + +\unexpanded\def\startframedrow#1\stopframedrow + {\advance\c_tabl_framed_r\plusone + \startframedrow_one#1\stopframedrow_one + \startframedrow_two#1\stopframedrow_two} + +\def\startframedrow_one + {\bgroup + \c_tabl_framed_pass\plusone + \c_tabl_framed_c\zerocount + \d_tabl_framed_h\zeropoint + \settrialtypesetting + \gobblesingleempty} + +\unexpanded\def\stopframedrow_one + {\normalexpanded{\egroup\d_tabl_framed_h\the\d_tabl_framed_h\relax}} + +\def\startframedrow_two + {\bgroup + \c_tabl_framed_c\zerocount + \c_tabl_framed_pass\plustwo + \edef\currentframed{\number\c_tabl_framed_r}% + \edef\currentframed + {\??framedtablerow\currentframedtable + \ifcsname\??framedtablerow\currentframedtable:\currentframed\endcsname + :\currentframed + \else\ifcsname\??framedtablerow\currentframedtable:\v!each\endcsname + :\v!each + \fi\fi}% + \dosingleempty\pack_framed_start_framed_nop_indeed} + +\unexpanded\def\stopframedrow_two + {\dofastloopcs\c_tabl_framed_c\tabl_framed_flush_row + \stopframed + \nointerlineskip + \vskip\zeropoint\relax + \framedparameter\c!inbetween} + +\unexpanded\def\tabl_framed_flush_row_two + {\vpack to \d_tabl_framed_h{\flushbox\??framedtable{\number\fastloopindex}\vfill}% + \ifdim\d_tabl_framed_d=\zeropoint\else\kern\d_tabl_framed_d\fi} + + \unexpanded\def\startframedcell {\advance\c_tabl_framed_c\plusone \setbox\b_tabl_framed\hpack\bgroup @@ -172,15 +268,26 @@ \else\ifcsname\??framedtablecolumn\currentframedtable:\v!each\endcsname :\v!each \fi\fi}% + \ifcase\c_tabl_framed_pass + \or + \letframedparameter\c!background\empty + \letframedparameter\c!frame\v!off + \or + \letframedparameter\c!height\d_tabl_framed_h + \fi \dosingleempty\pack_framed_start_framed_nop_indeed} \unexpanded\def\stopframedcell {\stopframed %\egroup - \ifdim\ht\b_tabl_framed>\d_tabl_framed_h - \d_tabl_framed_h\ht\b_tabl_framed - \fi - \savebox\??framedtable{\number\c_tabl_framed_c}{\box\b_tabl_framed}} + \ifcase\c_tabl_framed_pass + \or + \ifdim\ht\b_tabl_framed>\d_tabl_framed_h + \d_tabl_framed_h\ht\b_tabl_framed + \fi + \else + \savebox\??framedtable{\number\c_tabl_framed_c}{\box\b_tabl_framed}% + \fi} \protect \endinput diff --git a/tex/context/base/mkiv/tabl-mis.mkiv b/tex/context/base/mkiv/tabl-mis.mkiv index 8db31b31d..b2af1993e 100644 --- a/tex/context/base/mkiv/tabl-mis.mkiv +++ b/tex/context/base/mkiv/tabl-mis.mkiv @@ -106,10 +106,11 @@ \installcorenamespace{paragraphs} -\installcommandhandler \??paragraphs {paragraphs} \??paragraphs +\installframedcommandhandler \??paragraphs {paragraphs} \??paragraphs \setupparagraphs [\c!n=3, + \c!offset=\zeropoint, \c!before=\blank, \c!after=\blank, \c!distance=\emwidth, @@ -123,6 +124,7 @@ \c!rulecolor=, \c!style=, \c!color=, + \c!frame=\v!off, \c!top=\vss, \c!bottom=\vfill] @@ -163,13 +165,14 @@ \unexpanded\def\startparagraphs[#1]% quite slow {\bgroup % (1) \edef\currentparagraphs{#1}% - \paragraphsparameter\c!before + % \paragraphsparameter\c!before \edef\p_width{\paragraphsparameter\c!width}% \ifx\p_width\empty \d_typo_paragraphs_width\availablehsize \else \d_typo_paragraphs_width\p_width\relax \fi + \advance\d_typo_paragraphs_width-2\dimexpr\paragraphsparameter\c!offset\relax \c_typo_paragraphs_max\paragraphsparameter\c!n\relax \d_typo_paragraphs_auto\d_typo_paragraphs_width\relax \scratchcounter\zerocount @@ -191,9 +194,14 @@ \parindent\zeropoint \c_typo_paragraphs_n\zerocount \let\\=\typo_paragraphs_next % downward compatible - \dontleavehmode\hbox + \edef\p_offset{\paragraphsparameter\c!offset}% + \doifelsedimension\p_offset + {\scratchoffset\p_offset}% + {\scratchoffset\zeropoint}% + \setbox\scratchbox\hpack \bgroup % (2) \forgetall + \advance\hsize-2\scratchoffset \let\typo_paragraphs_start_cell\typo_paragraphs_start_cell_indeed \let\typo_paragraphs_stop_cell \typo_paragraphs_stop_cell_indeed \typo_paragraphs_start_cell_indeed} @@ -201,6 +209,9 @@ \unexpanded\def\stopparagraphs {\stopparagraphscell \egroup % (2) + \letparagraphsparameter\c!align\v!flushleft % normal + \paragraphsparameter\c!before + \dontleavehmode\inheritedparagraphsframed{\box\scratchbox}% \paragraphsparameter\c!after \egroup} % (1) diff --git a/tex/context/base/mkiv/tabl-ntb.mkiv b/tex/context/base/mkiv/tabl-ntb.mkiv index 276f85d31..9acf2ef36 100644 --- a/tex/context/base/mkiv/tabl-ntb.mkiv +++ b/tex/context/base/mkiv/tabl-ntb.mkiv @@ -331,6 +331,20 @@ \def\tabl_ntb_col_doif #1#2{\ifcsname\??naturaltablecol\m_tabl_tbl_level:\number#1:\number#2\endcsname\expandafter\firstofoneargument \else\expandafter\gobbleoneargument \fi} \def\tabl_ntb_col_doifnot #1#2{\ifcsname\??naturaltablecol\m_tabl_tbl_level:\number#1:\number#2\endcsname\expandafter\gobbleoneargument \else\expandafter\firstofoneargument \fi} +%D If we ever run into memory issues we can do: +% +% \def\tabl_ntb_let_tag#1#2#3% +% {\ifx#3\c_tabl_ntb_none\else +% \expandafter\let\csname\??naturaltabletag\m_tabl_tbl_level:\number#1:\number#2\endcsname#3% +% \fi} +% +% \def\tabl_ntb_get_tag#1#2% +% {\ifcsname\??naturaltabletag\m_tabl_tbl_level:\number#1:\number#2\endcsname +% \lastnamedcs +% \else +% \c_tabl_ntb_none +% \fi} + % not used % % \def\tabl_ntb_tag_state#1#2{\ifcsname\??naturaltabletag\m_tabl_tbl_level:\number#1:\number#2\endcsname\zerocount\else\plusone\fi} @@ -383,7 +397,12 @@ \newif\iftightTBLrowspan \tightTBLrowspantrue \newif\iftightTBLcolspan \tightTBLcolspanfalse -\newif\iftraceTABLE \traceTABLEfalse +\newconditional \c_tabl_ntb_trace_widths + +\installtextracker + {tables.natural.widths} + {\settrue \c_tabl_ntb_trace_widths} + {\setfalse\c_tabl_ntb_trace_widths} % so far @@ -1446,8 +1465,8 @@ % case: nc=maxcolumns \else \scratchdimen\tabl_ntb_get_hei{#1}% - \setbox\scratchbox\hbox - {\lower\ht\scratchbox\hbox{\raise\scratchdimen\box\scratchbox}}% + \setbox\scratchbox\hpack + {\lower\ht\scratchbox\hpack{\raise\scratchdimen\box\scratchbox}}% \ht\scratchbox\scratchdimen \fi \dp\scratchbox\zeropoint @@ -1485,19 +1504,21 @@ \let\tabl_ntb_preroll\relax -\def\tabl_ntb_table_get_max_width#1#2% - {#1\wd#2\relax} +\def\tabl_ntb_table_get_max_width + {\scratchdimen\wd\scratchbox\relax} -% first needs testing (in projects): -% -% \def\tabl_ntb_table_get_max_width#1#2% -% {#1\zeropoint -% \dorecurse\c_tabl_ntb_maximum_col -% {\advance#1\tabl_ntb_get_wid\recurselevel -% \advance#1\tabl_ntb_get_dis\recurselevel}% -% \ifdim#1<\wd#2\relax -% #1\wd#2\relax -% \fi} +% enable dper 2018-02-22 + +\def\tabl_ntb_table_get_max_width_step + {\advance\scratchdimen\tabl_ntb_get_wid\fastloopindex + \advance\scratchdimen\tabl_ntb_get_dis\fastloopindex} + +\def\tabl_ntb_table_get_max_width + {\scratchdimen\zeropoint + \dofastloopcs\c_tabl_ntb_maximum_col\tabl_ntb_table_get_max_width_step + \ifdim\scratchdimen<\wd\scratchbox\relax + \scratchdimen\wd\scratchbox\relax + \fi} \def\tabl_ntb_table_stop {\forgetall % new, here see narrower-004.tex @@ -1534,7 +1555,7 @@ \fi \tabl_ntb_let_dis\c_tabl_ntb_maximum_col\zeropoint % - \tabl_ntb_table_get_max_width\scratchdimen\scratchbox + \tabl_ntb_table_get_max_width % \scratchdimen\scratchbox % \ifautoTBLspread % experimental, stretch non fixed cells to \hsize @@ -1656,10 +1677,10 @@ \ifmultipleTBLheads \dorecurse\c_tabl_ntb_n_of_head_lines {\setbox\scratchbox\vsplit\tsplitcontent to \lineheight - \setbox\tsplithead\vbox{\unvcopy\tsplithead\unvcopy\scratchbox}}% + \setbox\tsplithead\vbox{\unvcopy\tsplithead\unvcopy\scratchbox}}% \vpack ? \dorecurse\c_tabl_ntb_n_of_next_lines {\setbox\scratchbox\vsplit\tsplitcontent to \lineheight - \setbox\tsplitnext\vbox{\unvcopy\tsplitnext\unvcopy\scratchbox}}% + \setbox\tsplitnext\vbox{\unvcopy\tsplitnext\unvcopy\scratchbox}}% \vpack ? \fi \edef\p_spaceinbetween{\naturaltablelocalparameter\c!spaceinbetween}% \ifx\p_spaceinbetween\empty\else @@ -1682,7 +1703,7 @@ \def\tabl_ntb_check_widths_two{\tabl_ntb_check_widths_indeed\plusone } % 1 = real run \def\tabl_ntb_check_widths_indeed#1% - {\iftraceTABLE\tabl_ntb_show_widths B#1\fi + {\ifconditional\c_tabl_ntb_trace_widths\tabl_ntb_show_widths B#1\fi \!!counta\zerocount \!!dimena\dimexpr \hsize @@ -1715,7 +1736,7 @@ \fi \fi \fi}% - \iftraceTABLE\tabl_ntb_show_widths M#1\fi + \ifconditional\c_tabl_ntb_trace_widths\tabl_ntb_show_widths M#1\fi \ifcase\!!counta \else \divide\!!dimena \!!counta \fi \dorecurse\c_tabl_ntb_maximum_col {\scratchdimen\tabl_ntb_get_wid\recurselevel\relax @@ -1728,7 +1749,7 @@ \tabl_ntb_set_wid\recurselevel{\the\!!dimena}% \fi \fi}% - \iftraceTABLE\tabl_ntb_show_widths E#1\fi} + \ifconditional\c_tabl_ntb_trace_widths\tabl_ntb_show_widths E#1\fi} \def\tabl_ntb_check_heights_one_indeed {\!!countb\tabl_ntb_get_row\c_tabl_ntb_current_row_three\c_tabl_ntb_current_col_three\relax diff --git a/tex/context/base/mkiv/tabl-tab.mkiv b/tex/context/base/mkiv/tabl-tab.mkiv index 76f7f76c3..54b18a385 100644 --- a/tex/context/base/mkiv/tabl-tab.mkiv +++ b/tex/context/base/mkiv/tabl-tab.mkiv @@ -1605,11 +1605,11 @@ \setbox\tsplitcontent\box#1% \ifconditional\c_tabl_table_repeat_head \ifconditional\hassometablehead \setbox\tsplithead\vsplit\tsplitcontent to \lineheight - \setbox\tsplithead\vbox{\unvbox\tsplithead}% + \setbox\tsplithead\vbox{\unvbox\tsplithead}% \vpack ? \fi \fi \ifconditional\c_tabl_table_repeat_tail \ifconditional\hassometabletail \setbox\tsplittail\vsplit\tsplitcontent to \lineheight - \setbox\tsplittail\vbox{\unvbox\tsplittail}% + \setbox\tsplittail\vbox{\unvbox\tsplittail}% \vpack ? \fi \fi \ifinsidefloat\else \def\tsplitbeforeresult{\startbaselinecorrection}% diff --git a/tex/context/base/mkiv/tabl-tbl.mkiv b/tex/context/base/mkiv/tabl-tbl.mkiv index b21771009..7a0d2c8a8 100644 --- a/tex/context/base/mkiv/tabl-tbl.mkiv +++ b/tex/context/base/mkiv/tabl-tbl.mkiv @@ -15,7 +15,7 @@ \unprotect -\registerctxluafile{tabl-tbl.lua}{1.001} % experiment +\registerctxluafile{tabl-tbl}{} % experiment %D I can probably reimplement this using a \LUATEX\ combination %D but it does not pay of in development time. If I need something @@ -168,6 +168,7 @@ \newcount \c_tabl_tabulate_plines_min \newcount \c_tabl_tabulate_plines_max \newcount \c_tabl_tabulate_max_colorcolumn +\newcount \c_tabl_tabulate_max_vrulecolumn \newcount \c_tabl_tabulate_repeathead \newcount \c_tabl_tabulate_noflines \newcount \c_tabl_tabulate_totalnoflines @@ -216,6 +217,7 @@ \newconstant \c_tabl_tabulate_pass \newconstant \c_tabl_tabulate_type +\newconstant \c_tabl_tabulate_kind % 1=strong 2=equals \newconstant \c_tabl_tabulate_splitlinemode \c_tabl_tabulate_splitlinemode\plusone \newconstant \c_tabl_tabulate_colorspan \newconstant \c_tabl_tabulate_localcolorspan @@ -225,7 +227,6 @@ \let \m_tabl_tabulate_separator_factor \empty % fraction -\newif \iftracetabulate % will become a tracker \newtoks \everytabulatepar % where used ? \newtoks \everytabulate % public ? @@ -243,6 +244,7 @@ \installcorenamespace{tabulateheader} \installcorenamespace{tabulatealigning} \installcorenamespace{tabulatepreamble} +\installcorenamespace{tabulatevrule} \installcorenamespace{tabulatehead} \installcorenamespace{tabulatefoot} @@ -262,12 +264,6 @@ \expandafter\tabl_tabulate_initialize_boxes_step \fi} -% \def\tabl_tabulate_initialize_box#1% also used elsewhere -% {\ifcsname\??tabulatebox\number#1\endcsname -% \tabl_tabulate_initialize_box_yes#1% -% \else -% \tabl_tabulate_initialize_box_nop#1% -% \fi} \def\tabl_tabulate_initialize_box#1% also used elsewhere {\ifcsname\??tabulatebox\number#1\endcsname \tabl_tabulate_initialize_box_yes @@ -275,7 +271,6 @@ \tabl_tabulate_initialize_box_nop#1% \fi} -%def\tabl_tabulate_initialize_box_yes#1{\global \setbox\csname\??tabulatebox\number#1\endcsname\emptybox} \def\tabl_tabulate_initialize_box_yes {\global \setbox\lastnamedcs\emptybox} \def\tabl_tabulate_initialize_box_nop#1{\expandafter\newbox\csname\??tabulatebox\number#1\endcsname} @@ -312,11 +307,16 @@ \kern-\linewidth \tabl_tabulate_break_no} +\installtextracker + {tables.tabulate.breaks} + {\let\tabl_tabulate_break_no_tracer\tabl_tabulate_nobreak_inject_tracer} + {\let\tabl_tabulate_break_no_tracer\donothing} + +\let\tabl_tabulate_break_no_tracer\donothing + \def\tabl_tabulate_nobreak_inject_indeed {\tabl_tabulate_break_no - \iftracetabulate - \tabl_tabulate_nobreak_inject_tracer - \fi} + \tabl_tabulate_break_no_tracer} \def\tabl_tabulate_nobreak_inject {\tabulatenoalign{\tabl_tabulate_nobreak_inject_indeed}} @@ -1037,6 +1037,7 @@ \appendtoks \setuevalue{\e!start\currenttabulation}{\tabl_start_defined[\currenttabulation]}% + \letvalue{\e!stop\currenttabulation}\relax \letvalue{\??tabulatehead\currenttabulation}\empty \letvalue{\??tabulatefoot\currenttabulation}\empty \to \everydefinetabulation @@ -1076,7 +1077,7 @@ %\expandafter\ifx\lastnamedcs\empty \let\tabl_tabulate_insert_foot\empty \else - \let\tabl_tabulate_insert_foot\tabl_tabulate_insert_head_content + \let\tabl_tabulate_insert_foot\tabl_tabulate_insert_foot_content \fi \else \let\tabl_tabulate_insert_foot\empty @@ -1200,7 +1201,7 @@ \unexpanded\def\tabl_tabulate_start_ignore {\em Nested tabulate is not (yet) supported.\relax - \expandafter\gobbleuntil\csname\e!stop\v!tabulate\endcsname} + \expandafter\gobbleuntil\csname\ifconditional\c_tabl_generic stoptabulate\else\e!stop\v!tabulate\fi\endcsname} \appendtoks \letvalue{\e!start\v!tabulate}\tabl_tabulate_start_ignore % only the main one @@ -1341,12 +1342,18 @@ \d_tabl_tabulate_indent\dimexpr\leftskip+\hangindent\ifx\p_indenting\v!yes+\parindent\fi\relax \global\c_tabl_tabulate_column\zerocount \processcontent - {\e!stop\ifx\currenttabulationparent\empty\v!tabulate\else\currenttabulationparent\fi} + {\ifconditional\c_tabl_generic stoptabulate\else\e!stop\ifx\currenttabulationparent\empty\v!tabulate\else\currenttabulationparent\fi\fi} \tabl_tabulate_insert_body \tabl_tabulate_process} \def\tabulateEQ - {\ifconditional\c_tabl_tabulate_firstflushed\else\tabulationparameter{EQ}\fi + {\ifconditional\c_tabl_tabulate_firstflushed\else + \dostarttaggedchained\t!ignore\empty\empty + \dostarttagged\t!ignore\empty + \tabulationparameter{EQ}% + \dostoptagged + \dostoptagged + \fi \global\setfalse\c_tabl_tabulate_equal} % The next ones will be token registers @@ -1420,55 +1427,106 @@ \doifelsefastoptionalcheck{\tabl_tabulate_set_color_column_yes#1}{\tabl_tabulate_set_color_column_nop#1}} \def\tabl_tabulate_set_color_column_nop - {\tabl_tabulate_column_normal} + {\tabl_tabulate_column_normal\zerocount} \def\tabl_tabulate_set_color_column_yes#1[#2]% {\xdef\m_tabl_tabulate_color_local{#2}% - \tabl_tabulate_column_normal#1} + \tabl_tabulate_column_normal\zerocount#1} % normal columns: -\def\tabl_tabulate_column_normal#1% +% \def\tabl_tabulate_column_normal#1#2% +% {\unskip +% \aligntab +% \ifconditional\c_tabl_tabulate_equal\tabulateequalpos\else\tabulatenormalpos\fi +% \aligntab +% \global\c_tabl_tabulate_kind#1% +% \global\c_tabl_tabulate_type#2% +% \aligntab} + +\def\tabl_tabulate_column_normal#1#2% {\unskip \aligntab \ifconditional\c_tabl_tabulate_equal\tabulateequalpos\else\tabulatenormalpos\fi + \ifnum\c_tabl_tabulate_column>\c_tabl_tabulate_max_vrulecolumn\else + \tabl_tabulate_column_vrule_setup + \fi \aligntab - \global\c_tabl_tabulate_type#1% + \global\c_tabl_tabulate_kind#1% + \global\c_tabl_tabulate_type#2% \aligntab} % equal columns -\def\tabl_tabulate_column_equal#1% +\def\tabl_tabulate_column_equal#1#2% {\unskip \aligntab \tabulateequalpos - \aligntab\global\c_tabl_tabulate_type#1% + \aligntab + \global\c_tabl_tabulate_kind#1% + \global\c_tabl_tabulate_type#2% \aligntab} % ruled columns -\def\tabl_tabulate_column_vruled#1% +\def\tabl_tabulate_column_vruled_preset + {\global\let\m_tabl_tabulate_vrule_color_local\m_tabl_tabulate_vrule_color_default + \global\d_tabl_tabulate_vrulethickness_local\d_tabl_tabulate_vrulethickness_default} + +\def\tabl_tabulate_column_vruled#1#2% {\unskip % 0-n -% \ifnum\c_tabl_tabulate_column=\plusone -% \global\c_tabl_tabulate_has_rule_spec_first\plusone -% \else\ifnum\c_tabl_tabulate_column=\c_tabl_tabulate_nofcolumns -% \global\c_tabl_tabulate_has_rule_spec_last\plusone -% \fi\fi - \global\let\m_tabl_tabulate_vrule_color_local\m_tabl_tabulate_vrule_color_default - \global\d_tabl_tabulate_vrulethickness_local\d_tabl_tabulate_vrulethickness_default - \doifelsefastoptionalcheck{\tabl_tabulate_column_vruled_yes#1}{\tabl_tabulate_column_vruled_nop#1}} + %\ifnum\c_tabl_tabulate_column=\plusone + % \global\c_tabl_tabulate_has_rule_spec_first\plusone + %\else\ifnum\c_tabl_tabulate_column=\c_tabl_tabulate_nofcolumns + % \global\c_tabl_tabulate_has_rule_spec_last\plusone + %\fi\fi + \ifnum\c_tabl_tabulate_column>\c_tabl_tabulate_max_vrulecolumn + \global\c_tabl_tabulate_max_vrulecolumn\c_tabl_tabulate_column + \fi + \doifelsefastoptionalcheck{\tabl_tabulate_column_vruled_yes#1#2}{\tabl_tabulate_column_vruled_nop#1#2}} + +\def\tabl_tabulate_column_vrule_setup + {\begincsname\??tabulatevrule\the\c_tabl_tabulate_column\endcsname} \def\tabl_tabulate_column_vruled_nop - {\tabl_tabulate_column_normal} + {\expandafter\glet\csname\??tabulatevrule\the\c_tabl_tabulate_column\endcsname\tabl_tabulate_column_vruled_preset + \tabl_tabulate_column_normal} \def\tabl_tabulate_column_vruled_step#1% {\doifelsenumber{#1} {\global\d_tabl_tabulate_vrulethickness_local#1\d_tabl_tabulate_vrulethickness_default} {\xdef\m_tabl_tabulate_vrule_color_local{#1}}} -\def\tabl_tabulate_column_vruled_yes#1[#2]% - {\rawprocesscommalist[#2]\tabl_tabulate_column_vruled_step - \tabl_tabulate_column_normal#1} +\def\tabl_tabulate_column_vruled_yes#1#2[#3]% + {\expandafter\gdef\csname\??tabulatevrule\the\c_tabl_tabulate_column\endcsname + {\tabl_tabulate_column_vruled_preset + \rawprocesscommalist[#3]\tabl_tabulate_column_vruled_step}% + \tabl_tabulate_column_normal#1#2} + +\def\tabl_tabulate_vrule_reset + {\ifcase\c_tabl_tabulate_max_vrulecolumn\else + \tabl_tabulate_vrule_reset_indeed + \fi} + +\def\tabl_tabulate_vrule_reset_indeed + {\dofastloopcs\c_tabl_tabulate_max_vrulecolumn\tabl_tabulate_vrule_reset_step + \global\c_tabl_tabulate_max_vrulecolumn\zerocount} + +\def\tabl_tabulate_vrule_reset_step % undefined or relax + {\global\expandafter\let\csname\??tabulatevrule\the\fastloopindex\endcsname\undefined} + +\appendtoks + \tabl_tabulate_vrule_reset +\to \t_tabl_tabulate_every_after_row + +% sometimes more efficient: +% +% \def\tabl_tabulate_column_vruled_yes#1#2[#3]% +% {\rawprocesscommalist[#3]\tabl_tabulate_column_vruled_step +% \expandafter\xdef\csname\??tabulatevrule\the\c_tabl_tabulate_column\endcsname +% {\global\d_tabl_tabulate_vrulethickness_local\the\d_tabl_tabulate_vrulethickness_default +% \noexpand\xdef\noexpand\m_tabl_tabulate_vrule_color_local{\m_tabl_tabulate_vrule_color_local}}% +% \tabl_tabulate_column_normal#1#2} \def\tabl_tabulate_column_vruled_normal {\vrule\s!width\d_tabl_tabulate_vrulethickness\relax} @@ -1506,7 +1564,7 @@ % auto columns \def\tabl_tabulate_column_inject_auto - {\tabl_tabulate_column_normal\zerocount + {\tabl_tabulate_column_normal\zerocount\zerocount \ifnum\c_tabl_tabulate_column>\c_tabl_tabulate_columns\relax \expandafter\NR \else @@ -1633,7 +1691,7 @@ \ifnum\c_tabl_tabulate_column>\c_tabl_tabulate_max_colorcolumn \global\c_tabl_tabulate_max_colorcolumn\c_tabl_tabulate_column \fi - \setxvalue{\??tabulatecolor\the\c_tabl_tabulate_column}{#1}% + \global\expandafter\xdef\csname\??tabulatecolor\the\c_tabl_tabulate_column\endcsname{#1}% \hbox \thealignbackgroundcolorattr{#1}{}% pack ? \endgroup} @@ -1802,22 +1860,22 @@ % so far -\unexpanded\def\tabl_tabulate_VL_first{\tabl_tabulate_column_vruled\zerocount} -\unexpanded\def\tabl_tabulate_NC_first{\tabl_tabulate_column_normal\zerocount} -\unexpanded\def\tabl_tabulate_RC_first{\tabl_tabulate_column_normal\plusone} -\unexpanded\def\tabl_tabulate_HC_first{\tabl_tabulate_column_normal\plustwo} -\unexpanded\def\tabl_tabulate_EQ_first{\tabl_tabulate_column_equal \zerocount} -\unexpanded\def\tabl_tabulate_RQ_first{\tabl_tabulate_column_equal \plusone} -\unexpanded\def\tabl_tabulate_HQ_first{\tabl_tabulate_column_equal \plustwo} +\unexpanded\def\tabl_tabulate_VL_first{\tabl_tabulate_column_vruled\zerocount\zerocount} +\unexpanded\def\tabl_tabulate_NC_first{\tabl_tabulate_column_normal\zerocount\zerocount} +\unexpanded\def\tabl_tabulate_RC_first{\tabl_tabulate_column_normal\zerocount\plusone} +\unexpanded\def\tabl_tabulate_HC_first{\tabl_tabulate_column_normal\zerocount\plustwo} +\unexpanded\def\tabl_tabulate_EQ_first{\tabl_tabulate_column_equal \plustwo \zerocount} +\unexpanded\def\tabl_tabulate_RQ_first{\tabl_tabulate_column_equal \zerocount\plusone} +\unexpanded\def\tabl_tabulate_HQ_first{\tabl_tabulate_column_equal \zerocount\plustwo} %unexpanded\def\tabl_tabulate_NG_first{\NC\tabl_tabulate_charalign} %unexpanded\def\tabl_tabulate_NG_first{\NC} %unexpanded\def\tabl_tabulate_NN_first{\NC\tabl_tabulate_digits} % new, undocumented, test first %unexpanded\def\tabl_tabulate_ND_first{\NC\tabl_tabulate_digits} % same, for old times sake -\unexpanded\def\tabl_tabulate_NG_first{\tabl_tabulate_column_normal\zerocount} -\unexpanded\def\tabl_tabulate_NN_first{\tabl_tabulate_column_normal\zerocount\tabl_tabulate_digits} % new, undocumented, test first -\unexpanded\def\tabl_tabulate_ND_first{\tabl_tabulate_column_normal\zerocount\tabl_tabulate_digits} % same, for old times sake +\unexpanded\def\tabl_tabulate_NG_first{\tabl_tabulate_column_normal\zerocount\zerocount} +\unexpanded\def\tabl_tabulate_NN_first{\tabl_tabulate_column_normal\zerocount\zerocount\tabl_tabulate_digits} % new, undocumented, test first +\unexpanded\def\tabl_tabulate_ND_first{\tabl_tabulate_column_normal\zerocount\zerocount\tabl_tabulate_digits} % same, for old times sake \unexpanded\def\tabl_tabulate_NR_first {\tabl_tabulate_NR_common\conditionaltrue \tabl_tabulate_check_penalties} % next row \unexpanded\def\tabl_tabulate_NB_first {\tabl_tabulate_NR_common\conditionaltrue \tabl_tabulate_nobreak_inject } % next row no break @@ -1830,42 +1888,78 @@ \unexpanded\def\tabl_tabulate_CM_first{\global\c_tabl_tabulate_localcolorspan\plustwo \tabl_tabulate_set_color_column\zerocount} \unexpanded\def\tabl_tabulate_CR_first{\global\c_tabl_tabulate_localcolorspan\plusthree\tabl_tabulate_set_color_column\zerocount} +%D Sort of special: +%D +%D \startbuffer +%D \startitemize[n] +%D \starttabulate[|||||] +%D \NC p \NC \itemtag \NC q \NC r \NC \NR +%D \NC p \NC \itemtag \NC q \NC r \NC \NR +%D \NC p \NC \itemtag \NC q \NC r \NC \NR +%D \NC p \NC \itemtag \NC q \NC r \NC \NR +%D \stoptabulate +%D \stopitemize +%D +%D \startitemize[n] +%D \starttabulate[|||||] +%D \NI b \NC c \NC d \NC \NR +%D \NC a \NI c \NC d \NC \NR +%D \NC a \NC b \NI d \NC \NR +%D \NC a \NC b \NC c \NI \NR +%D \stoptabulate +%D \stopitemize +%D \stopbuffer +%D +%D \typebuffer \getbuffer + +\let\NI\relax + +\unexpanded\def\tabl_tabulate_NI_first{\doifelsefastoptionalcheck\tabl_tbl_NI_yes\tabl_tbl_NI_nop} + +\def\tabl_tbl_NI_yes[#1]{\NC \itemtag[#1]\NC} +\def\tabl_tbl_NI_nop {\NC \itemtag \NC} + %D The following shortcut is handy for tables where one needs bold headers: %unexpanded\def\tabl_tabulate_BC_first{\NC\let\fontstyle\globalfontstyle\bf} -\unexpanded\def\tabl_tabulate_BC_first{\tabl_tabulate_column_normal\zerocount\let\fontstyle\globalfontstyle\bf} + +\unexpanded\def\tabl_tabulate_BC_first + {\tabl_tabulate_column_normal\plusone\zerocount + \let\fontstyle\globalfontstyle + \bf} \appendtoks - \let\VL\tabl_tabulate_VL_first - \let\NC\tabl_tabulate_NC_first - \let\BC\tabl_tabulate_BC_first - \let\RC\tabl_tabulate_RC_first - \let\HC\tabl_tabulate_HC_first - \let\EQ\tabl_tabulate_EQ_first - \let\RQ\tabl_tabulate_RQ_first - \let\HQ\tabl_tabulate_HQ_first - \let\NG\tabl_tabulate_NG_first - \let\NN\tabl_tabulate_NN_first - \let\ND\tabl_tabulate_ND_first - \let\NR\tabl_tabulate_NR_first - \let\NB\tabl_tabulate_NB_first - \let\CC\tabl_tabulate_CC_first - \let\CL\tabl_tabulate_CL_first - \let\CM\tabl_tabulate_CM_first - \let\CR\tabl_tabulate_CR_first + \let\VL\tabl_tabulate_VL_first + \let\NC\tabl_tabulate_NC_first + \let\BC\tabl_tabulate_BC_first + \let\RC\tabl_tabulate_RC_first + \let\HC\tabl_tabulate_HC_first + \let\EQ\tabl_tabulate_EQ_first + \let\RQ\tabl_tabulate_RQ_first + \let\HQ\tabl_tabulate_HQ_first + \let\NG\tabl_tabulate_NG_first + \let\NN\tabl_tabulate_NN_first + \let\ND\tabl_tabulate_ND_first + \let\NR\tabl_tabulate_NR_first + \let\NB\tabl_tabulate_NB_first + \let\CC\tabl_tabulate_CC_first + \let\CL\tabl_tabulate_CL_first + \let\CM\tabl_tabulate_CM_first + \let\CR\tabl_tabulate_CR_first + \let\NI\tabl_tabulate_NI_first \to \t_tabl_tabulate_initializers_first \appendtoks - \let\NR\tabl_tabulate_NR_second - \let\NB\tabl_tabulate_NB_second + \let\NR\tabl_tabulate_NR_second + \let\NB\tabl_tabulate_NB_second \to \t_tabl_tabulate_initializers_second \appendtoks - \let\SR\NR - \let\FR\NR - \let\MR\NR - \let\LR\NR - \let\AR\NR + \let\SR\NR + \let\FR\NR + \let\MR\NR + \let\LR\NR + \let\AR\NR \to \t_tabl_tabulate_initializers_first \unexpanded\def\tabl_tabulate_NR_common#1#2% @@ -2589,11 +2683,21 @@ %D \stopwhatever %D \stoptyping -%D This is needed because we soemtimes use the english command in +%D This is needed because we sometimes use the english command in %D tracing macros. In fact, most detailed tracing macros that %D are done with \LUA\ only work in the english interface anyway. -\definetabulate[tabulate] \setuptabulate[tabulate][\c!format=\v!none] % so no \v! here +% \definetabulate[tabulate] \setuptabulate[tabulate][\c!format=\v!none] % so no \v! here + +\newconditional\c_tabl_generic + +\unexpanded\setuvalue{starttabulate}% + {\bgroup % whole thing + \settrue\c_tabl_generic + \let\currenttabulationparent\empty + \dodoubleempty\tabl_start_regular} + +\letvalue{stoptabulate}\relax %D The following helpers are just there because we also have them at the \LUA\ end: %D diff --git a/tex/context/base/mkiv/tabl-tsp.mkiv b/tex/context/base/mkiv/tabl-tsp.mkiv index eadcda16c..2c4b694b3 100644 --- a/tex/context/base/mkiv/tabl-tsp.mkiv +++ b/tex/context/base/mkiv/tabl-tsp.mkiv @@ -188,7 +188,7 @@ \forcelocalfloats \setuplocalfloats[\c!before=,\c!after=,\c!inbetween=]% \splitfloatcommand{\hbox to #1{\strut}}% dummy line - \setbox\scratchbox\vbox{\flushlocalfloats}% + \setbox\scratchbox\vbox{\flushlocalfloats}% \vpack ? \getnoflines{\ht\scratchbox}% \resetlocalfloats \advance\noflines\minusone % compensate dummy line @@ -307,7 +307,7 @@ {\setbox\scratchbox\vsplit\tsplitcontent to \onepoint % \lineheight \setbox\scratchbox\vbox % \vpack {\unvbox\scratchbox - \setbox\scratchbox\vbox + \setbox\scratchbox\vbox % \vpack {\splitdiscards \ifnum\lastpenalty>-\plustenthousand\else % so that \bTR[before=\page] works @@ -328,7 +328,7 @@ \ifvoid\tsplitcontent \exitloop \fi \else\ifconditional\c_tabl_split_head % we only have a tablehead so far - \setbox\tsplitresult\vbox{\unvbox\tsplitresult\unvbox\scratchbox}% + \setbox\tsplitresult\vbox{\unvbox\tsplitresult\unvbox\scratchbox}% \vpack \exitloop \else\ifconditional\c_tabl_split_full % we have text height available, but the (one) cell is too diff --git a/tex/context/base/mkiv/tabl-xtb.lua b/tex/context/base/mkiv/tabl-xtb.lua index dade345fc..524ca109c 100644 --- a/tex/context/base/mkiv/tabl-xtb.lua +++ b/tex/context/base/mkiv/tabl-xtb.lua @@ -65,11 +65,10 @@ local tonode = nuts.tonode local getnext = nuts.getnext local getprev = nuts.getprev local getlist = nuts.getlist -local getfield = nuts.getfield +local getwidth = nuts.getwidth local getbox = nuts.getbox local getwhd = nuts.getwhd -local setfield = nuts.setfield local setlink = nuts.setlink local setdir = nuts.setdir local setshift = nuts.setshift @@ -129,7 +128,7 @@ function xtables.create(settings) local widths = { } local heights = { } local depths = { } - local spans = { } + -- local spans = { } local distances = { } local autowidths = { } local modes = { } @@ -144,7 +143,7 @@ function xtables.create(settings) widths = widths, heights = heights, depths = depths, - spans = spans, + -- spans = spans, distances = distances, modes = modes, autowidths = autowidths, @@ -251,9 +250,24 @@ function xtables.set_reflow_width() local c = data.currentcolumn local rows = data.rows local row = rows[r] + local cold = c while row[c].span do -- can also be previous row ones c = c + 1 end + -- bah, we can have a span already + if c > cold then + local ro = row[cold] + local rx = ro.nx + local ry = ro.ny + if rx > 1 or ry > 1 then + local rn = row[c] + rn.nx = rx + rn.ny = ry + ro.nx = 1 -- or 0 + ro.ny = 1 -- or 0 + -- do we also need to set ro.span and rn.span + end + end local tb = getbox("b_tabl_x") local drc = row[c] -- @@ -291,6 +305,8 @@ function xtables.set_reflow_width() -- end -- end if drc.ny < 2 then + -- report_xtable("set width, old: ht=%p, dp=%p",heights[r],depths[r]) + -- report_xtable("set width, new: ht=%p, dp=%p",height,depth) if height > heights[r] then heights[r] = height end @@ -307,11 +323,11 @@ function xtables.set_reflow_width() local fixedcolumns = data.fixedcolumns local fixedrows = data.fixedrows if dimensionstate == 1 then - if cspan > 1 then - -- ignore width - elseif width > fixedcolumns[c] then -- how about a span here? - fixedcolumns[c] = width - end + if cspan > 1 then + -- ignore width + elseif width > fixedcolumns[c] then -- how about a span here? + fixedcolumns[c] = width + end elseif dimensionstate == 2 then fixedrows[r] = height elseif dimensionstate == 3 then @@ -361,7 +377,7 @@ function xtables.set_reflow_width() -- local nx, ny = drc.nx, drc.ny if nx > 1 or ny > 1 then - local spans = data.spans + -- local spans = data.spans -- not used local self = true for y=1,ny do for x=1,nx do @@ -370,9 +386,9 @@ function xtables.set_reflow_width() else local ry = r + y - 1 local cx = c + x - 1 - if y > 1 then - spans[ry] = true - end + -- if y > 1 then + -- spans[ry] = true -- not used + -- end rows[ry][cx].span = true end end @@ -433,13 +449,17 @@ function xtables.set_reflow_height() -- if drc.ny < 2 then if data.fixedrows[r] == 0 then -- and drc.dimensionstate < 2 - local heights = data.heights - local depths = data.depths - if height > heights[r] then - heights[r] = height - end - if depth > depths[r] then - depths[r] = depth + if drc.ht + drc.dp <= height + depth then -- new per 2017-12-15 + local heights = data.heights + local depths = data.depths + -- report_xtable("set height, old: ht=%p, dp=%p",heights[r],depths[r]) + -- report_xtable("set height, new: ht=%p, dp=%p",height,depth) + if height > heights[r] then + heights[r] = height + end + if depth > depths[r] then + depths[r] = depth + end end end end @@ -472,7 +492,7 @@ function xtables.initialize_construct() -- local width = widths[c] local height = heights[r] - local depth = depths[r] + local depth = depths[r] -- problem: can be the depth of a one liner -- for x=1,drc.nx-1 do width = width + widths[c+x] @@ -519,7 +539,6 @@ function xtables.reflow_width() local nofrows = data.nofrows local nofcolumns = data.nofcolumns local rows = data.rows --- inspect(rows) for r=1,nofrows do local row = rows[r] for c=1,nofcolumns do @@ -551,8 +570,7 @@ function xtables.reflow_width() showwidths("stage 1",widths,autowidths) end local noffrozen = 0 --- here we can also check spans - -- inspect(data.fixedcspans) + -- here we can also check spans if options[v_max] then for c=1,nofcolumns do width = width + widths[c] @@ -677,8 +695,6 @@ function xtables.reflow_width() -- data.currentrow = 0 data.currentcolumn = 0 - -- --- inspect(data) end function xtables.reflow_height() @@ -739,8 +755,6 @@ function xtables.reflow_height() end end end - -- --- inspect(data) end local function showspans(data) @@ -770,7 +784,7 @@ function xtables.construct() local heights = data.heights local depths = data.depths local widths = data.widths - local spans = data.spans + -- local spans = data.spans local distances = data.distances local modes = data.modes local settings = data.settings @@ -909,7 +923,7 @@ function xtables.construct() texsetdimen("global","d_tabl_x_final_width",0) else texsetcount("global","c_tabl_x_state",1) - texsetdimen("global","d_tabl_x_final_width",getfield(body[1][1],"width")) + texsetdimen("global","d_tabl_x_final_width",getwidth(body[1][1])) end end @@ -1172,7 +1186,6 @@ function xtables.cleanup() -- end -- end -- data.result = nil - -- inspect(data) data = table.remove(stack) end diff --git a/tex/context/base/mkiv/tabl-xtb.mkvi b/tex/context/base/mkiv/tabl-xtb.mkvi index f7d682631..dc4a30e2b 100644 --- a/tex/context/base/mkiv/tabl-xtb.mkvi +++ b/tex/context/base/mkiv/tabl-xtb.mkvi @@ -15,7 +15,7 @@ \writestatus{loading}{ConTeXt Table Macros / Xtreme} -\registerctxluafile{tabl-xtb}{1.001} +\registerctxluafile{tabl-xtb}{} % todo: % @@ -140,8 +140,12 @@ \c!autostrut=\v!no, \c!split=\v!auto, % a number will take that many lines \c!splitoffset=\zeropoint, % extra space taken - % \c!aligncharacter=\v!no, - % \c!alignmentcharacter={,}, + \c!aligncharacter=\v!no, + \c!alignmentcharacter={,}, + \c!alignmentleftsample=, + \c!alignmentrightsample=, + \c!alignmentleftwidth=\zeropoint, + \c!alignmentrightwidth=\zeropoint, % \c!option=, % \v!stretch {\v!stretch,\v!width} % \c!footer=, % \c!header=, @@ -335,6 +339,7 @@ \clf_x_table_cleanup \dostoptagged \resetbuffer[\tabl_x_current_buffer]% + \resetcharacteralign \egroup} % text flow split modes @@ -480,8 +485,50 @@ {\tabl_x_start_cell_nop \tabl_x_stop_cell} +% \unexpanded\def\tabl_x_begin_of_cell +% {%\inhibitblank % already in framed +% \everypar{\delayedbegstrut}} + +\def\tabl_x_setup_character_align + {\edef\p_left {\directxtableparameter\c!alignmentleftsample}% + \edef\p_right{\directxtableparameter\c!alignmentrightsample}% + \ifx\p_left\empty + \scratchdimenone\dimexpr\directxtableparameter\c!alignmentleftwidth\relax + \else + \setbox\scratchbox\hbox{\p_left}% + \scratchdimenone\wd\scratchbox + \fi + \ifx\p_right\empty + \scratchdimentwo\dimexpr\directxtableparameter\c!alignmentrightwidth\relax + \else + \setbox\scratchbox\hbox{\p_right}% + \scratchdimentwo\wd\scratchbox + \fi + \clf_setcharacteraligndetail + \clf_x_table_c + {\directxtableparameter\c!alignmentcharacter}% + \scratchdimenone + \scratchdimentwo + \relax} + +\newtoks\t_tabl_x_every_cell + +% \appendtoks +% \inhibitblank % already in framed +% \to \t_tabl_x_every_cell + +\appendtoks + \edef\p_characteralign{\directxtableparameter\c!aligncharacter}% + \ifx\p_characteralign\v!yes + \ifcase\clf_x_table_r\or + \tabl_x_setup_character_align + \fi + \signalcharacteralign\clf_x_table_c\clf_x_table_r + \fi +\to \t_tabl_x_every_cell + \unexpanded\def\tabl_x_begin_of_cell - {%\inhibitblank % already in framed + {\the\t_tabl_x_every_cell \everypar{\delayedbegstrut}} \unexpanded\def\tabl_x_end_of_cell @@ -519,7 +566,7 @@ \let\tabl_x_set_hsize\relax \unexpanded\def\tabl_x_start_cell_reflow_width_yes[#settings]% - {\setbox\b_tabl_x\hbox\bgroup + {\setbox\b_tabl_x\hpack\bgroup \ifnum\c_tabl_x_nesting>\plusone \letxtableparameter\c!width \v!fit % overloads given width \letxtableparameter\c!height\v!fit % overloads given height @@ -548,7 +595,7 @@ \tabl_x_set_hsize} \unexpanded\def\tabl_x_start_cell_reflow_width_nop - {\setbox\b_tabl_x\hbox\bgroup + {\setbox\b_tabl_x\hpack\bgroup \ifnum\c_tabl_x_nesting>\plusone \letxtableparameter\c!width \v!fit % overloads given width \letxtableparameter\c!height\v!fit % overloads given height @@ -568,7 +615,7 @@ \clf_x_table_set_reflow_width} \unexpanded\def\tabl_x_start_cell_reflow_height_yes[#settings]% - {\setbox\b_tabl_x\hbox\bgroup + {\setbox\b_tabl_x\hpack\bgroup \clf_x_table_init_reflow_height \ifcase\c_tabl_x_skip_mode % can be sped up \ifnum\c_tabl_x_nesting>\plusone @@ -582,7 +629,7 @@ \fi} \unexpanded\def\tabl_x_start_cell_reflow_height_nop - {\setbox\b_tabl_x\hbox\bgroup + {\setbox\b_tabl_x\hpack\bgroup \clf_x_table_init_reflow_height \ifcase\c_tabl_x_skip_mode % can be sped up \ifnum\c_tabl_x_nesting>\plusone @@ -604,7 +651,7 @@ \unexpanded\def\tabl_x_start_cell_construct_yes[#settings]% {\dostarttagged\t!tablecell\empty % can't we just tag the box - \setbox\b_tabl_x\hbox\bgroup + \setbox\b_tabl_x\hpack\bgroup \setupcurrentxtable[#settings]% \letxtableparameter\c!width \d_tabl_x_width % overloads given width \letxtableparameter\c!height\d_tabl_x_height % overloads given height @@ -615,7 +662,7 @@ \unexpanded\def\tabl_x_start_cell_construct_nop {\dostarttagged\t!tablecell\empty % can't we just tag the box - \setbox\b_tabl_x\hbox\bgroup + \setbox\b_tabl_x\hpack\bgroup \letxtableparameter\c!width \d_tabl_x_width % overloads given width \letxtableparameter\c!height\d_tabl_x_height % overloads given height (commenting it ... nice option) \clf_x_table_init_construct diff --git a/tex/context/base/mkiv/task-ini.lua b/tex/context/base/mkiv/task-ini.lua index d0c00f5c8..f41fb9b08 100644 --- a/tex/context/base/mkiv/task-ini.lua +++ b/tex/context/base/mkiv/task-ini.lua @@ -25,6 +25,8 @@ local enableaction = tasks.enableaction local freezegroup = tasks.freezegroup local freezecallbacks = callbacks.freeze +appendaction("processors", "normalizers", "languages.replacements.handler") -- disabled + appendaction("processors", "normalizers", "typesetters.wrappers.handler") -- disabled appendaction("processors", "normalizers", "typesetters.characters.handler") -- always on appendaction("processors", "normalizers", "fonts.collections.process") -- disabled @@ -38,22 +40,19 @@ appendaction("processors", "characters", "typesetters.cases.handler") appendaction("processors", "characters", "typesetters.breakpoints.handler") -- disabled appendaction("processors", "characters", "scripts.injectors.handler") -- disabled -appendaction("processors", "words", "languages.replacements.handler") -- disabled - -appendaction("processors", "words", "languages.hyphenators.handler") -- always on - +------------("processors", "words", "languages.replacements.handler") -- disabled appendaction("processors", "words", "languages.words.check") -- disabled -- might move up, no disc check needed then - +appendaction("processors", "words", "languages.hyphenators.handler") -- always on appendaction("processors", "words", "typesetters.initials.handler") -- disabled -- might move up -appendaction("processors", "words", "typesetters.firstlines.handler") -- disabled -- might move down +appendaction("processors", "words", "typesetters.firstlines.handler") -- disabled appendaction("processors", "fonts", "builders.paragraphs.solutions.splitters.split") -- experimental appendaction("processors", "fonts", "nodes.handlers.characters") -- maybe todo appendaction("processors", "fonts", "nodes.injections.handler") appendaction("processors", "fonts", "typesetters.fontkerns.handler") appendaction("processors", "fonts", "nodes.handlers.protectglyphs", nil, "nohead") -- maybe todo -appendaction("processors", "fonts", "builders.kernel.ligaturing") -- always on (could be selective: if only node mode) -appendaction("processors", "fonts", "builders.kernel.kerning") -- always on (could be selective: if only node mode) +appendaction("processors", "fonts", "builders.kernel.ligaturing") -- not always on (could be selective: if only node mode) +appendaction("processors", "fonts", "builders.kernel.kerning") -- not always on (could be selective: if only node mode) appendaction("processors", "fonts", "nodes.handlers.stripping") -- disabled (might move) ------------("processors", "fonts", "typesetters.italics.handler") -- disabled (after otf/kern handling) appendaction("processors", "fonts", "nodes.handlers.flatten") @@ -66,13 +65,13 @@ appendaction("processors", "lists", "typesetters.digits.handler") appendaction("processors", "lists", "typesetters.italics.handler") -- disabled (after otf/kern handling) appendaction("processors", "lists", "languages.visualizediscretionaries") -- disabled -appendaction ("processors", "after", "typesetters.marksuspects") +appendaction("processors", "after", "typesetters.marksuspects") appendaction("shipouts", "normalizers", "typesetters.showsuspects") appendaction("shipouts", "normalizers", "typesetters.margins.finalhandler") -- disabled ------------("shipouts", "normalizers", "nodes.handlers.cleanuppage") -- disabled appendaction("shipouts", "normalizers", "builders.paragraphs.expansion.trace") -- disabled -appendaction("shipouts", "normalizers", "typesetters.alignments.handler") +appendaction("shipouts", "normalizers", "typesetters.alignments.handler") -- disabled appendaction("shipouts", "normalizers", "nodes.references.handler") -- disabled appendaction("shipouts", "normalizers", "nodes.destinations.handler") -- disabled appendaction("shipouts", "normalizers", "nodes.rules.handler") -- disabled @@ -102,7 +101,8 @@ appendaction("math", "normalizers", "noads.handlers.relocate", nil, "no appendaction("math", "normalizers", "noads.handlers.families", nil, "nohead") -- always on appendaction("math", "normalizers", "noads.handlers.render", nil, "nohead") -- always on -appendaction("math", "normalizers", "noads.handlers.collapse", nil, "nohead") -- * first-- always on +appendaction("math", "normalizers", "noads.handlers.collapse", nil, "nohead") -- disabled +appendaction("math", "normalizers", "noads.handlers.fixscripts",nil, "nohead") -- * first-- always on appendaction("math", "normalizers", "noads.handlers.domains", nil, "nohead") -- * last -- disabled appendaction("math", "normalizers", "noads.handlers.autofences",nil, "nohead") -- disabled appendaction("math", "normalizers", "noads.handlers.resize", nil, "nohead") -- always on @@ -117,6 +117,7 @@ appendaction("math", "builders", "builders.kernel.mlist_to_hlist") ------------("math", "builders", "noads.handlers.italics", nil, "nohead") -- disabled appendaction("math", "builders", "typesetters.directions.processmath") -- disabled (has to happen pretty late) appendaction("math", "builders", "noads.handlers.makeup", nil, "nohead") -- disabled (has to happen last) +appendaction("math", "builders", "noads.handlers.align", nil, "nohead") appendaction("finalizers", "lists", "typesetters.paragraphs.normalize") -- moved here appendaction("finalizers", "lists", "typesetters.margins.localhandler") -- disabled @@ -219,6 +220,7 @@ disableaction("contributers","nodes.handlers.textbackgrounds") disableaction("math", "noads.handlers.showtree") disableaction("math", "noads.handlers.tags") disableaction("math", "noads.handlers.italics") +disableaction("math", "noads.handlers.collapse") disableaction("math", "noads.handlers.kernpairs") disableaction("math", "noads.handlers.domains") disableaction("math", "noads.handlers.classes") diff --git a/tex/context/base/mkiv/task-ini.mkiv b/tex/context/base/mkiv/task-ini.mkiv index 6cdbe739f..77e4fa985 100644 --- a/tex/context/base/mkiv/task-ini.mkiv +++ b/tex/context/base/mkiv/task-ini.mkiv @@ -17,6 +17,6 @@ %D Maybe we will make things configureable (speed up and such). -\registerctxluafile{task-ini}{1.001} +\registerctxluafile{task-ini}{} \protect \endinput diff --git a/tex/context/base/mkiv/toks-ini.lua b/tex/context/base/mkiv/toks-ini.lua index 0ce7b4836..8f95f6692 100644 --- a/tex/context/base/mkiv/toks-ini.lua +++ b/tex/context/base/mkiv/toks-ini.lua @@ -9,12 +9,14 @@ tokens = tokens or { } local tokens = tokens local token = token -- the built in one +local next = next local tonumber = tonumber local tostring = tostring local utfchar = utf.char local char = string.char local printtable = table.print local concat = table.concat +local format = string.format if setinspector then @@ -54,40 +56,34 @@ if setinspector then end -local scan_toks = token.scan_toks -local scan_string = token.scan_string -local scan_int = token.scan_int -local scan_code = token.scan_code -local scan_dimen = token.scan_dimen -local scan_glue = token.scan_glue -local scan_keyword = token.scan_keyword -local scan_token = token.scan_token -local scan_word = token.scan_word -local scan_number = token.scan_number -local scan_csname = token.scan_csname - -local get_next = token.get_next - -if not token.get_macro then - local scantoks = tex.scantoks - local gettoks = tex.gettoks - function token.get_meaning(name) - scantoks("t_get_macro",tex.ctxcatcodes,"\\"..name) - return gettoks("t_get_macro") - end - function token.get_macro(name) - scantoks("t_get_macro",tex.ctxcatcodes,"\\"..name) - local s = gettoks("t_get_macro") - return match(s,"^.-%->(.*)$") or s - end +local scan_toks = token.scan_toks +local scan_string = token.scan_string +local scan_int = token.scan_int +local scan_code = token.scan_code +local scan_dimen = token.scan_dimen +local scan_glue = token.scan_glue +local scan_keyword = token.scan_keyword +local scan_keyword_cs = token.scan_keyword_cs or scan_keyword +local scan_token = token.scan_token +local scan_word = token.scan_word +local scan_number = token.scan_number +local scan_csname = token.scan_csname + +local get_next = token.get_next + +local set_macro = token.set_macro +local get_macro = token.get_macro +local get_meaning = token.get_meaning +local get_cmdname = token.get_cmdname +local set_char = token.set_char +local create_token = token.create + +if not set_char then -- for a while + local contextsprint = context.sprint + local ctxcatcodes = catcodes.numbers.ctxcatcodes + set_char = function(n,u) contextsprint(ctxcatcodes,format("\\chardef\\%s=%s",n,u)) end end -local set_macro = token.set_macro -local get_macro = token.get_macro -local get_meaning = token.get_meaning -local get_cmdname = token.get_cmdname -local create_token = token.create - function tokens.defined(name) return get_cmdname(create_token(name)) ~= "undefined_cs" end @@ -101,28 +97,28 @@ end -- end local bits = { - escape = 2^ 0, - begingroup = 2^ 1, - endgroup = 2^ 2, - mathshift = 2^ 3, - alignment = 2^ 4, - endofline = 2^ 5, - parameter = 2^ 6, - superscript = 2^ 7, - subscript = 2^ 8, - ignore = 2^ 9, - space = 2^10, -- 1024 - letter = 2^11, - other = 2^12, - active = 2^13, - comment = 2^14, - invalid = 2^15, + escape = 0x00000001, -- 2^00 + begingroup = 0x00000002, -- 2^01 + endgroup = 0x00000004, -- 2^02 + mathshift = 0x00000008, -- 2^03 + alignment = 0x00000010, -- 2^04 + endofline = 0x00000020, -- 2^05 + parameter = 0x00000040, -- 2^06 + superscript = 0x00000080, -- 2^07 + subscript = 0x00000100, -- 2^08 + ignore = 0x00000200, -- 2^09 + space = 0x00000400, -- 2^10 -- 1024 + letter = 0x00000800, -- 2^11 + other = 0x00001000, -- 2^12 + active = 0x00002000, -- 2^13 + comment = 0x00004000, -- 2^14 + invalid = 0x00008000, -- 2^15 -- - character = 2^11 + 2^12, - whitespace = 2^13 + 2^10, -- / needs more checking + character = 0x00001800, -- 2^11 + 2^12 + whitespace = 0x00002400, -- 2^13 + 2^10 -- / needs more checking -- - open = 2^10 + 2^1, -- space + begingroup - close = 2^10 + 2^2, -- space + endgroup + open = 0x00000402, -- 2^10 + 2^01 -- space + begingroup + close = 0x00000404, -- 2^10 + 2^02 -- space + endgroup } -- for k, v in next, bits do bits[v] = k end @@ -250,6 +246,7 @@ tokens.scanners = { -- these expand number = scan_number, boolean = scan_boolean, keyword = scan_keyword, + keywordcs = scan_keyword_cs, csname = scan_csname, } @@ -268,6 +265,7 @@ tokens.getters = { -- these don't expand tokens.setters = { macro = set_macro, + char = set_char, count = tex.setcount, dimen = tex.setdimen, skip = tex.setglue, diff --git a/tex/context/base/mkiv/toks-ini.mkiv b/tex/context/base/mkiv/toks-ini.mkiv index aaa735207..9d3375432 100644 --- a/tex/context/base/mkiv/toks-ini.mkiv +++ b/tex/context/base/mkiv/toks-ini.mkiv @@ -17,9 +17,9 @@ \newtoks\t_get_macro % will go away -\registerctxluafile{toks-ini}{1.001} -\registerctxluafile{toks-scn}{1.001} -\registerctxluafile{cldf-scn}{1.001} -\registerctxluafile{cldf-stp}{1.001} +\registerctxluafile{toks-ini}{} +\registerctxluafile{toks-scn}{} +\registerctxluafile{cldf-scn}{} +\registerctxluafile{cldf-stp}{} \protect \endinput diff --git a/tex/context/base/mkiv/toks-map.mkiv b/tex/context/base/mkiv/toks-map.mkiv index f1b63a68b..829daa39d 100644 --- a/tex/context/base/mkiv/toks-map.mkiv +++ b/tex/context/base/mkiv/toks-map.mkiv @@ -13,7 +13,7 @@ % \writestatus{loading}{ConTeXt Token Support / Remapping} % -% \registerctxluafile{toks-map}{1.001} +% \registerctxluafile{toks-map}{} % % \unprotect % diff --git a/tex/context/base/mkiv/toks-scn.lua b/tex/context/base/mkiv/toks-scn.lua index 3c41eedd8..f3781d022 100644 --- a/tex/context/base/mkiv/toks-scn.lua +++ b/tex/context/base/mkiv/toks-scn.lua @@ -24,6 +24,7 @@ local scanstring = scanners.string local scaninteger = scanners.integer local scannumber = scanners.number local scankeyword = scanners.keyword +local scankeywordcs = scanners.keywordcs local scanword = scanners.word local scancode = scanners.code local scanboolean = scanners.boolean @@ -117,6 +118,7 @@ local shortcuts = { scaninteger = scaninteger, scannumber = scannumber, scankeyword = scankeyword, + scankeywordcs = scankeywordcs, scanword = scanword, scancode = scancode, scanboolean = scanboolean, @@ -163,21 +165,21 @@ tokens.converters = { -- that I then need to check the TeX end. More pain than gain and a bit -- risky too. -local f_if = formatters[ " if scankeyword('%s') then data['%s'] = scan%s()"] -local f_elseif = formatters[" elseif scankeyword('%s') then data['%s'] = scan%s()"] +local f_if = formatters[ " if scankeywordcs('%s') then data['%s'] = scan%s()"] +local f_elseif = formatters[" elseif scankeywordcs('%s') then data['%s'] = scan%s()"] ----- f_if = formatters[" local key = scanword() if key == '' then break elseif key == '%s' then data['%s'] = scan%s()"] ----- f_elseif = formatters[" elseif key == '%s' then data['%s'] = scan%s()"] ------ f_if_x = formatters[ " if not data['%s'] and scankeyword('%s') then data['%s'] = scan%s()"] ------ f_elseif_x = formatters[" elseif not data['%s'] and scankeyword('%s') then data['%s'] = scan%s()"] +----- f_if_x = formatters[ " if not data['%s'] and scankeywordcs('%s') then data['%s'] = scan%s()"] +----- f_elseif_x = formatters[" elseif not data['%s'] and scankeywordcs('%s') then data['%s'] = scan%s()"] local f_local = formatters["local scan%s = scanners.%s"] local f_scan = formatters["scan%s()"] local f_shortcut = formatters["local %s = scanners.converters.%s"] -local f_if_c = formatters[ " if scankeyword('%s') then data['%s'] = %s(scan%s())"] -local f_elseif_c = formatters[" elseif scankeyword('%s') then data['%s'] = %s(scan%s())"] +local f_if_c = formatters[ " if scankeywordcs('%s') then data['%s'] = %s(scan%s())"] +local f_elseif_c = formatters[" elseif scankeywordcs('%s') then data['%s'] = %s(scan%s())"] local f_scan_c = formatters["%s(scan%s())"] -- see above diff --git a/tex/context/base/mkiv/toks-tra.mkiv b/tex/context/base/mkiv/toks-tra.mkiv index 6186402a7..04f837f1c 100644 --- a/tex/context/base/mkiv/toks-tra.mkiv +++ b/tex/context/base/mkiv/toks-tra.mkiv @@ -13,7 +13,7 @@ \writestatus{loading}{ConTeXt Token Support / Tracing} -\registerctxluafile{toks-tra}{1.001} +\registerctxluafile{toks-tra}{} \unprotect diff --git a/tex/context/base/mkiv/trac-ctx.lua b/tex/context/base/mkiv/trac-ctx.lua index 493ce7936..29159d130 100644 --- a/tex/context/base/mkiv/trac-ctx.lua +++ b/tex/context/base/mkiv/trac-ctx.lua @@ -6,6 +6,8 @@ if not modules then modules = { } end modules ['trac-ctx'] = { license = "see context related readme files" } +local next = next + local context = context local implement = interfaces.implement local register = trackers.register diff --git a/tex/context/base/mkiv/trac-ctx.mkiv b/tex/context/base/mkiv/trac-ctx.mkiv index 4240281a6..66b5ef1ee 100644 --- a/tex/context/base/mkiv/trac-ctx.mkiv +++ b/tex/context/base/mkiv/trac-ctx.mkiv @@ -13,7 +13,7 @@ \writestatus{loading}{ConTeXt Tracing Macros / TeX Trackers} -\registerctxluafile{trac-ctx}{1.001} +\registerctxluafile{trac-ctx}{} \unprotect diff --git a/tex/context/base/mkiv/trac-deb.mkiv b/tex/context/base/mkiv/trac-deb.mkiv index 1e61a3512..b5366d88c 100644 --- a/tex/context/base/mkiv/trac-deb.mkiv +++ b/tex/context/base/mkiv/trac-deb.mkiv @@ -15,8 +15,8 @@ \unprotect -%registerctxluafile{trac-lmx}{1.001} -\registerctxluafile{trac-deb}{1.001} +%registerctxluafile{trac-lmx}{} +\registerctxluafile{trac-deb}{} \unexpanded\def\breakpoint {\showdebuginfo\wait} diff --git a/tex/context/base/mkiv/trac-fil.lua b/tex/context/base/mkiv/trac-fil.lua index 8cc903e2a..f422c9f6b 100644 --- a/tex/context/base/mkiv/trac-fil.lua +++ b/tex/context/base/mkiv/trac-fil.lua @@ -6,7 +6,7 @@ if not modules then modules = { } end modules ['trac-fil'] = { license = "see context related readme files" } -local rawset, tonumber, type, pcall = rawset, tonumber, type, pcall +local rawset, tonumber, type, pcall, next = rawset, tonumber, type, pcall, next local format, concat = string.format, table.concat local openfile = io.open local date = os.date diff --git a/tex/context/base/mkiv/trac-inf.lua b/tex/context/base/mkiv/trac-inf.lua index f66485015..5810e2059 100644 --- a/tex/context/base/mkiv/trac-inf.lua +++ b/tex/context/base/mkiv/trac-inf.lua @@ -84,7 +84,7 @@ local seconds = function(n) return n or 0 end local function starttiming(instance) local timer = timers[instance or "notimer"] - local it = timer.timing or 0 + local it = timer.timing if it == 0 then timer.starttime = ticks() if not timer.loadtime then @@ -116,7 +116,7 @@ end local function elapsed(instance) if type(instance) == "number" then - return instance or 0 + return instance else local timer = timers[instance or "notimer"] return timer and seconds(timer.loadtime) or 0 @@ -167,8 +167,12 @@ function statistics.show() return format("%s, type: %s, binary subtree: %s", os.platform or "unknown",os.type or "unknown", environment.texos or "unknown") end) - register("luatex banner", function() - return lower(status.banner) + -- register("luatex banner", function() + -- return lower(status.banner) + -- end) + register("used engine", function() + return format("%s version %s with functionality level %s, banner: %s", + LUATEXENGINE, LUATEXVERSION, LUATEXFUNCTIONALITY, lower(status.banner)) end) register("control sequences", function() return format("%s of %s + %s", status.cs_count, status.hash_size,status.hash_extra) @@ -192,8 +196,9 @@ function statistics.show() local hashchar = tonumber(status.luatex_hashchars) local hashtype = status.luatex_hashtype local mask = lua.mask or "ascii" - return format("engine: %s, used memory: %s, hash type: %s, hash chars: min(%s,40), symbol mask: %s (%s)", + return format("engine: %s %s, used memory: %s, hash type: %s, hash chars: min(%i,40), symbol mask: %s (%s)", jit and "luajit" or "lua", + LUAVERSION, statistics.memused(), hashtype or "default", hashchar and 2^hashchar or "unknown", diff --git a/tex/context/base/mkiv/trac-jus.lua b/tex/context/base/mkiv/trac-jus.lua index 6d00bf19e..e7a030257 100644 --- a/tex/context/base/mkiv/trac-jus.lua +++ b/tex/context/base/mkiv/trac-jus.lua @@ -18,7 +18,6 @@ local nuts = nodes.nuts local tonut = nuts.tonut local getfield = nuts.getfield -local setfield = nuts.setfield local getlist = nuts.getlist local getattr = nuts.getattr local setattr = nuts.setattr diff --git a/tex/context/base/mkiv/trac-jus.mkiv b/tex/context/base/mkiv/trac-jus.mkiv index 71d88b00e..f2e93eff7 100644 --- a/tex/context/base/mkiv/trac-jus.mkiv +++ b/tex/context/base/mkiv/trac-jus.mkiv @@ -13,7 +13,7 @@ \writestatus{loading}{ConTeXt Tracing Macros / Justification} -\registerctxluafile{trac-jus}{1.001} +\registerctxluafile{trac-jus}{} \unprotect diff --git a/tex/context/base/mkiv/trac-lmx.lua b/tex/context/base/mkiv/trac-lmx.lua index 4f4ea62c4..c7f949618 100644 --- a/tex/context/base/mkiv/trac-lmx.lua +++ b/tex/context/base/mkiv/trac-lmx.lua @@ -695,6 +695,8 @@ if arg then if arg[1] == "--show" then if arg[2] then lmx.show (arg[2]) end elseif arg[1] == "--convert" then if arg[2] then lmx.convert(arg[2], arg[3] or "temp.html") end end +else + return lmx end -- Test 1: diff --git a/tex/context/base/mkiv/trac-log.lua b/tex/context/base/mkiv/trac-log.lua index b6bb123cf..c7b6f6d2d 100644 --- a/tex/context/base/mkiv/trac-log.lua +++ b/tex/context/base/mkiv/trac-log.lua @@ -20,8 +20,8 @@ local openfile = io.open local setmetatableindex = table.setmetatableindex local formatters = string.formatters - -local texgetcount = tex and tex.getcount +local settings_to_hash = utilities.parsers.settings_to_hash +local sortedkeys = table.sortedkeys -- variant is set now @@ -575,15 +575,15 @@ logs.newline = newline -- todo: renew (un) locks when a new one is added and wildcard -local data, states = { }, nil +local data = { } +local states = nil +local force = false function logs.reporter(category,subcategory) local logger = data[category] if not logger then - local state = false - if states == true then - state = true - elseif type(states) == "table" then + local state = states == true + if not state and type(states) == "table" then for c, _ in next, states do if find(category,c) then state = true @@ -593,7 +593,7 @@ function logs.reporter(category,subcategory) end logger = { reporters = { }, - state = state, + state = state, } data[category] = logger end @@ -601,7 +601,7 @@ function logs.reporter(category,subcategory) if not reporter then if subcategory then reporter = function(...) - if not logger.state then + if force or not logger.state then subreport(category,subcategory,...) end end @@ -609,7 +609,7 @@ function logs.reporter(category,subcategory) else local tag = category reporter = function(...) - if not logger.state then + if force or not logger.state then report(category,...) end end @@ -645,7 +645,7 @@ end -- so far local function setblocked(category,value) -- v.state == value == true : disable - if category == true then + if category == true or category == "all" then -- lock all category, value = "*", true elseif category == false then @@ -661,7 +661,8 @@ local function setblocked(category,value) -- v.state == value == true : disable v.state = value end else - states = utilities.parsers.settings_to_hash(category,type(states)=="table" and states or nil) + alllocked = false + states = settings_to_hash(category,type(states)=="table" and states or nil) for c in next, states do local v = data[c] if v then @@ -687,7 +688,7 @@ function logs.enable(category) end function logs.categories() - return table.sortedkeys(data) + return sortedkeys(data) end function logs.show() @@ -710,7 +711,7 @@ function logs.show() max = m end end - local subcategories = concat(table.sortedkeys(reporters),", ") + local subcategories = concat(sortedkeys(reporters),", ") if state == true then state = "disabled" elseif state == false then @@ -746,59 +747,64 @@ end) -- tex specific loggers (might move elsewhere) -local report_pages = logs.reporter("pages") -- not needed but saves checking when we grep for it - -local real, user, sub +if tex then -function logs.start_page_number() - real = texgetcount("realpageno") - user = texgetcount("userpageno") - sub = texgetcount("subpageno") -end + local report = logs.reporter("pages") -- not needed but saves checking when we grep for it + local texgetcount = tex and tex.getcount -local timing = false -local starttime = nil -local lasttime = nil + local real, user, sub -trackers.register("pages.timing", function(v) -- only for myself (diagnostics) - starttime = os.clock() - timing = true -end) + function logs.start_page_number() + real = texgetcount("realpageno") + user = texgetcount("userpageno") + sub = texgetcount("subpageno") + end -function logs.stop_page_number() -- the first page can includes the initialization so we omit this in average - if timing then - local elapsed, average - local stoptime = os.clock() - if not lasttime or real < 2 then - elapsed = stoptime - average = stoptime - starttime = stoptime - else - elapsed = stoptime - lasttime - average = (stoptime - starttime) / (real - 1) - end - lasttime = stoptime - if real <= 0 then - report_pages("flushing page, time %0.04f / %0.04f",elapsed,average) - elseif user <= 0 then - report_pages("flushing realpage %s, time %0.04f / %0.04f",real,elapsed,average) - elseif sub <= 0 then - report_pages("flushing realpage %s, userpage %s, time %0.04f / %0.04f",real,user,elapsed,average) - else - report_pages("flushing realpage %s, userpage %s, subpage %s, time %0.04f / %0.04f",real,user,sub,elapsed,average) - end - else - if real <= 0 then - report_pages("flushing page") - elseif user <= 0 then - report_pages("flushing realpage %s",real) - elseif sub <= 0 then - report_pages("flushing realpage %s, userpage %s",real,user) + local timing = false + local starttime = nil + local lasttime = nil + + trackers.register("pages.timing", function(v) -- only for myself (diagnostics) + starttime = os.clock() -- todo: use other timer + timing = true + end) + + function logs.stop_page_number() -- the first page can includes the initialization so we omit this in average + if timing then + local elapsed, average + local stoptime = os.clock() + if not lasttime or real < 2 then + elapsed = stoptime + average = stoptime + starttime = stoptime + else + elapsed = stoptime - lasttime + average = (stoptime - starttime) / (real - 1) + end + lasttime = stoptime + if real <= 0 then + report("flushing page, time %0.04f / %0.04f",elapsed,average) + elseif user <= 0 then + report("flushing realpage %s, time %0.04f / %0.04f",real,elapsed,average) + elseif sub <= 0 then + report("flushing realpage %s, userpage %s, time %0.04f / %0.04f",real,user,elapsed,average) + else + report("flushing realpage %s, userpage %s, subpage %s, time %0.04f / %0.04f",real,user,sub,elapsed,average) + end else - report_pages("flushing realpage %s, userpage %s, subpage %s",real,user,sub) + if real <= 0 then + report("flushing page") + elseif user <= 0 then + report("flushing realpage %s",real) + elseif sub <= 0 then + report("flushing realpage %s, userpage %s",real,user) + else + report("flushing realpage %s, userpage %s, subpage %s",real,user,sub) + end end + logs.flush() end - logs.flush() + end -- we don't have show_open and show_close callbacks yet @@ -1039,3 +1045,104 @@ io.stderr:setvbuf('no') if package.helpers.report then package.helpers.report = logs.reporter("package loader") -- when used outside mtxrun end + +if tex then + + local finalactions = { } + local fatalerrors = { } + local possiblefatal = { } + local loggingerrors = false + + function logs.loggingerrors() + return loggingerrors + end + + directives.register("logs.errors",function(v) + loggingerrors = v + if type(v) == "string" then + fatalerrors = settings_to_hash(v) + else + fatalerrors = { } + end + end) + + function logs.registerfinalactions(...) + insert(finalactions,...) -- so we can force an order if needed + end + + local what = nil + local report = nil + local state = nil + local target = nil + + local function startlogging(t,r,w,s) + target = t + state = force + force = true + report = type(r) == "function" and r or logs.reporter(r) + what = w + pushtarget(target) + newline() + if s then + report("start %s: %s",what,s) + else + report("start %s",what) + end + if target == "logfile" then + newline() + end + return report + end + + local function stoplogging() + if target == "logfile" then + newline() + end + report("stop %s",what) + if target == "logfile" then + newline() + end + poptarget() + state = oldstate + end + + function logs.startfilelogging(...) + return startlogging("logfile", ...) + end + + logs.stopfilelogging = stoplogging + + local done = false + + function logs.starterrorlogging(r,w,...) + if not done then + pushtarget("terminal") + newline() + logs.report("error logging","start possible issues") + poptarget() + done = true + end + if fatalerrors[w] then + possiblefatal[w] = true + end + return startlogging("terminal",r,w,...) + end + + logs.stoperrorlogging = stoplogging + + function logs.finalactions() + if #finalactions > 0 then + for i=1,#finalactions do + finalactions[i]() + end + if done then + pushtarget("terminal") + newline() + logs.report("error logging","stop possible issues") + poptarget() + end + return next(possiblefatal) and sortedkeys(possiblefatal) or false + end + end + +end diff --git a/tex/context/base/mkiv/trac-pro.lua b/tex/context/base/mkiv/trac-pro.lua index 897b6a15c..cbaae7f0c 100644 --- a/tex/context/base/mkiv/trac-pro.lua +++ b/tex/context/base/mkiv/trac-pro.lua @@ -6,7 +6,7 @@ if not modules then modules = { } end modules ['trac-pro'] = { license = "see context related readme files" } -local getmetatable, setmetatable, rawset, type = getmetatable, setmetatable, rawset, type +local getmetatable, setmetatable, rawset, type, next = getmetatable, setmetatable, rawset, type, next -- The protection implemented here is probably not that tight but good enough to catch -- problems due to naive usage. diff --git a/tex/context/base/mkiv/trac-set.lua b/tex/context/base/mkiv/trac-set.lua index d0047650f..530915fe0 100644 --- a/tex/context/base/mkiv/trac-set.lua +++ b/tex/context/base/mkiv/trac-set.lua @@ -8,8 +8,8 @@ if not modules then modules = { } end modules ['trac-set'] = { -- might become u -- maybe this should be util-set.lua -local type, next, tostring = type, next, tostring -local concat = table.concat +local type, next, tostring, tonumber = type, next, tostring, tonumber +local concat, sortedhash = table.concat, table.sortedhash local format, find, lower, gsub, topattern = string.format, string.find, string.lower, string.gsub, string.topattern local is_boolean = string.is_boolean local settings_to_hash = utilities.parsers.settings_to_hash @@ -26,6 +26,8 @@ local data = { } -- We can initialize from the cnf file. This is sort of tricky as -- later defined setters also need to be initialized then. If set -- this way, we need to ensure that they are not reset later on. +-- +-- The sorting is needed to get a predictable setters in case of *. local trace_initialize = false -- only for testing during development @@ -36,7 +38,7 @@ function setters.initialize(filename,name,values) -- filename only for diagnosti -- trace_initialize = true local data = setter.data if data then - for key, newvalue in next, values do + for key, newvalue in sortedhash(values) do local newvalue = is_boolean(newvalue,newvalue,true) -- strict local functions = data[key] if functions then @@ -91,7 +93,7 @@ local function set(t,what,newvalue) done = { } t.done = done end - for w, value in next, what do + for w, value in sortedhash(what) do if value == "" then value = newvalue elseif not value then @@ -100,7 +102,7 @@ local function set(t,what,newvalue) value = is_boolean(value,value,true) -- strict end w = topattern(w,true,true) - for name, functions in next, data do + for name, functions in sortedhash(data) do if done[name] then -- prevent recursion due to wildcards elseif find(name,w) then @@ -118,7 +120,7 @@ end local function reset(t) local data = t.data if not data.frozen then - for name, functions in next, data do + for name, functions in sortedthash(data) do for i=1,#functions do functions[i](false) end @@ -219,13 +221,30 @@ function setters.show(t) local name = list[k] local functions = t.data[name] if functions then - local value, default, modules = functions.value, functions.default, #functions - value = value == nil and "unset" or tostring(value) - default = default == nil and "unset" or tostring(default) - t.report("%-50s modules: %2i default: %-12s value: %-12s",name,modules,default,value) + local value = functions.value + local default = functions.default + local modules = #functions + if default == nil then + default = "unset" + elseif type(default) == "table" then + default = concat(default,"|") + else + default = tostring(default) + end + if value == nil then + value = "unset" + elseif type(value) == "table" then + value = concat(value,"|") + else + value = tostring(value) + end + t.report(name) + t.report(" modules : %i",modules) + t.report(" default : %s",default) + t.report(" value : %s",value) + t.report() end end - t.report() end -- we could have used a bit of oo and the trackers:enable syntax but diff --git a/tex/context/base/mkiv/trac-tex.lua b/tex/context/base/mkiv/trac-tex.lua index 66cdc2c91..66ff94721 100644 --- a/tex/context/base/mkiv/trac-tex.lua +++ b/tex/context/base/mkiv/trac-tex.lua @@ -16,10 +16,6 @@ local undefined = create("undefined").command function trackers.savehash() saved = texhashtokens() - if type(saved[1]) == "table" then - -- LUATEXVERSION < 1.002 - saved = table.tohash(saved) - end return saved end @@ -27,10 +23,6 @@ function trackers.dumphashtofile(filename,delta) local list = { } local hash = texhashtokens() local create = token.create - if type(hash[1]) == "table" then - -- LUATEXVERSION < 1.002 - hash = table.sortedkeys(hash) - end for i=1,#hash do local name = hash[i] if not delta or not saved[name] then @@ -84,7 +76,7 @@ local function saveusedfilesintrees(format) jobname = environment.jobname or "?", version = environment.version or "?", kind = environment.kind or "?", - files = resolvers.instance.foundintrees + files = resolvers.foundintrees() } local filename = file.replacesuffix(environment.jobname or "context-job",'jlg') if format == "lua" then diff --git a/tex/context/base/mkiv/trac-tex.mkiv b/tex/context/base/mkiv/trac-tex.mkiv index 53c95ab01..4c2db68f3 100644 --- a/tex/context/base/mkiv/trac-tex.mkiv +++ b/tex/context/base/mkiv/trac-tex.mkiv @@ -13,7 +13,7 @@ \writestatus{loading}{ConTeXt Tracking Macros / TeX} -\registerctxluafile{trac-tex}{1.001} +\registerctxluafile{trac-tex}{} %D All tracing flags at the \TEX\ end will be redone this way so %D that we have a similar mechanism for \TEX\ and \LUA. Also, the diff --git a/tex/context/base/mkiv/trac-vis.lua b/tex/context/base/mkiv/trac-vis.lua index 5d98bc24f..0e37752db 100644 --- a/tex/context/base/mkiv/trac-vis.lua +++ b/tex/context/base/mkiv/trac-vis.lua @@ -6,28 +6,22 @@ if not modules then modules = { } end modules ['trac-vis'] = { license = "see context related readme files" } -local string, number, table = string, number, table local node, nodes, attributes, fonts, tex = node, nodes, attributes, fonts, tex -local type = type +local type, tonumber, next = type, tonumber, next local gmatch = string.gmatch local formatters = string.formatters - --- This module started out in the early days of mkiv and luatex with --- visualizing kerns related to fonts. In the process of cleaning up the --- visual debugger code it made sense to integrate some other code that --- I had laying around and replace the old supp-vis debugging code. As --- only a subset of the old visual debugger makes sense it has become a --- different implementation. Soms of the m-visual functionality will also --- be ported. The code is rather trivial. The caching is not really needed --- but saves upto 50% of the time needed to add visualization. Of course --- the overall runtime is larger because of color and layer processing in --- the backend (can be times as much) so the runtime is somewhat larger --- with full visualization enabled. In practice this will never happen --- unless one is demoing. - --- We could use pdf literals and re stream codes but it's not worth the --- trouble because we would end up in color etc mess. Maybe one day I'll --- make a nodeinjection variant. +local compactfloat = number.compactfloat + +-- This module started out in the early days of mkiv and luatex with visualizing +-- kerns related to fonts. In the process of cleaning up the visual debugger code it +-- made sense to integrate some other code that I had laying around and replace the +-- old supp-vis debugging code. As only a subset of the old visual debugger makes +-- sense it has become a different implementation. Soms of the m-visual +-- functionality will also be ported. The code is rather trivial. The caching is not +-- really needed but saves upto 50% of the time needed to add visualization. Of +-- course the overall runtime is larger because of color and layer processing in the +-- backend (can be times as much) so the runtime is somewhat larger with full +-- visualization enabled. In practice this will never happen unless one is demoing. -- todo: global switch (so no attributes) -- todo: maybe also xoffset, yoffset of glyph @@ -37,38 +31,12 @@ local formatters = string.formatters -- todo: dir and localpar nodes local nodecodes = nodes.nodecodes -local disc_code = nodecodes.disc -local kern_code = nodecodes.kern -local glyph_code = nodecodes.glyph -local hlist_code = nodecodes.hlist -local vlist_code = nodecodes.vlist -local glue_code = nodecodes.glue -local penalty_code = nodecodes.penalty -local whatsit_code = nodecodes.whatsit -local user_code = nodecodes.user -local math_code = nodecodes.math -local gluespec_code = nodecodes.gluespec - -local kerncodes = nodes.kerncodes -local font_kern_code = kerncodes.fontkern -local user_kern_code = kerncodes.userkern - -local gluecodes = nodes.gluecodes -local cleaders_code = gluecodes.cleaders -local userskip_code = gluecodes.userskip -local space_code = gluecodes.space -local xspace_code = gluecodes.xspace -local leftskip_code = gluecodes.leftskip -local rightskip_code = gluecodes.rightskip - -local whatsitcodes = nodes.whatsitcodes -local mathcodes = nodes.mathcodes local nuts = nodes.nuts local tonut = nuts.tonut local tonode = nuts.tonode -local setfield = nuts.setfield +----- setfield = nuts.setfield local setboth = nuts.setboth local setlink = nuts.setlink local setdisc = nuts.setdisc @@ -97,6 +65,7 @@ local getkern = nuts.getkern local getpenalty = nuts.getpenalty local getdir = nuts.getdir local getwidth = nuts.getwidth +local getdepth = nuts.getdepth local getshift = nuts.getshift local hpack_nodes = nuts.hpack @@ -115,6 +84,8 @@ local hpack_string = nuts.typesetters.tohpack local texgetattribute = tex.getattribute local texsetattribute = tex.setattribute +local setmetatableindex = table.setmetatableindex + local unsetvalue = attributes.unsetvalue local current_font = font.current @@ -144,57 +115,61 @@ local starttiming = statistics.starttiming local stoptiming = statistics.stoptiming local a_visual = attributes.private("visual") -local a_fontkern = attributes.private("fontkern") local a_layer = attributes.private("viewerlayer") -local hasbit = number.hasbit -local bit = number.bit -local setbit = number.setbit -local clearbit = number.clearbit +local band = bit32.band +local bor = bit32.bor local enableaction = nodes.tasks.enableaction -local trace_hbox -local trace_vbox -local trace_vtop -local trace_kern -local trace_glue -local trace_penalty -local trace_fontkern -local trace_strut -local trace_whatsit -local trace_user -local trace_math -local trace_italic -local trace_discretionary +-- local trace_hbox +-- local trace_vbox +-- local trace_vtop +-- local trace_kern +-- local trace_glue +-- local trace_penalty +-- local trace_fontkern +-- local trace_strut +-- local trace_whatsit +-- local trace_user +-- local trace_math +-- local trace_italic +-- local trace_discretionary +-- local trace_expansion +-- local trace_line +-- local trace_space local report_visualize = logs.reporter("visualize") local modes = { - hbox = 1, - vbox = 2, - vtop = 4, - kern = 8, - glue = 16, - -- skip = 16, - penalty = 32, - fontkern = 64, - strut = 128, - whatsit = 256, - glyph = 512, - simple = 1024, - simplehbox = 1024 + 1, - simplevbox = 1024 + 2, - simplevtop = 1024 + 4, - user = 2048, - math = 4096, - italic = 8192, - origin = 16384, - discretionary = 32768, + hbox = 1, + vbox = 2, + vtop = 4, + kern = 8, + glue = 16, + -- skip = 16, + penalty = 32, + fontkern = 64, + strut = 128, + whatsit = 256, + glyph = 512, + simple = 1024, + simplehbox = 1024 + 1, + simplevbox = 1024 + 2, + simplevtop = 1024 + 4, + user = 2048, + math = 4096, + italic = 8192, + origin = 16384, + discretionary = 32768, + expansion = 65536, + line = 131072, + space = 262144, + depth = 524288, } local usedfont, exheight, emwidth -local l_penalty, l_glue, l_kern, l_fontkern, l_hbox, l_vbox, l_vtop, l_strut, l_whatsit, l_glyph, l_user, l_math, l_italic, l_origin, l_discretionary +local l_penalty, l_glue, l_kern, l_fontkern, l_hbox, l_vbox, l_vtop, l_strut, l_whatsit, l_glyph, l_user, l_math, l_italic, l_origin, l_discretionary, l_expansion, l_line, l_space, l_depth local enabled = false local layers = { } @@ -213,6 +188,8 @@ end -- we can preset a bunch of bits +local userrule -- bah, not yet defined: todo, delayed(nuts.rules,"userrule") + local function enable() if not usedfont then -- we use a narrow monospaced font -- infofont ? @@ -244,10 +221,18 @@ local function enable() l_italic = layers.italic l_origin = layers.origin l_discretionary = layers.discretionary + l_expansion = layers.expansion + l_line = layers.line + l_space = layers.space + l_depth = layers.depth enableaction("shipouts","nodes.visualizers.handler") report_visualize("enabled") enabled = true tex.setcount("global","c_syst_visualizers_state",1) -- so that we can optimize at the tex end + -- + if not userrule then + userrule = nuts.rules.userrule + end end local function setvisual(n,a,what,list) -- this will become more efficient when we have the bit lib linked in @@ -257,13 +242,13 @@ local function setvisual(n,a,what,list) -- this will become more efficient when if not a or a == 0 or a == unsetvalue then a = preset_makeup else - a = setbit(a,preset_makeup) + a = bor(a,preset_makeup) end elseif n == "boxes" then if not a or a == 0 or a == unsetvalue then a = preset_boxes else - a = setbit(a,preset_boxes) + a = bor(a,preset_boxes) end elseif n == "all" then if what == false then @@ -271,7 +256,7 @@ local function setvisual(n,a,what,list) -- this will become more efficient when elseif not a or a == 0 or a == unsetvalue then a = preset_all else - a = setbit(a,preset_all) + a = bor(a,preset_all) end else for s in gmatch(n,"[a-z]+") do @@ -281,7 +266,7 @@ local function setvisual(n,a,what,list) -- this will become more efficient when elseif not a or a == 0 or a == unsetvalue then a = m else - a = setbit(a,m) + a = bor(a,m) end end end @@ -297,18 +282,53 @@ function nuts.setvisual(n,mode) setattr(n,a_visual,setvisual(mode,getattr(n,a_visual),true)) end -function nuts.setvisuals(n,mode) +function nuts.setvisuals(n,mode) -- currently the same setattr(n,a_visual,setvisual(mode,getattr(n,a_visual),true,true)) end -function nuts.applyvisuals(n,mode) +-- fast setters + +do + + local cached = setmetatableindex(function(t,k) + if k == true then + return texgetattribute(a_visual) + elseif not k then + t[k] = unsetvalue + return unsetvalue + else + local v = setvisual(k) + t[k] = v + return v + end + end) + + -- local function applyvisuals(n,mode) + -- local a = cached[mode] + -- apply_to_nodes(n,function(n) setattr(n,a_visual,a) end) + -- end + local a = unsetvalue - if mode == true then - a = texgetattribute (a_visual) - elseif mode then - a = setvisual(mode) + + local f = function(n) setattr(n,a_visual,a) end + + local function applyvisuals(n,mode) + a = cached[mode] + apply_to_nodes(n,f) + end + + nuts.applyvisuals = applyvisuals + + function nodes.applyvisuals(n,mode) + applyvisuals(tonut(n),mode) + end + + function visualizers.attribute(mode) + return cached[mode] end - apply_to_nodes(n,function(n) setattr(n,a_visual,a) end) + + visualizers.attributes = cached + end function nuts.copyvisual(n,m) @@ -348,6 +368,7 @@ local c_negative = "trace:r" local c_zero = "trace:g" local c_text = "trace:s" local c_space = "trace:y" +local c_space_x = "trace:m" local c_skip_a = "trace:c" local c_skip_b = "trace:m" local c_glyph = "trace:o" @@ -355,13 +376,16 @@ local c_ligature = "trace:s" local c_white = "trace:w" local c_math = "trace:r" local c_origin = "trace:o" -local c_discretionary = "trace:o" +local c_discretionary = "trace:d" +local c_expansion = "trace:o" +local c_depth = "trace:o" local c_positive_d = "trace:db" local c_negative_d = "trace:dr" local c_zero_d = "trace:dg" local c_text_d = "trace:ds" local c_space_d = "trace:dy" +local c_space_x_d = "trace:dm" local c_skip_a_d = "trace:dc" local c_skip_b_d = "trace:dm" local c_glyph_d = "trace:do" @@ -369,7 +393,9 @@ local c_ligature_d = "trace:ds" local c_white_d = "trace:dw" local c_math_d = "trace:dr" local c_origin_d = "trace:do" -local c_discretionary_d = "trace:do" +local c_discretionary_d = "trace:dd" +local c_expansion_d = "trace:do" +local c_depth_d = "trace:do" local function sometext(str,layer,color,textcolor,lap) -- we can just paste verbatim together .. no typesteting needed local text = hpack_string(str,usedfont) @@ -389,7 +415,7 @@ local function sometext(str,layer,color,textcolor,lap) -- we can just paste verb if lap then info = new_hlist(setlink(new_kern(-width),info)) else - info = new_hlist(info) + info = new_hlist(info) -- a bit overkill: double wrapped end if layer then setattr(info,a_layer,layer) @@ -397,21 +423,41 @@ local function sometext(str,layer,color,textcolor,lap) -- we can just paste verb return info, width end -local caches = table.setmetatableindex("table") +local function someblob(str,layer,color,textcolor,width) + local text = hpack_string(str,usedfont) + local size = getwidth(text) + local rule = new_rule(width,2*exheight,exheight/2) + local kern = new_kern(-width + (width-size)/2) + if color then + setcolor(rule,color) + end + if textcolor then + setlistcolor(getlist(text),textcolor) + end + local info = setlink(rule,kern,text) + setlisttransparency(info,c_zero) + info = hpack_nodes(info) + local width = getwidth(info) + info = new_hlist(info) + if layer then + setattr(info,a_layer,layer) + end + return info, width +end + +local caches = setmetatableindex("table") -local fontkern do +local fontkern, italickern do local f_cache = caches["fontkern"] + local i_cache = caches["italickern"] - fontkern = function(head,current) + local function somekern(head,current,cache,color,layer) local width = getkern(current) local extra = getfield(current,"expansion_factor") local kern = width + extra - local info = f_cache[kern] - -- report_visualize("fontkern: %p ex %p",width,extra) - if info then - -- print("hit fontkern") - else + local info = cache[kern] + if not info then local text = hpack_string(formatters[" %0.3f"](kern*pt_factor),usedfont) local rule = new_rule(emwidth/fraction,6*exheight,2*exheight) local list = getlist(text) @@ -422,25 +468,102 @@ local fontkern do else setlistcolor(list,c_zero_d) end - setlisttransparency(list,c_text_d) - setcolor(rule,c_text_d) - settransparency(rule,c_text_d) + setlisttransparency(list,color) + setcolor(rule,color) + settransparency(rule,color) setshift(text,-5 * exheight) info = new_hlist(setlink(rule,text)) - setattr(info,a_layer,l_fontkern) + setattr(info,a_layer,layer) f_cache[kern] = info end head = insert_node_before(head,current,copy_list(info)) return head, current end + fontkern = function(head,current) + return somekern(head,current,f_cache,c_text_d,l_fontkern) + end + + italickern = function(head,current) + return somekern(head,current,i_cache,c_glyph_d,l_italic) + end + +end + +local glyphexpansion do + + local f_cache = caches["glyphexpansion"] + + glyphexpansion = function(head,current) + local extra = getfield(current,"expansion_factor") + if extra ~= 0 then + extra = extra / 1000 + local info = f_cache[extra] + if not info then + local text = hpack_string(compactfloat(extra,"%.1f"),usedfont) + local rule = new_rule(emwidth/fraction,exheight,2*exheight) + local list = getlist(text) + if extra > 0 then + setlistcolor(list,c_positive_d) + elseif extra < 0 then + setlistcolor(list,c_negative_d) + end + setlisttransparency(list,c_text_d) + setcolor(rule,c_text_d) + settransparency(rule,c_text_d) + setshift(text,1.5 * exheight) + info = new_hlist(setlink(rule,text)) + setattr(info,a_layer,l_expansion) + f_cache[extra] = info + end + head = insert_node_before(head,current,copy_list(info)) + return head, current + end + return head, current + end + +end + +local kernexpansion do + + local f_cache = caches["kernexpansion"] + + kernexpansion = function(head,current) + local extra = getfield(current,"expansion_factor") + if extra ~= 0 then + extra = extra / 1000 + local info = f_cache[extra] + if not info then + local text = hpack_string(compactfloat(extra,"%.1f"),usedfont) + local rule = new_rule(emwidth/fraction,exheight,4*exheight) + local list = getlist(text) + if extra > 0 then + setlistcolor(list,c_positive_d) + elseif extra < 0 then + setlistcolor(list,c_negative_d) + end + setlisttransparency(list,c_text_d) + setcolor(rule,c_text_d) + settransparency(rule,c_text_d) + setshift(text,3.5 * exheight) + info = new_hlist(setlink(rule,text)) + setattr(info,a_layer,l_expansion) + f_cache[extra] = info + end + head = insert_node_before(head,current,copy_list(info)) + return head, current + end + return head, current + end + end local whatsit do - local w_cache = caches["whatsit"] + local whatsitcodes = nodes.whatsitcodes + local w_cache = caches["whatsit"] - local tags = { + local tags = { open = "FIC", write = "FIW", close = "FIC", @@ -506,12 +629,12 @@ end local math do - local m_cache = { + local mathcodes = nodes.mathcodes + local m_cache = { beginmath = caches["bmath"], endmath = caches["emath"], } - - local tags = { + local tags = { beginmath = "B", endmath = "E", } @@ -543,12 +666,27 @@ local math do end +local ruleddepth do + + ruleddepth = function(current,wd,ht,dp) + local wd, ht, dp = getwhd(current) + if dp ~= 0 then + local rule = new_rule(wd,0,dp) + setcolor(rule,c_depth) + settransparency(rule,c_zero) + setattr(rule,a_layer,l_depth) + setlist(current,setlink(rule,new_kern(-wd),getlist(current))) + end + end + +end + local ruledbox do local b_cache = caches["box"] local o_cache = caches["origin"] - table.setmetatableindex(o_cache,function(t,size) + setmetatableindex(o_cache,function(t,size) local rule = new_rule(2*size,size,size) local origin = hpack_nodes(rule) setcolor(rule,c_origin_d) @@ -572,30 +710,30 @@ local ruledbox do setboth(current) local linewidth = emwidth/fraction local size = 2*linewidth - local baseline, baseskip - if dp ~= 0 and ht ~= 0 then - if wd > 20*linewidth then - local targetsize = wd - size - baseline = b_cache[targetsize] - if not baseline then - -- due to an optimized leader color/transparency we need to set the glue node in order - -- to trigger this mechanism - local leader = setlink(new_glue(size),new_rule(3*size,linewidth,0),new_glue(size)) - leader = hpack_nodes(leader) - baseline = new_glue(0,65536,0,2,0) - setleader(baseline,leader) - setsubtype(baseline,cleaders_code) - setlisttransparency(baseline,c_text) - baseline = hpack_nodes(baseline,targetsize) - b_cache[targetsize] = baseline - end - baseline = copy_list(baseline) - baseskip = new_kern(-wd+linewidth) - else - baseline = new_rule(wd-size,linewidth,0) - baseskip = new_kern(-wd+size) - end - end + -- local baseline, baseskip + -- if dp ~= 0 and ht ~= 0 then + -- if wd > 20*linewidth then + -- local targetsize = wd - size + -- baseline = b_cache[targetsize] + -- if not baseline then + -- -- due to an optimized leader color/transparency we need to set the glue node in order + -- -- to trigger this mechanism + -- local leader = setlink(new_glue(size),new_rule(3*size,linewidth,0),new_glue(size)) + -- leader = hpack_nodes(leader) + -- baseline = new_glue(0,65536,0,2,0) + -- setleader(baseline,leader) + -- setsubtype(baseline,cleaders_code) + -- setlisttransparency(baseline,c_text) + -- baseline = hpack_nodes(baseline,targetsize) + -- b_cache[targetsize] = baseline + -- end + -- baseline = copy_list(baseline) + -- baseskip = new_kern(-wd+linewidth) + -- else + -- baseline = new_rule(wd-size,linewidth,0) + -- baseskip = new_kern(-wd+size) + -- end + -- end local this if not simple then this = b_cache[what] @@ -608,16 +746,31 @@ local ruledbox do end end -- we need to trigger the right mode (else sometimes no whatits) + -- local info = setlink( + -- this and copy_list(this) or nil, + -- new_rule(linewidth,ht,dp), + -- new_rule(wd-size,-dp+linewidth,dp), + -- new_rule(linewidth,ht,dp), + -- new_kern(-wd+linewidth), + -- new_rule(wd-size,ht,-ht+linewidth), + -- baseskip, + -- baseskip and baseline or nil + -- ) + -- + -- userrules: + -- local info = setlink( this and copy_list(this) or nil, - new_rule(linewidth,ht,dp), - new_rule(wd-size,-dp+linewidth,dp), - new_rule(linewidth,ht,dp), - new_kern(-wd+linewidth), - new_rule(wd-size,ht,-ht+linewidth), - baseskip, - baseskip and baseline or nil + userrule { + width = wd, + height = ht, + depth = dp, + line = linewidth, + type = "box", + dashed = 3*size, + } ) + -- setlisttransparency(info,c_text) info = new_hlist(info) -- @@ -665,13 +818,13 @@ local ruledbox do if next then setlink(info,next) end - if prev then - if getid(prev) == gluespec_code then - report_visualize("ignoring invalid prev") - -- weird, how can this happen, an inline glue-spec, probably math - else + if prev and prev > 0 then + -- if getid(prev) == gluespec_code then + -- report_visualize("ignoring invalid prev") + -- -- weird, how can this happen, an inline glue-spec, probably math + -- else setlink(prev,info) - end + -- end end if head == current then return info, info @@ -687,6 +840,10 @@ end local ruledglyph do + -- see boundingbox feature .. maybe a pdf stream is more efficient, after all we + -- have a frozen color anyway or i need a more detailed cache .. below is a more + -- texie approach + ruledglyph = function(head,current,previous) -- wrong for vertical glyphs local wd = getwidth(current) -- local wd = chardata[getfont(current)][getchar(current)].width @@ -700,22 +857,54 @@ local ruledglyph do local prev = previous setboth(current) local linewidth = emwidth/(2*fraction) - local baseline - -- if dp ~= 0 and ht ~= 0 then - if (dp >= 0 and ht >= 0) or (dp <= 0 and ht <= 0) then - baseline = new_rule(wd-2*linewidth,linewidth,0) - end - local doublelinewidth = 2*linewidth - -- could be a pdf rule (or a user rule now) - local info = setlink( - new_rule(linewidth,ht,dp), - new_rule(wd-doublelinewidth,-dp+linewidth,dp), - new_rule(linewidth,ht,dp), - new_kern(-wd+linewidth), - new_rule(wd-doublelinewidth,ht,-ht+linewidth), - new_kern(-wd+doublelinewidth), - baseline + local info + -- + -- original + -- + -- local baseline + -- if (dp >= 0 and ht >= 0) or (dp <= 0 and ht <= 0) then + -- baseline = new_rule(wd-2*linewidth,linewidth,0) + -- end + -- local doublelinewidth = 2*linewidth + -- -- could be a pdf rule (or a user rule now) + -- info = setlink( + -- new_rule(linewidth,ht,dp), + -- new_rule(wd-doublelinewidth,-dp+linewidth,dp), + -- new_rule(linewidth,ht,dp), + -- new_kern(-wd+linewidth), + -- new_rule(wd-doublelinewidth,ht,-ht+linewidth), + -- new_kern(-wd+doublelinewidth), + -- baseline + -- ) + -- + -- experiment with subtype outline + -- + -- if (dp >= 0 and ht >= 0) or (dp <= 0 and ht <= 0) then + -- baseline = new_rule(wd,linewidth/2,0) + -- end + -- local r = new_rule(wd-linewidth,ht-linewidth/4,dp-linewidth/4) + -- setsubtype(r,nodes.rulecodes.outline) + -- setfield(r,"transform",linewidth) + -- info = setlink( + -- new_kern(linewidth/4), + -- r, + -- new_kern(-wd+linewidth/2), + -- baseline + -- ) + -- + -- userrules: + -- + info = setlink( + userrule { + width = wd, + height = ht, + depth = dp, + line = linewidth, + type = "box", + }, + new_kern(-wd) ) + -- local char = chardata[getfont(current)][getchar(current)] if char and type(char.unicode) == "table" then -- hackery test setlistcolor(info,c_ligature) @@ -745,37 +934,49 @@ local ruledglyph do end end + function visualizers.setruledglyph(f) + ruledglyph = f or ruledglyph + end + end local ruledglue do + local gluecodes = nodes.gluecodes + local cleaders_code = gluecodes.cleaders + local userskip_code = gluecodes.userskip + local space_code = gluecodes.spaceskip + local xspace_code = gluecodes.xspaceskip + local leftskip_code = gluecodes.leftskip + local rightskip_code = gluecodes.rightskip + local g_cache_v = caches["vglue"] local g_cache_h = caches["hglue"] local tags = { -- userskip = "US", - lineskip = "LS", - baselineskip = "BS", - parskip = "PS", - abovedisplayskip = "DA", - belowdisplayskip = "DB", - abovedisplayshortskip = "SA", - belowdisplayshortskip = "SB", - leftskip = "LS", - rightskip = "RS", - topskip = "TS", - splittopskip = "ST", - tabskip = "AS", - spaceskip = "SS", - xspaceskip = "XS", - parfillskip = "PF", - thinmuskip = "MS", - medmuskip = "MM", - thickmuskip = "ML", - leaders = "NL", - cleaders = "CL", - xleaders = "XL", - gleaders = "GL", + [gluecodes.lineskip] = "LS", + [gluecodes.baselineskip] = "BS", + [gluecodes.parskip] = "PS", + [gluecodes.abovedisplayskip] = "DA", + [gluecodes.belowdisplayskip] = "DB", + [gluecodes.abovedisplayshortskip] = "SA", + [gluecodes.belowdisplayshortskip] = "SB", + [gluecodes.leftskip] = "LS", + [gluecodes.rightskip] = "RS", + [gluecodes.topskip] = "TS", + [gluecodes.splittopskip] = "ST", + [gluecodes.tabskip] = "AS", + [gluecodes.spaceskip] = "SP", + [gluecodes.xspaceskip] = "XS", + [gluecodes.parfillskip] = "PF", + [gluecodes.thinmuskip] = "MS", + [gluecodes.medmuskip] = "MM", + [gluecodes.thickmuskip] = "ML", + [gluecodes.leaders] = "NL", + [gluecodes.cleaders] = "CL", + [gluecodes.xleaders] = "XL", + [gluecodes.gleaders] = "GL", -- true = "VS", -- false = "HS", } @@ -790,7 +991,7 @@ local ruledglue do if info then -- print("glue hit") else - if subtype == space_code or subtype == xspace_code then -- not yet all space + if subtype == space_code or subtype == xspace_code then info = sometext(amount,l_glue,c_space) elseif subtype == leftskip_code or subtype == rightskip_code then info = sometext(amount,l_glue,c_skip_a) @@ -815,6 +1016,55 @@ local ruledglue do return head, getnext(current) end + -- ruledspace = function(head,current,parent) + -- local subtype = getsubtype(current) + -- if subtype == space_code or subtype == xspace_code then + -- local width = effectiveglue(current,parent) + -- local amount = formatters["%s:%0.3f"](tags[subtype] or "HS",width*pt_factor) + -- local info = g_cache_h[amount] + -- if info then + -- -- print("space hit") + -- else + -- info = sometext(amount,l_glue,c_space) + -- g_cache_h[amount] = info + -- end + -- info = copy_list(info) + -- head, current = insert_node_before(head,current,info) + -- return head, getnext(current) + -- else + -- return head, current + -- end + -- end + + local g_cache_s = caches["space"] + local g_cache_x = caches["xspace"] + + ruledspace = function(head,current,parent) + local subtype = getsubtype(current) + if subtype == space_code or subtype == xspace_code then -- not yet all space + local width = effectiveglue(current,parent) + local info + if subtype == space_code then + info = g_cache_s[width] + if not info then + info = someblob("SP",l_glue,c_space,nil,width) + g_cache_s[width] = info + end + else + info = g_cache_x[width] + if not info then + info = someblob("XS",l_glue,c_space_x,nil,width) + g_cache_x[width] = info + end + end + info = copy_list(info) + head, current = insert_node_before(head,current,info) + return head, getnext(current) + else + return head, current + end + end + end local ruledkern do @@ -823,11 +1073,10 @@ local ruledkern do local k_cache_h = caches["hkern"] ruledkern = function(head,current,vertical) - local kern = getkern(current) - local info = (vertical and k_cache_v or k_cache_h)[kern] - if info then - -- print("kern hit") - else + local kern = getkern(current) + local cache = vertical and k_cache_v or k_cache_h + local info = cache[kern] + if not info then local amount = formatters["%s:%0.3f"](vertical and "VK" or "HK",kern*pt_factor) if kern > 0 then info = sometext(amount,l_kern,c_positive) @@ -836,7 +1085,7 @@ local ruledkern do else info = sometext(amount,l_kern,c_zero) end - (vertical and k_cache_v or k_cache_h)[kern] = info + cache[kern] = info end info = copy_list(info) if vertical then @@ -850,14 +1099,12 @@ end local ruleditalic do - local i_cache = caches["itatalic"] + local i_cache = caches["italic"] ruleditalic = function(head,current) local kern = getkern(current) local info = i_cache[kern] - if info then - -- print("kern hit") - else + if not info then local amount = formatters["%s:%0.3f"]("IC",kern*pt_factor) if kern > 0 then info = sometext(amount,l_kern,c_positive) @@ -930,152 +1177,204 @@ local ruledpenalty do end -local function visualize(head,vertical,forced,parent) - local trace_hbox = false - local trace_vbox = false - local trace_vtop = false - local trace_kern = false - local trace_glue = false - local trace_penalty = false - local trace_fontkern = false - local trace_strut = false - local trace_whatsit = false - local trace_glyph = false - local trace_simple = false - local trace_user = false - local trace_math = false - local trace_italic = false - local trace_origin = false - local current = head - local previous = nil - local attr = unsetvalue - local prev_trace_fontkern = nil - while current do - local id = getid(current) - local a = forced or getattr(current,a_visual) or unsetvalue - if a ~= attr then - prev_trace_fontkern = trace_fontkern - if a == unsetvalue then - trace_hbox = false - trace_vbox = false - trace_vtop = false - trace_kern = false - trace_glue = false - trace_penalty = false - trace_fontkern = false - trace_strut = false - trace_whatsit = false - trace_glyph = false - trace_simple = false - trace_user = false - trace_math = false - trace_italic = false - trace_origin = false - trace_discretionary = false - else -- dead slow: - trace_hbox = hasbit(a, 1) - trace_vbox = hasbit(a, 2) - trace_vtop = hasbit(a, 4) - trace_kern = hasbit(a, 8) - trace_glue = hasbit(a, 16) - trace_penalty = hasbit(a, 32) - trace_fontkern = hasbit(a, 64) - trace_strut = hasbit(a, 128) - trace_whatsit = hasbit(a, 256) - trace_glyph = hasbit(a, 512) - trace_simple = hasbit(a, 1024) - trace_user = hasbit(a, 2048) - trace_math = hasbit(a, 4096) - trace_italic = hasbit(a, 8192) - trace_origin = hasbit(a,16384) - trace_discretionary = hasbit(a,32768) - end - attr = a - end - if trace_strut then - setattr(current,a_layer,l_strut) - elseif id == glyph_code then - if trace_glyph then - head, current = ruledglyph(head,current,previous) - end - elseif id == disc_code then - if trace_discretionary then - head, current = ruleddiscretionary(head,current) - end - local pre, post, replace = getdisc(current) - if pre then - pre = visualize(pre,false,a,parent) - end - if post then - post = visualize(post,false,a,parent) - end - if replace then - replace = visualize(replace,false,a,parent) +do + + local disc_code = nodecodes.disc + local kern_code = nodecodes.kern + local glyph_code = nodecodes.glyph + local glue_code = nodecodes.glue + local penalty_code = nodecodes.penalty + local whatsit_code = nodecodes.whatsit + local user_code = nodecodes.user + local math_code = nodecodes.math + local hlist_code = nodecodes.hlist + local vlist_code = nodecodes.vlist + + local kerncodes = nodes.kerncodes + local font_kern_code = kerncodes.fontkern + local italic_kern_code = kerncodes.italiccorrection + ----- user_kern_code = kerncodes.userkern + + local listcodes = nodes.listcodes + local line_code = listcodes.line + + local function visualize(head,vertical,forced,parent) + local trace_hbox = false + local trace_vbox = false + local trace_vtop = false + local trace_kern = false + local trace_glue = false + local trace_penalty = false + local trace_fontkern = false + local trace_strut = false + local trace_whatsit = false + local trace_glyph = false + local trace_simple = false + local trace_user = false + local trace_math = false + local trace_italic = false + local trace_origin = false + local trace_discretionary = false + local trace_expansion = false + local trace_line = false + local trace_space = false + local trace_depth = false + local current = head + local previous = nil + local attr = unsetvalue + local prev_trace_fontkern = nil + local prev_trace_italic = nil + local prev_trace_expansion = nil + while current do + local id = getid(current) + local a = forced or getattr(current,a_visual) or unsetvalue + if a ~= attr then + prev_trace_fontkern = trace_fontkern + prev_trace_italic = trace_italic + prev_trace_expansion = trace_expansion + if a == unsetvalue then + trace_hbox = false + trace_vbox = false + trace_vtop = false + trace_kern = false + trace_glue = false + trace_penalty = false + trace_fontkern = false + trace_strut = false + trace_whatsit = false + trace_glyph = false + trace_simple = false + trace_user = false + trace_math = false + trace_italic = false + trace_origin = false + trace_discretionary = false + trace_expansion = false + trace_line = false + trace_space = false + trace_depth = false + else -- dead slow: + trace_hbox = band(a, 1) ~= 0 + trace_vbox = band(a, 2) ~= 0 + trace_vtop = band(a, 4) ~= 0 + trace_kern = band(a, 8) ~= 0 + trace_glue = band(a, 16) ~= 0 + trace_penalty = band(a, 32) ~= 0 + trace_fontkern = band(a, 64) ~= 0 + trace_strut = band(a, 128) ~= 0 + trace_whatsit = band(a, 256) ~= 0 + trace_glyph = band(a, 512) ~= 0 + trace_simple = band(a, 1024) ~= 0 + trace_user = band(a, 2048) ~= 0 + trace_math = band(a, 4096) ~= 0 + trace_italic = band(a, 8192) ~= 0 + trace_origin = band(a, 16384) ~= 0 + trace_discretionary = band(a, 32768) ~= 0 + trace_expansion = band(a, 65536) ~= 0 + trace_line = band(a,131072) ~= 0 + trace_space = band(a,262144) ~= 0 + trace_depth = band(a,524288) ~= 0 + end + attr = a end - setdisc(current,pre,post,replace) - elseif id == kern_code then - local subtype = getsubtype(current) - -- tricky ... we don't copy the trace attribute in node-inj (yet) - if subtype == font_kern_code or getattr(current,a_fontkern) then - if trace_fontkern or prev_trace_fontkern then - head, current = fontkern(head,current) + if trace_strut then + setattr(current,a_layer,l_strut) + elseif id == glyph_code then + if trace_glyph then + head, current = ruledglyph(head,current,previous) end - else -- if subtype == user_kern_code then - if trace_italic then - head, current = ruleditalic(head,current) - elseif trace_kern then - head, current = ruledkern(head,current,vertical) + if trace_expansion then + head, current = glyphexpansion(head,current) + end + elseif id == disc_code then + if trace_discretionary then + head, current = ruleddiscretionary(head,current) + end + local pre, post, replace = getdisc(current) + if pre then + pre = visualize(pre,false,a,parent) + end + if post then + post = visualize(post,false,a,parent) + end + if replace then + replace = visualize(replace,false,a,parent) + end + setdisc(current,pre,post,replace) + elseif id == kern_code then + local subtype = getsubtype(current) + if subtype == font_kern_code then + if trace_fontkern or prev_trace_fontkern then + head, current = fontkern(head,current) + end + if trace_expansion or prev_trace_expansion then + head, current = kernexpansion(head,current) + end + elseif subtype == italic_kern_code then + if trace_italic or prev_trace_italic then + head, current = italickern(head,current) + elseif trace_kern then + head, current = ruleditalic(head,current) + end + else + if trace_kern then + head, current = ruledkern(head,current,vertical) + end + end + elseif id == glue_code then + local content = getleader(current) + if content then + setleader(current,visualize(content,false,nil,parent)) + elseif trace_glue then + head, current = ruledglue(head,current,vertical,parent) + elseif trace_space then + head, current = ruledspace(head,current,parent) + end + elseif id == penalty_code then + if trace_penalty then + head, current = ruledpenalty(head,current,vertical) + end + elseif id == hlist_code then + local content = getlist(current) + if content then + setlist(current,visualize(content,false,nil,current)) + end + if trace_depth then + ruleddepth(current) + end + if trace_line and getsubtype(current) == line_code then + head, current = ruledbox(head,current,false,l_line,"L__",trace_simple,previous,trace_origin,parent) + elseif trace_hbox then + head, current = ruledbox(head,current,false,l_hbox,"H__",trace_simple,previous,trace_origin,parent) + end + elseif id == vlist_code then + local content = getlist(current) + if content then + setlist(current,visualize(content,true,nil,current)) + end + if trace_vtop then + head, current = ruledbox(head,current,true,l_vtop,"_T_",trace_simple,previous,trace_origin,parent) + elseif trace_vbox then + head, current = ruledbox(head,current,true,l_vbox,"__V",trace_simple,previous,trace_origin,parent) + end + elseif id == whatsit_code then + if trace_whatsit then + head, current = whatsit(head,current) + end + elseif id == user_code then + if trace_user then + head, current = user(head,current) + end + elseif id == math_code then + if trace_math then + head, current = math(head,current) end end - elseif id == glue_code then - local content = getleader(current) - if content then - setleader(current,visualize(content,false,nil,parent)) - elseif trace_glue then - head, current = ruledglue(head,current,vertical,parent) - end - elseif id == penalty_code then - if trace_penalty then - head, current = ruledpenalty(head,current,vertical) - end - elseif id == hlist_code then - local content = getlist(current) - if content then - setlist(current,visualize(content,false,nil,current)) - end - if trace_hbox then - head, current = ruledbox(head,current,false,l_hbox,"H__",trace_simple,previous,trace_origin,parent) - end - elseif id == vlist_code then - local content = getlist(current) - if content then - setlist(current,visualize(content,true,nil,current)) - end - if trace_vtop then - head, current = ruledbox(head,current,true,l_vtop,"_T_",trace_simple,previous,trace_origin,parent) - elseif trace_vbox then - head, current = ruledbox(head,current,true,l_vbox,"__V",trace_simple,previous,trace_origin,parent) - end - elseif id == whatsit_code then - if trace_whatsit then - head, current = whatsit(head,current) - end - elseif id == user_code then - if trace_user then - head, current = user(head,current) - end - elseif id == math_code then - if trace_math then - head, current = math(head,current) - end + previous = current + current = getnext(current) end - previous = current - current = getnext(current) + return head end - return head -end - -do local function cleanup() for tag, cache in next, caches do @@ -1103,28 +1402,31 @@ do luatex.registerstopactions(cleanup) -end - -function visualizers.box(n) - if usedfont then - starttiming(visualizers) - local box = getbox(n) - if box then - setlist(box,visualize(getlist(box),getid(box) == vlist_code)) + function visualizers.box(n) + if usedfont then + starttiming(visualizers) + local box = getbox(n) + if box then + setlist(box,visualize(getlist(box),getid(box) == vlist_code)) + end + stoptiming(visualizers) + return head, true + else + return head, false end - stoptiming(visualizers) - return head, true - else - return head, false end + end do - local last = nil - local used = nil + local hlist_code = nodecodes.hlist + local vlist_code = nodecodes.vlist - local mark = { + local last = nil + local used = nil + + local mark = { "trace:1", "trace:2", "trace:3", "trace:4", "trace:5", "trace:6", "trace:7", @@ -1164,40 +1466,44 @@ end) -- interface -local implement = interfaces.implement +do -implement { - name = "setvisual", - arguments = "string", - actions = visualizers.setvisual -} + local implement = interfaces.implement -implement { - name = "setvisuals", - arguments = "string", - actions = visualizers.setvisual -} + implement { + name = "setvisual", + arguments = "string", + actions = visualizers.setvisual + } -implement { - name = "getvisual", - arguments = "string", - actions = { setvisual, context } -} + implement { + name = "setvisuals", + arguments = "string", + actions = visualizers.setvisual + } implement { - name = "setvisuallayer", - arguments = "string", - actions = visualizers.setlayer -} + name = "getvisual", + arguments = "string", + actions = { setvisual, context } + } -implement { - name = "markvisualfonts", - arguments = "integer", - actions = visualizers.markfonts -} + implement { + name = "setvisuallayer", + arguments = "string", + actions = visualizers.setlayer + } -implement { - name = "setvisualfont", - arguments = "integer", - actions = visualizers.setfont -} + implement { + name = "markvisualfonts", + arguments = "integer", + actions = visualizers.markfonts + } + + implement { + name = "setvisualfont", + arguments = "integer", + actions = visualizers.setfont + } + +end diff --git a/tex/context/base/mkiv/trac-vis.mkiv b/tex/context/base/mkiv/trac-vis.mkiv index 894408222..a6a3fa5a2 100644 --- a/tex/context/base/mkiv/trac-vis.mkiv +++ b/tex/context/base/mkiv/trac-vis.mkiv @@ -1,6 +1,6 @@ %D \module %D [ file=trac-vis, % replaces supp-vis plus some s-* modules -%D version=2112.06.23, % 1996.10.21, +%D version=2012.06.23, % 1996.10.21, %D title=\CONTEXT\ Tracing Macros, %D subtitle=Visualization, %D author=Hans Hagen, @@ -32,7 +32,7 @@ \writestatus{loading}{ConTeXt Tracing Macros / Visualization} -\registerctxluafile{trac-vis}{1.001} +\registerctxluafile{trac-vis}{optimize} \unprotect @@ -119,6 +119,12 @@ \unexpanded\def\showfontkerns {\clf_setvisual{fontkern}} +\unexpanded\def\showfontitalics + {\clf_setvisual{italic}} + +\unexpanded\def\showfontexpansion + {\clf_setvisual{expansion}} + \unexpanded\def\setvisualizerfont {\dosingleempty\syst_visualizers_setfont} diff --git a/tex/context/base/mkiv/type-ini.mkvi b/tex/context/base/mkiv/type-ini.mkvi index 3969a5b95..2ac3ee207 100644 --- a/tex/context/base/mkiv/type-ini.mkvi +++ b/tex/context/base/mkiv/type-ini.mkvi @@ -13,7 +13,7 @@ \writestatus{loading}{ConTeXt Typescript Macros / Initialization} -\registerctxluafile{type-ini}{1.001} +\registerctxluafile{type-ini}{} %D The default fontclass is empty. We could demand always using fontclasses, %D and then make the calling macros simplier (always assume fontclass) but @@ -258,7 +258,7 @@ \def\font_typescripts_synonym_define[#name][#synonym]% {\ifsecondargument\setevalue{\??typescriptsynonyms#name}{#synonym}\fi} -\def\truetypescript#name% recursove so no \lastnamedcs +\def\truetypescript#name% recursive so no \lastnamedcs {\ifcsname\??typescriptsynonyms#name\endcsname %\expandafter\truetypescript\csname\??typescriptsynonyms#name\endcsname \expandafter\truetypescript\lastnamedcs diff --git a/tex/context/base/mkiv/typo-bld.lua b/tex/context/base/mkiv/typo-bld.lua index 153218eef..753748a2e 100644 --- a/tex/context/base/mkiv/typo-bld.lua +++ b/tex/context/base/mkiv/typo-bld.lua @@ -43,6 +43,7 @@ local new_baselineskip = nodepool.baselineskip local new_lineskip = nodepool.lineskip local insert_node_before = nodes.insert_before local hpack_node = nodes.hpack +local count_nodes = nodes.countall local starttiming = statistics.starttiming local stoptiming = statistics.stoptiming @@ -193,9 +194,9 @@ function builders.vpack_filter(head,groupcode,size,packtype,maxdepth,direction) if head then starttiming(builders) if trace_vpacking then - local before = nodes.count(head) + local before = count_nodes(head) head, done = vboxactions(head,groupcode,size,packtype,maxdepth,direction) - local after = nodes.count(head) + local after = count_nodes(head) if done then nodes.processors.tracer("vpack","changed",head,groupcode,before,after,true) else diff --git a/tex/context/base/mkiv/typo-bld.mkiv b/tex/context/base/mkiv/typo-bld.mkiv index 621d81c52..8929fa22c 100644 --- a/tex/context/base/mkiv/typo-bld.mkiv +++ b/tex/context/base/mkiv/typo-bld.mkiv @@ -35,7 +35,7 @@ \unprotect -\registerctxluafile{typo-bld}{1.001} +\registerctxluafile{typo-bld}{} \definesystemattribute[parbuilder][public] diff --git a/tex/context/base/mkiv/typo-brk.lua b/tex/context/base/mkiv/typo-brk.lua index 84eff0654..51760bbf4 100644 --- a/tex/context/base/mkiv/typo-brk.lua +++ b/tex/context/base/mkiv/typo-brk.lua @@ -9,7 +9,7 @@ if not modules then modules = { } end modules ['typo-brk'] = { -- this code dates from the beginning and is kind of experimental; it -- will be optimized and improved soon -local next, type, tonumber = next, type, tonumber +local next, type, tonumber, tostring = next, type, tonumber, tostring local utfbyte, utfchar = utf.byte, utf.char local format = string.format @@ -31,14 +31,12 @@ local getboth = nuts.getboth local getsubtype = nuts.getsubtype local getfont = nuts.getfont local getid = nuts.getid -local getfield = nuts.getfield ----- getattr = nuts.getattr local getattrlist = nuts.getattrlist local takeattr = nuts.takeattr local getlang = nuts.getlang local isglyph = nuts.isglyph -local setfield = nuts.setfield local setattr = nuts.setattr local setattrlist = nuts.setattrlist local setlink = nuts.setlink diff --git a/tex/context/base/mkiv/typo-brk.mkiv b/tex/context/base/mkiv/typo-brk.mkiv index 3f9ce6f3a..10b2f8e21 100644 --- a/tex/context/base/mkiv/typo-brk.mkiv +++ b/tex/context/base/mkiv/typo-brk.mkiv @@ -21,7 +21,7 @@ % % -- we might eventually stick to only method 5 -\registerctxluafile{typo-brk}{1.001} +\registerctxluafile{typo-brk}{} \definesystemattribute[breakpoint][public,global] diff --git a/tex/context/base/mkiv/typo-cap.lua b/tex/context/base/mkiv/typo-cap.lua index 6bf4669df..4dffd1c49 100644 --- a/tex/context/base/mkiv/typo-cap.lua +++ b/tex/context/base/mkiv/typo-cap.lua @@ -6,7 +6,7 @@ if not modules then modules = { } end modules ['typo-cap'] = { license = "see context related readme files" } -local next, type = next, type +local next, type, tonumber = next, type, tonumber local format, insert = string.format, table.insert local div, getrandom = math.div, utilities.randomizer.get @@ -21,7 +21,6 @@ local nuts = nodes.nuts local tonode = nuts.tonode local tonut = nuts.tonut -local getfield = nuts.getfield local getnext = nuts.getnext local getprev = nuts.getprev local getid = nuts.getid @@ -32,7 +31,6 @@ local getsubtype = nuts.getsubtype local getchar = nuts.getchar local getdisc = nuts.getdisc -local setfield = nuts.setfield local setattr = nuts.setattr local setchar = nuts.setchar local setfont = nuts.setfont @@ -52,7 +50,7 @@ local kern_code = nodecodes.kern local disc_code = nodecodes.disc local math_code = nodecodes.math -local kerning_code = kerncodes.kerning +local fontkern_code = kerncodes.fontkern local enableaction = nodes.tasks.enableaction @@ -80,11 +78,10 @@ local a_cases = attributes.private("case") local extract = bit32.extract local run = 0 -- a trick to make neighbouring ranges work - local blocked = { } local function set(tag,font) - if run == 2^6 then + if run == 0x40 then -- 2^6 run = 1 else run = run + 1 @@ -95,12 +92,18 @@ local function set(tag,font) end local function get(a) - local font = extract(a,16,12) -- 4000 - local tag = extract(a, 8, 8) -- 250 - local run = extract(a, 0, 8) -- 50 - return tag, font, run + return + extract(a, 8, 8), -- tag + extract(a,16,12), -- font + extract(a, 0, 8) -- run end +-- local function get(a) +-- return +-- (a >> 8) & ~(-1 << 8), -- & 0x0FF -- tag +-- (a >> 16) & ~(-1 << 12), -- & 0xFFF -- font +-- (a >> 0) & ~(-1 << 8) -- & 0x0FF -- run +-- end -- print(get(set( 1, 0))) -- print(get(set( 1, 99))) @@ -427,7 +430,7 @@ function cases.handler(head) -- not real fast but also not used on much data elseif id == math_code then start = end_of_math(start) count = 0 - elseif prev_id == kern_code and getsubtype(prev) == kerning_code then + elseif prev_id == kern_code and getsubtype(prev) == fontkern_code then -- still inside a word ...normally kerns are added later else count = 0 @@ -535,7 +538,7 @@ end -- elseif id == math_code then -- start = end_of_math(start) -- count = 0 --- elseif prev_id == kern_code and getsubtype(prev) == kerning_code then +-- elseif prev_id == kern_code and getsubtype(prev) == fontkern_code then -- -- still inside a word ...normally kerns are added later -- else -- count = 0 diff --git a/tex/context/base/mkiv/typo-cap.mkiv b/tex/context/base/mkiv/typo-cap.mkiv index 96f3e28d6..4d1272e10 100644 --- a/tex/context/base/mkiv/typo-cap.mkiv +++ b/tex/context/base/mkiv/typo-cap.mkiv @@ -18,7 +18,7 @@ %D Maybe we need a more clever system: either command or style mode etc. so %D that we can avoid the grouped mess in a simple style switch. -\registerctxluafile{typo-cap}{1.001} +\registerctxluafile{typo-cap}{optimize} % \definesystemattribute[case][public] % already predefined diff --git a/tex/context/base/mkiv/typo-chr.lua b/tex/context/base/mkiv/typo-chr.lua index f6bcfde56..80497a492 100644 --- a/tex/context/base/mkiv/typo-chr.lua +++ b/tex/context/base/mkiv/typo-chr.lua @@ -88,6 +88,8 @@ if not modules then modules = { } end modules ['typo-chr'] = { local insert, remove = table.insert, table.remove +local context = context + local nodecodes = nodes.nodecodes local glyph_code = nodecodes.glyph local localpar_code = nodecodes.localpar diff --git a/tex/context/base/mkiv/typo-chr.mkiv b/tex/context/base/mkiv/typo-chr.mkiv index dc0c68664..c92c4562e 100644 --- a/tex/context/base/mkiv/typo-chr.mkiv +++ b/tex/context/base/mkiv/typo-chr.mkiv @@ -34,7 +34,7 @@ %D for instance when combining bit and pieces where keeping a state is complex compared %D to cleaning up unwanted stuff. -\registerctxluafile{typo-chr}{1.001} +\registerctxluafile{typo-chr}{} \definesystemattribute[marked][public] diff --git a/tex/context/base/mkiv/typo-cln.lua b/tex/context/base/mkiv/typo-cln.lua index 53452f838..b7187eaeb 100644 --- a/tex/context/base/mkiv/typo-cln.lua +++ b/tex/context/base/mkiv/typo-cln.lua @@ -10,6 +10,7 @@ if not modules then modules = { } end modules ['typo-cln'] = { -- this case Dream Theaters' Octavium). Of course extensions will take -- more time. +local tonumber = tonumber local utfbyte = utf.byte local trace_cleaners = false trackers.register("typesetters.cleaners", function(v) trace_cleaners = v end) @@ -36,7 +37,6 @@ local getchar = nuts.getchar local getattr = nuts.getattr local setattr = nuts.setattr -local setfield = nuts.setfield local setchar = nuts.setchar local traverse_id = nuts.traverse_id diff --git a/tex/context/base/mkiv/typo-cln.mkiv b/tex/context/base/mkiv/typo-cln.mkiv index 193198dc5..efc278cfa 100644 --- a/tex/context/base/mkiv/typo-cln.mkiv +++ b/tex/context/base/mkiv/typo-cln.mkiv @@ -15,7 +15,7 @@ \unprotect -\registerctxluafile{typo-cln}{1.001} +\registerctxluafile{typo-cln}{} \definesystemattribute[cleaner][public] diff --git a/tex/context/base/mkiv/typo-del.mkiv b/tex/context/base/mkiv/typo-del.mkiv index 84fe2c469..d12be6bcf 100644 --- a/tex/context/base/mkiv/typo-del.mkiv +++ b/tex/context/base/mkiv/typo-del.mkiv @@ -140,6 +140,18 @@ % \def\beforesubsentence{\removeunwantedspaces} % \def\aftersubsentence {\ignorespaces} +\newconditional\c_typo_subsentence_cleanup \settrue\c_typo_subsentence_cleanup + +\def\typo_subsentence_cleanup_start + {\ifconditional\c_typo_subsentence_cleanup + \expandafter\ignorespaces + \fi} + +\def\typo_subsentence_cleanup_stop + {\ifconditional\c_typo_subsentence_cleanup + \removeunwantedspaces + \fi} + \unexpanded\def\midsentence {\dostarttagged\t!subsentencesymbol\empty \dotagsetsubsentencesymbol\s!middle @@ -162,10 +174,11 @@ \symbol[\ifodd\c_typo_subsentence_nesting\c!leftsentence\else\c!leftsubsentence\fi]% \dostoptagged \dostarttagged\t!subsentencecontent\empty - }% \ignorespaces} + \typo_subsentence_cleanup_start} \unexpanded\def\endofsubsentence % relax prevents space gobbling - {\dostoptagged + {\typo_subsentence_cleanup_stop + \dostoptagged \dostarttagged\t!subsentencesymbol\empty \dotagsetsubsentencesymbol\s!right \symbol[\ifodd\c_typo_subsentence_nesting\c!rightsentence\else\c!rightsubsentence\fi]% @@ -184,7 +197,7 @@ \unskip \hskip\hspaceamount\currentusedlanguage{intersentence}% % no good, actually language dependent: -% \ignorespaces + % \ignorespaces \else \unskip \fi} @@ -199,9 +212,10 @@ %D \typebuffer %D \getbuffer -\unexpanded\def\startsubsentence{\beginofsubsentence \prewordbreak\beginofsubsentencespacing} -\unexpanded\def\stopsubsentence {\endofsubsentencespacing\prewordbreak\endofsubsentence} +\unexpanded\def\startsubsentence{\beginofsubsentence\prewordbreak\beginofsubsentencespacing\typo_subsentence_cleanup_start} +\unexpanded\def\stopsubsentence {\typo_subsentence_cleanup_stop\endofsubsentencespacing\prewordbreak\endofsubsentence} \unexpanded\def\subsentence {\groupedcommand\startsubsentence\stopsubsentence} +\unexpanded\def\midsubsentence {\typo_subsentence_cleanup_start\prewordbreak\midsentence\prewordbreak\typo_subsentence_cleanup_stop} \definehspace [quotation] [\zeropoint] \definehspace [interquotation] [.125em] @@ -369,7 +383,7 @@ %\c!language=\v!local, \c!repeat=\v!no] -\def\typo_delimited_repeat_ideed +\def\typo_delimited_repeat_indeed {\relax\ifcase\delimitedtextlevel\else \typo_delimited_handle_middle\c!middle \fi} @@ -648,6 +662,11 @@ \typo_delimited_right_symbol#1% \egroup} +\appendtoks + \localleftbox {}% + \localrightbox{}% +\to \everyforgetall + % \starttext % \hyphenatedword{groepsvrijstellingsverordeningen}\par % \hyphenatedword{\quote{groepsvrijstellingsverordeningen}}\par @@ -785,7 +804,8 @@ \dostarttaggedchained\t!delimited\currentdelimitedtext\??delimitedtext \usedelimitedtextstyleandcolor\c!style\c!color \typo_delimited_start_content - \typo_delimited_attributed_e + \bgroup + \aftergroup\typo_delimited_attributed_e \let\next=} \def\typo_delimited_attributed_e @@ -801,6 +821,7 @@ \usedlanguageparameter{\c!left\currentparentdelimitedtext}% was: \currentdelimitedtext \usedelimitedtextstyleandcolor\c!style\c!color \typo_delimited_start_content + \bgroup \aftergroup\typo_delimited_fontdriven_e \let\next=} diff --git a/tex/context/base/mkiv/typo-dha.lua b/tex/context/base/mkiv/typo-dha.lua index a32f72e46..af01f0f0d 100644 --- a/tex/context/base/mkiv/typo-dha.lua +++ b/tex/context/base/mkiv/typo-dha.lua @@ -55,13 +55,11 @@ local getchar = nuts.getchar local getid = nuts.getid local getsubtype = nuts.getsubtype local getlist = nuts.getlist -local getfield = nuts.getfield local getattr = nuts.getattr local getprop = nuts.getprop local getdir = nuts.getdir local isglyph = nuts.isglyph -- or ischar -local setfield = nuts.setfield local setprop = nuts.setprop local setchar = nuts.setchar @@ -86,8 +84,6 @@ local parfillskip_code = skipcodes.parfillskip local new_textdir = nodepool.textdir -local hasbit = number.hasbit -local formatters = string.formatters local insert = table.insert local fonthashes = fonts.hashes diff --git a/tex/context/base/mkiv/typo-dig.lua b/tex/context/base/mkiv/typo-dig.lua index 3d60131c7..61e96c6b6 100644 --- a/tex/context/base/mkiv/typo-dig.lua +++ b/tex/context/base/mkiv/typo-dig.lua @@ -9,7 +9,7 @@ if not modules then modules = { } end modules ['typo-dig'] = { -- we might consider doing this after the otf pass because now osf do not work -- out well in node mode. -local next, type = next, type +local next, type, tonumber = next, type, tonumber local format, insert = string.format, table.insert local round, div = math.round, math.div @@ -29,7 +29,6 @@ local getfont = nuts.getfont local getchar = nuts.getchar local getid = nuts.getid local getwidth = nuts.getwidth -local getfield = nuts.getfield local takeattr = nuts.takeattr local setlink = nuts.setlink diff --git a/tex/context/base/mkiv/typo-dig.mkiv b/tex/context/base/mkiv/typo-dig.mkiv index aa610b3c9..0f957fbc1 100644 --- a/tex/context/base/mkiv/typo-dig.mkiv +++ b/tex/context/base/mkiv/typo-dig.mkiv @@ -15,7 +15,7 @@ \unprotect -\registerctxluafile{typo-dig}{1.001} +\registerctxluafile{typo-dig}{} \definesystemattribute[digits][public] diff --git a/tex/context/base/mkiv/typo-dir.lua b/tex/context/base/mkiv/typo-dir.lua index 5ecf77a1f..7fbf5f6d3 100644 --- a/tex/context/base/mkiv/typo-dir.lua +++ b/tex/context/base/mkiv/typo-dir.lua @@ -28,7 +28,6 @@ if not modules then modules = { } end modules ['typo-dir'] = { local next, type = next, type local format, insert, sub, find, match = string.format, table.insert, string.sub, string.find, string.match -local formatters = string.formatters local nodes, node = nodes, node @@ -36,14 +35,19 @@ local trace_textdirections = false trackers.register("typesetters.directions.t local trace_mathdirections = false trackers.register("typesetters.directions.math", function(v) trace_mathdirections = v end) local trace_directions = false trackers.register("typesetters.directions", function(v) trace_textdirections = v trace_mathdirections = v end) +local one_too = false directives.register("typesetters.directions.onetoo", function(v) one_too = v end) + local report_textdirections = logs.reporter("typesetting","text directions") ----- report_mathdirections = logs.reporter("typesetting","math directions") -local hasbit = number.hasbit +local band = bit32.band local texsetattribute = tex.setattribute local unsetvalue = attributes.unsetvalue +local getnext = nodes.getnext +local getattr = nodes.getattr + local enableaction = nodes.tasks.enableaction local tracers = nodes.tracers local setcolor = tracers.colors.set @@ -62,9 +66,9 @@ local v_local = variables["local"] local v_on = variables.on local v_yes = variables.yes -local m_enabled = 2^6 -- 64 -local m_global = 2^7 -local m_fences = 2^8 +local m_enabled = 0x00000040 -- 2^6 64 +local m_global = 0x00000080 -- 2^7 +local m_fences = 0x00000100 -- 2^8 local handlers = { } local methods = { } @@ -107,11 +111,11 @@ local function tomode(specification) end local function getglobal(a) - return a and a > 0 and hasbit(a,m_global) + return a and a > 0 and band(a,m_global) ~= 0 end local function getfences(a) - return a and a > 0 and hasbit(a,m_fences) + return a and a > 0 and band(a,m_fences) ~= 0 end local function getmethod(a) @@ -155,11 +159,18 @@ local enabled = false local starttiming = statistics.starttiming local stoptiming = statistics.stoptiming -function directions.handler(head) -- ,_,_,_,direction) -- nodes not nuts | 5th arg is direction - if not head.next then +-- If we have hbox{!} then the hbox determines the direction but we can consider +-- a fast analysis, not that it matters much because there's nothing to swap in +-- the list unless one glyphs becomes multiple (can that really happen?). +-- +-- \enabledirectives[typesetters.directions.onetoo] + +function directions.handler(head,_,_,_,direction) + local only_one = not getnext(head) + if only_one and not one_too then return head, false end - local attr = head[a_directions] + local attr = getattr(head,a_directions) if not attr or attr == 0 then return head, false end @@ -169,7 +180,7 @@ function directions.handler(head) -- ,_,_,_,direction) -- nodes not nuts | 5th a return head, false end starttiming(directions) - local head, done = handler(head) + local head, done = handler(head,direction,only_one) stoptiming(directions) return head, done end diff --git a/tex/context/base/mkiv/typo-dir.mkiv b/tex/context/base/mkiv/typo-dir.mkiv index c5fd6fa41..d92c93793 100644 --- a/tex/context/base/mkiv/typo-dir.mkiv +++ b/tex/context/base/mkiv/typo-dir.mkiv @@ -18,11 +18,15 @@ \unprotect -\registerctxluafile{typo-dir}{1.001} -\registerctxluafile{typo-dha}{1.001} -\registerctxluafile{typo-dua}{1.001} -\registerctxluafile{typo-dub}{1.001} -\registerctxluafile{typo-duc}{1.001} +\registerctxluafile{typo-dir}{} +\registerctxluafile{typo-dha}{} +\registerctxluafile{typo-dua}{} +\registerctxluafile{typo-dub}{} +\doifelsefileexists{typo-duc-new.lua} { + \registerctxluafile{typo-duc-new}{} +} { + \registerctxluafile{typo-duc}{} +} \definesystemattribute[directions][public] @@ -81,14 +85,20 @@ \fi \to \everysetupdirections +\appendtoks + \edef\p_option{\directionsparameter\c!break}% name can change + \breakafterdirmode\ifx\p_option\v!both\plusone\else\zerocount\fi +\to \everysetupdirections + % bidi: local=obey grouping, global=ignore grouping (unicode has no grouping) \setupdirections % maybe start/stop [\c!bidi=\v!off, \c!method=\v!default, + \c!break=\v!both, % experimental value, maybe \v!no will be default (bad name too) \c!fences=\v!yes] -\unexpanded\edef\bidilre{\normalUchar"202A} % maybe \edef's +\unexpanded\edef\bidilre{\normalUchar"202A} \unexpanded\edef\bidirle{\normalUchar"202B} \unexpanded\edef\bidipop{\normalUchar"202C} \unexpanded\edef\bidilro{\normalUchar"202D} @@ -131,7 +141,7 @@ end \stopluacode -\def\biditest#1#2#3% font text raw +\unexpanded\def\biditest#1#2#3% font text raw {\dontleavehmode\hbox {\framed[offset=overlay]{\tttf#2}\quad \enabletrackers[typesetters.directions]% diff --git a/tex/context/base/mkiv/typo-drp.lua b/tex/context/base/mkiv/typo-drp.lua index e27ad75f3..1e142280f 100644 --- a/tex/context/base/mkiv/typo-drp.lua +++ b/tex/context/base/mkiv/typo-drp.lua @@ -36,11 +36,9 @@ local getprev = nuts.getprev local getchar = nuts.getchar local getid = nuts.getid local getsubtype = nuts.getsubtype -local getfield = nuts.getfield local getattr = nuts.getattr local getwhd = nuts.getwhd -local setfield = nuts.setfield local setattr = nuts.setattr local setlink = nuts.setlink local setprev = nuts.setprev diff --git a/tex/context/base/mkiv/typo-drp.mkiv b/tex/context/base/mkiv/typo-drp.mkiv index 2520c3bfd..371ea38d6 100644 --- a/tex/context/base/mkiv/typo-drp.mkiv +++ b/tex/context/base/mkiv/typo-drp.mkiv @@ -17,7 +17,7 @@ \unprotect -\registerctxluafile{typo-drp}{1.001} +\registerctxluafile{typo-drp}{} \definesystemattribute[initial][public] diff --git a/tex/context/base/mkiv/typo-dua.lua b/tex/context/base/mkiv/typo-dua.lua index c2f3c2763..1e48dfb91 100644 --- a/tex/context/base/mkiv/typo-dua.lua +++ b/tex/context/base/mkiv/typo-dua.lua @@ -57,7 +57,8 @@ if not modules then modules = { } end modules ['typo-dua'] = { -- tood: combine some sweeps -- -- This one wil get frozen (or if needed in sync with basic t-bidi) and I will explore more options --- in typo-dub.lua. There I might also be able to improve performance a bit. +-- in typo-dub.lua. There I might also be able to improve performance a bit. Derived and improved +-- versions will also be sped up local insert, remove, unpack, concat = table.insert, table.remove, table.unpack, table.concat local utfchar = utf.char @@ -75,11 +76,9 @@ local getid = nuts.getid local getsubtype = nuts.getsubtype local getlist = nuts.getlist local getchar = nuts.getchar -local getfield = nuts.getfield local getprop = nuts.getprop local getdir = nuts.getdir -local setfield = nuts.setfield local setprop = nuts.setprop local setchar = nuts.setchar local setdir = nuts.setdir @@ -680,6 +679,8 @@ local function resolve_levels(list,size,baselevel) end end +-- This is not ok but we keep it as-is: + local function insert_dir_points(list,size) -- L2, but no actual reversion is done, we simply annotate where -- begindir/endddir node will be inserted. diff --git a/tex/context/base/mkiv/typo-dub.lua b/tex/context/base/mkiv/typo-dub.lua index eea743c6d..d0747ae6c 100644 --- a/tex/context/base/mkiv/typo-dub.lua +++ b/tex/context/base/mkiv/typo-dub.lua @@ -64,11 +64,9 @@ local getsubtype = nuts.getsubtype local getlist = nuts.getlist local getchar = nuts.getchar local getattr = nuts.getattr -local getfield = nuts.getfield local getprop = nuts.getprop local getdir = nuts.getdir -local setfield = nuts.setfield local setprop = nuts.setprop local setchar = nuts.setchar local setdir = nuts.setdir @@ -242,7 +240,7 @@ end -- local space = { char = 0x0020, direction = "ws", original = "ws" } -- local lre = { char = 0x202A, direction = "lre", original = "lre" } --- local lre = { char = 0x202B, direction = "rle", original = "rle" } +-- local rle = { char = 0x202B, direction = "rle", original = "rle" } -- local pdf = { char = 0x202C, direction = "pdf", original = "pdf" } -- local object = { char = 0xFFFC, direction = "on", original = "on" } -- @@ -561,28 +559,30 @@ local function resolve_weak(list,size,start,limit,orderbefore,orderafter) end else -- probably more efficient local runner = start + 2 - local before = list[start] - local entry = list[start + 1] - local after = list[runner] - while after do - local direction = entry.direction - if direction == "es" then - if before.direction == "en" and after.direction == "en" then - entry.direction = "en" - end - elseif direction == "cs" then - local prevdirection = before.direction - if prevdirection == "en" then - if after.direction == "en" then + if runner <= limit then + local before = list[start] + local entry = list[start + 1] + local after = list[runner] + while after do + local direction = entry.direction + if direction == "es" then + if before.direction == "en" and after.direction == "en" then entry.direction = "en" end - elseif prevdirection == "an" and after.direction == "an" then - entry.direction = "an" + elseif direction == "cs" then + local prevdirection = before.direction + if prevdirection == "en" then + if after.direction == "en" then + entry.direction = "en" + end + elseif prevdirection == "an" and after.direction == "an" then + entry.direction = "an" + end end + before = current + current = after + after = list[runner] end - before = current - current = after - after = list[runner] end end -- W5 @@ -814,11 +814,57 @@ local function resolve_levels(list,size,baselevel,analyze_fences) end end +-- local function insert_dir_points(list,size) +-- -- L2, but no actual reversion is done, we simply annotate where +-- -- begindir/endddir node will be inserted. +-- local maxlevel = 0 +-- local finaldir = false +-- for i=1,size do +-- local level = list[i].level +-- if level > maxlevel then +-- maxlevel = level +-- end +-- end +-- for level=0,maxlevel do +-- local started = false +-- local begindir = nil +-- local enddir = nil +-- if level % 2 == 1 then +-- begindir = "+TRT" +-- enddir = "-TRT" +-- else +-- begindir = "+TLT" +-- enddir = "-TLT" +-- end +-- for i=1,size do +-- local entry = list[i] +-- if entry.level >= level then +-- if not started then +-- entry.begindir = begindir +-- started = true +-- end +-- else +-- if started then +-- list[i-1].enddir = enddir +-- started = false +-- end +-- end +-- end +-- -- make sure to close the run at end of line +-- if started then +-- finaldir = enddir +-- end +-- end +-- if finaldir then +-- list[size].enddir = finaldir +-- end +-- end + local function insert_dir_points(list,size) -- L2, but no actual reversion is done, we simply annotate where -- begindir/endddir node will be inserted. local maxlevel = 0 - local finaldir = false + local toggle = true for i=1,size do local level = list[i].level if level > maxlevel then @@ -826,15 +872,18 @@ local function insert_dir_points(list,size) end end for level=0,maxlevel do - local started = false - local begindir = nil - local enddir = nil - if level % 2 == 1 then - begindir = "+TRT" - enddir = "-TRT" - else + local started -- = false + local begindir -- = nil + local enddir -- = nil + local prev -- = nil + if toggle then begindir = "+TLT" enddir = "-TLT" + toggle = false + else + begindir = "+TRT" + enddir = "-TRT" + toggle = true end for i=1,size do local entry = list[i] @@ -845,18 +894,36 @@ local function insert_dir_points(list,size) end else if started then - list[i-1].enddir = enddir - started = false + prev.enddir = enddir + started = false end end - end - -- make sure to close the run at end of line - if started then - finaldir = enddir + prev = entry end end - if finaldir then - list[size].enddir = finaldir + -- make sure to close the run at end of line + local last = list[size] + if not last.enddir then + local s = { } + local n = 0 + for i=1,size do + local entry = list[i] + local e = entry.enddir + local b = entry.begindir + if e then + n = n - 1 + end + if b then + n = n + 1 + s[n] = b + end + end + if n > 0 then + if trace_list and n > 1 then + report_directions("unbalanced list") + end + last.enddir = s[n] == "+TRT" and "-TRT" or "-TLT" + end end end diff --git a/tex/context/base/mkiv/typo-duc.lua b/tex/context/base/mkiv/typo-duc.lua index 7fd49e54e..520740190 100644 --- a/tex/context/base/mkiv/typo-duc.lua +++ b/tex/context/base/mkiv/typo-duc.lua @@ -4,16 +4,18 @@ if not modules then modules = { } end modules ['typo-duc'] = { author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", copyright = "PRAGMA ADE / ConTeXt Development Team", license = "see context related readme files", - comment = "Unicode bidi (sort of) variant b", + comment = "Unicode bidi (sort of) variant c", } --- This is a follow up on typo-uba which itself is a follow up on t-bidi by Khaled Hosny which +-- Will be replaced by typo-duc-new.lua! + +-- This is a follow up on typo-uda which itself is a follow up on t-bidi by Khaled Hosny which -- in turn is based on minibidi.c from Arabeyes. This is a further optimizations, as well as -- an update on some recent unicode bidi developments. There is (and will) also be more control -- added. As a consequence this module is somewhat slower than its precursor which itself is -- slower than the one-pass bidi handler. This is also a playground and I might add some plugin -- support. However, in the meantime performance got a bit better and this third variant is again --- some 10% faster than the two variant. +-- some 10% faster than the second variant. -- todo (cf html): -- @@ -62,20 +64,18 @@ local tonode = nuts.tonode local getnext = nuts.getnext local getid = nuts.getid local getsubtype = nuts.getsubtype -local getchar = nuts.getchar local getlist = nuts.getlist +local getchar = nuts.getchar local getattr = nuts.getattr -local getfield = nuts.getfield local getprop = nuts.getprop local getdir = nuts.getdir -local setfield = nuts.setfield local setprop = nuts.setprop local setchar = nuts.setchar local setdir = nuts.setdir local setattrlist = nuts.setattrlist -local properties = nodes.properties +local properties = nodes.properties.data local remove_node = nuts.remove local insert_node_after = nuts.insert_after @@ -107,11 +107,11 @@ local a_directions = attributes.private('directions') local remove_controls = true directives.register("typesetters.directions.removecontrols",function(v) remove_controls = v end) ----- analyze_fences = true directives.register("typesetters.directions.analyzefences", function(v) analyze_fences = v end) -local trace_directions = false trackers .register("typesetters.directions.two", function(v) trace_directions = v end) -local trace_details = false trackers .register("typesetters.directions.two.details", function(v) trace_details = v end) -local trace_list = false trackers .register("typesetters.directions.two.list", function(v) trace_list = v end) +local trace_directions = false trackers.register("typesetters.directions.three", function(v) trace_directions = v end) +local trace_details = false trackers.register("typesetters.directions.three.details", function(v) trace_details = v end) +local trace_list = false trackers.register("typesetters.directions.three.list", function(v) trace_list = v end) -local report_directions = logs.reporter("typesetting","directions two") +local report_directions = logs.reporter("typesetting","directions three") -- strong (old): -- @@ -211,27 +211,28 @@ end local function show_done(list,size) local joiner = utfchar(0x200C) local result = { } + local format = formatters["<%s>"] for i=1,size do local entry = list[i] local character = entry.char local begindir = entry.begindir local enddir = entry.enddir if begindir then - result[#result+1] = formatters["<%s>"](begindir) + result[#result+1] = format(begindir) end if entry.remove then -- continue elseif character == 0xFFFC then - result[#result+1] = formatters["<%s>"]("?") + result[#result+1] = format("?") elseif character == 0x0020 then - result[#result+1] = formatters["<%s>"](" ") + result[#result+1] = format(" ") elseif character >= 0x202A and character <= 0x202C then - result[#result+1] = formatters["<%s>"](entry.original) + result[#result+1] = format(entry.original) else result[#result+1] = utfchar(character) end if enddir then - result[#result+1] = formatters["<%s>"](enddir) + result[#result+1] = format(enddir) end end return concat(result,joiner) @@ -246,26 +247,28 @@ end local mt_space = { __index = { char = 0x0020, direction = "ws", original = "ws", level = 0 } } local mt_lre = { __index = { char = 0x202A, direction = "lre", original = "lre", level = 0 } } -local mt_lre = { __index = { char = 0x202B, direction = "rle", original = "rle", level = 0 } } +local mt_rle = { __index = { char = 0x202B, direction = "rle", original = "rle", level = 0 } } local mt_pdf = { __index = { char = 0x202C, direction = "pdf", original = "pdf", level = 0 } } local mt_object = { __index = { char = 0xFFFC, direction = "on", original = "on", level = 0 } } +local stack = table.setmetatableindex("table") -- shared +local list = { } -- shared + local function build_list(head) -- todo: store node pointer ... saves loop -- P1 local current = head - local list = { } local size = 0 while current do size = size + 1 local id = getid(current) local p = properties[current] - local t if p and p.directions then local skip = 0 local last = id current = getnext(current) while current do local id = getid(current) + local p = properties[current] if p and p.directions then skip = skip + 1 last = id @@ -275,35 +278,29 @@ local function build_list(head) -- todo: store node pointer ... saves loop end end if id == last then -- the start id - t = { skip = skip, id = id } + list[size] = setmetatable({ skip = skip, id = id },mt_object) else - t = { skip = skip, id = id, last = last } + list[size] = setmetatable({ skip = skip, id = id, last = last },mt_object) end - setmetatable(t,mt_object) elseif id == glyph_code then - local chr = getchar(current) - local dir = directiondata[chr] - t = { char = chr, direction = dir, original = dir, level = 0 } - current = getnext(current) + local chr = getchar(current) + local dir = directiondata[chr] + list[size] = { char = chr, direction = dir, original = dir, level = 0 } + current = getnext(current) -- if not list[dir] then list[dir] = true end -- not faster when we check for usage elseif id == glue_code then -- and how about kern - t = { } - setmetatable(t,mt_space) - current = getnext(current) + list[size] = setmetatable({ },mt_space) + current = getnext(current) elseif id == dir_code then local dir = getdir(current) if dir == "+TLT" then - t = { } - setmetatable(t,mt_lre) + list[size] = setmetatable({ },mt_lre) elseif dir == "+TRT" then - t = { } - setmetatable(t,mt_rle) + list[size] = setmetatable({ },mt_rle) elseif dir == "-TLT" or dir == "-TRT" then - t = { } - setmetatable(t,mt_pdf) + list[size] = setmetatable({ },mt_pdf) else - t = { id = id } - setmetatable(t,mt_object) + list[size] = setmetatable({ id = id },mt_object) end current = getnext(current) elseif id == math_code then @@ -315,9 +312,8 @@ local function build_list(head) -- todo: store node pointer ... saves loop end skip = skip + 1 current = getnext(current) - t = { id = id, skip = skip } - setmetatable(t,mt_object) - else + list[size] = setmetatable({ id = id, skip = skip },mt_object) + else -- disc_code: we assume that these are the same as the surrounding local skip = 0 local last = id current = getnext(current) @@ -331,16 +327,12 @@ local function build_list(head) -- todo: store node pointer ... saves loop break end end - if skip == 0 then - t = { id = id } - elseif id == last then -- the start id - t = { id = id, skip = skip } + if id == last then -- the start id + list[size] = setmetatable({ id = id, skip = skip },mt_object) else - t = { id = id, skip = skip, last = last } + list[size] = setmetatable({ id = id, skip = skip, last = last },mt_object) end - setmetatable(t,mt_object) end - list[size] = t end return list, size end @@ -361,8 +353,7 @@ end local function resolve_fences(list,size,start,limit) -- N0: funny effects, not always better, so it's an option - local stack = { } - local top = 0 + local nofstack = 0 for i=start,limit do local entry = list[i] if entry.direction == "on" then @@ -373,15 +364,18 @@ local function resolve_fences(list,size,start,limit) entry.mirror = mirror entry.class = class if class == "open" then - top = top + 1 - stack[top] = { mirror, i, false } - elseif top == 0 then + nofstack = nofstack + 1 + local stacktop = stack[nofstack] + stacktop[1] = mirror + stacktop[2] = i + stacktop[3] = false -- not used + elseif nofstack == 0 then -- skip elseif class == "close" then - while top > 0 do - local s = stack[top] - if s[1] == char then - local open = s[2] + while nofstack > 0 do + local stacktop = stack[nofstack] + if stacktop[1] == char then + local open = stacktop[2] local close = i list[open ].paired = close list[close].paired = open @@ -389,7 +383,7 @@ local function resolve_fences(list,size,start,limit) else -- do we mirror or not end - top = top - 1 + nofstack = nofstack - 1 end end end @@ -412,27 +406,26 @@ end -- the action -local function get_baselevel(head,list,size) -- todo: skip if first is object (or pass head and test for localpar) - local id = getid(head) - if id == localpar_code then - if getdir(head) == "TRT" then +local function get_baselevel(head,list,size,direction) + if not direction and getid(head) == localpar_code then + direction = getdir(head) + end + if direction == "TRT" then + return 1, "TRT", true + elseif direction == "TLT" then + return 0, "TLT", true + end + -- P2, P3: + for i=1,size do + local entry = list[i] + local direction = entry.direction + if direction == "r" or direction == "al" then -- and an ? return 1, "TRT", true - else + elseif direction == "l" then return 0, "TLT", true end - else - -- P2, P3 - for i=1,size do - local entry = list[i] - local direction = entry.direction - if direction == "r" or direction == "al" then -- and an ? - return 1, "TRT", true - elseif direction == "l" then - return 0, "TLT", true - end - end - return 0, "TLT", false end + return 0, "TLT", false end local function resolve_explicit(list,size,baselevel) @@ -440,7 +433,6 @@ local function resolve_explicit(list,size,baselevel) -- X1 local level = baselevel local override = "on" - local stack = { } local nofstack = 0 for i=1,size do local entry = list[i] @@ -449,7 +441,9 @@ local function resolve_explicit(list,size,baselevel) if direction == "rle" then if nofstack < maximum_stack then nofstack = nofstack + 1 - stack[nofstack] = { level, override } + local stacktop = stack[nofstack] + stacktop[1] = level + stacktop[2] = override level = level + (level % 2 == 1 and 2 or 1) -- least_greater_odd(level) override = "on" entry.level = level @@ -462,7 +456,9 @@ local function resolve_explicit(list,size,baselevel) elseif direction == "lre" then if nofstack < maximum_stack then nofstack = nofstack + 1 - stack[nofstack] = { level, override } + local stacktop = stack[nofstack] + stacktop[1] = level + stacktop[2] = override level = level + (level % 2 == 1 and 1 or 2) -- least_greater_even(level) override = "on" entry.level = level @@ -475,7 +471,9 @@ local function resolve_explicit(list,size,baselevel) elseif direction == "rlo" then if nofstack < maximum_stack then nofstack = nofstack + 1 - stack[nofstack] = { level, override } + local stacktop = stack[nofstack] + stacktop[1] = level + stacktop[2] = override level = level + (level % 2 == 1 and 2 or 1) -- least_greater_odd(level) override = "r" entry.level = level @@ -488,7 +486,9 @@ local function resolve_explicit(list,size,baselevel) elseif direction == "lro" then if nofstack < maximum_stack then nofstack = nofstack + 1 - stack[nofstack] = { level, override } + local stacktop = stack[nofstack] + stacktop[1] = level + stacktop[2] = override level = level + (level % 2 == 1 and 1 or 2) -- least_greater_even(level) override = "l" entry.level = level @@ -501,9 +501,9 @@ local function resolve_explicit(list,size,baselevel) elseif direction == "pdf" then if nofstack < maximum_stack then local stacktop = stack[nofstack] - nofstack = nofstack - 1 level = stacktop[1] override = stacktop[2] + nofstack = nofstack - 1 entry.level = level entry.direction = "bn" entry.remove = true @@ -591,29 +591,31 @@ local function resolve_weak(list,size,start,limit,orderbefore,orderafter) end else -- only more efficient when we have es/cs local runner = start + 2 - local before = list[start] - local entry = list[start + 1] - local after = list[runner] - while after do - local direction = entry.direction - if direction == "es" then - if before.direction == "en" and after.direction == "en" then - entry.direction = "en" - end - elseif direction == "cs" then - local prevdirection = before.direction - if prevdirection == "en" then - if after.direction == "en" then + if runner <= limit then + local before = list[start] + local entry = list[start + 1] + local after = list[runner] + while after do + local direction = entry.direction + if direction == "es" then + if before.direction == "en" and after.direction == "en" then entry.direction = "en" end - elseif prevdirection == "an" and after.direction == "an" then - entry.direction = "an" + elseif direction == "cs" then + local prevdirection = before.direction + if prevdirection == "en" then + if after.direction == "en" then + entry.direction = "en" + end + elseif prevdirection == "an" and after.direction == "an" then + entry.direction = "an" + end end + before = current + current = after + after = list[runner] + runner = runner + 1 end - before = current - current = after - after = list[runner] - runner = runner + 1 end end -- end @@ -850,11 +852,67 @@ local function resolve_levels(list,size,baselevel,analyze_fences) end end +-- local function insert_dir_points(list,size) +-- -- L2, but no actual reversion is done, we simply annotate where +-- -- begindir/endddir node will be inserted. +-- local maxlevel = 0 +-- local finaldir = false +-- local toggle = true +-- for i=1,size do +-- local level = list[i].level +-- if level > maxlevel then +-- maxlevel = level +-- end +-- end +-- for level=0,maxlevel do +-- local started -- = false +-- local begindir -- = nil +-- local enddir -- = nil +-- local prev -- = nil +-- if toggle then +-- begindir = "+TLT" +-- enddir = "-TLT" +-- toggle = false +-- else +-- begindir = "+TRT" +-- enddir = "-TRT" +-- toggle = true +-- end +-- for i=1,size do +-- local entry = list[i] +-- if entry.level >= level then +-- if not started then +-- entry.begindir = begindir +-- started = true +-- end +-- else +-- if started then +-- prev.enddir = enddir +-- started = false +-- end +-- end +-- prev = entry +-- end +-- -- make sure to close the run at end of line +-- if started then +-- finaldir = enddir +-- end +-- end +-- if finaldir then +-- list[size].enddir = finaldir +-- end +-- for i=1,size do +-- print("<",i,list[i].level,list[i].begindir,list[i].enddir) +-- end +-- end + +local stack = { } + local function insert_dir_points(list,size) -- L2, but no actual reversion is done, we simply annotate where -- begindir/endddir node will be inserted. local maxlevel = 0 - local finaldir = false + local toggle = true for i=1,size do local level = list[i].level if level > maxlevel then @@ -862,15 +920,18 @@ local function insert_dir_points(list,size) end end for level=0,maxlevel do - local started = false - local begindir = nil - local enddir = nil - if level % 2 == 1 then - begindir = "+TRT" - enddir = "-TRT" - else + local started -- = false + local begindir -- = nil + local enddir -- = nil + local prev -- = nil + if toggle then begindir = "+TLT" enddir = "-TLT" + toggle = false + else + begindir = "+TRT" + enddir = "-TRT" + toggle = true end for i=1,size do local entry = list[i] @@ -881,18 +942,35 @@ local function insert_dir_points(list,size) end else if started then - list[i-1].enddir = enddir - started = false + prev.enddir = enddir + started = false end end - end - -- make sure to close the run at end of line - if started then - finaldir = enddir + prev = entry end end - if finaldir then - list[size].enddir = finaldir + -- make sure to close the run at end of line + local last = list[size] + if not last.enddir then + local n = 0 + for i=1,size do + local entry = list[i] + local e = entry.enddir + local b = entry.begindir + if e then + n = n - 1 + end + if b then + n = n + 1 + stack[n] = b + end + end + if n > 0 then + if trace_list and n > 1 then + report_directions("unbalanced list") + end + last.enddir = stack[n] == "+TRT" and "-TRT" or "-TLT" + end end end @@ -993,18 +1071,22 @@ local function apply_to_list(list,size,head,pardir) return head, done end -local function process(head) +-- If needed we can optimize for only_one. There is no need to do anything +-- when it's not a glyph. Otherwise we only need to check mirror and apply +-- directions when it's different from the surrounding. Paragraphs always +-- have more than one node. Actually, we only enter this function when we +-- do have a glyph! + +local function process(head,direction,only_one) head = tonut(head) -- for the moment a whole paragraph property local attr = getattr(head,a_directions) local analyze_fences = getfences(attr) -- local list, size = build_list(head) - local baselevel, pardir, dirfound = get_baselevel(head,list,size) -- we always have an inline dir node in context - if not dirfound and trace_details then - report_directions("no initial direction found, gambling") - end + local baselevel, pardir, dirfound = get_baselevel(head,list,size,direction) -- we always have an inline dir node in context if trace_details then + report_directions("analyze: direction %a, baselevel %a",dirfound and pardir or "unknown",baselevel or 1) report_directions("before : %s",show_list(list,size,"original")) end resolve_explicit(list,size,baselevel) @@ -1014,7 +1096,7 @@ local function process(head) report_directions("after : %s",show_list(list,size,"direction")) report_directions("result : %s",show_done(list,size)) end - head, done = apply_to_list(list,size,head,pardir) + local head, done = apply_to_list(list,size,head,pardir) return tonode(head), done end diff --git a/tex/context/base/mkiv/typo-fkr.mkiv b/tex/context/base/mkiv/typo-fkr.mkiv index 684d831bc..7444db511 100644 --- a/tex/context/base/mkiv/typo-fkr.mkiv +++ b/tex/context/base/mkiv/typo-fkr.mkiv @@ -13,7 +13,7 @@ \writestatus{loading}{ConTeXt Typesetting Macros / Additional Font Kerning} -\registerctxluafile{typo-fkr}{1.001} +\registerctxluafile{typo-fkr}{} \definesystemattribute[extrafontkern][public] diff --git a/tex/context/base/mkiv/typo-fln.lua b/tex/context/base/mkiv/typo-fln.lua index cef77cea1..4fb82ce44 100644 --- a/tex/context/base/mkiv/typo-fln.lua +++ b/tex/context/base/mkiv/typo-fln.lua @@ -38,8 +38,8 @@ local getprev = nuts.getprev local getboth = nuts.getboth local setboth = nuts.setboth local getid = nuts.getid -local getfield = nuts.getfield -local setfield = nuts.setfield +local getsubtype = nuts.getsubtype +local getwidth = nuts.getwidth local getlist = nuts.getlist local setlist = nuts.setlist local getattr = nuts.getattr @@ -54,14 +54,19 @@ local nodecodes = nodes.nodecodes local glyph_code = nodecodes.glyph local disc_code = nodecodes.disc local kern_code = nodecodes.kern +local glue_code = nodecodes.glue + +local spaceskip_code = nodes.gluecodes.spaceskip local traverse_id = nuts.traverse_id local flush_node_list = nuts.flush_list local flush_node = nuts.flush_node local copy_node_list = nuts.copy_list +local insert_node_before = nuts.insert_before local insert_node_after = nuts.insert_after local remove_node = nuts.remove local list_dimensions = nuts.dimensions +local hpack_node_list = nuts.hpack local nodepool = nuts.pool local newpenalty = nodepool.penalty @@ -115,7 +120,7 @@ implement { } actions[v_line] = function(head,setting) - -- local attribute = fonts.specifiers.contextnumber(setting.feature) -- was experimental + -- local attribute = fonts.specifiers.contextnumber(setting.feature) -- was experimental local dynamic = setting.dynamic local font = setting.font local noflines = setting.n or 1 @@ -166,11 +171,28 @@ actions[v_line] = function(head,setting) hsize = hsize - hangindent end + local function list_dimensions(list,start) + local temp = copy_node_list(list,start) + temp = tonode(temp) + temp = nodes.handlers.characters(temp) + temp = nodes.injections.handler(temp) + -- temp = typesetters.fontkerns.handler(temp) -- maybe when enabled + -- nodes.handlers.protectglyphs(temp) -- not needed as we discard + -- temp = typesetters.spacings.handler(temp) -- maybe when enabled + -- temp = typesetters.kerns.handler(temp) -- maybe when enabled + temp = tonut(temp) + temp = hpack_node_list(temp) + local width = getwidth(temp) + flush_node_list(temp) + return width + end + local function try(extra) local width = list_dimensions(list,start) if extra then width = width + list_dimensions(extra) end + -- report_firstlines("line length: %p, progression: %p, text: %s",hsize,width,nodes.listtoutf(list,nil,nil,start)) if width > hsize then list = prev return true @@ -188,7 +210,10 @@ actions[v_line] = function(head,setting) elseif id == disc_code then -- this could be an option n = n + 1 - if try(getfield(start,"pre")) then + local pre, post, replace = getdisc(start) + if pre and try(pre) then + break + elseif replace and try(replace) then break end elseif id == kern_code then -- todo: fontkern @@ -204,6 +229,9 @@ actions[v_line] = function(head,setting) linebreaks[i] = n end end + + flush_node_list(temp) + local start = head local n = 0 @@ -225,6 +253,7 @@ actions[v_line] = function(head,setting) local linebreak = linebreaks[i] while start and n < nofchars do local id = getid(start) + local ok = false if id == glyph_code then n = n + 1 update(start) @@ -269,6 +298,8 @@ actions[v_line] = function(head,setting) end setdisc(disc,pre,post,replace) flush_node(disc) + elseif id == glue_code then + head = insert_node_before(head,start,newpenalty(10000)) -- nobreak end if linebreak == n then if trace_firstlines then @@ -282,7 +313,7 @@ actions[v_line] = function(head,setting) start = getnext(start) end end - flush_node_list(temp) + return head, true end diff --git a/tex/context/base/mkiv/typo-fln.mkiv b/tex/context/base/mkiv/typo-fln.mkiv index e883c57d2..37348be29 100644 --- a/tex/context/base/mkiv/typo-fln.mkiv +++ b/tex/context/base/mkiv/typo-fln.mkiv @@ -50,7 +50,7 @@ \unprotect -\registerctxluafile{typo-fln}{1.001} +\registerctxluafile{typo-fln}{} \definesystemattribute[firstline][public] diff --git a/tex/context/base/mkiv/typo-ini.mkiv b/tex/context/base/mkiv/typo-ini.mkiv index 1c2d6617a..3e0790af0 100644 --- a/tex/context/base/mkiv/typo-ini.mkiv +++ b/tex/context/base/mkiv/typo-ini.mkiv @@ -20,7 +20,7 @@ \writestatus{loading}{ConTeXt Typographic Macros / Initialization} -\registerctxluafile{typo-ini}{1.001} +\registerctxluafile{typo-ini}{} \unprotect diff --git a/tex/context/base/mkiv/typo-inj.mkiv b/tex/context/base/mkiv/typo-inj.mkiv index 59f35378f..3b77379b3 100644 --- a/tex/context/base/mkiv/typo-inj.mkiv +++ b/tex/context/base/mkiv/typo-inj.mkiv @@ -24,7 +24,7 @@ \unprotect -\registerctxluafile{typo-inj}{1.001} +\registerctxluafile{typo-inj}{} % todo: no need in trialmode diff --git a/tex/context/base/mkiv/typo-itc.lua b/tex/context/base/mkiv/typo-itc.lua index 312832d5b..328bf1406 100644 --- a/tex/context/base/mkiv/typo-itc.lua +++ b/tex/context/base/mkiv/typo-itc.lua @@ -6,6 +6,7 @@ if not modules then modules = { } end modules ['typo-itc'] = { license = "see context related readme files" } +local tonumber = tonumber local trace_italics = false trackers.register("typesetters.italics", function(v) trace_italics = v end) @@ -31,7 +32,6 @@ local nodepool = nuts.pool local tonode = nuts.tonode local tonut = nuts.tonut -local getfield = nuts.getfield local getprev = nuts.getprev local getnext = nuts.getnext local getid = nuts.getid @@ -42,7 +42,6 @@ local getattr = nuts.getattr local setattr = nuts.setattr local getattrlist = nuts.getattrlist local setattrlist = nuts.setattrlist -local setfield = nuts.setfield local setdisc = nuts.setdisc local isglyph = nuts.isglyph local setkern = nuts.setkern @@ -249,9 +248,9 @@ local function domath(head,current, done) a = a + 100 end if trace_italics then - report_italics("adding italic between math %C and non punctuation %C",getchar(glyph),char) + report_italics("%s italic %p between math %C and non punctuation %C","adding",a,getchar(glyph),char) end - insert_node_after(head,glyph,new_correction_kern(a)) + insert_node_after(head,glyph,correction_kern(a,glyph)) done = true end end @@ -263,11 +262,12 @@ local function domath(head,current, done) end local function mathhandler(head) - local current = tonut(head) + local nuthead = tonut(head) + local current = nuthead local done = false while current do if getid(current) == math_code then - current, done = domath(head,current,done) + current, done = domath(nuthead,current,done) end current = getnext(current) end @@ -415,7 +415,6 @@ local function texthandler(head) lastattr = attr replacechar = char replacehead = replace - replace = current updated = true end end @@ -439,7 +438,7 @@ local function texthandler(head) if attr and attr > 0 then local cd = data[char] if not cd then - -- this really can happen + -- this really can happen -- postitalic = 0 else postitalic = cd.italic @@ -452,8 +451,7 @@ local function texthandler(head) lastattr = attr postchar = char posthead = post - post = current - updated = true + updated = true end end end diff --git a/tex/context/base/mkiv/typo-itc.mkvi b/tex/context/base/mkiv/typo-itc.mkvi index b0d2673cd..5aeb67239 100644 --- a/tex/context/base/mkiv/typo-itc.mkvi +++ b/tex/context/base/mkiv/typo-itc.mkvi @@ -22,7 +22,7 @@ %D \setupitaliccorrection[global,always] %D \stoptyping -\registerctxluafile{typo-itc}{1.001} +\registerctxluafile{typo-itc}{} \definesystemattribute[italics] [public] \definesystemattribute[mathitalics][public] diff --git a/tex/context/base/mkiv/typo-krn.lua b/tex/context/base/mkiv/typo-krn.lua index 24a91d6b6..71d9736a4 100644 --- a/tex/context/base/mkiv/typo-krn.lua +++ b/tex/context/base/mkiv/typo-krn.lua @@ -8,6 +8,8 @@ if not modules then modules = { } end modules ['typo-krn'] = { -- glue is still somewhat suboptimal -- components: better split on tounicode +-- +-- maybe ignore when properties[n].injections.cursivex (or mark) local next, type, tonumber = next, type, tonumber @@ -31,7 +33,6 @@ local insert_node_after = nuts.insert_after local end_of_math = nuts.end_of_math local use_components = nuts.use_components -local getfield = nuts.getfield local getnext = nuts.getnext local getprev = nuts.getprev local getid = nuts.getid @@ -79,7 +80,7 @@ local user_list_code = listcodes.unknown local discretionary_code = disccodes.discretionary local automatic_code = disccodes.automatic -local kerning_code = kerncodes.kerning +local fontkern_code = kerncodes.fontkern local userkern_code = kerncodes.userkern local userskip_code = skipcodes.userskip local spaceskip_code = skipcodes.spaceskip @@ -103,8 +104,8 @@ local v_auto = interfaces.variables.auto typesetters = typesetters or { } local typesetters = typesetters -typesetters.kerns = typesetters.kerns or { } -local kerns = typesetters.kerns +local kerns = typesetters.kerns or { } +typesetters.kerns = kerns local report = logs.reporter("kerns") local trace_ligatures = false trackers.register("typesetters.kerns.ligatures", function(v) trace_ligatures = v end) @@ -113,7 +114,6 @@ local trace_ligatures_d = false trackers.register("typesetters.kerns.ligatures kerns.mapping = kerns.mapping or { } kerns.factors = kerns.factors or { } local a_kerns = attributes.private("kern") -local a_fontkern = attributes.private('fontkern') local contextsetups = fonts.specifiers.contextsetups @@ -223,7 +223,7 @@ end local function inject_begin(boundary,prev,keeptogether,krn,ok) -- prev is a glyph local char, id = isglyph(boundary) if id == kern_code then - if getsubtype(boundary) == kerning_code or getattr(boundary,a_fontkern) then + if getsubtype(boundary) == fontkern_code then local inject = true if keeptogether then local next = getnext(boundary) @@ -259,7 +259,7 @@ local function inject_end(boundary,next,keeptogether,krn,ok) local tail = find_node_tail(boundary) local char, id = getid(tail) if id == kern_code then - if getsubtype(tail) == kerning_code or getattr(tail,a_fontkern) then + if getsubtype(tail) == fontkern_code then local inject = true if keeptogether then local prev = getprev(tail) @@ -309,7 +309,7 @@ local function process_list(head,keeptogether,krn,font,okay) if mark[char] then -- skip elseif pid == kern_code then - if getsubtype(prev) == kerning_code or getattr(prev,a_fontkern) then + if getsubtype(prev) == fontkern_code then local inject = true if keeptogether then local prevprev = getprev(prev) @@ -408,7 +408,7 @@ function kerns.handler(head) elseif mark[char] then -- skip elseif previd == kern_code then - if getsubtype(prev) == kerning_code or getattr(prev,a_fontkern) then + if getsubtype(prev) == fontkern_code then local inject = true if keeptogether then if previd == glyph_code and keeptogether(prev,start) then @@ -446,24 +446,24 @@ function kerns.handler(head) elseif id == disc_code then local prev, next, pglyph, nglyph -- delayed till needed local subtype = getsubtype(start) - if subtype == automatic_code then - -- this is kind of special, as we have already injected the - -- previous kern - local prev = getprev(start) - local pglyph = prev and getid(prev) == glyph_code - languages.expand(start,pglyph and prev) - -- we can have a different start now - elseif subtype ~= discretionary_code then - prev = getprev(start) - pglyph = prev and getid(prev) == glyph_code - languages.expand(start,pglyph and prev) - end + -- if subtype == automatic_code then + -- -- this is kind of special, as we have already injected the + -- -- previous kern + -- local prev = getprev(start) + -- local pglyph = prev and getid(prev) == glyph_code + -- languages.expand(start,pglyph and prev) + -- -- we can have a different start now + -- elseif subtype ~= discretionary_code then + -- prev = getprev(start) + -- pglyph = prev and getid(prev) == glyph_code + -- languages.expand(start,pglyph and prev) + -- end local pre, post, replace = getdisc(start) local indeed = false if pre then local okay = false if not prev then - prev = prev or getprev(start) + prev = getprev(start) pglyph = prev and getid(prev) == glyph_code end if pglyph then @@ -491,7 +491,7 @@ function kerns.handler(head) if replace then local okay = false if not prev then - prev = prev or getprev(start) + prev = getprev(start) pglyph = prev and getid(prev) == glyph_code end if pglyph then @@ -518,7 +518,7 @@ function kerns.handler(head) end bound = false elseif id == kern_code then - bound = getsubtype(start) == kerning_code or getattr(start,a_fontkern) + bound = getsubtype(start) == fontkern_code prev = start previd = id elseif id == glue_code then @@ -564,7 +564,7 @@ function kerns.handler(head) start = getnext(start) end elseif id == kern_code then - bound = getsubtype(start) == kerning_code or getattr(start,a_fontkern) + bound = getsubtype(start) == fontkern_code prev = start previd = id start = getnext(start) diff --git a/tex/context/base/mkiv/typo-krn.mkiv b/tex/context/base/mkiv/typo-krn.mkiv index 6d6126542..fedbce4d1 100644 --- a/tex/context/base/mkiv/typo-krn.mkiv +++ b/tex/context/base/mkiv/typo-krn.mkiv @@ -15,7 +15,7 @@ \unprotect -\registerctxluafile{typo-krn}{1.001} +\registerctxluafile{typo-krn}{} \definesystemattribute[kern][public] diff --git a/tex/context/base/mkiv/typo-lan.mkiv b/tex/context/base/mkiv/typo-lan.mkiv index 6bc052b99..fed88789a 100644 --- a/tex/context/base/mkiv/typo-lan.mkiv +++ b/tex/context/base/mkiv/typo-lan.mkiv @@ -15,7 +15,7 @@ \unprotect -\registerctxluafile{typo-lan}{1.001} +\registerctxluafile{typo-lan}{} %D \macros %D {averagecharwidth, charwidthlanguage} diff --git a/tex/context/base/mkiv/typo-lin.lua b/tex/context/base/mkiv/typo-lin.lua index d702bcb8c..ebf748a82 100644 --- a/tex/context/base/mkiv/typo-lin.lua +++ b/tex/context/base/mkiv/typo-lin.lua @@ -87,8 +87,6 @@ local getid = nuts.getid local getnext = nuts.getnext local getprev = nuts.getprev local getboth = nuts.getboth -local getfield = nuts.getfield -local setfield = nuts.setfield local setlink = nuts.setlink local setkern = nuts.setkern local getkern = nuts.getkern diff --git a/tex/context/base/mkiv/typo-lin.mkiv b/tex/context/base/mkiv/typo-lin.mkiv index eba08b4c8..a05f770fe 100644 --- a/tex/context/base/mkiv/typo-lin.mkiv +++ b/tex/context/base/mkiv/typo-lin.mkiv @@ -15,7 +15,7 @@ %D Beware: the mvl callback is also called when a line is added to a vbox. -\registerctxluafile{typo-lin}{1.001} +\registerctxluafile{typo-lin}{} \unprotect diff --git a/tex/context/base/mkiv/typo-mar.lua b/tex/context/base/mkiv/typo-mar.lua index a5d607cd7..bc9c408c1 100644 --- a/tex/context/base/mkiv/typo-mar.lua +++ b/tex/context/base/mkiv/typo-mar.lua @@ -13,18 +13,21 @@ if not modules then modules = { } end modules ['typo-mar'] = { local format, validstring = string.format, string.valid local insert, remove, sortedkeys, fastcopy = table.insert, table.remove, table.sortedkeys, table.fastcopy -local setmetatable, next = setmetatable, next +local setmetatable, next, tonumber = setmetatable, next, tonumber local formatters = string.formatters local toboolean = toboolean local settings_to_hash = utilities.parsers.settings_to_hash -local attributes, nodes, node, variables = attributes, nodes, node, variables +local attributes = attributes +local nodes = nodes +local variables = variables +local context = context -local trace_margindata = false trackers.register("typesetters.margindata", function(v) trace_margindata = v end) -local trace_marginstack = false trackers.register("typesetters.margindata.stack", function(v) trace_marginstack = v end) -local trace_margingroup = false trackers.register("typesetters.margindata.group", function(v) trace_margingroup = v end) +local trace_margindata = false trackers.register("typesetters.margindata", function(v) trace_margindata = v end) +local trace_marginstack = false trackers.register("typesetters.margindata.stack", function(v) trace_marginstack = v end) +local trace_margingroup = false trackers.register("typesetters.margindata.group", function(v) trace_margingroup = v end) -local report_margindata = logs.reporter("margindata") +local report_margindata = logs.reporter("margindata") local tasks = nodes.tasks local prependaction = tasks.prependaction @@ -66,7 +69,6 @@ local traverse_id = nuts.traverse_id local flush_node_list = nuts.flush_list local getfield = nuts.getfield -local setfield = nuts.setfield local getnext = nuts.getnext local getprev = nuts.getprev local getid = nuts.getid @@ -165,7 +167,7 @@ setmetatable(displaystore,mt2) local defaults = { __index = { location = v_left, - align = v_normal, + align = v_normal, -- not used method = "", name = "", threshold = 0, -- .25ex diff --git a/tex/context/base/mkiv/typo-mar.mkiv b/tex/context/base/mkiv/typo-mar.mkiv index 462cc633e..f265f173c 100644 --- a/tex/context/base/mkiv/typo-mar.mkiv +++ b/tex/context/base/mkiv/typo-mar.mkiv @@ -36,7 +36,7 @@ %D need an extra pass to get inner and outer alignments in sync with %D the pagebuilder. -\registerctxluafile{typo-mar}{1.001} +\registerctxluafile{typo-mar}{} %definesystemattribute[margindata] % only at the lua end diff --git a/tex/context/base/mkiv/typo-ovl.lua b/tex/context/base/mkiv/typo-ovl.lua new file mode 100644 index 000000000..09cf5e129 --- /dev/null +++ b/tex/context/base/mkiv/typo-ovl.lua @@ -0,0 +1,183 @@ +if not modules then modules = { } end modules ['typo-ovl'] = { + version = 1.001, + comment = "companion to typo-ovl.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +-- This is dubious code. If you needed it your source is probably bad. We only used +-- in when we had to mark bad content but when cleaning up some project code I decided +-- that it is easier to maintain in the distribution then in a project style. After all, +-- we have hardly any private code. For convenience I hooked it into the existing +-- replacement module (as it used the same code anyway). I did some cleanup. + +local next = next + +local context = context + +local nuts = nodes.nuts +local tonut = nodes.tonut +local tonode = nodes.tonode + +local nodecodes = nodes.nodecodes +local glyph_code = nodecodes.glyph +local disc_code = nodecodes.disc + +local getnext = nuts.getnext +local getid = nuts.getid +local getdisc = nuts.getdisc +local getattr = nuts.getattr +local setattr = nuts.setattr +local getattrlist = nuts.getattrlist +local setattrlist = nuts.setattrlist +local getfield = nuts.getfield +local setfont = nuts.setfont + +local unsetvalue = attributes.unsetvalue +local prvattribute = attributes.private + +local texgetbox = tex.getbox +local currentfont = font.current + +local a_overloads = attributes.private("overloads") +local n_overloads = 0 +local t_overloads = { } + +local overloaded = { } + +local function markasoverload(a) + local n = prvattribute(a) + if n then + overloaded[n] = a + end +end + +attributes.markasoverload = markasoverload + +markasoverload("color") +markasoverload("colormodel") +markasoverload("transparency") +markasoverload("case") +markasoverload("negative") +markasoverload("effect") +markasoverload("ruled") +markasoverload("shifted") +markasoverload("kernchars") +markasoverload("kern") +markasoverload("noligature") +markasoverload("viewerlayer") + +local function tooverloads(n) + local current = tonut(n) + local a = getattrlist(current) + local s = { } + while a do + local n = getfield(a,"number") + local o = overloaded[n] + if o then + local v = getfield(a,"value") + if v ~= unsetvalue then + s[n] = v + -- print(o,n,v) + end + end + a = getnext(a) + end + return s +end + +attributes.tooverloads = tooverloads + +function attributes.applyoverloads(specification,start,stop) + local current = tonut(start) + local processor = specification.processor + local overloads = specification.processor or getattr(current,a_overloads) + if overloads and overloads ~= unsetvalue then + overloads = t_overloads[overloads] + if not overloads then + return + end + else + return + end + + local last = stop and tonut(stop) + local oldlist = nil + local newlist = nil + local newfont = overloads.font + + local function apply() + local a = getattrlist(current) + if a == oldlist then + setattrlist(current,newlist) + else + oldlist = getattrlist(current) + for k, v in next, overloads do + setattr(current,k,v) + end + newlist = current -- getattrlist(current) + end + if newfont then + setfont(current,newfont) + end + end + + while current do + local id = getid(current) + if id == glyph_code then + apply() + elseif id == disc_code then + apply() + if pre then + while pre do + if getid(pre) == glyph_code then + apply() + end + pre = getnext(pre) + end + end + if post then + while post do + if getid(post) == glyph_code then + apply() + end + post = getnext(post) + end + end + if replace then + while replace do + if getid(replace) == glyph_code then + apply() + end + replace = getnext(replace) + end + end + end + if current == last then + break + end + current = getnext(current) + end +end + +-- we assume the same highlight so we're global + +interfaces.implement { + name = "overloadsattribute", + arguments = { "string", "integer", "integer" }, + actions = function(name,font,box) + local samplebox = texgetbox(box) + local sample = samplebox and samplebox.list + local overloads = sample and tooverloads(sample) + if overloads then + overloads.font = font > 0 and font or false + n_overloads = n_overloads + 1 + t_overloads[n_overloads] = overloads + t_overloads[name] = overloads + context(n_overloads) + else + context(unsetvalue) + end + end +} diff --git a/tex/context/base/mkiv/typo-ovl.mkiv b/tex/context/base/mkiv/typo-ovl.mkiv new file mode 100644 index 000000000..025ae8a8f --- /dev/null +++ b/tex/context/base/mkiv/typo-ovl.mkiv @@ -0,0 +1,115 @@ +%D \module +%D [ file=lang-ovl, +%D version=2016.02.03, % about that time (maybe earlier) +%D title=\CONTEXT\ Typesetting Macros, +%D subtitle=Overloads, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\writestatus{loading}{ConTeXt Typesetting Macros / Overloads} + +\unprotect + +%D See \LUA\ file for comments. I'll probably never use this code outside the +%D project where it had some experimental use. (Occasionally we do some spell +%D checking and suspicious word usage marking.) So there is not much documentation +%D here. Keep in mind that overloading only makes sense for content that gets +%D replaced as otherwise normal attributes make more sense. Using this otherwise +%D is weird but one never knows what users come up with. + +\registerctxluafile{typo-ovl}{} + +\definesystemattribute[overloads][public,global] + +\installcorenamespace{overloads} + +%D Watch how we abuse highlights. + +\newcount\c_typo_overload_font_id + +\unexpanded\def\typo_overloads_define#1% + {\begingroup + % we pack so we avoid interference (and for sure don't process!) + \setbox\scratchbox\hpack\bgroup + \global\c_typo_overload_font_id\fontid\font + \resetallattributes % so we only change what gets set + \highlight[#1]% + \signalcharacter + \global\c_typo_overload_font_id + \ifnum\c_typo_overload_font_id=\fontid\font + \zerocount + \else + \fontid\font + \fi + \egroup + \global\expandafter\chardef\csname\??overloads#1\endcsname + \clf_overloadsattribute{#1}\c_typo_overload_font_id\scratchbox + \endgroup} + +\unexpanded\def\setoverloads[#1]% + {\ifcsname\??overloads#1\endcsname\else + \typo_overloads_define{#1}% + \fi + \attribute\overloadsattribute\csname\??overloads#1\endcsname} + +\unexpanded\def\registeroverloads[#1]% + {\ifcsname\??overloads#1\endcsname\else + \typo_overloads_define{#1}% + \fi} + +\unexpanded\def\resetoverloads + {\overloadsattribute\attributeunsetvalue} + +%D We hook this into the replacement module, probably the only place where it makes +%D sense. Here is an adapted version of an example: +%D +%D \starttyping +%D \replaceword[basics][new] [old] +%D \replaceword[basics][now] [hl3->never] +%D \replaceword[basics][never][now] +%D \replaceword[basics][heck] [] +%D +%D \definehighlight[hl1][style={\setbar[underbar]\red\setcharactercasing[WORD]\bf}] +%D \definehighlight[hl2][style={\setbar[overbar]\blue\setcharactercasing[Words]}] +%D \definehighlight[hl3][style={\setbar[overstrike]\green\bs}] +%D +%D \registeroverloads[hl1] +%D \registeroverloads[hl2] +%D \registeroverloads[hl3] +%D +%D \start \setreplacements[basics][hl1] What the heck, it's now or never, isn't it new? \stop \par +%D \start \setreplacements[basics][hl2] What the heck, it's now or never, isn't it new? \stop \par +%D \start \setreplacements[basics][hl1] What the heck, it's now or never, isn't it new? \stop \par +%D \start \setreplacements[basics] What the heck, it's now or never, isn't it new? \stop \par +%D \stoptyping +%D +%D We used it to mark synonyms that should not be corrected by the editor. Sort of the +%D reverse of not having a word in a vetted wordlist. A bit out of place in a typesetting +%D system. If really needed we can support multiple words seperataed by spaces but I didn't +%D need it. And \unknown\ fonts are supported but at fixed size! + +\ifdefined\setreplacements + + \unexpanded\def\setreplacements + {\dodoubleempty\languages_replacements_set} + + \unexpanded\def\languages_replacements_set[#1][#2]% + {\clf_setreplacements{#1}% + \ifsecondargument + \setoverloads[#2]% + \else + \resetoverloads + \fi} + +\else + + % something weird + +\fi + +\protect diff --git a/tex/context/base/mkiv/typo-pag.lua b/tex/context/base/mkiv/typo-pag.lua index d6f71c8cc..b5759a097 100644 --- a/tex/context/base/mkiv/typo-pag.lua +++ b/tex/context/base/mkiv/typo-pag.lua @@ -28,8 +28,6 @@ local a_keeptogether = attributes.private("keeptogether") local nuts = nodes.nuts local tonut = nuts.tonut -local getfield = nuts.getfield -local setfield = nuts.setfield local getnext = nuts.getnext local getprev = nuts.getprev local getid = nuts.getid diff --git a/tex/context/base/mkiv/typo-pag.mkiv b/tex/context/base/mkiv/typo-pag.mkiv index 30d2b51b7..07443eb16 100644 --- a/tex/context/base/mkiv/typo-pag.mkiv +++ b/tex/context/base/mkiv/typo-pag.mkiv @@ -15,6 +15,6 @@ \unprotect -\registerctxluafile{typo-pag}{1.001} +\registerctxluafile{typo-pag}{} \protect \endinput diff --git a/tex/context/base/mkiv/typo-par.mkiv b/tex/context/base/mkiv/typo-par.mkiv index 8572f31b8..3db0ffa45 100644 --- a/tex/context/base/mkiv/typo-par.mkiv +++ b/tex/context/base/mkiv/typo-par.mkiv @@ -23,7 +23,7 @@ \unprotect -\registerctxluafile{node-ltp}{1.001} -\registerctxluafile{trac-par}{1.001} +\registerctxluafile{node-ltp}{} +\registerctxluafile{trac-par}{} \protect \endinput diff --git a/tex/context/base/mkiv/typo-pnc.lua b/tex/context/base/mkiv/typo-pnc.lua new file mode 100644 index 000000000..1ed8d9940 --- /dev/null +++ b/tex/context/base/mkiv/typo-pnc.lua @@ -0,0 +1,169 @@ +if not modules then modules = { } end modules ['typo-pnc'] = { + version = 1.001, + comment = "companion to typo-pnc.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +local nodes = nodes +local fonts = fonts + +local prependaction = nodes.tasks.prependaction +local enableaction = nodes.tasks.enableaction + +local nuts = nodes.nuts +local tonut = nodes.tonut + +local nodecodes = nodes.nodecodes +local gluecodes = nodes.gluecodes +local glyph_code = nodecodes.glyph +local glue_code = nodecodes.glue +local spaceskip_code = gluecodes.spaceskip + +local new_kern = nuts.pool.kern +local insert_after = nuts.insert_after +local traverse_id = nuts.traverse_id + +local getchar = nuts.getchar +local getfont = nuts.getfont +local getboth = nuts.getboth +local getnext = nuts.getnext +local getattr = nuts.getattr +local getid = nuts.getid +local getsubtype = nuts.getsubtype +local getwidth = nuts.getwidth +local setwidth = nuts.setwidth + +local parameters = fonts.hashes.parameters +local categories = characters.categories + +local texsetattribute = tex.setattribute +local unsetvalue = attributes.unsetvalue + +local period = 0x2E +local factor = 0.5 + +-- alternative: tex.getlccode and tex.getuccode + +typesetters = typesetters or { } +local typesetters = typesetters + +local periodkerns = typesetters.periodkerns or { } +typesetters.periodkerns = periodkerns + +local report = logs.reporter("period kerns") +local trace = false + +trackers.register("typesetters.periodkerns",function(v) trace = v end) + +periodkerns.mapping = periodkerns.mapping or { } +periodkerns.factors = periodkerns.factors or { } +local a_periodkern = attributes.private("periodkern") + +storage.register("typesetters/periodkerns/mapping", periodkerns.mapping, "typesetters.periodkerns.mapping") +storage.register("typesetters/periodkerns/factors", periodkerns.factors, "typesetters.periodkerns.factors") + +local mapping = periodkerns.mapping +local factors = periodkerns.factors + +function periodkerns.handler(head) + local done = false + local hnut = tonut(head) + for current in traverse_id(glyph_code,tonut(hnut)) do + if getchar(current) == period then + local a = getattr(current,a_periodkern) + if a then + local factor = mapping[a] + if factor then + local prev, next = getboth(current) + if prev and next and getid(prev) == glyph_code and getid(next) == glyph_code then + local pchar = getchar(prev) + local pcode = categories[getchar(prev)] + if pcode == "lu" or pcode == "ll" then + local nchar = getchar(next) + local ncode = categories[getchar(next)] + if ncode == "lu" or ncode == "ll" then + local next2 = getnext(next) + if next2 and getid(next2) == glyph_code and getchar(next2) == period then + -- A.B. + local fontspace, inserted + if factor ~= 0 then + fontspace = parameters[getfont(current)].space -- can be sped up + inserted = factor * fontspace + insert_after(hnut,current,new_kern(inserted)) + if trace then + report("inserting space at %C . [%p] %C .",pchar,inserted,nchar) + end + done = true + end + local next3 = getnext(next2) + if next3 and getid(next3) == glue_code and getsubtype(next3) == spaceskip_code then + local width = getwidth(next3) + local space = fontspace or parameters[getfont(current)].space -- can be sped up + if width > space then -- space + extraspace + local next4 = getnext(next3) + if next4 and getid(next4) == glyph_code then + local fchar = getchar(next4) + if categories[fchar] ~= "lu" then + -- A.B.<glue>X + if trace then + if inserted then + report("reverting space at %C . [%p] %C . [%p->%p] %C",pchar,inserted,nchar,width,space,fchar) + else + report("reverting space at %C . %C . [%p->%p] %C",pchar,nchar,width,space,fchar) + end + end + setwidth(next3,space) + done = true + else + if trace then + if inserted then + report("keeping space at %C . [%p] %C . [%p] %C",pchar,inserted,nchar,width,fchar) + else + report("keeping space at %C . %C . [%p] %C",pchar,nchar,width,fchar) + end + end + end + end + end + end + end + end + end + end + end + end + end + end + return head, done +end + +local enabled = false + +function periodkerns.set(factor) + factor = tonumber(factor) or 0 + if not enabled then + prependaction("processors","normalizers","typesetters.periodkerns.handler") + enableaction("processors","typesetters.periodkerns.handler") + enabled = true + end + local a = factors[factor] + if not a then + a = #mapping + 1 + factors[factors], mapping[a] = a, factor + end + factor = a + texsetattribute(a_periodkern,factor) + return factor +end + +-- interface + +interfaces.implement { + name = "setperiodkerning", + actions = periodkerns.set, + arguments = "string" +} + + diff --git a/tex/context/base/mkiv/typo-pnc.mkiv b/tex/context/base/mkiv/typo-pnc.mkiv new file mode 100644 index 000000000..39d0c85f4 --- /dev/null +++ b/tex/context/base/mkiv/typo-pnc.mkiv @@ -0,0 +1,55 @@ +%D \module +%D [ file=typo-pnc, +%D version=2017.06.23, % experiment in project +%D title=\CONTEXT\ Typesetting Macros, +%D subtitle=Punctuation, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\writestatus{loading}{ConTeXt Typesetting Macros / Punctuation} + +\unprotect + +% In manuals we often have "foo e.g. bar" where we then have to compensate spaces +% with "foo e.g.\ bar" so let's see if we can automate that and at the same time +% inject spaces between the snippets. It gets boring writing this kind of code. + +\registerctxluafile{typo-pnc}{} + +\definesystemattribute[periodkern][public,global] + +\installcorenamespace{periodkerning} + +\installcommandhandler \??periodkerning {periodkerning} \??periodkerning + +\unexpanded\def\setperiodkerning[#1]% + {\edef\currentperiodkerning{#1}% + \ifx\currentperiodkerning\s!reset + \resetperiodkerning + \else + \typo_periodkerning_set + \fi} + +\def\typo_periodkerning_set + {\clf_setperiodkerning{\periodkerningparameter\c!factor}} + +\unexpanded\def\resetperiodkerning % fast one + {\attribute\periodkernattribute\attributeunsetvalue} + +\appendtoks + \resetperiodkerning +\to \everyresettypesetting + +\defineperiodkerning [zerospaceperiods] [\c!factor=0] +\defineperiodkerning [smallspaceperiods] [\c!factor=.25] +\defineperiodkerning [halfspaceperiods] [\c!factor=.5] + +% If we ever need a command, see typo-krn.mkiv but it doesn't make much sense +% to have it. + +\protect diff --git a/tex/context/base/mkiv/typo-prc.lua b/tex/context/base/mkiv/typo-prc.lua index cde66df00..2704149db 100644 --- a/tex/context/base/mkiv/typo-prc.lua +++ b/tex/context/base/mkiv/typo-prc.lua @@ -41,9 +41,9 @@ local becomes = P('->') local processor = (1-becomes)^1 local splitter = C(processor) * becomes * Cs(patterns.argument + patterns.content) -function processors.split(str) +function processors.split(str,nocheck) local p, s = lpegmatch(splitter,str) - if registered[p] then + if p and (nocheck or registered[p]) then return p, s else return false, str diff --git a/tex/context/base/mkiv/typo-prc.mkvi b/tex/context/base/mkiv/typo-prc.mkvi index 49a165696..859c33a65 100644 --- a/tex/context/base/mkiv/typo-prc.mkvi +++ b/tex/context/base/mkiv/typo-prc.mkvi @@ -16,8 +16,8 @@ %D For the moment manipulators are loaded here too, as they're in the same %D category as processors. This might change. (They are used in publications.) -\registerctxluafile{typo-prc}{1.001} -\registerctxluafile{typo-man}{1.001} +\registerctxluafile{typo-prc}{} +\registerctxluafile{typo-man}{} \unprotect diff --git a/tex/context/base/mkiv/typo-rep.lua b/tex/context/base/mkiv/typo-rep.lua index 5266aa103..b6aae0cae 100644 --- a/tex/context/base/mkiv/typo-rep.lua +++ b/tex/context/base/mkiv/typo-rep.lua @@ -51,11 +51,9 @@ nodes.stripping = nodes.stripping or { } local stripping = nodes.stripping stripping.glyphs = stripping.glyphs or { } local glyphs = stripping.glyphs local function initialize() - for k,v in next, chardata do - if v.category == "cf" and v.visible ~= "yes" then - if not glyphs[k] then - glyphs[k] = true - end + for k, v in next, chardata do + if v.category == "cf" and not v.visible and not glyphs[k] then + glyphs[k] = true end end initialize = nil diff --git a/tex/context/base/mkiv/typo-rep.mkiv b/tex/context/base/mkiv/typo-rep.mkiv index c1146997e..df8408999 100644 --- a/tex/context/base/mkiv/typo-rep.mkiv +++ b/tex/context/base/mkiv/typo-rep.mkiv @@ -33,7 +33,7 @@ \unprotect -\registerctxluafile{typo-rep}{1.001} +\registerctxluafile{typo-rep}{} \definesystemattribute[stripping][public] diff --git a/tex/context/base/mkiv/typo-rub.lua b/tex/context/base/mkiv/typo-rub.lua index 9621a6218..8c41a5611 100644 --- a/tex/context/base/mkiv/typo-rub.lua +++ b/tex/context/base/mkiv/typo-rub.lua @@ -39,8 +39,6 @@ local getid = nuts.getid local getsubtype = nuts.getsubtype local getattr = nuts.getattr local setattr = nuts.setattr -local getfield = nuts.getfield -local setfield = nuts.setfield local getnext = nuts.getnext local setnext = nuts.setnext local getprev = nuts.getprev @@ -300,9 +298,6 @@ local function whatever(current) else local left = new_kern(delta/2) local right = new_kern(delta/2) --- setlink(left,start) --- setlink(stop,right) --- setlink(text,left) setlink(text,left,start) setlink(stop,right) end @@ -354,17 +349,11 @@ local function whatever(current) elseif align == v_flushright then local left = new_kern(-delta) local right = new_kern(delta) --- setlink(left,text) --- setlink(text,right) --- setlink(right,start) - setlink(left,text,right,start) - setlist(current,left) + setlink(left,text,right,start) + setlist(current,left) else local left = new_kern(-delta/2) local right = new_kern(delta/2) --- setlink(left,text) --- setlink(text,right) --- setlink(right,start) setlink(left,text,right,start) setlist(current,left) end diff --git a/tex/context/base/mkiv/typo-rub.mkiv b/tex/context/base/mkiv/typo-rub.mkiv index 7b996089b..d51c53aa4 100644 --- a/tex/context/base/mkiv/typo-rub.mkiv +++ b/tex/context/base/mkiv/typo-rub.mkiv @@ -19,7 +19,7 @@ \unprotect -\registerctxluafile{typo-rub}{1.001} +\registerctxluafile{typo-rub}{} \definesystemattribute[ruby][public] diff --git a/tex/context/base/mkiv/typo-scr.mkiv b/tex/context/base/mkiv/typo-scr.mkiv index 7b8d62dfb..d4881b80a 100644 --- a/tex/context/base/mkiv/typo-scr.mkiv +++ b/tex/context/base/mkiv/typo-scr.mkiv @@ -146,9 +146,9 @@ \setbox\plussix \hbox{\typo_scripts_lowhigh_low_high\raise\c!up \t!sup{#3}}% \doif{#1}{\v!left} {\ifdim\wd\plusfour<\wd\plussix - \setbox\plusfour\hbox to \wd\plussix {\hss\box\plusfour}% + \setbox\plusfour\hpack to \wd\plussix {\hss\box\plusfour}% \else - \setbox\plussix \hbox to \wd\plusfour{\hss\box\plussix }% + \setbox\plussix \hpack to \wd\plusfour{\hss\box\plussix }% \fi}% \ifdim\wd\plusfour<\wd\plussix \wd\plusfour\zeropoint @@ -252,9 +252,9 @@ \fi \fi \relax - \setbox\plustwo \hbox to \scratchdimen{\hss\lower\lowmidhighparameter\c!down\box\plustwo \hss}% - \setbox\plusfour\hbox to \scratchdimen{\hss \box\plusfour\hss}% - \setbox\plussix \hbox to \scratchdimen{\hss\raise\lowmidhighparameter\c!up \box\plussix \hss}% + \setbox\plustwo \hpack to \scratchdimen{\hss\lower\lowmidhighparameter\c!down\box\plustwo \hss}% + \setbox\plusfour\hpack to \scratchdimen{\hss \box\plusfour\hss}% + \setbox\plussix \hpack to \scratchdimen{\hss\raise\lowmidhighparameter\c!up \box\plussix \hss}% \wd\plustwo \zeropoint \wd\plusfour\zeropoint \box\plusfour diff --git a/tex/context/base/mkiv/typo-spa.mkiv b/tex/context/base/mkiv/typo-spa.mkiv index 2e3e71bf3..fc73ef021 100644 --- a/tex/context/base/mkiv/typo-spa.mkiv +++ b/tex/context/base/mkiv/typo-spa.mkiv @@ -15,7 +15,7 @@ \unprotect -\registerctxluafile{typo-spa}{1.001} +\registerctxluafile{typo-spa}{} \definesystemattribute[spacing][public] diff --git a/tex/context/base/mkiv/typo-sus.lua b/tex/context/base/mkiv/typo-sus.lua index f728993f6..2d3037bdc 100644 --- a/tex/context/base/mkiv/typo-sus.lua +++ b/tex/context/base/mkiv/typo-sus.lua @@ -6,6 +6,8 @@ if not modules then modules = { } end modules ['typo-sus'] = { license = "see context related readme files" } +local next = next + local punctuation = { po = true, } @@ -44,7 +46,6 @@ local tonode = nodes.tonode local getid = nuts.getid local getprev = nuts.getprev local getnext = nuts.getnext -local getfield = nuts.getfield local getattr = nuts.getattr local getfont = nuts.getfont local getlist = nuts.getlist diff --git a/tex/context/base/mkiv/typo-sus.mkiv b/tex/context/base/mkiv/typo-sus.mkiv index fe44e6327..508580e85 100644 --- a/tex/context/base/mkiv/typo-sus.mkiv +++ b/tex/context/base/mkiv/typo-sus.mkiv @@ -16,7 +16,7 @@ %D This is a rather special module, mostly needed by ourselves for %D projects where copy||editing is not that precise. -\registerctxluafile{typo-sus}{1.001} +\registerctxluafile{typo-sus}{} \unexpanded\def\showsuspects{\enabletrackers[typesetters.suspects]} diff --git a/tex/context/base/mkiv/typo-tal.lua b/tex/context/base/mkiv/typo-tal.lua index 67380f24b..870d006cc 100644 --- a/tex/context/base/mkiv/typo-tal.lua +++ b/tex/context/base/mkiv/typo-tal.lua @@ -14,7 +14,7 @@ if not modules then modules = { } end modules ['typo-tal'] = { -- We can speed up by saving the current fontcharacters[font] + lastfont. -local next, type = next, type +local next, type, tonumber = next, type, tonumber local div = math.div local utfbyte = utf.byte @@ -38,6 +38,7 @@ local tonode = nuts.tonode local getnext = nuts.getnext local getprev = nuts.getprev +local getboth = nuts.getboth local getid = nuts.getid local getfont = nuts.getfont local getchar = nuts.getchar @@ -100,7 +101,7 @@ local validsigns = { -- If needed we can have more modes which then also means a faster simple handler -- for non numbers. -local function setcharacteralign(column,separator) +local function setcharacteralign(column,separator,before,after) if not enabled then enableaction("processors","typesetters.characteralign.handler") enabled = true @@ -123,11 +124,14 @@ local function setcharacteralign(column,separator) separator = comma method = v_number end + local before = tonumber(before) or 0 + local after = tonumber(after) or 0 dataset = { separator = separator, list = { }, - maxafter = 0, - maxbefore = 0, + maxbefore = before, + maxafter = after, + predefined = before > 0 or after > 0, collected = false, method = method, separators = validseparators, @@ -153,6 +157,12 @@ implement { } implement { + name = "setcharacteraligndetail", + actions = setcharacteralign, + arguments = { "integer", "string", "dimension", "dimension" } +} + +implement { name = "resetcharacteralign", actions = resetcharacteralign } @@ -257,10 +267,9 @@ function characteralign.handler(originalhead,where) elseif (b_start or a_start) and id == glue_code then -- maybe only in number mode -- somewhat inefficient - local next = getnext(current) - local prev = getprev(current) + local prev, next = getboth(current) if next and prev and getid(next) == glyph_code and getid(prev) == glyph_code then -- too much checking - local width = fontcharacters[getfont(b_start)][separator or period].width + local width = fontcharacters[getfont(b_start or a_start)][separator or period].width setglue(current,width) setattr(current,a_character,punctuationspace) if a_start then @@ -310,8 +319,25 @@ function characteralign.handler(originalhead,where) current = getnext(current) end end - local entry = list[row] - if entry then + local predefined = dataset.predefined + local before, after + if predefined then + before = b_start and list_dimensions(b_start,getnext(b_stop)) or 0 + after = a_start and list_dimensions(a_start,getnext(a_stop)) or 0 + else + local entry = list[row] + if entry then + before = entry.before or 0 + after = entry.after or 0 + else + before = b_start and list_dimensions(b_start,getnext(b_stop)) or 0 + after = a_start and list_dimensions(a_start,getnext(a_stop)) or 0 + list[row] = { + before = before, + after = after, + } + return tonode(head), true + end if not dataset.collected then -- print("[maxbefore] [maxafter]") local maxbefore = 0 @@ -330,61 +356,53 @@ function characteralign.handler(originalhead,where) dataset.maxafter = maxafter dataset.collected = true end - local maxbefore = dataset.maxbefore - local maxafter = dataset.maxafter - local before = entry.before or 0 - local after = entry.after or 0 - local new_kern = trace_split and traced_kern or new_kern - if b_start then - if before < maxbefore then - head = insert_node_before(head,b_start,new_kern(maxbefore-before)) - end - if not c then - -- print("[before]") - if dataset.hasseparator then - local width = fontcharacters[getfont(b_stop)][separator].width - insert_node_after(head,b_stop,new_kern(maxafter+width)) - end - elseif a_start then - -- print("[before] [separator] [after]") - if after < maxafter then - insert_node_after(head,a_stop,new_kern(maxafter-after)) - end - else - -- print("[before] [separator]") - if maxafter > 0 then - insert_node_after(head,c,new_kern(maxafter)) - end + end + local maxbefore = dataset.maxbefore + local maxafter = dataset.maxafter + local new_kern = trace_split and traced_kern or new_kern + if b_start then + if before < maxbefore then + head = insert_node_before(head,b_start,new_kern(maxbefore-before)) + end + if not c then + -- print("[before]") + if dataset.hasseparator then + local width = fontcharacters[getfont(b_start)][separator].width + insert_node_after(head,b_stop,new_kern(maxafter+width)) end elseif a_start then - if c then - -- print("[separator] [after]") - if maxbefore > 0 then - head = insert_node_before(head,c,new_kern(maxbefore)) - end - else - -- print("[after]") - local width = fontcharacters[getfont(b_stop)][separator].width - head = insert_node_before(head,a_start,new_kern(maxbefore+width)) - end + -- print("[before] [separator] [after]") if after < maxafter then insert_node_after(head,a_stop,new_kern(maxafter-after)) end - elseif c then - -- print("[separator]") - if maxbefore > 0 then - head = insert_node_before(head,c,new_kern(maxbefore)) - end + else + -- print("[before] [separator]") if maxafter > 0 then insert_node_after(head,c,new_kern(maxafter)) end end - else - entry = { - before = b_start and list_dimensions(b_start,getnext(b_stop)) or 0, - after = a_start and list_dimensions(a_start,getnext(a_stop)) or 0, - } - list[row] = entry + elseif a_start then + if c then + -- print("[separator] [after]") + if maxbefore > 0 then + head = insert_node_before(head,c,new_kern(maxbefore)) + end + else + -- print("[after]") + local width = fontcharacters[getfont(b_stop)][separator].width + head = insert_node_before(head,a_start,new_kern(maxbefore+width)) + end + if after < maxafter then + insert_node_after(head,a_stop,new_kern(maxafter-after)) + end + elseif c then + -- print("[separator]") + if maxbefore > 0 then + head = insert_node_before(head,c,new_kern(maxbefore)) + end + if maxafter > 0 then + insert_node_after(head,c,new_kern(maxafter)) + end end return tonode(head), true end diff --git a/tex/context/base/mkiv/typo-tal.mkiv b/tex/context/base/mkiv/typo-tal.mkiv index 570f1a1f5..7170578d1 100644 --- a/tex/context/base/mkiv/typo-tal.mkiv +++ b/tex/context/base/mkiv/typo-tal.mkiv @@ -22,7 +22,7 @@ \unprotect -\registerctxluafile{typo-tal}{1.001} +\registerctxluafile{typo-tal}{} \definesystemattribute[characteralign][public] @@ -56,10 +56,11 @@ % D % D \typebuffer \blank \getbuffer \blank -\unexpanded\def\signalcharacteralign#1#2{\attribute\characteralignattribute\numexpr#1*\maxcardminusone+#2\relax} % 0xFFFF -\unexpanded\def\setcharacteralign #1#2{\clf_setcharacteralign#1{#2}} -\unexpanded\def\resetcharacteralign {\clf_resetcharacteralign} -\unexpanded\def\nocharacteralign {\attribute\characteralignattribute\attributeunsetvalue} +\unexpanded\def\signalcharacteralign #1#2{\attribute\characteralignattribute\numexpr#1*\maxcardminusone+#2\relax} % 0xFFFF +\unexpanded\def\setcharacteralign #1#2{\clf_setcharacteralign#1{#2}} +\unexpanded\def\resetcharacteralign {\clf_resetcharacteralign} +\unexpanded\def\nocharacteralign {\attribute\characteralignattribute\attributeunsetvalue} +\unexpanded\def\setcharacteraligndetail#1#2#3#4{\clf_setcharacteraligndetail#1{#2}#3#4\relax} %D Mostly downward compatible: %D @@ -73,18 +74,54 @@ %D \stopbuffer %D %D \typebuffer \blank \getbuffer \blank - +%D +%D \startbuffer +%D \startcharacteralign[leftsample=123.456,rightsample=00,character={,}] +%D \checkcharacteralign{123.456,78}\par +%D \checkcharacteralign {456}\par +%D \checkcharacteralign {23.456}\par +%D \checkcharacteralign {78,9}\par +%D \checkcharacteralign {78}\par +%D \stopcharacteralign +%D \stopbuffer +%D +%D \typebuffer \blank \getbuffer \blank +%D +%D \startbuffer +%D \startcharacteralign[leftwidth=123.456,rightwidth=00,character={,}] +%D \checkcharacteralign{123.456,78}\par +%D \checkcharacteralign {456}\par +%D \checkcharacteralign {23.456}\par +%D \checkcharacteralign {78,9}\par +%D \checkcharacteralign {78}\par +%D \stopcharacteralign +%D \stopbuffer +%D +%D \typebuffer \blank \getbuffer \blank +%D %D We have (currently) two modes: \type {text} and \type {number}. The handler tries %D to determine the mode automatically. When using periods and commas as separators %D the \type {number} mode is chosen. If you use for instance a \type {-} as %D separator, \type {text} is chosen, but you can enforce \type {number} with \type -%D {number->-} (as with other mechanisms, the arrow indicates a methot to apply). +%D {number->-} (as with other mechanisms, the arrow indicates a method to apply). %D %D One can use \type {\nocharacteralign} to disable this mechanism, for instance in %D a table cell. \def\alignmentcharacter{,} +\installcorenamespace{characteralign} + +\installparameterhandler\??characteralign {characteralign} +\installsetuphandler \??characteralign {characteralign} + +\setupcharacteralign + [\c!leftwidth =\zeropoint, + \c!rightwidth =\zeropoint, + \c!leftsample =, + \c!rightsample=, + \c!character =\alignmentcharacter] + \unexpanded\def\typo_charalign_pass_one {\advance\scratchcounter\plusone \setbox\scratchbox\typo_charalign_pass} @@ -99,13 +136,71 @@ \unexpanded\def\startcharacteralign {\dosingleempty\typo_charalign_start} -\def\typo_charalign_start[#1]#2\stopcharacteralign +\def\typo_charalign_start[#1]% + {\doifelseassignment{#1}\typo_charalign_start_one\typo_charalign_start_two{#1}} + +\def\typo_charalign_start_one#1#2\stopcharacteralign + {\bgroup + % for now no instances + \setupcurrentcharacteralign[#1]% + \edef\p_left {\characteralignparameter\c!leftsample}% + \edef\p_right{\characteralignparameter\c!rightsample}% + \ifx\p_left\empty + \scratchdimenone\dimexpr\characteralignparameter\c!leftwidth\relax + \else + \setbox\scratchbox\hbox{\p_left}% + \scratchdimenone\wd\scratchbox + \fi + \ifx\p_right\empty + \scratchdimentwo\dimexpr\characteralignparameter\c!rightwidth\relax + \else + \setbox\scratchbox\hbox{\p_right}% + \scratchdimentwo\wd\scratchbox + \fi + \ifzeropt\scratchdimenone + \ifzeropt\scratchdimentwo + \donefalse + \else + \donetrue + \fi + \else + \donetrue + \fi + \edef\alignmentcharacter{\characteralignparameter\c!character}% + \ifdone + \clf_setcharacteraligndetail + \plusone + \alignmentcharacter + \scratchdimenone + \scratchdimentwo + \else + \clf_setcharacteralign + \plusone + \alignmentcharacter + \begingroup + \scratchcounter\zerocount + \let\checkcharacteralign\typo_charalign_pass_one + \settrialtypesetting + #2\relax + \endgroup + \fi + \begingroup + \scratchcounter\zerocount + \let\checkcharacteralign\typo_charalign_pass_two + #2\relax + \endgroup + \resetcharacteralign + \egroup} + +\def\typo_charalign_start_two#1#2\stopcharacteralign {\bgroup \edef\m_temp{#1}% \ifx\m_temp\empty \else \let\alignmentcharacter\m_temp \fi - \setcharacteralign\plusone\alignmentcharacter + \clf_setcharacteralign + \plusone + \alignmentcharacter \begingroup \scratchcounter\zerocount \let\checkcharacteralign\typo_charalign_pass_one diff --git a/tex/context/base/mkiv/typo-txt.mkvi b/tex/context/base/mkiv/typo-txt.mkvi index 7562fe70c..e7d16fd00 100644 --- a/tex/context/base/mkiv/typo-txt.mkvi +++ b/tex/context/base/mkiv/typo-txt.mkvi @@ -17,7 +17,7 @@ \unprotect -% registerctxluafile{typo-txt}{1.001} +% registerctxluafile{typo-txt}{} %D \macros %D {normalizefontheight,normalizefontwidth,normalizedfontsize} diff --git a/tex/context/base/mkiv/typo-wrp.mkiv b/tex/context/base/mkiv/typo-wrp.mkiv index 081349050..0e010515b 100644 --- a/tex/context/base/mkiv/typo-wrp.mkiv +++ b/tex/context/base/mkiv/typo-wrp.mkiv @@ -15,7 +15,7 @@ \unprotect -\registerctxluafile{typo-wrp}{1.001} +\registerctxluafile{typo-wrp}{} %D This definition has moved from page-lin.tex to spac-hor.tex (due to %D visualization added in august 2003) and now to here (november 2014) diff --git a/tex/context/base/mkiv/unic-ini.lua b/tex/context/base/mkiv/unic-ini.lua index 132c92efa..07e3a64c3 100644 --- a/tex/context/base/mkiv/unic-ini.lua +++ b/tex/context/base/mkiv/unic-ini.lua @@ -6,6 +6,7 @@ if not modules then modules = { } end modules ['unic-ini'] = { license = "see context related readme files" } +local context = context local utfchar = utf.char -- Beware, initializing unicodechar happens at first usage and takes diff --git a/tex/context/base/mkiv/unic-ini.mkiv b/tex/context/base/mkiv/unic-ini.mkiv index 13ad4bdb9..684e3aa04 100644 --- a/tex/context/base/mkiv/unic-ini.mkiv +++ b/tex/context/base/mkiv/unic-ini.mkiv @@ -13,7 +13,7 @@ \writestatus{loading}{ConTeXt Unicode Support / Initialization} -\registerctxluafile{unic-ini}{1.001} +\registerctxluafile{unic-ini}{} \unprotect @@ -29,7 +29,7 @@ \def\unicodechar#1{\clf_unicodechar{#1}} \unexpanded\def\unknownchar - {\dontleavehmode\hbox{\vrule\s!width.5\emwidth\s!height\exheight\s!depth\zeropoint}} + {\dontleavehmode\hpack{\vrule\s!width.5\emwidth\s!height\exheight\s!depth\zeropoint}} \ifdefined\zwnbsp\else \let\zwnbsp\relax \fi % zerowidthnonbreakablespace diff --git a/tex/context/base/mkiv/util-deb.lua b/tex/context/base/mkiv/util-deb.lua index 57e015386..b8db0c583 100644 --- a/tex/context/base/mkiv/util-deb.lua +++ b/tex/context/base/mkiv/util-deb.lua @@ -145,7 +145,8 @@ function debugger.showstats(printer,threshold) local functions = 0 local dataset = { } local length = 0 - local wholetime = 0 + local realtime = 0 + local totaltime = 0 local threshold = threshold or 0 for name, sources in next, names do for source, lines in next, sources do @@ -162,8 +163,9 @@ function debugger.showstats(printer,threshold) if real < 0 then real = 0 end - wholetime = wholetime + real + realtime = realtime + real end + totaltime = totaltime + total if line < 0 then line = 0 end @@ -201,23 +203,22 @@ function debugger.showstats(printer,threshold) if length > 50 then length = 50 end - local fmt = string.formatters["%4.9k %4.9k %3.3k %8i %-" .. length .. "s %4i %s"] + local fmt = string.formatters["%4.9k s %3.3k %% %4.9k s %3.3k %% %8i # %-" .. length .. "s %4i %s"] for i=1,#dataset do - local data = dataset[i] - local real = data[1] - local total = data[2] - local count = data[3] - local name = data[4] - local source = data[5] - local line = data[6] - local percent = real / wholetime + local data = dataset[i] + local real = data[1] + local total = data[2] + local count = data[3] + local name = data[4] + local source = data[5] + local line = data[6] calls = calls + count functions = functions + 1 name = gsub(name,"%s+"," ") if #name > length then name = sub(name,1,length) end - printer(fmt(seconds(total),seconds(real),percent,count,name,line,source)) + printer(fmt(seconds(total),100*total/totaltime,seconds(real),100*real/realtime,count,name,line,source)) end printer("") printer(format("functions : %i", functions)) diff --git a/tex/context/base/mkiv/util-dim.lua b/tex/context/base/mkiv/util-dim.lua index 2bdb870e7..fd9351a28 100644 --- a/tex/context/base/mkiv/util-dim.lua +++ b/tex/context/base/mkiv/util-dim.lua @@ -429,7 +429,7 @@ end stringtodimen = string.todimen -- local variable defined earlier function number.toscaled(d) - return format("%0.5f",d/2^16) + return format("%0.5f",d/0x10000) -- 2^16 end --[[ldx-- diff --git a/tex/context/base/mkiv/util-env.lua b/tex/context/base/mkiv/util-env.lua index 0b832e72e..064bd513a 100644 --- a/tex/context/base/mkiv/util-env.lua +++ b/tex/context/base/mkiv/util-env.lua @@ -17,56 +17,58 @@ local environment = environment -- locales are a useless feature in and even dangerous for luatex -os.setlocale(nil,nil) -- setlocale("all","C") +local setlocale = os.setlocale -function os.setlocale() - -- no way you can mess with it -end +setlocale(nil,nil) -- setlocale("all","C") --- do --- --- local setlocale = os.setlocale --- --- function os.resetlocale() --- setlocale(nil,nil) --- end --- --- function os.pushlocale(l,...) --- insert(stack, { --- collate = setlocale(nil,"collate"), --- ctype = setlocale(nil,"ctype"), --- monetary = setlocale(nil,"monetary"), --- numeric = setlocale(nil,"numeric"), --- time = setlocale(nil,"time"), --- }) --- if l then --- setlocale(l,...) --- else --- setlocale(status.lc_collate ,"collate"), --- setlocale(status.lc_ctype ,"ctype"), --- setlocale(status.lc_monetary,"monetary"), --- setlocale(status.lc_numeric ,"numeric"), --- setlocale(status.lc_time ,"time"), --- end --- end +-- function os.resetlocale() +-- setlocale(nil,nil) +-- end -- --- function os.poplocale(...) --- local l = remove(stack) --- if l then --- setlocale(unpack(l)) --- else --- resetlocale() --- end +-- function os.pushlocale(l,...) +-- insert(stack, { +-- collate = setlocale(nil,"collate"), +-- ctype = setlocale(nil,"ctype"), +-- monetary = setlocale(nil,"monetary"), +-- numeric = setlocale(nil,"numeric"), +-- time = setlocale(nil,"time"), +-- }) +-- if l then +-- setlocale(l,...) +-- else +-- setlocale(status.lc_collate ,"collate"), +-- setlocale(status.lc_ctype ,"ctype"), +-- setlocale(status.lc_monetary,"monetary"), +-- setlocale(status.lc_numeric ,"numeric"), +-- setlocale(status.lc_time ,"time"), -- end +-- end -- --- function os.setlocale() --- -- no way you can mess with it, use push/pop +-- function os.poplocale() +-- local l = remove(stack) +-- if l then +-- setlocale(unpack(l)) +-- else +-- resetlocale() -- end --- --- setlocale(nil,nil) -- setlocale("all","C") --- -- end +local report = logs.reporter("system") + +function os.setlocale(a,b) + if a or b then + if report then + report() + report("You're messing with os.locale in a supposedly locale neutral enviroment. From") + report("now on are on your own and without support. Crashes or unexpected side effects") + report("can happen but don't bother the luatex and context developer team with it.") + report() + report = nil + end + setlocale(a,b) + end +end + -- dirty tricks (we will replace the texlua call by luatex --luaonly) local validengines = allocate { diff --git a/tex/context/base/mkiv/util-evo-imp-server.lua b/tex/context/base/mkiv/util-evo-imp-server.lua new file mode 100644 index 000000000..f4dd5b3f7 --- /dev/null +++ b/tex/context/base/mkiv/util-evo-imp-server.lua @@ -0,0 +1,127 @@ +if not modules then modules = { } end modules ['util-imp-evohome-server'] = { + version = 1.002, + comment = "simple server for simple evohome extensions", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE", + license = "see context related readme files" +} + +local P, C, patterns, lpegmatch = lpeg.P, lpeg.C, lpeg.patterns, lpeg.match +local urlhashed, urlquery, urlunescapeget = url.hashed, url.query, url.unescapeget +local ioflush = io.flush + +local newline = patterns.newline +local spacer = patterns.spacer +local whitespace = patterns.whitespace +local method = P("GET") + + P("POST") +local identify = (1-method)^0 + * C(method) + * spacer^1 + * C((1-spacer)^1) + * spacer^1 + * P("HTTP/") + * (1-whitespace)^0 + * C(P(1)^0) + +do + + local loaded = package.loaded + + if not loaded.socket then loaded.socket = loaded["socket.core"] end + if not loaded.mime then loaded.mime = loaded["mime.core"] end + +end + +local evohome = require("util-evo") + require("trac-lmx") + +local report = logs.reporter("evohome","server") +local convert = lmx.convert + +function evohome.server(specification) + + local filename = specification.filename + + if not filename then + report("unable to run server, no filename given") + return + end + + local step, process, presets = evohome.actions.poller(filename) + + if not (step and process and presets) then + report("unable to run server, invalid presets") + return + end + + local template = presets.files.template + + if not template then + report("unable to run server, no template given") + return + end + + local port = specification.port or (presets.server and presets.server.port) or 8068 + local host = specification.host or (presets.server and presets.server.host) or "*" + + package.extraluapath(presets.filepath) + + local socket = socket or require("socket") + local copas = copas or require("copas") + + local function copashttp(skt) + local client = copas.wrap(skt) + local request, e = client:receive() + if not e then + local method, fullurl, body = lpegmatch(identify,request) + if method ~= "" and fullurl ~= "" then + local fullurl = urlunescapeget(fullurl) + local hashed = urlhashed(fullurl) + process(hashed.queries or { }) + ioflush() + end + -- todo: split off css and use that instead of general one, now too much + local content = convert(presets.results and presets.results.template or template,false,presets) + if not content then + report("error in converting template") + content = "error in template" + end + client:send("HTTP/1.1 200 OK\r\n") + client:send("Connection: close\r\n") + client:send("Content-Length: " .. #content .. "\r\n") + client:send("Content-Type: text/html\r\n") + client:send("Location: " .. host .. "\r\n") + client:send("Cache-Control: no-cache, no-store, must-revalidate, max-age=0\r\n") + client:send("\r\n") + client:send(content) + client:send("\r\n") + client:close() + end + end + + local function copaspoll() + while step do + local delay = step() + if type(delay) == "number" then + copas.sleep(delay or 0) + end + end + end + + local server = socket.bind(host,port) + + if server then + report("server started at %s:%s",host,port) + ioflush() + copas.addserver(server,copashttp) + copas.addthread(copaspoll) + copas.loop() + else + report("unable to start server at %s:%s",host,port) + os.exit() + end + +end + +return evohome diff --git a/tex/context/base/mkiv/util-evo.lua b/tex/context/base/mkiv/util-evo.lua new file mode 100644 index 000000000..7f0b59ac4 --- /dev/null +++ b/tex/context/base/mkiv/util-evo.lua @@ -0,0 +1,1002 @@ +if not modules then modules = { } end modules ['util-evo'] = { + version = 1.002, + comment = "library for fetching data from an evohome device", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE", + license = "see context related readme files" +} + +-- When I needed a new boiler for heating I decided to replace a partial +-- (experimental) zwave few-zone solution by the honeywell evohome system that can +-- drive opentherm. I admit that I was not that satified beforehand with the fact +-- that one has to go via some outside portal to communicate with the box but lets +-- hope that this will change (I will experiment with the additional usb interface +-- later). Anyway, apart from integrating it into my home automation setup so that I +-- can add control based on someone present in a zone, I wanted to be able to render +-- statistics. So that's why we have a module in ConTeXt for doing that. It's also +-- an example of Lua and abusing LuaTeX for something not related to typesetting. +-- +-- As with other scripts, it assumes that mtxrun is used so that we have the usual +-- Lua libraries present. +-- +-- The code is not that complex but figuring out the right request takes bit of +-- searching the web. There is an api specification at: +-- +-- https://developer.honeywell.com/api-methods?field_smart_method_tags_tid=All +-- +-- Details like the application id can be found in several places. There are snippets +-- of (often partial or old) code on the web but still one needs to experiment and +-- combine information. We assume unique zone names and ids across gateways; I only +-- have one installed anyway. +-- +-- The original application was to just get the right information for generating +-- statistics but in the meantime I also use this code to add additional functionality +-- to the system, for instance switching between rooms (office, living room, attic) and +-- absence for one or more rooms. + +-- todo: %path% in filenames + +require("util-jsn") + +local next, type, setmetatable, rawset, rawget = next, type, setmetatable, rawset, rawget +local json = utilities.json +local formatters = string.formatters +local floor, div = math.floor, math.div +local resultof, ostime, osdate, ossleep = os.resultof, os.time, os.date, os.sleep +local jsontolua, jsontostring = json.tolua, json.tostring +local savetable, loadtable, sortedkeys = table.save, table.load, table.sortedkeys +local setmetatableindex, setmetatablenewindex = table.setmetatableindex, table.setmetatablenewindex +local replacer = utilities.templates.replacer +local lower = string.lower -- no utf support yet (encoding needs checking in evohome) + +local applicationid = "b013aa26-9724-4dbd-8897-048b9aada249" +----- applicationid = "91db1612-73fd-4500-91b2-e63b069b185c" + +local report = logs.reporter("evohome") +local trace = false + +trackers.register("evohome.trace",function(v) trace = v end) -- not yet used + +local defaultpresets = { + interval = 30 * 60, + files = { + everything = "evohome-everything.lua", + history = "evohome-history.lua", + latest = "evohome-latest.lua", + schedules = "evohome-schedules.lua", + actions = "evohome-actions.lua", + template = "evohome.lmx", + }, + credentials = { + -- username = "unset", + -- password = "unset", + -- accesstoken = "unset", + -- userid = "unset", + }, +} + +local validzonetypes = { + ZoneTemperatureControl = true, + RadiatorZone = true, + ZoneValves = true, +} + +local function validfile(presets,filename) + if lfs.isfile(filename) then + -- we're okay + return filename + end + if file.pathpart(filename) ~= "" then + -- can be a file that has to be created + return filename + end + local presetsname = presets.filename + if not presetsname then + -- hope for the best + return filename + end + -- we now have the full path + return file.join(file.pathpart(presetsname),filename) +end + +local function validpresets(presets) + if type(presets) ~= "table" then + report("invalid presets, no table") + return + end + local credentials = presets.credentials + if not credentials then + report("invalid presets, no credentials") + return + end + local gateways = presets.gateways + if not gateways then + report("invalid presets, no gateways") + return + end + local files = presets.files + if not files then + report("invalid presets, no files") + return + end + for k, v in next, files do + files[k] = validfile(presets,v) or v + end + local data = presets.data + if not data then + data = { } + presets.data = data + end + local g = data.gateways + if not g then + local g = { } + data.gateways = g + for i=1,#gateways do + local gi = gateways[i] + g[gi.macaddress] = gi + end + end + local zones = data.zones + if not zones then + zones = { } + data.zones = zones + setmetatablenewindex(zones,function(t,k,v) rawset(t,lower(k),v) end) + setmetatableindex (zones,function(t,k) return rawget(t,lower(k)) end) + end + local states = data.states + if not states then + states = { } + data.states = states + setmetatablenewindex(states,function(t,k,v) rawset(t,lower(k),v) end) + setmetatableindex (states,function(t,k) return rawget(t,lower(k)) end) + end + setmetatableindex(presets,defaultpresets) + setmetatableindex(credentials,defaultpresets.credentials) + setmetatableindex(files,defaultpresets.files) + return presets +end + +local function loadedtable(filename) + if type(filename) == "string" then + for i=1,10 do + local t = loadtable(filename) + if t then + return t + else + ossleep(1/4) + end + end + end + return { } +end + +local function loadpresets(filename) + local presets = loadtable(filename) + if presets then + presets.filename = filename + presets.filepath = file.expandname(file.pathpart(filename)) + -- package.extraluapath(presets.filepath) -- better do that elsewhere and once + end + return presets +end + +local function loadhistory(filename) + if type(filename) == "table" and validpresets(filename) then + filename = filename.files and filename.files.history + end + return loadedtable(filename) +end + +local function loadeverything(filename) + if type(filename) == "table" and validpresets(filename) then + filename = filename.files and filename.files.everything + end + return loadedtable(filename) +end + +local function result(t,fmt,a,b,c) + if t then + report(fmt,a or "done",b or "done",c or "done","done") + return t + else + report(fmt,a or "failed",b or "failed",c or "failed","failed") + end +end + +local f = replacer ( + [[curl ]] .. + [[--silent --insecure ]] .. + [[-X POST ]] .. + [[-H "Authorization: Basic YjAxM2FhMjYtOTcyNC00ZGJkLTg4OTctMDQ4YjlhYWRhMjQ5OnRlc3Q=" ]] .. + [[-H "Accept: application/json, application/xml, text/json, text/x-json, text/javascript, text/xml" ]] .. + [[-d "Content-Type=application/x-www-form-urlencoded; charset=utf-8" ]] .. + [[-d "Host=rs.alarmnet.com/" ]] .. + [[-d "Cache-Control=no-store no-cache" ]] .. + [[-d "Pragma=no-cache" ]] .. + [[-d "grant_type=password" ]] .. + [[-d "scope=EMEA-V1-Basic EMEA-V1-Anonymous EMEA-V1-Get-Current-User-Account" ]] .. + [[-d "Username=%username%" ]] .. + [[-d "Password=%password%" ]] .. + [[-d "Connection=Keep-Alive" ]] .. + [["https://tccna.honeywell.com/Auth/OAuth/Token"]] +) + +local function getaccesstoken(presets) + if validpresets(presets) then + local c = presets.credentials + local s = c and f { + username = c.username, + password = c.password, + applicationid = applicationid, + } + local r = s and resultof(s) + local t = r and jsontolua(r) + return result(t,"getting access token %a") + end + return result(false,"getting access token %a") +end + +local f = replacer ( + [[curl ]] .. + [[--silent --insecure ]] .. + [[-H "Authorization: bearer %accesstoken%" ]] .. + [[-H "Accept: application/json, application/xml, text/json, text/x-json, text/javascript, text/xml" ]] .. + [[-H "applicationId: %applicationid%" ]] .. + [["https://tccna.honeywell.com/WebAPI/emea/api/v1/userAccount"]] +) + +local function getuserinfo(presets) + if validpresets(presets) then + local c = presets.credentials + local s = c and f { + accesstoken = c.accesstoken, + applicationid = c.applicationid, + } + local r = s and resultof(s) + local t = r and jsontolua(r) + return result(t,"getting user info for %a") + end + return result(false,"getting user info for %a") +end + +local f = replacer ( + [[curl ]] .. + [[--silent --insecure ]] .. + [[-H "Authorization: bearer %accesstoken%" ]] .. + [[-H "Accept: application/json, application/xml, text/json, text/x-json, text/javascript, text/xml" ]] .. + [[-H "applicationId: %applicationid%" ]] .. + [["https://tccna.honeywell.com/WebAPI/emea/api/v1/location/installationInfo?userId=%userid%&includeTemperatureControlSystems=True"]] +) + +local function getlocationinfo(presets) + if validpresets(presets) then + local c = presets.credentials + local s = c and f { + accesstoken = c.accesstoken, + applicationid = applicationid, + userid = c.userid, + } + local r = s and resultof(s) + local t = r and jsontolua(r) + return result(t,"getting location info for %a") + end + return result(false,"getting location info for %a") +end + +local f = replacer ( + [[curl ]] .. + [[--silent --insecure ]] .. + [[-H "Authorization: bearer %accesstoken%" ]] .. + [[-H "Accept: application/json, application/xml, text/json, text/x-json, text/javascript, text/xml" ]] .. + [[-H "applicationId: %applicationid%" ]] .. + [["https://tccna.honeywell.com/WebAPI/emea/api/v1/temperatureZone/%zoneid%/schedule"]] +) + +local function getschedule(presets,zonename) + if validpresets(presets) then + local zoneid = presets.data.zones[zonename].zoneId + if zoneid then + local c = presets.credentials + local s = c and f { + accesstoken = c.accesstoken, + applicationid = applicationid, + zoneid = zoneid, + } + local r = s and resultof(s) + local t = r and jsontolua(r) + return result(t,"getting schedule for zone %a, %s",zonename or "?") + end + end + return result(false,"getting schedule for zone %a, %s",zonename or "?") +end + +local f = replacer ( + [[curl ]] .. + [[--silent --insecure ]] .. + [[-H "Authorization: bearer %accesstoken%" ]] .. + [[-H "Accept: application/json, application/xml, text/json, text/x-json, text/javascript, text/xml" ]] .. + [[-H "applicationId: %applicationid%" ]] .. + [["https://tccna.honeywell.com/WebAPI/emea/api/v1/location/%locationid%/status?includeTemperatureControlSystems=True" ]] +) + +local function getstatus(presets,locationid,locationname) + if locationid and validpresets(presets) then + local c = presets.credentials + local s = c and f { + accesstoken = c.accesstoken, + applicationid = applicationid, + locationid = locationid, + } + local r = s and resultof(s) + local t = r and jsontolua(r) + return result(t and t.gateways and t,"getting status for location %a, %s",locationname or "?") + end + return result(false,"getting status for location %a, %s",locationname or "?") +end + +local function validated(presets) + if validpresets(presets) then + local data = getlocationinfo(presets) + if data and type(data) == "table" and data[1] and data[1].locationInfo then + return true + else + local data = getaccesstoken(presets) + if data then + presets.credentials.accesstoken = data.access_token + local data = getuserinfo(presets) + if data then + presets.credentials.userid = data.userId + return true + end + end + end + end +end + +local function findzone(presets,name) + if not presets then + return + end + local data = presets.data + if not data then + return + end + local usedzones = data.zones + return usedzones and usedzones[name] +end + +local function gettargets(zone) -- maybe also for a day + local schedule = zone.schedule + local min = false + local max = false + if schedule then + local schedules = schedule.dailySchedules + if schedules then + for i=1,#schedules do + local switchpoints = schedules[i].switchpoints + for i=1,#switchpoints do + local m = switchpoints[i].temperature + if not min or m < min then + min = m + end + if not max or m > max then + max = m + end + end + end + else + report("zone %a has no schedule",name) + end + end + return min, max +end + +local function updatezone(presets,name,zone) + if not zone then + zone = findzone(presets,name) + end + if zone then + local oldtarget = presets.data.states[name] + local min = zone.heatSetpointCapabilities.minHeatSetpoint or 5 + local max = zone.heatSetpointCapabilities.maxHeatSetpoint or 12 + local mintarget, maxtarget = gettargets(zone) + -- todo: maybe get these from presets + if mintarget == false then + if min < 5 then + mintarget = 5 + -- report("zone %a, min target limited to %a",name,mintarget) + else + mintarget = min + end + end + if maxtarget == false then + if max > 18.5 then + maxtarget = 18.5 + -- report("zone %a, max target limited to %a",name,maxtarget) + else + maxtarget = max + end + end + local current = zone.temperatureStatus.temperature or 0 + local target = zone.heatSetpointStatus.targetTemperature + local mode = zone.heatSetpointStatus.setpointMode + local state = (mode == "FollowSchedule" and "schedule" ) or + (mode == "PermanentOverride" and target <= mintarget and "permanent") or + (mode == "TemporaryOverride" and target <= mintarget and "off" ) or + (mode == "TemporaryOverride" and target >= maxtarget and "on" ) or + ( "unknown" ) + local t = { + name = zone.name, + id = zone.zoneId, + schedule = zone.schedule, + mode = mode, + current = current, + target = target, + min = min, + max = max, + state = state, + lowest = mintarget, + highest = maxtarget, + } + -- report("zone %a, current %a, target %a",name,current,target) + presets.data.states[name] = t + return t + end +end + + +local function geteverything(presets,noschedules) + if validated(presets) then + local data = getlocationinfo(presets) + if data then + local usedgateways = presets.data.gateways + local usedzones = presets.data.zones + for i=1,#data do + local gateways = data[i].gateways + local locationinfo = data[i].locationInfo + local locationid = locationinfo and locationinfo.locationId + if gateways and locationid then + local status = getstatus(presets,locationid,locationinfo.name) + if status then + for i=1,#gateways do + local gatewaystatus = status.gateways[i] + local gatewayinfo = gateways[i] + local gatewaysystems = gatewayinfo.temperatureControlSystems + local info = gatewayinfo.gatewayInfo + local statussystems = gatewaystatus.temperatureControlSystems + if gatewaysystems and statussystems and info then + local mac = info.mac + if usedgateways[mac] then + report("%s gateway with mac address %a","using",mac) + for j=1,#gatewaysystems do + local gatewayzones = gatewaysystems[j].zones + local zonestatus = statussystems[j].zones + if gatewayzones and zonestatus then + for k=1,#gatewayzones do + local zonestatus = zonestatus[k] + local gatewayzone = gatewayzones[k] + if zonestatus and gatewayzone then + local zonename = zonestatus.name + local zoneid = zonestatus.zoneId + if validzonetypes[gatewayzone.zoneType] and zonename == gatewayzone.name then + gatewayzone.heatSetpointStatus = zonestatus.heatSetpointStatus + gatewayzone.temperatureStatus = zonestatus.temperatureStatus + local zonestatus = usedzones[zonename] -- findzone(states,zonename) + local schedule = zonestatus and zonestatus.schedule + usedzones[zonename] = gatewayzone + if schedule and noschedules then + gatewayzone.schedule = schedule + else + gatewayzone.schedule = getschedule(presets,zonename) + end + updatezone(presets,zonename,gatewayzone) + end + end + end + end + end + else + report("%s gateway with mac address %a","skipping",mac) + end + end + end + end + end + end + savetable(presets.files.everything,data) + return result(data,"getting everything, %s") + end + end + return result(false,"getting everything, %s") +end + +local function gettemperatures(presets) + if validated(presets) then + local data = loadeverything(presets) + if not data or not next(data) then + data = geteverything(presets) + end + if data then + local updated = false + for i=1,#data do + local gateways = data[i].gateways + local locationinfo = data[i].locationInfo + local locationid = locationinfo.locationId + if gateways then + local status = getstatus(presets,locationid,locationinfo.name) + if status then + for i=1,#gateways do + local g = status.gateways[i] + local gateway = gateways[i] + local systems = gateway.temperatureControlSystems + if systems then + local s = g.temperatureControlSystems + for i=1,#systems do + local zones = systems[i].zones + if zones then + local z = s[i].zones + for i=1,#zones do + if validzonetypes[zone.zoneType] then + local z = z[i] + if z.name == zone.name then + zone.temperatureStatus = z.temperatureStatus + updated = true + end + end + end + end + end + end + end + end + end + end + if updated then + data.time = ostime() + savetable(presets.files.latest,data) + end + return result(data,"getting temperatures, %s") + end + end + return result(false,"getting temperatures, %s") +end + +local function setmoment(target,time,data) + if not time then + time = ostime() + end + local t = osdate("*t",time ) + local c_year, c_month, c_day, c_hour, c_minute = t.year, t.month, t.day, t.hour, t.min + -- + local years = target.years if not years then years = { } target.years = years end + local d_year = years[c_year] if not d_year then d_year = { } years[c_year] = d_year end + local months = d_year.months if not months then months = { } d_year.months = months end + local d_month = months[c_month] if not d_month then d_month = { } months[c_month] = d_month end + local days = d_month.days if not days then days = { } d_month.days = days end + local d_day = days[c_day] if not d_day then d_day = { } days[c_day] = d_day end + local hours = d_day.hours if not hours then hours = { } d_day.hours = hours end + local d_hour = hours[c_hour] if not d_hour then d_hour = { } hours[c_hour] = d_hour end + -- + c_minute = div(c_minute,15) + 1 + -- + local d_last = d_hour[c_minute] + if d_last then + for k, v in next, data do + local d = d_last[k] + if d then + data[k] = (d + v) / 2 + end + end + end + d_hour[c_minute] = data + -- + target.lasttime = { + year = c_year, + month = c_month, + day = c_day, + hour = c_hour, + minute = c_minute, + } +end + +local function loadtemperatures(presets) + if validpresets(presets) then + local status = loadeverything(presets) + if status then + local usedgateways = presets.data.gateways + for i=1,#status do + local gateways = status[i].gateways + if gateways then + for i=1,#gateways do + local gatewayinfo = gateways[i] + local systems = gatewayinfo.temperatureControlSystems + local info = gatewayinfo.gatewayInfo + if systems and info and usedgateways[info.mac] then + for i=1,#systems do + local zones = systems[i].zones + if zones then + local summary = { time = status.time } + for i=1,#zones do + local zone = zones[i] + if validzonetypes[zone.zoneType] then + summary[#summary+1] = updatezone(presets,zone.name,zone) + end + end + return result(summary,"loading temperatures, %s") + end + end + end + end + end + end + end + end + return result(false,"loading temperatures, %s") +end + +local function updatetemperatures(presets) + if validpresets(presets) then + local everythingname = presets.files.everything + local historyname = presets.files.history + if everythingname and historyname then + gettemperatures(presets,everythingname) + local t = loadtemperatures(presets) + if t then + local data = { } + for i=1,#t do + local ti = t[i] + data[ti.name] = ti.current + end + local history = loadhistory(historyname) or { } + setmoment(history,ostime(),data) + savetable(historyname,history) + return result(t,"updating temperatures, %s") + end + end + end + return result(false,"updating temperatures, %s") +end + +local function getzonestate(presets,name) + return validpresets(presets) and presets.data.states[name] +end + +local f = replacer ( + [[curl ]] .. + [[--silent --insecure ]] .. + [[-X PUT ]] .. + [[-H "Authorization: bearer %accesstoken%" ]] .. + [[-H "Accept: application/json, application/xml, text/json, text/x-json, text/javascript, text/xml" ]] .. + [[-H "applicationId: %applicationid%" ]] .. + [[-H "Content-Type: application/json" ]] .. + [[-d "%[settings]%" ]] .. + [["https://tccna.honeywell.com/WebAPI/emea/api/v1/temperatureZone/%zoneid%/heatSetpoint"]] +) + +local function untilmidnight() + local t = osdate("*t") + t.hour = 23 + t.min = 59 + t.sec = 59 + return osdate("%Y-%m-%dT%H:%M:%SZ",ostime(t)) +end + +local followschedule = { + -- HeatSetpointValue = 0, + SetpointMode = "FollowSchedule", +} + +local function setzonestate(presets,name,temperature,permanent) + local zone = findzone(presets,name) + if zone then + local m = followschedule + if type(temperature) == "number" and temperature > 0 then + if permanent then + m = { + HeatSetpointValue = temperature, + SetpointMode = "PermanentOverride", + } + else + m = { + HeatSetpointValue = temperature, + SetpointMode = "TemporaryOverride", + TimeUntil = untilmidnight(), + } + end + end + local s = f { + accesstoken = presets.credentials.accesstoken, + applicationid = applicationid, + zoneid = zone.zoneId, + settings = jsontostring(m), + } + local r = s and resultof(s) + local t = r and jsontolua(r) +-- inspect(r) +-- inspect(t) + return result(t,"setting state of zone %a, %s",name) + end + return result(false,"setting state of zone %a, %s",name) +end + +local function resetzonestate(presets,name) + setzonestate(presets,name) +end + +-- + +local function update(presets,noschedules) + local everything = geteverything(presets,noschedules) + if everything then + presets.data.everything = everything + return presets + end +end + +local function initialize(filename) + local presets = loadpresets(filename) + if presets then + return update(presets) + end +end + +local function off(presets,name) + local zone = presets and getzonestate(presets,name) + if zone then + setzonestate(presets,name,zone.lowest) + end +end + +local function on(presets,name) + local zone = presets and getzonestate(presets,name) + if zone then + setzonestate(presets,name,zone.highest) + end +end + +local function schedule(presets,name) + local zone = presets and getzonestate(presets,name) + if zone then + resetzonestate(presets,name) + end +end + +local function permanent(presets,name) + local zone = presets and getzonestate(presets,name) + if zone then + setzonestate(presets,name,zone.lowest,true) + end +end + +-- tasks + +local function settask(presets,when,tag,action) + if when == "tomorrow" then + local list = presets.scheduled + if not list then + list = loadtable(presets.files.schedules) or { } + presets.scheduled = list + end + if action then + list[tag] = { + time = ostime() + 24*60*60, + done = false, + category = category, + action = action, + } + else + list[tag] = nil + end + savetable(presets.files.schedules,list) + end +end + +local function gettask(presets,when,tag) + if when == "tomorrow" then + local list = presets.scheduled + if not list then + list = loadtable(presets.files.schedules) or { } + presets.scheduled = list + end + return list[tag] + end +end + +local function resettask(presets,when,tag) + settask(presets,when,tag) +end + +local function checktasks(presets) + local list = presets.scheduled + if not list then + list = loadtable(presets.files.schedules) or { } + presets.scheduled = list + end + if list then + local t = osdate("*t") + local q = { } + for k, v in next, list do + local d = osdate("*t",v.time) + if not v.done and d.year == t.year and d.month == t.month and d.day == t.day then + local a = v.action + if type(a) == "function" then + a() + end + v.done = true + end + if d.year <= t.year and d.month <= t.month and d.day < t.day then + q[k] = true + end + end + if next(q) then + for k, v in next, q do + list[q] = nil + end + savetable(presets.files.schedules,list) + end + return list + end +end + +-- predefined tasks + +local function settomorrow(presets,tag,action) + settask(presets,"tomorrow",tag,action) +end + +local function resettomorrow(presets,tag) + settask(presets,"tomorrow",tag) +end + +local function tomorrowset(presets,tag) + return gettask(presets,"tomorrow",tag) and true or false +end + +-- + +local evohome + +local function poller(presets) + -- + if type(presets) ~= "string" then + report("invalid presets file") + os.exit() + end + report("loading presets from %a",presets) + local presets = loadpresets(presets) + if not validpresets(presets) then + report("invalid presets, aborting") + os.exit() + end + -- + local actions = presets.files.actions + if type(actions) ~= "string" then + report("invalid actions file") + os.exit() + end + report("loading actions from %a",actions) + local actions = loadtable(actions) + if type(actions) ~= "table" then + report("invalid actions, aborting") + os.exit() + end + actions = actions.actions + if type(actions) ~= "table" then + report("invalid actions file, no actions subtable") + os.exit() + end + -- + report("updating device status") + update(presets) + -- + presets.report = report + presets.evohome = evohome + presets.results = { } + -- + function presets.getstate(name) + return getzonestate(presets,name) + end + function presets.tomorrowset(name) + return tomorrowset(presets,name) + end + -- + local template = actions.template or presets.files.template + -- + local process = function(t) + local category = t.category + local action = t.action + if category and action then + local c = actions[category] + if c then + local a = c[action] + if type(a) == "function" then + report("category %a, action %a, executing",category,action) + presets.results.template = template -- can be overloaded by action + a(presets) + update(presets,true) + else + report("category %a, action %a, invalid action, known: %, t",category,action,sortedkeys(c)) + end + else + report("category %a, action %a, invalid category, known categories: %, t",category,action,sortedkeys(actions)) + end + else + -- logs.report("invalid category and action") + end + end + -- + local delay = presets.delay or 10 + local interval = 15 * 60 -- 15 minutes + local interval = 60 * 60 -- 60 minutes + local refresh = 5 * 60 + local passed = 0 + local step = function() + if passed > interval then + report("refreshing states, every %i seconds",interval) + -- todo: update stepwise as this also updates the schedules that we don't really + -- change often and definitely not in the middle of the night, so maybe just + -- update 9:00 12:00 15:00 18:00 21:00 + update(presets) + passed = 0 + else + passed = passed + delay + end + checktasks(presets) + return delay + end + -- + presets.refreshtime = refresh + -- + return step, process, presets +end + +-- + +evohome = { + helpers = { + getaccesstoken = getaccesstoken, -- presets + getuserinfo = getuserinfo, -- presets + getlocationinfo = getlocationinfo, -- presets + getschedule = getschedule, -- presets, name + -- + geteverything = geteverything, -- presets, noschedules + gettemperatures = gettemperatures, -- presets + getzonestate = getzonestate, -- presets, name + setzonestate = setzonestate, -- presets, name, temperature + resetzonestate = resetzonestate, -- presets, name + getzonedata = findzone, -- presets, name + -- + loadpresets = loadpresets, -- filename + loadhistory = loadhistory, -- presets | filename + loadeverything = loadeverything, -- presets | filename + loadtemperatures = loadtemperatures, -- presets | filename + -- + updatetemperatures = updatetemperatures, -- presets + }, + actions= { + initialize = initialize, -- filename + update = update, -- presets + -- + off = off, -- presets, name + on = on, -- presets, name + schedule = schedule, -- presets, name + permanent = permanent, -- presets, name + -- + settomorrow = settomorrow, -- presets, tag, function + resettomorrow = resettomorrow, -- presets, tag + tomorrowset = tomorrowset, -- presets, tag + -- + poller = poller, -- presets + } +} + +if utilities then + utilities.evohome = evohome +end + +-- local presets = evohome.helpers.loadpresets("c:/data/develop/domotica/code/evohome-presets.lua") +-- evohome.helpers.setzonestate(presets,"Voorkamer",22) +-- evohome.helpers.setzonestate(presets,"Voorkamer") + +return evohome + diff --git a/tex/context/base/mkiv/util-fil.lua b/tex/context/base/mkiv/util-fil.lua index 01bcd571e..0e8ed4e57 100644 --- a/tex/context/base/mkiv/util-fil.lua +++ b/tex/context/base/mkiv/util-fil.lua @@ -6,10 +6,8 @@ if not modules then modules = { } end modules ['util-fil'] = { license = "see context related readme files" } -local byte = string.byte -local char = string.char -local extract = bit32 and bit32.extract -local floor = math.floor +local byte = string.byte +local char = string.char -- Here are a few helpers (the starting point were old ones I used for parsing -- flac files). In Lua 5.3 we can probably do this better. Some code will move @@ -35,7 +33,10 @@ function files.close(f) end function files.size(f) - return f:seek("end") + local current = f:seek() + local size = f:seek("end") + f:seek("set",current) + return size end files.getsize = files.size @@ -233,13 +234,13 @@ function files.readfixed4(f) end end -if extract then +-- (real) ((n<<16)>>(16+14)) + ((n&0x3fff)/16384.0)) + +if bit32 then local extract = bit32.extract local band = bit32.band - -- (real) ((n<<16)>>(16+14)) + ((n&0x3fff)/16384.0)) - function files.read2dot14(f) local a, b = byte(f:read(2),1,2) if a >= 0x80 then @@ -263,20 +264,37 @@ end -- writers (kind of slow) -function files.writecardinal2(f,n) - local a = char(n % 256) - n = floor(n/256) - local b = char(n % 256) - f:write(b,a) +if bit32 then + + local rshift = bit32.rshift + + function files.writecardinal2(f,n) + local a = char(n % 256) + n = rshift(n,8) + local b = char(n % 256) + f:write(b,a) + end + +else + + local floor = math.floor + + function files.writecardinal2(f,n) + local a = char(n % 256) + n = floor(n/256) + local b = char(n % 256) + f:write(b,a) + end + end function files.writecardinal4(f,n) local a = char(n % 256) - n = floor(n/256) + n = rshift(n,8) local b = char(n % 256) - n = floor(n/256) + n = rshift(n,8) local c = char(n % 256) - n = floor(n/256) + n = rshift(n,8) local d = char(n % 256) f:write(d,c,b,a) end @@ -299,8 +317,8 @@ if fio and fio.readcardinal1 then files.readinteger2 = fio.readinteger2 files.readinteger3 = fio.readinteger3 files.readinteger4 = fio.readinteger4 - -- files.readfixed2 = fio.readfixed2 -- needs recent luatex - -- files.readfixed4 = fio.readfixed4 -- needs recent luatex + files.readfixed2 = fio.readfixed2 + files.readfixed4 = fio.readfixed4 files.read2dot14 = fio.read2dot14 files.setposition = fio.setposition files.getposition = fio.getposition diff --git a/tex/context/base/mkiv/util-jsn.lua b/tex/context/base/mkiv/util-jsn.lua index e835c07d6..e5f83e06c 100644 --- a/tex/context/base/mkiv/util-jsn.lua +++ b/tex/context/base/mkiv/util-jsn.lua @@ -21,7 +21,7 @@ local format = string.format local utfchar = utf.char local concat = table.concat -local tonumber, tostring, rawset, type = tonumber, tostring, rawset, type +local tonumber, tostring, rawset, type, next = tonumber, tostring, rawset, type, next local json = utilities.json or { } utilities.json = json @@ -158,4 +158,11 @@ end -- inspect(json.tostring(true)) +function json.load(filename) + local data = io.loaddata(filename) + if data then + return lpegmatch(jsonconverter,data) + end +end + return json diff --git a/tex/context/base/mkiv/util-lib.lua b/tex/context/base/mkiv/util-lib.lua index e7b6e4875..714cfd4c7 100644 --- a/tex/context/base/mkiv/util-lib.lua +++ b/tex/context/base/mkiv/util-lib.lua @@ -80,6 +80,7 @@ local pathpart = file.pathpart local nameonly = file.nameonly local joinfile = file.join local removesuffix = file.removesuffix +local addsuffix = file.addsuffix local findfile = resolvers.findfile local findfiles = resolvers.findfiles local expandpaths = resolvers.expandedpathlistfromvariable @@ -104,14 +105,22 @@ local function locate(required,version,trace,report,action) local required_path = pathpart(required_full) local required_base = nameonly(required_full) if qualifiedpath(required) then - if isfile(required) then + -- also check with suffix + if isfile(addsuffix(required,os.libsuffix)) then + if trace then + report("qualified name %a found",required) + end found_library = required + else + if trace then + report("qualified name %a not found",required) + end end else -- initialize a few variables local required_name = required_base .. "." .. os.libsuffix local version = type(version) == "string" and version ~= "" and version or false - local engine = environment.ownmain or false + local engine = "luatex" -- environment.ownmain or false -- if trace and not done then local list = expandpaths("lib") -- fresh, no reuse @@ -177,10 +186,12 @@ local function locate(required,version,trace,report,action) report("checking lib paths") end package.extralibpath(environment.ownpath) - local paths = package.libpaths() + local paths = package.libpaths() + local pattern = "/[^/]+%." .. os.libsuffix .. "$" for i=1,#paths do - local found = check(lfs.isfile) - if found and (not checkpattern or find(found,checkpattern)) then + required_path = gsub(paths[i],pattern,"") + local found = check(lfs.isfound) + if type(found) == "string" and (not checkpattern or find(found,checkpattern)) then return found end end @@ -211,18 +222,20 @@ local function locate(required,version,trace,report,action) if trace then report("found: %a",found_library) end - local message, result = action(found_library,required_base) + local result, message = action(found_library,required_base) if result then library = result else library = false - report("load error: message %a, library %a",tostring(message),found_library or "no library") + report("load error: message %a, library %a",tostring(message or "unknown"),found_library or "no library") end end - if not library then - report("unknown: %a",required) - elseif trace then - report("stored: %a",required) + if trace then + if not library then + report("unknown library: %a",required) + else + report("stored library: %a",required) + end end return library end @@ -254,13 +267,12 @@ do local libtype = type(library) if libtype == "function" then library = library() - message = true else report_swiglib("load error: %a returns %a, message %a, library %a",opener,libtype,(string.gsub(message or "no message","[%s]+$","")),found_library or "no library") library = false end popdir() - return message, library + return library end) loadedlibs[required] = library or false end @@ -332,22 +344,50 @@ We use the same lookup logic for ffi loading. local trace_ffilib = false local savedffiload = ffi.load + -- local pushlibpath = package.pushlibpath + -- local poplibpath = package.poplibpath + + -- ffi.savedload = savedffiload + trackers.register("resolvers.ffilib", function(v) trace_ffilib = v end) + -- pushlibpath(pathpart(name)) + -- local message, library = pcall(savedffiload,nameonly(name)) + -- poplibpath() + + local loaded = { } + local function locateindeed(name) - local message, library = pcall(savedffiload,removesuffix(name)) - if type(library) == "userdata" then - return library - else - return false + name = removesuffix(name) + local l = loaded[name] + if l == nil then + local message, library = pcall(savedffiload,name) + if type(message) == "userdata" then + l = message + elseif type(library) == "userdata" then + l = library + else + l = false + end + loaded[name] = l + elseif trace_ffilib then + report_ffilib("reusing already loaded %a",name) end + return l end - function ffilib(required,version) - if version == "system" then + function ffilib(name,version) + name = removesuffix(name) + local l = loaded[name] + if l ~= nil then + if trace_ffilib then + report_ffilib("reusing already loaded %a",name) + end + return l + elseif version == "system" then return locateindeed(name) else - return locate(required,version,trace_ffilib,report_ffilib,locateindeed) + return locate(name,version,trace_ffilib,report_ffilib,locateindeed) end end @@ -355,10 +395,12 @@ We use the same lookup logic for ffi loading. local library = ffilib(name) if type(library) == "userdata" then return library - else + end + if trace_ffilib then report_ffilib("trying to load %a using normal loader",name) - return savedffiload(name) end + -- so here we don't store + return savedffiload(name) end end diff --git a/tex/context/base/mkiv/util-lua.lua b/tex/context/base/mkiv/util-lua.lua index b3346006c..bd74d0843 100644 --- a/tex/context/base/mkiv/util-lua.lua +++ b/tex/context/base/mkiv/util-lua.lua @@ -10,16 +10,17 @@ if not modules then modules = { } end modules ['util-lua'] = { -- we will remove the 5.1 code some day soon local rep, sub, byte, dump, format = string.rep, string.sub, string.byte, string.dump, string.format -local load, loadfile, type = load, loadfile, type +local load, loadfile, type, collectgarbage = load, loadfile, type, collectgarbage utilities = utilities or {} utilities.lua = utilities.lua or { } local luautilities = utilities.lua local report_lua = logs.reporter("system","lua") +local report_mem = logs.reporter("system","lua memory") local tracestripping = false -local forcestupidcompile = true -- use internal bytecode compiler +local tracememory = false luautilities.stripcode = true -- support stripping when asked for luautilities.alwaysstripcode = false -- saves 1 meg on 7 meg compressed format file (2012.08.12) luautilities.nofstrippedchunks = 0 @@ -71,12 +72,21 @@ end -- quite subtle ... doing this wrong incidentally can give more bytes -function luautilities.loadedluacode(fullname,forcestrip,name) +function luautilities.loadedluacode(fullname,forcestrip,name,macros) -- quite subtle ... doing this wrong incidentally can give more bytes name = name or fullname local code, message - if environment.loadpreprocessedfile then - code, message = environment.loadpreprocessedfile(fullname) + if macros then + macros = lua.macros + end + if macros and macros.enabled then + -- local c = io.loaddata(fullname) -- not yet available + local f = io.open(fullname,"rb") local c = f:read("*a") f:close() + local n = c and macros.resolvestring("--[["..fullname.."]] "..c) + if n and #n ~= #c then + report_lua("preprocessed file %a: %i => %i bytes",fullname,#c,#n) + end + code, message = load(n or c) else code, message = loadfile(fullname) end @@ -103,7 +113,7 @@ function luautilities.loadedluacode(fullname,forcestrip,name) end end -function luautilities.strippedloadstring(code,forcestrip,name) -- not executed +function luautilities.strippedloadstring(code,name,forcestrip) -- not executed local code, message = load(code) if not code then report_lua("loading of file %a failed:\n\t%s",name,message or "no message") @@ -116,6 +126,14 @@ function luautilities.strippedloadstring(code,forcestrip,name) -- not executed end end +function luautilities.loadstring(code,name) -- not executed + local code, message = load(code) + if not code then + report_lua("loading of file %a failed:\n\t%s",name,message or "no message") + end + return code, 0 +end + function luautilities.compile(luafile,lucfile,cleanup,strip,fallback) -- defaults: cleanup=false strip=true report_lua("compiling %a into %a",luafile,lucfile) os.remove(lucfile) @@ -176,3 +194,24 @@ setmetatable(finalizers, { function luautilities.registerfinalizer(f) finalizers[#finalizers+1] = f end + +function luautilities.checkmemory(previous,threshold,trace) -- threshold in MB + local current = collectgarbage("count") + if previous then + local checked = (threshold or 64)*1024 + local delta = current - previous + if current - previous > checked then + collectgarbage("collect") + local afterwards = collectgarbage("count") + if trace or tracememory then + report_mem("previous %i MB, current %i MB, delta %i MB, threshold %i MB, afterwards %i MB", + previous/1024,current/1024,delta/1024,threshold,afterwards) + end + return afterwards + elseif trace or tracememory then + report_mem("previous %i MB, current %i MB, delta %i MB, threshold %i MB", + previous/1024,current/1024,delta/1024,threshold) + end + end + return current +end diff --git a/tex/context/base/mkiv/util-prs.lua b/tex/context/base/mkiv/util-prs.lua index 650a7ead6..48d59a9f3 100644 --- a/tex/context/base/mkiv/util-prs.lua +++ b/tex/context/base/mkiv/util-prs.lua @@ -566,14 +566,16 @@ function parsers.rfc4180splitter(specification) local field = escaped + non_escaped + Cc("") local record = Ct(field * (separator * field)^1) local headerline = record * Cp() - local wholeblob = Ct((newline^(specification.strict and -1 or 1) * record)^0) + local morerecords = (newline^(specification.strict and -1 or 1) * record)^0 + local headeryes = Ct(morerecords) + local headernop = Ct(record * morerecords) return function(data,getheader) if getheader then local header, position = lpegmatch(headerline,data) - local data = lpegmatch(wholeblob,data,position) + local data = lpegmatch(headeryes,data,position) return data, header else - return lpegmatch(wholeblob,data) + return lpegmatch(headernop,data) end end end @@ -604,10 +606,10 @@ local cardinal = lpegpatterns.cardinal / tonumber local spacers = lpegpatterns.spacer^0 local endofstring = lpegpatterns.endofstring -local stepper = spacers * ( C(cardinal) * ( spacers * S(":-") * spacers * ( C(cardinal) + Cc(true) ) + Cc(false) ) +local stepper = spacers * ( cardinal * ( spacers * S(":-") * spacers * ( cardinal + Cc(true) ) + Cc(false) ) * Carg(1) * Carg(2) / ranger * S(", ")^0 )^1 -local stepper = spacers * ( C(cardinal) * ( spacers * S(":-") * spacers * ( C(cardinal) + (P("*") + endofstring) * Cc(true) ) + Cc(false) ) +local stepper = spacers * ( cardinal * ( spacers * S(":-") * spacers * ( cardinal + (P("*") + endofstring) * Cc(true) ) + Cc(false) ) * Carg(1) * Carg(2) / ranger * S(", ")^0 )^1 * endofstring -- we're sort of strict (could do without endofstring) function parsers.stepper(str,n,action) diff --git a/tex/context/base/mkiv/util-sbx.lua b/tex/context/base/mkiv/util-sbx.lua index 66a650875..57c576870 100644 --- a/tex/context/base/mkiv/util-sbx.lua +++ b/tex/context/base/mkiv/util-sbx.lua @@ -28,6 +28,7 @@ local concat = string.concat local unquoted = string.unquoted local optionalquoted = string.optionalquoted local basename = file.basename +local nameonly = file.nameonly local sandbox = sandbox local validroots = { } @@ -122,9 +123,9 @@ local function registerlibrary(name) return end if validlibraries == true then - validlibraries = { [name] = true } + validlibraries = { [nameonly(name)] = true } else - validlibraries[name] = true + validlibraries[nameonly(name)] = true end elseif name == true then validlibraries = { } @@ -461,7 +462,7 @@ function sandbox.getrunner(name) end local function suspicious(str) - return (find(str,"[/\\]") or find(command,"%.%.")) and true or false + return (find(str,"[/\\]") or find(command,"..",1,true)) and true or false end local function binaryrunner(action,command,...) @@ -562,9 +563,9 @@ if FFISUPPORTED and ffi then end end - local load = ffi.load + local fiiload = ffi.load - if load then + if fiiload then local reported = { } @@ -573,10 +574,10 @@ if FFISUPPORTED and ffi then -- all blocked elseif validlibraries == true then -- all permitted - return load(name,...) - elseif validlibraries[name] then + return fiiload(name,...) + elseif validlibraries[nameonly(name)] then -- 'name' permitted - return load(name,...) + return fiiload(name,...) else -- 'name' not permitted end diff --git a/tex/context/base/mkiv/util-sci.lua b/tex/context/base/mkiv/util-sci.lua index e028d2f95..fe28635a3 100644 --- a/tex/context/base/mkiv/util-sci.lua +++ b/tex/context/base/mkiv/util-sci.lua @@ -50,6 +50,9 @@ local function loadscitelexer() if not lexer then lexer = require("scite-context-lexer") require("scite-context-theme") -- uses lexer + if lexer then + lexer.context.disablewordcheck() + end end return lexer end @@ -122,7 +125,7 @@ end local function exportwhites() return setmetatableindex(function(t,k) - local v = find(k,"white") and true or false + local v = find(k,"white",1,true) and true or false t[k] = v return v end) diff --git a/tex/context/base/mkiv/util-seq.lua b/tex/context/base/mkiv/util-seq.lua index 5836f5eca..d302ff276 100644 --- a/tex/context/base/mkiv/util-seq.lua +++ b/tex/context/base/mkiv/util-seq.lua @@ -361,6 +361,6 @@ function sequencers.nodeprocessor(t,nofarguments) -- todo: handle 'kind' in plug end end local processor = #calls > 0 and formatters[nostate and template_yes_nostate or template_yes_state](concat(vars,"\n"),args,concat(calls,"\n")) or template_nop --- print(processor) + -- print(processor) return processor end diff --git a/tex/context/base/mkiv/util-sha.lua b/tex/context/base/mkiv/util-sha.lua new file mode 100644 index 000000000..3e786a834 --- /dev/null +++ b/tex/context/base/mkiv/util-sha.lua @@ -0,0 +1,326 @@ +if not modules then modules = { } end modules ['util-sha'] = { + version = 1.001, + comment = "companion to luat-lib.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files", + comment2 = "derived from Wikipedia and Lua support websites", + comment3 = "due to bit operators this code only works in lua(tex) 5.3", +} + +-- This doesn't work in luajittex ... maybe some day it will have bit operators too. +-- I'm not really in the mood for making this module aware (by compiling the +-- function depending on the engine that I use but I probably won't use luajittex in +-- cases where I need this.) +-- +-- Hm, it actually makes a case for the macro subsystem but we then also need to +-- make an unpack/pack replacement ... too boring. +-- +-- This code is derived from: +-- +-- http://lua-users.org/wiki/SecureHashAlgorithmBw +-- +-- which in turn was a 5.3 variant of a 5.2 implementation by Roberto but it also +-- looks like a more or less direct translation of: +-- +-- https://en.wikipedia.org/wiki/SHA-2 +-- +-- I optimized the code bit and added 512 support. For an explanation see the +-- mentioned websites. We don't do chunks here as we only need it for hashing +-- relatively small blobs (and even an image is not that large). +-- +-- On short strings 256 seems faster than 512 while on a megabyte blob 512 wins +-- from 256 (64 bit internals). + +local packstring, unpackstring = string.pack, string.unpack +local unpack, setmetatable = unpack, setmetatable + +local constants256 = { + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, + 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, + 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, + 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, + 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, + 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, + 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, + 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2, +} + +local constants512 = { + 0x428a2f98d728ae22, 0x7137449123ef65cd, 0xb5c0fbcfec4d3b2f, 0xe9b5dba58189dbbc, 0x3956c25bf348b538, + 0x59f111f1b605d019, 0x923f82a4af194f9b, 0xab1c5ed5da6d8118, 0xd807aa98a3030242, 0x12835b0145706fbe, + 0x243185be4ee4b28c, 0x550c7dc3d5ffb4e2, 0x72be5d74f27b896f, 0x80deb1fe3b1696b1, 0x9bdc06a725c71235, + 0xc19bf174cf692694, 0xe49b69c19ef14ad2, 0xefbe4786384f25e3, 0x0fc19dc68b8cd5b5, 0x240ca1cc77ac9c65, + 0x2de92c6f592b0275, 0x4a7484aa6ea6e483, 0x5cb0a9dcbd41fbd4, 0x76f988da831153b5, 0x983e5152ee66dfab, + 0xa831c66d2db43210, 0xb00327c898fb213f, 0xbf597fc7beef0ee4, 0xc6e00bf33da88fc2, 0xd5a79147930aa725, + 0x06ca6351e003826f, 0x142929670a0e6e70, 0x27b70a8546d22ffc, 0x2e1b21385c26c926, 0x4d2c6dfc5ac42aed, + 0x53380d139d95b3df, 0x650a73548baf63de, 0x766a0abb3c77b2a8, 0x81c2c92e47edaee6, 0x92722c851482353b, + 0xa2bfe8a14cf10364, 0xa81a664bbc423001, 0xc24b8b70d0f89791, 0xc76c51a30654be30, 0xd192e819d6ef5218, + 0xd69906245565a910, 0xf40e35855771202a, 0x106aa07032bbd1b8, 0x19a4c116b8d2d0c8, 0x1e376c085141ab53, + 0x2748774cdf8eeb99, 0x34b0bcb5e19b48a8, 0x391c0cb3c5c95a63, 0x4ed8aa4ae3418acb, 0x5b9cca4f7763e373, + 0x682e6ff3d6b2b8a3, 0x748f82ee5defb2fc, 0x78a5636f43172f60, 0x84c87814a1f0ab72, 0x8cc702081a6439ec, + 0x90befffa23631e28, 0xa4506cebde82bde9, 0xbef9a3f7b2c67915, 0xc67178f2e372532b, 0xca273eceea26619c, + 0xd186b8c721c0c207, 0xeada7dd6cde0eb1e, 0xf57d4f7fee6ed178, 0x06f067aa72176fba, 0x0a637dc5a2c898a6, + 0x113f9804bef90dae, 0x1b710b35131c471b, 0x28db77f523047d84, 0x32caab7b40c72493, 0x3c9ebe0a15c9bebc, + 0x431d67c49c100d4c, 0x4cc5d4becb3e42b6, 0x597f299cfc657e2a, 0x5fcb6fab3ad6faec, 0x6c44198c4a475817, +} + +-- Not really needed, but more in tune with md5. In fact, as we use the mtxlib +-- helpers I might as well assume more. + +local tohex, toHEX + +if lpeg then local lpegpatterns = lpeg.patterns if lpegpatterns then + + local lpegmatch = lpeg.match + local bytestohex = lpegpatterns.bytestohex + local bytestoHEX = lpegpatterns.bytestoHEX + + tohex = function(s) return lpegmatch(bytestohex,s) end + toHEX = function(s) return lpegmatch(bytestoHEX,s) end + +end end + +if not tohex then + + local format, byte, gsub = string.format, string.byte, string.gsub + + tohex = function(s) return (gsub(s,".",function(c) return format("%02X",byte(c)) end)) end + toHEX = function(s) return (gsub(s,".",function(c) return format("%02X",byte(c)) end)) end + +end + +local prepare = { } + +if utilities and utilities.strings then + + local r = utilities.strings.newrepeater("\0") + + prepare[256] = function(str,len) + return str .. "\128" .. r[-(1 + 8 + len) % 64] .. packstring(">I8", 8 * len) + end + prepare[512] = function(str,len) + return str .. "\128" .. r[-(1 + 16 + len) % 128] .. packstring(">I16", 8 * len) + end + +else + + local rep = string.rep + + prepare[256] = function(str,len) + return str .. "\128" .. rep("\0",-(1 + 8 + len) % 64) .. packstring(">I8", 8 * len) + end + prepare[512] = function(str,len) + return str .. "\128" .. rep("\0",-(1 + 16 + len) % 128) .. packstring(">I16", 8 * len) + end + +end + +prepare[224] = prepare[256] +prepare[384] = prepare[512] + +local initialize = { + [224] = function(hash) + hash[1] = 0xc1059ed8 hash[2] = 0x367cd507 + hash[3] = 0x3070dd17 hash[4] = 0xf70e5939 + hash[5] = 0xffc00b31 hash[6] = 0x68581511 + hash[7] = 0x64f98fa7 hash[8] = 0xbefa4fa4 + return hash + end, + [256] = function(hash) + hash[1] = 0x6a09e667 hash[2] = 0xbb67ae85 + hash[3] = 0x3c6ef372 hash[4] = 0xa54ff53a + hash[5] = 0x510e527f hash[6] = 0x9b05688c + hash[7] = 0x1f83d9ab hash[8] = 0x5be0cd19 + return hash + end, + [384] = function(hash) + hash[1] = 0xcbbb9d5dc1059ed8 hash[2] = 0x629a292a367cd507 + hash[3] = 0x9159015a3070dd17 hash[4] = 0x152fecd8f70e5939 + hash[5] = 0x67332667ffc00b31 hash[6] = 0x8eb44a8768581511 + hash[7] = 0xdb0c2e0d64f98fa7 hash[8] = 0x47b5481dbefa4fa4 + return hash + end, + [512] = function(hash) + hash[1] = 0x6a09e667f3bcc908 hash[2] = 0xbb67ae8584caa73b + hash[3] = 0x3c6ef372fe94f82b hash[4] = 0xa54ff53a5f1d36f1 + hash[5] = 0x510e527fade682d1 hash[6] = 0x9b05688c2b3e6c1f + hash[7] = 0x1f83d9abfb41bd6b hash[8] = 0x5be0cd19137e2179 + return hash + end, +} + +local digest = { } +local list = { } -- some 5% faster + +digest[256] = function(str,i,hash) + + for i=1,#str,64 do + + -- local w = { unpackstring(">I4I4I4I4I4I4I4I4I4I4I4I4I4I4I4I4",str,i) } + + list[ 1], list[ 2], list[ 3], list[ 4], list[ 5], list[ 6], list[ 7], list[ 8], + list[ 9], list[10], list[11], list[12], list[13], list[14], list[15], list[16] = + unpackstring(">I4I4I4I4I4I4I4I4I4I4I4I4I4I4I4I4",str,i) + + for j=17,64 do + local v0 = list[j - 15] + local s0 = ((v0 >> 7) | (v0 << 25)) -- rrotate(v, 7) + ~ ((v0 >> 18) | (v0 << 14)) -- rrotate(v, 18) + ~ (v0 >> 3) + local v1 = list[j - 2] + local s1 = ((v1 >> 17) | (v1 << 15)) -- rrotate(v, 17) + ~ ((v1 >> 19) | (v1 << 13)) -- rrotate(v, 19) + ~ (v1 >> 10) + list[j] = (list[j - 16] + s0 + list[j - 7] + s1) + & 0xffffffff + end + + local a, b, c, d, e, f, g, h = -- unpack(hash) + hash[1], hash[2], hash[3], hash[4], hash[5], hash[6], hash[7], hash[8] + + for i=1,64 do + local s0 = ((a >> 2) | (a << 30)) -- rrotate(a, 2) + ~ ((a >> 13) | (a << 19)) -- rrotate(a, 13) + ~ ((a >> 22) | (a << 10)) -- rrotate(a, 22) + local maj = (a & b) ~ (a & c) ~ (b & c) + local t2 = s0 + maj + local s1 = ((e >> 6) | (e << 26)) -- rrotate(e, 6) + ~ ((e >> 11) | (e << 21)) -- rrotate(e, 11) + ~ ((e >> 25) | (e << 7)) -- rrotate(e, 25) + local ch = (e & f) + ~ (~e & g) + local t1 = h + s1 + ch + constants256[i] + list[i] + h = g + g = f + f = e + e = (d + t1) & 0xffffffff + d = c + c = b + b = a + a = (t1 + t2) & 0xffffffff + end + + hash[1] = (hash[1] + a) & 0xffffffff + hash[2] = (hash[2] + b) & 0xffffffff + hash[3] = (hash[3] + c) & 0xffffffff + hash[4] = (hash[4] + d) & 0xffffffff + hash[5] = (hash[5] + e) & 0xffffffff + hash[6] = (hash[6] + f) & 0xffffffff + hash[7] = (hash[7] + g) & 0xffffffff + hash[8] = (hash[8] + h) & 0xffffffff + + end +end + +digest[512] = function(str,i,hash) + + for i=1,#str,128 do + + -- local w = { unpackstring(">I4I4I4I4I4I4I4I4I4I4I4I4I4I4I4I4",str,i) } + + list[ 1], list[ 2], list[ 3], list[ 4], list[ 5], list[ 6], list[ 7], list[ 8], + list[ 9], list[10], list[11], list[12], list[13], list[14], list[15], list[16] = + unpackstring(">I8I8I8I8I8I8I8I8I8I8I8I8I8I8I8I8",str,i) + + for j=17,80 do + local v0 = list[j - 15] + local s0 = ((v0 >> 1) | (v0 << 63)) -- rrotate(v, 1) + ~ ((v0 >> 8) | (v0 << 56)) -- rrotate(v, 8) + ~ (v0 >> 7) + local v1 = list[j - 2] + local s1 = ((v1 >> 19) | (v1 << 45)) -- rrotate(v, 19) + ~ ((v1 >> 61) | (v1 << 3)) -- rrotate(v, 61) + ~ (v1 >> 6) + list[j] = (list[j - 16] + s0 + list[j - 7] + s1) + -- & 0xffffffffffffffff + end + + local a, b, c, d, e, f, g, h = -- unpack(hash) + hash[1], hash[2], hash[3], hash[4], hash[5], hash[6], hash[7], hash[8] + + for i=1,80 do + local s0 = ((a >> 28) | (a << 36)) -- rrotate(a, 28) + ~ ((a >> 34) | (a << 30)) -- rrotate(a, 34) + ~ ((a >> 39) | (a << 25)) -- rrotate(a, 39) + local maj = (a & b) ~ (a & c) ~ (b & c) + local t2 = s0 + maj + local s1 = ((e >> 14) | (e << 50)) -- rrotate(e, 14) + ~ ((e >> 18) | (e << 46)) -- rrotate(e, 18) + ~ ((e >> 41) | (e << 23)) -- rrotate(e, 41) + local ch = (e & f) + ~ (~e & g) + local t1 = h + s1 + ch + constants512[i] + list[i] + h = g + g = f + f = e + e = (d + t1) -- & 0xffffffffffffffff + d = c + c = b + b = a + a = (t1 + t2) -- & 0xffffffffffffffff + end + + hash[1] = (hash[1] + a) -- & 0xffffffffffffffff + hash[2] = (hash[2] + b) -- & 0xffffffffffffffff + hash[3] = (hash[3] + c) -- & 0xffffffffffffffff + hash[4] = (hash[4] + d) -- & 0xffffffffffffffff + hash[5] = (hash[5] + e) -- & 0xffffffffffffffff + hash[6] = (hash[6] + f) -- & 0xffffffffffffffff + hash[7] = (hash[7] + g) -- & 0xffffffffffffffff + hash[8] = (hash[8] + h) -- & 0xffffffffffffffff + + end +end + +digest[224] = digest[256] +digest[384] = digest[512] + +local finalize = { + [224] = function(hash,tohex) return tohex(packstring(">I4I4I4I4I4I4I4", unpack(hash))) end, -- # 56 + [256] = function(hash,tohex) return tohex(packstring(">I4I4I4I4I4I4I4I4",unpack(hash))) end, -- # 64 + [384] = function(hash,tohex) return tohex(packstring(">I8I8I8I8I8I8", unpack(hash))) end, -- # 96 + [512] = function(hash,tohex) return tohex(packstring(">I8I8I8I8I8I8I8I8",unpack(hash))) end, -- # 128 +} + +local hash = { } + +local function hashed(str,method,tohex) + local s = prepare[method](str,#str) + local h = initialize[method](hash) + digest[method](s,i,h) + return finalize[method](h,tohex) +end + +local sha2 = { + hash224 = function(str) return hashed(str,224,tohex) end, + hash256 = function(str) return hashed(str,256,tohex) end, + hash384 = function(str) return hashed(str,384,tohex) end, + hash512 = function(str) return hashed(str,512,tohex) end, + HASH224 = function(str) return hashed(str,224,toHEX) end, + HASH256 = function(str) return hashed(str,256,toHEX) end, + HASH384 = function(str) return hashed(str,384,toHEX) end, + HASH512 = function(str) return hashed(str,512,toHEX) end, +} + +-- local setmetatableindex = table.setmetatableindex +-- +-- if setmetatableindex then +-- sha2.hashed = setmetatableindex(function(t,k) +-- local v = digest[k] and function(str) return hashed(str,k,tohex) end or false +-- t[k] = v +-- return v +-- end) +-- sha2.HASHED = setmetatableindex(function(t,k) +-- local v = digest[k] and function(str) return hashed(str,k,toHEX) end or false +-- t[k] = v +-- return v +-- end) +-- end + +if utilities then + utilities.sha2 = sha2 +end + +return sha2 + diff --git a/tex/context/base/mkiv/util-sql-imp-ffi.lua b/tex/context/base/mkiv/util-sql-imp-ffi.lua new file mode 100644 index 000000000..07c4752cd --- /dev/null +++ b/tex/context/base/mkiv/util-sql-imp-ffi.lua @@ -0,0 +1,569 @@ +if not modules then modules = { } end modules ['util-sql-imp-ffi'] = { + version = 1.001, + comment = "companion to util-sql.lua", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +-- I looked at luajit-mysql to see how the ffi mapping was done but it didn't work +-- out that well (at least not on windows) but I got the picture. As I have somewhat +-- different demands I simplified / redid the ffi bti and just took the swiglib +-- variant and adapted that. + +local tonumber = tonumber +local concat = table.concat +local format, byte = string.format, string.byte +local lpegmatch = lpeg.match +local setmetatable, type = setmetatable, type +local sleep = os.sleep + +local trace_sql = false trackers.register("sql.trace", function(v) trace_sql = v end) +local trace_queries = false trackers.register("sql.queries",function(v) trace_queries = v end) +local report_state = logs.reporter("sql","ffi") + +if not utilities.sql then + require("util-sql") +end + +ffi.cdef [[ + + /* + This is as lean and mean as possible. After all we just need a connection and + a query. The rest is handled already in the Lua code elsewhere. + */ + + typedef void MYSQL_instance; + typedef void MYSQL_result; + typedef char **MYSQL_row; + typedef unsigned int MYSQL_offset; + + typedef struct st_mysql_field { + char *name; + char *org_name; + char *table; + char *org_table; + char *db; + char *catalog; + char *def; + unsigned long length; + unsigned long max_length; + unsigned int name_length; + unsigned int org_name_length; + unsigned int table_length; + unsigned int org_table_length; + unsigned int db_length; + unsigned int catalog_length; + unsigned int def_length; + unsigned int flags; + unsigned int decimals; + unsigned int charsetnr; + int type; + void *extension; + } MYSQL_field; + + void free(void*ptr); + void * malloc(size_t size); + + MYSQL_instance * mysql_init ( + MYSQL_instance *mysql + ); + + MYSQL_instance * mysql_real_connect ( + MYSQL_instance *mysql, + const char *host, + const char *user, + const char *passwd, + const char *db, + unsigned int port, + const char *unix_socket, + unsigned long clientflag + ); + + unsigned int mysql_errno ( + MYSQL_instance *mysql + ); + + const char *mysql_error ( + MYSQL_instance *mysql + ); + + /* int mysql_query ( + MYSQL_instance *mysql, + const char *q + ); */ + + int mysql_real_query ( + MYSQL_instance *mysql, + const char *q, + unsigned long length + ); + + MYSQL_result * mysql_store_result ( + MYSQL_instance *mysql + ); + + void mysql_free_result ( + MYSQL_result *result + ); + + unsigned long long mysql_num_rows ( + MYSQL_result *res + ); + + MYSQL_row mysql_fetch_row ( + MYSQL_result *result + ); + + unsigned int mysql_num_fields ( + MYSQL_result *res + ); + + /* MYSQL_field *mysql_fetch_field ( + MYSQL_result *result + ); */ + + MYSQL_field * mysql_fetch_fields ( + MYSQL_result *res + ); + + MYSQL_offset mysql_field_seek( + MYSQL_result *result, + MYSQL_offset offset + ); + + void mysql_close( + MYSQL_instance *sock + ); + + /* unsigned long * mysql_fetch_lengths( + MYSQL_result *result + ); */ + +]] + +local sql = utilities.sql +----- mysql = ffi.load(os.name == "windows" and "libmysql" or "libmysqlclient") +----- mysql = ffilib(os.name == "windows" and "libmysql" or "libmysqlclient") +local mysql = ffilib(os.name == "windows" and "libmysql" or "libmysql") + +if not mysql then + report_state("unable to load library") +end + +local nofretries = 5 +local retrydelay = 1 + +local cache = { } +local helpers = sql.helpers +local methods = sql.methods +local validspecification = helpers.validspecification +local querysplitter = helpers.querysplitter +local dataprepared = helpers.preparetemplate +local serialize = sql.serialize +local deserialize = sql.deserialize + +local mysql_initialize = mysql.mysql_init + +local mysql_open_connection = mysql.mysql_real_connect +local mysql_execute_query = mysql.mysql_real_query +local mysql_close_connection = mysql.mysql_close + +local mysql_field_seek = mysql.mysql_field_seek +local mysql_num_fields = mysql.mysql_num_fields +local mysql_fetch_fields = mysql.mysql_fetch_fields +----- mysql_fetch_field = mysql.mysql_fetch_field +local mysql_num_rows = mysql.mysql_num_rows +local mysql_fetch_row = mysql.mysql_fetch_row +----- mysql_fetch_lengths = mysql.mysql_fetch_lengths +local mysql_init = mysql.mysql_init +local mysql_store_result = mysql.mysql_store_result +local mysql_free_result = mysql.mysql_free_result + +local mysql_error_message = mysql.mysql_error + +local NULL = ffi.cast("MYSQL_result *",0) + +local ffi_tostring = ffi.string +local ffi_gc = ffi.gc + +----- mysqldata = ffi.cast("MYSQL_instance*",mysql.malloc(1024*1024)) +local instance = mysql.mysql_init(nil) -- (mysqldata) + +local mysql_constant_false = false +local mysql_constant_true = true + +local function finish(t) + local r = t._result_ + if r then + ffi_gc(r,mysql_free_result) + end +end + +local function getcolnames(t) + return t.names +end + +local function getcoltypes(t) + return t.types +end + +local function numrows(t) + return tonumber(t.nofrows) +end + +local function list(t) + local result = t._result_ + if result then + local row = mysql_fetch_row(result) + -- local len = mysql_fetch_lengths(result) + local result = { } + for i=1,t.noffields do + result[i] = ffi_tostring(row[i-1]) + end + return result + end +end + +local function hash(t) + local result = t._result_ + local fields = t.names + if result then + local row = mysql_fetch_row(result) + -- local len = mysql_fetch_lengths(result) + local result = { } + for i=1,t.noffields do + result[fields[i]] = ffi_tostring(row[i-1]) + end + return result + end +end + +local function wholelist(t) + return fetch_all_rows(t._result_) +end + +local mt = { __index = { + -- regular + finish = finish, + list = list, + hash = hash, + wholelist = wholelist, + -- compatibility + numrows = numrows, + getcolnames = getcolnames, + getcoltypes = getcoltypes, + -- fallback + _result_ = nil, + names = { }, + types = { }, + noffields = 0, + nofrows = 0, + } +} + +local nt = setmetatable({},mt) + +-- session + +local function close(t) + mysql_close_connection(t._connection_) +end + +local function execute(t,query) + if query and query ~= "" then + local connection = t._connection_ + local result = mysql_execute_query(connection,query,#query) + if result == 0 then + local result = mysql_store_result(connection) + if result ~= NULL then + mysql_field_seek(result,0) + local nofrows = tonumber(mysql_num_rows(result) or 0) + local noffields = tonumber(mysql_num_fields(result)) + local names = { } + local types = { } + local fields = mysql_fetch_fields(result) + for i=1,noffields do + local field = fields[i-1] + names[i] = ffi_tostring(field.name) + types[i] = tonumber(field.type) -- todo + end + local t = { + _result_ = result, + names = names, + types = types, + noffields = noffields, + nofrows = nofrows, + } + return setmetatable(t,mt) + else + return nt + end + end + end + return false +end + +local mt = { __index = { + close = close, + execute = execute, + } +} + +local function open(t,database,username,password,host,port) + local connection = mysql_open_connection( + t._session_, + host or "localhost", + username or "", + password or "", + database or "", + port or 0, + NULL, + 0 + ) + if connection ~= NULL then + local t = { + _connection_ = connection, + } + return setmetatable(t,mt) + end +end + +local function message(t) + return mysql_error_message(t._session_) +end + +local function close(t) + -- dummy, as we have a global session +end + +local mt = { + __index = { + connect = open, + close = close, + message = message, + } +} + +local function initialize() + local session = { + _session_ = mysql_initialize(instance) -- maybe share, single thread anyway + } + return setmetatable(session,mt) +end + +-- -- -- -- + +local function connect(session,specification) + return session:connect( + specification.database or "", + specification.username or "", + specification.password or "", + specification.host or "", + specification.port + ) +end + +local function error_in_connection(specification,action) + report_state("error in connection: [%s] %s@%s to %s:%s", + action or "unknown", + specification.database or "no database", + specification.username or "no username", + specification.host or "no host", + specification.port or "no port" + ) +end + +local function datafetched(specification,query,converter) + if not query or query == "" then + report_state("no valid query") + return { }, { } + end + local id = specification.id + local session, connection + if id then + local c = cache[id] + if c then + session = c.session + connection = c.connection + end + if not connection then + session = initialize() + connection = connect(session,specification) + if not connection then + for i=1,nofretries do + sleep(retrydelay) + report_state("retrying to connect: [%s.%s] %s@%s to %s:%s", + id,i, + specification.database or "no database", + specification.username or "no username", + specification.host or "no host", + specification.port or "no port" + ) + connection = connect(session,specification) + if connection then + break + end + end + end + if connection then + cache[id] = { session = session, connection = connection } + end + end + else + session = initialize() + connection = connect(session,specification) + if not connection then + for i=1,nofretries do + sleep(retrydelay) + report_state("retrying to connect: [%s] %s@%s to %s:%s", + i, + specification.database or "no database", + specification.username or "no username", + specification.host or "no host", + specification.port or "no port" + ) + connection = connect(session,specification) + if connection then + break + end + end + end + end + if not connection then + report_state("error in connection: %s@%s to %s:%s", + specification.database or "no database", + specification.username or "no username", + specification.host or "no host", + specification.port or "no port" + ) + return { }, { } + end + query = lpegmatch(querysplitter,query) + local result, message, okay + for i=1,#query do + local q = query[i] + local r, m = connection:execute(q) + if m then + report_state("error in query, stage: %s",string.collapsespaces(q or "?")) + message = message and format("%s\n%s",message,m) or m + end + if type(r) == "table" then + result = r + okay = true + elseif not m then + okay = true + end + end + local data, keys + if result then + if converter then + data = converter.ffi(result) + else + keys = result.names + data = { } + for i=1,result.nofrows do + data[i] = result:hash() + end + end + result:finish() -- result:close() + elseif message then + report_state("message %s",message) + end + if not keys then + keys = { } + end + if not data then + data = { } + end + if not id then + connection:close() + session:close() + end + return data, keys +end + +local function execute(specification) + if trace_sql then + report_state("executing library") + end + if not validspecification(specification) then + report_state("error in specification") + return + end + local query = dataprepared(specification) + if not query then + report_state("error in preparation") + return + end + local data, keys = datafetched(specification,query,specification.converter) + if not data then + report_state("error in fetching") + return + end + local one = data[1] + if one then + setmetatable(data,{ __index = one } ) + end + return data, keys +end + +local wraptemplate = [[ +----- mysql = ffi.load(os.name == "windows" and "libmysql" or "libmysqlclient") +local mysql = ffi.load(os.name == "windows" and "libmysql" or "libmysql") + +local mysql_fetch_row = mysql.mysql_fetch_row +local ffi_tostring = ffi.string + +local converters = utilities.sql.converters +local deserialize = utilities.sql.deserialize + +local tostring = tostring +local tonumber = tonumber +local booleanstring = string.booleanstring + +local NULL = ffi.cast("MYSQL_result *",0) + +%s + +return function(result) + if not result then + return { } + end + local nofrows = result.nofrows or 0 + if nofrows == 0 then + return { } + end + local noffields = result.noffields or 0 + local _result_ = result._result_ + local target = { } -- no %s needed here + for i=1,nofrows do + local cells = { } + local row = mysql_fetch_row(_result_) + for j=1,noffields do + local s = row[j-1] + if s == NULL then + cells[j] = "" + else + cells[j] = ffi_tostring(s) + end + end + target[%s] = { + %s + } + end + result:finish() -- result:close() + return target +end +]] + +local celltemplate = "cells[%s]" + +methods.ffi = { + runner = function() end, -- never called + execute = execute, + initialize = initialize, -- returns session + usesfiles = false, + wraptemplate = wraptemplate, + celltemplate = celltemplate, +} diff --git a/tex/context/base/mkiv/util-sql-imp-library.lua b/tex/context/base/mkiv/util-sql-imp-library.lua index e16853612..a2b692e45 100644 --- a/tex/context/base/mkiv/util-sql-imp-library.lua +++ b/tex/context/base/mkiv/util-sql-imp-library.lua @@ -12,7 +12,7 @@ if not modules then modules = { } end modules ['util-sql-imp-library'] = { -- we couldn't figure it out (some issue with adapting the table that is passes as first -- argument in the fetch routine. Apart from this it looks like the mysql binding has some -- efficiency issues (like creating a keys and types table for each row) but that could be --- optimized. Anyhow, fecthing results can be done as follows: +-- optimized. Anyhow, fetching results can be done as follows: -- local function collect_1(r) -- local t = { } diff --git a/tex/context/base/mkiv/util-sql-imp-sqlite.lua b/tex/context/base/mkiv/util-sql-imp-sqlite.lua index 1a960c1c3..04d5ced3a 100644 --- a/tex/context/base/mkiv/util-sql-imp-sqlite.lua +++ b/tex/context/base/mkiv/util-sql-imp-sqlite.lua @@ -6,16 +6,9 @@ if not modules then modules = { } end modules ['util-sql-imp-sqlite'] = { license = "see context related readme files" } -local next = next +local next, tonumber = next, tonumber -local sql = require("util-sql") ------ sql = utilities.sql -local sqlite = require("swiglib.sqlite.core") -local swighelpers = require("swiglib.helpers.core") - --- sql.sqlite = sqlite -- maybe in the module itself - --- inspect(table.sortedkeys(sqlite)) +local sql = utilities.sql or require("util-sql") local trace_sql = false trackers.register("sql.trace", function(v) trace_sql = v end) local trace_queries = false trackers.register("sql.queries",function(v) trace_queries = v end) @@ -25,26 +18,95 @@ local helpers = sql.helpers local methods = sql.methods local validspecification = helpers.validspecification local preparetemplate = helpers.preparetemplate -local splitdata = helpers.splitdata -local serialize = sql.serialize -local deserialize = sql.deserialize -local getserver = sql.getserver local setmetatable = setmetatable local formatters = string.formatters -local get_list_item = sqlite.char_p_array_getitem -local is_okay = sqlite.SQLITE_OK -local execute_query = sqlite.sqlite3_exec_lua_callback -local error_message = sqlite.sqlite3_errmsg +----- sqlite = require("swiglib.sqlite.core") +----- swighelpers = require("swiglib.helpers.core") +----- +----- get_list_item = sqlite.char_p_array_getitem +----- is_okay = sqlite.SQLITE_OK +----- execute_query = sqlite.sqlite3_exec_lua_callback +----- error_message = sqlite.sqlite3_errmsg +----- +----- new_db = sqlite.new_sqlite3_p_array +----- open_db = sqlite.sqlite3_open +----- get_db = sqlite.sqlite3_p_array_getitem +----- close_db = sqlite.sqlite3_close +----- dispose_db = sqlite.delete_sqlite3_p_array + +local ffi = require("ffi") + +ffi.cdef [[ + + typedef struct sqlite3 sqlite3; + + int sqlite3_initialize ( + void + ) ; + + int sqlite3_open ( + const char *filename, + sqlite3 **ppDb + ) ; + + int sqlite3_close ( + sqlite3 * + ) ; + + int sqlite3_exec ( + sqlite3*, + const char *sql, + int (*callback)(void*,int,char**,char**), + void *, + char **errmsg + ) ; + + const char *sqlite3_errmsg ( + sqlite3* + ); +]] + +local ffi_tostring = ffi.string + +----- sqlite = ffi.load("sqlite3") +local sqlite = ffilib("sqlite3") + +sqlite.sqlite3_initialize(); + +local c_errmsg = sqlite.sqlite3_errmsg +local c_open = sqlite.sqlite3_open +local c_close = sqlite.sqlite3_close +local c_exec = sqlite.sqlite3_exec + +local is_okay = 0 +local open_db = c_open +local close_db = c_close +local execute_query = c_exec + +local function error_message(db) + return ffi_tostring(c_errmsg(db)) +end -local new_db = sqlite.new_sqlite3_p_array -local open_db = sqlite.sqlite3_open -local get_db = sqlite.sqlite3_p_array_getitem -local close_db = sqlite.sqlite3_close -local dispose_db = sqlite.delete_sqlite3_p_array +local function new_db(n) + return ffi.new("sqlite3*["..n.."]") +end -local cache = { } +local function dispose_db(db) +end + +local function get_db(db,n) + return db[n] +end + +-- local function execute_query(dbh,query,callback) +-- local c = ffi.cast("int (*callback)(void*,int,char**,char**)",callback) +-- c_exec(dbh,query,c,nil,nil) +-- c:free() +-- end + +local cache = { } setmetatable(cache, { __gc = function(t) @@ -135,30 +197,31 @@ local function execute(specification) query = preamble .. query -- only needed in open end if converter then - converter = converter.sqlite + local convert = converter.sqlite + local column = { } callback = function(data,nofcolumns,values,fields) - local column = { } - for i=0,nofcolumns-1 do - column[i+1] = get_list_item(values,i) + for i=1,nofcolumns do + -- column[i] = get_list_item(values,i-1) + column[i] = ffi_tostring(values[i-1]) end - nofrows = nofrows + 1 - result[nofrows] = converter(column) + nofrows = nofrows + 1 + result[nofrows] = convert(column) return is_okay end - -- - -- callback = converter.sqlite else + local column = { } callback = function(data,nofcolumns,values,fields) - local column = { } for i=0,nofcolumns-1 do local field if keysdone then field = keys[i+1] else - field = get_list_item(fields,i) + -- field = get_list_item(fields,i) + field = ffi_tostring(fields[i]) keys[i+1] = field end - column[field] = get_list_item(values,i) + -- column[field] = get_list_item(values,i) + column[field] = ffi_tostring(values[i]) end nofrows = nofrows + 1 keysdone = true @@ -201,34 +264,6 @@ end local celltemplate = "cells[%s]" --- todo: how to deal with result ... pass via temp global .. bah .. or --- also pass the execute here ... not now --- --- local wraptemplate = [[ --- local converters = utilities.sql.converters --- local deserialize = utilities.sql.deserialize --- --- local tostring = tostring --- local tonumber = tonumber --- local booleanstring = string.booleanstring --- --- local get_list_item = utilities.sql.sqlite.char_p_array_getitem --- local is_okay = utilities.sql.sqlite.SQLITE_OK --- --- %s --- --- return function(data,nofcolumns,values,fields) --- -- no %s (data) needed --- -- no %s (i) needed --- local cells = { } --- for i=0,nofcolumns-1 do --- cells[i+1] = get_list_item(values,i) --- end --- result[#result+1] = { %s } --- return is_okay --- end --- ]] - methods.sqlite = { execute = execute, usesfiles = false, diff --git a/tex/context/base/mkiv/util-sql-loggers.lua b/tex/context/base/mkiv/util-sql-loggers.lua index 4473f8971..b69e397d2 100644 --- a/tex/context/base/mkiv/util-sql-loggers.lua +++ b/tex/context/base/mkiv/util-sql-loggers.lua @@ -53,16 +53,15 @@ loggers.totype = totype loggers.fromtype = fromtype local template = [[ - CREATE TABLE IF NOT EXISTS %basename% ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `time` int(11) NOT NULL, - `type` int(11) NOT NULL, - `action` varchar(15) NOT NULL, - `data` longtext, - PRIMARY KEY (`id`), - UNIQUE KEY `id_unique_key` (`id`) - ) - DEFAULT CHARSET = utf8 ; +CREATE TABLE IF NOT EXISTS %basename% ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `time` int(11) NOT NULL, + `type` int(11) NOT NULL, + `action` varchar(15) NOT NULL, + `data` longtext, + PRIMARY KEY (`id`), + UNIQUE KEY `id_unique_key` (`id`) +) DEFAULT CHARSET = utf8 ; ]] local sqlite_template = [[ @@ -78,6 +77,7 @@ local sqlite_template = [[ function loggers.createdb(presets,datatable) local db = checkeddb(presets,datatable) + db.execute { template = db.usedmethod == "sqlite" and sqlite_template or template, variables = { diff --git a/tex/context/base/mkiv/util-sql-logins.lua b/tex/context/base/mkiv/util-sql-logins.lua new file mode 100644 index 000000000..dcb48fb35 --- /dev/null +++ b/tex/context/base/mkiv/util-sql-logins.lua @@ -0,0 +1,305 @@ +if not modules then modules = { } end modules ['util-sql-logins'] = { + version = 1.001, + comment = "companion to lmx-*", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +if not utilities.sql then require("util-sql") end + +local sql = utilities.sql +local sqlexecute = sql.execute +local sqlmakeconverter = sql.makeconverter + +local format = string.format +local ostime = os.time +local formatter = string.formatter + +local trace_logins = true +local report_logins = logs.reporter("sql","logins") + +local logins = sql.logins or { } +sql.logins = logins + +logins.maxnoflogins = logins.maxnoflogins or 10 +logins.cooldowntime = logins.cooldowntime or 10 * 60 +logins.purgetime = logins.purgetime or 1 * 60 * 60 +logins.autopurge = true + +local function checkeddb(presets,datatable) + return sql.usedatabase(presets,datatable or presets.datatable or "logins") +end + +logins.usedb = checkeddb + +local template = [[ + CREATE TABLE IF NOT EXISTS %basename% ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(50) NOT NULL, + `time` int(11) DEFAULT '0', + `n` int(11) DEFAULT '0', + `state` int(11) DEFAULT '0', + + PRIMARY KEY (`id`), + UNIQUE KEY `id_unique_index` (`id`), + UNIQUE KEY `name_unique_key` (`name`) + ) DEFAULT CHARSET = utf8 ; +]] + +local sqlite_template = [[ + CREATE TABLE IF NOT EXISTS %basename% ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `name` TEXT NOT NULL, + `time` INTEGER DEFAULT '0', + `n` INTEGER DEFAULT '0', + `state` INTEGER DEFAULT '0' + ) ; +]] + +function logins.createdb(presets,datatable) + + local db = checkeddb(presets,datatable) + + local data, keys = db.execute { + template = db.usedmethod == "sqlite" and sqlite_template or template, + variables = { + basename = db.basename, + }, + } + + report_logins("datatable %a created in %a",db.name,db.base) + + return db + +end + +local template =[[ + DROP TABLE IF EXISTS %basename% ; +]] + +function logins.deletedb(presets,datatable) + + local db = checkeddb(presets,datatable) + + local data, keys = db.execute { + template = template, + variables = { + basename = db.basename, + }, + } + + report_logins("datatable %a removed in %a",db.name,db.base) + +end + +local states = { + [0] = "unset", + [1] = "known", + [2] = "unknown", +} + +local converter_fetch, fields_fetch = sqlmakeconverter { + { name = "id", type = "number" }, + { name = "name", type = "string" }, + { name = "time", type = "number" }, + { name = "n", type = "number" }, + { name = "state", type = "number" }, -- faster than mapping +} + +local template_fetch = format( [[ + SELECT + %s + FROM + `logins` + WHERE + `name` = '%%[name]%%' +]], fields_fetch ) + +local template_insert = [[ + INSERT INTO `logins` + ( `name`, `state`, `time`, `n`) + VALUES + ('%[name]%', %state%, %time%, %n%) +]] + +local template_update = [[ + UPDATE + `logins` + SET + `state` = %state%, + `time` = %time%, + `n` = %n% + WHERE + `name` = '%[name]%' +]] + +local template_delete = [[ + DELETE FROM + `logins` + WHERE + `name` = '%[name]%' +]] + +local template_purge = [[ + DELETE FROM + `logins` + WHERE + `time` < '%time%' +]] + +-- todo: auto cleanup (when new attempt) + +local cache = { } setmetatable(cache, { __mode = 'v' }) + +-- local function usercreate(presets) +-- sqlexecute { +-- template = template_create, +-- presets = presets, +-- } +-- end + +function logins.userunknown(db,name) + local d = { + name = name, + state = 2, + time = ostime(), + n = 0, + } + db.execute { + template = template_update, + variables = d, + } + cache[name] = d + report_logins("user %a is registered as unknown",name) +end + +function logins.userknown(db,name) + local d = { + name = name, + state = 1, + time = ostime(), + n = 0, + } + db.execute { + template = template_update, + variables = d, + } + cache[name] = d + report_logins("user %a is registered as known",name) +end + +function logins.userreset(db,name) + db.execute { + template = template_delete, + } + cache[name] = nil + report_logins("user %a is reset",name) +end + +local function userpurge(db,delay) + db.execute { + template = template_purge, + variables = { + time = ostime() - (delay or logins.purgetime), + } + } + cache = { } + report_logins("users are purged") +end + +logins.userpurge = userpurge + +local function verdict(okay,...) + if not trace_logins then + -- no tracing + elseif okay then + report_logins("%s, granted",formatter(...)) + else + report_logins("%s, blocked",formatter(...)) + end + return okay +end + +local lasttime = 0 + +function logins.userpermitted(db,name) + local currenttime = ostime() + if logins.autopurge and (lasttime == 0 or (currenttime - lasttime > logins.purgetime)) then + report_logins("automatic purge triggered") + userpurge(db) + lasttime = currenttime + end + local data = cache[name] + if data then + report_logins("user %a is cached",name) + else + report_logins("user %a is fetched",name) + data = db.execute { + template = template_fetch, + converter = converter_fetch, + variables = { + name = name, + } + } + end + if not data or not data.name then + local d = { + name = name, + state = 0, + time = currenttime, + n = 1, + } + db.execute { + template = template_insert, + variables = d, + } + cache[name] = d + return verdict(true,"creating new entry for %a",name) + end + cache[name] = data[1] + local state = data.state + if state == 2 then -- unknown + return verdict(false,"user %a has state %a",name,states[state]) + end + local n = data.n + local m = logins.maxnoflogins + if n > m then + local deltatime = currenttime - data.time + local cooldowntime = logins.cooldowntime + if deltatime < cooldowntime then + return verdict(false,"user %a is blocked for %s seconds out of %s",name,cooldowntime-deltatime,cooldowntime) + else + n = 0 + end + end + if n == 0 then + local d = { + name = name, + state = 0, + time = currenttime, + n = 1, + } + db.execute { + template = template_update, + variables = d, + } + cache[name] = d + return verdict(true,"user %a gets a first chance",name) + else + local d = { + name = name, + state = 0, + time = currenttime, + n = n + 1, + } + db.execute { + template = template_update, + variables = d, + } + cache[name] = d + return verdict(true,"user %a gets a new chance, %s attempts out of %s done",name,n,m) + end +end + +return logins diff --git a/tex/context/base/mkiv/util-sql-sessions.lua b/tex/context/base/mkiv/util-sql-sessions.lua index 76bb91962..17cf66142 100644 --- a/tex/context/base/mkiv/util-sql-sessions.lua +++ b/tex/context/base/mkiv/util-sql-sessions.lua @@ -48,8 +48,16 @@ local template =[[ `created` int(11) NOT NULL, `accessed` int(11) NOT NULL, UNIQUE KEY `token_unique_key` (`token`) - ) - DEFAULT CHARSET = utf8 ; + ) DEFAULT CHARSET = utf8 ; +]] + +local sqlite_template =[[ + CREATE TABLE IF NOT EXISTS %basename% ( + `token` TEXT NOT NULL, + `data` TEXT NOT NULL, + `created` INTEGER DEFAULT '0', + `accessed` INTEGER DEFAULT '0' + ) ; ]] function sessions.createdb(presets,datatable) @@ -57,7 +65,7 @@ function sessions.createdb(presets,datatable) local db = checkeddb(presets,datatable) db.execute { - template = template, + template = db.usedmethod == "sqlite" and sqlite_template or template, variables = { basename = db.basename, }, diff --git a/tex/context/base/mkiv/util-sql-tickets.lua b/tex/context/base/mkiv/util-sql-tickets.lua index f392c0b91..3258fb186 100644 --- a/tex/context/base/mkiv/util-sql-tickets.lua +++ b/tex/context/base/mkiv/util-sql-tickets.lua @@ -18,6 +18,8 @@ local ostime, uuid, osfulltime = os.time, os.uuid, os.fulltime local random = math.random local concat = table.concat +if not utilities.sql then require("util-sql") end + local sql = utilities.sql local tickets = { } sql.tickets = tickets @@ -27,7 +29,6 @@ local report = logs.reporter("sql","tickets") local serialize = sql.serialize local deserialize = sql.deserialize -local execute = sql.execute tickets.newtoken = sql.tokens.new @@ -66,7 +67,7 @@ end tickets.usedb = checkeddb -local template =[[ +local template = [[ CREATE TABLE IF NOT EXISTS %basename% ( `id` int(11) NOT NULL AUTO_INCREMENT, `token` varchar(50) NOT NULL, @@ -82,14 +83,30 @@ local template =[[ PRIMARY KEY (`id`), UNIQUE INDEX `id_unique_index` (`id` ASC), KEY `token_unique_key` (`token`) - ) - DEFAULT CHARSET = utf8 ; + ) DEFAULT CHARSET = utf8 ; +]] + +local sqlite_template = [[ + CREATE TABLE IF NOT EXISTS %basename% ( + `id` TEXT NOT NULL AUTO_INCREMENT, + `token` TEXT NOT NULL, + `subtoken` INTEGER DEFAULT '0', + `created` INTEGER DEFAULT '0', + `accessed` INTEGER DEFAULT '0', + `category` INTEGER DEFAULT '0', + `status` INTEGER DEFAULT '0', + `usertoken` TEXT NOT NULL, + `data` TEXT NOT NULL, + `comment` TEXT NOT NULL + ) ; ]] function tickets.createdb(presets,datatable) + local db = checkeddb(presets,datatable) + local data, keys = db.execute { - template = template, + template = db.usedmethod == "sqlite" and sqlite_template or template, variables = { basename = db.basename, }, diff --git a/tex/context/base/mkiv/util-sql-users.lua b/tex/context/base/mkiv/util-sql-users.lua index a1f433946..7204fb310 100644 --- a/tex/context/base/mkiv/util-sql-users.lua +++ b/tex/context/base/mkiv/util-sql-users.lua @@ -10,47 +10,77 @@ if not modules then modules = { } end modules ['util-sql-users'] = { -- because it's easier to dirtribute this way. Eventually it will be documented -- and the related scripts will show up as well. --- local sql = sql or (utilities and utilities.sql) or require("util-sql") --- local md5 = md5 or require("md5") - local sql = utilities.sql -local format, upper, find, gsub, topattern = string.format, string.upper, string.find, string.gsub, string.topattern -local sumhexa = md5.sumhexa +local find, topattern = string.find, string.topattern +local sumHEXA = md5.sumHEXA local toboolean = string.toboolean +local lpegmatch = lpeg.match -local sql = utilities.sql +local sql = require("util-sql") -- utilities.sql local users = { } sql.users = users local trace_sql = false trackers.register("sql.users.trace", function(v) trace_sql = v end) local report = logs.reporter("sql","users") -local function encryptpassword(str) +local split = lpeg.splitat(":") +local valid = nil +local hash = function(s) return "MD5:" .. sumHEXA(s) end + +if LUAVERSION >= 5.3 then + + local sha2 = require("util-sha") + + local HASH224 = sha2.HASH224 + local HASH256 = sha2.HASH256 + local HASH384 = sha2.HASH384 + local HASH512 = sha2.HASH512 + + valid = { + MD5 = hash, + SHA224 = function(s) return "SHA224:" .. HASH224(s) end, + SHA256 = function(s) return "SHA256:" .. HASH256(s) end, + SHA384 = function(s) return "SHA384:" .. HASH384(s) end, + SHA512 = function(s) return "SHA512:" .. HASH512(s) end, + } + +else + + valid = { + MD5 = hash, + SHA224 = hash, + SHA256 = hash, + SHA384 = hash, + SHA512 = hash, + } + +end + +local function encryptpassword(str,how) if not str or str == "" then return "" - elseif find(str,"^MD5:") then + end + local prefix, rest = lpegmatch(split,str) + if prefix and rest and valid[prefix] then return str - else - return upper(format("MD5:%s",sumhexa(str))) end + return (how and valid[how] or valid.MD5)(str) end local function cleanuppassword(str) - return (gsub(str,"^MD5:","")) + local prefix, rest = lpegmatch(split,str) + if prefix and rest and valid[prefix] then + return rest + end + return str end local function samepasswords(one,two) if not one or not two then return false end - if not find(one,"^MD5:") then - one = encryptpassword(one) - end - if not find(two,"^MD5:") then - two = encryptpassword(two) - end - return one == two + return encryptpassword(one) == encryptpassword(two) end local function validaddress(address,addresses) @@ -64,7 +94,6 @@ local function validaddress(address,addresses) end end - users.encryptpassword = encryptpassword users.cleanuppassword = cleanuppassword users.samepasswords = samepasswords @@ -103,13 +132,23 @@ users.groupnumbers = groupnumbers -- password 'test': -- -- INSERT insert into users (`name`,`password`,`group`,`enabled`) values ('...','MD5:098F6BCD4621D373CADE4E832627B4F6',1,1) ; +-- +-- MD5:098F6BCD4621D373CADE4E832627B4F6 +-- SHA224:90A3ED9E32B2AAF4C61C410EB925426119E1A9DC53D4286ADE99A809 +-- SHA256:9F86D081884C7D659A2FEAA0C55AD015A3BF4F1B2B0B822CD15D6C15B0F00A08 +-- SHA384:768412320F7B0AA5812FCE428DC4706B3CAE50E02A64CAA16A782249BFE8EFC4B7EF1CCB126255D196047DFEDF17A0A9 +-- SHA512:EE26B0DD4AF7E749AA1A8EE3C10AE9923F618980772E473F8819A5D4940E0DB27AC185F8A0E1D5F84F88BC887FD67B143732C304CC5FA9AD8E6F57F50028A8FF -local template =[[ +-- old values (a name can have utf and a password a long hash): +-- +-- name 80, fullname 80, password 50 + +local template = [[ CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, - `name` varchar(80) NOT NULL, - `fullname` varchar(80) NOT NULL, - `password` varchar(50) DEFAULT NULL, + `name` varchar(100) NOT NULL, + `fullname` varchar(100) NOT NULL, + `password` varchar(200) DEFAULT NULL, `group` int(11) NOT NULL, `enabled` int(11) DEFAULT '1', `email` varchar(80) DEFAULT NULL, @@ -121,6 +160,21 @@ local template =[[ ) DEFAULT CHARSET = utf8 ; ]] +local sqlite_template = [[ + CREATE TABLE `users` ( + `id` INTEGER PRIMARY KEY AUTOINCREMENT, + `name` TEXT NOT NULL, + `fullname` TEXT NOT NULL, + `password` TEXT DEFAULT NULL, + `group` INTEGER NOT NULL, + `enabled` INTEGER DEFAULT '1', + `email` TEXT DEFAULT NULL, + `address` TEXT DEFAULT NULL, + `theme` TEXT DEFAULT NULL, + `data` TEXT DEFAULT NULL + ) ; +]] + local converter, fields = sql.makeconverter { { name = "id", type = "number" }, { name = "name", type = "string" }, @@ -139,7 +193,7 @@ function users.createdb(presets,datatable) local db = checkeddb(presets,datatable) db.execute { - template = template, + template = db.usedmethod == "sqlite" and sqlite_template or template, variables = { basename = db.basename, }, diff --git a/tex/context/base/mkiv/util-sql.lua b/tex/context/base/mkiv/util-sql.lua index 09056c048..d01a2267c 100644 --- a/tex/context/base/mkiv/util-sql.lua +++ b/tex/context/base/mkiv/util-sql.lua @@ -103,17 +103,21 @@ local defaults = { __index = variables = { }, username = "default", password = "default", - host = "localhost", + host = "localhost", -- 127.0.0.1 is sometimes more reliable port = 3306, database = "default", }, } setmetatableindex(sql.methods,function(t,k) - report_state("start loading method %a",k) - require("util-sql-imp-"..k) - report_state("loading method %a done",k) - return rawget(t,k) + if type(k) == "string" then + report_state("start loading method %a",k) + require("util-sql-imp-"..k) + report_state("loading method %a done",k) + return rawget(t,k) + else + report_state("invalid method %a",tostring(k)) + end end) -- converters @@ -285,7 +289,13 @@ local currentmethod local currentserver local function firstexecute(...) - local execute = methods[currentmethod].execute + local method = methods[currentmethod] + if not method then + report_state("invalid sql method") + sql.execute = function() end + return nil + end + local execute = method.execute sql.execute = execute return execute(...) end @@ -326,6 +336,10 @@ function sql.usedatabase(presets,datatable) if not method then usedmethod = sql.methods.client method = usedmethod and sqlmethods[usedmethod] + if not method then + report_state("invalid method") + return + end end local base = presets.database or "test" local basename = format("`%s`.`%s`",base,name) diff --git a/tex/context/base/mkiv/util-sta.lua b/tex/context/base/mkiv/util-sta.lua index 27ab5a624..d140cacdc 100644 --- a/tex/context/base/mkiv/util-sta.lua +++ b/tex/context/base/mkiv/util-sta.lua @@ -154,7 +154,7 @@ function stacker.new(name) local function resolve_step(ti) -- keep track of changes outside function ! -- todo: optimize for n=1 etc local result = nil - local noftop = #top + local noftop = top and #top or 0 if ti > 0 then local current = list[ti] if current then @@ -289,24 +289,24 @@ end -- -- local concat = table.concat -- --- local pdfliteral = nodes.pool.pdfliteral +-- local pdfpageliteral = nodes.pool.pdfpageliteral -- -- function demostacker.start(s,t,first,last) -- local n = whatever[t[last]] -- -- s.report("start: %s",n) --- return pdfliteral(n) +-- return pdfpageliteral(n) -- end -- -- function demostacker.stop(s,t,first,last) -- local n = whatever[false] -- -- s.report("stop: %s",n) --- return pdfliteral(n) +-- return pdfpageliteral(n) -- end -- -- function demostacker.change(s,t1,first1,last1,t2,first2,last2) -- local n = whatever[t2[last2]] -- -- s.report("change: %s",n) --- return pdfliteral(n) +-- return pdfpageliteral(n) -- end -- -- demostacker.mode = "switch" @@ -325,7 +325,7 @@ end -- r[#r+1] = whatever[t[i]] -- end -- -- s.report("start: %s",concat(r," ")) --- return pdfliteral(concat(r," ")) +-- return pdfpageliteral(concat(r," ")) -- end -- -- function demostacker.stop(s,t,first,last) @@ -334,7 +334,7 @@ end -- r[#r+1] = whatever[false] -- end -- -- s.report("stop: %s",concat(r," ")) --- return pdfliteral(concat(r," ")) +-- return pdfpageliteral(concat(r," ")) -- end -- -- function demostacker.change(s,t1,first1,last1,t2,first2,last2) @@ -346,7 +346,7 @@ end -- r[#r+1] = whatever[t2[i]] -- end -- -- s.report("change: %s",concat(r," ")) --- return pdfliteral(concat(r," ")) +-- return pdfpageliteral(concat(r," ")) -- end -- -- demostacker.mode = "stack" diff --git a/tex/context/base/mkiv/util-sto.lua b/tex/context/base/mkiv/util-sto.lua index d21267d7a..5b6915eaf 100644 --- a/tex/context/base/mkiv/util-sto.lua +++ b/tex/context/base/mkiv/util-sto.lua @@ -6,7 +6,7 @@ if not modules then modules = { } end modules ['util-sto'] = { license = "see context related readme files" } -local setmetatable, getmetatable, type = setmetatable, getmetatable, type +local setmetatable, getmetatable, rawset, type = setmetatable, getmetatable, rawset, type utilities = utilities or { } utilities.storage = utilities.storage or { } @@ -158,6 +158,29 @@ function table.setmetatablecall(t,f) return t end +-- the manual is somewhat fuzzy about this but suggests that one can best +-- set all fields before assigning a metatable + +function table.setmetatableindices(t,f,n,c) + if type(t) ~= "table" then + f, t = t, { } + end + local m = getmetatable(t) + local i = f_index[f] or f + if m then + m.__index = i + m.__newindex = n + m.__call = c + else + setmetatable(t,{ + __index = i, + __newindex = n, + __call = c, + }) + end + return t +end + function table.setmetatablekey(t,key,value) local m = getmetatable(t) if not m then @@ -172,3 +195,75 @@ function table.getmetatablekey(t,key,value) local m = getmetatable(t) return m and m[key] end + +-- Problem: we have no __next (which is ok as it would probably slow down lua) so +-- we cannot loop over the keys. + +-- local parametersets = table.autokeys() +-- +-- parametersets.foo.bar = function(t,k) return "OEPS" end +-- parametersets.foo.foo = "SPEO" +-- parametersets.crap = { a = "a", b = table.autokey { function() return "b" end } } +-- +-- print(parametersets.foo.bar) +-- print(parametersets.foo.foo) +-- print(parametersets.crap.b) +-- print(parametersets.crap.b[1]) + +-- function table.autotables(t) +-- local t = t or { } +-- local m = getmetatable(t) +-- if not m then +-- m = { } +-- setmetatable(t,m) +-- end +-- m.__newindex = function(t,k,p) +-- local v = { } +-- local m = { +-- __index = function(t,k) +-- local v = p[k] +-- if type(v) == "function" then +-- return v(t,k) -- so we can have multiple arguments +-- else +-- return v +-- end +-- end, +-- __newindex = function(t,k,v) +-- p[k] = v +-- end, +-- __len = function(t) +-- return #p +-- end, +-- } +-- setmetatable(v,m) +-- rawset(t,k,v) +-- return v +-- end +-- m.__index = function(t,k) +-- local v = { } +-- t[k] = v -- calls newindex +-- return v +-- end +-- return t +-- end +-- +-- function table.autokeys(p) +-- local t = { } +-- setmetatable(t, { +-- __newindex = function(t,k,v) +-- p[k] = v +-- end, +-- __index = function(t,k) +-- local v = p[k] +-- if type(v) == "function" then +-- return v(t,k) -- so we can have multiple arguments +-- else +-- return v +-- end +-- end, +-- __len = function(t) +-- return #p +-- end, +-- }) +-- return t +-- end diff --git a/tex/context/base/mkiv/util-str.lua b/tex/context/base/mkiv/util-str.lua index cebbc6be2..9da0c6a2f 100644 --- a/tex/context/base/mkiv/util-str.lua +++ b/tex/context/base/mkiv/util-str.lua @@ -12,17 +12,18 @@ local strings = utilities.strings local format, gsub, rep, sub, find = string.format, string.gsub, string.rep, string.sub, string.find local load, dump = load, string.dump -local tonumber, type, tostring = tonumber, type, tostring +local tonumber, type, tostring, next = tonumber, type, tostring, next local unpack, concat = table.unpack, table.concat local P, V, C, S, R, Ct, Cs, Cp, Carg, Cc = lpeg.P, lpeg.V, lpeg.C, lpeg.S, lpeg.R, lpeg.Ct, lpeg.Cs, lpeg.Cp, lpeg.Carg, lpeg.Cc local patterns, lpegmatch = lpeg.patterns, lpeg.match -local utfchar, utfbyte = utf.char, utf.byte +local utfchar, utfbyte, utflen = utf.char, utf.byte, utf.len + ----- loadstripped = utilities.lua.loadstripped ----- setmetatableindex = table.setmetatableindex local loadstripped = nil -if _LUAVERSION < 5.2 then +if LUAVERSION < 5.2 then loadstripped = function(str,shortcuts) return load(str) @@ -145,6 +146,18 @@ function strings.tabtospace(str,tab) return lpegmatch(pattern,str,1,tab or 7) end +function string.utfpadding(s,n) + if not n or n == 0 then + return "" + end + local l = utflen(s) + if n > 0 then + return nspaces[n-l] + else + return nspaces[-n-l] + end +end + -- local t = { -- "1234567123456712345671234567", -- "\tb\tc", @@ -281,41 +294,48 @@ end -- -- More info can be found in cld-mkiv.pdf so here I stick to a simple list. -- --- integer %...i number --- integer %...d number --- unsigned %...u number --- character %...c number --- hexadecimal %...x number --- HEXADECIMAL %...X number --- octal %...o number --- string %...s string number --- float %...f number --- checked float %...F number --- exponential %...e number --- exponential %...E number --- autofloat %...g number --- autofloat %...G number --- utf character %...c number --- force tostring %...S any --- force tostring %Q any --- force tonumber %N number (strip leading zeros) --- signed number %I number --- rounded number %r number --- 0xhexadecimal %...h character number --- 0xHEXADECIMAL %...H character number --- U+hexadecimal %...u character number --- U+HEXADECIMAL %...U character number --- points %p number (scaled points) --- basepoints %b number (scaled points) --- table concat %...t table --- table concat %{.}t table --- serialize %...T sequenced (no nested tables) --- serialize %{.}T sequenced (no nested tables) --- boolean (logic) %l boolean --- BOOLEAN %L boolean --- whitespace %...w --- automatic %...a 'whatever' (string, table, ...) --- automatic %...A "whatever" (string, table, ...) +-- integer %...i number +-- integer %...d number +-- unsigned %...u number -- no tused +-- character %...c number +-- hexadecimal %...x number +-- HEXADECIMAL %...X number +-- octal %...o number +-- string %...s string number +-- float %...f number +-- checked float %...F number +-- exponential %...e number +-- exponential %...E number +-- stripped e %...j number +-- stripped E %...J number +-- autofloat %...g number +-- autofloat %...G number +-- utf character %...c number +-- force tostring %...S any +-- force tostring %Q any +-- force tonumber %N number (strip leading zeros) +-- signed number %I number +-- rounded number %r number +-- 0xhexadecimal %...h character number +-- 0xHEXADECIMAL %...H character number +-- U+hexadecimal %...u character number +-- U+HEXADECIMAL %...U character number +-- points %p number (scaled points) +-- basepoints %b number (scaled points) +-- table concat %...t table +-- table concat %{.}t table +-- serialize %...T sequenced (no nested tables) +-- serialize %{.}T sequenced (no nested tables) +-- boolean (logic) %l boolean +-- BOOLEAN %L boolean +-- whitespace %...w number +-- whitespace %...W (fixed) +-- automatic %...a 'whatever' (string, table, ...) +-- automatic %...A "whatever" (string, table, ...) +-- zap %...z skip +-- comma/period real %...m +-- period/comma real %...M +-- formatted float %...k n.m local n = 0 @@ -423,6 +443,27 @@ end -- print(number.formatted(12345678,true)) -- print(number.formatted(1234.56,"!","?")) +local p = Cs( + P("-")^0 + * (P("0")^1/"")^0 + * (1-P("."))^0 + * (P(".") * P("0")^1 * P(-1)/"" + P(".")^0) + * P(1-P("0")^1*P(-1))^0 + ) + +function number.compactfloat(n,fmt) + if n == 0 then + return "0" + elseif n == 1 then + return "1" + end + n = lpegmatch(p,format(fmt or "%0.3f",n)) + if n == "." or n == "" or n == "-" then + return "0" + end + return n +end + local zero = P("0")^1 / "" local plus = P("+") / "" local minus = P("-") @@ -483,7 +524,7 @@ return function(%s) return %s end local preamble, environment = "", { } -if _LUAVERSION < 5.2 then +if LUAVERSION < 5.2 then preamble = [[ local lpeg=lpeg @@ -499,6 +540,7 @@ local utfchar=utf.char local utfbyte=utf.byte local lpegmatch=lpeg.match local nspaces=string.nspaces +local utfpadding=string.utfpadding local tracedchar=string.tracedchar local autosingle=string.autosingle local autodouble=string.autodouble @@ -525,6 +567,7 @@ else utfbyte = utf.byte, lpegmatch = lpeg.match, nspaces = string.nspaces, + utfpadding = string.utfpadding, tracedchar = string.tracedchar, autosingle = string.autosingle, autodouble = string.autodouble, @@ -576,9 +619,36 @@ local format_S = function(f) -- can be optimized end end +local format_right = function(f) + n = n + 1 + f = tonumber(f) + if not f or f == 0 then + return format("(a%s or '')",n) + elseif f > 0 then + return format("utfpadding(a%s,%i)..a%s",n,f,n) + else + return format("a%s..utfpadding(a%s,%i)",n,n,f) + end +end + +local format_left = function(f) + n = n + 1 + f = tonumber(f) + if not f or f == 0 then + return format("(a%s or '')",n) + end + if f < 0 then + return format("utfpadding(a%s,%i)..a%s",n,-f,n) + else + return format("a%s..utfpadding(a%s,%i)",n,n,-f) + end +end + local format_q = function() n = n + 1 - return format("(a%s and format('%%q',a%s) or '')",n,n) -- goodie: nil check (maybe separate lpeg, not faster) + -- lua 5.3 has a different q than lua 5.2 (which does a tostring on numbers) + -- return format("(a%s ~= nil and format('%%q',a%s) or '')",n,n) + return format("(a%s ~= nil and format('%%q',tostring(a%s)) or '')",n,n) end local format_Q = function() -- can be optimized @@ -907,6 +977,9 @@ local builder = Cs { "start", + V("m") + V("M") -- new (formatted number) + V("z") -- new -- + + V(">") -- left padding + + V("<") -- right padding + -- -- + V("?") -- ignored, probably messed up % ) + V("*") @@ -929,7 +1002,7 @@ local builder = Cs { "start", ["o"] = (prefix_any * P("o")) / format_o, -- %o => regular %o (octal) -- ["S"] = (prefix_any * P("S")) / format_S, -- %S => %s (tostring) - ["Q"] = (prefix_any * P("Q")) / format_S, -- %Q => %q (tostring) + ["Q"] = (prefix_any * P("Q")) / format_Q, -- %Q => %q (tostring) ["N"] = (prefix_any * P("N")) / format_N, -- %N => tonumber (strips leading zeros) ["k"] = (prefix_sub * P("k")) / format_k, -- %k => like f but with n.m ["c"] = (prefix_any * P("c")) / format_c, -- %c => utf character (extension to regular) @@ -957,11 +1030,14 @@ local builder = Cs { "start", ["m"] = (prefix_tab * P("m")) / format_m, -- %m => xxx.xxx.xxx,xx (optional prefix instead of .) ["M"] = (prefix_tab * P("M")) / format_M, -- %M => xxx,xxx,xxx.xx (optional prefix instead of ,) -- - ["z"] = (prefix_any * P("z")) / format_z, -- %M => xxx,xxx,xxx.xx (optional prefix instead of ,) + ["z"] = (prefix_any * P("z")) / format_z, -- %z => skip n arguments -- ["a"] = (prefix_any * P("a")) / format_a, -- %a => '...' (forces tostring) ["A"] = (prefix_any * P("A")) / format_A, -- %A => "..." (forces tostring) -- + ["<"] = (prefix_any * P("<")) / format_left, + [">"] = (prefix_any * P(">")) / format_right, + -- ["*"] = Cs(((1-P("%"))^1 + P("%%")/"%%")^1) / format_rest, -- rest (including %%) ["?"] = Cs(((1-P("%"))^1 )^1) / format_rest, -- rest (including %%) -- @@ -986,6 +1062,14 @@ local direct = Cs ( * P(-1) / [[local format = string.format return function(str) return format("%0",str) end]] ) +-- local direct = Cs ( +-- P("%") +-- * (S("+- .") + R("09"))^0 +-- * S("sqidfgGeExXo") +-- * (1-P("%"))^0 +-- * P(-1) / [[local format = string.format return function(str) return format([==[%0]==],str) end]] +-- ) + local function make(t,str) local f local p @@ -1058,7 +1142,7 @@ strings.formatters = { } -- _connector_ is an experiment -if _LUAVERSION < 5.2 then +if LUAVERSION < 5.2 then function strings.formatters.new(noconcat) local t = { _type_ = "formatter", _connector_ = noconcat and "," or "..", _extensions_ = { }, _preamble_ = preamble, _environment_ = { } } @@ -1118,7 +1202,7 @@ patterns.luaquoted = Cs(Cc('"') * ((1-S('"\n'))^1 + P('"')/'\\"' + P('\n')/'\\n" -- escaping by lpeg is faster for strings without quotes, slower on a string with quotes, but -- faster again when other q-escapables are found (the ones we don't need to escape) -if _LUAVERSION < 5.2 then +if LUAVERSION < 5.2 then add(formatters,"xml",[[lpegmatch(xmlescape,%s)]],"local xmlescape = lpeg.patterns.xmlescape") add(formatters,"tex",[[lpegmatch(texescape,%s)]],"local texescape = lpeg.patterns.texescape") @@ -1183,3 +1267,21 @@ local pattern = Cs((newline / (os.newline or "\r") + 1)^0) function string.replacenewlines(str) return lpegmatch(pattern,str) end + +-- + +function strings.newcollector() + local result, r = { }, 0 + return + function(fmt,str,...) -- write + r = r + 1 + result[r] = str == nil and fmt or formatters[fmt](str,...) + end, + function(connector) -- flush + if result then + local str = concat(result,connector) + result, r = { }, 0 + return str + end + end +end diff --git a/tex/context/base/mkiv/util-tab.lua b/tex/context/base/mkiv/util-tab.lua index fb2702228..ebe51eb1a 100644 --- a/tex/context/base/mkiv/util-tab.lua +++ b/tex/context/base/mkiv/util-tab.lua @@ -478,11 +478,11 @@ end -- inspect(table.drop({ { a=2 }, {a=3} })) -- inspect(table.drop({ { a=2 }, {a=3} },true)) -function table.autokey(t,k) - local v = { } - t[k] = v - return v -end +-- function table.autokey(t,k) -- replaced +-- local v = { } +-- t[k] = v +-- return v +-- end local selfmapper = { __index = function(t,k) t[k] = k return k end } @@ -616,6 +616,10 @@ local is_simple_table = table.is_simple_table -- return nil -- end +-- In order to overcome the luajit (65K constant) limitation I tried a split approach, +-- i.e. outputting the first level tables as locals but that failed with large cjk +-- fonts too so I removed that ... just use luatex instead. + local function serialize(root,name,specification) if type(specification) == "table" then diff --git a/tex/context/base/mkiv/util-tpl.lua b/tex/context/base/mkiv/util-tpl.lua index 468dd429c..5e75a151b 100644 --- a/tex/context/base/mkiv/util-tpl.lua +++ b/tex/context/base/mkiv/util-tpl.lua @@ -16,7 +16,7 @@ local templates = utilities.templates local trace_template = false trackers.register("templates.trace",function(v) trace_template = v end) local report_template = logs.reporter("template") -local tostring = tostring +local tostring, next = tostring, next local format, sub, byte = string.format, string.sub, string.byte local P, C, R, Cs, Cc, Carg, lpegmatch, lpegpatterns = lpeg.P, lpeg.C, lpeg.R, lpeg.Cs, lpeg.Cc, lpeg.Carg, lpeg.match, lpeg.patterns diff --git a/tex/context/base/mkiv/util-you.lua b/tex/context/base/mkiv/util-you.lua index 79a0e83e7..32a7e07d4 100644 --- a/tex/context/base/mkiv/util-you.lua +++ b/tex/context/base/mkiv/util-you.lua @@ -30,22 +30,43 @@ utilities.youless = youless local lpegmatch = lpeg.match local formatters = string.formatters +local sortedhash = table.sortedhash + +local tonumber, type, next = tonumber, type, next + +local round, div = math.round, math.div +local osdate, ostime = os.date, os.time + +local report = logs.reporter("youless") +local trace = false -- dofile("http.lua") local http = socket.http -local f_normal = formatters["http://%s/V?%s=%i&f=j"] -local f_password = formatters["http://%s/L?w=%s"] +-- f=j : json + +local f_password = formatters["http://%s/L?w=%s"] -local function fetch(url,password,what,i) - local url = f_normal(url,what,i) - local data, h = http.request(url) - local result = data and utilities.json.tolua(data) - return result +local f_fetchers = { + electricity = formatters["http://%s/V?%s=%i&f=j"], + gas = formatters["http://%s/W?%s=%i&f=j"], + pulse = formatters["http://%s/Z?%s=%i&f=j"], +} + +local function fetch(url,password,what,i,category) + local fetcher = f_fetchers[category or "electricity"] + if not fetcher then + report("invalid fetcher %a",category) + else + local url = fetcher(url,what,i) + local data, h = http.request(url) + local result = data and utilities.json.tolua(data) + return result + end end --- "123" " 1,234" +-- "123" " 23" " 1,234" local tovalue = lpeg.Cs((lpeg.R("09") + lpeg.P(1)/"")^1) / tonumber @@ -58,48 +79,99 @@ local totime = (lpeg.C(4) / tonumber) * lpeg.P("-") * (lpeg.C(2) / tonumber) * lpeg.P(":") * (lpeg.C(2) / tonumber) -local function get(url,password,what,i,data,average,variant) +local function collapsed(data,dirty) + for list, parent in next, dirty do + local t, n = { }, { } + for k, v in next, list do + local d = div(k,10) * 10 + t[d] = (t[d] or 0) + v + n[d] = (n[d] or 0) + 1 + end + for k, v in next, t do + t[k] = round(t[k]/n[k]) + end + parent[1][parent[2]] = t + end + return data +end + +local function get(url,password,what,step,data,option,category) if not data then data = { } end + local dirty = { } while true do - local d = fetch(url,password,what,i) - if d and next(d) then + local d = fetch(url,password,what,step,category) + local v = d and d.val + if v and #v > 0 then local c_year, c_month, c_day, c_hour, c_minute, c_seconds = lpegmatch(totime,d.tm) if c_year and c_seconds then local delta = tonumber(d.dt) - local tnum = os.time { year = c_year, month = c_month, day = c_day, hour = c_hour, minute = c_minute } - local v = d.val + local tnum = ostime { + year = c_year, + month = c_month, + day = c_day, + hour = c_hour, + min = c_minute, + sec = c_seconds, + } for i=1,#v do - local newvalue = lpegmatch(tovalue,v[i]) - if newvalue then - local t = tnum + (i-1)*delta - local current = os.date("%Y-%m-%dT%H:%M:%S",t) - local c_year, c_month, c_day, c_hour, c_minute, c_seconds = lpegmatch(totime,current) - if c_year and c_seconds then - local years = data.years if not years then years = { } data.years = years end - local d_year = years[c_year] if not d_year then d_year = { } years[c_year] = d_year end - local months = d_year.months if not months then months = { } d_year.months = months end - local d_month = months[c_month] if not d_month then d_month = { } months[c_month] = d_month end - local days = d_month.days if not days then days = { } d_month.days = days end - local d_day = days[c_day] if not d_day then d_day = { } days[c_day] = d_day end - if average then - d_day.average = newvalue - else - local hours = d_day.hours if not hours then hours = { } d_day.hours = hours end - local d_hour = hours[c_hour] if not d_hour then d_hour = { } hours[c_hour] = d_hour end - d_hour[c_minute] = newvalue + local vi = v[i] + if vi ~= "*" then + local newvalue = lpegmatch(tovalue,vi) + if newvalue then + local t = tnum + (i-1)*delta + -- local current = osdate("%Y-%m-%dT%H:%M:%S",t) + -- local c_year, c_month, c_day, c_hour, c_minute, c_seconds = lpegmatch(totime,current) + local c = osdate("*t",tnum + (i-1)*delta) + local c_year = c.year + local c_month = c.month + local c_day = c.day + local c_hour = c.hour + local c_minute = c.min + local c_seconds = c.sec + if c_year and c_seconds then + local years = data.years if not years then years = { } data.years = years end + local d_year = years[c_year] if not d_year then d_year = { } years[c_year] = d_year end + local months = d_year.months if not months then months = { } d_year.months = months end + local d_month = months[c_month] if not d_month then d_month = { } months[c_month] = d_month end + local days = d_month.days if not days then days = { } d_month.days = days end + local d_day = days[c_day] if not d_day then d_day = { } days[c_day] = d_day end + if option == "average" or option == "total" then + if trace then + local oldvalue = d_day[option] + if oldvalue and oldvalue ~= newvalue then + report("category %s, step %i, time %s: old %s %s updated to %s",category,step,osdate("%Y-%m-%dT%H:%M:%S",t),option,oldvalue,newvalue) + end + end + d_day[option] = newvalue + elseif option == "value" then + local hours = d_day.hours if not hours then hours = { } d_day.hours = hours end + local d_hour = hours[c_hour] if not d_hour then d_hour = { } hours[c_hour] = d_hour end + if trace then + local oldvalue = d_hour[c_minute] + if oldvalue and oldvalue ~= newvalue then + report("category %s, step %i, time %s: old %s %s updated to %s",category,step,osdate("%Y-%m-%dT%H:%M:%S",t),"value",oldvalue,newvalue) + end + end + d_hour[c_minute] = newvalue + if not dirty[d_hour] then + dirty[d_hour] = { hours, c_hour } + end + else + -- can't happen + end end end end end end else - return data + return collapsed(data,dirty) end - i = i + 1 + step = step + 1 end - return data + return collapsed(data,dirty) end -- day of month (kwh) @@ -132,6 +204,7 @@ function youless.collect(specification) local detail = specification.detail or false local nobackup = specification.nobackup or false local password = specification.password or "" + local oldstuff = false if host == "" then return end @@ -140,13 +213,36 @@ function youless.collect(specification) else data = table.load(filename) or data end - if variant == "kwh" then - get(host,password,"m",1,data,true) - elseif variant == "watt" then - get(host,password,"d",0,data,true) - get(host,password,"w",1,data) + if variant == "electricity" then + get(host,password,"m",1,data,"total","electricity") + if oldstuff then + get(host,password,"d",1,data,"average","electricity") + end + get(host,password,"w",1,data,"value","electricity") if detail then - get(host,password,"h",1,data) -- todo: get this for calculating the precise max + get(host,password,"h",1,data,"value","electricity") -- todo: get this for calculating the precise max + end + elseif variant == "pulse" then + -- It looks like the 'd' option returns the wrong values or at least not the same sort + -- as the other ones, so we calculate the means ourselves. And 'w' is not consistent with + -- that too, so ... + get(host,password,"m",1,data,"total","pulse") + if oldstuff then + get(host,password,"d",1,data,"average","pulse") + end + detail = true + get(host,password,"w",1,data,"value","pulse") + if detail then + get(host,password,"h",1,data,"value","pulse") + end + elseif variant == "gas" then + get(host,password,"m",1,data,"total","gas") + if oldstuff then + get(host,password,"d",1,data,"average","gas") + end + get(host,password,"w",1,data,"value","gas") + if detail then + get(host,password,"h",1,data,"value","gas") end else return @@ -164,15 +260,21 @@ function youless.collect(specification) if type(check) == "table" then local keepname = file.replacesuffix(filename,"old") os.remove(keepname) - if not lfs.isfile(keepname) then + if lfs.isfile(keepname) then + report("error in removing %a",keepname) + else os.rename(filename,keepname) os.rename(tempname,filename) end + else + report("error in saving %a",tempname) end else local keepname = file.join(path,formatters["%s-%s"](os.date("%Y-%m-%d-%H-%M-%S",os.time()),base)) os.rename(filename,keepname) - if not lfs.isfile(filename) then + if lfs.isfile(filename) then + report("error in renaming %a",filename) + else table.save(filename,data) end end @@ -181,76 +283,111 @@ end -- local data = youless.collect { -- host = "192.168.2.50", --- variant = "watt", --- filename = "youless-watt.lua" +-- variant = "electricity", +-- category = "electricity", +-- filename = "youless-electricity.lua" -- } - +-- -- inspect(data) -- local data = youless.collect { --- host = "192.168.2.50", --- variant = "kwh", --- filename = "youless-kwh.lua" +-- host = "192.168.2.50", +-- variant = "pulse", +-- category = "electricity", +-- filename = "youless-pulse.lua" -- } +-- +-- inspect(data) +-- local data = youless.collect { +-- host = "192.168.2.50", +-- variant = "gas", +-- category = "gas", +-- filename = "youless-gas.lua" +-- } +-- -- inspect(data) +-- We remain compatible so we stick to electricity and not unit fields. + function youless.analyze(data) - if data and data.variant == "watt" and data.years then - for y, year in next, data.years do - local a_year, n_year, m_year = 0, 0, 0 - if year.months then - for m, month in next, year.months do - local a_month, n_month = 0, 0 - if month.days then - for d, day in next, month.days do - local a_day, n_day = 0, 0 - if day.hours then - for h, hour in next, day.hours do - local a_hour, n_hour, m_hour = 0, 0, 0 - for k, v in next, hour do - if type(k) == "number" then - a_hour = a_hour + v - n_hour = n_hour + 1 - if v > m_hour then - m_hour = v - end + if type(data) == "string" then + data = table.load(data) + end + if type(data) ~= "table" then + return false, "no data" + end + if not data.years then + return false, "no years" + end + local variant = data.variant + local unit, maxunit + if variant == "electricity" or variant == "watt" then + unit = "watt" + maxunit = "maxwatt" + elseif variant == "gas" then + unit = "liters" + maxunit = "maxliters" + elseif variant == "pulse" then + unit = "watt" + maxunit = "maxwatt" + else + return false, "invalid variant" + end + for y, year in next, data.years do + local a_year, n_year, m_year = 0, 0, 0 + if year.months then + for m, month in next, year.months do + local a_month, n_month = 0, 0 + if month.days then + for d, day in next, month.days do + local a_day, n_day = 0, 0 + if day.hours then + for h, hour in next, day.hours do + local a_hour, n_hour, m_hour = 0, 0, 0 + for k, v in next, hour do + if type(k) == "number" then + a_hour = a_hour + v + n_hour = n_hour + 1 + if v > m_hour then + m_hour = v end end - n_day = n_day + n_hour - a_day = a_day + a_hour - hour.maxwatt = m_hour - hour.watt = a_hour / n_hour - if m_hour > m_year then - m_year = m_hour - end end - end - if n_day > 0 then - a_month = a_month + a_day - n_month = n_month + n_day - day.watt = a_day / n_day - else - day.watt = 0 + n_day = n_day + n_hour + a_day = a_day + a_hour + hour[maxunit] = m_hour + hour[unit] = a_hour / n_hour + if m_hour > m_year then + m_year = m_hour + end end end - end - if n_month > 0 then - a_year = a_year + a_month - n_year = n_year + n_month - month.watt = a_month / n_month - else - month.watt = 0 + if n_day > 0 then + a_month = a_month + a_day + n_month = n_month + n_day + day[unit] = a_day / n_day + else + day[unit] = 0 + end end end - end - if n_year > 0 then - year.watt = a_year / n_year - year.maxwatt = m_year - else - year.watt = 0 - year.maxwatt = 0 + if n_month > 0 then + a_year = a_year + a_month + n_year = n_year + n_month + month[unit] = a_month / n_month + else + month[unit] = 0 + end end end + if n_year > 0 then + year[unit] = a_year / n_year + year[maxunit] = m_year + else + year[unit] = 0 + year[maxunit] = 0 + end end + return data end diff --git a/tex/context/fonts/mkiv/bonum-math.lfg b/tex/context/fonts/mkiv/bonum-math.lfg index 00576aaef..8dfa63405 100644 --- a/tex/context/fonts/mkiv/bonum-math.lfg +++ b/tex/context/fonts/mkiv/bonum-math.lfg @@ -8,8 +8,13 @@ return { author = "Hans Hagen", copyright = "ConTeXt development team", mathematics = { + dimensions = { + default = { + [0x1D453] = { xoffset = "llx" },-- 𝑓 + }, + }, kerns = { - [0x1D449] = kern_200, -- + [0x1D449] = kern_200, -- 𝑉 [0x1D44A] = kern_100, -- 𝑊 }, alternates = { diff --git a/tex/context/fonts/mkiv/cambria-math.lfg b/tex/context/fonts/mkiv/cambria-math.lfg index ae875e64d..c18854d18 100644 --- a/tex/context/fonts/mkiv/cambria-math.lfg +++ b/tex/context/fonts/mkiv/cambria-math.lfg @@ -50,5 +50,20 @@ return { -- [0x1D44F] = 1000, -- 𝑎𝑏 demo -- } -- }, + -- kerns = { + -- [0x1D453] = { + -- force = true, + -- topright = { + -- { + -- kern = 1000, + -- }, + -- }, + -- bottomright = { + -- { + -- kern = 1000, + -- }, + -- }, + -- }, + -- }, }, } diff --git a/tex/context/fonts/mkiv/lm-math.lfg b/tex/context/fonts/mkiv/lm-math.lfg index b8c996979..a0fd2c21c 100644 --- a/tex/context/fonts/mkiv/lm-math.lfg +++ b/tex/context/fonts/mkiv/lm-math.lfg @@ -30,9 +30,9 @@ -- end -- end -- --- patches.register("after","prepare glyphs","^lmroman", patch) --- patches.register("after","prepare glyphs","^lmsans", patch) --- patches.register("after","prepare glyphs","^lmtypewriter",patch) +-- patches.register("before","check extra features","^lmroman", patch) +-- patches.register("before","check extra features","^lmsans", patch) +-- patches.register("before","check extra features","^lmtypewriter",patch) -- rm-lmr5 : LMMathRoman5-Regular -- rm-lmbx5 : LMMathRoman5-Bold ] diff --git a/tex/context/fonts/mkiv/lm.lfg b/tex/context/fonts/mkiv/lm.lfg index aebedd01b..ec37a2975 100644 --- a/tex/context/fonts/mkiv/lm.lfg +++ b/tex/context/fonts/mkiv/lm.lfg @@ -34,6 +34,8 @@ return { height = 960, depth = 40, }, + -- [0xFE932] = { xoffset = 50, width = 290 }, -- used prime + -- [0x2032] = { xoffset = 50, width = 290 }, -- prime }, signs = { -- set dimensions diff --git a/tex/context/fonts/mkiv/lucida-opentype-math.lfg b/tex/context/fonts/mkiv/lucida-opentype-math.lfg index 29206da1a..7596f139a 100644 --- a/tex/context/fonts/mkiv/lucida-opentype-math.lfg +++ b/tex/context/fonts/mkiv/lucida-opentype-math.lfg @@ -1,5 +1,16 @@ ----- kern_250 = { bottomright = { { kern = -250 } }, force = true } +-- RadicalVerticalGap = 50 +-- RadicalDisplayStyleVerticalGap = 175 + +-- RadicalVerticalGap = 166 +-- RadicalDisplayStyleVerticalGap = 345 + +local function FixRadicalDisplayStyleVerticalGap(value,target,original) + local o = original.mathparameters.RadicalVerticalGap -- 50 + return 2 * o * target.parameters.factor +end + return { name = "lucida-opentype-math", version = "1.00", @@ -7,6 +18,9 @@ return { author = "Hans Hagen", copyright = "ConTeXt development team", mathematics = { + parameters = { + RadicalDisplayStyleVerticalGap = FixRadicalDisplayStyleVerticalGap, + }, alternates = { italic = { feature = 'ss01', value = 1, comment = "Mathematical Alternative Lowercase Italic" }, arrow = { feature = 'ss02', value = 1, comment = "Mathematical Alternative Smaller Arrows" }, @@ -21,7 +35,16 @@ return { -- }, dimensions = { default = { -- experimental values - [0x2044] = { xoffset = 275, width = 600 }, + [0x02044] = { xoffset = 275, width = 600 }, + -- primes + [0xFE932] = { width = 200 }, + [0xFE933] = { width = 500 }, + [0xFE934] = { width = 800 }, + [0xFE935] = { width = 1100 }, + -- reverse primes + [0xFE935] = { width = 200 }, + [0xFE936] = { width = 500 }, + [0xFE937] = { width = 800 }, }, }, }, diff --git a/tex/context/fonts/mkiv/pagella-math.lfg b/tex/context/fonts/mkiv/pagella-math.lfg index 40d50383b..c85ff3f6b 100644 --- a/tex/context/fonts/mkiv/pagella-math.lfg +++ b/tex/context/fonts/mkiv/pagella-math.lfg @@ -1,6 +1,8 @@ local kern_200 = { bottomright = { { kern = -200 } } } local kern_100 = { bottomright = { { kern = -100 } } } +-- Beware of updates ! + return { name = "pagella-math", version = "1.00", @@ -8,8 +10,14 @@ return { author = "Hans Hagen", copyright = "ConTeXt development team", mathematics = { + dimensions = { + default = { + -- [0x1D453] = { xoffset = 162, width = 278 + 162 },-- 𝑓 + [0x1D453] = { xoffset = "llx" },-- 𝑓 + }, + }, kerns = { - [0x1D449] = kern_200, -- + [0x1D449] = kern_200, -- 𝑉 [0x1D44A] = kern_100, -- 𝑊 }, alternates = { diff --git a/tex/context/fonts/mkiv/px-math.lfg b/tex/context/fonts/mkiv/px-math.lfg index 14f71dad3..08d208b3f 100644 --- a/tex/context/fonts/mkiv/px-math.lfg +++ b/tex/context/fonts/mkiv/px-math.lfg @@ -10,8 +10,9 @@ return { }, virtuals = { ["px-math"] = { - { name = "texgyre-pagella-math-regular.otf", features = "virtualmath", main = true }, - { name = "texgyrepagella-regular.otf", features = "virtualmath", vector = "tex-mr-missing" } , +-- { name = "texgyre-pagella-math-regular.otf", features = "virtualmath", main = true }, +-- { name = "texgyrepagella-regular.otf", features = "virtualmath", vector = "tex-mr-missing" } , + { name = "texgyrepagella-regular.otf", features = "virtualmath" } , { name = "rpxr.tfm", vector = "tex-mr" } , { name = "rpxmi.tfm", vector = "tex-mi", skewchar=0x7F }, { name = "rpxpplri.tfm", vector = "tex-it", skewchar=0x7F }, diff --git a/tex/context/fonts/mkiv/stix-two-math.lfg b/tex/context/fonts/mkiv/stix-two-math.lfg index ded97f92e..8d9c9c71a 100644 --- a/tex/context/fonts/mkiv/stix-two-math.lfg +++ b/tex/context/fonts/mkiv/stix-two-math.lfg @@ -1,3 +1,34 @@ +-- Bah, I really hate these patches especially because one needs to make +-- sure that they are still valid when the font gets updated. So, let's +-- do it runtime (not in the cached copy) and issue a warning every run. +-- As we cannot rely on version numbers (if we have more patches) we +-- check for values instead. +-- +-- This font also has inconsistent italics in smaller sizes which we can +-- fix in a more general way but I'm not sure if we want that. + +local function fix_italic(target,original,name,value,factor) + local m = target.parameters.mathsize + if m then + local u = type(name) == "number" and name or original.resources.unicodes[name] + if u then + local c = target.characters[u] + if c then + local i = c.italic + if i then + local d = original.descriptions[u] + if d and d.math.italic == value then + if m then + logs.report("patching font","fixing italic correction of %U at math size %i by %0.3f",u,m,factor) + c.italic = factor * i + end + end + end + end + end + end +end + return { name = "stix-two-math", version = "1.00", @@ -21,6 +52,14 @@ return { -- todo = { feature = 'ss14', value = 1, comment = "" }, circled = { feature = 'ss16', value = 1, comment = "Mathematical Alternative Circled Operators" }, }, + tweaks = { + aftercopying = { + function(target,original) + fix_italic(target,original,"uni222B.updsp",80,3.5) + fix_italic(target,original,"uni222B.up", 80,2.5) + end, + }, + }, }, } diff --git a/tex/context/fonts/mkiv/termes-math.lfg b/tex/context/fonts/mkiv/termes-math.lfg index 557216cb1..1501fd536 100644 --- a/tex/context/fonts/mkiv/termes-math.lfg +++ b/tex/context/fonts/mkiv/termes-math.lfg @@ -8,8 +8,13 @@ return { author = "Hans Hagen", copyright = "ConTeXt development team", mathematics = { + dimensions = { + default = { + [0x1D453] = { xoffset = "llx" },-- 𝑓 + }, + }, kerns = { - [0x1D449] = kern_200, -- + [0x1D449] = kern_200, -- 𝑉 [0x1D44A] = kern_100, -- 𝑊 }, alternates = { diff --git a/tex/context/fonts/mkiv/type-imp-dejavu.mkiv b/tex/context/fonts/mkiv/type-imp-dejavu.mkiv index 710aada5d..582d8a764 100644 --- a/tex/context/fonts/mkiv/type-imp-dejavu.mkiv +++ b/tex/context/fonts/mkiv/type-imp-dejavu.mkiv @@ -17,26 +17,26 @@ \starttypescript [\s!serif] [dejavu] [\s!name] \setups[\s!font:\s!fallback:\s!serif] - \definefontsynonym [\s!Serif] [\s!name:dejavuserif] [\s!features=\s!default] - \definefontsynonym [\s!SerifBold] [\s!name:dejavuserifbold] [\s!features=\s!default] - \definefontsynonym [\s!SerifItalic] [\s!name:dejavuserifitalic] [\s!features=\s!default] - \definefontsynonym [\s!SerifBoldItalic] [\s!name:dejavuserifbolditalic] [\s!features=\s!default] + \definefontsynonym [\s!Serif] [\s!name:dejavuserif] [\s!features=\s!default,\s!fallbacks=\s!Serif] + \definefontsynonym [\s!SerifBold] [\s!name:dejavuserifbold] [\s!features=\s!default,\s!fallbacks=\s!SerifBold] + \definefontsynonym [\s!SerifItalic] [\s!name:dejavuserifitalic] [\s!features=\s!default,\s!fallbacks=\s!SerifItalic] + \definefontsynonym [\s!SerifBoldItalic] [\s!name:dejavuserifbolditalic] [\s!features=\s!default,\s!fallbacks=\s!SerifBoldItalic] \stoptypescript \starttypescript [\s!sans] [dejavu] [\s!name] \setups[\s!font:\s!fallback:\s!sans] - \definefontsynonym [\s!Sans] [\s!name:dejavusans] [\s!features=\s!default] - \definefontsynonym [\s!SansBold] [\s!name:dejavusansbold] [\s!features=\s!default] - \definefontsynonym [\s!SansItalic] [\s!name:dejavusansoblique] [\s!features=\s!default] - \definefontsynonym [\s!SansBoldItalic] [\s!name:dejavusansboldoblique] [\s!features=\s!default] + \definefontsynonym [\s!Sans] [\s!name:dejavusans] [\s!features=\s!default,\s!fallbacks=\s!Sans] + \definefontsynonym [\s!SansBold] [\s!name:dejavusansbold] [\s!features=\s!default,\s!fallbacks=\s!SansBold] + \definefontsynonym [\s!SansItalic] [\s!name:dejavusansoblique] [\s!features=\s!default,\s!fallbacks=\s!SansItalic] + \definefontsynonym [\s!SansBoldItalic] [\s!name:dejavusansboldoblique] [\s!features=\s!default,\s!fallbacks=\s!SansBoldItalic] \stoptypescript \starttypescript [\s!mono] [dejavu] [\s!name] \setups[\s!font:\s!fallback:\s!mono] - \definefontsynonym [\s!Mono] [\s!name:dejavusansmono] [\s!features=\s!none] - \definefontsynonym [\s!MonoBold] [\s!name:dejavusansmonobold] [\s!features=\s!none] - \definefontsynonym [\s!MonoItalic] [\s!name:dejavusansmonooblique] [\s!features=\s!none] - \definefontsynonym [\s!MonoBoldItalic] [\s!name:dejavusansmonoboldoblique] [\s!features=\s!none] + \definefontsynonym [\s!Mono] [\s!name:dejavusansmono] [\s!features=\s!none,\s!fallbacks=\s!Mono] + \definefontsynonym [\s!MonoBold] [\s!name:dejavusansmonobold] [\s!features=\s!none,\s!fallbacks=\s!MonoBold] + \definefontsynonym [\s!MonoItalic] [\s!name:dejavusansmonooblique] [\s!features=\s!none,\s!fallbacks=\s!MonoItalic] + \definefontsynonym [\s!MonoBoldItalic] [\s!name:dejavusansmonoboldoblique] [\s!features=\s!none,\s!fallbacks=\s!MonoBoldItalic] \stoptypescript \starttypescript [\s!math][dejavu][\s!name] diff --git a/tex/context/fonts/mkiv/type-imp-ebgaramond.mkiv b/tex/context/fonts/mkiv/type-imp-ebgaramond.mkiv index cd474242f..bba07f41d 100644 --- a/tex/context/fonts/mkiv/type-imp-ebgaramond.mkiv +++ b/tex/context/fonts/mkiv/type-imp-ebgaramond.mkiv @@ -40,8 +40,8 @@ \starttypescript[ebgaramond] \definetypeface [ebgaramond] [rm] [serif] [ebgaramond] [default] [designsize=auto] - \definetypeface [ebgaramond] [tt] [mono] [dejavu] [default] - \definetypeface [ebgaramond] [mm] [math] [bonum] [default] + \definetypeface [ebgaramond] [tt] [mono] [dejavu] [default] [rscale=0.8] % rather arbitrary but seldom mixed anyway + \definetypeface [ebgaramond] [mm] [math] [bonum] [default] [rscale=0.8] % rather arbitrary but seldom mixed anyway \stoptypescript \stoptypescriptcollection diff --git a/tex/context/fonts/mkiv/type-imp-gofonts.mkiv b/tex/context/fonts/mkiv/type-imp-gofonts.mkiv new file mode 100644 index 000000000..632021674 --- /dev/null +++ b/tex/context/fonts/mkiv/type-imp-gofonts.mkiv @@ -0,0 +1,47 @@ +%D \module +%D [ file=type-imp-gofonts, +%D version=2017.06.13, +%D title=\CONTEXT\ Typescript Macros, +%D subtitle=Go fonts, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\starttypescriptcollection[gofonts] + + \starttypescript [\s!serif] [gofonts] [\s!name] + \setups[\s!font:\s!fallback:\s!serif] + \definefontsynonym [\s!Serif] [\s!name:goregular] [\s!features=\s!default] + \definefontsynonym [\s!SerifBold] [\s!name:gobold] [\s!features=\s!default] + \definefontsynonym [\s!SerifItalic] [\s!name:goitalic] [\s!features=\s!default] + \definefontsynonym [\s!SerifBoldItalic] [\s!name:gobolditalic] [\s!features=\s!default] + \stoptypescript + + \starttypescript [\s!sans] [gofonts] [\s!name] + \setups[\s!font:\s!fallback:\s!sans] + \definefontsynonym [\s!Sans] [\s!name:goregular] [\s!features=\s!default] + \definefontsynonym [\s!SansBold] [\s!name:gobold] [\s!features=\s!default] + \definefontsynonym [\s!SansItalic] [\s!name:goitalic] [\s!features=\s!default] + \definefontsynonym [\s!SansBoldItalic] [\s!name:gobolditalic] [\s!features=\s!default] + \stoptypescript + + \starttypescript [\s!mono] [gofonts] [\s!name] + \setups[\s!font:\s!fallback:\s!mono] + \definefontsynonym [\s!Mono] [\s!name:gomono] [\s!features=\s!none] + \definefontsynonym [\s!MonoBold] [\s!name:gomonobold] [\s!features=\s!none] + \definefontsynonym [\s!MonoItalic] [\s!name:gomoitalic] [\s!features=\s!none] + \definefontsynonym [\s!MonoBoldItalic] [\s!name:gomobolditalic] [\s!features=\s!none] + \stoptypescript + + \starttypescript[gofonts] + \definetypeface [gofonts] [\s!rm] [\s!serif] [gofonts] [\s!default] + \definetypeface [gofonts] [\s!ss] [\s!sans] [gofonts] [\s!default] + \definetypeface [gofonts] [\s!tt] [\s!mono] [gofonts] [\s!default] + \definetypeface [gofonts] [\s!mm] [\s!math] [gofonts] [\s!default] + \stoptypescript + +\stoptypescriptcollection diff --git a/tex/context/fonts/mkiv/type-imp-libertine.mkiv b/tex/context/fonts/mkiv/type-imp-libertine.mkiv index 4620995b9..4fac1a6aa 100644 --- a/tex/context/fonts/mkiv/type-imp-libertine.mkiv +++ b/tex/context/fonts/mkiv/type-imp-libertine.mkiv @@ -47,12 +47,13 @@ \starttypescript [\s!sans] [biolinum] [\s!name] \setups[\s!font:\s!fallback:\s!sans] - \definefontsynonym [\s!Sans] [Biolinum-Regular] [\s!features=\s!default] - \definefontsynonym [\s!SansBold] [Biolinum-Bold] [\s!features=\s!default] - \definefontsynonym [\s!SansItalic] [Biolinum-Italic] [\s!features=\s!default] - \definefontsynonym [\s!SansSlanted] [Biolinum-Slanted] [\s!features=\s!default] - \definefontsynonym [\s!SansBoldItalic] [Biolinum-BoldSlanted] [\s!features=\s!default] - \definefontsynonym [SansCaps] [Biolinum-Regular] [\s!features=\s!smallcaps] + \definefontsynonym [\s!Sans] [Biolinum-Regular] [\s!features=\s!default] + \definefontsynonym [\s!SansBold] [Biolinum-Bold] [\s!features=\s!default] + \definefontsynonym [\s!SansItalic] [Biolinum-Italic] [\s!features=\s!default] + \definefontsynonym [\s!SansSlanted] [Biolinum-Slanted] [\s!features=\s!default] + \definefontsynonym [\s!SansBoldItalic] [Biolinum-BoldSlanted] [\s!features=\s!default] + \definefontsynonym [\s!SansBoldSlanted] [Biolinum-BoldSlanted] [\s!features=\s!default] + \definefontsynonym [SansCaps] [Biolinum-Regular] [\s!features=\s!smallcaps] \stoptypescript \starttypescript [libertine] @@ -60,6 +61,7 @@ \definetypeface [libertine] [\s!ss] [\s!sans] [biolinum] [\s!default] \definetypeface [libertine] [\s!tt] [\s!mono] [default] [\s!default] %definetypeface [libertine] [\s!mm] [\s!math] [times] [\s!default] + \definetypeface [libertine] [\s!mm] [\s!math] [default] [\s!default] \quittypescriptscanning \stoptypescript diff --git a/tex/context/fonts/mkiv/type-imp-mscore.mkiv b/tex/context/fonts/mkiv/type-imp-mscore.mkiv index 971a03de7..d4aeec10d 100644 --- a/tex/context/fonts/mkiv/type-imp-mscore.mkiv +++ b/tex/context/fonts/mkiv/type-imp-mscore.mkiv @@ -56,17 +56,17 @@ \stoptypescript \starttypescript[mscore] - \definetypeface [mscore] [\s!rm] [\s!serif] [mscoretimes] [\s!default] - \definetypeface [mscore] [\s!ss] [\s!sans] [mscorearial] [\s!default] [\s!rscale=0.860] - \definetypeface [mscore] [\s!tt] [\s!mono] [mscorecourier] [\s!default] [\s!rscale=1.065] - \definetypeface [mscore] [\s!mm] [\s!math] [times] [\s!default] [\s!rscale=1.020] + \definetypeface [\typescriptone] [\s!rm] [\s!serif] [mscoretimes] [\s!default] + \definetypeface [\typescriptone] [\s!ss] [\s!sans] [mscorearial] [\s!default] [\s!rscale=0.860] + \definetypeface [\typescriptone] [\s!tt] [\s!mono] [mscorecourier] [\s!default] [\s!rscale=1.065] + \definetypeface [\typescriptone] [\s!mm] [\s!math] [times] [\s!default] [\s!rscale=1.020] \stoptypescript - \starttypescript[mscorenarrow] - \definetypeface [mscorenarrow] [\s!rm] [\s!serif] [mscoretimes] [\s!default] - \definetypeface [mscorenarrow] [\s!ss] [\s!sans] [mscorearialnarrow] [\s!default] [\s!rscale=0.860] - \definetypeface [mscorenarrow] [\s!tt] [\s!mono] [mscorecourier] [\s!default] [\s!rscale=1.065] - \definetypeface [mscorenarrow] [\s!mm] [\s!math] [times] [\s!default] [\s!rscale=1.020] + \starttypescript[mscorenarrow,mscore-narrow] + \definetypeface [\typescriptone] [\s!rm] [\s!serif] [mscoretimes] [\s!default] + \definetypeface [\typescriptone] [\s!ss] [\s!sans] [mscorearialnarrow] [\s!default] [\s!rscale=0.860] + \definetypeface [\typescriptone] [\s!tt] [\s!mono] [mscorecourier] [\s!default] [\s!rscale=1.065] + \definetypeface [\typescriptone] [\s!mm] [\s!math] [times] [\s!default] [\s!rscale=1.020] \stoptypescript % \starttypescript[mscoress] @@ -77,3 +77,53 @@ % \stoptypescript \stoptypescriptcollection + +% http://archive1.village.virginia.edu/spw4s/fonts/ + +\starttypescriptcollection[microsoft-chinese-old] + + % \starttypescript [\s!serif] [mschinese,mschinese-light] + % \definefontsynonym [STSong] [\s!file:stsong.ttf] [\s!features=chinese] + % \definefontsynonym [STKaiti] [\s!file:stkaiti.ttf] [\s!features=chinese] + % \definefontsynonym [STZHongsong] [\s!file:stzhongs.ttf] [\s!features=chinese] + % \definefontsynonym [STFangsong] [\s!file:stfangso.ttf] [\s!features=chinese] + % \stoptypescript + + % \starttypescript [\s!sans] [mschinese] + % \definefontsynonym [STXIHei] [\s!file:stxihei.ttf] [\s!features=chinese] + % \stoptypescript + + \starttypescript [\s!serif] [mschinese] + \setups[\s!font:\s!fallback:\s!serif] + \definefontsynonym [\s!Serif] [\s!file:stsong.ttf] [\s!features=chinese] + \definefontsynonym [\s!SerifItalic] [\s!file:stkaiti.ttf] [\s!features=chinese] + \definefontsynonym [\s!SerifBold] [\s!file:stzhongs.ttf] [\s!features=chinese] + \stoptypescript + + \starttypescript [\s!serif] [mschinese-light] + \setups[\s!font:\s!fallback:\s!serif] + \definefontsynonym [\s!Serif] [\s!file:stfangso.ttf] [\s!features=chinese] + \definefontsynonym [\s!SerifItalic] [\s!file:stkaiti.ttf] [\s!features=chinese] + \definefontsynonym [\s!SerifBold] [\s!file:stzhongs.ttf] [\s!features=chinese] + \stoptypescript + + \starttypescript [\s!sans] [mschinese] + \setups[\s!font:\s!fallback:\s!sans] + \definefontsynonym [\s!Sans] [\s!file:stxihei.ttf] [\s!features=chinese] + \stoptypescript + + \starttypescript[mschinese] + \definetypeface [\typescriptone] [\s!rm] [\s!serif] [mschinese] [\s!default] + \definetypeface [\typescriptone] [\s!ss] [\s!sans] [mschinese] [\s!default] + \definetypeface [\typescriptone] [\s!mm] [\s!math] [cambria] + \definetypeface [\typescriptone] [\s!tt] [\s!mono] [mscorecourier] + \stoptypescript + + \starttypescript[mschineselight,mschinese-light] + \definetypeface [\typescriptone] [\s!rm] [\s!serif] [mschinese-light] [\s!default] + \definetypeface [\typescriptone] [\s!ss] [\s!sans] [mschinese] [\s!default] + \definetypeface [\typescriptone] [\s!mm] [\s!math] [cambria] + \definetypeface [\typescriptone] [\s!tt] [\s!mono] [mscorecourier] + \stoptypescript + +\stoptypescriptcollection diff --git a/tex/context/fonts/mkiv/type-imp-texgyre.mkiv b/tex/context/fonts/mkiv/type-imp-texgyre.mkiv index a7c2d06be..2bec4c2a8 100644 --- a/tex/context/fonts/mkiv/type-imp-texgyre.mkiv +++ b/tex/context/fonts/mkiv/type-imp-texgyre.mkiv @@ -14,6 +14,10 @@ %D There are some weird ones that are never used .. all these Caps ... we can better %D split them into pagella-caps etc. +\definefontfeature + [mathcollapseitalics] + [collapseitalics=yes] + \starttypescriptcollection[texgyre] \definetypescriptprefix [f:pagella] [pagella] diff --git a/tex/context/fonts/mkiv/type-imp-xits.mkiv b/tex/context/fonts/mkiv/type-imp-xits.mkiv index 145ddc7a8..d3504bdbb 100644 --- a/tex/context/fonts/mkiv/type-imp-xits.mkiv +++ b/tex/context/fonts/mkiv/type-imp-xits.mkiv @@ -23,12 +23,12 @@ \starttypescript [\s!math] [xits,xitsbidi] [\s!name] \loadfontgoodies[xits-math] - \definefontsynonym[\s!MathRoman ][\s!file:xits-math.otf] [\s!features={\s!math\mathsizesuffix,mathextra},\s!goodies=xits-math] - \definefontsynonym[\s!MathRoman L2R][\s!file:xits-math.otf] [\s!features={\s!math\mathsizesuffix-l2r,mathextra},\s!goodies=xits-math] - \definefontsynonym[\s!MathRoman R2L][\s!file:xits-math.otf] [\s!features={\s!math\mathsizesuffix-r2l,mathextra},\s!goodies=xits-math] - \definefontsynonym[\s!MathRomanBold ][\s!file:xits-mathbold.otf][\s!features={\s!math\mathsizesuffix,mathextra},\s!goodies=xits-math] - \definefontsynonym[\s!MathRomanBold L2R][\s!file:xits-mathbold.otf][\s!features={\s!math\mathsizesuffix-l2r,mathextra},\s!goodies=xits-math] - \definefontsynonym[\s!MathRomanBold R2L][\s!file:xits-mathbold.otf][\s!features={\s!math\mathsizesuffix-r2l,mathextra},\s!goodies=xits-math] + \definefontsynonym[\s!MathRoman ][\s!file:xitsmath-regular.otf] [\s!features={\s!math\mathsizesuffix,mathextra},\s!goodies=xits-math] + \definefontsynonym[\s!MathRoman L2R][\s!file:xitsmath-regular.otf] [\s!features={\s!math\mathsizesuffix-l2r,mathextra},\s!goodies=xits-math] + \definefontsynonym[\s!MathRoman R2L][\s!file:xitsmath-regular.otf] [\s!features={\s!math\mathsizesuffix-r2l,mathextra},\s!goodies=xits-math] + \definefontsynonym[\s!MathRomanBold ][\s!file:xitsmath-bold.otf] [\s!features={\s!math\mathsizesuffix,mathextra},\s!goodies=xits-math] + \definefontsynonym[\s!MathRomanBold L2R][\s!file:xitsmath-bold.otf] [\s!features={\s!math\mathsizesuffix-l2r,mathextra},\s!goodies=xits-math] + \definefontsynonym[\s!MathRomanBold R2L][\s!file:xitsmath-bold.otf] [\s!features={\s!math\mathsizesuffix-r2l,mathextra},\s!goodies=xits-math] \stoptypescript \starttypescript [\s!serif] [xits] [\s!name] diff --git a/tex/context/fonts/mkiv/unifraktur.lfg b/tex/context/fonts/mkiv/unifraktur.lfg index 32ffed928..4bae0be7e 100644 --- a/tex/context/fonts/mkiv/unifraktur.lfg +++ b/tex/context/fonts/mkiv/unifraktur.lfg @@ -1,6 +1,6 @@ -- moved to treatments.lfg -- --- fonts.handlers.otf.enhancers.patches.register("after","check metadata","unifraktur*", function(data,filename) +-- fonts.handlers.otf.enhancers.patches.register("before","check extra features","unifraktur*", function(data,filename) -- data.metadata.pfminfo.os2_xheight = nil -- end) diff --git a/tex/context/fonts/mkiv/xits-math.lfg b/tex/context/fonts/mkiv/xits-math.lfg index 372224940..b37ab1277 100644 --- a/tex/context/fonts/mkiv/xits-math.lfg +++ b/tex/context/fonts/mkiv/xits-math.lfg @@ -23,6 +23,16 @@ return { comment = "Goodies that complement xits (by Khaled Hosny).", author = "Hans Hagen", copyright = "ConTeXt development team", + filenames = { + ["xitsmath-regular.otf"] = { + "xitsmath-regular.otf", + "xits-math.otf", + }, + ["xitsmath-bold.otf"] = { + "xitsmath-bold.otf", + "xits-mathbold.otf", + }, + }, mathematics = { -- italics = { -- ["xits-math"] = italics, diff --git a/tex/context/interface/mkii/keys-cs.xml b/tex/context/interface/mkii/keys-cs.xml index 9ce2a779a..521393c17 100644 --- a/tex/context/interface/mkii/keys-cs.xml +++ b/tex/context/interface/mkii/keys-cs.xml @@ -188,6 +188,7 @@ <cd:variable name='extremestretch' value='extremestretch'/> <cd:variable name='fact' value='fakt'/> <cd:variable name='february' value='unor'/> + <cd:variable name='field' value='field'/> <cd:variable name='figure' value='obrazek'/> <cd:variable name='figures' value='obrazky'/> <cd:variable name='file' value='soubor'/> @@ -379,6 +380,7 @@ <cd:variable name='norepeat' value='norepeat'/> <cd:variable name='normal' value='normalni'/> <cd:variable name='nospacing' value='nospacing'/> + <cd:variable name='nostopper' value='nostopper'/> <cd:variable name='not' value='ne'/> <cd:variable name='notation' value='notation'/> <cd:variable name='note' value='note'/> @@ -627,6 +629,10 @@ <cd:constant name='align' value='zarovnani'/> <cd:constant name='aligncharacter' value='aligncharacter'/> <cd:constant name='alignmentcharacter' value='alignmentcharacter'/> + <cd:constant name='alignmentleftsample' value='alignmentleftsample'/> + <cd:constant name='alignmentleftwidth' value='alignmentleftwidth'/> + <cd:constant name='alignmentrightsample' value='alignmentrightsample'/> + <cd:constant name='alignmentrightwidth' value='alignmentrightwidth'/> <cd:constant name='alignsymbol' value='alignsymbol'/> <cd:constant name='aligntitle' value='zarovnejtitul'/> <cd:constant name='alternative' value='alternativa'/> @@ -693,6 +699,7 @@ <cd:constant name='bottomoffset' value='offsetspodku'/> <cd:constant name='bottomspace' value='bottomspace'/> <cd:constant name='bottomstate' value='statusspodku'/> + <cd:constant name='break' value='break'/> <cd:constant name='buffer' value='buffer'/> <cd:constant name='cache' value='cache'/> <cd:constant name='calculate' value='pocitat'/> @@ -758,6 +765,7 @@ <cd:constant name='direction' value='smer'/> <cd:constant name='directory' value='adresar'/> <cd:constant name='display' value='obrazovka'/> + <cd:constant name='displaythreshold' value='displaythreshold'/> <cd:constant name='distance' value='vzdalenost'/> <cd:constant name='domain' value='domain'/> <cd:constant name='dot' value='tecka'/> @@ -800,6 +808,7 @@ <cd:constant name='fieldoffset' value='offsetpole'/> <cd:constant name='file' value='soubor'/> <cd:constant name='filler' value='filler'/> + <cd:constant name='filter' value='filter'/> <cd:constant name='filtercommand' value='filtercommand'/> <cd:constant name='finalnamesep' value='finalnamesep'/> <cd:constant name='finalpagesep' value='finalpagesep'/> @@ -847,6 +856,7 @@ <cd:constant name='headerstate' value='statuszahlavi'/> <cd:constant name='headlabel' value='popisekhlavicky'/> <cd:constant name='headnumber' value='cislonadpisu'/> + <cd:constant name='headseparator' value='headseparator'/> <cd:constant name='headstyle' value='stylhlavicky'/> <cd:constant name='height' value='vyska'/> <cd:constant name='hfactor' value='vfaktor'/> @@ -867,6 +877,7 @@ <cd:constant name='index' value='index'/> <cd:constant name='indicator' value='indikator'/> <cd:constant name='initialsep' value='initialsep'/> + <cd:constant name='inlinethreshold' value='inlinethreshold'/> <cd:constant name='inner' value='vnitrni'/> <cd:constant name='innermargin' value='innermargin'/> <cd:constant name='inputfile' value='inputfile'/> @@ -909,6 +920,7 @@ <cd:constant name='leftoffset' value='levyoffset'/> <cd:constant name='leftquotation' value='citacevlevo'/> <cd:constant name='leftquote' value='citovatvlevo'/> + <cd:constant name='leftsample' value='leftsample'/> <cd:constant name='leftsentence' value='vetavlevo'/> <cd:constant name='leftspeech' value='leftspeech'/> <cd:constant name='leftstyle' value='stylvlevo'/> @@ -981,6 +993,7 @@ <cd:constant name='nlines' value='nradky'/> <cd:constant name='norm' value='norm'/> <cd:constant name='note' value='note'/> + <cd:constant name='notes' value='notes'/> <cd:constant name='nr' value='nr'/> <cd:constant name='nright' value='nvpravo'/> <cd:constant name='ntop' value='nvrsek'/> @@ -1000,6 +1013,7 @@ <cd:constant name='numberset' value='numberset'/> <cd:constant name='numberstarter' value='numberstarter'/> <cd:constant name='numberstopper' value='numberstopper'/> + <cd:constant name='numberstrut' value='numberstrut'/> <cd:constant name='numberstyle' value='stylcisla'/> <cd:constant name='numberwidth' value='numberwidth'/> <cd:constant name='nx' value='nx'/> @@ -1069,6 +1083,7 @@ <cd:constant name='preview' value='nahled'/> <cd:constant name='previous' value='predchozi'/> <cd:constant name='previousnumber' value='predchozicislo'/> + <cd:constant name='print' value='print'/> <cd:constant name='printable' value='tisknutelne'/> <cd:constant name='process' value='process'/> <cd:constant name='profile' value='profile'/> @@ -1111,6 +1126,7 @@ <cd:constant name='rightoffset' value='pravyoffset'/> <cd:constant name='rightquotation' value='citacevpravo'/> <cd:constant name='rightquote' value='citovatvpravo'/> + <cd:constant name='rightsample' value='rightsample'/> <cd:constant name='rightsentence' value='vetavpravo'/> <cd:constant name='rightspeech' value='rightspeech'/> <cd:constant name='rightstyle' value='stylvpravo'/> @@ -1153,7 +1169,10 @@ <cd:constant name='sidemethod' value='sidemethod'/> <cd:constant name='sidespaceafter' value='bocnimezeraza'/> <cd:constant name='sidespacebefore' value='bocnimezerapred'/> + <cd:constant name='sidespaceinbetween' value='sidespaceinbetween'/> + <cd:constant name='sidethreshold' value='sidethreshold'/> <cd:constant name='sign' value='znak'/> + <cd:constant name='simplecommand' value='simplecommand'/> <cd:constant name='size' value='velikost'/> <cd:constant name='slantedfeatures' value='slantedfeatures'/> <cd:constant name='slantedfont' value='slantedfont'/> @@ -1166,7 +1185,9 @@ <cd:constant name='source' value='zdroj'/> <cd:constant name='space' value='mezera'/> <cd:constant name='spaceafter' value='mezeraza'/> + <cd:constant name='spaceafterside' value='spaceafterside'/> <cd:constant name='spacebefore' value='mezerapred'/> + <cd:constant name='spacebeforeside' value='spacebeforeside'/> <cd:constant name='spaceinbetween' value='spaceinbetween'/> <cd:constant name='spacing' value='mezerovani'/> <cd:constant name='specification' value='specification'/> @@ -1231,6 +1252,7 @@ <cd:constant name='titledistance' value='vzdalenosttitulek'/> <cd:constant name='titleleft' value='titleleft'/> <cd:constant name='titleright' value='titleright'/> + <cd:constant name='titlestrut' value='titlestrut'/> <cd:constant name='titlestyle' value='styltitulek'/> <cd:constant name='to' value='na'/> <cd:constant name='toffset' value='toffset'/> diff --git a/tex/context/interface/mkii/keys-de.xml b/tex/context/interface/mkii/keys-de.xml index 404f8da89..f399f128a 100644 --- a/tex/context/interface/mkii/keys-de.xml +++ b/tex/context/interface/mkii/keys-de.xml @@ -188,6 +188,7 @@ <cd:variable name='extremestretch' value='extremestretch'/> <cd:variable name='fact' value='gegeben'/> <cd:variable name='february' value='februar'/> + <cd:variable name='field' value='field'/> <cd:variable name='figure' value='abbildung'/> <cd:variable name='figures' value='abbildungen'/> <cd:variable name='file' value='datei'/> @@ -379,6 +380,7 @@ <cd:variable name='norepeat' value='norepeat'/> <cd:variable name='normal' value='normal'/> <cd:variable name='nospacing' value='nospacing'/> + <cd:variable name='nostopper' value='nostopper'/> <cd:variable name='not' value='nicht'/> <cd:variable name='notation' value='notation'/> <cd:variable name='note' value='note'/> @@ -627,6 +629,10 @@ <cd:constant name='align' value='ausrichtung'/> <cd:constant name='aligncharacter' value='aligncharacter'/> <cd:constant name='alignmentcharacter' value='alignmentcharacter'/> + <cd:constant name='alignmentleftsample' value='alignmentleftsample'/> + <cd:constant name='alignmentleftwidth' value='alignmentleftwidth'/> + <cd:constant name='alignmentrightsample' value='alignmentrightsample'/> + <cd:constant name='alignmentrightwidth' value='alignmentrightwidth'/> <cd:constant name='alignsymbol' value='alignsymbol'/> <cd:constant name='aligntitle' value='titelausrichten'/> <cd:constant name='alternative' value='alternative'/> @@ -693,6 +699,7 @@ <cd:constant name='bottomoffset' value='untenoffset'/> <cd:constant name='bottomspace' value='bottomspace'/> <cd:constant name='bottomstate' value='untenstatus'/> + <cd:constant name='break' value='break'/> <cd:constant name='buffer' value='buffer'/> <cd:constant name='cache' value='cache'/> <cd:constant name='calculate' value='berechnen'/> @@ -758,6 +765,7 @@ <cd:constant name='direction' value='richtung'/> <cd:constant name='directory' value='verzeichnis'/> <cd:constant name='display' value='bildschirm'/> + <cd:constant name='displaythreshold' value='displaythreshold'/> <cd:constant name='distance' value='abstand'/> <cd:constant name='domain' value='domain'/> <cd:constant name='dot' value='punkt'/> @@ -800,6 +808,7 @@ <cd:constant name='fieldoffset' value='feldoffset'/> <cd:constant name='file' value='datei'/> <cd:constant name='filler' value='filler'/> + <cd:constant name='filter' value='filter'/> <cd:constant name='filtercommand' value='filtercommand'/> <cd:constant name='finalnamesep' value='finalnamesep'/> <cd:constant name='finalpagesep' value='finalpagesep'/> @@ -847,6 +856,7 @@ <cd:constant name='headerstate' value='kopfzeilenstatus'/> <cd:constant name='headlabel' value='headlabel'/> <cd:constant name='headnumber' value='kopfnummer'/> + <cd:constant name='headseparator' value='headseparator'/> <cd:constant name='headstyle' value='kopfstil'/> <cd:constant name='height' value='hoehe'/> <cd:constant name='hfactor' value='hfaktor'/> @@ -867,6 +877,7 @@ <cd:constant name='index' value='index'/> <cd:constant name='indicator' value='indikator'/> <cd:constant name='initialsep' value='initialsep'/> + <cd:constant name='inlinethreshold' value='inlinethreshold'/> <cd:constant name='inner' value='innen'/> <cd:constant name='innermargin' value='innermargin'/> <cd:constant name='inputfile' value='inputfile'/> @@ -909,6 +920,7 @@ <cd:constant name='leftoffset' value='linkeroffset'/> <cd:constant name='leftquotation' value='linkerzitat'/> <cd:constant name='leftquote' value='linkerzitieren'/> + <cd:constant name='leftsample' value='leftsample'/> <cd:constant name='leftsentence' value='linkersatz'/> <cd:constant name='leftspeech' value='leftspeech'/> <cd:constant name='leftstyle' value='linkerstil'/> @@ -981,6 +993,7 @@ <cd:constant name='nlines' value='zzeile'/> <cd:constant name='norm' value='norm'/> <cd:constant name='note' value='note'/> + <cd:constant name='notes' value='notes'/> <cd:constant name='nr' value='nr'/> <cd:constant name='nright' value='nrechts'/> <cd:constant name='ntop' value='noben'/> @@ -1000,6 +1013,7 @@ <cd:constant name='numberset' value='numberset'/> <cd:constant name='numberstarter' value='numberstarter'/> <cd:constant name='numberstopper' value='numberstopper'/> + <cd:constant name='numberstrut' value='numberstrut'/> <cd:constant name='numberstyle' value='nummernstil'/> <cd:constant name='numberwidth' value='numberwidth'/> <cd:constant name='nx' value='nx'/> @@ -1069,6 +1083,7 @@ <cd:constant name='preview' value='vorschau'/> <cd:constant name='previous' value='vorige'/> <cd:constant name='previousnumber' value='vorigenummer'/> + <cd:constant name='print' value='print'/> <cd:constant name='printable' value='druckbar'/> <cd:constant name='process' value='process'/> <cd:constant name='profile' value='profile'/> @@ -1111,6 +1126,7 @@ <cd:constant name='rightoffset' value='rechterabstand'/> <cd:constant name='rightquotation' value='rechterzitat'/> <cd:constant name='rightquote' value='rechterzitieren'/> + <cd:constant name='rightsample' value='rightsample'/> <cd:constant name='rightsentence' value='rechtersatz'/> <cd:constant name='rightspeech' value='rightspeech'/> <cd:constant name='rightstyle' value='rechterstil'/> @@ -1153,7 +1169,10 @@ <cd:constant name='sidemethod' value='sidemethod'/> <cd:constant name='sidespaceafter' value='nebennachspatium'/> <cd:constant name='sidespacebefore' value='nebenvorspatium'/> + <cd:constant name='sidespaceinbetween' value='sidespaceinbetween'/> + <cd:constant name='sidethreshold' value='sidethreshold'/> <cd:constant name='sign' value='zeichen'/> + <cd:constant name='simplecommand' value='simplecommand'/> <cd:constant name='size' value='groesse'/> <cd:constant name='slantedfeatures' value='slantedfeatures'/> <cd:constant name='slantedfont' value='slantedfont'/> @@ -1166,7 +1185,9 @@ <cd:constant name='source' value='quelle'/> <cd:constant name='space' value='spatium'/> <cd:constant name='spaceafter' value='nachspatium'/> + <cd:constant name='spaceafterside' value='spaceafterside'/> <cd:constant name='spacebefore' value='vorspatium'/> + <cd:constant name='spacebeforeside' value='spacebeforeside'/> <cd:constant name='spaceinbetween' value='spaceinbetween'/> <cd:constant name='spacing' value='spatiumausgleich'/> <cd:constant name='specification' value='specification'/> @@ -1231,6 +1252,7 @@ <cd:constant name='titledistance' value='titelabstand'/> <cd:constant name='titleleft' value='titleleft'/> <cd:constant name='titleright' value='titleright'/> + <cd:constant name='titlestrut' value='titlestrut'/> <cd:constant name='titlestyle' value='titelstil'/> <cd:constant name='to' value='zu'/> <cd:constant name='toffset' value='toffset'/> diff --git a/tex/context/interface/mkii/keys-en.xml b/tex/context/interface/mkii/keys-en.xml index a1c935db8..dccff3a98 100644 --- a/tex/context/interface/mkii/keys-en.xml +++ b/tex/context/interface/mkii/keys-en.xml @@ -188,6 +188,7 @@ <cd:variable name='extremestretch' value='extremestretch'/> <cd:variable name='fact' value='fact'/> <cd:variable name='february' value='february'/> + <cd:variable name='field' value='field'/> <cd:variable name='figure' value='figure'/> <cd:variable name='figures' value='figures'/> <cd:variable name='file' value='file'/> @@ -379,6 +380,7 @@ <cd:variable name='norepeat' value='norepeat'/> <cd:variable name='normal' value='normal'/> <cd:variable name='nospacing' value='nospacing'/> + <cd:variable name='nostopper' value='nostopper'/> <cd:variable name='not' value='not'/> <cd:variable name='notation' value='notation'/> <cd:variable name='note' value='note'/> @@ -627,6 +629,10 @@ <cd:constant name='align' value='align'/> <cd:constant name='aligncharacter' value='aligncharacter'/> <cd:constant name='alignmentcharacter' value='alignmentcharacter'/> + <cd:constant name='alignmentleftsample' value='alignmentleftsample'/> + <cd:constant name='alignmentleftwidth' value='alignmentleftwidth'/> + <cd:constant name='alignmentrightsample' value='alignmentrightsample'/> + <cd:constant name='alignmentrightwidth' value='alignmentrightwidth'/> <cd:constant name='alignsymbol' value='alignsymbol'/> <cd:constant name='aligntitle' value='aligntitle'/> <cd:constant name='alternative' value='alternative'/> @@ -693,6 +699,7 @@ <cd:constant name='bottomoffset' value='bottomoffset'/> <cd:constant name='bottomspace' value='bottomspace'/> <cd:constant name='bottomstate' value='bottomstate'/> + <cd:constant name='break' value='break'/> <cd:constant name='buffer' value='buffer'/> <cd:constant name='cache' value='cache'/> <cd:constant name='calculate' value='calculate'/> @@ -758,6 +765,7 @@ <cd:constant name='direction' value='direction'/> <cd:constant name='directory' value='directory'/> <cd:constant name='display' value='display'/> + <cd:constant name='displaythreshold' value='displaythreshold'/> <cd:constant name='distance' value='distance'/> <cd:constant name='domain' value='domain'/> <cd:constant name='dot' value='dot'/> @@ -800,6 +808,7 @@ <cd:constant name='fieldoffset' value='fieldoffset'/> <cd:constant name='file' value='file'/> <cd:constant name='filler' value='filler'/> + <cd:constant name='filter' value='filter'/> <cd:constant name='filtercommand' value='filtercommand'/> <cd:constant name='finalnamesep' value='finalnamesep'/> <cd:constant name='finalpagesep' value='finalpagesep'/> @@ -847,6 +856,7 @@ <cd:constant name='headerstate' value='headerstate'/> <cd:constant name='headlabel' value='headlabel'/> <cd:constant name='headnumber' value='headnumber'/> + <cd:constant name='headseparator' value='headseparator'/> <cd:constant name='headstyle' value='headstyle'/> <cd:constant name='height' value='height'/> <cd:constant name='hfactor' value='hfactor'/> @@ -867,6 +877,7 @@ <cd:constant name='index' value='index'/> <cd:constant name='indicator' value='indicator'/> <cd:constant name='initialsep' value='initialsep'/> + <cd:constant name='inlinethreshold' value='inlinethreshold'/> <cd:constant name='inner' value='inner'/> <cd:constant name='innermargin' value='innermargin'/> <cd:constant name='inputfile' value='inputfile'/> @@ -909,6 +920,7 @@ <cd:constant name='leftoffset' value='leftoffset'/> <cd:constant name='leftquotation' value='leftquotation'/> <cd:constant name='leftquote' value='leftquote'/> + <cd:constant name='leftsample' value='leftsample'/> <cd:constant name='leftsentence' value='leftsentence'/> <cd:constant name='leftspeech' value='leftspeech'/> <cd:constant name='leftstyle' value='leftstyle'/> @@ -981,6 +993,7 @@ <cd:constant name='nlines' value='nlines'/> <cd:constant name='norm' value='norm'/> <cd:constant name='note' value='note'/> + <cd:constant name='notes' value='notes'/> <cd:constant name='nr' value='nr'/> <cd:constant name='nright' value='nright'/> <cd:constant name='ntop' value='ntop'/> @@ -1000,6 +1013,7 @@ <cd:constant name='numberset' value='numberset'/> <cd:constant name='numberstarter' value='numberstarter'/> <cd:constant name='numberstopper' value='numberstopper'/> + <cd:constant name='numberstrut' value='numberstrut'/> <cd:constant name='numberstyle' value='numberstyle'/> <cd:constant name='numberwidth' value='numberwidth'/> <cd:constant name='nx' value='nx'/> @@ -1069,6 +1083,7 @@ <cd:constant name='preview' value='preview'/> <cd:constant name='previous' value='previous'/> <cd:constant name='previousnumber' value='previousnumber'/> + <cd:constant name='print' value='print'/> <cd:constant name='printable' value='printable'/> <cd:constant name='process' value='process'/> <cd:constant name='profile' value='profile'/> @@ -1111,6 +1126,7 @@ <cd:constant name='rightoffset' value='rightoffset'/> <cd:constant name='rightquotation' value='rightquotation'/> <cd:constant name='rightquote' value='rightquote'/> + <cd:constant name='rightsample' value='rightsample'/> <cd:constant name='rightsentence' value='rightsentence'/> <cd:constant name='rightspeech' value='rightspeech'/> <cd:constant name='rightstyle' value='rightstyle'/> @@ -1153,7 +1169,10 @@ <cd:constant name='sidemethod' value='sidemethod'/> <cd:constant name='sidespaceafter' value='sidespaceafter'/> <cd:constant name='sidespacebefore' value='sidespacebefore'/> + <cd:constant name='sidespaceinbetween' value='sidespaceinbetween'/> + <cd:constant name='sidethreshold' value='sidethreshold'/> <cd:constant name='sign' value='sign'/> + <cd:constant name='simplecommand' value='simplecommand'/> <cd:constant name='size' value='size'/> <cd:constant name='slantedfeatures' value='slantedfeatures'/> <cd:constant name='slantedfont' value='slantedfont'/> @@ -1166,7 +1185,9 @@ <cd:constant name='source' value='source'/> <cd:constant name='space' value='space'/> <cd:constant name='spaceafter' value='spaceafter'/> + <cd:constant name='spaceafterside' value='spaceafterside'/> <cd:constant name='spacebefore' value='spacebefore'/> + <cd:constant name='spacebeforeside' value='spacebeforeside'/> <cd:constant name='spaceinbetween' value='spaceinbetween'/> <cd:constant name='spacing' value='spacing'/> <cd:constant name='specification' value='specification'/> @@ -1231,6 +1252,7 @@ <cd:constant name='titledistance' value='titledistance'/> <cd:constant name='titleleft' value='titleleft'/> <cd:constant name='titleright' value='titleright'/> + <cd:constant name='titlestrut' value='titlestrut'/> <cd:constant name='titlestyle' value='titlestyle'/> <cd:constant name='to' value='to'/> <cd:constant name='toffset' value='toffset'/> diff --git a/tex/context/interface/mkii/keys-fr.xml b/tex/context/interface/mkii/keys-fr.xml index db6e35ac6..ab256770c 100644 --- a/tex/context/interface/mkii/keys-fr.xml +++ b/tex/context/interface/mkii/keys-fr.xml @@ -188,6 +188,7 @@ <cd:variable name='extremestretch' value='extremestretch'/> <cd:variable name='fact' value='fait'/> <cd:variable name='february' value='fevrier'/> + <cd:variable name='field' value='field'/> <cd:variable name='figure' value='figure'/> <cd:variable name='figures' value='figures'/> <cd:variable name='file' value='fichier'/> @@ -379,6 +380,7 @@ <cd:variable name='norepeat' value='norepeat'/> <cd:variable name='normal' value='normal'/> <cd:variable name='nospacing' value='sansespacement'/> + <cd:variable name='nostopper' value='nostopper'/> <cd:variable name='not' value='pas'/> <cd:variable name='notation' value='notation'/> <cd:variable name='note' value='note'/> @@ -627,6 +629,10 @@ <cd:constant name='align' value='alignement'/> <cd:constant name='aligncharacter' value='caracterealigne'/> <cd:constant name='alignmentcharacter' value='alignementcaractere'/> + <cd:constant name='alignmentleftsample' value='alignmentleftsample'/> + <cd:constant name='alignmentleftwidth' value='alignmentleftwidth'/> + <cd:constant name='alignmentrightsample' value='alignmentrightsample'/> + <cd:constant name='alignmentrightwidth' value='alignmentrightwidth'/> <cd:constant name='alignsymbol' value='alignsymbol'/> <cd:constant name='aligntitle' value='alignementtitre'/> <cd:constant name='alternative' value='alternative'/> @@ -693,6 +699,7 @@ <cd:constant name='bottomoffset' value='decalageinf'/> <cd:constant name='bottomspace' value='espaceinf'/> <cd:constant name='bottomstate' value='etatinf'/> + <cd:constant name='break' value='break'/> <cd:constant name='buffer' value='buffer'/> <cd:constant name='cache' value='cache'/> <cd:constant name='calculate' value='calculer'/> @@ -758,6 +765,7 @@ <cd:constant name='direction' value='direction'/> <cd:constant name='directory' value='repertoire'/> <cd:constant name='display' value='affichage'/> + <cd:constant name='displaythreshold' value='displaythreshold'/> <cd:constant name='distance' value='distance'/> <cd:constant name='domain' value='domain'/> <cd:constant name='dot' value='point'/> @@ -800,6 +808,7 @@ <cd:constant name='fieldoffset' value='offsetchamp'/> <cd:constant name='file' value='fichier'/> <cd:constant name='filler' value='filler'/> + <cd:constant name='filter' value='filter'/> <cd:constant name='filtercommand' value='filtercommand'/> <cd:constant name='finalnamesep' value='finalnamesep'/> <cd:constant name='finalpagesep' value='finalpagesep'/> @@ -847,6 +856,7 @@ <cd:constant name='headerstate' value='etatentete'/> <cd:constant name='headlabel' value='etiquettetete'/> <cd:constant name='headnumber' value='numerotete'/> + <cd:constant name='headseparator' value='headseparator'/> <cd:constant name='headstyle' value='styletete'/> <cd:constant name='height' value='hauteur'/> <cd:constant name='hfactor' value='facteurhauteur'/> @@ -867,6 +877,7 @@ <cd:constant name='index' value='index'/> <cd:constant name='indicator' value='indicateur'/> <cd:constant name='initialsep' value='initialsep'/> + <cd:constant name='inlinethreshold' value='inlinethreshold'/> <cd:constant name='inner' value='interieur'/> <cd:constant name='innermargin' value='margeinterieure'/> <cd:constant name='inputfile' value='fichierentree'/> @@ -909,6 +920,7 @@ <cd:constant name='leftoffset' value='decalagegauche'/> <cd:constant name='leftquotation' value='citationgauche'/> <cd:constant name='leftquote' value='citergauche'/> + <cd:constant name='leftsample' value='leftsample'/> <cd:constant name='leftsentence' value='phrasegauche'/> <cd:constant name='leftspeech' value='leftspeech'/> <cd:constant name='leftstyle' value='leftstyle'/> @@ -981,6 +993,7 @@ <cd:constant name='nlines' value='nlignes'/> <cd:constant name='norm' value='norme'/> <cd:constant name='note' value='note'/> + <cd:constant name='notes' value='notes'/> <cd:constant name='nr' value='nr'/> <cd:constant name='nright' value='ndroite'/> <cd:constant name='ntop' value='nsup'/> @@ -1000,6 +1013,7 @@ <cd:constant name='numberset' value='numberset'/> <cd:constant name='numberstarter' value='numberstarter'/> <cd:constant name='numberstopper' value='numberstopper'/> + <cd:constant name='numberstrut' value='numberstrut'/> <cd:constant name='numberstyle' value='stylenumero'/> <cd:constant name='numberwidth' value='numberwidth'/> <cd:constant name='nx' value='nx'/> @@ -1069,6 +1083,7 @@ <cd:constant name='preview' value='previsualisation'/> <cd:constant name='previous' value='precedent'/> <cd:constant name='previousnumber' value='numeroprecedent'/> + <cd:constant name='print' value='print'/> <cd:constant name='printable' value='editable'/> <cd:constant name='process' value='process'/> <cd:constant name='profile' value='profile'/> @@ -1111,6 +1126,7 @@ <cd:constant name='rightoffset' value='rightoffset'/> <cd:constant name='rightquotation' value='citationdroite'/> <cd:constant name='rightquote' value='citerdroite'/> + <cd:constant name='rightsample' value='rightsample'/> <cd:constant name='rightsentence' value='phrasedroite'/> <cd:constant name='rightspeech' value='rightspeech'/> <cd:constant name='rightstyle' value='styledroit'/> @@ -1153,7 +1169,10 @@ <cd:constant name='sidemethod' value='sidemethod'/> <cd:constant name='sidespaceafter' value='espacelateralapres'/> <cd:constant name='sidespacebefore' value='espacelateralavant'/> + <cd:constant name='sidespaceinbetween' value='sidespaceinbetween'/> + <cd:constant name='sidethreshold' value='sidethreshold'/> <cd:constant name='sign' value='signe'/> + <cd:constant name='simplecommand' value='simplecommand'/> <cd:constant name='size' value='dimension'/> <cd:constant name='slantedfeatures' value='slantedfeatures'/> <cd:constant name='slantedfont' value='slantedfont'/> @@ -1166,7 +1185,9 @@ <cd:constant name='source' value='origine'/> <cd:constant name='space' value='espace'/> <cd:constant name='spaceafter' value='espaceapres'/> + <cd:constant name='spaceafterside' value='spaceafterside'/> <cd:constant name='spacebefore' value='espaceavant'/> + <cd:constant name='spacebeforeside' value='spacebeforeside'/> <cd:constant name='spaceinbetween' value='spaceinbetween'/> <cd:constant name='spacing' value='espacement'/> <cd:constant name='specification' value='specification'/> @@ -1231,6 +1252,7 @@ <cd:constant name='titledistance' value='distancetitre'/> <cd:constant name='titleleft' value='titleleft'/> <cd:constant name='titleright' value='titleright'/> + <cd:constant name='titlestrut' value='titlestrut'/> <cd:constant name='titlestyle' value='styletitre'/> <cd:constant name='to' value='vers'/> <cd:constant name='toffset' value='toffset'/> diff --git a/tex/context/interface/mkii/keys-it.xml b/tex/context/interface/mkii/keys-it.xml index 86d6868b4..da7970619 100644 --- a/tex/context/interface/mkii/keys-it.xml +++ b/tex/context/interface/mkii/keys-it.xml @@ -188,6 +188,7 @@ <cd:variable name='extremestretch' value='extremestretch'/> <cd:variable name='fact' value='fatto'/> <cd:variable name='february' value='febbraio'/> + <cd:variable name='field' value='field'/> <cd:variable name='figure' value='figura'/> <cd:variable name='figures' value='figure'/> <cd:variable name='file' value='file'/> @@ -379,6 +380,7 @@ <cd:variable name='norepeat' value='norepeat'/> <cd:variable name='normal' value='normale'/> <cd:variable name='nospacing' value='nospacing'/> + <cd:variable name='nostopper' value='nostopper'/> <cd:variable name='not' value='non'/> <cd:variable name='notation' value='notation'/> <cd:variable name='note' value='note'/> @@ -627,6 +629,10 @@ <cd:constant name='align' value='allinea'/> <cd:constant name='aligncharacter' value='allineacarattere'/> <cd:constant name='alignmentcharacter' value='carattereallineamento'/> + <cd:constant name='alignmentleftsample' value='alignmentleftsample'/> + <cd:constant name='alignmentleftwidth' value='alignmentleftwidth'/> + <cd:constant name='alignmentrightsample' value='alignmentrightsample'/> + <cd:constant name='alignmentrightwidth' value='alignmentrightwidth'/> <cd:constant name='alignsymbol' value='alignsymbol'/> <cd:constant name='aligntitle' value='allineatitolo'/> <cd:constant name='alternative' value='alternativa'/> @@ -693,6 +699,7 @@ <cd:constant name='bottomoffset' value='offsetfondo'/> <cd:constant name='bottomspace' value='spaziofondo'/> <cd:constant name='bottomstate' value='statofondo'/> + <cd:constant name='break' value='break'/> <cd:constant name='buffer' value='buffer'/> <cd:constant name='cache' value='cache'/> <cd:constant name='calculate' value='calcola'/> @@ -758,6 +765,7 @@ <cd:constant name='direction' value='direzione'/> <cd:constant name='directory' value='directory'/> <cd:constant name='display' value='display'/> + <cd:constant name='displaythreshold' value='displaythreshold'/> <cd:constant name='distance' value='distanza'/> <cd:constant name='domain' value='domain'/> <cd:constant name='dot' value='punto'/> @@ -800,6 +808,7 @@ <cd:constant name='fieldoffset' value='offsetcampo'/> <cd:constant name='file' value='file'/> <cd:constant name='filler' value='filler'/> + <cd:constant name='filter' value='filter'/> <cd:constant name='filtercommand' value='filtercommand'/> <cd:constant name='finalnamesep' value='finalnamesep'/> <cd:constant name='finalpagesep' value='finalpagesep'/> @@ -847,6 +856,7 @@ <cd:constant name='headerstate' value='statointestazione'/> <cd:constant name='headlabel' value='etichettatesta'/> <cd:constant name='headnumber' value='numerotesta'/> + <cd:constant name='headseparator' value='headseparator'/> <cd:constant name='headstyle' value='stiletesta'/> <cd:constant name='height' value='altezza'/> <cd:constant name='hfactor' value='hfactor'/> @@ -867,6 +877,7 @@ <cd:constant name='index' value='index'/> <cd:constant name='indicator' value='indicatore'/> <cd:constant name='initialsep' value='initialsep'/> + <cd:constant name='inlinethreshold' value='inlinethreshold'/> <cd:constant name='inner' value='interno'/> <cd:constant name='innermargin' value='margineinterno'/> <cd:constant name='inputfile' value='inputfile'/> @@ -909,6 +920,7 @@ <cd:constant name='leftoffset' value='offsetsinistro'/> <cd:constant name='leftquotation' value='citazionesinistra'/> <cd:constant name='leftquote' value='menzionesinistra'/> + <cd:constant name='leftsample' value='leftsample'/> <cd:constant name='leftsentence' value='frasesinistra'/> <cd:constant name='leftspeech' value='leftspeech'/> <cd:constant name='leftstyle' value='stilesinistra'/> @@ -981,6 +993,7 @@ <cd:constant name='nlines' value='nrighe'/> <cd:constant name='norm' value='norma'/> <cd:constant name='note' value='note'/> + <cd:constant name='notes' value='notes'/> <cd:constant name='nr' value='nr'/> <cd:constant name='nright' value='ndestra'/> <cd:constant name='ntop' value='ncima'/> @@ -1000,6 +1013,7 @@ <cd:constant name='numberset' value='numberset'/> <cd:constant name='numberstarter' value='numberstarter'/> <cd:constant name='numberstopper' value='numberstopper'/> + <cd:constant name='numberstrut' value='numberstrut'/> <cd:constant name='numberstyle' value='stilenumero'/> <cd:constant name='numberwidth' value='numberwidth'/> <cd:constant name='nx' value='nx'/> @@ -1069,6 +1083,7 @@ <cd:constant name='preview' value='anteprima'/> <cd:constant name='previous' value='precedente'/> <cd:constant name='previousnumber' value='numeroprecedente'/> + <cd:constant name='print' value='print'/> <cd:constant name='printable' value='stampabile'/> <cd:constant name='process' value='process'/> <cd:constant name='profile' value='profile'/> @@ -1111,6 +1126,7 @@ <cd:constant name='rightoffset' value='offsetdestro'/> <cd:constant name='rightquotation' value='citazionedestra'/> <cd:constant name='rightquote' value='menzionedestra'/> + <cd:constant name='rightsample' value='rightsample'/> <cd:constant name='rightsentence' value='frasedestra'/> <cd:constant name='rightspeech' value='rightspeech'/> <cd:constant name='rightstyle' value='stiledestra'/> @@ -1153,7 +1169,10 @@ <cd:constant name='sidemethod' value='sidemethod'/> <cd:constant name='sidespaceafter' value='spaziolateraledopo'/> <cd:constant name='sidespacebefore' value='spaziolateraleprima'/> + <cd:constant name='sidespaceinbetween' value='sidespaceinbetween'/> + <cd:constant name='sidethreshold' value='sidethreshold'/> <cd:constant name='sign' value='segno'/> + <cd:constant name='simplecommand' value='simplecommand'/> <cd:constant name='size' value='dimensione'/> <cd:constant name='slantedfeatures' value='slantedfeatures'/> <cd:constant name='slantedfont' value='slantedfont'/> @@ -1166,7 +1185,9 @@ <cd:constant name='source' value='origine'/> <cd:constant name='space' value='spazio'/> <cd:constant name='spaceafter' value='spaziodopo'/> + <cd:constant name='spaceafterside' value='spaceafterside'/> <cd:constant name='spacebefore' value='spazioprima'/> + <cd:constant name='spacebeforeside' value='spacebeforeside'/> <cd:constant name='spaceinbetween' value='spaceinbetween'/> <cd:constant name='spacing' value='spaziatura'/> <cd:constant name='specification' value='specification'/> @@ -1231,6 +1252,7 @@ <cd:constant name='titledistance' value='distanzatitolo'/> <cd:constant name='titleleft' value='titleleft'/> <cd:constant name='titleright' value='titleright'/> + <cd:constant name='titlestrut' value='titlestrut'/> <cd:constant name='titlestyle' value='stiletitolo'/> <cd:constant name='to' value='verso'/> <cd:constant name='toffset' value='toffset'/> diff --git a/tex/context/interface/mkii/keys-nl.xml b/tex/context/interface/mkii/keys-nl.xml index 1c6077d1e..212685d44 100644 --- a/tex/context/interface/mkii/keys-nl.xml +++ b/tex/context/interface/mkii/keys-nl.xml @@ -379,6 +379,7 @@ <cd:variable name='norepeat' value='norepeat'/> <cd:variable name='normal' value='normaal'/> <cd:variable name='nospacing' value='geenspatiering'/> + <cd:variable name='nostopper' value='geenafsluiter'/> <cd:variable name='not' value='niet'/> <cd:variable name='notation' value='notation'/> <cd:variable name='note' value='note'/> @@ -627,6 +628,10 @@ <cd:constant name='align' value='uitlijnen'/> <cd:constant name='aligncharacter' value='karakteruitlijnen'/> <cd:constant name='alignmentcharacter' value='uitlijnkarakter'/> + <cd:constant name='alignmentleftsample' value='alignmentleftsample'/> + <cd:constant name='alignmentleftwidth' value='alignmentleftwidth'/> + <cd:constant name='alignmentrightsample' value='alignmentrightsample'/> + <cd:constant name='alignmentrightwidth' value='alignmentrightwidth'/> <cd:constant name='alignsymbol' value='alignsymbol'/> <cd:constant name='aligntitle' value='titeluitlijnen'/> <cd:constant name='alternative' value='variant'/> @@ -693,6 +698,7 @@ <cd:constant name='bottomoffset' value='onderoffset'/> <cd:constant name='bottomspace' value='bodemwit'/> <cd:constant name='bottomstate' value='onderstatus'/> + <cd:constant name='break' value='break'/> <cd:constant name='buffer' value='buffer'/> <cd:constant name='cache' value='cache'/> <cd:constant name='calculate' value='bereken'/> @@ -758,6 +764,7 @@ <cd:constant name='direction' value='richting'/> <cd:constant name='directory' value='directory'/> <cd:constant name='display' value='scherm'/> + <cd:constant name='displaythreshold' value='displaythreshold'/> <cd:constant name='distance' value='afstand'/> <cd:constant name='domain' value='domain'/> <cd:constant name='dot' value='punt'/> @@ -800,6 +807,7 @@ <cd:constant name='fieldoffset' value='veldoffset'/> <cd:constant name='file' value='file'/> <cd:constant name='filler' value='filler'/> + <cd:constant name='filter' value='filter'/> <cd:constant name='filtercommand' value='filtercommand'/> <cd:constant name='finalnamesep' value='finalnamesep'/> <cd:constant name='finalpagesep' value='finalpagesep'/> @@ -867,6 +875,7 @@ <cd:constant name='index' value='index'/> <cd:constant name='indicator' value='aanduiding'/> <cd:constant name='initialsep' value='initialsep'/> + <cd:constant name='inlinethreshold' value='inlinethreshold'/> <cd:constant name='inner' value='binnen'/> <cd:constant name='innermargin' value='binnenmarge'/> <cd:constant name='inputfile' value='inputfile'/> @@ -909,6 +918,7 @@ <cd:constant name='leftoffset' value='linkeroffset'/> <cd:constant name='leftquotation' value='linkercitaat'/> <cd:constant name='leftquote' value='linkerciteer'/> + <cd:constant name='leftsample' value='leftsample'/> <cd:constant name='leftsentence' value='linkerzin'/> <cd:constant name='leftspeech' value='linkeruitspraak'/> <cd:constant name='leftstyle' value='linkerletter'/> @@ -980,7 +990,8 @@ <cd:constant name='nleft' value='nlinks'/> <cd:constant name='nlines' value='nregels'/> <cd:constant name='norm' value='norm'/> - <cd:constant name='note' value='note'/> + <cd:constant name='note' value='noot'/> + <cd:constant name='notes' value='noten'/> <cd:constant name='nr' value='nr'/> <cd:constant name='nright' value='nrechts'/> <cd:constant name='ntop' value='nboven'/> @@ -1000,6 +1011,7 @@ <cd:constant name='numberset' value='numberset'/> <cd:constant name='numberstarter' value='numberstarter'/> <cd:constant name='numberstopper' value='numberstopper'/> + <cd:constant name='numberstrut' value='nummerstrut'/> <cd:constant name='numberstyle' value='nummerletter'/> <cd:constant name='numberwidth' value='nummerbreedte'/> <cd:constant name='nx' value='nx'/> @@ -1111,6 +1123,7 @@ <cd:constant name='rightoffset' value='rechteroffset'/> <cd:constant name='rightquotation' value='rechtercitaat'/> <cd:constant name='rightquote' value='rechterciteer'/> + <cd:constant name='rightsample' value='rightsample'/> <cd:constant name='rightsentence' value='rechterzin'/> <cd:constant name='rightspeech' value='rechteruitspraak'/> <cd:constant name='rightstyle' value='rechterletter'/> @@ -1153,6 +1166,7 @@ <cd:constant name='sidemethod' value='zijmethode'/> <cd:constant name='sidespaceafter' value='zijnawit'/> <cd:constant name='sidespacebefore' value='zijvoorwit'/> + <cd:constant name='sidethreshold' value='sidethreshold'/> <cd:constant name='sign' value='teken'/> <cd:constant name='size' value='formaat'/> <cd:constant name='slantedfeatures' value='slantedfeatures'/> @@ -1166,7 +1180,9 @@ <cd:constant name='source' value='bron'/> <cd:constant name='space' value='spatie'/> <cd:constant name='spaceafter' value='nawit'/> + <cd:constant name='spaceafterside' value='witnazij'/> <cd:constant name='spacebefore' value='voorwit'/> + <cd:constant name='spacebeforeside' value='witvoorzij'/> <cd:constant name='spaceinbetween' value='tussenwit'/> <cd:constant name='spacing' value='spatiering'/> <cd:constant name='specification' value='specification'/> @@ -1231,6 +1247,7 @@ <cd:constant name='titledistance' value='titelafstand'/> <cd:constant name='titleleft' value='titellinks'/> <cd:constant name='titleright' value='titelrechts'/> + <cd:constant name='titlestrut' value='titelstrut'/> <cd:constant name='titlestyle' value='titelletter'/> <cd:constant name='to' value='aan'/> <cd:constant name='toffset' value='toffset'/> diff --git a/tex/context/interface/mkii/keys-pe.xml b/tex/context/interface/mkii/keys-pe.xml index 91f778c5e..e587e1d6e 100644 --- a/tex/context/interface/mkii/keys-pe.xml +++ b/tex/context/interface/mkii/keys-pe.xml @@ -188,6 +188,7 @@ <cd:variable name='extremestretch' value='extremestretch'/> <cd:variable name='fact' value='fact'/> <cd:variable name='february' value='فوریه'/> + <cd:variable name='field' value='field'/> <cd:variable name='figure' value='شکل'/> <cd:variable name='figures' value='شکلها'/> <cd:variable name='file' value='پرونده'/> @@ -379,6 +380,7 @@ <cd:variable name='norepeat' value='norepeat'/> <cd:variable name='normal' value='نرمال'/> <cd:variable name='nospacing' value='بدونفضاگذاری'/> + <cd:variable name='nostopper' value='nostopper'/> <cd:variable name='not' value='بدون'/> <cd:variable name='notation' value='notation'/> <cd:variable name='note' value='note'/> @@ -627,6 +629,10 @@ <cd:constant name='align' value='تنظیم'/> <cd:constant name='aligncharacter' value='حرفتنظیم'/> <cd:constant name='alignmentcharacter' value='حرفتنظیمکردن'/> + <cd:constant name='alignmentleftsample' value='alignmentleftsample'/> + <cd:constant name='alignmentleftwidth' value='alignmentleftwidth'/> + <cd:constant name='alignmentrightsample' value='alignmentrightsample'/> + <cd:constant name='alignmentrightwidth' value='alignmentrightwidth'/> <cd:constant name='alignsymbol' value='alignsymbol'/> <cd:constant name='aligntitle' value='عنوانتنظیم'/> <cd:constant name='alternative' value='جایگزین'/> @@ -693,6 +699,7 @@ <cd:constant name='bottomoffset' value='آفستپایین'/> <cd:constant name='bottomspace' value='فضایپایین'/> <cd:constant name='bottomstate' value='وضعیتپایین'/> + <cd:constant name='break' value='break'/> <cd:constant name='buffer' value='buffer'/> <cd:constant name='cache' value='میانگیر'/> <cd:constant name='calculate' value='محاسبه'/> @@ -758,6 +765,7 @@ <cd:constant name='direction' value='جهت'/> <cd:constant name='directory' value='پوشه'/> <cd:constant name='display' value='نمایش'/> + <cd:constant name='displaythreshold' value='displaythreshold'/> <cd:constant name='distance' value='فاصله'/> <cd:constant name='domain' value='domain'/> <cd:constant name='dot' value='نقطه'/> @@ -800,6 +808,7 @@ <cd:constant name='fieldoffset' value='آفستمیدان'/> <cd:constant name='file' value='پرونده'/> <cd:constant name='filler' value='filler'/> + <cd:constant name='filter' value='filter'/> <cd:constant name='filtercommand' value='filtercommand'/> <cd:constant name='finalnamesep' value='finalnamesep'/> <cd:constant name='finalpagesep' value='finalpagesep'/> @@ -847,6 +856,7 @@ <cd:constant name='headerstate' value='وضعیتسربرگ'/> <cd:constant name='headlabel' value='برچسبسر'/> <cd:constant name='headnumber' value='شمارهسر'/> + <cd:constant name='headseparator' value='headseparator'/> <cd:constant name='headstyle' value='سبکسر'/> <cd:constant name='height' value='ارتفاع'/> <cd:constant name='hfactor' value='عاملارتفاع'/> @@ -867,6 +877,7 @@ <cd:constant name='index' value='index'/> <cd:constant name='indicator' value='اندیکاتور'/> <cd:constant name='initialsep' value='initialsep'/> + <cd:constant name='inlinethreshold' value='inlinethreshold'/> <cd:constant name='inner' value='داخلی'/> <cd:constant name='innermargin' value='حاشیهداخلی'/> <cd:constant name='inputfile' value='پروندهورودی'/> @@ -909,6 +920,7 @@ <cd:constant name='leftoffset' value='آفستچپ'/> <cd:constant name='leftquotation' value='نقلقولچپ'/> <cd:constant name='leftquote' value='نقلچپ'/> + <cd:constant name='leftsample' value='leftsample'/> <cd:constant name='leftsentence' value='جملهچپ'/> <cd:constant name='leftspeech' value='سخنرانیچپ'/> <cd:constant name='leftstyle' value='سبکچپ'/> @@ -981,6 +993,7 @@ <cd:constant name='nlines' value='nlines'/> <cd:constant name='norm' value='norm'/> <cd:constant name='note' value='note'/> + <cd:constant name='notes' value='notes'/> <cd:constant name='nr' value='nr'/> <cd:constant name='nright' value='nright'/> <cd:constant name='ntop' value='ntop'/> @@ -1000,6 +1013,7 @@ <cd:constant name='numberset' value='numberset'/> <cd:constant name='numberstarter' value='numberstarter'/> <cd:constant name='numberstopper' value='numberstopper'/> + <cd:constant name='numberstrut' value='numberstrut'/> <cd:constant name='numberstyle' value='سبکشماره'/> <cd:constant name='numberwidth' value='عرضشماره'/> <cd:constant name='nx' value='nx'/> @@ -1069,6 +1083,7 @@ <cd:constant name='preview' value='پیشدید'/> <cd:constant name='previous' value='قبلی'/> <cd:constant name='previousnumber' value='شمارهقبلی'/> + <cd:constant name='print' value='print'/> <cd:constant name='printable' value='قابلچاپ'/> <cd:constant name='process' value='پردازش'/> <cd:constant name='profile' value='profile'/> @@ -1111,6 +1126,7 @@ <cd:constant name='rightoffset' value='آفستراست'/> <cd:constant name='rightquotation' value='نقلقولراست'/> <cd:constant name='rightquote' value='نقلراست'/> + <cd:constant name='rightsample' value='rightsample'/> <cd:constant name='rightsentence' value='جملهراست'/> <cd:constant name='rightspeech' value='سخنرانیراست'/> <cd:constant name='rightstyle' value='سبکراست'/> @@ -1153,7 +1169,10 @@ <cd:constant name='sidemethod' value='روشکنار'/> <cd:constant name='sidespaceafter' value='فضایکناریبعد'/> <cd:constant name='sidespacebefore' value='فضایکناریقبل'/> + <cd:constant name='sidespaceinbetween' value='sidespaceinbetween'/> + <cd:constant name='sidethreshold' value='sidethreshold'/> <cd:constant name='sign' value='علامت'/> + <cd:constant name='simplecommand' value='simplecommand'/> <cd:constant name='size' value='اندازه'/> <cd:constant name='slantedfeatures' value='slantedfeatures'/> <cd:constant name='slantedfont' value='slantedfont'/> @@ -1166,7 +1185,9 @@ <cd:constant name='source' value='منبع'/> <cd:constant name='space' value='فضا'/> <cd:constant name='spaceafter' value='فضابعداز'/> + <cd:constant name='spaceafterside' value='spaceafterside'/> <cd:constant name='spacebefore' value='فضاقبلاز'/> + <cd:constant name='spacebeforeside' value='spacebeforeside'/> <cd:constant name='spaceinbetween' value='فضادربین'/> <cd:constant name='spacing' value='فضاگذاری'/> <cd:constant name='specification' value='specification'/> @@ -1231,6 +1252,7 @@ <cd:constant name='titledistance' value='فاصلهعنوان'/> <cd:constant name='titleleft' value='عنوانچپ'/> <cd:constant name='titleright' value='عنوانراست'/> + <cd:constant name='titlestrut' value='titlestrut'/> <cd:constant name='titlestyle' value='سبکعنوان'/> <cd:constant name='to' value='به'/> <cd:constant name='toffset' value='toffset'/> diff --git a/tex/context/interface/mkii/keys-ro.xml b/tex/context/interface/mkii/keys-ro.xml index a4566c4b4..c0308086c 100644 --- a/tex/context/interface/mkii/keys-ro.xml +++ b/tex/context/interface/mkii/keys-ro.xml @@ -188,6 +188,7 @@ <cd:variable name='extremestretch' value='extremestretch'/> <cd:variable name='fact' value='fapt'/> <cd:variable name='february' value='februarie'/> + <cd:variable name='field' value='field'/> <cd:variable name='figure' value='figura'/> <cd:variable name='figures' value='figure'/> <cd:variable name='file' value='fisier'/> @@ -379,6 +380,7 @@ <cd:variable name='norepeat' value='norepeat'/> <cd:variable name='normal' value='normal'/> <cd:variable name='nospacing' value='nospacing'/> + <cd:variable name='nostopper' value='nostopper'/> <cd:variable name='not' value='nu'/> <cd:variable name='notation' value='notation'/> <cd:variable name='note' value='note'/> @@ -627,6 +629,10 @@ <cd:constant name='align' value='aliniere'/> <cd:constant name='aligncharacter' value='aliniazacaracter'/> <cd:constant name='alignmentcharacter' value='alierecaracter'/> + <cd:constant name='alignmentleftsample' value='alignmentleftsample'/> + <cd:constant name='alignmentleftwidth' value='alignmentleftwidth'/> + <cd:constant name='alignmentrightsample' value='alignmentrightsample'/> + <cd:constant name='alignmentrightwidth' value='alignmentrightwidth'/> <cd:constant name='alignsymbol' value='alignsymbol'/> <cd:constant name='aligntitle' value='alinieretitlu'/> <cd:constant name='alternative' value='alternativ'/> @@ -693,6 +699,7 @@ <cd:constant name='bottomoffset' value='offsetjos'/> <cd:constant name='bottomspace' value='spatiujos'/> <cd:constant name='bottomstate' value='starejos'/> + <cd:constant name='break' value='break'/> <cd:constant name='buffer' value='buffer'/> <cd:constant name='cache' value='cache'/> <cd:constant name='calculate' value='calculeaza'/> @@ -758,6 +765,7 @@ <cd:constant name='direction' value='directie'/> <cd:constant name='directory' value='director'/> <cd:constant name='display' value='display'/> + <cd:constant name='displaythreshold' value='displaythreshold'/> <cd:constant name='distance' value='distanta'/> <cd:constant name='domain' value='domain'/> <cd:constant name='dot' value='punct'/> @@ -800,6 +808,7 @@ <cd:constant name='fieldoffset' value='offsetcamp'/> <cd:constant name='file' value='fisier'/> <cd:constant name='filler' value='filler'/> + <cd:constant name='filter' value='filter'/> <cd:constant name='filtercommand' value='filtercommand'/> <cd:constant name='finalnamesep' value='finalnamesep'/> <cd:constant name='finalpagesep' value='finalpagesep'/> @@ -847,6 +856,7 @@ <cd:constant name='headerstate' value='stareantet'/> <cd:constant name='headlabel' value='etichetatitlu'/> <cd:constant name='headnumber' value='numartitlu'/> + <cd:constant name='headseparator' value='headseparator'/> <cd:constant name='headstyle' value='stiltitlu'/> <cd:constant name='height' value='inaltime'/> <cd:constant name='hfactor' value='hfactor'/> @@ -867,6 +877,7 @@ <cd:constant name='index' value='index'/> <cd:constant name='indicator' value='indicator'/> <cd:constant name='initialsep' value='initialsep'/> + <cd:constant name='inlinethreshold' value='inlinethreshold'/> <cd:constant name='inner' value='intern'/> <cd:constant name='innermargin' value='innermargin'/> <cd:constant name='inputfile' value='inputfile'/> @@ -909,6 +920,7 @@ <cd:constant name='leftoffset' value='offsetstanga'/> <cd:constant name='leftquotation' value='citatstanga'/> <cd:constant name='leftquote' value='minicitatstanga'/> + <cd:constant name='leftsample' value='leftsample'/> <cd:constant name='leftsentence' value='propozitiestanga'/> <cd:constant name='leftspeech' value='leftspeech'/> <cd:constant name='leftstyle' value='stilstanga'/> @@ -981,6 +993,7 @@ <cd:constant name='nlines' value='nlinii'/> <cd:constant name='norm' value='norm'/> <cd:constant name='note' value='note'/> + <cd:constant name='notes' value='notes'/> <cd:constant name='nr' value='nr'/> <cd:constant name='nright' value='ndreapta'/> <cd:constant name='ntop' value='nsus'/> @@ -1000,6 +1013,7 @@ <cd:constant name='numberset' value='numberset'/> <cd:constant name='numberstarter' value='numberstarter'/> <cd:constant name='numberstopper' value='numberstopper'/> + <cd:constant name='numberstrut' value='numberstrut'/> <cd:constant name='numberstyle' value='stilnumar'/> <cd:constant name='numberwidth' value='numberwidth'/> <cd:constant name='nx' value='nx'/> @@ -1069,6 +1083,7 @@ <cd:constant name='preview' value='previzualizare'/> <cd:constant name='previous' value='precendent'/> <cd:constant name='previousnumber' value='numarprecedent'/> + <cd:constant name='print' value='print'/> <cd:constant name='printable' value='tiparibil'/> <cd:constant name='process' value='process'/> <cd:constant name='profile' value='profile'/> @@ -1111,6 +1126,7 @@ <cd:constant name='rightoffset' value='offsetdreapta'/> <cd:constant name='rightquotation' value='citatdreapta'/> <cd:constant name='rightquote' value='minicitatdreapta'/> + <cd:constant name='rightsample' value='rightsample'/> <cd:constant name='rightsentence' value='propozitiedreapta'/> <cd:constant name='rightspeech' value='rightspeech'/> <cd:constant name='rightstyle' value='stildreapta'/> @@ -1153,7 +1169,10 @@ <cd:constant name='sidemethod' value='sidemethod'/> <cd:constant name='sidespaceafter' value='spatiulateraldupa'/> <cd:constant name='sidespacebefore' value='spatiulateralinainte'/> + <cd:constant name='sidespaceinbetween' value='sidespaceinbetween'/> + <cd:constant name='sidethreshold' value='sidethreshold'/> <cd:constant name='sign' value='semn'/> + <cd:constant name='simplecommand' value='simplecommand'/> <cd:constant name='size' value='dimensiune'/> <cd:constant name='slantedfeatures' value='slantedfeatures'/> <cd:constant name='slantedfont' value='slantedfont'/> @@ -1166,7 +1185,9 @@ <cd:constant name='source' value='sursa'/> <cd:constant name='space' value='spatiu'/> <cd:constant name='spaceafter' value='spatiudupa'/> + <cd:constant name='spaceafterside' value='spaceafterside'/> <cd:constant name='spacebefore' value='spatiuinainte'/> + <cd:constant name='spacebeforeside' value='spacebeforeside'/> <cd:constant name='spaceinbetween' value='spaceinbetween'/> <cd:constant name='spacing' value='spatiere'/> <cd:constant name='specification' value='specification'/> @@ -1231,6 +1252,7 @@ <cd:constant name='titledistance' value='distantatitlu'/> <cd:constant name='titleleft' value='titleleft'/> <cd:constant name='titleright' value='titleright'/> + <cd:constant name='titlestrut' value='titlestrut'/> <cd:constant name='titlestyle' value='stiltitlu'/> <cd:constant name='to' value='catre'/> <cd:constant name='toffset' value='toffset'/> diff --git a/tex/context/interface/mkiv/context-en.xml b/tex/context/interface/mkiv/context-en.xml index e8353dbdc..4cfb3c7fe 100644 --- a/tex/context/interface/mkiv/context-en.xml +++ b/tex/context/interface/mkiv/context-en.xml @@ -1,8 +1,587 @@ <?xml version='1.0'?> <!-- expanded and compacted i-context.xml --> <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> + <cd:interface file="i-accent.xml"> + <cd:command file="enco-ini.mkiv" level="style" name="defineaccent"> + <cd:arguments> + <cd:keywords delimiters="none"> + <cd:constant type="cd:character"/> + </cd:keywords> + <cd:keywords delimiters="none"> + <cd:constant type="cd:character"/> + </cd:keywords> + <cd:keywords delimiters="none"> + <cd:constant type="cd:character"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command file="enco-ini.mkiv" level="style" name="definecharacter"> + <cd:arguments> + <cd:keywords delimiters="none"> + <cd:constant type="cd:character"/> + </cd:keywords> + <cd:keywords delimiters="none"> + <cd:constant type="cd:number"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command file="enco-ini.mkiv" level="style" name="definecommand"> + <cd:arguments> + <cd:keywords delimiters="none"> + <cd:constant type="cd:character"/> + </cd:keywords> + <cd:keywords delimiters="none"> + <cd:constant type="cd:command"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command file="enco-ini.mkiv" level="style" name="definemathaccent"> + <cd:arguments> + <cd:keywords delimiters="none"> + <cd:constant type="cd:name"/> + </cd:keywords> + <cd:keywords delimiters="none"> + <cd:constant type="cd:character"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command file="enco-ini.mkiv" level="style" name="buildmathaccent"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:character"/> + </cd:keywords> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:character"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command file="enco-ini.mkiv" level="style" name="buildtextaccent"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:character"/> + </cd:keywords> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:character"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command file="enco-ini.mkiv" level="style" name="buildtextmacron"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:character"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command file="enco-ini.mkiv" level="style" name="buildtextbottomdot"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:character"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command file="enco-ini.mkiv" level="style" name="buildtextcedilla"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:character"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command file="enco-ini.mkiv" level="style" name="buildtextognek"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:character"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command file="enco-ini.mkiv" level="style" name="buildtextbottomcomma"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:character"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command file="enco-ini.mkiv" level="style" name="d"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:character"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command file="enco-ini.mkiv" level="style" name="buildtextgrave"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:character"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command category="mathematics" file="math-acc.mkvi" level="document" name="acute"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:character"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command category="mathematics" file="math-acc.mkvi" level="document" name="grave"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:character"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command category="mathematics" file="math-acc.mkvi" level="document" name="ddot"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:character"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command category="mathematics" file="math-acc.mkvi" level="document" name="tilde"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:character"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command category="mathematics" file="math-acc.mkvi" level="document" name="bar"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:character"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command category="mathematics" file="math-acc.mkvi" level="document" name="breve"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:character"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command category="mathematics" file="math-acc.mkvi" level="document" name="check"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:character"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command category="mathematics" file="math-acc.mkvi" level="document" name="hat"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:character"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command category="mathematics" file="math-acc.mkvi" level="document" name="vec"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:character"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command category="mathematics" file="math-acc.mkvi" level="document" name="dot"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:character"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command category="mathematics" file="math-acc.mkvi" level="document" name="ring"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:character"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command category="mathematics" file="math-acc.mkvi" level="document" name="dddot"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:character"/> + </cd:keywords> + </cd:arguments> + </cd:command> + </cd:interface> + <cd:interface file="i-align.xml"> + <cd:command category="alignment" file="spac-ali.mkiv" level="style" name="setupalign"> + <cd:arguments> + <cd:keywords list="yes"> + <cd:constant type="broad"/> + <cd:constant type="wide"/> + <cd:constant default="yes" type="bottom"/> + <cd:constant type="height"/> + <cd:constant type="line"/> + <cd:constant type="high"/> + <cd:constant type="low"/> + <cd:constant type="lohi"/> + <cd:constant type="flushright"/> + <cd:constant type="flushleft"/> + <cd:constant type="middle"/> + <cd:constant type="yes"/> + <cd:constant type="no"/> + <cd:constant default="yes" type="width"/> + <cd:constant type="normal"/> + <cd:constant type="reset"/> + <cd:constant type="inner"/> + <cd:constant type="outer"/> + <cd:constant type="flushinner"/> + <cd:constant type="flushouter"/> + <cd:constant type="left"/> + <cd:constant type="right"/> + <cd:constant type="center"/> + <cd:constant type="disable"/> + <cd:constant type="last"/> + <cd:constant type="end"/> + <cd:constant type="paragraph"/> + <cd:constant type="lefttoright"/> + <cd:constant type="righttoleft"/> + <cd:constant type="l2r"/> + <cd:constant type="r2l"/> + <cd:constant type="table"/> + <cd:constant type="lesshyphenation"/> + <cd:constant type="morehyphenation"/> + <cd:constant type="hanging"/> + <cd:constant type="nothanging"/> + <cd:constant type="hz"/> + <cd:constant type="fullhz"/> + <cd:constant type="nohz"/> + <cd:constant type="hyphenated"/> + <cd:constant type="nothyphenated"/> + <cd:constant type="tolerant"/> + <cd:constant type="verytolerant"/> + <cd:constant type="stretch"/> + <cd:constant type="extremestretch"/> + <cd:constant type="final"/> + <cd:constant type="1*final"/> + <cd:constant type="2*final"/> + <cd:constant type="3*final"/> + <cd:constant type="4*final"/> + <cd:constant type="more"/> + <cd:constant type="1*more"/> + <cd:constant type="2*more"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command category="alignment" file="spac-ali.mkiv" level="system" name="usealignparameter"> + <cd:arguments> + <cd:csname/> + </cd:arguments> + </cd:command> + <cd:command category="alignment" file="spac-ali.mkiv" level="document" name="alignment" type="environment"> + <cd:arguments> + <cd:keywords list="yes"> + <cd:inherit name="setupalign"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command category="alignment" file="spac-ali.mkiv" level="document" name="linealignment" type="environment"> + <cd:arguments> + <cd:keywords> + <cd:constant type="left"/> + <cd:constant type="middle"/> + <cd:constant type="right"/> + <cd:constant type="max"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command category="alignment" file="spac-ali.mkiv" level="document" name="leftaligned" type="environment"/> + <cd:command category="alignment" file="spac-ali.mkiv" level="document" name="middlealigned" type="environment"/> + <cd:command category="alignment" file="spac-ali.mkiv" level="document" name="rightaligned" type="environment"/> + <cd:command category="alignment" file="spac-ali.mkiv" level="document" name="maxaligned" type="environment"/> + <cd:command category="alignment" file="spac-ali.mkiv" level="document" name="midaligned" type="environment"/> + <cd:command category="alignment" file="spac-ali.mkiv" level="document" name="centeraligned" type="environment"/> + <cd:command category="alignment" file="spac-ali.mkiv" level="document" name="leftaligned"> + <cd:arguments> + <cd:content/> + </cd:arguments> + </cd:command> + <cd:command category="alignment" file="spac-ali.mkiv" level="document" name="rightaligned"> + <cd:arguments> + <cd:content/> + </cd:arguments> + </cd:command> + <cd:command category="alignment" file="spac-ali.mkiv" level="document" name="middlealigned"> + <cd:arguments> + <cd:content/> + </cd:arguments> + </cd:command> + <cd:command category="alignment" file="spac-ali.mkiv" level="document" name="maxaligned"> + <cd:arguments> + <cd:content/> + </cd:arguments> + </cd:command> + <cd:command category="alignment" file="spac-ali.mkiv" level="document" name="midaligned"> + <cd:arguments> + <cd:content/> + </cd:arguments> + </cd:command> + <cd:command category="alignment" file="spac-ali.mkiv" level="document" name="centeraligned"> + <cd:arguments> + <cd:content/> + </cd:arguments> + </cd:command> + <cd:command category="alignment" file="spac-ali.mkiv" level="system" name="alignedline"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="left"/> + <cd:constant type="right"/> + <cd:constant type="middle"/> + <cd:constant type="flushleft"/> + <cd:constant type="flushright"/> + <cd:constant type="center"/> + <cd:constant type="max"/> + <cd:constant type="inner"/> + <cd:constant type="outer"/> + <cd:constant type="innermargin"/> + <cd:constant type="outermargin"/> + <cd:constant type="inneredge"/> + <cd:constant type="outeredge"/> + <cd:constant type="backspace"/> + <cd:constant type="cutspace"/> + <cd:constant type="leftmargin"/> + <cd:constant type="rightmargin"/> + <cd:constant type="leftedge"/> + <cd:constant type="rightedge"/> + </cd:keywords> + <cd:keywords delimiters="braces"> + <cd:constant type="left"/> + <cd:constant type="right"/> + <cd:constant type="middle"/> + <cd:constant type="flushleft"/> + <cd:constant type="flushright"/> + <cd:constant type="center"/> + <cd:constant type="max"/> + <cd:constant type="inner"/> + <cd:constant type="outer"/> + <cd:constant type="innermargin"/> + <cd:constant type="outermargin"/> + <cd:constant type="inneredge"/> + <cd:constant type="outeredge"/> + <cd:constant type="backspace"/> + <cd:constant type="cutspace"/> + <cd:constant type="leftmargin"/> + <cd:constant type="rightmargin"/> + <cd:constant type="leftedge"/> + <cd:constant type="rightedge"/> + </cd:keywords> + <cd:content/> + </cd:arguments> + </cd:command> + <cd:command category="alignment" file="spac-ali.mkiv" level="document" name="wordright"> + <cd:arguments> + <cd:keywords optional="yes"> + <cd:constant type="right"/> + <cd:constant type="cd:dimension"/> + </cd:keywords> + <cd:content/> + </cd:arguments> + </cd:command> + <cd:command category="alignment" file="spac-ali.mkiv" level="system" name="simplealignedbox"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:dimension"/> + </cd:keywords> + <cd:keywords delimiters="braces"> + <cd:constant type="left"/> + <cd:constant type="right"/> + <cd:constant type="middle"/> + <cd:constant type="flushleft"/> + <cd:constant type="flushright"/> + <cd:constant type="inner"/> + <cd:constant type="outer"/> + </cd:keywords> + <cd:content/> + </cd:arguments> + </cd:command> + <cd:command category="alignment" file="spac-ali.mkiv" level="system" name="simplealignedspreadbox"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:dimension"/> + </cd:keywords> + <cd:keywords delimiters="braces"> + <cd:constant type="left"/> + <cd:constant type="right"/> + <cd:constant type="middle"/> + <cd:constant type="flushleft"/> + <cd:constant type="flushright"/> + <cd:constant type="inner"/> + <cd:constant type="outer"/> + </cd:keywords> + <cd:content/> + </cd:arguments> + </cd:command> + <cd:command category="alignment" file="spac-ali.mkiv" level="system" name="simplealignedboxplus"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:dimension"/> + </cd:keywords> + <cd:keywords delimiters="braces"> + <cd:constant type="left"/> + <cd:constant type="right"/> + <cd:constant type="middle"/> + <cd:constant type="flushleft"/> + <cd:constant type="flushright"/> + <cd:constant type="inner"/> + <cd:constant type="outer"/> + </cd:keywords> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:text"/> + </cd:keywords> + <cd:content/> + </cd:arguments> + </cd:command> + <cd:command category="alignment" file="spac-ali.mkiv" level="system" name="simplereversealignedbox"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:dimension"/> + </cd:keywords> + <cd:keywords delimiters="braces"> + <cd:constant type="left"/> + <cd:constant type="right"/> + <cd:constant type="middle"/> + <cd:constant type="flushleft"/> + <cd:constant type="flushright"/> + <cd:constant type="inner"/> + <cd:constant type="outer"/> + </cd:keywords> + <cd:content/> + </cd:arguments> + </cd:command> + <cd:command category="alignment" file="spac-ali.mkiv" level="system" name="simplereversealignedboxplus"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:dimension"/> + </cd:keywords> + <cd:keywords delimiters="braces"> + <cd:constant type="left"/> + <cd:constant type="right"/> + <cd:constant type="middle"/> + <cd:constant type="flushleft"/> + <cd:constant type="flushright"/> + <cd:constant type="inner"/> + <cd:constant type="outer"/> + </cd:keywords> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:text"/> + </cd:keywords> + <cd:content/> + </cd:arguments> + </cd:command> + <cd:command category="alignment" file="pack-box.mkiv" level="system" name="alignedbox"> + <cd:arguments> + <cd:keywords list="yes"> + <cd:constant type="left"/> + <cd:constant type="middle"/> + <cd:constant type="right"/> + <cd:constant type="top"/> + <cd:constant type="bottom"/> + <cd:constant type="line"/> + <cd:constant type="l"/> + <cd:constant type="c"/> + <cd:constant type="r"/> + <cd:constant type="m"/> + <cd:constant type="t"/> + <cd:constant type="b"/> + <cd:constant type="g"/> + </cd:keywords> + <cd:csname/> + <cd:content/> + </cd:arguments> + </cd:command> + <cd:command category="alignment" file="pack-box.mkiv" level="system" name="aligned"> + <cd:arguments> + <cd:keywords list="yes"> + <cd:constant type="left"/> + <cd:constant type="middle"/> + <cd:constant type="right"/> + <cd:constant type="top"/> + <cd:constant type="bottom"/> + <cd:constant type="line"/> + <cd:constant type="l"/> + <cd:constant type="c"/> + <cd:constant type="r"/> + <cd:constant type="m"/> + <cd:constant type="t"/> + <cd:constant type="b"/> + <cd:constant type="g"/> + </cd:keywords> + <cd:content/> + </cd:arguments> + </cd:command> + <cd:command category="alignment" file="spac-ali.mkiv" level="style" name="lefttoright"/> + <cd:command category="alignment" file="spac-ali.mkiv" level="style" name="righttoleft"/> + <cd:command category="alignment" file="spac-ali.mkiv" level="style" name="raggedbottom"/> + <cd:command category="alignment" file="spac-ali.mkiv" level="style" name="alignbottom"/> + <cd:command category="alignment" file="spac-ali.mkiv" level="style" name="baselinebottom"/> + <cd:command category="alignment" file="spac-ali.mkiv" level="style" name="notragged"/> + <cd:command category="alignment" file="spac-ali.mkiv" level="style" name="raggedleft"/> + <cd:command category="alignment" file="spac-ali.mkiv" level="style" name="raggedcenter"/> + <cd:command category="alignment" file="spac-ali.mkiv" level="style" name="raggedright"/> + <cd:command category="alignment" file="spac-ali.mkiv" level="style" name="veryraggedleft"/> + <cd:command category="alignment" file="spac-ali.mkiv" level="style" name="veryraggedcenter"/> + <cd:command category="alignment" file="spac-ali.mkiv" level="style" name="veryraggedright"/> + <cd:command category="alignment" file="spac-ali.mkiv" level="style" name="raggedwidecenter"/> + <cd:command category="alignment" file="spac-ali.mkiv" level="style" name="centeredlastline"/> + <cd:command category="alignment" file="spac-ali.mkiv" level="style" name="flushedrightlastline"/> + <cd:command category="alignment" file="spac-ali.mkiv" level="style" name="ttraggedright"/> + <cd:command category="alignment" file="spac-ali.mkiv" level="style" name="forgetragged"/> + <cd:command category="alignment" file="spac-ali.mkiv" level="document" name="line"> + <cd:arguments> + <cd:content/> + </cd:arguments> + </cd:command> + <cd:command category="alignment" file="spac-ali.mkiv" level="document" name="leftline"> + <cd:arguments> + <cd:content/> + </cd:arguments> + </cd:command> + <cd:command category="alignment" file="spac-ali.mkiv" level="document" name="rightline"> + <cd:arguments> + <cd:content/> + </cd:arguments> + </cd:command> + <cd:command category="alignment" file="spac-ali.mkiv" level="document" name="centerline"> + <cd:arguments> + <cd:content/> + </cd:arguments> + </cd:command> + <cd:command category="alignment" file="spac-ver.mkiv" level="document" name="hanging" type="environment"> + <cd:arguments> + <cd:assignments list="yes" optional="yes"> + <cd:parameter name="distance"> + <cd:constant type="cd:dimension"/> + </cd:parameter> + <cd:parameter name="n"> + <cd:constant type="cd:number"/> + </cd:parameter> + <cd:parameter name="location"> + <cd:constant default="yes" type="left"/> + <cd:constant type="right"/> + </cd:parameter> + </cd:assignments> + <cd:content/> + </cd:arguments> + </cd:command> + <cd:command category="alignment" file="spac-ver.mkiv" level="document" name="hanging" type="environment" variant="argument"> + <cd:arguments> + <cd:keywords optional="yes"> + <cd:constant default="yes" type="left"/> + <cd:constant type="right"/> + </cd:keywords> + <cd:content/> + </cd:arguments> + </cd:command> + <cd:command category="alignment" file="spac-ver.mkiv" level="document" name="fixed" type="environment"> + <cd:arguments> + <cd:keywords optional="yes"> + <cd:constant type="low"/> + <cd:constant type="middle"/> + <cd:constant type="high"/> + <cd:constant type="lohi"/> + <cd:constant default="yes" type="default"/> + </cd:keywords> + </cd:arguments> + </cd:command> + </cd:interface> <cd:interface file="i-anchor.xml"> - <cd:command file="pack-box.mkiv" name="defineanchor"> + <cd:command file="pack-box.mkiv" level="style" name="defineanchor"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -19,7 +598,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="pack-box.mkiv" name="anchor"> + <cd:command file="pack-box.mkiv" level="document" name="anchor"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -36,7 +615,7 @@ </cd:command> </cd:interface> <cd:interface file="i-attachment.xml"> - <cd:command file="scrn-wid.mkvi" name="defineattachment"> + <cd:command file="scrn-wid.mkvi" level="style" name="defineattachment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -49,7 +628,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="scrn-wid.mkvi" name="setupattachment"> + <cd:command file="scrn-wid.mkvi" level="style" name="setupattachment"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -121,9 +700,9 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="scrn-wid.mkvi" name="registerattachment"> + <cd:command file="scrn-wid.mkvi" level="style" name="setupattachments"> <cd:arguments> - <cd:keywords> + <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> </cd:keywords> <cd:assignments list="yes"> @@ -131,25 +710,19 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="scrn-wid.mkvi" generated="yes" name="attachment" variant="example"> - <cd:sequence> - <cd:variable value="attachment"/> - </cd:sequence> + <cd:command file="scrn-wid.mkvi" level="document" name="registerattachment"> <cd:arguments> - <cd:keywords optional="yes"> + <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> - <cd:assignments list="yes" optional="yes"> + <cd:assignments list="yes"> <cd:inherit name="setupattachment"/> </cd:assignments> </cd:arguments> - <cd:instances> - <cd:constant value="attachment"/> - </cd:instances> </cd:command> - <cd:command file="scrn-wid.mkvi" generated="yes" name="attachment" type="environment" variant="example"> + <cd:command file="scrn-wid.mkvi" generated="yes" level="document" name="attachment" variant="instance"> <cd:sequence> - <cd:variable value="attachment"/> + <cd:instance value="attachment"/> </cd:sequence> <cd:arguments> <cd:keywords optional="yes"> @@ -163,18 +736,10 @@ <cd:constant value="attachment"/> </cd:instances> </cd:command> - <cd:command file="scrn-wid.mkvi" name="placeattachments"/> - <cd:command file="scrn-wid.mkvi" name="attachment"> - <cd:arguments> - <cd:keywords optional="yes"> - <cd:constant type="cd:name"/> - </cd:keywords> - <cd:assignments list="yes" optional="yes"> - <cd:inherit name="setupattachment"/> - </cd:assignments> - </cd:arguments> - </cd:command> - <cd:command file="scrn-wid.mkvi" name="attachment" type="environment"> + <cd:command file="scrn-wid.mkvi" generated="yes" level="document" name="attachment" type="environment" variant="instance"> + <cd:sequence> + <cd:instance value="attachment"/> + </cd:sequence> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -183,25 +748,29 @@ <cd:inherit name="setupattachment"/> </cd:assignments> </cd:arguments> + <cd:instances> + <cd:constant value="attachment"/> + </cd:instances> </cd:command> + <cd:command file="scrn-wid.mkvi" level="document" name="placeattachments"/> </cd:interface> <cd:interface file="i-attribute.xml"> - <cd:command file="attr-ini.mkiv" name="pushattribute"> + <cd:command category="attribute" file="attr-ini.mkiv" level="system" name="pushattribute"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="attr-ini.mkiv" name="popattribute"> + <cd:command category="attribute" file="attr-ini.mkiv" level="system" name="popattribute"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="attr-ini.mkiv" name="installattributestack"> + <cd:command category="attribute" file="attr-ini.mkiv" level="system" name="installattributestack"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="attr-ini.mkiv" name="defineattribute"> + <cd:command category="attribute" file="attr-ini.mkiv" level="system" name="defineattribute"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -214,7 +783,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="attr-ini.mkiv" name="definesystemattribute"> + <cd:command category="attribute" file="attr-ini.mkiv" level="system" name="definesystemattribute"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -227,12 +796,12 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="attr-ini.mkiv" name="newattribute"> + <cd:command category="attribute" file="attr-ini.mkiv" level="system" name="newattribute"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="attr-ini.mkiv" name="dosetattribute"> + <cd:command category="attribute" file="attr-ini.mkiv" level="system" name="dosetattribute"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -242,46 +811,46 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="attr-ini.mkiv" name="doresetattribute"> + <cd:command category="attribute" file="attr-ini.mkiv" level="system" name="doresetattribute"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="attr-ini.mkiv" name="dogetattribute"> + <cd:command category="attribute" file="attr-ini.mkiv" level="system" name="dogetattribute"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="attr-ini.mkiv" name="dogetattributeid"> + <cd:command category="attribute" file="attr-ini.mkiv" level="system" name="dogetattributeid"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="attr-ini.mkiv" name="resetallattributes"/> - <cd:command file="attr-ini.mkiv" name="savecurrentattributes"> + <cd:command category="attribute" file="attr-ini.mkiv" level="system" name="resetallattributes"/> + <cd:command category="attribute" file="attr-ini.mkiv" level="system" name="savecurrentattributes"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="attr-ini.mkiv" name="restorecurrentattributes"> + <cd:command category="attribute" file="attr-ini.mkiv" level="system" name="restorecurrentattributes"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="attr-ini.mkiv" name="showattributes"/> + <cd:command category="attribute" file="attr-ini.mkiv" level="document" name="showattributes"/> </cd:interface> <cd:interface file="i-backend.xml"> - <cd:command file="back-ini.mkiv" name="setupbackend"> + <cd:command catehory="pdf" file="back-ini.mkiv" level="style" name="setupbackend"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="export"> @@ -295,7 +864,28 @@ <cd:constant type="cd:file"/> </cd:parameter> <cd:parameter name="intent"> - <cd:constant type="cd:name"/> + <cd:constant type="Coated FOGRA39 (ISO 12647-2:2004)"/> + <cd:constant type="GRACoL2006_Coated1v2.icc"/> + <cd:constant type="ISO Coated v2 300% (ECI)"/> + <cd:constant type="ISO Coated v2 (ECI)"/> + <cd:constant type="ISOnewspaper26v4"/> + <cd:constant type="ISOnewspaper26v4_gr"/> + <cd:constant type="ISO Uncoated"/> + <cd:constant type="ISO Uncoated Yellowish"/> + <cd:constant type="ISO Web Coated"/> + <cd:constant type="Japan Color 2001 Coated"/> + <cd:constant type="Japan Color 2002 Newspaper"/> + <cd:constant type="Japan Web Coated (Ad)"/> + <cd:constant type="SNAP 2007"/> + <cd:constant type="SWOP2006_Coated3v2.icc"/> + <cd:constant type="SWOP2006_Coated5v2.icc"/> + <cd:constant type="Uncoated FOGRA29 (ISO 12647-2:2004)"/> + <cd:constant type="Web Coated FOGRA28 (ISO 12647-2:2004)"/> + <cd:constant type="PSR_LWC_PLUS_V2_PT"/> + <cd:constant type="PSR_LWC_STD_V2_PT"/> + <cd:constant type="PSR_SC_PLUS_V2_PT"/> + <cd:constant type="PSR_SC_STD_V2_PT"/> + <cd:constant type="PSRgravureMF"/> </cd:parameter> <cd:parameter name="space"> <cd:constant type="yes"/> @@ -307,7 +897,20 @@ <cd:parameter name="format"> <cd:constant type="version"/> <cd:constant type="default"/> - <cd:constant type="cd:name"/> + <cd:constant type="PDF/X-1a:2001"/> + <cd:constant type="PDF/X-1a:2003"/> + <cd:constant type="PDF/X-3:2002"/> + <cd:constant type="PDF/X-3:2003"/> + <cd:constant type="PDF/X-4"/> + <cd:constant type="PDF/X-4p"/> + <cd:constant type="PDF/X-5g"/> + <cd:constant type="PDF/X-5pg"/> + <cd:constant type="PDF/X-5n"/> + <cd:constant type="PDF/A-1a:2005"/> + <cd:constant type="PDF/A-1b:2005"/> + <cd:constant type="PDF/A-2a"/> + <cd:constant type="PDF/A-3a"/> + <cd:constant type="PDF/UA-1"/> </cd:parameter> <cd:parameter name="level"> <cd:constant type="cd:number"/> @@ -324,7 +927,7 @@ </cd:command> </cd:interface> <cd:interface file="i-background.xml"> - <cd:command file="pack-bck.mkvi" name="definebackground"> + <cd:command category="background" file="pack-bck.mkvi" level="style" name="definebackground"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -337,7 +940,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="pack-bck.mkvi" name="setupbackground"> + <cd:command category="background" file="pack-bck.mkvi" level="style" name="setupbackground"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -369,7 +972,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="pack-bck.mkvi" generated="yes" name="background" type="environment" variant="example"> + <cd:command category="background" file="pack-bck.mkvi" generated="yes" level="document" name="background" type="environment" variant="example"> <cd:sequence> <cd:variable value="background"/> </cd:sequence> @@ -382,14 +985,14 @@ <cd:constant value="background"/> </cd:instances> </cd:command> - <cd:command file="pack-bck.mkvi" name="background" type="environment"> + <cd:command category="background" file="pack-bck.mkvi" level="document" name="background" type="environment"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupbackground"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="pack-bck.mkvi" generated="yes" name="background" variant="example"> + <cd:command category="background" file="pack-bck.mkvi" generated="yes" level="document" name="background" variant="example"> <cd:sequence> <cd:variable value="background"/> </cd:sequence> @@ -400,12 +1003,12 @@ <cd:constant value="background"/> </cd:instances> </cd:command> - <cd:command file="pack-bck.mkvi" name="background"> + <cd:command category="background" file="pack-bck.mkvi" level="document" name="background"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="pack-bck.mkvi" name="backgroundline"> + <cd:command category="background colors" file="pack-bck.mkvi" level="document" name="backgroundline"> <cd:arguments> <cd:keywords> <cd:constant type="cd:color"/> @@ -413,7 +1016,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="page-bck.mkiv" name="setupbackgrounds"> + <cd:command category="background" file="page-bck.mkiv" level="style" name="setupbackgrounds"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="top"/> @@ -434,7 +1037,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-bck.mkiv" name="setupbackgrounds" variant="page"> + <cd:command category="background" file="page-bck.mkiv" level="style" name="setupbackgrounds" variant="page"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="paper"/> @@ -453,14 +1056,14 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command begin="push" end="pop" file="page-bck.mkiv" name="background" type="environment"> + <cd:command begin="push" category="background" end="pop" file="page-bck.mkiv" level="system" name="background" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-bck.mkiv" name="doifelsesomebackground"> + <cd:command category="background conditional" file="page-bck.mkiv" level="system" name="doifelsesomebackground"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -473,7 +1076,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-bck.mkiv" name="doifsomebackgroundelse"> + <cd:command category="background conditional" file="page-bck.mkiv" level="system" name="doifsomebackgroundelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -486,7 +1089,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-bck.mkiv" name="doifsomebackground"> + <cd:command category="background conditional" file="page-bck.mkiv" level="system" name="doifsomebackground"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -501,7 +1104,7 @@ </cd:command> </cd:interface> <cd:interface file="i-bar.xml"> - <cd:command file="node-rul.mkiv" name="definebar"> + <cd:command category="rules" file="node-rul.mkiv" level="style" name="definebar"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -514,7 +1117,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="node-rul.mkiv" name="setupbar"> + <cd:command category="rules" file="node-rul.mkiv" level="style" name="setupbar"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -584,9 +1187,19 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="node-rul.mkiv" generated="yes" name="bar" variant="example"> + <cd:command category="rules" file="node-rul.mkiv" level="style" name="setupbars"> + <cd:arguments> + <cd:keywords list="yes" optional="yes"> + <cd:constant type="cd:name"/> + </cd:keywords> + <cd:assignments list="yes"> + <cd:inherit name="setupbar"/> + </cd:assignments> + </cd:arguments> + </cd:command> + <cd:command category="rules" file="node-rul.mkiv" generated="yes" level="document" name="bar" variant="instance"> <cd:sequence> - <cd:variable value="bar"/> + <cd:instance value="bar"/> </cd:sequence> <cd:arguments> <cd:content/> @@ -610,118 +1223,38 @@ <cd:constant value="hiddenbar"/> </cd:instances> </cd:command> - <cd:command file="node-rul.mkiv" name="bar" type="environment"> + <cd:command category="rules" file="node-rul.mkiv" level="document" name="bar" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="node-rul.mkiv" name="setbar"> + <cd:command category="rules" file="node-rul.mkiv" level="document" name="setbar"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="node-rul.mkiv" name="directsetbar"> + <cd:command category="rules" file="node-rul.mkiv" level="document" name="directsetbar"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command begin="push" end="pop" file="node-rul.mkiv" name="bar" type="environment"> + <cd:command begin="push" category="rules" end="pop" file="node-rul.mkiv" level="system" name="bar" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="node-rul.mkiv" name="overbar"> - <cd:arguments> - <cd:content/> - </cd:arguments> - </cd:command> - <cd:command file="node-rul.mkiv" name="underbar"> - <cd:arguments> - <cd:content/> - </cd:arguments> - </cd:command> - <cd:command file="node-rul.mkiv" name="hiddenbar"> - <cd:arguments> - <cd:content/> - </cd:arguments> - </cd:command> - <cd:command file="node-rul.mkiv" name="overstrike"> - <cd:arguments> - <cd:content/> - </cd:arguments> - </cd:command> - <cd:command file="node-rul.mkiv" name="understrike"> - <cd:arguments> - <cd:content/> - </cd:arguments> - </cd:command> - <cd:command file="node-rul.mkiv" name="overbars"> - <cd:arguments> - <cd:content/> - </cd:arguments> - </cd:command> - <cd:command file="node-rul.mkiv" name="underbars"> - <cd:arguments> - <cd:content/> - </cd:arguments> - </cd:command> - <cd:command file="node-rul.mkiv" name="overstrikes"> - <cd:arguments> - <cd:content/> - </cd:arguments> - </cd:command> - <cd:command file="node-rul.mkiv" name="understrikes"> - <cd:arguments> - <cd:content/> - </cd:arguments> - </cd:command> - <cd:command file="node-rul.mkiv" name="underrandom"> - <cd:arguments> - <cd:content/> - </cd:arguments> - </cd:command> - <cd:command file="node-rul.mkiv" name="underrandoms"> - <cd:arguments> - <cd:content/> - </cd:arguments> - </cd:command> - <cd:command file="node-rul.mkiv" name="underdash"> - <cd:arguments> - <cd:content/> - </cd:arguments> - </cd:command> - <cd:command file="node-rul.mkiv" name="underdashes"> - <cd:arguments> - <cd:content/> - </cd:arguments> - </cd:command> - <cd:command file="node-rul.mkiv" name="underdot"> - <cd:arguments> - <cd:content/> - </cd:arguments> - </cd:command> - <cd:command file="node-rul.mkiv" name="underdots"> - <cd:arguments> - <cd:content/> - </cd:arguments> - </cd:command> - <cd:command file="node-rul.mkiv" name="nobar"> - <cd:arguments> - <cd:content/> - </cd:arguments> - </cd:command> - <cd:command file="node-rul.mkiv" name="resetbar"/> + <cd:command category="rules" file="node-rul.mkiv" level="style" name="resetbar"/> </cd:interface> <cd:interface file="i-blackrule.xml"> - <cd:command file="pack-mrl.mkiv" name="setupblackrules"> + <cd:command category="rules colors" file="pack-mrl.mkiv" level="style" name="setupblackrules"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="width"> @@ -764,35 +1297,35 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="pack-mrl.mkiv" name="blackrule"> + <cd:command category="rules colors" file="pack-mrl.mkiv" level="document" name="blackrule"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupblackrules"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="pack-mrl.mkiv" name="blackrules"> + <cd:command category="rules colors" file="pack-mrl.mkiv" level="document" name="blackrules"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupblackrules"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="pack-mrl.mkiv" name="vl"> + <cd:command category="rules" file="pack-mrl.mkiv" level="document" name="vl"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="pack-mrl.mkiv" name="hl"> + <cd:command file="pack-mrl.mkiv" level="document" name="hl"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="tabl-mis.mkiv" name="somekindoftab"> + <cd:command category="rules" file="tabl-mis.mkiv" level="style" name="somekindoftab"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="alternative"> @@ -814,9 +1347,24 @@ </cd:assignments> </cd:arguments> </cd:command> + <cd:command category="rules" file="grph-rul.mkiv" level="style" name="frule"> + <cd:arguments> + <cd:keywords delimiters="none" list="yes"> + <cd:constant method="none" prefix="width␣" type="cd:dimension"/> + <cd:constant method="none" prefix="height␣" type="cd:dimension"/> + <cd:constant method="none" prefix="depth␣" type="cd:dimension"/> + <cd:constant method="none" prefix="radius␣" type="cd:dimension"/> + <cd:constant method="none" prefix="line␣" type="cd:dimension"/> + <cd:constant method="none" prefix="type␣" type="cd:text"/> + <cd:constant method="none" prefix="data␣" type="cd:text"/> + <cd:constant method="none" prefix="name␣" type="cd:text"/> + </cd:keywords> + <cd:delimiter name="relax"/> + </cd:arguments> + </cd:command> </cd:interface> <cd:interface file="i-bleed.xml"> - <cd:command file="pack-box.mkiv" name="setupbleeding"> + <cd:command category="graphics" file="pack-box.mkiv" level="style" name="setupbleeding"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="width"> @@ -859,7 +1407,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="pack-box.mkiv" name="bleed"> + <cd:command category="graphics" file="pack-box.mkiv" level="document" name="bleed"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupbleeding"/> @@ -867,11 +1415,11 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="pack-box.mkiv" name="bleedwidth"/> - <cd:command file="pack-box.mkiv" name="bleedheight"/> + <cd:command category="graphics" file="pack-box.mkiv" level="style" name="bleedwidth"/> + <cd:command category="graphics" file="pack-box.mkiv" level="style" name="bleedheight"/> </cd:interface> <cd:interface file="i-block.xml"> - <cd:command file="strc-blk.mkiv" name="defineblock"> + <cd:command category="structure" file="strc-blk.mkiv" level="style" name="defineblock"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -884,7 +1432,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-blk.mkiv" name="setupblock"> + <cd:command category="structure" file="strc-blk.mkiv" level="style" name="setupblock"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -909,7 +1457,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command begin="begin" end="end" file="strc-blk.mkiv" generated="yes" name="block" type="environment" variant="example"> + <cd:command begin="begin" category="structure" end="end" file="strc-blk.mkiv" generated="yes" level="document" name="block" type="environment" variant="example"> <cd:sequence> <cd:variable value="block"/> </cd:sequence> @@ -917,39 +1465,37 @@ <cd:keywords list="yes" optional="yes"> <cd:constant type="+"/> <cd:constant type="-"/> + <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-blk.mkiv" name="hideblocks"> + <cd:command category="structure" file="strc-blk.mkiv" level="style" name="hideblocks"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:name"/> </cd:keywords> <cd:keywords list="yes" optional="yes"> - <cd:constant type="+"/> - <cd:constant type="-"/> + <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-blk.mkiv" name="keepblocks"> + <cd:command category="structure" file="strc-blk.mkiv" level="style" name="keepblocks"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:name"/> </cd:keywords> <cd:keywords list="yes" optional="yes"> - <cd:constant type="+"/> - <cd:constant type="-"/> + <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-blk.mkiv" name="useblocks"> + <cd:command category="structure" file="strc-blk.mkiv" level="document" name="useblocks"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:name"/> </cd:keywords> <cd:keywords list="yes" optional="yes"> - <cd:constant type="+"/> - <cd:constant type="-"/> + <cd:constant type="cd:name"/> </cd:keywords> <cd:assignments list="yes" optional="yes"> <cd:parameter name="criterium"> @@ -959,14 +1505,13 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-blk.mkiv" name="processblocks"> + <cd:command category="structure" file="strc-blk.mkiv" level="document" name="processblocks"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:name"/> </cd:keywords> <cd:keywords list="yes" optional="yes"> - <cd:constant type="+"/> - <cd:constant type="-"/> + <cd:constant type="cd:name"/> </cd:keywords> <cd:assignments list="yes" optional="yes"> <cd:parameter name="criterium"> @@ -976,14 +1521,13 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-blk.mkiv" name="selectblocks"> + <cd:command category="structure" file="strc-blk.mkiv" level="document" name="selectblocks"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:name"/> </cd:keywords> <cd:keywords list="yes" optional="yes"> - <cd:constant type="+"/> - <cd:constant type="-"/> + <cd:constant type="cd:name"/> </cd:keywords> <cd:assignments list="yes" optional="yes"> <cd:parameter name="criterium"> @@ -995,7 +1539,7 @@ </cd:command> </cd:interface> <cd:interface file="i-bookmark.xml"> - <cd:command file="strc-bkm.mkiv" name="setupbookmark"> + <cd:command category="pdf" file="strc-bkm.mkiv" level="style" name="setupbookmark"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="force"> @@ -1035,7 +1579,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-bkm.mkiv" name="bookmark"> + <cd:command category="pdf" file="strc-bkm.mkiv" level="document" name="bookmark"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:section"/> @@ -1046,7 +1590,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="src-bkm.mkiv" name="placebookmarks"> + <cd:command category="pdf" file="src-bkm.mkiv" level="style" name="placebookmarks"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:section"/> @@ -1063,7 +1607,7 @@ </cd:command> </cd:interface> <cd:interface file="i-boxes.xml"> - <cd:command file="supp-box.mkiv" name="doiftext"> + <cd:command category="conditional" file="supp-box.mkiv" level="system" name="doiftext"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -1076,7 +1620,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="doifelsetext"> + <cd:command category="conditional" file="supp-box.mkiv" level="system" name="doifelsetext"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -1089,7 +1633,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="doiftextelse"> + <cd:command category="conditional" file="supp-box.mkiv" level="system" name="doiftextelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -1102,7 +1646,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="dowithnextbox"> + <cd:command file="supp-box.mkiv" level="system" name="dowithnextbox"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:command"/> @@ -1111,21 +1655,21 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="dowithnextboxcs"> + <cd:command file="supp-box.mkiv" level="system" name="dowithnextboxcs"> <cd:arguments> <cd:csname/> <cd:csname/> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="nextboxwd"/> - <cd:command file="supp-box.mkiv" name="nextboxht"/> - <cd:command file="supp-box.mkiv" name="nextboxdp"/> - <cd:command file="supp-box.mkiv" name="nextboxhtdp"/> - <cd:command file="supp-box.mkiv" name="flushnextbox"/> - <cd:command file="supp-box.mkiv" name="nextbox"/> - <cd:command file="supp-box.mkiv" name="nextdepth"/> - <cd:command file="supp-box.mkiv" name="dowithnextboxcontent"> + <cd:command file="supp-box.mkiv" level="system" name="nextboxwd"/> + <cd:command file="supp-box.mkiv" level="system" name="nextboxht"/> + <cd:command file="supp-box.mkiv" level="system" name="nextboxdp"/> + <cd:command file="supp-box.mkiv" level="system" name="nextboxhtdp"/> + <cd:command file="supp-box.mkiv" level="system" name="flushnextbox"/> + <cd:command file="supp-box.mkiv" level="system" name="nextbox"/> + <cd:command file="supp-box.mkiv" level="system" name="nextdepth"/> + <cd:command file="supp-box.mkiv" level="system" name="dowithnextboxcontent"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:command"/> @@ -1137,7 +1681,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="dowithnextboxcontentcs"> + <cd:command file="supp-box.mkiv" level="system" name="dowithnextboxcontentcs"> <cd:arguments> <cd:csname/> <cd:csname/> @@ -1145,47 +1689,47 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="rlap"> + <cd:command file="supp-box.mkiv" level="system" name="rlap"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="llap"> + <cd:command file="supp-box.mkiv" level="system" name="llap"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="clap"> + <cd:command file="supp-box.mkiv" level="system" name="clap"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="tlap"> + <cd:command file="supp-box.mkiv" level="system" name="tlap"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="blap"> + <cd:command file="supp-box.mkiv" level="system" name="blap"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="reshapebox"> + <cd:command file="supp-box.mkiv" level="system" name="reshapebox"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:command"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command begin="beginof" end="endof" file="supp-box.mkiv" name="shapebox" type="environment"/> - <cd:command file="supp-box.mkiv" name="flushshapebox"/> - <cd:command file="supp-box.mkiv" name="innerflushshapebox"/> - <cd:command file="supp-box.mkiv" name="shapedhbox"> + <cd:command begin="beginof" end="endof" file="supp-box.mkiv" level="system" name="shapebox" type="environment"/> + <cd:command file="supp-box.mkiv" level="system" name="flushshapebox"/> + <cd:command file="supp-box.mkiv" level="system" name="innerflushshapebox"/> + <cd:command file="supp-box.mkiv" level="system" name="shapedhbox"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="processtokens"> + <cd:command file="supp-box.mkiv" level="system" name="processtokens"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:command"/> @@ -1204,7 +1748,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="doboundtext"> + <cd:command file="supp-box.mkiv" level="system" name="doboundtext"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -1217,7 +1761,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="limitatetext"> + <cd:command file="supp-box.mkiv" level="system" name="limitatetext"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -1230,7 +1774,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="limitatetext" variant="list"> + <cd:command file="supp-box.mkiv" level="system" name="limitatetext" variant="list"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -1243,7 +1787,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="limtatefirstline"> + <cd:command file="supp-box.mkiv" level="system" name="limitatefirstline"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -1256,7 +1800,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="processisolatedchars"> + <cd:command file="supp-box.mkiv" level="system" name="processisolatedchars"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -1264,7 +1808,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="processisolatedwords"> + <cd:command file="supp-box.mkiv" level="system" name="processisolatedwords"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -1272,7 +1816,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="applytocharacters"> + <cd:command file="supp-box.mkiv" level="system" name="applytocharacters"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -1280,7 +1824,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="applytowords"> + <cd:command file="supp-box.mkiv" level="system" name="applytowords"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -1288,7 +1832,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="applytosplitstringchar"> + <cd:command file="supp-box.mkiv" level="system" name="applytosplitstringchar"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -1296,7 +1840,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="applytosplitstringword"> + <cd:command file="supp-box.mkiv" level="system" name="applytosplitstringword"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -1304,7 +1848,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="applytosplitstringline"> + <cd:command file="supp-box.mkiv" level="system" name="applytosplitstringline"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -1312,7 +1856,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="applytosplitstringcharspaced"> + <cd:command file="supp-box.mkiv" level="system" name="applytosplitstringcharspaced"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -1320,7 +1864,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="applytosplitstringwordspaced"> + <cd:command file="supp-box.mkiv" level="system" name="applytosplitstringwordspaced"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -1328,7 +1872,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="applytosplitstringlinespaced"> + <cd:command file="supp-box.mkiv" level="system" name="applytosplitstringlinespaced"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -1336,27 +1880,27 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="sbox"> + <cd:command file="supp-box.mkiv" level="system" name="sbox"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="inlinedbox"> + <cd:command file="supp-box.mkiv" level="system" name="inlinedbox"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="struttedbox"> + <cd:command file="supp-box.mkiv" level="system" name="struttedbox"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="topskippedbox"> + <cd:command file="supp-box.mkiv" level="system" name="topskippedbox"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="centeredbox"> + <cd:command file="supp-box.mkiv" level="system" name="centeredbox"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -1364,7 +1908,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="centerednextbox"> + <cd:command file="supp-box.mkiv" level="system" name="centerednextbox"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -1372,7 +1916,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="centerbox"> + <cd:command file="supp-box.mkiv" level="system" name="centerbox"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -1380,7 +1924,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="setrigidcolumnhsize"> + <cd:command file="supp-box.mkiv" level="system" name="setrigidcolumnhsize"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:dimension"/> @@ -1393,7 +1937,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="setrigidcolumnbalance"> + <cd:command file="supp-box.mkiv" level="system" name="setrigidcolumnbalance"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:csname"/> @@ -1401,11 +1945,11 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="vboxtohbox" type="environment"/> - <cd:command file="supp-box.mkiv" name="vboxtohboxseparator" type="environment"/> - <cd:command file="supp-box.mkiv" name="convertvboxtohbox"/> - <cd:command file="supp-box.mkiv" name="hboxestohbox" type="environment"/> - <cd:command file="supp-box.mkiv" name="unhhbox"> + <cd:command file="supp-box.mkiv" level="system" name="vboxtohbox" type="environment"/> + <cd:command file="supp-box.mkiv" level="system" name="vboxtohboxseparator" type="environment"/> + <cd:command file="supp-box.mkiv" level="system" name="convertvboxtohbox"/> + <cd:command file="supp-box.mkiv" level="system" name="hboxestohbox" type="environment"/> + <cd:command file="supp-box.mkiv" level="system" name="unhhbox"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:csname"/> @@ -1417,7 +1961,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="hboxofvbox"> + <cd:command file="supp-box.mkiv" level="system" name="hboxofvbox"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:csname"/> @@ -1425,7 +1969,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="doifcontent"> + <cd:command file="supp-box.mkiv" level="system" name="doifcontent"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:command"/> @@ -1440,8 +1984,8 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="overlay" type="environment"/> - <cd:command file="supp-box.mkiv" name="fakebox"> + <cd:command file="supp-box.mkiv" level="system" name="overlay" type="environment"/> + <cd:command file="supp-box.mkiv" level="system" name="fakebox"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:csname"/> @@ -1449,7 +1993,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="lbox"> + <cd:command file="supp-box.mkiv" level="system" name="lbox"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -1457,7 +2001,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="cbox"> + <cd:command file="supp-box.mkiv" level="system" name="cbox"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -1465,7 +2009,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="rbox"> + <cd:command file="supp-box.mkiv" level="system" name="rbox"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -1473,7 +2017,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="ltop"> + <cd:command file="supp-box.mkiv" level="system" name="ltop"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -1481,7 +2025,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="ctop"> + <cd:command file="supp-box.mkiv" level="system" name="ctop"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -1489,7 +2033,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="rtop"> + <cd:command file="supp-box.mkiv" level="system" name="rtop"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -1497,47 +2041,47 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="tbox"> + <cd:command file="supp-box.mkiv" level="system" name="tbox"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="bbox"> + <cd:command file="supp-box.mkiv" level="system" name="bbox"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="lhbox"> + <cd:command file="supp-box.mkiv" level="system" name="lhbox"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="mhbox"> + <cd:command file="supp-box.mkiv" level="system" name="mhbox"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="rhbox"> + <cd:command file="supp-box.mkiv" level="system" name="rhbox"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="lefthbox"> + <cd:command file="supp-box.mkiv" level="system" name="lefthbox"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="midhbox"> + <cd:command file="supp-box.mkiv" level="system" name="midhbox"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="righthbox"> + <cd:command file="supp-box.mkiv" level="system" name="righthbox"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="boxofsize"> + <cd:command file="supp-box.mkiv" level="system" name="boxofsize"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="none" list="yes" optional="yes"> @@ -1546,7 +2090,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="limitatelines"> + <cd:command file="supp-box.mkiv" level="system" name="limitatelines"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> @@ -1559,98 +2103,98 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="fittopbaselinegrid"> + <cd:command file="supp-box.mkiv" level="system" name="fittopbaselinegrid"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="boxcursor"/> - <cd:command file="supp-box.mkiv" name="placedbox"> + <cd:command file="supp-box.mkiv" level="system" name="boxcursor"/> + <cd:command file="supp-box.mkiv" level="system" name="placedbox"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="rightbox"> + <cd:command file="supp-box.mkiv" level="system" name="rightbox"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="leftbox"> + <cd:command file="supp-box.mkiv" level="system" name="leftbox"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="topbox"> + <cd:command file="supp-box.mkiv" level="system" name="topbox"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="bottombox"> + <cd:command file="supp-box.mkiv" level="system" name="bottombox"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="lefttopbox"> + <cd:command file="supp-box.mkiv" level="system" name="lefttopbox"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="righttopbox"> + <cd:command file="supp-box.mkiv" level="system" name="righttopbox"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="leftbottombox"> + <cd:command file="supp-box.mkiv" level="system" name="leftbottombox"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="rightbottombox"> + <cd:command file="supp-box.mkiv" level="system" name="rightbottombox"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="topleftbox"> + <cd:command file="supp-box.mkiv" level="system" name="topleftbox"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="toprightbox"> + <cd:command file="supp-box.mkiv" level="system" name="toprightbox"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="bottomleftbox"> + <cd:command file="supp-box.mkiv" level="system" name="bottomleftbox"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="bottomrightbox"> + <cd:command file="supp-box.mkiv" level="system" name="bottomrightbox"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="middlebox"> + <cd:command file="supp-box.mkiv" level="system" name="middlebox"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="baselinemiddlebox"> + <cd:command file="supp-box.mkiv" level="system" name="baselinemiddlebox"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="baselineleftbox"> + <cd:command file="supp-box.mkiv" level="system" name="baselineleftbox"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="baselinerightbox"> + <cd:command file="supp-box.mkiv" level="system" name="baselinerightbox"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="lrtbbox"> + <cd:command file="supp-box.mkiv" level="system" name="lrtbbox"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:dimension"/> @@ -1667,12 +2211,12 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="toplinebox"> + <cd:command file="supp-box.mkiv" level="system" name="toplinebox"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="setstackbox"> + <cd:command file="supp-box.mkiv" level="system" name="setstackbox"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -1683,14 +2227,14 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="initializeboxstack"> + <cd:command file="supp-box.mkiv" level="system" name="initializeboxstack"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="savebox"> + <cd:command file="supp-box.mkiv" level="system" name="savebox"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -1701,7 +2245,17 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="restorebox"> + <cd:command file="supp-box.mkiv" level="system" name="flushbox"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:name"/> + </cd:keywords> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:name"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command file="supp-box.mkiv" level="system" name="restorebox"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -1711,7 +2265,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="foundbox"> + <cd:command file="supp-box.mkiv" level="system" name="foundbox"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -1721,7 +2275,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="doifelsebox"> + <cd:command category="conditional" file="supp-box.mkiv" level="system" name="doifelsebox"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -1737,7 +2291,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="doifboxelse"> + <cd:command category="conditional" file="supp-box.mkiv" level="system" name="doifboxelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -1753,7 +2307,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="localpushbox"> + <cd:command file="supp-box.mkiv" level="system" name="localpushbox"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:csname"/> @@ -1761,7 +2315,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="localpopbox"> + <cd:command file="supp-box.mkiv" level="system" name="localpopbox"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:csname"/> @@ -1769,7 +2323,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="globalpushbox"> + <cd:command file="supp-box.mkiv" level="system" name="globalpushbox"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:csname"/> @@ -1777,7 +2331,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="globalpopbox"> + <cd:command file="supp-box.mkiv" level="system" name="globalpopbox"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:csname"/> @@ -1785,16 +2339,16 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="removedepth"/> - <cd:command file="supp-box.mkiv" name="obeydepth"/> - <cd:command file="supp-box.mkiv" name="undepthed"> + <cd:command file="supp-box.mkiv" level="system" name="removedepth"/> + <cd:command file="supp-box.mkiv" level="system" name="obeydepth"/> + <cd:command file="supp-box.mkiv" level="system" name="undepthed"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="removebottomthings"/> - <cd:command file="supp-box.mkiv" name="removelastskip"/> - <cd:command file="supp-box.mkiv" name="makestrutofbox"> + <cd:command file="supp-box.mkiv" level="system" name="removebottomthings"/> + <cd:command file="supp-box.mkiv" level="system" name="removelastskip"/> + <cd:command file="supp-box.mkiv" level="system" name="makestrutofbox"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:csname"/> @@ -1802,7 +2356,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="raisebox"> + <cd:command file="supp-box.mkiv" level="system" name="raisebox"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:dimension"/> @@ -1811,7 +2365,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="lowerbox"> + <cd:command file="supp-box.mkiv" level="system" name="lowerbox"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:dimension"/> @@ -1820,17 +2374,17 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="halfwaybox"> + <cd:command file="supp-box.mkiv" level="system" name="halfwaybox"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="depthonlybox"> + <cd:command file="supp-box.mkiv" level="system" name="depthonlybox"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="naturalhbox"> + <cd:command file="supp-box.mkiv" level="system" name="naturalhbox"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -1838,7 +2392,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="naturalvbox"> + <cd:command file="supp-box.mkiv" level="system" name="naturalvbox"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -1846,7 +2400,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="naturalvtop"> + <cd:command file="supp-box.mkiv" level="system" name="naturalvtop"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -1854,7 +2408,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="naturalvcenter"> + <cd:command file="supp-box.mkiv" level="system" name="naturalvcenter"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -1862,7 +2416,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="naturalhpack"> + <cd:command file="supp-box.mkiv" level="system" name="naturalhpack"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -1870,7 +2424,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="naturalvpack"> + <cd:command file="supp-box.mkiv" level="system" name="naturalvpack"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -1878,12 +2432,12 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="frozenhbox"> + <cd:command file="supp-box.mkiv" level="system" name="frozenhbox"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="setboxllx"> + <cd:command file="supp-box.mkiv" level="system" name="setboxllx"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:csname"/> @@ -1894,7 +2448,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="setboxlly"> + <cd:command file="supp-box.mkiv" level="system" name="setboxlly"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:csname"/> @@ -1905,7 +2459,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="gsetboxllx"> + <cd:command file="supp-box.mkiv" level="system" name="gsetboxllx"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:csname"/> @@ -1916,7 +2470,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="gsetboxlly"> + <cd:command file="supp-box.mkiv" level="system" name="gsetboxlly"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:csname"/> @@ -1927,7 +2481,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="getboxllx"> + <cd:command file="supp-box.mkiv" level="system" name="getboxllx"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:csname"/> @@ -1935,7 +2489,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="getboxlly"> + <cd:command file="supp-box.mkiv" level="system" name="getboxlly"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:csname"/> @@ -1943,7 +2497,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="directgetboxllx"> + <cd:command file="supp-box.mkiv" level="system" name="directgetboxllx"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:csname"/> @@ -1951,7 +2505,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="directgetboxlly"> + <cd:command file="supp-box.mkiv" level="system" name="directgetboxlly"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:csname"/> @@ -1959,13 +2513,13 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="shownextbox"> + <cd:command file="supp-box.mkiv" level="system" name="shownextbox"> <cd:arguments> <cd:csname/> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="spreadhbox"> + <cd:command file="supp-box.mkiv" level="system" name="spreadhbox"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:csname"/> @@ -1973,7 +2527,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="minimalhbox"> + <cd:command file="supp-box.mkiv" level="system" name="minimalhbox"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -1981,13 +2535,13 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="nodetostring"> + <cd:command file="supp-box.mkiv" level="system" name="nodetostring"> <cd:arguments> <cd:csname/> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="getnaturaldimensions"> + <cd:command file="supp-box.mkiv" level="system" name="getnaturaldimensions"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:csname"/> @@ -1995,10 +2549,10 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="lastnaturalboxwd"/> - <cd:command file="supp-box.mkiv" name="lastnaturalboxht"/> - <cd:command file="supp-box.mkiv" name="lastnaturalboxdp"/> - <cd:command file="supp-box.mkiv" name="naturalwd"> + <cd:command file="supp-box.mkiv" level="system" name="lastnaturalboxwd"/> + <cd:command file="supp-box.mkiv" level="system" name="lastnaturalboxht"/> + <cd:command file="supp-box.mkiv" level="system" name="lastnaturalboxdp"/> + <cd:command file="supp-box.mkiv" level="system" name="naturalwd"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:csname"/> @@ -2006,7 +2560,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="doifelserighttoleftinbox"> + <cd:command category="conditional" file="supp-box.mkiv" level="system" name="doifelserighttoleftinbox"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:csname"/> @@ -2020,7 +2574,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="doifrighttoleftinboxelse"> + <cd:command category="conditional" file="supp-box.mkiv" level="system" name="doifrighttoleftinboxelse"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:csname"/> @@ -2034,15 +2588,15 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="runninghbox"> + <cd:command file="supp-box.mkiv" level="system" name="runninghbox"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command begin="begin" end="end" file="supp-box.mkiv" name="vbox" type="environment"/> - <cd:command begin="begin" end="end" file="supp-box.mkiv" name="hbox" type="environment"/> - <cd:command begin="begin" end="end" file="supp-box.mkiv" name="vtop" type="environment"/> - <cd:command file="supp-box.mkiv" name="setvboxregister"> + <cd:command begin="begin" end="end" file="supp-box.mkiv" level="system" name="vbox" type="environment"/> + <cd:command begin="begin" end="end" file="supp-box.mkiv" level="system" name="hbox" type="environment"/> + <cd:command begin="begin" end="end" file="supp-box.mkiv" level="system" name="vtop" type="environment"/> + <cd:command file="supp-box.mkiv" level="system" name="setvboxregister"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:csname"/> @@ -2051,7 +2605,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="sethboxregister"> + <cd:command file="supp-box.mkiv" level="system" name="sethboxregister"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:csname"/> @@ -2060,7 +2614,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="setvtopregister"> + <cd:command file="supp-box.mkiv" level="system" name="setvtopregister"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:csname"/> @@ -2069,7 +2623,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="flushboxregister"> + <cd:command file="supp-box.mkiv" level="system" name="flushboxregister"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:csname"/> @@ -2077,7 +2631,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="vboxregister" type="environment"> + <cd:command file="supp-box.mkiv" level="system" name="vboxregister" type="environment"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:csname"/> @@ -2085,7 +2639,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="hboxregister" type="environment"> + <cd:command file="supp-box.mkiv" level="system" name="hboxregister" type="environment"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:csname"/> @@ -2093,7 +2647,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="vtopregister" type="environment"> + <cd:command file="supp-box.mkiv" level="system" name="vtopregister" type="environment"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:csname"/> @@ -2101,7 +2655,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-ali.mkiv" name="righttolefthbox"> + <cd:command category="alignment" file="spac-ali.mkiv" level="system" name="righttolefthbox"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -2109,7 +2663,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="spac-ali.mkiv" name="lefttorighthbox"> + <cd:command category="alignment" file="spac-ali.mkiv" level="system" name="lefttorighthbox"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -2117,7 +2671,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="spac-ali.mkiv" name="righttoleftvbox"> + <cd:command category="alignment" file="spac-ali.mkiv" level="system" name="righttoleftvbox"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -2125,7 +2679,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="spac-ali.mkiv" name="lefttorightvbox"> + <cd:command category="alignment" file="spac-ali.mkiv" level="system" name="lefttorightvbox"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -2133,7 +2687,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="spac-ali.mkiv" name="righttoleftvtop"> + <cd:command category="alignment" file="spac-ali.mkiv" level="system" name="righttoleftvtop"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -2141,7 +2695,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="spac-ali.mkiv" name="lefttorightvtop"> + <cd:command category="alignment" file="spac-ali.mkiv" level="system" name="lefttorightvtop"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -2149,7 +2703,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="spac-ali.mkiv" name="autodirhbox"> + <cd:command category="alignment" file="spac-ali.mkiv" level="system" name="autodirhbox"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -2157,7 +2711,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="spac-ali.mkiv" name="autodirvbox"> + <cd:command category="alignment" file="spac-ali.mkiv" level="system" name="autodirvbox"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -2165,7 +2719,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="spac-ali.mkiv" name="autodirvtop"> + <cd:command category="alignment" file="spac-ali.mkiv" level="system" name="autodirvtop"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -2173,7 +2727,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="spac-ali.mkiv" name="leftorrighthbox"> + <cd:command category="alignment" file="spac-ali.mkiv" level="system" name="leftorrighthbox"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -2181,7 +2735,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="spac-ali.mkiv" name="leftorrightvbox"> + <cd:command category="alignment" file="spac-ali.mkiv" level="system" name="leftorrightvbox"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -2189,7 +2743,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="spac-ali.mkiv" name="leftorrightvtop"> + <cd:command category="alignment" file="spac-ali.mkiv" level="system" name="leftorrightvtop"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -2197,17 +2751,17 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="spac-ali.mkiv" name="ibox"> + <cd:command file="spac-ali.mkiv" level="system" name="ibox"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="spac-ali.mkiv" name="obox"> + <cd:command file="spac-ali.mkiv" level="system" name="obox"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="spac-ali.mkiv" name="definehbox"> + <cd:command file="spac-ali.mkiv" level="system" name="definehbox"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -2217,7 +2771,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-ali.mkiv" generated="yes" name="hbox" variant="example"> + <cd:command file="spac-ali.mkiv" generated="yes" level="system" name="hbox" variant="example"> <cd:sequence> <cd:string value="hbox"/> <cd:variable value="box"/> @@ -2226,10 +2780,114 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="lastlinewidth"/> + <cd:command file="supp-box.mkiv" level="system" name="lastlinewidth"/> + <cd:command file="supp-box.mkiv" level="system" name="putboxincache"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:name"/> + </cd:keywords> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:number"/> + <cd:constant type="cd:text"/> + </cd:keywords> + <cd:keywords delimiters="none"> + <cd:constant type="cd:csname"/> + <cd:constant type="cd:number"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command file="supp-box.mkiv" level="system" name="getboxfromcache"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:name"/> + </cd:keywords> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:number"/> + <cd:constant type="cd:text"/> + </cd:keywords> + <cd:keywords delimiters="none"> + <cd:constant type="cd:csname"/> + <cd:constant type="cd:number"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command category="conditional" file="supp-box.mkiv" level="system" name="doifelseboxincache"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:name"/> + </cd:keywords> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:number"/> + <cd:constant type="cd:text"/> + </cd:keywords> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:true"/> + </cd:keywords> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:false"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command file="supp-box.mkiv" level="system" name="copyboxfromcache"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:name"/> + </cd:keywords> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:number"/> + <cd:constant type="cd:text"/> + </cd:keywords> + <cd:keywords delimiters="none"> + <cd:constant type="cd:csname"/> + <cd:constant type="cd:number"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command file="supp-box.mkiv" level="system" name="directboxfromcache"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:name"/> + </cd:keywords> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:number"/> + <cd:constant type="cd:text"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command file="supp-box.mkiv" level="system" name="directcopyboxfromcache"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:name"/> + </cd:keywords> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:number"/> + <cd:constant type="cd:text"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command file="supp-box.mkiv" level="system" name="resetboxesincache"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:name"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command file="supp-box.mkiv" level="system" name="putnextboxincache"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:name"/> + </cd:keywords> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:number"/> + <cd:constant type="cd:text"/> + </cd:keywords> + <cd:csname/> + <cd:content/> + </cd:arguments> + </cd:command> </cd:interface> <cd:interface file="i-buffer.xml"> - <cd:command file="buff-ini.mkiv" name="doifelsebuffer"> + <cd:command category="buffer conditional" file="buff-ini.mkiv" level="system" name="doifelsebuffer"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:buffer"/> @@ -2242,7 +2900,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="buff-ini.mkiv" name="doifbufferelse"> + <cd:command category="buffer conditional" file="buff-ini.mkiv" level="system" name="doifbufferelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:buffer"/> @@ -2255,21 +2913,21 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="buff-ini.mkiv" name="resetbuffer"> + <cd:command category="buffer" file="buff-ini.mkiv" level="system" name="resetbuffer"> <cd:arguments> <cd:keywords> <cd:constant type="cd:buffer"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="buff-ini.mkiv" name="buffer" type="environment"> + <cd:command category="buffer" file="buff-ini.mkiv" level="document" name="buffer" type="environment"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="buff-ini.mkiv" name="grabbufferdata"> + <cd:command category="buffer" file="buff-ini.mkiv" level="system" name="grabbufferdata"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:category"/> @@ -2285,7 +2943,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="buff-ini.mkiv" name="grabbufferdatadirect"> + <cd:command category="buffer" file="buff-ini.mkiv" level="system" name="grabbufferdatadirect"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -2298,14 +2956,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command begin="set" end="end" file="buff-ini.mkiv" name="buffer" type="environment"> + <cd:command begin="set" category="buffer" end="end" file="buff-ini.mkiv" level="system" name="buffer" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="buff-ini.mkiv" name="setupbuffer"> + <cd:command category="buffer" file="buff-ini.mkiv" level="style" name="setupbuffer"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:buffer"/> @@ -2320,7 +2978,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="buff-ini.mkiv" name="definebuffer"> + <cd:command category="buffer" file="buff-ini.mkiv" level="style" name="definebuffer"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -2333,43 +2991,42 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="buff-ini.mkiv" name="getbuffer"> + <cd:command category="buffer" file="buff-ini.mkiv" level="document" name="getbuffer"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:buffer"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="buff-ini.mkiv" name="getdefinedbuffer"> + <cd:command category="buffer" file="buff-ini.mkiv" level="system" name="getdefinedbuffer"> <cd:arguments> <cd:keywords> <cd:constant type="cd:buffer"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="buff-ini.mkiv" name="inlinebuffer"> + <cd:command category="buffer" file="buff-ini.mkiv" level="document" name="inlinebuffer"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:buffer"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="buff-ini.mkiv" generated="yes" name="buffer" type="environment" variant="example"> + <cd:command evel="document" file="buff-ini.mkiv" generated="yes" lcategory="buffer" name="buffer" type="environment" variant="instance"> <cd:sequence> - <cd:variable value="buffer"/> + <cd:instance value="buffer"/> </cd:sequence> <cd:instances> <cd:constant value="hiding"/> </cd:instances> </cd:command> - <cd:command file="buff-ini.mkiv" generated="yes" name="getbuffer" variant="example"> + <cd:command category="buffer" file="buff-ini.mkiv" generated="yes" level="document" name="getbuffer" variant="instance"> <cd:sequence> <cd:string value="get"/> - <cd:variable value="buffer"/> + <cd:instance value="buffer"/> </cd:sequence> </cd:command> - <cd:command file="buff-ini.mkiv" name="hiding" type="environment"/> - <cd:command file="buff-ini.mkiv" name="processtexbuffer"> + <cd:command category="buffer" file="buff-ini.mkiv" level="style" name="processtexbuffer"> <cd:sequence> <cd:string value="processTEXbuffer"/> </cd:sequence> @@ -2379,7 +3036,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="buff-ini.mkiv" name="savebuffer" variant="list"> + <cd:command category="buffer" file="buff-ini.mkiv" level="style" name="savebuffer" variant="list"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:buffer"/> @@ -2389,7 +3046,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="buff-ini.mkiv" name="savebuffer"> + <cd:command category="buffer" file="buff-ini.mkiv" level="style" name="savebuffer"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="list"> @@ -2405,28 +3062,28 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="buff-ini.mkiv" name="ctxluabuffer"> + <cd:command category="buffer lua" file="buff-ini.mkiv" level="style" name="ctxluabuffer"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:buffer"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="buff-ini.mkiv" name="mkvibuffer"> + <cd:command category="buffer" file="buff-ini.mkiv" level="style" name="mkvibuffer"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:buffer"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="buff-ini.mkiv" name="getbufferdata"> + <cd:command category="buffer" file="buff-ini.mkiv" level="style" name="getbufferdata"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:buffer"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="buff-ver.mkiv" name="typebuffer"> + <cd:command category="buffer verbatim" file="buff-ver.mkiv" level="document" name="typebuffer"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:buffer"/> @@ -2436,10 +3093,10 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="buff-ver.mkiv" generated="yes" name="typebuffer" variant="example"> + <cd:command category="buffer verbatim" file="buff-ver.mkiv" generated="yes" level="document" name="typebuffer" variant="instance"> <cd:sequence> <cd:string value="type"/> - <cd:variable value="buffer"/> + <cd:instance value="buffer"/> </cd:sequence> <cd:arguments> <cd:assignments list="yes" optional="yes"> @@ -2447,7 +3104,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="buff-ver.mkiv" name="typedefinedbuffer"> + <cd:command category="buffer verbatim" file="buff-ver.mkiv" level="system" name="typedefinedbuffer"> <cd:arguments> <cd:keywords> <cd:constant type="cd:buffer"/> @@ -2457,9 +3114,55 @@ </cd:assignments> </cd:arguments> </cd:command> + <cd:command category="buffer verbatim" file="lxml-ini.mkiv" level="style" name="prettyprintbuffer"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:buffer"/> + </cd:keywords> + <cd:keywords delimiters="braces"> + <cd:constant type="mp"/> + <cd:constant type="lua"/> + <cd:constant type="xml"/> + <cd:constant type="parsed-xml"/> + <cd:constant type="nested"/> + <cd:constant type="tex"/> + <cd:constant type="context"/> + <cd:constant type="none"/> + <cd:constant type="cd:name"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command category="buffer verbatim" file="lxml-ini.mkiv" level="style" name="inlineprettyprintbuffer"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:buffer"/> + </cd:keywords> + <cd:keywords delimiters="braces"> + <cd:constant type="mp"/> + <cd:constant type="lua"/> + <cd:constant type="xml"/> + <cd:constant type="parsed-xml"/> + <cd:constant type="nested"/> + <cd:constant type="tex"/> + <cd:constant type="context"/> + <cd:constant type="none"/> + <cd:constant type="cd:name"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command category="buffer verbatim" file="buff-ver.mkiv" level="style" name="typeinlinebuffer"> + <cd:arguments> + <cd:keywords list="yes" optional="yes"> + <cd:constant type="cd:buffer"/> + </cd:keywords> + <cd:assignments list="yes" optional="yes"> + <cd:inherit name="setuptype"/> + </cd:assignments> + </cd:arguments> + </cd:command> </cd:interface> <cd:interface file="i-button.xml"> - <cd:command file="scrn-but.mkvi" name="definebutton"> + <cd:command catehory="pdf" file="scrn-but.mkvi" level="style" name="definebutton"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -2472,7 +3175,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="scrn-but.mkvi" name="setupbutton"> + <cd:command catehory="pdf" file="scrn-but.mkvi" level="style" name="setupbutton"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -2507,7 +3210,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="scrn-but.mkvi" generated="yes" name="button" variant="example"> + <cd:command catehory="pdf" file="scrn-but.mkvi" generated="yes" level="document" name="button" variant="example"> <cd:sequence> <cd:variable value="button"/> </cd:sequence> @@ -2526,7 +3229,7 @@ <cd:constant value="button"/> </cd:instances> </cd:command> - <cd:command file="scrn-but.mkvi" name="button"> + <cd:command catehory="pdf" file="scrn-but.mkvi" level="document" name="button"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupbutton"/> @@ -2539,28 +3242,28 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="scrn-but.mkvi" name="overlaybutton"> + <cd:command catehory="pdf" file="scrn-but.mkvi" level="style" name="overlaybutton"> <cd:arguments> <cd:keywords> <cd:constant type="cd:reference"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="scrn-but.mkvi" name="overlaybutton" variant="direct"> + <cd:command catehory="pdf" file="scrn-but.mkvi" level="style" name="overlaybutton" variant="direct"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:reference"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="scrn-but.mkvi" name="MPmenubuttons"> + <cd:command catehory="pdf" file="scrn-but.mkvi" level="style" name="MPmenubuttons"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="scrn-fld.mkvi" name="overlayrollbutton"> + <cd:command catehory="pdf" file="scrn-fld.mkvi" level="style" name="overlayrollbutton"> <cd:arguments> <cd:keywords> <cd:constant type="cd:reference"/> @@ -2570,7 +3273,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="scrn-fld.mkvi" name="definepushbutton"> + <cd:command catehory="pdf" file="scrn-fld.mkvi" level="style" name="definepushbutton"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -2580,7 +3283,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="scrn-fld.mkvi" name="pushbutton"> + <cd:command catehory="pdf" file="scrn-fld.mkvi" level="style" name="pushbutton"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -2590,7 +3293,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="scrn-fld.mkvi" name="definepushsymbol"> + <cd:command catehory="pdf" file="scrn-fld.mkvi" level="style" name="definepushsymbol"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -2602,7 +3305,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="scrn-fld.mkvi" name="rollbutton" variant="interactionmenu"> + <cd:command catehory="pdf" file="scrn-fld.mkvi" level="style" name="rollbutton" variant="interactionmenu"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -2618,7 +3321,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="scrn-fld.mkvi" name="rollbutton" variant="button"> + <cd:command catehory="pdf" file="scrn-fld.mkvi" level="style" name="rollbutton" variant="button"> <cd:arguments> <cd:assignments list="yes"> <cd:inherit name="setupbutton"/> @@ -2633,7 +3336,7 @@ </cd:command> </cd:interface> <cd:interface file="i-capitals.xml"> - <cd:command file="typo-cap.mkiv" name="definecapitals"> + <cd:command category="fonts" file="typo-cap.mkiv" level="style" name="definecapitals"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -2646,7 +3349,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="typo-cap.mkiv" name="setupcapitals"> + <cd:command category="fonts" file="typo-cap.mkiv" level="style" name="setupcapitals"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -2667,7 +3370,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="typo-cap.mkiv" name="setcharactercasing"> + <cd:command category="fonts" file="typo-cap.mkiv" level="style" name="setcharactercasing"> <cd:arguments> <cd:keywords> <cd:constant type="reset"/> @@ -2686,211 +3389,211 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-cap.mkiv" name="WORD"> + <cd:command category="fonts" file="typo-cap.mkiv" level="document" name="WORD"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-cap.mkiv" name="word"> + <cd:command category="fonts" file="typo-cap.mkiv" level="document" name="word"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-cap.mkiv" name="Word"> + <cd:command category="fonts" file="typo-cap.mkiv" level="document" name="Word"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-cap.mkiv" name="Words"> + <cd:command category="fonts" file="typo-cap.mkiv" level="document" name="Words"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-cap.mkiv" name="camel"> + <cd:command category="fonts" file="typo-cap.mkiv" level="document" name="camel"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-cap.mkiv" name="WORDS"> + <cd:command category="fonts" file="typo-cap.mkiv" level="document" name="WORDS"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-cap.mkiv" name="words"> + <cd:command category="fonts" file="typo-cap.mkiv" level="document" name="words"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-cap.mkiv" name="pseudosmallcapped"> + <cd:command category="fonts" file="typo-cap.mkiv" level="style" name="pseudosmallcapped"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-cap.mkiv" name="pseudoSmallcapped"> + <cd:command category="fonts" file="typo-cap.mkiv" level="style" name="pseudoSmallcapped"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-cap.mkiv" name="pseudoSmallCapped"> + <cd:command category="fonts" file="typo-cap.mkiv" level="style" name="pseudoSmallCapped"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-cap.mkiv" name="pseudoMixedCapped"> + <cd:command category="fonts" file="typo-cap.mkiv" level="style" name="pseudoMixedCapped"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-cap.mkiv" name="realsmallcapped"> + <cd:command category="fonts" file="typo-cap.mkiv" level="style" name="realsmallcapped"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-cap.mkiv" name="realSmallcapped"> + <cd:command category="fonts" file="typo-cap.mkiv" level="style" name="realSmallcapped"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-cap.mkiv" name="realSmallCapped"> + <cd:command category="fonts" file="typo-cap.mkiv" level="style" name="realSmallCapped"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-cap.mkiv" name="notsmallcapped"> + <cd:command category="fonts" file="typo-cap.mkiv" level="style" name="notsmallcapped"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-cap.mkiv" name="smallcapped"> + <cd:command category="fonts" file="typo-cap.mkiv" level="style" name="smallcapped"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-cap.mkiv" name="Smallcapped"> + <cd:command category="fonts" file="typo-cap.mkiv" level="style" name="Smallcapped"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-cap.mkiv" name="SmallCapped"> + <cd:command category="fonts" file="typo-cap.mkiv" level="style" name="SmallCapped"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-cap.mkiv" name="autocap"> + <cd:command category="fonts" file="typo-cap.mkiv" level="style" name="autocap"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-cap.mkiv" name="mixedcaps"> + <cd:command category="fonts" file="typo-cap.mkiv" level="style" name="mixedcaps"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-cap.mkiv" name="kap"> + <cd:command category="fonts" file="typo-cap.mkiv" level="style" name="kap"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-cap.mkiv" name="Caps"> + <cd:command category="fonts" file="typo-cap.mkiv" level="style" name="Caps"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-cap.mkiv" name="uppercased"> + <cd:command category="fonts" file="typo-cap.mkiv" level="style" name="uppercased"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-cap.mkiv" name="lowercased"> + <cd:command category="fonts" file="typo-cap.mkiv" level="style" name="lowercased"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-cap.mkiv" name="randomizetext"> + <cd:command category="fonts" file="typo-cap.mkiv" level="style" name="randomizetext"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-cap.mkiv" name="randomized" type="environment"/> + <cd:command category="fonts" file="typo-cap.mkiv" level="document" name="randomized" type="environment"/> </cd:interface> <cd:interface file="i-catcodes.xml"> - <cd:command file="catc-ctx.mkiv" name="texcode" type="environment"/> - <cd:command file="catc-ctx.mkiv" name="contextcode" type="environment"/> - <cd:command file="catc-ctx.mkiv" name="contextdefinitioncode" type="environment"/> - <cd:command begin="un" end="" file="catc-def.mkiv" name="protect" type="environment"/> - <cd:command file="catc-ini.mkiv" name="newcatcodetable"> + <cd:command category="catcode" file="catc-ctx.mkiv" level="system" name="texcode" type="environment"/> + <cd:command category="catcode" file="catc-ctx.mkiv" level="system" name="contextcode" type="environment"/> + <cd:command category="catcode" file="catc-ctx.mkiv" level="system" name="contextdefinitioncode" type="environment"/> + <cd:command begin="un" category="catcode" end="" file="catc-def.mkiv" level="system" name="protect" type="environment"/> + <cd:command category="catcode" file="catc-ini.mkiv" level="system" name="newcatcodetable"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="catc-ini.mkiv" name="catcodetable" type="environment"> + <cd:command category="catcode" file="catc-ini.mkiv" level="system" name="catcodetable" type="environment"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="catc-ini.mkiv" name="extendedcatcodetable" type="environment"> + <cd:command category="catcode" file="catc-ini.mkiv" level="system" name="extendedcatcodetable" type="environment"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="catc-act.mkiv" name="installactivecharacter"> + <cd:command category="catcode" file="catc-act.mkiv" level="system" name="installactivecharacter"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:character"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="catc-act.mkiv" name="defineactivecharacter"> + <cd:command category="catcode" file="catc-act.mkiv" level="system" name="defineactivecharacter"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:character"/> @@ -2900,7 +3603,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="catc-act.mkiv" name="installanddefineactivecharacter"> + <cd:command category="catcode" file="catc-act.mkiv" level="system" name="installanddefineactivecharacter"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:character"/> @@ -2910,16 +3613,16 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="catc-act.mkiv" name="makecharacteractive"> + <cd:command category="catcode" file="catc-act.mkiv" level="system" name="makecharacteractive"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:character"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="catc-ini.mkiv" name="permitcircumflexescape"/> - <cd:command file="catc-ini.mkiv" name="permitcaretescape"/> - <cd:command file="catc-ini.mkiv" name="letcatcodecommand"> + <cd:command category="catcode" file="catc-ini.mkiv" level="system" name="permitcircumflexescape"/> + <cd:command category="catcode" file="catc-ini.mkiv" level="system" name="permitcaretescape"/> + <cd:command category="catcode" file="catc-ini.mkiv" level="system" name="letcatcodecommand"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="none"> @@ -2929,7 +3632,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="catc-ini.mkiv" name="defcatcodecommand"> + <cd:command category="catcode" file="catc-ini.mkiv" level="system" name="defcatcodecommand"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="none"> @@ -2941,7 +3644,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="catc-ini.mkiv" name="uedcatcodecommand"> + <cd:command category="catcode" file="catc-ini.mkiv" level="system" name="uedcatcodecommand"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="none"> @@ -2953,21 +3656,21 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command begin="push" end="pop" file="catc-ini.mkiv" name="catcodetable" type="environment"/> - <cd:command file="catc-ini.mkiv" name="restorecatcodes"/> - <cd:command file="catc-ini.mkiv" name="setcatcodetable"> + <cd:command begin="push" category="catcode" end="pop" file="catc-ini.mkiv" level="system" name="catcodetable" type="environment"/> + <cd:command category="catcode" file="catc-ini.mkiv" level="system" name="restorecatcodes"/> + <cd:command category="catcode" file="catc-ini.mkiv" level="system" name="setcatcodetable"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="catc-ini.mkiv" name="tracecatcodetables"/> - <cd:command file="catc-ini.mkiv" name="catcodetablename"/> - <cd:command file="catc-sym.mkiv" name="rescan"> + <cd:command category="catcode" file="catc-ini.mkiv" level="system" name="tracecatcodetables"/> + <cd:command category="catcode" file="catc-ini.mkiv" level="system" name="catcodetablename"/> + <cd:command category="catcode" file="catc-sym.mkiv" level="system" name="rescan"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="catc-sym.mkiv" name="rescanwithsetup"> + <cd:command category="catcode" file="catc-sym.mkiv" level="system" name="rescanwithsetup"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -2977,46 +3680,50 @@ </cd:command> </cd:interface> <cd:interface file="i-character.xml"> - <cd:command file="catc-sym.mkiv" name="letteropenbrace"/> - <cd:command file="catc-sym.mkiv" name="letterclosebrace"/> - <cd:command file="catc-sym.mkiv" name="letterampersand"/> - <cd:command file="catc-sym.mkiv" name="letterless"/> - <cd:command file="catc-sym.mkiv" name="lettermore"/> - <cd:command file="catc-sym.mkiv" name="letterhash"/> - <cd:command file="catc-sym.mkiv" name="letterdoublequote"/> - <cd:command file="catc-sym.mkiv" name="lettersinglequote"/> - <cd:command file="catc-sym.mkiv" name="letterdollar"/> - <cd:command file="catc-sym.mkiv" name="letterpercent"/> - <cd:command file="catc-sym.mkiv" name="letterhat"/> - <cd:command file="catc-sym.mkiv" name="letterunderscore"/> - <cd:command file="catc-sym.mkiv" name="letterbar"/> - <cd:command file="catc-sym.mkiv" name="lettertilde"/> - <cd:command file="catc-sym.mkiv" name="letterbackslash"/> - <cd:command file="catc-sym.mkiv" name="letterslash"/> - <cd:command file="catc-sym.mkiv" name="letterquestionmark"/> - <cd:command file="catc-sym.mkiv" name="letterat"/> - <cd:command file="catc-sym.mkiv" name="lettercolon"/> - <cd:command file="catc-sym.mkiv" name="letterescape"/> - <cd:command file="catc-sym.mkiv" name="letterbgroup"/> - <cd:command file="catc-sym.mkiv" name="letteregroup"/> - <cd:command file="catc-sym.mkiv" name="letterleftbrace"/> - <cd:command file="catc-sym.mkiv" name="letterrightbrace"/> - <cd:command file="catc-sym.mkiv" name="letterexclamationmark"/> - <cd:command file="char-ini.mkiv" name="utfchar"> + <cd:command category="characters" file="catc-sym.mkiv" level="document" name="letteropenbrace"/> + <cd:command category="characters" file="catc-sym.mkiv" level="document" name="letterclosebrace"/> + <cd:command category="characters" file="catc-sym.mkiv" level="document" name="letterampersand"/> + <cd:command category="characters" file="catc-sym.mkiv" level="document" name="letterless"/> + <cd:command category="characters" file="catc-sym.mkiv" level="document" name="lettermore"/> + <cd:command category="characters" file="catc-sym.mkiv" level="document" name="letterhash"/> + <cd:command category="characters" file="catc-sym.mkiv" level="document" name="letterdoublequote"/> + <cd:command category="characters" file="catc-sym.mkiv" level="document" name="lettersinglequote"/> + <cd:command category="characters" file="catc-sym.mkiv" level="document" name="letterdollar"/> + <cd:command category="characters" file="catc-sym.mkiv" level="document" name="letterpercent"/> + <cd:command category="characters" file="catc-sym.mkiv" level="document" name="letterhat"/> + <cd:command category="characters" file="catc-sym.mkiv" level="document" name="letterunderscore"/> + <cd:command category="characters" file="catc-sym.mkiv" level="document" name="letterbar"/> + <cd:command category="characters" file="catc-sym.mkiv" level="document" name="lettertilde"/> + <cd:command category="characters" file="catc-sym.mkiv" level="document" name="letterbackslash"/> + <cd:command category="characters" file="catc-sym.mkiv" level="document" name="letterslash"/> + <cd:command category="characters" file="catc-sym.mkiv" level="document" name="letterquestionmark"/> + <cd:command category="characters" file="catc-sym.mkiv" level="document" name="letterat"/> + <cd:command category="characters" file="catc-sym.mkiv" level="document" name="lettercolon"/> + <cd:command category="characters" file="catc-sym.mkiv" level="document" name="letterleftparenthesis"/> + <cd:command category="characters" file="catc-sym.mkiv" level="document" name="letterrightparenthesis"/> + <cd:command category="characters" file="catc-sym.mkiv" level="document" name="letterleftbracket"/> + <cd:command category="characters" file="catc-sym.mkiv" level="document" name="letterrightbracket"/> + <cd:command category="characters" file="catc-sym.mkiv" level="document" name="letterescape"/> + <cd:command category="characters" file="catc-sym.mkiv" level="document" name="letterbgroup"/> + <cd:command category="characters" file="catc-sym.mkiv" level="document" name="letteregroup"/> + <cd:command category="characters" file="catc-sym.mkiv" level="document" name="letterleftbrace"/> + <cd:command category="characters" file="catc-sym.mkiv" level="document" name="letterrightbrace"/> + <cd:command category="characters" file="catc-sym.mkiv" level="document" name="letterexclamationmark"/> + <cd:command category="characters fonts" file="char-ini.mkiv" level="document" name="utfchar"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="char-ini.mkiv" name="safechar"> + <cd:command category="characters fonts" file="char-ini.mkiv" level="style" name="safechar"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="char-ini.mkiv" name="checkedchar"> + <cd:command category="characters fonts" file="char-ini.mkiv" level="style" name="checkedchar"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> @@ -3026,47 +3733,47 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="char-ini.mkiv" name="textormathchar"> + <cd:command category="characters fonts" file="char-ini.mkiv" level="style" name="textormathchar"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="char-ini.mkiv" name="chardescription"> + <cd:command category="characters" file="char-ini.mkiv" level="style" name="chardescription"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="enco-ini.mkiv" name="percent"/> - <cd:command file="enco-ini.mkiv" name="procent"/> - <cd:command file="enco-ini.mkiv" name="ampersand"/> - <cd:command file="enco-ini.mkiv" name="dollar"/> - <cd:command file="enco-ini.mkiv" name="hash"/> - <cd:command file="enco-ini.mkiv" name="hyphen"/> - <cd:command file="enco-ini.mkiv" name="lowerleftsingleninequote"/> - <cd:command file="enco-ini.mkiv" name="lowerleftdoubleninequote"/> - <cd:command file="enco-ini.mkiv" name="lowerrightsingleninequote"/> - <cd:command file="enco-ini.mkiv" name="lowerrightdoubleninequote"/> - <cd:command file="enco-ini.mkiv" name="upperleftsingleninequote"/> - <cd:command file="enco-ini.mkiv" name="upperleftdoubleninequote"/> - <cd:command file="enco-ini.mkiv" name="upperrightsingleninequote"/> - <cd:command file="enco-ini.mkiv" name="upperrightdoubleninequote"/> - <cd:command file="enco-ini.mkiv" name="upperleftsinglesixquote"/> - <cd:command file="enco-ini.mkiv" name="upperleftdoublesixquote"/> - <cd:command file="enco-ini.mkiv" name="upperrightsinglesixquote"/> - <cd:command file="enco-ini.mkiv" name="upperrightdoublesixquote"/> - <cd:command file="enco-ini.mkiv" name="leftsubguillemot"/> - <cd:command file="enco-ini.mkiv" name="rightsubguillemot"/> - <cd:command file="enco-ini.mkiv" name="textcontrolspace"/> - <cd:command file="enco-ini.mkiv" name="textvisiblespace"/> - <cd:command file="enco-ini.mkiv" name="textminus"/> - <cd:command file="enco-ini.mkiv" name="textplus"/> + <cd:command category="characters" file="enco-ini.mkiv" level="document" name="percent"/> + <cd:command category="characters" file="enco-ini.mkiv" level="document" name="procent"/> + <cd:command category="characters" file="enco-ini.mkiv" level="document" name="ampersand"/> + <cd:command category="characters" file="enco-ini.mkiv" level="document" name="dollar"/> + <cd:command category="characters" file="enco-ini.mkiv" level="document" name="hash"/> + <cd:command category="characters" file="enco-ini.mkiv" level="document" name="hyphen"/> + <cd:command category="characters" file="enco-ini.mkiv" level="style" name="lowerleftsingleninequote"/> + <cd:command category="characters" file="enco-ini.mkiv" level="style" name="lowerleftdoubleninequote"/> + <cd:command category="characters" file="enco-ini.mkiv" level="style" name="lowerrightsingleninequote"/> + <cd:command category="characters" file="enco-ini.mkiv" level="style" name="lowerrightdoubleninequote"/> + <cd:command category="characters" file="enco-ini.mkiv" level="style" name="upperleftsingleninequote"/> + <cd:command category="characters" file="enco-ini.mkiv" level="style" name="upperleftdoubleninequote"/> + <cd:command category="characters" file="enco-ini.mkiv" level="style" name="upperrightsingleninequote"/> + <cd:command category="characters" file="enco-ini.mkiv" level="style" name="upperrightdoubleninequote"/> + <cd:command category="characters" file="enco-ini.mkiv" level="style" name="upperleftsinglesixquote"/> + <cd:command category="characters" file="enco-ini.mkiv" level="style" name="upperleftdoublesixquote"/> + <cd:command category="characters" file="enco-ini.mkiv" level="style" name="upperrightsinglesixquote"/> + <cd:command category="characters" file="enco-ini.mkiv" level="style" name="upperrightdoublesixquote"/> + <cd:command category="characters" file="enco-ini.mkiv" level="style" name="leftsubguillemot"/> + <cd:command category="characters" file="enco-ini.mkiv" level="style" name="rightsubguillemot"/> + <cd:command category="characters" file="enco-ini.mkiv" level="document" name="textcontrolspace"/> + <cd:command category="characters" file="enco-ini.mkiv" level="document" name="textvisiblespace"/> + <cd:command category="characters" file="enco-ini.mkiv" level="document" name="textminus"/> + <cd:command category="characters" file="enco-ini.mkiv" level="document" name="textplus"/> </cd:interface> <cd:interface file="i-characteralign.xml"> - <cd:command file="typo-tal.mkiv" name="singalcharacteralign"> + <cd:command category="alignment" file="typo-tal.mkiv" level="system" name="singalcharacteralign"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> @@ -3076,7 +3783,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-tal.mkiv" name="setcharacteralign"> + <cd:command category="alignment" file="typo-tal.mkiv" level="system" name="setcharacteralign"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> @@ -3088,9 +3795,9 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-tal.mkiv" name="resetcharacteralign"/> - <cd:command file="typo-tal.mkiv" name="alignmentcharacter"/> - <cd:command file="typo-tal.mkiv" name="characteralign" type="environment"> + <cd:command category="alignment" file="typo-tal.mkiv" level="system" name="resetcharacteralign"/> + <cd:command category="alignment" file="typo-tal.mkiv" level="system" name="alignmentcharacter"/> + <cd:command category="alignment" file="typo-tal.mkiv" level="system" name="characteralign" type="environment"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:text"/> @@ -3099,21 +3806,21 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-tal.mkiv" name="checkcharacteralign"> + <cd:command category="alignment" file="typo-tal.mkiv" level="system" name="checkcharacteralign"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> </cd:interface> <cd:interface file="i-characterspacing.xml"> - <cd:command file="typo-spa.mkiv" name="definecharacterspacing"> + <cd:command category="fonts" file="typo-spa.mkiv" level="style" name="definecharacterspacing"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-spa.mkiv" name="setupcharacterspacing"> + <cd:command category="fonts" file="typo-spa.mkiv" level="style" name="setupcharacterspacing"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -3135,7 +3842,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="typo-spa.mkiv" name="setcharacterspacing"> + <cd:command category="fonts" file="typo-spa.mkiv" level="style" name="setcharacterspacing"> <cd:arguments> <cd:keywords> <cd:constant type="reset"/> @@ -3143,10 +3850,10 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-spa.mkiv" name="resetcharacterspacing"/> + <cd:command category="fonts" file="typo-spa.mkiv" level="style" name="resetcharacterspacing"/> </cd:interface> <cd:interface file="i-characterstripping.xml"> - <cd:command file="typo-rep.mkiv" name="setcharacterstripping"> + <cd:command category="language" file="typo-rep.mkiv" level="style" name="setcharacterstripping"> <cd:arguments> <cd:keywords> <cd:constant type="reset"/> @@ -3154,13 +3861,13 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-rep.mkiv" name="resetcharacterstripping"/> - <cd:command file="typo-rep.mkiv" name="forcecharacterstripping"/> + <cd:command category="language" file="typo-rep.mkiv" level="style" name="resetcharacterstripping"/> + <cd:command category="language" file="typo-rep.mkiv" level="style" name="forcecharacterstripping"/> </cd:interface> <cd:interface file="i-charwidth.xml"> - <cd:command file="typo-lan.mkiv" name="charwidthlanguage"/> - <cd:command file="typo-lan.mkiv" name="averagecharwidth"/> - <cd:command file="typo-lan.mkiv" name="languagecharwidth"> + <cd:command category="language" file="typo-lan.mkiv" level="style" name="charwidthlanguage"/> + <cd:command category="language" file="typo-lan.mkiv" level="style" name="averagecharwidth"/> + <cd:command category="language" file="typo-lan.mkiv" level="style" name="languagecharwidth"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:language"/> @@ -3169,12 +3876,12 @@ </cd:command> </cd:interface> <cd:interface file="i-chemical.xml"> - <cd:command file="chem-ini.mkiv" name="molecule"> + <cd:command file="chem-ini.mkiv" level="document" name="molecule"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="chem-ini.mkiv" name="chem"> + <cd:command file="chem-ini.mkiv" level="document" name="chem"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -3187,14 +3894,21 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="chem-str.mkiv" name="setupchemical"> + <cd:command category="graphics" file="chem-str.mkiv" level="style" name="setupchemical"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> </cd:keywords> <cd:assignments list="yes"> <cd:parameter name="strut"> - <cd:inherit name="value-strut"/> + <cd:constant type="yes"/> + <cd:constant type="no"/> + <cd:constant type="auto"/> + <cd:constant type="cap"/> + <cd:constant type="fit"/> + <cd:constant type="line"/> + <cd:constant type="default"/> + <cd:constant type="cd:character"/> </cd:parameter> <cd:parameter name="width"> <cd:constant default="yes" type="fit"/> @@ -3283,7 +3997,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="chem-str.mkiv" name="setupchemicalframed"> + <cd:command category="graphics" file="chem-str.mkiv" level="style" name="setupchemicalframed"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -3293,7 +4007,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="chem-str.mkiv" name="definechemical"> + <cd:command category="graphics" file="chem-str.mkiv" level="style" name="definechemical"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -3301,7 +4015,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="chem-str.mkiv" name="definechemicalsymbol"> + <cd:command category="graphics" file="chem-str.mkiv" level="style" name="definechemicalsymbol"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -3311,21 +4025,21 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="chem-str.mkiv" name="chemicalsymbol"> + <cd:command category="graphics" file="chem-str.mkiv" level="document" name="chemicalsymbol"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="chem-str.mkiv" name="chemicaltext"> + <cd:command category="graphics" file="chem-str.mkiv" level="document" name="chemicaltext"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="chem-str.mkiv" name="chemical" type="environment"> + <cd:command category="graphics" file="chem-str.mkiv" level="document" name="chemical" type="environment"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -3335,7 +4049,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="chem-str.mkiv" name="chemical"> + <cd:command category="graphics" file="chem-str.mkiv" level="document" name="chemical"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -3348,28 +4062,28 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="chem-str.mkiv" name="chemicaltoptext"> + <cd:command category="graphics" file="chem-str.mkiv" level="document" name="chemicaltoptext"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="chem-str.mkiv" name="chemicalbottext"> + <cd:command category="graphics" file="chem-str.mkiv" level="document" name="chemicalbottext"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="chem-str.mkiv" name="chemicalmidtext"> + <cd:command category="graphics" file="chem-str.mkiv" level="document" name="chemicalmidtext"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="chem-str.mkiv" name="definechemicals"> + <cd:command category="graphics" file="chem-str.mkiv" level="style" name="definechemicals"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -3384,9 +4098,9 @@ </cd:command> </cd:interface> <cd:interface file="i-cleaning.xml"> - <cd:command begin="push" end="pop" file="typo-chr.mkiv" name="punctuation" type="environment"/> - <cd:command file="typo-chr.mkiv" name="removepunctuation"/> - <cd:command file="typo-chr.mkiv" name="markcontent"> + <cd:command begin="push" end="pop" file="typo-chr.mkiv" level="system" name="punctuation" type="environment"/> + <cd:command file="typo-chr.mkiv" level="system" name="removepunctuation"/> + <cd:command file="typo-chr.mkiv" level="system" name="markcontent"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="reset"/> @@ -3396,7 +4110,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="typo-chr.mkiv" name="markedcontent" type="environment"> + <cd:command file="typo-chr.mkiv" level="system" name="markedcontent" type="environment"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="reset"/> @@ -3405,14 +4119,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-chr.mkiv" name="removemarkedcontent"> + <cd:command file="typo-chr.mkiv" level="system" name="removemarkedcontent"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-cln.mkiv" name="setcharactercleaning"> + <cd:command file="typo-cln.mkiv" level="system" name="setcharactercleaning"> <cd:arguments> <cd:keywords> <cd:constant type="reset"/> @@ -3422,7 +4136,7 @@ </cd:command> </cd:interface> <cd:interface file="i-clipping.xml"> - <cd:command file="grph-trf.mkiv" name="setupclipping"> + <cd:command category="graphics" file="grph-trf.mkiv" level="style" name="setupclipping"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="state"> @@ -3483,7 +4197,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="grph-trf.mkiv" name="clip"> + <cd:command category="graphics" file="grph-trf.mkiv" level="document" name="clip"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupclipping"/> @@ -3493,7 +4207,7 @@ </cd:command> </cd:interface> <cd:interface file="i-collector.xml"> - <cd:command file="pack-box.mkiv" name="definecollector"> + <cd:command category="graphics" file="pack-box.mkiv" level="style" name="definecollector"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -3506,7 +4220,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="pack-box.mkiv" name="setupcollector"> + <cd:command category="graphics" file="pack-box.mkiv" level="style" name="setupcollector"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -3560,7 +4274,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="pack-box.mkiv" name="setcollector"> + <cd:command category="graphics" file="pack-box.mkiv" level="document" name="setcollector"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -3571,28 +4285,28 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="pack-box.mkiv" name="resetcollector"> + <cd:command category="graphics" file="pack-box.mkiv" level="style" name="resetcollector"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="pack-box.mkiv" name="flushcollector"> + <cd:command category="graphics" file="pack-box.mkiv" level="document" name="flushcollector"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="pack-box.mkiv" name="composedcollector"> + <cd:command category="graphics" file="pack-box.mkiv" level="document" name="composedcollector"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="pack-box.mkiv" name="adaptcollector"> + <cd:command category="graphics" file="pack-box.mkiv" level="style" name="adaptcollector"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -3602,7 +4316,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="pack-box.mkiv" name="collectedtext"> + <cd:command category="graphics" file="pack-box.mkiv" level="document" name="collectedtext"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupcollector"/> @@ -3625,7 +4339,7 @@ </cd:command> </cd:interface> <cd:interface file="i-color.xml"> - <cd:command file="colo-ext.mkiv" name="negatecolorbox"> + <cd:command category="colors" file="colo-ext.mkiv" level="system" name="negatecolorbox"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:csname"/> @@ -3633,7 +4347,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="colo-ext.mkiv" name="colorintent" type="environment"> + <cd:command category="colors" file="colo-ext.mkiv" level="document" name="colorintent" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="knockout"/> @@ -3642,10 +4356,10 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="colo-ext.mkiv" name="overprint" type="environment"/> - <cd:command file="colo-ext.mkiv" name="knockout" type="environment"/> - <cd:command file="colo-ext.mkiv" name="textcolorintent" type="environment"/> - <cd:command file="colo-grp.mkiv" name="definecolorgroup"> + <cd:command category="colors" file="colo-ext.mkiv" level="document" name="overprint" type="environment"/> + <cd:command category="colors" file="colo-ext.mkiv" level="document" name="knockout" type="environment"/> + <cd:command category="colors" file="colo-ext.mkiv" level="document" name="textcolorintent" type="environment"/> + <cd:command category="colors" file="colo-grp.mkiv" level="style" name="definecolorgroup"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -3659,7 +4373,7 @@ <cd:triplet list="yes"/> </cd:arguments> </cd:command> - <cd:command file="colo-ini.mkiv" name="definecolor"> + <cd:command category="colors" file="colo-ini.mkiv" level="style" name="definecolor"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -3724,7 +4438,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="colo-ini.mkiv" name="definecolor" variant="name"> + <cd:command category="colors" file="colo-ini.mkiv" level="style" name="definecolor" variant="name"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -3734,7 +4448,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="colo-ini.mkiv" name="defineglobalcolor"> + <cd:command category="colors" file="colo-ini.mkiv" level="style" name="defineglobalcolor"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -3744,7 +4458,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="colo-ini.mkiv" name="defineglobalcolor" variant="name"> + <cd:command category="colors" file="colo-ini.mkiv" level="style" name="defineglobalcolor" variant="name"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -3754,7 +4468,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="colo-ini.mkiv" name="definenamedcolor"> + <cd:command category="colors" file="colo-ini.mkiv" level="style" name="definenamedcolor"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -3764,7 +4478,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="colo-ini.mkiv" name="definenamedcolor" variant="name"> + <cd:command category="colors" file="colo-ini.mkiv" level="style" name="definenamedcolor" variant="name"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -3774,7 +4488,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="colo-ini.mkiv" name="defineprocesscolor"> + <cd:command category="colors" file="colo-ini.mkiv" level="style" name="defineprocesscolor"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -3787,7 +4501,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="colo-ini.mkiv" name="definespotcolor"> + <cd:command category="colors" file="colo-ini.mkiv" level="style" name="definespotcolor"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -3828,7 +4542,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="colo-ini.mkiv" name="definemultitonecolor"> + <cd:command category="colors" file="colo-ini.mkiv" level="style" name="definemultitonecolor"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -3846,7 +4560,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="colo-ini.mkiv" name="definetransparency" variant="1"> + <cd:command category="colors" file="colo-ini.mkiv" level="style" name="definetransparency" variant="1"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -3856,7 +4570,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="colo-ini.mkiv" name="definetransparency" variant="2"> + <cd:command category="colors" file="colo-ini.mkiv" level="style" name="definetransparency" variant="2"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -3888,7 +4602,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="colo-ini.mkiv" name="definetransparency" variant="3"> + <cd:command category="colors" file="colo-ini.mkiv" level="style" name="definetransparency" variant="3"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -3898,14 +4612,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="colo-ini.mkiv" name="switchtocolor"> + <cd:command category="colors" file="colo-ini.mkiv" level="style" name="switchtocolor"> <cd:arguments> <cd:keywords> <cd:constant type="cd:color"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="colo-ini.mkiv" name="color"> + <cd:command category="colors" file="colo-ini.mkiv" level="document" name="color"> <cd:arguments> <cd:keywords> <cd:constant type="cd:color"/> @@ -3913,7 +4627,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="colo-ini.mkiv" name="coloronly"> + <cd:command category="colors" file="colo-ini.mkiv" level="style" name="coloronly"> <cd:arguments> <cd:keywords> <cd:constant type="cd:color"/> @@ -3921,7 +4635,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="colo-ini.mkiv" name="transparent"> + <cd:command category="colors" file="colo-ini.mkiv" level="style" name="transparent"> <cd:arguments> <cd:keywords> <cd:constant type="cd:color"/> @@ -3929,7 +4643,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="colo-ini.mkiv" name="graycolor"> + <cd:command category="colors" file="colo-ini.mkiv" level="style" name="graycolor"> <cd:arguments> <cd:keywords> <cd:constant type="cd:color"/> @@ -3937,7 +4651,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="colo-ini.mkiv" name="colored" variant="name"> + <cd:command category="colors" file="colo-ini.mkiv" level="document" name="colored" variant="name"> <cd:arguments> <cd:keywords> <cd:constant type="cd:color"/> @@ -3945,7 +4659,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="colo-ini.mkiv" name="colored"> + <cd:command category="colors" file="colo-ini.mkiv" level="document" name="colored"> <cd:arguments> <cd:assignments list="yes"> <cd:inherit name="definecolor"/> @@ -3953,71 +4667,71 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="colo-ini.mkiv" name="color" type="environment"> + <cd:command category="colors" file="colo-ini.mkiv" level="document" name="color" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:color"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="colo-ini.mkiv" name="coloronly" type="environment"> + <cd:command category="colors" file="colo-ini.mkiv" level="style" name="coloronly" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:color"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="colo-ini.mkiv" name="transparent" type="environment"> + <cd:command category="colors" file="colo-ini.mkiv" name="transparent" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:color"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="colo-ini.mkiv" name="directcolor"> + <cd:command category="colors" file="colo-ini.mkiv" level="document" name="directcolor"> <cd:arguments> <cd:keywords> <cd:constant type="cd:color"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="colo-ini.mkiv" name="directcolored" variant="name"> + <cd:command category="colors" file="colo-ini.mkiv" level="document" name="directcolored" variant="name"> <cd:arguments> <cd:keywords> <cd:constant type="cd:color"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="colo-ini.mkiv" name="directcolored"> + <cd:command category="colors" file="colo-ini.mkiv" level="document" name="directcolored"> <cd:arguments> <cd:assignments list="yes"> <cd:inherit name="definecolor"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="colo-ini.mkiv" name="currentcolor" type="environment"/> - <cd:command file="colo-ini.mkiv" name="colorset" type="environment"> + <cd:command category="colors" file="colo-ini.mkiv" level="system" name="currentcolor" type="environment"/> + <cd:command category="colors" file="colo-ini.mkiv" level="system" name="colorset" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="colo-ini.mkiv" name="usecolors"> + <cd:command category="colors" file="colo-ini.mkiv" level="system" name="usecolors"> <cd:arguments> <cd:keywords> <cd:constant type="cd:file"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="colo-ini.mkiv" name="setupcolor"> + <cd:command category="colors" file="colo-ini.mkiv" level="style" name="setupcolor"> <cd:arguments> <cd:keywords> <cd:constant type="cd:file"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="colo-ini.mkiv" name="setupcolors"> + <cd:command category="colors" file="colo-ini.mkiv" level="style" name="setupcolors"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="state"> @@ -4065,15 +4779,15 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command begin="push" end="pop" file="colo-ini.mkiv" name="color" type="environment"> + <cd:command begin="push" category="colors" end="pop" file="colo-ini.mkiv" level="system" name="color" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:color"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command begin="save" end="restore" file="colo-ini.mkiv" name="color" type="environment"/> - <cd:command file="colo-ini.mkiv" name="definepalet"> + <cd:command begin="save" category="colors" end="restore" file="colo-ini.mkiv" level="system" name="color" type="environment"/> + <cd:command category="colors" file="colo-ini.mkiv" name="definepalet"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -4085,7 +4799,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="colo-ini.mkiv" name="definepalet" variant="name"> + <cd:command category="colors" file="colo-ini.mkiv" level="style" name="definepalet" variant="name"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -4095,22 +4809,22 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="colo-ini.mkiv" name="getpaletsize"> + <cd:command category="colors" file="colo-ini.mkiv" level="system" name="getpaletsize"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="colo-ini.mkiv" name="paletsize"/> - <cd:command file="colo-ini.mkiv" name="setuppalet"> + <cd:command category="colors" file="colo-ini.mkiv" level="system" name="paletsize"/> + <cd:command category="colors" file="colo-ini.mkiv" level="style" name="setuppalet"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="colo-ini.mkiv" name="setcolormodell"> + <cd:command category="colors" file="colo-ini.mkiv" level="system" name="setcolormodell"> <cd:arguments> <cd:keywords> <cd:constant type="black"/> @@ -4123,8 +4837,8 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="colo-ini.mkiv" name="protectedcolors" type="environment"/> - <cd:command file="colo-ini.mkiv" name="defineintermediatecolor"> + <cd:command category="colors" file="colo-ini.mkiv" level="system" name="protectedcolors" type="environment"/> + <cd:command category="colors" file="colo-ini.mkiv" level="style" name="defineintermediatecolor"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -4143,7 +4857,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="color-ini.mkiv" name="doifelsecolor"> + <cd:command category="colors conditional" file="color-ini.mkiv" level="system" name="doifelsecolor"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:color"/> @@ -4156,7 +4870,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="color-ini.mkiv" name="doifcolorelse"> + <cd:command category="colors conditional" file="color-ini.mkiv" level="system" name="doifcolorelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:color"/> @@ -4169,7 +4883,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="color-ini.mkiv" name="doifcolor"> + <cd:command category="colors conditional" file="color-ini.mkiv" level="system" name="doifcolor"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:color"/> @@ -4179,77 +4893,77 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="colo-ini.mkiv" name="textcolor" type="environment"> + <cd:command category="colors" file="colo-ini.mkiv" level="document" name="textcolor" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:color"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="colo-ini.mkiv" name="MPcolor"> + <cd:command category="colors" file="colo-ini.mkiv" level="style" name="MPcolor"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:color"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="colo-ini.mkiv" name="MPcoloronly"> + <cd:command category="colors" file="colo-ini.mkiv" level="style" name="MPcoloronly"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:color"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="colo-ini.mkiv" name="MPtransparency"> + <cd:command category="colors" file="colo-ini.mkiv" level="style" name="MPtransparency"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:color"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="colo-ini.mkiv" name="MPoptions"> + <cd:command category="colors" file="colo-ini.mkiv" level="style" name="MPoptions"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:color"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="colo-ini.mkiv" name="colorvalue"> + <cd:command category="colors" file="colo-ini.mkiv" level="system" name="colorvalue"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:color"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="colo-ini.mkiv" name="grayvalue"> + <cd:command category="colors" file="colo-ini.mkiv" level="system" name="grayvalue"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:color"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="colo-ini.mkiv" name="colorcomponents"> + <cd:command category="colors" file="colo-ini.mkiv" level="system" name="colorcomponents"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:color"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="colo-ini.mkiv" name="transparencycomponents"> + <cd:command category="colors" file="colo-ini.mkiv" level="system" name="transparencycomponents"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:color"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="colo-ini.mkiv" name="processcolorcomponents"> + <cd:command category="colors" file="colo-ini.mkiv" level="system" name="processcolorcomponents"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:color"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="colo-ini.mkiv" name="doifelseblack"> + <cd:command category="colors conditional" file="colo-ini.mkiv" level="system" name="doifelseblack"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:color"/> @@ -4262,7 +4976,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="colo-ini.mkiv" name="doifblackelse"> + <cd:command category="colors conditional" file="colo-ini.mkiv" level="system" name="doifblackelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:color"/> @@ -4275,7 +4989,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="colo-ini.mkiv" name="doifelsedrawingblack"> + <cd:command category="colors conditional" file="colo-ini.mkiv" level="system" name="doifelsedrawingblack"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:true"/> @@ -4285,7 +4999,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="colo-ini.mkiv" name="doifdrawingblackelse"> + <cd:command category="colors conditional" file="colo-ini.mkiv" level="system" name="doifdrawingblackelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:true"/> @@ -4295,35 +5009,35 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="colo-run.mkiv" name="showcolorbar"> + <cd:command category="colors" file="colo-run.mkiv" level="document" name="showcolorbar"> <cd:arguments> <cd:keywords> <cd:constant type="cd:color"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="colo-run.mkiv" name="showcolor"> + <cd:command category="colors" file="colo-run.mkiv" level="document" name="showcolor"> <cd:arguments> <cd:keywords> <cd:constant type="cd:color"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="colo-run.mkiv" name="showcolorset"> + <cd:command category="colors" file="colo-run.mkiv" level="document" name="showcolorset"> <cd:arguments> <cd:keywords> <cd:constant type="cd:color"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="colo-run.mkiv" name="showcolorcomponents"> + <cd:command category="colors" file="colo-run.mkiv" level="document" name="showcolorcomponents"> <cd:arguments> <cd:keywords> <cd:constant type="cd:color"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="colo-run.mkiv" name="showpalet"> + <cd:command category="colors" file="colo-run.mkiv" level="document" name="showpalet"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -4337,14 +5051,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="colo-run.mkiv" name="comparepalet"> + <cd:command category="colors" file="colo-run.mkiv" level="document" name="comparepalet"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="colo-run.mkiv" name="showcolorgroup"> + <cd:command category="colors" file="colo-run.mkiv" level="document" name="showcolorgroup"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -4358,7 +5072,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="colo-run.mkiv" name="comparecolorgroup"> + <cd:command category="colors" file="colo-run.mkiv" level="document" name="comparecolorgroup"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -4367,7 +5081,7 @@ </cd:command> </cd:interface> <cd:interface file="i-columns.xml"> - <cd:command file="page-mul.mkiv" name="setupcolumns"> + <cd:command category="columns" file="page-mul.mkiv" level="style" name="setupcolumns"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="n"> @@ -4416,14 +5130,14 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-mul.mkiv" name="columns" type="environment"> + <cd:command category="columns" file="page-mul.mkiv" level="document" name="columns" type="environment"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupcolumns"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-mul.mkiv" name="setupcolumnspan"> + <cd:command category="columns" file="page-mul.mkiv" level="style" name="setupcolumnspan"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="n"> @@ -4433,14 +5147,14 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-mul.mkiv" name="columnspan" type="environment"> + <cd:command category="columns" file="page-mul.mkiv" name="columnspan" type="environment"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupcolumnspan"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-mul.mkiv" name="setsimplecolumnhsize"> + <cd:command category="columns" file="page-mul.mkiv" level="system" name="setsimplecolumnhsize"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="n"> @@ -4458,7 +5172,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-mul.mkiv" name="simplecolumns" type="environment"> + <cd:command category="columns" file="page-mul.mkiv" level="system" name="simplecolumns" type="environment"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setsimplecolumnhsize"/> @@ -4467,7 +5181,7 @@ </cd:command> </cd:interface> <cd:interface file="i-combination.xml"> - <cd:command file="pack-com.mkiv" name="definecombination"> + <cd:command category="tables" file="pack-com.mkiv" level="style" name="definecombination"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -4480,7 +5194,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="pack-com.mkiv" name="setupcombination"> + <cd:command category="tables" file="pack-com.mkiv" level="style" name="setupcombination"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -4540,7 +5254,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="pack-com.mkiv" name="combination" type="environment" variant="matrix"> + <cd:command category="tables" file="pack-com.mkiv" level="document" name="combination" type="environment" variant="matrix"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -4550,7 +5264,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="pack-com.mkiv" name="combination" type="environment"> + <cd:command category="tables" file="pack-com.mkiv" level="document" name="combination" type="environment"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -4560,7 +5274,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="pack-com.mkiv" name="floatcombination" type="environment" variant="matrix"> + <cd:command category="float tables" file="pack-com.mkiv" level="document" name="floatcombination" type="environment" variant="matrix"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:matrix"/> @@ -4568,7 +5282,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="pack-com.mkiv" name="floatcombination" type="environment"> + <cd:command category="float tables" file="pack-com.mkiv" level="document" name="floatcombination" type="environment"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupcombination"/> @@ -4577,7 +5291,7 @@ </cd:command> </cd:interface> <cd:interface file="i-commandhandler.xml"> - <cd:command file="mult-aux.mkiv" name="installparameterhandler"> + <cd:command file="mult-aux.mkiv" level="system" name="installparameterhandler"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -4585,7 +5299,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="mult-aux.mkiv" name="installrootparameterhandler"> + <cd:command file="mult-aux.mkiv" level="system" name="installrootparameterhandler"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -4593,7 +5307,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="mult-aux.mkiv" name="installparameterhashhandler"> + <cd:command file="mult-aux.mkiv" level="system" name="installparameterhashhandler"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -4601,7 +5315,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="mult-aux.mkiv" name="installparametersethandler"> + <cd:command file="mult-aux.mkiv" level="system" name="installparametersethandler"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -4609,7 +5323,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="mult-aux.mkiv" name="installstyleandcolorhandler"> + <cd:command file="mult-aux.mkiv" level="system" name="installstyleandcolorhandler"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -4617,7 +5331,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="mult-aux.mkiv" name="installdefinehandler"> + <cd:command file="mult-aux.mkiv" level="system" name="installdefinehandler"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -4626,7 +5340,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="mult-aux.mkiv" name="installsetuphandler"> + <cd:command file="mult-aux.mkiv" level="system" name="installsetuphandler"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -4634,7 +5348,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="mult-aux.mkiv" name="installswitchsetuphandler"> + <cd:command file="mult-aux.mkiv" level="system" name="installswitchsetuphandler"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -4642,7 +5356,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="mult-aux.mkiv" name="installautosetuphandler"> + <cd:command file="mult-aux.mkiv" level="system" name="installautosetuphandler"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -4650,7 +5364,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="mult-aux.mkiv" name="installbasicparameterhandler"> + <cd:command file="mult-aux.mkiv" level="system" name="installbasicparameterhandler"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -4658,7 +5372,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="mult-aux.mkiv" name="installbasicautosetuphandler"> + <cd:command file="mult-aux.mkiv" level="system" name="installbasicautosetuphandler"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -4667,7 +5381,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="mult-aux.mkiv" name="installcommandhandler"> + <cd:command file="mult-aux.mkiv" level="system" name="installcommandhandler"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -4676,7 +5390,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="mult-aux.mkiv" name="installswitchcommandhandler"> + <cd:command file="mult-aux.mkiv" level="system" name="installswitchcommandhandler"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -4685,7 +5399,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="mult-aux.mkiv" name="installautocommandhandler"> + <cd:command file="mult-aux.mkiv" level="system" name="installautocommandhandler"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -4694,7 +5408,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="mult-aux.mkiv" name="installsimplecommandhandler"> + <cd:command file="mult-aux.mkiv" level="system" name="installsimplecommandhandler"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -4703,7 +5417,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="mult-aux.mkiv" name="installdirectparameterhandler"> + <cd:command file="mult-aux.mkiv" level="system" name="installdirectparameterhandler"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -4711,7 +5425,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="mult-aux.mkiv" name="installdirectsetuphandler"> + <cd:command file="mult-aux.mkiv" level="system" name="installdirectsetuphandler"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -4719,7 +5433,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="mult-aux.mkiv" name="installdirectparametersethandler"> + <cd:command file="mult-aux.mkiv" level="system" name="installdirectparametersethandler"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -4727,7 +5441,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="mult-aux.mkiv" name="installdirectstyleandcolorhandler"> + <cd:command file="mult-aux.mkiv" level="system" name="installdirectstyleandcolorhandler"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -4735,7 +5449,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="mult-aux.mkiv" name="installdirectcommandhandler"> + <cd:command file="mult-aux.mkiv" level="system" name="installdirectcommandhandler"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -4743,7 +5457,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="mult-aux.mkiv" name="installsetuponlycommandhandler"> + <cd:command file="mult-aux.mkiv" level="system" name="installsetuponlycommandhandler"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -4751,7 +5465,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="mult-aux.mkiv" name="relateparameterhandlers"> + <cd:command file="mult-aux.mkiv" level="system" name="relateparameterhandlers"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -4767,28 +5481,28 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="mult-aux.mkiv" name="installactionhandler"> + <cd:command file="mult-aux.mkiv" level="system" name="installactionhandler"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="mult-aux.mkiv" name="installnamespace"> + <cd:command file="mult-aux.mkiv" level="system" name="installnamespace"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="mult-aux.mkiv" name="installcorenamespace"> + <cd:command file="mult-aux.mkiv" level="system" name="installcorenamespace"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="mult-aux.mkiv" name="definenamespace"> + <cd:command file="mult-aux.mkiv" level="system" name="definenamespace"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -4826,8 +5540,8 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="mult-aux.mkiv" name="listnamespaces"/> - <cd:command file="mult-aux.mkiv" name="showparentchain"> + <cd:command file="mult-aux.mkiv" level="system" name="listnamespaces"/> + <cd:command file="mult-aux.mkiv" level="system" name="showparentchain"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -4835,7 +5549,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="mult-aux.mkiv" name="doifelsecommandhandler"> + <cd:command file="mult-aux.mkiv" level="system" name="doifelsecommandhandler"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -4849,7 +5563,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="mult-aux.mkiv" name="doifcommandhandlerelse"> + <cd:command file="mult-aux.mkiv" level="system" name="doifcommandhandlerelse"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -4863,7 +5577,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="mult-aux.mkiv" name="doifcommandhandler"> + <cd:command file="mult-aux.mkiv" level="system" name="doifcommandhandler"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -4874,7 +5588,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="mult-aux.mkiv" name="doifnotcommandhandler"> + <cd:command file="mult-aux.mkiv" level="system" name="doifnotcommandhandler"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -4885,7 +5599,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="mult-aux.mkiv" name="installdefinitionset"> + <cd:command file="mult-aux.mkiv" level="system" name="installdefinitionset"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -4893,7 +5607,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="mult-aux.mkiv" name="installdefinitionsetmember"> + <cd:command file="mult-aux.mkiv" level="system" name="installdefinitionsetmember"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -4905,7 +5619,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="mult-aux.mkiv" name="installparentinjector"> + <cd:command file="mult-aux.mkiv" level="system" name="installparentinjector"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -4913,7 +5627,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="pack-rul.mkiv" name="installframedcommandhandler"> + <cd:command file="pack-rul.mkiv" level="system" name="installframedcommandhandler"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -4922,7 +5636,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="pack-rul.mkiv" name="installframedautocommandhandler"> + <cd:command file="pack-rul.mkiv" level="system" name="installframedautocommandhandler"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -4931,7 +5645,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="pack-rul.mkiv" name="installsimpleframedcommandhandler"> + <cd:command file="pack-rul.mkiv" level="system" name="installsimpleframedcommandhandler"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -4942,7 +5656,7 @@ </cd:command> </cd:interface> <cd:interface file="i-comment.xml"> - <cd:command file="scrn-wid.mkvi" name="definecomment"> + <cd:command category="pdf" file="scrn-wid.mkvi" level="style" name="definecomment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -4955,7 +5669,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="scrn-wid.mkvi" name="setupcomment"> + <cd:command category="pdf" file="scrn-wid.mkvi" level="style" name="setupcomment"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -5030,12 +5744,18 @@ <cd:parameter name="distance"> <cd:constant type="cd:dimension"/> </cd:parameter> + <cd:parameter name="space"> + <cd:constant type="yes"/> + </cd:parameter> + <cd:parameter name="buffer"> + <cd:constant type="cd:buffer"/> + </cd:parameter> </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="scrn-wid.mkvi" generated="yes" name="comment" variant="example"> + <cd:command category="pdf" file="scrn-wid.mkvi" generated="yes" level="document" name="comment" variant="instance"> <cd:sequence> - <cd:variable value="comment"/> + <cd:instance value="comment"/> </cd:sequence> <cd:arguments> <cd:keywords optional="yes"> @@ -5052,9 +5772,9 @@ <cd:constant value="comment"/> </cd:instances> </cd:command> - <cd:command file="scrn-wid.mkvi" generated="yes" name="comment" type="environment" variant="example"> + <cd:command category="pdf" file="scrn-wid.mkvi" generated="yes" level="document" name="comment" type="environment" variant="instance"> <cd:sequence> - <cd:variable value="comment"/> + <cd:instance value="comment"/> </cd:sequence> <cd:arguments> <cd:keywords optional="yes"> @@ -5068,341 +5788,318 @@ <cd:constant value="comment"/> </cd:instances> </cd:command> - <cd:command file="scrn-wid.mkvi" name="placecomments"/> - <cd:command file="scrn-wid.mkvi" name="comment"> - <cd:arguments> - <cd:keywords optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:assignments list="yes" optional="yes"> - <cd:inherit name="setupcomment"/> - </cd:assignments> - <cd:keywords delimiters="braces"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="scrn-wid.mkvi" name="comment" type="environment"> - <cd:arguments> - <cd:keywords optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:assignments list="yes" optional="yes"> - <cd:inherit name="setupcomment"/> - </cd:assignments> - </cd:arguments> - </cd:command> + <cd:command category="pdf" file="scrn-wid.mkvi" level="document" name="placecomments"/> </cd:interface> <cd:interface file="i-conversion.xml"> - <cd:command file="core-con.mkiv" name="numbers"> + <cd:command category="counter" file="core-con.mkiv" level="style" name="numbers"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="Numbers"> + <cd:command category="counter" file="core-con.mkiv" level="style" name="Numbers"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="romannumerals"> + <cd:command category="counter language" file="core-con.mkiv" level="style" name="romannumerals"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="Romannumerals"> + <cd:command category="counter language" file="core-con.mkiv" level="style" name="Romannumerals"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="abjadnumerals"> + <cd:command category="counter language" file="core-con.mkiv" level="style" name="abjadnumerals"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="abjadnodotnumerals"> + <cd:command category="counter language" file="core-con.mkiv" level="style" name="abjadnodotnumerals"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="abjadnaivenumerals"> + <cd:command category="counter language" file="core-con.mkiv" level="style" name="abjadnaivenumerals"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="languagecharacters"> + <cd:command category="counter language" file="core-con.mkiv" level="style" name="languagecharacters"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="languageCharacters"> + <cd:command category="counter language" file="core-con.mkiv" level="style" name="languageCharacters"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="alphabeticnumerals"> + <cd:command category="counter language" file="core-con.mkiv" level="style" name="alphabeticnumerals"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="Alphabeticnumerals"> + <cd:command category="counter language" file="core-con.mkiv" level="style" name="Alphabeticnumerals"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="thainumerals"> + <cd:command category="counter language" file="core-con.mkiv" level="style" name="thainumerals"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="devanagarinumerals"> + <cd:command category="counter language" file="core-con.mkiv" level="style" name="devanagarinumerals"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="gurmurkhinumerals"> + <cd:command category="counter language" file="core-con.mkiv" level="style" name="gurmurkhinumerals"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="gujaratinumerals"> + <cd:command category="counter language" file="core-con.mkiv" level="style" name="gujaratinumerals"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="tibetannumerals"> + <cd:command category="counter language" file="core-con.mkiv" level="style" name="tibetannumerals"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="greeknumerals"> + <cd:command category="counter language" file="core-con.mkiv" level="style" name="greeknumerals"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="Greeknumerals"> + <cd:command category="counter language" file="core-con.mkiv" level="style" name="Greeknumerals"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="arabicnumerals"> + <cd:command category="counter language" file="core-con.mkiv" level="style" name="arabicnumerals"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="persiannumerals"> + <cd:command category="counter language" file="core-con.mkiv" level="style" name="persiannumerals"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="arabicdecimals"> + <cd:command category="counter language" file="core-con.mkiv" level="style" name="arabicdecimals"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="persiandecimals"> + <cd:command category="counter language" file="core-con.mkiv" level="style" name="persiandecimals"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="arabicexnumerals"> + <cd:command category="counter language" file="core-con.mkiv" level="style" name="arabicexnumerals"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="koreannumerals"> + <cd:command category="counter language" file="core-con.mkiv" level="style" name="koreannumerals"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="koreannumeralsp"> + <cd:command category="counter language" file="core-con.mkiv" level="style" name="koreannumeralsp"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="koreannumeralsc"> + <cd:command category="counter language" file="core-con.mkiv" level="style" name="koreannumeralsc"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="koreanparentnumerals"> + <cd:command category="counter language" file="core-con.mkiv" level="style" name="koreanparentnumerals"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="koreancirclenumerals"> + <cd:command category="counter language" file="core-con.mkiv" level="style" name="koreancirclenumerals"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="chinesenumerals"> + <cd:command category="counter language" file="core-con.mkiv" level="style" name="chinesenumerals"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="chinesecapnumerals"> + <cd:command category="counter language" file="core-con.mkiv" level="style" name="chinesecapnumerals"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="chineseallnumerals"> + <cd:command category="counter language" file="core-con.mkiv" level="style" name="chineseallnumerals"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="character"> + <cd:command category="counter language" file="core-con.mkiv" level="style" name="character"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="Character"> + <cd:command category="counter language" file="core-con.mkiv" level="style" name="Character"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="characters"> + <cd:command category="counter language" file="core-con.mkiv" level="style" name="characters"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="Characters"> + <cd:command category="counter language" file="core-con.mkiv" level="style" name="Characters"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="monthlong"> + <cd:command category="counter" file="core-con.mkiv" level="style" name="monthlong"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="monthshort"> + <cd:command category="counter" file="core-con.mkiv" level="style" name="monthshort"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="convertmonth"> + <cd:command category="counter" file="core-con.mkiv" level="style" name="convertmonth"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="month"> + <cd:command category="counter" file="core-con.mkiv" level="style" name="month"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="MONTH"> + <cd:command category="counter" file="core-con.mkiv" level="style" name="MONTH"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="MONTHLONG"> + <cd:command category="counter" file="core-con.mkiv" level="style" name="MONTHLONG"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="MONTHSHORT"> + <cd:command category="counter" file="core-con.mkiv" level="style" name="MONTHSHORT"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="weekday"> + <cd:command category="counter" file="core-con.mkiv" level="style" name="weekday"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="WEEKDAY"> + <cd:command category="counter" file="core-con.mkiv" level="style" name="WEEKDAY"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="dayoftheweek"> + <cd:command category="counter" file="core-con.mkiv" level="style" name="dayoftheweek"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> @@ -5415,7 +6112,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="getdayoftheweek"> + <cd:command category="counter" file="core-con.mkiv" level="style" name="getdayoftheweek"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> @@ -5428,7 +6125,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="doifelseleapyear"> + <cd:command category="counter conditional" file="core-con.mkiv" level="style" name="doifelseleapyear"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> @@ -5441,7 +6138,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="doifleapyearelse"> + <cd:command category="counter conditional" file="core-con.mkiv" level="style" name="doifleapyearelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> @@ -5454,7 +6151,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="dayspermonth"> + <cd:command category="counter" file="core-con.mkiv" level="style" name="dayspermonth"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> @@ -5464,7 +6161,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="getdayspermonth"> + <cd:command category="counter" file="core-con.mkiv" level="style" name="getdayspermonth"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> @@ -5474,7 +6171,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="currentdate"> + <cd:command category="counter language" file="core-con.mkiv" level="document" name="currentdate"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="year"/> @@ -5517,7 +6214,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="date"> + <cd:command category="counter language" file="core-con.mkiv" level="document" name="date"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="d"> @@ -5535,14 +6232,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="rawdate"> + <cd:command category="counter" file="core-con.mkiv" level="style" name="rawdate"> <cd:arguments> <cd:keywords list="yes"> <cd:inherit name="currentdate"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="currenttime"> + <cd:command category="counter" file="core-con.mkiv" level="document" name="currenttime"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="h"/> @@ -5551,7 +6248,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="processmonth"> + <cd:command category="counter" file="core-con.mkiv" level="style" name="processmonth"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> @@ -5564,7 +6261,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="processyear"> + <cd:command category="counter" file="core-con.mkiv" level="style" name="processyear"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> @@ -5580,7 +6277,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="defineconversion"> + <cd:command category="counter" file="core-con.mkiv" level="style" name="defineconversion"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:language"/> @@ -5593,7 +6290,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="defineconversion" variant="list"> + <cd:command category="counter language" file="core-con.mkiv" level="style" name="defineconversion" variant="list"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:language"/> @@ -5606,7 +6303,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="convertnumber"> + <cd:command category="counter" file="core-con.mkiv" level="document" name="convertnumber"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="empty"/> @@ -5683,7 +6380,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="uconvertnumber"> + <cd:command category="counter" file="core-con.mkiv" level="style" name="uconvertnumber"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:inherit name="convertnumber"/> @@ -5693,7 +6390,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="doifelseconversiondefined"> + <cd:command category="counter conditional" file="core-con.mkiv" level="system" name="doifelseconversiondefined"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -5706,7 +6403,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="doifconversiondefinedelse"> + <cd:command category="counter conditional" file="core-con.mkiv" level="system" name="doifconversiondefinedelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -5719,7 +6416,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="doifelseconversionnumber"> + <cd:command category="counter conditional" file="core-con.mkiv" level="system" name="doifelseconversionnumber"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -5735,7 +6432,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="doifconversionnumberelse"> + <cd:command category="counter conditional" file="core-con.mkiv" level="system" name="doifconversionnumberelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -5751,7 +6448,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="wordtonumber"> + <cd:command category="counter" file="core-con.mkiv" level="document" name="wordtonumber"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="one"/> @@ -5765,91 +6462,91 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="highordinalstr"> + <cd:command category="counter" file="core-con.mkiv" level="document" name="highordinalstr"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="ordinalstr"> + <cd:command category="counter" file="core-con.mkiv" level="document" name="ordinalstr"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="ordinaldaynumber"> + <cd:command category="counter" file="core-con.mkiv" level="document" name="ordinaldaynumber"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="verbosenumber"> + <cd:command category="counter" file="core-con.mkiv" level="style" name="verbosenumber"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="VerboseNumber"> + <cd:command category="counter" file="core-con.mkiv" level="style" name="VerboseNumber"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="smallcappedromannumerals"> + <cd:command category="counter" file="core-con.mkiv" level="style" name="smallcappedromannumerals"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="smallcappedcharacters"> + <cd:command category="counter" file="core-con.mkiv" level="style" name="smallcappedcharacters"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="sloveniannumerals"> + <cd:command category="counter language" file="core-con.mkiv" level="style" name="sloveniannumerals"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="slovenianNumerals"> + <cd:command category="counter language" file="core-con.mkiv" level="style" name="slovenianNumerals"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="spanishnumerals"> + <cd:command category="counter language" file="core-con.mkiv" level="style" name="spanishnumerals"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="spanishNumerals"> + <cd:command category="counter language" file="core-con.mkiv" level="style" name="spanishNumerals"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="unihex"> + <cd:command category="counter" file="core-con.mkiv" level="style" name="unihex"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-con.mkiv" name="continuednumber"> + <cd:command category="counter" file="core-con.mkiv" level="style" name="continuednumber"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> @@ -5858,7 +6555,7 @@ </cd:command> </cd:interface> <cd:interface file="i-counter.xml"> - <cd:command file="strc-num.mkiv" name="definecounter"> + <cd:command category="counter" file="strc-num.mkiv" level="system" name="definecounter"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -5871,7 +6568,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-num.mkiv" name="setupcounter"> + <cd:command category="counter" file="strc-num.mkiv" level="system" name="setupcounter"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -5976,7 +6673,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-num.mkiv" name="doifelsecounter"> + <cd:command category="counter conditional" file="strc-num.mkiv" level="system" name="doifelsecounter"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -5989,7 +6686,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-num.mkiv" name="doifcounterelse"> + <cd:command category="counter conditional" file="strc-num.mkiv" level="system" name="doifcounterelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -6002,7 +6699,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-num.mkiv" name="doifcounter"> + <cd:command category="counter conditional" file="strc-num.mkiv" level="system" name="doifcounter"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -6012,7 +6709,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-num.mkiv" name="doifnotcounter"> + <cd:command category="counter conditional" file="strc-num.mkiv" level="system" name="doifnotcounter"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -6022,7 +6719,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-num.mkiv" name="setcounter"> + <cd:command category="counter" file="strc-num.mkiv" level="system" name="setcounter"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -6035,7 +6732,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-num.mkiv" name="setcounterown"> + <cd:command category="counter" file="strc-num.mkiv" level="system" name="setcounterown"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -6048,7 +6745,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-num.mkiv" name="restartcounter"> + <cd:command category="counter" file="strc-num.mkiv" level="system" name="restartcounter"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -6061,7 +6758,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-num.mkiv" name="resetcounter"> + <cd:command category="counter" file="strc-num.mkiv" level="system" name="resetcounter"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -6071,7 +6768,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-num.mkiv" name="incrementcounter"> + <cd:command category="counter" file="strc-num.mkiv" level="system" name="incrementcounter"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -6081,7 +6778,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-num.mkiv" name="decrementcounter"> + <cd:command category="counter" file="strc-num.mkiv" level="system" name="decrementcounter"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -6091,7 +6788,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-num.mkiv" name="rawcounter"> + <cd:command category="counter" file="strc-num.mkiv" level="system" name="rawcounter"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -6101,7 +6798,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-num.mkiv" name="lastcounter"> + <cd:command category="counter" file="strc-num.mkiv" level="system" name="lastcounter"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -6111,7 +6808,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-num.mkiv" name="firstcounter"> + <cd:command category="counter" file="strc-num.mkiv" level="system" name="firstcounter"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -6121,7 +6818,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-num.mkiv" name="nextcounter"> + <cd:command category="counter" file="strc-num.mkiv" level="system" name="nextcounter"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -6131,7 +6828,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-num.mkiv" name="prevcounter"> + <cd:command category="counter" file="strc-num.mkiv" level="system" name="prevcounter"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -6141,7 +6838,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-num.mkiv" name="countersubs"> + <cd:command category="counter" file="strc-num.mkiv" level="system" name="countersubs"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -6151,77 +6848,77 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-num.mkiv" name="savecounter"> + <cd:command category="counter" file="strc-num.mkiv" level="system" name="savecounter"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-num.mkiv" name="restorecounter"> + <cd:command category="counter" file="strc-num.mkiv" level="system" name="restorecounter"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-num.mkiv" name="showcounter"> + <cd:command category="counter" file="strc-num.mkiv" level="system" name="showcounter"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-num.mkiv" name="incrementedcounter"> + <cd:command category="counter" file="strc-num.mkiv" level="system" name="incrementedcounter"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-num.mkiv" name="decrementedcounter"> + <cd:command category="counter" file="strc-num.mkiv" level="system" name="decrementedcounter"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-num.mkiv" name="rawcountervalue"> + <cd:command category="counter" file="strc-num.mkiv" level="system" name="rawcountervalue"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-num.mkiv" name="lastcountervalue"> + <cd:command category="counter" file="strc-num.mkiv" level="system" name="lastcountervalue"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-num.mkiv" name="firstcountervalue"> + <cd:command category="counter" file="strc-num.mkiv" level="system" name="firstcountervalue"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-num.mkiv" name="nextcountervalue"> + <cd:command category="counter" file="strc-num.mkiv" level="system" name="nextcountervalue"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-num.mkiv" name="prevcountervalue"> + <cd:command category="counter" file="strc-num.mkiv" level="system" name="prevcountervalue"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-num.mkiv" name="rawsubcountervalue"> + <cd:command category="counter" file="strc-num.mkiv" level="system" name="rawsubcountervalue"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -6231,7 +6928,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-num.mkiv" name="lastsubcountervalue"> + <cd:command category="counter" file="strc-num.mkiv" level="system" name="lastsubcountervalue"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -6241,7 +6938,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-num.mkiv" name="firstsubcountervalue"> + <cd:command category="counter" file="strc-num.mkiv" level="system" name="firstsubcountervalue"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -6251,7 +6948,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-num.mkiv" name="nextsubcountervalue"> + <cd:command category="counter" file="strc-num.mkiv" level="system" name="nextsubcountervalue"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -6261,7 +6958,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-num.mkiv" name="prevsubcountervalue"> + <cd:command category="counter" file="strc-num.mkiv" level="system" name="prevsubcountervalue"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -6271,7 +6968,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-num.mkiv" name="convertedcounter"> + <cd:command category="counter" file="strc-num.mkiv" level="system" name="convertedcounter"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -6281,7 +6978,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-num.mkiv" name="convertedsubcounter"> + <cd:command category="counter" file="strc-num.mkiv" level="system" name="convertedsubcounter"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -6297,7 +6994,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-num.mkiv" name="directconvertedcounter"> + <cd:command category="counter" file="strc-num.mkiv" level="system" name="directconvertedcounter"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -6311,7 +7008,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-num.mkiv" name="doifelsedefinedcounter"> + <cd:command category="counter conditional" file="strc-num.mkiv" level="system" name="doifelsedefinedcounter"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -6324,7 +7021,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-num.mkiv" name="doifdefinedcounterelse"> + <cd:command category="counter conditional" file="strc-num.mkiv" level="system" name="doifdefinedcounterelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -6337,7 +7034,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-num.mkiv" name="doifdefinedcounter"> + <cd:command category="counter conditional" file="strc-num.mkiv" level="system" name="doifdefinedcounter"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -6347,7 +7044,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-num.mkiv" name="doifundefinedcounter"> + <cd:command category="counter conditional" file="strc-num.mkiv" level="system" name="doifundefinedcounter"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -6357,7 +7054,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-ini.mkvi" name="defineresetset"> + <cd:command category="counter" file="strc-ini.mkvi" level="style" name="defineresetset"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -6371,7 +7068,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-ini.mkvi" name="defineseparatorset"> + <cd:command category="counter" file="strc-ini.mkvi" level="style" name="defineseparatorset"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -6387,7 +7084,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-ini.mkvi" name="defineconversionset"> + <cd:command category="counter" file="strc-ini.mkvi" level="style" name="defineconversionset"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -6403,7 +7100,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-ini.mkvi" name="defineprefixset"> + <cd:command category="counter" file="strc-ini.mkvi" level="style" name="defineprefixset"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -6419,7 +7116,7 @@ </cd:command> </cd:interface> <cd:interface file="i-dataset.xml"> - <cd:command file="core-dat.mkiv" name="definedataset"> + <cd:command file="core-dat.mkiv" level="system" name="definedataset"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -6432,7 +7129,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="core-dat.mkiv" name="setupdataset"> + <cd:command file="core-dat.mkiv" level="system" name="setupdataset"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -6445,7 +7142,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="core-dat.mkiv" name="setdataset"> + <cd:command file="core-dat.mkiv" level="system" name="setdataset"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -6460,7 +7157,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="core-dat.mkiv" name="datasetvariable"> + <cd:command file="core-dat.mkiv" level="system" name="datasetvariable"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -6477,7 +7174,7 @@ </cd:command> </cd:interface> <cd:interface file="i-define.xml"> - <cd:command file="core-sys.mkiv" name="define"> + <cd:command file="core-sys.mkiv" level="system" name="define"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:number"/> @@ -6486,7 +7183,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="core-sys.mkiv" name="defineexpandable"> + <cd:command file="core-sys.mkiv" level="system" name="defineexpandable"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:number"/> @@ -6497,7 +7194,7 @@ </cd:command> </cd:interface> <cd:interface file="i-delimitedtext.xml"> - <cd:command file="typo-del.mkiv" name="definedelimitedtext"> + <cd:command category="language" file="typo-del.mkiv" level="style" name="definedelimitedtext"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -6510,7 +7207,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="typo-del.mkiv" name="setupdelimitedtext"> + <cd:command category="language" file="typo-del.mkiv" level="style" name="setupdelimitedtext"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -6597,9 +7294,9 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="typo-del.mkiv" generated="yes" name="delimitedtext" variant="example"> + <cd:command category="language" file="typo-del.mkiv" generated="yes" level="document" name="delimitedtext" variant="instance"> <cd:sequence> - <cd:variable value="delimitedtext"/> + <cd:instance value="delimitedtext"/> </cd:sequence> <cd:arguments> <cd:keywords optional="yes"> @@ -6615,9 +7312,9 @@ <cd:constant value="aside"/> </cd:instances> </cd:command> - <cd:command file="typo-del.mkiv" generated="yes" name="delimitedtext" type="environment" variant="example"> + <cd:command category="language" file="typo-del.mkiv" generated="yes" level="document" name="delimitedtext" type="environment" variant="instance"> <cd:sequence> - <cd:variable value="delimitedtext"/> + <cd:instance value="delimitedtext"/> </cd:sequence> <cd:arguments> <cd:keywords optional="yes"> @@ -6635,7 +7332,7 @@ <cd:constant value="aside"/> </cd:instances> </cd:command> - <cd:command file="typo-del.mkiv" name="delimitedtext"> + <cd:command category="language" file="typo-del.mkiv" level="document" name="delimitedtext"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -6646,7 +7343,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="typo-del.mkiv" name="delimitedtext" type="environment"> + <cd:command category="language" file="typo-del.mkiv" level="document" name="delimitedtext" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -6659,7 +7356,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-del.mkiv" name="delimited"> + <cd:command category="language" file="typo-del.mkiv" level="document" name="delimited"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -6670,7 +7367,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="typo-del.mkiv" name="delimited" type="environment"> + <cd:command category="language" file="typo-del.mkiv" level="document" name="delimited" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -6683,113 +7380,30 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-del.mkiv" name="quotation"> - <cd:arguments> - <cd:keywords optional="yes"> - <cd:constant type="cd:language"/> - </cd:keywords> - <cd:content/> - </cd:arguments> - </cd:command> - <cd:command file="typo-del.mkiv" name="quotation" type="environment"> - <cd:arguments> - <cd:keywords optional="yes"> - <cd:constant type="cd:language"/> - </cd:keywords> - <cd:keywords list="yes" optional="yes"> - <cd:inherit name="startnarrower"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="typo-del.mkiv" name="quote"> - <cd:arguments> - <cd:keywords optional="yes"> - <cd:constant type="cd:language"/> - </cd:keywords> - <cd:content/> - </cd:arguments> - </cd:command> - <cd:command file="typo-del.mkiv" name="quote" type="environment"> - <cd:arguments> - <cd:keywords optional="yes"> - <cd:constant type="cd:language"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="typo-del.mkiv" name="blockquote"> - <cd:arguments> - <cd:keywords optional="yes"> - <cd:constant type="cd:language"/> - </cd:keywords> - <cd:content/> - </cd:arguments> - </cd:command> - <cd:command file="typo-del.mkiv" name="blockquote" type="environment"> - <cd:arguments> - <cd:keywords optional="yes"> - <cd:constant type="cd:language"/> - </cd:keywords> - <cd:keywords list="yes" optional="yes"> - <cd:inherit name="startnarrower"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="typo-del.mkiv" name="speech"> - <cd:arguments> - <cd:keywords optional="yes"> - <cd:constant type="cd:language"/> - </cd:keywords> - <cd:content/> - </cd:arguments> - </cd:command> - <cd:command file="typo-del.mkiv" name="aside" type="environment"> - <cd:arguments> - <cd:keywords optional="yes"> - <cd:constant type="cd:language"/> - </cd:keywords> - <cd:keywords list="yes" optional="yes"> - <cd:inherit name="startnarrower"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="typo-del.mkiv" name="aside"> - <cd:arguments> - <cd:keywords optional="yes"> - <cd:constant type="cd:language"/> - </cd:keywords> - <cd:content/> - </cd:arguments> - </cd:command> - <cd:command file="typo-del.mkiv" name="speech" type="environment"> - <cd:arguments> - <cd:keywords list="yes" optional="yes"> - <cd:inherit name="startnarrower"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="typo-del.mkiv" name="setupquotation"> + <cd:command category="language" file="typo-del.mkiv" level="style" name="setupquotation"> <cd:arguments> <cd:assignments list="yes"> <cd:inherit name="setupdelimitedtext"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="typo-del.mkiv" name="setupquote"> + <cd:command category="language" file="typo-del.mkiv" level="style" name="setupquote"> <cd:arguments> <cd:assignments list="yes"> <cd:inherit name="setupdelimitedtext"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="typo-del.mkiv" name="subsentence"> + <cd:command category="language" file="typo-del.mkiv" level="document" name="subsentence"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="typo-del.mkiv" name="subsentence" type="environment"/> + <cd:command category="language" file="typo-del.mkiv" level="document" name="subsentence" type="environment"/> + <cd:command category="language" file="typo-del.mkiv" level="document" name="midsubsentence"/> </cd:interface> <cd:interface file="i-description.xml"> - <cd:command file="strc-des.mkvi" name="definedescription"> + <cd:command category="structure" file="strc-des.mkvi" level="style" name="definedescription"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -6802,7 +7416,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-des.mkvi" name="setupdescription"> + <cd:command category="structure" file="strc-des.mkvi" level="style" name="setupdescription"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -6875,6 +7489,12 @@ <cd:constant type="none"/> <cd:constant type="cd:dimension"/> </cd:parameter> + <cd:parameter name="stretch"> + <cd:constant type="cd:number"/> + </cd:parameter> + <cd:parameter name="shrink"> + <cd:constant type="cd:number"/> + </cd:parameter> <cd:parameter name="hang"> <cd:constant type="fit"/> <cd:constant type="broad"/> @@ -6893,6 +7513,11 @@ <cd:constant default="yes" type="no"/> <cd:constant type="xml"/> </cd:parameter> + <cd:parameter name="referenceprefix"> + <cd:constant type="+"/> + <cd:constant type="-"/> + <cd:constant type="cd:text"/> + </cd:parameter> <cd:parameter name="sample"> <cd:constant type="cd:text"/> </cd:parameter> @@ -6919,7 +7544,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-des.mkvi" generated="yes" name="description" type="environment" variant="example"> + <cd:command category="structure" file="strc-des.mkvi" generated="yes" level="document" name="description" type="environment" variant="example"> <cd:sequence> <cd:variable value="description"/> </cd:sequence> @@ -6940,7 +7565,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-des.mkvi" generated="yes" name="description" type="environment" variant="example:title"> + <cd:command category="structure" file="strc-des.mkvi" generated="yes" level="document" name="description" type="environment" variant="example:title"> <cd:sequence> <cd:variable value="description"/> </cd:sequence> @@ -6953,7 +7578,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-des.mkvi" generated="yes" name="description" variant="example"> + <cd:command category="structure" file="strc-des.mkvi" generated="yes" level="document" name="description" variant="example"> <cd:sequence> <cd:variable value="description"/> </cd:sequence> @@ -6972,7 +7597,7 @@ </cd:command> </cd:interface> <cd:interface file="i-digits.xml"> - <cd:command file="typo-dig.mkiv" name="setdigitsmanipulation"> + <cd:command file="typo-dig.mkiv" level="system" name="setdigitsmanipulation"> <cd:arguments> <cd:keywords> <cd:constant type="reset"/> @@ -6980,18 +7605,18 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-dig.mkiv" name="resetdigitsmanipulation"/> - <cd:command file="typo-dig.mkiv" name="equaldigits"> + <cd:command file="typo-dig.mkiv" level="system" name="resetdigitsmanipulation"/> + <cd:command file="typo-dig.mkiv" level="document" name="equaldigits"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-dig.mkiv" name="dummydigit"/> + <cd:command file="typo-dig.mkiv" level="document" name="dummydigit"/> </cd:interface> <cd:interface file="i-dimension.xml"> - <cd:command file="mult-dim.mkvi" name="assigndimension"> + <cd:command file="mult-dim.mkvi" level="system" name="assigndimension"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant method="none" prefix="cd:sign" type="small"/> @@ -7012,7 +7637,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="mult-dim.mkvi" name="assignalfadimension"> + <cd:command file="mult-dim.mkvi" level="system" name="assignalfadimension"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="small"/> @@ -7033,7 +7658,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="mult-dim.mkvi" name="assignwidth"> + <cd:command file="mult-dim.mkvi" level="system" name="assignwidth"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="fit"/> @@ -7049,7 +7674,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="mult-dim.mkvi" name="assignvalue"> + <cd:command file="mult-dim.mkvi" level="system" name="assignvalue"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="small"/> @@ -7071,7 +7696,7 @@ </cd:command> </cd:interface> <cd:interface file="i-direction.xml"> - <cd:command file="typo-dir.mkiv" name="setupdirections"> + <cd:command category="language alignment" file="typo-dir.mkiv" level="style" name="setupdirections"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="bidi"> @@ -7089,19 +7714,23 @@ <cd:constant default="yes" type="yes"/> <cd:constant type="no"/> </cd:parameter> + <cd:parameter name="break"> + <cd:constant default="yes" type="both"/> + <cd:constant type="before"/> + </cd:parameter> </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="typo-dir.mkiv" name="setdirection"> + <cd:command category="language alignment" file="typo-dir.mkiv" level="style" name="setdirection"> <cd:arguments> <cd:keywords> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-dir.mkiv" name="resetdirection"/> - <cd:command file="supp-dir.mkiv" name="showdirsinmargin"/> - <cd:command file="supp-dir.mkiv" name="istltdir"> + <cd:command category="language alignment" file="typo-dir.mkiv" level="style" name="resetdirection"/> + <cd:command category="alignment" file="supp-dir.mkiv" level="document" name="showdirsinmargin"/> + <cd:command category="alignment" file="supp-dir.mkiv" level="system" name="istltdir"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="TLT"/> @@ -7109,7 +7738,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-dir.mkiv" name="istrtdir"> + <cd:command category="alignment" file="supp-dir.mkiv" level="system" name="istrtdir"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="TLT"/> @@ -7119,10 +7748,10 @@ </cd:command> </cd:interface> <cd:interface file="i-document.xml"> - <cd:command file="file-job.mkvi" name="text" type="environment"/> - <cd:command begin="autostart" end="autostop" file="file-job.mkvi" name="text" type="environment"/> - <cd:command file="file-job.mkvi" name="notext" type="environment"/> - <cd:command file="file-job.mkvi" name="environment" type="environment"> + <cd:command category="structure" file="file-job.mkvi" level="document" name="text" type="environment"/> + <cd:command begin="autostart" category="structure" end="autostop" file="file-job.mkvi" level="system" name="text" type="environment"/> + <cd:command category="structure" file="file-job.mkvi" level="system" name="notext" type="environment"/> + <cd:command category="structure" file="file-job.mkvi" level="document" name="environment" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:file"/> @@ -7130,7 +7759,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-job.mkvi" name="environment" type="environment" variant="string"> + <cd:command category="structure" file="file-job.mkvi" level="document" name="environment" type="environment" variant="string"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:file"/> @@ -7138,29 +7767,29 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-job.mkvi" name="environment"> + <cd:command category="structure" file="file-job.mkvi" level="document" name="environment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:file"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-job.mkvi" name="environment" variant="string"> + <cd:command category="structure" file="file-job.mkvi" level="document" name="environment" variant="string"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:file"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-job.mkvi" name="useenvironment"> + <cd:command category="structure" file="file-job.mkvi" level="document" name="useenvironment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:file"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-job.mkvi" name="currentenvironment"/> - <cd:command file="file-job.mkvi" name="project" type="environment"> + <cd:command category="structure" file="file-job.mkvi" level="system" name="currentenvironment"/> + <cd:command category="structure" file="file-job.mkvi" level="document" name="project" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:file"/> @@ -7168,7 +7797,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-job.mkvi" name="project" type="environment" variant="string"> + <cd:command category="structure" file="file-job.mkvi" level="document" name="project" type="environment" variant="string"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:file"/> @@ -7176,29 +7805,29 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-job.mkvi" name="project"> + <cd:command category="structure" file="file-job.mkvi" level="document" name="project"> <cd:arguments> <cd:keywords> <cd:constant type="cd:file"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-job.mkvi" name="project" variant="string"> + <cd:command category="structure" file="file-job.mkvi" level="document" name="project" variant="string"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:file"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-job.mkvi" name="useproject"> + <cd:command category="structure" file="file-job.mkvi" level="document" name="useproject"> <cd:arguments> <cd:keywords> <cd:constant type="cd:file"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-job.mkvi" name="currentproject"/> - <cd:command file="file-job.mkvi" name="product" type="environment"> + <cd:command category="structure" file="file-job.mkvi" level="system" name="currentproject"/> + <cd:command category="structure" file="file-job.mkvi" level="document" name="product" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:file"/> @@ -7206,7 +7835,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-job.mkvi" name="product" type="environment" variant="string"> + <cd:command category="structure" file="file-job.mkvi" level="document" name="product" type="environment" variant="string"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:file"/> @@ -7214,29 +7843,29 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-job.mkvi" name="product"> + <cd:command category="structure" file="file-job.mkvi" level="document" name="product"> <cd:arguments> <cd:keywords> <cd:constant type="cd:file"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-job.mkvi" name="product" variant="string"> + <cd:command category="structure" file="file-job.mkvi" level="document" name="product" variant="string"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:file"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-job.mkvi" name="useproduct"> + <cd:command category="structure" file="file-job.mkvi" level="document" name="useproduct"> <cd:arguments> <cd:keywords> <cd:constant type="cd:file"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-job.mkvi" name="currentproduct"/> - <cd:command file="file-job.mkvi" name="component" type="environment"> + <cd:command category="structure" file="file-job.mkvi" level="system" name="currentproduct"/> + <cd:command category="structure" file="file-job.mkvi" level="document" name="component" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:file"/> @@ -7244,7 +7873,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-job.mkvi" name="component" type="environment" variant="string"> + <cd:command category="structure" file="file-job.mkvi" level="document" name="component" type="environment" variant="string"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:file"/> @@ -7252,36 +7881,36 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-job.mkvi" name="component"> + <cd:command category="structure" file="file-job.mkvi" level="document" name="component"> <cd:arguments> <cd:keywords> <cd:constant type="cd:file"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-job.mkvi" name="component" variant="string"> + <cd:command category="structure" file="file-job.mkvi" level="document" name="component" variant="string"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:file"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-job.mkvi" name="usecomponent"> + <cd:command category="structure" file="file-job.mkvi" level="document" name="usecomponent"> <cd:arguments> <cd:keywords> <cd:constant type="cd:file"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-job.mkvi" name="currentcomponent"/> - <cd:command file="file-job.mkvi" name="document" type="environment"> + <cd:command category="structure" file="file-job.mkvi" level="system" name="currentcomponent"/> + <cd:command category="structure" file="file-job.mkvi" level="document" name="document" type="environment"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupdocument"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="file-job.mkvi" name="setupdocument"> + <cd:command category="structure" file="file-job.mkvi" level="style" name="setupdocument"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="before"> @@ -7308,14 +7937,21 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="file-job.mkvi" name="presetdocument"> + <cd:command category="structure" file="file-job.mkvi" level="style" name="presetdocument"> <cd:arguments> <cd:assignments list="yes"> <cd:inherit name="setupdocument"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="file-job.mkvi" name="documentvariable"> + <cd:command category="structure" file="file-job.mkvi" level="style" name="documentvariable"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:key"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command category="structure" file="file-job.mkvi" level="style" name="unexpandeddocumentvariable"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:key"/> @@ -7324,7 +7960,7 @@ </cd:command> </cd:interface> <cd:interface file="i-dummy.xml"> - <cd:command file="mult-aux.mkiv" name="getdummyparameters"> + <cd:command file="mult-aux.mkiv" level="system" name="getdummyparameters"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="cd:key"> @@ -7333,21 +7969,21 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="mult-aux.mkiv" name="dummyparameter"> + <cd:command file="mult-aux.mkiv" level="system" name="dummyparameter"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:key"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="mult-aux.mkiv" name="directdummyparameter"> + <cd:command file="mult-aux.mkiv" level="system" name="directdummyparameter"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:key"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="mult-aux.mkiv" name="setdummyparameter"> + <cd:command file="mult-aux.mkiv" level="system" name="setdummyparameter"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:key"/> @@ -7357,7 +7993,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="mult-aux.mkiv" name="letdummyparameter"> + <cd:command file="mult-aux.mkiv" level="system" name="letdummyparameter"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:key"/> @@ -7365,7 +8001,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="mult-aux.mkiv" name="usedummystyleandcolor"> + <cd:command category="fonts colors" file="mult-aux.mkiv" level="system" name="usedummystyleandcolor"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:key"/> @@ -7375,14 +8011,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="mult-aux.mkiv" name="usedummystyleparameter"> + <cd:command category="fonts" file="mult-aux.mkiv" level="system" name="usedummystyleparameter"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:key"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="mult-aux.mkiv" name="usedummycolorparameter"> + <cd:command category="colors" file="mult-aux.mkiv" level="system" name="usedummycolorparameter"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:key"/> @@ -7391,7 +8027,7 @@ </cd:command> </cd:interface> <cd:interface file="i-effect.xml"> - <cd:command file="attr-eff.mkiv" name="defineeffect"> + <cd:command category="pdf" file="attr-eff.mkiv" level="style" name="defineeffect"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -7404,7 +8040,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="attr-eff.mkiv" name="setupeffect"> + <cd:command category="pdf" file="attr-eff.mkiv" level="style" name="setupeffect"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -7431,19 +8067,19 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="attr-eff.mkiv" name="effect" type="environment"> + <cd:command category="pdf" file="attr-eff.mkiv" level="document" name="effect" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="attr-eff.mkiv" generated="yes" name="effect" type="environment" variant="example"> + <cd:command category="pdf" file="attr-eff.mkiv" generated="yes" level="document" name="effect" type="environment" variant="example"> <cd:sequence> <cd:variable value="effect"/> </cd:sequence> </cd:command> - <cd:command file="attr-eff.mkiv" name="effect"> + <cd:command category="pdf" file="attr-eff.mkiv" level="document" name="effect"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -7453,7 +8089,7 @@ </cd:command> </cd:interface> <cd:interface file="i-enumeration.xml"> - <cd:command file="strc-enu.mkvi" name="defineenumeration"> + <cd:command category="structure" file="strc-enu.mkvi" level="style" name="defineenumeration"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -7466,7 +8102,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-enu.mkvi" name="setupenumeration"> + <cd:command category="structure" file="strc-enu.mkvi" level="style" name="setupenumeration"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -7586,6 +8222,12 @@ <cd:constant type="none"/> <cd:constant type="cd:dimension"/> </cd:parameter> + <cd:parameter name="stretch"> + <cd:constant type="cd:number"/> + </cd:parameter> + <cd:parameter name="shrink"> + <cd:constant type="cd:number"/> + </cd:parameter> <cd:parameter name="hang"> <cd:constant type="fit"/> <cd:constant type="broad"/> @@ -7604,6 +8246,11 @@ <cd:constant default="yes" type="no"/> <cd:constant type="xml"/> </cd:parameter> + <cd:parameter name="referenceprefix"> + <cd:constant type="+"/> + <cd:constant type="-"/> + <cd:constant type="cd:text"/> + </cd:parameter> <cd:parameter name="sample"> <cd:constant type="cd:text"/> </cd:parameter> @@ -7631,7 +8278,17 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-enu.mkvi" generated="yes" name="enumeration" type="environment" variant="example"> + <cd:command category="structure" file="strc-enu.mkvi" level="style" name="setupenumerations"> + <cd:arguments> + <cd:keywords list="yes" optional="yes"> + <cd:constant type="cd:name"/> + </cd:keywords> + <cd:assignments list="yes"> + <cd:inherit name="setupenumeration"/> + </cd:assignments> + </cd:arguments> + </cd:command> + <cd:command category="structure" file="strc-enu.mkvi" generated="yes" level="document" name="enumeration" type="environment" variant="example"> <cd:sequence> <cd:variable value="enumeration"/> </cd:sequence> @@ -7652,7 +8309,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-enu.mkvi" generated="yes" name="enumeration" type="environment" variant="example:title"> + <cd:command category="structure" file="strc-enu.mkvi" generated="yes" level="document" name="enumeration" type="environment" variant="example:title"> <cd:sequence> <cd:variable value="enumeration"/> </cd:sequence> @@ -7665,7 +8322,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-enu.mkvi" generated="yes" name="enumeration" variant="example"> + <cd:command category="structure" file="strc-enu.mkvi" generated="yes" level="document" name="enumeration" variant="example"> <cd:sequence> <cd:variable value="enumeration"/> </cd:sequence> @@ -7684,7 +8341,7 @@ </cd:command> </cd:interface> <cd:interface file="i-export.xml"> - <cd:command file="back-exp.mkiv" name="setelementexporttag"> + <cd:command category="xml" file="back-exp.mkiv" level="system" name="setelementexporttag"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -7701,7 +8358,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="back-exp.mkiv" name="setupexport"> + <cd:command category="xml" file="back-exp.mkiv" level="style" name="setupexport"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="align"> @@ -7751,14 +8408,14 @@ </cd:command> </cd:interface> <cd:interface file="i-field.xml"> - <cd:command file="scrn-fld.mkvi" name="presetfieldsymbols"> + <cd:command category="pdf" file="scrn-fld.mkvi" level="system" name="presetfieldsymbols"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="scrn-fld.mkvi" name="definefieldcategory"> + <cd:command category="pdf" file="scrn-fld.mkvi" level="style" name="definefieldcategory"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -7771,7 +8428,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="scrn-fld.mkvi" name="setupfieldcategory"> + <cd:command category="pdf" file="scrn-fld.mkvi" level="style" name="setupfieldcategory"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -7886,7 +8543,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="scrn-fld.mkvi" name="doifelsefieldcategory"> + <cd:command category="pdf conditional" file="scrn-fld.mkvi" level="system" name="doifelsefieldcategory"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -7899,7 +8556,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="scrn-fld.mkvi" name="doiffieldcategoryelse"> + <cd:command category="pdf conditional" file="scrn-fld.mkvi" level="system" name="doiffieldcategoryelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -7912,7 +8569,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="scrn-fld.mkvi" name="definefieldbody"> + <cd:command category="pdf" file="scrn-fld.mkvi" level="style" name="definefieldbody"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -7925,7 +8582,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="scrn-fld.mkvi" name="setupfieldbody"> + <cd:command category="pdf" file="scrn-fld.mkvi" level="style" name="setupfieldbody"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -7938,7 +8595,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="scrn-fld.mkvi" name="fieldbody"> + <cd:command category="pdf" file="scrn-fld.mkvi" level="document" name="fieldbody"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -7948,7 +8605,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="scrn-fld.mkvi" name="definefieldbodyset"> + <cd:command category="pdf" file="scrn-fld.mkvi" level="style" name="definefieldbodyset"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -7958,7 +8615,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="scrn-fld.mkvi" name="doifelsefieldbody"> + <cd:command category="pdf conditional" file="scrn-fld.mkvi" level="system" name="doifelsefieldbody"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -7971,7 +8628,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="scrn-fld.mkvi" name="doiffieldbodyelse"> + <cd:command category="pdf conditional" file="scrn-fld.mkvi" level="system" name="doiffieldbodyelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -7984,7 +8641,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="scrn-fld.mkvi" name="definefield"> + <cd:command category="pdf" file="scrn-fld.mkvi" level="style" name="definefield"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -8009,7 +8666,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="scrn-fld.mkvi" name="definesubfield"> + <cd:command category="pdf" file="scrn-fld.mkvi" level="style" name="definesubfield"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -8022,7 +8679,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="scrn-fld.mkvi" name="clonefield"> + <cd:command category="pdf" file="scrn-fld.mkvi" level="style" name="clonefield"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -8038,7 +8695,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="scrn-fld.mkvi" name="copyfield"> + <cd:command category="pdf" file="scrn-fld.mkvi" level="style" name="copyfield"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -8048,7 +8705,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="scrn-fld.mkvi" name="fitfieldframed"> + <cd:command category="pdf background rules" file="scrn-fld.mkvi" level="document" name="fitfieldframed"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupframed"/> @@ -8056,7 +8713,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="scrn-fld.mkvi" name="fitfield"> + <cd:command category="pdf" file="scrn-fld.mkvi" level="document" name="fitfield"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -8066,7 +8723,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="scrn-fld.mkvi" name="setupfieldlabelframed"> + <cd:command category="pdf background" file="scrn-fld.mkvi" level="style" name="setupfieldlabelframed"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -8076,7 +8733,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="scrn-fld.mkvi" name="setupfieldcontentframed"> + <cd:command category="pdf background" file="scrn-fld.mkvi" level="style" name="setupfieldcontentframed"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -8087,7 +8744,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="scrn-fld.mkvi" name="setupfieldtotalframed"> + <cd:command category="pdf background" file="scrn-fld.mkvi" level="style" name="setupfieldtotalframed"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -8116,7 +8773,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="scrn-fld.mkvi" name="setupfield"> + <cd:command category="pdf background" file="scrn-fld.mkvi" level="style" name="setupfield"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -8139,7 +8796,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="scrn-fld.mkvi" name="setupfields"> + <cd:command category="pdf background" file="scrn-fld.mkvi" level="style" name="setupfields"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="reset"/> @@ -8159,7 +8816,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="scrn-fld.mkvi" name="field"> + <cd:command category="pdf" file="scrn-fld.mkvi" level="document" name="field"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -8169,7 +8826,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="scrn-fld.mkvi" name="definefieldstack"> + <cd:command category="pdf" file="scrn-fld.mkvi" level="style" name="definefieldstack"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -8182,7 +8839,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="scrn-fld.mkvi" name="fieldstack"> + <cd:command category="pdf" file="scrn-fld.mkvi" level="document" name="fieldstack"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -8197,7 +8854,7 @@ </cd:command> </cd:interface> <cd:interface file="i-figure.xml"> - <cd:command file="grph-fig.mkiv" name="figure" type="environment"> + <cd:command category="graphics" file="grph-fig.mkiv" level="document" name="figure" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -8210,7 +8867,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="grph-fig.mkiv" name="referring"> + <cd:command category="graphics" file="grph-fig.mkiv" level="document" name="referring"> <cd:arguments> <cd:position list="yes"/> <cd:position list="yes"/> @@ -8219,7 +8876,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="grph-fig.mkiv" name="marking"> + <cd:command category="graphics" file="grph-fig.mkiv" level="document" name="marking"> <cd:arguments> <cd:position list="yes"/> <cd:position list="yes"/> @@ -8228,7 +8885,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="grph-fig.mkiv" name="remark"> + <cd:command category="graphics" file="grph-fig.mkiv" level="document" name="remark"> <cd:arguments> <cd:position list="yes"/> <cd:position list="yes"/> @@ -8240,7 +8897,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="grph-fig.mkiv" name="colorbar"> + <cd:command category="colors" file="grph-fig.mkiv" level="document" name="colorbar"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:color"/> @@ -8249,21 +8906,21 @@ </cd:command> </cd:interface> <cd:interface file="i-file.xml"> - <cd:command file="file-ini.mkvi" name="input"> + <cd:command category="structure" file="file-ini.mkvi" level="document" name="input"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:file"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-ini.mkvi" name="input" variant="string"> + <cd:command category="structure" file="file-ini.mkvi" level="document" name="input" variant="string"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:file"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-ini.mkvi" name="doiffile"> + <cd:command category="structure conditional" file="file-ini.mkvi" level="system" name="doiffile"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:file"/> @@ -8273,7 +8930,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-ini.mkvi" name="doifnotfile"> + <cd:command category="structure conditional" file="file-ini.mkvi" level="system" name="doifnotfile"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:file"/> @@ -8283,7 +8940,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-ini.mkvi" name="doifelsefile"> + <cd:command category="structure conditional" file="file-ini.mkvi" level="system" name="doifelsefile"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:file"/> @@ -8296,7 +8953,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-ini.mkvi" name="doiffileelse"> + <cd:command category="structure conditional" file="file-ini.mkvi" level="system" name="doiffileelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:file"/> @@ -8309,24 +8966,24 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-sys.mkiv" name="jobfilename"/> - <cd:command file="core-sys.mkiv" name="jobfilesuffix"/> - <cd:command file="core-sys.mkiv" name="inputfilebarename"/> - <cd:command file="core-sys.mkiv" name="inputfilerealsuffix"/> - <cd:command file="core-sys.mkiv" name="inputfilesuffix"/> - <cd:command file="core-sys.mkiv" name="inputfilename"/> - <cd:command file="core-sys.mkiv" name="outputfilename"/> - <cd:command file="file-ini.mkvi" name="readingfile" type="environment"/> - <cd:command begin="push" end="pop" file="file-ini.mkvi" name="endofline" type="environment"/> - <cd:command file="file-ini.mkvi" name="restoreendofline"/> - <cd:command file="file-ini.mkvi" name="inputgivenfile"> + <cd:command category="structure" file="core-sys.mkiv" level="system" name="jobfilename"/> + <cd:command category="structure" file="core-sys.mkiv" level="system" name="jobfilesuffix"/> + <cd:command category="structure" file="core-sys.mkiv" level="system" name="inputfilebarename"/> + <cd:command category="structure" file="core-sys.mkiv" level="system" name="inputfilerealsuffix"/> + <cd:command category="structure" file="core-sys.mkiv" level="system" name="inputfilesuffix"/> + <cd:command category="structure" file="core-sys.mkiv" level="system" name="inputfilename"/> + <cd:command category="structure" file="core-sys.mkiv" level="system" name="outputfilename"/> + <cd:command category="structure" file="file-ini.mkvi" level="system" name="readingfile" type="environment"/> + <cd:command begin="push" category="structure" end="pop" file="file-ini.mkvi" level="system" name="endofline" type="environment"/> + <cd:command category="structure" file="file-ini.mkvi" level="system" name="restoreendofline"/> + <cd:command category="structure" file="file-ini.mkvi" level="system" name="inputgivenfile"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:file"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-ini.mkvi" name="doifelsepath"> + <cd:command category="structure conditional" file="file-ini.mkvi" level="system" name="doifelsepath"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:path"/> @@ -8339,7 +8996,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-ini.mkvi" name="doifpathelse"> + <cd:command category="structure conditional" file="file-ini.mkvi" level="system" name="doifpathelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:path"/> @@ -8352,7 +9009,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-ini.mkvi" name="doifelsefileexists"> + <cd:command category="structure conditional" file="file-ini.mkvi" level="system" name="doifelsefileexists"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:file"/> @@ -8365,7 +9022,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-ini.mkvi" name="doiffileexistselse"> + <cd:command category="structure conditional" file="file-ini.mkvi" level="system" name="doiffileexistselse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:file"/> @@ -8378,7 +9035,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-ini.mkvi" name="doifelsepathexists"> + <cd:command category="structure conditional" file="file-ini.mkvi" level="system" name="doifelsepathexists"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:path"/> @@ -8391,7 +9048,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-ini.mkvi" name="doifpathexistselse"> + <cd:command category="structure conditional" file="file-ini.mkvi" level="system" name="doifpathexistselse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:path"/> @@ -8404,7 +9061,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-ini.mkvi" name="doifelseparentfile"> + <cd:command category="structure conditional" file="file-ini.mkvi" level="system" name="doifelseparentfile"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:file"/> @@ -8417,7 +9074,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-ini.mkvi" name="doifparentfileelse"> + <cd:command category="structure conditional" file="file-ini.mkvi" level="system" name="doifparentfileelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:file"/> @@ -8430,21 +9087,21 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-ini.mkvi" name="splitfilename"> + <cd:command category="structure" file="file-ini.mkvi" level="system" name="splitfilename"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:file"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-ini.mkvi" name="splitofffull"/> - <cd:command file="file-ini.mkvi" name="splitoffpath"/> - <cd:command file="file-ini.mkvi" name="splitoffbase"/> - <cd:command file="file-ini.mkvi" name="splitoffname"/> - <cd:command file="file-ini.mkvi" name="splitofftype"/> - <cd:command file="file-ini.mkvi" name="splitoffkind"/> - <cd:command file="file-ini.mkvi" name="splitoffroot"/> - <cd:command file="file-job.mkvi" name="doifelseinputfile"> + <cd:command category="structure" file="file-ini.mkvi" level="system" name="splitofffull"/> + <cd:command category="structure" file="file-ini.mkvi" level="system" name="splitoffpath"/> + <cd:command category="structure" file="file-ini.mkvi" level="system" name="splitoffbase"/> + <cd:command category="structure" file="file-ini.mkvi" level="system" name="splitoffname"/> + <cd:command category="structure" file="file-ini.mkvi" level="system" name="splitofftype"/> + <cd:command category="structure" file="file-ini.mkvi" level="system" name="splitoffkind"/> + <cd:command category="structure" file="file-ini.mkvi" level="system" name="splitoffroot"/> + <cd:command category="structure conditional" file="file-job.mkvi" level="system" name="doifelseinputfile"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:file"/> @@ -8457,7 +9114,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-job.mkvi" name="doifinputfileelse"> + <cd:command category="structure conditional" file="file-job.mkvi" level="system" name="doifinputfileelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:file"/> @@ -8470,45 +9127,45 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-ini.mkvi" name="processfile"> + <cd:command category="structure" file="file-ini.mkvi" level="system" name="processfile"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:file"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-job.mkvi" name="usepath"> + <cd:command category="structure" file="file-job.mkvi" level="style" name="usepath"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:path"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-job.mkvi" name="usesubpath"> + <cd:command category="structure" file="file-job.mkvi" level="style" name="usesubpath"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:path"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command begin="push" end="pop" file="file-job.mkvi" name="path" type="environment"> + <cd:command begin="push" category="structure" end="pop" file="file-job.mkvi" level="system" name="path" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:path"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-job.mkvi" name="resetpath"/> - <cd:command file="file-job.mkvi" name="allinputpaths"/> - <cd:command file="file-ini.mkvi" name="locatefilepath"> + <cd:command category="structure" file="file-job.mkvi" level="style" name="resetpath"/> + <cd:command category="structure" file="file-job.mkvi" level="system" name="allinputpaths"/> + <cd:command category="structure" file="file-ini.mkvi" level="system" name="locatefilepath"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:file"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-job.mkvi" name="locatedfilepath"/> - <cd:command file="file-job.mkvi" name="usezipfile"> + <cd:command category="structure" file="file-job.mkvi" level="system" name="locatedfilepath"/> + <cd:command category="structure" file="file-job.mkvi" level="style" name="usezipfile"> <cd:arguments> <cd:keywords> <cd:constant type="cd:file"/> @@ -8518,91 +9175,98 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-job.mkvi" name="processfilemany"> + <cd:command category="structure" file="file-job.mkvi" level="system" name="processfilemany"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:file"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-job.mkvi" name="processfileonce"> + <cd:command category="structure" file="file-job.mkvi" level="system" name="processfileonce"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:file"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-job.mkvi" name="processfilenone"> + <cd:command category="structure" file="file-job.mkvi" level="system" name="processfilenone"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:file"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-job.mkvi" name="loadtexfile"> + <cd:command category="structure" file="file-job.mkvi" level="system" name="loadtexfile"> <cd:arguments> <cd:keywords> <cd:constant type="cd:file"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-job.mkvi" name="loadluafile"> + <cd:command category="structure lua" file="file-job.mkvi" level="system" name="loadluafile"> <cd:arguments> <cd:keywords> <cd:constant type="cd:file"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-job.mkvi" name="loadcldfile"> + <cd:command category="structure lua" file="file-job.mkvi" level="system" name="loadcldfile"> <cd:arguments> <cd:keywords> <cd:constant type="cd:file"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-job.mkvi" name="loadanyfile"> + <cd:command category="structure" file="file-job.mkvi" level="system" name="loadanyfile"> <cd:arguments> <cd:keywords> <cd:constant type="cd:file"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-job.mkvi" name="loadtexfileonce"> + <cd:command category="structure" file="file-job.mkvi" level="system" name="loadtexfileonce"> <cd:arguments> <cd:keywords> <cd:constant type="cd:file"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-job.mkvi" name="loadluafileonce"> + <cd:command category="structure lua" file="file-job.mkvi" level="system" name="loadluafileonce"> <cd:arguments> <cd:keywords> <cd:constant type="cd:file"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-job.mkvi" name="loadcldfileonce"> + <cd:command category="structure lua" file="file-job.mkvi" level="system" name="loadcldfileonce"> <cd:arguments> <cd:keywords> <cd:constant type="cd:file"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-job.mkvi" name="loadanyfileonce"> + <cd:command category="structure" file="file-job.mkvi" level="system" name="loadanyfileonce"> <cd:arguments> <cd:keywords> <cd:constant type="cd:file"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-job.mkvi" name="continueifinputfile"> + <cd:command category="structure" file="file-job.mkvi" level="system" name="continueifinputfile"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:file"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command category="structure" file="file-job.mkvi" level="document" name="samplefile"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:file"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-res.mkvi" name="readjobfile"> + <cd:command category="structure conditional" file="file-res.mkvi" level="system" name="readjobfile"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:file"/> @@ -8615,7 +9279,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-res.mkvi" name="readlocfile"> + <cd:command category="structure conditional" file="file-res.mkvi" level="system" name="readlocfile"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:file"/> @@ -8628,7 +9292,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-res.mkvi" name="readsysfile"> + <cd:command category="structure conditional" file="file-res.mkvi" level="system" name="readsysfile"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:file"/> @@ -8641,7 +9305,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-res.mkvi" name="readfixfile"> + <cd:command category="structure conditional" file="file-res.mkvi" level="system" name="readfixfile"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:path"/> @@ -8657,7 +9321,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-res.mkvi" name="readsetfile"> + <cd:command category="structure conditional" file="file-res.mkvi" level="system" name="readsetfile"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:path"/> @@ -8673,7 +9337,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-res.mkvi" name="readfile"> + <cd:command category="structure conditional" file="file-res.mkvi" level="system" name="readfile"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:file"/> @@ -8686,14 +9350,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-res.mkvi" name="ReadFile"> + <cd:command category="structure" file="file-res.mkvi" level="system" name="ReadFile"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:file"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-res.mkvi" name="readtexfile"> + <cd:command category="structure conditional" file="file-res.mkvi" level="system" name="readtexfile"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:file"/> @@ -8706,7 +9370,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-res.mkvi" name="readxmlfile"> + <cd:command category="structure conditional xml" file="file-res.mkvi" level="system" name="readxmlfile"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:file"/> @@ -8719,7 +9383,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-res.mkvi" name="doifelselocfile"> + <cd:command category="structure conditional" file="file-res.mkvi" level="system" name="doifelselocfile"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:file"/> @@ -8732,7 +9396,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-res.mkvi" name="doiflocfileelse"> + <cd:command category="structure conditional" file="file-res.mkvi" level="system" name="doiflocfileelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:file"/> @@ -8745,14 +9409,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-res.mkvi" name="locfilename"> + <cd:command category="structure" file="file-res.mkvi" level="system" name="locfilename"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:file"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-sys.mkvi" name="definefilesynonym"> + <cd:command category="structure" file="file-sys.mkvi" level="system" name="definefilesynonym"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -8762,7 +9426,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-sys.mkvi" name="definefilefallback"> + <cd:command category="structure" file="file-sys.mkvi" level="system" name="definefilefallback"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -8772,7 +9436,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-sys.mkvi" name="truefilename"> + <cd:command category="structure" file="file-sys.mkvi" level="system" name="truefilename"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:file"/> @@ -8781,7 +9445,7 @@ </cd:command> </cd:interface> <cd:interface file="i-filler.xml"> - <cd:command file="spac-flr.mkiv" name="definefiller"> + <cd:command category="rules" file="spac-flr.mkiv" level="style" name="definefiller"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -8794,7 +9458,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="spac-flr.mkiv" name="setupfiller"> + <cd:command category="rules" file="spac-flr.mkiv" level="style" name="setupfiller"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -8861,7 +9525,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="spac-flr.mkiv" name="filler"> + <cd:command category="rules" file="spac-flr.mkiv" level="style" name="filler"> <cd:arguments> <cd:keywords> <cd:constant type="sym"/> @@ -8873,7 +9537,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-flr.mkiv" name="checkedfiller"> + <cd:command category="rules" file="spac-flr.mkiv" level="style" name="checkedfiller"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="sym"/> @@ -8886,7 +9550,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="node-rul.mkiv" name="definelinefiller"> + <cd:command category="rules metapost" file="node-rul.mkiv" level="style" name="definelinefiller"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -8899,7 +9563,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="node-rul.mkiv" name="setuplinefiller"> + <cd:command category="rules metapost" file="node-rul.mkiv" level="style" name="setuplinefiller"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -8955,7 +9619,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="node-rul.mkiv" name="setuplinefillers"> + <cd:command category="rules metapost" file="node-rul.mkiv" level="style" name="setuplinefillers"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -8965,7 +9629,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="node-rul.mkiv" name="linefiller" type="environment"> + <cd:command category="rules metapost" file="node-rul.mkiv" level="style" name="linefiller" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="filler"/> @@ -8976,7 +9640,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="node-rul.mkiv" name="setlinefiller"> + <cd:command category="rules metapost" file="node-rul.mkiv" level="style" name="setlinefiller"> <cd:arguments> <cd:keywords> <cd:constant type="filler"/> @@ -8986,7 +9650,7 @@ </cd:command> </cd:interface> <cd:interface file="i-fillinline.xml"> - <cd:command file="pack-mrl.mkiv" name="setupfillinlines"> + <cd:command category="rules" file="pack-mrl.mkiv" level="style" name="setupfillinlines"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="before"> @@ -9013,7 +9677,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="pack-mrl.mkiv" name="fillinline"> + <cd:command category="rules" file="pack-mrl.mkiv" level="document" name="fillinline"> <cd:arguments> <cd:assignments list="yes"> <cd:inherit name="setupfillinlines"/> @@ -9022,7 +9686,7 @@ </cd:command> </cd:interface> <cd:interface file="i-fillinrule.xml"> - <cd:command file="pack-mrl.mkiv" name="setupfillinrules"> + <cd:command category="rules" file="pack-mrl.mkiv" level="style" name="setupfillinrules"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="before"> @@ -9061,7 +9725,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="pack-mrl.mkiv" name="fillinrules"> + <cd:command category="rules" file="pack-mrl.mkiv" level="document" name="fillinrules"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupfillinrules"/> @@ -9074,7 +9738,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="pack-mrl.mkiv" name="fillintext"> + <cd:command category="rules" file="pack-mrl.mkiv" level="document" name="fillintext"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupfillinrules"/> @@ -9089,7 +9753,7 @@ </cd:command> </cd:interface> <cd:interface file="i-firstline.xml"> - <cd:command file="typo-fln.mkiv" name="definefirstline"> + <cd:command category="fonts colors" file="typo-fln.mkiv" level="style" name="definefirstline"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -9102,7 +9766,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="typo-fln.mkiv" name="setupfirstline"> + <cd:command category="fonts colors" file="typo-fln.mkiv" level="style" name="setupfirstline"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -9126,14 +9790,14 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="typo-fln.mkiv" name="setfirstline"> + <cd:command category="fonts colors" file="typo-fln.mkiv" level="document" name="setfirstline"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-fln.mkiv" name="applytofirstcharacter"> + <cd:command category="fonts colors" file="typo-fln.mkiv" level="system" name="applytofirstcharacter"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -9143,7 +9807,7 @@ </cd:command> </cd:interface> <cd:interface file="i-fittingpage.xml"> - <cd:command file="page-app.mkiv" name="definefittingpage"> + <cd:command category="background layout" file="page-app.mkiv" level="style" name="definefittingpage"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -9156,7 +9820,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-app.mkiv" name="setupfittingpage"> + <cd:command category="background layout" file="page-app.mkiv" level="style" name="setupfittingpage"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -9177,14 +9841,14 @@ </cd:parameter> <cd:parameter name="paper"> <cd:constant type="auto"/> - <cd:constant default="yes" type="defaut"/> + <cd:constant default="yes" type="default"/> <cd:constant type="cd:name"/> </cd:parameter> <cd:inherit name="setupframed"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-app.mkiv" name="fittingpage" type="environment"> + <cd:command category="background layout" file="page-app.mkiv" level="document" name="fittingpage" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -9194,9 +9858,9 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-app.mkiv" generated="yes" name="fittingpage" type="environment" variant="example"> + <cd:command category="background layout" file="page-app.mkiv" generated="yes" level="document" name="fittingpage" type="environment" variant="instance"> <cd:sequence> - <cd:variable value="fittingpage"/> + <cd:instance value="fittingpage"/> </cd:sequence> <cd:arguments> <cd:assignments list="yes" optional="yes"> @@ -9208,28 +9872,14 @@ <cd:constant value="MPpage"/> </cd:instances> </cd:command> - <cd:command file="page-app.mkiv" name="TEXpage" type="environment"> - <cd:arguments> - <cd:assignments list="yes" optional="yes"> - <cd:inherit name="setupfittingpage"/> - </cd:assignments> - </cd:arguments> - </cd:command> - <cd:command file="page-app.mkiv" name="setupTEXpage"> + <cd:command category="background layout" file="page-app.mkiv" level="style" name="setupTEXpage"> <cd:arguments> <cd:assignments list="yes"> <cd:inherit name="setupfittingpage"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="meta-fig.mkiv" name="MPpage" type="environment"> - <cd:arguments> - <cd:assignments list="yes" optional="yes"> - <cd:inherit name="setupfittingpage"/> - </cd:assignments> - </cd:arguments> - </cd:command> - <cd:command file="meta-fig.mkiv" name="setupMPpage"> + <cd:command category="background layout metapost" file="meta-fig.mkiv" level="style" name="setupMPpage"> <cd:arguments> <cd:assignments list="yes"> <cd:inherit name="setupfittingpage"/> @@ -9238,12 +9888,13 @@ </cd:command> </cd:interface> <cd:interface file="i-floats.xml"> - <cd:command file="strc-flt.mkvi" name="definefloat"> + <cd:command category="structure" file="strc-flt.mkvi" level="style" name="definefloat"> <cd:arguments> <cd:keywords> <cd:constant type="cd:singular"/> </cd:keywords> <cd:keywords optional="yes"> + <cd:constant type="cd:singular"/> <cd:constant type="cd:plural"/> </cd:keywords> <cd:assignments list="yes" optional="yes"> @@ -9258,7 +9909,7 @@ <cd:constant value="graphic"/> </cd:instances> </cd:command> - <cd:command file="strc-flt.mkvi" name="definefloat" variant="name"> + <cd:command category="structure" file="strc-flt.mkvi" level="style" name="definefloat" variant="name"> <cd:arguments> <cd:keywords> <cd:constant type="cd:singular"/> @@ -9278,7 +9929,7 @@ <cd:constant value="graphic"/> </cd:instances> </cd:command> - <cd:command file="strc-flt.mkvi" name="setupfloat"> + <cd:command category="structure" file="strc-flt.mkvi" level="style" name="setupfloat"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:singular"/> @@ -9319,7 +9970,7 @@ <cd:constant default="yes" type="normal"/> </cd:parameter> <cd:parameter name="grid"> - <cd:constant type="cd:string"/> + <cd:inherit name="snaptogrid"/> </cd:parameter> <cd:parameter name="local"> <cd:constant type="yes"/> @@ -9385,6 +10036,26 @@ <cd:parameter name="bottomafter"> <cd:constant type="cd:command"/> </cd:parameter> + <cd:parameter name="expansion"> + <cd:constant type="yes"/> + <cd:constant default="yes" type="no"/> + <cd:constant type="xml"/> + </cd:parameter> + <cd:parameter name="referenceprefix"> + <cd:constant type="+"/> + <cd:constant type="-"/> + <cd:constant type="cd:text"/> + </cd:parameter> + <cd:parameter name="xmlsetup"> + <cd:constant type="cd:name"/> + </cd:parameter> + <cd:parameter name="catcodes"> + <cd:constant type="cd:name"/> + </cd:parameter> + <cd:parameter name="freeregion"> + <cd:constant default="yes" type="yes"/> + <cd:constant type="no"/> + </cd:parameter> <cd:parameter name="spacebefore"> <cd:constant type="none"/> <cd:inherit name="blank"/> @@ -9412,6 +10083,18 @@ <cd:constant type="none"/> <cd:inherit name="blank"/> </cd:parameter> + <cd:parameter name="spacebeforeside"> + <cd:constant type="none"/> + <cd:inherit name="blank"/> + </cd:parameter> + <cd:parameter name="spaceafterside"> + <cd:constant type="none"/> + <cd:inherit name="blank"/> + </cd:parameter> + <cd:parameter name="sidethreshold"> + <cd:constant type="old"/> + <cd:constant default="yes" type="dimension"/> + </cd:parameter> <cd:parameter name="margin"> <cd:constant type="cd:dimension"/> </cd:parameter> @@ -9438,7 +10121,17 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-flt.mkvi" name="setupfloatcaption"> + <cd:command category="structure" file="strc-flt.mkvi" level="style" name="setupfloats"> + <cd:arguments> + <cd:keywords list="yes" optional="yes"> + <cd:constant type="cd:singular"/> + </cd:keywords> + <cd:assignments list="yes"> + <cd:inherit name="setupfloat"/> + </cd:assignments> + </cd:arguments> + </cd:command> + <cd:command category="structure fonts counter" file="strc-flt.mkvi" level="style" name="setupfloatcaption"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -9473,6 +10166,8 @@ <cd:constant type="top"/> <cd:constant default="yes" type="bottom"/> <cd:constant type="stretch"/> + <cd:constant type="tolerant"/> + <cd:constant type="verytolerant"/> <cd:constant type="none"/> <cd:constant type="default"/> </cd:parameter> @@ -9497,6 +10192,9 @@ <cd:parameter name="distance"> <cd:constant type="cd:dimension"/> </cd:parameter> + <cd:parameter name="headseparator"> + <cd:constant type="cd:text"/> + </cd:parameter> <cd:parameter name="inbetween"> <cd:constant type="cd:command"/> </cd:parameter> @@ -9552,7 +10250,17 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-flt.mkvi" name="setupcaption"> + <cd:command category="structure fonts counter" file="strc-flt.mkvi" level="style" name="setupcaption"> + <cd:arguments> + <cd:keywords list="yes" optional="yes"> + <cd:constant type="cd:name"/> + </cd:keywords> + <cd:assignments list="yes"> + <cd:inherit name="setupfloatcaption"/> + </cd:assignments> + </cd:arguments> + </cd:command> + <cd:command category="structure fonts counter" file="strc-flt.mkvi" level="style" name="setupcaptions"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -9562,7 +10270,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-flt.mkvi" generated="yes" name="placefloat" variant="instance"> + <cd:command category="structure" file="strc-flt.mkvi" generated="yes" level="document" name="placefloat" variant="instance"> <cd:sequence> <cd:string value="place"/> <cd:instance value="float"/> @@ -9620,10 +10328,10 @@ <cd:constant type="page"/> <cd:constant type="leftpage"/> <cd:constant type="rightpage"/> - <cd:constant type="header"/> - <cd:constant type="footer"/> <cd:constant type="somewhere"/> <cd:constant type="effective"/> + <cd:constant type="header"/> + <cd:constant type="footer"/> </cd:keywords> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:reference"/> @@ -9641,7 +10349,7 @@ <cd:constant value="graphic"/> </cd:instances> </cd:command> - <cd:command file="strc-flt.mkvi" name="placefloat"> + <cd:command category="structure" file="strc-flt.mkvi" level="document" name="placefloat"> <cd:arguments> <cd:keywords> <cd:constant type="cd:singular"/> @@ -9698,10 +10406,10 @@ <cd:constant type="page"/> <cd:constant type="leftpage"/> <cd:constant type="rightpage"/> - <cd:constant type="header"/> - <cd:constant type="footer"/> <cd:constant type="somewhere"/> <cd:constant type="effective"/> + <cd:constant type="header"/> + <cd:constant type="footer"/> </cd:keywords> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:reference"/> @@ -9712,7 +10420,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="strc-flt.mkvi" generated="yes" name="placefloat" type="environment" variant="instance"> + <cd:command category="structure" file="strc-flt.mkvi" generated="yes" level="document" name="placefloat" type="environment" variant="instance"> <cd:sequence> <cd:string value="place"/> <cd:instance value="float"/> @@ -9783,10 +10491,10 @@ <cd:constant type="page"/> <cd:constant type="leftpage"/> <cd:constant type="rightpage"/> - <cd:constant type="header"/> - <cd:constant type="footer"/> <cd:constant type="somewhere"/> <cd:constant type="effective"/> + <cd:constant type="header"/> + <cd:constant type="footer"/> </cd:parameter> <cd:parameter name="reference"> <cd:constant type="cd:reference"/> @@ -9806,9 +10514,95 @@ <cd:constant value="graphic"/> </cd:instances> </cd:command> - <cd:command file="strc-flt.mkvi" generated="yes" name="floattext" type="environment" variant="example"> + <cd:command category="structure" file="strc-flt.mkvi" level="document" name="placefloat" type="environment"> + <cd:arguments> + <cd:keywords> + <cd:constant type="cd:singular"/> + </cd:keywords> + <cd:assignments list="yes" optional="yes"> + <cd:parameter name="title"> + <cd:constant type="cd:text"/> + </cd:parameter> + <cd:parameter name="bookmark"> + <cd:constant type="cd:text"/> + </cd:parameter> + <cd:parameter name="marking"> + <cd:constant type="cd:text"/> + </cd:parameter> + <cd:parameter name="list"> + <cd:constant type="cd:text"/> + </cd:parameter> + <cd:parameter name="location"> + <cd:constant type="split"/> + <cd:constant type="always"/> + <cd:constant type="left"/> + <cd:constant type="right"/> + <cd:constant type="inner"/> + <cd:constant type="outer"/> + <cd:constant type="backspace"/> + <cd:constant type="cutspace"/> + <cd:constant type="inleft"/> + <cd:constant type="inright"/> + <cd:constant type="inmargin"/> + <cd:constant type="leftmargin"/> + <cd:constant type="rightmargin"/> + <cd:constant type="leftedge"/> + <cd:constant type="rightedge"/> + <cd:constant type="innermargin"/> + <cd:constant type="outermargin"/> + <cd:constant type="inneredge"/> + <cd:constant type="outeredge"/> + <cd:constant type="text"/> + <cd:constant type="opposite"/> + <cd:constant type="reset"/> + <cd:constant type="height"/> + <cd:constant type="depth"/> + <cd:constant method="none" prefix="cd:sign" type="line"/> + <cd:constant type="halfline"/> + <cd:constant type="grid"/> + <cd:constant type="high"/> + <cd:constant type="low"/> + <cd:constant type="fit"/> + <cd:constant type="90"/> + <cd:constant type="180"/> + <cd:constant type="270"/> + <cd:constant type="nonumber"/> + <cd:constant type="none"/> + <cd:constant type="local"/> + <cd:constant type="here"/> + <cd:constant type="force"/> + <cd:constant type="margin"/> + <cd:constant method="none" prefix="cd:sign" type="hang"/> + <cd:constant type="hanging"/> + <cd:constant type="tall"/> + <cd:constant type="both"/> + <cd:constant type="middle"/> + <cd:constant type="offset"/> + <cd:constant type="top"/> + <cd:constant type="bottom"/> + <cd:constant type="auto"/> + <cd:constant type="page"/> + <cd:constant type="leftpage"/> + <cd:constant type="rightpage"/> + <cd:constant type="somewhere"/> + <cd:constant type="effective"/> + <cd:constant type="header"/> + <cd:constant type="footer"/> + </cd:parameter> + <cd:parameter name="reference"> + <cd:constant type="cd:reference"/> + </cd:parameter> + </cd:assignments> + <cd:assignments list="yes" optional="yes"> + <cd:parameter name="cd:key"> + <cd:constant type="cd:value"/> + </cd:parameter> + </cd:assignments> + </cd:arguments> + </cd:command> + <cd:command category="structure" file="strc-flt.mkvi" generated="yes" level="document" name="floattext" type="environment" variant="instance"> <cd:sequence> - <cd:variable value="float"/> + <cd:instance value="float"/> <cd:string value="text"/> </cd:sequence> <cd:arguments> @@ -9864,10 +10658,10 @@ <cd:constant type="page"/> <cd:constant type="leftpage"/> <cd:constant type="rightpage"/> - <cd:constant type="header"/> - <cd:constant type="footer"/> <cd:constant type="somewhere"/> <cd:constant type="effective"/> + <cd:constant type="header"/> + <cd:constant type="footer"/> </cd:keywords> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:reference"/> @@ -9876,37 +10670,58 @@ <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> + <cd:instances> + <cd:constant value="chemical"/> + <cd:constant value="figure"/> + <cd:constant value="table"/> + <cd:constant value="intermezzo"/> + <cd:constant value="graphic"/> + </cd:instances> </cd:command> - <cd:command file="strc-flt.mkvi" generated="yes" name="placelistoffloats" variant="example"> + <cd:command category="structure" file="strc-flt.mkvi" generated="yes" level="document" name="placelistoffloats" variant="instance"> <cd:sequence> <cd:string value="placelistof"/> - <cd:variable value="floats"/> + <cd:instance value="floats"/> </cd:sequence> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setuplist"/> </cd:assignments> </cd:arguments> + <cd:instances> + <cd:constant value="chemicals"/> + <cd:constant value="figures"/> + <cd:constant value="tables"/> + <cd:constant value="intermezzi"/> + <cd:constant value="graphics"/> + </cd:instances> </cd:command> - <cd:command file="strc-flt.mkvi" generated="yes" name="completelistoffloats" variant="example"> + <cd:command category="structure" file="strc-flt.mkvi" generated="yes" level="document" name="completelistoffloats" variant="instance"> <cd:sequence> <cd:string value="completelistof"/> - <cd:variable value="floats"/> + <cd:instance value="floats"/> </cd:sequence> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setuplist"/> </cd:assignments> </cd:arguments> + <cd:instances> + <cd:constant value="chemicals"/> + <cd:constant value="figures"/> + <cd:constant value="tables"/> + <cd:constant value="intermezzi"/> + <cd:constant value="graphics"/> + </cd:instances> </cd:command> - <cd:command file="strc-flt.mkvi" name="floatuserdataparameter"> + <cd:command category="structure" file="strc-flt.mkvi" level="system" name="floatuserdataparameter"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:key"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-flt.mkvi" name="doifelserightpagefloat"> + <cd:command category="structure conditional" file="strc-flt.mkvi" level="system" name="doifelserightpagefloat"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:true"/> @@ -9916,7 +10731,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-flt.mkvi" name="doifrightpagefloatelse"> + <cd:command category="structure conditional" file="strc-flt.mkvi" level="system" name="doifrightpagefloatelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:true"/> @@ -9926,7 +10741,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-flt.mkvi" name="doifelseoddpagefloat"> + <cd:command category="structure conditional" file="strc-flt.mkvi" level="system" name="doifelseoddpagefloat"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:true"/> @@ -9936,7 +10751,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-flt.mkvi" name="doifoddpagefloatelse"> + <cd:command category="structure conditional" file="strc-flt.mkvi" level="system" name="doifoddpagefloatelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:true"/> @@ -9946,7 +10761,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-flt.mkvi" name="doifelsemainfloatbody"> + <cd:command category="structure conditional" file="strc-flt.mkvi" level="system" name="doifelsemainfloatbody"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:true"/> @@ -9956,7 +10771,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-flt.mkvi" name="doifmainfloatbodyelse"> + <cd:command category="structure conditional" file="strc-flt.mkvi" level="system" name="doifmainfloatbodyelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:true"/> @@ -9966,7 +10781,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-flt.mkvi" name="setuplocalfloats"> + <cd:command category="structure" file="strc-flt.mkvi" level="style" name="setuplocalfloats"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="before"> @@ -9981,20 +10796,20 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-flt.mkvi" name="noflocalfloats"/> - <cd:command file="strc-flt.mkvi" name="resetlocalfloats"/> - <cd:command file="strc-flt.mkvi" name="somelocalfloat"/> - <cd:command file="strc-flt.mkvi" name="getlocalfloats"/> - <cd:command file="strc-flt.mkvi" name="flushlocalfloats"/> - <cd:command file="strc-flt.mkvi" name="getlocalfloat"> + <cd:command category="structure" file="strc-flt.mkvi" level="system" name="noflocalfloats"/> + <cd:command category="structure" file="strc-flt.mkvi" level="system" name="resetlocalfloats"/> + <cd:command category="structure" file="strc-flt.mkvi" level="system" name="somelocalfloat"/> + <cd:command category="structure" file="strc-flt.mkvi" level="system" name="getlocalfloats"/> + <cd:command category="structure" file="strc-flt.mkvi" level="system" name="flushlocalfloats"/> + <cd:command category="structure" file="strc-flt.mkvi" level="system" name="getlocalfloat"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-flt.mkvi" name="forcelocalfloats"/> - <cd:command file="tabl-tsp.mkiv" name="setupfloatsplitting"> + <cd:command category="structure" file="strc-flt.mkvi" level="system" name="forcelocalfloats"/> + <cd:command category="structure counter" file="tabl-tsp.mkiv" level="style" name="setupfloatsplitting"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="before"> @@ -10016,7 +10831,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="tabl-tsp.mkiv" name="splitfloat"> + <cd:command category="structure" file="tabl-tsp.mkiv" level="system" name="splitfloat"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupfloatsplitting"/> @@ -10027,14 +10842,14 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="tabl-tsp.mkiv" name="doifnotinsidesplitfloat"> + <cd:command category="structure conditional" file="tabl-tsp.mkiv" level="system" name="doifnotinsidesplitfloat"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:true"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-flt.mkiv" name="placenamedfloat"> + <cd:command category="structure" file="page-flt.mkiv" level="document" name="placenamedfloat"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -10044,7 +10859,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-flt.mkiv" name="placefloatwithsetups"> + <cd:command category="structure" file="page-flt.mkiv" level="document" name="placefloatwithsetups"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -10101,10 +10916,10 @@ <cd:constant type="page"/> <cd:constant type="leftpage"/> <cd:constant type="rightpage"/> - <cd:constant type="header"/> - <cd:constant type="footer"/> <cd:constant type="somewhere"/> <cd:constant type="effective"/> + <cd:constant type="header"/> + <cd:constant type="footer"/> </cd:keywords> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:reference"/> @@ -10117,7 +10932,7 @@ </cd:command> </cd:interface> <cd:interface file="i-fontfamily.xml"> - <cd:command file="font-sel.mkvi" name="definefontfamily"> + <cd:command category="fonts" file="font-sel.mkvi" level="style" name="definefontfamily"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -10184,7 +10999,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="font-sel.mkvi" name="definefontfamily" variant="preset"> + <cd:command category="fonts" file="font-sel.mkvi" level="style" name="definefontfamily" variant="preset"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -10218,7 +11033,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-sel.mkvi" name="definefallbackfamily"> + <cd:command category="fonts" file="font-sel.mkvi" level="style" name="definefallbackfamily"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -10301,7 +11116,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="font-sel.mkvi" name="definefallbackfamily" variant="preset"> + <cd:command category="fonts" file="font-sel.mkvi" level="style" name="definefallbackfamily" variant="preset"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -10335,7 +11150,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-sel.mkvi" name="definefontfamilypreset"> + <cd:command category="fonts" file="font-sel.mkvi" level="system" name="definefontfamilypreset"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -10345,7 +11160,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="font-sel.mkvi" name="definefontfamilypreset" variant="name"> + <cd:command category="fonts" file="font-sel.mkvi" level="system" name="definefontfamilypreset" variant="name"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -10357,7 +11172,7 @@ </cd:command> </cd:interface> <cd:interface file="i-fonts.xml"> - <cd:command file="font-col.mkvi" name="definefontfallback"> + <cd:command category="fonts" file="font-col.mkvi" level="style" name="definefontfallback"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -10386,10 +11201,16 @@ <cd:constant type="cd:number"/> <cd:constant type="cd:name"/> </cd:parameter> + <cd:parameter name="features"> + <cd:constant type="cd:name"/> + </cd:parameter> + <cd:parameter name="factor"> + <cd:constant type="cd:number"/> + </cd:parameter> </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="font-col.mkvi" name="resetfontfallback"> + <cd:command category="fonts" file="font-col.mkvi" level="style" name="resetfontfallback"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -10399,15 +11220,20 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-emp.mkvi" name="emphasistypeface"/> - <cd:command file="font-emp.mkvi" name="emphasisboldface"/> - <cd:command file="font-emp.mkvi" name="normalboldface"/> - <cd:command file="font-emp.mkvi" name="normaltypeface"/> - <cd:command file="font-emp.mkvi" name="swaptypeface"/> - <cd:command file="font-emp.mkvi" name="typeface"/> - <cd:command file="font-emp.mkvi" name="boldface"/> - <cd:command file="font-emp.mkvi" name="swapface"/> - <cd:command file="font-fea.mkvi" name="definefontfeature"> + <cd:command category="fonts" file="font-emp.mkvi" level="document" name="emphasistypeface"/> + <cd:command category="fonts" file="font-emp.mkvi" level="document" name="emphasisboldface"/> + <cd:command category="fonts" file="font-emp.mkvi" level="document" name="normalboldface"/> + <cd:command category="fonts" file="font-emp.mkvi" level="document" name="normalitalicface"/> + <cd:command category="fonts" file="font-emp.mkvi" level="document" name="normalslantedface"/> + <cd:command category="fonts" file="font-emp.mkvi" level="document" name="normaltypeface"/> + <cd:command category="fonts" file="font-emp.mkvi" level="document" name="swaptypeface"/> + <cd:command category="fonts" file="font-emp.mkvi" level="document" name="typeface"/> + <cd:command category="fonts" file="font-emp.mkvi" level="document" name="boldface"/> + <cd:command category="fonts" file="font-emp.mkvi" level="document" name="italicface"/> + <cd:command category="fonts" file="font-emp.mkvi" level="document" name="slantedface"/> + <cd:command category="fonts" file="font-emp.mkvi" level="document" name="swapface"/> + <cd:command category="fonts" file="font-emp.mkvi" level="document" name="em"/> + <cd:command category="fonts" file="font-fea.mkvi" level="style" name="definefontfeature"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -10503,6 +11329,10 @@ <cd:parameter name="boundingbox"> <cd:constant type="yes"/> <cd:constant type="no"/> + <cd:constant type="background"/> + <cd:constant type="frame"/> + <cd:constant type="empty"/> + <cd:constant type="cd:color"/> </cd:parameter> <cd:parameter name="compose"> <cd:constant type="yes"/> @@ -10583,10 +11413,14 @@ <cd:parameter name="mathnolimitsmode"> <cd:constant type="cd:number"/> </cd:parameter> + <cd:parameter name="blockligatures"> + <cd:constant type="yes"/> + <cd:constant default="yes" type="no"/> + </cd:parameter> </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="font-fea.mkvi" name="adaptfontfeature"> + <cd:command category="fonts" file="font-fea.mkvi" level="style" name="adaptfontfeature"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -10596,7 +11430,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="font-fea.mkvi" name="fontfeaturelist"> + <cd:command category="fonts" file="font-fea.mkvi" level="document" name="fontfeaturelist"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -10606,72 +11440,72 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-fea.mkvi" name="addfeature"> + <cd:command category="fonts" file="font-fea.mkvi" level="style" name="addfeature"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-fea.mkvi" name="addfeature" variant="direct"> + <cd:command category="fonts" file="font-fea.mkvi" level="style" name="addfeature" variant="direct"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-fea.mkvi" name="subtractfeature"> + <cd:command category="fonts" file="font-fea.mkvi" level="style" name="subtractfeature"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-fea.mkvi" name="subtractfeature" variant="direct"> + <cd:command ategory="fonts" clevel="style" file="font-fea.mkvi" name="subtractfeature" variant="direct"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-fea.mkvi" name="replacefeature"> + <cd:command category="fonts" file="font-fea.mkvi" level="style" name="replacefeature"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-fea.mkvi" name="replacefeature" variant="direct"> + <cd:command category="fonts" file="font-fea.mkvi" level="style" name="replacefeature" variant="direct"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-fea.mkvi" name="resetandaddfeature"> + <cd:command category="fonts" file="font-fea.mkvi" level="style" name="resetandaddfeature"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-fea.mkvi" name="resetandaddfeature" variant="direct"> + <cd:command category="fonts" file="font-fea.mkvi" level="style" name="resetandaddfeature" variant="direct"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-fea.mkvi" name="resetfeature"/> - <cd:command file="font-fea.mkvi" name="revivefeature"/> - <cd:command file="font-fea.mkvi" name="setfontfeature"> + <cd:command category="fonts" file="font-fea.mkvi" level="style" name="resetfeature"/> + <cd:command category="fonts" file="font-fea.mkvi" level="style" name="revivefeature"/> + <cd:command category="fonts" file="font-fea.mkvi" level="style" name="setfontfeature"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-fea.mkvi" name="feature"> + <cd:command category="fonts" file="font-fea.mkvi" level="document" name="feature"> <cd:arguments> <cd:keywords> <cd:constant type="+"/> @@ -10688,12 +11522,12 @@ <cd:constant type="old"/> <cd:constant type="local"/> </cd:keywords> - <cd:keywords> + <cd:keywords list="yes"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-fea.mkvi" name="feature" variant="direct"> + <cd:command category="fonts" file="font-fea.mkvi" level="document" name="feature" variant="direct"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="+"/> @@ -10710,12 +11544,12 @@ <cd:constant type="old"/> <cd:constant type="local"/> </cd:keywords> - <cd:keywords delimiters="braces"> + <cd:keywords delimiters="braces" list="yes"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-fea.mkvi" name="doifelsecurrentfonthasfeature"> + <cd:command category="fonts conditional" file="font-fea.mkvi" level="system" name="doifelsecurrentfonthasfeature"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -10728,7 +11562,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-fea.mkvi" name="doifcurrentfonthasfeatureelse"> + <cd:command category="fonts conditional" file="font-fea.mkvi" level="system" name="doifcurrentfonthasfeatureelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -10741,35 +11575,35 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-fea.mkvi" name="doaddfeature"> + <cd:command category="fonts" file="font-fea.mkvi" level="system" name="doaddfeature"> <cd:arguments> - <cd:keywords delimiters="braces"> + <cd:keywords delimiters="braces" list="yes"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-fea.mkvi" name="dosubtractfeature"> + <cd:command category="fonts" file="font-fea.mkvi" level="system" name="dosubtractfeature"> <cd:arguments> - <cd:keywords delimiters="braces"> + <cd:keywords delimiters="braces" list="yes"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-fea.mkvi" name="doreplacefeature"> + <cd:command category="fonts" file="font-fea.mkvi" level="system" name="doreplacefeature"> <cd:arguments> - <cd:keywords delimiters="braces"> + <cd:keywords delimiters="braces" list="yes"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-fea.mkvi" name="doresetandafffeature"> + <cd:command category="fonts" file="font-fea.mkvi" level="system" name="doresetandafffeature"> <cd:arguments> - <cd:keywords delimiters="braces"> + <cd:keywords delimiters="braces" list="yes"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-fil.mkvi" name="fontclass" type="environment"> + <cd:command category="fonts" file="font-fil.mkvi" level="system" name="fontclass" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="each"/> @@ -10777,7 +11611,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-fil.mkvi" name="classfont"> + <cd:command category="fonts" file="font-fil.mkvi" level="system" name="classfont"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -10787,7 +11621,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-fil.mkvi" name="definefontsynonym"> + <cd:command category="fonts" file="font-fil.mkvi" level="style" name="definefontsynonym"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -10812,7 +11646,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="font-fil.mkvi" name="definefontfile"> + <cd:command category="fonts" file="font-fil.mkvi" level="system" name="definefontfile"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -10837,14 +11671,14 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="font-fil.mkvi" name="truefontname"> + <cd:command category="fonts" file="font-fil.mkvi" level="system" name="truefontname"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:font"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-fil.mkvi" name="expandfontsynonym"> + <cd:command category="fonts" file="font-fil.mkvi" level="system" name="expandfontsynonym"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -10852,7 +11686,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-fil.mkvi" name="doifelsefontsynonym"> + <cd:command category="fonts conditional" file="font-fil.mkvi" level="system" name="doifelsefontsynonym"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -10865,7 +11699,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-fil.mkvi" name="doiffontsynonymelse"> + <cd:command category="fonts conditional" file="font-fil.mkvi" level="system" name="doiffontsynonymelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -10878,14 +11712,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-fil.mkvi" name="tracedfontname"> + <cd:command category="fonts" file="font-fil.mkvi" level="system" name="tracedfontname"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:font"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-fil.mkvi" name="fontclassname"> + <cd:command category="fonts" file="font-fil.mkvi" level="system" name="fontclassname"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -10895,37 +11729,37 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-gds.mkvi" name="loadfontgoodies"> + <cd:command category="fonts" file="font-gds.mkvi" level="style" name="loadfontgoodies"> <cd:arguments> <cd:keywords> <cd:constant type="cd:file"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-gds.mkvi" name="setfontcolorsheme"> + <cd:command category="fonts" file="font-gds.mkvi" level="style" name="setfontcolorsheme"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-gds.mkvi" name="resetfontcolorsheme"/> - <cd:command file="font-ini.mkvi" name="definedfont"> + <cd:command category="fonts" file="font-gds.mkvi" level="style" name="resetfontcolorsheme"/> + <cd:command category="fonts" file="font-ini.mkvi" level="style" name="definedfont"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:font"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-ini.mkvi" name="font" type="environment"> + <cd:command category="fonts" file="font-ini.mkvi" level="document" name="font" type="environment"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:font"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-ini.mkvi" name="bodyfontsize"/> - <cd:command file="font-ini.mkvi" name="normalizebodyfontsize"> + <cd:command category="fonts" file="font-ini.mkvi" level="system" name="bodyfontsize"/> + <cd:command category="fonts" file="font-ini.mkvi" level="system" name="normalizebodyfontsize"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -10933,14 +11767,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-ini.mkvi" name="thenormalizedbodyfontsize"> + <cd:command category="fonts" file="font-ini.mkvi" level="system" name="thenormalizedbodyfontsize"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:dimension"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-fil.mkvi" name="mapfontsize"> + <cd:command category="fonts" file="font-fil.mkvi" level="system" name="mapfontsize"> <cd:arguments> <cd:keywords> <cd:constant type="cd:dimension"/> @@ -10950,7 +11784,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-ini.mkvi" name="definefontstyle"> + <cd:command category="fonts" file="font-ini.mkvi" level="system" name="definefontstyle"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:name"/> @@ -10960,21 +11794,21 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-ini.mkvi" name="definefontsize"> + <cd:command category="fonts" file="font-ini.mkvi" level="system" name="definefontsize"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-ini.mkvi" name="definefontalternative"> + <cd:command category="fonts" file="font-ini.mkvi" level="system" name="definefontalternative"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-ini.mkvi" name="definefont"> + <cd:command category="fonts" file="font-ini.mkvi" level="style" name="definefont"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -10987,7 +11821,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="font-ini.mkvi" name="definefont" variant="argument"> + <cd:command category="fonts" file="font-ini.mkvi" level="style" name="definefont" variant="argument"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -11000,7 +11834,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-ini.mkvi" name="definefrozenfont"> + <cd:command category="fonts" file="font-ini.mkvi" level="system" name="definefrozenfont"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -11010,7 +11844,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-ini.mkvi" name="definebodyfontenvironment"> + <cd:command category="fonts" file="font-ini.mkvi" level="style" name="definebodyfontenvironment"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -11079,29 +11913,29 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="font-fil.mkvi" name="processbodyfontenvironmentlist"> + <cd:command category="fonts" file="font-fil.mkvi" level="system" name="processbodyfontenvironmentlist"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="font-fil.mkvi" name="bodyfontenvironmentlist"/> - <cd:command file="font-fil.mkvi" name="registerfontclass"> + <cd:command category="fonts" file="font-fil.mkvi" level="system" name="bodyfontenvironmentlist"/> + <cd:command category="fonts" file="font-fil.mkvi" level="system" name="registerfontclass"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-fil.mkvi" name="setcurrentfontclass"> + <cd:command category="fonts" file="font-fil.mkvi" level="system" name="setcurrentfontclass"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-ini.mkvi" name="tx"/> - <cd:command file="font-ini.mkvi" name="txx"/> - <cd:command file="font-fil.mkvi" name="definebodyfont"> + <cd:command category="fonts" file="font-ini.mkvi" level="document" name="tx"/> + <cd:command category="fonts" file="font-ini.mkvi" level="document" name="txx"/> + <cd:command category="fonts" file="font-fil.mkvi" level="style" name="definebodyfont"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -11161,7 +11995,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="font-fil.mkvi" name="definebodyfont" variant="argument"> + <cd:command category="fonts" file="font-fil.mkvi" level="style" name="definebodyfont" variant="argument"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -11183,7 +12017,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-ini.mkiv" name="setupfonts"> + <cd:command category="fonts" file="font-ini.mkiv" level="style" name="setupfonts"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="language"> @@ -11193,7 +12027,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="font-ini.mkiv" name="setupbodyfont"> + <cd:command category="fonts" file="font-ini.mkiv" level="style" name="setupbodyfont"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:dimension"/> @@ -11225,14 +12059,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-ini.mkvi" name="switchtobodyfont"> + <cd:command category="fonts" file="font-ini.mkvi" level="style" name="switchtobodyfont"> <cd:arguments> <cd:keywords list="yes"> <cd:inherit name="setupbodyfont"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-ini.mkiv" name="fastswitchtobodyfont"> + <cd:command category="fonts" file="font-ini.mkiv" level="system" name="fastswitchtobodyfont"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="x"/> @@ -11244,40 +12078,48 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-ini.mkvi" name="usebodyfont"> + <cd:command category="fonts" file="font-ini.mkvi" level="style" name="usebodyfont"> <cd:arguments> <cd:keywords list="yes"> <cd:inherit name="setupbodyfont"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-ini.mkvi" name="usebodyfontparameter"> + <cd:command category="fonts" file="font-ini.mkvi" level="system" name="usebodyfontparameter"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="font-ini.mkvi" name="fontchar"> + <cd:command category="fonts" file="font-ini.mkvi" level="style" name="fontchar"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-ini.mkvi" name="fontcharbyindex"> + <cd:command category="fonts" file="font-ini.mkvi" level="style" name="fontcharbyindex"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-ini.mkvi" name="tochar"> + <cd:command category="fonts" file="font-ini.mkvi" level="style" name="tochar"> <cd:arguments> <cd:keywords delimiters="braces"> - <cd:constant type="cd:name"/> + <cd:constant method="range" prefix="e" type="cd:name"/> + <cd:constant method="range" prefix="x" type="cd:number"/> + <cd:constant method="range" prefix="d" type="cd:number"/> + <cd:constant method="range" prefix="s" type="cd:number"/> + <cd:constant method="range" prefix="i" type="cd:number"/> + <cd:constant method="range" prefix="n" type="cd:name"/> + <cd:constant method="range" prefix="c" type="cd:name"/> + <cd:constant method="range" prefix="u" type="cd:name"/> + <cd:constant method="range" prefix="a" type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-ini.mkiv" name="switchstyleonly"> + <cd:command ategory="fonts" clevel="style" file="font-ini.mkiv" name="switchstyleonly"> <cd:arguments> <cd:keywords> <cd:constant type="rm"/> @@ -11299,12 +12141,12 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-ini.mkiv" name="switchstyleonly" variant="command"> + <cd:command category="fonts" file="font-ini.mkiv" level="style" name="switchstyleonly" variant="command"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="font-ini.mkvi" name="definebodyfontswitch"> + <cd:command category="fonts" file="font-ini.mkvi" level="style" name="definebodyfontswitch"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -11314,11 +12156,11 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-ini.mkvi" name="setsmallbodyfont"/> - <cd:command file="font-ini.mkvi" name="setbigbodyfont"/> - <cd:command file="font-ini.mkvi" name="setmainbodyfont"/> - <cd:command file="font-ini.mkvi" name="restoreglobalbodyfont"/> - <cd:command file="font-ini.mkvi" name="predefinefont"> + <cd:command category="fonts" file="font-ini.mkvi" level="style" name="setsmallbodyfont"/> + <cd:command category="fonts" file="font-ini.mkvi" level="style" name="setbigbodyfont"/> + <cd:command category="fonts" file="font-ini.mkvi" level="style" name="setmainbodyfont"/> + <cd:command category="fonts" file="font-ini.mkvi" level="style" name="restoreglobalbodyfont"/> + <cd:command category="fonts" file="font-ini.mkvi" level="system" name="predefinefont"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -11328,28 +12170,28 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-ini.mkvi" name="predefinedfont"> + <cd:command category="fonts" file="font-ini.mkvi" level="system" name="predefinedfont"> <cd:arguments> <cd:keywords> <cd:constant type="cd:font"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-run.mkiv" name="showbodyfont"> + <cd:command category="fonts" file="font-run.mkiv" level="document" name="showbodyfont"> <cd:arguments> <cd:keywords list="yes"> <cd:inherit name="setupbodyfont"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-run.mkiv" name="showbodyfontenvironment"> + <cd:command category="fonts" file="font-run.mkiv" level="document" name="showbodyfontenvironment"> <cd:arguments> <cd:keywords list="yes"> <cd:inherit name="setupbodyfont"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-run.mkiv" name="showfont"> + <cd:command category="fonts" file="font-run.mkiv" level="document" name="showfont"> <cd:arguments> <cd:keywords> <cd:constant type="cd:font"/> @@ -11359,7 +12201,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-run.mkiv" name="showfontstyle"> + <cd:command category="fonts" file="font-run.mkiv" level="document" name="showfontstyle"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:inherit name="setupbodyfont"/> @@ -11386,88 +12228,87 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-run.mkiv" name="showligature"> + <cd:command category="fonts" file="font-run.mkiv" level="document" name="showligature"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-run.mkiv" name="showligatures"> + <cd:command category="fonts" file="font-run.mkiv" level="document" name="showligatures"> <cd:arguments> <cd:keywords> <cd:constant type="cd:font"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-run.mkiv" name="showfontstrip"> + <cd:command category="fonts" file="font-run.mkiv" level="document" name="showfontstrip"> <cd:arguments> <cd:keywords list="yes"> <cd:inherit name="setupbodyfont"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-run.mkiv" name="showminimalbaseline"/> - <cd:command file="font-run.mkiv" name="showkerning"> + <cd:command category="fonts" file="font-run.mkiv" level="document" name="showminimalbaseline"/> + <cd:command category="fonts" file="font-run.mkiv" level="document" name="showkerning"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-run.mkiv" name="showcharratio"> + <cd:command category="fonts" file="font-run.mkiv" level="document" name="showcharratio"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-run.mkiv" name="showfontparameters"/> - <cd:command file="font-pre.mkiv" name="setsmallcaps"/> - <cd:command file="font-pre.mkiv" name="setoldstyle"/> - <cd:command file="font-pre.mkiv" name="settabular"/> - <cd:command file="font-pre.mkiv" name="setfractions"/> - <cd:command file="font-pre.mkiv" name="setsuperiors"/> - <cd:command file="font-pre.mkiv" name="tinyfont"/> - <cd:command file="font-pre.mkiv" name="infofont"/> - <cd:command file="font-pre.mkiv" name="infofontbold"/> - <cd:command file="font-pre.mkiv" name="smallbodyfont"/> - <cd:command file="font-pre.mkiv" name="bigbodyfont"/> - <cd:command file="font-pre.mkiv" name="smaller"/> - <cd:command file="font-pre.mkiv" name="bigger"/> - <cd:command file="font-pre.mkiv" name="normal"/> - <cd:command file="font-pre.mkiv" name="bold"/> - <cd:command file="font-pre.mkiv" name="mono"/> - <cd:command file="font-pre.mkiv" name="monobold"/> - <cd:command file="font-pre.mkiv" name="slanted"/> - <cd:command file="font-pre.mkiv" name="italic"/> - <cd:command file="font-pre.mkiv" name="boldslanted"/> - <cd:command file="font-pre.mkiv" name="slantedbold"/> - <cd:command file="font-pre.mkiv" name="bolditalic"/> - <cd:command file="font-pre.mkiv" name="italicbold"/> - <cd:command file="font-pre.mkiv" name="small"/> - <cd:command file="font-pre.mkiv" name="smallnormal"/> - <cd:command file="font-pre.mkiv" name="smallbold"/> - <cd:command file="font-pre.mkiv" name="smalltype"/> - <cd:command file="font-pre.mkiv" name="smallslanted"/> - <cd:command file="font-pre.mkiv" name="smallboldslanted"/> - <cd:command file="font-pre.mkiv" name="smallslantedbold"/> - <cd:command file="font-pre.mkiv" name="smallbolditalic"/> - <cd:command file="font-pre.mkiv" name="smallitalicbold"/> - <cd:command file="font-pre.mkiv" name="sans"/> - <cd:command file="font-pre.mkiv" name="sansserif"/> - <cd:command file="font-pre.mkiv" name="roman"/> - <cd:command file="font-pre.mkiv" name="serif"/> - <cd:command file="font-pre.mkiv" name="regular"/> - <cd:command file="font-pre.mkiv" name="handwritten"/> - <cd:command file="font-pre.mkiv" name="calligraphic"/> - <cd:command file="font-pre.mkiv" name="sansnormal"/> - <cd:command file="font-pre.mkiv" name="sansbold"/> - <cd:command file="font-pre.mkiv" name="serifnormal"/> - <cd:command file="font-pre.mkiv" name="serifbold"/> - <cd:command file="font-pre.mkiv" name="mononormal"/> - <cd:command file="font-pre.mkiv" name="monobold"/> - <cd:command file="font-sol.mkvi" name="definefontsolution"> + <cd:command category="fonts" file="font-run.mkiv" level="document" name="showfontparameters"/> + <cd:command category="fonts" file="font-pre.mkiv" level="style" name="setsmallcaps"/> + <cd:command category="fonts" file="font-pre.mkiv" level="style" name="setoldstyle"/> + <cd:command category="fonts" file="font-pre.mkiv" level="style" name="settabular"/> + <cd:command category="fonts" file="font-pre.mkiv" level="style" name="setsuperiors"/> + <cd:command category="fonts" file="font-pre.mkiv" level="style" name="tinyfont"/> + <cd:command category="fonts" file="font-pre.mkiv" level="style" name="infofont"/> + <cd:command category="fonts" file="font-pre.mkiv" level="style" name="infofontbold"/> + <cd:command category="fonts" file="font-pre.mkiv" level="style" name="smallbodyfont"/> + <cd:command category="fonts" file="font-pre.mkiv" level="style" name="bigbodyfont"/> + <cd:command category="fonts" file="font-pre.mkiv" level="style" name="smaller"/> + <cd:command category="fonts" file="font-pre.mkiv" level="style" name="bigger"/> + <cd:command category="fonts" file="font-pre.mkiv" level="document" name="normal"/> + <cd:command category="fonts" file="font-pre.mkiv" level="document" name="bold"/> + <cd:command category="fonts" file="font-pre.mkiv" level="document" name="mono"/> + <cd:command category="fonts" file="font-pre.mkiv" level="document" name="monobold"/> + <cd:command category="fonts" file="font-pre.mkiv" level="document" name="slanted"/> + <cd:command category="fonts" file="font-pre.mkiv" level="document" name="italic"/> + <cd:command category="fonts" file="font-pre.mkiv" level="document" name="boldslanted"/> + <cd:command category="fonts" file="font-pre.mkiv" level="document" name="slantedbold"/> + <cd:command category="fonts" file="font-pre.mkiv" level="document" name="bolditalic"/> + <cd:command category="fonts" file="font-pre.mkiv" level="document" name="italicbold"/> + <cd:command category="fonts" file="font-pre.mkiv" level="document" name="small"/> + <cd:command category="fonts" file="font-pre.mkiv" level="document" name="smallnormal"/> + <cd:command category="fonts" file="font-pre.mkiv" level="document" name="smallbold"/> + <cd:command category="fonts" file="font-pre.mkiv" level="document" name="smalltype"/> + <cd:command category="fonts" file="font-pre.mkiv" level="document" name="smallslanted"/> + <cd:command category="fonts" file="font-pre.mkiv" level="document" name="smallboldslanted"/> + <cd:command category="fonts" file="font-pre.mkiv" level="document" name="smallslantedbold"/> + <cd:command category="fonts" file="font-pre.mkiv" level="document" name="smallbolditalic"/> + <cd:command category="fonts" file="font-pre.mkiv" level="document" name="smallitalicbold"/> + <cd:command category="fonts" file="font-pre.mkiv" level="document" name="sans"/> + <cd:command category="fonts" file="font-pre.mkiv" level="document" name="sansserif"/> + <cd:command category="fonts" file="font-pre.mkiv" level="document" name="roman"/> + <cd:command category="fonts" file="font-pre.mkiv" level="document" name="serif"/> + <cd:command category="fonts" file="font-pre.mkiv" level="document" name="regular"/> + <cd:command category="fonts" file="font-pre.mkiv" level="document" name="handwritten"/> + <cd:command category="fonts" file="font-pre.mkiv" level="document" name="calligraphic"/> + <cd:command category="fonts" file="font-pre.mkiv" level="document" name="sansnormal"/> + <cd:command category="fonts" file="font-pre.mkiv" level="document" name="sansbold"/> + <cd:command category="fonts" file="font-pre.mkiv" level="document" name="serifnormal"/> + <cd:command category="fonts" file="font-pre.mkiv" level="document" name="serifbold"/> + <cd:command category="fonts" file="font-pre.mkiv" level="document" name="mononormal"/> + <cd:command category="fonts" file="font-pre.mkiv" level="document" name="monobold"/> + <cd:command category="fonts" file="font-sol.mkvi" level="style" name="definefontsolution"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -11480,7 +12321,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="font-sol.mkvi" name="setupfontsolution"> + <cd:command category="fonts" file="font-sol.mkvi" level="style" name="setupfontsolution"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -11511,22 +12352,22 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="font-sol.mkvi" name="setfontsolution"> + <cd:command category="fonts" file="font-sol.mkvi" level="style" name="setfontsolution"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-sol.mkvi" name="resetfontsolution"/> - <cd:command file="font-sol.mkvi" name="fontsolution" type="environment"> + <cd:command category="fonts" file="font-sol.mkvi" level="style" name="resetfontsolution"/> + <cd:command category="fonts" file="font-sol.mkvi" level="style" name="fontsolution" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-sty.mkvi" name="definealternativestyle"> + <cd:command category="fonts" file="font-sty.mkvi" level="style" name="definealternativestyle"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:name"/> @@ -11539,16 +12380,26 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-sty.mkvi" name="applyalternativestyle"> + <cd:command category="fonts" file="font-sty.mkvi" level="system" name="applyalternativestyle"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-sty.mkvi" name="dontconvertfont"/> - <cd:command file="font-sty.mkvi" name="redoconvertfont"/> - <cd:command file="font-sty.mkvi" name="definestyle"> + <cd:command category="fonts" file="font-sty.mkvi" level="style" name="setupalternativestyles"> + <cd:arguments> + <cd:assignments list="yes"> + <cd:parameter name="method"> + <cd:constant default="yes" type="normal"/> + <cd:constant type="auto"/> + </cd:parameter> + </cd:assignments> + </cd:arguments> + </cd:command> + <cd:command category="fonts" file="font-sty.mkvi" level="system" name="dontconvertfont"/> + <cd:command category="fonts" file="font-sty.mkvi" level="system" name="redoconvertfont"/> + <cd:command category="fonts" file="font-sty.mkvi" level="style" name="definestyle"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -11561,7 +12412,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="font-sty.mkvi" name="setupstyle"> + <cd:command category="fonts" file="font-sty.mkvi" level="style" name="setupstyle"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -11580,14 +12431,14 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="font-sty.mkvi" generated="yes" name="style" type="environment" variant="example"> + <cd:command category="fonts" file="font-sty.mkvi" generated="yes" level="document" name="style" type="environment" variant="instance"> <cd:sequence> - <cd:variable value="style"/> + <cd:instance value="style"/> </cd:sequence> </cd:command> - <cd:command file="font-sty.mkvi" generated="yes" name="style" variant="example"> + <cd:command category="fonts" file="font-sty.mkvi" generated="yes" level="document" name="style" variant="instance"> <cd:sequence> - <cd:variable value="style"/> + <cd:instance value="style"/> </cd:sequence> <cd:arguments> <cd:keywords delimiters="braces"> @@ -11595,7 +12446,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-sty.mkvi" name="style" type="environment" variant="argument"> + <cd:command category="fonts" file="font-sty.mkvi" level="document" name="style" type="environment" variant="argument"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -11603,14 +12454,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-sty.mkvi" name="style" type="environment"> + <cd:command category="fonts" file="font-sty.mkvi" level="document" name="style" type="environment"> <cd:arguments> <cd:assignments list="yes"> <cd:inherit name="setupstyle"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="font-sty.mkvi" name="style" variant="argument"> + <cd:command category="fonts" file="font-sty.mkvi" level="document" name="style" variant="argument"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -11621,7 +12472,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-sty.mkvi" name="style"> + <cd:command category="fonts" file="font-sty.mkvi" level="document" name="style"> <cd:arguments> <cd:assignments list="yes"> <cd:inherit name="setupstyle"/> @@ -11631,7 +12482,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-sty.mkvi" name="definestyleinstance"> + <cd:command category="fonts" file="font-sty.mkvi" level="style" name="definestyleinstance"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -11658,14 +12509,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-sty.mkvi" name="styleinstance"> + <cd:command category="fonts" file="font-sty.mkvi" level="style" name="styleinstance"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-sym.mkvi" name="doifelseitalic"> + <cd:command category="fonts conditional" file="font-sym.mkvi" level="system" name="doifelseitalic"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:true"/> @@ -11675,7 +12526,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-sym.mkvi" name="doifitalicelse"> + <cd:command category="fonts conditional" file="font-sym.mkvi" level="system" name="doifitalicelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:true"/> @@ -11685,28 +12536,28 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-ini.mkvi" name="getprivateslot"> + <cd:command category="fonts" file="font-ini.mkvi" level="system" name="getprivateslot"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-ini.mkvi" name="getprivatechar"> + <cd:command category="fonts" file="font-ini.mkvi" level="system" name="getprivatechar"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-sym.mkvi" name="glyphfontfile"> + <cd:command category="fonts" file="font-sym.mkvi" level="style" name="glyphfontfile"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:font"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-sym.mkvi" name="getnamedglyphstyled"> + <cd:command category="fonts" file="font-sym.mkvi" level="style" name="getnamedglyphstyled"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:font"/> @@ -11716,7 +12567,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-sym.mkvi" name="getnamedglyphdirect"> + <cd:command category="fonts" file="font-sym.mkvi" level="style" name="getnamedglyphdirect"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:font"/> @@ -11726,7 +12577,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-sym.mkvi" name="getglyphstyled"> + <cd:command category="fonts" file="font-sym.mkvi" level="style" name="getglyphstyled"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:font"/> @@ -11737,7 +12588,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-sym.mkvi" name="getglyphdirect"> + <cd:command category="fonts" file="font-sym.mkvi" level="style" name="getglyphdirect"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:font"/> @@ -11748,34 +12599,50 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-sym.mkvi" name="resolvedglyphstyled"> + <cd:command category="fonts" file="font-sym.mkvi" level="style" name="resolvedglyphstyled"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:font"/> </cd:keywords> <cd:keywords delimiters="braces"> - <cd:constant type="cd:text"/> + <cd:constant method="range" prefix="e" type="cd:name"/> + <cd:constant method="range" prefix="x" type="cd:number"/> + <cd:constant method="range" prefix="d" type="cd:number"/> + <cd:constant method="range" prefix="s" type="cd:number"/> + <cd:constant method="range" prefix="i" type="cd:number"/> + <cd:constant method="range" prefix="n" type="cd:name"/> + <cd:constant method="range" prefix="c" type="cd:name"/> + <cd:constant method="range" prefix="u" type="cd:name"/> + <cd:constant method="range" prefix="a" type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-sym.mkvi" name="resolvedglyphdirect"> + <cd:command category="fonts" file="font-sym.mkvi" level="style" name="resolvedglyphdirect"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:font"/> </cd:keywords> <cd:keywords delimiters="braces"> - <cd:constant type="cd:text"/> + <cd:constant method="range" prefix="e" type="cd:name"/> + <cd:constant method="range" prefix="x" type="cd:number"/> + <cd:constant method="range" prefix="d" type="cd:number"/> + <cd:constant method="range" prefix="s" type="cd:number"/> + <cd:constant method="range" prefix="i" type="cd:number"/> + <cd:constant method="range" prefix="n" type="cd:name"/> + <cd:constant method="range" prefix="c" type="cd:name"/> + <cd:constant method="range" prefix="u" type="cd:name"/> + <cd:constant method="range" prefix="a" type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-sym.mkvi" name="setfont"> + <cd:command category="fonts" file="font-sym.mkvi" level="system" name="setfont"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:font"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-sym.mkvi" name="doifelsefontchar"> + <cd:command category="fonts conditional" file="font-sym.mkvi" level="system" name="doifelsefontchar"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:font"/> @@ -11791,7 +12658,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-sym.mkvi" name="doiffontcharelse"> + <cd:command category="fonts conditional" file="font-sym.mkvi" level="system" name="doiffontcharelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:font"/> @@ -11807,15 +12674,15 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-tra.mkiv" name="showchardata"> + <cd:command category="fonts" file="font-tra.mkiv" level="document" name="showchardata"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-tra.mkiv" name="showfontdata"/> - <cd:command file="font-tra.mkiv" name="doifelsefontpresent"> + <cd:command category="fonts" file="font-tra.mkiv" level="document" name="showfontdata"/> + <cd:command category="fonts conditional" file="font-tra.mkiv" level="system" name="doifelsefontpresent"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:font"/> @@ -11828,7 +12695,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-tra.mkiv" name="doiffontpresentelse"> + <cd:command category="fonts conditional" file="font-tra.mkiv" level="system" name="doiffontpresentelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:font"/> @@ -11841,7 +12708,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-tra.mkiv" name="showotfcomposition"> + <cd:command category="fonts" file="font-tra.mkiv" level="document" name="showotfcomposition"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:font"/> @@ -11858,23 +12725,23 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="font-var.mkvi" name="fontclass"/> - <cd:command file="font-var.mkvi" name="fontbody"/> - <cd:command file="font-var.mkvi" name="fontstyle"/> - <cd:command file="font-var.mkvi" name="fontalternative"/> - <cd:command file="font-var.mkvi" name="fontsize"/> - <cd:command file="font-var.mkvi" name="fontface"/> - <cd:command file="type-ini.mkvi" name="typescriptone"/> - <cd:command file="type-ini.mkvi" name="typescripttwo"/> - <cd:command file="type-ini.mkvi" name="typescriptthree"/> - <cd:command file="type-ini.mkvi" name="typescriptcollection" type="environment"> + <cd:command category="fonts" file="font-var.mkvi" level="system" name="fontclass"/> + <cd:command category="fonts" file="font-var.mkvi" level="system" name="fontbody"/> + <cd:command category="fonts" file="font-var.mkvi" level="system" name="fontstyle"/> + <cd:command category="fonts" file="font-var.mkvi" level="system" name="fontalternative"/> + <cd:command category="fonts" file="font-var.mkvi" level="system" name="fontsize"/> + <cd:command category="fonts" file="font-var.mkvi" level="system" name="fontface"/> + <cd:command category="fonts" file="type-ini.mkvi" level="system" name="typescriptone"/> + <cd:command category="fonts" file="type-ini.mkvi" level="system" name="typescripttwo"/> + <cd:command category="fonts" file="type-ini.mkvi" level="system" name="typescriptthree"/> + <cd:command category="fonts" file="type-ini.mkvi" level="style" name="typescriptcollection" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="type-ini.mkvi" name="usetypescriptfile"> + <cd:command category="fonts" file="type-ini.mkvi" level="style" name="usetypescriptfile"> <cd:arguments> <cd:keywords> <cd:constant type="reset"/> @@ -11882,7 +12749,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="type-ini.mkvi" name="usetypescript"> + <cd:command category="fonts" file="type-ini.mkvi" level="style" name="usetypescript"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="serif"/> @@ -11907,15 +12774,15 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="type-ini.mkvi" name="loadtypescriptfile"> + <cd:command category="fonts" file="type-ini.mkvi" level="style" name="loadtypescriptfile"> <cd:arguments> <cd:keywords> <cd:constant type="cd:file"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="type-ini.mkvi" name="quittypescriptscanning"/> - <cd:command file="type-ini.mkvi" name="definetypescriptsynonym"> + <cd:command category="fonts" file="type-ini.mkvi" level="style" name="quittypescriptscanning"/> + <cd:command category="fonts" file="type-ini.mkvi" level="system" name="definetypescriptsynonym"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -11925,7 +12792,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="type-ini.mkvi" name="typescript" type="environment"> + <cd:command category="fonts" file="type-ini.mkvi" level="style" name="typescript" type="environment"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="serif"/> @@ -11944,7 +12811,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="type-ini.mkvi" name="definetypescriptprefix"> + <cd:command category="fonts" file="type-ini.mkvi" level="system" name="definetypescriptprefix"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -11954,14 +12821,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="type-ini.mkvi" name="typescriptprefix"> + <cd:command category="fonts" file="type-ini.mkvi" level="system" name="typescriptprefix"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="type-ini.mkvi" name="definetypeface"> + <cd:command category="fonts" file="type-ini.mkvi" level="style" name="definetypeface"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -12013,7 +12880,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="hand-ini.mkiv" name="setupfontexpansion"> + <cd:command category="fonts" file="hand-ini.mkiv" level="style" name="setupfontexpansion"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -12037,7 +12904,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="hand-ini.mkiv" name="setupfontprotrusion"> + <cd:command category="fonts" file="hand-ini.mkiv" level="style" name="setupfontprotrusion"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -12058,16 +12925,23 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="font-fea.mkiv" name="blockligatures"> + <cd:command category="fonts" file="font-fea.mkvi" level="style" name="blockligatures"> <cd:arguments> - <cd:keywords> - <cd:constant type="cd:list"/> + <cd:keywords list="yes"> + <cd:constant type="cd:text"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command category="fonts" file="font-ini.mkvi" level="style" name="addfontpath"> + <cd:arguments> + <cd:keywords list="yes"> + <cd:constant type="cd:path"/> </cd:keywords> </cd:arguments> </cd:command> </cd:interface> <cd:interface file="i-form.xml"> - <cd:command file="scrn-fld.mkvi" name="setupforms"> + <cd:command category="pdf" file="scrn-fld.mkvi" level="style" name="setupforms"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="method"> @@ -12084,7 +12958,7 @@ </cd:command> </cd:interface> <cd:interface file="i-formula.xml"> - <cd:command file="math-for.mkiv" name="defineformula"> + <cd:command category="mathematics" file="math-for.mkiv" level="style" name="defineformula"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -12097,7 +12971,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="math-for.mkiv" name="setupformula"> + <cd:command category="mathematics" file="math-for.mkiv" level="style" name="setupformula"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -12116,6 +12990,11 @@ <cd:constant type="flushright"/> <cd:constant type="normal"/> </cd:parameter> + <cd:parameter name="split"> + <cd:constant type="yes"/> + <cd:constant default="yes" type="no"/> + <cd:constant type="page"/> + </cd:parameter> <cd:parameter name="strut"> <cd:constant type="yes"/> <cd:constant default="yes" type="no"/> @@ -12153,6 +13032,11 @@ <cd:constant type="tight"/> <cd:constant type="middle"/> <cd:constant type="frame"/> + <cd:constant type="depth"/> + <cd:constant type="line"/> + <cd:constant type="halfline"/> + <cd:constant method="none" prefix="-" type="line"/> + <cd:constant method="none" prefix="-" type="halfline"/> <cd:inherit name="setupbodyfont"/> </cd:parameter> <cd:parameter name="margin"> @@ -12181,11 +13065,41 @@ <cd:parameter name="frame"> <cd:constant type="number"/> </cd:parameter> + <cd:parameter name="hang"> + <cd:constant default="yes" type="none"/> + <cd:constant type="auto"/> + </cd:parameter> + <cd:parameter name="expansion"> + <cd:constant type="yes"/> + <cd:constant default="yes" type="no"/> + <cd:constant type="xml"/> + </cd:parameter> + <cd:parameter name="referenceprefix"> + <cd:constant type="+"/> + <cd:constant type="-"/> + <cd:constant type="cd:text"/> + </cd:parameter> + <cd:parameter name="xmlsetup"> + <cd:constant type="cd:name"/> + </cd:parameter> + <cd:parameter name="catcodes"> + <cd:constant type="cd:name"/> + </cd:parameter> <cd:inherit name="setupcounter"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="math-for.mkiv" name="definesubformula"> + <cd:command category="mathematics" file="math-for.mkiv" level="style" name="setupformulas"> + <cd:arguments> + <cd:keywords list="yes" optional="yes"> + <cd:constant type="cd:name"/> + </cd:keywords> + <cd:assignments list="yes"> + <cd:inherit name="setupformula"/> + </cd:assignments> + </cd:arguments> + </cd:command> + <cd:command category="mathematics" file="math-for.mkiv" level="style" name="definesubformula"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -12198,7 +13112,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="math-for.mkiv" name="setupsubformula"> + <cd:command category="mathematics" file="math-for.mkiv" level="style" name="setupsubformula"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -12212,9 +13126,19 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-mat.mkiv" generated="yes" name="formula" type="environment" variant="example"> + <cd:command category="mathematics" file="math-for.mkiv" level="style" name="setupsubformulas"> + <cd:arguments> + <cd:keywords list="yes" optional="yes"> + <cd:constant type="cd:name"/> + </cd:keywords> + <cd:assignments list="yes"> + <cd:inherit name="setupsubformula"/> + </cd:assignments> + </cd:arguments> + </cd:command> + <cd:command category="mathematics" file="strc-mat.mkiv" generated="yes" level="document" name="formula" type="environment" variant="instance"> <cd:sequence> - <cd:variable value="formula"/> + <cd:instance value="formula"/> <cd:string value="formula"/> </cd:sequence> <cd:arguments> @@ -12223,6 +13147,11 @@ <cd:constant type="tight"/> <cd:constant type="middle"/> <cd:constant type="frame"/> + <cd:constant type="depth"/> + <cd:constant type="line"/> + <cd:constant type="halfline"/> + <cd:constant method="none" prefix="-" type="line"/> + <cd:constant method="none" prefix="-" type="halfline"/> <cd:inherit name="setupbodyfont"/> </cd:keywords> </cd:arguments> @@ -12233,62 +13162,50 @@ <cd:constant value="md"/> </cd:instances> </cd:command> - <cd:command file="strc-mat.mkiv" name="formula" type="environment"> - <cd:arguments> - <cd:keywords list="yes" optional="yes"> - <cd:constant type="packed"/> - <cd:constant type="tight"/> - <cd:constant type="middle"/> - <cd:constant type="frame"/> - <cd:inherit name="setupbodyfont"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="strc-mat.mkiv" name="spformula" type="environment"> - <cd:arguments> - <cd:keywords list="yes" optional="yes"> - <cd:constant type="packed"/> - <cd:constant type="tight"/> - <cd:constant type="middle"/> - <cd:constant type="frame"/> - <cd:inherit name="setupbodyfont"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="strc-mat.mkiv" name="sdformula" type="environment"> - <cd:arguments> - <cd:keywords list="yes" optional="yes"> - <cd:constant type="packed"/> - <cd:constant type="tight"/> - <cd:constant type="middle"/> - <cd:constant type="frame"/> - <cd:inherit name="setupbodyfont"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="strc-mat.mkiv" name="mpformula" type="environment"> + <cd:command category="mathematics" file="strc-mat.mkiv" level="document" name="formula" type="environment"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="packed"/> <cd:constant type="tight"/> <cd:constant type="middle"/> <cd:constant type="frame"/> + <cd:constant type="depth"/> + <cd:constant type="line"/> + <cd:constant type="halfline"/> + <cd:constant method="none" prefix="-" type="line"/> + <cd:constant method="none" prefix="-" type="halfline"/> <cd:inherit name="setupbodyfont"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-mat.mkiv" name="mdformula" type="environment"> + <cd:command category="mathematics" file="strc-mat.mkiv" level="document" name="formula" type="environment" variant="assignment"> <cd:arguments> - <cd:keywords list="yes" optional="yes"> - <cd:constant type="packed"/> - <cd:constant type="tight"/> - <cd:constant type="middle"/> - <cd:constant type="frame"/> - <cd:inherit name="setupbodyfont"/> - </cd:keywords> + <cd:assignments list="yes" optional="yes"> + <cd:parameter name="option"> + <cd:constant type="packed"/> + <cd:constant type="tight"/> + <cd:constant type="middle"/> + <cd:constant type="frame"/> + <cd:constant type="depth"/> + <cd:constant type="line"/> + <cd:constant type="halfline"/> + <cd:constant method="none" prefix="-" type="line"/> + <cd:constant method="none" prefix="-" type="halfline"/> + <cd:inherit name="setupbodyfont"/> + </cd:parameter> + <cd:parameter name="margin"> + <cd:constant type="yes"/> + <cd:constant type="no"/> + <cd:constant type="standard"/> + <cd:constant type="cd:dimension"/> + </cd:parameter> + <cd:parameter name="grid"> + <cd:inherit name="snaptogrid"/> + </cd:parameter> + </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-mat.mkiv" name="defineformulaalternative"> + <cd:command category="mathematics" file="strc-mat.mkiv" level="system" name="defineformulaalternative"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -12301,20 +13218,25 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-mat.mkiv" name="formula"> + <cd:command category="mathematics" file="strc-mat.mkiv" level="document" name="formula"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="packed"/> <cd:constant type="tight"/> <cd:constant type="middle"/> <cd:constant type="frame"/> + <cd:constant type="depth"/> + <cd:constant type="line"/> + <cd:constant type="halfline"/> + <cd:constant method="none" prefix="-" type="line"/> + <cd:constant method="none" prefix="-" type="halfline"/> <cd:inherit name="setupbodyfont"/> </cd:keywords> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="strc-mat.mkiv" name="displaymath" type="environment"/> - <cd:command file="strc-mat.mkiv" name="formulas" type="environment"> + <cd:command category="mathematics" file="strc-mat.mkiv" level="system" name="displaymath" type="environment"/> + <cd:command category="mathematics" file="strc-mat.mkiv" level="document" name="formulas" type="environment"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="+"/> @@ -12323,7 +13245,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-mat.mkiv" name="subformulas" type="environment"> + <cd:command category="mathematics" file="strc-mat.mkiv" level="document" name="subformulas" type="environment"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="+"/> @@ -12332,7 +13254,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-mat.mkiv" name="namedsubformulas" type="environment"> + <cd:command category="mathematics" file="strc-mat.mkiv" level="document" name="namedsubformulas" type="environment"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="+"/> @@ -12344,7 +13266,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-mat.mkiv" name="placeformula"> + <cd:command category="mathematics" file="strc-mat.mkiv" level="document" name="placeformula"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="+"/> @@ -12353,7 +13275,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-mat.mkiv" name="placeformula" type="environment"> + <cd:command category="mathematics" file="strc-mat.mkiv" level="document" name="placeformula" type="environment"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="title"> @@ -12370,7 +13292,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-mat.mkiv" name="placeformula" type="environment" variant="argument"> + <cd:command category="mathematics" file="strc-mat.mkiv" level="document" name="placeformula" type="environment" variant="argument"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="+"/> @@ -12379,7 +13301,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-mat.mkiv" name="placenamedformula"> + <cd:command category="mathematics" file="strc-mat.mkiv" level="document" name="placenamedformula"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="+"/> @@ -12391,7 +13313,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-mat.mkiv" name="placesubformula"> + <cd:command category="mathematics" file="strc-mat.mkiv" level="document" name="placesubformula"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="+"/> @@ -12400,17 +13322,20 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-mat" name="formulanumber"> + <cd:command category="mathematics" file="strc-mat" level="document" name="formulanumber"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:reference"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-mat" name="placecurrentformulanumber"/> + <cd:command category="mathematics" file="strc-mat" level="system" name="placecurrentformulanumber"/> + <cd:command category="mathematics" file="strc-mat" level="document" name="alignhere" scope="formula"/> + <cd:command category="mathematics" file="strc-mat" level="document" name="breakhere" scope="formula"/> + <cd:command category="mathematics" file="strc-mat.mkiv" level="document" name="splitformula" type="environment"/> </cd:interface> <cd:interface file="i-fraction.xml"> - <cd:command file="math-frc.mkiv" name="definemathfraction"> + <cd:command category="mathematics" file="math-frc.mkiv" level="style" name="definemathfraction"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -12423,7 +13348,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="math-frc.mkiv" name="setupmathfraction"> + <cd:command category="mathematics" file="math-frc.mkiv" level="style" name="setupmathfraction"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -12475,12 +13400,33 @@ <cd:constant default="yes" type="none"/> <cd:constant type="overlay"/> </cd:parameter> + <cd:parameter name="inlinethreshold"> + <cd:constant type="auto"/> + <cd:constant type="cd:number"/> + </cd:parameter> + <cd:parameter name="displaythreshold"> + <cd:constant type="auto"/> + <cd:constant type="cd:number"/> + </cd:parameter> + <cd:parameter name="fences"> + <cd:constant type="cd:name"/> + </cd:parameter> + </cd:assignments> + </cd:arguments> + </cd:command> + <cd:command category="mathematics" file="math-frc.mkiv" level="style" name="setupmathfractions"> + <cd:arguments> + <cd:keywords list="yes" optional="yes"> + <cd:constant type="cd:name"/> + </cd:keywords> + <cd:assignments list="yes"> + <cd:inherit name="setupmathfraction"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="math-frc.mkiv" generated="yes" name="fraction" variant="example"> + <cd:command category="mathematics" file="math-frc.mkiv" generated="yes" level="document" name="fraction" variant="instance"> <cd:sequence> - <cd:variable value="fraction"/> + <cd:instance value="fraction"/> </cd:sequence> <cd:arguments> <cd:content/> @@ -12497,73 +13443,19 @@ <cd:constant value="tbinom"/> </cd:instances> </cd:command> - <cd:command file="math-frc.mkiv" name="frac"> - <cd:arguments> - <cd:content/> - <cd:content/> - </cd:arguments> - </cd:command> - <cd:command file="math-frc.mkiv" name="xfrac"> + <cd:command category="mathematics" file="math-frc.mkiv" level="document" name="splitfrac"> <cd:arguments> <cd:content/> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="math-frc.mkiv" name="xxfrac"> + <cd:command category="mathematics" file="math-frc.mkiv" level="document" name="splitdfrac"> <cd:arguments> <cd:content/> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="math-frc.mkiv" name="tfrac"> - <cd:arguments> - <cd:content/> - <cd:content/> - </cd:arguments> - </cd:command> - <cd:command file="math-frc.mkiv" name="sfrac"> - <cd:arguments> - <cd:content/> - <cd:content/> - </cd:arguments> - </cd:command> - <cd:command file="math-frc.mkiv" name="dfrac"> - <cd:arguments> - <cd:content/> - <cd:content/> - </cd:arguments> - </cd:command> - <cd:command file="math-frc.mkiv" name="binom"> - <cd:arguments> - <cd:content/> - <cd:content/> - </cd:arguments> - </cd:command> - <cd:command file="math-frc.mkiv" name="dbinom"> - <cd:arguments> - <cd:content/> - <cd:content/> - </cd:arguments> - </cd:command> - <cd:command file="math-frc.mkiv" name="tbinom"> - <cd:arguments> - <cd:content/> - <cd:content/> - </cd:arguments> - </cd:command> - <cd:command file="math-frc.mkiv" name="splitfrac"> - <cd:arguments> - <cd:content/> - <cd:content/> - </cd:arguments> - </cd:command> - <cd:command file="math-frc.mkiv" name="splitdfrac"> - <cd:arguments> - <cd:content/> - <cd:content/> - </cd:arguments> - </cd:command> - <cd:command file="math-frc.mkiv" name="cfrac"> + <cd:command category="mathematics" file="math-frc.mkiv" level="document" name="cfrac"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="l"/> @@ -12585,7 +13477,7 @@ </cd:command> </cd:interface> <cd:interface file="i-framed.xml"> - <cd:command file="pack-rul.mkiv" name="defineframed"> + <cd:command category="background rules" file="pack-rul.mkiv" level="style" name="defineframed"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -12598,7 +13490,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="pack-rul.mkiv" name="setupframed"> + <cd:command category="background rules" file="pack-rul.mkiv" level="style" name="setupframed"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -12794,21 +13686,21 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="pack-rul.mkiv" name="frameddimension"> + <cd:command category="background rules" file="pack-rul.mkiv" level="system" name="frameddimension"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:key"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="pack-rul.mkiv" name="framedparameter"> + <cd:command category="background rules" file="pack-rul.mkiv" level="system" name="framedparameter"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:key"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="pack-rul.mkiv" name="framed"> + <cd:command category="background rules" file="pack-rul.mkiv" level="document" name="framed"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupframed"/> @@ -12816,9 +13708,9 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="pack-rul.mkiv" generated="yes" name="framed" variant="example"> + <cd:command category="background rules" file="pack-rul.mkiv" generated="yes" level="document" name="framed" variant="instance"> <cd:sequence> - <cd:variable value="framed"/> + <cd:instance value="framed"/> </cd:sequence> <cd:arguments> <cd:assignments list="yes" optional="yes"> @@ -12831,7 +13723,7 @@ <cd:constant value="fitfieldframed"/> </cd:instances> </cd:command> - <cd:command file="pack-rul.mkiv" name="normalframedwithsettings"> + <cd:command category="background rules" file="pack-rul.mkiv" level="system" name="normalframedwithsettings"> <cd:arguments> <cd:assignments list="yes"> <cd:inherit name="setupframed"/> @@ -12839,7 +13731,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="pack-rul.mkiv" name="framed" type="environment"> + <cd:command category="background rules" file="pack-rul.mkiv" level="document" name="framed" type="environment"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -12849,7 +13741,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="pack-rul.mkiv" name="fastlocalframed"> + <cd:command category="background rules" file="pack-rul.mkiv" level="system" name="fastlocalframed"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -12860,7 +13752,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="pack-rul.mkiv" name="localframed"> + <cd:command category="background rules" file="pack-rul.mkiv" level="system" name="localframed"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -12871,7 +13763,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="pack-rul.mkiv" name="directlocalframed"> + <cd:command category="background rules" file="pack-rul.mkiv" level="system" name="directlocalframed"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -12879,7 +13771,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="pack-rul.mkiv" name="localframedwithsettings"> + <cd:command category="background rules" file="pack-rul.mkiv" level="system" name="localframedwithsettings"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -12890,7 +13782,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="pack-rul.mkiv" name="placeframed"> + <cd:command category="background rules" file="pack-rul.mkiv" level="document" name="placeframed"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -12901,15 +13793,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="pack-rul.mkiv" name="inframed"> - <cd:arguments> - <cd:assignments list="yes" optional="yes"> - <cd:inherit name="setupframed"/> - </cd:assignments> - <cd:content/> - </cd:arguments> - </cd:command> - <cd:command file="pack-rul.mkiv" name="unframed"> + <cd:command category="background rules" file="pack-rul.mkiv" level="document" name="inframed"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupframed"/> @@ -12917,7 +13801,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="pack-rul.mkiv" name="definemathframed"> + <cd:command category="background rules mathematics" file="pack-rul.mkiv" level="style" name="definemathframed"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -12930,7 +13814,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="pack-rul.mkiv" name="setupmathframed"> + <cd:command category="background rules mathematics" file="pack-rul.mkiv" level="style" name="setupmathframed"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -12940,9 +13824,9 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="pack-rul.mkiv" generated="yes" name="mathframed" variant="example"> + <cd:command category="background rules mathematics" file="pack-rul.mkiv" generated="yes" level="document" name="mathframed" variant="instance"> <cd:sequence> - <cd:variable value="mathframed"/> + <cd:instance value="mathframed"/> </cd:sequence> <cd:arguments> <cd:assignments list="yes" optional="yes"> @@ -12956,31 +13840,7 @@ <cd:constant value="mcframed"/> </cd:instances> </cd:command> - <cd:command file="pack-rul.mkiv" name="mframed"> - <cd:arguments> - <cd:assignments list="yes" optional="yes"> - <cd:inherit name="setupmathframed"/> - </cd:assignments> - <cd:content/> - </cd:arguments> - </cd:command> - <cd:command file="pack-rul.mkiv" name="inmframed"> - <cd:arguments> - <cd:assignments list="yes" optional="yes"> - <cd:inherit name="setupmathframed"/> - </cd:assignments> - <cd:content/> - </cd:arguments> - </cd:command> - <cd:command file="pack-rul.mkiv" name="mcframed"> - <cd:arguments> - <cd:assignments list="yes" optional="yes"> - <cd:inherit name="setupmathframed"/> - </cd:assignments> - <cd:content/> - </cd:arguments> - </cd:command> - <cd:command file="math-for.mkiv" name="defineformulaframed"> + <cd:command category="background rules mathematics" file="math-for.mkiv" level="style" name="defineformulaframed"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -12993,7 +13853,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="math-for.mkiv" name="setupformulaframed"> + <cd:command category="background rules mathematics" file="math-for.mkiv" level="style" name="setupformulaframed"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -13003,7 +13863,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="pack-rul.mkiv" name="defineframedtext"> + <cd:command category="background rules" file="pack-rul.mkiv" level="style" name="defineframedtext"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -13016,7 +13876,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="pack-rul.mkiv" name="setupframedtext"> + <cd:command category="background rules" file="pack-rul.mkiv" level="style" name="setupframedtext"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -13059,9 +13919,19 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="pack-rul.mkiv" generated="yes" name="framedtext" variant="example"> + <cd:command category="background rules" file="pack-rul.mkiv" level="style" name="setupframedtexts"> + <cd:arguments> + <cd:keywords list="yes" optional="yes"> + <cd:constant type="cd:name"/> + </cd:keywords> + <cd:assignments list="yes"> + <cd:inherit name="setupframedtext"/> + </cd:assignments> + </cd:arguments> + </cd:command> + <cd:command category="background rules" file="pack-rul.mkiv" generated="yes" level="document" name="framedtext" variant="instance"> <cd:sequence> - <cd:variable value="framedtext"/> + <cd:instance value="framedtext"/> </cd:sequence> <cd:arguments> <cd:assignments list="yes" optional="yes"> @@ -13073,9 +13943,9 @@ <cd:constant value="framedtext"/> </cd:instances> </cd:command> - <cd:command file="pack-rul.mkiv" generated="yes" name="framedtext" type="environment" variant="example"> + <cd:command category="background rules" file="pack-rul.mkiv" generated="yes" level="document" name="framedtext" type="environment" variant="instance"> <cd:sequence> - <cd:variable value="framedtext"/> + <cd:instance value="framedtext"/> </cd:sequence> <cd:arguments> <cd:keywords optional="yes"> @@ -13092,28 +13962,7 @@ <cd:constant value="framedtext"/> </cd:instances> </cd:command> - <cd:command file="pack-rul.mkiv" name="framedtext"> - <cd:arguments> - <cd:assignments list="yes" optional="yes"> - <cd:inherit name="setupframedtext"/> - </cd:assignments> - <cd:content/> - </cd:arguments> - </cd:command> - <cd:command file="pack-rul.mkiv" name="framedtext" type="environment"> - <cd:arguments> - <cd:keywords optional="yes"> - <cd:constant type="left"/> - <cd:constant type="right"/> - <cd:constant type="middle"/> - <cd:constant type="none"/> - </cd:keywords> - <cd:assignments list="yes" optional="yes"> - <cd:inherit name="setupframedtext"/> - </cd:assignments> - </cd:arguments> - </cd:command> - <cd:command file="pack-rul.mkiv" name="defineframedcontent"> + <cd:command category="background rules" file="pack-rul.mkiv" level="style" name="defineframedcontent"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -13126,7 +13975,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="pack-rul.mkiv" name="setupframedcontent"> + <cd:command category="background rules" file="pack-rul.mkiv" level="style" name="setupframedcontent"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -13158,7 +14007,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="pack-rul.mkiv" name="framedcontent" type="environment"> + <cd:command category="background rules" file="pack-rul.mkiv" level="system" name="framedcontent" type="environment"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -13166,7 +14015,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="pack-fen.mkiv" name="installleftframerenderer"> + <cd:command category="background rules" file="pack-fen.mkiv" level="system" name="installleftframerenderer"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -13176,7 +14025,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="pack-fen.mkiv" name="installrightframerenderer"> + <cd:command category="background rules" file="pack-fen.mkiv" level="system" name="installrightframerenderer"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -13186,7 +14035,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="pack-fen.mkiv" name="installtopframerenderer"> + <cd:command category="background rules" file="pack-fen.mkiv" level="system" name="installtopframerenderer"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -13196,7 +14045,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="pack-fen.mkiv" name="installbottomframerenderer"> + <cd:command category="background rules" file="pack-fen.mkiv" level="system" name="installbottomframerenderer"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -13207,8 +14056,94 @@ </cd:arguments> </cd:command> </cd:interface> + <cd:interface file="i-framedtable.xml"> + <cd:command category="tables" file="tabl-frm.mkiv" level="style" name="defineframedtable"> + <cd:arguments> + <cd:keywords> + <cd:constant type="cd:name"/> + </cd:keywords> + <cd:keywords optional="yes"> + <cd:constant type="cd:name"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command category="tables" file="tabl-frm.mkiv" level="style" name="setupframedtable"> + <cd:arguments> + <cd:keywords optional="yes"> + <cd:constant type="cd:name"/> + </cd:keywords> + <cd:assignments list="yes"> + <cd:parameter name="before"> + <cd:constant type="cd:command"/> + </cd:parameter> + <cd:parameter name="after"> + <cd:constant type="cd:command"/> + </cd:parameter> + <cd:parameter name="inbetween"> + <cd:constant type="cd:command"/> + </cd:parameter> + <cd:parameter name="distance"> + <cd:constant type="cd:dimension"/> + </cd:parameter> + <cd:inherit name="setupframed"/> + </cd:assignments> + </cd:arguments> + </cd:command> + <cd:command category="tables" file="tabl-frm.mkiv" level="style" name="setupframedtablerow"> + <cd:arguments> + <cd:keywords optional="yes"> + <cd:constant type="cd:name"/> + </cd:keywords> + <cd:keywords> + <cd:constant type="cd:number"/> + <cd:constant type="each"/> + </cd:keywords> + <cd:assignments list="yes"> + <cd:inherit name="setupframed"/> + </cd:assignments> + </cd:arguments> + </cd:command> + <cd:command category="tables" file="tabl-frm.mkiv" level="style" name="setupframedtablecolumn"> + <cd:arguments> + <cd:keywords optional="yes"> + <cd:constant type="cd:name"/> + </cd:keywords> + <cd:keywords> + <cd:constant type="cd:number"/> + <cd:constant type="each"/> + </cd:keywords> + <cd:assignments list="yes"> + <cd:inherit name="setupframed"/> + </cd:assignments> + </cd:arguments> + </cd:command> + <cd:command category="tables" file="tabl-frm.mkiv" level="document" name="framedtable" type="environment"> + <cd:arguments> + <cd:keywords optional="yes"> + <cd:constant type="cd:name"/> + </cd:keywords> + <cd:assignments list="yes" optional="yes"> + <cd:inherit name="setupframed"/> + </cd:assignments> + </cd:arguments> + </cd:command> + <cd:command category="tables" file="tabl-frm.mkiv" level="document" name="framedrow" type="environment"> + <cd:arguments> + <cd:assignments list="yes" optional="yes"> + <cd:inherit name="setupframed"/> + </cd:assignments> + </cd:arguments> + </cd:command> + <cd:command category="tables" file="tabl-frm.mkiv" level="document" name="framedcell" type="environment"> + <cd:arguments> + <cd:assignments list="yes" optional="yes"> + <cd:inherit name="setupframed"/> + </cd:assignments> + </cd:arguments> + </cd:command> + </cd:interface> <cd:interface file="i-graphics.xml"> - <cd:command file="grph-inc.mkiv" name="defineexternalfigure"> + <cd:command category="graphics" file="grph-inc.mkiv" level="style" name="defineexternalfigure"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -13221,7 +14156,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="grph-inc.mkvi" name="setupexternalfigure"> + <cd:command category="graphics" file="grph-inc.mkvi" level="style" name="setupexternalfigure"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -13373,9 +14308,6 @@ <cd:parameter name="backgroundcolor"> <cd:constant type="cd:color"/> </cd:parameter> - <cd:parameter name="align"> - <cd:inherit name="setupalign"/> - </cd:parameter> <cd:parameter name="xmax"> <cd:constant type="cd:number"/> </cd:parameter> @@ -13431,7 +14363,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="grph-inc.mkiv" name="useexternalfigure"> + <cd:command category="graphics" file="grph-inc.mkiv" level="style" name="useexternalfigure"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -13447,7 +14379,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="grph-inc.mkiv" name="externalfigure"> + <cd:command category="graphics" file="grph-inc.mkiv" level="document" name="externalfigure"> <cd:arguments> <cd:keywords> <cd:constant type="cd:file"/> @@ -13460,7 +14392,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="grph-inc.mkiv" name="getfiguredimensions"> + <cd:command category="graphics" file="grph-inc.mkiv" level="system" name="getfiguredimensions"> <cd:arguments> <cd:keywords> <cd:constant type="cd:file"/> @@ -13470,16 +14402,16 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="grph-inc.mkiv" name="figurewidth"/> - <cd:command file="grph-inc.mkiv" name="figureheight"/> - <cd:command file="grph-inc.mkiv" name="figurenaturalwidth"/> - <cd:command file="grph-inc.mkiv" name="figurenaturalheight"/> - <cd:command file="grph-inc.mkiv" name="figurefullname"/> - <cd:command file="grph-inc.mkiv" name="figurefilename"/> - <cd:command file="grph-inc.mkiv" name="figurefilepath"/> - <cd:command file="grph-inc.mkiv" name="figurefiletype"/> - <cd:command file="grph-inc.mkiv" name="noffigurepages"/> - <cd:command file="grph-inc.mkiv" name="definegraphictypesynonym"> + <cd:command category="graphics" file="grph-inc.mkiv" level="system" name="figurewidth"/> + <cd:command category="graphics" file="grph-inc.mkiv" level="system" name="figureheight"/> + <cd:command category="graphics" file="grph-inc.mkiv" level="system" name="figurenaturalwidth"/> + <cd:command category="graphics" file="grph-inc.mkiv" level="system" name="figurenaturalheight"/> + <cd:command category="graphics" file="grph-inc.mkiv" level="system" name="figurefullname"/> + <cd:command category="graphics" file="grph-inc.mkiv" level="system" name="figurefilename"/> + <cd:command category="graphics" file="grph-inc.mkiv" level="system" name="figurefilepath"/> + <cd:command category="graphics" file="grph-inc.mkiv" level="system" name="figurefiletype"/> + <cd:command category="graphics" file="grph-inc.mkiv" level="system" name="noffigurepages"/> + <cd:command category="graphics" file="grph-inc.mkiv" level="system" name="definegraphictypesynonym"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -13489,7 +14421,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="grph-inc.mkiv" name="doifelsefigure"> + <cd:command category="graphics conditional" file="grph-inc.mkiv" level="system" name="doifelsefigure"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:file"/> @@ -13502,7 +14434,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="grph-inc.mkiv" name="doiffigureelse"> + <cd:command category="graphics conditional" file="grph-inc.mkiv" level="system" name="doiffigureelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:file"/> @@ -13515,7 +14447,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="grph-inc.mkiv" name="registerexternalfigure"> + <cd:command category="graphics" file="grph-inc.mkiv" level="system" name="registerexternalfigure"> <cd:arguments> <cd:keywords> <cd:constant type="cd:file"/> @@ -13528,7 +14460,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="grph-inc.mkiv" name="usefigurebase"> + <cd:command category="graphics" file="grph-inc.mkiv" level="style" name="usefigurebase"> <cd:arguments> <cd:keywords> <cd:constant type="reset"/> @@ -13536,42 +14468,42 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="grph-inc.mkiv" name="externalfigurecollection" type="environment"> + <cd:command category="graphics" file="grph-inc.mkiv" level="style" name="externalfigurecollection" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="grph-inc.mkiv" name="externalfigurecollectionminwidth"> + <cd:command category="graphics" file="grph-inc.mkiv" level="style" name="externalfigurecollectionminwidth"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="grph-inc.mkiv" name="externalfigurecollectionmaxwidth"> + <cd:command category="graphics" file="grph-inc.mkiv" level="style" name="externalfigurecollectionmaxwidth"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="grph-inc.mkiv" name="externalfigurecollectionminheight"> + <cd:command category="graphics" file="grph-inc.mkiv" level="style" name="externalfigurecollectionminheight"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="grph-inc.mkiv" name="externalfigurecollectionmaxheight"> + <cd:command category="graphics" file="grph-inc.mkiv" level="style" name="externalfigurecollectionmaxheight"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="grph-inc.mkiv" name="externalfigurecollectionparameter"> + <cd:command category="graphics" file="grph-inc.mkiv" level="system" name="externalfigurecollectionparameter"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -13581,35 +14513,35 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="grph-inc.mkiv" name="efcminwidth"> + <cd:command category="graphics" file="grph-inc.mkiv" level="style" name="efcminwidth"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="grph-inc.mkiv" name="efcmaxwidth"> + <cd:command category="graphics" file="grph-inc.mkiv" level="style" name="efcmaxwidth"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="grph-inc.mkiv" name="efcminheight"> + <cd:command category="graphics" file="grph-inc.mkiv" level="style" name="efcminheight"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="grph-inc.mkiv" name="efcmaxheight"> + <cd:command category="graphics" file="grph-inc.mkiv" level="style" name="efcmaxheight"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="grph-inc.mkiv" name="efcparameter"> + <cd:command category="graphics" file="grph-inc.mkiv" level="style" name="efcparameter"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -13619,14 +14551,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="grph-inc.mkiv" name="overlayfigure"> + <cd:command category="graphics" file="grph-inc.mkiv" level="style" name="overlayfigure"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:file"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="grph-inc.mkiv" name="bitmapimage"> + <cd:command category="graphics" file="grph-inc.mkiv" level="document" name="bitmapimage"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="color"> @@ -13652,7 +14584,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="grph-inc.mkiv" name="bitmapimage" type="environment"> + <cd:command category="graphics" file="grph-inc.mkiv" level="document" name="bitmapimage" type="environment"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="color"> @@ -13675,7 +14607,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="grph-fig.mkiv" name="typesetbuffer"> + <cd:command category="graphics buffer" file="grph-fig.mkiv" level="document" name="typesetbuffer"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="*"/> @@ -13686,7 +14618,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="grph-fig.mkiv" name="definetypesetting"> + <cd:command category="graphics structure" file="grph-fig.mkiv" level="style" name="definetypesetting"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -13699,7 +14631,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="grph-fig.mkiv" name="typesetfile"> + <cd:command category="graphics structure" file="grph-fig.mkiv" level="document" name="typesetfile"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -13714,7 +14646,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="pack-box.mkiv" name="backgroundimage"> + <cd:command category="graphics" file="pack-box.mkiv" level="style" name="backgroundimage"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> @@ -13730,7 +14662,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="pack-box.mkiv" name="backgroundimagefill"> + <cd:command category="graphics" file="pack-box.mkiv" level="style" name="backgroundimagefill"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> @@ -13748,7 +14680,7 @@ </cd:command> </cd:interface> <cd:interface file="i-grid.xml"> - <cd:command file="page-grd.mkiv" name="showgrid"> + <cd:command category="layout" file="page-grd.mkiv" level="document" name="showgrid"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="reset"/> @@ -13766,7 +14698,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="definegridsnapping"> + <cd:command category="layout" file="spac-ver.mkiv" level="style" name="definegridsnapping"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -13803,7 +14735,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="snaptogrid"> + <cd:command category="layout" file="spac-ver.mkiv" level="document" name="snaptogrid"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="normal"/> @@ -13828,13 +14760,18 @@ <cd:constant type="min"/> <cd:constant type="max"/> <cd:constant type="middle"/> + <cd:constant type="math"/> + <cd:constant method="range" prefix="math" type="line"/> + <cd:constant method="range" prefix="math" type="halfline"/> + <cd:constant method="range" prefix="math" type="-line"/> + <cd:constant method="range" prefix="math" type="-halfline"/> <cd:constant type="cd:name"/> </cd:keywords> <cd:csname/> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="snaptogrid" variant="list"> + <cd:command category="layout" file="spac-ver.mkiv" level="document" name="snaptogrid" variant="list"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:inherit name="definegridsnapping"/> @@ -13843,7 +14780,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="placeongrid"> + <cd:command category="layout" file="spac-ver.mkiv" level="document" name="placeongrid"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="normal"/> @@ -13868,12 +14805,17 @@ <cd:constant type="min"/> <cd:constant type="max"/> <cd:constant type="middle"/> + <cd:constant type="math"/> + <cd:constant method="range" prefix="math" type="line"/> + <cd:constant method="range" prefix="math" type="halfline"/> + <cd:constant method="range" prefix="math" type="-line"/> + <cd:constant method="range" prefix="math" type="-halfline"/> <cd:constant type="cd:name"/> </cd:keywords> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="placeongrid" variant="list"> + <cd:command category="layout" file="spac-ver.mkiv" level="document" name="placeongrid" variant="list"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:inherit name="definegridsnapping"/> @@ -13881,7 +14823,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="gridsnapping" type="environment"> + <cd:command category="layout" file="spac-ver.mkiv" level="document" name="gridsnapping" type="environment"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="normal"/> @@ -13906,24 +14848,29 @@ <cd:constant type="min"/> <cd:constant type="max"/> <cd:constant type="middle"/> + <cd:constant type="math"/> + <cd:constant method="range" prefix="math" type="line"/> + <cd:constant method="range" prefix="math" type="halfline"/> + <cd:constant method="range" prefix="math" type="-line"/> + <cd:constant method="range" prefix="math" type="-halfline"/> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="gridsnapping" type="environment" variant="list"> + <cd:command category="layout" file="spac-ver.mkiv" level="document" name="gridsnapping" type="environment" variant="list"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:inherit name="definegridsnapping"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="usegridparameter"> + <cd:command category="layout" file="spac-ver.mkiv" level="system" name="usegridparameter"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="showgridsnapping"/> - <cd:command file="meta-grd.mkiv" name="basegrid"> + <cd:command category="layout" file="spac-ver.mkiv" level="document" name="showgridsnapping"/> + <cd:command category="graphics" file="meta-grd.mkiv" level="document" name="basegrid"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="nx"> @@ -13980,7 +14927,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="meta-grd.mkiv" name="grid"> + <cd:command category="graphics" file="meta-grd.mkiv" level="document" name="grid"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="basegrid"/> @@ -13989,7 +14936,7 @@ </cd:command> </cd:interface> <cd:interface file="i-help.xml"> - <cd:command file="scrn-hlp.mkvi" name="definehelp"> + <cd:command category="pdf" file="scrn-hlp.mkvi" level="style" name="definehelp"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -14002,7 +14949,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="scrn-hlp.mkvi" name="setuphelp"> + <cd:command category="pdf" file="scrn-hlp.mkvi" level="style" name="setuphelp"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -14012,9 +14959,9 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="scrn-hlp.mkvi" generated="yes" name="help" variant="example"> + <cd:command category="pdf" file="scrn-hlp.mkvi" generated="yes" level="document" name="help" variant="instance"> <cd:sequence> - <cd:variable value="help"/> + <cd:instance value="help"/> </cd:sequence> <cd:arguments> <cd:keywords optional="yes"> @@ -14031,9 +14978,9 @@ <cd:constant value="helptext"/> </cd:instances> </cd:command> - <cd:command file="scrn-hlp.mkvi" generated="yes" name="help" type="environment" variant="example"> + <cd:command category="pdf" file="scrn-hlp.mkvi" generated="yes" level="document" name="help" type="environment" variant="instance"> <cd:sequence> - <cd:variable value="help"/> + <cd:instance value="help"/> </cd:sequence> <cd:arguments> <cd:keywords optional="yes"> @@ -14044,7 +14991,7 @@ <cd:constant value="helptext"/> </cd:instances> </cd:command> - <cd:command file="scrn-hlp.mkvi" name="doifelsehelp"> + <cd:command category="pdf conditional" file="scrn-hlp.mkvi" level="system" name="doifelsehelp"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:true"/> @@ -14054,7 +15001,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="scrn-hlp.mkvi" name="doifhelpelse"> + <cd:command category="pdf conditional" file="scrn-hlp.mkvi" level="system" name="doifhelpelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:true"/> @@ -14064,8 +15011,8 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="scrn-hlp.mkvi" name="placehelp"/> - <cd:command file="scrn-hlp.mkvi" name="showhelp"> + <cd:command category="pdf" file="scrn-hlp.mkvi" level="document" name="placehelp"/> + <cd:command category="pdf" file="scrn-hlp.mkvi" level="document" name="showhelp"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -14075,7 +15022,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="scrn-hlp.mkvi" name="helptext"> + <cd:command category="pdf" file="scrn-hlp.mkvi" level="document" name="helptext"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:reference"/> @@ -14088,7 +15035,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="scrn-hlp.mkvi" name="helptext" type="environment"> + <cd:command category="pdf" file="scrn-hlp.mkvi" level="document" name="helptext" type="environment"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:reference"/> @@ -14097,7 +15044,7 @@ </cd:command> </cd:interface> <cd:interface file="i-highlight.xml"> - <cd:command file="core-sys.mkiv" name="definehighlight"> + <cd:command category="fonts colors" file="core-sys.mkiv" level="style" name="definehighlight"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -14110,7 +15057,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="core-sys.mkiv" name="setuphighlight"> + <cd:command category="fonts colors" file="core-sys.mkiv" level="style" name="setuphighlight"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -14130,7 +15077,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="core-sys.mkiv" generated="yes" name="highlight" variant="example"> + <cd:command category="fonts colors" file="core-sys.mkiv" generated="yes" level="document" name="highlight" variant="example"> <cd:sequence> <cd:variable value="highlight"/> </cd:sequence> @@ -14140,7 +15087,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-sys.mkiv" name="highlight"> + <cd:command category="fonts colors" file="core-sys.mkiv" level="document" name="highlight"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -14150,14 +15097,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-sys.mkiv" name="highlight" type="environment"> + <cd:command category="fonts colors" file="core-sys.mkiv" level="document" name="highlight" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-sys.mkiv" name="directhighlight"> + <cd:command category="fonts colors" file="core-sys.mkiv" level="document" name="directhighlight"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -14169,7 +15116,7 @@ </cd:command> </cd:interface> <cd:interface file="i-hspace.xml"> - <cd:command file="spac-hor.mkiv" name="definehspace"> + <cd:command category="whitespace" file="spac-hor.mkiv" level="style" name="definehspace"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -14182,7 +15129,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-hor.mkiv" name="hspace"> + <cd:command category="whitespace" file="spac-hor.mkiv" level="document" name="hspace"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -14208,22 +15155,22 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-hor.mkiv" name="hairspace"/> - <cd:command file="spac-hor.mkiv" name="thinspace"/> - <cd:command file="spac-hor.mkiv" name="medspace"/> - <cd:command file="spac-hor.mkiv" name="thickspace"/> - <cd:command file="spac-hor.mkiv" name="autoinsertnextspace"/> - <cd:command file="spac-ver.mkiv" name="hglue"> + <cd:command category="whitespace" file="spac-hor.mkiv" level="style" name="hairspace"/> + <cd:command category="whitespace" file="spac-hor.mkiv" level="style" name="thinspace"/> + <cd:command category="whitespace" file="spac-hor.mkiv" level="style" name="medspace"/> + <cd:command category="whitespace" file="spac-hor.mkiv" level="style" name="thickspace"/> + <cd:command category="whitespace" file="spac-hor.mkiv" level="style" name="autoinsertnextspace"/> + <cd:command category="whitespace" file="spac-ver.mkiv" level="system" name="hglue"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:dimension"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-hor.mkiv" name="frenchspacing"/> - <cd:command file="spac-hor.mkiv" name="newfrenchspacing"/> - <cd:command file="spac-hor.mkiv" name="nonfrenchspacing"/> - <cd:command file="spac-hor.mkiv" name="setupspacing"> + <cd:command category="whitespace" file="spac-hor.mkiv" level="system" name="frenchspacing"/> + <cd:command category="whitespace" file="spac-hor.mkiv" level="system" name="newfrenchspacing"/> + <cd:command category="whitespace" file="spac-hor.mkiv" level="system" name="nonfrenchspacing"/> + <cd:command category="whitespace" file="spac-hor.mkiv" level="style" name="setupspacing"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="fixed"/> @@ -14232,30 +15179,30 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-hor.mkiv" name="space"/> - <cd:command file="spac-hor.mkiv" name="removelastspace"/> - <cd:command file="spac-hor.mkiv" name="nospace"/> - <cd:command file="spac-hor.mkiv" name="fixedspace"/> - <cd:command file="spac-hor.mkiv" name="fixedspaces"/> - <cd:command file="spac-hor.mkiv" name="keepunwantedspaces"/> - <cd:command file="spac-hor.mkiv" name="removeunwantedspaces"/> - <cd:command file="spac-hor.mkiv" name="thinspace"/> - <cd:command file="spac-hor.mkiv" name="negthinspace"/> - <cd:command file="spac-hor.mkiv" name="enspace"/> - <cd:command file="spac-hor.mkiv" name="enskip"/> - <cd:command file="spac-hor.mkiv" name="quad"/> - <cd:command file="spac-hor.mkiv" name="qquad"/> - <cd:command file="spac-hor.mkiv" name="emspace"/> - <cd:command file="spac-hor.mkiv" name="dotfskip"> + <cd:command category="whitespace" file="spac-hor.mkiv" level="style" name="space"/> + <cd:command category="whitespace" file="spac-hor.mkiv" level="system" name="removelastspace"/> + <cd:command category="whitespace" file="spac-hor.mkiv" level="system" name="nospace"/> + <cd:command category="whitespace" file="spac-hor.mkiv" level="document" name="fixedspace"/> + <cd:command category="whitespace" file="spac-hor.mkiv" level="system" name="fixedspaces"/> + <cd:command category="whitespace" file="spac-hor.mkiv" level="system" name="keepunwantedspaces"/> + <cd:command category="whitespace" file="spac-hor.mkiv" level="system" name="removeunwantedspaces"/> + <cd:command category="whitespace" file="spac-hor.mkiv" level="style" name="thinspace"/> + <cd:command category="whitespace" file="spac-hor.mkiv" level="style" name="negthinspace"/> + <cd:command category="whitespace" file="spac-hor.mkiv" level="style" name="enspace"/> + <cd:command category="whitespace" file="spac-hor.mkiv" level="style" name="enskip"/> + <cd:command category="whitespace" file="spac-hor.mkiv" level="style" name="quad"/> + <cd:command category="whitespace" file="spac-hor.mkiv" level="style" name="qquad"/> + <cd:command category="whitespace" file="spac-hor.mkiv" level="style" name="emspace"/> + <cd:command category="whitespace" file="spac-hor.mkiv" level="system" name="dotfskip"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:dimension"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-hor.mkiv" name="leftskipadaption"/> - <cd:command file="spac-hor.mkiv" name="rightskipadaption"/> - <cd:command file="spac-hor.mkiv" name="dosetleftskipadaption"> + <cd:command category="whitespace layout" file="spac-hor.mkiv" level="system" name="leftskipadaption"/> + <cd:command category="whitespace layout" file="spac-hor.mkiv" level="system" name="rightskipadaption"/> + <cd:command category="whitespace layout" file="spac-hor.mkiv" level="system" name="dosetleftskipadaption"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="yes"/> @@ -14265,7 +15212,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-hor.mkiv" name="dosetrightskipadaption"> + <cd:command category="whitespace layout" file="spac-hor.mkiv" level="system" name="dosetrightskipadaption"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="yes"/> @@ -14275,7 +15222,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-hor.mkiv" name="doadaptleftskip"> + <cd:command category="whitespace layout" file="spac-hor.mkiv" level="system" name="doadaptleftskip"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="yes"/> @@ -14285,7 +15232,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-hor.mkiv" name="doadaptrightskip"> + <cd:command category="whitespace layout" file="spac-hor.mkiv" level="system" name="doadaptrightskip"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="yes"/> @@ -14295,7 +15242,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-hor.mkiv" name="activatespacehandler"> + <cd:command category="whitespace" file="spac-hor.mkiv" level="system" name="activatespacehandler"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="on"/> @@ -14305,7 +15252,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-hor.mkiv" name="quads"> + <cd:command category="whitespace" file="spac-hor.mkiv" level="style" name="quads"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:number"/> @@ -14314,7 +15261,7 @@ </cd:command> </cd:interface> <cd:interface file="i-hyphenation.xml"> - <cd:command file="lang-hyp.mkiv" name="setuphyphenation"> + <cd:command category="language" file="lang-hyp.mkiv" level="style" name="setuphyphenation"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="method"> @@ -14329,7 +15276,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="lang-hyp.mkiv" name="hyphenation" type="environment"> + <cd:command category="language" file="lang-hyp.mkiv" level="style" name="hyphenation" type="environment"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="original"/> @@ -14342,7 +15289,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="lang-hyp.mkiv" name="definehypenationfeatures"> + <cd:command category="language" file="lang-hyp.mkiv" level="style" name="definehypenationfeatures"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -14397,7 +15344,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="lang-hyp.mkiv" name="sethyphenationfeatures"> + <cd:command category="language" file="lang-hyp.mkiv" level="style" name="sethyphenationfeatures"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -14405,8 +15352,8 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="lang-hyp.mkiv" name="resethyphenationfeatures"/> - <cd:command file="lang-hyp.mkiv" name="registerhyphenationpattern"> + <cd:command category="language" file="lang-hyp.mkiv" level="style" name="resethyphenationfeatures"/> + <cd:command category="language" file="lang-hyp.mkiv" level="style" name="registerhyphenationpattern"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:language"/> @@ -14416,7 +15363,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="lang-hyp.mkiv" name="unregisterhyphenationpattern"> + <cd:command category="language" file="lang-hyp.mkiv" level="style" name="unregisterhyphenationpattern"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:language"/> @@ -14426,7 +15373,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="lang-hyp.mkiv" name="showhyphenationtrace"> + <cd:command category="language" file="lang-hyp.mkiv" level="document" name="showhyphenationtrace"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:language"/> @@ -14436,7 +15383,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="lang-hyp.mkiv" name="registerhyphenationexception"> + <cd:command category="language" file="lang-hyp.mkiv" level="style" name="registerhyphenationexception"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:language"/> @@ -14446,7 +15393,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-del.mkiv" name="setuphyphenmark"> + <cd:command category="language" file="typo-del.mkiv" level="style" name="setuphyphenmark"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="sign"> @@ -14456,14 +15403,14 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="typo-brk.mkiv" name="definebreakpoints"> + <cd:command category="language" file="typo-brk.mkiv" level="style" name="definebreakpoints"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-brk.mkiv" name="definebreakpoint"> + <cd:command category="language" file="typo-brk.mkiv" level="style" name="definebreakpoint"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -14504,7 +15451,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="typo-brk.mkiv" name="setbreakpoints"> + <cd:command category="language" file="typo-brk.mkiv" level="style" name="setbreakpoints"> <cd:arguments> <cd:keywords> <cd:constant type="reset"/> @@ -14512,76 +15459,76 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-brk.mkiv" name="resetbreakpoints"/> - <cd:command file="supp-box.mkiv" name="showhyphens"> + <cd:command category="language" file="typo-brk.mkiv" level="style" name="resetbreakpoints"/> + <cd:command category="language" file="supp-box.mkiv" level="document" name="showhyphens"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="hyphenatedword"> + <cd:command category="language" file="supp-box.mkiv" level="document" name="hyphenatedword"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="hyphenatedpar"> + <cd:command category="language" file="supp-box.mkiv" level="document" name="hyphenatedpar"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="hyphenatedfile"> + <cd:command category="language" file="supp-box.mkiv" level="document" name="hyphenatedfile"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:file"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="hyphenatedcoloredword"> + <cd:command category="language" file="supp-box.mkiv" level="document" name="hyphenatedcoloredword"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="hyphenatedhbox"> + <cd:command category="language" file="supp-box.mkiv" level="document" name="hyphenatedhbox"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="lang-url.mkiv" name="sethyphenatedurlbefore"> + <cd:command category="language" file="lang-url.mkiv" level="style" name="sethyphenatedurlbefore"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="lang-url.mkiv" name="sethyphenatedurlafter"> + <cd:command category="language" file="lang-url.mkiv" level="style" name="sethyphenatedurlafter"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="lang-url.mkiv" name="sethyphenatedurlnormal"> + <cd:command category="language" file="lang-url.mkiv" level="style" name="sethyphenatedurlnormal"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="lang-url.mkiv" name="hyphenatedurl"> + <cd:command category="language" file="lang-url.mkiv" level="document" name="hyphenatedurl"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="lang-url.mkiv" name="hyphenatedfilename"> + <cd:command category="language" file="lang-url.mkiv" level="document" name="hyphenatedfilename"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -14590,7 +15537,7 @@ </cd:command> </cd:interface> <cd:interface file="i-imposition.xml"> - <cd:command file="page-imp.mkiv" name="installshipoutmethod"> + <cd:command category="layout" file="page-imp.mkiv" level="system" name="installshipoutmethod"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -14600,7 +15547,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-imp.mkiv" name="invokepageheandler"> + <cd:command category="layout" file="page-imp.mkiv" level="system" name="invokepageheandler"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="normal"/> @@ -14610,7 +15557,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="page-imp.mkiv" name="setuparranging"> + <cd:command category="layout" file="page-imp.mkiv" level="style" name="setuparranging"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="disable"/> @@ -14655,7 +15602,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-imp.mkiv" name="installpagearrangement"> + <cd:command category="layout" file="page-imp.mkiv" level="system" name="installpagearrangement"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:name"/> @@ -14665,10 +15612,10 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command begin="push" end="pop" file="page-imp.mkiv" name="arrangedpages" type="environment"/> + <cd:command begin="push" category="layout" end="pop" file="page-imp.mkiv" level="system" name="arrangedpages" type="environment"/> </cd:interface> <cd:interface file="i-indent.xml"> - <cd:command file="spac-hor.mkiv" name="defineindenting"> + <cd:command category="whitespace" file="spac-hor.mkiv" level="style" name="defineindenting"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -14694,7 +15641,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-hor.mkiv" name="setupindenting"> + <cd:command category="whitespace" file="spac-hor.mkiv" level="style" name="setupindenting"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant method="none" prefix="cd:sign" type="small"/> @@ -14718,16 +15665,16 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-hor.mkiv" name="synchronizeindenting"/> - <cd:command file="spac-hor.mkiv" name="useindentingparameter"> + <cd:command category="whitespace" file="spac-hor.mkiv" level="system" name="synchronizeindenting"/> + <cd:command category="whitespace" file="spac-hor.mkiv" level="system" name="useindentingparameter"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command coreprimitive="yes" file="spac-hor.mkiv" name="indentation"/> - <cd:command coreprimitive="yes" file="spac-hor.mkiv" name="noindentation"/> - <cd:command coreprimitive="yes" file="spac-hor.mkiv" name="doindentation"/> - <cd:command file="spac-hor.mkiv" name="checknextindentation"> + <cd:command category="whitespace" coreprimitive="yes" file="spac-hor.mkiv" level="document" name="indentation"/> + <cd:command category="whitespace" coreprimitive="yes" file="spac-hor.mkiv" level="document" name="noindentation"/> + <cd:command category="whitespace" coreprimitive="yes" file="spac-hor.mkiv" level="system" name="doindentation"/> + <cd:command category="whitespace" file="spac-hor.mkiv" level="system" name="checknextindentation"> <cd:arguments> <cd:keywords> <cd:constant type="yes"/> @@ -14736,16 +15683,16 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-hor.mkiv" name="useindentnextparameter"> + <cd:command category="whitespace" file="spac-hor.mkiv" level="system" name="useindentnextparameter"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="spac-hor.mkiv" name="dorechecknextindentation"/> - <cd:command begin="push" end="pop" file="spac-hor.mkiv" name="indentation" type="environment"/> + <cd:command category="whitespace" file="spac-hor.mkiv" level="system" name="dorechecknextindentation"/> + <cd:command begin="push" category="whitespace" end="pop" file="spac-hor.mkiv" level="system" name="indentation" type="environment"/> </cd:interface> <cd:interface file="i-indentedtext.xml"> - <cd:command file="strc-ind.mkiv" name="defineindentedtext"> + <cd:command category="structure" file="strc-ind.mkiv" level="style" name="defineindentedtext"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -14758,7 +15705,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-ind.mkiv" name="setupindentedtext"> + <cd:command category="structure" file="strc-ind.mkiv" level="style" name="setupindentedtext"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -14804,12 +15751,12 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-ind.mkiv" generated="yes" name="indentedtext" type="environment" variant="example"> + <cd:command category="structure" file="strc-ind.mkiv" generated="yes" level="document" name="indentedtext" type="environment" variant="example"> <cd:sequence> <cd:variable value="indentedtext"/> </cd:sequence> </cd:command> - <cd:command file="strc-ind.mkiv" name="indentedtext" type="environment"> + <cd:command category="structure" file="strc-ind.mkiv" level="document" name="indentedtext" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -14818,7 +15765,7 @@ </cd:command> </cd:interface> <cd:interface file="i-initial.xml"> - <cd:command file="typo-drp.mkiv" name="defineinitial"> + <cd:command category="fonts" file="typo-drp.mkiv" level="style" name="defineinitial"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -14831,7 +15778,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="typo-drp.mkiv" name="setupinitial"> + <cd:command category="fonts" file="typo-drp.mkiv" level="style" name="setupinitial"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -14882,14 +15829,14 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="typo-drp.mkiv" name="placeinitial"> + <cd:command category="fonts" file="typo-drp.mkiv" level="document" name="placeinitial"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-drp.mkiv" name="setinitial"> + <cd:command category="fonts" file="typo-drp.mkiv" level="document" name="setinitial"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -14901,42 +15848,42 @@ </cd:command> </cd:interface> <cd:interface file="i-injector.xml"> - <cd:command file="typo-inj.mkiv" name="resetinjector"> + <cd:command file="typo-inj.mkiv" level="system" name="resetinjector"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-inj.mkiv" name="markinjector"> + <cd:command file="typo-inj.mkiv" level="system" name="markinjector"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-inj.mkiv" name="checkinjector"> + <cd:command file="typo-inj.mkiv" level="system" name="checkinjector"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-inj.mkiv" name="checkpreviousinjector"> + <cd:command file="typo-inj.mkiv" level="system" name="checkpreviousinjector"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-inj.mkiv" name="checknextinjector"> + <cd:command file="typo-inj.mkiv" level="system" name="checknextinjector"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-inj.mkiv" name="setinjector"> + <cd:command file="typo-inj.mkiv" level="document" name="setinjector"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -14949,7 +15896,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-inj.mkiv" name="showinjector"> + <cd:command file="typo-inj.mkiv" level="document" name="showinjector"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -14958,7 +15905,7 @@ </cd:command> </cd:interface> <cd:interface file="i-insertion.xml"> - <cd:command file="page-ins.mkiv" name="defineinsertion"> + <cd:command category="structure" file="page-ins.mkiv" level="system" name="defineinsertion"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -14971,7 +15918,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-ins.mkiv" name="setupinsertion"> + <cd:command category="structure" file="page-ins.mkiv" level="system" name="setupinsertion"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -14987,7 +15934,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-ins.mkiv" name="doifelseinsertion"> + <cd:command category="structure conditional" file="page-ins.mkiv" level="system" name="doifelseinsertion"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -15000,7 +15947,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-ins.mkiv" name="doifinsertionelse"> + <cd:command category="structure conditional" file="page-ins.mkiv" level="system" name="doifinsertionelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -15015,7 +15962,7 @@ </cd:command> </cd:interface> <cd:interface file="i-interaction.xml"> - <cd:command file="scrn-ini.mkvi" name="defineinteraction"> + <cd:command category="pdf" file="scrn-ini.mkvi" level="style" name="defineinteraction"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -15028,7 +15975,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="scrn-ini.mkvi" name="setupinteraction"> + <cd:command category="pdf" file="scrn-ini.mkvi" level="style" name="setupinteraction"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -15126,14 +16073,14 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="scrn-ini.mkvi" name="setupinteraction" variant="name"> + <cd:command category="pdf" file="scrn-ini.mkvi" level="style" name="setupinteraction" variant="name"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="scrn-ini.mkvi" name="interaction" type="environment"> + <cd:command category="pdf" file="scrn-ini.mkvi" level="system" name="interaction" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="hidden"/> @@ -15141,7 +16088,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="scrn-ini.mkvi" name="setinteraction"> + <cd:command category="pdf" file="scrn-ini.mkvi" level="system" name="setinteraction"> <cd:arguments> <cd:keywords> <cd:constant type="hidden"/> @@ -15149,7 +16096,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="scrn-ini.mkvi" name="doifelselocation"> + <cd:command category="pdf conditional" file="scrn-ini.mkvi" level="system" name="doifelselocation"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:true"/> @@ -15159,7 +16106,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="scrn-ini.mkvi" name="doiflocationelse"> + <cd:command category="pdf conditional" file="scrn-ini.mkvi" level="system" name="doiflocationelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:true"/> @@ -15171,7 +16118,7 @@ </cd:command> </cd:interface> <cd:interface file="i-interactionbar.xml"> - <cd:command file="scrn-bar.mkvi" name="defineinteractionbar"> + <cd:command category="pdf" file="scrn-bar.mkvi" level="style" name="defineinteractionbar"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -15184,7 +16131,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="scrn-bar.mkvi" name="setupinteractionbar"> + <cd:command category="pdf" file="scrn-bar.mkvi" level="style" name="setupinteractionbar"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -15247,7 +16194,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="scrn-bar.mkvi" name="interactionbar"> + <cd:command category="pdf" file="scrn-bar.mkvi" level="style" name="interactionbar"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -15257,7 +16204,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="scrn-bar.mkvi" name="interactionbuttons"> + <cd:command category="pdf" file="scrn-bar.mkvi" level="style" name="interactionbuttons"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupinteractionbar"/> @@ -15271,7 +16218,7 @@ </cd:command> </cd:interface> <cd:interface file="i-interactionmenu.xml"> - <cd:command file="scrn-but.mkvi" name="defineinteractionmenu"> + <cd:command category="pdf" file="scrn-but.mkvi" level="style" name="defineinteractionmenu"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -15284,7 +16231,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="scrn-but.mkvi" name="setupinteractionmenu"> + <cd:command category="pdf" file="scrn-but.mkvi" level="style" name="setupinteractionmenu"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -15395,28 +16342,28 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="scrn-but.mkvi" name="interactionmenu" type="environment"> + <cd:command category="pdf" file="scrn-but.mkvi" level="style" name="interactionmenu" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="scrn-but.mkvi" name="resetinteractionmenu"> + <cd:command category="pdf" file="scrn-but.mkvi" level="style" name="resetinteractionmenu"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="scrn-but.mkvi" name="includemenu"> + <cd:command category="pdf" file="scrn-but.mkvi" level="style" name="includemenu"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="scrn-but.mkvi" name="interactionmenu"> + <cd:command category="pdf" file="scrn-but.mkvi" level="style" name="interactionmenu"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -15426,7 +16373,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="scrn-but.mkvi" name="menubutton" variant="interactionmenu"> + <cd:command category="pdf" file="scrn-but.mkvi" level="style" name="menubutton" variant="interactionmenu"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -15442,7 +16389,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="scrn-but.mkvi" name="menubutton" variant="button"> + <cd:command category="pdf" file="scrn-but.mkvi" level="style" name="menubutton" variant="button"> <cd:arguments> <cd:assignments list="yes"> <cd:inherit name="setupbutton"/> @@ -15455,7 +16402,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="scrn-but.mkvi" name="registermenubuttons"> + <cd:command category="pdf" file="scrn-but.mkvi" level="system" name="registermenubuttons"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -15467,7 +16414,7 @@ </cd:command> </cd:interface> <cd:interface file="i-interactionscreen.xml"> - <cd:command file="scrn-pag.mkvi" name="setupinteractionscreen"> + <cd:command category="pdf" file="scrn-pag.mkvi" level="style" name="setupinteractionscreen"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="width"> @@ -15508,10 +16455,15 @@ <cd:constant type="portrait"/> <cd:constant type="page"/> <cd:constant type="paper"/> + <cd:constant type="attachment"/> + <cd:constant type="layer"/> </cd:parameter> <cd:parameter name="copies"> <cd:constant type="cd:number"/> </cd:parameter> + <cd:parameter name="print"> + <cd:constant type="cd:list"/> + </cd:parameter> <cd:parameter name="delay"> <cd:constant default="yes" type="none"/> <cd:constant type="cd:number"/> @@ -15519,7 +16471,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="scrn-pag.mkvi" name="screen"> + <cd:command category="pdf" file="scrn-pag.mkvi" level="document" name="screen"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:inherit name="page"/> @@ -15528,10 +16480,10 @@ </cd:command> </cd:interface> <cd:interface file="i-interface.xml"> - <cd:command file="mult-ini.mkiv" name="defaultinterface"/> - <cd:command file="mult-ini.mkiv" name="currentinterface"/> - <cd:command file="mult-ini.mkiv" name="currentresponses"/> - <cd:command file="mult-ini.mkiv" name="interface" type="environment"> + <cd:command file="mult-ini.mkiv" level="system" name="defaultinterface"/> + <cd:command file="mult-ini.mkiv" level="system" name="currentinterface"/> + <cd:command file="mult-ini.mkiv" level="system" name="currentresponses"/> + <cd:command file="mult-ini.mkiv" level="system" name="interface" type="environment"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="all"/> @@ -15539,7 +16491,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="mult-ini.mkiv" name="defineinterfaceconstant"> + <cd:command file="mult-ini.mkiv" level="system" name="defineinterfaceconstant"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -15549,7 +16501,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="mult-ini.mkiv" name="defineinterfacevariable"> + <cd:command file="mult-ini.mkiv" level="system" name="defineinterfacevariable"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -15559,7 +16511,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="mult-ini.mkiv" name="defineinterfaceelement"> + <cd:command file="mult-ini.mkiv" level="system" name="defineinterfaceelement"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -15569,7 +16521,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="mult-ini.mkiv" name="definefileconstant"> + <cd:command file="mult-ini.mkiv" level="system" name="definefileconstant"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -15579,28 +16531,28 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="mult-ini.mkiv" name="definesystemconstant"> + <cd:command file="mult-ini.mkiv" level="system" name="definesystemconstant"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="mult-ini.mkiv" name="definemessageconstant"> + <cd:command file="mult-ini.mkiv" level="system" name="definemessageconstant"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="mult-ini.mkiv" name="definesystemvariable"> + <cd:command file="mult-ini.mkiv" level="system" name="definesystemvariable"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="mult-ini.mkiv" name="setinterfacemessage"> + <cd:command file="mult-ini.mkiv" level="system" name="setinterfacemessage"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -15615,7 +16567,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="mult-ini.mkiv" name="setmessagetext"> + <cd:command file="mult-ini.mkiv" level="system" name="setmessagetext"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -15626,8 +16578,8 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="mult-ini.mkiv" name="currentmessagetext"/> - <cd:command file="mult-ini.mkiv" name="getmessage"> + <cd:command file="mult-ini.mkiv" level="system" name="currentmessagetext"/> + <cd:command file="mult-ini.mkiv" level="system" name="getmessage"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -15638,7 +16590,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="mult-ini.mkiv" name="doifelsemessage"> + <cd:command file="mult-ini.mkiv" level="system" name="doifelsemessage"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -15655,7 +16607,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="mult-ini.mkiv" name="doifmessageelse"> + <cd:command file="mult-ini.mkiv" level="system" name="doifmessageelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -15672,7 +16624,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="mult-ini.mkiv" name="showmessage"> + <cd:command file="mult-ini.mkiv" level="system" name="showmessage"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -15686,7 +16638,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="mult-ini.mkiv" name="writestatus"> + <cd:command file="mult-ini.mkiv" level="system" name="writestatus"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -15696,28 +16648,28 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="mult-ini.mkiv" name="message"> + <cd:command file="mult-ini.mkiv" level="system" name="message"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="mult-ini.mkiv" name="inlinemessage"> + <cd:command file="mult-ini.mkiv" level="system" name="inlinemessage"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="mult-ini.mkiv" name="displaymessage"> + <cd:command file="mult-ini.mkiv" level="system" name="displaymessage"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="mult-ini.mkiv" name="showwarning"> + <cd:command file="mult-ini.mkiv" level="system" name="showwarning"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -15731,7 +16683,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="mult-ini.mkiv" name="setinterfaceconstant"> + <cd:command file="mult-ini.mkiv" level="system" name="setinterfaceconstant"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -15741,7 +16693,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="mult-ini.mkiv" name="setinterfacevariable"> + <cd:command file="mult-ini.mkiv" level="system" name="setinterfacevariable"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -15751,7 +16703,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="mult-ini.mkiv" name="setinterfaceelements"> + <cd:command file="mult-ini.mkiv" level="system" name="setinterfaceelement"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -15761,7 +16713,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="mult-ini.mkiv" name="setinterfacecommand"> + <cd:command file="mult-ini.mkiv" level="system" name="setinterfacecommand"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -15773,7 +16725,7 @@ </cd:command> </cd:interface> <cd:interface file="i-interlinespace.xml"> - <cd:command file="spac-ver.mkiv" name="defineinterlinespace"> + <cd:command category="whitespace" file="spac-ver.mkiv" level="style" name="defineinterlinespace"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -15786,7 +16738,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="setupinterlinespace"> + <cd:command category="whitespace" file="spac-ver.mkiv" level="style" name="setupinterlinespace"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -15826,7 +16778,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="setupinterlinespace" variant="argument"> + <cd:command category="whitespace" file="spac-ver.mkiv" level="style" name="setupinterlinespace" variant="argument"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="on"/> @@ -15841,14 +16793,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="setupinterlinespace" variant="name"> + <cd:command category="whitespace" file="spac-ver.mkiv" level="style" name="setupinterlinespace" variant="name"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="setuplocalinterlinespace"> + <cd:command category="whitespace" file="spac-ver.mkiv" level="style" name="setuplocalinterlinespace"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -15858,7 +16810,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="setuplocalinterlinespace" variant="argument"> + <cd:command category="whitespace" file="spac-ver.mkiv" level="style" name="setuplocalinterlinespace" variant="argument"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="on"/> @@ -15873,14 +16825,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="setuplocalinterlinespace" variant="name"> + <cd:command category="whitespace" file="spac-ver.mkiv" level="style" name="setuplocalinterlinespace" variant="name"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="switchtointerlinespace"> + <cd:command category="whitespace" file="spac-ver.mkiv" level="style" name="switchtointerlinespace"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -15890,7 +16842,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="switchtointerlinespace" variant="argument"> + <cd:command category="whitespace" file="spac-ver.mkiv" level="style" name="switchtointerlinespace" variant="argument"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="on"/> @@ -15905,21 +16857,21 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="switchtointerlinespace" variant="name"> + <cd:command category="whitespace" file="spac-ver.mkiv" level="style" name="switchtointerlinespace" variant="name"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="dosetupcheckedinterlinespace"> + <cd:command category="whitespace" file="spac-ver.mkiv" level="system" name="dosetupcheckedinterlinespace"> <cd:arguments> <cd:assignments delimiters="braces" list="yes"> <cd:inherit name="setupinterlinespace"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="dosetupcheckedinterlinespace" variant="argument"> + <cd:command category="whitespace" file="spac-ver.mkiv" level="system" name="dosetupcheckedinterlinespace" variant="argument"> <cd:arguments> <cd:keywords delimiters="braces" list="yes"> <cd:constant type="on"/> @@ -15934,21 +16886,21 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="dosetupcheckedinterlinespace" variant="name"> + <cd:command category="whitespace" file="spac-ver.mkiv" level="system" name="dosetupcheckedinterlinespace" variant="name"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="useinterlinespaceparameter"> + <cd:command category="whitespace" file="spac-ver.mkiv" level="system" name="useinterlinespaceparameter"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> </cd:interface> <cd:interface file="i-interlinespace.xml"> - <cd:command file="spac-ver.mkiv" name="defineinterlinespace"> + <cd:command category="whitespace" file="spac-ver.mkiv" level="style" name="defineinterlinespace"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -15961,7 +16913,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="setupinterlinespace"> + <cd:command category="whitespace" file="spac-ver.mkiv" level="style" name="setupinterlinespace"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -16001,7 +16953,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="setupinterlinespace" variant="argument"> + <cd:command category="whitespace" file="spac-ver.mkiv" level="style" name="setupinterlinespace" variant="argument"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="on"/> @@ -16016,14 +16968,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="setupinterlinespace" variant="name"> + <cd:command category="whitespace" file="spac-ver.mkiv" level="style" name="setupinterlinespace" variant="name"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="setuplocalinterlinespace"> + <cd:command category="whitespace" file="spac-ver.mkiv" level="style" name="setuplocalinterlinespace"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -16033,7 +16985,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="setuplocalinterlinespace" variant="argument"> + <cd:command category="whitespace" file="spac-ver.mkiv" level="style" name="setuplocalinterlinespace" variant="argument"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="on"/> @@ -16048,14 +17000,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="setuplocalinterlinespace" variant="name"> + <cd:command category="whitespace" file="spac-ver.mkiv" level="style" name="setuplocalinterlinespace" variant="name"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="switchtointerlinespace"> + <cd:command category="whitespace" file="spac-ver.mkiv" level="style" name="switchtointerlinespace"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -16065,7 +17017,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="switchtointerlinespace" variant="argument"> + <cd:command category="whitespace" file="spac-ver.mkiv" level="style" name="switchtointerlinespace" variant="argument"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="on"/> @@ -16080,21 +17032,21 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="switchtointerlinespace" variant="name"> + <cd:command category="whitespace" file="spac-ver.mkiv" level="style" name="switchtointerlinespace" variant="name"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="dosetupcheckedinterlinespace"> + <cd:command category="whitespace" file="spac-ver.mkiv" level="system" name="dosetupcheckedinterlinespace"> <cd:arguments> <cd:assignments delimiters="braces" list="yes"> <cd:inherit name="setupinterlinespace"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="dosetupcheckedinterlinespace" variant="argument"> + <cd:command category="whitespace" file="spac-ver.mkiv" level="system" name="dosetupcheckedinterlinespace" variant="argument"> <cd:arguments> <cd:keywords delimiters="braces" list="yes"> <cd:constant type="on"/> @@ -16109,21 +17061,21 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="dosetupcheckedinterlinespace" variant="name"> + <cd:command category="whitespace" file="spac-ver.mkiv" level="system" name="dosetupcheckedinterlinespace" variant="name"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="useinterlinespaceparameter"> + <cd:command category="whitespace" file="spac-ver.mkiv" level="system" name="useinterlinespaceparameter"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> </cd:interface> <cd:interface file="i-italiccorrection.xml"> - <cd:command file="typo-itc.mkvi" name="setitaliccorrection"> + <cd:command category="fonts" file="typo-itc.mkvi" level="system" name="setitaliccorrection"> <cd:arguments> <cd:keywords> <cd:constant type="reset"/> @@ -16132,9 +17084,9 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-itc.mkvi" name="resetitaliccorrection"/> - <cd:command file="typo-itc.mkvi" name="italiccorrection"/> - <cd:command file="typo-itc.mkvi" name="setupitaliccorrection"> + <cd:command category="fonts" file="typo-itc.mkvi" level="style" name="resetitaliccorrection"/> + <cd:command category="fonts" file="typo-itc.mkvi" level="style" name="italiccorrection"/> + <cd:command category="fonts" file="typo-itc.mkvi" level="style" name="setupitaliccorrection"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="text"/> @@ -16146,7 +17098,7 @@ </cd:command> </cd:interface> <cd:interface file="i-itemgroup.xml"> - <cd:command file="strc-itm.mkvi" name="defineitemgroup"> + <cd:command category="structure" file="strc-itm.mkvi" level="style" name="defineitemgroup"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -16159,7 +17111,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-itm.mkvi" name="setupitemgroup"> + <cd:command category="structure counter" file="strc-itm.mkvi" level="style" name="setupitemgroup"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -16190,6 +17142,7 @@ <cd:constant type="joinedup"/> <cd:constant type="serried"/> <cd:constant type="stopper"/> + <cd:constant type="nostopper"/> <cd:constant type="unpacked"/> <cd:constant type="repeat"/> <cd:constant type="norepeat"/> @@ -16361,11 +17314,14 @@ <cd:parameter name="symcolor"> <cd:constant type="cd:color"/> </cd:parameter> + <cd:parameter name="grid"> + <cd:inherit name="definegridsnapping"/> + </cd:parameter> <cd:inherit name="setupcounter"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-itm.mkvi" name="setupitemgroup" variant="assignment"> + <cd:command category="structure counter" file="strc-itm.mkvi" level="style" name="setupitemgroup" variant="assignment"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -16564,11 +17520,14 @@ <cd:parameter name="symcolor"> <cd:constant type="cd:color"/> </cd:parameter> + <cd:parameter name="grid"> + <cd:inherit name="definegridsnapping"/> + </cd:parameter> <cd:inherit name="setupcounter"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-itm.mkvi" name="setupitemgroups"> + <cd:command category="structure counter" file="strc-itm.mkvi" level="style" name="setupitemgroups"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -16579,7 +17538,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-itm.mkvi" generated="yes" name="setupitemgroup" variant="instance"> + <cd:command category="structure counter" file="strc-itm.mkvi" generated="yes" level="style" name="setupitemgroup" variant="instance"> <cd:sequence> <cd:string value="setup"/> <cd:instance value="itemgroup"/> @@ -16600,7 +17559,7 @@ <cd:constant value="itemize"/> </cd:instances> </cd:command> - <cd:command file="strc-itm.mkvi" generated="yes" name="itemgroup" type="environment" variant="instance"> + <cd:command category="structure" file="strc-itm.mkvi" generated="yes" level="document" name="itemgroup" type="environment" variant="instance"> <cd:sequence> <cd:instance value="itemgroup"/> </cd:sequence> @@ -16616,7 +17575,7 @@ <cd:constant value="itemize"/> </cd:instances> </cd:command> - <cd:command file="strc-itm.mkvi" name="itemgroup" type="environment"> + <cd:command category="structure" file="strc-itm.mkvi" level="document" name="itemgroup" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -16629,29 +17588,29 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-itm.mkvi" name="item" scope="itemgroup"> + <cd:command category="structure" file="strc-itm.mkvi" level="document" name="item" scope="itemgroup"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:reference"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-itm.mkvi" name="noitem" scope="itemgroup"/> - <cd:command file="strc-itm.mkvi" name="itemtag" scope="itemgroup"> + <cd:command category="structure" file="strc-itm.mkvi" level="document" name="noitem" scope="itemgroup"/> + <cd:command category="structure" file="strc-itm.mkvi" level="document" name="itemtag" scope="itemgroup"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:reference"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-itm.mkvi" name="item" scope="itemgroup" type="environment"> + <cd:command category="structure" file="strc-itm.mkvi" level="document" name="item" scope="itemgroup" type="environment"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:reference"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-itm.mkvi" name="head" scope="itemgroup" type="environment"> + <cd:command category="structure" file="strc-itm.mkvi" level="document" name="head" scope="itemgroup" type="environment"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:reference"/> @@ -16661,7 +17620,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-itm.mkvi" name="specialitem" scope="itemgroup" type="environment" variant="item"> + <cd:command category="structure" file="strc-itm.mkvi" level="document" name="specialitem" scope="itemgroup" type="environment" variant="item"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant default="yes" type="item"/> @@ -16671,7 +17630,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-itm.mkvi" name="specialitem" scope="itemgroup" type="environment" variant="symbol"> + <cd:command category="structure" file="strc-itm.mkvi" level="document" name="specialitem" scope="itemgroup" type="environment" variant="symbol"> <cd:arguments> <cd:keywords> <cd:constant type="sym"/> @@ -16683,7 +17642,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-itm.mkvi" name="specialitem" scope="itemgroup" type="environment" variant="none"> + <cd:command category="structure" file="strc-itm.mkvi" level="document" name="specialitem" scope="itemgroup" type="environment" variant="none"> <cd:arguments> <cd:keywords> <cd:constant type="sub"/> @@ -16693,7 +17652,7 @@ </cd:command> </cd:interface> <cd:interface file="i-items.xml"> - <cd:command file="typo-itm.mkiv" name="defineitems"> + <cd:command category="symbols" file="typo-itm.mkiv" level="style" name="defineitems"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -16706,7 +17665,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="typo-itm.mkiv" name="setupitems"> + <cd:command category="symbols" file="typo-itm.mkiv" level="style" name="setupitems"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -16766,7 +17725,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="typo-itm.mkiv" name="items"> + <cd:command category="symbols" file="typo-itm.mkiv" level="document" name="items"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupitems"/> @@ -16778,7 +17737,7 @@ </cd:command> </cd:interface> <cd:interface file="i-javascript.xml"> - <cd:command file="java-ini.mkiv" name="JScode" type="environment"> + <cd:command category="pdf" file="java-ini.mkiv" level="system" name="JScode" type="environment"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:name"/> @@ -16791,7 +17750,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="java-ini.mkiv" name="JSpreamble" type="environment"> + <cd:command category="pdf" file="java-ini.mkiv" level="system" name="JSpreamble" type="environment"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:name"/> @@ -16805,7 +17764,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="java-ini.mkiv" name="setJSpreamble"> + <cd:command category="pdf" file="java-ini.mkiv" level="system" name="setJSpreamble"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -16813,7 +17772,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="java-ini.mkiv" name="addtoJSpreamble"> + <cd:command category="pdf" file="java-ini.mkiv" level="system" name="addtoJSpreamble"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -16821,7 +17780,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="java-ini.mkiv" name="useJSscripts"> + <cd:command category="pdf" file="java-ini.mkiv" level="style" name="useJSscripts"> <cd:arguments> <cd:keywords> <cd:constant type="cd:file"/> @@ -16833,7 +17792,7 @@ </cd:command> </cd:interface> <cd:interface file="i-kerning.xml"> - <cd:command file="typo-krn.mkiv" name="definecharacterkerning"> + <cd:command category="fonts whitespace" file="typo-krn.mkiv" level="style" name="definecharacterkerning"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -16846,7 +17805,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="typo-krn.mkiv" name="setupcharacterkerning"> + <cd:command category="fonts whitespace" file="typo-krn.mkiv" level="style" name="setupcharacterkerning"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -16872,7 +17831,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="typo-krn.mkiv" name="setcharacterkerning"> + <cd:command category="fonts whitespace" file="typo-krn.mkiv" level="style" name="setcharacterkerning"> <cd:arguments> <cd:keywords> <cd:constant type="reset"/> @@ -16880,8 +17839,8 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-krn.mkiv" name="resetcharacterkerning"/> - <cd:command file="typo-krn.mkiv" generated="yes" name="characterkerning" variant="example"> + <cd:command category="fonts whitespace" file="typo-krn.mkiv" level="style" name="resetcharacterkerning"/> + <cd:command category="fonts whitespace" file="typo-krn.mkiv" generated="yes" level="document" name="characterkerning" variant="example"> <cd:sequence> <cd:variable value="characterkerning"/> </cd:sequence> @@ -16894,7 +17853,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-krn.mkiv" name="kerncharacters"> + <cd:command category="fonts whitespace" file="typo-krn.mkiv" level="document" name="kerncharacters"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:number"/> @@ -16904,7 +17863,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-krn.mkiv" name="letterspacing"> + <cd:command category="fonts whitespace" file="typo-krn.mkiv" level="document" name="letterspacing"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:number"/> @@ -16914,7 +17873,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-krn.mkiv" name="stretched"> + <cd:command category="fonts whitespace" file="typo-krn.mkiv" level="document" name="stretched"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupstretched"/> @@ -16924,7 +17883,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-krn.mkiv" name="setupstretched"> + <cd:command category="fonts whitespace" file="typo-krn.mkiv" level="style" name="setupstretched"> <cd:arguments> <cd:assignments list="yes"> <cd:inherit name="setupcharacterkerning"/> @@ -16933,7 +17892,7 @@ </cd:command> </cd:interface> <cd:interface file="i-label.xml"> - <cd:command file="strc-lab.mkiv" name="definelabel"> + <cd:command category="structure" file="strc-lab.mkiv" level="style" name="definelabel"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -16946,7 +17905,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-lab.mkiv" name="setuplabel"> + <cd:command category="structure" file="strc-lab.mkiv" level="style" name="setuplabel"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -17067,6 +18026,12 @@ <cd:constant type="none"/> <cd:constant type="cd:dimension"/> </cd:parameter> + <cd:parameter name="stretch"> + <cd:constant type="cd:number"/> + </cd:parameter> + <cd:parameter name="shrink"> + <cd:constant type="cd:number"/> + </cd:parameter> <cd:parameter name="hang"> <cd:constant type="fit"/> <cd:constant type="broad"/> @@ -17117,7 +18082,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-lab.mkiv" generated="yes" name="label" variant="example"> + <cd:command category="structure" file="strc-lab.mkiv" generated="yes" level="document" name="label" variant="example"> <cd:sequence> <cd:variable value="label"/> </cd:sequence> @@ -17130,7 +18095,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-lab.mkiv" generated="yes" name="currentlabel" variant="example"> + <cd:command category="structure" file="strc-lab.mkiv" generated="yes" level="document" name="currentlabel" variant="example"> <cd:sequence> <cd:string value="current"/> <cd:variable value="label"/> @@ -17146,7 +18111,7 @@ </cd:command> </cd:interface> <cd:interface file="i-labeltext.xml"> - <cd:command file="lang-lab.mkiv" name="definelabelclass"> + <cd:command category="language" file="lang-lab.mkiv" level="system" name="definelabelclass"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -17156,7 +18121,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="lang-lab.mkiv" generated="yes" name="setuplabeltext" variant="instance"> + <cd:command category="language" file="lang-lab.mkiv" generated="yes" level="style" name="setuplabeltext" variant="instance"> <cd:sequence> <cd:string value="setup"/> <cd:instance value="label"/> @@ -17172,9 +18137,19 @@ </cd:parameter> </cd:assignments> </cd:arguments> - <cd:instances/> + <cd:instances> + <cd:constant value="head"/> + <cd:constant value="label"/> + <cd:constant value="mathlabel"/> + <cd:constant value="taglabel"/> + <cd:constant value="unit"/> + <cd:constant value="operator"/> + <cd:constant value="prefix"/> + <cd:constant value="suffix"/> + <cd:constant value="btxlabel"/> + </cd:instances> </cd:command> - <cd:command file="lang-lab.mkiv" generated="yes" name="presetlabeltext" variant="instance"> + <cd:command category="language" file="lang-lab.mkiv" generated="yes" level="style" name="presetlabeltext" variant="instance"> <cd:sequence> <cd:string value="preset"/> <cd:instance value="label"/> @@ -17190,9 +18165,19 @@ </cd:parameter> </cd:assignments> </cd:arguments> - <cd:instances/> + <cd:instances> + <cd:constant value="head"/> + <cd:constant value="label"/> + <cd:constant value="mathlabel"/> + <cd:constant value="taglabel"/> + <cd:constant value="unit"/> + <cd:constant value="operator"/> + <cd:constant value="prefix"/> + <cd:constant value="suffix"/> + <cd:constant value="btxlabel"/> + </cd:instances> </cd:command> - <cd:command file="lang-lab.mkiv" generated="yes" name="copylabeltext" variant="instance"> + <cd:command category="language" file="lang-lab.mkiv" generated="yes" level="style" name="copylabeltext" variant="instance"> <cd:sequence> <cd:string value="copy"/> <cd:instance value="label"/> @@ -17208,9 +18193,19 @@ </cd:parameter> </cd:assignments> </cd:arguments> - <cd:instances/> + <cd:instances> + <cd:constant value="head"/> + <cd:constant value="label"/> + <cd:constant value="mathlabel"/> + <cd:constant value="taglabel"/> + <cd:constant value="unit"/> + <cd:constant value="operator"/> + <cd:constant value="prefix"/> + <cd:constant value="suffix"/> + <cd:constant value="btxlabel"/> + </cd:instances> </cd:command> - <cd:command file="lang-lab.mkiv" generated="yes" name="labeltext" type="environment" variant="instance"> + <cd:command category="language" file="lang-lab.mkiv" generated="yes" level="style" name="labeltext" type="environment" variant="instance"> <cd:sequence> <cd:instance value="label"/> <cd:string value="text"/> @@ -17223,16 +18218,36 @@ <cd:constant type="cd:key"/> </cd:keywords> </cd:arguments> - <cd:instances/> + <cd:instances> + <cd:constant value="head"/> + <cd:constant value="label"/> + <cd:constant value="mathlabel"/> + <cd:constant value="taglabel"/> + <cd:constant value="unit"/> + <cd:constant value="operator"/> + <cd:constant value="prefix"/> + <cd:constant value="suffix"/> + <cd:constant value="btxlabel"/> + </cd:instances> </cd:command> - <cd:command file="lang-lab.mkiv" generated="yes" name="labellanguage" variant="instance"> + <cd:command category="language" file="lang-lab.mkiv" generated="yes" level="system" name="labellanguage" variant="instance"> <cd:sequence> <cd:instance value="label"/> <cd:string value="language"/> </cd:sequence> - <cd:instances/> + <cd:instances> + <cd:constant value="head"/> + <cd:constant value="label"/> + <cd:constant value="mathlabel"/> + <cd:constant value="taglabel"/> + <cd:constant value="unit"/> + <cd:constant value="operator"/> + <cd:constant value="prefix"/> + <cd:constant value="suffix"/> + <cd:constant value="btxlabel"/> + </cd:instances> </cd:command> - <cd:command file="lang-lab.mkiv" generated="yes" name="labeltext" variant="instance"> + <cd:command category="language" file="lang-lab.mkiv" generated="yes" level="style" name="labeltext" variant="instance"> <cd:sequence> <cd:instance value="label"/> <cd:string value="text"/> @@ -17242,9 +18257,19 @@ <cd:constant type="cd:key"/> </cd:keywords> </cd:arguments> - <cd:instances/> + <cd:instances> + <cd:constant value="head"/> + <cd:constant value="label"/> + <cd:constant value="mathlabel"/> + <cd:constant value="taglabel"/> + <cd:constant value="unit"/> + <cd:constant value="operator"/> + <cd:constant value="prefix"/> + <cd:constant value="suffix"/> + <cd:constant value="btxlabel"/> + </cd:instances> </cd:command> - <cd:command file="lang-lab.mkiv" generated="yes" name="labeltexts" variant="instance"> + <cd:command category="language" file="lang-lab.mkiv" generated="yes" level="style" name="labeltexts" variant="instance"> <cd:sequence> <cd:instance value="label"/> <cd:string value="texts"/> @@ -17257,9 +18282,13 @@ <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> - <cd:instances/> + <cd:instances> + <cd:constant value="head"/> + <cd:constant value="label"/> + <cd:constant value="mathlabel"/> + </cd:instances> </cd:command> - <cd:command file="lang-lab.mkiv" generated="yes" name="leftlabeltext" variant="instance"> + <cd:command category="language" file="lang-lab.mkiv" generated="yes" level="style" name="leftlabeltext" variant="instance"> <cd:sequence> <cd:string value="left"/> <cd:instance value="label"/> @@ -17270,9 +18299,13 @@ <cd:constant type="cd:key"/> </cd:keywords> </cd:arguments> - <cd:instances/> + <cd:instances> + <cd:constant value="head"/> + <cd:constant value="label"/> + <cd:constant value="mathlabel"/> + </cd:instances> </cd:command> - <cd:command file="lang-lab.mkiv" generated="yes" name="rightlabeltext" variant="instance"> + <cd:command category="language" file="lang-lab.mkiv" generated="yes" level="style" name="rightlabeltext" variant="instance"> <cd:sequence> <cd:string value="right"/> <cd:instance value="label"/> @@ -17283,11 +18316,15 @@ <cd:constant type="cd:key"/> </cd:keywords> </cd:arguments> - <cd:instances/> + <cd:instances> + <cd:constant value="head"/> + <cd:constant value="label"/> + <cd:constant value="mathlabel"/> + </cd:instances> </cd:command> </cd:interface> <cd:interface file="i-language.xml"> - <cd:command file="lang-ini.mkiv" name="installlanguage"> + <cd:command category="language" file="lang-ini.mkiv" level="system" name="installlanguage"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -17297,7 +18334,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="lang-ini.mkiv" name="installlanguage" variant="name"> + <cd:command category="language" file="lang-ini.mkiv" level="system" name="installlanguage" variant="name"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -17307,7 +18344,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="lang-ini.mkiv" name="setuplanguage"> + <cd:command category="language" file="lang-ini.mkiv" level="style" name="setuplanguage"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:language"/> @@ -17349,6 +18386,12 @@ <cd:parameter name="font"> <cd:constant type="auto"/> </cd:parameter> + <cd:parameter name="bidi"> + <cd:constant type="left"/> + <cd:constant type="right"/> + <cd:constant type="l2r"/> + <cd:constant type="r2l"/> + </cd:parameter> <cd:parameter name="text"> <cd:constant type="cd:text"/> </cd:parameter> @@ -17410,7 +18453,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="lang-ini.mkiv" name="doifelselanguage"> + <cd:command category="language conditional" file="lang-ini.mkiv" level="system" name="doifelselanguage"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:language"/> @@ -17423,7 +18466,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="lang-ini.mkiv" name="doiflanguageelse"> + <cd:command category="language conditional" file="lang-ini.mkiv" level="system" name="doiflanguageelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:language"/> @@ -17436,7 +18479,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="lang-ini.mkiv" name="doifelsepatterns"> + <cd:command category="language conditional" file="lang-ini.mkiv" level="system" name="doifelsepatterns"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:language"/> @@ -17449,7 +18492,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="lang-ini.mkiv" name="doifpatternselse"> + <cd:command category="language conditional" file="lang-ini.mkiv" level="system" name="doifpatternselse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:language"/> @@ -17462,40 +18505,40 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="lang-ini.mkiv" generated="yes" name="language" variant="example"> + <cd:command category="language" file="lang-ini.mkiv" generated="yes" level="document" name="language" variant="example"> <cd:sequence> <cd:variable value="language"/> </cd:sequence> </cd:command> - <cd:command file="lang-ini.mkiv" name="language"> + <cd:command category="language" file="lang-ini.mkiv" level="document" name="language"> <cd:arguments> <cd:keywords> <cd:constant type="cd:language"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="lang-ini.mkiv" name="mainlanguage"> + <cd:command category="language" file="lang-ini.mkiv" level="style" name="mainlanguage"> <cd:arguments> <cd:keywords> <cd:constant type="cd:language"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="lang-ini.mkiv" name="uselanguageparameter"> + <cd:command category="language" file="lang-ini.mkiv" level="system" name="uselanguageparameter"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="lang-ini.mkiv" name="exceptions" type="environment"> + <cd:command category="language" file="lang-ini.mkiv" level="style" name="exceptions" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:language"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="lang-ini.mkiv" name="currentlanguage"/> - <cd:command file="lang-ini.mkiv" name="currentmainlanguage"/> - <cd:command file="lang-lab.mkiv" name="commalistsentence"> + <cd:command category="language" file="lang-ini.mkiv" level="system" name="currentlanguage"/> + <cd:command category="language" file="lang-ini.mkiv" level="system" name="currentmainlanguage"/> + <cd:command category="language" file="lang-lab.mkiv" level="document" name="commalistsentence"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:text"/> @@ -17507,7 +18550,7 @@ </cd:command> </cd:interface> <cd:interface file="i-layer.xml"> - <cd:command file="pack-box.mkiv" name="setuplayeredtext"> + <cd:command category="background" file="pack-box.mkiv" level="style" name="setuplayeredtext"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -17524,7 +18567,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="pack-box.mkiv" name="layeredtext"> + <cd:command category="background" file="pack-box.mkiv" level="document" name="layeredtext"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setuplayer"/> @@ -17538,7 +18581,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="pack-box.mkiv" name="placelayeredtext"> + <cd:command category="background" file="pack-box.mkiv" level="document" name="placelayeredtext"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -17555,7 +18598,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="pack-box.mkiv" name="setlayerframed"> + <cd:command category="background" file="pack-box.mkiv" level="document" name="setlayerframed"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -17569,7 +18612,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="pack-box.mkiv" name="setlayerframed" variant="combination"> + <cd:command category="background" file="pack-box.mkiv" level="document" name="setlayerframed" variant="combination"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -17581,7 +18624,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="pack-box.mkiv" name="setlayertext"> + <cd:command category="background" file="pack-box.mkiv" level="document" name="setlayertext"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -17609,7 +18652,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="pack-lyr.mkiv" name="definelayer"> + <cd:command category="background" file="pack-lyr.mkiv" level="style" name="definelayer"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -17622,7 +18665,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="pack-lyr.mkiv" name="setuplayer"> + <cd:command category="background" file="pack-lyr.mkiv" level="style" name="setuplayer"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -17752,42 +18795,42 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="pack-lyr.mkiv" name="resetlayer"> + <cd:command category="background" file="pack-lyr.mkiv" level="style" name="resetlayer"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="pack-lyr.mkiv" name="flushlayer"> + <cd:command category="background" file="pack-lyr.mkiv" level="document" name="flushlayer"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="pack-lyr.mkiv" name="tightlayer"> + <cd:command category="background" file="pack-lyr.mkiv" level="document" name="tightlayer"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="pack-lyr.mkiv" name="placelayer"> + <cd:command category="background" file="pack-lyr.mkiv" level="document" name="placelayer"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="pack-lyr.mkiv" name="composedlayer"> + <cd:command category="background" file="pack-lyr.mkiv" level="document" name="composedlayer"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="pack-lyr.mkiv" name="setlayer"> + <cd:command category="background" file="pack-lyr.mkiv" level="document" name="setlayer"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -17804,7 +18847,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="pack-lyr.mkiv" name="definelayerpreset"> + <cd:command category="background" file="pack-lyr.mkiv" level="system" name="definelayerpreset"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -17814,7 +18857,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="pack-lyr.mkiv" name="definelayerpreset" variant="name"> + <cd:command category="background" file="pack-lyr.mkiv" level="system" name="definelayerpreset" variant="name"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -17824,7 +18867,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="pack-lyr.mkiv" name="doifelselayerdata"> + <cd:command category="background conditional" file="pack-lyr.mkiv" level="system" name="doifelselayerdata"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -17837,7 +18880,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="pack-lyr.mkiv" name="doiflayerdataelse"> + <cd:command category="background conditional" file="pack-lyr.mkiv" level="system" name="doiflayerdataelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -17850,9 +18893,9 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="pack-lyr.mkiv" name="layerwidth"/> - <cd:command file="pack-lyr.mkiv" name="layerheight"/> - <cd:command file="pack-lyr.mkiv" name="setMPlayer"> + <cd:command category="background" file="pack-lyr.mkiv" level="system" name="layerwidth"/> + <cd:command category="background" file="pack-lyr.mkiv" level="system" name="layerheight"/> + <cd:command category="background metapost" file="pack-lyr.mkiv" level="document" name="setMPlayer"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -17866,7 +18909,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="pack-lyr.mkiv" name="getMPlayer"> + <cd:command category="background metapost" file="pack-lyr.mkiv" level="document" name="getMPlayer"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -17879,7 +18922,7 @@ </cd:command> </cd:interface> <cd:interface file="i-layout.xml"> - <cd:command file="page-lay.mkiv" name="definelayout"> + <cd:command category="layout" file="page-lay.mkiv" level="style" name="definelayout"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -17892,7 +18935,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-lay.mkiv" name="setuplayout"> + <cd:command category="layout" file="page-lay.mkiv" level="style" name="setuplayout"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -18090,7 +19133,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-lay.mkiv" name="setuplayout" variant="name"> + <cd:command category="layout" file="page-lay.mkiv" level="style" name="setuplayout" variant="name"> <cd:arguments> <cd:keywords> <cd:constant type="reset"/> @@ -18098,7 +19141,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-lay.mkiv" name="doifelselayoutdefined"> + <cd:command category="layout conditional" file="page-lay.mkiv" level="system" name="doifelselayoutdefined"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -18111,7 +19154,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-lay.mkiv" name="doiflayoutdefinedelse"> + <cd:command category="layout conditional" file="page-lay.mkiv" level="system" name="doiflayoutdefinedelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -18124,7 +19167,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-lay.mkiv" name="adaptlayout"> + <cd:command category="layout" file="page-lay.mkiv" level="style" name="adaptlayout"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:number"/> @@ -18140,14 +19183,14 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-lay.mkiv" name="layout" type="environment"> + <cd:command category="layout" file="page-lay.mkiv" level="document" name="layout" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-lay.mkiv" name="doifelseoddpage"> + <cd:command category="layout conditional" file="page-lay.mkiv" level="system" name="doifelseoddpage"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:command"/> @@ -18157,7 +19200,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-lay.mkiv" name="doifoddpageelse"> + <cd:command category="layout conditional" file="page-lay.mkiv" level="system" name="doifoddpageelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:command"/> @@ -18167,7 +19210,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-lay.mkiv" name="doifbothsidesoverruled"> + <cd:command category="layout conditional" file="page-lay.mkiv" level="system" name="doifbothsidesoverruled"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:command"/> @@ -18180,7 +19223,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-lay.mkiv" name="doifbothsides"> + <cd:command category="layout conditional" file="page-lay.mkiv" level="system" name="doifbothsides"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:command"/> @@ -18193,7 +19236,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-lay.mkiv" name="rightorleftpageaction"> + <cd:command category="layout conditional" file="page-lay.mkiv" level="system" name="rightorleftpageaction"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:command"/> @@ -18203,7 +19246,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-run.mkiv" name="showprint"> + <cd:command category="layout" file="page-run.mkiv" level="document" name="showprint"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:inherit name="setuppapersize"/> @@ -18216,7 +19259,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-run.mkiv" name="showframe"> + <cd:command category="layout" file="page-run.mkiv" level="document" name="showframe"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="top"/> @@ -18234,7 +19277,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-run.mkiv" name="showsetups"> + <cd:command category="layout" file="page-run.mkiv" level="document" name="showsetups"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant default="yes" type="pt"/> @@ -18251,7 +19294,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-run.mkiv" name="showlayout"> + <cd:command category="layout" file="page-run.mkiv" level="document" name="showlayout"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant default="yes" type="pt"/> @@ -18268,11 +19311,31 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-run.mkiv" name="showmargins"/> - <cd:command file="page-spr.mkiv" name="spread" type="environment"/> + <cd:command category="layout" file="page-run.mkiv" level="document" name="showmargins"/> + <cd:command category="layout" file="page-spr.mkiv" level="document" name="spread" type="environment"/> + <cd:command category="layout conditional" file="page-lay.mkiv" level="system" name="doifelsetopofpage"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:true"/> + </cd:keywords> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:false"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command category="layout conditional" file="page-lay.mkiv" level="system" name="doiftopofpageelse"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:true"/> + </cd:keywords> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:false"/> + </cd:keywords> + </cd:arguments> + </cd:command> </cd:interface> <cd:interface file="i-linenumber.xml"> - <cd:command file="page-lin.mkvi" name="definelinenumbering"> + <cd:command category="structure" file="page-lin.mkvi" level="style" name="definelinenumbering"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -18285,7 +19348,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-lin.mkvi" name="setuplinenumbering"> + <cd:command category="structure" file="page-lin.mkvi" level="style" name="setuplinenumbering"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -18362,7 +19425,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-lin.mkvi" name="linenumbering" type="environment"> + <cd:command category="structure" file="page-lin.mkvi" level="document" name="linenumbering" type="environment"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -18386,7 +19449,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-lin.mkvi" name="linenumbering" type="environment" variant="argument"> + <cd:command category="structure" file="page-lin.mkvi" level="document" name="linenumbering" type="environment" variant="argument"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -18397,28 +19460,28 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-lin.mkvi" name="someline"> + <cd:command category="structure" file="page-lin.mkvi" level="document" name="someline"> <cd:arguments> <cd:keywords> <cd:constant type="cd:reference"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-lin.mkvi" name="startline"> + <cd:command category="structure" file="page-lin.mkvi" level="document" name="startline"> <cd:arguments> <cd:keywords> <cd:constant type="cd:reference"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-lin.mkvi" name="stopline"> + <cd:command category="structure" file="page-lin.mkvi" level="document" name="stopline"> <cd:arguments> <cd:keywords> <cd:constant type="cd:reference"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-lin.mkvi" name="doifelsesamelinereference"> + <cd:command category="structure conditional" file="page-lin.mkvi" level="system" name="doifelsesamelinereference"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:reference"/> @@ -18431,7 +19494,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-lin.mkvi" name="doifsamelinereferenceelse"> + <cd:command category="structure conditional" file="page-lin.mkvi" level="system" name="doifsamelinereferenceelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:reference"/> @@ -18444,7 +19507,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-lin.mkvi" name="inline"> + <cd:command category="structure" file="page-lin.mkvi" level="document" name="inline"> <cd:arguments> <cd:keywords delimiters="braces" optional="yes"> <cd:constant type="cd:text"/> @@ -18454,7 +19517,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-lin.mkvi" name="inlinerange"> + <cd:command category="structure" file="page-lin.mkvi" level="document" name="inlinerange"> <cd:arguments> <cd:keywords> <cd:constant type="cd:reference"/> @@ -18463,34 +19526,34 @@ </cd:command> </cd:interface> <cd:interface file="i-lines.xml"> - <cd:command file="supp-box.mkiv" name="noflines"/> - <cd:command file="supp-box.mkiv" name="getnoflines"> + <cd:command file="supp-box.mkiv" level="system" name="noflines"/> + <cd:command file="supp-box.mkiv" level="system" name="getnoflines"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:dimension"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="getroundednoflines"> + <cd:command file="supp-box.mkiv" level="system" name="getroundednoflines"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:dimension"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="getrawnoflines"> + <cd:command file="supp-box.mkiv" level="system" name="getrawnoflines"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:dimension"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="determinenoflines"> + <cd:command file="supp-box.mkiv" level="system" name="determinenoflines"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="spac-lin.mkiv" name="definelines"> + <cd:command file="spac-lin.mkiv" level="style" name="definelines"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -18503,7 +19566,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="spac-lin.mkiv" name="setuplines"> + <cd:command file="spac-lin.mkiv" level="style" name="setuplines"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -18553,7 +19616,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="spac-lin.mkiv" generated="yes" name="lines" type="environment" variant="instance"> + <cd:command file="spac-lin.mkiv" generated="yes" level="document" name="lines" type="environment" variant="instance"> <cd:sequence> <cd:instance value="lines"/> </cd:sequence> @@ -18562,9 +19625,11 @@ <cd:inherit name="setuplines"/> </cd:assignments> </cd:arguments> - <cd:instances/> + <cd:instances> + <cd:constant value="lines"/> + </cd:instances> </cd:command> - <cd:command file="spac-lin.mkiv" name="emptylines"> + <cd:command file="spac-lin.mkiv" level="document" name="emptylines"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:number"/> @@ -18573,7 +19638,7 @@ </cd:command> </cd:interface> <cd:interface file="i-linetable.xml"> - <cd:command file="tabl-ltb.mkiv" name="setuplinetable"> + <cd:command category="tables" file="tabl-ltb.mkiv" level="style" name="setuplinetable"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="r"/> @@ -18665,24 +19730,24 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="tabl-ltb.mkiv" name="linetablecell" type="environment"> + <cd:command category="tables" file="tabl-ltb.mkiv" level="document" name="linetablecell" type="environment"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setuplinetable"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="tabl-ltb.mkiv" name="linetable" type="environment"/> - <cd:command file="tabl-ltb.mkiv" name="linetablehead" type="environment"/> - <cd:command file="tabl-ltb.mkiv" name="linetablebody" type="environment"/> - <cd:command file="tabl-ltb.mkiv" name="processlinetablebuffer"> + <cd:command category="tables" file="tabl-ltb.mkiv" level="document" name="linetable" type="environment"/> + <cd:command category="tables" file="tabl-ltb.mkiv" level="document" name="linetablehead" type="environment"/> + <cd:command category="tables" file="tabl-ltb.mkiv" level="document" name="linetablebody" type="environment"/> + <cd:command category="tables buffer" file="tabl-ltb.mkiv" level="document" name="processlinetablebuffer"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:buffer"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="tabl-ltb.mkiv" name="processlinetablefile"> + <cd:command category="tables" file="tabl-ltb.mkiv" level="document" name="processlinetablefile"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:file"/> @@ -18691,7 +19756,7 @@ </cd:command> </cd:interface> <cd:interface file="i-linewidth.xml"> - <cd:command file="pack-rul.mkiv" name="setuplinewidth"> + <cd:command category="layout" file="pack-rul.mkiv" level="style" name="setuplinewidth"> <cd:arguments> <cd:keywords> <cd:constant type="small"/> @@ -18701,10 +19766,10 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="pack-rul.mkiv" name="linewidth"/> + <cd:command category="layout" file="pack-rul.mkiv" level="style" name="linewidth"/> </cd:interface> <cd:interface file="i-list.xml"> - <cd:command file="strc-lst.mkvi" name="definelist"> + <cd:command category="structure" file="strc-lst.mkvi" level="style" name="definelist"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -18717,7 +19782,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-lst.mkvi" name="setuplist"> + <cd:command category="structure" file="strc-lst.mkvi" level="style" name="setuplist"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:list"/> @@ -18978,7 +20043,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-lst.mkvi" name="doifelselist"> + <cd:command category="structure conditional" file="strc-lst.mkvi" level="system" name="doifelselist"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:list"/> @@ -18991,7 +20056,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-lst.mkvi" name="doiflistelse"> + <cd:command category="structure conditional" file="strc-lst.mkvi" level="system" name="doiflistelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:list"/> @@ -19004,7 +20069,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-lst.mkvi" name="writebetweenlist"> + <cd:command category="structure" file="strc-lst.mkvi" level="document" name="writebetweenlist"> <cd:arguments> <cd:keywords> <cd:constant type="cd:list"/> @@ -19017,7 +20082,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-lst.mkvi" name="writedatatolist"> + <cd:command category="structure" file="strc-lst.mkvi" level="document" name="writedatatolist"> <cd:arguments> <cd:keywords> <cd:constant type="cd:list"/> @@ -19032,7 +20097,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-lst.mkvi" name="writetolist"> + <cd:command category="structure" file="strc-lst.mkvi" level="document" name="writetolist"> <cd:arguments> <cd:keywords> <cd:constant type="cd:list"/> @@ -19048,7 +20113,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-lst.mkvi" name="placelist"> + <cd:command category="structure" file="strc-lst.mkvi" level="document" name="placelist"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:list"/> @@ -19058,7 +20123,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-lst.mkvi" name="placerawlist"> + <cd:command category="structure" file="strc-lst.mkvi" level="style" name="placerawlist"> <cd:arguments> <cd:keywords> <cd:constant type="cd:list"/> @@ -19068,7 +20133,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-lst.mkvi" name="completelist"> + <cd:command category="structure" file="strc-lst.mkvi" level="document" name="completelist"> <cd:arguments> <cd:keywords> <cd:constant type="cd:list"/> @@ -19078,7 +20143,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-lst.mkvi" name="definecombinedlist"> + <cd:command category="structure" file="strc-lst.mkvi" level="style" name="definecombinedlist"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -19091,7 +20156,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-lst.mkvi" name="setupcombinedlist"> + <cd:command category="structure" file="strc-lst.mkvi" level="style" name="setupcombinedlist"> <cd:arguments> <cd:keywords> <cd:constant type="cd:list"/> @@ -19101,7 +20166,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-lst.mkvi" name="placecombinedlist"> + <cd:command category="structure" file="strc-lst.mkvi" level="document" name="placecombinedlist"> <cd:arguments> <cd:keywords> <cd:constant type="cd:list"/> @@ -19111,7 +20176,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-lst.mkvi" generated="yes" name="setupcombinedlist" variant="instance"> + <cd:command category="structure" file="strc-lst.mkvi" generated="yes" level="style" name="setupcombinedlist" variant="instance"> <cd:sequence> <cd:string value="setup"/> <cd:instance value="combinedlist"/> @@ -19121,9 +20186,11 @@ <cd:inherit name="setuplist"/> </cd:assignments> </cd:arguments> - <cd:instances/> + <cd:instances> + <cd:constant value="content"/> + </cd:instances> </cd:command> - <cd:command file="strc-lst.mkvi" generated="yes" name="placecombinedlist" variant="instance"> + <cd:command category="structure" file="strc-lst.mkvi" generated="yes" level="document" name="placecombinedlist" variant="instance"> <cd:sequence> <cd:string value="place"/> <cd:instance value="combinedlist"/> @@ -19133,9 +20200,11 @@ <cd:inherit name="setuplist"/> </cd:assignments> </cd:arguments> - <cd:instances/> + <cd:instances> + <cd:constant value="content"/> + </cd:instances> </cd:command> - <cd:command file="strc-lst.mkvi" generated="yes" name="completecombinedlist" variant="instance"> + <cd:command category="structure" file="strc-lst.mkvi" generated="yes" level="document" name="completecombinedlist" variant="instance"> <cd:sequence> <cd:string value="complete"/> <cd:instance value="combinedlist"/> @@ -19145,23 +20214,25 @@ <cd:inherit name="setuplist"/> </cd:assignments> </cd:arguments> - <cd:instances/> + <cd:instances> + <cd:constant value="content"/> + </cd:instances> </cd:command> - <cd:command file="strc-lst.mkvi" name="structurelistuservariable"> + <cd:command category="structure" file="strc-lst.mkvi" level="style" name="structurelistuservariable"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:key"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-lst.mkvi" name="rawstructurelistuservariable"> + <cd:command category="structure" file="strc-lst.mkvi" level="system" name="rawstructurelistuservariable"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:key"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-lst.mkvi" name="doifelsestructurelisthaspage"> + <cd:command category="structure conditional" file="strc-lst.mkvi" level="system" name="doifelsestructurelisthaspage"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:true"/> @@ -19171,7 +20242,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-lst.mkvi" name="doifstructurelisthaspageelse"> + <cd:command category="structure conditional" file="strc-lst.mkvi" level="system" name="doifstructurelisthaspageelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:true"/> @@ -19181,7 +20252,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-lst.mkvi" name="doifelsestructurelisthasnumber"> + <cd:command category="structure conditional" file="strc-lst.mkvi" level="system" name="doifelsestructurelisthasnumber"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:true"/> @@ -19191,7 +20262,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-lst.mkvi" name="doifstructurelisthasnumberelse"> + <cd:command category="structure conditional" file="strc-lst.mkvi" level="system" name="doifstructurelisthasnumberelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:true"/> @@ -19201,7 +20272,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-lst.mkvi" name="definelistextra"> + <cd:command category="structure" file="strc-lst.mkvi" level="style" name="definelistextra"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -19214,7 +20285,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-lst.mkvi" name="setuplistextra"> + <cd:command category="structure" file="strc-lst.mkvi" level="style" name="setuplistextra"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -19229,7 +20300,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-lst.mkvi" name="definelistalternative"> + <cd:command category="structure" file="strc-lst.mkvi" level="style" name="definelistalternative"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -19242,7 +20313,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-lst.mkvi" name="setuplistalternative"> + <cd:command category="structure" file="strc-lst.mkvi" level="style" name="setuplistalternative"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -19275,7 +20346,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-lst.mkvi" name="determinelistcharacteristics"> + <cd:command category="structure" file="strc-lst.mkvi" level="system" name="determinelistcharacteristics"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:list"/> @@ -19285,14 +20356,14 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-lst.mkvi" name="currentlistentrynumber"/> - <cd:command file="strc-lst.mkvi" name="currentlistentrytitle"/> - <cd:command file="strc-lst.mkvi" name="currentlistentrytitlerendered"/> - <cd:command file="strc-lst.mkvi" name="currentlistentrypagenumber"/> - <cd:command file="strc-lst.mkvi" name="currentlistsymbol"/> - <cd:command file="strc-lst.mkvi" name="listlength"/> - <cd:command file="strc-lst.mkvi" name="currentlistentrywrapper" type="environment"/> - <cd:command file="strc-lst.mkvi" name="currentlistentryreferenceattribute"> + <cd:command category="structure" file="strc-lst.mkvi" level="style" name="currentlistentrynumber"/> + <cd:command category="structure" file="strc-lst.mkvi" level="style" name="currentlistentrytitle"/> + <cd:command category="structure" file="strc-lst.mkvi" level="style" name="currentlistentrytitlerendered"/> + <cd:command category="structure" file="strc-lst.mkvi" level="style" name="currentlistentrypagenumber"/> + <cd:command category="structure" file="strc-lst.mkvi" level="system" name="currentlistsymbol"/> + <cd:command category="structure" file="strc-lst.mkvi" level="system" name="listlength"/> + <cd:command category="structure" file="strc-lst.mkvi" level="system" name="currentlistentrywrapper" type="environment"/> + <cd:command category="structure" file="strc-lst.mkvi" level="system" name="currentlistentryreferenceattribute"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="number"/> @@ -19302,8 +20373,8 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-lst.mkvi" name="currentlistentrydestinationattribute"/> - <cd:command file="strc-lst.mkvi" name="currentlistentrylimitedtext"> + <cd:command category="structure" file="strc-lst.mkvi" level="system" name="currentlistentrydestinationattribute"/> + <cd:command category="structure" file="strc-lst.mkvi" level="system" name="currentlistentrylimitedtext"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -19312,58 +20383,58 @@ </cd:command> </cd:interface> <cd:interface file="i-logo.xml"> - <cd:command file="cont-log.mkiv" name="TeX"/> - <cd:command file="cont-log.mkiv" name="ConTeXt"/> - <cd:command file="cont-log.mkiv" name="PPCHTeX"/> - <cd:command file="cont-log.mkiv" name="PRAGMA"/> - <cd:command file="cont-log.mkiv" name="LaTeX"/> - <cd:command file="cont-log.mkiv" name="TaBlE"/> - <cd:command file="cont-log.mkiv" name="PiCTeX"/> - <cd:command file="cont-log.mkiv" name="AmSTeX"/> - <cd:command file="cont-log.mkiv" name="LamSTeX"/> - <cd:command file="cont-log.mkiv" name="Context"/> - <cd:command file="cont-log.mkiv" name="MetaFont"/> - <cd:command file="cont-log.mkiv" name="MetaPost"/> - <cd:command file="cont-log.mkiv" name="MetaFun"/> - <cd:command file="cont-log.mkiv" name="eTeX"/> - <cd:command file="cont-log.mkiv" name="pdfTeX"/> - <cd:command file="cont-log.mkiv" name="pdfeTeX"/> - <cd:command file="cont-log.mkiv" name="Lua"/> - <cd:command file="cont-log.mkiv" name="luaTeX"/> - <cd:command file="cont-log.mkiv" name="luajitTeX"/> - <cd:command file="cont-log.mkiv" name="metaTeX"/> - <cd:command file="cont-log.mkiv" name="XeTeX"/> - <cd:command file="cont-log.mkiv" name="LuaTeX"/> - <cd:command file="cont-log.mkiv" name="LuajitTeX"/> - <cd:command file="cont-log.mkiv" name="MKII"/> - <cd:command file="cont-log.mkiv" name="MKIV"/> - <cd:command file="cont-log.mkiv" name="MKVI"/> - <cd:command file="cont-log.mkiv" name="MKIX"/> - <cd:command file="cont-log.mkiv" name="MKXI"/> - <cd:command file="cont-log.mkiv" name="MPII"/> - <cd:command file="cont-log.mkiv" name="MPIV"/> - <cd:command file="cont-log.mkiv" name="MPVI"/> - <cd:command file="cont-log.mkiv" name="METAFONT"/> - <cd:command file="cont-log.mkiv" name="METAPOST"/> - <cd:command file="cont-log.mkiv" name="PPCHTEX"/> - <cd:command file="cont-log.mkiv" name="CONTEXT"/> - <cd:command file="cont-log.mkiv" name="METAFUN"/> - <cd:command file="cont-log.mkiv" name="TEX"/> - <cd:command file="cont-log.mkiv" name="LATEX"/> - <cd:command file="cont-log.mkiv" name="PICTEX"/> - <cd:command file="cont-log.mkiv" name="TABLE"/> - <cd:command file="cont-log.mkiv" name="AMSTEX"/> - <cd:command file="cont-log.mkiv" name="LAMSTEX"/> - <cd:command file="cont-log.mkiv" name="INRSTEX"/> - <cd:command file="cont-log.mkiv" name="ETEX"/> - <cd:command file="cont-log.mkiv" name="PDFTEX"/> - <cd:command file="cont-log.mkiv" name="PDFETEX"/> - <cd:command file="cont-log.mkiv" name="LUATEX"/> - <cd:command file="cont-log.mkiv" name="LUAJITTEX"/> - <cd:command file="cont-log.mkiv" name="XETEX"/> + <cd:command category="symbols" file="cont-log.mkiv" level="document" name="TeX"/> + <cd:command category="symbols" file="cont-log.mkiv" level="document" name="ConTeXt"/> + <cd:command category="symbols" file="cont-log.mkiv" level="document" name="PPCHTeX"/> + <cd:command category="symbols" file="cont-log.mkiv" level="document" name="PRAGMA"/> + <cd:command category="symbols" file="cont-log.mkiv" level="document" name="LaTeX"/> + <cd:command category="symbols" file="cont-log.mkiv" level="document" name="TaBlE"/> + <cd:command category="symbols" file="cont-log.mkiv" level="document" name="PiCTeX"/> + <cd:command category="symbols" file="cont-log.mkiv" level="document" name="AmSTeX"/> + <cd:command category="symbols" file="cont-log.mkiv" level="document" name="LamSTeX"/> + <cd:command category="symbols" file="cont-log.mkiv" level="document" name="Context"/> + <cd:command category="symbols" file="cont-log.mkiv" level="document" name="MetaFont"/> + <cd:command category="symbols" file="cont-log.mkiv" level="document" name="MetaPost"/> + <cd:command category="symbols" file="cont-log.mkiv" level="document" name="MetaFun"/> + <cd:command category="symbols" file="cont-log.mkiv" level="document" name="eTeX"/> + <cd:command category="symbols" file="cont-log.mkiv" level="document" name="pdfTeX"/> + <cd:command category="symbols" file="cont-log.mkiv" level="document" name="pdfeTeX"/> + <cd:command category="symbols" file="cont-log.mkiv" level="document" name="Lua"/> + <cd:command category="symbols" file="cont-log.mkiv" level="document" name="luaTeX"/> + <cd:command category="symbols" file="cont-log.mkiv" level="document" name="luajitTeX"/> + <cd:command category="symbols" file="cont-log.mkiv" level="document" name="metaTeX"/> + <cd:command category="symbols" file="cont-log.mkiv" level="document" name="XeTeX"/> + <cd:command category="symbols" file="cont-log.mkiv" level="document" name="LuaTeX"/> + <cd:command category="symbols" file="cont-log.mkiv" level="document" name="LuajitTeX"/> + <cd:command category="symbols" file="cont-log.mkiv" level="document" name="MKII"/> + <cd:command category="symbols" file="cont-log.mkiv" level="document" name="MKIV"/> + <cd:command category="symbols" file="cont-log.mkiv" level="document" name="MKVI"/> + <cd:command category="symbols" file="cont-log.mkiv" level="document" name="MKIX"/> + <cd:command category="symbols" file="cont-log.mkiv" level="document" name="MKXI"/> + <cd:command category="symbols" file="cont-log.mkiv" level="document" name="MPII"/> + <cd:command category="symbols" file="cont-log.mkiv" level="document" name="MPIV"/> + <cd:command category="symbols" file="cont-log.mkiv" level="document" name="MPVI"/> + <cd:command category="symbols" file="cont-log.mkiv" level="document" name="METAFONT"/> + <cd:command category="symbols" file="cont-log.mkiv" level="document" name="METAPOST"/> + <cd:command category="symbols" file="cont-log.mkiv" level="document" name="PPCHTEX"/> + <cd:command category="symbols" file="cont-log.mkiv" level="document" name="CONTEXT"/> + <cd:command category="symbols" file="cont-log.mkiv" level="document" name="METAFUN"/> + <cd:command category="symbols" file="cont-log.mkiv" level="document" name="TEX"/> + <cd:command category="symbols" file="cont-log.mkiv" level="document" name="LATEX"/> + <cd:command category="symbols" file="cont-log.mkiv" level="document" name="PICTEX"/> + <cd:command category="symbols" file="cont-log.mkiv" level="document" name="TABLE"/> + <cd:command category="symbols" file="cont-log.mkiv" level="document" name="AMSTEX"/> + <cd:command category="symbols" file="cont-log.mkiv" level="document" name="LAMSTEX"/> + <cd:command category="symbols" file="cont-log.mkiv" level="document" name="INRSTEX"/> + <cd:command category="symbols" file="cont-log.mkiv" level="document" name="ETEX"/> + <cd:command category="symbols" file="cont-log.mkiv" level="document" name="PDFTEX"/> + <cd:command category="symbols" file="cont-log.mkiv" level="document" name="PDFETEX"/> + <cd:command category="symbols" file="cont-log.mkiv" level="document" name="LUATEX"/> + <cd:command category="symbols" file="cont-log.mkiv" level="document" name="LUAJITTEX"/> + <cd:command category="symbols" file="cont-log.mkiv" level="document" name="XETEX"/> </cd:interface> <cd:interface file="i-lohi.xml"> - <cd:command file="typo-scr.mkiv" name="definelow"> + <cd:command category="fonts" file="typo-scr.mkiv" level="style" name="definelow"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -19376,7 +20447,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="typo-scr.mkiv" name="setuplow"> + <cd:command category="fonts" file="typo-scr.mkiv" level="style" name="setuplow"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -19398,21 +20469,23 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="typo-scr.mkiv" generated="yes" name="low" variant="instance"> + <cd:command category="fonts" file="typo-scr.mkiv" generated="yes" level="document" name="low" variant="instance"> <cd:sequence> <cd:instance value="low"/> </cd:sequence> <cd:arguments> <cd:content/> </cd:arguments> - <cd:instances/> + <cd:instances> + <cd:constant value="unitslow"/> + </cd:instances> </cd:command> - <cd:command file="typo-scr.mkiv" name="low"> + <cd:command category="fonts" file="typo-scr.mkiv" level="document" name="low"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="typo-scr.mkiv" name="definehigh"> + <cd:command category="fonts" file="typo-scr.mkiv" level="style" name="definehigh"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -19425,7 +20498,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="typo-scr.mkiv" name="setuphigh"> + <cd:command category="fonts" file="typo-scr.mkiv" level="style" name="setuphigh"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -19447,21 +20520,23 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="typo-scr.mkiv" generated="yes" name="high" variant="instance"> + <cd:command category="fonts" file="typo-scr.mkiv" generated="yes" level="document" name="high" variant="instance"> <cd:sequence> <cd:instance value="high"/> </cd:sequence> <cd:arguments> <cd:content/> </cd:arguments> - <cd:instances/> + <cd:instances> + <cd:constant value="unitshigh"/> + </cd:instances> </cd:command> - <cd:command file="typo-scr.mkiv" name="high"> + <cd:command category="fonts" file="typo-scr.mkiv" level="document" name="high"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="typo-scr.mkiv" name="definelowhigh"> + <cd:command category="fonts" file="typo-scr.mkiv" level="style" name="definelowhigh"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -19474,7 +20549,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="typo-scr.mkiv" name="setuplowhigh"> + <cd:command category="fonts" file="typo-scr.mkiv" level="style" name="setuplowhigh"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -19499,7 +20574,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="typo-scr.mkiv" generated="yes" name="lowhigh" variant="instance"> + <cd:command category="fonts" file="typo-scr.mkiv" generated="yes" level="document" name="lowhigh" variant="instance"> <cd:sequence> <cd:instance value="lowhigh"/> </cd:sequence> @@ -19512,7 +20587,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="typo-scr.mkiv" name="lohi"> + <cd:command category="fonts" file="typo-scr.mkiv" level="document" name="lohi"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="left"/> @@ -19522,7 +20597,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="typo-scr.mkiv" name="hilo"> + <cd:command category="fonts" file="typo-scr.mkiv" level="document" name="hilo"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="left"/> @@ -19532,7 +20607,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="typo-scr.mkiv" name="definelowmidhigh"> + <cd:command category="fonts" file="typo-scr.mkiv" level="style" name="definelowmidhigh"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -19545,7 +20620,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="typo-scr.mkiv" name="setuplowmidhigh"> + <cd:command category="fonts" file="typo-scr.mkiv" level="style" name="setuplowmidhigh"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -19567,7 +20642,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="typo-scr.mkiv" generated="yes" name="lowmidhigh" variant="instance"> + <cd:command category="fonts" file="typo-scr.mkiv" generated="yes" level="document" name="lowmidhigh" variant="instance"> <cd:sequence> <cd:instance value="lowmidhigh"/> </cd:sequence> @@ -19577,14 +20652,14 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="typo-scr.mkiv" name="lomihi"> + <cd:command category="fonts" file="typo-scr.mkiv" level="document" name="lomihi"> <cd:arguments> <cd:content/> <cd:content/> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="typo-scr.mkiv" name="himilo"> + <cd:command category="fonts" file="typo-scr.mkiv" level="document" name="himilo"> <cd:arguments> <cd:content/> <cd:content/> @@ -19593,127 +20668,127 @@ </cd:command> </cd:interface> <cd:interface file="i-lua.xml"> - <cd:command file="back-exp.mkiv" name="taggedctxcommand"> + <cd:command category="lua" file="back-exp.mkiv" level="system" name="taggedctxcommand"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:command"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="cldf-ini.mkiv" name="luafunction"> + <cd:command category="lua" file="cldf-ini.mkiv" level="system" name="luafunction"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:command"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="cldf-ini.mkiv" name="cldprocessfile"> + <cd:command category="lua" file="cldf-ini.mkiv" level="system" name="cldprocessfile"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:file"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="cldf-ini.mkiv" name="cldloadfile"> + <cd:command category="lua" file="cldf-ini.mkiv" level="system" name="cldloadfile"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:file"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="cldf-ini.mkiv" name="cldcontext"> + <cd:command category="lua" file="cldf-ini.mkiv" level="system" name="cldcontext"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:command"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="cldf-ini.mkiv" name="cldcommand"> + <cd:command category="lua" file="cldf-ini.mkiv" level="system" name="cldcommand"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:command"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="luat-cod.mkiv" name="ctxdirectlua"> + <cd:command category="lua" file="luat-cod.mkiv" level="system" name="ctxdirectlua"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:command"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="luat-cod.mkiv" name="ctxlatelua"> + <cd:command category="lua" file="luat-cod.mkiv" level="system" name="ctxlatelua"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:command"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="luat-cod.mkiv" name="ctxsprint"> + <cd:command category="lua" file="luat-cod.mkiv" level="system" name="ctxsprint"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:command"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="luat-cod.mkiv" name="ctxcommand"> + <cd:command category="lua" file="luat-cod.mkiv" level="system" name="ctxcommand"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:command"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="luat-cod.mkiv" name="ctxdirectcommand"> + <cd:command category="lua" file="luat-cod.mkiv" level="system" name="ctxdirectcommand"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:command"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="luat-cod.mkiv" name="ctxlatecommand"> + <cd:command category="lua" file="luat-cod.mkiv" level="system" name="ctxlatecommand"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:command"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="luat-cod.mkiv" name="ctxreport"> + <cd:command category="lua" file="luat-cod.mkiv" level="system" name="ctxreport"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:command"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="luat-cod.mkiv" name="ctxlua"> + <cd:command category="lua" file="luat-cod.mkiv" level="system" name="ctxlua"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:command"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="luat-cod.mkiv" name="luacode"> + <cd:command category="lua" file="luat-cod.mkiv" level="system" name="luacode"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:command"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="luat-cod.mkiv" name="lateluacode"> + <cd:command category="lua" file="luat-cod.mkiv" level="system" name="lateluacode"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:command"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="luat-cod.mkiv" name="directluacode"> + <cd:command category="lua" file="luat-cod.mkiv" level="system" name="directluacode"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:command"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="luat-cod.mkiv" name="luaversion"/> - <cd:command file="luat-cod.mkiv" name="registerctxluafile"> + <cd:command category="lua" file="luat-cod.mkiv" level="system" name="luaversion"/> + <cd:command category="lua" file="luat-cod.mkiv" level="system" name="registerctxluafile"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:file"/> @@ -19723,32 +20798,32 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="luat-cod.mkiv" name="ctxloadluafile"> + <cd:command category="lua" file="luat-cod.mkiv" level="system" name="ctxloadluafile"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:file"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="luat-ini.mkiv" name="lua" type="environment"/> - <cd:command file="luat-ini.mkiv" name="luacode" type="environment"/> - <cd:command file="luat-ini.mkiv" name="luamajorversion"/> - <cd:command file="luat-ini.mkiv" name="luaminorversion"/> - <cd:command file="luat-ini.mkiv" name="luaexpanded"> + <cd:command category="lua" file="luat-ini.mkiv" level="system" name="lua" type="environment"/> + <cd:command category="lua" file="luat-ini.mkiv" level="system" name="luacode" type="environment"/> + <cd:command category="lua" file="luat-ini.mkiv" level="system" name="luamajorversion"/> + <cd:command category="lua" file="luat-ini.mkiv" level="system" name="luaminorversion"/> + <cd:command category="lua" file="luat-ini.mkiv" level="system" name="luaexpanded"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:command"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="luat-ini.mkiv" name="luaparameterset" type="environment"> + <cd:command category="lua" file="luat-ini.mkiv" level="system" name="luaparameterset" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="luat-ini.mkiv" name="luaparameterset"> + <cd:command category="lua" file="luat-ini.mkiv" level="system" name="luaparameterset"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -19756,52 +20831,52 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="luat-ini.mkiv" name="luaconditional"> + <cd:command category="lua" file="luat-ini.mkiv" level="system" name="luaconditional"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="luat-ini.mkiv" name="ctxluacode"> + <cd:command category="lua" file="luat-ini.mkiv" level="system" name="ctxluacode"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:command"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="luat-ini.mkiv" name="ctxfunctiondefinition" type="environment"> + <cd:command category="lua" file="luat-ini.mkiv" level="system" name="ctxfunctiondefinition" type="environment"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="luat-ini.mkiv" generated="yes" name="ctxfunctiondefinition" variant="example"> + <cd:command category="lua" file="luat-ini.mkiv" generated="yes" level="system" name="ctxfunctiondefinition" variant="example"> <cd:sequence> <cd:variable value="ctxfunctiondefinition"/> </cd:sequence> </cd:command> - <cd:command file="luat-ini.mkiv" name="ctxfunction" type="environment"> + <cd:command category="lua" file="luat-ini.mkiv" level="system" name="ctxfunction" type="environment"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="luat-ini.mkiv" name="ctxfunction"> + <cd:command category="lua" file="luat-ini.mkiv" level="system" name="ctxfunction"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="luat-ini.mkiv" generated="yes" name="ctxfunction" variant="example"> + <cd:command category="lua" file="luat-ini.mkiv" generated="yes" level="system" name="ctxfunction" variant="example"> <cd:sequence> <cd:variable value="ctxfunction"/> </cd:sequence> </cd:command> </cd:interface> <cd:interface file="i-makeup.xml"> - <cd:command file="page-mak.mkvi" name="definemakeup"> + <cd:command category="structure layout" file="page-mak.mkvi" level="style" name="definemakeup"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -19814,7 +20889,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-mak.mkvi" name="setupmakeup"> + <cd:command category="structure layout" file="page-mak.mkvi" level="style" name="setupmakeup"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -19906,7 +20981,8 @@ <cd:constant default="yes" type="empty"/> </cd:parameter> <cd:parameter name="style"> - <cd:inherit name="value-style"/> + <cd:constant type="cd:style"/> + <cd:constant type="cd:command"/> </cd:parameter> <cd:parameter name="color"> <cd:constant type="cd:color"/> @@ -19914,7 +20990,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-mak.mkvi" name="makeup" type="environment"> + <cd:command category="structure layout" file="page-mak.mkvi" level="document" name="makeup" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -19924,7 +21000,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-mak.mkvi" generated="yes" name="makeup" type="environment" variant="instance"> + <cd:command category="structure layout" file="page-mak.mkvi" generated="yes" level="document" name="makeup" type="environment" variant="instance"> <cd:sequence> <cd:instance value="makeup"/> <cd:string value="makeup"/> @@ -19934,11 +21010,16 @@ <cd:inherit name="setupmakeup"/> </cd:assignments> </cd:arguments> - <cd:instances/> + <cd:instances> + <cd:constant value="standard"/> + <cd:constant value="page"/> + <cd:constant value="text"/> + <cd:constant value="middle"/> + </cd:instances> </cd:command> </cd:interface> <cd:interface file="i-marginblock.xml"> - <cd:command file="page-mbk.mkvi" name="definemarginblock"> + <cd:command category="structure layout" file="page-mbk.mkvi" level="style" name="definemarginblock"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -19951,7 +21032,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-mbk.mkvi" name="setupmarginblock"> + <cd:command category="structure layout" file="page-mbk.mkvi" level="style" name="setupmarginblock"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -20004,7 +21085,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-mbk.mkvi" name="marginblock" type="environment"> + <cd:command category="structure layout" file="page-mbk.mkvi" level="document" name="marginblock" type="environment"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -20013,7 +21094,7 @@ </cd:command> </cd:interface> <cd:interface file="i-margindata.xml"> - <cd:command file="typo-mar.mkiv" name="definemargindata"> + <cd:command category="structure" file="typo-mar.mkiv" level="style" name="definemargindata"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -20026,7 +21107,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="typo-mar.mkiv" name="setupmargindata"> + <cd:command category="structure" file="typo-mar.mkiv" level="style" name="setupmargindata"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -20121,7 +21202,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="typo-mar.mkiv" name="setupmarginframed"> + <cd:command category="structure" file="typo-mar.mkiv" level="style" name="setupmarginframed"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -20131,7 +21212,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="typo-mar.mkiv" generated="yes" name="margindata" variant="instance"> + <cd:command category="structure" file="typo-mar.mkiv" generated="yes" level="document" name="margindata" variant="instance"> <cd:sequence> <cd:instance value="margindata"/> </cd:sequence> @@ -20147,9 +21228,27 @@ </cd:assignments> <cd:content/> </cd:arguments> - <cd:instances/> + <cd:instances> + <cd:constant value="inleftmargin"/> + <cd:constant value="inrightmargin"/> + <cd:constant value="inoutermargin"/> + <cd:constant value="ininnermargin"/> + <cd:constant value="inleftedge"/> + <cd:constant value="inrightedge"/> + <cd:constant value="inouteredge"/> + <cd:constant value="ininneredge"/> + <cd:constant value="atleftmargin"/> + <cd:constant value="atrightmargin"/> + <cd:constant value="inleft"/> + <cd:constant value="inright"/> + <cd:constant value="inouter"/> + <cd:constant value="ininner"/> + <cd:constant value="inmargin"/> + <cd:constant value="inother"/> + <cd:constant value="margintext"/> + </cd:instances> </cd:command> - <cd:command file="typo-mar.mkiv" name="margindata"> + <cd:command category="structure" file="typo-mar.mkiv" level="document" name="margindata"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -20168,14 +21267,14 @@ </cd:command> </cd:interface> <cd:interface file="i-marker.xml"> - <cd:command file="attr-mkr.mkiv" name="definemarker"> + <cd:command category="attribute" file="attr-mkr.mkiv" level="system" name="definemarker"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="attr-mkr.mkiv" name="setmarker"> + <cd:command category="attribute" file="attr-mkr.mkiv" level="system" name="setmarker"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -20185,14 +21284,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="attr-mkr.mkiv" name="resetmarker"> + <cd:command category="attribute" file="attr-mkr.mkiv" level="system" name="resetmarker"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="attr-mkr.mkiv" name="boxmarker"> + <cd:command category="attribute" file="attr-mkr.mkiv" level="system" name="boxmarker"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -20204,7 +21303,7 @@ </cd:command> </cd:interface> <cd:interface file="i-marking.xml"> - <cd:command file="strc-mar.mkiv" name="definemarking"> + <cd:command file="strc-mar.mkiv" level="style" name="definemarking"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -20217,7 +21316,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-mar.mkiv" name="setupmarking"> + <cd:command file="strc-mar.mkiv" level="style" name="setupmarking"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:mark"/> @@ -20240,7 +21339,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-mar.mkiv" name="relatemarking"> + <cd:command file="strc-mar.mkiv" level="system" name="relatemarking"> <cd:arguments> <cd:keywords> <cd:constant type="cd:mark"/> @@ -20250,7 +21349,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-mar.mkiv" name="setmarking"> + <cd:command file="strc-mar.mkiv" level="style" name="setmarking"> <cd:arguments> <cd:keywords> <cd:constant type="cd:mark"/> @@ -20260,14 +21359,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-mar.mkiv" name="resetmarking"> + <cd:command file="strc-mar.mkiv" level="system" name="resetmarking"> <cd:arguments> <cd:keywords> <cd:constant type="cd:mark"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-mar.mkiv" name="synchronizemarking"> + <cd:command file="strc-mar.mkiv" level="system" name="synchronizemarking"> <cd:arguments> <cd:keywords> <cd:constant type="cd:mark"/> @@ -20280,7 +21379,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-mar.mkiv" name="doifelsemarking"> + <cd:command category="conditional" file="strc-mar.mkiv" level="system" name="doifelsemarking"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:mark"/> @@ -20293,7 +21392,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-mar.mkiv" name="doifmarkingelse"> + <cd:command category="conditional" file="strc-mar.mkiv" level="system" name="doifmarkingelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:mark"/> @@ -20306,7 +21405,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-mar.mkiv" name="getmarking"> + <cd:command file="strc-mar.mkiv" level="style" name="getmarking"> <cd:arguments> <cd:keywords> <cd:constant type="cd:mark"/> @@ -20335,7 +21434,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-mar.mkiv" name="fetchonemark"> + <cd:command file="strc-mar.mkiv" level="style" name="fetchonemark"> <cd:arguments> <cd:keywords> <cd:constant type="cd:mark"/> @@ -20360,21 +21459,21 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-mar.mkiv" name="fetchtwomarks"> + <cd:command file="strc-mar.mkiv" level="style" name="fetchtwomarks"> <cd:arguments> <cd:keywords> <cd:constant type="cd:mark"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-mar.mkiv" name="fetchallmarks"> + <cd:command file="strc-mar.mkiv" level="style" name="fetchallmarks"> <cd:arguments> <cd:keywords> <cd:constant type="cd:mark"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-mar.mkiv" name="fetchmark"> + <cd:command file="strc-mar.mkiv" level="style" name="fetchmark"> <cd:arguments> <cd:keywords> <cd:constant type="cd:mark"/> @@ -20399,7 +21498,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-mar.mkiv" name="fetchmarking"> + <cd:command file="strc-mar.mkiv" level="style" name="fetchmarking"> <cd:arguments> <cd:keywords> <cd:constant type="cd:mark"/> @@ -20428,7 +21527,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-mar.mkiv" name="fetchonemarking"> + <cd:command file="strc-mar.mkiv" level="style" name="fetchonemarking"> <cd:arguments> <cd:keywords> <cd:constant type="cd:mark"/> @@ -20457,7 +21556,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-mar.mkiv" name="fetchtwomarkings"> + <cd:command file="strc-mar.mkiv" level="style" name="fetchtwomarkings"> <cd:arguments> <cd:keywords> <cd:constant type="cd:mark"/> @@ -20468,7 +21567,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-mar.mkiv" name="fetchallmarkings"> + <cd:command file="strc-mar.mkiv" level="style" name="fetchallmarkings"> <cd:arguments> <cd:keywords> <cd:constant type="cd:mark"/> @@ -20481,7 +21580,7 @@ </cd:command> </cd:interface> <cd:interface file="i-math.xml"> - <cd:command category="mathematics" file="math-ini.mkiv" name="definemathematics"> + <cd:command category="mathematics" file="math-ini.mkiv" level="style" name="definemathematics"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -20494,7 +21593,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command category="mathematics" file="math-ini.mkiv" name="setupmathematics"> + <cd:command category="mathematics" file="math-ini.mkiv" level="style" name="setupmathematics"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -20546,10 +21645,14 @@ <cd:constant type="none"/> <cd:constant type="reset"/> </cd:parameter> - <cd:parameter name="autopunctuation"> + <cd:parameter list="yes" name="autopunctuation"> <cd:constant type="yes"/> <cd:constant default="yes" type="no"/> <cd:constant type="all"/> + <cd:constant type="comma"/> + <cd:constant type="yes,semicolon"/> + <cd:constant type="comma,semicolon"/> + <cd:constant type="all,semicolon"/> </cd:parameter> <cd:parameter name="setups"> <cd:constant type="cd:name"/> @@ -20586,16 +21689,19 @@ <cd:constant type="ams"/> <cd:constant default="yes" type="ctx"/> </cd:parameter> + <cd:parameter name="ampersand"> + <cd:constant type="normal"/> + </cd:parameter> </cd:assignments> </cd:arguments> </cd:command> - <cd:command category="mathematics" file="math-ini.mkiv" name="inlineordisplaymath"> + <cd:command category="mathematics" file="math-ini.mkiv" level="system" name="inlineordisplaymath"> <cd:arguments> <cd:content/> <cd:content/> </cd:arguments> </cd:command> - <cd:command category="mathematics" file="math-ini.mkiv" name="mathematics"> + <cd:command category="mathematics" file="math-ini.mkiv" level="document" name="mathematics"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -20603,7 +21709,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command category="mathematics" file="math-ini.mkiv" name="math"> + <cd:command category="mathematics" file="math-ini.mkiv" level="document" name="math"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -20611,7 +21717,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command category="mathematics" file="math-ini.mkiv" name="m"> + <cd:command category="mathematics" file="math-ini.mkiv" level="document" name="m"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -20619,7 +21725,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command category="mathematics" file="math-ini.mkiv" name="definemathcommand"> + <cd:command category="mathematics" file="math-ini.mkiv" level="style" name="definemathcommand"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -20650,7 +21756,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-ini.mkiv" generated="yes" name="mathcommand" variant="example"> + <cd:command category="mathematics" file="math-ini.mkiv" generated="yes" level="document" name="mathcommand" variant="example"> <cd:sequence> <cd:variable value="mathcommand"/> </cd:sequence> @@ -20663,58 +21769,51 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-ini.mkiv" name="mathcommand"> - <cd:arguments> - <cd:keywords delimiters="braces"> - <cd:constant type="cd:name"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-ini.mkiv" name="mathop"> + <cd:command category="mathematics" file="math-ini.mkiv" level="style" name="mathop"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="math-ini.mkiv" name="mbox"> + <cd:command category="mathematics" file="math-ini.mkiv" level="document" name="mbox"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="math-ini.mkiv" name="mtext"> + <cd:command category="mathematics" file="math-ini.mkiv" level="document" name="mtext"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command category="mathematics" file="math-ini.mkiv" name="mathfunction"> + <cd:command category="mathematics" file="math-ini.mkiv" level="style" name="mathfunction"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command category="mathematics" file="math-ini.mkiv" name="mfunction"> + <cd:command category="mathematics" file="math-ini.mkiv" level="style" name="mfunction"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="math-ini.mkiv" name="mfunctionlabeltext"> + <cd:command category="mathematics" file="math-ini.mkiv" level="system" name="mfunctionlabeltext"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-ini.mkiv" name="stackrel"> + <cd:command category="mathematics" file="math-ini.mkiv" level="document" name="stackrel"> <cd:arguments> <cd:content/> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="math-ini.mkiv" name="apply"> + <cd:command category="mathematics" file="math-ini.mkiv" level="document" name="apply"> <cd:arguments> <cd:content/> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="math-ini.mkiv" name="definemathstyle"> + <cd:command category="mathematics" file="math-ini.mkiv" level="system" name="definemathstyle"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -20733,7 +21832,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-ini.mkiv" name="setupmathstyle"> + <cd:command category="mathematics" file="math-ini.mkiv" level="style" name="setupmathstyle"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="display"/> @@ -20750,7 +21849,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-ini.mkiv" name="setmathstyle"> + <cd:command category="mathematics" file="math-ini.mkiv" level="system" name="setmathstyle"> <cd:arguments> <cd:keywords delimiters="braces" list="yes"> <cd:constant type="display"/> @@ -20767,7 +21866,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-ini.mkiv" name="mathstyle" type="environment"> + <cd:command category="mathematics" file="math-ini.mkiv" level="system" name="mathstyle" type="environment"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="display"/> @@ -20784,18 +21883,18 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command begin="push" end="pop" file="math-ini.mkiv" name="mathstyle" type="environment"/> - <cd:command file="math-ini.mkiv" name="usemathstyleparameter"> + <cd:command begin="push" category="mathematics" end="pop" file="math-ini.mkiv" level="system" name="mathstyle" type="environment"/> + <cd:command category="mathematics" file="math-ini.mkiv" level="system" name="usemathstyleparameter"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="math-ini.mkiv" name="usemathstyleparameter" type="environment"> + <cd:command category="mathematics" file="math-ini.mkiv" level="system" name="usemathstyleparameter" type="environment"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="math-ini.mkiv" name="mathtext"> + <cd:command category="mathematics" file="math-ini.mkiv" level="document" name="mathtext"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -20805,7 +21904,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-ini.mkiv" name="mathtexttf"> + <cd:command category="mathematics" file="math-ini.mkiv" level="document" name="mathtexttf"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -20815,7 +21914,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-ini.mkiv" name="mathtextit"> + <cd:command category="mathematics" file="math-ini.mkiv" level="document" name="mathtextit"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -20825,7 +21924,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-ini.mkiv" name="mathtextsl"> + <cd:command category="mathematics" file="math-ini.mkiv" level="document" name="mathtextsl"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -20835,7 +21934,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-ini.mkiv" name="mathtextbf"> + <cd:command category="mathematics" file="math-ini.mkiv" level="document" name="mathtextbf"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -20845,7 +21944,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-ini.mkiv" name="mathtextbi"> + <cd:command category="mathematics" file="math-ini.mkiv" level="document" name="mathtextbi"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -20855,7 +21954,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-ini.mkiv" name="mathtextbs"> + <cd:command category="mathematics" file="math-ini.mkiv" level="document" name="mathtextbs"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -20865,7 +21964,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-ini.mkiv" name="mathword"> + <cd:command category="mathematics" file="math-ini.mkiv" level="document" name="mathword"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -20875,7 +21974,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-ini.mkiv" name="mathwordtf"> + <cd:command category="mathematics" file="math-ini.mkiv" level="document" name="mathwordtf"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -20885,7 +21984,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-ini.mkiv" name="mathwordit"> + <cd:command category="mathematics" file="math-ini.mkiv" level="document" name="mathwordit"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -20895,7 +21994,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-ini.mkiv" name="mathwordsl"> + <cd:command category="mathematics" file="math-ini.mkiv" level="document" name="mathwordsl"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -20905,7 +22004,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-ini.mkiv" name="mathwordbf"> + <cd:command category="mathematics" file="math-ini.mkiv" level="document" name="mathwordbf"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -20915,7 +22014,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-ini.mkiv" name="mathwordbi"> + <cd:command category="mathematics" file="math-ini.mkiv" level="document" name="mathwordbi"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -20925,7 +22024,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-ini.mkiv" name="mathwordbs"> + <cd:command category="mathematics" file="math-ini.mkiv" level="document" name="mathwordbs"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -20935,82 +22034,95 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-ini.mkiv" name="mathrm"/> - <cd:command file="math-ini.mkiv" name="mathss"/> - <cd:command file="math-ini.mkiv" name="mathtt"/> - <cd:command file="math-ini.mkiv" name="mathtf"/> - <cd:command file="math-ini.mkiv" name="mathsl"/> - <cd:command file="math-ini.mkiv" name="mathit"/> - <cd:command file="math-ini.mkiv" name="mathbf"/> - <cd:command file="math-ini.mkiv" name="mathbi"/> - <cd:command file="math-ini.mkiv" name="mathbs"/> - <cd:command file="math-ini.mkiv" name="mathitalic"/> - <cd:command file="math-ini.mkiv" name="mathupright"/> - <cd:command file="math-ini.mkiv" name="mathdefault"/> - <cd:command file="math-ini.mkiv" name="mathscript"/> - <cd:command file="math-ini.mkiv" name="mathfraktur"/> - <cd:command file="math-ini.mkiv" name="mathblackboard"/> - <cd:command file="supp-mat.mkiv" name="displaymath"> + <cd:command category="mathematics" file="math-ini.mkiv" level="document" name="mathrm"/> + <cd:command category="mathematics" file="math-ini.mkiv" level="document" name="mathss"/> + <cd:command category="mathematics" file="math-ini.mkiv" level="document" name="mathtt"/> + <cd:command category="mathematics" file="math-ini.mkiv" level="document" name="mathtf"/> + <cd:command category="mathematics" file="math-ini.mkiv" level="document" name="mathsl"/> + <cd:command category="mathematics" file="math-ini.mkiv" level="document" name="mathit"/> + <cd:command category="mathematics" file="math-ini.mkiv" level="document" name="mathbf"/> + <cd:command category="mathematics" file="math-ini.mkiv" level="document" name="mathbi"/> + <cd:command category="mathematics" file="math-ini.mkiv" level="document" name="mathbs"/> + <cd:command category="mathematics" file="math-ini.mkiv" level="document" name="mathitalic"/> + <cd:command category="mathematics" file="math-ini.mkiv" level="document" name="mathupright"/> + <cd:command category="mathematics" file="math-ini.mkiv" level="document" name="mathdefault"/> + <cd:command category="mathematics" file="math-ini.mkiv" level="document" name="mathscript"/> + <cd:command category="mathematics" file="math-ini.mkiv" level="document" name="mathfraktur"/> + <cd:command category="mathematics" file="math-ini.mkiv" level="document" name="mathblackboard"/> + <cd:command category="mathematics" file="supp-mat.mkiv" level="style" name="displaymath"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-mat.mkiv" name="inlinemath"> + <cd:command category="mathematics" file="supp-mat.mkiv" level="style" name="inlinemath"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-mat.mkiv" name="textmath"> + <cd:command category="mathematics" file="supp-mat.mkiv" level="style" name="textmath"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-mat.mkiv" name="imath" type="environment"/> - <cd:command file="supp-mat.mkiv" name="dmath" type="environment"/> - <cd:command file="supp-mat.mkiv" name="mathmode" type="environment"/> - <cd:command file="supp-mat.mkiv" name="nonmathematics"> + <cd:command category="mathematics" file="supp-mat.mkiv" level="system" name="imath" type="environment"/> + <cd:command category="mathematics" file="supp-mat.mkiv" level="system" name="dmath" type="environment"/> + <cd:command category="mathematics" file="supp-mat.mkiv" level="system" name="mathmode" type="environment"/> + <cd:command category="mathematics" file="supp-mat.mkiv" level="system" name="nonmathematics"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-mat.mkiv" name="displaymathematics"> + <cd:command category="mathematics" file="supp-mat.mkiv" level="system" name="displaymathematics"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-mat.mkiv" name="inlinemathematics"> + <cd:command category="mathematics" file="supp-mat.mkiv" level="system" name="inlinemathematics"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-mat.mkiv" name="automathematics"> + <cd:command category="mathematics" file="supp-mat.mkiv" level="system" name="automathematics"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-mat.mkiv" name="cramped"> + <cd:command category="mathematics" file="supp-mat.mkiv" level="system" name="cramped"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-mat.mkiv" name="crampedllap"> + <cd:command category="mathematics" file="supp-mat.mkiv" level="system" name="crampedllap"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-mat.mkiv" name="crampedrlap"> + <cd:command category="mathematics" file="supp-mat.mkiv" level="system" name="crampedrlap"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-mat.mkiv" name="crampedclap"> + <cd:command category="mathematics" file="supp-mat.mkiv" level="system" name="crampedclap"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> + <cd:command category="mathematics" file="math-del.mkiv" level="system" name="autointegral"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:text"/> + </cd:keywords> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:text"/> + </cd:keywords> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:text"/> + </cd:keywords> + </cd:arguments> + </cd:command> </cd:interface> <cd:interface file="i-mathalignment.xml"> - <cd:command file="math-ali.mkiv" name="definemathalignment"> + <cd:command category="mathematics alignment" file="math-ali.mkiv" level="style" name="definemathalignment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -21023,7 +22135,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="math-ali.mkiv" name="setupmathalignment"> + <cd:command category="mathematics alignment" file="math-ali.mkiv" level="style" name="setupmathalignment"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -21038,16 +22150,32 @@ <cd:parameter name="distance"> <cd:constant type="cd:dimension"/> </cd:parameter> + <cd:parameter name="number"> + <cd:constant type="auto"/> + </cd:parameter> + <cd:parameter name="separator"> + <cd:constant type="cd:text"/> + </cd:parameter> <cd:parameter name="align"> <cd:constant type="left"/> <cd:constant type="middle"/> <cd:constant type="right"/> <cd:constant default="yes" type="normal"/> </cd:parameter> + <cd:parameter name="location"> + <cd:constant type="top"/> + <cd:constant type="center"/> + <cd:constant type="bottom"/> + <cd:constant default="yes" type="normal"/> + </cd:parameter> + <cd:parameter name="grid"> + <cd:constant default="yes" type="math"/> + <cd:constant type="no"/> + </cd:parameter> </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="math-ali.mkiv" generated="yes" name="mathalignment" type="environment" variant="instance"> + <cd:command category="mathematics alignment" file="math-ali.mkiv" generated="yes" level="document" name="mathalignment" type="environment" variant="instance"> <cd:sequence> <cd:instance value="mathalignment"/> </cd:sequence> @@ -21056,11 +22184,14 @@ <cd:inherit name="setupmathalignment"/> </cd:assignments> </cd:arguments> - <cd:instances/> + <cd:instances> + <cd:constant value="align"/> + <cd:constant value="mathalignment"/> + </cd:instances> </cd:command> </cd:interface> <cd:interface file="i-mathcases.xml"> - <cd:command file="math-ali.mkiv" name="definemathcases"> + <cd:command category="mathematics alignment" file="math-ali.mkiv" level="style" name="definemathcases"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -21073,7 +22204,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="math-ali.mkiv" name="setupmathcases"> + <cd:command category="mathematics alignment" file="math-ali.mkiv" level="style" name="setupmathcases"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -21102,7 +22233,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="math-ali.mkiv" generated="yes" name="mathcases" type="environment" variant="instance"> + <cd:command category="mathematics alignment" file="math-ali.mkiv" generated="yes" level="document" name="mathcases" type="environment" variant="instance"> <cd:sequence> <cd:instance value="mathcases"/> </cd:sequence> @@ -21111,11 +22242,14 @@ <cd:inherit name="setupmathcases"/> </cd:assignments> </cd:arguments> - <cd:instances/> + <cd:instances> + <cd:constant value="cases"/> + <cd:constant value="mathcases"/> + </cd:instances> </cd:command> </cd:interface> <cd:interface file="i-mathfence.xml"> - <cd:command file="math-fen.mkiv" name="definemathfence"> + <cd:command category="mathematics" file="math-fen.mkiv" level="style" name="definemathfence"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -21128,7 +22262,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="math-fen.mkiv" name="setupmathfence"> + <cd:command category="mathematics" file="math-fen.mkiv" level="style" name="setupmathfence"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -21165,15 +22299,21 @@ <cd:parameter name="state"> <cd:constant type="auto"/> </cd:parameter> + <cd:parameter name="method"> + <cd:constant type="auto"/> + </cd:parameter> <cd:parameter name="factor"> - <cd:constant default="yes" type="auto"/> <cd:constant type="none"/> - <cd:constant type="number"/> + <cd:constant type="auto"/> + <cd:constant type="cd:number"/> + </cd:parameter> + <cd:parameter name="mathclass"> + <cd:constant type="cd:number"/> </cd:parameter> </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="math-fen.mkiv" generated="yes" name="fence" variant="example"> + <cd:command category="mathematics" file="math-fen.mkiv" generated="yes" level="document" name="fence" variant="example"> <cd:sequence> <cd:variable value="fence"/> </cd:sequence> @@ -21181,7 +22321,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="math-fen.mkiv" name="fenced"> + <cd:command category="mathematics" file="math-fen.mkiv" level="document" name="fenced"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -21189,165 +22329,165 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="math-fen.mkiv" name="fence"/> - <cd:command file="math-fen.mkiv" name="left"> + <cd:command category="mathematics" file="math-fen.mkiv" level="document" name="fence"/> + <cd:command category="mathematics" file="math-fen.mkiv" level="document" name="left"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:character"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-fen.mkiv" name="middle"> + <cd:command category="mathematics" file="math-fen.mkiv" level="document" name="middle"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:character"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-fen.mkiv" name="right"> + <cd:command category="mathematics" file="math-fen.mkiv" level="document" name="right"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:character"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-fen.mkiv" name="big"> + <cd:command category="mathematics" file="math-fen.mkiv" level="document" name="big"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:character"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-fen.mkiv" name="Big"> + <cd:command category="mathematics" file="math-fen.mkiv" level="document" name="Big"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:character"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-fen.mkiv" name="bigg"> + <cd:command category="mathematics" file="math-fen.mkiv" level="document" name="bigg"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:character"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-fen.mkiv" name="Bigg"> + <cd:command category="mathematics" file="math-fen.mkiv" level="document" name="Bigg"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:character"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-fen.mkiv" name="bigl"> + <cd:command category="mathematics" file="math-fen.mkiv" level="document" name="bigl"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:character"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-fen.mkiv" name="bigm"> + <cd:command category="mathematics" file="math-fen.mkiv" level="document" name="bigm"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:character"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-fen.mkiv" name="bigr"> + <cd:command category="mathematics" file="math-fen.mkiv" level="document" name="bigr"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:character"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-fen.mkiv" name="Bigl"> + <cd:command category="mathematics" file="math-fen.mkiv" level="document" name="Bigl"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:character"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-fen.mkiv" name="Bigm"> + <cd:command category="mathematics" file="math-fen.mkiv" level="document" name="Bigm"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:character"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-fen.mkiv" name="Bigr"> + <cd:command category="mathematics" file="math-fen.mkiv" level="document" name="Bigr"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:character"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-fen.mkiv" name="biggl"> + <cd:command category="mathematics" file="math-fen.mkiv" level="document" name="biggl"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:character"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-fen.mkiv" name="biggm"> + <cd:command category="mathematics" file="math-fen.mkiv" level="document" name="biggm"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:character"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-fen.mkiv" name="biggr"> + <cd:command category="mathematics" file="math-fen.mkiv" level="document" name="biggr"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:character"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-fen.mkiv" name="Biggl"> + <cd:command category="mathematics" file="math-fen.mkiv" level="document" name="Biggl"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:character"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-fen.mkiv" name="Biggm"> + <cd:command category="mathematics" file="math-fen.mkiv" level="document" name="Biggm"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:character"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-fen.mkiv" name="Biggr"> + <cd:command category="mathematics" file="math-fen.mkiv" level="document" name="Biggr"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:character"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-fen.mkiv" name="lfence"> + <cd:command category="mathematics" file="math-fen.mkiv" level="document" name="lfence"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:character"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-fen.mkiv" name="mfence"> + <cd:command category="mathematics" file="math-fen.mkiv" level="document" name="mfence"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:character"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-fen.mkiv" name="rfence"> + <cd:command category="mathematics" file="math-fen.mkiv" level="document" name="rfence"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:character"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-fen.mkiv" name="checkedfences" type="environment"/> + <cd:command category="mathematics" file="math-fen.mkiv" level="style" name="checkedfences" type="environment"/> </cd:interface> <cd:interface file="i-mathmatrix.xml"> - <cd:command file="math-ali.mkiv" name="definemathmatrix"> + <cd:command category="mathematics tables" file="math-ali.mkiv" level="style" name="definemathmatrix"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -21360,7 +22500,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="math-ali.mkiv" name="setupmathmatrix"> + <cd:command category="mathematics tables" file="math-ali.mkiv" level="style" name="setupmathmatrix"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -21390,6 +22530,9 @@ <cd:parameter name="distance"> <cd:constant type="cd:dimension"/> </cd:parameter> + <cd:parameter name="simplecommand"> + <cd:constant type="cd:text"/> + </cd:parameter> <cd:parameter name="location"> <cd:constant type="top"/> <cd:constant type="bottom"/> @@ -21401,7 +22544,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="math-ali.mkiv" generated="yes" name="mathmatrix" type="environment" variant="instance"> + <cd:command category="mathematics tables" file="math-ali.mkiv" generated="yes" level="document" name="mathmatrix" type="environment" variant="instance"> <cd:sequence> <cd:instance value="mathmatrix"/> </cd:sequence> @@ -21410,25 +22553,28 @@ <cd:inherit name="setupmathmatrix"/> </cd:assignments> </cd:arguments> - <cd:instances/> + <cd:instances> + <cd:constant value="matrix"/> + <cd:constant value="mathmatrix"/> + </cd:instances> </cd:command> - <cd:command file="math-ali.mkiv" name="matrices" type="environment"> + <cd:command category="mathematics tables" file="math-ali.mkiv" level="document" name="matrices" type="environment"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupmathmatrix"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="math-ali.mkiv" name="intertext" type="environment"/> - <cd:command file="math-ali.mkiv" name="intertext"> + <cd:command category="mathematics" file="math-ali.mkiv" level="document" name="intertext" type="environment"/> + <cd:command category="mathematics" file="math-ali.mkiv" level="document" name="intertext"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-ali.mkiv" name="substack" type="environment"/> - <cd:command file="math-ali.mkiv" name="overset"> + <cd:command category="mathematics" file="math-ali.mkiv" level="document" name="substack" type="environment"/> + <cd:command category="mathematics" file="math-ali.mkiv" level="document" name="overset"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -21438,7 +22584,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-ali.mkiv" name="underset"> + <cd:command category="mathematics" file="math-ali.mkiv" level="document" name="underset"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -21448,9 +22594,21 @@ </cd:keywords> </cd:arguments> </cd:command> + <cd:command category="mathematics tables" file="math-pln.mkiv" level="document" name="bordermatrix"> + <cd:arguments> + <cd:content/> + </cd:arguments> + </cd:command> + <cd:command category="mathematics tables" file="math-pln.mkiv" level="document" name="bbordermatrix"> + <cd:arguments> + <cd:content/> + </cd:arguments> + </cd:command> + <cd:command category="mathematics tables" file="math-pln.mkiv" level="document" name="bordermatrix" type="environment"/> + <cd:command category="mathematics tables" file="math-pln.mkiv" level="document" name="bbordermatrix" type="environment"/> </cd:interface> <cd:interface file="i-mathornament.xml"> - <cd:command file="math-rad.mkvi" name="definemathornament"> + <cd:command category="mathematics" file="math-rad.mkvi" level="style" name="definemathornament"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -21463,7 +22621,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="math-rad.mkvi" name="setupmathornament"> + <cd:command category="mathematics" file="math-rad.mkvi" level="style" name="setupmathornament"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -21484,7 +22642,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="math-rad.mkvi" generated="yes" name="mathornament" variant="example"> + <cd:command category="mathematics" file="math-rad.mkvi" generated="yes" level="document" name="mathornament" variant="example"> <cd:sequence> <cd:variable value="mathornament"/> </cd:sequence> @@ -21494,7 +22652,7 @@ </cd:command> </cd:interface> <cd:interface file="i-mathradical.xml"> - <cd:command file="math-rad.mkvi" name="definemathradical"> + <cd:command category="mathematics" file="math-rad.mkvi" level="style" name="definemathradical"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -21507,7 +22665,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="math-rad.mkvi" name="setupmathradical"> + <cd:command category="mathematics" file="math-rad.mkvi" level="style" name="setupmathradical"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -21530,7 +22688,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="math-rad.mkvi" generated="yes" name="mathradical" variant="example"> + <cd:command category="mathematics" file="math-rad.mkvi" generated="yes" level="document" name="mathradical" variant="example"> <cd:sequence> <cd:variable value="mathradical"/> </cd:sequence> @@ -21541,7 +22699,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="math-rad.mkvi" name="sqrt"> + <cd:command category="mathematics" file="math-rad.mkvi" level="document" name="sqrt"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:text"/> @@ -21551,7 +22709,7 @@ </cd:command> </cd:interface> <cd:interface file="i-mathstackers.xml"> - <cd:command file="math-stc.mkvi" name="definemathstackers"> + <cd:command category="mathematics" file="math-stc.mkvi" level="style" name="definemathstackers"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -21564,7 +22722,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="math-stc.mkvi" name="setupmathstackers"> + <cd:command category="mathematics" file="math-stc.mkvi" level="style" name="setupmathstackers"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -21658,7 +22816,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="math-sty.mkvi" name="definemathextensible"> + <cd:command category="mathematics" file="math-sty.mkvi" level="system" name="definemathextensible"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="reverse"/> @@ -21674,17 +22832,11 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-stc.mkvi" generated="yes" name="mathextensible" variant="example"> + <cd:command category="mathematics" file="math-stc.mkvi" generated="yes" level="document" name="mathextensible" variant="instance"> <cd:sequence> - <cd:variable value="mathextensible"/> + <cd:instance value="mathextensible"/> </cd:sequence> <cd:arguments> - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> <cd:keywords delimiters="braces" optional="yes"> <cd:constant type="cd:text"/> </cd:keywords> @@ -21692,8 +22844,92 @@ <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> + <cd:instances> + <cd:constant value="xrel"/> + <cd:constant value="xequal"/> + <cd:constant value="xleftarrow"/> + <cd:constant value="xrightarrow"/> + <cd:constant value="xleftrightarrow"/> + <cd:constant value="xLeftarrow"/> + <cd:constant value="xRightarrow"/> + <cd:constant value="xLeftrightarrow"/> + <cd:constant value="xtwoheadleftarrow"/> + <cd:constant value="xtwoheadrightarrow"/> + <cd:constant value="xmapsto"/> + <cd:constant value="xhookleftarrow"/> + <cd:constant value="xhookrightarrow"/> + <cd:constant value="xleftharpoondown"/> + <cd:constant value="xleftharpoonup"/> + <cd:constant value="xrightharpoondown"/> + <cd:constant value="xrightharpoonup"/> + <cd:constant value="xrightoverleftarrow"/> + <cd:constant value="xleftrightharpoons"/> + <cd:constant value="xrightleftharpoons"/> + <cd:constant value="xtriplerel"/> + <cd:constant value="mrel"/> + <cd:constant value="mequal"/> + <cd:constant value="mleftarrow"/> + <cd:constant value="mrightarrow"/> + <cd:constant value="mleftrightarrow"/> + <cd:constant value="mLeftarrow"/> + <cd:constant value="mRightarrow"/> + <cd:constant value="mLeftrightarrow"/> + <cd:constant value="mtwoheadleftarrow"/> + <cd:constant value="mtwoheadrightarrow"/> + <cd:constant value="mmapsto"/> + <cd:constant value="mhookleftarrow"/> + <cd:constant value="mhookrightarrow"/> + <cd:constant value="mleftharpoondown"/> + <cd:constant value="mleftharpoonup"/> + <cd:constant value="mrightharpoondown"/> + <cd:constant value="mrightharpoonup"/> + <cd:constant value="mrightoverleftarrow"/> + <cd:constant value="mleftrightharpoons"/> + <cd:constant value="mrightleftharpoons"/> + <cd:constant value="mtriplerel"/> + <cd:constant value="eleftarrowfill"/> + <cd:constant value="erightarrowfill"/> + <cd:constant value="eleftrightarrowfill"/> + <cd:constant value="etwoheadrightarrowfill"/> + <cd:constant value="eleftharpoondownfill"/> + <cd:constant value="eleftharpoonupfill"/> + <cd:constant value="erightharpoondownfill"/> + <cd:constant value="erightharpoonupfill"/> + <cd:constant value="eoverbarfill"/> + <cd:constant value="eunderbarfill"/> + <cd:constant value="eoverbracefill"/> + <cd:constant value="eunderbracefill"/> + <cd:constant value="eoverparentfill"/> + <cd:constant value="eunderparentfill"/> + <cd:constant value="eoverbracketfill"/> + <cd:constant value="eunderbracketfill"/> + <cd:constant value="trel"/> + <cd:constant value="tequal"/> + <cd:constant value="tmapsto"/> + <cd:constant value="tleftarrow"/> + <cd:constant value="trightarrow"/> + <cd:constant value="tleftrightarrow"/> + <cd:constant value="tLeftarrow"/> + <cd:constant value="tRightarrow"/> + <cd:constant value="tLeftrightarrow"/> + <cd:constant value="ttwoheadleftarrow"/> + <cd:constant value="ttwoheadrightarrow"/> + <cd:constant value="thookleftarrow"/> + <cd:constant value="thookrightarrow"/> + <cd:constant value="tleftharpoondown"/> + <cd:constant value="tleftharpoonup"/> + <cd:constant value="trightharpoondown"/> + <cd:constant value="trightharpoonup"/> + <cd:constant value="trightoverleftarrow"/> + <cd:constant value="tleftrightharpoons"/> + <cd:constant value="trightleftharpoons"/> + <cd:constant value="ttriplerel"/> + <cd:constant value="cleftarrow"/> + <cd:constant value="crightarrow"/> + <cd:constant value="crightoverleftarrow"/> + </cd:instances> </cd:command> - <cd:command file="math-sty.mkvi" name="definemathoverextensible"> + <cd:command category="mathematics" file="math-sty.mkvi" level="system" name="definemathoverextensible"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="top"/> @@ -21707,7 +22943,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-stc.mkvi" generated="yes" name="mathoverextensible" variant="example"> + <cd:command category="mathematics" file="math-stc.mkvi" generated="yes" level="document" name="mathoverextensible" variant="example"> <cd:sequence> <cd:variable value="mathoverextensible"/> </cd:sequence> @@ -21717,11 +22953,12 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-sty.mkvi" name="definemathunderextensible"> + <cd:command category="mathematics" file="math-stc.mkvi" level="style" name="definemathover"> <cd:arguments> - <cd:keywords optional="yes"> - <cd:constant type="bottom"/> + <cd:keywords> + <cd:constant type="top"/> <cd:constant type="vfenced"/> + <cd:constant type="cd:name"/> </cd:keywords> <cd:keywords> <cd:constant type="cd:name"/> @@ -21731,20 +22968,24 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-stc.mkvi" generated="yes" name="mathunderextensible" variant="example"> - <cd:sequence> - <cd:variable value="mathunderextensible"/> - </cd:sequence> + <cd:command category="mathematics" file="math-stc.mkvi" level="document" name="mathover"> <cd:arguments> + <cd:keywords optional="yes"> + <cd:constant type="top"/> + <cd:constant type="vfenced"/> + </cd:keywords> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:number"/> + </cd:keywords> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-sty.mkvi" name="definemathdoubleextensible"> + <cd:command category="mathematics" file="math-sty.mkvi" level="system" name="definemathunderextensible"> <cd:arguments> <cd:keywords optional="yes"> - <cd:constant type="both"/> + <cd:constant type="bottom"/> <cd:constant type="vfenced"/> </cd:keywords> <cd:keywords> @@ -21753,14 +22994,11 @@ <cd:keywords> <cd:constant type="cd:number"/> </cd:keywords> - <cd:keywords> - <cd:constant type="cd:number"/> - </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-stc.mkvi" generated="yes" name="mathdoubleextensible" variant="example"> + <cd:command category="mathematics" file="math-stc.mkvi" generated="yes" level="document" name="mathunderextensible" variant="example"> <cd:sequence> - <cd:variable value="mathdoubleextensible"/> + <cd:variable value="mathunderextensible"/> </cd:sequence> <cd:arguments> <cd:keywords delimiters="braces"> @@ -21768,10 +23006,12 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-sty.mkvi" name="definemathovertextextensible"> + <cd:command category="mathematics" file="math-stc.mkvi" level="style" name="definemathunder"> <cd:arguments> - <cd:keywords optional="yes"> - <cd:constant type="bothtext"/> + <cd:keywords> + <cd:constant type="bottom"/> + <cd:constant type="vfenced"/> + <cd:constant type="cd:name"/> </cd:keywords> <cd:keywords> <cd:constant type="cd:name"/> @@ -21781,23 +23021,25 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-stc.mkvi" generated="yes" name="mathovertextextensible" variant="example"> - <cd:sequence> - <cd:variable value="mathovertextextensible"/> - </cd:sequence> + <cd:command category="mathematics" file="math-stc.mkvi" level="document" name="mathunder"> <cd:arguments> + <cd:keywords optional="yes"> + <cd:constant type="bottom"/> + <cd:constant type="vfenced"/> + </cd:keywords> <cd:keywords delimiters="braces"> - <cd:constant type="cd:text"/> + <cd:constant type="cd:number"/> </cd:keywords> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-sty.mkvi" name="definemathundertextextensible"> + <cd:command category="mathematics" file="math-sty.mkvi" level="system" name="definemathdoubleextensible"> <cd:arguments> <cd:keywords optional="yes"> - <cd:constant type="bothtext"/> + <cd:constant type="both"/> + <cd:constant type="vfenced"/> </cd:keywords> <cd:keywords> <cd:constant type="cd:name"/> @@ -21805,11 +23047,14 @@ <cd:keywords> <cd:constant type="cd:number"/> </cd:keywords> + <cd:keywords> + <cd:constant type="cd:number"/> + </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-stc.mkvi" generated="yes" name="mathundertextextensible" variant="example"> + <cd:command category="mathematics" file="math-stc.mkvi" generated="yes" level="document" name="mathdoubleextensible" variant="instance"> <cd:sequence> - <cd:variable value="mathundertextextensible"/> + <cd:instance value="mathdoubleextensible"/> </cd:sequence> <cd:arguments> <cd:keywords delimiters="braces"> @@ -21819,1124 +23064,98 @@ <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> + <cd:instances> + <cd:constant value="doublebar"/> + <cd:constant value="doublebrace"/> + <cd:constant value="doubleparent"/> + <cd:constant value="doublebracket"/> + <cd:constant value="overbarunderbar"/> + <cd:constant value="overbraceunderbrace"/> + <cd:constant value="overparentunderparent"/> + <cd:constant value="overbracketunderbracket"/> + </cd:instances> </cd:command> - <cd:command file="math-sty.mkvi" name="definemathtriplet"> + <cd:command category="mathematics" file="math-stc.mkvi" level="style" name="definemathdouble"> <cd:arguments> - <cd:keywords optional="yes"> - <cd:constant type="cd:name"/> - </cd:keywords> <cd:keywords> + <cd:constant type="both"/> + <cd:constant type="vfenced"/> <cd:constant type="cd:name"/> </cd:keywords> - <cd:keywords optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" generated="yes" name="mathtriplet" variant="example"> - <cd:sequence> - <cd:variable value="mathtriplet"/> - </cd:sequence> - <cd:arguments> - <cd:keywords optional="yes"> + <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> + <cd:keywords> + <cd:constant type="cd:number"/> </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> + <cd:keywords> + <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-stc.mkvi" name="mathtriplet"> + <cd:command category="mathematics" file="math-stc.mkvi" level="document" name="mathdouble"> <cd:arguments> <cd:keywords optional="yes"> - <cd:constant type="cd:name"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="xrel"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="xequal"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="xleftarrow"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="xrightarrow"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="xleftrightarrow"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="xLeftarrow"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="xRightarrow"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="xLeftrightarrow"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="xtwoheadleftarrow"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="xtwoheadrightarrow"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="xmapsto"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="xhookleftarrow"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="xhookrightarrow"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="xleftharpoondown"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="xleftharpoonup"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="xrightharpoondown"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="xrightharpoonup"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="xrightoverleftarrow"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="xleftrightharpoons"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="xrightleftharpoons"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="xtriplerel"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="mrel"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="mequal"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="mleftarrow"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="mrightarrow"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="mleftrightarrow"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="mLeftarrow"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="mRightarrow"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="mLeftrightarrow"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="mtwoheadleftarrow"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="mtwoheadrightarrow"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="mmapsto"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="mhookleftarrow"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="mhookrightarrow"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="mleftharpoondown"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="mleftharpoonup"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="mrightharpoondown"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="mrightharpoonup"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="mrightoverleftarrow"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="mleftrightharpoons"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="mrightleftharpoons"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="mtriplerel"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="eleftarrowfill"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="erightarrowfill"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="eleftrightarrowfill"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="etwoheadrightarrowfill"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="eleftharpoondownfill"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="eleftharpoonupfill"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="erightharpoondownfill"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="erightharpoonupfill"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="eoverbarfill"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="eunderbarfill"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="eoverbracefill"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="eunderbracefill"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="eoverparentfill"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="eunderparentfill"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="eoverbracketfill"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="eunderbracketfill"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="trel"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="tequal"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="tmapsto"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="tleftarrow"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="trightarrow"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="tleftrightarrow"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="tLeftarrow"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="tRightarrow"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="tLeftrightarrow"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="ttwoheadleftarrow"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="ttwoheadrightarrow"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="thookleftarrow"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="thookrightarrow"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="tleftharpoondown"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="tleftharpoonup"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="trightharpoondown"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="trightharpoonup"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="trightoverleftarrow"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="tleftrightharpoons"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="trightleftharpoons"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="ttriplerel"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="cleftarrow"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="crightarrow"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="crightoverleftarrow"> - <cd:arguments> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="underleftarrow"> - <cd:arguments> - <cd:keywords delimiters="braces"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="underrightarrow"> - <cd:arguments> - <cd:keywords delimiters="braces"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="underleftrightarrow"> - <cd:arguments> - <cd:keywords delimiters="braces"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="undertwoheadleftarrow"> - <cd:arguments> - <cd:keywords delimiters="braces"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="undertwoheadrightarrow"> - <cd:arguments> - <cd:keywords delimiters="braces"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="underleftharpoondown"> - <cd:arguments> - <cd:keywords delimiters="braces"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="underleftharpoonup"> - <cd:arguments> - <cd:keywords delimiters="braces"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="underrightharpoondown"> - <cd:arguments> - <cd:keywords delimiters="braces"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="underrightharpoonup"> - <cd:arguments> - <cd:keywords delimiters="braces"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="underbar"> - <cd:arguments> - <cd:keywords delimiters="braces"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="underbrace"> - <cd:arguments> - <cd:keywords delimiters="braces"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="underparent"> - <cd:arguments> - <cd:keywords delimiters="braces"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="underbracket"> - <cd:arguments> - <cd:keywords delimiters="braces"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="overleftarrow"> - <cd:arguments> - <cd:keywords delimiters="braces"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="overrightarrow"> - <cd:arguments> - <cd:keywords delimiters="braces"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="overleftrightarrow"> - <cd:arguments> - <cd:keywords delimiters="braces"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="overtwoheadleftarrow"> - <cd:arguments> - <cd:keywords delimiters="braces"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="overtwoheadrightarrow"> - <cd:arguments> - <cd:keywords delimiters="braces"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="overleftharpoondown"> - <cd:arguments> - <cd:keywords delimiters="braces"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="overleftharpoonup"> - <cd:arguments> - <cd:keywords delimiters="braces"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="overrightharpoondown"> - <cd:arguments> - <cd:keywords delimiters="braces"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="overrightharpoonup"> - <cd:arguments> - <cd:keywords delimiters="braces"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="overbar"> - <cd:arguments> - <cd:keywords delimiters="braces"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="overbrace"> - <cd:arguments> - <cd:keywords delimiters="braces"> - <cd:constant type="cd:text"/> + <cd:constant type="both"/> + <cd:constant type="vfenced"/> </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="overparent"> - <cd:arguments> <cd:keywords delimiters="braces"> - <cd:constant type="cd:text"/> + <cd:constant type="cd:number"/> </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="overbracket"> - <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="doublebar"> - <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-stc.mkvi" name="doublebrace"> + <cd:command category="mathematics" file="math-sty.mkvi" level="system" name="definemathovertextextensible"> <cd:arguments> - <cd:keywords delimiters="braces"> - <cd:constant type="cd:text"/> - </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="doubleparent"> - <cd:arguments> - <cd:keywords delimiters="braces"> - <cd:constant type="cd:text"/> + <cd:keywords optional="yes"> + <cd:constant type="bothtext"/> </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="doublebracket"> - <cd:arguments> - <cd:keywords delimiters="braces"> - <cd:constant type="cd:text"/> + <cd:keywords> + <cd:constant type="cd:name"/> </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="overbarunderbar"> - <cd:arguments> - <cd:keywords delimiters="braces"> - <cd:constant type="cd:text"/> + <cd:keywords> + <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-stc.mkvi" name="overbraceunderbrace"> + <cd:command category="mathematics" file="math-stc.mkvi" generated="yes" level="document" name="mathovertextextensible" variant="instance"> + <cd:sequence> + <cd:instance value="mathovertextextensible"/> + </cd:sequence> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="overparentunderparent"> - <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> + <cd:instances> + <cd:resolve name="instance-mathovertextextensible"/> + </cd:instances> </cd:command> - <cd:command file="math-stc.mkvi" name="overbracketunderbracket"> + <cd:command category="mathematics" file="math-sty.mkvi" level="system" name="definemathundertextextensible"> <cd:arguments> - <cd:keywords delimiters="braces"> - <cd:constant type="cd:text"/> + <cd:keywords optional="yes"> + <cd:constant type="bothtext"/> </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="overbartext"> - <cd:arguments> - <cd:keywords delimiters="braces"> - <cd:constant type="cd:text"/> + <cd:keywords> + <cd:constant type="cd:name"/> </cd:keywords> - <cd:keywords delimiters="braces"> - <cd:constant type="cd:text"/> + <cd:keywords> + <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-stc.mkvi" name="overbracetext"> + <cd:command category="mathematics" file="math-stc.mkvi" generated="yes" level="document" name="mathundertextextensible" variant="instance"> + <cd:sequence> + <cd:instance value="mathundertextextensible"/> + </cd:sequence> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -22945,71 +23164,62 @@ <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> + <cd:instances> + <cd:resolve name="instance-mathundertextextensible"/> + </cd:instances> </cd:command> - <cd:command file="math-stc.mkvi" name="overparenttext"> + <cd:command category="mathematics" file="math-sty.mkvi" level="system" name="definemathtriplet"> <cd:arguments> - <cd:keywords delimiters="braces"> - <cd:constant type="cd:text"/> - </cd:keywords> - <cd:keywords delimiters="braces"> - <cd:constant type="cd:text"/> + <cd:keywords optional="yes"> + <cd:constant type="cd:name"/> </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="overbrackettext"> - <cd:arguments> - <cd:keywords delimiters="braces"> - <cd:constant type="cd:text"/> + <cd:keywords> + <cd:constant type="cd:name"/> </cd:keywords> - <cd:keywords delimiters="braces"> + <cd:keywords optional="yes"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-stc.mkvi" name="underbartext"> + <cd:command category="mathematics" file="math-stc.mkvi" generated="yes" level="document" name="mathtriplet" variant="example"> + <cd:sequence> + <cd:variable value="mathtriplet"/> + </cd:sequence> <cd:arguments> - <cd:keywords delimiters="braces"> - <cd:constant type="cd:text"/> + <cd:keywords optional="yes"> + <cd:constant type="cd:name"/> </cd:keywords> - <cd:keywords delimiters="braces"> + <cd:keywords delimiters="braces" optional="yes"> <cd:constant type="cd:text"/> </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="underbracetext"> - <cd:arguments> - <cd:keywords delimiters="braces"> + <cd:keywords delimiters="braces" optional="yes"> <cd:constant type="cd:text"/> </cd:keywords> - <cd:keywords delimiters="braces"> + <cd:keywords delimiters="braces" optional="yes"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-stc.mkvi" name="underparenttext"> + <cd:command category="mathematics" file="math-stc.mkvi" level="document" name="mathtriplet"> <cd:arguments> - <cd:keywords delimiters="braces"> - <cd:constant type="cd:text"/> + <cd:keywords optional="yes"> + <cd:constant type="cd:name"/> </cd:keywords> - <cd:keywords delimiters="braces"> + <cd:keywords delimiters="braces" optional="yes"> <cd:constant type="cd:text"/> </cd:keywords> - </cd:arguments> - </cd:command> - <cd:command file="math-stc.mkvi" name="underbrackettext"> - <cd:arguments> - <cd:keywords delimiters="braces"> + <cd:keywords delimiters="braces" optional="yes"> <cd:constant type="cd:text"/> </cd:keywords> - <cd:keywords delimiters="braces"> + <cd:keywords delimiters="braces" optional="yes"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-stc.mkvi" name="singlebond"/> - <cd:command file="math-stc.mkvi" name="doublebond"/> - <cd:command file="math-stc.mkvi" name="triplebond"/> - <cd:command file="math-stc.mkvi" name="definemathunstacked"> + <cd:command category="mathematics" file="math-stc.mkvi" level="document" name="singlebond"/> + <cd:command category="mathematics" file="math-stc.mkvi" level="document" name="doublebond"/> + <cd:command category="mathematics" file="math-stc.mkvi" level="document" name="triplebond"/> + <cd:command category="mathematics" file="math-stc.mkvi" level="document" name="definemathunstacked"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="wide"/> @@ -23022,33 +23232,33 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="math-stc.mkvi" generated="yes" name="mathunstacked" variant="example"> + <cd:command category="mathematics" file="math-stc.mkvi" generated="yes" level="document" name="mathunstacked" variant="example"> <cd:sequence> <cd:variable value="mathunstacked"/> </cd:sequence> </cd:command> - <cd:command file="math-stc.mkvi" name="And"/> - <cd:command file="math-stc.mkvi" name="impliedby"/> - <cd:command file="math-stc.mkvi" name="implies"/> - <cd:command file="math-stc.mkvi" name="iff"/> + <cd:command category="mathematics" file="math-stc.mkvi" level="document" name="And"/> + <cd:command category="mathematics" file="math-stc.mkvi" level="document" name="impliedby"/> + <cd:command category="mathematics" file="math-stc.mkvi" level="document" name="implies"/> + <cd:command category="mathematics" file="math-stc.mkvi" level="document" name="iff"/> </cd:interface> <cd:interface file="i-metapost.xml"> - <cd:command file="meta-ini.mkiv" name="MPdefinitions" type="environment"> + <cd:command category="graphics metapost" file="meta-ini.mkiv" level="style" name="MPdefinitions" type="environment"> <cd:arguments> <cd:keywords delimiters="braces" optional="yes"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="meta-ini.mkiv" name="MPextensions" type="environment"> + <cd:command category="graphics metapost" file="meta-ini.mkiv" level="style" name="MPextensions" type="environment"> <cd:arguments> <cd:keywords delimiters="braces" list="yes" optional="yes"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="meta-ini.mkiv" name="MPinitializations" type="environment"/> - <cd:command file="meta-ini.mkiv" name="MPinclusions" type="environment"> + <cd:command category="graphics metapost" file="meta-ini.mkiv" level="style" name="MPinitializations" type="environment"/> + <cd:command category="graphics metapost" file="meta-ini.mkiv" level="style" name="MPinclusions" type="environment"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="+"/> @@ -23058,7 +23268,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="meta-ini.mkiv" name="MPinclusions"> + <cd:command category="graphics metapost" file="meta-ini.mkiv" level="style" name="MPinclusions"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="+"/> @@ -23069,7 +23279,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="meta-ini.mkiv" name="defineMPinstance"> + <cd:command category="graphics metapost" file="meta-ini.mkiv" level="style" name="defineMPinstance"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -23082,7 +23292,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="meta-ini.mkiv" name="setupMPinstance"> + <cd:command category="graphics metapost" file="meta-ini.mkiv" level="style" name="setupMPinstance"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -23120,50 +23330,50 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="meta-ini.mkiv" name="resetMPinstance"> + <cd:command category="graphics metapost" file="meta-ini.mkiv" level="system" name="resetMPinstance"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="meta-ini.mkiv" name="processMPfigurefile"> + <cd:command category="graphics metapost" file="meta-ini.mkiv" level="document" name="processMPfigurefile"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:file"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="meta-ini.mkiv" name="MPdrawing" type="environment"> + <cd:command category="graphics metapost" file="meta-ini.mkiv" level="document" name="MPdrawing" type="environment"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="-"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="meta-ini.mkiv" name="resetMPdrawing"/> - <cd:command file="meta-ini.mkiv" name="getMPdrawing"/> - <cd:command begin="push" end="pop" file="meta-ini.mkiv" name="MPdrawing" type="environment"/> - <cd:command file="meta-ini.mkiv" name="MPdrawing"> + <cd:command category="graphics metapost" file="meta-ini.mkiv" level="document" name="resetMPdrawing"/> + <cd:command category="graphics metapost" file="meta-ini.mkiv" level="document" name="getMPdrawing"/> + <cd:command begin="push" category="graphics metapost" end="pop" file="meta-ini.mkiv" level="system" name="MPdrawing" type="environment"/> + <cd:command category="graphics metapost" file="meta-ini.mkiv" level="document" name="MPdrawing"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="meta-ini.mkiv" name="MPclip" type="environment"> + <cd:command category="graphics metapost" file="meta-ini.mkiv" level="document" name="MPclip" type="environment"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="meta-ini.mkiv" name="MPfontsizehskip"> + <cd:command category="graphics metapost fonts" file="meta-ini.mkiv" level="system" name="MPfontsizehskip"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:font"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="meta-ini.mkiv" name="setupMPvariables"> + <cd:command file="meta-ini.mkiv" level="style" name="setupMPvariables"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -23175,7 +23385,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="meta-ini.mkiv" name="setMPvariables"> + <cd:command file="meta-ini.mkiv" level="style" name="setMPvariables"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -23187,7 +23397,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="meta-ini.mkiv" name="setMPvariable"> + <cd:command file="meta-ini.mkiv" level="style" name="setMPvariable"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -23199,7 +23409,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="meta-ini.mkiv" name="MPrawvar"> + <cd:command file="meta-ini.mkiv" level="system" name="MPrawvar"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -23209,21 +23419,21 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="meta-ini.mkiv" name="MPvariable"> + <cd:command file="meta-ini.mkiv" level="style" name="MPvariable"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:key"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="meta-ini.mkiv" name="MPvar"> + <cd:command file="meta-ini.mkiv" level="style" name="MPvar"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:key"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="meta-ini.mkiv" name="useMPvariables"> + <cd:command file="meta-ini.mkiv" level="style" name="useMPvariables"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -23233,7 +23443,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="meta-ini.mkiv" name="uniqueMPgraphic" type="environment"> + <cd:command category="graphics metapost" file="meta-ini.mkiv" level="style" name="uniqueMPgraphic" type="environment"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -23243,7 +23453,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="meta-ini.mkiv" name="uniqueMPgraphic"> + <cd:command category="graphics metapost" file="meta-ini.mkiv" level="style" name="uniqueMPgraphic"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -23255,7 +23465,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="meta-ini.mkiv" name="useMPgraphic" type="environment"> + <cd:command category="graphics metapost" file="meta-ini.mkiv" level="style" name="useMPgraphic" type="environment"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -23265,7 +23475,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="meta-ini.mkiv" name="useMPgraphic"> + <cd:command category="graphics metapost" file="meta-ini.mkiv" level="style" name="useMPgraphic"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -23277,7 +23487,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="meta-ini.mkiv" name="usableMPgraphic" type="environment"> + <cd:command category="graphics metapost" file="meta-ini.mkiv" level="style" name="usableMPgraphic" type="environment"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -23287,7 +23497,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="meta-ini.mkiv" name="reuseMPgraphic"> + <cd:command category="graphics metapost" file="meta-ini.mkiv" level="style" name="reuseMPgraphic"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -23299,7 +23509,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="meta-ini.mkiv" name="reusableMPgraphic" type="environment"> + <cd:command category="graphics metapost" file="meta-ini.mkiv" level="style" name="reusableMPgraphic" type="environment"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -23309,7 +23519,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="meta-ini.mkiv" name="reusableMPgraphic"> + <cd:command category="graphics metapost" file="meta-ini.mkiv" level="style" name="reusableMPgraphic"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -23321,7 +23531,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="meta-ini.mkiv" name="uniqueMPpagegraphic" type="environment"> + <cd:command category="graphics metapost" file="meta-ini.mkiv" level="style" name="uniqueMPpagegraphic" type="environment"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -23331,7 +23541,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="meta-ini.mkiv" name="uniqueMPpagegraphic"> + <cd:command category="graphics metapost" file="meta-ini.mkiv" level="style" name="uniqueMPpagegraphic"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -23343,21 +23553,21 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="meta-ini.mkiv" name="processMPbuffer"> + <cd:command category="graphics metapost" file="meta-ini.mkiv" level="document" name="processMPbuffer"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="meta-ini.mkiv" name="runMPbuffer"> + <cd:command category="graphics metapost" file="meta-ini.mkiv" level="document" name="runMPbuffer"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="meta-ini.mkiv" name="MPenvironment" type="environment"> + <cd:command category="graphics metapost" file="meta-ini.mkiv" level="style" name="MPenvironment" type="environment"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="reset"/> @@ -23366,22 +23576,22 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="meta-ini.mkiv" name="resetMPenvironment"/> - <cd:command file="meta-ini.mkiv" name="useMPenvironmentbuffer"> + <cd:command category="graphics" file="meta-ini.mkiv" level="style" name="resetMPenvironment"/> + <cd:command category="graphics metapost" file="meta-ini.mkiv" level="style" name="useMPenvironmentbuffer"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="meta-ini.mkiv" name="MPcode" type="environment"> + <cd:command category="graphics metapost" file="meta-ini.mkiv" level="document" name="MPcode" type="environment"> <cd:arguments> <cd:keywords delimiters="braces" optional="yes"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="meta-ini.mkiv" name="MPcode"> + <cd:command category="graphics metapost" file="meta-ini.mkiv" level="document" name="MPcode"> <cd:arguments> <cd:keywords delimiters="braces" optional="yes"> <cd:constant type="cd:name"/> @@ -23389,14 +23599,14 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="meta-ini.mkiv" name="MPrun" type="environment"> + <cd:command category="graphics metapost" file="meta-ini.mkiv" level="document" name="MPrun" type="environment"> <cd:arguments> <cd:keywords delimiters="braces" optional="yes"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="meta-ini.mkiv" name="useMPrun"> + <cd:command category="graphics metapost" file="meta-ini.mkiv" level="document" name="useMPrun"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -23406,14 +23616,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="meta-ini.mkiv" name="useMPlibrary"> + <cd:command category="graphics metapost" file="meta-ini.mkiv" level="style" name="useMPlibrary"> <cd:arguments> <cd:keywords> <cd:constant type="cd:file"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="meta-ini.mkiv" name="setMPtext"> + <cd:command category="graphics metapost" file="meta-ini.mkiv" level="style" name="setMPtext"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -23423,28 +23633,28 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="meta-ini.mkiv" name="MPtext"> + <cd:command category="graphics metapost" file="meta-ini.mkiv" level="style" name="MPtext"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="meta-ini.mkiv" name="MPstring"> + <cd:command category="graphics metapost" file="meta-ini.mkiv" level="style" name="MPstring"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="meta-ini.mkiv" name="MPbetex"> + <cd:command category="graphics metapost" file="meta-ini.mkiv" level="style" name="MPbetex"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="meta-ini.mkiv" name="doifelseMPgraphic"> + <cd:command category="graphics metapost conditional" file="meta-ini.mkiv" level="style" name="doifelseMPgraphic"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -23457,7 +23667,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="meta-ini.mkiv" name="doifMPgraphicelse"> + <cd:command category="graphics metapost conditional" file="meta-ini.mkiv" level="style" name="doifMPgraphicelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -23470,14 +23680,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="meta-ini.mkiv" name="staticMPfigure" type="environment"> + <cd:command category="graphics metapost" file="meta-ini.mkiv" level="style" name="staticMPfigure" type="environment"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="meta-ini.mkiv" name="staticMPgraphic" type="environment"> + <cd:command category="graphics metapost" file="meta-ini.mkiv" level="style" name="staticMPgraphic" type="environment"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -23487,7 +23697,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="meta-ini.mkiv" name="usestaticMPfigure"> + <cd:command category="graphics metapost" file="meta-ini.mkiv" level="style" name="usestaticMPfigure"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupscale"/> @@ -23497,7 +23707,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="meta-ini.mkiv" name="setupMPgraphics"> + <cd:command category="graphics metapost" file="meta-ini.mkiv" level="style" name="setupMPgraphics"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="color"> @@ -23512,7 +23722,7 @@ </cd:command> </cd:interface> <cd:interface file="i-mixedcolumns.xml"> - <cd:command file="page-mix.mkiv" name="definemixedcolumns"> + <cd:command category="structure layout" file="page-mix.mkiv" level="style" name="definemixedcolumns"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -23525,7 +23735,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-mix.mkiv" name="setupmixedcolumns"> + <cd:command category="structure layout" file="page-mix.mkiv" level="style" name="setupmixedcolumns"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -23608,7 +23818,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-mix.mkiv" name="mixedcolumns" type="environment"> + <cd:command category="structure layout" file="page-mix.mkiv" level="document" name="mixedcolumns" type="environment"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -23618,7 +23828,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-mix.mkiv" generated="yes" name="mixedcolumns" type="environment" variant="instance"> + <cd:command category="structure layout" file="page-mix.mkiv" generated="yes" level="document" name="mixedcolumns" type="environment" variant="instance"> <cd:sequence> <cd:instance value="mixedcolumns"/> </cd:sequence> @@ -23627,95 +23837,98 @@ <cd:inherit name="setupmixedcolumns"/> </cd:assignments> </cd:arguments> - <cd:instances/> + <cd:instances> + <cd:constant value="itemgroupcolumns"/> + <cd:constant value="boxedcolumns"/> + </cd:instances> </cd:command> </cd:interface> <cd:interface file="i-modes.xml"> - <cd:command file="core-env.mkiv" name="newmode"> + <cd:command category="structure" file="core-env.mkiv" level="system" name="newmode"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="setmode"> + <cd:command category="structure" file="core-env.mkiv" level="system" name="setmode"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="resetmode"> + <cd:command category="structure" file="core-env.mkiv" level="system" name="resetmode"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="newsystemmode"> + <cd:command category="structure" file="core-env.mkiv" level="system" name="newsystemmode"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="setsystemmode"> + <cd:command category="structure" file="core-env.mkiv" level="system" name="setsystemmode"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="resetsystemmode"> + <cd:command category="structure" file="core-env.mkiv" level="system" name="resetsystemmode"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="preventmode"> + <cd:command category="structure" file="core-env.mkiv" level="style" name="preventmode"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="enablemode"> + <cd:command category="structure" file="core-env.mkiv" level="style" name="enablemode"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="disablemode"> + <cd:command category="structure" file="core-env.mkiv" level="style" name="disablemode"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="globalpreventmode"> + <cd:command category="structure" file="core-env.mkiv" level="system" name="globalpreventmode"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="globalenablemode"> + <cd:command category="structure" file="core-env.mkiv" level="system" name="globalenablemode"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="globaldisablemode"> + <cd:command category="structure" file="core-env.mkiv" level="system" name="globaldisablemode"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="definemode"> + <cd:command category="structure" file="core-env.mkiv" level="style" name="definemode"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:name"/> @@ -23727,14 +23940,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="booleanmodevalue"> + <cd:command category="structure" file="core-env.mkiv" level="system" name="booleanmodevalue"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="doifelsemode"> + <cd:command category="structure conditional" file="core-env.mkiv" level="style" name="doifelsemode"> <cd:arguments> <cd:keywords delimiters="braces" list="yes"> <cd:constant type="cd:name"/> @@ -23747,7 +23960,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="doifmodeelse"> + <cd:command category="structure conditional" file="core-env.mkiv" level="style" name="doifmodeelse"> <cd:arguments> <cd:keywords delimiters="braces" list="yes"> <cd:constant type="cd:name"/> @@ -23760,7 +23973,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="doifmode"> + <cd:command category="structure conditional" file="core-env.mkiv" level="style" name="doifmode"> <cd:arguments> <cd:keywords delimiters="braces" list="yes"> <cd:constant type="cd:name"/> @@ -23770,7 +23983,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="doifnotmode"> + <cd:command category="structure conditional" file="core-env.mkiv" level="style" name="doifnotmode"> <cd:arguments> <cd:keywords delimiters="braces" list="yes"> <cd:constant type="cd:name"/> @@ -23780,21 +23993,21 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="mode" type="environment"> + <cd:command category="structure" file="core-env.mkiv" level="style" name="mode" type="environment"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="notmode" type="environment"> + <cd:command category="structure" file="core-env.mkiv" level="style" name="notmode" type="environment"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="doifelseallmodes"> + <cd:command category="structure conditional" file="core-env.mkiv" level="style" name="doifelseallmodes"> <cd:arguments> <cd:keywords delimiters="braces" list="yes"> <cd:constant type="cd:name"/> @@ -23807,7 +24020,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="doifallmodeselse"> + <cd:command category="structure conditional" file="core-env.mkiv" level="style" name="doifallmodeselse"> <cd:arguments> <cd:keywords delimiters="braces" list="yes"> <cd:constant type="cd:name"/> @@ -23820,7 +24033,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="doifallmodes"> + <cd:command category="structure conditional" file="core-env.mkiv" level="style" name="doifallmodes"> <cd:arguments> <cd:keywords delimiters="braces" list="yes"> <cd:constant type="cd:name"/> @@ -23833,7 +24046,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="doifnotallmodes"> + <cd:command category="structure conditional" file="core-env.mkiv" level="style" name="doifnotallmodes"> <cd:arguments> <cd:keywords delimiters="braces" list="yes"> <cd:constant type="cd:name"/> @@ -23846,21 +24059,21 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="allmodes" type="environment"> + <cd:command category="structure" file="core-env.mkiv" level="style" name="allmodes" type="environment"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="notallmodes" type="environment"> + <cd:command category="structure" file="core-env.mkiv" level="style" name="notallmodes" type="environment"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="modeset" type="environment"> + <cd:command category="structure" file="core-env.mkiv" level="style" name="modeset" type="environment"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:name"/> @@ -23869,28 +24082,28 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="pushmode"> + <cd:command category="structure" file="core-env.mkiv" level="system" name="pushmode"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="popmode"> + <cd:command category="structure" file="core-env.mkiv" level="system" name="popmode"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="pushsystemmode"> + <cd:command category="structure" file="core-env.mkiv" level="system" name="pushsystemmode"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="popsystemmode"> + <cd:command category="structure" file="core-env.mkiv" level="system" name="popsystemmode"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -23899,7 +24112,7 @@ </cd:command> </cd:interface> <cd:interface file="i-modules.xml"> - <cd:command file="file-mod.mkvi" name="usemodule"> + <cd:command file="file-mod.mkvi" level="style" name="usemodule"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="m"/> @@ -23918,7 +24131,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="file-mod.mkvi" name="usetexmodule"> + <cd:command file="file-mod.mkvi" level="style" name="usetexmodule"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="m"/> @@ -23937,21 +24150,21 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="file-mod.mkvi" name="module" type="environment"> + <cd:command file="file-mod.mkvi" level="system" name="module" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:file"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-mod.mkvi" name="module" type="environment" variant="string"> + <cd:command file="file-mod.mkvi" level="system" name="module" type="environment" variant="string"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:file"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-mod.mkvi" name="setupmodule"> + <cd:command file="file-mod.mkvi" level="system" name="setupmodule"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:file"/> @@ -23967,7 +24180,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="file-mod.mkvi" name="moduleparameter"> + <cd:command file="file-mod.mkvi" level="system" name="moduleparameter"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:file"/> @@ -23977,15 +24190,15 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-mod.mkvi" name="currentmoduleparameter"> + <cd:command file="file-mod.mkvi" level="system" name="currentmoduleparameter"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:key"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-mod.mkvi" name="moduletestsection" type="environment"/> - <cd:command file="file-mod.mkvi" name="fetchruntinecommand"> + <cd:command file="file-mod.mkvi" level="system" name="moduletestsection" type="environment"/> + <cd:command file="file-mod.mkvi" level="system" name="fetchruntinecommand"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -23993,14 +24206,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-mod.mkvi" name="luaenvironment"> + <cd:command file="file-mod.mkvi" level="system" name="luaenvironment"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:file"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-mod.mkvi" name="useluamodule"> + <cd:command file="file-mod.mkvi" level="system" name="useluamodule"> <cd:arguments> <cd:keywords> <cd:constant type="cd:file"/> @@ -24009,7 +24222,7 @@ </cd:command> </cd:interface> <cd:interface file="i-narrow.xml"> - <cd:command file="spac-hor.mkiv" name="definenarrower"> + <cd:command category="whitespace layout" file="spac-hor.mkiv" level="style" name="definenarrower"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -24022,7 +24235,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="spac-hor.mkiv" name="setupnarrower"> + <cd:command category="whitespace layout" file="spac-hor.mkiv" level="style" name="setupnarrower"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -24055,7 +24268,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="spac-hor.mkiv" name="narrower" type="environment"> + <cd:command category="whitespace layout" file="spac-hor.mkiv" level="document" name="narrower" type="environment"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant method="none" prefix="cd:sign" type="left"/> @@ -24065,10 +24278,11 @@ <cd:constant method="factor" prefix="cd:number" type="middle"/> <cd:constant method="factor" prefix="cd:number" type="right"/> <cd:constant type="reset"/> + <cd:constant type="reverse"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-hor.mkiv" generated="yes" name="narrower" type="environment" variant="example"> + <cd:command category="whitespace layout" file="spac-hor.mkiv" generated="yes" level="document" name="narrower" type="environment" variant="example"> <cd:sequence> <cd:variable value="narrower"/> </cd:sequence> @@ -24081,10 +24295,11 @@ <cd:constant method="factor" prefix="cd:number" type="middle"/> <cd:constant method="factor" prefix="cd:number" type="right"/> <cd:constant type="reset"/> + <cd:constant type="reverse"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-hor.mkiv" name="narrow" type="environment"> + <cd:command category="whitespace layout" file="spac-hor.mkiv" level="document" name="narrow" type="environment"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -24094,7 +24309,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="spac-hor.mkiv" name="narrow" type="environment" variant="name"> + <cd:command category="whitespace layout" file="spac-hor.mkiv" level="document" name="narrow" type="environment" variant="name"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -24107,10 +24322,11 @@ <cd:constant method="factor" prefix="cd:number" type="middle"/> <cd:constant method="factor" prefix="cd:number" type="right"/> <cd:constant type="reset"/> + <cd:constant type="reverse"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-hor.mkiv" name="narrow" type="environment" variant="assignment"> + <cd:command category="whitespace layout" file="spac-hor.mkiv" level="document" name="narrow" type="environment" variant="assignment"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupnarrower"/> @@ -24123,12 +24339,13 @@ <cd:constant method="factor" prefix="cd:number" type="middle"/> <cd:constant method="factor" prefix="cd:number" type="right"/> <cd:constant type="reset"/> + <cd:constant type="reverse"/> </cd:keywords> </cd:arguments> </cd:command> </cd:interface> <cd:interface file="i-naturaltable.xml"> - <cd:command file="tabl-ntb.mkiv" name="setupTABLE"> + <cd:command category="tables" file="tabl-ntb.mkiv" level="style" name="setupTABLE"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="r"/> @@ -24248,14 +24465,14 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command begin="b" end="e" file="tabl-ntb.mkiv" name="TABLE" type="environment"> + <cd:command begin="b" category="tables" end="e" file="tabl-ntb.mkiv" level="document" name="TABLE" type="environment"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupTABLE"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command begin="b" end="e" file="tabl-ntb.mkiv" name="TD" type="environment"> + <cd:command begin="b" category="tables" end="e" file="tabl-ntb.mkiv" level="document" name="TD" type="environment"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="nx"> @@ -24283,77 +24500,77 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command begin="b" end="e" file="tabl-ntb.mkiv" name="TR" type="environment"> + <cd:command begin="b" category="tables" end="e" file="tabl-ntb.mkiv" level="document" name="TR" type="environment"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupTABLE"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command begin="b" end="e" file="tabl-ntb.mkiv" name="TC" type="environment"> + <cd:command begin="b" category="tables" end="e" file="tabl-ntb.mkiv" level="document" name="TC" type="environment"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="bTD"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command begin="b" end="e" file="tabl-ntb.mkiv" name="TX" type="environment"> + <cd:command begin="b" category="tables" end="e" file="tabl-ntb.mkiv" level="document" name="TX" type="environment"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="bTD"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command begin="b" end="e" file="tabl-ntb.mkiv" name="TY" type="environment"> + <cd:command begin="b" category="tables" end="e" file="tabl-ntb.mkiv" level="document" name="TY" type="environment"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupTABLE"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command begin="b" end="e" file="tabl-ntb.mkiv" name="TH" type="environment"> + <cd:command begin="b" category="tables" end="e" file="tabl-ntb.mkiv" level="document" name="TH" type="environment"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="bTD"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command begin="b" end="e" file="tabl-ntb.mkiv" name="TN" type="environment"> + <cd:command begin="b" category="tables" end="e" file="tabl-ntb.mkiv" level="document" name="TN" type="environment"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="bTD"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command begin="b" end="e" file="tabl-ntb.mkiv" name="TABLEhead" type="environment"> + <cd:command begin="b" category="tables" end="e" file="tabl-ntb.mkiv" level="document" name="TABLEhead" type="environment"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupTABLE"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command begin="b" end="e" file="tabl-ntb.mkiv" name="TABLEnext" type="environment"> + <cd:command begin="b" category="tables" end="e" file="tabl-ntb.mkiv" level="document" name="TABLEnext" type="environment"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupTABLE"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command begin="b" end="e" file="tabl-ntb.mkiv" name="TABLEbody" type="environment"> + <cd:command begin="b" category="tables" end="e" file="tabl-ntb.mkiv" level="document" name="TABLEbody" type="environment"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupTABLE"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command begin="b" end="e" file="tabl-ntb.mkiv" name="TABLEfoot" type="environment"> + <cd:command begin="b" category="tables" end="e" file="tabl-ntb.mkiv" level="document" name="TABLEfoot" type="environment"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupTABLE"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="tabl-ntb.mkiv" name="defineTABLEsetup"> + <cd:command category="tables" file="tabl-ntb.mkiv" level="style" name="defineTABLEsetup"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -24363,49 +24580,49 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command begin="b" end="e" file="tabl-ntb.mkiv" name="TDs" type="environment"> + <cd:command begin="b" category="tables" end="e" file="tabl-ntb.mkiv" level="document" name="TDs" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command begin="b" end="e" file="tabl-ntb.mkiv" name="TRs" type="environment"> + <cd:command begin="b" category="tables" end="e" file="tabl-ntb.mkiv" level="document" name="TRs" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="tabl-ntb.mkiv" name="TABLE" type="environment"> + <cd:command category="tables" file="tabl-ntb.mkiv" level="document" name="TABLE" type="environment"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupTABLE"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="tabl-ntb.mkiv" name="TABLEhead" type="environment"> + <cd:command category="tables" file="tabl-ntb.mkiv" level="document" name="TABLEhead" type="environment"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupTABLE"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="tabl-ntb.mkiv" name="TABLEnext" type="environment"> + <cd:command category="tables" file="tabl-ntb.mkiv" level="document" name="TABLEnext" type="environment"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupTABLE"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="tabl-ntb.mkiv" name="TABLEbody" type="environment"> + <cd:command category="tables" file="tabl-ntb.mkiv" level="document" name="TABLEbody" type="environment"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupTABLE"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="tabl-ntb.mkiv" name="TABLEfoot" type="environment"> + <cd:command category="tables" file="tabl-ntb.mkiv" level="document" name="TABLEfoot" type="environment"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupTABLE"/> @@ -24414,7 +24631,7 @@ </cd:command> </cd:interface> <cd:interface file="i-note.xml"> - <cd:command file="strc-not.mkvi" name="setupnotation"> + <cd:command category="structure notes" file="strc-not.mkvi" level="style" name="setupnotation"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -24538,6 +24755,12 @@ <cd:constant type="none"/> <cd:constant type="cd:dimension"/> </cd:parameter> + <cd:parameter name="stretch"> + <cd:constant type="cd:number"/> + </cd:parameter> + <cd:parameter name="shrink"> + <cd:constant type="cd:number"/> + </cd:parameter> <cd:parameter name="hang"> <cd:constant type="fit"/> <cd:constant type="broad"/> @@ -24588,7 +24811,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-not.mkvi" name="setupnotations"> + <cd:command category="structure notes" file="strc-not.mkvi" level="style" name="setupnotations"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -24598,7 +24821,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-not.mkvi" generated="yes" name="note" type="environment" variant="instance:assignment"> + <cd:command category="structure notes" file="strc-not.mkvi" generated="yes" level="document" name="note" type="environment" variant="instance:assignment"> <cd:sequence> <cd:instance value="note"/> </cd:sequence> @@ -24618,9 +24841,12 @@ </cd:parameter> </cd:assignments> </cd:arguments> - <cd:instances/> + <cd:instances> + <cd:constant value="footnote"/> + <cd:constant value="endnote"/> + </cd:instances> </cd:command> - <cd:command file="strc-not.mkvi" generated="yes" name="note" type="environment" variant="instance"> + <cd:command category="structure notes" file="strc-not.mkvi" generated="yes" level="document" name="note" type="environment" variant="instance"> <cd:sequence> <cd:instance value="note"/> </cd:sequence> @@ -24629,9 +24855,12 @@ <cd:constant type="cd:reference"/> </cd:keywords> </cd:arguments> - <cd:instances/> + <cd:instances> + <cd:constant value="footnote"/> + <cd:constant value="endnote"/> + </cd:instances> </cd:command> - <cd:command file="strc-not.mkvi" generated="yes" name="note" variant="instance"> + <cd:command category="structure notes" file="strc-not.mkvi" generated="yes" level="document" name="note" variant="instance"> <cd:sequence> <cd:instance value="note"/> </cd:sequence> @@ -24643,9 +24872,12 @@ <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> - <cd:instances/> + <cd:instances> + <cd:constant value="footnote"/> + <cd:constant value="endnote"/> + </cd:instances> </cd:command> - <cd:command file="strc-not.mkvi" generated="yes" name="note" variant="instance:assignment"> + <cd:command category="structure notes" file="strc-not.mkvi" generated="yes" level="document" name="note" variant="instance:assignment"> <cd:sequence> <cd:instance value="note"/> </cd:sequence> @@ -24665,9 +24897,12 @@ </cd:parameter> </cd:assignments> </cd:arguments> - <cd:instances/> + <cd:instances> + <cd:constant value="footnote"/> + <cd:constant value="endnote"/> + </cd:instances> </cd:command> - <cd:command file="strc-not.mkvi" name="definenote"> + <cd:command category="structure notes" file="strc-not.mkvi" level="style" name="definenote"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -24680,7 +24915,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-not.mkvi" name="setupnote"> + <cd:command category="structure notes" file="strc-not.mkvi" level="style" name="setupnote"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -24813,11 +25048,17 @@ <cd:parameter name="anchor"> <cd:constant type="next"/> </cd:parameter> + <cd:parameter name="spacebefore"> + <cd:inherit name="blank"/> + </cd:parameter> + <cd:parameter name="spaceinbetween"> + <cd:inherit name="blank"/> + </cd:parameter> <cd:inherit name="setupframed"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-not.mkvi" name="setupnotes"> + <cd:command category="structure notes" file="strc-not.mkvi" level="style" name="setupnotes"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -24827,7 +25068,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-not.mkvi" name="setnote"> + <cd:command category="structure notes" file="strc-not.mkvi" level="document" name="setnote"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -24840,7 +25081,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-not.mkvi" name="setnote" variant="assignment"> + <cd:command category="structure notes" file="strc-not.mkvi" level="document" name="setnote" variant="assignment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -24861,7 +25102,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-not.mkvi" name="setnotetext"> + <cd:command category="structure notes" file="strc-not.mkvi" level="document" name="setnotetext"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -24874,7 +25115,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-not.mkvi" name="setnotetext" variant="assignment"> + <cd:command category="structure notes" file="strc-not.mkvi" level="document" name="setnotetext" variant="assignment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -24895,7 +25136,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-not.mkvi" name="placenotes"> + <cd:command category="structure notes" file="strc-not.mkvi" level="document" name="placenotes"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:name"/> @@ -24905,14 +25146,14 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-not.mkvi" name="localnotes" type="environment"> + <cd:command category="structure notes" file="strc-not.mkvi" level="document" name="localnotes" type="environment"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-not.mkvi" name="placelocalnotes"> + <cd:command category="structure notes" file="strc-not.mkvi" level="document" name="placelocalnotes"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -24922,9 +25163,9 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-not.mkvi" name="postponenotes"/> - <cd:command file="strc-not.mkvi" name="flushnotes"/> - <cd:command file="strc-not.mkvi" name="doifelsenoteonsamepage"> + <cd:command category="structure notes" file="strc-not.mkvi" level="style" name="postponenotes"/> + <cd:command category="structure notes" file="strc-not.mkvi" level="style" name="flushnotes"/> + <cd:command category="structure notes conditional" file="strc-not.mkvi" level="system" name="doifelsenoteonsamepage"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -24937,7 +25178,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-not.mkvi" name="doifnoteonsamepageelse"> + <cd:command category="structure notes conditional" file="strc-not.mkvi" level="system" name="doifnoteonsamepageelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -24950,7 +25191,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-not.mkvi" name="doifnotescollected"> + <cd:command category="structure notes conditional" file="strc-not.mkvi" level="system" name="doifnotescollected"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -24960,7 +25201,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-not.mkvi" name="notesymbol"> + <cd:command category="structure notes" file="strc-not.mkvi" level="system" name="notesymbol"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -24970,7 +25211,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-not.mkvi" name="note"> + <cd:command category="structure notes" file="strc-not.mkvi" level="document" name="note"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -24980,7 +25221,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-not.mkvi" name="footnotetext"> + <cd:command category="structure notes" file="strc-not.mkvi" level="document" name="footnotetext"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:reference"/> @@ -24990,7 +25231,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-not.mkvi" name="footnotetext" variant="assignment"> + <cd:command category="structure notes" file="strc-not.mkvi" level="document" name="footnotetext" variant="assignment"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="title"> @@ -25008,22 +25249,22 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-not.mkvi" name="placefootnotes"> + <cd:command category="structure notes" file="strc-not.mkvi" level="document" name="placefootnotes"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupnote"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-not.mkvi" name="localfootnotes" type="environment"/> - <cd:command file="strc-not.mkvi" name="placelocalfootnotes"> + <cd:command category="structure notes" file="strc-not.mkvi" level="document" name="localfootnotes" type="environment"/> + <cd:command category="structure notes" file="strc-not.mkvi" level="document" name="placelocalfootnotes"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupnote"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-lnt.mkvi" name="definelinenote"> + <cd:command category="structure notes" file="strc-lnt.mkvi" level="style" name="definelinenote"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -25036,7 +25277,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-lnt.mkvi" name="setuplinenote"> + <cd:command category="structure notes" file="strc-lnt.mkvi" level="style" name="setuplinenote"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -25061,7 +25302,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-lnt.mkvi" generated="yes" name="linenote" variant="instance"> + <cd:command category="structure notes" file="strc-lnt.mkvi" generated="yes" level="document" name="linenote" variant="instance"> <cd:sequence> <cd:instance value="linenote"/> </cd:sequence> @@ -25070,9 +25311,11 @@ <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> - <cd:instances/> + <cd:instances> + <cd:constant value="linenote"/> + </cd:instances> </cd:command> - <cd:command file="strc-lnt.mkvi" generated="yes" name="startlinenote" variant="instance"> + <cd:command category="structure notes" file="strc-lnt.mkvi" generated="yes" level="document" name="startlinenote" variant="instance"> <cd:sequence> <cd:string value="start"/> <cd:instance value="linenote"/> @@ -25085,9 +25328,11 @@ <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> - <cd:instances/> + <cd:instances> + <cd:constant value="linenote"/> + </cd:instances> </cd:command> - <cd:command file="strc-lnt.mkvi" generated="yes" name="stoplinenote" variant="instance"> + <cd:command category="structure notes" file="strc-lnt.mkvi" generated="yes" level="document" name="stoplinenote" variant="instance"> <cd:sequence> <cd:string value="stop"/> <cd:instance value="linenote"/> @@ -25097,9 +25342,11 @@ <cd:constant type="cd:reference"/> </cd:keywords> </cd:arguments> - <cd:instances/> + <cd:instances> + <cd:constant value="linenote"/> + </cd:instances> </cd:command> - <cd:command file="strc-lnt.mkvi" name="fromlinenote"> + <cd:command category="structure notes" file="strc-lnt.mkvi" level="document" name="fromlinenote"> <cd:arguments> <cd:keywords> <cd:constant type="cd:reference"/> @@ -25109,7 +25356,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-lnt.mkvi" name="tolinenote"> + <cd:command category="structure notes" file="strc-lnt.mkvi" level="document" name="tolinenote"> <cd:arguments> <cd:keywords> <cd:constant type="cd:reference"/> @@ -25118,7 +25365,7 @@ </cd:command> </cd:interface> <cd:interface file="i-object.xml"> - <cd:command file="pack-obj.mkiv" name="ifinobject"> + <cd:command category="pdf" file="pack-obj.mkiv" level="system" name="ifinobject"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:true"/> @@ -25130,11 +25377,11 @@ <cd:delimiter name="fi"/> </cd:arguments> </cd:command> - <cd:command file="pack-obj.mkiv" name="objectmargin"/> - <cd:command file="pack-obj.mkiv" name="objectwidth"/> - <cd:command file="pack-obj.mkiv" name="objectheight"/> - <cd:command file="pack-obj.mkiv" name="objectdepth"/> - <cd:command file="pack-obj.mkiv" name="setreferencedobject"> + <cd:command category="pdf" file="pack-obj.mkiv" level="system" name="objectmargin"/> + <cd:command category="pdf" file="pack-obj.mkiv" level="system" name="objectwidth"/> + <cd:command category="pdf" file="pack-obj.mkiv" level="system" name="objectheight"/> + <cd:command category="pdf" file="pack-obj.mkiv" level="system" name="objectdepth"/> + <cd:command category="pdf" file="pack-obj.mkiv" level="system" name="setreferencedobject"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -25146,7 +25393,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="pack-obj.mkiv" name="settightreferencedobject"> + <cd:command category="pdf" file="pack-obj.mkiv" level="system" name="settightreferencedobject"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -25158,7 +25405,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="pack-obj.mkiv" name="setunreferencedobject"> + <cd:command category="pdf" file="pack-obj.mkiv" level="system" name="setunreferencedobject"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -25170,7 +25417,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="pack-obj.mkiv" name="settightunreferencedobject"> + <cd:command category="pdf" file="pack-obj.mkiv" level="system" name="settightunreferencedobject"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -25182,7 +25429,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="pack-obj.mkiv" name="setobject"> + <cd:command category="pdf" file="pack-obj.mkiv" level="system" name="setobject"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -25194,7 +25441,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="pack-obj.mkiv" name="settightobject"> + <cd:command category="pdf" file="pack-obj.mkiv" level="system" name="settightobject"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -25206,7 +25453,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="pack-obj.mkiv" name="getobject"> + <cd:command category="pdf" file="pack-obj.mkiv" level="system" name="getobject"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -25216,7 +25463,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="pack-obj.mkiv" name="getobjectdimensions"> + <cd:command category="pdf" file="pack-obj.mkiv" level="system" name="getobjectdimensions"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -25226,9 +25473,9 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="pack-obj.mkiv" name="defaultobjectreference"/> - <cd:command file="pack-obj.mkiv" name="defaultobjectpage"/> - <cd:command file="pack-obj.mkiv" name="doifelseobjectfound"> + <cd:command category="pdf" file="pack-obj.mkiv" level="system" name="defaultobjectreference"/> + <cd:command category="pdf" file="pack-obj.mkiv" level="system" name="defaultobjectpage"/> + <cd:command category="pdf conditional" file="pack-obj.mkiv" level="system" name="doifelseobjectfound"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -25244,7 +25491,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="pack-obj.mkiv" name="doifobjectfoundelse"> + <cd:command category="pdf conditional" file="pack-obj.mkiv" level="system" name="doifobjectfoundelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -25260,7 +25507,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="pack-obj.mkiv" name="doifelseobjectreferencefound"> + <cd:command category="pdf conditional" file="pack-obj.mkiv" level="system" name="doifelseobjectreferencefound"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -25276,7 +25523,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="pack-obj.mkiv" name="doifobjectreferencefoundelse"> + <cd:command category="pdf conditional" file="pack-obj.mkiv" level="system" name="doifobjectreferencefoundelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -25294,7 +25541,7 @@ </cd:command> </cd:interface> <cd:interface file="i-offset.xml"> - <cd:command file="pack-box.mkiv" name="setupoffsetbox"> + <cd:command category="layout" file="pack-box.mkiv" level="style" name="setupoffsetbox"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="x"> @@ -25345,14 +25592,14 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="pack-box.mkiv" name="setupoffset"> + <cd:command category="layout" file="pack-box.mkiv" level="style" name="setupoffset"> <cd:arguments> <cd:assignments list="yes"> <cd:inherit name="setupoffsetbox"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="pack-box.mkiv" name="offsetbox"> + <cd:command category="layout" file="pack-box.mkiv" level="system" name="offsetbox"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupoffsetbox"/> @@ -25361,7 +25608,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="pack-box.mkiv" name="offset"> + <cd:command category="layout" file="pack-box.mkiv" level="document" name="offset"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupoffset"/> @@ -25371,7 +25618,7 @@ </cd:command> </cd:interface> <cd:interface file="i-opposite.xml"> - <cd:command file="page-fac.mkiv" name="setupoppositeplacing"> + <cd:command category="layout" file="page-fac.mkiv" level="style" name="setupoppositeplacing"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="state"> @@ -25390,10 +25637,10 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-fac.mkiv" name="opposite" type="environment"/> + <cd:command category="layout" file="page-fac.mkiv" level="document" name="opposite" type="environment"/> </cd:interface> <cd:interface file="i-ornament.xml"> - <cd:command file="pack-box.mkiv" name="ornamenttext" variant="collector"> + <cd:command category="background fonts colors" file="pack-box.mkiv" level="document" name="ornamenttext" variant="collector"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="alternative"> @@ -25418,7 +25665,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="pack-box.mkiv" name="ornamenttext" variant="layer"> + <cd:command category="background fonts colors" file="pack-box.mkiv" level="document" name="ornamenttext" variant="layer"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="alternative"> @@ -25436,7 +25683,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="pack-box.mkiv" name="ornamenttext" variant="direct"> + <cd:command category="background fonts colors" file="pack-box.mkiv" level="document" name="ornamenttext" variant="direct"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -25447,7 +25694,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="pack-box.mkiv" name="defineornament" variant="collector"> + <cd:command category="background fonts colors" file="pack-box.mkiv" level="style" name="defineornament" variant="collector"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -25471,7 +25718,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="pack-box.mkiv" name="defineornament" variant="layer"> + <cd:command category="background fonts colors" file="pack-box.mkiv" level="style" name="defineornament" variant="layer"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -25488,7 +25735,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="pack-box.mkiv" generated="yes" name="ornament" variant="example"> + <cd:command category="background fonts colors" file="pack-box.mkiv" generated="yes" level="document" name="ornament" variant="example"> <cd:sequence> <cd:variable value="ornament"/> </cd:sequence> @@ -25501,7 +25748,7 @@ </cd:command> </cd:interface> <cd:interface file="i-output.xml"> - <cd:command file="page-otr.mkvi" name="defineoutputroutine"> + <cd:command category="layout" file="page-otr.mkvi" level="system" name="defineoutputroutine"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -25514,7 +25761,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-otr.mkvi" name="setupoutputroutine"> + <cd:command category="layout" file="page-otr.mkvi" level="system" name="setupoutputroutine"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -25526,22 +25773,22 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-otr.mkvi" name="setupoutputroutine" variant="name"> + <cd:command category="layout" file="page-otr.mkvi" level="system" name="setupoutputroutine" variant="name"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-otr.mkvi" name="defineoutputroutinecommand"> + <cd:command category="layout" file="page-otr.mkvi" level="system" name="defineoutputroutinecommand"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:key"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-otr.mkvi" name="traceoutputroutines"/> - <cd:command file="page-otr.mkvi" name="installoutputroutine"> + <cd:command category="layout" file="page-otr.mkvi" level="system" name="traceoutputroutines"/> + <cd:command category="layout" file="page-otr.mkvi" level="system" name="installoutputroutine"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -25551,7 +25798,7 @@ </cd:command> </cd:interface> <cd:interface file="i-overlay.xml"> - <cd:command file="pack-lyr.mkiv" name="defineoverlay"> + <cd:command category="background" file="pack-lyr.mkiv" level="style" name="defineoverlay"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:name"/> @@ -25564,14 +25811,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="pack-rul.mkiv" name="overlaycolor"/> - <cd:command file="pack-rul.mkiv" name="overlaylinecolor"/> - <cd:command file="pack-rul.mkiv" name="overlaywidth"/> - <cd:command file="pack-rul.mkiv" name="overlayheight"/> - <cd:command file="pack-rul.mkiv" name="overlaydepth"/> - <cd:command file="pack-rul.mkiv" name="overlayoffset"/> - <cd:command file="pack-rul.mkiv" name="overlaylinewidth"/> - <cd:command file="pack-rul.mkiv" name="doifelseoverlay"> + <cd:command category="background colors" file="pack-rul.mkiv" level="system" name="overlaycolor"/> + <cd:command category="background colors" file="pack-rul.mkiv" level="system" name="overlaylinecolor"/> + <cd:command category="background" file="pack-rul.mkiv" level="system" name="overlaywidth"/> + <cd:command category="background" file="pack-rul.mkiv" level="system" name="overlayheight"/> + <cd:command category="background" file="pack-rul.mkiv" level="system" name="overlaydepth"/> + <cd:command category="background" file="pack-rul.mkiv" level="system" name="overlayoffset"/> + <cd:command category="background" file="pack-rul.mkiv" level="system" name="overlaylinewidth"/> + <cd:command category="background conditional" file="pack-rul.mkiv" level="system" name="doifelseoverlay"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -25584,7 +25831,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="pack-rul.mkiv" name="doifoverlayelse"> + <cd:command category="background conditional" file="pack-rul.mkiv" level="system" name="doifoverlayelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -25599,7 +25846,7 @@ </cd:command> </cd:interface> <cd:interface file="i-pagebreak.xml"> - <cd:command file="page-brk.mkiv" name="definepagebreak"> + <cd:command file="page-brk.mkiv" level="style" name="definepagebreak"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -25633,7 +25880,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-brk.mkiv" name="pagebreak"> + <cd:command file="page-brk.mkiv" level="document" name="pagebreak"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="empty"/> @@ -25665,14 +25912,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-brk.mkiv" name="page"> + <cd:command file="page-brk.mkiv" level="document" name="page"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:inherit name="pagebreak"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-brk.mkiv" name="definecolumnbreak"> + <cd:command file="page-brk.mkiv" level="style" name="definecolumnbreak"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -25689,7 +25936,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-brk.mkiv" name="columnbreak"> + <cd:command file="page-brk.mkiv" level="document" name="columnbreak"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="yes"/> @@ -25704,14 +25951,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-brk.mkiv" name="column"> + <cd:command file="page-brk.mkiv" level="document" name="column"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:inherit name="columnbreak"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-brk.mkiv" name="definepagechecker"> + <cd:command file="page-brk.mkiv" level="style" name="definepagechecker"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -25724,7 +25971,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-brk.mkiv" name="setuppagechecker"> + <cd:command file="page-brk.mkiv" level="style" name="setuppagechecker"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -25754,7 +26001,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-brk.mkiv" name="checkpage"> + <cd:command file="page-brk.mkiv" level="document" name="checkpage"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -25764,7 +26011,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-brk.mkiv" name="testpage"> + <cd:command file="page-brk.mkiv" level="document" name="testpage"> <cd:arguments> <cd:keywords> <cd:constant type="cd:number"/> @@ -25774,7 +26021,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-brk.mkiv" name="testpageonly"> + <cd:command file="page-brk.mkiv" level="system" name="testpageonly"> <cd:arguments> <cd:keywords> <cd:constant type="cd:number"/> @@ -25784,7 +26031,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-brk.mkiv" name="testpagesync"> + <cd:command file="page-brk.mkiv" level="system" name="testpagesync"> <cd:arguments> <cd:keywords> <cd:constant type="cd:number"/> @@ -25794,7 +26041,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-brk.mkiv" name="testcolumn"> + <cd:command file="page-brk.mkiv" level="document" name="testcolumn"> <cd:arguments> <cd:keywords> <cd:constant type="cd:number"/> @@ -25806,7 +26053,7 @@ </cd:command> </cd:interface> <cd:interface file="i-pagecomment.xml"> - <cd:command file="page-com.mkiv" name="setuppagecomment"> + <cd:command category="pdf" file="page-com.mkiv" level="style" name="setuppagecomment"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="location"> @@ -25836,32 +26083,42 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-com.mkiv" name="pagecomment" type="environment"/> + <cd:command category="pdf" file="page-com.mkiv" level="document" name="pagecomment" type="environment"/> </cd:interface> <cd:interface file="i-pagefigure.xml"> - <cd:command file="page-app.mkiv" name="pagefigure"> + <cd:command category="graphics" file="page-app.mkiv" level="document" name="pagefigure"> <cd:arguments> <cd:keywords> <cd:constant type="cd:file"/> </cd:keywords> <cd:assignments list="yes" optional="yes"> - <cd:inherit name="setupexternalfigure"/> + <cd:parameter name="offset"> + <cd:constant type="default"/> + <cd:constant type="overlay"/> + <cd:constant type="none"/> + <cd:constant type="cd:dimension"/> + </cd:parameter> </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-app.mkiv" name="pagefigure" type="environment"> + <cd:command category="graphics" file="page-app.mkiv" level="document" name="pagefigure" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:file"/> </cd:keywords> <cd:assignments list="yes" optional="yes"> - <cd:inherit name="setupexternalfigure"/> + <cd:parameter name="offset"> + <cd:constant type="default"/> + <cd:constant type="overlay"/> + <cd:constant type="none"/> + <cd:constant type="cd:dimension"/> + </cd:parameter> </cd:assignments> </cd:arguments> </cd:command> </cd:interface> <cd:interface file="i-pagegrid.xml"> - <cd:command file="page-cst.mkiv" name="definepagegrid"> + <cd:command category="layout" file="page-cst.mkiv" level="style" name="definepagegrid"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -25874,7 +26131,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-cst.mkiv" name="setuppagegrid"> + <cd:command category="layout" file="page-cst.mkiv" level="style" name="setuppagegrid"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -25916,7 +26173,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-cst.mkiv" generated="yes" name="pagegrid" type="environment" variant="example"> + <cd:command category="layout" file="page-cst.mkiv" generated="yes" level="document" name="pagegrid" type="environment" variant="example"> <cd:sequence> <cd:variable value="pagegrid"/> </cd:sequence> @@ -25926,7 +26183,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-cst.mkiv" name="pagegrid" type="environment"> + <cd:command category="layout" file="page-cst.mkiv" level="document" name="pagegrid" type="environment"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -25936,7 +26193,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-cst.mkiv" name="setpagegrid"> + <cd:command category="layout" file="page-cst.mkiv" level="document" name="setpagegrid"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="c"> @@ -25952,7 +26209,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="page-cst.mkiv" name="definepagegridspan"> + <cd:command category="layout" file="page-cst.mkiv" level="style" name="definepagegridspan"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -25965,7 +26222,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-cst.mkiv" name="setuppagegridspan"> + <cd:command category="layout" file="page-cst.mkiv" level="style" name="setuppagegridspan"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -25991,7 +26248,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-cst.mkiv" name="pagegridspan" type="environment"> + <cd:command category="layout" file="page-cst.mkiv" level="document" name="pagegridspan" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -26001,14 +26258,14 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-cst.mkiv" name="pagegridspanwidth"> + <cd:command category="layout" file="page-cst.mkiv" level="style" name="pagegridspanwidth"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-cst.mkiv" name="definepagegridarea"> + <cd:command category="layout" file="page-cst.mkiv" level="style" name="definepagegridarea"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -26021,7 +26278,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-cst.mkiv" name="setuppagegridarea"> + <cd:command category="layout" file="page-cst.mkiv" level="style" name="setuppagegridarea"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -26061,7 +26318,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-cst.mkiv" name="setuppagegridareatext"> + <cd:command category="layout" file="page-cst.mkiv" level="style" name="setuppagegridareatext"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -26071,7 +26328,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-cst.mkiv" name="setuppagegridlines"> + <cd:command category="layout" file="page-cst.mkiv" level="style" name="setuppagegridlines"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -26087,7 +26344,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-cst.mkiv" name="setuppagegridstart"> + <cd:command category="layout" file="page-cst.mkiv" level="style" name="setuppagegridstart"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -26105,7 +26362,7 @@ </cd:command> </cd:interface> <cd:interface file="i-pageinjection.xml"> - <cd:command file="page-inj.mkvi" name="definepageinjection"> + <cd:command category="structure" file="page-inj.mkvi" level="style" name="definepageinjection"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -26118,7 +26375,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-inj.mkvi" name="setuppageinjection"> + <cd:command category="structure" file="page-inj.mkvi" level="style" name="setuppageinjection"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -26154,7 +26411,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-inj.mkvi" name="pageinjection"> + <cd:command category="structure" file="page-inj.mkvi" level="document" name="pageinjection"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -26166,7 +26423,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-inj.mkvi" name="pageinjection" variant="assignment"> + <cd:command category="structure" file="page-inj.mkvi" level="document" name="pageinjection" variant="assignment"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setuppageinjection"/> @@ -26178,7 +26435,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-inj.mkvi" name="definepageinjectionalternative"> + <cd:command category="structure" file="page-inj.mkvi" level="style" name="definepageinjectionalternative"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -26191,7 +26448,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-inj.mkvi" name="setuppageinjectionalternative"> + <cd:command category="structure" file="page-inj.mkvi" level="style" name="setuppageinjectionalternative"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -26205,7 +26462,7 @@ </cd:command> </cd:interface> <cd:interface file="i-pagelayout.xml"> - <cd:command file="page-plg.mkiv" name="pagearea"> + <cd:command category="layout" file="page-plg.mkiv" level="style" name="pagearea"> <cd:arguments> <cd:keywords> <cd:constant type="top"/> @@ -26228,7 +26485,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-plg.mkiv" name="pagelayout" type="environment"> + <cd:command category="layout" file="page-plg.mkiv" level="style" name="pagelayout" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="page"/> @@ -26239,14 +26496,14 @@ </cd:command> </cd:interface> <cd:interface file="i-pagenumber.xml"> - <cd:command file="strc-pag.mkiv" name="setuprealpagenumber"> + <cd:command category="counter" file="strc-pag.mkiv" level="system" name="setuprealpagenumber"> <cd:arguments> <cd:assignments list="yes"> <cd:inherit name="setupcounter"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-pag.mkiv" name="setupuserpagenumber"> + <cd:command category="counter" file="strc-pag.mkiv" level="style" name="setupuserpagenumber"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="viewerprefix"> @@ -26263,24 +26520,24 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-pag.mkiv" name="setupsubpagenumber"> + <cd:command category="counter" file="strc-pag.mkiv" level="style" name="setupsubpagenumber"> <cd:arguments> <cd:assignments list="yes"> <cd:inherit name="setupcounter"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-pag.mkiv" name="setuppagenumber"> + <cd:command category="counter" file="strc-pag.mkiv" level="style" name="setuppagenumber"> <cd:arguments> <cd:assignments list="yes"> <cd:inherit name="setupuserpagenumber"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-pag.mkiv" name="resetuserpagenumber"/> - <cd:command file="strc-pag.mkiv" name="resetsubpagenumber"/> - <cd:command file="strc-pag.mkiv" name="resetpagenumber"/> - <cd:command file="strc-pag.mkiv" name="setuppagenumbering"> + <cd:command category="counter" file="strc-pag.mkiv" level="system" name="resetuserpagenumber"/> + <cd:command category="counter" file="strc-pag.mkiv" level="style" name="resetsubpagenumber"/> + <cd:command category="counter" file="strc-pag.mkiv" level="system" name="resetpagenumber"/> + <cd:command category="counter" file="strc-pag.mkiv" level="style" name="setuppagenumbering"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="alternative"> @@ -26333,44 +26590,44 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-pag.mkiv" name="firstrealpagenumber"/> - <cd:command file="strc-pag.mkiv" name="firstuserpagenumber"/> - <cd:command file="strc-pag.mkiv" name="firstsubpagenumber"/> - <cd:command file="strc-pag.mkiv" name="lastrealpagenumber"/> - <cd:command file="strc-pag.mkiv" name="lastuserpagenumber"/> - <cd:command file="strc-pag.mkiv" name="lastsubpagenumber"/> - <cd:command file="strc-pag.mkiv" name="prevrealpagenumber"/> - <cd:command file="strc-pag.mkiv" name="prevuserpagenumber"/> - <cd:command file="strc-pag.mkiv" name="prevsubpagenumber"/> - <cd:command file="strc-pag.mkiv" name="nextrealpagenumber"/> - <cd:command file="strc-pag.mkiv" name="nextuserpagenumber"/> - <cd:command file="strc-pag.mkiv" name="nextsubpagenumber"/> - <cd:command file="strc-pag.mkiv" name="firstrealpage"/> - <cd:command file="strc-pag.mkiv" name="firstuserpage"/> - <cd:command file="strc-pag.mkiv" name="firstsubpage"/> - <cd:command file="strc-pag.mkiv" name="prevrealpage"/> - <cd:command file="strc-pag.mkiv" name="prevuserpage"/> - <cd:command file="strc-pag.mkiv" name="prevsubpage"/> - <cd:command file="strc-pag.mkiv" name="nextrealpage"/> - <cd:command file="strc-pag.mkiv" name="nextuserpage"/> - <cd:command file="strc-pag.mkiv" name="nextsubpage"/> - <cd:command file="strc-pag.mkiv" name="lastrealpage"/> - <cd:command file="strc-pag.mkiv" name="lastuserpage"/> - <cd:command file="strc-pag.mkiv" name="lastsubpage"/> - <cd:command file="strc-pag.mkiv" name="realpagenumber"/> - <cd:command file="strc-pag.mkiv" name="userpagenumber"/> - <cd:command file="strc-pag.mkiv" name="subpagenumber"/> - <cd:command file="strc-pag.mkiv" name="pagenumber"/> - <cd:command file="strc-pag.mkiv" name="prefixedpagenumber"/> - <cd:command file="strc-pag.mkiv" name="incrementpagenumber"/> - <cd:command file="strc-pag.mkiv" name="incrementsubpagenumber"/> - <cd:command file="strc-pag.mkiv" name="decrementpagenumber"/> - <cd:command file="strc-pag.mkiv" name="decrementsubpagenumber"/> - <cd:command file="strc-pag.mkiv" name="completepagenumber"/> - <cd:command file="strc-pag.mkiv" name="placepagenumber"/> + <cd:command category="counter" file="strc-pag.mkiv" level="style" name="firstrealpagenumber"/> + <cd:command category="counter" file="strc-pag.mkiv" level="style" name="firstuserpagenumber"/> + <cd:command category="counter" file="strc-pag.mkiv" level="style" name="firstsubpagenumber"/> + <cd:command category="counter" file="strc-pag.mkiv" level="style" name="lastrealpagenumber"/> + <cd:command category="counter" file="strc-pag.mkiv" level="style" name="lastuserpagenumber"/> + <cd:command category="counter" file="strc-pag.mkiv" level="style" name="lastsubpagenumber"/> + <cd:command category="counter" file="strc-pag.mkiv" level="style" name="prevrealpagenumber"/> + <cd:command category="counter" file="strc-pag.mkiv" level="style" name="prevuserpagenumber"/> + <cd:command category="counter" file="strc-pag.mkiv" level="style" name="prevsubpagenumber"/> + <cd:command category="counter" file="strc-pag.mkiv" level="style" name="nextrealpagenumber"/> + <cd:command category="counter" file="strc-pag.mkiv" level="style" name="nextuserpagenumber"/> + <cd:command category="counter" file="strc-pag.mkiv" level="style" name="nextsubpagenumber"/> + <cd:command category="counter" file="strc-pag.mkiv" level="system" name="firstrealpage"/> + <cd:command category="counter" file="strc-pag.mkiv" level="system" name="firstuserpage"/> + <cd:command category="counter" file="strc-pag.mkiv" level="system" name="firstsubpage"/> + <cd:command category="counter" file="strc-pag.mkiv" level="system" name="prevrealpage"/> + <cd:command category="counter" file="strc-pag.mkiv" level="system" name="prevuserpage"/> + <cd:command category="counter" file="strc-pag.mkiv" level="system" name="prevsubpage"/> + <cd:command category="counter" file="strc-pag.mkiv" level="system" name="nextrealpage"/> + <cd:command category="counter" file="strc-pag.mkiv" level="system" name="nextuserpage"/> + <cd:command category="counter" file="strc-pag.mkiv" level="system" name="nextsubpage"/> + <cd:command category="counter" file="strc-pag.mkiv" level="system" name="lastrealpage"/> + <cd:command category="counter" file="strc-pag.mkiv" level="system" name="lastuserpage"/> + <cd:command category="counter" file="strc-pag.mkiv" level="system" name="lastsubpage"/> + <cd:command category="counter" file="strc-pag.mkiv" level="style" name="realpagenumber"/> + <cd:command category="counter" file="strc-pag.mkiv" level="style" name="userpagenumber"/> + <cd:command category="counter" file="strc-pag.mkiv" level="style" name="subpagenumber"/> + <cd:command category="counter" file="strc-pag.mkiv" level="style" name="pagenumber"/> + <cd:command category="counter" file="strc-pag.mkiv" level="style" name="prefixedpagenumber"/> + <cd:command category="counter" file="strc-pag.mkiv" level="style" name="incrementpagenumber"/> + <cd:command category="counter" file="strc-pag.mkiv" level="style" name="incrementsubpagenumber"/> + <cd:command category="counter" file="strc-pag.mkiv" level="style" name="decrementpagenumber"/> + <cd:command category="counter" file="strc-pag.mkiv" level="style" name="decrementsubpagenumber"/> + <cd:command category="counter" file="strc-pag.mkiv" level="style" name="completepagenumber"/> + <cd:command category="counter" file="strc-pag.mkiv" level="style" name="placepagenumber"/> </cd:interface> <cd:interface file="i-pageselection.xml"> - <cd:command file="page-sel.mkvi" name="insertpages"> + <cd:command file="page-sel.mkvi" level="document" name="insertpages"> <cd:arguments> <cd:keywords> <cd:constant type="cd:file"/> @@ -26391,7 +26648,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-sel.mkvi" name="filterpages"> + <cd:command file="page-sel.mkvi" level="document" name="filterpages"> <cd:arguments> <cd:keywords> <cd:constant type="cd:file"/> @@ -26415,7 +26672,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-sel.mkvi" name="copypages"> + <cd:command file="page-sel.mkvi" level="document" name="copypages"> <cd:arguments> <cd:keywords> <cd:constant type="cd:file"/> @@ -26437,7 +26694,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-sel.mkvi" name="combinepages"> + <cd:command file="page-sel.mkvi" level="document" name="combinepages"> <cd:arguments> <cd:keywords> <cd:constant type="cd:file"/> @@ -26504,7 +26761,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-sel.mkvi" name="slicepages"> + <cd:command file="page-sel.mkvi" level="document" name="slicepages"> <cd:arguments> <cd:keywords> <cd:constant type="cd:file"/> @@ -26553,7 +26810,7 @@ </cd:command> </cd:interface> <cd:interface file="i-pageshift.xml"> - <cd:command file="page-imp.mkiv" name="definepageshift"> + <cd:command file="page-imp.mkiv" level="style" name="definepageshift"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -26567,7 +26824,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-imp.mkiv" name="setuppageshift"> + <cd:command file="page-imp.mkiv" level="style" name="setuppageshift"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant default="yes" type="page"/> @@ -26583,7 +26840,7 @@ </cd:command> </cd:interface> <cd:interface file="i-pagestate.xml"> - <cd:command file="core-dat.mkiv" name="definepagestate"> + <cd:command file="core-dat.mkiv" level="system" name="definepagestate"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -26596,7 +26853,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="core-dat.mkiv" name="setuppagestate"> + <cd:command file="core-dat.mkiv" level="system" name="setuppagestate"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -26609,7 +26866,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="core-dat.mkiv" name="setpagestate"> + <cd:command file="core-dat.mkiv" level="system" name="setpagestate"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -26620,7 +26877,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-dat.mkiv" name="pagestaterealpage"> + <cd:command file="core-dat.mkiv" level="system" name="pagestaterealpage"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -26631,7 +26888,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-dat.mkiv" name="setpagestaterealpageno"> + <cd:command file="core-dat.mkiv" level="system" name="setpagestaterealpageno"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -26643,8 +26900,33 @@ </cd:arguments> </cd:command> </cd:interface> + <cd:interface file="i-pagemarks.xml"> + <cd:command file="page-lay.mkiv" level="style" name="markpage"> + <cd:arguments> + <cd:keywords> + <cd:constant type="cd:name"/> + </cd:keywords> + <cd:keywords optional="yes"> + <cd:constant method="none" prefix="cd:sign" type="cd:number"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command category="conditional" file="page-lay.mkiv" level="style" name="doifelsemarkedpage"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:name"/> + </cd:keywords> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:true"/> + </cd:keywords> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:false"/> + </cd:keywords> + </cd:arguments> + </cd:command> + </cd:interface> <cd:interface file="i-pairedbox.xml"> - <cd:command file="pack-com.mkiv" name="definepairedbox"> + <cd:command file="pack-com.mkiv" level="style" name="definepairedbox"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -26657,7 +26939,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="pack-com.mkiv" name="setuppairedbox"> + <cd:command file="pack-com.mkiv" level="style" name="setuppairedbox"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -26715,7 +26997,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="pack-com.mkiv" name="placepairedbox"> + <cd:command file="pack-com.mkiv" level="document" name="placepairedbox"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -26729,7 +27011,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="pack-com.mkiv" name="placepairedbox" type="environment"> + <cd:command file="pack-com.mkiv" level="document" name="placepairedbox" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -26739,7 +27021,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="pack-com.mkiv" generated="yes" name="setuppairedbox" variant="instance"> + <cd:command file="pack-com.mkiv" generated="yes" level="style" name="setuppairedbox" variant="instance"> <cd:sequence> <cd:string value="setup"/> <cd:instance value="pairedbox"/> @@ -26749,9 +27031,11 @@ <cd:inherit name="setuppairedbox"/> </cd:assignments> </cd:arguments> - <cd:instances/> + <cd:instances> + <cd:constant value="legend"/> + </cd:instances> </cd:command> - <cd:command file="pack-com.mkiv" generated="yes" name="placepairedbox" variant="instance"> + <cd:command file="pack-com.mkiv" generated="yes" level="document" name="placepairedbox" variant="instance"> <cd:sequence> <cd:string value="place"/> <cd:instance value="pairedbox"/> @@ -26765,9 +27049,11 @@ <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> - <cd:instances/> + <cd:instances> + <cd:constant value="legend"/> + </cd:instances> </cd:command> - <cd:command file="pack-com.mkiv" generated="yes" name="placepairedbox" type="environment" variant="instance"> + <cd:command file="pack-com.mkiv" generated="yes" level="document" name="placepairedbox" type="environment" variant="instance"> <cd:sequence> <cd:string value="place"/> <cd:instance value="pairedbox"/> @@ -26777,15 +27063,17 @@ <cd:inherit name="setuppairedbox"/> </cd:assignments> </cd:arguments> - <cd:instances/> + <cd:instances> + <cd:constant value="legend"/> + </cd:instances> </cd:command> - <cd:command file="pack-com.mkiv" name="placeontopofeachother"> + <cd:command file="pack-com.mkiv" level="document" name="placeontopofeachother"> <cd:arguments> <cd:content/> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="pack-com.mkiv" name="placesidebyside"> + <cd:command file="pack-com.mkiv" level="document" name="placesidebyside"> <cd:arguments> <cd:content/> <cd:content/> @@ -26793,7 +27081,7 @@ </cd:command> </cd:interface> <cd:interface file="i-papersize.xml"> - <cd:command file="page-lay.mkiv" name="definepapersize"> + <cd:command category="layout" file="page-lay.mkiv" level="style" name="definepapersize"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -26829,7 +27117,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-lay.mkiv" name="definepapersize" variant="name"> + <cd:command category="layout" file="page-lay.mkiv" level="style" name="definepapersize" variant="name"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -26842,7 +27130,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-lay.mkiv" name="setuppapersize" variant="name"> + <cd:command category="layout" file="page-lay.mkiv" level="style" name="setuppapersize" variant="name"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="reset"/> @@ -26868,7 +27156,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-lay.mkiv" name="setuppapersize"> + <cd:command category="layout" file="page-lay.mkiv" level="style" name="setuppapersize"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -26953,14 +27241,14 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-lay.mkiv" name="setuppaper"> + <cd:command category="layout" file="page-lay.mkiv" level="style" name="setuppaper"> <cd:arguments> <cd:assignments list="yes"> <cd:inherit name="setuppapersize"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-lay.mkiv" name="adaptpapersize"> + <cd:command category="layout" file="page-lay.mkiv" level="style" name="adaptpapersize"> <cd:arguments> <cd:keywords list="yes"> <cd:inherit name="setuppapersize"/> @@ -26972,7 +27260,7 @@ </cd:command> </cd:interface> <cd:interface file="i-paragraph.xml"> - <cd:command file="strc-tag.mkiv" name="defineparagraph"> + <cd:command category="structure" file="strc-tag.mkiv" level="style" name="defineparagraph"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -26985,7 +27273,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-tag.mkiv" name="setupparagraph"> + <cd:command category="structure" file="strc-tag.mkiv" level="style" name="setupparagraph"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -27007,7 +27295,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-tag.mkiv" name="paragraph" type="environment"> + <cd:command category="structure" file="strc-tag.mkiv" level="document" name="paragraph" type="environment"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -27017,7 +27305,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-tag.mkiv" name="par" type="environment"> + <cd:command category="structure" file="strc-tag.mkiv" level="document" name="par" type="environment"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -27027,8 +27315,8 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command begin="b" end="e" file="strc-tag.mkiv" name="par" type="environment"/> - <cd:command file="spac-par.mkiv" name="setupparagraphintro"> + <cd:command begin="b" category="structure" end="e" file="strc-tag.mkiv" level="document" name="par" type="environment"/> + <cd:command category="structure" file="spac-par.mkiv" level="style" name="setupparagraphintro"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="reset"/> @@ -27043,7 +27331,7 @@ </cd:command> </cd:interface> <cd:interface file="i-paragraphnumber.xml"> - <cd:command file="page-par.mkiv" name="setupparagraphnumbering"> + <cd:command category="structure counter" file="page-par.mkiv" level="style" name="setupparagraphnumbering"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="state"> @@ -27067,7 +27355,7 @@ </cd:command> </cd:interface> <cd:interface file="i-paragraphs.xml"> - <cd:command file="tabl-mis.mkiv" name="defineparagraphs"> + <cd:command category="tables" file="tabl-mis.mkiv" level="style" name="defineparagraphs"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -27080,7 +27368,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="tabl-mis.mkiv" name="setupparagraphs"> + <cd:command category="tables" file="tabl-mis.mkiv" level="style" name="setupparagraphs"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -27144,7 +27432,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="tabl-mis.mkiv" name="setupparagraphs" variant="assignment"> + <cd:command category="tables" file="tabl-mis.mkiv" level="style" name="setupparagraphs" variant="assignment"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant method="range" prefix="cd:name" type="cd:number"/> @@ -27204,34 +27492,34 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="tabl-mis.mkiv" name="paragraphs" type="environment"> + <cd:command category="tables" file="tabl-mis.mkiv" level="document" name="paragraphs" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="tabl-mis.mkiv" name="nextparagraphs"/> - <cd:command file="tabl-mis.mkiv" generated="yes" name="paragraphs" type="environment" variant="example"> + <cd:command category="tables" file="tabl-mis.mkiv" level="document" name="nextparagraphs"/> + <cd:command category="tables" file="tabl-mis.mkiv" generated="yes" level="document" name="paragraphs" type="environment" variant="example"> <cd:sequence> <cd:variable value="paragraphs"/> </cd:sequence> </cd:command> - <cd:command file="tabl-mis.mkiv" generated="yes" name="paragraphs" variant="example"> + <cd:command category="tables" file="tabl-mis.mkiv" generated="yes" level="document" name="paragraphs" variant="example"> <cd:sequence> <cd:variable value="paragraphs"/> </cd:sequence> </cd:command> - <cd:command file="tabl-mis.mkiv" generated="yes" name="nextparagraphs" variant="example"> + <cd:command category="tables" file="tabl-mis.mkiv" generated="yes" level="document" name="nextparagraphs" variant="example"> <cd:sequence> <cd:string value="next"/> <cd:variable value="paragraphs"/> </cd:sequence> </cd:command> - <cd:command file="tabl-mis.mkiv" name="paragraphscell" type="environment"/> + <cd:command category="tables" file="tabl-mis.mkiv" level="document" name="paragraphscell" type="environment"/> </cd:interface> <cd:interface file="i-parallel.xml"> - <cd:command file="buff-par.mkvi" name="defineparallel"> + <cd:command file="buff-par.mkvi" level="style" name="defineparallel"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -27241,7 +27529,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="buff-par.mkvi" name="setupparallel"> + <cd:command file="buff-par.mkvi" level="style" name="setupparallel"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -27265,7 +27553,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="buff-par.mkvi" name="placeparallel"> + <cd:command file="buff-par.mkvi" level="document" name="placeparallel"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -27278,7 +27566,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="buff-par.mkvi" name="doifelseparallel"> + <cd:command category="conditional" file="buff-par.mkvi" level="style" name="doifelseparallel"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -27295,7 +27583,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="buff-par.mkvi" name="doifparallelelse"> + <cd:command category="conditional" file="buff-par.mkvi" level="style" name="doifparallelelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -27312,7 +27600,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="buff-par.mkvi" name="resetparallel"> + <cd:command file="buff-par.mkvi" level="style" name="resetparallel"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -27323,21 +27611,21 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="buff-par.mkvi" generated="yes" name="parallel" type="environment" variant="example"> + <cd:command file="buff-par.mkvi" generated="yes" level="document" name="parallel" type="environment" variant="example"> <cd:sequence> <cd:variable value="parallel"/> </cd:sequence> </cd:command> </cd:interface> <cd:interface file="i-parbuilder.xml"> - <cd:command file="typo-bld.mkiv" name="defineparbuilder"> + <cd:command category="layout" file="typo-bld.mkiv" level="system" name="defineparbuilder"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-bld.mkiv" name="parbuilder" type="environment"> + <cd:command category="layout" file="typo-bld.mkiv" level="system" name="parbuilder" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="default"/> @@ -27347,7 +27635,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-bld.mkiv" name="setmainparbuilder"> + <cd:command category="layout" file="typo-bld.mkiv" level="system" name="setmainparbuilder"> <cd:arguments> <cd:keywords> <cd:constant type="default"/> @@ -27359,7 +27647,7 @@ </cd:command> </cd:interface> <cd:interface file="i-pdf.xml"> - <cd:command file="back-pdf.mkiv" name="pdfbackendsetcatalog"> + <cd:command category="pdf" file="back-pdf.mkiv" level="system" name="pdfbackendsetcatalog"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -27369,7 +27657,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="back-pdf.mkiv" name="pdfbackendsetinfo"> + <cd:command category="pdf" file="back-pdf.mkiv" level="system" name="pdfbackendsetinfo"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -27379,7 +27667,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="back-pdf.mkiv" name="pdfbackendsetname"> + <cd:command category="pdf" file="back-pdf.mkiv" level="system" name="pdfbackendsetname"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -27389,7 +27677,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="back-pdf.mkiv" name="pdfbackendsetpageattribute"> + <cd:command category="pdf" file="back-pdf.mkiv" level="system" name="pdfbackendsetpageattribute"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -27399,7 +27687,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="back-pdf.mkiv" name="pdfbackendsetpagesattribute"> + <cd:command category="pdf" file="back-pdf.mkiv" level="system" name="pdfbackendsetpagesattribute"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -27409,7 +27697,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="back-pdf.mkiv" name="pdfbackendsetpageresource"> + <cd:command category="pdf" file="back-pdf.mkiv" level="system" name="pdfbackendsetpageresource"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -27419,7 +27707,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="back-pdf.mkiv" name="pdfbackendsetextgstate"> + <cd:command category="pdf" file="back-pdf.mkiv" level="system" name="pdfbackendsetextgstate"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -27429,7 +27717,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="back-pdf.mkiv" name="pdfbackendsetcolorspace"> + <cd:command category="pdf" file="back-pdf.mkiv" level="system" name="pdfbackendsetcolorspace"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -27439,7 +27727,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="back-pdf.mkiv" name="pdfbackendsetpattern"> + <cd:command category="pdf" file="back-pdf.mkiv" level="system" name="pdfbackendsetpattern"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -27449,7 +27737,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="back-pdf.mkiv" name="pdfbackendsetshade"> + <cd:command category="pdf" file="back-pdf.mkiv" level="system" name="pdfbackendsetshade"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -27459,31 +27747,31 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="back-pdf.mkiv" name="pdfbackendcurrentresources"/> - <cd:command file="back-pdf.mkiv" name="pdfcolor"> + <cd:command category="pdf" file="back-pdf.mkiv" level="system" name="pdfbackendcurrentresources"/> + <cd:command category="pdf" file="back-pdf.mkiv" level="system" name="pdfcolor"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="back-pdf.mkiv" name="PDFcolor"> + <cd:command category="pdf" file="back-pdf.mkiv" level="system" name="PDFcolor"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="back-pdf.mkiv" name="TransparencyHack"/> - <cd:command file="pack-obj.mkiv" name="lastpredefinedsymbol"/> - <cd:command file="pack-obj.mkiv" name="predefinesymbol"> + <cd:command category="pdf" file="back-pdf.mkiv" level="system" name="TransparencyHack"/> + <cd:command category="pdf" file="pack-obj.mkiv" level="system" name="lastpredefinedsymbol"/> + <cd:command category="pdf" file="pack-obj.mkiv" level="system" name="predefinesymbol"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="back-pdf.mkiv" name="pdfbackendactualtext"> + <cd:command category="pdf" file="back-pdf.mkiv" level="style" name="pdfbackendactualtext"> <cd:arguments> <cd:content/> <cd:keywords delimiters="braces"> @@ -27491,7 +27779,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="back-pdf.mkiv" name="pdfactualtext"> + <cd:command category="pdf" file="back-pdf.mkiv" level="document" name="pdfactualtext"> <cd:arguments> <cd:content/> <cd:keywords delimiters="braces"> @@ -27499,9 +27787,9 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="attr-neg.mkiv" name="negative" type="environment"/> - <cd:command file="attr-neg.mkiv" name="positive" type="environment"/> - <cd:command file="scrn-pag.mkvi" name="setuppagetransitions"> + <cd:command category="pdf" file="attr-neg.mkiv" level="document" name="negative" type="environment"/> + <cd:command category="pdf" file="attr-neg.mkiv" level="document" name="positive" type="environment"/> + <cd:command category="pdf" file="scrn-pag.mkvi" level="style" name="setuppagetransitions"> <cd:arguments> <cd:keywords> <cd:constant default="yes" type="reset"/> @@ -27514,12 +27802,12 @@ </cd:command> </cd:interface> <cd:interface file="i-penalty.xml"> - <cd:command file="spac-ver.mkiv" name="resetpenalties"> + <cd:command category="layout" file="spac-ver.mkiv" level="system" name="resetpenalties"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="setpenalties"> + <cd:command category="layout" file="spac-ver.mkiv" level="system" name="setpenalties"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -27530,17 +27818,17 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="keeplinestogether"> + <cd:command category="layout" file="spac-ver.mkiv" level="system" name="keeplinestogether"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="setdefaultpenalties"/> + <cd:command category="layout" file="spac-ver.mkiv" level="system" name="setdefaultpenalties"/> </cd:interface> <cd:interface file="i-periods.xml"> - <cd:command file="enco-ini.mkiv" name="setupperiods"> + <cd:command category="symbols" file="enco-ini.mkiv" level="style" name="setupperiods"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="n"> @@ -27559,39 +27847,39 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="enco-ini.mkiv" name="periods"> + <cd:command category="symbols" file="enco-ini.mkiv" level="document" name="periods"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="enco-ini.mkiv" name="periods" variant="assignment"> + <cd:command category="symbols" file="enco-ini.mkiv" level="document" name="periods" variant="assignment"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupperiods"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="enco-ini.mkiv" name="unknown"/> + <cd:command category="symbols" file="enco-ini.mkiv" level="document" name="unknown"/> </cd:interface> <cd:interface file="i-phantom.xml"> - <cd:command file="supp-box.mkiv" name="phantom"> + <cd:command file="supp-box.mkiv" level="style" name="phantom"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="hphantom"> + <cd:command file="supp-box.mkiv" level="style" name="hphantom"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="vphantom"> + <cd:command file="supp-box.mkiv" level="style" name="vphantom"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="pack-box.mkiv" name="phantombox"> + <cd:command file="pack-box.mkiv" level="style" name="phantombox"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="width"> @@ -27608,7 +27896,7 @@ </cd:command> </cd:interface> <cd:interface file="i-placement.xml"> - <cd:command file="pack-mis.mkiv" name="defineplacement"> + <cd:command category="layout" file="pack-mis.mkiv" level="style" name="defineplacement"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -27621,7 +27909,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="pack-mis.mkiv" name="setupplacement"> + <cd:command category="layout" file="pack-mis.mkiv" level="style" name="setupplacement"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -27658,7 +27946,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="pack-mis.mkiv" name="placement"> + <cd:command category="layout" file="pack-mis.mkiv" level="style" name="placement"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -27669,7 +27957,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="pack-mis.mkiv" generated="yes" name="placement" variant="example"> + <cd:command category="layout" file="pack-mis.mkiv" generated="yes" level="style" name="placement" variant="example"> <cd:sequence> <cd:variable value="placement"/> </cd:sequence> @@ -27682,7 +27970,7 @@ </cd:command> </cd:interface> <cd:interface file="i-position.xml"> - <cd:command file="anch-pgr.mkiv" name="doifpositionaction"> + <cd:command category="conditional" file="anch-pgr.mkiv" level="system" name="doifpositionaction"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -27695,7 +27983,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pgr.mkiv" name="doifelsepositionaction"> + <cd:command category="conditional" file="anch-pgr.mkiv" level="system" name="doifelsepositionaction"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -27708,7 +27996,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pgr.mkiv" name="doifpositionactionelse"> + <cd:command category="conditional" file="anch-pgr.mkiv" level="system" name="doifpositionactionelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -27721,28 +28009,28 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pgr.mkiv" name="dopositionaction"> + <cd:command file="anch-pgr.mkiv" level="system" name="dopositionaction"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pgr.mkiv" name="positionoverlay"> + <cd:command category="background" file="anch-pgr.mkiv" level="system" name="positionoverlay"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pgr.mkiv" name="MPoverlayanchor"> + <cd:command category="background metapost" file="anch-pgr.mkiv" level="system" name="MPoverlayanchor"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pgr.mkiv" name="positionregionoverlay"> + <cd:command category="background" file="anch-pgr.mkiv" level="system" name="positionregionoverlay"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -27752,14 +28040,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pgr.mkiv" name="positionoverlay" type="environment"> + <cd:command category="background" file="anch-pgr.mkiv" level="system" name="positionoverlay" type="environment"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pgr.mkiv" name="MPpositiongraphic" type="environment"> + <cd:command category="background metapost" file="anch-pgr.mkiv" level="system" name="MPpositiongraphic" type="environment"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -27769,7 +28057,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pgr.mkiv" name="MPpositiongraphic"> + <cd:command category="background metapost" file="anch-pgr.mkiv" level="system" name="MPpositiongraphic"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -27781,14 +28069,14 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="anch-pgr.mkiv" name="MPpositionmethod" type="environment"> + <cd:command category="background metapost" file="anch-pgr.mkiv" level="system" name="MPpositionmethod" type="environment"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pgr.mkiv" name="setMPpositiongraphic"> + <cd:command category="background metapost" file="anch-pgr.mkiv" level="system" name="setMPpositiongraphic"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -27803,7 +28091,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="anch-pgr.mkiv" name="setMPpositiongraphicrange"> + <cd:command category="background metapost" file="anch-pgr.mkiv" level="system" name="setMPpositiongraphicrange"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -27821,7 +28109,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="anch-pgr.mkiv" name="MPgetposboxes"> + <cd:command category="background metapost" file="anch-pgr.mkiv" level="system" name="MPgetposboxes"> <cd:arguments> <cd:keywords delimiters="braces" list="yes"> <cd:constant type="cd:name"/> @@ -27831,7 +28119,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pgr.mkiv" name="MPgetmultipars"> + <cd:command category="background metapost" file="anch-pgr.mkiv" level="system" name="MPgetmultipars"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -27841,7 +28129,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pgr.mkiv" name="MPgetmultishape"> + <cd:command category="background metapost" file="anch-pgr.mkiv" level="system" name="MPgetmultishape"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -27851,196 +28139,196 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="MPp"> + <cd:command file="anch-pos.mkiv" level="system" name="MPp"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="MPr"> + <cd:command file="anch-pos.mkiv" level="system" name="MPr"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="MPc"> + <cd:command file="anch-pos.mkiv" level="system" name="MPc"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="MPn"> + <cd:command file="anch-pos.mkiv" level="system" name="MPn"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="MPx"> + <cd:command file="anch-pos.mkiv" level="system" name="MPx"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="MPy"> + <cd:command file="anch-pos.mkiv" level="system" name="MPy"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="MPw"> + <cd:command file="anch-pos.mkiv" level="system" name="MPw"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="MPh"> + <cd:command file="anch-pos.mkiv" level="system" name="MPh"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="MPd"> + <cd:command file="anch-pos.mkiv" level="system" name="MPd"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="MPwhd"> + <cd:command file="anch-pos.mkiv" level="system" name="MPwhd"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="MPxy"> + <cd:command file="anch-pos.mkiv" level="system" name="MPxy"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="MPll"> + <cd:command file="anch-pos.mkiv" level="system" name="MPll"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="MPlr"> + <cd:command file="anch-pos.mkiv" level="system" name="MPlr"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="MPur"> + <cd:command file="anch-pos.mkiv" level="system" name="MPur"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="MPul"> + <cd:command file="anch-pos.mkiv" level="system" name="MPul"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="MPpos"> + <cd:command file="anch-pos.mkiv" level="system" name="MPpos"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="MPls"> + <cd:command file="anch-pos.mkiv" level="system" name="MPls"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="MPrs"> + <cd:command file="anch-pos.mkiv" level="system" name="MPrs"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="MPpardata"> + <cd:command file="anch-pos.mkiv" level="system" name="MPpardata"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="MPxywhd"> + <cd:command file="anch-pos.mkiv" level="system" name="MPxywhd"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="MPposset"> + <cd:command file="anch-pos.mkiv" level="system" name="MPposset"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="MPpage"> + <cd:command file="anch-pos.mkiv" level="system" name="MPpage"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="MPregion"> + <cd:command file="anch-pos.mkiv" level="system" name="MPregion"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="MPcolumn"> + <cd:command file="anch-pos.mkiv" level="system" name="MPcolumn"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="MPanchor"> + <cd:command file="anch-pos.mkiv" level="system" name="MPanchor"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="MPleftskip"> + <cd:command file="anch-pos.mkiv" level="system" name="MPleftskip"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="MPrightskip"> + <cd:command file="anch-pos.mkiv" level="system" name="MPrightskip"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="MPplus"> + <cd:command file="anch-pos.mkiv" level="system" name="MPplus"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -28051,7 +28339,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="MPv"> + <cd:command file="anch-pos.mkiv" level="system" name="MPv"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -28062,7 +28350,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="MPrest"> + <cd:command file="anch-pos.mkiv" level="system" name="MPrest"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -28070,7 +28358,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="MPvv"> + <cd:command file="anch-pos.mkiv" level="system" name="MPvv"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -28078,21 +28366,21 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="setpositiononly"> + <cd:command file="anch-pos.mkiv" level="system" name="setpositiononly"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="setposition"> + <cd:command file="anch-pos.mkiv" level="system" name="setposition"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="setpositiondata"> + <cd:command file="anch-pos.mkiv" level="system" name="setpositiondata"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -28108,7 +28396,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="setpositionbox"> + <cd:command file="anch-pos.mkiv" level="system" name="setpositionbox"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -28117,14 +28405,14 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="setpositionstrut"> + <cd:command file="anch-pos.mkiv" level="system" name="setpositionstrut"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="setpositiondataplus"> + <cd:command file="anch-pos.mkiv" level="system" name="setpositiondataplus"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -28143,7 +28431,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="setpositionplus"> + <cd:command file="anch-pos.mkiv" level="system" name="setpositionplus"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -28155,7 +28443,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="copyposition"> + <cd:command file="anch-pos.mkiv" level="system" name="copyposition"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -28165,7 +28453,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="doifposition"> + <cd:command category="conditional" file="anch-pos.mkiv" level="system" name="doifposition"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -28178,7 +28466,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="doifelseposition"> + <cd:command category="conditional" file="anch-pos.mkiv" level="system" name="doifelseposition"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -28191,7 +28479,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="doifpositionelse"> + <cd:command category="conditional" file="anch-pos.mkiv" level="system" name="doifpositionelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -28204,7 +28492,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="doifelsepositiononpage"> + <cd:command category="conditional" file="anch-pos.mkiv" level="system" name="doifelsepositiononpage"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -28220,7 +28508,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="doifpositiononpageelse"> + <cd:command category="conditional" file="anch-pos.mkiv" level="system" name="doifpositiononpageelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -28236,14 +28524,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="xypos"> + <cd:command file="anch-pos.mkiv" level="system" name="xypos"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="hpos"> + <cd:command file="anch-pos.mkiv" level="system" name="hpos"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -28251,7 +28539,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="vpos"> + <cd:command file="anch-pos.mkiv" level="system" name="vpos"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -28259,24 +28547,24 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="bpos"> + <cd:command file="anch-pos.mkiv" level="system" name="bpos"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="epos"> + <cd:command file="anch-pos.mkiv" level="system" name="epos"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="tracepositions"/> - <cd:command file="anch-pos.mkiv" name="enableparpositions"/> - <cd:command file="anch-pos.mkiv" name="disableparpositions"/> - <cd:command file="anch-pos.mkiv" name="doifelseoverlapping"> + <cd:command file="anch-pos.mkiv" level="system" name="tracepositions"/> + <cd:command file="anch-pos.mkiv" level="system" name="enableparpositions"/> + <cd:command file="anch-pos.mkiv" level="system" name="disableparpositions"/> + <cd:command category="conditional" file="anch-pos.mkiv" level="system" name="doifelseoverlapping"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -28292,7 +28580,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="doifoverlappingelse"> + <cd:command category="conditional" file="anch-pos.mkiv" level="system" name="doifoverlappingelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -28308,7 +28596,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="doifelsepositionsonsamepage"> + <cd:command category="conditional" file="anch-pos.mkiv" level="system" name="doifelsepositionsonsamepage"> <cd:arguments> <cd:keywords delimiters="braces" list="yes"> <cd:constant type="cd:name"/> @@ -28321,7 +28609,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="doifpositionsonsamepageelse"> + <cd:command category="conditional" file="anch-pos.mkiv" level="system" name="doifpositionsonsamepageelse"> <cd:arguments> <cd:keywords delimiters="braces" list="yes"> <cd:constant type="cd:name"/> @@ -28334,7 +28622,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="doifelsepositionsonthispage"> + <cd:command category="conditional" file="anch-pos.mkiv" level="system" name="doifelsepositionsonthispage"> <cd:arguments> <cd:keywords delimiters="braces" list="yes"> <cd:constant type="cd:name"/> @@ -28347,7 +28635,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="doifpositionsonthispageelse"> + <cd:command category="conditional" file="anch-pos.mkiv" level="system" name="doifpositionsonthispageelse"> <cd:arguments> <cd:keywords delimiters="braces" list="yes"> <cd:constant type="cd:name"/> @@ -28360,7 +28648,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="doifelsepositionsused"> + <cd:command category="conditional" file="anch-pos.mkiv" level="system" name="doifelsepositionsused"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:true"/> @@ -28370,7 +28658,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-pos.mkiv" name="doifpositionsusedelse"> + <cd:command category="conditional" file="anch-pos.mkiv" level="system" name="doifpositionsusedelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:true"/> @@ -28382,7 +28670,7 @@ </cd:command> </cd:interface> <cd:interface file="i-positionbar.xml"> - <cd:command file="pack-bar.mkiv" name="setuppositionbar"> + <cd:command category="graphics" file="pack-bar.mkiv" level="style" name="setuppositionbar"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="style"> @@ -28416,28 +28704,28 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="pack-bar.mkiv" name="horizontalpositionbar"> + <cd:command category="graphics" file="pack-bar.mkiv" level="style" name="horizontalpositionbar"> <cd:arguments> <cd:assignments list="yes"> <cd:inherit name="setuppositionbar"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="pack-bar.mkiv" name="verticalpositionbar"> + <cd:command category="graphics" file="pack-bar.mkiv" level="style" name="verticalpositionbar"> <cd:arguments> <cd:assignments list="yes"> <cd:inherit name="setuppositionbar"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="pack-bar.mkiv" name="horizontalgrowingbar"> + <cd:command category="graphics" file="pack-bar.mkiv" level="style" name="horizontalgrowingbar"> <cd:arguments> <cd:assignments list="yes"> <cd:inherit name="setuppositionbar"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="pack-bar.mkiv" name="verticalgrowingbar"> + <cd:command category="graphics" file="pack-bar.mkiv" level="style" name="verticalgrowingbar"> <cd:arguments> <cd:assignments list="yes"> <cd:inherit name="setuppositionbar"/> @@ -28446,7 +28734,7 @@ </cd:command> </cd:interface> <cd:interface file="i-positioning.xml"> - <cd:command file="pack-pos.mkiv" name="definepositioning"> + <cd:command category="graphics" file="pack-pos.mkiv" level="style" name="definepositioning"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -28459,7 +28747,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="pack-pos.mkiv" name="setuppositioning"> + <cd:command category="graphics" file="pack-pos.mkiv" level="style" name="setuppositioning"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -28522,7 +28810,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="pack-pos.mkiv" name="positioning" type="environment"> + <cd:command category="graphics" file="pack-pos.mkiv" level="document" name="positioning" type="environment"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -28532,7 +28820,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="pack-pos.mkiv" name="position"> + <cd:command category="graphics" file="pack-pos.mkiv" level="document" name="position"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setuppositioning"/> @@ -28543,7 +28831,7 @@ </cd:command> </cd:interface> <cd:interface file="i-postponing.xml"> - <cd:command file="page-pst.mkiv" name="postponing" type="environment"> + <cd:command category="structure" file="page-pst.mkiv" level="document" name="postponing" type="environment"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant method="none" prefix="cd:sign" type="cd:number"/> @@ -28552,7 +28840,7 @@ </cd:command> </cd:interface> <cd:interface file="i-processor.xml"> - <cd:command file="typo-prc.mkvi" name="defineprocessor"> + <cd:command category="fonts colors" file="typo-prc.mkvi" level="style" name="defineprocessor"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -28565,7 +28853,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="typo-prc.mkvi" name="setupprocessor"> + <cd:command category="fonts colors" file="typo-prc.mkvi" level="style" name="setupprocessor"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -28594,7 +28882,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="typo-prc.mkvi" name="applyprocessor"> + <cd:command category="fonts colors" file="typo-prc.mkvi" level="system" name="applyprocessor"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -28604,7 +28892,7 @@ </cd:command> </cd:interface> <cd:interface file="i-profile.xml"> - <cd:command file="spac-prf.mkvi" name="defineprofile"> + <cd:command category="pdf" file="spac-prf.mkvi" level="style" name="defineprofile"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -28617,7 +28905,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="spac-prf.mkvi" name="setupprofile"> + <cd:command category="pdf" file="spac-prf.mkvi" level="style" name="setupprofile"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -28646,7 +28934,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="spac-prf.mkvi" name="setprofile"> + <cd:command category="pdf" file="spac-prf.mkvi" level="system" name="setprofile"> <cd:arguments> <cd:keywords> <cd:constant type="none"/> @@ -28659,13 +28947,13 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-prf.mkvi" name="resetprofile"/> - <cd:command file="spac-prf.mkvi" name="useprofileparameter"> + <cd:command category="pdf" file="spac-prf.mkvi" level="system" name="resetprofile"/> + <cd:command category="pdf" file="spac-prf.mkvi" level="system" name="useprofileparameter"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="spac-prf.mkvi" name="profiledbox"> + <cd:command category="pdf" file="spac-prf.mkvi" level="system" name="profiledbox"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="none"/> @@ -28682,7 +28970,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="spac-prf.mkvi" name="profilegivenbox"> + <cd:command category="pdf" file="spac-prf.mkvi" level="system" name="profilegivenbox"> <cd:arguments> <cd:keywords delimiters="braces" optional="yes"> <cd:constant type="none"/> @@ -28701,28 +28989,28 @@ </cd:command> </cd:interface> <cd:interface file="i-publication.xml"> - <cd:command file="publ-ini.mkiv" name="btxrenderingdefinitions" type="environment"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="system" name="btxrenderingdefinitions" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="loadbtxdefinitionfile"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="system" name="loadbtxdefinitionfile"> <cd:arguments> <cd:keywords> <cd:constant type="cd:file"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="loadbtxreplacementfile"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="system" name="loadbtxreplacementfile"> <cd:arguments> <cd:keywords> <cd:constant type="cd:file"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="definebtx"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="system" name="definebtx"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -28735,7 +29023,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="setupbtx"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="system" name="setupbtx"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -28782,6 +29070,9 @@ <cd:parameter name="interaction"> <cd:constant default="yes" type="start"/> <cd:constant type="stop"/> + <cd:constant type="number"/> + <cd:constant type="text"/> + <cd:constant type="page"/> <cd:constant type="all"/> </cd:parameter> <cd:parameter name="alternative"> @@ -28823,21 +29114,21 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="setupbtx" variant="name"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="system" name="setupbtx" variant="name"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="usingbtxspecification" type="environment"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="system" name="usingbtxspecification" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="definebtxdataset"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="style" name="definebtxdataset"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -28850,7 +29141,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="setupbtxdataset"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="style" name="setupbtxdataset"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -28862,7 +29153,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="definebtxregister"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="system" name="definebtxregister"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -28875,7 +29166,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="setupbtxregister"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="system" name="setupbtxregister"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -28914,7 +29205,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="definebtxrendering"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="style" name="definebtxrendering"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -28927,7 +29218,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="setupbtxrendering"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="style" name="setupbtxrendering"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -28951,6 +29242,9 @@ <cd:constant type="all"/> <cd:constant type="none"/> </cd:parameter> + <cd:parameter name="filter"> + <cd:constant type="cd:text"/> + </cd:parameter> <cd:parameter name="specification"> <cd:constant type="cd:name"/> </cd:parameter> @@ -29002,7 +29296,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="usebtxdataset"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="style" name="usebtxdataset"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -29017,7 +29311,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="publication" type="environment"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="style" name="publication" type="environment"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -29038,7 +29332,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="setupbtxlist"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="style" name="setupbtxlist"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -29048,7 +29342,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="completebtxrendering"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="document" name="completebtxrendering"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -29058,7 +29352,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="placebtxrendering"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="document" name="placebtxrendering"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -29068,7 +29362,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="completelistofpublications"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="document" name="completelistofpublications"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -29078,7 +29372,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="placelistofpublications"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="document" name="placelistofpublications"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -29088,7 +29382,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="btxhybridcite"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="system" name="btxhybridcite"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="reference"> @@ -29130,7 +29424,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="btxhybridcite" variant="userdata"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="system" name="btxhybridcite" variant="userdata"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="reference"> @@ -29174,7 +29468,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="btxhybridcite" variant="alternative"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="system" name="btxhybridcite" variant="alternative"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="default"/> @@ -29198,14 +29492,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="btxhybridcite" variant="direct"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="system" name="btxhybridcite" variant="direct"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:reference"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="btxlistcitation"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="system" name="btxlistcitation"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="reference"> @@ -29247,7 +29541,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="btxlistcitation" variant="userdata"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="system" name="btxlistcitation" variant="userdata"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="reference"> @@ -29291,7 +29585,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="btxlistcitation" variant="alternative"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="system" name="btxlistcitation" variant="alternative"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="default"/> @@ -29315,7 +29609,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="btxtextcitation"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="system" name="btxtextcitation"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="reference"> @@ -29357,7 +29651,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="btxtextcitation" variant="userdata"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="system" name="btxtextcitation" variant="userdata"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="reference"> @@ -29401,7 +29695,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="btxtextcitation" variant="alternative"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="system" name="btxtextcitation" variant="alternative"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="default"/> @@ -29425,7 +29719,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="btxalwayscitation"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="system" name="btxalwayscitation"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="reference"> @@ -29467,7 +29761,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="btxalwayscitation" variant="userdata"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="system" name="btxalwayscitation" variant="userdata"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="reference"> @@ -29511,7 +29805,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="btxalwayscitation" variant="alternative"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="system" name="btxalwayscitation" variant="alternative"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="default"/> @@ -29535,14 +29829,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="bthiddencitation"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="system" name="btxhiddencitation"> <cd:arguments> <cd:keywords> <cd:constant type="cd:reference"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="listcitation"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="document" name="listcitation"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="reference"> @@ -29584,7 +29878,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="listcitation" variant="userdata"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="document" name="listcitation" variant="userdata"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="reference"> @@ -29628,7 +29922,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="listcitation" variant="alternative"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="document" name="listcitation" variant="alternative"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="default"/> @@ -29652,7 +29946,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="listcite"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="document" name="listcite"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="reference"> @@ -29694,7 +29988,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="listcite" variant="userdata"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="document" name="listcite" variant="userdata"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="reference"> @@ -29738,7 +30032,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="listcite" variant="alternative"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="document" name="listcite" variant="alternative"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="default"/> @@ -29762,7 +30056,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="textcitation"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="document" name="textcitation"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="reference"> @@ -29804,7 +30098,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="textcitation" variant="userdata"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="document" name="textcitation" variant="userdata"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="reference"> @@ -29848,7 +30142,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="textcitation" variant="alternative"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="document" name="textcitation" variant="alternative"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="default"/> @@ -29872,7 +30166,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="textcite"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="document" name="textcite"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="reference"> @@ -29914,7 +30208,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="textcite" variant="userdata"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="document" name="textcite" variant="userdata"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="reference"> @@ -29958,7 +30252,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="textcite" variant="alternative"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="document" name="textcite" variant="alternative"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="default"/> @@ -29982,7 +30276,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="alwayscitation"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="document" name="alwayscitation"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="reference"> @@ -30024,7 +30318,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="alwayscitation" variant="userdata"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="document" name="alwayscitation" variant="userdata"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="reference"> @@ -30068,7 +30362,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="alwayscitation" variant="alternative"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="document" name="alwayscitation" variant="alternative"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="default"/> @@ -30092,7 +30386,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="alwayscite"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="document" name="alwayscite"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="reference"> @@ -30134,7 +30428,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="alwayscite" variant="userdata"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="document" name="alwayscite" variant="userdata"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="reference"> @@ -30178,7 +30472,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="alwayscite" variant="alternative"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="document" name="alwayscite" variant="alternative"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="default"/> @@ -30202,21 +30496,21 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="hiddencitation"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="document" name="hiddencitation"> <cd:arguments> <cd:keywords> <cd:constant type="cd:reference"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="hiddencite"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="document" name="hiddencite"> <cd:arguments> <cd:keywords> <cd:constant type="cd:reference"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="citation"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="document" name="citation"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="reference"> @@ -30258,7 +30552,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="citation" variant="userdata"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="document" name="citation" variant="userdata"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="reference"> @@ -30302,7 +30596,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="citation" variant="alternative"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="document" name="citation" variant="alternative"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="default"/> @@ -30326,14 +30620,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="citation" variant="direct"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="document" name="citation" variant="direct"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:reference"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="cite"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="document" name="cite"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="reference"> @@ -30375,7 +30669,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="cite" variant="userdata"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="document" name="cite" variant="userdata"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="reference"> @@ -30419,7 +30713,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="cite" variant="alternative"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="document" name="cite" variant="alternative"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="default"/> @@ -30443,42 +30737,56 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="cite" variant="direct"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="document" name="cite" variant="direct"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:reference"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="nocitation"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="document" name="nocitation"> <cd:arguments> <cd:keywords> <cd:constant type="cd:reference"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="nocitation" variant="direct"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="document" name="nocitation" variant="direct"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:reference"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="nocite"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="document" name="usecitation"> <cd:arguments> <cd:keywords> <cd:constant type="cd:reference"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="nocite" variant="direct"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="document" name="usecitation" variant="direct"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:reference"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="savebtxdataset"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="document" name="nocite"> + <cd:arguments> + <cd:keywords> + <cd:constant type="cd:reference"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command category="bibliography" file="publ-ini.mkiv" level="document" name="nocite" variant="direct"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:reference"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command category="bibliography" file="publ-ini.mkiv" level="style" name="savebtxdataset"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -30516,21 +30824,21 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="placecitation"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="document" name="placecitation"> <cd:arguments> <cd:keywords> <cd:constant type="cd:reference"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="usebtxdefinitions"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="style" name="usebtxdefinitions"> <cd:arguments> <cd:keywords> <cd:constant type="cd:file"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="btxfield"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="system" name="btxfield"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="address"/> @@ -30567,7 +30875,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="btxdetail"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="system" name="btxdetail"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="address"/> @@ -30604,7 +30912,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="btxflush"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="system" name="btxflush"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="address"/> @@ -30641,7 +30949,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="btxdirect"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="system" name="btxdirect"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="address"/> @@ -30678,7 +30986,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="btxfieldname"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="system" name="btxfieldname"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="address"/> @@ -30715,7 +31023,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="btxfieldtype"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="system" name="btxfieldtype"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="address"/> @@ -30752,7 +31060,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="btxfoundname"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="system" name="btxfoundname"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="address"/> @@ -30789,7 +31097,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="btxfoundtype"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="system" name="btxfoundtype"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="address"/> @@ -30826,7 +31134,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="btxauthorfield"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="system" name="btxauthorfield"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="initials"/> @@ -30837,7 +31145,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="btxdoifelse"> + <cd:command category="bibliography conditional" file="publ-ini.mkiv" level="system" name="btxdoifelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="address"/> @@ -30880,7 +31188,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="btxdoif"> + <cd:command category="bibliography conditional" file="publ-ini.mkiv" level="system" name="btxdoif"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="address"/> @@ -30920,7 +31228,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="btxdoifnot"> + <cd:command category="bibliography conditional" file="publ-ini.mkiv" level="system" name="btxdoifnot"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="address"/> @@ -30960,14 +31268,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="btxsetup"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="system" name="btxsetup"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="btxdoifelsesameaspreviouschecked"> + <cd:command category="bibliography conditional" file="publ-ini.mkiv" level="system" name="btxdoifelsesameaspreviouschecked"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="always"/> @@ -31014,7 +31322,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="btxdoifelsesameasprevious"> + <cd:command category="bibliography conditional" file="publ-ini.mkiv" level="system" name="btxdoifelsesameasprevious"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="address"/> @@ -31057,7 +31365,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="btxdoifelsecombiinlist"> + <cd:command category="bibliography conditional" file="publ-ini.mkiv" level="system" name="btxdoifelsecombiinlist"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -31073,7 +31381,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="btxdoifsameaspreviouscheckedelse"> + <cd:command category="bibliography conditional" file="publ-ini.mkiv" level="system" name="btxdoifsameaspreviouscheckedelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="always"/> @@ -31120,7 +31428,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="btxdoifsameaspreviouselse"> + <cd:command category="bibliography conditional" file="publ-ini.mkiv" level="system" name="btxdoifsameaspreviouselse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="address"/> @@ -31163,7 +31471,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="btxdoifcombiinlistelse"> + <cd:command category="bibliography conditional" file="publ-ini.mkiv" level="system" name="btxdoifcombiinlistelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -31179,14 +31487,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="currentbtxuservariable"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="system" name="currentbtxuservariable"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:key"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="btxdoifelseuservariable"> + <cd:command category="bibliography conditional" file="publ-ini.mkiv" level="system" name="btxdoifelseuservariable"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:key"/> @@ -31199,7 +31507,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="btxdoifuservariableelse"> + <cd:command category="bibliography conditional" file="publ-ini.mkiv" level="system" name="btxdoifuservariableelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:key"/> @@ -31212,7 +31520,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="btxremapauthor"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="system" name="btxremapauthor"> <cd:arguments> <cd:keywords> <cd:constant type="cd:text"/> @@ -31222,7 +31530,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="btxflushauthor"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="system" name="btxflushauthor"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="num"/> @@ -31237,8 +31545,8 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="btxflushsuffix"/> - <cd:command file="publ-ini.mkiv" name="btxflushauthorname"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="system" name="btxflushsuffix"/> + <cd:command category="bibliography" file="publ-ini.mkiv" level="system" name="btxflushauthorname"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="author"/> @@ -31246,7 +31554,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="btxflushauthornormal"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="system" name="btxflushauthornormal"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="author"/> @@ -31254,7 +31562,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="btxflushauthornormalshort"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="system" name="btxflushauthornormalshort"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="author"/> @@ -31262,7 +31570,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="btxflushauthorinverted"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="system" name="btxflushauthorinverted"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="author"/> @@ -31270,7 +31578,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="btxflushauthorinvertedshort"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="system" name="btxflushauthorinvertedshort"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="author"/> @@ -31278,7 +31586,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="btxsingularplural"> + <cd:command category="bibliography conditional" file="publ-ini.mkiv" level="system" name="btxsingularplural"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="editor"/> @@ -31293,7 +31601,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="btxsingularorplural"> + <cd:command category="bibliography conditional" file="publ-ini.mkiv" level="system" name="btxsingularorplural"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="editor"/> @@ -31308,7 +31616,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="btxoneorrange"> + <cd:command category="bibliography conditional" file="publ-ini.mkiv" level="system" name="btxoneorrange"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="volume"/> @@ -31322,7 +31630,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="btxfirstofrange"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="system" name="btxfirstofrange"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="volume"/> @@ -31330,21 +31638,21 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="btxloadjournalist"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="system" name="btxloadjournalist"> <cd:arguments> <cd:keywords> <cd:constant type="cd:file"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="btxsavejournalist"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="system" name="btxsavejournalist"> <cd:arguments> <cd:keywords> <cd:constant type="cd:file"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="btxaddjournal"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="system" name="btxaddjournal"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -31354,21 +31662,21 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="btxexpandedjournal"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="system" name="btxexpandedjournal"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-ini.mkiv" name="btxabbreviatedjournal"> + <cd:command category="bibliography" file="publ-ini.mkiv" level="system" name="btxabbreviatedjournal"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-tra.mkiv" name="showbtxdatasetfields"> + <cd:command category="bibliography" file="publ-tra.mkiv" level="document" name="showbtxdatasetfields"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="specification"> @@ -31413,14 +31721,14 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="publ-tra.mkiv" name="showbtxdatasetfields" variant="argument"> + <cd:command category="bibliography" file="publ-tra.mkiv" level="document" name="showbtxdatasetfields" variant="argument"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-tra.mkiv" name="showbtxdatasetcompleteness"> + <cd:command category="bibliography" file="publ-tra.mkiv" level="document" name="showbtxdatasetcompleteness"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="specification"> @@ -31465,14 +31773,14 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="publ-tra.mkiv" name="showbtxdatasetcompleteness" variant="argument"> + <cd:command category="bibliography" file="publ-tra.mkiv" level="document" name="showbtxdatasetcompleteness" variant="argument"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-tra.mkiv" name="showbtxdatasetauthors"> + <cd:command category="bibliography" file="publ-tra.mkiv" level="document" name="showbtxdatasetauthors"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="specification"> @@ -31517,21 +31825,21 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="publ-tra.mkiv" name="showbtxdatasetauthors" variant="argument"> + <cd:command category="bibliography" file="publ-tra.mkiv" level="document" name="showbtxdatasetauthors" variant="argument"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-tra.mkiv" name="showbtxhashedauthors"> + <cd:command category="bibliography" file="publ-tra.mkiv" level="document" name="showbtxhashedauthors"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-tra.mkiv" name="showbtxfields"> + <cd:command category="bibliography" file="publ-tra.mkiv" level="document" name="showbtxfields"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="rotation"> @@ -31543,14 +31851,14 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="publ-tra.mkiv" name="showbtxfields" variant="argument"> + <cd:command category="bibliography" file="publ-tra.mkiv" level="document" name="showbtxfields" variant="argument"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="publ-tra.mkiv" name="showbtxtables"> + <cd:command category="bibliography" file="publ-tra.mkiv" level="document" name="showbtxtables"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:text"/> @@ -31559,7 +31867,7 @@ </cd:command> </cd:interface> <cd:interface file="i-random.xml"> - <cd:command file="supp-ran.mkiv" name="getrandomcount"> + <cd:command file="supp-ran.mkiv" level="system" name="getrandomcount"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -31570,7 +31878,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-ran.mkiv" name="getrandomdimen"> + <cd:command file="supp-ran.mkiv" level="system" name="getrandomdimen"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -31581,7 +31889,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-ran.mkiv" name="getrandomnumber"> + <cd:command file="supp-ran.mkiv" level="system" name="getrandomnumber"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -31592,7 +31900,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-ran.mkiv" name="getrandomfloat"> + <cd:command file="supp-ran.mkiv" level="system" name="getrandomfloat"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -31603,21 +31911,21 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-ran.mkiv" name="setrandomseed"> + <cd:command file="supp-ran.mkiv" level="system" name="setrandomseed"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-ran.mkiv" name="getrandomseed"> + <cd:command file="supp-ran.mkiv" level="system" name="getrandomseed"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command begin="push" end="pop" file="supp-ran.mkiv" name="randomseed" type="environment"/> - <cd:command file="supp-ran.mkiv" name="reuserandomseed"/> - <cd:command file="supp-ran.mkiv" name="randomnumber"> + <cd:command begin="push" end="pop" file="supp-ran.mkiv" level="system" name="randomseed" type="environment"/> + <cd:command file="supp-ran.mkiv" level="system" name="reuserandomseed"/> + <cd:command file="supp-ran.mkiv" level="system" name="randomnumber"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> @@ -31627,10 +31935,10 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-ran.mkiv" name="mprandomnumber"/> + <cd:command file="supp-ran.mkiv" level="system" name="mprandomnumber"/> </cd:interface> <cd:interface file="i-references.xml"> - <cd:command file="strc-ref.mkvi" name="setupreferencing"> + <cd:command category="references" file="strc-ref.mkvi" level="style" name="setupreferencing"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="state"> @@ -31680,7 +31988,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-ref.mkvi" name="textreference"> + <cd:command category="references" file="strc-ref.mkvi" level="document" name="textreference"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:reference"/> @@ -31690,14 +31998,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-ref.mkvi" name="pagereference"> + <cd:command category="references" file="strc-ref.mkvi" level="document" name="pagereference"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:reference"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-ref.mkvi" name="reference"> + <cd:command category="references" file="strc-ref.mkvi" level="document" name="reference"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:reference"/> @@ -31707,7 +32015,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-ref.mkvi" name="setreference"> + <cd:command category="references" file="strc-ref.mkvi" level="document" name="setreference"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:reference"/> @@ -31719,12 +32027,12 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-ref.mkvi" name="usereferenceparameter"> + <cd:command category="references" file="strc-ref.mkvi" level="system" name="usereferenceparameter"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="strc-ref.mkvi" name="boxreference"> + <cd:command category="references" file="strc-ref.mkvi" level="system" name="boxreference"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:reference"/> @@ -31733,7 +32041,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="strc-ref.mkvi" name="hboxreference"> + <cd:command category="references" file="strc-ref.mkvi" level="system" name="hboxreference"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:reference"/> @@ -31741,7 +32049,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="strc-ref.mkvi" name="vboxreference"> + <cd:command category="references" file="strc-ref.mkvi" level="system" name="vboxreference"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:reference"/> @@ -31749,7 +32057,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="strc-ref.mkvi" name="contentreference"> + <cd:command category="references" file="strc-ref.mkvi" level="system" name="contentreference"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:reference"/> @@ -31760,7 +32068,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="strc-ref.mkvi" name="definereference"> + <cd:command category="references" file="strc-ref.mkvi" level="style" name="definereference"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -31770,14 +32078,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-ref.mkvi" name="resetreference"> + <cd:command category="references" file="strc-ref.mkvi" level="system" name="resetreference"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-ref.mkvi" name="setpagereference"> + <cd:command category="references" file="strc-ref.mkvi" level="system" name="setpagereference"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -31787,7 +32095,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-ref.mkvi" name="doifelsereferencefound"> + <cd:command category="references conditional" file="strc-ref.mkvi" level="system" name="doifelsereferencefound"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:reference"/> @@ -31800,7 +32108,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-ref.mkvi" name="doifreferencefoundelse"> + <cd:command category="references conditional" file="strc-ref.mkvi" level="system" name="doifreferencefoundelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:reference"/> @@ -31813,7 +32121,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-ref.mkvi" name="setupreferenceprefix"> + <cd:command category="references" file="strc-ref.mkvi" level="style" name="setupreferenceprefix"> <cd:arguments> <cd:keywords> <cd:constant type="+"/> @@ -31822,7 +32130,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-ref.mkvi" name="setupglobalreferenceprefix"> + <cd:command category="references" file="strc-ref.mkvi" level="system" name="setupglobalreferenceprefix"> <cd:arguments> <cd:keywords> <cd:constant type="+"/> @@ -31831,7 +32139,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command begin="push" end="pop" file="strc-ref.mkvi" name="referenceprefix" type="environment"> + <cd:command begin="push" category="references" end="pop" file="strc-ref.mkvi" level="system" name="referenceprefix" type="environment"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="+"/> @@ -31840,7 +32148,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command begin="globalpush" end="globalpop" file="strc-ref.mkvi" name="referenceprefix" type="environment"> + <cd:command begin="globalpush" category="references" end="globalpop" file="strc-ref.mkvi" level="system" name="referenceprefix" type="environment"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="+"/> @@ -31849,8 +32157,8 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-ref.mkvi" name="referenceprefix"/> - <cd:command file="strc-ref.mkvi" name="in"> + <cd:command category="references" file="strc-ref.mkvi" level="system" name="referenceprefix"/> + <cd:command category="references" file="strc-ref.mkvi" level="document" name="in"> <cd:arguments> <cd:keywords delimiters="braces" optional="yes"> <cd:constant type="cd:text"/> @@ -31863,7 +32171,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-ref.mkvi" name="at"> + <cd:command category="references" file="strc-ref.mkvi" level="document" name="at"> <cd:arguments> <cd:keywords delimiters="braces" optional="yes"> <cd:constant type="cd:text"/> @@ -31876,28 +32184,28 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-ref.mkvi" name="about"> + <cd:command category="references" file="strc-ref.mkvi" level="document" name="about"> <cd:arguments> <cd:keywords> <cd:constant type="cd:reference"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-ref.mkvi" name="from"> + <cd:command category="references" file="strc-ref.mkvi" level="document" name="from"> <cd:arguments> <cd:keywords> <cd:constant type="cd:reference"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-ref.mkvi" name="over"> + <cd:command category="references" file="strc-ref.mkvi" level="document" name="over"> <cd:arguments> <cd:keywords> <cd:constant type="cd:reference"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-ref.mkvi" name="filterreference"> + <cd:command category="references" file="strc-ref.mkvi" level="system" name="filterreference"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="default"/> @@ -31909,7 +32217,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-ref.mkvi" name="getreferenceentry"> + <cd:command category="references" file="strc-ref.mkvi" level="system" name="getreferenceentry"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="default"/> @@ -31921,7 +32229,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-ref.mkvi" name="getreference"> + <cd:command category="references" file="strc-ref.mkvi" level="system" name="getreference"> <cd:arguments> <cd:keywords> <cd:constant type="default"/> @@ -31936,7 +32244,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-ref.mkvi" name="ref"> + <cd:command category="references" file="strc-ref.mkvi" level="document" name="ref"> <cd:arguments> <cd:keywords> <cd:constant type="default"/> @@ -31951,7 +32259,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-ref.mkvi" name="somewhere"> + <cd:command category="references" file="strc-ref.mkvi" level="document" name="somewhere"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -31964,7 +32272,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-ref.mkvi" name="docheckedpagestate"> + <cd:command category="references" file="strc-ref.mkvi" level="system" name="docheckedpagestate"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:reference"/> @@ -31989,7 +32297,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-ref.mkvi" name="someplace"> + <cd:command category="references" file="strc-ref.mkvi" level="system" name="someplace"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -32011,21 +32319,21 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-ref.mkvi" name="atpage"> + <cd:command category="references" file="strc-ref.mkvi" level="document" name="atpage"> <cd:arguments> <cd:keywords> <cd:constant type="cd:reference"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-ref.mkvi" name="symbolreference"> + <cd:command category="references" file="strc-ref.mkvi" level="system" name="symbolreference"> <cd:arguments> <cd:keywords> <cd:constant type="cd:reference"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-ref.mkvi" name="definereferenceformat"> + <cd:command category="references" file="strc-ref.mkvi" level="style" name="definereferenceformat"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -32038,7 +32346,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-ref.mkvi" name="setupreferenceformat"> + <cd:command category="references" file="strc-ref.mkvi" level="style" name="setupreferenceformat"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -32082,7 +32390,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-ref.mkvi" generated="yes" name="referenceformat" variant="example"> + <cd:command category="references" file="strc-ref.mkvi" generated="yes" level="document" name="referenceformat" variant="example"> <cd:sequence> <cd:variable value="referenceformat"/> </cd:sequence> @@ -32098,7 +32406,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-ref.mkvi" name="goto"> + <cd:command category="references" file="strc-ref.mkvi" level="document" name="goto"> <cd:arguments> <cd:content/> <cd:keywords> @@ -32106,14 +32414,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-ref.mkvi" name="goto" type="environment"> + <cd:command category="references" file="strc-ref.mkvi" level="system" name="goto" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:reference"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-ref.mkvi" name="gotobox"> + <cd:command category="references" file="strc-ref.mkvi" level="system" name="gotobox"> <cd:arguments> <cd:content/> <cd:keywords> @@ -32121,7 +32429,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-ref.mkvi" name="useurl"> + <cd:command category="references" file="strc-ref.mkvi" level="style" name="useurl"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -32137,7 +32445,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-ref.mkvi" name="useURL"> + <cd:command category="references" file="strc-ref.mkvi" level="style" name="useURL"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -32153,7 +32461,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-ref.mkvi" name="usefile"> + <cd:command category="references" file="strc-ref.mkvi" level="style" name="usefile"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -32166,7 +32474,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-ref.mkvi" name="useexternaldocument"> + <cd:command category="references" file="strc-ref.mkvi" level="style" name="useexternaldocument"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -32179,7 +32487,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-ref.mkvi" name="doifelseurldefined"> + <cd:command category="references conditional" file="strc-ref.mkvi" level="system" name="doifelseurldefined"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -32192,7 +32500,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-ref.mkvi" name="doifurldefinedelse"> + <cd:command category="references conditional" file="strc-ref.mkvi" level="system" name="doifurldefinedelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -32205,7 +32513,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-ref.mkvi" name="doifelsefiledefined"> + <cd:command category="references conditional" file="strc-ref.mkvi" level="system" name="doifelsefiledefined"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -32218,7 +32526,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-ref.mkvi" name="doiffiledefinedelse"> + <cd:command category="references conditional" file="strc-ref.mkvi" level="system" name="doiffiledefinedelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -32231,7 +32539,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-ref.mkvi" name="setupurl"> + <cd:command category="references" file="strc-ref.mkvi" level="style" name="setupurl"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="style"> @@ -32244,14 +32552,14 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-ref.mkvi" name="url"> + <cd:command category="references" file="strc-ref.mkvi" level="document" name="url"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-ref.mkvi" name="defineprogram"> + <cd:command category="references" file="strc-ref.mkvi" level="style" name="defineprogram"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -32264,7 +32572,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-ref.mkvi" name="setupprograms"> + <cd:command category="references" file="strc-ref.mkvi" level="style" name="setupprograms"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="style"> @@ -32277,14 +32585,14 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-ref.mkvi" name="program"> + <cd:command category="references" file="strc-ref.mkvi" level="document" name="program"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-ref.mkvi" name="definepage"> + <cd:command category="references" file="strc-ref.mkvi" level="system" name="definepage"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -32294,7 +32602,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-ref.mkvi" name="gotopage"> + <cd:command category="references" file="strc-ref.mkvi" level="system" name="gotopage"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -32304,7 +32612,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-ref.mkvi" name="setupreferencestructureprefix"> + <cd:command category="references" file="strc-ref.mkvi" level="style" name="setupreferencestructureprefix"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -32380,9 +32688,9 @@ </cd:command> </cd:interface> <cd:interface file="i-regime.xml"> - <cd:command file="regi-ini.mkiv" name="currentregime"/> - <cd:command file="regi-ini.mkiv" name="disableregime"/> - <cd:command file="regi-ini.mkiv" name="enableregime"> + <cd:command category="language" file="regi-ini.mkiv" level="system" name="currentregime"/> + <cd:command category="language" file="regi-ini.mkiv" level="system" name="disableregime"/> + <cd:command category="language" file="regi-ini.mkiv" level="style" name="enableregime"> <cd:arguments> <cd:keywords> <cd:constant type="cp1250"/> @@ -32450,7 +32758,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="regi-ini.mkiv" name="regime" type="environment"> + <cd:command category="language" file="regi-ini.mkiv" level="system" name="regime" type="environment"> <cd:arguments> <cd:keywords> <cd:inherit name="enableregime"/> @@ -32459,7 +32767,7 @@ </cd:command> </cd:interface> <cd:interface file="i-register.xml"> - <cd:command file="strc-reg.mkiv" name="defineregister"> + <cd:command category="structure" file="strc-reg.mkiv" level="style" name="defineregister"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -32472,7 +32780,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-reg.mkiv" name="setupregister" variant="argument"> + <cd:command category="structure" file="strc-reg.mkiv" level="style" name="setupregister" variant="argument"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -32521,6 +32829,7 @@ <cd:constant type="yes"/> <cd:constant default="yes" type="no"/> <cd:constant type="all"/> + <cd:constant type="packed"/> </cd:parameter> <cd:parameter name="criterium"> <cd:constant type="local"/> @@ -32677,7 +32986,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-reg.mkiv" name="setupregister"> + <cd:command category="structure" file="strc-reg.mkiv" level="style" name="setupregister"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -32880,7 +33189,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-reg.mkiv" name="setupregisters" variant="argument"> + <cd:command category="structure" file="strc-reg.mkiv" level="style" name="setupregisters" variant="argument"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -32893,7 +33202,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-reg.mkiv" name="setupregisters"> + <cd:command category="structure" file="strc-reg.mkiv" level="style" name="setupregisters"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -32904,7 +33213,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-reg.mkiv" generated="yes" name="register" variant="instance"> + <cd:command category="structure" file="strc-reg.mkiv" generated="yes" level="document" name="register" variant="instance"> <cd:sequence> <cd:instance value="register"/> </cd:sequence> @@ -32915,9 +33224,11 @@ </cd:keywords> <cd:index list="yes"/> </cd:arguments> - <cd:instances/> + <cd:instances> + <cd:constant value="index"/> + </cd:instances> </cd:command> - <cd:command file="strc-reg.mkiv" generated="yes" name="register" variant="instance:ownnumber"> + <cd:command category="structure" file="strc-reg.mkiv" generated="yes" level="document" name="register" variant="instance:ownnumber"> <cd:sequence> <cd:instance value="register"/> </cd:sequence> @@ -32931,9 +33242,11 @@ </cd:keywords> <cd:index list="yes"/> </cd:arguments> - <cd:instances/> + <cd:instances> + <cd:constant value="index"/> + </cd:instances> </cd:command> - <cd:command file="strc-reg.mkiv" generated="yes" name="seeregister" variant="instance"> + <cd:command category="structure" file="strc-reg.mkiv" generated="yes" level="document" name="seeregister" variant="instance"> <cd:sequence> <cd:string value="see"/> <cd:instance value="register"/> @@ -32949,9 +33262,11 @@ <cd:constant method="apply" prefix="cd:processor" type="cd:text"/> </cd:keywords> </cd:arguments> - <cd:instances/> + <cd:instances> + <cd:constant value="index"/> + </cd:instances> </cd:command> - <cd:command file="strc-reg.mkiv" generated="yes" name="placeregister" variant="instance"> + <cd:command category="structure" file="strc-reg.mkiv" generated="yes" level="document" name="placeregister" variant="instance"> <cd:sequence> <cd:string value="place"/> <cd:instance value="register"/> @@ -32961,9 +33276,11 @@ <cd:inherit name="setupregister"/> </cd:assignments> </cd:arguments> - <cd:instances/> + <cd:instances> + <cd:constant value="index"/> + </cd:instances> </cd:command> - <cd:command file="strc-reg.mkiv" generated="yes" name="completeregister" variant="instance"> + <cd:command category="structure" file="strc-reg.mkiv" generated="yes" level="document" name="completeregister" variant="instance"> <cd:sequence> <cd:string value="complete"/> <cd:instance value="register"/> @@ -32973,9 +33290,11 @@ <cd:inherit name="setupregister"/> </cd:assignments> </cd:arguments> - <cd:instances/> + <cd:instances> + <cd:constant value="index"/> + </cd:instances> </cd:command> - <cd:command file="strc-reg.mkiv" generated="yes" name="setupregister" variant="instance"> + <cd:command category="structure" file="strc-reg.mkiv" generated="yes" level="style" name="setupregister" variant="instance"> <cd:sequence> <cd:string value="setup"/> <cd:instance value="register"/> @@ -32988,9 +33307,11 @@ <cd:inherit name="setupregister"/> </cd:assignments> </cd:arguments> - <cd:instances/> + <cd:instances> + <cd:constant value="index"/> + </cd:instances> </cd:command> - <cd:command file="strc-reg.mkiv" name="startregister"> + <cd:command category="structure" file="strc-reg.mkiv" level="document" name="startregister"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -33008,7 +33329,7 @@ <cd:index list="yes"/> </cd:arguments> </cd:command> - <cd:command file="strc-reg.mkiv" name="stopregister"> + <cd:command category="structure" file="strc-reg.mkiv" level="document" name="stopregister"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -33018,7 +33339,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-reg.mkiv" name="setregisterentry"> + <cd:command category="structure" file="strc-reg.mkiv" level="document" name="setregisterentry"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -33064,7 +33385,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-reg.mkiv" name="finishregisterentry"> + <cd:command category="structure" file="strc-reg.mkiv" level="document" name="finishregisterentry"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -33092,7 +33413,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-reg.mkiv" name="setstructurepageregister"> + <cd:command category="structure" file="strc-reg.mkiv" level="document" name="setstructurepageregister"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -33138,7 +33459,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-reg.mkiv" name="startstructurepageregister"> + <cd:command category="structure" file="strc-reg.mkiv" level="document" name="startstructurepageregister"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -33187,7 +33508,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-reg.mkiv" name="stopstructurepageregister"> + <cd:command category="structure" file="strc-reg.mkiv" level="document" name="stopstructurepageregister"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -33197,7 +33518,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-reg.mkiv" name="determineregistercharacteristics"> + <cd:command category="structure" file="strc-reg.mkiv" level="system" name="determineregistercharacteristics"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -33249,8 +33570,8 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-reg.mkiv" name="utilityregisterlength"/> - <cd:command file="strc-reg.mkiv" name="placeregister"> + <cd:command category="structure" file="strc-reg.mkiv" level="system" name="utilityregisterlength"/> + <cd:command file="strc-reg.mkiv" level="document" name="placeregister"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -33260,7 +33581,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-reg.mkiv" name="completeregister"> + <cd:command category="structure" file="strc-reg.mkiv" level="document" name="completeregister"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -33270,7 +33591,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-reg.mkiv" name="currentregisterpageuserdata"> + <cd:command category="structure" file="strc-reg.mkiv" level="system" name="currentregisterpageuserdata"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:key"/> @@ -33279,7 +33600,7 @@ </cd:command> </cd:interface> <cd:interface file="i-renderingwindow.xml"> - <cd:command file="scrn-wid.mkvi" name="useexternalrendering"> + <cd:command category="pdf" file="scrn-wid.mkvi" level="system" name="useexternalrendering"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -33296,7 +33617,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="scrn-wid.mkvi" name="setinternalrendering"> + <cd:command category="pdf" file="scrn-wid.mkvi" level="system" name="setinternalrendering"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -33308,7 +33629,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="scrn-wid.mkvi" name="definerenderingwindow"> + <cd:command category="pdf" file="scrn-wid.mkvi" level="style" name="definerenderingwindow"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -33321,7 +33642,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="scrn-wid.mkvi" name="setuprenderingwindow"> + <cd:command category="pdf" file="scrn-wid.mkvi" level="style" name="setuprenderingwindow"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -33337,7 +33658,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="scrn-wid.mkvi" name="placerenderingwindow"> + <cd:command category="pdf" file="scrn-wid.mkvi" level="style" name="placerenderingwindow"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -33349,7 +33670,7 @@ </cd:command> </cd:interface> <cd:interface file="i-replacement.xml"> - <cd:command file="lang-rep.mkiv" name="replaceword"> + <cd:command category="language" file="lang-rep.mkiv" level="style" name="replaceword"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -33362,7 +33683,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="lang-rep.mkiv" name="setreplacement"> + <cd:command category="language" file="lang-rep.mkiv" level="style" name="setreplacement"> <cd:arguments> <cd:keywords> <cd:constant type="reset"/> @@ -33370,15 +33691,15 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="lang-rep.mkiv" name="resetreplacement"/> + <cd:command category="language" file="lang-rep.mkiv" level="style" name="resetreplacement"/> </cd:interface> <cd:interface file="i-rotatation.xml"> - <cd:command file="grph-trf.mkiv" name="mirror"> + <cd:command category="graphics" file="grph-trf.mkiv" level="document" name="mirror"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="grph-trf.mkiv" name="setuprotate"> + <cd:command category="graphics" file="grph-trf.mkiv" level="style" name="setuprotate"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="location"> @@ -33401,7 +33722,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="grph-trf.mkiv" name="rotate"> + <cd:command category="graphics" file="grph-trf.mkiv" level="document" name="rotate"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setuprotate"/> @@ -33409,7 +33730,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="grph-trf.mkiv" name="dorotatebox"> + <cd:command category="graphics" file="grph-trf.mkiv" level="system" name="dorotatebox"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> @@ -33420,7 +33741,7 @@ </cd:command> </cd:interface> <cd:interface file="i-scale.xml"> - <cd:command file="grph-trf.mkiv" name="definescale"> + <cd:command category="graphics" file="grph-trf.mkiv" level="style" name="definescale"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -33433,7 +33754,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="grph-trf.mkiv" name="setupscale"> + <cd:command category="graphics" file="grph-trf.mkiv" level="style" name="setupscale"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -33513,7 +33834,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="grph-trf.mkiv" name="scale"> + <cd:command category="graphics" file="grph-trf.mkiv" level="document" name="scale"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -33524,7 +33845,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="grph-trf.mkiv" name="fastscale"> + <cd:command category="graphics" file="grph-trf.mkiv" level="system" name="fastscale"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> @@ -33532,7 +33853,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="grph-trf.mkiv" name="fastsxsy"> + <cd:command category="graphics" file="grph-trf.mkiv" level="system" name="fastsxsy"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> @@ -33545,7 +33866,7 @@ </cd:command> </cd:interface> <cd:interface file="i-script.xml"> - <cd:command file="scrp-ini.mkvi" name="definescript"> + <cd:command category="language" file="scrp-ini.mkvi" level="style" name="definescript"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -33558,7 +33879,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="scrp-ini.mkvi" name="setupscript"> + <cd:command category="language" file="scrp-ini.mkvi" level="style" name="setupscript"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -33581,7 +33902,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="scrp-ini.mkvi" name="setupscripts"> + <cd:command category="language" file="scrp-ini.mkvi" level="style" name="setupscripts"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -33591,7 +33912,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="scrp-ini.mkvi" name="setscript"> + <cd:command category="language" file="scrp-ini.mkvi" level="style" name="setscript"> <cd:arguments> <cd:keywords> <cd:constant type="hangul"/> @@ -33604,8 +33925,8 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="scrp-ini.mkvi" name="resetscript"/> - <cd:command file="scrp-ini.mkvi" name="script" type="environment"> + <cd:command category="language" file="scrp-ini.mkvi" level="system" name="resetscript"/> + <cd:command category="language" file="scrp-ini.mkvi" name="script" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="hangul"/> @@ -33618,15 +33939,23 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="scrp-ini.mkvi" generated="yes" name="script" varianet="instance"> + <cd:command category="language" file="scrp-ini.mkvi" generated="yes" level="document" name="script" variant="instance"> <cd:sequence> <cd:instance value="script"/> </cd:sequence> - <cd:instances/> + <cd:instances> + <cd:constant value="hangul"/> + <cd:constant value="hanzi"/> + <cd:constant value="nihongo"/> + <cd:constant value="ethiopic"/> + <cd:constant value="thai"/> + <cd:constant value="latin"/> + <cd:constant value="test"/> + </cd:instances> </cd:command> </cd:interface> <cd:interface file="i-section.xml"> - <cd:command file="strc-sec.mkiv" name="definehead"> + <cd:command category="structure" file="strc-sec.mkiv" level="style" name="definehead"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -33639,7 +33968,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-sec.mkiv" name="setuphead"> + <cd:command category="structure" file="strc-sec.mkiv" level="style" name="setuphead"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:section"/> @@ -33751,6 +34080,7 @@ <cd:constant type="no"/> <cd:constant type="hidden"/> <cd:constant type="empty"/> + <cd:constant type="section"/> </cd:parameter> <cd:parameter name="number"> <cd:constant default="yes" type="yes"/> @@ -33844,6 +34174,11 @@ <cd:constant type="min"/> <cd:constant type="max"/> <cd:constant type="middle"/> + <cd:constant type="math"/> + <cd:constant method="range" prefix="math" type="line"/> + <cd:constant method="range" prefix="math" type="halfline"/> + <cd:constant method="range" prefix="math" type="-line"/> + <cd:constant method="range" prefix="math" type="-halfline"/> <cd:constant type="cd:name"/> </cd:parameter> <cd:parameter name="align"> @@ -33884,9 +34219,6 @@ <cd:constant type="margintext"/> <cd:constant type="cd:name"/> </cd:parameter> - <cd:parameter name="location"> - <cd:constant type="cd:name"/> - </cd:parameter> <cd:parameter name="width"> <cd:constant type="cd:dimension"/> </cd:parameter> @@ -33923,10 +34255,18 @@ <cd:parameter name="deepnumbercommand"> <cd:constant type="cd:oneargument"/> </cd:parameter> + <cd:parameter name="location"> + <cd:constant type="cd:name"/> + </cd:parameter> + <cd:parameter name="criterium"> + <cd:constant type="strict"/> + <cd:constant type="positive"/> + <cd:constant type="all"/> + </cd:parameter> </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-sec.mkiv" name="setupheads"> + <cd:command category="structure" file="strc-sec.mkiv" level="style" name="setupheads"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:section"/> @@ -33936,7 +34276,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-sec.mkiv" generated="yes" name="section" variant="instance"> + <cd:command category="structure" file="strc-sec.mkiv" generated="yes" level="document" name="section" variant="instance"> <cd:sequence> <cd:instance value="section"/> </cd:sequence> @@ -33949,6 +34289,7 @@ </cd:keywords> </cd:arguments> <cd:instances> + <cd:constant value="part"/> <cd:constant value="chapter"/> <cd:constant value="section"/> <cd:constant value="subsection"/> @@ -33963,7 +34304,7 @@ <cd:constant value="subsubsubsubsubject"/> </cd:instances> </cd:command> - <cd:command file="strc-sec.mkiv" generated="yes" name="section" variant="instance:ownnumber"> + <cd:command category="structure" file="strc-sec.mkiv" generated="yes" level="document" name="section" variant="instance:ownnumber"> <cd:sequence> <cd:instance value="section"/> </cd:sequence> @@ -33979,6 +34320,7 @@ </cd:keywords> </cd:arguments> <cd:instances> + <cd:constant value="part"/> <cd:constant value="chapter"/> <cd:constant value="section"/> <cd:constant value="subsection"/> @@ -33993,7 +34335,7 @@ <cd:constant value="subsubsubsubsubject"/> </cd:instances> </cd:command> - <cd:command file="strc-sec.mkiv" generated="yes" name="section" variant="instance:assignment"> + <cd:command category="structure" file="strc-sec.mkiv" generated="yes" level="document" name="section" variant="instance:assignment"> <cd:sequence> <cd:instance value="section"/> </cd:sequence> @@ -34020,6 +34362,7 @@ </cd:assignments> </cd:arguments> <cd:instances> + <cd:constant value="part"/> <cd:constant value="chapter"/> <cd:constant value="section"/> <cd:constant value="subsection"/> @@ -34034,7 +34377,7 @@ <cd:constant value="subsubsubsubsubject"/> </cd:instances> </cd:command> - <cd:command file="strc-sec.mkiv" generated="yes" name="section" type="environment" variant="instance"> + <cd:command category="structure" file="strc-sec.mkiv" generated="yes" level="document" name="section" type="environment" variant="instance"> <cd:sequence> <cd:instance value="section"/> </cd:sequence> @@ -34066,6 +34409,7 @@ </cd:assignments> </cd:arguments> <cd:instances> + <cd:constant value="part"/> <cd:constant value="chapter"/> <cd:constant value="section"/> <cd:constant value="subsection"/> @@ -34080,7 +34424,7 @@ <cd:constant value="subsubsubsubsubject"/> </cd:instances> </cd:command> - <cd:command file="strc-sec.mkiv" name="namedsection" type="environment"> + <cd:command category="structure" file="strc-sec.mkiv" level="document" name="namedsection" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:section"/> @@ -34112,28 +34456,28 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-sec.mkiv" name="definesection"> + <cd:command category="structure" file="strc-sec.mkiv" level="system" name="definesection"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-sec.mkiv" name="placeheadtext"> + <cd:command category="structure" file="strc-sec.mkiv" level="system" name="placeheadtext"> <cd:arguments> <cd:keywords> <cd:constant type="cd:section"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-sec.mkiv" name="placeheadnumber"> + <cd:command category="structure" file="strc-sec.mkiv" level="system" name="placeheadnumber"> <cd:arguments> <cd:keywords> <cd:constant type="cd:section"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-sec.mkiv" name="setupheadnumber"> + <cd:command category="structure" file="strc-sec.mkiv" level="style" name="setupheadnumber"> <cd:arguments> <cd:keywords> <cd:constant type="cd:section"/> @@ -34143,22 +34487,22 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-sec.mkiv" name="determineheadnumber"> + <cd:command category="structure" file="strc-sec.mkiv" level="system" name="determineheadnumber"> <cd:arguments> <cd:keywords> <cd:constant type="cd:section"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-sec.mkiv" name="currentheadnumber"/> - <cd:command file="strc-sec.mkiv" name="namedheadnumber"> + <cd:command category="structure" file="strc-sec.mkiv" level="system" name="currentheadnumber"/> + <cd:command category="structure" file="strc-sec.mkiv" level="system" name="namedheadnumber"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:section"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-sec.mkiv" name="somenamedheadnumber"> + <cd:command category="structure" file="strc-sec.mkiv" level="system" name="somenamedheadnumber"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:section"/> @@ -34172,7 +34516,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-sec.mkiv" name="headnumber"> + <cd:command category="structure" file="strc-sec.mkiv" level="system" name="headnumber"> <cd:arguments> <cd:keywords> <cd:constant type="cd:section"/> @@ -34186,7 +34530,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-sec.mkiv" name="someheadnumber"> + <cd:command category="structure" file="strc-sec.mkiv" level="system" name="someheadnumber"> <cd:arguments> <cd:keywords> <cd:constant type="cd:section"/> @@ -34200,30 +34544,30 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-sec.mkiv" name="namedstructureheadlocation"> + <cd:command category="structure" file="strc-sec.mkiv" level="system" name="namedstructureheadlocation"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:section"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-sec.mkiv" name="structurenumber"/> - <cd:command file="strc-sec.mkiv" name="structuretitle"/> - <cd:command file="strc-sec.mkiv" name="structurevariable"> + <cd:command category="structure" file="strc-sec.mkiv" level="system" name="structurenumber"/> + <cd:command category="structure" file="strc-sec.mkiv" level="system" name="structuretitle"/> + <cd:command category="structure" file="strc-sec.mkiv" level="system" name="structurevariable"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:key"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-sec.mkiv" name="structureuservariable"> + <cd:command category="structure" file="strc-sec.mkiv" level="system" name="structureuservariable"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:key"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-sec.mkiv" name="namedstructurevariable"> + <cd:command category="structure" file="strc-sec.mkiv" level="system" name="namedstructurevariable"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:section"/> @@ -34233,7 +34577,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-sec.mkiv" name="namedstructureuservariable"> + <cd:command category="structure" file="strc-sec.mkiv" level="system" name="namedstructureuservariable"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:section"/> @@ -34243,7 +34587,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-lev.mkvi" name="definesectionlevels"> + <cd:command category="structure" file="strc-lev.mkvi" level="style" name="definesectionlevels"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -34253,7 +34597,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-lev.mkvi" name="sectionlevel" type="environment"> + <cd:command category="structure" file="strc-lev.mkvi" level="document" name="sectionlevel" type="environment"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -34285,7 +34629,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-lev.mkvi" name="subjectlevel" type="environment"> + <cd:command category="structure" file="strc-lev.mkvi" level="document" name="subjectlevel" type="environment"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -34317,7 +34661,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-ren.mkiv" name="defineheadalternative"> + <cd:command category="structure" file="strc-ren.mkiv" level="style" name="defineheadalternative"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -34330,7 +34674,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-ren.mkiv" name="setupheadalternative"> + <cd:command category="structure" file="strc-ren.mkiv" level="style" name="setupheadalternative"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -34347,8 +34691,8 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-ren.mkiv" name="localheadsetup" type="environment"/> - <cd:command file="strc-ren.mkiv" name="headhbox"> + <cd:command category="structure" file="strc-ren.mkiv" level="system" name="localheadsetup" type="environment"/> + <cd:command category="structure" file="strc-ren.mkiv" level="system" name="headhbox"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -34356,7 +34700,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="strc-ren.mkiv" name="headvbox"> + <cd:command category="structure" file="strc-ren.mkiv" level="system" name="headvbox"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -34364,18 +34708,18 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="strc-ren.mkiv" name="headreferenceattributes"/> - <cd:command file="strc-ren.mkiv" name="headnumbercontent"/> - <cd:command file="strc-ren.mkiv" name="headtextcontent"/> - <cd:command file="strc-ren.mkiv" name="headwidth"/> - <cd:command file="strc-ren.mkiv" name="headtextwidth"/> - <cd:command file="strc-ren.mkiv" name="headnumberwidth"/> - <cd:command file="strc-ren.mkiv" name="headnumberdistance"/> - <cd:command file="strc-ren.mkiv" name="headtextdistance"/> - <cd:command file="strc-ren.mkiv" name="headsetupspacing"/> + <cd:command category="structure" file="strc-ren.mkiv" level="system" name="headreferenceattributes"/> + <cd:command category="structure" file="strc-ren.mkiv" level="system" name="headnumbercontent"/> + <cd:command category="structure" file="strc-ren.mkiv" level="system" name="headtextcontent"/> + <cd:command category="structure" file="strc-ren.mkiv" level="system" name="headwidth"/> + <cd:command category="structure" file="strc-ren.mkiv" level="system" name="headtextwidth"/> + <cd:command category="structure" file="strc-ren.mkiv" level="system" name="headnumberwidth"/> + <cd:command category="structure" file="strc-ren.mkiv" level="system" name="headnumberdistance"/> + <cd:command category="structure" file="strc-ren.mkiv" level="system" name="headtextdistance"/> + <cd:command category="structure" file="strc-ren.mkiv" level="system" name="headsetupspacing"/> </cd:interface> <cd:interface file="i-sectionblock.xml"> - <cd:command file="strc-sbe.mkiv" name="definesectionblock"> + <cd:command category="structure" file="strc-sbe.mkiv" level="style" name="definesectionblock"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -34388,7 +34732,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-sbe.mkiv" name="setupsectionblock"> + <cd:command category="structure" file="strc-sbe.mkiv" level="style" name="setupsectionblock"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -34410,7 +34754,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-sbe.mkiv" name="setsectionblock"> + <cd:command category="structure" file="strc-sbe.mkiv" level="system" name="setsectionblock"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -34422,7 +34766,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-sbe.mkiv" name="sectionblock" type="environment"> + <cd:command category="structure" file="strc-sbe.mkiv" level="document" name="sectionblock" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -34435,7 +34779,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-sbe.mkiv" generated="yes" name="sectionblock" type="environment" variant="instance"> + <cd:command category="structure" file="strc-sbe.mkiv" generated="yes" level="document" name="sectionblock" type="environment" variant="instance"> <cd:sequence> <cd:instance value="sectionblock"/> </cd:sequence> @@ -34447,9 +34791,14 @@ <cd:inherit name="setupsectionblock"/> </cd:assignments> </cd:arguments> - <cd:instances/> + <cd:instances> + <cd:constant value="frontmatter"/> + <cd:constant value="bodymatter"/> + <cd:constant value="appendices"/> + <cd:constant value="backmatter"/> + </cd:instances> </cd:command> - <cd:command file="strc-sbe.mkiv" name="sectionblockenvironment" type="environment"> + <cd:command category="structure" file="strc-sbe.mkiv" level="style" name="sectionblockenvironment" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -34458,7 +34807,7 @@ </cd:command> </cd:interface> <cd:interface file="i-selector.xml"> - <cd:command file="core-env.mkiv" name="defineselector"> + <cd:command file="core-env.mkiv" level="style" name="defineselector"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -34468,7 +34817,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="setupselector"> + <cd:command file="core-env.mkiv" level="style" name="setupselector"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -34483,7 +34832,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="select"> + <cd:command file="core-env.mkiv" level="document" name="select"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -34495,7 +34844,7 @@ <cd:content optional="yes"/> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="directselect"> + <cd:command file="core-env.mkiv" level="system" name="directselect"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -34509,84 +34858,84 @@ </cd:command> </cd:interface> <cd:interface file="i-setups.xml"> - <cd:command file="core-env.mkiv" name="setups"> + <cd:command file="core-env.mkiv" level="style" name="setups"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="setups" variant="direct"> + <cd:command file="core-env.mkiv" level="style" name="setups" variant="direct"> <cd:arguments> <cd:keywords delimiters="braces" list="yes"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="setup"> + <cd:command file="core-env.mkiv" level="style" name="setup"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="setup" variant="direct"> + <cd:command file="core-env.mkiv" level="style" name="setup" variant="direct"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="directsetup"> + <cd:command file="core-env.mkiv" level="style" name="directsetup"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="fastsetup"> + <cd:command file="core-env.mkiv" level="style" name="fastsetup"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="texsetup"> + <cd:command file="core-env.mkiv" level="style" name="texsetup"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="luasetup"> + <cd:command category="lua" file="core-env.mkiv" level="style" name="luasetup"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="systemsetups"> + <cd:command file="core-env.mkiv" level="system" name="systemsetups"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="resetsetups"> + <cd:command file="core-env.mkiv" level="system" name="resetsetups"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="showsetupsdefinition"> + <cd:command file="core-env.mkiv" level="system" name="showsetupsdefinition"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="setupwithargument"> + <cd:command file="core-env.mkiv" level="system" name="setupwithargument"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -34594,7 +34943,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="fastsetupwithargument"> + <cd:command file="core-env.mkiv" level="system" name="fastsetupwithargument"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -34602,7 +34951,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="setupwithargumentswapped"> + <cd:command file="core-env.mkiv" level="system" name="setupwithargumentswapped"> <cd:arguments> <cd:content/> <cd:keywords delimiters="braces"> @@ -34610,7 +34959,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="fastsetupwithargumentswapped"> + <cd:command file="core-env.mkiv" level="system" name="fastsetupwithargumentswapped"> <cd:arguments> <cd:content/> <cd:keywords delimiters="braces"> @@ -34618,26 +34967,26 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="usesetupsparameter"> + <cd:command file="core-env.mkiv" level="system" name="usesetupsparameter"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="autosetups"> + <cd:command file="core-env.mkiv" level="style" name="autosetups"> <cd:arguments> <cd:keywords delimiters="braces" list="yes"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="doprocesslocalsetups"> + <cd:command file="core-env.mkiv" level="system" name="doprocesslocalsetups"> <cd:arguments> <cd:keywords delimiters="braces" list="yes"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="doifelsesetups"> + <cd:command category="conditional" file="core-env.mkiv" level="system" name="doifelsesetups"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -34650,7 +34999,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="doifsetupselse"> + <cd:command category="conditional" file="core-env.mkiv" level="system" name="doifsetupselse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -34663,7 +35012,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="doifsetups"> + <cd:command category="conditional" file="core-env.mkiv" level="system" name="doifsetups"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -34673,7 +35022,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="doifnotsetups"> + <cd:command category="conditional" file="core-env.mkiv" level="system" name="doifnotsetups"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -34683,7 +35032,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="luasetups" type="environment"> + <cd:command category="lua" file="core-env.mkiv" level="system" name="luasetups" type="environment"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="grid"/> @@ -34693,14 +35042,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="luasetups" type="environment" variant="string"> + <cd:command category="lua" file="core-env.mkiv" level="system" name="luasetups" type="environment" variant="string"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="xmlsetups" type="environment"> + <cd:command category="xml" file="core-env.mkiv" level="style" name="xmlsetups" type="environment"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="grid"/> @@ -34710,14 +35059,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="xmlsetups" type="environment" variant="string"> + <cd:command category="xml" file="core-env.mkiv" level="style" name="xmlsetups" type="environment" variant="string"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="rawsetups" type="environment"> + <cd:command file="core-env.mkiv" level="system" name="rawsetups" type="environment"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="grid"/> @@ -34727,14 +35076,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="rawsetups" type="environment" variant="string"> + <cd:command file="core-env.mkiv" level="system" name="rawsetups" type="environment" variant="string"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="localsetups" type="environment"> + <cd:command file="core-env.mkiv" level="style" name="localsetups" type="environment"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="grid"/> @@ -34744,14 +35093,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="localsetups" type="environment" variant="string"> + <cd:command file="core-env.mkiv" level="style" name="localsetups" type="environment" variant="string"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="setups" type="environment"> + <cd:command file="core-env.mkiv" level="style" name="setups" type="environment"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="grid"/> @@ -34761,7 +35110,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="setups" type="environment" variant="string"> + <cd:command file="core-env.mkiv" level="style" name="setups" type="environment" variant="string"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:name"/> @@ -34770,7 +35119,7 @@ </cd:command> </cd:interface> <cd:interface file="i-shift.xml"> - <cd:command file="node.rul.mkiv" name="defineshift"> + <cd:command category="layout" file="node.rul.mkiv" level="style" name="defineshift"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -34783,7 +35132,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="node-rul.mkiv" name="setupshift"> + <cd:command category="layout" file="node-rul.mkiv" level="style" name="setupshift"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -34826,16 +35175,19 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="node-rul.mkiv" generated="yes" name="shift" variant="instance"> + <cd:command category="layout" file="node-rul.mkiv" generated="yes" level="document" name="shift" variant="instance"> <cd:sequence> <cd:instance value="shift"/> </cd:sequence> <cd:arguments> <cd:content/> </cd:arguments> - <cd:instances/> + <cd:instances> + <cd:constant value="shiftup"/> + <cd:constant value="shiftdown"/> + </cd:instances> </cd:command> - <cd:command file="node-rul.mkiv" name="shift" type="environment"> + <cd:command category="layout" file="node-rul.mkiv" level="document" name="shift" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -34844,7 +35196,7 @@ </cd:command> </cd:interface> <cd:interface file="i-sidebar.xml"> - <cd:command file="anch-bar.mkiv" name="definesidebar"> + <cd:command category="rules" file="anch-bar.mkiv" level="style" name="definesidebar"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -34857,7 +35209,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="anch-bar.mkiv" name="setupsidebar"> + <cd:command category="rules" file="anch-bar.mkiv" level="style" name="setupsidebar"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -34890,7 +35242,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="anch-bar.mkiv" name="sidebar" type="environment"> + <cd:command category="rules" file="anch-bar.mkiv" level="document" name="sidebar" type="environment"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -34900,7 +35252,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="anch-bar.mkiv" name="setupmarginrule"> + <cd:command category="rules" file="anch-bar.mkiv" level="style" name="setupmarginrule"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:number"/> @@ -34910,7 +35262,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="anch-bar.mkiv" name="setupmarginrules"> + <cd:command category="rules" file="anch-bar.mkiv" level="style" name="setupmarginrules"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:number"/> @@ -34920,14 +35272,14 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="anch-bar.mkiv" name="marginrule" type="environment"> + <cd:command category="rules" file="anch-bar.mkiv" level="document" name="marginrule" type="environment"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="anch-bar.mkiv" name="marginrule" type="environment" variant="assignment"> + <cd:command category="rules" file="anch-bar.mkiv" level="document" name="marginrule" type="environment" variant="assignment"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupmarginrule"/> @@ -34936,7 +35288,7 @@ </cd:command> </cd:interface> <cd:interface file="i-smash.xml"> - <cd:command file="supp-box.mkiv" name="smashbox"> + <cd:command file="supp-box.mkiv" level="system" name="smashbox"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:csname"/> @@ -34944,7 +35296,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="smashboxed"> + <cd:command file="supp-box.mkiv" level="system" name="smashboxed"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:csname"/> @@ -34952,7 +35304,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="hsmashbox"> + <cd:command file="supp-box.mkiv" level="system" name="hsmashbox"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:csname"/> @@ -34960,7 +35312,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="vsmashbox"> + <cd:command file="supp-box.mkiv" level="system" name="vsmashbox"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:csname"/> @@ -34968,27 +35320,27 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="hsmash"> + <cd:command file="supp-box.mkiv" level="system" name="hsmash"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="vsmash"> + <cd:command file="supp-box.mkiv" level="system" name="vsmash"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="hsmashed"> + <cd:command file="supp-box.mkiv" level="system" name="hsmashed"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="vsmashed"> + <cd:command file="supp-box.mkiv" level="system" name="vsmashed"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="smashedhbox"> + <cd:command file="supp-box.mkiv" level="system" name="smashedhbox"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -34996,7 +35348,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="smashedvbox"> + <cd:command file="supp-box.mkiv" level="system" name="smashedvbox"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -35004,7 +35356,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="supp-box.mkiv" name="smash"> + <cd:command file="supp-box.mkiv" level="document" name="smash"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="w"/> @@ -35018,7 +35370,7 @@ </cd:command> </cd:interface> <cd:interface file="i-sort.xml"> - <cd:command file="strc-syn.mkiv" name="definesorting"> + <cd:command category="language" file="strc-syn.mkiv" level="style" name="definesorting"> <cd:arguments> <cd:keywords> <cd:constant type="cd:singular"/> @@ -35032,7 +35384,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-syn.mkiv" name="setupsorting"> + <cd:command category="language" file="strc-syn.mkiv" level="style" name="setupsorting"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:singular"/> @@ -35120,7 +35472,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-syn.mkiv" generated="yes" name="sorting" variant="instance"> + <cd:command category="language" file="strc-syn.mkiv" generated="yes" level="document" name="sorting" variant="instance"> <cd:sequence> <cd:instance value="sorting"/> </cd:sequence> @@ -35130,9 +35482,11 @@ </cd:keywords> <cd:content/> </cd:arguments> - <cd:instances/> + <cd:instances> + <cd:constant value="logo"/> + </cd:instances> </cd:command> - <cd:command file="strc-syn.mkiv" name="definesort"> + <cd:command category="language" file="strc-syn.mkiv" level="system" name="definesort"> <cd:arguments> <cd:keywords> <cd:constant type="yes"/> @@ -35147,7 +35501,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="strc-syn.mkiv" generated="yes" name="placelistofsorts" variant="instance"> + <cd:command category="language" file="strc-syn.mkiv" generated="yes" level="document" name="placelistofsorts" variant="instance"> <cd:sequence> <cd:string value="placelistof"/> <cd:instance value="sorts"/> @@ -35157,9 +35511,11 @@ <cd:inherit name="setupsorting"/> </cd:assignments> </cd:arguments> - <cd:instances/> + <cd:instances> + <cd:constant value="logos"/> + </cd:instances> </cd:command> - <cd:command file="strc-syn.mkiv" generated="yes" name="completelistofsorts" variant="instance"> + <cd:command category="language" file="strc-syn.mkiv" generated="yes" level="document" name="completelistofsorts" variant="instance"> <cd:sequence> <cd:string value="completelistof"/> <cd:instance value="sorts"/> @@ -35169,9 +35525,11 @@ <cd:inherit name="setupsorting"/> </cd:assignments> </cd:arguments> - <cd:instances/> + <cd:instances> + <cd:constant value="logos"/> + </cd:instances> </cd:command> - <cd:command file="strc-syn.mkiv" name="doifelsecurrentsortingused"> + <cd:command category="language conditional" file="strc-syn.mkiv" level="system" name="doifelsecurrentsortingused"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:true"/> @@ -35181,14 +35539,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-syn.mkiv" name="resetusedsortings"> + <cd:command category="language" file="strc-syn.mkiv" level="system" name="resetusedsortings"> <cd:arguments> <cd:keywords> <cd:constant type="cd:singular"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-syn.mkiv" name="registersort"> + <cd:command category="language" file="strc-syn.mkiv" level="system" name="registersort"> <cd:arguments> <cd:keywords> <cd:constant type="cd:singular"/> @@ -35198,7 +35556,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-syn.mkiv" name="placelistofsorts"> + <cd:command category="language" file="strc-syn.mkiv" level="document" name="placelistofsorts"> <cd:arguments> <cd:keywords> <cd:constant type="cd:singular"/> @@ -35208,7 +35566,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-syn.mkiv" name="completelistofsorts"> + <cd:command category="language" file="strc-syn.mkiv" level="document" name="completelistofsorts"> <cd:arguments> <cd:keywords> <cd:constant type="cd:singular"/> @@ -35220,7 +35578,7 @@ </cd:command> </cd:interface> <cd:interface file="i-soundtrack.xml"> - <cd:command file="scrn-wid.mkvi" name="setupexternalsoundtracks"> + <cd:command category="pdf" file="scrn-wid.mkvi" level="style" name="setupexternalsoundtracks"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="option"> @@ -35229,7 +35587,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="scrn-wid.mkvi" name="useexternalsoundtrack"> + <cd:command category="pdf" file="scrn-wid.mkvi" level="style" name="useexternalsoundtrack"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -35239,7 +35597,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="scrn-wid.mkvi" name="checksoundtrack"> + <cd:command category="pdf" file="scrn-wid.mkvi" level="style" name="checksoundtrack"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -35248,7 +35606,7 @@ </cd:command> </cd:interface> <cd:interface file="i-spellchecking.xml"> - <cd:command file="lang-wrd.mkiv" name="setupspellchecking"> + <cd:command category="language" file="lang-wrd.mkiv" level="style" name="setupspellchecking"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="state"> @@ -35266,7 +35624,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="lang-wrd.mkiv" name="loadspellchecklist"> + <cd:command category="language" file="lang-wrd.mkiv" level="style" name="loadspellchecklist"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -35278,7 +35636,7 @@ </cd:command> </cd:interface> <cd:interface file="i-startstop.xml"> - <cd:command file="core-sys.mkiv" name="definestartstop"> + <cd:command category="structure" file="core-sys.mkiv" level="style" name="definestartstop"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -35291,7 +35649,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="core-sys.mkiv" name="setupstartstop"> + <cd:command category="structure" file="core-sys.mkiv" level="style" name="setupstartstop"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -35325,12 +35683,12 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="core-sys.mkiv" generated="yes" name="startstop" type="environment" variant="example"> + <cd:command category="structure" file="core-sys.mkiv" generated="yes" level="document" name="startstop" type="environment" variant="example"> <cd:sequence> <cd:variable value="startstop"/> </cd:sequence> </cd:command> - <cd:command file="core-sys.mkiv" name="startstop" type="environment"> + <cd:command category="structure" file="core-sys.mkiv" level="document" name="startstop" type="environment"> <cd:sequence> <cd:string value=""/> </cd:sequence> @@ -35340,7 +35698,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-sys.mkiv" generated="yes" name="startstop" variant="example"> + <cd:command category="structure" file="core-sys.mkiv" generated="yes" level="document" name="startstop" variant="example"> <cd:sequence> <cd:variable value="startstop"/> </cd:sequence> @@ -35350,8 +35708,8 @@ </cd:command> </cd:interface> <cd:interface file="i-stream.xml"> - <cd:command file="page-str.mkiv" name="currentoutputstream"/> - <cd:command file="page-str.mkiv" name="ifinoutputstream"> + <cd:command file="page-str.mkiv" level="system" name="currentoutputstream"/> + <cd:command file="page-str.mkiv" level="system" name="ifinoutputstream"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:true"/> @@ -35363,64 +35721,64 @@ <cd:delimiter name="fi"/> </cd:arguments> </cd:command> - <cd:command file="page-str.mkiv" name="enableoutputstream"> + <cd:command file="page-str.mkiv" level="system" name="enableoutputstream"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-str.mkiv" name="disableoutputstream"/> - <cd:command file="page-str.mkiv" name="outputstream" type="environment"> + <cd:command file="page-str.mkiv" level="system" name="disableoutputstream"/> + <cd:command file="page-str.mkiv" level="system" name="outputstream" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-str.mkiv" name="flushoutputstream"> + <cd:command file="page-str.mkiv" level="system" name="flushoutputstream"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-str.mkiv" name="outputstreambox"> + <cd:command file="page-str.mkiv" level="system" name="outputstreambox"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-str.mkiv" name="outputstreamcopy"> + <cd:command file="page-str.mkiv" level="system" name="outputstreamcopy"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-str.mkiv" name="outputstreamunvbox"> + <cd:command file="page-str.mkiv" level="system" name="outputstreamunvbox"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-str.mkiv" name="outputstreamunvcopy"> + <cd:command file="page-str.mkiv" level="system" name="outputstreamunvcopy"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-str.mkiv" name="synchronizeoutputstreams"> + <cd:command file="page-str.mkiv" level="system" name="synchronizeoutputstreams"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-str.mkiv" name="pushoutputstream"> + <cd:command file="page-str.mkiv" level="system" name="pushoutputstream"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -35429,70 +35787,70 @@ </cd:command> </cd:interface> <cd:interface file="i-string.xml"> - <cd:command file="blob-ini.mkiv" name="wdofstring"> + <cd:command file="blob-ini.mkiv" level="system" name="wdofstring"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="blob-ini.mkiv" name="htofstring"> + <cd:command file="blob-ini.mkiv" level="system" name="htofstring"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="blob-ini.mkiv" name="dpofstring"> + <cd:command file="blob-ini.mkiv" level="system" name="dpofstring"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="blob-ini.mkiv" name="hdofstring"> + <cd:command file="blob-ini.mkiv" level="system" name="hdofstring"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="blob-ini.mkiv" name="htdpofstring"> + <cd:command file="blob-ini.mkiv" level="system" name="htdpofstring"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="blob-ini.mkiv" name="widthofstring"> + <cd:command file="blob-ini.mkiv" level="system" name="widthofstring"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="blob-ini.mkiv" name="heightofstring"> + <cd:command file="blob-ini.mkiv" level="system" name="heightofstring"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="blob-ini.mkiv" name="depthofstring"> + <cd:command file="blob-ini.mkiv" level="system" name="depthofstring"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="blob-ini.mkiv" name="heightanddepthofstring"> + <cd:command file="blob-ini.mkiv" level="system" name="heightanddepthofstring"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="blob-ini.mkiv" name="setwidthof"> + <cd:command file="blob-ini.mkiv" level="system" name="setwidthof"> <cd:arguments> <cd:text/> <cd:delimiter name="to"/> @@ -35501,11 +35859,12 @@ </cd:command> </cd:interface> <cd:interface file="i-strut.xml"> - <cd:command file="supp-box.mkiv" name="strutdp"/> - <cd:command file="supp-box.mkiv" name="strutht"/> - <cd:command file="supp-box.mkiv" name="strutwd"/> - <cd:command file="supp-box.mkiv" name="struthtdp"/> - <cd:command file="spac-ver.mkiv" name="setupstruts"> + <cd:command file="supp-box.mkiv" level="system" name="strutdp"/> + <cd:command file="supp-box.mkiv" level="system" name="strutht"/> + <cd:command file="supp-box.mkiv" level="system" name="strutwd"/> + <cd:command file="supp-box.mkiv" level="system" name="struthtdp"/> + <cd:command file="supp-box.mkiv" level="system" name="strutgap"/> + <cd:command file="spac-ver.mkiv" level="style" name="setupstruts"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="yes"/> @@ -35519,7 +35878,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="synchronizestrut"> + <cd:command file="spac-ver.mkiv" level="system" name="synchronizestrut"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="yes"/> @@ -35533,24 +35892,29 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="strut"/> - <cd:command file="spac-ver.mkiv" name="setstrut"/> - <cd:command file="spac-ver.mkiv" name="setcharstrut"> + <cd:command file="spac-ver.mkiv" level="style" name="strut"/> + <cd:command file="spac-ver.mkiv" level="system" name="halfstrut"/> + <cd:command file="spac-ver.mkiv" level="system" name="quarterstrut"/> + <cd:command file="spac-ver.mkiv" level="system" name="halflinestrut"/> + <cd:command file="spac-ver.mkiv" level="system" name="noheightstrut"/> + <cd:command file="spac-ver.mkiv" level="system" name="depthstrut"/> + <cd:command file="spac-ver.mkiv" level="system" name="setstrut"/> + <cd:command file="spac-ver.mkiv" level="system" name="setcharstrut"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="setfontstrut"/> - <cd:command file="spac-ver.mkiv" name="setcapstrut"/> - <cd:command file="spac-ver.mkiv" name="setnostrut"/> - <cd:command file="spac-ver.mkiv" name="showstruts"/> - <cd:command file="spac-ver.mkiv" name="showcolorstruts"/> - <cd:command begin="beg" end="end" file="spac-ver.mkiv" name="strut" type="environment"/> + <cd:command file="spac-ver.mkiv" level="system" name="setfontstrut"/> + <cd:command file="spac-ver.mkiv" level="system" name="setcapstrut"/> + <cd:command file="spac-ver.mkiv" level="system" name="setnostrut"/> + <cd:command file="spac-ver.mkiv" level="document" name="showstruts"/> + <cd:command file="spac-ver.mkiv" level="document" name="showcolorstruts"/> + <cd:command begin="beg" end="end" file="spac-ver.mkiv" level="system" name="strut" type="environment"/> </cd:interface> <cd:interface file="i-symbol.xml"> - <cd:command file="symb-ini.mkiv" name="definesymbol"> + <cd:command category="symbols" file="symb-ini.mkiv" level="style" name="definesymbol"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -35563,7 +35927,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="symb-ini.mkiv" name="doifelseinsymbolset"> + <cd:command category="symbols conditional" file="symb-ini.mkiv" level="system" name="doifelseinsymbolset"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -35579,7 +35943,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="symb-ini.mkiv" name="doifinsymbolsetelse"> + <cd:command category="symbols conditional" file="symb-ini.mkiv" level="system" name="doifinsymbolsetelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -35595,7 +35959,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="symb-ini.mkiv" name="doifinsymbolset"> + <cd:command category="symbols conditional" file="symb-ini.mkiv" level="system" name="doifinsymbolset"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -35611,7 +35975,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="symb-ini.mkiv" name="doifelsesymbolset"> + <cd:command category="symbols conditional" file="symb-ini.mkiv" level="system" name="doifelsesymbolset"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -35624,7 +35988,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="symb-ini.mkiv" name="doifsymbolsetelse"> + <cd:command category="symbols conditional" file="symb-ini.mkiv" level="system" name="doifsymbolsetelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -35637,7 +36001,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="symb-ini.mkiv" name="symbol"> + <cd:command category="symbols" file="symb-ini.mkiv" level="document" name="symbol"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -35647,14 +36011,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="symb-ini.mkiv" name="symbol" variant="direct"> + <cd:command category="symbols" file="symb-ini.mkiv" level="document" name="symbol" variant="direct"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="symb-ini.mkiv" name="directsymbol"> + <cd:command category="symbols" file="symb-ini.mkiv" level="system" name="directsymbol"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -35664,7 +36028,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="symb-ini.mkiv" name="definefiguresymbol"> + <cd:command category="symbols graphics" file="symb-ini.mkiv" level="style" name="definefiguresymbol"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -35678,7 +36042,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="symb-ini.mkiv" name="figuresymbol"> + <cd:command category="symbols graphics" file="symb-ini.mkiv" level="document" name="figuresymbol"> <cd:arguments> <cd:keywords> <cd:constant type="cd:file"/> @@ -35689,7 +36053,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="symb-ini.mkiv" name="doifelsesymboldefined"> + <cd:command category="symbols conditional" file="symb-ini.mkiv" level="system" name="doifelsesymboldefined"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -35702,7 +36066,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="symb-ini.mkiv" name="doifsymboldefinedelse"> + <cd:command category="symbols conditional" file="symb-ini.mkiv" level="system" name="doifsymboldefinedelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -35715,29 +36079,29 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="symb-ini.mkiv" name="symbolset" type="environment"> + <cd:command category="symbols" file="symb-ini.mkiv" level="style" name="symbolset" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="symb-ini.mkiv" name="setupsymbolset"> + <cd:command category="symbols" file="symb-ini.mkiv" level="style" name="setupsymbolset"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="symb-ini.mkiv" name="resetsymbolset"/> - <cd:command file="symb-ini.mkiv" name="usesymbols"> + <cd:command category="symbols" file="symb-ini.mkiv" level="system" name="resetsymbolset"/> + <cd:command category="symbols" file="symb-ini.mkiv" level="style" name="usesymbols"> <cd:arguments> <cd:keywords> <cd:constant type="cd:file"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="symb-run.mkiv" name="showsymbolset"> + <cd:command category="symbols" file="symb-run.mkiv" level="document" name="showsymbolset"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -35745,8 +36109,46 @@ </cd:arguments> </cd:command> </cd:interface> + <cd:interface file="i-synctex.xml"> + <cd:command category="pdf" file="cont-run.mkiv" level="system" name="synctexsetfilename"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:file"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command category="pdf" file="cont-run.mkiv" level="system" name="synctexresetfilename"/> + <cd:command category="pdf" file="cont-run.mkiv" level="system" name="synctexblockfilename"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:file"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command category="pdf" file="cont-run.mkiv" level="style" name="setupsynctex"> + <cd:arguments> + <cd:assignments list="yes"> + <cd:parameter name="state"> + <cd:constant type="start"/> + <cd:constant default="yes" type="stop"/> + </cd:parameter> + <cd:parameter name="method"> + <cd:constant type="min"/> + <cd:constant default="yes" type="max"/> + </cd:parameter> + </cd:assignments> + </cd:arguments> + </cd:command> + <cd:command category="pdf" file="cont-run.mkiv" level="style" name="blocksynctexfile"> + <cd:arguments> + <cd:keywords list="yes"> + <cd:constant type="cd:file"/> + </cd:keywords> + </cd:arguments> + </cd:command> + </cd:interface> <cd:interface file="i-synonym.xml"> - <cd:command file="strc-syn.mkiv" name="definesynonyms"> + <cd:command category="symbols" file="strc-syn.mkiv" level="style" name="definesynonyms"> <cd:arguments> <cd:keywords> <cd:constant type="cd:singular"/> @@ -35762,7 +36164,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-syn.mkiv" name="setupsynonyms"> + <cd:command category="symbols" file="strc-syn.mkiv" level="style" name="setupsynonyms"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:singular"/> @@ -35850,7 +36252,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-syn.mkiv" generated="yes" name="synonym" variant="instance"> + <cd:command category="symbols" file="strc-syn.mkiv" generated="yes" level="document" name="synonym" variant="instance"> <cd:sequence> <cd:instance value="synonym"/> </cd:sequence> @@ -35863,9 +36265,11 @@ </cd:keywords> <cd:content/> </cd:arguments> - <cd:instances/> + <cd:instances> + <cd:constant value="abbreviation"/> + </cd:instances> </cd:command> - <cd:command file="strc-syn.mkiv" name="definesynonym"> + <cd:command category="symbols" file="strc-syn.mkiv" level="style" name="definesynonym"> <cd:arguments> <cd:keywords> <cd:constant type="yes"/> @@ -35883,7 +36287,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="strc-syn.mkiv" generated="yes" name="placelistofsynonyms" variant="instance"> + <cd:command category="symbols" file="strc-syn.mkiv" generated="yes" level="document" name="placelistofsynonyms" variant="instance"> <cd:sequence> <cd:string value="placelistof"/> <cd:instance value="synonyms"/> @@ -35893,9 +36297,11 @@ <cd:inherit name="setupsynonyms"/> </cd:assignments> </cd:arguments> - <cd:instances/> + <cd:instances> + <cd:constant value="abbreviations"/> + </cd:instances> </cd:command> - <cd:command file="strc-syn.mkiv" generated="yes" name="completelistofsynonyms" variant="instance"> + <cd:command category="symbols" file="strc-syn.mkiv" generated="yes" level="document" name="completelistofsynonyms" variant="instance"> <cd:sequence> <cd:string value="completelistof"/> <cd:instance value="synonyms"/> @@ -35905,9 +36311,11 @@ <cd:inherit name="setupsynonyms"/> </cd:assignments> </cd:arguments> - <cd:instances/> + <cd:instances> + <cd:constant value="abbreviations"/> + </cd:instances> </cd:command> - <cd:command file="strc-syn.mkiv" name="registersynonym"> + <cd:command category="symbols" file="strc-syn.mkiv" level="system" name="registersynonym"> <cd:arguments> <cd:keywords> <cd:constant type="cd:singular"/> @@ -35917,7 +36325,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-syn.mkiv" name="doifelsecurrentsynonymused"> + <cd:command category="symbols conditional" file="strc-syn.mkiv" level="system" name="doifelsecurrentsynonymused"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:true"/> @@ -35927,7 +36335,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-syn.mkiv" name="doifelsecurrentsynonymshown"> + <cd:command category="symbols conditional" file="strc-syn.mkiv" level="system" name="doifelsecurrentsynonymshown"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:true"/> @@ -35937,21 +36345,21 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-syn.mkiv" name="resetusedsynonyms"> + <cd:command category="symbols" file="strc-syn.mkiv" level="system" name="resetusedsynonyms"> <cd:arguments> <cd:keywords> <cd:constant type="cd:singular"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-syn.mkiv" name="resetshownsynonyms"> + <cd:command category="symbols" file="strc-syn.mkiv" level="system" name="resetshownsynonyms"> <cd:arguments> <cd:keywords> <cd:constant type="cd:singular"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-syn.mkiv" name="placelistofsynonyms"> + <cd:command category="symbols" file="strc-syn.mkiv" level="document" name="placelistofsynonyms"> <cd:arguments> <cd:keywords> <cd:constant type="cd:singular"/> @@ -35961,7 +36369,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-syn.mkiv" name="completelistofsynonyms"> + <cd:command category="symbols" file="strc-syn.mkiv" level="document" name="completelistofsynonyms"> <cd:arguments> <cd:keywords> <cd:constant type="cd:singular"/> @@ -35971,7 +36379,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-syn.mkiv" name="infull"> + <cd:command category="symbols" file="strc-syn.mkiv" level="document" name="infull"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -35980,31 +36388,31 @@ </cd:command> </cd:interface> <cd:interface file="i-system.xml"> - <cd:command file="syst-aux.mkiv" name="expanded"> + <cd:command file="syst-aux.mkiv" level="system" name="expanded"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="expanded" type="environment"/> - <cd:command file="syst-aux.mkiv" name="gobbleoneargument"> + <cd:command file="syst-aux.mkiv" level="system" name="expanded" type="environment"/> + <cd:command file="syst-aux.mkiv" level="system" name="gobbleoneargument"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="gobbletwoarguments"> + <cd:command file="syst-aux.mkiv" level="system" name="gobbletwoarguments"> <cd:arguments> <cd:content/> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="gobblethreearguments"> + <cd:command file="syst-aux.mkiv" level="system" name="gobblethreearguments"> <cd:arguments> <cd:content/> <cd:content/> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="gobblefourarguments"> + <cd:command file="syst-aux.mkiv" level="system" name="gobblefourarguments"> <cd:arguments> <cd:content/> <cd:content/> @@ -36012,7 +36420,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="gobblefivearguments"> + <cd:command file="syst-aux.mkiv" level="system" name="gobblefivearguments"> <cd:arguments> <cd:content/> <cd:content/> @@ -36021,7 +36429,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="gobblesixarguments"> + <cd:command file="syst-aux.mkiv" level="system" name="gobblesixarguments"> <cd:arguments> <cd:content/> <cd:content/> @@ -36031,7 +36439,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="gobblesevenarguments"> + <cd:command file="syst-aux.mkiv" level="system" name="gobblesevenarguments"> <cd:arguments> <cd:content/> <cd:content/> @@ -36042,7 +36450,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="gobbleeightarguments"> + <cd:command file="syst-aux.mkiv" level="system" name="gobbleeightarguments"> <cd:arguments> <cd:content/> <cd:content/> @@ -36054,7 +36462,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="gobbleninearguments"> + <cd:command file="syst-aux.mkiv" level="system" name="gobbleninearguments"> <cd:arguments> <cd:content/> <cd:content/> @@ -36067,7 +36475,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="gobbletenarguments"> + <cd:command file="syst-aux.mkiv" level="system" name="gobbletenarguments"> <cd:arguments> <cd:content/> <cd:content/> @@ -36081,14 +36489,14 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="gobbleoneoptional"> + <cd:command file="syst-aux.mkiv" level="system" name="gobbleoneoptional"> <cd:arguments> <cd:keywords> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="gobbletwooptionals"> + <cd:command file="syst-aux.mkiv" level="system" name="gobbletwooptionals"> <cd:arguments> <cd:keywords> <cd:constant type="cd:text"/> @@ -36098,7 +36506,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="gobblethreeoptionals"> + <cd:command file="syst-aux.mkiv" level="system" name="gobblethreeoptionals"> <cd:arguments> <cd:keywords> <cd:constant type="cd:text"/> @@ -36111,7 +36519,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="gobblefouroptionals"> + <cd:command file="syst-aux.mkiv" level="system" name="gobblefouroptionals"> <cd:arguments> <cd:keywords> <cd:constant type="cd:text"/> @@ -36127,7 +36535,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="gobblefiveoptionals"> + <cd:command file="syst-aux.mkiv" level="system" name="gobblefiveoptionals"> <cd:arguments> <cd:keywords> <cd:constant type="cd:text"/> @@ -36146,8 +36554,8 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="donothing"/> - <cd:command file="syst-aux.mkiv" name="doifelsenextchar"> + <cd:command file="syst-aux.mkiv" level="system" name="donothing"/> + <cd:command file="syst-aux.mkiv" level="system" name="doifelsenextchar"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:character"/> @@ -36160,7 +36568,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifnextcharelse"> + <cd:command file="syst-aux.mkiv" level="system" name="doifnextcharelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:character"/> @@ -36173,7 +36581,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifelsenextoptional"> + <cd:command file="syst-aux.mkiv" level="system" name="doifelsenextoptional"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:true"/> @@ -36183,7 +36591,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifnextoptionalelse"> + <cd:command file="syst-aux.mkiv" level="system" name="doifnextoptionalelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:true"/> @@ -36193,19 +36601,19 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifelsenextoptionalcs"> + <cd:command file="syst-aux.mkiv" level="system" name="doifelsenextoptionalcs"> <cd:arguments> <cd:csname/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifnextoptionalcselse"> + <cd:command file="syst-aux.mkiv" level="system" name="doifnextoptionalcselse"> <cd:arguments> <cd:csname/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifelsenextbgroup"> + <cd:command file="syst-aux.mkiv" level="system" name="doifelsenextbgroup"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:true"/> @@ -36215,7 +36623,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifnextbgroupelse"> + <cd:command file="syst-aux.mkiv" level="system" name="doifnextbgroupelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:true"/> @@ -36225,19 +36633,19 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifelsenextbgroupcs"> + <cd:command file="syst-aux.mkiv" level="system" name="doifelsenextbgroupcs"> <cd:arguments> <cd:csname/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifnextbgroupcselse"> + <cd:command file="syst-aux.mkiv" level="system" name="doifnextbgroupcselse"> <cd:arguments> <cd:csname/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifelsenextparenthesis"> + <cd:command file="syst-aux.mkiv" level="system" name="doifelsenextparenthesis"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:true"/> @@ -36247,7 +36655,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifnextparenthesiselse"> + <cd:command file="syst-aux.mkiv" level="system" name="doifnextparenthesiselse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:true"/> @@ -36257,7 +36665,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifelsefastoptionalcheck"> + <cd:command file="syst-aux.mkiv" level="system" name="doifelsefastoptionalcheck"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:true"/> @@ -36267,7 +36675,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doiffastoptionalcheckelse"> + <cd:command file="syst-aux.mkiv" level="system" name="doiffastoptionalcheckelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:true"/> @@ -36277,25 +36685,25 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifelsefastoptionalcheckcs"> + <cd:command file="syst-aux.mkiv" level="system" name="doifelsefastoptionalcheckcs"> <cd:arguments> <cd:csname/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doiffastoptionalcheckcselse"> + <cd:command file="syst-aux.mkiv" level="system" name="doiffastoptionalcheckcselse"> <cd:arguments> <cd:csname/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="assumelongusagecs"> + <cd:command file="syst-aux.mkiv" level="system" name="assumelongusagecs"> <cd:arguments> <cd:csname/> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="setvalue"> + <cd:command file="syst-aux.mkiv" level="system" name="setvalue"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -36303,7 +36711,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="setgvalue"> + <cd:command file="syst-aux.mkiv" level="system" name="setgvalue"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -36311,7 +36719,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="setevalue"> + <cd:command file="syst-aux.mkiv" level="system" name="setevalue"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -36319,7 +36727,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="setxvalue"> + <cd:command file="syst-aux.mkiv" level="system" name="setxvalue"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -36327,14 +36735,14 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="getvalue"> + <cd:command file="syst-aux.mkiv" level="system" name="getvalue"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="letvalue"> + <cd:command file="syst-aux.mkiv" level="system" name="letvalue"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -36342,7 +36750,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="letgvalue"> + <cd:command file="syst-aux.mkiv" level="system" name="letgvalue"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -36350,28 +36758,28 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="resetvalue"> + <cd:command file="syst-aux.mkiv" level="system" name="resetvalue"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="undefinevalue"> + <cd:command file="syst-aux.mkiv" level="system" name="undefinevalue"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="ignorevalue"> + <cd:command file="syst-aux.mkiv" level="system" name="ignorevalue"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="setuvalue"> + <cd:command file="syst-aux.mkiv" level="system" name="setuvalue"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -36379,7 +36787,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="setuevalue"> + <cd:command file="syst-aux.mkiv" level="system" name="setuevalue"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -36387,7 +36795,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="setugvalue"> + <cd:command file="syst-aux.mkiv" level="system" name="setugvalue"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -36395,7 +36803,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="setuxvalue"> + <cd:command file="syst-aux.mkiv" level="system" name="setuxvalue"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -36403,14 +36811,14 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="getuvalue"> + <cd:command file="syst-aux.mkiv" level="system" name="getuvalue"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifelseundefined"> + <cd:command file="syst-aux.mkiv" level="system" name="doifelseundefined"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -36423,7 +36831,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifundefinedelse"> + <cd:command file="syst-aux.mkiv" level="system" name="doifundefinedelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -36436,7 +36844,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifelsedefined"> + <cd:command file="syst-aux.mkiv" level="system" name="doifelsedefined"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -36449,7 +36857,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifdefinedelse"> + <cd:command file="syst-aux.mkiv" level="system" name="doifdefinedelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -36462,7 +36870,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifundefined"> + <cd:command file="syst-aux.mkiv" level="system" name="doifundefined"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -36472,7 +36880,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifdefined"> + <cd:command file="syst-aux.mkiv" level="system" name="doifdefined"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -36482,28 +36890,28 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="letbeundefined"> + <cd:command file="syst-aux.mkiv" level="system" name="letbeundefined"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="localundefine"> + <cd:command file="syst-aux.mkiv" level="system" name="localundefine"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="globalundefine"> + <cd:command file="syst-aux.mkiv" level="system" name="globalundefine"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifelsealldefined"> + <cd:command file="syst-aux.mkiv" level="system" name="doifelsealldefined"> <cd:arguments> <cd:keywords delimiters="braces" list="yes"> <cd:constant type="cd:name"/> @@ -36516,7 +36924,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifalldefinedelse"> + <cd:command file="syst-aux.mkiv" level="system" name="doifalldefinedelse"> <cd:arguments> <cd:keywords delimiters="braces" list="yes"> <cd:constant type="cd:name"/> @@ -36529,7 +36937,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doif"> + <cd:command file="syst-aux.mkiv" level="system" name="doif"> <cd:arguments> <cd:content/> <cd:content/> @@ -36538,7 +36946,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifnot"> + <cd:command file="syst-aux.mkiv" level="system" name="doifnot"> <cd:arguments> <cd:content/> <cd:content/> @@ -36547,7 +36955,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifelse"> + <cd:command file="syst-aux.mkiv" level="system" name="doifelse"> <cd:arguments> <cd:content/> <cd:content/> @@ -36559,7 +36967,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifelseempty"> + <cd:command file="syst-aux.mkiv" level="system" name="doifelseempty"> <cd:arguments> <cd:content/> <cd:keywords delimiters="braces"> @@ -36570,7 +36978,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifemptyelse"> + <cd:command file="syst-aux.mkiv" level="system" name="doifemptyelse"> <cd:arguments> <cd:content/> <cd:keywords delimiters="braces"> @@ -36581,7 +36989,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifempty"> + <cd:command file="syst-aux.mkiv" level="system" name="doifempty"> <cd:arguments> <cd:content/> <cd:keywords delimiters="braces"> @@ -36589,7 +36997,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifnotempty"> + <cd:command file="syst-aux.mkiv" level="system" name="doifnotempty"> <cd:arguments> <cd:content/> <cd:keywords delimiters="braces"> @@ -36597,11 +37005,13 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifelseinset"> + <cd:command file="syst-aux.mkiv" level="system" name="doifelseinset"> <cd:arguments> - <cd:content/> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:text"/> + </cd:keywords> <cd:keywords delimiters="braces" list="yes"> - <cd:content/> + <cd:constant type="cd:text"/> </cd:keywords> <cd:keywords delimiters="braces"> <cd:constant type="cd:true"/> @@ -36611,11 +37021,13 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifinsetelse"> + <cd:command file="syst-aux.mkiv" level="system" name="doifinsetelse"> <cd:arguments> - <cd:content/> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:text"/> + </cd:keywords> <cd:keywords delimiters="braces" list="yes"> - <cd:content/> + <cd:constant type="cd:text"/> </cd:keywords> <cd:keywords delimiters="braces"> <cd:constant type="cd:true"/> @@ -36625,35 +37037,39 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifinset"> + <cd:command file="syst-aux.mkiv" level="system" name="doifinset"> <cd:arguments> - <cd:content/> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:text"/> + </cd:keywords> <cd:keywords delimiters="braces" list="yes"> - <cd:content/> + <cd:constant type="cd:text"/> </cd:keywords> <cd:keywords delimiters="braces"> <cd:constant type="cd:true"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifnotinset"> + <cd:command file="syst-aux.mkiv" level="system" name="doifnotinset"> <cd:arguments> - <cd:content/> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:text"/> + </cd:keywords> <cd:keywords delimiters="braces" list="yes"> - <cd:content/> + <cd:constant type="cd:text"/> </cd:keywords> <cd:keywords delimiters="braces"> <cd:constant type="cd:true"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifelsecommon"> + <cd:command file="syst-aux.mkiv" level="system" name="doifelsecommon"> <cd:arguments> <cd:keywords delimiters="braces" list="yes"> - <cd:content/> + <cd:constant type="cd:text"/> </cd:keywords> <cd:keywords delimiters="braces" list="yes"> - <cd:content/> + <cd:constant type="cd:text"/> </cd:keywords> <cd:keywords delimiters="braces"> <cd:constant type="cd:true"/> @@ -36663,13 +37079,13 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifcommonelse"> + <cd:command file="syst-aux.mkiv" level="system" name="doifcommonelse"> <cd:arguments> <cd:keywords delimiters="braces" list="yes"> - <cd:content/> + <cd:constant type="cd:text"/> </cd:keywords> <cd:keywords delimiters="braces" list="yes"> - <cd:content/> + <cd:constant type="cd:text"/> </cd:keywords> <cd:keywords delimiters="braces"> <cd:constant type="cd:true"/> @@ -36679,33 +37095,33 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifcommon"> + <cd:command file="syst-aux.mkiv" level="system" name="doifcommon"> <cd:arguments> <cd:keywords delimiters="braces" list="yes"> - <cd:content/> + <cd:constant type="cd:text"/> </cd:keywords> <cd:keywords delimiters="braces" list="yes"> - <cd:content/> + <cd:constant type="cd:text"/> </cd:keywords> <cd:keywords delimiters="braces"> <cd:constant type="cd:true"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifnotcommon"> + <cd:command file="syst-aux.mkiv" level="system" name="doifnotcommon"> <cd:arguments> <cd:keywords delimiters="braces" list="yes"> - <cd:content/> + <cd:constant type="cd:text"/> </cd:keywords> <cd:keywords delimiters="braces" list="yes"> - <cd:content/> + <cd:constant type="cd:text"/> </cd:keywords> <cd:keywords delimiters="braces"> <cd:constant type="cd:true"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="processcommalist"> + <cd:command file="syst-aux.mkiv" level="system" name="processcommalist"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:command"/> @@ -36713,9 +37129,9 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="quitcommalist"/> - <cd:command file="syst-aux.mkiv" name="quitprevcommalist"/> - <cd:command file="syst-aux.mkiv" name="processcommacommand"> + <cd:command file="syst-aux.mkiv" level="system" name="quitcommalist"/> + <cd:command file="syst-aux.mkiv" level="system" name="quitprevcommalist"/> + <cd:command file="syst-aux.mkiv" level="system" name="processcommacommand"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:command"/> @@ -36723,7 +37139,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="processcommalistwithparameters"> + <cd:command file="syst-aux.mkiv" level="system" name="processcommalistwithparameters"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:command"/> @@ -36731,22 +37147,22 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="processcommalist" type="environment"> + <cd:command file="syst-aux.mkiv" level="system" name="processcommalist" type="environment"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:command"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="processcommacommand" type="environment"> + <cd:command file="syst-aux.mkiv" level="system" name="processcommacommand" type="environment"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:command"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="currentcommalistitem"/> - <cd:command file="syst-aux.mkiv" name="processaction"> + <cd:command file="syst-aux.mkiv" level="system" name="currentcommalistitem"/> + <cd:command file="syst-aux.mkiv" level="system" name="processaction"> <cd:arguments> <cd:keywords> <cd:constant type="cd:command"/> @@ -36754,7 +37170,7 @@ <cd:apply list="yes"/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="processfirstactioninset"> + <cd:command file="syst-aux.mkiv" level="system" name="processfirstactioninset"> <cd:arguments> <cd:keywords> <cd:constant type="cd:command"/> @@ -36762,7 +37178,7 @@ <cd:apply list="yes"/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="processallactionsinset"> + <cd:command file="syst-aux.mkiv" level="system" name="processallactionsinset"> <cd:arguments> <cd:keywords> <cd:constant type="cd:command"/> @@ -36770,17 +37186,17 @@ <cd:apply list="yes"/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="commalistelement"/> - <cd:command file="syst-aux.mkiv" name="firstcharacter"/> - <cd:command file="syst-aux.mkiv" name="remainingcharacters"/> - <cd:command file="syst-aux.mkiv" name="getfirstcharacter"> + <cd:command file="syst-aux.mkiv" level="system" name="commalistelement"/> + <cd:command file="syst-aux.mkiv" level="system" name="firstcharacter"/> + <cd:command file="syst-aux.mkiv" level="system" name="remainingcharacters"/> + <cd:command file="syst-aux.mkiv" level="system" name="getfirstcharacter"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifelsefirstchar"> + <cd:command file="syst-aux.mkiv" level="system" name="doifelsefirstchar"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -36796,7 +37212,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doiffirstcharelse"> + <cd:command file="syst-aux.mkiv" level="system" name="doiffirstcharelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -36812,21 +37228,21 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="thefirstcharacter"> + <cd:command file="syst-aux.mkiv" level="system" name="thefirstcharacter"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="theremainingcharacters"> + <cd:command file="syst-aux.mkiv" level="system" name="theremainingcharacters"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifelseinstring"> + <cd:command file="syst-aux.mkiv" level="system" name="doifelseinstring"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -36842,7 +37258,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifinstringelse"> + <cd:command file="syst-aux.mkiv" level="system" name="doifinstringelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -36858,7 +37274,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifinstring"> + <cd:command file="syst-aux.mkiv" level="system" name="doifinstring"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -36871,7 +37287,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifnotinstring"> + <cd:command file="syst-aux.mkiv" level="system" name="doifnotinstring"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -36884,7 +37300,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifelseincsname"> + <cd:command file="syst-aux.mkiv" level="system" name="doifelseincsname"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -36900,7 +37316,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifincsnameelse"> + <cd:command file="syst-aux.mkiv" level="system" name="doifincsnameelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -36916,7 +37332,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifelsenumber"> + <cd:command file="syst-aux.mkiv" level="system" name="doifelsenumber"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -36929,7 +37345,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifnumberelse"> + <cd:command file="syst-aux.mkiv" level="system" name="doifnumberelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -36942,7 +37358,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifnumber"> + <cd:command file="syst-aux.mkiv" level="system" name="doifnumber"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -36952,7 +37368,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifnotnumber"> + <cd:command file="syst-aux.mkiv" level="system" name="doifnotnumber"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -36962,7 +37378,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="percentdimen"> + <cd:command file="syst-aux.mkiv" level="system" name="percentdimen"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:dimension"/> @@ -36974,7 +37390,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="setpercentdimen"> + <cd:command file="syst-aux.mkiv" level="system" name="setpercentdimen"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:dimension"/> @@ -36986,7 +37402,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="makerawcommalist"> + <cd:command file="syst-aux.mkiv" level="system" name="makerawcommalist"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:command"/> @@ -36994,7 +37410,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="rawprocesscommalist"> + <cd:command file="syst-aux.mkiv" level="system" name="rawprocesscommalist"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:command"/> @@ -37002,7 +37418,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="rawprocesscommacommand"> + <cd:command file="syst-aux.mkiv" level="system" name="rawprocesscommacommand"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:command"/> @@ -37010,11 +37426,13 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="rawdoifelseinset"> + <cd:command file="syst-aux.mkiv" level="system" name="rawdoifelseinset"> <cd:arguments> - <cd:content/> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:text"/> + </cd:keywords> <cd:keywords delimiters="braces" list="yes"> - <cd:content/> + <cd:constant type="cd:text"/> </cd:keywords> <cd:keywords delimiters="braces"> <cd:constant type="cd:true"/> @@ -37024,11 +37442,13 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="rawdoifinsetelse"> + <cd:command file="syst-aux.mkiv" level="system" name="rawdoifinsetelse"> <cd:arguments> - <cd:content/> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:text"/> + </cd:keywords> <cd:keywords delimiters="braces" list="yes"> - <cd:content/> + <cd:constant type="cd:text"/> </cd:keywords> <cd:keywords delimiters="braces"> <cd:constant type="cd:true"/> @@ -37038,18 +37458,20 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="rawdoifinset"> + <cd:command file="syst-aux.mkiv" level="system" name="rawdoifinset"> <cd:arguments> - <cd:content/> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:text"/> + </cd:keywords> <cd:keywords delimiters="braces" list="yes"> - <cd:content/> + <cd:constant type="cd:text"/> </cd:keywords> <cd:keywords delimiters="braces"> <cd:constant type="cd:true"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="rawprocessaction"> + <cd:command file="syst-aux.mkiv" level="system" name="rawprocessaction"> <cd:arguments> <cd:keywords> <cd:constant type="cd:command"/> @@ -37057,8 +37479,8 @@ <cd:apply list="yes"/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="currentvalue"/> - <cd:command file="syst-aux.mkiv" name="getparameters"> + <cd:command file="syst-aux.mkiv" level="system" name="currentvalue"/> + <cd:command file="syst-aux.mkiv" level="system" name="getparameters"> <cd:arguments> <cd:keywords> <cd:constant type="cd:text"/> @@ -37070,7 +37492,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="geteparameters"> + <cd:command file="syst-aux.mkiv" level="system" name="geteparameters"> <cd:arguments> <cd:keywords> <cd:constant type="cd:text"/> @@ -37082,7 +37504,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="getgparameters"> + <cd:command file="syst-aux.mkiv" level="system" name="getgparameters"> <cd:arguments> <cd:keywords> <cd:constant type="cd:text"/> @@ -37094,7 +37516,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="getxparameters"> + <cd:command file="syst-aux.mkiv" level="system" name="getxparameters"> <cd:arguments> <cd:keywords> <cd:constant type="cd:text"/> @@ -37106,7 +37528,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="forgetparameters"> + <cd:command file="syst-aux.mkiv" level="system" name="forgetparameters"> <cd:arguments> <cd:keywords> <cd:constant type="cd:text"/> @@ -37118,7 +37540,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="getexpandedparameters"> + <cd:command file="syst-aux.mkiv" level="system" name="getexpandedparameters"> <cd:arguments> <cd:keywords> <cd:constant type="cd:text"/> @@ -37130,7 +37552,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doassign"> + <cd:command file="syst-aux.mkiv" level="system" name="doassign"> <cd:arguments> <cd:keywords> <cd:constant type="cd:text"/> @@ -37142,7 +37564,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doeassign"> + <cd:command file="syst-aux.mkiv" level="system" name="doeassign"> <cd:arguments> <cd:keywords> <cd:constant type="cd:text"/> @@ -37154,7 +37576,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="undoassign"> + <cd:command file="syst-aux.mkiv" level="system" name="undoassign"> <cd:arguments> <cd:keywords> <cd:constant type="cd:text"/> @@ -37166,7 +37588,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doassignempty"> + <cd:command file="syst-aux.mkiv" level="system" name="doassignempty"> <cd:arguments> <cd:keywords> <cd:constant type="cd:text"/> @@ -37178,7 +37600,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="processassignmentlist"> + <cd:command file="syst-aux.mkiv" level="system" name="processassignmentlist"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="cd:key"> @@ -37188,7 +37610,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="processassignmentcommand"> + <cd:command file="syst-aux.mkiv" level="system" name="processassignmentcommand"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="cd:key"> @@ -37198,7 +37620,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="processassignmentlist" type="environment"> + <cd:command file="syst-aux.mkiv" level="system" name="processassignmentlist" type="environment"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="cd:key"> @@ -37207,7 +37629,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="processassignmentcommand" type="environment"> + <cd:command file="syst-aux.mkiv" level="system" name="processassignmentcommand" type="environment"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="cd:key"> @@ -37216,9 +37638,9 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="currentassignmentlistkey"/> - <cd:command file="syst-aux.mkiv" name="currentassignmentlistvalue"/> - <cd:command file="syst-aux.mkiv" name="getemptyparameters"> + <cd:command file="syst-aux.mkiv" level="system" name="currentassignmentlistkey"/> + <cd:command file="syst-aux.mkiv" level="system" name="currentassignmentlistvalue"/> + <cd:command file="syst-aux.mkiv" level="system" name="getemptyparameters"> <cd:arguments> <cd:keywords> <cd:constant type="cd:text"/> @@ -37230,7 +37652,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="copyparameters"> + <cd:command file="syst-aux.mkiv" level="system" name="copyparameters"> <cd:arguments> <cd:keywords> <cd:constant type="cd:text"/> @@ -37243,14 +37665,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="checkparameters"> + <cd:command file="syst-aux.mkiv" level="system" name="checkparameters"> <cd:arguments> <cd:keywords> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="ifparameters"> + <cd:command file="syst-aux.mkiv" level="system" name="ifparameters"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:true"/> @@ -37262,22 +37684,22 @@ <cd:delimiter name="fi"/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="commalistsize"/> - <cd:command file="syst-aux.mkiv" name="getcommalistsize"> + <cd:command file="syst-aux.mkiv" level="system" name="commalistsize"/> + <cd:command file="syst-aux.mkiv" level="system" name="getcommalistsize"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:command"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="getcommacommandsize"> + <cd:command file="syst-aux.mkiv" level="system" name="getcommacommandsize"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:command"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="getfromcommalist"> + <cd:command file="syst-aux.mkiv" level="system" name="getfromcommalist"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:command"/> @@ -37287,7 +37709,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="getfromcommacommand"> + <cd:command file="syst-aux.mkiv" level="system" name="getfromcommacommand"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:command"/> @@ -37297,7 +37719,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="dogetcommacommandelement"> + <cd:command file="syst-aux.mkiv" level="system" name="dogetcommacommandelement"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:number"/> @@ -37310,7 +37732,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="dosingleempty"> + <cd:command file="syst-aux.mkiv" level="system" name="dosingleempty"> <cd:arguments> <cd:csname/> <cd:keywords optional="yes"> @@ -37318,7 +37740,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="dodoubleempty"> + <cd:command file="syst-aux.mkiv" level="system" name="dodoubleempty"> <cd:arguments> <cd:csname/> <cd:keywords optional="yes"> @@ -37329,7 +37751,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="dotripleempty"> + <cd:command file="syst-aux.mkiv" level="system" name="dotripleempty"> <cd:arguments> <cd:csname/> <cd:keywords optional="yes"> @@ -37343,7 +37765,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doquadrupleempty"> + <cd:command file="syst-aux.mkiv" level="system" name="doquadrupleempty"> <cd:arguments> <cd:csname/> <cd:keywords optional="yes"> @@ -37360,7 +37782,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doquintupleempty"> + <cd:command file="syst-aux.mkiv" level="system" name="doquintupleempty"> <cd:arguments> <cd:csname/> <cd:keywords optional="yes"> @@ -37380,7 +37802,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="dosixtupleempty"> + <cd:command file="syst-aux.mkiv" level="system" name="dosixtupleempty"> <cd:arguments> <cd:csname/> <cd:keywords optional="yes"> @@ -37403,7 +37825,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doseventupleempty"> + <cd:command file="syst-aux.mkiv" level="system" name="doseventupleempty"> <cd:arguments> <cd:csname/> <cd:keywords optional="yes"> @@ -37429,7 +37851,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="dosingleargument"> + <cd:command file="syst-aux.mkiv" level="system" name="dosingleargument"> <cd:arguments> <cd:csname/> <cd:keywords> @@ -37437,7 +37859,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="dodoubleargument"> + <cd:command file="syst-aux.mkiv" level="system" name="dodoubleargument"> <cd:arguments> <cd:csname/> <cd:keywords> @@ -37448,7 +37870,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="dotripleargument"> + <cd:command file="syst-aux.mkiv" level="system" name="dotripleargument"> <cd:arguments> <cd:csname/> <cd:keywords> @@ -37462,7 +37884,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doquadrupleargument"> + <cd:command file="syst-aux.mkiv" level="system" name="doquadrupleargument"> <cd:arguments> <cd:csname/> <cd:keywords> @@ -37479,7 +37901,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doquintupleargument"> + <cd:command file="syst-aux.mkiv" level="system" name="doquintupleargument"> <cd:arguments> <cd:csname/> <cd:keywords> @@ -37499,7 +37921,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="dosixtupleargument"> + <cd:command file="syst-aux.mkiv" level="system" name="dosixtupleargument"> <cd:arguments> <cd:csname/> <cd:keywords> @@ -37522,7 +37944,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doseventupleargument"> + <cd:command file="syst-aux.mkiv" level="system" name="doseventupleargument"> <cd:arguments> <cd:csname/> <cd:keywords> @@ -37548,24 +37970,24 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="strippedcsname"> + <cd:command file="syst-aux.mkiv" level="system" name="strippedcsname"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="strippedcsname" variant="string"> + <cd:command file="syst-aux.mkiv" level="system" name="strippedcsname" variant="string"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="complexorsimple"> + <cd:command file="syst-aux.mkiv" level="system" name="complexorsimple"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="complexorsimple" variant="argument"> + <cd:command file="syst-aux.mkiv" level="system" name="complexorsimple" variant="argument"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -37573,12 +37995,12 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="complexorsimpleempty"> + <cd:command file="syst-aux.mkiv" level="system" name="complexorsimpleempty"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="complexorsimpleempty" variant="argument"> + <cd:command file="syst-aux.mkiv" level="system" name="complexorsimpleempty" variant="argument"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -37586,12 +38008,12 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="definecomplexorsimple"> + <cd:command file="syst-aux.mkiv" level="system" name="definecomplexorsimple"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="definecomplexorsimple" variant="argument"> + <cd:command file="syst-aux.mkiv" level="system" name="definecomplexorsimple" variant="argument"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -37599,12 +38021,12 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="definecomplexorsimpleempty"> + <cd:command file="syst-aux.mkiv" level="system" name="definecomplexorsimpleempty"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="definecomplexorsimpleempty" variant="argument"> + <cd:command file="syst-aux.mkiv" level="system" name="definecomplexorsimpleempty" variant="argument"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -37612,9 +38034,9 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="permitspacesbetweengroups"/> - <cd:command file="syst-aux.mkiv" name="dontpermitspacesbetweengroups"/> - <cd:command file="syst-aux.mkiv" name="dosinglegroupempty"> + <cd:command file="syst-aux.mkiv" level="system" name="permitspacesbetweengroups"/> + <cd:command file="syst-aux.mkiv" level="system" name="dontpermitspacesbetweengroups"/> + <cd:command file="syst-aux.mkiv" level="system" name="dosinglegroupempty"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces" optional="yes"> @@ -37622,7 +38044,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="dodoublegroupempty"> + <cd:command file="syst-aux.mkiv" level="system" name="dodoublegroupempty"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces" optional="yes"> @@ -37633,7 +38055,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="dotriplegroupempty"> + <cd:command file="syst-aux.mkiv" level="system" name="dotriplegroupempty"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces" optional="yes"> @@ -37647,7 +38069,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doquadruplegroupempty"> + <cd:command file="syst-aux.mkiv" level="system" name="doquadruplegroupempty"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces" optional="yes"> @@ -37664,7 +38086,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doquintuplegroupempty"> + <cd:command file="syst-aux.mkiv" level="system" name="doquintuplegroupempty"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces" optional="yes"> @@ -37684,14 +38106,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="firstofoneargument"> + <cd:command file="syst-aux.mkiv" level="system" name="firstofoneargument"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="firstoftwoarguments"> + <cd:command file="syst-aux.mkiv" level="system" name="firstoftwoarguments"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -37701,7 +38123,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="secondoftwoarguments"> + <cd:command file="syst-aux.mkiv" level="system" name="secondoftwoarguments"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -37711,7 +38133,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="firstofthreearguments"> + <cd:command file="syst-aux.mkiv" level="system" name="firstofthreearguments"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -37724,7 +38146,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="secondofthreearguments"> + <cd:command file="syst-aux.mkiv" level="system" name="secondofthreearguments"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -37737,7 +38159,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="thirdofthreearguments"> + <cd:command file="syst-aux.mkiv" level="system" name="thirdofthreearguments"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -37750,7 +38172,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="firstoffourarguments"> + <cd:command file="syst-aux.mkiv" level="system" name="firstoffourarguments"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -37766,7 +38188,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="secondoffourarguments"> + <cd:command file="syst-aux.mkiv" level="system" name="secondoffourarguments"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -37782,7 +38204,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="thirdoffourarguments"> + <cd:command file="syst-aux.mkiv" level="system" name="thirdoffourarguments"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -37798,7 +38220,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="fourthoffourarguments"> + <cd:command file="syst-aux.mkiv" level="system" name="fourthoffourarguments"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -37814,7 +38236,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="firstoffivearguments"> + <cd:command file="syst-aux.mkiv" level="system" name="firstoffivearguments"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -37833,7 +38255,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="secondoffivearguments"> + <cd:command file="syst-aux.mkiv" level="system" name="secondoffivearguments"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -37852,7 +38274,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="thirdoffivearguments"> + <cd:command file="syst-aux.mkiv" level="system" name="thirdoffivearguments"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -37871,7 +38293,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="fourthoffivearguments"> + <cd:command file="syst-aux.mkiv" level="system" name="fourthoffivearguments"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -37890,7 +38312,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="fifthoffivearguments"> + <cd:command file="syst-aux.mkiv" level="system" name="fifthoffivearguments"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -37909,7 +38331,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="firstofsixarguments"> + <cd:command file="syst-aux.mkiv" level="system" name="firstofsixarguments"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -37931,7 +38353,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="secondofsixarguments"> + <cd:command file="syst-aux.mkiv" level="system" name="secondofsixarguments"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -37953,7 +38375,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="thirdofsixarguments"> + <cd:command file="syst-aux.mkiv" level="system" name="thirdofsixarguments"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -37975,7 +38397,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="fourthofsixarguments"> + <cd:command file="syst-aux.mkiv" level="system" name="fourthofsixarguments"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -37997,7 +38419,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="fifthofsixarguments"> + <cd:command file="syst-aux.mkiv" level="system" name="fifthofsixarguments"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -38019,7 +38441,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="sixthofsixarguments"> + <cd:command file="syst-aux.mkiv" level="system" name="sixthofsixarguments"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -38041,14 +38463,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="firstofoneunexpanded"> + <cd:command file="syst-aux.mkiv" level="system" name="firstofoneunexpanded"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="firstoftwounexpanded"> + <cd:command file="syst-aux.mkiv" level="system" name="firstoftwounexpanded"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -38058,7 +38480,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="secondoftwounexpanded"> + <cd:command file="syst-aux.mkiv" level="system" name="secondoftwounexpanded"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -38068,7 +38490,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="firstofthreeunexpanded"> + <cd:command file="syst-aux.mkiv" level="system" name="firstofthreeunexpanded"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -38081,7 +38503,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="secondofthreeunexpanded"> + <cd:command file="syst-aux.mkiv" level="system" name="secondofthreeunexpanded"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -38094,7 +38516,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="thirdofthreeunexpanded"> + <cd:command file="syst-aux.mkiv" level="system" name="thirdofthreeunexpanded"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -38107,52 +38529,52 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="letempty"> + <cd:command file="syst-aux.mkiv" level="system" name="letempty"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="globalletempty"> + <cd:command file="syst-aux.mkiv" level="system" name="globalletempty"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="letvalueempty"> + <cd:command file="syst-aux.mkiv" level="system" name="letvalueempty"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="letgvalueempty"> + <cd:command file="syst-aux.mkiv" level="system" name="letgvalueempty"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="letvaluerelax"> + <cd:command file="syst-aux.mkiv" level="system" name="letvaluerelax"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="letgvalurelax"> + <cd:command file="syst-aux.mkiv" level="system" name="letgvalurelax"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="relaxvalueifundefined"> + <cd:command file="syst-aux.mkiv" level="system" name="relaxvalueifundefined"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="rawgetparameters"> + <cd:command file="syst-aux.mkiv" level="system" name="rawgetparameters"> <cd:arguments> <cd:keywords> <cd:constant type="cd:text"/> @@ -38164,7 +38586,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="texdefinition" type="environment"> + <cd:command file="syst-aux.mkiv" level="system" name="texdefinition" type="environment"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="spaces"/> @@ -38179,6 +38601,20 @@ <cd:keywords delimiters="none" optional="yes"> <cd:constant type="expanded"/> </cd:keywords> + <cd:keywords delimiters="none" optional="yes"> + <cd:constant type="singleempty"/> + <cd:constant type="doubleempty"/> + <cd:constant type="tripleempty"/> + <cd:constant type="quadrupleempty"/> + <cd:constant type="quintupleempty"/> + <cd:constant type="sixtupleempty"/> + <cd:constant type="singleargument"/> + <cd:constant type="doubleargument"/> + <cd:constant type="tripleargument"/> + <cd:constant type="quadrupleargument"/> + <cd:constant type="quintupleargument"/> + <cd:constant type="sixtupleargument"/> + </cd:keywords> <cd:keywords delimiters="none"> <cd:constant type="cd:name"/> </cd:keywords> @@ -38187,35 +38623,35 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="texdefinition"> + <cd:command file="syst-aux.mkiv" level="system" name="texdefinition"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="texcode" type="environment"/> - <cd:command file="syst-aux.mkiv" name="newcounter"> + <cd:command file="syst-aux.mkiv" level="system" name="texcode" type="environment"/> + <cd:command file="syst-aux.mkiv" level="system" name="newcounter"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="fastincrement"> + <cd:command file="syst-aux.mkiv" level="system" name="fastincrement"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="fastdecrement"> + <cd:command file="syst-aux.mkiv" level="system" name="fastdecrement"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="increment"> + <cd:command file="syst-aux.mkiv" level="system" name="increment"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="increment" variant="argument"> + <cd:command file="syst-aux.mkiv" level="system" name="increment" variant="argument"> <cd:arguments> <cd:keywords delimiters="parentheses" list="yes"> <cd:constant type="cd:csname"/> @@ -38223,12 +38659,12 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="decrement"> + <cd:command file="syst-aux.mkiv" level="system" name="decrement"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="decrement" variant="argument"> + <cd:command file="syst-aux.mkiv" level="system" name="decrement" variant="argument"> <cd:arguments> <cd:keywords delimiters="parentheses" list="yes"> <cd:constant type="cd:csname"/> @@ -38236,45 +38672,46 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="incrementvalue"> + <cd:command file="syst-aux.mkiv" level="system" name="incrementvalue"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="decrementvalue"> + <cd:command file="syst-aux.mkiv" level="system" name="decrementvalue"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="newsignal"> + <cd:command file="syst-aux.mkiv" level="system" name="newsignal"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="checkedstrippedcsname"> + <cd:command file="syst-aux.mkiv" level="system" name="checkedstrippedcsname"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="checkedstrippedcsname" variant="string"> + <cd:command file="syst-aux.mkiv" level="system" name="checkedstrippedcsname" variant="string"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="savenormalmeaning"> + <cd:command file="syst-aux.mkiv" level="system" name="savenormalmeaning"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="recursedepth"/> - <cd:command file="syst-aux.mkiv" name="recurselevel"/> - <cd:command file="syst-aux.mkiv" name="dostepwiserecurse"> + <cd:command file="syst-aux.mkiv" level="system" name="recursedepth"/> + <cd:command file="syst-aux.mkiv" level="system" name="recurselevel"/> + <cd:command file="syst-aux.mkiv" level="system" name="resetrecurselevel"/> + <cd:command file="syst-aux.mkiv" level="system" name="dostepwiserecurse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> @@ -38290,7 +38727,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="dorecurse"> + <cd:command file="syst-aux.mkiv" level="system" name="dorecurse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> @@ -38300,7 +38737,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doexpandedrecurse"> + <cd:command file="syst-aux.mkiv" level="system" name="doexpandedrecurse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> @@ -38310,7 +38747,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="dowith"> + <cd:command file="syst-aux.mkiv" level="system" name="dowith"> <cd:arguments> <cd:keywords delimiters="braces" list="yes"> <cd:constant type="cd:command"/> @@ -38320,16 +38757,16 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doloop"> + <cd:command file="syst-aux.mkiv" level="system" name="doloop"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:command"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="exitloop"/> - <cd:command file="syst-aux.mkiv" name="exitloopnow"/> - <cd:command file="syst-aux.mkiv" name="dorecurse"> + <cd:command file="syst-aux.mkiv" level="system" name="exitloop"/> + <cd:command file="syst-aux.mkiv" level="system" name="exitloopnow"/> + <cd:command file="syst-aux.mkiv" level="system" name="dofastloopcs"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> @@ -38337,7 +38774,9 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doloopoverlist"> + <cd:command file="syst-aux.mkiv" level="system" name="fastloopindex"/> + <cd:command file="syst-aux.mkiv" level="system" name="fastloopfinal"/> + <cd:command file="syst-aux.mkiv" level="system" name="doloopoverlist"> <cd:arguments> <cd:keywords delimiters="braces" list="yes"> <cd:constant type="cd:text"/> @@ -38347,29 +38786,29 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="recursestring"/> - <cd:command file="syst-aux.mkiv" name="newevery"> + <cd:command file="syst-aux.mkiv" level="system" name="recursestring"/> + <cd:command file="syst-aux.mkiv" level="system" name="newevery"> <cd:arguments> <cd:csname/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="EveryPar"> + <cd:command file="syst-aux.mkiv" level="system" name="EveryPar"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:command"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="EveryLine"> + <cd:command file="syst-aux.mkiv" level="system" name="EveryLine"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:command"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="forgeteverypar"/> - <cd:command file="syst-aux.mkiv" name="convertvalue"> + <cd:command file="syst-aux.mkiv" level="system" name="forgeteverypar"/> + <cd:command file="syst-aux.mkiv" level="system" name="convertvalue"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:name"/> @@ -38378,7 +38817,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="defconvertedvalue"> + <cd:command file="syst-aux.mkiv" level="system" name="defconvertedvalue"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -38386,7 +38825,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifelseassignment"> + <cd:command file="syst-aux.mkiv" level="system" name="doifelseassignment"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -38399,7 +38838,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifassignmentelse"> + <cd:command file="syst-aux.mkiv" level="system" name="doifassignmentelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -38412,14 +38851,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="docheckassignment"> + <cd:command file="syst-aux.mkiv" level="system" name="docheckassignment"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="ifassignment"> + <cd:command file="syst-aux.mkiv" level="system" name="ifassignment"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:true"/> @@ -38431,7 +38870,7 @@ <cd:delimiter name="fi"/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="convertargument"> + <cd:command file="syst-aux.mkiv" level="system" name="convertargument"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:text"/> @@ -38440,14 +38879,14 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="convertcommand"> + <cd:command file="syst-aux.mkiv" level="system" name="convertcommand"> <cd:arguments> <cd:csname/> <cd:delimiter name="to"/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="defconvertedargument"> + <cd:command file="syst-aux.mkiv" level="system" name="defconvertedargument"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -38455,13 +38894,13 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="defconvertedcommand"> + <cd:command file="syst-aux.mkiv" level="system" name="defconvertedcommand"> <cd:arguments> <cd:csname/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="edefconvertedargument"> + <cd:command file="syst-aux.mkiv" level="system" name="edefconvertedargument"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -38469,7 +38908,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="gdefconvertedargument"> + <cd:command file="syst-aux.mkiv" level="system" name="gdefconvertedargument"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -38477,13 +38916,13 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="gdefconvertedcommand"> + <cd:command file="syst-aux.mkiv" level="system" name="gdefconvertedcommand"> <cd:arguments> <cd:csname/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="xdefconvertedargument"> + <cd:command file="syst-aux.mkiv" level="system" name="xdefconvertedargument"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -38491,14 +38930,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="showvalue"> + <cd:command file="syst-aux.mkiv" level="system" name="showvalue"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifelsemeaning"> + <cd:command file="syst-aux.mkiv" level="system" name="doifelsemeaning"> <cd:arguments> <cd:csname/> <cd:csname/> @@ -38510,7 +38949,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifmeaningelse"> + <cd:command file="syst-aux.mkiv" level="system" name="doifmeaningelse"> <cd:arguments> <cd:csname/> <cd:csname/> @@ -38522,7 +38961,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifelsesamestring"> + <cd:command file="syst-aux.mkiv" level="system" name="doifelsesamestring"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -38538,7 +38977,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifsamestringelse"> + <cd:command file="syst-aux.mkiv" level="system" name="doifsamestringelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -38554,7 +38993,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifsamestring"> + <cd:command file="syst-aux.mkiv" level="system" name="doifsamestring"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -38567,7 +39006,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifnotsamestring"> + <cd:command file="syst-aux.mkiv" level="system" name="doifnotsamestring"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -38580,7 +39019,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="ConvertToConstant"> + <cd:command file="syst-aux.mkiv" level="system" name="ConvertToConstant"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -38591,7 +39030,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="ConvertConstantAfter"> + <cd:command file="syst-aux.mkiv" level="system" name="ConvertConstantAfter"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -38602,7 +39041,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="assignifempty"> + <cd:command file="syst-aux.mkiv" level="system" name="assignifempty"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -38610,7 +39049,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="grabuntil"> + <cd:command file="syst-aux.mkiv" level="system" name="grabuntil"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -38618,7 +39057,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="processbetween"> + <cd:command file="syst-aux.mkiv" level="system" name="processbetween"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -38626,12 +39065,12 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="gobbleuntil"> + <cd:command file="syst-aux.mkiv" level="system" name="gobbleuntil"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="gobbleuntilrelax"> + <cd:command file="syst-aux.mkiv" level="system" name="gobbleuntilrelax"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:content"/> @@ -38639,12 +39078,12 @@ <cd:delimiter name="relax"/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="processuntil"> + <cd:command file="syst-aux.mkiv" level="system" name="processuntil"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="groupedcommand"> + <cd:command file="syst-aux.mkiv" level="system" name="groupedcommand"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:command"/> @@ -38654,7 +39093,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="simplegroupedcommand"> + <cd:command file="syst-aux.mkiv" level="system" name="simplegroupedcommand"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:command"/> @@ -38664,7 +39103,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="pickupgroupedcommand"> + <cd:command file="syst-aux.mkiv" level="system" name="pickupgroupedcommand"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:command"/> @@ -38677,33 +39116,33 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="BeforePar"> + <cd:command file="syst-aux.mkiv" level="system" name="BeforePar"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:command"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="AfterPar"> + <cd:command file="syst-aux.mkiv" level="system" name="AfterPar"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:command"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="GetPar"/> - <cd:command file="syst-aux.mkiv" name="GotoPar"/> - <cd:command file="syst-aux.mkiv" name="dowithpargument"> + <cd:command file="syst-aux.mkiv" level="system" name="GetPar"/> + <cd:command file="syst-aux.mkiv" level="system" name="GotoPar"/> + <cd:command file="syst-aux.mkiv" level="system" name="dowithpargument"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="dowithwargument"> + <cd:command file="syst-aux.mkiv" level="system" name="dowithwargument"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="dorepeatwithcommand"> + <cd:command file="syst-aux.mkiv" level="system" name="dorepeatwithcommand"> <cd:arguments> <cd:keywords> <cd:constant type="cd:text"/> @@ -38712,7 +39151,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifelsestringinstring"> + <cd:command file="syst-aux.mkiv" level="system" name="doifelsestringinstring"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -38728,7 +39167,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifstringinstringelse"> + <cd:command file="syst-aux.mkiv" level="system" name="doifstringinstringelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -38744,7 +39183,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="appendtoks"> + <cd:command file="syst-aux.mkiv" level="system" name="appendtoks"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:command"/> @@ -38753,7 +39192,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="prependtoks"> + <cd:command file="syst-aux.mkiv" level="system" name="prependtoks"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:command"/> @@ -38762,7 +39201,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="appendtoksonce"> + <cd:command file="syst-aux.mkiv" level="system" name="appendtoksonce"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:command"/> @@ -38771,7 +39210,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="prependtoksonce"> + <cd:command file="syst-aux.mkiv" level="system" name="prependtoksonce"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:command"/> @@ -38780,7 +39219,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifelseintoks"> + <cd:command file="syst-aux.mkiv" level="system" name="doifelseintoks"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:command"/> @@ -38796,7 +39235,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifintokselse"> + <cd:command file="syst-aux.mkiv" level="system" name="doifintokselse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:command"/> @@ -38812,20 +39251,20 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="collecting" type="environment"/> - <cd:command file="syst-aux.mkiv" name="collect" type="environment"/> - <cd:command file="syst-aux.mkiv" name="expandedcollect" type="environment"/> - <cd:command file="syst-aux.mkiv" name="collect"> + <cd:command file="syst-aux.mkiv" level="system" name="collecting" type="environment"/> + <cd:command file="syst-aux.mkiv" level="system" name="collect" type="environment"/> + <cd:command file="syst-aux.mkiv" level="system" name="expandedcollect" type="environment"/> + <cd:command file="syst-aux.mkiv" level="system" name="collect"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="collectexpanded"> + <cd:command file="syst-aux.mkiv" level="system" name="collectexpanded"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="removetoks"> + <cd:command file="syst-aux.mkiv" level="system" name="removetoks"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:command"/> @@ -38834,7 +39273,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="appendetoks"> + <cd:command file="syst-aux.mkiv" level="system" name="appendetoks"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:command"/> @@ -38843,7 +39282,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="prependetoks"> + <cd:command file="syst-aux.mkiv" level="system" name="prependetoks"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:command"/> @@ -38852,17 +39291,17 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="flushtoks"> + <cd:command file="syst-aux.mkiv" level="system" name="flushtoks"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="dotoks"> + <cd:command file="syst-aux.mkiv" level="system" name="dotoks"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="beforesplitstring"> + <cd:command file="syst-aux.mkiv" level="system" name="beforesplitstring"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:text"/> @@ -38875,7 +39314,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="aftersplitstring"> + <cd:command file="syst-aux.mkiv" level="system" name="aftersplitstring"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:text"/> @@ -38888,7 +39327,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="splitstring"> + <cd:command file="syst-aux.mkiv" level="system" name="splitstring"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:text"/> @@ -38903,7 +39342,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="greedysplitstring"> + <cd:command file="syst-aux.mkiv" level="system" name="greedysplitstring"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:text"/> @@ -38918,7 +39357,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="beforetestandsplitstring"> + <cd:command file="syst-aux.mkiv" level="system" name="beforetestandsplitstring"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:text"/> @@ -38931,7 +39370,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="aftertestandsplitstring"> + <cd:command file="syst-aux.mkiv" level="system" name="aftertestandsplitstring"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:text"/> @@ -38944,7 +39383,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="testandsplitstring"> + <cd:command file="syst-aux.mkiv" level="system" name="testandsplitstring"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:text"/> @@ -38959,7 +39398,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="splitatcolon"> + <cd:command file="syst-aux.mkiv" level="system" name="splitatperiod"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:text"/> @@ -38968,7 +39407,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="splitatcomma"> + <cd:command file="syst-aux.mkiv" level="system" name="splitatcomma"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:text"/> @@ -38977,7 +39416,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="splitatasterisk"> + <cd:command file="syst-aux.mkiv" level="system" name="splitatasterisk"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:text"/> @@ -38986,7 +39425,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="splitatcolon"> + <cd:command file="syst-aux.mkiv" level="system" name="splitatcolon"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:text"/> @@ -38995,7 +39434,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="splitatcolons"> + <cd:command file="syst-aux.mkiv" level="system" name="splitatcolons"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:text"/> @@ -39004,7 +39443,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="removesubstring"> + <cd:command file="syst-aux.mkiv" level="system" name="removesubstring"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:text"/> @@ -39017,7 +39456,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="appendtocommalist"> + <cd:command file="syst-aux.mkiv" level="system" name="appendtocommalist"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -39025,7 +39464,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="prependtocommalist"> + <cd:command file="syst-aux.mkiv" level="system" name="prependtocommalist"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -39033,7 +39472,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="addtocommalist"> + <cd:command file="syst-aux.mkiv" level="system" name="addtocommalist"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -39041,7 +39480,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="pretocommalist"> + <cd:command file="syst-aux.mkiv" level="system" name="pretocommalist"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -39049,13 +39488,13 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="robustdoifelseinset"> + <cd:command file="syst-aux.mkiv" level="system" name="robustdoifelseinset"> <cd:arguments> - <cd:keywords delimiters="braces" list="yes"> - <cd:content/> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:text"/> </cd:keywords> <cd:keywords delimiters="braces" list="yes"> - <cd:content/> + <cd:constant type="cd:text"/> </cd:keywords> <cd:keywords delimiters="braces"> <cd:constant type="cd:true"/> @@ -39065,13 +39504,13 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="robustdoifinsetelse"> + <cd:command file="syst-aux.mkiv" level="system" name="robustdoifinsetelse"> <cd:arguments> - <cd:keywords delimiters="braces" list="yes"> - <cd:content/> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:text"/> </cd:keywords> <cd:keywords delimiters="braces" list="yes"> - <cd:content/> + <cd:constant type="cd:text"/> </cd:keywords> <cd:keywords delimiters="braces"> <cd:constant type="cd:true"/> @@ -39081,7 +39520,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="robustaddtocommalist"> + <cd:command file="syst-aux.mkiv" level="system" name="robustaddtocommalist"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -39089,7 +39528,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="robustpretocommalist"> + <cd:command file="syst-aux.mkiv" level="system" name="robustpretocommalist"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -39097,7 +39536,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="xsplitstring"> + <cd:command file="syst-aux.mkiv" level="system" name="xsplitstring"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -39105,7 +39544,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="removefromcommalist"> + <cd:command file="syst-aux.mkiv" level="system" name="removefromcommalist"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -39113,7 +39552,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="substituteincommalist"> + <cd:command file="syst-aux.mkiv" level="system" name="substituteincommalist"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -39124,7 +39563,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="replaceincommalist"> + <cd:command file="syst-aux.mkiv" level="system" name="replaceincommalist"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -39132,7 +39571,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="globalprocesscommalist"> + <cd:command file="syst-aux.mkiv" level="system" name="globalprocesscommalist"> <cd:arguments> <cd:keywords> <cd:constant type="cd:command"/> @@ -39140,21 +39579,21 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="withoutpt"> + <cd:command file="syst-aux.mkiv" level="system" name="withoutpt"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:dimension"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="PtToCm"> + <cd:command file="syst-aux.mkiv" level="system" name="PtToCm"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:dimension"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="dimensiontocount"> + <cd:command file="syst-aux.mkiv" level="system" name="dimensiontocount"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:dimension"/> @@ -39162,89 +39601,89 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="numberofpoints"> + <cd:command file="syst-aux.mkiv" level="system" name="numberofpoints"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:dimension"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="swapdimens"> + <cd:command file="syst-aux.mkiv" level="system" name="swapdimens"> <cd:arguments> <cd:csname/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="swapcounts"> + <cd:command file="syst-aux.mkiv" level="system" name="swapcounts"> <cd:arguments> <cd:csname/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="swapmacros"> + <cd:command file="syst-aux.mkiv" level="system" name="swapmacros"> <cd:arguments> <cd:csname/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="globalswapdimens"> + <cd:command file="syst-aux.mkiv" level="system" name="globalswapdimens"> <cd:arguments> <cd:csname/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="globalswapcounts"> + <cd:command file="syst-aux.mkiv" level="system" name="globalswapcounts"> <cd:arguments> <cd:csname/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="globalswapmacros"> + <cd:command file="syst-aux.mkiv" level="system" name="globalswapmacros"> <cd:arguments> <cd:csname/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="globalpushmacro"> + <cd:command file="syst-aux.mkiv" level="system" name="globalpushmacro"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="localpushmacro"> + <cd:command file="syst-aux.mkiv" level="system" name="localpushmacro"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="globalpopmacro"> + <cd:command file="syst-aux.mkiv" level="system" name="globalpopmacro"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="localpopmacro"> + <cd:command file="syst-aux.mkiv" level="system" name="localpopmacro"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="pushmacro"> + <cd:command file="syst-aux.mkiv" level="system" name="pushmacro"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="popmacro"> + <cd:command file="syst-aux.mkiv" level="system" name="popmacro"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="localhsize"/> - <cd:command file="syst-aux.mkiv" name="setlocalhsize"> + <cd:command file="syst-aux.mkiv" level="system" name="localhsize"/> + <cd:command file="syst-aux.mkiv" level="system" name="setlocalhsize"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant method="none" prefix="cd:sign" type="cd:dimension"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="availablehsize"/> - <cd:command file="syst-aux.mkiv" name="distributedhsize"> + <cd:command file="syst-aux.mkiv" level="system" name="availablehsize"/> + <cd:command file="syst-aux.mkiv" level="system" name="distributedhsize"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:dimension"/> @@ -39257,7 +39696,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="hsizefraction"> + <cd:command file="syst-aux.mkiv" level="system" name="hsizefraction"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:dimension"/> @@ -39267,7 +39706,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifvalue"> + <cd:command file="syst-aux.mkiv" level="system" name="doifvalue"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -39280,7 +39719,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifnotvalue"> + <cd:command file="syst-aux.mkiv" level="system" name="doifnotvalue"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -39293,7 +39732,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifelsevalue"> + <cd:command file="syst-aux.mkiv" level="system" name="doifelsevalue"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -39309,7 +39748,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifvalueelse"> + <cd:command file="syst-aux.mkiv" level="system" name="doifvalueelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -39325,7 +39764,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifnothing"> + <cd:command file="syst-aux.mkiv" level="system" name="doifnothing"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -39335,7 +39774,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifsomething"> + <cd:command file="syst-aux.mkiv" level="system" name="doifsomething"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -39345,7 +39784,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifelsenothing"> + <cd:command file="syst-aux.mkiv" level="system" name="doifelsenothing"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -39358,7 +39797,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifnothingelse"> + <cd:command file="syst-aux.mkiv" level="system" name="doifnothingelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -39371,7 +39810,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifelsesomething"> + <cd:command file="syst-aux.mkiv" level="system" name="doifelsesomething"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -39384,7 +39823,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifsomethingelse"> + <cd:command file="syst-aux.mkiv" level="system" name="doifsomethingelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -39397,7 +39836,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifvaluenothing"> + <cd:command file="syst-aux.mkiv" level="system" name="doifvaluenothing"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -39407,7 +39846,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifvaluesomething"> + <cd:command file="syst-aux.mkiv" level="system" name="doifvaluesomething"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -39417,7 +39856,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifelsevaluenothing"> + <cd:command file="syst-aux.mkiv" level="system" name="doifelsevaluenothing"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -39430,7 +39869,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifvaluenothingelse"> + <cd:command file="syst-aux.mkiv" level="system" name="doifvaluenothingelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -39443,7 +39882,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifelseemptyvalue"> + <cd:command file="syst-aux.mkiv" level="system" name="doifelseemptyvalue"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -39456,7 +39895,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifemptyvalueelse"> + <cd:command file="syst-aux.mkiv" level="system" name="doifemptyvalueelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -39469,7 +39908,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifemptyvalue"> + <cd:command file="syst-aux.mkiv" level="system" name="doifemptyvalue"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -39479,7 +39918,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifnotemptyvalue"> + <cd:command file="syst-aux.mkiv" level="system" name="doifnotemptyvalue"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -39489,13 +39928,13 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifelseallcommon"> + <cd:command file="syst-aux.mkiv" level="system" name="doifelseallcommon"> <cd:arguments> <cd:keywords delimiters="braces" list="yes"> - <cd:content/> + <cd:constant type="cd:text"/> </cd:keywords> <cd:keywords delimiters="braces" list="yes"> - <cd:content/> + <cd:constant type="cd:text"/> </cd:keywords> <cd:keywords delimiters="braces"> <cd:constant type="cd:true"/> @@ -39505,13 +39944,13 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifallcommonelse"> + <cd:command file="syst-aux.mkiv" level="system" name="doifallcommonelse"> <cd:arguments> <cd:keywords delimiters="braces" list="yes"> - <cd:content/> + <cd:constant type="cd:text"/> </cd:keywords> <cd:keywords delimiters="braces" list="yes"> - <cd:content/> + <cd:constant type="cd:text"/> </cd:keywords> <cd:keywords delimiters="braces"> <cd:constant type="cd:true"/> @@ -39521,33 +39960,33 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifallcommon"> + <cd:command file="syst-aux.mkiv" level="system" name="doifallcommon"> <cd:arguments> <cd:keywords delimiters="braces" list="yes"> - <cd:content/> + <cd:constant type="cd:text"/> </cd:keywords> <cd:keywords delimiters="braces" list="yes"> - <cd:content/> + <cd:constant type="cd:text"/> </cd:keywords> <cd:keywords delimiters="braces"> <cd:constant type="cd:true"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifnotallcommon"> + <cd:command file="syst-aux.mkiv" level="system" name="doifnotallcommon"> <cd:arguments> <cd:keywords delimiters="braces" list="yes"> - <cd:content/> + <cd:constant type="cd:text"/> </cd:keywords> <cd:keywords delimiters="braces" list="yes"> - <cd:content/> + <cd:constant type="cd:text"/> </cd:keywords> <cd:keywords delimiters="braces"> <cd:constant type="cd:true"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="dodoubleemptywithset"> + <cd:command file="syst-aux.mkiv" level="system" name="dodoubleemptywithset"> <cd:arguments> <cd:csname/> <cd:keywords list="yes" optional="yes"> @@ -39558,7 +39997,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="dotripleemptywithset"> + <cd:command file="syst-aux.mkiv" level="system" name="dotripleemptywithset"> <cd:arguments> <cd:csname/> <cd:keywords list="yes" optional="yes"> @@ -39572,7 +40011,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="dodoubleargumentwithset"> + <cd:command file="syst-aux.mkiv" level="system" name="dodoubleargumentwithset"> <cd:arguments> <cd:csname/> <cd:keywords list="yes"> @@ -39583,7 +40022,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="dotripleargumentwithset"> + <cd:command file="syst-aux.mkiv" level="system" name="dotripleargumentwithset"> <cd:arguments> <cd:csname/> <cd:keywords list="yes"> @@ -39597,7 +40036,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="stripcharacter"> + <cd:command file="syst-aux.mkiv" level="system" name="stripcharacter"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:character"/> @@ -39610,7 +40049,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="stripspaces"> + <cd:command file="syst-aux.mkiv" level="system" name="stripspaces"> <cd:arguments> <cd:delimiter name="from"/> <cd:keywords delimiters="none"> @@ -39620,7 +40059,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="unspacestring"> + <cd:command file="syst-aux.mkiv" level="system" name="unspacestring"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:text"/> @@ -39629,7 +40068,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="executeifdefined"> + <cd:command file="syst-aux.mkiv" level="system" name="executeifdefined"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -39639,7 +40078,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifelsesomespace"> + <cd:command file="syst-aux.mkiv" level="system" name="doifelsesomespace"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -39652,7 +40091,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifsomespaceelse"> + <cd:command file="syst-aux.mkiv" level="system" name="doifsomespaceelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -39665,7 +40104,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="processseparatedlist"> + <cd:command file="syst-aux.mkiv" level="system" name="processseparatedlist"> <cd:arguments> <cd:keywords> <cd:constant type="cd:text"/> @@ -39679,7 +40118,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="processlist"> + <cd:command file="syst-aux.mkiv" level="system" name="processlist"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:character"/> @@ -39693,7 +40132,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="processassignlist"> + <cd:command file="syst-aux.mkiv" level="system" name="processassignlist"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:text"/> @@ -39701,7 +40140,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="untexargument"> + <cd:command file="syst-aux.mkiv" level="system" name="untexargument"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -39710,7 +40149,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="untexcommand"> + <cd:command file="syst-aux.mkiv" level="system" name="untexcommand"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:csname"/> @@ -39719,7 +40158,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="PointsToBigPoints"> + <cd:command file="syst-aux.mkiv" level="system" name="PointsToBigPoints"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:dimension"/> @@ -39727,7 +40166,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="PointsToWholeBigPoints"> + <cd:command file="syst-aux.mkiv" level="system" name="PointsToWholeBigPoints"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:dimension"/> @@ -39735,7 +40174,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="ScaledPointsToBigPoints"> + <cd:command file="syst-aux.mkiv" level="system" name="ScaledPointsToBigPoints"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:dimension"/> @@ -39743,7 +40182,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="ScaledPointsToWholeBigPoints"> + <cd:command file="syst-aux.mkiv" level="system" name="ScaledPointsToWholeBigPoints"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:dimension"/> @@ -39751,7 +40190,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="PointsToReal"> + <cd:command file="syst-aux.mkiv" level="system" name="PointsToReal"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:dimension"/> @@ -39759,22 +40198,22 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="dontleavehmode"/> - <cd:command file="syst-aux.mkiv" name="utfupper"> + <cd:command file="syst-aux.mkiv" level="style" name="dontleavehmode"/> + <cd:command file="syst-aux.mkiv" level="system" name="utfupper"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="utflower"> + <cd:command file="syst-aux.mkiv" level="system" name="utflower"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="uppercasestring"> + <cd:command file="syst-aux.mkiv" level="system" name="uppercasestring"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:text"/> @@ -39783,7 +40222,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="lowercasestring"> + <cd:command file="syst-aux.mkiv" level="system" name="lowercasestring"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:text"/> @@ -39792,7 +40231,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="counttoken"> + <cd:command file="syst-aux.mkiv" level="system" name="counttoken"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:text"/> @@ -39805,7 +40244,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="counttokens"> + <cd:command file="syst-aux.mkiv" level="system" name="counttokens"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:text"/> @@ -39814,7 +40253,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="splitofftokens"> + <cd:command file="syst-aux.mkiv" level="system" name="splitofftokens"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:text"/> @@ -39827,7 +40266,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="handletokens"> + <cd:command file="syst-aux.mkiv" level="system" name="handletokens"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:text"/> @@ -39836,9 +40275,9 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="settrialtypesetting"/> - <cd:command file="syst-aux.mkiv" name="resettrialtypesetting"/> - <cd:command file="syst-aux.mkiv" name="iftrialtypesetting"> + <cd:command file="syst-aux.mkiv" level="system" name="settrialtypesetting"/> + <cd:command file="syst-aux.mkiv" level="system" name="resettrialtypesetting"/> + <cd:command file="syst-aux.mkiv" level="system" name="iftrialtypesetting"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:true"/> @@ -39850,35 +40289,35 @@ <cd:delimiter name="fi"/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="integerrounding"> + <cd:command file="syst-aux.mkiv" level="system" name="integerrounding"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="onedigitrounding"> + <cd:command file="syst-aux.mkiv" level="system" name="onedigitrounding"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="twodigitrounding"> + <cd:command file="syst-aux.mkiv" level="system" name="twodigitrounding"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="threedigitrounding"> + <cd:command file="syst-aux.mkiv" level="system" name="threedigitrounding"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="processcontent"> + <cd:command file="syst-aux.mkiv" level="system" name="processcontent"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -39886,14 +40325,14 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="dogobblesingleempty"> + <cd:command file="syst-aux.mkiv" level="system" name="dogobblesingleempty"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="dogobbledoubleempty"> + <cd:command file="syst-aux.mkiv" level="system" name="dogobbledoubleempty"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:text"/> @@ -39903,14 +40342,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="gobblesingleempty"> + <cd:command file="syst-aux.mkiv" level="system" name="gobblesingleempty"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="gobbledoubleempty"> + <cd:command file="syst-aux.mkiv" level="system" name="gobbledoubleempty"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:text"/> @@ -39920,7 +40359,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifelsesometoks"> + <cd:command file="syst-aux.mkiv" level="system" name="doifelsesometoks"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -39931,7 +40370,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifsometokselse"> + <cd:command file="syst-aux.mkiv" level="system" name="doifsometokselse"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -39942,7 +40381,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifsometoks"> + <cd:command file="syst-aux.mkiv" level="system" name="doifsometoks"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -39950,7 +40389,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifemptytoks"> + <cd:command file="syst-aux.mkiv" level="system" name="doifemptytoks"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -39958,8 +40397,8 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="strictinspectnextcharacter" type="environment"/> - <cd:command file="syst-aux.mkiv" name="strictdoifelsenextoptional"> + <cd:command file="syst-aux.mkiv" level="system" name="strictinspectnextcharacter" type="environment"/> + <cd:command file="syst-aux.mkiv" level="system" name="strictdoifelsenextoptional"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:true"/> @@ -39969,7 +40408,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="strictdoifnextoptionalelse"> + <cd:command file="syst-aux.mkiv" level="system" name="strictdoifnextoptionalelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:true"/> @@ -39979,42 +40418,42 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="gobblespacetokens"/> - <cd:command file="syst-aux.mkiv" name="verbatimstring"> + <cd:command file="syst-aux.mkiv" level="system" name="gobblespacetokens"/> + <cd:command file="syst-aux.mkiv" level="system" name="verbatimstring"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="lastdigit"> + <cd:command file="syst-aux.mkiv" level="system" name="lastdigit"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="lasttwodigits"> + <cd:command file="syst-aux.mkiv" level="system" name="lasttwodigits"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="serializedcommalist"/> - <cd:command file="syst-aux.mkiv" name="serializecommalist"> + <cd:command file="syst-aux.mkiv" level="system" name="serializedcommalist"/> + <cd:command file="syst-aux.mkiv" level="system" name="serializecommalist"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:command"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="purenumber"> + <cd:command file="syst-aux.mkiv" level="system" name="purenumber"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="filterfromvalue"> + <cd:command file="syst-aux.mkiv" level="system" name="filterfromvalue"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -40027,7 +40466,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="filterfromnext"> + <cd:command file="syst-aux.mkiv" level="system" name="filterfromnext"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> @@ -40035,24 +40474,14 @@ <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:content/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:content/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:content/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:content/> - </cd:keywords> - <cd:keywords delimiters="braces" optional="yes"> - <cd:content/> - </cd:keywords> + <cd:content optional="yes"/> + <cd:content optional="yes"/> + <cd:content optional="yes"/> + <cd:content optional="yes"/> + <cd:content optional="yes"/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="definemeasure"> + <cd:command file="syst-aux.mkiv" level="style" name="definemeasure"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -40062,7 +40491,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="freezemeasure"> + <cd:command file="syst-aux.mkiv" level="system" name="freezemeasure"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -40072,7 +40501,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="setmeasure"> + <cd:command file="syst-aux.mkiv" level="system" name="setmeasure"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -40082,7 +40511,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="setgmeasure"> + <cd:command file="syst-aux.mkiv" level="system" name="setgmeasure"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -40092,7 +40521,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="setemeasure"> + <cd:command file="syst-aux.mkiv" level="system" name="setemeasure"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -40102,7 +40531,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="setxmeasure"> + <cd:command file="syst-aux.mkiv" level="system" name="setxmeasure"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -40112,21 +40541,21 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="measure"> + <cd:command file="syst-aux.mkiv" level="style" name="measure"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="measured"> + <cd:command file="syst-aux.mkiv" level="style" name="measured"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="dividedsize"> + <cd:command file="syst-aux.mkiv" level="system" name="dividedsize"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:dimension"/> @@ -40139,7 +40568,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifelsedimension"> + <cd:command file="syst-aux.mkiv" level="system" name="doifelsedimension"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -40152,7 +40581,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifdimensionelse"> + <cd:command file="syst-aux.mkiv" level="system" name="doifdimensionelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -40165,7 +40594,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifelsedimenstring"> + <cd:command file="syst-aux.mkiv" level="system" name="doifelsedimenstring"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -40178,7 +40607,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifdimenstringelse"> + <cd:command file="syst-aux.mkiv" level="system" name="doifdimenstringelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -40191,8 +40620,8 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="compresult"/> - <cd:command file="syst-aux.mkiv" name="comparedimension"> + <cd:command file="syst-aux.mkiv" level="system" name="compresult"/> + <cd:command file="syst-aux.mkiv" level="system" name="comparedimension"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:dimension"/> @@ -40202,7 +40631,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="comparedimensioneps"> + <cd:command file="syst-aux.mkiv" level="system" name="comparedimensioneps"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:dimension"/> @@ -40212,7 +40641,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="letcscsname"> + <cd:command file="syst-aux.mkiv" level="system" name="letcscsname"> <cd:arguments> <cd:csname/> <cd:delimiter name="csname"/> @@ -40222,7 +40651,7 @@ <cd:delimiter name="endcsname"/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="letcsnamecs"> + <cd:command file="syst-aux.mkiv" level="system" name="letcsnamecs"> <cd:arguments> <cd:delimiter name="csname"/> <cd:keywords delimiters="none"> @@ -40232,7 +40661,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="letcsnamecsname"> + <cd:command file="syst-aux.mkiv" level="system" name="letcsnamecsname"> <cd:arguments> <cd:delimiter name="csname"/> <cd:keywords delimiters="none"> @@ -40246,7 +40675,7 @@ <cd:delimiter name="endcsname"/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="addvalue"> + <cd:command file="syst-aux.mkiv" level="system" name="addvalue"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -40256,14 +40685,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="unspaced"> + <cd:command file="syst-aux.mkiv" level="system" name="unspaced"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="unspaceargument"> + <cd:command file="syst-aux.mkiv" level="system" name="unspaceargument"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:text"/> @@ -40272,7 +40701,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="unspaceafter"> + <cd:command file="syst-aux.mkiv" level="system" name="unspaceafter"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -40280,7 +40709,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifelsehasspace"> + <cd:command file="syst-aux.mkiv" level="system" name="doifelsehasspace"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -40293,7 +40722,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifhasspaceelse"> + <cd:command file="syst-aux.mkiv" level="system" name="doifhasspaceelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -40306,28 +40735,28 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="setflag"> + <cd:command file="syst-aux.mkiv" level="system" name="setflag"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="resetflag"> + <cd:command file="syst-aux.mkiv" level="system" name="resetflag"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="flag"> + <cd:command file="syst-aux.mkiv" level="system" name="flag"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifelseflagged"> + <cd:command file="syst-aux.mkiv" level="system" name="doifelseflagged"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -40340,7 +40769,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifflaggedelse"> + <cd:command file="syst-aux.mkiv" level="system" name="doifflaggedelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -40353,7 +40782,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifnotflagged"> + <cd:command file="syst-aux.mkiv" level="system" name="doifnotflagged"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -40363,7 +40792,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="inheritparameter"> + <cd:command file="syst-aux.mkiv" level="system" name="inheritparameter"> <cd:arguments> <cd:keywords> <cd:constant type="cd:text"/> @@ -40376,7 +40805,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifelsenonzeropositive"> + <cd:command file="syst-aux.mkiv" level="system" name="doifelsenonzeropositive"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> @@ -40389,7 +40818,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="doifnonzeropositiveelse"> + <cd:command file="syst-aux.mkiv" level="system" name="doifnonzeropositiveelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> @@ -40402,7 +40831,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="getrawparameters"> + <cd:command file="syst-aux.mkiv" level="system" name="getrawparameters"> <cd:arguments> <cd:keywords> <cd:constant type="cd:text"/> @@ -40414,7 +40843,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="getraweparameters"> + <cd:command file="syst-aux.mkiv" level="system" name="getraweparameters"> <cd:arguments> <cd:keywords> <cd:constant type="cd:text"/> @@ -40426,7 +40855,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="getrawgparameters"> + <cd:command file="syst-aux.mkiv" level="system" name="getrawgparameters"> <cd:arguments> <cd:keywords> <cd:constant type="cd:text"/> @@ -40438,7 +40867,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="getrawxparameters"> + <cd:command file="syst-aux.mkiv" level="system" name="getrawxparameters"> <cd:arguments> <cd:keywords> <cd:constant type="cd:text"/> @@ -40450,7 +40879,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="unprotected"> + <cd:command file="syst-aux.mkiv" level="system" name="unprotected"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:content"/> @@ -40458,51 +40887,47 @@ <cd:delimiter name="par"/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="resettimer"/> - <cd:command file="syst-aux.mkiv" name="elapsedtime"/> - <cd:command file="syst-aux.mkiv" name="elapsedseconds"/> - <cd:command file="syst-aux.mkiv" name="currentfeaturetest"/> - <cd:command file="syst-aux.mkiv" name="testfeature"> + <cd:command file="syst-aux.mkiv" level="system" name="resettimer"/> + <cd:command file="syst-aux.mkiv" level="system" name="elapsedtime"/> + <cd:command file="syst-aux.mkiv" level="system" name="elapsedseconds"/> + <cd:command file="syst-aux.mkiv" level="system" name="currentfeaturetest"/> + <cd:command file="syst-aux.mkiv" level="system" name="testfeature"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> - <cd:keywords delimiters="braces" list="yes"> - <cd:content/> - </cd:keywords> + <cd:content/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="showtimer"> + <cd:command file="syst-aux.mkiv" level="system" name="showtimer"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="testfeatureonce"> + <cd:command file="syst-aux.mkiv" level="system" name="testfeatureonce"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> - <cd:keywords delimiters="braces" list="yes"> - <cd:content/> - </cd:keywords> + <cd:content/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="freezedimenmacro"> + <cd:command file="syst-aux.mkiv" level="system" name="freezedimenmacro"> <cd:arguments> <cd:csname/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="negated"> + <cd:command file="syst-aux.mkiv" level="system" name="negated"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="assigndimen"> + <cd:command file="syst-aux.mkiv" level="system" name="assigndimen"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -40510,7 +40935,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="appendvalue"> + <cd:command file="syst-aux.mkiv" level="system" name="appendvalue"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -40520,7 +40945,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="appendgvalue"> + <cd:command file="syst-aux.mkiv" level="system" name="appendgvalue"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -40530,7 +40955,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="prependvalue"> + <cd:command file="syst-aux.mkiv" level="system" name="prependvalue"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -40540,7 +40965,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="prependgvalue"> + <cd:command file="syst-aux.mkiv" level="system" name="prependgvalue"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -40550,7 +40975,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="processranges"> + <cd:command file="syst-aux.mkiv" level="system" name="processranges"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:number"/> @@ -40559,7 +40984,7 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="dowithrange"> + <cd:command file="syst-aux.mkiv" level="system" name="dowithrange"> <cd:arguments> <cd:keywords delimiters="braces" list="yes"> <cd:constant type="cd:number"/> @@ -40568,9 +40993,9 @@ <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="ignoreimplicitspaces"/> - <cd:command file="syst-aux.mkiv" name="nointerference" type="environment"/> - <cd:command file="syst-aux.mkiv" name="expandcheckedcsname"> + <cd:command file="syst-aux.mkiv" level="system" name="ignoreimplicitspaces"/> + <cd:command file="syst-aux.mkiv" level="system" name="nointerference" type="environment"/> + <cd:command file="syst-aux.mkiv" level="system" name="expandcheckedcsname"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -40581,39 +41006,39 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="docheckedpair"> + <cd:command file="syst-aux.mkiv" level="system" name="docheckedpair"> <cd:arguments> <cd:keywords delimiters="braces" list="yes"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="constantnumber"> + <cd:command file="syst-aux.mkiv" level="system" name="constantnumber"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="constantnumberargument"> + <cd:command file="syst-aux.mkiv" level="system" name="constantnumberargument"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="constantdimen"> + <cd:command file="syst-aux.mkiv" level="system" name="constantdimen"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="constantdimenargument"> + <cd:command file="syst-aux.mkiv" level="system" name="constantdimenargument"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="constantemptyargument"> + <cd:command file="syst-aux.mkiv" level="system" name="constantemptyargument"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="getsubstring"> + <cd:command file="syst-aux.mkiv" level="system" name="getsubstring"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> @@ -40626,7 +41051,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="converteddimen"> + <cd:command file="syst-aux.mkiv" level="system" name="converteddimen"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:dimension"/> @@ -40647,7 +41072,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="syst-aux.mkiv" name="ntimes"> + <cd:command file="syst-aux.mkiv" level="system" name="ntimes"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -40657,9 +41082,108 @@ </cd:keywords> </cd:arguments> </cd:command> + <cd:command file="syst-lua.mkiv" level="system" name="expdoifelse"> + <cd:arguments> + <cd:content/> + <cd:content/> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:true"/> + </cd:keywords> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:false"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command file="syst-lua.mkiv" level="system" name="expdoif"> + <cd:arguments> + <cd:content/> + <cd:content/> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:true"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command file="syst-lua.mkiv" level="system" name="expdoifnot"> + <cd:arguments> + <cd:content/> + <cd:content/> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:true"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command file="syst-lua.mkiv" level="system" name="expdoifelsecommon"> + <cd:arguments> + <cd:keywords delimiters="braces" list="yes"> + <cd:constant type="cd:text"/> + </cd:keywords> + <cd:keywords delimiters="braces" list="yes"> + <cd:constant type="cd:text"/> + </cd:keywords> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:true"/> + </cd:keywords> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:false"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command file="syst-lua.mkiv" level="system" name="expdoifcommonelse"> + <cd:arguments> + <cd:keywords delimiters="braces" list="yes"> + <cd:constant type="cd:text"/> + </cd:keywords> + <cd:keywords delimiters="braces" list="yes"> + <cd:constant type="cd:text"/> + </cd:keywords> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:true"/> + </cd:keywords> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:false"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command file="syst-lua.mkiv" level="system" name="expdoifelseinset"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:text"/> + </cd:keywords> + <cd:keywords delimiters="braces" list="yes"> + <cd:constant type="cd:text"/> + </cd:keywords> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:true"/> + </cd:keywords> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:false"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command file="syst-lua.mkiv" level="system" name="expdoifinsetelse"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:text"/> + </cd:keywords> + <cd:keywords delimiters="braces" list="yes"> + <cd:constant type="cd:text"/> + </cd:keywords> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:true"/> + </cd:keywords> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:false"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command file="syst-lua.mkiv" level="system" name="luaexpr"> + <cd:arguments> + <cd:content/> + </cd:arguments> + </cd:command> </cd:interface> <cd:interface file="i-systemlog.xml"> - <cd:command file="core-sys.mkiv" name="systemlog"> + <cd:command file="core-sys.mkiv" level="system" name="systemlog"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:file"/> @@ -40672,7 +41196,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-sys.mkiv" name="systemlogfirst"> + <cd:command file="core-sys.mkiv" level="system" name="systemlogfirst"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:file"/> @@ -40685,7 +41209,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-sys.mkiv" name="systemloglast"> + <cd:command file="core-sys.mkiv" level="system" name="systemloglast"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:file"/> @@ -40700,7 +41224,7 @@ </cd:command> </cd:interface> <cd:interface file="i-table.xml"> - <cd:command file="tabl-tab.mkiv" name="table" type="environment"> + <cd:command category="tables" file="tabl-tab.mkiv" level="document" name="table" type="environment"> <cd:arguments> <cd:template/> <cd:assignments list="yes" optional="yes"> @@ -40708,7 +41232,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="tabl-tab.mkiv" name="table" type="environment" variant="name"> + <cd:command category="tables" file="tabl-tab.mkiv" level="document" name="table" type="environment" variant="name"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -40718,7 +41242,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="tabl-tab.mkiv" name="definetabletemplate"> + <cd:command category="tables" file="tabl-tab.mkiv" level="style" name="definetabletemplate"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -40732,33 +41256,33 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="tabl-tab.mkiv" name="tables" type="environment"> + <cd:command category="tables" file="tabl-tab.mkiv" level="document" name="tables" type="environment"> <cd:arguments> <cd:template/> </cd:arguments> </cd:command> - <cd:command file="tabl-tab.mkiv" name="tables" type="environment" variant="name"> + <cd:command category="tables" file="tabl-tab.mkiv" level="document" name="tables" type="environment" variant="name"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="tabl-tab.mkiv" name="tablehead" type="environment"> + <cd:command category="tables" file="tabl-tab.mkiv" level="document" name="tablehead" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="tabl-tab.mkiv" name="tabletail" type="environment"> + <cd:command category="tables" file="tabl-tab.mkiv" level="document" name="tabletail" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="tabl-tab.mkiv" name="setuptables"> + <cd:command category="tables" file="tabl-tab.mkiv" level="style" name="setuptables"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="text"> @@ -40828,7 +41352,7 @@ </cd:command> </cd:interface> <cd:interface file="i-tabulation.xml"> - <cd:command file="tabl-tbl.mkiv" name="definetabulation"> + <cd:command category="tables" file="tabl-tbl.mkiv" level="style" name="definetabulation"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -40841,7 +41365,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="tabl-tbl.mkiv" name="setuptabulation"> + <cd:command category="tables" file="tabl-tbl.mkiv" level="style" name="setuptabulation"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -40927,7 +41451,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="tabl-tbl.mkiv" generated="yes" name="tabulation" type="environment" variant="example"> + <cd:command category="tables" file="tabl-tbl.mkiv" generated="yes" level="document" name="tabulation" type="environment" variant="example"> <cd:sequence> <cd:variable value="tabulation"/> </cd:sequence> @@ -40940,7 +41464,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="tabl-tbl.mkiv" name="definetabulate"> + <cd:command category="tables" file="tabl-tbl.mkiv" level="style" name="definetabulate"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -40951,7 +41475,7 @@ <cd:template optional="yes"/> </cd:arguments> </cd:command> - <cd:command file="tabl-tbl.mkiv" name="setuptabulate"> + <cd:command category="tables" file="tabl-tbl.mkiv" level="style" name="setuptabulate"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -40964,7 +41488,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="tabl-tbl.mkiv" name="tabulate" type="environment"> + <cd:command category="tables" file="tabl-tbl.mkiv" level="document" name="tabulate" type="environment"> <cd:arguments> <cd:template optional="yes"/> <cd:assignments list="yes" optional="yes"> @@ -40972,7 +41496,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="tabl-tbl.mkiv" generated="yes" name="tabulate" type="environment" variant="instance"> + <cd:command category="tables" file="tabl-tbl.mkiv" generated="yes" level="document" name="tabulate" type="environment" variant="instance"> <cd:sequence> <cd:instance value="tabulate"/> </cd:sequence> @@ -40984,29 +41508,32 @@ <cd:inherit name="setuptabulate"/> </cd:assignments> </cd:arguments> - <cd:instances/> + <cd:instances> + <cd:constant value="legend"/> + <cd:constant value="fact"/> + </cd:instances> </cd:command> - <cd:command file="tabl-tbl.mkiv" name="tabulatehead" type="environment"> + <cd:command category="tables" file="tabl-tbl.mkiv" level="document" name="tabulatehead" type="environment"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="tabl-tbl.mkiv" name="tabulatetail" type="environment"> + <cd:command category="tables" file="tabl-tbl.mkiv" level="document" name="tabulatetail" type="environment"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="tabl-tbl.mkiv" name="tabulaterule"/> - <cd:command file="tabl-tbl.mkiv" name="tabulateline"/> - <cd:command file="tabl-tbl.mkiv" name="tabulateautorule"/> - <cd:command file="tabl-tbl.mkiv" name="tabulateautoline"/> + <cd:command category="tables" file="tabl-tbl.mkiv" level="document" name="tabulaterule"/> + <cd:command category="tables" file="tabl-tbl.mkiv" level="document" name="tabulateline"/> + <cd:command category="tables" file="tabl-tbl.mkiv" level="document" name="tabulateautorule"/> + <cd:command category="tables" file="tabl-tbl.mkiv" level="document" name="tabulateautoline"/> </cd:interface> <cd:interface file="i-tagging.xml"> - <cd:command file="strc-tag.mkiv" name="setuptagging"> + <cd:command category="xml" file="strc-tag.mkiv" level="style" name="setuptagging"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="state"> @@ -41019,7 +41546,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command begin="dostart" end="dostop" file="strc-tag.mkiv" name="tagged" type="environment"> + <cd:command begin="dostart" category="xml" end="dostop" file="strc-tag.mkiv" level="system" name="tagged" type="environment"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -41029,7 +41556,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-tag.mkiv" name="element" type="environment"> + <cd:command category="xml" file="strc-tag.mkiv" name="element" type="environment"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -41041,7 +41568,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="strc-tag.mkiv" name="doifelseinelement"> + <cd:command category="xml conditional" file="strc-tag.mkiv" level="system" name="doifelseinelement"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -41054,7 +41581,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-tag.mkiv" name="doifinelementelse"> + <cd:command category="xml conditional" file="strc-tag.mkiv" level="system" name="doifinelementelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -41067,7 +41594,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="strc-tag.mkiv" name="taggedlabeltexts"> + <cd:command category="xml language" file="strc-tag.mkiv" level="system" name="taggedlabeltexts"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -41078,7 +41605,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="strc-tag.mkiv" name="namedtaggedlabeltexts"> + <cd:command category="xml language" file="strc-tag.mkiv" level="system" name="namedtaggedlabeltexts"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -41095,7 +41622,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="strc-tag.mkiv" name="settaggedmetadata"> + <cd:command category="xml" file="strc-tag.mkiv" level="document" name="settaggedmetadata"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="cd:key"> @@ -41106,7 +41633,7 @@ </cd:command> </cd:interface> <cd:interface file="i-textbackground.xml"> - <cd:command file="anch-bck.mkiv" name="definetextbackground"> + <cd:command category="background" file="anch-bck.mkiv" level="style" name="definetextbackground"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -41119,7 +41646,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="anch-bck.mkiv" name="setuptextbackground"> + <cd:command category="background" file="anch-bck.mkiv" level="style" name="setuptextbackground"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -41132,8 +41659,12 @@ <cd:parameter name="location"> <cd:constant default="yes" type="text"/> <cd:constant type="paragraph"/> + <cd:constant type="always"/> <cd:constant type="none"/> </cd:parameter> + <cd:parameter name="criterium"> + <cd:constant type="cd:number"/> + </cd:parameter> <cd:parameter name="alternative"> <cd:constant type="cd:number"/> </cd:parameter> @@ -41226,7 +41757,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="anch-bck.mkiv" name="textbackground" type="environment"> + <cd:command category="background" file="anch-bck.mkiv" level="document" name="textbackground" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -41236,7 +41767,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="anch-bck.mkiv" generated="yes" name="textbackground" type="environment" variant="example"> + <cd:command category="background" file="anch-bck.mkiv" generated="yes" level="document" name="textbackground" type="environment" variant="example"> <cd:sequence> <cd:variable value="textbackground"/> </cd:sequence> @@ -41246,7 +41777,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="anch-bck.mkiv" generated="yes" name="textbackground" variant="example"> + <cd:command category="background" file="anch-bck.mkiv" generated="yes" level="document" name="textbackground" variant="example"> <cd:sequence> <cd:variable value="textbackground"/> </cd:sequence> @@ -41254,10 +41785,10 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="anch-bck.mkiv" name="textbackgroundmanual" type="environment"/> + <cd:command category="background" file="anch-bck.mkiv" level="system" name="textbackgroundmanual" type="environment"/> </cd:interface> <cd:interface file="i-textflow.xml"> - <cd:command file="page-flw.mkiv" name="definetextflow"> + <cd:command category="structure" file="page-flw.mkiv" level="style" name="definetextflow"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -41270,7 +41801,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-flw.mkiv" name="setuptextflow"> + <cd:command category="structure" file="page-flw.mkiv" level="style" name="setuptextflow"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -41289,14 +41820,14 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-flw.mkiv" name="textflowcollector"> + <cd:command category="structure" file="page-flw.mkiv" level="system" name="textflowcollector"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-flw.mkiv" name="doifelsetextflowcollector"> + <cd:command category="structure conditional" file="page-flw.mkiv" level="system" name="doifelsetextflowcollector"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -41309,7 +41840,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-flw.mkiv" name="doiftextflowcollectorelse"> + <cd:command category="structure conditional" file="page-flw.mkiv" level="system" name="doiftextflowcollectorelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -41322,7 +41853,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-flw.mkiv" name="doifelsetextflow"> + <cd:command category="structure conditional" file="page-flw.mkiv" level="system" name="doifelsetextflow"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -41335,7 +41866,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-flw.mkiv" name="doiftextflowelse"> + <cd:command category="structure conditional" file="page-flw.mkiv" level="system" name="doiftextflowelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -41348,14 +41879,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-flw.mkiv" name="textflow" type="environment"> + <cd:command category="structure" file="page-flw.mkiv" level="document" name="textflow" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-flw.mkiv" name="flushtextflow"> + <cd:command category="structure" file="page-flw.mkiv" level="document" name="flushtextflow"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -41364,7 +41895,7 @@ </cd:command> </cd:interface> <cd:interface file="i-textrule.xml"> - <cd:command file="pack-mrl.mkiv" name="setuptextrules"> + <cd:command category="rules" file="pack-mrl.mkiv" level="style" name="setuptextrules"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="before"> @@ -41412,7 +41943,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="pack-mrl.mkiv" name="textrule"> + <cd:command category="rules" file="pack-mrl.mkiv" level="document" name="textrule"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="top"/> @@ -41424,7 +41955,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="pack-mrl.mkiv" name="textrule" type="environment"> + <cd:command category="rules" file="pack-mrl.mkiv" level="document" name="textrule" type="environment"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -41433,7 +41964,7 @@ </cd:command> </cd:interface> <cd:interface file="i-texts.xml"> - <cd:command file="page-txt.mkvi" name="setuplayouttext"> + <cd:command category="layout" file="page-txt.mkvi" level="style" name="setuplayouttext"> <cd:arguments> <cd:keywords> <cd:constant type="top"/> @@ -41504,7 +42035,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-txt.mkvi" name="setuptop"> + <cd:command category="layout" file="page-txt.mkvi" level="style" name="setuptop"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="text"/> @@ -41516,7 +42047,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-txt.mkvi" name="setupheader"> + <cd:command category="layout" file="page-txt.mkvi" level="style" name="setupheader"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="text"/> @@ -41528,7 +42059,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-txt.mkvi" name="setuptext"> + <cd:command category="layout" file="page-txt.mkvi" level="style" name="setuptext"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="text"/> @@ -41540,7 +42071,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-txt.mkvi" name="setupfooter"> + <cd:command category="layout" file="page-txt.mkvi" level="style" name="setupfooter"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="text"/> @@ -41552,7 +42083,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-txt.mkvi" name="setupbottom"> + <cd:command category="layout" file="page-txt.mkvi" level="style" name="setupbottom"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="text"/> @@ -41564,7 +42095,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="page-txt.mkvi" name="doifelselayouttextline"> + <cd:command category="layout conditional" file="page-txt.mkvi" level="system" name="doifelselayouttextline"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -41577,7 +42108,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-txt.mkvi" name="doiflayouttextlineelse"> + <cd:command category="layout conditional" file="page-txt.mkvi" level="system" name="doiflayouttextlineelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -41590,7 +42121,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-txt.mkvi" name="doifelselayoutsomeline"> + <cd:command category="layout conditional" file="page-txt.mkvi" level="system" name="doifelselayoutsomeline"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -41603,7 +42134,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-txt.mkvi" name="doiflayoutsomelineelse"> + <cd:command category="layout conditional" file="page-txt.mkvi" level="system" name="doiflayoutsomelineelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -41616,9 +42147,9 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-txt.mkvi" name="noheaderandfooterlines"/> - <cd:command file="page-txt.mkvi" name="notopandbottomlines"/> - <cd:command file="page-txt.mkvi" name="setuptoptexts"> + <cd:command category="layout" file="page-txt.mkvi" level="style" name="noheaderandfooterlines"/> + <cd:command category="layout" file="page-txt.mkvi" level="style" name="notopandbottomlines"/> + <cd:command category="layout" file="page-txt.mkvi" level="style" name="setuptoptexts"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant default="yes" type="text"/> @@ -41655,7 +42186,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-txt.mkvi" name="setupheadertexts"> + <cd:command category="layout" file="page-txt.mkvi" level="style" name="setupheadertexts"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant default="yes" type="text"/> @@ -41692,7 +42223,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-txt.mkvi" name="setuptexttexts"> + <cd:command category="layout" file="page-txt.mkvi" level="style" name="setuptexttexts"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant default="yes" type="text"/> @@ -41729,7 +42260,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-txt.mkvi" name="setupfootertexts"> + <cd:command category="layout" file="page-txt.mkvi" level="style" name="setupfootertexts"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant default="yes" type="text"/> @@ -41766,7 +42297,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-txt.mkvi" name="setupbottomtexts"> + <cd:command category="layout" file="page-txt.mkvi" level="style" name="setupbottomtexts"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant default="yes" type="text"/> @@ -41803,7 +42334,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-txt.mkvi" name="settextcontent"> + <cd:command category="layout" file="page-txt.mkvi" level="style" name="settextcontent"> <cd:arguments> <cd:keywords> <cd:constant type="top"/> @@ -41838,7 +42369,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-txt.mkvi" name="definetext"> + <cd:command category="layout" file="page-txt.mkvi" level="style" name="definetext"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -41887,7 +42418,7 @@ </cd:command> </cd:interface> <cd:interface file="i-thinrule.xml"> - <cd:command file="pack-mrl.mkiv" name="setupthinrules"> + <cd:command category="rules" file="pack-mrl.mkiv" level="style" name="setupthinrules"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="height"> @@ -41941,9 +42472,9 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="pack-mrl.mkiv" name="thinrule"/> - <cd:command file="pack-mrl.mkiv" name="hairline"/> - <cd:command file="pack-mrl.mkiv" name="thinrules"> + <cd:command category="rules" file="pack-mrl.mkiv" level="document" name="thinrule"/> + <cd:command category="rules" file="pack-mrl.mkiv" level="document" name="hairline"/> + <cd:command category="rules" file="pack-mrl.mkiv" level="document" name="thinrules"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupthinrules"/> @@ -41952,28 +42483,28 @@ </cd:command> </cd:interface> <cd:interface file="i-token.xml"> - <cd:command file="toks-tra.mkiv" name="tokens" type="environment"> + <cd:command file="toks-tra.mkiv" level="system" name="tokens" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="toks-tra.mkiv" name="flushtokens"> + <cd:command file="toks-tra.mkiv" level="system" name="flushtokens"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="toks-tra.mkiv" name="showtokens"> + <cd:command file="toks-tra.mkiv" level="system" name="showtokens"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="toks-tra.mkiv" name="testtokens"> + <cd:command file="toks-tra.mkiv" level="system" name="testtokens"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -41982,7 +42513,7 @@ </cd:command> </cd:interface> <cd:interface file="i-tolerance.xml"> - <cd:command file="spac-hor.mkiv" name="setuptolerance"> + <cd:command category="whitespace" file="spac-hor.mkiv" level="style" name="setuptolerance"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="horizontal"/> @@ -41998,7 +42529,7 @@ </cd:command> </cd:interface> <cd:interface file="i-tooltip.xml"> - <cd:command file="scrn-fld.mkvi" name="definetooltip"> + <cd:command category="pdf" file="scrn-fld.mkvi" level="style" name="definetooltip"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -42011,7 +42542,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="scrn-fld.mkvi" name="setuptooltip"> + <cd:command category="pdf" file="scrn-fld.mkvi" level="style" name="setuptooltip"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -42026,7 +42557,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="scrn-fld.mkvi" generated="yes" name="tooltip" variant="instance"> + <cd:command category="pdf" file="scrn-fld.mkvi" generated="yes" level="document" name="tooltip" variant="instance"> <cd:sequence> <cd:instance value="tooltip"/> </cd:sequence> @@ -42041,9 +42572,11 @@ <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> - <cd:instances/> + <cd:instances> + <cd:constant value="tooltip"/> + </cd:instances> </cd:command> - <cd:command file="scrn-fld.mkvi" generated="yes" name="tooltip" variant="instance:argument"> + <cd:command category="pdf" file="scrn-fld.mkvi" generated="yes" level="document" name="tooltip" variant="instance:argument"> <cd:sequence> <cd:instance value="tooltip"/> </cd:sequence> @@ -42060,11 +42593,13 @@ <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> - <cd:instances/> + <cd:instances> + <cd:constant value="tooltip"/> + </cd:instances> </cd:command> </cd:interface> <cd:interface file="i-tracker.xml"> - <cd:command file="trac-ctx.mkiv" name="installtextracker"> + <cd:command file="trac-ctx.mkiv" level="system" name="installtextracker"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -42077,7 +42612,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="trac-ctx.mkiv" name="installtexdirective"> + <cd:command file="trac-ctx.mkiv" level="system" name="installtexdirective"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -42090,59 +42625,59 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="trac-deb.mkiv" name="enabletrackers"> + <cd:command file="trac-deb.mkiv" level="style" name="enabletrackers"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="trac-deb.mkiv" name="disabletrackers"> + <cd:command file="trac-deb.mkiv" level="style" name="disabletrackers"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="trac-deb.mkiv" name="resettrackers"/> - <cd:command file="trac-deb.mkiv" name="showtrackers"/> - <cd:command file="trac-deb.mkiv" name="enabledirectives"> + <cd:command file="trac-deb.mkiv" level="system" name="resettrackers"/> + <cd:command file="trac-deb.mkiv" level="document" name="showtrackers"/> + <cd:command file="trac-deb.mkiv" level="style" name="enabledirectives"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="trac-deb.mkiv" name="disabledirectives"> + <cd:command file="trac-deb.mkiv" level="style" name="disabledirectives"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="trac-deb.mkiv" name="showdirectives"/> - <cd:command file="trac-deb.mkiv" name="enableexperiments"> + <cd:command file="trac-deb.mkiv" level="document" name="showdirectives"/> + <cd:command file="trac-deb.mkiv" level="style" name="enableexperiments"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="trac-deb.mkiv" name="disableexperiments"> + <cd:command file="trac-deb.mkiv" level="style" name="disableexperiments"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="trac-deb.mkiv" name="showexperiments"/> - <cd:command file="trac-deb.mkiv" name="showedebuginfo"/> - <cd:command file="trac-deb.mkiv" name="overloaderror"/> - <cd:command file="trac-deb.mkiv" name="showlogcategories"/> - <cd:command file="trac-jus.mkiv" name="showjustification"/> + <cd:command file="trac-deb.mkiv" level="document" name="showexperiments"/> + <cd:command file="trac-deb.mkiv" level="system" name="showedebuginfo"/> + <cd:command file="trac-deb.mkiv" level="system" name="overloaderror"/> + <cd:command file="trac-deb.mkiv" level="system" name="showlogcategories"/> + <cd:command file="trac-jus.mkiv" level="system" name="showjustification"/> </cd:interface> <cd:interface file="i-translation.xml"> - <cd:command file="lang-lab.mkiv" name="translate"> + <cd:command category="language" file="lang-lab.mkiv" level="document" name="translate"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="cd:language"> @@ -42151,7 +42686,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="lang-lab.mkiv" name="assigntranslation"> + <cd:command category="language" file="lang-lab.mkiv" level="style" name="assigntranslation"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="cd:language"> @@ -42164,7 +42699,7 @@ </cd:command> </cd:interface> <cd:interface file="i-twopassdata.xml"> - <cd:command file="core-two.mkiv" name="immediatesavetwopassdata"> + <cd:command file="core-two.mkiv" level="system" name="immediatesavetwopassdata"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -42175,7 +42710,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="core-two.mkiv" name="savetwopassdata"> + <cd:command file="core-two.mkiv" level="system" name="savetwopassdata"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -42186,7 +42721,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="core-two.mkiv" name="lazysavetwopassdata"> + <cd:command file="core-two.mkiv" level="system" name="lazysavetwopassdata"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -42197,7 +42732,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="core-two.mkiv" name="savetaggedtwopassdata"> + <cd:command file="core-two.mkiv" level="system" name="savetaggedtwopassdata"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -42211,7 +42746,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="core-two.mkiv" name="lazysavetaggedtwopassdata"> + <cd:command file="core-two.mkiv" level="system" name="lazysavetaggedtwopassdata"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -42225,28 +42760,28 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="core-two.mkiv" name="definetwopasslist"> + <cd:command file="core-two.mkiv" level="system" name="definetwopasslist"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-two.mkiv" name="gettwopassdata"> + <cd:command file="core-two.mkiv" level="system" name="gettwopassdata"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-two.mkiv" name="checktwopassdata"> + <cd:command file="core-two.mkiv" level="system" name="checktwopassdata"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-two.mkiv" name="findtwopassdata"> + <cd:command file="core-two.mkiv" level="system" name="findtwopassdata"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -42256,21 +42791,21 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-two.mkiv" name="getfirsttwopassdata"> + <cd:command file="core-two.mkiv" level="system" name="getfirsttwopassdata"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-two.mkiv" name="getlasttwopassdata"> + <cd:command file="core-two.mkiv" level="system" name="getlasttwopassdata"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-two.mkiv" name="getnamedtwopassdatalist"> + <cd:command file="core-two.mkiv" level="system" name="getnamedtwopassdatalist"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -42278,14 +42813,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-two.mkiv" name="gettwopassdatalist"> + <cd:command file="core-two.mkiv" level="system" name="gettwopassdatalist"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-two.mkiv" name="doifelseintwopassdata"> + <cd:command file="core-two.mkiv" level="system" name="doifelseintwopassdata"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -42301,7 +42836,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-two.mkiv" name="doifintwopassdataelse"> + <cd:command file="core-two.mkiv" level="system" name="doifintwopassdataelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -42317,7 +42852,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-two.mkiv" name="getfromtwopassdata"> + <cd:command file="core-two.mkiv" level="system" name="getfromtwopassdata"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -42329,7 +42864,7 @@ </cd:command> </cd:interface> <cd:interface file="i-typography.xml"> - <cd:command file="typo-txt.mkvi" name="normalizetextwidth"> + <cd:command category="fonts" file="typo-txt.mkvi" level="system" name="normalizetextwidth"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:font"/> @@ -42342,7 +42877,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-txt.mkvi" name="normalizetextheight"> + <cd:command category="fonts" file="typo-txt.mkvi" level="system" name="normalizetextheight"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:font"/> @@ -42355,7 +42890,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-txt.mkvi" name="normalizetextdepth"> + <cd:command category="fonts" file="typo-txt.mkvi" level="system" name="normalizetextdepth"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:font"/> @@ -42368,7 +42903,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-txt.mkvi" name="normalizetextline"> + <cd:command category="fonts" file="typo-txt.mkvi" level="system" name="normalizetextline"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:font"/> @@ -42381,7 +42916,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-txt.mkvi" name="normalizefontwidth"> + <cd:command category="fonts" file="typo-txt.mkvi" level="system" name="normalizefontwidth"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -42395,7 +42930,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-txt.mkvi" name="normalizefontheight"> + <cd:command category="fonts" file="typo-txt.mkvi" level="system" name="normalizefontheight"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -42409,7 +42944,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-txt.mkvi" name="normalizefontdepth"> + <cd:command category="fonts" file="typo-txt.mkvi" level="system" name="normalizefontdepth"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -42423,7 +42958,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-txt.mkvi" name="normalizefontline"> + <cd:command category="fonts" file="typo-txt.mkvi" level="system" name="normalizefontline"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -42437,7 +42972,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-txt.mkvi" name="widthspanningtext"> + <cd:command category="fonts" file="typo-txt.mkvi" level="system" name="widthspanningtext"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -42450,7 +42985,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-txt.mkvi" name="heightspanningtext"> + <cd:command category="fonts" file="typo-txt.mkvi" level="system" name="heightspanningtext"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -42463,7 +42998,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-txt.mkvi" name="depthspanningtext"> + <cd:command category="fonts" file="typo-txt.mkvi" level="system" name="depthspanningtext"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -42476,7 +43011,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-txt.mkvi" name="linespanningtext"> + <cd:command category="fonts" file="typo-txt.mkvi" level="system" name="linespanningtext"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -42489,8 +43024,8 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-txt.mkvi" name="normalizedfontsize"/> - <cd:command file="typo-txt.mkvi" name="NormalizeTextWidth"> + <cd:command category="fonts" file="typo-txt.mkvi" level="system" name="normalizedfontsize"/> + <cd:command category="fonts" file="typo-txt.mkvi" level="system" name="NormalizeTextWidth"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:font"/> @@ -42503,7 +43038,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-txt.mkvi" name="NormalizeTextHeight"> + <cd:command category="fonts" file="typo-txt.mkvi" level="system" name="NormalizeTextHeight"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:font"/> @@ -42516,7 +43051,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-txt.mkvi" name="NormalizeFontWidth"> + <cd:command category="fonts" file="typo-txt.mkvi" level="system" name="NormalizeFontWidth"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -42530,7 +43065,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-txt.mkvi" name="NormalizeFontHeight"> + <cd:command category="fonts" file="typo-txt.mkvi" level="system" name="NormalizeFontHeight"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="braces"> @@ -42544,7 +43079,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-txt.mkvi" name="WidthSpanningText"> + <cd:command category="fonts" file="typo-txt.mkvi" level="system" name="WidthSpanningText"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -42557,8 +43092,8 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="typo-txt.mkvi" name="TheNormalizedFontSize"/> - <cd:command file="typo-txt.mkvi" name="nicelyfilledbox" type="environment"> + <cd:command category="fonts" file="typo-txt.mkvi" level="system" name="TheNormalizedFontSize"/> + <cd:command category="fonts" file="typo-txt.mkvi" level="system" name="nicelyfilledbox" type="environment"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="width"> @@ -42579,21 +43114,21 @@ </cd:command> </cd:interface> <cd:interface file="i-unit.xml"> - <cd:command file="phys-dim.mkiv" name="digits"> + <cd:command category="symbols" file="phys-dim.mkiv" level="document" name="digits"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="phys-dim.mkiv" name="digits" variant="string"> + <cd:command category="symbols" file="phys-dim.mkiv" level="document" name="digits" variant="string"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="phys-dim.mkiv" name="defineunit"> + <cd:command category="symbols" file="phys-dim.mkiv" level="style" name="defineunit"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -42606,7 +43141,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="phys-dim.mkiv" name="setupunit"> + <cd:command category="symbols" file="phys-dim.mkiv" level="style" name="setupunit"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -42657,16 +43192,18 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="phys-dim.mkiv" generated="yes" name="unit" variant="instance"> + <cd:command category="symbols" file="phys-dim.mkiv" generated="yes" level="document" name="unit" variant="instance"> <cd:sequence> <cd:instance value="unit"/> </cd:sequence> <cd:arguments> <cd:content/> </cd:arguments> - <cd:instances/> + <cd:instances> + <cd:constant value="unit"/> + </cd:instances> </cd:command> - <cd:command file="phys-dim.mkiv" name="installunitsseparator"> + <cd:command category="symbols" file="phys-dim.mkiv" level="system" name="installunitsseparator"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -42676,7 +43213,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="phys-dim.mkiv" name="installunitsspace"> + <cd:command category="symbols" file="phys-dim.mkiv" level="system" name="installunitsspace"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -42686,7 +43223,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="phys-dim.mkiv" name="registerunit"> + <cd:command category="symbols" file="phys-dim.mkiv" level="style" name="registerunit"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="prefix"/> @@ -42705,7 +43242,7 @@ </cd:command> </cd:interface> <cd:interface file="i-variables.xml"> - <cd:command file="core-env.mkiv" name="setvariables"> + <cd:command file="core-env.mkiv" level="style" name="setvariables"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -42723,7 +43260,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="setevariables"> + <cd:command file="core-env.mkiv" level="system" name="setevariables"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -42741,7 +43278,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="setgvariables"> + <cd:command file="core-env.mkiv" level="system" name="setgvariables"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -42759,7 +43296,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="setxvariables"> + <cd:command file="core-env.mkiv" level="system" name="setxvariables"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -42777,7 +43314,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="checkvariables"> + <cd:command file="core-env.mkiv" level="system" name="checkvariables"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -42795,7 +43332,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="setvariable"> + <cd:command file="core-env.mkiv" level="style" name="setvariable"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -42808,7 +43345,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="setevariable"> + <cd:command file="core-env.mkiv" level="system" name="setevariable"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -42821,7 +43358,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="setgvariable"> + <cd:command file="core-env.mkiv" level="system" name="setgvariable"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -42834,7 +43371,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="setxvariable"> + <cd:command file="core-env.mkiv" level="system" name="setxvariable"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -42847,7 +43384,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="getvariable"> + <cd:command file="core-env.mkiv" level="style" name="getvariable"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -42857,7 +43394,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="showvariable"> + <cd:command file="core-env.mkiv" level="system" name="showvariable"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -42867,7 +43404,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="doifelsevariable"> + <cd:command category="conditional" file="core-env.mkiv" level="system" name="doifelsevariable"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -42883,7 +43420,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="doifvariableelse"> + <cd:command category="conditional" file="core-env.mkiv" level="system" name="doifvariableelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -42899,7 +43436,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="doifvariable"> + <cd:command category="conditional" file="core-env.mkiv" level="system" name="doifvariable"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -42912,7 +43449,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="doifnotvariable"> + <cd:command category="conditional" file="core-env.mkiv" level="system" name="doifnotvariable"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -42925,7 +43462,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="doifelseemptyvariable"> + <cd:command category="conditional" file="core-env.mkiv" level="system" name="doifelseemptyvariable"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -42941,7 +43478,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="doifemptyvariableelse"> + <cd:command category="conditional" file="core-env.mkiv" level="system" name="doifemptyvariableelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -42957,7 +43494,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="doifemptyvariable"> + <cd:command category="conditional" file="core-env.mkiv" level="system" name="doifemptyvariable"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -42970,7 +43507,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="doifnotemptyvariable"> + <cd:command category="conditional" file="core-env.mkiv" level="system" name="doifnotemptyvariable"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -42983,7 +43520,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="getvariabledefault"> + <cd:command file="core-env.mkiv" level="system" name="getvariabledefault"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -42996,7 +43533,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="setupenv"> + <cd:command file="core-env.mkiv" level="system" name="setupenv"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="set"> @@ -43011,7 +43548,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="doifelseenv"> + <cd:command category="conditional" file="core-env.mkiv" level="system" name="doifelseenv"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:key"/> @@ -43024,7 +43561,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="doifenvelse"> + <cd:command category="conditional" file="core-env.mkiv" level="system" name="doifenvelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:key"/> @@ -43037,7 +43574,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="doifenv"> + <cd:command category="conditional" file="core-env.mkiv" level="system" name="doifenv"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:key"/> @@ -43047,7 +43584,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="doifnotenv"> + <cd:command category="conditional" file="core-env.mkiv" level="system" name="doifnotenv"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:key"/> @@ -43057,14 +43594,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="env"> + <cd:command file="core-env.mkiv" level="system" name="env"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:key"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="core-env.mkiv" name="envvar"> + <cd:command file="core-env.mkiv" level="system" name="envvar"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:key"/> @@ -43074,7 +43611,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="luat-ini.mkiv" name="setdocumentfilename"> + <cd:command file="luat-ini.mkiv" level="system" name="setdocumentfilename"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> @@ -43084,7 +43621,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="luat-ini.mkiv" name="setdocumentargument"> + <cd:command file="luat-ini.mkiv" level="system" name="setdocumentargument"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -43094,7 +43631,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="luat-ini.mkiv" name="setdocumentargumentdefault"> + <cd:command file="luat-ini.mkiv" level="system" name="setdocumentargumentdefault"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -43104,21 +43641,21 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="luat-ini.mkiv" name="getdocumentfilename"> + <cd:command file="luat-ini.mkiv" level="system" name="getdocumentfilename"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="luat-ini.mkiv" name="getdocumentargument"> + <cd:command file="luat-ini.mkiv" level="system" name="getdocumentargument"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="luat-ini.mkiv" name="getdocumentargumentdefault"> + <cd:command file="luat-ini.mkiv" level="system" name="getdocumentargumentdefault"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -43128,7 +43665,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="luat-ini.mkiv" name="doifelsedocumentargument"> + <cd:command category="conditional" file="luat-ini.mkiv" level="system" name="doifelsedocumentargument"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -43141,7 +43678,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="luat-ini.mkiv" name="doifdocumentargumentelse"> + <cd:command category="conditional" file="luat-ini.mkiv" level="system" name="doifdocumentargumentelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -43154,7 +43691,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="luat-ini.mkiv" name="doifdocumentargument"> + <cd:command category="conditional" file="luat-ini.mkiv" level="system" name="doifdocumentargument"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -43164,7 +43701,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="luat-ini.mkiv" name="doifnotdocumentargument"> + <cd:command category="conditional" file="luat-ini.mkiv" level="system" name="doifnotdocumentargument"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -43174,7 +43711,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="luat-ini.mkiv" name="doifelsedocumentfilename"> + <cd:command category="conditional" file="luat-ini.mkiv" level="system" name="doifelsedocumentfilename"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> @@ -43187,7 +43724,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="luat-ini.mkiv" name="doifdocumentfilenameelse"> + <cd:command category="conditional" file="luat-ini.mkiv" level="system" name="doifdocumentfilenameelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> @@ -43200,7 +43737,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="luat-ini.mkiv" name="doifdocumentfilename"> + <cd:command category="conditional" file="luat-ini.mkiv" level="system" name="doifdocumentfilename"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> @@ -43210,7 +43747,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="luat-ini.mkiv" name="doifnotdocumentfilename"> + <cd:command category="conditional" file="luat-ini.mkiv" level="system" name="doifnotdocumentfilename"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> @@ -43222,7 +43759,7 @@ </cd:command> </cd:interface> <cd:interface file="i-verbatim.xml"> - <cd:command file="buff-ver.mkiv" name="definetype"> + <cd:command category="verbatim" file="buff-ver.mkiv" level="style" name="definetype"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -43235,7 +43772,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="buff-ver.mkiv" name="setuptype"> + <cd:command category="verbatim" file="buff-ver.mkiv" level="style" name="setuptype"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -43300,7 +43837,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="buff-ver.mkiv" name="type"> + <cd:command category="verbatim" file="buff-ver.mkiv" level="document" name="type"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setuptype"/> @@ -43308,7 +43845,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="buff-ver.mkiv" name="type" variant="angles"> + <cd:command category="verbatim" file="buff-ver.mkiv" level="document" name="type" variant="angles"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setuptype"/> @@ -43316,7 +43853,7 @@ <cd:angles/> </cd:arguments> </cd:command> - <cd:command file="buff-ver.mkiv" name="typ"> + <cd:command category="verbatim" file="buff-ver.mkiv" level="document" name="typ"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setuptype"/> @@ -43324,7 +43861,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="buff-ver.mkiv" name="typ" variant="angles"> + <cd:command category="verbatim" file="buff-ver.mkiv" level="document" name="typ" variant="angles"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setuptype"/> @@ -43332,7 +43869,7 @@ <cd:angles/> </cd:arguments> </cd:command> - <cd:command file="buff-ver.mkiv" generated="yes" name="type" variant="example"> + <cd:command category="verbatim" file="buff-ver.mkiv" generated="yes" level="document" name="type" variant="example"> <cd:sequence> <cd:variable value="type"/> </cd:sequence> @@ -43343,7 +43880,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="buff-ver.mkiv" generated="yes" name="type" variant="example:angles"> + <cd:command category="verbatim" file="buff-ver.mkiv" generated="yes" level="document" name="type" variant="example:angles"> <cd:sequence> <cd:variable value="type"/> </cd:sequence> @@ -43354,7 +43891,7 @@ <cd:angles/> </cd:arguments> </cd:command> - <cd:command file="buff-ver.mkiv" name="definetyping"> + <cd:command category="verbatim" file="buff-ver.mkiv" level="style" name="definetyping"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -43367,7 +43904,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="buff-ver.mkiv" name="setuptyping"> + <cd:command category="verbatim" file="buff-ver.mkiv" level="style" name="setuptyping"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -43393,7 +43930,7 @@ <cd:constant type="nested"/> <cd:constant type="tex"/> <cd:constant type="context"/> - <cd:constant default="yes" type="none"/> + <cd:constant type="none"/> <cd:constant type="cd:name"/> </cd:parameter> <cd:parameter name="style"> @@ -43478,7 +44015,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="buff-ver.mkiv" generated="yes" name="typing" type="environment" variant="instance"> + <cd:command category="verbatim" file="buff-ver.mkiv" generated="yes" level="document" name="typing" type="environment" variant="instance"> <cd:sequence> <cd:instance value="typing"/> </cd:sequence> @@ -43487,9 +44024,16 @@ <cd:inherit name="setuptyping"/> </cd:assignments> </cd:arguments> - <cd:instances/> + <cd:instances> + <cd:constant value="typing"/> + <cd:constant value="LUA"/> + <cd:constant value="MP"/> + <cd:constant value="PARSEDXML"/> + <cd:constant value="TEX"/> + <cd:constant value="XML"/> + </cd:instances> </cd:command> - <cd:command file="buff-ver.mkiv" generated="yes" name="typing" type="environment" variant="instance:argument"> + <cd:command category="verbatim" file="buff-ver.mkiv" generated="yes" level="document" name="typing" type="environment" variant="instance:argument"> <cd:sequence> <cd:instance value="typing"/> </cd:sequence> @@ -43498,51 +44042,58 @@ <cd:constant type="continue"/> </cd:keywords> </cd:arguments> - <cd:instances/> + <cd:instances> + <cd:constant value="typing"/> + <cd:constant value="LUA"/> + <cd:constant value="MP"/> + <cd:constant value="PARSEDXML"/> + <cd:constant value="TEX"/> + <cd:constant value="XML"/> + </cd:instances> </cd:command> - <cd:command file="buff-ver.mkiv" name="tex"> + <cd:command category="verbatim" file="buff-ver.mkiv" level="document" name="tex"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="buff-ver.mkiv" name="arg"> + <cd:command category="verbatim" file="buff-ver.mkiv" level="document" name="arg"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="buff-ver.mkiv" name="mat"> + <cd:command category="verbatim" file="buff-ver.mkiv" level="document" name="mat"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="buff-ver.mkiv" name="dis"> + <cd:command category="verbatim" file="buff-ver.mkiv" level="document" name="dis"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="buff-ver.mkiv" name="astype"> + <cd:command category="verbatim" file="buff-ver.mkiv" level="system" name="astype"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="buff-ver.mkiv" name="asciistr"> + <cd:command category="verbatim" file="buff-ver.mkiv" level="system" name="asciistr"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="buff-ver.mkiv" name="verbatim"> + <cd:command category="verbatim" file="buff-ver.mkiv" level="system" name="verbatim"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="buff-ver.mkiv" name="filename"> + <cd:command category="verbatim" file="buff-ver.mkiv" level="document" name="filename"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:file"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="buff-ver.mkiv" name="typefile"> + <cd:command category="verbatim" file="buff-ver.mkiv" level="document" name="typefile"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -43555,7 +44106,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="buff-ver.mkiv" name="doifelsetypingfile"> + <cd:command category="verbatim" file="buff-ver.mkiv" level="system conditional" name="doifelsetypingfile"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:file"/> @@ -43568,7 +44119,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="buff-ver.mkiv" name="doiftypingfileelse"> + <cd:command category="verbatim" file="buff-ver.mkiv" level="system conditional" name="doiftypingfileelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:file"/> @@ -43583,7 +44134,7 @@ </cd:command> </cd:interface> <cd:interface file="i-version.xml"> - <cd:command file="page-inf.mkiv" name="setupversion"> + <cd:command file="page-inf.mkiv" level="style" name="setupversion"> <cd:arguments> <cd:keywords> <cd:constant type="concept"/> @@ -43594,7 +44145,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-inf.mkiv" name="version"> + <cd:command file="page-inf.mkiv" level="style" name="version"> <cd:arguments> <cd:keywords> <cd:constant type="concept"/> @@ -43605,7 +44156,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-inf.mkiv" name="installversioninfo"> + <cd:command file="page-inf.mkiv" level="system" name="installversioninfo"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -43615,14 +44166,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="page-inf.mkiv" name="includeversioninfo"> + <cd:command file="page-inf.mkiv" level="system" name="includeversioninfo"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-mod.mkvi" name="doifelseolderversion"> + <cd:command category="conditional" file="file-mod.mkvi" level="system" name="doifelseolderversion"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> @@ -43638,7 +44189,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-mod.mkvi" name="doifolderversionelse"> + <cd:command category="conditional" file="file-mod.mkvi" level="system" name="doifolderversionelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> @@ -43654,7 +44205,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-mod.mkvi" name="doifelseoldercontext"> + <cd:command category="conditional" file="file-mod.mkvi" level="system" name="doifelseoldercontext"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> @@ -43667,7 +44218,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="file-mod.mkvi" name="doifoldercontextelse"> + <cd:command category="conditional" file="file-mod.mkvi" level="system" name="doifoldercontextelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:number"/> @@ -43682,7 +44233,7 @@ </cd:command> </cd:interface> <cd:interface file="i-viewerlayer.xml"> - <cd:command file="attr-lay.mkiv" name="defineviewerlayer"> + <cd:command category="pdf" file="attr-lay.mkiv" level="style" name="defineviewerlayer"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -43695,7 +44246,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="attr-lay.mkiv" name="setupviewerlayer"> + <cd:command category="pdf" file="attr-lay.mkiv" level="style" name="setupviewerlayer"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="title"> @@ -43724,19 +44275,19 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="attr-lay.mkiv" name="viewerlayer" type="environment"> + <cd:command category="pdf" file="attr-lay.mkiv" level="document" name="viewerlayer" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="attr-lay.mkiv" generated="yes" name="viewerlayer" type="environment" variant="example"> + <cd:command category="pdf" file="attr-lay.mkiv" generated="yes" level="document" name="viewerlayer" type="environment" variant="example"> <cd:sequence> <cd:variable value="viewerlayer"/> </cd:sequence> </cd:command> - <cd:command file="attr-lay.mkiv" name="viewerlayer"> + <cd:command category="pdf" file="attr-lay.mkiv" level="document" name="viewerlayer"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -43744,10 +44295,10 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="attr-lay.mkiv" name="showlayoutcomponents"/> + <cd:command category="pdf" file="attr-lay.mkiv" level="document" name="showlayoutcomponents"/> </cd:interface> <cd:interface file="i-visualizer.xml"> - <cd:command file="trac-vis.mkiv" name="ruledhbox"> + <cd:command file="trac-vis.mkiv" level="system" name="ruledhbox"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -43755,7 +44306,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="trac-vis.mkiv" name="ruledvbox"> + <cd:command file="trac-vis.mkiv" level="system" name="ruledvbox"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -43763,7 +44314,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="trac-vis.mkiv" name="ruledvtop"> + <cd:command file="trac-vis.mkiv" level="system" name="ruledvtop"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -43771,7 +44322,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="trac-vis.mkiv" name="ruledtopv"> + <cd:command file="trac-vis.mkiv" level="system" name="ruledtopv"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -43779,7 +44330,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="trac-vis.mkiv" name="ruledhpack"> + <cd:command file="trac-vis.mkiv" level="system" name="ruledhpack"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -43787,7 +44338,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="trac-vis.mkiv" name="ruledvpack"> + <cd:command file="trac-vis.mkiv" level="system" name="ruledvpack"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -43795,7 +44346,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="trac-vis.mkiv" name="ruledtpack"> + <cd:command file="trac-vis.mkiv" level="system" name="ruledtpack"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -43803,12 +44354,12 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="trac-vis.mkiv" name="ruledmbox"> + <cd:command file="trac-vis.mkiv" level="system" name="ruledmbox"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="trac-vis.mkiv" name="filledhboxr"> + <cd:command file="trac-vis.mkiv" level="system" name="filledhboxr"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -43816,7 +44367,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="trac-vis.mkiv" name="filledhboxg"> + <cd:command file="trac-vis.mkiv" level="system" name="filledhboxg"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -43824,7 +44375,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="trac-vis.mkiv" name="filledhboxb"> + <cd:command file="trac-vis.mkiv" level="system" name="filledhboxb"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -43832,7 +44383,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="trac-vis.mkiv" name="filledhboxc"> + <cd:command file="trac-vis.mkiv" level="system" name="filledhboxc"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -43840,7 +44391,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="trac-vis.mkiv" name="filledhboxm"> + <cd:command file="trac-vis.mkiv" level="system" name="filledhboxm"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -43848,7 +44399,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="trac-vis.mkiv" name="filledhboxy"> + <cd:command file="trac-vis.mkiv" level="system" name="filledhboxy"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -43856,7 +44407,7 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="trac-vis.mkiv" name="filledhboxk"> + <cd:command file="trac-vis.mkiv" level="system" name="filledhboxk"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="cd:text"/> @@ -43864,12 +44415,13 @@ <cd:content/> </cd:arguments> </cd:command> - <cd:command file="trc-vis.mkiv" name="showmakeup"> + <cd:command file="trc-vis.mkiv" level="document" name="showmakeup"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant default="yes" type="makeup"/> <cd:constant type="all"/> <cd:constant type="boxes"/> + <cd:constant type="line"/> <cd:constant type="glyph"/> <cd:constant type="fontkern"/> <cd:constant type="hbox"/> @@ -43892,21 +44444,22 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="trc-vis.mkiv" name="showallmakeup"/> - <cd:command file="trc-vis.mkiv" name="showboxes"/> - <cd:command file="trc-vis.mkiv" name="showglyphs"/> - <cd:command file="trc-vis.mkiv" name="showfontkerns"/> - <cd:command file="trc-vis.mkiv" name="setvisualizerfont"> + <cd:command file="trc-vis.mkiv" level="document" name="showallmakeup"/> + <cd:command file="trc-vis.mkiv" level="document" name="showboxes"/> + <cd:command file="trc-vis.mkiv" level="document" name="showglyphs"/> + <cd:command file="trc-vis.mkiv" level="document" name="showfontkerns"/> + <cd:command file="trc-vis.mkiv" level="document" name="showfontitalics"/> + <cd:command file="trc-vis.mkiv" level="system" name="setvisualizerfont"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:font"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="trc-vis.mkiv" name="resetvisualizers"/> + <cd:command file="trc-vis.mkiv" level="system" name="resetvisualizers"/> </cd:interface> <cd:interface file="i-vspace.xml"> - <cd:command file="spac-ver.mkiv" name="definevspacingamount"> + <cd:command category="whitespace" file="spac-ver.mkiv" level="system" name="definevspacingamount"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -43919,7 +44472,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="definevspacing"> + <cd:command category="whitespace" file="spac-ver.mkiv" level="system" name="definevspacing"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -43929,7 +44482,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="vspacing"> + <cd:command category="whitespace" file="spac-ver.mkiv" level="system" name="vspacing"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="preference"/> @@ -43939,6 +44492,7 @@ <cd:constant type="enable"/> <cd:constant type="disable"/> <cd:constant type="nowhite"/> + <cd:constant type="packed"/> <cd:constant type="back"/> <cd:constant type="overlay"/> <cd:constant type="always"/> @@ -43980,42 +44534,86 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="directvspacing"> + <cd:command category="whitespace" file="spac-ver.mkiv" level="system" name="directvspacing"> <cd:arguments> <cd:keywords delimiters="braces" list="yes"> <cd:inherit name="vspacing"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="setupvspacing"> + <cd:command category="whitespace" file="spac-ver.mkiv" level="system" name="setupvspacing"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:inherit name="vspacing"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="setupblank"> + <cd:command category="whitespace" file="spac-ver.mkiv" level="style" name="setupblank"> <cd:arguments> <cd:keywords list="yes" optional="yes"> - <cd:inherit name="vspacing"/> + <cd:inherit name="blank"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="blank"> + <cd:command category="whitespace" file="spac-ver.mkiv" level="document" name="blank"> <cd:arguments> <cd:keywords list="yes" optional="yes"> - <cd:inherit name="vspacing"/> + <cd:constant type="preference"/> + <cd:constant type="samepage"/> + <cd:constant type="max"/> + <cd:constant type="force"/> + <cd:constant type="enable"/> + <cd:constant type="disable"/> + <cd:constant type="nowhite"/> + <cd:constant type="back"/> + <cd:constant type="overlay"/> + <cd:constant type="always"/> + <cd:constant type="weak"/> + <cd:constant type="strong"/> + <cd:constant type="default"/> + <cd:constant type="before"/> + <cd:constant type="inbetween"/> + <cd:constant type="after"/> + <cd:constant type="fixed"/> + <cd:constant type="flexible"/> + <cd:constant type="none"/> + <cd:constant type="small"/> + <cd:constant type="medium"/> + <cd:constant type="big"/> + <cd:constant type="line"/> + <cd:constant type="halfline"/> + <cd:constant type="quarterline"/> + <cd:constant type="formula"/> + <cd:constant type="white"/> + <cd:constant type="height"/> + <cd:constant type="depth"/> + <cd:constant type="standard"/> + <cd:constant method="factor" prefix="cd:number" type="small"/> + <cd:constant method="factor" prefix="cd:number" type="medium"/> + <cd:constant method="factor" prefix="cd:number" type="big"/> + <cd:constant method="factor" prefix="cd:number" type="line"/> + <cd:constant method="factor" prefix="cd:number" type="halfline"/> + <cd:constant method="factor" prefix="cd:number" type="quarterline"/> + <cd:constant method="factor" prefix="cd:number" type="formula"/> + <cd:constant method="factor" prefix="cd:number" type="white"/> + <cd:constant method="factor" prefix="cd:number" type="height"/> + <cd:constant method="factor" prefix="cd:number" type="depth"/> + <cd:constant method="range" prefix="category" type="cd:number"/> + <cd:constant method="range" prefix="order" type="cd:number"/> + <cd:constant method="range" prefix="penalty" type="cd:number"/> + <cd:constant type="cd:dimension"/> + <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="useblankparameter"> + <cd:command category="whitespace" file="spac-ver.mkiv" level="system" name="useblankparameter"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="inhibitblank"/> - <cd:command file="spac-ver.mkiv" name="synchronizeblank"/> - <cd:command file="spac-ver.mkiv" name="definevspace"> + <cd:command category="whitespace" file="spac-ver.mkiv" level="system" name="inhibitblank"/> + <cd:command category="whitespace" file="spac-ver.mkiv" level="system" name="synchronizeblank"/> + <cd:command category="whitespace" file="spac-ver.mkiv" level="style" name="definevspace"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -44028,7 +44626,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="vspace"> + <cd:command category="whitespace" file="spac-ver.mkiv" level="document" name="vspace"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -44038,26 +44636,26 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="godown"> + <cd:command category="whitespace" file="spac-ver.mkiv" level="document" name="godown"> <cd:arguments> <cd:keywords> <cd:constant type="cd:dimension"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="vglue"> + <cd:command category="whitespace" file="spac-ver.mkiv" level="system" name="vglue"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:dimension"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="smallskip"/> - <cd:command file="spac-ver.mkiv" name="medskip"/> - <cd:command file="spac-ver.mkiv" name="bigskip"/> + <cd:command category="whitespace" file="spac-ver.mkiv" level="system" name="smallskip"/> + <cd:command category="whitespace" file="spac-ver.mkiv" level="system" name="medskip"/> + <cd:command category="whitespace" file="spac-ver.mkiv" level="system" name="bigskip"/> </cd:interface> <cd:interface file="i-whitespace.xml"> - <cd:command file="spac-ver.mkiv" name="setupwhitespace"> + <cd:command category="whitespace" file="spac-ver.mkiv" level="style" name="setupwhitespace"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="fix"/> @@ -44075,21 +44673,21 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="synchronizewhitespace"/> - <cd:command file="spac-ver.mkiv" name="correctwhitespace"> + <cd:command category="whitespace" file="spac-ver.mkiv" level="system" name="synchronizewhitespace"/> + <cd:command category="whitespace" file="spac-ver.mkiv" level="system" name="correctwhitespace"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="packed" type="environment"> + <cd:command category="whitespace" file="spac-ver.mkiv" level="document" name="packed" type="environment"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="blank"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="unpacked" type="environment"/> - <cd:command file="spac-ver.mkiv" name="linecorrection" type="environment"> + <cd:command category="whitespace" file="spac-ver.mkiv" name="unpacked" type="environment"/> + <cd:command category="whitespace" file="spac-ver.mkiv" level="document" name="linecorrection" type="environment"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="blank"/> @@ -44097,7 +44695,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="spac-ver.mkiv" name="locallinecorrection" type="environment"> + <cd:command category="whitespace" file="spac-ver.mkiv" name="locallinecorrection" type="environment"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="blank"/> @@ -44107,21 +44705,21 @@ </cd:command> </cd:interface> <cd:interface file="i-xml.xml"> - <cd:command name="xmlmain"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlmain"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlflush"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlflush"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmltext"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmltext"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> @@ -44131,7 +44729,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlpure"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlpure"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> @@ -44141,21 +44739,21 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlflushtext"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlflushtext"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlflushpure"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlflushpure"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlnonspace"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlnonspace"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> @@ -44165,21 +44763,21 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlflushspacewise"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlflushspacewise"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlflushlinewise"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlflushlinewise"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlall"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlall"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> @@ -44189,8 +44787,8 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmllastmatch"/> - <cd:command name="xmlfirst"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmllastmatch"/> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlfirst"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> @@ -44200,7 +44798,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmllast"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmllast"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> @@ -44210,7 +44808,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlcontext"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlcontext"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> @@ -44220,28 +44818,28 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlflushcontext"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlflushcontext"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlshow"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlshow"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlinfo"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlinfo"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlfilter"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlfilter"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> @@ -44251,7 +44849,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlstrip"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlstrip"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> @@ -44261,7 +44859,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlstripped"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlstripped"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> @@ -44271,7 +44869,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlstripnolines"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlstripnolines"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> @@ -44281,7 +44879,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlstrippednolines"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlstrippednolines"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> @@ -44291,7 +44889,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlposition"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlposition"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> @@ -44304,7 +44902,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlelement"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlelement"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> @@ -44314,14 +44912,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlpos"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlpos"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlsnippet"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlsnippet"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> @@ -44331,7 +44929,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlconcat"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlconcat"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> @@ -44344,7 +44942,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlconcatrange"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlconcatrange"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> @@ -44363,7 +44961,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlcommand"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlcommand"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> @@ -44376,52 +44974,114 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlinlineverbatim"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlinlineverbatim"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlinlineverbatim" type="environment"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlinlineverbatim" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmldisplayverbatim"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmldisplayverbatim"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmldisplayverbatim" type="environment"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmldisplayverbatim" type="environment"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlverbatim"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlverbatim"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:node"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlprettyprint"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:node"/> + </cd:keywords> + <cd:keywords delimiters="braces"> + <cd:constant type="mp"/> + <cd:constant type="lua"/> + <cd:constant type="xml"/> + <cd:constant type="parsed-xml"/> + <cd:constant type="nested"/> + <cd:constant type="tex"/> + <cd:constant type="context"/> + <cd:constant type="none"/> + <cd:constant type="cd:name"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlprettyprinttext"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> </cd:keywords> + <cd:keywords delimiters="braces"> + <cd:constant type="mp"/> + <cd:constant type="lua"/> + <cd:constant type="xml"/> + <cd:constant type="parsed-xml"/> + <cd:constant type="nested"/> + <cd:constant type="tex"/> + <cd:constant type="context"/> + <cd:constant type="none"/> + <cd:constant type="cd:name"/> + </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlprettyprint"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlinlineprettyprint"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> </cd:keywords> <cd:keywords delimiters="braces"> + <cd:constant type="mp"/> + <cd:constant type="lua"/> + <cd:constant type="xml"/> + <cd:constant type="parsed-xml"/> + <cd:constant type="nested"/> + <cd:constant type="tex"/> + <cd:constant type="context"/> + <cd:constant type="none"/> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlloadfile"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlinlineprettyprinttext"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:node"/> + </cd:keywords> + <cd:keywords delimiters="braces"> + <cd:constant type="mp"/> + <cd:constant type="lua"/> + <cd:constant type="xml"/> + <cd:constant type="parsed-xml"/> + <cd:constant type="nested"/> + <cd:constant type="tex"/> + <cd:constant type="context"/> + <cd:constant type="none"/> + <cd:constant type="cd:name"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlloadfile"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -44434,7 +45094,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlloadbuffer"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlloadbuffer"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:buffer"/> @@ -44447,7 +45107,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlloaddata"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlloaddata"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -44460,7 +45120,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlloadonly"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlloadonly"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -44473,7 +45133,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlprocessfile"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlprocessfile"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -44486,7 +45146,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlprocessbuffer"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlprocessbuffer"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:buffer"/> @@ -44499,7 +45159,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlprocessdata"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlprocessdata"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -44512,7 +45172,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlinclude"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlinclude"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> @@ -44525,42 +45185,42 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlname"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlname"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlpath"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlpath"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlnamespace"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlnamespace"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmltag"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmltag"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlcount"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlcount"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlatt"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlatt"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> @@ -44570,7 +45230,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlattdef"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlsetatt"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> @@ -44583,7 +45243,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlrefatt"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlattdef"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> @@ -44591,10 +45251,36 @@ <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:text"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlrefatt"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:node"/> + </cd:keywords> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:name"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmllastatt"/> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlattribute"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:node"/> + </cd:keywords> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:lpath"/> + </cd:keywords> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:name"/> + </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmllastatt"/> - <cd:command name="xmlattribute"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlsetattribute"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> @@ -44605,9 +45291,12 @@ <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:text"/> + </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlattributedef"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlattributedef"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> @@ -44623,7 +45312,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlchainatt"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlchainatt"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> @@ -44633,7 +45322,20 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlchainattdef"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlchainattdef"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:node"/> + </cd:keywords> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:name"/> + </cd:keywords> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:text"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlpar"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> @@ -44641,33 +45343,73 @@ <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlsetpar"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:node"/> + </cd:keywords> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:name"/> + </cd:keywords> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:text"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlparam"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:node"/> + </cd:keywords> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:lpath"/> + </cd:keywords> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:name"/> + </cd:keywords> + </cd:arguments> + </cd:command> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlsetparam"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:node"/> + </cd:keywords> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:lpath"/> + </cd:keywords> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:name"/> + </cd:keywords> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmldirectives"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmllastpar"/> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmldirectives"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmldirectivesbefore"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmldirectivesbefore"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmldirectivesafter"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmldirectivesafter"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlinstalldirective"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlinstalldirective"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -44677,7 +45419,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlsetup"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlsetup"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> @@ -44687,7 +45429,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlsetsetup"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlsetsetup"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -44700,14 +45442,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlremovesetup"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlremovesetup"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:setup"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlremovedocumentsetup"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlremovedocumentsetup"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -44717,7 +45459,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlflushdocumentsetups"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlflushdocumentsetups"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -44727,35 +45469,35 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlresetsetups"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlresetsetups"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlresetdocumentsetups"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlresetdocumentsetups"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlprependsetup"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlprependsetup"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:setup"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlappendsetup"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlappendsetup"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:setup"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlbeforesetup"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlbeforesetup"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:setup"/> @@ -44765,7 +45507,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlaftersetup"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlaftersetup"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:setup"/> @@ -44775,7 +45517,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlprependdocumentsetup"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlprependdocumentsetup"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -44785,7 +45527,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlappenddocumentsetup"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlappenddocumentsetup"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -44795,7 +45537,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlbeforedocumentsetup"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlbeforedocumentsetup"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -44808,7 +45550,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlafterdocumentsetup"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlafterdocumentsetup"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -44821,8 +45563,8 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlregisteredsetups"/> - <cd:command name="xmlregistereddocumentsetups"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlregisteredsetups"/> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlregistereddocumentsetups"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -44832,7 +45574,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlsetfunction"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlsetfunction"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> @@ -44845,7 +45587,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmldoif"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmldoif"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> @@ -44858,7 +45600,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmldoifnot"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmldoifnot"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> @@ -44871,7 +45613,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmldoifelse"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmldoifelse"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> @@ -44887,7 +45629,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmldoiftext"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmldoiftext"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> @@ -44900,7 +45642,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmldoifnottext"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmldoifnottext"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> @@ -44913,7 +45655,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmldoifelsetext"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmldoifelsetext"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> @@ -44929,7 +45671,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmldoifselfempty"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmldoifselfempty"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> @@ -44939,7 +45681,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmldoifnotselfempty"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmldoifnotselfempty"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> @@ -44949,7 +45691,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmldoifelseselfempty"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmldoifelseselfempty"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> @@ -44962,7 +45704,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmldoifelseempty"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmldoifelseempty"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> @@ -44978,7 +45720,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlregisterns"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlregisterns"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -44988,7 +45730,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlregisterns"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlregisterns"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -44998,7 +45740,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlremapname"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlremapname"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> @@ -45014,7 +45756,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlremapnamespace"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlremapnamespace"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> @@ -45027,7 +45769,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlchecknamespace"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlchecknamespace"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> @@ -45037,7 +45779,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlmapvalue"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlmapvalue"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:category"/> @@ -45050,7 +45792,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlvalue"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlvalue"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:category"/> @@ -45063,7 +45805,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmldoifelsevalue"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmldoifelsevalue"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:category"/> @@ -45079,14 +45821,14 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlloaddirectives"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlloaddirectives"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:file"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlsave"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlsave"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> @@ -45096,7 +45838,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmltofile"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmltofile"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> @@ -45109,7 +45851,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmltobuffer"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmltobuffer"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> @@ -45122,7 +45864,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmltobufferverbose"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmltobufferverbose"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> @@ -45135,65 +45877,65 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmladdindex"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmladdindex"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlinclusion"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlinclusion"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlinclusions"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlinclusions"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlbadinclusions"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlbadinclusions"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlraw"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlraw"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlraw" type="environment"/> - <cd:command name="xmlresetinjectors"/> - <cd:command name="xmlsetinjectors"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlraw" type="environment"/> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlresetinjectors"/> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlsetinjectors"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlinjector"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlinjector"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlapplyselectors"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlapplyselectors"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlsetentity"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmlsetentity"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -45203,7 +45945,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmltexentity"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmltexentity"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:name"/> @@ -45213,7 +45955,7 @@ </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="setupxml"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="setupxml"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="default"> @@ -45228,7 +45970,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command name="xmldefaulttotext"> + <cd:command category="xml" file="lxml-ini.mkiv" level="style" name="xmldefaulttotext"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:node"/> @@ -45237,7 +45979,7 @@ </cd:command> </cd:interface> <cd:interface file="i-xtable.xml"> - <cd:command file="tabl-xtb.mkvi" name="definextable"> + <cd:command category="tables" file="tabl-xtb.mkvi" level="style" name="definextable"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -45250,7 +45992,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="tabl-xtb.mkvi" name="setupxtable"> + <cd:command category="tables" file="tabl-xtb.mkvi" level="style" name="setupxtable"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -45319,35 +46061,35 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="tabl-xtb.mkvi" name="xtable" type="environment"> + <cd:command category="tables" file="tabl-xtb.mkvi" level="document" name="xtable" type="environment"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupxtable"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="tabl-xtb.mkvi" name="xtable" type="environment" variant="name"> + <cd:command category="tables" file="tabl-xtb.mkvi" level="document" name="xtable" type="environment" variant="name"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="tabl-xtb.mkvi" name="embeddedxtable" type="environment"> + <cd:command category="tables" file="tabl-xtb.mkvi" level="style" name="embeddedxtable" type="environment"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupxtable"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="tabl-xtb.mkvi" name="embeddedxtable" type="environment" variant="name"> + <cd:command category="tables" file="tabl-xtb.mkvi" level="style" name="embeddedxtable" type="environment" variant="name"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="tabl-xtb.mkvi" generated="yes" name="xtable" type="environment" variant="example"> + <cd:command category="tables" file="tabl-xtb.mkvi" generated="yes" level="document" name="xtable" type="environment" variant="example"> <cd:sequence> <cd:variable value="xtable"/> </cd:sequence> @@ -45357,14 +46099,14 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="tabl-xtb.mkvi" name="processxtablebuffer"> + <cd:command category="tables" file="tabl-xtb.mkvi" level="document" name="processxtablebuffer"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="tabl-xtb.mkvi" name="xrow" type="environment"> + <cd:command category="tables" file="tabl-xtb.mkvi" level="document" name="xrow" type="environment"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -45374,7 +46116,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="tabl-xtb.mkvi" name="xcell" type="environment"> + <cd:command category="tables" file="tabl-xtb.mkvi" level="document" name="xcell" type="environment"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -45396,63 +46138,63 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="tabl-xtb.mkvi" name="xtablehead" type="environment"> + <cd:command category="tables" file="tabl-xtb.mkvi" level="document" name="xtablehead" type="environment"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupxtable"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="tabl-xtb.mkvi" name="xtablehead" type="environment" variant="name"> + <cd:command category="tables" file="tabl-xtb.mkvi" level="document" name="xtablehead" type="environment" variant="name"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="tabl-xtb.mkvi" name="xtablefoot" type="environment"> + <cd:command category="tables" file="tabl-xtb.mkvi" level="document" name="xtablefoot" type="environment"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupxtable"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="tabl-xtb.mkvi" name="xtablefoot" type="environment" variant="name"> + <cd:command category="tables" file="tabl-xtb.mkvi" level="document" name="xtablefoot" type="environment" variant="name"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="tabl-xtb.mkvi" name="xtablenext" type="environment"> + <cd:command category="tables" file="tabl-xtb.mkvi" level="document" name="xtablenext" type="environment"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupxtable"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="tabl-xtb.mkvi" name="xtablenext" type="environment" variant="name"> + <cd:command category="tables" file="tabl-xtb.mkvi" level="document" name="xtablenext" type="environment" variant="name"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="tabl-xtb.mkvi" name="xtablebody" type="environment"> + <cd:command category="tables" file="tabl-xtb.mkvi" level="document" name="xtablebody" type="environment"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupxtable"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="tabl-xtb.mkvi" name="xtablebody" type="environment" variant="name"> + <cd:command category="tables" file="tabl-xtb.mkvi" level="document" name="xtablebody" type="environment" variant="name"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command file="tabl-xtb.mkvi" name="xgroup" type="environment"> + <cd:command category="tables" file="tabl-xtb.mkvi" level="document" name="xgroup" type="environment"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -45462,7 +46204,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="tabl-xtb.mkvi" name="xrowgroup" type="environment"> + <cd:command category="tables" file="tabl-xtb.mkvi" level="document" name="xrowgroup" type="environment"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -45472,7 +46214,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="tabl-xtb.mkvi" name="xcellgroup" type="environment"> + <cd:command category="tables" file="tabl-xtb.mkvi" level="document" name="xcellgroup" type="environment"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -45482,7 +46224,7 @@ </cd:assignments> </cd:arguments> </cd:command> - <cd:command file="tabl-xtb.mkvi" name="currentxtablerow"/> - <cd:command file="tabl-xtb.mkvi" name="currentxtablecolumn"/> + <cd:command category="tables" file="tabl-xtb.mkvi" level="system" name="currentxtablerow"/> + <cd:command category="tables" file="tabl-xtb.mkvi" level="system" name="currentxtablecolumn"/> </cd:interface> </cd:interface> diff --git a/tex/context/interface/mkiv/i-accent.xml b/tex/context/interface/mkiv/i-accent.xml index b947dfc12..190e1faa9 100644 --- a/tex/context/interface/mkiv/i-accent.xml +++ b/tex/context/interface/mkiv/i-accent.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="defineaccent" file="enco-ini.mkiv"> + <cd:command name="defineaccent" level="style" file="enco-ini.mkiv"> <cd:arguments> <cd:resolve name="string-character"/> <cd:resolve name="string-character"/> @@ -12,138 +12,150 @@ </cd:arguments> </cd:command> - <cd:command name="definecharacter" file="enco-ini.mkiv"> + <cd:command name="definecharacter" level="style" file="enco-ini.mkiv"> <cd:arguments> <cd:resolve name="string-character"/> <cd:resolve name="string-number"/> </cd:arguments> </cd:command> - <cd:command name="definecommand" file="enco-ini.mkiv"> + <cd:command name="definecommand" level="style" file="enco-ini.mkiv"> <cd:arguments> <cd:resolve name="string-character"/> <cd:resolve name="string-command"/> </cd:arguments> </cd:command> - <cd:command name="definemathaccent" file="enco-ini.mkiv"> + <cd:command name="definemathaccent" level="style" file="enco-ini.mkiv"> <cd:arguments> <cd:resolve name="string-name"/> <cd:resolve name="string-character"/> </cd:arguments> </cd:command> - <cd:command name="buildmathaccent" file="enco-ini.mkiv"> + <cd:command name="buildmathaccent" level="style" file="enco-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-character"/> <cd:resolve name="argument-character"/> </cd:arguments> </cd:command> - <cd:command name="buildtextaccent" file="enco-ini.mkiv"> + <cd:command name="buildtextaccent" level="style" file="enco-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-character"/> <cd:resolve name="argument-character"/> </cd:arguments> </cd:command> - <cd:command name="buildtextmacron" file="enco-ini.mkiv"> + <cd:command name="buildtextmacron" level="style" file="enco-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-character"/> </cd:arguments> </cd:command> - <cd:command name="buildtextbottomdot" file="enco-ini.mkiv"> + <cd:command name="buildtextbottomdot" level="style" file="enco-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-character"/> </cd:arguments> </cd:command> - <cd:command name="buildtextcedilla" file="enco-ini.mkiv"> + <cd:command name="buildtextcedilla" level="style" file="enco-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-character"/> </cd:arguments> </cd:command> - <cd:command name="buildtextognek" file="enco-ini.mkiv"> + <cd:command name="buildtextognek" level="style" file="enco-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-character"/> </cd:arguments> </cd:command> - <cd:command name="buildtextbottomcomma" file="enco-ini.mkiv"> + <cd:command name="buildtextbottomcomma" level="style" file="enco-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-character"/> </cd:arguments> </cd:command> - <cd:command name="d" file="enco-ini.mkiv"> + <cd:command name="d" level="style" file="enco-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-character"/> </cd:arguments> </cd:command> - <cd:command name="buildtextgrave" file="enco-ini.mkiv"> + <cd:command name="buildtextgrave" level="style" file="enco-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-character"/> </cd:arguments> </cd:command> - <cd:command name="acute" file="enco-ini.mkiv"> + <cd:command name="acute" category="mathematics" level="document" file="math-acc.mkvi"> <cd:arguments> <cd:resolve name="argument-character"/> </cd:arguments> </cd:command> - <cd:command name="grave" file="enco-ini.mkiv"> + <cd:command name="grave" category="mathematics" level="document" file="math-acc.mkvi"> <cd:arguments> <cd:resolve name="argument-character"/> </cd:arguments> </cd:command> - <cd:command name="ddot" file="enco-ini.mkiv"> + <cd:command name="ddot" category="mathematics" level="document" file="math-acc.mkvi"> <cd:arguments> <cd:resolve name="argument-character"/> </cd:arguments> </cd:command> - <cd:command name="tilde" file="enco-ini.mkiv"> + <cd:command name="tilde" category="mathematics" level="document" file="math-acc.mkvi"> <cd:arguments> <cd:resolve name="argument-character"/> </cd:arguments> </cd:command> - <cd:command name="bar" file="enco-ini.mkiv"> + <cd:command name="bar" category="mathematics" level="document" file="math-acc.mkvi"> <cd:arguments> <cd:resolve name="argument-character"/> </cd:arguments> </cd:command> - <cd:command name="breve" file="enco-ini.mkiv"> + <cd:command name="breve" category="mathematics" level="document" file="math-acc.mkvi"> <cd:arguments> <cd:resolve name="argument-character"/> </cd:arguments> </cd:command> - <cd:command name="check" file="enco-ini.mkiv"> + <cd:command name="check" category="mathematics" level="document" file="math-acc.mkvi"> <cd:arguments> <cd:resolve name="argument-character"/> </cd:arguments> </cd:command> - <cd:command name="hat" file="enco-ini.mkiv"> + <cd:command name="hat" category="mathematics" level="document" file="math-acc.mkvi"> <cd:arguments> <cd:resolve name="argument-character"/> </cd:arguments> </cd:command> - <cd:command name="vec" file="enco-ini.mkiv"> + <cd:command name="vec" category="mathematics" level="document" file="math-acc.mkvi"> <cd:arguments> <cd:resolve name="argument-character"/> </cd:arguments> </cd:command> - <cd:command name="dot" file="enco-ini.mkiv"> + <cd:command name="dot" category="mathematics" level="document" file="math-acc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-character"/> + </cd:arguments> + </cd:command> + + <cd:command name="ring" category="mathematics" level="document" file="math-acc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-character"/> + </cd:arguments> + </cd:command> + + <cd:command name="dddot" category="mathematics" level="document" file="math-acc.mkvi"> <cd:arguments> <cd:resolve name="argument-character"/> </cd:arguments> @@ -249,4 +261,4 @@ --> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-align.xml b/tex/context/interface/mkiv/i-align.xml index d8b75a463..669b845b9 100644 --- a/tex/context/interface/mkiv/i-align.xml +++ b/tex/context/interface/mkiv/i-align.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="setupalign" file="spac-ali.mkiv"> + <cd:command name="setupalign" category="alignment" level="style" file="spac-ali.mkiv"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="broad"/> @@ -53,9 +53,13 @@ <cd:constant type="stretch"/> <cd:constant type="extremestretch"/> <cd:constant type="final"/> + <cd:constant type="1*final"/> <cd:constant type="2*final"/> <cd:constant type="3*final"/> <cd:constant type="4*final"/> + <cd:constant type="more"/> + <cd:constant type="1*more"/> + <cd:constant type="2*more"/> <!-- <cd:constant type="cd:name"/> --> @@ -63,13 +67,13 @@ </cd:arguments> </cd:command> - <cd:command name="usealignparameter" file="spac-ali.mkiv"> + <cd:command name="usealignparameter" level="system" category="alignment" file="spac-ali.mkiv"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="alignment" type="environment" file="spac-ali.mkiv"> + <cd:command name="alignment" type="environment" category="alignment" level="document" file="spac-ali.mkiv"> <cd:arguments> <cd:keywords list="yes"> <cd:inherit name="setupalign"/> @@ -77,7 +81,7 @@ </cd:arguments> </cd:command> - <cd:command name="linealignment" type="environment" file="spac-ali.mkiv"> + <cd:command name="linealignment" type="environment" category="alignment" level="document" file="spac-ali.mkiv"> <cd:arguments> <cd:keywords> <cd:constant type="left"/> @@ -88,55 +92,55 @@ </cd:arguments> </cd:command> - <cd:command name="leftaligned" type="environment" file="spac-ali.mkiv"/> + <cd:command name="leftaligned" type="environment" category="alignment" level="document" file="spac-ali.mkiv"/> - <cd:command name="middlealigned" type="environment" file="spac-ali.mkiv"/> + <cd:command name="middlealigned" type="environment" category="alignment" level="document" file="spac-ali.mkiv"/> - <cd:command name="rightaligned" type="environment" file="spac-ali.mkiv"/> + <cd:command name="rightaligned" type="environment" category="alignment" level="document" file="spac-ali.mkiv"/> - <cd:command name="maxaligned" type="environment" file="spac-ali.mkiv"/> + <cd:command name="maxaligned" type="environment" category="alignment" level="document" file="spac-ali.mkiv"/> - <cd:command name="midaligned" type="environment" file="spac-ali.mkiv"/> + <cd:command name="midaligned" type="environment" category="alignment" level="document" file="spac-ali.mkiv"/> - <cd:command name="centeraligned" type="environment" file="spac-ali.mkiv"/> + <cd:command name="centeraligned" type="environment" category="alignment" level="document" file="spac-ali.mkiv"/> - <cd:command name="leftaligned" file="spac-ali.mkiv"> + <cd:command name="leftaligned" category="alignment" level="document" file="spac-ali.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="rightaligned" file="spac-ali.mkiv"> + <cd:command name="rightaligned" category="alignment" level="document" file="spac-ali.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="middlealigned" file="spac-ali.mkiv"> + <cd:command name="middlealigned" category="alignment" level="document" file="spac-ali.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="maxaligned" file="spac-ali.mkiv"> + <cd:command name="maxaligned" category="alignment" level="document" file="spac-ali.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="midaligned" file="spac-ali.mkiv"> + <cd:command name="midaligned" category="alignment" level="document" file="spac-ali.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="centeraligned" file="spac-ali.mkiv"> + <cd:command name="centeraligned" category="alignment" level="document" file="spac-ali.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="alignedline" file="spac-ali.mkiv"> + <cd:command name="alignedline" level="system" category="alignment" file="spac-ali.mkiv"> <cd:arguments> <cd:resolve name="argument-alignline"/> <cd:resolve name="argument-alignline"/> @@ -144,7 +148,7 @@ </cd:arguments> </cd:command> - <cd:command name="wordright" file="spac-ali.mkiv"> + <cd:command name="wordright" category="alignment" level="document" file="spac-ali.mkiv"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="right"/> @@ -154,7 +158,7 @@ </cd:arguments> </cd:command> - <cd:command name="simplealignedbox" file="spac-ali.mkiv"> + <cd:command name="simplealignedbox" level="system" category="alignment" file="spac-ali.mkiv"> <cd:arguments> <cd:resolve name="argument-dimension"/> <cd:resolve name="argument-alignsimple"/> @@ -162,7 +166,7 @@ </cd:arguments> </cd:command> - <cd:command name="simplealignedspreadbox" file="spac-ali.mkiv"> + <cd:command name="simplealignedspreadbox" level="system" category="alignment" file="spac-ali.mkiv"> <cd:arguments> <cd:resolve name="argument-dimension"/> <cd:resolve name="argument-alignsimple"/> @@ -170,7 +174,7 @@ </cd:arguments> </cd:command> - <cd:command name="simplealignedboxplus" file="spac-ali.mkiv"> + <cd:command name="simplealignedboxplus" level="system" category="alignment" file="spac-ali.mkiv"> <cd:arguments> <cd:resolve name="argument-dimension"/> <cd:resolve name="argument-alignsimple"/> @@ -179,7 +183,7 @@ </cd:arguments> </cd:command> - <cd:command name="simplereversealignedbox" file="spac-ali.mkiv"> + <cd:command name="simplereversealignedbox" level="system" category="alignment" file="spac-ali.mkiv"> <cd:arguments> <cd:resolve name="argument-dimension"/> <cd:resolve name="argument-alignsimple"/> @@ -187,7 +191,7 @@ </cd:arguments> </cd:command> - <cd:command name="simplereversealignedboxplus" file="spac-ali.mkiv"> + <cd:command name="simplereversealignedboxplus" level="system" category="alignment" file="spac-ali.mkiv"> <cd:arguments> <cd:resolve name="argument-dimension"/> <cd:resolve name="argument-alignsimple"/> @@ -196,7 +200,7 @@ </cd:arguments> </cd:command> - <cd:command name="alignedbox" file="pack-box.mkiv"> + <cd:command name="alignedbox" level="system" category="alignment" file="pack-box.mkiv"> <cd:arguments> <cd:keywords list="yes"> <cd:resolve name="value-aligned"/> @@ -206,7 +210,7 @@ </cd:arguments> </cd:command> - <cd:command name="aligned" file="pack-box.mkiv"> + <cd:command name="aligned" level="system" category="alignment" file="pack-box.mkiv"> <cd:arguments> <cd:keywords list="yes"> <cd:resolve name="value-aligned"/> @@ -215,62 +219,102 @@ </cd:arguments> </cd:command> - <cd:command name="lefttoright" file="spac-ali.mkiv"/> + <cd:command name="lefttoright" category="alignment" level="style" file="spac-ali.mkiv"/> - <cd:command name="righttoleft" file="spac-ali.mkiv"/> + <cd:command name="righttoleft" category="alignment" level="style" file="spac-ali.mkiv"/> - <cd:command name="raggedbottom" file="spac-ali.mkiv"/> + <cd:command name="raggedbottom" category="alignment" level="style" file="spac-ali.mkiv"/> - <cd:command name="alignbottom" file="spac-ali.mkiv"/> + <cd:command name="alignbottom" category="alignment" level="style" file="spac-ali.mkiv"/> - <cd:command name="baselinebottom" file="spac-ali.mkiv"/> + <cd:command name="baselinebottom" category="alignment" level="style" file="spac-ali.mkiv"/> - <cd:command name="notragged" file="spac-ali.mkiv"/> + <cd:command name="notragged" category="alignment" level="style" file="spac-ali.mkiv"/> - <cd:command name="raggedleft" file="spac-ali.mkiv"/> + <cd:command name="raggedleft" category="alignment" level="style" file="spac-ali.mkiv"/> - <cd:command name="raggedcenter" file="spac-ali.mkiv"/> + <cd:command name="raggedcenter" category="alignment" level="style" file="spac-ali.mkiv"/> - <cd:command name="raggedright" file="spac-ali.mkiv"/> + <cd:command name="raggedright" category="alignment" level="style" file="spac-ali.mkiv"/> - <cd:command name="veryraggedleft" file="spac-ali.mkiv"/> + <cd:command name="veryraggedleft" category="alignment" level="style" file="spac-ali.mkiv"/> - <cd:command name="veryraggedcenter" file="spac-ali.mkiv"/> + <cd:command name="veryraggedcenter" category="alignment" level="style" file="spac-ali.mkiv"/> - <cd:command name="veryraggedright" file="spac-ali.mkiv"/> + <cd:command name="veryraggedright" category="alignment" level="style" file="spac-ali.mkiv"/> - <cd:command name="raggedwidecenter" file="spac-ali.mkiv"/> + <cd:command name="raggedwidecenter" category="alignment" level="style" file="spac-ali.mkiv"/> - <cd:command name="centeredlastline" file="spac-ali.mkiv"/> + <cd:command name="centeredlastline" category="alignment" level="style" file="spac-ali.mkiv"/> - <cd:command name="flushedrightlastline" file="spac-ali.mkiv"/> + <cd:command name="flushedrightlastline" category="alignment" level="style" file="spac-ali.mkiv"/> - <cd:command name="ttraggedright" file="spac-ali.mkiv"/> + <cd:command name="ttraggedright" category="alignment" level="style" file="spac-ali.mkiv"/> - <cd:command name="forgetragged" file="spac-ali.mkiv"/> + <cd:command name="forgetragged" category="alignment" level="style" file="spac-ali.mkiv"/> - <cd:command name="line" file="spac-ali.mkiv"> + <cd:command name="line" category="alignment" level="document" file="spac-ali.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="leftline" file="spac-ali.mkiv"> + <cd:command name="leftline" category="alignment" level="document" file="spac-ali.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="rightline" file="spac-ali.mkiv"> + <cd:command name="rightline" category="alignment" level="document" file="spac-ali.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="centerline" file="spac-ali.mkiv"> + <cd:command name="centerline" category="alignment" level="document" file="spac-ali.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> + <cd:command name="hanging" type="environment" category="alignment" level="document" file="spac-ver.mkiv"> + <cd:arguments> + <cd:assignments list="yes" optional="yes"> + <cd:parameter name="distance"> + <cd:constant type="cd:dimension"/> + </cd:parameter> + <cd:parameter name="n"> + <cd:constant type="cd:number"/> + </cd:parameter> + <cd:parameter name="location"> + <cd:constant type="left" default="yes"/> + <cd:constant type="right"/> + </cd:parameter> + </cd:assignments> + <cd:content/> + </cd:arguments> + </cd:command> + + <cd:command name="hanging" type="environment" variant="argument" category="alignment" level="document" file="spac-ver.mkiv"> + <cd:arguments> + <cd:keywords optional="yes"> + <cd:constant type="left" default="yes"/> + <cd:constant type="right"/> + </cd:keywords> + <cd:content/> + </cd:arguments> + </cd:command> + + <cd:command name="fixed" type="environment" category="alignment" level="document" file="spac-ver.mkiv"> + <cd:arguments> + <cd:keywords optional="yes"> + <cd:constant type="low"/> + <cd:constant type="middle"/> + <cd:constant type="high"/> + <cd:constant type="lohi"/> + <cd:constant type="default" default="yes"/> + </cd:keywords> + </cd:arguments> + </cd:command> + </cd:interface> diff --git a/tex/context/interface/mkiv/i-anchor.xml b/tex/context/interface/mkiv/i-anchor.xml index 342976a3d..c8dad56d5 100644 --- a/tex/context/interface/mkiv/i-anchor.xml +++ b/tex/context/interface/mkiv/i-anchor.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="defineanchor" file="pack-box.mkiv"> + <cd:command name="defineanchor" level="style" file="pack-box.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name"/> @@ -18,7 +18,7 @@ </cd:arguments> </cd:command> - <cd:command name="anchor" file="pack-box.mkiv"> + <cd:command name="anchor" level="document" file="pack-box.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes" optional="yes"> diff --git a/tex/context/interface/mkiv/i-attachment.xml b/tex/context/interface/mkiv/i-attachment.xml index 82056a0ad..85cf8843b 100644 --- a/tex/context/interface/mkiv/i-attachment.xml +++ b/tex/context/interface/mkiv/i-attachment.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="defineattachment" file="scrn-wid.mkvi"> + <cd:command name="defineattachment" level="style" file="scrn-wid.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupattachment" file="scrn-wid.mkvi"> + <cd:command name="setupattachment" level="style" file="scrn-wid.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -85,20 +85,16 @@ </cd:arguments> </cd:command> - <!-- - - <cd:command name="setupattachments" file="scrn-wid.mkvi"> - <cd:arguments> - <cd:resolve name="keyword-name-list-optional"/> - <cd:assignments list="yes"> - <cd:inherit name="setupattachment"/> - </cd:assignments> - </cd:arguments> - </cd:command> - - --> + <cd:command name="setupattachments" level="style" file="scrn-wid.mkvi"> + <cd:arguments> + <cd:resolve name="keyword-name-list-optional"/> + <cd:assignments list="yes"> + <cd:inherit name="setupattachment"/> + </cd:assignments> + </cd:arguments> + </cd:command> - <cd:command name="registerattachment" file="scrn-wid.mkvi"> + <cd:command name="registerattachment" level="document" file="scrn-wid.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes"> @@ -107,9 +103,9 @@ </cd:arguments> </cd:command> - <cd:command name="attachment" generated="yes" variant="example" file="scrn-wid.mkvi"> + <cd:command name="attachment" generated="yes" variant="instance" level="document" file="scrn-wid.mkvi"> <cd:sequence> - <cd:variable value="attachment"/> + <cd:instance value="attachment"/> </cd:sequence> <cd:arguments> <cd:resolve name="keyword-name-optional"/> @@ -118,13 +114,13 @@ </cd:assignments> </cd:arguments> <cd:instances> - <cd:constant value="attachment"/> + <cd:resolve name="instance-attachment"/> </cd:instances> </cd:command> - <cd:command name="attachment" type="environment" generated="yes" variant="example" file="scrn-wid.mkvi"> + <cd:command name="attachment" type="environment" generated="yes" variant="instance" level="document" file="scrn-wid.mkvi"> <cd:sequence> - <cd:variable value="attachment"/> + <cd:instance value="attachment"/> </cd:sequence> <cd:arguments> <cd:resolve name="keyword-name-optional"/> @@ -133,28 +129,32 @@ </cd:assignments> </cd:arguments> <cd:instances> - <cd:constant value="attachment"/> + <cd:resolve name="instance-attachment"/> </cd:instances> </cd:command> - <cd:command name="placeattachments" file="scrn-wid.mkvi"/> + <cd:command name="placeattachments" level="document" file="scrn-wid.mkvi"/> - <cd:command name="attachment" file="scrn-wid.mkvi"> - <cd:arguments> - <cd:resolve name="keyword-name-optional"/> - <cd:assignments list="yes" optional="yes"> - <cd:inherit name="setupattachment"/> - </cd:assignments> - </cd:arguments> - </cd:command> + <!-- - <cd:command name="attachment" type="environment" file="scrn-wid.mkvi"> - <cd:arguments> - <cd:resolve name="keyword-name-optional"/> - <cd:assignments list="yes" optional="yes"> - <cd:inherit name="setupattachment"/> - </cd:assignments> - </cd:arguments> - </cd:command> + <cd:command name="attachment" file="scrn-wid.mkvi"> + <cd:arguments> + <cd:resolve name="keyword-name-optional"/> + <cd:assignments list="yes" optional="yes"> + <cd:inherit name="setupattachment"/> + </cd:assignments> + </cd:arguments> + </cd:command> + + <cd:command name="attachment" type="environment" file="scrn-wid.mkvi"> + <cd:arguments> + <cd:resolve name="keyword-name-optional"/> + <cd:assignments list="yes" optional="yes"> + <cd:inherit name="setupattachment"/> + </cd:assignments> + </cd:arguments> + </cd:command> + + --> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-attribute.xml b/tex/context/interface/mkiv/i-attribute.xml index cd1e807d2..96a680e19 100644 --- a/tex/context/interface/mkiv/i-attribute.xml +++ b/tex/context/interface/mkiv/i-attribute.xml @@ -4,25 +4,25 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="pushattribute" file="attr-ini.mkiv"> + <cd:command name="pushattribute" category="attribute" level="system" file="attr-ini.mkiv"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="popattribute" file="attr-ini.mkiv"> + <cd:command name="popattribute" category="attribute" level="system" file="attr-ini.mkiv"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="installattributestack" file="attr-ini.mkiv"> + <cd:command name="installattributestack" category="attribute" level="system" file="attr-ini.mkiv"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="defineattribute" file="attr-ini.mkiv"> + <cd:command name="defineattribute" category="attribute" level="system" file="attr-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:keywords list="yes" optional="yes"> @@ -34,7 +34,7 @@ </cd:arguments> </cd:command> - <cd:command name="definesystemattribute" file="attr-ini.mkiv"> + <cd:command name="definesystemattribute" category="attribute" level="system" file="attr-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:keywords list="yes" optional="yes"> @@ -46,51 +46,51 @@ </cd:arguments> </cd:command> - <cd:command name="newattribute" file="attr-ini.mkiv"> + <cd:command name="newattribute" category="attribute" level="system" file="attr-ini.mkiv"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="dosetattribute" file="attr-ini.mkiv"> + <cd:command name="dosetattribute" category="attribute" level="system" file="attr-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="doresetattribute" file="attr-ini.mkiv"> + <cd:command name="doresetattribute" category="attribute" level="system" file="attr-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="dogetattribute" file="attr-ini.mkiv"> + <cd:command name="dogetattribute" category="attribute" level="system" file="attr-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="dogetattributeid" file="attr-ini.mkiv"> + <cd:command name="dogetattributeid" category="attribute" level="system" file="attr-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="resetallattributes" file="attr-ini.mkiv"/> + <cd:command name="resetallattributes" category="attribute" level="system" file="attr-ini.mkiv"/> - <cd:command name="savecurrentattributes" file="attr-ini.mkiv"> + <cd:command name="savecurrentattributes" category="attribute" level="system" file="attr-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="restorecurrentattributes" file="attr-ini.mkiv"> + <cd:command name="restorecurrentattributes" category="attribute" level="system" file="attr-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="showattributes" file="attr-ini.mkiv"/> + <cd:command name="showattributes" category="attribute" level="document" file="attr-ini.mkiv"/> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-backend.xml b/tex/context/interface/mkiv/i-backend.xml index ff9a628cb..5db77b5bd 100644 --- a/tex/context/interface/mkiv/i-backend.xml +++ b/tex/context/interface/mkiv/i-backend.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="setupbackend" file="back-ini.mkiv"> + <cd:command name="setupbackend" level="style" catehory="pdf" file="back-ini.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="export"> @@ -18,7 +18,31 @@ <cd:constant type="cd:file"/> </cd:parameter> <cd:parameter name="intent"> - <cd:constant type="cd:name"/> + <cd:constant type="Coated FOGRA39 (ISO 12647-2:2004)"/> + <cd:constant type="GRACoL2006_Coated1v2.icc"/> + <cd:constant type="ISO Coated v2 300% (ECI)"/> + <cd:constant type="ISO Coated v2 (ECI)"/> + <cd:constant type="ISOnewspaper26v4"/> + <cd:constant type="ISOnewspaper26v4_gr"/> + <cd:constant type="ISO Uncoated"/> + <cd:constant type="ISO Uncoated Yellowish"/> + <cd:constant type="ISO Web Coated"/> + <cd:constant type="Japan Color 2001 Coated"/> + <cd:constant type="Japan Color 2002 Newspaper"/> + <cd:constant type="Japan Web Coated (Ad)"/> + <cd:constant type="SNAP 2007"/> + <cd:constant type="SWOP2006_Coated3v2.icc"/> + <cd:constant type="SWOP2006_Coated5v2.icc"/> + <cd:constant type="Uncoated FOGRA29 (ISO 12647-2:2004)"/> + <cd:constant type="Web Coated FOGRA28 (ISO 12647-2:2004)"/> + <cd:constant type="PSR_LWC_PLUS_V2_PT"/> + <cd:constant type="PSR_LWC_STD_V2_PT"/> + <cd:constant type="PSR_SC_PLUS_V2_PT"/> + <cd:constant type="PSR_SC_STD_V2_PT"/> + <cd:constant type="PSRgravureMF"/> + <!-- + <cd:constant type="cd:name"/> + --> </cd:parameter> <cd:parameter name="space"> <cd:constant type="yes"/> @@ -30,7 +54,23 @@ <cd:parameter name="format"> <cd:constant type="version"/> <cd:constant type="default"/> - <cd:constant type="cd:name"/> + <cd:constant type="PDF/X-1a:2001"/> + <cd:constant type="PDF/X-1a:2003"/> + <cd:constant type="PDF/X-3:2002"/> + <cd:constant type="PDF/X-3:2003"/> + <cd:constant type="PDF/X-4"/> + <cd:constant type="PDF/X-4p"/> + <cd:constant type="PDF/X-5g"/> + <cd:constant type="PDF/X-5pg"/> + <cd:constant type="PDF/X-5n"/> + <cd:constant type="PDF/A-1a:2005"/> + <cd:constant type="PDF/A-1b:2005"/> + <cd:constant type="PDF/A-2a"/> + <cd:constant type="PDF/A-3a"/> + <cd:constant type="PDF/UA-1"/> + <!-- + <cd:constant type="cd:name"/> + --> </cd:parameter> <cd:parameter name="level"> <cd:constant type="cd:number"/> diff --git a/tex/context/interface/mkiv/i-background.xml b/tex/context/interface/mkiv/i-background.xml index f51a0247c..6bdddbb1b 100644 --- a/tex/context/interface/mkiv/i-background.xml +++ b/tex/context/interface/mkiv/i-background.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definebackground" file="pack-bck.mkvi"> + <cd:command name="definebackground" level="style" category="background" file="pack-bck.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupbackground" file="pack-bck.mkvi"> + <cd:command name="setupbackground" level="style" category="background" file="pack-bck.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -45,7 +45,7 @@ </cd:arguments> </cd:command> - <cd:command name="background" type="environment" generated="yes" variant="example" file="pack-bck.mkvi"> + <cd:command name="background" type="environment" generated="yes" variant="example" level="document" category="background" file="pack-bck.mkvi"> <cd:sequence> <cd:variable value="background"/> </cd:sequence> @@ -59,7 +59,7 @@ </cd:instances> </cd:command> - <cd:command name="background" type="environment" file="pack-bck.mkvi"> + <cd:command name="background" type="environment" level="document" category="background" file="pack-bck.mkvi"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupbackground"/> @@ -67,7 +67,7 @@ </cd:arguments> </cd:command> - <cd:command name="background" generated="yes" variant="example" file="pack-bck.mkvi"> + <cd:command name="background" generated="yes" variant="example" level="document" category="background" file="pack-bck.mkvi"> <cd:sequence> <cd:variable value="background"/> </cd:sequence> @@ -79,20 +79,20 @@ </cd:instances> </cd:command> - <cd:command name="background" file="pack-bck.mkvi"> + <cd:command name="background" level="document" category="background" file="pack-bck.mkvi"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="backgroundline" file="pack-bck.mkvi"> + <cd:command name="backgroundline" level="document" category="background colors" file="pack-bck.mkvi"> <cd:arguments> <cd:resolve name="keyword-color"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="setupbackgrounds" file="page-bck.mkiv"> + <cd:command name="setupbackgrounds" level="style" category="background" file="page-bck.mkiv"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="top"/> @@ -114,7 +114,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupbackgrounds" variant="page" file="page-bck.mkiv"> + <cd:command name="setupbackgrounds" variant="page" level="style" category="background" file="page-bck.mkiv"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="paper"/> @@ -134,13 +134,13 @@ </cd:arguments> </cd:command> - <cd:command name="background" type="environment" begin="push" end="pop" file="page-bck.mkiv"> + <cd:command name="background" type="environment" begin="push" end="pop" level="system" category="background" file="page-bck.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="doifelsesomebackground" file="page-bck.mkiv"> + <cd:command name="doifelsesomebackground" level="system" category="background conditional" file="page-bck.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -148,7 +148,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifsomebackgroundelse" file="page-bck.mkiv"> + <cd:command name="doifsomebackgroundelse" level="system" category="background conditional" file="page-bck.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -156,7 +156,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifsomebackground" file="page-bck.mkiv"> + <cd:command name="doifsomebackground" level="system" category="background conditional" file="page-bck.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> diff --git a/tex/context/interface/mkiv/i-bar.xml b/tex/context/interface/mkiv/i-bar.xml index 951448249..fb120d05b 100644 --- a/tex/context/interface/mkiv/i-bar.xml +++ b/tex/context/interface/mkiv/i-bar.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definebar" file="node-rul.mkiv"> + <cd:command name="definebar" level="style" category="rules" file="node-rul.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupbar" file="node-rul.mkiv"> + <cd:command name="setupbar" level="style" category="rules" file="node-rul.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -82,166 +82,151 @@ </cd:arguments> </cd:command> - <!-- - - <cd:command name="setupbars" file="node-rul.mkiv"> - <cd:arguments> - <cd:resolve name="keyword-name-list-optional"/> - <cd:assignments list="yes"> - <cd:inherit name="setupbar"/> - </cd:assignments> - </cd:arguments> - </cd:command> - - --> + <cd:command name="setupbars" level="style" category="rules" file="node-rul.mkiv"> + <cd:arguments> + <cd:resolve name="keyword-name-list-optional"/> + <cd:assignments list="yes"> + <cd:inherit name="setupbar"/> + </cd:assignments> + </cd:arguments> + </cd:command> - <cd:command name="bar" generated="yes" variant="example" file="node-rul.mkiv"> + <cd:command name="bar" generated="yes" variant="instance" level="document" category="rules" file="node-rul.mkiv"> <cd:sequence> - <cd:variable value="bar"/> + <cd:instance value="bar"/> </cd:sequence> <cd:arguments> <cd:content/> </cd:arguments> <cd:instances> - <cd:constant value="overbar"/> - <cd:constant value="underbar"/> - <cd:constant value="overstrike"/> - <cd:constant value="understrike"/> - <cd:constant value="overbars"/> - <cd:constant value="underbars"/> - <cd:constant value="overstrikes"/> - <cd:constant value="understrikes"/> - <cd:constant value="underrandom"/> - <cd:constant value="underrandoms"/> - <cd:constant value="underdash"/> - <cd:constant value="underdashes"/> - <cd:constant value="underdot"/> - <cd:constant value="underdots"/> - <cd:constant value="nobar"/> - <cd:constant value="hiddenbar"/> + <cd:resolve name="instance-bar"/> </cd:instances> </cd:command> - <cd:command name="bar" type="environment" file="node-rul.mkiv"> + <cd:command name="bar" type="environment" level="document" category="rules" file="node-rul.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="setbar" file="node-rul.mkiv"> + <cd:command name="setbar" level="document" category="rules" file="node-rul.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="directsetbar" file="node-rul.mkiv"> + <cd:command name="directsetbar" level="document" category="rules" file="node-rul.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="bar" type="environment" begin="push" end="pop" file="node-rul.mkiv"> + <cd:command name="bar" type="environment" begin="push" end="pop" level="system" category="rules" file="node-rul.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="overbar" file="node-rul.mkiv"> - <cd:arguments> - <cd:content/> - </cd:arguments> - </cd:command> + <!-- - <cd:command name="underbar" file="node-rul.mkiv"> - <cd:arguments> - <cd:content/> - </cd:arguments> - </cd:command> + <cd:command name="overbar" level="document" category="rules" file="node-rul.mkiv"> + <cd:arguments> + <cd:content/> + </cd:arguments> + </cd:command> - <cd:command name="hiddenbar" file="node-rul.mkiv"> - <cd:arguments> - <cd:content/> - </cd:arguments> - </cd:command> + <cd:command name="underbar" level="document" category="rules" file="node-rul.mkiv"> + <cd:arguments> + <cd:content/> + </cd:arguments> + </cd:command> - <cd:command name="overstrike" file="node-rul.mkiv"> - <cd:arguments> - <cd:content/> - </cd:arguments> - </cd:command> + <cd:command name="hiddenbar" level="document" category="rules" file="node-rul.mkiv"> + <cd:arguments> + <cd:content/> + </cd:arguments> + </cd:command> - <cd:command name="understrike" file="node-rul.mkiv"> - <cd:arguments> - <cd:content/> - </cd:arguments> - </cd:command> + <cd:command name="overstrike" level="document" category="rules" file="node-rul.mkiv"> + <cd:arguments> + <cd:content/> + </cd:arguments> + </cd:command> - <cd:command name="overbars" file="node-rul.mkiv"> - <cd:arguments> - <cd:content/> - </cd:arguments> - </cd:command> + <cd:command name="understrike" level="document" category="rules" file="node-rul.mkiv"> + <cd:arguments> + <cd:content/> + </cd:arguments> + </cd:command> - <cd:command name="underbars" file="node-rul.mkiv"> - <cd:arguments> - <cd:content/> - </cd:arguments> - </cd:command> + <cd:command name="overbars" level="document" category="rules" file="node-rul.mkiv"> + <cd:arguments> + <cd:content/> + </cd:arguments> + </cd:command> - <cd:command name="overstrikes" file="node-rul.mkiv"> - <cd:arguments> - <cd:content/> - </cd:arguments> - </cd:command> + <cd:command name="underbars" level="document" category="rules" file="node-rul.mkiv"> + <cd:arguments> + <cd:content/> + </cd:arguments> + </cd:command> - <cd:command name="understrikes" file="node-rul.mkiv"> - <cd:arguments> - <cd:content/> - </cd:arguments> - </cd:command> + <cd:command name="overstrikes" level="document" category="rules" file="node-rul.mkiv"> + <cd:arguments> + <cd:content/> + </cd:arguments> + </cd:command> - <cd:command name="underrandom" file="node-rul.mkiv"> - <cd:arguments> - <cd:content/> - </cd:arguments> - </cd:command> + <cd:command name="understrikes" level="document" category="rules" file="node-rul.mkiv"> + <cd:arguments> + <cd:content/> + </cd:arguments> + </cd:command> - <cd:command name="underrandoms" file="node-rul.mkiv"> - <cd:arguments> - <cd:content/> - </cd:arguments> - </cd:command> + <cd:command name="underrandom" level="document" category="rules" file="node-rul.mkiv"> + <cd:arguments> + <cd:content/> + </cd:arguments> + </cd:command> - <cd:command name="underdash" file="node-rul.mkiv"> - <cd:arguments> - <cd:content/> - </cd:arguments> - </cd:command> + <cd:command name="underrandoms" level="document" category="rules" file="node-rul.mkiv"> + <cd:arguments> + <cd:content/> + </cd:arguments> + </cd:command> - <cd:command name="underdashes" file="node-rul.mkiv"> - <cd:arguments> - <cd:content/> - </cd:arguments> - </cd:command> + <cd:command name="underdash" level="document" category="rules" file="node-rul.mkiv"> + <cd:arguments> + <cd:content/> + </cd:arguments> + </cd:command> - <cd:command name="underdot" file="node-rul.mkiv"> - <cd:arguments> - <cd:content/> - </cd:arguments> - </cd:command> + <cd:command name="underdashes" level="document" category="rules" file="node-rul.mkiv"> + <cd:arguments> + <cd:content/> + </cd:arguments> + </cd:command> - <cd:command name="underdots" file="node-rul.mkiv"> - <cd:arguments> - <cd:content/> - </cd:arguments> - </cd:command> + <cd:command name="underdot" level="document" category="rules" file="node-rul.mkiv"> + <cd:arguments> + <cd:content/> + </cd:arguments> + </cd:command> - <cd:command name="nobar" file="node-rul.mkiv"> - <cd:arguments> - <cd:content/> - </cd:arguments> - </cd:command> + <cd:command name="underdots" level="document" category="rules" file="node-rul.mkiv"> + <cd:arguments> + <cd:content/> + </cd:arguments> + </cd:command> + + <cd:command name="nobar" level="document" category="rules" file="node-rul.mkiv"> + <cd:arguments> + <cd:content/> + </cd:arguments> + </cd:command> + + --> - <cd:command name="resetbar" file="node-rul.mkiv"/> + <cd:command name="resetbar" level="style" category="rules" file="node-rul.mkiv"/> </cd:interface> diff --git a/tex/context/interface/mkiv/i-blackrule.xml b/tex/context/interface/mkiv/i-blackrule.xml index edb6873f0..0463f21ed 100644 --- a/tex/context/interface/mkiv/i-blackrule.xml +++ b/tex/context/interface/mkiv/i-blackrule.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="setupblackrules" file="pack-mrl.mkiv"> + <cd:command name="setupblackrules" level="style" category="rules colors" file="pack-mrl.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="width"> @@ -47,7 +47,7 @@ </cd:arguments> </cd:command> - <cd:command name="blackrule" file="pack-mrl.mkiv"> + <cd:command name="blackrule" level="document" category="rules colors" file="pack-mrl.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupblackrules"/> @@ -55,7 +55,7 @@ </cd:arguments> </cd:command> - <cd:command name="blackrules" file="pack-mrl.mkiv"> + <cd:command name="blackrules" level="document" category="rules colors" file="pack-mrl.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupblackrules"/> @@ -63,19 +63,19 @@ </cd:arguments> </cd:command> - <cd:command name="vl" file="pack-mrl.mkiv"> + <cd:command name="vl" level="document" category="rules" file="pack-mrl.mkiv"> <cd:arguments> <cd:resolve name="keyword-number-optional"/> </cd:arguments> </cd:command> - <cd:command name="hl" file="pack-mrl.mkiv"> + <cd:command name="hl" level="document" file="pack-mrl.mkiv"> <cd:arguments> <cd:resolve name="keyword-number-optional"/> </cd:arguments> </cd:command> - <cd:command name="somekindoftab" file="tabl-mis.mkiv"> + <cd:command name="somekindoftab" level="style" category="rules" file="tabl-mis.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="alternative"> @@ -98,4 +98,21 @@ </cd:arguments> </cd:command> -</cd:interface> + <cd:command name="frule" level="style" category="rules" file="grph-rul.mkiv"> + <cd:arguments> + <cd:keywords delimiters="none" list="yes"> + <cd:constant type="cd:dimension" prefix="width␣" method="none"/> + <cd:constant type="cd:dimension" prefix="height␣" method="none"/> + <cd:constant type="cd:dimension" prefix="depth␣" method="none"/> + <cd:constant type="cd:dimension" prefix="radius␣" method="none"/> + <cd:constant type="cd:dimension" prefix="line␣" method="none"/> + <!-- the type option accepts 'mp' or 'fill' as arguments --> + <cd:constant type="cd:text" prefix="type␣" method="none"/> + <cd:constant type="cd:text" prefix="data␣" method="none"/> + <cd:constant type="cd:text" prefix="name␣" method="none"/> + </cd:keywords> + <cd:delimiter name="relax"/> + </cd:arguments> + </cd:command> + +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-bleed.xml b/tex/context/interface/mkiv/i-bleed.xml index 301f7d066..ee860b85f 100644 --- a/tex/context/interface/mkiv/i-bleed.xml +++ b/tex/context/interface/mkiv/i-bleed.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="setupbleeding" file="pack-box.mkiv"> + <cd:command name="setupbleeding" level="style" category="graphics" file="pack-box.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="width"> @@ -48,7 +48,7 @@ </cd:arguments> </cd:command> - <cd:command name="bleed" file="pack-box.mkiv"> + <cd:command name="bleed" level="document" category="graphics" file="pack-box.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupbleeding"/> @@ -57,8 +57,8 @@ </cd:arguments> </cd:command> - <cd:command name="bleedwidth" file="pack-box.mkiv"/> + <cd:command name="bleedwidth" level="style" category="graphics" file="pack-box.mkiv"/> - <cd:command name="bleedheight" file="pack-box.mkiv"/> + <cd:command name="bleedheight" level="style" category="graphics" file="pack-box.mkiv"/> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-block.xml b/tex/context/interface/mkiv/i-block.xml index 837b2133d..fa5262506 100644 --- a/tex/context/interface/mkiv/i-block.xml +++ b/tex/context/interface/mkiv/i-block.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="defineblock" file="strc-blk.mkiv"> + <cd:command name="defineblock" level="style" category="structure" file="strc-blk.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupblock" file="strc-blk.mkiv"> + <cd:command name="setupblock" level="style" category="structure" file="strc-blk.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -37,7 +37,7 @@ </cd:arguments> </cd:command> - <cd:command name="block" type="environment" generated="yes" variant="example" begin="begin" end="end" file="strc-blk.mkiv"> + <cd:command name="block" type="environment" generated="yes" variant="example" begin="begin" end="end" level="document" category="structure" file="strc-blk.mkiv"> <cd:sequence> <cd:variable value="block"/> </cd:sequence> @@ -45,37 +45,29 @@ <cd:keywords list="yes" optional="yes"> <cd:constant type="+"/> <cd:constant type="-"/> + <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="hideblocks" file="strc-blk.mkiv"> + <cd:command name="hideblocks" level="style" category="structure" file="strc-blk.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list"/> - <cd:keywords list="yes" optional="yes"> - <cd:constant type="+"/> - <cd:constant type="-"/> - </cd:keywords> + <cd:resolve name="keyword-name-list-optional"/> </cd:arguments> </cd:command> - <cd:command name="keepblocks" file="strc-blk.mkiv"> + <cd:command name="keepblocks" level="style" category="structure" file="strc-blk.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list"/> - <cd:keywords list="yes" optional="yes"> - <cd:constant type="+"/> - <cd:constant type="-"/> - </cd:keywords> + <cd:resolve name="keyword-name-list-optional"/> </cd:arguments> </cd:command> - <cd:command name="useblocks" file="strc-blk.mkiv"> + <cd:command name="useblocks" level="document" category="structure" file="strc-blk.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list"/> - <cd:keywords list="yes" optional="yes"> - <cd:constant type="+"/> - <cd:constant type="-"/> - </cd:keywords> + <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes" optional="yes"> <cd:parameter name="criterium"> <cd:constant type="text" default="yes"/> @@ -85,13 +77,10 @@ </cd:arguments> </cd:command> - <cd:command name="processblocks" file="strc-blk.mkiv"> + <cd:command name="processblocks" level="document" category="structure" file="strc-blk.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list"/> - <cd:keywords list="yes" optional="yes"> - <cd:constant type="+"/> - <cd:constant type="-"/> - </cd:keywords> + <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes" optional="yes"> <cd:parameter name="criterium"> <cd:constant type="text" default="yes"/> @@ -101,13 +90,10 @@ </cd:arguments> </cd:command> - <cd:command name="selectblocks" file="strc-blk.mkiv"> + <cd:command name="selectblocks" level="document" category="structure" file="strc-blk.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list"/> - <cd:keywords list="yes" optional="yes"> - <cd:constant type="+"/> - <cd:constant type="-"/> - </cd:keywords> + <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes" optional="yes"> <cd:parameter name="criterium"> <cd:constant type="text" default="yes"/> @@ -117,4 +103,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-bookmark.xml b/tex/context/interface/mkiv/i-bookmark.xml index 68d893609..3dbfa3406 100644 --- a/tex/context/interface/mkiv/i-bookmark.xml +++ b/tex/context/interface/mkiv/i-bookmark.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="setupbookmark" file="strc-bkm.mkiv"> + <cd:command name="setupbookmark" level="style" category="pdf" file="strc-bkm.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="force"> @@ -40,7 +40,7 @@ <!-- - <cd:command name="setupbookmarks" file="strc-bkm.mkiv"> + <cd:command name="setupbookmarks" level="style" category="pdf" file="strc-bkm.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:inherit name="setupbookmark"/> @@ -50,7 +50,7 @@ --> - <cd:command name="bookmark" file="strc-bkm.mkiv"> + <cd:command name="bookmark" level="document" category="pdf" file="strc-bkm.mkiv"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:section"/> @@ -60,7 +60,7 @@ </cd:arguments> </cd:command> - <cd:command name="placebookmarks" file="src-bkm.mkiv"> + <cd:command name="placebookmarks" level="style" category="pdf" file="src-bkm.mkiv"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:section"/> @@ -76,4 +76,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-boxes.xml b/tex/context/interface/mkiv/i-boxes.xml index 648106b89..dd5c30529 100644 --- a/tex/context/interface/mkiv/i-boxes.xml +++ b/tex/context/interface/mkiv/i-boxes.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="doiftext" file="supp-box.mkiv"> + <cd:command name="doiftext" level="system" category="conditional" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-true"/> @@ -12,7 +12,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifelsetext" file="supp-box.mkiv"> + <cd:command name="doifelsetext" level="system" category="conditional" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-true"/> @@ -20,7 +20,7 @@ </cd:arguments> </cd:command> - <cd:command name="doiftextelse" file="supp-box.mkiv"> + <cd:command name="doiftextelse" level="system" category="conditional" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-true"/> @@ -28,7 +28,7 @@ </cd:arguments> </cd:command> - <cd:command name="dowithnextbox" file="supp-box.mkiv"> + <cd:command name="dowithnextbox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="argument-command"/> <cd:csname/> @@ -36,7 +36,7 @@ </cd:arguments> </cd:command> - <cd:command name="dowithnextboxcs" file="supp-box.mkiv"> + <cd:command name="dowithnextboxcs" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:csname/> <cd:csname/> @@ -44,21 +44,21 @@ </cd:arguments> </cd:command> - <cd:command name="nextboxwd" file="supp-box.mkiv"/> + <cd:command name="nextboxwd" level="system" file="supp-box.mkiv"/> - <cd:command name="nextboxht" file="supp-box.mkiv"/> + <cd:command name="nextboxht" level="system" file="supp-box.mkiv"/> - <cd:command name="nextboxdp" file="supp-box.mkiv"/> + <cd:command name="nextboxdp" level="system" file="supp-box.mkiv"/> - <cd:command name="nextboxhtdp" file="supp-box.mkiv"/> + <cd:command name="nextboxhtdp" level="system" file="supp-box.mkiv"/> - <cd:command name="flushnextbox" file="supp-box.mkiv"/> + <cd:command name="flushnextbox" level="system" file="supp-box.mkiv"/> - <cd:command name="nextbox" file="supp-box.mkiv"/> + <cd:command name="nextbox" level="system" file="supp-box.mkiv"/> - <cd:command name="nextdepth" file="supp-box.mkiv"/> + <cd:command name="nextdepth" level="system" file="supp-box.mkiv"/> - <cd:command name="dowithnextboxcontent" file="supp-box.mkiv"> + <cd:command name="dowithnextboxcontent" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="argument-command"/> <cd:resolve name="argument-command"/> @@ -67,7 +67,7 @@ </cd:arguments> </cd:command> - <cd:command name="dowithnextboxcontentcs" file="supp-box.mkiv"> + <cd:command name="dowithnextboxcontentcs" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:csname/> <cd:csname/> @@ -76,55 +76,55 @@ </cd:arguments> </cd:command> - <cd:command name="rlap" file="supp-box.mkiv"> + <cd:command name="rlap" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="llap" file="supp-box.mkiv"> + <cd:command name="llap" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="clap" file="supp-box.mkiv"> + <cd:command name="clap" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="tlap" file="supp-box.mkiv"> + <cd:command name="tlap" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="blap" file="supp-box.mkiv"> + <cd:command name="blap" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="reshapebox" file="supp-box.mkiv"> + <cd:command name="reshapebox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="argument-command"/> </cd:arguments> </cd:command> - <cd:command name="shapebox" type="environment" begin="beginof" end="endof" file="supp-box.mkiv"/> + <cd:command name="shapebox" type="environment" begin="beginof" end="endof" level="system" file="supp-box.mkiv"/> - <cd:command name="flushshapebox" file="supp-box.mkiv"/> + <cd:command name="flushshapebox" level="system" file="supp-box.mkiv"/> - <cd:command name="innerflushshapebox" file="supp-box.mkiv"/> + <cd:command name="innerflushshapebox" level="system" file="supp-box.mkiv"/> - <cd:command name="shapedhbox" file="supp-box.mkiv"> + <cd:command name="shapedhbox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="processtokens" file="supp-box.mkiv"> + <cd:command name="processtokens" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="argument-command"/> <cd:resolve name="argument-command"/> @@ -134,7 +134,7 @@ </cd:arguments> </cd:command> - <cd:command name="doboundtext" file="supp-box.mkiv"> + <cd:command name="doboundtext" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-dimension"/> @@ -142,7 +142,7 @@ </cd:arguments> </cd:command> - <cd:command name="limitatetext" file="supp-box.mkiv"> + <cd:command name="limitatetext" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:keywords delimiters="braces"> @@ -152,7 +152,7 @@ </cd:arguments> </cd:command> - <cd:command name="limitatetext" variant="list" file="supp-box.mkiv"> + <cd:command name="limitatetext" variant="list" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:keywords delimiters="braces" list="yes"> @@ -162,7 +162,7 @@ </cd:arguments> </cd:command> - <cd:command name="limtatefirstline" file="supp-box.mkiv"> + <cd:command name="limitatefirstline" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-dimension"/> @@ -170,122 +170,122 @@ </cd:arguments> </cd:command> - <cd:command name="processisolatedchars" file="supp-box.mkiv"> + <cd:command name="processisolatedchars" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="processisolatedwords" file="supp-box.mkiv"> + <cd:command name="processisolatedwords" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="applytocharacters" file="supp-box.mkiv"> + <cd:command name="applytocharacters" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="applytowords" file="supp-box.mkiv"> + <cd:command name="applytowords" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="applytosplitstringchar" file="supp-box.mkiv"> + <cd:command name="applytosplitstringchar" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="applytosplitstringword" file="supp-box.mkiv"> + <cd:command name="applytosplitstringword" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="applytosplitstringline" file="supp-box.mkiv"> + <cd:command name="applytosplitstringline" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="applytosplitstringcharspaced" file="supp-box.mkiv"> + <cd:command name="applytosplitstringcharspaced" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="applytosplitstringwordspaced" file="supp-box.mkiv"> + <cd:command name="applytosplitstringwordspaced" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="applytosplitstringlinespaced" file="supp-box.mkiv"> + <cd:command name="applytosplitstringlinespaced" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="sbox" file="supp-box.mkiv"> + <cd:command name="sbox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="inlinedbox" file="supp-box.mkiv"> + <cd:command name="inlinedbox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="struttedbox" file="supp-box.mkiv"> + <cd:command name="struttedbox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="topskippedbox" file="supp-box.mkiv"> + <cd:command name="topskippedbox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="centeredbox" file="supp-box.mkiv"> + <cd:command name="centeredbox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="centerednextbox" file="supp-box.mkiv"> + <cd:command name="centerednextbox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="centerbox" file="supp-box.mkiv"> + <cd:command name="centerbox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="setrigidcolumnhsize" file="supp-box.mkiv"> + <cd:command name="setrigidcolumnhsize" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="argument-dimension"/> <cd:resolve name="argument-dimension"/> @@ -293,21 +293,21 @@ </cd:arguments> </cd:command> - <cd:command name="setrigidcolumnbalance" file="supp-box.mkiv"> + <cd:command name="setrigidcolumnbalance" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="string-box"/> </cd:arguments> </cd:command> - <cd:command name="vboxtohbox" type="environment" file="supp-box.mkiv"/> + <cd:command name="vboxtohbox" type="environment" level="system" file="supp-box.mkiv"/> - <cd:command name="vboxtohboxseparator" type="environment" file="supp-box.mkiv"/> + <cd:command name="vboxtohboxseparator" type="environment" level="system" file="supp-box.mkiv"/> - <cd:command name="convertvboxtohbox" file="supp-box.mkiv"/> + <cd:command name="convertvboxtohbox" level="system" file="supp-box.mkiv"/> - <cd:command name="hboxestohbox" type="environment" file="supp-box.mkiv"/> + <cd:command name="hboxestohbox" type="environment" level="system" file="supp-box.mkiv"/> - <cd:command name="unhhbox" file="supp-box.mkiv"> + <cd:command name="unhhbox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="string-box"/> <cd:delimiter name="with"/> @@ -317,17 +317,17 @@ <!-- - <cd:command name="hhbox" file="supp-box.mkiv"/> + <cd:command name="hhbox" level="system" file="supp-box.mkiv"/> --> - <cd:command name="hboxofvbox" file="supp-box.mkiv"> + <cd:command name="hboxofvbox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="string-box"/> </cd:arguments> </cd:command> - <cd:command name="doifcontent" file="supp-box.mkiv"> + <cd:command name="doifcontent" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="argument-command"/> <cd:resolve name="argument-command"/> @@ -337,105 +337,105 @@ </cd:arguments> </cd:command> - <cd:command name="overlay" type="environment" file="supp-box.mkiv"/> + <cd:command name="overlay" type="environment" level="system" file="supp-box.mkiv"/> - <cd:command name="fakebox" file="supp-box.mkiv"> + <cd:command name="fakebox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="string-box"/> </cd:arguments> </cd:command> - <cd:command name="lbox" file="supp-box.mkiv"> + <cd:command name="lbox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="cbox" file="supp-box.mkiv"> + <cd:command name="cbox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="rbox" file="supp-box.mkiv"> + <cd:command name="rbox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="ltop" file="supp-box.mkiv"> + <cd:command name="ltop" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="ctop" file="supp-box.mkiv"> + <cd:command name="ctop" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="rtop" file="supp-box.mkiv"> + <cd:command name="rtop" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="tbox" file="supp-box.mkiv"> + <cd:command name="tbox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="bbox" file="supp-box.mkiv"> + <cd:command name="bbox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="lhbox" file="supp-box.mkiv"> + <cd:command name="lhbox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="mhbox" file="supp-box.mkiv"> + <cd:command name="mhbox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="rhbox" file="supp-box.mkiv"> + <cd:command name="rhbox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="lefthbox" file="supp-box.mkiv"> + <cd:command name="lefthbox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="midhbox" file="supp-box.mkiv"> + <cd:command name="midhbox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="righthbox" file="supp-box.mkiv"> + <cd:command name="righthbox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="boxofsize" file="supp-box.mkiv"> + <cd:command name="boxofsize" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="none" list="yes" optional="yes"> @@ -445,7 +445,7 @@ </cd:arguments> </cd:command> - <cd:command name="limitatelines" file="supp-box.mkiv"> + <cd:command name="limitatelines" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> <cd:resolve name="argument-command"/> @@ -453,117 +453,117 @@ </cd:arguments> </cd:command> - <cd:command name="fittopbaselinegrid" file="supp-box.mkiv"> + <cd:command name="fittopbaselinegrid" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="boxcursor" file="supp-box.mkiv"/> + <cd:command name="boxcursor" level="system" file="supp-box.mkiv"/> - <cd:command name="placedbox" file="supp-box.mkiv"> + <cd:command name="placedbox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="rightbox" file="supp-box.mkiv"> + <cd:command name="rightbox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="leftbox" file="supp-box.mkiv"> + <cd:command name="leftbox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="topbox" file="supp-box.mkiv"> + <cd:command name="topbox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="bottombox" file="supp-box.mkiv"> + <cd:command name="bottombox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="lefttopbox" file="supp-box.mkiv"> + <cd:command name="lefttopbox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="righttopbox" file="supp-box.mkiv"> + <cd:command name="righttopbox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="leftbottombox" file="supp-box.mkiv"> + <cd:command name="leftbottombox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="rightbottombox" file="supp-box.mkiv"> + <cd:command name="rightbottombox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="topleftbox" file="supp-box.mkiv"> + <cd:command name="topleftbox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="toprightbox" file="supp-box.mkiv"> + <cd:command name="toprightbox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="bottomleftbox" file="supp-box.mkiv"> + <cd:command name="bottomleftbox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="bottomrightbox" file="supp-box.mkiv"> + <cd:command name="bottomrightbox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="middlebox" file="supp-box.mkiv"> + <cd:command name="middlebox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="baselinemiddlebox" file="supp-box.mkiv"> + <cd:command name="baselinemiddlebox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="baselineleftbox" file="supp-box.mkiv"> + <cd:command name="baselineleftbox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="baselinerightbox" file="supp-box.mkiv"> + <cd:command name="baselinerightbox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="lrtbbox" file="supp-box.mkiv"> + <cd:command name="lrtbbox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="argument-dimension"/> <cd:resolve name="argument-dimension"/> @@ -573,13 +573,13 @@ </cd:arguments> </cd:command> - <cd:command name="toplinebox" file="supp-box.mkiv"> + <cd:command name="toplinebox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="setstackbox" file="supp-box.mkiv"> + <cd:command name="setstackbox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-name"/> @@ -587,13 +587,13 @@ </cd:arguments> </cd:command> - <cd:command name="initializeboxstack" file="supp-box.mkiv"> + <cd:command name="initializeboxstack" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="savebox" file="supp-box.mkiv"> + <cd:command name="savebox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-name"/> @@ -601,21 +601,28 @@ </cd:arguments> </cd:command> - <cd:command name="restorebox" file="supp-box.mkiv"> + <cd:command name="flushbox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="foundbox" file="supp-box.mkiv"> + <cd:command name="restorebox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="doifelsebox" file="supp-box.mkiv"> + <cd:command name="foundbox" level="system" file="supp-box.mkiv"> + <cd:arguments> + <cd:resolve name="argument-name"/> + <cd:resolve name="argument-name"/> + </cd:arguments> + </cd:command> + + <cd:command name="doifelsebox" level="system" category="conditional" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-name"/> @@ -624,7 +631,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifboxelse" file="supp-box.mkiv"> + <cd:command name="doifboxelse" level="system" category="conditional" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-name"/> @@ -633,51 +640,51 @@ </cd:arguments> </cd:command> - <cd:command name="localpushbox" file="supp-box.mkiv"> + <cd:command name="localpushbox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="string-box"/> </cd:arguments> </cd:command> - <cd:command name="localpopbox" file="supp-box.mkiv"> + <cd:command name="localpopbox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="string-box"/> </cd:arguments> </cd:command> - <cd:command name="globalpushbox" file="supp-box.mkiv"> + <cd:command name="globalpushbox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="string-box"/> </cd:arguments> </cd:command> - <cd:command name="globalpopbox" file="supp-box.mkiv"> + <cd:command name="globalpopbox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="string-box"/> </cd:arguments> </cd:command> - <cd:command name="removedepth" file="supp-box.mkiv"/> + <cd:command name="removedepth" level="system" file="supp-box.mkiv"/> - <cd:command name="obeydepth" file="supp-box.mkiv"/> + <cd:command name="obeydepth" level="system" file="supp-box.mkiv"/> - <cd:command name="undepthed" file="supp-box.mkiv"> + <cd:command name="undepthed" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="removebottomthings" file="supp-box.mkiv"/> + <cd:command name="removebottomthings" level="system" file="supp-box.mkiv"/> - <cd:command name="removelastskip" file="supp-box.mkiv"/> + <cd:command name="removelastskip" level="system" file="supp-box.mkiv"/> - <cd:command name="makestrutofbox" file="supp-box.mkiv"> + <cd:command name="makestrutofbox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="string-box"/> </cd:arguments> </cd:command> - <cd:command name="raisebox" file="supp-box.mkiv"> + <cd:command name="raisebox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="argument-dimension"/> <cd:csname/> @@ -685,7 +692,7 @@ </cd:arguments> </cd:command> - <cd:command name="lowerbox" file="supp-box.mkiv"> + <cd:command name="lowerbox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="argument-dimension"/> <cd:csname/> @@ -693,164 +700,164 @@ </cd:arguments> </cd:command> - <cd:command name="halfwaybox" file="supp-box.mkiv"> + <cd:command name="halfwaybox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="depthonlybox" file="supp-box.mkiv"> + <cd:command name="depthonlybox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="naturalhbox" file="supp-box.mkiv"> + <cd:command name="naturalhbox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="naturalvbox" file="supp-box.mkiv"> + <cd:command name="naturalvbox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="naturalvtop" file="supp-box.mkiv"> + <cd:command name="naturalvtop" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="naturalvcenter" file="supp-box.mkiv"> + <cd:command name="naturalvcenter" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="naturalhpack" file="supp-box.mkiv"> + <cd:command name="naturalhpack" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="naturalvpack" file="supp-box.mkiv"> + <cd:command name="naturalvpack" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="frozenhbox" file="supp-box.mkiv"> + <cd:command name="frozenhbox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="setboxllx" file="supp-box.mkiv"> + <cd:command name="setboxllx" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="string-box"/> <cd:resolve name="argument-dimension"/> </cd:arguments> </cd:command> - <cd:command name="setboxlly" file="supp-box.mkiv"> + <cd:command name="setboxlly" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="string-box"/> <cd:resolve name="argument-dimension"/> </cd:arguments> </cd:command> - <cd:command name="gsetboxllx" file="supp-box.mkiv"> + <cd:command name="gsetboxllx" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="string-box"/> <cd:resolve name="argument-dimension"/> </cd:arguments> </cd:command> - <cd:command name="gsetboxlly" file="supp-box.mkiv"> + <cd:command name="gsetboxlly" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="string-box"/> <cd:resolve name="argument-dimension"/> </cd:arguments> </cd:command> - <cd:command name="getboxllx" file="supp-box.mkiv"> + <cd:command name="getboxllx" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="string-box"/> </cd:arguments> </cd:command> - <cd:command name="getboxlly" file="supp-box.mkiv"> + <cd:command name="getboxlly" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="string-box"/> </cd:arguments> </cd:command> - <cd:command name="directgetboxllx" file="supp-box.mkiv"> + <cd:command name="directgetboxllx" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="string-box"/> </cd:arguments> </cd:command> - <cd:command name="directgetboxlly" file="supp-box.mkiv"> + <cd:command name="directgetboxlly" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="string-box"/> </cd:arguments> </cd:command> - <cd:command name="shownextbox" file="supp-box.mkiv"> + <cd:command name="shownextbox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:csname/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="spreadhbox" file="supp-box.mkiv"> + <cd:command name="spreadhbox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="string-box"/> </cd:arguments> </cd:command> - <cd:command name="minimalhbox" file="supp-box.mkiv"> + <cd:command name="minimalhbox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="nodetostring" file="supp-box.mkiv"> + <cd:command name="nodetostring" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:csname/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="getnaturaldimensions" file="supp-box.mkiv"> + <cd:command name="getnaturaldimensions" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="string-box"/> </cd:arguments> </cd:command> - <cd:command name="lastnaturalboxwd" file="supp-box.mkiv"/> + <cd:command name="lastnaturalboxwd" level="system" file="supp-box.mkiv"/> - <cd:command name="lastnaturalboxht" file="supp-box.mkiv"/> + <cd:command name="lastnaturalboxht" level="system" file="supp-box.mkiv"/> - <cd:command name="lastnaturalboxdp" file="supp-box.mkiv"/> + <cd:command name="lastnaturalboxdp" level="system" file="supp-box.mkiv"/> - <cd:command name="naturalwd" file="supp-box.mkiv"> + <cd:command name="naturalwd" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="string-box"/> </cd:arguments> </cd:command> - <cd:command name="doifelserighttoleftinbox" file="supp-box.mkiv"> + <cd:command name="doifelserighttoleftinbox" level="system" category="conditional" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="string-box"/> <cd:resolve name="argument-true"/> @@ -858,7 +865,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifrighttoleftinboxelse" file="supp-box.mkiv"> + <cd:command name="doifrighttoleftinboxelse" level="system" category="conditional" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="string-box"/> <cd:resolve name="argument-true"/> @@ -866,167 +873,167 @@ </cd:arguments> </cd:command> - <cd:command name="runninghbox" file="supp-box.mkiv"> + <cd:command name="runninghbox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="vbox" type="environment" begin="begin" end="end" file="supp-box.mkiv"/> + <cd:command name="vbox" type="environment" begin="begin" end="end" level="system" file="supp-box.mkiv"/> - <cd:command name="hbox" type="environment" begin="begin" end="end" file="supp-box.mkiv"/> + <cd:command name="hbox" type="environment" begin="begin" end="end" level="system" file="supp-box.mkiv"/> - <cd:command name="vtop" type="environment" begin="begin" end="end" file="supp-box.mkiv"/> + <cd:command name="vtop" type="environment" begin="begin" end="end" level="system" file="supp-box.mkiv"/> - <cd:command name="setvboxregister" file="supp-box.mkiv"> + <cd:command name="setvboxregister" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="string-box"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="sethboxregister" file="supp-box.mkiv"> + <cd:command name="sethboxregister" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="string-box"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="setvtopregister" file="supp-box.mkiv"> + <cd:command name="setvtopregister" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="string-box"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="flushboxregister" file="supp-box.mkiv"> + <cd:command name="flushboxregister" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="string-box"/> </cd:arguments> </cd:command> - <cd:command name="vboxregister" type="environment" file="supp-box.mkiv"> + <cd:command name="vboxregister" type="environment" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="string-box"/> </cd:arguments> </cd:command> - <cd:command name="hboxregister" type="environment" file="supp-box.mkiv"> + <cd:command name="hboxregister" type="environment" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="string-box"/> </cd:arguments> </cd:command> - <cd:command name="vtopregister" type="environment" file="supp-box.mkiv"> + <cd:command name="vtopregister" type="environment" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="string-box"/> </cd:arguments> </cd:command> - <cd:command name="righttolefthbox" file="spac-ali.mkiv"> + <cd:command name="righttolefthbox" level="system" category="alignment" file="spac-ali.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="lefttorighthbox" file="spac-ali.mkiv"> + <cd:command name="lefttorighthbox" level="system" category="alignment" file="spac-ali.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="righttoleftvbox" file="spac-ali.mkiv"> + <cd:command name="righttoleftvbox" level="system" category="alignment" file="spac-ali.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="lefttorightvbox" file="spac-ali.mkiv"> + <cd:command name="lefttorightvbox" level="system" category="alignment" file="spac-ali.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="righttoleftvtop" file="spac-ali.mkiv"> + <cd:command name="righttoleftvtop" level="system" category="alignment" file="spac-ali.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="lefttorightvtop" file="spac-ali.mkiv"> + <cd:command name="lefttorightvtop" level="system" category="alignment" file="spac-ali.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="autodirhbox" file="spac-ali.mkiv"> + <cd:command name="autodirhbox" level="system" category="alignment" file="spac-ali.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="autodirvbox" file="spac-ali.mkiv"> + <cd:command name="autodirvbox" level="system" category="alignment" file="spac-ali.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="autodirvtop" file="spac-ali.mkiv"> + <cd:command name="autodirvtop" level="system" category="alignment" file="spac-ali.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="leftorrighthbox" file="spac-ali.mkiv"> + <cd:command name="leftorrighthbox" level="system" category="alignment" file="spac-ali.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="leftorrightvbox" file="spac-ali.mkiv"> + <cd:command name="leftorrightvbox" level="system" category="alignment" file="spac-ali.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="leftorrightvtop" file="spac-ali.mkiv"> + <cd:command name="leftorrightvtop" level="system" category="alignment" file="spac-ali.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="ibox" file="spac-ali.mkiv"> + <cd:command name="ibox" level="system" file="spac-ali.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="obox" file="spac-ali.mkiv"> + <cd:command name="obox" level="system" file="spac-ali.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="definehbox" file="spac-ali.mkiv"> + <cd:command name="definehbox" level="system" file="spac-ali.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-dimension"/> </cd:arguments> </cd:command> - <cd:command name="hbox" generated="yes" variant="example" file="spac-ali.mkiv"> + <cd:command name="hbox" generated="yes" variant="example" level="system" file="spac-ali.mkiv"> <cd:sequence> <cd:string value="hbox"/> <cd:variable value="box"/> @@ -1036,7 +1043,89 @@ </cd:arguments> </cd:command> - <cd:command name="lastlinewidth" file="supp-box.mkiv"> + <cd:command name="lastlinewidth" level="system" file="supp-box.mkiv"/> + + <cd:command name="putboxincache" level="system" file="supp-box.mkiv"> + <cd:arguments> + <cd:resolve name="argument-name"/> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:number"/> + <cd:constant type="cd:text"/> + </cd:keywords> + <cd:resolve name="string-box"/> + </cd:arguments> + </cd:command> + + <cd:command name="getboxfromcache" level="system" file="supp-box.mkiv"> + <cd:arguments> + <cd:resolve name="argument-name"/> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:number"/> + <cd:constant type="cd:text"/> + </cd:keywords> + <cd:resolve name="string-box"/> + </cd:arguments> + </cd:command> + + <cd:command name="doifelseboxincache" level="system" category="conditional" file="supp-box.mkiv"> + <cd:arguments> + <cd:resolve name="argument-name"/> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:number"/> + <cd:constant type="cd:text"/> + </cd:keywords> + <cd:resolve name="argument-true"/> + <cd:resolve name="argument-false"/> + </cd:arguments> + </cd:command> + + <cd:command name="copyboxfromcache" level="system" file="supp-box.mkiv"> + <cd:arguments> + <cd:resolve name="argument-name"/> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:number"/> + <cd:constant type="cd:text"/> + </cd:keywords> + <cd:resolve name="string-box"/> + </cd:arguments> + </cd:command> + + <cd:command name="directboxfromcache" level="system" file="supp-box.mkiv"> + <cd:arguments> + <cd:resolve name="argument-name"/> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:number"/> + <cd:constant type="cd:text"/> + </cd:keywords> + </cd:arguments> + </cd:command> + + <cd:command name="directcopyboxfromcache" level="system" file="supp-box.mkiv"> + <cd:arguments> + <cd:resolve name="argument-name"/> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:number"/> + <cd:constant type="cd:text"/> + </cd:keywords> + </cd:arguments> + </cd:command> + + <cd:command name="resetboxesincache" level="system" file="supp-box.mkiv"> + <cd:arguments> + <cd:resolve name="argument-name"/> + </cd:arguments> + </cd:command> + + <cd:command name="putnextboxincache" level="system" file="supp-box.mkiv"> + <cd:arguments> + <cd:resolve name="argument-name"/> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:number"/> + <cd:constant type="cd:text"/> + </cd:keywords> + <cd:csname/> + <cd:content/> + </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-buffer.xml b/tex/context/interface/mkiv/i-buffer.xml index 38571fcd4..2ec89f571 100644 --- a/tex/context/interface/mkiv/i-buffer.xml +++ b/tex/context/interface/mkiv/i-buffer.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="doifelsebuffer" file="buff-ini.mkiv"> + <cd:command name="doifelsebuffer" level="system" category="buffer conditional" file="buff-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-buffer"/> <cd:resolve name="argument-true"/> @@ -12,7 +12,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifbufferelse" file="buff-ini.mkiv"> + <cd:command name="doifbufferelse" level="system" category="buffer conditional" file="buff-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-buffer"/> <cd:resolve name="argument-true"/> @@ -20,19 +20,19 @@ </cd:arguments> </cd:command> - <cd:command name="resetbuffer" file="buff-ini.mkiv"> + <cd:command name="resetbuffer" level="system" category="buffer" file="buff-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-buffer"/> </cd:arguments> </cd:command> - <cd:command name="buffer" type="environment" file="buff-ini.mkiv"> + <cd:command name="buffer" type="environment" level="document" category="buffer" file="buff-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> </cd:arguments> </cd:command> - <cd:command name="grabbufferdata" file="buff-ini.mkiv"> + <cd:command name="grabbufferdata" level="system" category="buffer" file="buff-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-category-optional"/> <cd:resolve name="keyword-name"/> @@ -41,7 +41,7 @@ </cd:arguments> </cd:command> - <cd:command name="grabbufferdatadirect" file="buff-ini.mkiv"> + <cd:command name="grabbufferdatadirect" level="system" category="buffer" file="buff-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-name"/> @@ -49,13 +49,13 @@ </cd:arguments> </cd:command> - <cd:command name="buffer" type="environment" begin="set" end="end" file="buff-ini.mkiv"> + <cd:command name="buffer" type="environment" begin="set" end="end" level="system" category="buffer" file="buff-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="setupbuffer" file="buff-ini.mkiv"> + <cd:command name="setupbuffer" level="style" category="buffer" file="buff-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-buffer-list-optional"/> <cd:assignments list="yes"> @@ -69,7 +69,7 @@ </cd:arguments> </cd:command> - <cd:command name="definebuffer" file="buff-ini.mkiv"> + <cd:command name="definebuffer" level="style" category="buffer" file="buff-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-buffer-optional"/> @@ -79,43 +79,47 @@ </cd:arguments> </cd:command> - <cd:command name="getbuffer" file="buff-ini.mkiv"> + <cd:command name="getbuffer" level="document" category="buffer" file="buff-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-buffer-optional"/> </cd:arguments> </cd:command> - <cd:command name="getdefinedbuffer" file="buff-ini.mkiv"> + <cd:command name="getdefinedbuffer" level="system" category="buffer" file="buff-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-buffer"/> </cd:arguments> </cd:command> - <cd:command name="inlinebuffer" file="buff-ini.mkiv"> + <cd:command name="inlinebuffer" level="document" category="buffer" file="buff-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-buffer-list-optional"/> </cd:arguments> </cd:command> - <cd:command name="buffer" type="environment" generated="yes" variant="example" file="buff-ini.mkiv"> + <cd:command name="buffer" type="environment" generated="yes" variant="instance" lcategory="buffer" evel="document" file="buff-ini.mkiv"> <cd:sequence> - <cd:variable value="buffer"/> + <cd:instance value="buffer"/> </cd:sequence> <cd:instances> - <cd:constant value="hiding"/> + <cd:resolve name="instance-buffer"/> </cd:instances> </cd:command> - <cd:command name="getbuffer" generated="yes" variant="example" file="buff-ini.mkiv"> + <cd:command name="getbuffer" generated="yes" variant="instance" level="document" category="buffer" file="buff-ini.mkiv"> <cd:sequence> <cd:string value="get"/> - <cd:variable value="buffer"/> + <cd:instance value="buffer"/> </cd:sequence> </cd:command> - <cd:command name="hiding" type="environment" file="buff-ini.mkiv"/> + <!-- - <cd:command name="processtexbuffer" file="buff-ini.mkiv"> + <cd:command name="hiding" type="environment" level="document" category="buffer" file="buff-ini.mkiv"/> + + --> + + <cd:command name="processtexbuffer" level="style" category="buffer" file="buff-ini.mkiv"> <cd:sequence> <cd:string value="processTEXbuffer"/> </cd:sequence> @@ -124,14 +128,14 @@ </cd:arguments> </cd:command> - <cd:command name="savebuffer" variant="list" file="buff-ini.mkiv"> + <cd:command name="savebuffer" variant="list" level="style" category="buffer" file="buff-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-buffer-list"/> <cd:resolve name="keyword-file"/> </cd:arguments> </cd:command> - <cd:command name="savebuffer" file="buff-ini.mkiv"> + <cd:command name="savebuffer" level="style" category="buffer" file="buff-ini.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="list"> @@ -148,25 +152,25 @@ </cd:arguments> </cd:command> - <cd:command name="ctxluabuffer" file="buff-ini.mkiv"> + <cd:command name="ctxluabuffer" level="style" category="buffer lua" file="buff-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-buffer-optional"/> </cd:arguments> </cd:command> - <cd:command name="mkvibuffer" file="buff-ini.mkiv"> + <cd:command name="mkvibuffer" level="style" category="buffer" file="buff-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-buffer-optional"/> </cd:arguments> </cd:command> - <cd:command name="getbufferdata" file="buff-ini.mkiv"> + <cd:command name="getbufferdata" level="style" category="buffer" file="buff-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-buffer-optional"/> </cd:arguments> </cd:command> - <cd:command name="typebuffer" file="buff-ver.mkiv"> + <cd:command name="typebuffer" level="document" category="buffer verbatim" file="buff-ver.mkiv"> <cd:arguments> <cd:resolve name="keyword-buffer-list-optional"/> <cd:assignments list="yes" optional="yes"> @@ -175,10 +179,10 @@ </cd:arguments> </cd:command> - <cd:command name="typebuffer" generated="yes" variant="example" file="buff-ver.mkiv"> + <cd:command name="typebuffer" generated="yes" variant="instance" level="document" category="buffer verbatim" file="buff-ver.mkiv"> <cd:sequence> <cd:string value="type"/> - <cd:variable value="buffer"/> + <cd:instance value="buffer"/> </cd:sequence> <cd:arguments> <cd:assignments list="yes" optional="yes"> @@ -187,7 +191,7 @@ </cd:arguments> </cd:command> - <cd:command name="typedefinedbuffer" file="buff-ver.mkiv"> + <cd:command name="typedefinedbuffer" level="system" category="buffer verbatim" file="buff-ver.mkiv"> <cd:arguments> <cd:resolve name="keyword-buffer"/> <cd:assignments list="yes" optional="yes"> @@ -196,4 +200,31 @@ </cd:arguments> </cd:command> -</cd:interface> + <cd:command name="prettyprintbuffer" level="style" category="buffer verbatim" file="lxml-ini.mkiv"> + <cd:arguments> + <cd:resolve name="argument-buffer"/> + <cd:keywords delimiters="braces"> + <cd:resolve name="value-verbatim"/> + </cd:keywords> + </cd:arguments> + </cd:command> + + <cd:command name="inlineprettyprintbuffer" level="style" category="buffer verbatim" file="lxml-ini.mkiv"> + <cd:arguments> + <cd:resolve name="argument-buffer"/> + <cd:keywords delimiters="braces"> + <cd:resolve name="value-verbatim"/> + </cd:keywords> + </cd:arguments> + </cd:command> + + <cd:command name="typeinlinebuffer" level="style" category="buffer verbatim" file="buff-ver.mkiv"> + <cd:arguments> + <cd:resolve name="keyword-buffer-list-optional"/> + <cd:assignments list="yes" optional="yes"> + <cd:inherit name="setuptype"/> + </cd:assignments> + </cd:arguments> + </cd:command> + +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-button.xml b/tex/context/interface/mkiv/i-button.xml index 0ccb2d28d..d7228c949 100644 --- a/tex/context/interface/mkiv/i-button.xml +++ b/tex/context/interface/mkiv/i-button.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definebutton" file="scrn-but.mkvi"> + <cd:command name="definebutton" level="style" catehory="pdf" file="scrn-but.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupbutton" file="scrn-but.mkvi"> + <cd:command name="setupbutton" level="style" catehory="pdf" file="scrn-but.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -49,7 +49,7 @@ <!-- - <cd:command name="setupbuttons" file="scrn-but.mkvi"> + <cd:command name="setupbuttons" level="style" catehory="pdf" file="scrn-but.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -60,7 +60,7 @@ --> - <cd:command name="button" generated="yes" variant="example" file="scrn-but.mkvi"> + <cd:command name="button" generated="yes" variant="example" level="document" catehory="pdf" file="scrn-but.mkvi"> <cd:sequence> <cd:variable value="button"/> </cd:sequence> @@ -76,7 +76,7 @@ </cd:instances> </cd:command> - <cd:command name="button" file="scrn-but.mkvi"> + <cd:command name="button" level="document" catehory="pdf" file="scrn-but.mkvi"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupbutton"/> @@ -86,32 +86,32 @@ </cd:arguments> </cd:command> - <cd:command name="overlaybutton" file="scrn-but.mkvi"> + <cd:command name="overlaybutton" level="style" catehory="pdf" file="scrn-but.mkvi"> <cd:arguments> <cd:resolve name="keyword-reference"/> </cd:arguments> </cd:command> - <cd:command name="overlaybutton" variant="direct" file="scrn-but.mkvi"> + <cd:command name="overlaybutton" variant="direct" level="style" catehory="pdf" file="scrn-but.mkvi"> <cd:arguments> <cd:resolve name="argument-reference"/> </cd:arguments> </cd:command> - <cd:command name="MPmenubuttons" file="scrn-but.mkvi"> + <cd:command name="MPmenubuttons" level="style" catehory="pdf" file="scrn-but.mkvi"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="overlayrollbutton" file="scrn-fld.mkvi"> + <cd:command name="overlayrollbutton" level="style" catehory="pdf" file="scrn-fld.mkvi"> <cd:arguments> <cd:resolve name="keyword-reference"/> <cd:resolve name="keyword-reference"/> </cd:arguments> </cd:command> - <cd:command name="definepushbutton" file="scrn-fld.mkvi"> + <cd:command name="definepushbutton" level="style" catehory="pdf" file="scrn-fld.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes" optional="yes"> @@ -120,14 +120,14 @@ </cd:arguments> </cd:command> - <cd:command name="pushbutton" file="scrn-fld.mkvi"> + <cd:command name="pushbutton" level="style" catehory="pdf" file="scrn-fld.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-reference"/> </cd:arguments> </cd:command> - <cd:command name="definepushsymbol" file="scrn-fld.mkvi"> + <cd:command name="definepushsymbol" level="style" catehory="pdf" file="scrn-fld.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:keywords> @@ -140,7 +140,7 @@ <!-- - <cd:command name="psh" scope="interactionmenu" file="scrn-fld.mkvi"> + <cd:command name="psh" scope="interactionmenu" level="style" catehory="pdf" file="scrn-fld.mkvi"> <cd:arguments> <cd:resolve name="keyword-reference"/> <cd:resolve name="string-text"/> @@ -148,7 +148,7 @@ </cd:arguments> </cd:command> - <cd:command name="psh" type="environment" scope="interactionmenu" file="scrn-fld.mkvi"> + <cd:command name="psh" type="environment" scope="interactionmenu" level="style" catehory="pdf" file="scrn-fld.mkvi"> <cd:arguments> <cd:resolve name="keyword-reference"/> </cd:arguments> @@ -156,7 +156,7 @@ --> - <cd:command name="rollbutton" variant="interactionmenu" file="scrn-fld.mkvi"> + <cd:command name="rollbutton" variant="interactionmenu" level="style" catehory="pdf" file="scrn-fld.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:assignments list="yes" optional="yes"> @@ -167,7 +167,7 @@ </cd:arguments> </cd:command> - <cd:command name="rollbutton" variant="button" file="scrn-fld.mkvi"> + <cd:command name="rollbutton" variant="button" level="style" catehory="pdf" file="scrn-fld.mkvi"> <cd:arguments> <cd:assignments list="yes"> <cd:inherit name="setupbutton"/> @@ -179,7 +179,7 @@ <!-- - <cd:command name="rob" scope="interactionmenu" file="scrn-fld.mkvi"> + <cd:command name="rob" scope="interactionmenu" level="style" catehory="pdf" file="scrn-fld.mkvi"> <cd:arguments> <cd:resolve name="keyword-reference"/> <cd:resolve name="string-text"/> @@ -187,7 +187,7 @@ </cd:arguments> </cd:command> - <cd:command name="rob" type="environment" scope="interactionmenu" file="scrn-fld.mkvi"> + <cd:command name="rob" type="environment" scope="interactionmenu" level="style" catehory="pdf" file="scrn-fld.mkvi"> <cd:arguments> <cd:resolve name="keyword-reference"/> </cd:arguments> diff --git a/tex/context/interface/mkiv/i-capitals.xml b/tex/context/interface/mkiv/i-capitals.xml index 154a1a040..4cfb4a080 100644 --- a/tex/context/interface/mkiv/i-capitals.xml +++ b/tex/context/interface/mkiv/i-capitals.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definecapitals" file="typo-cap.mkiv"> + <cd:command name="definecapitals" level="style" category="fonts" file="typo-cap.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupcapitals" file="typo-cap.mkiv"> + <cd:command name="setupcapitals" level="style" category="fonts" file="typo-cap.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -33,7 +33,7 @@ </cd:arguments> </cd:command> - <cd:command name="setcharactercasing" file="typo-cap.mkiv"> + <cd:command name="setcharactercasing" level="style" category="fonts" file="typo-cap.mkiv"> <cd:arguments> <cd:keywords> <cd:constant type="reset"/> @@ -53,156 +53,156 @@ </cd:arguments> </cd:command> - <cd:command name="WORD" file="typo-cap.mkiv"> + <cd:command name="WORD" level="document" category="fonts" file="typo-cap.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="word" file="typo-cap.mkiv"> + <cd:command name="word" level="document" category="fonts" file="typo-cap.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="Word" file="typo-cap.mkiv"> + <cd:command name="Word" level="document" category="fonts" file="typo-cap.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="Words" file="typo-cap.mkiv"> + <cd:command name="Words" level="document" category="fonts" file="typo-cap.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="camel" file="typo-cap.mkiv"> + <cd:command name="camel" level="document" category="fonts" file="typo-cap.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="WORDS" file="typo-cap.mkiv"> + <cd:command name="WORDS" level="document" category="fonts" file="typo-cap.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="words" file="typo-cap.mkiv"> + <cd:command name="words" level="document" category="fonts" file="typo-cap.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="pseudosmallcapped" file="typo-cap.mkiv"> + <cd:command name="pseudosmallcapped" level="style" category="fonts" file="typo-cap.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="pseudoSmallcapped" file="typo-cap.mkiv"> + <cd:command name="pseudoSmallcapped" level="style" category="fonts" file="typo-cap.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="pseudoSmallCapped" file="typo-cap.mkiv"> + <cd:command name="pseudoSmallCapped" level="style" category="fonts" file="typo-cap.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="pseudoMixedCapped" file="typo-cap.mkiv"> + <cd:command name="pseudoMixedCapped" level="style" category="fonts" file="typo-cap.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="realsmallcapped" file="typo-cap.mkiv"> + <cd:command name="realsmallcapped" level="style" category="fonts" file="typo-cap.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="realSmallcapped" file="typo-cap.mkiv"> + <cd:command name="realSmallcapped" level="style" category="fonts" file="typo-cap.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="realSmallCapped" file="typo-cap.mkiv"> + <cd:command name="realSmallCapped" level="style" category="fonts" file="typo-cap.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="notsmallcapped" file="typo-cap.mkiv"> + <cd:command name="notsmallcapped" level="style" category="fonts" file="typo-cap.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="smallcapped" file="typo-cap.mkiv"> + <cd:command name="smallcapped" level="style" category="fonts" file="typo-cap.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="Smallcapped" file="typo-cap.mkiv"> + <cd:command name="Smallcapped" level="style" category="fonts" file="typo-cap.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="SmallCapped" file="typo-cap.mkiv"> + <cd:command name="SmallCapped" level="style" category="fonts" file="typo-cap.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="autocap" file="typo-cap.mkiv"> + <cd:command name="autocap" level="style" category="fonts" file="typo-cap.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="mixedcaps" file="typo-cap.mkiv"> + <cd:command name="mixedcaps" level="style" category="fonts" file="typo-cap.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="kap" file="typo-cap.mkiv"> + <cd:command name="kap" level="style" category="fonts" file="typo-cap.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="Caps" file="typo-cap.mkiv"> + <cd:command name="Caps" level="style" category="fonts" file="typo-cap.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="uppercased" file="typo-cap.mkiv"> + <cd:command name="uppercased" level="style" category="fonts" file="typo-cap.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="lowercased" file="typo-cap.mkiv"> + <cd:command name="lowercased" level="style" category="fonts" file="typo-cap.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="randomizetext" file="typo-cap.mkiv"> + <cd:command name="randomizetext" level="style" category="fonts" file="typo-cap.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="randomized" type="environment" file="typo-cap.mkiv"/> + <cd:command name="randomized" type="environment" level="document" category="fonts" file="typo-cap.mkiv"/> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-catcodes.xml b/tex/context/interface/mkiv/i-catcodes.xml index b8636ceee..351e8f6e4 100644 --- a/tex/context/interface/mkiv/i-catcodes.xml +++ b/tex/context/interface/mkiv/i-catcodes.xml @@ -4,63 +4,63 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="texcode" type="environment" file="catc-ctx.mkiv"/> + <cd:command name="texcode" type="environment" level="system" category="catcode" file="catc-ctx.mkiv"/> - <cd:command name="contextcode" type="environment" file="catc-ctx.mkiv"/> + <cd:command name="contextcode" type="environment" level="system" category="catcode" file="catc-ctx.mkiv"/> - <cd:command name="contextdefinitioncode" type="environment" file="catc-ctx.mkiv"/> + <cd:command name="contextdefinitioncode" type="environment" level="system" category="catcode" file="catc-ctx.mkiv"/> - <cd:command name="protect" type="environment" begin="un" end="" file="catc-def.mkiv"/><!-- end="zero width space" --> + <cd:command name="protect" type="environment" begin="un" end="" level="system" category="catcode" file="catc-def.mkiv"/><!-- end="zero width space" --> - <cd:command name="newcatcodetable" file="catc-ini.mkiv"> + <cd:command name="newcatcodetable" level="system" category="catcode" file="catc-ini.mkiv"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="catcodetable" type="environment" file="catc-ini.mkiv"> + <cd:command name="catcodetable" type="environment" level="system" category="catcode" file="catc-ini.mkiv"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="extendedcatcodetable" type="environment" file="catc-ini.mkiv"> + <cd:command name="extendedcatcodetable" type="environment" level="system" category="catcode" file="catc-ini.mkiv"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="installactivecharacter" file="catc-act.mkiv"> + <cd:command name="installactivecharacter" level="system" category="catcode" file="catc-act.mkiv"> <cd:arguments> <cd:resolve name="string-character"/> </cd:arguments> </cd:command> - <cd:command name="defineactivecharacter" file="catc-act.mkiv"> + <cd:command name="defineactivecharacter" level="system" category="catcode" file="catc-act.mkiv"> <cd:arguments> <cd:resolve name="string-character"/> <cd:resolve name="argument-command"/> </cd:arguments> </cd:command> - <cd:command name="installanddefineactivecharacter" file="catc-act.mkiv"> + <cd:command name="installanddefineactivecharacter" level="system" category="catcode" file="catc-act.mkiv"> <cd:arguments> <cd:resolve name="string-character"/> <cd:resolve name="argument-command"/> </cd:arguments> </cd:command> - <cd:command name="makecharacteractive" file="catc-act.mkiv"> + <cd:command name="makecharacteractive" level="system" category="catcode" file="catc-act.mkiv"> <cd:arguments> <cd:resolve name="string-character"/> </cd:arguments> </cd:command> - <cd:command name="permitcircumflexescape" file="catc-ini.mkiv"/> + <cd:command name="permitcircumflexescape" level="system" category="catcode" file="catc-ini.mkiv"/> - <cd:command name="permitcaretescape" file="catc-ini.mkiv"/> + <cd:command name="permitcaretescape" level="system" category="catcode" file="catc-ini.mkiv"/> - <cd:command name="letcatcodecommand" file="catc-ini.mkiv"> + <cd:command name="letcatcodecommand" level="system" category="catcode" file="catc-ini.mkiv"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="none"> @@ -71,7 +71,7 @@ </cd:arguments> </cd:command> - <cd:command name="defcatcodecommand" file="catc-ini.mkiv"> + <cd:command name="defcatcodecommand" level="system" category="catcode" file="catc-ini.mkiv"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="none"> @@ -82,7 +82,7 @@ </cd:arguments> </cd:command> - <cd:command name="uedcatcodecommand" file="catc-ini.mkiv"> + <cd:command name="uedcatcodecommand" level="system" category="catcode" file="catc-ini.mkiv"> <cd:arguments> <cd:csname/> <cd:keywords delimiters="none"> @@ -93,31 +93,31 @@ </cd:arguments> </cd:command> - <cd:command name="catcodetable" type="environment" begin="push" end="pop" file="catc-ini.mkiv"/> + <cd:command name="catcodetable" type="environment" begin="push" end="pop" level="system" category="catcode" file="catc-ini.mkiv"/> - <cd:command name="restorecatcodes" file="catc-ini.mkiv"/> + <cd:command name="restorecatcodes" level="system" category="catcode" file="catc-ini.mkiv"/> - <cd:command name="setcatcodetable" file="catc-ini.mkiv"> + <cd:command name="setcatcodetable" level="system" category="catcode" file="catc-ini.mkiv"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="tracecatcodetables" file="catc-ini.mkiv"/> + <cd:command name="tracecatcodetables" level="system" category="catcode" file="catc-ini.mkiv"/> - <cd:command name="catcodetablename" file="catc-ini.mkiv"/> + <cd:command name="catcodetablename" level="system" category="catcode" file="catc-ini.mkiv"/> - <cd:command name="rescan" file="catc-sym.mkiv"> + <cd:command name="rescan" level="system" category="catcode" file="catc-sym.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="rescanwithsetup" file="catc-sym.mkiv"> + <cd:command name="rescanwithsetup" level="system" category="catcode" file="catc-sym.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:content/> </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-character.xml b/tex/context/interface/mkiv/i-character.xml index f7f0e08db..c391836d5 100644 --- a/tex/context/interface/mkiv/i-character.xml +++ b/tex/context/interface/mkiv/i-character.xml @@ -4,133 +4,141 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="letteropenbrace" file="catc-sym.mkiv"/> + <cd:command name="letteropenbrace" level="document" category="characters" file="catc-sym.mkiv"/> - <cd:command name="letterclosebrace" file="catc-sym.mkiv"/> + <cd:command name="letterclosebrace" level="document" category="characters" file="catc-sym.mkiv"/> - <cd:command name="letterampersand" file="catc-sym.mkiv"/> + <cd:command name="letterampersand" level="document" category="characters" file="catc-sym.mkiv"/> - <cd:command name="letterless" file="catc-sym.mkiv"/> + <cd:command name="letterless" level="document" category="characters" file="catc-sym.mkiv"/> - <cd:command name="lettermore" file="catc-sym.mkiv"/> + <cd:command name="lettermore" level="document" category="characters" file="catc-sym.mkiv"/> - <cd:command name="letterhash" file="catc-sym.mkiv"/> + <cd:command name="letterhash" level="document" category="characters" file="catc-sym.mkiv"/> - <cd:command name="letterdoublequote" file="catc-sym.mkiv"/> + <cd:command name="letterdoublequote" level="document" category="characters" file="catc-sym.mkiv"/> - <cd:command name="lettersinglequote" file="catc-sym.mkiv"/> + <cd:command name="lettersinglequote" level="document" category="characters" file="catc-sym.mkiv"/> - <cd:command name="letterdollar" file="catc-sym.mkiv"/> + <cd:command name="letterdollar" level="document" category="characters" file="catc-sym.mkiv"/> - <cd:command name="letterpercent" file="catc-sym.mkiv"/> + <cd:command name="letterpercent" level="document" category="characters" file="catc-sym.mkiv"/> - <cd:command name="letterhat" file="catc-sym.mkiv"/> + <cd:command name="letterhat" level="document" category="characters" file="catc-sym.mkiv"/> - <cd:command name="letterunderscore" file="catc-sym.mkiv"/> + <cd:command name="letterunderscore" level="document" category="characters" file="catc-sym.mkiv"/> - <cd:command name="letterbar" file="catc-sym.mkiv"/> + <cd:command name="letterbar" level="document" category="characters" file="catc-sym.mkiv"/> - <cd:command name="lettertilde" file="catc-sym.mkiv"/> + <cd:command name="lettertilde" level="document" category="characters" file="catc-sym.mkiv"/> - <cd:command name="letterbackslash" file="catc-sym.mkiv"/> + <cd:command name="letterbackslash" level="document" category="characters" file="catc-sym.mkiv"/> - <cd:command name="letterslash" file="catc-sym.mkiv"/> + <cd:command name="letterslash" level="document" category="characters" file="catc-sym.mkiv"/> - <cd:command name="letterquestionmark" file="catc-sym.mkiv"/> + <cd:command name="letterquestionmark" level="document" category="characters" file="catc-sym.mkiv"/> - <cd:command name="letterat" file="catc-sym.mkiv"/> + <cd:command name="letterat" level="document" category="characters" file="catc-sym.mkiv"/> - <cd:command name="lettercolon" file="catc-sym.mkiv"/> + <cd:command name="lettercolon" level="document" category="characters" file="catc-sym.mkiv"/> - <cd:command name="letterescape" file="catc-sym.mkiv"/> + <cd:command name="letterleftparenthesis" level="document" category="characters" file="catc-sym.mkiv"/> - <cd:command name="letterbgroup" file="catc-sym.mkiv"/> + <cd:command name="letterrightparenthesis" level="document" category="characters" file="catc-sym.mkiv"/> - <cd:command name="letteregroup" file="catc-sym.mkiv"/> + <cd:command name="letterleftbracket" level="document" category="characters" file="catc-sym.mkiv"/> - <cd:command name="letterleftbrace" file="catc-sym.mkiv"/> + <cd:command name="letterrightbracket" level="document" category="characters" file="catc-sym.mkiv"/> - <cd:command name="letterrightbrace" file="catc-sym.mkiv"/> + <cd:command name="letterescape" level="document" category="characters" file="catc-sym.mkiv"/> - <cd:command name="letterexclamationmark" file="catc-sym.mkiv"/> + <cd:command name="letterbgroup" level="document" category="characters" file="catc-sym.mkiv"/> - <cd:command name="utfchar" file="char-ini.mkiv"> + <cd:command name="letteregroup" level="document" category="characters" file="catc-sym.mkiv"/> + + <cd:command name="letterleftbrace" level="document" category="characters" file="catc-sym.mkiv"/> + + <cd:command name="letterrightbrace" level="document" category="characters" file="catc-sym.mkiv"/> + + <cd:command name="letterexclamationmark" level="document" category="characters" file="catc-sym.mkiv"/> + + <cd:command name="utfchar" level="document" category="characters fonts" file="char-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="safechar" file="char-ini.mkiv"> + <cd:command name="safechar" level="style" category="characters fonts" file="char-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="checkedchar" file="char-ini.mkiv"> + <cd:command name="checkedchar" level="style" category="characters fonts" file="char-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> <cd:resolve name="argument-character"/> </cd:arguments> </cd:command> - <cd:command name="textormathchar" file="char-ini.mkiv"> + <cd:command name="textormathchar" level="style" category="characters fonts" file="char-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="chardescription" file="char-ini.mkiv"> + <cd:command name="chardescription" level="style" category="characters" file="char-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="percent" file="enco-ini.mkiv"/> + <cd:command name="percent" level="document" category="characters" file="enco-ini.mkiv"/> - <cd:command name="procent" file="enco-ini.mkiv"/> + <cd:command name="procent" level="document" category="characters" file="enco-ini.mkiv"/> - <cd:command name="ampersand" file="enco-ini.mkiv"/> + <cd:command name="ampersand" level="document" category="characters" file="enco-ini.mkiv"/> - <cd:command name="dollar" file="enco-ini.mkiv"/> + <cd:command name="dollar" level="document" category="characters" file="enco-ini.mkiv"/> - <cd:command name="hash" file="enco-ini.mkiv"/> + <cd:command name="hash" level="document" category="characters" file="enco-ini.mkiv"/> - <cd:command name="hyphen" file="enco-ini.mkiv"/> + <cd:command name="hyphen" level="document" category="characters" file="enco-ini.mkiv"/> - <cd:command name="lowerleftsingleninequote" file="enco-ini.mkiv"/> + <cd:command name="lowerleftsingleninequote" level="style" category="characters" file="enco-ini.mkiv"/> - <cd:command name="lowerleftdoubleninequote" file="enco-ini.mkiv"/> + <cd:command name="lowerleftdoubleninequote" level="style" category="characters" file="enco-ini.mkiv"/> - <cd:command name="lowerrightsingleninequote" file="enco-ini.mkiv"/> + <cd:command name="lowerrightsingleninequote" level="style" category="characters" file="enco-ini.mkiv"/> - <cd:command name="lowerrightdoubleninequote" file="enco-ini.mkiv"/> + <cd:command name="lowerrightdoubleninequote" level="style" category="characters" file="enco-ini.mkiv"/> - <cd:command name="upperleftsingleninequote" file="enco-ini.mkiv"/> + <cd:command name="upperleftsingleninequote" level="style" category="characters" file="enco-ini.mkiv"/> - <cd:command name="upperleftdoubleninequote" file="enco-ini.mkiv"/> + <cd:command name="upperleftdoubleninequote" level="style" category="characters" file="enco-ini.mkiv"/> - <cd:command name="upperrightsingleninequote" file="enco-ini.mkiv"/> + <cd:command name="upperrightsingleninequote" level="style" category="characters" file="enco-ini.mkiv"/> - <cd:command name="upperrightdoubleninequote" file="enco-ini.mkiv"/> + <cd:command name="upperrightdoubleninequote" level="style" category="characters" file="enco-ini.mkiv"/> - <cd:command name="upperleftsinglesixquote" file="enco-ini.mkiv"/> + <cd:command name="upperleftsinglesixquote" level="style" category="characters" file="enco-ini.mkiv"/> - <cd:command name="upperleftdoublesixquote" file="enco-ini.mkiv"/> + <cd:command name="upperleftdoublesixquote" level="style" category="characters" file="enco-ini.mkiv"/> - <cd:command name="upperrightsinglesixquote" file="enco-ini.mkiv"/> + <cd:command name="upperrightsinglesixquote" level="style" category="characters" file="enco-ini.mkiv"/> - <cd:command name="upperrightdoublesixquote" file="enco-ini.mkiv"/> + <cd:command name="upperrightdoublesixquote" level="style" category="characters" file="enco-ini.mkiv"/> - <cd:command name="leftsubguillemot" file="enco-ini.mkiv"/> + <cd:command name="leftsubguillemot" level="style" category="characters" file="enco-ini.mkiv"/> - <cd:command name="rightsubguillemot" file="enco-ini.mkiv"/> + <cd:command name="rightsubguillemot" level="style" category="characters" file="enco-ini.mkiv"/> - <cd:command name="textcontrolspace" file="enco-ini.mkiv"/> + <cd:command name="textcontrolspace" level="document" category="characters" file="enco-ini.mkiv"/> - <cd:command name="textvisiblespace" file="enco-ini.mkiv"/> + <cd:command name="textvisiblespace" level="document" category="characters" file="enco-ini.mkiv"/> - <cd:command name="textminus" file="enco-ini.mkiv"/> + <cd:command name="textminus" level="document" category="characters" file="enco-ini.mkiv"/> - <cd:command name="textplus" file="enco-ini.mkiv"/> + <cd:command name="textplus" level="document" category="characters" file="enco-ini.mkiv"/> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-characteralign.xml b/tex/context/interface/mkiv/i-characteralign.xml index a515ba1e9..3e9f81722 100644 --- a/tex/context/interface/mkiv/i-characteralign.xml +++ b/tex/context/interface/mkiv/i-characteralign.xml @@ -4,14 +4,14 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="singalcharacteralign" file="typo-tal.mkiv"> + <cd:command name="singalcharacteralign" level="system" category="alignment" file="typo-tal.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="setcharacteralign" file="typo-tal.mkiv"> + <cd:command name="setcharacteralign" level="system" category="alignment" file="typo-tal.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> <cd:keywords delimiters="braces"> @@ -22,11 +22,11 @@ </cd:arguments> </cd:command> - <cd:command name="resetcharacteralign" file="typo-tal.mkiv"/> + <cd:command name="resetcharacteralign" level="system" category="alignment" file="typo-tal.mkiv"/> - <cd:command name="alignmentcharacter" file="typo-tal.mkiv"/> + <cd:command name="alignmentcharacter" level="system" category="alignment" file="typo-tal.mkiv"/> - <cd:command name="characteralign" type="environment" file="typo-tal.mkiv"> + <cd:command name="characteralign" type="environment" category="alignment" level="system" file="typo-tal.mkiv"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:text"/> @@ -36,10 +36,10 @@ </cd:arguments> </cd:command> - <cd:command name="checkcharacteralign" file="typo-tal.mkiv"> + <cd:command name="checkcharacteralign" level="system" category="alignment" file="typo-tal.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-characterspacing.xml b/tex/context/interface/mkiv/i-characterspacing.xml index cb54030c7..0247115a3 100644 --- a/tex/context/interface/mkiv/i-characterspacing.xml +++ b/tex/context/interface/mkiv/i-characterspacing.xml @@ -4,13 +4,13 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definecharacterspacing" file="typo-spa.mkiv"> + <cd:command name="definecharacterspacing" level="style" category="fonts" file="typo-spa.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="setupcharacterspacing" file="typo-spa.mkiv"> + <cd:command name="setupcharacterspacing" level="style" category="fonts" file="typo-spa.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-number"/> @@ -29,7 +29,7 @@ </cd:arguments> </cd:command> - <cd:command name="setcharacterspacing" file="typo-spa.mkiv"> + <cd:command name="setcharacterspacing" level="style" category="fonts" file="typo-spa.mkiv"> <cd:arguments> <cd:keywords> <cd:constant type="reset"/> @@ -38,6 +38,6 @@ </cd:arguments> </cd:command> - <cd:command name="resetcharacterspacing" file="typo-spa.mkiv"/> + <cd:command name="resetcharacterspacing" level="style" category="fonts" file="typo-spa.mkiv"/> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-characterstripping.xml b/tex/context/interface/mkiv/i-characterstripping.xml index cd89ac065..5c776e3ab 100644 --- a/tex/context/interface/mkiv/i-characterstripping.xml +++ b/tex/context/interface/mkiv/i-characterstripping.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="setcharacterstripping" file="typo-rep.mkiv"> + <cd:command name="setcharacterstripping" level="style" category="language" file="typo-rep.mkiv"> <cd:arguments> <cd:keywords> <cd:constant type="reset"/> @@ -13,8 +13,8 @@ </cd:arguments> </cd:command> - <cd:command name="resetcharacterstripping" file="typo-rep.mkiv"/> + <cd:command name="resetcharacterstripping" level="style" category="language" file="typo-rep.mkiv"/> - <cd:command name="forcecharacterstripping" file="typo-rep.mkiv"/> + <cd:command name="forcecharacterstripping" level="style" category="language" file="typo-rep.mkiv"/> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-chart.xml b/tex/context/interface/mkiv/i-chart.xml index 06c356041..2b73f1322 100644 --- a/tex/context/interface/mkiv/i-chart.xml +++ b/tex/context/interface/mkiv/i-chart.xml @@ -4,13 +4,111 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <?context-directive job ctxfile x-setups.ctx ?> + <!-- + + <cd:command name="setupFLOWchart" level="style" category="graphics metapost" file="m-chart.mkvi"> + <cd:arguments> + <cd:resolve name="keyword-name-list-optional"/> + <cd:assignments list="yes"> + <cd:parameter name="width"> + <cd:constant type="cd:dimension"/> + </cd:parameter> + <cd:parameter name="height"> + <cd:constant type="cd:dimension"/> + </cd:parameter> + <cd:parameter name="offset"> + <cd:constant type="cd:dimension"/> + </cd:parameter> + <cd:parameter name="dx"> + <cd:constant type="cd:dimension"/> + </cd:parameter> + <cd:parameter name="dy"> + <cd:constant type="cd:dimension"/> + </cd:parameter> + <cd:parameter name="nx"> + <cd:constant type="cd:number"/> + </cd:parameter> + <cd:parameter name="ny"> + <cd:constant type="cd:number"/> + </cd:parameter> + <cd:parameter name="x"> + <cd:constant type="cd:number"/> + </cd:parameter> + <cd:parameter name="y"> + <cd:constant type="cd:number"/> + </cd:parameter> + <cd:parameter name="labeloffset"> + <cd:constant type="cd:dimension"/> + </cd:parameter> + <cd:parameter name="commentoffset"> + <cd:constant type="cd:dimension"/> + </cd:parameter> + <cd:parameter name="exitoffset"> + <cd:constant type="cd:dimension"/> + </cd:parameter> + <cd:parameter name="split"> + <cd:constant type="yes"/> + <cd:constant type="no" default="yes"/> + </cd:parameter> + <cd:parameter name="bodyfont"> + <cd:inherit name="setupbodyfont"/> + </cd:parameter> + <cd:parameter name="option"> + <cd:constant type="test"/> + </cd:parameter> + <cd:parameter name="dot"> + <cd:constant type="yes"/> + <cd:constant type="con"/> + <cd:constant type="mid"/> + <cd:constant type="all"/> + </cd:parameter> + <cd:parameter name="hcompact"> + <cd:constant type="yes"/> + <cd:constant type="no" default="yes"/> + </cd:parameter> + <cd:parameter name="vcompact"> + <cd:constant type="yes"/> + <cd:constant type="no" default="yes"/> + </cd:parameter> + <cd:parameter name="focus"> + <cd:constant type="cd:text"/> + </cd:parameter> + <cd:parameter name="autofocus"> + <cd:constant type="cd:text"/> + </cd:parameter> + <cd:parameter name="background"> + <cd:resolve name="value-background"/> + </cd:parameter> + <cd:parameter name="framecolor"> + <cd:constant type="cd:color"/> + </cd:parameter> + <cd:parameter name="backgroundcolor"> + <cd:constant type="cd:color"/> + </cd:parameter> + <cd:parameter name="rulethickness"> + <cd:constant type="cd:dimension"/> + </cd:parameter> + <cd:parameter name="frame"> + <cd:constant type="on"/> + <cd:constant type="off" default="yes"/> + </cd:parameter> + </cd:assignments> + </cd:arguments> + </cd:command> - <!-- still incomplete --> + <cd:command name="setupFLOWcharts" level="style" category="graphics metapost" file="m-chart.mkvi"> + <cd:arguments> + <cd:resolve name="keyword-name-list-optional"/> + <cd:assignments list="yes"> + <cd:inherit name="setupFLOWchart"/> + </cd:assignments> + </cd:arguments> + </cd:command> - <cd:command name="setupFLOWcharts" file="m-chart.mkiv"> + --> + + <cd:command name="setupFLOWcharts" level="style" category="graphics metapost" file="m-chart.mkvi"> <cd:arguments> - <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> <cd:parameter name="width"> <cd:constant type="cd:dimension"/> @@ -58,18 +156,28 @@ <cd:parameter name="option"> <cd:constant type="test"/> </cd:parameter> - <!-- dot: private option --> - <cd:parameter name="focus"> - <cd:constant type="cd:text"/> - </cd:parameter> - <cd:parameter name="autofocus"> + <!-- dot: private option + <cd:parameter name="dot"> + <cd:constant type="yes"/> + <cd:constant type="con"/> + <cd:constant type="mid"/> + <cd:constant type="all"/> + </cd:parameter> + --> + <cd:parameter name="hcompact"> <cd:constant type="yes"/> <cd:constant type="no" default="yes"/> </cd:parameter> - <cd:parameter name="autofocus"> + <cd:parameter name="vcompact"> <cd:constant type="yes"/> <cd:constant type="no" default="yes"/> </cd:parameter> + <cd:parameter name="focus"> + <cd:constant type="cd:text"/> + </cd:parameter> + <cd:parameter name="autofocus"> + <cd:constant type="cd:text"/> + </cd:parameter> <cd:parameter name="background"> <cd:resolve name="value-background"/> </cd:parameter> @@ -83,135 +191,351 @@ <cd:constant type="cd:dimension"/> </cd:parameter> <cd:parameter name="frame"> - <cd:constant type="on" default="yes"/> - <cd:constant type="off"/> + <cd:constant type="on"/> + <cd:constant type="off" default="yes"/> </cd:parameter> </cd:assignments> </cd:arguments> </cd:command> - <cd:command name="setupFLOWlines" file="m-chart.mkiv"> + <!-- + <cd:command name="setupFLOWline" level="style" category="graphics metapost" file="m-chart.mkvi"> + <cd:arguments> + <cd:resolve name="keyword-name-list-optional"/> + <cd:assignments list="yes"> + <cd:parameter name="corner"> + <cd:constant type="round" default="yes"/> + </cd:parameter> + <cd:parameter name="arrow"> + <cd:constant type="yes" default="yes"/> + <cd:constant type="no"/> + </cd:parameter> + <cd:parameter name="dash"> + <cd:constant type="yes"/> + <cd:constant type="no" default="yes"/> + </cd:parameter> + <cd:parameter name="radius"> + <cd:constant type="cd:dimension"/> + </cd:parameter> + <cd:parameter name="color"> + <cd:constant type="cd:color"/> + </cd:parameter> + <cd:parameter name="rulethickness"> + <cd:constant type="cd:dimension"/> + </cd:parameter> + <cd:parameter name="offset"> + <cd:constant type="none"/> + <cd:constant type="cd:dimension"/> + </cd:parameter> + </cd:assignments> + </cd:arguments> + </cd:command> + + <cd:command name="setupFLOWlines" level="style" category="graphics metapost" file="m-chart.mkvi"> + <cd:arguments> + <cd:resolve name="keyword-name-list-optional"/> + <cd:assignments list="yes"> + <cd:inherit name="setupFLOWline"/> + </cd:assignments> + </cd:arguments> + </cd:command> + + --> + + <cd:command name="setupFLOWlines" level="style" category="graphics metapost" file="m-chart.mkvi"> <cd:arguments> - <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> - <cd:parameter name="color"> - <cd:constant name="round"/> - <cd:constant name="normal" default="yes"/> + <cd:parameter name="corner"> + <cd:constant type="round" default="yes"/> </cd:parameter> <cd:parameter name="arrow"> - <cd:constant name="yes" default="yes"/> - <cd:constant name="no"/> + <cd:constant type="yes" default="yes"/> + <cd:constant type="no"/> </cd:parameter> <cd:parameter name="dash"> - <cd:constant name="yes"/> - <cd:constant name="no" default="yes"/> + <cd:constant type="yes"/> + <cd:constant type="no" default="yes"/> </cd:parameter> <cd:parameter name="radius"> <cd:constant type="cd:dimension"/> </cd:parameter> <cd:parameter name="color"> - <cd:constant name="cd:color"/> + <cd:constant type="cd:color"/> </cd:parameter> <cd:parameter name="rulethickness"> - <cd:constant name="cd:dimension"/> + <cd:constant type="cd:dimension"/> </cd:parameter> <cd:parameter name="offset"> + <cd:constant type="none"/> <cd:constant type="cd:dimension"/> </cd:parameter> </cd:assignments> </cd:arguments> </cd:command> - <cd:command name="setupFLOWshapes" file="m-chart.mkiv"> + <!-- + + <cd:command name="setupFLOWshape" level="style" category="graphics metapost" file="m-chart.mkvi"> + <cd:arguments> + <cd:resolve name="keyword-name-list-optional"/> + <cd:assignments list="yes"> + <cd:parameter name="default"> + <cd:resolve name="value-flowshape"/> + </cd:parameter> + <cd:parameter name="framecolor"> + <cd:constant type="cd:color"/> + </cd:parameter> + <cd:parameter name="backgroundcolor"> + <cd:constant type="cd:color"/> + </cd:parameter> + <cd:parameter name="rulethickness"> + <cd:constant type="cd:dimension"/> + </cd:parameter> + </cd:assignments> + </cd:arguments> + </cd:command> + + <cd:command name="setupFLOWshapes" level="style" category="graphics metapost" file="m-chart.mkvi"> + <cd:arguments> + <cd:resolve name="keyword-name-list-optional"/> + <cd:assignments list="yes"> + <cd:inherit name="setupFLOWshape"/> + </cd:assignments> + </cd:arguments> + </cd:command> + + --> + + <cd:command name="setupFLOWshapes" level="style" category="graphics metapost" file="m-chart.mkvi"> <cd:arguments> - <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> <cd:parameter name="default"> - <cd:resolve name="cd:name"/> + <cd:resolve name="value-flowshape"/> </cd:parameter> <cd:parameter name="framecolor"> - <cd:constant name="cd:color"/> - </cd:parameter> - <cd:parameter name="background"> - <cd:resolve name="value-background"/> + <cd:constant type="cd:color"/> </cd:parameter> <cd:parameter name="backgroundcolor"> - <cd:constant name="cd:color"/> + <cd:constant type="cd:color"/> </cd:parameter> <cd:parameter name="rulethickness"> - <cd:constant name="cd:dimension"/> - </cd:parameter> - <cd:parameter name="offset"> - <cd:constant type="none"/> - <cd:constant type="overlay"/> - <cd:constant type="standard"/> <cd:constant type="cd:dimension"/> </cd:parameter> </cd:assignments> </cd:arguments> </cd:command> - <cd:command name="setupFLOWfocus" file="m-chart.mkiv"> + <cd:command name="setupFLOWfocus" level="style" category="graphics metapost" file="m-chart.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> - <cd:parameter name="color"> + <cd:parameter name="framecolor"> <cd:constant type="cd:color"/> </cd:parameter> - <cd:parameter name="background"> - <cd:inherit name="setupFLOWshape"/> - </cd:parameter> <cd:parameter name="backgroundcolor"> - <cd:inherit name="setupFLOWshape"/> + <cd:constant type="cd:color"/> </cd:parameter> <cd:parameter name="rulethickness"> - <cd:inherit name="setupFLOWshape"/> - </cd:parameter> - <cd:parameter name="offset"> - <cd:inherit name="setupFLOWshape"/> + <cd:constant type="cd:dimension"/> </cd:parameter> </cd:assignments> </cd:arguments> </cd:command> - <cd:command name="setupFLOWsplit" file="m-chart.mkiv"> + <cd:command name="setupFLOWsplit" level="style" category="graphics metapost" file="m-chart.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> <cd:parameter name="dx"> - <cd:constant name="cd:number"/> + <cd:constant type="cd:number"/> </cd:parameter> <cd:parameter name="dy"> - <cd:constant name="cd:number"/> + <cd:constant type="cd:number"/> </cd:parameter> <cd:parameter name="nx"> - <cd:constant name="cd:number"/> + <cd:constant type="cd:number"/> </cd:parameter> <cd:parameter name="ny"> - <cd:constant name="cd:number"/> + <cd:constant type="cd:number"/> </cd:parameter> <cd:parameter name="command"> - <cd:constant name="cd:command"/> + <cd:constant type="cd:oneargument"/> </cd:parameter> <cd:parameter name="before"> - <cd:constant name="cd:command"/> + <cd:constant type="cd:command"/> </cd:parameter> <cd:parameter name="after"> - <cd:constant name="cd:command"/> + <cd:constant type="cd:command"/> </cd:parameter> </cd:assignments> </cd:arguments> </cd:command> - <!-- + <cd:command name="FLOWchart" type="environment" level="document" category="graphics metapost" file="m-chart.mkvi"> + <cd:arguments> + <cd:resolve name="keyword-name"/> + </cd:arguments> + </cd:command> - startFLOWchart [name] - FLOWchart [name] - startFLOWcell [key=value] - includeFLOWchart + <cd:command name="defineFLOWchart" level="style" category="graphics metapost" file="m-chart.mkvi"> + <cd:arguments> + <cd:resolve name="keyword-name"/> + <cd:content/> + </cd:arguments> + </cd:command> - name shape destination focus overlay location text label comment exit - connection include figure connect locate - --> + <cd:command name="FLOWcell" type="environment" level="document" category="graphics metapost" file="m-chart.mkvi"> + <cd:arguments> + <cd:assignments list="yes" optional="yes"> + <cd:inherit name="setupFLOWshape"/> + </cd:assignments> + <cd:assignments list="yes" optional="yes"> + <cd:inherit name="setupFLOWline"/> + </cd:assignments> + </cd:arguments> + </cd:command> + + <cd:command name="FLOWchart" level="document" category="graphics metapost" file="m-chart.mkvi"> + <cd:arguments> + <cd:resolve name="keyword-name"/> + <cd:assignments list="yes" optional="yes"> + <cd:inherit name="setupFLOWchart"/> + </cd:assignments> + </cd:arguments> + </cd:command> + + <cd:command name="FLOWcharts" level="document" category="graphics metapost" file="m-chart.mkvi"> + <cd:arguments> + <cd:resolve name="keyword-name"/> + <cd:assignments list="yes" optional="yes"> + <cd:inherit name="setupFLOWsplit"/> + </cd:assignments> + </cd:arguments> + </cd:command> + + <cd:command name="name" scope="flowchart" level="document" category="graphics metapost" file="m-chart.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="shape" scope="flowchart" level="document" category="graphics metapost" file="m-chart.mkvi"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:resolve name="value-flowshape"/> + </cd:keywords> + </cd:arguments> + </cd:command> + + <cd:command name="destination" scope="flowchart" level="document" category="graphics metapost" file="m-chart.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="focus" scope="flowchart" level="document" category="graphics metapost" file="m-chart.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="overlay" scope="flowchart" level="document" category="graphics metapost" file="m-chart.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="location" scope="flowchart" level="document" category="graphics metapost" file="m-chart.mkvi"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="-"/> + <cd:constant type="+"/> + <cd:constant type="cd:number" prefix="cd:sign" method="none"/> + </cd:keywords> + </cd:arguments> + </cd:command> + + <cd:command name="figure" scope="flowchart" level="document" category="graphics metapost" file="m-chart.mkvi"> + <cd:arguments> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:file"/> + <cd:constant type="cd:name"/> + </cd:keywords> + </cd:arguments> + </cd:command> + + <cd:command name="text" scope="flowchart" level="document" category="graphics metapost" file="m-chart.mkvi"> + <cd:arguments> + <cd:keywords optional="yes"> + <cd:resolve name="value-chartlabel"/> + </cd:keywords> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="label" scope="flowchart" level="document" category="graphics metapost" file="m-chart.mkvi"> + <cd:arguments> + <cd:keywords optional="yes"> + <cd:resolve name="value-chartlabel"/> + </cd:keywords> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="comment" scope="flowchart" level="document" category="graphics metapost" file="m-chart.mkvi"> + <cd:arguments> + <cd:keywords optional="yes"> + <cd:resolve name="value-chartlabel"/> + </cd:keywords> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="exit" scope="flowchart" level="document" category="graphics metapost" file="m-chart.mkvi"> + <cd:arguments> + <cd:keywords optional="yes"> + <cd:resolve name="value-chartlabel"/> + </cd:keywords> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="connection" scope="flowchart" level="document" category="graphics metapost" file="m-chart.mkvi"> + <cd:arguments> + <cd:keywords> + <cd:constant type="+"/> + <cd:constant type="-"/> + <cd:constant type="p"/> + <cd:constant type="m"/> + <cd:constant type="l"/> + <cd:constant type="r"/> + <cd:constant type="t"/> + <cd:constant type="b"/> + <cd:constant type="left"/> + <cd:constant type="right"/> + <cd:constant type="top"/> + <cd:constant type="bottom"/> + <cd:constant type="␣"/> + </cd:keywords> + <cd:keywords list="yes" optional="yes"> + <cd:constant type="cd:number"/> + </cd:keywords> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="include" level="document" category="graphics metapost" file="m-chart.mkvi"> + <cd:arguments> + <cd:resolve name="keyword-name"/> + <cd:assignments list="yes" optional="yes"> + <cd:parameter name="x"> + <cd:constant type="cd:number"/> + </cd:parameter> + <cd:parameter name="y"> + <cd:constant type="cd:number"/> + </cd:parameter> + </cd:assignments> + </cd:arguments> + </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-charwidth.xml b/tex/context/interface/mkiv/i-charwidth.xml index 63240327a..dc19713f3 100644 --- a/tex/context/interface/mkiv/i-charwidth.xml +++ b/tex/context/interface/mkiv/i-charwidth.xml @@ -4,14 +4,14 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="charwidthlanguage" file="typo-lan.mkiv"/> + <cd:command name="charwidthlanguage" level="style" category="language" file="typo-lan.mkiv"/> - <cd:command name="averagecharwidth" file="typo-lan.mkiv"/> + <cd:command name="averagecharwidth" level="style" category="language" file="typo-lan.mkiv"/> - <cd:command name="languagecharwidth" file="typo-lan.mkiv"> + <cd:command name="languagecharwidth" level="style" category="language" file="typo-lan.mkiv"> <cd:arguments> <cd:resolve name="argument-language"/> </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-chemical.xml b/tex/context/interface/mkiv/i-chemical.xml index 1a81b82fc..a2df03ede 100644 --- a/tex/context/interface/mkiv/i-chemical.xml +++ b/tex/context/interface/mkiv/i-chemical.xml @@ -4,13 +4,13 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="molecule" file="chem-ini.mkiv"> + <cd:command name="molecule" level="document" file="chem-ini.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="chem" file="chem-ini.mkiv"> + <cd:command name="chem" level="document" file="chem-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-text"/> @@ -18,12 +18,12 @@ </cd:arguments> </cd:command> - <cd:command name="setupchemical" file="chem-str.mkiv"> + <cd:command name="setupchemical" level="style" category="graphics" file="chem-str.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> <cd:parameter name="strut"> - <cd:inherit name="value-strut"/> + <cd:resolve name="value-strut"/> </cd:parameter> <cd:parameter name="width"> <cd:constant type="fit" default="yes"/> @@ -114,7 +114,7 @@ <!-- - <cd:command name="setupchemicals" file="chem-str.mkiv"> + <cd:command name="setupchemicals" level="style" category="graphics" file="chem-str.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -125,7 +125,7 @@ --> - <cd:command name="setupchemicalframed" file="chem-str.mkiv"> + <cd:command name="setupchemicalframed" level="style" category="graphics" file="chem-str.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -134,33 +134,33 @@ </cd:arguments> </cd:command> - <cd:command name="definechemical" file="chem-str.mkiv"> + <cd:command name="definechemical" level="style" category="graphics" file="chem-str.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="definechemicalsymbol" file="chem-str.mkiv"> + <cd:command name="definechemicalsymbol" level="style" category="graphics" file="chem-str.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-text"/> </cd:arguments> </cd:command> - <cd:command name="chemicalsymbol" file="chem-str.mkiv"> + <cd:command name="chemicalsymbol" level="document" category="graphics" file="chem-str.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="chemicaltext" file="chem-str.mkiv"> + <cd:command name="chemicaltext" level="document" category="graphics" file="chem-str.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="chemical" type="environment" file="chem-str.mkiv"> + <cd:command name="chemical" type="environment" level="document" category="graphics" file="chem-str.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:assignments list="yes" optional="yes"> @@ -171,7 +171,7 @@ <!-- - <cd:command name="structurechemical" type="environment" file="chem-str.mkiv"> + <cd:command name="structurechemical" type="environment" level="document" category="graphics" file="chem-str.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:assignments list="yes" optional="yes"> @@ -182,7 +182,7 @@ --> - <cd:command name="chemical" file="chem-str.mkiv"> + <cd:command name="chemical" level="document" category="graphics" file="chem-str.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:resolve name="keyword-text-list"/> @@ -192,7 +192,7 @@ <!-- - <cd:command name="structurechemical" file="chem-str.mkiv"> + <cd:command name="structurechemical" level="document" category="graphics" file="chem-str.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:resolve name="keyword-text-list"/> @@ -202,19 +202,19 @@ --> - <cd:command name="chemicaltoptext" file="chem-str.mkiv"> + <cd:command name="chemicaltoptext" level="document" category="graphics" file="chem-str.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="chemicalbottext" file="chem-str.mkiv"> + <cd:command name="chemicalbottext" level="document" category="graphics" file="chem-str.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="chemicalmidtext" file="chem-str.mkiv"> + <cd:command name="chemicalmidtext" level="document" category="graphics" file="chem-str.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> @@ -222,19 +222,19 @@ <!-- - <cd:command name="toptext" file="chem-str.mkiv"> + <cd:command name="toptext" level="document" category="graphics" file="chem-str.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="bottext" file="chem-str.mkiv"> + <cd:command name="bottext" level="document" category="graphics" file="chem-str.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="midtext" file="chem-str.mkiv"> + <cd:command name="midtext" level="document" category="graphics" file="chem-str.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> @@ -242,7 +242,7 @@ --> - <cd:command name="definechemicals" file="chem-str.mkiv"> + <cd:command name="definechemicals" level="style" category="graphics" file="chem-str.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -252,4 +252,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-cleaning.xml b/tex/context/interface/mkiv/i-cleaning.xml index e37eb7999..dd54fdacc 100644 --- a/tex/context/interface/mkiv/i-cleaning.xml +++ b/tex/context/interface/mkiv/i-cleaning.xml @@ -4,11 +4,11 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="punctuation" type="environment" begin="push" end="pop" file="typo-chr.mkiv"/> + <cd:command name="punctuation" type="environment" begin="push" end="pop" level="system" file="typo-chr.mkiv"/> - <cd:command name="removepunctuation" file="typo-chr.mkiv"/> + <cd:command name="removepunctuation" level="system" file="typo-chr.mkiv"/> - <cd:command name="markcontent" file="typo-chr.mkiv"> + <cd:command name="markcontent" level="system" file="typo-chr.mkiv"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="reset"/> @@ -19,7 +19,7 @@ </cd:arguments> </cd:command> - <cd:command name="markedcontent" type="environment" file="typo-chr.mkiv"> + <cd:command name="markedcontent" type="environment" level="system" file="typo-chr.mkiv"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="reset"/> @@ -29,13 +29,13 @@ </cd:arguments> </cd:command> - <cd:command name="removemarkedcontent" file="typo-chr.mkiv"> + <cd:command name="removemarkedcontent" level="system" file="typo-chr.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="setcharactercleaning" file="typo-cln.mkiv"> + <cd:command name="setcharactercleaning" level="system" file="typo-cln.mkiv"> <cd:arguments> <cd:keywords> <cd:constant type="reset"/> diff --git a/tex/context/interface/mkiv/i-clipping.xml b/tex/context/interface/mkiv/i-clipping.xml index aa152a85b..c823b102d 100644 --- a/tex/context/interface/mkiv/i-clipping.xml +++ b/tex/context/interface/mkiv/i-clipping.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="setupclipping" file="grph-trf.mkiv"> + <cd:command name="setupclipping" level="style" category="graphics" file="grph-trf.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="state"> @@ -66,7 +66,7 @@ </cd:arguments> </cd:command> - <cd:command name="clip" file="grph-trf.mkiv"> + <cd:command name="clip" level="document" category="graphics" file="grph-trf.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupclipping"/> @@ -75,4 +75,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-collector.xml b/tex/context/interface/mkiv/i-collector.xml index a75f3534e..6642e6980 100644 --- a/tex/context/interface/mkiv/i-collector.xml +++ b/tex/context/interface/mkiv/i-collector.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definecollector" file="pack-box.mkiv"> + <cd:command name="definecollector" level="style" category="graphics" file="pack-box.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupcollector" file="pack-box.mkiv"> + <cd:command name="setupcollector" level="style" category="graphics" file="pack-box.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -55,7 +55,7 @@ </cd:arguments> </cd:command> - <cd:command name="setcollector" file="pack-box.mkiv"> + <cd:command name="setcollector" level="document" category="graphics" file="pack-box.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes" optional="yes"> @@ -65,25 +65,25 @@ </cd:arguments> </cd:command> - <cd:command name="resetcollector" file="pack-box.mkiv"> + <cd:command name="resetcollector" level="style" category="graphics" file="pack-box.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="flushcollector" file="pack-box.mkiv"> + <cd:command name="flushcollector" level="document" category="graphics" file="pack-box.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="composedcollector" file="pack-box.mkiv"> + <cd:command name="composedcollector" level="document" category="graphics" file="pack-box.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="adaptcollector" file="pack-box.mkiv"> + <cd:command name="adaptcollector" level="style" category="graphics" file="pack-box.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes" optional="yes"> @@ -92,7 +92,7 @@ </cd:arguments> </cd:command> - <cd:command name="collectedtext" file="pack-box.mkiv"> + <cd:command name="collectedtext" level="document" category="graphics" file="pack-box.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupcollector"/> @@ -111,4 +111,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-color.xml b/tex/context/interface/mkiv/i-color.xml index 4168216a9..80da11f3b 100644 --- a/tex/context/interface/mkiv/i-color.xml +++ b/tex/context/interface/mkiv/i-color.xml @@ -4,13 +4,13 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="negatecolorbox" file="colo-ext.mkiv"> + <cd:command name="negatecolorbox" level="system" category="colors" file="colo-ext.mkiv"> <cd:arguments> <cd:resolve name="string-box"/> </cd:arguments> </cd:command> - <cd:command name="colorintent" type="environment" file="colo-ext.mkiv"> + <cd:command name="colorintent" type="environment" level="document" category="colors" file="colo-ext.mkiv"> <cd:arguments> <cd:keywords> <cd:constant type="knockout"/> @@ -20,13 +20,13 @@ </cd:arguments> </cd:command> - <cd:command name="overprint" type="environment" file="colo-ext.mkiv"/> + <cd:command name="overprint" type="environment" level="document" category="colors" file="colo-ext.mkiv"/> - <cd:command name="knockout" type="environment" file="colo-ext.mkiv"/> + <cd:command name="knockout" type="environment" level="document" category="colors" file="colo-ext.mkiv"/> - <cd:command name="textcolorintent" type="environment" file="colo-ext.mkiv"/> + <cd:command name="textcolorintent" type="environment" level="document" category="colors" file="colo-ext.mkiv"/> - <cd:command name="definecolorgroup" file="colo-grp.mkiv"> + <cd:command name="definecolorgroup" level="style" category="colors" file="colo-grp.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:keywords optional="yes"> @@ -39,7 +39,7 @@ </cd:arguments> </cd:command> - <cd:command name="definecolor" file="colo-ini.mkiv"> + <cd:command name="definecolor" level="style" category="colors" file="colo-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes"> @@ -86,14 +86,14 @@ </cd:arguments> </cd:command> - <cd:command name="definecolor" variant="name" file="colo-ini.mkiv"> + <cd:command name="definecolor" variant="name" level="style" category="colors" file="colo-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-color"/> </cd:arguments> </cd:command> - <cd:command name="defineglobalcolor" file="colo-ini.mkiv"> + <cd:command name="defineglobalcolor" level="style" category="colors" file="colo-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes"> @@ -102,14 +102,14 @@ </cd:arguments> </cd:command> - <cd:command name="defineglobalcolor" variant="name" file="colo-ini.mkiv"> + <cd:command name="defineglobalcolor" variant="name" level="style" category="colors" file="colo-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-color"/> </cd:arguments> </cd:command> - <cd:command name="definenamedcolor" file="colo-ini.mkiv"> + <cd:command name="definenamedcolor" level="style" category="colors" file="colo-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes"> @@ -118,14 +118,14 @@ </cd:arguments> </cd:command> - <cd:command name="definenamedcolor" variant="name" file="colo-ini.mkiv"> + <cd:command name="definenamedcolor" variant="name" level="style" category="colors" file="colo-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-color"/> </cd:arguments> </cd:command> - <cd:command name="defineprocesscolor" file="colo-ini.mkiv"> + <cd:command name="defineprocesscolor" level="style" category="colors" file="colo-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-color-optional"/> @@ -135,7 +135,7 @@ </cd:arguments> </cd:command> - <cd:command name="definespotcolor" file="colo-ini.mkiv"> + <cd:command name="definespotcolor" level="style" category="colors" file="colo-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-color"/> @@ -156,7 +156,7 @@ </cd:arguments> </cd:command> - <cd:command name="definemultitonecolor" file="colo-ini.mkiv"> + <cd:command name="definemultitonecolor" level="style" category="colors" file="colo-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes"> @@ -173,14 +173,14 @@ </cd:arguments> </cd:command> - <cd:command name="definetransparency" variant="1" file="colo-ini.mkiv"> + <cd:command name="definetransparency" variant="1" level="style" category="colors" file="colo-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-number"/> </cd:arguments> </cd:command> - <cd:command name="definetransparency" variant="2" file="colo-ini.mkiv"> + <cd:command name="definetransparency" variant="2" level="style" category="colors" file="colo-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes"> @@ -194,55 +194,55 @@ </cd:arguments> </cd:command> - <cd:command name="definetransparency" variant="3" file="colo-ini.mkiv"> + <cd:command name="definetransparency" variant="3" level="style" category="colors" file="colo-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="switchtocolor" file="colo-ini.mkiv"> + <cd:command name="switchtocolor" level="style" category="colors" file="colo-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-color"/> </cd:arguments> </cd:command> - <cd:command name="color" file="colo-ini.mkiv"> + <cd:command name="color" level="document" category="colors" file="colo-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-color"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="coloronly" file="colo-ini.mkiv"> + <cd:command name="coloronly" level="style" category="colors" file="colo-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-color"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="transparent" file="colo-ini.mkiv"> + <cd:command name="transparent" level="style" category="colors" file="colo-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-color"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="graycolor" file="colo-ini.mkiv"> + <cd:command name="graycolor" level="style" category="colors" file="colo-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-color"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="colored" variant="name" file="colo-ini.mkiv"> + <cd:command name="colored" variant="name" level="document" category="colors" file="colo-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-color"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="colored" file="colo-ini.mkiv"> + <cd:command name="colored" level="document" category="colors" file="colo-ini.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:inherit name="definecolor"/> @@ -251,37 +251,37 @@ </cd:arguments> </cd:command> - <cd:command name="color" type="environment" file="colo-ini.mkiv"> + <cd:command name="color" type="environment" level="document" category="colors" file="colo-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-color"/> </cd:arguments> </cd:command> - <cd:command name="coloronly" type="environment" file="colo-ini.mkiv"> + <cd:command name="coloronly" type="environment" level="style" category="colors" file="colo-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-color"/> </cd:arguments> </cd:command> - <cd:command name="transparent" type="environment" file="colo-ini.mkiv"> + <cd:command name="transparent" type="environment" category="colors" file="colo-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-color"/> </cd:arguments> </cd:command> - <cd:command name="directcolor" file="colo-ini.mkiv"> + <cd:command name="directcolor" level="document" category="colors" file="colo-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-color"/> </cd:arguments> </cd:command> - <cd:command name="directcolored" variant="name" file="colo-ini.mkiv"> + <cd:command name="directcolored" variant="name" level="document" category="colors" file="colo-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-color"/> </cd:arguments> </cd:command> - <cd:command name="directcolored" file="colo-ini.mkiv"> + <cd:command name="directcolored" level="document" category="colors" file="colo-ini.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:inherit name="definecolor"/> @@ -289,27 +289,27 @@ </cd:arguments> </cd:command> - <cd:command name="currentcolor" type="environment" file="colo-ini.mkiv"/> + <cd:command name="currentcolor" type="environment" level="system" category="colors" file="colo-ini.mkiv"/> - <cd:command name="colorset" type="environment" file="colo-ini.mkiv"> + <cd:command name="colorset" type="environment" level="system" category="colors" file="colo-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="usecolors" file="colo-ini.mkiv"> + <cd:command name="usecolors" level="system" category="colors" file="colo-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-file"/> </cd:arguments> </cd:command> - <cd:command name="setupcolor" file="colo-ini.mkiv"> + <cd:command name="setupcolor" level="style" category="colors" file="colo-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-file"/> </cd:arguments> </cd:command> - <cd:command name="setupcolors" file="colo-ini.mkiv"> + <cd:command name="setupcolors" level="style" category="colors" file="colo-ini.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="state"> @@ -358,15 +358,15 @@ </cd:arguments> </cd:command> - <cd:command name="color" type="environment" begin="push" end="pop" file="colo-ini.mkiv"> + <cd:command name="color" type="environment" begin="push" end="pop" level="system" category="colors" file="colo-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-color"/> </cd:arguments> </cd:command> - <cd:command name="color" type="environment" begin="save" end="restore" file="colo-ini.mkiv"/> + <cd:command name="color" type="environment" begin="save" end="restore" level="system" category="colors" file="colo-ini.mkiv"/> - <cd:command name="definepalet" file="colo-ini.mkiv"> + <cd:command name="definepalet" category="colors" file="colo-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes"> @@ -377,28 +377,28 @@ </cd:arguments> </cd:command> - <cd:command name="definepalet" variant="name" file="colo-ini.mkiv"> + <cd:command name="definepalet" variant="name" level="style" category="colors" file="colo-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="getpaletsize" file="colo-ini.mkiv"> + <cd:command name="getpaletsize" level="system" category="colors" file="colo-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="paletsize" file="colo-ini.mkiv"/> + <cd:command name="paletsize" level="system" category="colors" file="colo-ini.mkiv"/> - <cd:command name="setuppalet" file="colo-ini.mkiv"> + <cd:command name="setuppalet" level="style" category="colors" file="colo-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="setcolormodell" file="colo-ini.mkiv"> + <cd:command name="setcolormodell" level="system" category="colors" file="colo-ini.mkiv"> <cd:arguments> <cd:keywords> <cd:constant type="black"/> @@ -412,9 +412,9 @@ </cd:arguments> </cd:command> - <cd:command name="protectedcolors" type="environment" file="colo-ini.mkiv"/> + <cd:command name="protectedcolors" type="environment" level="system" category="colors" file="colo-ini.mkiv"/> - <cd:command name="defineintermediatecolor" file="colo-ini.mkiv"> + <cd:command name="defineintermediatecolor" level="style" category="colors" file="colo-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:keywords list="yes"> @@ -432,7 +432,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifelsecolor" file="color-ini.mkiv"> + <cd:command name="doifelsecolor" level="system" category="colors conditional" file="color-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-color"/> <cd:resolve name="argument-true"/> @@ -440,7 +440,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifcolorelse" file="color-ini.mkiv"> + <cd:command name="doifcolorelse" level="system" category="colors conditional" file="color-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-color"/> <cd:resolve name="argument-true"/> @@ -448,74 +448,74 @@ </cd:arguments> </cd:command> - <cd:command name="doifcolor" file="color-ini.mkiv"> + <cd:command name="doifcolor" level="system" category="colors conditional" file="color-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-color"/> <cd:resolve name="argument-true"/> </cd:arguments> </cd:command> - <cd:command name="textcolor" type="environment" file="colo-ini.mkiv"> + <cd:command name="textcolor" type="environment" level="document" category="colors" file="colo-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-color"/> </cd:arguments> </cd:command> - <cd:command name="MPcolor" file="colo-ini.mkiv"> + <cd:command name="MPcolor" level="style" category="colors" file="colo-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-color"/> </cd:arguments> </cd:command> - <cd:command name="MPcoloronly" file="colo-ini.mkiv"> + <cd:command name="MPcoloronly" level="style" category="colors" file="colo-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-color"/> </cd:arguments> </cd:command> - <cd:command name="MPtransparency" file="colo-ini.mkiv"> + <cd:command name="MPtransparency" level="style" category="colors" file="colo-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-color"/> </cd:arguments> </cd:command> - <cd:command name="MPoptions" file="colo-ini.mkiv"> + <cd:command name="MPoptions" level="style" category="colors" file="colo-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-color"/> </cd:arguments> </cd:command> - <cd:command name="colorvalue" file="colo-ini.mkiv"> + <cd:command name="colorvalue" level="system" category="colors" file="colo-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-color"/> </cd:arguments> </cd:command> - <cd:command name="grayvalue" file="colo-ini.mkiv"> + <cd:command name="grayvalue" level="system" category="colors" file="colo-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-color"/> </cd:arguments> </cd:command> - <cd:command name="colorcomponents" file="colo-ini.mkiv"> + <cd:command name="colorcomponents" level="system" category="colors" file="colo-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-color"/> </cd:arguments> </cd:command> - <cd:command name="transparencycomponents" file="colo-ini.mkiv"> + <cd:command name="transparencycomponents" level="system" category="colors" file="colo-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-color"/> </cd:arguments> </cd:command> - <cd:command name="processcolorcomponents" file="colo-ini.mkiv"> + <cd:command name="processcolorcomponents" level="system" category="colors" file="colo-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-color"/> </cd:arguments> </cd:command> - <cd:command name="doifelseblack" file="colo-ini.mkiv"> + <cd:command name="doifelseblack" level="system" category="colors conditional" file="colo-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-color"/> <cd:resolve name="argument-true"/> @@ -523,7 +523,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifblackelse" file="colo-ini.mkiv"> + <cd:command name="doifblackelse" level="system" category="colors conditional" file="colo-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-color"/> <cd:resolve name="argument-true"/> @@ -531,45 +531,45 @@ </cd:arguments> </cd:command> - <cd:command name="doifelsedrawingblack" file="colo-ini.mkiv"> + <cd:command name="doifelsedrawingblack" level="system" category="colors conditional" file="colo-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-true"/> <cd:resolve name="argument-false"/> </cd:arguments> </cd:command> - <cd:command name="doifdrawingblackelse" file="colo-ini.mkiv"> + <cd:command name="doifdrawingblackelse" level="system" category="colors conditional" file="colo-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-true"/> <cd:resolve name="argument-false"/> </cd:arguments> </cd:command> - <cd:command name="showcolorbar" file="colo-run.mkiv"> + <cd:command name="showcolorbar" level="document" category="colors" file="colo-run.mkiv"> <cd:arguments> <cd:resolve name="keyword-color"/> </cd:arguments> </cd:command> - <cd:command name="showcolor" file="colo-run.mkiv"> + <cd:command name="showcolor" level="document" category="colors" file="colo-run.mkiv"> <cd:arguments> <cd:resolve name="keyword-color"/> </cd:arguments> </cd:command> - <cd:command name="showcolorset" file="colo-run.mkiv"> + <cd:command name="showcolorset" level="document" category="colors" file="colo-run.mkiv"> <cd:arguments> <cd:resolve name="keyword-color"/> </cd:arguments> </cd:command> - <cd:command name="showcolorcomponents" file="colo-run.mkiv"> + <cd:command name="showcolorcomponents" level="document" category="colors" file="colo-run.mkiv"> <cd:arguments> <cd:resolve name="keyword-color"/> </cd:arguments> </cd:command> - <cd:command name="showpalet" file="colo-run.mkiv"> + <cd:command name="showpalet" level="document" category="colors" file="colo-run.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:keywords list="yes" optional="yes"> @@ -582,13 +582,13 @@ </cd:arguments> </cd:command> - <cd:command name="comparepalet" file="colo-run.mkiv"> + <cd:command name="comparepalet" level="document" category="colors" file="colo-run.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="showcolorgroup" file="colo-run.mkiv"> + <cd:command name="showcolorgroup" level="document" category="colors" file="colo-run.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:keywords list="yes" optional="yes"> @@ -601,10 +601,10 @@ </cd:arguments> </cd:command> - <cd:command name="comparecolorgroup" file="colo-run.mkiv"> + <cd:command name="comparecolorgroup" level="document" category="colors" file="colo-run.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-columns.xml b/tex/context/interface/mkiv/i-columns.xml index 154d38072..9fdd209c0 100644 --- a/tex/context/interface/mkiv/i-columns.xml +++ b/tex/context/interface/mkiv/i-columns.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="setupcolumns" file="page-mul.mkiv"> + <cd:command name="setupcolumns" level="style" category="columns" file="page-mul.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="n"> @@ -54,7 +54,7 @@ </cd:arguments> </cd:command> - <cd:command name="columns" type="environment" file="page-mul.mkiv"> + <cd:command name="columns" type="environment" level="document" category="columns" file="page-mul.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupcolumns"/> @@ -62,7 +62,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupcolumnspan" file="page-mul.mkiv"> + <cd:command name="setupcolumnspan" level="style" category="columns" file="page-mul.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="n"> @@ -73,7 +73,7 @@ </cd:arguments> </cd:command> - <cd:command name="columnspan" type="environment" file="page-mul.mkiv"> + <cd:command name="columnspan" type="environment" category="columns" file="page-mul.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupcolumnspan"/> @@ -81,7 +81,7 @@ </cd:arguments> </cd:command> - <cd:command name="setsimplecolumnhsize" file="page-mul.mkiv"> + <cd:command name="setsimplecolumnhsize" level="system" category="columns" file="page-mul.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="n"> @@ -100,7 +100,7 @@ </cd:arguments> </cd:command> - <cd:command name="simplecolumns" type="environment" file="page-mul.mkiv"> + <cd:command name="simplecolumns" type="environment" level="system" category="columns" file="page-mul.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setsimplecolumnhsize"/> @@ -108,4 +108,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-combination.xml b/tex/context/interface/mkiv/i-combination.xml index 492edadd0..bd732c264 100644 --- a/tex/context/interface/mkiv/i-combination.xml +++ b/tex/context/interface/mkiv/i-combination.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definecombination" file="pack-com.mkiv"> + <cd:command name="definecombination" level="style" category="tables" file="pack-com.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupcombination" file="pack-com.mkiv"> + <cd:command name="setupcombination" level="style" category="tables" file="pack-com.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -74,7 +74,7 @@ <!-- - <cd:command name="setupcombinations" file="pack-com.mkiv"> + <cd:command name="setupcombinations" level="style" category="tables" file="pack-com.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -85,7 +85,7 @@ --> - <cd:command name="combination" type="environment" variant="matrix" file="pack-com.mkiv"> + <cd:command name="combination" type="environment" variant="matrix" level="document" category="tables" file="pack-com.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:keywords optional="yes"> @@ -94,7 +94,7 @@ </cd:arguments> </cd:command> - <cd:command name="combination" type="environment" file="pack-com.mkiv"> + <cd:command name="combination" type="environment" level="document" category="tables" file="pack-com.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:assignments list="yes" optional="yes"> @@ -105,13 +105,13 @@ <!-- - <cd:command name="content" type="environment" scope="combination" file="pack-com.mkiv"/> + <cd:command name="content" type="environment" scope="combination" level="document" category="tables" file="pack-com.mkiv"/> - <cd:command name="caption" type="environment" scope="combination" file="pack-com.mkiv"/> + <cd:command name="caption" type="environment" scope="combination" level="document" category="tables" file="pack-com.mkiv"/> --> - <cd:command name="floatcombination" type="environment" variant="matrix" file="pack-com.mkiv"> + <cd:command name="floatcombination" type="environment" variant="matrix" level="document" category="float tables" file="pack-com.mkiv"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:matrix"/> @@ -120,7 +120,7 @@ </cd:arguments> </cd:command> - <cd:command name="floatcombination" type="environment" file="pack-com.mkiv"> + <cd:command name="floatcombination" type="environment" level="document" category="float tables" file="pack-com.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupcombination"/> @@ -128,4 +128,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-commandhandler.xml b/tex/context/interface/mkiv/i-commandhandler.xml index 6550898b6..40da525f3 100644 --- a/tex/context/interface/mkiv/i-commandhandler.xml +++ b/tex/context/interface/mkiv/i-commandhandler.xml @@ -4,42 +4,42 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="installparameterhandler" file="mult-aux.mkiv"> + <cd:command name="installparameterhandler" level="system" file="mult-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="installrootparameterhandler" file="mult-aux.mkiv"> + <cd:command name="installrootparameterhandler" level="system" file="mult-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="installparameterhashhandler" file="mult-aux.mkiv"> + <cd:command name="installparameterhashhandler" level="system" file="mult-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="installparametersethandler" file="mult-aux.mkiv"> + <cd:command name="installparametersethandler" level="system" file="mult-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="installstyleandcolorhandler" file="mult-aux.mkiv"> + <cd:command name="installstyleandcolorhandler" level="system" file="mult-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="installdefinehandler" file="mult-aux.mkiv"> + <cd:command name="installdefinehandler" level="system" file="mult-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-name"/> @@ -47,35 +47,35 @@ </cd:arguments> </cd:command> - <cd:command name="installsetuphandler" file="mult-aux.mkiv"> + <cd:command name="installsetuphandler" level="system" file="mult-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="installswitchsetuphandler" file="mult-aux.mkiv"> + <cd:command name="installswitchsetuphandler" level="system" file="mult-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="installautosetuphandler" file="mult-aux.mkiv"> + <cd:command name="installautosetuphandler" level="system" file="mult-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="installbasicparameterhandler" file="mult-aux.mkiv"> + <cd:command name="installbasicparameterhandler" level="system" file="mult-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="installbasicautosetuphandler" file="mult-aux.mkiv"> + <cd:command name="installbasicautosetuphandler" level="system" file="mult-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-name"/> @@ -83,7 +83,7 @@ </cd:arguments> </cd:command> - <cd:command name="installcommandhandler" file="mult-aux.mkiv"> + <cd:command name="installcommandhandler" level="system" file="mult-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-name"/> @@ -91,7 +91,7 @@ </cd:arguments> </cd:command> - <cd:command name="installswitchcommandhandler" file="mult-aux.mkiv"> + <cd:command name="installswitchcommandhandler" level="system" file="mult-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-name"/> @@ -99,7 +99,7 @@ </cd:arguments> </cd:command> - <cd:command name="installautocommandhandler" file="mult-aux.mkiv"> + <cd:command name="installautocommandhandler" level="system" file="mult-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-name"/> @@ -107,7 +107,7 @@ </cd:arguments> </cd:command> - <cd:command name="installsimplecommandhandler" file="mult-aux.mkiv"> + <cd:command name="installsimplecommandhandler" level="system" file="mult-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-name"/> @@ -115,49 +115,49 @@ </cd:arguments> </cd:command> - <cd:command name="installdirectparameterhandler" file="mult-aux.mkiv"> + <cd:command name="installdirectparameterhandler" level="system" file="mult-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="installdirectsetuphandler" file="mult-aux.mkiv"> + <cd:command name="installdirectsetuphandler" level="system" file="mult-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="installdirectparametersethandler" file="mult-aux.mkiv"> + <cd:command name="installdirectparametersethandler" level="system" file="mult-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="installdirectstyleandcolorhandler" file="mult-aux.mkiv"> + <cd:command name="installdirectstyleandcolorhandler" level="system" file="mult-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="installdirectcommandhandler" file="mult-aux.mkiv"> + <cd:command name="installdirectcommandhandler" level="system" file="mult-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="installsetuponlycommandhandler" file="mult-aux.mkiv"> + <cd:command name="installsetuponlycommandhandler" level="system" file="mult-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="relateparameterhandlers" file="mult-aux.mkiv"> + <cd:command name="relateparameterhandlers" level="system" file="mult-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-name"/> @@ -166,25 +166,25 @@ </cd:arguments> </cd:command> - <cd:command name="installactionhandler" file="mult-aux.mkiv"> + <cd:command name="installactionhandler" level="system" file="mult-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="installnamespace" file="mult-aux.mkiv"> + <cd:command name="installnamespace" level="system" file="mult-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="installcorenamespace" file="mult-aux.mkiv"> + <cd:command name="installcorenamespace" level="system" file="mult-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="definenamespace" file="mult-aux.mkiv"> + <cd:command name="definenamespace" level="system" file="mult-aux.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes"> @@ -221,16 +221,16 @@ </cd:arguments> </cd:command> - <cd:command name="listnamespaces" file="mult-aux.mkiv"/> + <cd:command name="listnamespaces" level="system" file="mult-aux.mkiv"/> - <cd:command name="showparentchain" file="mult-aux.mkiv"> + <cd:command name="showparentchain" level="system" file="mult-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="doifelsecommandhandler" file="mult-aux.mkiv"> + <cd:command name="doifelsecommandhandler" level="system" file="mult-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-name"/> @@ -239,7 +239,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifcommandhandlerelse" file="mult-aux.mkiv"> + <cd:command name="doifcommandhandlerelse" level="system" file="mult-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-name"/> @@ -248,7 +248,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifcommandhandler" file="mult-aux.mkiv"> + <cd:command name="doifcommandhandler" level="system" file="mult-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-name"/> @@ -256,7 +256,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifnotcommandhandler" file="mult-aux.mkiv"> + <cd:command name="doifnotcommandhandler" level="system" file="mult-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-name"/> @@ -264,14 +264,14 @@ </cd:arguments> </cd:command> - <cd:command name="installdefinitionset" file="mult-aux.mkiv"> + <cd:command name="installdefinitionset" level="system" file="mult-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="installdefinitionsetmember" file="mult-aux.mkiv"> + <cd:command name="installdefinitionsetmember" level="system" file="mult-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-name"/> @@ -280,14 +280,14 @@ </cd:arguments> </cd:command> - <cd:command name="installparentinjector" file="mult-aux.mkiv"> + <cd:command name="installparentinjector" level="system" file="mult-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="installframedcommandhandler" file="pack-rul.mkiv"> + <cd:command name="installframedcommandhandler" level="system" file="pack-rul.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-name"/> @@ -295,7 +295,7 @@ </cd:arguments> </cd:command> - <cd:command name="installframedautocommandhandler" file="pack-rul.mkiv"> + <cd:command name="installframedautocommandhandler" level="system" file="pack-rul.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-name"/> @@ -303,7 +303,7 @@ </cd:arguments> </cd:command> - <cd:command name="installsimpleframedcommandhandler" file="pack-rul.mkiv"> + <cd:command name="installsimpleframedcommandhandler" level="system" file="pack-rul.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-name"/> diff --git a/tex/context/interface/mkiv/i-comment.xml b/tex/context/interface/mkiv/i-comment.xml index e7f18fb0e..a1eb14d23 100644 --- a/tex/context/interface/mkiv/i-comment.xml +++ b/tex/context/interface/mkiv/i-comment.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definecomment" file="scrn-wid.mkvi"> + <cd:command name="definecomment" level="style" category="pdf" file="scrn-wid.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupcomment" file="scrn-wid.mkvi"> + <cd:command name="setupcomment" level="style" category="pdf" file="scrn-wid.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -87,13 +87,19 @@ <cd:parameter name="distance"> <cd:constant type="cd:dimension"/> </cd:parameter> + <cd:parameter name="space"> + <cd:constant type="yes"/> + </cd:parameter> + <cd:parameter name="buffer"> + <cd:constant type="cd:buffer"/> + </cd:parameter> </cd:assignments> </cd:arguments> </cd:command> - <cd:command name="comment" generated="yes" variant="example" file="scrn-wid.mkvi"> + <cd:command name="comment" generated="yes" variant="instance" level="document" category="pdf" file="scrn-wid.mkvi"> <cd:sequence> - <cd:variable value="comment"/> + <cd:instance value="comment"/> </cd:sequence> <cd:arguments> <cd:resolve name="keyword-text-optional"/> @@ -103,13 +109,13 @@ <cd:resolve name="argument-text"/> </cd:arguments> <cd:instances> - <cd:constant value="comment"/> + <cd:resolve name="instance-comment"/> </cd:instances> </cd:command> - <cd:command name="comment" type="environment" generated="yes" variant="example" file="scrn-wid.mkvi"> + <cd:command name="comment" type="environment" generated="yes" variant="instance" level="document" category="pdf" file="scrn-wid.mkvi"> <cd:sequence> - <cd:variable value="comment"/> + <cd:instance value="comment"/> </cd:sequence> <cd:arguments> <cd:resolve name="keyword-text-optional"/> @@ -118,29 +124,33 @@ </cd:assignments> </cd:arguments> <cd:instances> - <cd:constant value="comment"/> + <cd:resolve name="instance-comment"/> </cd:instances> </cd:command> - <cd:command name="placecomments" file="scrn-wid.mkvi"/> + <cd:command name="placecomments" level="document" category="pdf" file="scrn-wid.mkvi"/> - <cd:command name="comment" file="scrn-wid.mkvi"> - <cd:arguments> - <cd:resolve name="keyword-text-optional"/> - <cd:assignments list="yes" optional="yes"> - <cd:inherit name="setupcomment"/> - </cd:assignments> - <cd:resolve name="argument-text"/> - </cd:arguments> - </cd:command> + <!-- - <cd:command name="comment" type="environment" file="scrn-wid.mkvi"> - <cd:arguments> - <cd:resolve name="keyword-text-optional"/> - <cd:assignments list="yes" optional="yes"> - <cd:inherit name="setupcomment"/> - </cd:assignments> - </cd:arguments> - </cd:command> + <cd:command name="comment" level="document" category="pdf" file="scrn-wid.mkvi"> + <cd:arguments> + <cd:resolve name="keyword-text-optional"/> + <cd:assignments list="yes" optional="yes"> + <cd:inherit name="setupcomment"/> + </cd:assignments> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="comment" type="environment" level="document" category="pdf" file="scrn-wid.mkvi"> + <cd:arguments> + <cd:resolve name="keyword-text-optional"/> + <cd:assignments list="yes" optional="yes"> + <cd:inherit name="setupcomment"/> + </cd:assignments> + </cd:arguments> + </cd:command> + + --> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-common-argument.xml b/tex/context/interface/mkiv/i-common-argument.xml index b3b2cd5bc..de000148b 100644 --- a/tex/context/interface/mkiv/i-common-argument.xml +++ b/tex/context/interface/mkiv/i-common-argument.xml @@ -89,32 +89,6 @@ </cd:keywords> </cd:define> - <!-- @WS: These were unresolved. Shouldn't they become text? --> - - <cd:define name="argument-content"> - <cd:keywords delimiters="braces" list="yes"> - <cd:content/> - </cd:keywords> - </cd:define> - - <cd:define name="argument-content-optional"> - <cd:keywords delimiters="braces" optional="yes"> - <cd:content/> - </cd:keywords> - </cd:define> - - <cd:define name="argument-content-list"> - <cd:keywords delimiters="braces" list="yes"> - <cd:content/> - </cd:keywords> - </cd:define> - - <cd:define name="argument-content-list-optional"> - <cd:keywords delimiters="braces" list="yes" optional="yes"> - <cd:content/> - </cd:keywords> - </cd:define> - <!-- * --> <!-- \... {...} --> <!-- --> @@ -547,4 +521,15 @@ </cd:keywords> </cd:define> -</cd:interface> + <!-- * --> + <!-- \... {...} --> + <!-- --> + <!-- * TOCHAR --> + + <cd:define name="argument-tochar"> + <cd:keywords delimiters="braces"> + <cd:resolve name="value-tochar"/> + </cd:keywords> + </cd:define> + +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-common-definitions.xml b/tex/context/interface/mkiv/i-common-definitions.xml index 9f6d461f9..54e729aa4 100644 --- a/tex/context/interface/mkiv/i-common-definitions.xml +++ b/tex/context/interface/mkiv/i-common-definitions.xml @@ -9,4 +9,4 @@ <cd:interfacefile filename="i-common-value.xml"/> <cd:interfacefile filename="i-common-instance.xml"/> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-common-instance.xml b/tex/context/interface/mkiv/i-common-instance.xml index 8cde55b2e..dc8cead79 100644 --- a/tex/context/interface/mkiv/i-common-instance.xml +++ b/tex/context/interface/mkiv/i-common-instance.xml @@ -2,6 +2,50 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> + <cd:define name="instance-attachment"> + <cd:constant value="attachment"/> + </cd:define> + + <cd:define name="instance-bar"> + <cd:constant value="overbar"/> + <cd:constant value="underbar"/> + <cd:constant value="overstrike"/> + <cd:constant value="understrike"/> + <cd:constant value="overbars"/> + <cd:constant value="underbars"/> + <cd:constant value="overstrikes"/> + <cd:constant value="understrikes"/> + <cd:constant value="underrandom"/> + <cd:constant value="underrandoms"/> + <cd:constant value="underdash"/> + <cd:constant value="underdashes"/> + <cd:constant value="underdot"/> + <cd:constant value="underdots"/> + <cd:constant value="nobar"/> + <cd:constant value="hiddenbar"/> + </cd:define> + + <cd:define name="instance-buffer"> + <cd:constant value="hiding"/> + </cd:define> + + <cd:define name="instance-comment"> + <cd:constant value="comment"/> + </cd:define> + + <cd:define name="instance-delimitedtext"> + <cd:constant value="quotation"/> + <cd:constant value="quote"/> + <cd:constant value="blockquote"/> + <cd:constant value="speech"/> + <cd:constant value="aside"/> + </cd:define> + + <cd:define name="instance-fittingpage"> + <cd:constant value="TEXpage"/> + <cd:constant value="MPpage"/> + </cd:define> + <cd:define name="instance-float"> <cd:constant value="chemical"/> <cd:constant value="figure"/> @@ -10,79 +54,170 @@ <cd:constant value="graphic"/> </cd:define> + <cd:define name="instance-floatlist"> + <cd:constant value="chemicals"/> + <cd:constant value="figures"/> + <cd:constant value="tables"/> + <cd:constant value="intermezzi"/> + <cd:constant value="graphics"/> + </cd:define> + + <cd:define name="instance-formula"> + <cd:constant value="sp"/> + <cd:constant value="sd"/> + <cd:constant value="mp"/> + <cd:constant value="md"/> + </cd:define> + + <cd:define name="instance-fraction"> + <cd:constant value="xfrac"/> + <cd:constant value="xxfrac"/> + <cd:constant value="frac"/> + <cd:constant value="sfrac"/> + <cd:constant value="dfrac"/> + <cd:constant value="binom"/> + <cd:constant value="dbinom"/> + <cd:constant value="tbinom"/> + </cd:define> + + <cd:define name="instance-mathframed"> + <cd:constant value="mframed"/> + <cd:constant value="inmframed"/> + <cd:constant value="mcframed"/> + </cd:define> + + <cd:define name="instance-framedtext"> + <cd:constant value="framedtext"/> + </cd:define> + + <cd:define name="instance-framed"> + <cd:constant value="unframed"/> + <cd:constant value="fitfieldframed"/> + </cd:define> + + <cd:define name="instance-help"> + <cd:constant value="helptext"/> + </cd:define> + <cd:define name="instance-itemgroup"> <cd:constant value="itemize"/> </cd:define> - <cd:define name="instance-labeltext"> - <!-- tode --> + <cd:define name="instance-labelclass"> + <cd:constant value="head"/> + <cd:constant value="label"/> + <cd:constant value="mathlabel"/> + <cd:constant value="taglabel"/> + <cd:constant value="unit"/> + <cd:constant value="operator"/> + <cd:constant value="prefix"/> + <cd:constant value="suffix"/> + <cd:constant value="btxlabel"/> </cd:define> - <cd:define name="instance-labelclass"> - <!-- tode --> + <cd:define name="instance-labeltext"> + <cd:constant value="head"/> + <cd:constant value="label"/> + <cd:constant value="mathlabel"/> </cd:define> <cd:define name="instance-lines"> - <!-- tode --> + <cd:constant value="lines"/> </cd:define> <cd:define name="instance-combinedlist"> - <!-- tode --> + <cd:constant value="content"/> </cd:define> <cd:define name="instance-low"> - <!-- tode --> + <cd:constant value="unitslow"/> </cd:define> <cd:define name="instance-high"> - <!-- tode --> + <cd:constant value="unitshigh"/> </cd:define> <cd:define name="instance-makeup"> - <!-- tode --> + <cd:constant value="standard"/> + <cd:constant value="page"/> + <cd:constant value="text"/> + <cd:constant value="middle"/> </cd:define> <cd:define name="instance-margindata"> - <!-- tode --> + <cd:constant value="inleftmargin"/> + <cd:constant value="inrightmargin"/> + <cd:constant value="inoutermargin"/> + <cd:constant value="ininnermargin"/> + <cd:constant value="inleftedge"/> + <cd:constant value="inrightedge"/> + <cd:constant value="inouteredge"/> + <cd:constant value="ininneredge"/> + <cd:constant value="atleftmargin"/> + <cd:constant value="atrightmargin"/> + <cd:constant value="inleft"/> + <cd:constant value="inright"/> + <cd:constant value="inouter"/> + <cd:constant value="ininner"/> + <cd:constant value="inmargin"/> + <cd:constant value="inother"/> + <cd:constant value="margintext"/> + <!-- + <cd:constant value="marginword"/> + <cd:constant value="margintitle"/> + <cd:constant value="inothermargin"/> + --> </cd:define> <cd:define name="instance-mathalignment"> - <!-- tode --> + <cd:constant value="align"/> + <cd:constant value="mathalignment"/> </cd:define> <cd:define name="instance-mathcases"> - <!-- tode --> + <cd:constant value="cases"/> + <cd:constant value="mathcases"/> </cd:define> <cd:define name="instance-mathmatrix"> - <!-- tode --> + <cd:constant value="matrix"/> + <cd:constant value="mathmatrix"/> </cd:define> <cd:define name="instance-mixedcolumns"> - <!-- tode --> + <cd:constant value="itemgroupcolumns"/> + <cd:constant value="boxedcolumns"/> </cd:define> <cd:define name="instance-note"> - <!-- tode --> + <cd:constant value="footnote"/> + <cd:constant value="endnote"/> </cd:define> <cd:define name="instance-linenote"> - <!-- tode --> + <cd:constant value="linenote"/> </cd:define> <cd:define name="instance-pairedbox"> - <!-- tode --> + <cd:constant value="legend"/> </cd:define> <cd:define name="instance-register"> - <!-- tode --> + <cd:constant value="index"/> </cd:define> <cd:define name="instance-script"> - <!-- tode --> + <cd:constant value="hangul"/> + <cd:constant value="hanzi"/> + <cd:constant value="nihongo"/> + <cd:constant value="ethiopic"/> + <cd:constant value="thai"/> + <cd:constant value="latin"/> + <cd:constant value="test"/> </cd:define> <cd:define name="instance-section"> + <cd:constant value="part"/> <cd:constant value="chapter"/> <cd:constant value="section"/> <cd:constant value="subsection"/> @@ -98,43 +233,201 @@ </cd:define> <cd:define name="instance-sectionblock"> - <!-- tode --> + <cd:constant value="frontmatter"/> + <cd:constant value="bodymatter"/> + <cd:constant value="appendices"/> + <cd:constant value="backmatter"/> </cd:define> <cd:define name="instance-shift"> - <!-- tode --> + <cd:constant value="shiftup"/> + <cd:constant value="shiftdown"/> </cd:define> <cd:define name="instance-sort"> - <!-- tode --> + <cd:constant value="logo"/> </cd:define> <cd:define name="instance-sortlist"> - <!-- tode --> + <cd:constant value="logos"/> </cd:define> <cd:define name="instance-synonym"> - <!-- tode --> + <cd:constant value="abbreviation"/> </cd:define> <cd:define name="instance-synonymlist"> - <!-- tode --> + <cd:constant value="abbreviations"/> </cd:define> <cd:define name="instance-tabulate"> - <!-- tode --> + <cd:constant value="legend"/> + <cd:constant value="fact"/> </cd:define> <cd:define name="instance-tooltip"> - <!-- tode --> + <cd:constant value="tooltip"/> </cd:define> <cd:define name="instance-unit"> - <!-- tode --> + <cd:constant value="unit"/> </cd:define> <cd:define name="instance-typing"> - <!-- tode --> + <cd:constant value="typing"/> + <cd:constant value="LUA"/> + <cd:constant value="MP"/> + <cd:constant value="PARSEDXML"/> + <cd:constant value="TEX"/> + <cd:constant value="XML"/> + </cd:define> + + <cd:define name="instance-mathextensible"> + <!-- reverse --> + <cd:constant value="xrel"/> + <cd:constant value="xequal"/> + <cd:constant value="xleftarrow"/> + <cd:constant value="xrightarrow"/> + <cd:constant value="xleftrightarrow"/> + <cd:constant value="xLeftarrow"/> + <cd:constant value="xRightarrow"/> + <cd:constant value="xLeftrightarrow"/> + <cd:constant value="xtwoheadleftarrow"/> + <cd:constant value="xtwoheadrightarrow"/> + <cd:constant value="xmapsto"/> + <cd:constant value="xhookleftarrow"/> + <cd:constant value="xhookrightarrow"/> + <cd:constant value="xleftharpoondown"/> + <cd:constant value="xleftharpoonup"/> + <cd:constant value="xrightharpoondown"/> + <cd:constant value="xrightharpoonup"/> + <cd:constant value="xrightoverleftarrow"/> + <cd:constant value="xleftrightharpoons"/> + <cd:constant value="xrightleftharpoons"/> + <cd:constant value="xtriplerel"/> + <!-- mathematics --> + <cd:constant value="mrel"/> + <cd:constant value="mequal"/> + <cd:constant value="mleftarrow"/> + <cd:constant value="mrightarrow"/> + <cd:constant value="mleftrightarrow"/> + <cd:constant value="mLeftarrow"/> + <cd:constant value="mRightarrow"/> + <cd:constant value="mLeftrightarrow"/> + <cd:constant value="mtwoheadleftarrow"/> + <cd:constant value="mtwoheadrightarrow"/> + <cd:constant value="mmapsto"/> + <cd:constant value="mhookleftarrow"/> + <cd:constant value="mhookrightarrow"/> + <cd:constant value="mleftharpoondown"/> + <cd:constant value="mleftharpoonup"/> + <cd:constant value="mrightharpoondown"/> + <cd:constant value="mrightharpoonup"/> + <cd:constant value="mrightoverleftarrow"/> + <cd:constant value="mleftrightharpoons"/> + <cd:constant value="mrightleftharpoons"/> + <cd:constant value="mtriplerel"/> + <cd:constant value="eleftarrowfill"/> + <cd:constant value="erightarrowfill"/> + <cd:constant value="eleftrightarrowfill"/> + <cd:constant value="etwoheadrightarrowfill"/> + <cd:constant value="eleftharpoondownfill"/> + <cd:constant value="eleftharpoonupfill"/> + <cd:constant value="erightharpoondownfill"/> + <cd:constant value="erightharpoonupfill"/> + <cd:constant value="eoverbarfill"/> + <cd:constant value="eunderbarfill"/> + <cd:constant value="eoverbracefill"/> + <cd:constant value="eunderbracefill"/> + <cd:constant value="eoverparentfill"/> + <cd:constant value="eunderparentfill"/> + <cd:constant value="eoverbracketfill"/> + <cd:constant value="eunderbracketfill"/> + <!-- text --> + <cd:constant value="trel"/> + <cd:constant value="tequal"/> + <cd:constant value="tmapsto"/> + <cd:constant value="tleftarrow"/> + <cd:constant value="trightarrow"/> + <cd:constant value="tleftrightarrow"/> + <cd:constant value="tLeftarrow"/> + <cd:constant value="tRightarrow"/> + <cd:constant value="tLeftrightarrow"/> + <cd:constant value="ttwoheadleftarrow"/> + <cd:constant value="ttwoheadrightarrow"/> + <cd:constant value="thookleftarrow"/> + <cd:constant value="thookrightarrow"/> + <cd:constant value="tleftharpoondown"/> + <cd:constant value="tleftharpoonup"/> + <cd:constant value="trightharpoondown"/> + <cd:constant value="trightharpoonup"/> + <cd:constant value="trightoverleftarrow"/> + <cd:constant value="tleftrightharpoons"/> + <cd:constant value="trightleftharpoons"/> + <cd:constant value="ttriplerel"/> + <!-- chemistry --> + <cd:constant value="cleftarrow"/> + <cd:constant value="crightarrow"/> + <cd:constant value="crightoverleftarrow"/> + </cd:define> + + <cd:define name="instance-mathdoubleextensible"> + <!-- vfenced --> + <cd:constant value="doublebar"/> + <cd:constant value="doublebrace"/> + <cd:constant value="doubleparent"/> + <cd:constant value="doublebracket"/> + <!-- both --> + <cd:constant value="overbarunderbar"/> + <cd:constant value="overbraceunderbrace"/> + <cd:constant value="overparentunderparent"/> + <cd:constant value="overbracketunderbracket"/> + </cd:define> + + <cd:define name="instance-mathoverextensible"> + <!-- top --> + <cd:constant value="overleftarrow"/> + <cd:constant value="overrightarrow"/> + <cd:constant value="overleftrightarrow"/> + <cd:constant value="overtwoheadleftarrow"/> + <cd:constant value="overtwoheadrightarrow"/> + <cd:constant value="overleftharpoondown"/> + <cd:constant value="overleftharpoonup"/> + <cd:constant value="overrightharpoondown"/> + <cd:constant value="overrightharpoonup"/> + <!-- vfenced --> + <cd:constant value="overbar"/> + <cd:constant value="overbrace"/> + <cd:constant value="overparent"/> + <cd:constant value="overbracket"/> + <!-- bothtext --> + <cd:constant value="overbartext"/> + <cd:constant value="overbracetext"/> + <cd:constant value="overparenttext"/> + <cd:constant value="overbrackettext"/> + </cd:define> + + <cd:define name="instance-mathunderextensible"> + <!-- bottom --> + <cd:constant value="underleftarrow"/> + <cd:constant value="underrightarrow"/> + <cd:constant value="underleftrightarrow"/> + <cd:constant value="undertwoheadleftarrow"/> + <cd:constant value="undertwoheadrightarrow"/> + <cd:constant value="underleftharpoondown"/> + <cd:constant value="underleftharpoonup"/> + <cd:constant value="underrightharpoondown"/> + <cd:constant value="underrightharpoonup"/> + <!-- vfenced --> + <cd:constant value="underbar"/> + <cd:constant value="underbrace"/> + <cd:constant value="underparent"/> + <cd:constant value="underbracket"/> + <!-- bothtext --> + <cd:constant value="underbartext"/> + <cd:constant value="underbracetext"/> + <cd:constant value="underparenttext"/> + <cd:constant value="underbrackettext"/> </cd:define> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-common-keyword.xml b/tex/context/interface/mkiv/i-common-keyword.xml index e087ea5ac..97ac50caa 100644 --- a/tex/context/interface/mkiv/i-common-keyword.xml +++ b/tex/context/interface/mkiv/i-common-keyword.xml @@ -750,4 +750,46 @@ </cd:keywords> </cd:define> + <!-- * --> + <!-- \... [...] --> + <!-- --> + <!-- * SCITE --> + + <cd:define name="keyword-scite-optional"> + <cd:keywords optional="yes"> + <cd:constant type="none"/> + <cd:constant type="tex"/> + <cd:constant type="mkiv"/> + <cd:constant type="mkvi"/> + <cd:constant type="mkxi"/> + <cd:constant type="mkix"/> + <cd:constant type="mkii"/> + <cd:constant type="cld"/> + <cd:constant type="lua"/> + <cd:constant type="lfg"/> + <cd:constant type="lus"/> + <cd:constant type="mp"/> + <cd:constant type="mkiv"/> + <cd:constant type="mkii"/> + <cd:constant type="w"/> + <cd:constant type="ww"/> + <cd:constant type="c"/> + <cd:constant type="h"/> + <cd:constant type="cpp"/> + <cd:constant type="hpp"/> + <cd:constant type="cxx"/> + <cd:constant type="hxx"/> + <cd:constant type="xml"/> + <cd:constant type="lmx"/> + <cd:constant type="ctx"/> + <cd:constant type="xsl"/> + <cd:constant type="xsd"/> + <cd:constant type="rlx"/> + <cd:constant type="css"/> + <cd:constant type="dtd"/> + <cd:constant type="bib"/> + <cd:constant type="rme"/> + </cd:keywords> + </cd:define> + </cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-common-string.xml b/tex/context/interface/mkiv/i-common-string.xml index 68bde02ed..5ef1fc71a 100644 --- a/tex/context/interface/mkiv/i-common-string.xml +++ b/tex/context/interface/mkiv/i-common-string.xml @@ -152,4 +152,21 @@ </cd:keywords> </cd:define> + <!-- * --> + <!-- \... ... --> + <!-- --> + <!-- * ASSIGNMENT --> + + <cd:define name="string-assignment"> + <cd:keywords delimiters="none"> + <cd:constant type="="/> + </cd:keywords> + </cd:define> + + <cd:define name="string-assignment-optional"> + <cd:keywords delimiters="none" optional="yes"> + <cd:constant type="="/> + </cd:keywords> + </cd:define> + </cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-common-value.xml b/tex/context/interface/mkiv/i-common-value.xml index 36f2c1d52..c362779c4 100644 --- a/tex/context/interface/mkiv/i-common-value.xml +++ b/tex/context/interface/mkiv/i-common-value.xml @@ -296,10 +296,10 @@ <cd:constant type="page"/> <cd:constant type="leftpage"/> <cd:constant type="rightpage"/> - <cd:constant type="header"/> - <cd:constant type="footer"/> <cd:constant type="somewhere"/> <cd:constant type="effective"/> + <cd:constant type="header"/> + <cd:constant type="footer"/> </cd:define> <!-- sortorder = ... --> @@ -413,6 +413,11 @@ <cd:constant type="min"/> <cd:constant type="max"/> <cd:constant type="middle"/> + <cd:constant type="math"/> + <cd:constant type="line" prefix="math" method="range"/> + <cd:constant type="halfline" prefix="math" method="range"/> + <cd:constant type="-line" prefix="math" method="range"/> + <cd:constant type="-halfline" prefix="math" method="range"/> <cd:constant type="cd:name"/> </cd:define> @@ -582,6 +587,11 @@ <cd:constant type="tight"/> <cd:constant type="middle"/> <cd:constant type="frame"/> + <cd:constant type="depth"/> + <cd:constant type="line"/> + <cd:constant type="halfline"/> + <cd:constant type="line" prefix="-" method="none"/> + <cd:constant type="halfline" prefix="-" method="none"/> <cd:inherit name="setupbodyfont"/> </cd:define> @@ -593,4 +603,84 @@ <cd:constant type="cd:reference"/> </cd:define> + <!-- shape = ... --> + + <cd:define name="value-flowshape"> + <cd:constant type="none"/> + <cd:constant type="node"/> + <cd:constant type="action"/> + <cd:constant type="procedure"/> + <cd:constant type="product"/> + <cd:constant type="subprocedure"/> + <cd:constant type="singledocument"/> + <cd:constant type="multidocument"/> + <cd:constant type="decision"/> + <cd:constant type="archive"/> + <cd:constant type="loop"/> + <cd:constant type="wait"/> + <cd:constant type="left"/> + <cd:constant type="right"/> + <cd:constant type="top"/> + <cd:constant type="up"/> + <cd:constant type="down"/> + <cd:constant type="cd:number"/> + </cd:define> + + <!-- location = ... --> + + <cd:define name="value-chartlabel"> + <cd:constant type="l"/> + <cd:constant type="r"/> + <cd:constant type="t"/> + <cd:constant type="b"/> + <cd:constant type="lt"/> + <cd:constant type="rt"/> + <cd:constant type="lb"/> + <cd:constant type="rb"/> + <cd:constant type="tl"/> + <cd:constant type="tr"/> + <cd:constant type="bl"/> + <cd:constant type="br"/> + <!-- text only + <cd:constant type="c"/> + <cd:constant type="m"/> + --> + <cd:constant type="left"/> + <cd:constant type="right"/> + <cd:constant type="top"/> + <cd:constant type="bottom"/> + <!-- text only + <cd:constant type="center"/> + <cd:constant type="middle"/> + --> + </cd:define> + + <!-- tochar = ... --> + + <cd:define name="value-tochar"> + <cd:constant prefix="e" type="cd:name" method="range"/> + <cd:constant prefix="x" type="cd:number" method="range"/> + <cd:constant prefix="d" type="cd:number" method="range"/> + <cd:constant prefix="s" type="cd:number" method="range"/> + <cd:constant prefix="i" type="cd:number" method="range"/> + <cd:constant prefix="n" type="cd:name" method="range"/> + <cd:constant prefix="c" type="cd:name" method="range"/> + <cd:constant prefix="u" type="cd:name" method="range"/> + <cd:constant prefix="a" type="cd:name" method="range"/> + </cd:define> + + <!-- option = ... --> + + <cd:define name="value-verbatim"> + <cd:constant type="mp"/> + <cd:constant type="lua"/> + <cd:constant type="xml"/> + <cd:constant type="parsed-xml"/> + <cd:constant type="nested"/> + <cd:constant type="tex"/> + <cd:constant type="context"/> + <cd:constant type="none"/> + <cd:constant type="cd:name"/> + </cd:define> + </cd:interface> diff --git a/tex/context/interface/mkiv/i-context-modules.xml b/tex/context/interface/mkiv/i-context-modules.xml new file mode 100644 index 000000000..85194c6ec --- /dev/null +++ b/tex/context/interface/mkiv/i-context-modules.xml @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<?context-directive job ctxfile x-setups.ctx ?> + +<!-- + + Right from the start the ConTeXt user interface was sytematic enough to be described using a + common framework. First it was done in the TeX language at the top of the files where features + were implemented. Later we switched to XML where all definitions were moved to one file. That + file could be translated to different user interfaces. + + The current XML files are a follow up on this. Instead of one big file we now have many small + files, and support for shared (XML) definitions has been extended. Many more commands are defined, + including those considered low level. There are no longer translated files needed but you can + still generate them. + + These files can be used to generate overviews (see x-setups-*.mkiv) but also for generating + information for text editors. We also use them for the (local) help service. + + Wolfgang Schuster & Hans Hagen + +--> + + +<cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> + + <cd:interfacefile filename="i-common-definitions.xml"/> + + <cd:interfacefile filename="i-chart.xml"/> + <cd:interfacefile filename="i-database.xml"/> + <cd:interfacefile filename="i-hemistich.xml"/> + <cd:interfacefile filename="i-ipsum.xml"/> + <cd:interfacefile filename="i-scite.xml"/> + <cd:interfacefile filename="i-setup.xml"/> + <cd:interfacefile filename="i-spreadsheet.xml"/> + <cd:interfacefile filename="i-steps.xml"/> + <cd:interfacefile filename="i-translate.xml"/> + <cd:interfacefile filename="i-visual.xml"/> + +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-context.pdf b/tex/context/interface/mkiv/i-context.pdf Binary files differindex 9d3fa3314..20a83a632 100644 --- a/tex/context/interface/mkiv/i-context.pdf +++ b/tex/context/interface/mkiv/i-context.pdf diff --git a/tex/context/interface/mkiv/i-context.xml b/tex/context/interface/mkiv/i-context.xml index f1e85658f..ba09abcba 100644 --- a/tex/context/interface/mkiv/i-context.xml +++ b/tex/context/interface/mkiv/i-context.xml @@ -86,6 +86,7 @@ <cd:interfacefile filename="i-formula.xml"/> <cd:interfacefile filename="i-fraction.xml"/> <cd:interfacefile filename="i-framed.xml"/> + <cd:interfacefile filename="i-framedtable.xml"/> <cd:interfacefile filename="i-graphics.xml"/> <cd:interfacefile filename="i-grid.xml"/> <cd:interfacefile filename="i-help.xml"/> @@ -159,6 +160,7 @@ <cd:interfacefile filename="i-pageselection.xml"/> <cd:interfacefile filename="i-pageshift.xml"/> <cd:interfacefile filename="i-pagestate.xml"/> + <cd:interfacefile filename="i-pagemarks.xml"/> <cd:interfacefile filename="i-pairedbox.xml"/> <cd:interfacefile filename="i-papersize.xml"/> <cd:interfacefile filename="i-paragraph.xml"/> @@ -202,6 +204,7 @@ <cd:interfacefile filename="i-string.xml"/> <cd:interfacefile filename="i-strut.xml"/> <cd:interfacefile filename="i-symbol.xml"/> + <cd:interfacefile filename="i-synctex.xml"/> <cd:interfacefile filename="i-synonym.xml"/> <cd:interfacefile filename="i-system.xml"/> <cd:interfacefile filename="i-systemlog.xml"/> @@ -231,4 +234,4 @@ <cd:interfacefile filename="i-xml.xml"/> <cd:interfacefile filename="i-xtable.xml"/> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-conversion.xml b/tex/context/interface/mkiv/i-conversion.xml index 47440ddac..a2e975368 100644 --- a/tex/context/interface/mkiv/i-conversion.xml +++ b/tex/context/interface/mkiv/i-conversion.xml @@ -4,271 +4,271 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="numbers" file="core-con.mkiv"> + <cd:command name="numbers" level="style" category="counter" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="Numbers" file="core-con.mkiv"> + <cd:command name="Numbers" level="style" category="counter" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="romannumerals" file="core-con.mkiv"> + <cd:command name="romannumerals" level="style" category="counter language" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="Romannumerals" file="core-con.mkiv"> + <cd:command name="Romannumerals" level="style" category="counter language" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="abjadnumerals" file="core-con.mkiv"> + <cd:command name="abjadnumerals" level="style" category="counter language" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="abjadnodotnumerals" file="core-con.mkiv"> + <cd:command name="abjadnodotnumerals" level="style" category="counter language" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="abjadnaivenumerals" file="core-con.mkiv"> + <cd:command name="abjadnaivenumerals" level="style" category="counter language" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="languagecharacters" file="core-con.mkiv"> + <cd:command name="languagecharacters" level="style" category="counter language" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="languageCharacters" file="core-con.mkiv"> + <cd:command name="languageCharacters" level="style" category="counter language" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="alphabeticnumerals" file="core-con.mkiv"> + <cd:command name="alphabeticnumerals" level="style" category="counter language" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="Alphabeticnumerals" file="core-con.mkiv"> + <cd:command name="Alphabeticnumerals" level="style" category="counter language" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="thainumerals" file="core-con.mkiv"> + <cd:command name="thainumerals" level="style" category="counter language" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="devanagarinumerals" file="core-con.mkiv"> + <cd:command name="devanagarinumerals" level="style" category="counter language" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="gurmurkhinumerals" file="core-con.mkiv"> + <cd:command name="gurmurkhinumerals" level="style" category="counter language" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="gujaratinumerals" file="core-con.mkiv"> + <cd:command name="gujaratinumerals" level="style" category="counter language" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="tibetannumerals" file="core-con.mkiv"> + <cd:command name="tibetannumerals" level="style" category="counter language" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="greeknumerals" file="core-con.mkiv"> + <cd:command name="greeknumerals" level="style" category="counter language" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="Greeknumerals" file="core-con.mkiv"> + <cd:command name="Greeknumerals" level="style" category="counter language" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="arabicnumerals" file="core-con.mkiv"> + <cd:command name="arabicnumerals" level="style" category="counter language" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="persiannumerals" file="core-con.mkiv"> + <cd:command name="persiannumerals" level="style" category="counter language" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="arabicdecimals" file="core-con.mkiv"> + <cd:command name="arabicdecimals" level="style" category="counter language" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="persiandecimals" file="core-con.mkiv"> + <cd:command name="persiandecimals" level="style" category="counter language" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="arabicexnumerals" file="core-con.mkiv"> + <cd:command name="arabicexnumerals" level="style" category="counter language" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="koreannumerals" file="core-con.mkiv"> + <cd:command name="koreannumerals" level="style" category="counter language" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="koreannumeralsp" file="core-con.mkiv"> + <cd:command name="koreannumeralsp" level="style" category="counter language" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="koreannumeralsc" file="core-con.mkiv"> + <cd:command name="koreannumeralsc" level="style" category="counter language" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="koreanparentnumerals" file="core-con.mkiv"> + <cd:command name="koreanparentnumerals" level="style" category="counter language" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="koreancirclenumerals" file="core-con.mkiv"> + <cd:command name="koreancirclenumerals" level="style" category="counter language" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="chinesenumerals" file="core-con.mkiv"> + <cd:command name="chinesenumerals" level="style" category="counter language" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="chinesecapnumerals" file="core-con.mkiv"> + <cd:command name="chinesecapnumerals" level="style" category="counter language" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="chineseallnumerals" file="core-con.mkiv"> + <cd:command name="chineseallnumerals" level="style" category="counter language" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="character" file="core-con.mkiv"> + <cd:command name="character" level="style" category="counter language" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="Character" file="core-con.mkiv"> + <cd:command name="Character" level="style" category="counter language" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="characters" file="core-con.mkiv"> + <cd:command name="characters" level="style" category="counter language" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="Characters" file="core-con.mkiv"> + <cd:command name="Characters" level="style" category="counter language" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="monthlong" file="core-con.mkiv"> + <cd:command name="monthlong" level="style" category="counter" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="monthshort" file="core-con.mkiv"> + <cd:command name="monthshort" level="style" category="counter" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="convertmonth" file="core-con.mkiv"> + <cd:command name="convertmonth" level="style" category="counter" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="month" file="core-con.mkiv"> + <cd:command name="month" level="style" category="counter" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="MONTH" file="core-con.mkiv"> + <cd:command name="MONTH" level="style" category="counter" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="MONTHLONG" file="core-con.mkiv"> + <cd:command name="MONTHLONG" level="style" category="counter" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="MONTHSHORT" file="core-con.mkiv"> + <cd:command name="MONTHSHORT" level="style" category="counter" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="weekday" file="core-con.mkiv"> + <cd:command name="weekday" level="style" category="counter" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="WEEKDAY" file="core-con.mkiv"> + <cd:command name="WEEKDAY" level="style" category="counter" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="dayoftheweek" file="core-con.mkiv"> + <cd:command name="dayoftheweek" level="style" category="counter" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> <cd:resolve name="argument-number"/> @@ -276,7 +276,7 @@ </cd:arguments> </cd:command> - <cd:command name="getdayoftheweek" file="core-con.mkiv"> + <cd:command name="getdayoftheweek" level="style" category="counter" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> <cd:resolve name="argument-number"/> @@ -284,7 +284,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifelseleapyear" file="core-con.mkiv"> + <cd:command name="doifelseleapyear" level="style" category="counter conditional" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> <cd:resolve name="argument-true"/> @@ -292,7 +292,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifleapyearelse" file="core-con.mkiv"> + <cd:command name="doifleapyearelse" level="style" category="counter conditional" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> <cd:resolve name="argument-true"/> @@ -300,21 +300,21 @@ </cd:arguments> </cd:command> - <cd:command name="dayspermonth" file="core-con.mkiv"> + <cd:command name="dayspermonth" level="style" category="counter" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="getdayspermonth" file="core-con.mkiv"> + <cd:command name="getdayspermonth" level="style" category="counter" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="currentdate" file="core-con.mkiv"> + <cd:command name="currentdate" level="document" category="counter language" file="core-con.mkiv"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="year"/> @@ -358,7 +358,7 @@ </cd:arguments> </cd:command> - <cd:command name="date" file="core-con.mkiv"> + <cd:command name="date" level="document" category="counter language" file="core-con.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="d"> @@ -377,7 +377,7 @@ </cd:arguments> </cd:command> - <cd:command name="rawdate" file="core-con.mkiv"> + <cd:command name="rawdate" level="style" category="counter" file="core-con.mkiv"> <cd:arguments> <cd:keywords list="yes"> <cd:inherit name="currentdate"/> @@ -385,7 +385,7 @@ </cd:arguments> </cd:command> - <cd:command name="currenttime" file="core-con.mkiv"> + <cd:command name="currenttime" level="document" category="counter" file="core-con.mkiv"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="h"/> @@ -395,7 +395,7 @@ </cd:arguments> </cd:command> - <cd:command name="processmonth" file="core-con.mkiv"> + <cd:command name="processmonth" level="style" category="counter" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> <cd:resolve name="argument-number"/> @@ -403,7 +403,7 @@ </cd:arguments> </cd:command> - <cd:command name="processyear" file="core-con.mkiv"> + <cd:command name="processyear" level="style" category="counter" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> <cd:resolve name="argument-command"/> @@ -412,7 +412,7 @@ </cd:arguments> </cd:command> - <cd:command name="defineconversion" file="core-con.mkiv"> + <cd:command name="defineconversion" level="style" category="counter" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="keyword-language-optional"/> <cd:resolve name="keyword-name"/> @@ -420,7 +420,7 @@ </cd:arguments> </cd:command> - <cd:command name="defineconversion" variant="list" file="core-con.mkiv"> + <cd:command name="defineconversion" variant="list" level="style" category="counter language" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="keyword-language-optional"/> <cd:resolve name="keyword-name"/> @@ -428,7 +428,7 @@ </cd:arguments> </cd:command> - <cd:command name="convertnumber" file="core-con.mkiv"> + <cd:command name="convertnumber" level="document" category="counter" file="core-con.mkiv"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="empty"/> @@ -508,7 +508,7 @@ </cd:arguments> </cd:command> - <cd:command name="uconvertnumber" file="core-con.mkiv"> + <cd:command name="uconvertnumber" level="style" category="counter" file="core-con.mkiv"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:inherit name="convertnumber"/> @@ -517,7 +517,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifelseconversiondefined" file="core-con.mkiv"> + <cd:command name="doifelseconversiondefined" level="system" category="counter conditional" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -525,7 +525,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifconversiondefinedelse" file="core-con.mkiv"> + <cd:command name="doifconversiondefinedelse" level="system" category="counter conditional" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -533,7 +533,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifelseconversionnumber" file="core-con.mkiv"> + <cd:command name="doifelseconversionnumber" level="system" category="counter conditional" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-number"/> @@ -542,7 +542,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifconversionnumberelse" file="core-con.mkiv"> + <cd:command name="doifconversionnumberelse" level="system" category="counter conditional" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-number"/> @@ -551,7 +551,7 @@ </cd:arguments> </cd:command> - <cd:command name="wordtonumber" file="core-con.mkiv"> + <cd:command name="wordtonumber" level="document" category="counter" file="core-con.mkiv"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="one"/> @@ -564,82 +564,82 @@ </cd:arguments> </cd:command> - <cd:command name="highordinalstr" file="core-con.mkiv"> + <cd:command name="highordinalstr" level="document" category="counter" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="ordinalstr" file="core-con.mkiv"> + <cd:command name="ordinalstr" level="document" category="counter" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="ordinaldaynumber" file="core-con.mkiv"> + <cd:command name="ordinaldaynumber" level="document" category="counter" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="verbosenumber" file="core-con.mkiv"> + <cd:command name="verbosenumber" level="style" category="counter" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="VerboseNumber" file="core-con.mkiv"> + <cd:command name="VerboseNumber" level="style" category="counter" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="smallcappedromannumerals" file="core-con.mkiv"> + <cd:command name="smallcappedromannumerals" level="style" category="counter" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="smallcappedcharacters" file="core-con.mkiv"> + <cd:command name="smallcappedcharacters" level="style" category="counter" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="sloveniannumerals" file="core-con.mkiv"> + <cd:command name="sloveniannumerals" level="style" category="counter language" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="slovenianNumerals" file="core-con.mkiv"> + <cd:command name="slovenianNumerals" level="style" category="counter language" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="spanishnumerals" file="core-con.mkiv"> + <cd:command name="spanishnumerals" level="style" category="counter language" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="spanishNumerals" file="core-con.mkiv"> + <cd:command name="spanishNumerals" level="style" category="counter language" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="unihex" file="core-con.mkiv"> + <cd:command name="unihex" level="style" category="counter" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="continuednumber" file="core-con.mkiv"> + <cd:command name="continuednumber" level="style" category="counter" file="core-con.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-counter.xml b/tex/context/interface/mkiv/i-counter.xml index 55630b511..ec841a597 100644 --- a/tex/context/interface/mkiv/i-counter.xml +++ b/tex/context/interface/mkiv/i-counter.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definecounter" file="strc-num.mkiv"> + <cd:command name="definecounter" level="system" category="counter" file="strc-num.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupcounter" file="strc-num.mkiv"> + <cd:command name="setupcounter" level="system" category="counter" file="strc-num.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -111,7 +111,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifelsecounter" file="strc-num.mkiv"> + <cd:command name="doifelsecounter" level="system" category="counter conditional" file="strc-num.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -119,7 +119,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifcounterelse" file="strc-num.mkiv"> + <cd:command name="doifcounterelse" level="system" category="counter conditional" file="strc-num.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -127,21 +127,21 @@ </cd:arguments> </cd:command> - <cd:command name="doifcounter" file="strc-num.mkiv"> + <cd:command name="doifcounter" level="system" category="counter conditional" file="strc-num.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> </cd:arguments> </cd:command> - <cd:command name="doifnotcounter" file="strc-num.mkiv"> + <cd:command name="doifnotcounter" level="system" category="counter conditional" file="strc-num.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> </cd:arguments> </cd:command> - <cd:command name="setcounter" file="strc-num.mkiv"> + <cd:command name="setcounter" level="system" category="counter" file="strc-num.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-number-optional"/> @@ -149,7 +149,7 @@ </cd:arguments> </cd:command> - <cd:command name="setcounterown" file="strc-num.mkiv"> + <cd:command name="setcounterown" level="system" category="counter" file="strc-num.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-number-optional"/> @@ -157,7 +157,7 @@ </cd:arguments> </cd:command> - <cd:command name="restartcounter" file="strc-num.mkiv"> + <cd:command name="restartcounter" level="system" category="counter" file="strc-num.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-number-optional"/> @@ -165,165 +165,165 @@ </cd:arguments> </cd:command> - <cd:command name="resetcounter" file="strc-num.mkiv"> + <cd:command name="resetcounter" level="system" category="counter" file="strc-num.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-number-optional"/> </cd:arguments> </cd:command> - <cd:command name="incrementcounter" file="strc-num.mkiv"> + <cd:command name="incrementcounter" level="system" category="counter" file="strc-num.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-number-optional"/> </cd:arguments> </cd:command> - <cd:command name="decrementcounter" file="strc-num.mkiv"> + <cd:command name="decrementcounter" level="system" category="counter" file="strc-num.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-number-optional"/> </cd:arguments> </cd:command> - <cd:command name="rawcounter" file="strc-num.mkiv"> + <cd:command name="rawcounter" level="system" category="counter" file="strc-num.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-number-optional"/> </cd:arguments> </cd:command> - <cd:command name="lastcounter" file="strc-num.mkiv"> + <cd:command name="lastcounter" level="system" category="counter" file="strc-num.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-number-optional"/> </cd:arguments> </cd:command> - <cd:command name="firstcounter" file="strc-num.mkiv"> + <cd:command name="firstcounter" level="system" category="counter" file="strc-num.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-number-optional"/> </cd:arguments> </cd:command> - <cd:command name="nextcounter" file="strc-num.mkiv"> + <cd:command name="nextcounter" level="system" category="counter" file="strc-num.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-number-optional"/> </cd:arguments> </cd:command> - <cd:command name="prevcounter" file="strc-num.mkiv"> + <cd:command name="prevcounter" level="system" category="counter" file="strc-num.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-number-optional"/> </cd:arguments> </cd:command> - <cd:command name="countersubs" file="strc-num.mkiv"> + <cd:command name="countersubs" level="system" category="counter" file="strc-num.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-number-optional"/> </cd:arguments> </cd:command> - <cd:command name="savecounter" file="strc-num.mkiv"> + <cd:command name="savecounter" level="system" category="counter" file="strc-num.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="restorecounter" file="strc-num.mkiv"> + <cd:command name="restorecounter" level="system" category="counter" file="strc-num.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="showcounter" file="strc-num.mkiv"> + <cd:command name="showcounter" level="system" category="counter" file="strc-num.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="incrementedcounter" file="strc-num.mkiv"> + <cd:command name="incrementedcounter" level="system" category="counter" file="strc-num.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="decrementedcounter" file="strc-num.mkiv"> + <cd:command name="decrementedcounter" level="system" category="counter" file="strc-num.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="rawcountervalue" file="strc-num.mkiv"> + <cd:command name="rawcountervalue" level="system" category="counter" file="strc-num.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="lastcountervalue" file="strc-num.mkiv"> + <cd:command name="lastcountervalue" level="system" category="counter" file="strc-num.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="firstcountervalue" file="strc-num.mkiv"> + <cd:command name="firstcountervalue" level="system" category="counter" file="strc-num.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="nextcountervalue" file="strc-num.mkiv"> + <cd:command name="nextcountervalue" level="system" category="counter" file="strc-num.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="prevcountervalue" file="strc-num.mkiv"> + <cd:command name="prevcountervalue" level="system" category="counter" file="strc-num.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="rawsubcountervalue" file="strc-num.mkiv"> + <cd:command name="rawsubcountervalue" level="system" category="counter" file="strc-num.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-number"/> </cd:arguments> </cd:command> - <cd:command name="lastsubcountervalue" file="strc-num.mkiv"> + <cd:command name="lastsubcountervalue" level="system" category="counter" file="strc-num.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-number"/> </cd:arguments> </cd:command> - <cd:command name="firstsubcountervalue" file="strc-num.mkiv"> + <cd:command name="firstsubcountervalue" level="system" category="counter" file="strc-num.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-number"/> </cd:arguments> </cd:command> - <cd:command name="nextsubcountervalue" file="strc-num.mkiv"> + <cd:command name="nextsubcountervalue" level="system" category="counter" file="strc-num.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-number"/> </cd:arguments> </cd:command> - <cd:command name="prevsubcountervalue" file="strc-num.mkiv"> + <cd:command name="prevsubcountervalue" level="system" category="counter" file="strc-num.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-number"/> </cd:arguments> </cd:command> - <cd:command name="convertedcounter" file="strc-num.mkiv"> + <cd:command name="convertedcounter" level="system" category="counter" file="strc-num.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes" optional="yes"> @@ -332,7 +332,7 @@ </cd:arguments> </cd:command> - <cd:command name="convertedsubcounter" file="strc-num.mkiv"> + <cd:command name="convertedsubcounter" level="system" category="counter" file="strc-num.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:keywords optional="yes"> @@ -344,7 +344,7 @@ </cd:arguments> </cd:command> - <cd:command name="directconvertedcounter" file="strc-num.mkiv"> + <cd:command name="directconvertedcounter" level="system" category="counter" file="strc-num.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:keywords delimiters="braces"> @@ -360,7 +360,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifelsedefinedcounter" file="strc-num.mkiv"> + <cd:command name="doifelsedefinedcounter" level="system" category="counter conditional" file="strc-num.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -368,7 +368,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifdefinedcounterelse" file="strc-num.mkiv"> + <cd:command name="doifdefinedcounterelse" level="system" category="counter conditional" file="strc-num.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -376,21 +376,21 @@ </cd:arguments> </cd:command> - <cd:command name="doifdefinedcounter" file="strc-num.mkiv"> + <cd:command name="doifdefinedcounter" level="system" category="counter conditional" file="strc-num.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> </cd:arguments> </cd:command> - <cd:command name="doifundefinedcounter" file="strc-num.mkiv"> + <cd:command name="doifundefinedcounter" level="system" category="counter conditional" file="strc-num.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> </cd:arguments> </cd:command> - <cd:command name="defineresetset" file="strc-ini.mkvi"> + <cd:command name="defineresetset" level="style" category="counter" file="strc-ini.mkvi"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -403,7 +403,7 @@ <!-- - <cd:command name="definestructureresetset" file="strc-ini.mkvi"> + <cd:command name="definestructureresetset" level="style" category="counter" file="strc-ini.mkvi"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -416,7 +416,7 @@ --> - <cd:command name="defineseparatorset" file="strc-ini.mkvi"> + <cd:command name="defineseparatorset" level="style" category="counter" file="strc-ini.mkvi"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -433,7 +433,7 @@ <!-- - <cd:command name="definestructureseparatorset" file="strc-ini.mkvi"> + <cd:command name="definestructureseparatorset" level="style" category="counter" file="strc-ini.mkvi"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -450,7 +450,7 @@ --> - <cd:command name="defineconversionset" file="strc-ini.mkvi"> + <cd:command name="defineconversionset" level="style" category="counter" file="strc-ini.mkvi"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -469,7 +469,7 @@ <!-- - <cd:command name="definestructureconversionset" file="strc-ini.mkvi"> + <cd:command name="definestructureconversionset" level="style" category="counter" file="strc-ini.mkvi"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -488,7 +488,7 @@ --> - <cd:command name="defineprefixset" file="strc-ini.mkvi"> + <cd:command name="defineprefixset" level="style" category="counter" file="strc-ini.mkvi"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -501,7 +501,7 @@ <!-- - <cd:command name="definestructureprefixset" file="strc-ini.mkvi"> + <cd:command name="definestructureprefixset" level="style" category="counter" file="strc-ini.mkvi"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -514,4 +514,4 @@ --> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-database.xml b/tex/context/interface/mkiv/i-database.xml new file mode 100644 index 000000000..a81cd75f8 --- /dev/null +++ b/tex/context/interface/mkiv/i-database.xml @@ -0,0 +1,118 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<?context-directive job ctxfile x-setups.ctx ?> + +<cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> + + <cd:command name="definedatabase" level="style" file="m-database.mkiv"> + <cd:arguments> + <cd:resolve name="keyword-name"/> + <cd:resolve name="keyword-name-optional"/> + <cd:assignments list="yes" optional="yes"> + <cd:inherit name="setupdatabase"/> + </cd:assignments> + </cd:arguments> + </cd:command> + + <cd:command name="setupdatabase" level="style" file="m-database.mkiv"> + <cd:arguments> + <cd:resolve name="keyword-name-list-optional"/> + <cd:assignments list="yes"> + <cd:parameter name="strip"> + <cd:constant type="yes"/> + <cd:constant type="no" default="yes"/> + </cd:parameter> + <cd:parameter name="separator"> + <cd:constant type="tab"/> + <cd:constant type="tabs"/> + <cd:constant type="comma"/> + <cd:constant type="space"/> + <cd:constant type="spaces"/> + <cd:constant type="cd:text"/> + </cd:parameter> + <cd:parameter name="quotechar"> + <cd:constant type="cd:text"/> + </cd:parameter> + <cd:parameter name="commentchar"> + <cd:constant type="cd:text"/> + </cd:parameter> + <cd:parameter name="setups" list="yes"> + <cd:constant type="cd:name"/> + </cd:parameter> + <cd:parameter name="before"> + <cd:constant type="cd:command"/> + </cd:parameter> + <cd:parameter name="after"> + <cd:constant type="cd:command"/> + </cd:parameter> + <cd:parameter name="first"> + <cd:constant type="cd:command"/> + </cd:parameter> + <cd:parameter name="last"> + <cd:constant type="cd:command"/> + </cd:parameter> + <cd:parameter name="left"> + <cd:constant type="cd:command"/> + </cd:parameter> + <cd:parameter name="right"> + <cd:constant type="cd:command"/> + </cd:parameter> + <cd:parameter name="command"> + <cd:constant type="cd:csname"/> + </cd:parameter> + </cd:assignments> + </cd:arguments> + </cd:command> + + <cd:command name="processdatabasebuffer" level="document" file="m-database.mkiv"> + <cd:arguments> + <cd:resolve name="keyword-name"/> + <cd:resolve name="keyword-buffer"/> + </cd:arguments> + </cd:command> + + <cd:command name="processdatabasefile" level="document" file="m-database.mkiv"> + <cd:arguments> + <cd:resolve name="keyword-name"/> + <cd:resolve name="keyword-file"/> + </cd:arguments> + </cd:command> + + <cd:command name="defineseparatedlist" level="style" file="m-database.mkiv"> + <cd:arguments> + <cd:resolve name="keyword-name"/> + <cd:assignments list="yes" optional="yes"> + <cd:inherit name="setupdatabase"/> + </cd:assignments> + </cd:arguments> + </cd:command> + + <cd:command name="processseparatedlist" level="document" file="m-database.mkiv"> + <cd:arguments> + <cd:resolve name="keyword-name"/> + <cd:resolve name="keyword-file"/> + </cd:arguments> + </cd:command> + + <cd:command name="separatedlist" type="environment" generated="yes" variant="instance" level="document" file="m-database.mkiv"> + <cd:sequence> + <cd:instance value="separatedlist"/> + </cd:sequence> + </cd:command> + + <cd:command name="separatedlist" type="environment" level="document" file="m-database.mkiv"> + <cd:arguments> + <cd:resolve name="keyword-name"/> + </cd:arguments> + </cd:command> + + <cd:command name="setupseparatedlist" level="style" file="m-database.mkiv"> + <cd:arguments> + <cd:resolve name="keyword-name-list-optional"/> + <cd:assignments list="yes"> + <cd:inherit name="setupdatabase"/> + </cd:assignments> + </cd:arguments> + </cd:command> + +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-dataset.xml b/tex/context/interface/mkiv/i-dataset.xml index 6f4f9fb9f..c006454d3 100644 --- a/tex/context/interface/mkiv/i-dataset.xml +++ b/tex/context/interface/mkiv/i-dataset.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definedataset" file="core-dat.mkiv"> + <cd:command name="definedataset" level="system" file="core-dat.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupdataset" file="core-dat.mkiv"> + <cd:command name="setupdataset" level="system" file="core-dat.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -26,7 +26,7 @@ </cd:arguments> </cd:command> - <cd:command name="setdataset" file="core-dat.mkiv"> + <cd:command name="setdataset" level="system" file="core-dat.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -34,7 +34,7 @@ </cd:arguments> </cd:command> - <cd:command name="datasetvariable" file="core-dat.mkiv"> + <cd:command name="datasetvariable" level="system" file="core-dat.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:keywords delimiters="braces"> @@ -48,4 +48,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-define.xml b/tex/context/interface/mkiv/i-define.xml index 2db8614c0..91975e752 100644 --- a/tex/context/interface/mkiv/i-define.xml +++ b/tex/context/interface/mkiv/i-define.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="define" file="core-sys.mkiv"> + <cd:command name="define" level="system" file="core-sys.mkiv"> <cd:arguments> <cd:resolve name="keyword-number-optional"/> <cd:csname/> @@ -12,7 +12,7 @@ </cd:arguments> </cd:command> - <cd:command name="defineexpandable" file="core-sys.mkiv"> + <cd:command name="defineexpandable" level="system" file="core-sys.mkiv"> <cd:arguments> <cd:resolve name="keyword-number-optional"/> <cd:csname/> @@ -20,4 +20,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-delimitedtext.xml b/tex/context/interface/mkiv/i-delimitedtext.xml index d75fb957e..c34052644 100644 --- a/tex/context/interface/mkiv/i-delimitedtext.xml +++ b/tex/context/interface/mkiv/i-delimitedtext.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definedelimitedtext" file="typo-del.mkiv"> + <cd:command name="definedelimitedtext" level="style" category="language" file="typo-del.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupdelimitedtext" file="typo-del.mkiv"> + <cd:command name="setupdelimitedtext" level="style" category="language" file="typo-del.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -90,26 +90,22 @@ </cd:arguments> </cd:command> - <cd:command name="delimitedtext" generated="yes" variant="example" file="typo-del.mkiv"> + <cd:command name="delimitedtext" generated="yes" variant="instance" level="document" category="language" file="typo-del.mkiv"> <cd:sequence> - <cd:variable value="delimitedtext"/> + <cd:instance value="delimitedtext"/> </cd:sequence> <cd:arguments> <cd:resolve name="keyword-language-optional"/> <cd:content/> </cd:arguments> <cd:instances> - <cd:constant value="quotation"/> - <cd:constant value="quote"/> - <cd:constant value="blockquote"/> - <cd:constant value="speech"/> - <cd:constant value="aside"/> + <cd:resolve name="instance-delimitedtext"/> </cd:instances> </cd:command> - <cd:command name="delimitedtext" type="environment" generated="yes" variant="example" file="typo-del.mkiv"> + <cd:command name="delimitedtext" type="environment" generated="yes" variant="instance" level="document" category="language" file="typo-del.mkiv"> <cd:sequence> - <cd:variable value="delimitedtext"/> + <cd:instance value="delimitedtext"/> </cd:sequence> <cd:arguments> <cd:resolve name="keyword-language-optional"/> @@ -118,15 +114,11 @@ </cd:keywords> </cd:arguments> <cd:instances> - <cd:constant value="quotation"/> - <cd:constant value="quote"/> - <cd:constant value="blockquote"/> - <cd:constant value="speech"/> - <cd:constant value="aside"/> + <cd:resolve name="instance-delimitedtext"/> </cd:instances> </cd:command> - <cd:command name="delimitedtext" file="typo-del.mkiv"> + <cd:command name="delimitedtext" level="document" category="language" file="typo-del.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-language-optional"/> @@ -134,7 +126,7 @@ </cd:arguments> </cd:command> - <cd:command name="delimitedtext" type="environment" file="typo-del.mkiv"> + <cd:command name="delimitedtext" type="environment" level="document" category="language" file="typo-del.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-language-optional"/> @@ -144,7 +136,7 @@ </cd:arguments> </cd:command> - <cd:command name="delimited" file="typo-del.mkiv"> + <cd:command name="delimited" level="document" category="language" file="typo-del.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-language-optional"/> @@ -152,7 +144,7 @@ </cd:arguments> </cd:command> - <cd:command name="delimited" type="environment" file="typo-del.mkiv"> + <cd:command name="delimited" type="environment" level="document" category="language" file="typo-del.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-language-optional"/> @@ -162,83 +154,87 @@ </cd:arguments> </cd:command> - <cd:command name="quotation" file="typo-del.mkiv"> - <cd:arguments> - <cd:resolve name="keyword-language-optional"/> - <cd:content/> - </cd:arguments> - </cd:command> + <!-- - <cd:command name="quotation" type="environment" file="typo-del.mkiv"> - <cd:arguments> - <cd:resolve name="keyword-language-optional"/> - <cd:keywords list="yes" optional="yes"> - <cd:inherit name="startnarrower"/> - </cd:keywords> - </cd:arguments> - </cd:command> + <cd:command name="quotation" level="document" category="language" file="typo-del.mkiv"> + <cd:arguments> + <cd:resolve name="keyword-language-optional"/> + <cd:content/> + </cd:arguments> + </cd:command> - <cd:command name="quote" file="typo-del.mkiv"> - <cd:arguments> - <cd:resolve name="keyword-language-optional"/> - <cd:content/> - </cd:arguments> - </cd:command> + <cd:command name="quotation" type="environment" level="document" category="language" file="typo-del.mkiv"> + <cd:arguments> + <cd:resolve name="keyword-language-optional"/> + <cd:keywords list="yes" optional="yes"> + <cd:inherit name="startnarrower"/> + </cd:keywords> + </cd:arguments> + </cd:command> - <cd:command name="quote" type="environment" file="typo-del.mkiv"> - <cd:arguments> - <cd:resolve name="keyword-language-optional"/> - </cd:arguments> - </cd:command> + <cd:command name="quote" level="document" category="language" file="typo-del.mkiv"> + <cd:arguments> + <cd:resolve name="keyword-language-optional"/> + <cd:content/> + </cd:arguments> + </cd:command> - <cd:command name="blockquote" file="typo-del.mkiv"> - <cd:arguments> - <cd:resolve name="keyword-language-optional"/> - <cd:content/> - </cd:arguments> - </cd:command> + <cd:command name="quote" type="environment" level="document" category="language" file="typo-del.mkiv"> + <cd:arguments> + <cd:resolve name="keyword-language-optional"/> + </cd:arguments> + </cd:command> - <cd:command name="blockquote" type="environment" file="typo-del.mkiv"> - <cd:arguments> - <cd:resolve name="keyword-language-optional"/> - <cd:keywords list="yes" optional="yes"> - <cd:inherit name="startnarrower"/> - </cd:keywords> - </cd:arguments> - </cd:command> + <cd:command name="blockquote" level="document" category="language" file="typo-del.mkiv"> + <cd:arguments> + <cd:resolve name="keyword-language-optional"/> + <cd:content/> + </cd:arguments> + </cd:command> - <cd:command name="speech" file="typo-del.mkiv"> - <cd:arguments> - <cd:resolve name="keyword-language-optional"/> - <cd:content/> - </cd:arguments> - </cd:command> + <cd:command name="blockquote" type="environment" level="document" category="language" file="typo-del.mkiv"> + <cd:arguments> + <cd:resolve name="keyword-language-optional"/> + <cd:keywords list="yes" optional="yes"> + <cd:inherit name="startnarrower"/> + </cd:keywords> + </cd:arguments> + </cd:command> - <cd:command name="aside" type="environment" file="typo-del.mkiv"> - <cd:arguments> - <cd:resolve name="keyword-language-optional"/> - <cd:keywords list="yes" optional="yes"> - <cd:inherit name="startnarrower"/> - </cd:keywords> - </cd:arguments> - </cd:command> + <cd:command name="speech" level="document" category="language" file="typo-del.mkiv"> + <cd:arguments> + <cd:resolve name="keyword-language-optional"/> + <cd:content/> + </cd:arguments> + </cd:command> - <cd:command name="aside" file="typo-del.mkiv"> - <cd:arguments> - <cd:resolve name="keyword-language-optional"/> - <cd:content/> - </cd:arguments> - </cd:command> + <cd:command name="aside" type="environment" level="document" category="language" file="typo-del.mkiv"> + <cd:arguments> + <cd:resolve name="keyword-language-optional"/> + <cd:keywords list="yes" optional="yes"> + <cd:inherit name="startnarrower"/> + </cd:keywords> + </cd:arguments> + </cd:command> - <cd:command name="speech" type="environment" file="typo-del.mkiv"> - <cd:arguments> - <cd:keywords list="yes" optional="yes"> - <cd:inherit name="startnarrower"/> - </cd:keywords> - </cd:arguments> - </cd:command> + <cd:command name="aside" level="document" category="language" file="typo-del.mkiv"> + <cd:arguments> + <cd:resolve name="keyword-language-optional"/> + <cd:content/> + </cd:arguments> + </cd:command> - <cd:command name="setupquotation" file="typo-del.mkiv"> + <cd:command name="speech" type="environment" level="document" category="language" file="typo-del.mkiv"> + <cd:arguments> + <cd:keywords list="yes" optional="yes"> + <cd:inherit name="startnarrower"/> + </cd:keywords> + </cd:arguments> + </cd:command> + + --> + + <cd:command name="setupquotation" level="style" category="language" file="typo-del.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:inherit name="setupdelimitedtext"/> @@ -246,7 +242,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupquote" file="typo-del.mkiv"> + <cd:command name="setupquote" level="style" category="language" file="typo-del.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:inherit name="setupdelimitedtext"/> @@ -254,12 +250,14 @@ </cd:arguments> </cd:command> - <cd:command name="subsentence" file="typo-del.mkiv"> + <cd:command name="subsentence" level="document" category="language" file="typo-del.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="subsentence" type="environment" file="typo-del.mkiv"/> + <cd:command name="subsentence" type="environment" level="document" category="language" file="typo-del.mkiv"/> + + <cd:command name="midsubsentence" level="document" category="language" file="typo-del.mkiv"/> </cd:interface> diff --git a/tex/context/interface/mkiv/i-description.xml b/tex/context/interface/mkiv/i-description.xml index 13b056d71..f2cf33e82 100644 --- a/tex/context/interface/mkiv/i-description.xml +++ b/tex/context/interface/mkiv/i-description.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definedescription" file="strc-des.mkvi"> + <cd:command name="definedescription" level="style" category="structure" file="strc-des.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupdescription" file="strc-des.mkvi"> + <cd:command name="setupdescription" level="style" category="structure" file="strc-des.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -84,6 +84,12 @@ <cd:constant type="none"/> <cd:constant type="cd:dimension"/> </cd:parameter> + <cd:parameter name="stretch"> + <cd:constant type="cd:number"/> + </cd:parameter> + <cd:parameter name="shrink"> + <cd:constant type="cd:number"/> + </cd:parameter> <cd:parameter name="hang"> <cd:constant type="fit"/> <cd:constant type="broad"/> @@ -102,6 +108,9 @@ <cd:constant type="no" default="yes"/> <cd:constant type="xml"/> </cd:parameter> + <cd:parameter name="referenceprefix"> + <cd:resolve name="value-referenceprefix"/> + </cd:parameter> <cd:parameter name="sample"> <cd:constant type="cd:text"/> </cd:parameter> @@ -127,7 +136,7 @@ <!-- - <cd:command name="setupdescriptions" file="strc-des.mkvi"> + <cd:command name="setupdescriptions" level="style" category="structure" file="strc-des.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -138,7 +147,7 @@ --> - <cd:command name="description" type="environment" generated="yes" variant="example" file="strc-des.mkvi"> + <cd:command name="description" type="environment" generated="yes" variant="example" level="document" category="structure" file="strc-des.mkvi"> <cd:sequence> <cd:variable value="description"/> </cd:sequence> @@ -147,7 +156,7 @@ </cd:arguments> </cd:command> - <cd:command name="description" type="environment" generated="yes" variant="example:title" file="strc-des.mkvi"> + <cd:command name="description" type="environment" generated="yes" variant="example:title" level="document" category="structure" file="strc-des.mkvi"> <cd:sequence> <cd:variable value="description"/> </cd:sequence> @@ -157,7 +166,7 @@ </cd:arguments> </cd:command> - <cd:command name="description" generated="yes" variant="example" file="strc-des.mkvi"> + <cd:command name="description" generated="yes" variant="example" level="document" category="structure" file="strc-des.mkvi"> <cd:sequence> <cd:variable value="description"/> </cd:sequence> @@ -169,4 +178,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-digits.xml b/tex/context/interface/mkiv/i-digits.xml index d9a4b9d2d..c917bf0d4 100644 --- a/tex/context/interface/mkiv/i-digits.xml +++ b/tex/context/interface/mkiv/i-digits.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="setdigitsmanipulation" file="typo-dig.mkiv"> + <cd:command name="setdigitsmanipulation" level="system" file="typo-dig.mkiv"> <cd:arguments> <cd:keywords> <cd:constant type="reset"/> @@ -13,14 +13,14 @@ </cd:arguments> </cd:command> - <cd:command name="resetdigitsmanipulation" file="typo-dig.mkiv"/> + <cd:command name="resetdigitsmanipulation" level="system" file="typo-dig.mkiv"/> - <cd:command name="equaldigits" file="typo-dig.mkiv"> + <cd:command name="equaldigits" level="document" file="typo-dig.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="dummydigit" file="typo-dig.mkiv"/> + <cd:command name="dummydigit" level="document" file="typo-dig.mkiv"/> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-dimension.xml b/tex/context/interface/mkiv/i-dimension.xml index 7bf59467b..1980687ab 100644 --- a/tex/context/interface/mkiv/i-dimension.xml +++ b/tex/context/interface/mkiv/i-dimension.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="assigndimension" file="mult-dim.mkvi"> + <cd:command name="assigndimension" level="system" file="mult-dim.mkvi"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="small" prefix="cd:sign" method="none"/> @@ -20,7 +20,7 @@ </cd:arguments> </cd:command> - <cd:command name="assignalfadimension" file="mult-dim.mkvi"> + <cd:command name="assignalfadimension" level="system" file="mult-dim.mkvi"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="small"/> @@ -36,7 +36,7 @@ </cd:arguments> </cd:command> - <cd:command name="assignwidth" file="mult-dim.mkvi"> + <cd:command name="assignwidth" level="system" file="mult-dim.mkvi"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="fit"/> @@ -49,7 +49,7 @@ </cd:arguments> </cd:command> - <cd:command name="assignvalue" file="mult-dim.mkvi"> + <cd:command name="assignvalue" level="system" file="mult-dim.mkvi"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="small"/> @@ -64,4 +64,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-direction.xml b/tex/context/interface/mkiv/i-direction.xml index 630f07cb7..3b2d937a4 100644 --- a/tex/context/interface/mkiv/i-direction.xml +++ b/tex/context/interface/mkiv/i-direction.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="setupdirections" file="typo-dir.mkiv"> + <cd:command name="setupdirections" level="style" category="language alignment" file="typo-dir.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="bidi"> @@ -22,33 +22,37 @@ <cd:constant type="yes" default="yes"/> <cd:constant type="no"/> </cd:parameter> + <cd:parameter name="break"> + <cd:constant type="both" default="yes"/> + <cd:constant type="before"/> + </cd:parameter> </cd:assignments> </cd:arguments> </cd:command> - <cd:command name="setdirection" file="typo-dir.mkiv"> + <cd:command name="setdirection" level="style" category="language alignment" file="typo-dir.mkiv"> <cd:arguments> <cd:resolve name="keyword-number"/> </cd:arguments> </cd:command> - <cd:command name="resetdirection" file="typo-dir.mkiv"/> + <cd:command name="resetdirection" level="style" category="language alignment" file="typo-dir.mkiv"/> <!-- - <cd:command name="lefttorightmark" file="typo-dir.mkiv"/> + <cd:command name="lefttorightmark" level="system" category="language alignment" file="typo-dir.mkiv"/> - <cd:command name="righttoleftmark" file="typo-dir.mkiv"/> + <cd:command name="righttoleftmark" level="system" category="language alignment" file="typo-dir.mkiv"/> - <cd:command name="lrm" file="typo-dir.mkiv"/> + <cd:command name="lrm" level="system" category="language alignment" file="typo-dir.mkiv"/> - <cd:command name="rlm" file="typo-dir.mkiv"/> + <cd:command name="rlm" level="system" category="language alignment" file="typo-dir.mkiv"/> --> - <cd:command name="showdirsinmargin" file="supp-dir.mkiv"/> + <cd:command name="showdirsinmargin" level="document" category="alignment" file="supp-dir.mkiv"/> - <cd:command name="istltdir" file="supp-dir.mkiv"> + <cd:command name="istltdir" level="system" category="alignment" file="supp-dir.mkiv"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="TLT"/> @@ -57,7 +61,7 @@ </cd:arguments> </cd:command> - <cd:command name="istrtdir" file="supp-dir.mkiv"> + <cd:command name="istrtdir" level="system" category="alignment" file="supp-dir.mkiv"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="TLT"/> @@ -66,4 +70,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-document.xml b/tex/context/interface/mkiv/i-document.xml index e2417ec63..fcd9e040b 100644 --- a/tex/context/interface/mkiv/i-document.xml +++ b/tex/context/interface/mkiv/i-document.xml @@ -4,13 +4,13 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="text" type="environment" file="file-job.mkvi"/> + <cd:command name="text" type="environment" level="document" category="structure" file="file-job.mkvi"/> - <cd:command name="text" type="environment" begin="autostart" end="autostop" file="file-job.mkvi"/> + <cd:command name="text" type="environment" begin="autostart" end="autostop" level="system" category="structure" file="file-job.mkvi"/> - <cd:command name="notext" type="environment" file="file-job.mkvi"/> + <cd:command name="notext" type="environment" level="system" category="structure" file="file-job.mkvi"/> - <cd:command name="environment" type="environment" file="file-job.mkvi"> + <cd:command name="environment" type="environment" level="document" category="structure" file="file-job.mkvi"> <cd:arguments> <cd:keywords> <cd:constant type="cd:file"/> @@ -19,7 +19,7 @@ </cd:arguments> </cd:command> - <cd:command name="environment" type="environment" variant="string" file="file-job.mkvi"> + <cd:command name="environment" type="environment" variant="string" level="document" category="structure" file="file-job.mkvi"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:file"/> @@ -28,27 +28,27 @@ </cd:arguments> </cd:command> - <cd:command name="environment" file="file-job.mkvi"> + <cd:command name="environment" level="document" category="structure" file="file-job.mkvi"> <cd:arguments> <cd:resolve name="keyword-file"/> </cd:arguments> </cd:command> - <cd:command name="environment" variant="string" file="file-job.mkvi"> + <cd:command name="environment" variant="string" level="document" category="structure" file="file-job.mkvi"> <cd:arguments> <cd:resolve name="string-file"/> </cd:arguments> </cd:command> - <cd:command name="useenvironment" file="file-job.mkvi"> + <cd:command name="useenvironment" level="document" category="structure" file="file-job.mkvi"> <cd:arguments> <cd:resolve name="keyword-file"/> </cd:arguments> </cd:command> - <cd:command name="currentenvironment" file="file-job.mkvi"/> + <cd:command name="currentenvironment" level="system" category="structure" file="file-job.mkvi"/> - <cd:command name="project" type="environment" file="file-job.mkvi"> + <cd:command name="project" type="environment" level="document" category="structure" file="file-job.mkvi"> <cd:arguments> <cd:keywords> <cd:constant type="cd:file"/> @@ -57,7 +57,7 @@ </cd:arguments> </cd:command> - <cd:command name="project" type="environment" variant="string" file="file-job.mkvi"> + <cd:command name="project" type="environment" variant="string" level="document" category="structure" file="file-job.mkvi"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:file"/> @@ -66,27 +66,27 @@ </cd:arguments> </cd:command> - <cd:command name="project" file="file-job.mkvi"> + <cd:command name="project" level="document" category="structure" file="file-job.mkvi"> <cd:arguments> <cd:resolve name="keyword-file"/> </cd:arguments> </cd:command> - <cd:command name="project" variant="string" file="file-job.mkvi"> + <cd:command name="project" variant="string" level="document" category="structure" file="file-job.mkvi"> <cd:arguments> <cd:resolve name="string-file"/> </cd:arguments> </cd:command> - <cd:command name="useproject" file="file-job.mkvi"> + <cd:command name="useproject" level="document" category="structure" file="file-job.mkvi"> <cd:arguments> <cd:resolve name="keyword-file"/> </cd:arguments> </cd:command> - <cd:command name="currentproject" file="file-job.mkvi"/> + <cd:command name="currentproject" level="system" category="structure" file="file-job.mkvi"/> - <cd:command name="product" type="environment" file="file-job.mkvi"> + <cd:command name="product" type="environment" level="document" category="structure" file="file-job.mkvi"> <cd:arguments> <cd:keywords> <cd:constant type="cd:file"/> @@ -95,7 +95,7 @@ </cd:arguments> </cd:command> - <cd:command name="product" type="environment" variant="string" file="file-job.mkvi"> + <cd:command name="product" type="environment" variant="string" level="document" category="structure" file="file-job.mkvi"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:file"/> @@ -104,27 +104,27 @@ </cd:arguments> </cd:command> - <cd:command name="product" file="file-job.mkvi"> + <cd:command name="product" level="document" category="structure" file="file-job.mkvi"> <cd:arguments> <cd:resolve name="keyword-file"/> </cd:arguments> </cd:command> - <cd:command name="product" variant="string" file="file-job.mkvi"> + <cd:command name="product" variant="string" level="document" category="structure" file="file-job.mkvi"> <cd:arguments> <cd:resolve name="string-file"/> </cd:arguments> </cd:command> - <cd:command name="useproduct" file="file-job.mkvi"> + <cd:command name="useproduct" level="document" category="structure" file="file-job.mkvi"> <cd:arguments> <cd:resolve name="keyword-file"/> </cd:arguments> </cd:command> - <cd:command name="currentproduct" file="file-job.mkvi"/> + <cd:command name="currentproduct" level="system" category="structure" file="file-job.mkvi"/> - <cd:command name="component" type="environment" file="file-job.mkvi"> + <cd:command name="component" type="environment" level="document" category="structure" file="file-job.mkvi"> <cd:arguments> <cd:keywords> <cd:constant type="cd:file"/> @@ -133,7 +133,7 @@ </cd:arguments> </cd:command> - <cd:command name="component" type="environment" variant="string" file="file-job.mkvi"> + <cd:command name="component" type="environment" variant="string" level="document" category="structure" file="file-job.mkvi"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:file"/> @@ -142,27 +142,27 @@ </cd:arguments> </cd:command> - <cd:command name="component" file="file-job.mkvi"> + <cd:command name="component" level="document" category="structure" file="file-job.mkvi"> <cd:arguments> <cd:resolve name="keyword-file"/> </cd:arguments> </cd:command> - <cd:command name="component" variant="string" file="file-job.mkvi"> + <cd:command name="component" variant="string" level="document" category="structure" file="file-job.mkvi"> <cd:arguments> <cd:resolve name="string-file"/> </cd:arguments> </cd:command> - <cd:command name="usecomponent" file="file-job.mkvi"> + <cd:command name="usecomponent" level="document" category="structure" file="file-job.mkvi"> <cd:arguments> <cd:resolve name="keyword-file"/> </cd:arguments> </cd:command> - <cd:command name="currentcomponent" file="file-job.mkvi"/> + <cd:command name="currentcomponent" level="system" category="structure" file="file-job.mkvi"/> - <cd:command name="document" type="environment" file="file-job.mkvi"> + <cd:command name="document" type="environment" level="document" category="structure" file="file-job.mkvi"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupdocument"/> @@ -170,7 +170,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupdocument" file="file-job.mkvi"> + <cd:command name="setupdocument" level="style" category="structure" file="file-job.mkvi"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="before"> @@ -198,7 +198,7 @@ </cd:arguments> </cd:command> - <cd:command name="presetdocument" file="file-job.mkvi"> + <cd:command name="presetdocument" level="style" category="structure" file="file-job.mkvi"> <cd:arguments> <cd:assignments list="yes"> <cd:inherit name="setupdocument"/> @@ -206,10 +206,16 @@ </cd:arguments> </cd:command> - <cd:command name="documentvariable" file="file-job.mkvi"> + <cd:command name="documentvariable" level="style" category="structure" file="file-job.mkvi"> <cd:arguments> <cd:resolve name="argument-key"/> </cd:arguments> </cd:command> -</cd:interface> + <cd:command name="unexpandeddocumentvariable" level="style" category="structure" file="file-job.mkvi"> + <cd:arguments> + <cd:resolve name="argument-key"/> + </cd:arguments> + </cd:command> + +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-dummy.xml b/tex/context/interface/mkiv/i-dummy.xml index 6c7d4288f..47d005e20 100644 --- a/tex/context/interface/mkiv/i-dummy.xml +++ b/tex/context/interface/mkiv/i-dummy.xml @@ -4,55 +4,55 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="getdummyparameters" file="mult-aux.mkiv"> + <cd:command name="getdummyparameters" level="system" file="mult-aux.mkiv"> <cd:arguments> <cd:resolve name="assignment-userdata-list"/> </cd:arguments> </cd:command> - <cd:command name="dummyparameter" file="mult-aux.mkiv"> + <cd:command name="dummyparameter" level="system" file="mult-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-key"/> </cd:arguments> </cd:command> - <cd:command name="directdummyparameter" file="mult-aux.mkiv"> + <cd:command name="directdummyparameter" level="system" file="mult-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-key"/> </cd:arguments> </cd:command> - <cd:command name="setdummyparameter" file="mult-aux.mkiv"> + <cd:command name="setdummyparameter" level="system" file="mult-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-key"/> <cd:resolve name="argument-command"/> </cd:arguments> </cd:command> - <cd:command name="letdummyparameter" file="mult-aux.mkiv"> + <cd:command name="letdummyparameter" level="system" file="mult-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-key"/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="usedummystyleandcolor" file="mult-aux.mkiv"> + <cd:command name="usedummystyleandcolor" level="system" category="fonts colors" file="mult-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-key"/> <cd:resolve name="argument-key"/> </cd:arguments> </cd:command> - <cd:command name="usedummystyleparameter" file="mult-aux.mkiv"> + <cd:command name="usedummystyleparameter" level="system" category="fonts" file="mult-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-key"/> </cd:arguments> </cd:command> - <cd:command name="usedummycolorparameter" file="mult-aux.mkiv"> + <cd:command name="usedummycolorparameter" level="system" category="colors" file="mult-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-key"/> </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-effect.xml b/tex/context/interface/mkiv/i-effect.xml index f6fd3e042..d20a62cd4 100644 --- a/tex/context/interface/mkiv/i-effect.xml +++ b/tex/context/interface/mkiv/i-effect.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="defineeffect" file="attr-eff.mkiv"> + <cd:command name="defineeffect" level="style" category="pdf" file="attr-eff.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupeffect" file="attr-eff.mkiv"> + <cd:command name="setupeffect" level="style" category="pdf" file="attr-eff.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -40,19 +40,19 @@ </cd:arguments> </cd:command> - <cd:command name="effect" type="environment" file="attr-eff.mkiv"> + <cd:command name="effect" type="environment" level="document" category="pdf" file="attr-eff.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="effect" type="environment" generated="yes" variant="example" file="attr-eff.mkiv"> + <cd:command name="effect" type="environment" generated="yes" variant="example" level="document" category="pdf" file="attr-eff.mkiv"> <cd:sequence> <cd:variable value="effect"/> </cd:sequence> </cd:command> - <cd:command name="effect" file="attr-eff.mkiv"> + <cd:command name="effect" level="document" category="pdf" file="attr-eff.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:content/> diff --git a/tex/context/interface/mkiv/i-enumeration.xml b/tex/context/interface/mkiv/i-enumeration.xml index 70823cff3..149f4f613 100644 --- a/tex/context/interface/mkiv/i-enumeration.xml +++ b/tex/context/interface/mkiv/i-enumeration.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="defineenumeration" file="strc-enu.mkvi"> + <cd:command name="defineenumeration" level="style" category="structure" file="strc-enu.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupenumeration" file="strc-enu.mkvi"> + <cd:command name="setupenumeration" level="style" category="structure" file="strc-enu.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -130,6 +130,12 @@ <cd:constant type="none"/> <cd:constant type="cd:dimension"/> </cd:parameter> + <cd:parameter name="stretch"> + <cd:constant type="cd:number"/> + </cd:parameter> + <cd:parameter name="shrink"> + <cd:constant type="cd:number"/> + </cd:parameter> <cd:parameter name="hang"> <cd:constant type="fit"/> <cd:constant type="broad"/> @@ -148,6 +154,9 @@ <cd:constant type="no" default="yes"/> <cd:constant type="xml"/> </cd:parameter> + <cd:parameter name="referenceprefix"> + <cd:resolve name="value-referenceprefix"/> + </cd:parameter> <cd:parameter name="sample"> <cd:constant type="cd:text"/> </cd:parameter> @@ -172,20 +181,16 @@ </cd:arguments> </cd:command> - <!-- - - <cd:command name="setupenumerations" file="strc-enu.mkvi"> - <cd:arguments> - <cd:resolve name="keyword-name-list-optional"/> - <cd:assignments list="yes"> - <cd:inherit name="setupenumeration"/> - </cd:assignments> - </cd:arguments> - </cd:command> - - --> + <cd:command name="setupenumerations" level="style" category="structure" file="strc-enu.mkvi"> + <cd:arguments> + <cd:resolve name="keyword-name-list-optional"/> + <cd:assignments list="yes"> + <cd:inherit name="setupenumeration"/> + </cd:assignments> + </cd:arguments> + </cd:command> - <cd:command name="enumeration" type="environment" generated="yes" variant="example" file="strc-enu.mkvi"> + <cd:command name="enumeration" type="environment" generated="yes" variant="example" level="document" category="structure" file="strc-enu.mkvi"> <cd:sequence> <cd:variable value="enumeration"/> </cd:sequence> @@ -194,7 +199,7 @@ </cd:arguments> </cd:command> - <cd:command name="enumeration" type="environment" generated="yes" variant="example:title" file="strc-enu.mkvi"> + <cd:command name="enumeration" type="environment" generated="yes" variant="example:title" level="document" category="structure" file="strc-enu.mkvi"> <cd:sequence> <cd:variable value="enumeration"/> </cd:sequence> @@ -204,7 +209,7 @@ </cd:arguments> </cd:command> - <cd:command name="enumeration" generated="yes" variant="example" file="strc-enu.mkvi"> + <cd:command name="enumeration" generated="yes" variant="example" level="document" category="structure" file="strc-enu.mkvi"> <cd:sequence> <cd:variable value="enumeration"/> </cd:sequence> @@ -216,4 +221,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-export.xml b/tex/context/interface/mkiv/i-export.xml index 067649402..3c3afff2b 100644 --- a/tex/context/interface/mkiv/i-export.xml +++ b/tex/context/interface/mkiv/i-export.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="setelementexporttag" file="back-exp.mkiv"> + <cd:command name="setelementexporttag" level="system" category="xml" file="back-exp.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:keywords optional="yes"> @@ -20,7 +20,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupexport" file="back-exp.mkiv"> + <cd:command name="setupexport" level="style" category="xml" file="back-exp.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="align"> @@ -74,4 +74,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-field.xml b/tex/context/interface/mkiv/i-field.xml index 828ab204f..7a67786f9 100644 --- a/tex/context/interface/mkiv/i-field.xml +++ b/tex/context/interface/mkiv/i-field.xml @@ -4,13 +4,13 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="presetfieldsymbols" file="scrn-fld.mkvi"> + <cd:command name="presetfieldsymbols" level="system" category="pdf" file="scrn-fld.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list"/> </cd:arguments> </cd:command> - <cd:command name="definefieldcategory" file="scrn-fld.mkvi"> + <cd:command name="definefieldcategory" level="style" category="pdf" file="scrn-fld.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -20,7 +20,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupfieldcategory" file="scrn-fld.mkvi"> + <cd:command name="setupfieldcategory" level="style" category="pdf" file="scrn-fld.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -133,7 +133,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifelsefieldcategory" file="scrn-fld.mkvi"> + <cd:command name="doifelsefieldcategory" level="system" category="pdf conditional" file="scrn-fld.mkvi"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -141,7 +141,7 @@ </cd:arguments> </cd:command> - <cd:command name="doiffieldcategoryelse" file="scrn-fld.mkvi"> + <cd:command name="doiffieldcategoryelse" level="system" category="pdf conditional" file="scrn-fld.mkvi"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -149,7 +149,7 @@ </cd:arguments> </cd:command> - <cd:command name="definefieldbody" file="scrn-fld.mkvi"> + <cd:command name="definefieldbody" level="style" category="pdf" file="scrn-fld.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -159,7 +159,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupfieldbody" file="scrn-fld.mkvi"> + <cd:command name="setupfieldbody" level="style" category="pdf" file="scrn-fld.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -171,7 +171,7 @@ </cd:arguments> </cd:command> - <cd:command name="fieldbody" file="scrn-fld.mkvi"> + <cd:command name="fieldbody" level="document" category="pdf" file="scrn-fld.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes" optional="yes"> @@ -180,14 +180,14 @@ </cd:arguments> </cd:command> - <cd:command name="definefieldbodyset" file="scrn-fld.mkvi"> + <cd:command name="definefieldbodyset" level="style" category="pdf" file="scrn-fld.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-list"/> </cd:arguments> </cd:command> - <cd:command name="doifelsefieldbody" file="scrn-fld.mkvi"> + <cd:command name="doifelsefieldbody" level="system" category="pdf conditional" file="scrn-fld.mkvi"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -195,7 +195,7 @@ </cd:arguments> </cd:command> - <cd:command name="doiffieldbodyelse" file="scrn-fld.mkvi"> + <cd:command name="doiffieldbodyelse" level="system" category="pdf conditional" file="scrn-fld.mkvi"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -203,7 +203,7 @@ </cd:arguments> </cd:command> - <cd:command name="definefield" file="scrn-fld.mkvi"> + <cd:command name="definefield" level="style" category="pdf" file="scrn-fld.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:keywords> @@ -221,7 +221,7 @@ </cd:arguments> </cd:command> - <cd:command name="definesubfield" file="scrn-fld.mkvi"> + <cd:command name="definesubfield" level="style" category="pdf" file="scrn-fld.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name"/> @@ -229,7 +229,7 @@ </cd:arguments> </cd:command> - <cd:command name="clonefield" file="scrn-fld.mkvi"> + <cd:command name="clonefield" level="style" category="pdf" file="scrn-fld.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name"/> @@ -238,14 +238,14 @@ </cd:arguments> </cd:command> - <cd:command name="copyfield" file="scrn-fld.mkvi"> + <cd:command name="copyfield" level="style" category="pdf" file="scrn-fld.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="fitfieldframed" file="scrn-fld.mkvi"> + <cd:command name="fitfieldframed" level="document" category="pdf background rules" file="scrn-fld.mkvi"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupframed"/> @@ -254,7 +254,7 @@ </cd:arguments> </cd:command> - <cd:command name="fitfield" file="scrn-fld.mkvi"> + <cd:command name="fitfield" level="document" category="pdf" file="scrn-fld.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes" optional="yes"> @@ -263,7 +263,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupfieldlabelframed" file="scrn-fld.mkvi"> + <cd:command name="setupfieldlabelframed" level="style" category="pdf background" file="scrn-fld.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -272,7 +272,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupfieldcontentframed" file="scrn-fld.mkvi"> + <cd:command name="setupfieldcontentframed" level="style" category="pdf background" file="scrn-fld.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -282,7 +282,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupfieldtotalframed" file="scrn-fld.mkvi"> + <cd:command name="setupfieldtotalframed" level="style" category="pdf background" file="scrn-fld.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -310,7 +310,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupfield" file="scrn-fld.mkvi"> + <cd:command name="setupfield" level="style" category="pdf background" file="scrn-fld.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:keywords list="yes" optional="yes"> @@ -332,7 +332,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupfields" file="scrn-fld.mkvi"> + <cd:command name="setupfields" level="style" category="pdf background" file="scrn-fld.mkvi"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="reset"/> @@ -353,14 +353,14 @@ </cd:arguments> </cd:command> - <cd:command name="field" file="scrn-fld.mkvi"> + <cd:command name="field" level="document" category="pdf" file="scrn-fld.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-text-optional"/> </cd:arguments> </cd:command> - <cd:command name="definefieldstack" file="scrn-fld.mkvi"> + <cd:command name="definefieldstack" level="style" category="pdf" file="scrn-fld.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-list"/> @@ -370,7 +370,7 @@ </cd:arguments> </cd:command> - <cd:command name="fieldstack" file="scrn-fld.mkvi"> + <cd:command name="fieldstack" level="document" category="pdf" file="scrn-fld.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-list-optional"/> @@ -380,4 +380,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-figure.xml b/tex/context/interface/mkiv/i-figure.xml index 4b1439f41..6adf84d2e 100644 --- a/tex/context/interface/mkiv/i-figure.xml +++ b/tex/context/interface/mkiv/i-figure.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="figure" type="environment" file="grph-fig.mkiv"> + <cd:command name="figure" type="environment" level="document" category="graphics" file="grph-fig.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-file"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="referring" file="grph-fig.mkiv"> + <cd:command name="referring" level="document" category="graphics" file="grph-fig.mkiv"> <cd:arguments> <cd:position list="yes"/> <cd:position list="yes"/> @@ -22,7 +22,7 @@ </cd:arguments> </cd:command> - <cd:command name="marking" file="grph-fig.mkiv"> + <cd:command name="marking" level="document" category="graphics" file="grph-fig.mkiv"> <cd:arguments> <cd:position list="yes"/> <cd:position list="yes"/> @@ -30,7 +30,7 @@ </cd:arguments> </cd:command> - <cd:command name="remark" file="grph-fig.mkiv"> + <cd:command name="remark" level="document" category="graphics" file="grph-fig.mkiv"> <cd:arguments> <cd:position list="yes"/> <cd:position list="yes"/> @@ -41,7 +41,7 @@ </cd:arguments> </cd:command> - <cd:command name="colorbar" file="grph-fig.mkiv"> + <cd:command name="colorbar" level="document" category="colors" file="grph-fig.mkiv"> <cd:arguments> <cd:resolve name="keyword-color-list"/> </cd:arguments> diff --git a/tex/context/interface/mkiv/i-file.xml b/tex/context/interface/mkiv/i-file.xml index a5ed9daa3..df649e8e0 100644 --- a/tex/context/interface/mkiv/i-file.xml +++ b/tex/context/interface/mkiv/i-file.xml @@ -4,33 +4,33 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="input" file="file-ini.mkvi"> + <cd:command name="input" level="document" category="structure" file="file-ini.mkvi"> <cd:arguments> <cd:resolve name="argument-file"/> </cd:arguments> </cd:command> - <cd:command name="input" variant="string" file="file-ini.mkvi"> + <cd:command name="input" variant="string" level="document" category="structure" file="file-ini.mkvi"> <cd:arguments> <cd:resolve name="string-file"/> </cd:arguments> </cd:command> - <cd:command name="doiffile" file="file-ini.mkvi"> + <cd:command name="doiffile" level="system" category="structure conditional" file="file-ini.mkvi"> <cd:arguments> <cd:resolve name="argument-file"/> <cd:resolve name="argument-true"/> </cd:arguments> </cd:command> - <cd:command name="doifnotfile" file="file-ini.mkvi"> + <cd:command name="doifnotfile" level="system" category="structure conditional" file="file-ini.mkvi"> <cd:arguments> <cd:resolve name="argument-file"/> <cd:resolve name="argument-true"/> </cd:arguments> </cd:command> - <cd:command name="doifelsefile" file="file-ini.mkvi"> + <cd:command name="doifelsefile" level="system" category="structure conditional" file="file-ini.mkvi"> <cd:arguments> <cd:resolve name="argument-file"/> <cd:resolve name="argument-true"/> @@ -38,7 +38,7 @@ </cd:arguments> </cd:command> - <cd:command name="doiffileelse" file="file-ini.mkvi"> + <cd:command name="doiffileelse" level="system" category="structure conditional" file="file-ini.mkvi"> <cd:arguments> <cd:resolve name="argument-file"/> <cd:resolve name="argument-true"/> @@ -46,33 +46,33 @@ </cd:arguments> </cd:command> - <cd:command name="jobfilename" file="core-sys.mkiv"/> + <cd:command name="jobfilename" level="system" category="structure" file="core-sys.mkiv"/> - <cd:command name="jobfilesuffix" file="core-sys.mkiv"/> + <cd:command name="jobfilesuffix" level="system" category="structure" file="core-sys.mkiv"/> - <cd:command name="inputfilebarename" file="core-sys.mkiv"/> + <cd:command name="inputfilebarename" level="system" category="structure" file="core-sys.mkiv"/> - <cd:command name="inputfilerealsuffix" file="core-sys.mkiv"/> + <cd:command name="inputfilerealsuffix" level="system" category="structure" file="core-sys.mkiv"/> - <cd:command name="inputfilesuffix" file="core-sys.mkiv"/> + <cd:command name="inputfilesuffix" level="system" category="structure" file="core-sys.mkiv"/> - <cd:command name="inputfilename" file="core-sys.mkiv"/> + <cd:command name="inputfilename" level="system" category="structure" file="core-sys.mkiv"/> - <cd:command name="outputfilename" file="core-sys.mkiv"/> + <cd:command name="outputfilename" level="system" category="structure" file="core-sys.mkiv"/> - <cd:command name="readingfile" type="environment" file="file-ini.mkvi"/> + <cd:command name="readingfile" type="environment" level="system" category="structure" file="file-ini.mkvi"/> - <cd:command name="endofline" type="environment" begin="push" end="pop" file="file-ini.mkvi"/> + <cd:command name="endofline" type="environment" begin="push" end="pop" level="system" category="structure" file="file-ini.mkvi"/> - <cd:command name="restoreendofline" file="file-ini.mkvi"/> + <cd:command name="restoreendofline" level="system" category="structure" file="file-ini.mkvi"/> - <cd:command name="inputgivenfile" file="file-ini.mkvi"> + <cd:command name="inputgivenfile" level="system" category="structure" file="file-ini.mkvi"> <cd:arguments> <cd:resolve name="argument-file"/> </cd:arguments> </cd:command> - <cd:command name="doifelsepath" file="file-ini.mkvi"> + <cd:command name="doifelsepath" level="system" category="structure conditional" file="file-ini.mkvi"> <cd:arguments> <cd:resolve name="argument-path"/> <cd:resolve name="argument-true"/> @@ -80,7 +80,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifpathelse" file="file-ini.mkvi"> + <cd:command name="doifpathelse" level="system" category="structure conditional" file="file-ini.mkvi"> <cd:arguments> <cd:resolve name="argument-path"/> <cd:resolve name="argument-true"/> @@ -88,7 +88,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifelsefileexists" file="file-ini.mkvi"> + <cd:command name="doifelsefileexists" level="system" category="structure conditional" file="file-ini.mkvi"> <cd:arguments> <cd:resolve name="argument-file"/> <cd:resolve name="argument-true"/> @@ -96,7 +96,7 @@ </cd:arguments> </cd:command> - <cd:command name="doiffileexistselse" file="file-ini.mkvi"> + <cd:command name="doiffileexistselse" level="system" category="structure conditional" file="file-ini.mkvi"> <cd:arguments> <cd:resolve name="argument-file"/> <cd:resolve name="argument-true"/> @@ -104,7 +104,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifelsepathexists" file="file-ini.mkvi"> + <cd:command name="doifelsepathexists" level="system" category="structure conditional" file="file-ini.mkvi"> <cd:arguments> <cd:resolve name="argument-path"/> <cd:resolve name="argument-true"/> @@ -112,7 +112,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifpathexistselse" file="file-ini.mkvi"> + <cd:command name="doifpathexistselse" level="system" category="structure conditional" file="file-ini.mkvi"> <cd:arguments> <cd:resolve name="argument-path"/> <cd:resolve name="argument-true"/> @@ -120,7 +120,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifelseparentfile" file="file-ini.mkvi"> + <cd:command name="doifelseparentfile" level="system" category="structure conditional" file="file-ini.mkvi"> <cd:arguments> <cd:resolve name="argument-file"/> <cd:resolve name="argument-true"/> @@ -128,7 +128,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifparentfileelse" file="file-ini.mkvi"> + <cd:command name="doifparentfileelse" level="system" category="structure conditional" file="file-ini.mkvi"> <cd:arguments> <cd:resolve name="argument-file"/> <cd:resolve name="argument-true"/> @@ -136,27 +136,27 @@ </cd:arguments> </cd:command> - <cd:command name="splitfilename" file="file-ini.mkvi"> + <cd:command name="splitfilename" level="system" category="structure" file="file-ini.mkvi"> <cd:arguments> <cd:resolve name="argument-file"/> </cd:arguments> </cd:command> - <cd:command name="splitofffull" file="file-ini.mkvi"/> + <cd:command name="splitofffull" level="system" category="structure" file="file-ini.mkvi"/> - <cd:command name="splitoffpath" file="file-ini.mkvi"/> + <cd:command name="splitoffpath" level="system" category="structure" file="file-ini.mkvi"/> - <cd:command name="splitoffbase" file="file-ini.mkvi"/> + <cd:command name="splitoffbase" level="system" category="structure" file="file-ini.mkvi"/> - <cd:command name="splitoffname" file="file-ini.mkvi"/> + <cd:command name="splitoffname" level="system" category="structure" file="file-ini.mkvi"/> - <cd:command name="splitofftype" file="file-ini.mkvi"/> + <cd:command name="splitofftype" level="system" category="structure" file="file-ini.mkvi"/> - <cd:command name="splitoffkind" file="file-ini.mkvi"/> + <cd:command name="splitoffkind" level="system" category="structure" file="file-ini.mkvi"/> - <cd:command name="splitoffroot" file="file-ini.mkvi"/> + <cd:command name="splitoffroot" level="system" category="structure" file="file-ini.mkvi"/> - <cd:command name="doifelseinputfile" file="file-job.mkvi"> + <cd:command name="doifelseinputfile" level="system" category="structure conditional" file="file-job.mkvi"> <cd:arguments> <cd:resolve name="argument-file"/> <cd:resolve name="argument-true"/> @@ -164,7 +164,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifinputfileelse" file="file-job.mkvi"> + <cd:command name="doifinputfileelse" level="system" category="structure conditional" file="file-job.mkvi"> <cd:arguments> <cd:resolve name="argument-file"/> <cd:resolve name="argument-true"/> @@ -172,122 +172,128 @@ </cd:arguments> </cd:command> - <cd:command name="processfile" file="file-ini.mkvi"> + <cd:command name="processfile" level="system" category="structure" file="file-ini.mkvi"> <cd:arguments> <cd:resolve name="argument-file"/> </cd:arguments> </cd:command> - <cd:command name="usepath" file="file-job.mkvi"> + <cd:command name="usepath" level="style" category="structure" file="file-job.mkvi"> <cd:arguments> <cd:resolve name="keyword-path-list"/> </cd:arguments> </cd:command> - <cd:command name="usesubpath" file="file-job.mkvi"> + <cd:command name="usesubpath" level="style" category="structure" file="file-job.mkvi"> <cd:arguments> <cd:resolve name="keyword-path-list"/> </cd:arguments> </cd:command> - <cd:command name="path" type="environment" begin="push" end="pop" file="file-job.mkvi"> + <cd:command name="path" type="environment" begin="push" end="pop" level="system" category="structure" file="file-job.mkvi"> <cd:arguments> <cd:resolve name="keyword-path"/> </cd:arguments> </cd:command> - <cd:command name="resetpath" file="file-job.mkvi"/> + <cd:command name="resetpath" level="style" category="structure" file="file-job.mkvi"/> - <cd:command name="allinputpaths" file="file-job.mkvi"/> + <cd:command name="allinputpaths" level="system" category="structure" file="file-job.mkvi"/> - <cd:command name="locatefilepath" file="file-ini.mkvi"> + <cd:command name="locatefilepath" level="system" category="structure" file="file-ini.mkvi"> <cd:arguments> <cd:resolve name="argument-file"/> </cd:arguments> </cd:command> - <cd:command name="locatedfilepath" file="file-job.mkvi"/> + <cd:command name="locatedfilepath" level="system" category="structure" file="file-job.mkvi"/> - <cd:command name="usezipfile" file="file-job.mkvi"> + <cd:command name="usezipfile" level="style" category="structure" file="file-job.mkvi"> <cd:arguments> <cd:resolve name="keyword-file"/> <cd:resolve name="keyword-file-optional"/> </cd:arguments> </cd:command> - <cd:command name="processfilemany" file="file-job.mkvi"> + <cd:command name="processfilemany" level="system" category="structure" file="file-job.mkvi"> <cd:arguments> <cd:resolve name="argument-file"/> </cd:arguments> </cd:command> - <cd:command name="processfileonce" file="file-job.mkvi"> + <cd:command name="processfileonce" level="system" category="structure" file="file-job.mkvi"> <cd:arguments> <cd:resolve name="argument-file"/> </cd:arguments> </cd:command> - <cd:command name="processfilenone" file="file-job.mkvi"> + <cd:command name="processfilenone" level="system" category="structure" file="file-job.mkvi"> <cd:arguments> <cd:resolve name="argument-file"/> </cd:arguments> </cd:command> - <cd:command name="loadtexfile" file="file-job.mkvi"> + <cd:command name="loadtexfile" level="system" category="structure" file="file-job.mkvi"> <cd:arguments> <cd:resolve name="keyword-file"/> </cd:arguments> </cd:command> - <cd:command name="loadluafile" file="file-job.mkvi"> + <cd:command name="loadluafile" level="system" category="structure lua" file="file-job.mkvi"> <cd:arguments> <cd:resolve name="keyword-file"/> </cd:arguments> </cd:command> - <cd:command name="loadcldfile" file="file-job.mkvi"> + <cd:command name="loadcldfile" level="system" category="structure lua" file="file-job.mkvi"> <cd:arguments> <cd:resolve name="keyword-file"/> </cd:arguments> </cd:command> - <cd:command name="loadanyfile" file="file-job.mkvi"> + <cd:command name="loadanyfile" level="system" category="structure" file="file-job.mkvi"> <cd:arguments> <cd:resolve name="keyword-file"/> </cd:arguments> </cd:command> - <cd:command name="loadtexfileonce" file="file-job.mkvi"> + <cd:command name="loadtexfileonce" level="system" category="structure" file="file-job.mkvi"> <cd:arguments> <cd:resolve name="keyword-file"/> </cd:arguments> </cd:command> - <cd:command name="loadluafileonce" file="file-job.mkvi"> + <cd:command name="loadluafileonce" level="system" category="structure lua" file="file-job.mkvi"> <cd:arguments> <cd:resolve name="keyword-file"/> </cd:arguments> </cd:command> - <cd:command name="loadcldfileonce" file="file-job.mkvi"> + <cd:command name="loadcldfileonce" level="system" category="structure lua" file="file-job.mkvi"> <cd:arguments> <cd:resolve name="keyword-file"/> </cd:arguments> </cd:command> - <cd:command name="loadanyfileonce" file="file-job.mkvi"> + <cd:command name="loadanyfileonce" level="system" category="structure" file="file-job.mkvi"> <cd:arguments> <cd:resolve name="keyword-file"/> </cd:arguments> </cd:command> - <cd:command name="continueifinputfile" file="file-job.mkvi"> + <cd:command name="continueifinputfile" level="system" category="structure" file="file-job.mkvi"> <cd:arguments> <cd:resolve name="argument-file"/> </cd:arguments> </cd:command> - <cd:command name="readjobfile" file="file-res.mkvi"> + <cd:command name="samplefile" level="document" category="structure" file="file-job.mkvi"> + <cd:arguments> + <cd:resolve name="argument-file"/> + </cd:arguments> + </cd:command> + + <cd:command name="readjobfile" level="system" category="structure conditional" file="file-res.mkvi"> <cd:arguments> <cd:resolve name="argument-file"/> <cd:resolve name="argument-true"/> @@ -295,7 +301,7 @@ </cd:arguments> </cd:command> - <cd:command name="readlocfile" file="file-res.mkvi"> + <cd:command name="readlocfile" level="system" category="structure conditional" file="file-res.mkvi"> <cd:arguments> <cd:resolve name="argument-file"/> <cd:resolve name="argument-true"/> @@ -303,7 +309,7 @@ </cd:arguments> </cd:command> - <cd:command name="readsysfile" file="file-res.mkvi"> + <cd:command name="readsysfile" level="system" category="structure conditional" file="file-res.mkvi"> <cd:arguments> <cd:resolve name="argument-file"/> <cd:resolve name="argument-true"/> @@ -311,7 +317,7 @@ </cd:arguments> </cd:command> - <cd:command name="readfixfile" file="file-res.mkvi"> + <cd:command name="readfixfile" level="system" category="structure conditional" file="file-res.mkvi"> <cd:arguments> <cd:resolve name="argument-path"/> <cd:resolve name="argument-file"/> @@ -320,7 +326,7 @@ </cd:arguments> </cd:command> - <cd:command name="readsetfile" file="file-res.mkvi"> + <cd:command name="readsetfile" level="system" category="structure conditional" file="file-res.mkvi"> <cd:arguments> <cd:resolve name="argument-path"/> <cd:resolve name="argument-file"/> @@ -329,7 +335,7 @@ </cd:arguments> </cd:command> - <cd:command name="readfile" file="file-res.mkvi"> + <cd:command name="readfile" level="system" category="structure conditional" file="file-res.mkvi"> <cd:arguments> <cd:resolve name="argument-file"/> <cd:resolve name="argument-true"/> @@ -337,13 +343,13 @@ </cd:arguments> </cd:command> - <cd:command name="ReadFile" file="file-res.mkvi"> + <cd:command name="ReadFile" level="system" category="structure" file="file-res.mkvi"> <cd:arguments> <cd:resolve name="argument-file"/> </cd:arguments> </cd:command> - <cd:command name="readtexfile" file="file-res.mkvi"> + <cd:command name="readtexfile" level="system" category="structure conditional" file="file-res.mkvi"> <cd:arguments> <cd:resolve name="argument-file"/> <cd:resolve name="argument-true"/> @@ -351,7 +357,7 @@ </cd:arguments> </cd:command> - <cd:command name="readxmlfile" file="file-res.mkvi"> + <cd:command name="readxmlfile" level="system" category="structure conditional xml" file="file-res.mkvi"> <cd:arguments> <cd:resolve name="argument-file"/> <cd:resolve name="argument-true"/> @@ -359,7 +365,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifelselocfile" file="file-res.mkvi"> + <cd:command name="doifelselocfile" level="system" category="structure conditional" file="file-res.mkvi"> <cd:arguments> <cd:resolve name="argument-file"/> <cd:resolve name="argument-true"/> @@ -367,7 +373,7 @@ </cd:arguments> </cd:command> - <cd:command name="doiflocfileelse" file="file-res.mkvi"> + <cd:command name="doiflocfileelse" level="system" category="structure conditional" file="file-res.mkvi"> <cd:arguments> <cd:resolve name="argument-file"/> <cd:resolve name="argument-true"/> @@ -375,27 +381,27 @@ </cd:arguments> </cd:command> - <cd:command name="locfilename" file="file-res.mkvi"> + <cd:command name="locfilename" level="system" category="structure" file="file-res.mkvi"> <cd:arguments> <cd:resolve name="argument-file"/> </cd:arguments> </cd:command> - <cd:command name="definefilesynonym" file="file-sys.mkvi"> + <cd:command name="definefilesynonym" level="system" category="structure" file="file-sys.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-file"/> </cd:arguments> </cd:command> - <cd:command name="definefilefallback" file="file-sys.mkvi"> + <cd:command name="definefilefallback" level="system" category="structure" file="file-sys.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-file-list"/> </cd:arguments> </cd:command> - <cd:command name="truefilename" file="file-sys.mkvi"> + <cd:command name="truefilename" level="system" category="structure" file="file-sys.mkvi"> <cd:arguments> <cd:resolve name="argument-file"/> </cd:arguments> diff --git a/tex/context/interface/mkiv/i-filler.xml b/tex/context/interface/mkiv/i-filler.xml index 894780063..69cc37fca 100644 --- a/tex/context/interface/mkiv/i-filler.xml +++ b/tex/context/interface/mkiv/i-filler.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definefiller" file="spac-flr.mkiv"> + <cd:command name="definefiller" level="style" category="rules" file="spac-flr.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupfiller" file="spac-flr.mkiv"> + <cd:command name="setupfiller" level="style" category="rules" file="spac-flr.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -75,7 +75,7 @@ <!-- - <cd:command name="setupfillers" file="spac-flr.mkiv"> + <cd:command name="setupfillers" level="style" category="rules" file="spac-flr.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -86,7 +86,7 @@ --> - <cd:command name="filler" file="spac-flr.mkiv"> + <cd:command name="filler" level="style" category="rules" file="spac-flr.mkiv"> <cd:arguments> <cd:keywords> <cd:constant type="sym"/> @@ -99,7 +99,7 @@ </cd:arguments> </cd:command> - <cd:command name="checkedfiller" file="spac-flr.mkiv"> + <cd:command name="checkedfiller" level="style" category="rules" file="spac-flr.mkiv"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="sym"/> @@ -113,7 +113,7 @@ </cd:arguments> </cd:command> - <cd:command name="definelinefiller" file="node-rul.mkiv"> + <cd:command name="definelinefiller" level="style" category="rules metapost" file="node-rul.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -123,7 +123,7 @@ </cd:arguments> </cd:command> - <cd:command name="setuplinefiller" file="node-rul.mkiv"> + <cd:command name="setuplinefiller" level="style" category="rules metapost" file="node-rul.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -177,7 +177,7 @@ </cd:arguments> </cd:command> - <cd:command name="setuplinefillers" file="node-rul.mkiv"> + <cd:command name="setuplinefillers" level="style" category="rules metapost" file="node-rul.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -186,7 +186,7 @@ </cd:arguments> </cd:command> - <cd:command name="linefiller" type="environment" file="node-rul.mkiv"> + <cd:command name="linefiller" type="environment" level="style" category="rules metapost" file="node-rul.mkiv"> <cd:arguments> <cd:keywords> <cd:constant type="filler"/> @@ -198,7 +198,7 @@ </cd:arguments> </cd:command> - <cd:command name="setlinefiller" file="node-rul.mkiv"> + <cd:command name="setlinefiller" level="style" category="rules metapost" file="node-rul.mkiv"> <cd:arguments> <cd:keywords> <cd:constant type="filler"/> diff --git a/tex/context/interface/mkiv/i-fillinline.xml b/tex/context/interface/mkiv/i-fillinline.xml index dbf9f8627..eb2f9d6ae 100644 --- a/tex/context/interface/mkiv/i-fillinline.xml +++ b/tex/context/interface/mkiv/i-fillinline.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="setupfillinlines" file="pack-mrl.mkiv"> + <cd:command name="setupfillinlines" level="style" category="rules" file="pack-mrl.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="before"> @@ -32,7 +32,7 @@ </cd:arguments> </cd:command> - <cd:command name="fillinline" file="pack-mrl.mkiv"> + <cd:command name="fillinline" level="document" category="rules" file="pack-mrl.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:inherit name="setupfillinlines"/> @@ -40,4 +40,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-fillinrule.xml b/tex/context/interface/mkiv/i-fillinrule.xml index 949b8f6ea..d73b70ff9 100644 --- a/tex/context/interface/mkiv/i-fillinrule.xml +++ b/tex/context/interface/mkiv/i-fillinrule.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="setupfillinrules" file="pack-mrl.mkiv"> + <cd:command name="setupfillinrules" level="style" category="rules" file="pack-mrl.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="before"> @@ -43,7 +43,7 @@ </cd:arguments> </cd:command> - <cd:command name="fillinrules" file="pack-mrl.mkiv"> + <cd:command name="fillinrules" level="document" category="rules" file="pack-mrl.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupfillinrules"/> @@ -53,7 +53,7 @@ </cd:arguments> </cd:command> - <cd:command name="fillintext" file="pack-mrl.mkiv"> + <cd:command name="fillintext" level="document" category="rules" file="pack-mrl.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupfillinrules"/> @@ -63,4 +63,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-firstline.xml b/tex/context/interface/mkiv/i-firstline.xml index 59579a18c..b22035651 100644 --- a/tex/context/interface/mkiv/i-firstline.xml +++ b/tex/context/interface/mkiv/i-firstline.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definefirstline" file="typo-fln.mkiv"> + <cd:command name="definefirstline" level="style" category="fonts colors" file="typo-fln.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupfirstline" file="typo-fln.mkiv"> + <cd:command name="setupfirstline" level="style" category="fonts colors" file="typo-fln.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -36,17 +36,17 @@ </cd:arguments> </cd:command> - <cd:command name="setfirstline" file="typo-fln.mkiv"> + <cd:command name="setfirstline" level="document" category="fonts colors" file="typo-fln.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> </cd:arguments> </cd:command> - <cd:command name="applytofirstcharacter" file="typo-fln.mkiv"> + <cd:command name="applytofirstcharacter" level="system" category="fonts colors" file="typo-fln.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-fittingpage.xml b/tex/context/interface/mkiv/i-fittingpage.xml index 29816601f..8c2003568 100644 --- a/tex/context/interface/mkiv/i-fittingpage.xml +++ b/tex/context/interface/mkiv/i-fittingpage.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definefittingpage" file="page-app.mkiv"> + <cd:command name="definefittingpage" level="style" category="background layout" file="page-app.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupfittingpage" file="page-app.mkiv"> + <cd:command name="setupfittingpage" level="style" category="background layout" file="page-app.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -33,7 +33,7 @@ </cd:parameter> <cd:parameter name="paper"> <cd:constant type="auto"/> - <cd:constant type="defaut" default="yes"/> + <cd:constant type="default" default="yes"/> <cd:constant type="cd:name"/> </cd:parameter> <cd:inherit name="setupframed"/> @@ -41,7 +41,7 @@ </cd:arguments> </cd:command> - <cd:command name="fittingpage" type="environment" file="page-app.mkiv"> + <cd:command name="fittingpage" type="environment" level="document" category="background layout" file="page-app.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes" optional="yes"> @@ -50,9 +50,9 @@ </cd:arguments> </cd:command> - <cd:command name="fittingpage" type="environment" generated="yes" variant="example" file="page-app.mkiv"> + <cd:command name="fittingpage" type="environment" generated="yes" variant="instance" level="document" category="background layout" file="page-app.mkiv"> <cd:sequence> - <cd:variable value="fittingpage"/> + <cd:instance value="fittingpage"/> </cd:sequence> <cd:arguments> <cd:assignments list="yes" optional="yes"> @@ -60,36 +60,39 @@ </cd:assignments> </cd:arguments> <cd:instances> - <cd:constant value="TEXpage"/> - <cd:constant value="MPpage"/> + <cd:resolve name="instance-fittingpage"/> </cd:instances> </cd:command> - <cd:command name="TEXpage" type="environment" file="page-app.mkiv"> - <cd:arguments> - <cd:assignments list="yes" optional="yes"> - <cd:inherit name="setupfittingpage"/> - </cd:assignments> - </cd:arguments> - </cd:command> + <!-- - <cd:command name="setupTEXpage" file="page-app.mkiv"> - <cd:arguments> - <cd:assignments list="yes"> - <cd:inherit name="setupfittingpage"/> - </cd:assignments> - </cd:arguments> - </cd:command> + <cd:command name="TEXpage" type="environment" level="document" category="background layout" file="page-app.mkiv"> + <cd:arguments> + <cd:assignments list="yes" optional="yes"> + <cd:inherit name="setupfittingpage"/> + </cd:assignments> + </cd:arguments> + </cd:command> - <cd:command name="MPpage" type="environment" file="meta-fig.mkiv"> + <cd:command name="MPpage" type="environment" level="document" category="background layout metapost" file="meta-fig.mkiv"> + <cd:arguments> + <cd:assignments list="yes" optional="yes"> + <cd:inherit name="setupfittingpage"/> + </cd:assignments> + </cd:arguments> + </cd:command> + + --> + + <cd:command name="setupTEXpage" level="style" category="background layout" file="page-app.mkiv"> <cd:arguments> - <cd:assignments list="yes" optional="yes"> + <cd:assignments list="yes"> <cd:inherit name="setupfittingpage"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command name="setupMPpage" file="meta-fig.mkiv"> + <cd:command name="setupMPpage" level="style" category="background layout metapost" file="meta-fig.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:inherit name="setupfittingpage"/> diff --git a/tex/context/interface/mkiv/i-floats.xml b/tex/context/interface/mkiv/i-floats.xml index edc7f7f03..0ecb99c16 100644 --- a/tex/context/interface/mkiv/i-floats.xml +++ b/tex/context/interface/mkiv/i-floats.xml @@ -4,10 +4,13 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definefloat" file="strc-flt.mkvi"> + <cd:command name="definefloat" level="style" category="structure" file="strc-flt.mkvi"> <cd:arguments> <cd:resolve name="keyword-singular"/> - <cd:resolve name="keyword-plural-optional"/> + <cd:keywords optional="yes"> + <cd:constant type="cd:singular"/> + <cd:constant type="cd:plural"/> + </cd:keywords> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupfloat"/> </cd:assignments> @@ -17,7 +20,7 @@ </cd:instances> </cd:command> - <cd:command name="definefloat" variant="name" file="strc-flt.mkvi"> + <cd:command name="definefloat" variant="name" level="style" category="structure" file="strc-flt.mkvi"> <cd:arguments> <cd:resolve name="keyword-singular"/> <cd:resolve name="keyword-plural-optional"/> @@ -28,7 +31,7 @@ </cd:instances> </cd:command> - <cd:command name="setupfloat" file="strc-flt.mkvi"> + <cd:command name="setupfloat" level="style" category="structure" file="strc-flt.mkvi"> <cd:arguments> <cd:resolve name="keyword-singular-list-optional"/> <cd:assignments list="yes"> @@ -65,7 +68,7 @@ <cd:constant type="normal" default="yes"/> </cd:parameter> <cd:parameter name="grid"> - <cd:constant type="cd:string"/> + <cd:inherit name="snaptogrid"/> </cd:parameter> <!-- <cd:parameter name="topoffset"> @@ -121,6 +124,24 @@ <cd:parameter name="bottomafter"> <cd:constant type="cd:command"/> </cd:parameter> + <cd:parameter name="expansion"> + <cd:constant type="yes"/> + <cd:constant type="no" default="yes"/> + <cd:constant type="xml"/> + </cd:parameter> + <cd:parameter name="referenceprefix"> + <cd:resolve name="value-referenceprefix"/> + </cd:parameter> + <cd:parameter name="xmlsetup"> + <cd:constant type="cd:name"/> + </cd:parameter> + <cd:parameter name="catcodes"> + <cd:constant type="cd:name"/> + </cd:parameter> + <cd:parameter name="freeregion"> + <cd:constant type="yes" default="yes"/> + <cd:constant type="no"/> + </cd:parameter> <!-- begin root only --> <cd:parameter name="spacebefore"> <cd:constant type="none"/> @@ -149,6 +170,18 @@ <cd:constant type="none"/> <cd:inherit name="blank"/> </cd:parameter> + <cd:parameter name="spacebeforeside"> + <cd:constant type="none"/> + <cd:inherit name="blank"/> + </cd:parameter> + <cd:parameter name="spaceafterside"> + <cd:constant type="none"/> + <cd:inherit name="blank"/> + </cd:parameter> + <cd:parameter name="sidethreshold"> + <cd:constant type="old"/> + <cd:constant type="dimension" default="yes"/> <!-- value=".5\strutdp" --> + </cd:parameter> <cd:parameter name="margin"> <cd:constant type="cd:dimension"/> </cd:parameter> @@ -177,18 +210,18 @@ </cd:arguments> </cd:command> - <!-- + <cd:command name="setupfloats" level="style" category="structure" file="strc-flt.mkvi"> + <cd:arguments> + <cd:resolve name="keyword-singular-list-optional"/> + <cd:assignments list="yes"> + <cd:inherit name="setupfloat"/> + </cd:assignments> + </cd:arguments> + </cd:command> - <cd:command name="setupfloats" file="strc-flt.mkvi"> - <cd:arguments> - <cd:resolve name="keyword-singular-list-optional"/> - <cd:assignments list="yes"> - <cd:inherit name="setupfloat"/> - </cd:assignments> - </cd:arguments> - </cd:command> + <!-- - <cd:command name="definefloatcaption" file="strc-flt.mkvi"> + <cd:command name="definefloatcaption" level="style" category="structure" file="strc-flt.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -200,7 +233,7 @@ --> - <cd:command name="setupfloatcaption" file="strc-flt.mkvi"> + <cd:command name="setupfloatcaption" level="style" category="structure fonts counter" file="strc-flt.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -233,6 +266,8 @@ <cd:constant type="top"/> <cd:constant type="bottom" default="yes"/> <cd:constant type="stretch"/> + <cd:constant type="tolerant"/> + <cd:constant type="verytolerant"/> <cd:constant type="none"/> <cd:constant type="default"/> </cd:parameter> @@ -257,6 +292,10 @@ <cd:parameter name="distance"> <cd:constant type="cd:dimension"/> </cd:parameter> + <!-- headstyle headcolor headseparator --> + <cd:parameter name="headseparator"> + <cd:constant type="cd:text"/> + </cd:parameter> <cd:parameter name="inbetween"> <cd:constant type="cd:command"/> </cd:parameter> @@ -312,7 +351,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupcaption" file="strc-flt.mkvi"> + <cd:command name="setupcaption" level="style" category="structure fonts counter" file="strc-flt.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -321,26 +360,19 @@ </cd:arguments> </cd:command> - <!-- - - <cd:command name="setupcaptions" file="strc-flt.mkvi"> - <cd:arguments> - <cd:resolve name="keyword-name-list-optional"/> - <cd:assignments list="yes"> - <cd:inherit name="setupfloatcaption"/> - </cd:assignments> - </cd:arguments> - </cd:command> - - --> + <cd:command name="setupcaptions" level="style" category="structure fonts counter" file="strc-flt.mkvi"> + <cd:arguments> + <cd:resolve name="keyword-name-list-optional"/> + <cd:assignments list="yes"> + <cd:inherit name="setupfloatcaption"/> + </cd:assignments> + </cd:arguments> + </cd:command> - <cd:command name="placefloat" generated="yes" variant="instance" file="strc-flt.mkvi"> + <cd:command name="placefloat" generated="yes" variant="instance" level="document" category="structure" file="strc-flt.mkvi"> <cd:sequence> <cd:string value="place"/> <cd:instance value="float"/> -<!-- - <cd:variable value="float"/> ---> </cd:sequence> <cd:arguments> <cd:resolve name="keyword-floatlocation-list-optional"/> @@ -353,7 +385,7 @@ </cd:instances> </cd:command> - <cd:command name="placefloat" file="strc-flt.mkvi"> + <cd:command name="placefloat" level="document" category="structure" file="strc-flt.mkvi"> <cd:arguments> <cd:resolve name="keyword-singular"/> <cd:resolve name="keyword-floatlocation-list-optional"/> @@ -363,16 +395,7 @@ </cd:arguments> </cd:command> -<!-- - <cd:command name="placefloat" type="environment" file="strc-flt.mkvi"> - <cd:arguments> - <cd:resolve name="keyword-singular"/> - <cd:resolve name="assignment-floatdata-list-optional"/> - <cd:resolve name="assignment-userdata-list-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="placefloat" generated="yes" variant="instance" file="strc-flt.mkvi"> + <cd:command name="placefloat" type="environment" generated="yes" variant="instance" level="document" category="structure" file="strc-flt.mkvi"> <cd:sequence> <cd:string value="place"/> <cd:instance value="float"/> @@ -380,32 +403,23 @@ <cd:arguments> <cd:resolve name="assignment-floatdata-list-optional"/> <cd:resolve name="assignment-userdata-list-optional"/> - <cd:resolve name="argument-text"/> </cd:arguments> <cd:instances> <cd:resolve name="instance-float"/> </cd:instances> </cd:command> ---> - - <cd:command name="placefloat" type="environment" generated="yes" variant="instance" file="strc-flt.mkvi"> - <cd:sequence> - <cd:string value="place"/> - <cd:instance value="float"/> - </cd:sequence> + <cd:command name="placefloat" type="environment" level="document" category="structure" file="strc-flt.mkvi"> <cd:arguments> + <cd:resolve name="keyword-singular"/> <cd:resolve name="assignment-floatdata-list-optional"/> <cd:resolve name="assignment-userdata-list-optional"/> </cd:arguments> - <cd:instances> - <cd:resolve name="instance-float"/> - </cd:instances> </cd:command> - <cd:command name="floattext" type="environment" generated="yes" variant="example" file="strc-flt.mkvi"> + <cd:command name="floattext" type="environment" generated="yes" variant="instance" level="document" category="structure" file="strc-flt.mkvi"> <cd:sequence> - <cd:variable value="float"/> + <cd:instance value="float"/> <cd:string value="text"/> </cd:sequence> <cd:arguments> @@ -413,276 +427,286 @@ <cd:resolve name="keyword-reference-list-optional"/> <cd:resolve name="argument-text"/> </cd:arguments> + <cd:instances> + <cd:resolve name="instance-float"/> + </cd:instances> </cd:command> - <cd:command name="placelistoffloats" generated="yes" variant="example" file="strc-flt.mkvi"> + <cd:command name="placelistoffloats" generated="yes" variant="instance" level="document" category="structure" file="strc-flt.mkvi"> <cd:sequence> <cd:string value="placelistof"/> - <cd:variable value="floats"/> + <cd:instance value="floats"/> </cd:sequence> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setuplist"/> </cd:assignments> </cd:arguments> + <cd:instances> + <cd:resolve name="instance-floatlist"/> + </cd:instances> </cd:command> - <cd:command name="completelistoffloats" generated="yes" variant="example" file="strc-flt.mkvi"> + <cd:command name="completelistoffloats" generated="yes" variant="instance" level="document" category="structure" file="strc-flt.mkvi"> <cd:sequence> <cd:string value="completelistof"/> - <cd:variable value="floats"/> + <cd:instance value="floats"/> </cd:sequence> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setuplist"/> </cd:assignments> </cd:arguments> + <cd:instances> + <cd:resolve name="instance-floatlist"/> + </cd:instances> </cd:command> - <cd:command name="floatuserdataparameter" file="strc-flt.mkvi"> + <cd:command name="floatuserdataparameter" level="system" category="structure" file="strc-flt.mkvi"> <cd:arguments> <cd:resolve name="argument-key"/> </cd:arguments> </cd:command> - <cd:command name="doifelserightpagefloat" file="strc-flt.mkvi"> + <cd:command name="doifelserightpagefloat" level="system" category="structure conditional" file="strc-flt.mkvi"> <cd:arguments> <cd:resolve name="argument-true"/> <cd:resolve name="argument-false"/> </cd:arguments> </cd:command> - <cd:command name="doifrightpagefloatelse" file="strc-flt.mkvi"> + <cd:command name="doifrightpagefloatelse" level="system" category="structure conditional" file="strc-flt.mkvi"> <cd:arguments> <cd:resolve name="argument-true"/> <cd:resolve name="argument-false"/> </cd:arguments> </cd:command> - <cd:command name="doifelseoddpagefloat" file="strc-flt.mkvi"> + <cd:command name="doifelseoddpagefloat" level="system" category="structure conditional" file="strc-flt.mkvi"> <cd:arguments> <cd:resolve name="argument-true"/> <cd:resolve name="argument-false"/> </cd:arguments> </cd:command> - <cd:command name="doifoddpagefloatelse" file="strc-flt.mkvi"> + <cd:command name="doifoddpagefloatelse" level="system" category="structure conditional" file="strc-flt.mkvi"> <cd:arguments> <cd:resolve name="argument-true"/> <cd:resolve name="argument-false"/> </cd:arguments> </cd:command> - <cd:command name="doifelsemainfloatbody" file="strc-flt.mkvi"> + <cd:command name="doifelsemainfloatbody" level="system" category="structure conditional" file="strc-flt.mkvi"> <cd:arguments> <cd:resolve name="argument-true"/> <cd:resolve name="argument-false"/> </cd:arguments> </cd:command> - <cd:command name="doifmainfloatbodyelse" file="strc-flt.mkvi"> + <cd:command name="doifmainfloatbodyelse" level="system" category="structure conditional" file="strc-flt.mkvi"> <cd:arguments> <cd:resolve name="argument-true"/> <cd:resolve name="argument-false"/> </cd:arguments> </cd:command> -<!-- + <!-- - <cd:command file="strc-flt.mkvi" name="placefigure"> - <cd:arguments> - <cd:resolve name="keyword-floatlocation-list-optional"/> - <cd:resolve name="keyword-reference-list-optional"/> - <cd:resolve name="argument-text"/> - <cd:content/> - </cd:arguments> - </cd:command> + <cd:command name="placefigure" level="document" category="structure" file="strc-flt.mkvi"> + <cd:arguments> + <cd:resolve name="keyword-floatlocation-list-optional"/> + <cd:resolve name="keyword-reference-list-optional"/> + <cd:resolve name="argument-text"/> + <cd:content/> + </cd:arguments> + </cd:command> - <cd:command name="placefigure" type="environment" file="strc-flt.mkvi"> - <cd:arguments> - <cd:resolve name="assignment-floatdata-list-optional"/> - <cd:resolve name="assignment-userdata-list-optional"/> - </cd:arguments> - </cd:command> + <cd:command name="placefigure" type="environment" level="document" category="structure" file="strc-flt.mkvi"> + <cd:arguments> + <cd:resolve name="assignment-floatdata-list-optional"/> + <cd:resolve name="assignment-userdata-list-optional"/> + </cd:arguments> + </cd:command> - <cd:command name="figuretext" type="environment" file="strc-flt.mkvi"> - <cd:arguments> - <cd:resolve name="keyword-floatlocation-list-optional"/> - <cd:resolve name="keyword-reference-list-optional"/> - <cd:resolve name="argument-text"/> - </cd:arguments> - </cd:command> + <cd:command name="figuretext" type="environment" level="document" category="structure" file="strc-flt.mkvi"> + <cd:arguments> + <cd:resolve name="keyword-floatlocation-list-optional"/> + <cd:resolve name="keyword-reference-list-optional"/> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> - <cd:command name="placelistoffigures" file="strc-flt.mkvi"> - <cd:arguments> - <cd:assignments list="yes" optional="yes"> - <cd:inherit name="setuplist"/> - </cd:assignments> - </cd:arguments> - </cd:command> + <cd:command name="placelistoffigures" level="document" category="structure" file="strc-flt.mkvi"> + <cd:arguments> + <cd:assignments list="yes" optional="yes"> + <cd:inherit name="setuplist"/> + </cd:assignments> + </cd:arguments> + </cd:command> - <cd:command name="completelistoffigures" file="strc-flt.mkvi"> - <cd:arguments> - <cd:assignments list="yes" optional="yes"> - <cd:inherit name="setuplist"/> - </cd:assignments> - </cd:arguments> - </cd:command> + <cd:command name="completelistoffigures" level="document" category="structure" file="strc-flt.mkvi"> + <cd:arguments> + <cd:assignments list="yes" optional="yes"> + <cd:inherit name="setuplist"/> + </cd:assignments> + </cd:arguments> + </cd:command> - <cd:command name="placetable" file="strc-flt.mkvi"> - <cd:arguments> - <cd:resolve name="keyword-floatlocation-list-optional"/> - <cd:resolve name="keyword-reference-list-optional"/> - <cd:resolve name="argument-text"/> - <cd:content/> - </cd:arguments> - </cd:command> + <cd:command name="placetable" level="document" category="structure" file="strc-flt.mkvi"> + <cd:arguments> + <cd:resolve name="keyword-floatlocation-list-optional"/> + <cd:resolve name="keyword-reference-list-optional"/> + <cd:resolve name="argument-text"/> + <cd:content/> + </cd:arguments> + </cd:command> - <cd:command name="placetable" type="environment" file="strc-flt.mkvi"> - <cd:arguments> - <cd:resolve name="assignment-floatdata-list-optional"/> - <cd:resolve name="assignment-userdata-list-optional"/> - </cd:arguments> - </cd:command> + <cd:command name="placetable" type="environment" level="document" category="structure" file="strc-flt.mkvi"> + <cd:arguments> + <cd:resolve name="assignment-floatdata-list-optional"/> + <cd:resolve name="assignment-userdata-list-optional"/> + </cd:arguments> + </cd:command> - <cd:command name="tabletext" type="environment" file="strc-flt.mkvi"> - <cd:arguments> - <cd:resolve name="keyword-floatlocation-list-optional"/> - <cd:resolve name="keyword-reference-list-optional"/> - <cd:resolve name="argument-text"/> - </cd:arguments> - </cd:command> + <cd:command name="tabletext" type="environment" level="document" category="structure" file="strc-flt.mkvi"> + <cd:arguments> + <cd:resolve name="keyword-floatlocation-list-optional"/> + <cd:resolve name="keyword-reference-list-optional"/> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> - <cd:command name="placelistoftables" file="strc-flt.mkvi"> - <cd:arguments> - <cd:assignments list="yes" optional="yes"> - <cd:inherit name="setuplist"/> - </cd:assignments> - </cd:arguments> - </cd:command> + <cd:command name="placelistoftables" level="document" category="structure" file="strc-flt.mkvi"> + <cd:arguments> + <cd:assignments list="yes" optional="yes"> + <cd:inherit name="setuplist"/> + </cd:assignments> + </cd:arguments> + </cd:command> - <cd:command name="completelistoftables" file="strc-flt.mkvi"> - <cd:arguments> - <cd:assignments list="yes" optional="yes"> - <cd:inherit name="setuplist"/> - </cd:assignments> - </cd:arguments> - </cd:command> + <cd:command name="completelistoftables" level="document" category="structure" file="strc-flt.mkvi"> + <cd:arguments> + <cd:assignments list="yes" optional="yes"> + <cd:inherit name="setuplist"/> + </cd:assignments> + </cd:arguments> + </cd:command> - <cd:command name="placegraphic" file="strc-flt.mkvi"> - <cd:arguments> - <cd:resolve name="keyword-floatlocation-list-optional"/> - <cd:resolve name="keyword-reference-list-optional"/> - <cd:resolve name="argument-text"/> - <cd:content/> - </cd:arguments> - </cd:command> + <cd:command name="placegraphic" level="document" category="structure" file="strc-flt.mkvi"> + <cd:arguments> + <cd:resolve name="keyword-floatlocation-list-optional"/> + <cd:resolve name="keyword-reference-list-optional"/> + <cd:resolve name="argument-text"/> + <cd:content/> + </cd:arguments> + </cd:command> - <cd:command name="placegraphic" type="environment" file="strc-flt.mkvi"> - <cd:arguments> - <cd:resolve name="assignment-floatdata-list-optional"/> - <cd:resolve name="assignment-userdata-list-optional"/> - </cd:arguments> - </cd:command> + <cd:command name="placegraphic" type="environment" level="document" category="structure" file="strc-flt.mkvi"> + <cd:arguments> + <cd:resolve name="assignment-floatdata-list-optional"/> + <cd:resolve name="assignment-userdata-list-optional"/> + </cd:arguments> + </cd:command> - <cd:command name="graphictext" type="environment" file="strc-flt.mkvi"> - <cd:arguments> - <cd:resolve name="keyword-floatlocation-list-optional"/> - <cd:resolve name="keyword-reference-list-optional"/> - <cd:resolve name="argument-text"/> - </cd:arguments> - </cd:command> + <cd:command name="graphictext" type="environment" level="document" category="structure" file="strc-flt.mkvi"> + <cd:arguments> + <cd:resolve name="keyword-floatlocation-list-optional"/> + <cd:resolve name="keyword-reference-list-optional"/> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> - <cd:command name="placelistofgraphics" file="strc-flt.mkvi"> - <cd:arguments> - <cd:assignments list="yes" optional="yes"> - <cd:inherit name="setuplist"/> - </cd:assignments> - </cd:arguments> - </cd:command> + <cd:command name="placelistofgraphics" level="document" category="structure" file="strc-flt.mkvi"> + <cd:arguments> + <cd:assignments list="yes" optional="yes"> + <cd:inherit name="setuplist"/> + </cd:assignments> + </cd:arguments> + </cd:command> - <cd:command name="completelistofgraphics" file="strc-flt.mkvi"> - <cd:arguments> - <cd:assignments list="yes" optional="yes"> - <cd:inherit name="setuplist"/> - </cd:assignments> - </cd:arguments> - </cd:command> + <cd:command name="completelistofgraphics" level="document" category="structure" file="strc-flt.mkvi"> + <cd:arguments> + <cd:assignments list="yes" optional="yes"> + <cd:inherit name="setuplist"/> + </cd:assignments> + </cd:arguments> + </cd:command> - <cd:command name="placeintermezzo" file="strc-flt.mkvi"> - <cd:arguments> - <cd:resolve name="keyword-floatlocation-list-optional"/> - <cd:resolve name="keyword-reference-list-optional"/> - <cd:resolve name="argument-text"/> - <cd:content/> - </cd:arguments> - </cd:command> + <cd:command name="placeintermezzo" level="document" category="structure" file="strc-flt.mkvi"> + <cd:arguments> + <cd:resolve name="keyword-floatlocation-list-optional"/> + <cd:resolve name="keyword-reference-list-optional"/> + <cd:resolve name="argument-text"/> + <cd:content/> + </cd:arguments> + </cd:command> - <cd:command name="placeintermezzo" type="environment" file="strc-flt.mkvi"> - <cd:arguments> - <cd:resolve name="assignment-floatdata-list-optional"/> - <cd:resolve name="assignment-userdata-list-optional"/> - </cd:arguments> - </cd:command> + <cd:command name="placeintermezzo" type="environment" level="document" category="structure" file="strc-flt.mkvi"> + <cd:arguments> + <cd:resolve name="assignment-floatdata-list-optional"/> + <cd:resolve name="assignment-userdata-list-optional"/> + </cd:arguments> + </cd:command> - <cd:command name="intermezzotext" type="environment" file="strc-flt.mkvi"> - <cd:arguments> - <cd:resolve name="keyword-floatlocation-list-optional"/> - <cd:resolve name="keyword-reference-list-optional"/> - <cd:resolve name="argument-text"/> - </cd:arguments> - </cd:command> + <cd:command name="intermezzotext" type="environment" level="document" category="structure" file="strc-flt.mkvi"> + <cd:arguments> + <cd:resolve name="keyword-floatlocation-list-optional"/> + <cd:resolve name="keyword-reference-list-optional"/> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> - <cd:command name="placelistofintermezzi" file="strc-flt.mkvi"> - <cd:arguments> - <cd:assignments list="yes" optional="yes"> - <cd:inherit name="setuplist"/> - </cd:assignments> - </cd:arguments> - </cd:command> + <cd:command name="placelistofintermezzi" level="document" category="structure" file="strc-flt.mkvi"> + <cd:arguments> + <cd:assignments list="yes" optional="yes"> + <cd:inherit name="setuplist"/> + </cd:assignments> + </cd:arguments> + </cd:command> - <cd:command name="completelistofintermezzi" file="strc-flt.mkvi"> - <cd:arguments> - <cd:assignments list="yes" optional="yes"> - <cd:inherit name="setuplist"/> - </cd:assignments> - </cd:arguments> - </cd:command> + <cd:command name="completelistofintermezzi" level="document" category="structure" file="strc-flt.mkvi"> + <cd:arguments> + <cd:assignments list="yes" optional="yes"> + <cd:inherit name="setuplist"/> + </cd:assignments> + </cd:arguments> + </cd:command> - <cd:command name="placechemical" file="strc-flt.mkvi"> - <cd:arguments> - <cd:resolve name="keyword-floatlocation-list-optional"/> - <cd:resolve name="keyword-reference-list-optional"/> - <cd:resolve name="argument-text"/> - <cd:content/> - </cd:arguments> - </cd:command> + <cd:command name="placechemical" level="document" category="structure" file="strc-flt.mkvi"> + <cd:arguments> + <cd:resolve name="keyword-floatlocation-list-optional"/> + <cd:resolve name="keyword-reference-list-optional"/> + <cd:resolve name="argument-text"/> + <cd:content/> + </cd:arguments> + </cd:command> - <cd:command name="placechemical" type="environment" file="strc-flt.mkvi"> - <cd:arguments> - <cd:resolve name="assignment-floatdata-list-optional"/> - <cd:resolve name="assignment-userdata-list-optional"/> - </cd:arguments> - </cd:command> + <cd:command name="placechemical" type="environment" level="document" category="structure" file="strc-flt.mkvi"> + <cd:arguments> + <cd:resolve name="assignment-floatdata-list-optional"/> + <cd:resolve name="assignment-userdata-list-optional"/> + </cd:arguments> + </cd:command> - <cd:command name="placelistofchemicals" file="strc-flt.mkvi"> - <cd:arguments> - <cd:assignments list="yes" optional="yes"> - <cd:inherit name="setuplist"/> - </cd:assignments> - </cd:arguments> - </cd:command> + <cd:command name="placelistofchemicals" level="document" category="structure" file="strc-flt.mkvi"> + <cd:arguments> + <cd:assignments list="yes" optional="yes"> + <cd:inherit name="setuplist"/> + </cd:assignments> + </cd:arguments> + </cd:command> - <cd:command name="completelistofchemicals" file="strc-flt.mkvi"> - <cd:arguments> - <cd:assignments list="yes" optional="yes"> - <cd:inherit name="setuplist"/> - </cd:assignments> - </cd:arguments> - </cd:command> ---> + <cd:command name="completelistofchemicals" level="document" category="structure" file="strc-flt.mkvi"> + <cd:arguments> + <cd:assignments list="yes" optional="yes"> + <cd:inherit name="setuplist"/> + </cd:assignments> + </cd:arguments> + </cd:command> + + --> - <cd:command name="setuplocalfloats" file="strc-flt.mkvi"> + <cd:command name="setuplocalfloats" level="style" category="structure" file="strc-flt.mkvi"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="before"> @@ -698,25 +722,25 @@ </cd:arguments> </cd:command> - <cd:command name="noflocalfloats" file="strc-flt.mkvi"/> + <cd:command name="noflocalfloats" level="system" category="structure" file="strc-flt.mkvi"/> - <cd:command name="resetlocalfloats" file="strc-flt.mkvi"/> + <cd:command name="resetlocalfloats" level="system" category="structure" file="strc-flt.mkvi"/> - <cd:command name="somelocalfloat" file="strc-flt.mkvi"/> + <cd:command name="somelocalfloat" level="system" category="structure" file="strc-flt.mkvi"/> - <cd:command name="getlocalfloats" file="strc-flt.mkvi"/> + <cd:command name="getlocalfloats" level="system" category="structure" file="strc-flt.mkvi"/> - <cd:command name="flushlocalfloats" file="strc-flt.mkvi"/> + <cd:command name="flushlocalfloats" level="system" category="structure" file="strc-flt.mkvi"/> - <cd:command name="getlocalfloat" file="strc-flt.mkvi"> + <cd:command name="getlocalfloat" level="system" category="structure" file="strc-flt.mkvi"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="forcelocalfloats" file="strc-flt.mkvi"/> + <cd:command name="forcelocalfloats" level="system" category="structure" file="strc-flt.mkvi"/> - <cd:command name="setupfloatsplitting" file="tabl-tsp.mkiv"> + <cd:command name="setupfloatsplitting" level="style" category="structure counter" file="tabl-tsp.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="before"> @@ -739,7 +763,7 @@ </cd:arguments> </cd:command> - <cd:command name="splitfloat" file="tabl-tsp.mkiv"> + <cd:command name="splitfloat" level="system" category="structure" file="tabl-tsp.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupfloatsplitting"/> @@ -749,20 +773,20 @@ </cd:arguments> </cd:command> - <cd:command name="doifnotinsidesplitfloat" file="tabl-tsp.mkiv"> + <cd:command name="doifnotinsidesplitfloat" level="system" category="structure conditional" file="tabl-tsp.mkiv"> <cd:arguments> <cd:resolve name="argument-true"/> </cd:arguments> </cd:command> - <cd:command name="placenamedfloat" file="page-flt.mkiv"> + <cd:command name="placenamedfloat" level="document" category="structure" file="page-flt.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-reference"/> </cd:arguments> </cd:command> - <cd:command name="placefloatwithsetups" file="page-flt.mkiv"> + <cd:command name="placefloatwithsetups" level="document" category="structure" file="page-flt.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-floatlocation-list-optional"/> diff --git a/tex/context/interface/mkiv/i-fontfamily.xml b/tex/context/interface/mkiv/i-fontfamily.xml index 2cf2fb403..e20346319 100644 --- a/tex/context/interface/mkiv/i-fontfamily.xml +++ b/tex/context/interface/mkiv/i-fontfamily.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definefontfamily" file="font-sel.mkvi"> + <cd:command name="definefontfamily" level="style" category="fonts" file="font-sel.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:keywords> @@ -68,7 +68,7 @@ </cd:arguments> </cd:command> - <cd:command name="definefontfamily" variant="preset" file="font-sel.mkvi"> + <cd:command name="definefontfamily" variant="preset" level="style" category="fonts" file="font-sel.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:keywords> @@ -97,7 +97,7 @@ </cd:arguments> </cd:command> - <cd:command name="definefallbackfamily" file="font-sel.mkvi"> + <cd:command name="definefallbackfamily" level="style" category="fonts" file="font-sel.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:keywords> @@ -177,7 +177,7 @@ </cd:arguments> </cd:command> - <cd:command name="definefallbackfamily" variant="preset" file="font-sel.mkvi"> + <cd:command name="definefallbackfamily" variant="preset" level="style" category="fonts" file="font-sel.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:keywords> @@ -206,7 +206,7 @@ </cd:arguments> </cd:command> - <cd:command name="definefontfamilypreset" file="font-sel.mkvi"> + <cd:command name="definefontfamilypreset" level="system" category="fonts" file="font-sel.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes"> @@ -215,11 +215,11 @@ </cd:arguments> </cd:command> - <cd:command name="definefontfamilypreset" variant="name" file="font-sel.mkvi"> + <cd:command name="definefontfamilypreset" variant="name" level="system" category="fonts" file="font-sel.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-fonts.xml b/tex/context/interface/mkiv/i-fonts.xml index c246905f0..1e6e169a4 100644 --- a/tex/context/interface/mkiv/i-fonts.xml +++ b/tex/context/interface/mkiv/i-fonts.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definefontfallback" file="font-col.mkvi"> + <cd:command name="definefontfallback" level="style" category="fonts" file="font-col.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:keywords> @@ -31,66 +31,82 @@ <cd:constant type="cd:number"/> <cd:constant type="cd:name"/> </cd:parameter> + <cd:parameter name="features"> + <cd:constant type="cd:name"/> + </cd:parameter> + <cd:parameter name="factor"> + <cd:constant type="cd:number"/> + </cd:parameter> </cd:assignments> </cd:arguments> </cd:command> - <cd:command name="resetfontfallback" file="font-col.mkvi"> + <cd:command name="resetfontfallback" level="style" category="fonts" file="font-col.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-font-optional"/> </cd:arguments> </cd:command> - <cd:command name="emphasistypeface" file="font-emp.mkvi"/> + <cd:command name="emphasistypeface" level="document" category="fonts" file="font-emp.mkvi"/> + + <cd:command name="emphasisboldface" level="document" category="fonts" file="font-emp.mkvi"/> + + <cd:command name="normalboldface" level="document" category="fonts" file="font-emp.mkvi"/> + + <cd:command name="normalitalicface" level="document" category="fonts" file="font-emp.mkvi"/> + + <cd:command name="normalslantedface" level="document" category="fonts" file="font-emp.mkvi"/> + + <cd:command name="normaltypeface" level="document" category="fonts" file="font-emp.mkvi"/> - <cd:command name="emphasisboldface" file="font-emp.mkvi"/> + <cd:command name="swaptypeface" level="document" category="fonts" file="font-emp.mkvi"/> - <cd:command name="normalboldface" file="font-emp.mkvi"/> + <cd:command name="typeface" level="document" category="fonts" file="font-emp.mkvi"/> - <cd:command name="normaltypeface" file="font-emp.mkvi"/> + <cd:command name="boldface" level="document" category="fonts" file="font-emp.mkvi"/> - <cd:command name="swaptypeface" file="font-emp.mkvi"/> + <cd:command name="italicface" level="document" category="fonts" file="font-emp.mkvi"/> - <cd:command name="typeface" file="font-emp.mkvi"/> + <cd:command name="slantedface" level="document" category="fonts" file="font-emp.mkvi"/> - <cd:command name="boldface" file="font-emp.mkvi"/> + <cd:command name="swapface" level="document" category="fonts" file="font-emp.mkvi"/> - <cd:command name="swapface" file="font-emp.mkvi"/> + <cd:command name="em" level="document" category="fonts" file="font-emp.mkvi"/> <!-- - <cd:command name="emphbf" file="font-emp.mkvi"> + <cd:command name="emphbf" level="document" category="fonts" file="font-emp.mkvi"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="emphit" file="font-emp.mkvi"> + <cd:command name="emphit" level="document" category="fonts" file="font-emp.mkvi"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="emphsl" file="font-emp.mkvi"> + <cd:command name="emphsl" level="document" category="fonts" file="font-emp.mkvi"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="emphtf" file="font-emp.mkvi"> + <cd:command name="emphtf" level="document" category="fonts" file="font-emp.mkvi"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="emph" file="font-emp.mkvi"> + <cd:command name="emph" level="document" category="fonts" file="font-emp.mkvi"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="emphasized" file="font-emp.mkvi"> + <cd:command name="emphasized" level="document" category="fonts" file="font-emp.mkvi"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> @@ -98,7 +114,7 @@ --> - <cd:command name="definefontfeature" file="font-fea.mkvi"> + <cd:command name="definefontfeature" level="style" category="fonts" file="font-fea.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -190,6 +206,10 @@ <cd:parameter name="boundingbox"> <cd:constant type="yes"/> <cd:constant type="no"/> + <cd:constant type="background"/> + <cd:constant type="frame"/> + <cd:constant type="empty"/> + <cd:constant type="cd:color"/> </cd:parameter> <cd:parameter name="compose"> <cd:constant type="yes"/> @@ -270,11 +290,15 @@ <cd:parameter name="mathnolimitsmode"> <cd:constant type="cd:number"/> </cd:parameter> + <cd:parameter name="blockligatures"> + <cd:constant type="yes"/> + <cd:constant type="no" default="yes"/> + </cd:parameter> </cd:assignments> </cd:arguments> </cd:command> - <cd:command name="adaptfontfeature" file="font-fea.mkvi"> + <cd:command name="adaptfontfeature" level="style" category="fonts" file="font-fea.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <!-- pattern --> <cd:assignments list="yes"> @@ -283,72 +307,72 @@ </cd:arguments> </cd:command> - <cd:command name="fontfeaturelist" file="font-fea.mkvi"> + <cd:command name="fontfeaturelist" level="document" category="fonts" file="font-fea.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-text"/> </cd:arguments> </cd:command> - <cd:command name="addfeature" file="font-fea.mkvi"> + <cd:command name="addfeature" category="fonts" level="style" file="font-fea.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="addfeature" variant="direct" file="font-fea.mkvi"> + <cd:command name="addfeature" variant="direct" level="style" category="fonts" file="font-fea.mkvi"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="subtractfeature" file="font-fea.mkvi"> + <cd:command name="subtractfeature" level="style" category="fonts" file="font-fea.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="subtractfeature" variant="direct" file="font-fea.mkvi"> + <cd:command name="subtractfeature" variant="direct" clevel="style" ategory="fonts" file="font-fea.mkvi"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="replacefeature" file="font-fea.mkvi"> + <cd:command name="replacefeature" level="style" category="fonts" file="font-fea.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="replacefeature" variant="direct" file="font-fea.mkvi"> + <cd:command name="replacefeature" variant="direct" level="style" category="fonts" file="font-fea.mkvi"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="resetandaddfeature" file="font-fea.mkvi"> + <cd:command name="resetandaddfeature" level="style" category="fonts" file="font-fea.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="resetandaddfeature" variant="direct" file="font-fea.mkvi"> + <cd:command name="resetandaddfeature" variant="direct" level="style" category="fonts" file="font-fea.mkvi"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="resetfeature" file="font-fea.mkvi"/> + <cd:command name="resetfeature" level="style" category="fonts" file="font-fea.mkvi"/> - <cd:command name="revivefeature" file="font-fea.mkvi"/> + <cd:command name="revivefeature" level="style" category="fonts" file="font-fea.mkvi"/> - <cd:command name="setfontfeature" file="font-fea.mkvi"> + <cd:command name="setfontfeature" level="style" category="fonts" file="font-fea.mkvi"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="feature" file="font-fea.mkvi"> + <cd:command name="feature" level="document" category="fonts" file="font-fea.mkvi"> <cd:arguments> <cd:keywords> <cd:constant type="+"/> @@ -365,11 +389,11 @@ <cd:constant type="old"/> <cd:constant type="local"/> </cd:keywords> - <cd:resolve name="keyword-name"/> + <cd:resolve name="keyword-name-list"/> </cd:arguments> </cd:command> - <cd:command name="feature" variant="direct" file="font-fea.mkvi"> + <cd:command name="feature" variant="direct" level="document" category="fonts" file="font-fea.mkvi"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="+"/> @@ -386,11 +410,11 @@ <cd:constant type="old"/> <cd:constant type="local"/> </cd:keywords> - <cd:resolve name="argument-name"/> + <cd:resolve name="argument-name-list"/> </cd:arguments> </cd:command> - <cd:command name="doifelsecurrentfonthasfeature" file="font-fea.mkvi"> + <cd:command name="doifelsecurrentfonthasfeature" level="system" category="fonts conditional" file="font-fea.mkvi"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -398,7 +422,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifcurrentfonthasfeatureelse" file="font-fea.mkvi"> + <cd:command name="doifcurrentfonthasfeatureelse" level="system" category="fonts conditional" file="font-fea.mkvi"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -406,31 +430,31 @@ </cd:arguments> </cd:command> - <cd:command name="doaddfeature" file="font-fea.mkvi"> + <cd:command name="doaddfeature" level="system" category="fonts" file="font-fea.mkvi"> <cd:arguments> - <cd:resolve name="argument-name"/> + <cd:resolve name="argument-name-list"/> </cd:arguments> </cd:command> - <cd:command name="dosubtractfeature" file="font-fea.mkvi"> + <cd:command name="dosubtractfeature" level="system" category="fonts" file="font-fea.mkvi"> <cd:arguments> - <cd:resolve name="argument-name"/> + <cd:resolve name="argument-name-list"/> </cd:arguments> </cd:command> - <cd:command name="doreplacefeature" file="font-fea.mkvi"> + <cd:command name="doreplacefeature" level="system" category="fonts" file="font-fea.mkvi"> <cd:arguments> - <cd:resolve name="argument-name"/> + <cd:resolve name="argument-name-list"/> </cd:arguments> </cd:command> - <cd:command name="doresetandafffeature" file="font-fea.mkvi"> + <cd:command name="doresetandafffeature" level="system" category="fonts" file="font-fea.mkvi"> <cd:arguments> - <cd:resolve name="argument-name"/> + <cd:resolve name="argument-name-list"/> </cd:arguments> </cd:command> - <cd:command name="fontclass" type="environment" file="font-fil.mkvi"> + <cd:command name="fontclass" type="environment" level="system" category="fonts" file="font-fil.mkvi"> <cd:arguments> <cd:keywords> <cd:constant type="each"/> @@ -439,14 +463,14 @@ </cd:arguments> </cd:command> - <cd:command name="classfont" file="font-fil.mkvi"> + <cd:command name="classfont" level="system" category="fonts" file="font-fil.mkvi"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-font"/> </cd:arguments> </cd:command> - <cd:command name="definefontsynonym" file="font-fil.mkvi"> + <cd:command name="definefontsynonym" level="style" category="fonts" file="font-fil.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-font"/> @@ -468,7 +492,7 @@ </cd:arguments> </cd:command> - <cd:command name="definefontfile" file="font-fil.mkvi"> + <cd:command name="definefontfile" level="system" category="fonts" file="font-fil.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-file"/> @@ -490,20 +514,20 @@ </cd:arguments> </cd:command> - <cd:command name="truefontname" file="font-fil.mkvi"> + <cd:command name="truefontname" level="system" category="fonts" file="font-fil.mkvi"> <cd:arguments> <cd:resolve name="argument-font"/> </cd:arguments> </cd:command> - <cd:command name="expandfontsynonym" file="font-fil.mkvi"> + <cd:command name="expandfontsynonym" level="system" category="fonts" file="font-fil.mkvi"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="doifelsefontsynonym" file="font-fil.mkvi"> + <cd:command name="doifelsefontsynonym" level="system" category="fonts conditional" file="font-fil.mkvi"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -511,7 +535,7 @@ </cd:arguments> </cd:command> - <cd:command name="doiffontsynonymelse" file="font-fil.mkvi"> + <cd:command name="doiffontsynonymelse" level="system" category="fonts conditional" file="font-fil.mkvi"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -519,87 +543,87 @@ </cd:arguments> </cd:command> - <cd:command name="tracedfontname" file="font-fil.mkvi"> + <cd:command name="tracedfontname" level="system" category="fonts" file="font-fil.mkvi"> <cd:arguments> <cd:resolve name="argument-font"/> </cd:arguments> </cd:command> - <cd:command name="fontclassname" file="font-fil.mkvi"> + <cd:command name="fontclassname" level="system" category="fonts" file="font-fil.mkvi"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-font"/> </cd:arguments> </cd:command> - <cd:command name="loadfontgoodies" file="font-gds.mkvi"> + <cd:command name="loadfontgoodies" level="style" category="fonts" file="font-gds.mkvi"> <cd:arguments> <cd:resolve name="keyword-file"/> </cd:arguments> </cd:command> - <cd:command name="setfontcolorsheme" file="font-gds.mkvi"> + <cd:command name="setfontcolorsheme" level="style" category="fonts" file="font-gds.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="resetfontcolorsheme" file="font-gds.mkvi"/> + <cd:command name="resetfontcolorsheme" level="style" category="fonts" file="font-gds.mkvi"/> - <cd:command name="definedfont" file="font-ini.mkvi"> + <cd:command name="definedfont" level="style" category="fonts" file="font-ini.mkvi"> <cd:arguments> <cd:resolve name="keyword-font-optional"/> </cd:arguments> </cd:command> - <cd:command name="font" type="environment" file="font-ini.mkvi"> + <cd:command name="font" type="environment" level="document" category="fonts" file="font-ini.mkvi"> <cd:arguments> <cd:resolve name="keyword-font-optional"/> </cd:arguments> </cd:command> - <cd:command name="bodyfontsize" file="font-ini.mkvi"/> + <cd:command name="bodyfontsize" level="system" category="fonts" file="font-ini.mkvi"/> - <cd:command name="normalizebodyfontsize" file="font-ini.mkvi"> + <cd:command name="normalizebodyfontsize" level="system" category="fonts" file="font-ini.mkvi"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-dimension"/> </cd:arguments> </cd:command> - <cd:command name="thenormalizedbodyfontsize" file="font-ini.mkvi"> + <cd:command name="thenormalizedbodyfontsize" level="system" category="fonts" file="font-ini.mkvi"> <cd:arguments> <cd:resolve name="argument-dimension"/> </cd:arguments> </cd:command> - <cd:command name="mapfontsize" file="font-fil.mkvi"> + <cd:command name="mapfontsize" level="system" category="fonts" file="font-fil.mkvi"> <cd:arguments> <cd:resolve name="keyword-dimension"/> <cd:resolve name="keyword-dimension"/> </cd:arguments> </cd:command> - <cd:command name="definefontstyle" file="font-ini.mkvi"> + <cd:command name="definefontstyle" level="system" category="fonts" file="font-ini.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list"/> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="definefontsize" file="font-ini.mkvi"> + <cd:command name="definefontsize" level="system" category="fonts" file="font-ini.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="definefontalternative" file="font-ini.mkvi"> + <cd:command name="definefontalternative" level="system" category="fonts" file="font-ini.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="definefont" file="font-ini.mkvi"> + <cd:command name="definefont" level="style" category="fonts" file="font-ini.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-font"/> @@ -609,7 +633,7 @@ </cd:arguments> </cd:command> - <cd:command name="definefont" variant="argument" file="font-ini.mkvi"> + <cd:command name="definefont" variant="argument" level="style" category="fonts" file="font-ini.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-font"/> @@ -617,14 +641,14 @@ </cd:arguments> </cd:command> - <cd:command name="definefrozenfont" file="font-ini.mkvi"> + <cd:command name="definefrozenfont" level="system" category="fonts" file="font-ini.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-font"/> </cd:arguments> </cd:command> - <cd:command name="definebodyfontenvironment" file="font-ini.mkvi"> + <cd:command name="definebodyfontenvironment" level="style" category="fonts" file="font-ini.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:keywords> @@ -693,7 +717,7 @@ <!-- - <cd:command name="setupbodyfontenvironment" file="font-ini.mkvi"> + <cd:command name="setupbodyfontenvironment" level="style" category="fonts" file="font-ini.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:keywords> @@ -708,31 +732,31 @@ --> - <cd:command name="processbodyfontenvironmentlist" file="font-fil.mkvi"> + <cd:command name="processbodyfontenvironmentlist" level="system" category="fonts" file="font-fil.mkvi"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="bodyfontenvironmentlist" file="font-fil.mkvi"/> + <cd:command name="bodyfontenvironmentlist" level="system" category="fonts" file="font-fil.mkvi"/> - <cd:command name="registerfontclass" file="font-fil.mkvi"> + <cd:command name="registerfontclass" level="system" category="fonts" file="font-fil.mkvi"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="setcurrentfontclass" file="font-fil.mkvi"> + <cd:command name="setcurrentfontclass" level="system" category="fonts" file="font-fil.mkvi"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="tx" file="font-ini.mkvi"/> + <cd:command name="tx" level="document" category="fonts" file="font-ini.mkvi"/> - <cd:command name="txx" file="font-ini.mkvi"/> + <cd:command name="txx" level="document" category="fonts" file="font-ini.mkvi"/> - <cd:command name="definebodyfont" file="font-fil.mkvi"> + <cd:command name="definebodyfont" level="style" category="fonts" file="font-fil.mkvi"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -793,7 +817,7 @@ </cd:arguments> </cd:command> - <cd:command name="definebodyfont" variant="argument" file="font-fil.mkvi"> + <cd:command name="definebodyfont" variant="argument" level="style" category="fonts" file="font-fil.mkvi"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -814,7 +838,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupfonts" file="font-ini.mkiv"> + <cd:command name="setupfonts" level="style" category="fonts" file="font-ini.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="language"> @@ -825,7 +849,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupbodyfont" file="font-ini.mkiv"> + <cd:command name="setupbodyfont" level="style" category="fonts" file="font-ini.mkiv"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:dimension"/> @@ -858,7 +882,7 @@ </cd:arguments> </cd:command> - <cd:command name="switchtobodyfont" file="font-ini.mkvi"> + <cd:command name="switchtobodyfont" level="style" category="fonts" file="font-ini.mkvi"> <cd:arguments> <cd:keywords list="yes"> <cd:inherit name="setupbodyfont"/> @@ -866,7 +890,7 @@ </cd:arguments> </cd:command> - <cd:command name="fastswitchtobodyfont" file="font-ini.mkiv"> + <cd:command name="fastswitchtobodyfont" level="system" category="fonts" file="font-ini.mkiv"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="x"/> @@ -879,7 +903,7 @@ </cd:arguments> </cd:command> - <cd:command name="usebodyfont" file="font-ini.mkvi"> + <cd:command name="usebodyfont" level="style" category="fonts" file="font-ini.mkvi"> <cd:arguments> <cd:keywords list="yes"> <cd:inherit name="setupbodyfont"/> @@ -887,31 +911,31 @@ </cd:arguments> </cd:command> - <cd:command name="usebodyfontparameter" file="font-ini.mkvi"> + <cd:command name="usebodyfontparameter" level="system" category="fonts" file="font-ini.mkvi"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="fontchar" file="font-ini.mkvi"> + <cd:command name="fontchar" level="style" category="fonts" file="font-ini.mkvi"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="fontcharbyindex" file="font-ini.mkvi"> + <cd:command name="fontcharbyindex" level="style" category="fonts" file="font-ini.mkvi"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="tochar" file="font-ini.mkvi"> + <cd:command name="tochar" level="style" category="fonts" file="font-ini.mkvi"> <cd:arguments> - <cd:resolve name="argument-name"/> + <cd:resolve name="argument-tochar"/> </cd:arguments> </cd:command> - <cd:command name="switchstyleonly" file="font-ini.mkiv"> + <cd:command name="switchstyleonly" clevel="style" ategory="fonts" file="font-ini.mkiv"> <cd:arguments> <cd:keywords> <cd:constant type="rm"/> @@ -934,13 +958,13 @@ </cd:arguments> </cd:command> - <cd:command name="switchstyleonly" variant="command" file="font-ini.mkiv"> + <cd:command name="switchstyleonly" variant="command" level="style" category="fonts" file="font-ini.mkiv"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="definebodyfontswitch" file="font-ini.mkvi"> + <cd:command name="definebodyfontswitch" level="style" category="fonts" file="font-ini.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:keywords list="yes"> @@ -949,28 +973,28 @@ </cd:arguments> </cd:command> - <cd:command name="setsmallbodyfont" file="font-ini.mkvi"/> + <cd:command name="setsmallbodyfont" level="style" category="fonts" file="font-ini.mkvi"/> - <cd:command name="setbigbodyfont" file="font-ini.mkvi"/> + <cd:command name="setbigbodyfont" level="style" category="fonts" file="font-ini.mkvi"/> - <cd:command name="setmainbodyfont" file="font-ini.mkvi"/> + <cd:command name="setmainbodyfont" level="style" category="fonts" file="font-ini.mkvi"/> - <cd:command name="restoreglobalbodyfont" file="font-ini.mkvi"/> + <cd:command name="restoreglobalbodyfont" level="style" category="fonts" file="font-ini.mkvi"/> - <cd:command name="predefinefont" file="font-ini.mkvi"> + <cd:command name="predefinefont" level="system" category="fonts" file="font-ini.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-font"/> </cd:arguments> </cd:command> - <cd:command name="predefinedfont" file="font-ini.mkvi"> + <cd:command name="predefinedfont" level="system" category="fonts" file="font-ini.mkvi"> <cd:arguments> <cd:resolve name="keyword-font"/> </cd:arguments> </cd:command> - <cd:command name="showbodyfont" file="font-run.mkiv"> + <cd:command name="showbodyfont" level="document" category="fonts" file="font-run.mkiv"> <cd:arguments> <cd:keywords list="yes"> <cd:inherit name="setupbodyfont"/> @@ -978,7 +1002,7 @@ </cd:arguments> </cd:command> - <cd:command name="showbodyfontenvironment" file="font-run.mkiv"> + <cd:command name="showbodyfontenvironment" level="document" category="fonts" file="font-run.mkiv"> <cd:arguments> <cd:keywords list="yes"> <cd:inherit name="setupbodyfont"/> @@ -986,14 +1010,14 @@ </cd:arguments> </cd:command> - <cd:command name="showfont" file="font-run.mkiv"> + <cd:command name="showfont" level="document" category="fonts" file="font-run.mkiv"> <cd:arguments> <cd:resolve name="keyword-font"/> <cd:resolve name="keyword-number-list-optional"/> </cd:arguments> </cd:command> - <cd:command name="showfontstyle" file="font-run.mkiv"> + <cd:command name="showfontstyle" level="document" category="fonts" file="font-run.mkiv"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:inherit name="setupbodyfont"/> @@ -1021,19 +1045,19 @@ </cd:arguments> </cd:command> - <cd:command name="showligature" file="font-run.mkiv"> + <cd:command name="showligature" level="document" category="fonts" file="font-run.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="showligatures" file="font-run.mkiv"> + <cd:command name="showligatures" level="document" category="fonts" file="font-run.mkiv"> <cd:arguments> <cd:resolve name="keyword-font"/> </cd:arguments> </cd:command> - <cd:command name="showfontstrip" file="font-run.mkiv"> + <cd:command name="showfontstrip" level="document" category="fonts" file="font-run.mkiv"> <cd:arguments> <cd:keywords list="yes"> <cd:inherit name="setupbodyfont"/> @@ -1041,111 +1065,109 @@ </cd:arguments> </cd:command> - <cd:command name="showminimalbaseline" file="font-run.mkiv"/> + <cd:command name="showminimalbaseline" level="document" category="fonts" file="font-run.mkiv"/> - <cd:command name="showkerning" file="font-run.mkiv"> + <cd:command name="showkerning" level="document" category="fonts" file="font-run.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="showcharratio" file="font-run.mkiv"> + <cd:command name="showcharratio" level="document" category="fonts" file="font-run.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="showfontparameters" file="font-run.mkiv"/> - - <cd:command name="setsmallcaps" file="font-pre.mkiv"/> + <cd:command name="showfontparameters" level="document" category="fonts" file="font-run.mkiv"/> - <cd:command name="setoldstyle" file="font-pre.mkiv"/> + <cd:command name="setsmallcaps" level="style" category="fonts" file="font-pre.mkiv"/> - <cd:command name="settabular" file="font-pre.mkiv"/> + <cd:command name="setoldstyle" level="style" category="fonts" file="font-pre.mkiv"/> - <cd:command name="setfractions" file="font-pre.mkiv"/> + <cd:command name="settabular" level="style" category="fonts" file="font-pre.mkiv"/> - <cd:command name="setsuperiors" file="font-pre.mkiv"/> + <cd:command name="setsuperiors" level="style" category="fonts" file="font-pre.mkiv"/> - <cd:command name="tinyfont" file="font-pre.mkiv"/> + <cd:command name="tinyfont" level="style" category="fonts" file="font-pre.mkiv"/> - <cd:command name="infofont" file="font-pre.mkiv"/> + <cd:command name="infofont" level="style" category="fonts" file="font-pre.mkiv"/> - <cd:command name="infofontbold" file="font-pre.mkiv"/> + <cd:command name="infofontbold" level="style" category="fonts" file="font-pre.mkiv"/> - <cd:command name="smallbodyfont" file="font-pre.mkiv"/> + <cd:command name="smallbodyfont" level="style" category="fonts" file="font-pre.mkiv"/> - <cd:command name="bigbodyfont" file="font-pre.mkiv"/> + <cd:command name="bigbodyfont" level="style" category="fonts" file="font-pre.mkiv"/> - <cd:command name="smaller" file="font-pre.mkiv"/> + <cd:command name="smaller" level="style" category="fonts" file="font-pre.mkiv"/> - <cd:command name="bigger" file="font-pre.mkiv"/> + <cd:command name="bigger" level="style" category="fonts" file="font-pre.mkiv"/> - <cd:command name="normal" file="font-pre.mkiv"/> + <cd:command name="normal" level="document" category="fonts" file="font-pre.mkiv"/> - <cd:command name="bold" file="font-pre.mkiv"/> + <cd:command name="bold" level="document" category="fonts" file="font-pre.mkiv"/> - <cd:command name="mono" file="font-pre.mkiv"/> + <cd:command name="mono" level="document" category="fonts" file="font-pre.mkiv"/> - <cd:command name="monobold" file="font-pre.mkiv"/> + <cd:command name="monobold" level="document" category="fonts" file="font-pre.mkiv"/> - <cd:command name="slanted" file="font-pre.mkiv"/> + <cd:command name="slanted" level="document" category="fonts" file="font-pre.mkiv"/> - <cd:command name="italic" file="font-pre.mkiv"/> + <cd:command name="italic" level="document" category="fonts" file="font-pre.mkiv"/> - <cd:command name="boldslanted" file="font-pre.mkiv"/> + <cd:command name="boldslanted" level="document" category="fonts" file="font-pre.mkiv"/> - <cd:command name="slantedbold" file="font-pre.mkiv"/> + <cd:command name="slantedbold" level="document" category="fonts" file="font-pre.mkiv"/> - <cd:command name="bolditalic" file="font-pre.mkiv"/> + <cd:command name="bolditalic" level="document" category="fonts" file="font-pre.mkiv"/> - <cd:command name="italicbold" file="font-pre.mkiv"/> + <cd:command name="italicbold" level="document" category="fonts" file="font-pre.mkiv"/> - <cd:command name="small" file="font-pre.mkiv"/> + <cd:command name="small" level="document" category="fonts" file="font-pre.mkiv"/> - <cd:command name="smallnormal" file="font-pre.mkiv"/> + <cd:command name="smallnormal" level="document" category="fonts" file="font-pre.mkiv"/> - <cd:command name="smallbold" file="font-pre.mkiv"/> + <cd:command name="smallbold" level="document" category="fonts" file="font-pre.mkiv"/> - <cd:command name="smalltype" file="font-pre.mkiv"/> + <cd:command name="smalltype" level="document" category="fonts" file="font-pre.mkiv"/> - <cd:command name="smallslanted" file="font-pre.mkiv"/> + <cd:command name="smallslanted" level="document" category="fonts" file="font-pre.mkiv"/> - <cd:command name="smallboldslanted" file="font-pre.mkiv"/> + <cd:command name="smallboldslanted" level="document" category="fonts" file="font-pre.mkiv"/> - <cd:command name="smallslantedbold" file="font-pre.mkiv"/> + <cd:command name="smallslantedbold" level="document" category="fonts" file="font-pre.mkiv"/> - <cd:command name="smallbolditalic" file="font-pre.mkiv"/> + <cd:command name="smallbolditalic" level="document" category="fonts" file="font-pre.mkiv"/> - <cd:command name="smallitalicbold" file="font-pre.mkiv"/> + <cd:command name="smallitalicbold" level="document" category="fonts" file="font-pre.mkiv"/> - <cd:command name="sans" file="font-pre.mkiv"/> + <cd:command name="sans" level="document" category="fonts" file="font-pre.mkiv"/> - <cd:command name="sansserif" file="font-pre.mkiv"/> + <cd:command name="sansserif" level="document" category="fonts" file="font-pre.mkiv"/> - <cd:command name="roman" file="font-pre.mkiv"/> + <cd:command name="roman" level="document" category="fonts" file="font-pre.mkiv"/> - <cd:command name="serif" file="font-pre.mkiv"/> + <cd:command name="serif" level="document" category="fonts" file="font-pre.mkiv"/> - <cd:command name="regular" file="font-pre.mkiv"/> + <cd:command name="regular" level="document" category="fonts" file="font-pre.mkiv"/> - <cd:command name="handwritten" file="font-pre.mkiv"/> + <cd:command name="handwritten" level="document" category="fonts" file="font-pre.mkiv"/> - <cd:command name="calligraphic" file="font-pre.mkiv"/> + <cd:command name="calligraphic" level="document" category="fonts" file="font-pre.mkiv"/> - <cd:command name="sansnormal" file="font-pre.mkiv"/> + <cd:command name="sansnormal" level="document" category="fonts" file="font-pre.mkiv"/> - <cd:command name="sansbold" file="font-pre.mkiv"/> + <cd:command name="sansbold" level="document" category="fonts" file="font-pre.mkiv"/> - <cd:command name="serifnormal" file="font-pre.mkiv"/> + <cd:command name="serifnormal" level="document" category="fonts" file="font-pre.mkiv"/> - <cd:command name="serifbold" file="font-pre.mkiv"/> + <cd:command name="serifbold" level="document" category="fonts" file="font-pre.mkiv"/> - <cd:command name="mononormal" file="font-pre.mkiv"/> + <cd:command name="mononormal" level="document" category="fonts" file="font-pre.mkiv"/> - <cd:command name="monobold" file="font-pre.mkiv"/> + <cd:command name="monobold" level="document" category="fonts" file="font-pre.mkiv"/> - <cd:command name="definefontsolution" file="font-sol.mkvi"> + <cd:command name="definefontsolution" level="style" category="fonts" file="font-sol.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -1155,7 +1177,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupfontsolution" file="font-sol.mkvi"> + <cd:command name="setupfontsolution" level="style" category="fonts" file="font-sol.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -1187,7 +1209,7 @@ <!-- - <cd:command name="setupfontsolutions" file="font-sol.mkvi"> + <cd:command name="setupfontsolutions" level="style" category="fonts" file="font-sol.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -1198,21 +1220,21 @@ --> - <cd:command name="setfontsolution" file="font-sol.mkvi"> + <cd:command name="setfontsolution" level="style" category="fonts" file="font-sol.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="resetfontsolution" file="font-sol.mkvi"/> + <cd:command name="resetfontsolution" level="style" category="fonts" file="font-sol.mkvi"/> - <cd:command name="fontsolution" type="environment" file="font-sol.mkvi"> + <cd:command name="fontsolution" type="environment" level="style" category="fonts" file="font-sol.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="definealternativestyle" file="font-sty.mkvi"> + <cd:command name="definealternativestyle" level="style" category="fonts" file="font-sty.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list"/> <cd:resolve name="keyword-command"/> @@ -1220,17 +1242,28 @@ </cd:arguments> </cd:command> - <cd:command name="applyalternativestyle" file="font-sty.mkvi"> + <cd:command name="applyalternativestyle" level="system" category="fonts" file="font-sty.mkvi"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="dontconvertfont" file="font-sty.mkvi"/> + <cd:command name="setupalternativestyles" level="style" category="fonts" file="font-sty.mkvi"> + <cd:arguments> + <cd:assignments list="yes"> + <cd:parameter name="method"> + <cd:constant type="normal" default="yes"/> + <cd:constant type="auto"/> + </cd:parameter> + </cd:assignments> + </cd:arguments> + </cd:command> - <cd:command name="redoconvertfont" file="font-sty.mkvi"/> + <cd:command name="dontconvertfont" level="system" category="fonts" file="font-sty.mkvi"/> - <cd:command name="definestyle" file="font-sty.mkvi"> + <cd:command name="redoconvertfont" level="system" category="fonts" file="font-sty.mkvi"/> + + <cd:command name="definestyle" level="style" category="fonts" file="font-sty.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -1240,7 +1273,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupstyle" file="font-sty.mkvi"> + <cd:command name="setupstyle" level="style" category="fonts" file="font-sty.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -1257,22 +1290,22 @@ </cd:arguments> </cd:command> - <cd:command name="style" type="environment" generated="yes" variant="example" file="font-sty.mkvi"> + <cd:command name="style" type="environment" generated="yes" variant="instance" level="document" category="fonts" file="font-sty.mkvi"> <cd:sequence> - <cd:variable value="style"/> + <cd:instance value="style"/> </cd:sequence> </cd:command> - <cd:command name="style" generated="yes" variant="example" file="font-sty.mkvi"> + <cd:command name="style" generated="yes" variant="instance" level="document" category="fonts" file="font-sty.mkvi"> <cd:sequence> - <cd:variable value="style"/> + <cd:instance value="style"/> </cd:sequence> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="style" type="environment" variant="argument" file="font-sty.mkvi"> + <cd:command name="style" type="environment" variant="argument" level="document" category="fonts" file="font-sty.mkvi"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -1281,7 +1314,7 @@ </cd:arguments> </cd:command> - <cd:command name="style" type="environment" file="font-sty.mkvi"> + <cd:command name="style" type="environment" level="document" category="fonts" file="font-sty.mkvi"> <cd:arguments> <cd:assignments list="yes"> <cd:inherit name="setupstyle"/> @@ -1289,7 +1322,7 @@ </cd:arguments> </cd:command> - <cd:command name="style" variant="argument" file="font-sty.mkvi"> + <cd:command name="style" variant="argument" level="document" category="fonts" file="font-sty.mkvi"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -1299,7 +1332,7 @@ </cd:arguments> </cd:command> - <cd:command name="style" file="font-sty.mkvi"> + <cd:command name="style" level="document" category="fonts" file="font-sty.mkvi"> <cd:arguments> <cd:assignments list="yes"> <cd:inherit name="setupstyle"/> @@ -1308,7 +1341,7 @@ </cd:arguments> </cd:command> - <cd:command name="definestyleinstance" file="font-sty.mkvi"> + <cd:command name="definestyleinstance" level="style" category="fonts" file="font-sty.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:keywords optional="yes"> @@ -1334,59 +1367,59 @@ </cd:arguments> </cd:command> - <cd:command name="styleinstance" file="font-sty.mkvi"> + <cd:command name="styleinstance" level="style" category="fonts" file="font-sty.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="doifelseitalic" file="font-sym.mkvi"> + <cd:command name="doifelseitalic" level="system" category="fonts conditional" file="font-sym.mkvi"> <cd:arguments> <cd:resolve name="argument-true"/> <cd:resolve name="argument-false"/> </cd:arguments> </cd:command> - <cd:command name="doifitalicelse" file="font-sym.mkvi"> + <cd:command name="doifitalicelse" level="system" category="fonts conditional" file="font-sym.mkvi"> <cd:arguments> <cd:resolve name="argument-true"/> <cd:resolve name="argument-false"/> </cd:arguments> </cd:command> - <cd:command name="getprivateslot" file="font-ini.mkvi"> + <cd:command name="getprivateslot" level="system" category="fonts" file="font-ini.mkvi"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="getprivatechar" file="font-ini.mkvi"> + <cd:command name="getprivatechar" level="system" category="fonts" file="font-ini.mkvi"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="glyphfontfile" file="font-sym.mkvi"> + <cd:command name="glyphfontfile" level="style" category="fonts" file="font-sym.mkvi"> <cd:arguments> <cd:resolve name="argument-font"/> </cd:arguments> </cd:command> - <cd:command name="getnamedglyphstyled" file="font-sym.mkvi"> + <cd:command name="getnamedglyphstyled" level="style" category="fonts" file="font-sym.mkvi"> <cd:arguments> <cd:resolve name="argument-font"/> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="getnamedglyphdirect" file="font-sym.mkvi"> + <cd:command name="getnamedglyphdirect" level="style" category="fonts" file="font-sym.mkvi"> <cd:arguments> <cd:resolve name="argument-font"/> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="getglyphstyled" file="font-sym.mkvi"> + <cd:command name="getglyphstyled" level="style" category="fonts" file="font-sym.mkvi"> <cd:arguments> <cd:resolve name="argument-font"/> <cd:keywords delimiters="braces"> @@ -1396,7 +1429,7 @@ </cd:arguments> </cd:command> - <cd:command name="getglyphdirect" file="font-sym.mkvi"> + <cd:command name="getglyphdirect" level="style" category="fonts" file="font-sym.mkvi"> <cd:arguments> <cd:resolve name="argument-font"/> <cd:keywords delimiters="braces"> @@ -1406,31 +1439,27 @@ </cd:arguments> </cd:command> - <cd:command name="resolvedglyphstyled" file="font-sym.mkvi"> + <cd:command name="resolvedglyphstyled" level="style" category="fonts" file="font-sym.mkvi"> <cd:arguments> <cd:resolve name="argument-font"/> - <cd:keywords delimiters="braces"> - <cd:constant type="cd:text"/> - </cd:keywords> + <cd:resolve name="argument-tochar"/> </cd:arguments> </cd:command> - <cd:command name="resolvedglyphdirect" file="font-sym.mkvi"> + <cd:command name="resolvedglyphdirect" level="style" category="fonts" file="font-sym.mkvi"> <cd:arguments> <cd:resolve name="argument-font"/> - <cd:keywords delimiters="braces"> - <cd:constant type="cd:text"/> - </cd:keywords> + <cd:resolve name="argument-tochar"/> </cd:arguments> </cd:command> - <cd:command name="setfont" file="font-sym.mkvi"> + <cd:command name="setfont" level="system" category="fonts" file="font-sym.mkvi"> <cd:arguments> <cd:resolve name="string-font"/> </cd:arguments> </cd:command> - <cd:command name="doifelsefontchar" file="font-sym.mkvi"> + <cd:command name="doifelsefontchar" level="system" category="fonts conditional" file="font-sym.mkvi"> <cd:arguments> <cd:resolve name="argument-font"/> <cd:resolve name="argument-number"/> @@ -1439,7 +1468,7 @@ </cd:arguments> </cd:command> - <cd:command name="doiffontcharelse" file="font-sym.mkvi"> + <cd:command name="doiffontcharelse" level="system" category="fonts conditional" file="font-sym.mkvi"> <cd:arguments> <cd:resolve name="argument-font"/> <cd:resolve name="argument-number"/> @@ -1448,15 +1477,15 @@ </cd:arguments> </cd:command> - <cd:command name="showchardata" file="font-tra.mkiv"> + <cd:command name="showchardata" level="document" category="fonts" file="font-tra.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="showfontdata" file="font-tra.mkiv"/> + <cd:command name="showfontdata" level="document" category="fonts" file="font-tra.mkiv"/> - <cd:command name="doifelsefontpresent" file="font-tra.mkiv"> + <cd:command name="doifelsefontpresent" level="system" category="fonts conditional" file="font-tra.mkiv"> <cd:arguments> <cd:resolve name="argument-font"/> <cd:resolve name="argument-true"/> @@ -1464,7 +1493,7 @@ </cd:arguments> </cd:command> - <cd:command name="doiffontpresentelse" file="font-tra.mkiv"> + <cd:command name="doiffontpresentelse" level="system" category="fonts conditional" file="font-tra.mkiv"> <cd:arguments> <cd:resolve name="argument-font"/> <cd:resolve name="argument-true"/> @@ -1472,7 +1501,7 @@ </cd:arguments> </cd:command> - <cd:command name="showotfcomposition" file="font-tra.mkiv"> + <cd:command name="showotfcomposition" level="document" category="fonts" file="font-tra.mkiv"> <cd:arguments> <cd:resolve name="argument-font"/> <cd:keywords delimiters="braces"> @@ -1486,31 +1515,31 @@ </cd:arguments> </cd:command> - <cd:command name="fontclass" file="font-var.mkvi"/> + <cd:command name="fontclass" level="system" category="fonts" file="font-var.mkvi"/> - <cd:command name="fontbody" file="font-var.mkvi"/> + <cd:command name="fontbody" level="system" category="fonts" file="font-var.mkvi"/> - <cd:command name="fontstyle" file="font-var.mkvi"/> + <cd:command name="fontstyle" level="system" category="fonts" file="font-var.mkvi"/> - <cd:command name="fontalternative" file="font-var.mkvi"/> + <cd:command name="fontalternative" level="system" category="fonts" file="font-var.mkvi"/> - <cd:command name="fontsize" file="font-var.mkvi"/> + <cd:command name="fontsize" level="system" category="fonts" file="font-var.mkvi"/> - <cd:command name="fontface" file="font-var.mkvi"/> + <cd:command name="fontface" level="system" category="fonts" file="font-var.mkvi"/> - <cd:command name="typescriptone" file="type-ini.mkvi"/> + <cd:command name="typescriptone" level="system" category="fonts" file="type-ini.mkvi"/> - <cd:command name="typescripttwo" file="type-ini.mkvi"/> + <cd:command name="typescripttwo" level="system" category="fonts" file="type-ini.mkvi"/> - <cd:command name="typescriptthree" file="type-ini.mkvi"/> + <cd:command name="typescriptthree" level="system" category="fonts" file="type-ini.mkvi"/> - <cd:command name="typescriptcollection" type="environment" file="type-ini.mkvi"> + <cd:command name="typescriptcollection" type="environment" level="style" category="fonts" file="type-ini.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="usetypescriptfile" file="type-ini.mkvi"> + <cd:command name="usetypescriptfile" level="style" category="fonts" file="type-ini.mkvi"> <cd:arguments> <cd:keywords> <cd:constant type="reset"/> @@ -1519,7 +1548,7 @@ </cd:arguments> </cd:command> - <cd:command name="usetypescript" file="type-ini.mkvi"> + <cd:command name="usetypescript" level="style" category="fonts" file="type-ini.mkvi"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="serif"/> @@ -1545,22 +1574,22 @@ </cd:arguments> </cd:command> - <cd:command name="loadtypescriptfile" file="type-ini.mkvi"> + <cd:command name="loadtypescriptfile" level="style" category="fonts" file="type-ini.mkvi"> <cd:arguments> <cd:resolve name="keyword-file"/> </cd:arguments> </cd:command> - <cd:command name="quittypescriptscanning" file="type-ini.mkvi"/> + <cd:command name="quittypescriptscanning" level="style" category="fonts" file="type-ini.mkvi"/> - <cd:command name="definetypescriptsynonym" file="type-ini.mkvi"> + <cd:command name="definetypescriptsynonym" level="system" category="fonts" file="type-ini.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-text"/> </cd:arguments> </cd:command> - <cd:command name="typescript" type="environment" file="type-ini.mkvi"> + <cd:command name="typescript" type="environment" level="style" category="fonts" file="type-ini.mkvi"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="serif"/> @@ -1578,20 +1607,20 @@ </cd:arguments> </cd:command> - <cd:command name="definetypescriptprefix" file="type-ini.mkvi"> + <cd:command name="definetypescriptprefix" level="system" category="fonts" file="type-ini.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-text"/> </cd:arguments> </cd:command> - <cd:command name="typescriptprefix" file="type-ini.mkvi"> + <cd:command name="typescriptprefix" level="system" category="fonts" file="type-ini.mkvi"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="definetypeface" file="type-ini.mkvi"> + <cd:command name="definetypeface" level="style" category="fonts" file="type-ini.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:keywords> @@ -1640,7 +1669,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupfontexpansion" file="hand-ini.mkiv"> + <cd:command name="setupfontexpansion" level="style" category="fonts" file="hand-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes"> @@ -1663,7 +1692,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupfontprotrusion" file="hand-ini.mkiv"> + <cd:command name="setupfontprotrusion" level="style" category="fonts" file="hand-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes"> @@ -1683,9 +1712,17 @@ </cd:arguments> </cd:command> - <cd:command name="blockligatures" file="font-fea.mkiv"> + <cd:command name="blockligatures" level="style" category="fonts" file="font-fea.mkvi"> + <cd:arguments> + <cd:resolve name="keyword-text-list"/> + </cd:arguments> + </cd:command> + + <!-- question for ws: maybe move to i-file with ... level="system" category="structure" ... --> + + <cd:command name="addfontpath" level="style" category="fonts" file="font-ini.mkvi"> <cd:arguments> - <cd:resolve name="keyword-list"/> + <cd:resolve name="keyword-path-list"/> </cd:arguments> </cd:command> diff --git a/tex/context/interface/mkiv/i-form.xml b/tex/context/interface/mkiv/i-form.xml index 13e669427..fcb4979d0 100644 --- a/tex/context/interface/mkiv/i-form.xml +++ b/tex/context/interface/mkiv/i-form.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="setupforms" file="scrn-fld.mkvi"> + <cd:command name="setupforms" level="style" category="pdf" file="scrn-fld.mkvi"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="method"> @@ -20,4 +20,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-formula.xml b/tex/context/interface/mkiv/i-formula.xml index f6522fca4..07127a629 100644 --- a/tex/context/interface/mkiv/i-formula.xml +++ b/tex/context/interface/mkiv/i-formula.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="defineformula" file="math-for.mkiv"> + <cd:command name="defineformula" level="style" category="mathematics" file="math-for.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupformula" file="math-for.mkiv"> + <cd:command name="setupformula" level="style" category="mathematics" file="math-for.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -31,6 +31,11 @@ <cd:constant type="flushright"/> <cd:constant type="normal"/> </cd:parameter> + <cd:parameter name="split"> + <cd:constant type="yes"/> + <cd:constant type="no" default="yes"/> + <cd:constant type="page"/> + </cd:parameter> <cd:parameter name="strut"> <cd:constant type="yes"/> <cd:constant type="no" default="yes"/> @@ -86,25 +91,39 @@ <cd:parameter name="frame"> <cd:constant type="number"/> </cd:parameter> + <cd:parameter name="hang"> + <cd:constant type="none" default="yes"/> + <cd:constant type="auto"/> + </cd:parameter> + <cd:parameter name="expansion"> + <cd:constant type="yes"/> + <cd:constant type="no" default="yes"/> + <cd:constant type="xml"/> + </cd:parameter> + <cd:parameter name="referenceprefix"> + <cd:resolve name="value-referenceprefix"/> + </cd:parameter> + <cd:parameter name="xmlsetup"> + <cd:constant type="cd:name"/> + </cd:parameter> + <cd:parameter name="catcodes"> + <cd:constant type="cd:name"/> + </cd:parameter> <cd:inherit name="setupcounter"/> </cd:assignments> </cd:arguments> </cd:command> - <!-- - - <cd:command name="setupformulas" file="math-for.mkiv"> - <cd:arguments> - <cd:resolve name="keyword-name-list-optional"/> - <cd:assignments list="yes"> - <cd:inherit name="setupformula"/> - </cd:assignments> - </cd:arguments> - </cd:command> - - --> + <cd:command name="setupformulas" level="style" category="mathematics" file="math-for.mkiv"> + <cd:arguments> + <cd:resolve name="keyword-name-list-optional"/> + <cd:assignments list="yes"> + <cd:inherit name="setupformula"/> + </cd:assignments> + </cd:arguments> + </cd:command> - <cd:command name="definesubformula" file="math-for.mkiv"> + <cd:command name="definesubformula" level="style" category="mathematics" file="math-for.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -114,7 +133,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupsubformula" file="math-for.mkiv"> + <cd:command name="setupsubformula" level="style" category="mathematics" file="math-for.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -125,66 +144,98 @@ </cd:arguments> </cd:command> - <!-- - - <cd:command name="setupsubformulas" file="math-for.mkiv"> - <cd:arguments> - <cd:resolve name="keyword-name-list-optional"/> - <cd:assignments list="yes"> - <cd:inherit name="setupsubformula"/> - </cd:assignments> - </cd:arguments> - </cd:command> - - --> + <cd:command name="setupsubformulas" level="style" category="mathematics" file="math-for.mkiv"> + <cd:arguments> + <cd:resolve name="keyword-name-list-optional"/> + <cd:assignments list="yes"> + <cd:inherit name="setupsubformula"/> + </cd:assignments> + </cd:arguments> + </cd:command> - <cd:command name="formula" type="environment" generated="yes" variant="example" file="strc-mat.mkiv"> + <cd:command name="formula" type="environment" generated="yes" variant="instance" level="document" category="mathematics" file="strc-mat.mkiv"> <cd:sequence> - <cd:variable value="formula"/> + <cd:instance value="formula"/> <cd:string value="formula"/> </cd:sequence> <cd:arguments> <cd:resolve name="keyword-formula-list-optional"/> </cd:arguments> <cd:instances> - <cd:constant value="sp"/> - <cd:constant value="sd"/> - <cd:constant value="mp"/> - <cd:constant value="md"/> + <cd:resolve name="instance-formula"/> </cd:instances> </cd:command> - <cd:command name="formula" type="environment" file="strc-mat.mkiv"> - <cd:arguments> - <cd:resolve name="keyword-formula-list-optional"/> - </cd:arguments> - </cd:command> + <!-- - <cd:command name="spformula" type="environment" file="strc-mat.mkiv"> - <cd:arguments> - <cd:resolve name="keyword-formula-list-optional"/> - </cd:arguments> - </cd:command> + <cd:command name="formula" type="environment" generated="yes" variant="instance:assignment" level="document" category="mathematics" file="strc-mat.mkiv"> + <cd:sequence> + <cd:instance value="formula"/> + <cd:string value="formula"/> + </cd:sequence> + <cd:arguments> + <cd:assignments list="yes" optional="yes"> + <cd:inherit name="setupformula"/> + </cd:assignments> + </cd:arguments> + <cd:instances> + <cd:resolve name="instance-formula"/> + </cd:instances> + </cd:command> - <cd:command name="sdformula" type="environment" file="strc-mat.mkiv"> - <cd:arguments> - <cd:resolve name="keyword-formula-list-optional"/> - </cd:arguments> - </cd:command> + --> - <cd:command name="mpformula" type="environment" file="strc-mat.mkiv"> + <cd:command name="formula" type="environment" level="document" category="mathematics" file="strc-mat.mkiv"> <cd:arguments> <cd:resolve name="keyword-formula-list-optional"/> </cd:arguments> </cd:command> - <cd:command name="mdformula" type="environment" file="strc-mat.mkiv"> + <cd:command name="formula" type="environment" variant="assignment" level="document" category="mathematics" file="strc-mat.mkiv"> <cd:arguments> - <cd:resolve name="keyword-formula-list-optional"/> + <cd:assignments list="yes" optional="yes"> + <cd:parameter name="option"> + <cd:resolve name="value-formula"/> + </cd:parameter> + <cd:parameter name="margin"> + <cd:resolve name="value-leftskip"/> + </cd:parameter> + <cd:parameter name="grid"> + <cd:inherit name="snaptogrid"/> + </cd:parameter> + </cd:assignments> </cd:arguments> </cd:command> - <cd:command name="defineformulaalternative" file="strc-mat.mkiv"> + <!-- + + <cd:command name="spformula" type="environment" level="document" category="mathematics" file="strc-mat.mkiv"> + <cd:arguments> + <cd:resolve name="keyword-formula-list-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="sdformula" type="environment" level="document" category="mathematics" file="strc-mat.mkiv"> + <cd:arguments> + <cd:resolve name="keyword-formula-list-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="mpformula" type="environment" level="document" category="mathematics" file="strc-mat.mkiv"> + <cd:arguments> + <cd:resolve name="keyword-formula-list-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="mdformula" type="environment" level="document" category="mathematics" file="strc-mat.mkiv"> + <cd:arguments> + <cd:resolve name="keyword-formula-list-optional"/> + </cd:arguments> + </cd:command> + + --> + + <cd:command name="defineformulaalternative" level="system" category="mathematics" file="strc-mat.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-csname"/> @@ -192,41 +243,41 @@ </cd:arguments> </cd:command> - <cd:command name="formula" file="strc-mat.mkiv"> + <cd:command name="formula" level="document" category="mathematics" file="strc-mat.mkiv"> <cd:arguments> <cd:resolve name="keyword-formula-list-optional"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="displaymath" type="environment" file="strc-mat.mkiv"/> + <cd:command name="displaymath" type="environment" level="system" category="mathematics" file="strc-mat.mkiv"/> - <cd:command name="formulas" type="environment" file="strc-mat.mkiv"> + <cd:command name="formulas" type="environment" level="document" category="mathematics" file="strc-mat.mkiv"> <cd:arguments> <cd:resolve name="keyword-formulareference-list-optional"/> </cd:arguments> </cd:command> - <cd:command name="subformulas" type="environment" file="strc-mat.mkiv"> + <cd:command name="subformulas" type="environment" level="document" category="mathematics" file="strc-mat.mkiv"> <cd:arguments> <cd:resolve name="keyword-formulareference-list-optional"/> </cd:arguments> </cd:command> - <cd:command name="namedsubformulas" type="environment" file="strc-mat.mkiv"> + <cd:command name="namedsubformulas" type="environment" level="document" category="mathematics" file="strc-mat.mkiv"> <cd:arguments> <cd:resolve name="keyword-formulareference-list-optional"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="placeformula" file="strc-mat.mkiv"> + <cd:command name="placeformula" level="document" category="mathematics" file="strc-mat.mkiv"> <cd:arguments> <cd:resolve name="keyword-formulareference-list-optional"/> </cd:arguments> </cd:command> - <cd:command name="placeformula" type="environment" file="strc-mat.mkiv"> + <cd:command name="placeformula" type="environment" level="document" category="mathematics" file="strc-mat.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="title"> @@ -242,31 +293,37 @@ </cd:arguments> </cd:command> - <cd:command name="placeformula" type="environment" variant="argument" file="strc-mat.mkiv"> + <cd:command name="placeformula" type="environment" variant="argument" level="document" category="mathematics" file="strc-mat.mkiv"> <cd:arguments> <cd:resolve name="keyword-formulareference-list-optional"/> </cd:arguments> </cd:command> - <cd:command name="placenamedformula" file="strc-mat.mkiv"> + <cd:command name="placenamedformula" level="document" category="mathematics" file="strc-mat.mkiv"> <cd:arguments> <cd:resolve name="keyword-formulareference-list-optional"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="placesubformula" file="strc-mat.mkiv"> + <cd:command name="placesubformula" level="document" category="mathematics" file="strc-mat.mkiv"> <cd:arguments> <cd:resolve name="keyword-formulareference-list-optional"/> </cd:arguments> </cd:command> - <cd:command name="formulanumber" file="strc-mat"> + <cd:command name="formulanumber" level="document" category="mathematics" file="strc-mat"> <cd:arguments> <cd:resolve name="keyword-reference-list-optional"/> </cd:arguments> </cd:command> - <cd:command name="placecurrentformulanumber" file="strc-mat"/> + <cd:command name="placecurrentformulanumber" level="system" category="mathematics" file="strc-mat"/> + + <cd:command name="alignhere" scope="formula" level="document" category="mathematics" file="strc-mat"/> + + <cd:command name="breakhere" scope="formula" level="document" category="mathematics" file="strc-mat"/> + + <cd:command name="splitformula" type="environment" level="document" category="mathematics" file="strc-mat.mkiv"/> </cd:interface> diff --git a/tex/context/interface/mkiv/i-fraction.xml b/tex/context/interface/mkiv/i-fraction.xml index 2624b8a5c..33252dde2 100644 --- a/tex/context/interface/mkiv/i-fraction.xml +++ b/tex/context/interface/mkiv/i-fraction.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definemathfraction" file="math-frc.mkiv"> + <cd:command name="definemathfraction" level="style" category="mathematics" file="math-frc.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupmathfraction" file="math-frc.mkiv"> + <cd:command name="setupmathfraction" level="style" category="mathematics" file="math-frc.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -63,121 +63,125 @@ <cd:constant type="none" default="yes"/> <cd:constant type="overlay"/> </cd:parameter> + <cd:parameter name="inlinethreshold"> + <cd:constant type="auto"/> + <cd:constant type="cd:number"/> + </cd:parameter> + <cd:parameter name="displaythreshold"> + <cd:constant type="auto"/> + <cd:constant type="cd:number"/> + </cd:parameter> + <cd:parameter name="fences"> + <cd:constant type="cd:name"/> + </cd:parameter> </cd:assignments> </cd:arguments> </cd:command> - <!-- - - <cd:command name="setupmathfractions" file="math-frc.mkiv"> - <cd:arguments> - <cd:resolve name="keyword-name-list-optional"/> - <cd:assignments list="yes"> - <cd:inherit name="setupmathfraction"/> - </cd:assignments> - </cd:arguments> - </cd:command> - - --> + <cd:command name="setupmathfractions" level="style" category="mathematics" file="math-frc.mkiv"> + <cd:arguments> + <cd:resolve name="keyword-name-list-optional"/> + <cd:assignments list="yes"> + <cd:inherit name="setupmathfraction"/> + </cd:assignments> + </cd:arguments> + </cd:command> - <cd:command name="fraction" generated="yes" variant="example" file="math-frc.mkiv"> + <cd:command name="fraction" generated="yes" variant="instance" level="document" category="mathematics" file="math-frc.mkiv"> <cd:sequence> - <cd:variable value="fraction"/> + <cd:instance value="fraction"/> </cd:sequence> <cd:arguments> <cd:content/> <cd:content/> </cd:arguments> <cd:instances> - <cd:constant value="xfrac"/> - <cd:constant value="xxfrac"/> - <cd:constant value="frac"/> - <cd:constant value="sfrac"/> - <cd:constant value="dfrac"/> - <cd:constant value="binom"/> - <cd:constant value="dbinom"/> - <cd:constant value="tbinom"/> + <cd:resolve name="instance-fraction"/> </cd:instances> </cd:command> - <cd:command name="frac" file="math-frc.mkiv"> - <cd:arguments> - <cd:content/> - <cd:content/> - </cd:arguments> - </cd:command> + <!-- - <cd:command name="xfrac" file="math-frc.mkiv"> - <cd:arguments> - <cd:content/> - <cd:content/> - </cd:arguments> - </cd:command> + <cd:command name="frac" level="document" category="mathematics" file="math-frc.mkiv"> + <cd:arguments> + <cd:content/> + <cd:content/> + </cd:arguments> + </cd:command> - <cd:command name="xxfrac" file="math-frc.mkiv"> - <cd:arguments> - <cd:content/> - <cd:content/> - </cd:arguments> - </cd:command> + <cd:command name="xfrac" level="document" category="mathematics" file="math-frc.mkiv"> + <cd:arguments> + <cd:content/> + <cd:content/> + </cd:arguments> + </cd:command> - <cd:command name="tfrac" file="math-frc.mkiv"> - <cd:arguments> - <cd:content/> - <cd:content/> - </cd:arguments> - </cd:command> + <cd:command name="xxfrac" level="document" category="mathematics" file="math-frc.mkiv"> + <cd:arguments> + <cd:content/> + <cd:content/> + </cd:arguments> + </cd:command> - <cd:command name="sfrac" file="math-frc.mkiv"> - <cd:arguments> - <cd:content/> - <cd:content/> - </cd:arguments> - </cd:command> + <cd:command name="tfrac" level="document" category="mathematics" file="math-frc.mkiv"> + <cd:arguments> + <cd:content/> + <cd:content/> + </cd:arguments> + </cd:command> - <cd:command name="dfrac" file="math-frc.mkiv"> - <cd:arguments> - <cd:content/> - <cd:content/> - </cd:arguments> - </cd:command> + <cd:command name="sfrac" level="document" category="mathematics" file="math-frc.mkiv"> + <cd:arguments> + <cd:content/> + <cd:content/> + </cd:arguments> + </cd:command> - <cd:command name="binom" file="math-frc.mkiv"> - <cd:arguments> - <cd:content/> - <cd:content/> - </cd:arguments> - </cd:command> + <cd:command name="dfrac" level="document" category="mathematics" file="math-frc.mkiv"> + <cd:arguments> + <cd:content/> + <cd:content/> + </cd:arguments> + </cd:command> - <cd:command name="dbinom" file="math-frc.mkiv"> - <cd:arguments> - <cd:content/> - <cd:content/> - </cd:arguments> - </cd:command> + <cd:command name="binom" level="document" category="mathematics" file="math-frc.mkiv"> + <cd:arguments> + <cd:content/> + <cd:content/> + </cd:arguments> + </cd:command> - <cd:command name="tbinom" file="math-frc.mkiv"> - <cd:arguments> - <cd:content/> - <cd:content/> - </cd:arguments> - </cd:command> + <cd:command name="dbinom" level="document" category="mathematics" file="math-frc.mkiv"> + <cd:arguments> + <cd:content/> + <cd:content/> + </cd:arguments> + </cd:command> + + <cd:command name="tbinom" level="document" category="mathematics" file="math-frc.mkiv"> + <cd:arguments> + <cd:content/> + <cd:content/> + </cd:arguments> + </cd:command> + + --> - <cd:command name="splitfrac" file="math-frc.mkiv"> + <cd:command name="splitfrac" level="document" category="mathematics" file="math-frc.mkiv"> <cd:arguments> <cd:content/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="splitdfrac" file="math-frc.mkiv"> + <cd:command name="splitdfrac" level="document" category="mathematics" file="math-frc.mkiv"> <cd:arguments> <cd:content/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="cfrac" file="math-frc.mkiv"> + <cd:command name="cfrac" level="document" category="mathematics" file="math-frc.mkiv"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="l"/> @@ -198,4 +202,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-framed.xml b/tex/context/interface/mkiv/i-framed.xml index c7633aa91..a4667dd2e 100644 --- a/tex/context/interface/mkiv/i-framed.xml +++ b/tex/context/interface/mkiv/i-framed.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="defineframed" file="pack-rul.mkiv"> + <cd:command name="defineframed" level="style" category="background rules" file="pack-rul.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupframed" file="pack-rul.mkiv"> + <cd:command name="setupframed" level="style" category="background rules" file="pack-rul.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -220,19 +220,19 @@ </cd:arguments> </cd:command> - <cd:command name="frameddimension" file="pack-rul.mkiv"> + <cd:command name="frameddimension" level="system" category="background rules" file="pack-rul.mkiv"> <cd:arguments> <cd:resolve name="argument-key"/> </cd:arguments> </cd:command> - <cd:command name="framedparameter" file="pack-rul.mkiv"> + <cd:command name="framedparameter" level="system" category="background rules" file="pack-rul.mkiv"> <cd:arguments> <cd:resolve name="argument-key"/> </cd:arguments> </cd:command> - <cd:command name="framed" file="pack-rul.mkiv"> + <cd:command name="framed" level="document" category="background rules" file="pack-rul.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupframed"/> @@ -241,9 +241,9 @@ </cd:arguments> </cd:command> - <cd:command name="framed" generated="yes" variant="example" file="pack-rul.mkiv"> + <cd:command name="framed" generated="yes" variant="instance" level="document" category="background rules" file="pack-rul.mkiv"> <cd:sequence> - <cd:variable value="framed"/> + <cd:instance value="framed"/> </cd:sequence> <cd:arguments> <cd:assignments list="yes" optional="yes"> @@ -252,12 +252,11 @@ <cd:content/> </cd:arguments> <cd:instances> - <cd:constant value="unframed"/> - <cd:constant value="fitfieldframed"/> + <cd:resolve name="instance-framed"/> </cd:instances> </cd:command> - <cd:command name="normalframedwithsettings" file="pack-rul.mkiv"> + <cd:command name="normalframedwithsettings" level="system" category="background rules" file="pack-rul.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:inherit name="setupframed"/> @@ -266,7 +265,7 @@ </cd:arguments> </cd:command> - <cd:command name="framed" type="environment" file="pack-rul.mkiv"> + <cd:command name="framed" type="environment" level="document" category="background rules" file="pack-rul.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:assignments list="yes" optional="yes"> @@ -275,7 +274,7 @@ </cd:arguments> </cd:command> - <cd:command name="fastlocalframed" file="pack-rul.mkiv"> + <cd:command name="fastlocalframed" level="system" category="background rules" file="pack-rul.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes"> @@ -285,7 +284,7 @@ </cd:arguments> </cd:command> - <cd:command name="localframed" file="pack-rul.mkiv"> + <cd:command name="localframed" level="system" category="background rules" file="pack-rul.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes" optional="yes"> @@ -295,14 +294,14 @@ </cd:arguments> </cd:command> - <cd:command name="directlocalframed" file="pack-rul.mkiv"> + <cd:command name="directlocalframed" level="system" category="background rules" file="pack-rul.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="localframedwithsettings" file="pack-rul.mkiv"> + <cd:command name="localframedwithsettings" level="system" category="background rules" file="pack-rul.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes"> @@ -312,7 +311,7 @@ </cd:arguments> </cd:command> - <cd:command name="placeframed" file="pack-rul.mkiv"> + <cd:command name="placeframed" level="document" category="background rules" file="pack-rul.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes" optional="yes"> @@ -322,7 +321,7 @@ </cd:arguments> </cd:command> - <cd:command name="inframed" file="pack-rul.mkiv"> + <cd:command name="inframed" level="document" category="background rules" file="pack-rul.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupframed"/> @@ -331,16 +330,20 @@ </cd:arguments> </cd:command> - <cd:command name="unframed" file="pack-rul.mkiv"> - <cd:arguments> - <cd:assignments list="yes" optional="yes"> - <cd:inherit name="setupframed"/> - </cd:assignments> - <cd:content/> - </cd:arguments> - </cd:command> + <!-- - <cd:command name="definemathframed" file="pack-rul.mkiv"> + <cd:command name="unframed" level="document" category="background rules" file="pack-rul.mkiv"> + <cd:arguments> + <cd:assignments list="yes" optional="yes"> + <cd:inherit name="setupframed"/> + </cd:assignments> + <cd:content/> + </cd:arguments> + </cd:command> + + --> + + <cd:command name="definemathframed" level="style" category="background rules mathematics" file="pack-rul.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -350,7 +353,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupmathframed" file="pack-rul.mkiv"> + <cd:command name="setupmathframed" level="style" category="background rules mathematics" file="pack-rul.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -359,9 +362,9 @@ </cd:arguments> </cd:command> - <cd:command name="mathframed" generated="yes" variant="example" file="pack-rul.mkiv"> + <cd:command name="mathframed" generated="yes" variant="instance" level="document" category="background rules mathematics" file="pack-rul.mkiv"> <cd:sequence> - <cd:variable value="mathframed"/> + <cd:instance value="mathframed"/> </cd:sequence> <cd:arguments> <cd:assignments list="yes" optional="yes"> @@ -370,40 +373,42 @@ <cd:content/> </cd:arguments> <cd:instances> - <cd:constant value="mframed"/> - <cd:constant value="inmframed"/> - <cd:constant value="mcframed"/> + <cd:resolve name="instance-mathframed"/> </cd:instances> </cd:command> - <cd:command name="mframed" file="pack-rul.mkiv"> - <cd:arguments> - <cd:assignments list="yes" optional="yes"> - <cd:inherit name="setupmathframed"/> - </cd:assignments> - <cd:content/> - </cd:arguments> - </cd:command> + <!-- - <cd:command name="inmframed" file="pack-rul.mkiv"> - <cd:arguments> - <cd:assignments list="yes" optional="yes"> - <cd:inherit name="setupmathframed"/> - </cd:assignments> - <cd:content/> - </cd:arguments> - </cd:command> + <cd:command name="mframed" level="document" category="background rules mathematics" file="pack-rul.mkiv"> + <cd:arguments> + <cd:assignments list="yes" optional="yes"> + <cd:inherit name="setupmathframed"/> + </cd:assignments> + <cd:content/> + </cd:arguments> + </cd:command> - <cd:command name="mcframed" file="pack-rul.mkiv"> - <cd:arguments> - <cd:assignments list="yes" optional="yes"> - <cd:inherit name="setupmathframed"/> - </cd:assignments> - <cd:content/> - </cd:arguments> - </cd:command> + <cd:command name="inmframed" level="document" category="background rules mathematics" file="pack-rul.mkiv"> + <cd:arguments> + <cd:assignments list="yes" optional="yes"> + <cd:inherit name="setupmathframed"/> + </cd:assignments> + <cd:content/> + </cd:arguments> + </cd:command> - <cd:command name="defineformulaframed" file="math-for.mkiv"> + <cd:command name="mcframed" level="document" category="background rules mathematics" file="pack-rul.mkiv"> + <cd:arguments> + <cd:assignments list="yes" optional="yes"> + <cd:inherit name="setupmathframed"/> + </cd:assignments> + <cd:content/> + </cd:arguments> + </cd:command> + + --> + + <cd:command name="defineformulaframed" level="style" category="background rules mathematics" file="math-for.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -413,7 +418,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupformulaframed" file="math-for.mkiv"> + <cd:command name="setupformulaframed" level="style" category="background rules mathematics" file="math-for.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -422,7 +427,7 @@ </cd:arguments> </cd:command> - <cd:command name="defineframedtext" file="pack-rul.mkiv"> + <cd:command name="defineframedtext" level="style" category="background rules" file="pack-rul.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -432,7 +437,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupframedtext" file="pack-rul.mkiv"> + <cd:command name="setupframedtext" level="style" category="background rules" file="pack-rul.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -473,22 +478,18 @@ </cd:arguments> </cd:command> - <!-- - - <cd:command name="setupframedtexts" file="pack-rul.mkiv"> - <cd:arguments> - <cd:resolve name="keyword-name-list-optional"/> - <cd:assignments list="yes"> - <cd:inherit name="setupframedtext"/> - </cd:assignments> - </cd:arguments> - </cd:command> - - --> + <cd:command name="setupframedtexts" level="style" category="background rules" file="pack-rul.mkiv"> + <cd:arguments> + <cd:resolve name="keyword-name-list-optional"/> + <cd:assignments list="yes"> + <cd:inherit name="setupframedtext"/> + </cd:assignments> + </cd:arguments> + </cd:command> - <cd:command name="framedtext" generated="yes" variant="example" file="pack-rul.mkiv"> + <cd:command name="framedtext" generated="yes" variant="instance" level="document" category="background rules" file="pack-rul.mkiv"> <cd:sequence> - <cd:variable value="framedtext"/> + <cd:instance value="framedtext"/> </cd:sequence> <cd:arguments> <cd:assignments list="yes" optional="yes"> @@ -497,13 +498,13 @@ <cd:content/> </cd:arguments> <cd:instances> - <cd:constant value="framedtext"/> + <cd:resolve name="instance-framedtext"/> </cd:instances> </cd:command> - <cd:command name="framedtext" type="environment" generated="yes" variant="example" file="pack-rul.mkiv"> + <cd:command name="framedtext" type="environment" generated="yes" variant="instance" level="document" category="background rules" file="pack-rul.mkiv"> <cd:sequence> - <cd:variable value="framedtext"/> + <cd:instance value="framedtext"/> </cd:sequence> <cd:arguments> <cd:keywords optional="yes"> @@ -517,34 +518,38 @@ </cd:assignments> </cd:arguments> <cd:instances> - <cd:constant value="framedtext"/> + <cd:resolve name="instance-framedtext"/> </cd:instances> </cd:command> - <cd:command name="framedtext" file="pack-rul.mkiv"> - <cd:arguments> - <cd:assignments list="yes" optional="yes"> - <cd:inherit name="setupframedtext"/> - </cd:assignments> - <cd:content/> - </cd:arguments> - </cd:command> + <!-- - <cd:command name="framedtext" type="environment" file="pack-rul.mkiv"> - <cd:arguments> - <cd:keywords optional="yes"> - <cd:constant type="left"/> - <cd:constant type="right"/> - <cd:constant type="middle"/> - <cd:constant type="none"/> - </cd:keywords> - <cd:assignments list="yes" optional="yes"> - <cd:inherit name="setupframedtext"/> - </cd:assignments> - </cd:arguments> - </cd:command> + <cd:command name="framedtext" level="document" category="background rules" file="pack-rul.mkiv"> + <cd:arguments> + <cd:assignments list="yes" optional="yes"> + <cd:inherit name="setupframedtext"/> + </cd:assignments> + <cd:content/> + </cd:arguments> + </cd:command> + + <cd:command name="framedtext" type="environment" level="document" category="background rules" file="pack-rul.mkiv"> + <cd:arguments> + <cd:keywords optional="yes"> + <cd:constant type="left"/> + <cd:constant type="right"/> + <cd:constant type="middle"/> + <cd:constant type="none"/> + </cd:keywords> + <cd:assignments list="yes" optional="yes"> + <cd:inherit name="setupframedtext"/> + </cd:assignments> + </cd:arguments> + </cd:command> + + --> - <cd:command name="defineframedcontent" file="pack-rul.mkiv"> + <cd:command name="defineframedcontent" level="style" category="background rules" file="pack-rul.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -554,7 +559,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupframedcontent" file="pack-rul.mkiv"> + <cd:command name="setupframedcontent" level="style" category="background rules" file="pack-rul.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -585,7 +590,7 @@ </cd:arguments> </cd:command> - <cd:command name="framedcontent" type="environment" file="pack-rul.mkiv"> + <cd:command name="framedcontent" type="environment" level="system" category="background rules" file="pack-rul.mkiv"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -594,32 +599,32 @@ </cd:arguments> </cd:command> - <cd:command name="installleftframerenderer" file="pack-fen.mkiv"> + <cd:command name="installleftframerenderer" level="system" category="background rules" file="pack-fen.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-command"/> </cd:arguments> </cd:command> - <cd:command name="installrightframerenderer" file="pack-fen.mkiv"> + <cd:command name="installrightframerenderer" level="system" category="background rules" file="pack-fen.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-command"/> </cd:arguments> </cd:command> - <cd:command name="installtopframerenderer" file="pack-fen.mkiv"> + <cd:command name="installtopframerenderer" level="system" category="background rules" file="pack-fen.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-command"/> </cd:arguments> </cd:command> - <cd:command name="installbottomframerenderer" file="pack-fen.mkiv"> + <cd:command name="installbottomframerenderer" level="system" category="background rules" file="pack-fen.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-command"/> </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-framedtable.xml b/tex/context/interface/mkiv/i-framedtable.xml new file mode 100644 index 000000000..51699b5bc --- /dev/null +++ b/tex/context/interface/mkiv/i-framedtable.xml @@ -0,0 +1,86 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<?context-directive job ctxfile x-setups.ctx ?> + +<cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> + + <cd:command name="defineframedtable" level="style" category="tables" file="tabl-frm.mkiv"> + <cd:arguments> + <cd:resolve name="keyword-name"/> + <cd:resolve name="keyword-name-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="setupframedtable" level="style" category="tables" file="tabl-frm.mkiv"> + <cd:arguments> + <cd:resolve name="keyword-name-optional"/> + <cd:assignments list="yes"> + <cd:parameter name="before"> + <cd:constant type="cd:command"/> + </cd:parameter> + <cd:parameter name="after"> + <cd:constant type="cd:command"/> + </cd:parameter> + <cd:parameter name="inbetween"> + <cd:constant type="cd:command"/> + </cd:parameter> + <cd:parameter name="distance"> + <cd:constant type="cd:dimension"/> + </cd:parameter> + <cd:inherit name="setupframed"/> + </cd:assignments> + </cd:arguments> + </cd:command> + + <cd:command name="setupframedtablerow" level="style" category="tables" file="tabl-frm.mkiv"> + <cd:arguments> + <cd:resolve name="keyword-name-optional"/> + <cd:keywords> + <cd:constant type="cd:number"/> + <cd:constant type="each"/> + </cd:keywords> + <cd:assignments list="yes"> + <cd:inherit name="setupframed"/> + </cd:assignments> + </cd:arguments> + </cd:command> + + <cd:command name="setupframedtablecolumn" level="style" category="tables" file="tabl-frm.mkiv"> + <cd:arguments> + <cd:resolve name="keyword-name-optional"/> + <cd:keywords> + <cd:constant type="cd:number"/> + <cd:constant type="each"/> + </cd:keywords> + <cd:assignments list="yes"> + <cd:inherit name="setupframed"/> + </cd:assignments> + </cd:arguments> + </cd:command> + + <cd:command name="framedtable" type="environment" level="document" category="tables" file="tabl-frm.mkiv"> + <cd:arguments> + <cd:resolve name="keyword-name-optional"/> + <cd:assignments list="yes" optional="yes"> + <cd:inherit name="setupframed"/> + </cd:assignments> + </cd:arguments> + </cd:command> + + <cd:command name="framedrow" type="environment" level="document" category="tables" file="tabl-frm.mkiv"> + <cd:arguments> + <cd:assignments list="yes" optional="yes"> + <cd:inherit name="setupframed"/> + </cd:assignments> + </cd:arguments> + </cd:command> + + <cd:command name="framedcell" type="environment" level="document" category="tables" file="tabl-frm.mkiv"> + <cd:arguments> + <cd:assignments list="yes" optional="yes"> + <cd:inherit name="setupframed"/> + </cd:assignments> + </cd:arguments> + </cd:command> + +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-graphics.xml b/tex/context/interface/mkiv/i-graphics.xml index e66a039dc..d90be9e7b 100644 --- a/tex/context/interface/mkiv/i-graphics.xml +++ b/tex/context/interface/mkiv/i-graphics.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="defineexternalfigure" file="grph-inc.mkiv"> + <cd:command name="defineexternalfigure" level="style" category="graphics" file="grph-inc.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -16,7 +16,7 @@ <!-- - <cd:command name="defineexternalfigures" file="grph-inc.mkiv"> + <cd:command name="defineexternalfigures" level="style" category="graphics" file="grph-inc.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -28,7 +28,7 @@ --> - <cd:command name="setupexternalfigure" file="grph-inc.mkvi"> + <cd:command name="setupexternalfigure" level="style" category="graphics" file="grph-inc.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -178,9 +178,11 @@ <cd:parameter name="backgroundcolor"> <cd:constant type="cd:color"/> </cd:parameter> - <cd:parameter name="align"> - <cd:inherit name="setupalign"/> - </cd:parameter> + <!-- + <cd:parameter name="align"> + <cd:inherit name="setupalign"/> + </cd:parameter> + --> <cd:parameter name="xmax"> <cd:constant type="cd:number"/> </cd:parameter> @@ -240,7 +242,7 @@ <!-- - <cd:command name="setupexternalfigures" file="grph-inc.mkvi"> + <cd:command name="setupexternalfigures" level="style" category="graphics" file="grph-inc.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -251,7 +253,7 @@ --> - <cd:command name="useexternalfigure" file="grph-inc.mkiv"> + <cd:command name="useexternalfigure" level="style" category="graphics" file="grph-inc.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-file"/> @@ -262,7 +264,7 @@ </cd:arguments> </cd:command> - <cd:command name="externalfigure" file="grph-inc.mkiv"> + <cd:command name="externalfigure" level="document" category="graphics" file="grph-inc.mkiv"> <cd:arguments> <cd:resolve name="keyword-file"/> <cd:resolve name="keyword-name-optional"/> @@ -272,7 +274,7 @@ </cd:arguments> </cd:command> - <cd:command name="getfiguredimensions" file="grph-inc.mkiv"> + <cd:command name="getfiguredimensions" level="system" category="graphics" file="grph-inc.mkiv"> <cd:arguments> <cd:resolve name="keyword-file"/> <cd:assignments list="yes" optional="yes"> @@ -281,32 +283,32 @@ </cd:arguments> </cd:command> - <cd:command name="figurewidth" file="grph-inc.mkiv"/> + <cd:command name="figurewidth" level="system" category="graphics" file="grph-inc.mkiv"/> - <cd:command name="figureheight" file="grph-inc.mkiv"/> + <cd:command name="figureheight" level="system" category="graphics" file="grph-inc.mkiv"/> - <cd:command name="figurenaturalwidth" file="grph-inc.mkiv"/> + <cd:command name="figurenaturalwidth" level="system" category="graphics" file="grph-inc.mkiv"/> - <cd:command name="figurenaturalheight" file="grph-inc.mkiv"/> + <cd:command name="figurenaturalheight" level="system" category="graphics" file="grph-inc.mkiv"/> - <cd:command name="figurefullname" file="grph-inc.mkiv"/> + <cd:command name="figurefullname" level="system" category="graphics" file="grph-inc.mkiv"/> - <cd:command name="figurefilename" file="grph-inc.mkiv"/> + <cd:command name="figurefilename" level="system" category="graphics" file="grph-inc.mkiv"/> - <cd:command name="figurefilepath" file="grph-inc.mkiv"/> + <cd:command name="figurefilepath" level="system" category="graphics" file="grph-inc.mkiv"/> - <cd:command name="figurefiletype" file="grph-inc.mkiv"/> + <cd:command name="figurefiletype" level="system" category="graphics" file="grph-inc.mkiv"/> - <cd:command name="noffigurepages" file="grph-inc.mkiv"/> + <cd:command name="noffigurepages" level="system" category="graphics" file="grph-inc.mkiv"/> - <cd:command name="definegraphictypesynonym" file="grph-inc.mkiv"> + <cd:command name="definegraphictypesynonym" level="system" category="graphics" file="grph-inc.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="doifelsefigure" file="grph-inc.mkiv"> + <cd:command name="doifelsefigure" level="system" category="graphics conditional" file="grph-inc.mkiv"> <cd:arguments> <cd:resolve name="argument-file"/> <cd:resolve name="argument-true"/> @@ -314,7 +316,7 @@ </cd:arguments> </cd:command> - <cd:command name="doiffigureelse" file="grph-inc.mkiv"> + <cd:command name="doiffigureelse" level="system" category="graphics conditional" file="grph-inc.mkiv"> <cd:arguments> <cd:resolve name="argument-file"/> <cd:resolve name="argument-true"/> @@ -322,7 +324,7 @@ </cd:arguments> </cd:command> - <cd:command name="registerexternalfigure" file="grph-inc.mkiv"> + <cd:command name="registerexternalfigure" level="system" category="graphics" file="grph-inc.mkiv"> <cd:arguments> <cd:resolve name="keyword-file"/> <cd:resolve name="keyword-name-optional"/> @@ -332,7 +334,7 @@ </cd:arguments> </cd:command> - <cd:command name="usefigurebase" file="grph-inc.mkiv"> + <cd:command name="usefigurebase" level="style" category="graphics" file="grph-inc.mkiv"> <cd:arguments> <cd:keywords> <cd:constant type="reset"/> @@ -341,81 +343,81 @@ </cd:arguments> </cd:command> - <cd:command name="externalfigurecollection" type="environment" file="grph-inc.mkiv"> + <cd:command name="externalfigurecollection" type="environment" level="style" category="graphics" file="grph-inc.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="externalfigurecollectionminwidth" file="grph-inc.mkiv"> + <cd:command name="externalfigurecollectionminwidth" level="style" category="graphics" file="grph-inc.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="externalfigurecollectionmaxwidth" file="grph-inc.mkiv"> + <cd:command name="externalfigurecollectionmaxwidth" level="style" category="graphics" file="grph-inc.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="externalfigurecollectionminheight" file="grph-inc.mkiv"> + <cd:command name="externalfigurecollectionminheight" level="style" category="graphics" file="grph-inc.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="externalfigurecollectionmaxheight" file="grph-inc.mkiv"> + <cd:command name="externalfigurecollectionmaxheight" level="style" category="graphics" file="grph-inc.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="externalfigurecollectionparameter" file="grph-inc.mkiv"> + <cd:command name="externalfigurecollectionparameter" level="system" category="graphics" file="grph-inc.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-key"/> </cd:arguments> </cd:command> - <cd:command name="efcminwidth" file="grph-inc.mkiv"> + <cd:command name="efcminwidth" level="style" category="graphics" file="grph-inc.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="efcmaxwidth" file="grph-inc.mkiv"> + <cd:command name="efcmaxwidth" level="style" category="graphics" file="grph-inc.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="efcminheight" file="grph-inc.mkiv"> + <cd:command name="efcminheight" level="style" category="graphics" file="grph-inc.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="efcmaxheight" file="grph-inc.mkiv"> + <cd:command name="efcmaxheight" level="style" category="graphics" file="grph-inc.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="efcparameter" file="grph-inc.mkiv"> + <cd:command name="efcparameter" level="style" category="graphics" file="grph-inc.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-key"/> </cd:arguments> </cd:command> - <cd:command name="overlayfigure" file="grph-inc.mkiv"> + <cd:command name="overlayfigure" level="style" category="graphics" file="grph-inc.mkiv"> <cd:arguments> <cd:resolve name="argument-file"/> </cd:arguments> </cd:command> - <cd:command name="bitmapimage" file="grph-inc.mkiv"> + <cd:command name="bitmapimage" level="document" category="graphics" file="grph-inc.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="color"> @@ -442,7 +444,7 @@ </cd:arguments> </cd:command> - <cd:command name="bitmapimage" type="environment" file="grph-inc.mkiv"> + <cd:command name="bitmapimage" type="environment" level="document" category="graphics" file="grph-inc.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="color"> @@ -466,7 +468,7 @@ </cd:arguments> </cd:command> - <cd:command name="typesetbuffer" file="grph-fig.mkiv"> + <cd:command name="typesetbuffer" level="document" category="graphics buffer" file="grph-fig.mkiv"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="*"/> @@ -478,7 +480,7 @@ </cd:arguments> </cd:command> - <cd:command name="definetypesetting" file="grph-fig.mkiv"> + <cd:command name="definetypesetting" level="style" category="graphics structure" file="grph-fig.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-text-optional"/> @@ -488,7 +490,7 @@ </cd:arguments> </cd:command> - <cd:command name="typesetfile" file="grph-fig.mkiv"> + <cd:command name="typesetfile" level="document" category="graphics structure" file="grph-fig.mkiv"> <cd:arguments> <cd:keywords> <cd:constant type="cd:name"/> @@ -504,7 +506,7 @@ </cd:arguments> </cd:command> - <cd:command name="backgroundimage" file="pack-box.mkiv"> + <cd:command name="backgroundimage" level="style" category="graphics" file="pack-box.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> <cd:resolve name="argument-dimension"/> @@ -513,7 +515,7 @@ </cd:arguments> </cd:command> - <cd:command name="backgroundimagefill" file="pack-box.mkiv"> + <cd:command name="backgroundimagefill" level="style" category="graphics" file="pack-box.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> <cd:resolve name="argument-dimension"/> @@ -522,4 +524,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-grid.xml b/tex/context/interface/mkiv/i-grid.xml index ac678e544..bd96388f3 100644 --- a/tex/context/interface/mkiv/i-grid.xml +++ b/tex/context/interface/mkiv/i-grid.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="showgrid" file="page-grd.mkiv"> + <cd:command name="showgrid" level="document" category="layout" file="page-grd.mkiv"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="reset"/> @@ -23,7 +23,7 @@ </cd:arguments> </cd:command> - <cd:command name="definegridsnapping" file="spac-ver.mkiv"> + <cd:command name="definegridsnapping" level="style" category="layout" file="spac-ver.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:keywords list="yes"> @@ -59,7 +59,7 @@ </cd:arguments> </cd:command> - <cd:command name="snaptogrid" file="spac-ver.mkiv"> + <cd:command name="snaptogrid" level="document" category="layout" file="spac-ver.mkiv"> <cd:arguments> <cd:keywords optional="yes"> <cd:resolve name="value-grid"/> @@ -69,7 +69,7 @@ </cd:arguments> </cd:command> - <cd:command name="snaptogrid" variant="list" file="spac-ver.mkiv"> + <cd:command name="snaptogrid" variant="list" level="document" category="layout" file="spac-ver.mkiv"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:inherit name="definegridsnapping"/> @@ -79,7 +79,7 @@ </cd:arguments> </cd:command> - <cd:command name="placeongrid" file="spac-ver.mkiv"> + <cd:command name="placeongrid" level="document" category="layout" file="spac-ver.mkiv"> <cd:arguments> <cd:keywords optional="yes"> <cd:resolve name="value-grid"/> @@ -88,7 +88,7 @@ </cd:arguments> </cd:command> - <cd:command name="placeongrid" variant="list" file="spac-ver.mkiv"> + <cd:command name="placeongrid" variant="list" level="document" category="layout" file="spac-ver.mkiv"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:inherit name="definegridsnapping"/> @@ -97,7 +97,7 @@ </cd:arguments> </cd:command> - <cd:command name="gridsnapping" type="environment" file="spac-ver.mkiv"> + <cd:command name="gridsnapping" type="environment" level="document" category="layout" file="spac-ver.mkiv"> <cd:arguments> <cd:keywords optional="yes"> <cd:resolve name="value-grid"/> @@ -105,7 +105,7 @@ </cd:arguments> </cd:command> - <cd:command name="gridsnapping" type="environment" variant="list" file="spac-ver.mkiv"> + <cd:command name="gridsnapping" type="environment" variant="list" level="document" category="layout" file="spac-ver.mkiv"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:inherit name="definegridsnapping"/> @@ -113,15 +113,15 @@ </cd:arguments> </cd:command> - <cd:command name="usegridparameter" file="spac-ver.mkiv"> + <cd:command name="usegridparameter" level="system" category="layout" file="spac-ver.mkiv"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="showgridsnapping" file="spac-ver.mkiv"/> + <cd:command name="showgridsnapping" level="document" category="layout" file="spac-ver.mkiv"/> - <cd:command name="basegrid" file="meta-grd.mkiv"> + <cd:command name="basegrid" level="document" category="graphics" file="meta-grd.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="nx"> @@ -178,7 +178,7 @@ </cd:arguments> </cd:command> - <cd:command name="grid" file="meta-grd.mkiv"> + <cd:command name="grid" level="document" category="graphics" file="meta-grd.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="basegrid"/> @@ -186,4 +186,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-help.xml b/tex/context/interface/mkiv/i-help.xml index d0c0aa103..6e8612c5a 100644 --- a/tex/context/interface/mkiv/i-help.xml +++ b/tex/context/interface/mkiv/i-help.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definehelp" file="scrn-hlp.mkvi"> + <cd:command name="definehelp" level="style" category="pdf" file="scrn-hlp.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setuphelp" file="scrn-hlp.mkvi"> + <cd:command name="setuphelp" level="style" category="pdf" file="scrn-hlp.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -23,9 +23,9 @@ </cd:arguments> </cd:command> - <cd:command name="help" generated="yes" variant="example" file="scrn-hlp.mkvi"> + <cd:command name="help" generated="yes" variant="instance" level="document" category="pdf" file="scrn-hlp.mkvi"> <cd:sequence> - <cd:variable value="help"/> + <cd:instance value="help"/> </cd:sequence> <cd:arguments> <cd:resolve name="keyword-reference-optional"/> @@ -33,46 +33,46 @@ <cd:resolve name="argument-text"/> </cd:arguments> <cd:instances> - <cd:constant value="helptext"/> + <cd:resolve name="instance-help"/> </cd:instances> </cd:command> - <cd:command name="help" type="environment" generated="yes" variant="example" file="scrn-hlp.mkvi"> + <cd:command name="help" type="environment" generated="yes" variant="instance" level="document" category="pdf" file="scrn-hlp.mkvi"> <cd:sequence> - <cd:variable value="help"/> + <cd:instance value="help"/> </cd:sequence> <cd:arguments> <cd:resolve name="keyword-reference-optional"/> </cd:arguments> <cd:instances> - <cd:constant value="helptext"/> + <cd:resolve name="instance-help"/> </cd:instances> </cd:command> - <cd:command name="doifelsehelp" file="scrn-hlp.mkvi"> + <cd:command name="doifelsehelp" level="system" category="pdf conditional" file="scrn-hlp.mkvi"> <cd:arguments> <cd:resolve name="argument-true"/> <cd:resolve name="argument-false"/> </cd:arguments> </cd:command> - <cd:command name="doifhelpelse" file="scrn-hlp.mkvi"> + <cd:command name="doifhelpelse" level="system" category="pdf conditional" file="scrn-hlp.mkvi"> <cd:arguments> <cd:resolve name="argument-true"/> <cd:resolve name="argument-false"/> </cd:arguments> </cd:command> - <cd:command name="placehelp" file="scrn-hlp.mkvi"/> + <cd:command name="placehelp" level="document" category="pdf" file="scrn-hlp.mkvi"/> - <cd:command name="showhelp" file="scrn-hlp.mkvi"> + <cd:command name="showhelp" level="document" category="pdf" file="scrn-hlp.mkvi"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="keyword-reference"/> </cd:arguments> </cd:command> - <cd:command name="helptext" file="scrn-hlp.mkvi"> + <cd:command name="helptext" level="document" category="pdf" file="scrn-hlp.mkvi"> <cd:arguments> <cd:resolve name="keyword-reference-optional"/> <cd:resolve name="argument-text"/> @@ -80,10 +80,10 @@ </cd:arguments> </cd:command> - <cd:command name="helptext" type="environment" file="scrn-hlp.mkvi"> + <cd:command name="helptext" type="environment" level="document" category="pdf" file="scrn-hlp.mkvi"> <cd:arguments> <cd:resolve name="keyword-reference-optional"/> </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-hemistich.xml b/tex/context/interface/mkiv/i-hemistich.xml new file mode 100644 index 000000000..a508c51f8 --- /dev/null +++ b/tex/context/interface/mkiv/i-hemistich.xml @@ -0,0 +1,92 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<?context-directive job ctxfile x-setups.ctx ?> + +<cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> + + <cd:command name="definehemistich" level="style" category="whitespace fonts" file="m-hemistich.mkiv"> + <cd:arguments> + <cd:resolve name="keyword-name"/> + <cd:resolve name="keyword-name-optional"/> + <cd:assignments list="yes" optional="yes"> + <cd:inherit name="setuphemistich"/> + </cd:assignments> + </cd:arguments> + </cd:command> + + <cd:command name="setuphemistich" level="style" category="whitespace fonts" file="m-hemistich.mkiv"> + <cd:arguments> + <cd:resolve name="keyword-name-list-optional"/> + <cd:assignments list="yes"> + <cd:parameter name="width"> + <cd:constant type="local" default="yes"/> + <cd:constant type="cd:dimension"/> + </cd:parameter> + <cd:parameter name="distance"> + <cd:constant type="cd:dimension"/> + </cd:parameter> + <cd:parameter name="separator"> + <cd:constant type="cd:command"/> + </cd:parameter> + <cd:parameter name="leftstyle"> + <cd:resolve name="value-style"/> + </cd:parameter> + <cd:parameter name="leftcolor"> + <cd:constant type="cd:color"/> + </cd:parameter> + <cd:parameter name="rightstyle"> + <cd:resolve name="value-style"/> + </cd:parameter> + <cd:parameter name="rightcolor"> + <cd:constant type="cd:color"/> + </cd:parameter> + <cd:parameter name="separatorstyle"> + <cd:resolve name="value-style"/> + </cd:parameter> + <cd:parameter name="separatorcolor"> + <cd:constant type="cd:color"/> + </cd:parameter> + </cd:assignments> + </cd:arguments> + </cd:command> + + <cd:command name="hemistiches" level="document" category="whitespace fonts" file="m-hemistich.mkiv"> + <cd:arguments> + <cd:resolve name="keyword-name-optional"/> + <cd:resolve name="argument-text"/> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="hemistiches" variant="assignment" level="document" category="whitespace fonts" file="m-hemistich.mkiv"> + <cd:arguments> + <cd:assignments list="yes" optional="yes"> + <cd:inherit name="setuphemistich"/> + </cd:assignments> + <cd:resolve name="argument-text"/> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="hemistich" generated="yes" variant="instance" level="document" category="whitespace fonts" file="m-hemistich.mkiv"> + <cd:sequence> + <cd:instance value="hemistich"/> + </cd:sequence> + <cd:arguments> + <cd:resolve name="argument-text"/> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="hemistichescaesura" level="document" category="whitespace fonts" file="m-hemistich.mkiv"> + <cd:arguments> + <cd:resolve name="argument-text"/> + <cd:keywords delimiters="braces"> + <cd:constant type="cd:text"/> + <cd:constant type="cd:command"/> + </cd:keywords> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-highlight.xml b/tex/context/interface/mkiv/i-highlight.xml index 7a990b13b..9da39818e 100644 --- a/tex/context/interface/mkiv/i-highlight.xml +++ b/tex/context/interface/mkiv/i-highlight.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definehighlight" file="core-sys.mkiv"> + <cd:command name="definehighlight" level="style" category="fonts colors" file="core-sys.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setuphighlight" file="core-sys.mkiv"> + <cd:command name="setuphighlight" level="style" category="fonts colors" file="core-sys.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -32,7 +32,7 @@ </cd:arguments> </cd:command> - <cd:command name="highlight" generated="yes" variant="example" file="core-sys.mkiv"> + <cd:command name="highlight" generated="yes" variant="example" level="document" category="fonts colors" file="core-sys.mkiv"> <cd:sequence> <cd:variable value="highlight"/> </cd:sequence> @@ -41,24 +41,24 @@ </cd:arguments> </cd:command> - <cd:command name="highlight" file="core-sys.mkiv"> + <cd:command name="highlight" level="document" category="fonts colors" file="core-sys.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="highlight" type="environment" file="core-sys.mkiv"> + <cd:command name="highlight" type="environment" level="document" category="fonts colors" file="core-sys.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="directhighlight" file="core-sys.mkiv"> + <cd:command name="directhighlight" level="document" category="fonts colors" file="core-sys.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-hspace.xml b/tex/context/interface/mkiv/i-hspace.xml index 9b9c777a5..c1626e7b1 100644 --- a/tex/context/interface/mkiv/i-hspace.xml +++ b/tex/context/interface/mkiv/i-hspace.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definehspace" file="spac-hor.mkiv"> + <cd:command name="definehspace" level="style" category="whitespace" file="spac-hor.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:resolve name="keyword-name"/> @@ -12,7 +12,7 @@ </cd:arguments> </cd:command> - <cd:command name="hspace" file="spac-hor.mkiv"> + <cd:command name="hspace" level="document" category="whitespace" file="spac-hor.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:keywords optional="yes"> @@ -40,29 +40,29 @@ </cd:arguments> </cd:command> - <cd:command name="hairspace" file="spac-hor.mkiv"/> + <cd:command name="hairspace" level="style" category="whitespace" file="spac-hor.mkiv"/> - <cd:command name="thinspace" file="spac-hor.mkiv"/> + <cd:command name="thinspace" level="style" category="whitespace" file="spac-hor.mkiv"/> - <cd:command name="medspace" file="spac-hor.mkiv"/> + <cd:command name="medspace" level="style" category="whitespace" file="spac-hor.mkiv"/> - <cd:command name="thickspace" file="spac-hor.mkiv"/> + <cd:command name="thickspace" level="style" category="whitespace" file="spac-hor.mkiv"/> - <cd:command name="autoinsertnextspace" file="spac-hor.mkiv"/> + <cd:command name="autoinsertnextspace" level="style" category="whitespace" file="spac-hor.mkiv"/> - <cd:command name="hglue" file="spac-ver.mkiv"> + <cd:command name="hglue" level="system" category="whitespace" file="spac-ver.mkiv"> <cd:arguments> <cd:resolve name="string-dimension"/> </cd:arguments> </cd:command> - <cd:command name="frenchspacing" file="spac-hor.mkiv"/> + <cd:command name="frenchspacing" level="system" category="whitespace" file="spac-hor.mkiv"/> - <cd:command name="newfrenchspacing" file="spac-hor.mkiv"/> + <cd:command name="newfrenchspacing" level="system" category="whitespace" file="spac-hor.mkiv"/> - <cd:command name="nonfrenchspacing" file="spac-hor.mkiv"/> + <cd:command name="nonfrenchspacing" level="system" category="whitespace" file="spac-hor.mkiv"/> - <cd:command name="setupspacing" file="spac-hor.mkiv"> + <cd:command name="setupspacing" level="style" category="whitespace" file="spac-hor.mkiv"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="fixed"/> @@ -72,45 +72,45 @@ </cd:arguments> </cd:command> - <cd:command name="space" file="spac-hor.mkiv"/> + <cd:command name="space" level="style" category="whitespace" file="spac-hor.mkiv"/> - <cd:command name="removelastspace" file="spac-hor.mkiv"/> + <cd:command name="removelastspace" level="system" category="whitespace" file="spac-hor.mkiv"/> - <cd:command name="nospace" file="spac-hor.mkiv"/> + <cd:command name="nospace" level="system" category="whitespace" file="spac-hor.mkiv"/> - <cd:command name="fixedspace" file="spac-hor.mkiv"/> + <cd:command name="fixedspace" level="document" category="whitespace" file="spac-hor.mkiv"/> - <cd:command name="fixedspaces" file="spac-hor.mkiv"/> + <cd:command name="fixedspaces" level="system" category="whitespace" file="spac-hor.mkiv"/> - <cd:command name="keepunwantedspaces" file="spac-hor.mkiv"/> + <cd:command name="keepunwantedspaces" level="system" category="whitespace" file="spac-hor.mkiv"/> - <cd:command name="removeunwantedspaces" file="spac-hor.mkiv"/> + <cd:command name="removeunwantedspaces" level="system" category="whitespace" file="spac-hor.mkiv"/> - <cd:command name="thinspace" file="spac-hor.mkiv"/> + <cd:command name="thinspace" level="style" category="whitespace" file="spac-hor.mkiv"/> - <cd:command name="negthinspace" file="spac-hor.mkiv"/> + <cd:command name="negthinspace" level="style" category="whitespace" file="spac-hor.mkiv"/> - <cd:command name="enspace" file="spac-hor.mkiv"/> + <cd:command name="enspace" level="style" category="whitespace" file="spac-hor.mkiv"/> - <cd:command name="enskip" file="spac-hor.mkiv"/> + <cd:command name="enskip" level="style" category="whitespace" file="spac-hor.mkiv"/> - <cd:command name="quad" file="spac-hor.mkiv"/> + <cd:command name="quad" level="style" category="whitespace" file="spac-hor.mkiv"/> - <cd:command name="qquad" file="spac-hor.mkiv"/> + <cd:command name="qquad" level="style" category="whitespace" file="spac-hor.mkiv"/> - <cd:command name="emspace" file="spac-hor.mkiv"/> + <cd:command name="emspace" level="style" category="whitespace" file="spac-hor.mkiv"/> - <cd:command name="dotfskip" file="spac-hor.mkiv"> + <cd:command name="dotfskip" level="system" category="whitespace" file="spac-hor.mkiv"> <cd:arguments> <cd:resolve name="argument-dimension"/> </cd:arguments> </cd:command> - <cd:command name="leftskipadaption" file="spac-hor.mkiv"/> + <cd:command name="leftskipadaption" level="system" category="whitespace layout" file="spac-hor.mkiv"/> - <cd:command name="rightskipadaption" file="spac-hor.mkiv"/> + <cd:command name="rightskipadaption" level="system" category="whitespace layout" file="spac-hor.mkiv"/> - <cd:command name="dosetleftskipadaption" file="spac-hor.mkiv"> + <cd:command name="dosetleftskipadaption" level="system" category="whitespace layout" file="spac-hor.mkiv"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:resolve name="value-leftskip"/> @@ -118,7 +118,7 @@ </cd:arguments> </cd:command> - <cd:command name="dosetrightskipadaption" file="spac-hor.mkiv"> + <cd:command name="dosetrightskipadaption" level="system" category="whitespace layout" file="spac-hor.mkiv"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:resolve name="value-rightskip"/> @@ -126,7 +126,7 @@ </cd:arguments> </cd:command> - <cd:command name="doadaptleftskip" file="spac-hor.mkiv"> + <cd:command name="doadaptleftskip" level="system" category="whitespace layout" file="spac-hor.mkiv"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:resolve name="value-leftskip"/> @@ -134,7 +134,7 @@ </cd:arguments> </cd:command> - <cd:command name="doadaptrightskip" file="spac-hor.mkiv"> + <cd:command name="doadaptrightskip" level="system" category="whitespace layout" file="spac-hor.mkiv"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:resolve name="value-rightskip"/> @@ -142,7 +142,7 @@ </cd:arguments> </cd:command> - <cd:command name="activatespacehandler" file="spac-hor.mkiv"> + <cd:command name="activatespacehandler" level="system" category="whitespace" file="spac-hor.mkiv"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="on"/> @@ -156,10 +156,10 @@ </cd:arguments> </cd:command> - <cd:command name="quads" file="spac-hor.mkiv"> + <cd:command name="quads" level="style" category="whitespace" file="spac-hor.mkiv"> <cd:arguments> <cd:resolve name="keyword-number-optional"/> </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-hyphenation.xml b/tex/context/interface/mkiv/i-hyphenation.xml index 36cbc67e4..75cdbae75 100644 --- a/tex/context/interface/mkiv/i-hyphenation.xml +++ b/tex/context/interface/mkiv/i-hyphenation.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="setuphyphenation" file="lang-hyp.mkiv"> + <cd:command name="setuphyphenation" level="style" category="language" file="lang-hyp.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="method"> @@ -20,7 +20,7 @@ </cd:arguments> </cd:command> - <cd:command name="hyphenation" type="environment" file="lang-hyp.mkiv"> + <cd:command name="hyphenation" type="environment" level="style" category="language" file="lang-hyp.mkiv"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="original"/> @@ -34,7 +34,7 @@ </cd:arguments> </cd:command> - <cd:command name="definehypenationfeatures" file="lang-hyp.mkiv"> + <cd:command name="definehypenationfeatures" level="style" category="language" file="lang-hyp.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes"> @@ -88,7 +88,7 @@ </cd:arguments> </cd:command> - <cd:command name="sethyphenationfeatures" file="lang-hyp.mkiv"> + <cd:command name="sethyphenationfeatures" level="style" category="language" file="lang-hyp.mkiv"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -97,37 +97,37 @@ </cd:arguments> </cd:command> - <cd:command name="resethyphenationfeatures" file="lang-hyp.mkiv"/> + <cd:command name="resethyphenationfeatures" level="style" category="language" file="lang-hyp.mkiv"/> - <cd:command name="registerhyphenationpattern" file="lang-hyp.mkiv"> + <cd:command name="registerhyphenationpattern" level="style" category="language" file="lang-hyp.mkiv"> <cd:arguments> <cd:resolve name="keyword-language-optional"/> <cd:resolve name="keyword-text"/> </cd:arguments> </cd:command> - <cd:command name="unregisterhyphenationpattern" file="lang-hyp.mkiv"> + <cd:command name="unregisterhyphenationpattern" level="style" category="language" file="lang-hyp.mkiv"> <cd:arguments> <cd:resolve name="keyword-language-optional"/> <cd:resolve name="keyword-text"/> </cd:arguments> </cd:command> - <cd:command name="showhyphenationtrace" file="lang-hyp.mkiv"> + <cd:command name="showhyphenationtrace" level="document" category="language" file="lang-hyp.mkiv"> <cd:arguments> <cd:resolve name="keyword-language-optional"/> <cd:resolve name="keyword-text"/> </cd:arguments> </cd:command> - <cd:command name="registerhyphenationexception" file="lang-hyp.mkiv"> + <cd:command name="registerhyphenationexception" level="style" category="language" file="lang-hyp.mkiv"> <cd:arguments> <cd:resolve name="keyword-language-optional"/> <cd:resolve name="keyword-text"/> </cd:arguments> </cd:command> - <cd:command name="setuphyphenmark" file="typo-del.mkiv"> + <cd:command name="setuphyphenmark" level="style" category="language" file="typo-del.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="sign"> @@ -138,13 +138,13 @@ </cd:arguments> </cd:command> - <cd:command name="definebreakpoints" file="typo-brk.mkiv"> + <cd:command name="definebreakpoints" level="style" category="language" file="typo-brk.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="definebreakpoint" file="typo-brk.mkiv"> + <cd:command name="definebreakpoint" level="style" category="language" file="typo-brk.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:keywords> @@ -184,7 +184,7 @@ </cd:arguments> </cd:command> - <cd:command name="setbreakpoints" file="typo-brk.mkiv"> + <cd:command name="setbreakpoints" level="style" category="language" file="typo-brk.mkiv"> <cd:arguments> <cd:keywords> <cd:constant type="reset"/> @@ -193,72 +193,72 @@ </cd:arguments> </cd:command> - <cd:command name="resetbreakpoints" file="typo-brk.mkiv"/> + <cd:command name="resetbreakpoints" level="style" category="language" file="typo-brk.mkiv"/> - <cd:command name="showhyphens" file="supp-box.mkiv"> + <cd:command name="showhyphens" level="document" category="language" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="hyphenatedword" file="supp-box.mkiv"> + <cd:command name="hyphenatedword" level="document" category="language" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="hyphenatedpar" file="supp-box.mkiv"> + <cd:command name="hyphenatedpar" level="document" category="language" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="hyphenatedfile" file="supp-box.mkiv"> + <cd:command name="hyphenatedfile" level="document" category="language" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="argument-file"/> </cd:arguments> </cd:command> - <cd:command name="hyphenatedcoloredword" file="supp-box.mkiv"> + <cd:command name="hyphenatedcoloredword" level="document" category="language" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="hyphenatedhbox" file="supp-box.mkiv"> + <cd:command name="hyphenatedhbox" level="document" category="language" file="supp-box.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="sethyphenatedurlbefore" file="lang-url.mkiv"> + <cd:command name="sethyphenatedurlbefore" level="style" category="language" file="lang-url.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="sethyphenatedurlafter" file="lang-url.mkiv"> + <cd:command name="sethyphenatedurlafter" level="style" category="language" file="lang-url.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="sethyphenatedurlnormal" file="lang-url.mkiv"> + <cd:command name="sethyphenatedurlnormal" level="style" category="language" file="lang-url.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="hyphenatedurl" file="lang-url.mkiv"> + <cd:command name="hyphenatedurl" level="document" category="language" file="lang-url.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="hyphenatedfilename" file="lang-url.mkiv"> + <cd:command name="hyphenatedfilename" level="document" category="language" file="lang-url.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-imposition.xml b/tex/context/interface/mkiv/i-imposition.xml index b4bd4dee5..98fdcf253 100644 --- a/tex/context/interface/mkiv/i-imposition.xml +++ b/tex/context/interface/mkiv/i-imposition.xml @@ -4,14 +4,14 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="installshipoutmethod" file="page-imp.mkiv"> + <cd:command name="installshipoutmethod" level="system" category="layout" file="page-imp.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-command"/> </cd:arguments> </cd:command> - <cd:command name="invokepageheandler" file="page-imp.mkiv"> + <cd:command name="invokepageheandler" level="system" category="layout" file="page-imp.mkiv"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="normal"/> @@ -22,7 +22,7 @@ </cd:arguments> </cd:command> - <cd:command name="setuparranging" file="page-imp.mkiv"> + <cd:command name="setuparranging" level="style" category="layout" file="page-imp.mkiv"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="disable"/> @@ -68,7 +68,7 @@ </cd:arguments> </cd:command> - <cd:command name="installpagearrangement" file="page-imp.mkiv"> + <cd:command name="installpagearrangement" level="system" category="layout" file="page-imp.mkiv"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:name"/> @@ -77,6 +77,6 @@ </cd:arguments> </cd:command> - <cd:command name="arrangedpages" type="environment" begin="push" end="pop" file="page-imp.mkiv"/> + <cd:command name="arrangedpages" type="environment" begin="push" end="pop" level="system" category="layout" file="page-imp.mkiv"/> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-indent.xml b/tex/context/interface/mkiv/i-indent.xml index 7e2fb5ca3..ed91b9193 100644 --- a/tex/context/interface/mkiv/i-indent.xml +++ b/tex/context/interface/mkiv/i-indent.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="defineindenting" file="spac-hor.mkiv"> + <cd:command name="defineindenting" level="style" category="whitespace" file="spac-hor.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:keywords list="yes"> @@ -29,7 +29,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupindenting" file="spac-hor.mkiv"> + <cd:command name="setupindenting" level="style" category="whitespace" file="spac-hor.mkiv"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="small" prefix="cd:sign" method="none"/> @@ -54,21 +54,21 @@ </cd:arguments> </cd:command> - <cd:command name="synchronizeindenting" file="spac-hor.mkiv"/> + <cd:command name="synchronizeindenting" level="system" category="whitespace" file="spac-hor.mkiv"/> - <cd:command name="useindentingparameter" file="spac-hor.mkiv"> + <cd:command name="useindentingparameter" level="system" category="whitespace" file="spac-hor.mkiv"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="indentation" file="spac-hor.mkiv" coreprimitive="yes"/> + <cd:command name="indentation" coreprimitive="yes" level="document" category="whitespace" file="spac-hor.mkiv"/> - <cd:command name="noindentation" file="spac-hor.mkiv" coreprimitive="yes"/> + <cd:command name="noindentation" coreprimitive="yes" level="document" category="whitespace" file="spac-hor.mkiv"/> - <cd:command name="doindentation" file="spac-hor.mkiv" coreprimitive="yes"/> + <cd:command name="doindentation" coreprimitive="yes" level="system" category="whitespace" file="spac-hor.mkiv"/> - <cd:command name="checknextindentation" file="spac-hor.mkiv"> + <cd:command name="checknextindentation" level="system" category="whitespace" file="spac-hor.mkiv"> <cd:arguments> <cd:keywords> <cd:constant type="yes"/> @@ -78,14 +78,14 @@ </cd:arguments> </cd:command> - <cd:command name="useindentnextparameter" file="spac-hor.mkiv"> + <cd:command name="useindentnextparameter" level="system" category="whitespace" file="spac-hor.mkiv"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="dorechecknextindentation" file="spac-hor.mkiv"/> + <cd:command name="dorechecknextindentation" level="system" category="whitespace" file="spac-hor.mkiv"/> - <cd:command name="indentation" type="environment" begin="push" end="pop" file="spac-hor.mkiv"/> + <cd:command name="indentation" type="environment" begin="push" end="pop" level="system" category="whitespace" file="spac-hor.mkiv"/> </cd:interface> diff --git a/tex/context/interface/mkiv/i-indentedtext.xml b/tex/context/interface/mkiv/i-indentedtext.xml index 98812d5e0..8d19c321f 100644 --- a/tex/context/interface/mkiv/i-indentedtext.xml +++ b/tex/context/interface/mkiv/i-indentedtext.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="defineindentedtext" file="strc-ind.mkiv"> + <cd:command name="defineindentedtext" level="style" category="structure" file="strc-ind.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupindentedtext" file="strc-ind.mkiv"> + <cd:command name="setupindentedtext" level="style" category="structure" file="strc-ind.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -57,16 +57,16 @@ </cd:arguments> </cd:command> - <cd:command name="indentedtext" type="environment" generated="yes" variant="example" file="strc-ind.mkiv"> + <cd:command name="indentedtext" type="environment" generated="yes" variant="example" level="document" category="structure" file="strc-ind.mkiv"> <cd:sequence> <cd:variable value="indentedtext"/> </cd:sequence> </cd:command> - <cd:command name="indentedtext" type="environment" file="strc-ind.mkiv"> + <cd:command name="indentedtext" type="environment" level="document" category="structure" file="strc-ind.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-initial.xml b/tex/context/interface/mkiv/i-initial.xml index d50a7bc61..6c0dd7657 100644 --- a/tex/context/interface/mkiv/i-initial.xml +++ b/tex/context/interface/mkiv/i-initial.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="defineinitial" file="typo-drp.mkiv"> + <cd:command name="defineinitial" level="style" category="fonts" file="typo-drp.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupinitial" file="typo-drp.mkiv"> + <cd:command name="setupinitial" level="style" category="fonts" file="typo-drp.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -63,13 +63,13 @@ </cd:arguments> </cd:command> - <cd:command name="placeinitial" file="typo-drp.mkiv"> + <cd:command name="placeinitial" level="document" category="fonts" file="typo-drp.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> </cd:arguments> </cd:command> - <cd:command name="setinitial" file="typo-drp.mkiv"> + <cd:command name="setinitial" level="document" category="fonts" file="typo-drp.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:assignments list="yes" optional="yes"> diff --git a/tex/context/interface/mkiv/i-injector.xml b/tex/context/interface/mkiv/i-injector.xml index 321aa75c8..3728d7bb8 100644 --- a/tex/context/interface/mkiv/i-injector.xml +++ b/tex/context/interface/mkiv/i-injector.xml @@ -4,37 +4,37 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="resetinjector" file="typo-inj.mkiv"> + <cd:command name="resetinjector" level="system" file="typo-inj.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="markinjector" file="typo-inj.mkiv"> + <cd:command name="markinjector" level="system" file="typo-inj.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="checkinjector" file="typo-inj.mkiv"> + <cd:command name="checkinjector" level="system" file="typo-inj.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="checkpreviousinjector" file="typo-inj.mkiv"> + <cd:command name="checkpreviousinjector" level="system" file="typo-inj.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="checknextinjector" file="typo-inj.mkiv"> + <cd:command name="checknextinjector" level="system" file="typo-inj.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="setinjector" file="typo-inj.mkiv"> + <cd:command name="setinjector" level="document" file="typo-inj.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-number-list"/> @@ -42,7 +42,7 @@ </cd:arguments> </cd:command> - <cd:command name="showinjector" file="typo-inj.mkiv"> + <cd:command name="showinjector" level="document" file="typo-inj.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> </cd:arguments> @@ -50,19 +50,19 @@ <!-- - <cd:command name="doinstallinjector" file="typo-inj.mkiv"> + <cd:command name="doinstallinjector" level="system" file="typo-inj.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="doactivateinjector" file="typo-inj.mkiv"> + <cd:command name="doactivateinjector" level="system" file="typo-inj.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="dotestinjector" file="typo-inj.mkiv"> + <cd:command name="dotestinjector" level="system" file="typo-inj.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> @@ -70,4 +70,4 @@ --> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-insertion.xml b/tex/context/interface/mkiv/i-insertion.xml index 9250c9ebf..c8c4ed721 100644 --- a/tex/context/interface/mkiv/i-insertion.xml +++ b/tex/context/interface/mkiv/i-insertion.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="defineinsertion" file="page-ins.mkiv"> + <cd:command name="defineinsertion" level="system" category="structure" file="page-ins.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupinsertion" file="page-ins.mkiv"> + <cd:command name="setupinsertion" level="system" category="structure" file="page-ins.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -29,7 +29,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifelseinsertion" file="page-ins.mkiv"> + <cd:command name="doifelseinsertion" level="system" category="structure conditional" file="page-ins.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -37,7 +37,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifinsertionelse" file="page-ins.mkiv"> + <cd:command name="doifinsertionelse" level="system" category="structure conditional" file="page-ins.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -45,4 +45,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-interaction.xml b/tex/context/interface/mkiv/i-interaction.xml index 1c3285b84..2496e5d94 100644 --- a/tex/context/interface/mkiv/i-interaction.xml +++ b/tex/context/interface/mkiv/i-interaction.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="defineinteraction" file="scrn-ini.mkvi"> + <cd:command name="defineinteraction" level="style" category="pdf" file="scrn-ini.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupinteraction" file="scrn-ini.mkvi"> + <cd:command name="setupinteraction" level="style" category="pdf" file="scrn-ini.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -119,13 +119,13 @@ </cd:arguments> </cd:command> - <cd:command name="setupinteraction" variant="name" file="scrn-ini.mkvi"> + <cd:command name="setupinteraction" variant="name" level="style" category="pdf" file="scrn-ini.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> </cd:arguments> </cd:command> - <cd:command name="interaction" type="environment" file="scrn-ini.mkvi"> + <cd:command name="interaction" type="environment" level="system" category="pdf" file="scrn-ini.mkvi"> <cd:arguments> <cd:keywords> <cd:constant type="hidden"/> @@ -134,7 +134,7 @@ </cd:arguments> </cd:command> - <cd:command name="setinteraction" file="scrn-ini.mkvi"> + <cd:command name="setinteraction" level="system" category="pdf" file="scrn-ini.mkvi"> <cd:arguments> <cd:keywords> <cd:constant type="hidden"/> @@ -143,18 +143,18 @@ </cd:arguments> </cd:command> - <cd:command name="doifelselocation" file="scrn-ini.mkvi"> + <cd:command name="doifelselocation" level="system" category="pdf conditional" file="scrn-ini.mkvi"> <cd:arguments> <cd:resolve name="argument-true"/> <cd:resolve name="argument-false"/> </cd:arguments> </cd:command> - <cd:command name="doiflocationelse" file="scrn-ini.mkvi"> + <cd:command name="doiflocationelse" level="system" category="pdf conditional" file="scrn-ini.mkvi"> <cd:arguments> <cd:resolve name="argument-true"/> <cd:resolve name="argument-false"/> </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-interactionbar.xml b/tex/context/interface/mkiv/i-interactionbar.xml index 67c31216a..e03d2a071 100644 --- a/tex/context/interface/mkiv/i-interactionbar.xml +++ b/tex/context/interface/mkiv/i-interactionbar.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="defineinteractionbar" file="scrn-bar.mkvi"> + <cd:command name="defineinteractionbar" level="style" category="pdf" file="scrn-bar.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupinteractionbar" file="scrn-bar.mkvi"> + <cd:command name="setupinteractionbar" level="style" category="pdf" file="scrn-bar.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -75,7 +75,7 @@ </cd:arguments> </cd:command> - <cd:command name="interactionbar" file="scrn-bar.mkvi"> + <cd:command name="interactionbar" level="style" category="pdf" file="scrn-bar.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:assignments list="yes" optional="yes"> @@ -84,7 +84,7 @@ </cd:arguments> </cd:command> - <cd:command name="interactionbuttons" file="scrn-bar.mkvi"> + <cd:command name="interactionbuttons" level="style" category="pdf" file="scrn-bar.mkvi"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupinteractionbar"/> @@ -97,4 +97,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-interactionmenu.xml b/tex/context/interface/mkiv/i-interactionmenu.xml index 22b928a5a..32fac36f9 100644 --- a/tex/context/interface/mkiv/i-interactionmenu.xml +++ b/tex/context/interface/mkiv/i-interactionmenu.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="defineinteractionmenu" file="scrn-but.mkvi"> + <cd:command name="defineinteractionmenu" level="style" category="pdf" file="scrn-but.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupinteractionmenu" file="scrn-but.mkvi"> + <cd:command name="setupinteractionmenu" level="style" category="pdf" file="scrn-but.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -125,7 +125,7 @@ <!-- - <cd:command name="setupinteractionmenus" file="scrn-but.mkvi"> + <cd:command name="setupinteractionmenus" level="style" category="pdf" file="scrn-but.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -136,13 +136,13 @@ --> - <cd:command name="interactionmenu" type="environment" file="scrn-but.mkvi"> + <cd:command name="interactionmenu" type="environment" level="style" category="pdf" file="scrn-but.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="resetinteractionmenu" file="scrn-but.mkvi"> + <cd:command name="resetinteractionmenu" level="style" category="pdf" file="scrn-but.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> @@ -150,7 +150,7 @@ <!-- - <cd:command name="raw" scope="interactionmenu" file="scrn-but.mkvi"> + <cd:command name="raw" scope="interactionmenu" level="style" category="pdf" file="scrn-but.mkvi"> <cd:arguments> <cd:resolve name="keyword-reference"/> <cd:resolve name="string-text"/> @@ -158,13 +158,13 @@ </cd:arguments> </cd:command> - <cd:command name="raw" type="environment" scope="interactionmenu" file="scrn-but.mkvi"> + <cd:command name="raw" type="environment" scope="interactionmenu" level="style" category="pdf" file="scrn-but.mkvi"> <cd:arguments> <cd:resolve name="keyword-reference"/> </cd:arguments> </cd:command> - <cd:command name="but" scope="interactionmenu" file="scrn-but.mkvi"> + <cd:command name="but" scope="interactionmenu" level="style" category="pdf" file="scrn-but.mkvi"> <cd:arguments> <cd:resolve name="keyword-reference"/> <cd:resolve name="string-text"/> @@ -172,13 +172,13 @@ </cd:arguments> </cd:command> - <cd:command name="but" type="environment" scope="interactionmenu" file="scrn-but.mkvi"> + <cd:command name="but" type="environment" scope="interactionmenu" level="style" category="pdf" file="scrn-but.mkvi"> <cd:arguments> <cd:resolve name="keyword-reference"/> </cd:arguments> </cd:command> - <cd:command name="got" scope="interactionmenu" file="scrn-but.mkvi"> + <cd:command name="got" scope="interactionmenu" level="style" category="pdf" file="scrn-but.mkvi"> <cd:arguments> <cd:resolve name="keyword-reference"/> <cd:resolve name="string-text"/> @@ -186,38 +186,38 @@ </cd:arguments> </cd:command> - <cd:command name="got" type="environment" scope="interactionmenu" file="scrn-but.mkvi"> + <cd:command name="got" type="environment" scope="interactionmenu" level="style" category="pdf" file="scrn-but.mkvi"> <cd:arguments> <cd:resolve name="keyword-reference"/> </cd:arguments> </cd:command> - <cd:command name="nop" scope="interactionmenu" file="scrn-but.mkvi"> + <cd:command name="nop" scope="interactionmenu" level="style" category="pdf" file="scrn-but.mkvi"> <cd:arguments> <cd:resolve name="string-text"/> <cd:delimiter name="\"/> </cd:arguments> </cd:command> - <cd:command name="nop" type="environment" scope="interactionmenu" file="scrn-but.mkvi"/> + <cd:command name="nop" type="environment" scope="interactionmenu" level="style" category="pdf" file="scrn-but.mkvi"/> - <cd:command name="txt" scope="interactionmenu" file="scrn-but.mkvi"> + <cd:command name="txt" scope="interactionmenu" level="style" category="pdf" file="scrn-but.mkvi"> <cd:arguments> <cd:resolve name="string-text"/> <cd:delimiter name="\"/> </cd:arguments> </cd:command> - <cd:command name="txt" type="environment" scope="interactionmenu" file="scrn-but.mkvi"/> + <cd:command name="txt" type="environment" scope="interactionmenu" level="style" category="pdf" file="scrn-but.mkvi"/> - <cd:command name="rul" scope="interactionmenu" file="scrn-but.mkvi"> + <cd:command name="rul" scope="interactionmenu" level="style" category="pdf" file="scrn-but.mkvi"> <cd:arguments> <cd:resolve name="string-text"/> <cd:delimiter name="\"/> </cd:arguments> </cd:command> - <cd:command name="rul" type="environment" scope="interactionmenu" file="scrn-but.mkvi"/> + <cd:command name="rul" type="environment" scope="interactionmenu" level="style" category="pdf" file="scrn-but.mkvi"/> <cd:command name="com" scope="interactionmenu" file="scrn-but.mkvi"> <cd:arguments> @@ -226,17 +226,17 @@ </cd:arguments> </cd:command> - <cd:command name="com" type="environment" scope="interactionmenu" file="scrn-but.mkvi"/> + <cd:command name="com" type="environment" scope="interactionmenu" level="style" category="pdf" file="scrn-but.mkvi"/> --> - <cd:command name="includemenu" file="scrn-but.mkvi"> + <cd:command name="includemenu" level="style" category="pdf" file="scrn-but.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="interactionmenu" file="scrn-but.mkvi"> + <cd:command name="interactionmenu" level="style" category="pdf" file="scrn-but.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes" optional="yes"> @@ -245,7 +245,7 @@ </cd:arguments> </cd:command> - <cd:command name="menubutton" variant="interactionmenu" file="scrn-but.mkvi"> + <cd:command name="menubutton" variant="interactionmenu" level="style" category="pdf" file="scrn-but.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes" optional="yes"> @@ -258,7 +258,7 @@ </cd:arguments> </cd:command> - <cd:command name="menubutton" variant="button" file="scrn-but.mkvi"> + <cd:command name="menubutton" variant="button" level="style" category="pdf" file="scrn-but.mkvi"> <cd:arguments> <cd:assignments list="yes"> <cd:inherit name="setupbutton"/> @@ -270,11 +270,11 @@ </cd:arguments> </cd:command> - <cd:command name="registermenubuttons" file="scrn-but.mkvi"> + <cd:command name="registermenubuttons" level="system" category="pdf" file="scrn-but.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-text"/> </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-interactionscreen.xml b/tex/context/interface/mkiv/i-interactionscreen.xml index 6e337f6d6..bf26cd962 100644 --- a/tex/context/interface/mkiv/i-interactionscreen.xml +++ b/tex/context/interface/mkiv/i-interactionscreen.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="setupinteractionscreen" file="scrn-pag.mkvi"> + <cd:command name="setupinteractionscreen" level="style" category="pdf" file="scrn-pag.mkvi"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="width"> @@ -45,10 +45,15 @@ <cd:constant type="portrait"/> <cd:constant type="page"/> <cd:constant type="paper"/> + <cd:constant type="attachment"/> + <cd:constant type="layer"/> </cd:parameter> <cd:parameter name="copies"> <cd:constant type="cd:number"/> </cd:parameter> + <cd:parameter name="print"> + <cd:constant type="cd:list"/> + </cd:parameter> <cd:parameter name="delay"> <cd:constant type="none" default="yes"/> <cd:constant type="cd:number"/> @@ -57,7 +62,7 @@ </cd:arguments> </cd:command> - <cd:command name="screen" file="scrn-pag.mkvi"> + <cd:command name="screen" level="document" category="pdf" file="scrn-pag.mkvi"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:inherit name="page"/> diff --git a/tex/context/interface/mkiv/i-interface.xml b/tex/context/interface/mkiv/i-interface.xml index a9b35bbe5..66b48535e 100644 --- a/tex/context/interface/mkiv/i-interface.xml +++ b/tex/context/interface/mkiv/i-interface.xml @@ -4,13 +4,13 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="defaultinterface" file="mult-ini.mkiv"/> + <cd:command name="defaultinterface" level="system" file="mult-ini.mkiv"/> - <cd:command name="currentinterface" file="mult-ini.mkiv"/> + <cd:command name="currentinterface" level="system" file="mult-ini.mkiv"/> - <cd:command name="currentresponses" file="mult-ini.mkiv"/> + <cd:command name="currentresponses" level="system" file="mult-ini.mkiv"/> - <cd:command name="interface" type="environment" file="mult-ini.mkiv"> + <cd:command name="interface" type="environment" level="system" file="mult-ini.mkiv"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="all"/> @@ -19,53 +19,53 @@ </cd:arguments> </cd:command> - <cd:command name="defineinterfaceconstant" file="mult-ini.mkiv"> + <cd:command name="defineinterfaceconstant" level="system" file="mult-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="defineinterfacevariable" file="mult-ini.mkiv"> + <cd:command name="defineinterfacevariable" level="system" file="mult-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="defineinterfaceelement" file="mult-ini.mkiv"> + <cd:command name="defineinterfaceelement" level="system" file="mult-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="definefileconstant" file="mult-ini.mkiv"> + <cd:command name="definefileconstant" level="system" file="mult-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="definesystemconstant" file="mult-ini.mkiv"> + <cd:command name="definesystemconstant" level="system" file="mult-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="definemessageconstant" file="mult-ini.mkiv"> + <cd:command name="definemessageconstant" level="system" file="mult-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="definesystemvariable" file="mult-ini.mkiv"> + <cd:command name="definesystemvariable" level="system" file="mult-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="setinterfacemessage" file="mult-ini.mkiv"> + <cd:command name="setinterfacemessage" level="system" file="mult-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:keywords delimiters="braces"> @@ -77,7 +77,7 @@ </cd:arguments> </cd:command> - <cd:command name="setmessagetext" file="mult-ini.mkiv"> + <cd:command name="setmessagetext" level="system" file="mult-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:keywords delimiters="braces"> @@ -87,9 +87,9 @@ </cd:arguments> </cd:command> - <cd:command name="currentmessagetext" file="mult-ini.mkiv"/> + <cd:command name="currentmessagetext" level="system" file="mult-ini.mkiv"/> - <cd:command name="getmessage" file="mult-ini.mkiv"> + <cd:command name="getmessage" level="system" file="mult-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:keywords delimiters="braces"> @@ -99,7 +99,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifelsemessage" file="mult-ini.mkiv"> + <cd:command name="doifelsemessage" level="system" file="mult-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:keywords delimiters="braces"> @@ -111,7 +111,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifmessageelse" file="mult-ini.mkiv"> + <cd:command name="doifmessageelse" level="system" file="mult-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:keywords delimiters="braces"> @@ -123,7 +123,7 @@ </cd:arguments> </cd:command> - <cd:command name="showmessage" file="mult-ini.mkiv"> + <cd:command name="showmessage" level="system" file="mult-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:keywords delimiters="braces"> @@ -134,32 +134,32 @@ </cd:arguments> </cd:command> - <cd:command name="writestatus" file="mult-ini.mkiv"> + <cd:command name="writestatus" level="system" file="mult-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="message" file="mult-ini.mkiv"> + <cd:command name="message" level="system" file="mult-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="inlinemessage" file="mult-ini.mkiv"> + <cd:command name="inlinemessage" level="system" file="mult-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="displaymessage" file="mult-ini.mkiv"> + <cd:command name="displaymessage" level="system" file="mult-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="showwarning" file="mult-ini.mkiv"> + <cd:command name="showwarning" level="system" file="mult-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:keywords delimiters="braces"> @@ -170,28 +170,28 @@ </cd:arguments> </cd:command> - <cd:command name="setinterfaceconstant" file="mult-ini.mkiv"> + <cd:command name="setinterfaceconstant" level="system" file="mult-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="setinterfacevariable" file="mult-ini.mkiv"> + <cd:command name="setinterfacevariable" level="system" file="mult-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="setinterfaceelements" file="mult-ini.mkiv"> + <cd:command name="setinterfaceelement" level="system" file="mult-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="setinterfacecommand" file="mult-ini.mkiv"> + <cd:command name="setinterfacecommand" level="system" file="mult-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-name"/> @@ -199,4 +199,4 @@ </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-interlinespace.xml b/tex/context/interface/mkiv/i-interlinespace.xml index b93bac7f5..94911afb9 100644 --- a/tex/context/interface/mkiv/i-interlinespace.xml +++ b/tex/context/interface/mkiv/i-interlinespace.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="defineinterlinespace" file="spac-ver.mkiv"> + <cd:command name="defineinterlinespace" level="style" category="whitespace" file="spac-ver.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupinterlinespace" file="spac-ver.mkiv"> + <cd:command name="setupinterlinespace" level="style" category="whitespace" file="spac-ver.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -53,7 +53,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupinterlinespace" variant="argument" file="spac-ver.mkiv"> + <cd:command name="setupinterlinespace" variant="argument" level="style" category="whitespace" file="spac-ver.mkiv"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="on"/> @@ -69,13 +69,13 @@ </cd:arguments> </cd:command> - <cd:command name="setupinterlinespace" variant="name" file="spac-ver.mkiv"> + <cd:command name="setupinterlinespace" variant="name" level="style" category="whitespace" file="spac-ver.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="setuplocalinterlinespace" file="spac-ver.mkiv"> + <cd:command name="setuplocalinterlinespace" level="style" category="whitespace" file="spac-ver.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -84,7 +84,7 @@ </cd:arguments> </cd:command> - <cd:command name="setuplocalinterlinespace" variant="argument" file="spac-ver.mkiv"> + <cd:command name="setuplocalinterlinespace" variant="argument" level="style" category="whitespace" file="spac-ver.mkiv"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="on"/> @@ -100,13 +100,13 @@ </cd:arguments> </cd:command> - <cd:command name="setuplocalinterlinespace" variant="name" file="spac-ver.mkiv"> + <cd:command name="setuplocalinterlinespace" variant="name" level="style" category="whitespace" file="spac-ver.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="switchtointerlinespace" file="spac-ver.mkiv"> + <cd:command name="switchtointerlinespace" level="style" category="whitespace" file="spac-ver.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -115,7 +115,7 @@ </cd:arguments> </cd:command> - <cd:command name="switchtointerlinespace" variant="argument" file="spac-ver.mkiv"> + <cd:command name="switchtointerlinespace" variant="argument" level="style" category="whitespace" file="spac-ver.mkiv"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="on"/> @@ -131,13 +131,13 @@ </cd:arguments> </cd:command> - <cd:command name="switchtointerlinespace" variant="name" file="spac-ver.mkiv"> + <cd:command name="switchtointerlinespace" variant="name" level="style" category="whitespace" file="spac-ver.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="dosetupcheckedinterlinespace" file="spac-ver.mkiv"> + <cd:command name="dosetupcheckedinterlinespace" level="system" category="whitespace" file="spac-ver.mkiv"> <cd:arguments> <cd:assignments delimiters="braces" list="yes"> <cd:inherit name="setupinterlinespace"/> @@ -145,7 +145,7 @@ </cd:arguments> </cd:command> - <cd:command name="dosetupcheckedinterlinespace" variant="argument" file="spac-ver.mkiv"> + <cd:command name="dosetupcheckedinterlinespace" variant="argument" level="system" category="whitespace" file="spac-ver.mkiv"> <cd:arguments> <cd:keywords delimiters="braces" list="yes"> <cd:constant type="on"/> @@ -161,16 +161,16 @@ </cd:arguments> </cd:command> - <cd:command name="dosetupcheckedinterlinespace" variant="name" file="spac-ver.mkiv"> + <cd:command name="dosetupcheckedinterlinespace" variant="name" level="system" category="whitespace" file="spac-ver.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="useinterlinespaceparameter" file="spac-ver.mkiv"> + <cd:command name="useinterlinespaceparameter" level="system" category="whitespace" file="spac-ver.mkiv"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-ipsum.xml b/tex/context/interface/mkiv/i-ipsum.xml index f96fc5229..b3fb7cfdd 100644 --- a/tex/context/interface/mkiv/i-ipsum.xml +++ b/tex/context/interface/mkiv/i-ipsum.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="defineipsum" file="m-ipsum.mkiv"> + <cd:command name="defineipsum" level="style" file="m-ipsum.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupipsum" file="m-ipsum.mkiv"> + <cd:command name="setupipsum" level="style" file="m-ipsum.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -63,7 +63,7 @@ </cd:arguments> </cd:command> - <cd:command name="ipsum" file="m-ipsum.mkiv"> + <cd:command name="ipsum" level="document" file="m-ipsum.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:assignments list="yes" optional="yes"> @@ -72,7 +72,7 @@ </cd:arguments> </cd:command> - <cd:command name="directipsum" file="m-ipsum.mkiv"> + <cd:command name="directipsum" level="document" file="m-ipsum.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> diff --git a/tex/context/interface/mkiv/i-italiccorrection.xml b/tex/context/interface/mkiv/i-italiccorrection.xml index f8d711ae8..2d406bdf5 100644 --- a/tex/context/interface/mkiv/i-italiccorrection.xml +++ b/tex/context/interface/mkiv/i-italiccorrection.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="setitaliccorrection" file="typo-itc.mkvi"> + <cd:command name="setitaliccorrection" level="system" category="fonts" file="typo-itc.mkvi"> <cd:arguments> <cd:keywords> <cd:constant type="reset"/> @@ -14,11 +14,11 @@ </cd:arguments> </cd:command> - <cd:command name="resetitaliccorrection" file="typo-itc.mkvi"/> + <cd:command name="resetitaliccorrection" level="style" category="fonts" file="typo-itc.mkvi"/> - <cd:command name="italiccorrection" file="typo-itc.mkvi"/> + <cd:command name="italiccorrection" level="style" category="fonts" file="typo-itc.mkvi"/> - <cd:command name="setupitaliccorrection" file="typo-itc.mkvi"> + <cd:command name="setupitaliccorrection" level="style" category="fonts" file="typo-itc.mkvi"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="text"/> @@ -29,4 +29,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-itemgroup.xml b/tex/context/interface/mkiv/i-itemgroup.xml index 6fb28b635..84cae20bb 100644 --- a/tex/context/interface/mkiv/i-itemgroup.xml +++ b/tex/context/interface/mkiv/i-itemgroup.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="defineitemgroup" file="strc-itm.mkvi"> + <cd:command name="defineitemgroup" level="style" category="structure" file="strc-itm.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupitemgroup" file="strc-itm.mkvi"> + <cd:command name="setupitemgroup" level="style" category="structure counter" file="strc-itm.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:keywords list="yes" optional="yes"> @@ -43,6 +43,7 @@ <cd:constant type="joinedup"/> <cd:constant type="serried"/> <cd:constant type="stopper"/> + <cd:constant type="nostopper"/> <cd:constant type="unpacked"/> <cd:constant type="repeat"/> <cd:constant type="norepeat"/> @@ -193,12 +194,15 @@ <cd:parameter name="symcolor"> <cd:constant type="cd:color"/> </cd:parameter> - <cd:inherit name="setupcounter"/> + <cd:parameter name="grid"> + <cd:inherit name="definegridsnapping"/> + </cd:parameter> + <cd:inherit name="setupcounter"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command name="setupitemgroup" variant="assignment" file="strc-itm.mkvi"> + <cd:command name="setupitemgroup" variant="assignment" level="style" category="structure counter" file="strc-itm.mkvi"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -376,12 +380,15 @@ <cd:parameter name="symcolor"> <cd:constant type="cd:color"/> </cd:parameter> - <cd:inherit name="setupcounter"/> + <cd:parameter name="grid"> + <cd:inherit name="definegridsnapping"/> + </cd:parameter> + <cd:inherit name="setupcounter"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command name="setupitemgroups" file="strc-itm.mkvi"> + <cd:command name="setupitemgroups" level="style" category="structure counter" file="strc-itm.mkvi"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:name"/> @@ -393,7 +400,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupitemgroup" generated="yes" variant="instance" file="strc-itm.mkvi"> + <cd:command name="setupitemgroup" generated="yes" variant="instance" level="style" category="structure counter" file="strc-itm.mkvi"> <cd:sequence> <cd:string value="setup"/> <cd:instance value="itemgroup"/> @@ -415,7 +422,7 @@ </cd:instances> </cd:command> - <cd:command name="itemgroup" type="environment" generated="yes" variant="instance" file="strc-itm.mkvi"> + <cd:command name="itemgroup" type="environment" generated="yes" variant="instance" level="document" category="structure" file="strc-itm.mkvi"> <cd:sequence> <cd:instance value="itemgroup"/> </cd:sequence> @@ -432,7 +439,7 @@ </cd:instances> </cd:command> - <cd:command name="itemgroup" type="environment" file="strc-itm.mkvi"> + <cd:command name="itemgroup" type="environment" level="document" category="structure" file="strc-itm.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:keywords list="yes" optional="yes"> @@ -444,15 +451,15 @@ </cd:arguments> </cd:command> - <cd:command name="item" scope="itemgroup" file="strc-itm.mkvi"> + <cd:command name="item" scope="itemgroup" level="document" category="structure" file="strc-itm.mkvi"> <cd:arguments> <cd:resolve name="keyword-reference-list-optional"/> </cd:arguments> </cd:command> - <cd:command name="noitem" scope="itemgroup" file="strc-itm.mkvi"/> + <cd:command name="noitem" scope="itemgroup" level="document" category="structure" file="strc-itm.mkvi"/> - <cd:command name="itemtag" scope="itemgroup" file="strc-itm.mkvi"> + <cd:command name="itemtag" scope="itemgroup" level="document" category="structure" file="strc-itm.mkvi"> <cd:arguments> <cd:resolve name="keyword-reference-list-optional"/> </cd:arguments> @@ -460,36 +467,36 @@ <!-- - <cd:command name="itm" scope="itemgroup" file="strc-itm.mkvi"> + <cd:command name="itm" scope="itemgroup" level="document" category="structure" file="strc-itm.mkvi"> <cd:arguments> <cd:resolve name="keyword-reference-list-optional"/> </cd:arguments> </cd:command> - <cd:command name="but" scope="itemgroup" file="strc-itm.mkvi"> + <cd:command name="but" scope="itemgroup" level="document" category="structure" file="strc-itm.mkvi"> <cd:arguments> <cd:resolve name="keyword-reference"/> <cd:resolve name="keyword-reference-list-optional"/> </cd:arguments> </cd:command> - <cd:command name="nop" scope="itemgroup" file="strc-itm.mkvi"/> + <cd:command name="nop" scope="itemgroup" level="document" category="structure" file="strc-itm.mkvi"/> - <cd:command name="txt" scope="itemgroup" file="strc-itm.mkvi"> + <cd:command name="txt" scope="itemgroup" level="document" category="structure" file="strc-itm.mkvi"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="keyword-reference-list-optional"/> </cd:arguments> </cd:command> - <cd:command name="head" scope="itemgroup" file="strc-itm.mkvi"> + <cd:command name="head" scope="itemgroup" level="document" category="structure" file="strc-itm.mkvi"> <cd:arguments> <cd:resolve name="string-text"/> <cd:delimiter name="par"/> </cd:arguments> </cd:command> - <cd:command name="headsym" scope="itemgroup" file="strc-itm.mkvi"> + <cd:command name="headsym" scope="itemgroup" level="document" category="structure" file="strc-itm.mkvi"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="keyword-reference-list-optional"/> @@ -497,44 +504,44 @@ </cd:arguments> </cd:command> - <cd:command name="sym" scope="itemgroup" file="strc-itm.mkvi"> + <cd:command name="sym" scope="itemgroup" level="document" category="structure" file="strc-itm.mkvi"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="ran" scope="itemgroup" file="strc-itm.mkvi"> + <cd:command name="ran" scope="itemgroup" level="document" category="structure" file="strc-itm.mkvi"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="mar" scope="itemgroup" file="strc-itm.mkvi"> + <cd:command name="mar" scope="itemgroup" level="document" category="structure" file="strc-itm.mkvi"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="sub" scope="itemgroup" file="strc-itm.mkvi"/> + <cd:command name="sub" scope="itemgroup" level="document" category="structure" file="strc-itm.mkvi"/> - <cd:command name="its" scope="itemgroup" file="strc-itm.mkvi"/> + <cd:command name="its" scope="itemgroup" level="document" category="structure" file="strc-itm.mkvi"/> --> - <cd:command name="item" type="environment" scope="itemgroup" file="strc-itm.mkvi"> + <cd:command name="item" type="environment" scope="itemgroup" level="document" category="structure" file="strc-itm.mkvi"> <cd:arguments> <cd:resolve name="keyword-reference-list-optional"/> </cd:arguments> </cd:command> - <cd:command name="head" type="environment" scope="itemgroup" file="strc-itm.mkvi"> + <cd:command name="head" type="environment" scope="itemgroup" level="document" category="structure" file="strc-itm.mkvi"> <cd:arguments> <cd:resolve name="keyword-reference-list-optional"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="specialitem" type="environment" variant="item" scope="itemgroup" file="strc-itm.mkvi"> + <cd:command name="specialitem" type="environment" variant="item" scope="itemgroup" level="document" category="structure" file="strc-itm.mkvi"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="item" default="yes"/> @@ -543,7 +550,7 @@ </cd:arguments> </cd:command> - <cd:command name="specialitem" type="environment" variant="symbol" scope="itemgroup" file="strc-itm.mkvi"> + <cd:command name="specialitem" type="environment" variant="symbol" scope="itemgroup" level="document" category="structure" file="strc-itm.mkvi"> <cd:arguments> <cd:keywords> <cd:constant type="sym"/> @@ -554,7 +561,7 @@ </cd:arguments> </cd:command> - <cd:command name="specialitem" type="environment" variant="none" scope="itemgroup" file="strc-itm.mkvi"> + <cd:command name="specialitem" type="environment" variant="none" scope="itemgroup" level="document" category="structure" file="strc-itm.mkvi"> <cd:arguments> <cd:keywords> <cd:constant type="sub"/> @@ -565,7 +572,7 @@ <!-- - <cd:command name="itemize" type="environment" file="strc-itm.mkvi"> + <cd:command name="itemize" type="environment" level="document" category="structure" file="strc-itm.mkvi"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:inherit name="setupitemgroup"/> @@ -576,7 +583,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupitemize" file="strc-itm.mkvi"> + <cd:command name="setupitemize" level="style" category="structure" file="strc-itm.mkvi"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="each"/> diff --git a/tex/context/interface/mkiv/i-items.xml b/tex/context/interface/mkiv/i-items.xml index d3f68132a..ab50b669d 100644 --- a/tex/context/interface/mkiv/i-items.xml +++ b/tex/context/interface/mkiv/i-items.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="defineitems" file="typo-itm.mkiv"> + <cd:command name="defineitems" level="style" category="symbols" file="typo-itm.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupitems" file="typo-itm.mkiv"> + <cd:command name="setupitems" level="style" category="symbols" file="typo-itm.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -73,7 +73,7 @@ </cd:arguments> </cd:command> - <cd:command name="items" file="typo-itm.mkiv"> + <cd:command name="items" level="document" category="symbols" file="typo-itm.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupitems"/> @@ -82,4 +82,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-javascript.xml b/tex/context/interface/mkiv/i-javascript.xml index 965ed5388..e97c5109c 100644 --- a/tex/context/interface/mkiv/i-javascript.xml +++ b/tex/context/interface/mkiv/i-javascript.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="JScode" type="environment" file="java-ini.mkiv"> + <cd:command name="JScode" type="environment" level="system" category="pdf" file="java-ini.mkiv"> <cd:arguments> <cd:resolve name="string-name"/> <cd:keywords delimiters="none"> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="JSpreamble" type="environment" file="java-ini.mkiv"> + <cd:command name="JSpreamble" type="environment" level="system" category="pdf" file="java-ini.mkiv"> <cd:arguments> <cd:resolve name="string-name"/> <cd:keywords delimiters="none"> @@ -27,25 +27,25 @@ </cd:arguments> </cd:command> - <cd:command name="setJSpreamble" file="java-ini.mkiv"> + <cd:command name="setJSpreamble" level="system" category="pdf" file="java-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="addtoJSpreamble" file="java-ini.mkiv"> + <cd:command name="addtoJSpreamble" level="system" category="pdf" file="java-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="useJSscripts" file="java-ini.mkiv"> + <cd:command name="useJSscripts" level="style" category="pdf" file="java-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-file"/> <cd:resolve name="keyword-name-list-optional"/> </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-kerning.xml b/tex/context/interface/mkiv/i-kerning.xml index aacb4a6ea..b45e916f2 100644 --- a/tex/context/interface/mkiv/i-kerning.xml +++ b/tex/context/interface/mkiv/i-kerning.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definecharacterkerning" file="typo-krn.mkiv"> + <cd:command name="definecharacterkerning" level="style" category="fonts whitespace" file="typo-krn.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupcharacterkerning" file="typo-krn.mkiv"> + <cd:command name="setupcharacterkerning" level="style" category="fonts whitespace" file="typo-krn.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -38,7 +38,7 @@ </cd:arguments> </cd:command> - <cd:command name="setcharacterkerning" file="typo-krn.mkiv"> + <cd:command name="setcharacterkerning" level="style" category="fonts whitespace" file="typo-krn.mkiv"> <cd:arguments> <cd:keywords> <cd:constant type="reset"/> @@ -47,9 +47,9 @@ </cd:arguments> </cd:command> - <cd:command name="resetcharacterkerning" file="typo-krn.mkiv"/> + <cd:command name="resetcharacterkerning" level="style" category="fonts whitespace" file="typo-krn.mkiv"/> - <cd:command name="characterkerning" generated="yes" variant="example" file="typo-krn.mkiv"> + <cd:command name="characterkerning" generated="yes" variant="example" level="document" category="fonts whitespace" file="typo-krn.mkiv"> <cd:sequence> <cd:variable value="characterkerning"/> </cd:sequence> @@ -59,21 +59,21 @@ </cd:arguments> </cd:command> - <cd:command name="kerncharacters" file="typo-krn.mkiv"> + <cd:command name="kerncharacters" level="document" category="fonts whitespace" file="typo-krn.mkiv"> <cd:arguments> <cd:resolve name="keyword-number-optional"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="letterspacing" file="typo-krn.mkiv"> + <cd:command name="letterspacing" level="document" category="fonts whitespace" file="typo-krn.mkiv"> <cd:arguments> <cd:resolve name="keyword-number-optional"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="stretched" file="typo-krn.mkiv"> + <cd:command name="stretched" level="document" category="fonts whitespace" file="typo-krn.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupstretched"/> @@ -82,7 +82,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupstretched" file="typo-krn.mkiv"> + <cd:command name="setupstretched" level="style" category="fonts whitespace" file="typo-krn.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:inherit name="setupcharacterkerning"/> @@ -90,4 +90,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-label.xml b/tex/context/interface/mkiv/i-label.xml index fe7851d9d..a09360aa7 100644 --- a/tex/context/interface/mkiv/i-label.xml +++ b/tex/context/interface/mkiv/i-label.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definelabel" file="strc-lab.mkiv"> + <cd:command name="definelabel" level="style" category="structure" file="strc-lab.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setuplabel" file="strc-lab.mkiv"> + <cd:command name="setuplabel" level="style" category="structure" file="strc-lab.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -131,6 +131,12 @@ <cd:constant type="none"/> <cd:constant type="cd:dimension"/> </cd:parameter> + <cd:parameter name="stretch"> + <cd:constant type="cd:number"/> + </cd:parameter> + <cd:parameter name="shrink"> + <cd:constant type="cd:number"/> + </cd:parameter> <cd:parameter name="hang"> <cd:constant type="fit"/> <cd:constant type="broad"/> @@ -178,7 +184,7 @@ <!-- - <cd:command name="setuplabels" file="strc-lab.mkiv"> + <cd:command name="setuplabels" level="style" category="structure" file="strc-lab.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -189,7 +195,7 @@ --> - <cd:command name="label" generated="yes" variant="example" file="strc-lab.mkiv"> + <cd:command name="label" generated="yes" variant="example" level="document" category="structure" file="strc-lab.mkiv"> <cd:sequence> <cd:variable value="label"/> </cd:sequence> @@ -199,7 +205,7 @@ </cd:arguments> </cd:command> - <cd:command name="currentlabel" generated="yes" variant="example" file="strc-lab.mkiv"> + <cd:command name="currentlabel" generated="yes" variant="example" level="document" category="structure" file="strc-lab.mkiv"> <cd:sequence> <cd:string value="current"/> <cd:variable value="label"/> @@ -210,4 +216,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-labeltext.xml b/tex/context/interface/mkiv/i-labeltext.xml index 34c70231f..7ad6b6ba8 100644 --- a/tex/context/interface/mkiv/i-labeltext.xml +++ b/tex/context/interface/mkiv/i-labeltext.xml @@ -4,14 +4,14 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definelabelclass" file="lang-lab.mkiv"> + <cd:command name="definelabelclass" level="system" category="language" file="lang-lab.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-number-optional"/> </cd:arguments> </cd:command> - <cd:command name="setuplabeltext" generated="yes" variant="instance" file="lang-lab.mkiv"> + <cd:command name="setuplabeltext" generated="yes" variant="instance" level="style" category="language" file="lang-lab.mkiv"> <cd:sequence> <cd:string value="setup"/> <cd:instance value="label"/> @@ -26,7 +26,7 @@ </cd:instances> </cd:command> - <cd:command name="presetlabeltext" generated="yes" variant="instance" file="lang-lab.mkiv"> + <cd:command name="presetlabeltext" generated="yes" variant="instance" level="style" category="language" file="lang-lab.mkiv"> <cd:sequence> <cd:string value="preset"/> <cd:instance value="label"/> @@ -41,7 +41,7 @@ </cd:instances> </cd:command> - <cd:command name="copylabeltext" generated="yes" variant="instance" file="lang-lab.mkiv"> + <cd:command name="copylabeltext" generated="yes" variant="instance" level="style" category="language" file="lang-lab.mkiv"> <cd:sequence> <cd:string value="copy"/> <cd:instance value="label"/> @@ -56,7 +56,7 @@ </cd:instances> </cd:command> - <cd:command name="labeltext" type="environment" generated="yes" variant="instance" file="lang-lab.mkiv"> + <cd:command name="labeltext" type="environment" generated="yes" variant="instance" level="style" category="language" file="lang-lab.mkiv"> <cd:sequence> <cd:instance value="label"/> <cd:string value="text"/> @@ -70,7 +70,7 @@ </cd:instances> </cd:command> - <cd:command name="labellanguage" generated="yes" variant="instance" file="lang-lab.mkiv"> + <cd:command name="labellanguage" generated="yes" variant="instance" level="system" category="language" file="lang-lab.mkiv"> <cd:sequence> <cd:instance value="label"/> <cd:string value="language"/> @@ -80,7 +80,7 @@ </cd:instances> </cd:command> - <cd:command name="labeltext" generated="yes" variant="instance" file="lang-lab.mkiv"> + <cd:command name="labeltext" generated="yes" variant="instance" level="style" category="language" file="lang-lab.mkiv"> <cd:sequence> <cd:instance value="label"/> <cd:string value="text"/> @@ -93,7 +93,7 @@ </cd:instances> </cd:command> - <cd:command name="labeltexts" generated="yes" variant="instance" file="lang-lab.mkiv"> + <cd:command name="labeltexts" generated="yes" variant="instance" level="style" category="language" file="lang-lab.mkiv"> <cd:sequence> <cd:instance value="label"/> <cd:string value="texts"/> @@ -107,7 +107,7 @@ </cd:instances> </cd:command> - <cd:command name="leftlabeltext" generated="yes" variant="instance" file="lang-lab.mkiv"> + <cd:command name="leftlabeltext" generated="yes" variant="instance" level="style" category="language" file="lang-lab.mkiv"> <cd:sequence> <cd:string value="left"/> <cd:instance value="label"/> @@ -121,7 +121,7 @@ </cd:instances> </cd:command> - <cd:command name="rightlabeltext" generated="yes" variant="instance" file="lang-lab.mkiv"> + <cd:command name="rightlabeltext" generated="yes" variant="instance" level="style" category="language" file="lang-lab.mkiv"> <cd:sequence> <cd:string value="right"/> <cd:instance value="label"/> @@ -137,382 +137,382 @@ <!-- - <cd:command name="setuplabeltext" file="lang-lab.mkiv"> + <cd:command name="setuplabeltext" level="style" category="language" file="lang-lab.mkiv"> <cd:arguments> <cd:resolve name="keyword-language-optional"/> <cd:resolve name="assignment-userdata-list"/> </cd:arguments> </cd:command> - <cd:command name="presetlabeltext" file="lang-lab.mkiv"> + <cd:command name="presetlabeltext" level="style" category="language" file="lang-lab.mkiv"> <cd:arguments> <cd:resolve name="keyword-language-optional"/> <cd:resolve name="assignment-userdata-list"/> </cd:arguments> </cd:command> - <cd:command name="copylabeltext" file="lang-lab.mkiv"> + <cd:command name="copylabeltext" level="style" category="language" file="lang-lab.mkiv"> <cd:arguments> <cd:resolve name="keyword-language-optional"/> <cd:resolve name="assignment-labeldata-list"/> </cd:arguments> </cd:command> - <cd:command name="labeltext" type="environment" file="lang-lab.mkiv"> + <cd:command name="labeltext" type="environment" flevel="style" category="language" ile="lang-lab.mkiv"> <cd:arguments> <cd:resolve name="keyword-language-optional"/> <cd:resolve name="keyword-key"/> </cd:arguments> </cd:command> - <cd:command name="labellanguage" file="lang-lab.mkiv"/> + <cd:command name="labellanguage" level="system" category="language" file="lang-lab.mkiv"/> - <cd:command name="labeltext" file="lang-lab.mkiv"> + <cd:command name="labeltext" level="style" category="language" file="lang-lab.mkiv"> <cd:arguments> <cd:resolve name="argument-key"/> </cd:arguments> </cd:command> - <cd:command name="labeltexts" file="lang-lab.mkiv"> + <cd:command name="labeltexts" level="style" category="language" file="lang-lab.mkiv"> <cd:arguments> <cd:resolve name="argument-key"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="leftlabeltext" file="lang-lab.mkiv"> + <cd:command name="leftlabeltext" level="style" category="language" file="lang-lab.mkiv"> <cd:arguments> <cd:resolve name="argument-key"/> </cd:arguments> </cd:command> - <cd:command name="rightlabeltext" file="lang-lab.mkiv"> + <cd:command name="rightlabeltext" level="style" category="language" file="lang-lab.mkiv"> <cd:arguments> <cd:resolve name="argument-key"/> </cd:arguments> </cd:command> - <cd:command name="setupheadtext" file="lang-lab.mkiv"> + <cd:command name="setupheadtext" level="style" category="language" file="lang-lab.mkiv"> <cd:arguments> <cd:resolve name="keyword-language-optional"/> <cd:resolve name="assignment-userdata-list"/> </cd:arguments> </cd:command> - <cd:command name="presetheadtext" file="lang-lab.mkiv"> + <cd:command name="presetheadtext" level="style" category="language" file="lang-lab.mkiv"> <cd:arguments> <cd:resolve name="keyword-language-optional"/> <cd:resolve name="assignment-userdata-list"/> </cd:arguments> </cd:command> - <cd:command name="copyheadtext" file="lang-lab.mkiv"> + <cd:command name="copyheadtext" level="style" category="language" file="lang-lab.mkiv"> <cd:arguments> <cd:resolve name="keyword-language-optional"/> <cd:resolve name="assignment-labeldata-list"/> </cd:arguments> </cd:command> - <cd:command name="headtext" type="environment" file="lang-lab.mkiv"> + <cd:command name="headtext" type="environment" level="style" category="language" file="lang-lab.mkiv"> <cd:arguments> <cd:resolve name="keyword-language-optional"/> <cd:resolve name="keyword-key"/> </cd:arguments> </cd:command> - <cd:command name="headlanguage" file="lang-lab.mkiv"/> + <cd:command name="headlanguage" level="system" category="language" file="lang-lab.mkiv"/> - <cd:command name="headtext" file="lang-lab.mkiv"> + <cd:command name="headtext" level="style" category="language" file="lang-lab.mkiv"> <cd:arguments> <cd:resolve name="argument-key"/> </cd:arguments> </cd:command> - <cd:command name="headtexts" file="lang-lab.mkiv"> + <cd:command name="headtexts" level="style" category="language" file="lang-lab.mkiv"> <cd:arguments> <cd:resolve name="argument-key"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="leftheadtext" file="lang-lab.mkiv"> + <cd:command name="leftheadtext" level="style" category="language" file="lang-lab.mkiv"> <cd:arguments> <cd:resolve name="argument-key"/> </cd:arguments> </cd:command> - <cd:command name="rightheadtext" file="lang-lab.mkiv"> + <cd:command name="rightheadtext" level="style" category="language" file="lang-lab.mkiv"> <cd:arguments> <cd:resolve name="argument-key"/> </cd:arguments> </cd:command> - <cd:command name="setupmathlabeltext" file="lang-lab.mkiv"> + <cd:command name="setupmathlabeltext" level="style" category="language" file="lang-lab.mkiv"> <cd:arguments> <cd:resolve name="keyword-language-optional"/> <cd:resolve name="assignment-userdata-list"/> </cd:arguments> </cd:command> - <cd:command name="presetmathlabeltext" file="lang-lab.mkiv"> + <cd:command name="presetmathlabeltext" level="style" category="language" file="lang-lab.mkiv"> <cd:arguments> <cd:resolve name="keyword-language-optional"/> <cd:resolve name="assignment-userdata-list"/> </cd:arguments> </cd:command> - <cd:command name="copymathlabeltext" file="lang-lab.mkiv"> + <cd:command name="copymathlabeltext" level="style" category="language" file="lang-lab.mkiv"> <cd:arguments> <cd:resolve name="keyword-language-optional"/> <cd:resolve name="assignment-labeldata-list"/> </cd:arguments> </cd:command> - <cd:command name="mathlabeltext" type="environment" file="lang-lab.mkiv"> + <cd:command name="mathlabeltext" type="environment" level="style" category="language" file="lang-lab.mkiv"> <cd:arguments> <cd:resolve name="keyword-language-optional"/> <cd:resolve name="keyword-key"/> </cd:arguments> </cd:command> - <cd:command name="mathlabellanguage" file="lang-lab.mkiv"/> + <cd:command name="mathlabellanguage" level="system" category="language" file="lang-lab.mkiv"/> - <cd:command name="mathlabeltext" file="lang-lab.mkiv"> + <cd:command name="mathlabeltext" level="style" category="language" file="lang-lab.mkiv"> <cd:arguments> <cd:resolve name="argument-key"/> </cd:arguments> </cd:command> - <cd:command name="mathlabeltexts" file="lang-lab.mkiv"> + <cd:command name="mathlabeltexts" level="style" category="language" file="lang-lab.mkiv"> <cd:arguments> <cd:resolve name="argument-key"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="leftmathlabeltext" file="lang-lab.mkiv"> + <cd:command name="leftmathlabeltext" level="style" category="language" file="lang-lab.mkiv"> <cd:arguments> <cd:resolve name="argument-key"/> </cd:arguments> </cd:command> - <cd:command name="rightmathlabeltext" file="lang-lab.mkiv"> + <cd:command name="rightmathlabeltext" level="style" category="language" file="lang-lab.mkiv"> <cd:arguments> <cd:resolve name="argument-key"/> </cd:arguments> </cd:command> - <cd:command name="setuptaglabeltext" file="lang-lab.mkiv"> + <cd:command name="setuptaglabeltext" level="style" category="language" file="lang-lab.mkiv"> <cd:arguments> <cd:resolve name="keyword-language-optional"/> <cd:resolve name="assignment-userdata-list"/> </cd:arguments> </cd:command> - <cd:command name="presettaglabeltext" file="lang-lab.mkiv"> + <cd:command name="presettaglabeltext" level="style" category="language" file="lang-lab.mkiv"> <cd:arguments> <cd:resolve name="keyword-language-optional"/> <cd:resolve name="assignment-userdata-list"/> </cd:arguments> </cd:command> - <cd:command name="copytaglabeltext" file="lang-lab.mkiv"> + <cd:command name="copytaglabeltext" level="style" category="language" file="lang-lab.mkiv"> <cd:arguments> <cd:resolve name="keyword-language-optional"/> <cd:resolve name="assignment-labeldata-list"/> </cd:arguments> </cd:command> - <cd:command name="taglabeltext" type="environment" file="lang-lab.mkiv"> + <cd:command name="taglabeltext" type="environment" level="style" category="language" file="lang-lab.mkiv"> <cd:arguments> <cd:resolve name="keyword-language-optional"/> <cd:resolve name="keyword-key"/> </cd:arguments> </cd:command> - <cd:command name="taglabellanguage" file="lang-lab.mkiv"/> + <cd:command name="taglabellanguage" level="system" category="language" file="lang-lab.mkiv"/> - <cd:command name="taglabeltext" file="lang-lab.mkiv"> + <cd:command name="taglabeltext" level="style" category="language" file="lang-lab.mkiv"> <cd:arguments> <cd:resolve name="argument-key"/> </cd:arguments> </cd:command> - <cd:command name="setupunittext" file="phys-dim.mkiv"> + <cd:command name="setupunittext" level="style" category="language" file="phys-dim.mkiv"> <cd:arguments> <cd:resolve name="keyword-language-optional"/> <cd:resolve name="assignment-userdata-list"/> </cd:arguments> </cd:command> - <cd:command name="presetunittext" file="phys-dim.mkiv"> + <cd:command name="presetunittext" level="style" category="language" file="phys-dim.mkiv"> <cd:arguments> <cd:resolve name="keyword-language-optional"/> <cd:resolve name="assignment-userdata-list"/> </cd:arguments> </cd:command> - <cd:command name="copyunittext" file="phys-dim.mkiv"> + <cd:command name="copyunittext" level="style" category="language" file="phys-dim.mkiv"> <cd:arguments> <cd:resolve name="keyword-language-optional"/> <cd:resolve name="assignment-labeldata-list"/> </cd:arguments> </cd:command> - <cd:command name="unittext" type="environment" file="phys-dim.mkiv"> + <cd:command name="unittext" type="environment" level="style" category="language" file="phys-dim.mkiv"> <cd:arguments> <cd:resolve name="keyword-language-optional"/> <cd:resolve name="keyword-key"/> </cd:arguments> </cd:command> - <cd:command name="unitlanguage" file="phys-dim.mkiv"/> + <cd:command name="unitlanguage" level="system" category="language" file="phys-dim.mkiv"/> - <cd:command name="unittext" file="phys-dim.mkiv"> + <cd:command name="unittext" level="style" category="language" file="phys-dim.mkiv"> <cd:arguments> <cd:resolve name="argument-key"/> </cd:arguments> </cd:command> - <cd:command name="setupoperatortext" file="phys-dim.mkiv"> + <cd:command name="setupoperatortext" level="style" category="language" file="phys-dim.mkiv"> <cd:arguments> <cd:resolve name="keyword-language-optional"/> <cd:resolve name="assignment-userdata-list"/> </cd:arguments> </cd:command> - <cd:command name="presetoperatortext" file="phys-dim.mkiv"> + <cd:command name="presetoperatortext" level="style" category="language" file="phys-dim.mkiv"> <cd:arguments> <cd:resolve name="keyword-language-optional"/> <cd:resolve name="assignment-userdata-list"/> </cd:arguments> </cd:command> - <cd:command name="copyoperatortext" file="phys-dim.mkiv"> + <cd:command name="copyoperatortext" level="style" category="language" file="phys-dim.mkiv"> <cd:arguments> <cd:resolve name="keyword-language-optional"/> <cd:resolve name="assignment-labeldata-list"/> </cd:arguments> </cd:command> - <cd:command name="operatortext" type="environment" file="phys-dim.mkiv"> + <cd:command name="operatortext" type="environment" level="style" category="language" file="phys-dim.mkiv"> <cd:arguments> <cd:resolve name="keyword-language-optional"/> <cd:resolve name="keyword-key"/> </cd:arguments> </cd:command> - <cd:command name="operatorlanguage" file="phys-dim.mkiv"/> + <cd:command name="operatorlanguage" level="system" category="language" file="phys-dim.mkiv"/> - <cd:command name="operatortext" file="phys-dim.mkiv"> + <cd:command name="operatortext" level="style" category="language" file="phys-dim.mkiv"> <cd:arguments> <cd:resolve name="argument-key"/> </cd:arguments> </cd:command> - <cd:command name="setupprefixtext" file="phys-dim.mkiv"> + <cd:command name="setupprefixtext" level="style" category="language" file="phys-dim.mkiv"> <cd:arguments> <cd:resolve name="keyword-language-optional"/> <cd:resolve name="assignment-userdata-list"/> </cd:arguments> </cd:command> - <cd:command name="presetprefixtext" file="phys-dim.mkiv"> + <cd:command name="presetprefixtext" level="style" category="language" file="phys-dim.mkiv"> <cd:arguments> <cd:resolve name="keyword-language-optional"/> <cd:resolve name="assignment-userdata-list"/> </cd:arguments> </cd:command> - <cd:command name="copyprefixtext" file="phys-dim.mkiv"> + <cd:command name="copyprefixtext" level="style" category="language" file="phys-dim.mkiv"> <cd:arguments> <cd:resolve name="keyword-language-optional"/> <cd:resolve name="assignment-labeldata-list"/> </cd:arguments> </cd:command> - <cd:command name="prefixtext" type="environment" file="phys-dim.mkiv"> + <cd:command name="prefixtext" type="environment" level="style" category="language" file="phys-dim.mkiv"> <cd:arguments> <cd:resolve name="keyword-language-optional"/> <cd:resolve name="keyword-key"/> </cd:arguments> </cd:command> - <cd:command name="prefixlanguage" file="phys-dim.mkiv"/> + <cd:command name="prefixlanguage" level="system" category="language" file="phys-dim.mkiv"/> - <cd:command name="prefixtext" file="phys-dim.mkiv"> + <cd:command name="prefixtext" level="style" category="language" file="phys-dim.mkiv"> <cd:arguments> <cd:resolve name="argument-key"/> </cd:arguments> </cd:command> - <cd:command name="setupsuffixtext" file="phys-dim.mkiv"> + <cd:command name="setupsuffixtext" level="style" category="language" file="phys-dim.mkiv"> <cd:arguments> <cd:resolve name="keyword-language-optional"/> <cd:resolve name="assignment-userdata-list"/> </cd:arguments> </cd:command> - <cd:command name="presetsuffixtext" file="phys-dim.mkiv"> + <cd:command name="presetsuffixtext" level="style" category="language" file="phys-dim.mkiv"> <cd:arguments> <cd:resolve name="keyword-language-optional"/> <cd:resolve name="assignment-userdata-list"/> </cd:arguments> </cd:command> - <cd:command name="copysuffixtext" file="phys-dim.mkiv"> + <cd:command name="copysuffixtext" level="style" category="language" file="phys-dim.mkiv"> <cd:arguments> <cd:resolve name="keyword-language-optional"/> <cd:resolve name="assignment-labeldata-list"/> </cd:arguments> </cd:command> - <cd:command name="suffixtext" type="environment" file="phys-dim.mkiv"> + <cd:command name="suffixtext" type="environment" level="style" category="language" file="phys-dim.mkiv"> <cd:arguments> <cd:resolve name="keyword-language-optional"/> <cd:resolve name="keyword-key"/> </cd:arguments> </cd:command> - <cd:command name="suffixlanguage" file="phys-dim.mkiv"/> + <cd:command name="suffixlanguage" level="system" category="language" file="phys-dim.mkiv"/> - <cd:command name="suffixtext" file="phys-dim.mkiv"> + <cd:command name="suffixtext" level="style" category="language" file="phys-dim.mkiv"> <cd:arguments> <cd:resolve name="argument-key"/> </cd:arguments> </cd:command> - <cd:command name="setupbtxlabeltext" file="publ-ini.mkiv"> + <cd:command name="setupbtxlabeltext" level="style" category="language" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-language-optional"/> <cd:resolve name="assignment-userdata-list"/> </cd:arguments> </cd:command> - <cd:command name="presetbtxlabeltext" file="publ-ini.mkiv"> + <cd:command name="presetbtxlabeltext" level="style" category="language" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-language-optional"/> <cd:resolve name="assignment-userdata-list"/> </cd:arguments> </cd:command> - <cd:command name="copybtxlabeltext" file="publ-ini.mkiv"> + <cd:command name="copybtxlabeltext" level="style" category="language" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-language-optional"/> <cd:resolve name="assignment-labeldata-list"/> </cd:arguments> </cd:command> - <cd:command name="btxlabeltext" type="environment" file="publ-ini.mkiv"> + <cd:command name="btxlabeltext" type="environment" level="style" category="language" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-language-optional"/> <cd:resolve name="keyword-key"/> </cd:arguments> </cd:command> - <cd:command name="btxlabellanguage" file="publ-ini.mkiv"/> + <cd:command name="btxlabellanguage" level="system" category="language" file="publ-ini.mkiv"/> - <cd:command name="btxlabeltext" file="publ-ini.mkiv"> + <cd:command name="btxlabeltext" level="style" category="language" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-key"/> </cd:arguments> @@ -520,4 +520,4 @@ --> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-language.xml b/tex/context/interface/mkiv/i-language.xml index 395e08c34..357061321 100644 --- a/tex/context/interface/mkiv/i-language.xml +++ b/tex/context/interface/mkiv/i-language.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="installlanguage" file="lang-ini.mkiv"> + <cd:command name="installlanguage" level="system" category="language" file="lang-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes"> @@ -13,14 +13,14 @@ </cd:arguments> </cd:command> - <cd:command name="installlanguage" variant="name" file="lang-ini.mkiv"> + <cd:command name="installlanguage" variant="name" level="system" category="language" file="lang-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-language"/> </cd:arguments> </cd:command> - <cd:command name="setuplanguage" file="lang-ini.mkiv"> + <cd:command name="setuplanguage" level="style" category="language" file="lang-ini.mkiv"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:language"/> @@ -62,6 +62,12 @@ <cd:parameter name="font"> <cd:constant type="auto"/> </cd:parameter> + <cd:parameter name="bidi"> + <cd:constant type="left"/> + <cd:constant type="right"/> + <cd:constant type="l2r"/> + <cd:constant type="r2l"/> + </cd:parameter> <cd:parameter name="text"> <cd:constant type="cd:text"/> </cd:parameter> @@ -124,15 +130,15 @@ </cd:arguments> </cd:command> - <cd:command name="doifelselanguage" file="lang-ini.mkiv"> + <cd:command name="doifelselanguage" level="system" category="language conditional" file="lang-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-language"/> <cd:resolve name="argument-true"/> <cd:resolve name="argument-false"/> </cd:arguments> </cd:command> - - <cd:command name="doiflanguageelse" file="lang-ini.mkiv"> + + <cd:command name="doiflanguageelse" level="system" category="language conditional" file="lang-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-language"/> <cd:resolve name="argument-true"/> @@ -140,15 +146,15 @@ </cd:arguments> </cd:command> - <cd:command name="doifelsepatterns" file="lang-ini.mkiv"> + <cd:command name="doifelsepatterns" level="system" category="language conditional" file="lang-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-language"/> <cd:resolve name="argument-true"/> <cd:resolve name="argument-false"/> </cd:arguments> </cd:command> - - <cd:command name="doifpatternselse" file="lang-ini.mkiv"> + + <cd:command name="doifpatternselse" level="system" category="language conditional" file="lang-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-language"/> <cd:resolve name="argument-true"/> @@ -156,41 +162,41 @@ </cd:arguments> </cd:command> - <cd:command name="language" generated="yes" variant="example" file="lang-ini.mkiv"> + <cd:command name="language" generated="yes" variant="example" level="document" category="language" file="lang-ini.mkiv"> <cd:sequence> <cd:variable value="language"/> </cd:sequence> </cd:command> - <cd:command name="language" file="lang-ini.mkiv"> + <cd:command name="language" level="document" category="language" file="lang-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-language"/> </cd:arguments> </cd:command> - <cd:command name="mainlanguage" file="lang-ini.mkiv"> + <cd:command name="mainlanguage" level="style" category="language" file="lang-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-language"/> </cd:arguments> </cd:command> - <cd:command name="uselanguageparameter" file="lang-ini.mkiv"> + <cd:command name="uselanguageparameter" level="system" category="language" file="lang-ini.mkiv"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="exceptions" type="environment" file="lang-ini.mkiv"> + <cd:command name="exceptions" type="environment" level="style" category="language" file="lang-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-language"/> </cd:arguments> </cd:command> - <cd:command name="currentlanguage" file="lang-ini.mkiv"/> + <cd:command name="currentlanguage" level="system" category="language" file="lang-ini.mkiv"/> - <cd:command name="currentmainlanguage" file="lang-ini.mkiv"/> + <cd:command name="currentmainlanguage" level="system" category="language" file="lang-ini.mkiv"/> - <cd:command name="commalistsentence" file="lang-lab.mkiv"> + <cd:command name="commalistsentence" level="document" category="language" file="lang-lab.mkiv"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:text"/> diff --git a/tex/context/interface/mkiv/i-layer.xml b/tex/context/interface/mkiv/i-layer.xml index 9157ecdbf..77aaf7d52 100644 --- a/tex/context/interface/mkiv/i-layer.xml +++ b/tex/context/interface/mkiv/i-layer.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="setuplayeredtext" file="pack-box.mkiv"> + <cd:command name="setuplayeredtext" level="style" category="background" file="pack-box.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -19,7 +19,7 @@ </cd:arguments> </cd:command> - <cd:command name="layeredtext" file="pack-box.mkiv"> + <cd:command name="layeredtext" level="document" category="background" file="pack-box.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setuplayer"/> @@ -32,7 +32,7 @@ </cd:arguments> </cd:command> - <cd:command name="placelayeredtext" file="pack-box.mkiv"> + <cd:command name="placelayeredtext" level="document" category="background" file="pack-box.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes" optional="yes"> @@ -46,7 +46,7 @@ </cd:arguments> </cd:command> - <cd:command name="setlayerframed" file="pack-box.mkiv"> + <cd:command name="setlayerframed" level="document" category="background" file="pack-box.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes" optional="yes"> @@ -59,7 +59,7 @@ </cd:arguments> </cd:command> - <cd:command name="setlayerframed" variant="combination" file="pack-box.mkiv"> + <cd:command name="setlayerframed" variant="combination" level="document" category="background" file="pack-box.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes" optional="yes"> @@ -70,7 +70,7 @@ </cd:arguments> </cd:command> - <cd:command name="setlayertext" file="pack-box.mkiv"> + <cd:command name="setlayertext" level="document" category="background" file="pack-box.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes" optional="yes"> @@ -94,7 +94,7 @@ </cd:arguments> </cd:command> - <cd:command name="definelayer" file="pack-lyr.mkiv"> + <cd:command name="definelayer" level="style" category="background" file="pack-lyr.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -104,7 +104,7 @@ </cd:arguments> </cd:command> - <cd:command name="setuplayer" file="pack-lyr.mkiv"> + <cd:command name="setuplayer" level="style" category="background" file="pack-lyr.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -221,37 +221,37 @@ </cd:arguments> </cd:command> - <cd:command name="resetlayer" file="pack-lyr.mkiv"> + <cd:command name="resetlayer" level="style" category="background" file="pack-lyr.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="flushlayer" file="pack-lyr.mkiv"> + <cd:command name="flushlayer" level="document" category="background" file="pack-lyr.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="tightlayer" file="pack-lyr.mkiv"> + <cd:command name="tightlayer" level="document" category="background" file="pack-lyr.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="placelayer" file="pack-lyr.mkiv"> + <cd:command name="placelayer" level="document" category="background" file="pack-lyr.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="composedlayer" file="pack-lyr.mkiv"> + <cd:command name="composedlayer" level="document" category="background" file="pack-lyr.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="setlayer" file="pack-lyr.mkiv"> + <cd:command name="setlayer" level="document" category="background" file="pack-lyr.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:keywords optional="yes"> @@ -267,7 +267,7 @@ </cd:arguments> </cd:command> - <cd:command name="definelayerpreset" file="pack-lyr.mkiv"> + <cd:command name="definelayerpreset" level="system" category="background" file="pack-lyr.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes"> @@ -276,14 +276,14 @@ </cd:arguments> </cd:command> - <cd:command name="definelayerpreset" variant="name" file="pack-lyr.mkiv"> + <cd:command name="definelayerpreset" variant="name" level="system" category="background" file="pack-lyr.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="doifelselayerdata" file="pack-lyr.mkiv"> + <cd:command name="doifelselayerdata" level="system" category="background conditional" file="pack-lyr.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -291,7 +291,7 @@ </cd:arguments> </cd:command> - <cd:command name="doiflayerdataelse" file="pack-lyr.mkiv"> + <cd:command name="doiflayerdataelse" level="system" category="background conditional" file="pack-lyr.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -299,11 +299,11 @@ </cd:arguments> </cd:command> - <cd:command name="layerwidth" file="pack-lyr.mkiv"/> + <cd:command name="layerwidth" level="system" category="background" file="pack-lyr.mkiv"/> - <cd:command name="layerheight" file="pack-lyr.mkiv"/> + <cd:command name="layerheight" level="system" category="background" file="pack-lyr.mkiv"/> - <cd:command name="setMPlayer" file="pack-lyr.mkiv"> + <cd:command name="setMPlayer" level="document" category="background metapost" file="pack-lyr.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name"/> @@ -314,7 +314,7 @@ </cd:arguments> </cd:command> - <cd:command name="getMPlayer" file="pack-lyr.mkiv"> + <cd:command name="getMPlayer" level="document" category="background metapost" file="pack-lyr.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes" optional="yes"> @@ -324,4 +324,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-layout.xml b/tex/context/interface/mkiv/i-layout.xml index f3e42515e..19b233988 100644 --- a/tex/context/interface/mkiv/i-layout.xml +++ b/tex/context/interface/mkiv/i-layout.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definelayout" file="page-lay.mkiv"> + <cd:command name="definelayout" level="style" category="layout" file="page-lay.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setuplayout" file="page-lay.mkiv"> + <cd:command name="setuplayout" level="style" category="layout" file="page-lay.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:assignments list="yes"> @@ -211,7 +211,7 @@ </cd:arguments> </cd:command> - <cd:command name="setuplayout" variant="name" file="page-lay.mkiv"> + <cd:command name="setuplayout" variant="name" level="style" category="layout" file="page-lay.mkiv"> <cd:arguments> <cd:keywords> <cd:constant type="reset"/> @@ -220,7 +220,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifelselayoutdefined" file="page-lay.mkiv"> + <cd:command name="doifelselayoutdefined" level="system" category="layout conditional" file="page-lay.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -228,7 +228,7 @@ </cd:arguments> </cd:command> - <cd:command name="doiflayoutdefinedelse" file="page-lay.mkiv"> + <cd:command name="doiflayoutdefinedelse" level="system" category="layout conditional" file="page-lay.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -236,7 +236,7 @@ </cd:arguments> </cd:command> - <cd:command name="adaptlayout" file="page-lay.mkiv"> + <cd:command name="adaptlayout" level="style" category="layout" file="page-lay.mkiv"> <cd:arguments> <cd:resolve name="keyword-number-list-optional"/> <cd:assignments list="yes"> @@ -251,27 +251,27 @@ </cd:arguments> </cd:command> - <cd:command name="layout" type="environment" file="page-lay.mkiv"> + <cd:command name="layout" type="environment" level="document" category="layout" file="page-lay.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="doifelseoddpage" file="page-lay.mkiv"> + <cd:command name="doifelseoddpage" level="system" category="layout conditional" file="page-lay.mkiv"> <cd:arguments> <cd:resolve name="argument-command"/> <cd:resolve name="argument-command"/> </cd:arguments> </cd:command> - <cd:command name="doifoddpageelse" file="page-lay.mkiv"> + <cd:command name="doifoddpageelse" level="system" category="layout conditional" file="page-lay.mkiv"> <cd:arguments> <cd:resolve name="argument-command"/> <cd:resolve name="argument-command"/> </cd:arguments> </cd:command> - <cd:command name="doifbothsidesoverruled" file="page-lay.mkiv"> + <cd:command name="doifbothsidesoverruled" level="system" category="layout conditional" file="page-lay.mkiv"> <cd:arguments> <cd:resolve name="argument-command"/> <cd:resolve name="argument-command"/> @@ -279,7 +279,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifbothsides" file="page-lay.mkiv"> + <cd:command name="doifbothsides" level="system" category="layout conditional" file="page-lay.mkiv"> <cd:arguments> <cd:resolve name="argument-command"/> <cd:resolve name="argument-command"/> @@ -287,14 +287,14 @@ </cd:arguments> </cd:command> - <cd:command name="rightorleftpageaction" file="page-lay.mkiv"> + <cd:command name="rightorleftpageaction" level="system" category="layout conditional" file="page-lay.mkiv"> <cd:arguments> <cd:resolve name="argument-command"/> <cd:resolve name="argument-command"/> </cd:arguments> </cd:command> - <cd:command name="showprint" file="page-run.mkiv"> + <cd:command name="showprint" level="document" category="layout" file="page-run.mkiv"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:inherit name="setuppapersize"/> @@ -308,7 +308,7 @@ </cd:arguments> </cd:command> - <cd:command name="showframe" file="page-run.mkiv"> + <cd:command name="showframe" level="document" category="layout" file="page-run.mkiv"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="top"/> @@ -327,7 +327,7 @@ </cd:arguments> </cd:command> - <cd:command name="showsetups" file="page-run.mkiv"> + <cd:command name="showsetups" level="document" category="layout" file="page-run.mkiv"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="pt" default="yes"/> @@ -345,7 +345,7 @@ </cd:arguments> </cd:command> - <cd:command name="showlayout" file="page-run.mkiv"> + <cd:command name="showlayout" level="document" category="layout" file="page-run.mkiv"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="pt" default="yes"/> @@ -363,8 +363,22 @@ </cd:arguments> </cd:command> - <cd:command name="showmargins" file="page-run.mkiv"/> + <cd:command name="showmargins" level="document" category="layout" file="page-run.mkiv"/> - <cd:command name="spread" type="environment" file="page-spr.mkiv"/> + <cd:command name="spread" type="environment" level="document" category="layout" file="page-spr.mkiv"/> -</cd:interface> + <cd:command name="doifelsetopofpage" level="system" category="layout conditional" file="page-lay.mkiv"> + <cd:arguments> + <cd:resolve name="argument-true"/> + <cd:resolve name="argument-false"/> + </cd:arguments> + </cd:command> + + <cd:command name="doiftopofpageelse" level="system" category="layout conditional" file="page-lay.mkiv"> + <cd:arguments> + <cd:resolve name="argument-true"/> + <cd:resolve name="argument-false"/> + </cd:arguments> + </cd:command> + +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-linenumber.xml b/tex/context/interface/mkiv/i-linenumber.xml index 1c7ca2f75..3dc562e68 100644 --- a/tex/context/interface/mkiv/i-linenumber.xml +++ b/tex/context/interface/mkiv/i-linenumber.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definelinenumbering" file="page-lin.mkvi"> + <cd:command name="definelinenumbering" level="style" category="structure" file="page-lin.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setuplinenumbering" file="page-lin.mkvi"> + <cd:command name="setuplinenumbering" level="style" category="structure" file="page-lin.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -89,7 +89,7 @@ </cd:arguments> </cd:command> - <cd:command name="linenumbering" type="environment" file="page-lin.mkvi"> + <cd:command name="linenumbering" type="environment" level="document" category="structure" file="page-lin.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:assignments list="yes" optional="yes"> @@ -112,7 +112,7 @@ </cd:arguments> </cd:command> - <cd:command name="linenumbering" type="environment" variant="argument" file="page-lin.mkvi"> + <cd:command name="linenumbering" type="environment" variant="argument" level="document" category="structure" file="page-lin.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:keywords optional="yes"> @@ -122,25 +122,25 @@ </cd:arguments> </cd:command> - <cd:command name="someline" file="page-lin.mkvi"> + <cd:command name="someline" level="document" category="structure" file="page-lin.mkvi"> <cd:arguments> <cd:resolve name="keyword-reference"/> </cd:arguments> </cd:command> - <cd:command name="startline" file="page-lin.mkvi"> + <cd:command name="startline" level="document" category="structure" file="page-lin.mkvi"> <cd:arguments> <cd:resolve name="keyword-reference"/> </cd:arguments> </cd:command> - <cd:command name="stopline" file="page-lin.mkvi"> + <cd:command name="stopline" level="document" category="structure" file="page-lin.mkvi"> <cd:arguments> <cd:resolve name="keyword-reference"/> </cd:arguments> </cd:command> - <cd:command name="doifelsesamelinereference" file="page-lin.mkvi"> + <cd:command name="doifelsesamelinereference" level="system" category="structure conditional" file="page-lin.mkvi"> <cd:arguments> <cd:resolve name="argument-reference"/> <cd:resolve name="argument-true"/> @@ -148,7 +148,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifsamelinereferenceelse" file="page-lin.mkvi"> + <cd:command name="doifsamelinereferenceelse" level="system" category="structure conditional" file="page-lin.mkvi"> <cd:arguments> <cd:resolve name="argument-reference"/> <cd:resolve name="argument-true"/> @@ -156,17 +156,17 @@ </cd:arguments> </cd:command> - <cd:command name="inline" file="page-lin.mkvi"> + <cd:command name="inline" level="document" category="structure" file="page-lin.mkvi"> <cd:arguments> <cd:resolve name="argument-text-optional"/> <cd:resolve name="keyword-reference"/> </cd:arguments> </cd:command> - <cd:command name="inlinerange" file="page-lin.mkvi"> + <cd:command name="inlinerange" level="document" category="structure" file="page-lin.mkvi"> <cd:arguments> <cd:resolve name="keyword-reference"/> </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-lines.xml b/tex/context/interface/mkiv/i-lines.xml index 32c3c6b70..500786276 100644 --- a/tex/context/interface/mkiv/i-lines.xml +++ b/tex/context/interface/mkiv/i-lines.xml @@ -4,33 +4,33 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="noflines" file="supp-box.mkiv"/> + <cd:command name="noflines" level="system" file="supp-box.mkiv"/> - <cd:command name="getnoflines" file="supp-box.mkiv"> + <cd:command name="getnoflines" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="argument-dimension"/> </cd:arguments> </cd:command> - <cd:command name="getroundednoflines" file="supp-box.mkiv"> + <cd:command name="getroundednoflines" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="argument-dimension"/> </cd:arguments> </cd:command> - <cd:command name="getrawnoflines" file="supp-box.mkiv"> + <cd:command name="getrawnoflines" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="argument-dimension"/> </cd:arguments> </cd:command> - <cd:command name="determinenoflines" file="supp-box.mkiv"> + <cd:command name="determinenoflines" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="definelines" file="spac-lin.mkiv"> + <cd:command name="definelines" level="style" file="spac-lin.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -40,7 +40,7 @@ </cd:arguments> </cd:command> - <cd:command name="setuplines" file="spac-lin.mkiv"> + <cd:command name="setuplines" level="style" file="spac-lin.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -88,7 +88,7 @@ </cd:arguments> </cd:command> - <cd:command name="lines" type="environment" generated="yes" variant="instance" file="spac-lin.mkiv"> + <cd:command name="lines" type="environment" generated="yes" variant="instance" level="document" file="spac-lin.mkiv"> <cd:sequence> <cd:instance value="lines"/> </cd:sequence> @@ -104,7 +104,7 @@ <!-- - <cd:command name="lines" type="environment" file="spac-lin.mkiv"> + <cd:command name="lines" type="environment" level="document" file="spac-lin.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setuplines"/> @@ -114,10 +114,10 @@ --> - <cd:command name="emptylines" file="spac-lin.mkiv"> + <cd:command name="emptylines" level="document" file="spac-lin.mkiv"> <cd:arguments> <cd:resolve name="keyword-number-optional"/> </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-linetable.xml b/tex/context/interface/mkiv/i-linetable.xml index 9b4cae16a..a515f40fd 100644 --- a/tex/context/interface/mkiv/i-linetable.xml +++ b/tex/context/interface/mkiv/i-linetable.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="setuplinetable" file="tabl-ltb.mkiv"> + <cd:command name="setuplinetable" level="style" category="tables" file="tabl-ltb.mkiv"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="r"/> @@ -98,7 +98,7 @@ </cd:arguments> </cd:command> - <cd:command name="linetablecell" type="environment" file="tabl-ltb.mkiv"> + <cd:command name="linetablecell" type="environment" level="document" category="tables" file="tabl-ltb.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setuplinetable"/> @@ -106,19 +106,19 @@ </cd:arguments> </cd:command> - <cd:command name="linetable" type="environment" file="tabl-ltb.mkiv"/> + <cd:command name="linetable" type="environment" level="document" category="tables" file="tabl-ltb.mkiv"/> - <cd:command name="linetablehead" type="environment" file="tabl-ltb.mkiv"/> + <cd:command name="linetablehead" type="environment" level="document" category="tables" file="tabl-ltb.mkiv"/> - <cd:command name="linetablebody" type="environment" file="tabl-ltb.mkiv"/> + <cd:command name="linetablebody" type="environment" level="document" category="tables" file="tabl-ltb.mkiv"/> - <cd:command name="processlinetablebuffer" file="tabl-ltb.mkiv"> + <cd:command name="processlinetablebuffer" level="document" category="tables buffer" file="tabl-ltb.mkiv"> <cd:arguments> <cd:resolve name="keyword-buffer-optional"/> </cd:arguments> </cd:command> - <cd:command name="processlinetablefile" file="tabl-ltb.mkiv"> + <cd:command name="processlinetablefile" level="document" category="tables" file="tabl-ltb.mkiv"> <cd:arguments> <cd:resolve name="argument-file"/> </cd:arguments> @@ -126,7 +126,7 @@ <!-- - <cd:command name="BC" scope="linetable" file="tabl-ltb.mkiv"> + <cd:command name="BC" scope="linetable" level="document" category="tables" file="tabl-ltb.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setuplinetable"/> @@ -136,21 +136,21 @@ </cd:arguments> </cd:command> - <cd:command name="BR" scope="linetable" file="tabl-ltb.mkiv"> + <cd:command name="BR" scope="linetable" level="document" category="tables" file="tabl-ltb.mkiv"> <cd:arguments> <cd:resolve name="string-content"/> <cd:delimiter name="ER"/> </cd:arguments> </cd:command> - <cd:command name="BH" scope="linetable" file="tabl-ltb.mkiv"> + <cd:command name="BH" scope="linetable" level="document" category="tables" file="tabl-ltb.mkiv"> <cd:arguments> <cd:resolve name="string-content"/> <cd:delimiter name="EH"/> </cd:arguments> </cd:command> - <cd:command name="NC" scope="linetable" file="tabl-ltb.mkiv"> + <cd:command name="NC" scope="linetable" level="document" category="tables" file="tabl-ltb.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setuplinetable"/> @@ -158,8 +158,8 @@ </cd:arguments> </cd:command> - <cd:command name="NR" scope="linetable" file="tabl-ltb.mkiv"/> + <cd:command name="NR" scope="linetable" level="document" category="tables" file="tabl-ltb.mkiv"/> --> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-linewidth.xml b/tex/context/interface/mkiv/i-linewidth.xml index 65a967954..6d9043a1f 100644 --- a/tex/context/interface/mkiv/i-linewidth.xml +++ b/tex/context/interface/mkiv/i-linewidth.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="setuplinewidth" file="pack-rul.mkiv"> + <cd:command name="setuplinewidth" level="style" category="layout" file="pack-rul.mkiv"> <cd:arguments> <cd:keywords> <cd:constant type="small"/> @@ -15,6 +15,6 @@ </cd:arguments> </cd:command> - <cd:command name="linewidth" file="pack-rul.mkiv"/> + <cd:command name="linewidth" level="style" category="layout" file="pack-rul.mkiv"/> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-list.xml b/tex/context/interface/mkiv/i-list.xml index 7e0def052..8d4863dd2 100644 --- a/tex/context/interface/mkiv/i-list.xml +++ b/tex/context/interface/mkiv/i-list.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definelist" file="strc-lst.mkvi"> + <cd:command name="definelist" level="style" category="structure" file="strc-lst.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-list-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setuplist" file="strc-lst.mkvi"> + <cd:command name="setuplist" level="style" category="structure" file="strc-lst.mkvi"> <cd:arguments> <cd:resolve name="keyword-list-list-optional"/> <cd:assignments list="yes"> @@ -296,7 +296,7 @@ <!-- - <cd:command name="setuplists" file="strc-lst.mkvi"> + <cd:command name="setuplists" level="style" category="structure" file="strc-lst.mkvi"> <cd:arguments> <cd:resolve name="keyword-list-list-optional"/> <cd:assignments list="yes"> @@ -307,7 +307,7 @@ --> - <cd:command name="doifelselist" file="strc-lst.mkvi"> + <cd:command name="doifelselist" level="system" category="structure conditional" file="strc-lst.mkvi"> <cd:arguments> <cd:resolve name="argument-list"/> <cd:resolve name="argument-true"/> @@ -315,7 +315,7 @@ </cd:arguments> </cd:command> - <cd:command name="doiflistelse" file="strc-lst.mkvi"> + <cd:command name="doiflistelse" level="system" category="structure conditional" file="strc-lst.mkvi"> <cd:arguments> <cd:resolve name="argument-list"/> <cd:resolve name="argument-true"/> @@ -323,7 +323,7 @@ </cd:arguments> </cd:command> - <cd:command name="writebetweenlist" file="strc-lst.mkvi"> + <cd:command name="writebetweenlist" level="document" category="structure" file="strc-lst.mkvi"> <cd:arguments> <cd:resolve name="keyword-list"/> <cd:assignments list="yes" optional="yes"> @@ -333,7 +333,7 @@ </cd:arguments> </cd:command> - <cd:command name="writedatatolist" file="strc-lst.mkvi"> + <cd:command name="writedatatolist" level="document" category="structure" file="strc-lst.mkvi"> <cd:arguments> <cd:resolve name="keyword-list"/> <cd:assignments list="yes" optional="yes"> @@ -343,7 +343,7 @@ </cd:arguments> </cd:command> - <cd:command name="writetolist" file="strc-lst.mkvi"> + <cd:command name="writetolist" level="document" category="structure" file="strc-lst.mkvi"> <cd:arguments> <cd:resolve name="keyword-list"/> <cd:assignments list="yes" optional="yes"> @@ -354,7 +354,7 @@ </cd:arguments> </cd:command> - <cd:command name="placelist" file="strc-lst.mkvi"> + <cd:command name="placelist" level="document" category="structure" file="strc-lst.mkvi"> <cd:arguments> <cd:resolve name="keyword-list-list"/> <cd:assignments list="yes" optional="yes"> @@ -363,7 +363,7 @@ </cd:arguments> </cd:command> - <cd:command name="placerawlist" file="strc-lst.mkvi"> + <cd:command name="placerawlist" level="style" category="structure" file="strc-lst.mkvi"> <cd:arguments> <cd:resolve name="keyword-list"/> <cd:assignments list="yes" optional="yes"> @@ -372,7 +372,7 @@ </cd:arguments> </cd:command> - <cd:command name="completelist" file="strc-lst.mkvi"> + <cd:command name="completelist" level="document" category="structure" file="strc-lst.mkvi"> <cd:arguments> <cd:resolve name="keyword-list"/> <cd:assignments list="yes" optional="yes"> @@ -381,7 +381,7 @@ </cd:arguments> </cd:command> - <cd:command name="definecombinedlist" file="strc-lst.mkvi"> + <cd:command name="definecombinedlist" level="style" category="structure" file="strc-lst.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-list-list"/> @@ -391,7 +391,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupcombinedlist" file="strc-lst.mkvi"> + <cd:command name="setupcombinedlist" level="style" category="structure" file="strc-lst.mkvi"> <cd:arguments> <cd:resolve name="keyword-list"/> <cd:assignments list="yes"> @@ -400,7 +400,7 @@ </cd:arguments> </cd:command> - <cd:command name="placecombinedlist" file="strc-lst.mkvi"> + <cd:command name="placecombinedlist" level="document" category="structure" file="strc-lst.mkvi"> <cd:arguments> <cd:resolve name="keyword-list"/> <cd:assignments list="yes" optional="yes"> @@ -409,7 +409,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupcombinedlist" generated="yes" variant="instance" file="strc-lst.mkvi"> + <cd:command name="setupcombinedlist" generated="yes" variant="instance" level="style" category="structure" file="strc-lst.mkvi"> <cd:sequence> <cd:string value="setup"/> <cd:instance value="combinedlist"/> @@ -424,7 +424,7 @@ </cd:instances> </cd:command> - <cd:command name="placecombinedlist" generated="yes" variant="instance" file="strc-lst.mkvi"> + <cd:command name="placecombinedlist" generated="yes" variant="instance" level="document" category="structure" file="strc-lst.mkvi"> <cd:sequence> <cd:string value="place"/> <cd:instance value="combinedlist"/> @@ -439,7 +439,7 @@ </cd:instances> </cd:command> - <cd:command name="completecombinedlist" generated="yes" variant="instance" file="strc-lst.mkvi"> + <cd:command name="completecombinedlist" generated="yes" variant="instance" level="document" category="structure" file="strc-lst.mkvi"> <cd:sequence> <cd:string value="complete"/> <cd:instance value="combinedlist"/> @@ -456,7 +456,7 @@ <!-- - <cd:command name="setupcontent" file="strc-lst.mkvi"> + <cd:command name="setupcontent" level="style" category="structure" file="strc-lst.mkvi"> <cd:arguments> <cd:assignments list="yes"> <cd:inherit name="setuplist"/> @@ -464,7 +464,7 @@ </cd:arguments> </cd:command> - <cd:command name="placecontent" file="strc-lst.mkvi"> + <cd:command name="placecontent" level="document" category="structure" file="strc-lst.mkvi"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setuplist"/> @@ -472,7 +472,7 @@ </cd:arguments> </cd:command> - <cd:command name="completecontent" file="strc-lst.mkvi"> + <cd:command name="completecontent" level="document" category="structure" file="strc-lst.mkvi"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setuplist"/> @@ -482,47 +482,47 @@ --> - <cd:command name="structurelistuservariable" file="strc-lst.mkvi"> + <cd:command name="structurelistuservariable" level="style" category="structure" file="strc-lst.mkvi"> <cd:arguments> <cd:resolve name="argument-key"/> </cd:arguments> </cd:command> - <cd:command name="rawstructurelistuservariable" file="strc-lst.mkvi"> + <cd:command name="rawstructurelistuservariable" level="system" category="structure" file="strc-lst.mkvi"> <cd:arguments> <cd:resolve name="argument-key"/> </cd:arguments> </cd:command> - <cd:command name="doifelsestructurelisthaspage" file="strc-lst.mkvi"> + <cd:command name="doifelsestructurelisthaspage" level="system" category="structure conditional" file="strc-lst.mkvi"> <cd:arguments> <cd:resolve name="argument-true"/> <cd:resolve name="argument-false"/> </cd:arguments> </cd:command> - <cd:command name="doifstructurelisthaspageelse" file="strc-lst.mkvi"> + <cd:command name="doifstructurelisthaspageelse" level="system" category="structure conditional" file="strc-lst.mkvi"> <cd:arguments> <cd:resolve name="argument-true"/> <cd:resolve name="argument-false"/> </cd:arguments> </cd:command> - <cd:command name="doifelsestructurelisthasnumber" file="strc-lst.mkvi"> + <cd:command name="doifelsestructurelisthasnumber" level="system" category="structure conditional" file="strc-lst.mkvi"> <cd:arguments> <cd:resolve name="argument-true"/> <cd:resolve name="argument-false"/> </cd:arguments> </cd:command> - <cd:command name="doifstructurelisthasnumberelse" file="strc-lst.mkvi"> + <cd:command name="doifstructurelisthasnumberelse" level="system" category="structure conditional" file="strc-lst.mkvi"> <cd:arguments> <cd:resolve name="argument-true"/> <cd:resolve name="argument-false"/> </cd:arguments> </cd:command> - <cd:command name="definelistextra" file="strc-lst.mkvi"> + <cd:command name="definelistextra" level="style" category="structure" file="strc-lst.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -532,7 +532,7 @@ </cd:arguments> </cd:command> - <cd:command name="setuplistextra" file="strc-lst.mkvi"> + <cd:command name="setuplistextra" level="style" category="structure" file="strc-lst.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -546,7 +546,7 @@ </cd:arguments> </cd:command> - <cd:command name="definelistalternative" file="strc-lst.mkvi"> + <cd:command name="definelistalternative" level="style" category="structure" file="strc-lst.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -556,7 +556,7 @@ </cd:arguments> </cd:command> - <cd:command name="setuplistalternative" file="strc-lst.mkvi"> + <cd:command name="setuplistalternative" level="style" category="structure" file="strc-lst.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -588,7 +588,7 @@ </cd:arguments> </cd:command> - <cd:command name="determinelistcharacteristics" file="strc-lst.mkvi"> + <cd:command name="determinelistcharacteristics" level="system" category="structure" file="strc-lst.mkvi"> <cd:arguments> <cd:resolve name="keyword-list-list"/> <cd:assignments list="yes" optional="yes"> @@ -597,21 +597,21 @@ </cd:arguments> </cd:command> - <cd:command name="currentlistentrynumber" file="strc-lst.mkvi"/> + <cd:command name="currentlistentrynumber" level="style" category="structure" file="strc-lst.mkvi"/> - <cd:command name="currentlistentrytitle" file="strc-lst.mkvi"/> + <cd:command name="currentlistentrytitle" level="style" category="structure" file="strc-lst.mkvi"/> - <cd:command name="currentlistentrytitlerendered" file="strc-lst.mkvi"/> + <cd:command name="currentlistentrytitlerendered" level="style" category="structure" file="strc-lst.mkvi"/> - <cd:command name="currentlistentrypagenumber" file="strc-lst.mkvi"/> + <cd:command name="currentlistentrypagenumber" level="style" category="structure" file="strc-lst.mkvi"/> - <cd:command name="currentlistsymbol" file="strc-lst.mkvi"/> + <cd:command name="currentlistsymbol" level="system" category="structure" file="strc-lst.mkvi"/> - <cd:command name="listlength" file="strc-lst.mkvi"/> + <cd:command name="listlength" level="system" category="structure" file="strc-lst.mkvi"/> - <cd:command name="currentlistentrywrapper" type="environment" file="strc-lst.mkvi"/> + <cd:command name="currentlistentrywrapper" type="environment" level="system" category="structure" file="strc-lst.mkvi"/> - <cd:command name="currentlistentryreferenceattribute" file="strc-lst.mkvi"> + <cd:command name="currentlistentryreferenceattribute" level="system" category="structure" file="strc-lst.mkvi"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="number"/> @@ -622,9 +622,9 @@ </cd:arguments> </cd:command> - <cd:command name="currentlistentrydestinationattribute" file="strc-lst.mkvi"/> + <cd:command name="currentlistentrydestinationattribute" level="system" category="structure" file="strc-lst.mkvi"/> - <cd:command name="currentlistentrylimitedtext" file="strc-lst.mkvi"> + <cd:command name="currentlistentrylimitedtext" level="system" category="structure" file="strc-lst.mkvi"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> diff --git a/tex/context/interface/mkiv/i-logo.xml b/tex/context/interface/mkiv/i-logo.xml index e3327400a..8f8186a83 100644 --- a/tex/context/interface/mkiv/i-logo.xml +++ b/tex/context/interface/mkiv/i-logo.xml @@ -4,102 +4,102 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="TeX" file="cont-log.mkiv"/> + <cd:command name="TeX" level="document" category="symbols" file="cont-log.mkiv"/> - <cd:command name="ConTeXt" file="cont-log.mkiv"/> + <cd:command name="ConTeXt" level="document" category="symbols" file="cont-log.mkiv"/> - <cd:command name="PPCHTeX" file="cont-log.mkiv"/> + <cd:command name="PPCHTeX" level="document" category="symbols" file="cont-log.mkiv"/> - <cd:command name="PRAGMA" file="cont-log.mkiv"/> + <cd:command name="PRAGMA" level="document" category="symbols" file="cont-log.mkiv"/> - <cd:command name="LaTeX" file="cont-log.mkiv"/> + <cd:command name="LaTeX" level="document" category="symbols" file="cont-log.mkiv"/> - <cd:command name="TaBlE" file="cont-log.mkiv"/> + <cd:command name="TaBlE" level="document" category="symbols" file="cont-log.mkiv"/> - <cd:command name="PiCTeX" file="cont-log.mkiv"/> + <cd:command name="PiCTeX" level="document" category="symbols" file="cont-log.mkiv"/> - <cd:command name="AmSTeX" file="cont-log.mkiv"/> + <cd:command name="AmSTeX" level="document" category="symbols" file="cont-log.mkiv"/> - <cd:command name="LamSTeX" file="cont-log.mkiv"/> + <cd:command name="LamSTeX" level="document" category="symbols" file="cont-log.mkiv"/> - <cd:command name="Context" file="cont-log.mkiv"/> + <cd:command name="Context" level="document" category="symbols" file="cont-log.mkiv"/> - <cd:command name="MetaFont" file="cont-log.mkiv"/> + <cd:command name="MetaFont" level="document" category="symbols" file="cont-log.mkiv"/> - <cd:command name="MetaPost" file="cont-log.mkiv"/> + <cd:command name="MetaPost" level="document" category="symbols" file="cont-log.mkiv"/> - <cd:command name="MetaFun" file="cont-log.mkiv"/> + <cd:command name="MetaFun" level="document" category="symbols" file="cont-log.mkiv"/> - <cd:command name="eTeX" file="cont-log.mkiv"/> + <cd:command name="eTeX" level="document" category="symbols" file="cont-log.mkiv"/> - <cd:command name="pdfTeX" file="cont-log.mkiv"/> + <cd:command name="pdfTeX" level="document" category="symbols" file="cont-log.mkiv"/> - <cd:command name="pdfeTeX" file="cont-log.mkiv"/> + <cd:command name="pdfeTeX" level="document" category="symbols" file="cont-log.mkiv"/> - <cd:command name="Lua" file="cont-log.mkiv"/> + <cd:command name="Lua" level="document" category="symbols" file="cont-log.mkiv"/> - <cd:command name="luaTeX" file="cont-log.mkiv"/> + <cd:command name="luaTeX" level="document" category="symbols" file="cont-log.mkiv"/> - <cd:command name="luajitTeX" file="cont-log.mkiv"/> + <cd:command name="luajitTeX" level="document" category="symbols" file="cont-log.mkiv"/> - <cd:command name="metaTeX" file="cont-log.mkiv"/> + <cd:command name="metaTeX" level="document" category="symbols" file="cont-log.mkiv"/> - <cd:command name="XeTeX" file="cont-log.mkiv"/> + <cd:command name="XeTeX" level="document" category="symbols" file="cont-log.mkiv"/> - <cd:command name="LuaTeX" file="cont-log.mkiv"/> + <cd:command name="LuaTeX" level="document" category="symbols" file="cont-log.mkiv"/> - <cd:command name="LuajitTeX" file="cont-log.mkiv"/> + <cd:command name="LuajitTeX" level="document" category="symbols" file="cont-log.mkiv"/> - <cd:command name="MKII" file="cont-log.mkiv"/> + <cd:command name="MKII" level="document" category="symbols" file="cont-log.mkiv"/> - <cd:command name="MKIV" file="cont-log.mkiv"/> + <cd:command name="MKIV" level="document" category="symbols" file="cont-log.mkiv"/> - <cd:command name="MKVI" file="cont-log.mkiv"/> + <cd:command name="MKVI" level="document" category="symbols" file="cont-log.mkiv"/> - <cd:command name="MKIX" file="cont-log.mkiv"/> + <cd:command name="MKIX" level="document" category="symbols" file="cont-log.mkiv"/> - <cd:command name="MKXI" file="cont-log.mkiv"/> + <cd:command name="MKXI" level="document" category="symbols" file="cont-log.mkiv"/> - <cd:command name="MPII" file="cont-log.mkiv"/> + <cd:command name="MPII" level="document" category="symbols" file="cont-log.mkiv"/> - <cd:command name="MPIV" file="cont-log.mkiv"/> + <cd:command name="MPIV" level="document" category="symbols" file="cont-log.mkiv"/> - <cd:command name="MPVI" file="cont-log.mkiv"/> + <cd:command name="MPVI" level="document" category="symbols" file="cont-log.mkiv"/> - <cd:command name="METAFONT" file="cont-log.mkiv"/> + <cd:command name="METAFONT" level="document" category="symbols" file="cont-log.mkiv"/> - <cd:command name="METAPOST" file="cont-log.mkiv"/> + <cd:command name="METAPOST" level="document" category="symbols" file="cont-log.mkiv"/> - <cd:command name="PPCHTEX" file="cont-log.mkiv"/> + <cd:command name="PPCHTEX" level="document" category="symbols" file="cont-log.mkiv"/> - <cd:command name="CONTEXT" file="cont-log.mkiv"/> + <cd:command name="CONTEXT" level="document" category="symbols" file="cont-log.mkiv"/> - <cd:command name="METAFUN" file="cont-log.mkiv"/> + <cd:command name="METAFUN" level="document" category="symbols" file="cont-log.mkiv"/> - <cd:command name="TEX" file="cont-log.mkiv"/> + <cd:command name="TEX" level="document" category="symbols" file="cont-log.mkiv"/> - <cd:command name="LATEX" file="cont-log.mkiv"/> + <cd:command name="LATEX" level="document" category="symbols" file="cont-log.mkiv"/> - <cd:command name="PICTEX" file="cont-log.mkiv"/> + <cd:command name="PICTEX" level="document" category="symbols" file="cont-log.mkiv"/> - <cd:command name="TABLE" file="cont-log.mkiv"/> + <cd:command name="TABLE" level="document" category="symbols" file="cont-log.mkiv"/> - <cd:command name="AMSTEX" file="cont-log.mkiv"/> + <cd:command name="AMSTEX" level="document" category="symbols" file="cont-log.mkiv"/> - <cd:command name="LAMSTEX" file="cont-log.mkiv"/> + <cd:command name="LAMSTEX" level="document" category="symbols" file="cont-log.mkiv"/> - <cd:command name="INRSTEX" file="cont-log.mkiv"/> + <cd:command name="INRSTEX" level="document" category="symbols" file="cont-log.mkiv"/> - <cd:command name="ETEX" file="cont-log.mkiv"/> + <cd:command name="ETEX" level="document" category="symbols" file="cont-log.mkiv"/> - <cd:command name="PDFTEX" file="cont-log.mkiv"/> + <cd:command name="PDFTEX" level="document" category="symbols" file="cont-log.mkiv"/> - <cd:command name="PDFETEX" file="cont-log.mkiv"/> + <cd:command name="PDFETEX" level="document" category="symbols" file="cont-log.mkiv"/> - <cd:command name="LUATEX" file="cont-log.mkiv"/> + <cd:command name="LUATEX" level="document" category="symbols" file="cont-log.mkiv"/> - <cd:command name="LUAJITTEX" file="cont-log.mkiv"/> + <cd:command name="LUAJITTEX" level="document" category="symbols" file="cont-log.mkiv"/> - <cd:command name="XETEX" file="cont-log.mkiv"/> + <cd:command name="XETEX" level="document" category="symbols" file="cont-log.mkiv"/> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-lohi.xml b/tex/context/interface/mkiv/i-lohi.xml index 1fe891b2c..c174a9f54 100644 --- a/tex/context/interface/mkiv/i-lohi.xml +++ b/tex/context/interface/mkiv/i-lohi.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definelow" file="typo-scr.mkiv"> + <cd:command name="definelow" level="style" category="fonts" file="typo-scr.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setuplow" file="typo-scr.mkiv"> + <cd:command name="setuplow" level="style" category="fonts" file="typo-scr.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -34,7 +34,7 @@ </cd:arguments> </cd:command> - <cd:command name="low" generated="yes" variant="instance" file="typo-scr.mkiv"> + <cd:command name="low" generated="yes" variant="instance" level="document" category="fonts" file="typo-scr.mkiv"> <cd:sequence> <cd:instance value="low"/> </cd:sequence> @@ -46,13 +46,13 @@ </cd:instances> </cd:command> - <cd:command name="low" file="typo-scr.mkiv"> + <cd:command name="low" level="document" category="fonts" file="typo-scr.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="definehigh" file="typo-scr.mkiv"> + <cd:command name="definehigh" level="style" category="fonts" file="typo-scr.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -62,7 +62,7 @@ </cd:arguments> </cd:command> - <cd:command name="setuphigh" file="typo-scr.mkiv"> + <cd:command name="setuphigh" level="style" category="fonts" file="typo-scr.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -82,7 +82,7 @@ </cd:arguments> </cd:command> - <cd:command name="high" generated="yes" variant="instance" file="typo-scr.mkiv"> + <cd:command name="high" generated="yes" variant="instance" level="document" category="fonts" file="typo-scr.mkiv"> <cd:sequence> <cd:instance value="high"/> </cd:sequence> @@ -94,13 +94,13 @@ </cd:instances> </cd:command> - <cd:command name="high" file="typo-scr.mkiv"> + <cd:command name="high" level="document" category="fonts" file="typo-scr.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="definelowhigh" file="typo-scr.mkiv"> + <cd:command name="definelowhigh" level="style" category="fonts" file="typo-scr.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -110,7 +110,7 @@ </cd:arguments> </cd:command> - <cd:command name="setuplowhigh" file="typo-scr.mkiv"> + <cd:command name="setuplowhigh" level="style" category="fonts" file="typo-scr.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -133,7 +133,7 @@ </cd:arguments> </cd:command> - <cd:command name="lowhigh" generated="yes" variant="instance" file="typo-scr.mkiv"> + <cd:command name="lowhigh" generated="yes" variant="instance" level="document" category="fonts" file="typo-scr.mkiv"> <cd:sequence> <cd:instance value="lowhigh"/> </cd:sequence> @@ -147,7 +147,7 @@ </cd:arguments> </cd:command> - <cd:command name="lohi" file="typo-scr.mkiv"> + <cd:command name="lohi" level="document" category="fonts" file="typo-scr.mkiv"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="left"/> @@ -158,7 +158,7 @@ </cd:arguments> </cd:command> - <cd:command name="hilo" file="typo-scr.mkiv"> + <cd:command name="hilo" level="document" category="fonts" file="typo-scr.mkiv"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="left"/> @@ -169,7 +169,7 @@ </cd:arguments> </cd:command> - <cd:command name="definelowmidhigh" file="typo-scr.mkiv"> + <cd:command name="definelowmidhigh" level="style" category="fonts" file="typo-scr.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -179,7 +179,7 @@ </cd:arguments> </cd:command> - <cd:command name="setuplowmidhigh" file="typo-scr.mkiv"> + <cd:command name="setuplowmidhigh" level="style" category="fonts" file="typo-scr.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -199,7 +199,7 @@ </cd:arguments> </cd:command> - <cd:command name="lowmidhigh" generated="yes" variant="instance" file="typo-scr.mkiv"> + <cd:command name="lowmidhigh" generated="yes" variant="instance" level="document" category="fonts" file="typo-scr.mkiv"> <cd:sequence> <cd:instance value="lowmidhigh"/> </cd:sequence> @@ -210,7 +210,7 @@ </cd:arguments> </cd:command> - <cd:command name="lomihi" file="typo-scr.mkiv"> + <cd:command name="lomihi" level="document" category="fonts" file="typo-scr.mkiv"> <cd:arguments> <cd:content/> <cd:content/> @@ -218,7 +218,7 @@ </cd:arguments> </cd:command> - <cd:command name="himilo" file="typo-scr.mkiv"> + <cd:command name="himilo" level="document" category="fonts" file="typo-scr.mkiv"> <cd:arguments> <cd:content/> <cd:content/> @@ -226,4 +226,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-lua.xml b/tex/context/interface/mkiv/i-lua.xml index ef970609b..c7f114251 100644 --- a/tex/context/interface/mkiv/i-lua.xml +++ b/tex/context/interface/mkiv/i-lua.xml @@ -4,190 +4,190 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="taggedctxcommand" file="back-exp.mkiv"> + <cd:command name="taggedctxcommand" level="system" category="lua" file="back-exp.mkiv"> <cd:arguments> <cd:resolve name="argument-command"/> </cd:arguments> </cd:command> - <cd:command name="luafunction" file="cldf-ini.mkiv"> + <cd:command name="luafunction" level="system" category="lua" file="cldf-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-command"/> </cd:arguments> </cd:command> - <cd:command name="cldprocessfile" file="cldf-ini.mkiv"> + <cd:command name="cldprocessfile" level="system" category="lua" file="cldf-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-file"/> </cd:arguments> </cd:command> - <cd:command name="cldloadfile" file="cldf-ini.mkiv"> + <cd:command name="cldloadfile" level="system" category="lua" file="cldf-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-file"/> </cd:arguments> </cd:command> - <cd:command name="cldcontext" file="cldf-ini.mkiv"> + <cd:command name="cldcontext" level="system" category="lua" file="cldf-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-command"/> </cd:arguments> </cd:command> - <cd:command name="cldcommand" file="cldf-ini.mkiv"> + <cd:command name="cldcommand" level="system" category="lua" file="cldf-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-command"/> </cd:arguments> </cd:command> - <cd:command name="ctxdirectlua" file="luat-cod.mkiv"> + <cd:command name="ctxdirectlua" level="system" category="lua" file="luat-cod.mkiv"> <cd:arguments> <cd:resolve name="argument-command"/> </cd:arguments> </cd:command> - <cd:command name="ctxlatelua" file="luat-cod.mkiv"> + <cd:command name="ctxlatelua" level="system" category="lua" file="luat-cod.mkiv"> <cd:arguments> <cd:resolve name="argument-command"/> </cd:arguments> </cd:command> - <cd:command name="ctxsprint" file="luat-cod.mkiv"> + <cd:command name="ctxsprint" level="system" category="lua" file="luat-cod.mkiv"> <cd:arguments> <cd:resolve name="argument-command"/> </cd:arguments> </cd:command> - <cd:command name="ctxcommand" file="luat-cod.mkiv"> + <cd:command name="ctxcommand" level="system" category="lua" file="luat-cod.mkiv"> <cd:arguments> <cd:resolve name="argument-command"/> </cd:arguments> </cd:command> - <cd:command name="ctxdirectcommand" file="luat-cod.mkiv"> + <cd:command name="ctxdirectcommand" level="system" category="lua" file="luat-cod.mkiv"> <cd:arguments> <cd:resolve name="argument-command"/> </cd:arguments> </cd:command> - <cd:command name="ctxlatecommand" file="luat-cod.mkiv"> + <cd:command name="ctxlatecommand" level="system" category="lua" file="luat-cod.mkiv"> <cd:arguments> <cd:resolve name="argument-command"/> </cd:arguments> </cd:command> - <cd:command name="ctxreport" file="luat-cod.mkiv"> + <cd:command name="ctxreport" level="system" category="lua" file="luat-cod.mkiv"> <cd:arguments> <cd:resolve name="argument-command"/> </cd:arguments> </cd:command> - <cd:command name="ctxlua" file="luat-cod.mkiv"> + <cd:command name="ctxlua" level="system" category="lua" file="luat-cod.mkiv"> <cd:arguments> <cd:resolve name="argument-command"/> </cd:arguments> </cd:command> - <cd:command name="luacode" file="luat-cod.mkiv"> + <cd:command name="luacode" level="system" category="lua" file="luat-cod.mkiv"> <cd:arguments> <cd:resolve name="argument-command"/> </cd:arguments> </cd:command> - <cd:command name="lateluacode" file="luat-cod.mkiv"> + <cd:command name="lateluacode" level="system" category="lua" file="luat-cod.mkiv"> <cd:arguments> <cd:resolve name="argument-command"/> </cd:arguments> </cd:command> - <cd:command name="directluacode" file="luat-cod.mkiv"> + <cd:command name="directluacode" level="system" category="lua" file="luat-cod.mkiv"> <cd:arguments> <cd:resolve name="argument-command"/> </cd:arguments> </cd:command> - <cd:command name="luaversion" file="luat-cod.mkiv"/> + <cd:command name="luaversion" level="system" category="lua" file="luat-cod.mkiv"/> - <cd:command name="registerctxluafile" file="luat-cod.mkiv"> + <cd:command name="registerctxluafile" level="system" category="lua" file="luat-cod.mkiv"> <cd:arguments> <cd:resolve name="argument-file"/> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="ctxloadluafile" file="luat-cod.mkiv"> + <cd:command name="ctxloadluafile" level="system" category="lua" file="luat-cod.mkiv"> <cd:arguments> <cd:resolve name="argument-file"/> </cd:arguments> </cd:command> - <cd:command name="lua" type="environment" file="luat-ini.mkiv"/> + <cd:command name="lua" type="environment" level="system" category="lua" file="luat-ini.mkiv"/> - <cd:command name="luacode" type="environment" file="luat-ini.mkiv"/> + <cd:command name="luacode" type="environment" level="system" category="lua" file="luat-ini.mkiv"/> - <cd:command name="luamajorversion" file="luat-ini.mkiv"/> + <cd:command name="luamajorversion" level="system" category="lua" file="luat-ini.mkiv"/> - <cd:command name="luaminorversion" file="luat-ini.mkiv"/> + <cd:command name="luaminorversion" level="system" category="lua" file="luat-ini.mkiv"/> - <cd:command name="luaexpanded" file="luat-ini.mkiv"> + <cd:command name="luaexpanded" level="system" category="lua" file="luat-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-command"/> </cd:arguments> </cd:command> - <cd:command name="luaparameterset" type="environment" file="luat-ini.mkiv"> + <cd:command name="luaparameterset" type="environment" level="system" category="lua" file="luat-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="luaparameterset" file="luat-ini.mkiv"> + <cd:command name="luaparameterset" level="system" category="lua" file="luat-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="luaconditional" file="luat-ini.mkiv"> + <cd:command name="luaconditional" level="system" category="lua" file="luat-ini.mkiv"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="ctxluacode" file="luat-ini.mkiv"> + <cd:command name="ctxluacode" level="system" category="lua" file="luat-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-command"/> </cd:arguments> </cd:command> - <cd:command name="ctxfunctiondefinition" type="environment" file="luat-ini.mkiv"> + <cd:command name="ctxfunctiondefinition" type="environment" level="system" category="lua" file="luat-ini.mkiv"> <cd:arguments> <cd:resolve name="string-name"/> </cd:arguments> </cd:command> - <cd:command name="ctxfunctiondefinition" generated="yes" variant="example" file="luat-ini.mkiv"> + <cd:command name="ctxfunctiondefinition" generated="yes" variant="example" level="system" category="lua" file="luat-ini.mkiv"> <cd:sequence> <cd:variable value="ctxfunctiondefinition"/> </cd:sequence> </cd:command> - <cd:command name="ctxfunction" type="environment" file="luat-ini.mkiv"> + <cd:command name="ctxfunction" type="environment" level="system" category="lua" file="luat-ini.mkiv"> <cd:arguments> <cd:resolve name="string-name"/> </cd:arguments> </cd:command> - <cd:command name="ctxfunction" file="luat-ini.mkiv"> + <cd:command name="ctxfunction" level="system" category="lua" file="luat-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="ctxfunction" generated="yes" variant="example" file="luat-ini.mkiv"> + <cd:command name="ctxfunction" generated="yes" variant="example" level="system" category="lua" file="luat-ini.mkiv"> <cd:sequence> <cd:variable value="ctxfunction"/> </cd:sequence> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-makeup.xml b/tex/context/interface/mkiv/i-makeup.xml index 8831a8b0b..dc2bd9ad4 100644 --- a/tex/context/interface/mkiv/i-makeup.xml +++ b/tex/context/interface/mkiv/i-makeup.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definemakeup" file="page-mak.mkvi"> + <cd:command name="definemakeup" level="style" category="structure layout" file="page-mak.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupmakeup" file="page-mak.mkvi"> + <cd:command name="setupmakeup" level="style" category="structure layout" file="page-mak.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -104,7 +104,7 @@ <cd:constant type="empty" default="yes"/> </cd:parameter> <cd:parameter name="style"> - <cd:inherit name="value-style"/> + <cd:resolve name="value-style"/> </cd:parameter> <cd:parameter name="color"> <cd:constant type="cd:color"/> @@ -113,7 +113,7 @@ </cd:arguments> </cd:command> - <cd:command name="makeup" type="environment" file="page-mak.mkvi"> + <cd:command name="makeup" type="environment" level="document" category="structure layout" file="page-mak.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes" optional="yes"> @@ -122,7 +122,7 @@ </cd:arguments> </cd:command> - <cd:command name="makeup" type="environment" generated="yes" variant="instance" file="page-mak.mkvi"> + <cd:command name="makeup" type="environment" generated="yes" variant="instance" level="document" category="structure layout" file="page-mak.mkvi"> <cd:sequence> <cd:instance value="makeup"/> <cd:string value="makeup"/> @@ -139,7 +139,7 @@ <!-- - <cd:command name="standardmakeup" type="environment" file="page-mak.mkvi"> + <cd:command name="standardmakeup" type="environment" level="document" category="structure layout" file="page-mak.mkvi"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupmakeup"/> @@ -147,7 +147,7 @@ </cd:arguments> </cd:command> - <cd:command name="textmakeup" type="environment" file="page-mak.mkvi"> + <cd:command name="textmakeup" type="environment" level="document" category="structure layout" file="page-mak.mkvi"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupmakeup"/> @@ -155,7 +155,7 @@ </cd:arguments> </cd:command> - <cd:command name="pagemakeup" type="environment" file="page-mak.mkvi"> + <cd:command name="pagemakeup" type="environment" level="document" category="structure layout" file="page-mak.mkvi"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupmakeup"/> @@ -163,7 +163,7 @@ </cd:arguments> </cd:command> - <cd:command name="middlemakeup" type="environment" file="page-mak.mkvi"> + <cd:command name="middlemakeup" type="environment" level="document" category="structure layout" file="page-mak.mkvi"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupmakeup"/> @@ -173,4 +173,4 @@ --> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-marginblock.xml b/tex/context/interface/mkiv/i-marginblock.xml index f40bf112a..0d0e3c2b4 100644 --- a/tex/context/interface/mkiv/i-marginblock.xml +++ b/tex/context/interface/mkiv/i-marginblock.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definemarginblock" file="page-mbk.mkvi"> + <cd:command name="definemarginblock" level="style" category="structure layout" file="page-mbk.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupmarginblock" file="page-mbk.mkvi"> + <cd:command name="setupmarginblock" level="style" category="structure layout" file="page-mbk.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -67,7 +67,7 @@ <!-- - <cd:command name="setupmarginblocks" file="page-mbk.mkvi"> + <cd:command name="setupmarginblocks" level="style" category="structure layout" file="page-mbk.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -78,10 +78,10 @@ --> - <cd:command name="marginblock" type="environment" file="page-mbk.mkvi"> + <cd:command name="marginblock" type="environment" level="document" category="structure layout" file="page-mbk.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-margindata.xml b/tex/context/interface/mkiv/i-margindata.xml index a54362fec..a157aaf9c 100644 --- a/tex/context/interface/mkiv/i-margindata.xml +++ b/tex/context/interface/mkiv/i-margindata.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definemargindata" file="typo-mar.mkiv"> + <cd:command name="definemargindata" level="style" category="structure" file="typo-mar.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupmargindata" file="typo-mar.mkiv"> + <cd:command name="setupmargindata" level="style" category="structure" file="typo-mar.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -107,7 +107,7 @@ <!-- - <cd:command name="definemarginframed" file="typo-mar.mkiv"> + <cd:command name="definemarginframed" level="system" category="structure" file="typo-mar.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -119,7 +119,7 @@ --> - <cd:command name="setupmarginframed" file="typo-mar.mkiv"> + <cd:command name="setupmarginframed" level="style" category="structure" file="typo-mar.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -128,7 +128,7 @@ </cd:arguments> </cd:command> - <cd:command name="margindata" generated="yes" variant="instance" file="typo-mar.mkiv"> + <cd:command name="margindata" generated="yes" variant="instance" level="document" category="structure" file="typo-mar.mkiv"> <cd:sequence> <cd:instance value="margindata"/> </cd:sequence> @@ -149,7 +149,7 @@ </cd:instances> </cd:command> - <cd:command name="margindata" file="typo-mar.mkiv"> + <cd:command name="margindata" level="document" category="structure" file="typo-mar.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes" optional="yes"> @@ -167,7 +167,7 @@ <!-- - <cd:command name="inleftmargin" file="typo-mar.mkiv"> + <cd:command name="inleftmargin" level="document" category="structure" file="typo-mar.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="reference"> @@ -179,7 +179,7 @@ </cd:arguments> </cd:command> - <cd:command name="inrightmargin" file="typo-mar.mkiv"> + <cd:command name="inrightmargin" level="document" category="structure" file="typo-mar.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="reference"> @@ -191,7 +191,7 @@ </cd:arguments> </cd:command> - <cd:command name="inoutermargin" file="typo-mar.mkiv"> + <cd:command name="inoutermargin" level="document" category="structure" file="typo-mar.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="reference"> @@ -203,7 +203,7 @@ </cd:arguments> </cd:command> - <cd:command name="ininnermargin" file="typo-mar.mkiv"> + <cd:command name="ininnermargin" level="document" category="structure" file="typo-mar.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="reference"> @@ -215,7 +215,7 @@ </cd:arguments> </cd:command> - <cd:command name="inleftedge" file="typo-mar.mkiv"> + <cd:command name="inleftedge" level="document" category="structure" file="typo-mar.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="reference"> @@ -227,7 +227,7 @@ </cd:arguments> </cd:command> - <cd:command name="inrightedge" file="typo-mar.mkiv"> + <cd:command name="inrightedge" level="document" category="structure" file="typo-mar.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="reference"> @@ -239,7 +239,7 @@ </cd:arguments> </cd:command> - <cd:command name="ininneredge" file="typo-mar.mkiv"> + <cd:command name="ininneredge" level="document" category="structure" file="typo-mar.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="reference"> @@ -251,7 +251,7 @@ </cd:arguments> </cd:command> - <cd:command name="inouteredge" file="typo-mar.mkiv"> + <cd:command name="inouteredge" level="document" category="structure" file="typo-mar.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="reference"> @@ -263,7 +263,7 @@ </cd:arguments> </cd:command> - <cd:command name="atleftmargin" file="typo-mar.mkiv"> + <cd:command name="atleftmargin" level="document" category="structure" file="typo-mar.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="reference"> @@ -275,7 +275,7 @@ </cd:arguments> </cd:command> - <cd:command name="atrightmargin" file="typo-mar.mkiv"> + <cd:command name="atrightmargin" level="document" category="structure" file="typo-mar.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="reference"> @@ -287,7 +287,7 @@ </cd:arguments> </cd:command> - <cd:command name="inleft" file="typo-mar.mkiv"> + <cd:command name="inleft" level="document" category="structure" file="typo-mar.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="reference"> @@ -302,7 +302,7 @@ </cd:arguments> </cd:command> - <cd:command name="inright" file="typo-mar.mkiv"> + <cd:command name="inright" level="document" category="structure" file="typo-mar.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="reference"> @@ -317,7 +317,7 @@ </cd:arguments> </cd:command> - <cd:command name="ininner" file="typo-mar.mkiv"> + <cd:command name="ininner" level="document" category="structure" file="typo-mar.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="reference"> @@ -332,7 +332,7 @@ </cd:arguments> </cd:command> - <cd:command name="inouter" file="typo-mar.mkiv"> + <cd:command name="inouter" level="document" category="structure" file="typo-mar.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="reference"> @@ -347,7 +347,7 @@ </cd:arguments> </cd:command> - <cd:command name="inmargin" file="typo-mar.mkiv"> + <cd:command name="inmargin" level="document" category="structure" file="typo-mar.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="reference"> @@ -362,7 +362,7 @@ </cd:arguments> </cd:command> - <cd:command name="inother" file="typo-mar.mkiv"> + <cd:command name="inother" level="document" category="structure" file="typo-mar.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="reference"> @@ -377,7 +377,7 @@ </cd:arguments> </cd:command> - <cd:command name="margintext" file="typo-mar.mkiv"> + <cd:command name="margintext" level="document" category="structure" file="typo-mar.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="reference"> @@ -389,7 +389,7 @@ </cd:arguments> </cd:command> - <cd:command name="marginword" file="typo-mar.mkiv"> + <cd:command name="marginword" level="document" category="structure" file="typo-mar.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="reference"> @@ -401,7 +401,7 @@ </cd:arguments> </cd:command> - <cd:command name="margintitle" file="typo-mar.mkiv"> + <cd:command name="margintitle" level="document" category="structure" file="typo-mar.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="reference"> @@ -413,7 +413,7 @@ </cd:arguments> </cd:command> - <cd:command name="inothermargin" file="typo-mar.mkiv"> + <cd:command name="inothermargin" level="document" category="structure" file="typo-mar.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="reference"> @@ -430,4 +430,4 @@ --> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-marker.xml b/tex/context/interface/mkiv/i-marker.xml index fe491650e..2db8a9de1 100644 --- a/tex/context/interface/mkiv/i-marker.xml +++ b/tex/context/interface/mkiv/i-marker.xml @@ -4,30 +4,30 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definemarker" file="attr-mkr.mkiv"> + <cd:command name="definemarker" level="system" category="attribute" file="attr-mkr.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="setmarker" file="attr-mkr.mkiv"> + <cd:command name="setmarker" level="system" category="attribute" file="attr-mkr.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-number"/> </cd:arguments> </cd:command> - <cd:command name="resetmarker" file="attr-mkr.mkiv"> + <cd:command name="resetmarker" level="system" category="attribute" file="attr-mkr.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="boxmarker" file="attr-mkr.mkiv"> + <cd:command name="boxmarker" level="system" category="attribute" file="attr-mkr.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-marking.xml b/tex/context/interface/mkiv/i-marking.xml index 644f0ac5b..914922cf2 100644 --- a/tex/context/interface/mkiv/i-marking.xml +++ b/tex/context/interface/mkiv/i-marking.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definemarking" file="strc-mar.mkiv"> + <cd:command name="definemarking" level="style" file="strc-mar.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-mark-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupmarking" file="strc-mar.mkiv"> + <cd:command name="setupmarking" level="style" file="strc-mar.mkiv"> <cd:arguments> <cd:resolve name="keyword-mark-list-optional"/> <cd:assignments list="yes"> @@ -36,27 +36,27 @@ </cd:arguments> </cd:command> - <cd:command name="relatemarking" file="strc-mar.mkiv"> + <cd:command name="relatemarking" level="system" file="strc-mar.mkiv"> <cd:arguments> <cd:resolve name="keyword-mark"/> <cd:resolve name="keyword-mark"/> </cd:arguments> </cd:command> - <cd:command name="setmarking" file="strc-mar.mkiv"> + <cd:command name="setmarking" level="style" file="strc-mar.mkiv"> <cd:arguments> <cd:resolve name="keyword-mark"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="resetmarking" file="strc-mar.mkiv"> + <cd:command name="resetmarking" level="system" file="strc-mar.mkiv"> <cd:arguments> <cd:resolve name="keyword-mark"/> </cd:arguments> </cd:command> - <cd:command name="synchronizemarking" file="strc-mar.mkiv"> + <cd:command name="synchronizemarking" level="system" file="strc-mar.mkiv"> <cd:arguments> <cd:resolve name="keyword-mark"/> <cd:resolve name="keyword-number"/> @@ -66,7 +66,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifelsemarking" file="strc-mar.mkiv"> + <cd:command name="doifelsemarking" level="system" category="conditional" file="strc-mar.mkiv"> <cd:arguments> <cd:resolve name="argument-mark"/> <cd:resolve name="argument-true"/> @@ -74,7 +74,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifmarkingelse" file="strc-mar.mkiv"> + <cd:command name="doifmarkingelse" level="system" category="conditional" file="strc-mar.mkiv"> <cd:arguments> <cd:resolve name="argument-mark"/> <cd:resolve name="argument-true"/> @@ -82,7 +82,7 @@ </cd:arguments> </cd:command> - <cd:command name="getmarking" file="strc-mar.mkiv"> + <cd:command name="getmarking" level="style" file="strc-mar.mkiv"> <cd:arguments> <cd:resolve name="keyword-mark"/> <cd:keywords optional="yes"> @@ -95,7 +95,7 @@ </cd:arguments> </cd:command> - <cd:command name="fetchonemark" file="strc-mar.mkiv"> + <cd:command name="fetchonemark" level="style" file="strc-mar.mkiv"> <cd:arguments> <cd:resolve name="keyword-mark"/> <cd:keywords optional="yes"> @@ -104,19 +104,19 @@ </cd:arguments> </cd:command> - <cd:command name="fetchtwomarks" file="strc-mar.mkiv"> + <cd:command name="fetchtwomarks" level="style" file="strc-mar.mkiv"> <cd:arguments> <cd:resolve name="keyword-mark"/> </cd:arguments> </cd:command> - <cd:command name="fetchallmarks" file="strc-mar.mkiv"> + <cd:command name="fetchallmarks" level="style" file="strc-mar.mkiv"> <cd:arguments> <cd:resolve name="keyword-mark"/> </cd:arguments> </cd:command> - <cd:command name="fetchmark" file="strc-mar.mkiv"> + <cd:command name="fetchmark" level="style" file="strc-mar.mkiv"> <cd:arguments> <cd:resolve name="keyword-mark"/> <cd:keywords optional="yes"> @@ -125,7 +125,7 @@ </cd:arguments> </cd:command> - <cd:command name="fetchmarking" file="strc-mar.mkiv"> + <cd:command name="fetchmarking" level="style" file="strc-mar.mkiv"> <cd:arguments> <cd:resolve name="keyword-mark"/> <cd:keywords> @@ -138,7 +138,7 @@ </cd:arguments> </cd:command> - <cd:command name="fetchonemarking" file="strc-mar.mkiv"> + <cd:command name="fetchonemarking" level="style" file="strc-mar.mkiv"> <cd:arguments> <cd:resolve name="keyword-mark"/> <cd:keywords> @@ -151,7 +151,7 @@ </cd:arguments> </cd:command> - <cd:command name="fetchtwomarkings" file="strc-mar.mkiv"> + <cd:command name="fetchtwomarkings" level="style" file="strc-mar.mkiv"> <cd:arguments> <cd:resolve name="keyword-mark"/> <cd:keywords> @@ -161,7 +161,7 @@ </cd:arguments> </cd:command> - <cd:command name="fetchallmarkings" file="strc-mar.mkiv"> + <cd:command name="fetchallmarkings" level="style" file="strc-mar.mkiv"> <cd:arguments> <cd:resolve name="keyword-mark"/> <cd:keywords> @@ -171,4 +171,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-math.xml b/tex/context/interface/mkiv/i-math.xml index 58890d6ea..af9d87cb8 100644 --- a/tex/context/interface/mkiv/i-math.xml +++ b/tex/context/interface/mkiv/i-math.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definemathematics" category="mathematics" file="math-ini.mkiv"> + <cd:command name="definemathematics" level="style" category="mathematics" file="math-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupmathematics" category="mathematics" file="math-ini.mkiv"> + <cd:command name="setupmathematics" level="style" category="mathematics" file="math-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -63,10 +63,14 @@ <cd:constant type="none"/> <cd:constant type="reset"/> </cd:parameter> - <cd:parameter name="autopunctuation"> + <cd:parameter name="autopunctuation" list="yes"> <cd:constant type="yes"/> <cd:constant type="no" default="yes"/> <cd:constant type="all"/> + <cd:constant type="comma"/> + <cd:constant type="yes,semicolon"/> + <cd:constant type="comma,semicolon"/> + <cd:constant type="all,semicolon"/> </cd:parameter> <cd:parameter name="setups"> <cd:constant type="cd:name"/> @@ -102,39 +106,42 @@ <cd:constant type="ams"/> <cd:constant type="ctx" default="yes"/> </cd:parameter> + <cd:parameter name="ampersand"> + <cd:constant type="normal"/> + </cd:parameter> </cd:assignments> </cd:arguments> </cd:command> - <cd:command name="inlineordisplaymath" category="mathematics" file="math-ini.mkiv"> + <cd:command name="inlineordisplaymath" level="system" category="mathematics" file="math-ini.mkiv"> <cd:arguments> <cd:content/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="mathematics" category="mathematics" file="math-ini.mkiv"> + <cd:command name="mathematics" level="document" category="mathematics" file="math-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="math" category="mathematics" file="math-ini.mkiv"> + <cd:command name="math" level="document" category="mathematics" file="math-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="m" category="mathematics" file="math-ini.mkiv"> + <cd:command name="m" level="document" category="mathematics" file="math-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="definemathcommand" category="mathematics" file="math-ini.mkiv"> + <cd:command name="definemathcommand" level="style" category="mathematics" file="math-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:keywords optional="yes"> @@ -164,7 +171,7 @@ </cd:arguments> </cd:command> - <cd:command name="mathcommand" generated="yes" variant="example" file="math-ini.mkiv"> + <cd:command name="mathcommand" generated="yes" variant="example" level="document" category="mathematics" file="math-ini.mkiv"> <cd:sequence> <cd:variable value="mathcommand"/> </cd:sequence> @@ -174,63 +181,67 @@ </cd:arguments> </cd:command> - <cd:command name="mathcommand" file="math-ini.mkiv"> - <cd:arguments> - <cd:resolve name="argument-name"/> - </cd:arguments> - </cd:command> + <!-- + + <cd:command name="mathcommand" level="document" category="mathematics" file="math-ini.mkiv"> + <cd:arguments> + <cd:resolve name="argument-name"/> + </cd:arguments> + </cd:command> + + --> - <cd:command name="mathop" file="math-ini.mkiv"> + <cd:command name="mathop" level="style" category="mathematics" file="math-ini.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="mbox" file="math-ini.mkiv"> + <cd:command name="mbox" level="document" category="mathematics" file="math-ini.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="mtext" file="math-ini.mkiv"> + <cd:command name="mtext" level="document" category="mathematics" file="math-ini.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="mathfunction" category="mathematics" file="math-ini.mkiv"> + <cd:command name="mathfunction" level="style" category="mathematics" file="math-ini.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="mfunction" category="mathematics" file="math-ini.mkiv"> + <cd:command name="mfunction" level="style" category="mathematics" file="math-ini.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="mfunctionlabeltext" file="math-ini.mkiv"> + <cd:command name="mfunctionlabeltext" level="system" category="mathematics" file="math-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="stackrel" file="math-ini.mkiv"> + <cd:command name="stackrel" level="document" category="mathematics" file="math-ini.mkiv"> <cd:arguments> <cd:content/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="apply" file="math-ini.mkiv"> + <cd:command name="apply" level="document" category="mathematics" file="math-ini.mkiv"> <cd:arguments> <cd:content/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="definemathstyle" file="math-ini.mkiv"> + <cd:command name="definemathstyle" level="system" category="mathematics" file="math-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:keywords list="yes"> @@ -239,7 +250,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupmathstyle" file="math-ini.mkiv"> + <cd:command name="setupmathstyle" level="style" category="mathematics" file="math-ini.mkiv"> <cd:arguments> <cd:keywords list="yes"> <cd:resolve name="value-mathstyle"/> @@ -248,7 +259,7 @@ </cd:arguments> </cd:command> - <cd:command name="setmathstyle" file="math-ini.mkiv"> + <cd:command name="setmathstyle" level="system" category="mathematics" file="math-ini.mkiv"> <cd:arguments> <cd:keywords delimiters="braces" list="yes"> <cd:resolve name="value-mathstyle"/> @@ -257,7 +268,7 @@ </cd:arguments> </cd:command> - <cd:command name="mathstyle" type="environment" file="math-ini.mkiv"> + <cd:command name="mathstyle" type="environment" level="system" category="mathematics" file="math-ini.mkiv"> <cd:arguments> <cd:keywords list="yes"> <cd:resolve name="value-mathstyle"/> @@ -266,218 +277,226 @@ </cd:arguments> </cd:command> - <cd:command name="mathstyle" type="environment" begin="push" end="pop" file="math-ini.mkiv"/> + <cd:command name="mathstyle" type="environment" begin="push" end="pop" level="system" category="mathematics" file="math-ini.mkiv"/> - <cd:command name="usemathstyleparameter" file="math-ini.mkiv"> + <cd:command name="usemathstyleparameter" level="system" category="mathematics" file="math-ini.mkiv"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="usemathstyleparameter" type="environment" file="math-ini.mkiv"> + <cd:command name="usemathstyleparameter" type="environment" level="system" category="mathematics" file="math-ini.mkiv"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="mathtext" file="math-ini.mkiv"> + <cd:command name="mathtext" level="document" category="mathematics" file="math-ini.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="mathtexttf" file="math-ini.mkiv"> + <cd:command name="mathtexttf" level="document" category="mathematics" file="math-ini.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="mathtextit" file="math-ini.mkiv"> + <cd:command name="mathtextit" level="document" category="mathematics" file="math-ini.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="mathtextsl" file="math-ini.mkiv"> + <cd:command name="mathtextsl" level="document" category="mathematics" file="math-ini.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="mathtextbf" file="math-ini.mkiv"> + <cd:command name="mathtextbf" level="document" category="mathematics" file="math-ini.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="mathtextbi" file="math-ini.mkiv"> + <cd:command name="mathtextbi" level="document" category="mathematics" file="math-ini.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="mathtextbs" file="math-ini.mkiv"> + <cd:command name="mathtextbs" level="document" category="mathematics" file="math-ini.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="mathword" file="math-ini.mkiv"> + <cd:command name="mathword" level="document" category="mathematics" file="math-ini.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="mathwordtf" file="math-ini.mkiv"> + <cd:command name="mathwordtf" level="document" category="mathematics" file="math-ini.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="mathwordit" file="math-ini.mkiv"> + <cd:command name="mathwordit" level="document" category="mathematics" file="math-ini.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="mathwordsl" file="math-ini.mkiv"> + <cd:command name="mathwordsl" level="document" category="mathematics" file="math-ini.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="mathwordbf" file="math-ini.mkiv"> + <cd:command name="mathwordbf" level="document" category="mathematics" file="math-ini.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="mathwordbi" file="math-ini.mkiv"> + <cd:command name="mathwordbi" level="document" category="mathematics" file="math-ini.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="mathwordbs" file="math-ini.mkiv"> + <cd:command name="mathwordbs" level="document" category="mathematics" file="math-ini.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="mathrm" file="math-ini.mkiv"/> + <cd:command name="mathrm" level="document" category="mathematics" file="math-ini.mkiv"/> - <cd:command name="mathss" file="math-ini.mkiv"/> + <cd:command name="mathss" level="document" category="mathematics" file="math-ini.mkiv"/> - <cd:command name="mathtt" file="math-ini.mkiv"/> + <cd:command name="mathtt" level="document" category="mathematics" file="math-ini.mkiv"/> - <cd:command name="mathtf" file="math-ini.mkiv"/> + <cd:command name="mathtf" level="document" category="mathematics" file="math-ini.mkiv"/> - <cd:command name="mathsl" file="math-ini.mkiv"/> + <cd:command name="mathsl" level="document" category="mathematics" file="math-ini.mkiv"/> - <cd:command name="mathit" file="math-ini.mkiv"/> + <cd:command name="mathit" level="document" category="mathematics" file="math-ini.mkiv"/> - <cd:command name="mathbf" file="math-ini.mkiv"/> + <cd:command name="mathbf" level="document" category="mathematics" file="math-ini.mkiv"/> - <cd:command name="mathbi" file="math-ini.mkiv"/> + <cd:command name="mathbi" level="document" category="mathematics" file="math-ini.mkiv"/> - <cd:command name="mathbs" file="math-ini.mkiv"/> + <cd:command name="mathbs" level="document" category="mathematics" file="math-ini.mkiv"/> - <cd:command name="mathitalic" file="math-ini.mkiv"/> + <cd:command name="mathitalic" level="document" category="mathematics" file="math-ini.mkiv"/> - <cd:command name="mathupright" file="math-ini.mkiv"/> + <cd:command name="mathupright" level="document" category="mathematics" file="math-ini.mkiv"/> - <cd:command name="mathdefault" file="math-ini.mkiv"/> + <cd:command name="mathdefault" level="document" category="mathematics" file="math-ini.mkiv"/> - <cd:command name="mathscript" file="math-ini.mkiv"/> + <cd:command name="mathscript" level="document" category="mathematics" file="math-ini.mkiv"/> - <cd:command name="mathfraktur" file="math-ini.mkiv"/> + <cd:command name="mathfraktur" level="document" category="mathematics" file="math-ini.mkiv"/> - <cd:command name="mathblackboard" file="math-ini.mkiv"/> + <cd:command name="mathblackboard" level="document" category="mathematics" file="math-ini.mkiv"/> - <cd:command name="displaymath" file="supp-mat.mkiv"> + <cd:command name="displaymath" level="style" category="mathematics" file="supp-mat.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="inlinemath" file="supp-mat.mkiv"> + <cd:command name="inlinemath" level="style" category="mathematics" file="supp-mat.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="textmath" file="supp-mat.mkiv"> + <cd:command name="textmath" level="style" category="mathematics" file="supp-mat.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="imath" type="environment" file="supp-mat.mkiv"/> + <cd:command name="imath" type="environment" level="system" category="mathematics" file="supp-mat.mkiv"/> - <cd:command name="dmath" type="environment" file="supp-mat.mkiv"/> + <cd:command name="dmath" type="environment" level="system" category="mathematics" file="supp-mat.mkiv"/> - <cd:command name="mathmode" type="environment" file="supp-mat.mkiv"/> + <cd:command name="mathmode" type="environment" level="system" category="mathematics" file="supp-mat.mkiv"/> - <cd:command name="nonmathematics" file="supp-mat.mkiv"> + <cd:command name="nonmathematics" level="system" category="mathematics" file="supp-mat.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="displaymathematics" file="supp-mat.mkiv"> + <cd:command name="displaymathematics" level="system" category="mathematics" file="supp-mat.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="inlinemathematics" file="supp-mat.mkiv"> + <cd:command name="inlinemathematics" level="system" category="mathematics" file="supp-mat.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="automathematics" file="supp-mat.mkiv"> + <cd:command name="automathematics" level="system" category="mathematics" file="supp-mat.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="cramped" file="supp-mat.mkiv"> + <cd:command name="cramped" level="system" category="mathematics" file="supp-mat.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="crampedllap" file="supp-mat.mkiv"> + <cd:command name="crampedllap" level="system" category="mathematics" file="supp-mat.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="crampedrlap" file="supp-mat.mkiv"> + <cd:command name="crampedrlap" level="system" category="mathematics" file="supp-mat.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="crampedclap" file="supp-mat.mkiv"> + <cd:command name="crampedclap" level="system" category="mathematics" file="supp-mat.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> + <cd:command name="autointegral" level="system" category="mathematics" file="math-del.mkiv"> + <cd:arguments> + <cd:resolve name="argument-text"/> + <cd:resolve name="argument-text"/> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + </cd:interface> diff --git a/tex/context/interface/mkiv/i-mathalignment.xml b/tex/context/interface/mkiv/i-mathalignment.xml index 5caa1348c..325b288c7 100644 --- a/tex/context/interface/mkiv/i-mathalignment.xml +++ b/tex/context/interface/mkiv/i-mathalignment.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definemathalignment" file="math-ali.mkiv"> + <cd:command name="definemathalignment" level="style" category="mathematics alignment" file="math-ali.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupmathalignment" file="math-ali.mkiv"> + <cd:command name="setupmathalignment" level="style" category="mathematics alignment" file="math-ali.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -27,17 +27,33 @@ <cd:parameter name="distance"> <cd:constant type="cd:dimension"/> </cd:parameter> + <cd:parameter name="number"> + <cd:constant type="auto"/> + </cd:parameter> + <cd:parameter name="separator"> + <cd:constant type="cd:text"/> + </cd:parameter> <cd:parameter name="align"> <cd:constant type="left"/> <cd:constant type="middle"/> <cd:constant type="right"/> <cd:constant type="normal" default="yes"/> </cd:parameter> + <cd:parameter name="location"> + <cd:constant type="top"/> + <cd:constant type="center"/> + <cd:constant type="bottom"/> + <cd:constant type="normal" default="yes"/> + </cd:parameter> + <cd:parameter name="grid"> + <cd:constant type="math" default="yes"/> + <cd:constant type="no"/> + </cd:parameter> </cd:assignments> </cd:arguments> </cd:command> - <cd:command name="mathalignment" type="environment" generated="yes" variant="instance" file="math-ali.mkiv"> + <cd:command name="mathalignment" type="environment" generated="yes" variant="instance" level="document" category="mathematics alignment" file="math-ali.mkiv"> <cd:sequence> <cd:instance value="mathalignment"/> </cd:sequence> @@ -53,7 +69,7 @@ <!-- - <cd:command name="mathalignment" type="environment" file="math-ali.mkiv"> + <cd:command name="mathalignment" type="environment" level="document" category="mathematics alignment" file="math-ali.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupmathalignment"/> @@ -61,7 +77,7 @@ </cd:arguments> </cd:command> - <cd:command name="align" type="environment" file="math-ali.mkiv"> + <cd:command name="align" type="environment" level="document" category="mathematics alignment" file="math-ali.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupmathalignment"/> @@ -71,4 +87,4 @@ --> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-mathcases.xml b/tex/context/interface/mkiv/i-mathcases.xml index 8a27c4413..837f2b782 100644 --- a/tex/context/interface/mkiv/i-mathcases.xml +++ b/tex/context/interface/mkiv/i-mathcases.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definemathcases" file="math-ali.mkiv"> + <cd:command name="definemathcases" level="style" category="mathematics alignment" file="math-ali.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupmathcases" file="math-ali.mkiv"> + <cd:command name="setupmathcases" level="style" category="mathematics alignment" file="math-ali.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -41,7 +41,7 @@ </cd:arguments> </cd:command> - <cd:command name="mathcases" type="environment" generated="yes" variant="instance" file="math-ali.mkiv"> + <cd:command name="mathcases" type="environment" generated="yes" variant="instance" level="document" category="mathematics alignment" file="math-ali.mkiv"> <cd:sequence> <cd:instance value="mathcases"/> </cd:sequence> @@ -57,7 +57,7 @@ <!-- - <cd:command name="mathcases" type="environment" file="math-ali.mkiv"> + <cd:command name="mathcases" type="environment" level="document" category="mathematics alignment" file="math-ali.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupmathcases"/> @@ -65,7 +65,7 @@ </cd:arguments> </cd:command> - <cd:command name="cases" type="environment" file="math-ali.mkiv"> + <cd:command name="cases" type="environment" level="document" category="mathematics alignment" file="math-ali.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupmathcases"/> @@ -75,4 +75,4 @@ --> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-mathfence.xml b/tex/context/interface/mkiv/i-mathfence.xml index 9676e2a37..76151fae4 100644 --- a/tex/context/interface/mkiv/i-mathfence.xml +++ b/tex/context/interface/mkiv/i-mathfence.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definemathfence" file="math-fen.mkiv"> + <cd:command name="definemathfence" level="style" category="mathematics" file="math-fen.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupmathfence" file="math-fen.mkiv"> + <cd:command name="setupmathfence" level="style" category="mathematics" file="math-fen.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -40,16 +40,22 @@ <cd:parameter name="state"> <cd:constant type="auto"/> </cd:parameter> + <cd:parameter name="method"> + <cd:constant type="auto"/> + </cd:parameter> <cd:parameter name="factor"> - <cd:constant type="auto" default="yes"/> <cd:constant type="none"/> - <cd:constant type="number"/> + <cd:constant type="auto"/> + <cd:constant type="cd:number"/> + </cd:parameter> + <cd:parameter name="mathclass"> + <cd:constant type="cd:number"/> </cd:parameter> </cd:assignments> </cd:arguments> </cd:command> - <cd:command name="fence" generated="yes" variant="example" file="math-fen.mkiv"> + <cd:command name="fence" generated="yes" variant="example" level="document" category="mathematics" file="math-fen.mkiv"> <cd:sequence> <cd:variable value="fence"/> </cd:sequence> @@ -58,147 +64,147 @@ </cd:arguments> </cd:command> - <cd:command name="fenced" file="math-fen.mkiv"> + <cd:command name="fenced" level="document" category="mathematics" file="math-fen.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="fence" file="math-fen.mkiv"/> + <cd:command name="fence" level="document" category="mathematics" file="math-fen.mkiv"/> - <cd:command name="left" file="math-fen.mkiv"> + <cd:command name="left" level="document" category="mathematics" file="math-fen.mkiv"> <cd:arguments> <cd:resolve name="string-character"/> </cd:arguments> </cd:command> - <cd:command name="middle" file="math-fen.mkiv"> + <cd:command name="middle" level="document" category="mathematics" file="math-fen.mkiv"> <cd:arguments> <cd:resolve name="string-character"/> </cd:arguments> </cd:command> - <cd:command name="right" file="math-fen.mkiv"> + <cd:command name="right" level="document" category="mathematics" file="math-fen.mkiv"> <cd:arguments> <cd:resolve name="string-character"/> </cd:arguments> </cd:command> - <cd:command name="big" file="math-fen.mkiv"> + <cd:command name="big" level="document" category="mathematics" file="math-fen.mkiv"> <cd:arguments> <cd:resolve name="string-character"/> </cd:arguments> </cd:command> - <cd:command name="Big" file="math-fen.mkiv"> + <cd:command name="Big" level="document" category="mathematics" file="math-fen.mkiv"> <cd:arguments> <cd:resolve name="string-character"/> </cd:arguments> </cd:command> - <cd:command name="bigg" file="math-fen.mkiv"> + <cd:command name="bigg" level="document" category="mathematics" file="math-fen.mkiv"> <cd:arguments> <cd:resolve name="string-character"/> </cd:arguments> </cd:command> - <cd:command name="Bigg" file="math-fen.mkiv"> + <cd:command name="Bigg" level="document" category="mathematics" file="math-fen.mkiv"> <cd:arguments> <cd:resolve name="string-character"/> </cd:arguments> </cd:command> - <cd:command name="bigl" file="math-fen.mkiv"> + <cd:command name="bigl" level="document" category="mathematics" file="math-fen.mkiv"> <cd:arguments> <cd:resolve name="string-character"/> </cd:arguments> </cd:command> - <cd:command name="bigm" file="math-fen.mkiv"> + <cd:command name="bigm" level="document" category="mathematics" file="math-fen.mkiv"> <cd:arguments> <cd:resolve name="string-character"/> </cd:arguments> </cd:command> - <cd:command name="bigr" file="math-fen.mkiv"> + <cd:command name="bigr" level="document" category="mathematics" file="math-fen.mkiv"> <cd:arguments> <cd:resolve name="string-character"/> </cd:arguments> </cd:command> - <cd:command name="Bigl" file="math-fen.mkiv"> + <cd:command name="Bigl" level="document" category="mathematics" file="math-fen.mkiv"> <cd:arguments> <cd:resolve name="string-character"/> </cd:arguments> </cd:command> - <cd:command name="Bigm" file="math-fen.mkiv"> + <cd:command name="Bigm" level="document" category="mathematics" file="math-fen.mkiv"> <cd:arguments> <cd:resolve name="string-character"/> </cd:arguments> </cd:command> - <cd:command name="Bigr" file="math-fen.mkiv"> + <cd:command name="Bigr" level="document" category="mathematics" file="math-fen.mkiv"> <cd:arguments> <cd:resolve name="string-character"/> </cd:arguments> </cd:command> - <cd:command name="biggl" file="math-fen.mkiv"> + <cd:command name="biggl" level="document" category="mathematics" file="math-fen.mkiv"> <cd:arguments> <cd:resolve name="string-character"/> </cd:arguments> </cd:command> - <cd:command name="biggm" file="math-fen.mkiv"> + <cd:command name="biggm" level="document" category="mathematics" file="math-fen.mkiv"> <cd:arguments> <cd:resolve name="string-character"/> </cd:arguments> </cd:command> - <cd:command name="biggr" file="math-fen.mkiv"> + <cd:command name="biggr" level="document" category="mathematics" file="math-fen.mkiv"> <cd:arguments> <cd:resolve name="string-character"/> </cd:arguments> </cd:command> - <cd:command name="Biggl" file="math-fen.mkiv"> + <cd:command name="Biggl" level="document" category="mathematics" file="math-fen.mkiv"> <cd:arguments> <cd:resolve name="string-character"/> </cd:arguments> </cd:command> - <cd:command name="Biggm" file="math-fen.mkiv"> + <cd:command name="Biggm" level="document" category="mathematics" file="math-fen.mkiv"> <cd:arguments> <cd:resolve name="string-character"/> </cd:arguments> </cd:command> - <cd:command name="Biggr" file="math-fen.mkiv"> + <cd:command name="Biggr" level="document" category="mathematics" file="math-fen.mkiv"> <cd:arguments> <cd:resolve name="string-character"/> </cd:arguments> </cd:command> - <cd:command name="lfence" file="math-fen.mkiv"> + <cd:command name="lfence" level="document" category="mathematics" file="math-fen.mkiv"> <cd:arguments> <cd:resolve name="argument-character"/> </cd:arguments> </cd:command> - <cd:command name="mfence" file="math-fen.mkiv"> + <cd:command name="mfence" level="document" category="mathematics" file="math-fen.mkiv"> <cd:arguments> <cd:resolve name="argument-character"/> </cd:arguments> </cd:command> - <cd:command name="rfence" file="math-fen.mkiv"> + <cd:command name="rfence" level="document" category="mathematics" file="math-fen.mkiv"> <cd:arguments> <cd:resolve name="argument-character"/> </cd:arguments> </cd:command> - <cd:command name="checkedfences" type="environment" file="math-fen.mkiv"/> + <cd:command name="checkedfences" type="environment" level="style" category="mathematics" file="math-fen.mkiv"/> </cd:interface> diff --git a/tex/context/interface/mkiv/i-mathmatrix.xml b/tex/context/interface/mkiv/i-mathmatrix.xml index 50f99205a..bd1452cdc 100644 --- a/tex/context/interface/mkiv/i-mathmatrix.xml +++ b/tex/context/interface/mkiv/i-mathmatrix.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definemathmatrix" file="math-ali.mkiv"> + <cd:command name="definemathmatrix" level="style" category="mathematics tables" file="math-ali.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupmathmatrix" file="math-ali.mkiv"> + <cd:command name="setupmathmatrix" level="style" category="mathematics tables" file="math-ali.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -41,6 +41,9 @@ <cd:parameter name="distance"> <cd:constant type="cd:dimension"/> </cd:parameter> + <cd:parameter name="simplecommand"> + <cd:constant type="cd:text"/> + </cd:parameter> <cd:parameter name="location"> <cd:constant type="top"/> <cd:constant type="bottom"/> @@ -53,7 +56,7 @@ </cd:arguments> </cd:command> - <cd:command name="mathmatrix" type="environment" generated="yes" variant="instance" file="math-ali.mkiv"> + <cd:command name="mathmatrix" type="environment" generated="yes" variant="instance" level="document" category="mathematics tables" file="math-ali.mkiv"> <cd:sequence> <cd:instance value="mathmatrix"/> </cd:sequence> @@ -69,7 +72,7 @@ <!-- - <cd:command name="mathmatrix" type="environment" file="math-ali.mkiv"> + <cd:command name="mathmatrix" type="environment" level="document" category="mathematics tables" file="math-ali.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupmathmatrix"/> @@ -77,7 +80,7 @@ </cd:arguments> </cd:command> - <cd:command name="matrix" type="environment" file="math-ali.mkiv"> + <cd:command name="matrix" type="environment" level="document" category="mathematics tables" file="math-ali.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupmathmatrix"/> @@ -87,7 +90,7 @@ --> - <cd:command name="matrices" type="environment" file="math-ali.mkiv"> + <cd:command name="matrices" type="environment" level="document" category="mathematics tables" file="math-ali.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupmathmatrix"/> @@ -95,28 +98,44 @@ </cd:arguments> </cd:command> - <cd:command name="intertext" type="environment" file="math-ali.mkiv"/> + <cd:command name="intertext" type="environment" level="document" category="mathematics" file="math-ali.mkiv"/> - <cd:command name="intertext" file="math-ali.mkiv"> + <cd:command name="intertext" level="document" category="mathematics" file="math-ali.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="substack" type="environment" file="math-ali.mkiv"/> + <cd:command name="substack" type="environment" level="document" category="mathematics" file="math-ali.mkiv"/> - <cd:command name="overset" file="math-ali.mkiv"> + <cd:command name="overset" level="document" category="mathematics" file="math-ali.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="underset" file="math-ali.mkiv"> + <cd:command name="underset" level="document" category="mathematics" file="math-ali.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> + <cd:command name="bordermatrix" level="document" category="mathematics tables" file="math-pln.mkiv"> + <cd:arguments> + <cd:content/> + </cd:arguments> + </cd:command> + + <cd:command name="bbordermatrix" level="document" category="mathematics tables" file="math-pln.mkiv"> + <cd:arguments> + <cd:content/> + </cd:arguments> + </cd:command> + + <cd:command name="bordermatrix" type="environment" level="document" category="mathematics tables" file="math-pln.mkiv"/> + + <cd:command name="bbordermatrix" type="environment" level="document" category="mathematics tables" file="math-pln.mkiv"/> + </cd:interface> diff --git a/tex/context/interface/mkiv/i-mathornament.xml b/tex/context/interface/mkiv/i-mathornament.xml index cfa7b0d18..70100b8e4 100644 --- a/tex/context/interface/mkiv/i-mathornament.xml +++ b/tex/context/interface/mkiv/i-mathornament.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definemathornament" file="math-rad.mkvi"> + <cd:command name="definemathornament" level="style" category="mathematics" file="math-rad.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupmathornament" file="math-rad.mkvi"> + <cd:command name="setupmathornament" level="style" category="mathematics" file="math-rad.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -34,7 +34,7 @@ </cd:arguments> </cd:command> - <cd:command name="mathornament" generated="yes" variant="example" file="math-rad.mkvi"> + <cd:command name="mathornament" generated="yes" variant="example" level="document" category="mathematics" file="math-rad.mkvi"> <cd:sequence> <cd:variable value="mathornament"/> </cd:sequence> @@ -43,4 +43,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-mathradical.xml b/tex/context/interface/mkiv/i-mathradical.xml index e3ab9a6aa..a7ba93b75 100644 --- a/tex/context/interface/mkiv/i-mathradical.xml +++ b/tex/context/interface/mkiv/i-mathradical.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definemathradical" file="math-rad.mkvi"> + <cd:command name="definemathradical" level="style" category="mathematics" file="math-rad.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupmathradical" file="math-rad.mkvi"> + <cd:command name="setupmathradical" level="style" category="mathematics" file="math-rad.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -36,7 +36,7 @@ </cd:arguments> </cd:command> - <cd:command name="mathradical" generated="yes" variant="example" file="math-rad.mkvi"> + <cd:command name="mathradical" generated="yes" variant="example" level="document" category="mathematics" file="math-rad.mkvi"> <cd:sequence> <cd:variable value="mathradical"/> </cd:sequence> @@ -46,11 +46,11 @@ </cd:arguments> </cd:command> - <cd:command name="sqrt" file="math-rad.mkvi"> + <cd:command name="sqrt" level="document" category="mathematics" file="math-rad.mkvi"> <cd:arguments> <cd:resolve name="keyword-text-optional"/> <cd:content/> </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-mathstackers.xml b/tex/context/interface/mkiv/i-mathstackers.xml index ef8d9d5e3..561936b9c 100644 --- a/tex/context/interface/mkiv/i-mathstackers.xml +++ b/tex/context/interface/mkiv/i-mathstackers.xml @@ -4,7 +4,9 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definemathstackers" file="math-stc.mkvi"> + <!-- todo definemathdelimuter, was overloading define mathextensible --> + + <cd:command name="definemathstackers" level="style" category="mathematics" file="math-stc.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +16,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupmathstackers" file="math-stc.mkvi"> + <cd:command name="setupmathstackers" level="style" category="mathematics" file="math-stc.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -107,7 +109,7 @@ </cd:arguments> </cd:command> - <cd:command name="definemathextensible" file="math-sty.mkvi"> + <cd:command name="definemathextensible" level="system" category="mathematics" file="math-sty.mkvi"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="reverse"/> @@ -120,23 +122,28 @@ </cd:arguments> </cd:command> - <cd:command name="mathextensible" generated="yes" variant="example" file="math-stc.mkvi"> + <cd:command name="mathextensible" generated="yes" variant="instance" level="document" category="mathematics" file="math-stc.mkvi"> <cd:sequence> - <cd:variable value="mathextensible"/> + <cd:instance value="mathextensible"/> </cd:sequence> <cd:arguments> - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> + <!-- + <cd:keywords optional="yes"> + <cd:constant type="reverse"/> + <cd:constant type="mathematics"/> + <cd:constant type="text"/> + <cd:constant type="chemistry"/> + </cd:keywords> + --> <cd:resolve name="argument-text-optional"/> <cd:resolve name="argument-text-optional"/> </cd:arguments> + <cd:instances> + <cd:resolve name="instance-mathextensible"/> + </cd:instances> </cd:command> - - <cd:command name="definemathoverextensible" file="math-sty.mkvi"> + + <cd:command name="definemathoverextensible" level="system" category="mathematics" file="math-sty.mkvi"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="top"/> @@ -147,7 +154,7 @@ </cd:arguments> </cd:command> - <cd:command name="mathoverextensible" generated="yes" variant="example" file="math-stc.mkvi"> + <cd:command name="mathoverextensible" generated="yes" variant="example" level="document" category="mathematics" file="math-stc.mkvi"> <cd:sequence> <cd:variable value="mathoverextensible"/> </cd:sequence> @@ -156,1613 +163,1042 @@ </cd:arguments> </cd:command> - <cd:command name="definemathunderextensible" file="math-sty.mkvi"> + <cd:command name="definemathover" level="style" category="mathematics" file="math-stc.mkvi"> <cd:arguments> - <cd:keywords optional="yes"> - <cd:constant type="bottom"/> + <cd:keywords> + <cd:constant type="top"/> <cd:constant type="vfenced"/> + <cd:constant type="cd:name"/> </cd:keywords> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-number"/> </cd:arguments> </cd:command> - <cd:command name="mathunderextensible" generated="yes" variant="example" file="math-stc.mkvi"> - <cd:sequence> - <cd:variable value="mathunderextensible"/> - </cd:sequence> + <cd:command name="mathover" level="document" category="mathematics" file="math-stc.mkvi"> <cd:arguments> + <cd:keywords optional="yes"> + <cd:constant type="top"/> + <cd:constant type="vfenced"/> + </cd:keywords> + <cd:resolve name="argument-number"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="definemathdoubleextensible" file="math-sty.mkvi"> + <cd:command name="definemathunderextensible" level="system" category="mathematics" file="math-sty.mkvi"> <cd:arguments> <cd:keywords optional="yes"> - <cd:constant type="both"/> + <cd:constant type="bottom"/> <cd:constant type="vfenced"/> </cd:keywords> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-number"/> - <cd:resolve name="keyword-number"/> </cd:arguments> </cd:command> - <cd:command name="mathdoubleextensible" generated="yes" variant="example" file="math-stc.mkvi"> + <cd:command name="mathunderextensible" generated="yes" variant="example" level="document" category="mathematics" file="math-stc.mkvi"> <cd:sequence> - <cd:variable value="mathdoubleextensible"/> + <cd:variable value="mathunderextensible"/> </cd:sequence> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="definemathovertextextensible" file="math-sty.mkvi"> + <cd:command name="definemathunder" level="style" category="mathematics" file="math-stc.mkvi"> <cd:arguments> - <cd:keywords optional="yes"> - <cd:constant type="bothtext"/> + <cd:keywords> + <cd:constant type="bottom"/> + <cd:constant type="vfenced"/> + <cd:constant type="cd:name"/> </cd:keywords> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-number"/> </cd:arguments> </cd:command> - <cd:command name="mathovertextextensible" generated="yes" variant="example" file="math-stc.mkvi"> - <cd:sequence> - <cd:variable value="mathovertextextensible"/> - </cd:sequence> + <cd:command name="mathunder" level="document" category="mathematics" file="math-stc.mkvi"> <cd:arguments> - <cd:resolve name="argument-text"/> + <cd:keywords optional="yes"> + <cd:constant type="bottom"/> + <cd:constant type="vfenced"/> + </cd:keywords> + <cd:resolve name="argument-number"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="definemathundertextextensible" file="math-sty.mkvi"> + <cd:command name="definemathdoubleextensible" level="system" category="mathematics" file="math-sty.mkvi"> <cd:arguments> <cd:keywords optional="yes"> - <cd:constant type="bothtext"/> + <cd:constant type="both"/> + <cd:constant type="vfenced"/> </cd:keywords> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-number"/> + <cd:resolve name="keyword-number"/> </cd:arguments> </cd:command> - <cd:command name="mathundertextextensible" generated="yes" variant="example" file="math-stc.mkvi"> + <cd:command name="mathdoubleextensible" generated="yes" variant="instance" level="document" category="mathematics" file="math-stc.mkvi"> <cd:sequence> - <cd:variable value="mathundertextextensible"/> + <cd:instance value="mathdoubleextensible"/> </cd:sequence> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-text"/> </cd:arguments> + <cd:instances> + <cd:resolve name="instance-mathdoubleextensible"/> + </cd:instances> </cd:command> - <cd:command name="definemathtriplet" file="math-sty.mkvi"> + <cd:command name="definemathdouble" level="style" category="mathematics" file="math-stc.mkvi"> <cd:arguments> - <cd:resolve name="keyword-name-optional"/> + <cd:keywords> + <cd:constant type="both"/> + <cd:constant type="vfenced"/> + <cd:constant type="cd:name"/> + </cd:keywords> <cd:resolve name="keyword-name"/> - <cd:resolve name="keyword-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="mathtriplet" generated="yes" variant="example" file="math-stc.mkvi"> - <cd:sequence> - <cd:variable value="mathtriplet"/> - </cd:sequence> - <cd:arguments> - <cd:resolve name="keyword-name-optional"/> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="mathtriplet" file="math-stc.mkvi"> - <cd:arguments> - <cd:resolve name="keyword-name-optional"/> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="xrel" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="xequal" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="xleftarrow" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="xrightarrow" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="xleftrightarrow" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="xLeftarrow" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="xRightarrow" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="xLeftrightarrow" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="xtwoheadleftarrow" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="xtwoheadrightarrow" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="xmapsto" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="xhookleftarrow" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="xhookrightarrow" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="xleftharpoondown" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="xleftharpoonup" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="xrightharpoondown" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="xrightharpoonup" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="xrightoverleftarrow" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="xleftrightharpoons" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="xrightleftharpoons" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="xtriplerel" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="mrel" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="mequal" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="mleftarrow" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="mrightarrow" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="mleftrightarrow" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="mLeftarrow" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="mRightarrow" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="mLeftrightarrow" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="mtwoheadleftarrow" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="mtwoheadrightarrow" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="mmapsto" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="mhookleftarrow" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="mhookrightarrow" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="mleftharpoondown" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="mleftharpoonup" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="mrightharpoondown" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="mrightharpoonup" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="mrightoverleftarrow" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="mleftrightharpoons" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="mrightleftharpoons" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="mtriplerel" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="eleftarrowfill" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="erightarrowfill" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="eleftrightarrowfill" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="etwoheadrightarrowfill" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="eleftharpoondownfill" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="eleftharpoonupfill" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="erightharpoondownfill" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="erightharpoonupfill" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="eoverbarfill" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="eunderbarfill" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="eoverbracefill" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="eunderbracefill" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="eoverparentfill" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="eunderparentfill" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="eoverbracketfill" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="eunderbracketfill" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="trel" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="tequal" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="tmapsto" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="tleftarrow" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="trightarrow" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="tleftrightarrow" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="tLeftarrow" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="tRightarrow" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="tLeftrightarrow" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="ttwoheadleftarrow" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="ttwoheadrightarrow" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="thookleftarrow" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="thookrightarrow" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="tleftharpoondown" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="tleftharpoonup" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="trightharpoondown" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="trightharpoonup" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="trightoverleftarrow" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="tleftrightharpoons" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="trightleftharpoons" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="ttriplerel" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="cleftarrow" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="crightarrow" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="crightoverleftarrow" file="math-stc.mkvi"> - <cd:arguments> - <!-- - <cd:keywords optional="yes"> - <cd:constant type="reverse"/> - <cd:constant type="mathematics"/> - <cd:constant type="text"/> - <cd:constant type="chemistry"/> - </cd:keywords> - --> - <cd:resolve name="argument-text-optional"/> - <cd:resolve name="argument-text-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="underleftarrow" file="math-stc.mkvi"> - <cd:arguments> - <cd:resolve name="argument-text"/> - </cd:arguments> - </cd:command> - - <cd:command name="underrightarrow" file="math-stc.mkvi"> - <cd:arguments> - <cd:resolve name="argument-text"/> - </cd:arguments> - </cd:command> - - <cd:command name="underleftrightarrow" file="math-stc.mkvi"> - <cd:arguments> - <cd:resolve name="argument-text"/> - </cd:arguments> - </cd:command> - - <cd:command name="undertwoheadleftarrow" file="math-stc.mkvi"> - <cd:arguments> - <cd:resolve name="argument-text"/> - </cd:arguments> - </cd:command> - - <cd:command name="undertwoheadrightarrow" file="math-stc.mkvi"> - <cd:arguments> - <cd:resolve name="argument-text"/> - </cd:arguments> - </cd:command> - - <cd:command name="underleftharpoondown" file="math-stc.mkvi"> - <cd:arguments> - <cd:resolve name="argument-text"/> - </cd:arguments> - </cd:command> - - <cd:command name="underleftharpoonup" file="math-stc.mkvi"> - <cd:arguments> - <cd:resolve name="argument-text"/> - </cd:arguments> - </cd:command> - - <cd:command name="underrightharpoondown" file="math-stc.mkvi"> - <cd:arguments> - <cd:resolve name="argument-text"/> - </cd:arguments> - </cd:command> - - <cd:command name="underrightharpoonup" file="math-stc.mkvi"> - <cd:arguments> - <cd:resolve name="argument-text"/> - </cd:arguments> - </cd:command> - - <cd:command name="underbar" file="math-stc.mkvi"> - <cd:arguments> - <cd:resolve name="argument-text"/> - </cd:arguments> - </cd:command> - - <cd:command name="underbrace" file="math-stc.mkvi"> - <cd:arguments> - <cd:resolve name="argument-text"/> - </cd:arguments> - </cd:command> - - <cd:command name="underparent" file="math-stc.mkvi"> - <cd:arguments> - <cd:resolve name="argument-text"/> - </cd:arguments> - </cd:command> - - <cd:command name="underbracket" file="math-stc.mkvi"> - <cd:arguments> - <cd:resolve name="argument-text"/> - </cd:arguments> - </cd:command> - - <cd:command name="overleftarrow" file="math-stc.mkvi"> - <cd:arguments> - <cd:resolve name="argument-text"/> - </cd:arguments> - </cd:command> - - <cd:command name="overrightarrow" file="math-stc.mkvi"> - <cd:arguments> - <cd:resolve name="argument-text"/> - </cd:arguments> - </cd:command> - - <cd:command name="overleftrightarrow" file="math-stc.mkvi"> - <cd:arguments> - <cd:resolve name="argument-text"/> - </cd:arguments> - </cd:command> - - <cd:command name="overtwoheadleftarrow" file="math-stc.mkvi"> - <cd:arguments> - <cd:resolve name="argument-text"/> - </cd:arguments> - </cd:command> - - <cd:command name="overtwoheadrightarrow" file="math-stc.mkvi"> - <cd:arguments> - <cd:resolve name="argument-text"/> - </cd:arguments> - </cd:command> - - <cd:command name="overleftharpoondown" file="math-stc.mkvi"> - <cd:arguments> - <cd:resolve name="argument-text"/> - </cd:arguments> - </cd:command> - - <cd:command name="overleftharpoonup" file="math-stc.mkvi"> - <cd:arguments> - <cd:resolve name="argument-text"/> - </cd:arguments> - </cd:command> - - <cd:command name="overrightharpoondown" file="math-stc.mkvi"> - <cd:arguments> - <cd:resolve name="argument-text"/> - </cd:arguments> - </cd:command> - - <cd:command name="overrightharpoonup" file="math-stc.mkvi"> - <cd:arguments> - <cd:resolve name="argument-text"/> - </cd:arguments> - </cd:command> - - <cd:command name="overbar" file="math-stc.mkvi"> - <cd:arguments> - <cd:resolve name="argument-text"/> - </cd:arguments> - </cd:command> - - <cd:command name="overbrace" file="math-stc.mkvi"> - <cd:arguments> - <cd:resolve name="argument-text"/> - </cd:arguments> - </cd:command> - - <cd:command name="overparent" file="math-stc.mkvi"> - <cd:arguments> - <cd:resolve name="argument-text"/> - </cd:arguments> - </cd:command> - - <cd:command name="overbracket" file="math-stc.mkvi"> - <cd:arguments> - <cd:resolve name="argument-text"/> - </cd:arguments> - </cd:command> - - <cd:command name="doublebar" file="math-stc.mkvi"> - <cd:arguments> - <cd:resolve name="argument-text"/> - </cd:arguments> - </cd:command> - - <cd:command name="doublebrace" file="math-stc.mkvi"> - <cd:arguments> - <cd:resolve name="argument-text"/> - </cd:arguments> - </cd:command> - - <cd:command name="doubleparent" file="math-stc.mkvi"> - <cd:arguments> - <cd:resolve name="argument-text"/> - </cd:arguments> - </cd:command> - - <cd:command name="doublebracket" file="math-stc.mkvi"> - <cd:arguments> - <cd:resolve name="argument-text"/> - </cd:arguments> - </cd:command> - - <cd:command name="overbarunderbar" file="math-stc.mkvi"> - <cd:arguments> - <cd:resolve name="argument-text"/> - </cd:arguments> - </cd:command> - - <cd:command name="overbraceunderbrace" file="math-stc.mkvi"> - <cd:arguments> - <cd:resolve name="argument-text"/> - </cd:arguments> - </cd:command> - - <cd:command name="overparentunderparent" file="math-stc.mkvi"> - <cd:arguments> - <cd:resolve name="argument-text"/> - </cd:arguments> - </cd:command> - - <cd:command name="overbracketunderbracket" file="math-stc.mkvi"> - <cd:arguments> - <cd:resolve name="argument-text"/> + <cd:resolve name="keyword-number"/> + <cd:resolve name="keyword-number"/> </cd:arguments> </cd:command> - <cd:command name="overbartext" file="math-stc.mkvi"> + <cd:command name="mathdouble" level="document" category="mathematics" file="math-stc.mkvi"> <cd:arguments> + <cd:keywords optional="yes"> + <cd:constant type="both"/> + <cd:constant type="vfenced"/> + </cd:keywords> + <cd:resolve name="argument-number"/> <cd:resolve name="argument-text"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="overbracetext" file="math-stc.mkvi"> + <cd:command name="definemathovertextextensible" level="system" category="mathematics" file="math-sty.mkvi"> <cd:arguments> - <cd:resolve name="argument-text"/> - <cd:resolve name="argument-text"/> + <cd:keywords optional="yes"> + <cd:constant type="bothtext"/> + </cd:keywords> + <cd:resolve name="keyword-name"/> + <cd:resolve name="keyword-number"/> </cd:arguments> </cd:command> - <cd:command name="overparenttext" file="math-stc.mkvi"> + <cd:command name="mathovertextextensible" generated="yes" variant="instance" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:sequence> + <cd:instance value="mathovertextextensible"/> + </cd:sequence> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-text"/> </cd:arguments> + <cd:instances> + <cd:resolve name="instance-mathovertextextensible"/> + </cd:instances> </cd:command> - <cd:command name="overbrackettext" file="math-stc.mkvi"> + <cd:command name="definemathundertextextensible" level="system" category="mathematics" file="math-sty.mkvi"> <cd:arguments> - <cd:resolve name="argument-text"/> - <cd:resolve name="argument-text"/> + <cd:keywords optional="yes"> + <cd:constant type="bothtext"/> + </cd:keywords> + <cd:resolve name="keyword-name"/> + <cd:resolve name="keyword-number"/> </cd:arguments> </cd:command> - <cd:command name="underbartext" file="math-stc.mkvi"> + <cd:command name="mathundertextextensible" generated="yes" variant="instance" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:sequence> + <cd:instance value="mathundertextextensible"/> + </cd:sequence> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-text"/> </cd:arguments> + <cd:instances> + <cd:resolve name="instance-mathundertextextensible"/> + </cd:instances> </cd:command> - <cd:command name="underbracetext" file="math-stc.mkvi"> + <cd:command name="definemathtriplet" level="system" category="mathematics" file="math-sty.mkvi"> <cd:arguments> - <cd:resolve name="argument-text"/> - <cd:resolve name="argument-text"/> + <cd:resolve name="keyword-name-optional"/> + <cd:resolve name="keyword-name"/> + <cd:resolve name="keyword-text-optional"/> </cd:arguments> </cd:command> - <cd:command name="underparenttext" file="math-stc.mkvi"> + <cd:command name="mathtriplet" generated="yes" variant="example" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:sequence> + <cd:variable value="mathtriplet"/> + </cd:sequence> <cd:arguments> - <cd:resolve name="argument-text"/> - <cd:resolve name="argument-text"/> + <cd:resolve name="keyword-name-optional"/> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> </cd:arguments> </cd:command> - <cd:command name="underbrackettext" file="math-stc.mkvi"> + <cd:command name="mathtriplet" level="document" category="mathematics" file="math-stc.mkvi"> <cd:arguments> - <cd:resolve name="argument-text"/> - <cd:resolve name="argument-text"/> + <cd:resolve name="keyword-name-optional"/> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> </cd:arguments> </cd:command> - <cd:command name="singlebond" file="math-stc.mkvi"/> - - <cd:command name="doublebond" file="math-stc.mkvi"/> - - <cd:command name="triplebond" file="math-stc.mkvi"/> - - <cd:command name="definemathunstacked" file="math-stc.mkvi"> + <!-- + + <cd:command name="xrel" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="xequal" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="xleftarrow" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="xrightarrow" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="xleftrightarrow" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="xLeftarrow" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="xRightarrow" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="xLeftrightarrow" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="xtwoheadleftarrow" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="xtwoheadrightarrow" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="xmapsto" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="xhookleftarrow" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="xhookrightarrow" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="xleftharpoondown" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="xleftharpoonup" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="xrightharpoondown" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="xrightharpoonup" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="xrightoverleftarrow" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="xleftrightharpoons" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="xrightleftharpoons" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="xtriplerel" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="mrel" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="mequal" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="mleftarrow" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="mrightarrow" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="mleftrightarrow" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="mLeftarrow" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="mRightarrow" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="mLeftrightarrow" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="mtwoheadleftarrow" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="mtwoheadrightarrow" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="mmapsto" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="mhookleftarrow" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="mhookrightarrow" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="mleftharpoondown" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="mleftharpoonup" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="mrightharpoondown" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="mrightharpoonup" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="mrightoverleftarrow" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="mleftrightharpoons" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="mrightleftharpoons" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="mtriplerel" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="eleftarrowfill" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="erightarrowfill" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="eleftrightarrowfill" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="etwoheadrightarrowfill" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="eleftharpoondownfill" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="eleftharpoonupfill" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="erightharpoondownfill" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="erightharpoonupfill" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="eoverbarfill" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="eunderbarfill" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="eoverbracefill" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="eunderbracefill" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="eoverparentfill" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="eunderparentfill" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="eoverbracketfill" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="eunderbracketfill" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="trel" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="tequal" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="tmapsto" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="tleftarrow" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="trightarrow" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="tleftrightarrow" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="tLeftarrow" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="tRightarrow" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="tLeftrightarrow" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="ttwoheadleftarrow" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="ttwoheadrightarrow" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="thookleftarrow" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="thookrightarrow" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="tleftharpoondown" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="tleftharpoonup" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="trightharpoondown" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="trightharpoonup" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="trightoverleftarrow" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="tleftrightharpoons" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="trightleftharpoons" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="ttriplerel" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="cleftarrow" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="crightarrow" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="crightoverleftarrow" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text-optional"/> + <cd:resolve name="argument-text-optional"/> + </cd:arguments> + </cd:command> + + <cd:command name="underleftarrow" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="underrightarrow" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="underleftrightarrow" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="undertwoheadleftarrow" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="undertwoheadrightarrow" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="underleftharpoondown" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="underleftharpoonup" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="underrightharpoondown" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="underrightharpoonup" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="underbar" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="underbrace" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="underparent" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="underbracket" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="overleftarrow" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="overrightarrow" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="overleftrightarrow" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="overtwoheadleftarrow" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="overtwoheadrightarrow" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="overleftharpoondown" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="overleftharpoonup" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="overrightharpoondown" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="overrightharpoonup" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="overbar" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="overbrace" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="overparent" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="overbracket" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="doublebar" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="doublebrace" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="doubleparent" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="doublebracket" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="overbarunderbar" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="overbraceunderbrace" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="overparentunderparent" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="overbracketunderbracket" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="overbartext" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text"/> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="overbracetext" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text"/> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="overparenttext" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text"/> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="overbrackettext" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text"/> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="underbartext" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text"/> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="underbracetext" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text"/> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="underparenttext" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text"/> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="underbrackettext" level="document" category="mathematics" file="math-stc.mkvi"> + <cd:arguments> + <cd:resolve name="argument-text"/> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + --> + + <cd:command name="singlebond" level="document" category="mathematics" file="math-stc.mkvi"/> + + <cd:command name="doublebond" level="document" category="mathematics" file="math-stc.mkvi"/> + + <cd:command name="triplebond" level="document" category="mathematics" file="math-stc.mkvi"/> + + <cd:command name="definemathunstacked" level="document" category="mathematics" file="math-stc.mkvi"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="wide"/> @@ -1772,18 +1208,18 @@ </cd:arguments> </cd:command> - <cd:command name="mathunstacked" generated="yes" variant="example" file="math-stc.mkvi"> + <cd:command name="mathunstacked" generated="yes" variant="example" level="document" category="mathematics" file="math-stc.mkvi"> <cd:sequence> <cd:variable value="mathunstacked"/> </cd:sequence> </cd:command> - <cd:command name="And" file="math-stc.mkvi"/> + <cd:command name="And" level="document" category="mathematics" file="math-stc.mkvi"/> - <cd:command name="impliedby" file="math-stc.mkvi"/> + <cd:command name="impliedby" level="document" category="mathematics" file="math-stc.mkvi"/> - <cd:command name="implies" file="math-stc.mkvi"/> + <cd:command name="implies" level="document" category="mathematics" file="math-stc.mkvi"/> - <cd:command name="iff" file="math-stc.mkvi"/> + <cd:command name="iff" level="document" category="mathematics" file="math-stc.mkvi"/> </cd:interface> diff --git a/tex/context/interface/mkiv/i-metapost.xml b/tex/context/interface/mkiv/i-metapost.xml index 00250f787..1c8fd2d0b 100644 --- a/tex/context/interface/mkiv/i-metapost.xml +++ b/tex/context/interface/mkiv/i-metapost.xml @@ -4,21 +4,21 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="MPdefinitions" type="environment" file="meta-ini.mkiv"> + <cd:command name="MPdefinitions" type="environment" level="style" category="graphics metapost" file="meta-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name-optional"/> </cd:arguments> </cd:command> - <cd:command name="MPextensions" type="environment" file="meta-ini.mkiv"> + <cd:command name="MPextensions" type="environment" level="style" category="graphics metapost" file="meta-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name-list-optional"/> </cd:arguments> </cd:command> - <cd:command name="MPinitializations" type="environment" file="meta-ini.mkiv"/> + <cd:command name="MPinitializations" type="environment" level="style" category="graphics metapost" file="meta-ini.mkiv"/> - <cd:command name="MPinclusions" type="environment" file="meta-ini.mkiv"> + <cd:command name="MPinclusions" type="environment" level="style" category="graphics metapost" file="meta-ini.mkiv"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="+"/> @@ -27,7 +27,7 @@ </cd:arguments> </cd:command> - <cd:command name="MPinclusions" file="meta-ini.mkiv"> + <cd:command name="MPinclusions" level="style" category="graphics metapost" file="meta-ini.mkiv"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="+"/> @@ -37,7 +37,7 @@ </cd:arguments> </cd:command> - <cd:command name="defineMPinstance" file="meta-ini.mkiv"> + <cd:command name="defineMPinstance" level="style" category="graphics metapost" file="meta-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -47,7 +47,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupMPinstance" file="meta-ini.mkiv"> + <cd:command name="setupMPinstance" level="style" category="graphics metapost" file="meta-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -83,19 +83,19 @@ </cd:arguments> </cd:command> - <cd:command name="resetMPinstance" file="meta-ini.mkiv"> + <cd:command name="resetMPinstance" level="system" category="graphics metapost" file="meta-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="processMPfigurefile" file="meta-ini.mkiv"> + <cd:command name="processMPfigurefile" level="document" category="graphics metapost" file="meta-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-file"/> </cd:arguments> </cd:command> - <cd:command name="MPdrawing" type="environment" file="meta-ini.mkiv"> + <cd:command name="MPdrawing" type="environment" level="document" category="graphics metapost" file="meta-ini.mkiv"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="-"/> @@ -103,85 +103,85 @@ </cd:arguments> </cd:command> - <cd:command name="resetMPdrawing" file="meta-ini.mkiv"/> + <cd:command name="resetMPdrawing" level="document" category="graphics metapost" file="meta-ini.mkiv"/> - <cd:command name="getMPdrawing" file="meta-ini.mkiv"/> + <cd:command name="getMPdrawing" level="document" category="graphics metapost" file="meta-ini.mkiv"/> - <cd:command name="MPdrawing" type="environment" begin="push" end="pop" file="meta-ini.mkiv"/> + <cd:command name="MPdrawing" level="system" type="environment" begin="push" end="pop" category="graphics metapost" file="meta-ini.mkiv"/> - <cd:command name="MPdrawing" file="meta-ini.mkiv"> + <cd:command name="MPdrawing" level="document" category="graphics metapost" file="meta-ini.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="MPclip" type="environment" file="meta-ini.mkiv"> + <cd:command name="MPclip" type="environment" level="document" category="graphics metapost" file="meta-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="MPfontsizehskip" file="meta-ini.mkiv"> + <cd:command name="MPfontsizehskip" level="system" category="graphics metapost fonts" file="meta-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-font"/> </cd:arguments> </cd:command> - <cd:command name="setupMPvariables" file="meta-ini.mkiv"> + <cd:command name="setupMPvariables" level="style" file="meta-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:resolve name="assignment-userdata-list"/> </cd:arguments> </cd:command> - <cd:command name="setMPvariables" file="meta-ini.mkiv"> + <cd:command name="setMPvariables" level="style" file="meta-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:resolve name="assignment-userdata-list"/> </cd:arguments> </cd:command> - <cd:command name="setMPvariable" file="meta-ini.mkiv"> + <cd:command name="setMPvariable" level="style" file="meta-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="assignment-userdata"/> </cd:arguments> </cd:command> - <cd:command name="MPrawvar" file="meta-ini.mkiv"> + <cd:command name="MPrawvar" level="system" file="meta-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-key"/> </cd:arguments> </cd:command> - <cd:command name="MPvariable" file="meta-ini.mkiv"> + <cd:command name="MPvariable" level="style" file="meta-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-key"/> </cd:arguments> </cd:command> - <cd:command name="MPvar" file="meta-ini.mkiv"> + <cd:command name="MPvar" level="style" file="meta-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-key"/> </cd:arguments> </cd:command> - <cd:command name="useMPvariables" file="meta-ini.mkiv"> + <cd:command name="useMPvariables" level="style" file="meta-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-key-list"/> </cd:arguments> </cd:command> - <cd:command name="uniqueMPgraphic" type="environment" file="meta-ini.mkiv"> + <cd:command name="uniqueMPgraphic" type="environment" level="style" category="graphics metapost" file="meta-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-key-list-optional"/> </cd:arguments> </cd:command> - <cd:command name="uniqueMPgraphic" file="meta-ini.mkiv"> + <cd:command name="uniqueMPgraphic" level="style" category="graphics metapost" file="meta-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:assignments delimiters="braces" list="yes" optional="yes"> @@ -192,14 +192,14 @@ </cd:arguments> </cd:command> - <cd:command name="useMPgraphic" type="environment" file="meta-ini.mkiv"> + <cd:command name="useMPgraphic" type="environment" level="style" category="graphics metapost" file="meta-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-key-list-optional"/> </cd:arguments> </cd:command> - <cd:command name="useMPgraphic" file="meta-ini.mkiv"> + <cd:command name="useMPgraphic" level="style" category="graphics metapost" file="meta-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:assignments delimiters="braces" list="yes" optional="yes"> @@ -210,14 +210,14 @@ </cd:arguments> </cd:command> - <cd:command name="usableMPgraphic" type="environment" file="meta-ini.mkiv"> + <cd:command name="usableMPgraphic" type="environment" level="style" category="graphics metapost" file="meta-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-key-list-optional"/> </cd:arguments> </cd:command> - <cd:command name="reuseMPgraphic" file="meta-ini.mkiv"> + <cd:command name="reuseMPgraphic" level="style" category="graphics metapost" file="meta-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:assignments delimiters="braces" list="yes" optional="yes"> @@ -228,14 +228,14 @@ </cd:arguments> </cd:command> - <cd:command name="reusableMPgraphic" type="environment" file="meta-ini.mkiv"> + <cd:command name="reusableMPgraphic" type="environment" level="style" category="graphics metapost" file="meta-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-key-list-optional"/> </cd:arguments> </cd:command> - <cd:command name="reusableMPgraphic" file="meta-ini.mkiv"> + <cd:command name="reusableMPgraphic" level="style" category="graphics metapost" file="meta-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:assignments delimiters="braces" list="yes" optional="yes"> @@ -246,14 +246,14 @@ </cd:arguments> </cd:command> - <cd:command name="uniqueMPpagegraphic" type="environment" file="meta-ini.mkiv"> + <cd:command name="uniqueMPpagegraphic" type="environment" level="style" category="graphics metapost" file="meta-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-key-list-optional"/> </cd:arguments> </cd:command> - <cd:command name="uniqueMPpagegraphic" file="meta-ini.mkiv"> + <cd:command name="uniqueMPpagegraphic" level="style" category="graphics metapost" file="meta-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:assignments delimiters="braces" list="yes" optional="yes"> @@ -264,19 +264,19 @@ </cd:arguments> </cd:command> - <cd:command name="processMPbuffer" file="meta-ini.mkiv"> + <cd:command name="processMPbuffer" level="document" category="graphics metapost" file="meta-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> </cd:arguments> </cd:command> - <cd:command name="runMPbuffer" file="meta-ini.mkiv"> + <cd:command name="runMPbuffer" level="document" category="graphics metapost" file="meta-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> </cd:arguments> </cd:command> - <cd:command name="MPenvironment" type="environment" file="meta-ini.mkiv"> + <cd:command name="MPenvironment" type="environment" level="style" category="graphics metapost" file="meta-ini.mkiv"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="reset"/> @@ -286,72 +286,72 @@ </cd:arguments> </cd:command> - <cd:command name="resetMPenvironment" file="meta-ini.mkiv"/> + <cd:command name="resetMPenvironment" level="style" category="graphics" file="meta-ini.mkiv"/> - <cd:command name="useMPenvironmentbuffer" file="meta-ini.mkiv"> + <cd:command name="useMPenvironmentbuffer" level="style" category="graphics metapost" file="meta-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="MPcode" type="environment" file="meta-ini.mkiv"> + <cd:command name="MPcode" type="environment" level="document" category="graphics metapost" file="meta-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name-optional"/> </cd:arguments> </cd:command> - <cd:command name="MPcode" file="meta-ini.mkiv"> + <cd:command name="MPcode" level="document" category="graphics metapost" file="meta-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name-optional"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="MPrun" type="environment" file="meta-ini.mkiv"> + <cd:command name="MPrun" type="environment" level="document" category="graphics metapost" file="meta-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name-optional"/> </cd:arguments> </cd:command> - <cd:command name="useMPrun" file="meta-ini.mkiv"> + <cd:command name="useMPrun" level="document" category="graphics metapost" file="meta-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="useMPlibrary" file="meta-ini.mkiv"> + <cd:command name="useMPlibrary" level="style" category="graphics metapost" file="meta-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-file"/> </cd:arguments> </cd:command> - <cd:command name="setMPtext" file="meta-ini.mkiv"> + <cd:command name="setMPtext" level="style" category="graphics metapost" file="meta-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="MPtext" file="meta-ini.mkiv"> + <cd:command name="MPtext" level="style" category="graphics metapost" file="meta-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="MPstring" file="meta-ini.mkiv"> + <cd:command name="MPstring" level="style" category="graphics metapost" file="meta-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="MPbetex" file="meta-ini.mkiv"> + <cd:command name="MPbetex" level="style" category="graphics metapost" file="meta-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="doifelseMPgraphic" file="meta-ini.mkiv"> + <cd:command name="doifelseMPgraphic" level="style" category="graphics metapost conditional" file="meta-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -359,7 +359,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifMPgraphicelse" file="meta-ini.mkiv"> + <cd:command name="doifMPgraphicelse" level="style" category="graphics metapost conditional" file="meta-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -367,20 +367,20 @@ </cd:arguments> </cd:command> - <cd:command name="staticMPfigure" type="environment" file="meta-ini.mkiv"> + <cd:command name="staticMPfigure" type="environment" level="style" category="graphics metapost" file="meta-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="staticMPgraphic" type="environment" file="meta-ini.mkiv"> + <cd:command name="staticMPgraphic" type="environment" level="style" category="graphics metapost" file="meta-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-key-list-optional"/> </cd:arguments> </cd:command> - <cd:command name="usestaticMPfigure" file="meta-ini.mkiv"> + <cd:command name="usestaticMPfigure" level="style" category="graphics metapost" file="meta-ini.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupscale"/> @@ -389,7 +389,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupMPgraphics" file="meta-ini.mkiv"> + <cd:command name="setupMPgraphics" level="style" category="graphics metapost" file="meta-ini.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="color"> @@ -403,4 +403,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-mixedcolumns.xml b/tex/context/interface/mkiv/i-mixedcolumns.xml index 6d0142536..4e1ab9625 100644 --- a/tex/context/interface/mkiv/i-mixedcolumns.xml +++ b/tex/context/interface/mkiv/i-mixedcolumns.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definemixedcolumns" file="page-mix.mkiv"> + <cd:command name="definemixedcolumns" level="style" category="structure layout" file="page-mix.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupmixedcolumns" file="page-mix.mkiv"> + <cd:command name="setupmixedcolumns" level="style" category="structure layout" file="page-mix.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -96,7 +96,7 @@ </cd:arguments> </cd:command> - <cd:command name="mixedcolumns" type="environment" file="page-mix.mkiv"> + <cd:command name="mixedcolumns" type="environment" level="document" category="structure layout" file="page-mix.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:assignments list="yes" optional="yes"> @@ -105,7 +105,7 @@ </cd:arguments> </cd:command> - <cd:command name="mixedcolumns" type="environment" generated="yes" variant="instance" file="page-mix.mkiv"> + <cd:command name="mixedcolumns" type="environment" generated="yes" variant="instance" level="document" category="structure layout" file="page-mix.mkiv"> <cd:sequence> <cd:instance value="mixedcolumns"/> </cd:sequence> @@ -121,7 +121,7 @@ <!-- - <cd:command name="boxedcolumns" type="environment" file="page-mix.mkiv"> + <cd:command name="boxedcolumns" type="environment" level="document" category="structure layout" file="page-mix.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupmixedcolumns"/> @@ -131,4 +131,4 @@ --> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-modes.xml b/tex/context/interface/mkiv/i-modes.xml index 0a0abc7c7..8b35da6f8 100644 --- a/tex/context/interface/mkiv/i-modes.xml +++ b/tex/context/interface/mkiv/i-modes.xml @@ -4,79 +4,79 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="newmode" file="core-env.mkiv"> + <cd:command name="newmode" level="system" category="structure" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="setmode" file="core-env.mkiv"> + <cd:command name="setmode" level="system" category="structure" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="resetmode" file="core-env.mkiv"> + <cd:command name="resetmode" level="system" category="structure" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="newsystemmode" file="core-env.mkiv"> + <cd:command name="newsystemmode" level="system" category="structure" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="setsystemmode" file="core-env.mkiv"> + <cd:command name="setsystemmode" level="system" category="structure" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="resetsystemmode" file="core-env.mkiv"> + <cd:command name="resetsystemmode" level="system" category="structure" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="preventmode" file="core-env.mkiv"> + <cd:command name="preventmode" level="style" category="structure" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list"/> </cd:arguments> </cd:command> - <cd:command name="enablemode" file="core-env.mkiv"> + <cd:command name="enablemode" level="style" category="structure" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list"/> </cd:arguments> </cd:command> - <cd:command name="disablemode" file="core-env.mkiv"> + <cd:command name="disablemode" level="style" category="structure" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list"/> </cd:arguments> </cd:command> - <cd:command name="globalpreventmode" file="core-env.mkiv"> + <cd:command name="globalpreventmode" level="system" category="structure" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list"/> </cd:arguments> </cd:command> - <cd:command name="globalenablemode" file="core-env.mkiv"> + <cd:command name="globalenablemode" level="system" category="structure" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list"/> </cd:arguments> </cd:command> - <cd:command name="globaldisablemode" file="core-env.mkiv"> + <cd:command name="globaldisablemode" level="system" category="structure" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list"/> </cd:arguments> </cd:command> - <cd:command name="definemode" file="core-env.mkiv"> + <cd:command name="definemode" level="style" category="structure" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list"/> <cd:keywords optional="yes"> @@ -87,13 +87,13 @@ </cd:arguments> </cd:command> - <cd:command name="booleanmodevalue" file="core-env.mkiv"> + <cd:command name="booleanmodevalue" level="system" category="structure" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="doifelsemode" file="core-env.mkiv"> + <cd:command name="doifelsemode" level="style" category="structure conditional" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="argument-name-list"/> <cd:resolve name="argument-true"/> @@ -101,7 +101,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifmodeelse" file="core-env.mkiv"> + <cd:command name="doifmodeelse" level="style" category="structure conditional" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="argument-name-list"/> <cd:resolve name="argument-true"/> @@ -109,33 +109,33 @@ </cd:arguments> </cd:command> - <cd:command name="doifmode" file="core-env.mkiv"> + <cd:command name="doifmode" level="style" category="structure conditional" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="argument-name-list"/> <cd:resolve name="argument-true"/> </cd:arguments> </cd:command> - <cd:command name="doifnotmode" file="core-env.mkiv"> + <cd:command name="doifnotmode" level="style" category="structure conditional" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="argument-name-list"/> <cd:resolve name="argument-true"/> </cd:arguments> </cd:command> - <cd:command name="mode" type="environment" file="core-env.mkiv"> + <cd:command name="mode" type="environment" level="style" category="structure" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list"/> </cd:arguments> </cd:command> - <cd:command name="notmode" type="environment" file="core-env.mkiv"> + <cd:command name="notmode" type="environment" level="style" category="structure" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list"/> </cd:arguments> </cd:command> - <cd:command name="doifelseallmodes" file="core-env.mkiv"> + <cd:command name="doifelseallmodes" level="style" category="structure conditional" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="argument-name-list"/> <cd:resolve name="argument-true"/> @@ -143,7 +143,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifallmodeselse" file="core-env.mkiv"> + <cd:command name="doifallmodeselse" level="style" category="structure conditional" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="argument-name-list"/> <cd:resolve name="argument-true"/> @@ -151,7 +151,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifallmodes" file="core-env.mkiv"> + <cd:command name="doifallmodes" level="style" category="structure conditional" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="argument-name-list"/> <cd:resolve name="argument-true"/> @@ -159,7 +159,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifnotallmodes" file="core-env.mkiv"> + <cd:command name="doifnotallmodes" level="style" category="structure conditional" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="argument-name-list"/> <cd:resolve name="argument-true"/> @@ -167,19 +167,19 @@ </cd:arguments> </cd:command> - <cd:command name="allmodes" type="environment" file="core-env.mkiv"> + <cd:command name="allmodes" type="environment" level="style" category="structure" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list"/> </cd:arguments> </cd:command> - <cd:command name="notallmodes" type="environment" file="core-env.mkiv"> + <cd:command name="notallmodes" type="environment" level="style" category="structure" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list"/> </cd:arguments> </cd:command> - <cd:command name="modeset" type="environment" file="core-env.mkiv"> + <cd:command name="modeset" type="environment" level="style" category="structure" file="core-env.mkiv"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:name"/> @@ -189,28 +189,28 @@ </cd:arguments> </cd:command> - <cd:command name="pushmode" file="core-env.mkiv"> + <cd:command name="pushmode" level="system" category="structure" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="popmode" file="core-env.mkiv"> + <cd:command name="popmode" level="system" category="structure" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="pushsystemmode" file="core-env.mkiv"> + <cd:command name="pushsystemmode" level="system" category="structure" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="popsystemmode" file="core-env.mkiv"> + <cd:command name="popsystemmode" level="system" category="structure" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-modules.xml b/tex/context/interface/mkiv/i-modules.xml index d8eda7fba..03ed005e2 100644 --- a/tex/context/interface/mkiv/i-modules.xml +++ b/tex/context/interface/mkiv/i-modules.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="usemodule" file="file-mod.mkvi"> + <cd:command name="usemodule" level="style" file="file-mod.mkvi"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="m"/> @@ -24,7 +24,7 @@ <!-- - <cd:command name="usemodules" file="file-mod.mkvi"> + <cd:command name="usemodules" level="style" file="file-mod.mkvi"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="m"/> @@ -44,7 +44,7 @@ --> - <cd:command name="usetexmodule" file="file-mod.mkvi"> + <cd:command name="usetexmodule" level="style" file="file-mod.mkvi"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="m"/> @@ -62,19 +62,19 @@ </cd:arguments> </cd:command> - <cd:command name="module" type="environment" file="file-mod.mkvi"> + <cd:command name="module" type="environment" level="system" file="file-mod.mkvi"> <cd:arguments> <cd:resolve name="keyword-file"/> </cd:arguments> </cd:command> - <cd:command name="module" type="environment" variant="string" file="file-mod.mkvi"> + <cd:command name="module" type="environment" variant="string" level="system" file="file-mod.mkvi"> <cd:arguments> <cd:resolve name="string-file"/> </cd:arguments> </cd:command> - <cd:command name="setupmodule" file="file-mod.mkvi"> + <cd:command name="setupmodule" level="system" file="file-mod.mkvi"> <cd:arguments> <cd:resolve name="keyword-file-optional"/> <cd:assignments list="yes"> @@ -89,38 +89,38 @@ </cd:arguments> </cd:command> - <cd:command name="moduleparameter" file="file-mod.mkvi"> + <cd:command name="moduleparameter" level="system" file="file-mod.mkvi"> <cd:arguments> <cd:resolve name="argument-file"/> <cd:resolve name="argument-key"/> </cd:arguments> </cd:command> - <cd:command name="currentmoduleparameter" file="file-mod.mkvi"> + <cd:command name="currentmoduleparameter" level="system" file="file-mod.mkvi"> <cd:arguments> <cd:resolve name="argument-key"/> </cd:arguments> </cd:command> - <cd:command name="moduletestsection" type="environment" file="file-mod.mkvi"/> + <cd:command name="moduletestsection" type="environment" level="system" file="file-mod.mkvi"/> - <cd:command name="fetchruntinecommand" file="file-mod.mkvi"> + <cd:command name="fetchruntinecommand" level="system" file="file-mod.mkvi"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-file"/> </cd:arguments> </cd:command> - <cd:command name="luaenvironment" file="file-mod.mkvi"> + <cd:command name="luaenvironment" level="system" file="file-mod.mkvi"> <cd:arguments> <cd:resolve name="string-file"/> </cd:arguments> </cd:command> - <cd:command name="useluamodule" file="file-mod.mkvi"> + <cd:command name="useluamodule" level="system" file="file-mod.mkvi"> <cd:arguments> <cd:resolve name="keyword-file"/> </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-narrow.xml b/tex/context/interface/mkiv/i-narrow.xml index 25e40fd08..5133b6302 100644 --- a/tex/context/interface/mkiv/i-narrow.xml +++ b/tex/context/interface/mkiv/i-narrow.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definenarrower" file="spac-hor.mkiv"> + <cd:command name="definenarrower" level="style" category="whitespace layout" file="spac-hor.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupnarrower" file="spac-hor.mkiv"> + <cd:command name="setupnarrower" level="style" category="whitespace layout" file="spac-hor.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -46,7 +46,7 @@ </cd:arguments> </cd:command> - <cd:command name="narrower" type="environment" file="spac-hor.mkiv"> + <cd:command name="narrower" type="environment" level="document" category="whitespace layout" file="spac-hor.mkiv"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="left" prefix="cd:sign" method="none"/> @@ -56,11 +56,12 @@ <cd:constant type="middle" prefix="cd:number" method="factor"/> <cd:constant type="right" prefix="cd:number" method="factor"/> <cd:constant type="reset"/> + <cd:constant type="reverse"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="narrower" type="environment" generated="yes" variant="example" file="spac-hor.mkiv"> + <cd:command name="narrower" type="environment" generated="yes" variant="example" level="document" category="whitespace layout" file="spac-hor.mkiv"> <cd:sequence> <cd:variable value="narrower"/> </cd:sequence> @@ -73,11 +74,12 @@ <cd:constant type="middle" prefix="cd:number" method="factor"/> <cd:constant type="right" prefix="cd:number" method="factor"/> <cd:constant type="reset"/> - </cd:keywords> + <cd:constant type="reverse"/> + </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="narrow" type="environment" file="spac-hor.mkiv"> + <cd:command name="narrow" type="environment" level="document" category="whitespace layout" file="spac-hor.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:assignments list="yes" optional="yes"> @@ -86,7 +88,7 @@ </cd:arguments> </cd:command> - <cd:command name="narrow" type="environment" variant="name" file="spac-hor.mkiv"> + <cd:command name="narrow" type="environment" variant="name" level="document" category="whitespace layout" file="spac-hor.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:keywords list="yes" optional="yes"> @@ -97,11 +99,12 @@ <cd:constant type="middle" prefix="cd:number" method="factor"/> <cd:constant type="right" prefix="cd:number" method="factor"/> <cd:constant type="reset"/> - </cd:keywords> + <cd:constant type="reverse"/> + </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="narrow" type="environment" variant="assignment" file="spac-hor.mkiv"> + <cd:command name="narrow" type="environment" variant="assignment" level="document" category="whitespace layout" file="spac-hor.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupnarrower"/> @@ -114,7 +117,8 @@ <cd:constant type="middle" prefix="cd:number" method="factor"/> <cd:constant type="right" prefix="cd:number" method="factor"/> <cd:constant type="reset"/> - </cd:keywords> + <cd:constant type="reverse"/> + </cd:keywords> </cd:arguments> </cd:command> diff --git a/tex/context/interface/mkiv/i-naturaltable.xml b/tex/context/interface/mkiv/i-naturaltable.xml index e18be1b79..ac9ea9383 100644 --- a/tex/context/interface/mkiv/i-naturaltable.xml +++ b/tex/context/interface/mkiv/i-naturaltable.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="setupTABLE" file="tabl-ntb.mkiv"> + <cd:command name="setupTABLE" level="style" category="tables" file="tabl-ntb.mkiv"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="r"/> @@ -123,7 +123,7 @@ </cd:arguments> </cd:command> - <cd:command name="TABLE" type="environment" begin="b" end="e" file="tabl-ntb.mkiv"> + <cd:command name="TABLE" type="environment" begin="b" end="e" level="document" category="tables" file="tabl-ntb.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupTABLE"/> @@ -131,7 +131,7 @@ </cd:arguments> </cd:command> - <cd:command name="TD" type="environment" begin="b" end="e" file="tabl-ntb.mkiv"> + <cd:command name="TD" type="environment" begin="b" end="e" level="document" category="tables" file="tabl-ntb.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="nx"> @@ -160,7 +160,7 @@ </cd:arguments> </cd:command> - <cd:command name="TR" type="environment" begin="b" end="e" file="tabl-ntb.mkiv"> + <cd:command name="TR" type="environment" begin="b" end="e" level="document" category="tables" file="tabl-ntb.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupTABLE"/> @@ -168,7 +168,7 @@ </cd:arguments> </cd:command> - <cd:command name="TC" type="environment" begin="b" end="e" file="tabl-ntb.mkiv"> + <cd:command name="TC" type="environment" begin="b" end="e" level="document" category="tables" file="tabl-ntb.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="bTD"/> @@ -176,7 +176,7 @@ </cd:arguments> </cd:command> - <cd:command name="TX" type="environment" begin="b" end="e" file="tabl-ntb.mkiv"> + <cd:command name="TX" type="environment" begin="b" end="e" level="document" category="tables" file="tabl-ntb.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="bTD"/> @@ -184,7 +184,7 @@ </cd:arguments> </cd:command> - <cd:command name="TY" type="environment" begin="b" end="e" file="tabl-ntb.mkiv"> + <cd:command name="TY" type="environment" begin="b" end="e" level="document" category="tables" file="tabl-ntb.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupTABLE"/> @@ -192,7 +192,7 @@ </cd:arguments> </cd:command> - <cd:command name="TH" type="environment" begin="b" end="e" file="tabl-ntb.mkiv"> + <cd:command name="TH" type="environment" begin="b" end="e" level="document" category="tables" file="tabl-ntb.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="bTD"/> @@ -200,7 +200,7 @@ </cd:arguments> </cd:command> - <cd:command name="TN" type="environment" begin="b" end="e" file="tabl-ntb.mkiv"> + <cd:command name="TN" type="environment" begin="b" end="e" level="document" category="tables" file="tabl-ntb.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="bTD"/> @@ -208,7 +208,7 @@ </cd:arguments> </cd:command> - <cd:command name="TABLEhead" type="environment" begin="b" end="e" file="tabl-ntb.mkiv"> + <cd:command name="TABLEhead" type="environment" begin="b" end="e" level="document" category="tables" file="tabl-ntb.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupTABLE"/> @@ -216,7 +216,7 @@ </cd:arguments> </cd:command> - <cd:command name="TABLEnext" type="environment" begin="b" end="e" file="tabl-ntb.mkiv"> + <cd:command name="TABLEnext" type="environment" begin="b" end="e" level="document" category="tables" file="tabl-ntb.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupTABLE"/> @@ -224,7 +224,7 @@ </cd:arguments> </cd:command> - <cd:command name="TABLEbody" type="environment" begin="b" end="e" file="tabl-ntb.mkiv"> + <cd:command name="TABLEbody" type="environment" begin="b" end="e" level="document" category="tables" file="tabl-ntb.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupTABLE"/> @@ -232,7 +232,7 @@ </cd:arguments> </cd:command> - <cd:command name="TABLEfoot" type="environment" begin="b" end="e" file="tabl-ntb.mkiv"> + <cd:command name="TABLEfoot" type="environment" begin="b" end="e" level="document" category="tables" file="tabl-ntb.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupTABLE"/> @@ -240,7 +240,7 @@ </cd:arguments> </cd:command> - <cd:command name="defineTABLEsetup" file="tabl-ntb.mkiv"> + <cd:command name="defineTABLEsetup" level="style" category="tables" file="tabl-ntb.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes"> @@ -249,19 +249,19 @@ </cd:arguments> </cd:command> - <cd:command name="TDs" type="environment" begin="b" end="e" file="tabl-ntb.mkiv"> + <cd:command name="TDs" type="environment" begin="b" end="e" level="document" category="tables" file="tabl-ntb.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="TRs" type="environment" begin="b" end="e" file="tabl-ntb.mkiv"> + <cd:command name="TRs" type="environment" begin="b" end="e" level="document" category="tables" file="tabl-ntb.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="TABLE" type="environment" file="tabl-ntb.mkiv"> + <cd:command name="TABLE" type="environment" level="document" category="tables" file="tabl-ntb.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupTABLE"/> @@ -269,7 +269,7 @@ </cd:arguments> </cd:command> - <cd:command name="TABLEhead" type="environment" file="tabl-ntb.mkiv"> + <cd:command name="TABLEhead" type="environment" level="document" category="tables" file="tabl-ntb.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupTABLE"/> @@ -277,7 +277,7 @@ </cd:arguments> </cd:command> - <cd:command name="TABLEnext" type="environment" file="tabl-ntb.mkiv"> + <cd:command name="TABLEnext" type="environment" level="document" category="tables" file="tabl-ntb.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupTABLE"/> @@ -285,7 +285,7 @@ </cd:arguments> </cd:command> - <cd:command name="TABLEbody" type="environment" file="tabl-ntb.mkiv"> + <cd:command name="TABLEbody" type="environment" level="document" category="tables" file="tabl-ntb.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupTABLE"/> @@ -293,7 +293,7 @@ </cd:arguments> </cd:command> - <cd:command name="TABLEfoot" type="environment" file="tabl-ntb.mkiv"> + <cd:command name="TABLEfoot" type="environment" level="document" category="tables" file="tabl-ntb.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupTABLE"/> @@ -301,4 +301,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-note.xml b/tex/context/interface/mkiv/i-note.xml index a7ecb5401..9bcf43d5b 100644 --- a/tex/context/interface/mkiv/i-note.xml +++ b/tex/context/interface/mkiv/i-note.xml @@ -6,7 +6,7 @@ <!-- - <cd:command name="definenotation" file="strc-not.mkvi"> + <cd:command name="definenotation" level="system" category="structure notes" file="strc-not.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -18,7 +18,7 @@ --> - <cd:command name="setupnotation" file="strc-not.mkvi"> + <cd:command name="setupnotation" level="style" category="structure notes" file="strc-not.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -138,6 +138,12 @@ <cd:constant type="none"/> <cd:constant type="cd:dimension"/> </cd:parameter> + <cd:parameter name="stretch"> + <cd:constant type="cd:number"/> + </cd:parameter> + <cd:parameter name="shrink"> + <cd:constant type="cd:number"/> + </cd:parameter> <cd:parameter name="hang"> <cd:constant type="fit"/> <cd:constant type="broad"/> @@ -183,7 +189,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupnotations" file="strc-not.mkvi"> + <cd:command name="setupnotations" level="style" category="structure notes" file="strc-not.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -192,7 +198,7 @@ </cd:arguments> </cd:command> - <cd:command name="note" type="environment" generated="yes" variant="instance:assignment" file="strc-not.mkvi"> + <cd:command name="note" type="environment" generated="yes" variant="instance:assignment" level="document" category="structure notes" file="strc-not.mkvi"> <cd:sequence> <cd:instance value="note"/> </cd:sequence> @@ -204,7 +210,7 @@ </cd:instances> </cd:command> - <cd:command name="note" type="environment" generated="yes" variant="instance" file="strc-not.mkvi"> + <cd:command name="note" type="environment" generated="yes" variant="instance" level="document" category="structure notes" file="strc-not.mkvi"> <cd:sequence> <cd:instance value="note"/> </cd:sequence> @@ -216,7 +222,7 @@ </cd:instances> </cd:command> - <cd:command name="note" generated="yes" variant="instance" file="strc-not.mkvi"> + <cd:command name="note" generated="yes" variant="instance" level="document" category="structure notes" file="strc-not.mkvi"> <cd:sequence> <cd:instance value="note"/> </cd:sequence> @@ -229,7 +235,7 @@ </cd:instances> </cd:command> - <cd:command name="note" generated="yes" variant="instance:assignment" file="strc-not.mkvi"> + <cd:command name="note" generated="yes" variant="instance:assignment" level="document" category="structure notes" file="strc-not.mkvi"> <cd:sequence> <cd:instance value="note"/> </cd:sequence> @@ -241,7 +247,7 @@ </cd:instances> </cd:command> - <cd:command name="definenote" file="strc-not.mkvi"> + <cd:command name="definenote" level="style" category="structure notes" file="strc-not.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -251,7 +257,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupnote" file="strc-not.mkvi"> + <cd:command name="setupnote" level="style" category="structure notes" file="strc-not.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -381,12 +387,20 @@ <cd:parameter name="anchor"> <cd:constant type="next"/> </cd:parameter> + <!-- begin root only --> + <cd:parameter name="spacebefore"> + <cd:inherit name="blank"/> + </cd:parameter> + <cd:parameter name="spaceinbetween"> + <cd:inherit name="blank"/> + </cd:parameter> + <!-- end root only --> <cd:inherit name="setupframed"/> </cd:assignments> </cd:arguments> </cd:command> - <cd:command name="setupnotes" file="strc-not.mkvi"> + <cd:command name="setupnotes" level="style" category="structure notes" file="strc-not.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -395,7 +409,7 @@ </cd:arguments> </cd:command> - <cd:command name="setnote" file="strc-not.mkvi"> + <cd:command name="setnote" level="document" category="structure notes" file="strc-not.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-reference-list-optional"/> @@ -403,14 +417,14 @@ </cd:arguments> </cd:command> - <cd:command name="setnote" variant="assignment" file="strc-not.mkvi"> + <cd:command name="setnote" variant="assignment" level="document" category="structure notes" file="strc-not.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="assignment-constructiondata-list"/> </cd:arguments> </cd:command> - <cd:command name="setnotetext" file="strc-not.mkvi"> + <cd:command name="setnotetext" level="document" category="structure notes" file="strc-not.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-reference-list-optional"/> @@ -418,14 +432,14 @@ </cd:arguments> </cd:command> - <cd:command name="setnotetext" variant="assignment" file="strc-not.mkvi"> + <cd:command name="setnotetext" variant="assignment" level="document" category="structure notes" file="strc-not.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="assignment-constructiondata-list"/> </cd:arguments> </cd:command> - <cd:command name="placenotes" file="strc-not.mkvi"> + <cd:command name="placenotes" level="document" category="structure notes" file="strc-not.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list"/> <cd:assignments list="yes" optional="yes"> @@ -434,13 +448,13 @@ </cd:arguments> </cd:command> - <cd:command name="localnotes" type="environment" file="strc-not.mkvi"> + <cd:command name="localnotes" type="environment" level="document" category="structure notes" file="strc-not.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list"/> </cd:arguments> </cd:command> - <cd:command name="placelocalnotes" file="strc-not.mkvi"> + <cd:command name="placelocalnotes" level="document" category="structure notes" file="strc-not.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes" optional="yes"> @@ -449,11 +463,11 @@ </cd:arguments> </cd:command> - <cd:command name="postponenotes" file="strc-not.mkvi"/> + <cd:command name="postponenotes" level="style" category="structure notes" file="strc-not.mkvi"/> - <cd:command name="flushnotes" file="strc-not.mkvi"/> + <cd:command name="flushnotes" level="style" category="structure notes" file="strc-not.mkvi"/> - <cd:command name="doifelsenoteonsamepage" file="strc-not.mkvi"> + <cd:command name="doifelsenoteonsamepage" level="system" category="structure notes conditional" file="strc-not.mkvi"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -461,7 +475,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifnoteonsamepageelse" file="strc-not.mkvi"> + <cd:command name="doifnoteonsamepageelse" level="system" category="structure notes conditional" file="strc-not.mkvi"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -469,21 +483,21 @@ </cd:arguments> </cd:command> - <cd:command name="doifnotescollected" file="strc-not.mkvi"> + <cd:command name="doifnotescollected" level="system" category="structure notes conditional" file="strc-not.mkvi"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> </cd:arguments> </cd:command> - <cd:command name="notesymbol" file="strc-not.mkvi"> + <cd:command name="notesymbol" level="system" category="structure notes" file="strc-not.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-reference-optional"/> </cd:arguments> </cd:command> - <cd:command name="note" file="strc-not.mkvi"> + <cd:command name="note" level="document" category="structure notes" file="strc-not.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:resolve name="keyword-reference"/> @@ -492,26 +506,26 @@ <!-- - <cd:command name="footnote" type="environment" variant="assignment" file="strc-not.mkvi"> + <cd:command name="footnote" type="environment" variant="assignment" level="document" category="structure notes" file="strc-not.mkvi"> <cd:arguments> <cd:resolve name="assignment-constructiondata-list-optional"/> </cd:arguments> </cd:command> - <cd:command name="footnote" type="environment" file="strc-not.mkvi"> + <cd:command name="footnote" type="environment" level="document" category="structure notes" file="strc-not.mkvi"> <cd:arguments> <cd:resolve name="keyword-reference-list-optional"/> </cd:arguments> </cd:command> - <cd:command name="footnote" file="strc-not.mkvi"> + <cd:command name="footnote" level="document" category="structure notes" file="strc-not.mkvi"> <cd:arguments> <cd:resolve name="keyword-reference-list-optional"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="footnote" variant="assignment" file="strc-not.mkvi"> + <cd:command name="footnote" variant="assignment" level="document" category="structure notes" file="strc-not.mkvi"> <cd:arguments> <cd:resolve name="assignment-constructiondata-list"/> </cd:arguments> @@ -519,20 +533,20 @@ --> - <cd:command name="footnotetext" file="strc-not.mkvi"> + <cd:command name="footnotetext" level="document" category="structure notes" file="strc-not.mkvi"> <cd:arguments> <cd:resolve name="keyword-reference-list-optional"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="footnotetext" variant="assignment" file="strc-not.mkvi"> + <cd:command name="footnotetext" variant="assignment" level="document" category="structure notes" file="strc-not.mkvi"> <cd:arguments> <cd:resolve name="assignment-constructiondata-list"/> </cd:arguments> </cd:command> - <cd:command name="placefootnotes" file="strc-not.mkvi"> + <cd:command name="placefootnotes" level="document" category="structure notes" file="strc-not.mkvi"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupnote"/> @@ -540,9 +554,9 @@ </cd:arguments> </cd:command> - <cd:command name="localfootnotes" type="environment" file="strc-not.mkvi"/> + <cd:command name="localfootnotes" type="environment" level="document" category="structure notes" file="strc-not.mkvi"/> - <cd:command name="placelocalfootnotes" file="strc-not.mkvi"> + <cd:command name="placelocalfootnotes" level="document" category="structure notes" file="strc-not.mkvi"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupnote"/> @@ -552,26 +566,26 @@ <!-- - <cd:command name="endnote" type="environment" variant="assignment" file="strc-not.mkvi"> + <cd:command name="endnote" type="environment" variant="assignment" level="document" category="structure notes" file="strc-not.mkvi"> <cd:arguments> <cd:resolve name="assignment-constructiondata-list-optional"/> </cd:arguments> </cd:command> - <cd:command name="endnote" type="environment" file="strc-not.mkvi"> + <cd:command name="endnote" type="environment" level="document" category="structure notes" file="strc-not.mkvi"> <cd:arguments> <cd:resolve name="keyword-reference-list-optional"/> </cd:arguments> </cd:command> - <cd:command name="endnote" file="strc-not.mkvi"> + <cd:command name="endnote" level="document" category="structure notes" file="strc-not.mkvi"> <cd:arguments> <cd:resolve name="keyword-reference-list-optional"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="endnote" variant="assignment" file="strc-not.mkvi"> + <cd:command name="endnote" variant="assignment" level="document" category="structure notes" file="strc-not.mkvi"> <cd:arguments> <cd:resolve name="assignment-constructiondata-list"/> </cd:arguments> @@ -579,7 +593,7 @@ --> - <cd:command name="definelinenote" file="strc-lnt.mkvi"> + <cd:command name="definelinenote" level="style" category="structure notes" file="strc-lnt.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -589,7 +603,7 @@ </cd:arguments> </cd:command> - <cd:command name="setuplinenote" file="strc-lnt.mkvi"> + <cd:command name="setuplinenote" level="style" category="structure notes" file="strc-lnt.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -613,7 +627,7 @@ </cd:arguments> </cd:command> - <cd:command name="linenote" generated="yes" variant="instance" file="strc-lnt.mkvi"> + <cd:command name="linenote" generated="yes" variant="instance" level="document" category="structure notes" file="strc-lnt.mkvi"> <cd:sequence> <cd:instance value="linenote"/> </cd:sequence> @@ -625,7 +639,7 @@ </cd:instances> </cd:command> - <cd:command name="startlinenote" generated="yes" variant="instance" file="strc-lnt.mkvi"> + <cd:command name="startlinenote" generated="yes" variant="instance" level="document" category="structure notes" file="strc-lnt.mkvi"> <cd:sequence> <cd:string value="start"/> <cd:instance value="linenote"/> @@ -639,7 +653,7 @@ </cd:instances> </cd:command> - <cd:command name="stoplinenote" generated="yes" variant="instance" file="strc-lnt.mkvi"> + <cd:command name="stoplinenote" generated="yes" variant="instance" level="document" category="structure notes" file="strc-lnt.mkvi"> <cd:sequence> <cd:string value="stop"/> <cd:instance value="linenote"/> @@ -652,14 +666,14 @@ </cd:instances> </cd:command> - <cd:command name="fromlinenote" file="strc-lnt.mkvi"> + <cd:command name="fromlinenote" level="document" category="structure notes" file="strc-lnt.mkvi"> <cd:arguments> <cd:resolve name="keyword-reference"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="tolinenote" file="strc-lnt.mkvi"> + <cd:command name="tolinenote" level="document" category="structure notes" file="strc-lnt.mkvi"> <cd:arguments> <cd:resolve name="keyword-reference"/> </cd:arguments> @@ -667,20 +681,20 @@ <!-- - <cd:command name="linenote" file="strc-lnt.mkvi"> + <cd:command name="linenote" level="document" category="structure notes" file="strc-lnt.mkvi"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="startlinenote" file="strc-lnt.mkvi"> + <cd:command name="startlinenote" level="document" category="structure notes" file="strc-lnt.mkvi"> <cd:arguments> <cd:resolve name="keyword-reference"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="stoplinenote" file="strc-lnt.mkvi"> + <cd:command name="stoplinenote" level="document" category="structure notes" file="strc-lnt.mkvi"> <cd:arguments> <cd:resolve name="keyword-reference"/> </cd:arguments> @@ -688,4 +702,4 @@ --> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-object.xml b/tex/context/interface/mkiv/i-object.xml index 6e105b377..2083c3572 100644 --- a/tex/context/interface/mkiv/i-object.xml +++ b/tex/context/interface/mkiv/i-object.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="ifinobject" file="pack-obj.mkiv"> + <cd:command name="ifinobject" level="system" category="pdf" file="pack-obj.mkiv"> <cd:arguments> <cd:resolve name="string-true"/> <cd:delimiter name="else"/> @@ -13,15 +13,15 @@ </cd:arguments> </cd:command> - <cd:command name="objectmargin" file="pack-obj.mkiv"/> + <cd:command name="objectmargin" level="system" category="pdf" file="pack-obj.mkiv"/> - <cd:command name="objectwidth" file="pack-obj.mkiv"/> + <cd:command name="objectwidth" level="system" category="pdf" file="pack-obj.mkiv"/> - <cd:command name="objectheight" file="pack-obj.mkiv"/> + <cd:command name="objectheight" level="system" category="pdf" file="pack-obj.mkiv"/> - <cd:command name="objectdepth" file="pack-obj.mkiv"/> + <cd:command name="objectdepth" level="system" category="pdf" file="pack-obj.mkiv"/> - <cd:command name="setreferencedobject" file="pack-obj.mkiv"> + <cd:command name="setreferencedobject" level="system" category="pdf" file="pack-obj.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-name"/> @@ -30,7 +30,7 @@ </cd:arguments> </cd:command> - <cd:command name="settightreferencedobject" file="pack-obj.mkiv"> + <cd:command name="settightreferencedobject" level="system" category="pdf" file="pack-obj.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-name"/> @@ -39,7 +39,7 @@ </cd:arguments> </cd:command> - <cd:command name="setunreferencedobject" file="pack-obj.mkiv"> + <cd:command name="setunreferencedobject" level="system" category="pdf" file="pack-obj.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-name"/> @@ -48,7 +48,7 @@ </cd:arguments> </cd:command> - <cd:command name="settightunreferencedobject" file="pack-obj.mkiv"> + <cd:command name="settightunreferencedobject" level="system" category="pdf" file="pack-obj.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-name"/> @@ -57,7 +57,7 @@ </cd:arguments> </cd:command> - <cd:command name="setobject" file="pack-obj.mkiv"> + <cd:command name="setobject" level="system" category="pdf" file="pack-obj.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-name"/> @@ -66,7 +66,7 @@ </cd:arguments> </cd:command> - <cd:command name="settightobject" file="pack-obj.mkiv"> + <cd:command name="settightobject" level="system" category="pdf" file="pack-obj.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-name"/> @@ -75,25 +75,25 @@ </cd:arguments> </cd:command> - <cd:command name="getobject" file="pack-obj.mkiv"> + <cd:command name="getobject" level="system" category="pdf" file="pack-obj.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="getobjectdimensions" file="pack-obj.mkiv"> + <cd:command name="getobjectdimensions" level="system" category="pdf" file="pack-obj.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="defaultobjectreference" file="pack-obj.mkiv"/> + <cd:command name="defaultobjectreference" level="system" category="pdf" file="pack-obj.mkiv"/> - <cd:command name="defaultobjectpage" file="pack-obj.mkiv"/> + <cd:command name="defaultobjectpage" level="system" category="pdf" file="pack-obj.mkiv"/> - <cd:command name="doifelseobjectfound" file="pack-obj.mkiv"> + <cd:command name="doifelseobjectfound" level="system" category="pdf conditional" file="pack-obj.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-name"/> @@ -102,7 +102,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifobjectfoundelse" file="pack-obj.mkiv"> + <cd:command name="doifobjectfoundelse" level="system" category="pdf conditional" file="pack-obj.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-name"/> @@ -111,7 +111,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifelseobjectreferencefound" file="pack-obj.mkiv"> + <cd:command name="doifelseobjectreferencefound" level="system" category="pdf conditional" file="pack-obj.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-name"/> @@ -120,7 +120,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifobjectreferencefoundelse" file="pack-obj.mkiv"> + <cd:command name="doifobjectreferencefoundelse" level="system" category="pdf conditional" file="pack-obj.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-name"/> @@ -129,4 +129,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-offset.xml b/tex/context/interface/mkiv/i-offset.xml index fc759673d..15a162b1a 100644 --- a/tex/context/interface/mkiv/i-offset.xml +++ b/tex/context/interface/mkiv/i-offset.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="setupoffsetbox" file="pack-box.mkiv"> + <cd:command name="setupoffsetbox" level="style" category="layout" file="pack-box.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="x"> @@ -44,7 +44,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupoffset" file="pack-box.mkiv"> + <cd:command name="setupoffset" level="style" category="layout" file="pack-box.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:inherit name="setupoffsetbox"/> @@ -52,7 +52,7 @@ </cd:arguments> </cd:command> - <cd:command name="offsetbox" file="pack-box.mkiv"> + <cd:command name="offsetbox" level="system" category="layout" file="pack-box.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupoffsetbox"/> @@ -62,7 +62,7 @@ </cd:arguments> </cd:command> - <cd:command name="offset" file="pack-box.mkiv"> + <cd:command name="offset" level="document" category="layout" file="pack-box.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupoffset"/> @@ -71,4 +71,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-opposite.xml b/tex/context/interface/mkiv/i-opposite.xml index 497b6d502..3ed22559f 100644 --- a/tex/context/interface/mkiv/i-opposite.xml +++ b/tex/context/interface/mkiv/i-opposite.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="setupoppositeplacing" file="page-fac.mkiv"> + <cd:command name="setupoppositeplacing" level="style" category="layout" file="page-fac.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="state"> @@ -24,6 +24,6 @@ </cd:arguments> </cd:command> - <cd:command name="opposite" type="environment" file="page-fac.mkiv"/> + <cd:command name="opposite" type="environment" level="document" category="layout" file="page-fac.mkiv"/> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-ornament.xml b/tex/context/interface/mkiv/i-ornament.xml index f4ae43a6d..847fda4e6 100644 --- a/tex/context/interface/mkiv/i-ornament.xml +++ b/tex/context/interface/mkiv/i-ornament.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="ornamenttext" variant="collector" file="pack-box.mkiv"> + <cd:command name="ornamenttext" variant="collector" level="document" category="background fonts colors" file="pack-box.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="alternative"> @@ -27,7 +27,7 @@ </cd:arguments> </cd:command> - <cd:command name="ornamenttext" variant="layer" file="pack-box.mkiv"> + <cd:command name="ornamenttext" variant="layer" level="document" category="background fonts colors" file="pack-box.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="alternative"> @@ -44,7 +44,7 @@ </cd:arguments> </cd:command> - <cd:command name="ornamenttext" variant="direct" file="pack-box.mkiv"> + <cd:command name="ornamenttext" variant="direct" level="document" category="background fonts colors" file="pack-box.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="argument-text"/> @@ -52,7 +52,7 @@ </cd:arguments> </cd:command> - <cd:command name="defineornament" variant="collector" file="pack-box.mkiv"> + <cd:command name="defineornament" variant="collector" level="style" category="background fonts colors" file="pack-box.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes"> @@ -74,7 +74,7 @@ </cd:arguments> </cd:command> - <cd:command name="defineornament" variant="layer" file="pack-box.mkiv"> + <cd:command name="defineornament" variant="layer" level="style" category="background fonts colors" file="pack-box.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes"> @@ -90,7 +90,7 @@ </cd:arguments> </cd:command> - <cd:command name="ornament" generated="yes" variant="example" file="pack-box.mkiv"> + <cd:command name="ornament" generated="yes" variant="example" level="document" category="background fonts colors" file="pack-box.mkiv"> <cd:sequence> <cd:variable value="ornament"/> </cd:sequence> @@ -100,4 +100,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-output.xml b/tex/context/interface/mkiv/i-output.xml index bf719ca6a..28b5b3799 100644 --- a/tex/context/interface/mkiv/i-output.xml +++ b/tex/context/interface/mkiv/i-output.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="defineoutputroutine" file="page-otr.mkvi"> + <cd:command name="defineoutputroutine" level="system" category="layout" file="page-otr.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupoutputroutine" file="page-otr.mkvi"> + <cd:command name="setupoutputroutine" level="system" category="layout" file="page-otr.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:assignments list="yes"> @@ -25,25 +25,25 @@ </cd:arguments> </cd:command> - <cd:command name="setupoutputroutine" variant="name" file="page-otr.mkvi"> + <cd:command name="setupoutputroutine" variant="name" level="system" category="layout" file="page-otr.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="defineoutputroutinecommand" file="page-otr.mkvi"> + <cd:command name="defineoutputroutinecommand" level="system" category="layout" file="page-otr.mkvi"> <cd:arguments> <cd:resolve name="keyword-key-list"/> </cd:arguments> </cd:command> - <cd:command name="traceoutputroutines" file="page-otr.mkvi"/> + <cd:command name="traceoutputroutines" level="system" category="layout" file="page-otr.mkvi"/> - <cd:command name="installoutputroutine" file="page-otr.mkvi"> + <cd:command name="installoutputroutine" level="system" category="layout" file="page-otr.mkvi"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-command"/> </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-overlay.xml b/tex/context/interface/mkiv/i-overlay.xml index 91e9f4873..40d0bda93 100644 --- a/tex/context/interface/mkiv/i-overlay.xml +++ b/tex/context/interface/mkiv/i-overlay.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="defineoverlay" file="pack-lyr.mkiv"> + <cd:command name="defineoverlay" level="style" category="background" file="pack-lyr.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list"/> <cd:resolve name="keyword-name-optional"/> @@ -12,21 +12,21 @@ </cd:arguments> </cd:command> - <cd:command name="overlaycolor" file="pack-rul.mkiv"/> + <cd:command name="overlaycolor" level="system" category="background colors" file="pack-rul.mkiv"/> - <cd:command name="overlaylinecolor" file="pack-rul.mkiv"/> + <cd:command name="overlaylinecolor" level="system" category="background colors" file="pack-rul.mkiv"/> - <cd:command name="overlaywidth" file="pack-rul.mkiv"/> + <cd:command name="overlaywidth" level="system" category="background" file="pack-rul.mkiv"/> - <cd:command name="overlayheight" file="pack-rul.mkiv"/> + <cd:command name="overlayheight" level="system" category="background" file="pack-rul.mkiv"/> - <cd:command name="overlaydepth" file="pack-rul.mkiv"/> + <cd:command name="overlaydepth" level="system" category="background" file="pack-rul.mkiv"/> - <cd:command name="overlayoffset" file="pack-rul.mkiv"/> + <cd:command name="overlayoffset" level="system" category="background" file="pack-rul.mkiv"/> - <cd:command name="overlaylinewidth" file="pack-rul.mkiv"/> + <cd:command name="overlaylinewidth" level="system" category="background" file="pack-rul.mkiv"/> - <cd:command name="doifelseoverlay" file="pack-rul.mkiv"> + <cd:command name="doifelseoverlay" level="system" category="background conditional" file="pack-rul.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -34,7 +34,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifoverlayelse" file="pack-rul.mkiv"> + <cd:command name="doifoverlayelse" level="system" category="background conditional" file="pack-rul.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -42,4 +42,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-pagebreak.xml b/tex/context/interface/mkiv/i-pagebreak.xml index 917e4a718..9972800ec 100644 --- a/tex/context/interface/mkiv/i-pagebreak.xml +++ b/tex/context/interface/mkiv/i-pagebreak.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definepagebreak" file="page-brk.mkiv"> + <cd:command name="definepagebreak" level="style" file="page-brk.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:keywords list="yes"> @@ -13,7 +13,7 @@ </cd:arguments> </cd:command> - <cd:command name="pagebreak" file="page-brk.mkiv"> + <cd:command name="pagebreak" level="document" file="page-brk.mkiv"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:resolve name="value-pagebreak"/> @@ -22,7 +22,7 @@ </cd:arguments> </cd:command> - <cd:command name="page" file="page-brk.mkiv"> + <cd:command name="page" level="document" file="page-brk.mkiv"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:inherit name="pagebreak"/> @@ -30,7 +30,7 @@ </cd:arguments> </cd:command> - <cd:command name="definecolumnbreak" file="page-brk.mkiv"> + <cd:command name="definecolumnbreak" level="style" file="page-brk.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:keywords list="yes"> @@ -39,7 +39,7 @@ </cd:arguments> </cd:command> - <cd:command name="columnbreak" file="page-brk.mkiv"> + <cd:command name="columnbreak" level="document" file="page-brk.mkiv"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:resolve name="value-columnbreak"/> @@ -48,7 +48,7 @@ </cd:arguments> </cd:command> - <cd:command name="column" file="page-brk.mkiv"> + <cd:command name="column" level="document" file="page-brk.mkiv"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:inherit name="columnbreak"/> @@ -56,7 +56,7 @@ </cd:arguments> </cd:command> - <cd:command name="definepagechecker" file="page-brk.mkiv"> + <cd:command name="definepagechecker" level="style" file="page-brk.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -66,7 +66,7 @@ </cd:arguments> </cd:command> - <cd:command name="setuppagechecker" file="page-brk.mkiv"> + <cd:command name="setuppagechecker" level="style" file="page-brk.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -95,7 +95,7 @@ </cd:arguments> </cd:command> - <cd:command name="checkpage" file="page-brk.mkiv"> + <cd:command name="checkpage" level="document" file="page-brk.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes" optional="yes"> @@ -104,32 +104,32 @@ </cd:arguments> </cd:command> - <cd:command name="testpage" file="page-brk.mkiv"> + <cd:command name="testpage" level="document" file="page-brk.mkiv"> <cd:arguments> <cd:resolve name="keyword-number"/> <cd:resolve name="keyword-dimension-optional"/> </cd:arguments> </cd:command> - <cd:command name="testpageonly" file="page-brk.mkiv"> + <cd:command name="testpageonly" level="system" file="page-brk.mkiv"> <cd:arguments> <cd:resolve name="keyword-number"/> <cd:resolve name="keyword-dimension-optional"/> </cd:arguments> </cd:command> - <cd:command name="testpagesync" file="page-brk.mkiv"> + <cd:command name="testpagesync" level="system" file="page-brk.mkiv"> <cd:arguments> <cd:resolve name="keyword-number"/> <cd:resolve name="keyword-dimension-optional"/> </cd:arguments> </cd:command> - <cd:command name="testcolumn" file="page-brk.mkiv"> + <cd:command name="testcolumn" level="document" file="page-brk.mkiv"> <cd:arguments> <cd:resolve name="keyword-number"/> <cd:resolve name="keyword-dimension-optional"/> </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-pagecomment.xml b/tex/context/interface/mkiv/i-pagecomment.xml index 26678a4a0..75b9056a8 100644 --- a/tex/context/interface/mkiv/i-pagecomment.xml +++ b/tex/context/interface/mkiv/i-pagecomment.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="setuppagecomment" file="page-com.mkiv"> + <cd:command name="setuppagecomment" level="style" category="pdf" file="page-com.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="location"> @@ -35,6 +35,6 @@ </cd:arguments> </cd:command> - <cd:command name="pagecomment" type="environment" file="page-com.mkiv"/> + <cd:command name="pagecomment" type="environment" level="document" category="pdf" file="page-com.mkiv"/> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-pagefigure.xml b/tex/context/interface/mkiv/i-pagefigure.xml index 5f776e835..0e8af435f 100644 --- a/tex/context/interface/mkiv/i-pagefigure.xml +++ b/tex/context/interface/mkiv/i-pagefigure.xml @@ -4,22 +4,32 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="pagefigure" file="page-app.mkiv"> + <cd:command name="pagefigure" level="document" category="graphics" file="page-app.mkiv"> <cd:arguments> <cd:resolve name="keyword-file"/> <cd:assignments list="yes" optional="yes"> - <cd:inherit name="setupexternalfigure"/> + <cd:parameter name="offset"> + <cd:constant type="default"/> + <cd:constant type="overlay"/> + <cd:constant type="none"/> + <cd:constant type="cd:dimension"/> + </cd:parameter> </cd:assignments> </cd:arguments> </cd:command> - <cd:command name="pagefigure" type="environment" file="page-app.mkiv"> + <cd:command name="pagefigure" type="environment" level="document" category="graphics" file="page-app.mkiv"> <cd:arguments> <cd:resolve name="keyword-file"/> <cd:assignments list="yes" optional="yes"> - <cd:inherit name="setupexternalfigure"/> + <cd:parameter name="offset"> + <cd:constant type="default"/> + <cd:constant type="overlay"/> + <cd:constant type="none"/> + <cd:constant type="cd:dimension"/> + </cd:parameter> </cd:assignments> </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-pagegrid.xml b/tex/context/interface/mkiv/i-pagegrid.xml index 21f906a0c..8e53ef8fc 100644 --- a/tex/context/interface/mkiv/i-pagegrid.xml +++ b/tex/context/interface/mkiv/i-pagegrid.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definepagegrid" file="page-cst.mkiv"> + <cd:command name="definepagegrid" level="style" category="layout" file="page-cst.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setuppagegrid" file="page-cst.mkiv"> + <cd:command name="setuppagegrid" level="style" category="layout" file="page-cst.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -55,7 +55,7 @@ </cd:arguments> </cd:command> - <cd:command name="pagegrid" type="environment" generated="yes" variant="example" file="page-cst.mkiv"> + <cd:command name="pagegrid" type="environment" generated="yes" variant="example" level="document" category="layout" file="page-cst.mkiv"> <cd:sequence> <cd:variable value="pagegrid"/> </cd:sequence> @@ -66,7 +66,7 @@ </cd:arguments> </cd:command> - <cd:command name="pagegrid" type="environment" file="page-cst.mkiv"> + <cd:command name="pagegrid" type="environment" level="document" category="layout" file="page-cst.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:assignments list="yes" optional="yes"> @@ -75,7 +75,7 @@ </cd:arguments> </cd:command> - <cd:command name="setpagegrid" file="page-cst.mkiv"> + <cd:command name="setpagegrid" level="document" category="layout" file="page-cst.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="c"> @@ -95,7 +95,7 @@ </cd:arguments> </cd:command> - <cd:command name="definepagegridspan" file="page-cst.mkiv"> + <cd:command name="definepagegridspan" level="style" category="layout" file="page-cst.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -105,7 +105,7 @@ </cd:arguments> </cd:command> - <cd:command name="setuppagegridspan" file="page-cst.mkiv"> + <cd:command name="setuppagegridspan" level="style" category="layout" file="page-cst.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -129,7 +129,7 @@ </cd:arguments> </cd:command> - <cd:command name="pagegridspan" type="environment" file="page-cst.mkiv"> + <cd:command name="pagegridspan" type="environment" level="document" category="layout" file="page-cst.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes" optional="yes"> @@ -138,13 +138,13 @@ </cd:arguments> </cd:command> - <cd:command name="pagegridspanwidth" file="page-cst.mkiv"> + <cd:command name="pagegridspanwidth" level="style" category="layout" file="page-cst.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="definepagegridarea" file="page-cst.mkiv"> + <cd:command name="definepagegridarea" level="style" category="layout" file="page-cst.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -154,7 +154,7 @@ </cd:arguments> </cd:command> - <cd:command name="setuppagegridarea" file="page-cst.mkiv"> + <cd:command name="setuppagegridarea" level="style" category="layout" file="page-cst.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -192,14 +192,14 @@ </cd:arguments> </cd:command> - <cd:command name="setuppagegridareatext" file="page-cst.mkiv"> + <cd:command name="setuppagegridareatext" level="style" category="layout" file="page-cst.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-text"/> </cd:arguments> </cd:command> - <cd:command name="setuppagegridlines" file="page-cst.mkiv"> + <cd:command name="setuppagegridlines" level="style" category="layout" file="page-cst.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-number"/> @@ -208,7 +208,7 @@ </cd:arguments> </cd:command> - <cd:command name="setuppagegridstart" file="page-cst.mkiv"> + <cd:command name="setuppagegridstart" level="style" category="layout" file="page-cst.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-number"/> @@ -217,4 +217,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-pageinjection.xml b/tex/context/interface/mkiv/i-pageinjection.xml index c069dbc8b..f2ded298e 100644 --- a/tex/context/interface/mkiv/i-pageinjection.xml +++ b/tex/context/interface/mkiv/i-pageinjection.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definepageinjection" file="page-inj.mkvi"> + <cd:command name="definepageinjection" level="style" category="structure" file="page-inj.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setuppageinjection" file="page-inj.mkvi"> + <cd:command name="setuppageinjection" level="style" category="structure" file="page-inj.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -49,14 +49,14 @@ </cd:arguments> </cd:command> - <cd:command name="pageinjection" file="page-inj.mkvi"> + <cd:command name="pageinjection" level="document" category="structure" file="page-inj.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:resolve name="assignment-userdata-list-optional"/> </cd:arguments> </cd:command> - <cd:command name="pageinjection" variant="assignment" file="page-inj.mkvi"> + <cd:command name="pageinjection" variant="assignment" level="document" category="structure" file="page-inj.mkvi"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setuppageinjection"/> @@ -65,7 +65,7 @@ </cd:arguments> </cd:command> - <cd:command name="definepageinjectionalternative" file="page-inj.mkvi"> + <cd:command name="definepageinjectionalternative" level="style" category="structure" file="page-inj.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -75,7 +75,7 @@ </cd:arguments> </cd:command> - <cd:command name="setuppageinjectionalternative" file="page-inj.mkvi"> + <cd:command name="setuppageinjectionalternative" level="style" category="structure" file="page-inj.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -86,4 +86,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-pagelayout.xml b/tex/context/interface/mkiv/i-pagelayout.xml index dd4bc27f5..3aadda0ff 100644 --- a/tex/context/interface/mkiv/i-pagelayout.xml +++ b/tex/context/interface/mkiv/i-pagelayout.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="pagearea" file="page-plg.mkiv"> + <cd:command name="pagearea" level="style" category="layout" file="page-plg.mkiv"> <cd:arguments> <cd:keywords> <cd:constant type="top"/> @@ -28,7 +28,7 @@ </cd:arguments> </cd:command> - <cd:command name="pagelayout" type="environment" file="page-plg.mkiv"> + <cd:command name="pagelayout" type="environment" level="style" category="layout" file="page-plg.mkiv"> <cd:arguments> <cd:keywords> <cd:constant type="page"/> @@ -38,4 +38,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-pagemarks.xml b/tex/context/interface/mkiv/i-pagemarks.xml new file mode 100644 index 000000000..036f518b9 --- /dev/null +++ b/tex/context/interface/mkiv/i-pagemarks.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<?context-directive job ctxfile x-setups.ctx ?> + +<cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> + + <cd:command name="markpage" level="style" file="page-lay.mkiv"> + <cd:arguments> + <cd:resolve name="keyword-name"/> + <cd:keywords optional="yes"> + <cd:constant type="cd:number" prefix="cd:sign" method="none"/> + </cd:keywords> + </cd:arguments> + </cd:command> + + <cd:command name="doifelsemarkedpage" level="style" category="conditional" file="page-lay.mkiv"> + <cd:arguments> + <cd:resolve name="argument-name"/> + <cd:resolve name="argument-true"/> + <cd:resolve name="argument-false"/> + </cd:arguments> + </cd:command> + +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-pagenumber.xml b/tex/context/interface/mkiv/i-pagenumber.xml index d17df9425..4c262db4b 100644 --- a/tex/context/interface/mkiv/i-pagenumber.xml +++ b/tex/context/interface/mkiv/i-pagenumber.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="setuprealpagenumber" file="strc-pag.mkiv"> + <cd:command name="setuprealpagenumber" level="system" category="counter" file="strc-pag.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:inherit name="setupcounter"/> @@ -12,7 +12,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupuserpagenumber" file="strc-pag.mkiv"> + <cd:command name="setupuserpagenumber" level="style" category="counter" file="strc-pag.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="viewerprefix"> @@ -30,7 +30,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupsubpagenumber" file="strc-pag.mkiv"> + <cd:command name="setupsubpagenumber" level="style" category="counter" file="strc-pag.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:inherit name="setupcounter"/> @@ -38,7 +38,7 @@ </cd:arguments> </cd:command> - <cd:command name="setuppagenumber" file="strc-pag.mkiv"> + <cd:command name="setuppagenumber" level="style" category="counter" file="strc-pag.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:inherit name="setupuserpagenumber"/> @@ -48,17 +48,17 @@ <!-- - <cd:command name="resetrealpagenumber" file="strc-pag.mkiv"/> + <cd:command name="resetrealpagenumber" level="system" file="strc-pag.mkiv"/> --> - <cd:command name="resetuserpagenumber" file="strc-pag.mkiv"/> + <cd:command name="resetuserpagenumber" level="system" category="counter" file="strc-pag.mkiv"/> - <cd:command name="resetsubpagenumber" file="strc-pag.mkiv"/> + <cd:command name="resetsubpagenumber" level="style" category="counter" file="strc-pag.mkiv"/> - <cd:command name="resetpagenumber" file="strc-pag.mkiv"/> + <cd:command name="resetpagenumber" level="system" category="counter" file="strc-pag.mkiv"/> - <cd:command name="setuppagenumbering" file="strc-pag.mkiv"> + <cd:command name="setuppagenumbering" level="style" category="counter" file="strc-pag.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="alternative"> @@ -111,74 +111,74 @@ </cd:arguments> </cd:command> - <cd:command name="firstrealpagenumber" file="strc-pag.mkiv"/> + <cd:command name="firstrealpagenumber" level="style" category="counter" file="strc-pag.mkiv"/> - <cd:command name="firstuserpagenumber" file="strc-pag.mkiv"/> + <cd:command name="firstuserpagenumber" level="style" category="counter" file="strc-pag.mkiv"/> - <cd:command name="firstsubpagenumber" file="strc-pag.mkiv"/> + <cd:command name="firstsubpagenumber" level="style" category="counter" file="strc-pag.mkiv"/> - <cd:command name="lastrealpagenumber" file="strc-pag.mkiv"/> + <cd:command name="lastrealpagenumber" level="style" category="counter" file="strc-pag.mkiv"/> - <cd:command name="lastuserpagenumber" file="strc-pag.mkiv"/> + <cd:command name="lastuserpagenumber" level="style" category="counter" file="strc-pag.mkiv"/> - <cd:command name="lastsubpagenumber" file="strc-pag.mkiv"/> + <cd:command name="lastsubpagenumber" level="style" category="counter" file="strc-pag.mkiv"/> - <cd:command name="prevrealpagenumber" file="strc-pag.mkiv"/> + <cd:command name="prevrealpagenumber" level="style" category="counter" file="strc-pag.mkiv"/> - <cd:command name="prevuserpagenumber" file="strc-pag.mkiv"/> + <cd:command name="prevuserpagenumber" level="style" category="counter" file="strc-pag.mkiv"/> - <cd:command name="prevsubpagenumber" file="strc-pag.mkiv"/> + <cd:command name="prevsubpagenumber" level="style" category="counter" file="strc-pag.mkiv"/> - <cd:command name="nextrealpagenumber" file="strc-pag.mkiv"/> + <cd:command name="nextrealpagenumber" level="style" category="counter" file="strc-pag.mkiv"/> - <cd:command name="nextuserpagenumber" file="strc-pag.mkiv"/> + <cd:command name="nextuserpagenumber" level="style" category="counter" file="strc-pag.mkiv"/> - <cd:command name="nextsubpagenumber" file="strc-pag.mkiv"/> + <cd:command name="nextsubpagenumber" level="style" category="counter" file="strc-pag.mkiv"/> - <cd:command name="firstrealpage" file="strc-pag.mkiv"/> + <cd:command name="firstrealpage" level="system" category="counter" file="strc-pag.mkiv"/> - <cd:command name="firstuserpage" file="strc-pag.mkiv"/> + <cd:command name="firstuserpage" level="system" category="counter" file="strc-pag.mkiv"/> - <cd:command name="firstsubpage" file="strc-pag.mkiv"/> + <cd:command name="firstsubpage" level="system" category="counter" file="strc-pag.mkiv"/> - <cd:command name="prevrealpage" file="strc-pag.mkiv"/> + <cd:command name="prevrealpage" level="system" category="counter" file="strc-pag.mkiv"/> - <cd:command name="prevuserpage" file="strc-pag.mkiv"/> + <cd:command name="prevuserpage" level="system" category="counter" file="strc-pag.mkiv"/> - <cd:command name="prevsubpage" file="strc-pag.mkiv"/> + <cd:command name="prevsubpage" level="system" category="counter" file="strc-pag.mkiv"/> - <cd:command name="nextrealpage" file="strc-pag.mkiv"/> + <cd:command name="nextrealpage" level="system" category="counter" file="strc-pag.mkiv"/> - <cd:command name="nextuserpage" file="strc-pag.mkiv"/> + <cd:command name="nextuserpage" level="system" category="counter" file="strc-pag.mkiv"/> - <cd:command name="nextsubpage" file="strc-pag.mkiv"/> + <cd:command name="nextsubpage" level="system" category="counter" file="strc-pag.mkiv"/> - <cd:command name="lastrealpage" file="strc-pag.mkiv"/> + <cd:command name="lastrealpage" level="system" category="counter" file="strc-pag.mkiv"/> - <cd:command name="lastuserpage" file="strc-pag.mkiv"/> + <cd:command name="lastuserpage" level="system" category="counter" file="strc-pag.mkiv"/> - <cd:command name="lastsubpage" file="strc-pag.mkiv"/> + <cd:command name="lastsubpage" level="system" category="counter" file="strc-pag.mkiv"/> - <cd:command name="realpagenumber" file="strc-pag.mkiv"/> + <cd:command name="realpagenumber" level="style" category="counter" file="strc-pag.mkiv"/> - <cd:command name="userpagenumber" file="strc-pag.mkiv"/> + <cd:command name="userpagenumber" level="style" category="counter" file="strc-pag.mkiv"/> - <cd:command name="subpagenumber" file="strc-pag.mkiv"/> + <cd:command name="subpagenumber" level="style" category="counter" file="strc-pag.mkiv"/> - <cd:command name="pagenumber" file="strc-pag.mkiv"/> + <cd:command name="pagenumber" level="style" category="counter" file="strc-pag.mkiv"/> - <cd:command name="prefixedpagenumber" file="strc-pag.mkiv"/> + <cd:command name="prefixedpagenumber" level="style" category="counter" file="strc-pag.mkiv"/> - <cd:command name="incrementpagenumber" file="strc-pag.mkiv"/> + <cd:command name="incrementpagenumber" level="style" category="counter" file="strc-pag.mkiv"/> - <cd:command name="incrementsubpagenumber" file="strc-pag.mkiv"/> + <cd:command name="incrementsubpagenumber" level="style" category="counter" file="strc-pag.mkiv"/> - <cd:command name="decrementpagenumber" file="strc-pag.mkiv"/> + <cd:command name="decrementpagenumber" level="style" category="counter" file="strc-pag.mkiv"/> - <cd:command name="decrementsubpagenumber" file="strc-pag.mkiv"/> + <cd:command name="decrementsubpagenumber" level="style" category="counter" file="strc-pag.mkiv"/> - <cd:command name="completepagenumber" file="strc-pag.mkiv"/> + <cd:command name="completepagenumber" level="style" category="counter" file="strc-pag.mkiv"/> - <cd:command name="placepagenumber" file="strc-pag.mkiv"/> + <cd:command name="placepagenumber" level="style" category="counter" file="strc-pag.mkiv"/> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-pageselection.xml b/tex/context/interface/mkiv/i-pageselection.xml index 99d55bb8a..082f53b6d 100644 --- a/tex/context/interface/mkiv/i-pageselection.xml +++ b/tex/context/interface/mkiv/i-pageselection.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="insertpages" file="page-sel.mkvi"> + <cd:command name="insertpages" level="document" file="page-sel.mkvi"> <cd:arguments> <cd:resolve name="keyword-file"/> <cd:resolve name="keyword-number-list-optional"/> @@ -22,7 +22,7 @@ </cd:arguments> </cd:command> - <cd:command name="filterpages" file="page-sel.mkvi"> + <cd:command name="filterpages" level="document" file="page-sel.mkvi"> <cd:arguments> <cd:resolve name="keyword-file"/> <cd:keywords list="yes"> @@ -45,7 +45,7 @@ </cd:arguments> </cd:command> - <cd:command name="copypages" file="page-sel.mkvi"> + <cd:command name="copypages" level="document" file="page-sel.mkvi"> <cd:arguments> <cd:resolve name="keyword-file"/> <cd:assignments list="yes" optional="yes"> @@ -66,7 +66,7 @@ </cd:arguments> </cd:command> - <cd:command name="combinepages" file="page-sel.mkvi"> + <cd:command name="combinepages" level="document" file="page-sel.mkvi"> <cd:arguments> <cd:resolve name="keyword-file"/> <cd:assignments list="yes" optional="yes"> @@ -132,7 +132,7 @@ </cd:arguments> </cd:command> - <cd:command name="slicepages" file="page-sel.mkvi"> + <cd:command name="slicepages" level="document" file="page-sel.mkvi"> <cd:arguments> <cd:resolve name="keyword-file"/> <cd:assignments list="yes" optional="yes"> @@ -178,4 +178,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-pageshift.xml b/tex/context/interface/mkiv/i-pageshift.xml index 630a5af6c..01e014a28 100644 --- a/tex/context/interface/mkiv/i-pageshift.xml +++ b/tex/context/interface/mkiv/i-pageshift.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definepageshift" file="page-imp.mkiv"> + <cd:command name="definepageshift" level="style" file="page-imp.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:keywords> @@ -15,7 +15,7 @@ </cd:arguments> </cd:command> - <cd:command name="setuppageshift" file="page-imp.mkiv"> + <cd:command name="setuppageshift" level="style" file="page-imp.mkiv"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="page" default="yes"/> @@ -26,4 +26,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-pagestate.xml b/tex/context/interface/mkiv/i-pagestate.xml index 82396d000..941068399 100644 --- a/tex/context/interface/mkiv/i-pagestate.xml +++ b/tex/context/interface/mkiv/i-pagestate.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definepagestate" file="core-dat.mkiv"> + <cd:command name="definepagestate" level="system" file="core-dat.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setuppagestate" file="core-dat.mkiv"> + <cd:command name="setuppagestate" level="system" file="core-dat.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -26,7 +26,7 @@ </cd:arguments> </cd:command> - <cd:command name="setpagestate" file="core-dat.mkiv"> + <cd:command name="setpagestate" level="system" file="core-dat.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:keywords optional="yes"> @@ -36,7 +36,7 @@ </cd:arguments> </cd:command> - <cd:command name="pagestaterealpage" file="core-dat.mkiv"> + <cd:command name="pagestaterealpage" level="system" file="core-dat.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:keywords delimiters="braces"> @@ -46,7 +46,7 @@ </cd:arguments> </cd:command> - <cd:command name="setpagestaterealpageno" file="core-dat.mkiv"> + <cd:command name="setpagestaterealpageno" level="system" file="core-dat.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:keywords delimiters="braces"> @@ -56,4 +56,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-pairedbox.xml b/tex/context/interface/mkiv/i-pairedbox.xml index bbab966ba..a5a0b9b5f 100644 --- a/tex/context/interface/mkiv/i-pairedbox.xml +++ b/tex/context/interface/mkiv/i-pairedbox.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definepairedbox" file="pack-com.mkiv"> + <cd:command name="definepairedbox" level="style" file="pack-com.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setuppairedbox" file="pack-com.mkiv"> + <cd:command name="setuppairedbox" level="style" file="pack-com.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -70,7 +70,7 @@ </cd:arguments> </cd:command> - <cd:command name="placepairedbox" file="pack-com.mkiv"> + <cd:command name="placepairedbox" level="document" file="pack-com.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes" optional="yes"> @@ -81,7 +81,7 @@ </cd:arguments> </cd:command> - <cd:command name="placepairedbox" type="environment" file="pack-com.mkiv"> + <cd:command name="placepairedbox" type="environment" level="document" file="pack-com.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes" optional="yes"> @@ -90,7 +90,7 @@ </cd:arguments> </cd:command> - <cd:command name="setuppairedbox" generated="yes" variant="instance" file="pack-com.mkiv"> + <cd:command name="setuppairedbox" generated="yes" variant="instance" level="style" file="pack-com.mkiv"> <cd:sequence> <cd:string value="setup"/> <cd:instance value="pairedbox"/> @@ -105,7 +105,7 @@ </cd:instances> </cd:command> - <cd:command name="placepairedbox" generated="yes" variant="instance" file="pack-com.mkiv"> + <cd:command name="placepairedbox" generated="yes" variant="instance" level="document" file="pack-com.mkiv"> <cd:sequence> <cd:string value="place"/> <cd:instance value="pairedbox"/> @@ -122,7 +122,7 @@ </cd:instances> </cd:command> - <cd:command name="placepairedbox" type="environment" generated="yes" variant="instance" file="pack-com.mkiv"> + <cd:command name="placepairedbox" type="environment" generated="yes" variant="instance" level="document" file="pack-com.mkiv"> <cd:sequence> <cd:string value="place"/> <cd:instance value="pairedbox"/> @@ -139,7 +139,7 @@ <!-- - <cd:command name="setuplegend" file="pack-com.mkiv"> + <cd:command name="setuplegend" level="document" file="pack-com.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:inherit name="setuppairedbox"/> @@ -147,7 +147,7 @@ </cd:arguments> </cd:command> - <cd:command name="placelegend" file="pack-com.mkiv"> + <cd:command name="placelegend" level="document" file="pack-com.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setuppairedbox"/> @@ -157,7 +157,7 @@ </cd:arguments> </cd:command> - <cd:command name="placelegend" type="environment" file="pack-com.mkiv"> + <cd:command name="placelegend" type="environment" level="document" file="pack-com.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setuppairedbox"/> @@ -167,18 +167,18 @@ --> - <cd:command name="placeontopofeachother" file="pack-com.mkiv"> + <cd:command name="placeontopofeachother" level="document" file="pack-com.mkiv"> <cd:arguments> <cd:content/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="placesidebyside" file="pack-com.mkiv"> + <cd:command name="placesidebyside" level="document" file="pack-com.mkiv"> <cd:arguments> <cd:content/> <cd:content/> </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-papersize.xml b/tex/context/interface/mkiv/i-papersize.xml index dab5e03bd..8156235bd 100644 --- a/tex/context/interface/mkiv/i-papersize.xml +++ b/tex/context/interface/mkiv/i-papersize.xml @@ -6,7 +6,7 @@ <!-- - <cd:command name="definelayouttarget" file="page-lay.mkiv"> + <cd:command name="definelayouttarget" level="system" category="layout" file="page-lay.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -16,7 +16,7 @@ </cd:arguments> </cd:command> - <cd:command name="setuplayouttarget" file="page-lay.mkiv"> + <cd:command name="setuplayouttarget" level="system" category="layout" file="page-lay.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -102,7 +102,7 @@ --> - <cd:command name="definepapersize" file="page-lay.mkiv"> + <cd:command name="definepapersize" level="style" category="layout" file="page-lay.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes"> @@ -137,7 +137,7 @@ </cd:arguments> </cd:command> - <cd:command name="definepapersize" variant="name" file="page-lay.mkiv"> + <cd:command name="definepapersize" variant="name" level="style" category="layout" file="page-lay.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:keywords list="yes"> @@ -149,7 +149,7 @@ </cd:arguments> </cd:command> - <cd:command name="setuppapersize" variant="name" file="page-lay.mkiv"> + <cd:command name="setuppapersize" variant="name" level="style" category="layout" file="page-lay.mkiv"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="reset"/> @@ -178,7 +178,7 @@ <!-- - <cd:command name="setuppapersize" file="page-lay.mkiv"> + <cd:command name="setuppapersize" level="style" category="layout" file="page-lay.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:assignments list="yes"> @@ -187,7 +187,7 @@ </cd:arguments> </cd:command> - <cd:command name="setuppaper" file="page-lay.mkiv"> + <cd:command name="setuppaper" level="style" category="layout" file="page-lay.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:inherit name="setuplayouttarget"/> @@ -197,7 +197,7 @@ --> - <cd:command name="setuppapersize" file="page-lay.mkiv"> + <cd:command name="setuppapersize" level="style" category="layout" file="page-lay.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:assignments list="yes"> @@ -281,7 +281,7 @@ </cd:arguments> </cd:command> - <cd:command name="setuppaper" file="page-lay.mkiv"> + <cd:command name="setuppaper" level="style" category="layout" file="page-lay.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:inherit name="setuppapersize"/> @@ -289,7 +289,7 @@ </cd:arguments> </cd:command> - <cd:command name="adaptpapersize" file="page-lay.mkiv"> + <cd:command name="adaptpapersize" level="style" category="layout" file="page-lay.mkiv"> <cd:arguments> <cd:keywords list="yes"> <cd:inherit name="setuppapersize"/> @@ -300,4 +300,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-paragraph.xml b/tex/context/interface/mkiv/i-paragraph.xml index 8a88f72fc..b253f404b 100644 --- a/tex/context/interface/mkiv/i-paragraph.xml +++ b/tex/context/interface/mkiv/i-paragraph.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="defineparagraph" file="strc-tag.mkiv"> + <cd:command name="defineparagraph" level="style" category="structure" file="strc-tag.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupparagraph" file="strc-tag.mkiv"> + <cd:command name="setupparagraph" level="style" category="structure" file="strc-tag.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -34,7 +34,7 @@ </cd:arguments> </cd:command> - <cd:command name="paragraph" type="environment" file="strc-tag.mkiv"> + <cd:command name="paragraph" type="environment" level="document" category="structure" file="strc-tag.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:assignments list="yes" optional="yes"> @@ -43,7 +43,7 @@ </cd:arguments> </cd:command> - <cd:command name="par" type="environment" file="strc-tag.mkiv"> + <cd:command name="par" type="environment" level="document" category="structure" file="strc-tag.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:assignments list="yes" optional="yes"> @@ -52,9 +52,9 @@ </cd:arguments> </cd:command> - <cd:command name="par" type="environment" begin="b" end ="e" file="strc-tag.mkiv"/> + <cd:command name="par" type="environment" begin="b" end ="e" level="document" category="structure" file="strc-tag.mkiv"/> - <cd:command name="setupparagraphintro" file="spac-par.mkiv"> + <cd:command name="setupparagraphintro" level="style" category="structure" file="spac-par.mkiv"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="reset"/> @@ -68,4 +68,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-paragraphnumber.xml b/tex/context/interface/mkiv/i-paragraphnumber.xml index f3588f87c..6d35f11a0 100644 --- a/tex/context/interface/mkiv/i-paragraphnumber.xml +++ b/tex/context/interface/mkiv/i-paragraphnumber.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="setupparagraphnumbering" file="page-par.mkiv"> + <cd:command name="setupparagraphnumbering" level="style" category="structure counter" file="page-par.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="state"> @@ -26,4 +26,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-paragraphs.xml b/tex/context/interface/mkiv/i-paragraphs.xml index 99092f668..0d8ae3d2e 100644 --- a/tex/context/interface/mkiv/i-paragraphs.xml +++ b/tex/context/interface/mkiv/i-paragraphs.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="defineparagraphs" file="tabl-mis.mkiv"> + <cd:command name="defineparagraphs" level="style" category="tables" file="tabl-mis.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupparagraphs" file="tabl-mis.mkiv"> + <cd:command name="setupparagraphs" level="style" category="tables" file="tabl-mis.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:keywords list="yes" optional="yes"> @@ -76,7 +76,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupparagraphs" variant="assignment" file="tabl-mis.mkiv"> + <cd:command name="setupparagraphs" variant="assignment" level="style" category="tables" file="tabl-mis.mkiv"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:number" prefix="cd:name" method="range"/> @@ -136,33 +136,33 @@ </cd:arguments> </cd:command> - <cd:command name="paragraphs" type="environment" file="tabl-mis.mkiv"> + <cd:command name="paragraphs" type="environment" level="document" category="tables" file="tabl-mis.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="nextparagraphs" file="tabl-mis.mkiv"/> + <cd:command name="nextparagraphs" level="document" category="tables" file="tabl-mis.mkiv"/> - <cd:command name="paragraphs" type="environment" generated="yes" variant="example" file="tabl-mis.mkiv"> + <cd:command name="paragraphs" type="environment" generated="yes" variant="example" level="document" category="tables" file="tabl-mis.mkiv"> <cd:sequence> <cd:variable value="paragraphs"/> </cd:sequence> </cd:command> - <cd:command name="paragraphs" generated="yes" variant="example" file="tabl-mis.mkiv"> + <cd:command name="paragraphs" generated="yes" variant="example" level="document" category="tables" file="tabl-mis.mkiv"> <cd:sequence> <cd:variable value="paragraphs"/> </cd:sequence> </cd:command> - <cd:command name="nextparagraphs" generated="yes" variant="example" file="tabl-mis.mkiv"> + <cd:command name="nextparagraphs" generated="yes" variant="example" level="document" category="tables" file="tabl-mis.mkiv"> <cd:sequence> <cd:string value="next"/> <cd:variable value="paragraphs"/> </cd:sequence> </cd:command> - <cd:command name="paragraphscell" type="environment" file="tabl-mis.mkiv"/> + <cd:command name="paragraphscell" type="environment" level="document" category="tables" file="tabl-mis.mkiv"/> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-parallel.xml b/tex/context/interface/mkiv/i-parallel.xml index ed1c50c86..3f7154c9f 100644 --- a/tex/context/interface/mkiv/i-parallel.xml +++ b/tex/context/interface/mkiv/i-parallel.xml @@ -4,14 +4,14 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="defineparallel" file="buff-par.mkvi"> + <cd:command name="defineparallel" level="style" file="buff-par.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-list"/> </cd:arguments> </cd:command> - <cd:command name="setupparallel" file="buff-par.mkvi"> + <cd:command name="setupparallel" level="style" file="buff-par.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-list"/> @@ -32,7 +32,7 @@ </cd:arguments> </cd:command> - <cd:command name="placeparallel" file="buff-par.mkvi"> + <cd:command name="placeparallel" level="document" file="buff-par.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-list"/> @@ -42,7 +42,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifelseparallel" file="buff-par.mkvi"> + <cd:command name="doifelseparallel" level="style" category="conditional" file="buff-par.mkvi"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:keywords delimiters="braces" list="yes"> @@ -54,7 +54,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifparallelelse" file="buff-par.mkvi"> + <cd:command name="doifparallelelse" level="style" category="conditional" file="buff-par.mkvi"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:keywords delimiters="braces" list="yes"> @@ -66,7 +66,7 @@ </cd:arguments> </cd:command> - <cd:command name="resetparallel" file="buff-par.mkvi"> + <cd:command name="resetparallel" level="style" file="buff-par.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:keywords list="yes" optional="yes"> @@ -76,10 +76,10 @@ </cd:arguments> </cd:command> - <cd:command name="parallel" type="environment" generated="yes" variant="example" file="buff-par.mkvi"> + <cd:command name="parallel" type="environment" generated="yes" variant="example" level="document" file="buff-par.mkvi"> <cd:sequence> <cd:variable value="parallel"/> </cd:sequence> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-parbuilder.xml b/tex/context/interface/mkiv/i-parbuilder.xml index b7bf37417..95621fce0 100644 --- a/tex/context/interface/mkiv/i-parbuilder.xml +++ b/tex/context/interface/mkiv/i-parbuilder.xml @@ -4,13 +4,13 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="defineparbuilder" file="typo-bld.mkiv"> + <cd:command name="defineparbuilder" level="system" category="layout" file="typo-bld.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="parbuilder" type="environment" file="typo-bld.mkiv"> + <cd:command name="parbuilder" type="environment" level="system" category="layout" file="typo-bld.mkiv"> <cd:arguments> <cd:keywords> <cd:constant type="default"/> @@ -21,7 +21,7 @@ </cd:arguments> </cd:command> - <cd:command name="setmainparbuilder" file="typo-bld.mkiv"> + <cd:command name="setmainparbuilder" level="system" category="layout" file="typo-bld.mkiv"> <cd:arguments> <cd:keywords> <cd:constant type="default"/> @@ -32,4 +32,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-pdf.xml b/tex/context/interface/mkiv/i-pdf.xml index 5b4eab2c3..fc83777a1 100644 --- a/tex/context/interface/mkiv/i-pdf.xml +++ b/tex/context/interface/mkiv/i-pdf.xml @@ -4,119 +4,119 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="pdfbackendsetcatalog" file="back-pdf.mkiv"> + <cd:command name="pdfbackendsetcatalog" level="system" category="pdf" file="back-pdf.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="pdfbackendsetinfo" file="back-pdf.mkiv"> + <cd:command name="pdfbackendsetinfo" level="system" category="pdf" file="back-pdf.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="pdfbackendsetname" file="back-pdf.mkiv"> + <cd:command name="pdfbackendsetname" level="system" category="pdf" file="back-pdf.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="pdfbackendsetpageattribute" file="back-pdf.mkiv"> + <cd:command name="pdfbackendsetpageattribute" level="system" category="pdf" file="back-pdf.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="pdfbackendsetpagesattribute" file="back-pdf.mkiv"> + <cd:command name="pdfbackendsetpagesattribute" level="system" category="pdf" file="back-pdf.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="pdfbackendsetpageresource" file="back-pdf.mkiv"> + <cd:command name="pdfbackendsetpageresource" level="system" category="pdf" file="back-pdf.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="pdfbackendsetextgstate" file="back-pdf.mkiv"> + <cd:command name="pdfbackendsetextgstate" level="system" category="pdf" file="back-pdf.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="pdfbackendsetcolorspace" file="back-pdf.mkiv"> + <cd:command name="pdfbackendsetcolorspace" level="system" category="pdf" file="back-pdf.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="pdfbackendsetpattern" file="back-pdf.mkiv"> + <cd:command name="pdfbackendsetpattern" level="system" category="pdf" file="back-pdf.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="pdfbackendsetshade" file="back-pdf.mkiv"> + <cd:command name="pdfbackendsetshade" level="system" category="pdf" file="back-pdf.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="pdfbackendcurrentresources" file="back-pdf.mkiv"/> + <cd:command name="pdfbackendcurrentresources" level="system" category="pdf" file="back-pdf.mkiv"/> - <cd:command name="pdfcolor" file="back-pdf.mkiv"> + <cd:command name="pdfcolor" level="system" category="pdf" file="back-pdf.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="PDFcolor" file="back-pdf.mkiv"> + <cd:command name="PDFcolor" level="system" category="pdf" file="back-pdf.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="TransparencyHack" file="back-pdf.mkiv"/> + <cd:command name="TransparencyHack" level="system" category="pdf" file="back-pdf.mkiv"/> - <cd:command name="lastpredefinedsymbol" file="pack-obj.mkiv"/> + <cd:command name="lastpredefinedsymbol" level="system" category="pdf" file="pack-obj.mkiv"/> - <cd:command name="predefinesymbol" file="pack-obj.mkiv"> + <cd:command name="predefinesymbol" level="system" category="pdf" file="pack-obj.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="pdfbackendactualtext" file="back-pdf.mkiv"> + <cd:command name="pdfbackendactualtext" level="style" category="pdf" file="back-pdf.mkiv"> <cd:arguments> <cd:content/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="pdfactualtext" file="back-pdf.mkiv"> + <cd:command name="pdfactualtext" level="document" category="pdf" file="back-pdf.mkiv"> <cd:arguments> <cd:content/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="negative" type="environment" file="attr-neg.mkiv"/> + <cd:command name="negative" type="environment" level="document" category="pdf" file="attr-neg.mkiv"/> - <cd:command name="positive" type="environment" file="attr-neg.mkiv"/> + <cd:command name="positive" type="environment" level="document" category="pdf" file="attr-neg.mkiv"/> - <cd:command name="setuppagetransitions" file="scrn-pag.mkvi"> + <cd:command name="setuppagetransitions" level="style" category="pdf" file="scrn-pag.mkvi"> <cd:arguments> <cd:keywords> <cd:constant type="reset" default="yes"/> @@ -128,4 +128,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-penalty.xml b/tex/context/interface/mkiv/i-penalty.xml index ee241b9ff..d69c196f9 100644 --- a/tex/context/interface/mkiv/i-penalty.xml +++ b/tex/context/interface/mkiv/i-penalty.xml @@ -4,13 +4,13 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="resetpenalties" file="spac-ver.mkiv"> + <cd:command name="resetpenalties" level="system" category="layout" file="spac-ver.mkiv"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="setpenalties" file="spac-ver.mkiv"> + <cd:command name="setpenalties" level="system" category="layout" file="spac-ver.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-number"/> @@ -18,12 +18,12 @@ </cd:arguments> </cd:command> - <cd:command name="keeplinestogether" file="spac-ver.mkiv"> + <cd:command name="keeplinestogether" level="system" category="layout" file="spac-ver.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="setdefaultpenalties" file="spac-ver.mkiv"/> + <cd:command name="setdefaultpenalties" level="system" category="layout" file="spac-ver.mkiv"/> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-periods.xml b/tex/context/interface/mkiv/i-periods.xml index 9114ae550..5cded3b1c 100644 --- a/tex/context/interface/mkiv/i-periods.xml +++ b/tex/context/interface/mkiv/i-periods.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="setupperiods" file="enco-ini.mkiv"> + <cd:command name="setupperiods" level="style" category="symbols" file="enco-ini.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="n"> @@ -24,13 +24,13 @@ </cd:arguments> </cd:command> - <cd:command name="periods" file="enco-ini.mkiv"> + <cd:command name="periods" level="document" category="symbols" file="enco-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-number-optional"/> </cd:arguments> </cd:command> - <cd:command name="periods" variant="assignment" file="enco-ini.mkiv"> + <cd:command name="periods" variant="assignment" level="document" category="symbols" file="enco-ini.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupperiods"/> @@ -38,6 +38,6 @@ </cd:arguments> </cd:command> - <cd:command name="unknown" file="enco-ini.mkiv"/> + <cd:command name="unknown" level="document" category="symbols" file="enco-ini.mkiv"/> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-phantom.xml b/tex/context/interface/mkiv/i-phantom.xml index e3f92b810..8458be67b 100644 --- a/tex/context/interface/mkiv/i-phantom.xml +++ b/tex/context/interface/mkiv/i-phantom.xml @@ -4,25 +4,25 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="phantom" file="supp-box.mkiv"> + <cd:command name="phantom" level="style" file="supp-box.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="hphantom" file="supp-box.mkiv"> + <cd:command name="hphantom" level="style" file="supp-box.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="vphantom" file="supp-box.mkiv"> + <cd:command name="vphantom" level="style" file="supp-box.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="phantombox" file="pack-box.mkiv"> + <cd:command name="phantombox" level="style" file="pack-box.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="width"> @@ -38,4 +38,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-placement.xml b/tex/context/interface/mkiv/i-placement.xml index 958ffaa6f..665d9aeb8 100644 --- a/tex/context/interface/mkiv/i-placement.xml +++ b/tex/context/interface/mkiv/i-placement.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="defineplacement" file="pack-mis.mkiv"> + <cd:command name="defineplacement" level="style" category="layout" file="pack-mis.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupplacement" file="pack-mis.mkiv"> + <cd:command name="setupplacement" level="style" category="layout" file="pack-mis.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -50,7 +50,7 @@ </cd:arguments> </cd:command> - <cd:command name="placement" file="pack-mis.mkiv"> + <cd:command name="placement" level="style" category="layout" file="pack-mis.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes" optional="yes"> @@ -60,7 +60,7 @@ </cd:arguments> </cd:command> - <cd:command name="placement" generated="yes" variant="example" file="pack-mis.mkiv"> + <cd:command name="placement" generated="yes" variant="example" level="style" category="layout" file="pack-mis.mkiv"> <cd:sequence> <cd:variable value="placement"/> </cd:sequence> @@ -72,4 +72,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-position.xml b/tex/context/interface/mkiv/i-position.xml index e43ee58ef..b9f4b3780 100644 --- a/tex/context/interface/mkiv/i-position.xml +++ b/tex/context/interface/mkiv/i-position.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="doifpositionaction" file="anch-pgr.mkiv"> + <cd:command name="doifpositionaction" level="system" category="conditional" file="anch-pgr.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -12,7 +12,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifelsepositionaction" file="anch-pgr.mkiv"> + <cd:command name="doifelsepositionaction" level="system" category="conditional" file="anch-pgr.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -20,7 +20,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifpositionactionelse" file="anch-pgr.mkiv"> + <cd:command name="doifpositionactionelse" level="system" category="conditional" file="anch-pgr.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -28,45 +28,45 @@ </cd:arguments> </cd:command> - <cd:command name="dopositionaction" file="anch-pgr.mkiv"> + <cd:command name="dopositionaction" level="system" file="anch-pgr.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="positionoverlay" file="anch-pgr.mkiv"> + <cd:command name="positionoverlay" level="system" category="background" file="anch-pgr.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="MPoverlayanchor" file="anch-pgr.mkiv"> + <cd:command name="MPoverlayanchor" level="system" category="background metapost" file="anch-pgr.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="positionregionoverlay" file="anch-pgr.mkiv"> + <cd:command name="positionregionoverlay" level="system" category="background" file="anch-pgr.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="positionoverlay" type="environment" file="anch-pgr.mkiv"> + <cd:command name="positionoverlay" type="environment" level="system" category="background" file="anch-pgr.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="MPpositiongraphic" type="environment" file="anch-pgr.mkiv"> + <cd:command name="MPpositiongraphic" type="environment" level="system" category="background metapost" file="anch-pgr.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-key-list-optional"/> </cd:arguments> </cd:command> - <cd:command name="MPpositiongraphic" file="anch-pgr.mkiv"> + <cd:command name="MPpositiongraphic" level="system" category="background metapost" file="anch-pgr.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:assignments delimiters="braces" list="yes" optional="yes"> @@ -77,13 +77,13 @@ </cd:arguments> </cd:command> - <cd:command name="MPpositionmethod" type="environment" file="anch-pgr.mkiv"> + <cd:command name="MPpositionmethod" type="environment" level="system" category="background metapost" file="anch-pgr.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="setMPpositiongraphic" file="anch-pgr.mkiv"> + <cd:command name="setMPpositiongraphic" level="system" category="background metapost" file="anch-pgr.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-name"/> @@ -95,7 +95,7 @@ </cd:arguments> </cd:command> - <cd:command name="setMPpositiongraphicrange" file="anch-pgr.mkiv"> + <cd:command name="setMPpositiongraphicrange" level="system" category="background metapost" file="anch-pgr.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-name"/> @@ -108,190 +108,190 @@ </cd:arguments> </cd:command> - <cd:command name="MPgetposboxes" file="anch-pgr.mkiv"> + <cd:command name="MPgetposboxes" level="system" category="background metapost" file="anch-pgr.mkiv"> <cd:arguments> <cd:resolve name="argument-name-list"/> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="MPgetmultipars" file="anch-pgr.mkiv"> + <cd:command name="MPgetmultipars" level="system" category="background metapost" file="anch-pgr.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="MPgetmultishape" file="anch-pgr.mkiv"> + <cd:command name="MPgetmultishape" level="system" category="background metapost" file="anch-pgr.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="MPp" file="anch-pos.mkiv"> + <cd:command name="MPp" level="system" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="MPr" file="anch-pos.mkiv"> + <cd:command name="MPr" level="system" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="MPc" file="anch-pos.mkiv"> + <cd:command name="MPc" level="system" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="MPn" file="anch-pos.mkiv"> + <cd:command name="MPn" level="system" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="MPx" file="anch-pos.mkiv"> + <cd:command name="MPx" level="system" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="MPy" file="anch-pos.mkiv"> + <cd:command name="MPy" level="system" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="MPw" file="anch-pos.mkiv"> + <cd:command name="MPw" level="system" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="MPh" file="anch-pos.mkiv"> + <cd:command name="MPh" level="system" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="MPd" file="anch-pos.mkiv"> + <cd:command name="MPd" level="system" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="MPwhd" file="anch-pos.mkiv"> + <cd:command name="MPwhd" level="system" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="MPxy" file="anch-pos.mkiv"> + <cd:command name="MPxy" level="system" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="MPll" file="anch-pos.mkiv"> + <cd:command name="MPll" level="system" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="MPlr" file="anch-pos.mkiv"> + <cd:command name="MPlr" level="system" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="MPur" file="anch-pos.mkiv"> + <cd:command name="MPur" level="system" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="MPul" file="anch-pos.mkiv"> + <cd:command name="MPul" level="system" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="MPpos" file="anch-pos.mkiv"> + <cd:command name="MPpos" level="system" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="MPls" file="anch-pos.mkiv"> + <cd:command name="MPls" level="system" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="MPrs" file="anch-pos.mkiv"> + <cd:command name="MPrs" level="system" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="MPpardata" file="anch-pos.mkiv"> + <cd:command name="MPpardata" level="system" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="MPxywhd" file="anch-pos.mkiv"> + <cd:command name="MPxywhd" level="system" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="MPposset" file="anch-pos.mkiv"> + <cd:command name="MPposset" level="system" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="MPpage" file="anch-pos.mkiv"> + <cd:command name="MPpage" level="system" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="MPregion" file="anch-pos.mkiv"> + <cd:command name="MPregion" level="system" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="MPcolumn" file="anch-pos.mkiv"> + <cd:command name="MPcolumn" level="system" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="MPanchor" file="anch-pos.mkiv"> + <cd:command name="MPanchor" level="system" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="MPleftskip" file="anch-pos.mkiv"> + <cd:command name="MPleftskip" level="system" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="MPrightskip" file="anch-pos.mkiv"> + <cd:command name="MPrightskip" level="system" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="MPplus" file="anch-pos.mkiv"> + <cd:command name="MPplus" level="system" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-number"/> @@ -299,7 +299,7 @@ </cd:arguments> </cd:command> - <cd:command name="MPv" file="anch-pos.mkiv"> + <cd:command name="MPv" level="system" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-number"/> @@ -307,33 +307,33 @@ </cd:arguments> </cd:command> - <cd:command name="MPrest" file="anch-pos.mkiv"> + <cd:command name="MPrest" level="system" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="MPvv" file="anch-pos.mkiv"> + <cd:command name="MPvv" level="system" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="setpositiononly" file="anch-pos.mkiv"> + <cd:command name="setpositiononly" level="system" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="setposition" file="anch-pos.mkiv"> + <cd:command name="setposition" level="system" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="setpositiondata" file="anch-pos.mkiv"> + <cd:command name="setpositiondata" level="system" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-dimension"/> @@ -342,7 +342,7 @@ </cd:arguments> </cd:command> - <cd:command name="setpositionbox" file="anch-pos.mkiv"> + <cd:command name="setpositionbox" level="system" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:csname/> @@ -350,13 +350,13 @@ </cd:arguments> </cd:command> - <cd:command name="setpositionstrut" file="anch-pos.mkiv"> + <cd:command name="setpositionstrut" level="system" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="setpositiondataplus" file="anch-pos.mkiv"> + <cd:command name="setpositiondataplus" level="system" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-dimension"/> @@ -368,7 +368,7 @@ </cd:arguments> </cd:command> - <cd:command name="setpositionplus" file="anch-pos.mkiv"> + <cd:command name="setpositionplus" level="system" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:keywords delimiters="braces" list="yes"> @@ -379,14 +379,14 @@ </cd:arguments> </cd:command> - <cd:command name="copyposition" file="anch-pos.mkiv"> + <cd:command name="copyposition" level="system" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="doifposition" file="anch-pos.mkiv"> + <cd:command name="doifposition" level="system" category="conditional" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -394,7 +394,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifelseposition" file="anch-pos.mkiv"> + <cd:command name="doifelseposition" level="system" category="conditional" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -402,7 +402,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifpositionelse" file="anch-pos.mkiv"> + <cd:command name="doifpositionelse" level="system" category="conditional" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -410,7 +410,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifelsepositiononpage" file="anch-pos.mkiv"> + <cd:command name="doifelsepositiononpage" level="system" category="conditional" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-number"/> @@ -419,7 +419,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifpositiononpageelse" file="anch-pos.mkiv"> + <cd:command name="doifpositiononpageelse" level="system" category="conditional" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-number"/> @@ -428,46 +428,46 @@ </cd:arguments> </cd:command> - <cd:command name="xypos" file="anch-pos.mkiv"> + <cd:command name="xypos" level="system" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="hpos" file="anch-pos.mkiv"> + <cd:command name="hpos" level="system" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="vpos" file="anch-pos.mkiv"> + <cd:command name="vpos" level="system" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="bpos" file="anch-pos.mkiv"> + <cd:command name="bpos" level="system" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="epos" file="anch-pos.mkiv"> + <cd:command name="epos" level="system" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="tracepositions" file="anch-pos.mkiv"/> + <cd:command name="tracepositions" level="system" file="anch-pos.mkiv"/> - <cd:command name="enableparpositions" file="anch-pos.mkiv"/> + <cd:command name="enableparpositions" level="system" file="anch-pos.mkiv"/> - <cd:command name="disableparpositions" file="anch-pos.mkiv"/> + <cd:command name="disableparpositions" level="system" file="anch-pos.mkiv"/> - <cd:command name="doifelseoverlapping" file="anch-pos.mkiv"> + <cd:command name="doifelseoverlapping" level="system" category="conditional" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-name"/> @@ -476,7 +476,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifoverlappingelse" file="anch-pos.mkiv"> + <cd:command name="doifoverlappingelse" level="system" category="conditional" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-name"/> @@ -485,7 +485,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifelsepositionsonsamepage" file="anch-pos.mkiv"> + <cd:command name="doifelsepositionsonsamepage" level="system" category="conditional" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-name-list"/> <cd:resolve name="argument-true"/> @@ -493,7 +493,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifpositionsonsamepageelse" file="anch-pos.mkiv"> + <cd:command name="doifpositionsonsamepageelse" level="system" category="conditional" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-name-list"/> <cd:resolve name="argument-true"/> @@ -501,7 +501,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifelsepositionsonthispage" file="anch-pos.mkiv"> + <cd:command name="doifelsepositionsonthispage" level="system" category="conditional" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-name-list"/> <cd:resolve name="argument-true"/> @@ -509,7 +509,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifpositionsonthispageelse" file="anch-pos.mkiv"> + <cd:command name="doifpositionsonthispageelse" level="system" category="conditional" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-name-list"/> <cd:resolve name="argument-true"/> @@ -517,18 +517,18 @@ </cd:arguments> </cd:command> - <cd:command name="doifelsepositionsused" file="anch-pos.mkiv"> + <cd:command name="doifelsepositionsused" level="system" category="conditional" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-true"/> <cd:resolve name="argument-false"/> </cd:arguments> </cd:command> - <cd:command name="doifpositionsusedelse" file="anch-pos.mkiv"> + <cd:command name="doifpositionsusedelse" level="system" category="conditional" file="anch-pos.mkiv"> <cd:arguments> <cd:resolve name="argument-true"/> <cd:resolve name="argument-false"/> </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-positionbar.xml b/tex/context/interface/mkiv/i-positionbar.xml index 481540691..286466bef 100644 --- a/tex/context/interface/mkiv/i-positionbar.xml +++ b/tex/context/interface/mkiv/i-positionbar.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="setuppositionbar" file="pack-bar.mkiv"> + <cd:command name="setuppositionbar" level="style" category="graphics" file="pack-bar.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="style"> @@ -38,7 +38,7 @@ </cd:arguments> </cd:command> - <cd:command name="horizontalpositionbar" file="pack-bar.mkiv"> + <cd:command name="horizontalpositionbar" level="style" category="graphics" file="pack-bar.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:inherit name="setuppositionbar"/> @@ -46,7 +46,7 @@ </cd:arguments> </cd:command> - <cd:command name="verticalpositionbar" file="pack-bar.mkiv"> + <cd:command name="verticalpositionbar" level="style" category="graphics" file="pack-bar.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:inherit name="setuppositionbar"/> @@ -54,7 +54,7 @@ </cd:arguments> </cd:command> - <cd:command name="horizontalgrowingbar" file="pack-bar.mkiv"> + <cd:command name="horizontalgrowingbar" level="style" category="graphics" file="pack-bar.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:inherit name="setuppositionbar"/> @@ -62,7 +62,7 @@ </cd:arguments> </cd:command> - <cd:command name="verticalgrowingbar" file="pack-bar.mkiv"> + <cd:command name="verticalgrowingbar" level="style" category="graphics" file="pack-bar.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:inherit name="setuppositionbar"/> @@ -70,4 +70,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-positioning.xml b/tex/context/interface/mkiv/i-positioning.xml index 98898c7cc..9d873fd46 100644 --- a/tex/context/interface/mkiv/i-positioning.xml +++ b/tex/context/interface/mkiv/i-positioning.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definepositioning" file="pack-pos.mkiv"> + <cd:command name="definepositioning" level="style" category="graphics" file="pack-pos.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setuppositioning" file="pack-pos.mkiv"> + <cd:command name="setuppositioning" level="style" category="graphics" file="pack-pos.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -76,7 +76,7 @@ </cd:arguments> </cd:command> - <cd:command name="positioning" type="environment" file="pack-pos.mkiv"> + <cd:command name="positioning" type="environment" level="document" category="graphics" file="pack-pos.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:assignments list="yes" optional="yes"> @@ -85,7 +85,7 @@ </cd:arguments> </cd:command> - <cd:command name="position" file="pack-pos.mkiv"> + <cd:command name="position" level="document" category="graphics" file="pack-pos.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setuppositioning"/> @@ -95,4 +95,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-postponing.xml b/tex/context/interface/mkiv/i-postponing.xml index 619a77552..0d4c98d7a 100644 --- a/tex/context/interface/mkiv/i-postponing.xml +++ b/tex/context/interface/mkiv/i-postponing.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="postponing" type="environment" file="page-pst.mkiv"> + <cd:command name="postponing" type="environment" level="document" category="structure" file="page-pst.mkiv"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:number" prefix="cd:sign" method="none"/> @@ -12,4 +12,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-processor.xml b/tex/context/interface/mkiv/i-processor.xml index 0c313c77a..7e23c6631 100644 --- a/tex/context/interface/mkiv/i-processor.xml +++ b/tex/context/interface/mkiv/i-processor.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="defineprocessor" file="typo-prc.mkvi"> + <cd:command name="defineprocessor" level="style" category="fonts colors" file="typo-prc.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupprocessor" file="typo-prc.mkvi"> + <cd:command name="setupprocessor" level="style" category="fonts colors" file="typo-prc.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -41,11 +41,11 @@ </cd:arguments> </cd:command> - <cd:command name="applyprocessor" file="typo-prc.mkvi"> + <cd:command name="applyprocessor" level="system" category="fonts colors" file="typo-prc.mkvi"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:content/> </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-profile.xml b/tex/context/interface/mkiv/i-profile.xml index a3fe7ea6e..acc486cb7 100644 --- a/tex/context/interface/mkiv/i-profile.xml +++ b/tex/context/interface/mkiv/i-profile.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="defineprofile" file="spac-prf.mkvi"> + <cd:command name="defineprofile" level="style" category="pdf" file="spac-prf.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupprofile" file="spac-prf.mkvi"> + <cd:command name="setupprofile" level="style" category="pdf" file="spac-prf.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -42,7 +42,7 @@ </cd:arguments> </cd:command> - <cd:command name="setprofile" file="spac-prf.mkvi"> + <cd:command name="setprofile" level="system" category="pdf" file="spac-prf.mkvi"> <cd:arguments> <cd:keywords> <cd:constant type="none"/> @@ -56,15 +56,15 @@ </cd:arguments> </cd:command> - <cd:command name="resetprofile" file="spac-prf.mkvi"/> + <cd:command name="resetprofile" level="system" category="pdf" file="spac-prf.mkvi"/> - <cd:command name="useprofileparameter" file="spac-prf.mkvi"> + <cd:command name="useprofileparameter" level="system" category="pdf" file="spac-prf.mkvi"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="profiledbox" file="spac-prf.mkvi"> + <cd:command name="profiledbox" level="system" category="pdf" file="spac-prf.mkvi"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="none"/> @@ -82,7 +82,7 @@ </cd:arguments> </cd:command> - <cd:command name="profilegivenbox" file="spac-prf.mkvi"> + <cd:command name="profilegivenbox" level="system" category="pdf" file="spac-prf.mkvi"> <cd:arguments> <cd:keywords delimiters="braces" optional="yes"> <cd:constant type="none"/> @@ -97,4 +97,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-publication.xml b/tex/context/interface/mkiv/i-publication.xml index 83cb6c2c8..b6280047a 100644 --- a/tex/context/interface/mkiv/i-publication.xml +++ b/tex/context/interface/mkiv/i-publication.xml @@ -4,25 +4,25 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="btxrenderingdefinitions" type="environment" file="publ-ini.mkiv"> + <cd:command name="btxrenderingdefinitions" type="environment" level="system" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="loadbtxdefinitionfile" file="publ-ini.mkiv"> + <cd:command name="loadbtxdefinitionfile" level="system" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-file"/> </cd:arguments> </cd:command> - <cd:command name="loadbtxreplacementfile" file="publ-ini.mkiv"> + <cd:command name="loadbtxreplacementfile" level="system" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-file"/> </cd:arguments> </cd:command> - <cd:command name="definebtx" file="publ-ini.mkiv"> + <cd:command name="definebtx" level="system" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -32,7 +32,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupbtx" file="publ-ini.mkiv"> + <cd:command name="setupbtx" level="system" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:assignments list="yes"> @@ -77,6 +77,9 @@ <cd:parameter name="interaction"> <cd:constant type="start" default="yes"/> <cd:constant type="stop"/> + <cd:constant type="number"/> + <cd:constant type="text"/> + <cd:constant type="page"/> <cd:constant type="all"/> </cd:parameter> <cd:parameter name="alternative"> @@ -114,19 +117,19 @@ </cd:arguments> </cd:command> - <cd:command name="setupbtx" variant="name" file="publ-ini.mkiv"> + <cd:command name="setupbtx" variant="name" level="system" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="usingbtxspecification" type="environment" file="publ-ini.mkiv"> + <cd:command name="usingbtxspecification" type="environment" level="system" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="definebtxdataset" file="publ-ini.mkiv"> + <cd:command name="definebtxdataset" level="style" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -136,7 +139,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupbtxdataset" file="publ-ini.mkiv"> + <cd:command name="setupbtxdataset" level="style" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -147,7 +150,7 @@ </cd:arguments> </cd:command> - <cd:command name="definebtxregister" file="publ-ini.mkiv"> + <cd:command name="definebtxregister" level="system" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -157,7 +160,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupbtxregister" file="publ-ini.mkiv"> + <cd:command name="setupbtxregister" level="system" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -194,7 +197,7 @@ </cd:arguments> </cd:command> - <cd:command name="definebtxrendering" file="publ-ini.mkiv"> + <cd:command name="definebtxrendering" level="style" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -204,7 +207,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupbtxrendering" file="publ-ini.mkiv"> + <cd:command name="setupbtxrendering" level="style" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -226,6 +229,9 @@ <cd:constant type="all"/> <cd:constant type="none"/> </cd:parameter> + <cd:parameter name="filter"> + <cd:constant type="cd:text"/> + </cd:parameter> <cd:parameter name="specification"> <cd:constant type="cd:name"/> </cd:parameter> @@ -293,7 +299,7 @@ </cd:arguments> </cd:command> - <cd:command name="usebtxdataset" file="publ-ini.mkiv"> + <cd:command name="usebtxdataset" level="style" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:resolve name="keyword-file"/> @@ -305,7 +311,7 @@ </cd:arguments> </cd:command> - <cd:command name="publication" type="environment" file="publ-ini.mkiv"> + <cd:command name="publication" type="environment" level="style" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:assignments list="yes" optional="yes"> @@ -325,7 +331,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupbtxlist" file="publ-ini.mkiv"> + <cd:command name="setupbtxlist" level="style" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:assignments list="yes"> @@ -334,7 +340,7 @@ </cd:arguments> </cd:command> - <cd:command name="completebtxrendering" file="publ-ini.mkiv"> + <cd:command name="completebtxrendering" level="document" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:assignments list="yes" optional="yes"> @@ -343,7 +349,7 @@ </cd:arguments> </cd:command> - <cd:command name="placebtxrendering" file="publ-ini.mkiv"> + <cd:command name="placebtxrendering" level="document" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:assignments list="yes" optional="yes"> @@ -352,7 +358,7 @@ </cd:arguments> </cd:command> - <cd:command name="completelistofpublications" file="publ-ini.mkiv"> + <cd:command name="completelistofpublications" level="document" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:assignments list="yes" optional="yes"> @@ -361,7 +367,7 @@ </cd:arguments> </cd:command> - <cd:command name="placelistofpublications" file="publ-ini.mkiv"> + <cd:command name="placelistofpublications" level="document" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:assignments list="yes" optional="yes"> @@ -370,319 +376,331 @@ </cd:arguments> </cd:command> - <cd:command name="btxhybridcite" file="publ-ini.mkiv"> + <cd:command name="btxhybridcite" level="system" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="assignment-citedata-list-optional"/> <cd:resolve name="keyword-reference"/> </cd:arguments> </cd:command> - <cd:command name="btxhybridcite" variant="userdata" file="publ-ini.mkiv"> + <cd:command name="btxhybridcite" variant="userdata" level="system" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="assignment-citedata-list"/> <cd:resolve name="assignment-userdata-list"/> </cd:arguments> </cd:command> - <cd:command name="btxhybridcite" variant="alternative" file="publ-ini.mkiv"> + <cd:command name="btxhybridcite" variant="alternative" level="system" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-btxalternative-optional"/> <cd:resolve name="keyword-reference"/> </cd:arguments> </cd:command> - <cd:command name="btxhybridcite" variant="direct" file="publ-ini.mkiv"> + <cd:command name="btxhybridcite" variant="direct" level="system" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-reference"/> </cd:arguments> </cd:command> - <cd:command name="btxlistcitation" file="publ-ini.mkiv"> + <cd:command name="btxlistcitation" level="system" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="assignment-citedata-list-optional"/> <cd:resolve name="keyword-reference"/> </cd:arguments> </cd:command> - <cd:command name="btxlistcitation" variant="userdata" file="publ-ini.mkiv"> + <cd:command name="btxlistcitation" variant="userdata" level="system" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="assignment-citedata-list"/> <cd:resolve name="assignment-userdata-list"/> </cd:arguments> </cd:command> - <cd:command name="btxlistcitation" variant="alternative" file="publ-ini.mkiv"> + <cd:command name="btxlistcitation" variant="alternative" level="system" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-btxalternative-optional"/> <cd:resolve name="keyword-reference"/> </cd:arguments> </cd:command> - <cd:command name="btxtextcitation" file="publ-ini.mkiv"> + <cd:command name="btxtextcitation" level="system" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="assignment-citedata-list-optional"/> <cd:resolve name="keyword-reference"/> </cd:arguments> </cd:command> - <cd:command name="btxtextcitation" variant="userdata" file="publ-ini.mkiv"> + <cd:command name="btxtextcitation" variant="userdata" level="system" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="assignment-citedata-list"/> <cd:resolve name="assignment-userdata-list"/> </cd:arguments> </cd:command> - <cd:command name="btxtextcitation" variant="alternative" file="publ-ini.mkiv"> + <cd:command name="btxtextcitation" variant="alternative" level="system" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-btxalternative-optional"/> <cd:resolve name="keyword-reference"/> </cd:arguments> </cd:command> - <cd:command name="btxalwayscitation" file="publ-ini.mkiv"> + <cd:command name="btxalwayscitation" level="system" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="assignment-citedata-list-optional"/> <cd:resolve name="keyword-reference"/> </cd:arguments> </cd:command> - <cd:command name="btxalwayscitation" variant="userdata" file="publ-ini.mkiv"> + <cd:command name="btxalwayscitation" variant="userdata" level="system" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="assignment-citedata-list"/> <cd:resolve name="assignment-userdata-list"/> </cd:arguments> </cd:command> - <cd:command name="btxalwayscitation" variant="alternative" file="publ-ini.mkiv"> + <cd:command name="btxalwayscitation" variant="alternative" level="system" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-btxalternative-optional"/> <cd:resolve name="keyword-reference"/> </cd:arguments> </cd:command> - <cd:command name="bthiddencitation" file="publ-ini.mkiv"> + <cd:command name="btxhiddencitation" level="system" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-reference"/> </cd:arguments> </cd:command> - <cd:command name="listcitation" file="publ-ini.mkiv"> + <cd:command name="listcitation" level="document" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="assignment-citedata-list-optional"/> <cd:resolve name="keyword-reference"/> </cd:arguments> </cd:command> - <cd:command name="listcitation" variant="userdata" file="publ-ini.mkiv"> + <cd:command name="listcitation" variant="userdata" level="document" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="assignment-citedata-list"/> <cd:resolve name="assignment-userdata-list"/> </cd:arguments> </cd:command> - <cd:command name="listcitation" variant="alternative" file="publ-ini.mkiv"> + <cd:command name="listcitation" variant="alternative" level="document" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-btxalternative-optional"/> <cd:resolve name="keyword-reference"/> </cd:arguments> </cd:command> - <cd:command name="listcite" file="publ-ini.mkiv"> + <cd:command name="listcite" level="document" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="assignment-citedata-list-optional"/> <cd:resolve name="keyword-reference"/> </cd:arguments> </cd:command> - <cd:command name="listcite" variant="userdata" file="publ-ini.mkiv"> + <cd:command name="listcite" variant="userdata" level="document" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="assignment-citedata-list"/> <cd:resolve name="assignment-userdata-list"/> </cd:arguments> </cd:command> - <cd:command name="listcite" variant="alternative" file="publ-ini.mkiv"> + <cd:command name="listcite" variant="alternative" level="document" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-btxalternative-optional"/> <cd:resolve name="keyword-reference"/> </cd:arguments> </cd:command> - <cd:command name="textcitation" file="publ-ini.mkiv"> + <cd:command name="textcitation" level="document" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="assignment-citedata-list-optional"/> <cd:resolve name="keyword-reference"/> </cd:arguments> </cd:command> - <cd:command name="textcitation" variant="userdata" file="publ-ini.mkiv"> + <cd:command name="textcitation" variant="userdata" level="document" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="assignment-citedata-list"/> <cd:resolve name="assignment-userdata-list"/> </cd:arguments> </cd:command> - <cd:command name="textcitation" variant="alternative" file="publ-ini.mkiv"> + <cd:command name="textcitation" variant="alternative" level="document" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-btxalternative-optional"/> <cd:resolve name="keyword-reference"/> </cd:arguments> </cd:command> - <cd:command name="textcite" file="publ-ini.mkiv"> + <cd:command name="textcite" level="document" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="assignment-citedata-list-optional"/> <cd:resolve name="keyword-reference"/> </cd:arguments> </cd:command> - <cd:command name="textcite" variant="userdata" file="publ-ini.mkiv"> + <cd:command name="textcite" variant="userdata" level="document" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="assignment-citedata-list"/> <cd:resolve name="assignment-userdata-list"/> </cd:arguments> </cd:command> - <cd:command name="textcite" variant="alternative" file="publ-ini.mkiv"> + <cd:command name="textcite" variant="alternative" level="document" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-btxalternative-optional"/> <cd:resolve name="keyword-reference"/> </cd:arguments> </cd:command> - <cd:command name="alwayscitation" file="publ-ini.mkiv"> + <cd:command name="alwayscitation" level="document" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="assignment-citedata-list-optional"/> <cd:resolve name="keyword-reference"/> </cd:arguments> </cd:command> - <cd:command name="alwayscitation" variant="userdata" file="publ-ini.mkiv"> + <cd:command name="alwayscitation" variant="userdata" level="document" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="assignment-citedata-list"/> <cd:resolve name="assignment-userdata-list"/> </cd:arguments> </cd:command> - <cd:command name="alwayscitation" variant="alternative" file="publ-ini.mkiv"> + <cd:command name="alwayscitation" variant="alternative" level="document" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-btxalternative-optional"/> <cd:resolve name="keyword-reference"/> </cd:arguments> </cd:command> - <cd:command name="alwayscite" file="publ-ini.mkiv"> + <cd:command name="alwayscite" level="document" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="assignment-citedata-list-optional"/> <cd:resolve name="keyword-reference"/> </cd:arguments> </cd:command> - <cd:command name="alwayscite" variant="userdata" file="publ-ini.mkiv"> + <cd:command name="alwayscite" variant="userdata" level="document" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="assignment-citedata-list"/> <cd:resolve name="assignment-userdata-list"/> </cd:arguments> </cd:command> - <cd:command name="alwayscite" variant="alternative" file="publ-ini.mkiv"> + <cd:command name="alwayscite" variant="alternative" level="document" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-btxalternative-optional"/> <cd:resolve name="keyword-reference"/> </cd:arguments> </cd:command> - <cd:command name="hiddencitation" file="publ-ini.mkiv"> + <cd:command name="hiddencitation" level="document" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-reference"/> </cd:arguments> </cd:command> - <cd:command name="hiddencite" file="publ-ini.mkiv"> + <cd:command name="hiddencite" level="document" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-reference"/> </cd:arguments> </cd:command> - <cd:command name="citation" file="publ-ini.mkiv"> + <cd:command name="citation" level="document" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="assignment-citedata-list-optional"/> <cd:resolve name="keyword-reference"/> </cd:arguments> </cd:command> - <cd:command name="citation" variant="userdata" file="publ-ini.mkiv"> + <cd:command name="citation" variant="userdata" level="document" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="assignment-citedata-list"/> <cd:resolve name="assignment-userdata-list"/> </cd:arguments> </cd:command> - <cd:command name="citation" variant="alternative" file="publ-ini.mkiv"> + <cd:command name="citation" variant="alternative" level="document" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-btxalternative-optional"/> <cd:resolve name="keyword-reference"/> </cd:arguments> </cd:command> - <cd:command name="citation" variant="direct" file="publ-ini.mkiv"> + <cd:command name="citation" variant="direct" level="document" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-reference"/> </cd:arguments> </cd:command> - <cd:command name="cite" file="publ-ini.mkiv"> + <cd:command name="cite" level="document" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="assignment-citedata-list-optional"/> <cd:resolve name="keyword-reference"/> </cd:arguments> </cd:command> - <cd:command name="cite" variant="userdata" file="publ-ini.mkiv"> + <cd:command name="cite" variant="userdata" level="document" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="assignment-citedata-list"/> <cd:resolve name="assignment-userdata-list"/> </cd:arguments> </cd:command> - <cd:command name="cite" variant="alternative" file="publ-ini.mkiv"> + <cd:command name="cite" variant="alternative" level="document" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-btxalternative-optional"/> <cd:resolve name="keyword-reference"/> </cd:arguments> </cd:command> - <cd:command name="cite" variant="direct" file="publ-ini.mkiv"> + <cd:command name="cite" variant="direct" level="document" category="bibliography" file="publ-ini.mkiv"> + <cd:arguments> + <cd:resolve name="argument-reference"/> + </cd:arguments> + </cd:command> + + <cd:command name="nocitation" level="document" category="bibliography" file="publ-ini.mkiv"> + <cd:arguments> + <cd:resolve name="keyword-reference"/> + </cd:arguments> + </cd:command> + + <cd:command name="nocitation" variant="direct" level="document" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-reference"/> </cd:arguments> </cd:command> - <cd:command name="nocitation" file="publ-ini.mkiv"> + <cd:command name="usecitation" level="document" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-reference"/> </cd:arguments> </cd:command> - <cd:command name="nocitation" variant="direct" file="publ-ini.mkiv"> + <cd:command name="usecitation" variant="direct" level="document" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-reference"/> </cd:arguments> </cd:command> - <cd:command name="nocite" file="publ-ini.mkiv"> + <cd:command name="nocite" level="document" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-reference"/> </cd:arguments> </cd:command> - <cd:command name="nocite" variant="direct" file="publ-ini.mkiv"> + <cd:command name="nocite" variant="direct" level="document" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-reference"/> </cd:arguments> </cd:command> - <cd:command name="savebtxdataset" file="publ-ini.mkiv"> + <cd:command name="savebtxdataset" level="style" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:resolve name="keyword-file-optional"/> @@ -717,67 +735,67 @@ </cd:arguments> </cd:command> - <cd:command name="placecitation" file="publ-ini.mkiv"> + <cd:command name="placecitation" level="document" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-reference"/> </cd:arguments> </cd:command> - <cd:command name="usebtxdefinitions" file="publ-ini.mkiv"> + <cd:command name="usebtxdefinitions" level="style" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-file"/> </cd:arguments> </cd:command> - <cd:command name="btxfield" file="publ-ini.mkiv"> + <cd:command name="btxfield" level="system" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-btxfield"/> </cd:arguments> </cd:command> - <cd:command name="btxdetail" file="publ-ini.mkiv"> + <cd:command name="btxdetail" level="system" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-btxfield"/> </cd:arguments> </cd:command> - <cd:command name="btxflush" file="publ-ini.mkiv"> + <cd:command name="btxflush" level="system" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-btxfield"/> </cd:arguments> </cd:command> - <cd:command name="btxdirect" file="publ-ini.mkiv"> + <cd:command name="btxdirect" level="system" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-btxfield"/> </cd:arguments> </cd:command> - <cd:command name="btxfieldname" file="publ-ini.mkiv"> + <cd:command name="btxfieldname" level="system" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-btxfield"/> </cd:arguments> </cd:command> - <cd:command name="btxfieldtype" file="publ-ini.mkiv"> + <cd:command name="btxfieldtype" level="system" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-btxfield"/> </cd:arguments> </cd:command> - <cd:command name="btxfoundname" file="publ-ini.mkiv"> + <cd:command name="btxfoundname" level="system" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-btxfield"/> </cd:arguments> </cd:command> - <cd:command name="btxfoundtype" file="publ-ini.mkiv"> + <cd:command name="btxfoundtype" level="system" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-btxfield"/> </cd:arguments> </cd:command> - <cd:command name="btxauthorfield" file="publ-ini.mkiv"> + <cd:command name="btxauthorfield" level="system" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="initials"/> @@ -789,7 +807,7 @@ </cd:arguments> </cd:command> - <cd:command name="btxdoifelse" file="publ-ini.mkiv"> + <cd:command name="btxdoifelse" level="system" category="bibliography conditional" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-btxfield"/> <cd:resolve name="argument-true"/> @@ -797,27 +815,27 @@ </cd:arguments> </cd:command> - <cd:command name="btxdoif" file="publ-ini.mkiv"> + <cd:command name="btxdoif" level="system" category="bibliography conditional" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-btxfield"/> <cd:resolve name="argument-true"/> </cd:arguments> </cd:command> - <cd:command name="btxdoifnot" file="publ-ini.mkiv"> + <cd:command name="btxdoifnot" level="system" category="bibliography conditional" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-btxfield"/> <cd:resolve name="argument-true"/> </cd:arguments> </cd:command> - <cd:command name="btxsetup" file="publ-ini.mkiv"> + <cd:command name="btxsetup" level="system" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="btxdoifelsesameaspreviouschecked" file="publ-ini.mkiv"> + <cd:command name="btxdoifelsesameaspreviouschecked" level="system" category="bibliography conditional" file="publ-ini.mkiv"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="always"/> @@ -829,7 +847,7 @@ </cd:arguments> </cd:command> - <cd:command name="btxdoifelsesameasprevious" file="publ-ini.mkiv"> + <cd:command name="btxdoifelsesameasprevious" level="system" category="bibliography conditional" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-btxfield"/> <cd:resolve name="argument-true"/> @@ -837,7 +855,7 @@ </cd:arguments> </cd:command> - <cd:command name="btxdoifelsecombiinlist" file="publ-ini.mkiv"> + <cd:command name="btxdoifelsecombiinlist" level="system" category="bibliography conditional" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-name"/> @@ -846,7 +864,7 @@ </cd:arguments> </cd:command> - <cd:command name="btxdoifsameaspreviouscheckedelse" file="publ-ini.mkiv"> + <cd:command name="btxdoifsameaspreviouscheckedelse" level="system" category="bibliography conditional" file="publ-ini.mkiv"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="always"/> @@ -858,7 +876,7 @@ </cd:arguments> </cd:command> - <cd:command name="btxdoifsameaspreviouselse" file="publ-ini.mkiv"> + <cd:command name="btxdoifsameaspreviouselse" level="system" category="bibliography conditional" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-btxfield"/> <cd:resolve name="argument-true"/> @@ -866,7 +884,7 @@ </cd:arguments> </cd:command> - <cd:command name="btxdoifcombiinlistelse" file="publ-ini.mkiv"> + <cd:command name="btxdoifcombiinlistelse" level="system" category="bibliography conditional" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-name"/> @@ -875,13 +893,13 @@ </cd:arguments> </cd:command> - <cd:command name="currentbtxuservariable" file="publ-ini.mkiv"> + <cd:command name="currentbtxuservariable" level="system" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-key"/> </cd:arguments> </cd:command> - <cd:command name="btxdoifelseuservariable" file="publ-ini.mkiv"> + <cd:command name="btxdoifelseuservariable" level="system" category="bibliography conditional" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-key"/> <cd:resolve name="argument-true"/> @@ -889,7 +907,7 @@ </cd:arguments> </cd:command> - <cd:command name="btxdoifuservariableelse" file="publ-ini.mkiv"> + <cd:command name="btxdoifuservariableelse" level="system" category="bibliography conditional" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-key"/> <cd:resolve name="argument-true"/> @@ -897,14 +915,14 @@ </cd:arguments> </cd:command> - <cd:command name="btxremapauthor" file="publ-ini.mkiv"> + <cd:command name="btxremapauthor" level="system" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-text"/> <cd:resolve name="keyword-text"/> </cd:arguments> </cd:command> - <cd:command name="btxflushauthor" file="publ-ini.mkiv"> + <cd:command name="btxflushauthor" level="system" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="num"/> @@ -917,39 +935,39 @@ </cd:arguments> </cd:command> - <cd:command name="btxflushsuffix" file="publ-ini.mkiv"/> + <cd:command name="btxflushsuffix" level="system" category="bibliography" file="publ-ini.mkiv"/> - <cd:command name="btxflushauthorname" file="publ-ini.mkiv"> + <cd:command name="btxflushauthorname" level="system" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-btxauthor"/> </cd:arguments> </cd:command> - <cd:command name="btxflushauthornormal" file="publ-ini.mkiv"> + <cd:command name="btxflushauthornormal" level="system" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-btxauthor"/> </cd:arguments> </cd:command> - <cd:command name="btxflushauthornormalshort" file="publ-ini.mkiv"> + <cd:command name="btxflushauthornormalshort" level="system" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-btxauthor"/> </cd:arguments> </cd:command> - <cd:command name="btxflushauthorinverted" file="publ-ini.mkiv"> + <cd:command name="btxflushauthorinverted" level="system" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-btxauthor"/> </cd:arguments> </cd:command> - <cd:command name="btxflushauthorinvertedshort" file="publ-ini.mkiv"> + <cd:command name="btxflushauthorinvertedshort" level="system" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-btxauthor"/> </cd:arguments> </cd:command> - <cd:command name="btxsingularplural" file="publ-ini.mkiv"> + <cd:command name="btxsingularplural" level="system" category="bibliography conditional" file="publ-ini.mkiv"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="editor"/> @@ -961,7 +979,7 @@ </cd:arguments> </cd:command> - <cd:command name="btxsingularorplural" file="publ-ini.mkiv"> + <cd:command name="btxsingularorplural" level="system" category="bibliography conditional" file="publ-ini.mkiv"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="editor"/> @@ -973,7 +991,7 @@ </cd:arguments> </cd:command> - <cd:command name="btxoneorrange" file="publ-ini.mkiv"> + <cd:command name="btxoneorrange" level="system" category="bibliography conditional" file="publ-ini.mkiv"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="volume"/> @@ -984,7 +1002,7 @@ </cd:arguments> </cd:command> - <cd:command name="btxfirstofrange" file="publ-ini.mkiv"> + <cd:command name="btxfirstofrange" level="system" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="volume"/> @@ -993,38 +1011,38 @@ </cd:arguments> </cd:command> - <cd:command name="btxloadjournalist" file="publ-ini.mkiv"> + <cd:command name="btxloadjournalist" level="system" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-file"/> </cd:arguments> </cd:command> - <cd:command name="btxsavejournalist" file="publ-ini.mkiv"> + <cd:command name="btxsavejournalist" level="system" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-file"/> </cd:arguments> </cd:command> - <cd:command name="btxaddjournal" file="publ-ini.mkiv"> + <cd:command name="btxaddjournal" level="system" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="btxexpandedjournal" file="publ-ini.mkiv"> + <cd:command name="btxexpandedjournal" level="system" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="btxabbreviatedjournal" file="publ-ini.mkiv"> + <cd:command name="btxabbreviatedjournal" level="system" category="bibliography" file="publ-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="showbtxdatasetfields" file="publ-tra.mkiv"> + <cd:command name="showbtxdatasetfields" level="document" category="bibliography" file="publ-tra.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="specification"> @@ -1040,13 +1058,13 @@ </cd:arguments> </cd:command> - <cd:command name="showbtxdatasetfields" variant="argument" file="publ-tra.mkiv"> + <cd:command name="showbtxdatasetfields" variant="argument" level="document" category="bibliography" file="publ-tra.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> </cd:arguments> </cd:command> - <cd:command name="showbtxdatasetcompleteness" file="publ-tra.mkiv"> + <cd:command name="showbtxdatasetcompleteness" level="document" category="bibliography" file="publ-tra.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="specification"> @@ -1062,13 +1080,13 @@ </cd:arguments> </cd:command> - <cd:command name="showbtxdatasetcompleteness" variant="argument" file="publ-tra.mkiv"> + <cd:command name="showbtxdatasetcompleteness" variant="argument" level="document" category="bibliography" file="publ-tra.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> </cd:arguments> </cd:command> - <cd:command name="showbtxdatasetauthors" file="publ-tra.mkiv"> + <cd:command name="showbtxdatasetauthors" level="document" category="bibliography" file="publ-tra.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="specification"> @@ -1084,19 +1102,19 @@ </cd:arguments> </cd:command> - <cd:command name="showbtxdatasetauthors" variant="argument" file="publ-tra.mkiv"> + <cd:command name="showbtxdatasetauthors" variant="argument" level="document" category="bibliography" file="publ-tra.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> </cd:arguments> </cd:command> - <cd:command name="showbtxhashedauthors" file="publ-tra.mkiv"> + <cd:command name="showbtxhashedauthors" level="document" category="bibliography" file="publ-tra.mkiv"> <cd:arguments> <cd:resolve name="keyword-dummy-optional"/> </cd:arguments> </cd:command> - <cd:command name="showbtxfields" file="publ-tra.mkiv"> + <cd:command name="showbtxfields" level="document" category="bibliography" file="publ-tra.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="rotation"> @@ -1109,16 +1127,16 @@ </cd:arguments> </cd:command> - <cd:command name="showbtxfields" variant="argument" file="publ-tra.mkiv"> + <cd:command name="showbtxfields" variant="argument" level="document" category="bibliography" file="publ-tra.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> </cd:arguments> </cd:command> - <cd:command name="showbtxtables" file="publ-tra.mkiv"> + <cd:command name="showbtxtables" level="document" category="bibliography" file="publ-tra.mkiv"> <cd:arguments> <cd:resolve name="keyword-dummy-optional"/> </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-random.xml b/tex/context/interface/mkiv/i-random.xml index 54dc66c5f..a1a17f669 100644 --- a/tex/context/interface/mkiv/i-random.xml +++ b/tex/context/interface/mkiv/i-random.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="getrandomcount" file="supp-ran.mkiv"> + <cd:command name="getrandomcount" level="system" file="supp-ran.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-number"/> @@ -12,7 +12,7 @@ </cd:arguments> </cd:command> - <cd:command name="getrandomdimen" file="supp-ran.mkiv"> + <cd:command name="getrandomdimen" level="system" file="supp-ran.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-dimension"/> @@ -20,7 +20,7 @@ </cd:arguments> </cd:command> - <cd:command name="getrandomnumber" file="supp-ran.mkiv"> + <cd:command name="getrandomnumber" level="system" file="supp-ran.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-number"/> @@ -28,7 +28,7 @@ </cd:arguments> </cd:command> - <cd:command name="getrandomfloat" file="supp-ran.mkiv"> + <cd:command name="getrandomfloat" level="system" file="supp-ran.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-number"/> @@ -36,29 +36,29 @@ </cd:arguments> </cd:command> - <cd:command name="setrandomseed" file="supp-ran.mkiv"> + <cd:command name="setrandomseed" level="system" file="supp-ran.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="getrandomseed" file="supp-ran.mkiv"> + <cd:command name="getrandomseed" level="system" file="supp-ran.mkiv"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="randomseed" type="environment" begin="push" end="pop" file="supp-ran.mkiv"/> + <cd:command name="randomseed" type="environment" begin="push" end="pop" level="system" file="supp-ran.mkiv"/> - <cd:command name="reuserandomseed" file="supp-ran.mkiv"/> + <cd:command name="reuserandomseed" level="system" file="supp-ran.mkiv"/> - <cd:command name="randomnumber" file="supp-ran.mkiv"> + <cd:command name="randomnumber" level="system" file="supp-ran.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="mprandomnumber" file="supp-ran.mkiv"/> + <cd:command name="mprandomnumber" level="system" file="supp-ran.mkiv"/> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-readme.pdf b/tex/context/interface/mkiv/i-readme.pdf Binary files differindex daf6f6248..14862cbb6 100644 --- a/tex/context/interface/mkiv/i-readme.pdf +++ b/tex/context/interface/mkiv/i-readme.pdf diff --git a/tex/context/interface/mkiv/i-references.xml b/tex/context/interface/mkiv/i-references.xml index e7a713796..1e3e3466d 100644 --- a/tex/context/interface/mkiv/i-references.xml +++ b/tex/context/interface/mkiv/i-references.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="setupreferencing" file="strc-ref.mkvi"> + <cd:command name="setupreferencing" level="style" category="references" file="strc-ref.mkvi"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="state"> @@ -53,40 +53,40 @@ </cd:arguments> </cd:command> - <cd:command name="textreference" file="strc-ref.mkvi"> + <cd:command name="textreference" level="document" category="references" file="strc-ref.mkvi"> <cd:arguments> <cd:resolve name="keyword-reference-list"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="pagereference" file="strc-ref.mkvi"> + <cd:command name="pagereference" level="document" category="references" file="strc-ref.mkvi"> <cd:arguments> <cd:resolve name="keyword-reference-list"/> </cd:arguments> </cd:command> - <cd:command name="reference" file="strc-ref.mkvi"> + <cd:command name="reference" level="document" category="references" file="strc-ref.mkvi"> <cd:arguments> <cd:resolve name="keyword-reference-list"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="setreference" file="strc-ref.mkvi"> + <cd:command name="setreference" level="document" category="references" file="strc-ref.mkvi"> <cd:arguments> <cd:resolve name="keyword-reference-list"/> <cd:resolve name="assignment-userdata-list"/> </cd:arguments> </cd:command> - <cd:command name="usereferenceparameter" file="strc-ref.mkvi"> + <cd:command name="usereferenceparameter" level="system" category="references" file="strc-ref.mkvi"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="boxreference" file="strc-ref.mkvi"> + <cd:command name="boxreference" level="system" category="references" file="strc-ref.mkvi"> <cd:arguments> <cd:resolve name="keyword-reference-list"/> <cd:csname/> @@ -94,21 +94,21 @@ </cd:arguments> </cd:command> - <cd:command name="hboxreference" file="strc-ref.mkvi"> + <cd:command name="hboxreference" level="system" category="references" file="strc-ref.mkvi"> <cd:arguments> <cd:resolve name="keyword-reference-list"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="vboxreference" file="strc-ref.mkvi"> + <cd:command name="vboxreference" level="system" category="references" file="strc-ref.mkvi"> <cd:arguments> <cd:resolve name="keyword-reference-list"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="contentreference" file="strc-ref.mkvi"> + <cd:command name="contentreference" level="system" category="references" file="strc-ref.mkvi"> <cd:arguments> <cd:resolve name="keyword-reference-list"/> <cd:assignments list="yes" optional="yes"> @@ -118,27 +118,27 @@ </cd:arguments> </cd:command> - <cd:command name="definereference" file="strc-ref.mkvi"> + <cd:command name="definereference" level="style" category="references" file="strc-ref.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-reference-list"/> </cd:arguments> </cd:command> - <cd:command name="resetreference" file="strc-ref.mkvi"> + <cd:command name="resetreference" level="system" category="references" file="strc-ref.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="setpagereference" file="strc-ref.mkvi"> + <cd:command name="setpagereference" level="system" category="references" file="strc-ref.mkvi"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-reference-list"/> </cd:arguments> </cd:command> - <cd:command name="doifelsereferencefound" file="strc-ref.mkvi"> + <cd:command name="doifelsereferencefound" level="system" category="references conditional" file="strc-ref.mkvi"> <cd:arguments> <cd:resolve name="argument-reference"/> <cd:resolve name="argument-true"/> @@ -146,7 +146,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifreferencefoundelse" file="strc-ref.mkvi"> + <cd:command name="doifreferencefoundelse" level="system" category="references conditional" file="strc-ref.mkvi"> <cd:arguments> <cd:resolve name="argument-reference"/> <cd:resolve name="argument-true"/> @@ -154,7 +154,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupreferenceprefix" file="strc-ref.mkvi"> + <cd:command name="setupreferenceprefix" level="style" category="references" file="strc-ref.mkvi"> <cd:arguments> <cd:keywords> <cd:resolve name="value-referenceprefix"/> @@ -162,7 +162,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupglobalreferenceprefix" file="strc-ref.mkvi"> + <cd:command name="setupglobalreferenceprefix" level="system" category="references" file="strc-ref.mkvi"> <cd:arguments> <cd:keywords> <cd:resolve name="value-referenceprefix"/> @@ -170,7 +170,7 @@ </cd:arguments> </cd:command> - <cd:command name="referenceprefix" type="environment" begin="push" end="pop" file="strc-ref.mkvi"> + <cd:command name="referenceprefix" type="environment" begin="push" end="pop" level="system" category="references" file="strc-ref.mkvi"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:resolve name="value-referenceprefix"/> @@ -178,7 +178,7 @@ </cd:arguments> </cd:command> - <cd:command name="referenceprefix" type="environment" begin="globalpush" end="globalpop" file="strc-ref.mkvi"> + <cd:command name="referenceprefix" type="environment" begin="globalpush" end="globalpop" level="system" category="references" file="strc-ref.mkvi"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:resolve name="value-referenceprefix"/> @@ -186,9 +186,9 @@ </cd:arguments> </cd:command> - <cd:command name="referenceprefix" file="strc-ref.mkvi"/> + <cd:command name="referenceprefix" level="system" category="references" file="strc-ref.mkvi"/> - <cd:command name="in" file="strc-ref.mkvi"> + <cd:command name="in" level="document" category="references" file="strc-ref.mkvi"> <cd:arguments> <cd:resolve name="argument-text-optional"/> <cd:resolve name="argument-text-optional"/> @@ -196,7 +196,7 @@ </cd:arguments> </cd:command> - <cd:command name="at" file="strc-ref.mkvi"> + <cd:command name="at" level="document" category="references" file="strc-ref.mkvi"> <cd:arguments> <cd:resolve name="argument-text-optional"/> <cd:resolve name="argument-text-optional"/> @@ -204,25 +204,25 @@ </cd:arguments> </cd:command> - <cd:command name="about" file="strc-ref.mkvi"> + <cd:command name="about" level="document" category="references" file="strc-ref.mkvi"> <cd:arguments> <cd:resolve name="keyword-reference"/> </cd:arguments> </cd:command> - <cd:command name="from" file="strc-ref.mkvi"> + <cd:command name="from" level="document" category="references" file="strc-ref.mkvi"> <cd:arguments> <cd:resolve name="keyword-reference"/> </cd:arguments> </cd:command> - <cd:command name="over" file="strc-ref.mkvi"> + <cd:command name="over" level="document" category="references" file="strc-ref.mkvi"> <cd:arguments> <cd:resolve name="keyword-reference"/> </cd:arguments> </cd:command> - <cd:command name="filterreference" file="strc-ref.mkvi"> + <cd:command name="filterreference" level="system" category="references" file="strc-ref.mkvi"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:resolve name="value-referencetype"/> @@ -230,7 +230,7 @@ </cd:arguments> </cd:command> - <cd:command name="getreferenceentry" file="strc-ref.mkvi"> + <cd:command name="getreferenceentry" level="system" category="references" file="strc-ref.mkvi"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:resolve name="value-referencetype"/> @@ -238,7 +238,7 @@ </cd:arguments> </cd:command> - <cd:command name="getreference" file="strc-ref.mkvi"> + <cd:command name="getreference" level="system" category="references" file="strc-ref.mkvi"> <cd:arguments> <cd:keywords> <cd:resolve name="value-referencetype"/> @@ -247,7 +247,7 @@ </cd:arguments> </cd:command> - <cd:command name="ref" file="strc-ref.mkvi"> + <cd:command name="ref" level="document" category="references" file="strc-ref.mkvi"> <cd:arguments> <cd:keywords> <cd:resolve name="value-referencetype"/> @@ -256,7 +256,7 @@ </cd:arguments> </cd:command> - <cd:command name="somewhere" file="strc-ref.mkvi"> + <cd:command name="somewhere" level="document" category="references" file="strc-ref.mkvi"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-text"/> @@ -264,7 +264,7 @@ </cd:arguments> </cd:command> - <cd:command name="docheckedpagestate" file="strc-ref.mkvi"> + <cd:command name="docheckedpagestate" level="system" category="references" file="strc-ref.mkvi"> <cd:arguments> <cd:resolve name="argument-reference"/> <cd:resolve name="argument-command"/> @@ -276,7 +276,7 @@ </cd:arguments> </cd:command> - <cd:command name="someplace" file="strc-ref.mkvi"> + <cd:command name="someplace" level="system" category="references" file="strc-ref.mkvi"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-text"/> @@ -287,19 +287,19 @@ </cd:arguments> </cd:command> - <cd:command name="atpage" file="strc-ref.mkvi"> + <cd:command name="atpage" level="document" category="references" file="strc-ref.mkvi"> <cd:arguments> <cd:resolve name="keyword-reference"/> </cd:arguments> </cd:command> - <cd:command name="symbolreference" file="strc-ref.mkvi"> + <cd:command name="symbolreference" level="system" category="references" file="strc-ref.mkvi"> <cd:arguments> <cd:resolve name="keyword-reference"/> </cd:arguments> </cd:command> - <cd:command name="definereferenceformat" file="strc-ref.mkvi"> + <cd:command name="definereferenceformat" level="style" category="references" file="strc-ref.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -309,7 +309,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupreferenceformat" file="strc-ref.mkvi"> + <cd:command name="setupreferenceformat" level="style" category="references" file="strc-ref.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -346,7 +346,7 @@ </cd:arguments> </cd:command> - <cd:command name="referenceformat" generated="yes" variant="example" file="strc-ref.mkvi"> + <cd:command name="referenceformat" generated="yes" variant="example" level="document" category="references" file="strc-ref.mkvi"> <cd:sequence> <cd:variable value="referenceformat"/> </cd:sequence> @@ -357,27 +357,27 @@ </cd:arguments> </cd:command> - <cd:command name="goto" file="strc-ref.mkvi"> + <cd:command name="goto" level="document" category="references" file="strc-ref.mkvi"> <cd:arguments> <cd:content/> <cd:resolve name="keyword-reference"/> </cd:arguments> </cd:command> - <cd:command name="goto" type="environment" file="strc-ref.mkvi"> + <cd:command name="goto" type="environment" level="system" category="references" file="strc-ref.mkvi"> <cd:arguments> <cd:resolve name="keyword-reference"/> </cd:arguments> </cd:command> - <cd:command name="gotobox" file="strc-ref.mkvi"> + <cd:command name="gotobox" level="system" category="references" file="strc-ref.mkvi"> <cd:arguments> <cd:content/> <cd:resolve name="keyword-reference"/> </cd:arguments> </cd:command> - <cd:command name="useurl" file="strc-ref.mkvi"> + <cd:command name="useurl" level="style" category="references" file="strc-ref.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-url"/> @@ -386,7 +386,7 @@ </cd:arguments> </cd:command> - <cd:command name="useURL" file="strc-ref.mkvi"> + <cd:command name="useURL" level="style" category="references" file="strc-ref.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-url"/> @@ -395,7 +395,7 @@ </cd:arguments> </cd:command> - <cd:command name="usefile" file="strc-ref.mkvi"> + <cd:command name="usefile" level="style" category="references" file="strc-ref.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-file"/> @@ -403,7 +403,7 @@ </cd:arguments> </cd:command> - <cd:command name="useexternaldocument" file="strc-ref.mkvi"> + <cd:command name="useexternaldocument" level="style" category="references" file="strc-ref.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-file"/> @@ -411,7 +411,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifelseurldefined" file="strc-ref.mkvi"> + <cd:command name="doifelseurldefined" level="system" category="references conditional" file="strc-ref.mkvi"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -419,7 +419,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifurldefinedelse" file="strc-ref.mkvi"> + <cd:command name="doifurldefinedelse" level="system" category="references conditional" file="strc-ref.mkvi"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -427,7 +427,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifelsefiledefined" file="strc-ref.mkvi"> + <cd:command name="doifelsefiledefined" level="system" category="references conditional" file="strc-ref.mkvi"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -435,7 +435,7 @@ </cd:arguments> </cd:command> - <cd:command name="doiffiledefinedelse" file="strc-ref.mkvi"> + <cd:command name="doiffiledefinedelse" level="system" category="references conditional" file="strc-ref.mkvi"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -443,7 +443,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupurl" file="strc-ref.mkvi"> + <cd:command name="setupurl" level="style" category="references" file="strc-ref.mkvi"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="style"> @@ -456,13 +456,13 @@ </cd:arguments> </cd:command> - <cd:command name="url" file="strc-ref.mkvi"> + <cd:command name="url" level="document" category="references" file="strc-ref.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="defineprogram" file="strc-ref.mkvi"> + <cd:command name="defineprogram" level="style" category="references" file="strc-ref.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-text"/> @@ -470,7 +470,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupprograms" file="strc-ref.mkvi"> + <cd:command name="setupprograms" level="style" category="references" file="strc-ref.mkvi"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="style"> @@ -483,27 +483,27 @@ </cd:arguments> </cd:command> - <cd:command name="program" file="strc-ref.mkvi"> + <cd:command name="program" level="document" category="references" file="strc-ref.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="definepage" file="strc-ref.mkvi"> + <cd:command name="definepage" level="system" category="references" file="strc-ref.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-reference"/> </cd:arguments> </cd:command> - <cd:command name="gotopage" file="strc-ref.mkvi"> + <cd:command name="gotopage" level="system" category="references" file="strc-ref.mkvi"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="keyword-reference"/> </cd:arguments> </cd:command> - <cd:command name="setupreferencestructureprefix" file="strc-ref.mkvi"> + <cd:command name="setupreferencestructureprefix" level="style" category="references" file="strc-ref.mkvi"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -563,4 +563,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-regime.xml b/tex/context/interface/mkiv/i-regime.xml index cd0374023..e126abb65 100644 --- a/tex/context/interface/mkiv/i-regime.xml +++ b/tex/context/interface/mkiv/i-regime.xml @@ -4,11 +4,11 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="currentregime" file="regi-ini.mkiv"/> + <cd:command name="currentregime" level="system" category="language" file="regi-ini.mkiv"/> - <cd:command name="disableregime" file="regi-ini.mkiv"/> + <cd:command name="disableregime" level="system" category="language" file="regi-ini.mkiv"/> - <cd:command name="enableregime" file="regi-ini.mkiv"> + <cd:command name="enableregime" level="style" category="language" file="regi-ini.mkiv"> <cd:arguments> <cd:keywords> <cd:constant type="cp1250"/> @@ -77,7 +77,7 @@ </cd:arguments> </cd:command> - <cd:command name="regime" type="environment" file="regi-ini.mkiv"> + <cd:command name="regime" type="environment" level="system" category="language" file="regi-ini.mkiv"> <cd:arguments> <cd:keywords> <cd:inherit name="enableregime"/> @@ -85,4 +85,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-register.xml b/tex/context/interface/mkiv/i-register.xml index e13b009ea..4d8010559 100644 --- a/tex/context/interface/mkiv/i-register.xml +++ b/tex/context/interface/mkiv/i-register.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="defineregister" file="strc-reg.mkiv"> + <cd:command name="defineregister" level="style" category="structure" file="strc-reg.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupregister" variant="argument" file="strc-reg.mkiv"> + <cd:command name="setupregister" variant="argument" level="style" category="structure" file="strc-reg.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:resolve name="keyword-number-list-optional"/> @@ -47,6 +47,7 @@ <cd:constant type="yes"/> <cd:constant type="no" default="yes"/> <cd:constant type="all"/> + <cd:constant type="packed"/> </cd:parameter> <cd:parameter name="criterium"> <cd:constant type="local"/> @@ -178,7 +179,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupregister" file="strc-reg.mkiv"> + <cd:command name="setupregister" level="style" category="structure" file="strc-reg.mkiv"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -344,7 +345,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupregisters" variant="argument" file="strc-reg.mkiv"> + <cd:command name="setupregisters" variant="argument" level="style" category="structure" file="strc-reg.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:resolve name="keyword-number-list-optional"/> @@ -354,7 +355,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupregisters" file="strc-reg.mkiv"> + <cd:command name="setupregisters" level="style" category="structure" file="strc-reg.mkiv"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:name"/> @@ -366,7 +367,7 @@ </cd:arguments> </cd:command> - <cd:command name="register" generated="yes" variant="instance" file="strc-reg.mkiv"> + <cd:command name="register" generated="yes" variant="instance" level="document" category="structure" file="strc-reg.mkiv"> <cd:sequence> <cd:instance value="register"/> </cd:sequence> @@ -382,7 +383,7 @@ </cd:instances> </cd:command> - <cd:command name="register" generated="yes" variant="instance:ownnumber" file="strc-reg.mkiv"> + <cd:command name="register" generated="yes" variant="instance:ownnumber" level="document" category="structure" file="strc-reg.mkiv"> <cd:sequence> <cd:instance value="register"/> </cd:sequence> @@ -399,7 +400,7 @@ </cd:instances> </cd:command> - <cd:command name="seeregister" generated="yes" variant="instance" file="strc-reg.mkiv"> + <cd:command name="seeregister" generated="yes" variant="instance" level="document" category="structure" file="strc-reg.mkiv"> <cd:sequence> <cd:string value="see"/> <cd:instance value="register"/> @@ -420,7 +421,7 @@ </cd:instances> </cd:command> - <cd:command name="placeregister" generated="yes" variant="instance" file="strc-reg.mkiv"> + <cd:command name="placeregister" generated="yes" variant="instance" level="document" category="structure" file="strc-reg.mkiv"> <cd:sequence> <cd:string value="place"/> <cd:instance value="register"/> @@ -435,7 +436,7 @@ </cd:instances> </cd:command> - <cd:command name="completeregister" generated="yes" variant="instance" file="strc-reg.mkiv"> + <cd:command name="completeregister" generated="yes" variant="instance" level="document" category="structure" file="strc-reg.mkiv"> <cd:sequence> <cd:string value="complete"/> <cd:instance value="register"/> @@ -450,7 +451,7 @@ </cd:instances> </cd:command> - <cd:command name="setupregister" generated="yes" variant="instance" file="strc-reg.mkiv"> + <cd:command name="setupregister" generated="yes" variant="instance" level="style" category="structure" file="strc-reg.mkiv"> <cd:sequence> <cd:string value="setup"/> <cd:instance value="register"/> @@ -468,7 +469,7 @@ <!-- - <cd:command name="index" file="strc-reg.mkiv"> + <cd:command name="index" level="document" category="structure" file="strc-reg.mkiv"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:text"/> @@ -478,7 +479,7 @@ </cd:arguments> </cd:command> - <cd:command name="index" variant="ownnumber" file="strc-reg.mkiv"> + <cd:command name="index" variant="ownnumber" level="document" category="structure" file="strc-reg.mkiv"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:text"/> @@ -489,7 +490,7 @@ </cd:arguments> </cd:command> - <cd:command name="seeindex" file="strc-reg.mkiv"> + <cd:command name="seeindex" level="document" category="structure" file="strc-reg.mkiv"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:text"/> @@ -503,7 +504,7 @@ </cd:arguments> </cd:command> - <cd:command name="placeindex" file="strc-reg.mkiv"> + <cd:command name="placeindex" level="document" category="structure" file="strc-reg.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupregister"/> @@ -511,7 +512,7 @@ </cd:arguments> </cd:command> - <cd:command name="completeindex" file="strc-reg.mkiv"> + <cd:command name="completeindex" level="document" category="structure" file="strc-reg.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupregister"/> @@ -519,7 +520,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupindex" file="strc-reg.mkiv"> + <cd:command name="setupindex" level="style" category="structure" file="strc-reg.mkiv"> <cd:arguments> <cd:resolve name="keyword-number-list-optional"/> <cd:assignments list="yes"> @@ -530,7 +531,7 @@ --> - <cd:command name="startregister" file="strc-reg.mkiv"> + <cd:command name="startregister" level="document" category="structure" file="strc-reg.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name"/> @@ -545,14 +546,14 @@ </cd:arguments> </cd:command> - <cd:command name="stopregister" file="strc-reg.mkiv"> + <cd:command name="stopregister" level="document" category="structure" file="strc-reg.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="setregisterentry" file="strc-reg.mkiv"> + <cd:command name="setregisterentry" level="document" category="structure" file="strc-reg.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="assignment-registerdata-list"/> @@ -560,7 +561,7 @@ </cd:arguments> </cd:command> - <cd:command name="finishregisterentry" file="strc-reg.mkiv"> + <cd:command name="finishregisterentry" level="document" category="structure" file="strc-reg.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes"> @@ -583,7 +584,7 @@ </cd:arguments> </cd:command> - <cd:command name="setstructurepageregister" file="strc-reg.mkiv"> + <cd:command name="setstructurepageregister" level="document" category="structure" file="strc-reg.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="assignment-registerdata-list"/> @@ -591,7 +592,7 @@ </cd:arguments> </cd:command> - <cd:command name="startstructurepageregister" file="strc-reg.mkiv"> + <cd:command name="startstructurepageregister" level="document" category="structure" file="strc-reg.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name"/> @@ -600,14 +601,14 @@ </cd:arguments> </cd:command> - <cd:command name="stopstructurepageregister" file="strc-reg.mkiv"> + <cd:command name="stopstructurepageregister" level="document" category="structure" file="strc-reg.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="determineregistercharacteristics" file="strc-reg.mkiv"> + <cd:command name="determineregistercharacteristics" level="system" category="structure" file="strc-reg.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes" optional="yes"> @@ -637,9 +638,9 @@ </cd:arguments> </cd:command> - <cd:command name="utilityregisterlength" file="strc-reg.mkiv"/> + <cd:command name="utilityregisterlength" level="system" category="structure" file="strc-reg.mkiv"/> - <cd:command name="placeregister" file="strc-reg.mkiv"> + <cd:command name="placeregister" level="document" file="strc-reg.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes" optional="yes"> @@ -648,7 +649,7 @@ </cd:arguments> </cd:command> - <cd:command name="completeregister" file="strc-reg.mkiv"> + <cd:command name="completeregister" level="document" category="structure" file="strc-reg.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes" optional="yes"> @@ -657,10 +658,10 @@ </cd:arguments> </cd:command> - <cd:command name="currentregisterpageuserdata" file="strc-reg.mkiv"> + <cd:command name="currentregisterpageuserdata" level="system" category="structure" file="strc-reg.mkiv"> <cd:arguments> <cd:resolve name="argument-key"/> </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-renderingwindow.xml b/tex/context/interface/mkiv/i-renderingwindow.xml index 219fda285..525415c70 100644 --- a/tex/context/interface/mkiv/i-renderingwindow.xml +++ b/tex/context/interface/mkiv/i-renderingwindow.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="useexternalrendering" file="scrn-wid.mkvi"> + <cd:command name="useexternalrendering" level="system" category="pdf" file="scrn-wid.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name"/> @@ -16,7 +16,7 @@ </cd:arguments> </cd:command> - <cd:command name="setinternalrendering" file="scrn-wid.mkvi"> + <cd:command name="setinternalrendering" level="system" category="pdf" file="scrn-wid.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:keywords> @@ -27,7 +27,7 @@ </cd:arguments> </cd:command> - <cd:command name="definerenderingwindow" file="scrn-wid.mkvi"> + <cd:command name="definerenderingwindow" level="style" category="pdf" file="scrn-wid.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -37,7 +37,7 @@ </cd:arguments> </cd:command> - <cd:command name="setuprenderingwindow" file="scrn-wid.mkvi"> + <cd:command name="setuprenderingwindow" level="style" category="pdf" file="scrn-wid.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -52,11 +52,11 @@ </cd:arguments> </cd:command> - <cd:command name="placerenderingwindow" file="scrn-wid.mkvi"> + <cd:command name="placerenderingwindow" level="style" category="pdf" file="scrn-wid.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-replacement.xml b/tex/context/interface/mkiv/i-replacement.xml index 95b6272e7..1cee232db 100644 --- a/tex/context/interface/mkiv/i-replacement.xml +++ b/tex/context/interface/mkiv/i-replacement.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="replaceword" file="lang-rep.mkiv"> + <cd:command name="replaceword" level="style" category="language" file="lang-rep.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-text"/> @@ -12,7 +12,7 @@ </cd:arguments> </cd:command> - <cd:command name="setreplacement" file="lang-rep.mkiv"> + <cd:command name="setreplacement" level="style" category="language" file="lang-rep.mkiv"> <cd:arguments> <cd:keywords> <cd:constant type="reset"/> @@ -21,6 +21,6 @@ </cd:arguments> </cd:command> - <cd:command name="resetreplacement" file="lang-rep.mkiv"/> + <cd:command name="resetreplacement" level="style" category="language" file="lang-rep.mkiv"/> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-rotatation.xml b/tex/context/interface/mkiv/i-rotatation.xml index 3e8eb6699..7bfb9b2de 100644 --- a/tex/context/interface/mkiv/i-rotatation.xml +++ b/tex/context/interface/mkiv/i-rotatation.xml @@ -4,13 +4,13 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="mirror" file="grph-trf.mkiv"> + <cd:command name="mirror" level="document" category="graphics" file="grph-trf.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="setuprotate" file="grph-trf.mkiv"> + <cd:command name="setuprotate" level="style" category="graphics" file="grph-trf.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="location"> @@ -34,7 +34,7 @@ </cd:arguments> </cd:command> - <cd:command name="rotate" file="grph-trf.mkiv"> + <cd:command name="rotate" level="document" category="graphics" file="grph-trf.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setuprotate"/> @@ -43,7 +43,7 @@ </cd:arguments> </cd:command> - <cd:command name="dorotatebox" file="grph-trf.mkiv"> + <cd:command name="dorotatebox" level="system" category="graphics" file="grph-trf.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> <cd:csname/> @@ -51,4 +51,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-ruby.xml b/tex/context/interface/mkiv/i-ruby.xml index 698e4f24f..10bcff22e 100644 --- a/tex/context/interface/mkiv/i-ruby.xml +++ b/tex/context/interface/mkiv/i-ruby.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="defineruby" file="typo-rub.mkiv"> + <cd:command name="defineruby" level="style" category="fonts" file="typo-rub.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupruby" file="typo-rub.mkiv"> + <cd:command name="setupruby" level="style" category="fonts" file="typo-rub.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -59,7 +59,7 @@ </cd:arguments> </cd:command> - <cd:command name="ruby" file="typo-rub.mkiv"> + <cd:command name="ruby" level="document" category="fonts" file="typo-rub.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:resolve name="argument-text"/> @@ -67,10 +67,10 @@ </cd:arguments> </cd:command> - <cd:command name="ruby" type="environment" file="typo-rub.mkiv"> + <cd:command name="ruby" type="environment" level="document" category="fonts" file="typo-rub.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-scale.xml b/tex/context/interface/mkiv/i-scale.xml index 135d6fba8..3d26ed76f 100644 --- a/tex/context/interface/mkiv/i-scale.xml +++ b/tex/context/interface/mkiv/i-scale.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definescale" file="grph-trf.mkiv"> + <cd:command name="definescale" level="style" category="graphics" file="grph-trf.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupscale" file="grph-trf.mkiv"> + <cd:command name="setupscale" level="style" category="graphics" file="grph-trf.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -93,7 +93,7 @@ </cd:arguments> </cd:command> - <cd:command name="scale" file="grph-trf.mkiv"> + <cd:command name="scale" level="document" category="graphics" file="grph-trf.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:assignments list="yes" optional="yes"> @@ -103,14 +103,14 @@ </cd:arguments> </cd:command> - <cd:command name="fastscale" file="grph-trf.mkiv"> + <cd:command name="fastscale" level="system" category="graphics" file="grph-trf.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="fastsxsy" file="grph-trf.mkiv"> + <cd:command name="fastsxsy" level="system" category="graphics" file="grph-trf.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> <cd:resolve name="argument-number"/> @@ -118,4 +118,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-scite.xml b/tex/context/interface/mkiv/i-scite.xml index e62bc9067..f04e575e0 100644 --- a/tex/context/interface/mkiv/i-scite.xml +++ b/tex/context/interface/mkiv/i-scite.xml @@ -4,19 +4,26 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="scite" type="environment" file="m-scite.mkiv"> + <cd:command name="scite" type="environment" level="document" category="verbatim" file="m-scite.mkiv"> <cd:arguments> <cd:resolve name="keyword-scite-optional"/> </cd:arguments> </cd:command> - <cd:command name="scitefile" file="m-scite.mkiv"> + <cd:command name="scitefile" level="document" category="verbatim" file="m-scite.mkiv"> <cd:arguments> <cd:resolve name="keyword-file"/> </cd:arguments> </cd:command> - <cd:command name="scitebuffer" file="m-scite.mkiv"> + <cd:command name="scitebuffer" level="document" category="verbatim" file="m-scite.mkiv"> + <cd:arguments> + <cd:resolve name="keyword-scite-optional"/> + <cd:resolve name="keyword-buffer"/> + </cd:arguments> + </cd:command> + + <cd:command name="sciteinlinebuffer" level="document" category="verbatim" file="m-scite.mkiv"> <cd:arguments> <cd:resolve name="keyword-scite-optional"/> <cd:resolve name="keyword-buffer"/> diff --git a/tex/context/interface/mkiv/i-script.xml b/tex/context/interface/mkiv/i-script.xml index 10ae6a79e..9af017492 100644 --- a/tex/context/interface/mkiv/i-script.xml +++ b/tex/context/interface/mkiv/i-script.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definescript" file="scrp-ini.mkvi"> + <cd:command name="definescript" level="style" category="language" file="scrp-ini.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupscript" file="scrp-ini.mkvi"> + <cd:command name="setupscript" level="style" category="language" file="scrp-ini.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -36,7 +36,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupscripts" file="scrp-ini.mkvi"> + <cd:command name="setupscripts" level="style" category="language" file="scrp-ini.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -45,7 +45,7 @@ </cd:arguments> </cd:command> - <cd:command name="setscript" file="scrp-ini.mkvi"> + <cd:command name="setscript" level="style" category="language" file="scrp-ini.mkvi"> <cd:arguments> <cd:keywords> <cd:constant type="hangul"/> @@ -59,9 +59,9 @@ </cd:arguments> </cd:command> - <cd:command name="resetscript" file="scrp-ini.mkvi"/> + <cd:command name="resetscript" level="system" category="language" file="scrp-ini.mkvi"/> - <cd:command name="script" type="environment" file="scrp-ini.mkvi"> + <cd:command name="script" type="environment" category="language" file="scrp-ini.mkvi"> <cd:arguments> <cd:keywords> <cd:constant type="hangul"/> @@ -75,7 +75,7 @@ </cd:arguments> </cd:command> - <cd:command name="script" generated="yes" varianet="instance" file="scrp-ini.mkvi"> + <cd:command name="script" generated="yes" variant="instance" level="document" category="language" file="scrp-ini.mkvi"> <cd:sequence> <cd:instance value="script"/> </cd:sequence> @@ -86,20 +86,20 @@ <!-- - <cd:command name="hangul" file="scrp-ini.mkvi"/> + <cd:command name="hangul" level="document" category="language" file="scrp-ini.mkvi"/> - <cd:command name="hanzi" file="scrp-ini.mkvi"/> + <cd:command name="hanzi" level="document" category="language" file="scrp-ini.mkvi"/> - <cd:command name="nihongo" file="scrp-ini.mkvi"/> + <cd:command name="nihongo" level="document" category="language" file="scrp-ini.mkvi"/> - <cd:command name="ethiopic" file="scrp-ini.mkvi"/> + <cd:command name="ethiopic" level="document" category="language" file="scrp-ini.mkvi"/> - <cd:command name="thai" file="scrp-ini.mkvi"/> + <cd:command name="thai" level="document" category="language" file="scrp-ini.mkvi"/> - <cd:command name="latin" file="scrp-ini.mkvi"/> + <cd:command name="latin" level="document" category="language" file="scrp-ini.mkvi"/> - <cd:command name="test" file="scrp-ini.mkvi"/> + <cd:command name="test" level="document" category="language" file="scrp-ini.mkvi"/> --> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-section.xml b/tex/context/interface/mkiv/i-section.xml index bcdc836af..f3cf13d3e 100644 --- a/tex/context/interface/mkiv/i-section.xml +++ b/tex/context/interface/mkiv/i-section.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definehead" file="strc-sec.mkiv"> + <cd:command name="definehead" level="style" category="structure" file="strc-sec.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-section-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setuphead" file="strc-sec.mkiv"> + <cd:command name="setuphead" level="style" category="structure" file="strc-sec.mkiv"> <cd:arguments> <cd:resolve name="keyword-section-list-optional"/> <cd:assignments list="yes"> @@ -112,6 +112,7 @@ <cd:constant type="no"/> <cd:constant type="hidden"/> <cd:constant type="empty"/> + <cd:constant type="section"/> </cd:parameter> <cd:parameter name="number"> <cd:constant type="yes" default="yes"/> @@ -200,10 +201,6 @@ <cd:constant type="margintext"/> <cd:constant type="cd:name"/> </cd:parameter> - <cd:parameter name="location"> - <!-- optional margin location --> - <cd:constant type="cd:name"/> - </cd:parameter> <cd:parameter name="width"> <cd:constant type="cd:dimension"/> </cd:parameter> @@ -240,11 +237,20 @@ <cd:parameter name="deepnumbercommand"> <cd:constant type="cd:oneargument"/> </cd:parameter> + <cd:parameter name="location"> + <!-- optional margin location --> + <cd:constant type="cd:name"/> + </cd:parameter> + <cd:parameter name="criterium"> + <cd:constant type="strict"/> + <cd:constant type="positive"/> + <cd:constant type="all"/> + </cd:parameter> </cd:assignments> </cd:arguments> </cd:command> - <cd:command name="setupheads" file="strc-sec.mkiv"> + <cd:command name="setupheads" level="style" category="structure" file="strc-sec.mkiv"> <cd:arguments> <cd:resolve name="keyword-section-list-optional"/> <cd:assignments list="yes"> @@ -253,7 +259,7 @@ </cd:arguments> </cd:command> - <cd:command name="section" generated="yes" variant="instance" file="strc-sec.mkiv"> + <cd:command name="section" generated="yes" variant="instance" level="document" category="structure" file="strc-sec.mkiv"> <cd:sequence> <cd:instance value="section"/> </cd:sequence> @@ -266,7 +272,7 @@ </cd:instances> </cd:command> - <cd:command name="section" generated="yes" variant="instance:ownnumber" file="strc-sec.mkiv"> + <cd:command name="section" generated="yes" variant="instance:ownnumber" level="document" category="structure" file="strc-sec.mkiv"> <cd:sequence> <cd:instance value="section"/> </cd:sequence> @@ -280,7 +286,7 @@ </cd:instances> </cd:command> - <cd:command name="section" generated="yes" variant="instance:assignment" file="strc-sec.mkiv"> + <cd:command name="section" generated="yes" variant="instance:assignment" level="document" category="structure" file="strc-sec.mkiv"> <cd:sequence> <cd:instance value="section"/> </cd:sequence> @@ -292,7 +298,7 @@ </cd:instances> </cd:command> - <cd:command name="section" type="environment" generated="yes" variant="instance" file="strc-sec.mkiv"> + <cd:command name="section" type="environment" generated="yes" variant="instance" level="document" category="structure" file="strc-sec.mkiv"> <cd:sequence> <cd:instance value="section"/> </cd:sequence> @@ -305,193 +311,7 @@ </cd:instances> </cd:command> - <!-- - - <cd:command name="part" file="strc-sec.mkiv"> - <cd:arguments> - <cd:resolve name="keyword-reference-list-optional"/> - <cd:resolve name="argument-text"/> - </cd:arguments> - </cd:command> - - <cd:command name="chapter" file="strc-sec.mkiv"> - <cd:arguments> - <cd:resolve name="keyword-reference-list-optional"/> - <cd:resolve name="argument-text"/> - </cd:arguments> - </cd:command> - - <cd:command name="section" file="strc-sec.mkiv"> - <cd:arguments> - <cd:resolve name="keyword-reference-list-optional"/> - <cd:resolve name="argument-text"/> - </cd:arguments> - </cd:command> - - <cd:command name="subsection" file="strc-sec.mkiv"> - <cd:arguments> - <cd:resolve name="keyword-reference-list-optional"/> - <cd:resolve name="argument-text"/> - </cd:arguments> - </cd:command> - - <cd:command name="subsubsection" file="strc-sec.mkiv"> - <cd:arguments> - <cd:resolve name="keyword-reference-list-optional"/> - <cd:resolve name="argument-text"/> - </cd:arguments> - </cd:command> - - <cd:command name="subsubsubsection" file="strc-sec.mkiv"> - <cd:arguments> - <cd:resolve name="keyword-reference-list-optional"/> - <cd:resolve name="argument-text"/> - </cd:arguments> - </cd:command> - - <cd:command name="subsubsubsubsection" file="strc-sec.mkiv"> - <cd:arguments> - <cd:resolve name="keyword-reference-list-optional"/> - <cd:resolve name="argument-text"/> - </cd:arguments> - </cd:command> - - <cd:command name="title" file="strc-sec.mkiv"> - <cd:arguments> - <cd:resolve name="keyword-reference-list-optional"/> - <cd:resolve name="argument-text"/> - </cd:arguments> - </cd:command> - - <cd:command name="subject" file="strc-sec.mkiv"> - <cd:arguments> - <cd:resolve name="keyword-reference-list-optional"/> - <cd:resolve name="argument-text"/> - </cd:arguments> - </cd:command> - - <cd:command name="subsubject" file="strc-sec.mkiv"> - <cd:arguments> - <cd:resolve name="keyword-reference-list-optional"/> - <cd:resolve name="argument-text"/> - </cd:arguments> - </cd:command> - - <cd:command name="subsubsubject" file="strc-sec.mkiv"> - <cd:arguments> - <cd:resolve name="keyword-reference-list-optional"/> - <cd:resolve name="argument-text"/> - </cd:arguments> - </cd:command> - - <cd:command name="subsubsubsubject" file="strc-sec.mkiv"> - <cd:arguments> - <cd:resolve name="keyword-reference-list-optional"/> - <cd:resolve name="argument-text"/> - </cd:arguments> - </cd:command> - - <cd:command name="subsubsubsubsubject" file="strc-sec.mkiv"> - <cd:arguments> - <cd:resolve name="keyword-reference-list-optional"/> - <cd:resolve name="argument-text"/> - </cd:arguments> - </cd:command> - - <cd:command name="part" type="environment" file="strc-sec.mkiv"> - <cd:arguments> - <cd:resolve name="assignment-sectiondata-list-optional"/> - <cd:resolve name="assignment-userdata-list-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="chapter" type="environment" file="strc-sec.mkiv"> - <cd:arguments> - <cd:resolve name="assignment-sectiondata-list-optional"/> - <cd:resolve name="assignment-userdata-list-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="section" type="environment" file="strc-sec.mkiv"> - <cd:arguments> - <cd:resolve name="assignment-sectiondata-list-optional"/> - <cd:resolve name="assignment-userdata-list-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="subsection" type="environment" file="strc-sec.mkiv"> - <cd:arguments> - <cd:resolve name="assignment-sectiondata-list-optional"/> - <cd:resolve name="assignment-userdata-list-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="subsubsection" type="environment" file="strc-sec.mkiv"> - <cd:arguments> - <cd:resolve name="assignment-sectiondata-list-optional"/> - <cd:resolve name="assignment-userdata-list-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="subsubsubsection" type="environment" file="strc-sec.mkiv"> - <cd:arguments> - <cd:resolve name="assignment-sectiondata-list-optional"/> - <cd:resolve name="assignment-userdata-list-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="subsubsubsubsection" type="environment" file="strc-sec.mkiv"> - <cd:arguments> - <cd:resolve name="assignment-sectiondata-list-optional"/> - <cd:resolve name="assignment-userdata-list-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="title" type="environment" file="strc-sec.mkiv"> - <cd:arguments> - <cd:resolve name="assignment-sectiondata-list-optional"/> - <cd:resolve name="assignment-userdata-list-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="subject" type="environment" file="strc-sec.mkiv"> - <cd:arguments> - <cd:resolve name="assignment-sectiondata-list-optional"/> - <cd:resolve name="assignment-userdata-list-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="subsubject" type="environment" file="strc-sec.mkiv"> - <cd:arguments> - <cd:resolve name="assignment-sectiondata-list-optional"/> - <cd:resolve name="assignment-userdata-list-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="subsubsubject" type="environment" file="strc-sec.mkiv"> - <cd:arguments> - <cd:resolve name="assignment-sectiondata-list-optional"/> - <cd:resolve name="assignment-userdata-list-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="subsubsubsubject" type="environment" file="strc-sec.mkiv"> - <cd:arguments> - <cd:resolve name="assignment-sectiondata-list-optional"/> - <cd:resolve name="assignment-userdata-list-optional"/> - </cd:arguments> - </cd:command> - - <cd:command name="subsubsubsubsubject" type="environment" file="strc-sec.mkiv"> - <cd:arguments> - <cd:resolve name="assignment-sectiondata-list-optional"/> - <cd:resolve name="assignment-userdata-list-optional"/> - </cd:arguments> - </cd:command> - - --> - - <cd:command name="namedsection" type="environment" file="strc-sec.mkiv"> + <cd:command name="namedsection" type="environment" level="document" category="structure" file="strc-sec.mkiv"> <cd:arguments> <cd:resolve name="keyword-section"/> <cd:resolve name="assignment-sectiondata-list-optional"/> @@ -499,25 +319,25 @@ </cd:arguments> </cd:command> - <cd:command name="definesection" file="strc-sec.mkiv"> + <cd:command name="definesection" level="system" category="structure" file="strc-sec.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="placeheadtext" file="strc-sec.mkiv"> + <cd:command name="placeheadtext" level="system" category="structure" file="strc-sec.mkiv"> <cd:arguments> <cd:resolve name="keyword-section"/> </cd:arguments> </cd:command> - <cd:command name="placeheadnumber" file="strc-sec.mkiv"> + <cd:command name="placeheadnumber" level="system" category="structure" file="strc-sec.mkiv"> <cd:arguments> <cd:resolve name="keyword-section"/> </cd:arguments> </cd:command> - <cd:command name="setupheadnumber" file="strc-sec.mkiv"> + <cd:command name="setupheadnumber" level="style" category="structure" file="strc-sec.mkiv"> <cd:arguments> <cd:resolve name="keyword-section"/> <cd:keywords> @@ -526,21 +346,21 @@ </cd:arguments> </cd:command> - <cd:command name="determineheadnumber" file="strc-sec.mkiv"> + <cd:command name="determineheadnumber" level="system" category="structure" file="strc-sec.mkiv"> <cd:arguments> <cd:resolve name="keyword-section"/> </cd:arguments> </cd:command> - <cd:command name="currentheadnumber" file="strc-sec.mkiv"/> + <cd:command name="currentheadnumber" level="system" category="structure" file="strc-sec.mkiv"/> - <cd:command name="namedheadnumber" file="strc-sec.mkiv"> + <cd:command name="namedheadnumber" level="system" category="structure" file="strc-sec.mkiv"> <cd:arguments> <cd:resolve name="argument-section"/> </cd:arguments> </cd:command> - <cd:command name="somenamedheadnumber" file="strc-sec.mkiv"> + <cd:command name="somenamedheadnumber" level="system" category="structure" file="strc-sec.mkiv"> <cd:arguments> <cd:resolve name="argument-section"/> <cd:keywords delimiters="braces"> @@ -553,7 +373,7 @@ </cd:arguments> </cd:command> - <cd:command name="headnumber" file="strc-sec.mkiv"> + <cd:command name="headnumber" level="system" category="structure" file="strc-sec.mkiv"> <cd:arguments> <cd:resolve name="keyword-section"/> <cd:keywords optional="yes"> @@ -566,7 +386,7 @@ </cd:arguments> </cd:command> - <cd:command name="someheadnumber" file="strc-sec.mkiv"> + <cd:command name="someheadnumber" level="system" category="structure" file="strc-sec.mkiv"> <cd:arguments> <cd:resolve name="keyword-section"/> <cd:keywords> @@ -579,50 +399,50 @@ </cd:arguments> </cd:command> - <cd:command name="namedstructureheadlocation" file="strc-sec.mkiv"> + <cd:command name="namedstructureheadlocation" level="system" category="structure" file="strc-sec.mkiv"> <cd:arguments> <cd:resolve name="argument-section"/> </cd:arguments> </cd:command> - <cd:command name="structurenumber" file="strc-sec.mkiv"/> + <cd:command name="structurenumber" level="system" category="structure" file="strc-sec.mkiv"/> - <cd:command name="structuretitle" file="strc-sec.mkiv"/> + <cd:command name="structuretitle" level="system" category="structure" file="strc-sec.mkiv"/> - <cd:command name="structurevariable" file="strc-sec.mkiv"> + <cd:command name="structurevariable" level="system" category="structure" file="strc-sec.mkiv"> <cd:arguments> <cd:resolve name="argument-key"/> </cd:arguments> </cd:command> - <cd:command name="structureuservariable" file="strc-sec.mkiv"> + <cd:command name="structureuservariable" level="system" category="structure" file="strc-sec.mkiv"> <cd:arguments> <cd:resolve name="argument-key"/> </cd:arguments> </cd:command> - <cd:command name="namedstructurevariable" file="strc-sec.mkiv"> + <cd:command name="namedstructurevariable" level="system" category="structure" file="strc-sec.mkiv"> <cd:arguments> <cd:resolve name="argument-section"/> <cd:resolve name="argument-key"/> </cd:arguments> </cd:command> - <cd:command name="namedstructureuservariable" file="strc-sec.mkiv"> + <cd:command name="namedstructureuservariable" level="system" category="structure" file="strc-sec.mkiv"> <cd:arguments> <cd:resolve name="argument-section"/> <cd:resolve name="argument-key"/> </cd:arguments> </cd:command> - <cd:command name="definesectionlevels" file="strc-lev.mkvi"> + <cd:command name="definesectionlevels" level="style" category="structure" file="strc-lev.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-section-list"/> </cd:arguments> </cd:command> - <cd:command name="sectionlevel" type="environment" file="strc-lev.mkvi"> + <cd:command name="sectionlevel" type="environment" level="document" category="structure" file="strc-lev.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:resolve name="assignment-sectiondata-list-optional"/> @@ -630,7 +450,7 @@ </cd:arguments> </cd:command> - <cd:command name="subjectlevel" type="environment" file="strc-lev.mkvi"> + <cd:command name="subjectlevel" type="environment" level="document" category="structure" file="strc-lev.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:resolve name="assignment-sectiondata-list-optional"/> @@ -638,7 +458,7 @@ </cd:arguments> </cd:command> - <cd:command name="defineheadalternative" file="strc-ren.mkiv"> + <cd:command name="defineheadalternative" level="style" category="structure" file="strc-ren.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -648,7 +468,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupheadalternative" file="strc-ren.mkiv"> + <cd:command name="setupheadalternative" level="style" category="structure" file="strc-ren.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -664,38 +484,38 @@ </cd:arguments> </cd:command> - <cd:command name="localheadsetup" type="environment" file="strc-ren.mkiv"/> + <cd:command name="localheadsetup" type="environment" level="system" category="structure" file="strc-ren.mkiv"/> - <cd:command name="headhbox" file="strc-ren.mkiv"> + <cd:command name="headhbox" level="system" category="structure" file="strc-ren.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="headvbox" file="strc-ren.mkiv"> + <cd:command name="headvbox" level="system" category="structure" file="strc-ren.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="headreferenceattributes" file="strc-ren.mkiv"/> + <cd:command name="headreferenceattributes" level="system" category="structure" file="strc-ren.mkiv"/> - <cd:command name="headnumbercontent" file="strc-ren.mkiv"/> + <cd:command name="headnumbercontent" level="system" category="structure" file="strc-ren.mkiv"/> - <cd:command name="headtextcontent" file="strc-ren.mkiv"/> + <cd:command name="headtextcontent" level="system" category="structure" file="strc-ren.mkiv"/> - <cd:command name="headwidth" file="strc-ren.mkiv"/> + <cd:command name="headwidth" level="system" category="structure" file="strc-ren.mkiv"/> - <cd:command name="headtextwidth" file="strc-ren.mkiv"/> + <cd:command name="headtextwidth" level="system" category="structure" file="strc-ren.mkiv"/> - <cd:command name="headnumberwidth" file="strc-ren.mkiv"/> + <cd:command name="headnumberwidth" level="system" category="structure" file="strc-ren.mkiv"/> - <cd:command name="headnumberdistance" file="strc-ren.mkiv"/> + <cd:command name="headnumberdistance" level="system" category="structure" file="strc-ren.mkiv"/> - <cd:command name="headtextdistance" file="strc-ren.mkiv"/> + <cd:command name="headtextdistance" level="system" category="structure" file="strc-ren.mkiv"/> - <cd:command name="headsetupspacing" file="strc-ren.mkiv"/> + <cd:command name="headsetupspacing" level="system" category="structure" file="strc-ren.mkiv"/> </cd:interface> diff --git a/tex/context/interface/mkiv/i-sectionblock.xml b/tex/context/interface/mkiv/i-sectionblock.xml index d6fc97ee0..1cb2debde 100644 --- a/tex/context/interface/mkiv/i-sectionblock.xml +++ b/tex/context/interface/mkiv/i-sectionblock.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definesectionblock" file="strc-sbe.mkiv"> + <cd:command name="definesectionblock" level="style" category="structure" file="strc-sbe.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupsectionblock" file="strc-sbe.mkiv"> + <cd:command name="setupsectionblock" level="style" category="structure" file="strc-sbe.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -35,7 +35,7 @@ </cd:arguments> </cd:command> - <cd:command name="setsectionblock" file="strc-sbe.mkiv"> + <cd:command name="setsectionblock" level="system" category="structure" file="strc-sbe.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes" optional="yes"> @@ -46,7 +46,7 @@ </cd:arguments> </cd:command> - <cd:command name="sectionblock" type="environment" file="strc-sbe.mkiv"> + <cd:command name="sectionblock" type="environment" level="document" category="structure" file="strc-sbe.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes" optional="yes"> @@ -58,7 +58,7 @@ </cd:arguments> </cd:command> - <cd:command name="sectionblock" type="environment" generated="yes" variant="instance" file="strc-sbe.mkiv"> + <cd:command name="sectionblock" type="environment" generated="yes" variant="instance" level="document" category="structure" file="strc-sbe.mkiv"> <cd:sequence> <cd:instance value="sectionblock"/> </cd:sequence> @@ -75,7 +75,7 @@ </cd:instances> </cd:command> - <cd:command name="sectionblockenvironment" type="environment" file="strc-sbe.mkiv"> + <cd:command name="sectionblockenvironment" type="environment" level="style" category="structure" file="strc-sbe.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> @@ -83,7 +83,7 @@ <!-- - <cd:command name="frontmatter" type="environment" file="strc-sbe.mkiv"> + <cd:command name="frontmatter" type="environment" level="document" category="structure" file="strc-sbe.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="bookmark"> @@ -94,7 +94,7 @@ </cd:arguments> </cd:command> - <cd:command name="bodymatter" type="environment" file="strc-sbe.mkiv"> + <cd:command name="bodymatter" type="environment" level="document" category="structure" file="strc-sbe.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="bookmark"> @@ -105,7 +105,7 @@ </cd:arguments> </cd:command> - <cd:command name="appendices" type="environment" file="strc-sbe.mkiv"> + <cd:command name="appendices" type="environment" level="document" category="structure" file="strc-sbe.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="bookmark"> @@ -116,7 +116,7 @@ </cd:arguments> </cd:command> - <cd:command name="backmatter" type="environment" file="strc-sbe.mkiv"> + <cd:command name="backmatter" type="environment" level="document" category="structure" file="strc-sbe.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="bookmark"> @@ -129,4 +129,4 @@ --> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-selector.xml b/tex/context/interface/mkiv/i-selector.xml index e593e9117..44970669b 100644 --- a/tex/context/interface/mkiv/i-selector.xml +++ b/tex/context/interface/mkiv/i-selector.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="defineselector" file="core-env.mkiv"> + <cd:command name="defineselector" level="style" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes" optional="yes"> @@ -13,7 +13,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupselector" file="core-env.mkiv"> + <cd:command name="setupselector" level="style" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes"> @@ -27,7 +27,7 @@ </cd:arguments> </cd:command> - <cd:command name="select" file="core-env.mkiv"> + <cd:command name="select" level="document" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:content optional="yes"/> @@ -38,7 +38,7 @@ </cd:arguments> </cd:command> - <cd:command name="directselect" file="core-env.mkiv"> + <cd:command name="directselect" level="system" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:content optional="yes"/> @@ -49,4 +49,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-setup.xml b/tex/context/interface/mkiv/i-setup.xml index 4771230eb..a4420bfcf 100644 --- a/tex/context/interface/mkiv/i-setup.xml +++ b/tex/context/interface/mkiv/i-setup.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="setupsetup" file="x-setups-basics.mkiv"> + <cd:command name="setupsetup" level="style" file="x-setups-basics.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="criterium"> @@ -19,124 +19,149 @@ </cd:arguments> </cd:command> - <cd:command name="basicsetup" file="x-setups-basics.mkiv"> + <cd:command name="basicsetup" level="system" file="x-setups-basics.mkiv"> <cd:arguments> <cd:resolve name="keyword-text"/> </cd:arguments> </cd:command> - <cd:command name="basicsetup" variant="argument" file="x-setups-basics.mkiv"> + <cd:command name="basicsetup" variant="argument" level="system" file="x-setups-basics.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="shortsetup" file="x-setups-basics.mkiv"> + <cd:command name="shortsetup" level="system" file="x-setups-basics.mkiv"> <cd:arguments> <cd:resolve name="keyword-text"/> </cd:arguments> </cd:command> - <cd:command name="shortsetup" variant="argument" file="x-setups-basics.mkiv"> + <cd:command name="shortsetup" variant="argument" level="system" file="x-setups-basics.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="setup" file="x-setups-basics.mkiv"> + <cd:command name="setup" level="system" file="x-setups-basics.mkiv"> <cd:arguments> <cd:resolve name="keyword-text"/> </cd:arguments> </cd:command> - <cd:command name="setup" variant="argument" file="x-setups-basics.mkiv"> + <cd:command name="setup" variant="argument" level="system" file="x-setups-basics.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="showsetup" file="x-setups-basics.mkiv"> + <cd:command name="showsetup" level="system" file="x-setups-basics.mkiv"> <cd:arguments> <cd:resolve name="keyword-text"/> </cd:arguments> </cd:command> - <cd:command name="showsetup" variant="argument" file="x-setups-basics.mkiv"> + <cd:command name="showsetup" variant="argument" level="system" file="x-setups-basics.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="cmdinternal" file="x-setups-basics.mkiv"> + <cd:command name="placesetup" level="document" file="x-setups-basics.mkiv"/> + + <cd:command name="placeallsetups" level="document" file="x-setups-basics.mkiv"/> + + <cd:command name="placeeverysetup" level="document" file="x-setups-basics.mkiv"/> + + <cd:command name="showrootvalues" level="document" file="x-setups-basics.mkiv"> + <cd:arguments> + <cd:resolve name="keyword-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="showinstancevalues" level="document" file="x-setups-basics.mkiv"> + <cd:arguments> + <cd:resolve name="keyword-text"/> + <cd:resolve name="keyword-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="cmdinternal" level="document" file="x-setups-basics.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="cmdbasicsetup" file="x-setups-basics.mkiv"> + <cd:command name="cmdbasicsetup" level="document" file="x-setups-basics.mkiv"> <cd:arguments> <cd:resolve name="keyword-text"/> </cd:arguments> </cd:command> - <cd:command name="cmdbasicsetup" variant="argument" file="x-setups-basics.mkiv"> + <cd:command name="cmdbasicsetup" variant="argument" level="document" file="x-setups-basics.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="cmdshortsetup" file="x-setups-basics.mkiv"> + <cd:command name="cmdshortsetup" level="document" file="x-setups-basics.mkiv"> <cd:arguments> <cd:resolve name="keyword-text"/> </cd:arguments> </cd:command> - <cd:command name="cmdshortsetup" variant="argument" file="x-setups-basics.mkiv"> + <cd:command name="cmdshortsetup" variant="argument" level="document" file="x-setups-basics.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="cmdfullsetup" file="x-setups-basics.mkiv"> + <cd:command name="cmdfullsetup" level="document" file="x-setups-basics.mkiv"> <cd:arguments> <cd:resolve name="keyword-text"/> </cd:arguments> </cd:command> - <cd:command name="cmdfullsetup" variant="argument" file="x-setups-basics.mkiv"> + <cd:command name="cmdfullsetup" variant="argument" level="document" file="x-setups-basics.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="cmdbasicsetupinstance" file="x-setups-basics.mkiv"> + <cd:command name="cmdbasicsetupinstance" level="document" file="x-setups-basics.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="cmdshortsetupinstance" file="x-setups-basics.mkiv"> + <cd:command name="cmdshortsetupinstance" level="document" file="x-setups-basics.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="cmdfullsetupinstance" file="x-setups-basics.mkiv"> + <cd:command name="cmdfullsetupinstance" level="document" file="x-setups-basics.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="showdefinition" file="x-setups-basics.mkiv"> + <cd:command name="showdefinition" level="document" file="x-setups-basics.mkiv"> <cd:arguments> <cd:resolve name="keyword-text"/> </cd:arguments> </cd:command> - <cd:command name="definition" file="x-setups-basics.mkiv"> + <cd:command name="showdefinition" variant="argument" level="document" file="x-setups-basics.mkiv"> + <cd:arguments> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="definition" level="document" file="x-setups-basics.mkiv"> <cd:arguments> <cd:resolve name="keyword-text-list"/> </cd:arguments> diff --git a/tex/context/interface/mkiv/i-setups.xml b/tex/context/interface/mkiv/i-setups.xml index d6b7b4d5a..df7281e74 100644 --- a/tex/context/interface/mkiv/i-setups.xml +++ b/tex/context/interface/mkiv/i-setups.xml @@ -4,119 +4,119 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="setups" file="core-env.mkiv"> + <cd:command name="setups" level="style" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list"/> </cd:arguments> </cd:command> - <cd:command name="setups" variant="direct" file="core-env.mkiv"> + <cd:command name="setups" variant="direct" level="style" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="argument-name-list"/> </cd:arguments> </cd:command> - <cd:command name="setup" file="core-env.mkiv"> + <cd:command name="setup" level="style" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="setup" variant="direct" file="core-env.mkiv"> + <cd:command name="setup" variant="direct" level="style" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="directsetup" file="core-env.mkiv"> + <cd:command name="directsetup" level="style" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="fastsetup" file="core-env.mkiv"> + <cd:command name="fastsetup" level="style" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="texsetup" file="core-env.mkiv"> + <cd:command name="texsetup" level="style" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="luasetup" file="core-env.mkiv"> + <cd:command name="luasetup" level="style" category="lua" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="systemsetups" file="core-env.mkiv"> + <cd:command name="systemsetups" level="system" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="resetsetups" file="core-env.mkiv"> + <cd:command name="resetsetups" level="system" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="showsetupsdefinition" file="core-env.mkiv"> + <cd:command name="showsetupsdefinition" level="system" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="setupwithargument" file="core-env.mkiv"> + <cd:command name="setupwithargument" level="system" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="fastsetupwithargument" file="core-env.mkiv"> + <cd:command name="fastsetupwithargument" level="system" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="setupwithargumentswapped" file="core-env.mkiv"> + <cd:command name="setupwithargumentswapped" level="system" file="core-env.mkiv"> <cd:arguments> <cd:content/> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="fastsetupwithargumentswapped" file="core-env.mkiv"> + <cd:command name="fastsetupwithargumentswapped" level="system" file="core-env.mkiv"> <cd:arguments> <cd:content/> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="usesetupsparameter" file="core-env.mkiv"> + <cd:command name="usesetupsparameter" level="system" file="core-env.mkiv"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="autosetups" file="core-env.mkiv"> + <cd:command name="autosetups" level="style" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="argument-name-list"/> </cd:arguments> </cd:command> - <cd:command name="doprocesslocalsetups" file="core-env.mkiv"> + <cd:command name="doprocesslocalsetups" level="system" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="argument-name-list"/> </cd:arguments> </cd:command> - <cd:command name="doifelsesetups" file="core-env.mkiv"> + <cd:command name="doifelsesetups" level="system" category="conditional" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -124,7 +124,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifsetupselse" file="core-env.mkiv"> + <cd:command name="doifsetupselse" level="system" category="conditional" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -132,21 +132,21 @@ </cd:arguments> </cd:command> - <cd:command name="doifsetups" file="core-env.mkiv"> + <cd:command name="doifsetups" level="system" category="conditional" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> </cd:arguments> </cd:command> - <cd:command name="doifnotsetups" file="core-env.mkiv"> + <cd:command name="doifnotsetups" level="system" category="conditional" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> </cd:arguments> </cd:command> - <cd:command name="luasetups" type="environment" file="core-env.mkiv"> + <cd:command name="luasetups" type="environment" level="system" category="lua" file="core-env.mkiv"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="grid"/> @@ -155,13 +155,13 @@ </cd:arguments> </cd:command> - <cd:command name="luasetups" type="environment" variant="string" file="core-env.mkiv"> + <cd:command name="luasetups" type="environment" variant="string" level="system" category="lua" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="string-name"/> </cd:arguments> </cd:command> - <cd:command name="xmlsetups" type="environment" file="core-env.mkiv"> + <cd:command name="xmlsetups" type="environment" level="style" category="xml" file="core-env.mkiv"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="grid"/> @@ -170,13 +170,13 @@ </cd:arguments> </cd:command> - <cd:command name="xmlsetups" type="environment" variant="string" file="core-env.mkiv"> + <cd:command name="xmlsetups" type="environment" variant="string" level="style" category="xml" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="string-name"/> </cd:arguments> </cd:command> - <cd:command name="rawsetups" type="environment" file="core-env.mkiv"> + <cd:command name="rawsetups" type="environment" level="system" file="core-env.mkiv"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="grid"/> @@ -185,13 +185,13 @@ </cd:arguments> </cd:command> - <cd:command name="rawsetups" type="environment" variant="string" file="core-env.mkiv"> + <cd:command name="rawsetups" type="environment" variant="string" level="system" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="string-name"/> </cd:arguments> </cd:command> - <cd:command name="localsetups" type="environment" file="core-env.mkiv"> + <cd:command name="localsetups" type="environment" level="style" file="core-env.mkiv"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="grid"/> @@ -200,13 +200,13 @@ </cd:arguments> </cd:command> - <cd:command name="localsetups" type="environment" variant="string" file="core-env.mkiv"> + <cd:command name="localsetups" type="environment" variant="string" level="style" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="string-name"/> </cd:arguments> </cd:command> - <cd:command name="setups" type="environment" file="core-env.mkiv"> + <cd:command name="setups" type="environment" level="style" file="core-env.mkiv"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="grid"/> @@ -215,10 +215,10 @@ </cd:arguments> </cd:command> - <cd:command name="setups" type="environment" variant="string" file="core-env.mkiv"> + <cd:command name="setups" type="environment" variant="string" level="style" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="string-name"/> </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-shift.xml b/tex/context/interface/mkiv/i-shift.xml index 792a8d84f..521317d1d 100644 --- a/tex/context/interface/mkiv/i-shift.xml +++ b/tex/context/interface/mkiv/i-shift.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="defineshift" file="node.rul.mkiv"> + <cd:command name="defineshift" level="style" category="layout" file="node.rul.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupshift" file="node-rul.mkiv"> + <cd:command name="setupshift" level="style" category="layout" file="node-rul.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -55,7 +55,7 @@ </cd:arguments> </cd:command> - <cd:command name="shift" generated="yes" variant="instance" file="node-rul.mkiv"> + <cd:command name="shift" generated="yes" variant="instance" level="document" category="layout" file="node-rul.mkiv"> <cd:sequence> <cd:instance value="shift"/> </cd:sequence> @@ -67,7 +67,7 @@ </cd:instances> </cd:command> - <cd:command name="shift" type="environment" file="node-rul.mkiv"> + <cd:command name="shift" type="environment" level="document" category="layout" file="node-rul.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> @@ -75,13 +75,13 @@ <!-- - <cd:command name="shiftup" file="node-rul.mkiv"> + <cd:command name="shiftup" level="document" category="layout" file="node-rul.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="shiftdown" file="node-rul.mkiv"> + <cd:command name="shiftdown" level="document" category="layout" file="node-rul.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> @@ -89,4 +89,4 @@ --> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-sidebar.xml b/tex/context/interface/mkiv/i-sidebar.xml index 25a7ed306..7518b5c61 100644 --- a/tex/context/interface/mkiv/i-sidebar.xml +++ b/tex/context/interface/mkiv/i-sidebar.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definesidebar" file="anch-bar.mkiv"> + <cd:command name="definesidebar" level="style" category="rules" file="anch-bar.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupsidebar" file="anch-bar.mkiv"> + <cd:command name="setupsidebar" level="style" category="rules" file="anch-bar.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -48,7 +48,7 @@ <!-- - <cd:command name="setupsidebars" file="anch-bar.mkiv"> + <cd:command name="setupsidebars" level="style" category="rules" file="anch-bar.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -59,7 +59,7 @@ --> - <cd:command name="sidebar" type="environment" file="anch-bar.mkiv"> + <cd:command name="sidebar" type="environment" level="document" category="rules" file="anch-bar.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:assignments list="yes" optional="yes"> @@ -68,7 +68,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupmarginrule" file="anch-bar.mkiv"> + <cd:command name="setupmarginrule" level="style" category="rules" file="anch-bar.mkiv"> <cd:arguments> <cd:resolve name="keyword-number-optional"/> <cd:assignments list="yes"> @@ -77,7 +77,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupmarginrules" file="anch-bar.mkiv"> + <cd:command name="setupmarginrules" level="style" category="rules" file="anch-bar.mkiv"> <cd:arguments> <cd:resolve name="keyword-number-optional"/> <cd:assignments list="yes"> @@ -86,13 +86,13 @@ </cd:arguments> </cd:command> - <cd:command name="marginrule" type="environment" file="anch-bar.mkiv"> + <cd:command name="marginrule" type="environment" level="document" category="rules" file="anch-bar.mkiv"> <cd:arguments> <cd:resolve name="keyword-number-optional"/> </cd:arguments> </cd:command> - <cd:command name="marginrule" type="environment" variant="assignment" file="anch-bar.mkiv"> + <cd:command name="marginrule" type="environment" variant="assignment" level="document" category="rules" file="anch-bar.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupmarginrule"/> @@ -100,4 +100,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-smash.xml b/tex/context/interface/mkiv/i-smash.xml index 16c1046bd..9183c8a6b 100644 --- a/tex/context/interface/mkiv/i-smash.xml +++ b/tex/context/interface/mkiv/i-smash.xml @@ -4,69 +4,69 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="smashbox" file="supp-box.mkiv"> + <cd:command name="smashbox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="string-box"/> </cd:arguments> </cd:command> - <cd:command name="smashboxed" file="supp-box.mkiv"> + <cd:command name="smashboxed" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="string-box"/> </cd:arguments> </cd:command> - <cd:command name="hsmashbox" file="supp-box.mkiv"> + <cd:command name="hsmashbox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="string-box"/> </cd:arguments> </cd:command> - <cd:command name="vsmashbox" file="supp-box.mkiv"> + <cd:command name="vsmashbox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="string-box"/> </cd:arguments> </cd:command> - <cd:command name="hsmash" file="supp-box.mkiv"> + <cd:command name="hsmash" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="vsmash" file="supp-box.mkiv"> + <cd:command name="vsmash" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="hsmashed" file="supp-box.mkiv"> + <cd:command name="hsmashed" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="vsmashed" file="supp-box.mkiv"> + <cd:command name="vsmashed" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="smashedhbox" file="supp-box.mkiv"> + <cd:command name="smashedhbox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="smashedvbox" file="supp-box.mkiv"> + <cd:command name="smashedvbox" level="system" file="supp-box.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="smash" file="supp-box.mkiv"> + <cd:command name="smash" level="document" file="supp-box.mkiv"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="w"/> @@ -79,4 +79,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-sort.xml b/tex/context/interface/mkiv/i-sort.xml index a72df624b..5a263ab97 100644 --- a/tex/context/interface/mkiv/i-sort.xml +++ b/tex/context/interface/mkiv/i-sort.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definesorting" file="strc-syn.mkiv"> + <cd:command name="definesorting" level="style" category="language" file="strc-syn.mkiv"> <cd:arguments> <cd:resolve name="keyword-singular"/> <cd:resolve name="keyword-plural"/> @@ -15,7 +15,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupsorting" file="strc-syn.mkiv"> + <cd:command name="setupsorting" level="style" category="language" file="strc-syn.mkiv"> <cd:arguments> <cd:resolve name="keyword-singular-list-optional"/> <cd:assignments list="yes"> @@ -78,7 +78,7 @@ </cd:arguments> </cd:command> - <cd:command name="sorting" generated="yes" variant="instance" file="strc-syn.mkiv"> + <cd:command name="sorting" generated="yes" variant="instance" level="document" category="language" file="strc-syn.mkiv"> <cd:sequence> <cd:instance value="sorting"/> </cd:sequence> @@ -91,7 +91,7 @@ </cd:instances> </cd:command> - <cd:command name="definesort" file="strc-syn.mkiv"> + <cd:command name="definesort" level="system" category="language" file="strc-syn.mkiv"> <cd:arguments> <cd:keywords> <cd:constant type="yes"/> @@ -103,7 +103,7 @@ </cd:arguments> </cd:command> - <cd:command name="placelistofsorts" generated="yes" variant="instance" file="strc-syn.mkiv"> + <cd:command name="placelistofsorts" generated="yes" variant="instance" level="document" category="language" file="strc-syn.mkiv"> <cd:sequence> <cd:string value="placelistof"/> <cd:instance value="sorts"/> @@ -118,7 +118,7 @@ </cd:instances> </cd:command> - <cd:command name="completelistofsorts" generated="yes" variant="instance" file="strc-syn.mkiv"> + <cd:command name="completelistofsorts" generated="yes" variant="instance" level="document" category="language" file="strc-syn.mkiv"> <cd:sequence> <cd:string value="completelistof"/> <cd:instance value="sorts"/> @@ -133,27 +133,27 @@ </cd:instances> </cd:command> - <cd:command name="doifelsecurrentsortingused" file="strc-syn.mkiv"> + <cd:command name="doifelsecurrentsortingused" level="system" category="language conditional" file="strc-syn.mkiv"> <cd:arguments> <cd:resolve name="argument-true"/> <cd:resolve name="argument-false"/> </cd:arguments> </cd:command> - <cd:command name="resetusedsortings" file="strc-syn.mkiv"> + <cd:command name="resetusedsortings" level="system" category="language" file="strc-syn.mkiv"> <cd:arguments> <cd:resolve name="keyword-singular"/> </cd:arguments> </cd:command> - <cd:command name="registersort" file="strc-syn.mkiv"> + <cd:command name="registersort" level="system" category="language" file="strc-syn.mkiv"> <cd:arguments> <cd:resolve name="keyword-singular"/> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="placelistofsorts" file="strc-syn.mkiv"> + <cd:command name="placelistofsorts" level="document" category="language" file="strc-syn.mkiv"> <cd:arguments> <cd:resolve name="keyword-singular"/> <cd:assignments list="yes" optional="yes"> @@ -162,7 +162,7 @@ </cd:arguments> </cd:command> - <cd:command name="completelistofsorts" file="strc-syn.mkiv"> + <cd:command name="completelistofsorts" level="document" category="language" file="strc-syn.mkiv"> <cd:arguments> <cd:resolve name="keyword-singular"/> <cd:assignments list="yes" optional="yes"> @@ -173,14 +173,14 @@ <!-- - <cd:command name="logo" file="strc-syn.mkiv"> + <cd:command name="logo" level="document" category="language" file="strc-syn.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="placelistoflogos" file="strc-syn.mkiv"> + <cd:command name="placelistoflogos" level="document" category="language" file="strc-syn.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupsorting"/> @@ -188,7 +188,7 @@ </cd:arguments> </cd:command> - <cd:command name="completelistoflogos" file="strc-syn.mkiv"> + <cd:command name="completelistoflogos" level="document" category="language" file="strc-syn.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupsorting"/> @@ -198,4 +198,4 @@ --> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-soundtrack.xml b/tex/context/interface/mkiv/i-soundtrack.xml index b0f460352..c374268bb 100644 --- a/tex/context/interface/mkiv/i-soundtrack.xml +++ b/tex/context/interface/mkiv/i-soundtrack.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="setupexternalsoundtracks" file="scrn-wid.mkvi"> + <cd:command name="setupexternalsoundtracks" level="style" category="pdf" file="scrn-wid.mkvi"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="option"> @@ -14,17 +14,17 @@ </cd:arguments> </cd:command> - <cd:command name="useexternalsoundtrack" file="scrn-wid.mkvi"> + <cd:command name="useexternalsoundtrack" level="style" category="pdf" file="scrn-wid.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-file"/> </cd:arguments> </cd:command> - <cd:command name="checksoundtrack" file="scrn-wid.mkvi"> + <cd:command name="checksoundtrack" level="style" category="pdf" file="scrn-wid.mkvi"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-spellchecking.xml b/tex/context/interface/mkiv/i-spellchecking.xml index 615ba390b..90a219fc8 100644 --- a/tex/context/interface/mkiv/i-spellchecking.xml +++ b/tex/context/interface/mkiv/i-spellchecking.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="setupspellchecking" file="lang-wrd.mkiv"> + <cd:command name="setupspellchecking" level="style" category="language" file="lang-wrd.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="state"> @@ -23,11 +23,11 @@ </cd:arguments> </cd:command> - <cd:command name="loadspellchecklist" file="lang-wrd.mkiv"> + <cd:command name="loadspellchecklist" level="style" category="language" file="lang-wrd.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-file"/> </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-spreadsheet.xml b/tex/context/interface/mkiv/i-spreadsheet.xml index 9f6273891..8181cfe2d 100644 --- a/tex/context/interface/mkiv/i-spreadsheet.xml +++ b/tex/context/interface/mkiv/i-spreadsheet.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definespreadsheet" file="m-spreadsheet.mkiv"> + <cd:command name="definespreadsheet" level="style" category="tables" file="m-spreadsheet.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupspreadsheet" file="m-spreadsheet.mkiv"> + <cd:command name="setupspreadsheet" level="style" category="tables" file="m-spreadsheet.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -32,31 +32,31 @@ </cd:arguments> </cd:command> - <cd:command name="resetspreadsheet" file="m-spreadsheet.mkiv"> + <cd:command name="resetspreadsheet" level="system" category="tables" file="m-spreadsheet.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> </cd:arguments> </cd:command> - <cd:command name="spreadsheet" type="environment" file="m-spreadsheet.mkiv"> + <cd:command name="spreadsheet" type="environment" level="document" category="tables" file="m-spreadsheet.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> </cd:arguments> </cd:command> - <cd:command name="showspreadsheet" file="m-spreadsheet.mkiv"> + <cd:command name="showspreadsheet" level="document" category="tables" file="m-spreadsheet.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="inspectspreadsheet" file="m-spreadsheet.mkiv"> + <cd:command name="inspectspreadsheet" level="document" category="tables" file="m-spreadsheet.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="setspreadsheet" file="m-spreadsheet.mkiv"> + <cd:command name="setspreadsheet" level="system" category="tables" file="m-spreadsheet.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:resolve name="argument-number"/> @@ -65,7 +65,7 @@ </cd:arguments> </cd:command> - <cd:command name="getspreadsheet" file="m-spreadsheet.mkiv"> + <cd:command name="getspreadsheet" level="system" category="tables" file="m-spreadsheet.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:resolve name="argument-number"/> @@ -74,7 +74,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifelsespreadsheetcell" file="m-spreadsheet.mkiv"> + <cd:command name="doifelsespreadsheetcell" level="system" category="tables conditional" file="m-spreadsheet.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:resolve name="argument-number"/> @@ -84,7 +84,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifspreadsheetcellelse" file="m-spreadsheet.mkiv"> + <cd:command name="doifspreadsheetcellelse" level="system" category="tables conditional" file="m-spreadsheet.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:resolve name="argument-number"/> @@ -94,31 +94,31 @@ </cd:arguments> </cd:command> - <cd:command name="TABLEsetspreadsheet" file="m-spreadsheet.mkiv"> + <cd:command name="TABLEsetspreadsheet" level="system" category="tables" file="m-spreadsheet.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="TABLEgetspreadsheet" file="m-spreadsheet.mkiv"> + <cd:command name="TABLEgetspreadsheet" level="system" category="tables" file="m-spreadsheet.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="setspr" file="m-spreadsheet.mkiv"> + <cd:command name="setspr" level="document" category="tables" file="m-spreadsheet.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="getspr" file="m-spreadsheet.mkiv"> + <cd:command name="getspr" level="document" category="tables" file="m-spreadsheet.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="spreadsheettable" type="environment" file="m-spreadsheet.mkiv"> + <cd:command name="spreadsheettable" type="environment" level="document" category="tables" file="m-spreadsheet.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:assignments list="yes" optional="yes"> @@ -127,9 +127,9 @@ </cd:arguments> </cd:command> - <cd:command name="row" type="environment" file="m-spreadsheet.mkiv"/> + <cd:command name="row" type="environment" scope="spreadsheettable" level="document" category="tables" file="m-spreadsheet.mkiv"/> - <cd:command name="cell" type="environment" file="m-spreadsheet.mkiv"> + <cd:command name="cell" type="environment" scope="spreadsheettable" level="document" category="tables" file="m-spreadsheet.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="bTD"/> diff --git a/tex/context/interface/mkiv/i-startstop.xml b/tex/context/interface/mkiv/i-startstop.xml index 2a6be1393..c7780488c 100644 --- a/tex/context/interface/mkiv/i-startstop.xml +++ b/tex/context/interface/mkiv/i-startstop.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definestartstop" file="core-sys.mkiv"> + <cd:command name="definestartstop" level="style" category="structure" file="core-sys.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupstartstop" file="core-sys.mkiv"> + <cd:command name="setupstartstop" level="style" category="structure" file="core-sys.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -51,13 +51,13 @@ </cd:arguments> </cd:command> - <cd:command name="startstop" type="environment" generated="yes" variant="example" file="core-sys.mkiv"> + <cd:command name="startstop" type="environment" generated="yes" variant="example" level="document" category="structure" file="core-sys.mkiv"> <cd:sequence> <cd:variable value="startstop"/> </cd:sequence> </cd:command> - <cd:command name="startstop" type="environment" file="core-sys.mkiv"> + <cd:command name="startstop" type="environment" level="document" category="structure" file="core-sys.mkiv"> <cd:sequence> <cd:string value=""/><!-- value="zero width space --> </cd:sequence> @@ -66,7 +66,7 @@ </cd:arguments> </cd:command> - <cd:command name="startstop" generated="yes" variant="example" file="core-sys.mkiv"> + <cd:command name="startstop" generated="yes" variant="example" level="document" category="structure" file="core-sys.mkiv"> <cd:sequence> <cd:variable value="startstop"/> </cd:sequence> @@ -75,4 +75,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-steps.xml b/tex/context/interface/mkiv/i-steps.xml index 47a3b45ca..c71bc2e2f 100644 --- a/tex/context/interface/mkiv/i-steps.xml +++ b/tex/context/interface/mkiv/i-steps.xml @@ -6,7 +6,7 @@ <!-- - <cd:command name="setupSTEPchart" file="m-steps.mkvi"> + <cd:command name="setupSTEPchart" level="style" category="graphics" file="m-steps.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:resolve name="keyword-name-optional"/> @@ -29,7 +29,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupSTEPcharts" file="m-steps.mkvi"> + <cd:command name="setupSTEPcharts" level="style" category="graphics" file="m-steps.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:resolve name="keyword-name-optional"/> @@ -41,7 +41,7 @@ --> - <cd:command name="setupSTEPcharts" file="m-steps.mkvi"> + <cd:command name="setupSTEPcharts" level="style" category="graphics" file="m-steps.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:resolve name="keyword-name-optional"/> @@ -66,7 +66,7 @@ <!-- - <cd:command name="setupSTEPcell" file="m-steps.mkvi"> + <cd:command name="setupSTEPcell" level="style" category="graphics" file="m-steps.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:resolve name="keyword-name-optional"/> @@ -102,7 +102,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupSTEPcells" file="m-steps.mkvi"> + <cd:command name="setupSTEPcells" level="style" category="graphics" file="m-steps.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:resolve name="keyword-name-optional"/> @@ -114,7 +114,7 @@ --> - <cd:command name="setupSTEPcells" file="m-steps.mkvi"> + <cd:command name="setupSTEPcells" level="style" category="graphics" file="m-steps.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:resolve name="keyword-name-optional"/> @@ -152,7 +152,7 @@ <!-- - <cd:command name="setupSTEPtext" file="m-steps.mkvi"> + <cd:command name="setupSTEPtext" level="style" category="graphics" file="m-steps.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:resolve name="keyword-name-optional"/> @@ -185,7 +185,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupSTEPtexts" file="m-steps.mkvi"> + <cd:command name="setupSTEPtexts" level="style" category="graphics" file="m-steps.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:resolve name="keyword-name-optional"/> @@ -197,7 +197,7 @@ --> - <cd:command name="setupSTEPtexts" file="m-steps.mkvi"> + <cd:command name="setupSTEPtexts" level="style" category="graphics" file="m-steps.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:resolve name="keyword-name-optional"/> @@ -232,7 +232,7 @@ <!-- - <cd:command name="setupSTEPline" file="m-steps.mkvi"> + <cd:command name="setupSTEPline" level="style" category="graphics" file="m-steps.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:resolve name="keyword-name-optional"/> @@ -259,7 +259,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupSTEPlines" file="m-steps.mkvi"> + <cd:command name="setupSTEPlines" level="style" category="graphics" file="m-steps.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:resolve name="keyword-name-optional"/> @@ -271,7 +271,7 @@ --> - <cd:command name="setupSTEPlines" file="m-steps.mkvi"> + <cd:command name="setupSTEPlines" level="style" category="graphics" file="m-steps.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:resolve name="keyword-name-optional"/> @@ -298,7 +298,7 @@ </cd:arguments> </cd:command> - <cd:command name="STEPchart" type="environment" file="m-steps.mkvi"> + <cd:command name="STEPchart" type="environment" level="document" category="graphics" file="m-steps.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:assignments list="yes" optional="yes"> @@ -307,7 +307,7 @@ </cd:arguments> </cd:command> - <cd:command name="STEPtable" type="environment" file="m-steps.mkvi"> + <cd:command name="STEPtable" type="environment" level="document" category="graphics" file="m-steps.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:assignments list="yes" optional="yes"> @@ -316,7 +316,7 @@ </cd:arguments> </cd:command> - <cd:command name="STEPaligntable" type="environment" file="m-steps.mkvi"> + <cd:command name="STEPaligntable" type="environment" level="document" category="graphics" file="m-steps.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:assignments list="yes" optional="yes"> @@ -325,7 +325,7 @@ </cd:arguments> </cd:command> - <cd:command name="STEPchart" file="m-steps.mkvi"> + <cd:command name="STEPchart" level="document" category="graphics" file="m-steps.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes" optional="yes"> @@ -334,15 +334,15 @@ </cd:arguments> </cd:command> - <cd:command name="makeSTEPchart" file="m-steps.mkvi"> + <cd:command name="makeSTEPchart" level="document" category="graphics" file="m-steps.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="STEPcell" type="environment" file="m-steps.mkvi"/> + <cd:command name="STEPcell" type="environment" level="document" category="graphics" file="m-steps.mkvi"/> - <cd:command name="cells" file="m-steps.mkvi"> + <cd:command name="cells" scope="stepchart" level="document" category="graphics" file="m-steps.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:resolve name="argument-text"/> @@ -350,7 +350,7 @@ </cd:arguments> </cd:command> - <cd:command name="cells" variant="aligntable" file="m-steps.mkvi"> + <cd:command name="cells" variant="aligntable" scope="stepchart" level="document" category="graphics" file="m-steps.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:resolve name="argument-text"/> @@ -359,7 +359,7 @@ </cd:arguments> </cd:command> - <cd:command name="texts" file="m-steps.mkvi"> + <cd:command name="texts" scope="stepchart" level="document" category="graphics" file="m-steps.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:resolve name="argument-text"/> @@ -367,42 +367,42 @@ </cd:arguments> </cd:command> - <cd:command name="cell" file="m-steps.mkvi"> + <cd:command name="cell" scope="stepchart" level="document" category="graphics" file="m-steps.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="text" file="m-steps.mkvi"> + <cd:command name="text" scope="stepchart" level="document" category="graphics" file="m-steps.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="toptext" file="m-steps.mkvi"> + <cd:command name="toptext" scope="stepchart" level="document" category="graphics" file="m-steps.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="bottext" file="m-steps.mkvi"> + <cd:command name="bottext" scope="stepchart" level="document" category="graphics" file="m-steps.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="topcell" file="m-steps.mkvi"> + <cd:command name="topcell" scope="stepchart" level="document" category="graphics" file="m-steps.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="botcell" file="m-steps.mkvi"> + <cd:command name="botcell" scope="stepchart" level="document" category="graphics" file="m-steps.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:resolve name="argument-text"/> diff --git a/tex/context/interface/mkiv/i-stream.xml b/tex/context/interface/mkiv/i-stream.xml index 97be35774..7e769fdb6 100644 --- a/tex/context/interface/mkiv/i-stream.xml +++ b/tex/context/interface/mkiv/i-stream.xml @@ -4,9 +4,9 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="currentoutputstream" file="page-str.mkiv"/> + <cd:command name="currentoutputstream" level="system" file="page-str.mkiv"/> - <cd:command name="ifinoutputstream" file="page-str.mkiv"> + <cd:command name="ifinoutputstream" level="system" file="page-str.mkiv"> <cd:arguments> <cd:resolve name="string-true"/> <cd:delimiter name="else"/> @@ -15,60 +15,60 @@ </cd:arguments> </cd:command> - <cd:command name="enableoutputstream" file="page-str.mkiv"> + <cd:command name="enableoutputstream" level="system" file="page-str.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="disableoutputstream" file="page-str.mkiv"/> + <cd:command name="disableoutputstream" level="system" file="page-str.mkiv"/> - <cd:command name="outputstream" type="environment" file="page-str.mkiv"> + <cd:command name="outputstream" type="environment" level="system" file="page-str.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="flushoutputstream" file="page-str.mkiv"> + <cd:command name="flushoutputstream" level="system" file="page-str.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="outputstreambox" file="page-str.mkiv"> + <cd:command name="outputstreambox" level="system" file="page-str.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="outputstreamcopy" file="page-str.mkiv"> + <cd:command name="outputstreamcopy" level="system" file="page-str.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="outputstreamunvbox" file="page-str.mkiv"> + <cd:command name="outputstreamunvbox" level="system" file="page-str.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="outputstreamunvcopy" file="page-str.mkiv"> + <cd:command name="outputstreamunvcopy" level="system" file="page-str.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="synchronizeoutputstreams" file="page-str.mkiv"> + <cd:command name="synchronizeoutputstreams" level="system" file="page-str.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list"/> </cd:arguments> </cd:command> - <cd:command name="pushoutputstream" file="page-str.mkiv"> + <cd:command name="pushoutputstream" level="system" file="page-str.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-string.xml b/tex/context/interface/mkiv/i-string.xml index 7a7eb1c98..aba5429c5 100644 --- a/tex/context/interface/mkiv/i-string.xml +++ b/tex/context/interface/mkiv/i-string.xml @@ -4,61 +4,61 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="wdofstring" file="blob-ini.mkiv"> + <cd:command name="wdofstring" level="system" file="blob-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="htofstring" file="blob-ini.mkiv"> + <cd:command name="htofstring" level="system" file="blob-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="dpofstring" file="blob-ini.mkiv"> + <cd:command name="dpofstring" level="system" file="blob-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="hdofstring" file="blob-ini.mkiv"> + <cd:command name="hdofstring" level="system" file="blob-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="htdpofstring" file="blob-ini.mkiv"> + <cd:command name="htdpofstring" level="system" file="blob-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="widthofstring" file="blob-ini.mkiv"> + <cd:command name="widthofstring" level="system" file="blob-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="heightofstring" file="blob-ini.mkiv"> + <cd:command name="heightofstring" level="system" file="blob-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="depthofstring" file="blob-ini.mkiv"> + <cd:command name="depthofstring" level="system" file="blob-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="heightanddepthofstring" file="blob-ini.mkiv"> + <cd:command name="heightanddepthofstring" level="system" file="blob-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="setwidthof" file="blob-ini.mkiv"> + <cd:command name="setwidthof" level="system" file="blob-ini.mkiv"> <cd:arguments> <cd:text/> <cd:delimiter name="to"/> @@ -66,4 +66,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-strut.xml b/tex/context/interface/mkiv/i-strut.xml index 1fd12a3bb..0653dd214 100644 --- a/tex/context/interface/mkiv/i-strut.xml +++ b/tex/context/interface/mkiv/i-strut.xml @@ -4,15 +4,17 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="strutdp" file="supp-box.mkiv"/> + <cd:command name="strutdp" level="system" file="supp-box.mkiv"/> - <cd:command name="strutht" file="supp-box.mkiv"/> + <cd:command name="strutht" level="system" file="supp-box.mkiv"/> - <cd:command name="strutwd" file="supp-box.mkiv"/> + <cd:command name="strutwd" level="system" file="supp-box.mkiv"/> - <cd:command name="struthtdp" file="supp-box.mkiv"/> + <cd:command name="struthtdp" level="system" file="supp-box.mkiv"/> - <cd:command name="setupstruts" file="spac-ver.mkiv"> + <cd:command name="strutgap" level="system" file="supp-box.mkiv"/> + + <cd:command name="setupstruts" level="style" file="spac-ver.mkiv"> <cd:arguments> <cd:keywords optional="yes"> <cd:resolve name="value-strut"/> @@ -20,7 +22,7 @@ </cd:arguments> </cd:command> - <cd:command name="synchronizestrut" file="spac-ver.mkiv"> + <cd:command name="synchronizestrut" level="system" file="spac-ver.mkiv"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:resolve name="value-strut"/> @@ -28,26 +30,36 @@ </cd:arguments> </cd:command> - <cd:command name="strut" file="spac-ver.mkiv"/> + <cd:command name="strut" level="style" file="spac-ver.mkiv"/> + + <cd:command name="halfstrut" level="system" file="spac-ver.mkiv"/> + + <cd:command name="quarterstrut" level="system" file="spac-ver.mkiv"/> + + <cd:command name="halflinestrut" level="system" file="spac-ver.mkiv"/> + + <cd:command name="noheightstrut" level="system" file="spac-ver.mkiv"/> + + <cd:command name="depthstrut" level="system" file="spac-ver.mkiv"/> - <cd:command name="setstrut" file="spac-ver.mkiv"/> + <cd:command name="setstrut" level="system" file="spac-ver.mkiv"/> - <cd:command name="setcharstrut" file="spac-ver.mkiv"> + <cd:command name="setcharstrut" level="system" file="spac-ver.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="setfontstrut" file="spac-ver.mkiv"/> + <cd:command name="setfontstrut" level="system" file="spac-ver.mkiv"/> - <cd:command name="setcapstrut" file="spac-ver.mkiv"/> + <cd:command name="setcapstrut" level="system" file="spac-ver.mkiv"/> - <cd:command name="setnostrut" file="spac-ver.mkiv"/> + <cd:command name="setnostrut" level="system" file="spac-ver.mkiv"/> - <cd:command name="showstruts" file="spac-ver.mkiv"/> + <cd:command name="showstruts" level="document" file="spac-ver.mkiv"/> - <cd:command name="showcolorstruts" file="spac-ver.mkiv"/> + <cd:command name="showcolorstruts" level="document" file="spac-ver.mkiv"/> - <cd:command name="strut" type="environment" begin="beg" end="end" file="spac-ver.mkiv"/> + <cd:command name="strut" type="environment" begin="beg" end="end" level="system" file="spac-ver.mkiv"/> </cd:interface> diff --git a/tex/context/interface/mkiv/i-symbol.xml b/tex/context/interface/mkiv/i-symbol.xml index 7797a3bee..123e98cbf 100644 --- a/tex/context/interface/mkiv/i-symbol.xml +++ b/tex/context/interface/mkiv/i-symbol.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definesymbol" file="symb-ini.mkiv"> + <cd:command name="definesymbol" level="style" category="symbols" file="symb-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:resolve name="keyword-name"/> @@ -12,7 +12,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifelseinsymbolset" file="symb-ini.mkiv"> + <cd:command name="doifelseinsymbolset" level="system" category="symbols conditional" file="symb-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-name"/> @@ -21,7 +21,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifinsymbolsetelse" file="symb-ini.mkiv"> + <cd:command name="doifinsymbolsetelse" level="system" category="symbols conditional" file="symb-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-name"/> @@ -30,7 +30,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifinsymbolset" file="symb-ini.mkiv"> + <cd:command name="doifinsymbolset" level="system" category="symbols conditional" file="symb-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-name"/> @@ -39,7 +39,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifelsesymbolset" file="symb-ini.mkiv"> + <cd:command name="doifelsesymbolset" level="system" category="symbols conditional" file="symb-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -47,7 +47,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifsymbolsetelse" file="symb-ini.mkiv"> + <cd:command name="doifsymbolsetelse" level="system" category="symbols conditional" file="symb-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -55,27 +55,27 @@ </cd:arguments> </cd:command> - <cd:command name="symbol" file="symb-ini.mkiv"> + <cd:command name="symbol" level="document" category="symbols" file="symb-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="symbol" variant="direct" file="symb-ini.mkiv"> + <cd:command name="symbol" variant="direct" level="document" category="symbols" file="symb-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="directsymbol" file="symb-ini.mkiv"> + <cd:command name="directsymbol" level="system" category="symbols" file="symb-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="definefiguresymbol" file="symb-ini.mkiv"> + <cd:command name="definefiguresymbol" level="style" category="symbols graphics" file="symb-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:keywords> @@ -88,7 +88,7 @@ </cd:arguments> </cd:command> - <cd:command name="figuresymbol" file="symb-ini.mkiv"> + <cd:command name="figuresymbol" level="document" category="symbols graphics" file="symb-ini.mkiv"> <cd:arguments> <cd:keywords> <cd:constant type="cd:file"/> @@ -100,7 +100,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifelsesymboldefined" file="symb-ini.mkiv"> + <cd:command name="doifelsesymboldefined" level="system" category="symbols conditional" file="symb-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -108,7 +108,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifsymboldefinedelse" file="symb-ini.mkiv"> + <cd:command name="doifsymboldefinedelse" level="system" category="symbols conditional" file="symb-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -116,30 +116,30 @@ </cd:arguments> </cd:command> - <cd:command name="symbolset" type="environment" file="symb-ini.mkiv"> + <cd:command name="symbolset" type="environment" level="style" category="symbols" file="symb-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="setupsymbolset" file="symb-ini.mkiv"> + <cd:command name="setupsymbolset" level="style" category="symbols" file="symb-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="resetsymbolset" file="symb-ini.mkiv"/> + <cd:command name="resetsymbolset" level="system" category="symbols" file="symb-ini.mkiv"/> - <cd:command name="usesymbols" file="symb-ini.mkiv"> + <cd:command name="usesymbols" level="style" category="symbols" file="symb-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-file"/> </cd:arguments> </cd:command> - <cd:command name="showsymbolset" file="symb-run.mkiv"> + <cd:command name="showsymbolset" level="document" category="symbols" file="symb-run.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-synctex.xml b/tex/context/interface/mkiv/i-synctex.xml new file mode 100644 index 000000000..21f49e3f6 --- /dev/null +++ b/tex/context/interface/mkiv/i-synctex.xml @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<?context-directive job ctxfile x-setups.ctx ?> + +<cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> + + <cd:command name="synctexsetfilename" level="system" category="pdf" file="cont-run.mkiv"> + <cd:arguments> + <cd:resolve name="argument-file"/> + </cd:arguments> + </cd:command> + + <cd:command name="synctexresetfilename" level="system" category="pdf" file="cont-run.mkiv"/> + + <cd:command name="synctexblockfilename" level="system" category="pdf" file="cont-run.mkiv"> + <cd:arguments> + <cd:resolve name="argument-file"/> + </cd:arguments> + </cd:command> + + <cd:command name="setupsynctex" level="style" category="pdf" file="cont-run.mkiv"> + <cd:arguments> + <cd:assignments list="yes"> + <cd:parameter name="state"> + <cd:constant type="start"/> + <cd:constant type="stop" default="yes"/> + </cd:parameter> + <cd:parameter name="method"> + <cd:constant type="min"/> + <cd:constant type="max" default="yes"/> + </cd:parameter> + </cd:assignments> + </cd:arguments> + </cd:command> + + <cd:command name="blocksynctexfile" level="style" category="pdf" file="cont-run.mkiv"> + <cd:arguments> + <cd:resolve name="keyword-file-list"/> + </cd:arguments> + </cd:command> + +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-synonym.xml b/tex/context/interface/mkiv/i-synonym.xml index 6c615b12a..3e3e1c027 100644 --- a/tex/context/interface/mkiv/i-synonym.xml +++ b/tex/context/interface/mkiv/i-synonym.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definesynonyms" file="strc-syn.mkiv"> + <cd:command name="definesynonyms" level="style" category="symbols" file="strc-syn.mkiv"> <cd:arguments> <cd:resolve name="keyword-singular"/> <cd:resolve name="keyword-plural"/> @@ -17,7 +17,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupsynonyms" file="strc-syn.mkiv"> + <cd:command name="setupsynonyms" level="style" category="symbols" file="strc-syn.mkiv"> <cd:arguments> <cd:resolve name="keyword-singular-list-optional"/> <cd:assignments list="yes"> @@ -80,7 +80,7 @@ </cd:arguments> </cd:command> - <cd:command name="synonym" generated="yes" variant="instance" file="strc-syn.mkiv"> + <cd:command name="synonym" generated="yes" variant="instance" level="document" category="symbols" file="strc-syn.mkiv"> <cd:sequence> <cd:instance value="synonym"/> </cd:sequence> @@ -94,7 +94,7 @@ </cd:instances> </cd:command> - <cd:command name="definesynonym" file="strc-syn.mkiv"> + <cd:command name="definesynonym" level="style" category="symbols" file="strc-syn.mkiv"> <cd:arguments> <cd:keywords> <cd:constant type="yes"/> @@ -107,7 +107,7 @@ </cd:arguments> </cd:command> - <cd:command name="placelistofsynonyms" generated="yes" variant="instance" file="strc-syn.mkiv"> + <cd:command name="placelistofsynonyms" generated="yes" variant="instance" level="document" category="symbols" file="strc-syn.mkiv"> <cd:sequence> <cd:string value="placelistof"/> <cd:instance value="synonyms"/> @@ -122,7 +122,7 @@ </cd:instances> </cd:command> - <cd:command name="completelistofsynonyms" generated="yes" variant="instance" file="strc-syn.mkiv"> + <cd:command name="completelistofsynonyms" generated="yes" variant="instance" level="document" category="symbols" file="strc-syn.mkiv"> <cd:sequence> <cd:string value="completelistof"/> <cd:instance value="synonyms"/> @@ -137,40 +137,40 @@ </cd:instances> </cd:command> - <cd:command name="registersynonym" file="strc-syn.mkiv"> + <cd:command name="registersynonym" level="system" category="symbols" file="strc-syn.mkiv"> <cd:arguments> <cd:resolve name="keyword-singular"/> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="doifelsecurrentsynonymused" file="strc-syn.mkiv"> + <cd:command name="doifelsecurrentsynonymused" level="system" category="symbols conditional" file="strc-syn.mkiv"> <cd:arguments> <cd:resolve name="argument-true"/> <cd:resolve name="argument-false"/> </cd:arguments> </cd:command> - <cd:command name="doifelsecurrentsynonymshown" file="strc-syn.mkiv"> + <cd:command name="doifelsecurrentsynonymshown" level="system" category="symbols conditional" file="strc-syn.mkiv"> <cd:arguments> <cd:resolve name="argument-true"/> <cd:resolve name="argument-false"/> </cd:arguments> </cd:command> - <cd:command name="resetusedsynonyms" file="strc-syn.mkiv"> + <cd:command name="resetusedsynonyms" level="system" category="symbols" file="strc-syn.mkiv"> <cd:arguments> <cd:resolve name="keyword-singular"/> </cd:arguments> </cd:command> - <cd:command name="resetshownsynonyms" file="strc-syn.mkiv"> + <cd:command name="resetshownsynonyms" level="system" category="symbols" file="strc-syn.mkiv"> <cd:arguments> <cd:resolve name="keyword-singular"/> </cd:arguments> </cd:command> - <cd:command name="placelistofsynonyms" file="strc-syn.mkiv"> + <cd:command name="placelistofsynonyms" level="document" category="symbols" file="strc-syn.mkiv"> <cd:arguments> <cd:resolve name="keyword-singular"/> <cd:assignments list="yes" optional="yes"> @@ -179,7 +179,7 @@ </cd:arguments> </cd:command> - <cd:command name="completelistofsynonyms" file="strc-syn.mkiv"> + <cd:command name="completelistofsynonyms" level="document" category="symbols" file="strc-syn.mkiv"> <cd:arguments> <cd:resolve name="keyword-singular"/> <cd:assignments list="yes" optional="yes"> @@ -188,7 +188,7 @@ </cd:arguments> </cd:command> - <cd:command name="infull" file="strc-syn.mkiv"> + <cd:command name="infull" level="document" category="symbols" file="strc-syn.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> @@ -196,7 +196,7 @@ <!-- - <cd:command name="abbreviation" file="strc-syn.mkiv"> + <cd:command name="abbreviation" level="document" category="symbols" file="strc-syn.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:resolve name="argument-text"/> @@ -204,7 +204,7 @@ </cd:arguments> </cd:command> - <cd:command name="placelistofabbreviations" file="strc-syn.mkiv"> + <cd:command name="placelistofabbreviations" level="document" category="symbols" file="strc-syn.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupsynonyms"/> @@ -212,7 +212,7 @@ </cd:arguments> </cd:command> - <cd:command name="completelistofabbreviations" file="strc-syn.mkiv"> + <cd:command name="completelistofabbreviations" level="document" category="symbols" file="strc-syn.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupsynonyms"/> @@ -222,4 +222,4 @@ --> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-system.xml b/tex/context/interface/mkiv/i-system.xml index aa12bd779..44def10e0 100644 --- a/tex/context/interface/mkiv/i-system.xml +++ b/tex/context/interface/mkiv/i-system.xml @@ -4,28 +4,28 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="expanded" file="syst-aux.mkiv"> + <cd:command name="expanded" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="expanded" type="environment" file="syst-aux.mkiv"/> + <cd:command name="expanded" type="environment" level="system" file="syst-aux.mkiv"/> - <cd:command name="gobbleoneargument" file="syst-aux.mkiv"> + <cd:command name="gobbleoneargument" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="gobbletwoarguments" file="syst-aux.mkiv"> + <cd:command name="gobbletwoarguments" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:content/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="gobblethreearguments" file="syst-aux.mkiv"> + <cd:command name="gobblethreearguments" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:content/> <cd:content/> @@ -33,7 +33,7 @@ </cd:arguments> </cd:command> - <cd:command name="gobblefourarguments" file="syst-aux.mkiv"> + <cd:command name="gobblefourarguments" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:content/> <cd:content/> @@ -42,7 +42,7 @@ </cd:arguments> </cd:command> - <cd:command name="gobblefivearguments" file="syst-aux.mkiv"> + <cd:command name="gobblefivearguments" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:content/> <cd:content/> @@ -52,7 +52,7 @@ </cd:arguments> </cd:command> - <cd:command name="gobblesixarguments" file="syst-aux.mkiv"> + <cd:command name="gobblesixarguments" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:content/> <cd:content/> @@ -63,7 +63,7 @@ </cd:arguments> </cd:command> - <cd:command name="gobblesevenarguments" file="syst-aux.mkiv"> + <cd:command name="gobblesevenarguments" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:content/> <cd:content/> @@ -75,7 +75,7 @@ </cd:arguments> </cd:command> - <cd:command name="gobbleeightarguments" file="syst-aux.mkiv"> + <cd:command name="gobbleeightarguments" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:content/> <cd:content/> @@ -88,7 +88,7 @@ </cd:arguments> </cd:command> - <cd:command name="gobbleninearguments" file="syst-aux.mkiv"> + <cd:command name="gobbleninearguments" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:content/> <cd:content/> @@ -102,7 +102,7 @@ </cd:arguments> </cd:command> - <cd:command name="gobbletenarguments" file="syst-aux.mkiv"> + <cd:command name="gobbletenarguments" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:content/> <cd:content/> @@ -117,20 +117,20 @@ </cd:arguments> </cd:command> - <cd:command name="gobbleoneoptional" file="syst-aux.mkiv"> + <cd:command name="gobbleoneoptional" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="keyword-dummy"/> </cd:arguments> </cd:command> - <cd:command name="gobbletwooptionals" file="syst-aux.mkiv"> + <cd:command name="gobbletwooptionals" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="keyword-dummy"/> <cd:resolve name="keyword-dummy"/> </cd:arguments> </cd:command> - <cd:command name="gobblethreeoptionals" file="syst-aux.mkiv"> + <cd:command name="gobblethreeoptionals" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="keyword-dummy"/> <cd:resolve name="keyword-dummy"/> @@ -138,7 +138,7 @@ </cd:arguments> </cd:command> - <cd:command name="gobblefouroptionals" file="syst-aux.mkiv"> + <cd:command name="gobblefouroptionals" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="keyword-dummy"/> <cd:resolve name="keyword-dummy"/> @@ -147,7 +147,7 @@ </cd:arguments> </cd:command> - <cd:command name="gobblefiveoptionals" file="syst-aux.mkiv"> + <cd:command name="gobblefiveoptionals" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="keyword-dummy"/> <cd:resolve name="keyword-dummy"/> @@ -157,9 +157,9 @@ </cd:arguments> </cd:command> - <cd:command name="donothing" file="syst-aux.mkiv"/> + <cd:command name="donothing" level="system" file="syst-aux.mkiv"/> - <cd:command name="doifelsenextchar" file="syst-aux.mkiv"> + <cd:command name="doifelsenextchar" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-character"/> <cd:resolve name="argument-true"/> @@ -167,7 +167,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifnextcharelse" file="syst-aux.mkiv"> + <cd:command name="doifnextcharelse" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-character"/> <cd:resolve name="argument-true"/> @@ -175,212 +175,212 @@ </cd:arguments> </cd:command> - <cd:command name="doifelsenextoptional" file="syst-aux.mkiv"> + <cd:command name="doifelsenextoptional" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-true"/> <cd:resolve name="argument-false"/> </cd:arguments> </cd:command> - <cd:command name="doifnextoptionalelse" file="syst-aux.mkiv"> + <cd:command name="doifnextoptionalelse" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-true"/> <cd:resolve name="argument-false"/> </cd:arguments> </cd:command> - <cd:command name="doifelsenextoptionalcs" file="syst-aux.mkiv"> + <cd:command name="doifelsenextoptionalcs" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="doifnextoptionalcselse" file="syst-aux.mkiv"> + <cd:command name="doifnextoptionalcselse" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="doifelsenextbgroup" file="syst-aux.mkiv"> + <cd:command name="doifelsenextbgroup" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-true"/> <cd:resolve name="argument-false"/> </cd:arguments> </cd:command> - <cd:command name="doifnextbgroupelse" file="syst-aux.mkiv"> + <cd:command name="doifnextbgroupelse" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-true"/> <cd:resolve name="argument-false"/> </cd:arguments> </cd:command> - <cd:command name="doifelsenextbgroupcs" file="syst-aux.mkiv"> + <cd:command name="doifelsenextbgroupcs" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="doifnextbgroupcselse" file="syst-aux.mkiv"> + <cd:command name="doifnextbgroupcselse" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="doifelsenextparenthesis" file="syst-aux.mkiv"> + <cd:command name="doifelsenextparenthesis" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-true"/> <cd:resolve name="argument-false"/> </cd:arguments> </cd:command> - <cd:command name="doifnextparenthesiselse" file="syst-aux.mkiv"> + <cd:command name="doifnextparenthesiselse" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-true"/> <cd:resolve name="argument-false"/> </cd:arguments> </cd:command> - <cd:command name="doifelsefastoptionalcheck" file="syst-aux.mkiv"> + <cd:command name="doifelsefastoptionalcheck" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-true"/> <cd:resolve name="argument-false"/> </cd:arguments> </cd:command> - <cd:command name="doiffastoptionalcheckelse" file="syst-aux.mkiv"> + <cd:command name="doiffastoptionalcheckelse" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-true"/> <cd:resolve name="argument-false"/> </cd:arguments> </cd:command> - <cd:command name="doifelsefastoptionalcheckcs" file="syst-aux.mkiv"> + <cd:command name="doifelsefastoptionalcheckcs" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="doiffastoptionalcheckcselse" file="syst-aux.mkiv"> + <cd:command name="doiffastoptionalcheckcselse" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="assumelongusagecs" file="syst-aux.mkiv"> + <cd:command name="assumelongusagecs" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="setvalue" file="syst-aux.mkiv"> + <cd:command name="setvalue" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="setgvalue" file="syst-aux.mkiv"> + <cd:command name="setgvalue" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="setevalue" file="syst-aux.mkiv"> + <cd:command name="setevalue" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="setxvalue" file="syst-aux.mkiv"> + <cd:command name="setxvalue" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="getvalue" file="syst-aux.mkiv"> + <cd:command name="getvalue" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="letvalue" file="syst-aux.mkiv"> + <cd:command name="letvalue" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="letgvalue" file="syst-aux.mkiv"> + <cd:command name="letgvalue" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="resetvalue" file="syst-aux.mkiv"> + <cd:command name="resetvalue" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="undefinevalue" file="syst-aux.mkiv"> + <cd:command name="undefinevalue" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="ignorevalue" file="syst-aux.mkiv"> + <cd:command name="ignorevalue" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="setuvalue" file="syst-aux.mkiv"> + <cd:command name="setuvalue" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="setuevalue" file="syst-aux.mkiv"> + <cd:command name="setuevalue" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="setugvalue" file="syst-aux.mkiv"> + <cd:command name="setugvalue" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="setuxvalue" file="syst-aux.mkiv"> + <cd:command name="setuxvalue" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="getuvalue" file="syst-aux.mkiv"> + <cd:command name="getuvalue" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="doifelseundefined" file="syst-aux.mkiv"> + <cd:command name="doifelseundefined" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -388,7 +388,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifundefinedelse" file="syst-aux.mkiv"> + <cd:command name="doifundefinedelse" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -396,7 +396,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifelsedefined" file="syst-aux.mkiv"> + <cd:command name="doifelsedefined" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -404,7 +404,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifdefinedelse" file="syst-aux.mkiv"> + <cd:command name="doifdefinedelse" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -412,39 +412,39 @@ </cd:arguments> </cd:command> - <cd:command name="doifundefined" file="syst-aux.mkiv"> + <cd:command name="doifundefined" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> </cd:arguments> </cd:command> - <cd:command name="doifdefined" file="syst-aux.mkiv"> + <cd:command name="doifdefined" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> </cd:arguments> </cd:command> - <cd:command name="letbeundefined" file="syst-aux.mkiv"> + <cd:command name="letbeundefined" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="localundefine" file="syst-aux.mkiv"> + <cd:command name="localundefine" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="globalundefine" file="syst-aux.mkiv"> + <cd:command name="globalundefine" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="doifelsealldefined" file="syst-aux.mkiv"> + <cd:command name="doifelsealldefined" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name-list"/> <cd:resolve name="argument-true"/> @@ -452,7 +452,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifalldefinedelse" file="syst-aux.mkiv"> + <cd:command name="doifalldefinedelse" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name-list"/> <cd:resolve name="argument-true"/> @@ -460,7 +460,7 @@ </cd:arguments> </cd:command> - <cd:command name="doif" file="syst-aux.mkiv"> + <cd:command name="doif" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:content/> <cd:content/> @@ -468,7 +468,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifnot" file="syst-aux.mkiv"> + <cd:command name="doifnot" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:content/> <cd:content/> @@ -476,7 +476,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifelse" file="syst-aux.mkiv"> + <cd:command name="doifelse" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:content/> <cd:content/> @@ -485,7 +485,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifelseempty" file="syst-aux.mkiv"> + <cd:command name="doifelseempty" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:content/> <cd:resolve name="argument-true"/> @@ -493,7 +493,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifemptyelse" file="syst-aux.mkiv"> + <cd:command name="doifemptyelse" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:content/> <cd:resolve name="argument-true"/> @@ -501,161 +501,161 @@ </cd:arguments> </cd:command> - <cd:command name="doifempty" file="syst-aux.mkiv"> + <cd:command name="doifempty" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:content/> <cd:resolve name="argument-true"/> </cd:arguments> </cd:command> - <cd:command name="doifnotempty" file="syst-aux.mkiv"> + <cd:command name="doifnotempty" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:content/> <cd:resolve name="argument-true"/> </cd:arguments> </cd:command> - <cd:command name="doifelseinset" file="syst-aux.mkiv"> + <cd:command name="doifelseinset" level="system" file="syst-aux.mkiv"> <cd:arguments> - <cd:content/> - <cd:resolve name="argument-content-list"/> + <cd:resolve name="argument-text"/> + <cd:resolve name="argument-text-list"/> <cd:resolve name="argument-true"/> <cd:resolve name="argument-false"/> </cd:arguments> </cd:command> - <cd:command name="doifinsetelse" file="syst-aux.mkiv"> + <cd:command name="doifinsetelse" level="system" file="syst-aux.mkiv"> <cd:arguments> - <cd:content/> - <cd:resolve name="argument-content-list"/> + <cd:resolve name="argument-text"/> + <cd:resolve name="argument-text-list"/> <cd:resolve name="argument-true"/> <cd:resolve name="argument-false"/> </cd:arguments> </cd:command> - <cd:command name="doifinset" file="syst-aux.mkiv"> + <cd:command name="doifinset" level="system" file="syst-aux.mkiv"> <cd:arguments> - <cd:content/> - <cd:resolve name="argument-content-list"/> + <cd:resolve name="argument-text"/> + <cd:resolve name="argument-text-list"/> <cd:resolve name="argument-true"/> </cd:arguments> </cd:command> - <cd:command name="doifnotinset" file="syst-aux.mkiv"> + <cd:command name="doifnotinset" level="system" file="syst-aux.mkiv"> <cd:arguments> - <cd:content/> - <cd:resolve name="argument-content-list"/> + <cd:resolve name="argument-text"/> + <cd:resolve name="argument-text-list"/> <cd:resolve name="argument-true"/> </cd:arguments> </cd:command> - <cd:command name="doifelsecommon" file="syst-aux.mkiv"> + <cd:command name="doifelsecommon" level="system" file="syst-aux.mkiv"> <cd:arguments> - <cd:resolve name="argument-content-list"/> - <cd:resolve name="argument-content-list"/> + <cd:resolve name="argument-text-list"/> + <cd:resolve name="argument-text-list"/> <cd:resolve name="argument-true"/> <cd:resolve name="argument-false"/> </cd:arguments> </cd:command> - <cd:command name="doifcommonelse" file="syst-aux.mkiv"> + <cd:command name="doifcommonelse" level="system" file="syst-aux.mkiv"> <cd:arguments> - <cd:resolve name="argument-content-list"/> - <cd:resolve name="argument-content-list"/> + <cd:resolve name="argument-text-list"/> + <cd:resolve name="argument-text-list"/> <cd:resolve name="argument-true"/> <cd:resolve name="argument-false"/> </cd:arguments> </cd:command> - <cd:command name="doifcommon" file="syst-aux.mkiv"> + <cd:command name="doifcommon" level="system" file="syst-aux.mkiv"> <cd:arguments> - <cd:resolve name="argument-content-list"/> - <cd:resolve name="argument-content-list"/> + <cd:resolve name="argument-text-list"/> + <cd:resolve name="argument-text-list"/> <cd:resolve name="argument-true"/> </cd:arguments> </cd:command> - <cd:command name="doifnotcommon" file="syst-aux.mkiv"> + <cd:command name="doifnotcommon" level="system" file="syst-aux.mkiv"> <cd:arguments> - <cd:resolve name="argument-content-list"/> - <cd:resolve name="argument-content-list"/> + <cd:resolve name="argument-text-list"/> + <cd:resolve name="argument-text-list"/> <cd:resolve name="argument-true"/> </cd:arguments> </cd:command> - <cd:command name="processcommalist" file="syst-aux.mkiv"> + <cd:command name="processcommalist" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="keyword-command-list"/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="quitcommalist" file="syst-aux.mkiv"/> + <cd:command name="quitcommalist" level="system" file="syst-aux.mkiv"/> - <cd:command name="quitprevcommalist" file="syst-aux.mkiv"/> + <cd:command name="quitprevcommalist" level="system" file="syst-aux.mkiv"/> - <cd:command name="processcommacommand" file="syst-aux.mkiv"> + <cd:command name="processcommacommand" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="keyword-command-list"/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="processcommalistwithparameters" file="syst-aux.mkiv"> + <cd:command name="processcommalistwithparameters" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="keyword-command-list"/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="processcommalist" type="environment" file="syst-aux.mkiv"> + <cd:command name="processcommalist" type="environment" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="keyword-command-list"/> </cd:arguments> </cd:command> - <cd:command name="processcommacommand" type="environment" file="syst-aux.mkiv"> + <cd:command name="processcommacommand" type="environment" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="keyword-command-list"/> </cd:arguments> </cd:command> - <cd:command name="currentcommalistitem" file="syst-aux.mkiv"/> + <cd:command name="currentcommalistitem" level="system" file="syst-aux.mkiv"/> - <cd:command name="processaction" file="syst-aux.mkiv"> + <cd:command name="processaction" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="keyword-command"/> <cd:apply list="yes"/> </cd:arguments> </cd:command> - <cd:command name="processfirstactioninset" file="syst-aux.mkiv"> + <cd:command name="processfirstactioninset" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="keyword-command"/> <cd:apply list="yes"/> </cd:arguments> </cd:command> - <cd:command name="processallactionsinset" file="syst-aux.mkiv"> + <cd:command name="processallactionsinset" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="keyword-command"/> <cd:apply list="yes"/> </cd:arguments> </cd:command> - <cd:command name="commalistelement" file="syst-aux.mkiv"/> + <cd:command name="commalistelement" level="system" file="syst-aux.mkiv"/> - <cd:command name="firstcharacter" file="syst-aux.mkiv"/> + <cd:command name="firstcharacter" level="system" file="syst-aux.mkiv"/> - <cd:command name="remainingcharacters" file="syst-aux.mkiv"/> + <cd:command name="remainingcharacters" level="system" file="syst-aux.mkiv"/> - <cd:command name="getfirstcharacter" file="syst-aux.mkiv"> + <cd:command name="getfirstcharacter" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="doifelsefirstchar" file="syst-aux.mkiv"> + <cd:command name="doifelsefirstchar" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-text"/> @@ -664,7 +664,7 @@ </cd:arguments> </cd:command> - <cd:command name="doiffirstcharelse" file="syst-aux.mkiv"> + <cd:command name="doiffirstcharelse" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-text"/> @@ -673,19 +673,19 @@ </cd:arguments> </cd:command> - <cd:command name="thefirstcharacter" file="syst-aux.mkiv"> + <cd:command name="thefirstcharacter" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="theremainingcharacters" file="syst-aux.mkiv"> + <cd:command name="theremainingcharacters" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="doifelseinstring" file="syst-aux.mkiv"> + <cd:command name="doifelseinstring" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-text"/> @@ -694,7 +694,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifinstringelse" file="syst-aux.mkiv"> + <cd:command name="doifinstringelse" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-text"/> @@ -703,7 +703,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifinstring" file="syst-aux.mkiv"> + <cd:command name="doifinstring" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-text"/> @@ -711,7 +711,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifnotinstring" file="syst-aux.mkiv"> + <cd:command name="doifnotinstring" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-text"/> @@ -719,7 +719,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifelseincsname" file="syst-aux.mkiv"> + <cd:command name="doifelseincsname" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-csname"/> @@ -728,7 +728,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifincsnameelse" file="syst-aux.mkiv"> + <cd:command name="doifincsnameelse" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-csname"/> @@ -737,7 +737,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifelsenumber" file="syst-aux.mkiv"> + <cd:command name="doifelsenumber" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-true"/> @@ -745,7 +745,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifnumberelse" file="syst-aux.mkiv"> + <cd:command name="doifnumberelse" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-true"/> @@ -753,21 +753,21 @@ </cd:arguments> </cd:command> - <cd:command name="doifnumber" file="syst-aux.mkiv"> + <cd:command name="doifnumber" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-true"/> </cd:arguments> </cd:command> - <cd:command name="doifnotnumber" file="syst-aux.mkiv"> + <cd:command name="doifnotnumber" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-true"/> </cd:arguments> </cd:command> - <cd:command name="percentdimen" file="syst-aux.mkiv"> + <cd:command name="percentdimen" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:dimension"/> @@ -780,7 +780,7 @@ </cd:arguments> </cd:command> - <cd:command name="setpercentdimen" file="syst-aux.mkiv"> + <cd:command name="setpercentdimen" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:dimension"/> @@ -793,170 +793,170 @@ </cd:arguments> </cd:command> - <cd:command name="makerawcommalist" file="syst-aux.mkiv"> + <cd:command name="makerawcommalist" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="keyword-command-list"/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="rawprocesscommalist" file="syst-aux.mkiv"> + <cd:command name="rawprocesscommalist" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="keyword-command-list"/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="rawprocesscommacommand" file="syst-aux.mkiv"> + <cd:command name="rawprocesscommacommand" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="keyword-command-list"/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="rawdoifelseinset" file="syst-aux.mkiv"> + <cd:command name="rawdoifelseinset" level="system" file="syst-aux.mkiv"> <cd:arguments> - <cd:content/> - <cd:resolve name="argument-content-list"/> + <cd:resolve name="argument-text"/> + <cd:resolve name="argument-text-list"/> <cd:resolve name="argument-true"/> <cd:resolve name="argument-false"/> </cd:arguments> </cd:command> - <cd:command name="rawdoifinsetelse" file="syst-aux.mkiv"> + <cd:command name="rawdoifinsetelse" level="system" file="syst-aux.mkiv"> <cd:arguments> - <cd:content/> - <cd:resolve name="argument-content-list"/> + <cd:resolve name="argument-text"/> + <cd:resolve name="argument-text-list"/> <cd:resolve name="argument-true"/> <cd:resolve name="argument-false"/> </cd:arguments> </cd:command> - <cd:command name="rawdoifinset" file="syst-aux.mkiv"> + <cd:command name="rawdoifinset" level="system" file="syst-aux.mkiv"> <cd:arguments> - <cd:content/> - <cd:resolve name="argument-content-list"/> + <cd:resolve name="argument-text"/> + <cd:resolve name="argument-text-list"/> <cd:resolve name="argument-true"/> </cd:arguments> </cd:command> - <cd:command name="rawprocessaction" file="syst-aux.mkiv"> + <cd:command name="rawprocessaction" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="keyword-command"/> <cd:apply list="yes"/> </cd:arguments> </cd:command> - <cd:command name="currentvalue" file="syst-aux.mkiv"/> + <cd:command name="currentvalue" level="system" file="syst-aux.mkiv"/> - <cd:command name="getparameters" file="syst-aux.mkiv"> + <cd:command name="getparameters" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="keyword-text"/> <cd:resolve name="assignment-userdata-list"/> </cd:arguments> </cd:command> - <cd:command name="geteparameters" file="syst-aux.mkiv"> + <cd:command name="geteparameters" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="keyword-text"/> <cd:resolve name="assignment-userdata-list"/> </cd:arguments> </cd:command> - <cd:command name="getgparameters" file="syst-aux.mkiv"> + <cd:command name="getgparameters" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="keyword-text"/> <cd:resolve name="assignment-userdata-list"/> </cd:arguments> </cd:command> - <cd:command name="getxparameters" file="syst-aux.mkiv"> + <cd:command name="getxparameters" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="keyword-text"/> <cd:resolve name="assignment-userdata-list"/> </cd:arguments> </cd:command> - <cd:command name="forgetparameters" file="syst-aux.mkiv"> + <cd:command name="forgetparameters" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="keyword-text"/> <cd:resolve name="assignment-userdata-list"/> </cd:arguments> </cd:command> - <cd:command name="getexpandedparameters" file="syst-aux.mkiv"> + <cd:command name="getexpandedparameters" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="keyword-text"/> <cd:resolve name="assignment-userdata-list"/> </cd:arguments> </cd:command> - <cd:command name="doassign" file="syst-aux.mkiv"> + <cd:command name="doassign" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="keyword-text"/> <cd:resolve name="assignment-userdata"/> </cd:arguments> </cd:command> - <cd:command name="doeassign" file="syst-aux.mkiv"> + <cd:command name="doeassign" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="keyword-text"/> <cd:resolve name="assignment-userdata"/> </cd:arguments> </cd:command> - <cd:command name="undoassign" file="syst-aux.mkiv"> + <cd:command name="undoassign" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="keyword-text"/> <cd:resolve name="assignment-userdata"/> </cd:arguments> </cd:command> - <cd:command name="doassignempty" file="syst-aux.mkiv"> + <cd:command name="doassignempty" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="keyword-text"/> <cd:resolve name="assignment-userdata"/> </cd:arguments> </cd:command> - <cd:command name="processassignmentlist" file="syst-aux.mkiv"> + <cd:command name="processassignmentlist" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="assignment-userdata-list"/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="processassignmentcommand" file="syst-aux.mkiv"> + <cd:command name="processassignmentcommand" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="assignment-userdata-list"/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="processassignmentlist" type="environment" file="syst-aux.mkiv"> + <cd:command name="processassignmentlist" type="environment" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="assignment-userdata-list"/> </cd:arguments> </cd:command> - <cd:command name="processassignmentcommand" type="environment" file="syst-aux.mkiv"> + <cd:command name="processassignmentcommand" type="environment" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="assignment-userdata-list"/> </cd:arguments> </cd:command> - <cd:command name="currentassignmentlistkey" file="syst-aux.mkiv"/> + <cd:command name="currentassignmentlistkey" level="system" file="syst-aux.mkiv"/> - <cd:command name="currentassignmentlistvalue" file="syst-aux.mkiv"/> + <cd:command name="currentassignmentlistvalue" level="system" file="syst-aux.mkiv"/> - <cd:command name="getemptyparameters" file="syst-aux.mkiv"> + <cd:command name="getemptyparameters" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="keyword-text"/> <cd:resolve name="assignment-userdata-list"/> </cd:arguments> </cd:command> - <cd:command name="copyparameters" file="syst-aux.mkiv"> + <cd:command name="copyparameters" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="keyword-text"/> <cd:resolve name="keyword-text"/> @@ -964,13 +964,13 @@ </cd:arguments> </cd:command> - <cd:command name="checkparameters" file="syst-aux.mkiv"> + <cd:command name="checkparameters" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="keyword-text"/> </cd:arguments> </cd:command> - <cd:command name="ifparameters" file="syst-aux.mkiv"> + <cd:command name="ifparameters" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="string-true"/> <cd:delimiter name="else"/> @@ -979,35 +979,35 @@ </cd:arguments> </cd:command> - <cd:command name="commalistsize" file="syst-aux.mkiv"/> + <cd:command name="commalistsize" level="system" file="syst-aux.mkiv"/> - <cd:command name="getcommalistsize" file="syst-aux.mkiv"> + <cd:command name="getcommalistsize" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="keyword-command-list"/> </cd:arguments> </cd:command> - <cd:command name="getcommacommandsize" file="syst-aux.mkiv"> + <cd:command name="getcommacommandsize" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="keyword-command-list"/> </cd:arguments> </cd:command> - <cd:command name="getfromcommalist" file="syst-aux.mkiv"> + <cd:command name="getfromcommalist" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="keyword-command-list"/> <cd:resolve name="keyword-number"/> </cd:arguments> </cd:command> - <cd:command name="getfromcommacommand" file="syst-aux.mkiv"> + <cd:command name="getfromcommacommand" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="keyword-command-list"/> <cd:resolve name="keyword-number"/> </cd:arguments> </cd:command> - <cd:command name="dogetcommacommandelement" file="syst-aux.mkiv"> + <cd:command name="dogetcommacommandelement" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="string-number"/> <cd:delimiter name="from"/> @@ -1017,14 +1017,14 @@ </cd:arguments> </cd:command> - <cd:command name="dosingleempty" file="syst-aux.mkiv"> + <cd:command name="dosingleempty" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="keyword-dummy-optional"/> </cd:arguments> </cd:command> - <cd:command name="dodoubleempty" file="syst-aux.mkiv"> + <cd:command name="dodoubleempty" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="keyword-dummy-optional"/> @@ -1032,7 +1032,7 @@ </cd:arguments> </cd:command> - <cd:command name="dotripleempty" file="syst-aux.mkiv"> + <cd:command name="dotripleempty" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="keyword-dummy-optional"/> @@ -1041,7 +1041,7 @@ </cd:arguments> </cd:command> - <cd:command name="doquadrupleempty" file="syst-aux.mkiv"> + <cd:command name="doquadrupleempty" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="keyword-dummy-optional"/> @@ -1051,7 +1051,7 @@ </cd:arguments> </cd:command> - <cd:command name="doquintupleempty" file="syst-aux.mkiv"> + <cd:command name="doquintupleempty" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="keyword-dummy-optional"/> @@ -1062,7 +1062,7 @@ </cd:arguments> </cd:command> - <cd:command name="dosixtupleempty" file="syst-aux.mkiv"> + <cd:command name="dosixtupleempty" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="keyword-dummy-optional"/> @@ -1074,7 +1074,7 @@ </cd:arguments> </cd:command> - <cd:command name="doseventupleempty" file="syst-aux.mkiv"> + <cd:command name="doseventupleempty" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="keyword-dummy-optional"/> @@ -1087,14 +1087,14 @@ </cd:arguments> </cd:command> - <cd:command name="dosingleargument" file="syst-aux.mkiv"> + <cd:command name="dosingleargument" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="keyword-dummy"/> </cd:arguments> </cd:command> - <cd:command name="dodoubleargument" file="syst-aux.mkiv"> + <cd:command name="dodoubleargument" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="keyword-dummy"/> @@ -1102,7 +1102,7 @@ </cd:arguments> </cd:command> - <cd:command name="dotripleargument" file="syst-aux.mkiv"> + <cd:command name="dotripleargument" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="keyword-dummy"/> @@ -1111,7 +1111,7 @@ </cd:arguments> </cd:command> - <cd:command name="doquadrupleargument" file="syst-aux.mkiv"> + <cd:command name="doquadrupleargument" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="keyword-dummy"/> @@ -1121,7 +1121,7 @@ </cd:arguments> </cd:command> - <cd:command name="doquintupleargument" file="syst-aux.mkiv"> + <cd:command name="doquintupleargument" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="keyword-dummy"/> @@ -1132,7 +1132,7 @@ </cd:arguments> </cd:command> - <cd:command name="dosixtupleargument" file="syst-aux.mkiv"> + <cd:command name="dosixtupleargument" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="keyword-dummy"/> @@ -1144,7 +1144,7 @@ </cd:arguments> </cd:command> - <cd:command name="doseventupleargument" file="syst-aux.mkiv"> + <cd:command name="doseventupleargument" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="keyword-dummy"/> @@ -1157,13 +1157,13 @@ </cd:arguments> </cd:command> - <cd:command name="strippedcsname" file="syst-aux.mkiv"> + <cd:command name="strippedcsname" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="strippedcsname" variant="string" file="syst-aux.mkiv"> + <cd:command name="strippedcsname" variant="string" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:keywords delimiters="none"> <cd:constant type="cd:text"/> @@ -1171,13 +1171,13 @@ </cd:arguments> </cd:command> - <cd:command name="complexorsimple" file="syst-aux.mkiv"> + <cd:command name="complexorsimple" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="complexorsimple" variant="argument" file="syst-aux.mkiv"> + <cd:command name="complexorsimple" variant="argument" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -1186,13 +1186,13 @@ </cd:arguments> </cd:command> - <cd:command name="complexorsimpleempty" file="syst-aux.mkiv"> + <cd:command name="complexorsimpleempty" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="complexorsimpleempty" variant="argument" file="syst-aux.mkiv"> + <cd:command name="complexorsimpleempty" variant="argument" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -1201,13 +1201,13 @@ </cd:arguments> </cd:command> - <cd:command name="definecomplexorsimple" file="syst-aux.mkiv"> + <cd:command name="definecomplexorsimple" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="definecomplexorsimple" variant="argument" file="syst-aux.mkiv"> + <cd:command name="definecomplexorsimple" variant="argument" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -1216,13 +1216,13 @@ </cd:arguments> </cd:command> - <cd:command name="definecomplexorsimpleempty" file="syst-aux.mkiv"> + <cd:command name="definecomplexorsimpleempty" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="definecomplexorsimpleempty" variant="argument" file="syst-aux.mkiv"> + <cd:command name="definecomplexorsimpleempty" variant="argument" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:keywords delimiters="braces"> <cd:constant type="cd:text"/> @@ -1231,18 +1231,18 @@ </cd:arguments> </cd:command> - <cd:command name="permitspacesbetweengroups" file="syst-aux.mkiv"/> + <cd:command name="permitspacesbetweengroups" level="system" file="syst-aux.mkiv"/> - <cd:command name="dontpermitspacesbetweengroups" file="syst-aux.mkiv"/> + <cd:command name="dontpermitspacesbetweengroups" level="system" file="syst-aux.mkiv"/> - <cd:command name="dosinglegroupempty" file="syst-aux.mkiv"> + <cd:command name="dosinglegroupempty" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-dummy-optional"/> </cd:arguments> </cd:command> - <cd:command name="dodoublegroupempty" file="syst-aux.mkiv"> + <cd:command name="dodoublegroupempty" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-dummy-optional"/> @@ -1250,7 +1250,7 @@ </cd:arguments> </cd:command> - <cd:command name="dotriplegroupempty" file="syst-aux.mkiv"> + <cd:command name="dotriplegroupempty" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-dummy-optional"/> @@ -1259,7 +1259,7 @@ </cd:arguments> </cd:command> - <cd:command name="doquadruplegroupempty" file="syst-aux.mkiv"> + <cd:command name="doquadruplegroupempty" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-dummy-optional"/> @@ -1269,7 +1269,7 @@ </cd:arguments> </cd:command> - <cd:command name="doquintuplegroupempty" file="syst-aux.mkiv"> + <cd:command name="doquintuplegroupempty" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-dummy-optional"/> @@ -1280,27 +1280,27 @@ </cd:arguments> </cd:command> - <cd:command name="firstofoneargument" file="syst-aux.mkiv"> + <cd:command name="firstofoneargument" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-dummy"/> </cd:arguments> </cd:command> - <cd:command name="firstoftwoarguments" file="syst-aux.mkiv"> + <cd:command name="firstoftwoarguments" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-dummy"/> <cd:resolve name="argument-dummy"/> </cd:arguments> </cd:command> - <cd:command name="secondoftwoarguments" file="syst-aux.mkiv"> + <cd:command name="secondoftwoarguments" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-dummy"/> <cd:resolve name="argument-dummy"/> </cd:arguments> </cd:command> - <cd:command name="firstofthreearguments" file="syst-aux.mkiv"> + <cd:command name="firstofthreearguments" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-dummy"/> <cd:resolve name="argument-dummy"/> @@ -1308,7 +1308,7 @@ </cd:arguments> </cd:command> - <cd:command name="secondofthreearguments" file="syst-aux.mkiv"> + <cd:command name="secondofthreearguments" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-dummy"/> <cd:resolve name="argument-dummy"/> @@ -1316,7 +1316,7 @@ </cd:arguments> </cd:command> - <cd:command name="thirdofthreearguments" file="syst-aux.mkiv"> + <cd:command name="thirdofthreearguments" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-dummy"/> <cd:resolve name="argument-dummy"/> @@ -1324,7 +1324,7 @@ </cd:arguments> </cd:command> - <cd:command name="firstoffourarguments" file="syst-aux.mkiv"> + <cd:command name="firstoffourarguments" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-dummy"/> <cd:resolve name="argument-dummy"/> @@ -1333,7 +1333,7 @@ </cd:arguments> </cd:command> - <cd:command name="secondoffourarguments" file="syst-aux.mkiv"> + <cd:command name="secondoffourarguments" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-dummy"/> <cd:resolve name="argument-dummy"/> @@ -1342,7 +1342,7 @@ </cd:arguments> </cd:command> - <cd:command name="thirdoffourarguments" file="syst-aux.mkiv"> + <cd:command name="thirdoffourarguments" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-dummy"/> <cd:resolve name="argument-dummy"/> @@ -1351,7 +1351,7 @@ </cd:arguments> </cd:command> - <cd:command name="fourthoffourarguments" file="syst-aux.mkiv"> + <cd:command name="fourthoffourarguments" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-dummy"/> <cd:resolve name="argument-dummy"/> @@ -1360,7 +1360,7 @@ </cd:arguments> </cd:command> - <cd:command name="firstoffivearguments" file="syst-aux.mkiv"> + <cd:command name="firstoffivearguments" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-dummy"/> <cd:resolve name="argument-dummy"/> @@ -1370,7 +1370,7 @@ </cd:arguments> </cd:command> - <cd:command name="secondoffivearguments" file="syst-aux.mkiv"> + <cd:command name="secondoffivearguments" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-dummy"/> <cd:resolve name="argument-dummy"/> @@ -1380,7 +1380,7 @@ </cd:arguments> </cd:command> - <cd:command name="thirdoffivearguments" file="syst-aux.mkiv"> + <cd:command name="thirdoffivearguments" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-dummy"/> <cd:resolve name="argument-dummy"/> @@ -1390,7 +1390,7 @@ </cd:arguments> </cd:command> - <cd:command name="fourthoffivearguments" file="syst-aux.mkiv"> + <cd:command name="fourthoffivearguments" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-dummy"/> <cd:resolve name="argument-dummy"/> @@ -1400,7 +1400,7 @@ </cd:arguments> </cd:command> - <cd:command name="fifthoffivearguments" file="syst-aux.mkiv"> + <cd:command name="fifthoffivearguments" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-dummy"/> <cd:resolve name="argument-dummy"/> @@ -1410,7 +1410,7 @@ </cd:arguments> </cd:command> - <cd:command name="firstofsixarguments" file="syst-aux.mkiv"> + <cd:command name="firstofsixarguments" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-dummy"/> <cd:resolve name="argument-dummy"/> @@ -1421,7 +1421,7 @@ </cd:arguments> </cd:command> - <cd:command name="secondofsixarguments" file="syst-aux.mkiv"> + <cd:command name="secondofsixarguments" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-dummy"/> <cd:resolve name="argument-dummy"/> @@ -1432,7 +1432,7 @@ </cd:arguments> </cd:command> - <cd:command name="thirdofsixarguments" file="syst-aux.mkiv"> + <cd:command name="thirdofsixarguments" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-dummy"/> <cd:resolve name="argument-dummy"/> @@ -1443,7 +1443,7 @@ </cd:arguments> </cd:command> - <cd:command name="fourthofsixarguments" file="syst-aux.mkiv"> + <cd:command name="fourthofsixarguments" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-dummy"/> <cd:resolve name="argument-dummy"/> @@ -1454,7 +1454,7 @@ </cd:arguments> </cd:command> - <cd:command name="fifthofsixarguments" file="syst-aux.mkiv"> + <cd:command name="fifthofsixarguments" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-dummy"/> <cd:resolve name="argument-dummy"/> @@ -1465,7 +1465,7 @@ </cd:arguments> </cd:command> - <cd:command name="sixthofsixarguments" file="syst-aux.mkiv"> + <cd:command name="sixthofsixarguments" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-dummy"/> <cd:resolve name="argument-dummy"/> @@ -1476,27 +1476,27 @@ </cd:arguments> </cd:command> - <cd:command name="firstofoneunexpanded" file="syst-aux.mkiv"> + <cd:command name="firstofoneunexpanded" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-dummy"/> </cd:arguments> </cd:command> - <cd:command name="firstoftwounexpanded" file="syst-aux.mkiv"> + <cd:command name="firstoftwounexpanded" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-dummy"/> <cd:resolve name="argument-dummy"/> </cd:arguments> </cd:command> - <cd:command name="secondoftwounexpanded" file="syst-aux.mkiv"> + <cd:command name="secondoftwounexpanded" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-dummy"/> <cd:resolve name="argument-dummy"/> </cd:arguments> </cd:command> - <cd:command name="firstofthreeunexpanded" file="syst-aux.mkiv"> + <cd:command name="firstofthreeunexpanded" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-dummy"/> <cd:resolve name="argument-dummy"/> @@ -1504,7 +1504,7 @@ </cd:arguments> </cd:command> - <cd:command name="secondofthreeunexpanded" file="syst-aux.mkiv"> + <cd:command name="secondofthreeunexpanded" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-dummy"/> <cd:resolve name="argument-dummy"/> @@ -1512,7 +1512,7 @@ </cd:arguments> </cd:command> - <cd:command name="thirdofthreeunexpanded" file="syst-aux.mkiv"> + <cd:command name="thirdofthreeunexpanded" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-dummy"/> <cd:resolve name="argument-dummy"/> @@ -1520,56 +1520,56 @@ </cd:arguments> </cd:command> - <cd:command name="letempty" file="syst-aux.mkiv"> + <cd:command name="letempty" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="globalletempty" file="syst-aux.mkiv"> + <cd:command name="globalletempty" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="letvalueempty" file="syst-aux.mkiv"> + <cd:command name="letvalueempty" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="letgvalueempty" file="syst-aux.mkiv"> + <cd:command name="letgvalueempty" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="letvaluerelax" file="syst-aux.mkiv"> + <cd:command name="letvaluerelax" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="letgvalurelax" file="syst-aux.mkiv"> + <cd:command name="letgvalurelax" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="relaxvalueifundefined" file="syst-aux.mkiv"> + <cd:command name="relaxvalueifundefined" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="rawgetparameters" file="syst-aux.mkiv"> + <cd:command name="rawgetparameters" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="keyword-text"/> <cd:resolve name="assignment-userdata-list"/> </cd:arguments> </cd:command> - <cd:command name="texdefinition" type="environment" file="syst-aux.mkiv"> + <cd:command name="texdefinition" type="environment" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:keywords delimiters="none" optional="yes"> <cd:constant type="spaces"/> @@ -1584,6 +1584,20 @@ <cd:keywords delimiters="none" optional="yes"> <cd:constant type="expanded"/> </cd:keywords> + <cd:keywords delimiters="none" optional="yes"> + <cd:constant type="singleempty"/> + <cd:constant type="doubleempty"/> + <cd:constant type="tripleempty"/> + <cd:constant type="quadrupleempty"/> + <cd:constant type="quintupleempty"/> + <cd:constant type="sixtupleempty"/> + <cd:constant type="singleargument"/> + <cd:constant type="doubleargument"/> + <cd:constant type="tripleargument"/> + <cd:constant type="quadrupleargument"/> + <cd:constant type="quintupleargument"/> + <cd:constant type="sixtupleargument"/> + </cd:keywords> <cd:keywords delimiters="none"> <cd:constant type="cd:name"/> </cd:keywords> @@ -1593,39 +1607,39 @@ </cd:arguments> </cd:command> - <cd:command name="texdefinition" file="syst-aux.mkiv"> + <cd:command name="texdefinition" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="texcode" type="environment" file="syst-aux.mkiv"/> + <cd:command name="texcode" type="environment" level="system" file="syst-aux.mkiv"/> - <cd:command name="newcounter" file="syst-aux.mkiv"> + <cd:command name="newcounter" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="fastincrement" file="syst-aux.mkiv"> + <cd:command name="fastincrement" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="fastdecrement" file="syst-aux.mkiv"> + <cd:command name="fastdecrement" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="increment" file="syst-aux.mkiv"> + <cd:command name="increment" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="increment" variant="argument" file="syst-aux.mkiv"> + <cd:command name="increment" variant="argument" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:keywords delimiters="parentheses" list="yes"> <cd:constant type="cd:csname"/> @@ -1634,13 +1648,13 @@ </cd:arguments> </cd:command> - <cd:command name="decrement" file="syst-aux.mkiv"> + <cd:command name="decrement" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="decrement" variant="argument" file="syst-aux.mkiv"> + <cd:command name="decrement" variant="argument" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:keywords delimiters="parentheses" list="yes"> <cd:constant type="cd:csname"/> @@ -1649,47 +1663,49 @@ </cd:arguments> </cd:command> - <cd:command name="incrementvalue" file="syst-aux.mkiv"> + <cd:command name="incrementvalue" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="decrementvalue" file="syst-aux.mkiv"> + <cd:command name="decrementvalue" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="newsignal" file="syst-aux.mkiv"> + <cd:command name="newsignal" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="checkedstrippedcsname" file="syst-aux.mkiv"> + <cd:command name="checkedstrippedcsname" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="checkedstrippedcsname" variant="string" file="syst-aux.mkiv"> + <cd:command name="checkedstrippedcsname" variant="string" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="string-text"/> </cd:arguments> </cd:command> - <cd:command name="savenormalmeaning" file="syst-aux.mkiv"> + <cd:command name="savenormalmeaning" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="recursedepth" file="syst-aux.mkiv"/> + <cd:command name="recursedepth" level="system" file="syst-aux.mkiv"/> - <cd:command name="recurselevel" file="syst-aux.mkiv"/> + <cd:command name="recurselevel" level="system" file="syst-aux.mkiv"/> - <cd:command name="dostepwiserecurse" file="syst-aux.mkiv"> + <cd:command name="resetrecurselevel" level="system" file="syst-aux.mkiv"/> + + <cd:command name="dostepwiserecurse" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> <cd:resolve name="argument-number"/> @@ -1700,75 +1716,79 @@ </cd:arguments> </cd:command> - <cd:command name="dorecurse" file="syst-aux.mkiv"> + <cd:command name="dorecurse" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> <cd:resolve name="argument-command"/> </cd:arguments> </cd:command> - <cd:command name="doexpandedrecurse" file="syst-aux.mkiv"> + <cd:command name="doexpandedrecurse" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> <cd:resolve name="argument-command"/> </cd:arguments> </cd:command> - <cd:command name="dowith" file="syst-aux.mkiv"> + <cd:command name="dowith" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-command-list"/> <cd:resolve name="argument-command"/> </cd:arguments> </cd:command> - <cd:command name="doloop" file="syst-aux.mkiv"> + <cd:command name="doloop" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-command"/> </cd:arguments> </cd:command> - <cd:command name="exitloop" file="syst-aux.mkiv"/> + <cd:command name="exitloop" level="system" file="syst-aux.mkiv"/> - <cd:command name="exitloopnow" file="syst-aux.mkiv"/> + <cd:command name="exitloopnow" level="system" file="syst-aux.mkiv"/> - <cd:command name="dorecurse" file="syst-aux.mkiv"> + <cd:command name="dofastloopcs" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="doloopoverlist" file="syst-aux.mkiv"> + <cd:command name="fastloopindex" level="system" file="syst-aux.mkiv"/> + + <cd:command name="fastloopfinal" level="system" file="syst-aux.mkiv"/> + + <cd:command name="doloopoverlist" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-text-list"/> <cd:resolve name="argument-command"/> </cd:arguments> </cd:command> - <cd:command name="recursestring" file="syst-aux.mkiv"/> + <cd:command name="recursestring" level="system" file="syst-aux.mkiv"/> - <cd:command name="newevery" file="syst-aux.mkiv"> + <cd:command name="newevery" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="EveryPar" file="syst-aux.mkiv"> + <cd:command name="EveryPar" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-command"/> </cd:arguments> </cd:command> - <cd:command name="EveryLine" file="syst-aux.mkiv"> + <cd:command name="EveryLine" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-command"/> </cd:arguments> </cd:command> - <cd:command name="forgeteverypar" file="syst-aux.mkiv"/> + <cd:command name="forgeteverypar" level="system" file="syst-aux.mkiv"/> - <cd:command name="convertvalue" file="syst-aux.mkiv"> + <cd:command name="convertvalue" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="string-name"/> <cd:delimiter name="to"/> @@ -1776,14 +1796,14 @@ </cd:arguments> </cd:command> - <cd:command name="defconvertedvalue" file="syst-aux.mkiv"> + <cd:command name="defconvertedvalue" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="doifelseassignment" file="syst-aux.mkiv"> + <cd:command name="doifelseassignment" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-true"/> @@ -1791,7 +1811,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifassignmentelse" file="syst-aux.mkiv"> + <cd:command name="doifassignmentelse" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-true"/> @@ -1799,13 +1819,13 @@ </cd:arguments> </cd:command> - <cd:command name="docheckassignment" file="syst-aux.mkiv"> + <cd:command name="docheckassignment" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="ifassignment" file="syst-aux.mkiv"> + <cd:command name="ifassignment" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="string-true"/> <cd:delimiter name="else"/> @@ -1814,7 +1834,7 @@ </cd:arguments> </cd:command> - <cd:command name="convertargument" file="syst-aux.mkiv"> + <cd:command name="convertargument" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="string-text"/> <cd:delimiter name="to"/> @@ -1822,7 +1842,7 @@ </cd:arguments> </cd:command> - <cd:command name="convertcommand" file="syst-aux.mkiv"> + <cd:command name="convertcommand" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:delimiter name="to"/> @@ -1830,55 +1850,55 @@ </cd:arguments> </cd:command> - <cd:command name="defconvertedargument" file="syst-aux.mkiv"> + <cd:command name="defconvertedargument" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="defconvertedcommand" file="syst-aux.mkiv"> + <cd:command name="defconvertedcommand" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="edefconvertedargument" file="syst-aux.mkiv"> + <cd:command name="edefconvertedargument" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="gdefconvertedargument" file="syst-aux.mkiv"> + <cd:command name="gdefconvertedargument" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="gdefconvertedcommand" file="syst-aux.mkiv"> + <cd:command name="gdefconvertedcommand" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="xdefconvertedargument" file="syst-aux.mkiv"> + <cd:command name="xdefconvertedargument" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="showvalue" file="syst-aux.mkiv"> + <cd:command name="showvalue" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="doifelsemeaning" file="syst-aux.mkiv"> + <cd:command name="doifelsemeaning" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:csname/> @@ -1887,7 +1907,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifmeaningelse" file="syst-aux.mkiv"> + <cd:command name="doifmeaningelse" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:csname/> @@ -1896,7 +1916,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifelsesamestring" file="syst-aux.mkiv"> + <cd:command name="doifelsesamestring" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-text"/> @@ -1905,7 +1925,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifsamestringelse" file="syst-aux.mkiv"> + <cd:command name="doifsamestringelse" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-text"/> @@ -1914,7 +1934,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifsamestring" file="syst-aux.mkiv"> + <cd:command name="doifsamestring" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-text"/> @@ -1922,7 +1942,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifnotsamestring" file="syst-aux.mkiv"> + <cd:command name="doifnotsamestring" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-text"/> @@ -1930,7 +1950,7 @@ </cd:arguments> </cd:command> - <cd:command name="ConvertToConstant" file="syst-aux.mkiv"> + <cd:command name="ConvertToConstant" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-text"/> @@ -1938,7 +1958,7 @@ </cd:arguments> </cd:command> - <cd:command name="ConvertConstantAfter" file="syst-aux.mkiv"> + <cd:command name="ConvertConstantAfter" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-text"/> @@ -1946,61 +1966,61 @@ </cd:arguments> </cd:command> - <cd:command name="assignifempty" file="syst-aux.mkiv"> + <cd:command name="assignifempty" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-command"/> </cd:arguments> </cd:command> - <cd:command name="grabuntil" file="syst-aux.mkiv"> + <cd:command name="grabuntil" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="processbetween" file="syst-aux.mkiv"> + <cd:command name="processbetween" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="gobbleuntil" file="syst-aux.mkiv"> + <cd:command name="gobbleuntil" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="gobbleuntilrelax" file="syst-aux.mkiv"> + <cd:command name="gobbleuntilrelax" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="string-content"/> <cd:delimiter name="relax"/> </cd:arguments> </cd:command> - <cd:command name="processuntil" file="syst-aux.mkiv"> + <cd:command name="processuntil" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="groupedcommand" file="syst-aux.mkiv"> + <cd:command name="groupedcommand" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-command"/> <cd:resolve name="argument-command"/> </cd:arguments> </cd:command> - <cd:command name="simplegroupedcommand" file="syst-aux.mkiv"> + <cd:command name="simplegroupedcommand" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-command"/> <cd:resolve name="argument-command"/> </cd:arguments> </cd:command> - <cd:command name="pickupgroupedcommand" file="syst-aux.mkiv"> + <cd:command name="pickupgroupedcommand" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-command"/> <cd:resolve name="argument-command"/> @@ -2008,35 +2028,35 @@ </cd:arguments> </cd:command> - <cd:command name="BeforePar" file="syst-aux.mkiv"> + <cd:command name="BeforePar" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-command"/> </cd:arguments> </cd:command> - <cd:command name="AfterPar" file="syst-aux.mkiv"> + <cd:command name="AfterPar" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-command"/> </cd:arguments> </cd:command> - <cd:command name="GetPar" file="syst-aux.mkiv"/> + <cd:command name="GetPar" level="system" file="syst-aux.mkiv"/> - <cd:command name="GotoPar" file="syst-aux.mkiv"/> + <cd:command name="GotoPar" level="system" file="syst-aux.mkiv"/> - <cd:command name="dowithpargument" file="syst-aux.mkiv"> + <cd:command name="dowithpargument" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="dowithwargument" file="syst-aux.mkiv"> + <cd:command name="dowithwargument" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="dorepeatwithcommand" file="syst-aux.mkiv"> + <cd:command name="dorepeatwithcommand" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:keywords> <cd:constant type="cd:text"/> @@ -2046,7 +2066,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifelsestringinstring" file="syst-aux.mkiv"> + <cd:command name="doifelsestringinstring" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-text"/> @@ -2055,7 +2075,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifstringinstringelse" file="syst-aux.mkiv"> + <cd:command name="doifstringinstringelse" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-text"/> @@ -2064,7 +2084,7 @@ </cd:arguments> </cd:command> - <cd:command name="appendtoks" file="syst-aux.mkiv"> + <cd:command name="appendtoks" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="string-command"/> <cd:delimiter name="to"/> @@ -2072,7 +2092,7 @@ </cd:arguments> </cd:command> - <cd:command name="prependtoks" file="syst-aux.mkiv"> + <cd:command name="prependtoks" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="string-command"/> <cd:delimiter name="to"/> @@ -2080,7 +2100,7 @@ </cd:arguments> </cd:command> - <cd:command name="appendtoksonce" file="syst-aux.mkiv"> + <cd:command name="appendtoksonce" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="string-command"/> <cd:delimiter name="to"/> @@ -2088,7 +2108,7 @@ </cd:arguments> </cd:command> - <cd:command name="prependtoksonce" file="syst-aux.mkiv"> + <cd:command name="prependtoksonce" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="string-command"/> <cd:delimiter name="to"/> @@ -2096,7 +2116,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifelseintoks" file="syst-aux.mkiv"> + <cd:command name="doifelseintoks" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-command"/> <cd:resolve name="argument-command"/> @@ -2105,7 +2125,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifintokselse" file="syst-aux.mkiv"> + <cd:command name="doifintokselse" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-command"/> <cd:resolve name="argument-command"/> @@ -2114,25 +2134,25 @@ </cd:arguments> </cd:command> - <cd:command name="collecting" type="environment" file="syst-aux.mkiv"/> + <cd:command name="collecting" type="environment" level="system" file="syst-aux.mkiv"/> - <cd:command name="collect" type="environment" file="syst-aux.mkiv"/> + <cd:command name="collect" type="environment" level="system" file="syst-aux.mkiv"/> - <cd:command name="expandedcollect" type="environment" file="syst-aux.mkiv"/> + <cd:command name="expandedcollect" type="environment" level="system" file="syst-aux.mkiv"/> - <cd:command name="collect" file="syst-aux.mkiv"> + <cd:command name="collect" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="collectexpanded" file="syst-aux.mkiv"> + <cd:command name="collectexpanded" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="removetoks" file="syst-aux.mkiv"> + <cd:command name="removetoks" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="string-command"/> <cd:delimiter name="from"/> @@ -2140,7 +2160,7 @@ </cd:arguments> </cd:command> - <cd:command name="appendetoks" file="syst-aux.mkiv"> + <cd:command name="appendetoks" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="string-command"/> <cd:delimiter name="to"/> @@ -2148,7 +2168,7 @@ </cd:arguments> </cd:command> - <cd:command name="prependetoks" file="syst-aux.mkiv"> + <cd:command name="prependetoks" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="string-command"/> <cd:delimiter name="to"/> @@ -2156,19 +2176,19 @@ </cd:arguments> </cd:command> - <cd:command name="flushtoks" file="syst-aux.mkiv"> + <cd:command name="flushtoks" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="dotoks" file="syst-aux.mkiv"> + <cd:command name="dotoks" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="beforesplitstring" file="syst-aux.mkiv"> + <cd:command name="beforesplitstring" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="string-text"/> <cd:delimiter name="at"/> @@ -2178,7 +2198,7 @@ </cd:arguments> </cd:command> - <cd:command name="aftersplitstring" file="syst-aux.mkiv"> + <cd:command name="aftersplitstring" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="string-text"/> <cd:delimiter name="at"/> @@ -2188,7 +2208,7 @@ </cd:arguments> </cd:command> - <cd:command name="splitstring" file="syst-aux.mkiv"> + <cd:command name="splitstring" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="string-text"/> <cd:delimiter name="at"/> @@ -2200,7 +2220,7 @@ </cd:arguments> </cd:command> - <cd:command name="greedysplitstring" file="syst-aux.mkiv"> + <cd:command name="greedysplitstring" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="string-text"/> <cd:delimiter name="at"/> @@ -2212,7 +2232,7 @@ </cd:arguments> </cd:command> - <cd:command name="beforetestandsplitstring" file="syst-aux.mkiv"> + <cd:command name="beforetestandsplitstring" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="string-text"/> <cd:delimiter name="at"/> @@ -2222,7 +2242,7 @@ </cd:arguments> </cd:command> - <cd:command name="aftertestandsplitstring" file="syst-aux.mkiv"> + <cd:command name="aftertestandsplitstring" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="string-text"/> <cd:delimiter name="at"/> @@ -2232,7 +2252,7 @@ </cd:arguments> </cd:command> - <cd:command name="testandsplitstring" file="syst-aux.mkiv"> + <cd:command name="testandsplitstring" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="string-text"/> <cd:delimiter name="at"/> @@ -2244,7 +2264,7 @@ </cd:arguments> </cd:command> - <cd:command name="splitatcolon" file="syst-aux.mkiv"> + <cd:command name="splitatperiod" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="string-text"/> <cd:csname/> @@ -2252,7 +2272,7 @@ </cd:arguments> </cd:command> - <cd:command name="splitatcomma" file="syst-aux.mkiv"> + <cd:command name="splitatcomma" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="string-text"/> <cd:csname/> @@ -2260,7 +2280,7 @@ </cd:arguments> </cd:command> - <cd:command name="splitatasterisk" file="syst-aux.mkiv"> + <cd:command name="splitatasterisk" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="string-text"/> <cd:csname/> @@ -2268,7 +2288,7 @@ </cd:arguments> </cd:command> - <cd:command name="splitatcolon" file="syst-aux.mkiv"> + <cd:command name="splitatcolon" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="string-text"/> <cd:csname/> @@ -2276,7 +2296,7 @@ </cd:arguments> </cd:command> - <cd:command name="splitatcolons" file="syst-aux.mkiv"> + <cd:command name="splitatcolons" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="string-text"/> <cd:csname/> @@ -2284,7 +2304,7 @@ </cd:arguments> </cd:command> - <cd:command name="removesubstring" file="syst-aux.mkiv"> + <cd:command name="removesubstring" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="string-text"/> <cd:delimiter name="from"/> @@ -2294,81 +2314,81 @@ </cd:arguments> </cd:command> - <cd:command name="appendtocommalist" file="syst-aux.mkiv"> + <cd:command name="appendtocommalist" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="prependtocommalist" file="syst-aux.mkiv"> + <cd:command name="prependtocommalist" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="addtocommalist" file="syst-aux.mkiv"> + <cd:command name="addtocommalist" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="pretocommalist" file="syst-aux.mkiv"> + <cd:command name="pretocommalist" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="robustdoifelseinset" file="syst-aux.mkiv"> + <cd:command name="robustdoifelseinset" level="system" file="syst-aux.mkiv"> <cd:arguments> - <cd:resolve name="argument-content"/> - <cd:resolve name="argument-content-list"/> + <cd:resolve name="argument-text"/> + <cd:resolve name="argument-text-list"/> <cd:resolve name="argument-true"/> <cd:resolve name="argument-false"/> </cd:arguments> </cd:command> - <cd:command name="robustdoifinsetelse" file="syst-aux.mkiv"> + <cd:command name="robustdoifinsetelse" level="system" file="syst-aux.mkiv"> <cd:arguments> - <cd:resolve name="argument-content"/> - <cd:resolve name="argument-content-list"/> + <cd:resolve name="argument-text"/> + <cd:resolve name="argument-text-list"/> <cd:resolve name="argument-true"/> <cd:resolve name="argument-false"/> </cd:arguments> </cd:command> - <cd:command name="robustaddtocommalist" file="syst-aux.mkiv"> + <cd:command name="robustaddtocommalist" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="robustpretocommalist" file="syst-aux.mkiv"> + <cd:command name="robustpretocommalist" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="xsplitstring" file="syst-aux.mkiv"> + <cd:command name="xsplitstring" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="removefromcommalist" file="syst-aux.mkiv"> + <cd:command name="removefromcommalist" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="substituteincommalist" file="syst-aux.mkiv"> + <cd:command name="substituteincommalist" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-text"/> @@ -2376,14 +2396,14 @@ </cd:arguments> </cd:command> - <cd:command name="replaceincommalist" file="syst-aux.mkiv"> + <cd:command name="replaceincommalist" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="globalprocesscommalist" file="syst-aux.mkiv"> + <cd:command name="globalprocesscommalist" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:keywords> <cd:constant type="cd:command"/> @@ -2392,112 +2412,112 @@ </cd:arguments> </cd:command> - <cd:command name="withoutpt" file="syst-aux.mkiv"> + <cd:command name="withoutpt" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-dimension"/> </cd:arguments> </cd:command> - <cd:command name="PtToCm" file="syst-aux.mkiv"> + <cd:command name="PtToCm" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-dimension"/> </cd:arguments> </cd:command> - <cd:command name="dimensiontocount" file="syst-aux.mkiv"> + <cd:command name="dimensiontocount" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-dimension"/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="numberofpoints" file="syst-aux.mkiv"> + <cd:command name="numberofpoints" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-dimension"/> </cd:arguments> </cd:command> - <cd:command name="swapdimens" file="syst-aux.mkiv"> + <cd:command name="swapdimens" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="swapcounts" file="syst-aux.mkiv"> + <cd:command name="swapcounts" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="swapmacros" file="syst-aux.mkiv"> + <cd:command name="swapmacros" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="globalswapdimens" file="syst-aux.mkiv"> + <cd:command name="globalswapdimens" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="globalswapcounts" file="syst-aux.mkiv"> + <cd:command name="globalswapcounts" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="globalswapmacros" file="syst-aux.mkiv"> + <cd:command name="globalswapmacros" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="globalpushmacro" file="syst-aux.mkiv"> + <cd:command name="globalpushmacro" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="localpushmacro" file="syst-aux.mkiv"> + <cd:command name="localpushmacro" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="globalpopmacro" file="syst-aux.mkiv"> + <cd:command name="globalpopmacro" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="localpopmacro" file="syst-aux.mkiv"> + <cd:command name="localpopmacro" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="pushmacro" file="syst-aux.mkiv"> + <cd:command name="pushmacro" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="popmacro" file="syst-aux.mkiv"> + <cd:command name="popmacro" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="localhsize" file="syst-aux.mkiv"/> + <cd:command name="localhsize" level="system" file="syst-aux.mkiv"/> - <cd:command name="setlocalhsize" file="syst-aux.mkiv"> + <cd:command name="setlocalhsize" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="cd:dimension" prefix="cd:sign" method="none"/> @@ -2505,9 +2525,9 @@ </cd:arguments> </cd:command> - <cd:command name="availablehsize" file="syst-aux.mkiv"/> + <cd:command name="availablehsize" level="system" file="syst-aux.mkiv"/> - <cd:command name="distributedhsize" file="syst-aux.mkiv"> + <cd:command name="distributedhsize" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-dimension"/> <cd:resolve name="argument-dimension"/> @@ -2515,14 +2535,14 @@ </cd:arguments> </cd:command> - <cd:command name="hsizefraction" file="syst-aux.mkiv"> + <cd:command name="hsizefraction" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-dimension"/> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="doifvalue" file="syst-aux.mkiv"> + <cd:command name="doifvalue" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-text"/> @@ -2530,7 +2550,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifnotvalue" file="syst-aux.mkiv"> + <cd:command name="doifnotvalue" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-text"/> @@ -2538,7 +2558,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifelsevalue" file="syst-aux.mkiv"> + <cd:command name="doifelsevalue" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-text"/> @@ -2547,7 +2567,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifvalueelse" file="syst-aux.mkiv"> + <cd:command name="doifvalueelse" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-text"/> @@ -2556,21 +2576,21 @@ </cd:arguments> </cd:command> - <cd:command name="doifnothing" file="syst-aux.mkiv"> + <cd:command name="doifnothing" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-true"/> </cd:arguments> </cd:command> - <cd:command name="doifsomething" file="syst-aux.mkiv"> + <cd:command name="doifsomething" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-true"/> </cd:arguments> </cd:command> - <cd:command name="doifelsenothing" file="syst-aux.mkiv"> + <cd:command name="doifelsenothing" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-true"/> @@ -2578,7 +2598,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifnothingelse" file="syst-aux.mkiv"> + <cd:command name="doifnothingelse" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-true"/> @@ -2586,7 +2606,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifelsesomething" file="syst-aux.mkiv"> + <cd:command name="doifelsesomething" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-true"/> @@ -2594,7 +2614,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifsomethingelse" file="syst-aux.mkiv"> + <cd:command name="doifsomethingelse" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-true"/> @@ -2602,21 +2622,21 @@ </cd:arguments> </cd:command> - <cd:command name="doifvaluenothing" file="syst-aux.mkiv"> + <cd:command name="doifvaluenothing" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> </cd:arguments> </cd:command> - <cd:command name="doifvaluesomething" file="syst-aux.mkiv"> + <cd:command name="doifvaluesomething" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> </cd:arguments> </cd:command> - <cd:command name="doifelsevaluenothing" file="syst-aux.mkiv"> + <cd:command name="doifelsevaluenothing" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -2624,7 +2644,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifvaluenothingelse" file="syst-aux.mkiv"> + <cd:command name="doifvaluenothingelse" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -2632,7 +2652,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifelseemptyvalue" file="syst-aux.mkiv"> + <cd:command name="doifelseemptyvalue" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -2640,7 +2660,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifemptyvalueelse" file="syst-aux.mkiv"> + <cd:command name="doifemptyvalueelse" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -2648,55 +2668,55 @@ </cd:arguments> </cd:command> - <cd:command name="doifemptyvalue" file="syst-aux.mkiv"> + <cd:command name="doifemptyvalue" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> </cd:arguments> </cd:command> - <cd:command name="doifnotemptyvalue" file="syst-aux.mkiv"> + <cd:command name="doifnotemptyvalue" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> </cd:arguments> </cd:command> - <cd:command name="doifelseallcommon" file="syst-aux.mkiv"> + <cd:command name="doifelseallcommon" level="system" file="syst-aux.mkiv"> <cd:arguments> - <cd:resolve name="argument-content-list"/> - <cd:resolve name="argument-content-list"/> + <cd:resolve name="argument-text-list"/> + <cd:resolve name="argument-text-list"/> <cd:resolve name="argument-true"/> <cd:resolve name="argument-false"/> </cd:arguments> </cd:command> - <cd:command name="doifallcommonelse" file="syst-aux.mkiv"> + <cd:command name="doifallcommonelse" level="system" file="syst-aux.mkiv"> <cd:arguments> - <cd:resolve name="argument-content-list"/> - <cd:resolve name="argument-content-list"/> + <cd:resolve name="argument-text-list"/> + <cd:resolve name="argument-text-list"/> <cd:resolve name="argument-true"/> <cd:resolve name="argument-false"/> </cd:arguments> </cd:command> - <cd:command name="doifallcommon" file="syst-aux.mkiv"> + <cd:command name="doifallcommon" level="system" file="syst-aux.mkiv"> <cd:arguments> - <cd:resolve name="argument-content-list"/> - <cd:resolve name="argument-content-list"/> + <cd:resolve name="argument-text-list"/> + <cd:resolve name="argument-text-list"/> <cd:resolve name="argument-true"/> </cd:arguments> </cd:command> - <cd:command name="doifnotallcommon" file="syst-aux.mkiv"> + <cd:command name="doifnotallcommon" level="system" file="syst-aux.mkiv"> <cd:arguments> - <cd:resolve name="argument-content-list"/> - <cd:resolve name="argument-content-list"/> + <cd:resolve name="argument-text-list"/> + <cd:resolve name="argument-text-list"/> <cd:resolve name="argument-true"/> </cd:arguments> </cd:command> - <cd:command name="dodoubleemptywithset" file="syst-aux.mkiv"> + <cd:command name="dodoubleemptywithset" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="keyword-dummy-list-optional"/> @@ -2704,7 +2724,7 @@ </cd:arguments> </cd:command> - <cd:command name="dotripleemptywithset" file="syst-aux.mkiv"> + <cd:command name="dotripleemptywithset" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="keyword-dummy-list-optional"/> @@ -2713,7 +2733,7 @@ </cd:arguments> </cd:command> - <cd:command name="dodoubleargumentwithset" file="syst-aux.mkiv"> + <cd:command name="dodoubleargumentwithset" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="keyword-dummy-list"/> @@ -2721,7 +2741,7 @@ </cd:arguments> </cd:command> - <cd:command name="dotripleargumentwithset" file="syst-aux.mkiv"> + <cd:command name="dotripleargumentwithset" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="keyword-dummy-list"/> @@ -2730,7 +2750,7 @@ </cd:arguments> </cd:command> - <cd:command name="stripcharacter" file="syst-aux.mkiv"> + <cd:command name="stripcharacter" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="string-character"/> <cd:delimiter name="from"/> @@ -2740,7 +2760,7 @@ </cd:arguments> </cd:command> - <cd:command name="stripspaces" file="syst-aux.mkiv"> + <cd:command name="stripspaces" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:delimiter name="from"/> <cd:resolve name="string-text"/> @@ -2749,7 +2769,7 @@ </cd:arguments> </cd:command> - <cd:command name="unspacestring" file="syst-aux.mkiv"> + <cd:command name="unspacestring" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="string-text"/> <cd:delimiter name="to"/> @@ -2757,14 +2777,14 @@ </cd:arguments> </cd:command> - <cd:command name="executeifdefined" file="syst-aux.mkiv"> + <cd:command name="executeifdefined" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-command"/> </cd:arguments> </cd:command> - <cd:command name="doifelsesomespace" file="syst-aux.mkiv"> + <cd:command name="doifelsesomespace" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-true"/> @@ -2772,7 +2792,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifsomespaceelse" file="syst-aux.mkiv"> + <cd:command name="doifsomespaceelse" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-true"/> @@ -2780,7 +2800,7 @@ </cd:arguments> </cd:command> - <cd:command name="processseparatedlist" file="syst-aux.mkiv"> + <cd:command name="processseparatedlist" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="keyword-text"/> <cd:resolve name="keyword-text"/> @@ -2791,7 +2811,7 @@ </cd:arguments> </cd:command> - <cd:command name="processlist" file="syst-aux.mkiv"> + <cd:command name="processlist" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-character"/> <cd:resolve name="argument-character"/> @@ -2800,14 +2820,14 @@ </cd:arguments> </cd:command> - <cd:command name="processassignlist" file="syst-aux.mkiv"> + <cd:command name="processassignlist" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="keyword-text-list"/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="untexargument" file="syst-aux.mkiv"> + <cd:command name="untexargument" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:delimiter name="to"/> @@ -2815,7 +2835,7 @@ </cd:arguments> </cd:command> - <cd:command name="untexcommand" file="syst-aux.mkiv"> + <cd:command name="untexcommand" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-csname"/> <cd:delimiter name="to"/> @@ -2823,56 +2843,56 @@ </cd:arguments> </cd:command> - <cd:command name="PointsToBigPoints" file="syst-aux.mkiv"> + <cd:command name="PointsToBigPoints" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-dimension"/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="PointsToWholeBigPoints" file="syst-aux.mkiv"> + <cd:command name="PointsToWholeBigPoints" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-dimension"/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="ScaledPointsToBigPoints" file="syst-aux.mkiv"> + <cd:command name="ScaledPointsToBigPoints" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-dimension"/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="ScaledPointsToWholeBigPoints" file="syst-aux.mkiv"> + <cd:command name="ScaledPointsToWholeBigPoints" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-dimension"/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="PointsToReal" file="syst-aux.mkiv"> + <cd:command name="PointsToReal" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-dimension"/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="dontleavehmode" file="syst-aux.mkiv"/> + <cd:command name="dontleavehmode" level="style" file="syst-aux.mkiv"/> - <cd:command name="utfupper" file="syst-aux.mkiv"> + <cd:command name="utfupper" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="utflower" file="syst-aux.mkiv"> + <cd:command name="utflower" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="uppercasestring" file="syst-aux.mkiv"> + <cd:command name="uppercasestring" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="string-text"/> <cd:delimiter name="to"/> @@ -2880,7 +2900,7 @@ </cd:arguments> </cd:command> - <cd:command name="lowercasestring" file="syst-aux.mkiv"> + <cd:command name="lowercasestring" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="string-text"/> <cd:delimiter name="to"/> @@ -2888,7 +2908,7 @@ </cd:arguments> </cd:command> - <cd:command name="counttoken" file="syst-aux.mkiv"> + <cd:command name="counttoken" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="string-text"/> <cd:delimiter name="in"/> @@ -2898,7 +2918,7 @@ </cd:arguments> </cd:command> - <cd:command name="counttokens" file="syst-aux.mkiv"> + <cd:command name="counttokens" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="string-text"/> <cd:delimiter name="to"/> @@ -2906,7 +2926,7 @@ </cd:arguments> </cd:command> - <cd:command name="splitofftokens" file="syst-aux.mkiv"> + <cd:command name="splitofftokens" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="string-text"/> <cd:delimiter name="from"/> @@ -2916,7 +2936,7 @@ </cd:arguments> </cd:command> - <cd:command name="handletokens" file="syst-aux.mkiv"> + <cd:command name="handletokens" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="string-text"/> <cd:delimiter name="with"/> @@ -2924,11 +2944,11 @@ </cd:arguments> </cd:command> - <cd:command name="settrialtypesetting" file="syst-aux.mkiv"/> + <cd:command name="settrialtypesetting" level="system" file="syst-aux.mkiv"/> - <cd:command name="resettrialtypesetting" file="syst-aux.mkiv"/> + <cd:command name="resettrialtypesetting" level="system" file="syst-aux.mkiv"/> - <cd:command name="iftrialtypesetting" file="syst-aux.mkiv"> + <cd:command name="iftrialtypesetting" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="string-true"/> <cd:delimiter name="else"/> @@ -2937,64 +2957,64 @@ </cd:arguments> </cd:command> - <cd:command name="integerrounding" file="syst-aux.mkiv"> + <cd:command name="integerrounding" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="onedigitrounding" file="syst-aux.mkiv"> + <cd:command name="onedigitrounding" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="twodigitrounding" file="syst-aux.mkiv"> + <cd:command name="twodigitrounding" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="threedigitrounding" file="syst-aux.mkiv"> + <cd:command name="threedigitrounding" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="processcontent" file="syst-aux.mkiv"> + <cd:command name="processcontent" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="dogobblesingleempty" file="syst-aux.mkiv"> + <cd:command name="dogobblesingleempty" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="keyword-dummy-optional"/> </cd:arguments> </cd:command> - <cd:command name="dogobbledoubleempty" file="syst-aux.mkiv"> + <cd:command name="dogobbledoubleempty" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="keyword-dummy-optional"/> <cd:resolve name="keyword-dummy-optional"/> </cd:arguments> </cd:command> - <cd:command name="gobblesingleempty" file="syst-aux.mkiv"> + <cd:command name="gobblesingleempty" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="keyword-dummy-optional"/> </cd:arguments> </cd:command> - <cd:command name="gobbledoubleempty" file="syst-aux.mkiv"> + <cd:command name="gobbledoubleempty" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="keyword-dummy-optional"/> <cd:resolve name="keyword-dummy-optional"/> </cd:arguments> </cd:command> - <cd:command name="doifelsesometoks" file="syst-aux.mkiv"> + <cd:command name="doifelsesometoks" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-true"/> @@ -3002,7 +3022,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifsometokselse" file="syst-aux.mkiv"> + <cd:command name="doifsometokselse" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-true"/> @@ -3010,71 +3030,71 @@ </cd:arguments> </cd:command> - <cd:command name="doifsometoks" file="syst-aux.mkiv"> + <cd:command name="doifsometoks" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-true"/> </cd:arguments> </cd:command> - <cd:command name="doifemptytoks" file="syst-aux.mkiv"> + <cd:command name="doifemptytoks" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-true"/> </cd:arguments> </cd:command> - <cd:command name="strictinspectnextcharacter" type="environment" file="syst-aux.mkiv"/> + <cd:command name="strictinspectnextcharacter" type="environment" level="system" file="syst-aux.mkiv"/> - <cd:command name="strictdoifelsenextoptional" file="syst-aux.mkiv"> + <cd:command name="strictdoifelsenextoptional" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-true"/> <cd:resolve name="argument-false"/> </cd:arguments> </cd:command> - <cd:command name="strictdoifnextoptionalelse" file="syst-aux.mkiv"> + <cd:command name="strictdoifnextoptionalelse" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-true"/> <cd:resolve name="argument-false"/> </cd:arguments> </cd:command> - <cd:command name="gobblespacetokens" file="syst-aux.mkiv"/> + <cd:command name="gobblespacetokens" level="system" file="syst-aux.mkiv"/> - <cd:command name="verbatimstring" file="syst-aux.mkiv"> + <cd:command name="verbatimstring" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="lastdigit" file="syst-aux.mkiv"> + <cd:command name="lastdigit" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="lasttwodigits" file="syst-aux.mkiv"> + <cd:command name="lasttwodigits" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="serializedcommalist" file="syst-aux.mkiv"/> + <cd:command name="serializedcommalist" level="system" file="syst-aux.mkiv"/> - <cd:command name="serializecommalist" file="syst-aux.mkiv"> + <cd:command name="serializecommalist" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="keyword-command-list"/> </cd:arguments> </cd:command> - <cd:command name="purenumber" file="syst-aux.mkiv"> + <cd:command name="purenumber" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="filterfromvalue" file="syst-aux.mkiv"> + <cd:command name="filterfromvalue" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-number"/> @@ -3082,73 +3102,73 @@ </cd:arguments> </cd:command> - <cd:command name="filterfromnext" file="syst-aux.mkiv"> + <cd:command name="filterfromnext" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> <cd:resolve name="argument-number"/> - <cd:resolve name="argument-content-optional"/> - <cd:resolve name="argument-content-optional"/> - <cd:resolve name="argument-content-optional"/> - <cd:resolve name="argument-content-optional"/> - <cd:resolve name="argument-content-optional"/> + <cd:content optional="yes"/> + <cd:content optional="yes"/> + <cd:content optional="yes"/> + <cd:content optional="yes"/> + <cd:content optional="yes"/> </cd:arguments> </cd:command> - <cd:command name="definemeasure" file="syst-aux.mkiv"> + <cd:command name="definemeasure" level="style" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-dimension"/> </cd:arguments> </cd:command> - <cd:command name="freezemeasure" file="syst-aux.mkiv"> + <cd:command name="freezemeasure" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-dimension"/> </cd:arguments> </cd:command> - <cd:command name="setmeasure" file="syst-aux.mkiv"> + <cd:command name="setmeasure" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-dimension"/> </cd:arguments> </cd:command> - <cd:command name="setgmeasure" file="syst-aux.mkiv"> + <cd:command name="setgmeasure" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-dimension"/> </cd:arguments> </cd:command> - <cd:command name="setemeasure" file="syst-aux.mkiv"> + <cd:command name="setemeasure" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-dimension"/> </cd:arguments> </cd:command> - <cd:command name="setxmeasure" file="syst-aux.mkiv"> + <cd:command name="setxmeasure" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-dimension"/> </cd:arguments> </cd:command> - <cd:command name="measure" file="syst-aux.mkiv"> + <cd:command name="measure" level="style" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="measured" file="syst-aux.mkiv"> + <cd:command name="measured" level="style" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="dividedsize" file="syst-aux.mkiv"> + <cd:command name="dividedsize" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-dimension"/> <cd:resolve name="argument-dimension"/> @@ -3156,7 +3176,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifelsedimension" file="syst-aux.mkiv"> + <cd:command name="doifelsedimension" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-true"/> @@ -3164,7 +3184,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifdimensionelse" file="syst-aux.mkiv"> + <cd:command name="doifdimensionelse" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-true"/> @@ -3172,7 +3192,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifelsedimenstring" file="syst-aux.mkiv"> + <cd:command name="doifelsedimenstring" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-true"/> @@ -3180,7 +3200,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifdimenstringelse" file="syst-aux.mkiv"> + <cd:command name="doifdimenstringelse" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-true"/> @@ -3188,23 +3208,23 @@ </cd:arguments> </cd:command> - <cd:command name="compresult" file="syst-aux.mkiv"/> + <cd:command name="compresult" level="system" file="syst-aux.mkiv"/> - <cd:command name="comparedimension" file="syst-aux.mkiv"> + <cd:command name="comparedimension" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-dimension"/> <cd:resolve name="argument-dimension"/> </cd:arguments> </cd:command> - <cd:command name="comparedimensioneps" file="syst-aux.mkiv"> + <cd:command name="comparedimensioneps" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-dimension"/> <cd:resolve name="argument-dimension"/> </cd:arguments> </cd:command> - <cd:command name="letcscsname" file="syst-aux.mkiv"> + <cd:command name="letcscsname" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:delimiter name="csname"/> @@ -3213,7 +3233,7 @@ </cd:arguments> </cd:command> - <cd:command name="letcsnamecs" file="syst-aux.mkiv"> + <cd:command name="letcsnamecs" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:delimiter name="csname"/> <cd:resolve name="string-name"/> @@ -3222,7 +3242,7 @@ </cd:arguments> </cd:command> - <cd:command name="letcsnamecsname" file="syst-aux.mkiv"> + <cd:command name="letcsnamecsname" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:delimiter name="csname"/> <cd:resolve name="string-name"/> @@ -3233,20 +3253,20 @@ </cd:arguments> </cd:command> - <cd:command name="addvalue" file="syst-aux.mkiv"> + <cd:command name="addvalue" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="unspaced" file="syst-aux.mkiv"> + <cd:command name="unspaced" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="unspaceargument" file="syst-aux.mkiv"> + <cd:command name="unspaceargument" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="string-text"/> <cd:delimiter name="to"/> @@ -3254,14 +3274,14 @@ </cd:arguments> </cd:command> - <cd:command name="unspaceafter" file="syst-aux.mkiv"> + <cd:command name="unspaceafter" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="doifelsehasspace" file="syst-aux.mkiv"> + <cd:command name="doifelsehasspace" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-true"/> @@ -3269,7 +3289,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifhasspaceelse" file="syst-aux.mkiv"> + <cd:command name="doifhasspaceelse" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-true"/> @@ -3277,25 +3297,25 @@ </cd:arguments> </cd:command> - <cd:command name="setflag" file="syst-aux.mkiv"> + <cd:command name="setflag" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="resetflag" file="syst-aux.mkiv"> + <cd:command name="resetflag" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="flag" file="syst-aux.mkiv"> + <cd:command name="flag" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="doifelseflagged" file="syst-aux.mkiv"> + <cd:command name="doifelseflagged" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -3303,7 +3323,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifflaggedelse" file="syst-aux.mkiv"> + <cd:command name="doifflaggedelse" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -3311,14 +3331,14 @@ </cd:arguments> </cd:command> - <cd:command name="doifnotflagged" file="syst-aux.mkiv"> + <cd:command name="doifnotflagged" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> </cd:arguments> </cd:command> - <cd:command name="inheritparameter" file="syst-aux.mkiv"> + <cd:command name="inheritparameter" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="keyword-text"/> <cd:resolve name="keyword-text"/> @@ -3326,7 +3346,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifelsenonzeropositive" file="syst-aux.mkiv"> + <cd:command name="doifelsenonzeropositive" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> <cd:resolve name="argument-true"/> @@ -3334,7 +3354,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifnonzeropositiveelse" file="syst-aux.mkiv"> + <cd:command name="doifnonzeropositiveelse" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> <cd:resolve name="argument-true"/> @@ -3342,118 +3362,118 @@ </cd:arguments> </cd:command> - <cd:command name="getrawparameters" file="syst-aux.mkiv"> + <cd:command name="getrawparameters" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="keyword-text"/> <cd:resolve name="assignment-userdata-list"/> </cd:arguments> </cd:command> - <cd:command name="getraweparameters" file="syst-aux.mkiv"> + <cd:command name="getraweparameters" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="keyword-text"/> <cd:resolve name="assignment-userdata-list"/> </cd:arguments> </cd:command> - <cd:command name="getrawgparameters" file="syst-aux.mkiv"> + <cd:command name="getrawgparameters" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="keyword-text"/> <cd:resolve name="assignment-userdata-list"/> </cd:arguments> </cd:command> - <cd:command name="getrawxparameters" file="syst-aux.mkiv"> + <cd:command name="getrawxparameters" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="keyword-text"/> <cd:resolve name="assignment-userdata-list"/> </cd:arguments> </cd:command> - <cd:command name="unprotected" file="syst-aux.mkiv"> + <cd:command name="unprotected" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="string-content"/> <cd:delimiter name="par"/> </cd:arguments> </cd:command> - <cd:command name="resettimer" file="syst-aux.mkiv"/> + <cd:command name="resettimer" level="system" file="syst-aux.mkiv"/> - <cd:command name="elapsedtime" file="syst-aux.mkiv"/> + <cd:command name="elapsedtime" level="system" file="syst-aux.mkiv"/> - <cd:command name="elapsedseconds" file="syst-aux.mkiv"/> + <cd:command name="elapsedseconds" level="system" file="syst-aux.mkiv"/> - <cd:command name="currentfeaturetest" file="syst-aux.mkiv"/> + <cd:command name="currentfeaturetest" level="system" file="syst-aux.mkiv"/> - <cd:command name="testfeature" file="syst-aux.mkiv"> + <cd:command name="testfeature" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> - <cd:resolve name="argument-content"/> + <cd:content/> </cd:arguments> </cd:command> - <cd:command name="showtimer" file="syst-aux.mkiv"> + <cd:command name="showtimer" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="testfeatureonce" file="syst-aux.mkiv"> + <cd:command name="testfeatureonce" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> - <cd:resolve name="argument-content"/> + <cd:content/> </cd:arguments> </cd:command> - <cd:command name="freezedimenmacro" file="syst-aux.mkiv"> + <cd:command name="freezedimenmacro" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="negated" file="syst-aux.mkiv"> + <cd:command name="negated" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="assigndimen" file="syst-aux.mkiv"> + <cd:command name="assigndimen" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-dimension"/> </cd:arguments> </cd:command> - <cd:command name="appendvalue" file="syst-aux.mkiv"> + <cd:command name="appendvalue" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-command"/> </cd:arguments> </cd:command> - <cd:command name="appendgvalue" file="syst-aux.mkiv"> + <cd:command name="appendgvalue" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-command"/> </cd:arguments> </cd:command> - <cd:command name="prependvalue" file="syst-aux.mkiv"> + <cd:command name="prependvalue" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-command"/> </cd:arguments> </cd:command> - <cd:command name="prependgvalue" file="syst-aux.mkiv"> + <cd:command name="prependgvalue" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-command"/> </cd:arguments> </cd:command> - <cd:command name="processranges" file="syst-aux.mkiv"> + <cd:command name="processranges" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="cd:number"/> @@ -3463,7 +3483,7 @@ </cd:arguments> </cd:command> - <cd:command name="dowithrange" file="syst-aux.mkiv"> + <cd:command name="dowithrange" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:keywords delimiters="braces" list="yes"> <cd:constant type="cd:number"/> @@ -3473,11 +3493,11 @@ </cd:arguments> </cd:command> - <cd:command name="ignoreimplicitspaces" file="syst-aux.mkiv"/> + <cd:command name="ignoreimplicitspaces" level="system" file="syst-aux.mkiv"/> - <cd:command name="nointerference" type="environment" file="syst-aux.mkiv"/> + <cd:command name="nointerference" type="environment" level="system" file="syst-aux.mkiv"/> - <cd:command name="expandcheckedcsname" file="syst-aux.mkiv"> + <cd:command name="expandcheckedcsname" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-key"/> @@ -3485,43 +3505,43 @@ </cd:arguments> </cd:command> - <cd:command name="docheckedpair" file="syst-aux.mkiv"> + <cd:command name="docheckedpair" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-text-list"/> </cd:arguments> </cd:command> - <cd:command name="constantnumber" file="syst-aux.mkiv"> + <cd:command name="constantnumber" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="constantnumberargument" file="syst-aux.mkiv"> + <cd:command name="constantnumberargument" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="constantdimen" file="syst-aux.mkiv"> + <cd:command name="constantdimen" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="constantdimenargument" file="syst-aux.mkiv"> + <cd:command name="constantdimenargument" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="constantemptyargument" file="syst-aux.mkiv"> + <cd:command name="constantemptyargument" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="getsubstring" file="syst-aux.mkiv"> + <cd:command name="getsubstring" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> <cd:resolve name="argument-number"/> @@ -3529,7 +3549,7 @@ </cd:arguments> </cd:command> - <cd:command name="converteddimen" file="syst-aux.mkiv"> + <cd:command name="converteddimen" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-dimension"/> <cd:keywords delimiters="braces"> @@ -3549,11 +3569,78 @@ </cd:arguments> </cd:command> - <cd:command name="ntimes" file="syst-aux.mkiv"> + <cd:command name="ntimes" level="system" file="syst-aux.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> -</cd:interface> + <cd:command name="expdoifelse" level="system" file="syst-lua.mkiv"> + <cd:arguments> + <cd:content/> + <cd:content/> + <cd:resolve name="argument-true"/> + <cd:resolve name="argument-false"/> + </cd:arguments> + </cd:command> + + <cd:command name="expdoif" level="system" file="syst-lua.mkiv"> + <cd:arguments> + <cd:content/> + <cd:content/> + <cd:resolve name="argument-true"/> + </cd:arguments> + </cd:command> + + <cd:command name="expdoifnot" level="system" file="syst-lua.mkiv"> + <cd:arguments> + <cd:content/> + <cd:content/> + <cd:resolve name="argument-true"/> + </cd:arguments> + </cd:command> + + <cd:command name="expdoifelsecommon" level="system" file="syst-lua.mkiv"> + <cd:arguments> + <cd:resolve name="argument-text-list"/> + <cd:resolve name="argument-text-list"/> + <cd:resolve name="argument-true"/> + <cd:resolve name="argument-false"/> + </cd:arguments> + </cd:command> + + <cd:command name="expdoifcommonelse" level="system" file="syst-lua.mkiv"> + <cd:arguments> + <cd:resolve name="argument-text-list"/> + <cd:resolve name="argument-text-list"/> + <cd:resolve name="argument-true"/> + <cd:resolve name="argument-false"/> + </cd:arguments> + </cd:command> + + <cd:command name="expdoifelseinset" level="system" file="syst-lua.mkiv"> + <cd:arguments> + <cd:resolve name="argument-text"/> + <cd:resolve name="argument-text-list"/> + <cd:resolve name="argument-true"/> + <cd:resolve name="argument-false"/> + </cd:arguments> + </cd:command> + + <cd:command name="expdoifinsetelse" level="system" file="syst-lua.mkiv"> + <cd:arguments> + <cd:resolve name="argument-text"/> + <cd:resolve name="argument-text-list"/> + <cd:resolve name="argument-true"/> + <cd:resolve name="argument-false"/> + </cd:arguments> + </cd:command> + + <cd:command name="luaexpr" level="system" file="syst-lua.mkiv"> + <cd:arguments> + <cd:content/> + </cd:arguments> + </cd:command> + +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-systemlog.xml b/tex/context/interface/mkiv/i-systemlog.xml index 02c4bece9..fc3243cfb 100644 --- a/tex/context/interface/mkiv/i-systemlog.xml +++ b/tex/context/interface/mkiv/i-systemlog.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="systemlog" file="core-sys.mkiv"> + <cd:command name="systemlog" level="system" file="core-sys.mkiv"> <cd:arguments> <cd:resolve name="argument-file"/> <cd:resolve name="argument-text"/> @@ -12,7 +12,7 @@ </cd:arguments> </cd:command> - <cd:command name="systemlogfirst" file="core-sys.mkiv"> + <cd:command name="systemlogfirst" level="system" file="core-sys.mkiv"> <cd:arguments> <cd:resolve name="argument-file"/> <cd:resolve name="argument-text"/> @@ -20,7 +20,7 @@ </cd:arguments> </cd:command> - <cd:command name="systemloglast" file="core-sys.mkiv"> + <cd:command name="systemloglast" level="system" file="core-sys.mkiv"> <cd:arguments> <cd:resolve name="argument-file"/> <cd:resolve name="argument-text"/> @@ -28,4 +28,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-table.xml b/tex/context/interface/mkiv/i-table.xml index 950a9ff34..e59a9ca97 100644 --- a/tex/context/interface/mkiv/i-table.xml +++ b/tex/context/interface/mkiv/i-table.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="table" type="environment" file="tabl-tab.mkiv"> + <cd:command name="table" type="environment" level="document" category="tables" file="tabl-tab.mkiv"> <cd:arguments> <cd:template/> <cd:assignments list="yes" optional="yes"> @@ -13,7 +13,7 @@ </cd:arguments> </cd:command> - <cd:command name="table" type="environment" variant="name" file="tabl-tab.mkiv"> + <cd:command name="table" type="environment" variant="name" level="document" category="tables" file="tabl-tab.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes" optional="yes"> @@ -22,7 +22,7 @@ </cd:arguments> </cd:command> - <cd:command name="definetabletemplate" file="tabl-tab.mkiv"> + <cd:command name="definetabletemplate" level="style" category="tables" file="tabl-tab.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:template/> @@ -31,31 +31,31 @@ </cd:arguments> </cd:command> - <cd:command name="tables" type="environment" file="tabl-tab.mkiv"> + <cd:command name="tables" type="environment" level="document" category="tables" file="tabl-tab.mkiv"> <cd:arguments> <cd:template/> </cd:arguments> </cd:command> - <cd:command name="tables" type="environment" variant="name" file="tabl-tab.mkiv"> + <cd:command name="tables" type="environment" variant="name" level="document" category="tables" file="tabl-tab.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="tablehead" type="environment" file="tabl-tab.mkiv"> + <cd:command name="tablehead" type="environment" level="document" category="tables" file="tabl-tab.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="tabletail" type="environment" file="tabl-tab.mkiv"> + <cd:command name="tabletail" type="environment" level="document" category="tables" file="tabl-tab.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="setuptables" file="tabl-tab.mkiv"> + <cd:command name="setuptables" level="style" category="tables" file="tabl-tab.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="text"> @@ -126,34 +126,34 @@ <!-- - <cd:command name="ReFormat" scope="table" file="tabl-tab.mkiv"> + <cd:command name="ReFormat" scope="table" level="document" category="tables" file="tabl-tab.mkiv"> <cd:arguments> <cd:resolve name="keyword-template"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="enlarge" scope="table" file="tabl-tab.mkiv"> + <cd:command name="enlarge" scope="table" level="document" category="tables" file="tabl-tab.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="Enlarge" scope="table" file="tabl-tab.mkiv"> + <cd:command name="Enlarge" scope="table" level="document" category="tables" file="tabl-tab.mkiv"> <cd:arguments> <cd:resolve name="argument-dimension"/> <cd:resolve name="argument-dimension"/> </cd:arguments> </cd:command> - <cd:command name="use" scope="table" file="tabl-tab.mkiv"> + <cd:command name="use" scope="table" level="document" category="tables" file="tabl-tab.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="Use" scope="table" file="tabl-tab.mkiv"> + <cd:command name="Use" scope="table" level="document" category="tables" file="tabl-tab.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> <cd:resolve name="keyword-template"/> @@ -161,19 +161,19 @@ </cd:arguments> </cd:command> - <cd:command name="JustLeft" scope="table" file="tabl-tab.mkiv"/> + <cd:command name="JustLeft" scope="table" level="document" category="tables" file="tabl-tab.mkiv"/> - <cd:command name="JustCenter" scope="table" file="tabl-tab.mkiv"/> + <cd:command name="JustCenter" scope="table" level="document" category="tables" file="tabl-tab.mkiv"/> - <cd:command name="JustRight" scope="table" file="tabl-tab.mkiv"/> + <cd:command name="JustRight" scope="table" level="document" category="tables" file="tabl-tab.mkiv"/> - <cd:command name="Smash" scope="table" file="tabl-tab.mkiv"> + <cd:command name="Smash" scope="table" level="document" category="tables" file="tabl-tab.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="Raise" variant="argument" scope="table" file="tabl-tab.mkiv"> + <cd:command name="Raise" variant="argument" scope="table" level="document" category="tables" file="tabl-tab.mkiv"> <cd:arguments> <cd:keywords delimiters="parentheses" optional="yes"> <cd:constant type="cd:dimension"/> @@ -182,14 +182,14 @@ </cd:arguments> </cd:command> - <cd:command name="Raise" variant="string" scope="table" file="tabl-tab.mkiv"> + <cd:command name="Raise" variant="string" scope="table" level="document" category="tables" file="tabl-tab.mkiv"> <cd:arguments> <cd:resolve name="string-number-optional"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="Lower" variant="argument" scope="table" file="tabl-tab.mkiv"> + <cd:command name="Lower" variant="argument" scope="table" level="document" category="tables" file="tabl-tab.mkiv"> <cd:arguments> <cd:keywords delimiters="parentheses" optional="yes"> <cd:constant type="cd:dimension"/> @@ -198,14 +198,14 @@ </cd:arguments> </cd:command> - <cd:command name="Lower" variant="string" scope="table" file="tabl-tab.mkiv"> + <cd:command name="Lower" variant="string" scope="table" level="document" category="tables" file="tabl-tab.mkiv"> <cd:arguments> <cd:resolve name="string-number-optional"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="BackSpace" variant="argument" scope="table" file="tabl-tab.mkiv"> + <cd:command name="BackSpace" variant="argument" scope="table" level="document" category="tables" file="tabl-tab.mkiv"> <cd:arguments> <cd:keywords delimiters="parentheses" optional="yes"> <cd:constant type="cd:dimension"/> @@ -213,13 +213,13 @@ </cd:arguments> </cd:command> - <cd:command name="BackSpace" variant="string" scope="table" file="tabl-tab.mkiv"> + <cd:command name="BackSpace" variant="string" scope="table" level="document" category="tables" file="tabl-tab.mkiv"> <cd:arguments> <cd:resolve name="string-number-optional"/> </cd:arguments> </cd:command> - <cd:command name="Vspace" variant="argument" scope="table" file="tabl-tab.mkiv"> + <cd:command name="Vspace" variant="argument" scope="table" level="document" category="tables" file="tabl-tab.mkiv"> <cd:arguments> <cd:keywords delimiters="parentheses" optional="yes"> <cd:constant type="cd:dimension"/> @@ -227,48 +227,48 @@ </cd:arguments> </cd:command> - <cd:command name="Vspace" variant="string" scope="table" file="tabl-tab.mkiv"> + <cd:command name="Vspace" variant="string" scope="table" level="document" category="tables" file="tabl-tab.mkiv"> <cd:arguments> <cd:resolve name="string-number-optional"/> </cd:arguments> </cd:command> - <cd:command name="OpenUp" scope="table" file="tabl-tab.mkiv"> + <cd:command name="OpenUp" scope="table" level="document" category="tables" file="tabl-tab.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="TableLeft" scope="table" file="tabl-tab.mkiv"> + <cd:command name="TableLeft" scope="table" level="document" category="tables" file="tabl-tab.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="TableCenter" scope="table" file="tabl-tab.mkiv"> + <cd:command name="TableCenter" scope="table" level="document" category="tables" file="tabl-tab.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="TableRight" scope="table" file="tabl-tab.mkiv"> + <cd:command name="TableRight" scope="table" level="document" category="tables" file="tabl-tab.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="SR" scope="table" file="tabl-tab.mkiv"/> + <cd:command name="SR" scope="table" level="document" category="tables" file="tabl-tab.mkiv"/> - <cd:command name="FR" scope="table" file="tabl-tab.mkiv"/> + <cd:command name="FR" scope="table" level="document" category="tables" file="tabl-tab.mkiv"/> - <cd:command name="MR" scope="table" file="tabl-tab.mkiv"/> + <cd:command name="MR" scope="table" level="document" category="tables" file="tabl-tab.mkiv"/> - <cd:command name="LR" scope="table" file="tabl-tab.mkiv"/> + <cd:command name="LR" scope="table" level="document" category="tables" file="tabl-tab.mkiv"/> - <cd:command name="AR" scope="table" file="tabl-tab.mkiv"/> + <cd:command name="AR" scope="table" level="document" category="tables" file="tabl-tab.mkiv"/> - <cd:command name="VL" scope="table" file="tabl-tab.mkiv"> + <cd:command name="VL" scope="table" level="document" category="tables" file="tabl-tab.mkiv"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:number"/> @@ -277,7 +277,7 @@ </cd:arguments> </cd:command> - <cd:command name="VC" scope="table" file="tabl-tab.mkiv"> + <cd:command name="VC" scope="table" level="document" category="tables" file="tabl-tab.mkiv"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:number"/> @@ -286,7 +286,7 @@ </cd:arguments> </cd:command> - <cd:command name="HL" scope="table" file="tabl-tab.mkiv"> + <cd:command name="HL" scope="table" level="document" category="tables" file="tabl-tab.mkiv"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:number"/> @@ -295,7 +295,7 @@ </cd:arguments> </cd:command> - <cd:command name="HC" scope="table" file="tabl-tab.mkiv"> + <cd:command name="HC" scope="table" level="document" category="tables" file="tabl-tab.mkiv"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:number"/> @@ -304,7 +304,7 @@ </cd:arguments> </cd:command> - <cd:command name="VS" scope="table" file="tabl-tab.mkiv"> + <cd:command name="VS" scope="table" level="document" category="tables" file="tabl-tab.mkiv"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:number"/> @@ -313,7 +313,7 @@ </cd:arguments> </cd:command> - <cd:command name="VD" scope="table" file="tabl-tab.mkiv"> + <cd:command name="VD" scope="table" level="document" category="tables" file="tabl-tab.mkiv"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:number"/> @@ -322,7 +322,7 @@ </cd:arguments> </cd:command> - <cd:command name="VT" scope="table" file="tabl-tab.mkiv"> + <cd:command name="VT" scope="table" level="document" category="tables" file="tabl-tab.mkiv"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:number"/> @@ -331,7 +331,7 @@ </cd:arguments> </cd:command> - <cd:command name="VN" scope="table" file="tabl-tab.mkiv"> + <cd:command name="VN" scope="table" level="document" category="tables" file="tabl-tab.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> <cd:keywords list="yes" optional="yes"> @@ -341,7 +341,7 @@ </cd:arguments> </cd:command> - <cd:command name="TB" scope="table" file="tabl-tab.mkiv"> + <cd:command name="TB" scope="table" level="document" category="tables" file="tabl-tab.mkiv"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:inherit name="blank"/> @@ -349,7 +349,7 @@ </cd:arguments> </cd:command> - <cd:command name="NL" scope="table" file="tabl-tab.mkiv"> + <cd:command name="NL" scope="table" level="document" category="tables" file="tabl-tab.mkiv"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:inherit name="blank"/> @@ -357,17 +357,17 @@ </cd:arguments> </cd:command> - <cd:command name="NR" scope="table" file="tabl-tab.mkiv"/> + <cd:command name="NR" scope="table" level="document" category="tables" file="tabl-tab.mkiv"/> - <cd:command name="NC" scope="table" file="tabl-tab.mkiv"/> + <cd:command name="NC" scope="table" level="document" category="tables" file="tabl-tab.mkiv"/> - <cd:command name="FC" scope="table" file="tabl-tab.mkiv"/> + <cd:command name="FC" scope="table" level="document" category="tables" file="tabl-tab.mkiv"/> - <cd:command name="MC" scope="table" file="tabl-tab.mkiv"/> + <cd:command name="MC" scope="table" level="document" category="tables" file="tabl-tab.mkiv"/> - <cd:command name="LC" scope="table" file="tabl-tab.mkiv"/> + <cd:command name="LC" scope="table" level="document" category="tables" file="tabl-tab.mkiv"/> - <cd:command name="DL" scope="table" file="tabl-tab.mkiv"> + <cd:command name="DL" scope="table" level="document" category="tables" file="tabl-tab.mkiv"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:number"/> @@ -376,29 +376,29 @@ </cd:arguments> </cd:command> - <cd:command name="DC" scope="table" file="tabl-tab.mkiv"/> + <cd:command name="DC" scope="table" level="document" category="tables" file="tabl-tab.mkiv"/> - <cd:command name="DV" scope="table" file="tabl-tab.mkiv"/> + <cd:command name="DV" scope="table" level="document" category="tables" file="tabl-tab.mkiv"/> - <cd:command name="DR" scope="table" file="tabl-tab.mkiv"/> + <cd:command name="DR" scope="table" level="document" category="tables" file="tabl-tab.mkiv"/> - <cd:command name="TWO" scope="table" file="tabl-tab.mkiv"/> + <cd:command name="TWO" scope="table" level="document" category="tables" file="tabl-tab.mkiv"/> - <cd:command name="THREE" scope="table" file="tabl-tab.mkiv"/> + <cd:command name="THREE" scope="table" level="document" category="tables" file="tabl-tab.mkiv"/> - <cd:command name="FOUR" scope="table" file="tabl-tab.mkiv"/> + <cd:command name="FOUR" scope="table" level="document" category="tables" file="tabl-tab.mkiv"/> - <cd:command name="FIVE" scope="table" file="tabl-tab.mkiv"/> + <cd:command name="FIVE" scope="table" level="document" category="tables" file="tabl-tab.mkiv"/> - <cd:command name="SIX" scope="table" file="tabl-tab.mkiv"/> + <cd:command name="SIX" scope="table" level="document" category="tables" file="tabl-tab.mkiv"/> - <cd:command name="SPAN" scope="table" file="tabl-tab.mkiv"> + <cd:command name="SPAN" scope="table" level="document" category="tables" file="tabl-tab.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="REF" scope="table" file="tabl-tab.mkiv"> + <cd:command name="REF" scope="table" level="document" category="tables" file="tabl-tab.mkiv"> <cd:arguments> <cd:resolve name="keyword-template"/> <cd:content/> @@ -407,4 +407,4 @@ --> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-tabulation.xml b/tex/context/interface/mkiv/i-tabulation.xml index be3a602ac..3efc34f42 100644 --- a/tex/context/interface/mkiv/i-tabulation.xml +++ b/tex/context/interface/mkiv/i-tabulation.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definetabulation" file="tabl-tbl.mkiv"> + <cd:command name="definetabulation" level="style" category="tables" file="tabl-tbl.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setuptabulation" file="tabl-tbl.mkiv"> + <cd:command name="setuptabulation" level="style" category="tables" file="tabl-tbl.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -99,7 +99,7 @@ </cd:arguments> </cd:command> - <cd:command name="tabulation" type="environment" generated="yes" variant="example" file="tabl-tbl.mkiv"> + <cd:command name="tabulation" type="environment" generated="yes" variant="example" level="document" category="tables" file="tabl-tbl.mkiv"> <cd:sequence> <cd:variable value="tabulation"/> </cd:sequence> @@ -111,7 +111,7 @@ </cd:arguments> </cd:command> - <cd:command name="definetabulate" file="tabl-tbl.mkiv"> + <cd:command name="definetabulate" level="style" category="tables" file="tabl-tbl.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -119,7 +119,7 @@ </cd:arguments> </cd:command> - <cd:command name="setuptabulate" file="tabl-tbl.mkiv"> + <cd:command name="setuptabulate" level="style" category="tables" file="tabl-tbl.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:resolve name="keyword-name-optional"/> @@ -129,7 +129,7 @@ </cd:arguments> </cd:command> - <cd:command name="tabulate" type="environment" file="tabl-tbl.mkiv"> + <cd:command name="tabulate" type="environment" level="document" category="tables" file="tabl-tbl.mkiv"> <cd:arguments> <cd:template optional="yes"/> <cd:assignments list="yes" optional="yes"> @@ -138,7 +138,7 @@ </cd:arguments> </cd:command> - <cd:command name="tabulate" type="environment" generated="yes" variant="instance" file="tabl-tbl.mkiv"> + <cd:command name="tabulate" type="environment" generated="yes" variant="instance" level="document" category="tables" file="tabl-tbl.mkiv"> <cd:sequence> <cd:instance value="tabulate"/> </cd:sequence> @@ -153,29 +153,29 @@ </cd:instances> </cd:command> - <cd:command name="tabulatehead" type="environment" file="tabl-tbl.mkiv"> + <cd:command name="tabulatehead" type="environment" level="document" category="tables" file="tabl-tbl.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> </cd:arguments> </cd:command> - <cd:command name="tabulatetail" type="environment" file="tabl-tbl.mkiv"> + <cd:command name="tabulatetail" type="environment" level="document" category="tables" file="tabl-tbl.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> </cd:arguments> </cd:command> - <cd:command name="tabulaterule" file="tabl-tbl.mkiv"/> + <cd:command name="tabulaterule" level="document" category="tables" file="tabl-tbl.mkiv"/> - <cd:command name="tabulateline" file="tabl-tbl.mkiv"/> + <cd:command name="tabulateline" level="document" category="tables" file="tabl-tbl.mkiv"/> - <cd:command name="tabulateautorule" file="tabl-tbl.mkiv"/> + <cd:command name="tabulateautorule" level="document" category="tables" file="tabl-tbl.mkiv"/> - <cd:command name="tabulateautoline" file="tabl-tbl.mkiv"/> + <cd:command name="tabulateautoline" level="document" category="tables" file="tabl-tbl.mkiv"/> <!-- - <cd:command name="legend" type="environment" file="tabl-tbl.mkiv"> + <cd:command name="legend" type="environment" level="document" category="tables" file="tabl-tbl.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:assignments list="yes" optional="yes"> @@ -184,7 +184,7 @@ </cd:arguments> </cd:command> - <cd:command name="fact" type="environment" file="tabl-tbl.mkiv"> + <cd:command name="fact" type="environment" level="document" category="tables" file="tabl-tbl.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:assignments list="yes" optional="yes"> @@ -193,7 +193,7 @@ </cd:arguments> </cd:command> - <cd:command name="VL" scope="tabulate" file="tabl-tbl.mkiv"> + <cd:command name="VL" scope="tabulate" level="document" category="tables" file="tabl-tbl.mkiv"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="cd:number"/> @@ -202,76 +202,78 @@ </cd:arguments> </cd:command> - <cd:command name="NC" scope="tabulate" file="tabl-tbl.mkiv"/> + <cd:command name="NC" scope="tabulate" level="document" category="tables" file="tabl-tbl.mkiv"/> - <cd:command name="RC" scope="tabulate" file="tabl-tbl.mkiv"/> + <cd:command name="NI" scope="tabulate" level="document" category="tables" file="tabl-tbl.mkiv"/> - <cd:command name="HC" scope="tabulate" file="tabl-tbl.mkiv"/> + <cd:command name="RC" scope="tabulate" level="document" category="tables" file="tabl-tbl.mkiv"/> - <cd:command name="EQ" scope="tabulate" file="tabl-tbl.mkiv"/> + <cd:command name="HC" scope="tabulate" level="document" category="tables" file="tabl-tbl.mkiv"/> - <cd:command name="RQ" scope="tabulate" file="tabl-tbl.mkiv"/> + <cd:command name="EQ" scope="tabulate" level="document" category="tables" file="tabl-tbl.mkiv"/> - <cd:command name="HQ" scope="tabulate" file="tabl-tbl.mkiv"/> + <cd:command name="RQ" scope="tabulate" level="document" category="tables" file="tabl-tbl.mkiv"/> - <cd:command name="NG" scope="tabulate" file="tabl-tbl.mkiv"/> + <cd:command name="HQ" scope="tabulate" level="document" category="tables" file="tabl-tbl.mkiv"/> - <cd:command name="NN" scope="tabulate" file="tabl-tbl.mkiv"/> + <cd:command name="NG" scope="tabulate" level="document" category="tables" file="tabl-tbl.mkiv"/> - <cd:command name="ND" scope="tabulate" file="tabl-tbl.mkiv"/> + <cd:command name="NN" scope="tabulate" level="document" category="tables" file="tabl-tbl.mkiv"/> - <cd:command name="NR" scope="tabulate" file="tabl-tbl.mkiv"/> + <cd:command name="ND" scope="tabulate" level="document" category="tables" file="tabl-tbl.mkiv"/> - <cd:command name="NB" scope="tabulate" file="tabl-tbl.mkiv"/> + <cd:command name="NR" scope="tabulate" level="document" category="tables" file="tabl-tbl.mkiv"/> - <cd:command name="CC" scope="tabulate" file="tabl-tbl.mkiv"> + <cd:command name="NB" scope="tabulate" level="document" category="tables" file="tabl-tbl.mkiv"/> + + <cd:command name="CC" scope="tabulate" level="document" category="tables" file="tabl-tbl.mkiv"> <cd:arguments> <cd:resolve name="keyword-color-optional"/> </cd:arguments> </cd:command> - <cd:command name="CL" scope="tabulate" file="tabl-tbl.mkiv"> + <cd:command name="CL" scope="tabulate" level="document" category="tables" file="tabl-tbl.mkiv"> <cd:arguments> <cd:resolve name="keyword-color-optional"/> </cd:arguments> </cd:command> - <cd:command name="CM" scope="tabulate" file="tabl-tbl.mkiv"> + <cd:command name="CM" scope="tabulate" level="document" category="tables" file="tabl-tbl.mkiv"> <cd:arguments> <cd:resolve name="keyword-color-optional"/> </cd:arguments> </cd:command> - <cd:command name="CR" scope="tabulate" file="tabl-tbl.mkiv"> + <cd:command name="CR" scope="tabulate" level="document" category="tables" file="tabl-tbl.mkiv"> <cd:arguments> <cd:resolve name="keyword-color-optional"/> </cd:arguments> </cd:command> - <cd:command name="SR" scope="tabulate" file="tabl-tbl.mkiv"/> + <cd:command name="SR" scope="tabulate" level="document" category="tables" file="tabl-tbl.mkiv"/> - <cd:command name="FR" scope="tabulate" file="tabl-tbl.mkiv"/> + <cd:command name="FR" scope="tabulate" level="document" category="tables" file="tabl-tbl.mkiv"/> - <cd:command name="MR" scope="tabulate" file="tabl-tbl.mkiv"/> + <cd:command name="MR" scope="tabulate" level="document" category="tables" file="tabl-tbl.mkiv"/> - <cd:command name="LR" scope="tabulate" file="tabl-tbl.mkiv"/> + <cd:command name="LR" scope="tabulate" level="document" category="tables" file="tabl-tbl.mkiv"/> - <cd:command name="AR" scope="tabulate" file="tabl-tbl.mkiv"/> + <cd:command name="AR" scope="tabulate" level="document" category="tables" file="tabl-tbl.mkiv"/> - <cd:command name="FL" scope="tabulate" file="tabl-tbl.mkiv"/> + <cd:command name="FL" scope="tabulate" level="document" category="tables" file="tabl-tbl.mkiv"/> - <cd:command name="ML" scope="tabulate" file="tabl-tbl.mkiv"/> + <cd:command name="ML" scope="tabulate" level="document" category="tables" file="tabl-tbl.mkiv"/> - <cd:command name="LL" scope="tabulate" file="tabl-tbl.mkiv"/> + <cd:command name="LL" scope="tabulate" level="document" category="tables" file="tabl-tbl.mkiv"/> - <cd:command name="TL" scope="tabulate" file="tabl-tbl.mkiv"/> + <cd:command name="TL" scope="tabulate" level="document" category="tables" file="tabl-tbl.mkiv"/> - <cd:command name="BL" scope="tabulate" file="tabl-tbl.mkiv"/> + <cd:command name="BL" scope="tabulate" level="document" category="tables" file="tabl-tbl.mkiv"/> - <cd:command name="HL" scope="tabulate" file="tabl-tbl.mkiv"/> + <cd:command name="HL" scope="tabulate" level="document" category="tables" file="tabl-tbl.mkiv"/> - <cd:command name="HR" scope="tabulate" file="tabl-tbl.mkiv"/> + <cd:command name="HR" scope="tabulate" level="document" category="tables" file="tabl-tbl.mkiv"/> --> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-tagging.xml b/tex/context/interface/mkiv/i-tagging.xml index 063a0c436..3e0d49d80 100644 --- a/tex/context/interface/mkiv/i-tagging.xml +++ b/tex/context/interface/mkiv/i-tagging.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="setuptagging" file="strc-tag.mkiv"> + <cd:command name="setuptagging" level="style" category="xml" file="strc-tag.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="state"> @@ -18,21 +18,21 @@ </cd:arguments> </cd:command> - <cd:command name="tagged" type="environment" begin="dostart" end="dostop" file="strc-tag.mkiv"> + <cd:command name="tagged" type="environment" begin="dostart" end="dostop" level="system" category="xml" file="strc-tag.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="element" type="environment" file="strc-tag.mkiv"> + <cd:command name="element" type="environment" category="xml" file="strc-tag.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="assignment-userdata-list-optional"/> </cd:arguments> </cd:command> - <cd:command name="doifelseinelement" file="strc-tag.mkiv"> + <cd:command name="doifelseinelement" level="system" category="xml conditional" file="strc-tag.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -40,7 +40,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifinelementelse" file="strc-tag.mkiv"> + <cd:command name="doifinelementelse" level="system" category="xml conditional" file="strc-tag.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -48,7 +48,7 @@ </cd:arguments> </cd:command> - <cd:command name="taggedlabeltexts" file="strc-tag.mkiv"> + <cd:command name="taggedlabeltexts" level="system" category="xml language" file="strc-tag.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-name"/> @@ -56,7 +56,7 @@ </cd:arguments> </cd:command> - <cd:command name="namedtaggedlabeltexts" file="strc-tag.mkiv"> + <cd:command name="namedtaggedlabeltexts" level="system" category="xml language" file="strc-tag.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-name"/> @@ -66,10 +66,10 @@ </cd:arguments> </cd:command> - <cd:command name="settaggedmetadata" file="strc-tag.mkiv"> + <cd:command name="settaggedmetadata" level="document" category="xml" file="strc-tag.mkiv"> <cd:arguments> <cd:resolve name="assignment-userdata-list"/> </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-tex.xml b/tex/context/interface/mkiv/i-tex.xml new file mode 100644 index 000000000..277c4db95 --- /dev/null +++ b/tex/context/interface/mkiv/i-tex.xml @@ -0,0 +1,457 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<?context-directive job ctxfile x-setups.ctx ?> + +<cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> + + <cd:command name="␣" level="primitive"/> + + <cd:command name="-" level="primitive"/> + + <cd:command name="/" level="primitive"/> + + <cd:command name="above" level="primitive"> + <cd:arguments> + <cd:resolve name="string-dimension"/> + </cd:arguments> + </cd:command> + + <!-- + + <cd:command name="abovedisplayshortskip" level="primitive"> + + --> + + <cd:command name="abovedisplayshortskip" level="primitive"> + <cd:arguments> + <cd:resolve name="string-assignment-optional"/> + <cd:resolve name="string-dimension"/> + </cd:arguments> + </cd:command> + + <!-- + + <cd:command name="abovedisplayskip" level="primitive"/> + + --> + + <cd:command name="abovedisplayskip" level="primitive"> + <cd:arguments> + <cd:resolve name="string-assignment-optional"/> + <cd:resolve name="string-dimension"/> + </cd:arguments> + </cd:command> + + <cd:command name="abovewithdelims" level="primitive"> + <cd:arguments> + <cd:resolve name="string-text"/> + <cd:resolve name="string-text"/> + <cd:resolve name="string-dimension"/> + </cd:arguments> + </cd:command> + +<cd:command name="accent" level="primitive"/> +<cd:command name="adjdemerits" level="primitive"/> +<cd:command name="advance" level="primitive"/> +<cd:command name="afterassignment" level="primitive"/> +<cd:command name="aftergroup" level="primitive"/> +<cd:command name="atop" level="primitive"/> +<cd:command name="atopwithdelims" level="primitive"/> +<cd:command name="badness" level="primitive"/> +<cd:command name="baselineskip" level="primitive"/> +<cd:command name="batchmode" level="primitive"/> +<cd:command name="begingroup" level="primitive"/> +<cd:command name="belowdisplayshortskip" level="primitive"/> +<cd:command name="belowdisplayskip" level="primitive"/> +<cd:command name="binoppenalty" level="primitive"/> +<cd:command name="botmark" level="primitive"/> +<cd:command name="box" level="primitive"/> +<cd:command name="boxmaxdepth" level="primitive"/> +<cd:command name="brokenpenalty" level="primitive"/> +<cd:command name="catcode" level="primitive"/> +<cd:command name="char" level="primitive"/> +<cd:command name="chardef" level="primitive"/> +<cd:command name="cleaders" level="primitive"/> +<cd:command name="closein" level="primitive"/> +<cd:command name="closeout" level="primitive"/> +<cd:command name="clubpenalty" level="primitive"/> +<cd:command name="copy" level="primitive"/> +<cd:command name="count" level="primitive"/> +<cd:command name="countdef" level="primitive"/> +<cd:command name="cr" level="primitive"/> +<cd:command name="crcr" level="primitive"/> +<cd:command name="csname" level="primitive"/> +<cd:command name="day" level="primitive"/> +<cd:command name="deadcycles" level="primitive"/> +<cd:command name="def" level="primitive"/> +<cd:command name="defaulthyphenchar" level="primitive"/> +<cd:command name="defaultskewchar" level="primitive"/> +<cd:command name="delcode" level="primitive"/> +<cd:command name="delimiter" level="primitive"/> +<cd:command name="delimiterfactor" level="primitive"/> +<cd:command name="delimitershortfall" level="primitive"/> +<cd:command name="dimen" level="primitive"/> +<cd:command name="dimendef" level="primitive"/> +<cd:command name="discretionary" level="primitive"/> +<cd:command name="displayindent" level="primitive"/> +<cd:command name="displaylimits" level="primitive"/> +<cd:command name="displaystyle" level="primitive"/> +<cd:command name="displaywidowpenalty" level="primitive"/> +<cd:command name="displaywidth" level="primitive"/> +<cd:command name="divide" level="primitive"/> +<cd:command name="doublehyphendemerits" level="primitive"/> +<cd:command name="dp" level="primitive"/> +<cd:command name="dump" level="primitive"/> +<cd:command name="edef" level="primitive"/> +<cd:command name="else" level="primitive"/> +<cd:command name="emergencystretch" level="primitive"/> +<cd:command name="end" level="primitive"/> +<cd:command name="endcsname" level="primitive"/> +<cd:command name="endgroup" level="primitive"/> +<cd:command name="endinput" level="primitive"/> +<cd:command name="endlinechar" level="primitive"/> +<cd:command name="eqno" level="primitive"/> +<cd:command name="errhelp" level="primitive"/> +<cd:command name="errmessage" level="primitive"/> +<cd:command name="errorcontextlines" level="primitive"/> +<cd:command name="errorstopmode" level="primitive"/> +<cd:command name="escapechar" level="primitive"/> +<cd:command name="everycr" level="primitive"/> +<cd:command name="everydisplay" level="primitive"/> +<cd:command name="everyhbox" level="primitive"/> +<cd:command name="everyjob" level="primitive"/> +<cd:command name="everymath" level="primitive"/> +<cd:command name="everypar" level="primitive"/> +<cd:command name="everyvbox" level="primitive"/> +<cd:command name="exhyphenpenalty" level="primitive"/> +<cd:command name="expandafter" level="primitive"/> +<cd:command name="fam" level="primitive"/> +<cd:command name="fi" level="primitive"/> +<cd:command name="finalhyphendemerits" level="primitive"/> +<cd:command name="firstmark" level="primitive"/> +<cd:command name="floatingpenalty" level="primitive"/> +<cd:command name="font" level="primitive"/> +<cd:command name="fontdimen" level="primitive"/> +<cd:command name="fontname" level="primitive"/> +<cd:command name="futurelet" level="primitive"/> +<cd:command name="gdef" level="primitive"/> +<cd:command name="global" level="primitive"/> +<cd:command name="globaldefs" level="primitive"/> +<cd:command name="halign" level="primitive"/> +<cd:command name="hangafter" level="primitive"/> +<cd:command name="hangindent" level="primitive"/> +<cd:command name="hbadness" level="primitive"/> +<cd:command name="hbox" level="primitive"/> +<cd:command name="hfil" level="primitive"/> +<cd:command name="hfill" level="primitive"/> +<cd:command name="hfilneg" level="primitive"/> +<cd:command name="hfuzz" level="primitive"/> +<cd:command name="hoffset" level="primitive"/> +<cd:command name="holdinginserts" level="primitive"/> +<cd:command name="hrule" level="primitive"/> +<cd:command name="hsize" level="primitive"/> +<cd:command name="hskip" level="primitive"/> +<cd:command name="hss" level="primitive"/> +<cd:command name="ht" level="primitive"/> +<cd:command name="hyphenation" level="primitive"/> +<cd:command name="hyphenchar" level="primitive"/> +<cd:command name="hyphenpenalty" level="primitive"/> + + <!-- + + <cd:command name="if" level="primitive"/> + + --> + + <cd:command name="if" level="primitive"> + <cd:arguments> + <cd:resolve name="string-text"/> + <cd:resolve name="string-text"/> + <cd:resolve name="string-text"/> + <cd:delimiter name="else"/> + <cd:resolve name="string-text"/> + <cd:delimiter name="fi"/> + </cd:arguments> + </cd:command> + + <!-- + + <cd:command name="ifcase" level="primitive"/> + + --> + + <cd:command name="ifcase" level="primitive"> + <cd:arguments> + <cd:resolve name="string-number"/> + <cd:resolve name="string-text"/> + <cd:delimiter name="or"/> + <cd:resolve name="string-text"/> + <cd:delimiter name="else"/> + <cd:resolve name="string-text"/> + <cd:delimiter name="fi"/> + </cd:arguments> + </cd:command> + + <!-- + + <cd:command name="ifcat" level="primitive"/> + + --> + + <cd:command name="ifcat" level="primitive"> + <cd:arguments> + <cd:resolve name="string-text"/> + <cd:resolve name="string-text"/> + <cd:resolve name="string-text"/> + <cd:delimiter name="else"/> + <cd:resolve name="string-text"/> + <cd:delimiter name="fi"/> + </cd:arguments> + </cd:command> + +<cd:command name="ifdim" level="primitive"/> +<cd:command name="ifeof" level="primitive"/> + + <!-- + + <cd:command name="iffalse" level="primitive"/> + + --> + + <cd:command name="iffalse" level="primitive"> + <cd:arguments> + <cd:resolve name="string-text"/> + <cd:delimiter name="else"/> + <cd:resolve name="string-text"/> + <cd:delimiter name="fi"/> + </cd:arguments> + </cd:command> + +<cd:command name="ifhbox" level="primitive"/> +<cd:command name="ifhmode" level="primitive"/> +<cd:command name="ifinner" level="primitive"/> +<cd:command name="ifmmode" level="primitive"/> +<cd:command name="ifnum" level="primitive"/> +<cd:command name="ifodd" level="primitive"/> + + <!-- + + <cd:command name="iftrue" level="primitive"/> + + --> + + <cd:command name="iftrue" level="primitive"> + <cd:arguments> + <cd:resolve name="string-text"/> + <cd:delimiter name="else"/> + <cd:resolve name="string-text"/> + <cd:delimiter name="fi"/> + </cd:arguments> + </cd:command> + +<cd:command name="ifvbox" level="primitive"/> +<cd:command name="ifvmode" level="primitive"/> +<cd:command name="ifvoid" level="primitive"/> +<cd:command name="ifx" level="primitive"/> +<cd:command name="ignorespaces" level="primitive"/> +<cd:command name="immediate" level="primitive"/> +<cd:command name="indent" level="primitive"/> +<cd:command name="input" level="primitive"/> +<cd:command name="inputlineno" level="primitive"/> +<cd:command name="insert" level="primitive"/> +<cd:command name="insertpenalties" level="primitive"/> +<cd:command name="interlinepenalty" level="primitive"/> +<cd:command name="jobname" level="primitive"/> +<cd:command name="kern" level="primitive"/> +<cd:command name="language" level="primitive"/> +<cd:command name="lastbox" level="primitive"/> +<cd:command name="lastkern" level="primitive"/> +<cd:command name="lastpenalty" level="primitive"/> +<cd:command name="lastskip" level="primitive"/> +<cd:command name="lccode" level="primitive"/> +<cd:command name="leaders" level="primitive"/> +<cd:command name="left" level="primitive"/> +<cd:command name="lefthyphenmin" level="primitive"/> +<cd:command name="leftskip" level="primitive"/> +<cd:command name="leqno" level="primitive"/> +<cd:command name="let" level="primitive"/> +<cd:command name="limits" level="primitive"/> +<cd:command name="linepenalty" level="primitive"/> +<cd:command name="lineskip" level="primitive"/> +<cd:command name="lineskiplimit" level="primitive"/> +<cd:command name="long" level="primitive"/> +<cd:command name="looseness" level="primitive"/> +<cd:command name="lower" level="primitive"/> +<cd:command name="lowercase" level="primitive"/> +<cd:command name="mag" level="primitive"/> +<cd:command name="mark" level="primitive"/> +<cd:command name="mathaccent" level="primitive"/> +<cd:command name="mathbin" level="primitive"/> +<cd:command name="mathchar" level="primitive"/> +<cd:command name="mathchardef" level="primitive"/> +<cd:command name="mathchoice" level="primitive"/> +<cd:command name="mathclose" level="primitive"/> +<cd:command name="mathcode" level="primitive"/> +<cd:command name="mathinner" level="primitive"/> +<cd:command name="mathop" level="primitive"/> +<cd:command name="mathopen" level="primitive"/> +<cd:command name="mathord" level="primitive"/> +<cd:command name="mathpunct" level="primitive"/> +<cd:command name="mathrel" level="primitive"/> +<cd:command name="mathsurround" level="primitive"/> +<cd:command name="maxdeadcycles" level="primitive"/> +<cd:command name="maxdepth" level="primitive"/> +<cd:command name="meaning" level="primitive"/> +<cd:command name="medmuskip" level="primitive"/> +<cd:command name="message" level="primitive"/> +<cd:command name="mkern" level="primitive"/> +<cd:command name="month" level="primitive"/> +<cd:command name="moveleft" level="primitive"/> +<cd:command name="moveright" level="primitive"/> +<cd:command name="mskip" level="primitive"/> +<cd:command name="multiply" level="primitive"/> +<cd:command name="muskip" level="primitive"/> +<cd:command name="muskipdef" level="primitive"/> +<cd:command name="newlinechar" level="primitive"/> +<cd:command name="noalign" level="primitive"/> +<cd:command name="noboundary" level="primitive"/> +<cd:command name="noexpand" level="primitive"/> +<cd:command name="noindent" level="primitive"/> +<cd:command name="nolimits" level="primitive"/> +<cd:command name="nonscript" level="primitive"/> +<cd:command name="nonstopmode" level="primitive"/> +<cd:command name="nulldelimiterspace" level="primitive"/> +<cd:command name="nullfont" level="primitive"/> +<cd:command name="number" level="primitive"/> +<cd:command name="omit" level="primitive"/> +<cd:command name="openin" level="primitive"/> +<cd:command name="openout" level="primitive"/> +<cd:command name="or" level="primitive"/> +<cd:command name="outer" level="primitive"/> +<cd:command name="output" level="primitive"/> +<cd:command name="outputpenalty" level="primitive"/> +<cd:command name="over" level="primitive"/> +<cd:command name="overfullrule" level="primitive"/> +<cd:command name="overline" level="primitive"/> +<cd:command name="overwithdelims" level="primitive"/> +<cd:command name="pagedepth" level="primitive"/> +<cd:command name="pagefilllstretch" level="primitive"/> +<cd:command name="pagefillstretch" level="primitive"/> +<cd:command name="pagefilstretch" level="primitive"/> +<cd:command name="pagegoal" level="primitive"/> +<cd:command name="pageshrink" level="primitive"/> +<cd:command name="pagestretch" level="primitive"/> +<cd:command name="pagetotal" level="primitive"/> +<cd:command name="par" level="primitive"/> +<cd:command name="parfillskip" level="primitive"/> +<cd:command name="parindent" level="primitive"/> +<cd:command name="parshape" level="primitive"/> +<cd:command name="parskip" level="primitive"/> +<cd:command name="patterns" level="primitive"/> +<cd:command name="pausing" level="primitive"/> +<cd:command name="penalty" level="primitive"/> +<cd:command name="postdisplaypenalty" level="primitive"/> +<cd:command name="predisplaypenalty" level="primitive"/> +<cd:command name="predisplaysize" level="primitive"/> +<cd:command name="pretolerance" level="primitive"/> +<cd:command name="prevdepth" level="primitive"/> +<cd:command name="prevgraf" level="primitive"/> +<cd:command name="radical" level="primitive"/> +<cd:command name="raise" level="primitive"/> +<cd:command name="read" level="primitive"/> + + <cd:command name="relax" level="primitive"/> + +<cd:command name="relpenalty" level="primitive"/> +<cd:command name="right" level="primitive"/> +<cd:command name="righthyphenmin" level="primitive"/> +<cd:command name="rightskip" level="primitive"/> +<cd:command name="romannumeral" level="primitive"/> +<cd:command name="scriptfont" level="primitive"/> +<cd:command name="scriptscriptfont" level="primitive"/> +<cd:command name="scriptscriptstyle" level="primitive"/> +<cd:command name="scriptspace" level="primitive"/> +<cd:command name="scriptstyle" level="primitive"/> +<cd:command name="scrollmode" level="primitive"/> +<cd:command name="setbox" level="primitive"/> +<cd:command name="setlanguage" level="primitive"/> +<cd:command name="sfcode" level="primitive"/> +<cd:command name="shipout" level="primitive"/> +<cd:command name="show" level="primitive"/> +<cd:command name="showbox" level="primitive"/> +<cd:command name="showboxbreadth" level="primitive"/> +<cd:command name="showboxdepth" level="primitive"/> +<cd:command name="showlists" level="primitive"/> +<cd:command name="showthe" level="primitive"/> +<cd:command name="skewchar" level="primitive"/> +<cd:command name="skip" level="primitive"/> +<cd:command name="skipdef" level="primitive"/> +<cd:command name="spacefactor" level="primitive"/> +<cd:command name="spaceskip" level="primitive"/> +<cd:command name="span" level="primitive"/> +<cd:command name="special" level="primitive"/> +<cd:command name="splitbotmark" level="primitive"/> +<cd:command name="splitfirstmark" level="primitive"/> +<cd:command name="splitmaxdepth" level="primitive"/> +<cd:command name="splittopskip" level="primitive"/> +<cd:command name="string" level="primitive"/> +<cd:command name="tabskip" level="primitive"/> +<cd:command name="textfont" level="primitive"/> +<cd:command name="textstyle" level="primitive"/> +<cd:command name="the" level="primitive"/> +<cd:command name="thickmuskip" level="primitive"/> +<cd:command name="thinmuskip" level="primitive"/> +<cd:command name="time" level="primitive"/> +<cd:command name="toks" level="primitive"/> +<cd:command name="toksdef" level="primitive"/> +<cd:command name="tolerance" level="primitive"/> +<cd:command name="topmark" level="primitive"/> +<cd:command name="topskip" level="primitive"/> +<cd:command name="tracingcommands" level="primitive"/> +<cd:command name="tracinglostchars" level="primitive"/> +<cd:command name="tracingmacros" level="primitive"/> +<cd:command name="tracingonline" level="primitive"/> +<cd:command name="tracingoutput" level="primitive"/> +<cd:command name="tracingpages" level="primitive"/> +<cd:command name="tracingparagraphs" level="primitive"/> +<cd:command name="tracingrestores" level="primitive"/> +<cd:command name="tracingstats" level="primitive"/> +<cd:command name="uccode" level="primitive"/> +<cd:command name="uchyph" level="primitive"/> +<cd:command name="underline" level="primitive"/> +<cd:command name="unhbox" level="primitive"/> +<cd:command name="unhcopy" level="primitive"/> +<cd:command name="unkern" level="primitive"/> +<cd:command name="unpenalty" level="primitive"/> +<cd:command name="unskip" level="primitive"/> +<cd:command name="unvbox" level="primitive"/> +<cd:command name="unvcopy" level="primitive"/> +<cd:command name="uppercase" level="primitive"/> +<cd:command name="vadjust" level="primitive"/> +<cd:command name="valign" level="primitive"/> +<cd:command name="vbadness" level="primitive"/> +<cd:command name="vbox" level="primitive"/> +<cd:command name="vcenter" level="primitive"/> + + <cd:command name="vfil" level="primitive"/> + + <cd:command name="vfill" level="primitive"/> + +<cd:command name="vfilneg" level="primitive"/> +<cd:command name="vfuzz" level="primitive"/> +<cd:command name="voffset" level="primitive"/> +<cd:command name="vrule" level="primitive"/> +<cd:command name="vsize" level="primitive"/> +<cd:command name="vskip" level="primitive"/> +<cd:command name="vsplit" level="primitive"/> +<cd:command name="vss" level="primitive"/> +<cd:command name="vtop" level="primitive"/> +<cd:command name="wd" level="primitive"/> +<cd:command name="widowpenalty" level="primitive"/> +<cd:command name="write" level="primitive"/> +<cd:command name="xdef" level="primitive"/> +<cd:command name="xleaders" level="primitive"/> +<cd:command name="xspaceskip" level="primitive"/> +<cd:command name="year" level="primitive"/> + +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-textbackground.xml b/tex/context/interface/mkiv/i-textbackground.xml index bc16ffa8d..6104b1d9a 100644 --- a/tex/context/interface/mkiv/i-textbackground.xml +++ b/tex/context/interface/mkiv/i-textbackground.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definetextbackground" file="anch-bck.mkiv"> + <cd:command name="definetextbackground" level="style" category="background" file="anch-bck.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setuptextbackground" file="anch-bck.mkiv"> + <cd:command name="setuptextbackground" level="style" category="background" file="anch-bck.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -25,8 +25,12 @@ <cd:parameter name="location"> <cd:constant type="text" default="yes"/> <cd:constant type="paragraph"/> + <cd:constant type="always"/> <cd:constant type="none"/> </cd:parameter> + <cd:parameter name="criterium"> + <cd:constant type="cd:number"/> + </cd:parameter> <cd:parameter name="alternative"> <cd:constant type="cd:number"/> </cd:parameter> @@ -113,7 +117,7 @@ </cd:arguments> </cd:command> - <cd:command name="textbackground" type="environment" file="anch-bck.mkiv"> + <cd:command name="textbackground" type="environment" level="document" category="background" file="anch-bck.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes" optional="yes"> @@ -122,7 +126,7 @@ </cd:arguments> </cd:command> - <cd:command name="textbackground" type="environment" generated="yes" variant="example" file="anch-bck.mkiv"> + <cd:command name="textbackground" type="environment" generated="yes" variant="example" level="document" category="background" file="anch-bck.mkiv"> <cd:sequence> <cd:variable value="textbackground"/> </cd:sequence> @@ -133,7 +137,7 @@ </cd:arguments> </cd:command> - <cd:command name="textbackground" generated="yes" variant="example" file="anch-bck.mkiv"> + <cd:command name="textbackground" generated="yes" variant="example" level="document" category="background" file="anch-bck.mkiv"> <cd:sequence> <cd:variable value="textbackground"/> </cd:sequence> @@ -142,6 +146,6 @@ </cd:arguments> </cd:command> - <cd:command name="textbackgroundmanual" type="environment" file="anch-bck.mkiv"/> + <cd:command name="textbackgroundmanual" type="environment" level="system" category="background" file="anch-bck.mkiv"/> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-textflow.xml b/tex/context/interface/mkiv/i-textflow.xml index edcf03492..9c9ea2190 100644 --- a/tex/context/interface/mkiv/i-textflow.xml +++ b/tex/context/interface/mkiv/i-textflow.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definetextflow" file="page-flw.mkiv"> + <cd:command name="definetextflow" level="style" category="structure" file="page-flw.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setuptextflow" file="page-flw.mkiv"> + <cd:command name="setuptextflow" level="style" category="structure" file="page-flw.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -31,13 +31,13 @@ </cd:arguments> </cd:command> - <cd:command name="textflowcollector" file="page-flw.mkiv"> + <cd:command name="textflowcollector" level="system" category="structure" file="page-flw.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="doifelsetextflowcollector" file="page-flw.mkiv"> + <cd:command name="doifelsetextflowcollector" level="system" category="structure conditional" file="page-flw.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -45,7 +45,7 @@ </cd:arguments> </cd:command> - <cd:command name="doiftextflowcollectorelse" file="page-flw.mkiv"> + <cd:command name="doiftextflowcollectorelse" level="system" category="structure conditional" file="page-flw.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -53,7 +53,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifelsetextflow" file="page-flw.mkiv"> + <cd:command name="doifelsetextflow" level="system" category="structure conditional" file="page-flw.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -61,7 +61,7 @@ </cd:arguments> </cd:command> - <cd:command name="doiftextflowelse" file="page-flw.mkiv"> + <cd:command name="doiftextflowelse" level="system" category="structure conditional" file="page-flw.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -69,16 +69,16 @@ </cd:arguments> </cd:command> - <cd:command name="textflow" type="environment" file="page-flw.mkiv"> + <cd:command name="textflow" type="environment" level="document" category="structure" file="page-flw.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="flushtextflow" file="page-flw.mkiv"> + <cd:command name="flushtextflow" level="document" category="structure" file="page-flw.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-textrule.xml b/tex/context/interface/mkiv/i-textrule.xml index a849f44e1..b71df66a6 100644 --- a/tex/context/interface/mkiv/i-textrule.xml +++ b/tex/context/interface/mkiv/i-textrule.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="setuptextrules" file="pack-mrl.mkiv"> + <cd:command name="setuptextrules" level="style" category="rules" file="pack-mrl.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="before"> @@ -52,7 +52,7 @@ </cd:arguments> </cd:command> - <cd:command name="textrule" file="pack-mrl.mkiv"> + <cd:command name="textrule" level="document" category="rules" file="pack-mrl.mkiv"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="top"/> @@ -63,10 +63,10 @@ </cd:arguments> </cd:command> - <cd:command name="textrule" type="environment" file="pack-mrl.mkiv"> + <cd:command name="textrule" type="environment" level="document" category="rules" file="pack-mrl.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-texts.xml b/tex/context/interface/mkiv/i-texts.xml index 009949d35..bd1b128b3 100644 --- a/tex/context/interface/mkiv/i-texts.xml +++ b/tex/context/interface/mkiv/i-texts.xml @@ -6,7 +6,7 @@ <!-- - <cd:command name="definelayoutelement" file="page-txt.mkvi"> + <cd:command name="definelayoutelement" level="system" category="layout" file="page-txt.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -16,7 +16,7 @@ </cd:arguments> </cd:command> - <cd:command name="setuplayoutelement" file="page-txt.mkvi"> + <cd:command name="setuplayoutelement" level="system" category="layout" file="page-txt.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -74,7 +74,7 @@ </cd:arguments> </cd:command> - <cd:command name="setuplayouttext" file="page-txt.mkvi"> + <cd:command name="setuplayouttext" level="system" category="layout" file="page-txt.mkvi"> <cd:arguments> <cd:keywords> <cd:constant type="top"/> @@ -96,7 +96,7 @@ --> - <cd:command name="setuplayouttext" file="page-txt.mkvi"> + <cd:command name="setuplayouttext" level="style" category="layout" file="page-txt.mkvi"> <cd:arguments> <cd:keywords> <cd:constant type="top"/> @@ -165,7 +165,7 @@ </cd:arguments> </cd:command> - <cd:command name="setuptop" file="page-txt.mkvi"> + <cd:command name="setuptop" level="style" category="layout" file="page-txt.mkvi"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="text"/> @@ -178,7 +178,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupheader" file="page-txt.mkvi"> + <cd:command name="setupheader" level="style" category="layout" file="page-txt.mkvi"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="text"/> @@ -191,7 +191,7 @@ </cd:arguments> </cd:command> - <cd:command name="setuptext" file="page-txt.mkvi"> + <cd:command name="setuptext" level="style" category="layout" file="page-txt.mkvi"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="text"/> @@ -204,7 +204,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupfooter" file="page-txt.mkvi"> + <cd:command name="setupfooter" level="style" category="layout" file="page-txt.mkvi"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="text"/> @@ -217,7 +217,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupbottom" file="page-txt.mkvi"> + <cd:command name="setupbottom" level="style" category="layout" file="page-txt.mkvi"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="text"/> @@ -230,7 +230,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifelselayouttextline" file="page-txt.mkvi"> + <cd:command name="doifelselayouttextline" level="system" category="layout conditional" file="page-txt.mkvi"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -238,7 +238,7 @@ </cd:arguments> </cd:command> - <cd:command name="doiflayouttextlineelse" file="page-txt.mkvi"> + <cd:command name="doiflayouttextlineelse" level="system" category="layout conditional" file="page-txt.mkvi"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -246,7 +246,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifelselayoutsomeline" file="page-txt.mkvi"> + <cd:command name="doifelselayoutsomeline" level="system" category="layout conditional" file="page-txt.mkvi"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -254,7 +254,7 @@ </cd:arguments> </cd:command> - <cd:command name="doiflayoutsomelineelse" file="page-txt.mkvi"> + <cd:command name="doiflayoutsomelineelse" level="system" category="layout conditional" file="page-txt.mkvi"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -262,11 +262,11 @@ </cd:arguments> </cd:command> - <cd:command name="noheaderandfooterlines" file="page-txt.mkvi"/> + <cd:command name="noheaderandfooterlines" level="style" category="layout" file="page-txt.mkvi"/> - <cd:command name="notopandbottomlines" file="page-txt.mkvi"/> + <cd:command name="notopandbottomlines" level="style" category="layout" file="page-txt.mkvi"/> - <cd:command name="setuptoptexts" file="page-txt.mkvi"> + <cd:command name="setuptoptexts" level="style" category="layout" file="page-txt.mkvi"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="text" default="yes"/> @@ -280,7 +280,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupheadertexts" file="page-txt.mkvi"> + <cd:command name="setupheadertexts" level="style" category="layout" file="page-txt.mkvi"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="text" default="yes"/> @@ -294,7 +294,7 @@ </cd:arguments> </cd:command> - <cd:command name="setuptexttexts" file="page-txt.mkvi"> + <cd:command name="setuptexttexts" level="style" category="layout" file="page-txt.mkvi"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="text" default="yes"/> @@ -308,7 +308,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupfootertexts" file="page-txt.mkvi"> + <cd:command name="setupfootertexts" level="style" category="layout" file="page-txt.mkvi"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="text" default="yes"/> @@ -322,7 +322,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupbottomtexts" file="page-txt.mkvi"> + <cd:command name="setupbottomtexts" level="style" category="layout" file="page-txt.mkvi"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="text" default="yes"/> @@ -336,7 +336,7 @@ </cd:arguments> </cd:command> - <cd:command name="settextcontent" file="page-txt.mkvi"> + <cd:command name="settextcontent" level="style" category="layout" file="page-txt.mkvi"> <cd:arguments> <cd:keywords> <cd:constant type="top"/> @@ -360,7 +360,7 @@ </cd:arguments> </cd:command> - <cd:command name="definetext" file="page-txt.mkvi"> + <cd:command name="definetext" level="style" category="layout" file="page-txt.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:keywords> @@ -382,4 +382,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-thinrule.xml b/tex/context/interface/mkiv/i-thinrule.xml index b74286e5e..372f9a238 100644 --- a/tex/context/interface/mkiv/i-thinrule.xml +++ b/tex/context/interface/mkiv/i-thinrule.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="setupthinrules" file="pack-mrl.mkiv"> + <cd:command name="setupthinrules" level="style" category="rules" file="pack-mrl.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="height"> @@ -59,11 +59,11 @@ </cd:arguments> </cd:command> - <cd:command name="thinrule" file="pack-mrl.mkiv"/> + <cd:command name="thinrule" level="document" category="rules" file="pack-mrl.mkiv"/> - <cd:command name="hairline" file="pack-mrl.mkiv"/> + <cd:command name="hairline" level="document" category="rules" file="pack-mrl.mkiv"/> - <cd:command name="thinrules" file="pack-mrl.mkiv"> + <cd:command name="thinrules" level="document" category="rules" file="pack-mrl.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupthinrules"/> @@ -71,4 +71,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-todo.xml b/tex/context/interface/mkiv/i-todo.xml new file mode 100644 index 000000000..a3d17515f --- /dev/null +++ b/tex/context/interface/mkiv/i-todo.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" ?> + +<!-- + + page-ffl.mkiv: + + \startfacingfloat[tag] ... \stopfacingfloat + \definefacingfloat + \setupfacingfloat + + keywords: spaceinbetween inbetween style color page + + typo-pnc.mkiv + + \setperiodkerning + \resetperiodkerning + \defineperiodkerning + + keywords: factor + +--> diff --git a/tex/context/interface/mkiv/i-token.xml b/tex/context/interface/mkiv/i-token.xml index 2cc0f4674..129f472ba 100644 --- a/tex/context/interface/mkiv/i-token.xml +++ b/tex/context/interface/mkiv/i-token.xml @@ -4,28 +4,28 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="tokens" type="environment" file="toks-tra.mkiv"> + <cd:command name="tokens" type="environment" level="system" file="toks-tra.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="flushtokens" file="toks-tra.mkiv"> + <cd:command name="flushtokens" level="system" file="toks-tra.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="showtokens" file="toks-tra.mkiv"> + <cd:command name="showtokens" level="system" file="toks-tra.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="testtokens" file="toks-tra.mkiv"> + <cd:command name="testtokens" level="system" file="toks-tra.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-tolerance.xml b/tex/context/interface/mkiv/i-tolerance.xml index b33fef05d..3d0010edf 100644 --- a/tex/context/interface/mkiv/i-tolerance.xml +++ b/tex/context/interface/mkiv/i-tolerance.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="setuptolerance" file="spac-hor.mkiv"> + <cd:command name="setuptolerance" level="style" category="whitespace" file="spac-hor.mkiv"> <cd:arguments> <cd:keywords list="yes"> <cd:constant type="horizontal"/> @@ -19,4 +19,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-tooltip.xml b/tex/context/interface/mkiv/i-tooltip.xml index f46ffb091..df43ff9ce 100644 --- a/tex/context/interface/mkiv/i-tooltip.xml +++ b/tex/context/interface/mkiv/i-tooltip.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definetooltip" file="scrn-fld.mkvi"> + <cd:command name="definetooltip" level="style" category="pdf" file="scrn-fld.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setuptooltip" file="scrn-fld.mkvi"> + <cd:command name="setuptooltip" level="style" category="pdf" file="scrn-fld.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -28,7 +28,7 @@ </cd:arguments> </cd:command> - <cd:command name="tooltip" generated="yes" variant="instance" file="scrn-fld.mkvi"> + <cd:command name="tooltip" generated="yes" variant="instance" level="document" category="pdf" file="scrn-fld.mkvi"> <cd:sequence> <cd:instance value="tooltip"/> </cd:sequence> @@ -44,7 +44,7 @@ </cd:instances> </cd:command> - <cd:command name="tooltip" generated="yes" variant="instance:argument" file="scrn-fld.mkvi"> + <cd:command name="tooltip" generated="yes" variant="instance:argument" level="document" category="pdf" file="scrn-fld.mkvi"> <cd:sequence> <cd:instance value="tooltip"/> </cd:sequence> @@ -64,7 +64,7 @@ <!-- - <cd:command name="tooltip" file="scrn-fld.mkvi"> + <cd:command name="tooltip" level="document" category="pdf" file="scrn-fld.mkvi"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setuptooltip"/> @@ -74,7 +74,7 @@ </cd:arguments> </cd:command> - <cd:command name="tooltip" variant="argument" file="scrn-fld.mkvi"> + <cd:command name="tooltip" variant="argument" level="document" category="pdf" file="scrn-fld.mkvi"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="left"/> @@ -88,4 +88,4 @@ --> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-tracker.xml b/tex/context/interface/mkiv/i-tracker.xml index 4dbc31886..3db36addc 100644 --- a/tex/context/interface/mkiv/i-tracker.xml +++ b/tex/context/interface/mkiv/i-tracker.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="installtextracker" file="trac-ctx.mkiv"> + <cd:command name="installtextracker" level="system" file="trac-ctx.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-command"/> @@ -12,7 +12,7 @@ </cd:arguments> </cd:command> - <cd:command name="installtexdirective" file="trac-ctx.mkiv"> + <cd:command name="installtexdirective" level="system" file="trac-ctx.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-command"/> @@ -20,56 +20,56 @@ </cd:arguments> </cd:command> - <cd:command name="enabletrackers" file="trac-deb.mkiv"> + <cd:command name="enabletrackers" level="style" file="trac-deb.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list"/> </cd:arguments> </cd:command> - <cd:command name="disabletrackers" file="trac-deb.mkiv"> + <cd:command name="disabletrackers" level="style" file="trac-deb.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list"/> </cd:arguments> </cd:command> - <cd:command name="resettrackers" file="trac-deb.mkiv"/> + <cd:command name="resettrackers" level="system" file="trac-deb.mkiv"/> - <cd:command name="showtrackers" file="trac-deb.mkiv"/> + <cd:command name="showtrackers" level="document" file="trac-deb.mkiv"/> - <cd:command name="enabledirectives" file="trac-deb.mkiv"> + <cd:command name="enabledirectives" level="style" file="trac-deb.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list"/> </cd:arguments> </cd:command> - <cd:command name="disabledirectives" file="trac-deb.mkiv"> + <cd:command name="disabledirectives" level="style" file="trac-deb.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list"/> </cd:arguments> </cd:command> - <cd:command name="showdirectives" file="trac-deb.mkiv"/> + <cd:command name="showdirectives" level="document" file="trac-deb.mkiv"/> - <cd:command name="enableexperiments" file="trac-deb.mkiv"> + <cd:command name="enableexperiments" level="style" file="trac-deb.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list"/> </cd:arguments> </cd:command> - <cd:command name="disableexperiments" file="trac-deb.mkiv"> + <cd:command name="disableexperiments" level="style" file="trac-deb.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list"/> </cd:arguments> </cd:command> - <cd:command name="showexperiments" file="trac-deb.mkiv"/> + <cd:command name="showexperiments" level="document" file="trac-deb.mkiv"/> - <cd:command name="showedebuginfo" file="trac-deb.mkiv"/> + <cd:command name="showedebuginfo" level="system" file="trac-deb.mkiv"/> - <cd:command name="overloaderror" file="trac-deb.mkiv"/> + <cd:command name="overloaderror" level="system" file="trac-deb.mkiv"/> - <cd:command name="showlogcategories" file="trac-deb.mkiv"/> + <cd:command name="showlogcategories" level="system" file="trac-deb.mkiv"/> - <cd:command name="showjustification" file="trac-jus.mkiv"/> + <cd:command name="showjustification" level="system" file="trac-jus.mkiv"/> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-translate.xml b/tex/context/interface/mkiv/i-translate.xml index ba3510f0b..a865a4dd0 100644 --- a/tex/context/interface/mkiv/i-translate.xml +++ b/tex/context/interface/mkiv/i-translate.xml @@ -4,20 +4,20 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="translateinput" file="m-translate.mkiv"> + <cd:command name="translateinput" level="style" category="language" file="m-translate.mkiv"> <cd:arguments> <cd:resolve name="keyword-text"/> <cd:resolve name="keyword-text"/> </cd:arguments> </cd:command> - <cd:command name="resetinputtranslation" file="m-translate.mkiv"/> + <cd:command name="resetinputtranslation" level="system" category="language" file="m-translate.mkiv"/> - <cd:command name="enableinputtranslation" file="m-translate.mkiv"/> + <cd:command name="enableinputtranslation" level="style" category="language" file="m-translate.mkiv"/> - <cd:command name="disableinputtranslation" file="m-translate.mkiv"/> + <cd:command name="disableinputtranslation" level="style" category="language" file="m-translate.mkiv"/> - <cd:command name="readtranslatedfile" file="m-translate.mkiv"> + <cd:command name="readtranslatedfile" level="document" category="language" file="m-translate.mkiv"> <cd:arguments> <cd:resolve name="argument-file"/> </cd:arguments> diff --git a/tex/context/interface/mkiv/i-translation.xml b/tex/context/interface/mkiv/i-translation.xml index f4f77c526..f4f03037e 100644 --- a/tex/context/interface/mkiv/i-translation.xml +++ b/tex/context/interface/mkiv/i-translation.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="translate" file="lang-lab.mkiv"> + <cd:command name="translate" level="document" category="language" file="lang-lab.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="cd:language"> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="assigntranslation" file="lang-lab.mkiv"> + <cd:command name="assigntranslation" level="style" category="language" file="lang-lab.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="cd:language"> @@ -26,4 +26,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-twopassdata.xml b/tex/context/interface/mkiv/i-twopassdata.xml index 508294f08..992735693 100644 --- a/tex/context/interface/mkiv/i-twopassdata.xml +++ b/tex/context/interface/mkiv/i-twopassdata.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="immediatesavetwopassdata" file="core-two.mkiv"> + <cd:command name="immediatesavetwopassdata" level="system" file="core-two.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-number"/> @@ -12,7 +12,7 @@ </cd:arguments> </cd:command> - <cd:command name="savetwopassdata" file="core-two.mkiv"> + <cd:command name="savetwopassdata" level="system" file="core-two.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-number"/> @@ -20,7 +20,7 @@ </cd:arguments> </cd:command> - <cd:command name="lazysavetwopassdata" file="core-two.mkiv"> + <cd:command name="lazysavetwopassdata" level="system" file="core-two.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-number"/> @@ -28,7 +28,7 @@ </cd:arguments> </cd:command> - <cd:command name="savetaggedtwopassdata" file="core-two.mkiv"> + <cd:command name="savetaggedtwopassdata" level="system" file="core-two.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-number"/> @@ -37,7 +37,7 @@ </cd:arguments> </cd:command> - <cd:command name="lazysavetaggedtwopassdata" file="core-two.mkiv"> + <cd:command name="lazysavetaggedtwopassdata" level="system" file="core-two.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-number"/> @@ -46,57 +46,57 @@ </cd:arguments> </cd:command> - <cd:command name="definetwopasslist" file="core-two.mkiv"> + <cd:command name="definetwopasslist" level="system" file="core-two.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="gettwopassdata" file="core-two.mkiv"> + <cd:command name="gettwopassdata" level="system" file="core-two.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="checktwopassdata" file="core-two.mkiv"> + <cd:command name="checktwopassdata" level="system" file="core-two.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="findtwopassdata" file="core-two.mkiv"> + <cd:command name="findtwopassdata" level="system" file="core-two.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="getfirsttwopassdata" file="core-two.mkiv"> + <cd:command name="getfirsttwopassdata" level="system" file="core-two.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="getlasttwopassdata" file="core-two.mkiv"> + <cd:command name="getlasttwopassdata" level="system" file="core-two.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="getnamedtwopassdatalist" file="core-two.mkiv"> + <cd:command name="getnamedtwopassdatalist" level="system" file="core-two.mkiv"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="gettwopassdatalist" file="core-two.mkiv"> + <cd:command name="gettwopassdatalist" level="system" file="core-two.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="doifelseintwopassdata" file="core-two.mkiv"> + <cd:command name="doifelseintwopassdata" level="system" file="core-two.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-name"/> @@ -105,7 +105,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifintwopassdataelse" file="core-two.mkiv"> + <cd:command name="doifintwopassdataelse" level="system" file="core-two.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-name"/> @@ -114,11 +114,11 @@ </cd:arguments> </cd:command> - <cd:command name="getfromtwopassdata" file="core-two.mkiv"> + <cd:command name="getfromtwopassdata" level="system" file="core-two.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-typography.xml b/tex/context/interface/mkiv/i-typography.xml index 6c2aa7389..c5f06fa13 100644 --- a/tex/context/interface/mkiv/i-typography.xml +++ b/tex/context/interface/mkiv/i-typography.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="normalizetextwidth" file="typo-txt.mkvi"> + <cd:command name="normalizetextwidth" level="system" category="fonts" file="typo-txt.mkvi"> <cd:arguments> <cd:resolve name="argument-font"/> <cd:resolve name="argument-dimension"/> @@ -12,7 +12,7 @@ </cd:arguments> </cd:command> - <cd:command name="normalizetextheight" file="typo-txt.mkvi"> + <cd:command name="normalizetextheight" level="system" category="fonts" file="typo-txt.mkvi"> <cd:arguments> <cd:resolve name="argument-font"/> <cd:resolve name="argument-dimension"/> @@ -20,7 +20,7 @@ </cd:arguments> </cd:command> - <cd:command name="normalizetextdepth" file="typo-txt.mkvi"> + <cd:command name="normalizetextdepth" level="system" category="fonts" file="typo-txt.mkvi"> <cd:arguments> <cd:resolve name="argument-font"/> <cd:resolve name="argument-dimension"/> @@ -28,7 +28,7 @@ </cd:arguments> </cd:command> - <cd:command name="normalizetextline" file="typo-txt.mkvi"> + <cd:command name="normalizetextline" level="system" category="fonts" file="typo-txt.mkvi"> <cd:arguments> <cd:resolve name="argument-font"/> <cd:resolve name="argument-dimension"/> @@ -36,7 +36,7 @@ </cd:arguments> </cd:command> - <cd:command name="normalizefontwidth" file="typo-txt.mkvi"> + <cd:command name="normalizefontwidth" level="system" category="fonts" file="typo-txt.mkvi"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-text"/> @@ -45,7 +45,7 @@ </cd:arguments> </cd:command> - <cd:command name="normalizefontheight" file="typo-txt.mkvi"> + <cd:command name="normalizefontheight" level="system" category="fonts" file="typo-txt.mkvi"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-text"/> @@ -54,7 +54,7 @@ </cd:arguments> </cd:command> - <cd:command name="normalizefontdepth" file="typo-txt.mkvi"> + <cd:command name="normalizefontdepth" level="system" category="fonts" file="typo-txt.mkvi"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-text"/> @@ -63,7 +63,7 @@ </cd:arguments> </cd:command> - <cd:command name="normalizefontline" file="typo-txt.mkvi"> + <cd:command name="normalizefontline" level="system" category="fonts" file="typo-txt.mkvi"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-text"/> @@ -72,7 +72,7 @@ </cd:arguments> </cd:command> - <cd:command name="widthspanningtext" file="typo-txt.mkvi"> + <cd:command name="widthspanningtext" level="system" category="fonts" file="typo-txt.mkvi"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-dimension"/> @@ -80,7 +80,7 @@ </cd:arguments> </cd:command> - <cd:command name="heightspanningtext" file="typo-txt.mkvi"> + <cd:command name="heightspanningtext" level="system" category="fonts" file="typo-txt.mkvi"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-dimension"/> @@ -88,7 +88,7 @@ </cd:arguments> </cd:command> - <cd:command name="depthspanningtext" file="typo-txt.mkvi"> + <cd:command name="depthspanningtext" level="system" category="fonts" file="typo-txt.mkvi"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-dimension"/> @@ -96,7 +96,7 @@ </cd:arguments> </cd:command> - <cd:command name="linespanningtext" file="typo-txt.mkvi"> + <cd:command name="linespanningtext" level="system" category="fonts" file="typo-txt.mkvi"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-dimension"/> @@ -104,9 +104,9 @@ </cd:arguments> </cd:command> - <cd:command name="normalizedfontsize" file="typo-txt.mkvi"/> + <cd:command name="normalizedfontsize" level="system" category="fonts" file="typo-txt.mkvi"/> - <cd:command name="NormalizeTextWidth" file="typo-txt.mkvi"> + <cd:command name="NormalizeTextWidth" level="system" category="fonts" file="typo-txt.mkvi"> <cd:arguments> <cd:resolve name="argument-font"/> <cd:resolve name="argument-dimension"/> @@ -114,7 +114,7 @@ </cd:arguments> </cd:command> - <cd:command name="NormalizeTextHeight" file="typo-txt.mkvi"> + <cd:command name="NormalizeTextHeight" level="system" category="fonts" file="typo-txt.mkvi"> <cd:arguments> <cd:resolve name="argument-font"/> <cd:resolve name="argument-dimension"/> @@ -122,7 +122,7 @@ </cd:arguments> </cd:command> - <cd:command name="NormalizeFontWidth" file="typo-txt.mkvi"> + <cd:command name="NormalizeFontWidth" level="system" category="fonts" file="typo-txt.mkvi"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-text"/> @@ -131,7 +131,7 @@ </cd:arguments> </cd:command> - <cd:command name="NormalizeFontHeight" file="typo-txt.mkvi"> + <cd:command name="NormalizeFontHeight" level="system" category="fonts" file="typo-txt.mkvi"> <cd:arguments> <cd:csname/> <cd:resolve name="argument-text"/> @@ -140,7 +140,7 @@ </cd:arguments> </cd:command> - <cd:command name="WidthSpanningText" file="typo-txt.mkvi"> + <cd:command name="WidthSpanningText" level="system" category="fonts" file="typo-txt.mkvi"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:resolve name="argument-dimension"/> @@ -148,9 +148,9 @@ </cd:arguments> </cd:command> - <cd:command name="TheNormalizedFontSize" file="typo-txt.mkvi"/> + <cd:command name="TheNormalizedFontSize" level="system" category="fonts" file="typo-txt.mkvi"/> - <cd:command name="nicelyfilledbox" type="environment" file="typo-txt.mkvi"> + <cd:command name="nicelyfilledbox" type="environment" level="system" category="fonts" file="typo-txt.mkvi"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:parameter name="width"> @@ -170,4 +170,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-unit.xml b/tex/context/interface/mkiv/i-unit.xml index 3380585dc..9efa452eb 100644 --- a/tex/context/interface/mkiv/i-unit.xml +++ b/tex/context/interface/mkiv/i-unit.xml @@ -4,19 +4,19 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="digits" file="phys-dim.mkiv"> + <cd:command name="digits" level="document" category="symbols" file="phys-dim.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="digits" variant="string" file="phys-dim.mkiv"> + <cd:command name="digits" variant="string" level="document" category="symbols" file="phys-dim.mkiv"> <cd:arguments> <cd:resolve name="string-number"/> </cd:arguments> </cd:command> - <cd:command name="defineunit" file="phys-dim.mkiv"> + <cd:command name="defineunit" level="style" category="symbols" file="phys-dim.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -26,7 +26,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupunit" file="phys-dim.mkiv"> + <cd:command name="setupunit" level="style" category="symbols" file="phys-dim.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -75,7 +75,7 @@ </cd:arguments> </cd:command> - <cd:command name="unit" generated="yes" variant="instance" file="phys-dim.mkiv"> + <cd:command name="unit" generated="yes" variant="instance" level="document" category="symbols" file="phys-dim.mkiv"> <cd:sequence> <cd:instance value="unit"/> </cd:sequence> @@ -89,7 +89,7 @@ <!-- - <cd:command name="unit" file="phys-dim.mkiv"> + <cd:command name="unit" level="document" category="symbols" file="phys-dim.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> @@ -97,21 +97,21 @@ --> - <cd:command name="installunitsseparator" file="phys-dim.mkiv"> + <cd:command name="installunitsseparator" level="system" category="symbols" file="phys-dim.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-command"/> </cd:arguments> </cd:command> - <cd:command name="installunitsspace" file="phys-dim.mkiv"> + <cd:command name="installunitsspace" level="system" category="symbols" file="phys-dim.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-command"/> </cd:arguments> </cd:command> - <cd:command name="registerunit" file="phys-dim.mkiv"> + <cd:command name="registerunit" level="style" category="symbols" file="phys-dim.mkiv"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="prefix"/> @@ -125,4 +125,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-variables.xml b/tex/context/interface/mkiv/i-variables.xml index 63b34329c..7c295f9ad 100644 --- a/tex/context/interface/mkiv/i-variables.xml +++ b/tex/context/interface/mkiv/i-variables.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="setvariables" file="core-env.mkiv"> + <cd:command name="setvariables" level="style" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes"> @@ -21,7 +21,7 @@ </cd:arguments> </cd:command> - <cd:command name="setevariables" file="core-env.mkiv"> + <cd:command name="setevariables" level="system" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes"> @@ -38,7 +38,7 @@ </cd:arguments> </cd:command> - <cd:command name="setgvariables" file="core-env.mkiv"> + <cd:command name="setgvariables" level="system" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes"> @@ -55,7 +55,7 @@ </cd:arguments> </cd:command> - <cd:command name="setxvariables" file="core-env.mkiv"> + <cd:command name="setxvariables" level="system" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes"> @@ -72,7 +72,7 @@ </cd:arguments> </cd:command> - <cd:command name="checkvariables" file="core-env.mkiv"> + <cd:command name="checkvariables" level="system" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:assignments list="yes"> @@ -89,7 +89,7 @@ </cd:arguments> </cd:command> - <cd:command name="setvariable" file="core-env.mkiv"> + <cd:command name="setvariable" level="style" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-key"/> @@ -97,7 +97,7 @@ </cd:arguments> </cd:command> - <cd:command name="setevariable" file="core-env.mkiv"> + <cd:command name="setevariable" level="system" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-key"/> @@ -105,7 +105,7 @@ </cd:arguments> </cd:command> - <cd:command name="setgvariable" file="core-env.mkiv"> + <cd:command name="setgvariable" level="system" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-key"/> @@ -113,7 +113,7 @@ </cd:arguments> </cd:command> - <cd:command name="setxvariable" file="core-env.mkiv"> + <cd:command name="setxvariable" level="system" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-key"/> @@ -121,21 +121,21 @@ </cd:arguments> </cd:command> - <cd:command name="getvariable" file="core-env.mkiv"> + <cd:command name="getvariable" level="style" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-key"/> </cd:arguments> </cd:command> - <cd:command name="showvariable" file="core-env.mkiv"> + <cd:command name="showvariable" level="system" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-key"/> </cd:arguments> </cd:command> - <cd:command name="doifelsevariable" file="core-env.mkiv"> + <cd:command name="doifelsevariable" level="system" category="conditional" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-key"/> @@ -144,7 +144,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifvariableelse" file="core-env.mkiv"> + <cd:command name="doifvariableelse" level="system" category="conditional" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-key"/> @@ -153,7 +153,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifvariable" file="core-env.mkiv"> + <cd:command name="doifvariable" level="system" category="conditional" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-key"/> @@ -161,7 +161,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifnotvariable" file="core-env.mkiv"> + <cd:command name="doifnotvariable" level="system" category="conditional" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-key"/> @@ -169,7 +169,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifelseemptyvariable" file="core-env.mkiv"> + <cd:command name="doifelseemptyvariable" level="system" category="conditional" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-key"/> @@ -178,7 +178,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifemptyvariableelse" file="core-env.mkiv"> + <cd:command name="doifemptyvariableelse" level="system" category="conditional" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-key"/> @@ -187,7 +187,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifemptyvariable" file="core-env.mkiv"> + <cd:command name="doifemptyvariable" level="system" category="conditional" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-key"/> @@ -195,7 +195,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifnotemptyvariable" file="core-env.mkiv"> + <cd:command name="doifnotemptyvariable" level="system" category="conditional" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-key"/> @@ -203,7 +203,7 @@ </cd:arguments> </cd:command> - <cd:command name="getvariabledefault" file="core-env.mkiv"> + <cd:command name="getvariabledefault" level="system" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-key"/> @@ -211,7 +211,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupenv" file="core-env.mkiv"> + <cd:command name="setupenv" level="system" file="core-env.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="set"> @@ -227,7 +227,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifelseenv" file="core-env.mkiv"> + <cd:command name="doifelseenv" level="system" category="conditional" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="argument-key"/> <cd:resolve name="argument-true"/> @@ -235,7 +235,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifenvelse" file="core-env.mkiv"> + <cd:command name="doifenvelse" level="system" category="conditional" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="argument-key"/> <cd:resolve name="argument-true"/> @@ -243,74 +243,74 @@ </cd:arguments> </cd:command> - <cd:command name="doifenv" file="core-env.mkiv"> + <cd:command name="doifenv" level="system" category="conditional" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="argument-key"/> <cd:resolve name="argument-true"/> </cd:arguments> </cd:command> - <cd:command name="doifnotenv" file="core-env.mkiv"> + <cd:command name="doifnotenv" level="system" category="conditional" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="argument-key"/> <cd:resolve name="argument-true"/> </cd:arguments> </cd:command> - <cd:command name="env" file="core-env.mkiv"> + <cd:command name="env" level="system" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="argument-key"/> </cd:arguments> </cd:command> - <cd:command name="envvar" file="core-env.mkiv"> + <cd:command name="envvar" level="system" file="core-env.mkiv"> <cd:arguments> <cd:resolve name="argument-key"/> <cd:resolve name="argument-command"/> </cd:arguments> </cd:command> - <cd:command name="setdocumentfilename" file="luat-ini.mkiv"> + <cd:command name="setdocumentfilename" level="system" file="luat-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="setdocumentargument" file="luat-ini.mkiv"> + <cd:command name="setdocumentargument" level="system" file="luat-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="setdocumentargumentdefault" file="luat-ini.mkiv"> + <cd:command name="setdocumentargumentdefault" level="system" file="luat-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="getdocumentfilename" file="luat-ini.mkiv"> + <cd:command name="getdocumentfilename" level="system" file="luat-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="getdocumentargument" file="luat-ini.mkiv"> + <cd:command name="getdocumentargument" level="system" file="luat-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="getdocumentargumentdefault" file="luat-ini.mkiv"> + <cd:command name="getdocumentargumentdefault" level="system" file="luat-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="doifelsedocumentargument" file="luat-ini.mkiv"> + <cd:command name="doifelsedocumentargument" level="system" category="conditional" file="luat-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -318,7 +318,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifdocumentargumentelse" file="luat-ini.mkiv"> + <cd:command name="doifdocumentargumentelse" level="system" category="conditional" file="luat-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> @@ -326,21 +326,21 @@ </cd:arguments> </cd:command> - <cd:command name="doifdocumentargument" file="luat-ini.mkiv"> + <cd:command name="doifdocumentargument" level="system" category="conditional" file="luat-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> </cd:arguments> </cd:command> - <cd:command name="doifnotdocumentargument" file="luat-ini.mkiv"> + <cd:command name="doifnotdocumentargument" level="system" category="conditional" file="luat-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-true"/> </cd:arguments> </cd:command> - <cd:command name="doifelsedocumentfilename" file="luat-ini.mkiv"> + <cd:command name="doifelsedocumentfilename" level="system" category="conditional" file="luat-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> <cd:resolve name="argument-true"/> @@ -348,7 +348,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifdocumentfilenameelse" file="luat-ini.mkiv"> + <cd:command name="doifdocumentfilenameelse" level="system" category="conditional" file="luat-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> <cd:resolve name="argument-true"/> @@ -356,18 +356,18 @@ </cd:arguments> </cd:command> - <cd:command name="doifdocumentfilename" file="luat-ini.mkiv"> + <cd:command name="doifdocumentfilename" level="system" category="conditional" file="luat-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> <cd:resolve name="argument-true"/> </cd:arguments> </cd:command> - <cd:command name="doifnotdocumentfilename" file="luat-ini.mkiv"> + <cd:command name="doifnotdocumentfilename" level="system" category="conditional" file="luat-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> <cd:resolve name="argument-true"/> </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-verbatim.xml b/tex/context/interface/mkiv/i-verbatim.xml index b23f57efe..e8abc1f66 100644 --- a/tex/context/interface/mkiv/i-verbatim.xml +++ b/tex/context/interface/mkiv/i-verbatim.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definetype" file="buff-ver.mkiv"> + <cd:command name="definetype" level="style" category="verbatim" file="buff-ver.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,20 +14,12 @@ </cd:arguments> </cd:command> - <cd:command name="setuptype" file="buff-ver.mkiv"> + <cd:command name="setuptype" level="style" category="verbatim" file="buff-ver.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> <cd:parameter name="option"> - <cd:constant type="mp"/> - <cd:constant type="lua"/> - <cd:constant type="xml"/> - <cd:constant type="parsed-xml"/> - <cd:constant type="nested"/> - <cd:constant type="tex"/> - <cd:constant type="context"/> - <cd:constant type="none"/> - <cd:constant type="cd:name"/> + <cd:resolve name="value-verbatim"/> </cd:parameter> <cd:parameter name="command"> <cd:constant type="cd:csname"/> @@ -77,7 +69,7 @@ </cd:arguments> </cd:command> - <cd:command name="type" file="buff-ver.mkiv"> + <cd:command name="type" level="document" category="verbatim" file="buff-ver.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setuptype"/> @@ -86,7 +78,7 @@ </cd:arguments> </cd:command> - <cd:command name="type" variant="angles" file="buff-ver.mkiv"> + <cd:command name="type" variant="angles" level="document" category="verbatim" file="buff-ver.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setuptype"/> @@ -95,7 +87,7 @@ </cd:arguments> </cd:command> - <cd:command name="typ" file="buff-ver.mkiv"> + <cd:command name="typ" level="document" category="verbatim" file="buff-ver.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setuptype"/> @@ -104,7 +96,7 @@ </cd:arguments> </cd:command> - <cd:command name="typ" variant="angles" file="buff-ver.mkiv"> + <cd:command name="typ" variant="angles" level="document" category="verbatim" file="buff-ver.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setuptype"/> @@ -113,7 +105,7 @@ </cd:arguments> </cd:command> - <cd:command name="type" generated="yes" variant="example" file="buff-ver.mkiv"> + <cd:command name="type" generated="yes" variant="example" level="document" category="verbatim" file="buff-ver.mkiv"> <cd:sequence> <cd:variable value="type"/> </cd:sequence> @@ -125,7 +117,7 @@ </cd:arguments> </cd:command> - <cd:command name="type" generated="yes" variant="example:angles" file="buff-ver.mkiv"> + <cd:command name="type" generated="yes" variant="example:angles" level="document" category="verbatim" file="buff-ver.mkiv"> <cd:sequence> <cd:variable value="type"/> </cd:sequence> @@ -137,7 +129,7 @@ </cd:arguments> </cd:command> - <cd:command name="definetyping" file="buff-ver.mkiv"> + <cd:command name="definetyping" level="style" category="verbatim" file="buff-ver.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -147,7 +139,7 @@ </cd:arguments> </cd:command> - <cd:command name="setuptyping" file="buff-ver.mkiv"> + <cd:command name="setuptyping" level="style" category="verbatim" file="buff-ver.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -161,15 +153,7 @@ <cd:resolve name="value-leftskip"/> </cd:parameter> <cd:parameter name="option"> - <cd:constant type="mp"/> - <cd:constant type="lua"/> - <cd:constant type="xml"/> - <cd:constant type="parsed-xml"/> - <cd:constant type="nested"/> - <cd:constant type="tex"/> - <cd:constant type="context"/> - <cd:constant type="none" default="yes"/> - <cd:constant type="cd:name"/> + <cd:resolve name="value-verbatim"/> </cd:parameter> <cd:parameter name="style"> <cd:resolve name="value-style"/> @@ -251,7 +235,7 @@ </cd:arguments> </cd:command> - <cd:command name="typing" type="environment" generated="yes" variant="instance" file="buff-ver.mkiv"> + <cd:command name="typing" type="environment" generated="yes" variant="instance" level="document" category="verbatim" file="buff-ver.mkiv"> <cd:sequence> <cd:instance value="typing"/> </cd:sequence> @@ -265,7 +249,7 @@ </cd:instances> </cd:command> - <cd:command name="typing" type="environment" generated="yes" variant="instance:argument" file="buff-ver.mkiv"> + <cd:command name="typing" type="environment" generated="yes" variant="instance:argument" level="document" category="verbatim" file="buff-ver.mkiv"> <cd:sequence> <cd:instance value="typing"/> </cd:sequence> @@ -279,55 +263,55 @@ </cd:instances> </cd:command> - <cd:command name="tex" file="buff-ver.mkiv"> + <cd:command name="tex" level="document" category="verbatim" file="buff-ver.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="arg" file="buff-ver.mkiv"> + <cd:command name="arg" level="document" category="verbatim" file="buff-ver.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="mat" file="buff-ver.mkiv"> + <cd:command name="mat" level="document" category="verbatim" file="buff-ver.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="dis" file="buff-ver.mkiv"> + <cd:command name="dis" level="document" category="verbatim" file="buff-ver.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="astype" file="buff-ver.mkiv"> + <cd:command name="astype" level="system" category="verbatim" file="buff-ver.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="asciistr" file="buff-ver.mkiv"> + <cd:command name="asciistr" level="system" category="verbatim" file="buff-ver.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="verbatim" file="buff-ver.mkiv"> + <cd:command name="verbatim" level="system" category="verbatim" file="buff-ver.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="filename" file="buff-ver.mkiv"> + <cd:command name="filename" level="document" category="verbatim" file="buff-ver.mkiv"> <cd:arguments> <cd:resolve name="argument-file"/> </cd:arguments> </cd:command> - <cd:command name="typefile" file="buff-ver.mkiv"> + <cd:command name="typefile" level="document" category="verbatim" file="buff-ver.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:assignments list="yes" optional="yes"> @@ -337,7 +321,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifelsetypingfile" file="buff-ver.mkiv"> + <cd:command name="doifelsetypingfile" category="verbatim" level="system conditional" file="buff-ver.mkiv"> <cd:arguments> <cd:resolve name="argument-file"/> <cd:resolve name="argument-true"/> @@ -345,7 +329,7 @@ </cd:arguments> </cd:command> - <cd:command name="doiftypingfileelse" file="buff-ver.mkiv"> + <cd:command name="doiftypingfileelse" category="verbatim" level="system conditional" file="buff-ver.mkiv"> <cd:arguments> <cd:resolve name="argument-file"/> <cd:resolve name="argument-true"/> @@ -355,7 +339,7 @@ <!-- - <cd:command name="typing" type="environment" file="buff-ver.mkiv"> + <cd:command name="typing" type="environment" level="document" category="verbatim" file="buff-ver.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setuptyping"/> @@ -363,7 +347,7 @@ </cd:arguments> </cd:command> - <cd:command name="typing" type="environment" variant="argument" file="buff-ver.mkiv"> + <cd:command name="typing" type="environment" variant="argument" level="document" category="verbatim" file="buff-ver.mkiv"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="continue"/> @@ -371,7 +355,7 @@ </cd:arguments> </cd:command> - <cd:command name="LUA" type="environment" file="buff-ver.mkiv"> + <cd:command name="LUA" type="environment" level="document" category="verbatim" file="buff-ver.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setuptyping"/> @@ -379,7 +363,7 @@ </cd:arguments> </cd:command> - <cd:command name="LUA" type="environment" variant="argument" file="buff-ver.mkiv"> + <cd:command name="LUA" type="environment" variant="argument" level="document" category="verbatim" file="buff-ver.mkiv"> <cd:sequence> <cd:variable value="lua"/> </cd:sequence> @@ -390,7 +374,7 @@ </cd:arguments> </cd:command> - <cd:command name="MP" type="environment" file="buff-ver.mkiv"> + <cd:command name="MP" type="environment" level="document" category="verbatim" file="buff-ver.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setuptyping"/> @@ -398,7 +382,7 @@ </cd:arguments> </cd:command> - <cd:command name="MP" type="environment" variant="argument" file="buff-ver.mkiv"> + <cd:command name="MP" type="environment" variant="argument" level="document" category="verbatim" file="buff-ver.mkiv"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="continue"/> @@ -406,7 +390,7 @@ </cd:arguments> </cd:command> - <cd:command name="XML" type="environment" file="buff-ver.mkiv"> + <cd:command name="XML" type="environment" level="document" category="verbatim" file="buff-ver.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setuptyping"/> @@ -414,7 +398,7 @@ </cd:arguments> </cd:command> - <cd:command name="XML" type="environment" variant="argument" file="buff-ver.mkiv"> + <cd:command name="XML" type="environment" variant="argument" level="document" category="verbatim" file="buff-ver.mkiv"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="continue"/> @@ -422,7 +406,7 @@ </cd:arguments> </cd:command> - <cd:command name="PARSEDXML" type="environment" file="buff-ver.mkiv"> + <cd:command name="PARSEDXML" type="environment" level="document" category="verbatim" file="buff-ver.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setuptyping"/> @@ -430,7 +414,7 @@ </cd:arguments> </cd:command> - <cd:command name="PARSEDXML" type="environment" variant="argument" file="buff-ver.mkiv"> + <cd:command name="PARSEDXML" type="environment" variant="argument" level="document" category="verbatim" file="buff-ver.mkiv"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="continue"/> @@ -438,7 +422,7 @@ </cd:arguments> </cd:command> - <cd:command name="TEX" type="environment" file="buff-ver.mkiv"> + <cd:command name="TEX" type="environment" level="document" category="verbatim" file="buff-ver.mkiv"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setuptyping"/> @@ -446,7 +430,7 @@ </cd:arguments> </cd:command> - <cd:command name="TEX" type="environment" variant="argument" file="buff-ver.mkiv"> + <cd:command name="TEX" type="environment" variant="argument" level="document" category="verbatim" file="buff-ver.mkiv"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="continue"/> @@ -456,4 +440,4 @@ --> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-version.xml b/tex/context/interface/mkiv/i-version.xml index 9f7864e8a..22a3846d9 100644 --- a/tex/context/interface/mkiv/i-version.xml +++ b/tex/context/interface/mkiv/i-version.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="setupversion" file="page-inf.mkiv"> + <cd:command name="setupversion" level="style" file="page-inf.mkiv"> <cd:arguments> <cd:keywords> <cd:constant type="concept"/> @@ -16,7 +16,7 @@ </cd:arguments> </cd:command> - <cd:command name="version" file="page-inf.mkiv"> + <cd:command name="version" level="style" file="page-inf.mkiv"> <cd:arguments> <cd:keywords> <cd:constant type="concept"/> @@ -28,20 +28,20 @@ </cd:arguments> </cd:command> - <cd:command name="installversioninfo" file="page-inf.mkiv"> + <cd:command name="installversioninfo" level="system" file="page-inf.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-command"/> </cd:arguments> </cd:command> - <cd:command name="includeversioninfo" file="page-inf.mkiv"> + <cd:command name="includeversioninfo" level="system" file="page-inf.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="doifelseolderversion" file="file-mod.mkvi"> + <cd:command name="doifelseolderversion" level="system" category="conditional" file="file-mod.mkvi"> <cd:arguments> <cd:resolve name="argument-number"/> <cd:resolve name="argument-number"/> @@ -50,7 +50,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifolderversionelse" file="file-mod.mkvi"> + <cd:command name="doifolderversionelse" level="system" category="conditional" file="file-mod.mkvi"> <cd:arguments> <cd:resolve name="argument-number"/> <cd:resolve name="argument-number"/> @@ -59,7 +59,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifelseoldercontext" file="file-mod.mkvi"> + <cd:command name="doifelseoldercontext" level="system" category="conditional" file="file-mod.mkvi"> <cd:arguments> <cd:resolve name="argument-number"/> <cd:resolve name="argument-true"/> @@ -67,7 +67,7 @@ </cd:arguments> </cd:command> - <cd:command name="doifoldercontextelse" file="file-mod.mkvi"> + <cd:command name="doifoldercontextelse" level="system" category="conditional" file="file-mod.mkvi"> <cd:arguments> <cd:resolve name="argument-number"/> <cd:resolve name="argument-true"/> @@ -75,4 +75,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-viewerlayer.xml b/tex/context/interface/mkiv/i-viewerlayer.xml index 8e321971e..fde846e4d 100644 --- a/tex/context/interface/mkiv/i-viewerlayer.xml +++ b/tex/context/interface/mkiv/i-viewerlayer.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="defineviewerlayer" file="attr-lay.mkiv"> + <cd:command name="defineviewerlayer" level="style" category="pdf" file="attr-lay.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupviewerlayer" file="attr-lay.mkiv"> + <cd:command name="setupviewerlayer" level="style" category="pdf" file="attr-lay.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="title"> @@ -44,25 +44,25 @@ </cd:arguments> </cd:command> - <cd:command name="viewerlayer" type="environment" file="attr-lay.mkiv"> + <cd:command name="viewerlayer" type="environment" level="document" category="pdf" file="attr-lay.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="viewerlayer" type="environment" generated="yes" variant="example" file="attr-lay.mkiv"> + <cd:command name="viewerlayer" type="environment" generated="yes" variant="example" level="document" category="pdf" file="attr-lay.mkiv"> <cd:sequence> <cd:variable value="viewerlayer"/> </cd:sequence> </cd:command> - <cd:command name="viewerlayer" file="attr-lay.mkiv"> + <cd:command name="viewerlayer" level="document" category="pdf" file="attr-lay.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="showlayoutcomponents" file="attr-lay.mkiv"/> + <cd:command name="showlayoutcomponents" level="document" category="pdf" file="attr-lay.mkiv"/> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-visual.xml b/tex/context/interface/mkiv/i-visual.xml index 64ae3f79d..7849ab90b 100644 --- a/tex/context/interface/mkiv/i-visual.xml +++ b/tex/context/interface/mkiv/i-visual.xml @@ -4,20 +4,20 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="fakerule" file="m-visual.mkiv"> + <cd:command name="fakerule" level="system" file="m-visual.mkiv"> <cd:arguments> <cd:resolve name="argument-dimension"/> </cd:arguments> </cd:command> - <cd:command name="dorandomrecurse" file="m-visual.mkiv"> + <cd:command name="dorandomrecurse" level="system" file="m-visual.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="fakelines" file="m-visual.mkiv"> + <cd:command name="fakelines" level="document" file="m-visual.mkiv"> <cd:arguments> <cd:keywords name="keywords" delimiters="braces"> <cd:constant type="cd:number"/> @@ -30,7 +30,7 @@ </cd:arguments> </cd:command> - <cd:command name="fakewords" file="m-visual.mkiv"> + <cd:command name="fakewords" level="document" file="m-visual.mkiv"> <cd:arguments> <cd:keywords name="keywords" delimiters="braces"> <cd:constant type="cd:number"/> @@ -43,7 +43,7 @@ </cd:arguments> </cd:command> - <cd:command name="fakenwords" file="m-visual.mkiv"> + <cd:command name="fakenwords" level="system" file="m-visual.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> <cd:keywords name="keywords" delimiters="braces"> @@ -53,19 +53,19 @@ </cd:arguments> </cd:command> - <cd:command name="showfakewords" file="m-visual.mkiv"/> + <cd:command name="showfakewords" level="system" file="m-visual.mkiv"/> - <cd:command name="fakeword" file="m-visual.mkiv"/> + <cd:command name="fakeword" level="system" file="m-visual.mkiv"/> - <cd:command name="fakeparindent" file="m-visual.mkiv"/> + <cd:command name="fakeparindent" level="system" file="m-visual.mkiv"/> - <cd:command name="fakeddroppedcaps" file="m-visual.mkiv"> + <cd:command name="fakeddroppedcaps" level="system" file="m-visual.mkiv"> <cd:arguments> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="fakefigure" file="m-visual.mkiv"> + <cd:command name="fakefigure" level="document" file="m-visual.mkiv"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:inherit name="placefloat"/> @@ -78,7 +78,7 @@ </cd:arguments> </cd:command> - <cd:command name="fakeimage" file="m-visual.mkiv"> + <cd:command name="fakeimage" level="document" file="m-visual.mkiv"> <cd:arguments> <cd:resolve name="argument-dimension"/> <cd:resolve name="argument-dimension"/> @@ -87,11 +87,11 @@ </cd:arguments> </cd:command> - <cd:command name="fakeformula" file="m-visual.mkiv"/> + <cd:command name="fakeformula" level="document" file="m-visual.mkiv"/> - <cd:command name="fakespacingformula" file="m-visual.mkiv"/> + <cd:command name="fakespacingformula" level="document" file="m-visual.mkiv"/> - <cd:command name="smashedgrid" file="m-visual.mkiv"> + <cd:command name="smashedgrid" level="system" file="m-visual.mkiv"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:inherit name="basegrid"/> @@ -99,17 +99,17 @@ </cd:arguments> </cd:command> - <cd:command name="bodyfontgrid" file="m-visual.mkiv"/> + <cd:command name="bodyfontgrid" level="system" file="m-visual.mkiv"/> - <cd:command name="emexgrid" file="m-visual.mkiv"/> + <cd:command name="emexgrid" level="system" file="m-visual.mkiv"/> - <cd:command name="simplethesis" file="m-visual.mkiv"/> + <cd:command name="simplethesis" level="system" file="m-visual.mkiv"/> - <cd:command name="showbaselines" file="m-visual.mkiv"/> + <cd:command name="showbaselines" level="system" file="m-visual.mkiv"/> - <cd:command name="showpagebuilder" file="m-visual.mkiv"/> + <cd:command name="showpagebuilder" level="system" file="m-visual.mkiv"/> - <cd:command name="tagbox" file="m-visual.mkiv"> + <cd:command name="tagbox" level="system" file="m-visual.mkiv"> <cd:arguments> <cd:resolve name="argument-text"/> <cd:keywords optional="yes"> @@ -131,24 +131,24 @@ </cd:arguments> </cd:command> - <cd:command name="coloredhbox" file="m-visual.mkiv"> + <cd:command name="coloredhbox" level="system" file="m-visual.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="coloredvbox" file="m-visual.mkiv"> + <cd:command name="coloredvbox" level="system" file="m-visual.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="coloredvtop" file="m-visual.mkiv"> + <cd:command name="coloredvtop" level="system" file="m-visual.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="coloredstrut" file="m-visual.mkiv"/> + <cd:command name="coloredstrut" level="system" file="m-visual.mkiv"/> </cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-visualizer.xml b/tex/context/interface/mkiv/i-visualizer.xml index 3d30b7f4d..daaad28cd 100644 --- a/tex/context/interface/mkiv/i-visualizer.xml +++ b/tex/context/interface/mkiv/i-visualizer.xml @@ -4,116 +4,117 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="ruledhbox" file="trac-vis.mkiv"> + <cd:command name="ruledhbox" level="system" file="trac-vis.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="ruledvbox" file="trac-vis.mkiv"> + <cd:command name="ruledvbox" level="system" file="trac-vis.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="ruledvtop" file="trac-vis.mkiv"> + <cd:command name="ruledvtop" level="system" file="trac-vis.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="ruledtopv" file="trac-vis.mkiv"> + <cd:command name="ruledtopv" level="system" file="trac-vis.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="ruledhpack" file="trac-vis.mkiv"> + <cd:command name="ruledhpack" level="system" file="trac-vis.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="ruledvpack" file="trac-vis.mkiv"> + <cd:command name="ruledvpack" level="system" file="trac-vis.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="ruledtpack" file="trac-vis.mkiv"> + <cd:command name="ruledtpack" level="system" file="trac-vis.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="ruledmbox" file="trac-vis.mkiv"> + <cd:command name="ruledmbox" level="system" file="trac-vis.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="filledhboxr" file="trac-vis.mkiv"> + <cd:command name="filledhboxr" level="system" file="trac-vis.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="filledhboxg" file="trac-vis.mkiv"> + <cd:command name="filledhboxg" level="system" file="trac-vis.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="filledhboxb" file="trac-vis.mkiv"> + <cd:command name="filledhboxb" level="system" file="trac-vis.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="filledhboxc" file="trac-vis.mkiv"> + <cd:command name="filledhboxc" level="system" file="trac-vis.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="filledhboxm" file="trac-vis.mkiv"> + <cd:command name="filledhboxm" level="system" file="trac-vis.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="filledhboxy" file="trac-vis.mkiv"> + <cd:command name="filledhboxy" level="system" file="trac-vis.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="filledhboxk" file="trac-vis.mkiv"> + <cd:command name="filledhboxk" level="system" file="trac-vis.mkiv"> <cd:arguments> <cd:resolve name="string-boxoptions"/> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="showmakeup" file="trc-vis.mkiv"> + <cd:command name="showmakeup" level="document" file="trc-vis.mkiv"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="makeup" default="yes"/> <cd:constant type="all"/> <cd:constant type="boxes"/> + <cd:constant type="line"/> <cd:constant type="glyph"/> <cd:constant type="fontkern"/> <cd:constant type="hbox"/> @@ -137,20 +138,22 @@ </cd:arguments> </cd:command> - <cd:command name="showallmakeup" file="trc-vis.mkiv"/> + <cd:command name="showallmakeup" level="document" file="trc-vis.mkiv"/> - <cd:command name="showboxes" file="trc-vis.mkiv"/> + <cd:command name="showboxes" level="document" file="trc-vis.mkiv"/> - <cd:command name="showglyphs" file="trc-vis.mkiv"/> + <cd:command name="showglyphs" level="document" file="trc-vis.mkiv"/> - <cd:command name="showfontkerns" file="trc-vis.mkiv"/> + <cd:command name="showfontkerns" level="document" file="trc-vis.mkiv"/> - <cd:command name="setvisualizerfont" file="trc-vis.mkiv"> + <cd:command name="showfontitalics" level="document" file="trc-vis.mkiv"/> + + <cd:command name="setvisualizerfont" level="system" file="trc-vis.mkiv"> <cd:arguments> <cd:resolve name="keyword-font-optional"/> </cd:arguments> </cd:command> - <cd:command name="resetvisualizers" file="trc-vis.mkiv"/> + <cd:command name="resetvisualizers" level="system" file="trc-vis.mkiv"/> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-vspace.xml b/tex/context/interface/mkiv/i-vspace.xml index 4618fc00a..ce6d5ac08 100644 --- a/tex/context/interface/mkiv/i-vspace.xml +++ b/tex/context/interface/mkiv/i-vspace.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definevspacingamount" file="spac-ver.mkiv"> + <cd:command name="definevspacingamount" level="system" category="whitespace" file="spac-ver.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-dimension-optional"/> @@ -12,7 +12,7 @@ </cd:arguments> </cd:command> - <cd:command name="definevspacing" file="spac-ver.mkiv"> + <cd:command name="definevspacing" level="system" category="whitespace" file="spac-ver.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:keywords> @@ -21,7 +21,7 @@ </cd:arguments> </cd:command> - <cd:command name="vspacing" file="spac-ver.mkiv"> + <cd:command name="vspacing" level="system" category="whitespace" file="spac-ver.mkiv"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="preference"/> @@ -31,6 +31,7 @@ <cd:constant type="enable"/> <cd:constant type="disable"/> <cd:constant type="nowhite"/> + <cd:constant type="packed"/> <cd:constant type="back"/> <cd:constant type="overlay"/> <cd:constant type="always"/> @@ -73,7 +74,7 @@ </cd:arguments> </cd:command> - <cd:command name="directvspacing" file="spac-ver.mkiv"> + <cd:command name="directvspacing" level="system" category="whitespace" file="spac-ver.mkiv"> <cd:arguments> <cd:keywords delimiters="braces" list="yes"> <cd:inherit name="vspacing"/> @@ -81,7 +82,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupvspacing" file="spac-ver.mkiv"> + <cd:command name="setupvspacing" level="system" category="whitespace" file="spac-ver.mkiv"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:inherit name="vspacing"/> @@ -89,33 +90,97 @@ </cd:arguments> </cd:command> - <cd:command name="setupblank" file="spac-ver.mkiv"> + <!-- + + <cd:command name="setupblank" level="style" category="whitespace" file="spac-ver.mkiv"> + <cd:arguments> + <cd:keywords list="yes" optional="yes"> + <cd:inherit name="vspacing"/> + </cd:keywords> + </cd:arguments> + </cd:command> + + <cd:command name="blank" level="document" category="whitespace" file="spac-ver.mkiv"> + <cd:arguments> + <cd:keywords list="yes" optional="yes"> + <cd:inherit name="vspacing"/> + </cd:keywords> + </cd:arguments> + </cd:command> + + --> + + <cd:command name="setupblank" level="style" category="whitespace" file="spac-ver.mkiv"> <cd:arguments> <cd:keywords list="yes" optional="yes"> - <cd:inherit name="vspacing"/> + <cd:inherit name="blank"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="blank" file="spac-ver.mkiv"> + <cd:command name="blank" level="document" category="whitespace" file="spac-ver.mkiv"> <cd:arguments> <cd:keywords list="yes" optional="yes"> - <cd:inherit name="vspacing"/> + <cd:constant type="preference"/> + <cd:constant type="samepage"/> + <cd:constant type="max"/> + <cd:constant type="force"/> + <cd:constant type="enable"/> + <cd:constant type="disable"/> + <cd:constant type="nowhite"/> + <cd:constant type="back"/> + <cd:constant type="overlay"/> + <cd:constant type="always"/> + <cd:constant type="weak"/> + <cd:constant type="strong"/> + <cd:constant type="default"/> + <cd:constant type="before"/> + <cd:constant type="inbetween"/> + <cd:constant type="after"/> + <cd:constant type="fixed"/> + <cd:constant type="flexible"/> + <cd:constant type="none"/> + <cd:constant type="small"/> + <cd:constant type="medium"/> + <cd:constant type="big"/> + <cd:constant type="line"/> + <cd:constant type="halfline"/> + <cd:constant type="quarterline"/> + <cd:constant type="formula"/> + <cd:constant type="white"/> + <cd:constant type="height"/> + <cd:constant type="depth"/> + <cd:constant type="standard"/> + <cd:constant type="small" prefix="cd:number" method="factor"/> + <cd:constant type="medium" prefix="cd:number" method="factor"/> + <cd:constant type="big" prefix="cd:number" method="factor"/> + <cd:constant type="line" prefix="cd:number" method="factor"/> + <cd:constant type="halfline" prefix="cd:number" method="factor"/> + <cd:constant type="quarterline" prefix="cd:number" method="factor"/> + <cd:constant type="formula" prefix="cd:number" method="factor"/> + <cd:constant type="white" prefix="cd:number" method="factor"/> + <cd:constant type="height" prefix="cd:number" method="factor"/> + <cd:constant type="depth" prefix="cd:number" method="factor"/> + <cd:constant type="cd:number" prefix="category" method="range"/> + <cd:constant type="cd:number" prefix="order" method="range"/> + <cd:constant type="cd:number" prefix="penalty" method="range"/> + <cd:constant type="cd:dimension"/> + <cd:constant type="cd:name"/> </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="useblankparameter" file="spac-ver.mkiv"> + <cd:command name="useblankparameter" level="system" category="whitespace" file="spac-ver.mkiv"> <cd:arguments> <cd:csname/> </cd:arguments> </cd:command> - <cd:command name="inhibitblank" file="spac-ver.mkiv"/> + <cd:command name="inhibitblank" level="system" category="whitespace" file="spac-ver.mkiv"/> - <cd:command name="synchronizeblank" file="spac-ver.mkiv"/> + <cd:command name="synchronizeblank" level="system" category="whitespace" file="spac-ver.mkiv"/> - <cd:command name="definevspace" file="spac-ver.mkiv"> + <cd:command name="definevspace" level="style" category="whitespace" file="spac-ver.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:resolve name="keyword-name"/> @@ -123,29 +188,29 @@ </cd:arguments> </cd:command> - <cd:command name="vspace" file="spac-ver.mkiv"> + <cd:command name="vspace" level="document" category="whitespace" file="spac-ver.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:resolve name="keyword-name-optional"/> </cd:arguments> </cd:command> - <cd:command name="godown" file="spac-ver.mkiv"> + <cd:command name="godown" level="document" category="whitespace" file="spac-ver.mkiv"> <cd:arguments> <cd:resolve name="keyword-dimension"/> </cd:arguments> </cd:command> - <cd:command name="vglue" file="spac-ver.mkiv"> + <cd:command name="vglue" level="system" category="whitespace" file="spac-ver.mkiv"> <cd:arguments> <cd:resolve name="string-dimension"/> </cd:arguments> </cd:command> - <cd:command name="smallskip" file="spac-ver.mkiv"/> + <cd:command name="smallskip" level="system" category="whitespace" file="spac-ver.mkiv"/> - <cd:command name="medskip" file="spac-ver.mkiv"/> + <cd:command name="medskip" level="system" category="whitespace" file="spac-ver.mkiv"/> - <cd:command name="bigskip" file="spac-ver.mkiv"/> + <cd:command name="bigskip" level="system" category="whitespace" file="spac-ver.mkiv"/> </cd:interface> diff --git a/tex/context/interface/mkiv/i-whitespace.xml b/tex/context/interface/mkiv/i-whitespace.xml index 06e1997c5..f1a8ce84e 100644 --- a/tex/context/interface/mkiv/i-whitespace.xml +++ b/tex/context/interface/mkiv/i-whitespace.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="setupwhitespace" file="spac-ver.mkiv"> + <cd:command name="setupwhitespace" level="style" category="whitespace" file="spac-ver.mkiv"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="fix"/> @@ -23,15 +23,15 @@ </cd:arguments> </cd:command> - <cd:command name="synchronizewhitespace" file="spac-ver.mkiv"/> + <cd:command name="synchronizewhitespace" level="system" category="whitespace" file="spac-ver.mkiv"/> - <cd:command name="correctwhitespace" file="spac-ver.mkiv"> + <cd:command name="correctwhitespace" level="system" category="whitespace" file="spac-ver.mkiv"> <cd:arguments> <cd:content/> </cd:arguments> </cd:command> - <cd:command name="packed" type="environment" file="spac-ver.mkiv"> + <cd:command name="packed" type="environment" level="document" category="whitespace" file="spac-ver.mkiv"> <cd:arguments> <cd:keywords optional="yes"> <cd:constant type="blank"/> @@ -39,9 +39,9 @@ </cd:arguments> </cd:command> - <cd:command name="unpacked" type="environment" file="spac-ver.mkiv"/> + <cd:command name="unpacked" type="environment" category="whitespace" file="spac-ver.mkiv"/> - <cd:command name="linecorrection" type="environment" file="spac-ver.mkiv"> + <cd:command name="linecorrection" type="environment" level="document" category="whitespace" file="spac-ver.mkiv"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="blank"/> @@ -50,7 +50,7 @@ </cd:arguments> </cd:command> - <cd:command name="locallinecorrection" type="environment" file="spac-ver.mkiv"> + <cd:command name="locallinecorrection" type="environment" category="whitespace" file="spac-ver.mkiv"> <cd:arguments> <cd:keywords list="yes" optional="yes"> <cd:constant type="blank"/> @@ -59,4 +59,4 @@ </cd:arguments> </cd:command> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/interface/mkiv/i-xml.xml b/tex/context/interface/mkiv/i-xml.xml index c13196383..d09913f7c 100644 --- a/tex/context/interface/mkiv/i-xml.xml +++ b/tex/context/interface/mkiv/i-xml.xml @@ -2,151 +2,151 @@ <?context-directive job ctxfile x-setups.ctx ?> -<cd:interface xmlns:cd="http://www.pragma-ade.com/commands" file="lxml-ini.mkiv"> +<cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> <!-- the definitions themselves --> - <cd:command name="xmlmain"> + <cd:command name="xmlmain" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="xmlflush"> + <cd:command name="xmlflush" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> </cd:arguments> </cd:command> - <cd:command name="xmltext"> + <cd:command name="xmltext" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> <cd:resolve name="argument-lpath"/> </cd:arguments> </cd:command> - <cd:command name="xmlpure"> + <cd:command name="xmlpure" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> <cd:resolve name="argument-lpath"/> </cd:arguments> </cd:command> - <cd:command name="xmlflushtext"> + <cd:command name="xmlflushtext" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> </cd:arguments> </cd:command> - <cd:command name="xmlflushpure"> + <cd:command name="xmlflushpure" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> </cd:arguments> </cd:command> - <cd:command name="xmlnonspace"> + <cd:command name="xmlnonspace" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> <cd:resolve name="argument-lpath"/> </cd:arguments> </cd:command> - <cd:command name="xmlflushspacewise"> + <cd:command name="xmlflushspacewise" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> </cd:arguments> </cd:command> - <cd:command name="xmlflushlinewise"> + <cd:command name="xmlflushlinewise" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> </cd:arguments> </cd:command> - <cd:command name="xmlall"> + <cd:command name="xmlall" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> <cd:resolve name="argument-lpath"/> </cd:arguments> </cd:command> - <cd:command name="xmllastmatch"/> + <cd:command name="xmllastmatch" level="style" category="xml" file="lxml-ini.mkiv"/> - <cd:command name="xmlfirst"> + <cd:command name="xmlfirst" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> <cd:resolve name="argument-lpath"/> </cd:arguments> </cd:command> - <cd:command name="xmllast"> + <cd:command name="xmllast" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> <cd:resolve name="argument-lpath"/> </cd:arguments> </cd:command> - <cd:command name="xmlcontext"> + <cd:command name="xmlcontext" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> <cd:resolve name="argument-lpath"/> </cd:arguments> </cd:command> - <cd:command name="xmlflushcontext"> + <cd:command name="xmlflushcontext" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> </cd:arguments> </cd:command> - <cd:command name="xmlshow"> + <cd:command name="xmlshow" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> </cd:arguments> </cd:command> - <cd:command name="xmlinfo"> + <cd:command name="xmlinfo" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> </cd:arguments> </cd:command> - <cd:command name="xmlfilter"> + <cd:command name="xmlfilter" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> <cd:resolve name="argument-lpath"/> </cd:arguments> </cd:command> - <cd:command name="xmlstrip"> + <cd:command name="xmlstrip" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> <cd:resolve name="argument-lpath"/> </cd:arguments> </cd:command> - <cd:command name="xmlstripped"> + <cd:command name="xmlstripped" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> <cd:resolve name="argument-lpath"/> </cd:arguments> </cd:command> - <cd:command name="xmlstripnolines"> + <cd:command name="xmlstripnolines" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> <cd:resolve name="argument-lpath"/> </cd:arguments> </cd:command> - <cd:command name="xmlstrippednolines"> + <cd:command name="xmlstrippednolines" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> <cd:resolve name="argument-lpath"/> </cd:arguments> </cd:command> - <cd:command name="xmlposition"> + <cd:command name="xmlposition" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> <cd:resolve name="argument-lpath"/> @@ -154,27 +154,27 @@ </cd:arguments> </cd:command> - <cd:command name="xmlelement"> + <cd:command name="xmlelement" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="xmlpos"> + <cd:command name="xmlpos" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> </cd:arguments> </cd:command> - <cd:command name="xmlsnippet"> + <cd:command name="xmlsnippet" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> <cd:resolve name="argument-number"/> </cd:arguments> </cd:command> - <cd:command name="xmlconcat"> + <cd:command name="xmlconcat" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> <cd:resolve name="argument-lpath"/> @@ -182,7 +182,7 @@ </cd:arguments> </cd:command> - <cd:command name="xmlconcatrange"> + <cd:command name="xmlconcatrange" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> <cd:resolve name="argument-lpath"/> @@ -192,7 +192,7 @@ </cd:arguments> </cd:command> - <cd:command name="xmlcommand"> + <cd:command name="xmlcommand" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> <cd:resolve name="argument-lpath"/> @@ -200,44 +200,73 @@ </cd:arguments> </cd:command> - <cd:command name="xmlinlineverbatim"> + <cd:command name="xmlinlineverbatim" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> </cd:arguments> </cd:command> - <cd:command name="xmlinlineverbatim" type="environment"> + <cd:command name="xmlinlineverbatim" type="environment" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="xmldisplayverbatim"> + <cd:command name="xmldisplayverbatim" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> </cd:arguments> </cd:command> - <cd:command name="xmldisplayverbatim" type="environment"> + <cd:command name="xmldisplayverbatim" type="environment" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name"/> </cd:arguments> </cd:command> - <cd:command name="xmlverbatim"> + <cd:command name="xmlverbatim" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> </cd:arguments> </cd:command> - <cd:command name="xmlprettyprint"> + <cd:command name="xmlprettyprint" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> - <cd:resolve name="argument-name"/> + <cd:keywords delimiters="braces"> + <cd:resolve name="value-verbatim"/> + </cd:keywords> + </cd:arguments> + </cd:command> + + <cd:command name="xmlprettyprinttext" level="style" category="xml" file="lxml-ini.mkiv"> + <cd:arguments> + <cd:resolve name="argument-node"/> + <cd:keywords delimiters="braces"> + <cd:resolve name="value-verbatim"/> + </cd:keywords> </cd:arguments> </cd:command> - <cd:command name="xmlloadfile"> + <cd:command name="xmlinlineprettyprint" level="style" category="xml" file="lxml-ini.mkiv"> + <cd:arguments> + <cd:resolve name="argument-node"/> + <cd:keywords delimiters="braces"> + <cd:resolve name="value-verbatim"/> + </cd:keywords> + </cd:arguments> + </cd:command> + + <cd:command name="xmlinlineprettyprinttext" level="style" category="xml" file="lxml-ini.mkiv"> + <cd:arguments> + <cd:resolve name="argument-node"/> + <cd:keywords delimiters="braces"> + <cd:resolve name="value-verbatim"/> + </cd:keywords> + </cd:arguments> + </cd:command> + + <cd:command name="xmlloadfile" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-file"/> @@ -245,7 +274,7 @@ </cd:arguments> </cd:command> - <cd:command name="xmlloadbuffer"> + <cd:command name="xmlloadbuffer" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-buffer"/> <cd:resolve name="argument-name"/> @@ -253,7 +282,7 @@ </cd:arguments> </cd:command> - <cd:command name="xmlloaddata"> + <cd:command name="xmlloaddata" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-text"/> @@ -261,7 +290,7 @@ </cd:arguments> </cd:command> - <cd:command name="xmlloadonly"> + <cd:command name="xmlloadonly" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-file"/> @@ -269,7 +298,7 @@ </cd:arguments> </cd:command> - <cd:command name="xmlprocessfile"> + <cd:command name="xmlprocessfile" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-file"/> @@ -277,7 +306,7 @@ </cd:arguments> </cd:command> - <cd:command name="xmlprocessbuffer"> + <cd:command name="xmlprocessbuffer" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-buffer"/> <cd:resolve name="argument-name"/> @@ -285,7 +314,7 @@ </cd:arguments> </cd:command> - <cd:command name="xmlprocessdata"> + <cd:command name="xmlprocessdata" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-text"/> @@ -293,7 +322,7 @@ </cd:arguments> </cd:command> - <cd:command name="xmlinclude"> + <cd:command name="xmlinclude" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> <cd:resolve name="argument-lpath"/> @@ -301,44 +330,44 @@ </cd:arguments> </cd:command> - <cd:command name="xmlname"> + <cd:command name="xmlname" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> </cd:arguments> </cd:command> - <cd:command name="xmlpath"> + <cd:command name="xmlpath" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> </cd:arguments> </cd:command> - <cd:command name="xmlnamespace"> + <cd:command name="xmlnamespace" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> </cd:arguments> </cd:command> - <cd:command name="xmltag"> + <cd:command name="xmltag" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> </cd:arguments> </cd:command> - <cd:command name="xmlcount"> + <cd:command name="xmlcount" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> </cd:arguments> </cd:command> - <cd:command name="xmlatt"> + <cd:command name="xmlatt" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="xmlattdef"> + <cd:command name="xmlsetatt" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> <cd:resolve name="argument-name"/> @@ -346,16 +375,24 @@ </cd:arguments> </cd:command> - <cd:command name="xmlrefatt"> + <cd:command name="xmlattdef" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> <cd:resolve name="argument-name"/> + <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="xmllastatt"/> + <cd:command name="xmlrefatt" level="style" category="xml" file="lxml-ini.mkiv"> + <cd:arguments> + <cd:resolve name="argument-node"/> + <cd:resolve name="argument-name"/> + </cd:arguments> + </cd:command> + + <cd:command name="xmllastatt" level="style" category="xml" file="lxml-ini.mkiv"/> - <cd:command name="xmlattribute"> + <cd:command name="xmlattribute" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> <cd:resolve name="argument-lpath"/> @@ -363,7 +400,7 @@ </cd:arguments> </cd:command> - <cd:command name="xmlattributedef"> + <cd:command name="xmlsetattribute" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> <cd:resolve name="argument-lpath"/> @@ -372,14 +409,38 @@ </cd:arguments> </cd:command> - <cd:command name="xmlchainatt"> + <cd:command name="xmlattributedef" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> + <cd:resolve name="argument-lpath"/> <cd:resolve name="argument-name"/> + <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="xmlchainattdef"> + <cd:command name="xmlchainatt" level="style" category="xml" file="lxml-ini.mkiv"> + <cd:arguments> + <cd:resolve name="argument-node"/> + <cd:resolve name="argument-name"/> + </cd:arguments> + </cd:command> + + <cd:command name="xmlchainattdef" level="style" category="xml" file="lxml-ini.mkiv"> + <cd:arguments> + <cd:resolve name="argument-node"/> + <cd:resolve name="argument-name"/> + <cd:resolve name="argument-text"/> + </cd:arguments> + </cd:command> + + <cd:command name="xmlpar" level="style" category="xml" file="lxml-ini.mkiv"> + <cd:arguments> + <cd:resolve name="argument-node"/> + <cd:resolve name="argument-name"/> + </cd:arguments> + </cd:command> + + <cd:command name="xmlsetpar" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> <cd:resolve name="argument-name"/> @@ -387,39 +448,58 @@ </cd:arguments> </cd:command> - <cd:command name="xmldirectives"> + <cd:command name="xmlparam" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> + <cd:resolve name="argument-lpath"/> + <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="xmldirectivesbefore"> + <cd:command name="xmlsetparam" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> + <cd:resolve name="argument-lpath"/> + <cd:resolve name="argument-name"/> + <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="xmldirectivesafter"> + <cd:command name="xmllastpar" level="style" category="xml" file="lxml-ini.mkiv"/> + + <cd:command name="xmldirectives" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> </cd:arguments> </cd:command> - <cd:command name="xmlinstalldirective"> + <cd:command name="xmldirectivesbefore" level="style" category="xml" file="lxml-ini.mkiv"> + <cd:arguments> + <cd:resolve name="argument-node"/> + </cd:arguments> + </cd:command> + + <cd:command name="xmldirectivesafter" level="style" category="xml" file="lxml-ini.mkiv"> + <cd:arguments> + <cd:resolve name="argument-node"/> + </cd:arguments> + </cd:command> + + <cd:command name="xmlinstalldirective" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-csname"/> </cd:arguments> </cd:command> - <cd:command name="xmlsetup"> + <cd:command name="xmlsetup" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> <cd:resolve name="argument-setup"/> </cd:arguments> </cd:command> - <cd:command name="xmlsetsetup"> + <cd:command name="xmlsetsetup" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-lpath"/> @@ -427,79 +507,79 @@ </cd:arguments> </cd:command> - <cd:command name="xmlremovesetup"> + <cd:command name="xmlremovesetup" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-setup"/> </cd:arguments> </cd:command> - <cd:command name="xmlremovedocumentsetup"> + <cd:command name="xmlremovedocumentsetup" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-setup"/> </cd:arguments> </cd:command> - <cd:command name="xmlflushdocumentsetups"> + <cd:command name="xmlflushdocumentsetups" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-setup"/> </cd:arguments> </cd:command> - <cd:command name="xmlresetsetups"> + <cd:command name="xmlresetsetups" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="xmlresetdocumentsetups"> + <cd:command name="xmlresetdocumentsetups" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="xmlprependsetup"> + <cd:command name="xmlprependsetup" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-setup"/> </cd:arguments> </cd:command> - <cd:command name="xmlappendsetup"> + <cd:command name="xmlappendsetup" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-setup"/> </cd:arguments> </cd:command> - <cd:command name="xmlbeforesetup"> + <cd:command name="xmlbeforesetup" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-setup"/> <cd:resolve name="argument-setup"/> </cd:arguments> </cd:command> - <cd:command name="xmlaftersetup"> + <cd:command name="xmlaftersetup" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-setup"/> <cd:resolve name="argument-setup"/> </cd:arguments> </cd:command> - <cd:command name="xmlprependdocumentsetup"> + <cd:command name="xmlprependdocumentsetup" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-setup"/> </cd:arguments> </cd:command> - <cd:command name="xmlappenddocumentsetup"> + <cd:command name="xmlappenddocumentsetup" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-setup"/> </cd:arguments> </cd:command> - <cd:command name="xmlbeforedocumentsetup"> + <cd:command name="xmlbeforedocumentsetup" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-setup"/> @@ -507,7 +587,7 @@ </cd:arguments> </cd:command> - <cd:command name="xmlafterdocumentsetup"> + <cd:command name="xmlafterdocumentsetup" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-setup"/> @@ -515,17 +595,16 @@ </cd:arguments> </cd:command> - <cd:command name="xmlregisteredsetups"> - </cd:command> + <cd:command name="xmlregisteredsetups" level="style" category="xml" file="lxml-ini.mkiv"/> - <cd:command name="xmlregistereddocumentsetups"> + <cd:command name="xmlregistereddocumentsetups" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-setup"/> </cd:arguments> </cd:command> - <cd:command name="xmlsetfunction"> + <cd:command name="xmlsetfunction" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> <cd:resolve name="argument-lpath"/> @@ -535,7 +614,7 @@ </cd:arguments> </cd:command> - <cd:command name="xmldoif"> + <cd:command name="xmldoif" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> <cd:resolve name="argument-lpath"/> @@ -543,7 +622,7 @@ </cd:arguments> </cd:command> - <cd:command name="xmldoifnot"> + <cd:command name="xmldoifnot" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> <cd:resolve name="argument-lpath"/> @@ -551,7 +630,7 @@ </cd:arguments> </cd:command> - <cd:command name="xmldoifelse"> + <cd:command name="xmldoifelse" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> <cd:resolve name="argument-lpath"/> @@ -560,7 +639,7 @@ </cd:arguments> </cd:command> - <cd:command name="xmldoiftext"> + <cd:command name="xmldoiftext" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> <cd:resolve name="argument-lpath"/> @@ -568,7 +647,7 @@ </cd:arguments> </cd:command> - <cd:command name="xmldoifnottext"> + <cd:command name="xmldoifnottext" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> <cd:resolve name="argument-lpath"/> @@ -576,7 +655,7 @@ </cd:arguments> </cd:command> - <cd:command name="xmldoifelsetext"> + <cd:command name="xmldoifelsetext" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> <cd:resolve name="argument-lpath"/> @@ -585,21 +664,21 @@ </cd:arguments> </cd:command> - <cd:command name="xmldoifselfempty"> + <cd:command name="xmldoifselfempty" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> <cd:resolve name="argument-true"/> </cd:arguments> </cd:command> - <cd:command name="xmldoifnotselfempty"> + <cd:command name="xmldoifnotselfempty" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> <cd:resolve name="argument-true"/> </cd:arguments> </cd:command> - <cd:command name="xmldoifelseselfempty"> + <cd:command name="xmldoifelseselfempty" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> <cd:resolve name="argument-true"/> @@ -607,7 +686,7 @@ </cd:arguments> </cd:command> - <cd:command name="xmldoifelseempty"> + <cd:command name="xmldoifelseempty" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> <cd:resolve name="argument-lpath"/> @@ -616,7 +695,7 @@ </cd:arguments> </cd:command> - <cd:command name="xmlregisterns"> + <cd:command name="xmlregisterns" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:keywords delimiters="braces"> @@ -625,14 +704,14 @@ </cd:arguments> </cd:command> - <cd:command name="xmlregisterns"> + <cd:command name="xmlregisterns" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="xmlremapname"> + <cd:command name="xmlremapname" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> <cd:resolve name="argument-lpath"/> @@ -641,7 +720,7 @@ </cd:arguments> </cd:command> - <cd:command name="xmlremapnamespace"> + <cd:command name="xmlremapnamespace" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> <cd:resolve name="argument-name"/> @@ -649,14 +728,14 @@ </cd:arguments> </cd:command> - <cd:command name="xmlchecknamespace"> + <cd:command name="xmlchecknamespace" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="xmlmapvalue"> + <cd:command name="xmlmapvalue" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-category"/> <cd:resolve name="argument-name"/> @@ -664,7 +743,7 @@ </cd:arguments> </cd:command> - <cd:command name="xmlvalue"> + <cd:command name="xmlvalue" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-category"/> <cd:resolve name="argument-name"/> @@ -672,7 +751,7 @@ </cd:arguments> </cd:command> - <cd:command name="xmldoifelsevalue"> + <cd:command name="xmldoifelsevalue" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-category"/> <cd:resolve name="argument-name"/> @@ -681,20 +760,20 @@ </cd:arguments> </cd:command> - <cd:command name="xmlloaddirectives"> + <cd:command name="xmlloaddirectives" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-file"/> </cd:arguments> </cd:command> - <cd:command name="xmlsave"> + <cd:command name="xmlsave" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> <cd:resolve name="argument-file"/> </cd:arguments> </cd:command> - <cd:command name="xmltofile"> + <cd:command name="xmltofile" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> <cd:resolve name="argument-lpath"/> @@ -702,7 +781,7 @@ </cd:arguments> </cd:command> - <cd:command name="xmltobuffer"> + <cd:command name="xmltobuffer" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> <cd:resolve name="argument-lpath"/> @@ -710,7 +789,7 @@ </cd:arguments> </cd:command> - <cd:command name="xmltobufferverbose"> + <cd:command name="xmltobufferverbose" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> <cd:resolve name="argument-lpath"/> @@ -720,7 +799,7 @@ <!-- - <cd:command name="xmltoparameters"> + <cd:command name="xmltoparameters" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> <cd:resolve name="argument-lpath"/> @@ -730,55 +809,55 @@ --> - <cd:command name="xmladdindex"> + <cd:command name="xmladdindex" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> </cd:arguments> </cd:command> - <cd:command name="xmlinclusion"> + <cd:command name="xmlinclusion" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> </cd:arguments> </cd:command> - <cd:command name="xmlinclusions"> + <cd:command name="xmlinclusions" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> </cd:arguments> </cd:command> - <cd:command name="xmlbadinclusions"> + <cd:command name="xmlbadinclusions" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> </cd:arguments> </cd:command> - <cd:command name="xmlraw"> + <cd:command name="xmlraw" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> </cd:arguments> </cd:command> - <cd:command name="xmlraw" type="environment"/> + <cd:command name="xmlraw" type="environment" level="style" category="xml" file="lxml-ini.mkiv"/> <!-- injectors --> - <cd:command name="xmlresetinjectors"/> + <cd:command name="xmlresetinjectors" level="style" category="xml" file="lxml-ini.mkiv"/> - <cd:command name="xmlsetinjectors"> + <cd:command name="xmlsetinjectors" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="keyword-name-list"/> </cd:arguments> </cd:command> - <cd:command name="xmlinjector"> + <cd:command name="xmlinjector" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> </cd:arguments> </cd:command> - <cd:command name="xmlapplyselectors"> + <cd:command name="xmlapplyselectors" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> </cd:arguments> @@ -786,14 +865,14 @@ <!-- entities --> - <cd:command name="xmlsetentity"> + <cd:command name="xmlsetentity" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-text"/> </cd:arguments> </cd:command> - <cd:command name="xmltexentity"> + <cd:command name="xmltexentity" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-name"/> <cd:resolve name="argument-text"/> @@ -802,7 +881,7 @@ <!-- general setup --> - <cd:command name="setupxml"> + <cd:command name="setupxml" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:assignments list="yes"> <cd:parameter name="default"> @@ -818,7 +897,7 @@ </cd:arguments> </cd:command> - <cd:command name="xmldefaulttotext"> + <cd:command name="xmldefaulttotext" level="style" category="xml" file="lxml-ini.mkiv"> <cd:arguments> <cd:resolve name="argument-node"/> </cd:arguments> diff --git a/tex/context/interface/mkiv/i-xtable.xml b/tex/context/interface/mkiv/i-xtable.xml index 7500ff47f..c921e1a8d 100644 --- a/tex/context/interface/mkiv/i-xtable.xml +++ b/tex/context/interface/mkiv/i-xtable.xml @@ -4,7 +4,7 @@ <cd:interface xmlns:cd="http://www.pragma-ade.com/commands"> - <cd:command name="definextable" file="tabl-xtb.mkvi"> + <cd:command name="definextable" level="style" category="tables" file="tabl-xtb.mkvi"> <cd:arguments> <cd:resolve name="keyword-name"/> <cd:resolve name="keyword-name-optional"/> @@ -14,7 +14,7 @@ </cd:arguments> </cd:command> - <cd:command name="setupxtable" file="tabl-xtb.mkvi"> + <cd:command name="setupxtable" level="style" category="tables" file="tabl-xtb.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-list-optional"/> <cd:assignments list="yes"> @@ -82,7 +82,7 @@ </cd:arguments> </cd:command> - <cd:command name="xtable" type="environment" file="tabl-xtb.mkvi"> + <cd:command name="xtable" type="environment" level="document" category="tables" file="tabl-xtb.mkvi"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupxtable"/> @@ -90,13 +90,13 @@ </cd:arguments> </cd:command> - <cd:command name="xtable" type="environment" variant="name" file="tabl-xtb.mkvi"> + <cd:command name="xtable" type="environment" variant="name" level="document" category="tables" file="tabl-xtb.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> </cd:arguments> </cd:command> - <cd:command name="embeddedxtable" type="environment" file="tabl-xtb.mkvi"> + <cd:command name="embeddedxtable" type="environment" level="style" category="tables" file="tabl-xtb.mkvi"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupxtable"/> @@ -104,13 +104,13 @@ </cd:arguments> </cd:command> - <cd:command name="embeddedxtable" type="environment" variant="name" file="tabl-xtb.mkvi"> + <cd:command name="embeddedxtable" type="environment" variant="name" level="style" category="tables" file="tabl-xtb.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> </cd:arguments> </cd:command> - <cd:command name="xtable" type="environment" generated="yes" variant="example" file="tabl-xtb.mkvi"> + <cd:command name="xtable" type="environment" generated="yes" variant="example" level="document" category="tables" file="tabl-xtb.mkvi"> <cd:sequence> <cd:variable value="xtable"/> </cd:sequence> @@ -121,13 +121,13 @@ </cd:arguments> </cd:command> - <cd:command name="processxtablebuffer" file="tabl-xtb.mkvi"> + <cd:command name="processxtablebuffer" level="document" category="tables" file="tabl-xtb.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> </cd:arguments> </cd:command> - <cd:command name="xrow" type="environment" file="tabl-xtb.mkvi"> + <cd:command name="xrow" type="environment" level="document" category="tables" file="tabl-xtb.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:assignments list="yes" optional="yes"> @@ -136,7 +136,7 @@ </cd:arguments> </cd:command> - <cd:command name="xcell" type="environment" file="tabl-xtb.mkvi"> + <cd:command name="xcell" type="environment" level="document" category="tables" file="tabl-xtb.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:assignments list="yes" optional="yes"> @@ -157,7 +157,7 @@ </cd:arguments> </cd:command> - <cd:command name="xtablehead" type="environment" file="tabl-xtb.mkvi"> + <cd:command name="xtablehead" type="environment" level="document" category="tables" file="tabl-xtb.mkvi"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupxtable"/> @@ -165,13 +165,13 @@ </cd:arguments> </cd:command> - <cd:command name="xtablehead" type="environment" variant="name" file="tabl-xtb.mkvi"> + <cd:command name="xtablehead" type="environment" variant="name" level="document" category="tables" file="tabl-xtb.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> </cd:arguments> </cd:command> - <cd:command name="xtablefoot" type="environment" file="tabl-xtb.mkvi"> + <cd:command name="xtablefoot" type="environment" level="document" category="tables" file="tabl-xtb.mkvi"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupxtable"/> @@ -179,13 +179,13 @@ </cd:arguments> </cd:command> - <cd:command name="xtablefoot" type="environment" variant="name" file="tabl-xtb.mkvi"> + <cd:command name="xtablefoot" type="environment" variant="name" level="document" category="tables" file="tabl-xtb.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> </cd:arguments> </cd:command> - <cd:command name="xtablenext" type="environment" file="tabl-xtb.mkvi"> + <cd:command name="xtablenext" type="environment" level="document" category="tables" file="tabl-xtb.mkvi"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupxtable"/> @@ -193,13 +193,13 @@ </cd:arguments> </cd:command> - <cd:command name="xtablenext" type="environment" variant="name" file="tabl-xtb.mkvi"> + <cd:command name="xtablenext" type="environment" variant="name" level="document" category="tables" file="tabl-xtb.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> </cd:arguments> </cd:command> - <cd:command name="xtablebody" type="environment" file="tabl-xtb.mkvi"> + <cd:command name="xtablebody" type="environment" level="document" category="tables" file="tabl-xtb.mkvi"> <cd:arguments> <cd:assignments list="yes" optional="yes"> <cd:inherit name="setupxtable"/> @@ -207,13 +207,13 @@ </cd:arguments> </cd:command> - <cd:command name="xtablebody" type="environment" variant="name" file="tabl-xtb.mkvi"> + <cd:command name="xtablebody" type="environment" variant="name" level="document" category="tables" file="tabl-xtb.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> </cd:arguments> </cd:command> - <cd:command name="xgroup" type="environment" file="tabl-xtb.mkvi"> + <cd:command name="xgroup" type="environment" level="document" category="tables" file="tabl-xtb.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:assignments list="yes" optional="yes"> @@ -222,7 +222,7 @@ </cd:arguments> </cd:command> - <cd:command name="xrowgroup" type="environment" file="tabl-xtb.mkvi"> + <cd:command name="xrowgroup" type="environment" level="document" category="tables" file="tabl-xtb.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:assignments list="yes" optional="yes"> @@ -231,7 +231,7 @@ </cd:arguments> </cd:command> - <cd:command name="xcellgroup" type="environment" file="tabl-xtb.mkvi"> + <cd:command name="xcellgroup" type="environment" level="document" category="tables" file="tabl-xtb.mkvi"> <cd:arguments> <cd:resolve name="keyword-name-optional"/> <cd:assignments list="yes" optional="yes"> @@ -240,8 +240,8 @@ </cd:arguments> </cd:command> - <cd:command name="currentxtablerow" file="tabl-xtb.mkvi"/> + <cd:command name="currentxtablerow" level="system" category="tables" file="tabl-xtb.mkvi"/> - <cd:command name="currentxtablecolumn" file="tabl-xtb.mkvi"/> + <cd:command name="currentxtablecolumn" level="system" category="tables" file="tabl-xtb.mkvi"/> -</cd:interface> +</cd:interface>
\ No newline at end of file diff --git a/tex/context/modules/common/s-abbreviations-extras.tex b/tex/context/modules/common/s-abbreviations-extras.tex new file mode 100644 index 000000000..7ee6e1553 --- /dev/null +++ b/tex/context/modules/common/s-abbreviations-extras.tex @@ -0,0 +1,56 @@ +%D \module +%D [ file=s-abbrevations-extras.tex, % was: s-abr-01 +%D version=1996.01.01, +%D title=\CONTEXT\ Style File, +%D subtitle=General Abbreviated Extras, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\startmodule[abbreviations-extras] + +\def\SystemSpecialA#1{$\langle\it#1\rangle$} +\def\SystemSpecialB#1{{\tttf<#1>}} + +\unexpanded\def\CATCODE {\SystemSpecialA{catcode}} +\unexpanded\def\CATCODES {\SystemSpecialA{catcodes}} +\unexpanded\def\DIMENSION {\SystemSpecialA{dimension}} +\unexpanded\def\DIMENSIONS {\SystemSpecialA{dimensions}} +\unexpanded\def\COUNTER {\SystemSpecialA{counter}} +\unexpanded\def\COUNTERS {\SystemSpecialA{counters}} +\unexpanded\def\HBOX {\SystemSpecialA{hbox}} +\unexpanded\def\HBOXES {\SystemSpecialA{hboxes}} +\unexpanded\def\VBOX {\SystemSpecialA{vbox}} +\unexpanded\def\VBOXES {\SystemSpecialA{vboxes}} +\unexpanded\def\BOX {\SystemSpecialA{box}} +\unexpanded\def\BOXES {\SystemSpecialA{boxes}} +\unexpanded\def\TOKENLIST {\SystemSpecialA{token list}} +\unexpanded\def\TOKENLISTS {\SystemSpecialA{token lists}} +\unexpanded\def\NEWLINE {\SystemSpecialA{newline}} +\unexpanded\def\SKIP {\SystemSpecialA{skip}} +\unexpanded\def\SKIPS {\SystemSpecialA{skips}} +\unexpanded\def\MUSKIP {\SystemSpecialA{muskip}} +\unexpanded\def\MUSKIPS {\SystemSpecialA{muskips}} +\unexpanded\def\MARK {\SystemSpecialA{mark}} +\unexpanded\def\MARKS {\SystemSpecialA{marks}} + +\unexpanded\def\SPACE {\SystemSpecialB{space}} +\unexpanded\def\EOF {\SystemSpecialB{eof}} +\unexpanded\def\TAB {\SystemSpecialB{tab}} +\unexpanded\def\NEWPAGE {\SystemSpecialB{newpage}} +\unexpanded\def\NEWLINE {\SystemSpecialB{newline}} + +\unexpanded\def\LUWATEEKH {لُواتيخ} % kh ī t ā w [u] l +\unexpanded\def\luwateekh {luwātīkh} + +\doifmodeelse {mkiv} { + \unexpanded\def\THANH{H\agrave n Th\ecircumflexacute\ Th\agrave nh} +} { + \unexpanded\def\THANH{H\`an Th\^e\llap{\raise 0.5ex\hbox{\'{}}} Th\`anh} +} + +\stopmodule diff --git a/tex/context/modules/common/s-abr-01.tex b/tex/context/modules/common/s-abbreviations-logos.tex index fd6c66419..f1966f544 100644 --- a/tex/context/modules/common/s-abr-01.tex +++ b/tex/context/modules/common/s-abbreviations-logos.tex @@ -1,8 +1,8 @@ %D \module -%D [ file=s-abr-01, +%D [ file=s-abbrevations-logos.tex, % was: s-abr-01 %D version=1996.01.01, %D title=\CONTEXT\ Style File, -%D subtitle=General Abbreviations 1, +%D subtitle=General Abbreviated Logos, %D author=Hans Hagen, %D date=\currentdate, %D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] @@ -11,13 +11,7 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\unprotect - -\setupsorting[logo][\c!style=\v!capital] - -\setupcapitals[\c!title=\v!no] - -\protect +\startmodule[abbreviations-logos] \logo [MKI] {MkI} % joke \logo [MKII] {MkII} @@ -31,52 +25,53 @@ \logo [MPII] {MpII} \logo [MPIV] {MpIV} -%logo [FGA] {fga} -%logo [FGBBS] {fgbbs} \logo [ACROBAT] {Acro\-bat} -\logo [APA] {apa} \logo [AFM] {afm} -\logo [API] {api} +\logo [AI] {ai} \logo [ALEPH] {Aleph} % {\mathematics{\aleph}} \logo [ALGOL] {ALGOL} \logo [AMS] {ams} \logo [AMSLATEX] {\AmSLaTeX} \logo [AMSTEX] {\AmSTeX} \logo [ANSI] {ansi} -\logo [ARABTEX] {Arab\TeX} +\logo [APA] {apa} +\logo [API] {api} +\logo [ARABTEX] {Arab\TeXsuffix} \logo [ASCII] {ascii} -\logo [ASCIITEX] {ascii\TeX} \logo [ASCIIMATH] {AsciiMath} -\logo [BACHOTEX] {Bacho\TeX} -\logo [BIBTEX] {bib\TeX} -\logo [MLBIBTEX] {MLbib\TeX} +\logo [ASCIITEX] {ascii\TeXsuffix} +\logo [BACHOTEX] {Bacho\TeXsuffix} +\logo [BIBTEX] {bib\TeXsuffix} \logo [BLUESKY] {BlueSky} \logo [BMP] {bmp} \logo [BSD] {bsd} -\logo [CCODE] {C} -\logo [CPLUSPLUS] {C\high{++}} \logo [CALCMATH] {CalcMath} -\logo [CLD] {cld} +\logo [CCODE] {C} \logo [CD] {cd} -\logo [CPU] {cpu} \logo [CDROM] {cdrom} \logo [CID] {cid} \logo [CJK] {cjk} -\logo [CMR] {cmr} \logo [CLD] {cld} +\logo [CLD] {cld} +\logo [CMR] {cmr} \logo [CMYK] {cmyk} +\logo [CNC] {cnc} \logo [CODHOST] {CodHost} \logo [CONTEXT] {\ConTeXt} -\logo [CONTEXTWIKI] {\ConTeXt\ Wiki} \logo [CONTEXTGROUP] {\ConTeXt\ Group} +\logo [CONTEXTWIKI] {\ConTeXt\ Wiki} +\logo [CPLUSPLUS] {C\high{++}} +\logo [CPU] {cpu} \logo [CSS] {css} \logo [CTAN] {ctan} \logo [CTXTOOLS] {ctxtools} \logo [CWEB] {cweb} -\logo [CSTUG] {cstug} -\logo [DANTE] {Dante} +\logo [DAC] {dac} +\logo [DECTEN] {dec-10} \logo [DISTILLER] {distiller} -\logo [DRATEX] {Dra\TeX} +\logo [DNA] {dna} +\logo [DPI] {dpi} +\logo [DRATEX] {Dra\TeXsuffix} \logo [DSC] {dsc} \logo [DTD] {dtd} \logo [DTK] {dtk} @@ -94,15 +89,15 @@ \logo [EC] {ec} \logo [EIFFEL] {Eiffel} \logo [EMACS] {emacs} -\logo [EMTEX] {em\TeX} +\logo [EMTEX] {em\TeXsuffix} \logo [ENCODING] {enc} -\logo [ENCTEX] {enc\TeX} -\logo [EPUB] {ePub} +\logo [ENCTEX] {enc\TeXsuffix} \logo [EPS] {eps} +\logo [EPUB] {ePub} \logo [ETEX] {\eTeX} -\logo [EUROBACHOTEX] {EuroBacho\TeX} +\logo [EUROBACHOTEX] {EuroBacho\TeXsuffix} \logo [EUROMATH] {EuroMath} -\logo [EUROTEX] {Euro\TeX} +\logo [EUROTEX] {Euro\TeXsuffix} \logo [EXAMPLE] {eXaMpLe} \logo [EXAMPLED] {exampled} \logo [EXAMPLEQ] {exampleq} @@ -110,14 +105,18 @@ \logo [EXAMPLET] {examplet} \logo [EXAMPLEX] {examplex} \logo [EXIMPLE] {eXiMpLe} -\logo [FLAC] {flac} \logo [FAQ] {faq} \logo [FDF] {fdf} +\logo [FFI] {ffi} +%logo [FGA] {fga} +%logo [FGBBS] {fgbbs} +\logo [FLAC] {flac} \logo [FONTFORGE] {FontForge} \logo [FOXET] {foXet} -\logo [FPTEX] {fp\TeX} +\logo [FPTEX] {fp\TeXsuffix} \logo [FREEBSD] {FreeBSD} \logo [FTP] {ftp} +\logo [GCC] {gcc} \logo [GHOSTSCRIPT] {Ghost\-script} \logo [GHOSTVIEW] {Ghost\-view} \logo [GIF] {gif} @@ -125,31 +124,30 @@ \logo [GNUPLOT] {gnuplot} \logo [GS] {Ghost\-Script} \logo [GUST] {Gust} -\logo [GCC] {gcc} -\logo [GWTEX] {gw\TeX} +\logo [GWTEX] {gw\TeXsuffix} \logo [HSB] {hsb} % ? \logo [HSV] {hsv} \logo [HTML] {html} \logo [HTTP] {http} +\logo [HTTPS] {https} \logo [HZ] {hz} \logo [IBM] {ibm} \logo [IMAGEMAGICK] {ImageMagick} -\logo [INITEX] {ini\TeX} -\logo [INRSTEX] {inrs\TeX} +\logo [INITEX] {ini\TeXsuffix} +\logo [INRSTEX] {inrs\TeXsuffix} \logo [IO] {io} \logo [IRCNET] {IRCnet} \logo [ISO] {iso} \logo [JAVA] {Java} \logo [JAVASCRIPT] {Java\-Script} +\logo [JBIG] {jbig} \logo [JPEG] {jpeg} \logo [JPG] {jpg} -\logo [JBIG] {jbig} +\logo [JSON] {json} \logo [KPATHSEA] {kpathsea} \logo [KPSE] {kpse} -\logo [KVM] {kvm} \logo [KPSEWHICH] {kpsewhich} -\logo [MKTEXLSR] {mktexlsr} -\logo [MYSQL] {MySQL} +\logo [KVM] {kvm} \logo [LAMSTEX] {\LamSTeX} \logo [LATEX] {\LaTeX} \logo [LATEXTE] {\LaTeX2e} @@ -157,61 +155,67 @@ \logo [LCD] {lcd} \logo [LINUX] {linux} \logo [LISP] {Lisp} +\logo [LMX] {lmx} \logo [LPEG] {lpeg} \logo [LUA] {Lua} \logo [LUAJIT] {LuaJIT} -\logo [LUAJITTEX] {Luajit\TeX} -\logo [LUATEX] {Lua\TeX} +\logo [LUAJITTEX] {Luajit\TeXsuffix} +\logo [LUATEX] {Lua\TeXsuffix} \logo [LUATOOLS] {luatools} -\logo [LMX] {lmx} \logo [MACOSX] {MacOSX} -\logo [MACROTEX] {Macro\TeX} +\logo [MACROTEX] {Macro\TeXsuffix} \logo [MAKEMPY] {MakeMPY} \logo [MAPPING] {map} \logo [MAPS] {Maps} \logo [MATHML] {MathML} \logo [METAFONT] {\MetaFont} +\logo [METAFUN] {\MetaFun} \logo [METAPOST] {\MetaPost} -\logo [METATEX] {Meta\TeX} -\logo [MIKTEX] {Mik\TeX} -\logo [MINGW] {MingW} -\logo [MLTEX] {ml\TeX} +\logo [METATEX] {Meta\TeXsuffix} \logo [METATYPE] {MetaType1} +\logo [MICROSOFT] {Microsoft} +\logo [MIKTEX] {Mik\TeXsuffix} +\logo [MINGW] {MingW} +\logo [MKTEXLSR] {mktexlsr} +\logo [MLBIBTEX] {MLbib\TeXsuffix} +\logo [MLTEX] {ml\TeXsuffix} \logo [MODULA] {Modula} \logo [MOV] {mov} \logo [MPEG] {mpeg} +\logo [MPLIB] {mplib} \logo [MPS] {mps} \logo [MPTOPDF] {mptopdf} -\logo [MPLIB] {mplib} \logo [MSDOS] {msdos} -\logo [MICROSOFT] {Microsoft} \logo [MSWINDOWS] {MS~Windows} \logo [MSWORD] {MS~Word} +\logo [MSEXCEL] {MS~Excel} \logo [MTXRUN] {mtxrun} \logo [MTXTOOLS] {mtxtools} +\logo [MYSQL] {MySQL} \logo [NETPBM] {NetPBM} \logo [NTG] {ntg} \logo [NTS] {nts} +\logo [NGINX] {nginx} \logo [OFM] {ofm} \logo [OMEGA] {Omega} \logo [OPENMATH] {OpenMath} \logo [OPENTYPE] {OpenType} \logo [OPI] {opi} -\logo [OTEX] {Oriental \TeX} +\logo [OTEX] {Oriental \TeXsuffix} \logo [OTF] {otf} \logo [OTP] {otp} \logo [OVF] {ovf} \logo [PASCAL] {Pascal} -\logo [PCTEX] {pc\TeX} -\logo [PFA] {pfa} -\logo [PFB] {pfb} +\logo [PCTEX] {pc\TeXsuffix} \logo [PDF] {pdf} -\logo [PDFETEX] {pdfe\TeX} -\logo [PDFTEX] {pdf\TeX} +\logo [PDFETEX] {pdfe\TeXsuffix} +\logo [PDFTEX] {pdf\TeXsuffix} \logo [PDFTOOLS] {pdftools} \logo [PDFTOPS] {pdftops} \logo [PERL] {Perl} \logo [PERLTK] {Perl/Tk} +\logo [PFA] {pfa} +\logo [PFB] {pfb} \logo [PICTEX] {\PiCTeX} \logo [PK] {pk} \logo [PLAIN] {Plain} @@ -228,50 +232,56 @@ \logo [PSTOPAGE] {pstopage} \logo [PSTOPDF] {pstopdf} \logo [PSTRICKS] {pstricks} +\logo [RAID] {raid} \logo [RAM] {ram} +\logo [RCA] {RCA} \logo [READER] {Acro\-bat Reader} \logo [RELAXNG] {Relax\kern.125emNG} \logo [RGB] {rgb} \logo [RLXTOOLS] {rlxtools} \logo [RUBY] {Ruby} +\logo [RSYNC] {Rsync} \logo [SCITE] {SciTE} \logo [SGML] {sgml} \logo [SI] {si} \logo [SQL] {sql} \logo [SSD] {ssd} -\logo [SVG] {svg} \logo [STIX] {Stix} \logo [SUMATRAPDF] {SumatraPDF} +\logo [SVG] {svg} +\logo [SVN] {svn} \logo [SWIG] {swig} \logo [SWIGLIB] {SwigLib} +\logo [SYNCTEX] {Sync\TeX} \logo [TABLE] {\TaBlE} \logo [TCPIP] {tcp/ip} -\logo [TDS] {tds} % no sc te -\logo [TEI] {tei} % no sc te -\logo [TETEX] {te\TeX} % no sc te +\logo [TDS] {tds} % no sc te +\logo [TEI] {tei} % no sc te +\logo [TETEX] {te\TeXsuffix} % no sc te \logo [TEX] {\TeX} -\logo [TEXADRES] {\TeX adress} -\logo [TEXBASE] {\TeX base} -\logo [TEXEDIT] {\TeX edit} -\logo [TEXEXEC] {\TeX exec} -\logo [TEXFONT] {\TeX font} -\logo [TEXFORM] {\TeX form} -\logo [TEXLIVE] {\TeX Live} -\logo [TEXLUA] {\TeX Lua} +\logo [TEXADRES] {\TeXprefix adress} +\logo [TEXBASE] {\TeXprefix base} +\logo [TEXEDIT] {\TeXprefix edit} +\logo [TEXEXEC] {\TeXprefix exec} +\logo [TEXFONT] {\TeXprefix font} +\logo [TEXFORM] {\TeXprefix form} +\logo [TEXGYRE] {\TeX\ Gyre} +\logo [TEXLIVE] {\TeXprefix Live} +\logo [TEXLUA] {\TeXprefix Lua} \logo [TEXMF] {texmf} \logo [TEXMFSTART] {texmfstart} \logo [TEXNL] {tex-nl} -\logo [TEXSHOW] {\TeX show} -\logo [TEXSPELL] {\TeX spell} -\logo [TEXGYRE] {\TeX\ Gyre} +\logo [TEXSHOW] {\TeXprefix show} +\logo [TEXSPELL] {\TeXprefix spell} \logo [TEXSYNC] {texsync} \logo [TEXTMATE] {TextMate} -\logo [TEXTOOLS] {\TeX tools} -\logo [TEXUTIL] {\TeX util} -\logo [TEXWORK] {\TeX work} -\logo [TEXWORKS] {\TeX works} -\logo [TEXXET] {\TeX\XeT} \def\XeT{XeT} +\logo [TEXTOOLS] {\TeXprefix tools} +\logo [TEXUTIL] {\TeXprefix util} +\logo [TEXWORK] {\TeXprefix work} +\logo [TEXWORKS] {\TeXprefix works} +\logo [TEXXET] {\TeX\XeT} \def\XeT{XeT} \logo [TFM] {tfm} +\logo [THREED] {3D} \logo [TIF] {tif} \logo [TIFF] {tiff} \logo [TIFFINFO] {tiffinfo} @@ -292,10 +302,12 @@ \logo [URI] {uri} \logo [URL] {url} \logo [USA] {usa} +\logo [USB] {usb} \logo [USENET] {usenet} \logo [UTF] {utf} -\logo [USB] {usb} +\logo [VAX] {vax} \logo [VF] {vf} +\logo [VMWARE] {VMWare} \logo [WDT] {wdt} \logo [WEB] {web} \logo [WEBC] {web2c} @@ -303,8 +315,8 @@ \logo [WINDOWS] {Windows} \logo [WINNT] {WinNT} \logo [WINNX] {Win9x} -\logo [WWW] {www} \logo [WTHREEC] {W3C} +\logo [WWW] {www} \logo [WYSIWYG] {wysiwyg} \logo [XDVI] {Xdvi} \logo [XETEX] {\XeTeX} @@ -313,60 +325,16 @@ \logo [XINDY] {Xindy} \logo [XITS] {Xits} \logo [XML] {xml} -\logo [XPATH] {xpath} \logo [XMLTOOLS] {xmltools} -\logo [XPDFETEX] {xpdfe\TeX} +\logo [XPATH] {xpath} +\logo [XPDFETEX] {xpdfe\TeXsuffix} \logo [XSL] {xsl} \logo [XSLFO] {xsl-fo} \logo [XSLT] {xslt} \logo [XSLTPROC] {xsltproc} \logo [XYPIC] {XYPIC} % wrong logo -\logo [VMWARE] {VMWare} \logo [YandY] {y\&y} +\logo [YOUTUBE] {YouTube} \logo [ZIP] {zip} -\def\METAFUN {\MetaFun} - -\logo [METAFUN] {\MetaFun} - -\def\SystemSpecialA#1{$\langle\it#1\rangle$} -\def\SystemSpecialB#1{{\tttf<#1>}} - -\unexpanded\def\CATCODE {\SystemSpecialA{catcode}} -\unexpanded\def\CATCODES {\SystemSpecialA{catcodes}} -\unexpanded\def\DIMENSION {\SystemSpecialA{dimension}} -\unexpanded\def\DIMENSIONS {\SystemSpecialA{dimensions}} -\unexpanded\def\COUNTER {\SystemSpecialA{counter}} -\unexpanded\def\COUNTERS {\SystemSpecialA{counters}} -\unexpanded\def\HBOX {\SystemSpecialA{hbox}} -\unexpanded\def\HBOXES {\SystemSpecialA{hboxes}} -\unexpanded\def\VBOX {\SystemSpecialA{vbox}} -\unexpanded\def\VBOXES {\SystemSpecialA{vboxes}} -\unexpanded\def\BOX {\SystemSpecialA{box}} -\unexpanded\def\BOXES {\SystemSpecialA{boxes}} -\unexpanded\def\TOKENLIST {\SystemSpecialA{token list}} -\unexpanded\def\TOKENLISTS {\SystemSpecialA{token lists}} -\unexpanded\def\NEWLINE {\SystemSpecialA{newline}} -\unexpanded\def\SKIP {\SystemSpecialA{skip}} -\unexpanded\def\SKIPS {\SystemSpecialA{skips}} -\unexpanded\def\MUSKIP {\SystemSpecialA{muskip}} -\unexpanded\def\MUSKIPS {\SystemSpecialA{muskips}} -\unexpanded\def\MARK {\SystemSpecialA{mark}} -\unexpanded\def\MARKS {\SystemSpecialA{marks}} - -\unexpanded\def\SPACE {\SystemSpecialB{space}} -\unexpanded\def\EOF {\SystemSpecialB{eof}} -\unexpanded\def\TAB {\SystemSpecialB{tab}} -\unexpanded\def\NEWPAGE {\SystemSpecialB{newpage}} -\unexpanded\def\NEWLINE {\SystemSpecialB{newline}} - -\unexpanded\def\LUWATEEKH {لُواتيخ} % kh ī t ā w [u] l -\unexpanded\def\luwateekh {luwātīkh} - -\doifmodeelse {mkiv} { - \unexpanded\def\THANH{H\agrave n Th\ecircumflexacute\ Th\agrave nh} -} { - \unexpanded\def\THANH{H\`an Th\^e\llap{\raise 0.5ex\hbox{\'{}}} Th\`anh} -} - -\endinput +\stopmodule diff --git a/tex/context/modules/common/s-abr-04.tex b/tex/context/modules/common/s-abbreviations-mixed.mkiv index 23940b526..f7b2121d0 100644 --- a/tex/context/modules/common/s-abr-04.tex +++ b/tex/context/modules/common/s-abbreviations-mixed.mkiv @@ -1,8 +1,8 @@ %D \module -%D [ file=s-abr-04, +%D [ file= s-abbreviations-mixed, % was: s-abr-04 %D version=1996.01.01, %D title=\CONTEXT\ Style File, -%D subtitle=General Abbreviations 2, +%D subtitle=General Abbreviations Mixed, %D author=Hans Hagen, %D date=\currentdate, %D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] @@ -11,14 +11,18 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\usemodule[abr-01] - \unprotect -% \definealternativestyle [\v!mixed] [\font_style_pseudoMixedCapped] [\font_style_pseudoMixedCapped] +\setupsorting + [logo] + [\c!style=\font_style_pseudoMixedCapped] + +\protect + +\startmodule[abbreviations-mixed] -\setupsorting[logo][\c!style=\font_style_pseudoMixedCapped] +\usemodule[abbreviations-logos] +\usemodule[abbreviations-extras] -% \setupcapitals[\c!title=\v!no] +\stopmodule -\protect \endinput diff --git a/tex/context/modules/common/s-abbreviations-pseudocaps.mkiv b/tex/context/modules/common/s-abbreviations-pseudocaps.mkiv new file mode 100644 index 000000000..fa8606a7b --- /dev/null +++ b/tex/context/modules/common/s-abbreviations-pseudocaps.mkiv @@ -0,0 +1,30 @@ +%D \module +%D [ file= s-abbreviations-pseudocaps, % was: s-abr-01 +%D version=1996.01.01, +%D title=\CONTEXT\ Style File, +%D subtitle=General Abbreviations Pseudocaps, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\unprotect + +\setupsorting + [logo] + [\c!style=\v!capital] + +\setupcapitals + [\c!title=\v!no] + +\protect + +\startmodule[abbreviations-pseudocaps] + +\usemodule[abbreviations-logos] +\usemodule[abbreviations-extras] + +\stopmodule diff --git a/tex/context/modules/common/s-abbreviations-smallcaps.mkiv b/tex/context/modules/common/s-abbreviations-smallcaps.mkiv new file mode 100644 index 000000000..2ce86ca33 --- /dev/null +++ b/tex/context/modules/common/s-abbreviations-smallcaps.mkiv @@ -0,0 +1,31 @@ +%D \module +%D [ file= s-abbreviations-smallcaps, % was: s-abr-02 +%D version=1996.01.01, +%D title=\CONTEXT\ Style File, +%D subtitle=General Abbreviations Smallcaps, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\unprotect + +\setupsorting + [logo] + [\c!style=\v!smallcaps] + +\setupcapitals + [\c!title=\v!no] + +\protect + +\startmodule[abbreviations-smallcaps] + +\usemodule[abbreviations-logos] +\usemodule[abbreviations-extras] + +\stopmodule + diff --git a/tex/context/modules/common/s-abr-03.tex b/tex/context/modules/common/s-abbreviations-words.mkiv index 8247b68a9..2b7d7cedc 100644 --- a/tex/context/modules/common/s-abr-03.tex +++ b/tex/context/modules/common/s-abbreviations-words.mkiv @@ -1,8 +1,8 @@ %D \module -%D [ file=s-abr-03, +%D [ file= s-abbreviations-words, % was: s-abr-32 %D version=1998.08.10, %D title=\CONTEXT\ Style File, -%D subtitle=General Abbreviations 3, +%D subtitle=General Abbreviations Words, %D author=Hans Hagen, %D date=\currentdate, %D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] @@ -11,12 +11,18 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\usemodule[abr-01] - \unprotect -\setupsorting[logo][\c!style=\v!WORD] +\setupsorting + [logo] + [\c!style=\v!WORD] \protect -\endinput +\startmodule[abbreviations-words] + +\usemodule[abbreviations-logos] +\usemodule[abbreviations-extras] + +\stopmodule + diff --git a/tex/context/modules/common/s-mod.ctx b/tex/context/modules/common/s-mod.ctx index 09ecf714c..0560c6cfb 100644 --- a/tex/context/modules/common/s-mod.ctx +++ b/tex/context/modules/common/s-mod.ctx @@ -17,7 +17,7 @@ </ctx:flags> <ctx:process> <ctx:resources> - <ctx:module>mod-01</ctx:module> + <ctx:module>module-basic</ctx:module> </ctx:resources> </ctx:process> </ctx:job> diff --git a/tex/context/modules/mkii/m-streams.mkii b/tex/context/modules/mkii/m-streams.mkii index a8589a89c..67ece4f66 100644 --- a/tex/context/modules/mkii/m-streams.mkii +++ b/tex/context/modules/mkii/m-streams.mkii @@ -1,3 +1,5 @@ +% engine=pdftex + %D \module %D [ file=m-streams, %D version=2006.03.21, diff --git a/tex/context/modules/mkiv/s-mod-00.mkiv b/tex/context/modules/mkii/s-abr-01.mkii index 7af56dc2d..6e147a701 100644 --- a/tex/context/modules/mkiv/s-mod-00.mkiv +++ b/tex/context/modules/mkii/s-abr-01.mkii @@ -1,8 +1,8 @@ %D \module -%D [ file=s-mod-00, -%D version=very-old, +%D [ file=s-abr-01, +%D version=1996.01.01, %D title=\CONTEXT\ Style File, -%D subtitle=Documentation Base Environment, +%D subtitle=General Abbreviations 1, %D author=Hans Hagen, %D date=\currentdate, %D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] @@ -13,12 +13,18 @@ \unprotect -\startmode[nocode] +\setupsorting + [logo] + [\c!style=\v!capital] - % \definieerbuffer[definition] % ignore +\setupcapitals + [\c!title=\v!no] - \def\startdefinition#1\stopdefinition{} +\protect -\stopmode +\startmodule[abr-01] -\protect \endinput +\usemodule[abbreviations-logos] +\usemodule[abbreviations-extras] + +\stopmodule diff --git a/tex/context/modules/common/s-abr-02.tex b/tex/context/modules/mkii/s-abr-02.mkii index 8bb6a2898..bf3265073 100644 --- a/tex/context/modules/common/s-abr-02.tex +++ b/tex/context/modules/mkii/s-abr-02.mkii @@ -11,12 +11,21 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\usemodule[abr-01] - \unprotect -\setupsorting[logo][\c!style=\v!smallcaps] +\setupsorting + [logo] + [\c!style=\v!smallcaps] + +\setupcapitals + [\c!title=\v!no] + +\protect + +\startmodule[abr-02] + +\usemodule[abbreviations-logos] +\usemodule[abbreviations-extras] -\setupcapitals[\c!title=\v!no] +\stopmodule -\protect \endinput diff --git a/tex/context/modules/mkiv/m-barcodes.mkiv b/tex/context/modules/mkiv/m-barcodes.mkiv index e4c43b376..84f093c56 100644 --- a/tex/context/modules/mkiv/m-barcodes.mkiv +++ b/tex/context/modules/mkiv/m-barcodes.mkiv @@ -13,6 +13,15 @@ \writestatus{barcodes}{the 'zint' module is a better choice} +\usemodule[zint] + +\let\normalbarcode\barcode + +\unexpanded\def\barcode[#1]% + {\normalbarcode[\c!text=\dummyparameter\c!code,\c!alternative=\dummyparameter\c!type,#1]} + +\iffalse + % \startTEXpage % \startPSTRICKS % \pspicture(-4mm,-1mm)(38mm,26mm) @@ -112,6 +121,8 @@ end \directsetup{barcode:\getvariable{barcode}{type}}% \egroup} +\fi + \continueifinputfile{m-barcodes.mkiv} \starttext diff --git a/tex/context/modules/mkiv/m-chart.lua b/tex/context/modules/mkiv/m-chart.lua index 5a9311387..bcf80bdfc 100644 --- a/tex/context/modules/mkiv/m-chart.lua +++ b/tex/context/modules/mkiv/m-chart.lua @@ -16,14 +16,22 @@ local type, tonumber, rawget, next = type, tonumber, rawget, next local gsub, find, lower = string.gsub, string.find, string.lower local P, S, C, Cc, lpegmatch = lpeg.P, lpeg.S, lpeg.C, lpeg.Cc, lpeg.match +local context = context + +local ctx_startgraphic = metapost.startgraphic +local ctx_stopgraphic = metapost.stopgraphic +local ctx_tographic = metapost.tographic + local formatters = string.formatters local setmetatableindex = table.setmetatableindex +local settings_to_hash = utilities.parsers.settings_to_hash moduledata.charts = moduledata.charts or { } local report_chart = logs.reporter("chart") local variables = interfaces.variables +local implement = interfaces.implement local v_yes = variables.yes local v_no = variables.no @@ -171,22 +179,29 @@ local charts = { } local data, hash, temp, last_x, last_y, name -function commands.flow_start_chart(chartname) - data = { } - hash = { } - last_x, last_y = 0, 0 - name = chartname -end +implement { + name = "flow_start_chart", + arguments = "string", + actions = function(chartname) + data = { } + hash = { } + last_x, last_y = 0, 0 + name = chartname + end +} -function commands.flow_stop_chart() - charts[name] = { - data = data, - hash = hash, - last_x = last_x, - last_y = last_y, - } - data, hash, temp = nil, nil, nil -end +implement { + name = "flow_stop_chart", + actions = function() + charts[name] = { + data = data, + hash = hash, + last_x = last_x, + last_y = last_y, + } + data, hash, temp = nil, nil, nil + end +} -- function commands.flow_set(chartname,chartdata) -- local hash = { } @@ -214,103 +229,187 @@ end -- end -- end -function commands.flow_reset(chartname) - charts[name] = nil -end +implement { + name = "flow_reset", + actions = function() + charts[name] = nil + end +} -function commands.flow_set_current_cell(n) - temp = data[tonumber(n)] or { } -end +implement { + name = "flow_set_current_cell", + arguments = "integer", + actions = function(n) + temp = data[n] or { } + end +} -function commands.flow_start_cell(settings) - temp = { - texts = { }, - labels = { }, - exits = { }, - connections = { }, - settings = settings, - x = 1, - y = 1, - realx = 1, - realy = 1, - name = "", - } -end +implement { + name = "flow_start_cell", + arguments = { + { + { "shape", { + { "rulethickness", "dimension" }, + { "default" }, + { "framecolor" }, + { "backgroundcolor" }, + }, + }, + { "focus", { + { "rulethickness", "dimension" }, + { "framecolor" }, + { "backgroundcolor" }, + }, + }, + { "line", { + { "rulethickness", "dimension" }, + { "radius", "dimension" }, + { "color" }, + { "corner" }, + { "dash" }, + { "arrow" }, + { "offset", "dimension" }, + }, + }, + }, + }, + actions = function(settings) + temp = { + texts = { }, + labels = { }, + exits = { }, + connections = { }, + settings = settings, + x = 1, + y = 1, + realx = 1, + realy = 1, + name = "", + } + end +} -function commands.flow_stop_cell() - data[#data+1] = temp - hash[temp.name or #data] = temp -end +implement { + name = "flow_stop_cell", + actions = function() + data[#data+1] = temp + hash[temp.name or #data] = temp + end +} -function commands.flow_set_name(str) - temp.name = str -end +implement { + name = "flow_set_name", + arguments = "string", + actions = function(str) + temp.name = str + end +} -function commands.flow_set_shape(str) - temp.shape = str -end +implement { + name = "flow_set_shape", + arguments = "string", + actions = function(str) + temp.shape = str + end +} -function commands.flow_set_destination(str) - temp.destination = str -end +implement { + name = "flow_set_destination", + arguments = "string", + actions = function(str) + temp.destination = str + end +} -function commands.flow_set_text(align,str) - temp.texts[#temp.texts+1] = { - align = align, - text = str, - } -end +implement { + name = "flow_set_text", + arguments = { "string", "string" }, + actions = function(align,str) + temp.texts[#temp.texts+1] = { + align = align, + text = str, + } + end +} -function commands.flow_set_overlay(str) - temp.overlay = str -end +implement { + name = "flow_set_overlay", + arguments = "string", + actions = function(str) + temp.overlay = str + end +} -function commands.flow_set_focus(str) - temp.focus = str -end +implement { + name = "flow_set_focus", + arguments = "string", + actions = function(str) + temp.focus = str + end +} -function commands.flow_set_figure(str) - temp.figure = str -end +implement { + name = "flow_set_figure", + arguments = "string", + actions = function(str) + temp.figure = str + end +} -function commands.flow_set_label(location,text) - temp.labels[#temp.labels+1] = { - location = location, - text = text, - } -end +implement { + name = "flow_set_label", + arguments = { "string", "string" }, + actions = function(location,text) + temp.labels[#temp.labels+1] = { + location = location, + text = text, + } + end +} -function commands.flow_set_comment(location,text) - local connections = temp.connections - if connections then - local connection = connections[#connections] - if connection then - local comments = connection.comments - if comments then - comments[#comments+1] = { - location = location, - text = text, - } +implement { + name = "flow_set_comment", + arguments = { "string", "string" }, + actions = function(location,text) + local connections = temp.connections + if connections then + local connection = connections[#connections] + if connection then + local comments = connection.comments + if comments then + comments[#comments+1] = { + location = location, + text = text, + } + end end end end -end +} -function commands.flow_set_exit(location,text) - temp.exits[#temp.exits+1] = { - location = location, - text = text, - } -end +implement { + name = "flow_set_exit", + arguments = { "string", "string" }, + actions = function(location,text) + temp.exits[#temp.exits+1] = { + location = location, + text = text, + } + end +} -function commands.flow_set_include(name,x,y,settings) - data[#data+1] = { - include = name, - x = x, - y = y, - -- settings = settings, - } -end +implement { + name = "flow_set_include", + arguments = { "string", "integer", "integer", "string" }, + actions = function(name,x,y,settings) + data[#data+1] = { + include = name, + x = x, + y = y, + -- settings = settings, + } + end +} local function inject(includedata,data,hash) local subchart = charts[includedata.include] @@ -429,66 +528,74 @@ end local splitter = lpeg.splitat(",") -function commands.flow_set_location(x,y) - if type(x) == "string" and not y then - x, y = lpegmatch(splitter,x) - end - local oldx, oldy = x, y - if not x or x == "" then - x = last_x - elseif type(x) == "number" then - -- ok - elseif x == "+" then - x = last_x + 1 - elseif x == "-" then - x = last_x - 1 - elseif find(x,"^[%+%-]") then - x = last_x + (tonumber(x) or 0) - else - x = tonumber(x) - end - if not y or y == "" then - y = last_y - elseif type(y) == "number" then - -- ok - elseif y == "+" then - y = last_y + 1 - elseif x == "-" then - y = last_y - 1 - elseif find(y,"^[%+%-]") then - y = last_y + (tonumber(y) or 0) - else - y = tonumber(y) - end - if x < 1 or y < 1 then - report_chart("the cell (%s,%s) ends up at (%s,%s) and gets relocated to (1,1)",oldx or"?", oldy or "?", x,y) - if x < 1 then - x = 1 +implement { + name = "flow_set_location", + arguments = "string", + actions = function(x,y) + if type(x) == "string" and not y then + x, y = lpegmatch(splitter,x) + end + local oldx, oldy = x, y + if not x or x == "" then + x = last_x + elseif type(x) == "number" then + -- ok + elseif x == "+" then + x = last_x + 1 + elseif x == "-" then + x = last_x - 1 + elseif find(x,"^[%+%-]") then + x = last_x + (tonumber(x) or 0) + else + x = tonumber(x) end - if y < 1 then - y = 1 + if not y or y == "" then + y = last_y + elseif type(y) == "number" then + -- ok + elseif y == "+" then + y = last_y + 1 + elseif x == "-" then + y = last_y - 1 + elseif find(y,"^[%+%-]") then + y = last_y + (tonumber(y) or 0) + else + y = tonumber(y) + end + if x < 1 or y < 1 then + report_chart("the cell (%s,%s) ends up at (%s,%s) and gets relocated to (1,1)",oldx or"?", oldy or "?", x,y) + if x < 1 then + x = 1 + end + if y < 1 then + y = 1 + end end + temp.x = x or 1 + temp.y = y or 1 + temp.realx = x or 1 + temp.realy = y or 1 + last_x = x or last_x + last_y = y or last_y end - temp.x = x or 1 - temp.y = y or 1 - temp.realx = x or 1 - temp.realy = y or 1 - last_x = x or last_x - last_y = y or last_y -end +} -function commands.flow_set_connection(location,displacement,name) - local dx, dy = lpegmatch(splitter,displacement) - dx = tonumber(dx) - dy = tonumber(dy) - temp.connections[#temp.connections+1] = { - location = location, - dx = dx or 0, - dy = dy or 0, - name = name, - comments = { }, - } -end +implement { + name = "flow_set_connection", + arguments = { "string", "string", "string" }, + actions = function(location,displacement,name) + local dx, dy = lpegmatch(splitter,displacement) + dx = tonumber(dx) + dy = tonumber(dy) + temp.connections[#temp.connections+1] = { + location = location, + dx = dx or 0, + dy = dy or 0, + name = name, + comments = { }, + } + end +} local function visible(chart,cell) local x, y = cell.x, cell.y @@ -497,12 +604,12 @@ local function visible(chart,cell) y >= chart.from_y and y <= chart.to_y and cell end -local function process_cells(chart,xoffset,yoffset) +local function process_cells(g,chart,xoffset,yoffset) local data = chart.data if not data then return end - local focus = utilities.parsers.settings_to_hash(chart.settings.chart.focus or "") + local focus = settings_to_hash(chart.settings.chart.focus or "") for i=1,#data do local cell = visible(chart,data[i]) if cell then @@ -514,26 +621,26 @@ local function process_cells(chart,xoffset,yoffset) end if shape ~= v_none then local shapedata = validshapes[shape] - context("flow_begin_sub_chart ;") -- when is this needed + ctx_tographic(g,"flow_begin_sub_chart ;") -- when is this needed if shapedata.kind == "line" then local linesettings = settings.line - context("flow_shape_line_color := \\MPcolor{%s} ;", linesettings.color) - context("flow_shape_fill_color := black ;") - context("flow_shape_line_width := %p ; ", linesettings.rulethickness) + ctx_tographic(g,"flow_shape_line_color := %q ;", linesettings.color) + ctx_tographic(g,"flow_shape_fill_color := %q ;","black") + ctx_tographic(g,"flow_shape_line_width := %p ; ",linesettings.rulethickness) elseif focus[cell.focus] or focus[cell.name] then local focussettings = settings.focus - context("flow_shape_line_color := \\MPcolor{%s} ;", focussettings.framecolor) - context("flow_shape_fill_color := \\MPcolor{%s} ;", focussettings.backgroundcolor) - context("flow_shape_line_width := %p ; ", focussettings.rulethickness) + ctx_tographic(g,"flow_shape_line_color := %q ;", focussettings.framecolor) + ctx_tographic(g,"flow_shape_fill_color := %q ;", focussettings.backgroundcolor) + ctx_tographic(g,"flow_shape_line_width := %p ; ",focussettings.rulethickness) else local shapesettings = settings.shape - context("flow_shape_line_color := \\MPcolor{%s} ;", shapesettings.framecolor) - context("flow_shape_fill_color := \\MPcolor{%s} ;", shapesettings.backgroundcolor) - context("flow_shape_line_width := %p ; " , shapesettings.rulethickness) + ctx_tographic(g,"flow_shape_line_color := %q ;", shapesettings.framecolor) + ctx_tographic(g,"flow_shape_fill_color := %q ;", shapesettings.backgroundcolor) + ctx_tographic(g,"flow_shape_line_width := %p ; ",shapesettings.rulethickness) end - context("flow_peepshape := false ;") -- todo - context("flow_new_shape(%s,%s,%s) ;",cell.x+xoffset,cell.y+yoffset,shapedata.number) - context("flow_end_sub_chart ;") + ctx_tographic(g,"flow_peepshape := false ;") -- todo + ctx_tographic(g,"flow_new_shape(%s,%s,%s) ;",cell.x+xoffset,cell.y+yoffset,shapedata.number) + ctx_tographic(g,"flow_end_sub_chart ;") end end end @@ -572,7 +679,7 @@ local what = space -- print(lpegmatch(what,"+l")) -- print(lpegmatch(what,"+ left+r ")) -local function process_connections(chart,xoffset,yoffset) +local function process_connections(g,chart,xoffset,yoffset) local data = chart.data local hash = chart.hash if not data then @@ -581,7 +688,6 @@ local function process_connections(chart,xoffset,yoffset) local settings = chart.settings for i=1,#data do local cell = visible(chart,data[i]) --- local cell = data[i] if cell then local connections = cell.connections for j=1,#connections do @@ -595,15 +701,15 @@ local function process_connections(chart,xoffset,yoffset) local what_cell, where_cell, what_other, where_other = lpegmatch(what,location) if what_cell and where_cell and what_other and where_other then local linesettings = settings.line - context("flow_smooth := %s ;", linesettings.corner == v_round and "true" or "false") - context("flow_dashline := %s ;", linesettings.dash == v_yes and "true" or "false") - context("flow_arrowtip := %s ;", linesettings.arrow == v_yes and "true" or "false") - context("flow_touchshape := %s ;", linesettings.offset == v_none and "true" or "false") - context("flow_dsp_x := %s ; flow_dsp_y := %s ;",connection.dx or 0, connection.dy or 0) - context("flow_connection_line_color := \\MPcolor{%s} ;",linesettings.color) - context("flow_connection_line_width := %p ;",linesettings.rulethickness) - context("flow_connect_%s_%s (%s) (%s,%s,%s) (%s,%s,%s) ;",where_cell,where_other,j,cellx,celly,what_cell,otherx,othery,what_other) - context("flow_dsp_x := 0 ; flow_dsp_y := 0 ;") + ctx_tographic(g,"flow_smooth := %s ;", linesettings.corner == v_round and "true" or "false") + ctx_tographic(g,"flow_dashline := %s ;", linesettings.dash == v_yes and "true" or "false") + ctx_tographic(g,"flow_arrowtip := %s ;", linesettings.arrow == v_yes and "true" or "false") + ctx_tographic(g,"flow_touchshape := %s ;", linesettings.offset == v_none and "true" or "false") + ctx_tographic(g,"flow_dsp_x := %s ; flow_dsp_y := %s ;",connection.dx or 0, connection.dy or 0) + ctx_tographic(g,"flow_connection_line_color := %q ;",linesettings.color) + ctx_tographic(g,"flow_connection_line_width := %p ;",linesettings.rulethickness) + ctx_tographic(g,"flow_connect_%s_%s (%s) (%s,%s,%s) (%s,%s,%s) ;",where_cell,where_other,j,cellx,celly,what_cell,otherx,othery,what_other) + ctx_tographic(g,"flow_dsp_x := 0 ; flow_dsp_y := 0 ;") end end end @@ -618,13 +724,17 @@ local f_texttemplate_l = formatters["\\doFLOWlabel{%i}{%i}{%i}"] local splitter = lpeg.splitat(":") local charttexts = { } -- permits " etc in mp -function commands.flow_get_text(n) - if n > 0 then - context(charttexts[n]) +implement { + name = "flow_get_text", + arguments = "integer", + actions = function(n) + if n > 0 then + context(charttexts[n]) + end end -end +} -local function process_texts(chart,xoffset,yoffset) +local function process_texts(g,chart,xoffset,yoffset) local data = chart.data local hash = chart.hash if not data then @@ -648,7 +758,7 @@ local function process_texts(chart,xoffset,yoffset) local align = text.align or "" local align = validlabellocations[align] or align charttexts[#charttexts+1] = data - context('flow_chart_draw_text(%s,%s,textext("%s")) ;',x,y,f_texttemplate_t(x,y,#charttexts,align,figure,overlay,destination)) + ctx_tographic(g,'flow_chart_draw_text(%s,%s,textext("%s")) ;',x,y,f_texttemplate_t(x,y,#charttexts,align,figure,overlay,destination)) if i == 1 then figure = "" overlay = "" @@ -656,7 +766,7 @@ local function process_texts(chart,xoffset,yoffset) end end elseif figure ~= "" or overlay ~= "" or destination ~= "" then - context('flow_chart_draw_text(%s,%s,textext("%s")) ;',x,y,f_texttemplate_t(x,y,0,"",figure,overlay,destination)) + ctx_tographic(g,'flow_chart_draw_text(%s,%s,textext("%s")) ;',x,y,f_texttemplate_t(x,y,0,"",figure,overlay,destination)) end local labels = cell.labels for i=1,#labels do @@ -666,7 +776,7 @@ local function process_texts(chart,xoffset,yoffset) local location = validlabellocations[location] or location if text and text ~= "" then charttexts[#charttexts+1] = text - context('flow_chart_draw_label(%s,%s,"%s",textext("%s")) ;',x,y,location,f_texttemplate_l(x,y,#charttexts)) + ctx_tographic(g,'flow_chart_draw_label(%s,%s,"%s",textext("%s")) ;',x,y,location,f_texttemplate_l(x,y,#charttexts)) end end local exits = cell.exits @@ -682,7 +792,7 @@ local function process_texts(chart,xoffset,yoffset) location == "t" and y == chart.to_y - 1 or location == "b" and y == chart.from_y + 1 then charttexts[#charttexts+1] = text - context('flow_chart_draw_exit(%s,%s,"%s",textext("%s")) ;',x,y,location,f_texttemplate_l(x,y,#charttexts)) + ctx_tographic(g,'flow_chart_draw_exit(%s,%s,"%s",textext("%s")) ;',x,y,location,f_texttemplate_l(x,y,#charttexts)) end end end @@ -711,7 +821,7 @@ local function process_texts(chart,xoffset,yoffset) end if text and text ~= "" then charttexts[#charttexts+1] = text - context('flow_chart_draw_comment(%s,%s,%s,"%s",%s,textext("%s")) ;',x,y,i,location,length,f_texttemplate_l(x,y,#charttexts)) + ctx_tographic(g,'flow_chart_draw_comment(%s,%s,%s,"%s",%s,textext("%s")) ;',x,y,i,location,length,f_texttemplate_l(x,y,#charttexts)) end end end @@ -738,7 +848,7 @@ local function getchart(settings,forced_x,forced_y,forced_nx,forced_ny) local chartsettings = chart.settings.chart local autofocus = chart.settings.chart.autofocus if autofocus then - autofocus = utilities.parsers.settings_to_hash(autofocus) + autofocus = settings_to_hash(autofocus) if not next(autofocus) then autofocus = false end @@ -762,17 +872,15 @@ local function getchart(settings,forced_x,forced_y,forced_nx,forced_ny) if miny == 0 or y > maxy then maxy = y end end end --- optional: -if x + nx > maxx then - nx = maxx - x + 1 -end -if y + ny > maxy then - ny = maxy - y + 1 -end + -- optional: + if x + nx > maxx then + nx = maxx - x + 1 + end + if y + ny > maxy then + ny = maxy - y + 1 + end -- - -- print("1>",x,y,nx,ny) - -- print("2>",minx, miny, maxx, maxy) - -- check of window should be larger (maybe autofocus + nx/ny?) + -- check if window should be larger (maybe autofocus + nx/ny?) if autofocus then -- x and y are ignored if nx and nx > 0 then @@ -825,21 +933,27 @@ local function makechart(chart) context.begingroup() context.forgetall() -- - context.startMPcode() - context("if unknown context_flow : input mp-char.mpiv ; fi ;") - context("flow_begin_chart(0,%s,%s);",chart.nx,chart.ny) + local g = ctx_startgraphic { + instance = "metafun", + format = "metafun", + method = "scaled", + definitions = "", + } + -- + ctx_tographic(g,"if unknown context_flow : input mp-char.mpiv ; fi ;") + ctx_tographic(g,"flow_begin_chart(0,%s,%s);",chart.nx,chart.ny) -- if chartsettings.option == v_test or chartsettings.dot == v_yes then - context("flow_show_con_points := true ;") - context("flow_show_mid_points := true ;") - context("flow_show_all_points := true ;") + ctx_tographic(g,"flow_show_con_points := true ;") + ctx_tographic(g,"flow_show_mid_points := true ;") + ctx_tographic(g,"flow_show_all_points := true ;") elseif chartsettings.dot ~= "" then -- no checking done, private option - context("flow_show_%s_points := true ;",chartsettings.dot) + ctx_tographic(g,"flow_show_%s_points := true ;",chartsettings.dot) end -- local backgroundcolor = chartsettings.backgroundcolor if backgroundcolor and backgroundcolor ~= "" then - context("flow_chart_background_color := \\MPcolor{%s} ;",backgroundcolor) + ctx_tographic(g,"flow_chart_background_color := %q ;",backgroundcolor) end -- local shapewidth = chartsettings.width @@ -850,14 +964,14 @@ local function makechart(chart) local labeloffset = chartsettings.labeloffset local exitoffset = chartsettings.exitoffset local commentoffset = chartsettings.commentoffset - context("flow_grid_width := %p ;", gridwidth) - context("flow_grid_height := %p ;", gridheight) - context("flow_shape_width := %p ;", shapewidth) - context("flow_shape_height := %p ;", shapeheight) - context("flow_chart_offset := %p ;", chartoffset) - context("flow_label_offset := %p ;", labeloffset) - context("flow_exit_offset := %p ;", exitoffset) - context("flow_comment_offset := %p ;", commentoffset) + ctx_tographic(g,"flow_grid_width := %p ;", gridwidth) + ctx_tographic(g,"flow_grid_height := %p ;", gridheight) + ctx_tographic(g,"flow_shape_width := %p ;", shapewidth) + ctx_tographic(g,"flow_shape_height := %p ;", shapeheight) + ctx_tographic(g,"flow_chart_offset := %p ;", chartoffset) + ctx_tographic(g,"flow_label_offset := %p ;", labeloffset) + ctx_tographic(g,"flow_exit_offset := %p ;", exitoffset) + ctx_tographic(g,"flow_comment_offset := %p ;", commentoffset) -- local radius = settings.line.radius local rulethickness = settings.line.rulethickness @@ -872,10 +986,10 @@ local function makechart(chart) radius = dy end end - context("flow_connection_line_width := %p ;", rulethickness) - context("flow_connection_smooth_size := %p ;", radius) - context("flow_connection_arrow_size := %p ;", radius) - context("flow_connection_dash_size := %p ;", radius) + ctx_tographic(g,"flow_connection_line_width := %p ;", rulethickness) + ctx_tographic(g,"flow_connection_smooth_size := %p ;", radius) + ctx_tographic(g,"flow_connection_arrow_size := %p ;", radius) + ctx_tographic(g,"flow_connection_dash_size := %p ;", radius) -- local offset = chartsettings.offset -- todo: pass string if offset == v_none or offset == v_overlay or offset == "" then @@ -883,18 +997,21 @@ local function makechart(chart) elseif offset == v_standard then offset = radius -- or rulethickness? end - context("flow_chart_offset := %p ;",offset) + ctx_tographic(g,"flow_chart_offset := %p ;",offset) -- - context("flow_reverse_y := true ;") + ctx_tographic(g,"flow_reverse_y := true ;") if chartsettings.option == v_test then - context("flow_draw_test_shapes ;") - end - process_cells(chart,0,0) - process_connections(chart,0,0) - process_texts(chart,0,0) - -- context("clip_chart(%s,%s,%s,%s) ;",x,y,nx,ny) -- todo: draw lines but not shapes - context("flow_end_chart ;") - context.stopMPcode() + ctx_tographic(g,"flow_draw_test_shapes ;") + end + -- + process_cells(g,chart,0,0) + process_connections(g,chart,0,0) + process_texts(g,chart,0,0) + -- + -- ctx_tographic(g,"clip_chart(%s,%s,%s,%s) ;",x,y,nx,ny) -- todo: draw lines but not shapes + ctx_tographic(g,"flow_end_chart ;") + ctx_stopgraphic(g) + -- context.endgroup() end @@ -979,19 +1096,86 @@ local function splitchart(chart) end end -function commands.flow_make_chart(settings) - local chart = getchart(settings) - if chart then - local settings = chart.settings - if settings then - local chartsettings = settings.chart - if chartsettings and chartsettings.split == v_yes then - splitchart(chart) +implement { + name = "flow_make_chart", + arguments = { + { + { "chart", { + { "name" }, + { "option" }, + { "backgroundcolor" }, + { "width", "dimension" }, + { "height", "dimension" }, + { "dx", "dimension" }, + { "dy", "dimension" }, + { "offset", "dimension" }, + -- { "bodyfont" }, + { "dot" }, + { "hcompact" }, + { "vcompact" }, + { "focus" }, + { "autofocus" }, + { "nx", "integer" }, + { "ny", "integer" }, + { "x", "integer" }, + { "y", "integer" }, + { "labeloffset", "dimension" }, + { "commentoffset", "dimension" }, + { "exitoffset", "dimension" }, + { "split" }, + }, + }, + { "shape", { + { "rulethickness", "dimension" }, + { "default" }, + { "framecolor" }, + { "backgroundcolor" }, + }, + }, + { "focus", { + { "rulethickness", "dimension" }, + { "framecolor" }, + { "backgroundcolor" }, + }, + }, + { "line", { + { "rulethickness", "dimension" }, + { "radius", "dimension" }, + { "color" }, + { "corner" }, + { "dash" }, + { "arrow" }, + { "offset" }, + }, + }, + { "split", { + { "nx", "integer" }, + { "ny", "integer" }, + { "dx", "integer" }, + { "dy", "integer" }, + { "command" }, + { "marking" }, + { "before" }, + { "after" }, + }, + }, + -- { "set" }, + } + }, + actions = function(settings) + local chart = getchart(settings) + if chart then + local settings = chart.settings + if settings then + local chartsettings = settings.chart + if chartsettings and chartsettings.split == v_yes then + splitchart(chart) + else + makechart(chart) + end else makechart(chart) end - else - makechart(chart) end end -end +} diff --git a/tex/context/modules/mkiv/m-chart.mkvi b/tex/context/modules/mkiv/m-chart.mkvi index 69d90f47b..0463e4acd 100644 --- a/tex/context/modules/mkiv/m-chart.mkvi +++ b/tex/context/modules/mkiv/m-chart.mkvi @@ -29,12 +29,12 @@ % todo: figure out a nice way to define the lot: share current and % support current as name (nb: we need to set parent then) -\installcorenamespace {flowchart} % \def\??flch{@@flch} % chart -\installcorenamespace {flowline} % \def\??flln{@@flln} % line -\installcorenamespace {flowshape} % \def\??flsh{@@flsh} % shape -\installcorenamespace {flowfocus} % \def\??flfc{@@flfc} % focus -\installcorenamespace {flowsets} % \def\??flst{@@flst} % sets -\installcorenamespace {flowsplit} % \def\??flsp{@@flsp} % split +\installcorenamespace {flowchart} % chart +\installcorenamespace {flowline} % line +\installcorenamespace {flowshape} % shape +\installcorenamespace {flowfocus} % focus +\installcorenamespace {flowsets} % sets +\installcorenamespace {flowsplit} % split \installsimplecommandhandler \??flowchart {FLOWchart} \??flowchart % maybe just a setuphandler \installsimplecommandhandler \??flowline {FLOWline} \??flowline % maybe just a setuphandler @@ -118,7 +118,7 @@ \newtoks\everyFLOWchart \unexpanded\def\module_charts_process[#name]% - {\ctxcommand{flow_start_chart("#name")}} + {\clf_flow_start_chart{#name}} \unexpanded\def\startFLOWchart {\startnointerference @@ -126,10 +126,10 @@ \dosingleempty\module_charts_start_chart} \unexpanded\def\module_charts_start_chart[#name]% - {\ctxcommand{flow_start_chart("#name")}} + {\clf_flow_start_chart{#name}} \unexpanded\def\stopFLOWchart - {\ctxcommand{flow_stop_chart()}% + {\clf_flow_stop_chart \stopnointerference} \unexpanded\def\defineFLOWchart % for old times sake @@ -138,9 +138,9 @@ \unexpanded\def\module_charts_FLOW_define[#name][#settings]#cells% todo: save settings {\startnointerference \the\everyFLOWchart - \ctxcommand{flow_start_chart("#name")}% + \clf_flow_start_chart{#name}% #cells% - \ctxcommand{flow_stop_chart()}% + \clf_flow_stop_chart \stopnointerference} \unexpanded\def\startFLOWcell @@ -154,32 +154,32 @@ \ifsecondargument \setupFLOWline[#2]% \fi - \ctxcommand{flow_start_cell { - shape = { - rulethickness = \number\dimexpr\FLOWshapeparameter\c!rulethickness, - default = "\FLOWshapeparameter\c!default", - framecolor = "\FLOWshapeparameter\c!framecolor", - backgroundcolor = "\FLOWshapeparameter\c!backgroundcolor", - }, - focus = { - rulethickness = \number\dimexpr\FLOWfocusparameter\c!rulethickness, - framecolor = "\FLOWfocusparameter\c!framecolor", - backgroundcolor = "\FLOWfocusparameter\c!backgroundcolor", - }, - line = { - rulethickness = \number\dimexpr\FLOWlineparameter\c!rulethickness, - radius = \number\dimexpr\FLOWlineparameter\c!radius, - color = "\FLOWlineparameter\c!color", - corner = "\FLOWlineparameter\c!corner", - dash = "\FLOWlineparameter\c!dash", - arrow = "\FLOWlineparameter\c!arrow", - offset = \number\dimexpr\FLOWlineparameter\c!offset, - }, - } }% + \clf_flow_start_cell + shape { + rulethickness \dimexpr\FLOWshapeparameter\c!rulethickness\relax + default {\FLOWshapeparameter\c!default} + framecolor {\FLOWshapeparameter\c!framecolor} + backgroundcolor {\FLOWshapeparameter\c!backgroundcolor} + } + focus { + rulethickness \dimexpr\FLOWfocusparameter\c!rulethickness\relax + framecolor {\FLOWfocusparameter\c!framecolor} + backgroundcolor {\FLOWfocusparameter\c!backgroundcolor} + } + line { + rulethickness \dimexpr\FLOWlineparameter\c!rulethickness\relax + radius \dimexpr\FLOWlineparameter\c!radius\relax + color {\FLOWlineparameter\c!color} + corner {\FLOWlineparameter\c!corner} + dash {\FLOWlineparameter\c!dash} + arrow {\FLOWlineparameter\c!arrow} + offset \dimexpr\FLOWlineparameter\c!offset\relax + } + \relax \endgroup} \unexpanded\def\stopFLOWcell - {\ctxcommand{flow_stop_cell()}} + {\clf_flow_stop_cell} \unexpanded\def\FLOWchart {\dodoubleempty\module_charts_process} @@ -190,64 +190,64 @@ \dontcomplain \setupFLOWchart[#settings]% \usebodyfontparameter\FLOWchartparameter - \ctxcommand{flow_make_chart { - chart = { - name = "#name", - option = "\FLOWchartparameter\c!option", - backgroundcolor = "\FLOWchartparameter\c!backgroundcolor", - width = \number\dimexpr\FLOWchartparameter\c!width, - height = \number\dimexpr\FLOWchartparameter\c!height, - dx = \number\dimexpr\FLOWchartparameter\c!dx, - dy = \number\dimexpr\FLOWchartparameter\c!dy, - offset = \number\dimexpr\FLOWchartparameter\c!offset, - % bodyfont = "\FLOWchartparameter\c!bodyfont", - dot = "\FLOWchartparameter\c!dot", % private option - hcompact = "\FLOWchartparameter\c!hcompact", % undocumented option - vcompact = "\FLOWchartparameter\c!vcompact", % undocumented option - focus = "\FLOWchartparameter\c!focus", - autofocus = "\FLOWchartparameter\c!autofocus", - nx = "\FLOWchartparameter\c!nx", - ny = "\FLOWchartparameter\c!ny", - x = "\FLOWchartparameter\c!x", - y = "\FLOWchartparameter\c!y", - labeloffset = \number\dimexpr\FLOWchartparameter\c!labeloffset, - commentoffset = \number\dimexpr\FLOWchartparameter\c!commentoffset, - exitoffset = \number\dimexpr\FLOWchartparameter\c!exitoffset, - split = "\FLOWchartparameter\c!split", - }, - shape = { - rulethickness = \number\dimexpr\FLOWshapeparameter\c!rulethickness, - default = "\FLOWshapeparameter\c!default", - framecolor = "\FLOWshapeparameter\c!framecolor", - backgroundcolor = "\FLOWshapeparameter\c!backgroundcolor", - }, - focus = { - rulethickness = \number\dimexpr\FLOWfocusparameter\c!rulethickness, - framecolor = "\FLOWfocusparameter\c!framecolor", - backgroundcolor = "\FLOWfocusparameter\c!backgroundcolor", - }, - line = { - rulethickness = \number\dimexpr\FLOWlineparameter\c!rulethickness, - radius = \number\dimexpr\FLOWlineparameter\c!radius, - color = "\FLOWlineparameter\c!color", - corner = "\FLOWlineparameter\c!corner", - dash = "\FLOWlineparameter\c!dash", - arrow = "\FLOWlineparameter\c!arrow", - offset = "\FLOWlineparameter\c!offset", - }, - set = { - }, - split = { - nx = \number\FLOWsplitparameter\c!nx, - ny = \number\FLOWsplitparameter\c!ny, - dx = \number\FLOWsplitparameter\c!dx, - dy = \number\FLOWsplitparameter\c!dy, - command = "", - marking = "\FLOWsplitparameter\c!marking", - before = "", - after = "", + \clf_flow_make_chart + chart { + name {#name} + option {\FLOWchartparameter\c!option} + backgroundcolor {\FLOWchartparameter\c!backgroundcolor} + width \dimexpr\FLOWchartparameter\c!width\relax + height \dimexpr\FLOWchartparameter\c!height\relax + dx \dimexpr\FLOWchartparameter\c!dx\relax + dy \dimexpr\FLOWchartparameter\c!dy\relax + offset \dimexpr\FLOWchartparameter\c!offset\relax + % bodyfont {\FLOWchartparameter\c!bodyfont} + dot {\FLOWchartparameter\c!dot} % private option + hcompact {\FLOWchartparameter\c!hcompact} % undocumented option + vcompact {\FLOWchartparameter\c!vcompact} % undocumented option + focus {\FLOWchartparameter\c!focus} + autofocus {\FLOWchartparameter\c!autofocus} + nx \numexpr\FLOWchartparameter\c!nx\relax + ny \numexpr\FLOWchartparameter\c!ny\relax + x \numexpr\FLOWchartparameter\c!x\relax + y \numexpr\FLOWchartparameter\c!y\relax + labeloffset \dimexpr\FLOWchartparameter\c!labeloffset\relax + commentoffset \dimexpr\FLOWchartparameter\c!commentoffset\relax + exitoffset \dimexpr\FLOWchartparameter\c!exitoffset\relax + split {\FLOWchartparameter\c!split} + } + shape { + rulethickness \dimexpr\FLOWshapeparameter\c!rulethickness\relax + default {\FLOWshapeparameter\c!default} + framecolor {\FLOWshapeparameter\c!framecolor} + backgroundcolor {\FLOWshapeparameter\c!backgroundcolor} + } + focus { + rulethickness \dimexpr\FLOWfocusparameter\c!rulethickness\relax + framecolor {\FLOWfocusparameter\c!framecolor} + backgroundcolor {\FLOWfocusparameter\c!backgroundcolor} + } + line { + rulethickness \dimexpr\FLOWlineparameter\c!rulethickness\relax + radius \dimexpr\FLOWlineparameter\c!radius\relax + color {\FLOWlineparameter\c!color} + corner {\FLOWlineparameter\c!corner} + dash {\FLOWlineparameter\c!dash} + arrow {\FLOWlineparameter\c!arrow} + offset {\FLOWlineparameter\c!offset} + } + % set { + % } + split { + nx \numexpr\FLOWsplitparameter\c!nx\relax + ny \numexpr\FLOWsplitparameter\c!ny\relax + dx \numexpr\FLOWsplitparameter\c!dx\relax + dy \numexpr\FLOWsplitparameter\c!dy\relax + command {} + marking {\FLOWsplitparameter\c!marking} + before {} + after {} } - } }% + \relax \egroup} \unexpanded\def\FLOWcharts @@ -281,13 +281,13 @@ \let\includeFLOWchart\include \to \everyFLOWchart -\unexpanded\def\FLOW_name #name{\ctxcommand{flow_set_name("#name")}\ignorespaces} -\unexpanded\def\FLOW_shape #shape{\ctxcommand{flow_set_shape("#shape")}\ignorespaces} -\unexpanded\def\FLOW_destination#destination{\ctxcommand{flow_set_destination("#destination")}\ignorespaces} -\unexpanded\def\FLOW_focus #focus{\ctxcommand{flow_set_focus("#focus")}\ignorespaces} -\unexpanded\def\FLOW_overlay #overlay{\ctxcommand{flow_set_overlay("#overlay")}\ignorespaces} -\unexpanded\def\FLOW_location #location{\ctxcommand{flow_set_location("#location")}\ignorespaces} -\unexpanded\def\FLOW_figure #figure{\ctxcommand{flow_set_figure("#figure")}\ignorespaces} +\unexpanded\def\FLOW_name #name{\clf_flow_set_name{#name}\ignorespaces} +\unexpanded\def\FLOW_shape #shape{\clf_flow_set_shape{#shape}\ignorespaces} +\unexpanded\def\FLOW_destination#destination{\clf_flow_set_destination{#destination}\ignorespaces} +\unexpanded\def\FLOW_focus #focus{\clf_flow_set_focus{#focus}\ignorespaces} +\unexpanded\def\FLOW_overlay #overlay{\clf_flow_set_overlay{#overlay}\ignorespaces} +\unexpanded\def\FLOW_location #location{\clf_flow_set_location{#location}\ignorespaces} +\unexpanded\def\FLOW_figure #figure{\clf_flow_set_figure{#figure}\ignorespaces} \unexpanded\def\FLOW_text {\dosingleempty\module_charts_FLOW_text} \unexpanded\def\FLOW_label {\dosingleempty\module_charts_FLOW_label} @@ -296,16 +296,16 @@ \unexpanded\def\FLOW_connection{\dodoubleempty\module_charts_FLOW_connection} \unexpanded\def\FLOW_include {\dodoubleempty\module_charts_FLOW_include} -\unexpanded\def\module_charts_FLOW_text [#align]#text{\ctxcommand{flow_set_text("#align",\!!bs\detokenize{#text}\!!es)}\ignorespaces} -\unexpanded\def\module_charts_FLOW_label [#location]#text{\ctxcommand{flow_set_label("#location",\!!bs\detokenize{#text}\!!es)}\ignorespaces} -\unexpanded\def\module_charts_FLOW_comment [#location]#text{\ctxcommand{flow_set_comment("#location",\!!bs\detokenize{#text}\!!es)}\ignorespaces} -\unexpanded\def\module_charts_FLOW_exit [#location]#text{\ctxcommand{flow_set_exit("#location",\!!bs\detokenize{#text}\!!es)}\ignorespaces} -\unexpanded\def\module_charts_FLOW_connection[#location][#offset]#name{\ctxcommand{flow_set_connection("#location","#offset","#name")}\ignorespaces} +\unexpanded\def\module_charts_FLOW_text [#align]#text{\clf_flow_set_text{#align}{\detokenize{#text}}\ignorespaces} +\unexpanded\def\module_charts_FLOW_label [#location]#text{\clf_flow_set_label{#location}{\detokenize{#text}}\ignorespaces} +\unexpanded\def\module_charts_FLOW_comment [#location]#text{\clf_flow_set_comment{#location}{\detokenize{#text}}\ignorespaces} +\unexpanded\def\module_charts_FLOW_exit [#location]#text{\clf_flow_set_exit{#location}{\detokenize{#text}}\ignorespaces} +\unexpanded\def\module_charts_FLOW_connection[#location][#offset]#name{\clf_flow_set_connection{#location}{#offset}{#name}\ignorespaces} \unexpanded\def\module_charts_FLOW_include [#name][#settings]{% \begingroup - \getparameters[FLOWi][\c!x=1,\c!y=1,#settings]% - \ctxcommand{flow_set_include("#name",\number\FLOWix,\number\FLOWiy,\!!bs\detokenize{#settings}\!!es)}% + \getdummyparameters[\c!x=1,\c!y=1,#settings]% + \clf_flow_set_include{#name}\numexpr\dummyparameter\c!x\relax\numexpr\dummyparameter\c!y\relax{\detokenize{#settings}}% \endgroup \ignorespaces } @@ -382,7 +382,7 @@ \endgroup} \unexpanded\def\getFLOWtext#1% - {\ifcase#1\else\ctxcommand{flow_get_text(#1)}\fi} + {\ifcase#1\else\clf_flow_get_text\numexpr#1\relax\fi} \defineframed % to be discussed: shape or global [flowcell:base] diff --git a/tex/context/modules/mkiv/m-compatible.mkiv b/tex/context/modules/mkiv/m-compatible.mkiv new file mode 100644 index 000000000..0e056180a --- /dev/null +++ b/tex/context/modules/mkiv/m-compatible.mkiv @@ -0,0 +1,63 @@ +%D \module +%D [ file=m-compatibility, +%D version=2018.02.21, +%D title=\CONTEXT\ System Macros, +%D subtitle=ConTeXt Compatibility Layer, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +%D I fear that I will not keep up in this file so feel free to contribute to the +%D following. The idea is nto to load this file but more to have some insight in +%D how to control compatibility (to some extent). + +\writestatus{loading}{ConTeXt Compatibility Layer} + +%D The side float mechanism has been redone and is not space compatible. Hopefully +%D it will become stable soon and after that we will not touch it unless we have a +%D real bug. There might be more control options. The problem is that there are too +%D many combinations of content before and after a side float possible. + +\ifnum\contextversionno<20180101\relax + % nothing here +\fi + +%D Picking up the right last line depth is sort of tricky when we cross a page and +%D have some left|-|over material. The sychronizer is normally not needed but for +%D now turned on by default. + +\ifnum\contextversionno<20180221\relax + \disabledirectives[vspacing.synchronizepage] +\fi + +%D Some day we might default to the following which is a bit more conistent but +%D not compatible. + +% \setdisplaymathspacemodel[4] +% +% \ifnum\contextversionno<20180221\relax +% \setdisplaymathspacemodel[3] +% \fi + +%D Currently this is in \type {cont-loc.mkiv} but some day we might do: + +% \definemixedcolumns +% [\v!columns] +% % compatible with columns default : +% [\c!balance=\v!yes, +% \c!blank={\v!line,\v!fixed}] +% +% \unexpanded\def\setupcolumns +% {\setupmixedcolumns[\v!columns]} + +%D as well as: + +% \input page-cst.mkiv + + + +\endinput diff --git a/tex/context/modules/mkiv/m-cweb.mkiv b/tex/context/modules/mkiv/m-cweb.mkiv index 2546b2342..2bf4e967f 100644 --- a/tex/context/modules/mkiv/m-cweb.mkiv +++ b/tex/context/modules/mkiv/m-cweb.mkiv @@ -11,90 +11,57 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -%D This module has to be redone in the mkiv way. +%D This module has to be redone in the mkiv way and I do that stepwise so the +%D current code is not okay. -%D First some auxiliary stuff, to be moved to system module. - -\def\dodofindfirstcharacter#1% - {\ifx#1\relax - \let\next=\egroup - \else - \handlecase - {\expandafter\ifnum\expandafter\catcode\expandafter`#1=11 - \def\next##1\relax{\egroup\def\firstcharacter{#1}}% - \fi}% - \fi - \next} - -\def\dofindfirstcharacter#1#2% - {\def\firstcharacter{}% - \bgroup - \defconvertedargument\ascii{#2}% - \let\next\dodofindfirstcharacter - \let\handlecase#1% - \expandafter\next\ascii\relax} - -\def\normalcase#1% - {#1} - -\def\findfirstcharacter% - {\dofindfirstcharacter\lowercase} - -\def\FindFirstCharacter% - {\dofindfirstcharacter\normalcase} - -\def\FINDFIRSTCHARACTER% - {\dofindfirstcharacter\uppercase} - -% nog doen: +% todo: % % \deactivateCWEB in output routine % status info -% gelinkte entries +% linked entries % parskip en parindent +% breaks and whitespace +% fonts ... now math abuse down here %D \gdef\CWEBquote#1.{{\em Quote :}\ #1.} % checks the . - -%D This module (re)implements the \CWEB\ macros as defined in -%D the file \type{cwebmac.tex}. %D -%D \CWEB\ uses short, often one character long, names for -%D macros. This is no real problem because no one is supposed -%D to read and understand the files generated by \CWEB. The -%D standard macros are meant for \PLAIN\ \TEX\ users. In -%D \CONTEXT\ and other macro packages however, there is a -%D potential conflict with format specific or user defined -%D commands. Furthermore, the \CWEB\ macros implement their own -%D output routines. When integrating \CWEB\ documents in -%D another environment, the \CWEB\ specific macros have to be -%D made local. The first part of this module is dedicated to -%D this feature. +%D This module (re)implements the \CWEB\ macros as defined in the file \type +%D {cwebmac.tex}. \CWEB\ uses short, often one character long, names for macros. +%D This is no real problem because no one is supposed to read and understand the +%D files generated by \CWEB. The standard macros are meant for \PLAIN\ \TEX\ users. +%D In \CONTEXT\ and other macro packages however, there is a potential conflict with +%D format specific or user defined commands. Furthermore, the \CWEB\ macros +%D implement their own output routines. When integrating \CWEB\ documents in another +%D environment, the \CWEB\ specific macros have to be made local. The first part of +%D this module is dedicated to this feature. %D -%D Instead of using \type{\def} and \type{\let} for defining -%D macros, we use: +%D Instead of using \type {\def} and \type {\let} for defining macros, we use: %D %D \starttyping %D \defCEBmacro arguments {meaning} %D \letCEBmacro arguments {meaning} %D \stoptyping %D -%D \CWEB files contain implicit calls to macros that generate -%D the table of contents, the lists of sections and the index. -%D Because we want to be much more flexible, we implemented our -%D own alternatives, and therefore have to bypass the original -%D ones. The next macro is used for defining these obsolete -%D \CWEB\ macros. The dummies take care of arguments. +%D \CWEB\ files contain implicit calls to macros that generate the table of contents, +%D the lists of sections and the index. Because we want to be much more flexible, we +%D implemented our own alternatives, and therefore have to bypass the original ones. +%D The next macro is used for defining these obsolete \CWEB\ macros. The dummies +%D take care of arguments. %D %D \starttyping %D \defCEBdummy arguments {meaning} %D \stoptyping %D -%D The list of \CWEB\ specific macro names is saved in a -%D \TOKENLIST. This serves two purposes. First it enables us to -%D activate the \CWEB\ macros, which are saved under a -%D different name, second it can be used to temporary restore -%D the meanings, for instance when the output routine builds -%D the page. +%D The list of \CWEB\ specific macro names is saved in a \TOKENLIST. This serves two +%D purposes. First it enables us to activate the \CWEB\ macros, which are saved +%D under a different name, second it can be used to temporary restore the meanings, +%D for instance when the output routine builds the page. +%D +%D We don't provide specific formatting commands. We just assume \CONTEXT\ being +%D used (so you can use all it provides) and|/|or that specific user macros are +%D implemented somewhere else. + +\unprotect \newtoks\CWEBmacros @@ -105,210 +72,149 @@ %D \deactivateCWEB %D \stoptyping %D -%D Which are implemented as: +%D These are implemented as: -\def\activateCWEB% - {\let\doCWEB=\activateCWEBmacro +\unexpanded\def\activateCWEB + {\let\doCWEB\activateCWEBmacro \the\CWEBmacros} -\def\deactivateCWEB% - {\let\doCWEB=\deactivateCWEBmacro +\unexpanded\def\deactivateCWEB + {\let\doCWEB\deactivateCWEBmacro \the\CWEBmacros} -%D The three definition macros append the name of the macro to -%D the list. The first two macros save the meaning, the last one -%D assigns \type{{}} to the macro and gobbles original meaning. +%D The three definition macros append the name of the macro to the list. The first +%D two macros save the meaning, the last one assigns \type {{}} to the macro and +%D gobbles original meaning. + +\installcorenamespace{newCWEB} +\installcorenamespace{oldCWEB} -\long\def\defCWEBmacro#1% +\unexpanded\def\defCWEBmacro#1% {\appendtoks\doCWEB#1\to\CWEBmacros - \setvalue{newCWEB\string#1}} + \setuvalue{\??newCWEB\string#1}} -\long\def\letCWEBmacro#1% +\unexpanded\def\letCWEBmacro#1% {\appendtoks\doCWEB#1\to\CWEBmacros - \letvalue{newCWEB\string#1}} + \letvalue{\??newCWEB\string#1}} -\long\def\defCWEBdummy#1#2#% +\unexpanded\def\defCWEBdummy#1#2#% {\appendtoks\doCWEB#1\to\CWEBmacros - \setvalue{newCWEB\string#1}#2{}% + \setuvalue{\??newCWEB\string#1}#2{}% \gobbleoneargument} -%D The macro \type{\defCWEBdummy} of course takes care of the -%D argument. This leaves the two (de|)|activating macros: +%D The macro \type {\defCWEBdummy} of course takes care of the argument. This leaves +%D the two (de|)|activating macros: -\def\CWEBmacro#1% - {\getvalue{newCWEB\string#1}} +\unexpanded\def\CWEBmacro#1% + {\getvalue{\??newCWEB\string#1}} -\def\activateCWEBmacro#1% - {\letvalue{oldCWEB\string#1}=#1% - \def#1{\CWEBmacro#1}} +\unexpanded\def\activateCWEBmacro#1% + {\letvalue{\??oldCWEB\string#1}=#1% + \unexpanded\def#1{\CWEBmacro#1}} -\def\deactivateCWEBmacro#1% - {\expandafter\let\expandafter#1\expandafter=\csname oldCWEB\string#1\endcsname} +\unexpanded\def\deactivateCWEBmacro#1% + {\expandafter\let\expandafter#1\csname\??oldCWEB\string#1\endcsname} -%D I did consider loading the \CWEB\ macros using temporary -%D substitutes of \type{\def}, \type{\font}, \type{\newbox} etc. -%D The main problem is that the file contains more than -%D definitions and taking all kind of assignments into account -%D too would not make things easier. So I decided to stick to -%D the method as just described. +\protect -%D Now we're ready for the real job. What follows is a partial -%D adaption of the file \type{cwebmac.tex}, version 3.1, dated -%D September 1994 and written by Levy and Knuth. When possible -%D we kept the original meaning, but we've granted ourselves +%D I did consider loading the \CWEB\ macros using temporary substitutes of \type +%D {\def}, \type {\font}, \type {\newbox} etc. The main problem is that the file +%D contains more than definitions and taking all kind of assignments into account +%D too would not make things easier. So I decided to stick to the method as just +%D described. +%D +%D Now we're ready for the real job. What follows is a partial adaption of the file +%D \type {cwebmac.tex}, version 3.1, dated September 1994 and written by Levy and +%D Knuth. When possible we kept the original meaning, but we've granted ourselves %D the freedom to reformat the macro's for readibility. %D -%D We'll only present the macros we actually use. The source -%D however contains the original implementation. - -% standard macros for CWEB listings (in addition to plain.tex) -% Version 3.1 --- September 1994. -% -% \ifx\documentstyle\undefined\else\endinput\fi % LaTeX will use other macros -% -% \xdef\fmtversion{\fmtversion+CWEB3.1} - -%D \macros{.}{} +%D We'll only present the macros we actually use. The source however contains the +%D original implementation. %D -%D \CWEBquote preserve a way to get the dot accent (all -%D other accents will still work as usual). +%D The next is based on the standard macros for CWEB listings (in addition to \type +%D {plain.tex}) Version 3.1 --- September 1994. -\letCWEBmacro\: = \. - -% \parskip = 0pt % no stretch between paragraphs -% \parindent = 1em % for paragraphs and for the first line of C text - -% \font\ninerm = cmr9 -% \let\mc = \ninerm % medium caps -% \font\eightrm = cmr8 -% \let\sc = \eightrm % small caps (NOT a caps-and-small-caps font) -% \let\mainfont = \tenrm -% \let\cmntfont = \tenrm -% \font\tenss = cmss10 -% \let\cmntfont = \tenss % alternative comment font -% \font\titlefont = cmr7 scaled \magstep4 % title on the contents page -% \font\ttitlefont = cmtt10 scaled \magstep2 % typewriter type in title -% \font\tentex = cmtex10 % TeX extended character set (used in strings) -% \fontextraspace\tentex = 0pt % no double space after sentences - -%D \macros{mc,sc,cmntfont,eightrm}{} -%D -%D The naming of the fonts in in line with those in \PLAIN\ -%D \TEX. Although \CONTEXT\ implements its own scheme, there is -%D still support for the \PLAIN\ ones. We keep the original -%D names, but change their meaning. That way the macros obey -%D switching to other sizes or styles. - -\defCWEBmacro\mc {\tx} -\defCWEBmacro\sc {\txx} -\defCWEBmacro\cmntfont {\ss} -\defCWEBmacro\eightrm {\tx} - -%D \macros{tentex,sevenrm,sevensy,teni}{} -%D -%D The next one uses a temporary solution. The \type{cmtex10} -%D font is not part of the default mechanism. We make use of -%D the \CONTEXT\ variables \type{\textface}, \type{\scriptface} -%D and \type{\scriptscriptface}, which hold the current -%D sizes. - -\defCWEBmacro\tentex% - {\font\next=cmtex10 at \textface - \fontextraspace\next\zeropoint - \next} - -\defCWEBmacro\sevenrm {\getvalue{\scriptface rmtf}} -\defCWEBmacro\sevensy {\getvalue{\scriptface mmsy}} -\defCWEBmacro\teni {\getvalue{\textface mmmi}} - -%D \macros{CWEBpt}{} +%D \macros{.} %D -%D The original macros are based on a 10~point bodyfont size. We -%D therefore have to specify dimension in points a bit -%D different. Specifications like .6pt are changed to -%D \type{.06} times \type{\bodyfontsize}. +%D \CWEBquote preserve a way to get the dot accent (all other accents will still +%D work as usual). -\defCWEBmacro\CWEBpt {\bodyfontsize} % still dutch +\letCWEBmacro\: = \. -%D \macros{CEE,UNIX,TEX,CPLUSPLUS}{} +%D \macros{CEE,UNIX,TEX,CPLUSPLUS} %D -%D Next come some logo's. It does not make much sense to use -%D the \CONTEXT\ logo mechanism here, so we simply say: +%D Next come some logo's. It does not make much sense to use the \CONTEXT\ logo +%D mechanism here, so we simply say: -\defCWEBmacro \CEE/{{\mc C\spacefactor1000}} -\defCWEBmacro \UNIX/{{\mc U\kern-.05emNIX\spacefactor1000}} +\defCWEBmacro \CEE/{{\tx C\spacefactor1000}} +\defCWEBmacro \UNIX/{{\tx UNIX\spacefactor1000}} \defCWEBmacro \TEX/{\TeX} -\defCWEBmacro\CPLUSPLUS/{{\mc C\PP\spacefactor1000}} +\defCWEBmacro\CPLUSPLUS/{{\tx C\PP\spacefactor1000}} \defCWEBmacro \Cee{\CEE/} % for backward compatibility -%D \macros{\ }{} +%D \macros{\ } %D -%D Now we come to the real work: the short commands that make -%D up the typography. +%D Now we come to the real work: the short commands that make up the typography. %D %D \CWEBquote italic type for identifiers. \defCWEBmacro\\#1% - {\leavevmode\hbox{\it#1\/\kern.05em}} + {\dontleavehmode + \hbox{\it#1\/\kern.05em}} -%D \macros{\string|}{} +%D \macros{\string|} %D %D \CWEBquote one letter identifiers look better this way. \defCWEBmacro\|#1% - {\leavevmode\hbox{$#1$}} + {\dontleavehmode + \hbox{$#1$}} -%D \macros{\string\&}{} +%D \macros{\string\&} %D %D \CWEBquote boldface type for reserved words. \defCWEBmacro\% - {\leavevmode - \hbox - {\def\_% - {\kern.04em - \vbox{\hrule width.3em height .06\CWEBpt}% .6pt}% - \kern.08em}% - \bf#1\/\kern.05em}} + {\dontleavehmode + \hbox{\bf#1\/\kern.05em}} -%D \macros{.}{} +%D \macros{.} %D -%D Here we use the previously saved period. This macro -%D takes care of special characters in strings. +%D Here we use the previously saved period. This macro takes care of special +%D characters in strings. \defCWEBmacro\.#1% - {\leavevmode - \hbox - {\tentex % typewriter type for strings - \let\\=\BS % backslash in a string - \let\{=\LB % left brace in a string - \let\}=\RB % right brace in a string - \let\~=\TL % tilde in a string - \let\ =\SP % space in a string - \let\_=\UL % underline in a string - \let\&=\AM % ampersand in a string - \let\^=\CF % circumflex in a string - #1\kern.05em}} - -%D \macros{)}{} + {\dontleavehmode + \hbox + {\tttf % typewriter type for strings + \let\\=\BS % backslash in a string + \let\{=\LB % left brace in a string + \let\}=\RB % right brace in a string + \let\~=\TL % tilde in a string + \let\ =\SP % space in a string + \let\_=\UL % underline in a string + \let\&=\AM % ampersand in a string + \let\^=\CF % circumflex in a string + #1\kern.05em}} + +%D \macros{)} %D %D Some discretionary hack. \defCWEBmacro\)% - {\discretionary{\hbox{\tentex\BS}}{}{}} + {\discretionary{\hbox{\tttf\BS}}{}{}} -%D \macros{AT}{} +%D \macros{AT} %D -%D \CWEBquote at sign for control text (not needed in versions -%D $>=$ 2.9). +%D \CWEBquote at sign for control text (not needed in versions $>=$ 2.9). \defCWEBmacro\AT{@} -%D \macros{ATL,postATL,NOATL}{} +%D \macros{ATL,postATL,NOATL} %D %D A two step macro that handles whatever. -\defCWEBmacro\ATL% +\defCWEBmacro\ATL {\par \noindent \bgroup @@ -316,143 +222,116 @@ \postATL} \defCWEBmacro\postATL#1 #2 % - {\bf letter \\{\uppercase{\char"#1}} tangles as \tentex "#2"% + {\bf letter \\{\WORD{\char"#1}} tangles as \tttf \quotation{#2}% \egroup \par} \defCWEBmacro\noATL#1 #2 % {} -%D \macros{noatl}{} +%D \macros{noatl} %D -%D \CWEBquote suppress output from \type{@l}. +%D \CWEBquote suppress output from \type {@l}. -\defCWEBmacro\noatl% - {\let\ATL=\noATL} +\defCWEBmacro\noatl + {\let\ATL\noATL} % \defCWEBmacro\ATH% % {\X\kern-.5em:Preprocessor definitions\X} %D \macros{PB} %D -%D \CWEBquote hook for program brackets {\tttf\string|...\string|} -%D in TeX part or section name. +%D \CWEBquote hook for program brackets {\tttf\string|...\string|} in \TEX\ part or +%D section name. -\defCWEBmacro\PB% +\defCWEBmacro\PB {\relax} -% \chardef\AM = `\& % ampersand character in a string -% \chardef\BS = `\\ % backslash in a string -% \chardef\LB = `\{ % left brace in a string -% \chardef\RB = `\} % right brace in a string -% \chardef\TL = `\~ % tilde in a string -% \chardef\UL = `\_ % underline character in a string -% \chardef\CF = `\^ % circumflex character in a string - -\defCWEBmacro\AM {\char`\&} % ampersand character in a string -\defCWEBmacro\BS {\char`\\} % backslash in a string -\defCWEBmacro\LB {\char`\{} % left brace in a string -\defCWEBmacro\RB {\char`\}} % right brace in a string -\defCWEBmacro\TL {\char`\~} % tilde in a string -\defCWEBmacro\UL {\char`\_} % underline character in a string -\defCWEBmacro\CF {\char`\^} % circumflex character in a string - -\defCWEBmacro\SP {{\tt\char`\ }} % (visible) space in a string - -% \newbox\PPbox \setbox\PPbox=\hbox -% {\kern.5pt\raise1pt\hbox{\sevenrm+\kern-1pt+}\kern.5pt} -% \newbox\MMbox \setbox\MMbox=\hbox -% {\kern.5pt\raise1pt\hbox{\sevensy\char0\kern-1pt\char0}\kern.5pt} -% \newbox\MGbox \setbox\MGbox=\hbox % symbol for -> -% {\kern-2pt\lower3pt\hbox{\teni\char'176}\kern1pt} -% \newbox\MODbox \setbox\MODbox=\hbox -% {\eightrm\%} -% -% \def\PP {\copy\PPbox} -% \def\MM {\copy\MMbox} -% \def\MG {\copy\MGbox} -% \def\MOD {\mathbin{\copy\MODbox}} - -\defCWEBmacro\PP% symbol for ++ - {\kern.05\CWEBpt - \raise.1\CWEBpt\hbox{\sevenrm+\kern-.1\CWEBpt+}% - \kern.05\CWEBpt} - -\defCWEBmacro\MM% - {\kern.05\CWEBpt - \raise.1\CWEBpt\hbox{\sevensy\char0\kern-.1\CWEBpt\char0}% - \kern.05\CWEBpt} - -\defCWEBmacro\MG% - {\kern-.2\CWEBpt - \lower.3\CWEBpt\hbox{\teni\char'176}% - \kern .1\CWEBpt} +\letCWEBmacro\AM \letterampersand % ampersand character in a string +\letCWEBmacro\BS \letterbackslash % backslash in a string +\letCWEBmacro\LB \letterleftbrace % left brace in a string +\letCWEBmacro\RB \letterrightbrace % right brace in a string +\letCWEBmacro\TL \lettertilde % tilde in a string +\letCWEBmacro\UL \letterunderscore % underline character in a string +\letCWEBmacro\CF \letterhat % circumflex character in a string +\letCWEBmacro\SP \textvisiblespace % (visible) space in a string + +%D We're in mathmode, otherwise we could have: +%D +%D \starttyping +%D \defCWEBmacro\PP{\raise.15em\hbox{\tx\textplus \kern-.05em\textplus }} +%D \defCWEBmacro\MM{\raise.15em\hbox{\tx\textminus\kern .10em\textminus}} +%D \defCWEBmacro\MG{\raise.15em\hbox{\rightarrow}} +%D \stoptyping + +\defCWEBmacro\PP % symbol for ++ + {\kern.05em + \raise.1em\hbox{$\scriptstyle+\kern-.1em+$}% + \kern.05em} + +\defCWEBmacro\MM % symbol for -- + {\kern.05em + \raise.1em\hbox{$\scriptstyle-\kern-.1em-$}% + \kern.05em} + +\defCWEBmacro\MG + {\kern-.2em + \lower.3em\hbox{$\rightarrow$}% + \kern .1em} \defCWEBmacro\MRL#1% {\mathrel{\let\K==#1}} -% \def\MRL#1% -% {\KK#1} -% \def\KK#1#2% -% {\buildrel\;#1\over{#2}} +% \def\MRL #1{\KK#1} +% \def\KK #1#2{\buildrel\;#1\over{#2}} \letCWEBmacro\GG = \gg \letCWEBmacro\LL = \ll \letCWEBmacro\NULL = \Lambda -% \mathchardef\AND = "2026 % bitwise and; also \& (unary operator) - -\defCWEBmacro\AND% redefines itself (funny) - {\mathchardef\AND="2026 \AND} % bitwise and; also \& (unary operator) +\letCWEBmacro\AND = \mathampersand % bitwise and; also \& (unary operator) \letCWEBmacro\OR = \mid % bitwise or \letCWEBmacro\XOR = \oplus % bitwise exclusive or \defCWEBmacro\CM {{\sim}} % bitwise complement -\defCWEBmacro\MOD {\mathbin{\eightrm\%}} +\defCWEBmacro\MOD {\mathbin{\tx\%}} \defCWEBmacro\DC {\kern.1em{::}\kern.1em} % symbol for :: \defCWEBmacro\PA {\mathbin{.*}} % symbol for .* \defCWEBmacro\MGA {\mathbin{\MG*}} % symbol for ->* \defCWEBmacro\this {\&{this}} -% \newbox \bak % backspace one em -% \newbox \bakk % backspace two ems -% -% \setbox\bak =\hbox to -1em{} -% \setbox\bakk=\hbox to -2em{} - \newcount\CWEBind % current indentation in ems \defCWEBmacro\1% indent one more notch - {\global\advance\CWEBind by 1 - \hangindent\CWEBind em} + {\global\advance\CWEBind \plusone + \hangindent\CWEBind \emwidth} \defCWEBmacro\2% indent one less notch - {\global\advance\CWEBind by -1 } + {\global\advance\CWEBind \minusone} \defCWEBmacro\3#1% optional break within a statement {\hfil - \penalty#10 + \penalty#10\relax \hfilneg} \defCWEBmacro\4% backspace one notch - {\hbox to -1em{}} + {\hpack to -1em{}} \defCWEBmacro\5% optional break {\hfil - \penalty-1 + \penalty\minusone \hfilneg \kern2.5em - \hbox to -2em{}% + \hpack to -2em{}% \ignorespaces} \defCWEBmacro\6% forced break - {\ifmmode - \else + {\ifmmode \else \par \hangindent\CWEBind em \noindent \kern\CWEBind em - \hbox to -2em{}% + \hpack to -2em{}% \ignorespaces \fi} @@ -467,45 +346,20 @@ \defCWEBmacro\9#1% {} -\newcount\gdepth % depth of current major group, plus one -\newcount\secpagedepth -\secpagedepth=3 % page breaks will occur for depths -1, 0, and 1 - -% \newtoks\gtitle % title of current major group -% \newskip\intersecskip -% \intersecskip=12pt minus 3pt % space between sections +\newcount\CWEBgdepth % depth of current major group, plus one +\newcount\CWEBsecpagedepth -% \let\yskip=\smallskip +\CWEBsecpagedepth=3 % page breaks will occur for depths -1, 0, and 1 \defCWEBmacro\?% {\mathrel?} -% \def\note#1#2.% -% {\Y\noindent -% {\hangindent2em\baselineskip10pt\eightrm#1~#2.\par}} - -\defCWEBmacro\lapstar% +\defCWEBmacro\lapstar {\rlap{*}} -% \def\stsec% -% {\rightskip=0pt % get out of C mode (cf. \B) -% \sfcode`;=1500 -% \pretolerance 200 -% \hyphenpenalty 50 -% \exhyphenpenalty 50 -% \noindent{\let\*=\lapstar\bf\secstar.\quad}} -% -% \let\startsection=\stsec - \defCWEBmacro\defin#1% {\global\advance\CWEBind by 2 \1\&{#1 } } % begin `define' or `format' -% \def\A% xref for doubly defined section name -% {\note{See also section}} -% -% \def\As% xref for multiply defined section name -% {\note{See also sections}} - \defCWEBmacro\B% {\rightskip=0pt plus 100pt minus 10pt % go into C mode \sfcode`;=3000 @@ -515,15 +369,10 @@ \global\CWEBind=2 \1\ \unskip} \defCWEBmacro\C#1% - {\5\5\quad$/\ast\,${\cmntfont #1}$\,\ast/$} - -% \let\SHC\C % "// short comments" treated like "/* ordinary comments */" + {\5\5\quad$/\ast\,${\ss\detokenize{#1}}$\,\ast/$} \defCWEBmacro\SHC#1% - {\5\5\quad$//\,${\cmntfont#1}} - -% \def\C#1{\5\5\quad$\triangleright\,${\cmntfont#1}$\,\triangleleft$} -% \def\SHC#1{\5\5\quad$\diamond\,${\cmntfont#1}} + {\5\5\quad$//\,${\ss#1}} \defCWEBmacro\D% macro definition {\defin{\#define}} @@ -548,61 +397,9 @@ \defCWEBmacro\J% TANGLE's join operation {\.{@\&}} -% \let\K== % assignment operator - \letCWEBmacro\K = \leftarrow % "honest" alternative to standard assignment operator % \L is Polish letter suppressed-L - -% \outer\def\M#1% -% {\MN{#1}% -% \ifon -% \vfil -% \penalty-100 -% \vfilneg % beginning of section -% \vskip\intersecskip -% \startsection -% \ignorespaces} -% -% \outer\def\N#1#2#3.% -% {\gdepth=#1% -% \gtitle={#3}% -% \MN{#2}% beginning of starred section -% \ifon -% \ifnum#1<\secpagedepth -% \vfil -% \eject % force page break if depth is small -% \else -% \vfil -% \penalty-100 -% \vfilneg -% \vskip\intersecskip -% \fi -% \fi -% \message{*\secno}% progress report -% \edef\next% -% {\write\cont % write to contents file -% {\ZZ{#3}{#1}{\secno}{\noexpand\the\pageno}}}% -% \next % \ZZ{title}{depth}{sec}{page} -% \ifon -% \startsection -% {\bf#3.\quad}% -% \ignorespaces} -% -% \def\MN#1% -% {\par % common code for \M, \N -% {\xdef\secstar{#1}% -% \let\*=\empty -% \xdef\secno{#1}}% remove \* from section name -% \ifx\secno\secstar -% \onmaybe -% \else -% \ontrue -% \fi -% \mark{{{\tensy x}\secno}{\the\gdepth}{\the\gtitle}}} -% -% each \mark is {section reference or null}{depth plus 1}{group title} - % \O is Scandinavian letter O-with-slash % \P is paragraph sign @@ -612,7 +409,7 @@ % \S is section sign \defCWEBmacro\T#1% - {\leavevmode % octal, hex or decimal constant + {\dontleavehmode % octal, hex or decimal constant \hbox {$\def\?{\kern.2em}% \def\$##1{\egroup_{\,\rm##1}\bgroup}% suffix to constant @@ -628,16 +425,6 @@ \letCWEBmacro\V = \lor % logical or \letCWEBmacro\W = \land % logical and -% defined later on -% -% \def\X#1:#2\X% -% {\ifmmode -% \gdef\XX{\null$\null}% -% \else -% \gdef\XX{}% -% \fi % section name -% \XX$\langle\,${#2\eightrm\kern.5em#1}$\,\rangle$\XX} - \unprotect \def\theCWEByskip {\blank[\v!small]} @@ -649,264 +436,64 @@ {\par \yskip} -\defCWEBmacro\yskip% +\defCWEBmacro\yskip {\theCWEByskip} \letCWEBmacro\Z = \le -% \letCWEBmacro\ZZ = \let % now you can \write the control sequence \ZZ +\letCWEBmacro\ZZ = \relax \letCWEBmacro\* = * -\defCWEBmacro\oct% +\defCWEBmacro\oct {\hbox{$^\circ$\kern-.1em\it\aftergroup\?\aftergroup}} -\defCWEBmacro\hex% +\defCWEBmacro\hex {\hbox{$^{\scriptscriptstyle\#}$\tt\aftergroup}} \defCWEBmacro\vb#1% - {\leavevmode + {\dontleavehmode \hbox - {\kern.2\CWEBpt + {\kern.2em \vrule \vtop {\vbox {\hrule - \hbox{\strut\kern.2\CWEBpt\.{#1}\kern.2\CWEBpt}} + \hbox{\strut\kern.2em\.{#1}\kern.2em}} \hrule}% \vrule - \kern.2\CWEBpt}} % verbatim string + \kern.2em}} % verbatim string -\def\onmaybe% +\def\onmaybe {\let\ifon=\maybe} \let\maybe=\iftrue \newif\ifon -% \newif\iftitle -% \newif\ifpagesaved -% -% \def\lheader% -% {\mainfont -% \the\pageno -% \eightrm -% \qquad -% \grouptitle -% \hfill -% \title -% \qquad -% \mainfont -% \topsecno} % top line on left-hand pages -% -% \def\rheader% -% {\mainfont -% \topsecno -% \eightrm -% \qquad -% \title -% \hfill -% \grouptitle -% \qquad -% \mainfont -% \the\pageno} % top line on right-hand pages -% -% \def\grouptitle -% {\let\i=I -% \let\j=J -% \uppercase\expandafter{\expandafter\takethree\topmark}} -% -% \def\topsecno% -% {\expandafter\takeone\topmark} -% -% \def\takeone #1#2#3{#1} -% \def\taketwo #1#2#3{#2} -% \def\takethree #1#2#3{#3} -% -% \def\nullsec% -% {\eightrm -% \kern-2em} % the \kern-2em cancels \qquad in headers -% -% \let\page=\pagebody % \def\page {\box255 } -% \raggedbottom % \normalbottom % faster, but loses plain TeX footnotes -% -% \def\normaloutput#1#2#3% -% {\shipout\vbox -% {\ifodd -% \pageno -% \hoffset=\pageshift -% \fi -% \vbox to \fullpageheight -% {\iftitle -% \global\titlefalse -% \else -% \hbox to \pagewidth -% {\vbox to 10pt{}% -% \ifodd\pageno #3\else#2\fi} -% \fi -% \vfill#1}} % parameter #1 is the page itself -% \global\advance\pageno by 1} -% -% \gtitle={\.{CWEB} output} % this running head is reset by starred sections -% -% \mark{\noexpand\nullsec0{\the\gtitle}} -% -% \def\title% -% {\expandafter\uppercase\expandafter{\jobname}} -% -% \def\topofcontents% -% {\centerline{\titlefont\title} -% \vskip.7in -% \vfill} % this material will start the table of contents page - -\def\botofcontents% +\def\botofcontents {\vfill \centerline{\covernote}} % this material will end the table of contents page -\def\covernote% +\def\covernote {} % some leftover \defCWEBmacro\contentspagenumber{0} % default page number for table of contents -% \newdimen\pagewidth \pagewidth = 158mm % the width of each page -% \newdimen\pageheight \pageheight = 223mm % the height of each page -% \newdimen\fullpageheight \fullpageheight = 240mm % page height including headlines -% \newdimen\pageshift \pageshift = 0in % shift righthand pages wrt lefthand ones -% -% \def\magnify#1% -% {\mag=#1 -% \pagewidth=6.5truein -% \pageheight=8.7truein -% \fullpageheight=9truein -% \setpage} -% -% \def\setpage% -% {\hsize\pagewidth -% \vsize\pageheight} % use after changing page size -% -% \def\contentsfile {\jobname.toc} % file that gets table of contents info -% \def\readcontents {\input \contentsfile} -% \def\readindex {\input \jobname.idx} -% \def\readsections {\input \jobname.scn} -% -% \newwrite\cont -% \output{\setbox0=\page % the first page is garbage -% \openout\cont=\contentsfile -% \write\cont{\catcode `\noexpand\@=11\relax} % \makeatletter -% \global\output{\normaloutput\page\lheader\rheader}} -% \setpage -% \vbox to \vsize{} % the first \topmark won't be null - \defCWEBdummy\magnify#1% magnify the page {} -\defCWEBmacro\ch% +\defCWEBmacro\ch {\note{The following sections were changed by the change file:} \let\*=\relax} -% \newbox\sbox % saved box preceding the index -% \newbox\lbox % lefthand column in the index -% -% \def\inx% -% {\par\vskip6pt plus 1fil % we are beginning the index -% \def\page{\box255 } -% \normalbottom -% \write\cont{} % ensure that the contents file isn't empty -% \write\cont{\catcode `\noexpand\@=12\relax} % \makeatother -% \closeout\cont % the contents information has been fully gathered -% \output -% {\ifpagesaved -% \normaloutput{\box\sbox}\lheader\rheader -% \fi -% \global\setbox\sbox=\page -% \global\pagesavedtrue} -% \pagesavedfalse -% \eject % eject the page-so-far and predecessors -% \setbox\sbox\vbox{\unvbox\sbox} % take it out of its box -% \vsize=\pageheight -% \advance\vsize by -\ht\sbox % the remaining height -% \hsize=.5\pagewidth -% \advance\hsize by -10pt -% % column width for the index (20pt between cols) -% \parfillskip 0pt plus .6\hsize % try to avoid almost empty lines -% \def\lr{L} % this tells whether the left or right column is next -% \output -% {\if L\lr -% \global\setbox\lbox=\page -% \gdef\lr{R} -% \else -% \normaloutput -% {\vbox to\pageheight -% {\box\sbox -% \vss -% \hbox to\pagewidth{\box\lbox\hfil\page}}} -% \lheader -% \rheader -% \global\vsize\pageheight\gdef\lr{L}\global\pagesavedfalse\fi} -% \message{Index:} -% \parskip 0pt plus .5pt -% \outer\def\I##1, {\par\hangindent2em\noindent##1:\kern1em} % index entry -% \def\[##1]{$\underline{##1}$} % underlined index item -% \rm -% \rightskip0pt plus 2.5em -% \tolerance 10000 -% \let\*=\lapstar -% \hyphenpenalty 10000 -% \parindent0pt -% \readindex} -% -% \def\fin% -% {\par\vfill\eject % this is done when we are ending the index -% \ifpagesaved\null\vfill\eject\fi % output a null index column -% \if L\lr\else\null\vfill\eject\fi % finish the current page -% \parfillskip 0pt plus 1fil -% \def\grouptitle{NAMES OF THE SECTIONS} -% \let\topsecno=\nullsec -% \message{Section names:} -% \output={\normaloutput\page\lheader\rheader} -% \setpage -% \def\note##1##2.{\quad{\eightrm##1~##2.}} -% \def\Q{\note{Cited in section}} % crossref for mention of a section -% \def\Qs{\note{Cited in sections}} % crossref for mentions of a section -% \def\U{\note{Used in section}} % crossref for use of a section -% \def\Us{\note{Used in sections}} % crossref for uses of a section -% \def\I{\par\hangindent 2em}\let\*=* -% \readsections} -% -% \def\con% -% {\par\vfill\eject % finish the section names -% %\ifodd\pageno\else\titletrue\null\vfill\eject\fi % for duplex printers -% \rightskip = 0pt -% \hyphenpenalty = 50 -% \tolerance = 200 -% \setpage -% \output={\normaloutput\page\lheader\rheader} -% \titletrue % prepare to output the table of contents -% \pageno=\contentspagenumber -% \def\grouptitle{TABLE OF CONTENTS} -% \message{Table of contents:} -% \topofcontents -% \line{\hfil Section\hbox to3em{\hss Page}} -% \let\ZZ=\contentsline -% \readcontents\relax % read the contents info -% \botofcontents -% \end} % print the contents page(s) and terminate -% -% \def\contentsline#1#2#3#4% -% {\ifnum#2=0 -% \smallbreak -% \fi -% \line{\consetup{#2}#1 -% \rm\leaders\hbox to .5em{.\hfil}\hfil\ #3\hbox to3em{\hss#4}}} -% - \defCWEBmacro\consetup#1% {\ifcase#1 \bf % depth -1 (@**) \or % depth 0 (@*) - \or \hskip2em % depth 1 (@*1) - \or \hskip4em % depth 2 (@*2) - \or \hskip6em % depth 3 (@*3) - \or \hskip8em % depth 4 (@*4) + \or \hskip 2em % depth 1 (@*1) + \or \hskip 4em % depth 2 (@*2) + \or \hskip 6em % depth 3 (@*3) + \or \hskip 8em % depth 4 (@*4) \or \hskip10em % depth 5 (@*5) \else \hskip12em \fi} % depth 6 or more @@ -927,149 +514,65 @@ \thinspace \fi} -% \def\noinx% -% {\let\inx=\end} -% -% \def\nosecs% -% {\let\FIN=\fin -% \def\fin% -% {\let\parfillskip=\end -% \FIN}} -% -% \def\nocon% -% {\let\con=\end} -% -% \newcount\twodigits -% -% \def\hours% -% {\twodigits=\time -% \divide\twodigits by 60 -% \printtwodigits -% \multiply\twodigits by -60 -% \advance\twodigits by \time -% :\printtwodigits} -% -% \def\gobbleone1{} -% -% \def\printtwodigits% -% {\advance\twodigits by 100 -% \expandafter\gobbleone\number\twodigits -% \advance\twodigits by -100 } -% -% \def\today% -% {\ifcase\month -% \or January\or February\or March\or April\or May\or June% -% \or July\or August\or September\or October\or November\or December% -% \fi -% \space -% \number\day, \number\year} -% -% \def\datethis% -% {\def\startsection% -% {\leftline{\sc\today\ at \hours} -% \bigskip -% \let\startsection=\stsec -% \stsec}} -% -% \def\datecontentspage% -% {\def\topofcontents% -% {\leftline{\sc\today\ at \hours} -% \bigskip -% \centerline{\titlefont\title} -% \vfill}} - \defCWEBdummy\datethis {} % say `\datethis' in limbo, to get your listing timestamped before section 1 \defCWEBdummy\datecontentspage {} % timestamps the contents page -\defCWEBmacro\TeX% +\defCWEBmacro\TeX {{\ifmmode\it\fi - \leavevmode + \dontleavehmode \hbox{T\kern-.1667em\lower.424ex\hbox{E}\hskip-.125em X}}} - + % alternative implementation \newif\ifCWEBnotes -\defCWEBmacro\Q {\CWEBnotesfalse \note{This code is cited in section}} % xref for mention of a section -\defCWEBmacro\Qs {\CWEBnotestrue \note{This code is cited in sections}} % xref for mentions of a section - -\defCWEBmacro\U {\CWEBnotesfalse \note{This code is used in section}} % xref for use of a section -\defCWEBmacro\Us {\CWEBnotestrue \note{This code is used in sections}} % xref for uses of a section - -\defCWEBmacro\A {\CWEBnotesfalse \note{See also section}} % xref for doubly defined section name -\defCWEBmacro\As {\CWEBnotestrue \note{See also sections}} % xref for multiply defined section name - -\defCWEBmacro\ET% conjunction between two section numbers - { and~} - -\defCWEBmacro\ETs% conjunction between the last two of several section numbers - {, and~} - -%\def\processCWEBsectionnumbers[#1]% -% {\bgroup -% \def\CWEBcomma% -% {\def\CWEBcomma{, }}% -% \def\docommand##1% -% {\bgroup -% \def\[####1]{####1}% -% \xdef\CWEBreference{##1}% -% \egroup -% \CWEBcomma{\naar{\donottest{##1}}[web:\CWEBreference]}}% -% \processcommalist[{#1}]\docommand -% \egroup} - -% \def\processCWEBsectionnumbers[#1]% -% {\bgroup -% \def\CWEBcomma% -% {\def\CWEBcomma{, }}% -% \def\docommand##1% -% {\bgroup -% \def\(####1){####1}% -% \xdef\CWEBreference{##1}% -% \egroup -% \CWEBcomma -% {\localcolortrue\naar{\donottest{##1}}[web:\CWEBreference]}}% -% \bgroup -% \def\[##1]{\(##1)}\let\(=\relax\xdef\CWEBreferences{#1}% -% \egroup -% \unexpanded\def\(##1){\[##1]}% -% \processcommacommand[\CWEBreferences]\docommand -% \egroup} - -\def\processCWEBsectionnumbers[#1]% +\defCWEBmacro\Q {\CWEBnotesfalse \note{This code is cited in section}} % xref for mention of a section +\defCWEBmacro\Qs {\CWEBnotestrue \note{This code is cited in sections}} % xref for mentions of a section + +\defCWEBmacro\U {\CWEBnotesfalse \note{This code is used in section}} % xref for use of a section +\defCWEBmacro\Us {\CWEBnotestrue \note{This code is used in sections}} % xref for uses of a section + +\defCWEBmacro\A {\CWEBnotesfalse \note{See also section}} % xref for doubly defined section name +\defCWEBmacro\As {\CWEBnotestrue \note{See also sections}} % xref for multiply defined section name + +\defCWEBmacro\ET { and~} % conjunction between two section numbers +\defCWEBmacro\ETs {, and~} % conjunction between the last two of several section numbers + +\def\processCWEBsectionnumber#1% {\bgroup - \def\CWEBcomma% - {\def\CWEBcomma{, }}% - \def\docommand##1% - {\bgroup - \def\[####1]{####1}% - \xdef\CWEBreference{##1}% - \egroup - \CWEBcomma{\localcolortrue\goto{\donottest{##1}}[web:\CWEBreference]}}% - \processlist{(}{)}{,}\docommand(#1) + \def\[##1]{##1}% + \xdef\CWEBreference{#1}% + \egroup + \CWEBcomma{\goto{#1}[web:\CWEBreference]}} + +\unexpanded\def\processCWEBsectionnumbers[#1]% + {\bgroup + \def\CWEBcomma{\def\CWEBcomma{, }}% + \processlist(),\processCWEBsectionnumber(#1)% \egroup} -\def\processCWEBsectionnotes% +\unexpanded\def\processCWEBsectionnotes {\catcode`\s=12 \doprocessCWEBsectionnotes} -\def\doprocessCWEBsectionnotes#1.% +\def\doprocessCWEBsectionnote#1\ET#2#3.% + {\processCWEBsectionnumbers[#1]% + \if#2s% + {, and~\goto{##3}[web:#3]}% + \else + { and~\goto{##2##3}[web:#2#3]}% + \fi}% + +\unexpanded\def\doprocessCWEBsectionnotes#1.% {\ifCWEBnotes - \def\next##1\ET##2##3.% - {\processCWEBsectionnumbers[##1]% - \if##2s% - {, and~\goto{##3}[web:##3]}% - \else - { and~\goto{##2##3}[web:##2##3]}% - \fi}% - \next#1.% + \doprocessCWEBsectionnote#1.% \else \goto{#1}[web:#1]% \fi \afterCWEBnote % inside group! \egroup} -\let\afterCWEBnote=\relax +\let\afterCWEBnote\relax \defCWEBmacro\note#1% {\bgroup @@ -1077,36 +580,63 @@ \def\afterCWEBnote{\par}% \hangindent2em %\baselineskip10pt - \eightrm#1~\processCWEBsectionnotes} + \tx#1~\processCWEBsectionnotes} -\def\oldCWEBmacroX#1:#2\X% original +\unexpanded\def\oldCWEBmacroX#1:#2\X% original {\ifmmode \gdef\XX{\null$\null}% \else - \gdef\XX{}% + \glet\XX\empty \fi % section name - \XX$\langle\,${#2\eightrm\kern.5em#1}$\,\rangle$\XX} + \XX$\langle\,${#2\tx\kern.5em#1}$\,\rangle$\XX} -\defCWEBmacro\ATH% +\defCWEBmacro\ATH {\oldCWEBmacroX\kern-.5em:Preprocessor definitions\X} -\def\newCWEBmacroX#1:#2\X% original +\unexpanded\def\newCWEBmacroX#1:#2\X% original {\ifmmode \gdef\XX{\null$\null}% \else - \gdef\XX{}% + \glet\XX\empty \fi % section name \XX$\langle\,$% - {#2\eightrm\kern.5em\processCWEBsectionnumbers[{#1}]}% + {#2\tx\kern.5em\processCWEBsectionnumbers[{#1}]}% $\,\rangle$\XX} \defCWEBmacro\X#1:#2\X% {\newCWEBmacroX#1:#2\X} -\definemarking[CWEBfilename] -\definemarking[CWEBsectiontitle] -\definemarking[CWEBsectionnumber] -\definemarking[CWEBsectiondepth] +%D The next code is a bit messy because there is skipping over content +%D and we have \type {\fi}'s in the source. + +\let\CWEBsecno\empty + +\definelist[cweb] + +\defCWEBmacro\startsection + {\rightskip=0pt % get out of C mode (cf. \B) + \sfcode`;=1500 + \pretolerance 200 + \hyphenpenalty 50 + \exhyphenpenalty 50 + \noindent + \bgroup + \let\*=\lapstar + \gotoCWEBsection{\bf\CWEBsecstar.\quad}[\CWEBsecno]% + \egroup} + +\defCWEBmacro\MN#1% + {\par % common code for \M, \N + \begingroup + \xdef\CWEBsecstar{#1}% + \let\*=\empty + \xdef\CWEBsecno{#1}% remove \* from section name + \endgroup + \ifx\CWEBsecno\CWEBsecstar + \onmaybe + \else + \ontrue + \fi} \defCWEBmacro\M#1% {\MN{#1}% @@ -1118,16 +648,15 @@ \startsection \pagereference[web:#1]% \expanded{\marking[CWEBsectionnumber]{\secno}}% - \expanded{\marking[CWEBsectiondepth]{\the\gdepth}}% + \expanded{\marking[CWEBsectiondepth]{\the\CWEBgdepth}}% \ignorespaces} \defCWEBmacro\N#1#2#3.% - {\gdepth=#1% + {\CWEBgdepth=#1% \MN{#2}% beginning of starred section \ifon - \ifnum#1<\secpagedepth - \vfil - \eject % force page break if depth is small + \ifnum#1<\CWEBsecpagedepth + \page \else \vfil \penalty-100 @@ -1135,34 +664,16 @@ \theCWEBvskip \fi \fi - \message{*\secno}% progress report - \makesectionformat % context - \defconvertedargument\ascii{#3}% - \edef\next% - {\write\CWEBcont % write to contents file - {\string\ZZ{\ascii}{#1}{\secno}% - {\sectionformat::\noexpand\userfolio}{\noexpand\realfolio}}}% - \next % \ZZ{title}{depth}{sec}{page} + \writedatatolist[cweb][section=\CWEBsecno,title={#3},depth=#1]% \ifon \startsection \pagereference[web:#2]% \marking[CWEBsectiontitle] {#3}% - \expanded{\marking[CWEBsectionnumber]{\secno}}% - \expanded{\marking[CWEBsectiondepth]{\the\gdepth}}% + \expanded{\marking[CWEBsectionnumber]{\CWEBsecno}}% + \expanded{\marking[CWEBsectiondepth]{\the\CWEBgdepth}}% {\bf#3.\quad}% \ignorespaces} -\defCWEBmacro\MN#1% - {\par % common code for \M, \N - {\xdef\secstar{#1}% - \let\*=\empty - \xdef\secno{#1}}% remove \* from section name - \ifx\secno\secstar - \onmaybe - \else - \ontrue - \fi} - \newif\iflinktoCWEBfile \def\setCWEBlinkfile#1% @@ -1171,12 +682,11 @@ \unprotect -\def\gotoCWEBsection#1[#2]% +\unexpanded\def\gotoCWEBsection#1[#2]% {\iflinktoCWEBfile \bgroup \setupinteraction[\c!color=,\c!style=]% \let\savedreferenceprefix=\referenceprefix - \localcolortrue \goto{#1}[\otherCWEBfile::\savedreferenceprefix web:#2]% \egroup \else @@ -1185,24 +695,10 @@ \protect -\defCWEBmacro\startsection% - {\rightskip=0pt % get out of C mode (cf. \B) - \sfcode`;=1500 - \pretolerance 200 - \hyphenpenalty 50 - \exhyphenpenalty 50 - \noindent - \bgroup - \let\*=\lapstar - \gotoCWEBsection{\bf\secstar.\quad}[\secno]% - \egroup} - -\def\ignoreCWEBinput% - {\let\normalinput=\input - \def\input ##1 % - {\let\input=\normalinput}} +\unexpanded\def\ignoreCWEBinput + {\def\input ##1 {\let\input\normalinput}} -\def\loadCWEBmacros#1% +\unexpanded\def\loadCWEBmacros#1% {\let\oldN=\N \def\N{\bgroup\setbox0=\vbox\bgroup\endinput}% \ignoreCWEBinput @@ -1210,33 +706,27 @@ \egroup\egroup \let\N=\oldN} -\def\resetCWEBcontext% - {\catcode`\|=12 % used in context discretionaries - \everypar{} % used for context indentation and floats - \parskip=0pt % no stretch between cweb paragraphs - \parindent=1em} % is related to cweb backspace etc +\unexpanded\def\resetCWEBcontext + {\catcode`\|=\othercatcode % used in context discretionaries + \everypar \emptytoks % used for context indentation and floats + \parskip \zeropoint % no stretch between cweb paragraphs + \parindent \emwidth} % is related to cweb backspace etc -\newwrite\CWEBcont - -\def\processCWEBsource #1 % +\unexpanded\def\processCWEBsource #1 % {\bgroup \resetCWEBcontext \activateCWEB \ignoreCWEBinput - \immediate\openout\CWEBcont=#1.toc - \write\CWEBcont{\noexpand\unprotect} - \message{Source:} + \let\end\relax \marking[CWEBfilename]{#1} \ReadFile{#1.tex}\relax - \write\CWEBcont{\noexpand\protect} - \closeout\CWEBcont \par \egroup} -\def\resetCWEBindexentry% +\unexpanded\def\resetCWEBindexentry {\xdef\currentCWEBindexentry{}} -\def\showCWEBindexentry#1% can be redefined +\unexpanded\def\showCWEBindexentry#1% can be redefined {\theCWEBvskip \vskip3\lineheight \goodbreak @@ -1244,7 +734,32 @@ {\pagereference[web:#1]\bf#1}% \theCWEBvskip} -\def\checkCWEBindexentry#1% + + \def\dodofindfirstcharacter#1% + {\ifx#1\relax + \let\next=\egroup + \else + \handlecase + {\expandafter\ifnum\expandafter\catcode\expandafter`#1=11 + \def\next##1\relax{\egroup\def\firstcharacter{#1}}% + \fi}% + \fi + \next} + + \def\dofindfirstcharacter#1#2% + {\def\firstcharacter{}% + \bgroup + \defconvertedargument\ascii{#2}% + \let\next\dodofindfirstcharacter + \let\handlecase#1% + \expandafter\next\ascii\relax} + + \def\FINDFIRSTCHARACTER + {\dofindfirstcharacter\uppercase} + + + +\unexpanded\def\checkCWEBindexentry#1% {\bgroup \def\\##1{##1}% a dummy that also removes the {} \def\|##1{##1}% another dummy @@ -1261,11 +776,14 @@ \showCWEBindexentry{\currentCWEBindexentry}}}% \egroup} -\def\theCWEBbeforeindex {\startcolumns} -\def\theCWEBafterindex {\stopcolumns} +\unexpanded\def\theCWEBbeforeindex {\startcolumns} +\unexpanded\def\theCWEBafterindex {\stopcolumns} -\def\processCWEBindex #1 % - {\bgroup +\unexpanded\def\processCWEBindex #1 % + {\par + \bgroup + \forgetall + \setupalign[verytolerant,flushleft,nothyphenated] \resetCWEBcontext \activateCWEB \resetCWEBindexentry @@ -1274,42 +792,36 @@ \checkCWEBindexentry{##1}% \hangindent2em \noindent##1:\kern1em% - \def\next####1.% - {\processCWEBsectionnumbers[{####1}]}% + \def\next####1.{\processCWEBsectionnumbers[{####1}]}% \next}% \def\[##1]% {$\underline{##1}$}% \let\*=\lapstar - \parfillskip 0pt plus .6\hsize % try to avoid almost empty lines -% \parskip 0pt plus .5pt - \rightskip0pt plus 2.5em - \tolerance 10000 - \hyphenpenalty 10000 - \parindent0pt - \message{Index:} - \marking[CWEBfilename] {#1} - \marking[CWEBsectiontitle] {index} + \marking[CWEBfilename]{#1} + \marking[CWEBsectiontitle]{index} \marking[CWEBsectionnumber]{} \marking[CWEBsectiondepth]{} - \loadCWEBmacros{#1} +% \loadCWEBmacros{#1} \theCWEBbeforeindex \ReadFile{#1.idx}\relax \theCWEBafterindex \par \egroup} -\def\processCWEBsections #1 % - {\bgroup +\unexpanded\def\processCWEBsections #1 % + {\par + \bgroup + \forgetall \resetCWEBcontext \activateCWEB - \loadCWEBmacros{#1} + % \loadCWEBmacros{#1} \parfillskip = 0pt plus 1fil \parindent = 0pt \let\topsecno=\nullsec \def\note##1% {\quad \bgroup - \eightrm + \tx ##1~\processCWEBsectionnotes} \def\Q {\CWEBnotesfalse \note{Cited in section}} % crossref for mention of a section \def\Qs{\CWEBnotestrue \note{Cited in sections}} % crossref for mentions of a section @@ -1317,57 +829,49 @@ \def\Us{\CWEBnotestrue \note{Used in sections}} % crossref for uses of a section \def\I {\par\hangindent 2em}% \let\*=* - \message{Section names:} - \marking[CWEBfilename] {#1} - \marking[CWEBsectiontitle] {sections} + \marking[CWEBfilename]{#1} + \marking[CWEBsectiontitle]{sections} \marking[CWEBsectionnumber]{} \marking[CWEBsectiondepth]{} - \loadCWEBmacros{#1} +% \loadCWEBmacros{#1} \ReadFile{#1.scn}\relax - \par \botofcontents \par \egroup} -\def\processCWEBcontents #1 % - {\bgroup +\unexpanded\def\processCWEBcontents #1 % + {\par + \bgroup + \forgetall \resetCWEBcontext \activateCWEB - \loadCWEBmacros{#1} - \rightskip = 0pt - \hyphenpenalty = 50 - \tolerance = 200 - \parindent = 0pt - \line{\hfil Section\hbox to3em{\hss Page}} - \let\ZZ=\contentsline - \message{Table of contents:} - \marking[CWEBfilename] {#1} - \marking[CWEBsectiontitle] {table of contents} + \marking[CWEBfilename]{#1} + \marking[CWEBsectiontitle]{table of contents} \marking[CWEBsectionnumber]{} \marking[CWEBsectiondepth]{} - \loadCWEBmacros{#1} - \ReadFile{#1.toc}\relax + \forgetall + \placelist[cweb][criterium=all,command=\CWEBlistentry] \par \egroup} -\defCWEBmacro\contentsline#1#2#3#4#5% - {\ifnum#2=0 - \smallbreak - \fi - \line{\consetup{#2}#1 - \rm - \leaders\hbox to .5em{.\hfil}\hfil\ - {\localcolortrue\goto{#3}[web:#3]}% below: \gotorealpage ? should be changed - \hbox to3em{\localcolortrue\hss\gotorealpage{}{}{#5}{\translatednumber[#4]\presetgoto}}}} - -%D A last hack, needed because a file can overload of the -%D above. (Some day: a check like \type{\ifx#1\CWEBdefined}.) - -\def\outer#1#2% - {\ifx#2\undefined - \expandafter#1\expandafter#2% - \else - \expandafter#1\expandafter\ThrowAway - \fi} +% {all} +% +% \structurelistuservariable +% \rawstructurelistuservariable +% +% \goto{#3}[web:#3] + +\installstructurelistprocessor{cweb} + {\begingroup + \advance\leftskip 3em + \advance\rightskip3em + \currentlistentrydestinationattribute + \dontleavehmode + \llap{\hbox \currentlistentryreferenceattribute{number} to 3em{\structurelistuservariable{section}\hss}}% + \structurelistuservariable{title}% + \hfill + \rlap{\hbox \currentlistentryreferenceattribute{page} to 3em{\hss\structurelistuservariable{depth}}}% + \par + \endgroup} \endinput diff --git a/tex/context/modules/mkiv/m-database.mkiv b/tex/context/modules/mkiv/m-database.mkiv index cc7dd3d72..49d62ea3d 100644 --- a/tex/context/modules/mkiv/m-database.mkiv +++ b/tex/context/modules/mkiv/m-database.mkiv @@ -13,7 +13,7 @@ %D For Mojca. -\registerctxluafile{m-database}{1.001} +\registerctxluafile{m-database}{} \unprotect diff --git a/tex/context/modules/mkiv/m-escrito.mkiv b/tex/context/modules/mkiv/m-escrito.mkiv index 763857918..2d69fb218 100644 --- a/tex/context/modules/mkiv/m-escrito.mkiv +++ b/tex/context/modules/mkiv/m-escrito.mkiv @@ -11,7 +11,7 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\registerctxluafile{m-escrito}{1.001} +\registerctxluafile{m-escrito}{} %D This is a fun project and not meant for production (yet). It's a follow up on a %D project by Taco presented at a Bacho\TeX\ meeting years ago. I probably messed up diff --git a/tex/context/modules/mkiv/m-markdown.mkiv b/tex/context/modules/mkiv/m-markdown.mkiv index 6e0036513..29d41341e 100644 --- a/tex/context/modules/mkiv/m-markdown.mkiv +++ b/tex/context/modules/mkiv/m-markdown.mkiv @@ -19,7 +19,7 @@ %D rendering (pagination, etc) of documents. As I'm no user myself, it %D is up to others to provide documentation and examples. -\registerctxluafile{m-markdown}{1.001} +\registerctxluafile{m-markdown}{} \unprotect diff --git a/tex/context/modules/mkiv/m-matrix.mkiv b/tex/context/modules/mkiv/m-matrix.mkiv index f59363e94..9cac69672 100644 --- a/tex/context/modules/mkiv/m-matrix.mkiv +++ b/tex/context/modules/mkiv/m-matrix.mkiv @@ -17,7 +17,7 @@ %D be made. Dalyoung does the clever bits, and Hans only cleanes up and %D optimizes a bit. -% \registerctxluafile{l-matrix}{1.001} % not yet +% \registerctxluafile{l-matrix}{} % not yet \startmodule[matrix] @@ -70,10 +70,16 @@ end -- todo: define a matrix at the tex end so that we have more control +-- local fences = { +-- parentheses = { left = "\\left(\\,", right = "\\,\\right)" }, +-- brackets = { left = "\\left[\\,", right = "\\,\\right]" }, +-- bars = { left = "\\left|\\,", right = "\\,\\right|" }, +-- } + local fences = { - parentheses = { left = "\\left(\\,", right = "\\,\\right)" }, - brackets = { left = "\\left[\\,", right = "\\,\\right]" }, - bars = { left = "\\left|\\,", right = "\\,\\right|" }, + parentheses = { "matrix:parentheses" }, + brackets = { "matrix:brackets" }, + bars = { "matrix:bars" }, } -- one can add more fences @@ -104,7 +110,10 @@ function matrix.typeset(m,options) elseif tonumber(template) then template = "%0." .. template .. "F" end - context.startmatrix(whatever) + context.startnamedmatrix(whatever) + if type(m[1]) ~= "table" then + m = { copy(m) } + end for i=1, #m do local mi = m[i] for j=1,#mi do @@ -118,31 +127,20 @@ function matrix.typeset(m,options) end context.NR() end - context.stopmatrix() + context.stopnamedmatrix() elseif m then context(m) end end --- interchange two rows (i-th, j-th) - --- function matrix.swaprows(t,i,j) --- if i <= #t and j <= #t then --- t[i], t[j] = t[j], t[i] --- return t --- else --- return "error: out of bound" --- end --- end - function matrix.swaprows(t,i,j) local ti = t[i] if not ti then - return "error: no row i" + return "error: no row" end local tj = t[j] if not tj then - return "error: no row j" + return "error: no row" end t[i], t[j] = tj, ti return t @@ -150,28 +148,14 @@ end -- interchange two columns (i-th, j-th) --- function matrix.swapcolumns(t, i, j) --- if i <= #t[1] and j <= #t[1] then --- for k = 1, #t do --- t[k][i], t[k][j] = t[k][j], t[k][i] --- end --- return t --- else --- return "error: out of bound" --- end --- end - function matrix.swapcolumns(t, i, j) local t1 = t[1] if not t1 then return "error: no rows" end local n = #t1 - if i <= n then - return "error: no row i" - end - if j <= n then - return "error: no row j" + if i > n or j > n then + return "error: no column" end for k = 1, #t do local tk = t[k] @@ -315,7 +299,7 @@ local function determinant(m) end return s*d else - return "error: not a square matrix" + return "error: not a square matrix" -- not context(..) end end @@ -387,7 +371,7 @@ matrix.rowEchelon = rowechelon -- make matrices until its determinant is not 0 -function matrix.make(n,m,low,high) +function matrix.make(m,n,low,high) -- m and n swapped if not n then n = 10 end @@ -398,17 +382,16 @@ function matrix.make(n,m,low,high) low = 0 end if not high then - high = 100 + high = 10 end - local t = { } -- make an empty n1 x n2 array - local again = true - for i=1,n do + local t = { } + for i=1,m do t[i] = { } end while true do - for i=1,n do + for i=1,m do local ti = t[i] - for j=1,m do + for j=1,n do ti[j] = random(low,high) end end @@ -483,14 +466,30 @@ end local function solve(m,c) local n = #m if n ~= #c then - return copy(m) + -- return "error: size mismatch" + return nil end local newm = copy(m) local temp = copy(c) + local solution = copy(c) for i=1,n do insert(newm[i],temp[i]) end - return rowechelon(newm,1) + newm = uppertri(newm, 0) + for k = n,1,-1 do + local val = 0 + local new = newm[k] + for j = k+1, n do + val = val + new[j] * solution[j] + end + if new[k] == 0 then + -- return "error: no unique solution" + return nil + else + solution[k] = (new[n+1] - val)/new[k] + end + end + return solution end matrix.solve = solve @@ -527,6 +526,9 @@ matrix.inverse = inverse \continueifinputfile{m-matrix.mkiv} +\usemodule[m-matrix] +\usemodule[art-01] + \starttext \startluacode @@ -542,147 +544,323 @@ document.DemoMatrixA = { document.DemoMatrixB = { { 0, 2, 4, -4, 1 }, { 0, 0, 2, 3, 4 }, - { 2, 2, -6, 2, 4 }, + { 2, 2, -6, 3, 4 }, { 2, 0, -6, 9, 7 }, { 2, 2, -6, 2, 4 }, - { 2, 2, -6, 2, 4 }, +} + +document.DemoMatrixC = { + { 3, 3, -1, 3 }, + { -1, 4, 1, 3 }, + { 5, 4, 0, 2 }, + { 2, 4, 0, -1 }, } \stopluacode +\startbuffer[demo] +\typebuffer +\startalignment[middle] + \dontleavehmode\inlinebuffer +\stopalignment +\stopbuffer + +\setuphead[section][before={\testpage[5]\blank[2*big]}] + \startsubject[title={A symbolic matrix}] +\startbuffer \ctxmodulematrix{typeset(moduledata.matrix.symbolic("a", "m", "n"))} \ctxmodulematrix{typeset(moduledata.matrix.symbolic("a", "m", "n", 4, 8))} +\stopbuffer + +\getbuffer[demo] + +\stopsubject + +\startsubject[title={Generate a new $m \times n$ matrix}] + +\startbuffer +\startluacode + moduledata.matrix.typeset(moduledata.matrix.make(4,3, 0,5)) + context.qquad() + moduledata.matrix.typeset(moduledata.matrix.make(5,5,-1,5)) +\stopluacode +\stopbuffer + +\getbuffer[demo] \stopsubject \startsubject[title={Swap two rows (2 and 4)}] +\startbuffer \startluacode -moduledata.matrix.typeset(document.DemoMatrixA) -context.blank() -moduledata.matrix.swap(document.DemoMatrixA, 2, 4) -context.blank() -moduledata.matrix.typeset(document.DemoMatrixA) + moduledata.matrix.typeset(document.DemoMatrixA) + context("$\\qquad \\Rightarrow \\qquad$") + moduledata.matrix.typeset(moduledata.matrix.swaprows(document.DemoMatrixA,2,4)) \stopluacode +\stopbuffer + +\getbuffer[demo] \stopsubject -\startsubject[title={Multiply $3 \times r_2$}] +\startsubject[title={Swap two columns (2 and 4)}] +\startbuffer \startluacode -moduledata.matrix.typeset(document.DemoMatrixA) -context.blank() -moduledata.matrix.typeset(moduledata.matrix.multiply(document.DemoMatrixA, 2, 3)) + moduledata.matrix.typeset(document.DemoMatrixA) + context("$\\qquad \\Rightarrow \\qquad$") + moduledata.matrix.typeset(moduledata.matrix.swapcolumns(document.DemoMatrixA,2, 4)) \stopluacode +\stopbuffer + +\getbuffer[demo] \stopsubject -\startsubject[title={Row 2 + $4 \times r_3$}] +\startsubject[title={Multiply 3 to row 2($3 \times r_2$)}] +\startbuffer \startluacode -moduledata.matrix.typeset(document.DemoMatrixA) -context.blank() -moduledata.matrix.sumrow(document.DemoMatrixA, 2, 3, 4) -context.blank() -moduledata.matrix.typeset(document.DemoMatrixA,{ fences = "bars" } ) + moduledata.matrix.typeset(document.DemoMatrixA) + context("$\\qquad \\Rightarrow \\qquad$") + moduledata.matrix.typeset(moduledata.matrix.multiply(document.DemoMatrixA,2,3)) \stopluacode +\stopbuffer + +\getbuffer[demo] \stopsubject -\startsubject[title={Transpose a matrix}] +\startsubject[title={Add 4 times of row 3 to row 2($r_2 + 4 \times r_3$)}] +\startbuffer \startluacode -moduledata.matrix.typeset(document.DemoMatrixA) -context.blank() -moduledata.matrix.typeset(moduledata.matrix.transpose(document.DemoMatrixA)) + moduledata.matrix.typeset(document.DemoMatrixA) + context("$\\qquad \\Rightarrow \\qquad$") + moduledata.matrix.sumrow(document.DemoMatrixA,2,3,4) + moduledata.matrix.typeset(document.DemoMatrixA) \stopluacode +\stopbuffer + +\getbuffer[demo] + +\stopsubject + +\startsubject[title={Transpose a matrix}] +\startbuffer +\startluacode + moduledata.matrix.typeset(document.DemoMatrixA) + context("$\\qquad \\Rightarrow \\qquad$") + moduledata.matrix.typeset(moduledata.matrix.transpose(document.DemoMatrixA)) +\stopluacode +\stopbuffer + +\getbuffer[demo] \stopsubject \startsubject[title={The inner product of two vectors}] +\startbuffer +\startluacode + context("$<1,2,3> \\cdot <3,1,2> \\ =\\ $ ") + context( moduledata.matrix.inner({ 1, 2, 3 }, { 3, 1, 2 })) +\stopluacode +\stopbuffer + +\getbuffer[demo] + \startluacode -context(moduledata.matrix.inner({ 1, 2, 3 }, { 3, 1, 2 })) -context.blank() +context("$<1,2,3> \\cdot <3,1,2, 4> \\ =\\ $ ") context(moduledata.matrix.inner({ 1, 2, 3 }, { 3, 1, 2, 4 })) \stopluacode +\stopbuffer + +\getbuffer[demo] + +\stopsubject \startsubject[title={The product of two matrices}] +\startbuffer \startluacode -moduledata.matrix.typeset(document.DemoMatrixA) -context.blank() -moduledata.matrix.typeset(moduledata.matrix.product(document.DemoMatrixA,document.DemoMatrixA)) + context("$\\ $") + moduledata.matrix.typeset(document.DemoMatrixB) + context("$\\cdot$") + moduledata.matrix.typeset(document.DemoMatrixA) + context("$ = $") + moduledata.matrix.typeset(moduledata.matrix.product + (document.DemoMatrixB,document.DemoMatrixB)) \stopluacode +\stopbuffer + +\getbuffer[demo] \stopsubject \startsubject[title={An Upper Triangular Matrix}] -\ctxmodulematrix{typeset(moduledata.matrix.uppertri(document.DemoMatrixB))} +\startbuffer +\startluacode + moduledata.matrix.typeset(document.DemoMatrixB) + context("$\\qquad \\Rightarrow \\qquad$") + moduledata.matrix.typeset(moduledata.matrix.uppertri(document.DemoMatrixB)) +\stopluacode +\stopbuffer + +\getbuffer[demo] -\startsubject[title={A determinant}] +\stopsubject +\startsubject[title={Determinant: using triangulation}] + +\startbuffer \startluacode -local m = { - { 1, 2, 4 }, - { 0, 0, 2 }, - { 2, 2, -6 }, -} -context(moduledata.matrix.determinant(m, "determinant=yes" )) + local m = { + { 1, 2, 4 }, + { 0, 0, 2 }, + { 2, 2, -6 }, + { 2, 2, -6 }, + } + moduledata.matrix.typeset(m, {fences="bars"}) + context("$\\qquad = \\qquad$") + moduledata.matrix.determinant(m) \stopluacode +\stopbuffer + +\getbuffer[demo] + +\startbuffer +\startluacode + moduledata.matrix.typeset(document.DemoMatrixC, { fences = "bars" }) + context("$\\qquad = \\qquad$") + context(moduledata.matrix.determinant(document.DemoMatrixC)) +\stopluacode +\stopbuffer + +\getbuffer[demo] \stopsubject -\startsubject[title={Row echelon form}] +\startsubject[title={Determinant: using Laplace Expansion}] +\startbuffer \startluacode -local m = { - { 1, 3, -2, 0, 2, 0, 0 }, - { 2, 6, -5, -2, 4, -3, -1 }, - { 0, 0, 5, 10, 0, 15, 5 }, - { 2, 6, 0, 8, 4, 18, 6 }, -} + moduledata.matrix.typeset(document.DemoMatrixC, { fences = "bars" }) + context("$\\qquad = \\qquad$") + context(moduledata.matrix.laplace(document.DemoMatrixC)) +\stopluacode +\stopbuffer + +\getbuffer[demo] + +\stopsubject + +\startsubject[title={Example of Laplace Expansion using submatrix function}] -moduledata.matrix.typeset(m) -context.blank() -moduledata.matrix.typeset(moduledata.matrix.rowechelon(m,1), { determinant = "yes" }) +\startbuffer +\startluacode + local m = { + { 1, 5, 4, 2 }, + { 5, 2, 0, 4 }, + { 2, 2, 1, 1 }, + { 1, 0, 0, 5 }, + } + local options = {fences = "bars"} + + moduledata.matrix.typeset(m,options) + context("\\par $=$") + for j = 1, #m[1] do + local mm = moduledata.matrix.submatrix(m, 1, j) + local factor = (-1)^(1+j) *(m[1][j]) + context("\\ ($%d$) \\cdot ", factor) + moduledata.matrix.typeset(mm, options) + if j < #m[1] then + context("\\ $+$ ") + end + end \stopluacode +\stopbuffer + +\getbuffer[demo] \stopsubject -\startsubject[title={Solving linear equation}] +\startsubject[title={Row echelon form}] +\startbuffer \startluacode -local m = { - { 1, 3, -2, 0 }, - { 2, 0, 1, 2 }, - { 6, -5, -2, 4 }, - { -3, -1, 5, 10 }, -} + local m = { + { 1, 3, -2, 0, 2, 0, 0 }, + { 2, 6, -5, -2, 4, -3, -1 }, + { 0, 0, 5, 10, 0, 15, 5 }, + { 2, 6, 0, 8, 4, 18, 6 }, + } + moduledata.matrix.typeset(m) + context("$\\Rightarrow$") + moduledata.matrix.typeset(moduledata.matrix.rowechelon(m,1)) +\stopluacode + +\stopbuffer -local c = { 5, 2, 6, 8 } - -moduledata.matrix.typeset(moduledata.matrix.solve(m,c)) -context.blank() -moduledata.matrix.typeset(moduledata.matrix.solve(m,c), { template = 6 }) -context.blank() -moduledata.matrix.typeset(moduledata.matrix.solve(m,c), { template = "no" }) -context.blank() -moduledata.matrix.typeset(moduledata.matrix.solve(m,c), { template = "%0.3f" }) -context.blank() -moduledata.matrix.typeset(moduledata.matrix.solve(m,c), { template = "%0.4F" }) +\getbuffer[demo] + +\stopsubject + +\startsubject[title={Solving linear equation}] + +\startbuffer +\startluacode + local m = { + { 1, 3, -2, 0 }, + { 2, 0, 1, 2 }, + { 6, -5, -2, 4 }, + { -3, -1, 5, 10 }, + } + + local c = { 5, 2, 6, 8 } + + moduledata.matrix.typeset(moduledata.matrix.solve(m,c)) + context.blank() + moduledata.matrix.typeset(moduledata.matrix.solve(m,c), { template = 6 }) + context.blank() + moduledata.matrix.typeset(moduledata.matrix.solve(m,c), { template = "no" }) + context.blank() + moduledata.matrix.typeset(moduledata.matrix.solve(m,c), { template = "%0.3f" }) + context.blank() + moduledata.matrix.typeset(moduledata.matrix.solve(m,c), { template = "%0.4F" }) \stopluacode +\stopbuffer + +\getbuffer[demo] \stopsubject \startsubject[title={Inverse matrix}] -\startcombination[2*1] - {\ctxlua{moduledata.matrix.typeset { { 1, 1, 1 }, { 0, 2, 3 }, { 3, 2, 1 } }}} {} - {\ctxlua{moduledata.matrix.typeset(moduledata.matrix.inverse { { 1, 1, 1 }, { 0, 2, 3 }, { 3, 2, 1 } })}} {} -\stopcombination +\startbuffer +\startluacode + local m = { + { 1, 1, 1 }, + { 0, 2, 3 }, + { 3, 2, 1 }, + } + context("$A =\\quad$") + moduledata.matrix.typeset(m) + context("$\\qquad A^{-1} = \\quad$") + moduledata.matrix.typeset(moduledata.matrix.inverse(m)) + context("\\blank\\ ") + moduledata.matrix.typeset(m) + context("$\\cdot$") + moduledata.matrix.typeset(moduledata.matrix.inverse(m)) + context("$ = $") + moduledata.matrix.typeset(moduledata.matrix.product(m, moduledata.matrix.inverse(m))) +\stopluacode +\stopbuffer + +\getbuffer[demo] \stopsubject diff --git a/tex/context/modules/mkiv/m-media.mkiv b/tex/context/modules/mkiv/m-media.mkiv new file mode 100644 index 000000000..e2b324279 --- /dev/null +++ b/tex/context/modules/mkiv/m-media.mkiv @@ -0,0 +1,30 @@ +%D \module +%D [ file=m-media, +%D version=2017.10.17, +%D title=\CONTEXT\ Backend Macros, +%D subtitle=Media support, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +%D Because media support in acrobat is unstable over years and because it depends +%D on flash support is no longer part of the core. If at some point decent support +%D for video shows up again we might look into it again. + +\endinput % soon this will go + +\unprotect + +\registerctxluafile{grph-u3d}{} % grph-inc.mkiv +\registerctxluafile{lpdf-u3d}{} % back-u3d.mkiv +\registerctxluafile{back-u3d}{} % back-pdf.mkiv + +\registerctxluafile{grph-swf}{} % grph-inc.mkiv +\registerctxluafile{lpdf-swf}{} % back-u3d.mkiv +\registerctxluafile{back-swf}{} % back-pdf.mkiv + +\protect \endinput diff --git a/tex/context/modules/mkiv/m-nodechart.mkvi b/tex/context/modules/mkiv/m-nodechart.mkvi index c9d985850..ab117efe0 100644 --- a/tex/context/modules/mkiv/m-nodechart.mkvi +++ b/tex/context/modules/mkiv/m-nodechart.mkvi @@ -11,7 +11,7 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\registerctxluafile{m-nodechart}{1.001} +\registerctxluafile{m-nodechart}{} \usemodule[chart] diff --git a/tex/context/modules/mkiv/m-punk.mkiv b/tex/context/modules/mkiv/m-punk.mkiv index f7e17da83..b72abd64d 100644 --- a/tex/context/modules/mkiv/m-punk.mkiv +++ b/tex/context/modules/mkiv/m-punk.mkiv @@ -13,6 +13,7 @@ \startluacode local concat = table.concat +local round = math.round local chardata = characters.data local fontdata = fonts.hashes.identifiers @@ -85,7 +86,7 @@ function metapost.characters.process(mpxformat, name, instances, scalefactor) scalefactor = scalefactor or 1 instances = instances or metapost.characters.instances or 10 local fontname = file.removesuffix(file.basename(name)) - local hash = file.robustname(string.format("%s %05i %03i", fontname, scalefactor*1000, instances)) + local hash = file.robustname(string.format("%s %05i %03i", fontname, round(scalefactor*1000), instances)) local lists = containers.read(fonts.mp.cache, hash) if not lists then statistics.starttiming(flusher) @@ -203,7 +204,7 @@ metapost.characters.flusher = flusher statistics.register("metapost font generation", function() local time = statistics.elapsedtime(flusher) if total > 0 then - return string.format("%i glyphs, %.3f seconds runtime, %i glyphs/second", total, time, total/time) + return string.format("%i glyphs, %.3f seconds runtime, %0.3f glyphs/second", total, time, total/time) else return string.format("%i glyphs, %.3f seconds runtime", total, time) end diff --git a/tex/context/modules/mkiv/m-scite.mkiv b/tex/context/modules/mkiv/m-scite.mkiv index a7d9f8b5c..12b54b9ac 100644 --- a/tex/context/modules/mkiv/m-scite.mkiv +++ b/tex/context/modules/mkiv/m-scite.mkiv @@ -45,7 +45,7 @@ -- todo: hook into the pretty print code -- todo: a simple catcode regime with only \ { } -local gsub, sub, find = string.gsub, string.sub, string.find +local gsub, sub, find, lower = string.gsub, string.sub, string.find, string.lower local concat = table.concat local formatters = string.formatters local lpegmatch = lpeg.match @@ -57,13 +57,14 @@ buffers.scite = scite -- context output: local f_def_color = formatters["\\definecolor[slxc%s][h=%02X%02X%02X]%%"] -local f_fore_none = formatters["\\unexpanded\\def\\slx%s#1{{\\slxc%s#1}}%%"] -local f_fore_bold = formatters["\\unexpanded\\def\\slx%s#1{{\\slxc%s\\bf#1}}%%"] -local f_none_bold = formatters["\\unexpanded\\def\\slx%s#1{{\\bf#1}}%%"] -local f_none_none = formatters["\\unexpanded\\def\\slx%s#1{{#1}}%%"] -local f_texstyled = formatters["\\slx%s{%s}"] -local f_hanging = formatters["\\slxb{%s}%s\\slxe"] +local f_fore_none = formatters["\\unexpanded\\def\\slx%s#1{{\\slxc%s#1}\\slxbreak}%%"] +local f_fore_bold = formatters["\\unexpanded\\def\\slx%s#1{{\\slxc%s\\bf#1}\\slxbreak}%%"] +local f_none_bold = formatters["\\unexpanded\\def\\slx%s#1{{\\bf#1}\\slxbreak}%%"] +local f_none_none = formatters["\\unexpanded\\def\\slx%s#1{{#1}\\slxbreak}%%"] +local f_texstyled = formatters["\\slx%s{%s}\\slxbreak"] +local f_hanging = formatters["\\slxb{%r}%s\\slxe"] -- we need to round: lua 5.3 +local v_none = interfaces.variables.none local f_mapping = [[ \let\string\slxL\string\letterleftbrace @@ -152,7 +153,9 @@ local function exportstyled(lexer,text) local position = result[i+1] local txt = sub(text,start,position-1) txt = lpegmatch(replacer,txt) - if whites[style] then + if txt == "" then + -- skip + elseif whites[style] then buffer[#buffer+1] = txt else buffer[#buffer+1] = f_texstyled(style,txt) @@ -167,53 +170,144 @@ function scite.installcommands() context(exportcolors()) end -local p1 = lpeg.tsplitat(lpeg.patterns.newline) -local p2 = lpeg.P("\\slxS ")^1 -local p3 = lpeg.Cs((lpeg.Cp() * lpeg.P(" ") * lpeg.Cp() / function(b,e) return "\\slxF{" .. (e-b-1) .. "}" end - + (1-lpeg.P(" "))^1)^0) +local function slxF(b,e) + local d = (e - b)/6 + if d > 0 then + return "\\slxF{" .. d .. "}" + else + return " " + end +end --- slxb could have a \hskip so then we can replace the slxS's +local p1 = lpeg.tsplitat(lpeg.patterns.newline) +local p2 = lpeg.P("\\slxS ") +local p3 = p2^1 +local p4 = lpeg.Cs( ( (lpeg.Cp() * p2 * p2^1 * lpeg.Cp()) / slxF + lpeg.P(1) )^0 ) local function indent(str) local l = lpegmatch(p1,str) for i=1,#l do local s = l[i] if #s > 0 then - local n = lpegmatch(p2,s) + local n = lpegmatch(p3,s) if n then - n = (n-1)/6 + n = (n-1)/6 -- length of "\\slxS " else n = 0 end -s = lpegmatch(p3,s) -- can be combined + if n > 0 then + s = sub(s,n*6+1) + end + s = lpegmatch(p4,s) -- can be combined l[i] = f_hanging(n,s) -- "\\slxb{%s}%s\\slxe " --- print(">",s) --- print("<",l[i]) end end return concat(l,"\n") end +local assignbuffer = buffers.assign +local getcontent = buffers.getcontent +local loaddata = io.loaddata +local loadedlexers = scite.loadedlexers + local function lexdata(data,lexname) - local styled = exportstyled(scite.loadedlexers[lexname],data or "") - styled = indent(styled) - buffers.assign("lex",styled) + if not data then + data = "" + elseif data ~= "" then + if data and not find(data,"[\r\n]$") then + -- fix for lexbyline + data = data .. "\r" + end + if lexname == v_none then +-- data = string.formatters["%!tex!"](data) + data = exportstyled(loadedlexers["dummy"] or loadedlexers.tex,data) + else + data = exportstyled(loadedlexers[lexname] or loadedlexers.tex,data) + end + data = indent(data) + end +io.savedata("temp.logs ",data) + assignbuffer("lex",data) end scite.lexdata = lexdata function scite.lexbuffer(name,lexname) - lexdata(buffers.getcontent(name) or "",lexname or "tex") + lexdata(getcontent(name) or "",lexname or "tex") end function scite.lexfile(filename,lexname) - lexdata(io.loaddata(filename) or "",lexname or file.suffix(filename)) + lexdata(loaddata(filename) or "",lexname or file.suffix(filename)) +end + +interfaces.implement { + name = "scitelexfile", + arguments = "string", + actions = scite.lexfile, +} + +interfaces.implement { + name = "scitelexbuffer", + arguments = { "string", "string" }, + actions = scite.lexbuffer, +} + +interfaces.implement { + name = "sciteinstallcommands", + actions = scite.installcommands, +} + +local startInlineScite = context.startInlineScite +local stopInlineScite = context.stopInlineScite +local startDisplayScite = context.startDisplayScite +local stopDisplayScite = context.stopDisplayScite + +local lexdata = buffers.scite.lexdata + +local handler = visualizers.newhandler { + startinline = function(settings) startInlineScite(settings.name or "") end, + stopinline = function(settings) stopInlineScite() end, + startdisplay = function(settings) startDisplayScite(settings.name or "") end, + stopdisplay = function(settings) stopDisplayScite() end, + noescape = true, +} + +local knownlexers = scite.knownlexers + +local parser = function(content,specification) + local method = lower(specification.method) + lexdata(content,knownlexers[method] or method) end --- html output +local visualizer = { + handler = handler, + parser = parser, +} + +visualizers.register("cld", visualizer) +visualizers.register("tex", visualizer) +visualizers.register("lua", visualizer) +visualizers.register("mps", visualizer) +visualizers.register("xml", visualizer) +visualizers.register("bibtex",visualizer) +visualizers.register("btx", visualizer) +visualizers.register("web", visualizer) +visualizers.register("cpp", visualizer) +visualizers.register("txt", visualizer) +-----------.register("sql", visualizer) \stopluacode +\definetyping[TEX] [option=cld] +\definetyping[LUA] [option=lua] +\definetyping[BTX] [option=bibtex] +\definetyping[MPS] [option=mps] +\definetyping[MP] [option=mps] +\definetyping[CPP] [option=web] +\definetyping[WEB] [option=web] +\definetyping[TXT] [option=txt] +\definetyping[NONE][option=none] + % This is a preliminary interface. \unprotect @@ -221,22 +315,38 @@ end \newdimen\scitespaceskip \unexpanded\def\buff_scite_slxb#1% - {%\begingroup - \hangindent\numexpr#1+2\relax\scitespaceskip + {\hangindent\numexpr#1+2\relax\scitespaceskip + \hskip#1\scitespaceskip \hangafter 1\relax} \unexpanded\def\buff_scite_slxe - {\par - }%\endgroup} - -\unexpanded\def\installscitecommands - {\ctxlua{buffers.scite.installcommands()}% - \let\installscitecommands\relax - \scitespaceskip\fontcharwd\font`0\relax - \unexpanded\def\slxS{\hskip\scitespaceskip}% - \unexpanded\def\slxF##1{\hskip##1\scitespaceskip\relax}% + {\par} + +\unexpanded\def\buff_scite_slxs {\hskip\scitespaceskip\relax} +\unexpanded\def\buff_scite_slxf#1{\hskip#1\scitespaceskip\relax} + +\unexpanded\def\installscitecommandsinline + {\scitespaceskip\interwordspace % \fontcharwd\font`0\relax % brrrrr + \let\slxb\gobbleoneargument + \let\slxe\space + \let\installscitecommandsinline\relax} + +\unexpanded\def\installscitecommandsdisplay + {\scitespaceskip\interwordspace % \fontcharwd\font`0\relax % brrrrr \let\slxb\buff_scite_slxb - \let\slxe\buff_scite_slxe} + \let\slxe\buff_scite_slxe + \let\installscitecommandsdisplay\relax} + +\clf_sciteinstallcommands + +\installscitecommandsinline + +\let\slxS\buff_scite_slxs +\let\slxF\buff_scite_slxf + +\def\module_scite_inherit_typing + {\buff_verbatim_initialize_typing_one + \buff_verbatim_set_line_margin} \unexpanded\def\startscite {\begingroup @@ -254,10 +364,12 @@ end {\dosingleargument\module_scite_file} \unexpanded\def\module_scite_file[#1]% - {\start - \ctxlua{buffers.scite.lexfile("#1")}% - \installscitecommands + {\begingroup + \setcatcodetable\ctxcatcodes % needed in xml + \clf_scitelexfile{#1}% \tt + \installscitecommandsdisplay + \module_scite_inherit_typing \dontcomplain \raggedright \startcontextcode @@ -265,27 +377,80 @@ end \getbuffer[lex] \stoplines \stopcontextcode - \stop} + \endgroup} \unexpanded\def\scitebuffer - {\dodoubleargument\module_scite_buffer} + {\dodoubleempty\module_scite_buffer} \unexpanded\def\module_scite_buffer[#1][#2]% - {\start + {\begingroup + \setcatcodetable\ctxcatcodes % needed in xml \ifsecondargument - \ctxlua{buffers.scite.lexbuffer("#2","#1")}% + \clf_scitelexbuffer{#2}{#1}% \else - \ctxlua{buffers.scite.lexbuffer("#1","tex")}% + \clf_scitelexbuffer{#1}{tex}% \fi - \installscitecommands \tt + \installscitecommandsdisplay + \module_scite_inherit_typing \dontcomplain \raggedright - \setcatcodetable\ctxcatcodes % needed in xml \startlines - \getbuffer[lex]% + \getbuffer[lex] \stoplines - \stop} + \endgroup} + +\unexpanded\def\sciteinlinebuffer + {\dodoubleempty\module_scite_buffer_inline} + +\unexpanded\def\module_scite_buffer_inline[#1][#2]% + {\dontleavehmode + \begingroup + \setcatcodetable\ctxcatcodes % needed in xml + \ifsecondargument + \clf_scitelexbuffer{#2}{#1}% + \else + \clf_scitelexbuffer{#1}{tex}% + \fi + \tt + \installscitecommandsinline + \module_scite_inherit_typing + \dontcomplain + \getbuffer[lex]% + \endgroup} + +\unexpanded\def\startInlineScite#1% + {\dontleavehmode + \begingroup + \setcatcodetable\ctxcatcodes % needed in xml + \tt + \installscitecommandsinline + \dontcomplain + \ignorespaces + \clf_getbuffercontent{lex}% much faster than getbuffer + \removeunwantedspaces} + +\unexpanded\def\stopInlineScite + {\endgroup} + +\unexpanded\def\startDisplayScite#1% + {\begingroup + \setcatcodetable\ctxcatcodes % needed in xml + \tt + \installscitecommandsdisplay + \dontcomplain +\buff_verbatim_initialize_typing_one +\buff_verbatim_set_line_margin + \raggedright + \startlines + \clf_getbuffer{lex}} + +\unexpanded\def\stopDisplayScite + {\stoplines + \endgroup} + +\unexpanded\def\slxbreak + {\allowbreak} \protect @@ -335,4 +500,13 @@ end % \getbuffer[demo] \scitebuffer[demo] +\startbuffer[foo] +This is text. % line 1 +This is text. % line 2 +\stopbuffer + +\scitebuffer[none][foo] + +\sciteinlinebuffer[none][foo] + \stoptext diff --git a/tex/context/modules/mkiv/m-spreadsheet.mkiv b/tex/context/modules/mkiv/m-spreadsheet.mkiv index 914a2b57a..1d76d86ab 100644 --- a/tex/context/modules/mkiv/m-spreadsheet.mkiv +++ b/tex/context/modules/mkiv/m-spreadsheet.mkiv @@ -13,7 +13,7 @@ %D This is an experimental follow up on discussion on the mailing list. -\registerctxluafile{m-spreadsheet}{1.001} +\registerctxluafile{m-spreadsheet}{} \unprotect diff --git a/tex/context/modules/mkiv/m-subsub.mkiv b/tex/context/modules/mkiv/m-subsub.mkiv index 88be11680..e0f6b1f27 100644 --- a/tex/context/modules/mkiv/m-subsub.mkiv +++ b/tex/context/modules/mkiv/m-subsub.mkiv @@ -12,65 +12,29 @@ \unprotect -\definesection[\s!section-8] -\definesection[\s!section-9] -\definesection[\s!section-10] -\definesection[\s!section-11] -\definesection[\s!section-12] +\writestatus\m!system{} +\writestatus\m!system{\the\maxstructuredepth\space levels sections are already predefined} +\writestatus\m!system{} -\definehead - [\v!subsubsubsubsubsection] - [\c!section=\s!section-8, - \c!default=\v!subsubsubsubsection] +\protect -\definehead - [\v!subsubsubsubsubsubsection] - [\c!section=\s!section-9, - \c!default=\v!subsubsubsubsubsection] +\continueifinputfile{m-subsub.mkiv} -\definehead - [\v!subsubsubsubsubsubsubsection] - [\c!section=\s!section-10, - \c!default=\v!subsubsubsubsubsubsection] +\starttext -\definehead - [\v!subsubsubsubsubsubsubsubsection] - [\c!section=\s!section-11, - \c!default=\v!subsubsubsubsubsubsubsection] + % \part {level 1 part} + \chapter {level 2 chapter} + \section {level 3 section} + \subsection {level 4 subsection} + \subsubsection {level 5 subsubsection} + \subsubsubsection {level 6 subsubsubsection} + \subsubsubsubsection {level 7 subsubsubsubsection} + \subsubsubsubsubsection {level 8 subsubsubsubsubsection} + \subsubsubsubsubsubsection {level 9 subsubsubsubsubsubsection} + \subsubsubsubsubsubsubsection {level 10 subsubsubsubsubsubsubsection} + \subsubsubsubsubsubsubsubsection {level 11 subsubsubsubsubsubsubsubsection} + \subsubsubsubsubsubsubsubsubsection {level 12 subsubsubsubsubsubsubsubsubsection} -\definehead - [\v!subsubsubsubsubsubsubsubsubsection] - [\c!section=\s!section-12, - \c!default=\v!subsubsubsubsubsubsubsubsection] + In case you wonder: level 1 part. -\definehead - [\v!subsubsubsubsubsubject] - [\c!coupling=\v!subsubsubsubsubsection, - \c!default=\v!subsubsubsubsubsection, - \c!incrementnumber=\v!no] - -\definehead - [\v!subsubsubsubsubsubsubject] - [\c!coupling=\v!subsubsubsubsubsubsection, - \c!default=\v!subsubsubsubsubsubsection, - \c!incrementnumber=\v!no] - -\definehead - [\v!subsubsubsubsubsubsubsubject] - [\c!coupling=\v!subsubsubsubsubsubsubsection, - \c!default=\v!subsubsubsubsubsubsubsection, - \c!incrementnumber=\v!no] - -\definehead - [\v!subsubsubsubsubsubsubsubsubject] - [\c!coupling=\v!subsubsubsubsubsubsubsubsection, - \c!default=\v!subsubsubsubsubsubsubsubsection, - \c!incrementnumber=\v!no] - -\definehead - [\v!subsubsubsubsubsubsubsubsubsubject] - [\c!coupling=\v!subsubsubsubsubsubsubsubsubsection, - \c!default=\v!subsubsubsubsubsubsubsubsubsection, - \c!incrementnumber=\v!no] - -\protect \endinput +\stoptext diff --git a/tex/context/modules/mkiv/m-three.mkiv b/tex/context/modules/mkiv/m-three.mkiv new file mode 100644 index 000000000..c8ff2167a --- /dev/null +++ b/tex/context/modules/mkiv/m-three.mkiv @@ -0,0 +1,72 @@ +%D \module +%D [ file=m-three, +%D version=2017.11.08, +%D title=\CONTEXT\ Extra Modules, +%D subtitle=\METAPOST\ pseudo-3D module support, +%D author=Hans Hagen and Alan Braslau, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\unprotect + +\defineMPinstance + [three] + [\s!format=metafun, + \s!extensions=\v!yes, + \s!initializations=\v!yes, + \c!method=\s!double] + +\startMPdefinitions{three} + loadmodule "tres" ; +\stopMPdefinitions + +\protect + +\continueifinputfile{m-three.mkiv} + +%D We put this test here as in \type {meta-tex.mkiv} it would abort due to redefinition +%D of namespaces. + +\starttext + +%D Alan: we need to make a fill example: + +\startMPpage[instance=three] + path f ; f := ( + projection Origin -- + projection (1,0,0) -- + projection (1,1,0) -- + projection (0,1,0) -- + projection (0,1,1) -- + projection (1,1,1) -- + projection (1,0,1) -- + projection (0,0,1) -- + cycle + ) scaled 5cm ; + + fill f withcolor "darkred" ; + + path p ; p := ( + projection Origin -- + projection (1,0,0) -- + projection (1,1,0) -- + projection (0,1,0) -- + projection (0,1,1) -- + projection (1,1,1) -- + projection (1,0,1) -- + projection (0,0,1) -- + cycle + ) scaled 5cm ; + + draw p withcolor .5white ; + + for i=0 upto length p : + draw point i of p withpen currentpen scaled 2mm withcolor "lightblue" ; + endfor ; +\stopMPpage + +\stoptext diff --git a/tex/context/modules/mkiv/m-timing.mkiv b/tex/context/modules/mkiv/m-timing.mkiv index 5502768f6..404d5bae0 100644 --- a/tex/context/modules/mkiv/m-timing.mkiv +++ b/tex/context/modules/mkiv/m-timing.mkiv @@ -31,7 +31,7 @@ \definecolor[usage:time] [darkblue] \definecolor[usage:frame][darkgray] -\ctxloadluafile{trac-tim}{} +\ctxloadluafile{trac-tim} \startluacode local progress = moduledata.progress diff --git a/tex/context/modules/mkiv/m-typesetting.mkiv b/tex/context/modules/mkiv/m-typesetting.mkiv new file mode 100644 index 000000000..4456778ff --- /dev/null +++ b/tex/context/modules/mkiv/m-typesetting.mkiv @@ -0,0 +1,191 @@ +%D \module +%D [ file=m-typesetting, +%D version=2017.11.15, % reused from columnset style +%D title=\CONTEXT\ Modules, +%D subtitle=Typesetting pages, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] + +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\startmodule[typesetting] + +% \setupcombination +% [style=mono] + +\definecombination + [twopages] + +\definecombination + [fourpages] + [twopages] + [distance=.5\bodyfontsize, + width=\textwidth] + +\definecombination + [sixpages] + [twopages] + [distance=.5\bodyfontsize, + width=\textwidth] + +\definemeasure[firstpages][\dimexpr\dimexpr\textwidth-1 \bodyfontsize\relax/2\relax] +\definemeasure[twopages] [\dimexpr\dimexpr\textwidth-3 \bodyfontsize\relax/4\relax] +\definemeasure[fourpages] [\dimexpr\dimexpr\textwidth-3 \bodyfontsize\relax/4\relax] +\definemeasure[sixpages] [\dimexpr\dimexpr\textwidth-2.5\bodyfontsize\relax/6\relax] +\definemeasure[eightpages][\dimexpr\dimexpr\textwidth-3 \bodyfontsize\relax/4\relax] + +\starttexdefinition unexpanded WhenValidPage#1 + \ifnum#1>\noffigurepages\relax + \expandafter\gobbleoneargument + \else + \expandafter\firstofoneargument + \fi +\stoptexdefinition + +\starttexdefinition unexpanded OnePage #1 + \startlinecorrection[blank] + \startcombination[twopages][1*1] + {\typesetfile[#1.tex][page=1,lines=15]} {1} + \stopcombination + \stoplinecorrection +\stoptexdefinition + +\starttexdefinition unexpanded FirstPages #1 + \startlinecorrection[blank] + \startcombination[twopages][2*1] + {\typesetfile[#1.tex][page=1,width=\measure{firstpages}]} {1} + {\typesetfile[#1.tex][page=2,width=\measure{firstpages}]} {2} + \stopcombination + \stoplinecorrection +\stoptexdefinition + +\starttexdefinition unexpanded OneSpread #1 + \startlinecorrection[blank] + \startcombination[twopages][1*1] + {\typesetfile[#1.tex][page=2,lines=15]} {2} + \stopcombination + \stoplinecorrection +\stoptexdefinition + +\starttexdefinition unexpanded TwoPages #1 + \startlinecorrection[blank] + \startcombination[twopages][2*1] + {\typesetfile[#1.tex][page=1,width=\measure{twopages}]} {1} + {\typesetfile[#1.tex][page=2,width=\measure{twopages}]} {2} + \stopcombination + \stoplinecorrection +\stoptexdefinition + +\starttexdefinition unexpanded TwoSpread #1 + \startlinecorrection[blank] + \startcombination[twopages][2*1] + {\typesetfile[#1.tex][page=2,width=\measure{twopages}]} {2} + {\typesetfile[#1.tex][page=3,width=\measure{twopages}]} {3} + \stopcombination + \stoplinecorrection +\stoptexdefinition + +\starttexdefinition unexpanded FourPages #1 + \startlinecorrection[blank] + \startcombination[fourpages][4*1] + {\typesetfile[#1.tex][page=1,width=\measure{fourpages}]} {1} + {\WhenValidPage{2}{\typesetfile[#1.tex][page=2,width=\measure{fourpages}]}} {\WhenValidPage{2}{2}} + {\WhenValidPage{3}{\typesetfile[#1.tex][page=3,width=\measure{fourpages}]}} {\WhenValidPage{3}{3}} + {\WhenValidPage{4}{\typesetfile[#1.tex][page=4,width=\measure{fourpages}]}} {\WhenValidPage{4}{4}} + \stopcombination + \stoplinecorrection +\stoptexdefinition + +\starttexdefinition unexpanded FourPairs #1 + \startlinecorrection[blank] + \startcombination[fourpages][2*2] + {\typesetfile[#1.tex][page=1,width=\measure{firstpages}]} {1} + {\WhenValidPage{2}{\typesetfile[#1.tex][page=2,width=\measure{firstpages}]}} {\WhenValidPage{2}{2}} + {\WhenValidPage{3}{\typesetfile[#1.tex][page=3,width=\measure{firstpages}]}} {\WhenValidPage{3}{3}} + {\WhenValidPage{4}{\typesetfile[#1.tex][page=4,width=\measure{firstpages}]}} {\WhenValidPage{4}{4}} + \stopcombination + \stoplinecorrection +\stoptexdefinition + +% \starttexdefinition unexpanded FourPagesTwo #1#2 +% \startlinecorrection[blank] +% \startcombination[fourpages][4*1] +% {\typesetfile[#1.tex][page=1,width=\measure{fourpages}]} {1} +% {\WhenValidPage{2}{\typesetfile[#1.tex][page=2,width=\measure{fourpages}]}} {\WhenValidPage{2}{2}} +% {\typesetfile[#2.tex][page=1,width=\measure{fourpages}]} {1} +% {\WhenValidPage{2}{\typesetfile[#2.tex][page=2,width=\measure{fourpages}]}} {\WhenValidPage{2}{2}} +% \stopcombination +% \stoplinecorrection +% \stoptexdefinition + +\starttexdefinition unexpanded FourSpread #1 + \startlinecorrection[blank] + \startcombination[fourpages][4*1] + {\typesetfile[#1.tex][page=2,width=\measure{fourpages}]} {2} + {\WhenValidPage{3}{\typesetfile[#1.tex][page=3,width=\measure{fourpages}]}} {\WhenValidPage{3}{3}} + {\WhenValidPage{4}{\typesetfile[#1.tex][page=4,width=\measure{fourpages}]}} {\WhenValidPage{4}{4}} + {\WhenValidPage{5}{\typesetfile[#1.tex][page=5,width=\measure{fourpages}]}} {\WhenValidPage{5}{5}} + \stopcombination + \stoplinecorrection +\stoptexdefinition + +\starttexdefinition unexpanded SixPages #1 + \startlinecorrection[blank] + \startcombination[sixpages][6*1] + {\typesetfile[#1.tex][page=1,width=\measure{sixpages}]} {1} + {\WhenValidPage{2}{\typesetfile[#1.tex][page=2,width=\measure{sixpages}]}} {\WhenValidPage{2}{2}} + {\WhenValidPage{3}{\typesetfile[#1.tex][page=3,width=\measure{sixpages}]}} {\WhenValidPage{3}{3}} + {\WhenValidPage{4}{\typesetfile[#1.tex][page=4,width=\measure{sixpages}]}} {\WhenValidPage{4}{4}} + {\WhenValidPage{5}{\typesetfile[#1.tex][page=5,width=\measure{sixpages}]}} {\WhenValidPage{5}{5}} + {\WhenValidPage{6}{\typesetfile[#1.tex][page=6,width=\measure{sixpages}]}} {\WhenValidPage{6}{6}} + \stopcombination + \stoplinecorrection +\stoptexdefinition + +\starttexdefinition unexpanded SixSpread #1 + \startlinecorrection[blank] + \startcombination[sixpages][6*1] + {\typesetfile[#1.tex][page=2,width=\measure{sixpages}]} {2} + {\WhenValidPage{3}{\typesetfile[#1.tex][page=3,width=\measure{sixpages}]}} {\WhenValidPage{3}{3}} + {\WhenValidPage{4}{\typesetfile[#1.tex][page=4,width=\measure{sixpages}]}} {\WhenValidPage{4}{4}} + {\WhenValidPage{5}{\typesetfile[#1.tex][page=5,width=\measure{sixpages}]}} {\WhenValidPage{5}{5}} + {\WhenValidPage{6}{\typesetfile[#1.tex][page=6,width=\measure{sixpages}]}} {\WhenValidPage{6}{6}} + {\WhenValidPage{7}{\typesetfile[#1.tex][page=7,width=\measure{sixpages}]}} {\WhenValidPage{7}{7}} + \stopcombination + \stoplinecorrection +\stoptexdefinition + +\starttexdefinition unexpanded EightPages #1 + \startlinecorrection[blank] + \startcombination[fourpages][4*2] + {\typesetfile[#1.tex][page=1,width=\measure{eightpages}]} {#1 / 1} + {\WhenValidPage{2}{\typesetfile[#1.tex][page=2,width=\measure{eightpages}]}} {\WhenValidPage{2}{#1 / 2}} + {\WhenValidPage{3}{\typesetfile[#1.tex][page=3,width=\measure{eightpages}]}} {\WhenValidPage{3}{#1 / 3}} + {\WhenValidPage{4}{\typesetfile[#1.tex][page=4,width=\measure{eightpages}]}} {\WhenValidPage{4}{#1 / 4}} + {\WhenValidPage{5}{\typesetfile[#1.tex][page=5,width=\measure{eightpages}]}} {\WhenValidPage{5}{#1 / 5}} + {\WhenValidPage{6}{\typesetfile[#1.tex][page=6,width=\measure{eightpages}]}} {\WhenValidPage{6}{#1 / 6}} + {\WhenValidPage{7}{\typesetfile[#1.tex][page=7,width=\measure{eightpages}]}} {\WhenValidPage{7}{#1 / 7}} + {\WhenValidPage{8}{\typesetfile[#1.tex][page=8,width=\measure{eightpages}]}} {\WhenValidPage{8}{#1 / 8}} + \stopcombination + \stoplinecorrection +\stoptexdefinition + +\starttexdefinition unexpanded EightSpread #1 + \startlinecorrection[blank] + \startcombination[fourpages][4*2] + {\typesetfile[#1.tex][page=2,width=\measure{eightpages}]} {#1 / 2} + {\WhenValidPage{3}{\typesetfile[#1.tex][page=3,width=\measure{eightpages}]}} {\WhenValidPage{3}{#1 / 3}} + {\WhenValidPage{4}{\typesetfile[#1.tex][page=4,width=\measure{eightpages}]}} {\WhenValidPage{4}{#1 / 4}} + {\WhenValidPage{5}{\typesetfile[#1.tex][page=5,width=\measure{eightpages}]}} {\WhenValidPage{5}{#1 / 5}} + {\WhenValidPage{6}{\typesetfile[#1.tex][page=6,width=\measure{eightpages}]}} {\WhenValidPage{6}{#1 / 6}} + {\WhenValidPage{7}{\typesetfile[#1.tex][page=7,width=\measure{eightpages}]}} {\WhenValidPage{7}{#1 / 7}} + {\WhenValidPage{8}{\typesetfile[#1.tex][page=8,width=\measure{eightpages}]}} {\WhenValidPage{8}{#1 / 8}} + {\WhenValidPage{9}{\typesetfile[#1.tex][page=9,width=\measure{eightpages}]}} {\WhenValidPage{9}{#1 / 9}} + \stopcombination + \stoplinecorrection +\stoptexdefinition + +\stopmodule diff --git a/tex/context/modules/mkiv/s-abbreviations-mixed.mkiv b/tex/context/modules/mkiv/s-abbreviations-mixed.mkiv new file mode 100644 index 000000000..f7b2121d0 --- /dev/null +++ b/tex/context/modules/mkiv/s-abbreviations-mixed.mkiv @@ -0,0 +1,28 @@ +%D \module +%D [ file= s-abbreviations-mixed, % was: s-abr-04 +%D version=1996.01.01, +%D title=\CONTEXT\ Style File, +%D subtitle=General Abbreviations Mixed, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\unprotect + +\setupsorting + [logo] + [\c!style=\font_style_pseudoMixedCapped] + +\protect + +\startmodule[abbreviations-mixed] + +\usemodule[abbreviations-logos] +\usemodule[abbreviations-extras] + +\stopmodule + diff --git a/tex/context/modules/mkiv/s-abbreviations-pseudocaps.mkiv b/tex/context/modules/mkiv/s-abbreviations-pseudocaps.mkiv new file mode 100644 index 000000000..fa8606a7b --- /dev/null +++ b/tex/context/modules/mkiv/s-abbreviations-pseudocaps.mkiv @@ -0,0 +1,30 @@ +%D \module +%D [ file= s-abbreviations-pseudocaps, % was: s-abr-01 +%D version=1996.01.01, +%D title=\CONTEXT\ Style File, +%D subtitle=General Abbreviations Pseudocaps, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\unprotect + +\setupsorting + [logo] + [\c!style=\v!capital] + +\setupcapitals + [\c!title=\v!no] + +\protect + +\startmodule[abbreviations-pseudocaps] + +\usemodule[abbreviations-logos] +\usemodule[abbreviations-extras] + +\stopmodule diff --git a/tex/context/modules/mkiv/s-abbreviations-smallcaps.mkiv b/tex/context/modules/mkiv/s-abbreviations-smallcaps.mkiv new file mode 100644 index 000000000..2ce86ca33 --- /dev/null +++ b/tex/context/modules/mkiv/s-abbreviations-smallcaps.mkiv @@ -0,0 +1,31 @@ +%D \module +%D [ file= s-abbreviations-smallcaps, % was: s-abr-02 +%D version=1996.01.01, +%D title=\CONTEXT\ Style File, +%D subtitle=General Abbreviations Smallcaps, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\unprotect + +\setupsorting + [logo] + [\c!style=\v!smallcaps] + +\setupcapitals + [\c!title=\v!no] + +\protect + +\startmodule[abbreviations-smallcaps] + +\usemodule[abbreviations-logos] +\usemodule[abbreviations-extras] + +\stopmodule + diff --git a/tex/context/modules/mkiv/s-mod-02.mkiv b/tex/context/modules/mkiv/s-abbreviations-words.mkiv index 37e3d2f14..2b7d7cedc 100644 --- a/tex/context/modules/mkiv/s-mod-02.mkiv +++ b/tex/context/modules/mkiv/s-abbreviations-words.mkiv @@ -1,8 +1,8 @@ %D \module -%D [ file=s-mod-02, -%D version=very-old, +%D [ file= s-abbreviations-words, % was: s-abr-32 +%D version=1998.08.10, %D title=\CONTEXT\ Style File, -%D subtitle=Documentation Screen Environment, +%D subtitle=General Abbreviations Words, %D author=Hans Hagen, %D date=\currentdate, %D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] @@ -13,12 +13,16 @@ \unprotect -\startmode[nocode] +\setupsorting + [logo] + [\c!style=\v!WORD] - % \definieerbuffer[definition] % ignore +\protect - \def\startdefinition#1\stopdefinition{} +\startmodule[abbreviations-words] -\stopmode +\usemodule[abbreviations-logos] +\usemodule[abbreviations-extras] + +\stopmodule -\protect \endinput diff --git a/tex/context/modules/mkiv/s-art-01.mkiv b/tex/context/modules/mkiv/s-article-basic.mkiv index 601ee1adc..69a577961 100644 --- a/tex/context/modules/mkiv/s-art-01.mkiv +++ b/tex/context/modules/mkiv/s-article-basic.mkiv @@ -1,6 +1,19 @@ -\unprotect +%D \module +%D [ file=s-article-basic, +%D version=2010.01.01, % long ago, just for me +%D title=\CONTEXT\ Style File, +%D subtitle=Article Basic Setup, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\startmodule[article-basic] -\startmodule[art-01] +\unprotect \definemeasure [article:margin] [\paperheight/20] % was 15, see xtables-mkiv for results \definemeasure [overview:margin] [\paperheight/30] diff --git a/tex/context/modules/mkiv/s-def-01.mkiv b/tex/context/modules/mkiv/s-def-01.mkiv deleted file mode 100644 index 49e585bd0..000000000 --- a/tex/context/modules/mkiv/s-def-01.mkiv +++ /dev/null @@ -1,10 +0,0 @@ -% yes or no - -\unprotect - -\startsetups defaults:frontpart:pagenumbers:roman - \defineconversionset[\c!frontpart:\c!pagenumber][][romannumerals] - \setupuserpagenumber[\c!way=\v!by\v!block] -\stopsetups - -\protect diff --git a/tex/context/modules/mkiv/s-domotica-settings.lua b/tex/context/modules/mkiv/s-domotica-settings.lua index a564ddf0e..c7946666d 100644 --- a/tex/context/modules/mkiv/s-domotica-settings.lua +++ b/tex/context/modules/mkiv/s-domotica-settings.lua @@ -48,7 +48,7 @@ function moduledata.zwave.show_settings(pattern) end - if string.find(pattern,"%*") then + if string.find(pattern,"*",1,true) then local list = dir.glob(pattern) local last = nil diff --git a/tex/context/modules/mkiv/s-evohome.mkiv b/tex/context/modules/mkiv/s-evohome.mkiv new file mode 100644 index 000000000..1577517e5 --- /dev/null +++ b/tex/context/modules/mkiv/s-evohome.mkiv @@ -0,0 +1,295 @@ +%D \module +%D [ file=s-evohome, +%D version=2017.11.12, +%D title=\CONTEXT\ Style File, +%D subtitle=Evohome Graphics, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\setupbodyfont[dejavu] + +\starttext + +\startluacode + +local evohome = require("util-evo") + +moduledata.evohome = { } + +function moduledata.evohome.status(specification) + + local presets = evohome.helpers.loadpresets(specification.presets) + local zones = evohome.helpers.loadtemperatures(presets) + + -- todo : time + + if not zones then + context("no zones") + context.blank() + return + end + + local t = zones.time + + t = t and os.date("%Y-%m-%d %H:%M:%S",t) or "unknown time" + + context.starttitle { title = t } + + context.starttabulate { "|l|c|c|c|c|" } + context.BC() context("name") + context.BC() context("current") + context.BC() context("min") + context.BC() context("max") + context.BC() context("target") + context.NC() context.NR() + for i=1,#zones do + local zone = zones[i] + context.NC() context.word(zone.name) + context.NC() context("%0.1f",zone.current) + context.NC() context("%0.1f",zone.min) + context.NC() context("%0.1f",zone.max) + context.NC() context("%0.1f",zone.target) + context.NC() context.NR() + end + context.stoptabulate() + + for i=1,#zones do + local zone = zones[i] +-- evohome.helpers.updatezone(presets,zone.name) + local data = evohome.helpers.getzonestate(presets,zone.name) + local schedule = data and data.schedule or { } + context.startsubject { title = zone.name } + context.starttabulate { "|l|c|c|" } + context.BC() context("day") + context.BC() context("time") + context.BC() context("temperature") + context.NR() + local daily = schedule.dailySchedules + if daily then + for i=1,#daily do + local d = daily[i] + local s = d.switchpoints + if s then + for i=1,#s do + context.NC() + if i == 1 then + context.word(d.dayOfWeek) + end + context.NC() context(s[i].timeOfDay) + context.NC() context(s[i].temperature) + context.NC() context.NR() + end + end + end + end + context.stoptabulate() + context.stopsubject() + end + + context.stoptitle() + +end + +function moduledata.evohome.history(specification) + + local presets = evohome.helpers.loadpresets(specification.presets) + local zones = evohome.helpers.loadtemperatures(presets) + + if not zones then + context("no zones") + context.blank() + return + end + + local data = evohome.helpers.loadhistory(presets) + + if not zones then + context("no history") + return + end + + local years = data.years + + if not years then + context("no years") + return + end + + local minyear = specification.year or 2017 + local maxyear = minyear + local minmonth = specification.month or 1 + local maxmonth = specification.month or 12 + + local scale = 1/8 -- 20 + local mark = 3 + local abstemp = 25 + + for y=minyear,maxyear do + + local year = years[y] + + for m=minmonth,maxmonth do + + local month = year.months[m] + + if month then + + context.starttitle { title = "\\month{" .. m .. "}\\enspace" .. y } -- todo: function context.Month(m) end + + for i=1,#zones do + + local zone = zones[i] + local where = zone.name + local mintemp = zone.min + local maxtemp = zone.max + + -- context.startMPpage { offset = "10pt" } + context.startlinecorrection() + context.startMPcode() + context("linecap := butt; pickup pencircle scaled .5") + + context("fill (%s,%s) -- (%s,%s) -- (%s,%s) -- (%s,%s) -- cycle withcolor .8white ;", + 0, mintemp/scale, + 31 * 24, mintemp/scale, + 31 * 24, maxtemp/scale, + 0, maxtemp/scale + ) + + for i=0,abstemp do + context("draw (%s,%s) -- (%s,%s) withcolor .6white ;", + 0, i/scale, + 31 * 24, i/scale + ) + end + + local days = month.days + if days then + local nd = os.nofdays(y,m) + for d=1,nd do + local day = days[d] + local xoffset = (d-1) * 24 + local wd = os.weekday(d,m,y) + local weekend = wd == 1 or wd == 7 + if not weekend then + -- okay + elseif mark == 1 then + context("draw (%s,%s) -- (%s,%s) ; ",xoffset, -17.5,xoffset, -32.5) + context("draw (%s,%s) -- (%s,%s) ; ",xoffset+24,-17.5,xoffset+24,-32.5) + elseif mark == 2 then + context("draw (%s,%s) -- (%s,%s) ; ",xoffset, -17.5,xoffset+24,-17.5) + context("draw (%s,%s) -- (%s,%s) ; ",xoffset, -32.5,xoffset+24,-32.5) + elseif mark == 3 then + context("draw unitsquare xysized (%s,%s) shifted (%s,%s) ; ",24,15,xoffset,-32.5) + end + context([[draw textext("%s") shifted (%s,%s) ; ]],d,xoffset + 12,-25) + if day then + for h=0,23 do + local hours = day.hours + if hours then + local hour = hours[h] + if hour then + local a = 0 + local n = 0 + local m = 0 + for minute, d in next, hour do + local v = d[where] + a = a + v + n = n + 1 + if v > m then + m = v + end + end + a = a / n + local dx = xoffset + h + local dy = a/scale + local dm = m/scale + context("draw (%s,%s) -- (%s,%s) withcolor %s ; ", + dx, 0,dx,dy,weekend and "darkmagenta" or "darkblue") + context("draw (%s,%s) -- (%s,%s) withcolor %s ; ", + dx,dy,dx,dm,"darkred") + end + end + end + end + end + for d=0,30 do + local xoffset = d * 24 + context("draw (%s,%s) -- (%s,%s) withcolor darkgray ; ",xoffset+ 0,0,xoffset+ 0,-10) + context("draw (%s,%s) -- (%s,%s) withcolor darkgray ; ",xoffset+ 6,0,xoffset+ 6,-2.5) + context("draw (%s,%s) -- (%s,%s) withcolor darkgray ; ",xoffset+12,0,xoffset+12,-5) + context("draw (%s,%s) -- (%s,%s) withcolor darkgray ; ",xoffset+18,0,xoffset+18,-2.5) + end + local xoffset = 31 * 24 + context("draw (%s,%s) -- (%s,%s) withcolor darkgray ; ",xoffset,0,xoffset,-10) + end + + for i=0,abstemp,5 do + context([[draw textext.lft("%s") shifted (%s,%s) ; ]],i,-10,i/scale) + context("draw (%s,%s) -- (%s,%s) withcolor .2white ;",0,i/scale,31 * 24,i/scale) + end + + context([[draw textext("\strut\month{%s}\enspace%s\enspace:\enspace%s") shifted (%s,%s) ; ]], m, y, where, 31 * 24 / 2, -50) + context([[draw textext.lft("\textdegree{}C") shifted (%s,%s) ; ]],-10,-25) + + context("currentpicture := currentpicture xsized TextWidth") ; + + context.stopMPcode() + context.stoplinecorrection() + -- context.stopMPpage() + end + + context.stoptitle() + + end + + end + + end + +end + +\stopluacode + +\continueifinputfile{s-evohome.mkiv} + +\usemodule[art-01] + +\setuplayout + [article] + [footer=0cm, + header=1cm, + topspace=5mm, + bottomspace=5mm] + +\starttext + + \startluacode + + -- os.execute([[mtxrun --script evohome --collect --presets=c:/data/develop/domotica/code/evohome-presets.lua]]) + + -- local specification = { + -- year = 2017, + -- -- month = 11, + -- presets = "c:/data/develop/domotica/evohome/evohome-presets.lua", + -- } + + -- moduledata.evohome.status (specification) + -- moduledata.evohome.history(specification) + + local specification = { + year = 2018, + -- month = 11, + presets = "c:/data/develop/domotica/evohome/evohome-presets.lua", + } + + -- moduledata.evohome.status (specification) + moduledata.evohome.history(specification) + + \stopluacode + +\stoptext diff --git a/tex/context/modules/mkiv/s-fnt-10.mkiv b/tex/context/modules/mkiv/s-fnt-10.mkiv deleted file mode 100644 index 731c4be39..000000000 --- a/tex/context/modules/mkiv/s-fnt-10.mkiv +++ /dev/null @@ -1,169 +0,0 @@ -%D \module -%D [ file=s-fnt-01, -%D version=2006.10.10, % guess -%D title=\CONTEXT\ Style File, -%D subtitle=Listing Glyphs in Large Fonts, -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] -%C -%C This module is part of the \CONTEXT\ macro||package and is -%C therefore copyrighted by \PRAGMA. See mreadme.pdf for -%C details. - -% sort of obsolete - -\startluacode -local fontdata = fonts.hashes.identifiers - --- function fonts.tracers.show_all() --- local tfmdata = fontdata[font.current()] --- if tfmdata and tfmdata.shared then --- local NC, NR, char = context.NC, context.NR, context.char --- context.starttabulate { "|l|r|c|" } --- for unicode, description in fonts.iterators.characters(tfmdata) do --- NC() context(description.name) NC() context(unicode) NC() char(unicode) NC() NR() --- end --- context.stoptabulate() --- end --- end - -local context = context -local escaped = context.escaped - -function fonts.tracers.show_all() - local tfmdata = fontdata[font.current()] - if tfmdata then - local NC, NR, HL, char, bold, tttf = context.NC, context.NR, context.HL, context.char, context.bold, context.tttf - local descriptions = tfmdata.descriptions or { } - local data = characters.data - -- context.setuptabulate { header = "repeat" } - context.starttabulatehead() - NC() bold("unicode") - NC() bold("visual") - NC() bold("index") - NC() bold("glyph") - NC() bold("adobe") - NC() bold("context") - NC() NR() - context.stoptabulatehead() - context.starttabulate { "|l|c|l|p|p|p|" } - for unicode, chr in fonts.iterators.characters(tfmdata) do - local des, dat = descriptions[unicode], data[unicode] - local index = chr.index or 0 - local cname = (dat and dat.contextname) or "" - local aname = (dat and dat.adobename) or "" - local gname = (des and des.name) or "" - local mname = dat and dat.mathname - if type(mname) ~= "string" then - mname = "" - end - local mspec = dat and dat.mathspec - if mspec then - for m=1,#mspec do - local n = mspec[m].name - if n then - if mname == "" then - mname = n - else - mname = mname .. " " .. n - end - end - end - end - if mname ~= "" then - mname = "m: " .. mname - if cname ~= "" then - cname = cname .. " " .. mname - else - cname = mname - end - end - NC() tttf() context("U+%05X",unicode) - NC() char(unicode) - NC() tttf() context("%05X",index) - NC() if gname ~= "" then tttf() escaped(gname) end - NC() if aname ~= "" then tttf() context(aname) end - NC() if cname ~= "" then tttf() context(cname) end - NC() NR() - end - context.stoptabulate() - else - context("problems") - end -end - -function fonts.tracers.show_glyphs() - local tfmdata = fontdata[font.current()] - if tfmdata then - for unicode, chr in fonts.iterators.characters(tfmdata) do - context.showglyph(unicode) - end - end -end -\stopluacode - -\unexpanded\def\ShowCompleteFont#1#2#3% - {\bgroup - \page - \font\TestFont=#1 at #2 - \setuplayout[style=\TestFont] - \setupheadertexts[] - \setupfootertexts[#1 -- \pagenumber] - \setupfootertexts[pagenumber] - \setuplayout[width=middle,height=middle,topspace=1cm,backspace=1cm] - \TestFont - \nonknuthmode - \startcolumns[n=#3] - \TestFont - \ctxlua { fonts.tracers.show_all() } - \stopcolumns - \page - \egroup} - -\unexpanded\def\ShowAllGlyphs#1#2#3% - {\bgroup - \page - \def\showglyph##1{\dontleavehmode\strut\char##1\relax\par} - \font\TestFontA=#1 at 12pt - \font\TestFontB=#1 at #2 - \setuplayout[style=\TestFontA] - \setupheadertexts[] - \setupfootertexts[#1\space\endash\space\pagenumber] - \setuplayout[width=middle,height=middle,topspace=1cm,backspace=1cm,header=1cm,footer=2cm] - \TestFontB \setupinterlinespace[line=1.2\dimexpr#2\relax] \raggedcenter - \nonknuthmode - \startcolumns[n=#3] - \TestFontB - \ctxlua { fonts.tracers.show_glyphs() } - \stopcolumns - \page - \egroup} - -\continueifinputfile{s-fnt-10.mkiv} - -\starttext - -% \ShowCompleteFont{name:dejavusansmono}{10pt}{1} -% \ShowCompleteFont{name:dejavuserif}{10pt}{2} -% \ShowCompleteFont{name:officinasansbookitcregular}{10pt}{2} -% \ShowCompleteFont{name:officinaserifbookitcregular}{10pt}{2} -% \ShowCompleteFont{name:serpentineserifeflight}{10pt}{2} -\ShowCompleteFont{name:lmroman10-regular}{10pt}{1} -% \ShowCompleteFont{name:lmtypewriter10-regular}{10pt}{2} -% \ShowCompleteFont{lt55485}{10pt}{2} -% \ShowCompleteFont{lmr10}{10pt}{2} -% \ShowCompleteFont{lbr}{10pt}{2} -% \ShowCompleteFont{name:Cambria}{10pt}{2} -% \ShowCompleteFont{name:CambriaMath}{10pt}{2} -% \ShowCompleteFont{name:texgyrepagella-regular}{10pt}{2} -% \ShowCompleteFont{name:texgyrechorus-mediumitalic}{10pt}{2} -% \ShowAllGlyphs {name:texgyrepagella-regular} {48pt}{2} -% \ShowAllGlyphs {name:texgyrechorus-mediumitalic}{48pt}{2} -% \ShowCompleteFont{name:euler10-regular}{10pt}{2} - -% \ShowCompleteFont{name:palatinosansinformalcombold}{20pt}{2} -% \ShowCompleteFont{name:palatinonovaregular}{11pt}{2} -% \ShowCompleteFont{pirat.ttf}{12pt}{1} - -\stoptext diff --git a/tex/context/modules/mkiv/s-fnt-21.mkiv b/tex/context/modules/mkiv/s-fnt-21.mkiv deleted file mode 100644 index 10d5a4623..000000000 --- a/tex/context/modules/mkiv/s-fnt-21.mkiv +++ /dev/null @@ -1,64 +0,0 @@ -%D \module -%D [ file=s-fnt-20, -%D version=2009.01.10, -%D title=\CONTEXT\ Style File, -%D subtitle=Tracing Feature Application (2), -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] -%C -%C This module is part of the \CONTEXT\ macro||package and is -%C therefore copyrighted by \PRAGMA. See mreadme.pdf for -%C details. - -%D This module is related to: - -\usemodule[fnt-20] - -\setvariables - [otftracker] - [set=\setups{araball}] - -\startsetups araball - \begingroup - \setupcolors[state=start]% - \enabletrackers[otf.analyzing]% beware, kind of global - \ruledhbox \bgroup - \definedfont[\getvariable{otftracker}{font}*\getvariable{otftracker}{features} at \getvariable{otftracker}{size}]% - \ifnum\getvariable{otftracker}{direction}<0 \textdir TRT\else\ifnum\getvariable{otftracker}{direction}>0 \textdir TLT\fi\fi\relax - \getvariable{otftracker}{sample}% - \egroup - \disabletrackers[otf.analyzing]% - \endgroup -\stopsetups - -\unexpanded\def\ShowOtfTrackerSample#1% - {\doiffile{#1} - {\blank - \startlinecorrection - \vbox \bgroup - \forgetall - \setbox\scratchbox\hbox{\component #1 \relax} - \hbox{\copy\scratchbox\quad\lower\dp\scratchbox\hbox{\ruledhbox{\externalfigure[#1-volt.pdf][height=\htdp\scratchbox]}}} - \hbox{\strut\tttf#1}% - \egroup - \stoplinecorrection - \blank}} - -\endinput - -% \usemodule[fnt-21] -% -% \starttext -% -% \setvariables -% [otftracker] -% [direction=-1, -% sample=لا, -% title=Test, -% font=file:arabtype, -% % font=file:husayni, -% % font=file:scheherazaderegot, -% features=arabic] -% -% \stoptext diff --git a/tex/context/modules/mkiv/s-fnt-24.mkiv b/tex/context/modules/mkiv/s-fonts-cjk.mkiv index 2e6b9a591..fae041316 100644 --- a/tex/context/modules/mkiv/s-fnt-24.mkiv +++ b/tex/context/modules/mkiv/s-fonts-cjk.mkiv @@ -1,5 +1,5 @@ %D \module -%D [ file=s-fnt-24, +%D [ file=s-fonts-cjk, % was: s-fnt-24 %D version=2009.02.06, %D title=\CONTEXT\ Style File, %D subtitle=CJK Glyph Combination Testing, @@ -11,9 +11,11 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. +\startmodule[fonts-cjk] + \unprotect -\def\ShowChineseCombiChar#1#2#3#4% +\unexpanded\def\ShowChineseCombiChar#1#2#3#4% {\blank[small] \dontleavehmode \hbox\bgroup @@ -71,7 +73,7 @@ end \unexpanded\def\ShowCombinationsChinese {\dodoubleempty\doShowCombinationsChinese} -\def\doShowCombinationsChinese[#1][#2]% +\unexpanded\def\doShowCombinationsChinese[#1][#2]% {\startpacked \setscript[hanzi] \setupcolors[\c!state=\v!start] @@ -80,4 +82,6 @@ end \disabletrackers[cjk.analyzing] \stoppacked} +\stopmodule + \protect \endinput diff --git a/tex/context/modules/mkiv/s-fonts-complete.mkiv b/tex/context/modules/mkiv/s-fonts-complete.mkiv new file mode 100644 index 000000000..afdd79b4c --- /dev/null +++ b/tex/context/modules/mkiv/s-fonts-complete.mkiv @@ -0,0 +1,160 @@ +%D \module +%D [ file=s-fnt-01, +%D version=2006.10.10, % guess +%D title=\CONTEXT\ Style File, +%D subtitle=Listing Glyphs in Large Fonts, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +%D This module is sort of obsolete as other moduels give nicer overviews. + +\startluacode + moduledata.fonts = moduledata.fonts or { } + moduledata.fonts.complete = moduledata.fonts.complete or { } + + local fontdata = fonts.hashes.identifiers + + local context = context + local escaped = context.escaped + + function moduledata.fonts.complete.all() + local tfmdata = fontdata[true] + if tfmdata then + local NC, NR, HL, char, bold, tttf = context.NC, context.NR, context.HL, context.char, context.bold, context.tttf + local descriptions = tfmdata.descriptions or { } + local data = characters.data + -- context.setuptabulate { header = "repeat" } + context.starttabulatehead() + NC() bold("unicode") + NC() bold("visual") + NC() bold("index") + NC() bold("glyph") + NC() bold("adobe") + NC() bold("context") + NC() NR() + context.stoptabulatehead() + context.starttabulate { "|l|c|l|p|p|p|" } + for unicode, chr in fonts.iterators.characters(tfmdata) do + local des, dat = descriptions[unicode], data[unicode] + local index = chr.index or 0 + local cname = (dat and dat.contextname) or "" + local aname = (dat and dat.adobename) or "" + local gname = (des and des.name) or "" + local mname = dat and dat.mathname + if type(mname) ~= "string" then + mname = "" + end + local mspec = dat and dat.mathspec + if mspec then + for m=1,#mspec do + local n = mspec[m].name + if n then + if mname == "" then + mname = n + else + mname = mname .. " " .. n + end + end + end + end + if mname ~= "" then + mname = "m: " .. mname + if cname ~= "" then + cname = cname .. " " .. mname + else + cname = mname + end + end + NC() tttf() context("U+%05X",unicode) + NC() char(unicode) + NC() tttf() context("%05X",index) + NC() if gname ~= "" then tttf() escaped(gname) end + NC() if aname ~= "" then tttf() context(aname) end + NC() if cname ~= "" then tttf() context(cname) end + NC() NR() + end + context.stoptabulate() + else + context("problems") + end + end + + function moduledata.fonts.complete.glyphs() + local tfmdata = fontdata[true] + if tfmdata then + for unicode, chr in fonts.iterators.characters(tfmdata) do + context.showglyph(unicode) + end + end + end +\stopluacode + +\unexpanded\def\ShowCompleteFont#1#2#3% + {\begingroup + \page + \font\TestFont=#1 at #2 + \setuplayout[style=\TestFont] + \setupheadertexts[] + \setupfootertexts[#1 -- \pagenumber] + \setupfootertexts[pagenumber] + \setuplayout[width=middle,height=middle,topspace=1cm,backspace=1cm] + \TestFont + \nonknuthmode + \startcolumns[n=#3] + \TestFont + \ctxlua { moduledata.fonts.complete.all() } + \stopcolumns + \page + \endgroup} + +\unexpanded\def\ShowAllGlyphs#1#2#3% + {\begingroup + \page + \def\showglyph##1{\dontleavehmode\strut\char##1\relax\par} + \font\TestFontA=#1 at 12pt + \font\TestFontB=#1 at #2 + \setuplayout[style=\TestFontA] + \setupheadertexts[] + \setupfootertexts[#1\space\endash\space\pagenumber] + \setuplayout[width=middle,height=middle,topspace=1cm,backspace=1cm,header=1cm,footer=2cm] + \TestFontB \setupinterlinespace[line=1.2\dimexpr#2\relax] \raggedcenter + \nonknuthmode + \startcolumns[n=#3] + \TestFontB + \ctxlua { moduledata.fonts.complete.glyphs() } + \stopcolumns + \page + \endgroup} + +\continueifinputfile{s-fonts-complete.mkiv} + +\starttext + +% \ShowCompleteFont{name:dejavusansmono}{10pt}{1} +% \ShowCompleteFont{name:dejavuserif}{10pt}{2} +% \ShowCompleteFont{name:officinasansbookitcregular}{10pt}{2} +% \ShowCompleteFont{name:officinaserifbookitcregular}{10pt}{2} +% \ShowCompleteFont{name:serpentineserifeflight}{10pt}{2} +\ShowCompleteFont{name:lmroman10-regular}{10pt}{1} +% \ShowCompleteFont{name:lmtypewriter10-regular}{10pt}{2} +% \ShowCompleteFont{lt55485}{10pt}{2} +% \ShowCompleteFont{lmr10}{10pt}{2} +% \ShowCompleteFont{lbr}{10pt}{2} +% \ShowCompleteFont{name:Cambria}{10pt}{2} +% \ShowCompleteFont{name:CambriaMath}{10pt}{2} +% \ShowCompleteFont{name:texgyrepagella-regular}{10pt}{2} +% \ShowCompleteFont{name:texgyrechorus-mediumitalic}{10pt}{2} +% \ShowAllGlyphs {name:texgyrepagella-regular} {48pt}{2} +% \ShowAllGlyphs {name:texgyrechorus-mediumitalic}{48pt}{2} +% \ShowCompleteFont{name:euler10-regular}{10pt}{2} + +% \ShowCompleteFont{name:palatinosansinformalcombold}{20pt}{2} +% \ShowCompleteFont{name:palatinonovaregular}{11pt}{2} +% \ShowCompleteFont{pirat.ttf}{12pt}{1} + +\stoptext diff --git a/tex/context/modules/mkiv/s-fonts-coverage.lua b/tex/context/modules/mkiv/s-fonts-coverage.lua index dd772d5f0..2408fc9a3 100644 --- a/tex/context/modules/mkiv/s-fonts-coverage.lua +++ b/tex/context/modules/mkiv/s-fonts-coverage.lua @@ -19,19 +19,37 @@ local char, bold, getvalue = context.char, context.bold, context.getvalue local chardata = characters.data -function moduledata.fonts.coverage.showcomparison(specification) +function moduledata.fonts.coverage.showdifference(specification) + moduledata.fonts.coverage.showcomparison(specification,true) +end + +function moduledata.fonts.coverage.showcomparison(specification,difference) specification = interfaces.checkedspecification(specification) local fontfiles = utilities.parsers.settings_to_array(specification.list or "") local pattern = upper(specification.pattern or "") + local slot = specification.slot or "" local present = { } local names = { } local files = { } local chars = { } + local slots = false - if not pattern then + if slot ~= "" then + slot = utilities.parsers.settings_to_array(slot) + for i=1,#slot do + local s = tonumber(slot[i]) + if not s then + -- next one + elseif slots then + slots[s] = true + else + slots = { [s] = true } + end + end + elseif not pattern then -- skip elseif pattern == "" then pattern = nil @@ -80,11 +98,13 @@ function moduledata.fonts.coverage.showcomparison(specification) table.concat(t," ") } - context.starttabulate { "|Tl" .. string.rep("|c",#names) .. "|Tl|" } + local nofnames = #names + + context.starttabulate { "|Tl" .. string.rep("|c",nofnames) .. "|Tl|" } NC() bold("unicode") NC() - for i=1,#names do + for i=1,nofnames do bold(i) NC() end @@ -93,17 +113,35 @@ function moduledata.fonts.coverage.showcomparison(specification) NR() HL() for k, v in table.sortedpairs(present) do - if k <= 0 then + local skip = false + if difference then + local n = 0 + for i=1,nofnames do + if chars[i][k] then + n= n + 1 + end + end + skip = n == nofnames + end + if skip then + -- ignore + elseif k <= 0 then -- ignore elseif k >= 0x110000 then logs.report("warning","weird character %U",k) else local description = chardata[k].description - if not pattern or (pattern == k) or (description and lpegmatch(pattern,description)) then + local wantedslot = true + if slots then + wantedslot = slots[k] + elseif pattern then + wantedslot = pattern == k or (description and lpegmatch(pattern,description)) + end + if wantedslot then NC() context("%05X",k) NC() - for i=1,#names do + for i=1,nofnames do getvalue(names[i]) if chars[i][k] then char(k) diff --git a/tex/context/modules/mkiv/s-fonts-coverage.mkiv b/tex/context/modules/mkiv/s-fonts-coverage.mkiv index 305bb9b7b..98a5c00a4 100644 --- a/tex/context/modules/mkiv/s-fonts-coverage.mkiv +++ b/tex/context/modules/mkiv/s-fonts-coverage.mkiv @@ -25,6 +25,7 @@ \registerctxluafile{s-fonts-coverage}{} \installmodulecommandluasingle \showfontcomparison {moduledata.fonts.coverage.showcomparison} +\installmodulecommandluasingle \showfontdifference {moduledata.fonts.coverage.showdifference} \stopmodule diff --git a/tex/context/modules/mkiv/s-fonts-engines.mkiv b/tex/context/modules/mkiv/s-fonts-engines.mkiv new file mode 100644 index 000000000..1b1f664b8 --- /dev/null +++ b/tex/context/modules/mkiv/s-fonts-engines.mkiv @@ -0,0 +1,196 @@ +%D \module +%D [ file=s-fonts-engines, % was: s-fnt-22 +%D version=2017.06.21, +%D title=\CONTEXT\ Style File, +%D subtitle=Compare engines and such, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +%D This module is just for me when I wanted to check some husayni (by Idris) +%D regression. Interesting is that fina should be disabled for hb (otherwise +%D garbage) and that some substitutions are ignored in hb (1.1.3), so we can +%D only compare some examples. Don't expect this style to be stable as I +%D might change default features. + +\startmodule[fonts-engines] + +\usemodule[fonts-steps] +\usemodule[fonts-plugins] + +\enabletrackers[fonts.reorderlookups] + +\startsetups otftracker-extra-context + \definedfont[\getvariable{otftracker}{font}*\getvariable{otftracker}{features} at \getvariable{otftracker}{size}]\relax + \setotfcompositiondirection{\getvariable{otftracker}{direction}}\relax + \getvariable{otftracker}{sample}\relax +\stopsetups + +\startsetups otftracker-extra-context-reordered + \definedfont[\getvariable{otftracker}{font}*otftracker-context-reordered at \getvariable{otftracker}{size}]\relax + \setotfcompositiondirection{\getvariable{otftracker}{direction}}\relax + \getvariable{otftracker}{sample}\relax +\stopsetups + +\startsetups otftracker-extra-harfbuzz + \definedfont[\getvariable{otftracker}{font}*otftracker-harfbuzz-native at \getvariable{otftracker}{size}]\relax + \setotfcompositiondirection{\getvariable{otftracker}{direction}}\relax + \getvariable{otftracker}{sample}\relax +\stopsetups + +\startsetups otftracker-extra-uniscribe + \definedfont[\getvariable{otftracker}{font}*otftracker-harfbuzz-uniscribe at \getvariable{otftracker}{size}]\relax + \setotfcompositiondirection{\getvariable{otftracker}{direction}}\relax + \getvariable{otftracker}{sample}\relax +\stopsetups + +\definecolor[otftracker-overlay-1][a=1,t=.5,b=1] +\definecolor[otftracker-overlay-2][a=1,t=.5,g=1] +\definecolor[otftracker-overlay-3][a=1,t=.5,r=1] + +% This is a sort of a check against xetex but with limited font trickery because we bypass +% the normal font handling. It's no big deal for a test. The biggest problem is that we +% run into default features and we don't know what is turned on by default. We also need +% to disable tagging so that hb itself can do some (init/medi/fina) magic in setting +% features. + +\startsetups otftracker-extra + \start + \blank + \definefontfeature + [otftracker-context-reordered] + [\getvariable{otftracker}{features}] + [reorderlookups=arab] + \definefontfeature + [otftracker-harfbuzz-uniscribe] + [\getvariable{otftracker}{features}] + [mode=plug, + features=harfbuzz, + shaper=uniscribe, + % stch=nothing, + % ccmp=nothing, + % locl=nothing, + % rlig=nothing, + % calt=nothing, + % mset=nothing, + fina=nothing, % looks like the libs does something special + init=nothing, % looks like the libs does something special + medi=nothing, % looks like the libs does something special + isol=nothing, % looks like the libs does something special + % method=binary, + script=arabic] + \definefontfeature + [otftracker-harfbuzz-native] + [\getvariable{otftracker}{features}] + [mode=plug, + features=harfbuzz, + shaper=native, + % stch=nothing, + % ccmp=nothing, + % locl=nothing, + % rlig=nothing, + % calt=nothing, + % mset=nothing, + fina=nothing, % looks like the libs does something special + init=nothing, % looks like the libs does something special + medi=nothing, % looks like the libs does something special + isol=nothing, % looks like the libs does something special + script=arabic] + \doifelsesomething {\getvariable{otftracker}{comment}} { + \def\ExtraComment{ + \TB + \NC + comment + \NC + \vtop { + \hsize\dimexpr\hsize-10em\relax + \veryraggedright + \getvariable{otftracker}{comment} + } + \NC \NR + } + } { + \def\ExtraComment{} + } + \starttabulate[|lTB|l|] + \NC + context + \NC + \showglyphs \showfontkerns + \enabletrackers[otf.sample.silent] + \ruledhbox{\directsetup{otftracker-extra-context}} + \disabletrackers[otf.sample] + \NC \NR \TB \NC + reordered + \NC + \showglyphs \showfontkerns + \enabletrackers[otf.sample.silent] + \ruledhbox{\directsetup{otftracker-extra-context-reordered}} + \disabletrackers[otf.sample] + \NC \NR \TB \NC + harfbuzz + \NC + \showglyphs \showfontkerns + \enabletrackers[fonts.plugins.hb.colors] + \ruledhbox{\directsetup{otftracker-extra-harfbuzz}} + \disabletrackers[fonts.plugins.hb.colors] + \NC \NR \TB \NC + uniscribe + \NC + \showglyphs \showfontkerns + \enabletrackers[fonts.plugins.hb.colors] + \ruledhbox{\directsetup{otftracker-extra-uniscribe}} + \disabletrackers[fonts.plugins.hb.colors] + \NC \NR \TB \NC + context + \NC + \showglyphs \showfontkerns + \ruledhbox{\directsetup{otftracker-extra-context}} + \NC \NR \TB \NC + harfbuzz + \NC + \showglyphs \showfontkerns + \ruledhbox{\directsetup{otftracker-extra-harfbuzz}} + \NC \NR \TB \NC + uniscribe + \NC + \showglyphs \showfontkerns + \ruledhbox{\directsetup{otftracker-extra-uniscribe}} + \NC \NR \TB \NC + context harfbuzz + \NC + \showglyphs \showfontkerns + \hbox to \zeropoint { + \ruledhbox{\color[otftracker-overlay-1]{\directsetup{otftracker-extra-harfbuzz}}} + \hss + } + \ruledhbox{\color[otftracker-overlay-3]{\directsetup{otftracker-extra-context}}} + \NC \NR \TB \NC + uniscribe harfbuzz + \NC + \showglyphs \showfontkerns + \hbox to \zeropoint { + \ruledhbox{\color[otftracker-overlay-1]{\directsetup{otftracker-extra-harfbuzz}}} + \hss + } + \ruledhbox{\color[otftracker-overlay-2]{\directsetup{otftracker-extra-uniscribe}}} + \NC \NR \TB \NC + context uniscribe + \NC + \showglyphs \showfontkerns + \hbox to \zeropoint { + \ruledhbox{\color[otftracker-overlay-1]{\directsetup{otftracker-extra-uniscribe}}} + \hss + } + \ruledhbox{\color[otftracker-overlay-2]{\directsetup{otftracker-extra-context}}} + \NC \NR + \ExtraComment + \stoptabulate + \stop +\stopsetups + +\stopmodule diff --git a/tex/context/modules/mkiv/s-fonts-kerns.mkiv b/tex/context/modules/mkiv/s-fonts-kerns.mkiv new file mode 100644 index 000000000..c3a5637c3 --- /dev/null +++ b/tex/context/modules/mkiv/s-fonts-kerns.mkiv @@ -0,0 +1,215 @@ +%D \module +%D [ file=s-fonts-kerns, +%D version=2018.02.20, % was s-fnt-40 (given the kin dof code < 2010) +%D title=\CONTEXT\ Style File, +%D subtitle=Show Fonts Kerns, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +%D This is real old code but we keep it around for educational purposes. it's +%D not that efficient and we have better ways. +%D +%D \starttyping +%D \showfontkerns +%D \stoptyping +%D +%D This one shows all kerns so it's s bit different and as we use it in the +%D manual \unknown + +\startluacode + + local nodecodes = nodes.nodecodes + + local disc_code = nodecodes.disc + local kern_code = nodecodes.kern + local glyph_code = nodecodes.glyph + local hlist_code = nodecodes.hlist + + -- local function flatten(l) + -- while l do + -- local id = l.id + -- if id == disc_code then + -- local r = l.replace + -- if r then + -- local p = l.prev + -- local n = l.next + -- if n and p and n.id == glyph_code and p.id == glyph_code then + -- local s = node.slide(r) + -- p.next = r + -- n.prev = s + -- r.prev = p + -- s.next= n + -- l.replace = nil + -- node.free(l) + -- end + -- end + -- elseif id == hlist_code then + -- flatten(l.list) + -- end + -- l = l.next + -- end + -- end + + local function mark(l,c) + while l do + local id = l.id + if id == kern_code then + context.showkern(l.kern,c) + elseif id == disc_code then + mark(l.pre,2) + mark(l.post,3) + mark(l.replace,4) + elseif id == hlist_code then + mark(l.list,c) + end + l = l.next + end + end + + local function collect(l) + local m = { } + while l do + local id = l.id + if id == hlist_code then + m[#m+1] = l + end + l = l.next + end + return m + end + + local function inject(l,m,i) + local x = l + i = i or 0 + while l do + local id = l.id + if id == kern_code then + i = i + 1 + node.insert_before(x,l,node.copy(m[i])) + elseif id == disc_code then + i = inject(l.pre,m,i) + i = inject(l.post,m,i) + i = inject(l.replace,m,i) + elseif id == hlist_code then + i = inject(l.list,m,i) + end + l = l.next + end + return i + end + + moduledata.fonts = moduledata.fonts or { } + moduledata.fonts.kerns = moduledata.fonts.kerns or { } + + function moduledata.fonts.kerns._show_(n) + inject(tex.box[n].list,collect(tex.box[6].list)) + end + + function moduledata.fonts.kerns.show(n) + context("\\bgroup") + context("\\setbox6\\vbox\\bgroup\\forgetall") + -- flatten(tex.box[n].list) + mark(tex.box[n].list,1) + context("\\egroup") + context("\\ctxlua{moduledata.fonts.kerns._show_('%s')}",n) + context("\\egroup") + end + +\stopluacode + +\setupcolors[state=start] + +\definefont[VerySmall][Mono at 4pt] + +\definecolor[kern:0][s=.5] +\definecolor[kern:1][b=.5] +\definecolor[kern:2][r=.5] +\definecolor[kern:3][g=.5] +\definecolor[kern:4][r=.5,g=.5] + +\def\showkernwidthfactor{1} + +\newconditional\showkernstate +\settrue \showexplicitkerns + +\unexpanded\def\showkern#1#2% + {\begingroup + \dontcomplain + \setbox\scratchbox\hbox to \zeropoint \bgroup + \ifcase#2\or + \ifconditional\showkernstate + \color[kern:0]{\dovlwdhtdp\showkernwidthfactor{0.75}{0.5}}% + \global\setfalse\showkernstate + \raise.8\strutht + \else + \color[kern:0]{\dovlwdhtdp\showkernwidthfactor{1.05}{0.5}}% + \global\settrue\showkernstate + \raise1.1\strutht + \fi + \else\ifconditional\showexplicitkerns % if other kerns + \color[kern:0]{\dovlwdhtdp\showkernwidthfactor{0.75}{0.5}}% + \lower1.2\strutdp + \fi\fi + \hbox to 0pt{\hss\VerySmall\color[kern:#2]{\expandafter\withoutpt\the\dimexpr#1sp}\hss}% + \egroup + \smashbox\scratchbox + \box\scratchbox + \endgroup + \par} + +\newbox\KernBox + +\unexpanded\def\ShowKerns#1% + {\global\setfalse + \showkernstate\ctxlua{moduledata.fonts.kerns.show("#1")}} + +\unexpanded\def\ShowKernedVBox#1% + {\global\setfalse\showkernstate + \setbox\KernBox\vbox{#1}% + \ShowKerns{KernBox}% + \unvbox\KernBox} + +\unexpanded\def\ShowKernedHBox#1% + {\global\setfalse\showkernstate + \setbox\KernBox\hbox{#1}% + \ShowKerns{KernBox}% + \unhbox\KernBox} + +\continueifinputfile{s-fonts-kerns.mkiv} + +\setupinterlinespace[1.5] % \setfalse\showexplicitkerns + +\definefontfeature[default][default][mode=node] % ,script=latn] + +\starttext + +% \enabletrackers[otf.kerns] + +\setuplayout[width=middle,height=middle] + +\usetypescript[modern] \setupbodyfont[modern] +\setbox\KernBox\vbox{\input knuth } \ShowKerns{KernBox} \copy\KernBox \blank + +\ShowKernedHBox{Very often glyphs get very small spaces inserted horizontally.} + +\usetypescript[cambria] \setupbodyfont[cambria] +\setbox\KernBox\vbox{\input knuth } \ShowKerns{KernBox} \copy\KernBox \blank + +\ShowKernedHBox{Very often glyphs get very small spaces inserted horizontally.} + +\usetypescript[palatino] \setupbodyfont[palatino] +\setbox\KernBox\vbox{\input knuth } \ShowKerns{KernBox} \copy\KernBox \blank + +\ShowKernedHBox{Very often glyphs get very small spaces inserted horizontally.} + +\usetypescript[dejavu] \setupbodyfont[dejavu] +\setbox\KernBox\vbox{\input knuth } \ShowKerns{KernBox} \copy\KernBox \blank + +\ShowKernedHBox{Very often glyphs get very small spaces inserted horizontally.} + +\stoptext diff --git a/tex/context/modules/mkiv/s-fonts-ligatures.mkiv b/tex/context/modules/mkiv/s-fonts-ligatures.mkiv index fc49ec5c5..6a5da48ea 100644 --- a/tex/context/modules/mkiv/s-fonts-ligatures.mkiv +++ b/tex/context/modules/mkiv/s-fonts-ligatures.mkiv @@ -156,12 +156,12 @@ \stoptexdefinition \starttexdefinition showotfligaturesexample #1#2 - \ctxlua{document.currentdiscexpansion = fonts.getdiscexpansion()}% + % \ctxlua{document.currentdiscexpansion = fonts.getdiscexpansion()}% \showotfligaturescaptions {#1} \showotfligatureslines {#2} \showotfligaturesparagraphs{#2} \showotfligaturesextremes {#2} - \ctxlua{fonts.setdiscexpansion(document.currentdiscexpansion)}% + % \ctxlua{fonts.setdiscexpansion(document.currentdiscexpansion)}% \stoptexdefinition % todo: n -> and split in lua diff --git a/tex/context/modules/mkiv/s-fnt-20.mkiv b/tex/context/modules/mkiv/s-fonts-steps.mkiv index 584043099..6e11a6a77 100644 --- a/tex/context/modules/mkiv/s-fnt-20.mkiv +++ b/tex/context/modules/mkiv/s-fonts-steps.mkiv @@ -1,5 +1,5 @@ %D \module -%D [ file=s-fnt-20, +%D [ file=s-fonts-steps, % was s-fnt-20 %D version=2009.01.10, %D title=\CONTEXT\ Style File, %D subtitle=Tracing Feature Application (1), @@ -14,6 +14,8 @@ %D This file is used by Idris and me in the process of getting the %D best arabic fonts getting rendered best. As such it might change. +\startmodule[fonts-steps] + % \setvariables % [otftracker] % [title=Reverse Chaining, @@ -39,21 +41,16 @@ liga=yes,dlig=yes,rlig=yes,clig=yes, mark=yes,mkmk=yes,kern=yes,curs=yes] -% \definefontfeature -% [otftracker-husayni] -% [analyze=yes,mode=node, -% language=dflt,script=arab,ccmp=yes, -% init=yes,medi=yes,fina=yes,isol=yes, -% calt=yes, -% mark=yes,mkmk=yes,kern=yes,curs=yes] - \definefontfeature - [otftracker-husayni] + [otftracker-husayni-default] [analyze=yes,mode=node, language=dflt,script=arab, init=yes,medi=yes,fina=yes, + spacekern=yes, + calt=yes, rlig=yes, ccmp=yes, + salt=yes, ss01=yes, % full Allah, Muhammad, Allahumma ss05=yes, % full Jiim stacking ss09=yes, % full Haa stacking @@ -78,6 +75,10 @@ mark=yes,mkmk=yes,kern=yes,curs=yes] \definefontfeature + [otftracker-husayni] + [otftracker-husayni-default] + +\definefontfeature [otftracker-simplenaskhi] [analyze=yes,mode=node, language=dflt,script=arab, @@ -89,6 +90,7 @@ \setvalue{otftracker-direction-husayni}{r2l} \setvalue{otftracker-direction-simplenaskhi}{r2l} \setvalue{otftracker-direction-default}{} +\setvalue{otftracker-direction-sbl-hbrw}{r2l} \setvariables [otftracker] @@ -123,24 +125,47 @@ \setupcolors [state=start] +\startsetups otftracker-steps + \doifsomething {\getvariable{otftracker}{figure}} { + \startlinecorrection + \externalfigure[\getvariable{otftracker}{figure}][maxwidth=\hsize,frame=on] + \stoplinecorrection + } + \showotfcomposition + {\getvariable{otftracker}{font}*\getvariable{otftracker}{features} at \getvariable{otftracker}{size}} + {\getvariable{otftracker}{direction}} + {\getvariable{otftracker}{sample}} +\stopsetups + \startsetups otftracker \setupbodyfont[tt,10pt] \starttext \normalexpanded{\startchapter[title={\getvariable{otftracker}{title}}]} - \doifsomething {\getvariable{otftracker}{figure}} { - \startlinecorrection - \externalfigure[\getvariable{otftracker}{figure}][maxwidth=\hsize,frame=on] - \stoplinecorrection - } - \showotfcomposition - {\getvariable{otftracker}{font}*\getvariable{otftracker}{features} at \getvariable{otftracker}{size}} - {\getvariable{otftracker}{direction}} - {\getvariable{otftracker}{sample}} + \directsetup{otftracker-steps} + \directsetup{otftracker-extra} \stopchapter + \setvariables[otftracker][comment=] \stoptext \stopsetups -\continueifinputfile{s-fnt-20.mkiv} +%D For old times sake we keep this one: + +\unexpanded\def\ShowOtfTrackerSample#1% + {\doiffile{#1} + {\blank + \startlinecorrection + \vbox \bgroup + \forgetall + \setbox\scratchbox\hbox{\component #1 \relax} + \hbox{\copy\scratchbox\quad\lower\dp\scratchbox\hbox{\ruledhbox{\externalfigure[#1-volt.pdf][height=\htdp\scratchbox]}}} + \hbox{\strut\tttf#1}% + \egroup + \stoplinecorrection + \blank}} + +\stopmodule + +\continueifinputfile{s-fonts-steps.mkiv} \usemodule[art-01] diff --git a/tex/context/modules/mkiv/s-fonts-variable.mkiv b/tex/context/modules/mkiv/s-fonts-variable.mkiv index 64348b324..5c9d53d33 100644 --- a/tex/context/modules/mkiv/s-fonts-variable.mkiv +++ b/tex/context/modules/mkiv/s-fonts-variable.mkiv @@ -30,11 +30,11 @@ {\begingroup \scratchskip \interwordspace plus \interwordstretch minus \interwordshrink \normalexpanded{\hpack\bgroup - \tttf - sp: \the\scratchskip \hskip\emwidth - es: \the\extraspace\hskip\emwidth - ex: \the\exheight \hskip\emwidth - em: \the\emwidth \hskip\emwidth + \tt\txx + sp: \the\scratchskip\hskip\emwidth + es: \the\extraspace \hskip\emwidth + ex: \the\exheight \hskip\emwidth + em: \the\emwidth \hskip\emwidth \egroup}% \endgroup} @@ -46,8 +46,8 @@ \setuphead[section][before={\testpage[5]\blank[2*big]}] -\enabletrackers[modules.fonts.variables.glyphs] -\enabletrackers[modules.fonts.variables.kerns] +% \enabletrackers[modules.fonts.variables.glyphs] +% \enabletrackers[modules.fonts.variables.kerns] \starttext @@ -72,10 +72,6 @@ \char983040\relax\par \stopbuffer -% \showfontvariations -% [font=file:VotoSerifGX.ttf, -% max=6] - \showfontvariations [font=file:adobevfprototype.otf] @@ -85,9 +81,9 @@ \showfontvariations [font=file:DecoVar-VF.ttf] - \showfontvariations - [font=file:VotoSerifGX.ttf, - max=15] + % \showfontvariations + % [font=file:VotoSerifGX.ttf, + % max=15] \showfontvariations [font=file:Selawik-Variable.ttf] @@ -108,4 +104,7 @@ % \showfontvariations % [font=file:AmstelvarAlpha-VF.ttf] + \showfontvariations + [font=file:bahnschrift.ttf] + \stoptext diff --git a/tex/context/modules/mkiv/s-mag-01.mkiv b/tex/context/modules/mkiv/s-magazine-basic.mkiv index 7191d760c..267bf50d8 100644 --- a/tex/context/modules/mkiv/s-mag-01.mkiv +++ b/tex/context/modules/mkiv/s-magazine-basic.mkiv @@ -1,5 +1,5 @@ %D \module -%D [ file=s-mag-01, +%D [ file=s-magazine-basic, % was: s-mag-01 %D version=2016.09.12, % mkiv version of 2002.12.14, %D title=\CONTEXT\ Style File, %D subtitle=\CONTEXT\ Magazine Base Style, diff --git a/tex/context/modules/mkiv/s-map-10.mkiv b/tex/context/modules/mkiv/s-maps.mkiv index c7541babc..c7541babc 100644 --- a/tex/context/modules/mkiv/s-map-10.mkiv +++ b/tex/context/modules/mkiv/s-maps.mkiv diff --git a/tex/context/modules/mkiv/s-math-characters.lua b/tex/context/modules/mkiv/s-math-characters.lua index 757e843da..1888dabb4 100644 --- a/tex/context/modules/mkiv/s-math-characters.lua +++ b/tex/context/modules/mkiv/s-math-characters.lua @@ -16,6 +16,8 @@ local lower = string.lower local utfchar = utf.char local round = math.round +local context = context + local fontdata = fonts.hashes.identifiers local chardata = characters.data local blocks = characters.blocks @@ -73,10 +75,11 @@ function moduledata.math.characters.showlist(specification) sorted = table.sortedkeys(characters) end if virtual then - for k, v in ipairs(tfmdata.fonts) do - local id = v.id + local fonts = tfmdata.fonts + for i=1,#fonts do + local id = fonts[i].id local name = fontdata[id].properties.name - names[k] = (name and file.basename(name)) or id + names[i] = (name and file.basename(name)) or id end end if check then diff --git a/tex/context/modules/mkiv/s-math-ligatures.lua b/tex/context/modules/mkiv/s-math-ligatures.lua new file mode 100644 index 000000000..5c888c088 --- /dev/null +++ b/tex/context/modules/mkiv/s-math-ligatures.lua @@ -0,0 +1,72 @@ +if not modules then modules = { } end modules['s-math-ligatures'] = { + version = 1.001, + comment = "companion to s-math-ligatures.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +moduledata.math = moduledata.math or { } +moduledata.math.ligatures = moduledata.math.ligatures or { } + +local context = context + +local utfchar = utf.char +local uformat = string.formatters["%U"] + +function moduledata.math.ligatures.showlist(specification) + -- specification = interfaces.checkedspecification(specification) + + local function setlist(unicode,list,start,v,how) + if list[start] ~= 0x20 then + local t, u = { }, { } + for i=start,#list do + local li = list[i] + t[#t+1] = utfchar(li) + u[#u+1] = uformat(li) + end + context.NC() context(how) + context.NC() context("%U",unicode) + context.NC() context("%c",unicode) + context.NC() context("% t",u) + context.NC() context("%t",t) + context.NC() context("%t",t) + context.NC() + context.nohyphens() + context.veryraggedright() + local n = v.mathname + if n then + context.tex(n) + else + local c = v.mathspec + if c then + for i=1,#c do + local n = c[i].name + if n then + context.tex(n) + context.quad() + end + end + end + end + context.NC() + context.NR() + end + end + + context.starttabulate { "|T|T|m|T|T|m|pl|" } + for unicode, v in table.sortedhash(characters.data) do + local vs = v.specials + if vs and #vs > 2 then + local kind = vs[1] + if (v.mathclass or v.mathspec) and (kind == "char" or kind == "compat") then + setlist(unicode,vs,2,v,"sp") + end + end + local ml = v.mathlist + if ml then + setlist(unicode,ml,1,v,"ml") + end + end + context.stoptabulate() +end diff --git a/tex/context/modules/mkiv/s-math-ligatures.mkiv b/tex/context/modules/mkiv/s-math-ligatures.mkiv new file mode 100644 index 000000000..39fc4d2a3 --- /dev/null +++ b/tex/context/modules/mkiv/s-math-ligatures.mkiv @@ -0,0 +1,50 @@ +%D \module +%D [ file=s-math-ligatures.mkiv, +%D version=2017.08.03, +%D title=\CONTEXT\ Style File, +%D subtitle=Math Ligature Checking, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\startmodule[math-ligatures] + +\registerctxluafile{s-math-ligatures}{} + +\unprotect + +\unexpanded\def\showmathligatures + {\dosingleempty\module_math_ligatures_show} + +\def\module_math_ligatures_show[#1]% + {\begingroup + \ctxlua{moduledata.math.ligatures.showlist{ }}% + \endgroup} + +\protect + +\stopmodule + +\continueifinputfile{s-math-ligatures.mkiv} + +\setupbodyfont[dejavu,10pt] + +\setuplayout + [width=middle, + height=middle, + topspace=15mm, + backspace=15mm, + bottomspace=15mm, + header=1cm, + headerdistance=0.5cm, + footer=0pt] + +\starttext + + \showmathligatures + +\stoptext diff --git a/tex/context/modules/mkiv/s-math-repertoire.mkiv b/tex/context/modules/mkiv/s-math-repertoire.mkiv index 91af45dfc..90d0b09d3 100644 --- a/tex/context/modules/mkiv/s-math-repertoire.mkiv +++ b/tex/context/modules/mkiv/s-math-repertoire.mkiv @@ -265,7 +265,7 @@ \unexpanded\def\showmathcharacterssetbodyfonts#1% {\edef\showmathcharactersbodyfonts{#1}% - \def\doshowmathcharacterssetbodyfonts##1{\setupbodyfont[##1,12pt]}% + \def\doshowmathcharacterssetbodyfonts##1{\setupbodyfont[##1,12pt]}% \usebodyfont[##1,12pt]% \processcommacommand[\showmathcharactersbodyfonts]\doshowmathcharacterssetbodyfonts} \unexpanded\def\showmathcharactersbodyfontschars#1% @@ -453,7 +453,7 @@ \continueifinputfile{s-math-repertoire.mkiv} -\showmathcharacterssetbodyfonts{lucidaot,cambria,xits,modern,pagella,termes,bonum,schola,dejavu} +\showmathcharacterssetbodyfonts{lucidaot,cambria,xits,stixtwo,modern,pagella,termes,bonum,schola,dejavu} \starttext diff --git a/tex/context/modules/mkiv/s-mod-01.mkiv b/tex/context/modules/mkiv/s-module-basic.mkiv index f1c8d4258..74621b2a3 100644 --- a/tex/context/modules/mkiv/s-mod-01.mkiv +++ b/tex/context/modules/mkiv/s-module-basic.mkiv @@ -25,11 +25,13 @@ %D him when you run into problems. Bugs in this style can be sent to %D Hans. -\usemodule - [abr-00] +\showframe -\setvariables - [document] +\usemodule[abbreviations-words] + +\startmodule[modules-basics] + +\setupdocument [ file=\jobname, type=unknown, version={\currentdate[\v!year,{.},\v!month,{.},\v!day]}, @@ -120,6 +122,11 @@ \setuppalet [module:\documentvariable{type}] + \setuptyping + [definition] + [lines=yes, + option=\documentvariable{type}] + \startTEXpage \useMPgraphic{page} \stopTEXpage @@ -181,20 +188,32 @@ \endgroup \stoptexdefinition -\definetyping [PL] [\c!option=PL] -\definetyping [JV] [\c!option=JV] -\definetyping [MP] [\c!option=MP] -\definetyping [TEX] [\c!option=TEX] -\definetyping [LUA] [\c!option=LUA] +% \definetyping [PL] [\c!option=PL] +% \definetyping [JV] [\c!option=JV] +% \definetyping [MP] [\c!option=MP] +% \definetyping [TEX] [\c!option=TEX] +% \definetyping [LUA] [\c!option=LUA] -\setuptyping [\v!typing] [\c!margin=\v!standard] -\setuptyping [\v!file] [\c!margin=\v!standard] -\setuptyping [definition] [\c!margin=0pt,\c!numbering=\v!line,\c!continue=\v!yes] % this continue wins +\setuptyping + [\v!typing] + [\c!margin=\v!standard, + \c!lines=\v!yes] + +\setuptyping + [\v!file] + [\c!margin=\v!standard, + \c!lines=\v!yes] + +\setuptyping + [definition] + [\c!margin=0pt, + \c!numbering=\v!line, + \c!continue=\v!yes, + \c!lines=\v!yes] \setuplinenumbering [definition] [\c!style=\ttx, - \c!distance=\leftmargindistance, \c!align=\v!flushright] % This will be cleaned up. @@ -206,7 +225,7 @@ \else \index{#1{#2}}% \fi - #1{\doboundtext{#2}{\leftmarginwidth}{..}}}} + \dontleavehmode#1{\doboundtext{#2}{\leftmarginwidth}{..}}}} \unexpanded\def\modulemarginstuff#1#2% to be renamed {\processcommalist[#2]{\domodulemarginstuff#1}} @@ -216,7 +235,7 @@ [left] [stack=yes, hoffset=2em, - style=\ttxx] + style=\ttxx\setstrut] \unexpanded\def\macros {\modulemarginstuff\tex } \unexpanded\def\extras {\modulemarginstuff\relax} @@ -257,11 +276,11 @@ % style (we use dejavu as it supports more characters) -\switchtobodyfont - [dejavu-condensed,10pt] % preload +\usebodyfont + [dejavu-condensed,9pt] % preload \setupbodyfont - [dejavu,10pt] % main font + [dejavu,9pt] % main font \mainlanguage [en] @@ -379,13 +398,6 @@ } -% bonus - -\usemodule - [abr-02] - -% another one - -\dontcomplain +\protect -\protect \endinput +\stopmodule diff --git a/tex/context/modules/mkiv/s-pages-statistics.mkiv b/tex/context/modules/mkiv/s-pages-statistics.mkiv index 375dd9949..54d49bb9f 100644 --- a/tex/context/modules/mkiv/s-pages-statistics.mkiv +++ b/tex/context/modules/mkiv/s-pages-statistics.mkiv @@ -82,9 +82,12 @@ } \stopsetups +\definecolor[system:page:otr:statistics][t=.8,a=1] + \defineoverlay [system:page:otr:statistics] - [{\framed + [{\starttransparent[system:page:otr:statistics]% + \framed [\c!offset=\bodyfontsize, \c!background=\v!color, \c!strut=\v!no, @@ -96,7 +99,8 @@ \c!align=\v!middle] {\forgetall \insidefloattrue - \setups{system:page:otr:statistics}}}] + \setups{system:page:otr:statistics}}% + \stoptransparent}] \unexpanded\def\page_one_command_package_show_state_indeed {\scratchheight\ht\b_page_one_contents diff --git a/tex/context/modules/mkiv/s-pre-30.mkiv b/tex/context/modules/mkiv/s-pre-30.mkiv deleted file mode 100644 index 1be85d02b..000000000 --- a/tex/context/modules/mkiv/s-pre-30.mkiv +++ /dev/null @@ -1,257 +0,0 @@ -%D \module -%D [ file=s-pre-30, -%D version=2006.04.25, -%D title=\CONTEXT\ Style File, -%D subtitle=Presentation Environment 30, -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] -%C -%C This module is part of the \CONTEXT\ macro||package and is -%C therefore copyrighted by \PRAGMA. See mreadme.pdf for -%C details. - -\usemodule[streams] - -\setuppapersize - [S6] [S6] - -\setupbodyfont - [12pt,tt] - -\definemeasure[bleed][6pt] - -\definecolor[maincolor-3][r=.5,g=.2,b=.2] -\definecolor[maincolor-1][r=.2,g=.5,b=.2] -\definecolor[maincolor-2][r=.2,g=.2,b=.5] - -\definecolor[pagecolor] [s=.5] -\definecolor[resultcolor][s=1,t=.85,a=1] -\definecolor[maincolor] [maincolor-3] - -\definecolorgroup - [maingroup] - [.5:.2:.2, - .2:.5:.2, - .2:.2:.5] - -\definecolorgroup - [resultgroup] - [1:.85:.85, - .85:1:.85, - .85:.85:1] - -\def\CurrentColor{1} - -\definecolor[maincolor] [maingroup:\CurrentColor] -\definecolor[resultcolor][resultgroup:\CurrentColor] - -\def\NextColor{\ifnum\CurrentColor=3 \def\CurrentColor{1}\else\doglobal\increment\CurrentColor\fi} - -\setuplayout - [backspace=\measure{bleed}, - topspace=30pt, - bottomdistance=\measure{bleed}, - bottom=\dimexpr30pt-\measure{bleed}\relax, - header=0pt, - footer=0pt, - topdistance=\measure{bleed}, - top=\dimexpr30pt-\measure{bleed}\relax, - width=middle, - height=middle] - -\setuptop - [before=\vfill, - after=\vfill, - strut=yes] - -\setupbackgrounds - [text] - [backgroundoffset=\measure{bleed}, - background=color, - backgroundcolor=maincolor] - -\setupbackgrounds - [page] - [background=color, - backgroundcolor=pagecolor] - -\setupcolors - [state=start, - textcolor=white] - -\setuphead - [chapter] - [style=\ttd] - -\setuphead - [section] - [style=\ttd] - -\defineviewerlayer - [result] - [state=stop] - -\definelayer - [result] - -\setuplayer - [result] - [width=\textwidth, - height=\textheight] - -\setupbackgrounds - [text] - [background={color,toggle,foreground,result}] - -\setupinteraction - [state=start, - click=no, - menu=on, - color=white, - contrastcolor=white, - closepageaction=HideLayer{result}, - openpageaction=HideLayer{result}] - -% We add a dummy color switch so that each page has at least one -% transparency; else acrobat will render the pages differently -% bug in 6 and 7). - -\startinteractionmenu[bottom] -% \color[resultcolor]{ }% - \hfill - \got [content] content \\ - \got [previouspage] previous \\ - \got [nextpage] next \\ - \got [ToggleLayer{result}] result \\ - \got [CloseDocument] close \\ -\stopinteractionmenu - -\setuphead - [section] - [placehead=no, - incrementnumber=list] - -\setuplist - [section] - [alternative=f] - -\defineoverlay - [toggle] - [\overlaybutton{ToggleLayer{result}}] - -\definestreamlayer - [resultstream] - -\startsetups streamlayer:resultstream:flush - \setlayer - [result] - [preset=middlebottom, - hoffset=\measure{bleed}, -% voffset=-\measure{bleed}] - voffset=\measure{bleed}] - {\startviewerlayer[result]% -% \framed -% [offset=overlay, -% frame=off, -% background=color, -% backgroundoffset=1\dimexpr\measure{bleed}\relax, -% backgroundcolor=maincolor] - {\framed - [offset=overlay, - frame=off, - foregroundcolor=maincolor, - background=color, - backgroundoffset=1\dimexpr\measure{bleed}\relax, - backgroundcolor=resultcolor] - {\tightlayer[\currentstreamlayer]}} - \stopviewerlayer} -\stopsetups - -\startsetups show-definition - \subject{definition} - \typebuffer - \getbuffer - \page -\stopsetups - -\startsetups show-result - \startstreamlayer[resultstream] - \subject{result} - \getbuffer - \stopstreamlayer - \placestreamlayer[resultstream] - \page -\stopsetups - -\startsetups show-usage - \subject{usage} - \typebuffer - \startstreamlayer[resultstream] - \subject{result} - \getbuffer - \stopstreamlayer - \placestreamlayer[resultstream] - \page -\stopsetups - -\startsetups show-usage-lines - \subject{usage} - \typebuffer - \startstreamlayer[resultstream] - \subject{result} - \startlines - \getbuffer - \stoplines - \stopstreamlayer - \placestreamlayer[resultstream] - \page -\stopsetups - -\startsetups show-contents - \startcolumns[n=3] - \placelist[section][criterium=text] - \stopcolumns - \pagereference[content] - \page - \NextColor -\stopsetups - -\def\TitlePage#1% - {\title{#1} - \setups{show-contents}} - -\def\StartSample#1% - {\starttext - \page - \section{#1} - \setuptoptexts[][\processedfile\enspace:\enspace\lowercase{#1}]} - -\def\StopSample - {\page - \setuptoptexts[][] - \stoptext - \NextColor} - -\endinput - -\usemodule[pre-30] - -% \TitlePage{Howling to the moon} - -\StartSample{Basics} - -\startbuffer -\lua{a = 1.5 ; b = 1.8 ; c = a*b ; context(c) ;} - -\startlua - a = 1 - b = 2 - c = a*b - context(c) -\stoplua -\stopbuffer - -\setups{show-usage} - -\StopSample diff --git a/tex/context/modules/mkiv/s-present-lines.mkiv b/tex/context/modules/mkiv/s-present-lines.mkiv new file mode 100644 index 000000000..3a2fdae53 --- /dev/null +++ b/tex/context/modules/mkiv/s-present-lines.mkiv @@ -0,0 +1,172 @@ +%D \module +%D [ file=s-present-lines, +%D version=1017.09.01, +%D title=\CONTEXT\ Style File, +%D subtitle=Presentation Environment Balls, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +%D This style was made for the \CONTEXT\ 2017 meeting. According to Alan Braslau we +%D should not display items that we discuss but for now I stick to it. As a +%D compromise this is a simple and effective style. + +\startmodule[present-lines] + +\definecolor[backcolor][s=.6] +\definecolor[pagecolor][s=.3] +\definecolor[dotscolor][s=.2] +\definecolor[maincolor][b=.6] + +\definecolor[maincolor][r=.6] + +\setuppapersize + [S6] + +\setuplayout + [header=0pt, + footer=0pt, + topspace=20mm, + backspace=20mm, + width=middle, + height=middle] + +\setupbackgrounds + [page] + [background=page] + +\defineoverlay + [page] + [\useMPgraphic{page}] + +\setupitemgroup +% [color=dotscolor] + [color=maincolor] + +\definesymbol + [1][{\symbol[\char"25A0]}] + +\setupbodyfont + [dejavu] + +\startuseMPgraphic{page} + StartPage ; + numeric d ; d := 15pt ; + fill Page + enlarged 2d + withcolor "pagecolor" ; + fill Field[Text][Text] + enlarged 2d + withcolor "backcolor" ; + draw leftboundary Field[Text][Text] + bottomenlarged 3d + topenlarged -(d/10) + shifted (-d,0) + withpen pensquare scaled (d/5) + withcolor "maincolor" ; + draw bottomboundary Field[Text][Text] + leftenlarged 3d + rightenlarged -(d/10) + shifted (0,-d) + withpen pensquare scaled (d/5) + withcolor "maincolor" ; + draw rightboundary Field[Text][Text] + topenlarged 3d + bottomenlarged -(d/10) + shifted (d,0) + withpen pensquare scaled (d/5) + withcolor "maincolor" ; + draw topboundary Field[Text][Text] + rightenlarged 3d + leftenlarged -(d/10) + shifted (0,d) + withpen pensquare scaled (d/5) + withcolor "maincolor" ; + StopPage ; +\stopuseMPgraphic + +\setuphead + [chapter,title] + [placehead=empty, + number=no, + after={\blank[disable]}, + before=] + +\setuptext + [color=pagecolor, + style=\bfd] + +\setuptexttexts + [\directsetup{text:texts}] + +\startsetups text:texts + \vbox to \textheight { + \vfill + \hfill + \setstrut + \strut + \getmarking[chapter] + \getmarking[title] + \vskip-\strutdp + } +\stopsetups + +\startsetups document:start + \startstandardmakeup + \startparagraph + % Per 01-02-2017 the Bold abstraction also makes sure that CurrentFont + % works well which in turn makes MixedCaps and such working. + \definedfont[Bold*default @ 42pt] + \setupinterlinespace + \startcolor[pagecolor] + \begstrut + \documentvariable{title} + \endstrut + \stopcolor + \stopparagraph + \blank[2*line] + \determinelistcharacteristics[chapter] + \ifnum\listlength>10\relax + \startcolumns + \placelist[chapter][alternative=f] + \stopcolumns + \else + \placelist[chapter][alternative=f] + \fi + \vfill + \hfill + \bfb + \setstrut + \strut + \startcolor[pagecolor] + \documentvariable{subtitle} + \stopcolor + \vskip-\strutdp + \stopstandardmakeup +\stopsetups + +\setupinteraction + [state=start, + color=maincolor, + contrastcolor=maincolor, + style=] + +\setuptyping + [color=maincolor] + +\setuptype + [color=maincolor] + +\usemodule[abr-04] + +\stopmodule + +\continueifinputfile{s-present-lines.mkiv} + +% \usemodule[present-common] + +% \inputpresentationfile{examples/....} % todo, 2017 presentations diff --git a/tex/context/modules/mkiv/s-present-original.mkiv b/tex/context/modules/mkiv/s-present-original.mkiv index 809f7b2cb..1c5e94c85 100644 --- a/tex/context/modules/mkiv/s-present-original.mkiv +++ b/tex/context/modules/mkiv/s-present-original.mkiv @@ -57,7 +57,7 @@ % \definecolor [InteractionColor] [r=.1, g=.5, b=.8] % \definecolor [ContrastColor] [r=.9, g=.5, b=.2] -\definecolor [BackgroundColor] [r=.7, g=.7, b=.3] +\definecolor [BackgroundColor] [r=.7, g=.7, b=.3] \definecolor [InteractionColor] [r=.1, g=.5, b=.8] \definecolor [ContrastColor] [r=.9, g=.5, b=.2] diff --git a/tex/context/modules/mkiv/s-pre-17.mkiv b/tex/context/modules/mkiv/s-present-weird.mkiv index 558d5afd2..27ef7b2c2 100644 --- a/tex/context/modules/mkiv/s-pre-17.mkiv +++ b/tex/context/modules/mkiv/s-present-weird.mkiv @@ -1,8 +1,8 @@ %D \module -%D [ file=s-pre-17, +%D [ file=s-present-weird, % s-pre-17, %D version=1999.08.20, %D title=\CONTEXT\ Style File, -%D subtitle=Presentation Environment 17, +%D subtitle=Presentation Environment Weird, %D author=Hans Hagen, %D date=\currentdate, %D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] @@ -11,6 +11,14 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. +\startmodule[present-balls] + +%D This is a rather old style, adn I used it for a presentation about \MATHML\ +%D around the turn of the century. Unfortunately I can't find back that weird +%D presentation. I didn't change the code apart from loading the body font. One can +%D clock on an area and get it large. Clicking elsewhere brings back the main page. +%D It was actualy a zoom test at that time. + \setupbodyfont [dejavu,11pt,ss] @@ -30,7 +38,7 @@ \setupinteraction [state=start, -% click=off, + % click=off, color=TitleColor, contrastcolor=TitleColor] @@ -146,7 +154,7 @@ next=connection:\NextBlaBla } \hbox to 600pt \bgroup - \setupinteraction[focus=fitr] + \setupinteraction[focus=frame] \getrandomdimen\scratchdimen{50pt}{75pt} \hskip0pt plus \scratchdimen minus \scratchdimen \hpos { @@ -196,7 +204,7 @@ \hbox to \wd\scratchbox } \bgroup - \setupinteraction[focus=fitr] + \setupinteraction[focus=frame] \hss \switchtobodyfont[big]% \bfd @@ -238,8 +246,8 @@ [MasterPage] [MasterPage] \setuplayout [ - topspace=25pt, - backspace=25pt, + topspace=50pt, + backspace=50pt, width=middle, header=0pt, footer=0pt, @@ -287,118 +295,8 @@ \endgroup \stoptexdefinition -\continueifinputfile{s-pre-17.mkiv} - -\starttext - -\nopdfcompression - -\TitlePage{About Text\\Today's Talk\\Hans Hagen} - -\StartPage{The First Page} - - \StartTopic{Some Text} - \StartText \input tufte \StopText - \StartText \input knuth \StopText - \StartText \input zapf \StopText - \StartText \input knuth \StopText - \StopTopic - - \StartTopic{Another Text} - \StartText \input tufte \StopText - \StartText \input zapf \StopText - \StartText \input knuth \StopText - \StopTopic - - \StartTopic{Some More Text} - \StartText \input tufte \StopText - \StartText \input knuth \StopText - \StartText \input zapf \StopText - \StartText \input tufte \StopText - \StopTopic - - \StartTopic{Some Text Again} - \StartText \input tufte \StopText - \StartText \input zapf \StopText - \StartText \input knuth \StopText - \StartText \input tufte \StopText - \StopTopic - -\StopPage - -\StartPage{The Second Page} - - \StartTopic{Some Text} - \StartText \input tufte \StopText - \StartText \input knuth \StopText - \StartText \input zapf \StopText - \StartText \input tufte \StopText - \StartText \input knuth \StopText - \StartText \input zapf \StopText - \StopTopic - - \StartTopic{Another Text} - \StartText \input tufte \StopText - \StartText \input knuth \StopText - \StartText \input zapf \StopText - \StopTopic - - \StartTopic{Some Nice Text} - \StartText \input tufte \StopText - \StartText \input knuth \StopText - \StartText \input zapf \StopText - \StartText \input tufte \StopText - \StartText \input tufte \StopText - \StopTopic - - \StartTopic{Some Funny Text} - \StartText \input tufte \StopText - \StartText \input knuth \StopText - \StopTopic - - \StartTopic{Quite Some Text} - \StartText \input tufte \StopText - \StartText \input knuth \StopText - \StartText \input zapf \StopText - \StartText \input tufte \StopText - \StartText \input knuth \StopText - \StartText \input zapf \StopText - \StartText \input tufte \StopText - \StartText \input knuth \StopText - \StartText \input zapf \StopText - \StopTopic - - \StartTopic{Even More Text} - \StartText \input knuth \StopText - \StartText \input zapf \StopText - \StartText \input tufte \StopText - \StartText \input knuth \StopText - \StartText \input zapf \StopText - \StopTopic - -\StopPage - -\StartPage{The Third Page} - - \StartTopic{Some Short Text} - \StartText \input tufte \StopText - \StartText \input knuth \StopText - \StartText \input zapf \StopText - \StopTopic - - \StartTopic{Some Minimal Text} - \StartText \input tufte \StopText - \StartText \input zapf \StopText - \StopTopic - - \StartTopic{Some More Text} - \StartText \input tufte \StopText - \StartText \input knuth \StopText - \StartText \input zapf \StopText - \StartText \input tufte \StopText - \StartText \input tufte \StopText - \StopTopic +\stopmodule -\StopPage +\continueifinputfile{s-present-balls.mkiv} -\stoptext +\inputpresentationfile{examples/present-weird-001.tex} diff --git a/tex/context/modules/mkiv/s-reg-01.mkiv b/tex/context/modules/mkiv/s-reg-01.mkiv deleted file mode 100644 index 36434c30c..000000000 --- a/tex/context/modules/mkiv/s-reg-01.mkiv +++ /dev/null @@ -1,60 +0,0 @@ -%D \module -%D [ file=s-reg-01, -%D version=2005.04.25, -%D title=\CONTEXT\ Style File, -%D subtitle=Extra Regime Support, -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] -%C -%C This module is part of the \CONTEXT\ macro||package and is -%C therefore copyrighted by \PRAGMA. See mreadme.pdf for -%C details. - -%D \macros -%D {showregime} -%D -%D This code is moved from the kernel to here. (We could make it -%D auto-loadable). - -\startluacode ---[[ldx-- -<p>The following code is rather <l n='context'/> specific.</p> ---ldx]]-- - -function regimes.show(regime) - regime = regimes.synonyms[regime] or regime - local r = regimes.data[regime] - if r then - local chardata = characters.data - context.starttabulate { "|rT|T|rT|lT|lT|lT|" } - for k, v in ipairs(r) do - local chr = chardata[v] - if chr then - context.NC() context(k) - context.NC() context.getvalue(chr.contextname]) - context.NC() context("%U+05X",v) - context.NC() context(chr.contextname) - context.NC() context(chr.category) - context.NC() context(chr.description) - context.NC() context.NR() - else - -- can't happen - end - end - context.stoptabulate() - else - context("unknown regime %s",regime) - end -end -\stopluacode - -\unprotect - -\def\showregime - {\dosingleempty\doshowregime} - -\def\doshowregime[#1]% - {\ctxlua{regimes.show("#1")}} - -\protect \endinput diff --git a/tex/context/modules/mkiv/s-regimes-list.mkiv b/tex/context/modules/mkiv/s-regimes-list.mkiv new file mode 100644 index 000000000..0124b3023 --- /dev/null +++ b/tex/context/modules/mkiv/s-regimes-list.mkiv @@ -0,0 +1,74 @@ +%D \module +%D [ file=s-regimes-list, % was: s-reg-01 +%D version=2005.04.25, +%D title=\CONTEXT\ Style File, +%D subtitle=Extra Regime Support, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +%D \macros +%D {showregime} +%D +%D This code is moved from the kernel to here. + +\startmodule[regimes-list] + +\startluacode + +moduledata.regimes = moduledata.regimes or { } +moduledata.regimes.charts = moduledata.regimes.charts or { } + +local byte = string.byte + +function moduledata.regimes.charts.show(regime) + if regime and regime ~= "" then + local r = regimes.mapping[regime] + if r then + local chardata = characters.data + context.starttabulate { "|rT|rT|rT|cT|lT|lT|pT|" } + for k, v in table.sortedhash(r) do + local chr = chardata[v] + local num = byte(k) + local uni = utf.byte(v) + if chr then + context.NC() context(num) + context.NC() context("0x%02X",num) + context.NC() context("%U",uni) + context.NC() context.char(uni) + context.NC() context(chr.contextname) + context.NC() context(chr.category) + context.NC() context(chr.description) + context.NC() context.NR() + else + -- can't happen + end + end + context.stoptabulate() + else + context("unknown regime %s",regime) + end + else + context("available regimes: %, t",regimes.list()) + end +end + +\stopluacode + +\installmodulecommandluasingle \showregime {moduledata.regimes.charts.show} + +\stopmodule + +\continueifinputfile{s-regimes-list.mkiv} + +\usemodule[art-01] + +\starttext + + \showregime[8859-1] + +\stoptext diff --git a/tex/context/modules/mkiv/s-setups-macros.mkiv b/tex/context/modules/mkiv/s-setups-macros.mkiv new file mode 100644 index 000000000..42c6b38a2 --- /dev/null +++ b/tex/context/modules/mkiv/s-setups-macros.mkiv @@ -0,0 +1,203 @@ +%D \module +%D [ file=setups-macros, +%D version=2018.01.15, +%D title=\CONTEXT\ Setup Definitions, +%D subtitle=Macro Properties, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\startluacode + + local find = string.find + local gsub = string.gsub + local topattern = string.topattern + local concat = table.concat + local sort = table.sort + local sortedkeys = table.sortedkeys + local sortedhash = table.sortedhash + local getmacro = tokens.getters.macro + local gethash = tex.hashtokens + + local lpegmatch, P, R, C, S = lpeg.match, lpeg.P, lpeg.R, lpeg.C, lpeg.S + + local macros = interfaces.macros or { } + interfaces.macros = macros + + local hashtable = nil + + -- table.save("temp.lua",gethash()) + + local prefix = P("??") + local initial = R("09")^1 * P(">") + local name = C(R("az","AZ") * (R("az","AZ","09")+S(" "))^0) + local parent = P(":parent") + local eos = P(-1) + + local pattern1 = initial^0 + * name + * parent^0 + * eos + local pattern2 = prefix + * name + * eos + local pattern3 = C(initial^1) + * name + * parent^1 -- so no e.g. measure here + * eos + + + local function reload() + hashtable = gethash() + sort(hashtable) + end + + interfaces.macros.reload = reload + + function interfaces.macros.instances(str) + local namespace = getmacro("??"..str) + if namespace then + local found = { } + local pattern = P(namespace) * pattern1 + if not hashtable then + reload() + end + for i=1,#hashtable do + local hi = hashtable[i] + local pi = lpegmatch(pattern,hi) + if pi then + found[pi] = true + end + end + return sortedkeys(found) + end + end + + function interfaces.macros.namespaces() + local found = { } + if not hashtable then + reload() + end + for i=1,#hashtable do + local hi = hashtable[i] + local pi = lpegmatch(pattern2,hi) + if pi then + found[pi] = true + end + end + return sortedkeys(found) + end + + function interfaces.macros.allinstances() + local found = { } + local reverse = { } + local all = { } + if not hashtable then + reload() + end + for i=1,#hashtable do + local hi = hashtable[i] + local pi = lpegmatch(pattern2,hi) + if pi then + found[pi] = true + reverse[getmacro("??"..pi)] = pi + end + end + for i=1,#hashtable do + local hi = hashtable[i] + local ni, pi = lpegmatch(pattern3,hi) + if ni and pi then + local ri = reverse[ni] + if ri and found[ri] then + local a = all[ri] + if a then + a[pi] = true + else + all[ri] = { [pi] = true } + end + end + end + end + return all + end + + function interfaces.macros.collect(str) + local asked = gsub(str,"^\\","") + local found = { } + local pattern = "^" .. topattern(asked) .. "$" + if not hashtable then + reload() + end + for i=1,#hashtable do + local hi = hashtable[i] + if find(hi,pattern) then + found[hi] = true + end + end + return sortedkeys(found) + end + + function commands.getinstances(str,separator) + local i = interfaces.macros.instances(str) + if i then + context(concat(i,separator or ", ")) + end + end + function commands.getnamespaces(separator) + local i = interfaces.macros.namespaces() + if i then + context(concat(i,separator or ", ")) + end + end + + function commands.showallinstances() + local i = interfaces.macros.allinstances() + if i then + local ctxcmd = context.showoneinstance + for k, v in sortedhash(i) do + ctxcmd(k,concat(sortedkeys(v),", ")) + end + end + end + +\stopluacode + +\unprotect + +\def\getinstances #1{\ctxlua{commands.getinstances("#1")}} % expandable +\def\getnamespaces {\ctxlua{commands.getnamespaces()}} % expandable + +\unexpanded\def\showoneinstance#1#2% + {\begingroup + \hangindent\emwidth + \hangafter\plusone + \veryraggedright + \dontleavehmode + \ttbf#1:\space + \tttf#2\par + \endgroup} + +\unexpanded\def\showallinstances + {\ctxlua{commands.showallinstances()}} + +\protect + +\continueifinputfile{s-setups-macros.mkiv} + +\usemodule[art-01] + +\starttext + +% \getinstances{measure} \page +% \getinstances{framed} \page +% \getinstances{layout} \page +% +% \getnamespaces \page + +\showallinstances + +\stoptext diff --git a/tex/context/modules/mkiv/s-tugboat.mkiv b/tex/context/modules/mkiv/s-tugboat.mkiv new file mode 100644 index 000000000..2b3b07d11 --- /dev/null +++ b/tex/context/modules/mkiv/s-tugboat.mkiv @@ -0,0 +1,681 @@ +%D \module +%D [ file=t-tugboat +%D version=$Id: t-tugboat.tex 111 2013-02-25 17:56:22Z bnb $ +%D title=\CONTEXT\ Style File, +%D subtitle=\TUGBOAT\ base style, +%D author=Aditya Mahajan, +%D date=\currentdate, +%D copyright=Public Domain] + +%D This file is derived from \filename{s-tug-02} written by Hans Hagen +%D and Steve Grathwohl. Karl Berry asked me for some changes in the +%D \TUGBOAT\ style files. The original file had an option of typesetting +%D on a grid. That was too clever for me to understand, and hence to +%D modify. Since \TUGBOAT\ usually does not typeset on a grid, I redid the +%D style, borrowing parts from \filename{s-tug-02} and redoing some +%D parts from scratch. + +%D \section Variables %<<<1 +%D +%D We store the information about the article in variables. + +\setvariables + [tugboat] + [type=article, + columns=no, + grid=yes + ] + +\setvariables + [tugboat] + [year=1900, + volume=0, + number=0, + page=900] + +\setvariables + [tugboat] + [title=ConTeXt style for TUGboat, + subtitle=, + keywords=, + author=T. Boat, + address=Pragmatically Advanced tugboats \\ + 314 Pi Ave. \\ + 8061GH Hasselt NL, + email={tugboat@tug.org}] + +%D \section Font Setup %<<<1 +%D +%D \TUGBOAT\ uses slightly different interline space than the default. +%D So we change the interline space. + +\definebodyfontenvironment [8pt] [interlinespace=9.5pt, big=9pt, small=7pt] +\definebodyfontenvironment [9pt] [interlinespace=11pt, big=10pt, small=8pt] +\definebodyfontenvironment [10pt] [interlinespace=12pt, big=12pt, small=9pt] +\definebodyfontenvironment [12pt] [interlinespace=14pt,big=14.4pt,small=10pt] +\definebodyfontenvironment [14.4pt] [interlinespace=18pt,big=14.4pt,small=12pt] +\definebodyfontenvironment [9.8pt] % Because 9.8pt is used in typing environments + +%D \TUGBOAT\ uses Computer Modern fonts, and \CONTEXT\ uses Latin Modern +%D by default. So, we just specify the font size. + +\setupbodyfont [10pt] + +% Italic rather than slanted for emphasis. +\setupbodyfontenvironment[default][em=italic] + +% Break after these chars in urls, not before. +\sethyphenatedurlafter / +\sethyphenatedurlafter . +\sethyphenatedurlafter _ + +%D \section Layout Setup %<<<1 +%D +%D The original layout used in the \LATEX\ style for \TUGBOAT\ is a bit +%D ambiguous. It uses low|-|level \TEX\ syntax, rather than changing the +%D layout in a human understandable way (for example, by using the +%D \mono{geometry} package. I have tried to translate it to \CONTEXT\ as +%D far as I understand. + +\setuppapersize[letter][letter] + +\setuplayout + [topspace=3.8pc,% was 3.5pc + header=1pc, + headerdistance=1.5pc, + height=middle, + footerdistance=2pc, + footer=1pc, + bottomspace=3pc, + % + backspace=6pc, + width=middle, + cutspace=6pc, + % + margin=4pc, + margindistance=1pc, + ] + +\setupcolumns[distance=1.5pc] + +\setuppagenumbering + [location=, + alternative=doublesided] + +%D In \TUGBOAT\ different articles are glued together to form the final +%D journal, so we do not want each article to occupy even number of +%D pages. + +\installpagebreakhandler {last} {} + +%D \section Indentation %<<<1 +%D +%D We use automatic indentation control, that is: no +%D indentation after titles and skips. + +\setupindenting[20pt,yes] + +%D We do not want indentation after lists. + +\setupenumerations [indentnext=no] + +\setupdescriptions [indentnext=no] + +%D \section Itemize +%D +%D And these. We typeset itemizations ragged right. + +\setupitemgroup + [itemize] + [indentnext=no, + align=right] + +%D We align them at the paragraph indentation and +%D pack them by default. + +\setupitemgroup + [itemize] + [each] + [margin=1pc, + width=1em, + distance=0pt] + +\setupitemgroup + [itemize] + [1] + [packed] + +%D \section Section Headings %<<<1 +%D +%D We follow the \TUGBOAT\ style for sections. I do not know if +%D \type{align=right} also disables hyphenation. Lets wait and see on +%D this. Rest all is straight forward. It took me a while to realize +%D that in \LATEX\ \type{\@startsection} the absolute value of before +%D skip (fourth argument) is important and not the sign. + +\setuphead + [section,subsection, subsubsection, + subject, subsubject, subsubsubject] + [style=bold, + align=right, + before={\blank[8pt]}, + after={\blank[4pt]}] + +%D \section Spacing <<<1 +%D +%D We define a logical skip. This is equal to the \tex{topsep} in latex, +%D and most environments should have this skip. + +\defineblank[tugblank][3pt] +\setupblank[3pt] + + +\setupitemize[1][before={\blank[tugblank]},after={\blank[tugblank]}, + inbetween={\blank[tugblank]}] + +\setuplines[before={\blank[tugblank]},after={\blank[tugblank]}, + inbetween={\blank[tugblank]}] + +%D \section Typing %<<<1 +%D +%D \TUGBOAT\ uses a smaller font size for verbatim typesetting. + +\setuptyping + [option=none, + % mkiv arbitrarily scales lm somehow randomly; 10pt gets 9pt back, + % we make it a little smaller. + bodyfont=9.8pt, + before={\blank[nowhite]}, % AM: If this is too small, use \blank[nowhite,tugblank]} + after={\blank[back,nowhite,tugblank]}] + +%D \section Footnotes %<<<1 +%D +%D Not entirely a la \TUGBOAT: + +\setupfootnotes + [bodyfont=9pt, + location=columns%, +% rule={\hrule width 5pc height .4pt depth 0pt\relax \kern \strutdepth} +] + +\setupnotation[footnote] + [location=joinedup, + width=fit, + headstyle=normal, + distance=.5em] + +%>>> +%D \section List %<<< +%D +%D We define a standard description and enumeration +%D environment. + +\definedescription + [description] + [location=hanging, + width=broad, + before={\blank[tugblank]}, + after={\blank[tugblank]}] + +\defineenumeration + [enumeration] + [location=hanging, + width=broad, + before={\blank[tugblank]}, + after={\blank[tugblank]}] + + +% >>> +%D \section References %<<< +%D +%D The bib does not handle urls nicely. So we provide a stop gap solution. + +\definereferenceformat[cite][left={[},right={]}] +\defineitemgroup [bibliography] [levels=1] +\setupitemgroup [bibliography] + [symbol=n, + left={[}, + right={]}, + width=1.5em, + stopper=, + itemalign=flushright, + inbetween={\blank[small]}] + +%D Instead of color, we use weighted gray scales: +\setupcolors + [conversion=always] + +%D English it is. +\mainlanguage + [en] + +%D We define some logical skips + +\defineblank [tugbefore] [big] +\defineblank [tuginbetween][big] +\defineblank [tugafter] [tugbefore] + +%D Some real macros: <<< + +\def\StartAbstract + {\dostartbuffer[abstract][StartAbstract][StopAbstract]} + +\startsetups tugboat:abstract:setup + + \setuptolerance + [horizontal, tolerant] + + \setupnarrower + [before={\blank[.5\baselineskip]}, +% after={\blank[10pt plus4pt minus4pt]}, + after={\blank[10pt]}, + middle=4.875pc] + +\stopsetups + +%D Headers and footers are different for normal issues +%D and proceedings. + +\startsetups tugboat:banner:text:article + + {\sl TUGboat},\space + Volume \getvariable{tugboat}{volume}\space + (\getvariable{tugboat}{year}),\space + No.\space\getvariable{tugboat}{number} + +\stopsetups + +\def\postissno{Proceedings of the \tubyear\ Annual Meeting} + +\startsetups tugboat:banner:text:proceedings + + \setups{tugboat:banner:text:article} + \thinspace---\thinspace + \postissno + +\stopsetups + +\startsetups tugboat:banner:setup:article + + \setupheadertexts + [\setups{tugboat:banner:text:article}] + [\pagenumber] + +% no footer in regular articles +% \setupfootertexts +% [][\getvariable{tugboat}{author}] +% [\getvariable{tugboat}{title}][] + +\stopsetups + +\startsetups tugboat:banner:setup:proceedings + + \setupheadertexts + [][\getvariable{tugboat}{title}] + [\getvariable{tugboat}{author}][] + + \setupfootertexts + [\setups{tugboat:banner:text:proceedings}] + [\pagenumber] + +\stopsetups + +%D article is default so, + +\setups{tugboat:banner:setup:article} + +%D It all starts here: + +\def\StartArticle{\setups{tugboat:\getvariable{tugboat}{type}:start}} +\def\StopArticle {\setups{tugboat:article:stop}} + +\startsetups tugboat:grid:setup:settings:yes + + \setupblank + [line] + + \defineblank [tugbefore] [halfline] + \defineblank [tuginbetween] [halfline] + +\stopsetups + +\startsetups tugboat:grid:setup:no + +% \setupblank +% [halfline] + +% \defineblank [medium] [halfline] +% \defineblank [tugbefore] [halfline] +% \defineblank [tuginbetween] [halfline] + +\stopsetups + +\startsetups tugboat:introduction:article + +% \blank[halfline] + + \start + \def\\{\unskip\space\&\space\ignorespaces} + \hbox{\indent\getvariable{tugboat}{author}} + \par + \stop + + +\stopsetups + +\startsetups tugboat:introduction:proceedings + + \blank[20pt] + + \start + \switchtobodyfont[12pt] + \def\\{\unskip\space\&\space\ignorespaces} + \getvariable{tugboat}{author} + \par + \stop + + \start + \switchtobodyfont[9pt] + \def\\{\unskip,\space\ignorespaces} + \getvariable{tugboat}{address} + \par + {\tt\getvariable{tugboat}{email}} + \par + \stop + + +\stopsetups + +\startsetups tugboat:article:start + + \starttext + + \setups{tugboat:columns:\getvariable{tugboat}{columns}} + \setups{tugboat:banner:setup:\getvariable{tugboat}{type}} + + \doif{\getvariable{tugboat}{columns}}{yes}{\startcolumns} + + + % AM: Why set these again? + % \setupheadertexts + % [\setups{tugboat:banner:text:article}] + % [pagenumber] + + % \setuppagenumber + % [number=\getvariable{tugboat}{page}] + \setcounter[userpage][\getvariable{tugboat}{page}] + + % \setuplayout + % [grid=\getvariable{tugboat}{grid}] + + % % instead of \startmode [*grid] ... \stopmode + % % instead of \startnotmode[*grid] ... \stopnotmode + + \setups{tugboat:grid:setup:\getvariable{tugboat}{grid}} + + \snaptogrid \vbox \bgroup + + \forgetall +\hrule height .6pt +\blank[halfline] + \start + \let\\=\par + {\bf\getvariable{tugboat}{title}} + \par + \blank[halfline] + \hskip20pt\getvariable{tugboat}{author} + \stop + +% \setups{tugboat:introduction:\getvariable{tugboat}{type}} + + \blank[line] + + \doiftext{\getbuffer[abstract]} + {\let\\=\endgraf + \setups{tugboat:abstract:setup} + \subject{Abstract} + \getbuffer[abstract]} + \egroup +\stopsetups + +\startsetups tugboat:proceedings:start + + \starttext + + \setups{tugboat:columns:\getvariable{tugboat}{columns}} + \setups{tugboat:banner:setup:\getvariable{tugboat}{type}} + + \setupheader + [state=empty] + + \setuppagenumber + [number=\getvariable{tugboat}{page}] + + \setuplayout + [grid=\getvariable{tugboat}{grid}] + + % instead of \startmode [*grid] ... \stopmode + % instead of \startnotmode[*grid] ... \stopnotmode + \doifmodeelse{*grid}{\setups{tugboat:grid:setup:yes}}{\setups{tugboat:grid:setup:no}} +% \setups{tugboat:grid:setup:\systemmodevalue{grid}{yes}{no}} + + \snaptogrid \vbox \bgroup + + \forgetall + + \start + \switchtobodyfont[14.4pt] + \let\\=\par + \getvariable{tugboat}{title} + \par + \stop + + \setups{tugboat:introduction:\getvariable{tugboat}{type}} + + \blank[9pt]% plus3pt minus3pt] + + \let\\=\par + \setups{tugboat:abstract:setup} + \midaligned{\bf Abstract} + + \startnarrower[middle] + \getbuffer[abstract] + \stopnarrower + + % \blank[10pt plus4pt minus4pt] + + \egroup + + \doif{\getvariable{tugboat}{columns}}{yes}{\startcolumns} + +\stopsetups + +\def\signaturewidth{13pc} + +\definefontsynonym[LMSY][lmsy10] +\def\mydiamond{\getglyph{LMSY}{\char5}} + +\startsetups tugboat:affiliation:article + + \blank[line] + + \snaptogrid \vbox \bgroup + + \forgetall + + \leftskip=\textwidth \advance\leftskip by -\signaturewidth + + \let\\=\par + \leavevmode\llap{\mydiamond\enspace}\getvariable{tugboat}{author} + \par + \getvariable{tugboat}{address} + \par + {\tt\getvariable{tugboat}{email}} + + \egroup + +\stopsetups + +\startsetups tugboat:affiliation:proceedings + + % nothing fancy at the end + +\stopsetups + +\startsetups tugboat:article:stop + + \setups{tugboat:affiliation:\getvariable{tugboat}{type}} + + \doif{\getvariable{tugboat}{columns}}{yes}{\stopcolumns} + + \page + + \stoptext + +\stopsetups + +%D Normal word spacing, please. + +\setuptolerance + [strict] + +%D One can use the following setups (in the article) to +%D collect settings specific to normal and/or multi +%D column typesetting. + +\startsetups tugboat:columns:yes + +\stopsetups + +\startsetups tugboat:columns:no + +\stopsetups + +% >>> Logos, abbreviations: TODO: Clean up <<< +\font\mflogo = logo10 +\def\MF{{\mflogo META\-FONT}} + +\def\ALEPH{Aleph} +\def\API{\acro{API}} +\def\CCODE{C} +\def\CD{\acro{CD}} +\def\CMYK{\acro{CMYK}} +\def\CONTEXT{C\kern-.0333emon\-\kern-.0667em\TeX\kern-.0333emt} +\def\CPU{\acro{CPU}} +\def\DVI{\acro{DVI}} +\def\DVIPDFMX{dvipdfmx} +\def\DVIPS{dvips} +\def\ETEX{$\varepsilon$-\kern-.125em\TeX} +\def\FTP{\acro{FTP}} +\def\HTTP{\acro{HTTP}} +\def\IO{\acro{I/O}} +\def\ISO{\acro{ISO}} +\def\KPSEWHICH{kpsewhich} +\def\KPSE{\acro{KPSE}} +\newcount\TestCount +\newbox\TestBox +\def\La{\TestCount=\the\fam \leavevmode L% + \setbox\TestBox=\hbox{$\fam\TestCount\scriptstyle A$}% + \kern-.5\wd\TestBox\raise.42ex\box\TestBox} +\def\LATEX{\La\kern-.15em\TeX} +\def\LATEXE{\LaTeX{}\kern.05em2$_{\textstyle\varepsilon}$} +\def\LINUX{Linux} +\def\LPEG{Lpeg} +\def\LUAJIT{Lua\acro{JIT}} +\def\LUATEX{Lua\-\TeX} +\def\LUATOOLS{lua\-tools} +\def\LUA{Lua} +\def\MATHML{Math\acro{ML}} +\def\METAFUN{Metafun} +\def\METAPOST{MetaPost} +\def\METATEX{Meta\TeX{}} +\def\MKII{Mk\acro{II}} +\def\MKIV{Mk\acro{IV}} +\def\MPLIB{\acro{MP}lib} +\def\MPTOPDF{mp\-to\-pdf} +\def\MSWINDOWS{Windows} +\def\MTXTOOLS{mtx\-tools} +\def\NFSS{\acro{NFSS}} +\def\OPENMATH{Open\-Math} +\def\OPENTYPE{Open\-Type} +\def\PASCAL{Pascal} +\def\PDFTEX{pdf\/\-\TeX} +\def\PDF{\acro{PDF}} +\def\POSIX{\acro{POSIX}} +\def\PRAGMA{Pragma \acro{ADE}} +\def\POSTSCRIPT{Post\-Script} +\def\RGB{\acro{RGB}} +\def\RUBY{Ruby} +\def\SCITE{Sci\acro{TE}} +\def\TDS{\acro{TDS}} +\def\TEXBOOK{{\sl The \TeX book}} +\def\TEXEXEC{\TeX exec} +\def\TEX{\TeX} +\def\TFM{\acro{TFM}} +\def\TRUETYPE{True\-Type} +\def\TYPEONE{Type~1} +\def\UTF{\acro{UTF}} +\def\WEBC{Web2C} +\def\XETEX{X\lower.5ex\hbox{\kern-.15em\mirror{E}}\kern-.1667em\TeX} +\def\XML{\acro{XML}} +\def\XPATH{\acro{XP}ath} +\def\XSLT{\acro{XSLT}} +\def\XSLTPROC{\acro{XSLTPROC}} +\def\ZIP{zip} + +\def\Dash{\unskip\thinspace---\thinspace\ignorespaces} +\def\slash{/\penalty0 \hskip0pt \relax} + +\definefont[AcroFont][Serif sa .91] +\def\acro#1{{\AcroFont #1}} + +\lefthyphenmin=2 \righthyphenmin=3 % disallow x- or -xx breaks + +\hyphenation{Post-Script data-base data-bases} + +% hack to read tugboat.dates settings. +\def\vol#1, #2.{\def\tubvol{#1}\def\tubnum{#2}} +\def\issyear#1.{\def\tubyear{#1}} +\newcount\issueseqno + +% >>> +%D Good bye. <<< + +\doifnotmode{demo}{\endinput} + +\showgrid + +\starttext + +\StartArticle + +\StartAbstract + \input bryson +\StopAbstract + +\dorecurse{30}{\input ward \endgraf} \page + +\startitemize +\item \input ward +\item \input ward +\stopitemize + +\StopArticle + +\setvariables[tugboat][columns=yes] + +\StartArticle + +\StartAbstract + \input bryson +\StopAbstract + +\dorecurse{30}{\input ward \endgraf} \page + +\StopArticle + +\stoptext + +% >>> + +% vim: foldmethod=marker foldmarker=<<<,>>> diff --git a/tex/context/modules/mkiv/s-youless.mkiv b/tex/context/modules/mkiv/s-youless.mkiv index e15973b9c..d8b6e2ff6 100644 --- a/tex/context/modules/mkiv/s-youless.mkiv +++ b/tex/context/modules/mkiv/s-youless.mkiv @@ -23,125 +23,165 @@ % in cronjob on one of the servers: % -% mtxrun --script youless --collect --host=192.168.2.50 --watt youless-watt.lua -% mtxrun --script youless --collect --host=192.168.2.50 --kwk youless-kwh.lua +% mtxrun --script youless --collect --host=192.168.2.50 --nobackup --electricity youless-electricity.lua \startluacode require("util-you") - moduledata.youless = { } + local round = math.round - function moduledata.youless.kwh(specification) - -- todo - end + moduledata.youless = { } - function moduledata.youless.watt(specification) + local function process(specification) - local year = tonumber(specification.year) or os.today().year - local data = table.load(specification.filename or "youless-watt.lua") + local data, message = utilities.youless.analyze(specification.filename or "youless-electricity.lua") - if not data or data.variant ~= "watt" then - context("invalid variant") + if not data then + context(message) return end - utilities.youless.analyze(data) - - -- for the moment no specific font scaling - - local years = data.years - - if not years then - context("no years") - return + local year = tonumber(specification.year) or os.today().year + local years = data.years + local variant = data.variant + local unit = specification.unit + local maxunit = specification.maxunit + + local max = specification[maxunit] + + if not max then + if unit == "watt" then + max = 10000 + elseif unit == "liters" then + max = 1000 + else + max = 5000 -- can't happen + end end - for y=year,year do - - local year = years[y] - local scale = 20 - local mark = 3 - local maxwatt = specification.maxwatt or year.maxwatt - - for m=1,12 do - local month = year.months[m] - if month then - context.startMPpage { offset = "10pt" } - context("linecap := butt; pickup pencircle scaled .5") + local max = max + local delta = round(max/10) + local scale = round(delta/20) + local mark = 3 - for i=0,(math.div(maxwatt,1000)+1)*1000,100 do - context("draw (%s,%s) -- (%s,%s) withcolor .6white ;",0,i/scale,31 * 24,i/scale) - end + for y=year,year do + local year = years[y] + if year then + local grand = 0 + for m=1,12 do + local month = year.months[m] + if month then + context.startMPpage { offset = "10pt" } + context("linecap := butt; pickup pencircle scaled .5") + + for i=0,(math.div(max,delta)+1)*delta,delta/10 do + context("draw (%s,%s) -- (%s,%s) withcolor .6white ;",0,i/scale,31 * 24,i/scale) + end - context("draw (0,%s) -- (31 * 24,%s) dashed dashpattern(on 6 off 6) withcolor darkgreen withpen pencircle scaled 1 ;",year.watt /scale,year.watt /scale) - context("draw (0,%s) -- (31 * 24,%s) dashed dashpattern(off 6 on 6) withcolor darkred withpen pencircle scaled 1 ;",month.watt/scale,month.watt/scale) - - local days = month.days - if days then - local nd = os.nofdays(y,m) - for d=1,nd do - local day = days[d] - local xoffset = (d-1) * 24 - local wd = os.weekday(d,m,y) - local weekend = wd == 1 or wd == 7 - if not weekend then - -- okay - elseif mark == 1 then - context("draw (%s,%s) -- (%s,%s) ; ",xoffset, -17.5,xoffset, -32.5) - context("draw (%s,%s) -- (%s,%s) ; ",xoffset+24,-17.5,xoffset+24,-32.5) - elseif mark == 2 then - context("draw (%s,%s) -- (%s,%s) ; ",xoffset, -17.5,xoffset+24,-17.5) - context("draw (%s,%s) -- (%s,%s) ; ",xoffset, -32.5,xoffset+24,-32.5) - elseif mark == 3 then - context("draw unitsquare xysized (%s,%s) shifted (%s,%s) ; ",24,15,xoffset,-32.5) - end - context([[draw textext("%s") shifted (%s,%s) ; ]],d,xoffset + 12,-25) - if day then - for h=0,23 do - local hours = day.hours - if hours then - local hour = hours[h] - if hour then - local dx = xoffset + h - local dy = hour.watt/scale - local dm = hour.maxwatt/scale - context("draw (%s,%s) -- (%s,%s) withcolor %s ; ",dx, 0,dx,dy,weekend and "darkmagenta" or "darkblue") - context("draw (%s,%s) -- (%s,%s) withcolor %s ; ",dx,dy,dx,dm,"darkgray") + context("draw (0,%s) -- (31 * 24,%s) dashed dashpattern(on 6 off 6) withcolor darkgreen withpen pencircle scaled 1 ;",year [unit]/scale,year [unit]/scale) + context("draw (0,%s) -- (31 * 24,%s) dashed dashpattern(off 6 on 6) withcolor darkred withpen pencircle scaled 1 ;",month[unit]/scale,month[unit]/scale) + + local days = month.days + local total = 0 + if days then + local nd = os.nofdays(y,m) + for d=1,nd do + local day = days[d] + local xoffset = (d-1) * 24 + local wd = os.weekday(d,m,y) + local weekend = wd == 1 or wd == 7 + if not weekend then + -- okay + elseif mark == 1 then + context("draw (%s,%s) -- (%s,%s) ; ",xoffset, -17.5,xoffset, -32.5) + context("draw (%s,%s) -- (%s,%s) ; ",xoffset+24,-17.5,xoffset+24,-32.5) + elseif mark == 2 then + context("draw (%s,%s) -- (%s,%s) ;",xoffset, -17.5,xoffset+24,-17.5) + context("draw (%s,%s) -- (%s,%s) ;",xoffset, -32.5,xoffset+24,-32.5) + elseif mark == 3 then + context("draw unitsquare xysized (%s,%s) shifted (%s,%s) ;",24,15,xoffset,-32.5) + end + context([[draw textext("\strut%s") shifted (%s,%s) ;]],d,xoffset + 12,-25) + if day then + for h=0,23 do + local hours = day.hours + if hours then + local hour = hours[h] + if hour then + local dx = xoffset + h + local dy = hour[unit]/scale + local dm = hour[maxunit]/scale + context("draw (%s,%s) -- (%s,%s) withcolor %s ;",dx, 0,dx,dy,weekend and "darkmagenta" or "darkblue") + context("draw (%s,%s) -- (%s,%s) withcolor %s ;",dx,dy,dx,dm,"darkgray") + end end end + local use = day.total + if use then + context([[draw textext("\strut\small\small\small%0.1f") shifted (%s,%s) ;]],use/1000,xoffset + 12,-7.5) + total = total + use + end end end + for d=0,30 do + local xoffset = d * 24 + context("draw (%s,%s) -- (%s,%s) withcolor darkgray ;",xoffset+ 0,0,xoffset+ 0,-10) + context("draw (%s,%s) -- (%s,%s) withcolor darkgray ;",xoffset+ 6,0,xoffset+ 6,-2.5) + context("draw (%s,%s) -- (%s,%s) withcolor darkgray ;",xoffset+12,0,xoffset+12,-5) + context("draw (%s,%s) -- (%s,%s) withcolor darkgray ;",xoffset+18,0,xoffset+18,-2.5) + end + local xoffset = 31 * 24 + context("draw (%s,%s) -- (%s,%s) withcolor darkgray ;",xoffset,0,xoffset,-10) end - for d=0,30 do - local xoffset = d * 24 - context("draw (%s,%s) -- (%s,%s) withcolor darkgray ; ",xoffset+ 0,0,xoffset+ 0,-10) - context("draw (%s,%s) -- (%s,%s) withcolor darkgray ; ",xoffset+ 6,0,xoffset+ 6,-2.5) - context("draw (%s,%s) -- (%s,%s) withcolor darkgray ; ",xoffset+12,0,xoffset+12,-5) - context("draw (%s,%s) -- (%s,%s) withcolor darkgray ; ",xoffset+18,0,xoffset+18,-2.5) - end - local xoffset = 31 * 24 - context("draw (%s,%s) -- (%s,%s) withcolor darkgray ; ",xoffset,0,xoffset,-10) - end - local max = (math.div(maxwatt,1000)+1) + grand = grand + total - for i=0,max*1000,1000 do - context([[draw textext.lft("%s") shifted (%s,%s) ; ]],i,-10,i/scale) - context("draw (%s,%s) -- (%s,%s) withcolor .2white ;",0,i/scale,31 * 24,i/scale) - end + local max = (math.div(max,delta)) + + for i=0,max*delta,delta do + if i > 0 then + context([[draw textext.lft("\hbox to 3.5em{\hss\strut%r}") shifted (%s,%s) ; ]],i,-10,i/scale) + end + context("draw (%s,%s) -- (%s,%s) withcolor .2white ;",0,i/scale,31 * 24,i/scale) + end - context([[draw textext("\strut\month{%s}\enspace%s") shifted (%s,%s) ; ]],m, y, 31 * 24 / 2, -50) - context([[draw textext.lft("watt") shifted (%s,%s) ; ]],-10,-25) + context([[draw textext ("\strut\Word{%s}\enspace\emdash\enspace\month{%s}\enspace%s") shifted (%s,%s) ; ]],variant, m, y, 31 * 24 / 2, -50) + context([[draw textext.lft("\hbox to 3.5em{\hss\strut%s}") shifted (%s,%s) ; ]],unit,-10,-25) + context([[draw textext.lft("\hbox to 3.5em{\hss\strut\small\small\small%0.1f %s}") shifted (%s,%s) ;]],total/1000,unit == "watt" and "kWh" or [[m\high{3}]],-10, -7.5) + context([[draw textext.lft("\hbox to 3.5em{\hss\strut\small\small\small\Sigma\nbsp%0.1f %s}") shifted (%s,%s) ;]],grand/1000,unit == "watt" and "kWh" or [[m\high{3}]],-10,-50.0) - context.stopMPpage() - else - -- maybe placeholder + context.stopMPpage() + else + -- maybe placeholder + end end end - end + end + + function moduledata.youless.kwh(specification) + -- todo + end + + function moduledata.youless.electricity(specification) + specification.unit = "watt" + specification.maxunit = "maxwatt" + process(specification) + end + + moduledata.youless.watt = moduledata.youless.electricity + + function moduledata.youless.gas(specification) + specification.unit = "liters" + specification.maxunit = "maxliters" + process(specification) + end + function moduledata.youless.pulse(specification) + specification.unit = "watt" + specification.maxunit = "maxwatt" + process(specification) end \stopluacode @@ -160,11 +200,11 @@ \startluacode - -- os.execute([[mtxrun --script youless --collect --watt "c:/data/system/youless/data/youless-watt.lua"]]) - -- os.execute([[mtxrun --script youless --collect --watt --nobackup "c:/data/system/youless/data/youless-watt.lua"]]) - -- moduledata.youless.watt { year = 2013, filename = "c:/data/system/youless/data/youless-watt.lua" } + -- os.execute([[mtxrun --script youless --collect --electricity "c:/data/system/youless/data/youless-electricity.lua"]]) + -- os.execute([[mtxrun --script youless --collect --electricity --nobackup "c:/data/system/youless/data/youless-electricity.lua"]]) + -- moduledata.youless.electricity { year = 2017, filename = "c:/data/system/youless/data/youless-electricity.lua" } - moduledata.youless.watt { year = 2013, filename = "youless-watt.lua" } + moduledata.youless.electricity { year = 2017, filename = "youless-electricity.lua" } \stopluacode diff --git a/tex/context/modules/mkiv/x-asciimath.lua b/tex/context/modules/mkiv/x-asciimath.lua index 677d3519b..7785d5587 100644 --- a/tex/context/modules/mkiv/x-asciimath.lua +++ b/tex/context/modules/mkiv/x-asciimath.lua @@ -35,7 +35,7 @@ if not characters then require("char-ent") end -local type, rawget = type, rawget +local rawget, next, type = rawget, next, type local concat, insert, remove = table.concat, table.insert, table.remove local rep, gmatch, gsub, find = string.rep, string.gmatch, string.gsub, string.find local utfchar, utfbyte = utf.char, utf.byte @@ -103,14 +103,18 @@ local reserved = { ["max"] = { false, "\\max" }, ["ln"] = { false, "\\ln" }, - ["atan"] = { false, "\\atan" }, -- extra - ["acos"] = { false, "\\acos" }, -- extra - ["asin"] = { false, "\\asin" }, -- extra + -- ["atan"] = { false, "\\atan" }, -- extra + -- ["acos"] = { false, "\\acos" }, -- extra + -- ["asin"] = { false, "\\asin" }, -- extra ["arctan"] = { false, "\\arctan" }, -- extra ["arccos"] = { false, "\\arccos" }, -- extra ["arcsin"] = { false, "\\arcsin" }, -- extra + ["arctanh"] = { false, "\\arctanh" }, -- extra + ["arccosh"] = { false, "\\arccosh" }, -- extra + ["arcsinh"] = { false, "\\arcsinh" }, -- extra + ["and"] = { false, "\\text{and}" }, ["or"] = { false, "\\text{or}" }, ["if"] = { false, "\\text{if}" }, @@ -121,8 +125,9 @@ local reserved = { ["frac"] = { false, "\\frac", "binary" }, ["stackrel"] = { false, "\\asciimathstackrel", "binary" }, ["hat"] = { false, "\\widehat", "unary" }, - ["bar"] = { false, "\\overbar", "unary" }, - ["overbar"] = { false, "\\overbar", "unary" }, + ["bar"] = { false, "\\overline", "unary" }, + ["overbar"] = { false, "\\overline", "unary" }, + ["overline"] = { false, "\\overline", "unary" }, ["underline"] = { false, "\\underline", "unary" }, ["ul"] = { false, "\\underline", "unary" }, ["vec"] = { false, "\\overrightarrow", "unary" }, @@ -797,14 +802,18 @@ local isstupid = { ["\\max"] = true, ["\\ln"] = true, - ["\\atan"] = true, - ["\\acos"] = true, - ["\\asin"] = true, - true, + -- ["\\atan"] = true, + -- ["\\acos"] = true, + -- ["\\asin"] = true, + ["\\arctan"] = true, ["\\arccos"] = true, ["\\arcsin"] = true, + ["\\arctanh"] = true, + ["\\arccosh"] = true, + ["\\arcsinh"] = true, + ["f"] = true, ["g"] = true, } @@ -834,7 +843,8 @@ local issimplified = { -- --- special mess +-- special mess (we have a generic one now but for the moment keep this) +-- special mess (we have a generic one now but for the moment keep this) local d_one = R("09") local d_two = d_one * d_one @@ -894,6 +904,8 @@ local symbolmethod = nil local digitseparator = utfchar(0x2008) local digitsymbol = "." +local v_yes_digits = interfaces and interfaces.variables.yes or true + function asciimath.setup(settings) splitmethod = splitmethods[tonumber(settings.splitmethod) or 0] if splitmethod then @@ -902,7 +914,8 @@ function asciimath.setup(settings) digitsymbol = "." end local separator = settings.separator - if separator == true or not interfaces or interfaces.variables.yes then + -- if separator == true or not interfaces or interfaces.variables.yes then + if separator == true or separator == nil or separator == v_yes_digits then digitseparator = utfchar(0x2008) elseif type(separator) == "string" and separator ~= "" then digitseparator = separator @@ -1277,7 +1290,8 @@ local function collapse_bars(t) -- problem: we can have a proper nesting local d = false for i=1,m do - if find(t[i],"\\left") then + local ti = t[i] + if type(ti) == "string" and find(ti,"\\left",1,true) then d = true break end @@ -1791,6 +1805,14 @@ local p = ( + p_utf_base )^0 +-- faster: +-- +-- local p = ( +-- (S("{[(") + P("\\left" )) * Cc(function() n = n + 1 end) +-- + (S("}])") + P("\\right")) * Cc(function() n = n - 1 end) +-- + p_utf_base +-- )^0 + local function invalidtex(str) n = 0 lpegmatch(p,str) @@ -1933,7 +1955,7 @@ local uncrapped = { } local function convert(str,nowrap) - if #str > 0 then + if str ~= "" then local unicoded = lpegmatch(u_parser,str) or str if lpegmatch(p_onechar,unicoded) then ctx_mathematics(uncrapped[unicoded] or unicoded) diff --git a/tex/context/modules/mkiv/x-asciimath.mkiv b/tex/context/modules/mkiv/x-asciimath.mkiv index 5c96d4f8a..1b0567dbd 100644 --- a/tex/context/modules/mkiv/x-asciimath.mkiv +++ b/tex/context/modules/mkiv/x-asciimath.mkiv @@ -165,6 +165,7 @@ \appendtoks \enableautofences + \enableautofencemode \to \everyasciimath \unexpanded\def\asciimath diff --git a/tex/context/modules/mkiv/x-calcmath.lua b/tex/context/modules/mkiv/x-calcmath.lua index c96d8d0ac..41a43cacd 100644 --- a/tex/context/modules/mkiv/x-calcmath.lua +++ b/tex/context/modules/mkiv/x-calcmath.lua @@ -8,6 +8,7 @@ if not modules then modules = { } end modules ['x-calcmath'] = { -- this really needs to be redone +local next, type = next, type local format, lower, upper, gsub, sub = string.format, string.lower, string.upper, string.gsub, string.sub local concat = table.concat local lpegmatch = lpeg.match diff --git a/tex/context/modules/mkiv/x-cals.lua b/tex/context/modules/mkiv/x-cals.lua index 3af6106d8..9d54733b8 100644 --- a/tex/context/modules/mkiv/x-cals.lua +++ b/tex/context/modules/mkiv/x-cals.lua @@ -6,9 +6,9 @@ if not modules then modules = { } end modules ['x-cals'] = { license = "see context related readme files" } -local next = next +local next, type = next, type local format, lower = string.format, string.lower -local xmlsprint, xmlcprint, xmlcollected, xmlelements = xml.sprint, xml.cprint, xml.collected, xml.elements +local xmlcprint, xmlcollected, xmlelements = xml.cprint, xml.collected, xml.elements local n_todimen, s_todimen = number.todimen, string.todimen -- there is room for speedups as well as cleanup (using context functions) diff --git a/tex/context/modules/mkiv/x-ct.lua b/tex/context/modules/mkiv/x-ct.lua index 9c647e8e7..d9d474825 100644 --- a/tex/context/modules/mkiv/x-ct.lua +++ b/tex/context/modules/mkiv/x-ct.lua @@ -37,7 +37,7 @@ local function roottemplate(root) if template then return template else - if not find(rt,"|") then + if not find(rt,"|",1,true) then rt = gsub(rt,",","|") end if not find(rt,"^|") then rt = "|" .. rt end diff --git a/tex/context/modules/mkiv/x-html.mkiv b/tex/context/modules/mkiv/x-html.mkiv index 723872dfd..9fdbe38fd 100644 --- a/tex/context/modules/mkiv/x-html.mkiv +++ b/tex/context/modules/mkiv/x-html.mkiv @@ -148,7 +148,7 @@ % % we can also use \xmlmap for border etc -% \registerctxluafile{lxml-css}{1.001} +% \registerctxluafile{lxml-css}{} \starttexdefinition cssgetsinglepadding #1 \ctxlua { diff --git a/tex/context/modules/mkiv/x-ldx.lua b/tex/context/modules/mkiv/x-ldx.lua index e88c4c797..775c9a16d 100644 --- a/tex/context/modules/mkiv/x-ldx.lua +++ b/tex/context/modules/mkiv/x-ldx.lua @@ -80,7 +80,7 @@ function ldx.load(filename) end local str = sub(data, i, #data) str = gsub(str, "^%s*(.-)%s*$", "%1") - if #str > 0 then + if str ~= "" then t[#t+1] = { code = str } end return t diff --git a/tex/context/modules/mkiv/x-lmx-demo.mkiv b/tex/context/modules/mkiv/x-lmx-demo.mkiv new file mode 100644 index 000000000..619af97e0 --- /dev/null +++ b/tex/context/modules/mkiv/x-lmx-demo.mkiv @@ -0,0 +1,143 @@ +% last page less markup + +\usemodule + [article] + +\setupbottomtexts + [\directsetup{document:comment}] + +\setuplayout + [bottom=1cm] + +\setupbottom + [style=\small\tt] + +\usemodule + [lmx-html] + +% \startxmlsetups exa:variables +% +% \xmlfilter{#1}{/exa:variable/command(exa:variable)} +% +% % todo: fontkerns +% +% \xmldoif {#1} {/exa:variable[@name='bodyfont']} { +% \setupbodyfont +% [\xmltext{#1}{/exa:variable[@name='bodyfont']}] +% } +% \xmldoif {#1} {/exa:variable[@name='cutmarks' and text()='yes']} { +% \setuppapersize +% [A4] +% [oversized] +% \setuplayout +% [marking=on, +% location=middle] +% } +% \xmldoif {#1} {/exa:variable[@name='spelling' and text()='yes']} { +% % \loadspellchecklist[en][spell-en.txt] +% % \setupspellchecking[state=start,method=1] +% } +% \xmldoif {#1} {/exa:variable[@name='frame' and text()='yes']} { +% \showframe +% } +% \xmldoif {#1} {/exa:variable[@name='markup' and text()='yes']} { +% \showmakeup +% } +% \xmldoif {#1} {/exa:variable[@name='request' and text()='yes']} { +% \enablemode[showrequest] +% } +% +% \stopxmlsetups + +\startxmlsetups exa:variable:cutmarks + \xmldoif {#1} {.[text() = 'yes']} { + \setuppapersize + [A4] + [oversized] + \setuplayout + [marking=on, + location=middle] + } +\stopxmlsetups + +\startxmlsetups exa:variable:bodyfont + \setupbodyfont + [\xmltext{#1}{.}] +\stopxmlsetups + +\startxmlsetups exa:variable:frame + \xmldoif {#1} {.[text() = 'yes']} { + \showframe + } +\stopxmlsetups + +\startxmlsetups exa:variable:markup + \xmldoif {#1} {.[text() = 'yes']} { + \showmakeup + } +\stopxmlsetups + +\startxmlsetups exa:variable:request + \xmldoif {#1} {.[text() = 'yes']} { + \enablemode[showrequest] + } +\stopxmlsetups + +\startxmlsetups exa:variable + \xmlsetup{#1}{exa:variable:\xmlatt{#1}{name}} +\stopxmlsetups + +\startxmlsetups exa:variables + \xmlfilter{#1}{/exa:variable/command(exa:variable)} +\stopxmlsetups + +\startsetups document:comment + \xmlfilter{main}{/exa:selection/exa:variables/exa:variable[@name='comment']/html()} +\stopsetups + +\startxmlsetups exa:entry + + \startchapter[title=\xmlatt{#1}{title}] + \samplefile{\xmlatt{#1}{id}} + \stopchapter + +\stopxmlsetups + +\startxmlsetups exa:selection + + \xmlfirst{#1}{/exa:variables} + + \starttitle[title={Contents}] + \placelist[chapter][criterium=all] + \stoptitle + + \xmlfilter{#1}{/exa:selectors/exa:selector/exa:tree/exa:entry/exa:entry/command(exa:entry)} + +\stopxmlsetups + +\startxmlsetups xml:request + \xmlsetsetup {#1} { + exa:variables|exa:selection + } {exa:*} +\stopxmlsetups + +\xmlregistersetup{xml:request} + +\starttext + + \xmlprocess{main}{\inputfilename}{} + + \page + + \doifelsemode {showrequest} { + + \usemodule[scite] + + \start + \switchtobodyfont[small] + \scitefile[\inputfilename] + \stop + + } + +\stoptext diff --git a/tex/context/modules/mkiv/x-lmx-html.mkiv b/tex/context/modules/mkiv/x-lmx-html.mkiv new file mode 100644 index 000000000..3195ef40e --- /dev/null +++ b/tex/context/modules/mkiv/x-lmx-html.mkiv @@ -0,0 +1,122 @@ +%D \module +%D [ file=x-lmx-html, +%D version=2018.03.10, +%D title=\CONTEXT\ Modules, +%D subtitle=Simple LMX HTML rendering (from text fields), +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +%D This is old code that we used in several places so it qualifies as a +%D proper module. It is means for generating simple \HTML\ from filled +%D in forms. It's not a general purpose \HTML\ rendering. + +\startmodule[lmx-html] + +\startxmlsetups lmx:html:setup + \xmlsetsetup{#1}{*}{lmx:html:*} + \xmlflush{#1} +\stopxmlsetups + +\startxmlsetups lmx:html:ul + \startitemize[packed] + \xmlflush{#1} + \stopitemize +\stopxmlsetups + +\startxmlsetups lmx:html:ol + \startitemize[packed,n] + \xmlflush{#1} + \stopitemize +\stopxmlsetups + +\startxmlsetups lmx:html:li + \startitem + \xmlflush{#1} + \stopitem +\stopxmlsetups + +\startxmlsetups lmx:html:p + \xmlflush{#1}\par +\stopxmlsetups + +\startxmlsetups lmx:html:br + \par +\stopxmlsetups + +\startxmlsetups lmx:html:a + \dontleavehmode + \begingroup + \tttf + \xmldoifelsetext {#1} {.} { + \goto{\hyphenatedurl{\xmlflush{#1}}}[url(\xmlatt{#1}{href})] + } { + \goto{\hyphenatedurl{\xmlatt{#1}{href}}}[url(\xmlatt{#1}{href})] + } + \endgroup +\stopxmlsetups + +\startxmlsetups lmx:html:em + \dontleavehmode + \begingroup\em\xmlflush{#1}\endgroup +\stopxmlsetups + +\startxmlsetups lmx:html:b + \dontleavehmode + \begingroup\bf\xmlflush{#1}\endgroup +\stopxmlsetups + +\startxmlsetups lmx:html:i + \dontleavehmode + \begingroup\it\xmlflush{#1}\endgroup +\stopxmlsetups + +\startxmlsetups lmx:html:strong + \dontleavehmode + \begingroup\bf\xmlflush{#1}\endgroup +\stopxmlsetups + +\startxmlsetups lmx:html:tt + \dontleavehmode + \begingroup\tt\xmlflush{#1}\endgroup +\stopxmlsetups + +% \startxmlsetups lmx:html:span +% \dontleavehmode +% \ctxcommand{doifelse(string.find([[ \xmlatt{#1}{style} ]],"underline"))} { +% \underbar{\xmlflush{#1}} +% } { +% \xmlflush{#1} +% } +% \stopxmlsetups + +\xmlmapvalue{text-decoration}{underline}{\directsetbar{underbar}} +\xmlmapvalue{text-decoration}{overline} {\directsetbar{overbar}} + +\startxmlsetups lmx:html:span + \dontleavehmode + \begingroup + \xmlcssmappedstylevalue{#1}{text-decoration}{text-decoration} + \xmlflush{#1} + \endgroup +\stopxmlsetups + +\startxmlsetups lmx:html:html + \xmlflush{#1}% should not be needed but we self tag .. needs checking +\stopxmlsetups + +\startluacode + local texfinalizers = xml.finalizers.tex + + function texfinalizers.html(collected,setup) + texfinalizers.xml(collected,"html",setup) + end +\stopluacode + +% \xmlfilter{...}{/.../html()} + +\stopmodule diff --git a/tex/context/modules/mkiv/x-mathml.lua b/tex/context/modules/mkiv/x-mathml.lua index 9650afab8..05feecf47 100644 --- a/tex/context/modules/mkiv/x-mathml.lua +++ b/tex/context/modules/mkiv/x-mathml.lua @@ -113,8 +113,8 @@ local o_replacements = { -- in main table ["$"] = "\\mmlchar{36}", -- $ ["%"] = "\\mmlchar{37}", ["&"] = "\\mmlchar{38}", - ["^"] = "\\mmlchar{94}{}", -- strange, sometimes luatex math sees the char instead of \char - ["_"] = "\\mmlchar{95}{}", -- so we need the {} + ["^"] = "\\mmlchar{94}{}", -- strange, sometimes luatex math sees the char instead of \char so we + ["_"] = "\\mmlchar{95}{}", -- need the {} ... has to do with active mess feedback into scanner ["~"] = "\\mmlchar{126}", [" "] = "", ["°"] = "^\\circ", -- hack diff --git a/tex/context/modules/mkiv/x-mathml.mkiv b/tex/context/modules/mkiv/x-mathml.mkiv index 50d31da0e..ea7f7d2e9 100644 --- a/tex/context/modules/mkiv/x-mathml.mkiv +++ b/tex/context/modules/mkiv/x-mathml.mkiv @@ -66,9 +66,13 @@ \xmlmapvalue {mml:math:dir} {ltr} {\setfalse\c_math_right_to_left\math_basics_synchronize_direction} \xmlmapvalue {mml:math:dir} {rtl} {\settrue \c_math_right_to_left\math_basics_synchronize_direction} +\edef\mmlconstantone {1} +\edef\mmlconstantfalse{false} + \startxmlsetups mml:math \begingroup \enableautofences + \enableautofencemode \xmlval {mml:math:dir} {\xmlatt{#1}{dir}} {} \xmlval {mml:math:display} {\xmlatt{#1}{display}} { \xmlval {mml:math:mode} {\xmlatt{#1}{mode}} { @@ -87,6 +91,7 @@ \startxmlsetups mml:imath \inlinemathematics { \enableautofences + \enableautofencemode %\math_fences_checked_start %\MMLhack \xmlflush{#1} @@ -97,6 +102,7 @@ \startxmlsetups mml:dmath \displaymathematics { \enableautofences + \enableautofencemode %\math_fences_checked_start %\MMLhack \xmlflush{#1} @@ -107,8 +113,9 @@ %D First we define some general formula elements. \startxmlsetups mml:formula - \edef\mmlformulalabel {\xmlatt{#1}{label}\xmlatt{#1}{id}} - \edef\mmlformulasublabel{\xmlatt{#1}{sublabel}\xmlatt{#1}{id}} + \edef\mmlformulaid {\xmlatt{#1}{id}} + \edef\mmlformulalabel {\xmlatt{#1}{label}\mmlformulaid} + \edef\mmlformulasublabel{\xmlatt{#1}{sublabel}\mmlformulaid} \doifsomething\mmlformulalabel{\placeformula[\mmlformulalabel]{\mmlformulasublabel}} \startformula %\MMLhack @@ -1934,12 +1941,28 @@ % spacing between - and 2 is taken care of by tex itself \startxmlsetups mml:mo - \doif {\xmlatt{#1}{maxsize}} {1} {\settrue\mmlignoredelimiter} - \doif {\xmlatt{#1}{stretchy}} {false} {\settrue\mmlignoredelimiter} + \edef\mmlattvalue{\xmlatt{#1}{maxsize}} + \ifx\mmlattvalue\mmlconstantone + \settrue\mmlignoredelimiter + \else + \edef\mmlattvalue{\xmlatt{#1}{stretchy}} + \ifx\mmlattvalue\mmlconstantfalse + \settrue\mmlignoredelimiter + \fi + \fi + \edef\mmlattvalue{\xmlatt{#1}{lspace}} + \ifx\mmlattvalue\empty\else + \hskip\mmlattvalue\relax % todo: check for dimension + \fi \ctxmodulemathml{mo("#1")} + \edef\mmlattvalue{\xmlatt{#1}{rspace}} + \ifx\mmlattvalue\empty\else + \hskip\mmlattvalue\relax % todo: check for dimension + \fi \setfalse\mmlignoredelimiter \stopxmlsetups + % \startxmlsetups mml:mfenced % {} around separator is needed for spacing % \def\MMLleft {\left }% weird % \def\MMLright {\right} @@ -2030,7 +2053,8 @@ \vcenter { \framed [frame=off,strut=no,background={\mmlmenclosenotation}] % offset is kind of undefined - {\startimath + { + \startpickupmath \expanded{\doifelseinset {mml:enclose:longdiv} {\mmlmenclosenotation}} { \overline{\left)\strut\xmlflush{#1}\right.} } { @@ -2048,7 +2072,8 @@ } } } - \stopimath} + \stoppickupmath + } } } } diff --git a/tex/context/modules/mkiv/x-setups-basics.mkiv b/tex/context/modules/mkiv/x-setups-basics.mkiv index 1c0eb8346..be96466b8 100644 --- a/tex/context/modules/mkiv/x-setups-basics.mkiv +++ b/tex/context/modules/mkiv/x-setups-basics.mkiv @@ -15,6 +15,14 @@ %D We can make this module a bit cleaner using more recent features or we go \LUA\ %D completely but as this style evolved over 15 years it's a waste of time. %D +%D +%D Thanks to Wolfgang these descriptions have become quite complete! In the process +%D of covering more commands and expecially different instances of the same command, +%D either or not generated, the supporting macros became more complex. I must admit +%D that it's not the nicest code base and whenever I have to add or patch something +%D I have to suppress the urge to rewrite this file. It needs watching a few +%D energetic videos (for instance with Simon Phillips drumming) to get going. +%D %D As we also have a help server we can make a common framework for this \unknown\ %D but even then, this file is also a test for the the \XML\ processor. %D @@ -25,7 +33,36 @@ %D Currently we load the \XML\ file and when not in the english interface we just %D remap the relevant words to their translation. -%D Todo: use lua instead of synonyms +%D \startbuffer +%D \usemodule[x-setups-basics] +%D +%D \loadsetups[context-en] +%D +%D \starttext +%D +%D \showsetup[starttyping:instance:LUA] +%D +%D \showsetup[starttyping:instance:typing] +%D +%D \showsetup[starttyping:instance:argument] +%D +%D \showsetup [completelistoffloats:instance:chemicals] \blank +%D \shortsetup[completelistoffloats:instance:chemicals] \blank +%D \basicsetup[completelistoffloats:instance:chemicals] \blank +%D +%D \cmdfullsetup [completelistoffloats:instance:chemicals] \blank +%D \cmdshortsetup[completelistoffloats:instance:chemicals] \blank +%D \cmdbasicsetup[completelistoffloats:instance:chemicals] \blank +%D +%D % \cmdinternal{...} +%D +%D \page \placeeverysetup \page +%D \page \placeeverysetupname \page +%D +%D \stoptext +%D \stopbuffer + +% Todo: use lua instead of synonyms \unprotect @@ -34,6 +71,8 @@ \definesorting [texcommand] + [texcommands] + [\v!none] \setupsorting [texcommand] @@ -71,7 +110,6 @@ \unexpanded\def\setupalwcolor{} \unexpanded\def\setupoptcolor{darkgray} -% \unexpanded\def\setupvarword#1{{\sl\detokenize{#1}}} \unexpanded\def\setupvarword#1{\detokenize{#1}} \unexpanded\def\setupintword#1{\WORD{\detokenize{#1}}} \unexpanded\def\setuptxtword#1{\detokenize{#1}} @@ -108,7 +146,6 @@ \let\currentSETUPprefix\empty } \edef\currentSETUPname{\xmlatt{#1}{name}} - \let\currentSETUPgenerated\empty \doifelsenothing {\xmlatt{#1}{variant}} { \let\currentSETUPvariant\empty } { @@ -118,7 +155,6 @@ \currentSETUPprefix \currentSETUPname \currentSETUPvariant - \currentSETUPgenerated } \stopxmlsetups @@ -132,8 +168,7 @@ } { \let\currentSETUPprefix\empty } -% \edef\currentSETUPname{\xmlatt{#1}{name}} - \let\currentSETUPgenerated\empty + \edef\currentSETUPname{\xmlatt{#1}{name}} \doifelsenothing {\xmlatt{#1}{variant}} { \let\currentSETUPvariant\empty } { @@ -143,34 +178,19 @@ \currentSETUPprefix \currentSETUPname \currentSETUPvariant - \currentSETUPgenerated } \stopxmlsetups -% \startxmlsetups xml:setups:register -% \doifelse {\xmlatt{#1}{variant}} {instance} { -% \def\docommand##1% -% {\def\currentSETUPname{##1}% -% \xmlsetup{#1}{xml:setups:assemblename:instance} -% \expanded{\texcommand[stp:x:\currentSETUPfullname]{{#1}{##1}}}}% -% \processcommacommand[\clf_getinstances{#1}]\docommand -% } { -% \xmlsetup{#1}{xml:setups:assemblename} -% % not really needed if we just use setups -% \expanded{\texcommand[stp:x:\currentSETUPfullname]{{#1}{}}} -% } -% \stopxmlsetups - \startxmlsetups xml:setups:register - \doif {\xmlatt{#1}{variant}} {instance} { - \def\docommand##1% - {\xmlsetup{#1}{xml:setups:assemblename:instance} - \expanded{\texcommand[stp:x:\currentSETUPfullname:##1]{{#1}{##1}}}}% + \doifcommon {\xmlatt{#1}{variant}} {instance,instance:assignment,instance:ownnumber,instance:argument} { + \def\docommand##1{ + \xmlsetup{#1}{xml:setups:assemblename:instance} + \expanded{\texcommand[\currentSETUPfullname:##1]{{#1}{##1}}} + }% \processcommacommand[\clf_getinstances{#1}]\docommand } \xmlsetup{#1}{xml:setups:assemblename} - % not really needed if we just use setups - \expanded{\texcommand[stp:x:\currentSETUPfullname]{{#1}{}}} + \expanded{\texcommand[\currentSETUPfullname]{{#1}{}}} \stopxmlsetups \startluacode @@ -200,6 +220,9 @@ local definitions = { } setups.definitions = definitions + local report = logs.reporter("command setup") + local report_known = logs.reporter("command setup","known") + function xml.functions.setups_define(id) local x = lxmlgetid(id) for c in xmlcollected(x,"cd:interface/cd:define") do @@ -271,9 +294,9 @@ if resolved then e.__p__.dt[e.ni] = resolved resolve(resolved) - -- logs.report("setups","resolved: %a",name) + -- report("resolved: %a",name) else - logs.report("setups","unable to resolve: %a",name) + report("unable to resolve: %a",name) end end end @@ -282,7 +305,8 @@ for e in xml.collected(xmlroot,"cd:interface/cd:define") do e.__p__.dt[e.ni] = "" end - xml.delete(xmlroot,"/cd:interface/cd:interface/cd:interface/..") + -- + xml.delete(xmlroot,"/cd:interface/cd:interface[@file='i-common-definitions.xml']") -- xmlblob = xml.tostring(xmlroot) io.savedata(filename,xmlblob) @@ -379,6 +403,30 @@ overload = true, arguments = { "string" }, } + + if structures then + local synonyms = structures.synonyms + if synonyms then + local collected = synonyms.collected + if collected then + local texcommand = collected.texcommand + if texcommand then + local entries = texcommand.entries + if entries then + local t = { } + local n = #entries + for i=1,n do + t[i] = entries[i].definition.tag + end + table.sort(t) + for i=1,n do + report_known(t[i]) + end + end + end + end + end + end \stopluacode % <?xml version="1.0" encoding="UTF-8"?> @@ -413,6 +461,7 @@ \ifx\m_cmd_asked_setups\empty \else \doonlyonce{setups:#1} {\doglobal\prependtocommalist{setups:#1}\loadedsetups + \edef\currentloadedsetup{#1}% \doiffileexistselse{#1} {\xmlloadonly{setups:#1}{#1}{setups}}% {\xmlloadonly{setups:#1}{#1.xml}{setups}}% @@ -441,10 +490,17 @@ {%(#1)(#2)(#3)\par \edef\m_cmd_instance{\secondoftwoarguments#3}% \c_cmd_kind\plustwo - \xmlsetup{\firstoftwoarguments#3}{xml:setups:typeset} + \xmlsetup{\firstoftwoarguments#3}{xml:setups:typeset}% \let\m_cmd_instance\empty \par} +\unexpanded\def\showsetupnameonly#1#2#3% + {\edef\m_cmd_instance{\secondoftwoarguments#3}% + \c_cmd_kind\plustwo + \xmlsetup{\firstoftwoarguments#3}{xml:setups:assemblename}% + \let\m_cmd_instance\empty + \texescape\currentSETUPfullname} + \installtextracker {cmd.showsetup} {\settrue\c_cmd_show_setup} @@ -461,17 +517,21 @@ \fi} \def\cmd_show_setup_nop#1% this will trigger 'used' - {\registersort[texcommand][stp:x:#1]% + {\registersort[texcommand][#1]% \ifconditional\c_cmd_show_setup - \writestatus{setup}{#1 / \rawsynonymname{texcommand}{stp:x:#1}}% + \writestatus{setup}{#1 / \rawsynonymname{texcommand}{#1}}% \fi \startelement[setup][name=#1]% \startelement[noexport][comment={setup definition #1}]% - \edef\cmd_id{\rawsynonymname{texcommand}{stp:x:#1}}% + \edef\cmd_id{\rawsynonymname{texcommand}{#1}}% \ifx\cmd_id\empty - missing: stp:x:#1 + missing: #1 \else + \ifx\m_cmd_instance\empty + \edef\m_cmd_instance{\expandafter\secondoftwoarguments\cmd_id}% + \fi \xmlsetup{\expandafter\firstoftwoarguments\cmd_id}{xml:setups:typeset} + \let\m_cmd_instance\empty \fi \stopelement \stopelement} @@ -483,6 +543,17 @@ \let\placeeverysetup\placeallsetups +\unexpanded\def\cmd_show_setup_list_basic#1#2#3% + {\NC\tttf#2\NC\basicsetup[#2]\NC\NR} + +\unexpanded\def\placeeverysetupname + {\placelistofsorts + [texcommand] + [\c!before={\starttabulate[|||]}, + \c!after=\stoptabulate, + \c!criterium=\v!all, + \c!command=\cmd_show_setup_list_basic]} + %D Typesetting: \startxmlsetups xml:setups:typeset @@ -620,7 +691,8 @@ \setfalse\c_cmd_doing_line \global\c_cmd_current_argument\zerocount %\blank[\v!line] % packed mode (we could do \startunpacked ...) - \godown[.75\lineheight] +% \godown[.75\lineheight] + \blank[\v!samepage,\v!medium] \switchtobodyfont[\v!small] \ignorespaces\xmlfilter{#1}{/arguments/text()}\endgraf \egroup @@ -638,7 +710,8 @@ \startxmlsetups xml:setups:typeset:instances \ifx\m_cmd_instance\empty \xmldoif{#1}{/instances} { - \godown[.75\lineheight] +% \godown[.75\lineheight] + \blank[\v!samepage,\v!medium] {\ttbf instances:} \enspace \xmlfilter{#1}{/instances/(constant|resolve)/command(xml:setups:instance)} @@ -647,22 +720,31 @@ \fi \stopxmlsetups +\startsetups xml:setups:start + \csname\e!start setuptext\endcsname +\stopsetups + +\startsetups xml:setups:stop + \csname\e!stop setuptext\endcsname +\stopsetups + \startxmlsetups xml:setups:typeset:yes + \forgetparskip \glet\m_cmd_current_file\empty \ifcase\c_cmd_kind \xmlsetup{#1}{xml:setups:typeset:line} \or - \getvalue{\e!start setuptext} + \directsetup{xml:setups:start} \xmlsetup{#1}{xml:setups:typeset:raw} - \getvalue{\e!stop setuptext} + \directsetup{xml:setups:stop} \or - \getvalue{\e!start setuptext} + \directsetup{xml:setups:start} \xmlsetup{#1}{xml:setups:typeset:raw} \endgraf \xmlsetup{#1}{xml:setups:typeset:detail} \endgraf \xmlsetup{#1}{xml:setups:typeset:instances} - \getvalue{\e!stop setuptext} + \directsetup{xml:setups:stop} \fi \glet\m_cmd_current_file\empty \stopxmlsetups @@ -713,24 +795,25 @@ \ignorespaces \stopxmlsetups +\startxmlsetups xml:setups:csname \show_setup_component{#1}{csname} \stopxmlsetups \startxmlsetups xml:setups:content \show_setup_component{#1}{content} \stopxmlsetups -\startxmlsetups xml:setups:displaymath \show_setup_component{#1}{displaymath}\stopxmlsetups -\startxmlsetups xml:setups:index \show_setup_component{#1}{index} \stopxmlsetups -\startxmlsetups xml:setups:math \show_setup_component{#1}{math} \stopxmlsetups -\startxmlsetups xml:setups:nothing \show_setup_component{#1}{nothing} \stopxmlsetups -\startxmlsetups xml:setups:file \show_setup_component{#1}{file} \stopxmlsetups \startxmlsetups xml:setups:position \show_setup_component{#1}{position} \stopxmlsetups -\startxmlsetups xml:setups:reference \show_setup_component{#1}{reference} \stopxmlsetups -\startxmlsetups xml:setups:csname \show_setup_component{#1}{csname} \stopxmlsetups -\startxmlsetups xml:setups:destination \show_setup_component{#1}{destination}\stopxmlsetups -\startxmlsetups xml:setups:triplet \show_setup_component{#1}{triplet} \stopxmlsetups -\startxmlsetups xml:setups:word \show_setup_component{#1}{word} \stopxmlsetups +\startxmlsetups xml:setups:index \show_setup_component{#1}{index} \stopxmlsetups +\startxmlsetups xml:setups:text \show_setup_component{#1}{text} \stopxmlsetups +\startxmlsetups xml:setups:apply \show_setup_component{#1}{apply} \stopxmlsetups \startxmlsetups xml:setups:template \show_setup_component{#1}{template} \stopxmlsetups +\startxmlsetups xml:setups:triplet \show_setup_component{#1}{triplet} \stopxmlsetups \startxmlsetups xml:setups:angles \show_setup_component{#1}{angles} \stopxmlsetups -\startxmlsetups xml:setups:apply \show_setup_component{#1}{apply} \stopxmlsetups -\startxmlsetups xml:setups:twowords \show_setup_component{#1}{twowords} \stopxmlsetups -\startxmlsetups xml:setups:threewords \show_setup_component{#1}{threewords} \stopxmlsetups -\startxmlsetups xml:setups:text \show_setup_component{#1}{text} \stopxmlsetups + +%startxmlsetups xml:setups:displaymath \show_setup_component{#1}{displaymath}\stopxmlsetups +%startxmlsetups xml:setups:math \show_setup_component{#1}{math} \stopxmlsetups +%startxmlsetups xml:setups:nothing \show_setup_component{#1}{nothing} \stopxmlsetups +%startxmlsetups xml:setups:file \show_setup_component{#1}{file} \stopxmlsetups +%startxmlsetups xml:setups:reference \show_setup_component{#1}{reference} \stopxmlsetups +%startxmlsetups xml:setups:destination \show_setup_component{#1}{destination}\stopxmlsetups +%startxmlsetups xml:setups:word \show_setup_component{#1}{word} \stopxmlsetups +%startxmlsetups xml:setups:twowords \show_setup_component{#1}{twowords} \stopxmlsetups +%startxmlsetups xml:setups:threewords \show_setup_component{#1}{threewords} \stopxmlsetups % todo: cd:par => \par % todo: cd:sep => \\ @@ -788,7 +871,8 @@ \unknown } \cmd_column_one_stop - \godown[.75\lineheight] +% \godown[.75\lineheight] + \blank[\v!samepage,\v!medium] \ignorespaces \fi \stopxmlsetups @@ -805,7 +889,8 @@ \ignorespaces \xmlflush{#1} \cmd_column_one_stop - \godown[.75\lineheight] +% \godown[.75\lineheight] + \blank[\v!samepage,\v!medium] \ignorespaces \fi \stopxmlsetups @@ -881,12 +966,12 @@ \stopxmlsetups \startxmlsetups xml:setups:inherit -% \cmd_column_two_start{}{} + % \cmd_column_two_start{}{} \rawsetupstring{cd:inherits}: \enspace \letterbackslash \xmlatt{#1}{name} -% \cmd_column_two_stop + % \cmd_column_two_stop \ignorespaces \stopxmlsetups @@ -894,7 +979,8 @@ {\cmd_column_one_start \cmd_internal_value{#1}% \cmd_column_one_stop - \godown[.75\lineheight] + % \godown[.75\lineheight] + \blank[\v!samepage,\v!medium] \ignorespaces} %D Auxiliary. @@ -965,26 +1051,25 @@ % arguments -\unexpanded\def\show_setup_displaymath#1{\show_setup_any {#1}{displaymath}} -\unexpanded\def\show_setup_index #1{\show_setup_any {#1}{index}} -\unexpanded\def\show_setup_math #1{\show_setup_any {#1}{math}} -\unexpanded\def\show_setup_nothing #1{\show_setup_any {#1}{nothing}} -\unexpanded\def\show_setup_file #1{\show_setup_any {#1}{file}} -\unexpanded\def\show_setup_position #1{\show_setup_any {#1}{position}} -\unexpanded\def\show_setup_template #1{\show_setup_any {#1}{template}} -\unexpanded\def\show_setup_angles #1{\show_setup_any {#1}{angle}} -\unexpanded\def\show_setup_reference #1{\show_setup_any {#1}{reference}} -\unexpanded\def\show_setup_apply #1{\show_setup_any {#1}{apply}} -\unexpanded\def\show_setup_twowords #1{\show_setup_any {#1}{twowords}} -\unexpanded\def\show_setup_threewords #1{\show_setup_any {#1}{threewords}} -\unexpanded\def\show_setup_csname #1{\show_setup_any {#1}{noargument}} -\unexpanded\def\show_setup_destination#1{\show_setup_any {#1}{destination}} -\unexpanded\def\show_setup_triplet #1{\show_setup_any {#1}{triplet}} -\unexpanded\def\show_setup_word #1{\show_setup_any {#1}{word}} -\unexpanded\def\show_setup_content #1{\show_setup_any {#1}{content}} -\unexpanded\def\show_setup_text #1{\show_setup_any {#1}{textual}} -\unexpanded\def\show_setup_to #1{\show_setup_line{#1}{to}} -\unexpanded\def\show_setup_macro #1{\show_setup_any {#1}{macro}} +\unexpanded\def\show_setup_csname #1{\show_setup_any{#1}{noargument}} +\unexpanded\def\show_setup_content #1{\show_setup_any{#1}{content}} +\unexpanded\def\show_setup_position #1{\show_setup_any{#1}{position}} +\unexpanded\def\show_setup_index #1{\show_setup_any{#1}{index}} +\unexpanded\def\show_setup_text #1{\show_setup_any{#1}{textual}} +\unexpanded\def\show_setup_apply #1{\show_setup_any{#1}{apply}} +\unexpanded\def\show_setup_template #1{\show_setup_any{#1}{template}} +\unexpanded\def\show_setup_triplet #1{\show_setup_any{#1}{triplet}} +\unexpanded\def\show_setup_angles #1{\show_setup_any{#1}{angle}} + +%unexpanded\def\show_setup_displaymath#1{\show_setup_any{#1}{displaymath}} +%unexpanded\def\show_setup_math #1{\show_setup_any{#1}{math}} +%unexpanded\def\show_setup_nothing #1{\show_setup_any{#1}{nothing}} +%unexpanded\def\show_setup_file #1{\show_setup_any{#1}{file}} +%unexpanded\def\show_setup_reference #1{\show_setup_any{#1}{reference}} +%unexpanded\def\show_setup_destination#1{\show_setup_any{#1}{destination}} +%unexpanded\def\show_setup_word #1{\show_setup_any{#1}{word}} +%unexpanded\def\show_setup_twowords #1{\show_setup_any{#1}{twowords}} +%unexpanded\def\show_setup_threewords #1{\show_setup_any{#1}{threewords}} % A prelude to a rewrite and some more: @@ -1026,7 +1111,7 @@ \stopxmlsetups \startxmlsetups xml:setups:parameters:values - \blank[\v!big] + \blank[\v!big,\v!samepage] \expanded { \parametercommand { \currentsetupparametercommand @@ -1039,7 +1124,7 @@ } } \blank[\v!big,\v!samepage] - \starttabulate[|l|p|] + \starttabulate[|l|pl|] % no /interface here \xmlall {#1} diff --git a/tex/context/modules/mkiv/x-setups-overview.mkiv b/tex/context/modules/mkiv/x-setups-overview.mkiv index c0047f13a..f6dff12f5 100644 --- a/tex/context/modules/mkiv/x-setups-overview.mkiv +++ b/tex/context/modules/mkiv/x-setups-overview.mkiv @@ -1,5 +1,5 @@ %D \module -%D [ file=setups-basics, % x-set-12, +%D [ file=setups-overview, % x-set-12, %D version=2016.04.05, % 2004.10.31, %D remark=setupx.tex: 1998.07.20 and later, %D title=\CONTEXT\ Setup Definitions, @@ -12,10 +12,13 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -% context --interface=en --global --result=setup-en x-setups-overview.mkiv +% context --interface=en --global --result=setup-en x-setups-overview.mkiv --mode=setups:save +% context --interface=en --global --result=setup-mapping-en x-setups-overview.mkiv --mode=setups:mapping % \enablemode[setups:save] +% \enablemode[setups:mapping] + \usemodule[setups-basics] \unprotect @@ -80,7 +83,12 @@ \definecolor [darkgray] [s=.1] \usetypescript[palatino] -\setupbodyfont[palatino,9pt] + +\doifelsemode {setups:mapping} { + \setupbodyfont[palatino,8pt] +} { + \setupbodyfont[palatino,9pt] +} \defineoverlay [cover] @@ -91,28 +99,42 @@ [\hbox to \paperwidth{\reuseMPgraphic{cover+back}\hss}] \startreusableMPgraphic{cover+back} - numeric h, w ; path p, q, r ; color f, d ; pair s ; + numeric h, w; boolean mapping ; path p, q, r ; color f, d ; pair s ; h := OverlayHeight ; w := 2*OverlayWidth ; r := unitsquare xyscaled (w,h) ; fill r withcolor \MPcolor{lightgray} ; - set_grid(w,h,w/8,w/16) ; + mapping := lua.mp.processingmode("setups:mapping") ; + if mapping : + set_grid(w,h,w/8,w/160) ; + pickup pensquare yscaled (w/80) ; + else : + set_grid(w,h,w/8,w/16) ; + pickup pencircle scaled (w/100) ; + fi ; forever : s := center r randomized (w,h) ; if new_on_grid(xpart s, ypart s) : - s := (dx,dy) ; - p := fullsquare xyscaled(w/4,w/8) ; - q := (-4w,ypart ulcorner p) -- .5[ulcorner p, urcorner p] -- (4w,ypart urcorner p) ; - q := q shifted (0,-w/24) ; - p := p randomized (w/40,w/40) ; - q := q randomized (0,w/100) ; - q := q cutafter (p cutafter point 3 of p) ; - q := q cutbefore (p cutbefore point 3 of p) ; d := .5[\MPcolor{LocalColor},\MPcolor{lightgray}] randomized (.5,.9) ; f := \MPcolor{lightgray} randomized (.5,.9) ; - pickup pencircle scaled (w/100) ; - fill p shifted s withcolor f ; - draw p shifted s withcolor d ; - draw q shifted s withcolor d ; + s := (dx,dy) ; + if mapping : + p := (-w/4,0) -- (w/4,0) ; + p := (-w/4,0) -- origin ; + q := origin -- ( w/4,0) ; + draw p shifted s withcolor d ; + draw q shifted s withcolor f ; + else : + p := fullsquare xyscaled(w/4,w/8) ; + q := (-4w,ypart ulcorner p) -- .5[ulcorner p, urcorner p] -- (4w,ypart urcorner p) ; + q := q shifted (0,-w/24) ; + p := p randomized (w/40,w/40) ; + q := q randomized (0,w/100) ; + q := q cutafter (p cutafter point 3 of p) ; + q := q cutbefore (p cutbefore point 3 of p) ; + fill p shifted s withcolor f ; + draw p shifted s withcolor d ; + draw q shifted s withcolor d ; + fi ; fi ; exitif grid_full ; endfor ; @@ -137,6 +159,11 @@ \c!width=\v!middle, \c!height=\v!middle] +\doifmode {setups:mapping} { + \setuplayout + [\c!backspace=1cm] +} + \setuppagenumbering [\c!location=\v!footer, \c!alternative=\v!doublesided] @@ -234,7 +261,11 @@ \protect -\placeeverysetup +\doifelsemode {setups:mapping} { + \placeeverysetupname +} { + \placeeverysetup +} \unprotect diff --git a/tex/context/sample/common/greenfield.tex b/tex/context/sample/common/greenfield.tex new file mode 100644 index 000000000..3f832f98a --- /dev/null +++ b/tex/context/sample/common/greenfield.tex @@ -0,0 +1,9 @@ +But if you place a human brain, with its evolutionary mandate to adapt to its +environment, in an environment where there is no obvious linear sequence, where +facts can be accessed at random, where everything is reversible, where the gap +between stimulus and response is minimal, and above all where time is short, then +your train of thought could be derailed. Add in the sensory distractions of an +all|-|encompassing and vivid audio|-|visual universe encouraging shorter spans +for sustained attention, and you might become, as it were, a computer yourself: a +system responding efficiently and processing information very well, but devoid of +deeper thought. diff --git a/tex/context/sample/common/jojomayer.tex b/tex/context/sample/common/jojomayer.tex new file mode 100644 index 000000000..966b356a6 --- /dev/null +++ b/tex/context/sample/common/jojomayer.tex @@ -0,0 +1,3 @@ +If we surrender the thing that separates us from machines, we will be replaced by +machines. The more advanced machines will be, the more human we will have to +become. diff --git a/tex/context/sample/common/klein.tex b/tex/context/sample/common/klein.tex new file mode 100644 index 000000000..7b145abd4 --- /dev/null +++ b/tex/context/sample/common/klein.tex @@ -0,0 +1,6 @@ +We don't go into a state of shock when something big and bad happens; it has to +be something big and bad {\em that we do not yet understand}. A state of shock is +what results when a gap opens up between events and our initial ability to +explain them. When we find ourselves in that position, without a story, without +our moorings, a great many people become vulnerable to authority figures telling +us to fear one another and relinguish our rights for the greater good. diff --git a/tex/context/sample/common/mcnish.tex b/tex/context/sample/common/mcnish.tex new file mode 100644 index 000000000..ab09ca0bc --- /dev/null +++ b/tex/context/sample/common/mcnish.tex @@ -0,0 +1,73 @@ +% poetry, music and typesetting +% +% https://www.youtube.com/watch?v=SB8_2Yuj8Og +% +% Published on Nov 1, 2016 +% Taken from 'Poetry versus Orchestra'. Album by Hollie McNish and Metropole Orkest, conducted by Jules Buckley. +% Released on MO Black, fall 2016. +% www.mo.nl/poetry • www.holliepoetry.com +% +% Poem written by Hollie McNish, music by Jules Buckley +% Artwork by me studio, Martin Pyper +% +MATHEMATICS + +he said +“those goddamn pakistanis and their goddamn corner shops +built a shop on every corner, took our british workers jobs” +he said +“those goddamn chinese and their goddamn china shops” +i told him they’re from vietnam, but he didn’t give a toss +i ask him what was there before that “damn japan man’s shop?” +he looks at me and dreams a scene of british workers’ jobs +of full-time, full-employment before the “goddamn boats all came” +where everybody went to work for full-time full-hours every day +“a british business stood their first” +he claims +“before the irish came +now british people lost their jobs and bloody turkish they're to blame” +i ask him how he knows that fact, he says, “because it’s true” +i ask him how he knows it’s fact, he says, he read it in the news, +“every time a somali comes here they take a job from us +the mathematics one for one, from us to them, it just adds up.” +he bites his cake, he sips his brew, he says again he knows the plot +“the goddamn caribbean’s came and now good folk here don’t have jobs” +i ask him what was there before the “goddamn persian curtain shop” +i show him architectures’ plans +of empty goddamn plots of land +I show him the historic maps +a bit of sand +a barren land +there was no goddamn shop before that pakistani came and planned +man - i am sick of crappy mathematics +cos i love a bit of sums +i spent years into economics +and i geek out over calculus +and when i meet these paper claims +that one of every new that came +takes away ‘our’ daily wage +i desperately want to scream +“your math is stuck-in primary” +cos some who come here also spend +and some who come here also lend +and some who come here also tend +to set up work which employs them +and all thosebalance sheets and trends +they work with numbers, not with men +and all this goddamn heated talk +ignores the trade the polish brought +ignores the men they give work to +not plumbing jobs but further too +ignores the guys they buy stock from +accountants, builders, on and on +and i know it’s nice to have someone +to blame our lack of jobs upon +but immigration’s not that plain +despite the sums inside our brains +as one for one +as him for you +as if he goes ‘home’, they’d employ you +cos sometimes one that comes makes two +and sometimes one can add three more +and sometimes two times two is much, much more than four +and most times immigrants bring more than minuses. diff --git a/tex/context/sample/common/samples.tex b/tex/context/sample/common/samples.tex index 8d1477e1c..a2ffcf088 100644 --- a/tex/context/sample/common/samples.tex +++ b/tex/context/sample/common/samples.tex @@ -17,7 +17,7 @@ used in testing bibliographic references and citations. \NC reich.tex \NC Steve Reich \NC City Life (1995) \NC \NR \NC materie.tex \NC Louis Andriessen \NC De Materie \NC \NR \NC douglas.tex \NC Douglas R. Hofstadter \NC \NC \NR -\NC dawkins.tex \NC Dawkins \NC \NC \NR +\NC dawkins.tex \NC Richard Dawkins \NC \NC \NR \NC ward.tex \NC Peter D. Ward \NC The Life and Death of Planet Earth \NC \NR \NC zapf.tex \NC Hermann Zapf \NC About micro-typography and the hz-program, Electronic Publishing, vol. 6(3), @@ -48,8 +48,16 @@ used in testing bibliographic references and citations. \NC waltham.tex \NC David Waltham \NC Lucky Planet, why earth is exceptional and what that means for life in the universe, Icon Books Ltd, London, 2014, p. 168 \NC \NR -\NC sapolsky.tex \NC Robert M. Sapolsky \NC Why Zebras Don't Have Ulsters, means for life in the universe, +\NC sapolsky.tex \NC Robert M. Sapolsky \NC Why Zebras Don't Have Ulsters, St Martin's Press, 2004 \NC \NR +\NC mcnish.tex \NC Hollie McNish \NC Poetry versus Orchestra, Hollie McNish and Metropole + Orkest, conducted by Jules Buckley, + MO Black, fall 2016. \NC \NR +\NC klein.tex \NC Naomi Klein \NC No is not enough, defeating the new shock politics, + Allen Lane, 2017. \NC \NR +\NC greenfield.tex \NC Susan Greenfield \NC Mind Change, how digital technologies are leaving + their mark on the brain, + Rider, London, 2014. \NC \NR \stoptabulate % Tufte: This quote will always produce hyphenated text, apart from the content, diff --git a/tex/context/test/mkiv/pdf-a1a-2005.mkiv b/tex/context/test/mkiv/pdf-a1a-2005.mkiv index 8f79d3f33..90ac0c242 100644 --- a/tex/context/test/mkiv/pdf-a1a-2005.mkiv +++ b/tex/context/test/mkiv/pdf-a1a-2005.mkiv @@ -6,6 +6,7 @@ [format=PDF/A-1a:2005, intent=sRGB IEC61966-2.1, % use <info> entry here; otherwise problems with predefined default profile profile=sRGB.icc, % use <filename> here + % profile={sRGB.icc,default_gray.icc}] level=0] \setuptagging[state=start] diff --git a/tex/context/test/mkiv/pdf-a1b-2005.mkiv b/tex/context/test/mkiv/pdf-a1b-2005.mkiv index bc970c3f9..f23942a97 100644 --- a/tex/context/test/mkiv/pdf-a1b-2005.mkiv +++ b/tex/context/test/mkiv/pdf-a1b-2005.mkiv @@ -6,6 +6,7 @@ [format=PDF/A-1b:2005, intent=sRGB IEC61966-2.1, % use <info> entry here; otherwise problems with predefined default profile profile=sRGB.icc, % use <filename> here + % profile={sRGB.icc,default_gray.icc}] level=0] \setuptagging[state=start] % needed even for 'b'-version diff --git a/tex/context/test/mkiv/pdf-a2a.mkiv b/tex/context/test/mkiv/pdf-a2a.mkiv index eea567f34..a0e181e69 100644 --- a/tex/context/test/mkiv/pdf-a2a.mkiv +++ b/tex/context/test/mkiv/pdf-a2a.mkiv @@ -5,7 +5,7 @@ \setupbackend [format=PDF/A-2a, intent=sRGB IEC61966-2.1, % use <info> entry here; otherwise problems with predefined default profile - profile=sRGB.icc, % use <filename> here + profile={sRGB.icc,default_gray.icc}, level=0] \setuptagging[state=start] diff --git a/tex/context/test/mkiv/pdf-a3a.mkiv b/tex/context/test/mkiv/pdf-a3a.mkiv index e7bba6fd8..7efb28e3c 100644 --- a/tex/context/test/mkiv/pdf-a3a.mkiv +++ b/tex/context/test/mkiv/pdf-a3a.mkiv @@ -8,7 +8,7 @@ \setupbackend [format=PDF/A-3a, intent=sRGB IEC61966-2.1, % use <info> entry here; otherwise problems with predefined default profile - profile=sRGB.icc, % use <filename> here + profile={sRGB.icc,default_gray.icc}, level=0] \setuptagging[state=start] diff --git a/tex/context/test/mkiv/pdf-ua.mkiv b/tex/context/test/mkiv/pdf-ua.mkiv index e048b9717..e83bd88b9 100644 --- a/tex/context/test/mkiv/pdf-ua.mkiv +++ b/tex/context/test/mkiv/pdf-ua.mkiv @@ -13,7 +13,7 @@ \setuptagging[state=start] % should be set automatically, if 'tagging = true' \setuplanguage[en] - + % DisplayDocTitle key is not set to true % % [from PDFUA-Reference-09_(English-invoice).pdf] @@ -21,6 +21,7 @@ % <</Type/Catalog/Pages 1 0 R/ViewerPreferences<</DisplayDocTitle true>>/PageMode/UseOutlines/Outlines 43 0 R/Lang(en)/StructTreeRoot 2 0 R/MarkInfo<</Marked true/Suspects false>>/OutputIntents[ 128 0 R]/Metadata 127 0 R>> % endobj % this may interfer with other ViewerPreferences settings? + \startluacode lpdf.addtocatalog("ViewerPreferences",lpdf.dictionary{DisplayDocTitle = true}) \stopluacode @@ -29,13 +30,13 @@ \starttext Warning: This document may contain errors and traces of hazelnuts. - + \blank[big] \startMPcode fill fullcircle scaled 3cm withcolor red; \stopMPcode - + \blank[big] The \quote{Matterhorn Protocol} gives a condensed overview of the possible failure conditions diff --git a/tex/context/test/mkiv/pdf-x4.mkiv b/tex/context/test/mkiv/pdf-x4.mkiv index 062de3b34..93b40d943 100644 --- a/tex/context/test/mkiv/pdf-x4.mkiv +++ b/tex/context/test/mkiv/pdf-x4.mkiv @@ -6,6 +6,7 @@ \setupbackend [format=PDF/X-4, + %profile={sRGB.icc,default_gray.icc}, intent=ISOcoated_v2_eci.icc] \input pdf-x-common.mkiv diff --git a/tex/context/test/mkiv/pdf-x4p.mkiv b/tex/context/test/mkiv/pdf-x4p.mkiv index bfee0b238..92e98722f 100644 --- a/tex/context/test/mkiv/pdf-x4p.mkiv +++ b/tex/context/test/mkiv/pdf-x4p.mkiv @@ -5,6 +5,6 @@ \setupbackend [format=PDF/X-4p, intent={ISO Coated v2 (ECI)}, - profile=sRGB.icc] % test for default colorspace + profile={sRGB.icc,default_gray.icc}] \input pdf-x-common.mkiv diff --git a/tex/generic/context/luatex/luatex-basics-nod.lua b/tex/generic/context/luatex/luatex-basics-nod.lua index f9a59734b..40fb9ee4e 100644 --- a/tex/generic/context/luatex/luatex-basics-nod.lua +++ b/tex/generic/context/luatex/luatex-basics-nod.lua @@ -48,7 +48,6 @@ end -- Nodes (a subset of context so that we don't get too much unused code): nodes = { } -nodes.pool = { } nodes.handlers = { } local nodecodes = { } @@ -73,7 +72,6 @@ nodes.disccodes = disccodes local flush_node = node.flush_node local remove_node = node.remove -local new_node = node.new local traverse_id = node.traverse_id nodes.handlers.protectglyphs = node.protect_glyphs @@ -108,12 +106,6 @@ function nodes.delete(head,current) return nodes.remove(head,current,true) end -function nodes.pool.kern(k) - local n = new_node("kern",1) - n.kern = k - return n -end - local getfield = node.getfield local setfield = node.setfield @@ -209,6 +201,7 @@ nuts.setchar = direct.setchar nuts.getdisc = direct.getdisc nuts.setdisc = direct.setdisc nuts.setlink = direct.setlink +nuts.setsplit = direct.setsplit nuts.getlist = direct.getlist nuts.setlist = direct.setlist @@ -294,20 +287,11 @@ nuts.traverse_id = direct.traverse_id nuts.traverse_char = direct.traverse_char nuts.ligaturing = direct.ligaturing nuts.kerning = direct.kerning +nuts.new = direct.new nuts.getprop = nuts.getattr nuts.setprop = nuts.setattr -local new_nut = direct.new -nuts.new = new_nut -nuts.pool = { } - -function nuts.pool.kern(k) - local n = new_nut("kern",1) - setfield(n,"kern",k) - return n -end - -- properties as used in the (new) injector: local propertydata = direct.get_properties_table() @@ -462,3 +446,37 @@ function nuts.copy_only_glyphs(current) end return head end + +nuts.uses_font = direct.uses_font + +if not nuts.uses_font then + local getdisc = nuts.getdisc + local getfont = nuts.getfont + function nuts.uses_font(n,font) + local pre, post, replace = getdisc(n) + if pre then + -- traverse_char + for n in traverse_id(glyph_code,pre) do + if getfont(n) == font then + return true + end + end + end + if post then + for n in traverse_id(glyph_code,post) do + if getfont(n) == font then + return true + end + end + end + if replace then + for n in traverse_id(glyph_code,replace) do + if getfont(n) == font then + return true + end + end + end + return false + end +end + diff --git a/tex/generic/context/luatex/luatex-core.lua b/tex/generic/context/luatex/luatex-core.lua index 16df01707..35005d1c8 100644 --- a/tex/generic/context/luatex/luatex-core.lua +++ b/tex/generic/context/luatex/luatex-core.lua @@ -1,22 +1,24 @@ +-- luatex-core security and io overloads ........... + -- if not modules then modules = { } end modules ['luatex-core'] = { --- version = 1.001, +-- version = 1.005, -- comment = 'companion to luatex', -- author = 'Hans Hagen & Luigi Scarso', -- copyright = 'LuaTeX Development Team', -- } -LUATEXCOREVERSION = 1.002 +LUATEXCOREVERSION = 1.005 -- This file overloads some Lua functions. The readline variants provide the same -- functionality as LuaTeX <= 1.04 and doing it this way permits us to keep the -- original io libraries clean. Performance is probably even a bit better now. local type, next, getmetatable, require = type, next, getmetatable, require -local find, gsub = string.find, string.gsub +local find, gsub, format = string.find, string.gsub, string.format local io_open = io.open local io_popen = io.popen -local io_line = io.lines +local io_lines = io.lines local fio_readline = fio.readline local fio_checkpermission = fio.checkpermission @@ -28,8 +30,8 @@ local saferoption = status.safer_option local shellescape = status.shell_escape -- 0 (disabled) 1 (anything) 2 (restricted) local kpseused = status.kpse_used -- 0 1 -io.saved_open = io_open -- can be protected -io.saved_popen = io_popen -- can be protected +local write_nl = texio.write_nl + io.saved_lines = io_lines -- always readonly mt.saved_lines = mt_lines -- always readonly @@ -71,12 +73,41 @@ local function luatex_io_popen(name,...) end end -local function luatex_io_lines(name) - local f = io_open(name,'r') - if f then - return function() - return fio_readline(f) +-- local function luatex_io_lines(name,how) +-- if name then +-- local f = io_open(name,how or 'r') +-- if f then +-- return function() +-- return fio_readline(f) +-- end +-- end +-- else +-- return io_lines() +-- end +-- end + +-- For some reason the gc doesn't kick in so we need to close explitly +-- so that the handle is flushed. + +local error, type = error, type + +local function luatex_io_lines(name,how) + if type(name) == "string" then + local f = io_open(name,how or 'r') + if f then + return function() + local l = fio_readline(f) + if not l then + f:close() + end + return l + end + else + -- for those who like it this way: + error("patched 'io.lines' can't open '" .. name .. "'") end + else + return io_lines() end end @@ -101,29 +132,44 @@ end if saferoption == 1 then - os.execute = nil - os.spawn = nil - os.exec = nil - os.setenv = nil - os.tempdir = nil + local function installdummy(str,f) + local reported = false + return function(...) + if not reported then + write_nl(format("safer option set, function %q is %s", + str,f and "limited" or "disabled")) + reported = true + end + if f then + return f(...) + end + end + end + + local function installlimit(str,f) + local reported = false + end - io.popen = nil - io.open = nil + os.execute = installdummy("os.execute") + os.spawn = installdummy("os.spawn") + os.exec = installdummy("os.exec") + os.setenv = installdummy("os.setenv") + os.tempdir = installdummy("os.tempdir") - os.rename = nil - os.remove = nil + io.popen = installdummy("io.popen") + io.open = installdummy("io.open",luatex_io_open_readonly) - io.tmpfile = nil - io.output = nil + os.rename = installdummy("os.rename") + os.remove = installdummy("os.remove") - lfs.chdir = nil - lfs.lock = nil - lfs.touch = nil - lfs.rmdir = nil - lfs.mkdir = nil + io.tmpfile = installdummy("io.tmpfile") + io.output = installdummy("io.output") - io.saved_popen = nil - io.saved_open = luatex_io_open_readonly + lfs.chdir = installdummy("lfs.chdir") + lfs.lock = installdummy("lfs.lock") + lfs.touch = installdummy("lfs.touch") + lfs.rmdir = installdummy("lfs.rmdir") + lfs.mkdir = installdummy("lfs.mkdir") end @@ -163,12 +209,175 @@ if md5 then end +-- compatibility: this might go away + +if not unpack then + unpack = table.unpack +end + +if not package.loaders then + package.loaders = package.searchers +end + +if not loadstring then + loadstring = load +end + +-- compatibility: this might stay + +if bit32 then + + -- lua 5.2: we're okay + +elseif utf8 then + + -- lua 5.3: bitwise.lua, v 1.24 2014/12/26 17:20:53 roberto + + bit32 = load ( [[ +local select = select -- instead of: arg = { ... } + +bit32 = { + bnot = function (a) + return ~a & 0xFFFFFFFF + end, + band = function (x, y, z, ...) + if not z then + return ((x or -1) & (y or -1)) & 0xFFFFFFFF + else + local res = x & y & z + for i=1,select("#",...) do + res = res & select(i,...) + end + return res & 0xFFFFFFFF + end + end, + bor = function (x, y, z, ...) + if not z then + return ((x or 0) | (y or 0)) & 0xFFFFFFFF + else + local res = x | y | z + for i=1,select("#",...) do + res = res | select(i,...) + end + return res & 0xFFFFFFFF + end + end, + bxor = function (x, y, z, ...) + if not z then + return ((x or 0) ~ (y or 0)) & 0xFFFFFFFF + else + local res = x ~ y ~ z + for i=1,select("#",...) do + res = res ~ select(i,...) + end + return res & 0xFFFFFFFF + end + end, + btest = function (x, y, z, ...) + if not z then + return (((x or -1) & (y or -1)) & 0xFFFFFFFF) ~= 0 + else + local res = x & y & z + for i=1,select("#",...) do + res = res & select(i,...) + end + return (res & 0xFFFFFFFF) ~= 0 + end + end, + lshift = function (a, b) + return ((a & 0xFFFFFFFF) << b) & 0xFFFFFFFF + end, + rshift = function (a, b) + return ((a & 0xFFFFFFFF) >> b) & 0xFFFFFFFF + end, + arshift = function (a, b) + a = a & 0xFFFFFFFF + if b <= 0 or (a & 0x80000000) == 0 then + return (a >> b) & 0xFFFFFFFF + else + return ((a >> b) | ~(0xFFFFFFFF >> b)) & 0xFFFFFFFF + end + end, + lrotate = function (a ,b) + b = b & 31 + a = a & 0xFFFFFFFF + a = (a << b) | (a >> (32 - b)) + return a & 0xFFFFFFFF + end, + rrotate = function (a, b) + b = -b & 31 + a = a & 0xFFFFFFFF + a = (a << b) | (a >> (32 - b)) + return a & 0xFFFFFFFF + end, + extract = function (a, f, w) + return (a >> f) & ~(-1 << (w or 1)) + end, + replace = function (a, v, f, w) + local mask = ~(-1 << (w or 1)) + return ((a & ~(mask << f)) | ((v & mask) << f)) & 0xFFFFFFFF + end, +} + ]] ) + +elseif bit then + + -- luajit (for now) + + bit32 = load ( [[ +local band, bnot, rshift, lshift = bit.band, bit.bnot, bit.rshift, bit.lshift + +bit32 = { + arshift = bit.arshift, + band = band, + bnot = bnot, + bor = bit.bor, + bxor = bit.bxor, + btest = function(...) + return band(...) ~= 0 + end, + extract = function(a,f,w) + return band(rshift(a,f),2^(w or 1)-1) + end, + lrotate = bit.rol, + lshift = lshift, + replace = function(a,v,f,w) + local mask = 2^(w or 1)-1 + return band(a,bnot(lshift(mask,f)))+lshift(band(v,mask),f) + end, + rrotate = bit.ror, + rshift = rshift, +} + ]] ) + +else + + -- hope for the best or fail + + bit32 = require("bit32") + +end + +-- this is needed for getting require("socket") right + +do + + local loaded = package.loaded + + if not loaded.socket then loaded.socket = loaded["socket.core"] end + if not loaded.mime then loaded.mime = loaded["mime.core"] end + +end + +-- so far + if utilities and utilities.merger and utilities.merger.compact then local byte, format, gmatch = string.byte, string.format, string.gmatch local concat = table.concat local data = gsub(io.loaddata('luatex-core.lua'),'if%s+utilities.*','') + local t = { } local r = { } local n = 0 diff --git a/tex/generic/context/luatex/luatex-fonts-demo-tt.lua b/tex/generic/context/luatex/luatex-fonts-demo-tt.lua new file mode 100644 index 000000000..45c9a84ff --- /dev/null +++ b/tex/generic/context/luatex/luatex-fonts-demo-tt.lua @@ -0,0 +1,136 @@ +if not modules then modules = { } end modules ['luatex-fonts-demo-tt'] = { + version = 1.001, + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files", +} + +-- Someone asked on the list if we could fake bad typewriters. Actually there are +-- already enough examples in successive articles and it's not too complex to mess +-- with fonts. There is a nicer way to do this (with a bit of metapost) but I have +-- no time now. After all, features like this are never used in practice, so it's a +-- waste of time to code them. +-- +-- Todo: force emwidth/5 for fonts > 1 ... only when requested. +-- +-- \starttext +-- +-- \raggedright +-- +-- \definefontfeature[badtypewritera][ttgrayness=.5] +-- \definefontfeature[badtypewriterb][ttshift=.5] +-- \definefontfeature[badtypewriterc][ttthickness=2] +-- \definefontfeature[badtypewriterd][ttgrayness=.5,ttshift=.5,ttthickness=2,ttfont={dejavusansmono}] +-- \definefontfeature[badtypewritere][ttgrayness=.5,ttthickness=2,ttstep=2,ttmax=1.5] +-- +-- \definefont[MyFontA][file:luatex-fonts-demo-tt.lua*badtypewritera] +-- \definefont[MyFontB][file:luatex-fonts-demo-tt.lua*badtypewriterb] +-- \definefont[MyFontC][file:luatex-fonts-demo-tt.lua*badtypewriterc] +-- \definefont[MyFontD][file:luatex-fonts-demo-tt.lua*badtypewriterd @ 10pt] +-- \definefont[MyFontE][file:luatex-fonts-demo-tt.lua*badtypewritere @ 10pt] +-- +-- \MyFontA \input tufte \blank {\righttoleft لَيْسَ لَدَيَّ أَيُّ فِكْرَةٍ عَمَّا يَعْنِيهِ هٰذَا.} \page +-- \MyFontB \input tufte \blank {\righttoleft لَيْسَ لَدَيَّ أَيُّ فِكْرَةٍ عَمَّا يَعْنِيهِ هٰذَا.} \page +-- \MyFontC \input tufte \blank {\righttoleft لَيْسَ لَدَيَّ أَيُّ فِكْرَةٍ عَمَّا يَعْنِيهِ هٰذَا.} \page +-- \MyFontD \input tufte \blank {\righttoleft لَيْسَ لَدَيَّ أَيُّ فِكْرَةٍ عَمَّا يَعْنِيهِ هٰذَا.} \page +-- \MyFontE \input tufte \blank {\righttoleft لَيْسَ لَدَيَّ أَيُّ فِكْرَةٍ عَمَّا يَعْنِيهِ هٰذَا.} \page +-- +-- \stoptext + +local random, sin = math.random, math.sin +local formatters = string.formatters + +local now = 0 +local max = 2 * math.pi +local step = max/20 + +-- The sin trick is first shown by Hartmut in 2005 when we had a few more plugs into +-- the backend. His demo was a rather colorful sheet that looked like it was crumpled. +-- There were no virtual fonts involved the, just pdf.print hooked into an always +-- applied Lua function. + +function fonts.helpers.FuzzyFontStart(exheight,ttgrayness,ttthickness,ttshift,ttstep,ttmax) + local grayness = ttgrayness * random(0,5)/10 + local thickness = ttthickness * random(1,2)/10 + local shift = 0 + if ttstep > 0 then + if now > max then + now = 0 + else + now = now + step * ttstep + end + shift = ttmax * sin(now) * exheight/5 + else + shift = ttshift * random(-1,1) * exheight/20 + end + -- We can optimize for one of them being zero or the default but no one will + -- use this in production so efficiency hardly matters. + local template = formatters["pdf:page:q %0.2F g %.2F G %0.2F w 2 Tr %.3F Ts"]( + grayness, grayness, thickness, shift + ) + vf.special(template) + -- will be: + -- local template = formatters["q %0.2F g %.2F G %0.2F w 2 Tr %.3F Ts"]( + -- grayness, grayness, thickness, shift + -- ) + -- vf.pdf("page",template) +end + +function fonts.helpers.FuzzyFontStop() + vf.special("pdf:page:Q") + -- will be: + -- vf.pdf("page","Q") +end + +return function(specification) + local features = specification.features.normal + local list = features.ttfont + if list then + list = utilities.parsers.settings_to_array(list) + else + list = { + 'lmtypewriter10-regular', + 'almfixed', + } + end + local f = { } + local id = { } + for i=1,#list do + f[i], id[i] = fonts.constructors.readanddefine(list[i],specification.size) + end + local f1 = f[1] + if f1 then + f1.name = specification.name -- needs checking (second time used an error) + f1.properties.name = specification.name + f1.properties.virtualized = true + f1.fonts = { } + local target = f1.characters + local exbp = f1.parameters.exheight * number.dimenfactors.bp + local stop = { + "lua", + "fonts.helpers.FuzzyFontStop()", + } + local start = { + "lua", + formatters["fonts.helpers.FuzzyFontStart(%.3F,%.2F,%.2F,%.2F,%.2F,%.2F)"]( + exbp, + tonumber(features.ttgrayness) or 1, + tonumber(features.ttthickness) or 1, + tonumber(features.ttshift) or 1, + tonumber(features.ttstep) or 0, + tonumber(features.ttmax) or 1 + ), + } + for i=1,#list do + f1.fonts[i] = { id = id[i] } + local characters = f[i].characters + for u, v in next, characters do + v.commands = { start, { "slot", i, u }, stop } + if characters ~= target then + target[u] = v + end + end + end + end + return f1 +end diff --git a/tex/generic/context/luatex/luatex-fonts-demo-vf-1.lua b/tex/generic/context/luatex/luatex-fonts-demo-vf-1.lua index 793526f7b..c4567e446 100644 --- a/tex/generic/context/luatex/luatex-fonts-demo-vf-1.lua +++ b/tex/generic/context/luatex/luatex-fonts-demo-vf-1.lua @@ -3,11 +3,19 @@ if not modules then modules = { } end modules ['luatex-fonts-demo-vf-1'] = { comment = "companion to luatex-*.tex", author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", copyright = "PRAGMA ADE / ConTeXt Development Team", - license = "see context related readme files" + license = "see context related readme files", } local identifiers = fonts.hashes.identifiers +local defaults = { [0] = + { "pdf", "origin", "0 g" }, + { "pdf", "origin", "1 0 0 rg" }, + { "pdf", "origin", "0 1 0 rg" }, + { "pdf", "origin", "0 0 1 rg" }, + { "pdf", "origin", "0 0 1 rg" }, +} + return function(specification) local f1, id1 = fonts.constructors.readanddefine('lmroman10-regular', specification.size) local f2, id2 = fonts.constructors.readanddefine('lmsans10-regular', specification.size) @@ -20,13 +28,6 @@ return function(specification) { id = id2 }, { id = id3 }, } - local color = { [0] = - { "special", "pdf:0 g" }, - { "special", "pdf:1 0 0 rg" }, - { "special", "pdf:0 1 0 rg" }, - { "special", "pdf:0 0 1 rg" }, - { "special", "pdf:0 0 1 rg" }, - } local chars = { identifiers[id1].characters, identifiers[id2].characters, @@ -36,9 +37,9 @@ return function(specification) local n = math.floor(math.random(1,3)+0.5) local c = chars[n][u] or v v.commands = { - color[n], + defaults[n] or defaults[0], { 'slot', n, u }, - color[0], + defaults[0], { 'nop' } } v.kerns = nil diff --git a/tex/generic/context/luatex/luatex-fonts-ext.lua b/tex/generic/context/luatex/luatex-fonts-ext.lua index 7d9c58ccb..15762d9ba 100644 --- a/tex/generic/context/luatex/luatex-fonts-ext.lua +++ b/tex/generic/context/luatex/luatex-fonts-ext.lua @@ -13,6 +13,7 @@ end local fonts = fonts local otffeatures = fonts.constructors.features.otf +local getprivate = fonts.constructors.getprivate -- A few generic extensions. @@ -290,15 +291,13 @@ local setmetatableindex = table.setmetatableindex local function additalictowidth(tfmdata,key,value) local characters = tfmdata.characters - local resources = tfmdata.resources local additions = { } - local private = resources.private for unicode, old_c in next, characters do -- maybe check for math local oldwidth = old_c.width local olditalic = old_c.italic if olditalic and olditalic ~= 0 then - private = private + 1 + local private = getprivate(tfmdata) local new_c = { width = oldwidth + olditalic, height = old_c.height, @@ -316,7 +315,6 @@ local function additalictowidth(tfmdata,key,value) for k, v in next, additions do characters[k] = v end - resources.private = private end otffeatures.register { diff --git a/tex/generic/context/luatex/luatex-fonts-merged.lua b/tex/generic/context/luatex/luatex-fonts-merged.lua index cc9ce7b5f..96398dcc0 100644 --- a/tex/generic/context/luatex/luatex-fonts-merged.lua +++ b/tex/generic/context/luatex/luatex-fonts-merged.lua @@ -1,6 +1,6 @@ -- merged file : c:/data/develop/context/sources/luatex-fonts-merged.lua -- parent file : c:/data/develop/context/sources/luatex-fonts.lua --- merge date : 05/15/17 21:48:19 +-- merge date : 03/15/18 15:27:14 do -- begin closure to overcome local limits and interference @@ -11,14 +11,16 @@ if not modules then modules={} end modules ['l-lua']={ copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" } -_MAJORVERSION,_MINORVERSION=string.match(_VERSION,"^[^%d]+(%d+)%.(%d+).*$") -_MAJORVERSION=tonumber(_MAJORVERSION) or 5 -_MINORVERSION=tonumber(_MINORVERSION) or 1 -_LUAVERSION=_MAJORVERSION+_MINORVERSION/10 -if _LUAVERSION<5.2 and jit then - _MINORVERSION=2 - _LUAVERSION=5.2 -end +local next,type,tonumber=next,type,tonumber +LUAMAJORVERSION,LUAMINORVERSION=string.match(_VERSION,"^[^%d]+(%d+)%.(%d+).*$") +LUAMAJORVERSION=tonumber(LUAMAJORVERSION) or 5 +LUAMINORVERSION=tonumber(LUAMINORVERSION) or 1 +LUAVERSION=LUAMAJORVERSION+LUAMINORVERSION/10 +if LUAVERSION<5.2 and jit then + MINORVERSION=2 + LUAVERSION=5.2 +end +_LUAVERSION=LUAVERSION if not lpeg then lpeg=require("lpeg") end @@ -118,6 +120,19 @@ if not FFISUPPORTED then elseif not ffi.number then ffi.number=tonumber end +if not bit32 then + bit32=require("l-bit32") +end +local loaded=package.loaded +if not loaded["socket"] then loaded["socket"]=loaded["socket.core"] end +if not loaded["mime"] then loaded["mime"]=loaded["mime.core"] end +if not socket.mime then socket.mime=package.loaded["mime"] end +if not loaded["socket.mime"] then loaded["socket.mime"]=socket.mime end +if not loaded["socket.http"] then loaded["socket.http"]=socket.http end +if not loaded["socket.ftp"] then loaded["socket.ftp"]=socket.ftp end +if not loaded["socket.smtp"] then loaded["socket.smtp"]=socket.smtp end +if not loaded["socket.tp"] then loaded["socket.tp"]=socket.tp end +if not loaded["socket.url"] then loaded["socket.url"]=socket.url end end -- closure @@ -130,7 +145,8 @@ if not modules then modules={} end modules ['l-lpeg']={ copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" } -lpeg=require("lpeg") +lpeg=require("lpeg") +local lpeg=lpeg if not lpeg.print then function lpeg.print(...) print(lpeg.pcode(...)) end end local type,next,tostring=type,next,tostring local byte,char,gmatch,format=string.byte,string.char,string.gmatch,string.format @@ -152,11 +168,14 @@ patterns.alwaysmatched=alwaysmatched local sign=S('+-') local zero=P('0') local digit=R('09') +local digits=digit^1 local octdigit=R("07") +local octdigits=octdigit^1 local lowercase=R("az") local uppercase=R("AZ") local underscore=P("_") local hexdigit=digit+lowercase+uppercase +local hexdigits=hexdigit^1 local cr,lf,crlf=P("\r"),P("\n"),P("\r\n") local newline=P("\r")*(P("\n")+P(true))+P("\n") local escaped=P("\\")*anything @@ -258,27 +277,30 @@ patterns.singlequoted=squote*patterns.nosquote*squote patterns.doublequoted=dquote*patterns.nodquote*dquote patterns.quoted=patterns.doublequoted+patterns.singlequoted patterns.digit=digit +patterns.digits=digits patterns.octdigit=octdigit +patterns.octdigits=octdigits patterns.hexdigit=hexdigit +patterns.hexdigits=hexdigits patterns.sign=sign -patterns.cardinal=digit^1 -patterns.integer=sign^-1*digit^1 -patterns.unsigned=digit^0*period*digit^1 +patterns.cardinal=digits +patterns.integer=sign^-1*digits +patterns.unsigned=digit^0*period*digits patterns.float=sign^-1*patterns.unsigned -patterns.cunsigned=digit^0*comma*digit^1 -patterns.cpunsigned=digit^0*(period+comma)*digit^1 +patterns.cunsigned=digit^0*comma*digits +patterns.cpunsigned=digit^0*(period+comma)*digits patterns.cfloat=sign^-1*patterns.cunsigned patterns.cpfloat=sign^-1*patterns.cpunsigned patterns.number=patterns.float+patterns.integer patterns.cnumber=patterns.cfloat+patterns.integer patterns.cpnumber=patterns.cpfloat+patterns.integer -patterns.oct=zero*octdigit^1 +patterns.oct=zero*octdigits patterns.octal=patterns.oct patterns.HEX=zero*P("X")*(digit+uppercase)^1 patterns.hex=zero*P("x")*(digit+lowercase)^1 -patterns.hexadecimal=zero*S("xX")*hexdigit^1 -patterns.hexafloat=sign^-1*zero*S("xX")*(hexdigit^0*period*hexdigit^1+hexdigit^1*period*hexdigit^0+hexdigit^1)*(S("pP")*sign^-1*hexdigit^1)^-1 -patterns.decafloat=sign^-1*(digit^0*period*digit^1+digit^1*period*digit^0+digit^1)*S("eE")*sign^-1*digit^1 +patterns.hexadecimal=zero*S("xX")*hexdigits +patterns.hexafloat=sign^-1*zero*S("xX")*(hexdigit^0*period*hexdigits+hexdigits*period*hexdigit^0+hexdigits)*(S("pP")*sign^-1*hexdigits)^-1 +patterns.decafloat=sign^-1*(digit^0*period*digits+digits*period*digit^0+digits)*S("eE")*sign^-1*digits patterns.propername=(uppercase+lowercase+underscore)*(uppercase+lowercase+underscore+digit)^0*endofstring patterns.somecontent=(anything-newline-space)^1 patterns.beginline=#(1-newline) @@ -525,11 +547,13 @@ function lpeg.balancer(left,right) left,right=P(left),P(right) return P { left*((1-left-right)+V(1))^0*right } end -local nany=utf8char/"" -function lpeg.counter(pattern) - pattern=Cs((P(pattern)/" "+nany)^0) - return function(str) - return #lpegmatch(pattern,str) +function lpeg.counter(pattern,action) + local n=0 + local pattern=(P(pattern)/function() n=n+1 end+anything)^0 + if action then + return function(str) n=0;lpegmatch(pattern,str);action(n) end + else + return function(str) n=0;lpegmatch(pattern,str);return n end end end utf=utf or (unicode and unicode.utf8) or {} @@ -690,7 +714,13 @@ function lpeg.append(list,pp,delayed,checked) end local p_false=P(false) local p_true=P(true) -local function make(t,rest) +local lower=utf and utf.lower or string.lower +local upper=utf and utf.upper or string.upper +function lpeg.setutfcasers(l,u) + lower=l or lower + upper=u or upper +end +local function make1(t,rest) local p=p_false local keys=sortedkeys(t) for i=1,#keys do @@ -701,7 +731,7 @@ local function make(t,rest) p=p+P(k)*p_true elseif v==false then else - p=p+P(k)*make(v,v[""]) + p=p+P(k)*make1(v,v[""]) end end end @@ -710,32 +740,27 @@ local function make(t,rest) end return p end -local function collapse(t,x) - if type(t)~="table" then - return t,x - else - local n=next(t) - if n==nil then - return t,x - elseif next(t,n)==nil then - local k=n +local function make2(t,rest) + local p=p_false + local keys=sortedkeys(t) + for i=1,#keys do + local k=keys[i] + if k~="" then local v=t[k] - if type(v)=="table" then - return collapse(v,x..k) + if v==true then + p=p+(P(lower(k))+P(upper(k)))*p_true + elseif v==false then else - return v,x..k - end - else - local tt={} - for k,v in next,t do - local vv,kk=collapse(v,k) - tt[kk]=vv + p=p+(P(lower(k))+P(upper(k)))*make2(v,v[""]) end - return tt,x end end + if rest then + p=p+p_true + end + return p end -function lpeg.utfchartabletopattern(list) +function lpeg.utfchartabletopattern(list,insensitive) local tree={} local n=#list if n==0 then @@ -806,7 +831,7 @@ function lpeg.utfchartabletopattern(list) end end end - return make(tree) + return (insensitive and make2 or make1)(tree) end patterns.containseol=lpeg.finder(eol) local function nextstep(n,step,result) @@ -840,7 +865,7 @@ end local trailingzeros=zero^0*-digit local case_1=period*trailingzeros/"" local case_2=period*(digit-trailingzeros)^1*(trailingzeros/"") -local number=digit^1*(case_1+case_2) +local number=digits*(case_1+case_2) local stripper=Cs((number+1)^0) lpeg.patterns.stripzeros=stripper local byte_to_HEX={} @@ -1021,9 +1046,9 @@ function string.tformat(fmt,...) end string.quote=string.quoted string.unquote=string.unquoted -if not string.bytetable then +if not string.bytetable then local limit=5000 - function string.bytetable(str) + function string.bytetable(str) local n=#str if n>limit then local t={ byte(str,1,limit) } @@ -1048,7 +1073,7 @@ if not modules then modules={} end modules ['l-table']={ copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" } -local type,next,tostring,tonumber,ipairs,select=type,next,tostring,tonumber,ipairs,select +local type,next,tostring,tonumber,select=type,next,tostring,tonumber,select local table,string=table,string local concat,sort,insert,remove=table.concat,table.sort,table.insert,table.remove local format,lower,dump=string.format,string.lower,string.dump @@ -1057,6 +1082,9 @@ local getinfo=debug.getinfo local lpegmatch,patterns=lpeg.match,lpeg.patterns local floor=math.floor local stripper=patterns.stripper +function table.getn(t) + return t and #t +end function table.strip(tab) local lst,l={},0 for i=1,#tab do @@ -1350,7 +1378,7 @@ function table.tohash(t,value) local h={} if t then if value==nil then value=true end - for _,v in next,t do + for _,v in next,t do h[v]=value end end @@ -1358,7 +1386,7 @@ function table.tohash(t,value) end function table.fromhash(t) local hsh,h={},0 - for k,v in next,t do + for k,v in next,t do if v then h=h+1 hsh[h]=k @@ -1833,7 +1861,9 @@ function table.unnest(t) return unnest(t) end local function are_equal(a,b,n,m) - if a and b and #a==#b then + if a==b then + return true + elseif a and b and #a==#b then n=n or 1 m=m or #a for i=n,m do @@ -1853,15 +1883,17 @@ local function are_equal(a,b,n,m) end end local function identical(a,b) - for ka,va in next,a do - local vb=b[ka] - if va==vb then - elseif type(va)=="table" and type(vb)=="table" then - if not identical(va,vb) then + if a~=b then + for ka,va in next,a do + local vb=b[ka] + if va==vb then + elseif type(va)=="table" and type(vb)=="table" then + if not identical(va,vb) then + return false + end + else return false end - else - return false end end return true @@ -2083,6 +2115,24 @@ function table.filtered(t,pattern,sort,cmp) return nothing end end +if not table.move then + function table.move(a1,f,e,t,a2) + if a2 and a1~=a2 then + for i=f,e do + a2[t]=a1[i] + t=t+1 + end + return a2 + else + t=t+e-f + for i=e,f,-1 do + a1[t]=a1[i] + t=t-1 + end + return a1 + end + end +end end -- closure @@ -2099,16 +2149,15 @@ local io=io local open,flush,write,read=io.open,io.flush,io.write,io.read local byte,find,gsub,format=string.byte,string.find,string.gsub,string.format local concat=table.concat -local floor=math.floor local type=type if string.find(os.getenv("PATH"),";",1,true) then io.fileseparator,io.pathseparator="\\",";" else io.fileseparator,io.pathseparator="/",":" end -local large=2^24 -local medium=large/16 -local small=medium/8 +local large=0x01000000 +local medium=0x00100000 +local small=0x00020000 local function readall(f) local size=f:seek("end") if size>0 then @@ -2470,6 +2519,9 @@ end function lfs.isfile(name) return attributes(name,"mode")=="file" end +function lfs.isfound(name) + return attributes(name,"mode")=="file" and name or nil +end local colon=P(":") local period=P(".") local periods=P("..") @@ -2808,6 +2860,23 @@ function lfs.mkdirs(path) lfs.mkdir(full) end end +function file.withinbase(path) + local l=0 + if not find(path,"^/") then + path="/"..path + end + for dir in gmatch(path,"/([^/]+)") do + if dir==".." then + l=l-1 + elseif dir~="." then + l=l+1 + end + if l<0 then + return false + end + end + return true +end end -- closure @@ -2887,21 +2956,23 @@ if not modules then modules={} end modules ['l-math']={ copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" } -local floor,sin,cos,tan=math.floor,math.sin,math.cos,math.tan if not math.ceiling then math.ceiling=math.ceil end if not math.round then + local floor=math.floor function math.round(x) return floor(x+0.5) end end if not math.div then + local floor=math.floor function math.div(n,m) return floor(n/m) end end if not math.mod then function math.mod(n,m) return n%m end end -local pipi=2*math.pi/360 if not math.sind then + local sin,cos,tan=math.sin,math.cos,math.tan + local pipi=2*math.pi/360 function math.sind(d) return sin(d*pipi) end function math.cosd(d) return cos(d*pipi) end function math.tand(d) return tan(d*pipi) end @@ -2910,6 +2981,60 @@ if not math.odd then function math.odd (n) return n%2~=0 end function math.even(n) return n%2==0 end end +if not math.cosh then + local exp=math.exp + function math.cosh(x) + local xx=exp(x) + return (xx+1/xx)/2 + end + function math.sinh(x) + local xx=exp(x) + return (xx-1/xx)/2 + end + function math.tanh(x) + local xx=exp(x) + return (xx-1/xx)/(xx+1/xx) + end +end +if not math.pow then + function math.pow(x,y) + return x^y + end +end +if not math.atan2 then + math.atan2=math.atan +end +if not math.ldexp then + function math.ldexp(x,e) + return x*2.0^e + end +end +if not math.log10 then + local log=math.log + function math.log10(x) + return log(x,10) + end +end +if not math.type then + function math.type() + return "float" + end +end +if not math.tointeger then + math.mininteger=-0x4FFFFFFFFFFF + math.maxinteger=0x4FFFFFFFFFFF + local floor=math.floor + function math.tointeger(n) + local f=floor(n) + return f==n and f or nil + end +end +if not math.ult then + local floor=math.floor + function math.tointeger(m,n) + return floor(m)<floor(n) + end +end end -- closure @@ -2949,37 +3074,73 @@ if not unicode then unicode={ utf=utf } end if not utf.char then - local floor,char=math.floor,string.char - function utf.char(n) - if n<0x80 then - return char(n) - elseif n<0x800 then - return char( - 0xC0+floor(n/0x40), - 0x80+(n%0x40) - ) - elseif n<0x10000 then - return char( - 0xE0+floor(n/0x1000), - 0x80+(floor(n/0x40)%0x40), - 0x80+(n%0x40) - ) - elseif n<0x200000 then - return char( - 0xF0+floor(n/0x40000), - 0x80+(floor(n/0x1000)%0x40), - 0x80+(floor(n/0x40)%0x40), - 0x80+(n%0x40) - ) + utf.char=string.utfcharacter or (utf8 and utf8.char) + if not utf.char then + local char=string.char + if bit32 then + local rshift=bit32.rshift + function utf.char(n) + if n<0x80 then + return char(n) + elseif n<0x800 then + return char( + 0xC0+rshift(n,6), + 0x80+(n%0x40) + ) + elseif n<0x10000 then + return char( + 0xE0+rshift(n,12), + 0x80+(rshift(n,6)%0x40), + 0x80+(n%0x40) + ) + elseif n<0x200000 then + return char( + 0xF0+rshift(n,18), + 0x80+(rshift(n,12)%0x40), + 0x80+(rshift(n,6)%0x40), + 0x80+(n%0x40) + ) + else + return "" + end + end else - return "" + local floor=math.floor + function utf.char(n) + if n<0x80 then + return char(n) + elseif n<0x800 then + return char( + 0xC0+floor(n/0x40), + 0x80+(n%0x40) + ) + elseif n<0x10000 then + return char( + 0xE0+floor(n/0x1000), + 0x80+(floor(n/0x40)%0x40), + 0x80+(n%0x40) + ) + elseif n<0x200000 then + return char( + 0xF0+floor(n/0x40000), + 0x80+(floor(n/0x1000)%0x40), + 0x80+(floor(n/0x40)%0x40), + 0x80+(n%0x40) + ) + else + return "" + end + end end end end if not utf.byte then - local utf8byte=patterns.utf8byte - function utf.byte(c) - return lpegmatch(utf8byte,c) + utf.byte=string.utfvalue or (utf8 and utf8.codepoint) + if not utf.byte then + local utf8byte=patterns.utf8byte + function utf.byte(c) + return lpegmatch(utf8byte,c) + end end end local utfchar,utfbyte=utf.char,utf.byte @@ -3030,19 +3191,22 @@ function utf.is_valid(str) return type(str)=="string" and lpegmatch(validatedutf,str) or false end if not utf.len then - local n,f=0,1 - local utfcharcounter=patterns.utfbom^-1*Cmt ( - Cc(1)*patterns.utf8one^1+Cc(2)*patterns.utf8two^1+Cc(3)*patterns.utf8three^1+Cc(4)*patterns.utf8four^1, - function(_,t,d) - n=n+(t-f)/d - f=t - return true + utf.len=string.utflength or (utf8 and utf8.len) + if not utf.len then + local n,f=0,1 + local utfcharcounter=patterns.utfbom^-1*Cmt ( + Cc(1)*patterns.utf8one^1+Cc(2)*patterns.utf8two^1+Cc(3)*patterns.utf8three^1+Cc(4)*patterns.utf8four^1, + function(_,t,d) + n=n+(t-f)/d + f=t + return true + end + )^0 + function utf.len(str) + n,f=0,1 + lpegmatch(utfcharcounter,str or "") + return n end - )^0 - function utf.len(str) - n,f=0,1 - lpegmatch(utfcharcounter,str or "") - return n end end utf.length=utf.len @@ -3390,20 +3554,22 @@ function utf.utf32_to_utf8_t(t,endian) end local function little(b) if b<0x10000 then - return char(b%256,b/256) + return char(b%256,rshift(b,8)) else b=b-0x10000 - local b1,b2=b/1024+0xD800,b%1024+0xDC00 - return char(b1%256,b1/256,b2%256,b2/256) + local b1=rshift(b,10)+0xD800 + local b2=b%1024+0xDC00 + return char(b1%256,rshift(b1,8),b2%256,rshift(b2,8)) end end local function big(b) if b<0x10000 then - return char(b/256,b%256) + return char(rshift(b,8),b%256) else b=b-0x10000 - local b1,b2=b/1024+0xD800,b%1024+0xDC00 - return char(b1/256,b1%256,b2/256,b2%256) + local b1=rshift(b,10)+0xD800 + local b2=b%1024+0xDC00 + return char(rshift(b1,8),b1%256,rshift(b2,8),b2%256) end end local l_remap=Cs((p_utf8byte/little+P(1)/"")^0) @@ -3524,22 +3690,43 @@ function utf.chrlen(u) (u<0xFC and 5) or (u<0xFE and 6) or 0 end -local extract=bit32.extract -local char=string.char -function unicode.toutf32string(n) - if n<=0xFF then - return - char(n).."\000\000\000" - elseif n<=0xFFFF then - return - char(extract(n,0,8))..char(extract(n,8,8)).."\000\000" - elseif n<=0xFFFFFF then - return - char(extract(n,0,8))..char(extract(n,8,8))..char(extract(n,16,8)).."\000" - else - return - char(extract(n,0,8))..char(extract(n,8,8))..char(extract(n,16,8))..char(extract(n,24,8)) +if bit32 then + local extract=bit32.extract + local char=string.char + function unicode.toutf32string(n) + if n<=0xFF then + return + char(n).."\000\000\000" + elseif n<=0xFFFF then + return + char(extract(n,0,8))..char(extract(n,8,8)).."\000\000" + elseif n<=0xFFFFFF then + return + char(extract(n,0,8))..char(extract(n,8,8))..char(extract(n,16,8)).."\000" + else + return + char(extract(n,0,8))..char(extract(n,8,8))..char(extract(n,16,8))..char(extract(n,24,8)) + end + end +end +local len=utf.len +local rep=rep +function string.utfpadd(s,n) + if n and n~=0 then + local l=len(s) + if n>0 then + local d=n-l + if d>0 then + return rep(c or " ",d)..s + end + else + local d=- n-l + if d>0 then + return s..rep(c or " ",d) + end + end end + return s end end -- closure @@ -3558,13 +3745,13 @@ utilities.strings=utilities.strings or {} local strings=utilities.strings local format,gsub,rep,sub,find=string.format,string.gsub,string.rep,string.sub,string.find local load,dump=load,string.dump -local tonumber,type,tostring=tonumber,type,tostring +local tonumber,type,tostring,next=tonumber,type,tostring,next local unpack,concat=table.unpack,table.concat local P,V,C,S,R,Ct,Cs,Cp,Carg,Cc=lpeg.P,lpeg.V,lpeg.C,lpeg.S,lpeg.R,lpeg.Ct,lpeg.Cs,lpeg.Cp,lpeg.Carg,lpeg.Cc local patterns,lpegmatch=lpeg.patterns,lpeg.match -local utfchar,utfbyte=utf.char,utf.byte +local utfchar,utfbyte,utflen=utf.char,utf.byte,utf.len local loadstripped=nil -if _LUAVERSION<5.2 then +if LUAVERSION<5.2 then loadstripped=function(str,shortcuts) return load(str) end @@ -3652,6 +3839,17 @@ local pattern=Carg(1)/function(t) function strings.tabtospace(str,tab) return lpegmatch(pattern,str,1,tab or 7) end +function string.utfpadding(s,n) + if not n or n==0 then + return "" + end + local l=utflen(s) + if n>0 then + return nspaces[n-l] + else + return nspaces[-n-l] + end +end local space=spacer^0 local nospace=space/"" local endofline=nospace*newline @@ -3758,6 +3956,21 @@ function number.formatted(n,sep1,sep2) return lpegmatch(splitter,s,1,sep1 or ",",sep2 or ".") end end +local p=Cs( + P("-")^0*(P("0")^1/"")^0*(1-P("."))^0*(P(".")*P("0")^1*P(-1)/""+P(".")^0)*P(1-P("0")^1*P(-1))^0 + ) +function number.compactfloat(n,fmt) + if n==0 then + return "0" + elseif n==1 then + return "1" + end + n=lpegmatch(p,format(fmt or "%0.3f",n)) + if n=="." or n=="" or n=="-" then + return "0" + end + return n +end local zero=P("0")^1/"" local plus=P("+")/"" local minus=P("-") @@ -3810,7 +4023,7 @@ local template=[[ return function(%s) return %s end ]] local preamble,environment="",{} -if _LUAVERSION<5.2 then +if LUAVERSION<5.2 then preamble=[[ local lpeg=lpeg local type=type @@ -3825,6 +4038,7 @@ local utfchar=utf.char local utfbyte=utf.byte local lpegmatch=lpeg.match local nspaces=string.nspaces +local utfpadding=string.utfpadding local tracedchar=string.tracedchar local autosingle=string.autosingle local autodouble=string.autodouble @@ -3849,6 +4063,7 @@ else utfbyte=utf.byte, lpegmatch=lpeg.match, nspaces=string.nspaces, + utfpadding=string.utfpadding, tracedchar=string.tracedchar, autosingle=string.autosingle, autodouble=string.autodouble, @@ -3884,9 +4099,32 @@ local format_S=function(f) return format("tostring(a%s)",n) end end +local format_right=function(f) + n=n+1 + f=tonumber(f) + if not f or f==0 then + return format("(a%s or '')",n) + elseif f>0 then + return format("utfpadding(a%s,%i)..a%s",n,f,n) + else + return format("a%s..utfpadding(a%s,%i)",n,n,f) + end +end +local format_left=function(f) + n=n+1 + f=tonumber(f) + if not f or f==0 then + return format("(a%s or '')",n) + end + if f<0 then + return format("utfpadding(a%s,%i)..a%s",n,-f,n) + else + return format("a%s..utfpadding(a%s,%i)",n,n,-f) + end +end local format_q=function() n=n+1 - return format("(a%s and format('%%q',a%s) or '')",n,n) + return format("(a%s ~= nil and format('%%q',tostring(a%s)) or '')",n,n) end local format_Q=function() n=n+1 @@ -4138,6 +4376,8 @@ local builder=Cs { "start", +V("j")+V("J") +V("m")+V("M") +V("z") ++V(">") ++V("<") )+V("*") )*(P(-1)+Carg(1)) )^0, @@ -4155,7 +4395,7 @@ local builder=Cs { "start", ["X"]=(prefix_any*P("X"))/format_X, ["o"]=(prefix_any*P("o"))/format_o, ["S"]=(prefix_any*P("S"))/format_S, - ["Q"]=(prefix_any*P("Q"))/format_S, + ["Q"]=(prefix_any*P("Q"))/format_Q, ["N"]=(prefix_any*P("N"))/format_N, ["k"]=(prefix_sub*P("k"))/format_k, ["c"]=(prefix_any*P("c"))/format_c, @@ -4181,6 +4421,8 @@ local builder=Cs { "start", ["z"]=(prefix_any*P("z"))/format_z, ["a"]=(prefix_any*P("a"))/format_a, ["A"]=(prefix_any*P("A"))/format_A, + ["<"]=(prefix_any*P("<"))/format_left, + [">"]=(prefix_any*P(">"))/format_right, ["*"]=Cs(((1-P("%"))^1+P("%%")/"%%")^1)/format_rest, ["?"]=Cs(((1-P("%"))^1 )^1)/format_rest, ["!"]=Carg(2)*prefix_any*P("!")*C((1-P("!"))^1)*P("!")/format_extension, @@ -4211,7 +4453,7 @@ local function use(t,fmt,...) return t[fmt](...) end strings.formatters={} -if _LUAVERSION<5.2 then +if LUAVERSION<5.2 then function strings.formatters.new(noconcat) local t={ _type_="formatter",_connector_=noconcat and "," or "..",_extensions_={},_preamble_=preamble,_environment_={} } setmetatable(t,{ __index=make,__call=use }) @@ -4248,7 +4490,7 @@ patterns.xmlescape=Cs((P("<")/"<"+P(">")/">"+P("&")/"&"+P('"')/"" patterns.texescape=Cs((C(S("#$%\\{}"))/"\\%1"+P(1))^0) patterns.luaescape=Cs(((1-S('"\n'))^1+P('"')/'\\"'+P('\n')/'\\n"')^0) patterns.luaquoted=Cs(Cc('"')*((1-S('"\n'))^1+P('"')/'\\"'+P('\n')/'\\n"')^0*Cc('"')) -if _LUAVERSION<5.2 then +if LUAVERSION<5.2 then add(formatters,"xml",[[lpegmatch(xmlescape,%s)]],"local xmlescape = lpeg.patterns.xmlescape") add(formatters,"tex",[[lpegmatch(texescape,%s)]],"local texescape = lpeg.patterns.texescape") add(formatters,"lua",[[lpegmatch(luaescape,%s)]],"local luaescape = lpeg.patterns.luaescape") @@ -4270,6 +4512,21 @@ local pattern=Cs((newline/(os.newline or "\r")+1)^0) function string.replacenewlines(str) return lpegmatch(pattern,str) end +function strings.newcollector() + local result,r={},0 + return + function(fmt,str,...) + r=r+1 + result[r]=str==nil and fmt or formatters[fmt](str,...) + end, + function(connector) + if result then + local str=concat(result,connector) + result,r={},0 + return str + end + end +end end -- closure @@ -4284,8 +4541,6 @@ if not modules then modules={} end modules ['util-fil']={ } local byte=string.byte local char=string.char -local extract=bit32 and bit32.extract -local floor=math.floor utilities=utilities or {} local files={} utilities.files=files @@ -4302,7 +4557,10 @@ function files.close(f) f:close() end function files.size(f) - return f:seek("end") + local current=f:seek() + local size=f:seek("end") + f:seek("set",current) + return size end files.getsize=files.size function files.setposition(f,n) @@ -4452,7 +4710,7 @@ function files.readfixed4(f) return (0x100*a+b )+(0x100*c+d)/0x10000 end end -if extract then +if bit32 then local extract=bit32.extract local band=bit32.band function files.read2dot14(f) @@ -4472,19 +4730,30 @@ end function files.skiplong(f,n) f:read(4*(n or 1)) end -function files.writecardinal2(f,n) - local a=char(n%256) - n=floor(n/256) - local b=char(n%256) - f:write(b,a) +if bit32 then + local rshift=bit32.rshift + function files.writecardinal2(f,n) + local a=char(n%256) + n=rshift(n,8) + local b=char(n%256) + f:write(b,a) + end +else + local floor=math.floor + function files.writecardinal2(f,n) + local a=char(n%256) + n=floor(n/256) + local b=char(n%256) + f:write(b,a) + end end function files.writecardinal4(f,n) local a=char(n%256) - n=floor(n/256) + n=rshift(n,8) local b=char(n%256) - n=floor(n/256) + n=rshift(n,8) local c=char(n%256) - n=floor(n/256) + n=rshift(n,8) local d=char(n%256) f:write(d,c,b,a) end @@ -4503,6 +4772,8 @@ if fio and fio.readcardinal1 then files.readinteger2=fio.readinteger2 files.readinteger3=fio.readinteger3 files.readinteger4=fio.readinteger4 + files.readfixed2=fio.readfixed2 + files.readfixed4=fio.readfixed4 files.read2dot14=fio.read2dot14 files.setposition=fio.setposition files.getposition=fio.getposition @@ -4962,7 +5233,6 @@ attributes.private=attributes.private or function(name) return number end nodes={} -nodes.pool={} nodes.handlers={} local nodecodes={} local glyphcodes=node.subtypes("glyph") @@ -4983,7 +5253,6 @@ nodes.glyphcodes=glyphcodes nodes.disccodes=disccodes local flush_node=node.flush_node local remove_node=node.remove -local new_node=node.new local traverse_id=node.traverse_id nodes.handlers.protectglyphs=node.protect_glyphs nodes.handlers.unprotectglyphs=node.unprotect_glyphs @@ -5012,11 +5281,6 @@ end function nodes.delete(head,current) return nodes.remove(head,current,true) end -function nodes.pool.kern(k) - local n=new_node("kern",1) - n.kern=k - return n -end local getfield=node.getfield local setfield=node.setfield nodes.getfield=getfield @@ -5088,6 +5352,7 @@ nuts.setchar=direct.setchar nuts.getdisc=direct.getdisc nuts.setdisc=direct.setdisc nuts.setlink=direct.setlink +nuts.setsplit=direct.setsplit nuts.getlist=direct.getlist nuts.setlist=direct.setlist nuts.getoffsets=direct.getoffsets or @@ -5168,16 +5433,9 @@ nuts.traverse_id=direct.traverse_id nuts.traverse_char=direct.traverse_char nuts.ligaturing=direct.ligaturing nuts.kerning=direct.kerning +nuts.new=direct.new nuts.getprop=nuts.getattr nuts.setprop=nuts.setattr -local new_nut=direct.new -nuts.new=new_nut -nuts.pool={} -function nuts.pool.kern(k) - local n=new_nut("kern",1) - setfield(n,"kern",k) - return n -end local propertydata=direct.get_properties_table() nodes.properties={ data=propertydata } direct.set_properties_mode(true,true) @@ -5310,6 +5568,36 @@ function nuts.copy_only_glyphs(current) end return head end +nuts.uses_font=direct.uses_font +if not nuts.uses_font then + local getdisc=nuts.getdisc + local getfont=nuts.getfont + function nuts.uses_font(n,font) + local pre,post,replace=getdisc(n) + if pre then + for n in traverse_id(glyph_code,pre) do + if getfont(n)==font then + return true + end + end + end + if post then + for n in traverse_id(glyph_code,post) do + if getfont(n)==font then + return true + end + end + end + if replace then + for n in traverse_id(glyph_code,replace) do + if getfont(n)==font then + return true + end + end + end + return false + end +end end -- closure @@ -7495,7 +7783,7 @@ if not modules then modules={} end modules ['font-ini']={ local allocate=utilities.storage.allocate fonts=fonts or {} local fonts=fonts -fonts.hashes={ identifiers=allocate() } +fonts.hashes=fonts.hashes or { identifiers=allocate() } fonts.tables=fonts.tables or {} fonts.helpers=fonts.helpers or {} fonts.tracers=fonts.tracers or {} @@ -7504,7 +7792,41 @@ fonts.analyzers={} fonts.readers={} fonts.definers={ methods={} } fonts.loggers={ register=function() end } -fontloader.totable=fontloader.to_table +if context then + fontloader=nil +end + +end -- closure + +do -- begin closure to overcome local limits and interference + +if not modules then modules={} end modules ['luatex-font-mis']={ + version=1.001, + comment="companion to luatex-*.tex", + author="Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright="PRAGMA ADE / ConTeXt Development Team", + license="see context related readme files" +} +if context then + texio.write_nl("fatal error: this module is not for context") + os.exit() +end +local currentfont=font.current +local hashes=fonts.hashes +local identifiers=hashes.identifiers or {} +local marks=hashes.marks or {} +hashes.identifiers=identifiers +hashes.marks=marks +table.setmetatableindex(marks,function(t,k) + if k==true then + return marks[currentfont()] + else + local resources=identifiers[k].resources or {} + local marks=resources.marks or {} + t[k]=marks + return marks + end +end) end -- closure @@ -7517,12 +7839,14 @@ if not modules then modules={} end modules ['font-con']={ copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" } -local next,tostring,rawget=next,tostring,rawget +local next,tostring,tonumber,rawget=next,tostring,tonumber,rawget local format,match,lower,gsub,find=string.format,string.match,string.lower,string.gsub,string.find local sort,insert,concat=table.sort,table.insert,table.concat local sortedkeys,sortedhash,serialize,fastcopy=table.sortedkeys,table.sortedhash,table.serialize,table.fastcopy local derivetable=table.derive local ioflush=io.flush +local round=math.round +local setmetatable,getmetatable,rawget,rawset=setmetatable,getmetatable,rawget,rawset local trace_defining=false trackers.register("fonts.defining",function(v) trace_defining=v end) local trace_scaling=false trackers.register("fonts.scaling",function(v) trace_scaling=v end) local report_defining=logs.reporter("fonts","defining") @@ -7568,6 +7892,12 @@ function constructors.scaled(scaledpoints,designsize) return scaledpoints end end +function constructors.getprivate(tfmdata) + local properties=tfmdata.properties + local private=properties.private + properties.private=private+1 + return private +end function constructors.cleanuptable(tfmdata) if constructors.autocleanup and tfmdata.properties.virtualized then for k,v in next,tfmdata.characters do @@ -7644,27 +7974,62 @@ function constructors.trytosharefont(target,tfmdata) end end end +local synonyms={ + exheight="x_height", + xheight="x_height", + ex="x_height", + emwidth="quad", + em="quad", + spacestretch="space_stretch", + stretch="space_stretch", + spaceshrink="space_shrink", + shrink="space_shrink", + extraspace="extra_space", + xspace="extra_space", + slantperpoint="slant", +} function constructors.enhanceparameters(parameters) - local xheight=parameters.x_height - local quad=parameters.quad - local space=parameters.space - local stretch=parameters.space_stretch - local shrink=parameters.space_shrink - local extra=parameters.extra_space - local slant=parameters.slant - parameters.xheight=xheight - parameters.spacestretch=stretch - parameters.spaceshrink=shrink - parameters.extraspace=extra - parameters.em=quad - parameters.ex=xheight - parameters.slantperpoint=slant - parameters.spacing={ - width=space, - stretch=stretch, - shrink=shrink, - extra=extra, - } + local mt=getmetatable(parameters) + local getter=function(t,k) + if not k then + return nil + end + local s=synonyms[k] + if s then + return rawget(t,s) or (mt and mt[s]) or nil + end + if k=="spacing" then + return { + width=t.space, + stretch=t.space_stretch, + shrink=t.space_shrink, + extra=t.extra_space, + } + end + return mt and mt[k] or nil + end + local setter=function(t,k,v) + if not k then + return 0 + end + local s=synonyms[k] + if s then + rawset(t,s,v) + elseif k=="spacing" then + if type(v)=="table" then + rawset(t,"space",v.width or 0) + rawset(t,"space_stretch",v.stretch or 0) + rawset(t,"space_shrink",v.shrink or 0) + rawset(t,"extra_space",v.extra or 0) + end + else + rawset(t,k,v) + end + end + setmetatable(parameters,{ + __index=getter, + __newindex=setter, + }) end local function mathkerns(v,vdelta) local k={} @@ -7683,7 +8048,7 @@ local psfake=0 local function fixedpsname(psname,fallback) local usedname=psname if psname and psname~="" then - if find(psname," ") then + if find(psname," ",1,true) then usedname=gsub(psname,"[%s]+","-") else end @@ -7728,7 +8093,7 @@ function constructors.scale(tfmdata,specification) target.unscaled=tfmdata local mathsize=tonumber(specification.mathsize) or 0 local textsize=tonumber(specification.textsize) or scaledpoints - local forcedsize=tonumber(parameters.mathsize ) or 0 + local forcedsize=tonumber(parameters.mathsize ) or 0 local extrafactor=tonumber(specification.factor ) or 1 if (mathsize==2 or forcedsize==2) and parameters.scriptpercentage then scaledpoints=parameters.scriptpercentage*textsize/100 @@ -7736,6 +8101,7 @@ function constructors.scale(tfmdata,specification) scaledpoints=parameters.scriptscriptpercentage*textsize/100 elseif forcedsize>1000 then scaledpoints=forcedsize + else end targetparameters.mathsize=mathsize targetparameters.textsize=textsize @@ -7746,9 +8112,6 @@ function constructors.scale(tfmdata,specification) local defaultheight=resources.defaultheight or 0 local defaultdepth=resources.defaultdepth or 0 local units=parameters.units or 1000 - if target.fonts then - target.fonts=fastcopy(target.fonts) - end targetproperties.language=properties.language or "dflt" targetproperties.script=properties.script or "dflt" targetproperties.mode=properties.mode or "base" @@ -7790,11 +8153,6 @@ function constructors.scale(tfmdata,specification) target.stretch=expansion.stretch target.shrink=expansion.shrink target.step=expansion.step - target.auto_expand=expansion.auto - end - local protrusion=parameters.protrusion - if protrusion then - target.auto_protrude=protrusion.auto end local extendfactor=parameters.extendfactor or 0 if extendfactor~=0 and extendfactor~=1 then @@ -7816,7 +8174,7 @@ function constructors.scale(tfmdata,specification) targetparameters.units=units targetparameters.scaledpoints=askedscaledpoints local isvirtual=properties.virtualized or tfmdata.type=="virtual" - local hasquality=target.auto_expand or target.auto_protrude + local hasquality=parameters.expansion or parameters.protrusion local hasitalics=properties.hasitalics local autoitalicamount=properties.autoitalicamount local stackmath=not properties.nostackmath @@ -7826,6 +8184,12 @@ function constructors.scale(tfmdata,specification) local realdimensions=properties.realdimensions local writingmode=properties.writingmode or "horizontal" local identity=properties.identity or "horizontal" + local vfonts=target.fonts + if vfonts and #vfonts>0 then + target.fonts=fastcopy(vfonts) + elseif isvirtual then + target.fonts={ { id=0 } } + end if changed and not next(changed) then changed=false end @@ -7901,10 +8265,15 @@ function constructors.scale(tfmdata,specification) local chr,description,index if changed then local c=changed[unicode] - if c then - description=descriptions[c] or descriptions[unicode] or character - character=characters[c] or character - index=description.index or c + if c and c~=unicode then + if c then + description=descriptions[c] or descriptions[unicode] or character + character=characters[c] or character + index=description.index or c + else + description=descriptions[unicode] or character + index=description.index or unicode + end else description=descriptions[unicode] or character index=description.index or unicode @@ -8106,7 +8475,7 @@ function constructors.scale(tfmdata,specification) local ok=false for i=1,#vc do local key=vc[i][1] - if key=="right" or key=="down" then + if key=="right" or key=="down" or key=="rule" then ok=true break end @@ -8138,6 +8507,18 @@ function constructors.scale(tfmdata,specification) properties.setitalics=hasitalics constructors.aftercopyingcharacters(target,tfmdata) constructors.trytosharefont(target,tfmdata) + local vfonts=target.fonts + if isvirtual then + if not vfonts or #vfonts==0 then + target.fonts={ { id=0 } } + end + elseif vfonts then + properties.virtualized=true + target.type="virtual" + if #vfonts==0 then + target.fonts={ { id=0 } } + end + end return target end function constructors.finalize(tfmdata) @@ -8156,15 +8537,9 @@ function constructors.finalize(tfmdata) end if not parameters.expansion then parameters.expansion={ - stretch=tfmdata.stretch or 0, - shrink=tfmdata.shrink or 0, - step=tfmdata.step or 0, - auto=tfmdata.auto_expand or false, - } - end - if not parameters.protrusion then - parameters.protrusion={ - auto=auto_protrude + stretch=tfmdata.stretch or 0, + shrink=tfmdata.shrink or 0, + step=tfmdata.step or 0, } end if not parameters.size then @@ -8250,8 +8625,6 @@ function constructors.finalize(tfmdata) tfmdata.stretch=nil tfmdata.shrink=nil tfmdata.step=nil - tfmdata.auto_expand=nil - tfmdata.auto_protrude=nil tfmdata.extend=nil tfmdata.slant=nil tfmdata.units=nil @@ -8307,13 +8680,15 @@ function constructors.hashinstance(specification,force) specification.hash=hash end if size<1000 and designsizes[hash] then - size=math.round(constructors.scaled(size,designsizes[hash])) - specification.size=size + size=round(constructors.scaled(size,designsizes[hash])) + else + size=round(size) end + specification.size=size if fallbacks then - return hash..' @ '..tostring(size)..' @ '..fallbacks + return hash..' @ '..size..' @ '..fallbacks else - return hash..' @ '..tostring(size) + return hash..' @ '..size end end function constructors.setname(tfmdata,specification) @@ -8494,10 +8869,12 @@ do local handler=handlers[format] local enhancers=handler.enhancers if not enhancers then - local actions=allocate() + local actions=allocate() local before=allocate() local after=allocate() local order=allocate() + local known={} + local nofsteps=0 local patches={ before=before,after=after } local trace=false local report=logs.reporter("fonts",format.." enhancing") @@ -8519,7 +8896,7 @@ do report("%s enhancing file %a","start",filename) end ioflush() - for e=1,#order do + for e=1,nofsteps do local enhancer=order[e] local b=before[enhancer] if b then @@ -8529,7 +8906,7 @@ do end end end - enhance(enhancer,data,filename,raw) + enhance(enhancer,data,filename,raw) local a=after[enhancer] if a then for pattern,action in next,a do @@ -8549,7 +8926,9 @@ do if action then if actions[what] then else - order[#order+1]=what + nofsteps=nofsteps+1 + order[nofsteps]=what + known[what]=nofsteps end actions[what]=action else @@ -8563,7 +8942,12 @@ do if ww then ww[pattern]=action else - pw[where]={ [pattern]=action} + pw[where]={ [pattern]=action } + if not known[where] then + nofsteps=nofsteps+1 + order[nofsteps]=where + known[where]=nofsteps + end end end end @@ -8571,7 +8955,11 @@ do register=register, apply=apply, patch=patch, - patches={ register=patch }, + report=report, + patches={ + register=patch, + report=report, + }, } handler.enhancers=enhancers end @@ -8797,7 +9185,7 @@ do -- begin closure to overcome local limits and interference if not modules then modules={} end modules ['font-cid']={ version=1.001, - comment="companion to font-otf.lua (cidmaps)", + comment="companion to font-ini.mkiv", author="Hans Hagen, PRAGMA-ADE, Hasselt NL", copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" @@ -8958,9 +9346,9 @@ if not modules then modules={} end modules ['font-map']={ local tonumber,next,type=tonumber,next,type local match,format,find,concat,gsub,lower=string.match,string.format,string.find,table.concat,string.gsub,string.lower local P,R,S,C,Ct,Cc,lpegmatch=lpeg.P,lpeg.R,lpeg.S,lpeg.C,lpeg.Ct,lpeg.Cc,lpeg.match -local floor=math.floor local formatters=string.formatters local sortedhash,sortedkeys=table.sortedhash,table.sortedkeys +local rshift=bit32.rshift local trace_loading=false trackers.register("fonts.loading",function(v) trace_loading=v end) local trace_mapping=false trackers.register("fonts.mapping",function(v) trace_mapping=v end) local report_fonts=logs.reporter("fonts","loading") @@ -8998,7 +9386,7 @@ local function tounicode16(unicode) return f_single(unicode) else unicode=unicode-0x10000 - return f_double(floor(unicode/1024)+0xD800,unicode%1024+0xDC00) + return f_double(rshift(unicode,10)+0xD800,unicode%1024+0xDC00) end end local function tounicode16sequence(unicodes) @@ -9009,12 +9397,12 @@ local function tounicode16sequence(unicodes) t[l]=f_single(u) else u=u-0x10000 - t[l]=f_double(floor(u/1024)+0xD800,u%1024+0xDC00) + t[l]=f_double(rshift(u,10)+0xD800,u%1024+0xDC00) end end return concat(t) end -local function tounicode(unicode,name) +local function tounicode(unicode) if type(unicode)=="table" then local t={} for l=1,#unicode do @@ -9023,7 +9411,7 @@ local function tounicode(unicode,name) t[l]=f_single(u) else u=u-0x10000 - t[l]=f_double(floor(u/1024)+0xD800,u%1024+0xDC00) + t[l]=f_double(rshift(u,10)+0xD800,u%1024+0xDC00) end end return concat(t) @@ -9032,7 +9420,7 @@ local function tounicode(unicode,name) return f_single(unicode) else unicode=unicode-0x10000 - return f_double(floor(unicode/1024)+0xD800,unicode%1024+0xDC00) + return f_double(rshift(unicode,10)+0xD800,unicode%1024+0xDC00) end end end @@ -9053,7 +9441,7 @@ local ligseparator=P("_") local varseparator=P(".") local namesplitter=Ct(C((1-ligseparator-varseparator)^1)*(ligseparator*C((1-ligseparator-varseparator)^1))^0) do - local overloads=allocate { + local overloads={ IJ={ name="I_J",unicode={ 0x49,0x4A },mess=0x0132 }, ij={ name="i_j",unicode={ 0x69,0x6A },mess=0x0133 }, ff={ name="f_f",unicode={ 0x66,0x66 },mess=0xFB00 }, @@ -9064,7 +9452,7 @@ do fj={ name="f_j",unicode={ 0x66,0x6A } }, fk={ name="f_k",unicode={ 0x66,0x6B } }, } - local o={} + local o=allocate {} for k,v in next,overloads do local name=v.name local mess=v.mess @@ -9554,11 +9942,12 @@ if not modules then modules={} end modules ['font-otr']={ copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" } -local next,type=next,type +local next,type,tonumber=next,type,tonumber local byte,lower,char,gsub=string.byte,string.lower,string.char,string.gsub local floor,round=math.floor,math.round local P,R,S,C,Cs,Cc,Ct,Carg,Cmt=lpeg.P,lpeg.R,lpeg.S,lpeg.C,lpeg.Cs,lpeg.Cc,lpeg.Ct,lpeg.Carg,lpeg.Cmt local lpegmatch=lpeg.match +local rshift=bit32.rshift local setmetatableindex=table.setmetatableindex local formatters=string.formatters local sortedkeys=table.sortedkeys @@ -10319,7 +10708,7 @@ formatreaders[4]=function(f,fontdata,offset) for i=1,nofsegments do offsets[i]=readushort(f) end - local size=(length-2*2-5*2-4*nofsegments*2)/2 + local size=(length-2*2-5*2-4*2*nofsegments)/2 for i=1,size-1 do indices[i]=readushort(f) end @@ -10721,7 +11110,7 @@ function readers.kern(f,fontdata,specification) local version=readushort(f) local length=readushort(f) local coverage=readushort(f) - local format=bit32.rshift(coverage,8) + local format=rshift(coverage,8) if format==0 then local nofpairs=readushort(f) local searchrange=readushort(f) @@ -11003,9 +11392,6 @@ local function readdata(f,offset,specification) if factors then specification.factors=factors fontdata.factors=factors - report("factors: % t",factors) - else - report("bad factors") end else end @@ -13179,7 +13565,7 @@ if not modules then modules={} end modules ['font-ttf']={ license="see context related readme files" } local next,type,unpack=next,type,unpack -local bittest,band,rshift=bit32.btest,bit32.band,bit32.rshift +local band,rshift=bit32.band,bit32.rshift local sqrt,round=math.sqrt,math.round local char=string.char local concat=table.concat @@ -13771,7 +14157,7 @@ local function readglyph(f,nofcontours) while i<=nofpoints do local flag=readbyte(f) flags[i]=flag - if bittest(flag,0x08) then + if band(flag,0x08)~=0 then for j=1,readbyte(f) do i=i+1 flags[i]=flag @@ -13782,8 +14168,8 @@ local function readglyph(f,nofcontours) local x=0 for i=1,nofpoints do local flag=flags[i] - local short=bittest(flag,0x02) - local same=bittest(flag,0x10) + local short=band(flag,0x02)~=0 + local same=band(flag,0x10)~=0 if short then if same then x=x+readbyte(f) @@ -13794,13 +14180,13 @@ local function readglyph(f,nofcontours) else x=x+readshort(f) end - points[i]={ x,0,bittest(flag,0x01) } + points[i]={ x,0,band(flag,0x01)~=0 } end local y=0 for i=1,nofpoints do local flag=flags[i] - local short=bittest(flag,0x04) - local same=bittest(flag,0x20) + local short=band(flag,0x04)~=0 + local same=band(flag,0x20)~=0 if short then if same then y=y+readbyte(f) @@ -13827,8 +14213,8 @@ local function readcomposite(f) while true do local flags=readushort(f) local index=readushort(f) - local f_xyarg=bittest(flags,0x0002) - local f_offset=bittest(flags,0x0800) + local f_xyarg=band(flags,0x0002)~=0 + local f_offset=band(flags,0x0800)~=0 local xscale=1 local xrotate=0 local yrotate=0 @@ -13838,7 +14224,7 @@ local function readcomposite(f) local base=false local reference=false if f_xyarg then - if bittest(flags,0x0001) then + if band(flags,0x0001)~=0 then xoffset=readshort(f) yoffset=readshort(f) else @@ -13846,7 +14232,7 @@ local function readcomposite(f) yoffset=readchar(f) end else - if bittest(flags,0x0001) then + if band(flags,0x0001)~=0 then base=readshort(f) reference=readshort(f) else @@ -13854,21 +14240,21 @@ local function readcomposite(f) reference=readchar(f) end end - if bittest(flags,0x0008) then + if band(flags,0x0008)~=0 then xscale=read2dot14(f) yscale=xscale if f_xyarg and f_offset then xoffset=xoffset*xscale yoffset=yoffset*yscale end - elseif bittest(flags,0x0040) then + elseif band(flags,0x0040)~=0 then xscale=read2dot14(f) yscale=read2dot14(f) if f_xyarg and f_offset then xoffset=xoffset*xscale yoffset=yoffset*yscale end - elseif bittest(flags,0x0080) then + elseif band(flags,0x0080)~=0 then xscale=read2dot14(f) xrotate=read2dot14(f) yrotate=read2dot14(f) @@ -13881,16 +14267,16 @@ local function readcomposite(f) nofcomponents=nofcomponents+1 components[nofcomponents]={ index=index, - usemine=bittest(flags,0x0200), - round=bittest(flags,0x0006), + usemine=band(flags,0x0200)~=0, + round=band(flags,0x0006)~=0, base=base, reference=reference, matrix={ xscale,xrotate,yrotate,yscale,xoffset,yoffset }, } - if bittest(flags,0x0100) then + if band(flags,0x0100)~=0 then instructions=true end - if not bittest(flags,0x0020) then + if not band(flags,0x0020)~=0 then break end end @@ -13997,7 +14383,7 @@ local function readpoints(f) return nil,0 else if count<128 then - elseif bittest(count,0x80) then + elseif band(count,0x80)~=0 then count=band(count,0x7F)*256+readbyte(f) else end @@ -14006,7 +14392,7 @@ local function readpoints(f) local n=1 while p<count do local control=readbyte(f) - local runreader=bittest(control,0x80) and readushort or readbyte + local runreader=band(control,0x80)~=0 and readushort or readbyte local runlength=band(control,0x7F) for i=1,runlength+1 do n=n+runreader(f) @@ -14026,12 +14412,12 @@ local function readdeltas(f,nofpoints) if not control then break end - local allzero=bittest(control,0x80) + local allzero=band(control,0x80)~=0 local runlength=band(control,0x3F)+1 if allzero then z=z+runlength else - local runreader=bittest(control,0x40) and readshort or readinteger + local runreader=band(control,0x40)~=0 and readshort or readinteger if z>0 then for i=1,z do p=p+1 @@ -14057,7 +14443,7 @@ local function readdeltas(f,nofpoints) while nofpoints>0 do local control=readbyte(f) if control then - local allzero=bittest(control,0x80) + local allzero=band(control,0x80)~=0 local runlength=band(control,0x3F)+1 if allzero then for i=1,runlength do @@ -14065,7 +14451,7 @@ local function readdeltas(f,nofpoints) deltas[p]=0 end else - local runreader=bittest(control,0x40) and readshort or readinteger + local runreader=band(control,0x40)~=0 and readshort or readinteger for i=1,runlength do p=p+1 deltas[p]=runreader(f) @@ -14103,7 +14489,7 @@ function readers.gvar(f,fontdata,specification,glyphdata,shapedata) local tuples={} local glyphdata=fontdata.glyphs local dowidth=not fontdata.variabledata.hvarwidths - if bittest(flags,0x0001) then + if band(flags,0x0001)~=0 then for i=1,nofglyphs+1 do data[i]=dataoffset+readulong(f) end @@ -14144,7 +14530,7 @@ function readers.gvar(f,fontdata,specification,glyphdata,shapedata) local allpoints=(shape.nofpoints or 0) local shared=false local nofshared=0 - if bittest(flags,0x8000) then + if band(flags,0x8000)~=0 then local current=getposition(f) setposition(f,offset) shared,nofshared=readpoints(f) @@ -14155,9 +14541,9 @@ function readers.gvar(f,fontdata,specification,glyphdata,shapedata) local size=readushort(f) local flags=readushort(f) local index=band(flags,0x0FFF) - local haspeak=bittest(flags,0x8000) - local intermediate=bittest(flags,0x4000) - local private=bittest(flags,0x2000) + local haspeak=band(flags,0x8000)~=0 + local intermediate=band(flags,0x4000)~=0 + local private=band(flags,0x2000)~=0 local peak=nil local start=nil local stop=nil @@ -14252,7 +14638,6 @@ if not modules then modules={} end modules ['font-dsp']={ license="see context related readme files" } local next,type=next,type -local bittest=bit32.btest local band=bit32.band local extract=bit32.extract local bor=bit32.bor @@ -14401,10 +14786,10 @@ local lookupnames={ } local lookupflags=setmetatableindex(function(t,k) local v={ - bittest(k,0x0008) and true or false, - bittest(k,0x0004) and true or false, - bittest(k,0x0002) and true or false, - bittest(k,0x0001) and true or false, + band(k,0x0008)~=0 and true or false, + band(k,0x0004)~=0 and true or false, + band(k,0x0002)~=0 and true or false, + band(k,0x0001)~=0 and true or false, } t[k]=v return v @@ -14737,12 +15122,12 @@ local function readvariation(f,offset) end local function readposition(f,format,mainoffset,getdelta) if format==0 then - return + return false end if format==0x04 then local h=readshort(f) if h==0 then - return + return true else return { 0,0,h,0 } end @@ -14751,7 +15136,7 @@ local function readposition(f,format,mainoffset,getdelta) local x=readshort(f) local h=readshort(f) if x==0 and h==0 then - return + return true else return { x,0,h,0 } end @@ -14770,20 +15155,20 @@ local function readposition(f,format,mainoffset,getdelta) skipshort(f,1) end if h==0 then - return + return true else return { 0,0,h,0 } end end - local x=bittest(format,0x01) and readshort(f) or 0 - local y=bittest(format,0x02) and readshort(f) or 0 - local h=bittest(format,0x04) and readshort(f) or 0 - local v=bittest(format,0x08) and readshort(f) or 0 + local x=band(format,0x1)~=0 and readshort(f) or 0 + local y=band(format,0x2)~=0 and readshort(f) or 0 + local h=band(format,0x4)~=0 and readshort(f) or 0 + local v=band(format,0x8)~=0 and readshort(f) or 0 if format>=0x10 then - local X=bittest(format,0x10) and skipshort(f) or 0 - local Y=bittest(format,0x20) and skipshort(f) or 0 - local H=bittest(format,0x40) and skipshort(f) or 0 - local V=bittest(format,0x80) and skipshort(f) or 0 + local X=band(format,0x10)~=0 and skipshort(f) or 0 + local Y=band(format,0x20)~=0 and skipshort(f) or 0 + local H=band(format,0x40)~=0 and skipshort(f) or 0 + local V=band(format,0x80)~=0 and skipshort(f) or 0 local s=skips[extract(format,4,4)] if s>0 then skipshort(f,s) @@ -14816,7 +15201,7 @@ local function readposition(f,format,mainoffset,getdelta) end return { x,y,h,v } elseif x==0 and y==0 and h==0 and v==0 then - return + return true else return { x,y,h,v } end @@ -15365,12 +15750,14 @@ function gsubhandlers.reversechainedcontextsingle(f,fontdata,lookupid,lookupoffs before=readcoveragearray(f,tableoffset,before,true) after=readcoveragearray(f,tableoffset,after,true) return { - coverage={ - format="reversecoverage", - before=before, - current=current, - after=after, - replacements=replacements, + format="reversecoverage", + rules={ + { + before=before, + current=current, + after=after, + replacements=replacements, + } } },"reversechainedcontextsingle" else @@ -15428,10 +15815,10 @@ function gposhandlers.single(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofg local value=readposition(f,format,tableoffset,getdelta) local coverage=readcoverage(f,tableoffset+coverage) for index,newindex in next,coverage do - coverage[index]=value + coverage[index]=value end return { - format="pair", + format="single", coverage=coverage, } elseif subtype==2 then @@ -15447,7 +15834,7 @@ function gposhandlers.single(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofg coverage[index]=values[newindex+1] end return { - format="pair", + format="single", coverage=coverage, } else @@ -15476,9 +15863,9 @@ function gposhandlers.pair(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofgly local first=value[2] local second=value[3] if first or second then - hash[other]={ first,second } + hash[other]={ first,second or nil } else - hash[other]=nil + hash[other]=nil end end end @@ -15512,7 +15899,7 @@ function gposhandlers.pair(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofgly local first=offsets[1] local second=offsets[2] if first or second then - hash[paired]={ first,second } + hash[paired]={ first,second or nil } else end end @@ -15544,17 +15931,20 @@ function gposhandlers.cursive(f,fontdata,lookupid,lookupoffset,offset,glyphs,nof local entry=readushort(f) local exit=readushort(f) records[i]={ - entry=entry~=0 and (tableoffset+entry) or false, - exit=exit~=0 and (tableoffset+exit ) or false, + entry~=0 and (tableoffset+entry) or false, + exit~=0 and (tableoffset+exit ) or nil, } end + local cc=(fontdata.temporary.cursivecount or 0)+1 + fontdata.temporary.cursivecount=cc + cc="cc-"..cc coverage=readcoverage(f,coverage) for i=1,nofrecords do local r=records[i] records[i]={ - 1, - readanchor(f,r.entry,getdelta) or nil, - readanchor(f,r.exit,getdelta) or nil, + cc, + readanchor(f,r[1],getdelta) or false, + readanchor(f,r[2],getdelta) or nil, } end for index,newindex in next,coverage do @@ -15918,7 +16308,7 @@ do for j=1,nofsubtables do subtables[j]=offset+readushort(f) end - local markclass=bittest(flagbits,0x0010) + local markclass=band(flagbits,0x0010)~=0 if markclass then markclass=readushort(f) end @@ -15940,7 +16330,7 @@ do end local f_lookupname=formatters["%s_%s_%s"] local function resolvelookups(f,lookupoffset,fontdata,lookups,lookuptypes,lookuphandlers,what,tableoffset) - local sequences=fontdata.sequences or {} + local sequences=fontdata.sequences or {} local sublookuplist=fontdata.sublookups or {} fontdata.sequences=sequences fontdata.sublookups=sublookuplist @@ -15955,6 +16345,7 @@ do local nofglyphs=fontdata.nofglyphs or #glyphs local noflookups=#lookups local lookupprefix=sub(what,2,2) + local usedlookups=false for lookupid=1,noflookups do local lookup=lookups[lookupid] local lookuptype=lookup.type @@ -15994,6 +16385,7 @@ do local before=rule.before local current=rule.current local after=rule.after + local replacements=rule.replacements if before then for i=1,#before do before[i]=tohash(before[i]) @@ -16001,15 +16393,41 @@ do rule.before=reversed(before) end if current then - for i=1,#current do - current[i]=tohash(current[i]) + if replacements then + local first=current[1] + local hash={} + local repl={} + for i=1,#first do + local c=first[i] + hash[c]=true + repl[c]=replacements[i] + end + rule.current={ hash } + rule.replacements=repl + else + for i=1,#current do + current[i]=tohash(current[i]) + end end + else end if after then for i=1,#after do after[i]=tohash(after[i]) end end + if usedlookups then + local lookups=rule.lookups + if lookups then + for k,v in next,lookups do + if v then + for k,v in next,v do + usedlookups[v]=usedlookups[v]+1 + end + end + end + end + end end end end @@ -16056,6 +16474,9 @@ do report("no handler for lookup %a with type %a",lookupid,lookuptype) end end + if usedlookups then + report("used %s lookups: % t",what,sortedkeys(usedlookups)) + end local reported={} local function report_issue(i,what,sequence,kind) local name=sequence.name @@ -16097,7 +16518,7 @@ do local d=lookup.done if d then nofsublookups=nofsublookups+1 - h={ + local l={ index=nofsublookups, name=f_lookupname(lookupprefix,"d",lookupid+lookupidoffset), derived=true, @@ -16107,7 +16528,7 @@ do markclass=d.markclass or nil, flags=d.flags, } - sublookuplist[nofsublookups]=copy(h) + sublookuplist[nofsublookups]=copy(l) sublookuphash[lookupid]=nofsublookups sublookupcheck[lookupid]=1 h=nofsublookups @@ -16281,7 +16702,7 @@ do local version=readushort(f) local length=readushort(f) local coverage=readushort(f) - local format=bit32.rshift(coverage,8) + local format=rshift(coverage,8) if format==0 then local nofpairs=readushort(f) local searchrange=readushort(f) @@ -16350,12 +16771,12 @@ function readers.gdef(f,fontdata,specification) local tableoffset=datatable.offset setposition(f,tableoffset) local version=readulong(f) - local classoffset=tableoffset+readushort(f) - local attachmentoffset=tableoffset+readushort(f) - local ligaturecarets=tableoffset+readushort(f) - local markclassoffset=tableoffset+readushort(f) - local marksetsoffset=version>=0x00010002 and (tableoffset+readushort(f)) - local varsetsoffset=version>=0x00010003 and (tableoffset+readulong(f)) + local classoffset=readushort(f) + local attachmentoffset=readushort(f) + local ligaturecarets=readushort(f) + local markclassoffset=readushort(f) + local marksetsoffset=version>=0x00010002 and readushort(f) or 0 + local varsetsoffset=version>=0x00010003 and readulong(f) or 0 local glyphs=fontdata.glyphs local marks={} local markclasses=setmetatableindex("table") @@ -16363,54 +16784,59 @@ function readers.gdef(f,fontdata,specification) fontdata.marks=marks fontdata.markclasses=markclasses fontdata.marksets=marksets - setposition(f,classoffset) - local classformat=readushort(f) - if classformat==1 then - local firstindex=readushort(f) - local lastindex=firstindex+readushort(f)-1 - for index=firstindex,lastindex do - local class=classes[readushort(f)] - if class=="mark" then - marks[index]=true - end - glyphs[index].class=class - end - elseif classformat==2 then - local nofranges=readushort(f) - for i=1,nofranges do + if classoffset~=0 then + setposition(f,tableoffset+classoffset) + local classformat=readushort(f) + if classformat==1 then local firstindex=readushort(f) - local lastindex=readushort(f) - local class=classes[readushort(f)] - if class then - for index=firstindex,lastindex do - glyphs[index].class=class - if class=="mark" then - marks[index]=true + local lastindex=firstindex+readushort(f)-1 + for index=firstindex,lastindex do + local class=classes[readushort(f)] + if class=="mark" then + marks[index]=true + end + glyphs[index].class=class + end + elseif classformat==2 then + local nofranges=readushort(f) + for i=1,nofranges do + local firstindex=readushort(f) + local lastindex=readushort(f) + local class=classes[readushort(f)] + if class then + for index=firstindex,lastindex do + glyphs[index].class=class + if class=="mark" then + marks[index]=true + end end end end end end - setposition(f,markclassoffset) - local classformat=readushort(f) - if classformat==1 then - local firstindex=readushort(f) - local lastindex=firstindex+readushort(f)-1 - for index=firstindex,lastindex do - markclasses[readushort(f)][index]=true - end - elseif classformat==2 then - local nofranges=readushort(f) - for i=1,nofranges do + if markclassoffset~=0 then + setposition(f,tableoffset+markclassoffset) + local classformat=readushort(f) + if classformat==1 then local firstindex=readushort(f) - local lastindex=readushort(f) - local class=markclasses[readushort(f)] + local lastindex=firstindex+readushort(f)-1 for index=firstindex,lastindex do - class[index]=true + markclasses[readushort(f)][index]=true + end + elseif classformat==2 then + local nofranges=readushort(f) + for i=1,nofranges do + local firstindex=readushort(f) + local lastindex=readushort(f) + local class=markclasses[readushort(f)] + for index=firstindex,lastindex do + class[index]=true + end end end end - if marksetsoffset and marksetsoffset>tableoffset then + if marksetsoffset~=0 then + marksetsoffset=tableoffset+marksetsoffset setposition(f,marksetsoffset) local format=readushort(f) if format==1 then @@ -16428,8 +16854,8 @@ function readers.gdef(f,fontdata,specification) end end local factors=specification.factors - if (specification.variable or factors) and varsetsoffset and varsetsoffset>tableoffset then - local regions,deltas=readvariationdata(f,varsetsoffset,factors) + if (specification.variable or factors) and varsetsoffset~=0 then + local regions,deltas=readvariationdata(f,tableoffset+varsetsoffset,factors) if factors then fontdata.temporary.getdelta=function(outer,inner) local delta=deltas[outer+1] @@ -16696,7 +17122,7 @@ local function readmathvariants(f,fontdata,offset) advance=readushort(f), } local flags=readushort(f) - if bittest(flags,0x0001) then + if band(flags,0x0001)~=0 then p.extender=1 end parts[i]=p @@ -16937,9 +17363,10 @@ function readers.stat(f,fontdata,specification) local values={} setposition(f,tableoffset+axisoffset) for i=1,nofaxis do + local tag=readtag(f) axis[i]={ - tag=readtag(f), - name=lower(extras[readushort(f)]), + tag=tag, + name=lower(extras[readushort(f)] or tag), ordering=readushort(f), variants={} } @@ -16953,7 +17380,7 @@ function readers.stat(f,fontdata,specification) local format=readushort(f) local index=readushort(f)+1 local flags=readushort(f) - local name=lower(extras[readushort(f)]) + local name=lower(extras[readushort(f)] or "no name") local value=readfixed(f) local variant if format==1 then @@ -17240,6 +17667,7 @@ local formatters=string.formatters local sortedkeys=table.sortedkeys local sortedhash=table.sortedhash local tohash=table.tohash +local setmetatableindex=table.setmetatableindex local report=logs.reporter("otf reader") local trace_markwidth=false trackers.register("otf.markwidth",function(v) trace_markwidth=v end) local readers=fonts.handlers.otf.readers @@ -17250,7 +17678,7 @@ local f_index=formatters["I%05X"] local f_character_y=formatters["%C"] local f_character_n=formatters["[ %C ]"] local check_duplicates=true -local check_soft_hyphen=false +local check_soft_hyphen=true directives.register("otf.checksofthyphen",function(v) check_soft_hyphen=v end) @@ -17800,7 +18228,7 @@ local function checklookups(fontdata,missing,nofmissing) end end if next(done) then - report("not unicoded: % t",table.sortedkeys(done)) + report("not unicoded: % t",sortedkeys(done)) end end end @@ -17810,7 +18238,6 @@ local function unifymissing(fontdata) require("font-agl") end local unicodes={} - local private=fontdata.private local resources=fontdata.resources resources.unicodes=unicodes for unicode,d in next,fontdata.descriptions do @@ -18189,13 +18616,14 @@ function readers.pack(data) return nt end end - local function pack_flat(v) - local tag=tabstr_flat(v) + local function pack_normal_cc(v) + local tag=tabstr_normal(v) local ht=h[tag] if ht then c[ht]=c[ht]+1 return ht else + v[1]=0 nt=nt+1 t[nt]=v h[tag]=nt @@ -18203,8 +18631,8 @@ function readers.pack(data) return nt end end - local function pack_boolean(v) - local tag=tabstr_boolean(v) + local function pack_flat(v) + local tag=tabstr_flat(v) local ht=h[tag] if ht then c[ht]=c[ht]+1 @@ -18245,6 +18673,20 @@ function readers.pack(data) return nt end end + local function pack_boolean(v) + local tag=tabstr_boolean(v) + local ht=h[tag] + if ht then + c[ht]=c[ht]+1 + return ht + else + nt=nt+1 + t[nt]=v + h[tag]=nt + c[nt]=1 + return nt + end + end local function pack_final(v) if c[v]<=criterium then return t[v] @@ -18261,6 +18703,22 @@ function readers.pack(data) end end end + local function pack_final_cc(v) + if c[v]<=criterium then + return t[v] + else + local hv=hh[v] + if hv then + return hv + else + ntt=ntt+1 + tt[ntt]=t[v] + hh[v]=ntt + cc[ntt]=c[v] + return ntt + end + end + end local function success(stage,pass) if nt==0 then if trace_loading or trace_packing then @@ -18306,9 +18764,9 @@ function readers.pack(data) end local function packers(pass) if pass==1 then - return pack_normal,pack_indexed,pack_flat,pack_boolean,pack_mixed + return pack_normal,pack_indexed,pack_flat,pack_boolean,pack_mixed,pack_normal_cc else - return pack_final,pack_final,pack_final,pack_final,pack_final + return pack_final,pack_final,pack_final,pack_final,pack_final,pack_final_cc end end local resources=data.resources @@ -18326,7 +18784,7 @@ function readers.pack(data) if trace_packing then report_otf("start packing: stage 1, pass %s",pass) end - local pack_normal,pack_indexed,pack_flat,pack_boolean,pack_mixed=packers(pass) + local pack_normal,pack_indexed,pack_flat,pack_boolean,pack_mixed,pack_normal_cc=packers(pass) for unicode,description in next,descriptions do local boundingbox=description.boundingbox if boundingbox then @@ -18356,28 +18814,30 @@ function readers.pack(data) if kind=="gpos_pair" then local c=step.coverage if c then - if step.format=="kern" then + if step.format=="pair" then for g1,d1 in next,c do - c[g1]=pack_normal(d1) + for g2,d2 in next,d1 do + local f=d2[1] if f and f~=true then d2[1]=pack_indexed(f) end + local s=d2[2] if s and s~=true then d2[2]=pack_indexed(s) end + end end else for g1,d1 in next,c do - for g2,d2 in next,d1 do - local f=d2[1] if f then d2[1]=pack_indexed(f) end - local s=d2[2] if s then d2[2]=pack_indexed(s) end - end + c[g1]=pack_normal(d1) end end end elseif kind=="gpos_single" then local c=step.coverage if c then - if step.format=="kern" then - step.coverage=pack_normal(c) - else + if step.format=="single" then for g1,d1 in next,c do - c[g1]=pack_indexed(d1) + if d1 and d1~=true then + c[g1]=pack_indexed(d1) + end end + else + step.coverage=pack_normal(c) end end elseif kind=="gpos_cursive" then @@ -18484,7 +18944,6 @@ function readers.pack(data) for i=1,#deltas do local di=deltas[i] local d=di.deltas - local r=di.regions for j=1,#d do d[j]=pack_indexed(d[j]) end @@ -18516,7 +18975,7 @@ function readers.pack(data) if trace_packing then report_otf("start packing: stage 2, pass %s",pass) end - local pack_normal,pack_indexed,pack_flat,pack_boolean,pack_mixed=packers(pass) + local pack_normal,pack_indexed,pack_flat,pack_boolean,pack_mixed,pack_normal_cc=packers(pass) for unicode,description in next,descriptions do local math=description.math if math then @@ -18538,8 +18997,7 @@ function readers.pack(data) if kind=="gpos_pair" then local c=step.coverage if c then - if step.format=="kern" then - else + if step.format=="pair" then for g1,d1 in next,c do for g2,d2 in next,d1 do d1[g2]=pack_normal(d2) @@ -18547,6 +19005,15 @@ function readers.pack(data) end end end + elseif kind=="gpos_mark2ligature" then + local c=step.baseclasses + if c then + for g1,d1 in next,c do + for g2,d2 in next,d1 do + d1[g2]=pack_normal(d2) + end + end + end end local rules=step.rules if rules then @@ -18589,7 +19056,7 @@ function readers.pack(data) if trace_packing then report_otf("start packing: stage 3, pass %s",pass) end - local pack_normal,pack_indexed,pack_flat,pack_boolean,pack_mixed=packers(pass) + local pack_normal,pack_indexed,pack_flat,pack_boolean,pack_mixed,pack_normal_cc=packers(pass) local function packthem(sequences) for i=1,#sequences do local sequence=sequences[i] @@ -18602,13 +19069,19 @@ function readers.pack(data) if kind=="gpos_pair" then local c=step.coverage if c then - if step.format=="kern" then - else + if step.format=="pair" then for g1,d1 in next,c do c[g1]=pack_normal(d1) end end end + elseif kind=="gpos_cursive" then + local c=step.coverage + if c then + for g1,d1 in next,c do + c[g1]=pack_normal_cc(d1) + end + end end end end @@ -18677,20 +19150,26 @@ function readers.unpack(data) local features=sequence.features local flags=sequence.flags local markclass=sequence.markclass + if features then + local tv=tables[features] + if tv then + sequence.features=tv + features=tv + end + for script,feature in next,features do + local tv=tables[feature] + if tv then + features[script]=tv + end + end + end if steps then for i=1,#steps do local step=steps[i] if kind=="gpos_pair" then local c=step.coverage if c then - if step.format=="kern" then - for g1,d1 in next,c do - local tv=tables[d1] - if tv then - c[g1]=tv - end - end - else + if step.format=="pair" then for g1,d1 in next,c do local tv=tables[d1] if tv then @@ -18707,29 +19186,41 @@ function readers.unpack(data) local s=tables[d2[2]] if s then d2[2]=s end end end + else + for g1,d1 in next,c do + local tv=tables[d1] + if tv then + c[g1]=tv + end + end end end elseif kind=="gpos_single" then local c=step.coverage if c then - if step.format=="kern" then - local tv=tables[c] - if tv then - step.coverage=tv - end - else + if step.format=="single" then for g1,d1 in next,c do local tv=tables[d1] if tv then c[g1]=tv end end + else + local tv=tables[c] + if tv then + step.coverage=tv + end end end elseif kind=="gpos_cursive" then local c=step.coverage if c then for g1,d1 in next,c do + local tv=tables[d1] + if tv then + d1=tv + c[g1]=d1 + end local f=tables[d1[2]] if f then d1[2]=f end local s=tables[d1[3]] if s then d1[3]=s end end @@ -18760,6 +19251,11 @@ function readers.unpack(data) if c then for g1,d1 in next,c do for g2,d2 in next,d1 do + local tv=tables[d2] + if tv then + d2=tv + d1[g2]=d2 + end for g3,d3 in next,d2 do local tv=tables[d2[g3]] if tv then @@ -18836,19 +19332,6 @@ function readers.unpack(data) end end end - if features then - local tv=tables[features] - if tv then - sequence.features=tv - features=tv - end - for script,feature in next,features do - local tv=tables[feature] - if tv then - features[script]=tv - end - end - end if order then local tv=tables[order] if tv then @@ -18996,7 +19479,7 @@ local function mergesteps_1(lookup,strict) lookup.steps={ first } return nofsteps-1 end -local function mergesteps_2(lookup,strict) +local function mergesteps_2(lookup) local steps=lookup.steps local nofsteps=lookup.nofsteps local first=steps[1] @@ -19015,9 +19498,9 @@ local function mergesteps_2(lookup,strict) for k,v in next,steps[i].coverage do local tk=target[k] if tk then - for k,v in next,v do - if not tk[k] then - tk[k]=v + for kk,vv in next,v do + if tk[kk]==nil then + tk[kk]=vv end end else @@ -19026,55 +19509,42 @@ local function mergesteps_2(lookup,strict) end end lookup.nofsteps=1 + lookup.merged=true lookup.steps={ first } return nofsteps-1 end local function mergesteps_3(lookup,strict) local steps=lookup.steps local nofsteps=lookup.nofsteps - local first=steps[1] report("merging %a steps of %a lookup %a",nofsteps,lookup.type,lookup.name) - local baseclasses={} local coverage={} - local used={} for i=1,nofsteps do - local offset=i*10 - local step=steps[i] - for k,v in sortedhash(step.baseclasses) do - baseclasses[offset+k]=v - end - for k,v in next,step.coverage do - local tk=coverage[k] + for k,v in next,steps[i].coverage do + local tk=coverage[k] if tk then - for k,v in next,v do - if not tk[k] then - tk[k]=v - local c=offset+v[1] - v[1]=c - if not used[c] then - used[c]=true - end - end - end + report("quitting merge due to multiple checks") + return nofsteps else coverage[k]=v - local c=offset+v[1] - v[1]=c - if not used[c] then - used[c]=true - end end end end - for k,v in next,baseclasses do - if not used[k] then - baseclasses[k]=nil - report("discarding not used baseclass %i",k) + local first=steps[1] + local baseclasses={} + for i=1,nofsteps do + local offset=i*10 + local step=steps[i] + for k,v in sortedhash(step.baseclasses) do + baseclasses[offset+k]=v + end + for k,v in next,step.coverage do + v[1]=offset+v[1] end end first.baseclasses=baseclasses first.coverage=coverage lookup.nofsteps=1 + lookup.merged=true lookup.steps={ first } return nofsteps-1 end @@ -19114,67 +19584,136 @@ local function mergesteps_4(lookup) lookup.steps={ first } return nofsteps-1 end +local function mergesteps_5(lookup) + local steps=lookup.steps + local nofsteps=lookup.nofsteps + local first=steps[1] + report("merging %a steps of %a lookup %a",nofsteps,lookup.type,lookup.name) + local target=first.coverage + local hash=nil + for k,v in next,target do + hash=v[1] + break + end + for i=2,nofsteps do + for k,v in next,steps[i].coverage do + local tk=target[k] + if tk then + if not tk[2] then + tk[2]=v[2] + end + if not tk[3] then + tk[3]=v[3] + end + else + target[k]=v + v[1]=hash + end + end + end + lookup.nofsteps=1 + lookup.merged=true + lookup.steps={ first } + return nofsteps-1 +end local function checkkerns(lookup) local steps=lookup.steps local nofsteps=lookup.nofsteps + local kerned=0 for i=1,nofsteps do local step=steps[i] if step.format=="pair" then local coverage=step.coverage local kerns=true for g1,d1 in next,coverage do - if d1[1]~=0 or d1[2]~=0 or d1[4]~=0 then + if d1==true then + elseif not d1 then + elseif d1[1]~=0 or d1[2]~=0 or d1[4]~=0 then kerns=false break end end if kerns then report("turning pairs of step %a of %a lookup %a into kerns",i,lookup.type,lookup.name) + local c={} for g1,d1 in next,coverage do - coverage[g1]=d1[3] + if d1 and d1~=true then + c[g1]=d1[3] + end end - step.format="kern" + step.coverage=c + step.format="move" + kerned=kerned+1 end end end + return kerned end local function checkpairs(lookup) local steps=lookup.steps local nofsteps=lookup.nofsteps local kerned=0 - for i=1,nofsteps do - local step=steps[i] - if step.format=="pair" then - local coverage=step.coverage - local kerns=true - for g1,d1 in next,coverage do - for g2,d2 in next,d1 do - if d2[2] then - kerns=false - break - else - local v=d2[1] - if v[1]~=0 or v[2]~=0 or v[4]~=0 then - kerns=false - break - end + local function onlykerns(step) + local coverage=step.coverage + for g1,d1 in next,coverage do + for g2,d2 in next,d1 do + if d2[2] then + return false + else + local v=d2[1] + if v==true then + elseif v and (v[1]~=0 or v[2]~=0 or v[4]~=0) then + return false end end end - if kerns then + end + return coverage + end + for i=1,nofsteps do + local step=steps[i] + if step.format=="pair" then + local coverage=onlykerns(step) + if coverage then report("turning pairs of step %a of %a lookup %a into kerns",i,lookup.type,lookup.name) for g1,d1 in next,coverage do + local d={} for g2,d2 in next,d1 do - d1[g2]=d2[1][3] + local v=d2[1] + if v==true then + elseif v then + d[g2]=v[3] + end end + coverage[g1]=d end - step.format="kern" + step.format="move" kerned=kerned+1 end end end return kerned end +local compact_pairs=true +local compact_singles=true +local merge_pairs=true +local merge_singles=true +local merge_substitutions=true +local merge_alternates=true +local merge_multiples=true +local merge_ligatures=true +local merge_cursives=true +local merge_marks=true +directives.register("otf.compact.pairs",function(v) compact_pairs=v end) +directives.register("otf.compact.singles",function(v) compact_singles=v end) +directives.register("otf.merge.pairs",function(v) merge_pairs=v end) +directives.register("otf.merge.singles",function(v) merge_singles=v end) +directives.register("otf.merge.substitutions",function(v) merge_substitutions=v end) +directives.register("otf.merge.alternates",function(v) merge_alternates=v end) +directives.register("otf.merge.multiples",function(v) merge_multiples=v end) +directives.register("otf.merge.ligatures",function(v) merge_ligatures=v end) +directives.register("otf.merge.cursives",function(v) merge_cursives=v end) +directives.register("otf.merge.marks",function(v) merge_marks=v end) function readers.compact(data) if not data or data.compacted then return @@ -19191,23 +19730,64 @@ function readers.compact(data) for i=1,#lookups do local lookup=lookups[i] local nofsteps=lookup.nofsteps + local kind=lookup.type allsteps=allsteps+nofsteps if nofsteps>1 then - local kind=lookup.type - if kind=="gsub_single" or kind=="gsub_alternate" or kind=="gsub_multiple" then - merged=merged+mergesteps_1(lookup) + local merg=merged + if kind=="gsub_single" then + if merge_substitutions then + merged=merged+mergesteps_1(lookup) + end + elseif kind=="gsub_alternate" then + if merge_alternates then + merged=merged+mergesteps_1(lookup) + end + elseif kind=="gsub_multiple" then + if merge_multiples then + merged=merged+mergesteps_1(lookup) + end elseif kind=="gsub_ligature" then - merged=merged+mergesteps_4(lookup) + if merge_ligatures then + merged=merged+mergesteps_4(lookup) + end elseif kind=="gpos_single" then - merged=merged+mergesteps_1(lookup,true) - checkkerns(lookup) + if merge_singles then + merged=merged+mergesteps_1(lookup,true) + end + if compact_singles then + kerned=kerned+checkkerns(lookup) + end elseif kind=="gpos_pair" then - merged=merged+mergesteps_2(lookup,true) - kerned=kerned+checkpairs(lookup) + if merge_pairs then + merged=merged+mergesteps_2(lookup) + end + if compact_pairs then + kerned=kerned+checkpairs(lookup) + end elseif kind=="gpos_cursive" then - merged=merged+mergesteps_2(lookup) + if merge_cursives then + merged=merged+mergesteps_5(lookup) + end elseif kind=="gpos_mark2mark" or kind=="gpos_mark2base" or kind=="gpos_mark2ligature" then - merged=merged+mergesteps_3(lookup) + if merge_marks then + merged=merged+mergesteps_3(lookup) + end + end + if merg~=merged then + lookup.merged=true + end + elseif nofsteps==1 then + local kern=kerned + if kind=="gpos_single" then + if compact_singles then + kerned=kerned+checkkerns(lookup) + end + elseif kind=="gpos_pair" then + if compact_pairs then + kerned=kerned+checkpairs(lookup) + end + end + if kern~=kerned then end end end @@ -19224,6 +19804,72 @@ function readers.compact(data) report("%i steps of %i steps turned from pairs into kerns",kerned,allsteps) end end +local function mergesteps(t,k) + if k=="merged" then + local merged={} + for i=1,#t do + local step=t[i] + local coverage=step.coverage + for k in next,coverage do + local m=merged[k] + if m then + m[2]=i + else + merged[k]={ i,i } + end + end + end + t.merged=merged + return merged + end +end +local function checkmerge(sequence) + local steps=sequence.steps + if steps then + setmetatableindex(steps,mergesteps) + end +end +local function checkflags(sequence,resources) + if not sequence.skiphash then + local flags=sequence.flags + if flags then + local skipmark=flags[1] + local skipligature=flags[2] + local skipbase=flags[3] + local markclass=sequence.markclass + local skipsome=skipmark or skipligature or skipbase or markclass or false + if skipsome then + sequence.skiphash=setmetatableindex(function(t,k) + local c=resources.classes[k] + local v=c==skipmark + or (markclass and c=="mark" and not markclass[k]) + or c==skipligature + or c==skipbase + or false + t[k]=v + return v + end) + else + sequence.skiphash=false + end + else + sequence.skiphash=false + end + end +end +local function checksteps(sequence) + local steps=sequence.steps + if steps then + for i=1,#steps do + steps[i].index=i + end + end +end +if fonts.helpers then + fonts.helpers.checkmerge=checkmerge + fonts.helpers.checkflags=checkflags + fonts.helpers.checksteps=checksteps +end function readers.expand(data) if not data or data.expanded then return @@ -19268,6 +19914,7 @@ function readers.expand(data) local sequence=sequences[i] local steps=sequence.steps if steps then + local nofsteps=sequence.nofsteps local kind=sequence.type local markclass=sequence.markclass if markclass then @@ -19278,7 +19925,7 @@ function readers.expand(data) sequence.markclass=markclasses[markclass] end end - for i=1,sequence.nofsteps do + for i=1,nofsteps do local step=steps[i] local baseclasses=step.baseclasses if baseclasses then @@ -19294,13 +19941,14 @@ function readers.expand(data) end local rules=step.rules if rules then - local rulehash={} + local rulehash={ n=0 } local rulesize=0 local coverage={} local lookuptype=sequence.type + local nofrules=#rules step.coverage=coverage - for nofrules=1,#rules do - local rule=rules[nofrules] + for currentrule=1,nofrules do + local rule=rules[currentrule] local current=rule.current local before=rule.before local after=rule.after @@ -19331,7 +19979,7 @@ function readers.expand(data) for i=1,#lookups do local lookups=lookups[i] if lookups then - for k,v in next,lookups do + for k,v in next,lookups do local lookup=sublookups[v] if lookup then lookups[k]=lookup @@ -19345,9 +19993,9 @@ function readers.expand(data) end end if sequence[1] then - rulesize=rulesize+1 - rulehash[rulesize]={ - nofrules, + sequence.n=#sequence + local ruledata={ + currentrule, lookuptype, sequence, start, @@ -19356,16 +20004,36 @@ function readers.expand(data) replacements, subtype, } - for unic in next,sequence[start] do - local cu=coverage[unic] - if not cu then - coverage[unic]=rulehash + rulesize=rulesize+1 + rulehash[rulesize]=ruledata + rulehash.n=rulesize + if true then + for unic in next,sequence[start] do + local cu=coverage[unic] + if cu then + local n=#cu+1 + cu[n]=ruledata + cu.n=n + else + coverage[unic]={ ruledata,n=1 } + end + end + else + for unic in next,sequence[start] do + local cu=coverage[unic] + if cu then + else + coverage[unic]=rulehash + end end end end end end end + checkmerge(sequence) + checkflags(sequence,resources) + checksteps(sequence) end end end @@ -19404,7 +20072,7 @@ local trace_defining=false registertracker("fonts.defining",function(v) trace_de local report_otf=logs.reporter("fonts","otf loading") local fonts=fonts local otf=fonts.handlers.otf -otf.version=3.029 +otf.version=3.103 otf.cache=containers.define("fonts","otl",otf.version,true) otf.svgcache=containers.define("fonts","svg",otf.version,true) otf.sbixcache=containers.define("fonts","sbix",otf.version,true) @@ -19424,6 +20092,7 @@ local forceload=false local cleanup=0 local syncspace=true local forcenotdef=false +local privateoffset=fonts.constructors and fonts.constructors.privateoffset or 0xF0000 local applyruntimefixes=fonts.treatments and fonts.treatments.applyfixes local wildcard="*" local default="dflt" @@ -19435,7 +20104,25 @@ registerdirective("fonts.otf.loader.cleanup",function(v) cleanup=tonumber(v) or registerdirective("fonts.otf.loader.force",function(v) forceload=v end) registerdirective("fonts.otf.loader.syncspace",function(v) syncspace=v end) registerdirective("fonts.otf.loader.forcenotdef",function(v) forcenotdef=v end) -registerotfenhancer("check extra features",function() end) +registerotfenhancer("check extra features",function() end) +local checkmemory=utilities.lua and utilities.lua.checkmemory +local threshold=100 +local tracememory=false +registertracker("fonts.otf.loader.memory",function(v) tracememory=v end) +if not checkmemory then + local collectgarbage=collectgarbage + checkmemory=function(previous,threshold) + local current=collectgarbage("count") + if previous then + local checked=(threshold or 64)*1024 + if current-previous>checked then + collectgarbage("collect") + current=collectgarbage("count") + end + end + return current + end +end function otf.load(filename,sub,instance) local base=file.basename(file.removesuffix(filename)) local name=file.removesuffix(base) @@ -19464,9 +20151,13 @@ function otf.load(filename,sub,instance) starttiming(otfreaders) data=otfreaders.loadfont(filename,sub or 1,instance) if data then + local used=checkmemory() local resources=data.resources local svgshapes=resources.svgshapes local sbixshapes=resources.sbixshapes + if cleanup==0 then + checkmemory(used,threshold,tracememory) + end if svgshapes then resources.svgshapes=nil if otf.svgenabled then @@ -19480,6 +20171,11 @@ function otf.load(filename,sub,instance) timestamp=timestamp, } end + if cleanup>1 then + collectgarbage("collect") + else + checkmemory(used,threshold,tracememory) + end end if sbixshapes then resources.sbixshapes=nil @@ -19494,17 +20190,30 @@ function otf.load(filename,sub,instance) timestamp=timestamp, } end + if cleanup>1 then + collectgarbage("collect") + else + checkmemory(used,threshold,tracememory) + end end otfreaders.compact(data) + if cleanup==0 then + checkmemory(used,threshold,tracememory) + end otfreaders.rehash(data,"unicodes") otfreaders.addunicodetable(data) otfreaders.extend(data) + if cleanup==0 then + checkmemory(used,threshold,tracememory) + end otfreaders.pack(data) report_otf("loading done") report_otf("saving %a in cache",filename) data=containers.write(otf.cache,hash,data) if cleanup>1 then collectgarbage("collect") + else + checkmemory(used,threshold,tracememory) end stoptiming(otfreaders) if elapsedtime then @@ -19512,10 +20221,14 @@ function otf.load(filename,sub,instance) end if cleanup>3 then collectgarbage("collect") + else + checkmemory(used,threshold,tracememory) end data=containers.read(otf.cache,hash) if cleanup>2 then collectgarbage("collect") + else + checkmemory(used,threshold,tracememory) end else data=nil @@ -19531,7 +20244,7 @@ function otf.load(filename,sub,instance) otfreaders.addunicodetable(data) otfenhancers.apply(data,filename,data) if applyruntimefixes then - applyruntimefixes(filename,data) + applyruntimefixes(filename,data) end data.metadata.math=data.resources.mathconstants local classes=data.resources.classes @@ -19588,7 +20301,7 @@ local function copytotfm(data,cache_id) end if mathspecs then for unicode,character in next,characters do - local d=descriptions[unicode] + local d=descriptions[unicode] local m=d.math if m then local italic=m.italic @@ -19728,6 +20441,7 @@ local function copytotfm(data,cache_id) properties.fullname=fullname properties.psname=psname properties.name=filename or fullname + properties.private=properties.private or data.private or privateoffset return { characters=characters, descriptions=descriptions, @@ -19820,7 +20534,7 @@ local function checkmathsize(tfmdata,mathsize) local parameters=tfmdata.parameters parameters.scriptpercentage=mathdata.ScriptPercentScaleDown parameters.scriptscriptpercentage=mathdata.ScriptScriptPercentScaleDown - parameters.mathsize=mathsize + parameters.mathsize=mathsize end end registerotffeature { @@ -20002,6 +20716,7 @@ otf.coverup={ multiple=justset, kern=justset, pair=justset, + single=justset, ligature=function(coverage,unicode,ligature) local first=ligature[1] local tree=coverage[first] @@ -20057,6 +20772,7 @@ local otf=fonts.handlers.otf local otffeatures=otf.features local registerotffeature=otffeatures.register otf.defaultbasealternate="none" +local getprivate=fonts.constructors.getprivate local wildcard="*" local default="dflt" local formatters=string.formatters @@ -20090,19 +20806,31 @@ end local function cref(feature,sequence) return formatters["feature %a, type %a, chain lookup %a"](feature,sequence.type,sequence.name) end -local function report_alternate(feature,sequence,descriptions,unicode,replacement,value,comment) - report_prepare("%s: base alternate %s => %s (%S => %S)", - cref(feature,sequence), - gref(descriptions,unicode), - replacement and gref(descriptions,replacement), - value, - comment) -end local function report_substitution(feature,sequence,descriptions,unicode,substitution) - report_prepare("%s: base substitution %s => %S", - cref(feature,sequence), - gref(descriptions,unicode), - gref(descriptions,substitution)) + if unicode==substitution then + report_prepare("%s: base substitution %s maps onto itself", + cref(feature,sequence), + gref(descriptions,unicode)) + else + report_prepare("%s: base substitution %s => %S", + cref(feature,sequence), + gref(descriptions,unicode), + gref(descriptions,substitution)) + end +end +local function report_alternate(feature,sequence,descriptions,unicode,replacement,value,comment) + if unicode==replacement then + report_prepare("%s: base alternate %s maps onto itself", + cref(feature,sequence), + gref(descriptions,unicode)) + else + report_prepare("%s: base alternate %s => %s (%S => %S)", + cref(feature,sequence), + gref(descriptions,unicode), + replacement and gref(descriptions,replacement), + value, + comment) + end end local function report_ligature(feature,sequence,descriptions,unicode,ligature) report_prepare("%s: base ligature %s => %S", @@ -20135,13 +20863,11 @@ local function registerbasefeature(feature,value) applied[#applied+1]=feature.."="..tostring(value) end local function makefake(tfmdata,name,present) - local resources=tfmdata.resources - local private=resources.private + local private=getprivate(tfmdata) local character={ intermediate=true,ligatures={} } resources.unicodes[name]=private tfmdata.characters[private]=character tfmdata.descriptions[private]={ name=name } - resources.private=private+1 present[name]=private return character end @@ -20207,37 +20933,44 @@ local function preparesubstitutions(tfmdata,feature,value,validlookups,lookuplis if kind=="gsub_single" then for i=1,#steps do for unicode,data in next,steps[i].coverage do - if trace_singles then - report_substitution(feature,sequence,descriptions,unicode,data) - end + if unicode~=data then changed[unicode]=data + end + if trace_singles then + report_substitution(feature,sequence,descriptions,unicode,data) + end end end elseif kind=="gsub_alternate" then for i=1,#steps do for unicode,data in next,steps[i].coverage do - if not changed[unicode] then - local replacement=data[alternate] - if replacement then + local replacement=data[alternate] + if replacement then + if unicode~=replacement then changed[unicode]=replacement - if trace_alternatives then - report_alternate(feature,sequence,descriptions,unicode,replacement,value,"normal") - end - elseif defaultalt=="first" then - replacement=data[1] + end + if trace_alternatives then + report_alternate(feature,sequence,descriptions,unicode,replacement,value,"normal") + end + elseif defaultalt=="first" then + replacement=data[1] + if unicode~=replacement then changed[unicode]=replacement - if trace_alternatives then - report_alternate(feature,sequence,descriptions,unicode,replacement,value,defaultalt) - end - elseif defaultalt=="last" then - replacement=data[#data] - if trace_alternatives then - report_alternate(feature,sequence,descriptions,unicode,replacement,value,defaultalt) - end - else - if trace_alternatives then - report_alternate(feature,sequence,descriptions,unicode,replacement,value,"unknown") - end + end + if trace_alternatives then + report_alternate(feature,sequence,descriptions,unicode,replacement,value,defaultalt) + end + elseif defaultalt=="last" then + replacement=data[#data] + if unicode~=replacement then + changed[unicode]=replacement + end + if trace_alternatives then + report_alternate(feature,sequence,descriptions,unicode,replacement,value,defaultalt) + end + else + if trace_alternatives then + report_alternate(feature,sequence,descriptions,unicode,replacement,value,"unknown") end end end @@ -20284,7 +21017,8 @@ local function preparepositionings(tfmdata,feature,value,validlookups,lookuplist if kind=="gpos_pair" then for i=1,#steps do local step=steps[i] - if step.format=="kern" then + local format=step.format + if format=="kern" or format=="move" then for unicode,data in next,steps[i].coverage do local character=characters[unicode] local kerns=character.kerns @@ -20312,9 +21046,11 @@ local function preparepositionings(tfmdata,feature,value,validlookups,lookuplist local character=characters[unicode] local kerns=character.kerns for otherunicode,kern in next,data do - if not kern[2] and not (kerns and kerns[otherunicode]) then + local other=kern[2] + if other==true or (not other and not (kerns and kerns[otherunicode])) then local kern=kern[1] - if kern[1]~=0 or kern[2]~=0 or kern[4]~=0 then + if kern==true then + elseif kern[1]~=0 or kern[2]~=0 or kern[4]~=0 then else kern=kern[3] if kern~=0 then @@ -20339,6 +21075,51 @@ local function preparepositionings(tfmdata,feature,value,validlookups,lookuplist end local function initializehashes(tfmdata) end +local function checkmathreplacements(tfmdata,fullname,fixitalics) + if tfmdata.mathparameters then + local characters=tfmdata.characters + local changed=tfmdata.changed + if next(changed) then + if trace_preparing or trace_baseinit then + report_prepare("checking math replacements for %a",fullname) + end + for unicode,replacement in next,changed do + local u=characters[unicode] + local r=characters[replacement] + local n=u.next + local v=u.vert_variants + local h=u.horiz_variants + if fixitalics then + local ui=u.italic + if ui and not r.italic then + if trace_preparing then + report_prepare("using %i units of italic correction from %C for %U",ui,unicode,replacement) + end + r.italic=ui + end + end + if n and not r.next then + if trace_preparing then + report_prepare("forcing %s for %C substituted by %U","incremental step",unicode,replacement) + end + r.next=n + end + if v and not r.vert_variants then + if trace_preparing then + report_prepare("forcing %s for %C substituted by %U","vertical variants",unicode,replacement) + end + r.vert_variants=v + end + if h and not r.horiz_variants then + if trace_preparing then + report_prepare("forcing %s for %C substituted by %U","horizontal variants",unicode,replacement) + end + r.horiz_variants=h + end + end + end + end +end local function featuresinitializer(tfmdata,value) if true then local starttime=trace_preparing and os.clock() @@ -20355,6 +21136,8 @@ local function featuresinitializer(tfmdata,value) local rawfeatures=rawresources and rawresources.features local basesubstitutions=rawfeatures and rawfeatures.gsub local basepositionings=rawfeatures and rawfeatures.gpos + local substitutionsdone=false + local positioningsdone=false if basesubstitutions or basepositionings then local sequences=tfmdata.resources.sequences for s=1,#sequences do @@ -20375,12 +21158,14 @@ local function featuresinitializer(tfmdata,value) end preparesubstitutions(tfmdata,feature,value,validlookups,lookuplist) registerbasefeature(feature,value) + substitutionsdone=true elseif basepositionings and basepositionings[feature] then if trace_preparing then report_prepare("filtering base %a feature %a for %a with value %a","pos",feature,fullname,value) end preparepositionings(tfmdata,feature,value,validlookups,lookuplist) registerbasefeature(feature,value) + positioningsdone=true end end end @@ -20388,6 +21173,9 @@ local function featuresinitializer(tfmdata,value) end end end + if substitutionsdone then + checkmathreplacements(tfmdata,fullname,features.fixitalics) + end registerbasehash(tfmdata) end if trace_preparing then @@ -20430,6 +21218,7 @@ local attributes,nodes,node=attributes,nodes,node fonts=fonts local hashes=fonts.hashes local fontdata=hashes.identifiers +local fontmarks=hashes.marks nodes.injections=nodes.injections or {} local injections=nodes.injections local tracers=nodes.tracers @@ -20442,10 +21231,8 @@ local kern_code=nodecodes.kern local glue_code=nodecodes.glue local nuts=nodes.nuts local nodepool=nuts.pool -local newkern=nodepool.kern local tonode=nuts.tonode local tonut=nuts.tonut -local getfield=nuts.getfield local setfield=nuts.setfield local getnext=nuts.getnext local getprev=nuts.getprev @@ -20468,11 +21255,36 @@ local traverse_char=nuts.traverse_char local insert_node_before=nuts.insert_before local insert_node_after=nuts.insert_after local properties=nodes.properties.data -function injections.installnewkern(nk) - newkern=nk or newkern -end +local fontkern=nuts.pool and nuts.pool.fontkern +local italickern=nuts.pool and nuts.pool.italickern +local useitalickerns=false +directives.register("fonts.injections.useitalics",function(v) + if v then + report_injections("using italics for space kerns (tracing only)") + end + useitalickerns=v +end) +do if not fontkern then + local thekern=nuts.new("kern",0) + local setkern=nuts.setkern + local copy_node=nuts.copy_node + fontkern=function(k) + local n=copy_node(thekern) + setkern(n,k) + return n + end + local thekern=nuts.new("kern",3) + local setkern=nuts.setkern + local copy_node=nuts.copy_node + italickern=function(k) + local n=copy_node(thekern) + setkern(n,k) + return n + end +end end +function injections.installnewkern() end local nofregisteredkerns=0 -local nofregisteredpairs=0 +local nofregisteredpositions=0 local nofregisteredmarks=0 local nofregisteredcursives=0 local keepregisteredcounts=false @@ -20481,7 +21293,7 @@ function injections.keepcounts() end function injections.resetcounts() nofregisteredkerns=0 - nofregisteredpairs=0 + nofregisteredpositions=0 nofregisteredmarks=0 nofregisteredcursives=0 keepregisteredcounts=false @@ -20522,7 +21334,7 @@ function injections.copy(target,source) end end end -function injections.setligaindex(n,index) +function injections.setligaindex(n,index) local p=rawget(properties,n) if p then local i=p.injections @@ -20551,7 +21363,7 @@ function injections.getligaindex(n,default) end return default end -function injections.setcursive(start,nxt,factor,rlmode,exit,entry,tfmstart,tfmnext) +function injections.setcursive(start,nxt,factor,rlmode,exit,entry,tfmstart,tfmnext,r2lflag) local dx=factor*(exit[1]-entry[1]) local dy=-factor*(exit[2]-entry[2]) local ws=tfmstart.width @@ -20604,7 +21416,7 @@ function injections.setcursive(start,nxt,factor,rlmode,exit,entry,tfmstart,tfmne end return dx,dy,nofregisteredcursives end -function injections.setpair(current,factor,rlmode,r2lflag,spec,injection) +function injections.setposition(kind,current,factor,rlmode,spec,injection) local x=factor*spec[1] local y=factor*spec[2] local w=factor*spec[3] @@ -20614,7 +21426,7 @@ function injections.setpair(current,factor,rlmode,r2lflag,spec,injection) local leftkern=x local rightkern=w-x if leftkern~=0 or rightkern~=0 or yoffset~=0 then - nofregisteredpairs=nofregisteredpairs+1 + nofregisteredpositions=nofregisteredpositions+1 if rlmode and rlmode<0 then leftkern,rightkern=rightkern,leftkern end @@ -20623,7 +21435,7 @@ function injections.setpair(current,factor,rlmode,r2lflag,spec,injection) end local p=rawget(properties,current) if p then - local i=rawget(p,injection) + local i=p[injection] if i then if leftkern~=0 then i.leftkern=(i.leftkern or 0)+leftkern @@ -20660,7 +21472,7 @@ function injections.setpair(current,factor,rlmode,r2lflag,spec,injection) }, } end - return x,y,w,h,nofregisteredpairs + return x,y,w,h,nofregisteredpositions end end return x,y,w,h @@ -20674,7 +21486,7 @@ function injections.setkern(current,factor,rlmode,x,injection) injection="injections" end if p then - local i=rawget(p,injection) + local i=p[injection] if i then i.leftkern=dx+(i.leftkern or 0) else @@ -20694,6 +21506,54 @@ function injections.setkern(current,factor,rlmode,x,injection) return 0,0 end end +function injections.setmove(current,factor,rlmode,x,injection) + local dx=factor*x + if dx~=0 then + nofregisteredkerns=nofregisteredkerns+1 + local p=rawget(properties,current) + if not injection then + injection="injections" + end + if rlmode and rlmode<0 then + if p then + local i=p[injection] + if i then + i.rightkern=dx+(i.rightkern or 0) + else + p[injection]={ + rightkern=dx, + } + end + else + properties[current]={ + [injection]={ + rightkern=dx, + }, + } + end + else + if p then + local i=p[injection] + if i then + i.leftkern=dx+(i.leftkern or 0) + else + p[injection]={ + leftkern=dx, + } + end + else + properties[current]={ + [injection]={ + leftkern=dx, + }, + } + end + end + return dx,nofregisteredkerns + else + return 0,0 + end +end function injections.setmark(start,base,factor,rlmode,ba,ma,tfmbase,mkmk,checkmark) local dx,dy=factor*(ba[1]-ma[1]),factor*(ba[2]-ma[2]) nofregisteredmarks=nofregisteredmarks+1 @@ -20706,9 +21566,15 @@ function injections.setmark(start,base,factor,rlmode,ba,ma,tfmbase,mkmk,checkmar if i then if i.markmark then else - i.markx=dx - i.marky=dy - i.markdir=rlmode or 0 + if dx~=0 then + i.markx=dx + end + if y~=0 then + i.marky=dy + end + if rlmode then + i.markdir=rlmode + end i.markbase=nofregisteredmarks i.markbasenode=base i.markmark=mkmk @@ -20751,7 +21617,7 @@ local function show(n,what,nested,symbol) if n then local p=rawget(properties,n) if p then - local i=rawget(p,what) + local i=p[what] if i then local leftkern=i.leftkern or 0 local rightkern=i.rightkern or 0 @@ -20791,15 +21657,16 @@ local function show(n,what,nested,symbol) end local function showsub(n,what,where) report_injections("begin subrun: %s",where) - for n in traverse_id(glyph_code,n) do + for n in traverse_char(n) do showchar(n,where) show(n,what,where," ") end report_injections("end subrun") end local function trace(head,where) - report_injections("begin run %s: %s kerns, %s pairs, %s marks and %s cursives registered", - where or "",nofregisteredkerns,nofregisteredpairs,nofregisteredmarks,nofregisteredcursives) + report_injections() + report_injections("begin run %s: %s kerns, %s positions, %s marks and %s cursives registered", + where or "",nofregisteredkerns,nofregisteredpositions,nofregisteredmarks,nofregisteredcursives) local n=head while n do local id=getid(n) @@ -20846,6 +21713,7 @@ local function show_result(head) end current=getnext(current) end + report_injections() end local function inject_kerns_only(head,where) head=tonut(head) @@ -20856,7 +21724,6 @@ local function inject_kerns_only(head,where) local prev=nil local next=nil local prevdisc=nil - local prevglyph=nil local pre=nil local post=nil local replace=nil @@ -20873,7 +21740,7 @@ local function inject_kerns_only(head,where) if i then local leftkern=i.leftkern if leftkern and leftkern~=0 then - head=insert_node_before(head,current,newkern(leftkern)) + head=insert_node_before(head,current,fontkern(leftkern)) end end if prevdisc then @@ -20883,7 +21750,7 @@ local function inject_kerns_only(head,where) if i then local leftkern=i.leftkern if leftkern and leftkern~=0 then - setlink(posttail,newkern(leftkern)) + setlink(posttail,fontkern(leftkern)) done=true end end @@ -20893,7 +21760,7 @@ local function inject_kerns_only(head,where) if i then local leftkern=i.leftkern if leftkern and leftkern~=0 then - setlink(replacetail,newkern(leftkern)) + setlink(replacetail,fontkern(leftkern)) done=true end end @@ -20902,7 +21769,7 @@ local function inject_kerns_only(head,where) if i then local leftkern=i.leftkern if leftkern and leftkern~=0 then - setfield(prev,"replace",newkern(leftkern)) + setfield(prev,"replace",fontkern(leftkern)) end end end @@ -20912,10 +21779,8 @@ local function inject_kerns_only(head,where) end end prevdisc=nil - prevglyph=current elseif char==false then prevdisc=nil - prevglyph=current elseif id==disc_code then pre,post,replace,pretail,posttail,replacetail=getdisc(current,true) local done=false @@ -20927,7 +21792,7 @@ local function inject_kerns_only(head,where) if i then local leftkern=i.leftkern if leftkern and leftkern~=0 then - pre=insert_node_before(pre,n,newkern(leftkern)) + pre=insert_node_before(pre,n,fontkern(leftkern)) done=true end end @@ -20942,7 +21807,7 @@ local function inject_kerns_only(head,where) if i then local leftkern=i.leftkern if leftkern and leftkern~=0 then - post=insert_node_before(post,n,newkern(leftkern)) + post=insert_node_before(post,n,fontkern(leftkern)) done=true end end @@ -20957,7 +21822,7 @@ local function inject_kerns_only(head,where) if i then local leftkern=i.leftkern if leftkern and leftkern~=0 then - replace=insert_node_before(replace,n,newkern(leftkern)) + replace=insert_node_before(replace,n,fontkern(leftkern)) done=true end end @@ -20967,10 +21832,8 @@ local function inject_kerns_only(head,where) if done then setdisc(current,pre,post,replace) end - prevglyph=nil prevdisc=current else - prevglyph=nil prevdisc=nil end prev=current @@ -20981,12 +21844,15 @@ local function inject_kerns_only(head,where) else nofregisteredkerns=0 end + if trace_injections then + show_result(head) + end return tonode(head),true end -local function inject_pairs_only(head,where) +local function inject_positions_only(head,where) head=tonut(head) if trace_injections then - trace(head,"pairs") + trace(head,"positions") end local current=head local prev=nil @@ -21012,12 +21878,17 @@ local function inject_pairs_only(head,where) setoffsets(current,false,yoffset) end local leftkern=i.leftkern + local rightkern=i.rightkern if leftkern and leftkern~=0 then - head=insert_node_before(head,current,newkern(leftkern)) + if rightkern and leftkern==-rightkern then + setoffsets(current,leftkern,false) + rightkern=0 + else + head=insert_node_before(head,current,fontkern(leftkern)) + end end - local rightkern=i.rightkern if rightkern and rightkern~=0 then - insert_node_after(head,current,newkern(rightkern)) + insert_node_after(head,current,fontkern(rightkern)) end else local i=p.emptyinjections @@ -21027,7 +21898,7 @@ local function inject_pairs_only(head,where) if next and getid(next)==disc_code then if replace then else - setfield(next,"replace",newkern(rightkern)) + setfield(next,"replace",fontkern(rightkern)) end end end @@ -21040,7 +21911,7 @@ local function inject_pairs_only(head,where) if i then local leftkern=i.leftkern if leftkern and leftkern~=0 then - setlink(posttail,newkern(leftkern)) + setlink(posttail,fontkern(leftkern)) done=true end end @@ -21050,7 +21921,7 @@ local function inject_pairs_only(head,where) if i then local leftkern=i.leftkern if leftkern and leftkern~=0 then - setlink(replacetail,newkern(leftkern)) + setlink(replacetail,fontkern(leftkern)) done=true end end @@ -21059,7 +21930,7 @@ local function inject_pairs_only(head,where) if i then local leftkern=i.leftkern if leftkern and leftkern~=0 then - setfield(prev,"replace",newkern(leftkern)) + setfield(prev,"replace",fontkern(leftkern)) end end end @@ -21088,12 +21959,12 @@ local function inject_pairs_only(head,where) end local leftkern=i.leftkern if leftkern and leftkern~=0 then - pre=insert_node_before(pre,n,newkern(leftkern)) + pre=insert_node_before(pre,n,fontkern(leftkern)) done=true end local rightkern=i.rightkern if rightkern and rightkern~=0 then - insert_node_after(pre,n,newkern(rightkern)) + insert_node_after(pre,n,fontkern(rightkern)) done=true end end @@ -21112,12 +21983,12 @@ local function inject_pairs_only(head,where) end local leftkern=i.leftkern if leftkern and leftkern~=0 then - post=insert_node_before(post,n,newkern(leftkern)) + post=insert_node_before(post,n,fontkern(leftkern)) done=true end local rightkern=i.rightkern if rightkern and rightkern~=0 then - insert_node_after(post,n,newkern(rightkern)) + insert_node_after(post,n,fontkern(rightkern)) done=true end end @@ -21136,12 +22007,12 @@ local function inject_pairs_only(head,where) end local leftkern=i.leftkern if leftkern and leftkern~=0 then - replace=insert_node_before(replace,n,newkern(leftkern)) + replace=insert_node_before(replace,n,fontkern(leftkern)) done=true end local rightkern=i.rightkern if rightkern and rightkern~=0 then - insert_node_after(replace,n,newkern(rightkern)) + insert_node_after(replace,n,fontkern(rightkern)) done=true end end @@ -21156,7 +22027,7 @@ local function inject_pairs_only(head,where) if i then local rightkern=i.rightkern if rightkern and rightkern~=0 then - pre=insert_node_before(pre,pre,newkern(rightkern)) + pre=insert_node_before(pre,pre,fontkern(rightkern)) done=true end end @@ -21169,7 +22040,7 @@ local function inject_pairs_only(head,where) if i then local rightkern=i.rightkern if rightkern and rightkern~=0 then - replace=insert_node_before(replace,replace,newkern(rightkern)) + replace=insert_node_before(replace,replace,fontkern(rightkern)) done=true end end @@ -21191,16 +22062,17 @@ local function inject_pairs_only(head,where) if keepregisteredcounts then keepregisteredcounts=false else - nofregisteredkerns=0 + nofregisteredpositions=0 + end + if trace_injections then + show_result(head) end return tonode(head),true end local function showoffset(n,flag) local x,y=getoffsets(n) if x~=0 or y~=0 then - setcolor(n,flag and "darkred" or "darkgreen") - else - resetcolor(n) + setcolor(n,"darkgray") end end local function inject_everything(head,where) @@ -21212,8 +22084,6 @@ local function inject_everything(head,where) local hasmarks=nofregisteredmarks>0 local current=head local last=nil - local font=font - local markdata=nil local prev=nil local next=nil local prevdisc=nil @@ -21242,23 +22112,31 @@ local function inject_everything(head,where) rightkern=pp.rightkern end end + local markdir=pn.markdir if rightkern then - if pn.markdir<0 then - ox=px-pn.markx-rightkern + ox=px-(pn.markx or 0)-rightkern + if markdir and markdir<0 then + if not pn.markmark then + ox=ox+(pn.leftkern or 0) + end else if false then local leftkern=pp.leftkern if leftkern then - ox=px-pn.markx-leftkern - else - ox=px-pn.markx + ox=ox-leftkern end - else - ox=px-pn.markx-rightkern end end else - ox=px-pn.markx + ox=px-(pn.markx or 0) + if markdir and markdir<0 then + if not pn.markmark then + local leftkern=pn.leftkern + if leftkern then + ox=ox+leftkern + end + end + end if pn.checkmark then local wn=getwidth(n) if wn and wn~=0 then @@ -21266,26 +22144,81 @@ local function inject_everything(head,where) if trace_injections then report_injections("correcting non zero width mark %C",getchar(n)) end - insert_node_before(n,n,newkern(-wn)) - insert_node_after(n,n,newkern(-wn)) + insert_node_before(n,n,fontkern(-wn)) + insert_node_after(n,n,fontkern(-wn)) end end end - local oy=ny+py+pn.marky + local oy=ny+py+(pn.marky or 0) + if not pn.markmark then + local yoffset=pn.yoffset + if yoffset then + oy=oy+yoffset + end + end setoffsets(n,ox,oy) if trace_marks then showoffset(n,true) end end + local base=nil while current do local next=getnext(current) local char,id=ischar(current) if char then local p=rawget(properties,current) + if hascursives then + if not p then + local m=fontmarks[getfont(current)] + if m and m[char] then + if base then + p={ injections={ markbasenode=base } } + nofmarks=nofmarks+1 + marks[nofmarks]=current + properties[current]=p + hasmarks=true + end + else + base=current + end + end + end if p then local i=p.injections + if hascursives then + if not i then + local m=fontmarks[getfont(current)] + if m and m[char] then + if base then + i={ markbasenode=base } + nofmarks=nofmarks+1 + marks[nofmarks]=current + p.injections=i + hasmarks=true + end + else + base=current + end + end + end if i then local pm=i.markbasenode + if hascursives then + if not pm then + local m=fontmarks[getfont(current)] + if m and m[char] then + if base then + pm=base + i.markbasenode=pm + hasmarks=true + end + else + base=current + end + else + base=current + end + end if pm then nofmarks=nofmarks+1 marks[nofmarks]=current @@ -21346,12 +22279,17 @@ local function inject_everything(head,where) end end local leftkern=i.leftkern + local rightkern=i.rightkern if leftkern and leftkern~=0 then - head=insert_node_before(head,current,newkern(leftkern)) + if rightkern and leftkern==-rightkern then + setoffsets(current,leftkern,false) + rightkern=0 + else + head=insert_node_before(head,current,fontkern(leftkern)) + end end - local rightkern=i.rightkern if rightkern and rightkern~=0 then - insert_node_after(head,current,newkern(rightkern)) + insert_node_after(head,current,fontkern(rightkern)) end end else @@ -21362,7 +22300,7 @@ local function inject_everything(head,where) if next and getid(next)==disc_code then if replace then else - setfield(next,"replace",newkern(rightkern)) + setfield(next,"replace",fontkern(rightkern)) end end end @@ -21376,7 +22314,7 @@ local function inject_everything(head,where) if i then local leftkern=i.leftkern if leftkern and leftkern~=0 then - setlink(posttail,newkern(leftkern)) + setlink(posttail,fontkern(leftkern)) done=true end end @@ -21386,7 +22324,7 @@ local function inject_everything(head,where) if i then local leftkern=i.leftkern if leftkern and leftkern~=0 then - setlink(replacetail,newkern(leftkern)) + setlink(replacetail,fontkern(leftkern)) done=true end end @@ -21395,7 +22333,7 @@ local function inject_everything(head,where) if i then local leftkern=i.leftkern if leftkern and leftkern~=0 then - setfield(prev,"replace",newkern(leftkern)) + setfield(prev,"replace",fontkern(leftkern)) end end end @@ -21437,12 +22375,12 @@ local function inject_everything(head,where) end local leftkern=i.leftkern if leftkern and leftkern~=0 then - pre=insert_node_before(pre,n,newkern(leftkern)) + pre=insert_node_before(pre,n,fontkern(leftkern)) done=true end local rightkern=i.rightkern if rightkern and rightkern~=0 then - insert_node_after(pre,n,newkern(rightkern)) + insert_node_after(pre,n,fontkern(rightkern)) done=true end if hasmarks then @@ -21467,12 +22405,12 @@ local function inject_everything(head,where) end local leftkern=i.leftkern if leftkern and leftkern~=0 then - post=insert_node_before(post,n,newkern(leftkern)) + post=insert_node_before(post,n,fontkern(leftkern)) done=true end local rightkern=i.rightkern if rightkern and rightkern~=0 then - insert_node_after(post,n,newkern(rightkern)) + insert_node_after(post,n,fontkern(rightkern)) done=true end if hasmarks then @@ -21497,12 +22435,12 @@ local function inject_everything(head,where) end local leftkern=i.leftkern if leftkern and leftkern~=0 then - replace=insert_node_before(replace,n,newkern(leftkern)) + replace=insert_node_before(replace,n,fontkern(leftkern)) done=true end local rightkern=i.rightkern if rightkern and rightkern~=0 then - insert_node_after(replace,n,newkern(rightkern)) + insert_node_after(replace,n,fontkern(rightkern)) done=true end if hasmarks then @@ -21523,7 +22461,7 @@ local function inject_everything(head,where) if i then local rightkern=i.rightkern if rightkern and rightkern~=0 then - pre=insert_node_before(pre,pre,newkern(rightkern)) + pre=insert_node_before(pre,pre,fontkern(rightkern)) done=true end end @@ -21536,7 +22474,7 @@ local function inject_everything(head,where) if i then local rightkern=i.rightkern if rightkern and rightkern~=0 then - replace=insert_node_before(replace,replace,newkern(rightkern)) + replace=insert_node_before(replace,replace,fontkern(rightkern)) done=true end end @@ -21551,6 +22489,7 @@ local function inject_everything(head,where) else prevglyph=nil prevdisc=nil +base=nil end prev=current current=next @@ -21580,10 +22519,13 @@ local function inject_everything(head,where) keepregisteredcounts=false else nofregisteredkerns=0 - nofregisteredpairs=0 + nofregisteredpositions=0 nofregisteredmarks=0 nofregisteredcursives=0 end + if trace_injections then + show_result(head) + end return tonode(head),true end local triggers=false @@ -21641,6 +22583,7 @@ local function injectspaces(head) local threshold=0 local leftkern=false local rightkern=false + local nuthead=tonut(head) local function updatefont(font,trig) leftkerns=trig.left rightkerns=trig.right @@ -21648,7 +22591,7 @@ local function injectspaces(head) threshold, factor=getthreshold(font) end - for n in traverse_id(glue_code,tonut(head)) do + for n in traverse_id(glue_code,nuthead) do local prev,next=getspaceboth(n) local prevchar=prev and ischar(prev) local nextchar=next and ischar(next) @@ -21680,29 +22623,59 @@ local function injectspaces(head) local old=getwidth(n) if old>threshold then if rightkern then - local new=old+(leftkern+rightkern)*factor - if trace_spaces then - report_spaces("%C [%p -> %p] %C",prevchar,old,new,nextchar) + if useitalickerns then + local lnew=leftkern*factor + local rnew=rightkern*factor + if trace_spaces then + report_spaces("%C [%p + %p + %p] %C",prevchar,lnew,old,rnew,nextchar) + end + local h=insert_node_before(nuthead,n,italickern(lnew)) + if h==nuthead then + head=tonode(h) + nuthead=h + end + insert_node_after(nuthead,n,italickern(rnew)) + else + local new=old+(leftkern+rightkern)*factor + if trace_spaces then + report_spaces("%C [%p -> %p] %C",prevchar,old,new,nextchar) + end + setwidth(n,new) end - setwidth(n,new) - leftkern=false + rightkern=false else - local new=old+leftkern*factor - if trace_spaces then - report_spaces("%C [%p -> %p]",prevchar,old,new) + if useitalickerns then + local new=leftkern*factor + if trace_spaces then + report_spaces("%C [%p + %p]",prevchar,old,new) + end + insert_node_after(nuthead,n,italickern(new)) + else + local new=old+leftkern*factor + if trace_spaces then + report_spaces("%C [%p -> %p]",prevchar,old,new) + end + setwidth(n,new) end - setwidth(n,new) end end leftkern=false elseif rightkern then local old=getwidth(n) if old>threshold then - local new=old+rightkern*factor - if trace_spaces then - report_spaces("[%p -> %p] %C",nextchar,old,new) + if useitalickerns then + local new=rightkern*factor + if trace_spaces then + report_spaces("%C [%p + %p]",nextchar,old,new) + end + insert_node_after(nuthead,n,italickern(new)) + else + local new=old+rightkern*factor + if trace_spaces then + report_spaces("[%p -> %p] %C",nextchar,old,new) + end + setwidth(n,new) end - setwidth(n,new) end rightkern=false end @@ -21719,11 +22692,11 @@ function injections.handler(head,where) report_injections("injection variant %a","everything") end return inject_everything(head,where) - elseif nofregisteredpairs>0 then + elseif nofregisteredpositions>0 then if trace_injections then - report_injections("injection variant %a","pairs") + report_injections("injection variant %a","positions") end - return inject_pairs_only(head,where) + return inject_positions_only(head,where) elseif nofregisteredkerns>0 then if trace_injections then report_injections("injection variant %a","kerns") @@ -21740,7 +22713,7 @@ do -- begin closure to overcome local limits and interference if not modules then modules={} end modules ['font-ota']={ version=1.001, - comment="companion to font-otf.lua (analysing)", + comment="companion to font-ini.mkiv", author="Hans Hagen, PRAGMA-ADE, Hasselt NL", copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" @@ -21783,7 +22756,7 @@ local s_fina=3 local s_pref=9 local s_isol=4 local s_blwf=10 local s_mark=5 local s_pstf=11 local s_rest=6 -local states={ +local states=allocate { init=s_init, medi=s_medi, med2=s_medi, @@ -21799,7 +22772,7 @@ local states={ blwf=s_blwf, pstf=s_pstf, } -local features={ +local features=allocate { init=s_init, medi=s_medi, med2=s_medi, @@ -21931,7 +22904,7 @@ local function warning(current,what) arab_warned[char]=true end end -local mappers={ +local mappers=allocate { l=s_init, d=s_medi, c=s_medi, @@ -22151,29 +23124,34 @@ local trace_bugs=false registertracker("otf.bugs",function(v) trace_bugs=v end) local trace_details=false registertracker("otf.details",function(v) trace_details=v end) local trace_steps=false registertracker("otf.steps",function(v) trace_steps=v end) local trace_skips=false registertracker("otf.skips",function(v) trace_skips=v end) -local trace_directions=false registertracker("otf.directions",function(v) trace_directions=v end) local trace_plugins=false registertracker("otf.plugins",function(v) trace_plugins=v end) +local trace_chains=false registertracker("otf.chains",function(v) trace_chains=v end) local trace_kernruns=false registertracker("otf.kernruns",function(v) trace_kernruns=v end) -local trace_discruns=false registertracker("otf.discruns",function(v) trace_discruns=v end) local trace_compruns=false registertracker("otf.compruns",function(v) trace_compruns=v end) local trace_testruns=false registertracker("otf.testruns",function(v) trace_testruns=v end) -local optimizekerns=true +local forcediscretionaries=false +local forcepairadvance=false +directives.register("otf.forcediscretionaries",function(v) + forcediscretionaries=v +end) +directives.register("otf.forcepairadvance",function(v) + forcepairadvance=v +end) local report_direct=logs.reporter("fonts","otf direct") local report_subchain=logs.reporter("fonts","otf subchain") local report_chain=logs.reporter("fonts","otf chain") local report_process=logs.reporter("fonts","otf process") local report_warning=logs.reporter("fonts","otf warning") local report_run=logs.reporter("fonts","otf run") -registertracker("otf.replacements","otf.singles,otf.multiples,otf.alternatives,otf.ligatures") -registertracker("otf.positions","otf.marks,otf.kerns,otf.cursive") -registertracker("otf.actions","otf.replacements,otf.positions") -registertracker("otf.injections","nodes.injections") -registertracker("otf.sample","otf.steps,otf.actions,otf.analyzing") +registertracker("otf.substitutions","otf.singles","otf.multiples","otf.alternatives","otf.ligatures") +registertracker("otf.positions","otf.marks","otf.kerns","otf.cursive") +registertracker("otf.actions","otf.substitutions","otf.positions") +registertracker("otf.sample","otf.steps","otf.substitutions","otf.positions","otf.analyzing") +registertracker("otf.sample.silent","otf.steps=silent","otf.substitutions","otf.positions","otf.analyzing") local nuts=nodes.nuts local tonode=nuts.tonode local tonut=nuts.tonut local getfield=nuts.getfield -local setfield=nuts.setfield local getnext=nuts.getnext local setnext=nuts.setnext local getprev=nuts.getprev @@ -22198,20 +23176,22 @@ local setcomponents=nuts.setcomponents local getdir=nuts.getdir local getwidth=nuts.getwidth local ischar=nuts.is_char +local usesfont=nuts.uses_font local insert_node_after=nuts.insert_after local copy_node=nuts.copy local copy_node_list=nuts.copy_list +local remove_node=nuts.remove local find_node_tail=nuts.tail local flush_node_list=nuts.flush_list local flush_node=nuts.flush_node local end_of_math=nuts.end_of_math local traverse_nodes=nuts.traverse -local traverse_id=nuts.traverse_id local set_components=nuts.set_components local take_components=nuts.take_components local count_components=nuts.count_components local copy_no_components=nuts.copy_no_components local copy_only_glyphs=nuts.copy_only_glyphs +local setmetatable=setmetatable local setmetatableindex=table.setmetatableindex local nodecodes=nodes.nodecodes local glyphcodes=nodes.glyphcodes @@ -22230,7 +23210,8 @@ local injections=nodes.injections local setmark=injections.setmark local setcursive=injections.setcursive local setkern=injections.setkern -local setpair=injections.setpair +local setmove=injections.setmove +local setposition=injections.setposition local resetinjection=injections.reset local copyinjection=injections.copy local setligaindex=injections.setligaindex @@ -22251,80 +23232,86 @@ local currentfont=false local factor=0 local threshold=0 local checkmarks=false +local discs=false +local spaces=false local sweepnode=nil -local sweepprev=nil -local sweepnext=nil -local sweephead={} -local notmatchpre={} -local notmatchpost={} -local notmatchreplace={} +local sweephead={} +local notmatchpre={} +local notmatchpost={} +local notmatchreplace={} local handlers={} local isspace=injections.isspace local getthreshold=injections.getthreshold local checkstep=(tracers and tracers.steppers.check) or function() end local registerstep=(tracers and tracers.steppers.register) or function() end local registermessage=(tracers and tracers.steppers.message) or function() end -local function checkdisccontent(d) - local pre,post,replace=getdisc(d) - if pre then for n in traverse_id(glue_code,pre) do print("pre",nodes.idstostring(pre)) break end end - if post then for n in traverse_id(glue_code,post) do print("pos",nodes.idstostring(post)) break end end - if replace then for n in traverse_id(glue_code,replace) do print("rep",nodes.idstostring(replace)) break end end -end local function logprocess(...) if trace_steps then registermessage(...) + if trace_steps=="silent" then + return + end end report_direct(...) end local function logwarning(...) report_direct(...) end -local f_unicode=formatters["%U"] -local f_uniname=formatters["%U (%s)"] -local f_unilist=formatters["% t (% t)"] -local function gref(n) - if type(n)=="number" then - local description=descriptions[n] - local name=description and description.name - if name then - return f_uniname(n,name) - else - return f_unicode(n) - end - elseif n then - local num,nam={},{} - for i=1,#n do - local ni=n[i] - if tonumber(ni) then - local di=descriptions[ni] - num[i]=f_unicode(ni) - nam[i]=di and di.name or "-" +local gref do + local f_unicode=formatters["U+%X"] + local f_uniname=formatters["U+%X (%s)"] + local f_unilist=formatters["% t"] + gref=function(n) + if type(n)=="number" then + local description=descriptions[n] + local name=description and description.name + if name then + return f_uniname(n,name) + else + return f_unicode(n) end + elseif n then + local t={} + for i=1,#n do + local ni=n[i] + if tonumber(ni) then + local di=descriptions[ni] + local nn=di and di.name + if nn then + t[#t+1]=f_uniname(ni,nn) + else + t[#t+1]=f_unicode(ni) + end + end + end + return f_unilist(t) + else + return "<error in node mode tracing>" end - return f_unilist(num,nam) - else - return "<error in node mode tracing>" end end local function cref(dataset,sequence,index) if not dataset then return "no valid dataset" - elseif index then - return formatters["feature %a, type %a, chain lookup %a, index %a"](dataset[4],sequence.type,sequence.name,index) + end + local merged=sequence.merged and "merged " or "" + if index then + return formatters["feature %a, type %a, %schain lookup %a, index %a"]( + dataset[4],sequence.type,merged,sequence.name,index) else - return formatters["feature %a, type %a, chain lookup %a"](dataset[4],sequence.type,sequence.name) + return formatters["feature %a, type %a, %schain lookup %a"]( + dataset[4],sequence.type,merged,sequence.name) end end local function pref(dataset,sequence) - return formatters["feature %a, type %a, lookup %a"](dataset[4],sequence.type,sequence.name) + return formatters["feature %a, type %a, %slookup %a"]( + dataset[4],sequence.type,sequence.merged and "merged " or "",sequence.name) end local function mref(rlmode) - if not rlmode or rlmode==0 then - return "---" - elseif rlmode==-1 or rlmode=="+TRT" then - return "r2l" - else + if not rlmode or rlmode>=0 then return "l2r" + else + return "r2l" end end local function flattendisk(head,disc) @@ -22348,7 +23335,6 @@ local function flattendisk(head,disc) elseif next then return next,next else - return end else if replace then @@ -22418,7 +23404,7 @@ local function markstoligature(head,start,stop,char) return head,base end end -local function toligature(head,start,stop,char,dataset,sequence,markflag,discfound) +local function toligature(head,start,stop,char,dataset,sequence,skiphash,discfound,hasmarks) if getattr(start,a_noligature)==1 then return head,start end @@ -22442,7 +23428,7 @@ local function toligature(head,start,stop,char,dataset,sequence,markflag,discfou set_components(base,comp) setlink(prev,base,next) if not discfound then - local deletemarks=markflag~="mark" + local deletemarks=not skiphash or hasmarks local components=start local baseindex=0 local componentindex=0 @@ -22453,13 +23439,13 @@ local function toligature(head,start,stop,char,dataset,sequence,markflag,discfou if not marks[char] then baseindex=baseindex+componentindex componentindex=count_components(start,marks) - elseif not deletemarks then + elseif not deletemarks then setligaindex(start,baseindex+getligaindex(start,componentindex)) if trace_marks then logwarning("%s: keep mark %s, gets index %s",pref(dataset,sequence),gref(char),getligaindex(start)) end local n=copy_node(start) - copyinjection(n,start) + copyinjection(n,start) head,current=insert_node_after(head,current,n) elseif trace_marks then logwarning("%s: delete mark %s",pref(dataset,sequence),gref(char)) @@ -22508,14 +23494,18 @@ local function toligature(head,start,stop,char,dataset,sequence,markflag,discfou setboth(base) set_components(base,copied) replace=base - setdisc(discfound,pre,post,replace) + if forcediscretionaries then + setdisc(discfound,pre,post,replace,discretionary_code) + else + setdisc(discfound,pre,post,replace) + end base=prev end end end return head,base end -local function multiple_glyphs(head,start,multiple,ignoremarks,what) +local function multiple_glyphs(head,start,multiple,skiphash,what) local nofmultiples=#multiple if nofmultiples>0 then resetinjection(start) @@ -22608,20 +23598,20 @@ function handlers.gsub_alternate(head,start,dataset,sequence,alternative) end return head,start,true end -function handlers.gsub_multiple(head,start,dataset,sequence,multiple) +function handlers.gsub_multiple(head,start,dataset,sequence,multiple,rlmode,skiphash) if trace_multiples then logprocess("%s: replacing %s by multiple %s",pref(dataset,sequence),gref(getchar(start)),gref(multiple)) end - return multiple_glyphs(head,start,multiple,sequence.flags[1],dataset[1]) + return multiple_glyphs(head,start,multiple,skiphash,dataset[1]) end -function handlers.gsub_ligature(head,start,dataset,sequence,ligature) +function handlers.gsub_ligature(head,start,dataset,sequence,ligature,rlmode,skiphash) local current=getnext(start) if not current then return head,start,false,nil end local stop=nil local startchar=getchar(start) - if marks[startchar] then + if skiphash and skiphash[startchar] then while current do local char=ischar(current,currentfont) if char then @@ -22651,14 +23641,14 @@ function handlers.gsub_ligature(head,start,dataset,sequence,ligature) else end end - else - local skipmark=sequence.flags[1] + else local discfound=false local lastdisc=nil + local hasmarks=marks[startchar] while current do local char,id=ischar(current,currentfont) if char then - if skipmark and marks[char] then + if skiphash and skiphash[char] then current=getnext(current) else local lg=ligature[char] @@ -22667,6 +23657,9 @@ function handlers.gsub_ligature(head,start,dataset,sequence,ligature) discfound=lastdisc lastdisc=nil end + if marks[char] then + hasmarks=true + end stop=current ligature=lg current=getnext(current) @@ -22677,13 +23670,16 @@ function handlers.gsub_ligature(head,start,dataset,sequence,ligature) elseif char==false then break elseif id==disc_code then - local replace=getfield(current,"replace") + local replace=getfield(current,"replace") if replace then while replace do local char,id=ischar(replace,currentfont) if char then local lg=ligature[char] if lg then + if marks[char] then + hasmarks=true + end ligature=lg replace=getnext(replace) else @@ -22706,10 +23702,10 @@ function handlers.gsub_ligature(head,start,dataset,sequence,ligature) if stop then if trace_ligatures then local stopchar=getchar(stop) - head,start=toligature(head,start,stop,lig,dataset,sequence,skipmark,discfound) + head,start=toligature(head,start,stop,lig,dataset,sequence,skiphash,discfound,hasmarks) logprocess("%s: replacing %s upto %s by ligature %s case 2",pref(dataset,sequence),gref(startchar),gref(stopchar),gref(lig)) else - head,start=toligature(head,start,stop,lig,dataset,sequence,skipmark,discfound) + head,start=toligature(head,start,stop,lig,dataset,sequence,skiphash,discfound,hasmarks) end else resetinjection(start) @@ -22724,22 +23720,23 @@ function handlers.gsub_ligature(head,start,dataset,sequence,ligature) end return head,start,false,discfound end -function handlers.gpos_single(head,start,dataset,sequence,kerns,rlmode,step,i,injection) +function handlers.gpos_single(head,start,dataset,sequence,kerns,rlmode,skiphash,step,injection) local startchar=getchar(start) - if step.format=="pair" then - local dx,dy,w,h=setpair(start,factor,rlmode,sequence.flags[4],kerns,injection) + local format=step.format + if format=="single" or type(kerns)=="table" then + local dx,dy,w,h=setposition(0,start,factor,rlmode,kerns,injection) if trace_kerns then - logprocess("%s: shifting single %s by (%p,%p) and correction (%p,%p)",pref(dataset,sequence),gref(startchar),dx,dy,w,h) + logprocess("%s: shifting single %s by %s xy (%p,%p) and wh (%p,%p)",pref(dataset,sequence),gref(startchar),format,dx,dy,w,h) end else - local k=setkern(start,factor,rlmode,kerns,injection) + local k=(format=="move" and setmove or setkern)(start,factor,rlmode,kerns,injection) if trace_kerns then - logprocess("%s: shifting single %s by %p",pref(dataset,sequence),gref(startchar),k) + logprocess("%s: shifting single %s by %s %p",pref(dataset,sequence),gref(startchar),format,k) end end - return head,start,false + return head,start,true end -function handlers.gpos_pair(head,start,dataset,sequence,kerns,rlmode,step,i,injection) +function handlers.gpos_pair(head,start,dataset,sequence,kerns,rlmode,skiphash,step,injection) local snext=getnext(start) if not snext then return head,start,false @@ -22748,46 +23745,47 @@ function handlers.gpos_pair(head,start,dataset,sequence,kerns,rlmode,step,i,inje while snext do local nextchar=ischar(snext,currentfont) if nextchar then - local krn=kerns[nextchar] - if not krn and marks[nextchar] then + if skiphash and skiphash[nextchar] then prev=snext snext=getnext(snext) - elseif not krn then - break - elseif step.format=="pair" then - local a,b=krn[1],krn[2] - if optimizekerns then - if not b and a[1]==0 and a[2]==0 and a[4]==0 then - local k=setkern(snext,factor,rlmode,a[3],injection) + else + local krn=kerns[nextchar] + if not krn then + break + end + local format=step.format + if format=="pair" then + local a,b=krn[1],krn[2] + if a==true then + elseif a then + local x,y,w,h=setposition(1,start,factor,rlmode,a,injection) if trace_kerns then - logprocess("%s: shifting single %s by %p",pref(dataset,sequence),gref(nextchar),k) + local startchar=getchar(start) + logprocess("%s: shifting first of pair %s and %s by xy (%p,%p) and wh (%p,%p) as %s",pref(dataset,sequence),gref(startchar),gref(nextchar),x,y,w,h,injection or "injections") end - return head,start,true end - end - if a and #a>0 then - local x,y,w,h=setpair(start,factor,rlmode,sequence.flags[4],a,injection) - if trace_kerns then - local startchar=getchar(start) - logprocess("%s: shifting first of pair %s and %s by (%p,%p) and correction (%p,%p) as %s",pref(dataset,sequence),gref(startchar),gref(nextchar),x,y,w,h,injection or "injections") + if b==true then + start=snext + elseif b then + local x,y,w,h=setposition(2,snext,factor,rlmode,b,injection) + if trace_kerns then + local startchar=getchar(snext) + logprocess("%s: shifting second of pair %s and %s by xy (%p,%p) and wh (%p,%p) as %s",pref(dataset,sequence),gref(startchar),gref(nextchar),x,y,w,h,injection or "injections") + end + start=snext + elseif forcepairadvance then + start=snext end - end - if b and #b>0 then - local x,y,w,h=setpair(snext,factor,rlmode,sequence.flags[4],b,injection) + return head,start,true + elseif krn~=0 then + local k=(format=="move" and setmove or setkern)(snext,factor,rlmode,krn,injection) if trace_kerns then - local startchar=getchar(snext) - logprocess("%s: shifting second of pair %s and %s by (%p,%p) and correction (%p,%p) as %s",pref(dataset,sequence),gref(startchar),gref(nextchar),x,y,w,h,injection or "injections") + logprocess("%s: inserting %s %p between %s and %s as %s",pref(dataset,sequence),format,k,gref(getchar(prev)),gref(nextchar),injection or "injections") end + return head,start,true + else + break end - return head,start,true - elseif krn~=0 then - local k=setkern(snext,factor,rlmode,krn,injection) - if trace_kerns then - logprocess("%s: inserting kern %p between %s and %s as %s",pref(dataset,sequence),k,gref(getchar(prev)),gref(nextchar),injection or "injections") - end - return head,start,true - else - break end else break @@ -22796,7 +23794,7 @@ function handlers.gpos_pair(head,start,dataset,sequence,kerns,rlmode,step,i,inje return head,start,false end end -function handlers.gpos_mark2base(head,start,dataset,sequence,markanchors,rlmode) +function handlers.gpos_mark2base(head,start,dataset,sequence,markanchors,rlmode,skiphash) local markchar=getchar(start) if marks[markchar] then local base=getprev(start) @@ -22831,10 +23829,12 @@ function handlers.gpos_mark2base(head,start,dataset,sequence,markanchors,rlmode) local ma=markanchors[2] local dx,dy,bound=setmark(start,base,factor,rlmode,ba,ma,characters[basechar],false,checkmarks) if trace_marks then - logprocess("%s, anchor %s, bound %s: anchoring mark %s to basechar %s => (%p,%p)", - pref(dataset,sequence),anchor,bound,gref(markchar),gref(basechar),dx,dy) + logprocess("%s, bound %s, anchoring mark %s to basechar %s => (%p,%p)", + pref(dataset,sequence),bound,gref(markchar),gref(basechar),dx,dy) end return head,start,true + elseif trace_bugs then + logwarning("%s: mark %s is not anchored to %s",pref(dataset,sequence),gref(markchar),gref(basechar)) end elseif trace_bugs then logwarning("%s: nothing preceding, case %i",pref(dataset,sequence),1) @@ -22847,7 +23847,7 @@ function handlers.gpos_mark2base(head,start,dataset,sequence,markanchors,rlmode) end return head,start,false end -function handlers.gpos_mark2ligature(head,start,dataset,sequence,markanchors,rlmode) +function handlers.gpos_mark2ligature(head,start,dataset,sequence,markanchors,rlmode,skiphash) local markchar=getchar(start) if marks[markchar] then local base=getprev(start) @@ -22886,8 +23886,8 @@ function handlers.gpos_mark2ligature(head,start,dataset,sequence,markanchors,rlm if ba then local dx,dy,bound=setmark(start,base,factor,rlmode,ba,ma,characters[basechar],false,checkmarks) if trace_marks then - logprocess("%s, anchor %s, index %s, bound %s: anchoring mark %s to baselig %s at index %s => (%p,%p)", - pref(dataset,sequence),anchor,index,bound,gref(markchar),gref(basechar),index,dx,dy) + logprocess("%s, index %s, bound %s, anchoring mark %s to baselig %s at index %s => (%p,%p)", + pref(dataset,sequence),index,bound,gref(markchar),gref(basechar),index,dx,dy) end return head,start,true else @@ -22910,7 +23910,7 @@ function handlers.gpos_mark2ligature(head,start,dataset,sequence,markanchors,rlm end return head,start,false end -function handlers.gpos_mark2mark(head,start,dataset,sequence,markanchors,rlmode) +function handlers.gpos_mark2mark(head,start,dataset,sequence,markanchors,rlmode,skiphash) local markchar=getchar(start) if marks[markchar] then local base=getprev(start) @@ -22933,8 +23933,8 @@ function handlers.gpos_mark2mark(head,start,dataset,sequence,markanchors,rlmode) local ma=markanchors[2] local dx,dy,bound=setmark(start,base,factor,rlmode,ba,ma,characters[basechar],true,checkmarks) if trace_marks then - logprocess("%s, anchor %s, bound %s: anchoring mark %s to basemark %s => (%p,%p)", - pref(dataset,sequence),anchor,bound,gref(markchar),gref(basechar),dx,dy) + logprocess("%s, bound %s, anchoring mark %s to basemark %s => (%p,%p)", + pref(dataset,sequence),bound,gref(markchar),gref(basechar),dx,dy) end return head,start,true end @@ -22945,7 +23945,7 @@ function handlers.gpos_mark2mark(head,start,dataset,sequence,markanchors,rlmode) end return head,start,false end -function handlers.gpos_cursive(head,start,dataset,sequence,exitanchors,rlmode,step,i) +function handlers.gpos_cursive(head,start,dataset,sequence,exitanchors,rlmode,skiphash,step) local startchar=getchar(start) if marks[startchar] then if trace_cursive then @@ -22957,7 +23957,7 @@ function handlers.gpos_cursive(head,start,dataset,sequence,exitanchors,rlmode,st local nextchar=ischar(nxt,currentfont) if not nextchar then break - elseif marks[nextchar] then + elseif marks[nextchar] then nxt=getnext(nxt) else local exit=exitanchors[3] @@ -22966,9 +23966,10 @@ function handlers.gpos_cursive(head,start,dataset,sequence,exitanchors,rlmode,st if entry then entry=entry[2] if entry then - local dx,dy,bound=setcursive(start,nxt,factor,rlmode,exit,entry,characters[startchar],characters[nextchar]) + local r2lflag=sequence.flags[4] + local dx,dy,bound=setcursive(start,nxt,factor,rlmode,exit,entry,characters[startchar],characters[nextchar],r2lflag) if trace_cursive then - logprocess("%s: moving %s to %s cursive (%p,%p) using anchor %s and bound %s in %s mode",pref(dataset,sequence),gref(startchar),gref(nextchar),dx,dy,anchor,bound,mref(rlmode)) + logprocess("%s: moving %s to %s cursive (%p,%p) using bound %s in %s mode",pref(dataset,sequence),gref(startchar),gref(nextchar),dx,dy,bound,mref(rlmode)) end return head,start,true end @@ -22984,6 +23985,9 @@ local chainprocs={} local function logprocess(...) if trace_steps then registermessage(...) + if trace_steps=="silent" then + return + end end report_subchain(...) end @@ -22991,11 +23995,14 @@ local logwarning=report_subchain local function logprocess(...) if trace_steps then registermessage(...) + if trace_steps=="silent" then + return + end end report_chain(...) end local logwarning=report_chain -local function reversesub(head,start,stop,dataset,sequence,replacements,rlmode) +local function reversesub(head,start,stop,dataset,sequence,replacements,rlmode,skiphash) local char=getchar(start) local replacement=replacements[char] if replacement then @@ -23016,17 +24023,30 @@ end local function reportmoresteps(dataset,sequence) logwarning("%s: more than 1 step",cref(dataset,sequence)) end -function chainprocs.gsub_single(head,start,stop,dataset,sequence,currentlookup,chainindex) +local function getmapping(dataset,sequence,currentlookup) local steps=currentlookup.steps local nofsteps=currentlookup.nofsteps - if nofsteps>1 then - reportmoresteps(dataset,sequence) - end if nofsteps==0 then reportzerosteps(dataset,sequence) + currentlookup.mapping=false + return false else - local current=start + if nofsteps>1 then + reportmoresteps(dataset,sequence) + end local mapping=steps[1].coverage + currentlookup.mapping=mapping + currentlookup.format=steps[1].format + return mapping + end +end +function chainprocs.gsub_single(head,start,stop,dataset,sequence,currentlookup,rlmode,skiphash,chainindex) + local mapping=currentlookup.mapping + if mapping==nil then + mapping=getmapping(dataset,sequence,currentlookup) + end + if mapping then + local current=start while current do local currentchar=ischar(current) if currentchar then @@ -23054,44 +24074,16 @@ function chainprocs.gsub_single(head,start,stop,dataset,sequence,currentlookup,c end return head,start,false end -function chainprocs.gsub_multiple(head,start,stop,dataset,sequence,currentlookup) - local steps=currentlookup.steps - local nofsteps=currentlookup.nofsteps - if nofsteps>1 then - reportmoresteps(dataset,sequence) - end - if nofsteps==0 then - reportzerosteps(dataset,sequence) - else - local startchar=getchar(start) - local replacement=steps[1].coverage[startchar] - if not replacement or replacement=="" then - if trace_bugs then - logwarning("%s: no multiple for %s",cref(dataset,sequence),gref(startchar)) - end - else - if trace_multiples then - logprocess("%s: replacing %s by multiple characters %s",cref(dataset,sequence),gref(startchar),gref(replacement)) - end - return multiple_glyphs(head,start,replacement,sequence.flags[1],dataset[1]) - end - end - return head,start,false -end -function chainprocs.gsub_alternate(head,start,stop,dataset,sequence,currentlookup) - local steps=currentlookup.steps - local nofsteps=currentlookup.nofsteps - if nofsteps>1 then - reportmoresteps(dataset,sequence) +function chainprocs.gsub_alternate(head,start,stop,dataset,sequence,currentlookup,rlmode,skiphash,chainindex) + local mapping=currentlookup.mapping + if mapping==nil then + mapping=getmapping(dataset,sequence,currentlookup) end - if nofsteps==0 then - reportzerosteps(dataset,sequence) - else + if mapping then local kind=dataset[4] local what=dataset[1] local value=what==true and tfmdata.shared.features[kind] or what local current=start - local mapping=steps[1].coverage while current do local currentchar=ischar(current) if currentchar then @@ -23100,13 +24092,13 @@ function chainprocs.gsub_alternate(head,start,stop,dataset,sequence,currentlooku local choice,comment=get_alternative_glyph(current,alternatives,value) if choice then if trace_alternatives then - logprocess("%s: replacing %s by alternative %a to %s, %s",cref(dataset,sequence),gref(char),choice,gref(choice),comment) + logprocess("%s: replacing %s by alternative %a to %s, %s",cref(dataset,sequence),gref(currentchar),choice,gref(choice),comment) end resetinjection(start) setchar(start,choice) else if trace_alternatives then - logwarning("%s: no variant %a for %s, %s",cref(dataset,sequence),value,gref(char),comment) + logwarning("%s: no variant %a for %s, %s",cref(dataset,sequence),value,gref(currentchar),comment) end end end @@ -23122,27 +24114,45 @@ function chainprocs.gsub_alternate(head,start,stop,dataset,sequence,currentlooku end return head,start,false end -function chainprocs.gsub_ligature(head,start,stop,dataset,sequence,currentlookup,chainindex) - local steps=currentlookup.steps - local nofsteps=currentlookup.nofsteps - if nofsteps>1 then - reportmoresteps(dataset,sequence) +function chainprocs.gsub_multiple(head,start,stop,dataset,sequence,currentlookup,rlmode,skiphash,chainindex) + local mapping=currentlookup.mapping + if mapping==nil then + mapping=getmapping(dataset,sequence,currentlookup) end - if nofsteps==0 then - reportzerosteps(dataset,sequence) - else + if mapping then local startchar=getchar(start) - local ligatures=steps[1].coverage[startchar] + local replacement=mapping[startchar] + if not replacement or replacement=="" then + if trace_bugs then + logwarning("%s: no multiple for %s",cref(dataset,sequence),gref(startchar)) + end + else + if trace_multiples then + logprocess("%s: replacing %s by multiple characters %s",cref(dataset,sequence),gref(startchar),gref(replacement)) + end + return multiple_glyphs(head,start,replacement,skiphash,dataset[1]) + end + end + return head,start,false +end +function chainprocs.gsub_ligature(head,start,stop,dataset,sequence,currentlookup,rlmode,skiphash,chainindex) + local mapping=currentlookup.mapping + if mapping==nil then + mapping=getmapping(dataset,sequence,currentlookup) + end + if mapping then + local startchar=getchar(start) + local ligatures=mapping[startchar] if not ligatures then if trace_bugs then logwarning("%s: no ligatures starting with %s",cref(dataset,sequence,chainindex),gref(startchar)) end else + local hasmarks=marks[startchar] local current=getnext(start) local discfound=false local last=stop local nofreplacements=1 - local skipmark=currentlookup.flags[1] while current do local id=getid(current) if id==disc_code then @@ -23156,7 +24166,7 @@ function chainprocs.gsub_ligature(head,start,stop,dataset,sequence,currentlookup end else local schar=getchar(current) - if skipmark and marks[schar] then + if skiphash and skiphash[schar] then current=getnext(current) else local lg=ligatures[schar] @@ -23164,6 +24174,9 @@ function chainprocs.gsub_ligature(head,start,stop,dataset,sequence,currentlookup ligatures=lg last=current nofreplacements=nofreplacements+1 + if marks[char] then + hasmarks=true + end if current==stop then break else @@ -23187,7 +24200,7 @@ function chainprocs.gsub_ligature(head,start,stop,dataset,sequence,currentlookup logprocess("%s: replacing character %s upto %s by ligature %s case 4",cref(dataset,sequence,chainindex),gref(startchar),gref(getchar(stop)),gref(ligature)) end end - head,start=toligature(head,start,stop,ligature,dataset,sequence,skipmark,discfound) + head,start=toligature(head,start,stop,ligature,dataset,sequence,skiphash,discfound,hasmarks) return head,start,true,nofreplacements,discfound elseif trace_bugs then if start==stop then @@ -23200,47 +24213,42 @@ function chainprocs.gsub_ligature(head,start,stop,dataset,sequence,currentlookup end return head,start,false,0,false end -function chainprocs.gpos_single(head,start,stop,dataset,sequence,currentlookup,rlmode,chainindex) - local steps=currentlookup.steps - local nofsteps=currentlookup.nofsteps - if nofsteps>1 then - reportmoresteps(dataset,sequence) +function chainprocs.gpos_single(head,start,stop,dataset,sequence,currentlookup,rlmode,skiphash,chainindex) + local mapping=currentlookup.mapping + if mapping==nil then + mapping=getmapping(dataset,sequence,currentlookup) end - if nofsteps==0 then - reportzerosteps(dataset,sequence) - else + if mapping then local startchar=getchar(start) - local step=steps[1] - local kerns=step.coverage[startchar] - if not kerns then - elseif step.format=="pair" then - local dx,dy,w,h=setpair(start,factor,rlmode,sequence.flags[4],kerns) - if trace_kerns then - logprocess("%s: shifting single %s by (%p,%p) and correction (%p,%p)",cref(dataset,sequence),gref(startchar),dx,dy,w,h) - end - else - local k=setkern(start,factor,rlmode,kerns,injection) - if trace_kerns then - logprocess("%s: shifting single %s by %p",cref(dataset,sequence),gref(startchar),k) + local kerns=mapping[startchar] + if kerns then + local format=currentlookup.format + if format=="single" then + local dx,dy,w,h=setposition(0,start,factor,rlmode,kerns) + if trace_kerns then + logprocess("%s: shifting single %s by %s (%p,%p) and correction (%p,%p)",cref(dataset,sequence),gref(startchar),format,dx,dy,w,h) + end + else + local k=(format=="move" and setmove or setkern)(start,factor,rlmode,kerns,injection) + if trace_kerns then + logprocess("%s: shifting single %s by %s %p",cref(dataset,sequence),gref(startchar),format,k) + end end + return head,start,true end end return head,start,false end -function chainprocs.gpos_pair(head,start,stop,dataset,sequence,currentlookup,rlmode,chainindex) - local steps=currentlookup.steps - local nofsteps=currentlookup.nofsteps - if nofsteps>1 then - reportmoresteps(dataset,sequence) +function chainprocs.gpos_pair(head,start,stop,dataset,sequence,currentlookup,rlmode,skiphash,chainindex) + local mapping=currentlookup.mapping + if mapping==nil then + mapping=getmapping(dataset,sequence,currentlookup) end - if nofsteps==0 then - reportzerosteps(dataset,sequence) - else + if mapping then local snext=getnext(start) if snext then local startchar=getchar(start) - local step=steps[1] - local kerns=step.coverage[startchar] + local kerns=mapping[startchar] if kerns then local prev=start while snext do @@ -23248,46 +24256,47 @@ function chainprocs.gpos_pair(head,start,stop,dataset,sequence,currentlookup,rlm if not nextchar then break end - local krn=kerns[nextchar] - if not krn and marks[nextchar] then + if skiphash and skiphash[nextchar] then prev=snext snext=getnext(snext) - elseif not krn then - break - elseif step.format=="pair" then - local a,b=krn[1],krn[2] - if optimizekerns then - if not b and a[1]==0 and a[2]==0 and a[4]==0 then - local k=setkern(snext,factor,rlmode,a[3],"injections") + else + local krn=kerns[nextchar] + if not krn then + break + end + local format=currentlookup.format + if format=="pair" then + local a,b=krn[1],krn[2] + if a==true then + elseif a then + local x,y,w,h=setposition(1,start,factor,rlmode,a,"injections") if trace_kerns then - logprocess("%s: shifting single %s by %p",cref(dataset,sequence),gref(startchar),k) + local startchar=getchar(start) + logprocess("%s: shifting first of pair %s and %s by (%p,%p) and correction (%p,%p)",cref(dataset,sequence),gref(startchar),gref(nextchar),x,y,w,h) end - return head,start,true end - end - if a and #a>0 then - local startchar=getchar(start) - local x,y,w,h=setpair(start,factor,rlmode,sequence.flags[4],a,"injections") - if trace_kerns then - logprocess("%s: shifting first of pair %s and %s by (%p,%p) and correction (%p,%p)",cref(dataset,sequence),gref(startchar),gref(nextchar),x,y,w,h) + if b==true then + start=snext + elseif b then + local x,y,w,h=setposition(2,snext,factor,rlmode,b,"injections") + if trace_kerns then + local startchar=getchar(start) + logprocess("%s: shifting second of pair %s and %s by (%p,%p) and correction (%p,%p)",cref(dataset,sequence),gref(startchar),gref(nextchar),x,y,w,h) + end + start=snext + elseif forcepairadvance then + start=snext end - end - if b and #b>0 then - local startchar=getchar(start) - local x,y,w,h=setpair(snext,factor,rlmode,sequence.flags[4],b,"injections") + return head,start,true + elseif krn~=0 then + local k=(format=="move" and setmove or setkern)(snext,factor,rlmode,krn) if trace_kerns then - logprocess("%s: shifting second of pair %s and %s by (%p,%p) and correction (%p,%p)",cref(dataset,sequence),gref(startchar),gref(nextchar),x,y,w,h) + logprocess("%s: inserting %s %p between %s and %s",cref(dataset,sequence),format,k,gref(getchar(prev)),gref(nextchar)) end + return head,start,true + else + break end - return head,start,true - elseif krn~=0 then - local k=setkern(snext,factor,rlmode,krn) - if trace_kerns then - logprocess("%s: inserting kern %s between %s and %s",cref(dataset,sequence),k,gref(getchar(prev)),gref(nextchar)) - end - return head,start,true - else - break end end end @@ -23295,18 +24304,15 @@ function chainprocs.gpos_pair(head,start,stop,dataset,sequence,currentlookup,rlm end return head,start,false end -function chainprocs.gpos_mark2base(head,start,stop,dataset,sequence,currentlookup,rlmode) - local steps=currentlookup.steps - local nofsteps=currentlookup.nofsteps - if nofsteps>1 then - reportmoresteps(dataset,sequence) +function chainprocs.gpos_mark2base(head,start,stop,dataset,sequence,currentlookup,rlmode,skiphash,chainindex) + local mapping=currentlookup.mapping + if mapping==nil then + mapping=getmapping(dataset,sequence,currentlookup) end - if nofsteps==0 then - reportzerosteps(dataset,sequence) - else + if mapping then local markchar=getchar(start) if marks[markchar] then - local markanchors=steps[1].coverage[markchar] + local markanchors=mapping[markchar] if markanchors then local base=getprev(start) if base then @@ -23341,8 +24347,8 @@ function chainprocs.gpos_mark2base(head,start,stop,dataset,sequence,currentlooku if ma then local dx,dy,bound=setmark(start,base,factor,rlmode,ba,ma,characters[basechar],false,checkmarks) if trace_marks then - logprocess("%s, anchor %s, bound %s: anchoring mark %s to basechar %s => (%p,%p)", - cref(dataset,sequence),anchor,bound,gref(markchar),gref(basechar),dx,dy) + logprocess("%s, bound %s, anchoring mark %s to basechar %s => (%p,%p)", + cref(dataset,sequence),bound,gref(markchar),gref(basechar),dx,dy) end return head,start,true end @@ -23362,18 +24368,15 @@ function chainprocs.gpos_mark2base(head,start,stop,dataset,sequence,currentlooku end return head,start,false end -function chainprocs.gpos_mark2ligature(head,start,stop,dataset,sequence,currentlookup,rlmode) - local steps=currentlookup.steps - local nofsteps=currentlookup.nofsteps - if nofsteps>1 then - reportmoresteps(dataset,sequence) +function chainprocs.gpos_mark2ligature(head,start,stop,dataset,sequence,currentlookup,rlmode,skiphash,chainindex) + local mapping=currentlookup.mapping + if mapping==nil then + mapping=getmapping(dataset,sequence,currentlookup) end - if nofsteps==0 then - reportzerosteps(dataset,sequence) - else + if mapping then local markchar=getchar(start) if marks[markchar] then - local markanchors=steps[1].coverage[markchar] + local markanchors=mapping[markchar] if markanchors then local base=getprev(start) if base then @@ -23411,8 +24414,8 @@ function chainprocs.gpos_mark2ligature(head,start,stop,dataset,sequence,currentl if ba then local dx,dy,bound=setmark(start,base,factor,rlmode,ba,ma,characters[basechar],false,checkmarks) if trace_marks then - logprocess("%s, anchor %s, bound %s: anchoring mark %s to baselig %s at index %s => (%p,%p)", - cref(dataset,sequence),anchor,a or bound,gref(markchar),gref(basechar),index,dx,dy) + logprocess("%s, bound %s, anchoring mark %s to baselig %s at index %s => (%p,%p)", + cref(dataset,sequence),a or bound,gref(markchar),gref(basechar),index,dx,dy) end return head,start,true end @@ -23433,18 +24436,15 @@ function chainprocs.gpos_mark2ligature(head,start,stop,dataset,sequence,currentl end return head,start,false end -function chainprocs.gpos_mark2mark(head,start,stop,dataset,sequence,currentlookup,rlmode) - local steps=currentlookup.steps - local nofsteps=currentlookup.nofsteps - if nofsteps>1 then - reportmoresteps(dataset,sequence) +function chainprocs.gpos_mark2mark(head,start,stop,dataset,sequence,currentlookup,rlmode,skiphash,chainindex) + local mapping=currentlookup.mapping + if mapping==nil then + mapping=getmapping(dataset,sequence,currentlookup) end - if nofsteps==0 then - reportzerosteps(dataset,sequence) - else + if mapping then local markchar=getchar(start) if marks[markchar] then - local markanchors=steps[1].coverage[markchar] + local markanchors=mapping[markchar] if markanchors then local base=getprev(start) local slc=getligaindex(start) @@ -23467,8 +24467,8 @@ function chainprocs.gpos_mark2mark(head,start,stop,dataset,sequence,currentlooku if ma then local dx,dy,bound=setmark(start,base,factor,rlmode,ba,ma,characters[basechar],true,checkmarks) if trace_marks then - logprocess("%s, anchor %s, bound %s: anchoring mark %s to basemark %s => (%p,%p)", - cref(dataset,sequence),anchor,bound,gref(markchar),gref(basechar),dx,dy) + logprocess("%s, bound %s, anchoring mark %s to basemark %s => (%p,%p)", + cref(dataset,sequence),bound,gref(markchar),gref(basechar),dx,dy) end return head,start,true end @@ -23488,17 +24488,14 @@ function chainprocs.gpos_mark2mark(head,start,stop,dataset,sequence,currentlooku end return head,start,false end -function chainprocs.gpos_cursive(head,start,stop,dataset,sequence,currentlookup,rlmode) - local steps=currentlookup.steps - local nofsteps=currentlookup.nofsteps - if nofsteps>1 then - reportmoresteps(dataset,sequence) +function chainprocs.gpos_cursive(head,start,stop,dataset,sequence,currentlookup,rlmode,skiphash,chainindex) + local mapping=currentlookup.mapping + if mapping==nil then + mapping=getmapping(dataset,sequence,currentlookup) end - if nofsteps==0 then - reportzerosteps(dataset,sequence) - else + if mapping then local startchar=getchar(start) - local exitanchors=steps[1].coverage[startchar] + local exitanchors=mapping[startchar] if exitanchors then if marks[startchar] then if trace_cursive then @@ -23519,9 +24516,10 @@ function chainprocs.gpos_cursive(head,start,stop,dataset,sequence,currentlookup, if entry then entry=entry[2] if entry then - local dx,dy,bound=setcursive(start,nxt,factor,rlmode,exit,entry,characters[startchar],characters[nextchar]) + local r2lflag=sequence.flags[4] + local dx,dy,bound=setcursive(start,nxt,factor,rlmode,exit,entry,characters[startchar],characters[nextchar],r2lflag) if trace_cursive then - logprocess("%s: moving %s to %s cursive (%p,%p) using anchor %s and bound %s in %s mode",pref(dataset,sequence),gref(startchar),gref(nextchar),dx,dy,anchor,bound,mref(rlmode)) + logprocess("%s: moving %s to %s cursive (%p,%p) using bound %s in %s mode",pref(dataset,sequence),gref(startchar),gref(nextchar),dx,dy,bound,mref(rlmode)) end return head,start,true end @@ -23542,12 +24540,21 @@ end local function show_skip(dataset,sequence,char,ck,class) logwarning("%s: skipping char %s, class %a, rule %a, lookuptype %a",cref(dataset,sequence),gref(char),class,ck[1],ck[8] or ck[2]) end -local new_kern=nuts.pool.kern +local userkern=nuts.pool and nuts.pool.newkern +do if not userkern then + local thekern=nuts.new("kern",1) + local setkern=nuts.setkern + userkern=function(k) + local n=copy_node(thekern) + setkern(n,k) + return n + end +end end local function checked(head) local current=head while current do if getid(current)==glue_code then - local kern=new_kern(getwidth(current)) + local kern=userkern(getwidth(current)) if head==current then local next=getnext(current) if next then @@ -23575,14 +24582,11 @@ local function setdiscchecked(d,pre,post,replace) setdisc(d,pre,post,replace) end local noflags={ false,false,false,false } -local function chainrun(head,start,last,dataset,sequence,rlmode,ck,skipped) +local function chainrun(head,start,last,dataset,sequence,rlmode,skiphash,ck) local size=ck[5]-ck[4]+1 - local flags=sequence.flags or noflags - local done=false - local skipmark=flags[1] local chainlookups=ck[6] + local done=false if chainlookups then - local nofchainlookups=#chainlookups if size==1 then local chainlookup=chainlookups[1] for j=1,#chainlookup do @@ -23591,7 +24595,7 @@ local function chainrun(head,start,last,dataset,sequence,rlmode,ck,skipped) local chainproc=chainprocs[chainkind] if chainproc then local ok - head,start,ok=chainproc(head,start,last,dataset,sequence,chainstep,rlmode,1) + head,start,ok=chainproc(head,start,last,dataset,sequence,chainstep,rlmode,skiphash) if ok then done=true end @@ -23601,13 +24605,14 @@ local function chainrun(head,start,last,dataset,sequence,rlmode,ck,skipped) end else local i=1 + local laststart=start + local nofchainlookups=#chainlookups while start do - if skipped then + if skiphash then while start do - local char=getchar(start) - local class=classes[char] - if class then - if class==skipmark or class==skipligature or class==skipbase or (markclass and class=="mark" and not markclass[char]) then + local char=ischar(start,currentfont) + if char then + if skiphash and skiphash[char] then start=getnext(start) else break @@ -23625,10 +24630,11 @@ local function chainrun(head,start,last,dataset,sequence,rlmode,ck,skipped) local chainproc=chainprocs[chainkind] if chainproc then local ok,n - head,start,ok,n=chainproc(head,start,last,dataset,sequence,chainstep,rlmode,i) + head,start,ok,n=chainproc(head,start,last,dataset,sequence,chainstep,rlmode,skiphash,i) if ok then done=true if n and n>1 and i+n>nofchainlookups then + i=size break end end @@ -23641,14 +24647,18 @@ local function chainrun(head,start,last,dataset,sequence,rlmode,ck,skipped) if i>size or not start then break elseif start then + laststart=start start=getnext(start) end end + if not start then + start=laststart + end end else local replacements=ck[7] if replacements then - head,start,done=reversesub(head,start,last,dataset,sequence,replacements,rlmode) + head,start,done=reversesub(head,start,last,dataset,sequence,replacements,rlmode,skiphash) else done=true if trace_contexts then @@ -23658,7 +24668,7 @@ local function chainrun(head,start,last,dataset,sequence,rlmode,ck,skipped) end return head,start,done end -local function chaindisk(head,start,dataset,sequence,rlmode,ck,skipped) +local function chaindisk(head,start,dataset,sequence,rlmode,skiphash,ck) if not start then return head,start,false end @@ -23851,7 +24861,7 @@ local function chaindisk(head,start,dataset,sequence,rlmode,ck,skipped) head=lookaheaddisc end local pre,post,replace=getdisc(lookaheaddisc) - local new=copy_node_list(cf) + local new=copy_node_list(cf) local cnew=new if pre then setlink(find_node_tail(cf),pre) @@ -23871,14 +24881,14 @@ local function chaindisk(head,start,dataset,sequence,rlmode,ck,skipped) end if not notmatchpre[lookaheaddisc] then local ok=false - cf,start,ok=chainrun(cf,start,cl,dataset,sequence,rlmode,ck,skipped) + cf,start,ok=chainrun(cf,start,cl,dataset,sequence,rlmode,skiphash,ck) if ok then done=true end end if not notmatchreplace[lookaheaddisc] then local ok=false - new,cnew,ok=chainrun(new,cnew,clast,dataset,sequence,rlmode,ck,skipped) + new,cnew,ok=chainrun(new,cnew,clast,dataset,sequence,rlmode,skiphash,ck) if ok then done=true end @@ -23889,8 +24899,8 @@ local function chaindisk(head,start,dataset,sequence,rlmode,ck,skipped) setdisc(lookaheaddisc,cf,post,new) end start=getprev(lookaheaddisc) - sweephead[cf]=getnext(clast) - sweephead[new]=getnext(cl) + sweephead[cf]=getnext(clast) or false + sweephead[new]=getnext(cl) or false elseif backtrackdisc then local cf=getnext(backtrackdisc) local cl=start @@ -23906,10 +24916,7 @@ local function chaindisk(head,start,dataset,sequence,rlmode,ck,skipped) break end end - if cnext then - setprev(cnext,backtrackdisc) - end - setnext(backtrackdisc,cnext) + setlink(backtrackdisc,cnext) setprev(cf) setnext(cl) local pre,post,replace,pretail,posttail,replacetail=getdisc(backtrackdisc,true) @@ -23924,14 +24931,14 @@ local function chaindisk(head,start,dataset,sequence,rlmode,ck,skipped) end if not notmatchpost[backtrackdisc] then local ok=false - cf,start,ok=chainrun(cf,start,last,dataset,sequence,rlmode,ck,skipped) + cf,start,ok=chainrun(cf,start,last,dataset,sequence,rlmode,skiphash,ck) if ok then done=true end end if not notmatchreplace[backtrackdisc] then local ok=false - new,cnew,ok=chainrun(new,cnew,clast,dataset,sequence,rlmode,ck,skipped) + new,cnew,ok=chainrun(new,cnew,clast,dataset,sequence,rlmode,skiphash,ck) if ok then done=true end @@ -23952,449 +24959,413 @@ local function chaindisk(head,start,dataset,sequence,rlmode,ck,skipped) setdisc(backtrackdisc,pre,post,replace) end start=getprev(backtrackdisc) - sweephead[post]=getnext(clast) - sweephead[replace]=getnext(last) + sweephead[post]=getnext(clast) or false + sweephead[replace]=getnext(last) or false else local ok=false - head,start,ok=chainrun(head,start,last,dataset,sequence,rlmode,ck,skipped) + head,start,ok=chainrun(head,start,last,dataset,sequence,rlmode,skiphash,ck) if ok then done=true end end return head,start,done end -local function chaintrac(head,start,dataset,sequence,rlmode,ck,skipped) +local function chaintrac(head,start,dataset,sequence,rlmode,skiphash,ck,match,discseen,sweepnode) local rule=ck[1] local lookuptype=ck[8] or ck[2] local nofseq=#ck[3] local first=ck[4] local last=ck[5] local char=getchar(start) - logwarning("%s: rule %s matches at char %s for (%s,%s,%s) chars, lookuptype %a", - cref(dataset,sequence),rule,gref(char),first-1,last-first+1,nofseq-last,lookuptype) + logwarning("%s: rule %s %s at char %s for (%s,%s,%s) chars, lookuptype %a, %sdisc seen, %ssweeping", + cref(dataset,sequence),rule,match and "matches" or "nomatch", + gref(char),first-1,last-first+1,nofseq-last,lookuptype, + discseen and "" or "no ",sweepnode and "" or "not ") end -local function handle_contextchain(head,start,dataset,sequence,contexts,rlmode) +local function handle_contextchain(head,start,dataset,sequence,contexts,rlmode,skiphash) local sweepnode=sweepnode local sweeptype=sweeptype + local postreplace + local prereplace + local checkdisc + local discseen + if sweeptype then + if sweeptype=="replace" then + postreplace=true + prereplace=true + else + postreplace=sweeptype=="post" + prereplace=sweeptype=="pre" + end + checkdisc=getprev(head) + end local currentfont=currentfont - local diskseen=false - local checkdisc=sweeptype and getprev(head) - local flags=sequence.flags or noflags - local done=false - local skipmark=flags[1] - local skipligature=flags[2] - local skipbase=flags[3] - local markclass=sequence.markclass - local skipped=false + local skipped local startprev, startnext=getboth(start) - for k=1,#contexts do - local match=true - local current=start - local last=start + local done + local nofcontexts=contexts.n + local startchar=nofcontext==1 or ischar(start,currentfont) + for k=1,nofcontexts do local ck=contexts[k] local seq=ck[3] - local s=#seq - local size=1 - if s==1 then - local char=ischar(current,currentfont) - if char then - if not seq[1][char] then - match=false + local f=ck[4] + if not startchar or not seq[f][startchar] then + goto next + end + local s=seq.n + local l=ck[5] + local current=start + local last=start + if l>f then + local discfound + local n=f+1 + last=startnext + while n<=l do + if postreplace and not last then + last=getnext(sweepnode) + sweeptype=nil end - end - else - local f=ck[4] - local l=ck[5] - size=l-f+1 - if size>1 then - local discfound - local n=f+1 - last=startnext - while n<=l do - if not last and (sweeptype=="post" or sweeptype=="replace") then - last=getnext(sweepnode) - sweeptype=nil - end - if last then - local char,id=ischar(last,currentfont) - if char then - local class=classes[char] - if class then - if class==skipmark or class==skipligature or class==skipbase or (markclass and class=="mark" and not markclass[char]) then - skipped=true - if trace_skips then - show_skip(dataset,sequence,char,ck,class) - end - last=getnext(last) - elseif seq[n][char] then - if n<l then - last=getnext(last) - end - n=n+1 - else - if discfound then - notmatchreplace[discfound]=true - if notmatchpre[discfound] then - match=false - end - else - match=false - end - break - end + if last then + local char,id=ischar(last,currentfont) + if char then + if skiphash and skiphash[char] then + skipped=true + if trace_skips then + show_skip(dataset,sequence,char,ck,classes[char]) + end + last=getnext(last) + elseif seq[n][char] then + if n<l then + last=getnext(last) + end + n=n+1 + elseif discfound then + notmatchreplace[discfound]=true + if notmatchpre[discfound] then + goto next else - if discfound then - notmatchreplace[discfound]=true - if notmatchpre[discfound] then - match=false - end - else - match=false - end break end - elseif char==false then - if discfound then - notmatchreplace[discfound]=true - if notmatchpre[discfound] then - match=false - end + else + goto next + end + elseif char==false then + if discfound then + notmatchreplace[discfound]=true + if notmatchpre[discfound] then + goto next else - match=false + break end - break - elseif id==disc_code then - diskseen=true - discfound=last - notmatchpre[last]=nil - notmatchpost[last]=true - notmatchreplace[last]=nil - local pre,post,replace=getdisc(last) - if pre then - local n=n - while pre do - if seq[n][getchar(pre)] then - n=n+1 - pre=getnext(pre) - if n>l then - break - end - else - notmatchpre[last]=true + else + goto next + end + elseif id==disc_code then + discseen=true + discfound=last + notmatchpre[last]=nil + notmatchpost[last]=true + notmatchreplace[last]=nil + local pre,post,replace=getdisc(last) + if pre then + local n=n + while pre do + if seq[n][getchar(pre)] then + n=n+1 + if n>l then break end - end - if n<=l then + pre=getnext(pre) + else notmatchpre[last]=true + break end - else - notmatchpre[last]=true end - if replace then - while replace do - if seq[n][getchar(replace)] then - n=n+1 - replace=getnext(replace) - if n>l then - break - end + else + notmatchpre[last]=true + end + if replace then + while replace do + if seq[n][getchar(replace)] then + n=n+1 + if n>l then + break + end + replace=getnext(replace) + else + notmatchreplace[last]=true + if notmatchpre[last] then + goto next else - notmatchreplace[last]=true - if notmatchpre[last] then - match=false - end break end end - if notmatchpre[last] then - match=false - end end - last=getnext(last) - else - match=false - break + if notmatchpre[last] then + goto next + end end + last=getnext(last) else - match=false - break + goto next end + else + goto next end end - if match and f>1 then - if startprev then - local prev=startprev - if prev==checkdisc and (sweeptype=="pre" or sweeptype=="replace") then - prev=getprev(sweepnode) - end - if prev then - local discfound - local n=f-1 - while n>=1 do - if prev then - local char,id=ischar(prev,currentfont) - if char then - local class=classes[char] - if class then - if class==skipmark or class==skipligature or class==skipbase or (markclass and class=="mark" and not markclass[char]) then - skipped=true - if trace_skips then - show_skip(dataset,sequence,char,ck,class) - end - prev=getprev(prev) - elseif seq[n][char] then - if n>1 then - prev=getprev(prev) - end - n=n-1 - else - if discfound then - notmatchreplace[discfound]=true - if notmatchpost[discfound] then - match=false - end - else - match=false - end - break - end + end + if f>1 then + if startprev then + local prev=startprev + if prereplace and prev==checkdisc then + prev=getprev(sweepnode) + end + if prev then + local discfound + local n=f-1 + while n>=1 do + if prev then + local char,id=ischar(prev,currentfont) + if char then + if skiphash and skiphash[char] then + skipped=true + if trace_skips then + show_skip(dataset,sequence,char,ck,classes[char]) + end + prev=getprev(prev) + elseif seq[n][char] then + if n>1 then + prev=getprev(prev) + end + n=n-1 + elseif discfound then + notmatchreplace[discfound]=true + if notmatchpost[discfound] then + goto next else - if discfound then - notmatchreplace[discfound]=true - if notmatchpost[discfound] then - match=false - end - else - match=false - end break end - elseif char==false then - if discfound then - notmatchreplace[discfound]=true - if notmatchpost[discfound] then - match=false - end - else - match=false + else + goto next + end + elseif char==false then + if discfound then + notmatchreplace[discfound]=true + if notmatchpost[discfound] then + goto next end - break - elseif id==disc_code then - diskseen=true - discfound=prev - notmatchpre[prev]=true - notmatchpost[prev]=nil - notmatchreplace[prev]=nil - local pre,post,replace,pretail,posttail,replacetail=getdisc(prev,true) - if pre~=start and post~=start and replace~=start then - if post then - local n=n - while posttail do - if seq[n][getchar(posttail)] then - n=n-1 - if posttail==post then - break - else - posttail=getprev(posttail) - if n<1 then - break - end - end - else - notmatchpost[prev]=true + else + goto next + end + break + elseif id==disc_code then + discseen=true + discfound=prev + notmatchpre[prev]=true + notmatchpost[prev]=nil + notmatchreplace[prev]=nil + local pre,post,replace,pretail,posttail,replacetail=getdisc(prev,true) + if pre~=start and post~=start and replace~=start then + if post then + local n=n + while posttail do + if seq[n][getchar(posttail)] then + n=n-1 + if posttail==post or n<1 then break + else + posttail=getprev(posttail) end - end - if n>=1 then + else notmatchpost[prev]=true + break end - else + end + if n>=1 then notmatchpost[prev]=true end - if replace then - while replacetail do - if seq[n][getchar(replacetail)] then - n=n-1 - if replacetail==replace then - break - else - replacetail=getprev(replacetail) - if n<1 then - break - end - end + else + notmatchpost[prev]=true + end + if replace then + while replacetail do + if seq[n][getchar(replacetail)] then + n=n-1 + if replacetail==replace or n<1 then + break + else + replacetail=getprev(replacetail) + end + else + notmatchreplace[prev]=true + if notmatchpost[prev] then + goto next else - notmatchreplace[prev]=true - if notmatchpost[prev] then - match=false - end break end end - if not match then - break - end end + else + notmatchreplace[prev]=true end - prev=getprev(prev) - elseif id==glue_code and seq[n][32] and isspace(prev,threshold,id) then + end + prev=getprev(prev) + elseif id==glue_code then + local sn=seq[n] + if (sn[32] and spaces[prev]) or sn[0xFFFC] then n=n-1 prev=getprev(prev) else - match=false - break + goto next end + elseif seq[n][0xFFFC] then + n=n-1 + prev=getprev(prev) else - match=false - break + goto next end + else + goto next end - else - match=false end else - match=false + goto next end + else + goto next end - if match and s>l then - local current=last and getnext(last) - if not current and (sweeptype=="post" or sweeptype=="replace") then - current=getnext(sweepnode) - end - if current then - local discfound - local n=l+1 - while n<=s do - if current then - local char,id=ischar(current,currentfont) - if char then - local class=classes[char] - if class then - if class==skipmark or class==skipligature or class==skipbase or (markclass and class=="mark" and not markclass[char]) then - skipped=true - if trace_skips then - show_skip(dataset,sequence,char,ck,class) - end - current=getnext(current) - elseif seq[n][char] then - if n<s then - current=getnext(current) - end - n=n+1 - else - if discfound then - notmatchreplace[discfound]=true - if notmatchpre[discfound] then - match=false - end - else - match=false - end - break - end + end + if s>l then + local current=last and getnext(last) + if not current and postreplace then + current=getnext(sweepnode) + end + if current then + local discfound + local n=l+1 + while n<=s do + if current then + local char,id=ischar(current,currentfont) + if char then + if skiphash and skiphash[char] then + skipped=true + if trace_skips then + show_skip(dataset,sequence,char,ck,classes[char]) + end + current=getnext(current) + elseif seq[n][char] then + if n<s then + current=getnext(current) + end + n=n+1 + elseif discfound then + notmatchreplace[discfound]=true + if notmatchpre[discfound] then + goto next else - if discfound then - notmatchreplace[discfound]=true - if notmatchpre[discfound] then - match=false - end - else - match=false - end break end - elseif char==false then - if discfound then - notmatchreplace[discfound]=true - if notmatchpre[discfound] then - match=false - end + else + goto next + end + elseif char==false then + if discfound then + notmatchreplace[discfound]=true + if notmatchpre[discfound] then + goto next else - match=false + break end - break - elseif id==disc_code then - diskseen=true - discfound=current - notmatchpre[current]=nil - notmatchpost[current]=true - notmatchreplace[current]=nil - local pre,post,replace=getdisc(current) - if pre then - local n=n - while pre do - if seq[n][getchar(pre)] then - n=n+1 - pre=getnext(pre) - if n>s then - break - end - else - notmatchpre[current]=true + else + goto next + end + elseif id==disc_code then + discseen=true + discfound=current + notmatchpre[current]=nil + notmatchpost[current]=true + notmatchreplace[current]=nil + local pre,post,replace=getdisc(current) + if pre then + local n=n + while pre do + if seq[n][getchar(pre)] then + n=n+1 + if n>s then break + else + pre=getnext(pre) end - end - if n<=s then + else notmatchpre[current]=true + break end - else + end + if n<=s then notmatchpre[current]=true end - if replace then - while replace do - if seq[n][getchar(replace)] then - n=n+1 + else + notmatchpre[current]=true + end + if replace then + while replace do + if seq[n][getchar(replace)] then + n=n+1 + if n>s then + break + else replace=getnext(replace) - if n>s then - break - end + end + else + notmatchreplace[current]=true + if notmatchpre[current] then + goto next else - notmatchreplace[current]=true - if not notmatchpre[current] then - match=false - end break end end - if not match then - break - end - else end - current=getnext(current) - elseif id==glue_code and seq[n][32] and isspace(current,threshold,id) then + else + notmatchreplace[current]=true + end + current=getnext(current) + elseif id==glue_code then + local sn=seq[n] + if (sn[32] and spaces[current]) or sn[0xFFFC] then n=n+1 current=getnext(current) else - match=false - break + goto next end + elseif seq[n][0xFFFC] then + n=n+1 + current=getnext(current) else - match=false - break + goto next end + else + goto next end - else - match=false end - end - end - if match then - if trace_contexts then - chaintrac(head,start,dataset,sequence,rlmode,ck,skipped) - end - if diskseen or sweepnode then - head,start,done=chaindisk(head,start,dataset,sequence,rlmode,ck,skipped) else - head,start,done=chainrun(head,start,last,dataset,sequence,rlmode,ck,skipped) - end - if done then - break + goto next end end + if trace_contexts then + chaintrac(head,start,dataset,sequence,rlmode,skipped and skiphash,ck,true,discseen,sweepnode) + end + if discseen or sweepnode then + head,start,done=chaindisk(head,start,dataset,sequence,rlmode,skipped and skiphash,ck) + else + head,start,done=chainrun(head,start,last,dataset,sequence,rlmode,skipped and skiphash,ck) + end + if done then + break + end + ::next:: end - if diskseen then + if discseen then notmatchpre={} notmatchpost={} notmatchreplace={} @@ -24406,13 +25377,18 @@ handlers.gsub_contextchain=handle_contextchain handlers.gsub_reversecontextchain=handle_contextchain handlers.gpos_contextchain=handle_contextchain handlers.gpos_context=handle_contextchain -local function chained_contextchain(head,start,stop,dataset,sequence,currentlookup,rlmode) +local function chained_contextchain(head,start,stop,dataset,sequence,currentlookup,rlmode,skiphash) local steps=currentlookup.steps local nofsteps=currentlookup.nofsteps if nofsteps>1 then reportmoresteps(dataset,sequence) end - return handle_contextchain(head,start,dataset,sequence,currentlookup,rlmode) + local l=steps[1].coverage[getchar(start)] + if l then + return handle_contextchain(head,start,dataset,sequence,l,rlmode,skiphash) + else + return head,start,false + end end chainprocs.gsub_context=chained_contextchain chainprocs.gsub_contextchain=chained_contextchain @@ -24420,22 +25396,17 @@ chainprocs.gsub_reversecontextchain=chained_contextchain chainprocs.gpos_contextchain=chained_contextchain chainprocs.gpos_context=chained_contextchain local missing=setmetatableindex("table") +local logwarning=report_process +local resolved={} local function logprocess(...) if trace_steps then registermessage(...) + if trace_steps=="silent" then + return + end end report_process(...) end -local logwarning=report_process -local function report_missing_coverage(dataset,sequence) - local t=missing[currentfont] - if not t[sequence] then - t[sequence]=true - logwarning("missing coverage for feature %a, lookup %a, type %a, font %a, name %a", - dataset[4],sequence.name,sequence.type,currentfont,tfmdata.properties.fullname) - end -end -local resolved={} local sequencelists=setmetatableindex(function(t,font) local sequences=fontdata[font].resources.sequences if not sequences or not next(sequences) then @@ -24549,13 +25520,12 @@ local function kernrun(disc,k_run,font,attr,...) done=true end if prev then - local nest=getprev(pre) setlink(prev,pre) if k_run(prevmarks,"preinjections",pre,font,attr,...) then done=true end - setprev(pre,nest) - setnext(prev,disc) + setprev(pre) + setlink(prev,disc) end end if post then @@ -24568,7 +25538,7 @@ local function kernrun(disc,k_run,font,attr,...) done=true end setnext(posttail) - setprev(next,disc) + setlink(disc,next) end end if replace then @@ -24576,13 +25546,12 @@ local function kernrun(disc,k_run,font,attr,...) done=true end if prev then - local nest=getprev(replace) setlink(prev,replace) if k_run(prevmarks,"replaceinjections",replace,font,attr,...) then done=true end - setprev(replace,nest) - setnext(prev,disc) + setprev(replace) + setlink(prev,disc) end if next then setlink(replacetail,next) @@ -24590,7 +25559,7 @@ local function kernrun(disc,k_run,font,attr,...) done=true end setnext(replacetail) - setprev(next,disc) + setlink(disc,next) end elseif prev and next then setlink(prev,next) @@ -24599,6 +25568,9 @@ local function kernrun(disc,k_run,font,attr,...) end setlink(prev,disc,next) end + if done and trace_testruns then + report_disc("done",disc) + end return nextstart,done end local function comprun(disc,c_run,...) @@ -24637,6 +25609,9 @@ local function comprun(disc,c_run,...) sweepnode=nil sweeptype=nil if renewed then + if trace_testruns then + report_disc("done",disc) + end setdisc(disc,pre,post,replace) end return getnext(disc),renewed @@ -24650,7 +25625,7 @@ local function testrun(disc,t_run,c_run,...) return end local pre,post,replace,pretail,posttail,replacetail=getdisc(disc,true) - local done=false + local renewed=false if (post or replace) and prev then if post then setlink(posttail,next) @@ -24664,19 +25639,22 @@ local function testrun(disc,t_run,c_run,...) end local d_post=t_run(post,next,...) local d_replace=t_run(replace,next,...) - if (d_post and d_post>0) or (d_replace and d_replace>0) then - local d=d_replace or d_post - if d_post and d<d_post then - d=d_post - end - local head,tail=getnext(disc),disc + if d_post>0 or d_replace>0 then + local d=d_replace>d_post and d_replace or d_post + local head=getnext(disc) + local tail=head for i=1,d do - tail=getnext(tail) - if getid(tail)==disc_code then - head,tail=flattendisk(head,tail) + local nx=getnext(tail) + local id=getid(nx) + if id==disc_code then + head,tail=flattendisk(head,nx) + elseif id==glyph_code then + tail=nx + else + break end end - local next=getnext(tail) + next=getnext(tail) setnext(tail) setprev(head) local new=copy_node_list(head) @@ -24690,23 +25668,23 @@ local function testrun(disc,t_run,c_run,...) else replace=new end - setlink(disc,next) else if posttail then setnext(posttail) else post=nil end - setnext(replacetail) if replacetail then setnext(replacetail) else replace=nil end - setprev(next,disc) end + setlink(disc,next) + end + if trace_testruns then + report_disc("more",disc) end - local renewed=false if pre then sweepnode=disc sweeptype="pre" @@ -24738,23 +25716,24 @@ local function testrun(disc,t_run,c_run,...) sweeptype=nil if renewed then setdisc(disc,pre,post,replace) - return next,true - else - return next,done + if trace_testruns then + report_disc("done",disc) + end end + return getnext(disc),renewed end local nesting=0 -local function c_run_single(head,font,attr,lookupcache,step,dataset,sequence,rlmode,handler) +local function c_run_single(head,font,attr,lookupcache,step,dataset,sequence,rlmode,skiphash,handler) local done=false local sweep=sweephead[head] if sweep then start=sweep - sweephead[head]=nil + sweephead[head]=false else start=head end while start do - local char=ischar(start,font) + local char,id=ischar(start,font) if char then local a if attr then @@ -24764,7 +25743,7 @@ local function c_run_single(head,font,attr,lookupcache,step,dataset,sequence,rlm local lookupmatch=lookupcache[char] if lookupmatch then local ok - head,start,ok=handler(head,start,dataset,sequence,lookupmatch,rlmode,step,1) + head,start,ok=handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step) if ok then done=true end @@ -24816,35 +25795,41 @@ local function t_run_single(start,stop,font,attr,lookupcache) local l=nil local d=0 while s do - local lg=lookupmatch[getchar(s)] - if lg then - if sstop then - d=1 - elseif d>0 then - d=d+1 - end - l=lg - s=getnext(s) - sstop=s==stop - if not s then - s=ss - ss=nil - end - while getid(s)==disc_code do - ss=getnext(s) - s=getfield(s,"replace") + local char=ischar(s,font) + if char then + local lg=lookupmatch[char] + if lg then + if sstop then + d=1 + elseif d>0 then + d=d+1 + end + l=lg + s=getnext(s) + sstop=s==stop if not s then s=ss ss=nil end + while getid(s)==disc_code do + ss=getnext(s) + s=getfield(s,"replace") + if not s then + s=ss + ss=nil + end + end + else + break end else break end end - if l and l.ligature then + if l and l.ligature then lastd=d end + else end else end @@ -24856,8 +25841,9 @@ local function t_run_single(start,stop,font,attr,lookupcache) break end end + return 0 end -local function k_run_single(sub,injection,last,font,attr,lookupcache,step,dataset,sequence,rlmode,handler) +local function k_run_single(sub,injection,last,font,attr,lookupcache,step,dataset,sequence,rlmode,skiphash,handler) local a if attr then a=getattr(sub,0) @@ -24871,7 +25857,7 @@ local function k_run_single(sub,injection,last,font,attr,lookupcache,step,datase if char then local lookupmatch=lookupcache[char] if lookupmatch then - local h,d,ok=handler(sub,n,dataset,sequence,lookupmatch,rlmode,step,1,injection) + local h,d,ok=handler(sub,n,dataset,sequence,lookupmatch,rlmode,skiphash,step,injection) if ok then return true end @@ -24880,12 +25866,12 @@ local function k_run_single(sub,injection,last,font,attr,lookupcache,step,datase end end end -local function c_run_multiple(head,font,attr,steps,nofsteps,dataset,sequence,rlmode,handler) +local function c_run_multiple(head,font,attr,steps,nofsteps,dataset,sequence,rlmode,skiphash,handler) local done=false local sweep=sweephead[head] if sweep then start=sweep - sweephead[head]=nil + sweephead[head]=false else start=head end @@ -24900,20 +25886,16 @@ local function c_run_multiple(head,font,attr,steps,nofsteps,dataset,sequence,rlm for i=1,nofsteps do local step=steps[i] local lookupcache=step.coverage - if lookupcache then - local lookupmatch=lookupcache[char] - if lookupmatch then - local ok - head,start,ok=handler(head,start,dataset,sequence,lookupmatch,rlmode,step,i) - if ok then - done=true - break - elseif not start then - break - end + local lookupmatch=lookupcache[char] + if lookupmatch then + local ok + head,start,ok=handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step) + if ok then + done=true + break + elseif not start then + break end - else - report_missing_coverage(dataset,sequence) end end if start then @@ -24946,28 +25928,29 @@ local function t_run_multiple(start,stop,font,attr,steps,nofsteps) for i=1,nofsteps do local step=steps[i] local lookupcache=step.coverage - if lookupcache then - local lookupmatch=lookupcache[char] - if lookupmatch then - local s=startnext - local ss=nil - local sstop=s==stop + local lookupmatch=lookupcache[char] + if lookupmatch then + local s=startnext + local ss=nil + local sstop=s==stop + if not s then + s=ss + ss=nil + end + while getid(s)==disc_code do + ss=getnext(s) + s=getfield(s,"replace") if not s then s=ss ss=nil end - while getid(s)==disc_code do - ss=getnext(s) - s=getfield(s,"replace") - if not s then - s=ss - ss=nil - end - end - local l=nil - local d=0 - while s do - local lg=lookupmatch[getchar(s)] + end + local l=nil + local d=0 + while s do + local char=ischar(s) + if char then + local lg=lookupmatch[char] if lg then if sstop then d=1 @@ -24992,13 +25975,13 @@ local function t_run_multiple(start,stop,font,attr,steps,nofsteps) else break end - end - if l and l.ligature then - lastd=d + else + break end end - else - report_missing_coverage(dataset,sequence) + if l and l.ligature then + lastd=d + end end end else @@ -25011,8 +25994,9 @@ local function t_run_multiple(start,stop,font,attr,steps,nofsteps) break end end + return 0 end -local function k_run_multiple(sub,injection,last,font,attr,steps,nofsteps,dataset,sequence,rlmode,handler) +local function k_run_multiple(sub,injection,last,font,attr,steps,nofsteps,dataset,sequence,rlmode,skiphash,handler) local a if attr then a=getattr(sub,0) @@ -25027,16 +26011,12 @@ local function k_run_multiple(sub,injection,last,font,attr,steps,nofsteps,datase for i=1,nofsteps do local step=steps[i] local lookupcache=step.coverage - if lookupcache then - local lookupmatch=lookupcache[char] - if lookupmatch then - local h,d,ok=handler(head,n,dataset,sequence,lookupmatch,step,rlmode,i,injection) - if ok then - return true - end + local lookupmatch=lookupcache[char] + if lookupmatch then + local h,d,ok=handler(sub,n,dataset,sequence,lookupmatch,rlmode,skiphash,step,injection) + if ok then + return true end - else - report_missing_coverage(dataset,sequence) end end end @@ -25044,182 +26024,209 @@ local function k_run_multiple(sub,injection,last,font,attr,steps,nofsteps,datase end end local function txtdirstate(start,stack,top,rlparmode) + local nxt=getnext(start) local dir=getdir(start) - local new=1 if dir=="+TRT" then top=top+1 stack[top]=dir - new=-1 + return nxt,top,-1 elseif dir=="+TLT" then top=top+1 stack[top]=dir + return nxt,top,1 elseif dir=="-TRT" or dir=="-TLT" then - top=top-1 - if stack[top]=="+TRT" then - new=-1 + if top==1 then + return nxt,0,rlparmode + else + top=top-1 + if stack[top]=="+TRT" then + return nxt,top,-1 + else + return nxt,top,1 + end end else - new=rlparmode + return nxt,top,rlparmode end - if trace_directions then - report_process("directions after txtdir %a: parmode %a, txtmode %a, level %a",dir,mref(rlparmode),mref(new),top) - end - return getnext(start),top,new end local function pardirstate(start) + local nxt=getnext(start) local dir=getdir(start) - local new=0 if dir=="TLT" then - new=1 + return nxt,1,1 elseif dir=="TRT" then - new=-1 - end - if trace_directions then - report_process("directions after pardir %a: parmode %a",dir,mref(new)) + return nxt,-1,-1 + else + return nxt,0,0 end - return getnext(start),new,new end otf.helpers=otf.helpers or {} otf.helpers.txtdirstate=txtdirstate otf.helpers.pardirstate=pardirstate -local function featuresprocessor(head,font,attr,direction) - local sequences=sequencelists[font] - if not sequencelists then - return head,false - end - nesting=nesting+1 - if nesting==1 then - currentfont=font - tfmdata=fontdata[font] - descriptions=tfmdata.descriptions - characters=tfmdata.characters - local resources=tfmdata.resources - marks=resources.marks - classes=resources.classes - threshold, - factor=getthreshold(font) - checkmarks=tfmdata.properties.checkmarks - elseif currentfont~=font then - report_warning("nested call with a different font, level %s, quitting",nesting) - nesting=nesting-1 - return head,false - end - head=tonut(head) - if trace_steps then - checkstep(head) - end - local initialrl=direction=="TRT" and -1 or 0 - local done=false - local datasets=otf.dataset(tfmdata,font,attr) - local dirstack={} - sweephead={} - for s=1,#datasets do - local dataset=datasets[s] - local attribute=dataset[2] - local sequence=dataset[3] - local rlparmode=initialrl - local topstack=0 - local typ=sequence.type - local gpossing=typ=="gpos_single" or typ=="gpos_pair" - local handler=handlers[typ] - local steps=sequence.steps - local nofsteps=sequence.nofsteps - if not steps then - local h,d,ok=handler(head,head,dataset,sequence,nil,nil,nil,0,font,attr) - if ok then - done=true - if h then +do + local fastdisc=true + local testdics=false + directives.register("otf.fastdisc",function(v) fastdisc=v end) + local otfdataset=nil + local getfastdisc={ __index=function(t,k) + local v=usesfont(k,currentfont) + t[k]=v + return v + end } + local getfastspace={ __index=function(t,k) + local v=isspace(k,threshold) or false + t[k]=v + return v + end } + function otf.featuresprocessor(head,font,attr,direction,n) + local sequences=sequencelists[font] + nesting=nesting+1 + if nesting==1 then + currentfont=font + tfmdata=fontdata[font] + descriptions=tfmdata.descriptions + characters=tfmdata.characters + local resources=tfmdata.resources + marks=resources.marks + classes=resources.classes + threshold, + factor=getthreshold(font) + checkmarks=tfmdata.properties.checkmarks + if not otfdataset then + otfdataset=otf.dataset + end + discs=fastdisc and n and n>1 and setmetatable({},getfastdisc) + spaces=setmetatable({},getfastspace) + elseif currentfont~=font then + report_warning("nested call with a different font, level %s, quitting",nesting) + nesting=nesting-1 + return head,false + end + local head=tonut(head) + if trace_steps then + checkstep(head) + end + local initialrl=direction=="TRT" and -1 or 0 + local done=false + local datasets=otfdataset(tfmdata,font,attr) + local dirstack={} + sweephead={} + for s=1,#datasets do + local dataset=datasets[s] + local attribute=dataset[2] + local sequence=dataset[3] + local rlparmode=initialrl + local topstack=0 + local typ=sequence.type + local gpossing=typ=="gpos_single" or typ=="gpos_pair" + local forcetestrun=typ=="gsub_ligature" + local handler=handlers[typ] + local steps=sequence.steps + local nofsteps=sequence.nofsteps + local skiphash=sequence.skiphash + if not steps then + local h,ok=handler(head,dataset,sequence,initialrl,font,attr) + if ok then + done=true + end + if h and h~=head then head=h end - end - elseif typ=="gsub_reversecontextchain" then - local start=find_node_tail(head) - local rlmode=0 - while start do - local char=ischar(start,font) - if char then - local a - if attr then - a=getattr(start,0) - end - if not a or (a==attr) then - for i=1,nofsteps do - local step=steps[i] - local lookupcache=step.coverage - if lookupcache then - local lookupmatch=lookupcache[char] - if lookupmatch then - local ok - head,start,ok=handler(head,start,dataset,sequence,lookupmatch,rlmode,step,i) - if ok then - done=true - break + elseif typ=="gsub_reversecontextchain" then + local start=find_node_tail(head) + local rlmode=0 + local merged=steps.merged + while start do + local char=ischar(start,font) + if char then + local m=merged[char] + if m then + local a + if attr then + a=getattr(start,0) + end + if not a or (a==attr) then + for i=m[1],m[2] do + local step=steps[i] + local lookupcache=step.coverage + local lookupmatch=lookupcache[char] + if lookupmatch then + local ok + head,start,ok=handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step) + if ok then + done=true + break + end end end + if start then + start=getprev(start) + end else - report_missing_coverage(dataset,sequence) + start=getprev(start) end - end - if start then + else start=getprev(start) end else start=getprev(start) end - else - start=getprev(start) end - end - else - local start=head - local rlmode=initialrl - if nofsteps==1 then - local step=steps[1] - local lookupcache=step.coverage - if not lookupcache then - report_missing_coverage(dataset,sequence) - else + else + local start=head + local rlmode=initialrl + if nofsteps==1 then + local step=steps[1] + local lookupcache=step.coverage while start do local char,id=ischar(start,font) if char then - local a - if attr then - if getattr(start,0)==attr and (not attribute or getprop(start,a_state)==attribute) then - a=true - end - elseif not attribute or getprop(start,a_state)==attribute then - a=true - end - if a then + if skiphash and skiphash[char] then + start=getnext(start) + else local lookupmatch=lookupcache[char] if lookupmatch then - local ok - head,start,ok=handler(head,start,dataset,sequence,lookupmatch,rlmode,step,1) - if ok then - done=true + local a + if attr then + if getattr(start,0)==attr and (not attribute or getprop(start,a_state)==attribute) then + a=true + end + elseif not attribute or getprop(start,a_state)==attribute then + a=true end - end - if start then + if a then + local ok + head,start,ok=handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step) + if ok then + done=true + end + if start then + start=getnext(start) + end + else + start=getnext(start) + end + else start=getnext(start) end - else - start=getnext(start) end - elseif char==false then - start=getnext(start) - elseif id==glue_code then + elseif char==false or id==glue_code then start=getnext(start) elseif id==disc_code then - local ok - if gpossing then - start,ok=kernrun(start,k_run_single,font,attr,lookupcache,step,dataset,sequence,rlmode,handler) - elseif typ=="gsub_ligature" then - start,ok=testrun(start,t_run_single,c_run_single,font,attr,lookupcache,step,dataset,sequence,rlmode,handler) + if not discs or discs[start]==true then + local ok + if gpossing then + start,ok=kernrun(start,k_run_single,font,attr,lookupcache,step,dataset,sequence,rlmode,skiphash,handler) + elseif forcetestrun then + start,ok=testrun(start,t_run_single,c_run_single,font,attr,lookupcache,step,dataset,sequence,rlmode,skiphash,handler) + else + start,ok=comprun(start,c_run_single,font,attr,lookupcache,step,dataset,sequence,rlmode,skiphash,handler) + end + if ok then + done=true + end else - start,ok=comprun(start,c_run_single,font,attr,lookupcache,step,dataset,sequence,rlmode,handler) - end - if ok then - done=true + start=getnext(start) end elseif id==math_code then start=getnext(end_of_math(start)) @@ -25231,80 +26238,161 @@ local function featuresprocessor(head,font,attr,direction) start=getnext(start) end end - end - else - while start do - local char,id=ischar(start,font) - if char then - local a - if attr then - if getattr(start,0)==attr and (not attribute or getprop(start,a_state)==attribute) then - a=true - end - elseif not attribute or getprop(start,a_state)==attribute then - a=true - end - if a then - for i=1,nofsteps do - local step=steps[i] - local lookupcache=step.coverage - if lookupcache then - local lookupmatch=lookupcache[char] - if lookupmatch then - local ok - head,start,ok=handler(head,start,dataset,sequence,lookupmatch,rlmode,step,i) - if ok then - done=true - break - elseif not start then - break + else + local merged=steps.merged + while start do + local char,id=ischar(start,font) + if char then + if skiphash and skiphash[char] then + start=getnext(start) + else + local m=merged[char] + if m then + local a + if attr then + if getattr(start,0)==attr and (not attribute or getprop(start,a_state)==attribute) then + a=true end + elseif not attribute or getprop(start,a_state)==attribute then + a=true + end + if a then + for i=m[1],m[2] do + local step=steps[i] + local lookupcache=step.coverage + local lookupmatch=lookupcache[char] + if lookupmatch then + local ok + head,start,ok=handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step) + if ok then + done=true + break + elseif not start then + break + end + end + end + if start then + start=getnext(start) + end + else + start=getnext(start) end else - report_missing_coverage(dataset,sequence) + start=getnext(start) end end - if start then + elseif char==false or id==glue_code then + start=getnext(start) + elseif id==disc_code then + if not discs or discs[start]==true then + local ok + if gpossing then + start,ok=kernrun(start,k_run_multiple,font,attr,steps,nofsteps,dataset,sequence,rlmode,skiphash,handler) + elseif forcetestrun then + start,ok=testrun(start,t_run_multiple,c_run_multiple,font,attr,steps,nofsteps,dataset,sequence,rlmode,skiphash,handler) + else + start,ok=comprun(start,c_run_multiple,font,attr,steps,nofsteps,dataset,sequence,rlmode,skiphash,handler) + end + if ok then + done=true + end + else start=getnext(start) end + elseif id==math_code then + start=getnext(end_of_math(start)) + elseif id==dir_code then + start,topstack,rlmode=txtdirstate(start,dirstack,topstack,rlparmode) + elseif id==localpar_code then + start,rlparmode,rlmode=pardirstate(start) else start=getnext(start) end - elseif char==false then - start=getnext(start) - elseif id==glue_code then + end + end + end + if trace_steps then + registerstep(head) + end + end + nesting=nesting-1 + head=tonode(head) + return head,done + end + function otf.datasetpositionprocessor(head,font,direction,dataset) + currentfont=font + tfmdata=fontdata[font] + descriptions=tfmdata.descriptions + characters=tfmdata.characters + local resources=tfmdata.resources + marks=resources.marks + classes=resources.classes + threshold, + factor=getthreshold(font) + checkmarks=tfmdata.properties.checkmarks + if type(dataset)=="number" then + dataset=otfdataset(tfmdata,font,0)[dataset] + end + local sequence=dataset[3] + local typ=sequence.type + local handler=handlers[typ] + local steps=sequence.steps + local nofsteps=sequence.nofsteps + local head=tonut(head) + local done=false + local dirstack={} + local start=head + local initialrl=direction=="TRT" and -1 or 0 + local rlmode=initialrl + local rlparmode=initialrl + local topstack=0 + local merged=steps.merged + local position=0 + while start do + local char,id=ischar(start,font) + if char then + position=position+1 + local m=merged[char] + if m then + if skiphash and skiphash[char] then start=getnext(start) - elseif id==disc_code then - local ok - if gpossing then - start,ok=kernrun(start,k_run_multiple,font,attr,steps,nofsteps,dataset,sequence,rlmode,handler) - elseif typ=="gsub_ligature" then - start,ok=testrun(start,t_run_multiple,c_run_multiple,font,attr,steps,nofsteps,dataset,sequence,rlmode,handler) - else - start,ok=comprun(start,c_run_multiple,font,attr,steps,nofsteps,dataset,sequence,rlmode,handler) + else + for i=m[1],m[2] do + local step=steps[i] + local lookupcache=step.coverage + local lookupmatch=lookupcache[char] + if lookupmatch then + local ok + head,start,ok=handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step) + if ok then + break + elseif not start then + break + end + end end - if ok then - done=true + if start then + start=getnext(start) end - elseif id==math_code then - start=getnext(end_of_math(start)) - elseif id==dir_code then - start,topstack,rlmode=txtdirstate(start,dirstack,topstack,rlparmode) - elseif id==localpar_code then - start,rlparmode,rlmode=pardirstate(start) - else - start=getnext(start) end + else + start=getnext(start) end + elseif char==false or id==glue_code then + start=getnext(start) + elseif id==math_code then + start=getnext(end_of_math(start)) + elseif id==dir_code then + start,topstack,rlmode=txtdirstate(start,dirstack,topstack,rlparmode) + elseif id==localpar_code then + start,rlparmode,rlmode=pardirstate(start) + else + start=getnext(start) end end - if trace_steps then - registerstep(head) - end + return tonode(head) end - nesting=nesting-1 - head=tonode(head) - return head,done end local plugins={} otf.plugins=plugins @@ -25313,24 +26401,24 @@ function otf.registerplugin(name,f) plugins[name]={ name,f } end end -local function plugininitializer(tfmdata,value) +function otf.plugininitializer(tfmdata,value) if type(value)=="string" then tfmdata.shared.plugin=plugins[value] end end -local function pluginprocessor(head,font) +function otf.pluginprocessor(head,font,attr,direction) local s=fontdata[font].shared local p=s and s.plugin if p then if trace_plugins then report_process("applying plugin %a",p[1]) end - return p[2](head,font) + return p[2](head,font,attr,direction) else return head,false end end -local function featuresinitializer(tfmdata,value) +function otf.featuresinitializer(tfmdata,value) end registerotffeature { name="features", @@ -25338,53 +26426,87 @@ registerotffeature { default=true, initializers={ position=1, - node=featuresinitializer, - plug=plugininitializer, + node=otf.featuresinitializer, + plug=otf.plugininitializer, }, processors={ - node=featuresprocessor, - plug=pluginprocessor, + node=otf.featuresprocessor, + plug=otf.pluginprocessor, } } -otf.nodemodeinitializer=featuresinitializer -otf.featuresprocessor=featuresprocessor otf.handlers=handlers local setspacekerns=nodes.injections.setspacekerns if not setspacekerns then os.exit() end +local tag="kern" if fontfeatures then - function otf.handlers.trigger_space_kerns(head,start,dataset,sequence,_,_,_,_,font,attr) + function handlers.trigger_space_kerns(head,dataset,sequence,initialrl,font,attr) local features=fontfeatures[font] - local enabled=features and features.spacekern and features.kern + local enabled=features and features.spacekern and features[tag] if enabled then setspacekerns(font,sequence) end - return head,start,enabled + return head,enabled end else - function otf.handlers.trigger_space_kerns(head,start,dataset,sequence,_,_,_,_,font,attr) + function handlers.trigger_space_kerns(head,dataset,sequence,initialrl,font,attr) local shared=fontdata[font].shared local features=shared and shared.features - local enabled=features and features.spacekern and features.kern + local enabled=features and features.spacekern and features[tag] if enabled then setspacekerns(font,sequence) end - return head,start,enabled + return head,enabled end end local function hasspacekerns(data) - local sequences=data.resources.sequences - for i=1,#sequences do - local sequence=sequences[i] - local steps=sequence.steps - if steps and sequence.features.kern then - for i=1,#steps do - local coverage=steps[i].coverage - if not coverage then - elseif coverage[32] then - return true - else - for k,v in next,coverage do - if v[32] then - return true + local resources=data.resources + local sequences=resources.sequences + local validgpos=resources.features.gpos + if validgpos and sequences then + for i=1,#sequences do + local sequence=sequences[i] + local steps=sequence.steps + if steps and sequence.features[tag] then + local kind=sequence.type + if kind=="gpos_pair" or kind=="gpos_single" then + for i=1,#steps do + local step=steps[i] + local coverage=step.coverage + local rules=step.rules + if rules then + elseif not coverage then + elseif kind=="gpos_single" then + elseif kind=="gpos_pair" then + local format=step.format + if format=="move" or format=="kern" then + local kerns=coverage[32] + if kerns then + return true + end + for k,v in next,coverage do + if v[32] then + return true + end + end + elseif format=="pair" then + local kerns=coverage[32] + if kerns then + for k,v in next,kerns do + local one=v[1] + if one and one~=true then + return true + end + end + end + for k,v in next,coverage do + local kern=v[32] + if kern then + local one=kern[1] + if one and one~=true then + return true + end + end + end + end end end end @@ -25402,103 +26524,110 @@ otf.readers.registerextender { local function spaceinitializer(tfmdata,value) local resources=tfmdata.resources local spacekerns=resources and resources.spacekerns - local properties=tfmdata.properties if value and spacekerns==nil then + local rawdata=tfmdata.shared and tfmdata.shared.rawdata + local properties=rawdata.properties if properties and properties.hasspacekerns then local sequences=resources.sequences - local left={} - local right={} - local last=0 - local feat=nil - for i=1,#sequences do - local sequence=sequences[i] - local steps=sequence.steps - if steps then - local kern=sequence.features.kern - if kern then - if feat then - for script,languages in next,kern do - local f=feat[script] - if f then - for l in next,languages do - f[l]=true - end - else - feat[script]=languages - end - end - else - feat=kern - end - for i=1,#steps do - local step=steps[i] - local coverage=step.coverage - local rules=step.rules - local format=step.format - if rules then - elseif coverage then - local single=format==gpos_single - local kerns=coverage[32] - if kerns then - for k,v in next,kerns do - if type(v)~="table" then - right[k]=v - elseif single then - right[k]=v[3] - else - local one=v[1] - if one then - right[k]=one[3] + local validgpos=resources.features.gpos + if validgpos and sequences then + local left={} + local right={} + local last=0 + local feat=nil + for i=1,#sequences do + local sequence=sequences[i] + local steps=sequence.steps + if steps then + local kern=sequence.features[tag] + if kern then + local kind=sequence.type + if kind=="gpos_pair" or kind=="gpos_single" then + if feat then + for script,languages in next,kern do + local f=feat[script] + if f then + for l in next,languages do + f[l]=true end + else + feat[script]=languages end end + else + feat=kern end - for k,v in next,coverage do - local kern=v[32] - if kern then - if type(kern)~="table" then - left[k]=kern - elseif single then - left[k]=kern[3] - else - local one=kern[1] - if one then - left[k]=one[3] + for i=1,#steps do + local step=steps[i] + local coverage=step.coverage + local rules=step.rules + if rules then + elseif not coverage then + elseif kind=="gpos_single" then + elseif kind=="gpos_pair" then + local format=step.format + if format=="move" or format=="kern" then + local kerns=coverage[32] + if kerns then + for k,v in next,kerns do + right[k]=v + end + end + for k,v in next,coverage do + local kern=v[32] + if kern then + left[k]=kern + end + end + elseif format=="pair" then + local kerns=coverage[32] + if kerns then + for k,v in next,kerns do + local one=v[1] + if one and one~=true then + right[k]=one[3] + end + end + end + for k,v in next,coverage do + local kern=v[32] + if kern then + local one=kern[1] + if one and one~=true then + left[k]=one[3] + end + end end end end end + last=i end + else end - last=i end - else end - end - left=next(left) and left or false - right=next(right) and right or false - if left or right then - spacekerns={ - left=left, - right=right, - } - if last>0 then - local triggersequence={ - features={ kern=feat or { dflt={ dflt=true,} } }, - flags=noflags, - name="trigger_space_kerns", - order={ "kern" }, - type="trigger_space_kerns", + left=next(left) and left or false + right=next(right) and right or false + if left or right then + spacekerns={ left=left, right=right, } - insert(sequences,last,triggersequence) + if last>0 then + local triggersequence={ + features={ [tag]=feat or { dflt={ dflt=true,} } }, + flags=noflags, + name="trigger_space_kerns", + order={ tag }, + type="trigger_space_kerns", + left=left, + right=right, + } + insert(sequences,last,triggersequence) + end end - else - spacekerns=false end - else - spacekerns=false end resources.spacekerns=spacekerns end @@ -25803,7 +26932,6 @@ local sequence_reorder_matras={ nofsteps=1, steps={ { - osdstep=true, coverage=pre_mark, } } @@ -25817,7 +26945,6 @@ local sequence_reorder_reph={ nofsteps=1, steps={ { - osdstep=true, coverage={}, } } @@ -25831,7 +26958,6 @@ local sequence_reorder_pre_base_reordering_consonants={ nofsteps=1, steps={ { - osdstep=true, coverage={}, } } @@ -25844,7 +26970,7 @@ local sequence_remove_joiners={ type="devanagari_remove_joiners", nofsteps=1, steps={ - { osdstep=true, + { coverage=both_joiners_true, }, } @@ -25953,24 +27079,21 @@ local function initializedevanagi(tfmdata) if coverage then local reph=false if kind=="rphf" then - if true then - for k,v in next,ra do - local r=coverage[k] - if r then - local h=false - for k,v in next,halant do - local h=r[k] - if h then - reph=h.ligature or false - break - end - end - if reph then + for k,v in next,ra do + local r=coverage[k] + if r then + local h=false + for k,v in next,halant do + local h=r[k] + if h then + reph=h.ligature or false break end end + if reph then + break + end end - else end end seqsubset[#seqsubset+1]={ kind,coverage,reph } @@ -26729,7 +27852,7 @@ local function dev2_reorder(head,start,stop,font,attr,nbspaces) next=getnext(current) local tmp=getnext(next) local changestop=next==stop - setnext(next,nil) + setnext(next) setprop(current,a_state,s_pref) current=processcharacters(current,font) setprop(current,a_state,s_blwf) @@ -27489,20 +28612,20 @@ do -- begin closure to overcome local limits and interference if not modules then modules={} end modules ['font-ocl']={ version=1.001, - comment="companion to font-otf.lua (context)", + comment="companion to font-ini.mkiv", author="Hans Hagen, PRAGMA-ADE, Hasselt NL", copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" } -local tostring,next,format=tostring,next,string.format +local tostring,tonumber,next=tostring,tonumber,next local round,max=math.round,math.round local sortedkeys,sortedhash=table.sortedkeys,table.sortedhash local setmetatableindex=table.setmetatableindex local formatters=string.formatters local tounicode=fonts.mappings.tounicode local otf=fonts.handlers.otf -local f_color=formatters["pdf:direct:%f %f %f rg"] -local f_gray=formatters["pdf:direct:%f g"] +local f_color=formatters["%.3f %.3f %.3f rg"] +local f_gray=formatters["%.3f g"] if context then local startactualtext=nil local stopactualtext=nil @@ -27523,7 +28646,7 @@ else end local sharedpalettes={} local hash=setmetatableindex(function(t,k) - local v={ "special",k } + local v={ "pdf","direct",k } t[k]=v return v end) @@ -27547,11 +28670,11 @@ if context then t=transparencies[v] end if c and t then - values[i]=hash["pdf:direct:"..lpdf.color(1,c).." "..lpdf.transparency(t)] + values[i]=hash[lpdf.color(1,c).." "..lpdf.transparency(t)] elseif c then - values[i]=hash["pdf:direct:"..lpdf.color(1,c)] + values[i]=hash[lpdf.color(1,c)] elseif t then - values[i]=hash["pdf:direct:"..lpdf.color(1,t)] + values[i]=hash[lpdf.color(1,t)] end end end @@ -27582,6 +28705,12 @@ local function convert(t,k) t[k]=v return v end +local start={ "pdf","mode","font" } +local push={ "pdf","page","q" } +local pop={ "pdf","page","Q" } +if not LUATEXFUNCTIONALITY or LUATEXFUNCTIONALITY<6472 then + start={ "nop" } +end local function initializecolr(tfmdata,kind,value) if value then local resources=tfmdata.resources @@ -27612,12 +28741,10 @@ local function initializecolr(tfmdata,kind,value) local getactualtext=otf.getactualtext local default=colorvalues[#colorvalues] local b,e=getactualtext(tounicode(0xFFFD)) - local start={ "special","pdf:page:q" } - local stop={ "special","pdf:raw:Q" } - local actualb={ "special","pdf:page:"..b } - local actuale={ "special","pdf:page:"..e } + local actualb={ "pdf","page",b } + local actuale={ "pdf","page",e } local cache=setmetatableindex(function(t,k) - local v={ "char",k } + local v={ "char",k } t[k]=v return v end) @@ -27632,14 +28759,20 @@ local function initializecolr(tfmdata,kind,value) local goback=w~=0 and widths[w] or nil local t={ start, - not u and actualb or { "special","pdf:raw:"..getactualtext(tounicode(u)) } + not u and actualb or { "pdf","page",(getactualtext(tounicode(u))) } } local n=2 local l=nil + local f=false for i=1,s do local entry=colorlist[i] local v=colorvalues[entry.class] or default if v and l~=v then + if f then + n=n+1 t[n]=pop + end + n=n+1 t[n]=push + f=true n=n+1 t[n]=v l=v end @@ -27648,8 +28781,10 @@ local function initializecolr(tfmdata,kind,value) n=n+1 t[n]=goback end end + if f then + n=n+1 t[n]=pop + end n=n+1 t[n]=actuale - n=n+1 t[n]=stop character.commands=t end end @@ -27697,6 +28832,9 @@ local function pdftovirtual(tfmdata,pdfshapes,kind) } local getactualtext=otf.getactualtext local storepdfdata=otf.storepdfdata + local b,e=getactualtext(tounicode(0xFFFD)) + local actualb={ "pdf","page",b } + local actuale={ "pdf","page",e } for unicode,character in sortedhash(characters) do local index=character.index if index then @@ -27717,16 +28855,16 @@ local function pdftovirtual(tfmdata,pdfshapes,kind) if data then local setcode,name,nilcode=storepdfdata(data) if name then - local bt,et=getactualtext(unicode) + local bt=unicode and getactualtext(unicode) local wd=character.width or 0 local ht=character.height or 0 local dp=character.depth or 0 character.commands={ - { "special","pdf:direct:"..bt }, + not unicode and actualb or { "pdf","page",(getactualtext(unicode)) }, { "down",dp+dy*hfactor }, { "right",dx*hfactor }, { "image",{ filename=name,width=wd,height=ht,depth=dp } }, - { "special","pdf:direct:"..et }, + actuale, } character[kind]=true end @@ -27937,7 +29075,7 @@ do -- begin closure to overcome local limits and interference if not modules then modules={} end modules ['font-otc']={ version=1.001, - comment="companion to font-otf.lua (context)", + comment="companion to font-ini.mkiv", author="Hans Hagen, PRAGMA-ADE, Hasselt NL", copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" @@ -27946,12 +29084,17 @@ local format,insert,sortedkeys,tohash=string.format,table.insert,table.sortedkey local type,next=type,next local lpegmatch=lpeg.match local utfbyte,utflen,utfsplit=utf.byte,utf.len,utf.split +local match=string.match +local sortedhash=table.sortedhash local trace_loading=false trackers.register("otf.loading",function(v) trace_loading=v end) local report_otf=logs.reporter("fonts","otf loading") local fonts=fonts local otf=fonts.handlers.otf local registerotffeature=otf.features.register local setmetatableindex=table.setmetatableindex +local checkmerge=fonts.helpers.checkmerge +local checkflags=fonts.helpers.checkflags +local checksteps=fonts.helpers.checksteps local normalized={ substitution="substitution", single="substitution", @@ -27960,6 +29103,7 @@ local normalized={ multiple="multiple", kern="kern", pair="pair", + single="single", chainsubstitution="chainsubstitution", chainposition="chainposition", } @@ -27970,6 +29114,7 @@ local types={ multiple="gsub_multiple", kern="gpos_pair", pair="gpos_pair", + single="gpos_single", chainsubstitution="gsub_contextchain", chainposition="gpos_contextchain", } @@ -28299,14 +29444,13 @@ local function addfeature(data,feature,specifications) end return coverage end + local prepare_single=prepare_pair local function prepare_chain(list,featuretype,sublookups) local rules=list.rules local coverage={} if rules then local rulehash={} local rulesize=0 - local sequence={} - local nofsequences=0 local lookuptype=types[featuretype] for nofrules=1,#rules do local rule=rules[nofrules] @@ -28337,7 +29481,7 @@ local function addfeature(data,feature,specifications) local lookups=rule.lookups or false local subtype=nil if lookups and sublookups then - for k,v in next,lookups do + for k,v in sortedhash(lookups) do local t=type(v) if t=="table" then for i=1,#v do @@ -28386,14 +29530,16 @@ local function addfeature(data,feature,specifications) replacements, subtype, } - for unic in next,sequence[start] do + for unic in sortedhash(sequence[start]) do local cu=coverage[unic] if not cu then coverage[unic]=rulehash end end + sequence.n=nofsequences end end + rulehash.n=rulesize end return coverage end @@ -28431,9 +29577,9 @@ local function addfeature(data,feature,specifications) local s=sequences[i] local f=s.features if f then - for k in next,f do + for k in sortedhash(f) do if k==position then - index=i + index=i break end end @@ -28487,6 +29633,7 @@ local function addfeature(data,feature,specifications) local steps={} local sublookups=specification.lookups local category=nil + checkflags(specification,resources) if sublookups then local s={} for i=1,#sublookups do @@ -28508,18 +29655,23 @@ local function addfeature(data,feature,specifications) coverage=prepare_alternate(list,featuretype,nocheck) elseif featuretype=="multiple" then coverage=prepare_multiple(list,featuretype,nocheck) - elseif featuretype=="kern" then - format="kern" + elseif featuretype=="kern" or featuretype=="move" then + format=featuretype coverage=prepare_kern(list,featuretype) elseif featuretype=="pair" then format="pair" coverage=prepare_pair(list,featuretype) + elseif featuretype=="single" then + format="single" + coverage=prepare_single(list,featuretype) end if coverage and next(coverage) then nofsteps=nofsteps+1 steps[nofsteps]=register(coverage,featuretype,format,feature,nofsteps,descriptions,resources) end end + checkmerge(specification) + checksteps(specification) s[i]={ [stepkey]=steps, nofsteps=nofsteps, @@ -28545,14 +29697,18 @@ local function addfeature(data,feature,specifications) elseif featuretype=="multiple" then category="gsub" coverage=prepare_multiple(list,featuretype,nocheck) - elseif featuretype=="kern" then + elseif featuretype=="kern" or featuretype=="move" then category="gpos" - format="kern" + format=featuretype coverage=prepare_kern(list,featuretype) elseif featuretype=="pair" then category="gpos" format="pair" coverage=prepare_pair(list,featuretype) + elseif featuretype=="single" then + category="gpos" + format="single" + coverage=prepare_single(list,featuretype) elseif featuretype=="chainsubstitution" then category="gsub" coverage=prepare_chain(list,featuretype,sublookups) @@ -28588,6 +29744,9 @@ local function addfeature(data,feature,specifications) nofsteps=nofsteps, type=steptype, } + checkflags(sequence,resources) + checkmerge(sequence) + checksteps(sequence) local first,last=getrange(sequences,category) inject(specification,sequences,sequence,first,last,category,feature) local features=fontfeatures[category] @@ -28746,7 +29905,8 @@ registerotffeature { local lookups={} local protect={} local revert={} -local zwj={ 0x200C } +local zwjchar=0x200C +local zwj={ zwjchar } otf.addfeature { name="blockligatures", type="chainsubstitution", @@ -28785,19 +29945,44 @@ registerotffeature { } local settings_to_array=utilities.parsers and utilities.parsers.settings_to_array or function(s) return string.split(s,",") end +local splitter=lpeg.splitat(":") local function blockligatures(str) local t=settings_to_array(str) for i=1,#t do - local ti=utfsplit(t[i]) - if #ti>1 then - local one=ti[1] - local two=ti[2] - lookups[one]={ one,0x200C } + local ti=t[i] + local before,current,after=lpegmatch(splitter,ti) + if current and after then + if before then + before=utfsplit(before) + for i=1,#before do + before[i]={ before[i] } + end + end + if current then + current=utfsplit(current) + end + if after then + after=utfsplit(after) + for i=1,#after do + after[i]={ after[i] } + end + end + else + before=nil + current=utfsplit(ti) + after=nil + end + if #current>1 then + local one=current[1] + local two=current[2] + lookups[one]={ one,zwjchar } local one={ one } local two={ two } local new=#protect+1 protect[new]={ + before=before, current={ one,two }, + after=after, lookups={ 1 }, } revert[new]={ @@ -28845,7 +30030,7 @@ local afm=handlers.afm or {} handlers.afm=afm local readers=afm.readers or {} afm.readers=readers -afm.version=1.512 +afm.version=1.513 local get_indexes,get_shapes do local decrypt @@ -28869,7 +30054,7 @@ do local dup=P("dup") local put=P("put") local array=P("array") - local name=P("/")*C((R("az")+R("AZ")+R("09")+S("-_."))^1) + local name=P("/")*C((R("az","AZ","09")+S("-_."))^1) local digits=R("09")^1 local cardinal=digits/tonumber local spaces=P(" ")^1 @@ -28880,30 +30065,38 @@ do m=size return position+1 end - local setroutine=function(str,position,index,size) + local setroutine=function(str,position,index,size,filename) local forward=position+tonumber(size) local stream=decrypt(sub(str,position+1,forward),4330,4) routines[index]={ byte(stream,1,#stream) } return forward end - local setvector=function(str,position,name,size) + local setvector=function(str,position,name,size,filename) local forward=position+tonumber(size) if n>=m then return #str elseif forward<#str then + if n==0 and name~=".notdef" then + report_pfb("reserving .notdef at index 0 in %a",filename) + n=n+1 + end vector[n]=name - n=n+1 + n=n+1 return forward else return #str end end - local setshapes=function(str,position,name,size) + local setshapes=function(str,position,name,size,filename) local forward=position+tonumber(size) local stream=sub(str,position+1,forward) if n>m then return #str elseif forward<#str then + if n==0 and name~=".notdef" then + report_pfb("reserving .notdef at index 0 in %a",filename) + n=n+1 + end vector[n]=name n=n+1 chars [n]=decrypt(stream,4330,4) @@ -28916,11 +30109,11 @@ do local p_np=spacing*(P("NP")+P("|")) local p_nd=spacing*(P("ND")+P("|")) local p_filterroutines= - (1-subroutines)^0*subroutines*spaces*Cmt(cardinal,initialize)*(Cmt(cardinal*spaces*cardinal*p_rd,setroutine)*p_np+P(1))^1 + (1-subroutines)^0*subroutines*spaces*Cmt(cardinal,initialize)*(Cmt(cardinal*spaces*cardinal*p_rd*Carg(1),setroutine)*p_np+P(1))^1 local p_filtershapes= - (1-charstrings)^0*charstrings*spaces*Cmt(cardinal,initialize)*(Cmt(name*spaces*cardinal*p_rd,setshapes)*p_nd+P(1))^1 + (1-charstrings)^0*charstrings*spaces*Cmt(cardinal,initialize)*(Cmt(name*spaces*cardinal*p_rd*Carg(1),setshapes)*p_nd+P(1))^1 local p_filternames=Ct ( - (1-charstrings)^0*charstrings*spaces*Cmt(cardinal,initialize)*(Cmt(name*spaces*cardinal,setvector)+P(1))^1 + (1-charstrings)^0*charstrings*spaces*Cmt(cardinal,initialize)*(Cmt(name*spaces*cardinal*Carg(1),setvector)+P(1))^1 ) local p_filterencoding=(1-encoding)^0*encoding*spaces*digits*spaces*array*(1-dup)^0*Cf( Ct("")*Cg(spacing*dup*spaces*cardinal*spaces*name*spaces*put)^1 @@ -28931,7 +30124,7 @@ do report_pfb("no data in %a",filename) return end - if not (find(data,"!PS%-AdobeFont%-") or find(data,"%%!FontType1")) then + if not (find(data,"!PS-AdobeFont-",1,true) or find(data,"%!FontType1",1,true)) then report_pfb("no font in %a",filename) return end @@ -28946,8 +30139,8 @@ do local glyphs={} routines,vector,chars={},{},{} if shapestoo then - lpegmatch(p_filterroutines,binary) - lpegmatch(p_filtershapes,binary) + lpegmatch(p_filterroutines,binary,1,filename) + lpegmatch(p_filtershapes,binary,1,filename) local data={ dictionaries={ { @@ -28959,7 +30152,7 @@ do } fonts.handlers.otf.readers.parsecharstrings(false,data,glyphs,true,true) else - lpegmatch(p_filternames,binary) + lpegmatch(p_filternames,binary,1,filename) end names=vector routines,vector,chars=nil,nil,nil @@ -28975,7 +30168,7 @@ do if trace_loading then report_afm("getting index data from %a",pfbname) end - for index=1,#vector do + for index=0,#vector do local name=vector[index] local char=characters[name] if char then @@ -28983,6 +30176,10 @@ do report_afm("glyph %a has index %a",name,index) end char.index=index + else + if trace_indexing then + report_afm("glyph %a has index %a but no data",name,index) + end end end end @@ -29088,7 +30285,6 @@ local p_parameters=P(false)+fontdata*((P("FontName")+P("FullName")+P("FamilyName +(fontdata*C("AXISHEIGHT")*number*rest)/set_1 ) local fullparser=(P("StartFontMetrics")*fontdata*name/start )*(p_charmetrics+p_kernpairs+p_parameters+(1-P("EndFontMetrics")) )^0*(P("EndFontMetrics")/stop ) -local fullparser=(P("StartFontMetrics")*fontdata*name/start )*(p_charmetrics+p_kernpairs+p_parameters+(1-P("EndFontMetrics")) )^0*(P("EndFontMetrics")/stop ) local infoparser=(P("StartFontMetrics")*fontdata*name/start )*(p_parameters+(1-P("EndFontMetrics")) )^0*(P("EndFontMetrics")/stop ) local function read(filename,parser) local afmblob=io.loaddata(filename) @@ -29174,12 +30370,11 @@ if not modules then modules={} end modules ['font-one']={ } local fonts,logs,trackers,containers,resolvers=fonts,logs,trackers,containers,resolvers local next,type,tonumber,rawget=next,type,tonumber,rawget -local match,gmatch,lower,gsub,strip,find=string.match,string.gmatch,string.lower,string.gsub,string.strip,string.find -local char,byte,sub=string.char,string.byte,string.sub +local match,gsub=string.match,string.gsub local abs=math.abs -local bxor,rshift=bit32.bxor,bit32.rshift local P,S,R,Cmt,C,Ct,Cs,Carg=lpeg.P,lpeg.S,lpeg.R,lpeg.Cmt,lpeg.C,lpeg.Ct,lpeg.Cs,lpeg.Carg local lpegmatch,patterns=lpeg.match,lpeg.patterns +local sortedhash=table.sortedhash local trace_features=false trackers.register("afm.features",function(v) trace_features=v end) local trace_indexing=false trackers.register("afm.indexing",function(v) trace_indexing=v end) local trace_loading=false trackers.register("afm.loading",function(v) trace_loading=v end) @@ -29188,6 +30383,7 @@ local report_afm=logs.reporter("fonts","afm loading") local setmetatableindex=table.setmetatableindex local derivetable=table.derive local findbinfile=resolvers.findbinfile +local privateoffset=fonts.constructors and fonts.constructors.privateoffset or 0xF0000 local definers=fonts.definers local readers=fonts.readers local constructors=fonts.constructors @@ -29200,7 +30396,7 @@ local afmfeatures=constructors.features.afm local registerafmfeature=afmfeatures.register local afmenhancers=constructors.enhancers.afm local registerafmenhancer=afmenhancers.register -afm.version=1.512 +afm.version=1.513 afm.cache=containers.define("fonts","one",afm.version,true) afm.autoprefixed=true afm.helpdata={} @@ -29258,9 +30454,9 @@ local function enhance_unify_names(data,filename) local unicodevector=fonts.encodings.agl.unicodes local unicodes={} local names={} - local private=constructors.privateoffset + local private=data.private or privateoffset local descriptions=data.descriptions - for name,blob in next,data.characters do + for name,blob in sortedhash(data.characters) do local code=unicodevector[name] if not code then code=lpegmatch(uparser,name) @@ -29297,12 +30493,12 @@ local function enhance_unify_names(data,filename) end end data.characters=nil + data.private=private local resources=data.resources local filename=resources.filename or file.removesuffix(file.basename(filename)) resources.filename=resolvers.unresolve(filename) resources.unicodes=unicodes resources.marks={} - resources.private=private end local everywhere={ ["*"]={ ["*"]=true } } local noflags={ false,false,false,false } @@ -29656,6 +30852,7 @@ local function copytotfm(data) properties.fullname=fullname properties.psname=fullname properties.name=filename or fullname or fontname + properties.private=properties.private or data.private or privateoffset if next(characters) then return { characters=characters, @@ -29867,7 +31064,7 @@ do -- begin closure to overcome local limits and interference if not modules then modules={} end modules ['font-afk']={ version=1.001, - comment="companion to font-afm.lua", + comment="companion to font-lib.mkiv", author="Hans Hagen, PRAGMA-ADE, Hasselt NL", copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files", @@ -30158,6 +31355,7 @@ local function read_from_tfm(specification) parameters.quad=parameters.quad or parameters[6] or 0 parameters.extra_space=parameters.extra_space or parameters[7] or 0 constructors.enhanceparameters(parameters) + properties.private=properties.private or tfmdata.private or privateoffset if newtfmdata then elseif constructors.resolvevirtualtoo then fonts.loggers.register(tfmdata,file.suffix(filename),specification) @@ -30304,7 +31502,7 @@ do local originals=tfmdata.characters local indices={} local parentfont={ "font",1 } - local private=fonts.constructors.privateoffset + local private=tfmdata or fonts.constructors.privateoffset local reported=encdone[tfmfile][encfile] local backmap=vector and table.swapped(vector) local done={} @@ -30371,6 +31569,7 @@ do tfmdata.tounicode=1 tfmdata.embedding="subset" tfmdata.usedbitmap=bitmap and virtualid + tfmdata.private=private return tfmdata end end @@ -30395,7 +31594,8 @@ end ]] local flushstreamobject=lpdf and lpdf.flushstreamobject local setfontattributes=pdf.setfontattributes - if not flushstreamobject then + if flushstreamobject then + else flushstreamobject=function(data) return pdf.obj { immediate=true, @@ -30601,7 +31801,6 @@ local allocate=utilities.storage.allocate local trace_defining=false trackers .register("fonts.defining",function(v) trace_defining=v end) local directive_embedall=false directives.register("fonts.embedall",function(v) directive_embedall=v end) trackers.register("fonts.loading","fonts.defining","otf.loading","afm.loading","tfm.loading") -trackers.register("fonts.all","fonts.*","otf.*","afm.*","tfm.*") local report_defining=logs.reporter("fonts","defining") local fonts=fonts local fontdata=fonts.hashes.identifiers @@ -30892,8 +32091,6 @@ function definers.loadfont(specification) end return tfmdata end -function constructors.checkvirtualids() -end function constructors.readanddefine(name,size) local specification=definers.analyze(name,size) local method=specification.method @@ -30907,7 +32104,6 @@ function constructors.readanddefine(name,size) local tfmdata=definers.loadfont(specification) if tfmdata then tfmdata.properties.hash=hash - constructors.checkvirtualids(tfmdata) id=font.define(tfmdata) definers.register(tfmdata,id) else @@ -30976,7 +32172,7 @@ function definers.read(specification,size,id) local properties=tfmdata.properties or {} local parameters=tfmdata.parameters or {} report_defining("using %a font with id %a, name %a, size %a, bytes %a, encoding %a, fullname %a, filename %a", - properties.format or "unknown",id,properties.name,parameters.size,properties.encodingbytes, + properties.format or "unknown",id or "-",properties.name,parameters.size,properties.encodingbytes, properties.encodingname,properties.fullname,basename(properties.filename)) end statistics.stoptiming(fonts) @@ -31086,6 +32282,7 @@ if context then end local fonts=fonts local otffeatures=fonts.constructors.features.otf +local getprivate=fonts.constructors.getprivate local function initializeitlc(tfmdata,value) if value then local parameters=tfmdata.parameters @@ -31303,14 +32500,12 @@ otffeatures.register { local setmetatableindex=table.setmetatableindex local function additalictowidth(tfmdata,key,value) local characters=tfmdata.characters - local resources=tfmdata.resources local additions={} - local private=resources.private for unicode,old_c in next,characters do local oldwidth=old_c.width local olditalic=old_c.italic if olditalic and olditalic~=0 then - private=private+1 + local private=getprivate(tfmdata) local new_c={ width=oldwidth+olditalic, height=old_c.height, @@ -31328,7 +32523,6 @@ local function additalictowidth(tfmdata,key,value) for k,v in next,additions do characters[k]=v end - resources.private=private end otffeatures.register { name="italicwidths", @@ -33423,6 +34617,7 @@ if context then texio.write_nl("fatal error: this module is not for context") os.exit() end +local next=next local fonts=fonts local nodes=nodes local nuts=nodes.nuts @@ -33464,7 +34659,7 @@ end function nodes.handlers.setbasemodepass(v) basemodepass=v end -function nodes.handlers.nodepass(head) +function nodes.handlers.nodepass(head,groupcode,size,packtype,direction) local fontdata=fonts.hashes.identifiers if fontdata then local nuthead=tonut(head) @@ -33474,6 +34669,7 @@ function nodes.handlers.nodepass(head) local basefont=nil local variants=nil local redundant=nil + local nofused=0 for n in traverse_id(glyph_code,nuthead) do local font=getfont(n) if font~=prevfont then @@ -33490,6 +34686,7 @@ function nodes.handlers.nodepass(head) local processors=shared.processes if processors and #processors>0 then usedfonts[font]=processors + nofused=nofused+1 elseif basemodepass then basefont={ n,nil } basefonts[#basefonts+1]=basefont @@ -33570,6 +34767,7 @@ function nodes.handlers.nodepass(head) local processors=shared.processes if processors and #processors>0 then usedfonts[font]=processors + nofused=nofused+1 end end end @@ -33581,7 +34779,7 @@ function nodes.handlers.nodepass(head) if next(usedfonts) then for font,processors in next,usedfonts do for i=1,#processors do - head=processors[i](head,font,0) or head + head=processors[i](head,font,0,direction,nofused) or head end end end @@ -33620,7 +34818,7 @@ function nodes.handlers.nodepass(head) end end function nodes.handlers.basepass(head) - if not basemodepass then + if basemodepass then head=n_ligaturing(head) head=n_kerning(head) end @@ -33630,9 +34828,9 @@ local nodepass=nodes.handlers.nodepass local basepass=nodes.handlers.basepass local injectpass=nodes.injections.handler local protectpass=nodes.handlers.protectglyphs -function nodes.simple_font_handler(head) +function nodes.simple_font_handler(head,groupcode,size,packtype,direction) if head then - head=nodepass(head) + head=nodepass(head,groupcode,size,packtype,direction) head=injectpass(head) if not basemodepass then head=basepass(head) diff --git a/tex/generic/context/luatex/luatex-fonts-mis.lua b/tex/generic/context/luatex/luatex-fonts-mis.lua new file mode 100644 index 000000000..02a5b60db --- /dev/null +++ b/tex/generic/context/luatex/luatex-fonts-mis.lua @@ -0,0 +1,32 @@ +if not modules then modules = { } end modules ['luatex-font-mis'] = { + version = 1.001, + comment = "companion to luatex-*.tex", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +if context then + texio.write_nl("fatal error: this module is not for context") + os.exit() +end + +local currentfont = font.current + +local hashes = fonts.hashes +local identifiers = hashes.identifiers or { } +local marks = hashes.marks or { } + +hashes.identifiers = identifiers +hashes.marks = marks + +table.setmetatableindex(marks,function(t,k) + if k == true then + return marks[currentfont()] + else + local resources = identifiers[k].resources or { } + local marks = resources.marks or { } + t[k] = marks + return marks + end +end) diff --git a/tex/generic/context/luatex/luatex-fonts.lua b/tex/generic/context/luatex/luatex-fonts.lua index 20690992c..ef3bb74dc 100644 --- a/tex/generic/context/luatex/luatex-fonts.lua +++ b/tex/generic/context/luatex/luatex-fonts.lua @@ -219,6 +219,7 @@ if non_generic_context.luatex_fonts.skip_loading ~= true then -- --reload --force --simple option). loadmodule('font-ini.lua') + loadmodule('luatex-fonts-mis.lua') loadmodule('font-con.lua') loadmodule('luatex-fonts-enc.lua') -- will load font-age on demand loadmodule('font-cid.lua') @@ -231,21 +232,6 @@ if non_generic_context.luatex_fonts.skip_loading ~= true then loadmodule('luatex-fonts-syn.lua') loadmodule('font-oti.lua') - - -- These are the old loader and processing modules. These use the built-in font loader and - -- will stay around (but not be extended), only fixed. - - -- font-otf.lua - -- font-otb.lua - -- font-inj.lua - -- font-ota.lua - -- font-otn.lua - -- font-otp.lua - - -- Here come the new loader and processing modules. The loader is written in Lua and although - -- initial loading is somewhat slower, identifying is faster, cached files can be slightly - -- more efficient, and processing is somewhat faster (only measureable on complex fonts). - loadmodule('font-otr.lua') loadmodule('font-cff.lua') loadmodule('font-ttf.lua') @@ -258,7 +244,6 @@ if non_generic_context.luatex_fonts.skip_loading ~= true then loadmodule('font-ots.lua') loadmodule('font-osd.lua') loadmodule('font-ocl.lua') -- svg needs 0.97 (for fix in memstreams) - loadmodule('font-otc.lua') -- type one code @@ -277,7 +262,7 @@ if non_generic_context.luatex_fonts.skip_loading ~= true then loadmodule('font-def.lua') loadmodule('font-xtx.lua') -- xetex compatible specifiers (plain/latex only) loadmodule('luatex-fonts-ext.lua') -- some extensions - -- loadmodule('luatex-fonts-lig.lua') -- and another one + loadmodule('luatex-fonts-lig.lua') -- and another one -- We need to plug into a callback and the following module implements the handlers. Actual -- plugging in happens later. diff --git a/tex/generic/context/luatex/luatex-gadgets.lua b/tex/generic/context/luatex/luatex-gadgets.lua index 8c835babb..60c21427d 100644 --- a/tex/generic/context/luatex/luatex-gadgets.lua +++ b/tex/generic/context/luatex/luatex-gadgets.lua @@ -16,14 +16,13 @@ gadgets = gadgets or { } -- global namespace -- marking content for optional removal -local marking = { } -gadgets.marking = marking +local marking = { } +gadgets.marking = marking -local marksignal = 5001 -- will be set in the tex module -local lastmarked = 0 -local marked = { } -local local_par = 6 -local whatsit_node = 8 +local marksignal = 5001 -- will be set in the tex module +local lastmarked = 0 +local marked = { } +local local_par_code = 9 function marking.setsignal(n) marksignal = tonumber(n) or marksignal @@ -53,9 +52,7 @@ function marking.remove(str) local first = last while true do local prev = first.prev - if not prev - or prev[marksignal] ~= attr - or (prev.id == whatsit_node and prev.subtype == local_par) then + if not prev or prev[marksignal] ~= attr or prev.id == local_par_code then break else first = prev diff --git a/tex/generic/context/luatex/luatex-math.tex b/tex/generic/context/luatex/luatex-math.tex index 6edc6f74b..4ed900ddc 100644 --- a/tex/generic/context/luatex/luatex-math.tex +++ b/tex/generic/context/luatex/luatex-math.tex @@ -2,8 +2,8 @@ %D [ file=luatex-math, %D version=2013.04.29, %D title=\LUATEX\ Support Macros, -%D subtitle=An exmaple of math, -%D author=Hans Hagen, +%D subtitle=An example of math, +%D author={Hans Hagen & Bruno Voisin}, %D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] %D This module is in no way a complete plain math implementation. I made this file @@ -18,6 +18,8 @@ % we provide a remap feature +% \protected makes our mp test work (no expansion) + \ifdefined\directlua \directlua{dofile(kpse.find_file('luatex-math.lua'))} \fi @@ -34,7 +36,7 @@ \let \sevenbf = \relax \let \fivebf = \relax -\def\latinmodern +\protected\def\latinmodern {\font\tenrm = file:lmroman10-regular.otf:+liga;+kern;+tlig;+trep at 10pt \font\sevenrm = file:lmroman7-regular.otf:+liga;+kern;+tlig;+trep at 7pt \font\fiverm = file:lmroman5-regular.otf:+liga;+kern;+tlig;+trep at 5pt @@ -63,7 +65,7 @@ % \tenrm} -\def\lucidabright +\protected\def\lucidabright {\font\tenrm = file:lucidabrightot.otf:+liga;+kern;+tlig;+trep at 10pt \font\sevenrm = file:lucidabrightot.otf:+liga;+kern;+tlig;+trep at 7pt \font\fiverm = file:lucidabrightot.otf:+liga;+kern;+tlig;+trep at 5pt @@ -112,12 +114,12 @@ % the following commands switch text as well as math -\def\rm{\fam0\relax\the\everymathrm\relax\tenrm\relax} -\def\it{\fam0\relax\the\everymathit\relax\tenit\relax} -\def\sl{\fam0\relax\the\everymathsl\relax\tensl\relax} -\def\bf{\fam0\relax\the\everymathbf\relax\tenbf\relax} -\def\bi{\fam0\relax\the\everymathbi\relax\tenbi\relax} -\def\tt{\fam0\relax\the\everymathtt\relax\tentt\relax} +\protected\def\rm{\fam0\relax\the\everymathrm\relax\tenrm\relax} +\protected\def\it{\fam0\relax\the\everymathit\relax\tenit\relax} +\protected\def\sl{\fam0\relax\the\everymathsl\relax\tensl\relax} +\protected\def\bf{\fam0\relax\the\everymathbf\relax\tenbf\relax} +\protected\def\bi{\fam0\relax\the\everymathbi\relax\tenbi\relax} +\protected\def\tt{\fam0\relax\the\everymathtt\relax\tentt\relax} % tex is fast enough for this kind of assignments: @@ -838,7 +840,69 @@ } \everymathtt {% - % not done + \Umathcode"0030="0"0"1D7F6% + \Umathcode"0031="0"0"1D7F7% + \Umathcode"0032="0"0"1D7F8% + \Umathcode"0033="0"0"1D7F9% + \Umathcode"0034="0"0"1D7FA% + \Umathcode"0035="0"0"1D7FB% + \Umathcode"0036="0"0"1D7FC% + \Umathcode"0037="0"0"1D7FD% + \Umathcode"0038="0"0"1D7FE% + \Umathcode"0039="0"0"1D7FF% + \Umathcode"0041="0"0"1D670% + \Umathcode"0042="0"0"1D671% + \Umathcode"0043="0"0"1D672% + \Umathcode"0044="0"0"1D673% + \Umathcode"0045="0"0"1D674% + \Umathcode"0046="0"0"1D675% + \Umathcode"0047="0"0"1D676% + \Umathcode"0048="0"0"1D677% + \Umathcode"0049="0"0"1D678% + \Umathcode"004A="0"0"1D679% + \Umathcode"004B="0"0"1D67A% + \Umathcode"004C="0"0"1D67B% + \Umathcode"004D="0"0"1D67C% + \Umathcode"004E="0"0"1D67D% + \Umathcode"004F="0"0"1D67E% + \Umathcode"0050="0"0"1D67F% + \Umathcode"0051="0"0"1D680% + \Umathcode"0052="0"0"1D681% + \Umathcode"0053="0"0"1D682% + \Umathcode"0054="0"0"1D683% + \Umathcode"0055="0"0"1D684% + \Umathcode"0056="0"0"1D685% + \Umathcode"0057="0"0"1D686% + \Umathcode"0058="0"0"1D687% + \Umathcode"0059="0"0"1D688% + \Umathcode"005A="0"0"1D689% + \Umathcode"0061="0"0"1D68A% + \Umathcode"0062="0"0"1D68B% + \Umathcode"0063="0"0"1D68C% + \Umathcode"0064="0"0"1D68D% + \Umathcode"0065="0"0"1D68E% + \Umathcode"0066="0"0"1D68F% + \Umathcode"0067="0"0"1D690% + \Umathcode"0068="0"0"1D691% + \Umathcode"0069="0"0"1D692% + \Umathcode"006A="0"0"1D693% + \Umathcode"006B="0"0"1D694% + \Umathcode"006C="0"0"1D695% + \Umathcode"006D="0"0"1D696% + \Umathcode"006E="0"0"1D697% + \Umathcode"006F="0"0"1D698% + \Umathcode"0070="0"0"1D699% + \Umathcode"0071="0"0"1D69A% + \Umathcode"0072="0"0"1D69B% + \Umathcode"0073="0"0"1D69C% + \Umathcode"0074="0"0"1D69D% + \Umathcode"0075="0"0"1D69E% + \Umathcode"0076="0"0"1D69F% + \Umathcode"0077="0"0"1D6A0% + \Umathcode"0078="0"0"1D6A1% + \Umathcode"0079="0"0"1D6A2% + \Umathcode"007A="0"0"1D6A3% + \relax } % Nothing special here: @@ -849,11 +913,11 @@ % much sense, it's more that in good old tex oldstyle was taken from % math fonts. So, just something compatible: -\def\oldstyle{\fam1\relax\tenos\relax} +\protected\def\oldstyle{\fam1\relax\tenos\relax} % Again a text and math one and it had better be used grouped. -\def\cal{\fam0\relax\the\everymathcal\relax\tenit\relax} +\protected\def\cal{\fam0\relax\the\everymathcal\relax\tenit\relax} \everymathcal {% \Umathcode"0041="0"0"1D49C% A @@ -1514,678 +1578,678 @@ % a couple of definitions (we could also use \mathchardef): -\def\acute {\Umathaccent"0"0"0000B4 } -\def\acwopencirclearrow {\Umathchar "3"0"0021BA } -\def\aleph {\Umathchar "0"0"002135 } -\def\Alpha {\Umathchar "0"0"000391 } -\def\alpha {\Umathchar "0"0"0003B1 } -\def\amalg {\Umathchar "2"0"002A3F } -\def\angle {\Umathchar "0"0"002220 } -\def\Angstrom {\Umathchar "0"0"00212B } -\def\approx {\Umathchar "3"0"002248 } -\def\approxEq {\Umathchar "3"0"002245 } -\def\approxeq {\Umathchar "3"0"00224A } -\def\approxnEq {\Umathchar "3"0"002247 } -\def\arrowvert {\Umathchar "0"0"00007C } -\def\Arrowvert {\Umathchar "0"0"002016 } -\def\ast {\Umathchar "2"0"002217 } -\def\ast {\Umathchar "2"0"002217 } -\def\asymp {\Umathchar "3"0"00224D } -\def\backepsilon {\Umathchar "0"0"0003F6 } -\def\backprime {\Umathchar "0"0"012035 } -\def\backsim {\Umathchar "3"0"00223D } -\def\backslash {\Umathchar "0"0"00005C } -\def\bar {\Umathaccent"0"0"0000AF } -\def\barleftarrow {\Umathchar "3"0"0021E4 } -\def\barleftarrowrightarrowbar {\Umathchar "3"0"0021B9 } -\def\barovernorthwestarrow {\Umathchar "3"0"0021B8 } -\def\barwedge {\Umathchar "2"0"0022BC } -\def\because {\Umathchar "3"0"002235 } -\def\Beta {\Umathchar "0"0"000392 } -\def\beta {\Umathchar "0"0"0003B2 } -\def\beth {\Umathchar "0"0"002136 } -\def\between {\Umathchar "3"0"00226C } -\def\bigcap {\Umathchar "1"0"0022C2 } -\def\bigcirc {\Umathchar "2"0"0025EF } -\def\bigcircle {\Umathchar "2"0"0020DD } -\def\bigcircle {\Umathchar "2"0"0020DD } -\def\bigcup {\Umathchar "1"0"0022C3 } -\def\bigdiamond {\Umathchar "0"0"0020DF } -\def\bigodot {\Umathchar "1"0"002A00 } -\def\bigoplus {\Umathchar "1"0"002A01 } -\def\bigotimes {\Umathchar "1"0"002A02 } -\def\bigsqcap {\Umathchar "1"0"002A05 } -\def\bigsqcup {\Umathchar "1"0"002A06 } -\def\bigsquare {\Umathchar "0"0"0020DE } -\def\bigstar {\Umathchar "0"0"002605 } -\def\bigtimes {\Umathchar "1"0"002A09 } -\def\bigtriangledown {\Umathchar "2"0"0025BD } -\def\bigtriangleup {\Umathchar "2"0"0025B3 } -\def\bigudot {\Umathchar "1"0"002A03 } -\def\biguplus {\Umathchar "1"0"002A04 } -\def\bigvee {\Umathchar "1"0"0022C1 } -\def\bigwedge {\Umathchar "1"0"0022C0 } -\def\blacklozenge {\Umathchar "0"0"002666 } -\def\blacksquare {\Umathchar "0"0"0025A0 } -\def\blacktriangle {\Umathchar "2"0"0025B2 } -\def\blacktriangledown {\Umathchar "2"0"0025BC } -\def\blacktriangleleft {\Umathchar "2"0"0025C0 } -\def\blacktriangleright {\Umathchar "2"0"0025B6 } -\def\bot {\Umathchar "0"0"0022A5 } -\def\bowtie {\Umathchar "3"0"0022C8 } -\def\Box {\Umathchar "0"0"0025A1 } -\def\boxdot {\Umathchar "2"0"0022A1 } -\def\boxminus {\Umathchar "2"0"00229F } -\def\boxplus {\Umathchar "2"0"00229E } -\def\boxtimes {\Umathchar "2"0"0022A0 } -%def\braceld {\Umathchar "0"0"000000 } -%def\bracerd {\Umathchar "0"0"000000 } -%def\bracelu {\Umathchar "0"0"000000 } -%def\braceru {\Umathchar "0"0"000000 } -\def\breve {\Umathaccent"0"0"0002D8 } -\def\bullet {\Umathchar "2"0"002022 } -\def\bullet {\Umathchar "2"0"002022 } -\def\Bumpeq {\Umathchar "3"0"00224E } -\def\cap {\Umathchar "2"0"002229 } -\def\Cap {\Umathchar "2"0"0022D2 } -\def\carriagereturn {\Umathchar "0"0"0021B5 } -\def\cdot {\Umathchar "2"0"0022C5 } -\def\cdotp {\Umathchar "6"0"0022C5 } -\def\cdots {\Umathchar "0"0"0022EF } -\def\centerdot {\Umathchar "2"0"0000B7 } -\def\check {\Umathaccent"0"0"0002C7 } -\def\checkmark {\Umathchar "0"0"002713 } -\def\Chi {\Umathchar "0"0"0003A7 } -\def\chi {\Umathchar "0"0"0003C7 } -\def\circ {\Umathchar "2"0"002218 } -\def\circeq {\Umathchar "3"0"002257 } -\def\circlearrowleft {\Umathchar "3"0"0021BB } -\def\circlearrowright {\Umathchar "3"0"0021BA } -\def\circledast {\Umathchar "2"0"00229B } -\def\circledcirc {\Umathchar "2"0"00229A } -\def\circleddash {\Umathchar "2"0"00229D } -\def\circledequals {\Umathchar "2"0"00229C } -\def\circledR {\Umathchar "0"0"0024C7 } -\def\circledS {\Umathchar "0"0"0024C8 } -\def\circleonrightarrow {\Umathchar "3"0"0021F4 } -\def\clubsuit {\Umathchar "0"0"002663 } -\def\colon {\Umathchar "6"0"002236 } -\def\colonequals {\Umathchar "3"0"002254 } -\def\complement {\Umathchar "0"0"002201 } -\def\complexes {\Umathchar "0"0"002102 } -\def\cong {\Umathchar "3"0"002245 } -\def\coprod {\Umathchar "1"0"002210 } -\def\cup {\Umathchar "2"0"00222A } -\def\Cup {\Umathchar "2"0"0022D3 } -\def\curlyeqprec {\Umathchar "3"0"0022DE } -\def\curlyeqsucc {\Umathchar "3"0"0022DF } -\def\curlyvee {\Umathchar "2"0"0022CE } -\def\curlywedge {\Umathchar "2"0"0022CF } -\def\curvearrowleft {\Umathchar "3"0"0021B6 } -\def\curvearrowright {\Umathchar "3"0"0021B7 } -\def\cwopencirclearrow {\Umathchar "3"0"0021BB } -\def\dag {\Umathchar "0"0"002020 } -\def\dagger {\Umathchar "2"0"002020 } -\def\daleth {\Umathchar "0"0"002138 } -\def\dasharrow {\Umathchar "3"0"0021E2 } -\def\dashedleftarrow {\Umathchar "3"0"00290C } -\def\dashedrightarrow {\Umathchar "3"0"00290D } -\def\dashv {\Umathchar "3"0"0022A3 } -\def\ddag {\Umathchar "0"0"002021 } -\def\ddagger {\Umathchar "2"0"002021 } -\def\dddot {\Umathaccent"0"0"0020DB } -\def\ddot {\Umathaccent"0"0"0000A8 } -\def\ddots {\Umathchar "0"0"0022F1 } -\def\Ddownarrow {\Umathchar "3"0"00290B } -\def\definedeq {\Umathchar "3"0"00225D } -\def\Delta {\Umathchar "0"0"000394 } -\def\delta {\Umathchar "0"0"0003B4 } -\def\diamond {\Umathchar "2"0"0022C4 } -\def\diamondsuit {\Umathchar "0"0"002662 } -\def\differentialD {\Umathchar "0"0"002145 } -\def\differentiald {\Umathchar "0"0"002146 } -\def\digamma {\Umathchar "0"0"0003DC } -\def\div {\Umathchar "2"0"0000F7 } -\def\divideontimes {\Umathchar "2"0"0022C7 } -\def\divides {\Umathchar "2"0"002223 } -\def\dot {\Umathaccent"0"0"0002D9 } -\def\doteq {\Umathchar "3"0"002250 } -\def\Doteq {\Umathchar "3"0"002251 } -\def\doteqdot {\Umathchar "3"0"002251 } -\def\dotminus {\Umathchar "2"0"002238 } -\def\dotplus {\Umathchar "2"0"002214 } -\def\dots {\Umathchar "0"0"002026 } -\def\dottedrightarrow {\Umathchar "3"0"002911 } -\def\doublecap {\Umathchar "2"0"0022D2 } -\def\doublecup {\Umathchar "2"0"0022D3 } -\def\doubleprime {\Umathchar "0"0"002033 } -\def\downarrow {\Umathchar "3"0"002193 } -\def\Downarrow {\Umathchar "3"0"0021D3 } -\def\downdasharrow {\Umathchar "3"0"0021E3 } -\def\downdownarrows {\Umathchar "3"0"0021CA } -\def\downharpoonleft {\Umathchar "3"0"0021C3 } -\def\downharpoonright {\Umathchar "3"0"0021C2 } -\def\downuparrows {\Umathchar "3"0"0021F5 } -\def\downwhitearrow {\Umathchar "0"0"0021E9 } -\def\downzigzagarrow {\Umathchar "3"0"0021AF } -\def\ell {\Umathchar "0"0"002113 } -\def\emptyset {\Umathchar "0"0"002205 } -\def\Epsilon {\Umathchar "0"0"000395 } -\def\epsilon {\Umathchar "0"0"0003F5 } -\def\eq {\Umathchar "3"0"00003D } -\def\eqcirc {\Umathchar "3"0"002256 } -\def\eqgtr {\Umathchar "3"0"0022DD } -\def\eqless {\Umathchar "3"0"0022DC } -\def\eqsim {\Umathchar "3"0"002242 } -\def\eqslantgtr {\Umathchar "3"0"002A96 } -\def\eqslantless {\Umathchar "3"0"002A95 } -\def\equalscolon {\Umathchar "3"0"002255 } -\def\equiv {\Umathchar "3"0"002261 } -\def\Eta {\Umathchar "0"0"000397 } -\def\eta {\Umathchar "0"0"0003B7 } -\def\eth {\Umathchar "0"0"0000F0 } -\def\Eulerconst {\Umathchar "0"0"002107 } -\def\exists {\Umathchar "0"0"002203 } -\def\exponentiale {\Umathchar "0"0"002147 } -\def\fallingdotseq {\Umathchar "3"0"002252 } -\def\Finv {\Umathchar "0"0"002132 } -\def\flat {\Umathchar "0"0"00266D } -\def\forall {\Umathchar "0"0"002200 } -\def\frown {\Umathchar "3"0"002322 } -\def\Game {\Umathchar "0"0"002141 } -\def\Gamma {\Umathchar "0"0"000393 } -\def\gamma {\Umathchar "0"0"0003B3 } -\def\ge {\Umathchar "3"0"002265 } -\def\geq {\Umathchar "3"0"002265 } -\def\geqq {\Umathchar "3"0"002267 } -\def\geqslant {\Umathchar "3"0"002A7E } -\def\gets {\Umathchar "3"0"002190 } -\def\gg {\Umathchar "3"0"00226B } -\def\ggg {\Umathchar "3"0"0022D9 } -\def\gggtr {\Umathchar "3"0"0022D9 } -\def\gimel {\Umathchar "0"0"002137 } -\def\gnapprox {\Umathchar "3"0"002A8A } -\def\gneqq {\Umathchar "3"0"002269 } -\def\gnsim {\Umathchar "3"0"0022E7 } -\def\grave {\Umathaccent"0"0"000060 } -\def\gt {\Umathchar "3"0"00003E } -\def\gtrapprox {\Umathchar "3"0"002A86 } -\def\gtrdot {\Umathchar "2"0"0022D7 } -\def\gtreqless {\Umathchar "3"0"0022DB } -\def\gtreqqless {\Umathchar "3"0"002A8C } -\def\gtrless {\Umathchar "3"0"002277 } -\def\gtrsim {\Umathchar "3"0"002273 } -\def\hat {\Umathaccent"0"0"0002C6 } -\def\hbar {\Umathchar "0"0"00210F } -\def\heartsuit {\Umathchar "0"0"002661 } -\def\hookleftarrow {\Umathchar "3"0"0021A9 } -\def\hookrightarrow {\Umathchar "3"0"0021AA } -\def\hslash {\Umathchar "0"0"00210F } -\def\iiint {\Umathchar "1"0"00222D } -\def\iiintop {\Umathchar "0"0"00222D } -\def\iint {\Umathchar "1"0"00222C } -\def\iintop {\Umathchar "0"0"00222C } -\def\Im {\Umathchar "0"0"002111 } -\def\imaginaryi {\Umathchar "0"0"002148 } -\def\imaginaryj {\Umathchar "0"0"002149 } -\def\imath {\Umathchar "0"0"01D6A4 } -\def\imply {\Umathchar "3"0"0021D2 } -\def\in {\Umathchar "0"0"002208 } -\def\infty {\Umathchar "0"0"00221E } -\def\int {\Umathchar "1"0"00222B } -\def\intclockwise {\Umathchar "1"0"002231 } -\def\integers {\Umathchar "0"0"002124 } -\def\intercal {\Umathchar "2"0"0022BA } -\def\intop {\Umathchar "0"0"00222B } -\def\Iota {\Umathchar "0"0"000399 } -\def\iota {\Umathchar "0"0"0003B9 } -\def\jmath {\Umathchar "0"0"01D6A5 } -\def\Join {\Umathchar "3"0"0022C8 } -\def\Kappa {\Umathchar "0"0"00039A } -\def\kappa {\Umathchar "0"0"0003BA } -\def\Lambda {\Umathchar "0"0"00039B } -\def\lambda {\Umathchar "0"0"0003BB } -\def\land {\Umathchar "2"0"002227 } -\def\langle {\Udelimiter "4"0"0027E8 } -\def\lbrace {\Udelimiter "4"0"00007B } -\def\lbrack {\Udelimiter "4"0"00005B } -\def\lceil {\Udelimiter "4"0"002308 } -\def\lceiling {\Udelimiter "4"0"002308 } -\def\ldotp {\Umathchar "6"0"00002E } -\def\ldots {\Umathchar "0"0"002026 } -\def\Ldsh {\Umathchar "3"0"0021B2 } -\def\le {\Umathchar "3"0"002264 } -\def\leadsto {\Umathchar "3"0"0021DD } -\def\leftarrow {\Umathchar "3"0"002190 } -\def\Leftarrow {\Umathchar "3"0"0021D0 } -\def\leftarrowtail {\Umathchar "3"0"0021A2 } -\def\leftarrowtriangle {\Umathchar "3"0"0021FD } -\def\leftdasharrow {\Umathchar "3"0"0021E0 } -\def\leftharpoondown {\Umathchar "3"0"0021BD } -\def\leftharpoonup {\Umathchar "3"0"0021BC } -\def\leftleftarrows {\Umathchar "3"0"0021C7 } -\def\leftrightarrow {\Umathchar "3"0"002194 } -\def\Leftrightarrow {\Umathchar "3"0"0021D4 } -\def\leftrightarrows {\Umathchar "3"0"0021C6 } -\def\leftrightarrowtriangle {\Umathchar "3"0"0021FF } -\def\leftrightharpoons {\Umathchar "3"0"0021CB } -\def\leftrightsquigarrow {\Umathchar "3"0"0021AD } -\def\leftsquigarrow {\Umathchar "3"0"0021DC } -\def\leftthreetimes {\Umathchar "2"0"0022CB } -\def\leftwavearrow {\Umathchar "3"0"00219C } -\def\leftwhitearrow {\Umathchar "0"0"0021E6 } -\def\leq {\Umathchar "3"0"002264 } -\def\leqq {\Umathchar "3"0"002266 } -\def\leqslant {\Umathchar "3"0"002A7D } -\def\lessapprox {\Umathchar "3"0"002A85 } -\def\lessdot {\Umathchar "2"0"0022D6 } -\def\lesseqgtr {\Umathchar "3"0"0022DA } -\def\lesseqqgtr {\Umathchar "3"0"002A8B } -\def\lessgtr {\Umathchar "3"0"002276 } -\def\lesssim {\Umathchar "3"0"002272 } -\def\lfloor {\Udelimiter "4"0"00230A } -\def\lgroup {\Udelimiter "4"0"0027EE } -\def\lhook {\Umathchar "3"0"0FE322 } -\def\lhooknwarrow {\Umathchar "3"0"002923 } -\def\lhooksearrow {\Umathchar "3"0"002925 } -\def\linefeed {\Umathchar "0"0"0021B4 } -\def\ll {\Umathchar "3"0"00226A } -\def\llangle {\Udelimiter "4"0"0027EA } -\def\llbracket {\Udelimiter "4"0"0027E6 } -\def\llcorner {\Udelimiter "4"0"00231E } -\def\Lleftarrow {\Umathchar "3"0"0021DA } -\def\lll {\Umathchar "3"0"0022D8 } -\def\llless {\Umathchar "3"0"0022D8 } -\def\lmoustache {\Udelimiter "4"0"0023B0 } -\def\lnapprox {\Umathchar "3"0"002A89 } -\def\lneq {\Umathchar "3"0"002A87 } -\def\lneqq {\Umathchar "3"0"002268 } -\def\lnot {\Umathchar "0"0"0000AC } -\def\lnsim {\Umathchar "3"0"0022E6 } -\def\longleftarrow {\Umathchar "3"0"0027F5 } -\def\Longleftarrow {\Umathchar "3"0"0027F8 } -\def\longleftrightarrow {\Umathchar "3"0"0027F7 } -\def\Longleftrightarrow {\Umathchar "3"0"0027FA } -\def\longmapsfrom {\Umathchar "3"0"0027FB } -\def\Longmapsfrom {\Umathchar "3"0"0027FD } -\def\longmapsto {\Umathchar "3"0"0027FC } -\def\Longmapsto {\Umathchar "3"0"0027FE } -\def\longrightarrow {\Umathchar "3"0"0027F6 } -\def\Longrightarrow {\Umathchar "3"0"0027F9 } -\def\longrightsquigarrow {\Umathchar "3"0"0027FF } -\def\looparrowleft {\Umathchar "3"0"0021AB } -\def\looparrowright {\Umathchar "3"0"0021AC } -\def\lor {\Umathchar "2"0"002228 } -\def\lozenge {\Umathchar "0"0"0025CA } -\def\lparent {\Udelimiter "4"0"000028 } -\def\lrcorner {\Udelimiter "5"0"00231F } -\def\Lsh {\Umathchar "3"0"0021B0 } -\def\lt {\Umathchar "3"0"00003C } -\def\ltimes {\Umathchar "2"0"0022C9 } -\def\lvert {\Udelimiter "4"0"00007C } -\def\lVert {\Udelimiter "4"0"002016 } -\def\maltese {\Umathchar "0"0"002720 } -\def\mapsdown {\Umathchar "3"0"0021A7 } -\def\mapsfrom {\Umathchar "3"0"0021A4 } -\def\Mapsfrom {\Umathchar "3"0"002906 } -\def\mapsfromchar {\Umathchar "3"0"0FE324 } -\def\mapsto {\Umathchar "3"0"0021A6 } -\def\Mapsto {\Umathchar "3"0"002907 } -\def\mapstochar {\Umathchar "3"0"0FE321 } -\def\mapsup {\Umathchar "3"0"0021A5 } -\def\mathring {\Umathaccent"0"0"0002DA } -\def\measuredangle {\Umathchar "0"0"002221 } -\def\measuredeq {\Umathchar "3"0"00225E } -\def\mho {\Umathchar "0"0"002127 } -\def\mid {\Umathchar "3"0"00007C } -\def\minus {\Umathchar "2"0"002212 } -\def\minuscolon {\Umathchar "2"0"002239 } -\def\models {\Umathchar "3"0"0022A7 } -\def\mp {\Umathchar "2"0"002213 } -\def\Mu {\Umathchar "0"0"00039C } -\def\mu {\Umathchar "0"0"0003BC } -\def\multimap {\Umathchar "3"0"0022B8 } -\def\napprox {\Umathchar "3"0"002249 } -\def\napproxEq {\Umathchar "3"0"002246 } -\def\nasymp {\Umathchar "3"0"00226D } -\def\natural {\Umathchar "0"0"00266E } -\def\naturalnumbers {\Umathchar "0"0"002115 } -\def\ncong {\Umathchar "3"0"002246 } -\def\ndivides {\Umathchar "2"0"002224 } -\def\ne {\Umathchar "3"0"002260 } -\def\nearrow {\Umathchar "3"0"002197 } -\def\Nearrow {\Umathchar "3"0"0021D7 } -\def\neg {\Umathchar "0"0"0000AC } -\def\negativesign {\Umathchar "2"0"00207B } -\def\neq {\Umathchar "3"0"002260 } -\def\nequiv {\Umathchar "3"0"002262 } -\def\neswarrow {\Umathchar "3"0"002922 } -\def\nexists {\Umathchar "0"0"002204 } -\def\ngeq {\Umathchar "3"0"002271 } -\def\ngtr {\Umathchar "3"0"00226F } -\def\ngtrless {\Umathchar "3"0"002279 } -\def\ngtrsim {\Umathchar "3"0"002275 } -\def\nHdownarrow {\Umathchar "3"0"0021DF } -\def\nHuparrow {\Umathchar "3"0"0021DE } -\def\ni {\Umathchar "3"0"00220B } -\def\nin {\Umathchar "3"0"002209 } -\def\nleftarrow {\Umathchar "3"0"00219A } -\def\nLeftarrow {\Umathchar "3"0"0021CD } -\def\nleftrightarrow {\Umathchar "3"0"0021AE } -\def\nLeftrightarrow {\Umathchar "3"0"0021CE } -\def\nleq {\Umathchar "3"0"002270 } -\def\nless {\Umathchar "3"0"00226E } -\def\nlessgtr {\Umathchar "3"0"002278 } -\def\nlesssim {\Umathchar "3"0"002274 } -\def\nmid {\Umathchar "3"0"002224 } -\def\nni {\Umathchar "3"0"00220C } -\def\not {\Umathchar "3"0"000338 } -\def\notin {\Umathchar "3"0"002209 } -\def\nowns {\Umathchar "3"0"00220C } -\def\nparallel {\Umathchar "3"0"002226 } -\def\nprec {\Umathchar "3"0"002280 } -\def\npreccurlyeq {\Umathchar "3"0"0022E0 } -\def\nrightarrow {\Umathchar "3"0"00219B } -\def\nRightarrow {\Umathchar "3"0"0021CF } -\def\nsim {\Umathchar "3"0"002241 } -\def\nsimeq {\Umathchar "3"0"002244 } -\def\nsqsubseteq {\Umathchar "3"0"0022E2 } -\def\nsqsupseteq {\Umathchar "3"0"0022E3 } -\def\nsubset {\Umathchar "3"0"002284 } -\def\nsubseteq {\Umathchar "3"0"002288 } -\def\nsucc {\Umathchar "3"0"002281 } -\def\nsucccurlyeq {\Umathchar "3"0"0022E1 } -\def\nsupset {\Umathchar "3"0"002285 } -\def\nsupseteq {\Umathchar "3"0"002289 } -\def\ntriangleleft {\Umathchar "3"0"0022EB } -\def\ntrianglelefteq {\Umathchar "3"0"0022EC } -\def\ntriangleright {\Umathchar "3"0"0022EA } -\def\ntrianglerighteq {\Umathchar "3"0"0022ED } -\def\Nu {\Umathchar "0"0"00039D } -\def\nu {\Umathchar "0"0"0003BD } -\def\nvdash {\Umathchar "3"0"0022AC } -\def\nvDash {\Umathchar "3"0"0022AD } -\def\nVdash {\Umathchar "3"0"0022AE } -\def\nVDash {\Umathchar "3"0"0022AF } -\def\nvleftarrow {\Umathchar "3"0"0021F7 } -\def\nVleftarrow {\Umathchar "3"0"0021FA } -\def\nvleftrightarrow {\Umathchar "3"0"0021F9 } -\def\nVleftrightarrow {\Umathchar "3"0"0021FC } -\def\nvrightarrow {\Umathchar "3"0"0021F8 } -\def\nVrightarrow {\Umathchar "3"0"0021FB } -\def\nwarrow {\Umathchar "3"0"002196 } -\def\Nwarrow {\Umathchar "3"0"0021D6 } -\def\nwsearrow {\Umathchar "3"0"002921 } -\def\odot {\Umathchar "2"0"002299 } -\def\ohm {\Umathchar "0"0"002126 } -\def\oiiint {\Umathchar "1"0"002230 } -\def\oiint {\Umathchar "1"0"00222F } -\def\oint {\Umathchar "1"0"00222E } -\def\ointclockwise {\Umathchar "1"0"002232 } -\def\ointctrclockwise {\Umathchar "1"0"002233 } -\def\Omega {\Umathchar "0"0"0003A9 } -\def\omega {\Umathchar "0"0"0003C9 } -\def\Omicron {\Umathchar "0"0"00039F } -\def\omicron {\Umathchar "0"0"0003BF } -\def\ominus {\Umathchar "2"0"002296 } -\def\oplus {\Umathchar "2"0"002295 } -\def\oslash {\Umathchar "2"0"002298 } -\def\otimes {\Umathchar "2"0"002297 } -\def\overbar {\Umathaccent"0"0"00203E } -\def\overbrace {\Umathaccent"0"0"0023DE } -\def\overbracket {\Umathaccent"0"0"0023B4 } -\def\overparent {\Umathaccent"0"0"0023DC } -\def\owns {\Umathchar "3"0"00220B } -\def\P {\Umathchar "0"0"0000B6 } -\def\parallel {\Umathchar "3"0"002225 } -\def\partial {\Umathchar "0"0"002202 } -\def\perp {\Umathchar "3"0"0022A5 } -\def\Phi {\Umathchar "0"0"0003A6 } -\def\phi {\Umathchar "0"0"0003D5 } -\def\Pi {\Umathchar "0"0"0003A0 } -\def\pi {\Umathchar "0"0"0003C0 } -\def\pitchfork {\Umathchar "3"0"0022D4 } -\def\Plankconst {\Umathchar "0"0"00210E } -\def\pm {\Umathchar "2"0"0000B1 } -\def\positivesign {\Umathchar "2"0"00207A } -\def\prec {\Umathchar "3"0"00227A } -\def\precapprox {\Umathchar "3"0"002AB7 } -\def\preccurlyeq {\Umathchar "3"0"00227C } -\def\preceq {\Umathchar "3"0"002AAF } -\def\preceqq {\Umathchar "3"0"002AB3 } -\def\precnapprox {\Umathchar "3"0"002AB9 } -\def\precneq {\Umathchar "3"0"002AB1 } -\def\precneqq {\Umathchar "3"0"002AB5 } -\def\precnsim {\Umathchar "3"0"0022E8 } -\def\precsim {\Umathchar "3"0"00227E } -\def\prime {\Umathchar "0"0"002032 } -\def\primes {\Umathchar "0"0"002119 } -\def\prod {\Umathchar "1"0"00220F } -\def\PropertyLine {\Umathchar "0"0"00214A } -\def\propto {\Umathchar "3"0"00221D } -\def\Psi {\Umathchar "0"0"0003A8 } -\def\psi {\Umathchar "0"0"0003C8 } -\def\questionedeq {\Umathchar "3"0"00225F } -\def\rangle {\Udelimiter "5"0"0027E9 } -\def\rationals {\Umathchar "0"0"00211A } -\def\rbrace {\Udelimiter "5"0"00007D } -\def\rbrack {\Udelimiter "5"0"00005D } -\def\rceil {\Udelimiter "5"0"002309 } -\def\rceiling {\Udelimiter "5"0"002309 } -\def\Rdsh {\Umathchar "3"0"0021B3 } -\def\Re {\Umathchar "0"0"00211C } -\def\reals {\Umathchar "0"0"00211D } -\def\Relbar {\Umathchar "3"0"00003D } -\def\relbar {\Umathchar "3"0"002212 } -\def\restriction {\Umathchar "3"0"0021BE } -\def\rfloor {\Udelimiter "5"0"00230B } -\def\rgroup {\Udelimiter "5"0"0027EF } -\def\Rho {\Umathchar "0"0"0003A1 } -\def\rho {\Umathchar "0"0"0003C1 } -\def\rhook {\Umathchar "3"0"0FE323 } -\def\rhooknearrow {\Umathchar "3"0"002924 } -\def\rhookswarrow {\Umathchar "3"0"002926 } -\def\rightangle {\Umathchar "0"0"00221F } -\def\rightarrow {\Umathchar "3"0"002192 } -\def\Rightarrow {\Umathchar "3"0"0021D2 } -\def\rightarrowbar {\Umathchar "3"0"0021E5 } -\def\rightarrowtail {\Umathchar "3"0"0021A3 } -\def\rightarrowtriangle {\Umathchar "3"0"0021FE } -\def\rightdasharrow {\Umathchar "3"0"0021E2 } -\def\rightharpoondown {\Umathchar "3"0"0021C1 } -\def\rightharpoonup {\Umathchar "3"0"0021C0 } -\def\rightleftarrows {\Umathchar "3"0"0021C4 } -\def\rightleftharpoons {\Umathchar "3"0"0021CC } -\def\rightrightarrows {\Umathchar "3"0"0021C9 } -\def\rightsquigarrow {\Umathchar "3"0"0021DD } -\def\rightthreearrows {\Umathchar "3"0"0021F6 } -\def\rightthreetimes {\Umathchar "2"0"0022CC } -\def\rightwavearrow {\Umathchar "3"0"00219D } -\def\rightwhitearrow {\Umathchar "0"0"0021E8 } -\def\risingdotseq {\Umathchar "3"0"002253 } -\def\rmoustache {\Udelimiter "5"0"0023B1 } -\def\rneq {\Umathchar "3"0"002A88 } -\def\rparent {\Udelimiter "5"0"000029 } -\def\rrangle {\Udelimiter "5"0"0027EB } -\def\rrbracket {\Udelimiter "5"0"0027E7 } -\def\Rrightarrow {\Umathchar "3"0"0021DB } -\def\Rsh {\Umathchar "3"0"0021B1 } -\def\rtimes {\Umathchar "2"0"0022CA } -\def\rvert {\Udelimiter "5"0"00007C } -\def\rVert {\Udelimiter "5"0"002016 } -\def\S {\Umathchar "0"0"0000A7 } -\def\searrow {\Umathchar "3"0"002198 } -\def\Searrow {\Umathchar "3"0"0021D8 } -\def\setminus {\Umathchar "2"0"002216 } -\def\sharp {\Umathchar "0"0"00266F } -\def\Sigma {\Umathchar "0"0"0003A3 } -\def\sigma {\Umathchar "0"0"0003C3 } -\def\sim {\Umathchar "3"0"00223C } -\def\simeq {\Umathchar "3"0"002243 } -\def\slash {\Umathchar "0"0"002044 } -\def\smile {\Umathchar "3"0"002323 } -\def\solidus {\Udelimiter "5"0"002044 } -\def\spadesuit {\Umathchar "0"0"002660 } -\def\sphericalangle {\Umathchar "0"0"002222 } -\def\sqcap {\Umathchar "2"0"002293 } -\def\sqcup {\Umathchar "2"0"002294 } -\def\sqsubset {\Umathchar "3"0"00228F } -\def\sqsubseteq {\Umathchar "2"0"002291 } -\def\sqsubsetneq {\Umathchar "3"0"0022E4 } -\def\sqsupset {\Umathchar "3"0"002290 } -\def\sqsupseteq {\Umathchar "2"0"002292 } -\def\sqsupsetneq {\Umathchar "3"0"0022E5 } -\def\square {\Umathchar "0"0"0025A1 } -\def\squaredots {\Umathchar "3"0"002237 } -\def\star {\Umathchar "2"0"0022C6 } -\def\stareq {\Umathchar "3"0"00225B } -\def\subset {\Umathchar "3"0"002282 } -\def\Subset {\Umathchar "3"0"0022D0 } -\def\subseteq {\Umathchar "3"0"002286 } -\def\subseteqq {\Umathchar "3"0"002AC5 } -\def\subsetneq {\Umathchar "3"0"00228A } -\def\subsetneqq {\Umathchar "3"0"002ACB } -\def\succ {\Umathchar "3"0"00227B } -\def\succapprox {\Umathchar "3"0"002AB8 } -\def\succcurlyeq {\Umathchar "3"0"00227D } -\def\succeq {\Umathchar "3"0"002AB0 } -\def\succeqq {\Umathchar "3"0"002AB4 } -\def\succnapprox {\Umathchar "3"0"002ABA } -\def\succneq {\Umathchar "3"0"002AB2 } -\def\succneqq {\Umathchar "3"0"002AB6 } -\def\succnsim {\Umathchar "3"0"0022E9 } -\def\succsim {\Umathchar "3"0"00227F } -\def\sum {\Umathchar "1"0"002211 } -\def\supset {\Umathchar "3"0"002283 } -\def\Supset {\Umathchar "3"0"0022D1 } -\def\supseteq {\Umathchar "3"0"002287 } -\def\supseteqq {\Umathchar "3"0"002AC6 } -\def\supsetneq {\Umathchar "3"0"00228B } -\def\supsetneqq {\Umathchar "3"0"002ACC } -\def\surd {\Umathchar "2"0"00221A } -\def\swarrow {\Umathchar "3"0"002199 } -\def\Swarrow {\Umathchar "3"0"0021D9 } -\def\Tau {\Umathchar "0"0"0003A4 } -\def\tau {\Umathchar "0"0"0003C4 } -\def\therefore {\Umathchar "3"0"002234 } -\def\Theta {\Umathchar "0"0"000398 } -\def\theta {\Umathchar "0"0"0003B8 } -\def\tilde {\Umathaccent"0"0"0002DC } -\def\times {\Umathchar "2"0"0000D7 } -\def\to {\Umathchar "3"0"002192 } -\def\top {\Umathchar "0"0"0022A4 } -\def\triangle {\Umathchar "0"0"0025B3 } -\def\triangledown {\Umathchar "2"0"0025BD } -\def\triangleleft {\Umathchar "2"0"0025C1 } -\def\triangleq {\Umathchar "3"0"00225C } -\def\triangleright {\Umathchar "2"0"0025B7 } -\def\tripleprime {\Umathchar "0"0"002034 } -\def\turnediota {\Umathchar "0"0"002129 } -\def\twoheaddownarrow {\Umathchar "3"0"0021A1 } -\def\twoheadleftarrow {\Umathchar "3"0"00219E } -\def\twoheadrightarrow {\Umathchar "3"0"0021A0 } -\def\twoheadrightarrowtail {\Umathchar "3"0"002916 } -\def\twoheaduparrow {\Umathchar "3"0"00219F } -\def\udots {\Umathchar "0"0"0022F0 } -\def\ulcorner {\Udelimiter "4"0"00231C } -\def\underbar {\Umathaccent bottom "0"0"00203E } -\def\underbrace {\Umathaccent bottom "0"0"0023DF } -\def\underbracket {\Umathaccent bottom "0"0"0023B5 } -\def\underparent {\Umathaccent bottom "0"0"0023DD } -\def\upand {\Umathchar "2"0"00214B } -\def\uparrow {\Umathchar "3"0"002191 } -\def\Uparrow {\Umathchar "3"0"0021D1 } -\def\updasharrow {\Umathchar "3"0"0021E1 } -\def\updownarrow {\Umathchar "3"0"002195 } -\def\Updownarrow {\Umathchar "3"0"0021D5 } -\def\updownarrowbar {\Umathchar "0"0"0021A8 } -\def\updownarrows {\Umathchar "3"0"0021C5 } -\def\upharpoonleft {\Umathchar "3"0"0021BF } -\def\upharpoonright {\Umathchar "3"0"0021BE } -\def\uplus {\Umathchar "2"0"00228E } -\def\Upsilon {\Umathchar "0"0"0003A5 } -\def\upsilon {\Umathchar "0"0"0003C5 } -\def\upuparrows {\Umathchar "3"0"0021C8 } -\def\upwhitearrow {\Umathchar "0"0"0021E7 } -\def\urcorner {\Udelimiter "5"0"00231D } -\def\Uuparrow {\Umathchar "3"0"00290A } -\def\varepsilon {\Umathchar "0"0"0003B5 } -\def\varkappa {\Umathchar "0"0"0003F0 } -\def\varkappa {\Umathchar "0"0"0003F0 } -\def\varnothing {\Umathchar "0"0"002300 } -\def\varphi {\Umathchar "0"0"0003C6 } -\def\varpi {\Umathchar "0"0"0003D6 } -\def\varrho {\Umathchar "0"0"01D71A } -\def\varsigma {\Umathchar "0"0"0003C2 } -\def\vartheta {\Umathchar "0"0"01D717 } -\def\varTheta {\Umathchar "0"0"0003D1 } -\def\vdash {\Umathchar "3"0"0022A2 } -\def\vDash {\Umathchar "3"0"0022A8 } -\def\Vdash {\Umathchar "3"0"0022A9 } -\def\VDash {\Umathchar "3"0"0022AB } -\def\vdots {\Umathchar "0"0"0022EE } -\def\vec {\Umathaccent"0"0"0020D7 } -\def\vee {\Umathchar "2"0"002228 } -\def\veebar {\Umathchar "2"0"0022BB } -\def\veeeq {\Umathchar "3"0"00225A } -\def\vert {\Udelimiter "0"0"00007C } -\def\Vert {\Udelimiter "0"0"002016 } -\def\Vvdash {\Umathchar "3"0"0022AA } -\def\wedge {\Umathchar "2"0"002227 } -\def\wedgeeq {\Umathchar "3"0"002259 } -\def\whitearrowupfrombar {\Umathchar "0"0"0021EB } -\def\widehat {\Umathaccent"0"0"000302 } -\def\widetilde {\Umathaccent"0"0"000303 } -\def\wp {\Umathchar "0"0"002118 } -\def\wr {\Umathchar "2"0"002240 } -\def\Xi {\Umathchar "0"0"00039E } -\def\xi {\Umathchar "0"0"0003BE } -\def\yen {\Umathchar "0"0"0000A5 } -\def\Zeta {\Umathchar "0"0"000396 } -\def\zeta {\Umathchar "0"0"0003B6 } +\protected\def\acute {\Umathaccent"0"0"0000B4 } +\protected\def\acwopencirclearrow {\Umathchar "3"0"0021BA } +\protected\def\aleph {\Umathchar "0"0"002135 } +\protected\def\Alpha {\Umathchar "0"0"000391 } +\protected\def\alpha {\Umathchar "0"0"0003B1 } +\protected\def\amalg {\Umathchar "2"0"002A3F } +\protected\def\angle {\Umathchar "0"0"002220 } +\protected\def\Angstrom {\Umathchar "0"0"00212B } +\protected\def\approx {\Umathchar "3"0"002248 } +\protected\def\approxEq {\Umathchar "3"0"002245 } +\protected\def\approxeq {\Umathchar "3"0"00224A } +\protected\def\approxnEq {\Umathchar "3"0"002247 } +\protected\def\arrowvert {\Umathchar "0"0"00007C } +\protected\def\Arrowvert {\Umathchar "0"0"002016 } +\protected\def\ast {\Umathchar "2"0"002217 } +\protected\def\ast {\Umathchar "2"0"002217 } +\protected\def\asymp {\Umathchar "3"0"00224D } +\protected\def\backepsilon {\Umathchar "0"0"0003F6 } +\protected\def\backprime {\Umathchar "0"0"012035 } +\protected\def\backsim {\Umathchar "3"0"00223D } +\protected\def\backslash {\Umathchar "0"0"00005C } +\protected\def\bar {\Umathaccent"0"0"0000AF } +\protected\def\barleftarrow {\Umathchar "3"0"0021E4 } +\protected\def\barleftarrowrightarrowbar {\Umathchar "3"0"0021B9 } +\protected\def\barovernorthwestarrow {\Umathchar "3"0"0021B8 } +\protected\def\barwedge {\Umathchar "2"0"0022BC } +\protected\def\because {\Umathchar "3"0"002235 } +\protected\def\Beta {\Umathchar "0"0"000392 } +\protected\def\beta {\Umathchar "0"0"0003B2 } +\protected\def\beth {\Umathchar "0"0"002136 } +\protected\def\between {\Umathchar "3"0"00226C } +\protected\def\bigcap {\Umathchar "1"0"0022C2 } +\protected\def\bigcirc {\Umathchar "2"0"0025EF } +\protected\def\bigcircle {\Umathchar "2"0"0020DD } +\protected\def\bigcircle {\Umathchar "2"0"0020DD } +\protected\def\bigcup {\Umathchar "1"0"0022C3 } +\protected\def\bigdiamond {\Umathchar "0"0"0020DF } +\protected\def\bigodot {\Umathchar "1"0"002A00 } +\protected\def\bigoplus {\Umathchar "1"0"002A01 } +\protected\def\bigotimes {\Umathchar "1"0"002A02 } +\protected\def\bigsqcap {\Umathchar "1"0"002A05 } +\protected\def\bigsqcup {\Umathchar "1"0"002A06 } +\protected\def\bigsquare {\Umathchar "0"0"0020DE } +\protected\def\bigstar {\Umathchar "0"0"002605 } +\protected\def\bigtimes {\Umathchar "1"0"002A09 } +\protected\def\bigtriangledown {\Umathchar "2"0"0025BD } +\protected\def\bigtriangleup {\Umathchar "2"0"0025B3 } +\protected\def\bigudot {\Umathchar "1"0"002A03 } +\protected\def\biguplus {\Umathchar "1"0"002A04 } +\protected\def\bigvee {\Umathchar "1"0"0022C1 } +\protected\def\bigwedge {\Umathchar "1"0"0022C0 } +\protected\def\blacklozenge {\Umathchar "0"0"002666 } +\protected\def\blacksquare {\Umathchar "0"0"0025A0 } +\protected\def\blacktriangle {\Umathchar "2"0"0025B2 } +\protected\def\blacktriangledown {\Umathchar "2"0"0025BC } +\protected\def\blacktriangleleft {\Umathchar "2"0"0025C0 } +\protected\def\blacktriangleright {\Umathchar "2"0"0025B6 } +\protected\def\bot {\Umathchar "0"0"0022A5 } +\protected\def\bowtie {\Umathchar "3"0"0022C8 } +\protected\def\Box {\Umathchar "0"0"0025A1 } +\protected\def\boxdot {\Umathchar "2"0"0022A1 } +\protected\def\boxminus {\Umathchar "2"0"00229F } +\protected\def\boxplus {\Umathchar "2"0"00229E } +\protected\def\boxtimes {\Umathchar "2"0"0022A0 } +%protected\def\braceld {\Umathchar "0"0"000000 } +%protected\def\bracerd {\Umathchar "0"0"000000 } +%protected\def\bracelu {\Umathchar "0"0"000000 } +%protected\def\braceru {\Umathchar "0"0"000000 } +\protected\def\breve {\Umathaccent"0"0"0002D8 } +\protected\def\bullet {\Umathchar "2"0"002022 } +\protected\def\bullet {\Umathchar "2"0"002022 } +\protected\def\Bumpeq {\Umathchar "3"0"00224E } +\protected\def\cap {\Umathchar "2"0"002229 } +\protected\def\Cap {\Umathchar "2"0"0022D2 } +\protected\def\carriagereturn {\Umathchar "0"0"0021B5 } +\protected\def\cdot {\Umathchar "2"0"0022C5 } +\protected\def\cdotp {\Umathchar "6"0"0022C5 } +\protected\def\cdots {\Umathchar "0"0"0022EF } +\protected\def\centerdot {\Umathchar "2"0"0000B7 } +\protected\def\check {\Umathaccent"0"0"0002C7 } +\protected\def\checkmark {\Umathchar "0"0"002713 } +\protected\def\Chi {\Umathchar "0"0"0003A7 } +\protected\def\chi {\Umathchar "0"0"0003C7 } +\protected\def\circ {\Umathchar "2"0"002218 } +\protected\def\circeq {\Umathchar "3"0"002257 } +\protected\def\circlearrowleft {\Umathchar "3"0"0021BB } +\protected\def\circlearrowright {\Umathchar "3"0"0021BA } +\protected\def\circledast {\Umathchar "2"0"00229B } +\protected\def\circledcirc {\Umathchar "2"0"00229A } +\protected\def\circleddash {\Umathchar "2"0"00229D } +\protected\def\circledequals {\Umathchar "2"0"00229C } +\protected\def\circledR {\Umathchar "0"0"0024C7 } +\protected\def\circledS {\Umathchar "0"0"0024C8 } +\protected\def\circleonrightarrow {\Umathchar "3"0"0021F4 } +\protected\def\clubsuit {\Umathchar "0"0"002663 } +\protected\def\colon {\Umathchar "6"0"002236 } +\protected\def\colonequals {\Umathchar "3"0"002254 } +\protected\def\complement {\Umathchar "0"0"002201 } +\protected\def\complexes {\Umathchar "0"0"002102 } +\protected\def\cong {\Umathchar "3"0"002245 } +\protected\def\coprod {\Umathchar "1"0"002210 } +\protected\def\cup {\Umathchar "2"0"00222A } +\protected\def\Cup {\Umathchar "2"0"0022D3 } +\protected\def\curlyeqprec {\Umathchar "3"0"0022DE } +\protected\def\curlyeqsucc {\Umathchar "3"0"0022DF } +\protected\def\curlyvee {\Umathchar "2"0"0022CE } +\protected\def\curlywedge {\Umathchar "2"0"0022CF } +\protected\def\curvearrowleft {\Umathchar "3"0"0021B6 } +\protected\def\curvearrowright {\Umathchar "3"0"0021B7 } +\protected\def\cwopencirclearrow {\Umathchar "3"0"0021BB } +\protected\def\dag {\Umathchar "0"0"002020 } +\protected\def\dagger {\Umathchar "2"0"002020 } +\protected\def\daleth {\Umathchar "0"0"002138 } +\protected\def\dasharrow {\Umathchar "3"0"0021E2 } +\protected\def\dashedleftarrow {\Umathchar "3"0"00290C } +\protected\def\dashedrightarrow {\Umathchar "3"0"00290D } +\protected\def\dashv {\Umathchar "3"0"0022A3 } +\protected\def\ddag {\Umathchar "0"0"002021 } +\protected\def\ddagger {\Umathchar "2"0"002021 } +\protected\def\dddot {\Umathaccent"0"0"0020DB } +\protected\def\ddot {\Umathaccent"0"0"0000A8 } +\protected\def\ddots {\Umathchar "0"0"0022F1 } +\protected\def\Ddownarrow {\Umathchar "3"0"00290B } +\protected\def\definedeq {\Umathchar "3"0"00225D } +\protected\def\Delta {\Umathchar "0"0"000394 } +\protected\def\delta {\Umathchar "0"0"0003B4 } +\protected\def\diamond {\Umathchar "2"0"0022C4 } +\protected\def\diamondsuit {\Umathchar "0"0"002662 } +\protected\def\differentialD {\Umathchar "0"0"002145 } +\protected\def\differentiald {\Umathchar "0"0"002146 } +\protected\def\digamma {\Umathchar "0"0"0003DC } +\protected\def\div {\Umathchar "2"0"0000F7 } +\protected\def\divideontimes {\Umathchar "2"0"0022C7 } +\protected\def\divides {\Umathchar "2"0"002223 } +\protected\def\dot {\Umathaccent"0"0"0002D9 } +\protected\def\doteq {\Umathchar "3"0"002250 } +\protected\def\Doteq {\Umathchar "3"0"002251 } +\protected\def\doteqdot {\Umathchar "3"0"002251 } +\protected\def\dotminus {\Umathchar "2"0"002238 } +\protected\def\dotplus {\Umathchar "2"0"002214 } +\protected\def\dots {\Umathchar "0"0"002026 } +\protected\def\dottedrightarrow {\Umathchar "3"0"002911 } +\protected\def\doublecap {\Umathchar "2"0"0022D2 } +\protected\def\doublecup {\Umathchar "2"0"0022D3 } +\protected\def\doubleprime {\Umathchar "0"0"002033 } +\protected\def\downarrow {\Umathchar "3"0"002193 } +\protected\def\Downarrow {\Umathchar "3"0"0021D3 } +\protected\def\downdasharrow {\Umathchar "3"0"0021E3 } +\protected\def\downdownarrows {\Umathchar "3"0"0021CA } +\protected\def\downharpoonleft {\Umathchar "3"0"0021C3 } +\protected\def\downharpoonright {\Umathchar "3"0"0021C2 } +\protected\def\downuparrows {\Umathchar "3"0"0021F5 } +\protected\def\downwhitearrow {\Umathchar "0"0"0021E9 } +\protected\def\downzigzagarrow {\Umathchar "3"0"0021AF } +\protected\def\ell {\Umathchar "0"0"002113 } +\protected\def\emptyset {\Umathchar "0"0"002205 } +\protected\def\Epsilon {\Umathchar "0"0"000395 } +\protected\def\epsilon {\Umathchar "0"0"0003F5 } +\protected\def\eq {\Umathchar "3"0"00003D } +\protected\def\eqcirc {\Umathchar "3"0"002256 } +\protected\def\eqgtr {\Umathchar "3"0"0022DD } +\protected\def\eqless {\Umathchar "3"0"0022DC } +\protected\def\eqsim {\Umathchar "3"0"002242 } +\protected\def\eqslantgtr {\Umathchar "3"0"002A96 } +\protected\def\eqslantless {\Umathchar "3"0"002A95 } +\protected\def\equalscolon {\Umathchar "3"0"002255 } +\protected\def\equiv {\Umathchar "3"0"002261 } +\protected\def\Eta {\Umathchar "0"0"000397 } +\protected\def\eta {\Umathchar "0"0"0003B7 } +\protected\def\eth {\Umathchar "0"0"0000F0 } +\protected\def\Eulerconst {\Umathchar "0"0"002107 } +\protected\def\exists {\Umathchar "0"0"002203 } +\protected\def\exponentiale {\Umathchar "0"0"002147 } +\protected\def\fallingdotseq {\Umathchar "3"0"002252 } +\protected\def\Finv {\Umathchar "0"0"002132 } +\protected\def\flat {\Umathchar "0"0"00266D } +\protected\def\forall {\Umathchar "0"0"002200 } +\protected\def\frown {\Umathchar "3"0"002322 } +\protected\def\Game {\Umathchar "0"0"002141 } +\protected\def\Gamma {\Umathchar "0"0"000393 } +\protected\def\gamma {\Umathchar "0"0"0003B3 } +\protected\def\ge {\Umathchar "3"0"002265 } +\protected\def\geq {\Umathchar "3"0"002265 } +\protected\def\geqq {\Umathchar "3"0"002267 } +\protected\def\geqslant {\Umathchar "3"0"002A7E } +\protected\def\gets {\Umathchar "3"0"002190 } +\protected\def\gg {\Umathchar "3"0"00226B } +\protected\def\ggg {\Umathchar "3"0"0022D9 } +\protected\def\gggtr {\Umathchar "3"0"0022D9 } +\protected\def\gimel {\Umathchar "0"0"002137 } +\protected\def\gnapprox {\Umathchar "3"0"002A8A } +\protected\def\gneqq {\Umathchar "3"0"002269 } +\protected\def\gnsim {\Umathchar "3"0"0022E7 } +\protected\def\grave {\Umathaccent"0"0"000060 } +\protected\def\gt {\Umathchar "3"0"00003E } +\protected\def\gtrapprox {\Umathchar "3"0"002A86 } +\protected\def\gtrdot {\Umathchar "2"0"0022D7 } +\protected\def\gtreqless {\Umathchar "3"0"0022DB } +\protected\def\gtreqqless {\Umathchar "3"0"002A8C } +\protected\def\gtrless {\Umathchar "3"0"002277 } +\protected\def\gtrsim {\Umathchar "3"0"002273 } +\protected\def\hat {\Umathaccent"0"0"0002C6 } +\protected\def\hbar {\Umathchar "0"0"00210F } +\protected\def\heartsuit {\Umathchar "0"0"002661 } +\protected\def\hookleftarrow {\Umathchar "3"0"0021A9 } +\protected\def\hookrightarrow {\Umathchar "3"0"0021AA } +\protected\def\hslash {\Umathchar "0"0"00210F } +\protected\def\iiint {\Umathchar "1"0"00222D } +\protected\def\iiintop {\Umathchar "0"0"00222D } +\protected\def\iint {\Umathchar "1"0"00222C } +\protected\def\iintop {\Umathchar "0"0"00222C } +\protected\def\Im {\Umathchar "0"0"002111 } +\protected\def\imaginaryi {\Umathchar "0"0"002148 } +\protected\def\imaginaryj {\Umathchar "0"0"002149 } +\protected\def\imath {\Umathchar "0"0"01D6A4 } +\protected\def\imply {\Umathchar "3"0"0021D2 } +\protected\def\in {\Umathchar "0"0"002208 } +\protected\def\infty {\Umathchar "0"0"00221E } +\protected\def\int {\Umathchar "1"0"00222B } +\protected\def\intclockwise {\Umathchar "1"0"002231 } +\protected\def\integers {\Umathchar "0"0"002124 } +\protected\def\intercal {\Umathchar "2"0"0022BA } +\protected\def\intop {\Umathchar "0"0"00222B } +\protected\def\Iota {\Umathchar "0"0"000399 } +\protected\def\iota {\Umathchar "0"0"0003B9 } +\protected\def\jmath {\Umathchar "0"0"01D6A5 } +\protected\def\Join {\Umathchar "3"0"0022C8 } +\protected\def\Kappa {\Umathchar "0"0"00039A } +\protected\def\kappa {\Umathchar "0"0"0003BA } +\protected\def\Lambda {\Umathchar "0"0"00039B } +\protected\def\lambda {\Umathchar "0"0"0003BB } +\protected\def\land {\Umathchar "2"0"002227 } +\protected\def\langle {\Udelimiter "4"0"0027E8 } +\protected\def\lbrace {\Udelimiter "4"0"00007B } +\protected\def\lbrack {\Udelimiter "4"0"00005B } +\protected\def\lceil {\Udelimiter "4"0"002308 } +\protected\def\lceiling {\Udelimiter "4"0"002308 } +\protected\def\ldotp {\Umathchar "6"0"00002E } +\protected\def\ldots {\Umathchar "0"0"002026 } +\protected\def\Ldsh {\Umathchar "3"0"0021B2 } +\protected\def\le {\Umathchar "3"0"002264 } +\protected\def\leadsto {\Umathchar "3"0"0021DD } +\protected\def\leftarrow {\Umathchar "3"0"002190 } +\protected\def\Leftarrow {\Umathchar "3"0"0021D0 } +\protected\def\leftarrowtail {\Umathchar "3"0"0021A2 } +\protected\def\leftarrowtriangle {\Umathchar "3"0"0021FD } +\protected\def\leftdasharrow {\Umathchar "3"0"0021E0 } +\protected\def\leftharpoondown {\Umathchar "3"0"0021BD } +\protected\def\leftharpoonup {\Umathchar "3"0"0021BC } +\protected\def\leftleftarrows {\Umathchar "3"0"0021C7 } +\protected\def\leftrightarrow {\Umathchar "3"0"002194 } +\protected\def\Leftrightarrow {\Umathchar "3"0"0021D4 } +\protected\def\leftrightarrows {\Umathchar "3"0"0021C6 } +\protected\def\leftrightarrowtriangle {\Umathchar "3"0"0021FF } +\protected\def\leftrightharpoons {\Umathchar "3"0"0021CB } +\protected\def\leftrightsquigarrow {\Umathchar "3"0"0021AD } +\protected\def\leftsquigarrow {\Umathchar "3"0"0021DC } +\protected\def\leftthreetimes {\Umathchar "2"0"0022CB } +\protected\def\leftwavearrow {\Umathchar "3"0"00219C } +\protected\def\leftwhitearrow {\Umathchar "0"0"0021E6 } +\protected\def\leq {\Umathchar "3"0"002264 } +\protected\def\leqq {\Umathchar "3"0"002266 } +\protected\def\leqslant {\Umathchar "3"0"002A7D } +\protected\def\lessapprox {\Umathchar "3"0"002A85 } +\protected\def\lessdot {\Umathchar "2"0"0022D6 } +\protected\def\lesseqgtr {\Umathchar "3"0"0022DA } +\protected\def\lesseqqgtr {\Umathchar "3"0"002A8B } +\protected\def\lessgtr {\Umathchar "3"0"002276 } +\protected\def\lesssim {\Umathchar "3"0"002272 } +\protected\def\lfloor {\Udelimiter "4"0"00230A } +\protected\def\lgroup {\Udelimiter "4"0"0027EE } +\protected\def\lhook {\Umathchar "3"0"0FE322 } +\protected\def\lhooknwarrow {\Umathchar "3"0"002923 } +\protected\def\lhooksearrow {\Umathchar "3"0"002925 } +\protected\def\linefeed {\Umathchar "0"0"0021B4 } +\protected\def\ll {\Umathchar "3"0"00226A } +\protected\def\llangle {\Udelimiter "4"0"0027EA } +\protected\def\llbracket {\Udelimiter "4"0"0027E6 } +\protected\def\llcorner {\Udelimiter "4"0"00231E } +\protected\def\Lleftarrow {\Umathchar "3"0"0021DA } +\protected\def\lll {\Umathchar "3"0"0022D8 } +\protected\def\llless {\Umathchar "3"0"0022D8 } +\protected\def\lmoustache {\Udelimiter "4"0"0023B0 } +\protected\def\lnapprox {\Umathchar "3"0"002A89 } +\protected\def\lneq {\Umathchar "3"0"002A87 } +\protected\def\lneqq {\Umathchar "3"0"002268 } +\protected\def\lnot {\Umathchar "0"0"0000AC } +\protected\def\lnsim {\Umathchar "3"0"0022E6 } +\protected\def\longleftarrow {\Umathchar "3"0"0027F5 } +\protected\def\Longleftarrow {\Umathchar "3"0"0027F8 } +\protected\def\longleftrightarrow {\Umathchar "3"0"0027F7 } +\protected\def\Longleftrightarrow {\Umathchar "3"0"0027FA } +\protected\def\longmapsfrom {\Umathchar "3"0"0027FB } +\protected\def\Longmapsfrom {\Umathchar "3"0"0027FD } +\protected\def\longmapsto {\Umathchar "3"0"0027FC } +\protected\def\Longmapsto {\Umathchar "3"0"0027FE } +\protected\def\longrightarrow {\Umathchar "3"0"0027F6 } +\protected\def\Longrightarrow {\Umathchar "3"0"0027F9 } +\protected\def\longrightsquigarrow {\Umathchar "3"0"0027FF } +\protected\def\looparrowleft {\Umathchar "3"0"0021AB } +\protected\def\looparrowright {\Umathchar "3"0"0021AC } +\protected\def\lor {\Umathchar "2"0"002228 } +\protected\def\lozenge {\Umathchar "0"0"0025CA } +\protected\def\lparent {\Udelimiter "4"0"000028 } +\protected\def\lrcorner {\Udelimiter "5"0"00231F } +\protected\def\Lsh {\Umathchar "3"0"0021B0 } +\protected\def\lt {\Umathchar "3"0"00003C } +\protected\def\ltimes {\Umathchar "2"0"0022C9 } +\protected\def\lvert {\Udelimiter "4"0"00007C } +\protected\def\lVert {\Udelimiter "4"0"002016 } +\protected\def\maltese {\Umathchar "0"0"002720 } +\protected\def\mapsdown {\Umathchar "3"0"0021A7 } +\protected\def\mapsfrom {\Umathchar "3"0"0021A4 } +\protected\def\Mapsfrom {\Umathchar "3"0"002906 } +\protected\def\mapsfromchar {\Umathchar "3"0"0FE324 } +\protected\def\mapsto {\Umathchar "3"0"0021A6 } +\protected\def\Mapsto {\Umathchar "3"0"002907 } +\protected\def\mapstochar {\Umathchar "3"0"0FE321 } +\protected\def\mapsup {\Umathchar "3"0"0021A5 } +\protected\def\mathring {\Umathaccent"0"0"0002DA } +\protected\def\measuredangle {\Umathchar "0"0"002221 } +\protected\def\measuredeq {\Umathchar "3"0"00225E } +\protected\def\mho {\Umathchar "0"0"002127 } +\protected\def\mid {\Umathchar "3"0"00007C } +\protected\def\minus {\Umathchar "2"0"002212 } +\protected\def\minuscolon {\Umathchar "2"0"002239 } +\protected\def\models {\Umathchar "3"0"0022A7 } +\protected\def\mp {\Umathchar "2"0"002213 } +\protected\def\Mu {\Umathchar "0"0"00039C } +\protected\def\mu {\Umathchar "0"0"0003BC } +\protected\def\multimap {\Umathchar "3"0"0022B8 } +\protected\def\napprox {\Umathchar "3"0"002249 } +\protected\def\napproxEq {\Umathchar "3"0"002246 } +\protected\def\nasymp {\Umathchar "3"0"00226D } +\protected\def\natural {\Umathchar "0"0"00266E } +\protected\def\naturalnumbers {\Umathchar "0"0"002115 } +\protected\def\ncong {\Umathchar "3"0"002246 } +\protected\def\ndivides {\Umathchar "2"0"002224 } +\protected\def\ne {\Umathchar "3"0"002260 } +\protected\def\nearrow {\Umathchar "3"0"002197 } +\protected\def\Nearrow {\Umathchar "3"0"0021D7 } +\protected\def\neg {\Umathchar "0"0"0000AC } +\protected\def\negativesign {\Umathchar "2"0"00207B } +\protected\def\neq {\Umathchar "3"0"002260 } +\protected\def\nequiv {\Umathchar "3"0"002262 } +\protected\def\neswarrow {\Umathchar "3"0"002922 } +\protected\def\nexists {\Umathchar "0"0"002204 } +\protected\def\ngeq {\Umathchar "3"0"002271 } +\protected\def\ngtr {\Umathchar "3"0"00226F } +\protected\def\ngtrless {\Umathchar "3"0"002279 } +\protected\def\ngtrsim {\Umathchar "3"0"002275 } +\protected\def\nHdownarrow {\Umathchar "3"0"0021DF } +\protected\def\nHuparrow {\Umathchar "3"0"0021DE } +\protected\def\ni {\Umathchar "3"0"00220B } +\protected\def\nin {\Umathchar "3"0"002209 } +\protected\def\nleftarrow {\Umathchar "3"0"00219A } +\protected\def\nLeftarrow {\Umathchar "3"0"0021CD } +\protected\def\nleftrightarrow {\Umathchar "3"0"0021AE } +\protected\def\nLeftrightarrow {\Umathchar "3"0"0021CE } +\protected\def\nleq {\Umathchar "3"0"002270 } +\protected\def\nless {\Umathchar "3"0"00226E } +\protected\def\nlessgtr {\Umathchar "3"0"002278 } +\protected\def\nlesssim {\Umathchar "3"0"002274 } +\protected\def\nmid {\Umathchar "3"0"002224 } +\protected\def\nni {\Umathchar "3"0"00220C } +\protected\def\not {\Umathchar "3"0"000338 } +\protected\def\notin {\Umathchar "3"0"002209 } +\protected\def\nowns {\Umathchar "3"0"00220C } +\protected\def\nparallel {\Umathchar "3"0"002226 } +\protected\def\nprec {\Umathchar "3"0"002280 } +\protected\def\npreccurlyeq {\Umathchar "3"0"0022E0 } +\protected\def\nrightarrow {\Umathchar "3"0"00219B } +\protected\def\nRightarrow {\Umathchar "3"0"0021CF } +\protected\def\nsim {\Umathchar "3"0"002241 } +\protected\def\nsimeq {\Umathchar "3"0"002244 } +\protected\def\nsqsubseteq {\Umathchar "3"0"0022E2 } +\protected\def\nsqsupseteq {\Umathchar "3"0"0022E3 } +\protected\def\nsubset {\Umathchar "3"0"002284 } +\protected\def\nsubseteq {\Umathchar "3"0"002288 } +\protected\def\nsucc {\Umathchar "3"0"002281 } +\protected\def\nsucccurlyeq {\Umathchar "3"0"0022E1 } +\protected\def\nsupset {\Umathchar "3"0"002285 } +\protected\def\nsupseteq {\Umathchar "3"0"002289 } +\protected\def\ntriangleleft {\Umathchar "3"0"0022EB } +\protected\def\ntrianglelefteq {\Umathchar "3"0"0022EC } +\protected\def\ntriangleright {\Umathchar "3"0"0022EA } +\protected\def\ntrianglerighteq {\Umathchar "3"0"0022ED } +\protected\def\Nu {\Umathchar "0"0"00039D } +\protected\def\nu {\Umathchar "0"0"0003BD } +\protected\def\nvdash {\Umathchar "3"0"0022AC } +\protected\def\nvDash {\Umathchar "3"0"0022AD } +\protected\def\nVdash {\Umathchar "3"0"0022AE } +\protected\def\nVDash {\Umathchar "3"0"0022AF } +\protected\def\nvleftarrow {\Umathchar "3"0"0021F7 } +\protected\def\nVleftarrow {\Umathchar "3"0"0021FA } +\protected\def\nvleftrightarrow {\Umathchar "3"0"0021F9 } +\protected\def\nVleftrightarrow {\Umathchar "3"0"0021FC } +\protected\def\nvrightarrow {\Umathchar "3"0"0021F8 } +\protected\def\nVrightarrow {\Umathchar "3"0"0021FB } +\protected\def\nwarrow {\Umathchar "3"0"002196 } +\protected\def\Nwarrow {\Umathchar "3"0"0021D6 } +\protected\def\nwsearrow {\Umathchar "3"0"002921 } +\protected\def\odot {\Umathchar "2"0"002299 } +\protected\def\ohm {\Umathchar "0"0"002126 } +\protected\def\oiiint {\Umathchar "1"0"002230 } +\protected\def\oiint {\Umathchar "1"0"00222F } +\protected\def\oint {\Umathchar "1"0"00222E } +\protected\def\ointclockwise {\Umathchar "1"0"002232 } +\protected\def\ointctrclockwise {\Umathchar "1"0"002233 } +\protected\def\Omega {\Umathchar "0"0"0003A9 } +\protected\def\omega {\Umathchar "0"0"0003C9 } +\protected\def\Omicron {\Umathchar "0"0"00039F } +\protected\def\omicron {\Umathchar "0"0"0003BF } +\protected\def\ominus {\Umathchar "2"0"002296 } +\protected\def\oplus {\Umathchar "2"0"002295 } +\protected\def\oslash {\Umathchar "2"0"002298 } +\protected\def\otimes {\Umathchar "2"0"002297 } +\protected\def\overbar {\Umathaccent"0"0"00203E } +\protected\def\overbrace {\Umathaccent"0"0"0023DE } +\protected\def\overbracket {\Umathaccent"0"0"0023B4 } +\protected\def\overparent {\Umathaccent"0"0"0023DC } +\protected\def\owns {\Umathchar "3"0"00220B } +\protected\def\P {\Umathchar "0"0"0000B6 } +\protected\def\parallel {\Umathchar "3"0"002225 } +\protected\def\partial {\Umathchar "0"0"002202 } +\protected\def\perp {\Umathchar "3"0"0022A5 } +\protected\def\Phi {\Umathchar "0"0"0003A6 } +\protected\def\phi {\Umathchar "0"0"0003D5 } +\protected\def\Pi {\Umathchar "0"0"0003A0 } +\protected\def\pi {\Umathchar "0"0"0003C0 } +\protected\def\pitchfork {\Umathchar "3"0"0022D4 } +\protected\def\Plankconst {\Umathchar "0"0"00210E } +\protected\def\pm {\Umathchar "2"0"0000B1 } +\protected\def\positivesign {\Umathchar "2"0"00207A } +\protected\def\prec {\Umathchar "3"0"00227A } +\protected\def\precapprox {\Umathchar "3"0"002AB7 } +\protected\def\preccurlyeq {\Umathchar "3"0"00227C } +\protected\def\preceq {\Umathchar "3"0"002AAF } +\protected\def\preceqq {\Umathchar "3"0"002AB3 } +\protected\def\precnapprox {\Umathchar "3"0"002AB9 } +\protected\def\precneq {\Umathchar "3"0"002AB1 } +\protected\def\precneqq {\Umathchar "3"0"002AB5 } +\protected\def\precnsim {\Umathchar "3"0"0022E8 } +\protected\def\precsim {\Umathchar "3"0"00227E } +\protected\def\prime {\Umathchar "0"0"002032 } +\protected\def\primes {\Umathchar "0"0"002119 } +\protected\def\prod {\Umathchar "1"0"00220F } +\protected\def\PropertyLine {\Umathchar "0"0"00214A } +\protected\def\propto {\Umathchar "3"0"00221D } +\protected\def\Psi {\Umathchar "0"0"0003A8 } +\protected\def\psi {\Umathchar "0"0"0003C8 } +\protected\def\questionedeq {\Umathchar "3"0"00225F } +\protected\def\rangle {\Udelimiter "5"0"0027E9 } +\protected\def\rationals {\Umathchar "0"0"00211A } +\protected\def\rbrace {\Udelimiter "5"0"00007D } +\protected\def\rbrack {\Udelimiter "5"0"00005D } +\protected\def\rceil {\Udelimiter "5"0"002309 } +\protected\def\rceiling {\Udelimiter "5"0"002309 } +\protected\def\Rdsh {\Umathchar "3"0"0021B3 } +\protected\def\Re {\Umathchar "0"0"00211C } +\protected\def\reals {\Umathchar "0"0"00211D } +\protected\def\Relbar {\Umathchar "3"0"00003D } +\protected\def\relbar {\Umathchar "3"0"002212 } +\protected\def\restriction {\Umathchar "3"0"0021BE } +\protected\def\rfloor {\Udelimiter "5"0"00230B } +\protected\def\rgroup {\Udelimiter "5"0"0027EF } +\protected\def\Rho {\Umathchar "0"0"0003A1 } +\protected\def\rho {\Umathchar "0"0"0003C1 } +\protected\def\rhook {\Umathchar "3"0"0FE323 } +\protected\def\rhooknearrow {\Umathchar "3"0"002924 } +\protected\def\rhookswarrow {\Umathchar "3"0"002926 } +\protected\def\rightangle {\Umathchar "0"0"00221F } +\protected\def\rightarrow {\Umathchar "3"0"002192 } +\protected\def\Rightarrow {\Umathchar "3"0"0021D2 } +\protected\def\rightarrowbar {\Umathchar "3"0"0021E5 } +\protected\def\rightarrowtail {\Umathchar "3"0"0021A3 } +\protected\def\rightarrowtriangle {\Umathchar "3"0"0021FE } +\protected\def\rightdasharrow {\Umathchar "3"0"0021E2 } +\protected\def\rightharpoondown {\Umathchar "3"0"0021C1 } +\protected\def\rightharpoonup {\Umathchar "3"0"0021C0 } +\protected\def\rightleftarrows {\Umathchar "3"0"0021C4 } +\protected\def\rightleftharpoons {\Umathchar "3"0"0021CC } +\protected\def\rightrightarrows {\Umathchar "3"0"0021C9 } +\protected\def\rightsquigarrow {\Umathchar "3"0"0021DD } +\protected\def\rightthreearrows {\Umathchar "3"0"0021F6 } +\protected\def\rightthreetimes {\Umathchar "2"0"0022CC } +\protected\def\rightwavearrow {\Umathchar "3"0"00219D } +\protected\def\rightwhitearrow {\Umathchar "0"0"0021E8 } +\protected\def\risingdotseq {\Umathchar "3"0"002253 } +\protected\def\rmoustache {\Udelimiter "5"0"0023B1 } +\protected\def\rneq {\Umathchar "3"0"002A88 } +\protected\def\rparent {\Udelimiter "5"0"000029 } +\protected\def\rrangle {\Udelimiter "5"0"0027EB } +\protected\def\rrbracket {\Udelimiter "5"0"0027E7 } +\protected\def\Rrightarrow {\Umathchar "3"0"0021DB } +\protected\def\Rsh {\Umathchar "3"0"0021B1 } +\protected\def\rtimes {\Umathchar "2"0"0022CA } +\protected\def\rvert {\Udelimiter "5"0"00007C } +\protected\def\rVert {\Udelimiter "5"0"002016 } +\protected\def\S {\Umathchar "0"0"0000A7 } +\protected\def\searrow {\Umathchar "3"0"002198 } +\protected\def\Searrow {\Umathchar "3"0"0021D8 } +\protected\def\setminus {\Umathchar "2"0"002216 } +\protected\def\sharp {\Umathchar "0"0"00266F } +\protected\def\Sigma {\Umathchar "0"0"0003A3 } +\protected\def\sigma {\Umathchar "0"0"0003C3 } +\protected\def\sim {\Umathchar "3"0"00223C } +\protected\def\simeq {\Umathchar "3"0"002243 } +\protected\def\slash {\Umathchar "0"0"002044 } +\protected\def\smile {\Umathchar "3"0"002323 } +\protected\def\solidus {\Udelimiter "5"0"002044 } +\protected\def\spadesuit {\Umathchar "0"0"002660 } +\protected\def\sphericalangle {\Umathchar "0"0"002222 } +\protected\def\sqcap {\Umathchar "2"0"002293 } +\protected\def\sqcup {\Umathchar "2"0"002294 } +\protected\def\sqsubset {\Umathchar "3"0"00228F } +\protected\def\sqsubseteq {\Umathchar "2"0"002291 } +\protected\def\sqsubsetneq {\Umathchar "3"0"0022E4 } +\protected\def\sqsupset {\Umathchar "3"0"002290 } +\protected\def\sqsupseteq {\Umathchar "2"0"002292 } +\protected\def\sqsupsetneq {\Umathchar "3"0"0022E5 } +\protected\def\square {\Umathchar "0"0"0025A1 } +\protected\def\squaredots {\Umathchar "3"0"002237 } +\protected\def\star {\Umathchar "2"0"0022C6 } +\protected\def\stareq {\Umathchar "3"0"00225B } +\protected\def\subset {\Umathchar "3"0"002282 } +\protected\def\Subset {\Umathchar "3"0"0022D0 } +\protected\def\subseteq {\Umathchar "3"0"002286 } +\protected\def\subseteqq {\Umathchar "3"0"002AC5 } +\protected\def\subsetneq {\Umathchar "3"0"00228A } +\protected\def\subsetneqq {\Umathchar "3"0"002ACB } +\protected\def\succ {\Umathchar "3"0"00227B } +\protected\def\succapprox {\Umathchar "3"0"002AB8 } +\protected\def\succcurlyeq {\Umathchar "3"0"00227D } +\protected\def\succeq {\Umathchar "3"0"002AB0 } +\protected\def\succeqq {\Umathchar "3"0"002AB4 } +\protected\def\succnapprox {\Umathchar "3"0"002ABA } +\protected\def\succneq {\Umathchar "3"0"002AB2 } +\protected\def\succneqq {\Umathchar "3"0"002AB6 } +\protected\def\succnsim {\Umathchar "3"0"0022E9 } +\protected\def\succsim {\Umathchar "3"0"00227F } +\protected\def\sum {\Umathchar "1"0"002211 } +\protected\def\supset {\Umathchar "3"0"002283 } +\protected\def\Supset {\Umathchar "3"0"0022D1 } +\protected\def\supseteq {\Umathchar "3"0"002287 } +\protected\def\supseteqq {\Umathchar "3"0"002AC6 } +\protected\def\supsetneq {\Umathchar "3"0"00228B } +\protected\def\supsetneqq {\Umathchar "3"0"002ACC } +\protected\def\surd {\Umathchar "2"0"00221A } +\protected\def\swarrow {\Umathchar "3"0"002199 } +\protected\def\Swarrow {\Umathchar "3"0"0021D9 } +\protected\def\Tau {\Umathchar "0"0"0003A4 } +\protected\def\tau {\Umathchar "0"0"0003C4 } +\protected\def\therefore {\Umathchar "3"0"002234 } +\protected\def\Theta {\Umathchar "0"0"000398 } +\protected\def\theta {\Umathchar "0"0"0003B8 } +\protected\def\tilde {\Umathaccent"0"0"0002DC } +\protected\def\times {\Umathchar "2"0"0000D7 } +\protected\def\to {\Umathchar "3"0"002192 } +\protected\def\top {\Umathchar "0"0"0022A4 } +\protected\def\triangle {\Umathchar "0"0"0025B3 } +\protected\def\triangledown {\Umathchar "2"0"0025BD } +\protected\def\triangleleft {\Umathchar "2"0"0025C1 } +\protected\def\triangleq {\Umathchar "3"0"00225C } +\protected\def\triangleright {\Umathchar "2"0"0025B7 } +\protected\def\tripleprime {\Umathchar "0"0"002034 } +\protected\def\turnediota {\Umathchar "0"0"002129 } +\protected\def\twoheaddownarrow {\Umathchar "3"0"0021A1 } +\protected\def\twoheadleftarrow {\Umathchar "3"0"00219E } +\protected\def\twoheadrightarrow {\Umathchar "3"0"0021A0 } +\protected\def\twoheadrightarrowtail {\Umathchar "3"0"002916 } +\protected\def\twoheaduparrow {\Umathchar "3"0"00219F } +\protected\def\udots {\Umathchar "0"0"0022F0 } +\protected\def\ulcorner {\Udelimiter "4"0"00231C } +\protected\def\underbar {\Umathaccent bottom "0"0"00203E } +\protected\def\underbrace {\Umathaccent bottom "0"0"0023DF } +\protected\def\underbracket {\Umathaccent bottom "0"0"0023B5 } +\protected\def\underparent {\Umathaccent bottom "0"0"0023DD } +\protected\def\upand {\Umathchar "2"0"00214B } +\protected\def\uparrow {\Umathchar "3"0"002191 } +\protected\def\Uparrow {\Umathchar "3"0"0021D1 } +\protected\def\updasharrow {\Umathchar "3"0"0021E1 } +\protected\def\updownarrow {\Umathchar "3"0"002195 } +\protected\def\Updownarrow {\Umathchar "3"0"0021D5 } +\protected\def\updownarrowbar {\Umathchar "0"0"0021A8 } +\protected\def\updownarrows {\Umathchar "3"0"0021C5 } +\protected\def\upharpoonleft {\Umathchar "3"0"0021BF } +\protected\def\upharpoonright {\Umathchar "3"0"0021BE } +\protected\def\uplus {\Umathchar "2"0"00228E } +\protected\def\Upsilon {\Umathchar "0"0"0003A5 } +\protected\def\upsilon {\Umathchar "0"0"0003C5 } +\protected\def\upuparrows {\Umathchar "3"0"0021C8 } +\protected\def\upwhitearrow {\Umathchar "0"0"0021E7 } +\protected\def\urcorner {\Udelimiter "5"0"00231D } +\protected\def\Uuparrow {\Umathchar "3"0"00290A } +\protected\def\varepsilon {\Umathchar "0"0"0003B5 } +\protected\def\varkappa {\Umathchar "0"0"0003F0 } +\protected\def\varkappa {\Umathchar "0"0"0003F0 } +\protected\def\varnothing {\Umathchar "0"0"002300 } +\protected\def\varphi {\Umathchar "0"0"0003C6 } +\protected\def\varpi {\Umathchar "0"0"0003D6 } +\protected\def\varrho {\Umathchar "0"0"01D71A } +\protected\def\varsigma {\Umathchar "0"0"0003C2 } +\protected\def\vartheta {\Umathchar "0"0"01D717 } +\protected\def\varTheta {\Umathchar "0"0"0003D1 } +\protected\def\vdash {\Umathchar "3"0"0022A2 } +\protected\def\vDash {\Umathchar "3"0"0022A8 } +\protected\def\Vdash {\Umathchar "3"0"0022A9 } +\protected\def\VDash {\Umathchar "3"0"0022AB } +\protected\def\vdots {\Umathchar "0"0"0022EE } +\protected\def\vec {\Umathaccent"0"0"0020D7 } +\protected\def\vee {\Umathchar "2"0"002228 } +\protected\def\veebar {\Umathchar "2"0"0022BB } +\protected\def\veeeq {\Umathchar "3"0"00225A } +\protected\def\vert {\Udelimiter "0"0"00007C } +\protected\def\Vert {\Udelimiter "0"0"002016 } +\protected\def\Vvdash {\Umathchar "3"0"0022AA } +\protected\def\wedge {\Umathchar "2"0"002227 } +\protected\def\wedgeeq {\Umathchar "3"0"002259 } +\protected\def\whitearrowupfrombar {\Umathchar "0"0"0021EB } +\protected\def\widehat {\Umathaccent"0"0"000302 } +\protected\def\widetilde {\Umathaccent"0"0"000303 } +\protected\def\wp {\Umathchar "0"0"002118 } +\protected\def\wr {\Umathchar "2"0"002240 } +\protected\def\Xi {\Umathchar "0"0"00039E } +\protected\def\xi {\Umathchar "0"0"0003BE } +\protected\def\yen {\Umathchar "0"0"0000A5 } +\protected\def\Zeta {\Umathchar "0"0"000396 } +\protected\def\zeta {\Umathchar "0"0"0003B6 } %D The following are suggested by Bruno. As I don't use plain and as the above are %D taken from text unicode greek I suppose his list is better: -\def\alpha {\Umathchar "0"0"01D6FC } -\def\beta {\Umathchar "0"0"01D6FD } -\def\chi {\Umathchar "0"0"01D712 } -\def\delta {\Umathchar "0"0"01D6FF } -\def\digamma {\Umathchar "0"0"0003DC } -\def\epsilon {\Umathchar "0"0"01D716 } -\def\eta {\Umathchar "0"0"01D702 } -\def\gamma {\Umathchar "0"0"01D6FE } -\def\iota {\Umathchar "0"0"01D704 } -\def\kappa {\Umathchar "0"0"01D705 } -\def\lambda {\Umathchar "0"0"01D706 } -\def\mu {\Umathchar "0"0"01D707 } -\def\nu {\Umathchar "0"0"01D708 } -\def\omega {\Umathchar "0"0"01D714 } -\def\omicron {\Umathchar "0"0"01D70A } -\def\phi {\Umathchar "0"0"01D719 } -\def\pi {\Umathchar "0"0"01D70B } -\def\psi {\Umathchar "0"0"01D713 } -\def\rho {\Umathchar "0"0"01D70C } -\def\sigma {\Umathchar "0"0"01D70E } -\def\tau {\Umathchar "0"0"01D70F } -\def\theta {\Umathchar "0"0"01D703 } -\def\upsilon {\Umathchar "0"0"01D710 } -\def\varepsilon {\Umathchar "0"0"01D700 } -\def\varkappa {\Umathchar "0"0"01D718 } -\def\varphi {\Umathchar "0"0"01D711 } -\def\varpi {\Umathchar "0"0"01D71B } -\def\varrho {\Umathchar "0"0"01D71A } -\def\varsigma {\Umathchar "0"0"01D70D } -\def\vartheta {\Umathchar "0"0"01D717 } -\def\xi {\Umathchar "0"0"01D709 } -\def\zeta {\Umathchar "0"0"01D701 } +\protected\def\alpha {\Umathchar "0"0"01D6FC } +\protected\def\beta {\Umathchar "0"0"01D6FD } +\protected\def\chi {\Umathchar "0"0"01D712 } +\protected\def\delta {\Umathchar "0"0"01D6FF } +\protected\def\digamma {\Umathchar "0"0"0003DC } +\protected\def\epsilon {\Umathchar "0"0"01D716 } +\protected\def\eta {\Umathchar "0"0"01D702 } +\protected\def\gamma {\Umathchar "0"0"01D6FE } +\protected\def\iota {\Umathchar "0"0"01D704 } +\protected\def\kappa {\Umathchar "0"0"01D705 } +\protected\def\lambda {\Umathchar "0"0"01D706 } +\protected\def\mu {\Umathchar "0"0"01D707 } +\protected\def\nu {\Umathchar "0"0"01D708 } +\protected\def\omega {\Umathchar "0"0"01D714 } +\protected\def\omicron {\Umathchar "0"0"01D70A } +\protected\def\phi {\Umathchar "0"0"01D719 } +\protected\def\pi {\Umathchar "0"0"01D70B } +\protected\def\psi {\Umathchar "0"0"01D713 } +\protected\def\rho {\Umathchar "0"0"01D70C } +\protected\def\sigma {\Umathchar "0"0"01D70E } +\protected\def\tau {\Umathchar "0"0"01D70F } +\protected\def\theta {\Umathchar "0"0"01D703 } +\protected\def\upsilon {\Umathchar "0"0"01D710 } +\protected\def\varepsilon {\Umathchar "0"0"01D700 } +\protected\def\varkappa {\Umathchar "0"0"01D718 } +\protected\def\varphi {\Umathchar "0"0"01D711 } +\protected\def\varpi {\Umathchar "0"0"01D71B } +\protected\def\varrho {\Umathchar "0"0"01D71A } +\protected\def\varsigma {\Umathchar "0"0"01D70D } +\protected\def\vartheta {\Umathchar "0"0"01D717 } +\protected\def\xi {\Umathchar "0"0"01D709 } +\protected\def\zeta {\Umathchar "0"0"01D701 } -\def\varTheta {\Umathchar "0"0"0003F4 } +\protected\def\varTheta {\Umathchar "0"0"0003F4 } % a few definitions: -\def\sqrt {\Uroot "0 "221A{}} -\def\root#1\of{\Uroot "0 "221A{#1}} +\protected\def\sqrt {\Uroot "0 "221A{}} +\protected\def\root#1\of{\Uroot "0 "221A{#1}} % \skewchar\teni='177 \skewchar\seveni='177 \skewchar\fivei='177 % \skewchar\tensy='60 \skewchar\sevensy='60 \skewchar\fivesy='60 @@ -2218,21 +2282,61 @@ % just use utf -\def\`#1{#1^^^^0300} -\def\'#1{#1^^^^0301} -\def\^#1{#1^^^^0302} -\def\~#1{#1^^^^0303} -\def\=#1{#1^^^^0304} -\def\u#1{#1^^^^0306} -\def\.#1{#1^^^^0307} -\def\"#1{#1^^^^0308} -\def\r#1{#1^^^^030a} % not in plain -\def\H#1{#1^^^^030b} -\def\v#1{#1^^^^030c} -\def\d#1{#1^^^^0323} -\def\c#1{#1^^^^0327} -\def\k#1{#1^^^^0328} % not in plain -\def\b#1{#1^^^^0331} +\protected\def\`#1{#1^^^^0300} +\protected\def\'#1{#1^^^^0301} +\protected\def\^#1{#1^^^^0302} +\protected\def\~#1{#1^^^^0303} +\protected\def\=#1{#1^^^^0304} +\protected\def\u#1{#1^^^^0306} +\protected\def\.#1{#1^^^^0307} +\protected\def\"#1{#1^^^^0308} +\protected\def\r#1{#1^^^^030a} % not in plain +\protected\def\H#1{#1^^^^030b} +\protected\def\v#1{#1^^^^030c} +\protected\def\d#1{#1^^^^0323} +\protected\def\c#1{#1^^^^0327} +\protected\def\k#1{#1^^^^0328} % not in plain +\protected\def\b#1{#1^^^^0331} + +\protected\def\*{\discretionary{\thinspace\the\textfont0\char"00D7}{}{}} + +\protected\def\t#1{% + %\quitvmode + \begingroup + \setbox0\hbox{#1}% + \setbox2\hbox\bgroup + \iffontchar\font"0361\relax + \char"0361\relax + \else + \iffontchar\font"2040\relax\else + \the\textfont0 + \fi + \char"2040 + \fi + \egroup + \dimen0\wd\ifdim\wd0>\wd2 0\else2\fi + \dimen2\dimexpr-\ht2+\ht0+.45ex\relax + \hbox to \dimen0\bgroup + \hbox to \dimen0{\hss\box0\hss}% + \hskip-\dimen0 + \hbox to \dimen0{\hss\raise\dimen2\box2\hss}% + \egroup + \endgroup} + +% Bruno's variant: +% +% \def\talign#1% +% {\leavevmode\vbox{% +% \baselineskip 0pt +% \lineskip -1ex +% \lineskiplimit 0pt +% \ialign{##\crcr#1\crcr}}} +% +% \def\t#1% +% {{\setbox0\hbox{% +% \iffontchar\font"0361\char"0361\else +% \iffontchar\font"2040\else\the\textfont0\fi\char"2040\fi}% +% \talign{\hidewidth\unhbox0\hidewidth\crcr#1}}} % for Bruno, when he tests this file with xetex: @@ -2240,9 +2344,9 @@ \catcode`@=11 - \def\sqrt{\Uradical "0 "221A } + \protected\def\sqrt{\Uradical "0 "221A } - \def\root#1\of + \protected\def\root#1\of {\setbox\rootbox\hbox\bgroup $\m@th\scriptscriptstyle{#1}$% \egroup diff --git a/tex/generic/context/luatex/luatex-mplib.lua b/tex/generic/context/luatex/luatex-mplib.lua index 976bb59f9..c610fca57 100644 --- a/tex/generic/context/luatex/luatex-mplib.lua +++ b/tex/generic/context/luatex/luatex-mplib.lua @@ -230,7 +230,14 @@ else return "" end - function metapost.load(name) + local modes = { + scaled = true, + decimal = true, + binary = true, + double = true, + } + + function metapost.load(name,mode) local mpd = { buffer = { }, verbatim = { } @@ -241,6 +248,7 @@ else make_text = function(...) return metapost.maketext (mpd,...) end, run_script = function(...) return metapost.runscript(mpd,...) end, extensions = 1, + math_mode = mode and modes[mode] and mode or "scaled", } local result if not mpx then @@ -283,9 +291,9 @@ else return true end - function metapost.process(mpx, data) + function metapost.process(format,data,mode) local converted, result = false, {} - mpx = metapost.load(mpx) + local mpx = metapost.load(format,mode) if mpx and data then local result = mpx:execute(data) if not result then @@ -300,6 +308,8 @@ else else metapost.report("mp error: unknown error, maybe no beginfig/endfig") end +-- mpx:finish() +-- mpx = nil else metapost.report("mp error: mem file not found") end @@ -452,15 +462,19 @@ else pdf_startfigure(fignum,llx,lly,urx,ury) pdf_literalcode("q") if objects then + local savedpath = nil + local savedhtap = nil for o=1,#objects do local object = objects[o] local objecttype = object.type if objecttype == "start_bounds" or objecttype == "stop_bounds" then -- skip elseif objecttype == "start_clip" then + local evenodd = not object.istext and object.postscript == "evenodd" pdf_literalcode("q") flushnormalpath(object.path,t,false) pdf_literalcode("W n") + pdf_literalcode(evenodd and "W* n" or "W n") elseif objecttype == "stop_clip" then pdf_literalcode("Q") miterlimit, linecap, linejoin, dashed = -1, -1, -1, false @@ -472,96 +486,147 @@ else pdf_textfigure(object.font,object.dsize,object.text,object.width,object.height,object.depth) pdf_literalcode("Q") else - local cs = object.color - local cr = false - if cs and #cs > 0 then - cs, cr = metapost.colorconverter(cs) - pdf_literalcode(cs) - end - local ml = object.miterlimit - if ml and ml ~= miterlimit then - miterlimit = ml - pdf_literalcode("%f M",ml) - end - local lj = object.linejoin - if lj and lj ~= linejoin then - linejoin = lj - pdf_literalcode("%i j",lj) - end - local lc = object.linecap - if lc and lc ~= linecap then - linecap = lc - pdf_literalcode("%i J",lc) - end - local dl = object.dash - if dl then - local d = format("[%s] %i d",concat(dl.dashes or {}," "),dl.offset) - if d ~= dashed then - dashed = d - pdf_literalcode(dashed) + local evenodd, collect, both = false, false, false + local postscript = object.postscript + if not object.istext then + if postscript == "evenodd" then + evenodd = true + elseif postscript == "collect" then + collect = true + elseif postscript == "both" then + both = true + elseif postscript == "eoboth" then + evenodd = true + both = true end - elseif dashed then - pdf_literalcode("[] 0 d") - dashed = false - end - local path = object.path - local transformed, penwidth = false, 1 - local open = path and path[1].left_type and path[#path].right_type - local pen = object.pen - if pen then - if pen.type == 'elliptical' then - transformed, penwidth = pen_characteristics(object) -- boolean, value - pdf_literalcode("%f w",penwidth) - if objecttype == 'fill' then - objecttype = 'both' - end - else -- calculated by mplib itself - objecttype = 'fill' - end - end - if transformed then - pdf_literalcode("q") end - if path then - if transformed then - flushconcatpath(path,open) + if collect then + if not savedpath then + savedpath = { object.path or false } + savedhtap = { object.htap or false } else - flushnormalpath(path,open) + savedpath[#savedpath+1] = object.path or false + savedhtap[#savedhtap+1] = object.htap or false end - if objecttype == "fill" then - pdf_literalcode("h f") - elseif objecttype == "outline" then - pdf_literalcode((open and "S") or "h S") - elseif objecttype == "both" then - pdf_literalcode("h B") + else + local cs = object.color + local cr = false + if cs and #cs > 0 then + cs, cr = metapost.colorconverter(cs) + pdf_literalcode(cs) end - end - if transformed then - pdf_literalcode("Q") - end - local path = object.htap - if path then - if transformed then - pdf_literalcode("q") + local ml = object.miterlimit + if ml and ml ~= miterlimit then + miterlimit = ml + pdf_literalcode("%f M",ml) + end + local lj = object.linejoin + if lj and lj ~= linejoin then + linejoin = lj + pdf_literalcode("%i j",lj) + end + local lc = object.linecap + if lc and lc ~= linecap then + linecap = lc + pdf_literalcode("%i J",lc) + end + local dl = object.dash + if dl then + local d = format("[%s] %i d",concat(dl.dashes or {}," "),dl.offset) + if d ~= dashed then + dashed = d + pdf_literalcode(dashed) + end + elseif dashed then + pdf_literalcode("[] 0 d") + dashed = false + end + local path = object.path + local transformed, penwidth = false, 1 + local open = path and path[1].left_type and path[#path].right_type + local pen = object.pen + if pen then + if pen.type == 'elliptical' then + transformed, penwidth = pen_characteristics(object) -- boolean, value + pdf_literalcode("%f w",penwidth) + if objecttype == 'fill' then + objecttype = 'both' + end + else -- calculated by mplib itself + objecttype = 'fill' + end end if transformed then - flushconcatpath(path,open) - else - flushnormalpath(path,open) + pdf_literalcode("q") end - if objecttype == "fill" then - pdf_literalcode("h f") - elseif objecttype == "outline" then - pdf_literalcode((open and "S") or "h S") - elseif objecttype == "both" then - pdf_literalcode("h B") + if path then + if savedpath then + for i=1,#savedpath do + local path = savedpath[i] + if transformed then + flushconcatpath(path,open) + else + flushnormalpath(path,open) + end + end + savedpath = nil + end + if transformed then + flushconcatpath(path,open) + else + flushnormalpath(path,open) + end + if objecttype == "fill" then + pdf_literalcode("h f") + elseif objecttype == "outline" then + if both then + pdf_literalcode(evenodd and "h B*" or "h B") + else + pdf_literalcode(open and "S" or "h S") + end + elseif objecttype == "both" then + pdf_literalcode(evenodd and "h B*" or "h B") + end end if transformed then pdf_literalcode("Q") end - end - if cr then - pdf_literalcode(cr) + local path = object.htap + if path then + if transformed then + pdf_literalcode("q") + end + if savedhtap then + for i=1,#savedhtap do + local path = savedhtap[i] + if transformed then + flushconcatpath(path,open) + else + flushnormalpath(path,open) + end + end + savedhtap = nil + evenodd = true + end + if transformed then + flushconcatpath(path,open) + else + flushnormalpath(path,open) + end + if objecttype == "fill" then + pdf_literalcode("h f") + elseif objecttype == "outline" then + pdf_literalcode(evenodd and "h f*" or "h f") + elseif objecttype == "both" then + pdf_literalcode(evenodd and "h B*" or "h B") + end + if transformed then + pdf_literalcode("Q") + end + end + if cr then + pdf_literalcode(cr) + end end end end diff --git a/tex/generic/context/luatex/luatex-mplib.tex b/tex/generic/context/luatex/luatex-mplib.tex index f9de4b223..a99de37e4 100644 --- a/tex/generic/context/luatex/luatex-mplib.tex +++ b/tex/generic/context/luatex/luatex-mplib.tex @@ -29,6 +29,7 @@ %D \stoptyping \def\setmplibformat#1{\def\mplibformat{#1}} +\def\setmplibmode #1{\def\mplibmode {#1}} \def\setupmplibcatcodes {\catcode`\{=12 % could be optional .. not really needed @@ -39,7 +40,8 @@ \catcode`\_=12 \catcode`\%=12 \catcode`\&=12 - \catcode`\$=12 } + \catcode`\$=12 + \obeylines} \def\mplibcode {\bgroup @@ -48,11 +50,12 @@ \long\def\domplibcode#1\endmplibcode {\egroup - \directlua{metapost.process('\mplibformat',[[#1]])}} + \directlua{metapost.process('\mplibformat',[[#1]],'\mplibmode')}} %D We default to \type {plain} \METAPOST: \def\mplibformat{plain} +\def\mplibmode {scaled} %D We use a dedicated scratchbox: diff --git a/tex/generic/context/luatex/luatex-pdf.tex b/tex/generic/context/luatex/luatex-pdf.tex index 57004c6f8..b698285e3 100644 --- a/tex/generic/context/luatex/luatex-pdf.tex +++ b/tex/generic/context/luatex/luatex-pdf.tex @@ -135,20 +135,19 @@ \xdef\pdfinclusionerrorlevel {\pdfvariable inclusionerrorlevel} \xdef\pdfgentounicode {\pdfvariable gentounicode} \xdef\pdfpagebox {\pdfvariable pagebox} + \xdef\pdfmajorversion {\pdfvariable majorversion} \xdef\pdfminorversion {\pdfvariable minorversion} \xdef\pdfuniqueresname {\pdfvariable uniqueresname} - \ifnum\luatexversion>88 - \edef\pdfpkfixeddpi {\pdfvariable pkfixeddpi} - \edef\pdfignoreunknownimages {\pdfvariable ignoreunknownimages} - \fi + \xdef\pdfpkfixeddpi {\pdfvariable pkfixeddpi} + \xdef\pdfignoreunknownimages {\pdfvariable ignoreunknownimages} \xdef\pdfhorigin {\pdfvariable horigin} \xdef\pdfvorigin {\pdfvariable vorigin} \xdef\pdflinkmargin {\pdfvariable linkmargin} \xdef\pdfdestmargin {\pdfvariable destmargin} \xdef\pdfthreadmargin {\pdfvariable threadmargin} - % \xdef\pdfxformmargin {\pdfvariable xformmargin} + \xdef\pdfxformmargin {\pdfvariable xformmargin} \xdef\pdfpagesattr {\pdfvariable pagesattr} \xdef\pdfpageattr {\pdfvariable pageattr} @@ -178,6 +177,7 @@ \global\pdfinclusionerrorlevel 0 \global\pdfgentounicode 0 \global\pdfpagebox 0 + % \global\pdfmajorversion 1 \global\pdfminorversion 4 \global\pdfuniqueresname 0 @@ -187,11 +187,6 @@ \global\pdfdestmargin 0pt \global\pdfthreadmargin 0pt - % maybe - - % \global\chardef\pdftexversion 140 - % \global\def \pdftexrevision {16} - \fi \endgroup diff --git a/tex/generic/context/luatex/luatex-swiglib.lua b/tex/generic/context/luatex/luatex-swiglib.lua index 3108dd43f..cbb6798c3 100644 --- a/tex/generic/context/luatex/luatex-swiglib.lua +++ b/tex/generic/context/luatex/luatex-swiglib.lua @@ -16,16 +16,18 @@ function requireswiglib(required,version) if library then return library else - local name = string.gsub(required,"%.","/") .. libsuffix + local full = string.gsub(required,"%.","/" + local path = file.pathpart(full) + local name = file.nameonly(full) .. libsuffix local list = kpse.show_path("clua") for root in string.gmatch(list,pathsplit) do local full = false if type(version) == "string" and version ~= "" then - full = root .. "/" .. version .. "/" .. name + full = root .. "/" .. path .. "/" .. version .. "/" .. name full = lfs.isfile(full) and full end if not full then - full = root .. "/" .. name + full = root .. "/" .. path .. "/" .. name full = lfs.isfile(full) and full end if full then diff --git a/web2c/contextcnf.lua b/web2c/contextcnf.lua index cd948c23e..842401af7 100644 --- a/web2c/contextcnf.lua +++ b/web2c/contextcnf.lua @@ -124,6 +124,8 @@ return { FONTCONFIG_FILE = "fonts.conf", FONTCONFIG_PATH = "$TEXMFSYSTEM/fonts/conf", + -- EXTRAFONTS = ".;e:/tmp//", + -- we now have a different subsystem for this, }, |